ZGlmZiAtLWdpdCBhL0NIQU5HRUxPRyBiL0NIQU5HRUxPRwppbmRleCAyNGQ4MDVlLi41NzI5OWI2IDEwMDY0NAotLS0gYS9DSEFOR0VMT0cKKysrIGIvQ0hBTkdFTE9HCkBAIC0xLDkgKzEsMzU3NyBAQAorY29tbWl0IGEwODQ1ODMwM2U3ZjlkYjY3ZjI5Njk4MDAzNmQzMjkyYzM1Y2I0NWMKK0F1dGhvcjogSGFhdmFyZCBTa2lubmVtb2VuIDxoc2tpbm5lbW9lbkBhdG1lbC5jb20+CitEYXRlOglGcmkgSnVuIDI5IDE4OjM4OjUxIDIwMDcgKzAyMDAKKworICAgIGF0bWVsX21jaTogRml4IGRhdGEgdGltZW91dCB2YWx1ZQorCisgICAgQ2FsY3VsYXRlIHRoZSBkYXRhIHRpbWVvdXQgYmFzZWQgb24gdmFsdWVzIGZyb20gdGhlIENTRCBpbnN0ZWFkIG9mCisgICAganVzdCB1c2luZyBhIGhhcmRjb2RlZCBEVE9SIHZhbHVlLiBUaGlzIGlzIGEgYmFja3BvcnQgb2YgYSBzaW1pbGFyIGZpeAorICAgIGluIEJTUCAyLjAsIHdpdGggb25lIGFkZGl0aW9uYWwgZml4OiB0aGUgRFRPQ1lDIHZhbHVlIGlzIHJvdW5kZWQgdXAKKyAgICBpbnN0ZWFkIG9mIGRvd24uCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBIYWF2YXJkIFNraW5uZW1vZW4gPGhza2lubmVtb2VuQGF0bWVsLmNvbT4KKworY29tbWl0IDBiYThlZWQyOGI1NzU2MjZiMTdlMGE3ODgyZjkyM2I4M2UwZDc1ODQKK0F1dGhvcjogSGFhdmFyZCBTa2lubmVtb2VuIDxoc2tpbm5lbW9lbkBhdG1lbC5jb20+CitEYXRlOglNb24gQXVnIDEzIDE3OjIyOjMxIDIwMDcgKzAyMDAKKworICAgIEFWUjMyOiBJbmNsdWRlIDxkaXY2NC5oPiBpbnN0ZWFkIG9mIDxhc20vZGl2NjQuaD4KKworICAgIGluY2x1ZGUvYXNtLWF2cjMyL2RpdjY0Lmggd2FzIHJlY2VudGx5IG1vdmVkIHRvIGluY2x1ZGUvZGl2NjQuaCwgYnV0CisgICAgY3B1L2F0MzJhcC9pbnRlcnJ1cHRzLmMgd2Fzbid0IHByb3Blcmx5IHVwZGF0ZWQgKGFuIGVhcmxpZXIgdmVyc2lvbiBvZgorICAgIHRoZSBwYXRjaCB3YXMgbWVyZ2VkIHBlcmhhcHM/KQorCisgICAgVGhpcyBwYXRjaCB1cGRhdGVzIGNwdS9hdDMyYXAvaW50ZXJydXB0cy5jIHNvIHRoYXQgdGhlIGF2cjMyIHBvcnQKKyAgICBjb21waWxlcyBhZ2Fpbi4KKworICAgIFNpZ25lZC1vZmYtYnk6IEhhYXZhcmQgU2tpbm5lbW9lbiA8aHNraW5uZW1vZW5AYXRtZWwuY29tPgorCitjb21taXQgZjBkMTI0NmVkN2NiNWE4ODUyMjI0NGM1OTZkN2FlN2U2ZjE2MTI4MworQXV0aG9yOiBIYWF2YXJkIFNraW5uZW1vZW4gPGhza2lubmVtb2VuQGF0bWVsLmNvbT4KK0RhdGU6CVdlZCBKdW4gMjcgMTM6MzQ6MjYgMjAwNyArMDIwMAorCisgICAgYXRtZWxfbWNpOiBVc2UgNTEyIGJ5dGUgYmxvY2tzaXplIGlmIHBvc3NpYmxlCisKKyAgICBJbnN0ZWFkIG9mIGFsd2F5cyB1c2luZyB0aGUgbGFyZ2VzdCBibG9ja3NpemUgdGhlIGNhcmQgc3VwcG9ydHMsIGNoZWNrCisgICAgaWYgaXQgY2FuIHN1cHBvcnQgc21hbGxlciBibG9jayBzaXplcyBhbmQgdXNlIDUxMiBieXRlcyBpZiBwb3NzaWJsZS4KKyAgICBNb3N0IGNhcmRzIGRvIHN1cHBvcnQgdGhpcywgYW5kIG90aGVyIHBhcnRzIG9mIHUtYm9vdCBzZWVtIHRvIGhhdmUKKyAgICB0cm91YmxlIHdpdGggYmxvY2sgc2l6ZXMgZGlmZmVyZW50IGZyb20gNTEyIGJ5dGVzLgorCisgICAgQWxzbyBlbmFibGUgdW5kZXJydW4vb3ZlcnJ1biBwcm90ZWN0aW9uLgorCisgICAgU2lnbmVkLW9mZi1ieTogSGFhdmFyZCBTa2lubmVtb2VuIDxoc2tpbm5lbW9lbkBhdG1lbC5jb20+CisgICAgQWNrZWQtYnk6IEhhbnMtQ2hyaXN0aWFuIEVndHZlZHQgPGhjZWd0dmVkdEBhdG1lbC5jb20+CisKK2NvbW1pdCA5OTg2YmMzZTQwZTg5OWJlYTM3MmE5OWEyYmNhNDA3MWJkZjJlMjRiCitBdXRob3I6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CitEYXRlOglTdW4gQXVnIDEyIDIxOjM0OjUwIDIwMDcgKzAyMDAKKworICAgIFVwZGF0ZSBDSEFOR0VMT0cKKworY29tbWl0IDc3ZDE5YThiZjNiMGIxZTQwMWNiOWYyM2M4MWUyZWY0MTk3MDVjMWEKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CVN1biBBdWcgMTIgMjE6MzQ6MzQgMjAwNyArMDIwMAorCisgICAgTWlub3IgYWxpZ25tZW50IG9mIG91dHB1dCwgMm5kIHRyeS4KKyAgICBBbHNvIHVwZGF0ZSBDSEFOR0VMT0cKKworICAgIFNpZ25lZC1vZmYtYnk6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CisKK2NvbW1pdCA2YjMwOWYyMmE3MjRmYWQ4NDE4ZTgxMTc1MWEwNzQxYjg5MzQxOWNmCitBdXRob3I6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CitEYXRlOglTdW4gQXVnIDEyIDIwOjM1OjQ5IDIwMDcgKzAyMDAKKworICAgIE1pbm9yIGFsaWdubWVudCBvZiBvdXRwdXQKKworICAgIFNpZ25lZC1vZmYtYnk6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CisKK2NvbW1pdCA2ZjZkN2I5Yzg1NTllMjQxZThkMjMyNjIxNTQyYjhiNTk2OTliMDdiCitBdXRob3I6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CitEYXRlOglTdW4gQXVnIDEyIDE4OjI4OjE4IDIwMDcgKzAyMDAKKworICAgIENsZWFudXAgb3V0cHV0IG9uIEFEUzUxMjEgYm9hcmQKKworICAgIFNpZ25lZC1vZmYtYnk6IFdvbGZnYW5nIERlbmsKKworY29tbWl0IGE0ZDI2MzZmMmE4NTkyNDVlZDNhNDAxZjI2MTg5ZGEyZGZkYTRjZWIKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CVN1biBBdWcgMTIgMTU6MTE6MzggMjAwNyArMDIwMAorCisgICAgQWRhcHQgYm9hcmQgY29uZmlndXJhdGlvbiBhbmQgZml4IGtlcm5lbCBjcmFzaCBvbiBNQ0MyMDAgYm9hcmQuCisKKyAgICBUaGUgdXBkYXRlIHByb2NlZHVyZSB3YXMgbW9kaWZpZWQgdG8gdHVybiBvZmYgdGhlIFVTQiBzdWJzeXN0ZW0KKyAgICBiZWZvcmUgZXhpdCBmb3IgTUNDMjAwIGFuZCBUUkFCLiBUaGlzIGlzIG5lY2Vzc2FyeSBhcyBvdGhlcndpc2UgdGhlCisgICAgVVNCIGNvbnRyb2xsZXIgY29udGludWVzIHRvIHdyaXRlIHBlcmlvZGljYWxseSB0byBzeXN0ZW0gbWVtb3J5IQorCisgICAgTUNDMjAwLXNwZWNpZmljIG5vdGVzOgorICAgIC0gdGhlIHBhdGNoIGRpc2FibGVzIHRoZSBtYWdpYyBrZXkgY2hlY2sgZm9yIE1DQzIwMAorICAgIC0gdGhlIHBhdGNoIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGNoYW5nZXMgbWFkZQorICAgICAgZm9yIHRoZSBuZXcgcmV2aXNpb24gb2YgdGhlIGJvYXJkLgorCisgICAgU2lnbmVkLW9mZi1ieTogU2VyZ2VpIFBvc2VsZW5vdiA8c3Bvc2VsZW5vdkBlbWNyYWZ0LmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorCitjb21taXQgZTI3ZjNhNmVmYjlkYjVhNTMzMjIzYjA1YzYyOWZmNGFjOGQ5MjFiZgorQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorRGF0ZToJU3VuIEF1ZyAxMiAxNDo0Nzo1NCAyMDA3ICswMjAwCisKKyAgICBBZGp1c3QgZGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIEFEUzUxMjEgYm9hcmQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorCitjb21taXQgYWZhYWM4NmZlMjk0OGFjODRjZDlhMTJiYmVkODgzYjNjNjgzZTdkOQorQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorRGF0ZToJU3VuIEF1ZyAxMiAxNDoyNzozOSAyMDA3ICswMjAwCisKKyAgICBDbGVhbiB1cCBzb21lIHJlbWFpbmluZyBDRkdfQ01EXyAtPiBDT05GSUdfQ01EXyBpc3N1ZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorCitjb21taXQgNWZlNmJlNjIwOGRkYTg1MmMzNTY0ZTM4NGJkNzhkNzU3ODRkZWEzZQorQXV0aG9yOiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorRGF0ZToJVHVlIEF1ZyA3IDIxOjE0OjIyIDIwMDcgLTA0MDAKKworICAgIEltcHJvdmUgZXJyb3IgcHJpbnQgbWVzc2FnZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorCitjb21taXQgOTlkZmZjYTNiNzU5MGExNmEwMGJjNDc1Yzg2MGI2N2IyYTNmMTQ2MgorQXV0aG9yOiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEp1bCAxNyAxMzo1NzowNCAyMDA3IC0wNTAwCisKKyAgICBmZHQ6IGFsbG93IGZvciBidWlsZHMgdGhhdCBkb24ndCB3YW50IGVudiBhbmQgYmRfdCBub2RlcworCisgICAgcHJvdGVjdCBmZHRfZW52IGFuZCBmZHRfYmRfdCBpbnZvY2F0aW9ucywgZml4IGNvZGluZ3N0eWxlIHdoaWxlIGluIHRoZQorICAgIGFyZWEuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgOTExNDhiZjdhZWJhMTQyZDZmMzQ4ODA1ZGI3NjI1ZGI3ZGE2NGQ2ZgorQXV0aG9yOiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEp1bCAxNyAxMzo1Njo1MyAyMDA3IC0wNTAwCisKKyAgICBmZHQ6IGRvIGJvYXJkIHNldHVwIGJhc2VkIG9uIGZkdCBhZGRyZXNzIHNwZWNpZmllZCBvbiBib290bSBsaW5lCisKKyAgICBUaGUgbGFzdCBmZHQgcGF0Y2ggdG8gYm9vdG0gZGlkIGJvYXJkIHNldHVwIGJhc2VkIG9uIHRoZSBhZGRyZXNzCisgICAgc3BlY2lmaWVkIGJ5IGEgcHJpb3IgZmR0IGFkZHJlc3MgY29tbWFuZCBpbnZvY2F0aW9uLiAgVGhlIGJvb3RtCisgICAgY29kZSwgYXMgaXRzIGNhbGwgdG8gZmR0X2Nob3NlbiBkb2VzLCBzaG91bGQgdXNlIHRoZSBmZHQgc3BlY2lmaWVkCisgICAgYnkgdGhlIHVzZXIgb24gdGhlIGJvb3RtIGNvbW1hbmQuICBOb3RlIHRoaXMgcmVzdG9yZXMgZnVsbAorICAgIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSA4MzYwJ3MgZXhpc3RpbmcgZGVmYXVsdCBib290IGVudmlyb25tZW50CisgICAgdmFsdWVzLCBlLmcuICdydW4gbmZzYm9vdCcgKGkuZS4gbm8gaGF2aW5nIHRvICdmZHQgYWRkciAkZmR0YWRkcicKKyAgICBiZWZvcmUgYm9vdGluZyBhIGtlcm5lbCkuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgZTEyNWEyZmZjMjA5ZGQzNDc5NGUzMjZjNzE3NTY1ODI1M2JlYWRmMworQXV0aG9yOiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorRGF0ZToJVHVlIEp1bCAxMCAyMDo0MDozOSAyMDA3IC0wNDAwCisKKyAgICBDYWxsIGZ0X2JvYXJkX3NldHVwKCkgZnJvbSB0aGUgYm9vdG0gY29tbWFuZC4KKworICAgIEluIHRoZSBwYXRjaCB0aXRsZWQgIkNyZWF0ZSBuZXcgZmR0IGJvYXJkc2V0dXAgY29tbWFuZC4uLiIgSSByZW1vdmVkIHRoZQorICAgIGNhbGwgdG8gZnRfYm9hcmRfc2V0dXAoKSBmcm9tIHRoZSByb3V0aW5lIGZkdF9jaG9zZW4oKSwgYnV0IEkgZm9yZ290CisgICAgdG8gYWRkIGEgZGlyZWN0IGNhbGwgYmFjayBpbnRvIGNtZF9ib290bS5jCisKKyAgICBUaGlzIGZpeGVzIHRoZSBvdmVyc2lnaHQgYnkgYWRkaW5nIHRoZSBkaXJlY3QgY2FsbCB0byB0aGUgYm9vdG0gY29tbWFuZC4KKworICAgIFNpZ25lZC1vZmYtYnk6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CisKK2NvbW1pdCBmZDYxZTU1ZGQ4Y2I1MmNlM2ZmOTFiMzkxN2FmMjZlMjRiNmIwODQ1CitBdXRob3I6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CitEYXRlOglNb24gSnVuIDI1IDIzOjI1OjI4IDIwMDcgLTA0MDAKKworICAgIENyZWF0ZSBuZXcgZmR0IGJvYXJkc2V0dXAgY29tbWFuZCwgZml4IGJ1ZyBwYXJzaW5nIFtdIGZvcm0gb2Ygc2V0IHZhbHVlcy4KKworICAgIFByZXZpb3VzbHkgZnRfYm9hcmRfc2V0dXAoKSB3YXMgY2FsbGVkIGJ5IGZkdF9jaG9zZW4oKSB3aGljaCB3YXMgbm90CisgICAgcmVhbGx5IGNvcnJlY3RseSBzdHJ1Y3R1cmVkLiAgVGhpcyBzcGxpdHMgZnRfYm9hcmRfc2V0dXAoKSBvdXQgYnkgY3JlYXRpbmcKKyAgICBhIG5ldyBmZHQgYm9hcmRzZXR1cCBjb21tYW5kLgorCisgICAgRml4IGEgYnVnIHdoZW4gcGFyc2luZyBmZHQgc2V0IGNvbW1hbmQgdmFsdWVzIHdoaWNoIGhhdmUgdGhlIHNxdWFyZQorICAgIGJyYWNrZXQgZm9ybSBbMDAgMTEgMjIgMzNdIC0gdGhlIGxlbmd0aCB3YXMgdXBkYXRlZCBpbmNvcnJlY3RseSBpbiB3aGVuCisgICAgcGFyc2luZyB0aGF0IGZvcm0uCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorCitjb21taXQgNmYzNWRlZDllODU0OTM1OTVlMGViNjZhODJiNTAyYTk1MzI2ZDA0OQorQXV0aG9yOiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorRGF0ZToJTW9uIEp1biAyNSAyMDo1NTo1OCAyMDA3IC0wNDAwCisKKyAgICBUaWdodGVuIHVwIHRoZSBlcnJvciBtZXNzYWdlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CisKK2NvbW1pdCBjNDU4NzRiMDVhYWU4OTdhNmMyOWQxYTk3ZDRiYjcwOGZjYTI3NTZjCitBdXRob3I6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CitEYXRlOglNb24gSnVuIDI1IDE5OjUyOjIzIDIwMDcgLTA0MDAKKworICAgIEFzdGhldGljIGltcHJvdmVtZW50czogZXJyb3IgbWVzc2FnZXMgYW5kIGxpbmUgbGVuZ3Rocy4KKworICAgIFRpZ2h0ZW4gdXAgdGhlIGVycm9yIG1lc3NhZ2VzLCBzcGxpdCBvdmVybGVuZ3RoIGxpbmVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KKworY29tbWl0IDM1ZWMzOThmMTZlMTdkZjYwMGVkYzFiMzhjMWU5ZTYyYzE1YzlhYTEKK0F1dGhvcjogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KK0RhdGU6CUZyaSBNYXkgMjUgMjI6MDg6NTcgMjAwNyAtMDQwMAorCisgICAgRml4IGZkdF9jaG9zZW4oKSB0byBjYWxsIGZ0X2JvYXJkX3NldHVwKCksIGNsZWFuIHVwIGxvbmcgbGluZXMuCisKKyAgICBUaGUgZmR0X2Nob3NlbigpIGZ1bmN0aW9uIHdhcyBhZGRpbmcvc2V0aW5nIHNvbWUgcHJvcGVydGllcyBhZC1ob2MKKyAgICAgIGltcHJvcGVybHkgYW5kIGR1cGxpY2F0ZWQgKHBvb3JseSkgd2hhdCB3YXMgZG9uZSBpbiBmdF9ib2FyZF9zZXR1cCgpCisKKyAgICBDbGVhbiB1cCBsb25nIGxpbmVzIChzZXR0aW5nIHByb3BlcnRpZXMsIHByaW50aW5nIGVycm9ycykuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorCitjb21taXQgMDZlMTlhMDc3MDFjOTY4ZjE1ZDcyYzA4M2I1ODcyYTFhMTFjN2IwMQorQXV0aG9yOiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorRGF0ZToJTW9uIE1heSAyMSAyMzoyNzoxNiAyMDA3IC0wNDAwCisKKyAgICBGb3IgZmR0X2ZpbmRfbm9kZV9ieV9wYXRoKCksIGhhbmRsZSB0aGUgcm9vdCBwYXRoIHByb3Blcmx5LgorCisgICAgQWxzbyByZW1vdmVzIHRoZSBzcGVjaWFsIGNhc2Ugcm9vdCBwYXRoIGRldGVjdGlvbiBpbiBjbWRfZmR0LmMgc2luY2UgaXQKKyAgICBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LgorCisgICAgU2lnbmVkLW9mZi1ieTogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KKworY29tbWl0IDk2NzVlZTcyMDhhYjk2NWQxM2VhOGQ4MjYyZDc3YWM0MTYwZWY1NDkKK0F1dGhvcjogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KK0RhdGU6CVRodSBNYXkgMTcgMjM6NTQ6MzYgMjAwNyAtMDQwMAorCisgICAgQWRkIGZkdF9maW5kX25vZGVfYnlfdHlwZSgpIGFuZCBmZHRfZmluZF9jb21wYXRpYmxlX25vZGUoKSB0byBMSUJGRFQKKworICAgIFNpZ25lZC1vZmYtYnk6IFdvbGZnYW5nIEdyYW5kZWdnZXIgPHdnQGdyYW5kZWdnZXIuY29tPgorICAgIEFja2VkLWJ5OiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorCitjb21taXQgMWE4NjExNjliYzM3NThmOWRlM2FlYWQ2MmIwNTg3MzZjNjg5MTI0NgorQXV0aG9yOiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorRGF0ZToJV2VkIEp1biA2IDIyOjQ3OjU4IDIwMDcgLTA0MDAKKworICAgIFJlcGxhY2UgZmR0X25vZGVfb2Zmc2V0KCkgd2l0aCBmZHRfZmluZF9ub2RlX2J5X3BhdGgoKS4KKworICAgIFRoZSBuZXcgbmFtZSBtYXRjaGVzIG1vcmUgY2xvc2VseSB0aGUga2VybmVsJ3MgbmFtZSwgd2hpY2ggaXMgYWxzbworICAgIGEgbXVjaCBiZXR0ZXIgZGVzY3JpcHRpb24uCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBHcmFuZGVnZ2VyIDx3Z0BncmFuZGVnZ2VyLmNvbT4KKyAgICBBY2tlZC1ieTogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KKworY29tbWl0IGFkZGQ4Y2U4MzA3OGMyNWYwZWNhNWYyM2FkYmRmYzY0Y2E1MGEyNDMKK0F1dGhvcjogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KK0RhdGU6CVdlZCBNYXkgMTYgMjI6Mzk6NTkgMjAwNyAtMDQwMAorCisgICAgRml4IGNtZF9mZHQgbGluZSBsZW5ndGhzLCByZWZhY3RvciBjb2RlLgorCisgICAgQnJlYWsgbGluZXMgdGhhdCB3ZXJlIGdyZWF0ZXIgdGhhbiA4MCBjaGFyYWN0ZXJzIGluIGxlbmd0aC4KKyAgICBNb3ZlIHRoZSBmZHQgcHJpbnQgYW5kIHByb3BlcnR5IHBhcnNpbmcgY29kZSB0byBzZXBhcmF0ZSBzdGF0aWMgZnVuY3Rpb25zCisgICAgICB0byByZWR1Y2UgY29kaW5nIGNsdXR0ZXIgaW4gdGhlIGZkdF9jbWQgaGFuZGxpbmcgYm9keS4KKworICAgIFNpZ25lZC1vZmYtYnk6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CisKK2NvbW1pdCAyNTExNDAzM2FiMjE3ODg4MTBjNDhiYTRkZjEwM2I2NDlkYTEyMjNiCitBdXRob3I6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CitEYXRlOglTYXQgTWF5IDEyIDA5OjQ3OjI1IDIwMDcgLTA0MDAKKworICAgIEZEVCBjb21tYW5kIGltcHJvdmVtZW50cy4KKworICAgIEZpeCAiZmR0IHNldCIgc28gdGhhdCBpdCB3aWxsIGNyZWF0ZSBhIG5vbi1leGlzdGluZyBwcm9wZXJ0eS4KKyAgICBBZGQgImZkdCBta25vZGUiIHRvIGNyZWF0ZSBub2Rlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CisKK2NvbW1pdCAzOGViNTA4ZThlODExZTJlNTc2MjhmNDQ1ZGUzYTI0YTIzYzdkODA0CitBdXRob3I6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CitEYXRlOglTYXQgTWF5IDEyIDA5OjQ1OjQ2IDIwMDcgLTA0MDAKKworICAgIFJlb3JnYW5pemUgYW5kIGZpeCBwcm9ibGVtcyAocmV0dXJucykgaW4gdGhlIGJvb3RtIGNvbW1hbmQuCisKKyAgICBEbyAqTk9UKiByZXR1cm4gYWZ0ZXIgdGhlICJwb2ludCBvZiBubyByZXR1cm4iIGhhcyBiZWVuIHBhc3NlZC4KKyAgICAgIElmIHNvbWV0aGluZyBnb2VzIHdyb25nLCB0aGUgYm9hcmQgbXVzdCBiZSByZXNldCBhZnRlciB0aGF0IHBvaW50LgorICAgIE1vdmUgdGhlICJUcmFuc2ZlcnJpbmcgY29udHJvbCB0byBMaW51eCIgZGVidWcgbWVzc2FnZSBiYWNrIHRvIHdoZXJlIGl0CisgICAgICBiZWxvbmdzOiBqdXN0IGJlZm9yZSB0cmFuc2ZlcnJpbmcgY29udHJvbCB0byBsaW51eC4KKworICAgIFNpZ25lZC1vZmYtYnk6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CisKK2NvbW1pdCA4OWM4NzU3ZDhmMjEzYzQ3NzA5YmRjNGVmZTA2OTUyNjNhNjA4MGE2CitBdXRob3I6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CitEYXRlOglUdWUgTWF5IDggMjE6Mjc6MzUgMjAwNyAtMDQwMAorCisgICAgRml4IGJ1Z3MgaW4gdGhlIENPTkZJR19PRl9MSUJGRFQKKworICAgIFN0dXBpZCBjb2RpbmcgbWlzdGFrZXMgKGlkZW50aWZpZWQgYnkgVGltdXIgVGFiaSwgdGhhbmtzKS4KKworICAgIFNpZ25lZC1vZmYtYnk6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CisKK2NvbW1pdCA2YmUwN2NjMWNhNDU4Mjc4Yzg1ZWNkYmYxYTA1MzZjZmY0YzcwMWVjCitBdXRob3I6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CitEYXRlOglXZWQgQXByIDI1IDIyOjQ3OjE1IDIwMDcgLTA0MDAKKworICAgIEltcHJvdmUgZmR0IG1vdmUgbGVuZ3RoIGhhbmRsaW5nLgorCisgICAgTWFrZSB0aGUgbGVuZ3RoIHBhcmFtZXRlciBvcHRpb25hbDogaWYgbm90IHNwZWNpZmllZCwgZG8gdGhlIG1vdmUgdXNpbmcKKyAgICB0aGUgY3VycmVudCBzaXplIHVuY2hhbmdlZC4KKworICAgIFNpZ25lZC1vZmYtYnk6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CisKK2NvbW1pdCBiYjkzMGU3NmZlYTZjZjg5Y2EyZDk4ZTJmN2M3YTYwNDNkNzkzMjdkCitBdXRob3I6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CitEYXRlOglXZWQgQXByIDI1IDIyOjIzOjM2IDIwMDcgLTA0MDAKKworICAgIE1pbm9yIGNvZGUgY2xlYW4gdXAuCisKKyAgICBEZWNsYXJlIHRoZSB2YXJpYWJsZSBmZHQgcHJvcGVybHkgYXMgZXh0ZXJuLgorICAgIENhbGwgdGhlICJzZXRfZm4iIGZ1bmN0aW9uIHBvaW50ZXIgdGhlICJzaG9ydCB3YXkiIHdpdGhvdXQgdGhlIGZ1bGwKKyAgICAgIGRlcmVmZXJlbmNpbmcgc3ludGF4LgorCisgICAgU2lnbmVkLW9mZi1ieTogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KKworY29tbWl0IGJhMjRlMmFjM2JkYjVjNDg5ZjNjNzg3ZTc1NDJiNjQ3NGM0ZDY1YzYKK0F1dGhvcjogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KK0RhdGU6CVdlZCBBcHIgMjUgMjE6MjQ6MjcgMjAwNyAtMDQwMAorCisgICAgSW1wcm92ZSBlcnJvciBtZXNzYWdlcywgbW9yZSBpbmZvcm1hdGl2ZS4KKworICAgIFByaW50IG1vcmUgdGhhbiB0aGUgcmF3IGxpYmZkdCBlcnJvciBtZXNzYWdlIHN0cmluZ3MuICBUaGlzIGlzIGVzcGVjaWFsbHkKKyAgICB1c2VmdWwgZm9yIGNsdWluZyBpbiB0aGUgdXNlciB3aGVuIHRoZSBib290bSBjb21tYW5kIGFib3J0cyBkdWUgdG8KKyAgICBibG9iIHByb2JsZW1zLgorCisgICAgU2lnbmVkLW9mZi1ieTogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KKworY29tbWl0IDgwOTZiM2I4Zjc3MmMxODk0ZGRlZGE5ZGJjZWZmNmE4ODI2NDczYTQKK0F1dGhvcjogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KK0RhdGU6CUZyaSBBcHIgMjAgMjI6NDY6NTMgMjAwNyAtMDQwMAorCisgICAgbGliZmR0OiBDb25kaXRpb25hbGx5IGNvbXBpbGUgYmFzZWQgb24gQ09ORklHX09GX0xJQkZEVAorCisgICAgVGhpcyBpcyB0aGUgd2F5IHUtYm9vdCByZWR1Y2VzIGNvbmZpZ3VyZWQtb3V0IGNvZGUuICBBdCBXb2xmZ2FuZworICAgIEdyYW5kZWdnZXIgYW5kIFdvbGZnYW5nIERlbmsncyByZXF1ZXN0LCBtYWtlIGxpYmZkdCBjb25mb3JtLgorCisgICAgU2lnbmVkLW9mZi1ieTogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KKworY29tbWl0IDkyM2VmZDI4NjQxMWVkMDUyZDllMDc0ZjU5Zjg5ODZkNjA4MTA2MWMKK0F1dGhvcjogQnJ1Y2UgQWRsZXIgPGJydWNlLmFkbGVyQGNjcHUuY29tPgorRGF0ZToJRnJpIEF1ZyAxMCAxNDo1NDo0NyAyMDA3IC0wNzAwCisKKyAgICBhZGQgaW1hZ2Ugc2l6ZSBhbmQgZGVzY3JpcHRvcnMgZm9yIFNwYXJ0YW4gM0UgRlBHQSBjaGlwcworCisgICAgU3BhcnRhbiAzRSBpbWFnZSBzaXplcyB0YWtlbiBmcm9tIFRhYmxlIDEtNCBpbiBYaWxpbnggVUczMzIgKHYxLjEpCisKKyAgICBTaWduZWQtb2ZmIGJ5OiBCcnVjZSBBZGxlciA8YnJ1Y2UuYWRsZXJAY2NwdS5jb20+CisKK2NvbW1pdCBmYjU2NTc5ZmZlN2VmMzI3NWI3MDM2YmI3YjkyNGU1YTBkMzJiZDcwCitBdXRob3I6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CitEYXRlOglGcmkgQXVnIDEwIDE1OjM0OjQ4IDIwMDcgLTA1MDAKKworICAgIG1ha2UgTUFLRUFMTCBtb3JlIGltbXVuZSB0byBtZXJnZSBjb25mbGljdHMKKworICAgIC4uYnkgcGxhY2luZyBib2FyZCBlbnRyaWVzIG9uZSBwZXIgbGluZSwgYXMgc3VnZ2VzdGVkIGJ5IGpkbC4KKworICAgIFNpZ25lZC1vZmYtYnk6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAyNjI4MTE0ZWM1NjRmOTY5ZjM0YjVmNzEwNWZiZDE2OGNiOGM5YzNmCitBdXRob3I6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CitEYXRlOglGcmkgQXVnIDEwIDEzOjI4OjI1IDIwMDcgLTA1MDAKKworICAgIFJFQURNRTogUmVtb3ZlIG91dGRhdGVkIGNwdSB0eXBlLCBib2FyZCB0eXBlLCBhbmQgTkFNRV9jb25maWcgbGlzdHMKKworICAgIFNpZ25lZC1vZmYtYnk6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA0OWJiNTk5MTJkMjFhYWNiNTA3ZWI4MWZkMjFmYjdhZjY1MGM3MDZjCitBdXRob3I6IERhdmUgTGl1IDxyNjMyMzhAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CUZyaSBBdWcgMTAgMTU6NDg6NTkgMjAwNyArMDgwMAorCisgICAgbXBjODN4eDogU3VwcHJlc3MgdGhlIHdhcm5pbmcgJ2J1cnN0bGVuJworCisgICAgc3VwcHJlc3MgdGhlIHdhcm5pbmcgJ2J1cnN0bGVuJyBvZiBzcGRfc2RyYW0uCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBEYXZlIExpdSA8ZGF2ZWxpdUBmcmVlc2NhbGUuY29tPgorCitjb21taXQgYzJjMGFiNGFmZjg2NjIyYjgzN2E0OGEwZTU2MDM1MWY5YWZhZmI5NQorQXV0aG9yOiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CitEYXRlOglGcmkgQXVnIDEwIDIwOjM0OjU4IDIwMDcgKzAyMDAKKworICAgIENvbmRpbmcgc3R5bGUgY2xlYW51cAorCisgICAgU2lnbmVkLW9mZi1ieTogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorCitjb21taXQgYzc0YjIxMDhlMzFmZTA5YmQxYzVkMjkxYzNjZjM2MDUxMGQ0ZjEzZQorQXV0aG9yOiBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KK0RhdGU6CUZyaSBBdWcgMTAgMjA6MjY6MTggMjAwNyArMDIwMAorCisgICAgW0FSTV0gVEkgRGFWaW5jaSBzdXBwb3J0LCBob3BlZnVsbHkgZmluYWwKKworICAgIEFkZCBzdXBwb3J0IGZvciB0aGUgZm9sbG93aW5nIERhVmluY2kgYm9hcmRzOgorICAgIC0gRFZfRVZNCisgICAgLSBTQ0hNT09HSUUKKyAgICAtIFNPTkFUQQorCisgICAgQ2hhbmdlczoKKworICAgIC0gU3BsaXQgaW50byBzZXBhcmF0ZSBib2FyZCBkaXJlY3RvcmllcworICAgIC0gUmVtb3ZlZCBjaGFuZ2VzIHRvIE1URF9ERUJVRyAob3Igd2hhdGV2ZXIgaXQncyBjYWxsZWQpCisgICAgLSBOZXcgQ09ORklHX0NNRCBwYXJ0eSBsaW5lIGZvbGxvd2VkCisgICAgLSBTb21lIGNvc21ldGljIGZpeGVzLCBjbGVhbnVwIGV0Yy4KKyAgICAtIFBhdGNoZXMgYWdhaW5zdCB0aGUgbGF0ZXN0IFUtQm9vdCB0cmVlIGFzIG9mIG5vdy4KKyAgICAtIEZpeGVkIENPTkZJR19DTURfTkVUIGluIG5ldCBmaWxlcy4KKyAgICAtIEZpeGVkIENPTkZJR19DTURfRUVQUk9NIGZvciBzY2htb29naWUuCisgICAgLSBNYWRlIHN1cmUgaXQgY29tcGlsZXMgYW5kIHdvcmtzIChmb3JjZWVudigpIGxpbmsgcHJvYmxlbSkgb24gU0NITU9PR0lFIGFuZAorICAgICAgIERWX0VWTS4gQ2FuJ3QgY2hlY2sgaWYgaXQgd29ya3Mgb24gU09OQVRBLCBkb24ndCBoYXZlIGEgYm9hcmQgYW55IG1vcmUsCisgICAgICAgYnV0IGl0IGF0IGxlYXN0IGNvbXBpbGVzLgorCisgICAgSGVyZSBpcyBhbiBleGNlcnB0IGZyb20gc2Vzc2lvbiBsb2cgb24gU0NITU9PR0lFLi4uCisKKyAgICBVLUJvb3QgMS4yLjAtZzZjMzNjNzg1LWRpcnR5IChBdWcgIDcgMjAwNyAtIDEzOjA3OjE3KQorCisgICAgRFJBTTogIDEyOCBNQgorICAgIE5BTkQ6ICAxMjggTWlCCisgICAgSW46ICAgIHNlcmlhbAorICAgIE91dDogICBzZXJpYWwKKyAgICBFcnI6ICAgc2VyaWFsCisgICAgQVJNIENsb2NrIDogMjk3TUh6CisgICAgRERSIENsb2NrIDogMTYyTUh6CisgICAgRVRIIFBIWSAgIDogRFA4Mzg0OCBAIDB4MDEKKyAgICBVLUJvb3QgPiBpcHJvYmUKKyAgICBWYWxpZCBjaGlwIGFkZHJlc3NlczogMUIgMzggM0EgM0QgM0YgNTAgNUQgNkYKKyAgICBVLUJvb3QgPiBwaW5nIDE5Mi4xNjguMjUzLjEwCisgICAgaG9zdCAxOTIuMTY4LjI1My4xMCBpcyBhbGl2ZQorICAgIFUtQm9vdCA+CisKKyAgICBTaWduZWQtb2ZmLWJ5OiBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKyAgICBBY2tlZC1ieTogRGlyayBCZWhtZSA8ZGlyay5iZWhtZUBnbWFpbC5jb20+CisgICAgQWNrZWQtYnk6IFphY2ggU2FkZWNraSA8WmFjaC5TYWRlY2tpQHJpcGNvZGUuY29tPgorICAgIEFja2VkLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CisKK2NvbW1pdCAzYTZkNTZjMjA5ODlmZTI3MzYwYWZlNzQzYmQyYTdhZDRkNzZlNDhmCitBdXRob3I6IERpcmsgQmVobWUgPGRpcmsuYmVobWVAZ29vZ2xlbWFpbC5jb20+CitEYXRlOglUaHUgQXVnIDIgMTc6NDI6MDggMjAwNyArMDIwMAorCisgICAgTWFrZSB1c2Ugb2YgZ2VuZXJpYyA2NGJpdCBkaXZpc2lvbiBpbiBuYW5kX3V0aWwuYworCisgICAgVXNlIGdlbmVyaWMgNjRiaXQgZGl2aXNpb24gaW4gbmFuZF91dGlsLmMuIFRoaXMgbWFrZXMgbmFuZF91dGlsLmMKKyAgICBpbmRlcGVuZGVudCBvZiBhbnkgdG9vbGNoYWluIDY0Yml0IGRpdmlzaW9uLgorCisgICAgU2lnbmVkLW9mZi1ieTogRGlyayBCZWhtZSA8ZGlyay5iZWhtZUBnbWFpbC5jb20+CisKK2NvbW1pdCBmN2MwODZlOTRlOGNlOWFhZDcyNjhhZjk3ZjczYWE2ODg0Njg2ZjI3CitBdXRob3I6IERpcmsgQmVobWUgPGRpcmsuYmVobWVAZ29vZ2xlbWFpbC5jb20+CitEYXRlOglUaHUgQXVnIDIgMTc6NDE6MTQgMjAwNyArMDIwMAorCisgICAgTW92ZSA2NGJpdCBkaXZpc2lvbiBmcm9tIGF2cjMyIHRvIGdlbmVyaWMgbGliCisKKyAgICBNb3ZlIHRoZSA2NGJpdCBkaXZpc2lvbiBmcm9tIGxpYl9hdnIzMiB0byBsaWJfZ2VuZXJpYy4gV2l0aCB0aGlzLCBhbGwKKyAgICBib2FyZHMgY2FuIGRvX2Rpdi9fX2RpdjY0XzMyIGlmIG5lZWRlZCwgbm90IG9ubHkgYXZyIG9uZS4gQ29kZSBpcyBwdXQKKyAgICB0byBsaWJfZ2VuZXJpYywgc28gbm8gbGFyZ2VyIG1lbW9yeSBmb290cHJpbnQgaWYgbm90IHVzZWQuIE5vIGNvZGUKKyAgICBtb2RpZmljYXRpb25zLiBUaGFua3MgZm9yIHByb3Bvc2FsIGJ5IEjDpXZhcmQgU2tpbm5lbW9lbi4KKworICAgIFNpZ25lZC1vZmYtYnk6IERpcmsgQmVobWUgPGRpcmsuYmVobWVAZ21haWwuY29tPgorCitjb21taXQgOTljMmZkYWI5MWJjNjMzZTQ2ZmI0MWRiYWE2MjlmODdjY2Y2ZTAwZgorQXV0aG9yOiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEF1ZyA2IDE4OjE4OjM0IDIwMDcgLTA1MDAKKworICAgIG1wYzgzeHg6IGZpeCBJVFhbR1BdIE89YnVpbGRkaXIgYnVpbGRzCisKKyAgICBtYWtlOiAqKiogTm8gcnVsZSB0byBtYWtlIHRhcmdldCBgL3dvcmsvd2QvdG1wL2JvYXJkL21wYzgzNDlpdHgvdS1ib290LmxkcycsIG5lZWRlZCBieSBgL3dvcmsvd2QvdG1wL3UtYm9vdCcuICBTdG9wLgorCisgICAgQm90aCB0aGUgSVRYIGFuZCBJVFgtR1AgZmFpbCB3aGVuIHlvdSB1c2UgIm1ha2UgTz08c29tZSBkaXI+IC4uLiIgb3IKKyAgICAiQlVJTERfRElSPTxzb21lIGRpcj4gLi9NQUtFQUxMIC4uLiIKKworICAgIFNpZ25lZC1vZmYtYnk6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA0N2U4YmM4NDY3NTllMDM3YjhhZjBlNWY5YzlmOWNmYTdhMTA1MGMzCitBdXRob3I6IERhdmUgTGl1IDxyNjMyMzhAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVdlZCBBdWcgMSAxNTowMDo1OSAyMDA3ICswODAwCisKKyAgICBtcGM4M3h4OiBDb3JyZWN0IHRoZSBSRUFETUUgZm9yIEREUiBFQ0MKKworICAgIFVwZGF0ZSB0aGUgUkVBRE1FIGZvciBERFIgRUNDLCBjaGFuZ2UgdGhlIG5hbWUKKyAgICB0byBSRUFETUUubXBjODN4eC5kZHJlY2MuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBEYXZlIExpdSA8ZGF2ZWxpdUBmcmVlc2NhbGUuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBkYWFiOGM2N2QyZGVmZWY3M2RjMjZhYjA3ZjBjM2FmZDFiMDVkMDE5CitBdXRob3I6IERhdmUgTGl1IDxyNjMyMzhAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVdlZCBBdWcgMSAxNTowMDoxNSAyMDA3ICswODAwCisKKyAgICBtcGM4M3h4OiBDb25zb2xpZGF0ZSB0aGUgRUNDIHN1cHBvcnQgb2YgODN4eAorCisgICAgUmVtb3ZlIHRoZSBkdXBsaWNhdGVkIHNvdXJjZSBjb2RlIG9mIGVjYyBjb21tYW5kIG9uIHRoZSA8Ym9hcmQ+LmMsCisgICAgZm9yIHJldXNlZCwgbW92ZSB0aGVzZSBjb2RlIHRvIGNwdS9tcGM4M3h4IGRpcmVjdG9yeS4KKworICAgIFNpZ25lZC1vZmYtYnk6IERhdmUgTGl1IDxkYXZlbGl1QGZyZWVzY2FsZS5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDAzNjU3NWM1NDRjZjFiNjk2NTRkOGZiMzM0YmRhNjljNmZmM2RhMzYKK0F1dGhvcjogRGF2ZSBMaXUgPHI2MzIzOEBmcmVlc2NhbGUuY29tPgorRGF0ZToJU2F0IEF1ZyA0IDEzOjM3OjM5IDIwMDcgKzA4MDAKKworICAgIG1wYzgzeHg6IENvcnJlY3QgdGhlIGJ1cnN0IGxlbmd0aCBmb3IgRERSMiB3aXRoIDMyIGJpdHMKKworICAgIFRoZSBidXJzdCBsZW5ndGggc2hvdWxkIGJlIDQgZm9yIEREUjIgd2l0aCAzMiBiaXRzIGJ1cworCisgICAgU2lnbmVkLW9mZi1ieTogRGF2ZSBMaXUgPGRhdmVsaXVAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDFjMjc0YzRlMDViNmRjOWIyNGVkYzhhYTYxOGIwMmY2MDdlZTZlZWQKK0F1dGhvcjogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVdlZCBKdWwgMjUgMTk6MjU6MzMgMjAwNyAtMDUwMAorCisgICAgbXBjODN4eDogYWRkIHN1cHBvcnQgZm9yIHRoZSBNUEM4MzIzRSBSREIKKworICAgIE1QQzgzMjNFIGJhc2VkIGJvYXJkIHdpdGggNjRNQiBmaXhlZCBTRFJBTSwgMTZNQiBmbGFzaCwKKyAgICBmaXZlIDEwLzEwMCBldGhlcm5ldCBwb3J0cyBjb25uZWN0ZWQgdmlhIGFuIElDUGx1cyBJUDE3NUMKKyAgICBzd2l0Y2gsIG9uZSBQQ0kgc2xvdCwgYW5kIHNlcmlhbC4gIEZlYXR1cmVzIG5vdCBzdXBwb3J0ZWQKKyAgICBpbiB0aGlzIHBhdGNoIGFyZSBTRCBjYXJkIGludGVyZmFjZSwgMiBVU0IgcG9ydHMsIGFuZCB0aGUKKyAgICB0d28gcGhvbmUgcG9ydHMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBNaWNoYWVsIEJhcmtvd3NraSA8bWljaGFlbC5iYXJrb3dza2lAZnJlZXNjYWxlLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgMzQzZDkxMDA5ZDU1ZmM1YjNmZjhjYzk0MDU5N2FmNmM2YWExZDM1OQorQXV0aG9yOiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorRGF0ZToJV2VkIEp1bCAyNSAxOToyNToyOCAyMDA3IC0wNTAwCisKKyAgICBtcGM4M3h4OiBmaXh1cCBnZW5lcmljIHBjaSBmb3IgbGliZmR0CisKKyAgICBhZGQgbGliZmR0IHN1cHBvcnQgdG8gdGhlIGdlbmVyaWMgODN4eCBwY2kgY29kZQorCisgICAgU2lnbmVkLW9mZi1ieTogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGY1N2FjN2E3YjM3MTA5MjQ1YjY5ZGI4MDgzOWViZWUyNjE3OTk2NmEKK0F1dGhvcjogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVdlZCBKdWwgMjUgMTk6MjU6MjIgMjAwNyAtMDUwMAorCisgICAgbXBjODN4eDogZml4IDgzNjAgYW5kIGNwdSBmdW5jdGlvbnMgdG8gdXBkYXRlIGZkdCBiZWluZyBwYXNzZWQKKworICAgIC4uYW5kIG5vdCB0aGUgZ2xvYmFsIGZkdC4gUmVuYW1lIGxvY2FsIGZkdCB2YXJzIHRvIGJsb2Igc28gYXMgbm90IHRvCisgICAgYmUgY29uZnVzZWQgd2l0aCB0aGUgZ2xvYmFsIHZhciB3aXRoIHRoZSBzYW1lIHRocmVlLWxldHRlciBuYW1lLgorCisgICAgU2lnbmVkLW9mZi1ieTogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDhiZTQwNDQ1OWE2YjczOTU0MTVhNTdiYjM1ZTgzNzdlM2IyYjVhY2IKK0F1dGhvcjogSmVycnkgVmFuIEJhcmVuIDxndmIudWJvb3RAZ21haWwuY29tPgorRGF0ZToJV2VkIEp1bCA0IDIxOjM0OjI0IDIwMDcgLTA0MDAKKworICAgIG1wYzgzeHg6IEZpeCBlcnJvcnMgd2hlbiBDT05GSUdfT0ZfTElCRkRUIGlzIGVuYWJsZWQKKworICAgIFNldmVyYWwgbm9kZSBzdHJpbmdzIHdlcmUgbm90IGNvcnJlY3QgKHRyYWlsaW5nIHNsYXNoZXMgYW5kIHByb3BlcnRpZXMKKyAgICAgIGluIHRoZSBzdHJpbmdzKQorICAgIEFkZGVkIHNldHRpbmcgb2YgdGhlIHRpbWViYXNlLWZyZXF1ZW5jeS4KKyAgICBJbXByb3ZlZCBlcnJvciBtZXNzYWdlcyBhbmQgdXNlIGRlYnVnKCkgaW5zdGVhZCBvZiBwcmludGYoKS4KKworICAgIFNpZ25lZC1vZmYtYnk6IEdlcmFsZCBWYW4gQmFyZW4gPHZhbmJhcmVuQGNpZGVhcy5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDI2ZDAyYzliYmFjMTc1MWM1ZTE5Mjk0ZjAwMDEwMGI0OGQ0M2E5MjAKK0F1dGhvcjogSmVycnkgVmFuIEJhcmVuIDxndmIudWJvb3RAZ21haWwuY29tPgorRGF0ZToJV2VkIEp1bCA0IDIxOjI3OjMwIDIwMDcgLTA0MDAKKworICAgIG1wYzgzeHg6IFJlcGxhY2UgZmR0X25vZGVfb2Zmc2V0KCkgd2l0aCBmZHRfZmluZF9ub2RlX2J5X3BhdGgoKS4KKworICAgIFRoZSBuZXcgbmFtZSBtYXRjaGVzIG1vcmUgY2xvc2VseSB0aGUga2VybmVsJ3MgbmFtZSwgd2hpY2ggaXMgYWxzbworICAgIGEgbXVjaCBiZXR0ZXIgZGVzY3JpcHRpb24uCisKKyAgICBUaGVzZSBhcmUgdGhlIG1wYzgzeHggY2hhbmdlcyBtYWRlIG5lY2Vzc2FyeSBieSB0aGUgZnVuY3Rpb24gbmFtZSBjaGFuZ2UuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBHcmFuZGVnZ2VyIDx3Z0BncmFuZGVnZ2VyLmNvbT4KKyAgICBBY2tlZC1ieTogR2VyYWxkIFZhbiBCYXJlbiA8dmFuYmFyZW5AY2lkZWFzLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgOWJlMzlhNjdjOWY4ZmVmNzEwN2Y1ZGYwOWQ2NzMwMDVmMDRkMDk2MworQXV0aG9yOiBEYXZlIExpdSA8ZGF2ZWxpdUBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1biAyNSAxMDo0MTo1NiAyMDA3ICswODAwCisKKyAgICBtcGM4M3h4OiBBZGQgc3VwcG9ydCBmb3IgdGhlIGRpc3BsYXkgb2YgcmVzZXQgc3RhdHVzCisKKyAgICA4M3h4IHByb2Nlc3NvciBmYW1pbHkgaGFzIG1hbnkgcmVzZXQgc291cmNlcywgc3VjaCBhcworICAgIHBvd2VyIG9uIHJlc2V0LCBzb2Z0d2FyZSBoYXJkIHJlc2V0LCBzb2Z0d2FyZSBzb2Z0IHJlc2V0LAorICAgIEpUQUcsIGJ1cyBtb25pdG9yLCBzb2Z0d2FyZSB3YXRjaGRvZywgY2hlY2sgc3RvcCByZXNldCwKKyAgICBleHRlcm5hbCBoYXJkIHJlc2V0LCBleHRlcm5hbCBzb2Z0d2FyZSByZXNldC4KKyAgICBzb21ldGltZXMsIHRvIGZpZ3VyZSBvdXQgdGhlIGZhdWx0IG9mIHN5c3RlbSwgd2UgbmVlZCB0bworICAgIGtub3cgdGhlIGNhdXNlIG9mIHJlc2V0IGVhcmx5IGJlZm9yZSB0aGUgcHJvbXB0IG9mCisgICAgdS1ib290IHByZXNlbnQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBEYXZlIExpdSA8ZGF2ZWxpdUBmcmVlc2NhbGUuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBmZjk2NThkNzA0OWJmOGM4ZThlMGEwNWRiZTVlOWY3ZTkxYWE1YTVkCitBdXRob3I6IERhdmUgTGl1IDxkYXZlbGl1QGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVuIDI1IDEwOjQxOjA0IDIwMDcgKzA4MDAKKworICAgIG1wYzgzeHg6IEZpeCB0aGUgYWxpZ24gYnVnIG9mIFNETUEgYnVmZmVyCisKKyAgICBBY2NvcmRpbmcgdG8gdGhlIGxhdGVzdCB1c2VyIG1hbnVhbCwgdGhlIFNETUEgdGVtcG9yYXJ5CisgICAgYnVmZmVyIGJhc2UgYWRkcmVzcyBtdXN0IGJlIDRLQiBhbGlnbmVkLgorCisgICAgU2lnbmVkLW9mZi1ieTogRGF2ZSBMaXUgPGRhdmVsaXVAZnJlZXNjYWxlLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgNjZkYzJjMmRjNTFmOGI4OGJiOGUyMzFiYzgwY2Q5MmVhZTFkNjQ3NgorQXV0aG9yOiBEYXZlIExpdSA8ZGF2ZWxpdUBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1biAyNSAxMzoyMToxMiAyMDA3ICswODAwCisKKyAgICBtcGM4M3h4OiBSZXZpc2UgdGhlIE1QQzgzNjBFTURTIHJlYWRtZSBkb2MKKworICAgIFdoZW4gdGhlIHJldjIueCBzaWxpY29uIG1vdW50IG9uIHRoZSBNUEM4MzYwRU1EUyBiYW9yZCwKKyAgICBhbmQgaWYgeW91IGFyZSB1c2luZyB0aGUgdS1ib290IHZlcnNpb24gYWZ0ZXIgdGhlIGNvbW1pdAorICAgIDNmYzBiZDE1OTEwM2I1MzZlMWM1NGM2ZjQ0NTdhMDliM2FiYTY2Y2EuCisgICAgdG8gbWFrZSB0aGUgZXRoZXJuZXQgaW50ZXJmYWNlIHVzYWJsZSwgd2UgaGF2ZSB0byBzZXR1cAorICAgIHRoZSBqdW1wZXJzIGNvcnJlY3RseS4KKworICAgIFNpZ25lZC1vZmYtYnk6IERhdmUgTGl1IDxkYXZlbGl1QGZyZWVzY2FsZS5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGU3MzliYzk1Nzk3YWFjNGZlZmM0Yzc1YjU1YzdjNzhlNTlkM2VhOWMKK0F1dGhvcjogVGltdXIgVGFiaSA8dGltdXJAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBKdWwgMyAxMzo0NjozMiAyMDA3IC0wNTAwCisKKyAgICBGU0wgSTJDIGRyaXZlciBwcm9ncmFtcyB0aGUgdHdvIEkyQyBidXNzZXMgZGlmZmVyZW50bHkKKworICAgIFRoZSBpMmNfaW5pdCgpIGZ1bmN0aW9uIGluIGZzbF9pMmMuYyBwcm9ncmFtcyB0aGUgdHdvIEkyQyBidXNzZXMgZGlmZmVyZW50bHkuCisgICAgVGhlIHNlY29uZCBJMkMgYnVzIGhhcyBpdHMgc2xhdmUgYWRkcmVzcyBwcm9ncmFtbWVkIGluY29ycmVjdGx5IGFuZCBpcworICAgIG1pc3NpbmcgYSA1LXVzIGRlbGF5LgorCisgICAgU2lnbmVkLW9mZi1ieTogVGltdXIgVGFiaSA8dGltdXJAZnJlZXNjYWxlLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgZGYzM2Y2YjRkNmQ2MzY5M2RkOTIwMDgwOGIyNDJkZTFiODZjYjhlOAorQXV0aG9yOiBUaW11ciBUYWJpIDx0aW11ckBmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEp1bCAzIDEzOjA0OjM0IDIwMDcgLTA1MDAKKworICAgIFVwZGF0ZSBTQ0NSIHByb2dyYW1taW5nIGluIGNwdV9pbml0X2YoKSB0byBzdXBwb3J0IGFsbCA4M3h4IHByb2Nlc3NvcnMKKworICAgIFVwZGF0ZSB0aGUgY3B1X2luaXRfZigpIGZ1bmN0aW9uIGluIGNwdS9tcGM4M3h4L2NwdV9pbml0LmMgdG8gcHJvZ3JhbSB0aGUKKyAgICBiaXRmaWVsZHMgZm9yIGFsbCA4M3h4IHByb2Nlc3NvcnMuCVRoZSBjb2RlIHRvIHVwZGF0ZSBzb21lIGJpdGZpZWxkcyB3YXMKKyAgICBjb21waWxlZCBvbmx5IG9uIHNvbWUgcHJvY2Vzc29ycy4gIE5vdywgdGhlIGJpdGZpZWxkcyBhcmUgcHJvZ3JhbW1lZCBhcyBsb25nCisgICAgYXMgdGhlIGNvcnJlc3BvbmRpbmcgQ0ZHX1NDQ1Igb3B0aW9uIGlzIGRlZmluZWQgaW4gdGhlIGJvYXJkIGhlYWRlciBmaWxlLgorICAgIFRoaXMgbWVhbnMgdGhhdCB0aGUgYm9hcmQgaGVhZGVyIGZpbGUgc2hvdWxkIG5vdCBkZWZpbmUgYW55IENGR19TQ0NSIG1hY3JvcworICAgIGZvciBiaXRmaWVsZHMgdGhhdCBkb24ndCBleGlzdCBvbiB0aGF0IHByb2Nlc3Nvciwgb3RoZXJ3aXNlIHRoZSBTQ0NSIHdpbGwgYmUKKyAgICBwcm9ncmFtbWVkIGluY29ycmVjdGx5LgorCisgICAgU2lnbmVkLW9mZi1ieTogVGltdXIgVGFiaSA8dGltdXJAZnJlZXNjYWxlLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgOTU0NjI2Njk5OWYwYjliNTEzNzI2MzY2MTQyMTFiODhkOTBmMGYyNQorQXV0aG9yOiBNYXJ0aW4gS3JhdXNlIDxtYXJ0aW4ua3JhdXNlQHRxcy5kZT4KK0RhdGU6CUZyaSBKdW4gMjIgMTM6MDQ6MjIgMjAwNyArMDIwMAorCisgICAgVFFNODM0eDogY2xlYW51cCBjb25maWd1cmF0b24KKworICAgIFJlbW92ZSBpcnJpdGF0aW5nICN1bmRlZiBERUJVRworCisgICAgU2lnbmVkLW9mZi1ieTogTWFydGluIEtyYXVzZSA8bWFydGluLmtyYXVzZUB0cXMuZGU+CisgICAgU2lnbmVkLW9mZi1ieTogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDVkNDk3ZTZiZjBmNWJmNjM3MjliNGE0N2IzZmQ3ODZkM2M3N2ExYmMKK0F1dGhvcjogZGF2aWQuc2FhZGEgPERhdmlkLlNhYWRhQGVjaXRlbGUuY29tPgorRGF0ZToJTW9uIEp1biAxOCAwOTowOTo1MyAyMDA3IC0wNzAwCisKKyAgICBNUEM4M3h4OiBGaXggbWFrZWZpbGUgdG8gZ2VuZXJhdGUgY29uZmlnLmggZmlsZSBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5CisKKyAgICBNUEM4M3h4OiBGaXggdGhlIE1ha2VmaWxlIGNvbmZpZyBzZWN0aW9ucyB0byBnZW5lcmF0ZSB0aGUgaW5jbHVkZS9jb25maWcuaAorICAgIGZpbGUgaW4gdGhlIGJ1aWxkIGRpcmVjdG9yeSBpbnN0ZWFkIG9mIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgorCisgICAgU2lnbmVkLW9mZi1ieTogRGF2aWQgU2FhZGEgPGRhdmlkLnNhYWRhQGVjaXRlbGUuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAxZGVkMDI0MmU0MzcyNTkzNjY3OTJkNTJiN2U5ZDFlMTkzMWQ4ZmE1CitBdXRob3I6IExlZSBOaXBwZXIgPExlZS5OaXBwZXJAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVRodSBKdW4gMTQgMjA6MDc6MzMgMjAwNyAtMDUwMAorCisgICAgbXBjODN4eDogQWRkIHN1cHBvcnQgZm9yIDgzNjAgc2lsaWNvbiByZXZpc2lvbiAyLjEKKworICAgIFRoaXMgY2hhbmdlIGFkZHMgODM2MCBzaWxpY29uIHJldmlzaW9uIDIuMSBzdXBwb3J0IHRvIHUtYm9vdC4KKworICAgIFNpZ25lZC1vZmYtYnk6IExlZSBOaXBwZXIgPGxlZS5uaXBwZXJAZnJlZXNjYWxlLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgYTIyODA2NDY5YThmMmI2OWM4MjlmNGZkNTM2MWZkZWJkMGNiMDFiNAorQXV0aG9yOiBLdW1hciBHYWxhIDxnYWxha0BrZXJuZWwuY3Jhc2hpbmcub3JnPgorRGF0ZToJV2VkIEF1ZyA4IDA0OjE0OjI4IDIwMDcgLTA1MDAKKworICAgIFRyZWF0IHBwYzY0IGhvc3QgYXMgcHBjCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBLdW1hciBHYWxhIDxnYWxha0BrZXJuZWwuY3Jhc2hpbmcub3JnPgorCitjb21taXQgMGRjNDI3OWIwOGZmODI0NzJiZWMyZTJjOTA4NTg2MDI0NTlmZWJlOAorQXV0aG9yOiBKYXNvbiBKaW4gPEphc29uLmppbkBmcmVlc2NhbGUuY29tPgorRGF0ZToJV2VkIEF1ZyA4IDA5OjAxOjQ2IDIwMDcgKzA4MDAKKworICAgIE1pbm9yIGZpeCBmb3IgYmlvcyBlbXVsYXRvciBtYWtlZmlsZQorCisgICAgQWRkICQob2JqKSB0byBMSUIgYXZvaWRpbmcgb2JqZWN0cyBiZSBidWlsdCBpbiB0aGUgc291cmNlIGRpcgorCisgICAgU2lnbmVkLW9mZi1ieTogSmFzb24gSmluIDxKYXNvbi5qaW5AZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGNlOTgxZGM4NTdhZGZjODAzNmNhMmY2ZDVkNWEwNmMyYThhYTc3ZDYKK0F1dGhvcjogSmFzb24gSmluIDxKYXNvbi5qaW5AZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVdlZCBBdWcgOCAwODozMzoxMSAyMDA3ICswODAwCisKKyAgICBBZGQgQ09ORklHX0JJT1NFTVUgZGVmaW5lIHRvIGd1YXJkIGFsbCB0aGUgYmlvcyBlbXVsYXRvciBjb2RlCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKYXNvbiBKaW4gPEphc29uLmppbkBmcmVlc2NhbGUuY29tPgorCisgICAgVGhpcyBwYXRjaCBmaXggdGhlIGNvbXBpbGUgaXNzdWUgb24gdGhlIGJvYXJkIHRoYXQgZGlkIG5vdCBlbmFibGUgdGhlIGJpb3MgZW11bGF0b3IKKworY29tbWl0IGVkODEwNjQzMzUyMmYyZWE4OTMzZTk4MDgzNDY4NjBkMDYxZDc3MzEKK0F1dGhvcjogWmFjaCBTYWRlY2tpIDxaYWNoLlNhZGVja2lAcmlwY29kZS5jb20+CitEYXRlOglUdWUgSnVsIDMxIDEyOjI3OjI1IDIwMDcgLTA1MDAKKworICAgIHRzZWM6IGZpeCBtdWx0aXBsZSBQSFkgc3VwcG9ydAorCisgICAgVGhlIGNoYW5nZSBlbnRpdGxlZCAiUmVkdWNlIENPTkZJR19NUEM4WVhYX1RTRUN4IHRvIENPTkZJR19UU0VDeCIKKyAgICBicm9rZSBtdWx0aXBsZSBQSFkgc3VwcG9ydCBpbiB0c2VjLmMuICBUaGlzIGZpeGVzIGl0LgorCisgICAgU2lnbmVkLW9mZi1ieTogWmFjaCBTYWRlY2tpIDxaYWNoLlNhZGVja2lAcmlwY29kZS5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGRjYjg0YjcyMDhhZGUwYmJlYmJlYjU2YmVjOWMyYzY0ZjhiMmVlZGUKK0F1dGhvcjogSm9lIEhhbW1hbiA8am9lLmhhbW1hbkBlbWJlZGRlZHNwZWNpYWx0aWVzLmNvbT4KK0RhdGU6CVRodSBBdWcgOSAwOTowODoxOCAyMDA3IC0wNTAwCisKKyAgICB0c2VjOiBBbGxvdyBUZW4gQml0IEludGVyZmFjZSBhZGRyZXNzIHRvIGJlIGNvbmZpZ3VyYWJsZQorCisgICAgQWxsb3cgdGhlIGFkZHJlc3Mgb2YgdGhlIFRlbiBCaXQgSW50ZXJmYWNlIChUQkkpIHRvIGJlIGNoYW5nZWQgaW4gdGhlCisgICAgZXZlbnQgb2YgYSBjb25mbGljdCB3aXRoIGFub3RoZXIgZGV2aWNlLgorCisgICAgU2lnbmVkLW9mZiBieTogSm9lIEhhbW1hbiA8am9lLmhhbW1hbkBlbWJlZGRlZHNwZWNpYWx0aWVzLmNvbT4KKworY29tbWl0IDdjNGMzNzIyYTM4ZDQwYjBjZjUzN2RkYWU3MmIwNGY0MDg4YjE5MGMKK0F1dGhvcjogSmFzb24gSmluIDxKYXNvbi5qaW5AZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBBdWcgNyAxNjoxNzowNiAyMDA3ICswODAwCisKKyAgICBBZGQgQ09ORklHX0JJT1NFTVUgZGVmaW5lIHRvIGd1YXJkIGFsbCB0aGUgYmlvcyBlbXVsYXRvciBjb2RlCisKKyAgICBUaGlzIHBhdGNoIGZpeCB0aGUgY29tcGlsZSBpc3N1ZSBvbiB0aGUgYm9hcmQgdGhhdCBkaWQgbm90IGVuYWJsZSB0aGUgYmlvcyBlbXVsYXRvcgorCitjb21taXQgYmYxMDYwZWE0ZjllYWE3ZTdkMTY0YTcwYTdkNmYyODkzOTg4MjA1MworQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorRGF0ZToJVHVlIEF1ZyA3IDE2OjAyOjEzIDIwMDcgKzAyMDAKKworICAgIEZpeCBtaXNzaW5nIGJyYWNlIGVycm9yIGluIGZzL2ZhdC9mYXQuYworICAgIFtwb2ludGVkIG91dCBieSBSb2RlcmlrIFdpbGRlbmJ1cmddCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorCitjb21taXQgNmMzM2M3ODU1N2NhNmY4ZGE2OGMwMWNlMzNlMjc4Njk1MTk3ZDNmNAorQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorRGF0ZToJTW9uIEF1ZyA2IDIzOjIxOjA1IDIwMDcgKzAyMDAKKworICAgIEZpeGVkIHR5cG8gaW4gUkVBRE1FIChwb2ludGVkIG91dCBieSBNYXJ0aW4gSm9zdCkuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorCitjb21taXQgOWM3ZTRiMDYyMTRkYjYxYmIyMWYxYmNiZTU3Yzk3NTE5NjY5YmFhZQorQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorRGF0ZToJTW9uIEF1ZyA2IDAyOjE3OjM2IDIwMDcgKzAyMDAKKworICAgIENvZGluZyBzdHlsZSBjbGVhbnVwLiBVcGRhdGUgQ0hBTkdFTE9HLgorCisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKworY29tbWl0IDIyMTgzOGNjN2ViMTc4MzcwZmY2MmFhMDU5MjBhNTgyZTEyYWMzMjIKK0F1dGhvcjogSmFzb24gSmluIDxKYXNvbi5qaW5AZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBKdWwgMTAgMDk6MDM6MjIgMjAwNyArMDgwMAorCisgICAgUmVtb3ZlIHRoZSBiaW9zIGVtdWxhdG9yIGZyb20gTUFJIGJvYXJkLgorCisgICAgVGhlIGJpb3MgZW11bGF0b3IgaW4gdGhlIE1BSSBib2FyZCBjYW4gbm90IHBhc3MgY29tcGlsZQorICAgIGFuZCBoYXZlIGEgbG90IG9mIGNyYXAgaW4gaXQuIHJlbW92ZSBpdCBhbmQgd2lsbCBoYXZlIGEKKyAgICBjbGVhbiBhbmQgc21hbGwgYmlvcyBlbXVsYXRvciBpbiB0aGUgZHJpdmVycyBkaXJlY3RvcnkKKyAgICB3aGljaCBjYW4gYmUgdWVzZWQgZm9yIGV2ZXJ5IGJvYXJkLgorCisgICAgU2lnbmVkLW9mZi1ieTogSmFzb24gSmluIDxKYXNvbi5qaW5AZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDU2MTgzMzI0MDliYjk2ZjQ0NDhkMTcxMjg5OTM2OWZjODBjMGI0ODkKK0F1dGhvcjogSmFzb24gSmluIDxKYXNvbi5qaW5AZnJlZXNjYWxlLmNvbT4KK0RhdGU6CUZyaSBKdWwgMTMgMTI6MTQ6NTkgMjAwNyArMDgwMAorCisgICAgRml4IHNvbWUgY29tcGlsZSBpc3N1ZXMgZm9yIE1BSSBib2FyZC4KKworICAgIFNpZ25lZC1vZmYtYnk6IEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAwZjQ2MGExZWUxNDhiNjQ4ZWUyNDJjMzE1NzY1MDI4N2Q0Mjk2MjYwCitBdXRob3I6IEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CitEYXRlOglGcmkgSnVsIDEzIDEyOjE0OjU4IDIwMDcgKzA4MDAKKworICAgIENvbmZpZ3VyYXRpb25zIGZvciBBVEkgdmlkZW8gY2FyZCBCSU9TIGVtdWxhdG9yCisKKyAgICBUaGlzIHBhdGNoIGFkZCBkZWZpbml0aW9uIG9mIHRoZSBCSU9TIGVtdWxhdG9yIGFuZCB0aGUgQVRJIGZyYW1lYnVmZmVyCisgICAgZHJpdmVyIGZvciBNUEM4NjQxSFBDTiBib2FyZC4KKworICAgIFNpZ25lZC1vZmYtYnk6IEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogWmhhbmcgV2VpIDx3ZWkuemhhbmdAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGVjZTkyZjg1MDUzYjhkZjYxM2VkY2YwNWIyNmE0MTZjYmMzZDYyOWMKK0F1dGhvcjogSmFzb24gSmluIDxKYXNvbi5qaW5AZnJlZXNjYWxlLmNvbT4KK0RhdGU6CUZyaSBKdWwgNiAwODozNDo1NiAyMDA3ICswODAwCisKKyAgICBUaGlzIGlzIGEgQklPUyBlbXVsYXRvciwgcG9ydGluZyBmcm9tIFNjaVRlY2ggZm9yIHUtYm9vdCwgbWFpbmx5IGZvcgorICAgIEFUSSB2aWRlbyBjYXJkIEJJT1MuIGFuZCBjYW4gYmUgdXNlZCBmb3IgeDg2IGNvZGUgZW11bGF0aW9uIGJ5IHNvbWUKKyAgICBtb2RpZmljYXRpb25zLgorCisgICAgU2lnbmVkLW9mZi1ieTogSmFzb24gSmluIDxKYXNvbi5qaW5AZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDUwNzIxODhhY2FiZGUzMTc4ZmFjN2Y1YTU5NzE1MGU2ZTc0ZmQ0MGMKK0F1dGhvcjogSmFzb24gSmluIDxKYXNvbi5qaW5AZnJlZXNjYWxlLmNvbT4KK0RhdGU6CUZyaSBKdWwgNiAwODozMzozMyAyMDA3ICswODAwCisKKyAgICBUaGlzIGlzIGEgZnJhbWVidWZmZXIgZHJpdmVyIGZvciBBVEkgdmlkZW8gY2FyZCwgY2FuIHdvcmsgZm9yIFBDSTkyMDAsCisgICAgWDMwMCwgWDcwMCwgWDgwMCBBVEkgdmlkZW8gY2FyZHMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBaaGFuZyBXZWkgPHdlaS56aGFuZ0BmcmVlc2NhbGUuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA1NzI4YmUzODllNjVmZDQ3ZjM0YjMzYzI1OTYyNzFlYjRkYjc1MWFlCitBdXRob3I6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CitEYXRlOglNb24gQXVnIDYgMDE6MDE6NDkgMjAwNyArMDIwMAorCisgICAgQ29kaW5nIHN0eWxlIGNsZWFudXAuIFVwZGF0ZSBDSEFOR0VMT0cuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorCitjb21taXQgODA5MmZlZjRjMjliMzk1OTU4YmI2NDk2NDdkYTdlMzc3NTczMTUxNworQXV0aG9yOiBNYXJ0aW4gS3JhdXNlIDxNYXJ0aW4uS3JhdXNlQHRxcy5kZT4KK0RhdGU6CVR1ZSBEZWMgMTIgMTQ6MjY6MDEgMjAwNiArMDEwMAorCisgICAgQWRkIGZ1bmN0aW9ucyB0byBsaXN0IG9mIGV4cG9ydGVkIGZ1bmN0aW9ucworCisgICAgQWRkaXRpb25hbGx5IGV4cG9ydCB0aGUgZm9sbG93aW5nIGZ1Y3Rpb25zICh0byBtYWtlIHRyYWJfY29uZmlnIGJ1aWxkIGFnYWluKToKKyAgICAtIHNpbXBsZV9zdHJ0b2woKQorICAgIC0gc3RyY21wKCkKKworICAgIEFsc28gYnVtcCB0aGUgQUJJIHZlcnNpb24gdG8gcmVmbGVjdCB0aGlzIGNoYW5nZQorCisgICAgU2lnbmVkLW9mZi1ieTogTWFydGluIEtyYXVzZSA8bWFydGluLmtyYXVzZUB0cXMuZGU+CisKK2NvbW1pdCA2M2NlYzU4MTRmYWI1ZDJiMWM4Njk4MjMyNzQzMzgwN2E1YWMwMjQ5CitBdXRob3I6IEVkIFN3YXJ0aG91dCA8RWQuU3dhcnRob3V0QGZyZWVzY2FsZS5jb20+CitEYXRlOglUaHUgQXVnIDIgMTQ6MDk6NDkgMjAwNyAtMDUwMAorCisgICAgTWFrZSBNUEM4NjQxJ3MgUENJL1BDSS1FIGRyaXZlciBhIGNvbW1vbiBkcml2ZXIgZm9yIG1hbnkgRlNMIHBhcnRzLgorCisgICAgQWxsIG9mIHRoZSBQQ0kvUENJLUV4cHJlc3MgZHJpdmVyIGFuZCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQKKyAgICB3YXMgaW4gdGhlIE1QQzg2NDFIUENOIHBvcnQgaGFzIG5vdyBiZWVuIG1vdmVkIGludG8gdGhlIGNvbW1vbgorICAgIGRyaXZlcnMvZnNsX3BjaV9pbml0LmMuICBJbiBhIHN1YnNlcXVlbnQgcGF0Y2gsIHRoaXMgd2lsbCBiZQorICAgIHV0aWxpemVkIGJ5IHRoZSA4NXh4IHBvcnRzIGFzIHdlbGwuCisKKyAgICBDb21tb24gUENJLUUgSU1NQVAgcmVnaXN0ZXIgYmxvY2tzIGZvciBGU0wgODV4eC84Nnh4IGFyZSBhZGRlZC4KKworICAgIEFsc28gZW5hYmxlIHRoZSBzZWNvbmQgUENJLUV4cHJlc3MgY29udHJvbGxlciBvbiA4NjQxCisgICAgYnkgZ2V0dGluZyBpdHMgQkFUUyBhbmQgQ0ZHXyBzZXR1cCByaWdodC4KKworICAgIEZpeGVkIGEgdTE2IHZlbmRvciBjb21waWxlciB3YXJuaW5nIGluIEFIQ0kgZHJpdmVyIHRvby4KKworICAgIFNpZ25lZC1vZmYtYnk6IEVkIFN3YXJ0aG91dCA8RWQuU3dhcnRob3V0QGZyZWVzY2FsZS5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogWmhhbmcgV2VpIDx3ZWkuemhhbmdAZnJlZXNjYWxlLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgODZiMTE2YjFiMWUxNjVjYTQ4NDBkYWVmZWQzNmQyZTNiODQ2MDE3MworQXV0aG9yOiBCYXJ0bG9taWVqIFNpZWthIDx0dXJAc2VtaWhhbGYuY29tPgorRGF0ZToJRnJpIEF1ZyAzIDEyOjA4OjE2IDIwMDcgKzAyMDAKKworICAgIGNtMV9xcDEgLT4gY201MjAwOiBzaW5nbGUgVS1Cb290IGltYWdlIGZvciBtb2R1bGVzIGZyb20gdGhlIGNtNTIwMCBmYW1pbHkuCisKKyAgICBBZGQgdGhlIGFiaWxpdHkgZm9yIG1vZHVsZXMgZnJvbSB0aGUgU2NoaW5kbGVyIGNtNTIwMCBmYW1pbHkgdG8gdXNlIGEKKyAgICBzaW5nbGUgVS1Cb290IGltYWdlOgorICAgIC0gcmVuYW1lIGNtMV9xcDEgdG8gY201MjAwCisgICAgLSBhZGQgcnVuLXRpbWUgbW9kdWxlIGRldGVjdGlvbgorICAgIC0gcGFyYW1ldHJpemUgU0RSQU0gY29uZmlndXJhdGlvbiBhY2NvcmRpbmcgdG8gdGhlIG1vZHVsZSB3ZSBhcmUgcnVubmluZyBvbgorCisgICAgRmV3IG1pbm9yLCBib2FyZC1zcGVjaWZpYyBmaXhlcyBpbmNsdWRlZCBpbiB0aGlzIHBhdGNoOgorICAgIC0gYmV0dGVyIE1BQyBhZGRyZXNzIGhhbmRsaW5nCisgICAgLSB1cGRhdGVkIGRlZmF1bHQgZW52aXJvbm1lbnQgKCd1cGRhdGUnIGNvbW1hbmQgdXNlcyAre2ZpbGVzaXplfSBub3cpCisgICAgLSBpbXByb3ZlZCBlcnJvciBtZXNzYWdlcyBpbiB0aGUgYXV0by11cGRhdGUgY29kZQorICAgIC0gYWxsb3cgYm9vdGluZyBVLUJvb3QgZnJvbSBSQU0gKENGR19SQU1CT09UKQorCisgICAgU2lnbmVkLW9mZi1ieTogR3J6ZWdvcnogQmVybmFja2kgPGdqYkBzZW1paGFsZi5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogUGlvdHIgS3J1c3p5bnNraSA8cHBrQHNlbWloYWxmLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBCYXJ0bG9taWVqIFNpZWthIDx0dXJAc2VtaWhhbGYuY29tPgorCitjb21taXQgYzdlNzE3ZWJjMmIwNDRkN2E3MTA2MjU1MmM5ZGMwZjU0ZWE5Yjc3OQorQXV0aG9yOiBBbmR5IEZsZW1pbmcgPGFmbGVtaW5nQGZyZWVzY2FsZS5jb20+CitEYXRlOglGcmkgQXVnIDMgMDQ6MDU6MjUgMjAwNyAtMDUwMAorCisgICAgQWRkIE1hcnZlbGwgMTE0OSBQSFkgc3VwcG9ydCB0byB0aGUgVFNFQworCitjb21taXQgYjFiNTRlMzUyMDI4ZWQzNzBjM2FhOTVkNmZkZWI5ZDY0YzVkMmY4NgorQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorRGF0ZToJVGh1IEF1ZyAyIDIxOjI3OjQ2IDIwMDcgKzAyMDAKKworICAgIENvZGluZyBzdHlsZSBjbGVhbnVwLCB1cGRhdGUgQ0hBTkdFTE9HCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorCitjb21taXQgNjNlMjI3NjRkMmY4NjUzZjY4ODg4YzY2N2ViNjViMzk5NmI1MjY4MAorQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorRGF0ZToJVGh1IEF1ZyAyIDEwOjExOjE4IDIwMDcgKzAyMDAKKworICAgIE1pbm9yIGNsZWFudXAgb2YgPGJvYXJkPl9uYW5kIGJ1aWxkIHJ1bGVzLgorCitjb21taXQgY2RkOTE3YTQzZGE2ZmE3ZmM4ZjU0YTNjYzlmNDIwY2U1ZWNmMzE5NworQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorRGF0ZToJVGh1IEF1ZyAyIDAwOjQ4OjQ1IDIwMDcgKzAyMDAKKworICAgIEZpeCBidWlsZCBlcnJvcnMgYW5kIHdhcm5pbmdzIC8gY29kZSBjbGVhbnVwLgorCisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKworY29tbWl0IDg5OTNlNTRiNmYzOTc5NzM3OTRmM2Q2ZjQ3ZDNiM2MwYzk4ZGQ0ZjYKK0F1dGhvcjogUmFmYWwgSmF3b3Jvd3NraSA8cmFqQHNlbWloYWxmLmNvbT4KK0RhdGU6CUZyaSBKdWwgMjcgMTQ6NDM6NTkgMjAwNyArMDIwMAorCisgICAgW0FEUzUxMjFdIFN1cHBvcnQgZm9yIHRoZSBBRFM1MTIxIGJvYXJkCisKKyAgICBUaGUgZm9sbG93aW5nIE1QQzUxMjFlIHN1YnN5c3RlbXMgYXJlIHN1cHBvcnRlZDoKKworICAgIC0gbG93LWxldmVsIENQVSBpbml0CisgICAgLSBOT1IgQm9vdCBGbGFzaCAoY29tbW9uIENGSSBkcml2ZXIpCisgICAgLSBERFIgU0RSQU0KKyAgICAtIEZFQworICAgIC0gSTJDCisgICAgLSBXYXRjaGRvZworCisgICAgU2lnbmVkLW9mZi1ieTogR3J6ZWdvcnogQmVybmFja2kgPGdqYkBzZW1paGFsZi5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogUmFmYWwgSmF3b3Jvd3NraSA8cmFqQHNlbWloYWxmLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBKYW4gV3JvYmVsIDx3cnJAc2VtaWhhbGYuY29tPgorCitjb21taXQgMTg2M2NmYjdiMTAwYmEwZWUzNDAxNzk5NDU3YTAxZGMwNTg3NDVmOAorQXV0aG9yOiBSYWZhbCBKYXdvcm93c2tpIDxyYWpAc2VtaWhhbGYuY29tPgorRGF0ZToJRnJpIEp1bCAyNyAxNDoyMjowNCAyMDA3ICswMjAwCisKKyAgICBbUFBDXSBSZW1vdmUgdW51c2VkIE1TUl9VU0VSIGRlZmluaXRpb24KKworICAgIFNpZ25lZC1vZmYtYnk6IFJhZmFsIEphd29yb3dza2kgPHJhakBzZW1paGFsZi5jb20+CisKK2NvbW1pdCBjYzMwMjNiOWY5NWQ3YWM5NTlhNzY0NDcxYTY1MDAxMDYyYWVjZjQxCitBdXRob3I6IFJhZmFsIEphd29yb3dza2kgPHJhakBzZW1paGFsZi5jb20+CitEYXRlOglUaHUgSnVsIDE5IDE3OjEyOjI4IDIwMDcgKzAyMDAKKworICAgIEZpeCBicmVha2FnZSBvZiA4eHggYm9hcmRzIGZyb20gcmVjZW50IGNvbW1pdC4KKworICAgIFRoaXMgcGF0Y2ggZml4ZXMgdGhlIG5lZ2F0aXZlIGNvbnNlcXVlbmNlcyBmb3IgOHh4IG9mIHRoZSByZWNlbnQKKyAgICAicHBjNHh4OiBDbGVhbiB1cCA0NDAgZXhjZXB0aW9ucyBoYW5kbGluZyIgY29tbWl0LgorCisgICAgU2lnbmVkLW9mZi1ieTogUmFmYWwgSmF3b3Jvd3NraSA8cmFqQHNlbWloYWxmLmNvbT4KKworY29tbWl0IDNhNmNhYjg0NGNmNzRmNzY2MzlkNzk1ZTBiZTg3MTdlMDJjODZhZjcKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CVNhdCBKdWwgMTQgMjI6NTE6MDIgMjAwNyArMDIwMAorCisgICAgVXBkYXRlIENIQU5HRUxPRworCisgICAgU2lnbmVkLW9mZi1ieTogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKworY29tbWl0IDAxMTU5NTMwNzczMWE3YTY3YTc0NDVkMTA3YzI3OWQwMzFlOGFiOTcKK0F1dGhvcjogSGVpa28gU2Nob2NoZXIgPGhzQHBvbGx1eC5kZW54LmRlPgorRGF0ZToJU2F0IEp1bCAxNCAwMTowNjo1OCAyMDA3ICswMjAwCisKKyAgICBbUENTNDQwRVBdCS0gZml4IGNvbXBpbGUgZXJyb3IsIGlmIEJVSUxEX0RJUiBpcyB1c2VkCisKK2NvbW1pdCBmYWQ2MzQwNzE1NGY0NjI0NmNlODBkNTNhOWM2NjlhNDQzNjJhYzY3CitBdXRob3I6IEhlaWtvIFNjaG9jaGVyIDxoc0Bwb2xsdXguZGVueC5kZT4KK0RhdGU6CUZyaSBKdWwgMTMgMDk6NTQ6MTcgMjAwNyArMDIwMAorCisgICAgbWFrZSBzaG93X2Jvb3RfcHJvZ3Jlc3MgKCkgd2Vhay4KKworICAgIFNpZ25lZC1vZmYtYnk6IEhlaWtvIFNjaG9jaGVyIDxoc0BkZW54LmRlPgorCitjb21taXQgOTA3OTAyNDcyMzkxYjZjYTE4NzZlYzMwMDY4NzU2MmVjYWY0NTliMQorQXV0aG9yOiBIZWlrbyBTY2hvY2hlciA8aHNAcG9sbHV4LmRlbnguZGU+CitEYXRlOglGcmkgSnVsIDEzIDA4OjI2OjA1IDIwMDcgKzAyMDAKKworICAgIFtQQ1M0NDBFUF0JLSBUaGUgRElBRyBMRURzIGFyZSBub3cgYmxpbmtpbmcsIGlmIGFuIGVycm9yIG9jY3VyCisJCS0gZml4IGNvbXBpbGUgZXJyb3IsIGlmIEJVSUxEX0RJUiBpcyB1c2VkCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBIZWlrbyBTY2hvY2hlciA8aHNAZGVueC5kZT4KKworY29tbWl0IDIzOWYwNWVlNGRkNGNmZTBiNTBmMjUxYjUzM2RjZWJlOWU2N2MzNjAKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CVRodSBKdWwgMTIgMDE6NDU6MzQgMjAwNyArMDIwMAorCisgICAgVXBkYXRlIENIQU5HRUxPRywgbWlub3IgY29kaW5nIHN0eWxlIGNsZWFudXAuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorCitjb21taXQgNWE1NmFmM2I1MjJiYTQ3ZmIzM2EzZmVlODRkMjNiZjFlNTQyOTY1NAorQXV0aG9yOiBBbmR5IEZsZW1pbmcgPGFmbGVtaW5nQGZyZWVzY2FsZS5jb20+CitEYXRlOglGcmkgSnVuIDggMTY6NDE6MTggMjAwNyAtMDUwMAorCisgICAgUmVtb3ZlIGVycm9uZW91cyBlcnJhdGEgY29kZSBmcm9tIE1hcnZlbCA4OEUxMTExUyBkcml2ZXIKKworICAgIFRoZSBNYXJ2ZWwgODhFMTExMVMgZHJpdmVyIGZvciB0aGUgVFNFQyB3YXMgY29waWVkIGZyb20gdGhlCisgICAgODhFMTEwMSBkcml2ZXIsIGFuZCBpbmNsdWRlZCBhIGZpeCBmb3IgYW4gZXJyYXR1bSB3aGljaCBkb2VzIG5vdAorICAgIGV4aXN0IG9uIHRoYXQgcGFydC4gIE5vdyBpdCBpcyByZW1vdmVkCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBBbmR5IEZsZW1pbmcgPGFmbGVtaW5nQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA5ODJlZmNmMjNmZDAzNjQ3ZTAxZTJmYmUyOGE3YTM2MjM5MTU2Y2MwCitBdXRob3I6IEFuZHkgRmxlbWluZyA8YWZsZW1pbmdAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBKdW4gNSAxNjozODo0NCAyMDA3IC0wNTAwCisKKyAgICBGcm9tOiBlcmFuIGxpYmVydHkgPGVyYW4ubGliZXJ0eUBnbWFpbC5jb20+CisKKyAgICBhZGRzIHRoZSByZXNldCByZWdpc3RlciB0byA4NXh4IGltbWFwCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBFcmFuIExpYmVydHkgPGVyYW4ubGliZXJ0eUBnbWFpbC5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgZDNlYzBkOTQzYTA0NWJkYjk5ZTE1OWU3YmJjNzc0MzBlMDlmMTFkNworQXV0aG9yOiBBbmR5IEZsZW1pbmcgPGFmbGVtaW5nQGZyZWVzY2FsZS5jb20+CitEYXRlOglUaHUgTWF5IDEwIDE3OjUwOjAxIDIwMDcgLTA1MDAKKworICAgIFBvbGlzaGVkIHRoZSA4NXh4IEFEUyBjb25maWcgZmlsZXMKKworICAgIE1hZGUgdGhlIGJvb3QgY29tbWFuZHMgdXNlIGRldmljZSB0cmVlcyBieSBkZWZhdWx0LgorICAgIEFsc28gbW92ZWQgdGhlIHJhbWRpc2sgdG8gMTAwMDAwMCAoSSB0aGluayB0aGUgcHJldmlvdXMgYWRkcmVzcworICAgIHdhcyBnZXR0aW5nIG92ZXJyaWRkZW4gZHVyaW5nIGJvb3QpLgorCisgICAgU2lnbmVkLW9mZi1ieTogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgYmZiMzdiMzJkMWIwYjAzZjE4MDc3ZGJhNDljYzY2YTZlNzZmYTAzOAorQXV0aG9yOiBFZCBTd2FydGhvdXQgPEVkLlN3YXJ0aG91dEBmcmVlc2NhbGUuY29tPgorRGF0ZToJV2VkIE1heSA5IDExOjAzOjMyIDIwMDcgLTA1MDAKKworICAgIDg1NDRkczogRml4IE1ha2VmaWxlIGFmdGVyIG1vdmluZyBwaXhpcyB0byBib2FyZC9mcmVlc2NhbGUuCisKKyAgICBUaGUgT0JKVFJFRSAhPSBTUkNUUkVFIGJ1aWxkIHNjZW5hcmlvIHdhcyBicm9rZW4uCisgICAgVGhpcyBmaXhlcyBpdC4KKworICAgIFNpZ25lZC1vZmYtYnk6IEVkIFN3YXJ0aG91dCA8RWQuU3dhcnRob3V0QGZyZWVzY2FsZS5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDJhM2NlZTQzYzNiNzFmYTViOGQ5MWRiMTlmMDUwNjc4NjUyOTBmM2UKK0F1dGhvcjogQW5keSBGbGVtaW5nIDxhZmxlbWluZ0BmcmVlc2NhbGUuY29tPgorRGF0ZToJV2VkIE1heSA5IDAwOjU0OjIwIDIwMDcgLTA1MDAKKworICAgIHRzZWM6IEZpeCBQSFkgY29kZSB0byBtYXRjaCBmaXJzdCBkcml2ZXIKKworICAgIEphcnJvbGQgV2VuIG5vdGljZWQgdGhhdCB0aGUgZ2VuZXJpYyBQSFkgY29kZSBhbHdheXMgbWF0Y2hlcworICAgIHVuZGVyIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLiAgQ2hhbmdlIGl0IHNvIHRoZSBmaXJzdCBtYXRjaAorICAgIHdpbnMsIGFuZCAqb25seSogdW5rbm93biBQSFlzIHRyaWdnZXIgdGhlIGdlbmVyaWMgZHJpdmVyCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBBbmR5IEZsZW1pbmcgPGFmbGVtaW5nQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBjY2MwOTFhYWM2MWEzOGNkOTk4ZDU3NWQ5MmY3MjMyZTI1NmQ2MzEyCitBdXRob3I6IEFuZHkgRmxlbWluZyA8YWZsZW1pbmdAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBNYXkgOCAxNzoyNzo0MyAyMDA3IC0wNTAwCisKKyAgICBBZGQgc3VwcG9ydCBmb3IgQ1BNIGRldmljZSB0cmVlIGNvbmZpZ3VyYXRpb24gdG8gODU2MCBBRFMKKworICAgICogQWRkcyBjb2RlIHRvIG1vZGlmeSBDUE0gZnJlcXVlbmNpZXMKKyAgICAqIENsZWFucyB1cCB0aGUgY29uZmlnIGZpbGUgdG8gI2RlZmluZSBUU0VDIGFuZCAoZm9yIG5vdykgI3VuZGVmIEZDQworICAgICogQWRkcyB0aGUgTUlJIGNvbW1hbmQgZm9yIGFsbCA4NTYwIEFEUyBjb25maWd1cmF0aW9ucworICAgICogVXBkYXRlcyBjb25maWcgZmlsZSB0byBwcm92aWRlIGNvbnZlbmllbmNlIGNvbW1hbmRzIGZvciBib290aW5nCisgICAgICB3aXRoIGEgZGV2aWNlIHRyZWUKKworICAgIFNpZ25lZC1vZmYtYnk6IFZpdGFseSBCb3JkdWcgPHZib3JkdWdAcnUubXZpc3RhLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBBbmR5IEZsZW1pbmcgPGFmbGVtaW5nQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA3NTA3ZDU2Y2NhZjdhYWUxYzQ3NDM0MmE5YTU1NDAxNjVjZDdlOWQ5CitBdXRob3I6IEFuZHkgRmxlbWluZyA8YWZsZW1pbmdAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBNYXkgOCAxNzoyMzowMiAyMDA3IC0wNTAwCisKKyAgICBGaXggTWFydmVsbCA4OGUxMTQ1IFBIWSBpbml0IGNvZGUKKworICAgIEZpeCBhIGJ1ZyBpbiB0aGUgTWFydmVsbCA4OGUxMTQ1IFBIWSBpbml0IGNvZGUgaW4gdGhlIFRTRUMgZHJpdmVyCisgICAgd2hlcmUgdGhlIHJlc2V0IHdhcyBiZWluZyBkb25lIGFmdGVyIHRoZSBlcnJhdGEgY29kZSBpbnN0ZWFkIG9mCisgICAgYmVmb3JlLgorCisgICAgU2lnbmVkLW9mZi1ieTogSGFpeWluZyBXYW5nIDxoYWl5aW5nLndhbmdAZnJlZXNjYWxlLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBBbmR5IEZsZW1pbmcgPGFmbGVtaW5nQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA1ZGMyMTBkZWM1YmFjZTk4YTUwYjZiYTkwNTM0Nzg5MDA5MWE5YmIwCitBdXRob3I6IEVkIFN3YXJ0aG91dCA8RWQuU3dhcnRob3V0QGZyZWVzY2FsZS5jb20+CitEYXRlOglXZWQgSnVsIDExIDE0OjUyOjE2IDIwMDcgLTA1MDAKKworICAgIEFkZCBzaW1wbGUgYWdlbnQvZW5kLXBvaW50IGNvbmZpZ3VyYXRpb24gaW4gUENJIEF1dG9Db25maWcgZm9yIFBDSV9DTEFTU19QUk9DRVNTT1JfUE9XRVJQQy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEVkIFN3YXJ0aG91dCA8RWQuU3dhcnRob3V0QGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBlOGI4NWYzYmE0Y2Q4OTMwZTBhMmZlYTIxMDBjODE1ZDY0MjAxNzY1CitBdXRob3I6IEVkIFN3YXJ0aG91dCA8RWQuU3dhcnRob3V0QGZyZWVzY2FsZS5jb20+CitEYXRlOglXZWQgSnVsIDExIDE0OjUyOjA4IDIwMDcgLTA1MDAKKworICAgIHBjaWF1dG8gc2V0dXAgYnJpZGdlCisKKyAgICBUaGUgUDJQIGJyaWRnZSBidXMgbnVtYmVycyBwcm9ncmFtbWVkIGludG8gdGhlIGRldmljZSBhcmUgcmVsYXRpdmUgdG8KKyAgICBob3NlLT5maXJzdF9idXNuby4KKworICAgIFNpZ25lZC1vZmYtYnk6IEVkIFN3YXJ0aG91dCA8RWQuU3dhcnRob3V0QGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA1NzFmNDlmYTcxNzAwNGNhNDI2OGI0ZTI0MDU3ZWZjN2JmOWY5ODdiCitBdXRob3I6IEVkIFN3YXJ0aG91dCA8RWQuU3dhcnRob3V0QGZyZWVzY2FsZS5jb20+CitEYXRlOglXZWQgSnVsIDExIDE0OjUyOjAxIDIwMDcgLTA1MDAKKworICAgIFN1cHBvcnQgUENJZSBleHRlbmRlZCBjb25maWcgcmVnaXN0ZXJzCisKKyAgICBGU0wgUENJZSBibG9jayBoYXMgZXh0ZW5kZWQgY2ZnIHJlZ2lzdGVycyBpbiB0aGUgMTAwIGFuZCA0MDAgcmFuZ2UuCisgICAgRm9yIGV4YW1wbGUsIHRvIHJlYWQgdGhlIExUU1NNIHJlZ2lzdGVyOiBwY2kgZGlzcGxheSA8YnVzbj4uMCA0MDQgMQorCisgICAgU2lnbmVkLW9mZi1ieTogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGJhNWZlYjEyNTgxYmIyOTEyY2UzMDFlNDg2NmI3MWY4NDZlOWZjMDcKK0F1dGhvcjogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVdlZCBKdWwgMTEgMTQ6NTE6NDggMjAwNyAtMDUwMAorCisgICAgTWlub3IgaW1wcm92ZW1lbnRzIHRvIGRyaXZlcnMvcGNpX2F1dG8uYworCisgICAgLSBNYWtlIHBjaWF1dG9fe3ByZSxwb3N0fXNjYW5fc2V0dXBfYnJpZGdlIG5vbi1zdGF0aWMKKyAgICAtIEFkZGVkIHBoeXNpY2FsIGFkZHJlc3MgZGlzcGxheSBpbiBkZWJ1ZyBtZXNzYWdlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEVkIFN3YXJ0aG91dCA8RWQuU3dhcnRob3V0QGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA0MGU4MWFkZGFiN2JiNzRkMjBkZGY2ODFjZTliYWJjODgwYTgyOGVlCitBdXRob3I6IEVkIFN3YXJ0aG91dCA8RWQuU3dhcnRob3V0QGZyZWVzY2FsZS5jb20+CitEYXRlOglXZWQgSnVsIDExIDE0OjUxOjM1IDIwMDcgLTA1MDAKKworICAgIFN0YXJ0IHBjaSBob3NlIHNjYW4gZnJvbSBob3NlLT5jdXJyZW50X2J1c25vLgorCisgICAgRW5zdXJlIGhvc2UtPmN1cnJlbnRfYnVzbm8gaXMgbm90IGxlc3MgdGhhbiBmaXJzdF9idXNuby4gIFRoaXMgZml4ZXMKKyAgICBicm9rZW4gYm9hcmQgY29kZSB3aGljaCBsZWF2ZXMgY3VycmVudF9idXNubz0wIHdoZW4gZmlyc3RfYnVzbm8gaXMKKyAgICBncmVhdGVyIHRoYW4gMCBmb3IgdGhlIGNhc2VzIHdpdGggbXVsdGlwbGUgY29udHJvbGxlcnMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBFZCBTd2FydGhvdXQgPEVkLlN3YXJ0aG91dEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgMzg2NWIxZmI3ODQzYTA4YWQ0OWE2MzE5YTM2NDE1NzUyMjc2ZmY0OAorQXV0aG9yOiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CitEYXRlOglXZWQgSnVsIDExIDEyOjEzOjUzIDIwMDcgKzAyMDAKKworICAgIEZpeCBzb21lIGNvbXBpbGUgcHJvYmxlbXMgaW50cm9kdWNlZCBieSB0aGUgbGF0ZXN0IENGR19DTURfeHh4IGNsZWFudXAKKworICAgIFNpZ25lZC1vZmYtYnk6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KKworY29tbWl0IGZhMWRmMzA4OTI2YTZmNzBlMzUwNGM1NzUxNGVmMjdhYzMxZmQxM2EKK0F1dGhvcjogQmFydGxvbWllaiBTaWVrYSA8dHVyQHNlbWloYWxmLmNvbT4KK0RhdGU6CVdlZCBKdWwgMTEgMjA6MTE6MDcgMjAwNyArMDIwMAorCisgICAgQ00xLlFQMTogU3VwcG9ydCBmb3IgdGhlIFNjaGluZGxlciBDTTEuUVAxIGJvYXJkLgorCisgICAgU2lnbmVkLW9mZi1ieTogUGlvdHIgS3J1c3p5bnNraSA8cHBrQHNlbWloYWxmLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBCYXJ0bG9taWVqIFNpZWthIDx0dXJAc2VtaWhhbGYuY29tPgorCitjb21taXQgOTZlMWQ3NWJlODE5M2NhNzllNDIxNWEzNjhiZjlkN2YyMzYyNDUwZgorQXV0aG9yOiBIZWlrbyBTY2hvY2hlciA8aHNAcG9sbHV4LmRlbnguZGU+CitEYXRlOglXZWQgSnVsIDExIDE4OjM5OjExIDIwMDcgKzAyMDAKKworICAgIFtQQ1M0NDBFUF0JLSBTaG93IG9uIHRoZSBESUFHIExFRHMsIGlmIHRoZSBTSEExIGNoZWNrIGZhaWxlZAorCQktIG5vdyB0aGUgRmxhc2ggU1QgTTI5VzA0MEIgaXMgc3VwcG9ydGVkIChub3QgdGVzdGVkKQorCQktIGZpeCB0aGUgImxlZCIgY29tbWFuZAorCQktIGZpeCBjb21waWxlIGVycm9yLCBpZiBCVUlMRF9ESVIgaXMgdXNlZAorCisgICAgU2lnbmVkLW9mZi1ieTogSGVpa28gU2Nob2NoZXIgPGhzQGRlbnguZGU+CisKK2NvbW1pdCBlOTUxNDc1MWNmYTVjY2U2MWVhNjk5ZmEwZDNlYjM3ODk4YTVlZWI1CitBdXRob3I6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KK0RhdGU6CVN1biBKdWwgOCAxMzo0NDoyNyAyMDA3ICswMjAwCisKKyAgICBGaXggbWFsbG9jIHByb2JsZW0gaW50cm9kdWNlZCB3aXRoIHRoZSByZWxvY2F0aW9uIGZpeHVwIGZvciB0aGUgUFBDIHBsYXRmb3JtCisKKyAgICBUaGUgcmVsb2NhdGlvbiBmaXh1cCBkaWRuJ3QgaGFuZGxlIHRoZSBtYWxsb2MgcG9pbnRlciBpbml0aWFsaXphdGlvbgorICAgIGNvcnJlY3RseS4gVGhpcyBwYXRjaCBmaXhlcyB0aGlzIHByb2JsZW0uIFRlc3RlZCBzdWNjZXNzZnVsbHkgb24gNHh4LgorICAgIFRoZSByZWxvY2F0aW9uIGZpeHVwIHBhdGNoZXMgZm9yIDR4eCB3aWxsIGZvbGxvdyBzb29uLgorCisgICAgU2lnbmVkLW9mZi1ieTogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorCitjb21taXQgYjNhZmYwY2I5ZWNmMjM2ZDdlOGM5Mzc2MWRkMWRhZGY2ODM3YTU4MgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEp1bCAxMCAxMToxOTo1MCAyMDA3IC0wNTAwCisKKyAgICBkaXNrLyBkb2MvIGxpYl8qLyBhbmQgdG9vbHMvOiBSZW1vdmUgbGluZ2VyaW5nIHJlZmVyZW5jZXMgdG8gQ0ZHX0NNRF8qIHN5bWJvbHMuCisKKyAgICBGaXhlZCBzb21lIGJyb2tlbiBpbnN0YW5jZXMgb2YgIiNpZmRlZiBDTURfQ0ZHX0lERSIgdG9vLgorICAgIFRob3NlIGFsd2F5cyBldmFsdWF0ZWQgVFJVRSwgYW5kIHRodXMgd2VyZSBhbHdheXMgY29tcGlsZWQKKyAgICBldmVuIHdoZW4gSURFIHJlYWxseSB3YXNuJ3QgZGVmaW5lZC93YW50ZWQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgZGRiNWQ4NmYwMjE1YmNiNmMyOTM1MTBjNTBlYjA1MGU5Mjg4M2I3YQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEp1bCAxMCAxMToxMzoyMSAyMDA3IC0wNTAwCisKKyAgICBkcml2ZXJzLzogUmVtb3ZlIGxpbmdlcmluZyByZWZlcmVuY2VzIHRvIENGR19DTURfKiBzeW1ib2xzLgorCisgICAgRml4ZWQgc29tZSBicm9rZW4gaW5zdGFuY2VzIG9mICIjaWZkZWYgQ01EX0NGR19JREUiIHRvby4KKyAgICBUaG9zZSBhbHdheXMgZXZhbHVhdGVkIFRSVUUsIGFuZCB0aHVzIHdlcmUgYWx3YXlzIGNvbXBpbGVkCisgICAgZXZlbiB3aGVuIElERSByZWFsbHkgd2Fzbid0IGRlZmluZWQvd2FudGVkLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGY0MGE3ZjNlMzg4OGI0MmE0MzY3NGIwOTllNTQ3MDAyMmM4YzU0NGMKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBKdWwgMTAgMTE6MDc6NTYgMjAwNyAtMDUwMAorCisgICAgZnMvOiBSZW1vdmUgbGluZ2VyaW5nIHJlZmVyZW5jZXMgdG8gQ0ZHX0NNRF8qIHN5bWJvbHMuCisKKyAgICBGaXhlZCBzb21lIGJyb2tlbiBpbnN0YW5jZXMgb2YgIiNpZmRlZiBDTURfQ0ZHX0lERSIgdG9vLgorICAgIFRob3NlIGFsd2F5cyBldmFsdWF0ZWQgVFJVRSwgYW5kIHRodXMgd2VyZSBhbHdheXMgY29tcGlsZWQKKyAgICBldmVuIHdoZW4gSURFIHJlYWxseSB3YXNuJ3QgZGVmaW5lZC93YW50ZWQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNjEwZjJlOWMyOGE5YzEwMWUwOWZhMWI3ODE0M2NmNWYwMGVkMTU5MworQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEp1bCAxMCAxMTowNTowMiAyMDA3IC0wNTAwCisKKyAgICBuZXQvOiBSZW1vdmUgbGluZ2VyaW5nIHJlZmVyZW5jZXMgdG8gQ0ZHX0NNRF8qIHN5bWJvbHMuCisKKyAgICBGaXhlZCBzb21lIGJyb2tlbiBpbnN0YW5jZXMgb2YgIiNpZmRlZiBDTURfQ0ZHX0lERSIgdG9vLgorICAgIFRob3NlIGFsd2F5cyBldmFsdWF0ZWQgVFJVRSwgYW5kIHRodXMgd2VyZSBhbHdheXMgY29tcGlsZWQKKyAgICBldmVuIHdoZW4gSURFIHJlYWxseSB3YXNuJ3QgZGVmaW5lZC93YW50ZWQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgOTAyNTMxNzg4Mzc2MDQ2ZGEyMTJhZmQxNjYxY2ZmYjYyZjNkYWExYworQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEp1bCAxMCAxMTowMjo0NCAyMDA3IC0wNTAwCisKKyAgICBjb21tb24vOiBSZW1vdmUgbGluZ2VyaW5nIHJlZmVyZW5jZXMgdG8gQ0ZHX0NNRF8qIHN5bWJvbHMuCisKKyAgICBGaXhlZCBzb21lIGJyb2tlbiBpbnN0YW5jZXMgb2YgIiNpZmRlZiBDTURfQ0ZHX0lERSIgdG9vLgorICAgIFRob3NlIGFsd2F5cyBldmFsdWF0ZWQgVFJVRSwgYW5kIHRodXMgd2VyZSBhbHdheXMgY29tcGlsZWQKKyAgICBldmVuIHdoZW4gSURFIHJlYWxseSB3YXNuJ3QgZGVmaW5lZC93YW50ZWQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgZDM5YjU3NDE1ODM4YzczZmIwYTM3ZWNhODRkZTNjNjhiYTk5MDU4NgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEp1bCAxMCAxMDo0ODoyMiAyMDA3IC0wNTAwCisKKyAgICBib2FyZC9bai16XSo6IFJlbW92ZSBsaW5nZXJpbmcgcmVmZXJlbmNlcyB0byBDRkdfQ01EXyogc3ltYm9scy4KKworICAgIEZpeGVkIHNvbWUgYnJva2VuIGluc3RhbmNlcyBvZiAiI2lmZGVmIENNRF9DRkdfSURFIiB0b28uCisgICAgVGhvc2UgYWx3YXlzIGV2YWx1YXRlZCBUUlVFLCBhbmQgdGh1cyB3ZXJlIGFsd2F5cyBjb21waWxlZAorICAgIGV2ZW4gd2hlbiBJREUgcmVhbGx5IHdhc24ndCBkZWZpbmVkL3dhbnRlZC4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA3N2EzMTg1NDVkNTdhZWZhODQ0NzUyNDY1Yjk0YzdlMDlhM2YyNmQwCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglUdWUgSnVsIDEwIDEwOjM5OjEwIDIwMDcgLTA1MDAKKworICAgIGJvYXJkL1tBLVphLWldKjogUmVtb3ZlIGxpbmdlcmluZyByZWZlcmVuY2VzIHRvIENGR19DTURfKiBzeW1ib2xzLgorCisgICAgRml4ZWQgc29tZSBicm9rZW4gaW5zdGFuY2VzIG9mICIjaWZkZWYgQ01EX0NGR19JREUiIHRvby4KKyAgICBUaG9zZSBhbHdheXMgZXZhbHVhdGVkIFRSVUUsIGFuZCB0aHVzIHdlcmUgYWx3YXlzIGNvbXBpbGVkCisgICAgZXZlbiB3aGVuIElERSByZWFsbHkgd2Fzbid0IGRlZmluZWQvd2FudGVkLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDA2OGI2MGEwZWI3ZTczYjI0M2NhNTUzOTlmMmE3ZGY3NmUyYzNmM2QKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBKdWwgMTAgMTA6Mjc6MzkgMjAwNyAtMDUwMAorCisgICAgY3B1LyBydGMvIGluY2x1ZGUvOiBSZW1vdmUgbGluZ2VyaW5nIHJlZmVyZW5jZXMgdG8gQ0ZHX0NNRF8qIHN5bWJvbHMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgMDc5YTEzNmMzNTg4ODE0Nzg0NTYxZDZlNDg1Njk3MGVlODJkNmUyYQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEp1bCAxMCAxMDoxMjoxMCAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3MvW3Atel0qICsgbWlzYzogQ2xlYW51cCBCT09UUCBhbmQgbGluZ2VyaW5nIENGR19DTURfKi4KKworICAgIEV4cGxpY2l0bHkgYWRkIGluIGRlZmF1bHQgQ09ORklHX0JPT1RQXyogb3B0aW9ucyB3aGVyZSBjbWRfY29uZmRlZnMuaAorICAgIHVzZWQgdG8gYmUgaW5jbHVkZWQgYnV0IENPTkZJR19CT09UUF9NQVNLIHdhcyBub3QgZGVmaW5lZC4KKworICAgIFJlbW92ZSBsaW5nZXJpbmcgcmVmZXJlbmNlcyB0byBDRkdfQ01EXyogc3ltYm9scy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA3ZjVjMDE1Nzc0MDBjNzRjYzViYWM3NGY0MWRkMGQzYzc5ZGY2MjNjCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglUdWUgSnVsIDEwIDA5OjM4OjAyIDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlncy9bZy1vXSo6IENsZWFudXAgQk9PVFAgYW5kIGxpbmdlcmluZyBDRkdfQ01EXyouCisKKyAgICBFeHBsaWNpdGx5IGFkZCBpbiBkZWZhdWx0IENPTkZJR19CT09UUF8qIG9wdGlvbnMgd2hlcmUgY21kX2NvbmZkZWZzLmgKKyAgICB1c2VkIHRvIGJlIGluY2x1ZGVkIGJ1dCBDT05GSUdfQk9PVFBfTUFTSyB3YXMgbm90IGRlZmluZWQuCisKKyAgICBSZW1vdmUgbGluZ2VyaW5nIHJlZmVyZW5jZXMgdG8gQ0ZHX0NNRF8qIHN5bWJvbHMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgODBmZjRmOTliODRiNjRlZGNhM2ZkMTBkYTM2NWVjMTQ5M2JlMWM5NQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEp1bCAxMCAwOToyOTowMSAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3MvW2EtZV0qOiBDbGVhbnVwIEJPT1RQIGFuZCBsaW5nZXJpbmcgQ0ZHX0NNRF8qLgorCisgICAgRXhwbGljaXRseSBhZGQgaW4gZGVmYXVsdCBDT05GSUdfQk9PVFBfKiBvcHRpb25zIHdoZXJlIGNtZF9jb25mZGVmcy5oCisgICAgdXNlZCB0byBiZSBpbmNsdWRlZCBidXQgQ09ORklHX0JPT1RQX01BU0sgd2FzIG5vdCBkZWZpbmVkLgorCisgICAgUmVtb3ZlIGxpbmdlcmluZyByZWZlcmVuY2VzIHRvIENGR19DTURfKiBzeW1ib2xzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGExYWEwYmI1MDJlMjVmZDU5OGI1ZTBjY2RmYjJjMTc0OTIxZDcxNGEKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBKdWwgMTAgMDk6MjI6MjMgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzL1tQLVpdKjogQ2xlYW51cCBCT09UUCBhbmQgbGluZ2VyaW5nIENGR19DTURfKi4KKworICAgIEV4cGxpY2l0bHkgYWRkIGluIGRlZmF1bHQgQ09ORklHX0JPT1RQXyogb3B0aW9ucyB3aGVyZSBjbWRfY29uZmRlZnMuaAorICAgIHVzZWQgdG8gYmUgaW5jbHVkZWQgYnV0IENPTkZJR19CT09UUF9NQVNLIHdhcyBub3QgZGVmaW5lZC4KKworICAgIFJlbW92ZSBsaW5nZXJpbmcgcmVmZXJlbmNlcyB0byBDRkdfQ01EXyogc3ltYm9scy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA2NTllMmY2NzM2MjMyYTA4YWNjYTg3ODVjMjA2ZTJiNGQ5Y2QwN2Q3CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglUdWUgSnVsIDEwIDA5OjEwOjQ5IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlncy9bSi1PXSo6IENsZWFudXAgQk9PVFAgYW5kIGxpbmdlcmluZyBDRkdfQ01EXyouCisKKyAgICBFeHBsaWNpdGx5IGFkZCBpbiBkZWZhdWx0IENPTkZJR19CT09UUF8qIG9wdGlvbnMgd2hlcmUgY21kX2NvbmZkZWZzLmgKKyAgICB1c2VkIHRvIGJlIGluY2x1ZGVkIGJ1dCBDT05GSUdfQk9PVFBfTUFTSyB3YXMgbm90IGRlZmluZWQuCisKKyAgICBSZW1vdmUgbGluZ2VyaW5nIHJlZmVyZW5jZXMgdG8gQ0ZHX0NNRF8qIHN5bWJvbHMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgMTE3OTk0MzRjNWZmMTVhNjEyNTc3YmIxYWQxZjRlYTFhMDU5NWU0YgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIEp1bCAxMCAwOTowMjo1NyAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3MvW0EtSV0qOiBDbGVhbnVwIEJPT1RQIGFuZCBsaW5nZXJpbmcgQ0ZHX0NNRF8qLgorCisgICAgRXhwbGljaXRseSBhZGQgaW4gZGVmYXVsdCBDT05GSUdfQk9PVFBfKiBvcHRpb25zIHdoZXJlIGNtZF9jb25mZGVmcy5oCisgICAgdXNlZCB0byBiZSBpbmNsdWRlZCBidXQgQ09ORklHX0JPT1RQX01BU0sgd2FzIG5vdCBkZWZpbmVkLgorCisgICAgUmVtb3ZlIGxpbmdlcmluZyByZWZlcmVuY2VzIHRvIENGR19DTURfKiBzeW1ib2xzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDFmZTgwZDc5YzVjNGU1MmQzNDEwYTdhYjRiODUxNWRhMDk1Y2RhYjMKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CU1vbiBKdWwgOSAyMjowODozNCAyMDA3IC0wNTAwCisKKyAgICBGaW5hbGx5IHJldGlyZSBjbWRfY29uZmRlZnMuaCBhbmQgQ09ORklHX0JPT1RQX01BU0shCisKKyAgICBBbGwgb2YgdGhlIGNob2ljZXMgZm9yIENPTkZJR19CT09UUF8gYXJlIG5vdyBkb2N1bWVudGVkIGluCisgICAgdGhlIFJFQURNRSBmaWxlLiAgWW91IG11c3Qgbm93IGluZGl2aWR1YWxseSBzZWxlY3QgZXhhY3RseQorICAgIHRoZSBzZXQgdGhhdCB5b3Ugd2FudCB1c2luZyBhIHNlcmllcyBvZgorCSNkZWZpbmUgQ09ORklHX0JPT1RQXzx4PgorICAgIHN0YXRlbWVudHMgaW4gdGhlIGJvYXJkIHBvcnQgY29uZmlnIGZpbGVzIG5vdy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBkM2I4YzFhNzQzZGNkMzE2MjVjOTllNmE0NDU5MGYyMDdlYjAwMDI4CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVsIDkgMjE6NTc6MzEgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzL1ttLXpdKjogRGlyZWN0bHkgdXNlIENPTkZJR19CT09UUF8qIHN5bWJvbHMgcmF0aGVyIHRoYW4gQ09ORklHX0JPT1RQX01BU0suCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgMmZkOTBjZTU3NWIwMmQxODljYmY0NDNjODUzMDliY2QwMDFhYTM5MworQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDIxOjQ4OjI2IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlncy9bYS1tXSo6IERpcmVjdGx5IHVzZSBDT05GSUdfQk9PVFBfKiBzeW1ib2xzIHJhdGhlciB0aGFuIENPTkZJR19CT09UUF9NQVNLLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDM3ZDRiYjcwNTg2NjU5ZGVkZWYxNjU4Y2UxYmVkMDcxYmUwOThhZWMKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CU1vbiBKdWwgOSAyMTozODowMiAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3MvW1QtWl0qOiBEaXJlY3RseSB1c2UgQ09ORklHX0JPT1RQXyogc3ltYm9scyByYXRoZXIgdGhhbiBDT05GSUdfQk9PVFBfTUFTSy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAxODIyNWU4ZGQxOTUwYmQ2ZGJmMzUwMTFlNDM2ZGI3ZjQ3NGMxODdkCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVsIDkgMjE6MzE6MjQgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzL1tQLVNdKjogRGlyZWN0bHkgdXNlIENPTkZJR19CT09UUF8qIHN5bWJvbHMgcmF0aGVyIHRoYW4gQ09ORklHX0JPT1RQX01BU0suCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgN2JlMDQ0ZTRlYTY0NGIwZWYxYzQ4NmRhZGMxYTRjMjY2NWI0Mzc0ZAorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDIxOjI0OjE5IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlncy9bSC1OXSo6IERpcmVjdGx5IHVzZSBDT05GSUdfQk9PVFBfKiBzeW1ib2xzIHJhdGhlciB0aGFuIENPTkZJR19CT09UUF9NQVNLLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDVkMmViZTFiM2VmMDA1NWM2NjFiYjFhMGQyNTJiZjI1MjM4MDA2OWYKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CU1vbiBKdWwgOSAyMToxNjo1MyAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3MvW0EtR10qOiBEaXJlY3RseSB1c2UgQ09ORklHX0JPT1RQXyogc3ltYm9scyByYXRoZXIgdGhhbiBDT05GSUdfQk9PVFBfTUFTSy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBmNTVmN2Y4ZDgzZjM2MDIxYWIxZjBlM2Q3MzhmNWQ4YzgwODNhN2UzCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVsIDkgMTk6MTI6MzAgMjAwNyAtMDUwMAorCisgICAgUmV0aXJlIENPTkZJR19DT01NQU5EUyBmaW5hbGx5LgorICAgIFN0cmlwIG9sZCBDRkdfQ01EXyogc3ltYm9scyBvdXQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgYjU1MDFmN2Q3MjBmZWQ5OWFiMGI0MmM4M2Y1ZGVhNTI4NjhjZTAwNworQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDE5OjEwOjAzIDIwMDcgLTA1MDAKKworICAgIFVwZGF0ZSBSRUFETUUuKiB0byByZWZlcmVuY2UgbmV3IENPTkZJR19DTURfKiBuYW1lcyBub3cuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNDQzMTI4M2M3ZTZkNTRhZTE4MGQ0NjZlNTFiZjJkOTc0NzFhMGFkOQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDE5OjA2OjAwIDIwMDcgLTA1MDAKKworICAgIGNwdS9tKjogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZXMgdG8gQ09ORklHX0NPTU1BTkRTCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgM2ExZWQxZTFmOTIyYzQxOWJiNzFmN2RmNDk0OWQ3ODNhZGUzNjlmYQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDE4OjU3OjIyIDIwMDcgLTA1MDAKKworICAgIGNwdS9bN2EtbG4tel0qOiBSZW1vdmUgb2Jzb2xldGUgcmVmZXJlbmNlcyB0byBDT05GSUdfQ09NTUFORFMKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBhYjNhYmNiYWJkODQwOTI4ZmIxZWI1MTIyMTE4Y2E0NjZiNWU1MDEzCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVsIDkgMTg6NDU6MTYgMjAwNyAtMDUwMAorCisgICAgYm9hcmQvW3Etel0qOiBSZW1vdmUgb2Jzb2xldGUgcmVmZXJlbmNlcyB0byBDT05GSUdfQ09NTUFORFMKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAzZmUwMDEwOWE1ZjEyZGU1NWI2ZTI1YjFmOThkZmMyNGJjOTA5MGM5CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVsIDkgMTg6Mzg6MzkgMjAwNyAtMDUwMAorCisgICAgYm9hcmQvW20tcF0qOiBSZW1vdmUgb2Jzb2xldGUgcmVmZXJlbmNlcyB0byBDT05GSUdfQ09NTUFORFMKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBjNTA4YTRjZWZkOGE5NTNmYzY0OTU3NjUwNTA2YTAzNWU2ZTNkOWQxCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVsIDkgMTg6MzE6MjggMjAwNyAtMDUwMAorCisgICAgYm9hcmQvW2YtbF0qOiBSZW1vdmUgb2Jzb2xldGUgcmVmZXJlbmNlcyB0byBDT05GSUdfQ09NTUFORFMKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBiOTMwNzI2MmY4YTlmM2I1YzllMTVhNjA2N2VhZGMxNzQwNzE0NmY2CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVsIDkgMTg6MjQ6NTUgMjAwNyAtMDUwMAorCisgICAgYm9hcmQvW2QtZV0qOiBSZW1vdmUgb2Jzb2xldGUgcmVmZXJlbmNlcyB0byBDT05GSUdfQ09NTUFORFMKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBmY2VjMmViOTNlMTI2NDAwMDA5NzI5MzI4ZTc5N2YxMmJjOTRmMWZkCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVsIDkgMTg6MTk6MDkgMjAwNyAtMDUwMAorCisgICAgYm9hcmQvW0EtWmEtY10qOiBSZW1vdmUgb2Jzb2xldGUgcmVmZXJlbmNlcyB0byBDT05GSUdfQ09NTUFORFMKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBhNTkzODE0ZjJiZTBjOWNkYzMxMzNjZDU1MGIxNjdiOGE5ODgzMjhmCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVsIDkgMTg6MTA6NTAgMjAwNyAtMDUwMAorCisgICAgcnRjLzogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZXMgdG8gQ09ORklHX0NPTU1BTkRTCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNjczNTA1NjhmOWQ0NmU2NmMyMTgyOWYzNTEzYjNkYjBjYWViOTQ4YgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDE4OjA1OjM4IDIwMDcgLTA1MDAKKworICAgIGxpYl97YXJtLGF2cjMyLGJsYWNrZmluLGdlbmVyaWMsaTM4Nn0vOiBSZW1vdmUgb2Jzb2xldGUgcmVmZXJlbmNlcyB0byBDT05GSUdfQ09NTUFORFMKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA3ZGVmNmIzNGY5MTBmMDhkN2VmMGExNDY0NmRhMDY3NzE5MjM3Y2EyCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVsIDkgMTg6MDI6MTEgMjAwNyAtMDUwMAorCisgICAgbGliX3ttNjhrLG1pY3JvYmxhemUsbWlwcyxwcGN9LzogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZXMgdG8gQ09ORklHX0NPTU1BTkRTCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgZGQ2MGQxMjIzYjk5YTg4YTcyMTZmM2UwNDFmZTQwNjM0YWQ0YzJiYgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDE3OjU2OjUwIDIwMDcgLTA1MDAKKworICAgIGZzLzogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZXMgdG8gQ09ORklHX0NPTU1BTkRTCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgYzkxODk4YmJjNTA1YWZmM2UxMmE4MDdhZjg4ZTc2ZGExOGVmYjdlZQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDE3OjQ2OjA5IDIwMDcgLTA1MDAKKworICAgIHRvb2xzLzogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZXMgdG8gQ09ORklHX0NPTU1BTkRTCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNjQzZDFhYjIzOTYwOTUwYjUyZTBhMjgwM2MyZDNlYTRjNTU4ZmEwMQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDE3OjQ1OjE0IDIwMDcgLTA1MDAKKworICAgIG5ldC86IFJlbW92ZSBvYnNvbGV0ZSByZWZlcmVuY2VzIHRvIENPTkZJR19DT01NQU5EUworCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGNiNTFjMGJmODhmOTVhMWJjYTY4MzI0YjAxMjZmOGVlZDhiNDMyNzMKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CU1vbiBKdWwgOSAxNzozOTo0MiAyMDA3IC0wNTAwCisKKyAgICBkcml2ZXJzL1tuLXpdKjogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZXMgdG8gQ09ORklHX0NPTU1BTkRTCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgMDdkMzhhMTdlOTY0YWVjNGM3ODI3ZjBlZTlhNTgzYmM4Y2MxYWQ2YgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1bCA5IDE3OjMwOjAxIDIwMDcgLTA1MDAKKworICAgIGRyaXZlcnMvW2EtbV0qOiBSZW1vdmUgb2Jzb2xldGUgcmVmZXJlbmNlcyB0byBDT05GSUdfQ09NTUFORFMKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBjZGU1YzY0ZDE3Y2Y0ODM0YWE3YjVjMzczZjI4OGJjN2RhZDI3YjI5CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglNb24gSnVsIDkgMTc6MjI6MzcgMjAwNyAtMDUwMAorCisgICAgZGlzay86IFJlbW92ZSBvYnNvbGV0ZSByZWZlcmVuY2VzIHRvIENPTkZJR19DT01NQU5EUworCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDYzOTIyMWM3NmM4ODIxNWJkNTVhZjgzYWQxNzRmYzMwZDE5NDBmOGYKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CU1vbiBKdWwgOSAxNzoxNTo0OSAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlLzogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZXMgdG8gQ09ORklHX0NPTU1BTkRTCisgICAgTW9zdGx5IHJlbW92ZWQgZnJvbSBjb21tZW50cyBoZXJlLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDRlZjIxOGY2ZmRmOGQ3NDdmNDU4OWRhNTI1MmIwMDRlN2QyYzI4NzYKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CVR1ZSBKdWwgMTAgMDA6MDE6MjggMjAwNyArMDIwMAorCisgICAgQ29kaW5nIHN0eWxlIGNsZWFudXA7IHVwZGF0ZSBDSEFOR0VMT0cuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorCitjb21taXQgYzM1MTdmOTE5ZDBmNjE2NTBjZjMwMjdmZDRmYWYwZjYzMTE0MmY2YworQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJU3VuIEp1bCA4IDE4OjEwOjA4IDIwMDcgLTA1MDAKKworICAgIGNvbW1vbi8qIG5vbi1jbWQqOiBSZW1vdmUgb2Jzb2xldGUgcmVmZXJlbmNlcyB0byBDT05GSUdfQ09NTUFORFMKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBmZDliY2FhMzViZTY0ZmU0MWE0MjIzZmRiNmVjZGJhZDUyNDcwYjM5CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglTdW4gSnVsIDggMTg6MDU6MzkgMjAwNyAtMDUwMAorCisgICAgY29tbW9uL2NtZF9bcC14XSo6IFJlbW92ZSBvYnNvbGV0ZSByZWZlcmVuY2VzIHRvIENPTkZJR19DT01NQU5EUy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBjNzZmZTQ3NDI1YWZjN2Q1ZDY3MGZmMDUzOTgyM2M4NWQ2NWQ5YzQyCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglTdW4gSnVsIDggMTg6MDI6MjMgMjAwNyAtMDUwMAorCisgICAgY29tbW9uL2NtZF9baS1uXSo6IFJlbW92ZSBvYnNvbGV0ZSByZWZlcmVuY2VzIHRvIENPTkZJR19DT01NQU5EUy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBiYWEyNmRiNDExMzY3OWI4MDk3MGZmNDQ3ZDkxY2MxMDIxNzc0MmE2CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglTdW4gSnVsIDggMTc6NTE6MzkgMjAwNyAtMDUwMAorCisgICAgY29tbW9uL2NtZF9bYWZdKjogUmVtb3ZlIG9ic29sZXRlIHJlZmVyZW5jZXMgdG8gQ09ORklHX0NPTU1BTkRTLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGFmMDc1ZWU5NmU1MmRkYTdiNmJjYTZjOTM3NTg4YWVhYWVjNWYyY2QKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVN1biBKdWwgOCAxNzowMjowMSAyMDA3IC0wNTAwCisKKyAgICBDbGVhciB1cCBjb25mdXNpb24gb3ZlciB0aGUgQ01EX1BPU1QgYW5kIFBPU1RfRElBRyBtZXNzLgorCisgICAgRm9yIHNvbWUgcmVhc29uLCBDT05GSUdfUE9TVCBwZXJtZWF0ZWQgYXMgQ09ORklHX0NNRF9QT1NUX0RJQUcKKyAgICB3aGVuIGl0IHJlYWxseSBtZWFucyBqdXN0IENPTkZJR19DTURfRElBRy4JVGhlcmUgaXMgbm8gQ01EX1BPU1QuCisgICAgQ2xlYXIgdGhpcyBtZXNzIHVwIHNvbWUuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgYjM2MzE0ODcxMDVhNTdhYjdjYmFkZmMyNmVmYmFmOTY3NjI3NTAxOAorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJU3VuIEp1bCA4IDE1OjQ1OjA4IDIwMDcgLTA1MDAKKworICAgIFJlbW92ZSByZWZlcmVuY2VzIHRvIHRoZSBvbGQgY21kX2NvbmZkZWZzLmggaW5jbHVkZSBmaWxlLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGEyMmQ0ZGE5NWUyMDA0OWI0ZGFhMWMyYTAyMmY2MWU4YTcyZjJmYjYKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVN1biBKdWwgOCAxNTo0Mjo1OSAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IENhdGNoIHNvbWUgQ09ORklHX0NNRF8qIGNvbnZlcnNpb24gc3RyYWdnbGVycy4KKworICAgIFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIGx3bW9uNS5oIGJvYXJkIGNvbmZpZyBmaWxlLgorICAgIEZpeCBDT05GSUdfQ01EXyogdHlwbyBicmFpbmRhbWFnZSBpbiBvbWFwMTUxMGlubi5oCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgYTU1NjI5MDE2NjFiZDQyOGY3ZTVmZWIzMzNmNzk2MzcyY2I4MTAxOQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJU3VuIEp1bCA4IDE1OjMxOjU3IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBbVFVWV1pZWl0qIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBmZTdmNzgyZDViOGM2NGEwMTk1YzY4YzMxYTBhMTFkNGY2NDEzNTVlCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglTdW4gSnVsIDggMTU6MDI6NDQgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiB2YXJpb3VzIFMqIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBlOWEwZjhmMTVjMTFmMzM3OTY3YWEwNjAwYWQ2ZThhZjMzMDM3ZjUwCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglTdW4gSnVsIDggMTU6MTI6NDAgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiB2YXJpb3VzIFIqIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAxMmFhOWZkMjNkNzI0YmQ2YWI4OGUxYmFhMGRiMzUxMzNhMjczMDNmCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglTdW4gSnVsIDggMTQ6NTU6MDcgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiB2YXJpb3VzIFEqIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBhY2YwMjY5Nzc5NDIyZjNlMTQ3ZDJkZGZiNDk5YzlmNmZmMTBhZDVlCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglTdW4gSnVsIDggMTQ6NDk6NDQgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiB2YXJpb3VzIFAqIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBlMThhMTA2MWE4NjMwY2I2Nzk5NWZkZjk5YWZkM2ZiNTBkMWIxODdkCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglTdW4gSnVsIDggMTQ6MjE6NDMgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiB2YXJpb3VzIFtOT10qIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA4MzUzZTEzOWJmYWQ5MDU5YzU0ZjViMjQyMWYxYTMwOTBlMTVhMmUyCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglTdW4gSnVsIDggMTQ6MTQ6MTcgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiB2YXJpb3VzIE0qIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAzNDhmMjU4ZjI0MjUzNDMzZTRhMjMwMmEwYmJjZWI2NzQwYTY3MjQ2CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglTdW4gSnVsIDggMTM6NDY6MTggMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiB2YXJpb3VzIFtJSktMXSogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDZjNGY0ZGE5YmZjOWY5NDAzZjU0ZmNlNjc4ZWQwMzY0YjdjODZhNmEKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVN1biBKdWwgOCAxMDowOTozNSAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgSCogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDYwYTA4NzZiNTEwNmIzNDIyMGU0NTljMjA4YmJmNjQ4MDczMzA2YzAKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVNhdCBKdWwgNyAyMTowNDoyNiAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgRiogYW5kIEcqIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBkY2FhNzE1NjI4MjZhMjQ2NmU4OTRjODY4ZDEzMjUwOWRjZGE4NDQ0CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglTYXQgSnVsIDcgMjA6NTY6MDUgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiB2YXJpb3VzIEUqIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAzYzMyMjdmM2M3Mzc1MDIzMTFiMjViNzIwODQ1NzM5MDFjYmJmMTdkCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglTYXQgSnVsIDcgMjA6NDA6NDMgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiB2YXJpb3VzIEQqIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA0OWNmN2U4ZWU3ZWY5NDNmZGZlODY2Y2UyODQxMGIwYmZiZjZhMjZjCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglUaHUgSnVsIDUgMTk6NTI6MzUgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiB2YXJpb3VzIEMqIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBkZThiMmE2ZTMzMjk4ZGNkYjEwYmRkYTQ4ZGIyNWU1M2MzMDg5ZWJhCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglUaHUgSnVsIDUgMTk6MzI6MDcgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiB2YXJpb3VzIEIqIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA0OThmZjlhMjI4NDg1YmQ0YjlmMjNkMDY2YmFkYTI2OGY5YWRkMWRkCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CitEYXRlOglUaHUgSnVsIDUgMTk6MTM6NTIgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiB2YXJpb3VzIEEqIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpbmNlIEFEUzg2MC5oIGluY2x1ZGVzICJib2FyZC9mYWRzL2ZhZHMuaCIgd2l0aCByYW1pZmljYXRpb25zCisgICAgb24gdGhlIENPTkZJR19DT01NQU5EIHRyZWF0bWVudCwgaXQgdG9vIGhhcyB0byBiZSBhZGp1c3RlZCB0bworICAgIGV4Y2x1ZGUgYWxyZWFkeSBjb25maWd1cmVkIGNvbW1hbmRzIGluIHRoaXMgc2FtZSBjb21taXQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNmIwYTE3NGExZTZmNTVlMWY1YTFmYmIyMjNjZGFkNzY0NWE0NjQ2ZQorQXV0aG9yOiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CitEYXRlOglGcmkgSnVsIDYgMDk6NDU6NDcgMjAwNyArMDIwMAorCisgICAgRml4IHByb2JsZW0gd2l0aCBnZXQvc2V0ZGNyIGNvbW1hbmRzIGludHJvZHVjZWQgYnkgY2ZnIHBhdGNoZXMKKworICAgIFNpZ25lZC1vZmYtYnk6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KKworY29tbWl0IGYxMTUyZjhjMjhkYjRhMjIwODdjMjFjNjE4YTNmN2JhYTQ4ZTlhNGYKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CUZyaSBKdWwgNiAwMjo1MDoxOSAyMDA3ICswMjAwCisKKyAgICBDb2RlIGNsZWFudXAgYW5kIGRlZmF1bHQgY29uZmlnIHVwZGF0ZSBmb3IgU1RDIEdQMyBTU0EgYm9hcmQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorCitjb21taXQgZTRkYmUxYjIxNWY1YzZjNDYyZTc2OTA5ZDI0MGJkOTY0NzJiODRkZQorQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorRGF0ZToJVGh1IEp1bCA1IDE3OjU2OjI3IDIwMDcgKzAyMDAKKworICAgIEZpeGluZyBzb21lIHR5cG9zIGV0Yy4gaW50cm9kdWNlZCBtYWlubHkgYnkgY2ZnIHBhdGNoZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorCitjb21taXQgYjZiNDY4NDU0NjgwOWY4OWM4YmFjNzI4NjNjYTQ5YjVmZDhhYzBjZAorQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorRGF0ZToJVGh1IEp1bCA1IDExOjEyOjE2IDIwMDcgKzAyMDAKKworICAgIE1pbm9yIGNvZGluZyBzdHlsZSBjbGVhbnVwLiBVcGRhdGUgQ0hBTkdFTE9HLgorCitjb21taXQgZGNhM2IzZDZkNjM5NmI2N2U1ZTg0YWY1MzQ1MjE2NDkyM2M3MzQ0MworQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJV2VkIEp1bCA0IDIyOjMzOjQ2IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBbdi16XSogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDZjMThlYjk4MDRiNTI1ZjNlNGYzYmIzZDAxNGRkNjlhMjAwZDlmYTcKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMzozOCAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgdCogYW5kIHUqIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA0NmRhMWU5NmI3ZGIxNGY0ZmNkMmM5MjU0NGU3YzA4NjIwMjRiYzc2CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglXZWQgSnVsIDQgMjI6MzM6MzAgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiB2YXJpb3VzIHMqIG5hbWVkIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA5MGNjM2ViNmQyYmU4NTZkOWRkZDgxNDM2ZGU5Y2YzNDNiYzZiNWM4CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglXZWQgSnVsIDQgMjI6MzM6MjMgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiB2YXJpb3VzIHEqIGFuZCByKiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgMjZhMzQ1NjBkNTZhOWRmNWJjMmFlMjM1MjVkOTIyOTczNjEzNDc1NworQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJV2VkIEp1bCA0IDIyOjMzOjE3IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBwKiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgYTVjYjIzMDkyYTdkMzE0OTBhMzNkNGVjODcxNDY4YjYzYmFiZmEzYworQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJV2VkIEp1bCA0IDIyOjMzOjEzIDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBvKiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgOTI5YTJiZmQxNDI3MzcwMDNhOGZjMzJlMWI4NmUxZjJjMTg1MDI1NworQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJV2VkIEp1bCA0IDIyOjMzOjA3IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBuKiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNWRjMTFhNTExOTYwZDQ5MGY3ZjAxZmZkNzQ2ZWRmZTYyNzdmOTliMAorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJV2VkIEp1bCA0IDIyOjMzOjAxIDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBtKiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgOWJiYjFjMDgyMGMxZmJkMzgxMWFiNmVlNGJhMGY2YzZmNzZiMjdlNAorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJV2VkIEp1bCA0IDIyOjMyOjU3IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBsKiBuYW1lZCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgYmMyMzRjMTI5ZmEwNGZiOWZhMzM1MzA5MzBlNWNiYzYwODRjZDQ3YQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJV2VkIEp1bCA0IDIyOjMyOjUxIDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyBqKiBhbmQgayogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDFkMmM2YmM0OTE5NjlmOGQ4ZmIzNGM4ZTMwZThiZWE3YTJhZjljMzEKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMjozMiAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgaSogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDQ4ZDVkMTAyYTJmMmU2MTljOTIwNTBiOWFlZGJiNjk2ODkxODViYzAKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMjoyNSAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgaCogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDcyZWIwZWZhZWQ3MDQ4YWZjYzYxZmM2ZjAwODVjNDkzOTRiNWRjMzYKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMjoxOSAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgZyogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDFiZWMzZDMwMDJkM2JiYmFlNmYyNDY4YTBmNzM3NmRiMTEyMGQzM2UKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMjoxMCAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgZSogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGFiOTk5YmExYjMxZWJlNzhkZDE2Mzc0Mzk0YTU1ZDdjNmU1YWE2ZTQKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMjowMyAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgZCogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDM3ZTRmMjRiODdmYTI1NWFlNDU2ZDE5M2I3Y2QyM2MxOGRkMWQ1NmIKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMTo1NiAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgYyogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGJhMjM1MWY5ZDFlODQxYmQwMGVhNmRhZDFlM2MxNmQwMjU5YWQyNjQKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMTo0OSAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgYiogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDBiMzYxYzkxNjYxN2FmZjc5ZTY0N2I0MGYwZTQzMzYxZTBiYmFjY2YKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMTo0MiAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHZhcmlvdXMgYSogbmFtZWQgYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGI3MzBjZGE4MmUzNjJkZjZhMjJmNGM1OWMwYTliOTdlODg1YjEwMTQKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMTozNSAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIG1wYzV4eCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgZDc5NGNmZWZlYWQ1ZmMxNzdjZjRmNDExNjRlODAzODJlOWM5NDg0YQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJV2VkIEp1bCA0IDIyOjMxOjE1IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gdmFyaW91cyA1MjAwIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBlZjBkZjUyYWI0OWVlYTRhMzBjMTUwODdmZDI3ZDU0YzFkOTQ2ZjJjCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglXZWQgSnVsIDQgMjI6MzE6MDcgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiBTVHggYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDg2NmUzMDg5YmZjODI2YmI0ZGM3NDYzN2Y4YWFkODdhM2JhYjc5ZmMKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMDo1OCAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIHNiYyogYm9hcmQgY29uZmlnIGZpbGVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDI2OTQ2OTBlMjg1YWNhYTM0OTIyZjU1ZjRiNWFlMDMwZGE2MGM1NWEKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdWwgNCAyMjozMDo1MCAyMDA3IC0wNTAwCisKKyAgICBpbmNsdWRlL2NvbmZpZ3M6IFVzZSBuZXcgQ09ORklHX0NNRF8qIGluIFRRTSBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgMWNjNGM0NTgzMjk3NjViNThlNTg0YTE5ODIxZTc5NmIzYzEwZTk3NgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJV2VkIEp1bCA0IDIyOjMwOjI4IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gODJ4eCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgOGVhNTQ5OWFmZGFiYTBhY2Y2MDkyM2RkOTkwMDFjMzk5ZDRhN2M4ZQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJV2VkIEp1bCA0IDIyOjMwOjA2IDIwMDcgLTA1MDAKKworICAgIGluY2x1ZGUvY29uZmlnczogVXNlIG5ldyBDT05GSUdfQ01EXyogaW4gODN4eCBib2FyZCBjb25maWcgZmlsZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgYjQ0ODk2MjE1YTA5YzYwZmE0MGNhZTkwNmY3ZWQyMDdiYmMyYzQ5MgorQXV0aG9yOiBTZXJnZWkgUG9zZWxlbm92IDxzcG9zZWxlbm92QGVtY3JhZnQuY29tPgorRGF0ZToJVGh1IEp1bCA1IDA4OjE3OjM3IDIwMDcgKzAyMDAKKworICAgIE1lcmdlZCBQT1NUIGZyYW1ld29yayB3aXRoIHRoZSBjdXJyZW50IFRPVC4KKworICAgIFNpZ25lZC1vZmYtYnk6IFNlcmdlaSBQb3NlbGVub3YgPHNwb3NlbGVub3ZAZW1jcmFmdC5jb20+CisKK2NvbW1pdCBiMjQ2MjlmYTM3NzIxNGQ2M2JiNDBkMTM2MGUzNTRiNmQzZTRhZjU2CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglXZWQgSnVuIDEzIDEzOjIzOjE1IDIwMDcgLTA1MDAKKworICAgIG1wYzg2eHg6IFJlbW92ZSBvbGQgQ0ZHX0NNRF8qIHJlZmVyZW5jZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNDYxNzVkOTc2NGRhMTI5YmI0ZmQzNDFjZDI1NTRkYzdkNTVmNWIyYQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJV2VkIEp1biAxMyAxMzoyMjo1NCAyMDA3IC0wNTAwCisKKyAgICBBZGQgTVBDODU2OE1EUyB0byBNQUtFQUxMIDg1eHggdGFyZ2V0LgorCisgICAgSXQgd2FzIG1pc3NpbmcgZnJvbSB0aGUgb3JpZ2luYWwgcG9ydCBzdWJtaXNzaW9uLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDI4MzVlNTE4Yzk2OWU1MTI0YmExMTc0ZWVmM2U4Mzc1ZTEyZmE3ZDUKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CVdlZCBKdW4gMTMgMTM6MjI6MDggMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS9jb25maWdzOiBVc2UgbmV3IENPTkZJR19DTURfKiBpbiA4NXh4IGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA1NmIzMDRhYzIwOTE2ODk1MDYwODhhOWFlNjdmNjNmZDYzMDBjZjE2CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglXZWQgSnVuIDEzIDEzOjIxOjM3IDIwMDcgLTA1MDAKKworICAgIEZpeCAjaWYgdHlwbyBpbiBDT05GSUdfQ01EXyogY2hhbmdlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBmNzgwYjgzMzE2ZDlhZjFmNjFkNzFjYzg4YjE5MTdiMzg3YjliOTk1CitBdXRob3I6IE5pa2xhdXMgR2lnZXIgPG5pa2xhdXNnaWdlckBnbXguY2g+CitEYXRlOglXZWQgSnVuIDI3IDE4OjExOjM4IDIwMDcgKzAyMDAKKworICAgIHJlc3VibWl0OiBwcGM0eHg6IFJlbW92ZSBzZXF1b2lhL3NlcXVpb2EuaC4gQ2xlYW51cCBwcGM0NDAuaCBmb3IgUFBDNDQwRVBYCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBOaWtsYXVzIEdpZ2VyIDxuaWtsYXVzLmdpZ2VyQG5lc3RhbC5jb20+CisKK2NvbW1pdCAwNGU2YzM4Yjc2NmVhYTJmMzI4NzU2MTU2M2M5ZTIxNWUwYzNhMGQ0CitBdXRob3I6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KK0RhdGU6CVdlZCBKdWwgNCAxMDowNjozMCAyMDA3ICswMjAwCisKKyAgICBwcGM0eHg6IFVwZGF0ZSBsd21vbjUgYm9hcmQKKworICAgIC0gQWRkIG9wdGlvbmFsIEVDQyBnZW5lcmF0aW9uIHJvdXRpbmUgdG8gcHJlc2VydmUgZXhpc3RpbmcKKyAgICAgIFJBTSB2YWx1ZXMuIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgTGludXggbG9nLWJ1ZmZlciBzdXBwb3J0CisgICAgLSBBZGQgb3B0aW9uYWwgRERSMiBzZXR1cCB3aXRoIENMPTQKKyAgICAtIEdQSU81MCBub3QgdXNlZCBhbnltb3JlCisgICAgLSBMaW1lIHJlZ2lzdGVyIHNldHVwIGFkZGVkCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CisKK2NvbW1pdCA2ODEwYTM0Njc3ZGJjNDQ2MzM0ZjVlNDUxZjE2ODI0MjZkZDMzYjQ5CitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDoxNzoyOCAyMDA3IC0wNjAwCisKKyAgICBGaXggTWFrZWZpbGUgdG8gdXNlICQoTUtDT05GSUcpIG1hY3JvIGZvciBhbGwgYm9hcmQgcG9ydHMKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IDkwYjFiMmQ2OWI5Mzk2ZmYyZjAxMTY1ZWJjMTZjOWE1OTRlYjU5MjYKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjE3OjI4IDIwMDcgLTA2MDAKKworICAgIEZpeCBNYWtlZmlsZSB0byB1c2UgJChNS0NPTkZJRykgbWFjcm8gZm9yIGFsbCBib2FyZCBwb3J0cworCisgICAgU2lnbmVkLW9mZi1ieTogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorCitjb21taXQgMDU3MDA0ZjRhNDg2MzU1NGQ1NmNjNTYyNjhiZmE3YzdkOTczOGUyNworQXV0aG9yOiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CitEYXRlOglUdWUgSnVsIDMgMDA6MzQ6NDkgMjAwNyAtMDYwMAorCisgICAgQ29ycmVjdCBmaXh1cCByZWxvY2F0aW9uIGZvciBtcGM4M3h4CisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisKK2NvbW1pdCA1YWY2MWIyZjRiODM4YTA1Zjc5YmUyNzRmM2U1YTY2ZWRkMmQ5Yzk2CitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDozNDo0NCAyMDA3IC0wNjAwCisKKyAgICBDb3JyZWN0IGZpeHVwIHJlbG9jYXRpb24gZm9yIG1wYzgyNjAKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IGYzYTUyZmUwNTkyMzkzNWRiODY5ODVkYWY5NDM4ZTJmNzBhYzM5YWEKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjM0OjM5IDIwMDcgLTA2MDAKKworICAgIENvcnJlY3QgZml4dXAgcmVsb2NhdGlvbiBmb3IgbXBjODI0eAorCisgICAgU2lnbmVkLW9mZi1ieTogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorCitjb21taXQgYTg1ZGQyNTRjMDU3N2ZjYTEzNjI3YzQ2ZTkzZmMyYWQ0YzRmMWYwMAorQXV0aG9yOiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CitEYXRlOglUdWUgSnVsIDMgMDA6MzQ6MzQgMjAwNyAtMDYwMAorCisgICAgQ29ycmVjdCBmaXh1cCByZWxvY2F0aW9uIGZvciBtcGM4MjIwCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisKK2NvbW1pdCA2Zjc1NzZiMjBlY2YwZDA0MGMzYWMzYjAzMmI1Y2JjODYwZTM4YTkwCitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDozNDoyOSAyMDA3IC0wNjAwCisKKyAgICBDb3JyZWN0IGZpeHVwIHJlbG9jYXRpb24gZm9yIE1QQzV4eHgKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IDM2NDljZDk5YmE4MTViNjYwMTg2ODczNTc2NTYwMmYwMGVmMzY5MmIKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjM0OjI0IDIwMDcgLTA2MDAKKworICAgIENvcnJlY3QgcmVsb2NhdGlvbiBmaXh1cCBmb3IgbXBjNXh4CisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisKK2NvbW1pdCBmODJiM2I2MzA0YjYyMGVmN2UyOGJmYWExZWE4ODdhMmFkMmZhMzI1CitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDozNDoxOSAyMDA3IC0wNjAwCisKKyAgICBEb24ndCBzZXQgZ2QtPnJlbG9jX29mZiBpZiByZWxvY2F0aW9uIG9mIC5maXh1cCB3b3JrcyBjb3JyZWN0bHkKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IGUxYTYxNDRjMzJkYzdkZTczYmNkZDMzOTk1ZGUwMTQ4Y2JkMGJkMjgKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjM0OjE0IDIwMDcgLTA2MDAKKworICAgIFJlbW92ZSBvYnNvbGV0ZSBtcGM4M3h4IGxpbmtlciBzY3JpcHRzCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisKK2NvbW1pdCAxN2UzMmZjMzkwOGJmNzA4OWQzZjE2ZmM4MmExYzNhZTY3NGRkNjViCitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDozNDowOSAyMDA3IC0wNjAwCisKKyAgICBDb25zb2xpZGF0ZSBtcGM4MjYwIGxpbmtlciBzY3JpcHRzCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisKK2NvbW1pdCBhZjdkMzhiMzkzNjkwZDdlZWFmNDE4YWM4NWExZTgzMWE1MGQ1ZmQwCitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDozNDowNCAyMDA3IC0wNjAwCisKKyAgICBSZW1vdmUgb2Jzb2xldGUgbXBjODI0eCBsaW5rZXIgc2NyaXB0cworCisgICAgU2lnbmVkLW9mZi1ieTogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorCitjb21taXQgZjk0YTNhZWNlYmM0MGNhMDkzOWM3ZDY2ZDAxMDAwOWNmNTFiZTllMgorQXV0aG9yOiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CitEYXRlOglUdWUgSnVsIDMgMDA6MzM6NTkgMjAwNyAtMDYwMAorCisgICAgUmVtb3ZlIG9ic29sZXRlIG1wYzgyNHggbGlua2VyIHNjcmlwdHMgKDMgb2YgNCkKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IGE3MWMwODRmM2FjN2ZlZGYxNDQ1MzdkYjJiMmRhNDczMjMwNjg4MzMKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjMzOjUzIDIwMDcgLTA2MDAKKworICAgIFJlbW92ZSBvYnNvbGV0ZSBtcGM4MjR4IGxpbmtlciBzY3JpcHRzICgyIG9mIDQpCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisKK2NvbW1pdCBmNjcwYTE1NDY4ZDEzNjUyNDFkNDAwMjJiOTQwOGUxMDA0MTgxZjVlCitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDozMzo0OCAyMDA3IC0wNjAwCisKKyAgICBSZW1vdmUgb2Jzb2xldGUgbXBjODI0eCBsaW5rZXIgc2NyaXB0cyAoMSBvZiA0KQorCisgICAgU2lnbmVkLW9mZi1ieTogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorCitjb21taXQgMDk1NTViZDQ1YTA0YzBlNTRmMTcyNTI4ZDIxYmMxODg5NjU1MGQyOAorQXV0aG9yOiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CitEYXRlOglUdWUgSnVsIDMgMDA6MzM6NDMgMjAwNyAtMDYwMAorCisgICAgUmVtb3ZlIG9ic29sZXRlIG1wYzgyMjAgbGlua2VyIHNjcmlwdHMKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IDVlZmI5OTJmMDQ2ZTUxMjI1YzkzZDUyZjgwZmVjYmU0MzNhYmQ3ODkKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjMzOjM4IDIwMDcgLTA2MDAKKworICAgIFJlbW92ZSBvYnNvbGV0ZSBtcGM1eHh4IGxpbmtlciBzY3JpcHRzICgzIG9mIDMpCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisKK2NvbW1pdCAwN2MxM2RmZWY2NWIzMTY0N2U2OWQ4YjYxZGFhMWVlYzU5OGFkZDFhCitBdXRob3I6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KK0RhdGU6CVR1ZSBKdWwgMyAwMDozMzozMyAyMDA3IC0wNjAwCisKKyAgICBSZW1vdmUgb2Jzb2xldGUgbXBjNXh4eCBsaW5rZXIgc2NyaXB0cyAoMiBvZiAzKQorCisgICAgU2lnbmVkLW9mZi1ieTogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorCitjb21taXQgYjRmNjc1MTNhNjI0Y2U4NTg2NmM2NmM1NzViZDJkOWQ3OTc3ZDdmMAorQXV0aG9yOiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CitEYXRlOglUdWUgSnVsIDMgMDA6MzM6MjggMjAwNyAtMDYwMAorCisgICAgUmVtb3ZlIG9ic29sZXRlIG1wYzV4eHggbGlua2VyIHNjcmlwdHMgKDEgb2YgMykKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IGI3ZDhlMDVmODY3NTI0OWI1ZjIwOGFhNzNiYWJlZWQzODRhNDUxOWQKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjMzOjIzIDIwMDcgLTA2MDAKKworICAgIFJlbW92ZSBvYnNvbGV0ZSBtcGM1eHggbGlua2VyIHNjcmlwdHMKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IDQxNmEwYjZkNDBmNmViYTNhMmZjNTQ3MjUzYzE2YmRhMjhkOTIyZjcKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjMzOjE4IDIwMDcgLTA2MDAKKworICAgIENvbnNvbGlkYXRlIG1wYzgzeHggbGlua2VyIHNjcmlwdHMKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IDVmYzU5MTc1YjkyODgzZWQ1ZDI2NjZhMDRlNmJjNDllNzBhNGEzNjUKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjMzOjEzIDIwMDcgLTA2MDAKKworICAgIENvbnNvbGlkYXRlIG1wYzgyNjAgbGlua2VyIHNjcmlwdHMKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IDczN2Y5ZWIwMmQ3MzM1ZGYyYjNlNGQ3YTRkMzM0ODc4NGQxZGEyMDcKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjMzOjA4IDIwMDcgLTA2MDAKKworICAgIENvbnNvbGlkYXRlIG1wYzgyNHggbGlua2VyIHNjcmlwdHMKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IDljNzU3Yjc4OWE1OWE4NTVkYjU3YjQ0OGRkODI1MzI5YzRlOWM0YTAKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjMzOjAzIDIwMDcgLTA2MDAKKworICAgIENvbnNvbGlkYXRlIG1wYzgyMjAgbGlua2VyIHNjcmlwdHMKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IGQxODFjOWExNWNkNDE4NjNmZTI0ODQwZDE3ODQ4NDI5ZjI3ZDNjOGMKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjMyOjU4IDIwMDcgLTA2MDAKKworICAgIENvbnNvbGlkYXRlIG1wYzV4eHggbGlua2VyIHNjcmlwdHMKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKworY29tbWl0IDI4N2FjOTI0YWRiNzI5MWJlYmU1MDg2NjUyYTM2MmEzMGFiMjhiMTMKK0F1dGhvcjogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorRGF0ZToJVHVlIEp1bCAzIDAwOjMyOjUzIDIwMDcgLTA2MDAKKworICAgIENvbnNvbGlkYXRlIG1wYzV4eCBsaW5rZXIgc2NyaXB0cworCisgICAgU2lnbmVkLW9mZi1ieTogR3JhbnQgTGlrZWx5IDxncmFudC5saWtlbHlAc2VjcmV0bGFiLmNhPgorCitjb21taXQgNTJiODcwNGQwMjQ1ZTU4OWY4NmQ0NjJlOWVjMjVhZWI3ZWNiYmJkZAorQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorRGF0ZToJV2VkIEp1bCA0IDAwOjQzOjUzIDIwMDcgKzAyMDAKKworICAgIEZpeCBhIGZldyBmaWxlIHBlcm1pc3Npb24gcHJvYmxlbXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorCitjb21taXQgNzhlMGNmMmRlN2JlN2YxZWFlZWI2MjJlYjYxZmQ1MGU0ZDVlMjA1YworQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorRGF0ZToJV2VkIEp1bCA0IDAwOjM4OjM4IDIwMDcgKzAyMDAKKworICAgIE1pbm9yIGNvZGluZyBzdHlsZSBjbGVhbnVwLiBSZWJ1aWxkIENIQU5HRUxPRyBmaWxlLgorCitjb21taXQgMmY5YzE5ZTQ5NmFjYjZiYjUwZDkyOTllMWFhYjM3NzYyNWQ0OGMzOAorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJTW9uIEp1biAxMSAxOTowMzo0NCAyMDA3IC0wNTAwCisKKyAgICBjb25maWdzLyBtcGM4Nnh4OiBSZXdyaXRlIGNvbW1hbmQgbGluZSBvcHRpb25zIHVzaW5nIG5ldyBDT05GSUdfQ01ELSogc3R5bGUuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNjAyYWQzYjMzZDljZWVmODNkYmFiNDZiZTY4NjQ2ZDY0NWQ2MzdlZQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJTW9uIEp1biAxMSAxOTowMzozOSAyMDA3IC0wNTAwCisKKyAgICBSRUFETUU6IFJld3JpdGUgY29tbWFuZCBsaW5lIGNvbmZpZyB0byB1c2UgQ09ORklHX0NNRF8qIG5hbWVzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDcyYTA3NGNlYzY4ZTViYWQ2MGQ2MzIwNmMwNTA5NzRlMDhhZmQ4MDQKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CU1vbiBKdW4gMTEgMTk6MDM6MzQgMjAwNyAtMDUwMAorCisgICAgaW5jbHVkZS8gbm9uLWNvbmZpZzogQXVnbWVudCBDT05GSUdfQ09NTUFORFMgdGVzdHMgd2l0aCBkZWZpbmVkKENPTkZJR19DTURfKikuCisKKyAgICBUaGlzIGlzIGEgY29tcGF0aWJpbGl0eSBzdGVwIHRoYXQgYWxsb3dzIGJvdGggdGhlIG9sZGVyIGZvcm0KKyAgICBhbmQgdGhlIG5ldyBmb3JtIHRvIGNvLWV4aXN0IGZvciBhIHdoaWxlIHVudGlsIHRoZSBvbGRlciBjYW4KKyAgICBiZSByZW1vdmVkIGVudGlyZWx5LgorCisgICAgQWxsIHRyYW5zZm9ybWF0aW9ucyBhcmUgb2YgdGhlIGZvcm06CisgICAgQmVmb3JlOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKQorICAgIEFmdGVyOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKSB8fCBkZWZpbmVkKENPTkZJR19DTURfQVVUT1NDUklQVCkKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA1ZmNmNTQzZTBiNjYyOGM3NmZmNDg3MDViMWIwNTY2YmZkMTE1MDdiCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglNb24gSnVuIDExIDE5OjAzOjI4IDIwMDcgLTA1MDAKKworICAgIHRvb2xzLyA6IEF1Z21lbnQgQ09ORklHX0NPTU1BTkRTIHRlc3RzIHdpdGggZGVmaW5lZChDT05GSUdfQ01EXyopLgorCisgICAgVGhpcyBpcyBhIGNvbXBhdGliaWxpdHkgc3RlcCB0aGF0IGFsbG93cyBib3RoIHRoZSBvbGRlciBmb3JtCisgICAgYW5kIHRoZSBuZXcgZm9ybSB0byBjby1leGlzdCBmb3IgYSB3aGlsZSB1bnRpbCB0aGUgb2xkZXIgY2FuCisgICAgYmUgcmVtb3ZlZCBlbnRpcmVseS4KKworICAgIEFsbCB0cmFuc2Zvcm1hdGlvbnMgYXJlIG9mIHRoZSBmb3JtOgorICAgIEJlZm9yZToKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkKKyAgICBBZnRlcjoKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0FVVE9TQ1JJUFQpCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgOTEwN2ViZTBkMzUyNDIwODk1YWI2OWI3MTU2OTdiZGViYzhjYWY1MAorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJTW9uIEp1biAxMSAxOTowMzoyMyAyMDA3IC0wNTAwCisKKyAgICBib2FyZC9bay16XSo6IEF1Z21lbnQgQ09ORklHX0NPTU1BTkRTIHRlc3RzIHdpdGggZGVmaW5lZChDT05GSUdfQ01EXyopLgorCisgICAgVGhpcyBpcyBhIGNvbXBhdGliaWxpdHkgc3RlcCB0aGF0IGFsbG93cyBib3RoIHRoZSBvbGRlciBmb3JtCisgICAgYW5kIHRoZSBuZXcgZm9ybSB0byBjby1leGlzdCBmb3IgYSB3aGlsZSB1bnRpbCB0aGUgb2xkZXIgY2FuCisgICAgYmUgcmVtb3ZlZCBlbnRpcmVseS4KKworICAgIEFsbCB0cmFuc2Zvcm1hdGlvbnMgYXJlIG9mIHRoZSBmb3JtOgorICAgIEJlZm9yZToKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkKKyAgICBBZnRlcjoKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0FVVE9TQ1JJUFQpCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNWUzNzgwMDNkNTkyZWE4MjhlYzY5ZDZkZWZjZDRkZTc5MDk2ZGQ1YworQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJTW9uIEp1biAxMSAxOTowMzoxOSAyMDA3IC0wNTAwCisKKyAgICBib2FyZC9bTWEtaV0qOiBBdWdtZW50IENPTkZJR19DT01NQU5EUyB0ZXN0cyB3aXRoIGRlZmluZWQoQ09ORklHX0NNRF8qKS4KKworICAgIFRoaXMgaXMgYSBjb21wYXRpYmlsaXR5IHN0ZXAgdGhhdCBhbGxvd3MgYm90aCB0aGUgb2xkZXIgZm9ybQorICAgIGFuZCB0aGUgbmV3IGZvcm0gdG8gY28tZXhpc3QgZm9yIGEgd2hpbGUgdW50aWwgdGhlIG9sZGVyIGNhbgorICAgIGJlIHJlbW92ZWQgZW50aXJlbHkuCisKKyAgICBBbGwgdHJhbnNmb3JtYXRpb25zIGFyZSBvZiB0aGUgZm9ybToKKyAgICBCZWZvcmU6CisJI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0FVVE9TQ1JJUFQpCisgICAgQWZ0ZXI6CisJI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0FVVE9TQ1JJUFQpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9BVVRPU0NSSVBUKQorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDczNzE4NDExNGVjOWM5ZTBhYjk0ZDY3MTM1MzYxMjYwNzNiZDI0NzIKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CU1vbiBKdW4gMTEgMTk6MDM6MTUgMjAwNyAtMDUwMAorCisgICAgY3B1LyBub24tbXBjKjogQXVnbWVudCBDT05GSUdfQ09NTUFORFMgdGVzdHMgd2l0aCBkZWZpbmVkKENPTkZJR19DTURfKikuCisKKyAgICBUaGlzIGlzIGEgY29tcGF0aWJpbGl0eSBzdGVwIHRoYXQgYWxsb3dzIGJvdGggdGhlIG9sZGVyIGZvcm0KKyAgICBhbmQgdGhlIG5ldyBmb3JtIHRvIGNvLWV4aXN0IGZvciBhIHdoaWxlIHVudGlsIHRoZSBvbGRlciBjYW4KKyAgICBiZSByZW1vdmVkIGVudGlyZWx5LgorCisgICAgQWxsIHRyYW5zZm9ybWF0aW9ucyBhcmUgb2YgdGhlIGZvcm06CisgICAgQmVmb3JlOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKQorICAgIEFmdGVyOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKSB8fCBkZWZpbmVkKENPTkZJR19DTURfQVVUT1NDUklQVCkKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBmNDgwNzBmZTVmZTQ0MGRmYjVlZTUyNjhjOTIwZGU3MGU0OGVhMzI3CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglNb24gSnVuIDExIDE5OjAzOjA4IDIwMDcgLTA1MDAKKworICAgIGNwdS9tcGMqLyA6IEF1Z21lbnQgQ09ORklHX0NPTU1BTkRTIHRlc3RzIHdpdGggZGVmaW5lZChDT05GSUdfQ01EXyopLgorCisgICAgVGhpcyBpcyBhIGNvbXBhdGliaWxpdHkgc3RlcCB0aGF0IGFsbG93cyBib3RoIHRoZSBvbGRlciBmb3JtCisgICAgYW5kIHRoZSBuZXcgZm9ybSB0byBjby1leGlzdCBmb3IgYSB3aGlsZSB1bnRpbCB0aGUgb2xkZXIgY2FuCisgICAgYmUgcmVtb3ZlZCBlbnRpcmVseS4KKworICAgIEFsbCB0cmFuc2Zvcm1hdGlvbnMgYXJlIG9mIHRoZSBmb3JtOgorICAgIEJlZm9yZToKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkKKyAgICBBZnRlcjoKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0FVVE9TQ1JJUFQpCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgMGM1MDVkYjBhMGRjMWY2NzBiMTNjZTNiNGQzZmJmMWVjNWIzY2JkMgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJTW9uIEp1biAxMSAxOTowMzowMyAyMDA3IC0wNTAwCisKKyAgICBsaWJfKi86IEF1Z21lbnQgQ09ORklHX0NPTU1BTkRTIHRlc3RzIHdpdGggZGVmaW5lZChDT05GSUdfQ01EXyopLgorCisgICAgVGhpcyBpcyBhIGNvbXBhdGliaWxpdHkgc3RlcCB0aGF0IGFsbG93cyBib3RoIHRoZSBvbGRlciBmb3JtCisgICAgYW5kIHRoZSBuZXcgZm9ybSB0byBjby1leGlzdCBmb3IgYSB3aGlsZSB1bnRpbCB0aGUgb2xkZXIgY2FuCisgICAgYmUgcmVtb3ZlZCBlbnRpcmVseS4KKworICAgIEFsbCB0cmFuc2Zvcm1hdGlvbnMgYXJlIG9mIHRoZSBmb3JtOgorICAgIEJlZm9yZToKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkKKyAgICBBZnRlcjoKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0FVVE9TQ1JJUFQpCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNzNmMDMyMDIxZWM1ZjEzY2RhOGZhYTRlMzRiNmRlODA5NjBlYjg2ZgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJTW9uIEp1biAxMSAxOTowMjo1OCAyMDA3IC0wNTAwCisKKyAgICBsaWJfcHBjLzogQXVnbWVudCBDT05GSUdfQ09NTUFORFMgdGVzdHMgd2l0aCBkZWZpbmVkKENPTkZJR19DTURfKikuCisKKyAgICBUaGlzIGlzIGEgY29tcGF0aWJpbGl0eSBzdGVwIHRoYXQgYWxsb3dzIGJvdGggdGhlIG9sZGVyIGZvcm0KKyAgICBhbmQgdGhlIG5ldyBmb3JtIHRvIGNvLWV4aXN0IGZvciBhIHdoaWxlIHVudGlsIHRoZSBvbGRlciBjYW4KKyAgICBiZSByZW1vdmVkIGVudGlyZWx5LgorCisgICAgQWxsIHRyYW5zZm9ybWF0aW9ucyBhcmUgb2YgdGhlIGZvcm06CisgICAgQmVmb3JlOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKQorICAgIEFmdGVyOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKSB8fCBkZWZpbmVkKENPTkZJR19DTURfQVVUT1NDUklQVCkKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA5OGI3OTAwM2MyMWMyNTc4MjA2MDAzMjU2ZGU0ZTc4MWQ2YjM2Y2E4CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglNb24gSnVuIDExIDE5OjAyOjUzIDIwMDcgLTA1MDAKKworICAgIHJ0Yy86IEF1Z21lbnQgQ09ORklHX0NPTU1BTkRTIHRlc3RzIHdpdGggZGVmaW5lZChDT05GSUdfQ01EXyopLgorCisgICAgVGhpcyBpcyBhIGNvbXBhdGliaWxpdHkgc3RlcCB0aGF0IGFsbG93cyBib3RoIHRoZSBvbGRlciBmb3JtCisgICAgYW5kIHRoZSBuZXcgZm9ybSB0byBjby1leGlzdCBmb3IgYSB3aGlsZSB1bnRpbCB0aGUgb2xkZXIgY2FuCisgICAgYmUgcmVtb3ZlZCBlbnRpcmVseS4KKworICAgIEFsbCB0cmFuc2Zvcm1hdGlvbnMgYXJlIG9mIHRoZSBmb3JtOgorICAgIEJlZm9yZToKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkKKyAgICBBZnRlcjoKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0FVVE9TQ1JJUFQpCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNmUyMTE1YWNiNmE4OTJkNTNhNjg4MWJmMjUzYWU0MWQzZGYzOTE1NgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJTW9uIEp1biAxMSAxOTowMjo0OSAyMDA3IC0wNTAwCisKKyAgICBuZXQvOiBBdWdtZW50IENPTkZJR19DT01NQU5EUyB0ZXN0cyB3aXRoIGRlZmluZWQoQ09ORklHX0NNRF8qKS4KKworICAgIFRoaXMgaXMgYSBjb21wYXRpYmlsaXR5IHN0ZXAgdGhhdCBhbGxvd3MgYm90aCB0aGUgb2xkZXIgZm9ybQorICAgIGFuZCB0aGUgbmV3IGZvcm0gdG8gY28tZXhpc3QgZm9yIGEgd2hpbGUgdW50aWwgdGhlIG9sZGVyIGNhbgorICAgIGJlIHJlbW92ZWQgZW50aXJlbHkuCisKKyAgICBBbGwgdHJhbnNmb3JtYXRpb25zIGFyZSBvZiB0aGUgZm9ybToKKyAgICBCZWZvcmU6CisJI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0FVVE9TQ1JJUFQpCisgICAgQWZ0ZXI6CisJI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0FVVE9TQ1JJUFQpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9BVVRPU0NSSVBUKQorCisgICAgU2lnbmVkLW9mZi1ieTogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDQ1Y2RiOWI3MmM5NDY1NWM3MzA4YjQ2NGEyNjY2MDU3YzBiMjg2ZTAKK0F1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KK0RhdGU6CU1vbiBKdW4gMTEgMTk6MDI6MzQgMjAwNyAtMDUwMAorCisgICAgZGlzay86IEF1Z21lbnQgQ09ORklHX0NPTU1BTkRTIHRlc3RzIHdpdGggZGVmaW5lZChDT05GSUdfQ01EXyopLgorCisgICAgVGhpcyBpcyBhIGNvbXBhdGliaWxpdHkgc3RlcCB0aGF0IGFsbG93cyBib3RoIHRoZSBvbGRlciBmb3JtCisgICAgYW5kIHRoZSBuZXcgZm9ybSB0byBjby1leGlzdCBmb3IgYSB3aGlsZSB1bnRpbCB0aGUgb2xkZXIgY2FuCisgICAgYmUgcmVtb3ZlZCBlbnRpcmVseS4KKworICAgIEFsbCB0cmFuc2Zvcm1hdGlvbnMgYXJlIG9mIHRoZSBmb3JtOgorICAgIEJlZm9yZToKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkKKyAgICBBZnRlcjoKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0FVVE9TQ1JJUFQpCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgNGUxMDlhZTk4Mjk0YTVjYTdmZjg0OGI3NjUyYzdiZmQ0MDIzYTk0YQorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJTW9uIEp1biAxMSAxOTowMjoyMCAyMDA3IC0wNTAwCisKKyAgICBmcy86IEF1Z21lbnQgQ09ORklHX0NPTU1BTkRTIHRlc3RzIHdpdGggZGVmaW5lZChDT05GSUdfQ01EXyopLgorCisgICAgVGhpcyBpcyBhIGNvbXBhdGliaWxpdHkgc3RlcCB0aGF0IGFsbG93cyBib3RoIHRoZSBvbGRlciBmb3JtCisgICAgYW5kIHRoZSBuZXcgZm9ybSB0byBjby1leGlzdCBmb3IgYSB3aGlsZSB1bnRpbCB0aGUgb2xkZXIgY2FuCisgICAgYmUgcmVtb3ZlZCBlbnRpcmVseS4KKworICAgIEFsbCB0cmFuc2Zvcm1hdGlvbnMgYXJlIG9mIHRoZSBmb3JtOgorICAgIEJlZm9yZToKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkKKyAgICBBZnRlcjoKKwkjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0FVVE9TQ1JJUFQpCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCitjb21taXQgZDViZTQzZGU5M2ZmOTA1YzQ2NWU1MDlkNDVhMzE2NGVmNDhkMjZlNworQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgorRGF0ZToJTW9uIEp1biAxMSAxOTowMjoxMCAyMDA3IC0wNTAwCisKKyAgICBkcml2ZXJzLzogQXVnbWVudCBDT05GSUdfQ09NTUFORFMgdGVzdHMgd2l0aCBkZWZpbmVkKENPTkZJR19DTURfKikuCisKKyAgICBUaGlzIGlzIGEgY29tcGF0aWJpbGl0eSBzdGVwIHRoYXQgYWxsb3dzIGJvdGggdGhlIG9sZGVyIGZvcm0KKyAgICBhbmQgdGhlIG5ldyBmb3JtIHRvIGNvLWV4aXN0IGZvciBhIHdoaWxlIHVudGlsIHRoZSBvbGRlciBjYW4KKyAgICBiZSByZW1vdmVkIGVudGlyZWx5LgorCisgICAgQWxsIHRyYW5zZm9ybWF0aW9ucyBhcmUgb2YgdGhlIGZvcm06CisgICAgQmVmb3JlOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKQorICAgIEFmdGVyOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKSB8fCBkZWZpbmVkKENPTkZJR19DTURfQVVUT1NDUklQVCkKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBiNDUzOTYwZDRmZGI4N2IzOTcwZDk2MTE5YjkwZGYyZWQwMjRmYzRhCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglNb24gSnVuIDExIDE5OjAyOjA1IDIwMDcgLTA1MDAKKworICAgIGNvbW1vbi8gbm9uLWNtZDogQXVnbWVudCBDT05GSUdfQ09NTUFORFMgdGVzdHMgd2l0aCBkZWZpbmVkKENPTkZJR19DTURfKikuCisKKyAgICBUaGlzIGlzIGEgY29tcGF0aWJpbGl0eSBzdGVwIHRoYXQgYWxsb3dzIGJvdGggdGhlIG9sZGVyIGZvcm0KKyAgICBhbmQgdGhlIG5ldyBmb3JtIHRvIGNvLWV4aXN0IGZvciBhIHdoaWxlIHVudGlsIHRoZSBvbGRlciBjYW4KKyAgICBiZSByZW1vdmVkIGVudGlyZWx5LgorCisgICAgQWxsIHRyYW5zZm9ybWF0aW9ucyBhcmUgb2YgdGhlIGZvcm06CisgICAgQmVmb3JlOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKQorICAgIEFmdGVyOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKSB8fCBkZWZpbmVkKENPTkZJR19DTURfQVVUT1NDUklQVCkKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA2NWM0NTBiNDdhNjI2NTlkNTIyY2ZhOGY0ZmExZTRlNWM2MGRjY2QwCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglNb24gSnVuIDExIDE5OjAxOjU0IDIwMDcgLTA1MDAKKworICAgIGNvbW1vbi9jbWRfW2ktel0qIDogQXVnbWVudCBDT05GSUdfQ09NTUFORFMgdGVzdHMgd2l0aCBkZWZpbmVkKENPTkZJR19DTURfKikuCisKKyAgICBUaGlzIGlzIGEgY29tcGF0aWJpbGl0eSBzdGVwIHRoYXQgYWxsb3dzIGJvdGggdGhlIG9sZGVyIGZvcm0KKyAgICBhbmQgdGhlIG5ldyBmb3JtIHRvIGNvLWV4aXN0IGZvciBhIHdoaWxlIHVudGlsIHRoZSBvbGRlciBjYW4KKyAgICBiZSByZW1vdmVkIGVudGlyZWx5LgorCisgICAgQWxsIHRyYW5zZm9ybWF0aW9ucyBhcmUgb2YgdGhlIGZvcm06CisgICAgQmVmb3JlOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKQorICAgIEFmdGVyOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKSB8fCBkZWZpbmVkKENPTkZJR19DTURfQVVUT1NDUklQVCkKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBhNzZhZGM4MTQyYzFkOTU2Mzg1YTEwOWUwYjcwZjkzMTllZGU0ZDY2CitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglNb24gSnVuIDExIDE5OjAxOjQzIDIwMDcgLTA1MDAKKworICAgIGNvbW1vbi9jbWRfW2EtZl0qIDogQXVnbWVudCBDT05GSUdfQ09NTUFORFMgdGVzdHMgd2l0aCBkZWZpbmVkKENPTkZJR19DTURfKikuCisKKyAgICBUaGlzIGlzIGEgY29tcGF0aWJpbGl0eSBzdGVwIHRoYXQgYWxsb3dzIGJvdGggdGhlIG9sZGVyIGZvcm0KKyAgICBhbmQgdGhlIG5ldyBmb3JtIHRvIGNvLWV4aXN0IGZvciBhIHdoaWxlIHVudGlsIHRoZSBvbGRlciBjYW4KKyAgICBiZSByZW1vdmVkIGVudGlyZWx5LgorCisgICAgQWxsIHRyYW5zZm9ybWF0aW9ucyBhcmUgb2YgdGhlIGZvcm06CisgICAgQmVmb3JlOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKQorICAgIEFmdGVyOgorCSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BVVRPU0NSSVBUKSB8fCBkZWZpbmVkKENPTkZJR19DTURfQVVUT1NDUklQVCkKKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBlYzYzYjEwYjYxZmQ2ODIzOGQ0YzE1YzFjZDA0YzBiMzgyMjhlMmMxCitBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CitEYXRlOglNb24gSnVuIDExIDE5OjAxOjM0IDIwMDcgLTA1MDAKKworICAgIEludHJvZHVjZSBpbml0aWFsIHZlcnNpb25zIG9mIG5ldyBDb21tYW5kIENvbmZpZyBmaWxlcy4KKworICAgIERlcml2ZSB0aHJlZSBuZXcgZmlsZXMgZnJvbSBjbWRfY29uZmRlZnMuaDoKKwljb25maWdfYm9vdHAuaCAtIEhhcyBCT09UUCByZWxhdGVkIGNvbmZpZyBvcHRpb25zLCBub3QgY29tbWFuZHMKKwljb25maWdfY21kX2FsbC5oIC0gSGFzIGEgQ09ORklHX0NNRF8qIGRlZmluaXRpb24gZm9yIGV2ZXJ5IGNvbW1hbmQKKwljb25maWdfY21kX2RlZmF1bHQuaCAtIEhhcyBhIENPTkZJR19DTURfKiBkZWZpbml0aW9uIGZvciBkZWZhdWx0IGNtZHMuCisKKyAgICBGb3Igbm93LCBpbmNsdWRlICJjb25maWdfYm9vdHAuaCIgZm9yIGNvbXBhdGFiaWxpdHkgdW50aWwgYWxsCisgICAgdXNlcnMgb2YgaXQgZGlyZWN0bHkgaW5jbHVkZSBpdCBwcm9wZXJseS4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCAxZjJhMDU4OTg2NTg5MDBkYzU3MTc3NjFlMjdhYmYyMDUyZTY3ZTEzCitBdXRob3I6IE11c2h0YXEgS2hhbiA8bXVzaHRhcWtfOTIxQHlhaG9vLmNvLmluPgorRGF0ZToJU2F0IEp1biAzMCAxODo1MDo0OCAyMDA3ICswMjAwCisKKyAgICBGaXggUy1BVEEgc3VwcG9ydC4KKworICAgIFNpZ25lZC1vZmYtYnk6IG11c2h0YXEga2hhbiA8bXVzaHRhcWtfOTIxQHlhaG9vLmNvLmluPgorCitjb21taXQgYTVkNzFlMjkwZjM2NzMyNjliZThlZWZiNGVjNDRmNTM0MTJmOTQ2MQorQXV0aG9yOiBIZWlrbyBTY2hvY2hlciA8aHNAcG9sbHV4LmRlbnguZGU+CitEYXRlOglNb24gSnVuIDI1IDE5OjExOjM3IDIwMDcgKzAyMDAKKworICAgIFtQQ1M0NDBFUF0JZ2V0IHJpZCBvZiBDT05GSUdfUFBDNHh4X1VTRV9TUERfRERSX0lOSVRfSEFORworCisgICAgU2lnbmVkLW9mZi1ieTogSGVpa28gU2Nob2NoZXIgPGhzQGRlbnguZGU+CisKK2NvbW1pdCBhMWJkNjIwMGVjY2QzYTAyMDQwYTk1NWQ1ZjQzZDNlZTFmYzlmOTNiCitBdXRob3I6IE5pa2xhdXMgR2lnZXIgPG5pa2xhdXMuZ2lnZXJAbmVzdGFsLmNvbT4KK0RhdGU6CU1vbiBKdW4gMjUgMTc6MDM6MTMgMjAwNyArMDIwMAorCisgICAgcHBjNHh4OiBQUEM0NDBFUHggRW1pdCBERFIwIHJlZ2lzdGVycyBvbiBtYWNoaW5lIGNoZWNrIGludGVycnVwdAorCisgICAgVGhpcyBwYXRjaCBwcmludHMgdGhlIEREUiBzdGF0dXMgcmVnaXN0ZXJzIHVwb24gbWFjaGluZSBjaGVjaworICAgIGludGVycnVwdCBvbiB0aGUgNDQwRVB4L0dSeC4gVGhpcyBjYW4gYmUgdXNlZnVsIGVzcGVjaWFsbHkgd2hlbgorICAgIEVDQyBzdXBwb3J0IGlzIGVuYWJsZWQuCisKKyAgICBJIGFkZGVkIHNvbWUgc21hbGwgY2hhbmdlcyB0byB0aGUgb3JpZ2luYWwgcGF0Y2ggZnJvbSBOaWtsYXVzIHRvCisgICAgbWFrZSBpdCBjb21waWxlIGNsZWFuLgorCisgICAgU2lnbmVkLW9mZi1ieTogTmlrbGF1cyBHaWdlciA8bmlrbGF1cy5naWdlckBuZXN0YWwuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KKworY29tbWl0IDgwNzAxOGZiN2ZhY2ViNDI5Y2UwY2I0N2JhYTIwNzM3NDZiMzNhNGUKK0F1dGhvcjogTmlrbGF1cyBHaWdlciA8bmlrbGF1cy5naWdlckBuZXN0YWwuY29tPgorRGF0ZToJTW9uIEp1biAyNSAxNjo1MDo1NSAyMDA3ICswMjAwCisKKyAgICBwcGM0eHg6IEZpeCBPPWJ1aWxkaXIgYnVpbGRzCisKKyAgICBUaGlzIHBhdGNoIGZpeGVzIHRoZSBwcm9ibGVtIHRvIGFzc2VtYmxlIGNwdS9wcGM0eHgvc3RhcnQuUworICAgIGV4cGVyaWVuY2VkIGxhc3Qgd2VlayB3aGVyZSBidWlsZGluZyBmYWlsZWQgaGF2aW5nIHNwZWNpZmllZAorICAgIE89Li4vYnVpbGQuc2VxdW9pYS4KKworICAgIFNpZ25lZC1vZmYtYnk6IE5pa2xhdXMgR2lnZXIgPG5pa2xhdXMuZ2lnZXJAbmVzdGFsLmNvbT4KKworY29tbWl0IDQ2NmZmZjFhN2JiNWZlNzY0YTA2NDUwNjI2ZjYwOTgyMTlmNDQ2YjgKK0F1dGhvcjogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorRGF0ZToJTW9uIEp1biAyNSAxNTo1NzozOSAyMDA3ICswMjAwCisKKyAgICBwcGM0eHg6IEFkZCBwY2lfcHJlX2luaXQoKSBmb3IgNDA1IGJvYXJkcworCisgICAgVGhpcyBwYXRjaCByZW1vdmVzIHRoZSBDRkdfUENJX1BSRV9JTklUIG9wdGlvbiBjb21wbGV0ZWx5LCBzaW5jZQorICAgIGl0J3Mgbm90IG5lZWRlZCBhbnltb3JlIHdpdGggdGhlIHBhdGNoIGZyb20gTWF0dGhpYXMgRnVjaHMgd2l0aAorICAgIHRoZSAid2VhayIgcGNpX3ByZV9pbml0KCkgaW1wbGVtZW50YXRpb24uCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CisKK2NvbW1pdCA2ZjM1YzUzMTY2MjEzYzI0YTVhMGUyMzkwZWQ4NjExMzZmZjczODcwCitBdXRob3I6IE1hdHRoaWFzIEZ1Y2hzIDxtYXR0aGlhcy5mdWNoc0Blc2QtZWxlY3Ryb25pY3MuY29tPgorRGF0ZToJU3VuIEp1biAyNCAxNzo0MToyMSAyMDA3ICswMjAwCisKKyAgICBwcGM0eHg6IE1haW50ZW5hbmNlIHBhdGNoIGZvciBlc2QncyBDUENJNDA1IGRlcml2YXRzCisKKyAgICAtYWRkIHBjaV9wcmVfaW5pdCgpIGZvciBwY2kgaW50ZXJydXB0IGZpeHVwIGNvZGUKKyAgICAtZGlzYWJsZSBwaHkgc2xlZXAgbW9kZSB2aWEgcmVzZXRfcGh5KCkgZnVuY3Rpb24KKyAgICAtdXNlIGNvcnJlY3QgaW8gYWNjZXNzb3JzCisgICAgLWNsZWFudXAKKworICAgIFNpZ25lZC1vZmYtYnk6IE1hdHRoaWFzIEZ1Y2hzIDxtYXR0aGlhcy5mdWNoc0Blc2QtZWxlY3Ryb25pY3MuY29tPgorCitjb21taXQgNWExYzlmZjBjNDQzMDViNTdjYjRkOGY5MzY5YmJhOTBiY2YwZTFmOAorQXV0aG9yOiBNYXR0aGlhcyBGdWNocyA8bWF0dGhpYXMuZnVjaHNAZXNkLWVsZWN0cm9uaWNzLmNvbT4KK0RhdGU6CVN1biBKdW4gMjQgMTc6MjM6NDEgMjAwNyArMDIwMAorCisgICAgcHBjNHh4OiBBZGQgcGNpX3ByZV9pbml0KCkgZm9yIDQwNSBib2FyZHMKKworICAgIFRoaXMgcGF0Y2ggYWRkcyBzdXBwb3J0IGZvciBjYWxsaW5nIGEgcGxhdHRmb3JtIGRlcGVuZGFudAorICAgIHBjaV9wcmVfaW5pdCgpIGZ1bmN0aW9uIGZvciA0MDUgYm9hcmRzLiBUaGlzIGNhbiBiZSB1c2VkIHRvCisgICAgbW92ZSB0aGUgY3VycmVudCBwY2lfNDA1Z3BfZml4dXBfaXJxKCkgZnVuY3Rpb24gaW50byB0aGUKKyAgICBib2FyZCBjb2RlLgorCisgICAgVGhpcyBwYXRjaCBhbHNvIG1ha2VzIHRoZSBDRkdfUENJX1BSRV9JTklUIGRlZmluZSBvYnNvbGV0ZS4KKyAgICBBIGRlZmF1bHQgZnVuY3Rpb24gd2l0aCAnd2VhaycgYXR0cmlidXRlIGlzIHVzZWQgd2hlbgorICAgIGEgYm9hcmQgc3BlY2lmaWMgcGNpX3ByZV9pbml0KCkgaXMgbm90IGltcGxlbWVudGVkLgorCisgICAgU2lnbmVkLW9mZi1ieTogTWF0dGhpYXMgRnVjaHMgPG1hdHRoaWFzLmZ1Y2hzQGVzZC1lbGVjdHJvbmljcy5jb20+CisKK2NvbW1pdCAxNjM2ZDFjODUyOWMwMDZkMTA2Mjg3Y2ZiYzIwY2QwYTI0NmZlMWNiCitBdXRob3I6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CitEYXRlOglGcmkgSnVuIDIyIDIzOjU5OjAwIDIwMDcgKzAyMDAKKworICAgIENvZGluZyBzdHlsa2UgY2xlYW51cDsgcmVidWlsZCBDSEFOR0VMT0cKKworY29tbWl0IDJkYzY0NDUxYjRjMDhmZmQ2MTkzNzJhYmZkYzI1MDZhMmUyMzYzYjkKK0F1dGhvcjogSWdvciBMaXNpdHNpbiA8aWdvckBlbWNyYWZ0LmNvbT4KK0RhdGU6CVdlZCBBcHIgMTggMTQ6NTU6MTkgMjAwNyArMDQwMAorCisgICAgQWRhcHQgbG9nIGJ1ZmZlciBjb2RlIHRvIHN1cHBvcnQgTGludXggMi42CisKKyAgICBBIG5ldyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgImxvZ3ZlcnNpb24iLCBzZWxlY3RzIHRoZSBsb2cgYnVmZmVyCisgICAgYmVoYXZpb3VyLiBJZiBpdCBpcyBub3Qgc2V0IG9yIHNldCB0byBhIHZhbHVlIG90aGVyIHRoYW4gMiwgdGhlbiB0aGUKKyAgICBvbGQsIExpbnV4IDIuNC40LCBiZWhhdmlvdXIgaXMgc2VsZWN0ZWQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBJZ29yIExpc2l0c2luIDxpZ29yQGVtY3JhZnQuY29tPgorICAgIC0tCisKK2NvbW1pdCBhMTFlMDY5NjVlYzkxMjcwYzUxODUzNDA3ZmYxMjYxZDNjNzQwMzg2CitBdXRob3I6IElnb3IgTGlzaXRzaW4gPGlnb3JAZW1jcmFmdC5jb20+CitEYXRlOglXZWQgTWFyIDI4IDE5OjA2OjE5IDIwMDcgKzA0MDAKKworICAgIEV4dGVuZCBQT1NUIHN1cHBvcnQgZm9yIFBQQzQ0MAorCisgICAgQWRkZWQgbWVtb3J5LCBDUFUsIFVBUlQsIEkyQyBhbmQgU1BSIFBPU1QgdGVzdHMgZm9yIFBQQzQ0MC4KKworICAgIFNpZ25lZC1vZmYtYnk6IElnb3IgTGlzaXRzaW4gPGlnb3JAZW1jcmFmdC5jb20+CisgICAgLS0KKworY29tbWl0IDU2NmE0OTRmNTkyYWUzYjNjMDc4NWQ5MGQ0ZTFiYTQ1NTc0ODgwYzQKK0F1dGhvcjogSGVpa28gU2Nob2NoZXIgPGhzQHBvbGx1eC5kZW54LmRlPgorRGF0ZToJRnJpIEp1biAyMiAxOToxMTo1NCAyMDA3ICswMjAwCisKKyAgICBbUENTNDQwRVBdCSAgICB1cGdyYWRlIHRoZSBQQ1M0NDBFUCBib2FyZDoKKwkJICAgIC0gU2hvdyBvbiB0aGUgU3RhdHVzIExFRHMsIHNvbWUgU3RhdGVzIG9mIHRoZSBib2FyZC4KKwkJICAgIC0gR2V0IHRoZSBNQUMgYWRkcmVzc2VzIGZyb20gdGhlIEVFUHJvbQorCQkgICAgLSB1c2UgUFJFQk9PVAorCQkgICAgLSB1c2UgdGhlIENGIG9uIHRoZSBib2FyZC4KKwkJICAgIC0gY2hlY2sgdGhlIFUtQm9vdCBpbWFnZSBpbiB0aGUgRmxhc2ggd2l0aCBhIFNIQTEKKwkJICAgICAgY2hlY2tzdW0uCisJCSAgICAtIHVzZSBkeW5hbWljIFRMQiBlbnRyaWVzIGdlbmVyYXRpb24gZm9yIHRoZSBTRFJBTQorCisgICAgU2lnbmVkLW9mZi1ieTogSGVpa28gU2Nob2NoZXIgPGhzQGRlbnguZGU+CisKK2NvbW1pdCAzYTFmNWM4MWIwYjk1NTc4MTdhNzg5YmVjZTgzOTkwNTU4MWMyMjA1CitBdXRob3I6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KK0RhdGU6CUZyaSBKdW4gMjIgMTY6NTg6NDAgMjAwNyArMDIwMAorCisgICAgcHBjNHh4OiBGaXggcHJvYmxlbSB3aXRoIGV4dGVuZGVkIHByb2dyYW1fdGxiKCkgZnVudGlvbgorCisgICAgVGhlIHJlY2VudGx5IGV4dGVuZGVkIHByb2dyYW1fdGxiKCkgZnVuY3Rpb24gaGFkIGEgcHJvYmxlbSB3aGVuCisgICAgbXVsdGlwbGUgVExCJ3MgaGFkIHRvIGJlIHNldHVwIChmb3IgZXhhbXBsZSB3aXRoIDUxMk1CIG9mIFNEUkFNKS4gVGhlCisgICAgdmlydHVhbCBhZGRyZXNzIHdhcyBub3QgaW5jcmVtZW50ZWQuIFRoaXMgcGF0Y2ggZml4ZXMgdGhpcyBpc3N1ZQorICAgIGFuZCBpcyB0ZXN0ZWQgb24gS2F0bWFpIHdpdGggNTEyTUIgU0RSQU0uCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CisKK2NvbW1pdCAwMjAzMmU4ZjE0NzUxYTFhNzUxYjA5MjQwYTRmMWNmOWY4YTIwNzdmCitBdXRob3I6IFJhZmFsIEphd29yb3dza2kgPHJhakBzZW1paGFsZi5jb20+CitEYXRlOglGcmkgSnVuIDIyIDE0OjU4OjA0IDIwMDcgKzAyMDAKKworICAgIFtwcGNdIEZpeCBidWlsZCBicmVha2FnZSBmb3IgYWxsIG5vbi00eHggUG93ZXJQQyB2YXJpYW50cy4KKworICAgIC0gYWRhcHQgdG8gdGhlIG1vcmUgZ2VuZXJpYyBFWENFUFRJT05fUFJPTE9HIGFuZCBDUklUX0VYQ0VQVElPTiBtYWNyb3MKKyAgICAtIG1pbm9yIDR4eCBjbGVhbnVwCisKK2NvbW1pdCA4M2I0Y2ZhM2Q2MjlkZmYwMjY0MzY2MjYzYzVlOTRkOWE1MGFkODBiCitBdXRob3I6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CitEYXRlOglXZWQgSnVuIDIwIDE4OjE0OjI0IDIwMDcgKzAyMDAKKworICAgIENvZGluZyBzdHlsZSBjbGVhbnVwLiBSZWZyZXNoIENIQU5HRUxPRy4KKworY29tbWl0IGIzZjllYzg2ZTM4ODIwN2ZkMDNkY2RmN2IxNDViOWVkMDgwYmYwMjQKK0F1dGhvcjogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorRGF0ZToJVHVlIEp1biAxOSAxNzoyMjo0NCAyMDA3ICswMjAwCisKKyAgICBwcGM0eHg6IEFkZCBib290c3RyYXAgY29tbWFuZCBmb3IgQU1DQyBTZXF1b2lhICg0NDBFUHgpIGV2YWwgYm9hcmQKKworICAgIFRoaXMgcGF0Y2ggYWRkcyBhIGJvYXJkIGNvbW1hbmQgdG8gY29uZmlndXJlIHRoZSBJMkMgYm9vdHN0cmFwIEVFUFJPTQorICAgIHZhbHVlcy4gUmlnaHQgbm93IDUzMyBhbmQgNjY3TUh6IGFyZSBzdXBwb3J0ZWQgZm9yIGJvb3RpbmcgZWl0aGVyIHZpYSBOT1IKKyAgICBvciBOQU5EIEZMQVNILiBIZXJlIHRoZSB1c2FnZToKKworICAgID0+IGJvb3RzdHJhcCA1MzMgbm9yCTt0byBjb25maWd1cmUgdGhlIGJvYXJkIGZvciA1MzNNSHogTk9SIGJvb3RpbmcKKyAgICA9PiBib290c3RyYXAgNjY3IG5hbmQJO3RvIGNvbmZpZ3VyZSB0aGUgYm9hcmQgZm9yIDY2N01IeiBOTkFORCBib290aW5nCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CisKK2NvbW1pdCBkZjhhMjRjZGQzMDE1MTUwNWNmNTdiYmVlNTI4OWU5MWJmNTNiZDFiCitBdXRob3I6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KK0RhdGU6CVR1ZSBKdW4gMTkgMTY6NDI6MzEgMjAwNyArMDIwMAorCisgICAgW3BwYzR4eF0gRml4IHByb2JsZW0gd2l0aCBOQU5EIGJvb3Rpbmcgb24gQU1DQyBBY2FkaWEKKworICAgIFRoZSBsYXRlc3QgY2hhbmdlcyBzaG93ZWQgYSBwcm9ibGVtIHdpdGggdGhlIGxvY2F0aW9uIG9mIHRoZSBOQU5ELVNQTAorICAgIGltYWdlIGluIHRoZSBPQ00gYW5kIHRoZSBpbml0LWRhdGEgYXJlYSAoaW5jbC4gY2FjaGUpLiBUaGlzIHBhdGNoCisgICAgZml4ZXMgdGhpcyBwcm9ibGVtLgorCisgICAgU2lnbmVkLW9mZi1ieTogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorCitjb21taXQgODZiYTk5ZTM0MTk0Mzk0MDUyZDI0YzA0ZGM0MGQxMjYzZDI5YTI2ZgorQXV0aG9yOiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CitEYXRlOglUdWUgSnVuIDE5IDE2OjQwOjU4IDIwMDcgKzAyMDAKKworICAgIFtwcGM0eHhdIENoYW5nZSBib2FyZC9hbWNjL2FjYWRpYS9jcHIuYyB0byBwbGwuYworCisgICAgU2lnbmVkLW9mZi1ieTogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorCitjb21taXQgZTczODQ2YjdjZjFlMjlhZTYzNWJmOWJiNTU3MDI2OTY2M2RmMmVlNQorQXV0aG9yOiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CitEYXRlOglGcmkgSnVuIDE1IDExOjMzOjQxIDIwMDcgKzAyMDAKKworICAgIFtwcGM0eHhdIENoYW5nZSBsd21vbjUgcG9ydCB0byB3b3JrIHdpdGggcmVjZW50IDQ0MCBleGNlcHRpb24gcmV3b3JrCisKKyAgICBOb3cgQ09ORklHXzQ0MCBoYXMgdG8gYmUgZGVmaW5lZCBpbiBhbGwgUFBDNDQwIGJvYXJkIGNvbmZpZyBmaWxlcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KKworY29tbWl0IGVmYTM1Y2YxMmQ5MTRkNGNhYmE5NDJhY2Q1YTZjNDVmMjE3ZGUzMDIKK0F1dGhvcjogR3J6ZWdvcnogQmVybmFja2kgPGdqYkBzZW1paGFsZi5jb20+CitEYXRlOglGcmkgSnVuIDE1IDExOjE5OjI4IDIwMDcgKzAyMDAKKworICAgIHBwYzR4eDogQ2xlYW4gdXAgNDQwIGV4Y2VwdGlvbnMgaGFuZGxpbmcKKworICAgIC0gSW50cm9kdWNlZCBkZWRpY2F0ZWQgc3dpdGNoZXMgZm9yIGJ1aWxkaW5nIDQ0MCBhbmQgNDA1IGltYWdlcyByZXF1aXJlZAorICAgICAgZm9yIDQ0MC1zcGVjaWZpYyBtYWNoaW5lIGluc3RydWN0aW9ucyBsaWtlICdyZm1jaScgZXRjLgorCisgICAgLSBFeGNlcHRpb24gdmVjdG9ycyBtb3ZlZCB0byB0aGUgcHJvcGVyIGxvY2F0aW9uIChfc3RhcnQgbW92ZWQgYXdheSBmcm9tCisgICAgICB0aGUgY3JpdGljYWwgZXhjZXB0aW9uIGhhbmRsZXIgc3BhY2UsIHdoaWNoIGl0IG9jY3VwaWVkKQorCisgICAgLSBDcml0aWNhbElucHV0IG5vdyBzZXJ2aWNlZCAod2l0aCBkZWZhdWx0IGhhbmRsZXIpCisKKyAgICAtIE1hY2hpbmVDaGVjayBwcm9wZXJseSBzZXJ2aWNlZCAoYWRkZWQgYSBkZWRpY2F0ZWQgaGFuZGxlciBhbmQgcmV0dXJuCisgICAgICBzdWJyb3V0aW5lKQorCisgICAgLSBPdmVyYWxsIGNsZWFudXAgb2YgZXhjZXB0aW9ucyBkZWNsYXJlZCB3aXRoIFNURF9FWENFUFRJT04gbWFjcm8gKHVudXNlZCwKKyAgICAgIHVuaGFuZGxlZCBhbmQgdGhvc2Ugbm90IHJlbGV2YW50IGZvciA0eHggd2VyZSBlbGltaW5hdGVkKQorCisgICAgLSBFbGltaW5hdGVkIExpbnV4IGxlZnRvdmVycywgcmVtb3ZlZCBkZWFkIGNvZGUKKworICAgIFNpZ25lZC1vZmYtYnk6IEdyemVnb3J6IEJlcm5hY2tpIDxnamJAc2VtaWhhbGYuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IFJhZmFsIEphd29yb3dza2kgPHJhakBzZW1paGFsZi5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorCitjb21taXQgYjc2NWZmYjc3M2Y1YTNjZDVhYTk0ZWM3NmI2YTA1Mjc2YjhjZDViMgorQXV0aG9yOiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CitEYXRlOglGcmkgSnVuIDE1IDA4OjE4OjAxIDIwMDcgKzAyMDAKKworICAgIFtwcGM0eHhdIEFkZCBpbml0aWFsIGx3bW9uNSBib2FyZCBzdXBwb3J0CisKKyAgICBUaGlzIHBhdGNoIGFkZHMgaW5pdGlhbCBzdXBwb3J0IGZvciB0aGUgTGllYmhlcnIgbHdtb241IGJvYXJkIGV1cWlwcGVkCisgICAgd2l0aCBhbiBBTUNDIDQ0MEVQeCBQb3dlclBDLgorCisgICAgU2lnbmVkLW9mZi1ieTogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorCitjb21taXQgODVmNzM3Mzc2ZDVmZjNkNWYwZDQ1YThiNjU3Njg2MzI2ZDE3NTMwNworQXV0aG9yOiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CitEYXRlOglGcmkgSnVuIDE1IDA3OjM5OjQzIDIwMDcgKzAyMDAKKworICAgIFtwcGM0eHhdIEV4dGVuZCA0NHggR1BJTyBzZXR1cCB3aXRoIGRlZmF1bHQgb3V0cHV0IHN0YXRlCisKKyAgICBUaGUgYm9hcmQgY29uZmlnIGFycmF5IENGR180NDBfR1BJT19UQUJMRSBmb3IgdGhlIHBwYzQ0MCBHUElPIHNldHVwCisgICAgaXMgZXh0ZW5kZWQgd2l0aCB0aGUgZGVmYXVsdCBHUElPIG91dHB1dCBzdGF0ZSAobGV2ZWwpLgorCisgICAgU2lnbmVkLW9mZi1ieTogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorCitjb21taXQgZGJjYTIwODUxOGU1ZTdmMDFhNjQyMDU4OGQxY2Q2ZTYwZGI3NGMyYgorQXV0aG9yOiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CitEYXRlOglUaHUgSnVuIDE0IDExOjE0OjMyIDIwMDcgKzAyMDAKKworICAgIFtwcGM0eHhdIEV4dGVuZCBwcm9ncmFtX3RsYigpIHdpdGggdmlydHVhbCAmIHBoeXNpY2FsIGFkZHJlc3NlcworCisgICAgTm93IHByb2dyYW1fdGxiKCkgYWxsb3dzIHRvIHByb2dyYW0gYSBUTEIgKG9yIG11bHRpcGxlKSB3aXRoCisgICAgZGlmZmVyZW50IHZpcnR1YWwgYW5kIHBoeXNpY2FsIGFkZHJlc3Nlcy4gV2l0aCB0aGlzIGNoYW5nZSwgbm93IG9uZQorICAgIHBoeXNpY2FsIHJlZ2lvbiAoZS5nLiBTRFJBTSkgY2FuIGJlIG1hcHBlZCAyIHRpbWVzLCBvbmNlIHdpdGggY2FjaGVzCisgICAgZGlhYmxlZCBhbmQgb25jZSB3aXRoIGNhY2hlcyBlbmFibGVkLgorCisgICAgU2lnbmVkLW9mZi1ieTogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorCitjb21taXQgOTkxMjEyMWY3ZWQ4MDRlYTU4ZmQ2MmYzZjIzMGI1ZGNmYzM1N2Q4OAorQXV0aG9yOiBEZXRsZXYgWnVuZGVsIDxkenVAZGVueC5kZT4KK0RhdGU6CVdlZCBNYXkgMjMgMTk6MDI6NDEgMjAwNyArMDIwMAorCisgICAgQ2hhbmdlICdyZXBlYXRhYmxlJyBhdHRyaWJ1dGUgb2Ygc29tZSBjb21tYW5kcyB0byBzZW5zaWJsZSB2YWx1ZXMuCisKKyAgICBNb3N0IHByb21pbmVudGx5IHRoaXMgY2hhbmdlcyAnZXJhc2UnIHRvIGJlIG5vbi1yZXBlYXRhYmxlLgorCisgICAgU2lnbmVkLW9mZi1ieTogRGV0bGV2IFp1bmRlbCA8ZHp1QGRlbnguZGU+CisKK2NvbW1pdCA1YWZiMjAyMDkzZjZhMDAxNzk3ZGI5MmNmNjk1YjkzYTcwZWE5YWI0CitBdXRob3I6IERldGxldiBadW5kZWwgPGR6dUBkZW54LmRlPgorRGF0ZToJV2VkIE1heSAyMyAxODo0Nzo0OCAyMDA3ICswMjAwCisKKyAgICBGaXggJ3J1bicgbm90IHRvIGNvbnRpbnVlIGFmdGVyIGludGVycnVwdGVkIGNvbW1hbmQKKworICAgIFNpZ25lZC1vZmYtYnk6IERldGxldiBadW5kZWwgPGR6dUBkZW54LmRlPgorCitjb21taXQgOWI3NDY0YTJjODg2MTRlMTA2MWY1MDljNDg5MzBhM2QyNDBkMWEzNQorQXV0aG9yOiBKYXNvbiBKaW4gPEphc29uLmppbkBmcmVlc2NhbGUuY29tPgorRGF0ZToJTW9uIEp1biAxMSAxNToxNDoyNCAyMDA3ICswMjAwCisKKyAgICBVU0I6IFRoaXMgcGF0Y2ggZml4IHJlYWRsIGluIG9oY2kgc3dhcCByZWcgYWNjZXNzLgorCisgICAgU2lnbmVkLW9mZi1ieTogSmFzb24gSmluIDxKYXNvbi5qaW5AZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDhmODQxNmZhZGE5ZmFmOTRiOWE5MmYyMWZlNjAwMDY0M2NiNTIxZDUKK0F1dGhvcjogQmFydGxvbWllaiBTaWVrYSA8dHVyQHNlbWloYWxmLmNvbT4KK0RhdGU6CUZyaSBKdW4gOCAxNDo1MjoyMiAyMDA3ICswMjAwCisKKyAgICBUUU01MjAwOiBBZGQgRmxhdCBEZXZpY2UgVHJlZSBzdXBwb3J0LCB1cGRhdGUgZGVmYXVsdCBlbnYuIGFjY29yZGluZ2x5LgorCisgICAgU2lnbmVkLW9mZi1ieTogSmFuIFdyb2JlbCA8d3JyQHNlbWloYWxmLmNvbT4KKyAgICBBY2tlZC1ieTogQmFydGxvbWllaiBTaWVrYSA8dHVyQHNlbWloYWxmLmNvbT4KKworY29tbWl0IDkwNDVmMzNjMDIzZjY5ODY2MGEyZTQ1ZDFiMjE5NGMwNzExYWJlYmMKK0F1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KK0RhdGU6CUZyaSBKdW4gOCAxMDoyNDo1OCAyMDA3ICswMjAwCisKKyAgICBGaXggY29uZmlnIHByb2JsZW1zIG9uIFNDMyBib2FyZDsgbWFrZSBpZGVfcmVzZXRfdGltZW91dCB3b3JrLgorCitjb21taXQgZmJhM2ZiMDQ0OWI4YTU0NTQyYWVkMWU3MjlkZTc2ZTdmNWEyZmYxYgorQXV0aG9yOiBCZW5vw650IE1vbmluIDxibW9uaW5AYWRlbmVvLmV1PgorRGF0ZToJRnJpIEp1biA4IDA5OjU1OjI0IDIwMDcgKzAyMDAKKworICAgIFtQQVRDSF0gZml4IGdwaW8gc2V0dGluZyB3aGVuIHVzaW5nIENGR180NDBfR1BJT19UQUJMRQorCisgICAgU2V0IHRoZSBjb3JyZWN0IHZhbHVlIGluIEdQSU94X1RDUiB3aGVuIGNvbmZpZ3VyaW5nIHRoZSBncGlvCisgICAgd2l0aCBDRkdfNDQwX0dQSU9fVEFCTEUuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBCZW5vaXQgTW9uaW4gPGJtb25pbkBhZGVuZW8uZXU+CisgICAgU2lnbmVkLW9mZi1ieTogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorCitjb21taXQgNzI1NjcxY2NkMmNkMDRjOWViYzUwYzllNWE5NGRkOGNiYWRlNjZiNworQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorRGF0ZToJV2VkIEp1biA2IDE2OjI2OjU2IDIwMDcgKzAyMDAKKworICAgIENvZGluZyBTdHlsZSBjbGVhbnVwOyBnZW5lcmF0ZSBuZXcgQ0hBTkdFTE9HIGZpbGUuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorCitjb21taXQgMTlkNzYzYzM1ZTBiNTU2OGVhZjBiOGFkYmY3YTY4Y2NmZTdmYTI0MworQXV0aG9yOiBNYXJrdXMgS2xvdHpidWVjaGVyIDxta0BkZW54LmRlPgorRGF0ZToJV2VkIEp1biA2IDExOjQ5OjQ0IDIwMDcgKzAyMDAKKworICAgIFRSQUIsIFVTQjogdXBkYXRlIHRyYWIgYm9hcmQgY29uZmlndXJhdGlvbiBmb3IgdXNlIG9mIGdlbmVyaWMgb2hjaSBkcml2ZXIKKworY29tbWl0IGRhY2U0NWFjZDFjMTM1N2RhYTkzMjIwOTlkMDdjOWE5ZTA4YjAwMjQKK0F1dGhvcjogTWFya3VzIEtsb3R6YnVlY2hlciA8bWtAZGVueC5kZT4KK0RhdGU6CVdlZCBKdW4gNiAxMTo0OTo0MyAyMDA3ICswMjAwCisKKyAgICBVU0I6IG9oY2kgZml4ZXMgYW5kIGNsZWFudXAgZm9yIHBwYzR4eCBhbmQgeW9zZW1pdGUgYm9hcmQuCisKK2NvbW1pdCA3MjY1NzU3MGI2MTYzNWM3NGZhMGMzZjBlOWU3ZDA2NzFhOWQwOGRmCitBdXRob3I6IE1hcmt1cyBLbG90emJ1ZWNoZXIgPG1rQGRlbnguZGU+CitEYXRlOglXZWQgSnVuIDYgMTE6NDk6NDMgMjAwNyArMDIwMAorCisgICAgVVNCOiBvaGNpIGZpeGVzIGFuZCBjbGVhbnVwIGZvciBtcGM1eHh4IGFuZCBJY2VDdWJlIGJvYXJkIGNvbmZpZworCitjb21taXQgZmM0M2JlNDc4ZjJhYTM3Y2UzOGFjZDg1MzU1MDM4ODY2ZTQxNjJhZgorQXV0aG9yOiBNYXJrdXMgS2xvdHpidWVjaGVyIDxta0BkZW54LmRlPgorRGF0ZToJV2VkIEp1biA2IDExOjQ5OjM1IDIwMDcgKzAyMDAKKworICAgIFVTQi9PSENJOiBlbmRpYW5uZXNzIGNsZWFudXAgaW4gdGhlIGdlbmVyaWMgb2hjaSBkcml2ZXIKKworY29tbWl0IGM0NDBiZmU2ZDZkOTJkNjY0NzhhN2U4NDQwMmIzMWY0ODQxMzYxN2IKK0F1dGhvcjogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorRGF0ZToJV2VkIEp1biA2IDExOjQyOjEzIDIwMDcgKzAyMDAKKworICAgIHBwYzR4eDogQWRkIE5BTkQgYm9vdGluZyBzdXBwb3J0IGZvciBBTUNDIEFjYWRpYSAoNDA1RVopIGV2YWwgYm9hcmQKKworICAgIFRoaXMgcGF0Y2ggYWRkcyBOQU5EIGJvb3Rpbmcgc3VwcG9ydCBmb3IgdGhlIEFNQ0MgQWNhZGlhIGV2YWwgYm9hcmQuCisKKyAgICBQbGVhc2UgbWFrZSBzdXJlIHRvIGNvbmZpZ3VyZSBqdW1wZXIgSjcgdG8gcG9zaXRpb24gMi0zIHdoZW4gYm9vdGluZworICAgIGZyb20gTk9SLCBhbmQgdG8gcG9zaXRpb24gMS0yIHdoZW4gYm9vdGluZyBmb3IgTkFORC4KKworICAgIEkgYWxzbyBhZGRlZCBhIGJvYXJkIGNvbW1hbmQgdG8gY29uZmlndXJlIHRoZSBJMkMgYm9vdHN0cmFwIEVFUFJPTQorICAgIHZhbHVlcy4gUmlnaHQgbm93IG9ubHkgMjY3TUh6IGlzIHN1cHBvcnQgZm9yIGJvb3RpbmcgZWl0aGVyIHZpYSBOT1IKKyAgICBvciBOQU5EIEZMQVNILiBIZXJlIHRoZSB1c2FnZToKKworICAgID0+IGJvb3RzdHJhcCAyNjcgbm9yCTt0byBjb25maWd1cmUgdGhlIGJvYXJkIGZvciAyNjdNSHogTk9SIGJvb3RpbmcKKyAgICA9PiBib290c3RyYXAgMjY3IG5hbmQJO3RvIGNvbmZpZ3VyZSB0aGUgYm9hcmQgZm9yIDI2N01IeiBOTkFORCBib290aW5nCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CisKK2NvbW1pdCAxODEzNTEyNWY5MDk5NDhiODVkMWQ2ODgxYWI0YWMwZWZiNGExYzU4CitBdXRob3I6IFJvZG9sZm8gR2lvbWV0dGkgPGdpb21ldHRpQGxpbnV4Lml0PgorRGF0ZToJV2VkIEp1biA2IDEwOjA4OjE0IDIwMDcgKzAyMDAKKworICAgIEZpbGVzIGluY2x1ZGUvbGludXgvYnl0ZW9yZGVyL3tiaWcsbGl0dGxlfV9lbmRpYW4uaCBkZWZpbmUKKyAgICBfX0JJR19FTkRJQU4gYW5kIF9fTElUVExFX0VORElBTi4KKworICAgIFNpZ25lZC1vZmYtYnk6IFJvZG9sZm8gR2lvbWV0dGkgPGdpb21ldHRpQGxpbnV4Lml0PgorCitjb21taXQgYTgxZDFjMGI4NWIxM2U5ZDQ1ZjJkODdkZTk2YTUxYTZlMGVmMGY4MgorQXV0aG9yOiBaaGFuZyBXZWkgPHdlaS56aGFuZ0BmcmVlc2NhbGUuY29tPgorRGF0ZToJV2VkIEp1biA2IDEwOjA4OjE0IDIwMDcgKzAyMDAKKworICAgIEFkZCBVU0IgUENJLU9IQ0ksIFVTQiBrZXlib2FyZCBhbmQgZXZlbnQgcG9sbCBzdXBwb3J0IHRvIHRoZQorICAgIE1QQzg2NDFIUENOIGJvYXJkIGNvbmZpZyBmaWxlLgorCisgICAgU2lnbmVkLW9mZi1ieTogWmhhbmcgV2VpIDx3ZWkuemhhbmdAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDRkYWUxNGNlOGZiZGYzODAwMTdkYzU0ZjE3MjIxOGU3ZDJhY2M4ODkKK0F1dGhvcjogWmhhbmcgV2VpIDx3ZWkuemhhbmdAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVdlZCBKdW4gNiAxMDowODoxNCAyMDA3ICswMjAwCisKKyAgICBVU0IgUENJLU9IQ0ksIGludGVycnVwdCBwaXBlIGFuZCB1c2IgZXZlbnQgcG9sbCBzdXBwb3J0CisKKyAgICBUaGlzIHBhdGNoIGFkZGVkIFVTQiBQQ0ktT0hDSSBjaGlwcyBzdXBwb3J0LCBpbnRlcnJ1cHQgcGlwZSBzdXBwb3J0CisgICAgYW5kIHVzYiBldmVudCBwb2xsIHN1cHBvcnQuIEZvciBzdXBwb3J0aW5nIHRoZSBVU0IgaW50ZXJydXB0IHBpcGUsIHRoZQorICAgIGdsb2JlIHVyYl9wcml2IGlzIG1vdmVkIHRvIHB1cmIgaW4gZWQgc3RydWN0LiBOb3csIHdlIGNhbiBwcm9jZXNzCisgICAgc2V2ZXJhbCB1cmJzIGF0IG9uZSB0aW1lLiBUaGUgaW50ZXJydXB0IHBpcGUgc3VwcG9ydCBjb2RlcyBhcmUgcG9ydGVkCisgICAgZnJvbSBMaW51eCBrZXJuZWwgMi40LgorCisgICAgU2lnbmVkLW9mZi1ieTogWmhhbmcgV2VpIDx3ZWkuemhhbmdAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IGZkY2ZhYTFiMDIyNjhiMjg5OWUzNzRiMzVhZGY5MzZjOTExYTQ3ZWIKK0F1dGhvcjogWmhhbmcgV2VpIDx3ZWkuemhhbmdAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVdlZCBKdW4gNiAxMDowODoxMyAyMDA3ICswMjAwCisKKyAgICBVU0IgZXZlbnQgcG9sbCBzdXBwb3J0CisKKyAgICBUaGlzIHBhdGNoIGFkZHMgVVNCIGV2ZW50IHBvbGwgc3VwcG9ydCwgd2hpY2ggY291bGQgYmUgdXNlZCBpbiB1c2JrYmQKKyAgICBhbmQgb3RoZXIgdXNiIGRldmljZXMgZHJpdmVyIHdoZW4gdGhlIGFzeW5jaHJvbm91cyBpbnRlcnJ1cHQKKyAgICBwcm9jZXNzaW5nIGlzIHN1cHBvcnRlZC4KKworICAgIFNpZ25lZC1vZmYtYnk6IFpoYW5nIFdlaSA8d2VpLnpoYW5nQGZyZWVzY2FsZS5jb20KKworY29tbWl0IDlhMWQwMGZhNDdjMWUwNWUzZmRiNjBiMzMyMTNhZjRlMThkNGMxOGUKK0F1dGhvcjogUm9kb2xmbyBHaW9tZXR0aSA8Z2lvbWV0dGlAbGludXguaXQ+CitEYXRlOglXZWQgSnVuIDYgMTA6MDg6MTIgMjAwNyArMDIwMAorCisgICAgSVNQMTE2eDogZGVsYXkgZm9yIGNyYXBweSBVU0Iga2V5cworCisgICAgVXNpbmcgc29tZSAodmVyeSkgc2xvdyBVU0Iga2V5cyBjYXVzZSB0aGUgVVNCIGhvc3QgY29udHJvbGxlciBidWZmZXJzCisgICAgYXJlIG5vdCByZWFkeSB0byBiZSByZWFkIGJ5IHRoZSBDUFUgc28gd2UgbmVlZCBhbiBleHRyYSBkZWxheSBiZWZvcmUKKyAgICByZWFkaW5nIHRoZSBVU0Igc3RvcmFnZSBkYXRhLgorCisgICAgU2lnbmVkLW9mZi1ieTogUm9kb2xmbyBHaW9tZXR0aSA8Z2lvbWV0dGlAbGludXguaXQ+CisKK2NvbW1pdCAwOTQ0NDE0MzY3MGM5YzIyNDNjYjdhYmE5ZjcwYjM3MTNkMzNiZWQxCitBdXRob3I6IE1hcmt1cyBLbG90emJ1ZWNoZXIgPG1rQGRlbnguZGU+CitEYXRlOglXZWQgSnVuIDYgMTA6MDg6MTIgMjAwNyArMDIwMAorCisgICAgQ2hhbmdlIGR1cGxpY2F0ZSB1c2JfY3B1X2luaXRfZmFpbCB0byB1c2JfYm9hcmRfaW5pdF9mYWlsCisKKyAgICBUaGFua3MgdG8gTGlldyBUc2kgQ2h1bmcgPFRzaS1jaHVuZy5MaWV3QGZyZWVzY2FsZS5jb20+IGZvciBwb2ludGluZworICAgIHRoaXMgb3V0LgorCisgICAgU2lnbmVkLW9mZi1ieTogTWFya3VzIEtsb3R6YnVlY2hlciA8bWtAZGVueC5kZT4KKworY29tbWl0IDMyOTIyY2RjNDcwZmRmZDM5YmVhMGMxYzRmNTgyZDNmYjM0MDQyMWUKK0F1dGhvcjogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVR1ZSBKdW4gNSAxMjozMDo1MiAyMDA3IC0wNTAwCisKKyAgICBtcGM4NjQxIGltYWdlIHNpemUgY2xlYW51cAorCisgICAgZTYwMCBkb2VzIG5vdCBoYXZlIGEgYm9vdHBnIHJlc3RyaWN0aW9uLgorICAgIE1vdmUgdGhlIHZlcnNpb24gc3RyaW5nIHRvIGJlZ2lubmluZyBvZiBpbWFnZSBhdCBmZmYwMDAwMC4KKyAgICBSZXNldHZlYy5TIGlzIG5vdCBuZWVkZWQuCisgICAgVXBkYXRlIGZsYXNoIGNvcHkgaW5zdHJ1Y3Rpb25zLgorICAgIEFkZCB0ZnRwZmxhc2ggZW52IHZhcmlhYmxlCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBFZCBTd2FydGhvdXQgPEVkLlN3YXJ0aG91dEBmcmVlc2NhbGUuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCBlM2NiZTFmOTNjNTcyMmY4ZWJiYWQ0NjhlMzBjMDY5YTJiNTExMDk3CitBdXRob3I6IEJlbm/DrnQgTW9uaW4gPGJtb25pbkBhZGVuZW8uZXU+CitEYXRlOglNb24gSnVuIDQgMDg6MzY6MDUgMjAwNyArMDIwMAorCisgICAgW1BBVENIXSBGaXggcHBjNHh4IGJvb3RzdHJhcCBsZXR0ZXIgZGlzcGxheWVkIG9uIHN0YXJ0dXAKKworICAgIFRoZSBhdHRhY2hlZCBwYXRjaCBpcyBtYWlubHkgY29zbWV0aWMsIGFsbG93aW5nIHUtYm9vdCB0bworICAgIGRpc3BsYXkgdGhlIGNvcnJlY3QgYm9vdHN0cmFwIG9wdGlvbiBsZXR0ZXIgYWNjb3JkaW5nIHRvIHRoZQorICAgIGRhdGFzaGVldHMuCisKKyAgICBUaGUgb3JpZ2luYWwgcGF0Y2ggd2FzIGV4dGVuZGVkIHdpdGggNDA1RVogc3VwcG9ydCBieSBTdGVmYW4KKyAgICBSb2VzZS4KKworICAgIFNpZ25lZC1vZmYtYnk6IEJlbm9pdCBNb25pbiA8Ym1vbmluQGFkZW5lby5ldT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CisKK2NvbW1pdCA1YjEzMTNmYjI3NThmZmNlOGI2MjQ0NTdmNzc3ZDhjYzY3MDk2MDhkCitBdXRob3I6IE5pa2l0YSBWLiBZb3VzaGNoZW5rbyA8eW91c2hAZGViaWFuLm9yZz4KK0RhdGU6CVdlZCBNYXkgMjMgMTI6NDU6MTkgMjAwNyArMDQwMAorCisgICAgZml4IGNvbXBpbGF0aW9uIHByb2JsZW0gZm9yIG1wYzgzNDlpdHggQ0ZHX1JBTUJPT1QKKworICAgIEN1cnJlbnQgaW5jbHVkZS9jb25maWdzL01QQzgzNDlJVFguaCBkb2VzIGNvbnRhaW4gc29tZSBzdXBwb3J0IGZvciBidWlsZGluZworICAgIGltYWdlIHRoYXQgd2lsbCBiZSBzdGFydGVkIGZyb20gbWVtb3J5ICh3aXRob3V0IHB1dHRpbmcgaW4gaW50byBmbGFzaCkuCisgICAgSXQgY291bGQgYmUgdHJpZ2dlcmVkIGJ5IGJ1aWxkaW5nIHdpdGggVEVYVF9CQVNFIHNldCB0byBhIGxvdyB2YWx1ZS4KKworICAgIEhvd2V2ZXIsIHRoaXMgc3VwcG9ydCBpcyBpbmNvbXBsZXRlOiB1c2luZyBvZiBsb3cgVEVYVF9CQVNFIGNhdXNlcworICAgIGRlZmluaW5nIGNvbmZpZ3VyYXRpb24gbWFjcm9zIGluIGluY29uc2lzdGVudCB3YXksIHdoaWNoIGxhdGVyIGxlYWRzCisgICAgdG8gY29tcGlsYXRpb24gZXJyb3JzLiBJbiBwYXJ0aWN1bGFyLiBmbGFzaCBzdXBwb3J0IGlzIGJlaW5nIGRpc2FibGVkLAorICAgIGJ1dCB0aGVuIGZsYXNoIHN0cnVjdHVyZXMgZ2V0IHJlZmVyZW5jZWQuCisKKyAgICBUaGlzIHBhdGNoIGZpeGVzIHRoaXMsIG1ha2luZyBpdCBwb3NzaWJsZSB0byBidWlsZCB3aXRoIGxvdyBURVhUX0JBU0UuCisKKyAgICBTaWduZWQtT2ZmLUJ5OiBOaWtpdGEgWW91c2hjaGVua28gPHlvdXNoQGRlYmlhbi5vcmc+CisKKyAgICBTaWduZWQtb2ZmLWJ5OiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgOGEzNjRmMDk3MGRlNDk5NDlkNjM1ZTYwYWNjZjQ2M2M2NDQzZWY4YworQXV0aG9yOiBOaWtpdGEgVi4gWW91c2hjaGVua28gPHlvdXNoQGRlYmlhbi5vcmc+CitEYXRlOglXZWQgTWF5IDIzIDEyOjQ1OjI1IDIwMDcgKzA0MDAKKworICAgIGFkZCBtaXNzaW5nICdjb25zb2xlJyB2YXIgdG8gZGVmYXVsdCBtcGM4MzQ5aXR4IGNvbmZpZworCisgICAgU2lnbmVkLW9mZi1ieTogS2ltIFBoaWxsaXBzIDxraW0ucGhpbGxpcHNAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDE4ZDE1NmViMzdjOTBmYWRjOGVjN2E4MWEzYjg5MTc2MTYxZjg1YjcKK0F1dGhvcjogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorRGF0ZToJRnJpIEp1biAxIDE2OjE4OjE3IDIwMDcgKzAyMDAKKworICAgIHBwYzR4eDogQWRkIG1pc3NpbmcgZmlsZSBmb3IgQmFtYm9vIE5BTkQgYm9vdGluZyBzdXBwb3J0CisKKyAgICBTaWduZWQtb2ZmLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CisKK2NvbW1pdCAxNTVhOTY0NzhhMDg4MWU2ZGE5NmNiYmJjZjM0OTUyZDZhM2IxYjRiCitBdXRob3I6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KK0RhdGU6CUZyaSBKdW4gMSAxNTo1ODoxOSAyMDA3ICswMjAwCisKKyAgICBwcGM0eHg6IFVuZG8gU2VxdW9pYSBwYXRjaCBmb3IgZHluYW1pYyBFQkMgc3BlZWQgc3VwcG9ydCBvZiA4M01IegorCisgICAgVGhpcyBwYXRjaCB1bmRvZXMgdGhlIHBhdGNoIGJ5IEplZmYgTWFubiB3aXRoIGNvbW1pdC1pZCBhZGE0Njk3ZC4gQXMKKyAgICBzdWdnZXN0ZWQgYnkgQU1DQyBpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gZHluYW1pY2FsbHkgY2hhbmdlIHRoZSBFQkMKKyAgICBzcGVlZCBhZnRlciBib290dXAuIFNvIHdlIHVuZG8gdGhpcyBjaGFuZ2UgdG8gYmUgb24gdGhlIHNhZmUgc2lkZS4KKworICAgIFNpZ25lZC1vZmYtYnk6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KKworY29tbWl0IDlkOTA5NjA0M2U4ZjcxM2Q0YmYxNzQzZDMyZTE0NTllNmExMTY0NGIKK0F1dGhvcjogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorRGF0ZToJRnJpIEp1biAxIDE1OjI5OjA0IDIwMDcgKzAyMDAKKworICAgIHBwYzR4eDogVXBkYXRlIFNlcXVvaWEgTkFORCBib290aW5nIHN1cHBvcnQgd2l0aCBFQ0MKKworICAgIFNpZ25lZC1vZmYtYnk6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KKworY29tbWl0IGNmOTU5YzdkNjY4NzU2N2MzMDhlMzY2ZTk1ODFlMWE1YWZmNWNjNWIKK0F1dGhvcjogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorRGF0ZToJRnJpIEp1biAxIDE1OjI3OjExIDIwMDcgKzAyMDAKKworICAgIHBwYzR4eDogQWRkIE5BTkQgYm9vdGluZyBzdXBwb3J0IGZvciBBTUNDIEJhbWJvbyAoNDQwRVApIGV2YWwgYm9hcmQKKworICAgIFRoaXMgcGF0Y2ggYWRkcyBOQU5EIGJvb3Rpbmcgc3VwcG9ydCBmb3IgdGhlIEFNQ0MgQmFtYm9vIGV2YWwgYm9hcmQuCisgICAgU2luY2UgdGhlIE5BTkQtU1BMIGJvb3QgaW1hZ2UgaXMgbGltaXRlZCB0byA0a2J5dGVzLCB0aGlzIHZlcnNpb24KKyAgICBvbmx5IHN1cHBvcnRzIHRoZSBvbmJvYXJkIDY0TUJ5dGVzIG9mIEREUi4gVGhlIERJTU0gbW9kdWxlcyBjYW4ndCBiZQorICAgIHN1cHBvcnRlZCwgc2luY2UgdGhlIHNldHVwIGNvZGUgZm9yIEkyQyBESU1NIGF1dG9kZXRlY3Rpb24gYW5kCisgICAgY29uZmlndXJhdGlvbiBpcyB0b28gYmlnIGZvciB0aGlzIE5BTkQgYm9vdGxvYWRlci4KKworICAgIFNpZ25lZC1vZmYtYnk6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KKworY29tbWl0IDQyYmU1NmY1M2M4YjEwNzg2OGU2MTI1Yzg1MjRhZTg0MjkzZTk1YTcKK0F1dGhvcjogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorRGF0ZToJRnJpIEp1biAxIDE1OjIzOjA0IDIwMDcgKzAyMDAKKworICAgIE5BTkQ6IEFkZCBFQ0Mgc3VwcG9ydCB0byBOQU5EIGJvb3Rpbmcgc3VwcG9ydCBpbiBuYW5kX3NwbC9uYW5kX2Jvb3QuYworCisgICAgVGhlIFUtQm9vdCBOQU5EIGJvb3Rpbmcgc3VwcG9ydCBpcyBub3cgZXh0ZW5kZWQgdG8gc3VwcG9ydCBFQ0MKKyAgICB1cG9uIGxvYWRpbmcgb2YgdGhlIE5BTkQgVS1Cb290IGltYWdlLgorCisgICAgVGVzdGVkIG9uIEFNQ0MgU2VxdW9pYSAoNDQwRVB4KSBhbmQgQmFtYm9vICg0NDBFUCkuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CisKK2NvbW1pdCBhNDcxZGIwN2ZiYjY1YTg0MWZmYzlmNGYxMTI1NjJiOTQ1MjMwZjk4CitBdXRob3I6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KK0RhdGU6CUZyaSBKdW4gMSAxNToxOToyOSAyMDA3ICswMjAwCisKKyAgICBwcGM0eHg6IFByZXBhcmUgQmFtYm9vIHBvcnQgZm9yIE5BTkQgYm9vdGluZyBzdXBwb3J0CisKKyAgICBUaGlzIHBhdGNoIHVwZGF0ZXMgdGhlICJub3JtYWwiIEJhbWJvbyBOT1IgYm9vdGluZyBwb3J0LCBzbworICAgIHRoYXQgaXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBjb21pbmcgc29vbiBOQU5EIGJvb3RpbmcKKyAgICBCYW1ib28gcG9ydC4KKworICAgIEl0IGFsc28gZW5hYmxlcyB0aGUgMm5kIE5BTkQgZmxhc2ggb24gdGhlIEJhbWJvby4KKworICAgIFNpZ25lZC1vZmYtYnk6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KKworY29tbWl0IDUzYWQwMjEwM2ZiOGJlNDEzOGE5OTM3YThhYjkxZmNkZmY3YjQ5ODcKK0F1dGhvcjogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorRGF0ZToJRnJpIEp1biAxIDE1OjE2OjU4IDIwMDcgKzAyMDAKKworICAgIHBwYzR4eDogVXBkYXRlIGluX2JlMzIoKSBmdW5jdGlvbnMgYW5kIGZyaWVuZHMgdG8gbGF0ZXN0IExpbnV4IHZlcnNpb24KKworICAgIFNpZ25lZC1vZmYtYnk6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KKworY29tbWl0IDkxZGEwOWNmYmNlMGMxZGUwNWQ2ZDg0YWE4MzYzZDY2NmZhN2VhM2MKK0F1dGhvcjogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorRGF0ZToJRnJpIEp1biAxIDE1OjE1OjEyIDIwMDcgKzAyMDAKKworICAgIE5BTkQ6IEFkZCBoYXJkd2FyZSBFQ0Mgc3VwcG9ydCB0byB0aGUgUFBDNHh4IE5BTkQgZHJpdmVyIG5kZmMuYworCisgICAgVGhpcyBwYXRjaCBhZGRzIGhhcmR3YXJlIEVDQyBzdXBwb3J0IHRvIHRoZSBOREZDIGRyaXZlci4gSXQgYWxzbworICAgIGNoYW5nZXMgdGhlIHJlZ2lzdGVyIGFjY2VzcyBmcm9tIHVzaW5nIHRoZSAic2ltcGxlIiBpbjMyL291dDMyCisgICAgZnVuY3Rpb25zIHRvIHRoZSBpbl9iZTMyL291dF9iZTMyIGZ1bmN0aW9ucywgd2hpY2ggbWFrZSBzdXJlCisgICAgdGhhdCB0aGUgYWNjZXNzIGlzIGNvcnJlY3RseSBzeW5jZWQuIFRoaXMgaXMgdGhlIG9ubHkgcmVjb21tZW5kZWQKKyAgICBhY2Nlc3MgdG8gU29DIHJlZ2lzdGVycyBpbiB0aGUgY3VycmVudCBMaW51eCBrZXJuZWwuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CisKK2NvbW1pdCAxN2I1ZTg2MjI4N2NjYTc2ZjE5ZGNmOGI3NDFlNjFhN2QwNjYxN2YyCitBdXRob3I6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KK0RhdGU6CUZyaSBKdW4gMSAxNToxMjoxNSAyMDA3ICswMjAwCisKKyAgICBOQU5EOiBVcGRhdGUgbmFuZF9lY2MuYyB0byBsYXRlc3QgTGludXggdmVyc2lvbgorCisgICAgVGhpcyBwYXRjaCB1cGRhdGVzIHRoZSBuYW5kX2VjYyBjb2RlIHRvIHRoZSBsYXRlc3QgTGludXggdmVyc2lvbi4KKyAgICBUaGUgbWFpbiByZWFzb24gZm9yIHRoaXMgaXMgdGhlIG1vcmUgY29tcGFjdCBjb2RlLiBUaGlzIG1ha2VzCisgICAgaXQgcG9zc2libGUgdG8gaW5jbHVkZSB0aGUgRUNDIGNvZGUgaW50byB0aGUgTkFORCBib290bG9hZGVyCisgICAgaW1hZ2UgKE5BTkRfU1BMKSBmb3IgUFBDNHh4LgorCisgICAgU2lnbmVkLW9mZi1ieTogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorCitjb21taXQgZDJkNDMyNzYwZDIxOTlkMGU4NTU4ZmRkOWQxNzg5YjgxMzFhYmNmNworQXV0aG9yOiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CitEYXRlOglGcmkgSnVuIDEgMTU6MDk6NTAgMjAwNyArMDIwMAorCisgICAgcHBjNHh4OiA0NHggRERSIGRyaXZlciBjb2RlIGNsZWFudXAgYW5kIHNtYWxsIGZpeCBmb3IgQmFtYm9vCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CisKK2NvbW1pdCBlNGJiZWQyODAzYTJhZDA1MjFjNzM2MmY1ZDNlMDY1Zjk5YWJhZWRjCitBdXRob3I6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KK0RhdGU6CUZyaSBKdW4gMSAxMzo0NToyNCAyMDA3ICswMjAwCisKKyAgICBwcGM0eHg6IENoYW5nZSBMdWFuIGNvbmZpZyBmaWxlIHRvIHN1cHBvcnQgRUNDCisKKyAgICBXaXRoIHRoZSB1cGRhdGVkIDQ0eCBERFIyIGRyaXZlciB0aGUgTHVhbiBib2FyZCBub3cgc3VwcG9ydHMKKyAgICBFQ0MgZ2VuZXJhdGlvbiBhbmQgY2hlY2tpbmcuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CisKK2NvbW1pdCA3MTg3ZGI3MzQ5MWM4ZGUwZmI1NmVmYjVlNTEzNGJhNWVjNDQzMDg5CitBdXRob3I6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KK0RhdGU6CUZyaSBKdW4gMSAxMzo0NTowMCAyMDA3ICswMjAwCisKKyAgICBwcGM0eHg6IFVwZGF0ZSA0NHhfc3BkX2RkcjIgY29kZSAoNDQwU1AvNDQwU1BlKQorCisgICAgQWRkIGNvbmZpZyBvcHRpb24gZm9yIDE4MCBkZWdyZWUgYWR2YW5jZSBjbG9jayBjb250cm9sIGFzIG5lZWRlZAorICAgIGZvciB0aGUgQU1DQyBMdWFuIGV2YWwgYm9hcmQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CisKK2NvbW1pdCBlZTE1Mjk4MzhhYmJmYWEzNWYxNGUzZmZiZWFhYmE2OTMxNTk0NzVmCitBdXRob3I6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CitEYXRlOglUaHUgTWF5IDMxIDE3OjIwOjA5IDIwMDcgKzAyMDAKKworICAgIEFkZCBzdXBwb3J0IGZvciBTVFggR1AzU1NBIChzdHhzc2EpIEJvYXJkIHdpdGggNCBNaUIgZmxhc2guCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorCitjb21taXQgNzA0OTI4OGZiMWYxNmYxYjMxNzE0MDIyNmNkZWJkMDdiZDQxNjM5NQorQXV0aG9yOiBCYXJ0bG9taWVqIFNpZWthIDx0dXJAc2VtaWhhbGYuY29tPgorRGF0ZToJU3VuIE1heSAyNyAxNzoyNjo0NiAyMDA3ICswMjAwCisKKyAgICBNb3Rpb24tUFJPOiBDb2RlIGNsZWFudXAsIGZpeCBvZiBhIHR5cG8gaW4gT0ZfU1RET1VUX1BBVEguCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBCYXJ0bG9taWVqIFNpZWthIDx0dXJAc2VtaWhhbGYuY29tPgorCitjb21taXQgNDUyMGZkNGQyYzQ1MGRhNDk2MzcyMTZhYTBlNTM3MzliNjFjNjBhYworQXV0aG9yOiBCYXJ0bG9taWVqIFNpZWthIDx0dXJAc2VtaWhhbGYuY29tPgorRGF0ZToJU3VuIE1heSAyNyAxNzowNjozNiAyMDA3ICswMjAwCisKKyAgICBNb3Rpb24tUFJPOiBBZGQgc3VwcG9ydCBmb3IgcmVkdW5kYW50IGVudmlyb25tZW50LgorCisgICAgRW5hYmxlIHJlZHVuZGFudCBlbnZpcm9ubWVudCwgYWRkIGEgTVREIHBhcnRpdGlvbiBmb3IgaXQ7IGFsc28gYWRkIGVudi4KKyAgICB2YXJpYWJsZSBjb21tYW5kIGZvciBwYXNzaW5nIE1URCBwYXJ0aXRpb25zIHRvIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLgorCisgICAgU2lnbmVkLW9mZi1ieTogUGlvdHIgS3J1c3p5bnNraSA8cHBrQHNlbWloYWxmLmNvbT4KKyAgICBBY2tlZC1ieTogQmFydGxvbWllaiBTaWVrYSA8dHVyQHNlbWloYWxmLmNvbT4KKworY29tbWl0IGEyNmVhYmVlYzMxNzQ2ZjA2ZDMwOTEwMzY5MDg5MjgwNTY5NmUzNDQKK0F1dGhvcjogQmFydGxvbWllaiBTaWVrYSA8dHVyQHNlbWloYWxmLmNvbT4KK0RhdGU6CVN1biBNYXkgMjcgMTc6MDU6MTEgMjAwNyArMDIwMAorCisgICAgTW90aW9uLVBSTzogQ2hhbmdlIG1heGltdW0gY29uc29sZSBidWZmZXIgc2l6ZSBmcm9tIDI1NiB0byAxMDI0IGJ5dGVzLgorCisgICAgQWxsb3cgcGFzc2luZyBsb25nZXIgY29tbWFuZCBsaW5lIHRvIHRoZSBrZXJuZWwgLSB1c2VmdWwgZXNwZWNpYWxseQorICAgIGZvciBwYXNzaW5nIE1URCBwYXJ0aXRpb24gbGF5b3V0LgorCisgICAgU2lnbmVkLW9mZi1ieTogUGlvdHIgS3J1c3p5bnNraSA8cHBrQHNlbWloYWxmLmNvbT4KKyAgICBBY2tlZC1ieTogQmFydGxvbWllaiBTaWVrYSA8dHVyQHNlbWloYWxmLmNvbT4KKworY29tbWl0IDkxNjBiOTZmNzE0ODNhMTE2ZGU4MWM2ODk4NWU4ZWUzMDZkMzY3NjQKK0F1dGhvcjogQmFydGxvbWllaiBTaWVrYSA8dHVyQHNlbWloYWxmLmNvbT4KK0RhdGU6CVN1biBNYXkgMjcgMTc6MDQ6MTggMjAwNyArMDIwMAorCisgICAgRml4OiBBZGQgbWlzc2luZyBOVUxMIHRlcm1pbmF0aW9uIGluIHN0cmluZ3MgZXhwYW5kZWQgYnkgbWFjcm9zIHBhcnNlci4KKworICAgIFNpZ25lZC1vZmYtYnk6IFBpb3RyIEtydXN6eW5za2kgPHBwa0BzZW1paGFsZi5jb20+CisgICAgQWNrZWQtYnk6IEJhcnRsb21pZWogU2lla2EgPHR1ckBzZW1paGFsZi5jb20+CisKK2NvbW1pdCA2MzBlYzg0YWVmNzIyOGZjMWRiZmIzOGRlYzc4NTQxNDAzYTc4NmNkCitBdXRob3I6IEJhcnRsb21pZWogU2lla2EgPHR1ckBzZW1paGFsZi5jb20+CitEYXRlOglTdW4gTWF5IDI3IDE3OjAzOjM3IDIwMDcgKzAyMDAKKworICAgIE1vdGlvbi1QUk86IFVwZGF0ZSBFRVBST00ncyBwYWdlIHdyaXRlIGJpdHMgYW5kIHdyaXRlIGRlbGF5LgorCisgICAgQ2hhbmdlIEVFUFJPTSBjb25maWd1cmF0aW9uIGFjY29yZGluZyB0byB0aGUgZGF0YXNoZWV0OiAiVGhlIDI0QzAxQSBhbmQgMjRDMDJBCisgICAgaGF2ZSBhIHBhZ2Ugd3JpdGUgY2FwYWJpbGl0eSBvZiB0d28gYnl0ZXMiLCBhbmQgIlRoaXMgZGV2aWNlIG9mZmVycyBmYXN0ICgxbXMpCisgICAgYnl0ZSB3cml0ZSIuIEFkZCAzbXMgb2YgZXh0cmEgZGVsYXkuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBQaW90ciBLcnVzenluc2tpIDxwcGtAc2VtaWhhbGYuY29tPgorICAgIEFja2VkLWJ5OiBCYXJ0bG9taWVqIFNpZWthIDx0dXJAc2VtaWhhbGYuY29tPgorCitjb21taXQgYzAwMTI1ZTA3YzFlYmMxMjViYWI0MGUxZTE4YmNlZWQ4YmUwYzE2MgorQXV0aG9yOiBCYXJ0bG9taWVqIFNpZWthIDx0dXJAc2VtaWhhbGYuY29tPgorRGF0ZToJU3VuIE1heSAyNyAxNjo1ODo0NSAyMDA3ICswMjAwCisKKyAgICBNUEM1WFhYLCBNb3Rpb24tUFJPOiBGaXggUEhZIGluaXRpYWxpemF0aW9uIHByb2JsZW0uCisKKyAgICBBZnRlciBiZWluZyByZXNldCBpbiBtcGM1eHh4X2ZlY19pbml0X3BoeSgpLCBQSFkgZ29lcyBpbnRvIEZYIG1vZGUsIGluIHdoaWNoCisgICAgbmV0d29ya2luZyBkb2VzIG5vdCBmdW5jdGlvbi4gVGhpcyBjb21taXQgc3dpdGNoZXMgUEhZIHRvIFRYIG1vZGUgYnkgY2xlYXJpbmcKKyAgICB0aGUgRlhfU0VMIGJpdCBvZiBNb2RlIENvbnRyb2wgUmVnaXN0ZXIuIEl0IGFsc28gcmV2ZXJzZXMgY29tbWl0CisgICAgMDA4ODYxYTJmM2VmMmMwNjI3NDRkNzMzNzg3YzdlNTMwYTFiODc2MSwgaS5lLiwgYSB0ZW1wb3Jhcnkgd29ya2Fyb3VuZC4KKworICAgIFNpZ25lZC1vZmYtYnk6IEdyemVnb3J6IEJlcm5hY2tpIDxnamJAc2VtaWhhbGYuY29tPgorICAgIEFja2VkLWJ5OiBCYXJ0bG9taWVqIFNpZWthIDx0dXJAc2VtaWhhbGYuY29tPgorCitjb21taXQgOTNiNzhmNTM0YTZlNzA4YjRjZjFhNGZmYjRkODQzOGM2N2EwMDdkYgorQXV0aG9yOiBCYXJ0bG9taWVqIFNpZWthIDx0dXJAc2VtaWhhbGYuY29tPgorRGF0ZToJU3VuIE1heSAyNyAxNjo1NzoxNSAyMDA3ICswMjAwCisKKyAgICBNb3Rpb24tUFJPOiBBZGQgc3VwcG9ydCBmb3IgdGhlIHRlbXBlcmF0dXJlIHNlbnNvci4KKworICAgIFNpZ25lZC1vZmYtYnk6IFBpb3RyIEtydXN6eW5za2kgPHBwa0BzZW1paGFsZi5jb20+CisgICAgQWNrZWQtYnk6IEJhcnRsb21pZWogU2lla2EgPHR1ckBzZW1paGFsZi5jb20+CisKK2NvbW1pdCBjNzVlNjM5NjMwY2MxMzJkYzE5Y2QxZWNkYTU5MjJjMGRiMGJmYmJhCitBdXRob3I6IEJhcnRsb21pZWogU2lla2EgPHR1ckBzZW1paGFsZi5jb20+CitEYXRlOglTdW4gTWF5IDI3IDE2OjU1OjIzIDIwMDcgKzAyMDAKKworICAgIE1vdGlvbi1QUk86IEFkZCBkaXNwbGF5aW5nIG9mIENQTEQgcmV2aXNpb24gaW5mb3JtYXRpb24gZHVyaW5nIGJvb3QuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKYW4gV3JvYmVsIDx3cnJAc2VtaWhhbGYuY29tPgorICAgIEFja2VkLWJ5OiBCYXJ0bG9taWVqIFNpZWthIDx0dXJAc2VtaWhhbGYuY29tPgorCitjb21taXQgYzk5NTEyZDZiZDM5NzNmMDFjYTJmYzQ4OTZkODI5YjQ2ZTY4ZjE1MAorQXV0aG9yOiBCYXJ0bG9taWVqIFNpZWthIDx0dXJAc2VtaWhhbGYuY29tPgorRGF0ZToJU3VuIE1heSAyNyAxNjo1Mzo0MyAyMDA3ICswMjAwCisKKyAgICBNUEM1eHh4OiBDaGFuZ2UgbmFtZXMgb2YgZGVmaW5lcyByZWxhdGVkIHRvIElQQiBhbmQgUENJIGNsb2Nrcy4KKworICAgIEJvdGggQ0ZHX1BDSVNQRUVEXzY2IGFuZCBDRkdfSVBCU1BFRURfMTMzIGFyZSBtaXNuYW1lZCwgYXMgZGVmaW5pbmcKKyAgICB0aGVtIGRvZXMgbm90IGNhdXNlIFBDSSBvciBJUEIgY2xvY2tzIHRvIHJ1biBhdCB0aGUgc3BlY2lmaWVkIHNwZWVkLgorICAgIEluc3RlYWQsIHRoZXkgY29uZmlndXJlIGRpdmlzb3JzIHVzZWQgdG8gY2FsY3VsYXRlIHNhaWQgY2xvY2tzLiBUaGlzCisgICAgcGF0Y2ggcmVuYW1lcyB0aGUgZGVmaW5lcyBhY2NvcmRpbmcgdG8gdGhlaXIgcmVhbCBmdW5jdGlvbi4KKworICAgIFNpZ25lZC1vZmYtYnk6IEdyemVnb3J6IEJlcm5hY2tpIDxnamJAc2VtaWhhbGYuY29tPgorICAgIEFja2VkLWJ5OiBCYXJ0bG9taWVqIFNpZWthIDx0dXJAc2VtaWhhbGYuY29tPgorCitjb21taXQgYTExYzBiODVkYzM2NjRiYjNjMWU3ODExMzcxMTg3MzBjOGY2MTlhYgorQXV0aG9yOiBCYXJ0bG9taWVqIFNpZWthIDx0dXJAc2VtaWhhbGYuY29tPgorRGF0ZToJU3VuIE1heSAyNyAxNjo1MTo0OCAyMDA3ICswMjAwCisKKyAgICBNb3Rpb24tUFJPOiBBZGQgTEVEIHN1cHBvcnQuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKYW4gV3JvYmVsIDx3cnJAc2VtaWhhbGYuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IE1hcmlhbiBCYWxha293aWN6IDxtOEBzZW1paGFsZi5jb20+CisgICAgQWNrZWQtYnk6IEJhcnRsb21pZWogU2lla2EgPHR1ckBzZW1paGFsZi5jb20+CisKK2NvbW1pdCBkNzU2ODk0NzIyYzg4OGQwOWE5ZmExZGY4MzIzNzUzNzcyZDNkY2NlCitBdXRob3I6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KK0RhdGU6CVRodSBNYXkgMjQgMDk6NDk6MDAgMjAwNyArMDIwMAorCisgICAgcHBjNHh4OiBGaXggc21hbGwgNDA1RVogT0NNIGluaXRpbGl6YXRpb24gYnVnIGluIHN0YXJ0LlMKKworICAgIEFzIHBvaW50ZWQgb3V0IGJ5IEJydWNlIEFkbGVyIDxicnVjZS5hZGxlckBhY20ub3JnPiB0aGlzIHBhdGNoCisgICAgZml4ZXMgYSBzbWFsbCBidWcgaW4gdGhlIDQwNUVaIE9DTSBpbml0aWFsaXphdGlvbi4gVGhhbmtzIGZvcgorICAgIHNwb3R0aW5nLgorCisgICAgU2lnbmVkLW9mZi1ieTogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorCitjb21taXQgNWQ0YTE3OTAxM2Q1OWE3NjQ0NjQ2MmUxZWIwYTk2OWZiYTYzZWI4MQorQXV0aG9yOiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CitEYXRlOglUaHUgTWF5IDI0IDA4OjIyOjA5IDIwMDcgKzAyMDAKKworICAgIHBwYzR4eDogVXBkYXRlIEFNQ0MgQWNhZGlhIHN1cHBvcnQgZm9yIGJvYXJkIHJldmlzaW9uIDEuMQorCisgICAgVGhpcyBwYXRjaCB1cGRhdGVzIHRoZSBBY2FkaWEgKDQwNUVaKSBzdXBwb3J0IGZvciB0aGUgbmV3IDEuMSBib2FyZAorICAgIHJldmlzaW9uLiBJdCBhbHNvIGFkZHMgc3VwcG9ydCBmb3IgTkFORCBGTEFTSCB2aWEgdGhlIDR4eCBOREZDLgorCisgICAgUGxlYXNlIG5vdGUgdGhhdCB0aGUganVtcGVyIEo3IG11c3QgYmUgaW4gcG9zaXRpb24gMi0zIGZvciB0aGlzCisgICAgTkFORCBzdXBwb3J0LiBQb3NpdGlvbiAxLTIgaXMgZm9yIE5BTkQgYm9vdGluZyBvbmx5LiBOQU5EIGJvb3RpbmcKKyAgICBzdXBwb3J0IHdpbGwgZm9sbG93IGxhdGVyLgorCisgICAgU2lnbmVkLW9mZi1ieTogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorCitjb21taXQgODIyZDU1MzY1YmI1NTdlMDg0ZDBlMzM2MjVhNmRlZGNjODY2MTEwYgorQXV0aG9yOiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorRGF0ZToJV2VkIE1heSAyMyAxNDowOTo0NiAyMDA3IC0wNTAwCisKKyAgICBBZGQgTElTVF84Nnh4IE1BS0VBTEwgdGFyZ2V0IGZvciBQb3dlclBDIGJ1aWxkcy4KKworICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CisKK2NvbW1pdCA5ZjAwNzdhYmQ2OWY3YTdjNzU2YTkxNWI5NjEwMzczMDJiZTNlNmYyCitBdXRob3I6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KK0RhdGU6CVR1ZSBNYXkgMjIgMTI6NDg6MDkgMjAwNyArMDIwMAorCisgICAgcHBjNHh4OiBVc2UgZG8geyAuLi4gfSB3aGlsZSAoMCkgZm9yIENQUiAmIFNEUiBhY2Nlc3MgbWFjcm9zCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CisKK2NvbW1pdCA2ZjNkZmMxMzlhODM4YjA4NDFjMTUxZWZlMDBhZDQ3ZGIyMzY2ZTc5CitBdXRob3I6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KK0RhdGU6CVR1ZSBNYXkgMjIgMTI6NDY6MTAgMjAwNyArMDIwMAorCisgICAgcHBjNHh4OiBBZGQgNDA1IHN1cHBvcnQgdG8gNHh4IE5BTkQgZHJpdmVyIG5kZmMuYworCisgICAgVGhpcyBwYXRjaCBhZGRzIHN1cHBvcnQgZm9yIDQwNSBQUEMncyB0byB0aGUgNHh4IE5BTkQgZHJpdmVyCisgICAgbmRmYy5jLiBUaGlzIGlzIGluIHByZXBhcmF0aW9uIGZvciB0aGUgbmV3IEFNQ0MgNDA1RVouCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CisKK2NvbW1pdCAxMDYwM2Q3Njc2NzQyNmJlODAzZGFkZDRmYjY4OGI5N2ViNjk0ODFjCitBdXRob3I6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KK0RhdGU6CU1vbiBNYXkgMjEgMDc6NDE6MjIgMjAwNyArMDIwMAorCisgICAgcHBjNHh4OiBGaXggcHJvYmxlbSBpbiA0MDVFWiBPQ00gaW5pdGlhbGl6YXRpb24KKworICAgIEFzIHNwb3R0ZWQgYnkgQnJ1Y2UgQWRsZXIgdGhpcyBwYXRjaCBmaXhlcyBhbiBpbml0aWFsaXphdGlvbiBwcm9ibGVtCisgICAgZm9yIHRoZSA0MDVFWiBPQ00uCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CisKK2NvbW1pdCAzZTNiOTU2OTA2ZWJhOWU0YWQ3OTMxNTgxZWNlZGFhZDEwZWNjY2U4CitBdXRob3I6IFBldGVyIFBlYXJzZSA8cGV0ZXIucGVhcnNlQGFybS5jb20+CitEYXRlOglGcmkgTWF5IDE4IDE2OjQ3OjAzIDIwMDcgKzAxMDAKKworICAgIFJlZHVjZSBsaW5lIGxlbmd0aHMgdG8gODAgY2hhcmFjdGVycyBtYXguCisKK2NvbW1pdCA5M2VmNDVjOWRkZmRkOWZjMTdjNGU3NGJkOGUyZjI0NTY1ODBlYjcyCitBdXRob3I6IFBldGVyIFBlYXJzZSA8cGV0ZXIucGVhcnNlQGFybS5jb20+CitEYXRlOglGcmkgTWF5IDE4IDE0OjM0OjA3IDIwMDcgKzAxMDAKKworICAgIE1ha2VmaWxlIHBlcm1pc3Npb25zCisKK2NvbW1pdCAxNDQzYTMxNDU3ZDY4ZjdlOGYwYjk0MDNlOTgzMmVjMWU3OWRjNTlkCitBdXRob3I6IFBldGVyIFBlYXJzZSA8cGV0ZXIucGVhcnNlQGFybS5jb20+CitEYXRlOglGcmkgTWF5IDE4IDE0OjMzOjExIDIwMDcgKzAxMDAKKworICAgIE1ha2VmaWxlIHBlcm1pc3Npb25zCisKK2NvbW1pdCAyNTVhMzU3N2M4NDg3MDY0NDFkYWVlMDE3NDU0M2VmZTIwNWE3N2Y4CitBdXRob3I6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CitEYXRlOglXZWQgTWF5IDE2IDE2OjUyOjE5IDIwMDcgLTA1MDAKKworICAgIFJlZHVjZSBDT05GSUdfTVBDOFlYWF9UU0VDeCB0byBDT05GSUdfVFNFQ3gKKworICAgIEZvciBhbGwgcHJhY3RpY2FsIHUtYm9vdCBwdXJwb3NlcywgVFNFQ3MgZG9uJ3QgZGlmZmVyIHRocm91Z2hvdXQgdGhlCisgICAgbXBjOFszNTZdeHggZmFtaWxpZXM7IHJlZHVjZSBDT05GSUdfTVBDOFlYWF9UU0VDeCB0byBDT05GSUdfVFNFQ3guCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBLaW0gUGhpbGxpcHMgPGtpbS5waGlsbGlwc0BmcmVlc2NhbGUuY29tPgorCitjb21taXQgNzAxMjRjMjYwMmFlMmQ0YzVkM2RiYTA1YjQ4MmQ5MTU0ODI0MmRlOAorQXV0aG9yOiBTdGVmYW5vIEJhYmljIDxzYmFiaWNAZGVueC5kZT4KK0RhdGU6CVdlZCBNYXkgMTYgMTQ6NDk6MTIgMjAwNyArMDIwMAorCisgICAgRml4IGNvbXBpbGUgcHJvYmxlbSBjYXVzZSBteSBNaWNyb2JsYXplIG1lcmdlCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBTdGVmYW5vIEJhYmljIDxzYmFiaWNAZGVueC5kZT4KKworY29tbWl0IGFkYTQ2OTdkMDIzMGQ2ZGE1NTI4Njc3NzdmOThhNjdlYzNiYTI1NzkKK0F1dGhvcjogSmVmZnJleSBNYW5uIDxtYW5uakBlbWJlZGRlZHBsYW5ldC5jb20+CitEYXRlOglXZWQgTWF5IDE2IDEzOjIzOjEwIDIwMDcgKzAyMDAKKworICAgIFtQQVRDSF0gUnVuIG5ldyBzZXF1b2lhIGJvYXJkcyB3aXRoIGFuIEVCQyBzcGVlZCBvZiA4M01IegorCisgICAgQmVjYXVzZSB0aGUgU2VxdW9pYSBib2FyZCBkb2VzIG5vdCBib290IHdpdGggYW4gRUJDIGZhc3RlciB0aGFuIDY2TUh6LAorICAgIHRoZSBjbG9jayBkaXZpZGVyIGFyZSBjaGFuZ2VkIGFmdGVyIHRoZSBpbml0aWFsIGJvb3QgcHJvY2Vzcy4KKworICAgIFRoaXMgYWxsb3dzIGZvciBtYXhpbXVtIGNsb2NraW5nIHNwZWVkcyAgdG8gYmUgYWNoaWV2ZWQgb24gbmV3ZXIgYm9hcmRzLgorICAgIFNlcXVvaWEgYm9hcmRzIHdpdGggNjY2LjY2IE1IeiBwcm9jZXNzb3JzIHJlcXVpcmUgdGhhdCB0aGUgRUJDIGRpdmlkZXIKKyAgICBiZSBzZXQgdG8gMyBpbiBvcmRlciB0byBzdGFydCB0aGUgaW5pdGlhbCBib290IHByb2Nlc3MgYXQgYSBzbG93ZXIgRUJDCisgICAgc3BlZWQuIEFmdGVyIHRoZSBpbml0aWFsIGJvb3QgcHJvY2VzcywgdGhlIGRpdmlkZXIgY2FuIGJlIHNldCBiYWNrIHRvIDIsCisgICAgd2hpY2ggd2lsbCBjYXVzZSB0aGUgYm9hcmRzIHRvIHJ1biBhdCA4My4zMzNNSHouIFRoaXMgaXMgYmFja3dhcmQKKyAgICBjb21wYXRpYmxlIHdpdGggYm9hcmRzIHdpdGggNTMzLjMzIE1IeiBwcm9jZXNzb3JzLCBhcyB0aGVzZSBib2FyZHMgd2lsbAorICAgIGFscmVhZHkgYmUgc2V0IHdpdGggYW4gRUJDIGRpdmlkZXIgb2YgMi4KKworICAgIFNpZ25lZC1vZmYtYnk6IEplZmZyZXkgTWFubiA8bWFubmpAZW1iZWRkZWRwbGFuZXQuY29tPgorCitjb21taXQgYTc2NzZlYTc3MzJmM2M1OTY4MDUwNzlmZWQ3ZTVjOWZhYzY1MmNmYworQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorRGF0ZToJV2VkIE1heSAxNiAwMToxNjo1MyAyMDA3ICswMjAwCisKKyAgICBNaW5vciBDb2RpbmcgU3R5bGUgY2xlYW51cCwgdXBkYXRlIENIQU5HRUxPRy4KKworICAgIFNpZ25lZC1vZmYtYnk6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CisKIGNvbW1pdCBkNjJmNjRjYzIzYTk0MGVhZmU3MTJjNzc2YjMyNDllNDE2MDc1M2QxCiBBdXRob3I6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CiBEYXRlOglXZWQgTWF5IDE2IDAwOjEzOjMzIDIwMDcgKzAyMDAKIAogICAgIENvZGluZyBTdHlsZSBDbGVhbnVwLCBuZXcgQ0hBTkdFTE9HCiAKK2NvbW1pdCAzMTYyZWI4MzY5MDNjOGIyNDdmZGM3NDcwZGQzOWJmYTY5OTZmNDk1CitBdXRob3I6IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CitEYXRlOglUdWUgTWF5IDE1IDIzOjM4OjA1IDIwMDcgKzAyMDAKKworICAgIE1pbm9yIGNvZGluZyBzdHlsZSBjbGVhbnVwLgorCitjb21taXQgNjZkOWRiZWMxY2MyN2Q2Mzk4ZWU2Y2Y4NDYzOWRiZTE0OTcxMjUxZQorQXV0aG9yOiBtdXNodGFxIGtoYW4gPG11c2h0YXFfa0Bwcm9jc3lzLmNvbT4KK0RhdGU6CUZyaSBBcHIgMjAgMTQ6MjM6MDIgMjAwNyArMDUzMAorCisgICAgQWRkIGRyaXZlciBmb3IgUy1BVEEtY29udHJvbGxlciBvbiBJbnRlbCBwcm9jZXNzb3JzIHdpdGggU291dGgKKyAgICBCcmlkZ2UsIElDSC01LCBJQ0gtNiBhbmQgSUNILTcuCisKKyAgICBJbXBsZW1lbnRhdGlvbjoKKworICAgIDEuIENvZGUgaXMgZGl2aWRlZCBpbiB0byB0d28gZmlsZXMuIEFsbCBmdW5jdGlvbnMsIHdoaWNoIGFyZQorICAgICAgIGNvbnRyb2xsZXIgc3BlY2lmaWMgYXJlIGtlcHQgaW4gImRyaXZlcnMvYXRhX3BpaXguYyIgZmlsZSBhbmQKKyAgICAgICBmdW5jdGlvbnMsIHdoaWNoIGFyZSBub3QgY29udHJvbGxlciBzcGVjaWZpYywgYXJlIGtlcHQgaW4KKyAgICAgICAiY29tbW9uL2NtZF9zYXRhLmMiIGZpbGUuCisKKyAgICAyLiBSZWFkaW5nIGFuZCBXcml0aW5nIGZyb20gdGhlIFMtQVRBIGRyaXZlIGlzIGRvbmUgdXNpbmcgUElPIG1ldGhvZC4KKworICAgIDMuIERyaXZlciBjYW4gYmUgY29uZmlndXJlZCBmb3IgNDgtYml0IGFkZHJlc3NpbmcgYnkgZGVmaW5pbmcgbWFjcm8KKyAgICAgICBDT05GSUdfTEJBNDgsIGlmIHRoaXMgbWFjcm8gaXMgbm90IGRlZmluZWQgZHJpdmVyIHVzZXMgdGhlIDI4LWJpdAorICAgICAgIGFkZHJlc3NpbmcuCisKKyAgICA0LiBTLUFUQSByZWFkIGZ1bmN0aW9uIGlzIGhvb2tlZCB0byB0aGUgRmlsZSBzeXN0ZW0sIGNvbW1hbmRzIGxpa2UKKyAgICAgICBleHQybHMgYW5kIGV4dDJsb2FkIGZpbGUgY2FuIGJlIHVzZWQuIFRoaXMgaGFzIGJlZW4gdGVzdGVkLgorCisgICAgNS4gVS1Cb290IGNvbW1hbmQgIlNBVEFfaW5pdCIgaXMgYWRkZWQsIHdoaWNoIGluaXRpYWxpemVzIHRoZSBTLUFUQQorICAgICAgIGNvbnRyb2xsZXIgYW5kIGlkZW50aWZpZXMgdGhlIFMtQVRBIGRyaXZlcyBjb25uZWN0ZWQgdG8gaXQuCisKKyAgICA2LiBVLUJvb3QgY29tbWFuZCAic2F0YSIgaXMgYWRkZWQsIHdoaWNoIGlzIHVzZWQgdG8gcmVhZC93cml0ZSwgcHJpbnQKKyAgICAgICBwYXJ0aXRpb24gdGFibGUgYW5kIGdldCBpbmZvIGFib3V0IHRoZSBkcml2ZXMgcHJlc2VudC4gVGhpcyBJIGhhdmUKKyAgICAgICBpbXBsZW1lbnRlZCBpbiBzYW1lIHdheSBhcyAiaWRlIiBjb21tYW5kIGlzIGltcGxlbWVudGVkIGluIFUtQm9vdC4KKworICAgIDcuIFRoaXMgZHJpdmVyIGlzIGZvciBTLUFUQSBpbiBuYXRpdmUgbW9kZS4KKworICAgIDguIFRoaXMgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIE5hdGl2ZSBjb21tYW5kIHF1ZXVpbmcgYW5kCisgICAgICAgSG90LXBsdWdnaW5nLgorCisgICAgU2lnbmVkLW9mZi1ieTogTXVzaHRhcSBLaGFuIDxtdXNodGFxX2tAcHJvY3N5cy5jb20+CisKK2NvbW1pdCA2NDRlNmZiNGViOGJlOTBlYTA0YmEzNGI2NDNhOGJmMDE5ZDY4MGUwCitBdXRob3I6IG11c2h0YXEga2hhbiA8bXVzaHRhcV9rQHByb2NzeXMuY29tPgorRGF0ZToJTW9uIEFwciAzMCAxNTo1NzoyMiAyMDA3ICswNTMwCisKKyAgICBGaXhlcyBidWcgY2xlYXJpbmcgdGhlIGJzcyBzZWN0aW9uIGZvciBpMzg2CisKKyAgICBIaSwKKyAgICBUaGVyZSBpcyBhIGJ1ZyBpbiB0aGUgY29kZSBvZiBjbGVhcmluZyB0aGUgYnNzIHNlY3Rpb24gZm9yIHByb2Nlc3NvcgorICAgIGkzODYuKEZpbGU6IGNwdS9pMzg2L3N0YXJ0LlMpCisgICAgSW4gdGhlIGNvZGUsIGJzc19zdGFydCBhZGRyIChzdGFydGluZyBhZGRyIG9mIGJzcyBzZWN0aW9uKSBpcyBwdXQgaW50bworICAgIHRoZSByZWdpc3RlciAlZWF4LCBidXQgdGhlIGNvZGUgd2hpY2ggY2xlYXJzIHRoZSBic3Mgc2VjdGlvbiByZWZlcnMgdG8KKyAgICB0aGUgYWRkciBwb2ludGVkIGJ5ICVlZGkuCisKKyAgICBUaGlzIHBhdGNoIGZpeGVzIHRoaXMgYnVnIGJ5IHB1dHRpbmcgYnNzX3N0YXJ0IGludG8gJWVkaSByZWdpc3Rlci4KKworICAgIFNpZ25lZC1vZmYtYnk6IE11c2h0YXEgS2hhbiA8bXVzaHRhcV9rQHByb2NzeXMuY29tPgorCitjb21taXQgYzMyNDNjZjdiNDkwMDU3Mjc3ZDYxYWNmZmU0YWQwOTQ2ZjllYjRhNAorQXV0aG9yOiBKb2UgSGFtbWFuIDxqb2UuaGFtbWFuQGVtYmVkZGVkc3BlY2lhbHRpZXMuY29tPgorRGF0ZToJTW9uIEFwciAzMCAxNjo0NzoyOCAyMDA3IC0wNTAwCisKKyAgICBBZGQgc3VwcG9ydCBmb3IgQkNNNTQ2NCBRdWFkIFBoeQorCisgICAgQWRkZWQgc3VwcG9ydCBmb3IgQnJvYWRjb20ncyBCQ001NDY0IFF1YWQgUGh5CisKKyAgICBTaWduZWQtb2ZmLWJ5OiBKb2UgSGFtbWFuIDxqb2UuaGFtbWFuQGVtYmVkZGVkc3BlY2lhbHRpZXMuY29tPgorCitjb21taXQgMWIzMDViZGM3NTRjODQ2OGUxZDVkODU4ZjVkY2Y4YTdhMGE0YmI3YQorQXV0aG9yOiBaYW5nIFJveS1yNjE5MTEgPHRpZS1mZWkuemFuZ0BmcmVlc2NhbGUuY29tPgorRGF0ZToJV2VkIE1heSA5IDA4OjEwOjU3IDIwMDcgKzA4MDAKKworICAgIFNlYXJjaCB0aGUgZXhjZXB0aW9uIHRhYmxlIHdpdGggbGluZWFyIGFsZ29yaXRobQorCisgICAgU2VhcmNoIHRoZSBleGNlcHRpb24gdGFibGUgd2l0aCBsaW5lYXIgYWxnb3JpdGhtIGluc3RlYWQgb2YKKyAgICBiaXNlY3RpbmcgYWxnb3JpdGhtLgorICAgIEJlY2F1c2UgdGhlIGV4Y2VwdGlvbiB0YWJsZSBtaWdodCBiZSB1bnNvcnRlZC4KKworICAgIFNpZ25lZC1vZmYtYnk6IFJveSBaYW5nIDx0aWUtZmVpLnphbmdAZnJlZXNjYWxlLmNvbT4KKworY29tbWl0IDVkZmFhNTBlYjgxOTY4NmJmYmExOTI3ZThjNWI4YTcwYTRkNjVmZDMKK0F1dGhvcjogQXVicmV5LkxpIDxhdWJyZXkuYWRpQGdtYWlsLmNvbT4KK0RhdGU6CU1vbiBNYXkgMTQgMTE6NDc6MzUgMjAwNyArMDgwMAorCisgICAgRml4IGNvbXBpbGF0aW9uIGlzc3VlcyBvbiBNQUNPU1gKKworICAgIFNpbmdlZC1vZmYtYnk6IE1hcmMgSG9mZm1hbiA8TWFyYy5Ib2ZmbWFuQGFuYWxvZy5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogQXVicmV5IExpIDxhdWJyZXkuYWRpQGdtYWlsLmNvbT4KKworY29tbWl0IDU2ZmQ3MTYyOTg1YzQxMjMxN2JiZjc2M2EyMjVmYmEyM2M2NGZkMzEKK0F1dGhvcjogU3RlcGhlbiBXaWxsaWFtcyA8c3RldmVAaWNhcnVzLmNvbT4KK0RhdGU6CVR1ZSBNYXkgMTUgMDc6NTU6NDIgMjAwNyAtMDcwMAorCisgICAgRml4IGZvciBjb21waWxlIG9mIEpTRSB0YXJnZXQKKworICAgIFRoZSBhdHRhY2hlZCBwYXRjaCBmaXhlcyB0aGUgY29tcGlsZSBvZiB0aGUgSlNFIGJvYXJkIGluIHRoZQorICAgIGRlbnggZ2l0IGFzIG9mIDE0IG1heSAyMDA3LiBJdCBpcyBhbiBleHRyZW1lbHkgc2ltcGxlIHBhdGNoLAorICAgIGl0IGp1c3QgYWRkcyB0aGUgbWlzc2luZyBkZWZpbmUgb2YgQ0ZHX1NZU1RFTUFDRV9XSURUSC4KKworICAgICBGaXggdG8gY29tcGlsZSBKU0UgYWdhaW5zdCAyMDA3MDUxNCBnaXQgb2YgdS1ib290CisKK2NvbW1pdCA2MTkzNjY2N2U4NmEyNTBhZTEyZmQyZGMxODlkMzU4OGYwYTU5ZTBiCitBdXRob3I6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KK0RhdGU6CUZyaSBNYXkgMTEgMTI6MDE6NDkgMjAwNyArMDIwMAorCisgICAgcHBjNHh4OiBBZGQgbXRjcHIvbWZjcHIgYWNjZXNzIG1hY3JvcworCisgICAgU2lnbmVkLW9mZi1ieTogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorCitjb21taXQgMzQzYzQ4YmQ4NDYwNmM0MDI1YzhhN2M3MjYzZmRhNDY1ZDZlMjg0YworQXV0aG9yOiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CitEYXRlOglGcmkgTWF5IDExIDEyOjAxOjA2IDIwMDcgKzAyMDAKKworICAgIHBwYzR4eDogU2V0IGJkLT5iaV9wY2lfYnVzZnJlcSBvbiA0NDBFUHgvR1J4IHRvbworCisgICAgU2lnbmVkLW9mZi1ieTogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorCiBjb21taXQgN2Q5OGJhNzcwYTdlYWVmYTI5Y2U5MjdmMzFhMDk1NmRmODViZjY1MAogQXV0aG9yOiBQaW90ciBLcnVzenluc2tpIDxwcGtAc2VtaWhhbGYuY29tPgogRGF0ZToJVGh1IE1heSAxMCAxNjo1NTo1MiAyMDA3ICswMjAwCkBAIC0xMSw2ICszNTc5LDQ4IEBACiAgICAgW01vdGlvbi1QUk9dIEFkZCBNVEQgYW5kIEpGRlMyIHN1cHBvcnQsIGFsc28gYWRkIGRlZmF1bHQgcGFydGl0aW9uCiAgICAgZGVmaW5pdGlvbi4KIAorY29tbWl0IDY1ZmI2YTY3NmU4MjFmOTU3MGEyYTM3NmRjMjA0YmY2MTFjZTVmODEKK0F1dGhvcjogUGV0ZXIgUGVhcnNlIDxwZXRlci5wZWFyc2VAYXJtLmNvbT4KK0RhdGU6CVdlZCBNYXkgOSAxMTo0Mjo0NCAyMDA3ICswMTAwCisKKyAgICBBZGQgdGhlIGJvYXJkIGRpcmVjdG9yeSBmb3IgU01ONDIKKworY29tbWl0IDE2MDEzMWJmOTY1Nzg1NDE5NjI2ZGY2YzM4ODcyOWZlMGI1OTc5OTIKK0F1dGhvcjogUGV0ZXIgUGVhcnNlIDxwZXRlci5wZWFyc2VAYXJtLmNvbT4KK0RhdGU6CVdlZCBNYXkgOSAxMTo0MTo1OCAyMDA3ICswMTAwCisKKyAgICBBZGQgdGhlIGZpbGVzIGZvciB0aGUgU01ONDIgYm9hcmQKKworY29tbWl0IDVjNmQyYjVhNTAwZjhjNDk2NzBkZTg5MTAxNTBiNzhhNDFmNzgxZmMKK0F1dGhvcjogUGV0ZXIgUGVhcnNlIDxwZXRlci5wZWFyc2VAYXJtLmNvbT4KK0RhdGU6CVdlZCBNYXkgOSAxMTo0MDozNCAyMDA3ICswMTAwCisKKyAgICBSZW1vdmUgdGhlIGRlbGV0ZWQgZmlsZXMgZm9yIHRoZSBTTU40MiBwYXRjaAorCitjb21taXQgYjBkOGY1YmYwZDIxNWFkYzk0MjRjYjIyOGIyNDg0ZGJmMDdmNzc2MQorQXV0aG9yOiBQZXRlciBQZWFyc2UgPHBldGVyLnBlYXJzZUBhcm0uY29tPgorRGF0ZToJV2VkIE1heSA5IDExOjM3OjU2IDIwMDcgKzAxMDAKKworICAgIE5ldyBib2FyZCBTTU40MiBicmFuY2gKKworY29tbWl0IDI5ZjNiZTBjYWYwNzk5Y2E2Yjg5ZGZkOTgyNGMxNTYxOWE1MDAwMGYKK0F1dGhvcjogUGV0ZXIgUGVhcnNlIDxwZXRlci5wZWFyc2VAYXJtLmNvbT4KK0RhdGU6CVdlZCBNYXkgOSAxMDoyNDozOCAyMDA3ICswMTAwCisKKyAgICBNYWtlZmlsZSBwZXJtaXNzaW9ucworCitjb21taXQgYjg0Mjg5YjU5NTczMWU4ODUxZGY0NmU4OTM4NDVjYzEzMjJjOWI5YgorQXV0aG9yOiBFZCBTd2FydGhvdXQgPEVkLlN3YXJ0aG91dEBmcmVlc2NhbGUuY29tPgorRGF0ZToJVHVlIE1heSA4IDE0OjE3OjA3IDIwMDcgLTA1MDAKKworICAgIDg2NDFocGNuOiBGaXggTWFrZWZpbGUgYWZ0ZXIgbW92aW5nIHBpeGlzIHRvIGJvYXJkL2ZyZWVzY2FsZS4KKworICAgIFRoZSBPQkpUUkVFICE9IFNSQ1RSRUUgYnVpbGQgc2NlbmFyaW8gd2FzIGJyb2tlbi4KKyAgICBUaGlzIGZpeGVzIGl0LgorCisgICAgU2lnbmVkLW9mZi1ieTogRWQgU3dhcnRob3V0IDxFZC5Td2FydGhvdXRAZnJlZXNjYWxlLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgorCiBjb21taXQgZTY5ZjY2YzZlYmU4MmJiYmQxZGE3NjZiYzRlZGE0MGVjN2VlNWFmMQogQXV0aG9yOiBNaWNoYWwgU2ltZWsgPG1vbnN0ckBtb25zdHIuZXU+CiBEYXRlOglUdWUgTWF5IDggMTU6NTc6NDMgMjAwNyArMDIwMApAQCAtOTMsNiArMzcwMywxOCBAQAogCiAgICAgZml4OiByZWFkIGFuZCB3cml0ZSBNU1IgLSByZXBhaXIgbnVtYmVyIG9mIHBhcmFtZXRlcnMKIAorY29tbWl0IDE5M2I0YTNiYjNhY2FkZGY3OThkYThkZTBkYTA1ZDk0YmE4Nzc0ZWUKK0F1dGhvcjogSmVmZnJleSBNYW5uIDxtYW5uakBlbWJlZGRlZHBsYW5ldC5jb20+CitEYXRlOglNb24gTWF5IDcgMTk6NDI6NDkgMjAwNyArMDIwMAorCisgICAgW1BBVENIXSBwcGM0eHg6IEZpeCBDT05GSUdfU1lTX0NMS19GUkVRIGRlZmluaXRpb24gaW4gU2VxdW9pYSBjb25maWcgZmlsZQorCisgICAgQSAnMycgZ290IGN1dCBvZmYgaW4gdGhlIGZvcm1hdHRpbmcgb2YgdGhlIGxhc3QgcGF0Y2ggdG8gYXV0b21hdGljYWxseQorICAgIGNoYW5nZSB0aGUgY2xvY2sgc3BlZWQgb2YgdGhlIHN5c3RlbSBjbG9jayBvbiBzZXF1b2lhIGJvYXJkLgorCisgICAgU2lnbmVkLW9mZi1ieTogSmVmZnJleSBNYW5uIDxtYW5uakBlbWJlZGRlZHBsYW5ldC5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorCiBjb21taXQgMTliZjFmYmFkN2YxOWQ1YTEyMGJlOWIxZGFmMTM2ZTA1MmZjYWIzOQogQXV0aG9yOiBNaWNoYWwgU2ltZWsgPG1vbnN0ckBtb25zdHIuZXU+CiBEYXRlOglNb24gTWF5IDcgMTk6MzM6NTEgMjAwNyArMDIwMApAQCAtMTMxLDYgKzM3NTMsMTIgQEAKIAogICAgIG5ldzogYWRkIHdyaXRpbmcgdG8gbXNyIHJlZ2lzdGVyCiAKK2NvbW1pdCAzYTYxOWRkN2JlZDAzZThiNGQyMmEzOTExZjkwZmQxMmFmNTM3NmMyCitBdXRob3I6IE1hcmt1cyBLbG90emJ1ZWNoZXIgPG1rQGRlbnguZGU+CitEYXRlOglNb24gTWF5IDcgMTY6NDM6NTYgMjAwNyArMDIwMAorCisgICAgRml4IGFuIGFuY2llbnQgQ0hBTkdFTE9HIGNvbmZsaWN0CisKIGNvbW1pdCBhYzRjZDU5ZDU5YzliZjNmODljYjdhMzQ0YWJmODE4NGQ2NzhmNTYyCiBBdXRob3I6IFRpbXVyIFRhYmkgPHRpbXVyQGZyZWVzY2FsZS5jb20+CiBEYXRlOglTYXQgTWF5IDUgMDg6MTI6MzAgMjAwNyArMDIwMApAQCAtMjczLDYgKzM5MDEsMjAgQEAKIAogICAgIFNpZ25lZC1vZmYtYnk6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KIAorY29tbWl0IDJmNTUwYWI5NzY0MDUzMDBmNWIwN2JmMjg5MDgwMDg0MGQwYWEwNWYKK0F1dGhvcjogVGltdXIgVGFiaSA8dGltdXJAZnJlZXNjYWxlLmNvbT4KK0RhdGU6CVNhdCBNYXkgNSAwODoxMjozMCAyMDA3ICswMjAwCisKKyAgICA1eHh4OiB3cml0ZSBNQUMgYWRkcmVzcyB0byBtYWMtYWRkcmVzcyBhbmQgbG9jYWwtbWFjLWFkZHJlc3MKKworICAgIFNvbWUgZGV2aWNlIHRyZWVzIGhhdmUgYSBtYWMtYWRkcmVzcyBwcm9wZXJ0eSwgc29tZSBoYXZlIGxvY2FsLW1hYy1hZGRyZXNzLAorICAgIGFuZCBzb21lIGhhdmUgYm90aC4gIFRvIHN1cHBvcnQgYWxsIG9mIHRoZXNlIGRldmljZSB0cmVlcywgZnRwX2NwdV9zZXR1cCgpCisgICAgc2hvdWxkIHdyaXRlIHRoZSBNQUMgYWRkcmVzcyB0byBtYWMtYWRkcmVzcyBhbmQgbG9jYWwtbWFjLWFkZHJlc3MsIGlmIHRoZXkKKyAgICBleGlzdC4KKworICAgIFNpZ25lZC1vZmYtYnk6IFRpbXVyIFRhYmkgPHRpbXVyQGZyZWVzY2FsZS5jb20+CisgICAgQWNrZWQtYnk6IEdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4KKwogY29tbWl0IGE3OTg4NjU5MDU5M2JhMWQ2NjdjODQwY2FhNDk0MGM2MTYzOWYxOGYKIEF1dGhvcjogVGhvbWFzIEtub2Jsb2NoIDxrbm9ibG9jaEBzaWVtZW5zLmNvbT4KIERhdGU6CVNhdCBNYXkgNSAwNzowNDo0MiAyMDA3ICswMjAwCkBAIC0zMzYsNiArMzk3OCwzMCBAQAogCiAgICAgU2lnbmVkLW9mZi1ieSBEYW4gTWFsZWssIDxkYW5AZW1iZWRkZWRhbGxleS5jb20+CiAKK2NvbW1pdCBmMjEzNGY4ZTllYjAwNmJkY2Q3MjllODlmMzA5YzA3YjJmYTQ1MTgwCitBdXRob3I6IEhhYXZhcmQgU2tpbm5lbW9lbiA8aHNraW5uZW1vZW5AYXRtZWwuY29tPgorRGF0ZToJV2VkIE1heSAyIDEzOjMxOjUzIDIwMDcgKzAyMDAKKworICAgIG1hY2I6IERvbid0IHJlc3RhcnQgYXV0b25lZ290aWF0aW9uIGlmIHdlIGFscmVhZHkgaGF2ZSBsaW5rCisKKyAgICBSZXdvcmsgbWFjYl9waHlfaW5pdCBzbyB0aGF0IGl0IGRvZXNuJ3QgYXR0ZW1wdCB0byByZS1uZWdvdGlhdGUgaWYgdGhlCisgICAgbGluayBpcyBhbHJlYWR5IHVwLgorCisgICAgU2lnbmVkLW9mZi1ieTogSGFhdmFyZCBTa2lubmVtb2VuIDxoc2tpbm5lbW9lbkBhdG1lbC5jb20+CisKK2NvbW1pdCAwNGZjYjVkMzhiYzkwNzc5Y2Q5YTcxMGQ2MDcwMjA3NTk4NmYwZTI5CitBdXRob3I6IEhhYXZhcmQgU2tpbm5lbW9lbiA8aHNraW5uZW1vZW5AYXRtZWwuY29tPgorRGF0ZToJV2VkIE1heSAyIDEzOjIyOjM4IDIwMDcgKzAyMDAKKworICAgIG1hY2I6IEludHJvZHVjZSBhIGZldyBiYXJyaWVycyB3aGVuIGRlYWxpbmcgd2l0aCBETUEgZGVzY3JpcHRvcnMKKworICAgIFRoZXJlIHdlcmUgYSBmZXcgdGhlb3JldGljYWwgcG9zc2liaWxpdGllcyB0aGF0IHRoZSBjb21waWxlciBtaWdodAorICAgIG9wdGltaXplIGF3YXkgRE1BIGRlc2NyaXB0b3IgcmVhZHMgYW5kL29yIHdyaXRlcyBhbmQgdGh1cyBjYXVzZQorICAgIHN5bmNocm9uaXphdGlvbiBwcm9ibGVtcyB3aXRoIHRoZSBoYXJkd2FyZS4gSW5zZXJ0IGJhcnJpZXJzIHdoZXJlCisgICAgd2UgZGVwZW5kIG9uIHJlYWRzL3dyaXRlcyBhY3R1YWxseSBoaXR0aW5nIG1lbW9yeS4KKworICAgIFNpZ25lZC1vZmYtYnk6IEhhYXZhcmQgU2tpbm5lbW9lbiA8aHNraW5uZW1vZW5AYXRtZWwuY29tPgorCiBjb21taXQgZmZhNjIxYTBkMTJhMWNjZDgxYzkzNmM1NjdmODkxN2EyMTM3ODdhOAogQXV0aG9yOiBBbmR5IEZsZW1pbmcgPGFmbGVtaW5nQGZyZWVzY2FsZS5jb20+CiBEYXRlOglTYXQgRmViIDI0IDAxOjA4OjEzIDIwMDcgLTA2MDAKQEAgLTQzNiwxMiArNDEwMiwzNSBAQAogCiAgICAgU2lnbmVkLW9mZi1ieTogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgogCitjb21taXQgODY0YWE2YTZhNDY2ZmNiOTJiZjMyYjFkN2RiYTc5Y2Q3MDliNTJjOQorQXV0aG9yOiBHcnplZ29yeiBXaWFuZWNraSA8Z3J6ZWdvcnoud2lhbmVja2lAZ21haWwuY29tPgorRGF0ZToJU3VuIEFwciAyOSAxNDowMTo1NCAyMDA3ICswMjAwCisKKyAgICBbUEFUQ0hdIFVzZSBQVlIgdG8gZGlzdGluZ3Vpc2ggTVBDNTIwMEIgZnJvbSBNUEM1MjAwIGluIGJvb3QgbWVzc2FnZQorCisgICAgTVBDNTIwMEIgc3lzdGVtcyBhcmUgaW5jb3JyZWN0bHkgcmVwb3J0ZWQgYXMgTVBDNTIwMCBpbiBVLUJvb3Qgc3RhcnQtdXAKKyAgICBtZXNzYWdlLiBVc2UgUFZSIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIHR3byB2YXJpYW50cywgYW5kIHByaW50IHByb3BlciBDUFUKKyAgICBpbmZvcm1hdGlvbi4KKworICAgIFNpZ25lZC1vZmYtYnk6IEdyemVnb3J6IFdpYW5lY2tpIDxncnplZ29yei53aWFuZWNraUBnbWFpbC5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogQmFydGxvbWllaiBTaWVrYSA8dHVyQHNlbWloYWxmLmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CisKIGNvbW1pdCA1YzVkMzI0MjkzNWNmMzU0M2FmMDExNDI2Mjc0OTQ0MzQ4MzRjZjk4CiBBdXRob3I6IEtpbSBQaGlsbGlwcyA8a2ltLnBoaWxsaXBzQGZyZWVzY2FsZS5jb20+CiBEYXRlOglXZWQgQXByIDI1IDEyOjM0OjM4IDIwMDcgLTA1MDAKIAogICAgIG1wYzgzeHg6IG1pbm9yIGZpeHVwcyBmb3IgODMxM3JkYiBpbnRyb2R1Y3Rpb24KIAorY29tbWl0IGFkYTRkNDAwOTFmNmVkNGE0ZjAwNDBlMDhkMjBkYjIxOTY3ZTRhNjcKK0F1dGhvcjogTGFkaXNsYXYgTWljaGwgPGxhZGlzQGxpbnV4LW1pcHMub3JnPgorRGF0ZToJV2VkIEFwciAyNSAxNjowMToyNiAyMDA3ICswMjAwCisKKyAgICBbUEFUQ0hdIHNpbXBsaWZ5IHNpbGVudCBjb25zb2xlCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBMYWRpc2xhdiBNaWNobCA8bGFkaXNAbGludXgtbWlwcy5vcmc+CisgICAgQWNrZWQtYnk6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KKwogY29tbWl0IDE0NDg3NmEzODBmNTc1NmY1NzQxMmNhZjc0YzFkNmRjMjAxZGQ3OTYKIEF1dGhvcjogTWljaGFsIFNpbWVrIDxtb25zdHJAbW9uc3RyLmV1PgogRGF0ZToJVHVlIEFwciAyNCAyMzowMTowMiAyMDA3ICswMjAwCkBAIC03MzgsNiArNDQyNyw2OSBAQAogCiAgICAgU2lnbmVkLW9mZi1ieTogU2NvdHQgV29vZCA8c2NvdHR3b29kQGZyZWVzY2FsZS5jb20+CiAKK2NvbW1pdCA3ZmM0YzcxYTE0M2JlODY2NmQ3MDgwM2ZiMjVhZTYwMzc5Yzk1NjIyCitBdXRob3I6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KK0RhdGU6CU1vbiBBcHIgMjMgMTU6Mzk6NTkgMjAwNyArMDIwMAorCisgICAgRml4IGZpbGUgbW9kZQorCisgICAgU2lnbmVkLW9mZi1ieTogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorCitjb21taXQgMzgyNTc5ODhhYmZlNzRkNDU5Y2EyYWQ3NDhiMTA5Y2EwNGU0ZWZlMQorQXV0aG9yOiBTZXJnZWkgU2h0eWx5b3YgPHNzaHR5bHlvdkBydS5tdmlzdGEuY29tPgorRGF0ZToJTW9uIEFwciAyMyAxNTozMDozOSAyMDA3ICswMjAwCisKKyAgICBbUEFUQ0hdIEF2b2lkIGFzc2lnbmluZyBQQ0kgcmVzb3VyY2VzIGZyb20gemVybyBhZGRyZXNzCisKKyAgICBJZiBhIFBDSSBJREUgY2FyZCBoYXBwZW5zIHRvIGdldCBhIHplcm8gYWRkcmVzcyBhc3NpZ25lZCB0byBpdCwgdGhlIExpbnV4IElERQorICAgIGNvcmUgY29tcGxhaW5zIGFuZCBJREUgZHJpdmVycyBmYWlscyB0byB3b3JrLiAgQWxzbywgYXNzaWduaW5nIHplcm8gdG8gYSBCQVIKKyAgICB3YXMgaWxsZWdhbCBhY2NvcmRpbmcgdG8gUENJIDIuMSAodGhlIGxhdGVyIHJldmlzaW9ucyBzZWVtIHRvIGhhdmUgZXhjbHVkZWQgdGhlCisgICAgc2VudGVuY2UgYWJvdXQgIjAiIGJlaW5nIGNvbnNpZGVyZWQgYW4gaW52YWxpZCBhZGRyZXNzKSAtLSBzbywgdXNlIGEgcmVhc29uYWJsZQorICAgIHN0YXJ0aW5nIHZhbHVlIG9mIDB4MTAwMCAodGhhdCdzIHdoYXQgdGhlIG1vc3QgTGludXggYXJjaHMgYXJlIHVzaW5nKS4KKworICAgIEFsdGVybmF0aXZlbHksIG9uZSBtaWdodCBoYXZlIGZpeGVkIHRoZSBjYWxscyB0byBwY2lfc2V0X3JlZ2lvbigpIGluZGl2aWR1YWxseQorICAgIChzb21lIGNvZGUgZXZlbiBzZWVtcyB0byBoYXZlIHRha2VuIGNhcmUgb2YgdGhpcyBpc3N1ZSkgYnV0IHRoYXQgd291bGQgaGF2ZQorICAgIGJlZW4gYSBsb3QgbW9yZSB3b3JrLiA6LSkKKworICAgIFNpZ25lZC1vZmYtYnk6IFNlcmdlaSBTaHR5bHlvdiA8c3NodHlseW92QHJ1Lm12aXN0YS5jb20+CisgICAgQWNrZWQtYnk6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KKworY29tbWl0IGFmYjkwM2EyZWI5NDM2YmFhOTI3MGNjYzBjMjcwODJkODY0OTdkODkKK0F1dGhvcjogSmVmZnJleSBNYW5uIDxtYW5uakBlbWJlZGRlZHBsYW5ldC5jb20+CitEYXRlOglNb24gQXByIDIzIDE0OjAwOjExIDIwMDcgKzAyMDAKKworICAgIFtwYXRjaF0gc2V0ZW52KC4uLikgY2FuIGRlbGV0ZSBlbnZpcm9ubWVudGFsdmFyaWFibGVzCisKKyAgICB1cGRhdGUgc2V0ZW52KCkgZnVuY3Rpb24gc28gdGhhdCBlbnRlcmluZyBhIE5VTEwgdmFsdWUgZm9yIHRoZQorICAgIHZhcmlhYmxlJ3MgdmFsdWUgd2lsbCBkZWxldGUgdGhlIGVudmlyb25tZW50YWwgdmFyaWFibGUKKworICAgIFNpZ25lZC1vZmYtYnk6IEplZmZyZXkgTWFubiA8bWFubmpAZW1iZWRkZWRwbGFuZXQuY29tPgorICAgIEFja2VkLWJ5OiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CisKK2NvbW1pdCAzNmYxMDRlNWNhYTc0N2Q1NjhlZmYyNmIzNjk1NjVhZjU3YzJmZmE2CitBdXRob3I6IE1pa2UgRnJ5c2luZ2VyIDx2YXBpZXJAZ2VudG9vLm9yZz4KK0RhdGU6CU1vbiBBcHIgMjMgMTM6NTQ6MjQgMjAwNyArMDIwMAorCisgICAgW3BhdGNoXSB1c2UgdW5zaWduZWQgY2hhciBpbiBzbWM5MTExMSBkcml2ZXIgZm9yIG1hYworCisgICAgdGhlIHZfbWFjIHZhcmlhYmxlIGluIHRoZSBzbWM5MTExMSBkcml2ZXIgaXMgZGVjbGFyZWQgYXMgYSBzaWduZWQgY2hhciAuLi4KKyAgICB0aGlzIGNhdXNlcyBwcm9ibGVtcyB3aGVuIG9uZSBvZiB0aGUgYnl0ZXMgaW4gdGhlIE1BQyBpcyAic2lnbmVkIiBsaWtlIDB4RTAKKyAgICBiZWNhdXNlIHdoZW4gaXQgZ2V0cyBwcmludGVkIG91dCwgeW91IGdldCBhIGRpc3BsYXkgbGlrZToKKyAgICAweEZGRkZGRkUwIGFuZCB0aGF0J3Mgbm8gZ29vZAorCisgICAgU2lnbmVkLW9mZi1ieTogTWlrZSBGcnlzaW5nZXIgPHZhcGllckBnZW50b28ub3JnPgorCitjb21taXQgZDk4YzA4ODVhZDYxN2ZjY2YyMWU3YzI2ZWY4Y2I3MjhmYmZiMjQ1OQorQXV0aG9yOiBSb2RvbGZvIEdpb21ldHRpIDxnaW9tZXR0aUBlbm5lZW5uZS5jb20+CitEYXRlOglNb24gQXByIDIzIDEzOjEwOjUyIDIwMDcgKzAyMDAKKworICAgIFVTQjogKEFub3RoZXIpIGRlbGF5IGZvciBjcmFwcHkgVVNCIGtleXMuCisKKyAgICBTb21lIFVTQiBrZXlzIGFyZSBzbG93IGluIGdpdmluZyBiYWNrIGFuIGFuc3dlciB3aGVuIHRoZSBSb290IEhVQgorICAgIGVuYWJsZXMgcG93ZXIgbGluZXMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBSb2RvbGZvIEdpb21ldHRpIDxnaW9tZXR0aUBsaW51eC5pdD4KKwogY29tbWl0IDMyM2JmYThmNDM2ZGMzYmM1NzE4N2M5YjE0ODhiYzMxNDZmZjE1MjIKIEF1dGhvcjogU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgogRGF0ZToJTW9uIEFwciAyMyAxMjowMDoyMiAyMDA3ICswMjAwCkBAIC0xNDAzLDYgKzUxNTUsMjIgQEAKIAogICAgIE1pbm9yIGNsZWFudXAuCiAKK2NvbW1pdCA4MjJhZjM1MWFkMmJhYmM3ZDk5MDMzMzYxYTVmY2FjZDMwZjZiYzc4CitBdXRob3I6IFJvZG9sZm8gR2lvbWV0dGkgPGdpb21ldHRpQGVubmVlbm5lLmNvbT4KK0RhdGU6CVR1ZSBBcHIgMyAxNDoyNzoxOCAyMDA3ICswMjAwCisKKyAgICBTdXBwb3J0IGZvciB0aGUgUGhpbGlwcyBJU1AxMTZ4IEhDRCAoSG9zdCBDb250cm9sbGVyIERyaXZlcikKKworICAgIFNpZ25lZC1vZmYtYnk6IFJvZG9sZm8gR2lvbWV0dGkgPGdpb21ldHRpQGVubmVlbm5lLmNvbT4KKworY29tbWl0IGVkZjU4NTFiZTZjMTdjMDMxZDRmNzFkZDViMGExMjA0MGI3YzUwYzgKK0F1dGhvcjogTWFya3VzIEtsb3R6YnVlY2hlciA8bWtAZGVueC5kZT4KK0RhdGU6CVR1ZSBBcHIgMyAxNDoyNzowOCAyMDA3ICswMjAwCisKKyAgICBVU0I6IGNsZWFudXAgbW9uYWhhbnMgdXNiIHN1cHBvcnQuIFJlbW92ZSBkZWFkIGNvZGUuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBNYXJrdXMgS2xvdHpidWVjaGVyIDxta0BkZW54LmRlPgorCiBjb21taXQgYTY1YzU3NjhlNTUzNzUzMGJkMTc4MGFmM2QzZmRkYzMxMTNhMTYzYwogQXV0aG9yOiBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+CiBEYXRlOglNb24gQXByIDIgMTA6MDk6MzAgMjAwNyArMDIwMApAQCAtMTU3Miw2ICs1MzQwLDIzIEBACiAKICAgICBQQVRDSDogUmVzb2x2ZSBHUEwgbGljZW5zZSBwcm9ibGVtCiAKK2NvbW1pdCBhZTAwYmI0YjI5NDRkYzY0YTQ4NWVkNzJhMTk3NTRiMTFhZjdjMjIzCitBdXRob3I6IFJvZG9sZm8gR2lvbWV0dGkgPGdpb21ldHRpQGVubmVlbm5lLmNvbT4KK0RhdGU6CU1vbiBNYXIgMjYgMTI6MDM6MzYgMjAwNyArMDIwMAorCisgICAgUFhBOiBweGEyN3ggVVNCIE9IQ0kgc3VwcG9ydAorCisgICAgU2lnbmVkLW9mZi1ieTogUm9kb2xmbyBHaW9tZXR0aSA8Z2lvbWV0dGlAbGludXguaXQ+CisKK2NvbW1pdCBhZTc5ZjYwNjc3YzIwODMyNjUzNTY0N2RjYmQ1YzNlYzQwZGJjYjBiCitBdXRob3I6IE1hcmt1cyBLbG90emJ1ZWNoZXIgPG1rQGRlbnguZGU+CitEYXRlOglNb24gTWFyIDI2IDExOjIxOjA1IDIwMDcgKzAyMDAKKworICAgIFVTQjogcmVtb3ZlIHRoZSBTM0MyNFgwX21lcmdlICNkZWZpbmUsIHdoaWNoIHdhcyBpbnRyb2R1Y2VkIHdoaWxlCisgICAgbWVyZ2luZyBPSENJIGRyaXZlcnMuCisKKyAgICBTaWduZWQtb2ZmLWJ5OiBNYXJrdXMgS2xvdHpidWVjaGVyIDxta0BkZW54LmRlPgorCiBjb21taXQgMTc5ODA0OTUyMmY1OTQwMTNhZWEyOTQ1N2Q0Njc5NDI5OGM2YWUxNQogQXV0aG9yOiBNaWNoYWwgU2ltZWsgPHJvb3RAbW9uc3RyLmV1PgogRGF0ZToJTW9uIE1hciAyNiAwMTozOTowNyAyMDA3ICswMjAwCkBAIC0zNjk3LDYgKzc0ODIsMzQgQEAKIAogICAgIFNpZ25lZC1vZmYtYnk6IFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KIAorY29tbWl0IDU4YjQ4NTc3NjY5OGMzZDcxZWM1YTIxNWUzOTIxMjNiNGMxNWFmYTMKK0F1dGhvcjogTWFya3VzIEtsb3R6YnVlY2hlciA8bWtAZGVueC5kZT4KK0RhdGU6CU1vbiBOb3YgMjcgMTE6NTE6MjEgMjAwNiArMDEwMAorCisgICAgQWRkIGEgc21hbGwgUkVBRE1FIHdpdGggaW5mb3JtYXRpb24gb24gdGhlIGdlbmVyaWMgb2hjaSBkcml2ZXIuCisKK2NvbW1pdCBhZTNiNzcwZTRlYWU4ZTk4YjZlOWUyOTY2MmUxOGM0N2ZkZjAxNzFmCitBdXRob3I6IE1hcmt1cyBLbG90emJ1ZWNoZXIgPG1rQGRlbnguZGU+CitEYXRlOglNb24gTm92IDI3IDExOjQ2OjQ2IDIwMDYgKzAxMDAKKworICAgIEZpeCBzb21lIGVuZGlhbm5lc3MgaXNzdWVzIHJlbGF0ZWQgdG8gdGhlIGdlbmVyaWMgb2hjaSBkcml2ZXIKKworY29tbWl0IDdiNTliM2M3YThjZTJlNGI1NjdhYmY5OWMxY2Q2NjdiZjM1Yjk0MTgKK0F1dGhvcjogTWFya3VzIEtsb3R6YnVlY2hlciA8bWtAZGVueC5kZT4KK0RhdGU6CU1vbiBOb3YgMjcgMTE6NDQ6NTggMjAwNiArMDEwMAorCisgICAgSW50cm9kdWNlZCB0aGUgY29uZmlndXJhdGlvbiBvcHRpb24gQ09ORklHX1VTQl9PSENJX05FVyBpbiBvcmRlciB0byBiZSBhYmxlCisgICAgdG8gY2hvb3NlIGJldHdlZW4gdGhlIG9sZCBhbmQgdGhlIGdlbmVyaWMgT0hDSSBkcml2ZXJzLgorCitjb21taXQgNTNlMzM2ZTlmZmM1MTAzNWJkYzRlNTg2NzYzMWIzMzc4NzYxYjRkZgorQXV0aG9yOiBNYXJrdXMgS2xvdHpidWVjaGVyIDxta0BkZW54LmRlPgorRGF0ZToJTW9uIE5vdiAyNyAxMTo0MzowOSAyMDA2ICswMTAwCisKKyAgICBNb2RpZmllZCB0aGUgbXBjNXh4eCBhbmQgdGhlIHBwYzR4eCBjcHUgdG8gdXNlIHRoZSBnZW5lcmljIE9IQ0kgZHJpdmVyCisgICAgYW5kIGFkYXB0ZWQgYm9hcmQgY29uZmlncyBUUU01MjAwIGFuZCB5b3NlbWl0ZSBhY2NvcmRpbmdseS4gVGhpcyBjb21taXQKKyAgICBhbHNvIG1ha2VzIHRoZSBtYXhpbXVtIG51bWJlciBvZiByb290IGh1YiBwb3J0cyBjb25maWd1cmFibGUKKyAgICAoQ0ZHX1VTQl9PSENJX01BWF9ST09UX1BPUlRTKS4KKwogY29tbWl0IDc4ZDYyMGViYjU4NzFkMjUyMjcwZGVkZmFkNjBjNjU2ODk5M2I3ODAKIEF1dGhvcjogV29sZmdhbmcgRGVuayA8d2RAYXRsYXMuZGVueC5kZT4KIERhdGU6CVRodSBOb3YgMjMgMjI6NTg6NTggMjAwNiArMDEwMApAQCAtNTQ1NCw2ICs5MjY3LDEyIEBACiAKICAgICBTaWduZWQtb2ZmLWJ5OiBKYXNvbiBKaW4gPEphc29uLmppbkBmcmVlc2NhbGUuY29tPgogCitjb21taXQgOTlkNzBlM2E0N2FmZmI5YmFlMDQxYTJjYWVjZTdjZDUxNmUyMTNiMworQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBwb2xsdXguZGVueC5kZT4KK0RhdGU6CU1vbiBKdW4gMjYgMTE6MDY6MDAgMjAwNiArMDIwMAorCisgICAgTW9yZSBjb2RlIGNsZWFudXAKKwogY29tbWl0IDY4NDYyM2NlOTJjNWZkMzJlN2RiMmQ2ZTAxNjk0NWE2N2M1ZmZhYmEKIEF1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAZnJlZXNjYWxlLmNvbT4KIERhdGU6CVRodSBKdW4gMjIgMDg6NTE6NDYgMjAwNiAtMDUwMApAQCAtNTQ3OCw2ICs5Mjk3LDI4IEBACiAKICAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBmcmVlc2NhbGUuY29tPgogCitjb21taXQgMzg2ZWRhMDIyNDczMzk0YWQ4ZjM2Yjg2ZjJiZGM5YjRjYjgxNjI5MQorQXV0aG9yOiBXb2xmZ2FuZyBEZW5rIDx3ZEBwb2xsdXguZGVueC5kZT4KK0RhdGU6CVdlZCBKdW4gMTQgMTg6MTQ6NTYgMjAwNiArMDIwMAorCisgICAgQ29kZSBjbGVhbnVwCisKK2NvbW1pdCAxNmM4ZDVlNzZhZTBmNzhmMzlhNjA2MDg1NzRhZGZlMGZlYjljYzcwCitBdXRob3I6IFdvbGZnYW5nIERlbmsgPHdkQHBvbGx1eC5kZW54LmRlPgorRGF0ZToJV2VkIEp1biAxNCAxNzo0NTo1MyAyMDA2ICswMjAwCisKKyAgICBWYXJpb3VzIFVTQiByZWxhdGVkIHBhdGNoZXMKKyAgICAtIEFkZCBzdXBwb3J0IGZvciBtcGM4eHggVVNCIGRldmljZS4KKyAgICAtIEFkZCBzdXBwb3J0IGZvciBDb21tb24gRGV2aWNlIENsYXNzIC0gQWJzdHJhY3QgQ29udHJvbCBNb2RlbCBVU0IgY29uc29sZS4KKyAgICAtIEFkZCBzdXBwb3J0IGZvciBmbG93IGNvbnRyb2wgaW4gVVNCIHNsYXZlIGRldmljZXMuCisgICAgLSBBZGQgc3VwcG9ydCBmb3Igc3dpdGNoaW5nIGJldHdlZW4gZ3NlcmlhbCBhbmQgY2RjX2FjbSB1c2luZyBlbnZpcm9ubWVudC4KKyAgICAtIE1pbm9yIGNoYW5nZXMgdG8gdXNiZGNvcmVfb21hcDE1MTAuYyB1c2JkY29yZV9vbWFwMTUxMC5oCisgICAgLSBVcGRhdGUgdXNiY29yZSBzbGlnaHRseSB0byBlYXNlIGhvc3QgZW51bWVyYXRpb24uCisgICAgLSBGaXggbm9uLXBvcnRhYmxlIGVuZGlhbiBwcm9ibGVtcyBpbiB1c2JkY29yZSBhbmQgdXNiZGNvcmVfZXAwLgorICAgIC0gQWRkIEFkZGVyVVNCX2NvbmZpZyBhcyBhIGRlZmNvbmZpZyB0byBlbmFibGUgdXNhZ2Ugb2YgdGhlIFVTQiBjb25zb2xlCisgICAgICBieSBkZWZhdWx0IHdpdGggdGhlIEFkZGVyODd4IFUtQm9vdCBwb3J0LgorICAgIFBhdGNoZXMgYnkgQnJ5YW4gTydEb25vZ2h1ZSA8Ym9kb25vZ2h1ZUBjb2RlaGVybWl0LmllPiwgMjkgTWF5IDIwMDYKKwogY29tbWl0IDhlY2M5NzE2MThmNTYwMjlhZDk5ZDM1MTZmOGIyOTdhNmVkNTg5NzEKIEF1dGhvcjogSm9uIExvZWxpZ2VyIDxqZGxAamRsLmNvbT4KIERhdGU6CVdlZCBKdW4gNyAxMDo1Mzo1NSAyMDA2IC0wNTAwCkBAIC01NTU2LDYgKzkzOTcsMTIgQEAKIAogICAgIFNpZ25lZC1vZmYtYnk6IEpvbiBMb2VsaWdlciA8amRsQGZyZWVzY2FsZS5jb20+CiAKK2NvbW1pdCBkZGY4M2EyZmNlZjFhNjcwYzQ1ZmM1ODUxMTlkY2MxZmUwNjJjNGE5CitBdXRob3I6IE1hcmt1cyBLbG90emJ1ZWNoZXIgPG1rQGRlbnguZGU+CitEYXRlOglUdWUgTWF5IDMwIDE2OjU2OjE0IDIwMDYgKzAyMDAKKworICAgIFN1cHBvcnQgZ2VuZXJpYyBPSENJIHN1cHBvcnQgZm9yIHRoZSBzM2MyNHgwIGNwdS4KKwogY29tbWl0IDM4Y2VlMTJkY2ZjYzI1NzM3MWM5MDFjN2UxM2U1OGVjYWIwYTM1ZDgKIEF1dGhvcjogSGFpeWluZyBXYW5nIDxIYWl5aW5nLldhbmdAZnJlZXNjYWxlLmNvbT4KIERhdGU6CVR1ZSBNYXkgMzAgMDk6MTA6MzIgMjAwNiAtMDUwMApAQCAtNTYwNSw2ICs5NDUyLDI5IEBACiAKICAgICBTaWduZWQtb2ZmLWJ5OiBKb24gTG9lbGlnZXIgPGpkbEBqZGwuY29tPgogCitjb21taXQgMzAxZjFhYTM4NGQwZWRjYWU2YTIyZmQ5YWRiOTMzYWQ3MTY5NWVjYworQXV0aG9yOiBNYXJrdXMgS2xvdHpidWVjaGVyIDxta0BkZW54LmRlPgorRGF0ZToJVHVlIE1heSAyMyAxMzozODozNSAyMDA2ICswMjAwCisKKyAgICBDaGFuZ2VkIHRoZSBtcDJ1c2IgKGF0OTFybTkyMDApIGJvYXJkIHRvIHVzZSB0aGUgZ2VuZXJpYyBPSENJIGRyaXZlci4gU29tZQorICAgIGZpeGVzIHRvIHRoZSBsYXR0ZXIuCisKK2NvbW1pdCAyNGUzNzY0NWU3Mzc4YjIwZmE4ZjIwZTI5OTZjOGZiOGU5MGM3MGM5CitBdXRob3I6IE1hcmt1cyBLbG90emJ1ZWNoZXIgPG1rQGRlbnguZGU+CitEYXRlOglUdWUgTWF5IDIzIDEwOjMzOjExIDIwMDYgKzAyMDAKKworICAgIE1vcmUgY2xlYW51cCBmb3IgdGhlIGRlbHRhIGJvYXJkIGFuZCB0aGUgZ2VuZXJpYyB1c2Jfb2hjaSBkcml2ZXIuIEFkZGVkCisgICAgQ0ZHX1VTQl9CT0FSRF9JTklUIGFuZCBDRkdfVVNCX0NQVV9JTklUIGZvciBlbmFibGluZyBib2FyZCBhbmQgY3B1IHNwZWNpZmljCisgICAgaW5pdGlhbGl6YXRpb24gYW5kIGNsZWFudXAgaG9va3MgcmVzcGVjdGl2ZWx5LgorCitjb21taXQgM2UzMjZlY2U5ZWJhODE4NGY1ZDQ4YWE0ZmI4Nzc2MGE4ZjZmMGYxMAorQXV0aG9yOiBNYXJrdXMgS2xvdHpidWVjaGVyIDxta0BkZW54LmRlPgorRGF0ZToJTW9uIE1heSAyMiAxNjozMzo1NCAyMDA2ICswMjAwCisKKyAgICBUaGlzIHBhdGNoIGFkZHMgVVNCIHN0b3JhZ2Ugc3VwcG9ydCBmb3IgdGhlIGRlbHRhIGJvYXJkLiBUaGlzIGlzIHRoZSBmaXJzdAorICAgIGJvYXJkIHRvIG1ha2UgdXNlIG9mIGEgZ2VuZXJpYyBPSENJIGRyaXZlciwgdGhhdCBjYWxscyBob29rcyBmb3IgYm9hcmQKKyAgICBkZXBlbmRhbnQgaW5pdGlhbGl6YXRpb24uCisKIGNvbW1pdCAxNGUzNzA4MWZmM2NhYzdlYmU2ZTkzODM2NTIzNDI5ODUzYjZiMjkyCiBBdXRob3I6IEpvbiBMb2VsaWdlciA8amRsQGpkbC5jb20+CiBEYXRlOglGcmkgTWF5IDE5IDEzOjI4OjM5IDIwMDYgLTA1MDAKZGlmZiAtLWdpdCBhL0NIQU5HRUxPRy1iZWZvcmUtVS1Cb290LTEuMS41IGIvQ0hBTkdFTE9HLWJlZm9yZS1VLUJvb3QtMS4xLjUKaW5kZXggNzI3YTdiNi4uMjQwNDE0OCAxMDA2NDQKLS0tIGEvQ0hBTkdFTE9HLWJlZm9yZS1VLUJvb3QtMS4xLjUKKysrIGIvQ0hBTkdFTE9HLWJlZm9yZS1VLUJvb3QtMS4xLjUKQEAgLTQzOCw2ICs0MzgsMjAgQEAKIAogKiBDYWxsIHNlcmlhbF9pbml0aWFsaXplKCkgYmVmb3JlIGZpcnN0IGRlYnVnKCkgaXMgdXNlZC4KIAorKiBDb2RlIGNsZWFudXAKKworKiBWYXJpb3VzIFVTQiByZWxhdGVkIHBhdGNoZXMKKyAgLSBBZGQgc3VwcG9ydCBmb3IgbXBjOHh4IFVTQiBkZXZpY2UuCisgIC0gQWRkIHN1cHBvcnQgZm9yIENvbW1vbiBEZXZpY2UgQ2xhc3MgLSBBYnN0cmFjdCBDb250cm9sIE1vZGVsIFVTQiBjb25zb2xlLgorICAtIEFkZCBzdXBwb3J0IGZvciBmbG93IGNvbnRyb2wgaW4gVVNCIHNsYXZlIGRldmljZXMuCisgIC0gQWRkIHN1cHBvcnQgZm9yIHN3aXRjaGluZyBiZXR3ZWVuIGdzZXJpYWwgYW5kIGNkY19hY20gdXNpbmcgZW52aXJvbm1lbnQuCisgIC0gTWlub3IgY2hhbmdlcyB0byB1c2JkY29yZV9vbWFwMTUxMC5jIHVzYmRjb3JlX29tYXAxNTEwLmgKKyAgLSBVcGRhdGUgdXNiY29yZSBzbGlnaHRseSB0byBlYXNlIGhvc3QgZW51bWVyYXRpb24uCisgIC0gRml4IG5vbi1wb3J0YWJsZSBlbmRpYW4gcHJvYmxlbXMgaW4gdXNiZGNvcmUgYW5kIHVzYmRjb3JlX2VwMC4KKyAgLSBBZGQgQWRkZXJVU0JfY29uZmlnIGFzIGEgZGVmY29uZmlnIHRvIGVuYWJsZSB1c2FnZSBvZiB0aGUgVVNCIGNvbnNvbGUKKyAgICBieSBkZWZhdWx0IHdpdGggdGhlIEFkZGVyODd4IFUtQm9vdCBwb3J0LgorICBQYXRjaCBieSBCcnlhbiBPJ0Rvbm9naHVlIDxib2Rvbm9naHVlQGNvZGVoZXJtaXQuaWU+LCAyOSBNYXkgMjAwNgorCiAqIENsZWFudXAgdHJhYiBib2FyZCBmb3IgR0NDLTQueAogCiAqIFZvaWNlQmx1ZSB1cGRhdGU6IHVzZSBuZXcgTVREIGZsYXNoIHBhcnRpdGlvbmluZyBtZXRob2RzLCB1c2UgbW9yZQpkaWZmIC0tZ2l0IGEvQ1JFRElUUyBiL0NSRURJVFMKaW5kZXggN2FmMWI4MC4uNGM4Yjg5NiAxMDA2NDQKLS0tIGEvQ1JFRElUUworKysgYi9DUkVESVRTCkBAIC0yNTIsNiArMjUyLDEwIEBACiBEOiBTdXBwb3J0IGZvciBBZGRlci1JSSBNUEM4NTJUIGV2YWx1YXRpb24gYm9hcmQKIFc6IGh0dHA6Ly93d3cuZm9yY2Vjb21wdXRlcnMuY29tCiAKK046IFNlcmdleSBLdWJ1c2h5bgorRToga3NpQGtvaTgubmV0CitEOiBTdXBwb3J0IGZvciB2YXJpb3VzIFRJIERhVmluY2kgYmFzZWQgYm9hcmRzLgorCiBOOiBCZXJuaGFyZCBLdWhuCiBFOiBia3VobkBtZXRyb3dlcmtzLmNvbQogRCBTdXBwb3J0IGZvciBDb2xkZmlyZSBDUFU7IFN1cHBvcnQgZm9yIE1vdG9yb2xhIE01MjcyQzMgYW5kIE01MjgyRVZCIGJvYXJkcwpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCAyZWFlZjE3Li41YjE3NzM5IDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtMTc5LDYgKzE3OSwxMCBAQAogCiAJTVZTMQkJCU1QQzgyMwogCitKb2UgSGFtbWFuIDxqb2UuaGFtbWFuQGVtYmVkZGVkc3BlY2lhbHRpZXMuY29tPgorCisJc2JjODY0MWQJCU1QQzg2NDFECisKIEtsYXVzIEhleWRlY2sgPGhleWRlY2tAa2llYmFjay1wZXRlci5kZT4KIAogCUtVUDRLCQkJTVBDODU1CkBAIC0yODIsNiArMjg2LDcgQEAKIAlidW5iaW5nYQkJUFBDNDA1RVAKIAllYm9ueQkJCVBQQzQ0MEdQCiAJa2F0bWFpCQkJUFBDNDQwU1BlCisJbHdtb241CQkJUFBDNDQwRVB4CiAJb2NvdGVhCQkJUFBDNDQwR1gKIAlwM3A0NDAJCQlQUEM0NDBHUAogCXBjczQ0MGVwCQlQUEM0NDBFUApAQCAtNDQzLDYgKzQ0OCwxMiBAQAogCiAJb21hcDE2MTBoMgkJQVJNOTI2RUpTCiAKK1NlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorCisJRFYtRVZNCQkJQVJNOTI2RUpTCisJU09OQVRBCQkJQVJNOTI2RUpTCisJU0NITU9PR0lFCQlBUk05MjZFSlMKKwogUHJha2FzaCBLdW1hciA8cHJha2FzaEBlbWJlZHguY29tPgogCiAJY2VyZjI1MAkJCXhzY2FsZQpkaWZmIC0tZ2l0IGEvTUFLRUFMTCBiL01BS0VBTEwKaW5kZXggODFmNWRmYy4uN2ZiMTBiMyAxMDA3NTUKLS0tIGEvTUFLRUFMTAorKysgYi9NQUtFQUxMCkBAIC0yNiwxMTQgKzI2LDI4MSBAQAogIyMgTVBDNXh4IFN5c3RlbXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotTElTVF81eHg9IglcCi0JY21pX21wYzV4eAkJCQkJCQlcCitMSVNUXzV4eD0iCQlcCisJY21pX21wYzV4eAlcCiAiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIE1QQzV4eHggU3lzdGVtcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1MSVNUXzV4eHg9IglcCi0JQkMzNDUwCQljcGNpNTIwMAlFVkFMNTIwMAlmbzMwMAkJXAotCWljZWN1YmVfNTEwMAlpY2VjdWJlXzUyMDAJbGl0ZTUyMDBiCW1jYzIwMAkJXAotCW1lY3A1MjAwCW1vdGlvbnBybwlvMmRudAkJcGY1MjAwCQlcCi0JUE01MjAJCVRCNTIwMAkJVG90YWw1MTAwCVRvdGFsNTIwMAlcCi0JVG90YWw1MjAwX1JldjIJVFFNNTIwMAkJVFFNNTIwMF9CCVRRTTUyMDBTCVwKLQl2MzhiCQkJCQkJCQlcCitMSVNUXzV4eHg9IgkJXAorCUJDMzQ1MAkJXAorCWNtNTIwMAkJXAorCWNwY2k1MjAwCVwKKwlFVkFMNTIwMAlcCisJZm8zMDAJCVwKKwlpY2VjdWJlXzUxMDAJXAorCWljZWN1YmVfNTIwMAlcCisJbGl0ZTUyMDBiCVwKKwltY2MyMDAJCVwKKwltZWNwNTIwMAlcCisJbW90aW9ucHJvCVwKKwlvMmRudAkJXAorCXBmNTIwMAkJXAorCVBNNTIwCQlcCisJVEI1MjAwCQlcCisJVG90YWw1MTAwCVwKKwlUb3RhbDUyMDAJXAorCVRvdGFsNTIwMF9SZXYyCVwKKwlUUU01MjAwCQlcCisJVFFNNTIwMF9CCVwKKwlUUU01MjAwUwlcCisJdjM4YgkJXAorIgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyBNUEM1MTJ4IFN5c3RlbXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworTElTVF81MTJ4PSIJCVwKKwlhZHM1MTIxCQlcCiAiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIE1QQzh4eCBTeXN0ZW1zCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1MSVNUXzh4eD0iCVwKLQlBZGRlcjg3eAlHRU5JRVRWCQlNQlg4NjBUCQlSMzYwTVBJCQlcCi0JQWRkZXJJSQkJR1RICQlNSFBDCQlSQkM4MjMJCVwKLQlBRFM4NjAJCWhlcm1lcwkJTVBDODZ4QURTCXJtdQkJXAotCUFNWDg2MAkJSUFEMjEwCQlNUEM4ODVBRFMJUlBYQ2xhc3NpYwlcCi0JYzJtb24JCUlDVTg2Ml8xMDBNSHoJTVZTMQkJUlBYbGl0ZQkJXAotCUNDTQkJSVA4NjAJCU5FVFBIT05FCVJQWGxpdGVfRFcJXAotCWNvZ2VudF9tcGM4eHgJSVZNTDI0CQlORVRUQQkJUlJ2aXNpb24JXAotCUVMUFQ4NjAJCUlWTUwyNF8xMjgJTkVUVEEyCQlTTTg1MAkJXAotCUVQODh4CQlJVk1MMjRfMjU2CU5FVFRBX0lTRE4Jc3BjMTkyMAkJXAotCUVTVEVFTTE5MkUJSVZNUzgJCU5FVFZJQQkJU1BEODIzVFMJXAotCUVUWDA5NAkJSVZNUzhfMTI4CU5FVFZJQV9WMglzdm1fc2M4eHgJXAotCUZBRFM4MjMJCUlWTVM4XzI1NglOWDgyMwkJU1hOSTg1NVQJXAotCUZBRFM4NTBTQVIJS1VQNEsJCXBjdV9lCQlUT1A4NjAJCVwKLQlGQURTODYwVAlLVVA0WAkJUVM4MjMJCVRRTTgyM0wJCVwKLQlGTEFHQURNCQlMQU5URUMJCVFTODUwCQlUUU04MjNMX0xDRAlcCi0JRlBTODUwTAkJbHdtb24JCVFTODYwVAkJVFFNODUwTAkJXAotCUdFTjg2MFQJCU1CWAkJcXVhbnR1bQkJVFFNODU1TAkJXAotCUdFTjg2MFRfU0MJCQkJCVRRTTg2MEwJCVwKLQkJCQkJCQlUUU04ODVECQlcCi0JCQkJCQkJdWMxMDAJCVwKLQkJCQkJCQl2MzcJCVwKK0xJU1RfOHh4PSIJCVwKKwlBZGRlcjg3eAlcCisJQWRkZXJJSQkJXAorCUFEUzg2MAkJXAorCUFNWDg2MAkJXAorCWMybW9uCQlcCisJQ0NNCQlcCisJY29nZW50X21wYzh4eAlcCisJRUxQVDg2MAkJXAorCUVQODh4CQlcCisJRVNURUVNMTkyRQlcCisJRVRYMDk0CQlcCisJRkFEUzgyMwkJXAorCUZBRFM4NTBTQVIJXAorCUZBRFM4NjBUCVwKKwlGTEFHQURNCQlcCisJRlBTODUwTAkJXAorCUdFTjg2MFQJCVwKKwlHRU44NjBUX1NDCVwKKwlHRU5JRVRWCQlcCisJR1RICQlcCisJaGVybWVzCQlcCisJSUFEMjEwCQlcCisJSUNVODYyXzEwME1IeglcCisJSVA4NjAJCVwKKwlJVk1MMjQJCVwKKwlJVk1MMjRfMTI4CVwKKwlJVk1MMjRfMjU2CVwKKwlJVk1TOAkJXAorCUlWTVM4XzEyOAlcCisJSVZNUzhfMjU2CVwKKwlLVVA0SwkJXAorCUtVUDRYCQlcCisJTEFOVEVDCQlcCisJbHdtb24JCVwKKwlNQlgJCVwKKwlNQlg4NjBUCQlcCisJTUhQQwkJXAorCU1QQzg2eEFEUwlcCisJTVBDODg1QURTCVwKKwlNVlMxCQlcCisJTkVUUEhPTkUJXAorCU5FVFRBCQlcCisJTkVUVEEyCQlcCisJTkVUVEFfSVNETglcCisJTkVUVklBCQlcCisJTkVUVklBX1YyCVwKKwlOWDgyMwkJXAorCXBjdV9lCQlcCisJUVM4MjMJCVwKKwlRUzg1MAkJXAorCVFTODYwVAkJXAorCXF1YW50dW0JCVwKKwlSMzYwTVBJCQlcCisJUkJDODIzCQlcCisJcm11CQlcCisJUlBYQ2xhc3NpYwlcCisJUlBYbGl0ZQkJXAorCVJQWGxpdGVfRFcJXAorCVJSdmlzaW9uCVwKKwlTTTg1MAkJXAorCXNwYzE5MjAJCVwKKwlTUEQ4MjNUUwlcCisJc3ZtX3NjOHh4CVwKKwlTWE5JODU1VAlcCisJVE9QODYwCQlcCisJVFFNODIzTAkJXAorCVRRTTgyM0xfTENECVwKKwlUUU04NTBMCQlcCisJVFFNODU1TAkJXAorCVRRTTg2MEwJCVwKKwlUUU04ODVECQlcCisJdWMxMDAJCVwKKwl2MzcJCVwKICIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgUFBDNHh4IFN5c3RlbXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotTElTVF80eHg9IglcCi0JYWNhZGlhCQlBRENJT1AJCWFscHIJCUFQMTAwMAkJXAotCUFSNDA1CQlBU0g0MDUJCWJhbWJvbwkJYmFtYm9vX25hbmQJXAotCWJ1YmluZ2EJCUNBTkJUCQlDTVM3MDAJCUNQQ0kyRFAJCVwKLQlDUENJNDA1CQlDUENJNDA1MglDUENJNDA1QUIJQ1BDSTQwNURUCVwKLQlDUENJNDQwCQlDUENJSVNFUjQJQ1JBWUwxCQljc2IyNzIJCVwKLQljc2I0NzIJCURBU0FfU0lNCURQNDA1CQlEVTQwNQkJXAotCWVib255CQlFUklDCQlFWEJJVEdFTglHMjAwMAkJXAotCUhINDA1CQlIVUI0MDUJCUpTRQkJS0FSRUYJCVwKLQlrYXRtYWkJCWx1YW4JCU1FVFJPQk9YCU1JUDQwNQkJXAotCU1JUDQwNVQJCU1MMgkJbWwzMDAJCW9jb3RlYQkJXAotCU9DUlRDCQlPUlNHCQlwM3A0NDAJCVBDSTQwNQkJXAotCXBjczQ0MGVwCVBJUDQwNQkJUExVNDA1CQlQTUM0MDUJCVwKLQlQUENoYW1lbGVvbkVWQglzYmM0MDUJCXNjMwkJc2VxdW9pYQkJXAotCXNlcXVvaWFfbmFuZAl0YWlzaGFuCQlWT0g0MDUJCVZPTTQwNQkJXAotCVc3T0xNQwkJVzdPTE1HCQl3YWxudXQJCVdVSDQwNQkJXAotCVhQRURJVEUxSwl5ZWxsb3dzdG9uZQl5b3NlbWl0ZQl5dWNjYQkJXAorTElTVF80eHg9IgkJXAorCWFjYWRpYQkJXAorCWFjYWRpYV9uYW5kCVwKKwlBRENJT1AJCVwKKwlhbHByCQlcCisJQVAxMDAwCQlcCisJQVI0MDUJCVwKKwlBU0g0MDUJCVwKKwliYW1ib28JCVwKKwliYW1ib29fbmFuZAlcCisJYnViaW5nYQkJXAorCUNBTkJUCQlcCisJQ01TNzAwCQlcCisJQ1BDSTJEUAkJXAorCUNQQ0k0MDUJCVwKKwlDUENJNDA1MglcCisJQ1BDSTQwNUFCCVwKKwlDUENJNDA1RFQJXAorCUNQQ0k0NDAJCVwKKwlDUENJSVNFUjQJXAorCUNSQVlMMQkJXAorCWNzYjI3MgkJXAorCWNzYjQ3MgkJXAorCURBU0FfU0lNCVwKKwlEUDQwNQkJXAorCURVNDA1CQlcCisJZWJvbnkJCVwKKwlFUklDCQlcCisJRVhCSVRHRU4JXAorCUcyMDAwCQlcCisJSEg0MDUJCVwKKwlIVUI0MDUJCVwKKwlKU0UJCVwKKwlLQVJFRgkJXAorCWthdG1haQkJXAorCWx1YW4JCVwKKwlsd21vbjUJCVwKKwlNRVRST0JPWAlcCisJTUlQNDA1CQlcCisJTUlQNDA1VAkJXAorCU1MMgkJXAorCW1sMzAwCQlcCisJb2NvdGVhCQlcCisJT0NSVEMJCVwKKwlPUlNHCQlcCisJcDNwNDQwCQlcCisJUENJNDA1CQlcCisJcGNzNDQwZXAJXAorCVBJUDQwNQkJXAorCVBMVTQwNQkJXAorCVBNQzQwNQkJXAorCVBQQ2hhbWVsZW9uRVZCCVwKKwlzYmM0MDUJCVwKKwlzYzMJCVwKKwlzZXF1b2lhCQlcCisJc2VxdW9pYV9uYW5kCVwKKwl0YWlzaGFuCQlcCisJVk9INDA1CQlcCisJVk9NNDA1CQlcCisJVzdPTE1DCQlcCisJVzdPTE1HCQlcCisJd2FsbnV0CQlcCisJV1VINDA1CQlcCisJWFBFRElURTFLCVwKKwl5ZWxsb3dzdG9uZQlcCisJeW9zZW1pdGUJXAorCXl1Y2NhCQlcCiAiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIE1QQzgyMjAgU3lzdGVtcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1MSVNUXzgyMjA9IglcCi0JQWxhc2thODIyMAlZdWtvbjgyMjAJCQkJCVwKK0xJU1RfODIyMD0iCQlcCisJQWxhc2thODIyMAlcCisJWXVrb244MjIwCVwKICIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgTVBDODI0eCBTeXN0ZW1zCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLUxJU1RfODI0eD0iCVwKLQlBMzAwMAkJYmFyY28JCUJNVwkJQ1BDNDUJCVwKLQlDVTgyNAkJZGVicmlzCQllWGFsaW9uCQlISURERU5fRFJBR09OCVwKLQkJCU1PVVNTRQkJTVVTRU5LSQkJTVZCTFVFCQlcCi0JT1hDCQlQTjYyCQlTYW5kcG9pbnQ4MjQwCVNhbmRwb2ludDgyNDUJXAotCXNiYzgyNDAJCVNMODI0NQkJdXR4ODI0NQkJCQlcCitMSVNUXzgyNHg9IgkJXAorCUEzMDAwCQlcCisJYmFyY28JCVwKKwlCTVcJCVwKKwlDUEM0NQkJXAorCUNVODI0CQlcCisJZGVicmlzCQlcCisJZVhhbGlvbgkJXAorCUhJRERFTl9EUkFHT04JXAorCU1PVVNTRQkJXAorCU1VU0VOS0kJCVwKKwlNVkJMVUUJCVwKKwlPWEMJCVwKKwlQTjYyCQlcCisJU2FuZHBvaW50ODI0MAlcCisJU2FuZHBvaW50ODI0NQlcCisJc2JjODI0MAkJXAorCVNMODI0NQkJXAorCXV0eDgyNDUJCVwKICIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgTVBDODI2MCBTeXN0ZW1zIChpbmNsdWRlcyA4MjUwLCA4MjU1IGV0Yy4pCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLUxJU1RfODI2MD0iCVwKLQlhdGMJCWNvZ2VudF9tcGM4MjYwCUNQVTg2CQlDUFU4NwkJXAotCWVwODI0OAkJZXA4MjYwCQllcDgyeHhtCQlndzgyNjAJCVwKLQloeW1vZAkJSVBIQVNFNDUzOQlJU1BBTgkJTVBDODI2MEFEUwlcCi0JTVBDODI2NkFEUwlNUEM4MjcyQURTCVBNODI2CQlQTTgyOAkJXAotCXBwbWM4MjYwCVJhdHRsZXI4MjQ4CVJQWHN1cGVyCXJzZHByb3RvCVwKLQlzYWNzbmcJCXNiYzgyNjAJCVNDTQkJVFFNODI2MF9BQwlcCi0JVFFNODI2MF9BRAlUUU04MjYwX0FFCVpQQzE5MDAJCQkJXAorTElTVF84MjYwPSIJCVwKKwlhdGMJCVwKKwljb2dlbnRfbXBjODI2MAlcCisJQ1BVODYJCVwKKwlDUFU4NwkJXAorCWVwODI0OAkJXAorCWVwODI2MAkJXAorCWVwODJ4eG0JCVwKKwlndzgyNjAJCVwKKwloeW1vZAkJXAorCUlQSEFTRTQ1MzkJXAorCUlTUEFOCQlcCisJTVBDODI2MEFEUwlcCisJTVBDODI2NkFEUwlcCisJTVBDODI3MkFEUwlcCisJUE04MjYJCVwKKwlQTTgyOAkJXAorCXBwbWM4MjYwCVwKKwlSYXR0bGVyODI0OAlcCisJUlBYc3VwZXIJXAorCXJzZHByb3RvCVwKKwlzYWNzbmcJCVwKKwlzYmM4MjYwCQlcCisJU0NNCQlcCisJVFFNODI2MF9BQwlcCisJVFFNODI2MF9BRAlcCisJVFFNODI2MF9BRQlcCisJWlBDMTkwMAkJXAogIgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBNUEM4M3h4IFN5c3RlbXMgKGluY2x1ZGVzIDgzNDksIGV0Yy4pCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLUxJU1RfODN4eD0iCVwKLQlNUEM4MzEzRVJEQglNUEM4MzJYRU1EUwlNUEM4MzQ5RU1EUwlNUEM4MzQ5SVRYCVwKLQlNUEM4MzQ5SVRYR1AJTVBDODM2MEVNRFMJc2JjODM0OQkJVFFNODM0eAkJXAorTElTVF84M3h4PSIJCVwKKwlNUEM4MzEzRVJEQl8zMwlcCisJTVBDODMxM0VSREJfNjYJXAorCU1QQzgzMlhFTURTCVwKKwlNUEM4MzQ5RU1EUwlcCisJTVBDODM0OUlUWAlcCisJTVBDODM0OUlUWEdQCVwKKwlNUEM4MzYwRU1EUwlcCisJc2JjODM0OQkJXAorCVRRTTgzNHgJCVwKICIKIAogCkBAIC0xNDEsMTE0ICszMDgsMjI3IEBACiAjIyBNUEM4NXh4IFN5c3RlbXMgKGluY2x1ZGVzIDg1NDAsIDg1NjAgZXRjLikKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotTElTVF84NXh4PSIJXAotCU1QQzg1NDBBRFMJTVBDODU0MEVWQUwJTVBDODU0MUNEUwlNUEM4NTQ0RFMJXAotCU1QQzg1NDhDRFMJTVBDODU1NUNEUwlNUEM4NTYwQURTCVBNODU0CQlcCi0JUE04NTYJCXNiYzg1NDAJCXNiYzg1NjAJCXN0eGdwMwkJXAotCXN0eHNzYQkJVFFNODU0MAkJVFFNODU0MQkJVFFNODU1NQkJXAotCVRRTTg1NjAJCQkJCQkJCVwKK0xJU1RfODV4eD0iCQlcCisJTVBDODU0MEFEUwlcCisJTVBDODU0MEVWQUwJXAorCU1QQzg1NDFDRFMJXAorCU1QQzg1NDREUwlcCisJTVBDODU0OENEUwlcCisJTVBDODU1NUNEUwlcCisJTVBDODU2MEFEUwlcCisJTVBDODU2OE1EUwlcCisJUE04NTQJCVwKKwlQTTg1NgkJXAorCXNiYzg1NDAJCVwKKwlzYmM4NTYwCQlcCisJc3R4Z3AzCQlcCisJc3R4c3NhCQlcCisJVFFNODU0MAkJXAorCVRRTTg1NDEJCVwKKwlUUU04NTU1CQlcCisJVFFNODU2MAkJXAorIgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyBNUEM4Nnh4IFN5c3RlbXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworTElTVF84Nnh4PSIJCVwKKwlNUEM4NjQxSFBDTglcCisJU0JDODY0MUQJXAogIgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyA3NHh4Lzd4eCBTeXN0ZW1zCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLUxJU1RfNzR4eD0iCVwKLQlEQjY0MzYwCQlEQjY0NDYwCQlFVkI2NDI2MAlQM0c0CQlcCi0JcDNtNzQ0OAkJUENJUFBDMgkJUENJUFBDNgkJWlVNQQkJXAotCW1wYzc0NDhocGMyCitMSVNUXzc0eHg9IgkJXAorCURCNjQzNjAJCVwKKwlEQjY0NDYwCQlcCisJRVZCNjQyNjAJXAorCW1wYzc0NDhocGMyCVwKKwlQM0c0CQlcCisJcDNtNzQ0OAkJXAorCVBDSVBQQzIJCVwKKwlQQ0lQUEM2CQlcCisJWlVNQQkJXAogIgogCi1MSVNUXzd4eD0iCVwKLQlCQUI3eHgJCUNQQ0k3NTAJCUVMUFBDCQlwM203NTAJCVwKLQlwcG1jN3h4CQkJCQkJCQlcCitMSVNUXzd4eD0iCQlcCisJQkFCN3h4CQlcCisJQ1BDSTc1MAkJXAorCUVMUFBDCQlcCisJcDNtNzUwCQlcCisJcHBtYzd4eAkJXAogIgogCi1MSVNUX3BwYz0iJHtMSVNUXzV4eH0gICR7TElTVF81eHh4fQkJXAotCSAgJHtMSVNUXzh4eH0JCQkJXAotCSAgJHtMSVNUXzgyMjB9ICR7TElTVF84MjR4fSAke0xJU1RfODI2MH0gXAotCSAgJHtMSVNUXzgzeHh9CQkJCVwKLQkgICR7TElTVF84NXh4fQkJCQlcCi0JICAke0xJU1RfNHh4fQkJCQlcCi0JICAke0xJU1RfNzR4eH0gJHtMSVNUXzd4eH0iCitMSVNUX3BwYz0iCQlcCisJJHtMSVNUXzV4eH0JXAorCSR7TElTVF81eHh4fQlcCisJJHtMSVNUXzh4eH0JXAorCSR7TElTVF84MjIwfQlcCisJJHtMSVNUXzgyNHh9CVwKKwkke0xJU1RfODI2MH0JXAorCSR7TElTVF84M3h4fQlcCisJJHtMSVNUXzg1eHh9CVwKKwkke0xJU1RfODZ4eH0JXAorCSR7TElTVF80eHh9CVwKKwkke0xJU1RfNzR4eH0JXAorCSR7TElTVF83eHh9CVwKKyIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgU3Ryb25nQVJNIFN5c3RlbXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotTElTVF9TQT0iYXNzYWJldCBkbnAxMTEwIGdjcGx1cyBsYXJ0IHNoYW5ub24iCitMSVNUX1NBPSIJCVwKKwlhc3NhYmV0CQlcCisJZG5wMTExMAkJXAorCWdjcGx1cwkJXAorCWxhcnQJCVwKKwlzaGFubm9uCQlcCisiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIEFSTTcgU3lzdGVtcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1MSVNUX0FSTTc9IglcCi0JYXJtYWRpbGxvCUIyCQllcDczMTIJCWV2YjQ1MTAJCVwKLQlpbXBhNwkJaW50ZWdyYXRvcmFwCWFwNwkJYXA3MjB0CQlcCi0JbHBjMjI5MnNvZGltbQltb2RuZXQ1MAkJCQkJXAorTElTVF9BUk03PSIJCVwKKwlhcDcJCVwKKwlhcDcyMHQJCVwKKwlhcm1hZGlsbG8JXAorCUIyCQlcCisJZXA3MzEyCQlcCisJZXZiNDUxMAkJXAorCWltcGE3CQlcCisJaW50ZWdyYXRvcmFwCVwKKwlscGMyMjkyc29kaW1tCVwKKwltb2RuZXQ1MAlcCisJU01ONDIJCVwKICIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgQVJNOSBTeXN0ZW1zCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLUxJU1RfQVJNOT0iCVwKLQlhdDkxcm05MjAwZGsJY21jX3B1MgkJCQkJCVwKLQlhcDkyMHQJCWFwOTIyX1hBMTAJYXA5MjZlanMJYXA5NDZlcwkJXAotCWFwOTY2CQljcDkyMHQJCWNwOTIyX1hBMTAJY3A5MjZlanMJXAotCWNwOTQ2ZXMJCWNwOTY2CQlscGQ3YTQwMAltcDJ1c2IJCVwKLQlteDFhZHMJCW14MWZzMgkJbmV0c3RhcgkJb21hcDE1MTBpbm4JXAotCW9tYXAxNjEwaDIJb21hcDE2MTBpbm4Jb21hcDczMHAyCXNiYzI0MTB4CVwKLQlzY2I5MzI4CQlzbWRrMjQwMAlzbWRrMjQxMAl0cmFiCQlcCi0JVkNNQTkJCXZlcnNhdGlsZQl2ZXJzYXRpbGVhYgl2ZXJzYXRpbGVwYglcCi0Jdm9pY2VibHVlCQkJCQkJCVwKK0xJU1RfQVJNOT0iCQkJXAorCWF0OTFybTkyMDBkawkJXAorCWNtY19wdTIJCQlcCisJYXA5MjB0CQkJXAorCWFwOTIyX1hBMTAJCVwKKwlhcDkyNmVqcwkJXAorCWFwOTQ2ZXMJCQlcCisJYXA5NjYJCQlcCisJY3A5MjB0CQkJXAorCWNwOTIyX1hBMTAJCVwKKwljcDkyNmVqcwkJXAorCWNwOTQ2ZXMJCQlcCisJY3A5NjYJCQlcCisJbHBkN2E0MDAJCVwKKwltcDJ1c2IJCQlcCisJbXgxYWRzCQkJXAorCW14MWZzMgkJCVwKKwluZXRzdGFyCQkJXAorCW9tYXAxNTEwaW5uCQlcCisJb21hcDE2MTBoMgkJXAorCW9tYXAxNjEwaW5uCQlcCisJb21hcDczMHAyCQlcCisJc2JjMjQxMHgJCVwKKwlzY2I5MzI4CQkJXAorCXNtZGsyNDAwCQlcCisJc21kazI0MTAJCVwKKwl0cmFiCQkJXAorCVZDTUE5CQkJXAorCXZlcnNhdGlsZQkJXAorCXZlcnNhdGlsZWFiCQlcCisJdmVyc2F0aWxlcGIJCVwKKwl2b2ljZWJsdWUJCVwKKwlkYXZpbmNpX2R2ZXZtCQlcCisJZGF2aW5jaV9zY2htb29naWUJXAorCWRhdmluY2lfc29uYXRhCQlcCiAiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIEFSTTEwIFN5c3RlbXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUxJU1RfQVJNMTA9IglcCi0JaW50ZWdyYXRvcmNwCWNwMTAyNgkJCQkJCVwKK0xJU1RfQVJNMTA9IgkJXAorCWludGVncmF0b3JjcAlcCisJY3AxMDI2CQlcCiAiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIEFSTTExIFN5c3RlbXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUxJU1RfQVJNMTE9IglcCi0JY3AxMTM2CQlvbWFwMjQyMGg0CQkJCQlcCitMSVNUX0FSTTExPSIJCVwKKwljcDExMzYJCVwKKwlvbWFwMjQyMGg0CVwKICIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgWHNjYWxlIFN5c3RlbXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotTElTVF9weGE9IglcCi0JYWRzdml4CQljZXJmMjUwCQljcmFkbGUJCWNzYjIyNgkJXAotCWRlbHRhCQlpbm5va29tCQlsdWJib2NrCQlwbGViMgkJXAotCXB4YTI1NV9pZHAJd2VwZXAyNTAJeGFlbmlheAkJeG0yNTAJCVwKLQl4c2VuZ2luZQl6eWxvbml0ZQkJCQkJXAorTElTVF9weGE9IgkJXAorCWFkc3ZpeAkJXAorCWNlcmYyNTAJCVwKKwljcmFkbGUJCVwKKwljc2IyMjYJCVwKKwlkZWx0YQkJXAorCWlubm9rb20JCVwKKwlsdWJib2NrCQlcCisJcGxlYjIJCVwKKwlweGEyNTVfaWRwCVwKKwl3ZXBlcDI1MAlcCisJeGFlbmlheAkJXAorCXhtMjUwCQlcCisJeHNlbmdpbmUJXAorCXp5bG9uaXRlCVwKICIKIAotTElTVF9peHA9Iml4ZHA0MjUJaXhkcGc0MjUJcGRuYjMJCXNjcHUiCitMSVNUX2l4cD0iCQlcCisJaXhkcDQyNQkJXAorCWl4ZHBnNDI1CVwKKwlwZG5iMwkJXAorCXNjcHUJCVwKKyIKIAogCi1MSVNUX2FybT0iCVwKLQkke0xJU1RfU0F9CQkJCQkJCVwKLQkke0xJU1RfQVJNN30gJHtMSVNUX0FSTTl9ICR7TElTVF9BUk0xMH0gJHtMSVNUX0FSTTExfQkJXAotCSR7TElTVF9weGF9ICR7TElTVF9peHB9CQkJCQkJXAorTElTVF9hcm09IgkJXAorCSR7TElTVF9TQX0JXAorCSR7TElTVF9BUk03fQlcCisJJHtMSVNUX0FSTTl9CVwKKwkke0xJU1RfQVJNMTB9CVwKKwkke0xJU1RfQVJNMTF9CVwKKwkke0xJU1RfcHhhfQlcCisJJHtMSVNUX2l4cH0JXAogIgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBNSVBTIFN5c3RlbXMJCShkZWZhdWx0ID0gYmlnIGVuZGlhbikKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotTElTVF9taXBzNGtjPSJpbmNhaXAiCitMSVNUX21pcHM0a2M9IgkJXAorCWluY2FpcAkJXAorIgogCi1MSVNUX21pcHM1a2M9InB1cnBsZSIKK0xJU1RfbWlwczVrYz0iCQlcCisJcHVycGxlCQlcCisiCiAKLUxJU1RfYXUxeHgwPSJkYmF1MTAwMCBkYmF1MTEwMCBkYmF1MTUwMCBkYmF1MTU1MCBkYmF1MTU1MF9lbCBndGgyIgorTElTVF9hdTF4eDA9IgkJXAorCWRiYXUxMDAwCVwKKwlkYmF1MTEwMAlcCisJZGJhdTE1MDAJXAorCWRiYXUxNTUwCVwKKwlkYmF1MTU1MF9lbAlcCisJZ3RoMgkJXAorIgogCi1MSVNUX21pcHM9IiR7TElTVF9taXBzNGtjfSAke0xJU1RfbWlwczVrY30gJHtMSVNUX2F1MXh4MH0iCitMSVNUX21pcHM9IgkJXAorCSR7TElTVF9taXBzNGtjfQlcCisJJHtMSVNUX21pcHM1a2N9CVwKKwkke0xJU1RfYXUxeHgwfQlcCisiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIE1JUFMgU3lzdGVtcwkJKGxpdHRsZSBlbmRpYW4pCkBAIC0yNTgsMzYgKzUzOCw1NSBAQAogCiBMSVNUX21pcHM1a2NfZWw9IiIKIAotTElTVF9hdTF4eDBfZWw9ImRiYXUxNTUwX2VsIgorTElTVF9hdTF4eDBfZWw9IglcCisJZGJhdTE1NTBfZWwJXAorIgogCi1MSVNUX21pcHNfZWw9IiR7TElTVF9taXBzNGtjX2VsfSAke0xJU1RfbWlwczVrY19lbH0gJHtMSVNUX2F1MXh4MF9lbH0iCitMSVNUX21pcHNfZWw9IgkJCVwKKwkke0xJU1RfbWlwczRrY19lbH0JXAorCSR7TElTVF9taXBzNWtjX2VsfQlcCisJJHtMSVNUX2F1MXh4MF9lbH0JXAorIgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBpMzg2IFN5c3RlbXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotTElTVF9JNDg2PSJzYzUyMF9jZHAgc2M1MjBfc3B1bmsgc2M1MjBfc3B1bmtfcmVsIgorTElTVF9JNDg2PSIJCVwKKwlzYzUyMF9jZHAJXAorCXNjNTIwX3NwdW5rCVwKKwlzYzUyMF9zcHVua19yZWwJXAorIgogCi1MSVNUX3g4Nj0iJHtMSVNUX0k0ODZ9IgorTElTVF94ODY9IgkJXAorCSR7TElTVF9JNDg2fQlcCisiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIE5JT1MgU3lzdGVtcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1MSVNUX25pb3M9IglcCi0JQUROUEVTQzEJCUFETlBFU0MxX2Jhc2VfMzIJCQlcCi0JQUROUEVTQzFfRE5QRVZBMl9iYXNlXzMyCQkJCQlcCi0JREsxQzIwCQkJREsxQzIwX3N0YW5kYXJkXzMyCQkJXAotCURLMVMxMAkJCURLMVMxMF9zdGFuZGFyZF8zMiBESzFTMTBfbXR4X2xka18yMAlcCitMSVNUX25pb3M9IgkJCVwKKwlBRE5QRVNDMQkJXAorCUFETlBFU0MxX2Jhc2VfMzIJXAorCUFETlBFU0MxX0ROUEVWQTJfYmFzZV8zMlwKKwlESzFDMjAJCQlcCisJREsxQzIwX3N0YW5kYXJkXzMyCVwKKwlESzFTMTAJCQlcCisJREsxUzEwX3N0YW5kYXJkXzMyCVwKKwlESzFTMTBfbXR4X2xka18yMAlcCiAiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIE5pb3MtSUkgU3lzdGVtcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1MSVNUX25pb3MyPSIJXAotCUVQMUMyMAkJRVAxUzEwCQlFUDFTNDAJCQkJXAotCVBDSTU0NDEJCVBLMUMyMAkJCQkJCVwKK0xJU1RfbmlvczI9IgkJXAorCUVQMUMyMAkJXAorCUVQMVMxMAkJXAorCUVQMVM0MAkJXAorCVBDSTU0NDEJCVwKKwlQSzFDMjAJCVwKICIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMjk1LDMxICs1OTQsNDQgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogTElTVF9taWNyb2JsYXplPSIJXAotCXN1emFrdQkJbWw0MDEJCXh1cHYycAorCXN1emFrdQkJXAorCW1sNDAxCQlcCisJeHVwdjJwCQlcCiAiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIENvbGRGaXJlIFN5c3RlbXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotTElTVF9jb2xkZmlyZT0iCVwKLQljb2JyYTUyNzIJRUIrTUNGLUVWMTIzCUVCK01DRi1FVjEyM19pbnRlcm5hbAkJXAotCWlkbXIJCU01MjcxRVZCCU01MjcyQzMJCU01MjgyRVZCCVwKLQlUQVNSRUcJCXI1MjAwCQlNNTI3MUVWQgkJCVwKK0xJU1RfY29sZGZpcmU9IgkJCVwKKwljb2JyYTUyNzIJCVwKKwlFQitNQ0YtRVYxMjMJCVwKKwlFQitNQ0YtRVYxMjNfaW50ZXJuYWwJXAorCWlkbXIJCQlcCisJTTUyNzFFVkIJCVwKKwlNNTI3MkMzCQkJXAorCU01MjgyRVZCCQlcCisJVEFTUkVHCQkJXAorCXI1MjAwCQkJXAogIgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBBVlIzMiBTeXN0ZW1zCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLUxJU1RfYXZyMzI9ImF0c3RrMTAwMiIKK0xJU1RfYXZyMzI9IgkJXAorCWF0c3RrMTAwMglcCisiCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIEJsYWNrZmluIFN5c3RlbXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotTElTVF9ibGFja2Zpbj0iIFwKLQliZjUzMy1lemtpdAliZjUzMy1zdGFtcAliZjUzNy1zdGFtcAliZjU2MS1lemtpdAlcCitMSVNUX2JsYWNrZmluPSIJCVwKKwliZjUzMy1lemtpdAlcCisJYmY1MzMtc3RhbXAJXAorCWJmNTM3LXN0YW1wCVwKKwliZjU2MS1lemtpdAlcCiAiCiAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzU1LDcgKzY2Nyw3IEBACiAJbWljcm9ibGF6ZXwgXAogCW1pcHN8bWlwc19lbHwgXAogCW5pb3N8bmlvczJ8IFwKLQlwcGN8NXh4fDV4eHh8OHh4fDgyMjB8ODI0eHw4MjYwfDgzeHh8ODV4eHw0eHh8N3h4fDc0eHh8IFwKKwlwcGN8NXh4fDV4eHh8NTEyeHw4eHh8ODIyMHw4MjR4fDgyNjB8ODN4eHw4NXh4fDg2eHh8NHh4fDd4eHw3NHh4fCBcCiAJeDg2fEk0ODYpCiAJCQlmb3IgdGFyZ2V0IGluIGBldmFsIGVjaG8gJyRMSVNUXycke2FyZ31gCiAJCQlkbwpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQppbmRleCBkZDAxN2Q2Li5mNTE2ODg5IDEwMDY0NAotLS0gYS9NYWtlZmlsZQorKysgYi9NYWtlZmlsZQpAQCAtMzQsNiArMzQsNyBAQAogCSAgICAtZSBzL2FybS4qL2FybS8gXAogCSAgICAtZSBzL3NhMTEwL2FybS8gXAogCSAgICAtZSBzL3Bvd2VycGMvcHBjLyBcCisJICAgIC1lIHMvcHBjNjQvcHBjLyBcCiAJICAgIC1lIHMvbWFjcHBjL3BwYy8pCiAKIEhPU1RPUyA6PSAkKHNoZWxsIHVuYW1lIC1zIHwgdHIgJ1s6dXBwZXI6XScgJ1s6bG93ZXI6XScgfCBcCkBAIC0xMjIsNyArMTIzLDcgQEAKIENST1NTX0NPTVBJTEUgPQogZWxzZQogaWZlcSAoJChBUkNIKSxwcGMpCi1DUk9TU19DT01QSUxFID0gcG93ZXJwYy1saW51eC0KK0NST1NTX0NPTVBJTEUgPSBwcGNfOHh4LQogZW5kaWYKIGlmZXEgKCQoQVJDSCksYXJtKQogQ1JPU1NfQ09NUElMRSA9IGFybS1saW51eC0KQEAgLTE3Myw5ICsxNzQsNiBAQAogaWZlcSAoJChDUFUpLG1wYzg1eHgpCiBPQkpTICs9IGNwdS8kKENQVSkvcmVzZXR2ZWMubwogZW5kaWYKLWlmZXEgKCQoQ1BVKSxtcGM4Nnh4KQotT0JKUyArPSBjcHUvJChDUFUpL3Jlc2V0dmVjLm8KLWVuZGlmCiBpZmVxICgkKENQVSksYmY1MzMpCiBPQkpTICs9IGNwdS8kKENQVSkvc3RhcnQxLm8JY3B1LyQoQ1BVKS9pbnRlcnJ1cHQubwljcHUvJChDUFUpL2NhY2hlLm8KIE9CSlMgKz0gY3B1LyQoQ1BVKS9mbHVzaC5vCWNwdS8kKENQVSkvaW5pdF9zZHJhbS5vCkBAIC0yMDgsNiArMjA2LDcgQEAKIExJQlMgKz0gcnRjL2xpYnJ0Yy5hCiBMSUJTICs9IGR0dC9saWJkdHQuYQogTElCUyArPSBkcml2ZXJzL2xpYmRyaXZlcnMuYQorTElCUyArPSBkcml2ZXJzL2Jpb3NfZW11bGF0b3IvbGliYXRpYmlvc2VtdS5hCiBMSUJTICs9IGRyaXZlcnMvbmFuZC9saWJuYW5kLmEKIExJQlMgKz0gZHJpdmVycy9uYW5kX2xlZ2FjeS9saWJuYW5kX2xlZ2FjeS5hCiBpZmVxICgkKENQVSksbXBjODN4eCkKQEAgLTIxNyw2ICsyMTYsOCBAQAogTElCUyArPSBwb3N0L2xpYnBvc3QuYSBwb3N0L2RyaXZlcnMvbGlicG9zdGRyaXZlcnMuYQogTElCUyArPSAkKHNoZWxsIGlmIFsgLWQgcG9zdC9saWJfJChBUkNIKSBdOyB0aGVuIGVjaG8gXAogCSJwb3N0L2xpYl8kKEFSQ0gpL2xpYnBvc3QkKEFSQ0gpLmEiOyBmaSkKK0xJQlMgKz0gJChzaGVsbCBpZiBbIC1kIHBvc3QvbGliXyQoQVJDSCkvZnB1IF07IHRoZW4gZWNobyBcCisJInBvc3QvbGliXyQoQVJDSCkvZnB1L2xpYnBvc3QkKEFSQ0gpZnB1LmEiOyBmaSkKIExJQlMgKz0gJChzaGVsbCBpZiBbIC1kIHBvc3QvY3B1LyQoQ1BVKSBdOyB0aGVuIGVjaG8gXAogCSJwb3N0L2NwdS8kKENQVSkvbGlicG9zdCQoQ1BVKS5hIjsgZmkpCiBMSUJTICs9ICQoc2hlbGwgaWYgWyAtZCBwb3N0L2JvYXJkLyQoQk9BUkRESVIpIF07IHRoZW4gZWNobyBcCkBAIC0yNDgsNyArMjQ5LDcgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotQUxMID0gJChvYmopdS1ib290LnNyZWMgJChvYmopdS1ib290LmJpbiAkKG9iailTeXN0ZW0ubWFwICQoVV9CT09UX05BTkQpCitBTEwgKz0gJChvYmopdS1ib290LnNyZWMgJChvYmopdS1ib290LmJpbiAkKG9iailTeXN0ZW0ubWFwICQoVV9CT09UX05BTkQpCiAKIGFsbDoJCSQoQUxMKQogCkBAIC0yNjgsNiArMjY5LDkgQEAKIAkJCXNlZCAtZSAncy8iWwkgXSokJC8gZm9yICQoQk9BUkQpIGJvYXJkIi8nKSBcCiAJCS1kICQ8ICRACiAKKyQob2JqKXUtYm9vdC5zaGExOgkkKG9iail1LWJvb3QuYmluCisJCSQob2JqKXRvb2xzL3Vic2hhMSAkKG9iail1LWJvb3QuYmluCisKICQob2JqKXUtYm9vdC5kaXM6CSQob2JqKXUtYm9vdAogCQkkKE9CSkRVTVApIC1kICQ8ID4gJEAKIApAQCAtNDI3LDcgKzQzMSw3IEBACiAJQCQoTUtDT05GSUcpIGp1cGl0ZXIgcHBjIG1wYzV4eHgganVwaXRlcgogCiB2MzhiX2NvbmZpZzogdW5jb25maWcKLQlALi9ta2NvbmZpZyAtYSB2MzhiIHBwYyBtcGM1eHh4IHYzOGIKKwlAJChNS0NPTkZJRykgLWEgdjM4YiBwcGMgbXBjNXh4eCB2MzhiCiAKIGlua2E0eDBfY29uZmlnOgl1bmNvbmZpZwogCUAkKE1LQ09ORklHKSBpbmthNHgwIHBwYyBtcGM1eHh4IGlua2E0eDAKQEAgLTUzMCw2ICs1MzQsOSBAQAogc21tYWNvNF9jb25maWc6IHVuY29uZmlnCiAJQCQoTUtDT05GSUcpIC1hIHNtbWFjbzQgcHBjIG1wYzV4eHggdHFtNTIwMAogCitjbTUyMDBfY29uZmlnOgl1bmNvbmZpZworCUAuL21rY29uZmlnIC1hIGNtNTIwMCBwcGMgbXBjNXh4eCBjbTUyMDAKKwogc3BpZXZhbF9jb25maWc6CXVuY29uZmlnCiAJQCQoTUtDT05GSUcpIC1hIHNwaWV2YWwgcHBjIG1wYzV4eHggdHFtNTIwMAogCkBAIC02MzIsNiArNjM5LDEzIEBACiAKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgTVBDNTEyeCBTeXN0ZW1zCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCithZHM1MTIxX2NvbmZpZzogdW5jb25maWcKKwlAJChNS0NPTkZJRykgYWRzNTEyMSBwcGMgbXBjNTEyeCBhZHM1MTIxCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgTVBDOHh4IFN5c3RlbXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIApAQCAtNjQ0LDYgKzY1OCw5IEBACiAJQGVjaG8gIiNkZWZpbmUgQ09ORklHX01QQzg1MlQiID4gJChvYmopaW5jbHVkZS9jb25maWcuaCkKIAlAJChNS0NPTkZJRykgLWEgQWRkZXIgcHBjIG1wYzh4eCBhZGRlcgogCitBZGRlclVTQl9jb25maWc6CXVuY29uZmlnCisJQC4vbWtjb25maWcgLWEgQWRkZXJVU0IgcHBjIG1wYzh4eCBhZGRlcgorCiBBRFM4NjBfY29uZmlnICAgICBcCiBGQURTODIzX2NvbmZpZyAgICBcCiBGQURTODUwU0FSX2NvbmZpZyBcCkBAIC0xMDE3LDExICsxMDM0LDE5IEBACiBhY2FkaWFfY29uZmlnOgl1bmNvbmZpZwogCUAkKE1LQ09ORklHKSAkKEA6X2NvbmZpZz0pIHBwYyBwcGM0eHggYWNhZGlhIGFtY2MKIAorYWNhZGlhX25hbmRfY29uZmlnOgl1bmNvbmZpZworCUBta2RpciAtcCAkKG9iailpbmNsdWRlICQob2JqKWJvYXJkL2FtY2MvYWNhZGlhCisJQG1rZGlyIC1wICQob2JqKW5hbmRfc3BsL2JvYXJkL2FtY2MvYWNhZGlhCisJQGVjaG8gIiNkZWZpbmUgQ09ORklHX05BTkRfVV9CT09UIiA+ICQob2JqKWluY2x1ZGUvY29uZmlnLmgKKwlAJChNS0NPTkZJRykgLW4gJEAgLWEgYWNhZGlhIHBwYyBwcGM0eHggYWNhZGlhIGFtY2MKKwlAZWNobyAiVEVYVF9CQVNFID0gMHgwMTAwMDAwMCIgPiAkKG9iailib2FyZC9hbWNjL2FjYWRpYS9jb25maWcudG1wCisJQGVjaG8gIkNPTkZJR19OQU5EX1VfQk9PVCA9IHkiID4+ICQob2JqKWluY2x1ZGUvY29uZmlnLm1rCisKIEFEQ0lPUF9jb25maWc6CXVuY29uZmlnCiAJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgcHBjIHBwYzR4eCBhZGNpb3AgZXNkCiAKIGFscHJfY29uZmlnOgl1bmNvbmZpZwotCUAuL21rY29uZmlnICQoQDpfY29uZmlnPSkgcHBjIHBwYzR4eCBhbHByIHByb2RyaXZlCisJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgcHBjIHBwYzR4eCBhbHByIHByb2RyaXZlCiAKIEFQMTAwMF9jb25maWc6dW5jb25maWcKIAlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBwcGMgcHBjNHh4IGFwMTAwMCBhbWlyaXgKQEAgLTEwMzksOSArMTA2NCw4IEBACiAJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgcHBjIHBwYzR4eCBiYW1ib28gYW1jYwogCiBiYW1ib29fbmFuZF9jb25maWc6CXVuY29uZmlnCi0JQG1rZGlyIC1wICQob2JqKWluY2x1ZGUKLQlAbWtkaXIgLXAgJChvYmopbmFuZF9zcGwKLQlAbWtkaXIgLXAgJChvYmopYm9hcmQvYW1jYy9iYW1ib28KKwlAbWtkaXIgLXAgJChvYmopaW5jbHVkZSAkKG9iailib2FyZC9hbWNjL2JhbWJvbworCUBta2RpciAtcCAkKG9iailuYW5kX3NwbC9ib2FyZC9hbWNjL2JhbWJvbwogCUBlY2hvICIjZGVmaW5lIENPTkZJR19OQU5EX1VfQk9PVCIgPiAkKG9iailpbmNsdWRlL2NvbmZpZy5oCiAJQCQoTUtDT05GSUcpIC1uICRAIC1hIGJhbWJvbyBwcGMgcHBjNHh4IGJhbWJvbyBhbWNjCiAJQGVjaG8gIlRFWFRfQkFTRSA9IDB4MDEwMDAwMDAiID4gJChvYmopYm9hcmQvYW1jYy9iYW1ib28vY29uZmlnLnRtcApAQCAtMTEzMyw2ICsxMTU3LDkgQEAKIGx1YW5fY29uZmlnOgl1bmNvbmZpZwogCUAkKE1LQ09ORklHKSAkKEA6X2NvbmZpZz0pIHBwYyBwcGM0eHggbHVhbiBhbWNjCiAKK2x3bW9uNV9jb25maWc6CXVuY29uZmlnCisJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgcHBjIHBwYzR4eCBsd21vbjUKKwogTUVUUk9CT1hfY29uZmlnOiB1bmNvbmZpZwogCUAkKE1LQ09ORklHKSAkKEA6X2NvbmZpZz0pIHBwYyBwcGM0eHggbWV0cm9ib3ggc2FuZGJ1cnN0CiAKQEAgLTEyMTksOSArMTI0Niw4IEBACiAKIHNlcXVvaWFfbmFuZF9jb25maWcgXAogcmFpbmllcl9uYW5kX2NvbmZpZzogdW5jb25maWcKLQlAbWtkaXIgLXAgJChvYmopaW5jbHVkZQotCUBta2RpciAtcCAkKG9iailuYW5kX3NwbAotCUBta2RpciAtcCAkKG9iailib2FyZC9hbWNjL3NlcXVvaWEKKwlAbWtkaXIgLXAgJChvYmopaW5jbHVkZSAkKG9iailib2FyZC9hbWNjL3NlcXVvaWEKKwlAbWtkaXIgLXAgJChvYmopbmFuZF9zcGwvYm9hcmQvYW1jYy9zZXF1b2lhCiAJQGVjaG8gIiNkZWZpbmUgQ09ORklHX05BTkRfVV9CT09UIiA+ICQob2JqKWluY2x1ZGUvY29uZmlnLmgKIAlAZWNobyAiI2RlZmluZSBDT05GSUdfJCQoZWNobyAkKHN1YnN0ICwsJChAOl9jb25maWc9KSkgfCBcCiAJCXRyICdbOmxvd2VyOl0nICdbOnVwcGVyOl0nKSIgPj4gJChvYmopaW5jbHVkZS9jb25maWcuaApAQCAtMTIzMCw3ICsxMjU2LDcgQEAKIAlAZWNobyAiQ09ORklHX05BTkRfVV9CT09UID0geSIgPj4gJChvYmopaW5jbHVkZS9jb25maWcubWsKIAogc2MzX2NvbmZpZzp1bmNvbmZpZwotCUAuL21rY29uZmlnICQoQDpfY29uZmlnPSkgcHBjIHBwYzR4eCBzYzMKKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBwcGMgcHBjNHh4IHNjMwogCiB0YWlzaGFuX2NvbmZpZzoJdW5jb25maWcKIAlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBwcGMgcHBjNHh4IHRhaXNoYW4gYW1jYwpAQCAtMTM5Niw3ICsxNDIyLDcgQEAKIAlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBwcGMgbXBjODI2MCBlcDgyNjAKIAogZXA4Mnh4bV9jb25maWc6CXVuY29uZmlnCi0JQC4vbWtjb25maWcgJChAOl9jb25maWc9KSBwcGMgbXBjODI2MCBlcDgyeHhtCisJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgcHBjIG1wYzgyNjAgZXA4Mnh4bQogCiBndzgyNjBfY29uZmlnOgl1bmNvbmZpZwogCUAkKE1LQ09ORklHKSAkKEA6X2NvbmZpZz0pIHBwYyBtcGM4MjYwIGd3ODI2MApAQCAtMTYzNywzOCArMTY2Myw0MyBAQAogCiBNUEM4MzEzRVJEQl8zM19jb25maWcgXAogTVBDODMxM0VSREJfNjZfY29uZmlnOiB1bmNvbmZpZwotCUBlY2hvICIiID5pbmNsdWRlL2NvbmZpZy5oIDsgXAorCUBta2RpciAtcCAkKG9iailpbmNsdWRlCisJQGVjaG8gIiIgPiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCiAJaWYgWyAiJChmaW5kc3RyaW5nIF8zM18sJEApIiBdIDsgdGhlbiBcCiAJCWVjaG8gLW4gIi4uLjMzTSAuLi4iIDsgXAotCQllY2hvICIjZGVmaW5lIENGR18zM01IWiIgPj5pbmNsdWRlL2NvbmZpZy5oIDsgXAorCQllY2hvICIjZGVmaW5lIENGR18zM01IWiIgPj4kKG9iailpbmNsdWRlL2NvbmZpZy5oIDsgXAogCWZpIDsgXAogCWlmIFsgIiQoZmluZHN0cmluZyBfNjZfLCRAKSIgXSA7IHRoZW4gXAogCQllY2hvIC1uICIuLi42Nk0uLi4iIDsgXAotCQllY2hvICIjZGVmaW5lIENGR182Nk1IWiIgPj5pbmNsdWRlL2NvbmZpZy5oIDsgXAorCQllY2hvICIjZGVmaW5lIENGR182Nk1IWiIgPj4kKG9iailpbmNsdWRlL2NvbmZpZy5oIDsgXAogCWZpIDsKIAlAJChNS0NPTkZJRykgLWEgTVBDODMxM0VSREIgcHBjIG1wYzgzeHggbXBjODMxM2VyZGIKIAorTVBDODMyM0VSREJfY29uZmlnOgl1bmNvbmZpZworCUAkKE1LQ09ORklHKSAtYSBNUEM4MzIzRVJEQiBwcGMgbXBjODN4eCBtcGM4MzIzZXJkYiBmcmVlc2NhbGUKKwogTVBDODMyWEVNRFNfY29uZmlnIFwKIE1QQzgzMlhFTURTX0hPU1RfMzNfY29uZmlnIFwKIE1QQzgzMlhFTURTX0hPU1RfNjZfY29uZmlnIFwKIE1QQzgzMlhFTURTX1NMQVZFX2NvbmZpZzoJdW5jb25maWcKLQlAZWNobyAiIiA+aW5jbHVkZS9jb25maWcuaCA7IFwKKwlAbWtkaXIgLXAgJChvYmopaW5jbHVkZQorCUBlY2hvICIiID4kKG9iailpbmNsdWRlL2NvbmZpZy5oIDsgXAogCWlmIFsgIiQoZmluZHN0cmluZyBfSE9TVF8sJEApIiBdIDsgdGhlbiBcCiAJCWVjaG8gLW4gIi4uLiBQQ0kgSE9TVCAiIDsgXAotCQllY2hvICIjZGVmaW5lIENPTkZJR19QQ0kiID4+aW5jbHVkZS9jb25maWcuaCA7IFwKKwkJZWNobyAiI2RlZmluZSBDT05GSUdfUENJIiA+PiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCiAJZmkgOyBcCiAJaWYgWyAiJChmaW5kc3RyaW5nIF9TTEFWRV8sJEApIiBdIDsgdGhlbiBcCiAJCWVjaG8gIi4uLlBDSSBTTEFWRSA2Nk0iICA7IFwKLQkJZWNobyAiI2RlZmluZSBDT05GSUdfUENJIiA+PmluY2x1ZGUvY29uZmlnLmggOyBcCi0JCWVjaG8gIiNkZWZpbmUgQ09ORklHX1BDSVNMQVZFIiA+PmluY2x1ZGUvY29uZmlnLmggOyBcCisJCWVjaG8gIiNkZWZpbmUgQ09ORklHX1BDSSIgPj4kKG9iailpbmNsdWRlL2NvbmZpZy5oIDsgXAorCQllY2hvICIjZGVmaW5lIENPTkZJR19QQ0lTTEFWRSIgPj4kKG9iailpbmNsdWRlL2NvbmZpZy5oIDsgXAogCWZpIDsgXAogCWlmIFsgIiQoZmluZHN0cmluZyBfMzNfLCRAKSIgXSA7IHRoZW4gXAogCQllY2hvIC1uICIuLi4zM00gLi4uIiA7IFwKLQkJZWNobyAiI2RlZmluZSBQQ0lfMzNNIiA+PmluY2x1ZGUvY29uZmlnLmggOyBcCisJCWVjaG8gIiNkZWZpbmUgUENJXzMzTSIgPj4kKG9iailpbmNsdWRlL2NvbmZpZy5oIDsgXAogCWZpIDsgXAogCWlmIFsgIiQoZmluZHN0cmluZyBfNjZfLCRAKSIgXSA7IHRoZW4gXAogCQllY2hvIC1uICIuLi42Nk0uLi4iIDsgXAotCQllY2hvICIjZGVmaW5lIFBDSV82Nk0iID4+aW5jbHVkZS9jb25maWcuaCA7IFwKKwkJZWNobyAiI2RlZmluZSBQQ0lfNjZNIiA+PiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCiAJZmkgOwogCUAkKE1LQ09ORklHKSAtYSBNUEM4MzJYRU1EUyBwcGMgbXBjODN4eCBtcGM4MzJ4ZW1kcwogCkBAIC0xNjkzLDIzICsxNzI0LDI0IEBACiBNUEM4MzYwRU1EU19IT1NUXzMzX2NvbmZpZyBcCiBNUEM4MzYwRU1EU19IT1NUXzY2X2NvbmZpZyBcCiBNUEM4MzYwRU1EU19TTEFWRV9jb25maWc6CXVuY29uZmlnCi0JQGVjaG8gIiIgPmluY2x1ZGUvY29uZmlnLmggOyBcCisJQG1rZGlyIC1wICQob2JqKWluY2x1ZGUKKwlAZWNobyAiIiA+JChvYmopaW5jbHVkZS9jb25maWcuaCA7IFwKIAlpZiBbICIkKGZpbmRzdHJpbmcgX0hPU1RfLCRAKSIgXSA7IHRoZW4gXAogCQllY2hvIC1uICIuLi4gUENJIEhPU1QgIiA7IFwKLQkJZWNobyAiI2RlZmluZSBDT05GSUdfUENJIiA+PmluY2x1ZGUvY29uZmlnLmggOyBcCisJCWVjaG8gIiNkZWZpbmUgQ09ORklHX1BDSSIgPj4kKG9iailpbmNsdWRlL2NvbmZpZy5oIDsgXAogCWZpIDsgXAogCWlmIFsgIiQoZmluZHN0cmluZyBfU0xBVkVfLCRAKSIgXSA7IHRoZW4gXAogCQllY2hvICIuLi5QQ0kgU0xBVkUgNjZNIiAgOyBcCi0JCWVjaG8gIiNkZWZpbmUgQ09ORklHX1BDSSIgPj5pbmNsdWRlL2NvbmZpZy5oIDsgXAotCQllY2hvICIjZGVmaW5lIENPTkZJR19QQ0lTTEFWRSIgPj5pbmNsdWRlL2NvbmZpZy5oIDsgXAorCQllY2hvICIjZGVmaW5lIENPTkZJR19QQ0kiID4+JChvYmopaW5jbHVkZS9jb25maWcuaCA7IFwKKwkJZWNobyAiI2RlZmluZSBDT05GSUdfUENJU0xBVkUiID4+JChvYmopaW5jbHVkZS9jb25maWcuaCA7IFwKIAlmaSA7IFwKIAlpZiBbICIkKGZpbmRzdHJpbmcgXzMzXywkQCkiIF0gOyB0aGVuIFwKIAkJZWNobyAtbiAiLi4uMzNNIC4uLiIgOyBcCi0JCWVjaG8gIiNkZWZpbmUgUENJXzMzTSIgPj5pbmNsdWRlL2NvbmZpZy5oIDsgXAorCQllY2hvICIjZGVmaW5lIFBDSV8zM00iID4+JChvYmopaW5jbHVkZS9jb25maWcuaCA7IFwKIAlmaSA7IFwKIAlpZiBbICIkKGZpbmRzdHJpbmcgXzY2XywkQCkiIF0gOyB0aGVuIFwKIAkJZWNobyAtbiAiLi4uNjZNLi4uIiA7IFwKLQkJZWNobyAiI2RlZmluZSBQQ0lfNjZNIiA+PmluY2x1ZGUvY29uZmlnLmggOyBcCisJCWVjaG8gIiNkZWZpbmUgUENJXzY2TSIgPj4kKG9iailpbmNsdWRlL2NvbmZpZy5oIDsgXAogCWZpIDsKIAlAJChNS0NPTkZJRykgLWEgTVBDODM2MEVNRFMgcHBjIG1wYzgzeHggbXBjODM2MGVtZHMKIApAQCAtMTczNSwxMCArMTc2NywxMCBAQAogCUBta2RpciAtcCAkKG9iailpbmNsdWRlCiAJQGVjaG8gIiIgPiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCiAJaWYgWyAiJChmaW5kc3RyaW5nIF8zM18sJEApIiBdIDsgdGhlbiBcCi0JCWVjaG8gLW4gIi4uLiAzMyBNSHogUENJIiA7IFwKKwkJZWNobyAiLi4uIDMzIE1IeiBQQ0kiIDsgXAogCWVsc2UgXAogCQllY2hvICIjZGVmaW5lIENPTkZJR19TWVNDTEtfNjZNIiA+PiQob2JqKWluY2x1ZGUvY29uZmlnLmggOyBcCi0JCWVjaG8gLW4gIi4uLiA2NiBNSHogUENJIiA7IFwKKwkJZWNobyAiLi4uIDY2IE1IeiBQQ0kiIDsgXAogCWZpIDsgXAogCWlmIFsgIiQoZmluZHN0cmluZyBfc2xhdmVfLCRAKSIgXSA7IHRoZW4gXAogCQllY2hvICIjZGVmaW5lIENPTkZJR19QQ0lfU0xBVkUiID4+JChvYmopaW5jbHVkZS9jb25maWcuaCA7IFwKQEAgLTE4MzIsOCArMTg2NCwxMCBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiBNUEM4NjQxSFBDTl9jb25maWc6ICAgIHVuY29uZmlnCi0JQC4vbWtjb25maWcgJChAOl9jb25maWc9KSBwcGMgbXBjODZ4eCBtcGM4NjQxaHBjbgorCUAkKE1LQ09ORklHKSAkKEA6X2NvbmZpZz0pIHBwYyBtcGM4Nnh4IG1wYzg2NDFocGNuCiAKK3NiYzg2NDFkX2NvbmZpZzoJdW5jb25maWcKKwlALi9ta2NvbmZpZyAkKEA6X2NvbmZpZz0pIHBwYyBtcGM4Nnh4IHNiYzg2NDFkCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIDc0eHgvN3h4IFN5c3RlbXMKQEAgLTE5ODksNiArMjAyMywxNSBAQAogb21hcDU5MTJvc2tfY29uZmlnIDoJdW5jb25maWcKIAlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBhcm0gYXJtOTI2ZWpzIG9tYXA1OTEyb3NrIE5VTEwgb21hcAogCitkYXZpbmNpX2R2ZXZtX2NvbmZpZyA6CXVuY29uZmlnCisJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgYXJtIGFybTkyNmVqcyBkdi1ldm0gZGF2aW5jaSBkYXZpbmNpCisKK2RhdmluY2lfc2NobW9vZ2llX2NvbmZpZyA6CXVuY29uZmlnCisJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgYXJtIGFybTkyNmVqcyBzY2htb29naWUgZGF2aW5jaSBkYXZpbmNpCisKK2RhdmluY2lfc29uYXRhX2NvbmZpZyA6CXVuY29uZmlnCisJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgYXJtIGFybTkyNmVqcyBzb25hdGEgZGF2aW5jaSBkYXZpbmNpCisKIG9tYXAxNjEwaW5uX2NvbmZpZyBcCiBvbWFwMTYxMGlubl9jczBib290X2NvbmZpZyBcCiBvbWFwMTYxMGlubl9jczNib290X2NvbmZpZyBcCkBAIC0xOTk5LDEzICsyMDQyLDEzIEBACiBvbWFwMTYxMGgyX2NzX2F1dG9ib290X2NvbmZpZzoJdW5jb25maWcKIAlAbWtkaXIgLXAgJChvYmopaW5jbHVkZQogCUBpZiBbICIkKGZpbmRzdHJpbmcgX2NzMGJvb3RfLCAkQCkiIF0gOyB0aGVuIFwKLQkJZWNobyAiI2RlZmluZSBDT05GSUdfQ1MwX0JPT1QiID4+IC4kKG9iaikvaW5jbHVkZS9jb25maWcuaCA7IFwKKwkJZWNobyAiI2RlZmluZSBDT05GSUdfQ1MwX0JPT1QiID4+IC4kKG9iailpbmNsdWRlL2NvbmZpZy5oIDsgXAogCQllY2hvICIuLi4gY29uZmlndXJlZCBmb3IgQ1MwIGJvb3QiOyBcCiAJZWxpZiBbICIkKGZpbmRzdHJpbmcgX2NzX2F1dG9ib290XywgJEApIiBdIDsgdGhlbiBcCi0JCWVjaG8gIiNkZWZpbmUgQ09ORklHX0NTX0FVVE9CT09UIiA+PiAkKG9iaikuL2luY2x1ZGUvY29uZmlnLmggOyBcCisJCWVjaG8gIiNkZWZpbmUgQ09ORklHX0NTX0FVVE9CT09UIiA+PiAkKG9iailpbmNsdWRlL2NvbmZpZy5oIDsgXAogCQllY2hvICIuLi4gY29uZmlndXJlZCBmb3IgQ1NfQVVUTyBib290IjsgXAogCWVsc2UgXAotCQllY2hvICIjZGVmaW5lIENPTkZJR19DUzNfQk9PVCIgPj4gJChvYmopLi9pbmNsdWRlL2NvbmZpZy5oIDsgXAorCQllY2hvICIjZGVmaW5lIENPTkZJR19DUzNfQk9PVCIgPj4gJChvYmopaW5jbHVkZS9jb25maWcuaCA7IFwKIAkJZWNobyAiLi4uIGNvbmZpZ3VyZWQgZm9yIENTMyBib290IjsgXAogCWZpOwogCUAkKE1LQ09ORklHKSAtYSAkKGNhbGwgeHRyYWN0X29tYXAxNjEweHh4LCRAKSBhcm0gYXJtOTI2ZWpzIG9tYXAxNjEwaW5uIE5VTEwgb21hcApAQCAtMjEzMCw3ICsyMTczLDEwIEBACiAJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgYXJtIGFybTcyMHQgZXZiNDUxMAogCiBscGMyMjkyc29kaW1tX2NvbmZpZzoJdW5jb25maWcKLQlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBhcm0gYXJtNzIwdCBscGMyMjkyc29kaW1tCisJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgYXJtIGFybTcyMHQgbHBjMjI5MnNvZGltbSBOVUxMIGxwYzIyOTIKKworU01ONDJfY29uZmlnCToJdW5jb25maWcKKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBhcm0gYXJtNzIwdCBTTU40MiBzaWVtZW5zIGxwYzIyOTIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgWFNjYWxlIFN5c3RlbXMKQEAgLTIxNzEsMTEgKzIyMTcsMTIgQEAKIAogcGRuYjNfY29uZmlnIFwKIHNjcHVfY29uZmlnOiAgICB1bmNvbmZpZworCUBta2RpciAtcCAkKG9iailpbmNsdWRlCiAJQGlmIFsgIiQoZmluZHN0cmluZyBzY3B1XywkQCkiIF0gOyB0aGVuIFwKLQkJZWNobyAiI2RlZmluZSBDT05GSUdfU0NQVSIgICAgICA+PmluY2x1ZGUvY29uZmlnLmggOyBcCisJCWVjaG8gIiNkZWZpbmUgQ09ORklHX1NDUFUiICAgICAgPj4kKG9iailpbmNsdWRlL2NvbmZpZy5oIDsgXAogCQllY2hvICIuLi4gb24gU0NQVSBib2FyZCB2YXJpYW50IiA7IFwKIAllbHNlIFwKLQkJPmluY2x1ZGUvY29uZmlnLmggOyBcCisJCT4kKG9iailpbmNsdWRlL2NvbmZpZy5oIDsgXAogCWZpCiAJQCQoTUtDT05GSUcpIC1hIHBkbmIzIGFybSBpeHAgcGRuYjMgcHJvZHJpdmUKIApAQCAtMjM5NywxNCArMjQ0NCwxNiBAQAogCUAkKE1LQ09ORklHKSAtYSAkKEA6X2NvbmZpZz0pIG1pY3JvYmxhemUgbWljcm9ibGF6ZSBzdXpha3UgQXRtYXJrVGVjaG5vCiAKIG1sNDAxX2NvbmZpZzoJdW5jb25maWcKLQlAID5pbmNsdWRlL2NvbmZpZy5oCi0JQGVjaG8gIiNkZWZpbmUgQ09ORklHX01MNDAxIDEiID4+IGluY2x1ZGUvY29uZmlnLmgKLQlALi9ta2NvbmZpZyAtYSAkKEA6X2NvbmZpZz0pIG1pY3JvYmxhemUgbWljcm9ibGF6ZSBtbDQwMSB4aWxpbngKKwlAbWtkaXIgLXAgJChvYmopaW5jbHVkZQorCUAgPiQob2JqKWluY2x1ZGUvY29uZmlnLmgKKwlAZWNobyAiI2RlZmluZSBDT05GSUdfTUw0MDEgMSIgPj4gJChvYmopaW5jbHVkZS9jb25maWcuaAorCUAkKE1LQ09ORklHKSAtYSAkKEA6X2NvbmZpZz0pIG1pY3JvYmxhemUgbWljcm9ibGF6ZSBtbDQwMSB4aWxpbngKIAogeHVwdjJwX2NvbmZpZzoJdW5jb25maWcKLQlAID5pbmNsdWRlL2NvbmZpZy5oCi0JQGVjaG8gIiNkZWZpbmUgQ09ORklHX1hVUFYyUCAxIiA+PiBpbmNsdWRlL2NvbmZpZy5oCi0JQC4vbWtjb25maWcgLWEgJChAOl9jb25maWc9KSBtaWNyb2JsYXplIG1pY3JvYmxhemUgeHVwdjJwIHhpbGlueAorCUBta2RpciAtcCAkKG9iailpbmNsdWRlCisJQCA+JChvYmopaW5jbHVkZS9jb25maWcuaAorCUBlY2hvICIjZGVmaW5lIENPTkZJR19YVVBWMlAgMSIgPj4gJChvYmopaW5jbHVkZS9jb25maWcuaAorCUAkKE1LQ09ORklHKSAtYSAkKEA6X2NvbmZpZz0pIG1pY3JvYmxhemUgbWljcm9ibGF6ZSB4dXB2MnAgeGlsaW54CiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIEJsYWNrZmluCkBAIC0yNDI5LDcgKzI0NzgsNyBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiBhdHN0azEwMDJfY29uZmlnCToJdW5jb25maWcKLQlALi9ta2NvbmZpZyAkKEA6X2NvbmZpZz0pIGF2cjMyIGF0MzJhcCBhdHN0azEwMDAgYXRtZWwgYXQzMmFwNzAwMAorCUAkKE1LQ09ORklHKSAkKEA6X2NvbmZpZz0pIGF2cjMyIGF0MzJhcCBhdHN0azEwMDAgYXRtZWwgYXQzMmFwNzAwMAogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0yNDQ2LDcgKzI0OTUsNyBAQAogCSAgICAgICQob2JqKWV4YW1wbGVzL3NtYzkxMTExX2VlcHJvbSAkKG9iailleGFtcGxlcy9pbnRlcnJ1cHQgXAogCSAgICAgICQob2JqKWV4YW1wbGVzL3Rlc3RfYnVyc3QKIAlybSAtZiAkKG9iail0b29scy9pbWcyc3JlYyAkKG9iail0b29scy9ta2ltYWdlICQob2JqKXRvb2xzL2VudmNyYyBcCi0JCSQob2JqKXRvb2xzL2dlbl9ldGhfYWRkcgorCQkkKG9iail0b29scy9nZW5fZXRoX2FkZHIgJChvYmopdG9vbHMvdWJzaGExCiAJcm0gLWYgJChvYmopdG9vbHMvbXBjODZ4X2NsayAkKG9iail0b29scy9uY2IKIAlybSAtZiAkKG9iail0b29scy9lYXN5bG9nby9lYXN5bG9nbyAkKG9iail0b29scy9ibXBfbG9nbwogCXJtIC1mICQob2JqKXRvb2xzL2dkYi9hc3Rlc3QgJChvYmopdG9vbHMvZ2RiL2dkYmNvbnQgJChvYmopdG9vbHMvZ2RiL2dkYnNlbmQKQEAgLTI0NjksNyArMjUxOCw3IEBACiAJcm0gLWYgJChPQkpTKSAkKG9iaikqLmJhayAkKG9iailjdGFncyAkKG9iailldGFncyAkKG9iailUQUdTICQob2JqKWluY2x1ZGUvdmVyc2lvbl9hdXRvZ2VuZXJhdGVkLmgKIAlybSAtZnIgJChvYmopKi4qfgogCXJtIC1mICQob2JqKXUtYm9vdCAkKG9iail1LWJvb3QubWFwICQob2JqKXUtYm9vdC5oZXggJChBTEwpCi0Jcm0gLWYgJChvYmopdG9vbHMvY3JjMzIuYyAkKG9iail0b29scy9lbnZpcm9ubWVudC5jICQob2JqKXRvb2xzL2Vudi9jcmMzMi5jCisJcm0gLWYgJChvYmopdG9vbHMvY3JjMzIuYyAkKG9iail0b29scy9lbnZpcm9ubWVudC5jICQob2JqKXRvb2xzL2Vudi9jcmMzMi5jICQob2JqKXRvb2xzL3NoYTEuYwogCXJtIC1mICQob2JqKXRvb2xzL2luY2Etc3dhcC1ieXRlcyAkKG9iailjcHUvbXBjODI0eC9iZWRidWdfNjAzZS5jCiAJcm0gLWYgJChvYmopaW5jbHVkZS9hc20vcHJvYyAkKG9iailpbmNsdWRlL2FzbS9hcmNoICQob2JqKWluY2x1ZGUvYXNtCiAJWyAhIC1kICQoT0JKVFJFRSkvbmFuZF9zcGwgXSB8fCBmaW5kICQob2JqKW5hbmRfc3BsIC1sbmFtZSAiKiIgLXByaW50IHwgeGFyZ3Mgcm0gLWYKZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQppbmRleCBiYjViNDZlLi4zOThlYTdlIDEwMDY0NAotLS0gYS9SRUFETUUKKysrIGIvUkVBRE1FCkBAIC0yMjgsMTEzICsyMjgsOSBAQAogCiBUaGUgZm9sbG93aW5nIG9wdGlvbnMgbmVlZCB0byBiZSBjb25maWd1cmVkOgogCi0tIENQVSBUeXBlOglEZWZpbmUgZXhhY3RseSBvbmUgb2YKKy0gQ1BVIFR5cGU6CURlZmluZSBleGFjdGx5IG9uZSwgZS5nLiBDT05GSUdfTVBDODVYWC4KIAotCQlQb3dlclBDIGJhc2VkIENQVXM6Ci0JCS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJQ09ORklHX01QQzgyMywJQ09ORklHX01QQzg1MCwJQ09ORklHX01QQzg1NSwJQ09ORklHX01QQzg2MAotCW9yCUNPTkZJR19NUEM1eHgKLQlvcglDT05GSUdfTVBDODIyMAotCW9yCUNPTkZJR19NUEM4MjRYLCBDT05GSUdfTVBDODI2MAotCW9yCUNPTkZJR19NUEM4NXh4Ci0Jb3IJQ09ORklHX0lPUDQ4MAotCW9yCUNPTkZJR180MDVHUAotCW9yCUNPTkZJR180MDVFUAotCW9yCUNPTkZJR180NDAKLQlvcglDT05GSUdfTVBDNzR4eAotCW9yCUNPTkZJR183NTBGWAotCi0JCUFSTSBiYXNlZCBDUFVzOgotCQktLS0tLS0tLS0tLS0tLS0KLQkJQ09ORklHX1NBMTExMAotCQlDT05GSUdfQVJNNwotCQlDT05GSUdfUFhBMjUwCi0JCUNPTkZJR19DUFVfTU9OQUhBTlMKLQotCQlNaWNyb0JsYXplIGJhc2VkIENQVXM6Ci0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJQ09ORklHX01JQ1JPQkxBWkUKLQotCQlOaW9zLTIgYmFzZWQgQ1BVczoKLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlDT05GSUdfTklPUzIKLQotCQlBVlIzMiBiYXNlZCBDUFVzOgotCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCUNPTkZJR19BVDMyQVAKLQotLSBCb2FyZCBUeXBlOglEZWZpbmUgZXhhY3RseSBvbmUgb2YKLQotCQlQb3dlclBDIGJhc2VkIGJvYXJkczoKLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQkJQ09ORklHX0FEQ0lPUAkJQ09ORklHX0ZQUzg2MEwJCUNPTkZJR19PWEMKLQkJQ09ORklHX0FEUzg2MAkJQ09ORklHX0dFTjg2MFQJCUNPTkZJR19QQ0k0MDUKLQkJQ09ORklHX0FNWDg2MAkJQ09ORklHX0dFTklFVFYJCUNPTkZJR19QQ0lQUEMyCi0JCUNPTkZJR19BUDEwMDAJCUNPTkZJR19HVEgJCUNPTkZJR19QQ0lQUEM2Ci0JCUNPTkZJR19BUjQwNQkJQ09ORklHX2d3ODI2MAkJQ09ORklHX3BjdV9lCi0JCUNPTkZJR19CQUI3eHgJCUNPTkZJR19oZXJtZXMJCUNPTkZJR19QSVA0MDUKLQkJQ09ORklHX0JDMzQ1MAkJQ09ORklHX2h5bW9kCQlDT05GSUdfUE04MjYKLQkJQ09ORklHX2MybW9uCQlDT05GSUdfSUFEMjEwCQlDT05GSUdfcHBtYzgyNjAKLQkJQ09ORklHX0NBTkJUCQlDT05GSUdfSUNVODYyCQlDT05GSUdfUVM4MjMKLQkJQ09ORklHX0NDTQkJQ09ORklHX0lQODYwCQlDT05GSUdfUVM4NTAKLQkJQ09ORklHX0NNSQkJQ09ORklHX0lQSEFTRTQ1MzkJQ09ORklHX1FTODYwVAotCQlDT05GSUdfY29nZW50X21wYzgyNjAJQ09ORklHX0lWTUwyNAkJQ09ORklHX1JCQzgyMwotCQlDT05GSUdfY29nZW50X21wYzh4eAlDT05GSUdfSVZNTDI0XzEyOAlDT05GSUdfUlBYQ2xhc3NpYwotCQlDT05GSUdfQ1BDSTQwNQkJQ09ORklHX0lWTUwyNF8yNTYJQ09ORklHX1JQWGxpdGUKLQkJQ09ORklHX0NQQ0k0MDUyCQlDT05GSUdfSVZNUzgJCUNPTkZJR19SUFhzdXBlcgotCQlDT05GSUdfQ1BDSUlTRVI0CUNPTkZJR19JVk1TOF8xMjgJQ09ORklHX3JzZHByb3RvCi0JCUNPTkZJR19DUFU4NgkJQ09ORklHX0lWTVM4XzI1NglDT05GSUdfc2Fjc25nCi0JCUNPTkZJR19DUkFZTDEJCUNPTkZJR19KU0UJCUNPTkZJR19TYW5kcG9pbnQ4MjQwCi0JCUNPTkZJR19DU0IyNzIJCUNPTkZJR19MQU5URUMJCUNPTkZJR19TYW5kcG9pbnQ4MjQ1Ci0JCUNPTkZJR19DVTgyNAkJQ09ORklHX0xJVEU1MjAwQglDT05GSUdfc2JjODI2MAotCQlDT05GSUdfREFTQV9TSU0JCUNPTkZJR19sd21vbgkJQ09ORklHX3NiYzg1NjAKLQkJQ09ORklHX0RCNjQzNjAJCUNPTkZJR19NQlgJCUNPTkZJR19TTTg1MAotCQlDT05GSUdfREI2NDQ2MAkJQ09ORklHX01CWDg2MFQJCUNPTkZJR19TUEQ4MjNUUwotCQlDT05GSUdfRFU0MDUJCUNPTkZJR19NSFBDCQlDT05GSUdfU1RYR1AzCi0JCUNPTkZJR19EVUVUX0FEUwkJQ09ORklHX01JUDQwNQkJQ09ORklHX1NYTkk4NTVUCi0JCUNPTkZJR19FQk9OWQkJQ09ORklHX01PVVNTRQkJQ09ORklHX1RRTTgyM0wKLQkJQ09ORklHX0VMUFBDCQlDT05GSUdfTVBDODI2MEFEUwlDT05GSUdfVFFNODI2MAotCQlDT05GSUdfRUxQVDg2MAkJQ09ORklHX01QQzg1NDBBRFMJQ09ORklHX1RRTTg1MEwKLQkJQ09ORklHX2VwODI2MAkJQ09ORklHX01QQzg1NDBFVkFMCUNPTkZJR19UUU04NTVMCi0JCUNPTkZJR19FUklDCQlDT05GSUdfTVBDODU2MEFEUwlDT05GSUdfVFFNODYwTAotCQlDT05GSUdfRVNURUVNMTkyRQlDT05GSUdfTVVTRU5LSQkJQ09ORklHX1RUVGVjaAotCQlDT05GSUdfRVRYMDk0CQlDT05GSUdfTVZTMQkJQ09ORklHX1VUWDgyNDUKLQkJQ09ORklHX0VWQjY0MjYwCQlDT05GSUdfTkVUUEhPTkUJCUNPTkZJR19WMzcKLQkJQ09ORklHX0ZBRFM4MjMJCUNPTkZJR19ORVRUQQkJQ09ORklHX1c3T0xNQwotCQlDT05GSUdfRkFEUzg1MFNBUglDT05GSUdfTkVUVklBCQlDT05GSUdfVzdPTE1HCi0JCUNPTkZJR19GQURTODYwVAkJQ09ORklHX05YODIzCQlDT05GSUdfV0FMTlVUCi0JCUNPTkZJR19GTEFHQURNCQlDT05GSUdfT0NSVEMJCUNPTkZJR19aUEMxOTAwCi0JCUNPTkZJR19GUFM4NTBMCQlDT05GSUdfT1JTRwkJQ09ORklHX1pVTUEKLQotCQlBUk0gYmFzZWQgYm9hcmRzOgotCQktLS0tLS0tLS0tLS0tLS0tLQotCi0JCUNPTkZJR19BUk1BRElMTE8sCUNPTkZJR19BVDkxUk05MjAwREssCUNPTkZJR19DRVJGMjUwLAotCQlDT05GSUdfQ1NCNjM3LAkJQ09ORklHX0RFTFRBLAkJQ09ORklHX0ROUDExMTAsCi0JCUNPTkZJR19FUDczMTIsCQlDT05GSUdfSDJfT01BUDE2MTAsCUNPTkZJR19ISFBfQ1JBRExFLAotCQlDT05GSUdfSU1QQTcsCSAgICBDT05GSUdfSU5OT1ZBVE9ST01BUDE1MTAsCUNPTkZJR19JTk5PVkFUT1JPTUFQMTYxMCwKLQkJQ09ORklHX0tCOTIwMiwJCUNPTkZJR19MQVJULAkJQ09ORklHX0xQRDdBNDAwLAotCQlDT05GSUdfTFVCQk9DSywJCUNPTkZJR19PU0tfT01BUDU5MTIsCUNPTkZJR19PTUFQMjQyMEg0LAotCQlDT05GSUdfUExFQjIsCQlDT05GSUdfU0hBTk5PTiwJCUNPTkZJR19QMl9PTUFQNzMwLAotCQlDT05GSUdfU01ESzI0MDAsCUNPTkZJR19TTURLMjQxMCwJQ09ORklHX1RSQUIsCi0JCUNPTkZJR19WQ01BOQotCi0JCU1pY3JvQmxhemUgYmFzZWQgYm9hcmRzOgotCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCQlDT05GSUdfU1VaQUtVCi0KLQkJTmlvcy0yIGJhc2VkIGJvYXJkczoKLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQkJQ09ORklHX1BDSTU0NDEgQ09ORklHX1BLMUMyMAotCQlDT05GSUdfRVAxQzIwIENPTkZJR19FUDFTMTAgQ09ORklHX0VQMVM0MAotCi0JCUFWUjMyIGJhc2VkIGJvYXJkczoKLQkJLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JCUNPTkZJR19BVFNUSzEwMDAKKy0gQm9hcmQgVHlwZToJRGVmaW5lIGV4YWN0bHkgb25lLCBlLmcuIENPTkZJR19NUEM4NTQwQURTLgogCiAtIENQVSBEYXVnaHRlcmJvYXJkIFR5cGU6IChpZiBDT05GSUdfQVRTVEsxMDAwIGlzIGRlZmluZWQpCiAJCURlZmluZSBleGFjdGx5IG9uZSBvZgpAQCAtNTQxLDcgKzQzNyw3IEBACiAJCQlDRkdfQ09OU09MRV9CTElOS19DT1VOVCBibGluayBpbnRlcnZhbCAoY2YuIGk4MDQyLmMpCiAJCQlDT05GSUdfQ09OU09MRV9USU1FCWRpc3BsYXkgdGltZS9kYXRlIGluZm8gaW4KIAkJCQkJCXVwcGVyIHJpZ2h0IGNvcm5lcgotCQkJCQkJKHJlcXVpcmVzIENGR19DTURfREFURSkKKwkJCQkJCShyZXF1aXJlcyBDT05GSUdfQ01EX0RBVEUpCiAJCQlDT05GSUdfVklERU9fTE9HTwlkaXNwbGF5IExpbnV4IGxvZ28gaW4KIAkJCQkJCXVwcGVyIGxlZnQgY29ybmVyCiAJCQlDT05GSUdfVklERU9fQk1QX0xPR08JdXNlIGJtcF9sb2dvLmggaW5zdGVhZCBvZgpAQCAtNjQ1LDEwMyArNTQxLDk2IEBACiAJCXRpbWUgb24gb3RoZXJzLiBUaGlzIHNldHRpbmcgI2RlZmluZSdzIHRoZSBpbml0aWFsCiAJCXZhbHVlIG9mIHRoZSAibG9hZHNfZWNobyIgZW52aXJvbm1lbnQgdmFyaWFibGUuCiAKLS0gS2dkYiBTZXJpYWwgQmF1ZHJhdGU6IChpZiBDRkdfQ01EX0tHREIgaXMgZGVmaW5lZCkKKy0gS2dkYiBTZXJpYWwgQmF1ZHJhdGU6IChpZiBDT05GSUdfQ01EX0tHREIgaXMgZGVmaW5lZCkKIAkJQ09ORklHX0tHREJfQkFVRFJBVEUKIAkJU2VsZWN0IG9uZSBvZiB0aGUgYmF1ZHJhdGVzIGxpc3RlZCBpbgogCQlDRkdfQkFVRFJBVEVfVEFCTEUsIHNlZSBiZWxvdy4KIAogLSBNb25pdG9yIEZ1bmN0aW9uczoKLQkJQ09ORklHX0NPTU1BTkRTCi0JCU1vc3QgbW9uaXRvciBmdW5jdGlvbnMgY2FuIGJlIHNlbGVjdGVkIChvcgotCQlkZS1zZWxlY3RlZCkgYnkgYWRqdXN0aW5nIHRoZSBkZWZpbml0aW9uIG9mCi0JCUNPTkZJR19DT01NQU5EUzsgdG8gc2VsZWN0IGluZGl2aWR1YWwgZnVuY3Rpb25zLAotCQkjZGVmaW5lIENPTkZJR19DT01NQU5EUyBieSAiT1IiaW5nIGFueSBvZiB0aGUKLQkJZm9sbG93aW5nIHZhbHVlczoKKwkJTW9uaXRvciBjb21tYW5kcyBjYW4gYmUgaW5jbHVkZWQgb3IgZXhjbHVkZWQKKwkJZnJvbSB0aGUgYnVpbGQgYnkgdXNpbmcgdGhlICNpbmNsdWRlIGZpbGVzCisJCSJjb25maWdfY21kX2FsbC5oIiBhbmQgI3VuZGVmJ2luZyB1bndhbnRlZAorCQljb21tYW5kcywgb3IgdXNpbmcgImNvbmZpZ19jbWRfZGVmYXVsdC5oIgorCQlhbmQgYXVnbWVudGluZyB3aXRoIGFkZGl0aW9uYWwgI2RlZmluZSdzCisJCWZvciB3YW50ZWQgY29tbWFuZHMuCiAKLQkJI2RlZmluZSBlbmFibGVzIGNvbW1hbmRzOgotCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCUNGR19DTURfQVNLRU5WCSogYXNrIGZvciBlbnYgdmFyaWFibGUKLQkJQ0ZHX0NNRF9BVVRPU0NSSVBUIEF1dG9zY3JpcHQgU3VwcG9ydAotCQlDRkdfQ01EX0JESQkgIGJkaW5mbwotCQlDRkdfQ01EX0JFREJVRwkqIEluY2x1ZGUgQmVkQnVnIERlYnVnZ2VyCi0JCUNGR19DTURfQk1QCSogQk1QIHN1cHBvcnQKLQkJQ0ZHX0NNRF9CU1AJKiBCb2FyZCBzcGVjaWZpYyBjb21tYW5kcwotCQlDRkdfQ01EX0JPT1RECSAgYm9vdGQKLQkJQ0ZHX0NNRF9DQUNIRQkqIGljYWNoZSwgZGNhY2hlCi0JCUNGR19DTURfQ09OU09MRQkgIGNvbmluZm8KLQkJQ0ZHX0NNRF9EQVRFCSogc3VwcG9ydCBmb3IgUlRDLCBkYXRlL3RpbWUuLi4KLQkJQ0ZHX0NNRF9ESENQCSogREhDUCBzdXBwb3J0Ci0JCUNGR19DTURfRElBRwkqIERpYWdub3N0aWNzCi0JCUNGR19DTURfRE9DCSogRGlzay1Pbi1DaGlwIFN1cHBvcnQKLQkJQ0ZHX0NNRF9EVFQJKiBEaWdpdGFsIFRoZXJtIGFuZCBUaGVybW9zdGF0Ci0JCUNGR19DTURfRUNITwkgIGVjaG8gYXJndW1lbnRzCi0JCUNGR19DTURfRUVQUk9NCSogRUVQUk9NIHJlYWQvd3JpdGUgc3VwcG9ydAotCQlDRkdfQ01EX0VMRgkqIGJvb3RlbGYsIGJvb3R2eAotCQlDRkdfQ01EX0VOVgkgIHNhdmVlbnYKLQkJQ0ZHX0NNRF9GREMJKiBGbG9wcHkgRGlzayBTdXBwb3J0Ci0JCUNGR19DTURfRkFUCSogRkFUIHBhcnRpdGlvbiBzdXBwb3J0Ci0JCUNGR19DTURfRkRPUwkqIERvcyBkaXNrZXR0ZSBTdXBwb3J0Ci0JCUNGR19DTURfRkxBU0gJICBmbGluZm8sIGVyYXNlLCBwcm90ZWN0Ci0JCUNGR19DTURfRlBHQQkgIEZQR0EgZGV2aWNlIGluaXRpYWxpemF0aW9uIHN1cHBvcnQKLQkJQ0ZHX0NNRF9IV0ZMT1cJKiBSVFMvQ1RTIGh3IGZsb3cgY29udHJvbAotCQlDRkdfQ01EX0kyQwkqIEkyQyBzZXJpYWwgYnVzIHN1cHBvcnQKLQkJQ0ZHX0NNRF9JREUJKiBJREUgaGFyZGRpc2sgc3VwcG9ydAotCQlDRkdfQ01EX0lNSQkgIGltaW5mbwotCQlDRkdfQ01EX0lNTFMJICBMaXN0IGFsbCBmb3VuZCBpbWFnZXMKLQkJQ0ZHX0NNRF9JTU1BUAkqIElNTVIgZHVtcCBzdXBwb3J0Ci0JCUNGR19DTURfSVJRCSogaXJxaW5mbwotCQlDRkdfQ01EX0lURVNUCSAgSW50ZWdlci9zdHJpbmcgdGVzdCBvZiAyIHZhbHVlcwotCQlDRkdfQ01EX0pGRlMyCSogSkZGUzIgU3VwcG9ydAotCQlDRkdfQ01EX0tHREIJKiBrZ2RiCi0JCUNGR19DTURfTE9BREIJICBsb2FkYgotCQlDRkdfQ01EX0xPQURTCSAgbG9hZHMKLQkJQ0ZHX0NNRF9NRU1PUlkJICBtZCwgbW0sIG5tLCBtdywgY3AsIGNtcCwgY3JjLCBiYXNlLAotCQkJCSAgbG9vcCwgbG9vcHcsIG10ZXN0Ci0JCUNGR19DTURfTUlTQwkgIE1pc2MgZnVuY3Rpb25zIGxpa2Ugc2xlZXAgZXRjCi0JCUNGR19DTURfTU1DCSogTU1DIG1lbW9yeSBtYXBwZWQgc3VwcG9ydAotCQlDRkdfQ01EX01JSQkqIE1JSSB1dGlsaXR5IGNvbW1hbmRzCi0JCUNGR19DTURfTkFORAkqIE5BTkQgc3VwcG9ydAotCQlDRkdfQ01EX05FVAkgIGJvb3RwLCB0ZnRwYm9vdCwgcmFycGJvb3QKLQkJQ0ZHX0NNRF9QQ0kJKiBwY2lpbmZvCi0JCUNGR19DTURfUENNQ0lBCSogUENNQ0lBIHN1cHBvcnQKLQkJQ0ZHX0NNRF9QSU5HCSogc2VuZCBJQ01QIEVDSE9fUkVRVUVTVCB0byBuZXR3b3JrIGhvc3QKLQkJQ0ZHX0NNRF9QT1JUSU8JKiBQb3J0IEkvTwotCQlDRkdfQ01EX1JFR0lORk8gKiBSZWdpc3RlciBkdW1wCi0JCUNGR19DTURfUlVOCSAgcnVuIGNvbW1hbmQgaW4gZW52IHZhcmlhYmxlCi0JCUNGR19DTURfU0FWRVMJKiBzYXZlIFMgcmVjb3JkIGR1bXAKLQkJQ0ZHX0NNRF9TQ1NJCSogU0NTSSBTdXBwb3J0Ci0JCUNGR19DTURfU0RSQU0JKiBwcmludCBTRFJBTSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCi0JCQkJICAocmVxdWlyZXMgQ0ZHX0NNRF9JMkMpCi0JCUNGR19DTURfU0VUR0VURENSIFN1cHBvcnQgZm9yIERDUiBSZWdpc3RlciBhY2Nlc3MgKDR4eCBvbmx5KQotCQlDRkdfQ01EX1NQSQkqIFNQSSBzZXJpYWwgYnVzIHN1cHBvcnQKLQkJQ0ZHX0NNRF9VU0IJKiBVU0Igc3VwcG9ydAotCQlDRkdfQ01EX1ZGRAkqIFZGRCBzdXBwb3J0IChUUkFCKQotCQlDRkdfQ01EX0JTUAkqIEJvYXJkIFNQZWNpZmljIGZ1bmN0aW9ucwotCQlDRkdfQ01EX0NEUAkqIENpc2NvIERpc2NvdmVyIFByb3RvY29sIHN1cHBvcnQKLQkJQ0ZHX0NNRF9GU0wJKiBNaWNyb2JsYXplIEZTTCBzdXBwb3J0Ci0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCUNGR19DTURfQUxMCWFsbAorCQlUaGUgZGVmYXVsdCBjb21tYW5kIGNvbmZpZ3VyYXRpb24gaW5jbHVkZXMgYWxsIGNvbW1hbmRzCisJCWV4Y2VwdCB0aG9zZSBtYXJrZWQgYmVsb3cgd2l0aCBhICIqIi4KIAotCQlDT05GSUdfQ01EX0RGTAlEZWZhdWx0IGNvbmZpZ3VyYXRpb247IGF0IHRoZSBtb21lbnQKLQkJCQl0aGlzIGlzIGluY2x1ZGVzIGFsbCBjb21tYW5kcywgZXhjZXB0Ci0JCQkJdGhlIG9uZXMgbWFya2VkIHdpdGggIioiIGluIHRoZSBsaXN0Ci0JCQkJYWJvdmUuCisJCUNPTkZJR19DTURfQVNLRU5WCSogYXNrIGZvciBlbnYgdmFyaWFibGUKKwkJQ09ORklHX0NNRF9BVVRPU0NSSVBUCSAgQXV0b3NjcmlwdCBTdXBwb3J0CisJCUNPTkZJR19DTURfQkRJCQkgIGJkaW5mbworCQlDT05GSUdfQ01EX0JFREJVRwkqIEluY2x1ZGUgQmVkQnVnIERlYnVnZ2VyCisJCUNPTkZJR19DTURfQk1QCQkqIEJNUCBzdXBwb3J0CisJCUNPTkZJR19DTURfQlNQCQkqIEJvYXJkIHNwZWNpZmljIGNvbW1hbmRzCisJCUNPTkZJR19DTURfQk9PVEQJICBib290ZAorCQlDT05GSUdfQ01EX0NBQ0hFCSogaWNhY2hlLCBkY2FjaGUKKwkJQ09ORklHX0NNRF9DT05TT0xFCSAgY29uaW5mbworCQlDT05GSUdfQ01EX0RBVEUJCSogc3VwcG9ydCBmb3IgUlRDLCBkYXRlL3RpbWUuLi4KKwkJQ09ORklHX0NNRF9ESENQCQkqIERIQ1Agc3VwcG9ydAorCQlDT05GSUdfQ01EX0RJQUcJCSogRGlhZ25vc3RpY3MKKwkJQ09ORklHX0NNRF9ET0MJCSogRGlzay1Pbi1DaGlwIFN1cHBvcnQKKwkJQ09ORklHX0NNRF9EVFQJCSogRGlnaXRhbCBUaGVybSBhbmQgVGhlcm1vc3RhdAorCQlDT05GSUdfQ01EX0VDSE8JCSAgZWNobyBhcmd1bWVudHMKKwkJQ09ORklHX0NNRF9FRVBST00JKiBFRVBST00gcmVhZC93cml0ZSBzdXBwb3J0CisJCUNPTkZJR19DTURfRUxGCQkqIGJvb3RlbGYsIGJvb3R2eAorCQlDT05GSUdfQ01EX0VOVgkJICBzYXZlZW52CisJCUNPTkZJR19DTURfRkRDCQkqIEZsb3BweSBEaXNrIFN1cHBvcnQKKwkJQ09ORklHX0NNRF9GQVQJCSogRkFUIHBhcnRpdGlvbiBzdXBwb3J0CisJCUNPTkZJR19DTURfRkRPUwkJKiBEb3MgZGlza2V0dGUgU3VwcG9ydAorCQlDT05GSUdfQ01EX0ZMQVNICSAgZmxpbmZvLCBlcmFzZSwgcHJvdGVjdAorCQlDT05GSUdfQ01EX0ZQR0EJCSAgRlBHQSBkZXZpY2UgaW5pdGlhbGl6YXRpb24gc3VwcG9ydAorCQlDT05GSUdfQ01EX0hXRkxPVwkqIFJUUy9DVFMgaHcgZmxvdyBjb250cm9sCisJCUNPTkZJR19DTURfSTJDCQkqIEkyQyBzZXJpYWwgYnVzIHN1cHBvcnQKKwkJQ09ORklHX0NNRF9JREUJCSogSURFIGhhcmRkaXNrIHN1cHBvcnQKKwkJQ09ORklHX0NNRF9JTUkJCSAgaW1pbmZvCisJCUNPTkZJR19DTURfSU1MUwkJICBMaXN0IGFsbCBmb3VuZCBpbWFnZXMKKwkJQ09ORklHX0NNRF9JTU1BUAkqIElNTVIgZHVtcCBzdXBwb3J0CisJCUNPTkZJR19DTURfSVJRCQkqIGlycWluZm8KKwkJQ09ORklHX0NNRF9JVEVTVAkgIEludGVnZXIvc3RyaW5nIHRlc3Qgb2YgMiB2YWx1ZXMKKwkJQ09ORklHX0NNRF9KRkZTMgkqIEpGRlMyIFN1cHBvcnQKKwkJQ09ORklHX0NNRF9LR0RCCQkqIGtnZGIKKwkJQ09ORklHX0NNRF9MT0FEQgkgIGxvYWRiCisJCUNPTkZJR19DTURfTE9BRFMJICBsb2FkcworCQlDT05GSUdfQ01EX01FTU9SWQkgIG1kLCBtbSwgbm0sIG13LCBjcCwgY21wLCBjcmMsIGJhc2UsCisJCQkJCSAgbG9vcCwgbG9vcHcsIG10ZXN0CisJCUNPTkZJR19DTURfTUlTQwkJICBNaXNjIGZ1bmN0aW9ucyBsaWtlIHNsZWVwIGV0YworCQlDT05GSUdfQ01EX01NQwkJKiBNTUMgbWVtb3J5IG1hcHBlZCBzdXBwb3J0CisJCUNPTkZJR19DTURfTUlJCQkqIE1JSSB1dGlsaXR5IGNvbW1hbmRzCisJCUNPTkZJR19DTURfTkFORAkJKiBOQU5EIHN1cHBvcnQKKwkJQ09ORklHX0NNRF9ORVQJCSAgYm9vdHAsIHRmdHBib290LCByYXJwYm9vdAorCQlDT05GSUdfQ01EX1BDSQkJKiBwY2lpbmZvCisJCUNPTkZJR19DTURfUENNQ0lBCQkqIFBDTUNJQSBzdXBwb3J0CisJCUNPTkZJR19DTURfUElORwkJKiBzZW5kIElDTVAgRUNIT19SRVFVRVNUIHRvIG5ldHdvcmsKKwkJCQkJICBob3N0CisJCUNPTkZJR19DTURfUE9SVElPCSogUG9ydCBJL08KKwkJQ09ORklHX0NNRF9SRUdJTkZPCSogUmVnaXN0ZXIgZHVtcAorCQlDT05GSUdfQ01EX1JVTgkJICBydW4gY29tbWFuZCBpbiBlbnYgdmFyaWFibGUKKwkJQ09ORklHX0NNRF9TQVZFUwkqIHNhdmUgUyByZWNvcmQgZHVtcAorCQlDT05GSUdfQ01EX1NDU0kJCSogU0NTSSBTdXBwb3J0CisJCUNPTkZJR19DTURfU0RSQU0JKiBwcmludCBTRFJBTSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCisJCQkJCSAgKHJlcXVpcmVzIENPTkZJR19DTURfSTJDKQorCQlDT05GSUdfQ01EX1NFVEdFVERDUgkgIFN1cHBvcnQgZm9yIERDUiBSZWdpc3RlciBhY2Nlc3MKKwkJCQkJICAoNHh4IG9ubHkpCisJCUNPTkZJR19DTURfU1BJCQkqIFNQSSBzZXJpYWwgYnVzIHN1cHBvcnQKKwkJQ09ORklHX0NNRF9VU0IJCSogVVNCIHN1cHBvcnQKKwkJQ09ORklHX0NNRF9WRkQJCSogVkZEIHN1cHBvcnQgKFRSQUIpCisJCUNPTkZJR19DTURfQlNQCQkqIEJvYXJkIFNQZWNpZmljIGZ1bmN0aW9ucworCQlDT05GSUdfQ01EX0NEUAkJKiBDaXNjbyBEaXNjb3ZlciBQcm90b2NvbCBzdXBwb3J0CisJCUNPTkZJR19DTURfRlNMCQkqIE1pY3JvYmxhemUgRlNMIHN1cHBvcnQKIAotCQlJZiB5b3UgZG9uJ3QgZGVmaW5lIENPTkZJR19DT01NQU5EUyBpdCBkZWZhdWx0cyB0bwotCQlDT05GSUdfQ01EX0RGTCBpbiBpbmNsdWRlL2NtZF9jb25mZGVmcy5oLiBBIGJvYXJkIGNhbgotCQlvdmVycmlkZSB0aGUgZGVmYXVsdCBzZXR0aW5ncyBpbiB0aGUgcmVzcGVjdGl2ZQotCQlpbmNsdWRlIGZpbGUuCiAKIAkJRVhBTVBMRTogSWYgeW91IHdhbnQgYWxsIGZ1bmN0aW9ucyBleGNlcHQgb2YgbmV0d29yawogCQlzdXBwb3J0IHlvdSBjYW4gd3JpdGU6CiAKLQkJI2RlZmluZSBDT05GSUdfQ09NTUFORFMgKENGR19DTURfQUxMICYgfkNGR19DTURfTkVUKQorCQkjaW5jbHVkZSAiY29uZmlnX2NtZF9hbGwuaCIKKwkJI3VuZGVmIENPTkZJR19DTURfTkVUCiAKIAlPdGhlciBDb21tYW5kczoKIAkJZmR0IChmbGF0dGVuZWQgZGV2aWNlIHRyZWUpIGNvbW1hbmQ6IENPTkZJR19PRl9MSUJGRFQKIAogCU5vdGU6CURvbid0IGVuYWJsZSB0aGUgImljYWNoZSIgYW5kICJkY2FjaGUiIGNvbW1hbmRzCi0JCShjb25maWd1cmF0aW9uIG9wdGlvbiBDRkdfQ01EX0NBQ0hFKSB1bmxlc3MgeW91IGtub3cKKwkJKGNvbmZpZ3VyYXRpb24gb3B0aW9uIENPTkZJR19DTURfQ0FDSEUpIHVubGVzcyB5b3Uga25vdwogCQl3aGF0IHlvdSAoYW5kIHlvdXIgVS1Cb290IHVzZXJzKSBhcmUgZG9pbmcuIERhdGEKIAkJY2FjaGUgY2Fubm90IGJlIGVuYWJsZWQgb24gc3lzdGVtcyBsaWtlIHRoZSA4eHggb3IKIAkJODI2MCAod2hlcmUgYWNjZXNzZXMgdG8gdGhlIElNTVIgcmVnaW9uIG11c3QgYmUKQEAgLTc2OSw3ICs2NTgsNyBAQAogCiAtIFJlYWwtVGltZSBDbG9jazoKIAotCQlXaGVuIENGR19DTURfREFURSBpcyBzZWxlY3RlZCwgdGhlIHR5cGUgb2YgdGhlIFJUQworCQlXaGVuIENPTkZJR19DTURfREFURSBpcyBzZWxlY3RlZCwgdGhlIHR5cGUgb2YgdGhlIFJUQwogCQloYXMgdG8gYmUgc2VsZWN0ZWQsIHRvby4gRGVmaW5lIGV4YWN0bHkgb25lIG9mIHRoZQogCQlmb2xsb3dpbmcgb3B0aW9uczoKIApAQCAtNzkwLDE0ICs2NzksMTQgQEAKIAkJV2hlbiBDT05GSUdfVElNRVNUQU1QIGlzIHNlbGVjdGVkLCB0aGUgdGltZXN0YW1wCiAJCShkYXRlIGFuZCB0aW1lKSBvZiBhbiBpbWFnZSBpcyBwcmludGVkIGJ5IGltYWdlCiAJCWNvbW1hbmRzIGxpa2UgYm9vdG0gb3IgaW1pbmZvLiBUaGlzIG9wdGlvbiBpcwotCQlhdXRvbWF0aWNhbGx5IGVuYWJsZWQgd2hlbiB5b3Ugc2VsZWN0IENGR19DTURfREFURSAuCisJCWF1dG9tYXRpY2FsbHkgZW5hYmxlZCB3aGVuIHlvdSBzZWxlY3QgQ09ORklHX0NNRF9EQVRFIC4KIAogLSBQYXJ0aXRpb24gU3VwcG9ydDoKIAkJQ09ORklHX01BQ19QQVJUSVRJT04gYW5kL29yIENPTkZJR19ET1NfUEFSVElUSU9OCiAJCWFuZC9vciBDT05GSUdfSVNPX1BBUlRJVElPTgogCi0JCUlmIElERSBvciBTQ1NJIHN1cHBvcnQJaXMgIGVuYWJsZWQgIChDRkdfQ01EX0lERSAgb3IKLQkJQ0ZHX0NNRF9TQ1NJKSB5b3UgbXVzdCBjb25maWd1cmUgc3VwcG9ydCBmb3IgYXQgbGVhc3QKKwkJSWYgSURFIG9yIFNDU0kgc3VwcG9ydAlpcyAgZW5hYmxlZCAgKENPTkZJR19DTURfSURFIG9yCisJCUNPTkZJR19DTURfU0NTSSkgeW91IG11c3QgY29uZmlndXJlIHN1cHBvcnQgZm9yIGF0IGxlYXN0CiAJCW9uZSBwYXJ0aXRpb24gdHlwZSBhcyB3ZWxsLgogCiAtIElERSBSZXNldCBtZXRob2Q6CkBAIC05MDAsNiArNzg5LDcxIEBACiAJCQlDT05GSUdfVVNCX0NPTkZJRwogCQkJCWZvciBkaWZmZXJlbnRpYWwgZHJpdmVyczogMHgwMDAwMTAwMAogCQkJCWZvciBzaW5nbGUgZW5kZWQgZHJpdmVyczogMHgwMDAwNTAwMAorCQkJQ0ZHX1VTQl9FVkVOVF9QT0xMCisJCQkJTWF5IGJlIGRlZmluZWQgdG8gYWxsb3cgaW50ZXJydXB0IHBvbGxpbmcKKwkJCQlpbnN0ZWFkIG9mIHVzaW5nIGFzeW5jaHJvbm91cyBpbnRlcnJ1cHRzCisKKy0gVVNCIERldmljZToKKwkJRGVmaW5lIHRoZSBiZWxvdyBpZiB5b3Ugd2lzaCB0byB1c2UgdGhlIFVTQiBjb25zb2xlLgorCQlPbmNlIGZpcm13YXJlIGlzIHJlYnVpbHQgZnJvbSBhIHNlcmlhbCBjb25zb2xlIGlzc3VlIHRoZQorCQljb21tYW5kICJzZXRlbnYgc3RkaW4gdXNidHR5OyBzZXRlbnYgc3Rkb3V0IHVzYnR0eSIgYW5kCisJCWF0dGFjaCB5b3VyIHVzYiBjYWJsZS4gVGhlIFVuaXggY29tbWFuZCAiZG1lc2ciIHNob3VsZCBwcmludAorCQlpdCBoYXMgZm91bmQgYSBuZXcgZGV2aWNlLiBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgdXNidHR5CisJCWNhbiBiZSBzZXQgdG8gZ3NlcmlhbCBvciBjZGNfYWNtIHRvIGVuYWJsZSB5b3VyIGRldmljZSB0bworCQlhcHBlYXIgdG8gYSBVU0IgaG9zdCBhcyBhIExpbnV4IGdzZXJpYWwgZGV2aWNlIG9yIGEKKwkJQ29tbW9uIERldmljZSBDbGFzcyBBYnN0cmFjdCBDb250cm9sIE1vZGVsIHNlcmlhbCBkZXZpY2UuCisJCUlmIHlvdSBzZWxlY3QgdXNidHR5ID0gZ3NlcmlhbCB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gZW51bWVyYXRlCisJCWEgTGludXggaG9zdCBieQorCQkjIG1vZHByb2JlIHVzYnNlcmlhbCB2ZW5kb3I9MHhWZW5kb3JJRCBwcm9kdWN0PTB4UHJvZHVjdElECisJCWVsc2UgaWYgdXNpbmcgY2RjX2FjbSwgc2ltcGx5IHNldHRpbmcgdGhlIGVudmlyb25tZW50CisJCXZhcmlhYmxlIHVzYnR0eSB0byBiZSBjZGNfYWNtIHNob3VsZCBzdWZmaWNlLiBUaGUgZm9sbG93aW5nCisJCW1pZ2h0IGJlIGRlZmluZWQgaW4gWW91ckJvYXJkTmFtZS5oCisKKwkJCUNPTkZJR19VU0JfREVWSUNFCisJCQlEZWZpbmUgdGhpcyB0byBidWlsZCBhIFVEQyBkZXZpY2UKKworCQkJQ09ORklHX1VTQl9UVFkKKwkJCURlZmluZSB0aGlzIHRvIGhhdmUgYSB0dHkgdHlwZSBvZiBkZXZpY2UgYXZhaWxhYmxlIHRvCisJCQl0YWxrIHRvIHRoZSBVREMgZGV2aWNlCisKKwkJCUNGR19DT05TT0xFX0lTX0lOX0VOVgorCQkJRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgc3RkaW4sIHN0ZG91dCAmL29yIHN0ZGVyciB0bworCQkJYmUgc2V0IHRvIHVzYnR0eS4KKworCQkJbXBjOHh4OgorCQkJCUNGR19VU0JfRVhUQ19DTEsgMHhCTEFICisJCQkJRGVyaXZlIFVTQiBjbG9jayBmcm9tIGV4dGVybmFsIGNsb2NrICJibGFoIgorCQkJCS0gQ0ZHX1VTQl9FWFRDX0NMSyAweDAyCisKKwkJCQlDRkdfVVNCX0JSR19DTEsgMHhCTEFICisJCQkJRGVyaXZlIFVTQiBjbG9jayBmcm9tIGJyZ2NsaworCQkJCS0gQ0ZHX1VTQl9CUkdfQ0xLIDB4MDQKKworCQlJZiB5b3UgaGF2ZSBhIFVTQi1JRiBhc3NpZ25lZCBWZW5kb3JJRCB0aGVuIHlvdSBtYXkgd2lzaCB0bworCQlkZWZpbmUgeW91ciBvd24gdmVuZG9yIHNwZWNpZmljIHZhbHVlcyBlaXRoZXIgaW4gQm9hcmROYW1lLmgKKwkJb3IgZGlyZWN0bHkgaW4gdXNiZF92ZW5kb3JfaW5mby5oLiBJZiB5b3UgZG9uJ3QgZGVmaW5lCisJCUNPTkZJR19VU0JEX01BTlVGQUNUVVJFUiwgQ09ORklHX1VTQkRfUFJPRFVDVF9OQU1FLAorCQlDT05GSUdfVVNCRF9WRU5ET1JJRCBhbmQgQ09ORklHX1VTQkRfUFJPRFVDVElELCB0aGVuIFUtQm9vdAorCQlzaG91bGQgcHJldGVuZCB0byBiZSBhIExpbnV4IGRldmljZSB0byBpdCdzIHRhcmdldCBob3N0LgorCisJCQlDT05GSUdfVVNCRF9NQU5VRkFDVFVSRVIKKwkJCURlZmluZSB0aGlzIHN0cmluZyBhcyB0aGUgbmFtZSBvZiB5b3VyIGNvbXBhbnkgZm9yCisJCQktIENPTkZJR19VU0JEX01BTlVGQUNUVVJFUiAibXkgY29tcGFueSIKKworCQkJQ09ORklHX1VTQkRfUFJPRFVDVF9OQU1FCisJCQlEZWZpbmUgdGhpcyBzdHJpbmcgYXMgdGhlIG5hbWUgb2YgeW91ciBwcm9kdWN0CisJCQktIENPTkZJR19VU0JEX1BST0RVQ1RfTkFNRSAiYWNtZSB1c2IgZGV2aWNlIgorCisJCQlDT05GSUdfVVNCRF9WRU5ET1JJRAorCQkJRGVmaW5lIHRoaXMgYXMgeW91ciBhc3NpZ25lZCBWZW5kb3IgSUQgZnJvbSB0aGUgVVNCCisJCQlJbXBsZW1lbnRvcnMgRm9ydW0uIFRoaXMgKm11c3QqIGJlIGEgZ2VudWluZSBWZW5kb3IgSUQKKwkJCXRvIGF2b2lkIHBvbGx1dGluZyB0aGUgVVNCIG5hbWVzcGFjZS4KKwkJCS0gQ09ORklHX1VTQkRfVkVORE9SSUQgMHhGRkZGCisKKwkJCUNPTkZJR19VU0JEX1BST0RVQ1RJRAorCQkJRGVmaW5lIHRoaXMgYXMgdGhlIHVuaXF1ZSBQcm9kdWN0IElECisJCQlmb3IgeW91ciBkZXZpY2UKKwkJCS0gQ09ORklHX1VTQkRfUFJPRFVDVElEIDB4RkZGRgogCiAKIC0gTU1DIFN1cHBvcnQ6CkBAIC05MDcsOCArODYxLDggQEAKIAkJZW5hYmxlIHRoaXMgZGVmaW5lIENPTkZJR19NTUMuIFRoZSBNTUMgY2FuIGJlCiAJCWFjY2Vzc2VkIGZyb20gdGhlIGJvb3QgcHJvbXB0IGJ5IG1hcHBpbmcgdGhlIGRldmljZQogCQl0byBwaHlzaWNhbCBtZW1vcnkgc2ltaWxhciB0byBmbGFzaC4gQ29tbWFuZCBsaW5lIGlzCi0JCWVuYWJsZWQgd2l0aCBDRkdfQ01EX01NQy4gVGhlIE1NQyBkcml2ZXIgYWxzbyB3b3JrcyB3aXRoCi0JCXRoZSBGQVQgZnMuIFRoaXMgaXMgZW5hYmxlZCB3aXRoIENGR19DTURfRkFULgorCQllbmFibGVkIHdpdGggQ09ORklHX0NNRF9NTUMuIFRoZSBNTUMgZHJpdmVyIGFsc28gd29ya3Mgd2l0aAorCQl0aGUgRkFUIGZzLiBUaGlzIGlzIGVuYWJsZWQgd2l0aCBDT05GSUdfQ01EX0ZBVC4KIAogLSBKb3VybmFsaW5nIEZsYXNoIGZpbGVzeXN0ZW0gc3VwcG9ydDoKIAkJQ09ORklHX0pGRlMyX05BTkQsIENPTkZJR19KRkZTMl9OQU5EX09GRiwgQ09ORklHX0pGRlMyX05BTkRfU0laRSwKQEAgLTExMjMsNyArMTA3Nyw3IEBACiAJCWJvb3QsIHRodXMgZmxvb2RpbmcgdGhlIEJPT1RQIHNlcnZlci4gRGVmaW5pbmcKIAkJQ09ORklHX0JPT1RQX1JBTkRPTV9ERUxBWSBjYXVzZXMgYSByYW5kb20gZGVsYXkgdG8gYmUKIAkJaW5zZXJ0ZWQgYmVmb3JlIHNlbmRpbmcgb3V0IEJPT1RQIHJlcXVlc3RzLiBUaGUKLQkJZm9sbG93aW5nIGRlbGF5cyBhcmUgaW5zdGVydGVkIHRoZW46CisJCWZvbGxvd2luZyBkZWxheXMgYXJlIGluc2VydGVkIHRoZW46CiAKIAkJMXN0IEJPT1RQIHJlcXVlc3Q6CWRlbGF5IDAgLi4uIDEgc2VjCiAJCTJuZCBCT09UUCByZXF1ZXN0OglkZWxheSAwIC4uLiAyIHNlYwpAQCAtMTEzMiwxMCArMTA4NiwyMSBAQAogCQlCT09UUCByZXF1ZXN0czoJCWRlbGF5IDAgLi4uIDggc2VjCiAKIC0gREhDUCBBZHZhbmNlZCBPcHRpb25zOgotCQlDT05GSUdfQk9PVFBfTUFTSworCQlZb3UgY2FuIGZpbmUgdHVuZSB0aGUgREhDUCBmdW5jdGlvbmFsaXR5IGJ5IGRlZmluaW5nCisJCUNPTkZJR19CT09UUF8qIHN5bWJvbHM6CiAKLQkJWW91IGNhbiBmaW5lIHR1bmUgdGhlIERIQ1AgZnVuY3Rpb25hbGl0eSBieSBhZGRpbmcKLQkJdGhlc2UgZmxhZ3MgdG8gdGhlIENPTkZJR19CT09UUF9NQVNLIGRlZmluZToKKwkJQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKwkJQ09ORklHX0JPT1RQX0dBVEVXQVkKKwkJQ09ORklHX0JPT1RQX0hPU1ROQU1FCisJCUNPTkZJR19CT09UUF9OSVNET01BSU4KKwkJQ09ORklHX0JPT1RQX0JPT1RQQVRICisJCUNPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwkJQ09ORklHX0JPT1RQX0ROUworCQlDT05GSUdfQk9PVFBfRE5TMgorCQlDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRQorCQlDT05GSUdfQk9PVFBfTlRQU0VSVkVSCisJCUNPTkZJR19CT09UUF9USU1FT0ZGU0VUCisJCUNPTkZJR19CT09UUF9WRU5ET1JFWAogCiAJCUNPTkZJR19CT09UUF9ETlMyIC0gSWYgYSBESENQIGNsaWVudCByZXF1ZXN0cyB0aGUgRE5TCiAJCXNlcnZlcmlwIGZyb20gYSBESENQIHNlcnZlciwgaXQgaXMgcG9zc2libGUgdGhhdCBtb3JlCkBAIC0xMTQ0LDE1ICsxMTA5LDE0IEBACiAJCXNlcnZlcmlwIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBhZGRpdGlvbmFsIGVudmlyb25tZW50CiAJCXZhcmlhYmxlICJkbnNpcDIiLiBUaGUgZmlyc3QgRE5TIHNlcnZlcmlwIGlzIGFsd2F5cwogCQlzdG9yZWQgaW4gdGhlIHZhcmlhYmxlICJkbnNpcCIsIHdoZW4gQ09ORklHX0JPT1RQX0ROUwotCQlpcyBhZGRlZCB0byB0aGUgQ09ORklHX0JPT1RQX01BU0suCisJCWlzIGRlZmluZWQuCiAKIAkJQ09ORklHX0JPT1RQX1NFTkRfSE9TVE5BTUUgLSBTb21lIERIQ1Agc2VydmVycyBhcmUgY2FwYWJsZQogCQl0byBkbyBhIGR5bmFtaWMgdXBkYXRlIG9mIGEgRE5TIHNlcnZlci4gVG8gZG8gdGhpcywgdGhleQogCQluZWVkIHRoZSBob3N0bmFtZSBvZiB0aGUgREhDUCByZXF1ZXN0ZXIuCi0JCUlmIENPTkZJR19CT09QX1NFTkRfSE9TVE5BTUUgaXMgYWRkZWQgdG8gdGhlCi0JCUNPTkZJR19CT09UUF9NQVNLLCB0aGUgY29udGVudCBvZiB0aGUgImhvc3RuYW1lIgotCQllbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBwYXNzZWQgYXMgb3B0aW9uIDEyIHRvCi0JCXRoZSBESENQIHNlcnZlci4KKwkJSWYgQ09ORklHX0JPT1BfU0VORF9IT1NUTkFNRSBpcyBkZWZpbmVkLCB0aGUgY29udGVudAorCQlvZiB0aGUgImhvc3RuYW1lIiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBwYXNzZWQgYXMKKwkJb3B0aW9uIDEyIHRvIHRoZSBESENQIHNlcnZlci4KIAogIC0gQ0RQIE9wdGlvbnM6CiAJCUNPTkZJR19DRFBfREVWSUNFX0lECkBAIC0xMjIwLDcgKzExODQsNyBAQAogCQlpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZSBJMkMgZHJpdmVyIGZvciB0aGUgc2VsZWN0ZWQgY3B1LgogCiAJCVRoaXMgd2lsbCBhbGxvdyB5b3UgdG8gdXNlIGkyYyBjb21tYW5kcyBhdCB0aGUgdS1ib290Ci0JCWNvbW1hbmQgbGluZSAoYXMgbG9uZyBhcyB5b3Ugc2V0IENGR19DTURfSTJDIGluCisJCWNvbW1hbmQgbGluZSAoYXMgbG9uZyBhcyB5b3Ugc2V0IENPTkZJR19DTURfSTJDIGluCiAJCUNPTkZJR19DT01NQU5EUykgYW5kIGNvbW11bmljYXRlIHdpdGggaTJjIGJhc2VkIHJlYWx0aW1lCiAJCWNsb2NrIGNoaXBzLiBTZWUgY29tbW9uL2NtZF9pMmMuYyBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUKIAkJY29tbWFuZCBsaW5lIGludGVyZmFjZS4KQEAgLTE2OTksMjggKzE2NjMsNjkgQEAKICAgLTMxCXBvc3QvcG9zdC5jCQlQT1NUIHRlc3QgZmFpbGVkLCBkZXRlY3RlZCBieSBwb3N0X291dHB1dF9iYWNrbG9nKCkKICAgLTMyCXBvc3QvcG9zdC5jCQlQT1NUIHRlc3QgZmFpbGVkLCBkZXRlY3RlZCBieSBwb3N0X3J1bl9zaW5nbGUoKQogCi0gICAtMQljb21tb24vY21kX2RvYy5jCUJhZCB1c2FnZSBvZiAiZG9jIiBjb21tYW5kCi0gICAtMQljb21tb24vY21kX2RvYy5jCU5vIGJvb3QgZGV2aWNlCi0gICAtMQljb21tb24vY21kX2RvYy5jCVVua25vd24gQ2hpcCBJRCBvbiBib290IGRldmljZQotICAgLTEJY29tbW9uL2NtZF9kb2MuYwlSZWFkIEVycm9yIG9uIGJvb3QgZGV2aWNlCi0gICAtMQljb21tb24vY21kX2RvYy5jCUltYWdlIGhlYWRlciBoYXMgYmFkIG1hZ2ljIG51bWJlcgorICAgMzQJY29tbW9uL2NtZF9kb2MuYwliZWZvcmUgbG9hZGluZyBhIEltYWdlIGZyb20gYSBET0MgZGV2aWNlCisgIC0zNQljb21tb24vY21kX2RvYy5jCUJhZCB1c2FnZSBvZiAiZG9jIiBjb21tYW5kCisgICAzNQljb21tb24vY21kX2RvYy5jCWNvcnJlY3QgdXNhZ2Ugb2YgImRvYyIgY29tbWFuZAorICAtMzYJY29tbW9uL2NtZF9kb2MuYwlObyBib290IGRldmljZQorICAgMzYJY29tbW9uL2NtZF9kb2MuYwljb3JyZWN0IGJvb3QgZGV2aWNlCisgIC0zNwljb21tb24vY21kX2RvYy5jCVVua25vd24gQ2hpcCBJRCBvbiBib290IGRldmljZQorICAgMzcJY29tbW9uL2NtZF9kb2MuYwljb3JyZWN0IGNoaXAgSUQgZm91bmQsIGRldmljZSBhdmFpbGFibGUKKyAgLTM4CWNvbW1vbi9jbWRfZG9jLmMJUmVhZCBFcnJvciBvbiBib290IGRldmljZQorICAgMzgJY29tbW9uL2NtZF9kb2MuYwlyZWFkaW5nIEltYWdlIGhlYWRlciBmcm9tIERPQyBkZXZpY2UgT0sKKyAgLTM5CWNvbW1vbi9jbWRfZG9jLmMJSW1hZ2UgaGVhZGVyIGhhcyBiYWQgbWFnaWMgbnVtYmVyCisgICAzOQljb21tb24vY21kX2RvYy5jCUltYWdlIGhlYWRlciBoYXMgY29ycmVjdCBtYWdpYyBudW1iZXIKKyAgLTQwCWNvbW1vbi9jbWRfZG9jLmMJRXJyb3IgcmVhZGluZyBJbWFnZSBmcm9tIERPQyBkZXZpY2UKKyAgIDQwCWNvbW1vbi9jbWRfZG9jLmMJSW1hZ2UgaGVhZGVyIGhhcyBjb3JyZWN0IG1hZ2ljIG51bWJlcgorICAgNDEJY29tbW9uL2NtZF9pZGUuYwliZWZvcmUgbG9hZGluZyBhIEltYWdlIGZyb20gYSBJREUgZGV2aWNlCisgIC00Mgljb21tb24vY21kX2lkZS5jCUJhZCB1c2FnZSBvZiAiaWRlIiBjb21tYW5kCisgICA0Mgljb21tb24vY21kX2lkZS5jCWNvcnJlY3QgdXNhZ2Ugb2YgImlkZSIgY29tbWFuZAorICAtNDMJY29tbW9uL2NtZF9pZGUuYwlObyBib290IGRldmljZQorICAgNDMJY29tbW9uL2NtZF9pZGUuYwlib290IGRldmljZSBmb3VuZAorICAtNDQJY29tbW9uL2NtZF9pZGUuYwlEZXZpY2Ugbm90IGF2YWlsYWJsZQorICAgNDQJY29tbW9uL2NtZF9pZGUuYwlEZXZpY2UgYXZhaWxhYmxlCisgIC00NQljb21tb24vY21kX2lkZS5jCXdyb25nIHBhcnRpdGlvbiBzZWxlY3RlZAorICAgNDUJY29tbW9uL2NtZF9pZGUuYwlwYXJ0aXRpb24gc2VsZWN0ZWQKKyAgLTQ2CWNvbW1vbi9jbWRfaWRlLmMJVW5rbm93biBwYXJ0aXRpb24gdGFibGUKKyAgIDQ2CWNvbW1vbi9jbWRfaWRlLmMJdmFsaWQgcGFydGl0aW9uIHRhYmxlIGZvdW5kCisgIC00Nwljb21tb24vY21kX2lkZS5jCUludmFsaWQgcGFydGl0aW9uIHR5cGUKKyAgIDQ3CWNvbW1vbi9jbWRfaWRlLmMJY29ycmVjdCBwYXJ0aXRpb24gdHlwZQorICAtNDgJY29tbW9uL2NtZF9pZGUuYwlFcnJvciByZWFkaW5nIEltYWdlIEhlYWRlciBvbiBib290IGRldmljZQorICAgNDgJY29tbW9uL2NtZF9pZGUuYwlyZWFkaW5nIEltYWdlIEhlYWRlciBmcm9tIElERSBkZXZpY2UgT0sKKyAgLTQ5CWNvbW1vbi9jbWRfaWRlLmMJSW1hZ2UgaGVhZGVyIGhhcyBiYWQgbWFnaWMgbnVtYmVyCisgICA0OQljb21tb24vY21kX2lkZS5jCUltYWdlIGhlYWRlciBoYXMgY29ycmVjdCBtYWdpYyBudW1iZXIKKyAgLTUwCWNvbW1vbi9jbWRfaWRlLmMJSW1hZ2UgaGVhZGVyIGhhcyBiYWQJIGNoZWNrc3VtCisgICA1MAljb21tb24vY21kX2lkZS5jCUltYWdlIGhlYWRlciBoYXMgY29ycmVjdCBjaGVja3N1bQorICAtNTEJY29tbW9uL2NtZF9pZGUuYwlFcnJvciByZWFkaW5nIEltYWdlIGZyb20gSURFIGRldmljZQorICAgNTEJY29tbW9uL2NtZF9pZGUuYwlyZWFkaW5nIEltYWdlIGZyb20gSURFIGRldmljZSBPSworICAgNTIJY29tbW9uL2NtZF9uYW5kLmMJYmVmb3JlIGxvYWRpbmcgYSBJbWFnZSBmcm9tIGEgTkFORCBkZXZpY2UKKyAgLTUzCWNvbW1vbi9jbWRfbmFuZC5jCUJhZCB1c2FnZSBvZiAibmFuZCIgY29tbWFuZAorICAgNTMJY29tbW9uL2NtZF9uYW5kLmMJY29ycmVjdCB1c2FnZSBvZiAibmFuZCIgY29tbWFuZAorICAtNTQJY29tbW9uL2NtZF9uYW5kLmMJTm8gYm9vdCBkZXZpY2UKKyAgIDU0CWNvbW1vbi9jbWRfbmFuZC5jCWJvb3QgZGV2aWNlIGZvdW5kCisgIC01NQljb21tb24vY21kX25hbmQuYwlVbmtub3duIENoaXAgSUQgb24gYm9vdCBkZXZpY2UKKyAgIDU1CWNvbW1vbi9jbWRfbmFuZC5jCWNvcnJlY3QgY2hpcCBJRCBmb3VuZCwgZGV2aWNlIGF2YWlsYWJsZQorICAtNTYJY29tbW9uL2NtZF9uYW5kLmMJRXJyb3IgcmVhZGluZyBJbWFnZSBIZWFkZXIgb24gYm9vdCBkZXZpY2UKKyAgIDU2CWNvbW1vbi9jbWRfbmFuZC5jCXJlYWRpbmcgSW1hZ2UgSGVhZGVyIGZyb20gTkFORCBkZXZpY2UgT0sKKyAgLTU3CWNvbW1vbi9jbWRfbmFuZC5jCUltYWdlIGhlYWRlciBoYXMgYmFkIG1hZ2ljIG51bWJlcgorICAgNTcJY29tbW9uL2NtZF9uYW5kLmMJSW1hZ2UgaGVhZGVyIGhhcyBjb3JyZWN0IG1hZ2ljIG51bWJlcgorICAtNTgJY29tbW9uL2NtZF9uYW5kLmMJRXJyb3IgcmVhZGluZyBJbWFnZSBmcm9tIE5BTkQgZGV2aWNlCisgICA1OAljb21tb24vY21kX25hbmQuYwlyZWFkaW5nIEltYWdlIGZyb20gTkFORCBkZXZpY2UgT0sKIAotICAgLTEJY29tbW9uL2NtZF9pZGUuYwlCYWQgdXNhZ2Ugb2YgImlkZSIgY29tbWFuZAotICAgLTEJY29tbW9uL2NtZF9pZGUuYwlObyBib290IGRldmljZQotICAgLTEJY29tbW9uL2NtZF9pZGUuYwlVbmtub3duIGJvb3QgZGV2aWNlCi0gICAtMQljb21tb24vY21kX2lkZS5jCVVua25vd24gcGFydGl0aW9uIHRhYmxlCi0gICAtMQljb21tb24vY21kX2lkZS5jCUludmFsaWQgcGFydGl0aW9uIHR5cGUKLSAgIC0xCWNvbW1vbi9jbWRfaWRlLmMJUmVhZCBFcnJvciBvbiBib290IGRldmljZQotICAgLTEJY29tbW9uL2NtZF9pZGUuYwlJbWFnZSBoZWFkZXIgaGFzIGJhZCBtYWdpYyBudW1iZXIKKyAgLTYwCWNvbW1vbi9lbnZfY29tbW9uLmMJRW52aXJvbm1lbnQgaGFzIGEgYmFkIENSQywgdXNpbmcgZGVmYXVsdAogCi0gICAtMQljb21tb24vY21kX25hbmQuYwlCYWQgdXNhZ2Ugb2YgIm5hbmQiIGNvbW1hbmQKLSAgIC0xCWNvbW1vbi9jbWRfbmFuZC5jCU5vIGJvb3QgZGV2aWNlCi0gICAtMQljb21tb24vY21kX25hbmQuYwlVbmtub3duIENoaXAgSUQgb24gYm9vdCBkZXZpY2UKLSAgIC0xCWNvbW1vbi9jbWRfbmFuZC5jCVJlYWQgRXJyb3Igb24gYm9vdCBkZXZpY2UKLSAgIC0xCWNvbW1vbi9jbWRfbmFuZC5jCUltYWdlIGhlYWRlciBoYXMgYmFkIG1hZ2ljIG51bWJlcgorICAgNjQJbmV0L2V0aC5jCQlzdGFydGluZyB3aXRoIEV0aGVybmV0Y29uZmlndXJhdGlvbi4KKyAgLTY0CW5ldC9ldGguYwkJbm8gRXRoZXJuZXQgZm91bmQuCisgICA2NQluZXQvZXRoLmMJCUV0aGVybmV0IGZvdW5kLgogCi0gICAtMQljb21tb24vZW52X2NvbW1vbi5jCUVudmlyb25tZW50IGhhcyBhIGJhZCBDUkMsIHVzaW5nIGRlZmF1bHQKLQorICAtODAJY29tbW9uL2NtZF9uZXQuYwl1c2FnZSB3cm9uZworICAgODAJY29tbW9uL2NtZF9uZXQuYwliZWZvcmUgY2FsbGluZyBOZXRMb29wKCkKKyAgLTgxCWNvbW1vbi9jbWRfbmV0LmMJc29tZSBlcnJvciBpbiBOZXRMb29wKCkgb2NjdXJlZAorICAgODEJY29tbW9uL2NtZF9uZXQuYwlOZXRMb29wKCkgYmFjayB3aXRob3V0IGVycm9yCisgIC04Mgljb21tb24vY21kX25ldC5jCXNpemUgPT0gMCAoRmlsZSB3aXRoIHNpemUgMCBsb2FkZWQpCisgICA4Mgljb21tb24vY21kX25ldC5jCXRyeWluZyBhdXRvbWF0aWMgYm9vdAorICAgODMJY29tbW9uL2NtZF9uZXQuYwlydW5uaW5nIGF1dG9zY3JpcHQKKyAgLTgzCWNvbW1vbi9jbWRfbmV0LmMJc29tZSBlcnJvciBpbiBhdXRvbWF0aWMgYm9vdCBvciBhdXRvc2NyaXB0CisgICA4NAljb21tb24vY21kX25ldC5jCWVuZCB3aXRob3V0IGVycm9ycwogCiBNb2RlbSBTdXBwb3J0OgogLS0tLS0tLS0tLS0tLS0KQEAgLTIzMjgsNyArMjMzMyw3IEBACiAKIC0gQ09ORklHX0xPT1BXCiAJCUFkZCB0aGUgImxvb3B3IiBtZW1vcnkgY29tbWFuZC4gVGhpcyBvbmx5IHRha2VzIGVmZmVjdCBpZgotCQl0aGUgbWVtb3J5IGNvbW1hbmRzIGFyZSBhY3RpdmF0ZWQgZ2xvYmFsbHkgKENGR19DTURfTUVNKS4KKwkJdGhlIG1lbW9yeSBjb21tYW5kcyBhcmUgYWN0aXZhdGVkIGdsb2JhbGx5IChDT05GSUdfQ01EX01FTSkuCiAKIC0gQ09ORklHX01YX0NZQ0xJQwogCQlBZGQgdGhlICJtZGMiIGFuZCAibXdjIiBtZW1vcnkgY29tbWFuZHMuIFRoZXNlIGFyZSBjeWNsaWMKQEAgLTIzNDIsNyArMjM0Nyw3IEBACiAJCVRoaXMgY29tbWFuZCB3aWxsIHdyaXRlIDEyMzQ1Njc4IHRvIGFkZHJlc3MgMTAwIGFsbCAxMCBtcy4KIAogCQlUaGlzIG9ubHkgdGFrZXMgZWZmZWN0IGlmIHRoZSBtZW1vcnkgY29tbWFuZHMgYXJlIGFjdGl2YXRlZAotCQlnbG9iYWxseSAoQ0ZHX0NNRF9NRU0pLgorCQlnbG9iYWxseSAoQ09ORklHX0NNRF9NRU0pLgogCiAtIENPTkZJR19TS0lQX0xPV0xFVkVMX0lOSVQKIC0gQ09ORklHX1NLSVBfUkVMT0NBVEVfVUJPT1QKQEAgLTIzODIsMzQgKzIzODcsNyBAQAogCW1ha2UgTkFNRV9jb25maWcKIAogd2hlcmUgIk5BTUVfY29uZmlnIiBpcyB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIGV4aXN0aW5nCi1jb25maWd1cmF0aW9uczsgdGhlIGZvbGxvd2luZyBuYW1lcyBhcmUgc3VwcG9ydGVkOgotCi0JQURDSU9QX2NvbmZpZwkJRlBTODYwTF9jb25maWcJCW9tYXA3MzBwMl9jb25maWcKLQlBRFM4NjBfY29uZmlnCQlHRU44NjBUX2NvbmZpZwkJcGN1X2VfY29uZmlnCi0JQWxhc2thODIyMF9jb25maWcKLQlBUjQwNV9jb25maWcJCUdFTklFVFZfY29uZmlnCQlQSVA0MDVfY29uZmlnCi0JYXQ5MXJtOTIwMGRrX2NvbmZpZwlHVEhfY29uZmlnCQlRUzgyM19jb25maWcKLQlDQU5CVF9jb25maWcJCWhlcm1lc19jb25maWcJCVFTODUwX2NvbmZpZwotCWNtaV9tcGM1eHhfY29uZmlnCWh5bW9kX2NvbmZpZwkJUVM4NjBUX2NvbmZpZwotCWNvZ2VudF9jb21tb25fY29uZmlnCUlQODYwX2NvbmZpZwkJUlBYbGl0ZV9jb25maWcKLQljb2dlbnRfbXBjODI2MF9jb25maWcJSVZNTDI0X2NvbmZpZwkJUlBYbGl0ZV9EV19jb25maWcKLQljb2dlbnRfbXBjOHh4X2NvbmZpZwlJVk1TOF9jb25maWcJCVJQWHN1cGVyX2NvbmZpZwotCUNQQ0k0MDVfY29uZmlnCQlKU0VfY29uZmlnCQlyc2Rwcm90b19jb25maWcKLQlDUENJSVNFUjRfY29uZmlnCUxBTlRFQ19jb25maWcJCVNhbmRwb2ludDgyNDBfY29uZmlnCi0JY3NiMjcyX2NvbmZpZwkJbHdtb25fY29uZmlnCQlzYmM4MjYwX2NvbmZpZwotCUNVODI0X2NvbmZpZwkJTUJYODYwVF9jb25maWcJCXNiYzg1NjBfMzNfY29uZmlnCi0JRFVFVF9BRFNfY29uZmlnCQlNQlhfY29uZmlnCQlzYmM4NTYwXzY2X2NvbmZpZwotCUVCT05ZX2NvbmZpZwkJbXBjNzQ0OGhwYzJfY29uZmlnCVNNODUwX2NvbmZpZwotCUVMUFQ4NjBfY29uZmlnCQlNUEM4MjYwQURTX2NvbmZpZwlTUEQ4MjNUU19jb25maWcKLQlFU1RFRU0xOTJFX2NvbmZpZwlNUEM4NTQwQURTX2NvbmZpZwlzdHhncDNfY29uZmlnCi0JRVRYMDk0X2NvbmZpZwkJTVBDODU0MEVWQUxfY29uZmlnCVNYTkk4NTVUX2NvbmZpZwotCUZBRFM4MjNfY29uZmlnCQlOTVBDODU2MEFEU19jb25maWcJVFFNODIzTF9jb25maWcKLQlGQURTODUwU0FSX2NvbmZpZwlORVRWSUFfY29uZmlnCQlUUU04NTBMX2NvbmZpZwotCUZBRFM4NjBUX2NvbmZpZwkJb21hcDE1MTBpbm5fY29uZmlnCVRRTTg1NUxfY29uZmlnCi0JRlBTODUwTF9jb25maWcJCW9tYXAxNjEwaDJfY29uZmlnCVRRTTg2MExfY29uZmlnCi0JCQkJb21hcDE2MTBpbm5fY29uZmlnCXdhbG51dF9jb25maWcKLQkJCQlvbWFwNTkxMm9za19jb25maWcJWXVrb244MjIwX2NvbmZpZwotCQkJCW9tYXAyNDIwaDRfY29uZmlnCVpQQzE5MDBfY29uZmlnCitjb25maWd1cmF0aW9uczsgc2VlIHRoZSBtYWluIE1ha2VmaWxlIGZvciBzdXBwb3J0ZWQgbmFtZXMuCiAKIE5vdGU6IGZvciBzb21lIGJvYXJkIHNwZWNpYWwgY29uZmlndXJhdGlvbiBuYW1lcyBtYXkgZXhpc3Q7IGNoZWNrIGlmCiAgICAgICBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBib2FyZCB2ZW5kb3I7IGZvcgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9BbWlnYU9uZUczU0UuYyBiL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvQW1pZ2FPbmVHM1NFLmMKaW5kZXggNDBmNDFjNy4uYjQ3MjE3NiAxMDA2NDQKLS0tIGEvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9BbWlnYU9uZUczU0UuYworKysgYi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL0FtaWdhT25lRzNTRS5jCkBAIC0zMCw0OSArMzAsNDkgQEAKICNpbmNsdWRlICJtZW1pby5oIgogI2luY2x1ZGUgInZpYTY4Ni5oIgogCi1fX2FzbSgiIC5nbG9ibCBzZW5kX2tiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCXNlbmRfa2I6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQlsaXMgICAgIHI5LCAweGZlMDAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0JCQkJCQkJICAgIFxuCi0JCWxpICAgICAgcjQsIDB4MTAgICAgICAgICMgcmV0cmllcyAgICAgICAgICAgXG4KLQkJbXRjdHIgICByNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQkJCQkJCSAgICBcbgotCWlkbGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQlsYnogICAgIHI0LCAweDY0KHI5KSAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0JCWFuZGkuICAgcjQsIHI0LCAweDAyICAgICAgICAgICAgICAgICAgICAgICAgXG4KLQkJYm5lICAgICBpZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQkJCQkJCSAgICBcbgotCXJlYWR5OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQlzdGIgICAgIHIzLCAweDYwKHI5KSAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0JCQkJCQkJICAgIFxuCi0JY2hlY2s6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0JCWxieiAgICAgcjQsIDB4NjQocjkpICAgICAgICAgICAgICAgICAgICAgICAgXG4KLQkJYW5kaS4gICByNCwgcjQsIDB4MDEgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQliZXEgICAgIGNoZWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0JCQkJCQkJICAgIFxuCi0JCWxieiAgICAgcjQsIDB4NjAocjkpICAgICAgICAgICAgICAgICAgICAgICAgXG4KLQkJY21wd2kgICByNCwgMHhmYSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQliZXEgICAgIGRvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0JCQkJCQkJICAgIFxuCi0JCWJkbnogICAgaWRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KLQkJCQkJCQkgICAgXG4KLQkJbGkgICAgICByMywgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQlibHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0JCQkJCQkJICAgIFxuCi0JZG9uZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0JCWxpICAgICAgcjMsIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KLQkJYmxyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQkJCQkJCSAgICBcbgotCS5nbG9ibCB0ZXN0X2tiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCXRlc3Rfa2I6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQltZmxyICAgIHIxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0JCWxpICAgICAgcjMsIDB4ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KLQkJYmwgICAgICBzZW5kX2tiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQlsaSAgICAgIHIzLCAweDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0JCWJsICAgICAgc2VuZF9rYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4KLQkJbXRsciAgICByMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbgotCQlibHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuCi0iKTsKK19fYXNtX18oIiAuZ2xvYmwgc2VuZF9rYiAgICAgICAgICAgICAgICAgICAJCSAgICBcbiAiCisJInNlbmRfa2I6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkiCWxpcyAgICAgcjksIDB4ZmUwMCAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCSIJCQkJCQkgICAgXG4gIgorCSIJbGkgICAgICByNCwgMHgxMCAgICAgICAgIyByZXRyaWVzICAgICAgICAgICBcbiAiCisJIgltdGN0ciAgIHI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkiCQkJCQkJICAgIFxuICIKKwkiaWRsZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCSIJbGJ6ICAgICByNCwgMHg2NChyOSkgICAgICAgICAgICAgICAgICAgICAgICBcbiAiCisJIglhbmRpLiAgIHI0LCByNCwgMHgwMiAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkiCWJuZSAgICAgaWRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCisJInJlYWR5OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkiCXN0YiAgICAgcjMsIDB4NjAocjkpICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCSIJCQkJCQkgICAgXG4gIgorCSJjaGVjazogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAiCisJIglsYnogICAgIHI0LCAweDY0KHI5KSAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkiCWFuZGkuICAgcjQsIHI0LCAweDAxICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCSIJYmVxICAgICBjaGVjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAiCisJIgkJCQkJCSAgICBcbiAiCisJIglsYnogICAgIHI0LCAweDYwKHI5KSAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkiCWNtcHdpICAgcjQsIDB4ZmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCSIJYmVxICAgICBkb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAiCisKKwkiCWJkbnogICAgaWRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCisJIglsaSAgICAgIHIzLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkiCWJsciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCisJImRvbmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkiCWxpICAgICAgcjMsIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCSIJYmxyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAiCisKKwkiLmdsb2JsIHRlc3Rfa2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCSJ0ZXN0X2tiOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAiCisJIgltZmxyICAgIHIxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkiCWxpICAgICAgcjMsIDB4ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCSIJYmwgICAgICBzZW5kX2tiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAiCisJIglsaSAgICAgIHIzLCAweDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICIKKwkiCWJsICAgICAgc2VuZF9rYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIgorCSIJbXRsciAgICByMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAiCisJIglibHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKKyk7CiAKIAogaW50IGNoZWNrYm9hcmQgKHZvaWQpCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL2NtZF9ib290YS5jIGIvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS9jbWRfYm9vdGEuYwppbmRleCAxNDNiYmEyLi40MGM5NTFkIDEwMDY0NAotLS0gYS9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL2NtZF9ib290YS5jCisrKyBiL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvY21kX2Jvb3RhLmMKQEAgLTExOSw3ICsxMTksNyBAQAogCiAJcmV0dXJuIDA7CiB9Ci0jaWYgZGVmaW5lZChDT05GSUdfQU1JR0FPTkVHM1NFKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApCisjaWYgZGVmaW5lZChDT05GSUdfQU1JR0FPTkVHM1NFKSAmJiBkZWZpbmVkKENPTkZJR19DTURfQlNQKQogVV9CT09UX0NNRCgKIAlib290YSwgICAzLCAgICAgIDEsICAgICAgZG9fYm9vdGEsCiAJImJvb3RhICAgLSBib290IGFuIEFtaWdhIGtlcm5lbFxuIiwKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvdmlkZW8uYyBiL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvdmlkZW8uYwppbmRleCBmNjMyN2Y3Li5mYzI3YzY4IDEwMDY0NAotLS0gYS9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL3ZpZGVvLmMKKysrIGIvYm9hcmQvTUFJL0FtaWdhT25lRzNTRS92aWRlby5jCkBAIC01Niw2ICs1Niw3IEBACiBpbnQgIHZpZGVvX2NvbHModm9pZCk7CiAKIGNoYXIgKnByb21wdF9zdHJpbmcgPSAiPT4iOwordW5zaWduZWQgY2hhciB2aWRlb19nZXRfYXR0cih2b2lkKTsKIAogdm9pZCB2aWRlb19zZXRfY29sb3IodW5zaWduZWQgY2hhciBhdHRyKQogewpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3IvYmlvcy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3IvYmlvcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTFlYjY0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL2Jpb3MuYworKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKgotICogTW9zdGx5IGRvbmUgYWZ0ZXIgdGhlIFNjaXRlY2ggQmlvcyBlbXVsYXRpb24KLSAqIFdyaXR0ZW4gYnkgSGFucy1K9nJnIEZyaWVkZW4KLSAqIEh5cGVyaW9uIEVudGVydGFpbm1lbnQKLSAqLwotI2luY2x1ZGUgIng4NmVtdS5oIgotI2luY2x1ZGUgImdsdWUuaCIKLQotI3VuZGVmIERFQlVHCi0jaWZkZWYgREVCVUcKLSNkZWZpbmUgUFJJTlRGKGZtdCwgYXJncy4uLikgcHJpbnRmKGZtdCwgIyMgYXJncykKLSNlbHNlCi0jZGVmaW5lIFBSSU5URihmbXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotI2RlZmluZSBCSU9TX1NFRyAweEZGRjAKLSNkZWZpbmUgUENJQklPU19TVUNDRVNTRlVMIDAKLSNkZWZpbmUgUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EIDB4ODYKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVCWVRFOwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBVV09SRDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBVTE9ORzsKLQotdHlwZWRlZiBjaGFyIEJZVEU7Ci10eXBlZGVmIHNob3J0IFdPUlQ7Ci10eXBlZGVmIGxvbmcgTE9ORzsKLQotc3RhdGljIGlubGluZSBVQllURSByZWFkX2J5dGUodm9sYXRpbGUgVUJZVEUqIGZyb20pCi17Ci0gICAgaW50IHg7Ci0gICAgYXNtIHZvbGF0aWxlICgibGJ6ICUwLCUxXG4gZWllaW8iIDogIj1yIiAoeCkgOiAibSIgKCpmcm9tKSk7Ci0gICAgcmV0dXJuIChVQllURSl4OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfYnl0ZSh2b2xhdGlsZSBVQllURSAqdG8sIGludCB4KQotewotICAgIGFzbSB2b2xhdGlsZSAoInN0YiAlMSwlMFxuIGVpZWlvIiA6ICI9bSIgKCp0bykgOiAiciIgKHgpKTsKLX0KLQotc3RhdGljIGlubGluZSBVV09SRCByZWFkX3dvcmRfbGl0dGxlKHZvbGF0aWxlIFVXT1JEICpmcm9tKQotewotICAgIGludCB4OwotICAgIGFzbSB2b2xhdGlsZSAoImxoYnJ4ICUwLDAsJTFcbiBlaWVpbyIgOiAiPXIiICh4KSA6ICJyIiAoZnJvbSksICJtIiAoKmZyb20pKTsKLSAgICByZXR1cm4gKFVXT1JEKXg7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgVVdPUkQgcmVhZF93b3JkX2JpZyh2b2xhdGlsZSBVV09SRCAqZnJvbSkKLXsKLSAgICBpbnQgeDsKLSAgICBhc20gdm9sYXRpbGUgKCJsaHogJTAsJTFcbiBlaWVpbyIgOiAiPXIiICh4KSA6ICJtIiAoKmZyb20pKTsKLSAgICByZXR1cm4gKFVXT1JEKXg7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV93b3JkX2xpdHRsZSh2b2xhdGlsZSBVV09SRCAqdG8sIGludCB4KQotewotICAgIGFzbSB2b2xhdGlsZSAoInN0aGJyeCAlMSwwLCUyXG4gZWllaW8iIDogIj1tIiAoKnRvKSA6ICJyIiAoeCksICJyIiAodG8pKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3dvcmRfYmlnKHZvbGF0aWxlIFVXT1JEICp0bywgaW50IHgpCi17Ci0gICAgYXNtIHZvbGF0aWxlICgic3RoICUxLCUwXG4gZWllaW8iIDogIj1tIiAoKnRvKSA6ICJyIiAoeCkpOwotfQotCi1zdGF0aWMgaW5saW5lIFVMT05HIHJlYWRfbG9uZ19saXR0bGUodm9sYXRpbGUgVUxPTkcgKmZyb20pCi17Ci0gICAgdW5zaWduZWQgbG9uZyB4OwotICAgIGFzbSB2b2xhdGlsZSAoImx3YnJ4ICUwLDAsJTFcbiBlaWVpbyIgOiAiPXIiICh4KSA6ICJyIiAoZnJvbSksICJtIigqZnJvbSkpOwotICAgIHJldHVybiAoVUxPTkcpeDsKLX0KLQotc3RhdGljIGlubGluZSBVTE9ORyByZWFkX2xvbmdfYmlnKHZvbGF0aWxlIFVMT05HICpmcm9tKQotewotICAgIHVuc2lnbmVkIGxvbmcgeDsKLSAgICBhc20gdm9sYXRpbGUgKCJsd3ogJTAsJTFcbiBlaWVpbyIgOiAiPXIiICh4KSA6ICJtIiAoKmZyb20pKTsKLSAgICByZXR1cm4gKFVMT05HKXg7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9sb25nX2xpdHRsZSh2b2xhdGlsZSBVTE9ORyAqdG8sIFVMT05HIHgpCi17Ci0gICAgYXNtIHZvbGF0aWxlICgic3R3YnJ4ICUxLDAsJTJcbiBlaWVpbyIgOiAiPW0iICgqdG8pIDogInIiICh4KSwgInIiICh0bykpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfbG9uZ19iaWcodm9sYXRpbGUgVUxPTkcgKnRvLCBVTE9ORyB4KQotewotICAgIGFzbSB2b2xhdGlsZSAoInN0dyAlMSwlMFxuIGVpZWlvIiA6ICI9bSIgKCp0bykgOiAiciIgKHgpKTsKLX0KLQotI2RlZmluZSBwb3J0X3RvX21lbShmcm9tKSAoMHhGRTAwMDAwMHwoZnJvbSkpCi0jZGVmaW5lIGluX2J5dGUoZnJvbSkgcmVhZF9ieXRlKCAoVUJZVEUgKilwb3J0X3RvX21lbShmcm9tKSkKLSNkZWZpbmUgaW5fd29yZChmcm9tKSByZWFkX3dvcmRfbGl0dGxlKChVV09SRCAqKXBvcnRfdG9fbWVtKGZyb20pKQotI2RlZmluZSBpbl9sb25nKGZyb20pIHJlYWRfbG9uZ19saXR0bGUoKFVMT05HICopcG9ydF90b19tZW0oZnJvbSkpCi0jZGVmaW5lIG91dF9ieXRlKHRvLCB2YWwpIHdyaXRlX2J5dGUoKFVCWVRFICopcG9ydF90b19tZW0odG8pLCB2YWwpCi0jZGVmaW5lIG91dF93b3JkKHRvLCB2YWwpIHdyaXRlX3dvcmRfbGl0dGxlKChVV09SRCAqKXBvcnRfdG9fbWVtKHRvKSwgdmFsKQotI2RlZmluZSBvdXRfbG9uZyh0bywgdmFsKSB3cml0ZV9sb25nX2xpdHRsZSgoVUxPTkcgKilwb3J0X3RvX21lbSh0byksIHZhbCkKLQotc3RhdGljIHZvaWQgWDg2QVBJIHVuZGVmaW5lZF9pbnRyKGludCBpbnRubykKLXsKLSAgICBleHRlcm4gdTE2IEExX3Jkdyh1MzIgYWRkcik7Ci0gICAgaWYgKEExX3JkdyhpbnRubyAqIDQgKyAyKSA9PSBCSU9TX1NFRykKLSAgICB7Ci0JUFJJTlRGKCJVbmRlZmluZWQgaW50ZXJydXB0ICV4aCBjYWxsZWQgQVggPSAleGgsIEJYID0gJXhoLCBDWCA9ICV4aCwgRFggPSAleGhcbiIsCi0JICAgaW50bm8sIE0ueDg2LlJfQVgsIE0ueDg2LlJfQlgsIE0ueDg2LlJfQ1gsIE0ueDg2LlJfRFgpOwotCVg4NkVNVV9oYWx0X3N5cygpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCVBSSU5URigiQ2FsbGluZyBpbnRlcnJ1cHQgJXhoLCBBTD0leGgsIEFIPSV4aFxuIiwgaW50bm8sIE0ueDg2LlJfQUwsIE0ueDg2LlJfQUgpOwotCVg4NkVNVV9wcmVwYXJlRm9ySW50KGludG5vKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFg4NkFQSSBpbnQ0MihpbnQgaW50bm8pOwotc3RhdGljIHZvaWQgWDg2QVBJIGludDE1KGludCBpbnRubyk7Ci0KLXN0YXRpYyB2b2lkIFg4NkFQSSBpbnQxMChpbnQgaW50bm8pCi17Ci0gICAgaWYgKEExX3JkdyhpbnRubyo0KzIpID09IEJJT1NfU0VHKQotCWludDQyKGludG5vKTsKLSAgICBlbHNlCi0gICAgewotCVBSSU5URigiaW50MTA6IGJyYW5jaGluZyB0byAlMDRYOiUwNFgsIEFMPSV4aCwgQUg9JXhoXG4iLCBBMV9yZHcoaW50bm8qNCsyKSwgQTFfcmR3KGludG5vKjQpLAotCSAgICAgICBNLng4Ni5SX0FMLCBNLng4Ni5SX0FIKTsKLQlYODZFTVVfcHJlcGFyZUZvckludChpbnRubyk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBYODZBUEkgaW50MUEoaW50IGludG5vKQotewotICAgIGludCBkZXZpY2U7Ci0KLSAgICBzd2l0Y2goTS54ODYuUl9BWCkKLSAgICB7Ci0gICAgY2FzZSAweEIxMDE6IC8qIFBDSSBCaW9zIFByZXNlbnQ/ICovCi0JTS54ODYuUl9BTCAgPSAweDAwOwotCU0ueDg2LlJfRURYID0gMHgyMDQ5NDM1MDsKLQlNLng4Ni5SX0JYICA9IDB4MDIxMDsKLQlNLng4Ni5SX0NMICA9IDM7Ci0JQ0xFQVJfRkxBRyhGX0NGKTsKLQlicmVhazsKLSAgICBjYXNlIDB4QjEwMjogLyogRmluZCBkZXZpY2UgKi8KLQlkZXZpY2UgPSBteXBjaV9maW5kX2RldmljZShNLng4Ni5SX0RYLCBNLng4Ni5SX0NYLCBNLng4Ni5SX1NJKTsKLQlpZiAoZGV2aWNlICE9IC0xKQotCXsKLQkgICAgTS54ODYuUl9BSCA9IFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLQkgICAgTS54ODYuUl9CSCA9IG15cGNpX2J1cyhkZXZpY2UpOwotCSAgICBNLng4Ni5SX0JMID0gbXlwY2lfZGV2Zm4oZGV2aWNlKTsKLQl9Ci0JZWxzZQotCXsKLQkgICAgTS54ODYuUl9BSCA9IFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKLQl9Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKE0ueDg2LlJfQUggIT0gUENJQklPU19TVUNDRVNTRlVMKSwgRl9DRik7Ci0JYnJlYWs7Ci0gICAgY2FzZSAweEIxMDM6IC8qIEZpbmQgUENJIGNsYXNzIGNvZGUgKi8KLQlNLng4Ni5SX0FIID0gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwotCS8qcHJpbnRmKCJGaW5kIGJ5IGNsYXNzIG5vdCB5ZXQgaW1wbG1lbnRlZCIpOyAqLwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCksIEZfQ0YpOwotCWJyZWFrOwotICAgIGNhc2UgMHhCMTA4OiAvKiByZWFkIGNvbmZpZyBieXRlICovCi0JTS54ODYuUl9DTCA9IG15cGNpX3JlYWRfY2ZnX2J5dGUoTS54ODYuUl9CSCwgTS54ODYuUl9CTCwgTS54ODYuUl9ESSk7Ci0JTS54ODYuUl9BSCA9IFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpLCBGX0NGKTsKLQkvKnByaW50ZigicmVhZF9jb25maWdfYnl0ZSAleCwleCwleCAtPiAleFxuIiwgTS54ODYuUl9CSCwgTS54ODYuUl9CTCwgTS54ODYuUl9ESSwgKi8KLQkvKgkgICAgTS54ODYuUl9DTCk7ICovCi0JYnJlYWs7Ci0gICAgY2FzZSAweEIxMDk6IC8qIHJlYWQgY29uZmlnIHdvcmQgKi8KLQlNLng4Ni5SX0NYID0gbXlwY2lfcmVhZF9jZmdfd29yZChNLng4Ni5SX0JILCBNLng4Ni5SX0JMLCBNLng4Ni5SX0RJKTsKLQlNLng4Ni5SX0FIID0gUENJQklPU19TVUNDRVNTRlVMOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCksIEZfQ0YpOwotCS8qcHJpbnRmKCJyZWFkX2NvbmZpZ193b3JkICV4LCV4LCV4IC0+ICV4XG4iLCBNLng4Ni5SX0JILCBNLng4Ni5SX0JMLCBNLng4Ni5SX0RJLCAqLwotCS8qCSAgICBNLng4Ni5SX0NYKTsgKi8KLQlicmVhazsKLSAgICBjYXNlIDB4QjEwQTogLyogcmVhZCBjb25maWcgZHdvcmQgKi8KLQlNLng4Ni5SX0VDWCA9IG15cGNpX3JlYWRfY2ZnX2xvbmcoTS54ODYuUl9CSCwgTS54ODYuUl9CTCwgTS54ODYuUl9ESSk7Ci0JTS54ODYuUl9BSCA9IFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpLCBGX0NGKTsKLQkvKnByaW50ZigicmVhZF9jb25maWdfbG9uZyAleCwleCwleCAtPiAleFxuIiwgTS54ODYuUl9CSCwgTS54ODYuUl9CTCwgTS54ODYuUl9ESSwgKi8KLQkvKiAgICBNLng4Ni5SX0VDWCk7ICovCi0JYnJlYWs7Ci0gICAgY2FzZSAweEIxMEI6IC8qIHdyaXRlIGNvbmZpZyBieXRlICovCi0JbXlwY2lfd3JpdGVfY2ZnX2J5dGUoTS54ODYuUl9CSCwgTS54ODYuUl9CTCwgTS54ODYuUl9ESSwgTS54ODYuUl9DTCk7Ci0JTS54ODYuUl9BSCA9IFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpLCBGX0NGKTsKLQkvKnByaW50Zigid3JpdGVfY29uZmlnX2J5dGUgJXgsJXgsJXggPC0gJXhcbiIsIE0ueDg2LlJfQkgsIE0ueDg2LlJfQkwsIE0ueDg2LlJfREksICovCi0JLyogICAgTS54ODYuUl9DTCk7ICovCi0JYnJlYWs7Ci0gICAgY2FzZSAweEIxMEM6IC8qIHdyaXRlIGNvbmZpZyB3b3JkICovCi0JbXlwY2lfd3JpdGVfY2ZnX3dvcmQoTS54ODYuUl9CSCwgTS54ODYuUl9CTCwgTS54ODYuUl9ESSwgTS54ODYuUl9DWCk7Ci0JTS54ODYuUl9BSCA9IFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpLCBGX0NGKTsKLQkvKnByaW50Zigid3JpdGVfY29uZmlnX3dvcmQgJXgsJXgsJXggPC0gJXhcbiIsIE0ueDg2LlJfQkgsIE0ueDg2LlJfQkwsIE0ueDg2LlJfREksICovCi0JLyoJICAgIE0ueDg2LlJfQ1gpOyAqLwotCWJyZWFrOwotICAgIGNhc2UgMHhCMTBEOiAvKiB3cml0ZSBjb25maWcgZHdvcmQgKi8KLQlteXBjaV93cml0ZV9jZmdfbG9uZyhNLng4Ni5SX0JILCBNLng4Ni5SX0JMLCBNLng4Ni5SX0RJLCBNLng4Ni5SX0VDWCk7Ci0JTS54ODYuUl9BSCA9IFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpLCBGX0NGKTsKLQkvKnByaW50Zigid3JpdGVfY29uZmlnX2xvbmcgJXgsJXgsJXggPC0gJXhcbiIsIE0ueDg2LlJfQkgsIE0ueDg2LlJfQkwsIE0ueDg2LlJfREksICovCi0JLyoJICAgIE0ueDg2LlJfRUNYKTsgKi8KLQlicmVhazsKLSAgICBkZWZhdWx0OgotCVBSSU5URigiQklPUyBpbnQgJXhoOiBVbmtub3duIGZ1bmN0aW9uIEFYPSUwNHhoXG4iLCBpbnRubywgTS54ODYuUl9BWCk7Ci0KLSAgICB9Ci19Ci0KLXZvaWQgYmlvc19pbml0KHZvaWQpCi17Ci0gICAgaW50IGk7Ci0gICAgWDg2RU1VX2ludHJGdW5jcyBiaW9zX2ludHJfdGFiWzI1Nl07Ci0KLSAgICBmb3IgKGk9MDsgaTwyNTY7IGkrKykKLSAgICB7Ci0Jd3JpdGVfbG9uZ19saXR0bGUoTS5tZW1fYmFzZStpKjQsIEJJT1NfU0VHPDwxNik7Ci0JYmlvc19pbnRyX3RhYltpXSA9IHVuZGVmaW5lZF9pbnRyOwotICAgIH0KLQotICAgIGJpb3NfaW50cl90YWJbMHgxMF0gPSBpbnQxMDsKLSAgICBiaW9zX2ludHJfdGFiWzB4MUFdID0gaW50MUE7Ci0gICAgYmlvc19pbnRyX3RhYlsweDQyXSA9IGludDQyOwotICAgIGJpb3NfaW50cl90YWJbMHgxNV0gPSBpbnQxNTsKLQotICAgIGJpb3NfaW50cl90YWJbMHg2RF0gPSBpbnQ0MjsKLQotICAgIFg4NkVNVV9zZXR1cEludHJGdW5jcyhiaW9zX2ludHJfdGFiKTsKLSAgICB2aWRlb19pbml0KCk7Ci19Ci0KLXVuc2lnbmVkIGNoYXIgc2V0dXBfNDB4MjVbXSA9Ci17Ci0gICAgMHgzOCwgMHgyOCwgMHgyZCwgMHgwYSwgMHgxZiwgNiwgMHgxOSwKLSAgICAweDFjLCAyLCA3LCA2LCA3LCAwLCAwLCAwLCAwCi19OwotCi11bnNpZ25lZCBjaGFyIHNldHVwXzgweDI1W10gPQotewotICAgIDB4NzEsIDB4NTAsIDB4NWEsIDB4MGEsIDB4MWYsIDYsIDB4MTksCi0gICAgMHgxYywgMiwgNywgNiwgNywgMCwgMCwgMCwgMAotfTsKLQotdW5zaWduZWQgY2hhciBzZXR1cF9ncmFwaGljc1tdID0KLXsKLSAgICAweDM4LCAweDI4LCAweDIwLCAweDBhLCAweDdmLCA2LCAweDY0LAotICAgIDB4NzAsIDIsIDEsIDYsIDcsIDAsIDAsIDAsIDAKLX07Ci0KLXVuc2lnbmVkIGNoYXIgc2V0dXBfYndbXSA9Ci17Ci0gICAgMHg2MSwgMHg1MCwgMHg1MiwgMHgwZiwgMHgxOSwgNiwgMHgxOSwKLSAgICAweDE5LCAyLCAweDBkLCAweDBiLCAweDBjLCAwLCAwLCAwLCAwCi19OwotCi11bnNpZ25lZCBjaGFyICogc2V0dXBfbW9kZXNbXSA9Ci17Ci0gICAgc2V0dXBfNDB4MjUsICAgICAvKiBtb2RlIDA6IDQweDI1IGJ3IHRleHQgKi8KLSAgICBzZXR1cF80MHgyNSwgICAgIC8qIG1vZGUgMTogNDB4MjUgY29sIHRleHQgKi8KLSAgICBzZXR1cF84MHgyNSwgICAgIC8qIG1vZGUgMjogODB4MjUgYncgdGV4dCAqLwotICAgIHNldHVwXzgweDI1LCAgICAgLyogbW9kZSAzOiA4MHgyNSBjb2wgdGV4dCAqLwotICAgIHNldHVwX2dyYXBoaWNzLCAgLyogbW9kZSA0OiAzMjB4MjAwIGNvbCBncmFwaGljcyAqLwotICAgIHNldHVwX2dyYXBoaWNzLCAgLyogbW9kZSA1OiAzMjB4MjAwIGJ3IGdyYXBoaWNzICovCi0gICAgc2V0dXBfZ3JhcGhpY3MsICAvKiBtb2RlIDY6IDY0MHgyMDAgYncgZ3JhcGhpY3MgKi8KLSAgICBzZXR1cF9idyAgICAgICAgIC8qIG1vZGUgNzogODB4MjUgbW9ubyB0ZXh0ICovCi19OwotCi11bnNpZ25lZCBpbnQgc2V0dXBfY29sc1tdID0KLXsKLSAgICA0MCwgNDAsIDgwLCA4MCwgNDAsIDQwLCA4MCwgODAKLX07Ci0KLXVuc2lnbmVkIGNoYXIgc2V0dXBfbW9kZXNldHNbXSA9Ci17Ci0gICAgIDB4MkMsIDB4MjgsIDB4MkQsIDB4MjksIDB4MkEsIDB4MkUsIDB4MUUsIDB4MjkKLX07Ci0KLXVuc2lnbmVkIGludCBzZXR1cF9idWZzaXplW10gPQotewotICAgIDIwNDgsIDIwNDgsIDQwOTYsIDIwOTYsIDE2Mzg0LCAxNjM4NCwgMTYzODQsIDQwOTYKLX07Ci0KLXZvaWQgYmlvc19zZXRfbW9kZShpbnQgbW9kZSkKLXsKLSAgICBpbnQgaTsKLSAgICB1bnNpZ25lZCBjaGFyIG1vZGVfc2V0ID0gc2V0dXBfbW9kZXNldHNbbW9kZV07IC8qIENvbnRyb2wgcmVnaXN0ZXIgdmFsdWUgKi8KLSAgICB1bnNpZ25lZCBjaGFyICpzZXR1cF9yZWdzID0gc2V0dXBfbW9kZXNbbW9kZV07IC8qIFJlZ2lzdGVyIDNENCBBcnJheSAqLwotCi0gICAgLyogU3dpdGNoIHZpZGVvIG9mZiAqLwotICAgIG91dF9ieXRlKDB4M0Q4LCBtb2RlX3NldCAmIDB4MzcpOwotCi0gICAgLyogU2V0IHVwIHBhcmFtZXRlcnMgYXQgM0Q0aCAqLwotICAgIGZvciAoaT0wOyBpPDE2OyBpKyspCi0gICAgewotCW91dF9ieXRlKDB4M0Q0LCAodW5zaWduZWQgY2hhcilpKTsKLQlvdXRfYnl0ZSgweDNENSwgKnNldHVwX3JlZ3MpOwotCXNldHVwX3JlZ3MrKzsKLSAgICB9Ci0KLSAgICAvKiBFbmFibGUgdmlkZW8gKi8KLSAgICBvdXRfYnl0ZSgweDNEOCwgbW9kZV9zZXQpOwotCi0gICAgLyogU2V0IG92ZXJzY2FuICovCi0gICAgaWYgKG1vZGUgPT0gNikgb3V0X2J5dGUoMHgzRDksIDB4M0YpOwotICAgIGVsc2UgICAgICAgICAgIG91dF9ieXRlKDB4M0Q5LCAweDMwKTsKLX0KLQotc3RhdGljIHZvaWQgYmlvc19wcmludF9zdHJpbmcodm9pZCkKLXsKLSAgICBleHRlcm4gdm9pZCB2aWRlb19iaW9zX3ByaW50X3N0cmluZyhjaGFyICpzdHJpbmcsIGludCB4LCBpbnQgeSwgaW50IGF0dHIsIGludCBjb3VudCk7Ci0gICAgY2hhciAqcyA9IChjaGFyICopKE0ueDg2LlJfRVM8PDQpICsgTS54ODYuUl9CUDsKLSAgICBpbnQgYXR0cjsKLSAgICBpZiAoTS54ODYuUl9BTCAmIDB4MDIpIGF0dHIgPSAtIDE7Ci0gICAgZWxzZSAgICAgICAgICAgICAgICAgICBhdHRyID0gTS54ODYuUl9CTDsKLSAgICB2aWRlb19iaW9zX3ByaW50X3N0cmluZyhzLCBNLng4Ni5SX0RILCBNLng4Ni5SX0RMLCBhdHRyLCBNLng4Ni5SX0NYKTsKLX0KLQotc3RhdGljIHZvaWQgWDg2QVBJIGludDQyKGludCBpbnRubykKLXsKLSAgICBzd2l0Y2ggKE0ueDg2LlJfQUgpCi0gICAgewotICAgIGNhc2UgMHgwMDoKLQliaW9zX3NldF9tb2RlKE0ueDg2LlJfQUwpOwotCWJyZWFrOwotICAgIGNhc2UgMHgxMzoKLQliaW9zX3ByaW50X3N0cmluZygpOwotCWJyZWFrOwotICAgIGRlZmF1bHQ6Ci0JUFJJTlRGKCJXYXJuaW5nOiBWSURFTyBCSU9TIGludGVycnVwdCAleGggdW5pbXBsZW1lbnRlZCBmdW5jdGlvbiAleGgsIEFMID0gJXhoXG4iLAotCSAgICAgICBpbnRubywgTS54ODYuUl9BSCwgTS54ODYuUl9BTCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBYODZBUEkgaW50MTUoaW50IGludG5vKQotewotICAgIFBSSU5URigiQ2FsbGVkIGludGVycnVwdCAxNWg6IEFYID0gJXhoLCBCWCA9ICV4aCwgQ1ggPSAleGgsIERYID0gJXhoXG4iLAotCSAgIE0ueDg2LlJfQVgsIE0ueDg2LlJfQlgsIE0ueDg2LlJfQ1gsIE0ueDg2LlJfRFgpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3IvZ2x1ZS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3IvZ2x1ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzgwZjBkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL2dsdWUuYworKysgL2Rldi9udWxsCkBAIC0xLDUxNSArMCwwIEBACi0jaW5jbHVkZSA8Y29tbW9uLmg+Ci0jaW5jbHVkZSA8cGNpLmg+Ci0jaW5jbHVkZSA8NzR4eF83eHguaD4KLQotCi0jaWZkZWYgREVCVUcKLSN1bmRlZiBERUJVRwotI2VuZGlmCi0KLSNpZmRlZiBERUJVRwotI2RlZmluZSBQUklOVEYoZm9ybWF0LCBhcmdzLi4uKSBfcHJpbnRmKGZvcm1hdCAsICMjIGFyZ3MpCi0jZWxzZQotI2RlZmluZSBQUklOVEYoZm9ybWF0LCBhcmdjLi4uKQotI2VuZGlmCi0KLXN0YXRpYyBwY2lfZGV2X3QgdG9fcGNpKGludCBidXMsIGludCBkZXZmbikKLXsKLSAgICByZXR1cm4gUENJX0JERihidXMsIChkZXZmbj4+MyksIGRldmZuJjMpOwotfQotCi1pbnQgbXlwY2lfZmluZF9kZXZpY2UoaW50IHZlbmRvciwgaW50IHByb2R1Y3QsIGludCBpbmRleCkKLXsKLSAgICByZXR1cm4gcGNpX2ZpbmRfZGV2aWNlKHZlbmRvciwgcHJvZHVjdCwgaW5kZXgpOwotfQotCi1pbnQgbXlwY2lfYnVzKGludCBkZXZpY2UpCi17Ci0gICAgcmV0dXJuIFBDSV9CVVMoZGV2aWNlKTsKLX0KLQotaW50IG15cGNpX2RldmZuKGludCBkZXZpY2UpCi17Ci0gICAgcmV0dXJuIChQQ0lfREVWKGRldmljZSk8PDMpIHwgUENJX0ZVTkMoZGV2aWNlKTsKLX0KLQotCi0jZGVmaW5lIG15cGNpX3JlYWRfZnVuYyh0eXBlLCBzaXplKQkJCQlcCi10eXBlIG15cGNpX3JlYWRfY2ZnXyMjc2l6ZSMjKGludCBidXMsIGludCBkZXZmbiwgaW50IG9mZnNldCkJXAotewkJCQkJCQkJXAotICAgIHR5cGUgYzsJCQkJCQkJXAotICAgIHBjaV9yZWFkX2NvbmZpZ18jI3NpemUjIyh0b19wY2koYnVzLCBkZXZmbiksIG9mZnNldCwgJmMpOwlcCi0gICAgcmV0dXJuIGM7CQkJCQkJCVwKLX0KLQotI2RlZmluZSBteXBjaV93cml0ZV9mdW5jKHR5cGUsIHNpemUpCQkJCVwKLXZvaWQgbXlwY2lfd3JpdGVfY2ZnXyMjc2l6ZSMjKGludCBidXMsIGludCBkZXZmbiwgaW50IG9mZnNldCwgaW50IHZhbHVlKQlcCi17CQkJCQkJCQlcCi0gICAgcGNpX3dyaXRlX2NvbmZpZ18jI3NpemUjIyh0b19wY2koYnVzLCBkZXZmbiksIG9mZnNldCwgdmFsdWUpOwlcCi19Ci0KLW15cGNpX3JlYWRfZnVuYyh1OCxieXRlKTsKLW15cGNpX3JlYWRfZnVuYyh1MTYsd29yZCk7Ci0KLW15cGNpX3dyaXRlX2Z1bmModTgsYnl0ZSk7Ci1teXBjaV93cml0ZV9mdW5jKHUxNix3b3JkKTsKLQotdTMyIG15cGNpX3JlYWRfY2ZnX2xvbmcoaW50IGJ1cywgaW50IGRldmZuLCBpbnQgb2Zmc2V0KQotewotICAgIHUzMiBjOwotICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZCh0b19wY2koYnVzLCBkZXZmbiksIG9mZnNldCwgJmMpOwotICAgIHJldHVybiBjOwotfQotCi12b2lkIG15cGNpX3dyaXRlX2NmZ19sb25nKGludCBidXMsIGludCBkZXZmbiwgaW50IG9mZnNldCwgaW50IHZhbHVlKQotewotICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQodG9fcGNpKGJ1cywgZGV2Zm4pLCBvZmZzZXQsIHZhbHVlKTsKLX0KLQotdm9pZCBfcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotICAgIHZhX2xpc3QgYXJnczsKLSAgICBjaGFyIGJ1ZltDRkdfUEJTSVpFXTsKLQotICAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0gICAgKHZvaWQpdnNwcmludGYoYnVmLCBmbXQsIGFyZ3MpOwotICAgIHZhX2VuZChhcmdzKTsKLQotICAgIHByaW50ZihidWYpOwotfQotCi1jaGFyICpfZ2V0ZW52KGNoYXIgKm5hbWUpCi17Ci0gICAgcmV0dXJuIGdldGVudihuYW1lKTsKLX0KLQotdW5zaWduZWQgbG9uZyBnZXRfYmFyX3NpemUocGNpX2Rldl90IGRldiwgaW50IG9mZnNldCkKLXsKLSAgICB1MzIgYmFyX2JhY2ssIGJhcl92YWx1ZTsKLQotICAgIC8qICBTYXZlIG9sZCBCQVIgdmFsdWUgKi8KLSAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBvZmZzZXQsICZiYXJfYmFjayk7Ci0KLSAgICAvKiAgV3JpdGUgYWxsIDEncy4gKi8KLSAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgb2Zmc2V0LCB+MCk7Ci0KLSAgICAvKiAgTm93IHJlYWQgYmFjayB0aGUgcmVsZXZhbnQgYml0cyAqLwotICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIG9mZnNldCwgJmJhcl92YWx1ZSk7Ci0KLSAgICAvKiAgUmVzdG9yZSBvcmlnaW5hbCB2YWx1ZSAqLwotICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBvZmZzZXQsIGJhcl9iYWNrKTsKLQotICAgIGlmIChiYXJfdmFsdWUgPT0gMCkgcmV0dXJuIDB4RkZGRkZGRkY7IC8qICBUaGlzIEJBUiBpcyBkaXNhYmxlZCAqLwotCi0gICAgaWYgKChiYXJfdmFsdWUgJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFKSA9PSBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX01FTU9SWSkKLSAgICB7Ci0JLyogIFRoaXMgaXMgYSBtZW1vcnkgc3BhY2UgQkFSLiBNYXNrIGl0IG91dCBzbyB3ZSBnZXQgdGhlIHNpemUgb2YgaXQgKi8KLQlyZXR1cm4gfihiYXJfdmFsdWUgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLKSArIDE7Ci0gICAgfQotCi0gICAgLyogIE5vdCBzdWl0YWJsZSAqLwotICAgIHJldHVybiAweEZGRkZGRkZGOwotfQotCi12b2lkIGVuYWJsZV9jb21wYXRpYmlsaXR5X2hvbGUodm9pZCkKLXsKLSAgICB1OCBjZmc7Ci0gICAgcGNpX2Rldl90IGFydCA9IFBDSV9CREYoMCwwLDApOwotCi0gICAgcGNpX3JlYWRfY29uZmlnX2J5dGUoYXJ0LCAweDU0LCAmY2ZnKTsKLSAgICAvKiBjZmcgfD0gMHgwODsgKi8KLSAgICBjZmcgfD0gMHgyMDsKLSAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoYXJ0LCAweDU0LCBjZmcpOwotfQotCi12b2lkIGRpc2FibGVfY29tcGF0aWJpbGl0eV9ob2xlKHZvaWQpCi17Ci0gICAgdTggY2ZnOwotICAgIHBjaV9kZXZfdCBhcnQgPSBQQ0lfQkRGKDAsMCwwKTsKLQotICAgIHBjaV9yZWFkX2NvbmZpZ19ieXRlKGFydCwgMHg1NCwgJmNmZyk7Ci0gICAgLyogY2ZnICY9IH4weDA4OyAqLwotICAgIGNmZyAmPSB+MHgyMDsKLSAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoYXJ0LCAweDU0LCBjZmcpOwotfQotCi12b2lkIG1hcF9yb20ocGNpX2Rldl90IGRldiwgdTMyIGFkZHJlc3MpCi17Ci0gICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIFBDSV9ST01fQUREUkVTUywgYWRkcmVzc3xQQ0lfUk9NX0FERFJFU1NfRU5BQkxFKTsKLX0KLQotdm9pZCB1bm1hcF9yb20ocGNpX2Rldl90IGRldikKLXsKLSAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgUENJX1JPTV9BRERSRVNTLCAwKTsKLX0KLQotdm9pZCBiYXRfbWFwKHU4IGJhdG51bSwgdTMyIGFkZHJlc3MsIHUzMiBsZW5ndGgpCi17Ci0gICAgdTMyIHRlbXAgPSBhZGRyZXNzOwotICAgIGFkZHJlc3MgJj0gMHhGRkZFMDAwMDsKLSAgICB0ZW1wICAgICY9IDB4MDAwMUZGRkY7Ci0gICAgbGVuZ3RoID0gKGxlbmd0aCAtIDEgKSA+PiAxNzsKLSAgICBsZW5ndGggPDw9IDI7Ci0KLSAgICBzd2l0Y2ggKGJhdG51bSkKLSAgICB7Ci0gICAgY2FzZSAwOgotCV9fYXNtIHZvbGF0aWxlICgibXRkYmF0dSAwLCAlMCIgOiA6ICJyIiAoYWRkcmVzcyB8IGxlbmd0aCB8IDMpKTsKLQlfX2FzbSB2b2xhdGlsZSAoIm10ZGJhdGwgMCwgJTAiIDogOiAiciIgKGFkZHJlc3MgfCAweDIyKSk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCV9fYXNtIHZvbGF0aWxlICgibXRkYmF0dSAxLCAlMCIgOiA6ICJyIiAoYWRkcmVzcyB8IGxlbmd0aCB8IDMpKTsKLQlfX2FzbSB2b2xhdGlsZSAoIm10ZGJhdGwgMSwgJTAiIDogOiAiciIgKGFkZHJlc3MgfCAweDIyKSk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCV9fYXNtIHZvbGF0aWxlICgibXRkYmF0dSAyLCAlMCIgOiA6ICJyIiAoYWRkcmVzcyB8IGxlbmd0aCB8IDMpKTsKLQlfX2FzbSB2b2xhdGlsZSAoIm10ZGJhdGwgMiwgJTAiIDogOiAiciIgKGFkZHJlc3MgfCAweDIyKSk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOgotCV9fYXNtIHZvbGF0aWxlICgibXRkYmF0dSAzLCAlMCIgOiA6ICJyIiAoYWRkcmVzcyB8IGxlbmd0aCB8IDMpKTsKLQlfX2FzbSB2b2xhdGlsZSAoIm10ZGJhdGwgMywgJTAiIDogOiAiciIgKGFkZHJlc3MgfCAweDIyKSk7Ci0JYnJlYWs7Ci0gICAgfQotfQotCi1pbnQgZmluZF9pbWFnZSh1MzIgcm9tX2FkZHJlc3MsIHUzMiByb21fc2l6ZSwgdm9pZCAqKmltYWdlLCB1MzIgKmltYWdlX3NpemUpOwotCi1pbnQgYXR0ZW1wdF9tYXBfcm9tKHBjaV9kZXZfdCBkZXYsIHZvaWQgKmNvcHlfYWRkcmVzcykKLXsKLSAgICB1MzIgcm9tX3NpemUgICAgICA9IDA7Ci0gICAgdTMyIHJvbV9hZGRyZXNzICAgPSAwOwotICAgIHUzMiBiYXJfc2l6ZSAgICAgID0gMDsKLSAgICB1MzIgYmFyX2JhY2t1cCAgICA9IDA7Ci0gICAgaW50IGksajsKLSAgICB2b2lkICppbWFnZSAgICAgICA9IDA7Ci0gICAgdTMyIGltYWdlX3NpemUgICAgPSAwOwotICAgIGludCBkaWRfY29ycmVjdCAgID0gMDsKLSAgICB1MzIgcHJlZmV0Y2hfYWRkciA9IDA7Ci0gICAgdTMyIHByZWZldGNoX3NpemUgPSAwOwotICAgIHUzMiBwcmVmZXRjaF9pZHggID0gMDsKLQotICAgIC8qICBHZXQgdGhlIHNpemUgb2YgdGhlIGV4cGFuc2lvbiByb20gKi8KLSAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgUENJX1JPTV9BRERSRVNTLCAweEZGRkZGRkZGKTsKLSAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBQQ0lfUk9NX0FERFJFU1MsICZyb21fc2l6ZSk7Ci0gICAgaWYgKChyb21fc2l6ZSAmIDB4MDEpID09IDApCi0gICAgewotCVBSSU5URigiTm8gUk9NXG4iKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByb21fc2l6ZSAmPSAweEZGRkZGODAwOwotICAgIHJvbV9zaXplID0gKH5yb21fc2l6ZSkrMTsKLQotICAgIFBSSU5URigiUk9NIFNpemUgaXMgJWRLXG4iLCByb21fc2l6ZS8xMDI0KTsKLQotICAgIC8qCi0gICAgICogVHJ5IHRvIGZpbmQgYSBwbGFjZSBmb3IgdGhlIFJPTS4gV2UgYWx3YXlzIGF0dGVtcHQgdG8gdXNlCi0gICAgICogb25lIG9mIHRoZSBjYXJkJ3MgYmFzZXMgZm9yIHRoaXMsIGFzIHRoaXMgd2lsbCBiZSBpbiBhbnkKLSAgICAgKiBicmlkZ2UncyByZXNvdXJjZSByYW5nZSBhcyB3ZWxsIGFzIGJlaW5nIGZyZWUgb2YgY29uZmxpY3RzCi0gICAgICogd2l0aCBvdGhlciBjYXJkcy4gSW4gYSBncmFwaGljcyBjYXJkIGl0IGlzIHZlcnkgdW5saWtlbHkKLSAgICAgKiB0aGF0IHRoZXJlIHdvbid0IGJlIGFueSBiYXNlIGFkZHJlc3MgdGhhdCBpcyBsYXJnZSBlbm91Z2ggdG8KLSAgICAgKiBob2xkIHRoZSByb20uCi0gICAgICoKLSAgICAgKiBGSVhNRTogVG8gd29yayBhcm91bmQgdGhpcywgdGhlb3JldGljYWxseSB0aGUgbGFyZ2VzdCBiYXNlCi0gICAgICogY291bGQgYmUgdXNlZCBpZiBub25lIGlzIGZvdW5kIGluIHRoZSBsb29wIGJlbG93LgotICAgICAqLwotCi0gICAgZm9yIChpID0gUENJX0JBU0VfQUREUkVTU18wOyBpIDw9IFBDSV9CQVNFX0FERFJFU1NfNTsgaSArPSA0KQotICAgIHsKLQliYXJfc2l6ZSA9IGdldF9iYXJfc2l6ZShkZXYsIGkpOwotCVBSSU5URigiUENJX0JBU0VfQUREUkVTU18lZCBpcyAlZEsgbGFyZ2VcbiIsCi0JICAgICAgIChpIC0gUENJX0JBU0VfQUREUkVTU18wKS80LAotCSAgICAgICBiYXJfc2l6ZS8xMDI0KTsKLQlpZiAoYmFyX3NpemUgIT0gMHhGRkZGRkZGRiAmJiBiYXJfc2l6ZSA+PSByb21fc2l6ZSkKLQl7Ci0JICAgIFBSSU5URigiRm91bmQgYSBtYXRjaCBmb3Igcm9tIHNpemVcbiIpOwotCSAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBpLCAmcm9tX2FkZHJlc3MpOwotCSAgICByb21fYWRkcmVzcyAmPSAweEZGRkZGRkYwOwotCSAgICBpZiAocm9tX2FkZHJlc3MgIT0gMCAmJiByb21fYWRkcmVzcyAhPSAweEZGRkZGRkYwKSBicmVhazsKLQl9Ci0gICAgfQotCi0gICAgaWYgKHJvbV9hZGRyZXNzID09IDAgfHwgcm9tX2FkZHJlc3MgPT0gMHhGRkZGRkZGMCkKLSAgICB7Ci0JUFJJTlRGKCJObyBzdWl0YWJsZSByb20gYWRkcmVzcyBmb3VuZFxuIik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogIERpc2FibGUgdGhlIEJBUiAqLwotICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIGksICZiYXJfYmFja3VwKTsKLSAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgaSwgMCk7Ci0KLSAgICAvKiAgTWFwIFJPTSAqLwotICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBQQ0lfUk9NX0FERFJFU1MsIHJvbV9hZGRyZXNzIHwgUENJX1JPTV9BRERSRVNTX0VOQUJMRSk7Ci0KLSAgICAvKiAgQ29weSB0aGUgcm9tIHRvIGEgcGxhY2UgaW4gdGhlIGVtdWxhdG9yIHNwYWNlICovCi0gICAgUFJJTlRGKCJDbGFpbWluZyBCQVQgMlxuIik7Ci0gICAgYmF0X21hcCgyLCByb21fYWRkcmVzcywgcm9tX3NpemUpOwotICAgIC8qIHNob3dfYmF0X21hcHBpbmcoKTsgKi8KLQotICAgIGlmICgwID09IGZpbmRfaW1hZ2Uocm9tX2FkZHJlc3MsIHJvbV9zaXplLCAmaW1hZ2UsICZpbWFnZV9zaXplKSkKLSAgICB7Ci0JUFJJTlRGKCJObyB4ODYgQklPUyBpbWFnZSBmb3VuZFxuIik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgUFJJTlRGKCJDb3B5aW5nICVsZCBieXRlcyBmcm9tIDB4JWx4IHRvIDB4JWx4XG4iLCAobG9uZylpbWFnZV9zaXplLCAobG9uZylpbWFnZSwgKGxvbmcpY29weV9hZGRyZXNzKTsKLQotICAgIC8qIG1lbWNweShjb3B5X2FkZHJlc3MsIHJvbV9hZGRyZXNzLCByb21fc2l6ZSk7ICovCi0gICAgewotCXVuc2lnbmVkIGNoYXIgKmZyb20gPSAodW5zaWduZWQgY2hhciAqKWltYWdlOyAvKiByb21fYWRkcmVzczsgKi8KLQl1bnNpZ25lZCBjaGFyICp0byA9ICh1bnNpZ25lZCBjaGFyICopY29weV9hZGRyZXNzOwotCWZvciAoaj0wOyBqPGltYWdlX3NpemUgLypyb21fc2l6ZSovOyBqKyspCi0JewotCSAgICAqdG8rKyA9ICpmcm9tKys7Ci0JfQotICAgIH0KLQotICAgIFBSSU5URigiQ29weSBpcyBkb25lXG4iKTsKLQotICAgIC8qICBVbm1hcCB0aGUgUk9NIGFuZCByZXN0b3JlIHRoZSBCQVIgKi8KLSAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgUENJX1JPTV9BRERSRVNTLCAwKTsKLSAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgaSwgYmFyX2JhY2t1cCk7Ci0KLSAgICAvKiAgRklYTUU6IFNob3VsZG4ndCBiZSBuZWVkZWQgYW55bW9yZSovCi0gICAgLyogYmF0X21hcCgyLCAweDgwMDAwMDAwLCAyNTYqMTAyNCoxMDI0KTsKLSAgICAgICBzaG93X2JhdF9tYXBwaW5nKCk7ICovCi0KLSAgICAvKgotICAgICAqIFNpbmNlIG1vc3QgY2FyZHMgY2FuIHByb2JhYmx5IG9ubHkgZG8gMTYgYml0IElPIGFkZHJlc3NpbmcsIHdlCi0gICAgICogY29ycmVjdCB0aGVpciBJTyBiYXNlIGludG8gYW4gYXBwcm9wcmlhdGUgdmFsdWUuCi0gICAgICogVGhpcyBzaG91bGQgZG8gZm9yIG1vc3QuCi0gICAgICovCi0gICAgZm9yIChpID0gUENJX0JBU0VfQUREUkVTU18wOyBpIDw9IFBDSV9CQVNFX0FERFJFU1NfNTsgaSArPSA0KQotICAgIHsKLQl1bnNpZ25lZCBsb25nIHZhbHVlOwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIGksICZ2YWx1ZSk7Ci0JaWYgKHZhbHVlICYgMHgwMSkgLyogIElPICovCi0JewotCSAgICBkaWRfY29ycmVjdCA9IDE7Ci0JICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBpLCAweDEwMDEpOwotCSAgICBicmVhazsKLQl9Ci0KLQlpZiAodmFsdWUgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9QUkVGRVRDSCkKLQl7Ci0JICAgIHByZWZldGNoX2lkeCA9IGk7Ci0JICAgIHByZWZldGNoX2FkZHIgPSB2YWx1ZSAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7Ci0JICAgIHByZWZldGNoX3NpemUgPSBnZXRfYmFyX3NpemUoZGV2LCBpKTsKLQl9Ci0gICAgfQotCi0gICAgaWYgKDEpIC8qIGRpZF9jb3JyZWN0KSAqLwotICAgIHsKLQlleHRlcm4gcGNpX2Rldl90IHBjaV9maW5kX2JyaWRnZV9mb3JfYnVzKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgaW50IGJ1c25yKTsKLQlpbnQgYnVzbnIgPSBQQ0lfQlVTKGRldik7Ci0JaWYgKGJ1c25yKQotCXsKLQkgICAgcGNpX2Rldl90IGJyaWRnZTsKLQkgICAgUFJJTlRGKCJOZWVkIHRvIGNvcnJlY3QgYnJpZGdlIGRldmljZSBmb3IgSU8gcmFuZ2UgY2hhbmdlXG4iKTsKLQkgICAgYnJpZGdlID0gcGNpX2ZpbmRfYnJpZGdlX2Zvcl9idXMoTlVMTCwgYnVzbnIpOwotCSAgICBpZiAoYnJpZGdlID09IFBDSV9BTllfSUQpCi0JICAgIHsKLQkJUFJJTlRGKCJEaWRuJ3QgZmluZCBicmlkZ2UuIEhvcGUgdGhhdCdzIE9LXG4iKTsKLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKLQkJLyoKLQkJICogU2V0IHVwcGVyIEkvTyBiYXNlL2xpbWl0IHRvIDAKLQkJICovCi0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShicmlkZ2UsIDB4MzAsIDB4MDApOwotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYnJpZGdlLCAweDMxLCAweDAwKTsKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGJyaWRnZSwgMHgzMiwgMHgwMCk7Ci0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShicmlkZ2UsIDB4MzMsIDB4MDApOwotCQlpZiAoZGlkX2NvcnJlY3QpCi0JCXsKLQkJICAgIC8qCi0JCSAgICAgKiBzZXQgbG93ZXIgSS9PIGJhc2UgdG8gMTAwMAotCQkgICAgICogVGhhdCBpcywgYml0cyAwOjMgYXJlIHNldCB0byAwMDAxIGJ5IGRlZmF1bHQuCi0JCSAgICAgKiBiaXRzIDc6NCBjb250YWluIEkvTyBhZGRyZXNzIGJpdHMgMTU6MTIKLQkJICAgICAqIGFsbCBvdGhlcnMgYXJlIGFzc3VtZWQgMC4KLQkJICAgICAqLwotCQkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGJyaWRnZSwgMHgxQywgMHgxMSk7Ci0JCSAgICAvKgotCQkgICAgICogU2V0IGxvd2VyIEkvTyBsaW1pdCB0byAxRkZGCi0JCSAgICAgKiBUaGF0IGlzLCBiaXRzIDA6MyBhcmUgcmVzZXJ2ZWQgYW5kIGFsd2F5cyAwMDAwCi0JCSAgICAgKiBCaXRzIDc6NCBjb250YWluIEkvTyBhZGRyZXNzIGJpdHMgMTU6MTIKLQkJICAgICAqIEFsbCBvdGhlcnMgYXJlIGFzc3VtZWQgRi4KLQkJICAgICAqLwotCQkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGJyaWRnZSwgMHgxRCwgMHgxMCk7Ci0JCSAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoYnJpZGdlLCAweDBELCAweDIwKTsKLQkJICAgIFBSSU5URigiQ29ycmVjdGVkIGJyaWRnZSByZXNvdXJjZSByYW5nZSBvZiBicmlkZ2UgYXQgJTAyeDolMDJ4OiUwMnhcbiIsCi0JCQkgICBQQ0lfQlVTKGJyaWRnZSksIFBDSV9ERVYoYnJpZGdlKSwgUENJX0ZVTkMoYnJpZGdlKSk7Ci0KLQkJfQotCQllbHNlCi0JCXsKLQkJICAgIC8qCi0JCSAgICAgKiBUaGlzIGNhcmQgZG9lc24ndCBoYXZlIEkvTywgd2UgZGlzYWJsZSBJL08gZm9yd2FyZGluZwotCQkgICAgICovCi0JCSAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoYnJpZGdlLCAweDFDLCAweDExKTsKLQkJICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShicmlkZ2UsIDB4MUQsIDB4MDApOwotCQkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGJyaWRnZSwgUENJX0lOVEVSUlVQVF9MSU5FLCAwKTsKLQkJICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShicmlkZ2UsIFBDSV9JTlRFUlJVUFRfUElOLCAwKTsKLQkJICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQoYnJpZGdlLCBQQ0lfQ09NTUFORCwgUENJX0NPTU1BTkRfTUVNT1JZIHwgUENJX0NPTU1BTkRfTUFTVEVSIHwgUENJX0NPTU1BTkRfSU8pOwotCQkgICAgUFJJTlRGKCJEaXNhYmxlZCBicmlkZ2UgcmVzb3VyY2UgcmFuZ2Ugb2YgYnJpZGdlIGF0ICUwMng6JTAyeDolMDJ4XG4iLAotCQkJICAgUENJX0JVUyhicmlkZ2UpLCBQQ0lfREVWKGJyaWRnZSksIFBDSV9GVU5DKGJyaWRnZSkpOwotCi0JCX0KLQkgICAgfQotCSAgICAvKgotCSAgICAgKiBDb3JyZWN0IHRoZSBwcmVmZXRjaGFibGUgbWVtb3J5IGJhc2UsIHdoaWNoIGlzIG5vdCBzZXQgY29ycmVjdGx5IGJ5Ci0JICAgICAqIHRoZSBVLUJvb3QgYXV0b2NvbmZpZyBzdHVmZgotCSAgICAgKi8KLQkgICAgaWYgKHByZWZldGNoX2lkeCkKLQkgICAgewotLyogCQlQUklOVEYoIlNldHRpbmcgcHJlZmV0Y2hhYmxlIHJhbmdlIHRvICV4LCAleCAoJXggYW5kICV4KVxuIiwgKi8KLS8qIAkJICAgICAgIHByZWZldGNoX2FkZHIsIHByZWZldGNoX2FkZHIrcHJlZmV0Y2hfc2l6ZSwgKi8KLS8qIAkJICAgICAgIHByZWZldGNoX2FkZHI+PjE2LCAocHJlZmV0Y2hfYWRkcitwcmVmZXRjaF9zaXplKT4+MTYpOyAqLwotLyogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoYnJpZGdlLCBQQ0lfUFJFRl9NRU1PUllfQkFTRSwgKHByZWZldGNoX2FkZHI+PjE2KSk7ICovCi0vKiAJCXBjaV93cml0ZV9jb25maWdfd29yZChicmlkZ2UsIFBDSV9QUkVGX01FTU9SWV9MSU1JVCwgKHByZWZldGNoX2FkZHIrcHJlZmV0Y2hfc2l6ZSk+PjE2KTsgKi8KLQkgICAgfQotCi0JICAgIHBjaV93cml0ZV9jb25maWdfd29yZChicmlkZ2UsIFBDSV9QUkVGX01FTU9SWV9CQVNFLCAweDEwMDApOwotCSAgICBwY2lfd3JpdGVfY29uZmlnX3dvcmQoYnJpZGdlLCBQQ0lfUFJFRl9NRU1PUllfTElNSVQsIDB4MDAwMCk7Ci0KLQkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGJyaWRnZSwgMHhEMCwgMHgwQSk7Ci0JICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShicmlkZ2UsIDB4RDMsIDB4MDQpOwotCi0JICAgIC8qCi0JICAgICAqIFNldCB0aGUgaW50ZXJydXB0IHBpbiB0byAwCi0JICAgICAqLwotI2lmIDAKLQkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCAwKTsKLQkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9QSU4sIDApOwotI2VuZGlmCi0JICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShicmlkZ2UsIFBDSV9JTlRFUlJVUFRfTElORSwgMCk7Ci0JICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShicmlkZ2UsIFBDSV9JTlRFUlJVUFRfUElOLCAwKTsKLQotCX0KLSAgICB9Ci0KLSAgICAvKiBGaW5hbGx5LCBlbmFibGUgdGhlIGNhcmQncyBJTyBhbmQgbWVtb3J5IHJlc3BvbnNlICovCi0gICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIFBDSV9DT01NQU5ELCBQQ0lfQ09NTUFORF9NRU1PUlkgfCBQQ0lfQ09NTUFORF9JTyk7Ci0gICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgMCk7Ci0gICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIDApOwotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLWludCBmaW5kX2ltYWdlKHUzMiByb21fYWRkcmVzcywgdTMyIHJvbV9zaXplLCB2b2lkICoqaW1hZ2UsIHUzMiAqaW1hZ2Vfc2l6ZSkKLXsKLSAgICBpbnQgaSA9IDA7Ci0gICAgdW5zaWduZWQgY2hhciAqcm9tID0gKHVuc2lnbmVkIGNoYXIgKilyb21fYWRkcmVzczsKLSAgICAvKiBpZiAoKnJvbSAhPSAweDU1IHx8ICoocm9tKzEpICE9IDB4QUEpIHJldHVybiAwOyAvKiBObyBiaW9zIHJvbSB0aGlzIGlzLCB5ZXMuICovICovCi0KLSAgICBmb3IgKDs7KQotICAgIHsKLQl1bnNpZ25lZCBzaG9ydCBwY2lfZGF0YV9vZmZzZXQgPSAqKHJvbSsweDE4KSArIDI1NiAqICoocm9tKzB4MTkpOwotCXVuc2lnbmVkIHNob3J0IHBjaV9pbWFnZV9sZW5ndGggPSAoKihyb20rcGNpX2RhdGFfb2Zmc2V0KzB4MTApICsgMjU2ICogKihyb20rcGNpX2RhdGFfb2Zmc2V0KzB4MTEpKSAqIDUxMjsKLQl1bnNpZ25lZCBjaGFyIHBjaV9pbWFnZV90eXBlID0gKihyb20rcGNpX2RhdGFfb2Zmc2V0KzB4MTQpOwotCWlmICgqcm9tICE9IDB4NTUgfHwgKihyb20rMSkgIT0gMHhBQSkKLQl7Ci0JICAgIFBSSU5URigiSW52YWxpZCBoZWFkZXIgdGhpcyBpc1xuIik7Ci0JICAgIHJldHVybiAwOwotCX0KLQlQUklOVEYoIkltYWdlICVpOiBUeXBlICVkICglcylcbiIsIGkrKywgcGNpX2ltYWdlX3R5cGUsCi0JICAgICAgIHBjaV9pbWFnZV90eXBlPT0wID8gIng4NiIgOgotCSAgICAgICBwY2lfaW1hZ2VfdHlwZT09MSA/ICJPcGVuRmlybXdhcmUiIDoKLQkgICAgICAgIlVua25vd24iKTsKLQlpZiAocGNpX2ltYWdlX3R5cGUgPT0gMCkKLQl7Ci0JICAgICppbWFnZSA9IHJvbTsKLQkgICAgKmltYWdlX3NpemUgPSBwY2lfaW1hZ2VfbGVuZ3RoOwotCSAgICByZXR1cm4gMTsKLQl9Ci0KLQlpZiAoKihyb20rcGNpX2RhdGFfb2Zmc2V0KzB4MTUpICYgMHg4MCkKLQl7Ci0JICAgIFBSSU5URigiTEFTVCBpbWFnZSBlbmNvdW50ZXJlZCwgbm8gaW1hZ2UgZm91bmRcbiIpOwotCSAgICByZXR1cm4gMDsKLQl9Ci0KLQlyb20gKz0gcGNpX2ltYWdlX2xlbmd0aDsKLSAgICB9Ci19Ci0KLXZvaWQgc2hvd19iYXRfbWFwcGluZyh2b2lkKQotewotICAgIHUzMiBkYmF0MHUsIGRiYXQwbCwgaWJhdDB1LCBpYmF0MGw7Ci0gICAgdTMyIGRiYXQxdSwgZGJhdDFsLCBpYmF0MXUsIGliYXQxbDsKLSAgICB1MzIgZGJhdDJ1LCBkYmF0MmwsIGliYXQydSwgaWJhdDJsOwotICAgIHUzMiBkYmF0M3UsIGRiYXQzbCwgaWJhdDN1LCBpYmF0M2w7Ci0gICAgdTMyIG1zciwgaGlkMCwgbDJjcl9yZWc7Ci0KLSAgICBfX2FzbSB2b2xhdGlsZSAoIm1mZGJhdHUgJTAsMCIgOiAiPXIiIChkYmF0MHUpKTsKLSAgICBfX2FzbSB2b2xhdGlsZSAoIm1mZGJhdGwgJTAsMCIgOiAiPXIiIChkYmF0MGwpKTsKLSAgICBfX2FzbSB2b2xhdGlsZSAoIm1maWJhdHUgJTAsMCIgOiAiPXIiIChpYmF0MHUpKTsKLSAgICBfX2FzbSB2b2xhdGlsZSAoIm1maWJhdGwgJTAsMCIgOiAiPXIiIChpYmF0MGwpKTsKLQotICAgIF9fYXNtIHZvbGF0aWxlICgibWZkYmF0dSAlMCwxIiA6ICI9ciIgKGRiYXQxdSkpOwotICAgIF9fYXNtIHZvbGF0aWxlICgibWZkYmF0bCAlMCwxIiA6ICI9ciIgKGRiYXQxbCkpOwotICAgIF9fYXNtIHZvbGF0aWxlICgibWZpYmF0dSAlMCwxIiA6ICI9ciIgKGliYXQxdSkpOwotICAgIF9fYXNtIHZvbGF0aWxlICgibWZpYmF0bCAlMCwxIiA6ICI9ciIgKGliYXQxbCkpOwotCi0gICAgX19hc20gdm9sYXRpbGUgKCJtZmRiYXR1ICUwLDIiIDogIj1yIiAoZGJhdDJ1KSk7Ci0gICAgX19hc20gdm9sYXRpbGUgKCJtZmRiYXRsICUwLDIiIDogIj1yIiAoZGJhdDJsKSk7Ci0gICAgX19hc20gdm9sYXRpbGUgKCJtZmliYXR1ICUwLDIiIDogIj1yIiAoaWJhdDJ1KSk7Ci0gICAgX19hc20gdm9sYXRpbGUgKCJtZmliYXRsICUwLDIiIDogIj1yIiAoaWJhdDJsKSk7Ci0KLSAgICBfX2FzbSB2b2xhdGlsZSAoIm1mZGJhdHUgJTAsMyIgOiAiPXIiIChkYmF0M3UpKTsKLSAgICBfX2FzbSB2b2xhdGlsZSAoIm1mZGJhdGwgJTAsMyIgOiAiPXIiIChkYmF0M2wpKTsKLSAgICBfX2FzbSB2b2xhdGlsZSAoIm1maWJhdHUgJTAsMyIgOiAiPXIiIChpYmF0M3UpKTsKLSAgICBfX2FzbSB2b2xhdGlsZSAoIm1maWJhdGwgJTAsMyIgOiAiPXIiIChpYmF0M2wpKTsKLQotICAgIF9fYXNtIHZvbGF0aWxlICgibWZtc3IgJTAiICAgICA6ICI9ciIgKG1zcikpOwotICAgIF9fYXNtIHZvbGF0aWxlICgibWZzcHIgJTAsMTAwOCI6ICI9ciIgKGhpZDApKTsKLSAgICBfX2FzbSB2b2xhdGlsZSAoIm1mc3ByICUwLDEwMTciOiAiPXIiIChsMmNyX3JlZykpOwotCi0gICAgcHJpbnRmKCJkYmF0MHU6ICUwOHggZGJhdDBsOiAlMDh4IGliYXQwdTogJTA4eCBpYmF0MGw6ICUwOHhcbiIsCi0JICAgZGJhdDB1LCBkYmF0MGwsIGliYXQwdSwgaWJhdDBsKTsKLSAgICBwcmludGYoImRiYXQxdTogJTA4eCBkYmF0MWw6ICUwOHggaWJhdDF1OiAlMDh4IGliYXQxbDogJTA4eFxuIiwKLQkgICBkYmF0MXUsIGRiYXQxbCwgaWJhdDF1LCBpYmF0MWwpOwotICAgIHByaW50ZigiZGJhdDJ1OiAlMDh4IGRiYXQybDogJTA4eCBpYmF0MnU6ICUwOHggaWJhdDJsOiAlMDh4XG4iLAotCSAgIGRiYXQydSwgZGJhdDJsLCBpYmF0MnUsIGliYXQybCk7Ci0gICAgcHJpbnRmKCJkYmF0M3U6ICUwOHggZGJhdDNsOiAlMDh4IGliYXQzdTogJTA4eCBpYmF0M2w6ICUwOHhcbiIsCi0JICAgZGJhdDN1LCBkYmF0M2wsIGliYXQzdSwgaWJhdDNsKTsKLQotICAgIHByaW50ZigiXG5NU1I6ICUwOHggICBISUQwOiAlMDh4ICAgTDJDUjogJTA4eCBcbiIsIG1zcixoaWQwLCBsMmNyX3JlZyk7Ci19Ci0KLQotdm9pZCByZW1vdmVfaW5pdF9kYXRhKHZvaWQpCi17Ci0gICAgY2hhciAqczsKLQotICAgIC8qICBJbnZhbGlkYXRlIGFuZCBkaXNhYmxlIGRhdGEgY2FjaGUgKi8KLSAgICBpbnZhbGlkYXRlX2wxX2RhdGFfY2FjaGUoKTsKLSAgICBkY2FjaGVfZGlzYWJsZSgpOwotCi0gICAgcyA9IGdldGVudigieDg2X2NhY2hlIik7Ci0KLSAgICBpZiAoIXMpCi0gICAgewotCWljYWNoZV9lbmFibGUoKTsKLQlkY2FjaGVfZW5hYmxlKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHMpCi0gICAgewotCWlmIChzdHJjbXAocywgImRjYWNoZSIpPT0wKQotCXsKLQkgICAgZGNhY2hlX2VuYWJsZSgpOwotCX0KLQllbHNlIGlmIChzdHJjbXAocywgImljYWNoZSIpID09IDApCi0JewotCSAgICBpY2FjaGVfZW5hYmxlKCk7Ci0JfQotCWVsc2UgaWYgKHN0cmNtcChzLCAib24iKT09IDAgfHwgc3RyY21wKHMsICJib3RoIikgPT0gMCkKLQl7Ci0JICAgIGRjYWNoZV9lbmFibGUoKTsKLQkgICAgaWNhY2hlX2VuYWJsZSgpOwotCX0KLSAgICB9Ci0KLSAgICAvKiAgIHNob3dfYmF0X21hcHBpbmcoKTsqLwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3IvZ2x1ZS5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3IvZ2x1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODVlZmUxLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL2dsdWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNpZm5kZWYgR0xVRV9ICi0jZGVmaW5lIEdMVUVfSAotCi10eXBlZGVmIHVuc2lnbmVkIGludCBwY2lfZGV2X3Q7Ci0KLWludCBteXBjaV9maW5kX2RldmljZShpbnQgdmVuZG9yLCBpbnQgcHJvZHVjdCwgaW50IGluZGV4KTsKLWludCBteXBjaV9idXMoaW50IGRldmljZSk7Ci1pbnQgbXlwY2lfZGV2Zm4oaW50IGRldmljZSk7Ci11bnNpZ25lZCBsb25nIGdldF9iYXJfc2l6ZShwY2lfZGV2X3QgZGV2LCBpbnQgb2Zmc2V0KTsKLQotdTggICBteXBjaV9yZWFkX2NmZ19ieXRlKGludCBidXMsIGludCBkZXZmbiwgaW50IG9mZnNldCk7Ci11MTYgIG15cGNpX3JlYWRfY2ZnX3dvcmQoaW50IGJ1cywgaW50IGRldmZuLCBpbnQgb2Zmc2V0KTsKLXUzMiAgbXlwY2lfcmVhZF9jZmdfbG9uZyhpbnQgYnVzLCBpbnQgZGV2Zm4sIGludCBvZmZzZXQpOwotCi12b2lkIG15cGNpX3dyaXRlX2NmZ19ieXRlKGludCBidXMsIGludCBkZXZmbiwgaW50IG9mZnNldCwgdTggdmFsdWUpOwotdm9pZCBteXBjaV93cml0ZV9jZmdfd29yZChpbnQgYnVzLCBpbnQgZGV2Zm4sIGludCBvZmZzZXQsIHUxNiB2YWx1ZSk7Ci12b2lkIG15cGNpX3dyaXRlX2NmZ19sb25nKGludCBidXMsIGludCBkZXZmbiwgaW50IG9mZnNldCwgdTMyIHZhbHVlKTsKLQotdm9pZCBfcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKLWNoYXIgKl9nZXRlbnYoY2hhciAqbmFtZSk7Ci0KLXZvaWQgKm1hbGxvYyhzaXplX3Qgc2l6ZSk7Ci12b2lkIG1lbXNldCh2b2lkICphZGRyLCBpbnQgdmFsdWUsIHNpemVfdCBzaXplKTsKLXZvaWQgbWVtY3B5KHZvaWQgKnRvLCB2b2lkICpmcm9tLCBzaXplX3QgbnVtYnl0ZXMpOwotaW50ICBzdHJjbXAoY2hhciAqLCBjaGFyICopOwotCi12b2lkIGVuYWJsZV9jb21wYXRpYmlsaXR5X2hvbGUodm9pZCk7Ci12b2lkIGRpc2FibGVfY29tcGF0aWJpbGl0eV9ob2xlKHZvaWQpOwotCi12b2lkIG1hcF9yb20ocGNpX2Rldl90IGRldiwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKTsKLXZvaWQgdW5tYXBfcm9tKHBjaV9kZXZfdCBkZXYpOwotaW50ICBhdHRlbXB0X21hcF9yb20ocGNpX2Rldl90IGRldiwgdm9pZCAqY29weV9hZGRyZXNzKTsKLQotI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19TUEFDRSAweDAxICAgIC8qIDAgPSBtZW1vcnksIDEgPSBJL08gKi8KLSNkZWZpbmUgIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8gMHgwMQotI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19TUEFDRV9NRU1PUlkgMHgwMAotI2RlZmluZSAgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSyAgICAgICh+MHgwZlVMKQotCi0jZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfMCAgICAgIDB4MTAgICAgLyogMzIgYml0cyAqLwotI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzEgICAgICAweDE0ICAgIC8qIDMyIGJpdHMgW2h0eXBlIDAsMSBvbmx5XSAqLwotI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzIgICAgICAweDE4ICAgIC8qIDMyIGJpdHMgW2h0eXBlIDAgb25seV0gKi8KLSNkZWZpbmUgUENJX0JBU0VfQUREUkVTU18zICAgICAgMHgxYyAgICAvKiAzMiBiaXRzICovCi0jZGVmaW5lIFBDSV9CQVNFX0FERFJFU1NfNCAgICAgIDB4MjAgICAgLyogMzIgYml0cyAqLwotI2RlZmluZSBQQ0lfQkFTRV9BRERSRVNTXzUgICAgICAweDI0ICAgIC8qIDMyIGJpdHMgKi8KLSNkZWZpbmUgUENJX0JVUyhkKSAgICAgICgoKGQpID4+IDE2KSAmIDB4ZmYpCi0jZGVmaW5lIFBDSV9ERVYoZCkgICAgICAoKChkKSA+PiAxMSkgJiAweDFmKQotI2RlZmluZSBQQ0lfRlVOQyhkKSAgICAgKCgoZCkgPj4gOCkgJiAweDcpCi0jZGVmaW5lIFBDSV9CREYoYixkLGYpICAoKGIpIDw8IDE2IHwgKGQpIDw8IDExIHwgKGYpIDw8IDgpCi0KLSNkZWZpbmUgUENJX0FOWV9JRCAofjApCi0jZGVmaW5lIFBDSV9ST01fQUREUkVTUyAgICAgICAgIDB4MzAgICAgLyogQml0cyAzMS4uMTEgYXJlIGFkZHJlc3MsIDEwLi4xIHJlc2VydmVkICovCi0jZGVmaW5lIFBDSV9ST01fQUREUkVTU19FTkFCTEUgMHgwMQotCi0jZGVmaW5lIE9GRihhZGRyKSAoKGFkZHIpICYgMHhGRkZGKQotI2RlZmluZSBTRUcoYWRkcikgKCgoYWRkcik+PjQpICYweEYwMDApCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmMzMS1kMTYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmMzMS1kMTYuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NzZkMTM4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjMzEtZDE2LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyAzLjEuCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzE2XEJDMzslQkMzX1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MxNlxCQzM7JUJDM19QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDM19QQVRIJVxJTkNMVURFOwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMuTUsKLVNFVCBVU0VfRFBNSTE2PQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1NOQVA9Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDM19QQVRIJVxCSU47JURFRlBBVEglCi0KLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQzNfUEFUSCVcQklOXHR1cmJvYy5jZmcKLWVjaG8gLUwlTElCJSA+PiAlQkMzX1BBVEglXEJJTlx0dXJib2MuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkMzX1BBVEglXEJJTlx0bGluay5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyAzLjEgRE9TIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM0NS1jMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM0NS1jMzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMjkzOWY0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtYzMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyA0LjUgaW4gMzIgYml0IFdpbmRvd3MgbW9kZS4KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcQkM0OyVCQzRfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXEJDNDslQkM0X1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkM0X1BBVEglXElOQ0xVREU7Ci1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMzIuTUsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPTEKLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX0JDNT0KLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgQkNfTElCQkFTRT1CQzQKLVBBVEggJVNDSVRFQ0hfQklOJTslQkM0X1BBVEglXEJJTjslREVGUEFUSCUlQkNfQ0RfUEFUSCUKLQotUkVNOiBFbmFibGUgV2luMzIgU0RLIGlmIGRlc2lyZWQgKHNkayBvbiBjb21tYW5kIGxpbmUpCi1pZiBOT1QgLiUxJT09LnNkayBnb3RvIGNyZWF0ZWZpbGVzCi1jYWxsIHdpbjMyc2RrLmJhdCBib3JsYW5kCi0KLTpjcmVhdGVmaWxlcwotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDNF9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDNF9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkM0X1BBVEglXEJJTlx0bGluazMyLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIDQuNSAzMiBiaXQgV2luZG93cyBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtZDE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtZDE2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjQ2NTE3ZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LWQxNi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgNC41IGluIDE2IGJpdCBtb2RlLgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MxNlxCQzQ7JUJDNF9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMTZcQkM0OyVCQzRfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVCQzRfUEFUSCVcSU5DTFVERQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzE2Lk1LCi1TRVQgVVNFX0RQTUkxNj0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX0JDNT0KLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgQkNfTElCQkFTRT1CQzQKLVBBVEggJVNDSVRFQ0hfQklOJTslQkM0X1BBVEglXEJJTjslREVGUEFUSCUlQkNfQ0RfUEFUSCUKLQotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDNF9QQVRIJVxCSU5cdHVyYm9jLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQzRfUEFUSCVcQklOXHR1cmJvYy5jZmcKLWVjaG8gLUwlTElCJSA+ICVCQzRfUEFUSCVcQklOXHRsaW5rLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIDQuNSAxNiBiaXQgRE9TIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM0NS1kMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM0NS1kMzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYmIyYzc5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtZDMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyA0LjUgaW4gMzIgYml0IG1vZGUuCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzMyXEJDNDslQkM0X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MzMlxCQzQ7JUJDNF9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDNF9QQVRIJVxJTkNMVURFOwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCi1TRVQgVVNFX0RQTUkxNj0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfQkM1PQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBCQ19MSUJCQVNFPUJDNAotUEFUSCAlU0NJVEVDSF9CSU4lOyVCQzRfUEFUSCVcQklOOyVERUZQQVRIJSVCQ19DRF9QQVRIJQotCi1SRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKLWVjaG8gLUklSU5DTFVERSUgPiAlQkM0X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+PiAlQkM0X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+ICVCQzRfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCi0KLWVjaG8gQm9ybGFuZCBDKysgNC41IDMyIGJpdCBET1MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAgKERQTUkzMikuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LXNucC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LXNucC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0ZDdjMDUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM0NS1zbnAuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIDQuNSBpbiAzMiBiaXQgV2luZG93cyBtb2RlLgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxTTkFQXEJDNDslQkM0X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xTTkFQXEJDNDslQkM0X1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX0JDNT0KLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1NOQVA9MQotU0VUIEJDX0xJQkJBU0U9QkM0Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDNF9QQVRIJVxCSU47JURFRlBBVEglJUJDX0NEX1BBVEglCi0KLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQzRfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQzRfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4gJUJDNF9QQVRIJVxCSU5cdGxpbmszMi5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyA0LjUgU25hcCBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtdG50LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtdG50LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTBiZDNjYi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LXRudC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgNC41IGluIDMyIGJpdCBtb2RlIHdpdGggUGhhciBMYXAgVE5UCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzMyXEJDNDslQkM0X1BBVEglXExJQjslVE5UX1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MzMlxCQzQ7JUJDNF9QQVRIJVxMSUI7JVROVF9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDNF9QQVRIJVxJTkNMVURFOyVUTlRfUEFUSCVcSU5DTFVERTsKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSwotU0VUIFVTRV9EUE1JMTY9Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9UTlQ9MQotU0VUIFVTRV9CQzU9Ci1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIEJDX0xJQkJBU0U9QkM0Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDNF9QQVRIJVxCSU47JVROVF9QQVRIJVxCSU47JURFRlBBVEglJUJDX0NEX1BBVEglCi0KLVJFTSBJZiB5b3Ugc2V0IHRoZSBmb2xsb3dpbmcgdG8gYSAxLCBhIFROVCBEb3NTdHlsZSBhcHAgd2lsbCBiZSBjcmVhdGVkLgotUkVNIE90aGVyd2lzZSBhIFROVCBOdFN0eWxlIGFwcCB3aWxsIGJlIGNyZWF0ZWQuIE50U3R5bGUgYXBwcyB3aWxsICpvbmx5KgotUkVNIHJ1biB1bmRlciByZWFsIERPUyB3aGVuIHVzaW5nIG91ciBsaWJyYXJpZXMsIHNpbmNlIHdlIHJlcXVpcmUgYWNjZXNzCi1SRU0gdG8gZnVuY3Rpb25zIHRoYXQgdGhlIFdpbjMyIEFQSSBkb2VzIG5vdCBzdXBwb3J0IChzdWNoIGFzIGRpcmVjdCBhY2Nlc3MKLVJFTSB0byB2aWRlbyBtZW1vcnksIGNhbGxpbmcgSW50IDEwaCBCSU9TIGZ1bmN0aW9ucyBldGMpLiBEb3NTdHlsZSBhcHBzCi1SRU0gd2lsbCBob3dldmVyIHJ1biBmaW5lIGluIGJvdGggRE9TIGFuZCBhIFdpbjk1IERPUyBib3ggKE5UIERPUyBib3hlcyBkb24ndAotUkVNIHdvcmsgdG9vIHdlbGwpLgotUkVNCi1SRU0gSWYgeW91IGFyZSB1c2luZyB0aGUgUmVhbFRpbWUgRE9TIGV4dGVuZGVyLCB5b3VyIGFwcHMgKm11c3QqIGJlIE50U3R5bGUsCi1SRU0gYW5kIGhlbmNlIHdpbGwgbmV2ZXIgYmUgYWJsZSB0byBydW4gdW5kZXIgV2luOTUgb3IgV2luTlQsIG9ubHkgRE9TLgotCi1TRVQgRE9TU1RZTEU9Ci0KLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQzRfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQzRfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4gJUJDNF9QQVRIJVxCSU5cdGxpbmszMi5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyA0LjUgMzIgYml0IERPUyBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cCAoVE5UKS4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtdnhkLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtdnhkLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGI1OWZhNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LXZ4ZC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgNC41IGluIDMyIGJpdCBXaW5kb3dzIFZ4RCBtb2RlLgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxWWERcQkM0OyVCQzRfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFZYRFxCQzQ7JUJDNF9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDNF9QQVRIJVxJTkNMVURFOwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfVlhEPTEKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9CQzU9Ci1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIEJDX0xJQkJBU0U9QkM0Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDNF9QQVRIJVxCSU47JURFRlBBVEglJUJDX0NEX1BBVEglCi0KLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQzRfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQzRfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4gJUJDNF9QQVRIJVxCSU5cdGxpbmszMi5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyA0LjUgMzItYml0IFZ4RCBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtdzE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNDUtdzE2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGQ3OTliNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LXcxNi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgNC41IGluIDE2IGJpdCBXaW5kb3dzIG1vZGUuCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjE2XEJDNDslQkM0X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4xNlxCQzQ7JUJDNF9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDNF9QQVRIJVxJTkNMVURFOwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzE2Lk1LCi1TRVQgVVNFX0RQTUkxNj0KLVNFVCBVU0VfV0lOMTY9MQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9CQzU9Ci1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIEJDX0xJQkJBU0U9QkM0Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDNF9QQVRIJVxCSU47JURFRlBBVEglJUJDX0NEX1BBVEglCi0KLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQzRfUEFUSCVcQklOXHR1cmJvYy5jZmcKLWVjaG8gLUwlTElCJSA+PiAlQkM0X1BBVEglXEJJTlx0dXJib2MuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkM0X1BBVEglXEJJTlx0bGluay5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyA0LjUgMTYgYml0IFdpbmRvd3MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LXczMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzQ1LXczMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2YzE5OWYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM0NS13MzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIDQuNSBpbiAzMiBiaXQgV2luZG93cyBtb2RlLgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4zMlxCQzQ7JUJDNF9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMzJcQkM0OyVCQzRfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVCQzRfUEFUSCVcSU5DTFVERTsKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSwotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9MQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfQkM1PQotU0VUIFdJTjMyX0dVST0xCi1TRVQgVVNFX1NOQVA9Ci1TRVQgQkNfTElCQkFTRT1CQzQKLVBBVEggJVNDSVRFQ0hfQklOJTslQkM0X1BBVEglXEJJTjslREVGUEFUSCUlQkNfQ0RfUEFUSCUKLQotUkVNOiBFbmFibGUgV2luMzIgU0RLIGlmIGRlc2lyZWQgKHNkayBvbiBjb21tYW5kIGxpbmUpCi1pZiBOT1QgLiUxJT09LnNkayBnb3RvIGNyZWF0ZWZpbGVzCi1jYWxsIHdpbjMyc2RrLmJhdCBib3JsYW5kCi0KLTpjcmVhdGVmaWxlcwotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDNF9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDNF9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkM0X1BBVEglXEJJTlx0bGluazMyLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIDQuNSAzMiBiaXQgV2luZG93cyBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtYzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtYzMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmEwZmRlMi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLWMzMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgNS4wIGluIDMyIGJpdCBXaW5kb3dzIG1vZGUuCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXEJDNTslQkM1X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4zMlxCQzU7JUJDNV9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBDX0lOQ0xVREU9JUJDNV9QQVRIJVxJTkNMVURFCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVDX0lOQ0xVREUlCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMzIuTUsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPTEKLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1NNWDMyPQotU0VUIFVTRV9TTVgxNj0KLVNFVCBVU0VfQkM1PTEKLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgQkNfTElCQkFTRT1CQzUKLVBBVEggJVNDSVRFQ0hfQklOJTslQkM1X1BBVEglXEJJTjslREVGUEFUSCUlQkM1X0NEX1BBVEglCi0KLVJFTTogRW5hYmxlIFdpbjMyIFNESyBpZiBkZXNpcmVkIChzZGsgb24gY29tbWFuZCBsaW5lKQotaWYgTk9UIC4lMSU9PS5zZGsgZ290byBjcmVhdGVmaWxlcwotY2FsbCB3aW4zMnNkay5iYXQgYm9ybGFuZAotCi06Y3JlYXRlZmlsZXMKLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQzVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQzVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4gJUJDNV9QQVRIJVxCSU5cdGxpbmszMi5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyA1LjAgMzIgYml0IFdpbmRvd3MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLWQxNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLWQxNi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIzYjUwMzguLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC1kMTYuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIDUuMCBpbiAxNiBiaXQgbW9kZS4KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMTZcQkM1OyVCQzVfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzE2XEJDNTslQkM1X1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkM1X1BBVEglXElOQ0xVREU7Ci1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMTYuTUsKLVNFVCBVU0VfRFBNSTE2PQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfU01YMzI9Ci1TRVQgVVNFX1NNWDE2PQotU0VUIFVTRV9CQzU9MQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBCQ19MSUJCQVNFPUJDNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVCQzVfUEFUSCVcQklOOyVERUZQQVRIJSVCQzVfQ0RfUEFUSCUKLQotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDNV9QQVRIJVxCSU5cdHVyYm9jLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQzVfUEFUSCVcQklOXHR1cmJvYy5jZmcKLWVjaG8gLUwlTElCJSA+ICVCQzVfUEFUSCVcQklOXHRsaW5rLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIDUuMCAxNiBiaXQgRE9TIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC1kMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC1kMzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNTIxZjkzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtZDMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyA1LjAgaW4gMzIgYml0IG1vZGUuCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzMyXEJDNTslQkM1X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MzMlxCQzU7JUJDNV9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDNV9QQVRIJVxJTkNMVURFOwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCi1TRVQgVVNFX0RQTUkxNj0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfU01YMzI9Ci1TRVQgVVNFX1NNWDE2PQotU0VUIFVTRV9CQzU9MQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBCQ19MSUJCQVNFPUJDNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVCQzVfUEFUSCVcQklOOyVERUZQQVRIJSVCQzVfQ0RfUEFUSCUKLQotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkM1X1BBVEglXEJJTlx0bGluazMyLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIDUuMCAzMiBiaXQgRE9TIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwIChEUE1JMzIpLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC1zbXguYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC1zbXguYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMzI0MWZmLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtc214LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyA1LjAgaW4gMzIgYml0IG1vZGUuCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFNNWDMyXEJDNTslQkM1X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xTTVgzMlxCQzU7JUJDNV9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDNV9QQVRIJVxJTkNMVURFOwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCi1TRVQgVVNFX0RQTUkxNj0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfU01YMzI9MQotU0VUIFVTRV9TTVgxNj0KLVNFVCBVU0VfQkM1PTEKLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgQkNfTElCQkFTRT1CQzUKLVBBVEggJVNDSVRFQ0hfQklOJTslQkM1X1BBVEglXEJJTjslREVGUEFUSCUlQkM1X0NEX1BBVEglCi0KLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQzVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQzVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4gJUJDNV9QQVRIJVxCSU5cdGxpbmszMi5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyA1LjAgMzIgYml0IFNNWCBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cCAoU01YMzIpLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC1zbnAuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC1zbnAuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYjNhY2QyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtc25wLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyA1LjAgaW4gMzIgYml0IFdpbmRvd3MgbW9kZS4KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcU05BUFxCQzU7JUJDNV9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcU05BUFxCQzU7JUJDNV9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSwotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9TTVgzMj0KLVNFVCBVU0VfU01YMTY9Ci1TRVQgVVNFX0JDNT0xCi1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9TTkFQPTEKLVNFVCBCQ19MSUJCQVNFPUJDNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVCQzVfUEFUSCVcQklOOyVERUZQQVRIJSVCQzVfQ0RfUEFUSCUKLQotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkM1X1BBVEglXEJJTlx0bGluazMyLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIDUuMCBTbmFwIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC10bnQuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC10bnQuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZGNjMzcyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtdG50LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyA1LjAgaW4gMzIgYml0IG1vZGUgd2l0aCBQaGFyIExhcCBUTlQKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMzJcQkM1OyVCQzVfUEFUSCVcTElCOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzMyXEJDNTslQkM1X1BBVEglXExJQjslVE5UX1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkM1X1BBVEglXElOQ0xVREU7JVROVF9QQVRIJVxJTkNMVURFOwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCi1TRVQgVVNFX0RQTUkxNj0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX1ROVD0xCi1TRVQgVVNFX1NNWDMyPQotU0VUIFVTRV9TTVgxNj0KLVNFVCBVU0VfQkM1PTEKLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgQkNfTElCQkFTRT1CQzUKLVBBVEggJVNDSVRFQ0hfQklOJTslQkM1X1BBVEglXEJJTjslVE5UX1BBVEglXEJJTjslREVGUEFUSCUlQkNfQ0RfUEFUSCUKLQotUkVNIElmIHlvdSBzZXQgdGhlIGZvbGxvd2luZyB0byBhIDEsIGEgVE5UIERvc1N0eWxlIGFwcCB3aWxsIGJlIGNyZWF0ZWQuCi1SRU0gT3RoZXJ3aXNlIGEgVE5UIE50U3R5bGUgYXBwIHdpbGwgYmUgY3JlYXRlZC4gTnRTdHlsZSBhcHBzIHdpbGwgKm9ubHkqCi1SRU0gcnVuIHVuZGVyIHJlYWwgRE9TIHdoZW4gdXNpbmcgb3VyIGxpYnJhcmllcywgc2luY2Ugd2UgcmVxdWlyZSBhY2Nlc3MKLVJFTSB0byBmdW5jdGlvbnMgdGhhdCB0aGUgV2luMzIgQVBJIGRvZXMgbm90IHN1cHBvcnQgKHN1Y2ggYXMgZGlyZWN0IGFjY2VzcwotUkVNIHRvIHZpZGVvIG1lbW9yeSwgY2FsbGluZyBJbnQgMTBoIEJJT1MgZnVuY3Rpb25zIGV0YykuIERvc1N0eWxlIGFwcHMKLVJFTSB3aWxsIGhvd2V2ZXIgcnVuIGZpbmUgaW4gYm90aCBET1MgYW5kIGEgV2luOTUgRE9TIGJveCAoTlQgRE9TIGJveGVzIGRvbid0Ci1SRU0gd29yayB0b28gd2VsbCkuCi1SRU0KLVJFTSBJZiB5b3UgYXJlIHVzaW5nIHRoZSBSZWFsVGltZSBET1MgZXh0ZW5kZXIsIHlvdXIgYXBwcyAqbXVzdCogYmUgTnRTdHlsZSwKLVJFTSBhbmQgaGVuY2Ugd2lsbCBuZXZlciBiZSBhYmxlIHRvIHJ1biB1bmRlciBXaW45NSBvciBXaW5OVCwgb25seSBET1MuCi0KLVNFVCBET1NTVFlMRT0KLQotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkM1X1BBVEglXEJJTlx0bGluazMyLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIDUuMCAzMiBiaXQgRE9TIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwIChUTlQpLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC12eGQuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC12eGQuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMzU2OTExLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtdnhkLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyA1LjAgaW4gMzIgYml0IFdpbmRvd3MgbW9kZS4KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcVlhEXEJDNTslQkM1X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xWWERcQkM1OyVCQzVfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVCQzVfUEFUSCVcSU5DTFVERTsKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSwotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1ZYRD0xCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfU01YMzI9Ci1TRVQgVVNFX1NNWDE2PQotU0VUIFVTRV9CQzU9MQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBCQ19MSUJCQVNFPUJDNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVCQzVfUEFUSCVcQklOOyVERUZQQVRIJSVCQzVfQ0RfUEFUSCUKLQotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkM1X1BBVEglXEJJTlx0bGluazMyLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIDUuMCAzMiBiaXQgV2luZG93cyAoVnhEKSBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtdzE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtdzE2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2Q3OWQ4Ni4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLXcxNi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0gQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIDUuMCBpbiAxNiBiaXQgV2luZG93cyBtb2RlLgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4xNlxCQzU7JUJDNV9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMTZcQkM1OyVCQzVfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVCQzVfUEFUSCVcSU5DTFVERTsKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMxNi5NSwotU0VUIFVTRV9EUE1JMTY9Ci1TRVQgVVNFX1dJTjE2PTEKLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfQkM1PTEKLVNFVCBVU0VfU01YMzI9Ci1TRVQgVVNFX1NNWDE2PQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBCQ19MSUJCQVNFPUJDNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVCQzVfUEFUSCVcQklOOyVERUZQQVRIJSVCQzVfQ0RfUEFUSCUKLQotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDNV9QQVRIJVxCSU5cdHVyYm9jLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQzVfUEFUSCVcQklOXHR1cmJvYy5jZmcKLWVjaG8gLUwlTElCJSA+ICVCQzVfUEFUSCVcQklOXHRsaW5rLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIDUuMCAxNiBiaXQgV2luZG93cyBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtdzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAtdzMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGI4Y2VjOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iYzUwLXczMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgNS4wIGluIDMyIGJpdCBXaW5kb3dzIG1vZGUuCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXEJDNTslQkM1X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4zMlxCQzU7JUJDNV9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBDX0lOQ0xVREU9JUJDNV9QQVRIJVxJTkNMVURFCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVDX0lOQ0xVREUlCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMzIuTUsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPTEKLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1NNWDMyPQotU0VUIFVTRV9TTVgxNj0KLVNFVCBVU0VfQkM1PTEKLVNFVCBXSU4zMl9HVUk9MQotU0VUIFVTRV9TTkFQPQotU0VUIEJDX0xJQkJBU0U9QkM1Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDNV9QQVRIJVxCSU47JURFRlBBVEglJUJDNV9DRF9QQVRIJQotCi1SRU06IEVuYWJsZSBXaW4zMiBTREsgaWYgZGVzaXJlZCAoc2RrIG9uIGNvbW1hbmQgbGluZSkKLWlmIE5PVCAuJTElPT0uc2RrIGdvdG8gY3JlYXRlZmlsZXMKLWNhbGwgd2luMzJzZGsuYmF0IGJvcmxhbmQKLQotOmNyZWF0ZWZpbGVzCi1SRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKLWVjaG8gLUklSU5DTFVERSUgPiAlQkM1X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+PiAlQkM1X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+ICVCQzVfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCi0KLWVjaG8gQm9ybGFuZCBDKysgNS4wIDMyIGJpdCBXaW5kb3dzIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC14MTEuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmM1MC14MTEuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYmZlYjJlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjNTAteDExLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyA1LjAgaW4gMzIgYml0IFdpbmRvd3MgbW9kZS4KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcQkM1OyVCQzVfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXEJDNTslQkM1X1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkM1X1BBVEglXElOQ0xVREU7Ci1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMzIuTUsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPTEKLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1NNWDMyPQotU0VUIFVTRV9TTVgxNj0KLVNFVCBVU0VfQkM1PTEKLVNFVCBXSU4zMl9HVUk9MQotU0VUIFVTRV9TTkFQPQotU0VUIEJDX0xJQkJBU0U9QkM1Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDNV9QQVRIJVxCSU47JURFRlBBVEglJUJDNV9DRF9QQVRIJQotCi1SRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKLWVjaG8gLUklSU5DTFVERSUgPiAlQkM1X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+PiAlQkM1X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+ICVCQzVfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCi0KLWVjaG8gQm9ybGFuZCBDKysgNS4wIDMyIGJpdCBXaW5kb3dzIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS1jMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS1jMzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZTA5NDI4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtYzMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyBCdWlsZGVyIDUuMCBpbiAzMiBiaXQgV2luZG93cyBtb2RlLgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4zMlxCQ0I1OyVCQ0I1X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4zMlxCQ0I1OyVCQ0I1X1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIENfSU5DTFVERT0lQkNCNV9QQVRIJVxJTkNMVURFCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVDX0lOQ0xVREUlCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMzIuTUsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPTEKLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1NNWDMyPQotU0VUIFVTRV9TTVgxNj0KLVNFVCBVU0VfQkM1PTEKLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgQkNfTElCQkFTRT1CQzUKLVBBVEggJVNDSVRFQ0hfQklOJTslQkNCNV9QQVRIJVxCSU47JURFRlBBVEglJUJDNV9DRF9QQVRIJQotCi1SRU06IEVuYWJsZSBXaW4zMiBTREsgaWYgZGVzaXJlZCAoc2RrIG9uIGNvbW1hbmQgbGluZSkKLWlmIE5PVCAuJTElPT0uc2RrIGdvdG8gY3JlYXRlZmlsZXMKLWNhbGwgd2luMzJzZGsuYmF0IGJvcmxhbmQKLQotOmNyZWF0ZWZpbGVzCi1SRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKLWVjaG8gLUklSU5DTFVERSUgPiAlQkNCNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDQjVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4gJUJDQjVfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCi0KLWVjaG8gQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgMzIgYml0IFdpbmRvd3MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LWQxNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LWQxNi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFhMTNlN2QuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS1kMTYuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIEJ1aWxkZXIgNS4wIGluIDE2IGJpdCBtb2RlLgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MxNlxCQ0I1OyVCQ0I1X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MxNlxCQ0I1OyVCQ0I1X1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkNCNV9QQVRIJVxJTkNMVURFOwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzE2Lk1LCi1TRVQgVVNFX0RQTUkxNj0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX1NNWDMyPQotU0VUIFVTRV9TTVgxNj0KLVNFVCBVU0VfQkM1PTEKLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgQkNfTElCQkFTRT1CQzUKLVBBVEggJVNDSVRFQ0hfQklOJTslQkNCNV9QQVRIJVxCSU47JURFRlBBVEglJUJDNV9DRF9QQVRIJQotCi1SRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKLWVjaG8gLUklSU5DTFVERSUgPiAlQkNCNV9QQVRIJVxCSU5cdHVyYm9jLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQ0I1X1BBVEglXEJJTlx0dXJib2MuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkNCNV9QQVRIJVxCSU5cdGxpbmsuY2ZnCi0KLWVjaG8gQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgMTYgYml0IERPUyBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtZDMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtZDMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDAwMTdkNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LWQzMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgaW4gMzIgYml0IG1vZGUuCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzMyXEJDQjU7JUJDQjVfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzMyXEJDQjU7JUJDQjVfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVCQ0I1X1BBVEglXElOQ0xVREU7Ci1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXEJDMzIuTUsKLVNFVCBVU0VfRFBNSTE2PQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9TTVgzMj0KLVNFVCBVU0VfU01YMTY9Ci1TRVQgVVNFX0JDNT0xCi1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIEJDX0xJQkJBU0U9QkM1Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDQjVfUEFUSCVcQklOOyVERUZQQVRIJSVCQzVfQ0RfUEFUSCUKLQotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDQjVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQ0I1X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+ICVCQ0I1X1BBVEglXEJJTlx0bGluazMyLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIEJ1aWxkZXIgNS4wIDMyIGJpdCBET1MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAgKERQTUkzMikuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXNteC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXNteC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiOTY5YTkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS1zbXguYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEJvcmxhbmQgQysrIEJ1aWxkZXIgNS4wIGluIDMyIGJpdCBtb2RlLgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxTTVgzMlxCQ0I1OyVCQ0I1X1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xTTVgzMlxCQ0I1OyVCQ0I1X1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkNCNV9QQVRIJVxJTkNMVURFOwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCi1TRVQgVVNFX0RQTUkxNj0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfU01YMzI9MQotU0VUIFVTRV9TTVgxNj0KLVNFVCBVU0VfQkM1PTEKLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgQkNfTElCQkFTRT1CQzUKLVBBVEggJVNDSVRFQ0hfQklOJTslQkNCNV9QQVRIJVxCSU47JURFRlBBVEglJUJDNV9DRF9QQVRIJQotCi1SRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKLWVjaG8gLUklSU5DTFVERSUgPiAlQkNCNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDQjVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4gJUJDQjVfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCi0KLWVjaG8gQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgMzIgYml0IFNNWCBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cCAoU01YMzIpLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS1zbnAuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS1zbnAuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkN2I4ZmYyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtc25wLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyBCdWlsZGVyIDUuMCBpbiAzMiBiaXQgV2luZG93cyBtb2RlLgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxTTkFQXEJDQjU7JUJDQjVfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFNOQVBcQkNCNTslQkNCNV9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSwotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9TTVgzMj0KLVNFVCBVU0VfU01YMTY9Ci1TRVQgVVNFX0JDNT0xCi1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9TTkFQPTEKLVNFVCBCQ19MSUJCQVNFPUJDNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVCQ0I1X1BBVEglXEJJTjslREVGUEFUSCUlQkM1X0NEX1BBVEglCi0KLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQ0I1X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+PiAlQkNCNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkNCNV9QQVRIJVxCSU5cdGxpbmszMi5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyBCdWlsZGVyIDUuMCBTbmFwIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS10bnQuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS10bnQuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZGUzNjAxLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtdG50LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBCb3JsYW5kIEMrKyBCdWlsZGVyIDUuMCBpbiAzMiBiaXQgbW9kZSB3aXRoIFBoYXIgTGFwIFROVAotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MzMlxCQ0I1OyVCQ0I1X1BBVEglXExJQjslVE5UX1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MzMlxCQ0I1OyVCQ0I1X1BBVEglXExJQjslVE5UX1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkNCNV9QQVRIJVxJTkNMVURFOyVUTlRfUEFUSCVcSU5DTFVERTsKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSwotU0VUIFVTRV9EUE1JMTY9Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9UTlQ9MQotU0VUIFVTRV9TTVgzMj0KLVNFVCBVU0VfU01YMTY9Ci1TRVQgVVNFX0JDNT0xCi1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIEJDX0xJQkJBU0U9QkM1Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDQjVfUEFUSCVcQklOOyVUTlRfUEFUSCVcQklOOyVERUZQQVRIJSVCQ19DRF9QQVRIJQotCi1SRU0gSWYgeW91IHNldCB0aGUgZm9sbG93aW5nIHRvIGEgMSwgYSBUTlQgRG9zU3R5bGUgYXBwIHdpbGwgYmUgY3JlYXRlZC4KLVJFTSBPdGhlcndpc2UgYSBUTlQgTnRTdHlsZSBhcHAgd2lsbCBiZSBjcmVhdGVkLiBOdFN0eWxlIGFwcHMgd2lsbCAqb25seSoKLVJFTSBydW4gdW5kZXIgcmVhbCBET1Mgd2hlbiB1c2luZyBvdXIgbGlicmFyaWVzLCBzaW5jZSB3ZSByZXF1aXJlIGFjY2VzcwotUkVNIHRvIGZ1bmN0aW9ucyB0aGF0IHRoZSBXaW4zMiBBUEkgZG9lcyBub3Qgc3VwcG9ydCAoc3VjaCBhcyBkaXJlY3QgYWNjZXNzCi1SRU0gdG8gdmlkZW8gbWVtb3J5LCBjYWxsaW5nIEludCAxMGggQklPUyBmdW5jdGlvbnMgZXRjKS4gRG9zU3R5bGUgYXBwcwotUkVNIHdpbGwgaG93ZXZlciBydW4gZmluZSBpbiBib3RoIERPUyBhbmQgYSBXaW45NSBET1MgYm94IChOVCBET1MgYm94ZXMgZG9uJ3QKLVJFTSB3b3JrIHRvbyB3ZWxsKS4KLVJFTQotUkVNIElmIHlvdSBhcmUgdXNpbmcgdGhlIFJlYWxUaW1lIERPUyBleHRlbmRlciwgeW91ciBhcHBzICptdXN0KiBiZSBOdFN0eWxlLAotUkVNIGFuZCBoZW5jZSB3aWxsIG5ldmVyIGJlIGFibGUgdG8gcnVuIHVuZGVyIFdpbjk1IG9yIFdpbk5ULCBvbmx5IERPUy4KLQotU0VUIERPU1NUWUxFPQotCi1SRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKLWVjaG8gLUklSU5DTFVERSUgPiAlQkNCNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDQjVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4gJUJDQjVfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCi0KLWVjaG8gQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgMzIgYml0IERPUyBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cCAoVE5UKS4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtdnhkLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtdnhkLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjhkZTU4Yy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXZ4ZC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgaW4gMzIgYml0IFdpbmRvd3MgbW9kZS4KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcVlhEXEJDQjU7JUJDQjVfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFZYRFxCQ0I1OyVCQ0I1X1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQkNCNV9QQVRIJVxJTkNMVURFOwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfVlhEPTEKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9TTVgzMj0KLVNFVCBVU0VfU01YMTY9Ci1TRVQgVVNFX0JDNT0xCi1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIEJDX0xJQkJBU0U9QkM1Ci1QQVRIICVTQ0lURUNIX0JJTiU7JUJDQjVfUEFUSCVcQklOOyVERUZQQVRIJSVCQzVfQ0RfUEFUSCUKLQotUkVNOiBDcmVhdGUgQm9ybGFuZCBjb21waWxlL2xpbmsgY29uZmlndXJhdGlvbiBzY3JpcHRzCi1lY2hvIC1JJUlOQ0xVREUlID4gJUJDQjVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4+ICVCQ0I1X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+ICVCQ0I1X1BBVEglXEJJTlx0bGluazMyLmNmZwotCi1lY2hvIEJvcmxhbmQgQysrIEJ1aWxkZXIgNS4wIDMyIGJpdCBXaW5kb3dzIChWeEQpIGNvbXBpbGF0aW9uIGNvbmZpZ3VyYXRpb24gc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS13MTYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYmNiNS13MTYuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMzBkMDA0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtdzE2LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSBAZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgaW4gMTYgYml0IFdpbmRvd3MgbW9kZS4KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMTZcQkNCNTslQkNCNV9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMTZcQkNCNTslQkNCNV9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDQjVfUEFUSCVcSU5DTFVERTsKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMxNi5NSwotU0VUIFVTRV9EUE1JMTY9Ci1TRVQgVVNFX1dJTjE2PTEKLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfQkM1PTEKLVNFVCBVU0VfU01YMzI9Ci1TRVQgVVNFX1NNWDE2PQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBCQ19MSUJCQVNFPUJDNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVCQ0I1X1BBVEglXEJJTjslREVGUEFUSCUlQkM1X0NEX1BBVEglCi0KLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQ0I1X1BBVEglXEJJTlx0dXJib2MuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDQjVfUEFUSCVcQklOXHR1cmJvYy5jZmcKLWVjaG8gLUwlTElCJSA+ICVCQ0I1X1BBVEglXEJJTlx0bGluay5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyBCdWlsZGVyIDUuMCAxNiBiaXQgV2luZG93cyBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtdzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUtdzMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTg3NjBlMS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXczMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgaW4gMzIgYml0IFdpbmRvd3MgbW9kZS4KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcQkNCNTslQkNCNV9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMzJcQkNCNTslQkNCNV9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBDX0lOQ0xVREU9JUJDQjVfUEFUSCVcSU5DTFVERQotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQ19JTkNMVURFJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xCQzMyLk1LCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0xCi1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9TTVgzMj0KLVNFVCBVU0VfU01YMTY9Ci1TRVQgVVNFX0JDNT0xCi1TRVQgV0lOMzJfR1VJPTEKLVNFVCBVU0VfU05BUD0KLVNFVCBCQ19MSUJCQVNFPUJDNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVCQ0I1X1BBVEglXEJJTjslREVGUEFUSCUlQkM1X0NEX1BBVEglCi0KLVJFTTogRW5hYmxlIFdpbjMyIFNESyBpZiBkZXNpcmVkIChzZGsgb24gY29tbWFuZCBsaW5lKQotaWYgTk9UIC4lMSU9PS5zZGsgZ290byBjcmVhdGVmaWxlcwotY2FsbCB3aW4zMnNkay5iYXQgYm9ybGFuZAotCi06Y3JlYXRlZmlsZXMKLVJFTTogQ3JlYXRlIEJvcmxhbmQgY29tcGlsZS9saW5rIGNvbmZpZ3VyYXRpb24gc2NyaXB0cwotZWNobyAtSSVJTkNMVURFJSA+ICVCQ0I1X1BBVEglXEJJTlxiY2MzMi5jZmcKLWVjaG8gLUwlTElCJSA+PiAlQkNCNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPiAlQkNCNV9QQVRIJVxCSU5cdGxpbmszMi5jZmcKLQotZWNobyBCb3JsYW5kIEMrKyBCdWlsZGVyIDUuMCAzMiBiaXQgV2luZG93cyBjb21waWxhdGlvbiBjb25maWd1cmF0aW9uIHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUteDExLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2JjYjUteDExLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTk4YzFhMi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9iY2I1LXgxMS5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgaW4gMzIgYml0IFdpbmRvd3MgbW9kZS4KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcQkNCNTslQkNCNV9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMzJcQkNCNTslQkNCNV9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUJDQjVfUEFUSCVcSU5DTFVERTsKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcQkMzMi5NSwotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9MQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfU01YMzI9Ci1TRVQgVVNFX1NNWDE2PQotU0VUIFVTRV9CQzU9MQotU0VUIFdJTjMyX0dVST0xCi1TRVQgVVNFX1NOQVA9Ci1TRVQgQkNfTElCQkFTRT1CQzUKLVBBVEggJVNDSVRFQ0hfQklOJTslQkNCNV9QQVRIJVxCSU47JURFRlBBVEglJUJDNV9DRF9QQVRIJQotCi1SRU06IENyZWF0ZSBCb3JsYW5kIGNvbXBpbGUvbGluayBjb25maWd1cmF0aW9uIHNjcmlwdHMKLWVjaG8gLUklSU5DTFVERSUgPiAlQkNCNV9QQVRIJVxCSU5cYmNjMzIuY2ZnCi1lY2hvIC1MJUxJQiUgPj4gJUJDQjVfUEFUSCVcQklOXGJjYzMyLmNmZwotZWNobyAtTCVMSUIlID4gJUJDQjVfUEFUSCVcQklOXHRsaW5rMzIuY2ZnCi0KLWVjaG8gQm9ybGFuZCBDKysgQnVpbGRlciA1LjAgMzIgYml0IFdpbmRvd3MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9idWlsZCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2J1aWxkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZjE5NzNkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2J1aWxkCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi1pZiBbICQjIC1sdCAxIF0gfHwgKCBbICIkMSIgIT0gZ2NjLWxpbnV4IF0gJiYgWyAiJDEiICE9IHFueDQgXSApIDsgdGhlbgotCWVjaG8gVXNhZ2U6ICQwIGNvbXBpbGVyX25hbWUgW0RNQUtFIGNvbW1hbmRzXQotCWVjaG8KLQllY2hvIEN1cnJlbnQgY29tcGlsZXJzOgotCWVjaG8gIiAgZ2NjLWxpbnV4ICAtIEdOVSBDL0MrKyAyLjcgb3IgaGlnaGVyLCAzMiBiaXQiCi0JZWNobyAiICBxbng0ICAtIFdhdGNvbSBDL0MrKyAxMC42IG9yIGhpZ2hlciwgMzIgYml0IgotCWV4aXQgMQotZmkKLQotdW5zZXQgREJHIE9QVCBPUFRfU0laRSBCVUlMRF9ETEwgSU1QT1JUX0RMTCBGUFUgQ0hFQ0tTIEJFVEEKLS4gJHsxfS5zaAotCi1zaGlmdAotZG1ha2UgJCogJiYgZXhpdCAwCi0KLWVjaG8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotZWNobyAqIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGJ1aWxkaW5nIHRoZSBsaWJyYXJ5LiAqCi1lY2hvICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLWV4aXQgMQotCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9idWlsZC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9idWlsZC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVlMjkwOTMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYnVpbGQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1AZWNobyBvZmYKLXJlbSBEaXNhYmxlIGNoZWNrZWQgYnVpbGQgYW5kIGJ1aWxkIHJlbGVhc2UgY29kZQotc2V0IENIRUNLRUQ9Ci1jYWxsIGJ1aWxkX2l0LmJhdCAlMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYnVpbGRfZGIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYnVpbGRfZGIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYjMyNTI5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2J1aWxkX2RiLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotQGVjaG8gb2ZmCi1yZW0gRW5hYmxlIGNoZWNrZWQgYnVpbGQgYW5kIGJ1aWxkIGRlYnVnIGNvZGUKLXNldCBDSEVDS0VEPTEKLWNhbGwgYnVpbGRfaXQuYmF0ICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9idWlsZF9pdC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9idWlsZF9pdC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVhNjE5YjQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vYnVpbGRfaXQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNDMyICswLDAgQEAKLUBlY2hvIG9mZgotcmVtIEdlbmVyaWMgYmF0Y2ggZmlsZSB0byBidWlsZCBhIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuIFRoaXMgYmF0Y2ggZmlsZQotcmVtIGFzc3VtZXMgdGhhdCB0aGUgY29ycmVjdCBiYXRjaCBmaWxlcyBleGlzdCB0byBzZXR1cCB0aGUgYXBwcm9wcmlhdGUKLXJlbSBjb21waWxhdGlvbiBlbnZpcm9ubWVudHMsIGFuZCB0aGF0IHRoZSBETUFLRS5FWEUgcHJvZ3JhbSBpcyBhdmFpbGFibGUKLXJlbSBzb21ld2hlcmUgb24gdGhlIHBhdGguCi1yZW0KLXJlbSBCdWlsZHMgYXMgcmVsZWFzZSBvciBkZWJ1ZyBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHRoZSBDSEVDS0VECi1yZW0gZW52aXJvbm1lbnQgdmFyaWFibGUuCi0KLXJlbSBVbnNldCBhbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgY2hhbmdlIHRoZSBjb21waWxlIHByb2Nlc3MKLXNldCBEQkc9Ci1zZXQgT1BUPQotc2V0IE9QVF9TSVpFPQotc2V0IEJVSUxEX0RMTD0KLXNldCBJTVBPUlRfRExMPQotc2V0IEZQVT0KLXNldCBDSEVDS1M9Ci1zZXQgQkVUQT0KLQotaWYgJTE9PWJjMzEtZDE2IGdvdG8gYmMzMS1kMTYKLWlmICUxPT1iYzQ1LWQxNiBnb3RvIGJjNDUtZDE2Ci1pZiAlMT09YmM0NS1kMzIgZ290byBiYzQ1LWQzMgotaWYgJTE9PWJjNDUtdG50IGdvdG8gYmM0NS10bnQKLWlmICUxPT1iYzQ1LXcxNiBnb3RvIGJjNDUtdzE2Ci1pZiAlMT09YmM0NS13MzIgZ290byBiYzQ1LXczMgotaWYgJTE9PWJjNDUtYzMyIGdvdG8gYmM0NS1jMzIKLWlmICUxPT1iYzQ1LXZ4ZCBnb3RvIGJjNDUtdnhkCi1pZiAlMT09YmM0NS1zbnAgZ290byBiYzQ1LXNucAotaWYgJTE9PWJjNTAtZDE2IGdvdG8gYmM1MC1kMTYKLWlmICUxPT1iYzUwLWQzMiBnb3RvIGJjNTAtZDMyCi1pZiAlMT09YmM1MC10bnQgZ290byBiYzUwLXRudAotaWYgJTE9PWJjNTAtdzE2IGdvdG8gYmM1MC13MTYKLWlmICUxPT1iYzUwLXczMiBnb3RvIGJjNTAtdzMyCi1pZiAlMT09YmM1MC1jMzIgZ290byBiYzUwLWMzMgotaWYgJTE9PWJjNTAtdnhkIGdvdG8gYmM1MC12eGQKLWlmICUxPT1iYzUwLXNucCBnb3RvIGJjNTAtc25wCi1pZiAlMT09Z2NjMi1kMzIgZ290byBnY2MyLWQzMgotaWYgJTE9PWdjYzItdzMyIGdvdG8gZ2NjMi13MzIKLWlmICUxPT1nY2MyLWMzMiBnb3RvIGdjYzItYzMyCi1pZiAlMT09Z2NjMi1saW51eCBnb3RvIGdjYzItbGludXgKLWlmICUxPT12YzQwLWQxNiBnb3RvIHZjNDAtZDE2Ci1pZiAlMT09dmM0MC10bnQgZ290byB2YzQwLXRudAotaWYgJTE9PXZjNDAtdzE2IGdvdG8gdmM0MC13MTYKLWlmICUxPT12YzQwLXczMiBnb3RvIHZjNDAtdzMyCi1pZiAlMT09dmM0MC1jMzIgZ290byB2YzQwLWMzMgotaWYgJTE9PXZjNDAtZHJ2OXggZ290byB2YzQwLWRydjl4Ci1pZiAlMT09dmM0MC1kcnZudCBnb3RvIHZjNDAtZHJ2bnQKLWlmICUxPT12YzQwLXJ0dCBnb3RvIHZjNDAtcnR0Ci1pZiAlMT09dmM0MC1zbnAgZ290byB2YzQwLXNucAotaWYgJTE9PXZjNTAtZDE2IGdvdG8gdmM1MC1kMTYKLWlmICUxPT12YzUwLXRudCBnb3RvIHZjNTAtdG50Ci1pZiAlMT09dmM1MC13MTYgZ290byB2YzUwLXcxNgotaWYgJTE9PXZjNTAtdzMyIGdvdG8gdmM1MC13MzIKLWlmICUxPT12YzUwLWMzMiBnb3RvIHZjNTAtYzMyCi1pZiAlMT09dmM1MC1kcnY5eCBnb3RvIHZjNTAtZHJ2OXgKLWlmICUxPT12YzUwLWRydm50IGdvdG8gdmM1MC1kcnZudAotaWYgJTE9PXZjNTAtcnR0IGdvdG8gdmM1MC1ydHQKLWlmICUxPT12YzUwLXNucCBnb3RvIHZjNTAtc25wCi1pZiAlMT09dmM2MC1kMTYgZ290byB2YzYwLWQxNgotaWYgJTE9PXZjNjAtdG50IGdvdG8gdmM2MC10bnQKLWlmICUxPT12YzYwLXcxNiBnb3RvIHZjNjAtdzE2Ci1pZiAlMT09dmM2MC13MzIgZ290byB2YzYwLXczMgotaWYgJTE9PXZjNjAtYzMyIGdvdG8gdmM2MC1jMzIKLWlmICUxPT12YzYwLWRydjl4IGdvdG8gdmM2MC1kcnY5eAotaWYgJTE9PXZjNjAtZHJ2bnQgZ290byB2YzYwLWRydm50Ci1pZiAlMT09dmM2MC1kcnZ3MmsgZ290byB2YzYwLWRydncyawotaWYgJTE9PXZjNjAtcnR0IGdvdG8gdmM2MC1ydHQKLWlmICUxPT12YzYwLXNucCBnb3RvIHZjNjAtc25wCi1pZiAlMT09d2MxMGFkMTYgZ290byB3YzEwYWQxNgotaWYgJTE9PXdjMTBhZDMyIGdvdG8gd2MxMGFkMzIKLWlmICUxPT13YzEwYXRudCBnb3RvIHdjMTBhdG50Ci1pZiAlMT09d2MxMGF3MTYgZ290byB3YzEwYXcxNgotaWYgJTE9PXdjMTBhdzMyIGdvdG8gd2MxMGF3MzIKLWlmICUxPT13YzEwYWMzMiBnb3RvIHdjMTBhYzMyCi1pZiAlMT09d2MxMGFvMzIgZ290byB3YzEwYW8zMgotaWYgJTE9PXdjMTBhcDMyIGdvdG8gd2MxMGFwMzIKLWlmICUxPT13YzEwYXNucCBnb3RvIHdjMTBhc25wCi1pZiAlMT09d2MxMC1kMTYgZ290byB3YzEwLWQxNgotaWYgJTE9PXdjMTAtZDMyIGdvdG8gd2MxMC1kMzIKLWlmICUxPT13YzEwLXRudCBnb3RvIHdjMTAtdG50Ci1pZiAlMT09d2MxMC13MTYgZ290byB3YzEwLXcxNgotaWYgJTE9PXdjMTAtdzMyIGdvdG8gd2MxMC13MzIKLWlmICUxPT13YzEwLWMzMiBnb3RvIHdjMTAtYzMyCi1pZiAlMT09d2MxMC1vMzIgZ290byB3YzEwLW8zMgotaWYgJTE9PXdjMTAtcDMyIGdvdG8gd2MxMC1wMzIKLWlmICUxPT13YzEwLXNucCBnb3RvIHdjMTAtc25wCi1pZiAlMT09d2MxMS1kMTYgZ290byB3YzExLWQxNgotaWYgJTE9PXdjMTEtZDMyIGdvdG8gd2MxMS1kMzIKLWlmICUxPT13YzExLXRudCBnb3RvIHdjMTEtdG50Ci1pZiAlMT09d2MxMS13MTYgZ290byB3YzExLXcxNgotaWYgJTE9PXdjMTEtdzMyIGdvdG8gd2MxMS13MzIKLWlmICUxPT13YzExLWMzMiBnb3RvIHdjMTEtYzMyCi1pZiAlMT09d2MxMS1vMzIgZ290byB3YzExLW8zMgotaWYgJTE9PXdjMTEtcDMyIGdvdG8gd2MxMS1wMzIKLWlmICUxPT13YzExLXNucCBnb3RvIHdjMTEtc25wCi0KLWVjaG8gVXNhZ2U6IEJVSUxEICdjb21waWxlcl9uYW1lJyBbRE1BS0UgY29tbWFuZHNdCi1lY2hvLgotZWNobyBXaGVyZSAnY29tcGlsZXJfbmFtZScgaXMgb2YgdGhlIGZvcm0gY29tcC1vcywgd2hlcmUKLWVjaG8gJ2NvbXAnIGRlZmluZXMgdGhlIGNvbXBpbGVyIGFuZCAnb3MnIGRlZmluZXMgdGhlIE9TIGVudmlyb25tZW50LgotZWNobyBGb3IgaW5zdGFuY2UgJ2JjNTAtdzMyJyBpcyBmb3IgQm9ybGFuZCBDKysgNS4wIGZvciBXaW4zMi4KLWVjaG8gVGhlIHZhbHVlIG9mICdjb21wJyBjYW4gYmUgYW55IG9mIHRoZSBmb2xsb3dpbmc6Ci1lY2hvLgotZWNobyAgICBiYzQ1IC0gQm9ybGFuZCBDKysgNC41eAotZWNobyAgICBiYzUwIC0gQm9ybGFuZCBDKysgNS54Ci1lY2hvICAgIHZjNDAgLSBWaXN1YWwgQysrIDQueAotZWNobyAgICB2YzUwIC0gVmlzdWFsIEMrKyA1LngKLWVjaG8gICAgdmM2MCAtIFZpc3VhbCBDKysgNi54Ci1lY2hvICAgIHdjMTAgLSBXYXRjb20gQysrIDEwLjYKLWVjaG8gICAgd2MxMSAtIFdhdGNvbSBDKysgMTEuMAotZWNobyAgICBnY2MyIC0gR05VIEMvQysrIDIuOXgKLWVjaG8uCi1lY2hvIFRoZSB2YWx1ZSBvZiAnb3MnIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLWVjaG8uCi1lY2hvICAgIGQxNiAgIC0gMTYtYml0IERPUwotZWNobyAgICBkMzIgICAtIDMyLWJpdCBET1MKLWVjaG8gICAgdzE2ICAgLSAxNi1iaXQgV2luZG93cyBHVUkgbW9kZQotZWNobyAgICBjMzIgICAtIDMyLWJpdCBXaW5kb3dzIGNvbnNvbGUgbW9kZQotZWNobyAgICB3MzIgICAtIDMyLWJpdCBXaW5kb3dzIEdVSSBtb2RlCi1lY2hvICAgIG8xNiAgIC0gMTYtYml0IE9TLzIgY29uc29sZSBtb2RlCi1lY2hvICAgIG8zMiAgIC0gMzItYml0IE9TLzIgY29uc29sZSBtb2RlCi1lY2hvICAgIHAzMiAgIC0gMzItYml0IE9TLzIgUHJlc2VudGF0aW9uIE1hbmFnZXIKLWVjaG8gICAgc25wICAgLSAzMi1iaXQgU2NpVGVjaCBTbmFwIGFwcGxpY2F0aW9uCi1lY2hvICAgIGxpbnV4IC0gMzItYml0IExpbnV4IGFwcGxpY2F0aW9uCi1nb3RvIGVuZAotCi1yZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcmVtIFNldHVwIGZvciB0aGUgc3BlY2lmaWVkIGNvbXBpbGVyCi0KLTpiYzMxLWQxNgotY2FsbCBiYzMxLWQxNi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpiYzQ1LWQxNgotY2FsbCBiYzQ1LWQxNi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpiYzQ1LWQzMgotY2FsbCBiYzQ1LWQzMi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpiYzQ1LXRudAotY2FsbCBiYzQ1LXRudC5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpiYzQ1LXcxNgotY2FsbCBiYzQ1LXcxNi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpiYzQ1LXczMgotY2FsbCBiYzQ1LXczMi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpiYzQ1LWMzMgotY2FsbCBiYzQ1LWMzMi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpiYzQ1LXZ4ZAotY2FsbCBiYzQ1LXZ4ZC5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpiYzUwLWQxNgotY2FsbCBiYzUwLWQxNi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpiYzUwLWQzMgotY2FsbCBiYzUwLWQzMi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpiYzUwLXRudAotY2FsbCBiYzUwLXRudC5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpiYzUwLXcxNgotY2FsbCBiYzUwLXcxNi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpiYzUwLXczMgotY2FsbCBiYzUwLXczMi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpiYzUwLWMzMgotY2FsbCBiYzUwLWMzMi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpiYzUwLXZ4ZAotY2FsbCBiYzUwLXZ4ZC5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpnY2MyLWQzMgotY2FsbCBnY2MyLWQzMi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpnY2MyLXczMgotY2FsbCBnY2MyLXczMi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpnY2MyLWMzMgotY2FsbCBnY2MyLWMzMi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTpnY2MyLWxpbnV4Ci1jYWxsIGdjYzItbGludXguYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06c2M3MC1kMTYKLWNhbGwgc2M3MC1kMTYuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06c2M3MC13MTYKLWNhbGwgc2M3MC13MTYuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06c2M3MC10bnQKLWNhbGwgc2M3MC10bnQuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06c2M3MC13MzIKLWNhbGwgc2M3MC13MzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06c2M3MC1jMzIKLWNhbGwgc2M3MC1jMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06dmM0MC1kMTYKLWNhbGwgdmM0MC1kMTYuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06dmM0MC10bnQKLWNhbGwgdmM0MC10bnQuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06dmM0MC13MTYKLWNhbGwgdmM0MC13MTYuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06dmM0MC13MzIKLWNhbGwgdmM0MC13MzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06dmM0MC1jMzIKLWNhbGwgdmM0MC1jMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06dmM0MC1kcnY5eAotY2FsbCB2YzQwLWRydjl4LmJhdAotZ290byBjb21waWxlaXQKLQotOnZjNDAtZHJ2bnQKLWNhbGwgdmM0MC1kcnZudC5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTp2YzQwLXJ0dAotY2FsbCB2YzQwLXJ0dC5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTp2YzUwLWQxNgotY2FsbCB2YzUwLWQxNi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTp2YzUwLXRudAotY2FsbCB2YzUwLXRudC5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTp2YzUwLXcxNgotY2FsbCB2YzUwLXcxNi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTp2YzUwLXczMgotY2FsbCB2YzUwLXczMi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTp2YzUwLWMzMgotY2FsbCB2YzUwLWMzMi5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTp2YzUwLWRydjl4Ci1jYWxsIHZjNTAtZHJ2OXguYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06dmM1MC1kcnZudAotY2FsbCB2YzUwLWRydm50LmJhdAotZ290byBjb21waWxlaXQKLQotOnZjNTAtcnR0Ci1jYWxsIHZjNTAtcnR0LmJhdAotZ290byBjb21waWxlaXQKLQotOnZjNjAtZDE2Ci1jYWxsIHZjNjAtZDE2LmJhdAotZ290byBjb21waWxlaXQKLQotOnZjNjAtdG50Ci1jYWxsIHZjNjAtdG50LmJhdAotZ290byBjb21waWxlaXQKLQotOnZjNjAtdzE2Ci1jYWxsIHZjNjAtdzE2LmJhdAotZ290byBjb21waWxlaXQKLQotOnZjNjAtdzMyCi1jYWxsIHZjNjAtdzMyLmJhdAotZ290byBjb21waWxlaXQKLQotOnZjNjAtYzMyCi1jYWxsIHZjNjAtYzMyLmJhdAotZ290byBjb21waWxlaXQKLQotOnZjNjAtZHJ2OXgKLWNhbGwgdmM2MC1kcnY5eC5iYXQKLWdvdG8gY29tcGlsZWl0Ci0KLTp2YzYwLWRydm50Ci1jYWxsIHZjNjAtZHJ2bnQuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06dmM2MC1kcnZ3MmsKLWNhbGwgdmM2MC1kcnZ3MmsuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06dmM2MC1ydHQKLWNhbGwgdmM2MC1ydHQuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMGFkMTYKLWNhbGwgd2MxMGFkMTYuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMGFkMzIKLWNhbGwgd2MxMGFkMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMGF0bnQKLWNhbGwgd2MxMGF0bnQuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMGF3MTYKLWNhbGwgd2MxMGF3MTYuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMGF3MzIKLWNhbGwgd2MxMGF3MzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMGFjMzIKLWNhbGwgd2MxMGFjMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMGFvMzIKLWNhbGwgd2MxMGFvMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMGFwMzIKLWNhbGwgd2MxMGFwMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMC1kMTYKLWNhbGwgd2MxMC1kMTYuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMC1kMzIKLWNhbGwgd2MxMC1kMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMC10bnQKLWNhbGwgd2MxMC10bnQuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMC13MTYKLWNhbGwgd2MxMC13MTYuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMC13MzIKLWNhbGwgd2MxMC13MzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMC1jMzIKLWNhbGwgd2MxMC1jMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMC1vMzIKLWNhbGwgd2MxMC1vMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMC1wMzIKLWNhbGwgd2MxMC1wMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMS1kMTYKLWNhbGwgd2MxMS1kMTYuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMS1kMzIKLWNhbGwgd2MxMS1kMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMS10bnQKLWNhbGwgd2MxMS10bnQuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMS13MTYKLWNhbGwgd2MxMS13MTYuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMS13MzIKLWNhbGwgd2MxMS13MzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMS1jMzIKLWNhbGwgd2MxMS1jMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMS1vMzIKLWNhbGwgd2MxMS1vMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06d2MxMS1wMzIKLWNhbGwgd2MxMS1wMzIuYmF0Ci1nb3RvIGNvbXBpbGVpdAotCi06Y29tcGlsZWl0Ci1rX3JtIC1mICoubGliICouYQotZG1ha2UgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkKLWlmIGVycm9ybGV2ZWwgMSBnb3RvIGVycm9yZW5kCi1nb3RvIGVuZAotCi06ZXJyb3JlbmQKLWVjaG8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotZWNobyAqIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGJ1aWxkaW5nIHRoZSBsaWJyYXJ5LiAqCi1lY2hvICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTplbmQKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2NkZHJ2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2NkZHJ2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjY0ZjRkNy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9jZGRydi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUBlY2hvIG9mZgotJTEKLWNkICUzCi0lNCAlNSAlNiAlNyAlOCAlOQotJTIKLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vY2RpdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2NkaXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIyMjAyM2QuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vY2RpdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMhIC9iaW4vc2gKLQotY2QgJDEKLVBST0c9JDIKLXNoaWZ0IDIKLXJtIC1mICoubGliICouYQotJFBST0cgJCoKLVJFVD0kPwotY2QgLi4KLWV4aXQgJFJFVApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vY2RpdC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9jZGl0LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTUwYjY0OC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9jZGl0LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotQGVjaG8gb2ZmCi1jZCAlMQota19ybSAtZiAqLmxpYiAqLmEKLXNoaWZ0IDEKLSUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9kamdwcC5lbnYgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9kamdwcC5lbnYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMmMzZDguLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZGpncHAuZW52CisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotIz0gRG9uJ3QgZWRpdCB0aGlzIGxpbmUgdW5sZXNzIHlvdSBtb3ZlIGRqZ3BwLmVudiBvdXRzaWRlCi0jPSBvZiB0aGUgZGpncHAgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4gIElmIHlvdSBkbyBtb3ZlCi0jPSBpdCwgc2V0IERKRElSIHRvIHRoZSBkaXJlY3RvcnkgeW91IGluc3RhbGxlZCBESkdQUCBpbi4KLSM9Ci1ESkRJUj0lOi8+REpHUFAlCi0KLStVU0VSPWRvc3VzZXIKLStUTVBESVI9JURKRElSJS90bXAKLStFTVUzODc9JURKRElSJS9iaW4vZW11Mzg3LmR4ZQotK0xGTj15Ci0KLVtiaXNvbl0KLUJJU09OX0hBSVJZPSVESkRJUiUvbGliL2Jpc29uLmhhaQotQklTT05fU0lNUExFPSVESkRJUiUvbGliL2Jpc29uLnNpbQotCi1bY3BwXQotQ1BMVVNfSU5DTFVERV9QQVRIPSUvPjtDUExVU19JTkNMVURFX1BBVEglaW5jbHVkZTslU0NJVEVDSCUvaW5jbHVkZTslUFJJVkFURSUvaW5jbHVkZTsuOyVESkRJUiUvbGFuZy9jeHg7JURKRElSJS9pbmNsdWRlOyVESkRJUiUvY29udHJpYi9ncngyMC9pbmNsdWRlCi1DX0lOQ0xVREVfUEFUSD0lLz47Q19JTkNMVURFX1BBVEglaW5jbHVkZTslU0NJVEVDSCUvaW5jbHVkZTslUFJJVkFURSUvaW5jbHVkZTsuOyVESkRJUiUvaW5jbHVkZTslREpESVIlL2NvbnRyaWIvZ3J4MjAvaW5jbHVkZQotT0JKQ1BMVVNfSU5DTFVERV9QQVRIPSUvPjtPQkpDUExVU19JTkNMVURFX1BBVEglJURKRElSJS9pbmNsdWRlOyVESkRJUiUvbGFuZy9vYmpjCi1PQkpDX0lOQ0xVREVfUEFUSD0lLz47T0JKQ19JTkNMVURFX1BBVEglJURKRElSJS9pbmNsdWRlOyVESkRJUiUvbGFuZy9vYmpjCi0KLVtnY2NdCi1DT01QSUxFUl9QQVRIPSUvPjtDT01QSUxFUl9QQVRIJSVESkRJUiUvYmluCi1MSUJSQVJZX1BBVEg9JS8+O0xJQlJBUllfUEFUSCUlREpESVIlL2xpYjslREpESVIlL2NvbnRyaWIvZ3J4MjAvbGliOyVTQ0lURUNIJS9saWIvcmVsZWFzZS9kb3MzMi9kajIKLQotW2luZm9dCi1JTkZPUEFUSD0lLz47SU5GT1BBVEglJURKRElSJS9pbmZvOyVESkRJUiUvZ251L2VtYWNzL2luZm8KLUlORk9fQ09MT1JTPTB4MWYuMHgzMQotCi1bZW1hY3NdCi1JTkZPUEFUSD0lLz47SU5GT1BBVEglJURKRElSJS9pbmZvOyVESkRJUiUvZ251L2VtYWNzL2luZm8KLQotW2xlc3NdCi1MRVNTQklORk1UPSprPCVYPgotTEVTU0NIQVJERUY9OGJjY2NiY2MxMmJjNWI5NS5iMTI3LmIKLUxFU1M9JUxFU1MlIC1oNSR5NSREZDIuMCREdTE0LjAkRHM0LjckRGs5LjAkCi0KLVtsb2NhdGVdCi0rTE9DQVRFX1BBVEg9JURKRElSJS9saWIvbG9jYXRlZGIuZGF0Ci0KLVtsc10KLStMU19DT0xPUlM9bm89MDA6Zmk9MDA6ZGk9MzY6bGI9Mzc7MDc6Y2Q9NDA7MzM7MDE6ZXg9MzI6Ki5jbWQ9MzI6Ki50YXI9MDE7MzE6Ki50Z3o9MDE7MzE6Ki5hcmo9MDE7MzE6Ki50YXo9MDE7MzE6Ki5semg9MDE7MzE6Ki56aXA9MDE7MzE6Ki56PTAxOzMxOiouWj0wMTszMToqLmd6PTAxOzMxOiouZGViPTAxOzMxOiouanBnPTAxOzM0OiouZ2lmPTAxOzM0OiouYm1wPTAxOzM0OioucHBtPTAxOzM0OioudGdhPTAxOzM0OioueGJtPTAxOzM0OioueHBtPTAxOzM0OioudGlmPTAxOzM0OioubXBnPTAxOzM3OiouYXZpPTAxOzM3OiouZ2w9MDE7Mzc6Ki5kbD0wMTszNzoqfj0wODoqLmJhaz0wODoKLVtkaXJdCi0rTFNfQ09MT1JTPW5vPTAwOmZpPTAwOmRpPTM2OmxiPTM3OzA3OmNkPTQwOzMzOzAxOmV4PTMyOiouY21kPTMyOioudGFyPTAxOzMxOioudGd6PTAxOzMxOiouYXJqPTAxOzMxOioudGF6PTAxOzMxOioubHpoPTAxOzMxOiouemlwPTAxOzMxOiouej0wMTszMToqLlo9MDE7MzE6Ki5nej0wMTszMToqLmRlYj0wMTszMToqLmpwZz0wMTszNDoqLmdpZj0wMTszNDoqLmJtcD0wMTszNDoqLnBwbT0wMTszNDoqLnRnYT0wMTszNDoqLnhibT0wMTszNDoqLnhwbT0wMTszNDoqLnRpZj0wMTszNDoqLm1wZz0wMTszNzoqLmF2aT0wMTszNzoqLmdsPTAxOzM3OiouZGw9MDE7Mzc6Kn49MDg6Ki5iYWs9MDg6Ci1bdmRpcl0KLStMU19DT0xPUlM9bm89MDA6Zmk9MDA6ZGk9MzY6bGI9Mzc7MDc6Y2Q9NDA7MzM7MDE6ZXg9MzI6Ki5jbWQ9MzI6Ki50YXI9MDE7MzE6Ki50Z3o9MDE7MzE6Ki5hcmo9MDE7MzE6Ki50YXo9MDE7MzE6Ki5semg9MDE7MzE6Ki56aXA9MDE7MzE6Ki56PTAxOzMxOiouWj0wMTszMToqLmd6PTAxOzMxOiouZGViPTAxOzMxOiouanBnPTAxOzM0OiouZ2lmPTAxOzM0OiouYm1wPTAxOzM0OioucHBtPTAxOzM0OioudGdhPTAxOzM0OioueGJtPTAxOzM0OioueHBtPTAxOzM0OioudGlmPTAxOzM0OioubXBnPTAxOzM3OiouYXZpPTAxOzM3OiouZ2w9MDE7Mzc6Ki5kbD0wMTszNzoqfj0wODoqLmJhaz0wODoKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2RqZ3BwX2RiLmVudiBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2RqZ3BwX2RiLmVudgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI3OTJjOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9kamdwcF9kYi5lbnYKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0jPSBEb24ndCBlZGl0IHRoaXMgbGluZSB1bmxlc3MgeW91IG1vdmUgZGpncHAuZW52IG91dHNpZGUKLSM9IG9mIHRoZSBkamdwcCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LiAgSWYgeW91IGRvIG1vdmUKLSM9IGl0LCBzZXQgREpESVIgdG8gdGhlIGRpcmVjdG9yeSB5b3UgaW5zdGFsbGVkIERKR1BQIGluLgotIz0KLURKRElSPSU6Lz5ESkdQUCUKLQotK1VTRVI9ZG9zdXNlcgotK1RNUERJUj0lREpESVIlL3RtcAotK0VNVTM4Nz0lREpESVIlL2Jpbi9lbXUzODcuZHhlCi0rTEZOPXkKLQotW2Jpc29uXQotQklTT05fSEFJUlk9JURKRElSJS9saWIvYmlzb24uaGFpCi1CSVNPTl9TSU1QTEU9JURKRElSJS9saWIvYmlzb24uc2ltCi0KLVtjcHBdCi1DUExVU19JTkNMVURFX1BBVEg9JS8+O0NQTFVTX0lOQ0xVREVfUEFUSCVpbmNsdWRlOyVTQ0lURUNIJS9pbmNsdWRlOyVQUklWQVRFJS9pbmNsdWRlOy47JURKRElSJS9sYW5nL2N4eDslREpESVIlL2luY2x1ZGU7JURKRElSJS9jb250cmliL2dyeDIwL2luY2x1ZGUKLUNfSU5DTFVERV9QQVRIPSUvPjtDX0lOQ0xVREVfUEFUSCVpbmNsdWRlOyVTQ0lURUNIJS9pbmNsdWRlOyVQUklWQVRFJS9pbmNsdWRlOy47JURKRElSJS9pbmNsdWRlOyVESkRJUiUvY29udHJpYi9ncngyMC9pbmNsdWRlCi1PQkpDUExVU19JTkNMVURFX1BBVEg9JS8+O09CSkNQTFVTX0lOQ0xVREVfUEFUSCUlREpESVIlL2luY2x1ZGU7JURKRElSJS9sYW5nL29iamMKLU9CSkNfSU5DTFVERV9QQVRIPSUvPjtPQkpDX0lOQ0xVREVfUEFUSCUlREpESVIlL2luY2x1ZGU7JURKRElSJS9sYW5nL29iamMKLQotW2djY10KLUNPTVBJTEVSX1BBVEg9JS8+O0NPTVBJTEVSX1BBVEglJURKRElSJS9iaW4KLUxJQlJBUllfUEFUSD0lLz47TElCUkFSWV9QQVRIJSVESkRJUiUvbGliOyVESkRJUiUvY29udHJpYi9ncngyMC9saWI7JVNDSVRFQ0glL2xpYi9kZWJ1Zy9kb3MzMi9kajIKLQotW2luZm9dCi1JTkZPUEFUSD0lLz47SU5GT1BBVEglJURKRElSJS9pbmZvOyVESkRJUiUvZ251L2VtYWNzL2luZm8KLUlORk9fQ09MT1JTPTB4MWYuMHgzMQotCi1bZW1hY3NdCi1JTkZPUEFUSD0lLz47SU5GT1BBVEglJURKRElSJS9pbmZvOyVESkRJUiUvZ251L2VtYWNzL2luZm8KLQotW2xlc3NdCi1MRVNTQklORk1UPSprPCVYPgotTEVTU0NIQVJERUY9OGJjY2NiY2MxMmJjNWI5NS5iMTI3LmIKLUxFU1M9JUxFU1MlIC1oNSR5NSREZDIuMCREdTE0LjAkRHM0LjckRGs5LjAkCi0KLVtsb2NhdGVdCi0rTE9DQVRFX1BBVEg9JURKRElSJS9saWIvbG9jYXRlZGIuZGF0Ci0KLVtsc10KLStMU19DT0xPUlM9bm89MDA6Zmk9MDA6ZGk9MzY6bGI9Mzc7MDc6Y2Q9NDA7MzM7MDE6ZXg9MzI6Ki5jbWQ9MzI6Ki50YXI9MDE7MzE6Ki50Z3o9MDE7MzE6Ki5hcmo9MDE7MzE6Ki50YXo9MDE7MzE6Ki5semg9MDE7MzE6Ki56aXA9MDE7MzE6Ki56PTAxOzMxOiouWj0wMTszMToqLmd6PTAxOzMxOiouZGViPTAxOzMxOiouanBnPTAxOzM0OiouZ2lmPTAxOzM0OiouYm1wPTAxOzM0OioucHBtPTAxOzM0OioudGdhPTAxOzM0OioueGJtPTAxOzM0OioueHBtPTAxOzM0OioudGlmPTAxOzM0OioubXBnPTAxOzM3OiouYXZpPTAxOzM3OiouZ2w9MDE7Mzc6Ki5kbD0wMTszNzoqfj0wODoqLmJhaz0wODoKLVtkaXJdCi0rTFNfQ09MT1JTPW5vPTAwOmZpPTAwOmRpPTM2OmxiPTM3OzA3OmNkPTQwOzMzOzAxOmV4PTMyOiouY21kPTMyOioudGFyPTAxOzMxOioudGd6PTAxOzMxOiouYXJqPTAxOzMxOioudGF6PTAxOzMxOioubHpoPTAxOzMxOiouemlwPTAxOzMxOiouej0wMTszMToqLlo9MDE7MzE6Ki5nej0wMTszMToqLmRlYj0wMTszMToqLmpwZz0wMTszNDoqLmdpZj0wMTszNDoqLmJtcD0wMTszNDoqLnBwbT0wMTszNDoqLnRnYT0wMTszNDoqLnhibT0wMTszNDoqLnhwbT0wMTszNDoqLnRpZj0wMTszNDoqLm1wZz0wMTszNzoqLmF2aT0wMTszNzoqLmdsPTAxOzM3OiouZGw9MDE7Mzc6Kn49MDg6Ki5iYWs9MDg6Ci1bdmRpcl0KLStMU19DT0xPUlM9bm89MDA6Zmk9MDA6ZGk9MzY6bGI9Mzc7MDc6Y2Q9NDA7MzM7MDE6ZXg9MzI6Ki5jbWQ9MzI6Ki50YXI9MDE7MzE6Ki50Z3o9MDE7MzE6Ki5hcmo9MDE7MzE6Ki50YXo9MDE7MzE6Ki5semg9MDE7MzE6Ki56aXA9MDE7MzE6Ki56PTAxOzMxOiouWj0wMTszMToqLmd6PTAxOzMxOiouZGViPTAxOzMxOiouanBnPTAxOzM0OiouZ2lmPTAxOzM0OiouYm1wPTAxOzM0OioucHBtPTAxOzM0OioudGdhPTAxOzM0OioueGJtPTAxOzM0OioueHBtPTAxOzM0OioudGlmPTAxOzM0OioubXBnPTAxOzM3OiouYXZpPTAxOzM3OiouZ2w9MDE7Mzc6Ki5kbD0wMTszNzoqfj0wODoqLmJhaz0wODoKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2ZpbmRpbnQzLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2ZpbmRpbnQzLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmUxNTA2Yy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9maW5kaW50My5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1wZXJsIGM6XHNjaXRlY2hcc3JjXHBlcmxcZmluZGludDMucGVyCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9nY2MtYmVvcy5zaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYy1iZW9zLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MWZmZDkzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYy1iZW9zLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBHQ0MvRysrIGZvciBCZU9TCi0KLWlmIFsgIiRDSEVDS0VEIiA9ICIxIiBdOyB0aGVuCi0gICAgZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1lbHNlCi0gICAgZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1maQotCi1leHBvcnQgTUFLRVNUQVJUVVA9JFNDSVRFQ0gvbWFrZWRlZnMvZ2NjX2Jlb3MubWsKLWV4cG9ydCBJTkNMVURFPSItSWluY2x1ZGUgLUkkU0NJVEVDSC9pbmNsdWRlIC1JJFBSSVZBVEUvaW5jbHVkZSIKLWV4cG9ydCBVU0VfWDExPTAKLWV4cG9ydCBVU0VfQkVPUz0xCi0KLWVjaG8gR0NDIEJlT1MgY29uc29sZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYy1mcmVlYnNkLnNoIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjLWZyZWVic2Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM4MTZhNWQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjLWZyZWVic2Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEdDQy9HKysgZm9yIEZyZWVCU0QKLQotaWYgWyAiJENIRUNLRUQiID0gIjEiIF07IHRoZW4KLSAgICBlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWVsc2UKLSAgICBlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWZpCi0KLWV4cG9ydCBNQUtFU1RBUlRVUD0kU0NJVEVDSC9tYWtlZGVmcy9nY2NfZnJlZWJzZC5tawotZXhwb3J0IElOQ0xVREU9Ii1JaW5jbHVkZSAtSSRTQ0lURUNIL2luY2x1ZGUgLUkkUFJJVkFURS9pbmNsdWRlIgotZXhwb3J0IFVTRV9YMTE9MQotZXhwb3J0IFVTRV9GUkVFQlNEPTEKLQotZWNobyBHQ0MgRnJlZUJTRCBjb25zb2xlIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjLWxpbnV4LnNoIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjLWxpbnV4LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyN2E0YzQ5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYy1saW51eC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggR0NDL0crKyBmb3IgTGludXgKLQotaWYgWyAiJENIRUNLRUQiID0gIjEiIF07IHRoZW4KLSAgICBlY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWVsc2UKLSAgICBlY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWZpCi0KLWV4cG9ydCBNQUtFU1RBUlRVUD0kU0NJVEVDSC9tYWtlZGVmcy9nY2NfbGludXgubWsKLWV4cG9ydCBJTkNMVURFPSJpbmNsdWRlOyRTQ0lURUNIL2luY2x1ZGU7JFBSSVZBVEUvaW5jbHVkZSIKLWV4cG9ydCBVU0VfTElOVVg9MQotCi1pZiBbICJ4JExJQkMiID0geCBdOyB0aGVuCi0JZWNobyAiR0NDIExpbnV4IGNvbnNvbGUgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwIChnbGliKSIKLWVsc2UKLQllY2hvICJHQ0MgTGludXggY29uc29sZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAgKGxpYmM1KSIKLWZpCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9nY2MyLWMzMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9nY2MyLWMzMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEzYzQ3ODMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjMi1jMzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIEdOVSBDIGNvbXBpbGVyCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxyZWxlYXNlXHdpbjMyXGdjYzIKLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXGRlYnVnXHdpbjMyXGdjYzIKLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1zZXQgSU5DTFVERT1pbmNsdWRlOyVTQ0lURUNIJVxpbmNsdWRlOyVQUklWQVRFJVxpbmNsdWRlCi1zZXQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXG1ha2VkZWZzXGdjY193aW4zMi5tawotc2V0IE1BS0VfTU9ERT0KLXNldCBVU0VfV0lOMTY9Ci1zZXQgVVNFX1dJTjMyPTEKLXNldCBXSU4zMl9HVUk9Ci1zZXQgVVNFX1NOQVA9Ci1zZXQgR0NDX0xJQkJBU0U9Z2NjMgotUEFUSCAlU0NJVEVDSF9CSU4lOyVHQ0MyX1BBVEglXE5BVElWRVxCSU47JURFRlBBVEglCi0KLWVjaG8gR0NDIDIuOS54IDMyLWJpdCBXaW4zMiBjb25zb2xlIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cAotCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9nY2MyLWRvcy5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9nY2MyLWRvcy5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk3Y2I4YmQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjMi1kb3MuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIERKR1BQIDIuMDIKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXHJlbGVhc2VcZG9zMzJcZGoyCi0lU0NJVEVDSCVcYmluLWRvc1xrX2NwICVTQ0lURUNIJVxCSU5cREpHUFAuRU5WICVESl9QQVRIJVxESkdQUC5FTlYKLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXGRlYnVnXGRvczMyXGRqMgotJVNDSVRFQ0glXGJpbi1kb3Nca19jcCAlU0NJVEVDSCVcQklOXERKR1BQX0RCLkVOViAlREpfUEFUSCVcREpHUFAuRU5WCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotc2V0IERKR1BQPSVESl9QQVRIJVxESkdQUC5FTlYKLXNldCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JURKX1BBVEglXElOQ0xVREU7Ci1zZXQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXERKMzIuTUsKLXNldCBVU0VfV0lOMTY9Ci1zZXQgVVNFX1dJTjMyPQotc2V0IFdJTjMyX0dVST0KLXNldCBVU0VfU05BUD0KLXNldCBESl9MSUJCQVNFPWRqMgotUEFUSCAlU0NJVEVDSF9CSU4lOyVESl9QQVRIJVxCSU47JURFRlBBVEglCi0KLWVjaG8gREpHUFAgMi4wMiAzMi1iaXQgRE9TIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cCAoRFBNSSkuCi0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYzItbGludXguYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjMi1saW51eC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNlYjJhYjguLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjMi1saW51eC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggR05VIEMgY3Jvc3MtY29tcGlsZXIKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXHJlbGVhc2Vcd2luMzJcZ2NjMgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcZGVidWdcd2luMzJcZ2NjMgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLXNldCBJTkNMVURFPWluY2x1ZGU7JVNDSVRFQ0glXGluY2x1ZGU7JVBSSVZBVEUlXGluY2x1ZGUKLXNldCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcZ2NjX2xpbnV4Lm1rCi1zZXQgTUFLRV9NT0RFPVVOSVgKLXNldCBVU0VfV0lOMTY9Ci1zZXQgVVNFX1dJTjMyPQotc2V0IFdJTjMyX0dVST0KLXNldCBVU0VfU05BUD0KLXNldCBHQ0NfTElCQkFTRT1nY2MyCi1QQVRIICVTQ0lURUNIX0JJTiU7JUdDQzJfUEFUSCVcY3Jvc3MtbGludXhcaTM4Ni1yZWRoYXQtbGludXhcQklOOyVERUZQQVRIJQotCi1lY2hvIEdDQyAyLjkueCAzMi1iaXQgTGludXggY29uc29sZSBjcm9zcyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjMi13MzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vZ2NjMi13MzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZGIzMWFhLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL2djYzItdzMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBHTlUgQyBjb21waWxlcgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJccmVsZWFzZVx3aW4zMlxnY2MyCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxkZWJ1Z1x3aW4zMlxnY2MyCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotc2V0IElOQ0xVREU9aW5jbHVkZTslU0NJVEVDSCVcaW5jbHVkZTslUFJJVkFURSVcaW5jbHVkZQotc2V0IE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxtYWtlZGVmc1xnY2Nfd2luMzIubWsKLXNldCBNQUtFX01PREU9Ci1zZXQgVVNFX1dJTjE2PQotc2V0IFVTRV9XSU4zMj0xCi1zZXQgV0lOMzJfR1VJPTEKLXNldCBVU0VfU05BUD0KLXNldCBHQ0NfTElCQkFTRT1nY2MyCi1QQVRIICVTQ0lURUNIX0JJTiU7JUdDQzJfUEFUSCVcTkFUSVZFXEJJTjslREVGUEFUSCUKLQotZWNobyBHQ0MgMi45LnggMzItYml0IFdpbjMyIEdVSSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vbWFrZWxpYi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9tYWtlbGliLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjMxNjczNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9tYWtlbGliLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLWNhbGwgd2MxMS1kMzIuYmF0Ci0KLWNkIGM6XHByaXZhdGVcc3JjXGxpY2Vuc2UKLWRtYWtlIGNsZWFuCi1kbWFrZSBkZXBlbmQKLWRtYWtlIC11IGluc3RhbGwKLWNkIGM6XHNjaXRlY2hcc3JjXHBtCi1kbWFrZSBjbGVhbgotZG1ha2UgZGVwZW5kCi1kbWFrZSAtdSBpbnN0YWxsCi1jZCBjOlxzY2l0ZWNoXHNyY1xjb25zb2xlCi1kbWFrZSBjbGVhbgotZG1ha2UgZGVwZW5kCi1kbWFrZSAtdSBpbnN0YWxsCi1jZCBjOlxzY2l0ZWNoXHNyY1xudWNsZXVzCi1kbWFrZSBjbGVhbgotZG1ha2UgZGVwZW5kCi1kbWFrZSAtdSBpbnN0YWxsCi1jZCBjOlxzY2l0ZWNoXHNyY1x6bGliCi1kbWFrZSBjbGVhbgotZG1ha2UgZGVwZW5kCi1kbWFrZSAtdSBpbnN0YWxsCi0KLWNkIGM6XHByaXZhdGVcc3JjXGdyYXBoaWNzXHJlZjJkCi1kbWFrZSBjbGVhbgotZG1ha2UgZGVwZW5kCi1kbWFrZSAtdSBpbnN0YWxsCi1jZCBjOlxwcml2YXRlXHNyY1xkcnZsaWIKLWRtYWtlIGNsZWFuCi1kbWFrZSBkZXBlbmQKLWRtYWtlIC11IGluc3RhbGwKLQotY2FsbCB3YzExLXczMi5iYXQKLQotY2QgYzpccHJpdmF0ZVxzcmNcbGljZW5zZQotZG1ha2UgY2xlYW4KLWRtYWtlIGRlcGVuZAotZG1ha2UgLXUgaW5zdGFsbAotY2QgYzpcc2NpdGVjaFxzcmNccG0KLWRtYWtlIGNsZWFuCi1kbWFrZSBkZXBlbmQKLWRtYWtlIC11IGluc3RhbGwKLWNkIGM6XHNjaXRlY2hcc3JjXGNvbnNvbGUKLWRtYWtlIGNsZWFuCi1kbWFrZSBkZXBlbmQKLWRtYWtlIC11IGluc3RhbGwKLWNkIGM6XHNjaXRlY2hcc3JjXG51Y2xldXMKLWRtYWtlIGNsZWFuCi1kbWFrZSBkZXBlbmQKLWRtYWtlIC11IGluc3RhbGwKLWNkIGM6XHNjaXRlY2hcc3JjXHpsaWIKLWRtYWtlIGNsZWFuCi1kbWFrZSBkZXBlbmQKLWRtYWtlIC11IGluc3RhbGwKLQotY2QgYzpccHJpdmF0ZVxzcmNcZ3JhcGhpY3NccmVmMmQKLWRtYWtlIGNsZWFuCi1kbWFrZSBkZXBlbmQKLWRtYWtlIC11IGluc3RhbGwKLWNkIGM6XHByaXZhdGVcc3JjXGRydmxpYgotZG1ha2UgY2xlYW4KLWRtYWtlIGRlcGVuZAotZG1ha2UgLXUgaW5zdGFsbAotCi1jYWxsIHdjMTAtZDMyLmJhdAotCi1jZCBjOlxwcml2YXRlXHNyY1xsaWNlbnNlCi1kbWFrZSBjbGVhbgotZG1ha2UgZGVwZW5kCi1kbWFrZSAtdSBpbnN0YWxsCi1jZCBjOlxzY2l0ZWNoXHNyY1xwbQotZG1ha2UgY2xlYW4KLWRtYWtlIGRlcGVuZAotZG1ha2UgLXUgaW5zdGFsbAotY2QgYzpcc2NpdGVjaFxzcmNcY29uc29sZQotZG1ha2UgY2xlYW4KLWRtYWtlIGRlcGVuZAotZG1ha2UgLXUgaW5zdGFsbAotY2QgYzpcc2NpdGVjaFxzcmNcbnVjbGV1cwotZG1ha2UgY2xlYW4KLWRtYWtlIGRlcGVuZAotZG1ha2UgLXUgaW5zdGFsbAotY2QgYzpcc2NpdGVjaFxzcmNcemxpYgotZG1ha2UgY2xlYW4KLWRtYWtlIGRlcGVuZAotZG1ha2UgLXUgaW5zdGFsbAotCi1jZCBjOlxwcml2YXRlXHNyY1xncmFwaGljc1xyZWYyZAotZG1ha2UgY2xlYW4KLWRtYWtlIGRlcGVuZAotZG1ha2UgLXUgaW5zdGFsbAotY2QgYzpccHJpdmF0ZVxzcmNcZHJ2bGliCi1kbWFrZSBjbGVhbgotZG1ha2UgZGVwZW5kCi1kbWFrZSAtdSBpbnN0YWxsCi0KLWNkIFxwcml2YXRlXHNyY1xncmFwaGljc1xkcml2ZXJzCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9tZWx0b2Jqcy5zaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL21lbHRvYmpzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZDE4MDRiLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL21lbHRvYmpzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyEgL2Jpbi9zaAotIwotIyBUaGlzIHNjcmlwdCBnZW5lcmF0ZXMgYSBzaW5nbGUgb2JqZWN0IGZpbGUgZnJvbSBhIHNldCBvZiBsaWJyYXJpZXMgKCouYSBmaWxlcykKLSMgVXNhZ2U6IG1lbHRvYmpzLnNoIHRhcmdldC5vIGxpYnJhcnkxLmEgbGlicmFyeTIuYSAuLi4KLSMKLSMgKEMpIFNjaVRlY2ggU29mdHdhcmUsIEluYy4gMTk5OAotIwotCi1UTVBESVI9L3RtcC9tZWx0JCQKLVRBUkdFVD0kMQotVEFSR0VURElSPSRQV0QKLXNoaWZ0Ci1ta2RpciAkVE1QRElSCi0KLWNkICRUTVBESVIKLQotZm9yIGEgaW4gJCoKLWRvCi0gICAgYXIgeCAkYQotZG9uZQotbGQgLXIgLW8gJFRBUkdFVERJUi8kVEFSR0VUICoubwotCi1ybSAtZnIgJFRNUERJUgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL250ZGRrLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL250ZGRrLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDdjMGQ3OC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9udGRkay5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi1AZWNobyBvZmYKLVJFTTogU2V0IHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTWljcm9zb2Z0IFdpbmRvd3MgTlQgRERLIGRldmVsb3BtZW50LgotUkVNOiBOb3RlIHRoYXQgd2UgaGF2ZSBoYXJkIGNvZGVkIHRoaXMgZm9yIFdpbmRvd3MgTlQgaTM4NiBkZXZlbG9wbWVudC4KLQotU0VUIFVTRV9OVERSVj0xCi1TRVQgVVNFX1cyS0RSVj0KLVNFVCBCQVNFRElSPSVOVF9EREtST09UJQotU0VUIFBBVEg9JUJBU0VESVIlXGJpbjslUEFUSCUKLVNFVCBOVE1BS0VFTlY9JUJBU0VESVIlXGluYwotU0VUIEJVSUxEX01BS0VfUFJPR1JBTT1ubWFrZS5leGUKLVNFVCBCVUlMRF9ERUZBVUxUPS1laSAtbm1ha2UgLWkKLVNFVCBCVUlMRF9ERUZBVUxUX1RBUkdFVFM9LTM4NgotU0VUIF9PQkpfRElSPW9iagotU0VUIE5FV19DUlRTPTEKLVNFVCBfTlRST09UPSVCQVNFRElSJQotU0VUIElOQ0xVREU9JUJBU0VESVIlXGluYzslSU5DTFVERSUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkCi0KLVJFTTogc2V0IHVwIGFuIE5UIGZyZWUgYnVpbGQgZW52aXJvbm1lbnQKLVNFVCBEREtCVUlMREVOVj1mcmVlCi1TRVQgQ19ERUZJTkVTPS1EX0lEV0JVSUxECi1TRVQgTlREQkdGSUxFUz0xCi1TRVQgTlRERUJVRz0KLVNFVCBOVERFQlVHVFlQRT0KLVNFVCBNU0NfT1BUSU1JWkFUSU9OPQotc2V0IExJQj0lQkFTRURJUiVcbGliXGkzODZcZnJlZTslU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXE5URFJWXFZDNjslTVNWQ0RpciVcTElCOy4KLQotZ290byBkb25lCi0KLTpjaGVja2VkCi0KLVJFTTogc2V0IHVwIGFuIE5UIGNoZWNrZWQgYnVpbGQgZW52aXJvbm1lbnQKLVNFVCBEREtCVUlMREVOVj1jaGVja2VkCi1TRVQgQ19ERUZJTkVTPS1EX0lEV0JVSUxEIC1EUkRSREJHIC1EU1JWREJHCi1TRVQgTlREQkdGSUxFUz0KLVNFVCBOVERFQlVHPW50c2QKLVNFVCBOVERFQlVHVFlQRT1ib3RoCi1TRVQgTVNDX09QVElNSVpBVElPTj0vT2QgL09pCi1zZXQgTElCPSVCQVNFRElSJVxsaWJcaTM4NlxmcmVlOyVTQ0lURUNIX0xJQiVcTElCXERFQlVHXE5URFJWXFZDNjslTVNWQ0RpciVcTElCOy4KLQotOmRvbmUKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3FueDQuc2ggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9xbng0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NDNjNGQ5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3FueDQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyBmb3IgUU5YNAotCi1pZiBbICIkQ0hFQ0tFRCIgPSAiMSIgXTsgdGhlbgotICAgIGVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZWxzZQotICAgIGVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZmkKLQotZXhwb3J0IE1BS0VTVEFSVFVQPSRTQ0lURUNIL21ha2VkZWZzL3FueDQubWsKLWV4cG9ydCBJTkNMVURFPSItSSRTQ0lURUNIL2luY2x1ZGUgLUkkUFJJVkFURS9pbmNsdWRlIC1JL3Vzci9pbmNsdWRlIgotZXhwb3J0IFVTRV9RTlg9MQotZXhwb3J0IFVTRV9RTlg0PTEKLWV4cG9ydCBXQ19MSUJCQVNFPXdjMTAKLQotZWNobyBRbnggNCBjb25zb2xlIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cAotCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9xbnhudG8uc2ggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9xbnhudG8uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMxMTRmOWUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vcW54bnRvLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgZm9yIFFOWCBOZXV0cmlubwotCi1pZiBbICIkQ0hFQ0tFRCIgPSAiMSIgXTsgdGhlbgotICAgIGVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZWxzZQotICAgIGVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZmkKLQotaWYgWyBYJEdDQ19QQVRIID0gIlgiIF07IHRoZW4KLQlleHBvcnQgR0NDX1BBVEg9L3Vzci9nY2MvYmluCi1maQotCi1leHBvcnQgTUFLRVNUQVJUVVA9JFNDSVRFQ0gvbWFrZWRlZnMvcW54bnRvLm1rCi1leHBvcnQgSU5DTFVERT0iLUkkU0NJVEVDSC9pbmNsdWRlIC1JJFBSSVZBVEUvaW5jbHVkZSAtSS91c3IvbnRvL2luY2x1ZGUiCi1leHBvcnQgVVNFX0JJT1M9MQkjIFZCSU9TIGxpYiBpcyB0aW55IHVuZGVyIE5ldXRyaW5vLCBhbHdheXMgaW5jbHVkZSBpdAotZXhwb3J0IFVTRV9RTlg9MQotZXhwb3J0IFVTRV9RTlhOVE89MQotCi1lY2hvIFFueCBOZXV0cmlubyBjb25zb2xlIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vc2V0LXZhcnMtYmVvcy5zaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3NldC12YXJzLWJlb3Muc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBhMjcyZDYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vc2V0LXZhcnMtYmVvcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBCZU9TIFZFUlNJT04KLSMgU2V0IHRoZSBwbGFjZSB3aGVyZSBTY2lUZWNoIFNvZnR3YXJlIGlzIGluc3RhbGxlZCwgYW5kIHdoZXJlIGVhY2gKLSMgb2YgdGhlIHN1cHBvcnRlZCBjb21waWxlcnMgaXMgaW5zdGFsbGVkLiBUaGVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLSMgYXJlIHVzZWQgYnkgdGhlIGJhdGNoIGZpbGVzIGluIHRoZSBTQ0lURUNIXEJJTiBkaXJlY3RvcnkuCi0jCi0jIE1vZGlmeSB0aGUgYXMgYXBwcm9wcmlhdGUgZm9yIHlvdXIgY29tcGlsZXIgY29uZmlndXJhdGlvbiAoeW91IHNob3VsZAotIyBvbmx5IG5lZWQgdG8gY2hhbmdlIHRoaW5ncyBpbiB0aGlzIGJhdGNoIGZpbGUpLgotIwotIyBUaGlzIHZlcnNpb24gaXMgZm9yIGEgbm9ybWFsIEJlT1MgaW5zdGFsbGF0aW9uLgotCi0jIFRoZSBTQ0lURUNIIHZhcmlhYmxlIHBvaW50cyB0byB3aGVyZSBiYXRjaCBmaWxlcywgbWFrZWZpbGUgc3RhcnR1cHMsCi0jIGluY2x1ZGUgZmlsZXMgYW5kIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGZvdW5kIHdoZW4gY29tcGlsaW5nLgotCi1leHBvcnQgU0NJVEVDSD0kTUdMX1JPT1QgCi0KLSMgVGhlIFNDSVRFQ0hfTElCIHZhcmlhYmxlIHBvaW50cyB0byB3aGVyZSB0aGUgU2NpVGVjaCBsaWJyYXJpZXMgbGl2ZQotIyBmb3IgaW5zdGFsbGF0aW9uIGFuZCBsaW5raW5nLiBUaGlzIGFsbG93cyB5b3UgdG8gaGF2ZSB0aGUgc291cmNlIGFuZAotIyBpbmNsdWRlIGZpbGVzIG9uIGxvY2FsIG1hY2hpbmVzIGZvciBjb21waWxpbmcgYW5kIGhhdmUgdGhlIGxpYnJhcmllcwotIyBsb2NhdGVkIG9uIGEgY29tbW9uIG5ldHdvcmsgbWFjaGluZSAoZm9yIG5ldHdvcmsgYnVpbGRzKS4KLQotZXhwb3J0IFNDSVRFQ0hfTElCPSRTQ0lURUNICi0KLSMgVGhlIFBSSVZBVEUgdmFyaWFibGUgcG9pbnRzIHRvIHdoZXJlIHByaXZhdGUgc291cmNlIGZpbGVzIHJlc2lkZSB0aGF0Ci0jIGRvIG5vdCBsaXZlIGluIHRoZSBwdWJsaWMgc291cmNlIHRyZWUKLQotZXhwb3J0IFBSSVZBVEU9JEhPTUUvcHJpdmF0ZQotCi0jIFRoZSBmb2xsb3dpbmcgZGVmaW5lIHRoZSBsb2NhdGlvbnMgb2YgYWxsIHRoZSBjb21waWxlcnMgdGhhdCB5b3UgbWF5Ci0jIGJlIHVzaW5nLiBDaGFuZ2UgdGhlbSB0byByZWZsZWN0IHdoZXJlIHlvdSBoYXZlIGluc3RhbGxlZCB5b3VyCi0jIGNvbXBpbGVycy4KLQotZXhwb3J0IEdDQ19QQVRIPS9ib290L2RldmVsb3AvdG9vbHMvZ251cHJvL2JpbgotCi0jIEFkZCB0aGUgU2NpdGVjaCBiaW4gcGF0aCB0byB0aGUgY3VycmVudCBQQVRICi1leHBvcnQgUEFUSD0kU0NJVEVDSC9iaW46JFNDSVRFQ0gvYmluLWJlb3M6JFBBVEgKLSNpZiBbICJ4JExJQkMiID0geCBdOyB0aGVuCi0jCWV4cG9ydCBQQVRIPSRQQVRIOiRTQ0lURUNIL2Jpbi1iZW9zL2dsaWJjCi0jZWxzZQotIwlleHBvcnQgUEFUSD0kUEFUSDokU0NJVEVDSC9iaW4tYmVvcy9saWJjCi0jZmkKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3NldC12YXJzLWZyZWVic2Quc2ggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9zZXQtdmFycy1mcmVlYnNkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOTIwNzQ4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3NldC12YXJzLWZyZWVic2Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgTElOVVggVkVSU0lPTgotIyBTZXQgdGhlIHBsYWNlIHdoZXJlIFNjaVRlY2ggU29mdHdhcmUgaXMgaW5zdGFsbGVkLCBhbmQgd2hlcmUgZWFjaAotIyBvZiB0aGUgc3VwcG9ydGVkIGNvbXBpbGVycyBpcyBpbnN0YWxsZWQuIFRoZXNlIGVudmlyb25tZW50IHZhcmlhYmxlcwotIyBhcmUgdXNlZCBieSB0aGUgYmF0Y2ggZmlsZXMgaW4gdGhlIFNDSVRFQ0hcQklOIGRpcmVjdG9yeS4KLSMKLSMgTW9kaWZ5IHRoZSBhcyBhcHByb3ByaWF0ZSBmb3IgeW91ciBjb21waWxlciBjb25maWd1cmF0aW9uICh5b3Ugc2hvdWxkCi0jIG9ubHkgbmVlZCB0byBjaGFuZ2UgdGhpbmdzIGluIHRoaXMgYmF0Y2ggZmlsZSkuCi0jCi0jIFRoaXMgdmVyc2lvbiBpcyBmb3IgYSBub3JtYWwgTGludXggaW5zdGFsbGF0aW9uLgotCi0jIFRoZSBTQ0lURUNIIHZhcmlhYmxlIHBvaW50cyB0byB3aGVyZSBiYXRjaCBmaWxlcywgbWFrZWZpbGUgc3RhcnR1cHMsCi0jIGluY2x1ZGUgZmlsZXMgYW5kIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGZvdW5kIHdoZW4gY29tcGlsaW5nLgotCi1leHBvcnQgU0NJVEVDSD0kTUdMX1JPT1QgCi0KLSMgVGhlIFNDSVRFQ0hfTElCIHZhcmlhYmxlIHBvaW50cyB0byB3aGVyZSB0aGUgU2NpVGVjaCBsaWJyYXJpZXMgbGl2ZQotIyBmb3IgaW5zdGFsbGF0aW9uIGFuZCBsaW5raW5nLiBUaGlzIGFsbG93cyB5b3UgdG8gaGF2ZSB0aGUgc291cmNlIGFuZAotIyBpbmNsdWRlIGZpbGVzIG9uIGxvY2FsIG1hY2hpbmVzIGZvciBjb21waWxpbmcgYW5kIGhhdmUgdGhlIGxpYnJhcmllcwotIyBsb2NhdGVkIG9uIGEgY29tbW9uIG5ldHdvcmsgbWFjaGluZSAoZm9yIG5ldHdvcmsgYnVpbGRzKS4KLQotZXhwb3J0IFNDSVRFQ0hfTElCPSRTQ0lURUNICi0KLSMgVGhlIFBSSVZBVEUgdmFyaWFibGUgcG9pbnRzIHRvIHdoZXJlIHByaXZhdGUgc291cmNlIGZpbGVzIHJlc2lkZSB0aGF0Ci0jIGRvIG5vdCBsaXZlIGluIHRoZSBwdWJsaWMgc291cmNlIHRyZWUKLQotZXhwb3J0IFBSSVZBVEU9JEhPTUUvcHJpdmF0ZQotCi0jIFRoZSBmb2xsb3dpbmcgZGVmaW5lIHRoZSBsb2NhdGlvbnMgb2YgYWxsIHRoZSBjb21waWxlcnMgdGhhdCB5b3UgbWF5Ci0jIGJlIHVzaW5nLiBDaGFuZ2UgdGhlbSB0byByZWZsZWN0IHdoZXJlIHlvdSBoYXZlIGluc3RhbGxlZCB5b3VyCi0jIGNvbXBpbGVycy4KLQotZXhwb3J0IEdDQ19QQVRIPS91c3IvYmluCi0KLSMgQWRkIHRoZSBTY2l0ZWNoIGJpbiBwYXRoIHRvIHRoZSBjdXJyZW50IFBBVEgKLWV4cG9ydCBQQVRIPSRTQ0lURUNIL2JpbjokU0NJVEVDSC9iaW4tZnJlZWJzZDokUEFUSApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vc2V0LXZhcnMtbGludXguc2ggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9zZXQtdmFycy1saW51eC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzVjYmYxZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9zZXQtdmFycy1saW51eC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBMSU5VWCBWRVJTSU9OCi0jIFNldCB0aGUgcGxhY2Ugd2hlcmUgU2NpVGVjaCBTb2Z0d2FyZSBpcyBpbnN0YWxsZWQsIGFuZCB3aGVyZSBlYWNoCi0jIG9mIHRoZSBzdXBwb3J0ZWQgY29tcGlsZXJzIGlzIGluc3RhbGxlZC4gVGhlc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzCi0jIGFyZSB1c2VkIGJ5IHRoZSBiYXRjaCBmaWxlcyBpbiB0aGUgU0NJVEVDSFxCSU4gZGlyZWN0b3J5LgotIwotIyBNb2RpZnkgdGhlIGFzIGFwcHJvcHJpYXRlIGZvciB5b3VyIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gKHlvdSBzaG91bGQKLSMgb25seSBuZWVkIHRvIGNoYW5nZSB0aGluZ3MgaW4gdGhpcyBiYXRjaCBmaWxlKS4KLSMKLSMgVGhpcyB2ZXJzaW9uIGlzIGZvciBhIG5vcm1hbCBMaW51eCBpbnN0YWxsYXRpb24uCi0KLSMgVGhlIFNDSVRFQ0ggdmFyaWFibGUgcG9pbnRzIHRvIHdoZXJlIGJhdGNoIGZpbGVzLCBtYWtlZmlsZSBzdGFydHVwcywKLSMgaW5jbHVkZSBmaWxlcyBhbmQgc291cmNlIGZpbGVzIHdpbGwgYmUgZm91bmQgd2hlbiBjb21waWxpbmcuCi0KLWV4cG9ydCBTQ0lURUNIPSRNR0xfUk9PVCAKLQotIyBUaGUgU0NJVEVDSF9MSUIgdmFyaWFibGUgcG9pbnRzIHRvIHdoZXJlIHRoZSBTY2lUZWNoIGxpYnJhcmllcyBsaXZlCi0jIGZvciBpbnN0YWxsYXRpb24gYW5kIGxpbmtpbmcuIFRoaXMgYWxsb3dzIHlvdSB0byBoYXZlIHRoZSBzb3VyY2UgYW5kCi0jIGluY2x1ZGUgZmlsZXMgb24gbG9jYWwgbWFjaGluZXMgZm9yIGNvbXBpbGluZyBhbmQgaGF2ZSB0aGUgbGlicmFyaWVzCi0jIGxvY2F0ZWQgb24gYSBjb21tb24gbmV0d29yayBtYWNoaW5lIChmb3IgbmV0d29yayBidWlsZHMpLgotCi1leHBvcnQgU0NJVEVDSF9MSUI9JFNDSVRFQ0gKLQotIyBUaGUgUFJJVkFURSB2YXJpYWJsZSBwb2ludHMgdG8gd2hlcmUgcHJpdmF0ZSBzb3VyY2UgZmlsZXMgcmVzaWRlIHRoYXQKLSMgZG8gbm90IGxpdmUgaW4gdGhlIHB1YmxpYyBzb3VyY2UgdHJlZQotCi1leHBvcnQgUFJJVkFURT0kSE9NRS9wcml2YXRlCi0KLSMgVGhlIGZvbGxvd2luZyBkZWZpbmUgdGhlIGxvY2F0aW9ucyBvZiBhbGwgdGhlIGNvbXBpbGVycyB0aGF0IHlvdSBtYXkKLSMgYmUgdXNpbmcuIENoYW5nZSB0aGVtIHRvIHJlZmxlY3Qgd2hlcmUgeW91IGhhdmUgaW5zdGFsbGVkIHlvdXIKLSMgY29tcGlsZXJzLgotCi1leHBvcnQgR0NDX1BBVEg9L3Vzci9iaW4KLWV4cG9ydCBURU1QPS90bXAgVE1QPS90bXAKLQotIyBBZGQgdGhlIFNjaXRlY2ggYmluIHBhdGggdG8gdGhlIGN1cnJlbnQgUEFUSAotZXhwb3J0IFBBVEg9JFNDSVRFQ0gvYmluOiRTQ0lURUNIL2Jpbi1saW51eDokUEFUSAotaWYgWyAieCRMSUJDIiA9IHggXTsgdGhlbgotCWV4cG9ydCBQQVRIPSRTQ0lURUNIL2Jpbi1saW51eC9nbGliYzokUEFUSAotZWxzZQotCWV4cG9ydCBQQVRIPSRTQ0lURUNIL2Jpbi1saW51eC9saWJjOiRQQVRICi1maQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vc2V0LXZhcnMtcW54LnNoIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vc2V0LXZhcnMtcW54LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZDczMTA5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3NldC12YXJzLXFueC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBRTlggNCBWRVJTSU9OCi0jIFNldCB0aGUgcGxhY2Ugd2hlcmUgU2NpVGVjaCBTb2Z0d2FyZSBpcyBpbnN0YWxsZWQsIGFuZCB3aGVyZSBlYWNoCi0jIG9mIHRoZSBzdXBwb3J0ZWQgY29tcGlsZXJzIGlzIGluc3RhbGxlZC4gVGhlc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzCi0jIGFyZSB1c2VkIGJ5IHRoZSBiYXRjaCBmaWxlcyBpbiB0aGUgU0NJVEVDSFxCSU4gZGlyZWN0b3J5LgotIwotIyBNb2RpZnkgdGhlIGFzIGFwcHJvcHJpYXRlIGZvciB5b3VyIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gKHlvdSBzaG91bGQKLSMgb25seSBuZWVkIHRvIGNoYW5nZSB0aGluZ3MgaW4gdGhpcyBiYXRjaCBmaWxlKS4KLSMKLSMgVGhpcyB2ZXJzaW9uIGlzIGZvciBhIG5vcm1hbCBMaW51eCBpbnN0YWxsYXRpb24uCi0KLSMgVGhlIFNDSVRFQ0ggdmFyaWFibGUgcG9pbnRzIHRvIHdoZXJlIGJhdGNoIGZpbGVzLCBtYWtlZmlsZSBzdGFydHVwcywKLSMgaW5jbHVkZSBmaWxlcyBhbmQgc291cmNlIGZpbGVzIHdpbGwgYmUgZm91bmQgd2hlbiBjb21waWxpbmcuCi0KLWV4cG9ydCBTQ0lURUNIPSRNR0xfUk9PVCAKLQotIyBUaGUgU0NJVEVDSF9MSUIgdmFyaWFibGUgcG9pbnRzIHRvIHdoZXJlIHRoZSBTY2lUZWNoIGxpYnJhcmllcyBsaXZlCi0jIGZvciBpbnN0YWxsYXRpb24gYW5kIGxpbmtpbmcuIFRoaXMgYWxsb3dzIHlvdSB0byBoYXZlIHRoZSBzb3VyY2UgYW5kCi0jIGluY2x1ZGUgZmlsZXMgb24gbG9jYWwgbWFjaGluZXMgZm9yIGNvbXBpbGluZyBhbmQgaGF2ZSB0aGUgbGlicmFyaWVzCi0jIGxvY2F0ZWQgb24gYSBjb21tb24gbmV0d29yayBtYWNoaW5lIChmb3IgbmV0d29yayBidWlsZHMpLgotCi1leHBvcnQgU0NJVEVDSF9MSUI9JFNDSVRFQ0gKLQotIyBUaGUgUFJJVkFURSB2YXJpYWJsZSBwb2ludHMgdG8gd2hlcmUgcHJpdmF0ZSBzb3VyY2UgZmlsZXMgcmVzaWRlIHRoYXQKLSMgZG8gbm90IGxpdmUgaW4gdGhlIHB1YmxpYyBzb3VyY2UgdHJlZQotCi1leHBvcnQgUFJJVkFURT0kSE9NRS9wcml2YXRlCi0KLSMgVGhlIGZvbGxvd2luZyBkZWZpbmUgdGhlIGxvY2F0aW9ucyBvZiBhbGwgdGhlIGNvbXBpbGVycyB0aGF0IHlvdSBtYXkKLSMgYmUgdXNpbmcuIENoYW5nZSB0aGVtIHRvIHJlZmxlY3Qgd2hlcmUgeW91IGhhdmUgaW5zdGFsbGVkIHlvdXIKLSMgY29tcGlsZXJzLgotCi1leHBvcnQgV0MxMF9QQVRIPS91c3Ivd2F0Y29tLzEwLjYvdXNyCi0KLSMgQWRkIHRoZSBTY2l0ZWNoIGJpbiBwYXRoIHRvIHRoZSBjdXJyZW50IFBBVEgKLWV4cG9ydCBQQVRIPSRTQ0lURUNIL2JpbjokU0NJVEVDSC9iaW4tcW54OiRQQVRICmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9zZXQtdmFycy5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi9zZXQtdmFycy5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJhMjEwMWQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vc2V0LXZhcnMuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLUBlY2hvIG9mZgotUkVNOj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJFTTogTWFzdGVyIGJhdGNoIGZpbGUgdG8gc2V0IHVwIGFsbCBuZWNlc3NhcnkgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvcgotUkVNOiB0aGUgU2NpVGVjaCBtYWtlZmlsZSB1dGlsaXRpZXMuIFRoaXMgYmF0Y2ggZmlsZSBzaG91bGQgYmUgZXhlY3V0ZWQKLVJFTTogKmZpcnN0KiBiZWZvcmUgYW55IG90aGVyIGJhdGNoIGZpbGVzIHdoZW4geW91IHN0YXJ0IGEgY29tbWFuZCBzaGVsbC4KLVJFTTogWW91IHNob3VsZCBub3QgbmVlZCB0byBtb2RpZnkgYW55IGJhdGNoIGZpbGVzIGV4Y2VwdCB0aGlzIG9uZSB0bwotUkVNOiBjb25maWd1cmUgdGhlIG1ha2VmaWxlIHV0aWxpdGllcy4KLVJFTTo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVJFTTogU2V0IHRoZSBwbGFjZSB3aGVyZSBTY2lUZWNoIFNvZnR3YXJlIGlzIGluc3RhbGxlZCwgYW5kIHdoZXJlIGVhY2gKLVJFTTogb2YgdGhlIHN1cHBvcnRlZCBjb21waWxlcnMgaXMgaW5zdGFsbGVkLiBUaGVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLVJFTTogYXJlIHVzZWQgYnkgdGhlIGJhdGNoIGZpbGVzIGluIHRoZSBTQ0lURUNIXEJJTiBkaXJlY3RvcnkuCi1SRU06Ci1SRU06IE1vZGlmeSB0aGUgYXMgYXBwcm9wcmlhdGUgZm9yIHlvdXIgY29tcGlsZXIgY29uZmlndXJhdGlvbiAoeW91IHNob3VsZAotUkVNOiBvbmx5IG5lZWQgdG8gY2hhbmdlIHRoaW5ncyBpbiB0aGlzIGJhdGNoIGZpbGUpLgotUkVNOgotUkVNOiBUaGlzIHZlcnNpb24gaXMgZm9yIGEgbm9ybWFsIE1TRE9TIGluc3RhbGxhdGlvbi4KLQotUkVNOiBUaGUgU0NJVEVDSCB2YXJpYWJsZSBwb2ludHMgdG8gd2hlcmUgYmF0Y2ggZmlsZXMsIG1ha2VmaWxlIHN0YXJ0dXBzLAotUkVNOiBpbmNsdWRlIGZpbGVzIGFuZCBzb3VyY2UgZmlsZXMgd2lsbCBiZSBmb3VuZCB3aGVuIGNvbXBpbGluZy4KLQotU0VUIFNDSVRFQ0g9Yzpcc2NpdGVjaAotCi1SRU06IFRoZSBTQ0lURUNIX0xJQiB2YXJpYWJsZSBwb2ludHMgdG8gd2hlcmUgdGhlIFNjaVRlY2ggbGlicmFyaWVzIGxpdmUKLVJFTTogZm9yIGluc3RhbGxhdGlvbiBhbmQgbGlua2luZy4gVGhpcyBhbGxvd3MgeW91IHRvIGhhdmUgdGhlIHNvdXJjZSBhbmQKLVJFTTogaW5jbHVkZSBmaWxlcyBvbiBsb2NhbCBtYWNoaW5lcyBmb3IgY29tcGlsaW5nIGFuZCBoYXZlIHRoZSBsaWJyYXJpZXMKLVJFTTogbG9jYXRlZCBvbiBhIGNvbW1vbiBuZXR3b3JrIG1hY2hpbmUgKGZvciBuZXR3b3JrIGJ1aWxkcykuCi0KLVNFVCBTQ0lURUNIX0xJQj0lU0NJVEVDSCUKLQotUkVNOiBUaGUgUFJJVkFURSB2YXJpYWJsZSBwb2ludHMgdG8gd2hlcmUgcHJpdmF0ZSBzb3VyY2UgZmlsZXMgcmVzaWRlIHRoYXQKLVJFTTogZG8gbm90IGxpdmUgaW4gdGhlIHB1YmxpYyBzb3VyY2UgdHJlZQotCi1TRVQgUFJJVkFURT1jOlxwcml2YXRlCi0KLVJFTTogVGhlIGZvbGxvd2luZyBzZXRzIHVwIHRoZSBwYXRoIHRvIHRoZSBTY2lUZWNoIGNvbW1hbmQgbGluZSB1dGlsaXRpZXMKLVJFTTogZm9yIHRoZSBkZXZlbG9wbWVudCBvcGVyYXRpbmcgc3lzdGVtLiBXZSBzZWxlY3QgZWl0aGVyIERPUyBob3N0ZWQKLVJFTTogdG9vbHMgb3IgV2luMzIgaG9zdGVkIHRvb2xzIGRlcGVuZGluZyBvbiB3aGV0aGVyIHlvdSBhcmUgcnVubmluZwotUkVNOiBvbiBOVCBvciBub3QuIFdpbmRvd3MgOXggdXNlcnMgY2FuIHVzZSB0aGUgV2luMzIgaG9zdGVkIHRvb2xzIGJ1dAotUkVNOiB0aGV5IHJ1biBzbG93ZXIsIGJ1dCB5b3Ugd2lsbCBoYXZlIGxvbmcgZmlsZW5hbWVzIGlmIHlvdSBkbyB0aGlzLgotCi1JRiAuJU9TJT09LldpbmRvd3NfTlQgZ290byBXaW4zMl9wYXRoCi1JRiBOT1QgLiVXSU5ESVIlPT0uIGdvdG8gV2luMzJfcGF0aAotU0VUIFNDSVRFQ0hfQklOPSVTQ0lURUNIJVxiaW47JVNDSVRFQ0glXGJpbi1kb3MKLWdvdG8gcGF0aF9zZXQKLQotUkVNOiBUaGUgZm9sbG93aW5nIHNldHMgdXAgdGhlIHBhdGggdG8gdGhlIFNjaVRlY2ggY29tbWFuZCBsaW5lIHV0aWxpdGllcwotUkVNOiBmb3IgdGhlIGRldmVsb3BtZW50IG9wZXJhdGluZyBzeXN0ZW0uIFRoaXMgdmVyc2lvbiB1c2VzIHRoZSBXaW4zMgotUkVNOiBob3N0ZWQgdG9vbHMgYnkgZGVmYXVsdCwgc28geW91IGNhbiB1c2UgbG9uZyBmaWxlbmFtZXMuCi0KLTpXaW4zMl9wYXRoCi1TRVQgU0NJVEVDSF9CSU49JVNDSVRFQ0glXGJpbjslU0NJVEVDSCVcYmluLXdpbjMyCi0KLTpwYXRoX3NldAotCi1SRU06IFNldCB0aGUgVE1QIHZhcmlhYmxlIGZvciBkbWFrZSBpZiB0aGlzIGlzIG5vdCBhbHJlYWR5IHNldAotCi1TRVQgVE1QPSVTQ0lURUNIJQotCi1SRU06IFNldCB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHVzZSB0aGUgTmV0d2lkZSBBc3NlbWJsZXIKLVJFTTogKE5BU00pIHByb3ZpZGVkIHdpdGggdGhlIE1HTCB0b29scyB0byBidWlsZCBhbGwgYXNzZW1ibGVyIG1vZHVsZXMuCi1SRU06IElmIHlvdSBoYXZlIFR1cmJvIEFzc2VtYmxlciA0LjAgb3IgbGF0ZXIgYW5kIHlvdSB3aXNoIHRvIHVzZSBpdCwKLVJFTTogeW91IGNhbiB1c2UgaXQgYnkgcmVtb3ZpbmcgdGhlIGZvbGxvd2luZyBsaW5lLgotCi1TRVQgVVNFX05BU009MQotCi1SRU06IFRoZSBmb2xsb3dpbmcgaXMgdXNlZCB0byBzZXQgdXAgRERLIGRpcmVjdG9yaWVzIGZvciBkZXZpY2UgZHJpdmVyCi1SRU06IGRldmVsb3BtZW50LiBUaGV5IGNhbiBzYWZlbHkgYmUgaWdub3JlZCB1bmxlc3MgeW91IGFyZSB1c2luZyB0aGUKLVJFTTogU2NpVGVjaCBtYWtlZmlsZSB1dGlsaXRpZXMgdG8gYnVpbGQgZGV2aWNlIGRyaXZlcnMuCi0KLVNFVCBEREtEUklWRT1jOgotU0VUIE1TU0RLPWM6XGNcd2luMzJzZGsKLVNFVCBXOTVfRERLUk9PVD1jOlxjXDk1ZGRrCi1TRVQgVzk4X0RES1JPT1Q9YzpcY1w5OGRkawotU0VUIE5UX0RES1JPT1Q9YzpcY1xudGRkawotU0VUIFcyS19EREtST09UPWM6XGNcMjAwMGRkawotU0VUIE1BU01fUk9PVD1jOlxjXG1hc202MTEKLVNFVCBWVE9PTFNEPWM6XGNcdnRkOTUKLVNFVCBTT0ZUSUNFX1BBVEg9YzpcY1xzaW50Ci0KLVJFTTogVGhlIGZvbGxvd2luZyBkZWZpbmUgdGhlIGxvY2F0aW9ucyBvZiBhbGwgdGhlIGNvbXBpbGVycyB0aGF0IHlvdSBtYXkKLVJFTTogYmUgdXNpbmcuIENoYW5nZSB0aGVtIHRvIHJlZmxlY3Qgd2hlcmUgeW91IGhhdmUgaW5zdGFsbGVkIHlvdXIKLVJFTTogY29tcGlsZXJzLgotCi1TRVQgQkMzX1BBVEg9YzpcY1xiYzMKLVNFVCBCQzRfUEFUSD1jOlxjXGJjNDUKLVNFVCBCQzVfUEFUSD1jOlxjXGJjNTAKLVNFVCBCQ0I1X1BBVEg9YzpcY1xiY2I1MAotU0VUIFZDX1BBVEg9YzpcY1xtc3ZjCi1TRVQgVkM0X1BBVEg9YzpcY1x2YzQyCi1TRVQgVkM1X1BBVEg9YzpcY1x2YzUwCi1TRVQgVkM2X1BBVEg9YzpcY1x2YzYwCi1TRVQgU0M3MF9QQVRIPWM6XGNcc2M3NQotU0VUIFdDMTBBX1BBVEg9YzpcY1x3YzEwYQotU0VUIFdDMTBfUEFUSD1jOlxjXHdjMTAKLVNFVCBXQzExX1BBVEg9YzpcY1x3YzExCi1TRVQgVE5UX1BBVEg9YzpcY1x0bnQKLVNFVCBESl9QQVRIPWM6XGNcZGpncHAKLVNFVCBHQ0MyX1BBVEg9YzpcdW5peFx1c3IKLQotUkVNOiBUaGUgZm9sbG93aW5nIGRlZmluZSB0aGUgbG9jYXRpb25zIG9mIHRoZSBJREUgYW5kIGNvbXBpbGVyIHBhdGgKLVJFTTogdG9vbHMgZm9yIFZpc3VhbCBDKysuIElmIHlvdSBkbyBhIHN0YW5kYXJkIGluc3RhbGxhdGlvbiwgeW91IHdvbnQKLVJFTTogbmVlZCB0byBjaGFuZ2UgdGhpcy4gSWYgaG93ZXZlciB5b3UgZGlkIGEgY3VzdG9tIGluc3RhbGwgYW5kIGNoYW5nZWQKLVJFTTogdGhlIHBhdGhzIHRvIHRoZXNlIGRpcmVjdG9yeSwgeW91IHdpbGwgbmVlZCB0byBtb2RpZnkgdGhpcyB0byBzdWl0LgotCi1TRVQgVkM1X01TRGV2RGlyPSVWQzVfUEFUSCVcc2hhcmVkaWRlCi1TRVQgVkM1X01TVkNEaXI9JVZDNV9QQVRIJVx2YwotU0VUIFZDNl9NU0RldkRpcj0lVkM2X1BBVEglXGNvbW1vblxtc2Rldjk4Ci1TRVQgVkM2X01TVkNEaXI9JVZDNl9QQVRIJVx2Yzk4Ci0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtYzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtYzMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzFmN2Q4ZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLWMzMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNC4yIDMyIGJpdCBlZGl0aW9uCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXFZDNDslVkM0X1BBVEglXExJQjslVE5UX1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4zMlxWQzQ7JVZDNF9QQVRIJVxMSUI7JVROVF9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLXNldCBUT09MUk9PVERJUj0lVkM0X1BBVEglCi1zZXQgQ19JTkNMVURFPSVWQzRfUEFUSCVcSU5DTFVERTslVE5UX1BBVEglXElOQ0xVREU7Ci1zZXQgSU5DTFVERT0uO0lOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUNfSU5DTFVERSUKLXNldCBJTklUPSVWQzRfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0xCi1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX05URFJWPQotU0VUIFVTRV9SVFRBUkdFVD0KLVNFVCBVU0VfU05BUD0KLVNFVCBWQ19MSUJCQVNFPVZDNAotUEFUSCAlU0NJVEVDSF9CSU4lOyVWQzRfUEFUSCVcQklOOyVUTlRfUEFUSCVcQklOOyVERUZQQVRIJSVWQzMyX0NEX1BBVEglCi0KLVJFTTogRW5hYmxlIFdpbjMyIFNESyBpZiBkZXNpcmVkIChzZGsgb24gY29tbWFuZCBsaW5lKQotaWYgTk9UIC4lMSU9PS5zZGsgZ290byBkb25lCi1jYWxsIHdpbjMyc2RrLmJhdAotCi06ZG9uZQotZWNobyBWaXN1YWwgQysrIDQuMiAzMiBiaXQgV2luZG93cyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtZDE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtZDE2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTgxNzQ5My4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLWQxNi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgMS41MmMgMTYgYml0IGVkaXRpb24KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMTZcVkM0OyVWQ19QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMTZcVkM0OyVWQ19QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLXNldCBUT09MUk9PVERJUj0lVkNfUEFUSCUKLXNldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslVkNfUEFUSCVcSU5DTFVERTsKLXNldCBJTklUPSVWQ19QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzE2Lk1LCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfUlRUQVJHRVQ9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVkNfTElCQkFTRT1WQzQKLVBBVEggJVNDSVRFQ0hfQklOJTslVkNfUEFUSCVcQklOOyVERUZQQVRIJSVWQ19DRF9QQVRIJQotCi1lY2hvIFZpc3VhbCBDKysgMS41MmMgMTYgRE9TIGJpdCBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCi0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtZHJ2OXguYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC1kcnY5eC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyZTM1MjEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC1kcnY5eC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNC4yIDMyIGJpdCBlZGl0aW9uCi0KLVJFTTogRmlyc3Qgc2V0dXAgZm9yIFdpbjMyIGNvbnNvbGUgZGV2ZWxvcG1lbnQKLWNhbGwgdmM0MC1jMzIuYmF0ID4gTlVMCi0KLVJFTTogRXh0cmEgc3R1ZmYgdG8gc2V0IHVwIGZvciBXaW5kb3dzIDl4IERESyBkZXZlbG9wbWVudAotc2V0IE1BU1RFUl9NQUtFPTEKLXNldCBEREtST09UPSVXOTVfRERLUk9PVCUKLXNldCBTREtST09UPSVNU1NESyUKLXNldCBDMTZfUk9PVD0lVkNfUEFUSCUKLXNldCBDMzJfUk9PVD0lVkM0X1BBVEglCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIGRvbmUKLTpjaGVja2VkX2J1aWxkCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gZG9uZQotOmRvbmUKLWVjaG8gVmlzdWFsIEMrKyA0LjIgV2luZG93cyA5eCBkcml2ZXIgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLWRydm50LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtZHJ2bnQuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4M2I2NzgwLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtZHJ2bnQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDQuMiAzMiBiaXQgZWRpdGlvbgotCi1SRU06IEZpcnN0IHNldHVwIGZvciBXaW4zMiBjb25zb2xlIGRldmVsb3BtZW50ICh3aXRoIFBsYXRmb3JtIFNESykKLWNhbGwgdmM0MC1jMzIuYmF0IHNkayA+IE5VTAotCi1SRU06IEV4dHJhIHN0dWZmIHRvIHNldCB1cCBmb3IgV2luZG93cyBOVCBEREsgZGV2ZWxvcG1lbnQKLVNFVCBCQVNFRElSPSVOVF9EREtST09UJQotU0VUIFBBVEg9JU5UX0RES1JPT1QlXGJpbjslUEFUSCUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gZG9uZQotOmNoZWNrZWRfYnVpbGQKLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBkb25lCi06ZG9uZQotZWNobyBWaXN1YWwgQysrIDQuMiBXaW5kb3dzIE5UIGRyaXZlciBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtc25wLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtc25wLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzk5NzA0NC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLXNucC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNC4yIDMyIGJpdCBlZGl0aW9uCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFNOQVBcVkM0OyVWQzRfUEFUSCVcTElCOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFNOQVBcVkM0OyVWQzRfUEFUSCVcTElCOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1zZXQgVE9PTFJPT1RESVI9JVZDNF9QQVRIJQotc2V0IElOQ0xVREU9LjtJTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFCi1zZXQgSU5JVD0lVkM0X1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFZDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX05URFJWPQotU0VUIFVTRV9SVFRBUkdFVD0KLVNFVCBVU0VfU05BUD0xCi1TRVQgVkNfTElCQkFTRT1WQzQKLVBBVEggJVNDSVRFQ0hfQklOJTslVkM0X1BBVEglXEJJTjslVE5UX1BBVEglXEJJTjslREVGUEFUSCUlVkMzMl9DRF9QQVRIJQotCi1lY2hvIFZpc3VhbCBDKysgNC4yIFNuYXAgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCi0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtdG50LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNDAtdG50LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjBmYzkzNi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLXRudC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNC4yIDMyIGJpdCBlZGl0aW9uCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzMyXFZDNDslVkM0X1BBVEglXExJQjslVE5UX1BBVEglXENPRkZMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMzJcVkM0OyVWQzRfUEFUSCVcTElCOyVUTlRfUEFUSCVcQ09GRkxJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotc2V0IFRPT0xST09URElSPSVWQzRfUEFUSCUKLXNldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslVkM0X1BBVEglXElOQ0xVREU7JVROVF9QQVRIJVxJTkNMVURFOwotc2V0IElOSVQ9JVZDNF9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzMyLk1LCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX05URFJWPQotU0VUIFVTRV9SVFRBUkdFVD0KLVNFVCBVU0VfU05BUD0KLVNFVCBWQ19MSUJCQVNFPVZDNAotUEFUSCAlU0NJVEVDSF9CSU4lOyVWQzRfUEFUSCVcQklOOyVUTlRfUEFUSCVcQklOOyVERUZQQVRIJSVWQzMyX0NEX1BBVEglCi0KLVJFTSBJZiB5b3Ugc2V0IHRoZSBmb2xsb3dpbmcgdG8gYSAxLCBhIFROVCBEb3NTdHlsZSBhcHAgd2lsbCBiZSBjcmVhdGVkLgotUkVNIE90aGVyd2lzZSBhIFROVCBOdFN0eWxlIGFwcCB3aWxsIGJlIGNyZWF0ZWQuIE50U3R5bGUgYXBwcyB3aWxsICpvbmx5KgotUkVNIHJ1biB1bmRlciByZWFsIERPUyB3aGVuIHVzaW5nIG91ciBsaWJyYXJpZXMsIHNpbmNlIHdlIHJlcXVpcmUgYWNjZXNzCi1SRU0gdG8gZnVuY3Rpb25zIHRoYXQgdGhlIFdpbjMyIEFQSSBkb2VzIG5vdCBzdXBwb3J0IChzdWNoIGFzIGRpcmVjdCBhY2Nlc3MKLVJFTSB0byB2aWRlbyBtZW1vcnksIGNhbGxpbmcgSW50IDEwaCBCSU9TIGZ1bmN0aW9ucyBldGMpLiBEb3NTdHlsZSBhcHBzCi1SRU0gd2lsbCBob3dldmVyIHJ1biBmaW5lIGluIGJvdGggRE9TIGFuZCBhIFdpbjk1IERPUyBib3ggKE5UIERPUyBib3hlcyBkb24ndAotUkVNIHdvcmsgdG9vIHdlbGwpLgotUkVNCi1SRU0gSWYgeW91IGFyZSB1c2luZyB0aGUgUmVhbFRpbWUgRE9TIGV4dGVuZGVyLCB5b3VyIGFwcHMgKm11c3QqIGJlIE50U3R5bGUsCi1SRU0gYW5kIGhlbmNlIHdpbGwgbmV2ZXIgYmUgYWJsZSB0byBydW4gdW5kZXIgV2luOTUgb3IgV2luTlQsIG9ubHkgRE9TLgotCi1TRVQgRE9TU1RZTEU9Ci0KLWVjaG8gVmlzdWFsIEMrKyA0LjIgMzItYml0IERPUyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAgKFROVCkuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLXcxNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLXcxNi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI4NDlhMjAuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC13MTYuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDEuNTJjIDE2IGJpdCBlZGl0aW9uCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjE2XFZDNDslVkNfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjE2XFZDNDslVkNfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1zZXQgVE9PTFJPT1RESVI9JVZDX1BBVEglCi1zZXQgSU5DTFVERT0uO0lOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVZDX1BBVEglXElOQ0xVREU7Ci1zZXQgSU5JVD0lVkNfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMxNi5NSwotU0VUIFVTRV9XSU4xNj0xCi1TRVQgVVNFX1dJTjMyPQotU0VUIFZDX0xJQkJBU0U9VkM0Ci1TRVQgVVNFX1JUVEFSR0VUPQotU0VUIFVTRV9TTkFQPQotUEFUSCAlU0NJVEVDSF9CSU4lOyVWQ19QQVRIJVxCSU47JURFRlBBVEglJVZDX0NEX1BBVEglCi0KLWVjaG8gVmlzdWFsIEMrKyAxLjUyYyAxNiBiaXQgV2luZG93cyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLXczMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLXczMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ5M2E2MjQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC13MzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDQuMiAzMiBiaXQgZWRpdGlvbgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4zMlxWQzQ7JVZDNF9QQVRIJVxMSUI7JVROVF9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMzJcVkM0OyVWQzRfUEFUSCVcTElCOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1zZXQgVE9PTFJPT1RESVI9JVZDNF9QQVRIJQotc2V0IENfSU5DTFVERT0lVkM0X1BBVEglXElOQ0xVREU7JVROVF9QQVRIJVxJTkNMVURFOwotc2V0IElOQ0xVREU9LjtJTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVDX0lOQ0xVREUlCi1zZXQgSU5JVD0lVkM0X1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFZDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9MQotU0VUIFdJTjMyX0dVST0xCi1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfTlREUlY9Ci1TRVQgVVNFX1JUVEFSR0VUPQotU0VUIFVTRV9TTkFQPQotU0VUIFZDX0xJQkJBU0U9VkM0Ci1QQVRIICVTQ0lURUNIX0JJTiU7JVZDNF9QQVRIJVxCSU47JVROVF9QQVRIJVxCSU47JURFRlBBVEglJVZDMzJfQ0RfUEFUSCUKLQotUkVNOiBFbmFibGUgV2luMzIgU0RLIGlmIGRlc2lyZWQgKHNkayBvbiBjb21tYW5kIGxpbmUpCi1pZiBOT1QgLiUxJT09LnNkayBnb3RvIGRvbmUKLWNhbGwgd2luMzJzZGsuYmF0Ci0KLTpkb25lCi1lY2hvIFZpc3VhbCBDKysgNC4yIDMyIGJpdCBXaW5kb3dzIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cAotCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLXgxMS5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzQwLXgxMS5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE0MjBhNTQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM0MC14MTEuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDQuMiAzMiBiaXQgZWRpdGlvbgotCi1TRVQgTElCPSVWQzRfUEFUSCVcTElCOy4KLVNFVCBUT09MUk9PVERJUj0lVkM0X1BBVEglCi1TRVQgSU5DTFVERT1ceGNcaW5jbHVkZTslVkM0X1BBVEglXElOQ0xVREUKLVNFVCBJTklUPSVWQzRfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0xCi1TRVQgV0lOMzJfR1VJPTEKLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9OVERSVj0KLVNFVCBVU0VfUlRUQVJHRVQ9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVkNfTElCQkFTRT1WQzQKLVBBVEggJVNDSVRFQ0hfQklOJTslVkM0X1BBVEglXEJJTjslREVGUEFUSCUKLQotZWNobyBWaXN1YWwgQysrIDQuMiBYMTEgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLWMzMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLWMzMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyZDI3YjkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1jMzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDUuMCAzMiBiaXQgZWRpdGlvbgotCi1TRVQgTVNEZXZEaXI9JVZDNV9NU0RldkRpciUKLVNFVCBNU1ZDRGlyPSVWQzVfTVNWQ0RpciUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcVkM1OyVNU1ZDRGlyJVxMSUI7JVROVF9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMzJcVkM1OyVNU1ZDRGlyJVxMSUI7JVROVF9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLXNldCBUT09MUk9PVERJUj0lTVNWQ0RpciUKLXNldCBDX0lOQ0xVREU9JU1TVkNEaXIlXElOQ0xVREU7JVROVF9QQVRIJVxJTkNMVURFOwotc2V0IElOQ0xVREU9LjtJTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVDX0lOQ0xVREUlCi1zZXQgSU5JVD0lTVNWQ0RpciUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0xCi1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX05URFJWPQotU0VUIFVTRV9SVFRBUkdFVD0KLVNFVCBVU0VfU05BUD0KLVNFVCBWQ19MSUJCQVNFPXZjNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVNU1ZDRGlyJVxCSU47JU1TRGV2RGlyJVxCSU47JVROVF9QQVRIJVxCSU47JURFRlBBVEglJVZDMzJfQ0RfUEFUSCUKLQotUkVNOiBFbmFibGUgV2luMzIgU0RLIGlmIGRlc2lyZWQgKHNkayBvbiBjb21tYW5kIGxpbmUpCi1pZiBOT1QgLiUxJT09LnNkayBnb3RvIGRvbmUKLWNhbGwgd2luMzJzZGsuYmF0Ci0KLTpkb25lCi1lY2hvIFZpc3VhbCBDKysgNS4wIDMyLWJpdCBXaW5kb3dzIGNvbnNvbGUgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLWQxNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLWQxNi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM3ODljNTAuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1kMTYuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDEuNTJjIDE2IGJpdCBlZGl0aW9uCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzE2XFZDNTslVkNfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzE2XFZDNTslVkNfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1zZXQgVE9PTFJPT1RESVI9JVZDX1BBVEglCi1zZXQgSU5DTFVERT0uO0lOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVZDX1BBVEglXElOQ0xVREU7Ci1zZXQgSU5JVD0lVkNfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMxNi5NSwotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1JUVEFSR0VUPQotU0VUIFVTRV9TTkFQPQotU0VUIFZDX0xJQkJBU0U9dmM1Ci1QQVRIICVTQ0lURUNIX0JJTiU7JVZDX1BBVEglXEJJTjslREVGUEFUSCUlVkNfQ0RfUEFUSCUKLQotZWNobyBWaXN1YWwgQysrIDEuNTJjIDE2LWJpdCBET1MgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1kcnY5eC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLWRydjl4LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjdhNGExNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLWRydjl4LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA2LjAgMzIgYml0IGVkaXRpb24KLQotUkVNOiBGaXJzdCBzZXR1cCBmb3IgV2luMzIgY29uc29sZSBkZXZlbG9wbWVudAotY2FsbCB2YzYwLWMzMi5iYXQgPiBOVUwKLQotUkVNOiBFeHRyYSBzdHVmZiB0byBzZXQgdXAgZm9yIFdpbmRvd3MgOXggRERLIGRldmVsb3BtZW50Ci1zZXQgTUFTVEVSX01BS0U9MQotc2V0IERES1JPT1Q9JVc5NV9EREtST09UJQotc2V0IFNES1JPT1Q9JU1TU0RLJQotc2V0IEMxNl9ST09UPSVWQ19QQVRIJQotc2V0IEMzMl9ST09UPSVWQzZfUEFUSCUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gZG9uZQotOmNoZWNrZWRfYnVpbGQKLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBkb25lCi06ZG9uZQotZWNobyBWaXN1YWwgQysrIDYuMCBXaW5kb3dzIDl4IGRyaXZlciBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtZHJ2bnQuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1kcnZudC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE3YjJmMjUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1kcnZudC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNi4wIDMyIGJpdCBlZGl0aW9uCi0KLVJFTTogRmlyc3Qgc2V0dXAgZm9yIFdpbjMyIGNvbnNvbGUgZGV2ZWxvcG1lbnQgKHdpdGggUGxhdGZvcm0gU0RLKQotY2FsbCB2YzYwLWMzMi5iYXQgc2RrID4gTlVMCi0KLVJFTTogTm93IHNldHVwIHN0dWZmIGZvciB0aGUgTlQgRERLIGJ1aWxkIGVudmlyb25tZW50Ci1jYWxsIG50ZGRrLmJhdAotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBkb25lCi06Y2hlY2tlZF9idWlsZAotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIGRvbmUKLTpkb25lCi1lY2hvIFZpc3VhbCBDKysgNi4wIFdpbmRvd3MgTlQgZHJpdmVyIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1ydHQuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1ydHQuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZmIyZmIxLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtcnR0LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA1LjAgMzIgYml0IGVkaXRpb24KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcVkM1OyVWQzVfUEFUSCVcVkNcTElCOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXFZDNTslVkM1X1BBVEglXFZDXExJQjslVE5UX1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotc2V0IFRPT0xST09URElSPSVWQzVfUEFUSCVcVkMKLXNldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslVkM1X1BBVEglXFZDXElOQ0xVREU7JVROVF9QQVRIJVxJTkNMVURFOwotc2V0IElOSVQ9JVZDNV9QQVRIJVxWQwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzMyLk1LCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9OVERSVj0KLVNFVCBVU0VfUlRUQVJHRVQ9MQotU0VUIFVTRV9TTkFQPQotU0VUIFZDX0xJQkJBU0U9dmM1Ci1QQVRIICVTQ0lURUNIX0JJTiU7JVZDNV9QQVRIJVxWQ1xCSU47JVZDNV9QQVRIJVxTSEFSRURJREVcQklOOyVUTlRfUEFUSCVcQklOOyVERUZQQVRIJSVWQzMyX0NEX1BBVEglCi0KLWVjaG8gVmlzdWFsIEMrKyA1LjAgUlRUYXJnZXQtMzIgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLXNucC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLXNucC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIyZDJlMTMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC1zbnAuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotQGVjaG8gb2ZmIFJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNS4wIDMyIGJpdAotZWRpdGlvbgotCi1TRVQgTVNEZXZEaXI9JVZDNV9NU0RldkRpciUKLVNFVCBNU1ZDRGlyPSVWQzVfTVNWQ0RpciUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcU05BUFxWQzU7JU1TVkNEaXIlXExJQjslVE5UX1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xTTkFQXFZDNTslTVNWQ0RpciVcTElCOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1zZXQgVE9PTFJPT1RESVI9JU1TVkNEaXIlCi1zZXQgSU5DTFVERT0uO0lOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREUKLXNldCBJTklUPSVNU1ZDRGlyJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzMyLk1LCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9OVERSVj0KLVNFVCBVU0VfUlRUQVJHRVQ9Ci1TRVQgVVNFX1NOQVA9MQotU0VUIFZDX0xJQkJBU0U9dmM1Ci1QQVRIICVTQ0lURUNIX0JJTiU7JU1TVkNEaXIlXEJJTjslTVNEZXZEaXIlXEJJTjslVE5UX1BBVEglXEJJTjslREVGUEFUSCUlVkMzMl9DRF9QQVRIJQotCi1lY2hvIFZpc3VhbCBDKysgNS4wIFNuYXAgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLXRudC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLXRudC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZiMDkxOTkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC10bnQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDUuMCAzMiBiaXQgZWRpdGlvbgotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MzMlxWQzU7JVZDNV9QQVRIJVxWQ1xMSUI7JVROVF9QQVRIJVxDT0ZGTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMzJcVkM1OyVWQzVfUEFUSCVcVkNcTElCOyVUTlRfUEFUSCVcQ09GRkxJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotc2V0IFRPT0xST09URElSPSVWQzVfUEFUSCVcVkMKLXNldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslVkM1X1BBVEglXFZDXElOQ0xVREU7JVROVF9QQVRIJVxJTkNMVURFOwotc2V0IElOSVQ9JVZDNV9QQVRIJVxWQwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzMyLk1LCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX05URFJWPQotU0VUIFVTRV9SVFRBUkdFVD0KLVNFVCBVU0VfU05BUD0KLVNFVCBWQ19MSUJCQVNFPXZjNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVWQzVfUEFUSCVcVkNcQklOOyVWQzVfUEFUSCVcU0hBUkVESURFXEJJTjslVE5UX1BBVEglXEJJTjslREVGUEFUSCUlVkMzMl9DRF9QQVRIJQotCi1SRU0gSWYgeW91IHNldCB0aGUgZm9sbG93aW5nIHRvIGEgMSwgYSBUTlQgRG9zU3R5bGUgYXBwIHdpbGwgYmUgY3JlYXRlZC4KLVJFTSBPdGhlcndpc2UgYSBUTlQgTnRTdHlsZSBhcHAgd2lsbCBiZSBjcmVhdGVkLiBOdFN0eWxlIGFwcHMgd2lsbCAqb25seSoKLVJFTSBydW4gdW5kZXIgcmVhbCBET1Mgd2hlbiB1c2luZyBvdXIgbGlicmFyaWVzLCBzaW5jZSB3ZSByZXF1aXJlIGFjY2VzcwotUkVNIHRvIGZ1bmN0aW9ucyB0aGF0IHRoZSBXaW4zMiBBUEkgZG9lcyBub3Qgc3VwcG9ydCAoc3VjaCBhcyBkaXJlY3QgYWNjZXNzCi1SRU0gdG8gdmlkZW8gbWVtb3J5LCBjYWxsaW5nIEludCAxMGggQklPUyBmdW5jdGlvbnMgZXRjKS4gRG9zU3R5bGUgYXBwcwotUkVNIHdpbGwgaG93ZXZlciBydW4gZmluZSBpbiBib3RoIERPUyBhbmQgYSBXaW45NSBET1MgYm94IChOVCBET1MgYm94ZXMgZG9uJ3QKLVJFTSB3b3JrIHRvbyB3ZWxsKS4KLVJFTQotUkVNIElmIHlvdSBhcmUgdXNpbmcgdGhlIFJlYWxUaW1lIERPUyBleHRlbmRlciwgeW91ciBhcHBzICptdXN0KiBiZSBOdFN0eWxlLAotUkVNIGFuZCBoZW5jZSB3aWxsIG5ldmVyIGJlIGFibGUgdG8gcnVuIHVuZGVyIFdpbjk1IG9yIFdpbk5ULCBvbmx5IERPUy4KLQotU0VUIERPU1NUWUxFPQotCi1lY2hvIFZpc3VhbCBDKysgNS4wIDMyLWJpdCBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAgKHdpdGggVE5UKS4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtdzE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtdzE2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTJhYjQ5NS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLXcxNi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgMS41MmMgMTYgYml0IGVkaXRpb24KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMTZcVkM1OyVWQ19QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMTZcVkM1OyVWQ19QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLXNldCBUT09MUk9PVERJUj0lVkNfUEFUSCUKLXNldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslVkNfUEFUSCVcSU5DTFVERTsKLXNldCBJTklUPSVWQ19QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzE2Lk1LCi1TRVQgVVNFX1dJTjE2PTEKLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1JUVEFSR0VUPQotU0VUIFVTRV9TTkFQPQotU0VUIFZDX0xJQkJBU0U9dmM1Ci1QQVRIICVTQ0lURUNIX0JJTiU7JVZDX1BBVEglXEJJTjslREVGUEFUSCUlVkNfQ0RfUEFUSCUKLQotZWNobyBWaXN1YWwgQysrIDEuNTJjIDE2LWJpdCBXaW5kb3dzIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC13MzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM1MC13MzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwN2JjNWU1Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAtdzMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA1LjAgMzIgYml0IGVkaXRpb24KLQotU0VUIE1TRGV2RGlyPSVWQzVfTVNEZXZEaXIlCi1TRVQgTVNWQ0Rpcj0lVkM1X01TVkNEaXIlCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXFZDNTslTVNWQ0RpciVcTElCOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXFZDNTslTVNWQ0RpciVcTElCOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1zZXQgVE9PTFJPT1RESVI9JU1TVkNEaXIlCi1zZXQgQ19JTkNMVURFPSVNU1ZDRGlyJVxJTkNMVURFOyVUTlRfUEFUSCVcSU5DTFVERTsKLXNldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQ19JTkNMVURFJQotc2V0IElOSVQ9JU1TVkNEaXIlCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFZDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9MQotU0VUIFdJTjMyX0dVST0xCi1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfTlREUlY9Ci1TRVQgVVNFX1JUVEFSR0VUPQotU0VUIFVTRV9TTkFQPQotU0VUIFZDX0xJQkJBU0U9dmM1Ci1QQVRIICVTQ0lURUNIX0JJTiU7JU1TVkNEaXIlXEJJTjslTVNEZXZEaXIlXEJJTjslVE5UX1BBVEglXEJJTjslREVGUEFUSCUlVkMzMl9DRF9QQVRIJQotCi1SRU06IEVuYWJsZSBXaW4zMiBTREsgaWYgZGVzaXJlZCAoc2RrIG9uIGNvbW1hbmQgbGluZSkKLWlmIE5PVCAuJTElPT0uc2RrIGdvdG8gZG9uZQotY2FsbCB3aW4zMnNkay5iYXQKLQotOmRvbmUKLWVjaG8gVmlzdWFsIEMrKyA1LjAgMzItYml0IFdpbmRvd3MgY29uc29sZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAteDExLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNTAteDExLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmUyODZiZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzUwLXgxMS5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNS4wIDMyIGJpdCBlZGl0aW9uCi0KLVNFVCBMSUI9JVZDNV9QQVRIJVxWQ1xMSUI7LgotU0VUIFRPT0xST09URElSPSVWQzVfUEFUSCVcVkMKLVNFVCBJTkNMVURFPVx4Y1xpbmNsdWRlOyVWQzVfUEFUSCVcVkNcSU5DTFVERQotU0VUIElOSVQ9JVZDNV9QQVRIJVxWQwotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzMyLk1LCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPTEKLVNFVCBXSU4zMl9HVUk9MQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX05URFJWPQotU0VUIFVTRV9SVFRBUkdFVD0KLVNFVCBVU0VfU05BUD0KLVNFVCBWQ19MSUJCQVNFPXZjNQotUEFUSCAlU0NJVEVDSF9CSU4lOyVWQzVfUEFUSCVcVkNcQklOOyVWQzVfUEFUSCVcU0hBUkVESURFXEJJTjslREVGUEFUSCUKLQotZWNobyBWaXN1YWwgQysrIDUuMCBYMTEgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLWMzMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLWMzMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5ODQxN2QuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC1jMzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDYuMCAzMiBiaXQgZWRpdGlvbgotCi1TRVQgTVNEZXZEaXI9JVZDNl9NU0RldkRpciUKLVNFVCBNU1ZDRGlyPSVWQzZfTVNWQ0RpciUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcVkM2OyVNU1ZDRGlyJVxMSUI7JVROVF9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMzJcVkM2OyVNU1ZDRGlyJVxMSUI7JVROVF9QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLXNldCBUT09MUk9PVERJUj0lTVNWQ0RpciUKLXNldCBDX0lOQ0xVREU9JU1TVkNEaXIlXElOQ0xVREU7JVROVF9QQVRIJVxJTkNMVURFCi1zZXQgSU5DTFVERT0uO0lOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUNfSU5DTFVERSUKLXNldCBJTklUPSVNU1ZDRGlyJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzMyLk1LCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPTEKLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfTlREUlY9Ci1TRVQgVVNFX1JUVEFSR0VUPQotU0VUIFVTRV9TTkFQPQotU0VUIFZDX0xJQkJBU0U9dmM2Ci1QQVRIICVTQ0lURUNIX0JJTiU7JU1TVkNEaXIlXEJJTjslTVNEZXZEaXIlXEJJTjslVE5UX1BBVEglXEJJTjslREVGUEFUSCUlVkMzMl9DRF9QQVRIJQotCi1SRU06IEVuYWJsZSBXaW4zMiBTREsgaWYgZGVzaXJlZCAoc2RrIG9uIGNvbW1hbmQgbGluZSkKLWlmIE5PVCAuJTElPT0uc2RrIGdvdG8gZG9uZQotY2FsbCB3aW4zMnNkay5iYXQKLQotOmRvbmUKLWVjaG8gVmlzdWFsIEMrKyA2LjAgMzItYml0IFdpbmRvd3MgY29uc29sZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtZDE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtZDE2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTA4NTVlMC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLWQxNi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgMS41MmMgMTYgYml0IGVkaXRpb24KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMTZcVkM2OyVWQ19QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMTZcVkM2OyVWQ19QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLXNldCBUT09MUk9PVERJUj0lVkNfUEFUSCUKLXNldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslVkNfUEFUSCVcSU5DTFVERTsKLXNldCBJTklUPSVWQ19QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzE2Lk1LCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfUlRUQVJHRVQ9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVkNfTElCQkFTRT12YzYKLVBBVEggJVNDSVRFQ0hfQklOJTslVkNfUEFUSCVcQklOOyVERUZQQVRIJSVWQ19DRF9QQVRIJQotCi1lY2hvIFZpc3VhbCBDKysgMS41MmMgMTYtYml0IERPUyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLWRydjl4LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtZHJ2OXguYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyN2E0YTE0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtZHJ2OXguYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDYuMCAzMiBiaXQgZWRpdGlvbgotCi1SRU06IEZpcnN0IHNldHVwIGZvciBXaW4zMiBjb25zb2xlIGRldmVsb3BtZW50Ci1jYWxsIHZjNjAtYzMyLmJhdCA+IE5VTAotCi1SRU06IEV4dHJhIHN0dWZmIHRvIHNldCB1cCBmb3IgV2luZG93cyA5eCBEREsgZGV2ZWxvcG1lbnQKLXNldCBNQVNURVJfTUFLRT0xCi1zZXQgRERLUk9PVD0lVzk1X0RES1JPT1QlCi1zZXQgU0RLUk9PVD0lTVNTREslCi1zZXQgQzE2X1JPT1Q9JVZDX1BBVEglCi1zZXQgQzMyX1JPT1Q9JVZDNl9QQVRIJQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBkb25lCi06Y2hlY2tlZF9idWlsZAotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIGRvbmUKLTpkb25lCi1lY2hvIFZpc3VhbCBDKysgNi4wIFdpbmRvd3MgOXggZHJpdmVyIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC1kcnZudC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLWRydm50LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTdiMmYyNS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLWRydm50LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA2LjAgMzIgYml0IGVkaXRpb24KLQotUkVNOiBGaXJzdCBzZXR1cCBmb3IgV2luMzIgY29uc29sZSBkZXZlbG9wbWVudCAod2l0aCBQbGF0Zm9ybSBTREspCi1jYWxsIHZjNjAtYzMyLmJhdCBzZGsgPiBOVUwKLQotUkVNOiBOb3cgc2V0dXAgc3R1ZmYgZm9yIHRoZSBOVCBEREsgYnVpbGQgZW52aXJvbm1lbnQKLWNhbGwgbnRkZGsuYmF0Ci0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIGRvbmUKLTpjaGVja2VkX2J1aWxkCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gZG9uZQotOmRvbmUKLWVjaG8gVmlzdWFsIEMrKyA2LjAgV2luZG93cyBOVCBkcml2ZXIgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLWRydncyay5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLWRydncyay5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYzMDQyOTMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC1kcnZ3MmsuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBWaXN1YWwgQysrIDYuMCAzMiBiaXQgZWRpdGlvbgotCi1SRU06IEZpcnN0IHNldHVwIGZvciBXaW4zMiBjb25zb2xlIGRldmVsb3BtZW50ICh3aXRoIFBsYXRmb3JtIFNESykKLWNhbGwgdmM2MC1jMzIuYmF0IHNkayA+IE5VTAotCi1SRU06IE5vdyBzZXR1cCBzdHVmZiBmb3IgdGhlIE5UIERESyBidWlsZCBlbnZpcm9ubWVudAotY2FsbCB3MmtkZGsuYmF0Ci0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIGRvbmUKLTpjaGVja2VkX2J1aWxkCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gZG9uZQotOmRvbmUKLWVjaG8gVmlzdWFsIEMrKyA2LjAgV2luZG93cyBXaW5kb3dzIDIwMDAgZHJpdmVyIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC1zbnAuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC1zbnAuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MzQ4ZWY5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtc25wLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA2LjAgMzIgYml0IGVkaXRpb24KLQotU0VUIE1TRGV2RGlyPSVWQzZfTVNEZXZEaXIlCi1TRVQgTVNWQ0Rpcj0lVkM2X01TVkNEaXIlCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFNOQVBcVkM2OyVNU1ZDRGlyJVxMSUI7JVROVF9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcU05BUFxWQzY7JU1TVkNEaXIlXExJQjslVE5UX1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotc2V0IFRPT0xST09URElSPSVNU1ZDRGlyJQotc2V0IElOQ0xVREU9LjtJTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFCi1zZXQgSU5JVD0lTVNWQ0RpciUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfTlREUlY9Ci1TRVQgVVNFX1JUVEFSR0VUPQotU0VUIFVTRV9TTkFQPTEKLVNFVCBWQ19MSUJCQVNFPXZjNgotUEFUSCAlU0NJVEVDSF9CSU4lOyVNU1ZDRGlyJVxCSU47JU1TRGV2RGlyJVxCSU47JVROVF9QQVRIJVxCSU47JURFRlBBVEglJVZDMzJfQ0RfUEFUSCUKLQotZWNobyBWaXN1YWwgQysrIDYuMCBTbmFwIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC10bnQuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC10bnQuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZDhiNWUzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtdG50LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA2LjAgMzIgYml0IGVkaXRpb24KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMzJcVkM2OyVWQzZfUEFUSCVcVkM5OFxMSUI7JVROVF9QQVRIJVxDT0ZGTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMzJcVkM2OyVWQzZfUEFUSCVcVkM5OFxMSUI7JVROVF9QQVRIJVxDT0ZGTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1zZXQgVE9PTFJPT1RESVI9JVZDNl9QQVRIJVxWQzk4Ci1zZXQgSU5DTFVERT0uO0lOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVZDNl9QQVRIJVxWQzk4XElOQ0xVREU7JVROVF9QQVRIJVxJTkNMVURFOwotc2V0IElOSVQ9JVZDNl9QQVRIJVxWQzk4Ci1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFZDMzIuTUsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1ZYRD0KLVNFVCBVU0VfTlREUlY9Ci1TRVQgVVNFX1JUVEFSR0VUPQotU0VUIFVTRV9TTkFQPQotU0VUIFZDX0xJQkJBU0U9dmM2IFBBVEgKLSVTQ0lURUNIX0JJTiU7JVZDNl9QQVRIJVxWQzk4XEJJTjslVkM2X1BBVEglXENPTU1PTlxNU0RFVjk4XEJJTjslVE5UX1BBVEglXEJJTjslREVGUEFUSCUlVkMzMl9DRF9QQVRIJQotCi1SRU0gSWYgeW91IHNldCB0aGUgZm9sbG93aW5nIHRvIGEgMSwgYSBUTlQgRG9zU3R5bGUgYXBwIHdpbGwgYmUgY3JlYXRlZC4KLVJFTSBPdGhlcndpc2UgYSBUTlQgTnRTdHlsZSBhcHAgd2lsbCBiZSBjcmVhdGVkLiBOdFN0eWxlIGFwcHMgd2lsbCAqb25seSoKLVJFTSBydW4gdW5kZXIgcmVhbCBET1Mgd2hlbiB1c2luZyBvdXIgbGlicmFyaWVzLCBzaW5jZSB3ZSByZXF1aXJlIGFjY2VzcwotUkVNIHRvIGZ1bmN0aW9ucyB0aGF0IHRoZSBXaW4zMiBBUEkgZG9lcyBub3Qgc3VwcG9ydCAoc3VjaCBhcyBkaXJlY3QgYWNjZXNzCi1SRU0gdG8gdmlkZW8gbWVtb3J5LCBjYWxsaW5nIEludCAxMGggQklPUyBmdW5jdGlvbnMgZXRjKS4gRG9zU3R5bGUgYXBwcwotUkVNIHdpbGwgaG93ZXZlciBydW4gZmluZSBpbiBib3RoIERPUyBhbmQgYSBXaW45NSBET1MgYm94IChOVCBET1MgYm94ZXMgZG9uJ3QKLVJFTSB3b3JrIHRvbyB3ZWxsKS4KLVJFTQotUkVNIElmIHlvdSBhcmUgdXNpbmcgdGhlIFJlYWxUaW1lIERPUyBleHRlbmRlciwgeW91ciBhcHBzICptdXN0KiBiZSBOdFN0eWxlLAotUkVNIGFuZCBoZW5jZSB3aWxsIG5ldmVyIGJlIGFibGUgdG8gcnVuIHVuZGVyIFdpbjk1IG9yIFdpbk5ULCBvbmx5IERPUy4KLQotU0VUIERPU1NUWUxFPQotCi1lY2hvIFZpc3VhbCBDKysgNi4wIDMyLWJpdCBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAgKHdpdGggVE5UKS4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtdzE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtdzE2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzAxNzVjMy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLXcxNi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgMS41MmMgMTYgYml0IGVkaXRpb24KLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMTZcVkM2OyVWQ19QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLXNldCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMTZcVkM2OyVWQ19QQVRIJVxMSUI7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLXNldCBUT09MUk9PVERJUj0lVkNfUEFUSCUKLXNldCBJTkNMVURFPS47SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslVkNfUEFUSCVcSU5DTFVERTsKLXNldCBJTklUPSVWQ19QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzE2Lk1LCi1TRVQgVVNFX1dJTjE2PTEKLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1JUVEFSR0VUPQotU0VUIFVTRV9TTkFQPQotU0VUIFZDX0xJQkJBU0U9dmM2Ci1QQVRIICVTQ0lURUNIX0JJTiU7JVZDX1BBVEglXEJJTjslREVGUEFUSCUlVkNfQ0RfUEFUSCUKLQotZWNobyBWaXN1YWwgQysrIDEuNTJjIDE2LWJpdCBXaW5kb3dzIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC13MzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdmM2MC13MzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZjhlN2FiLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAtdzMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgVmlzdWFsIEMrKyA2LjAgMzIgYml0IGVkaXRpb24KLQotU0VUIE1TRGV2RGlyPSVWQzZfTVNEZXZEaXIlCi1TRVQgTVNWQ0Rpcj0lVkM2X01TVkNEaXIlCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotc2V0IExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjMyXFZDNjslTVNWQ0RpciVcTElCOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1zZXQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXFZDNjslTVNWQ0RpciVcTElCOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1zZXQgVE9PTFJPT1RESVI9JU1TVkNEaXIlCi1zZXQgQ19JTkNMVURFPSVNU1ZDRGlyJVxJTkNMVURFOyVUTlRfUEFUSCVcSU5DTFVERQotc2V0IElOQ0xVREU9LjtJTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVDX0lOQ0xVREUlCi1zZXQgSU5JVD0lTVNWQ0RpciUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcVkMzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0xCi1TRVQgV0lOMzJfR1VJPTEKLVNFVCBVU0VfVlhEPQotU0VUIFVTRV9OVERSVj0KLVNFVCBVU0VfUlRUQVJHRVQ9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVkNfTElCQkFTRT12YzYKLVBBVEggJVNDSVRFQ0hfQklOJTslTVNWQ0RpciVcQklOOyVNU0RldkRpciVcQklOOyVUTlRfUEFUSCVcQklOOyVERUZQQVRIJSVWQzMyX0NEX1BBVEglCi0KLVJFTTogRW5hYmxlIFdpbjMyIFNESyBpZiBkZXNpcmVkIChzZGsgb24gY29tbWFuZCBsaW5lKQotaWYgTk9UIC4lMSU9PS5zZGsgZ290byBkb25lCi1jYWxsIHdpbjMyc2RrLmJhdAotCi06ZG9uZQotZWNobyBWaXN1YWwgQysrIDYuMCAzMi1iaXQgV2luZG93cyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAteDExLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3ZjNjAteDExLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTdiMjNkMi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi92YzYwLXgxMS5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIFZpc3VhbCBDKysgNi4wIDMyIGJpdCBlZGl0aW9uCi0KLVNFVCBMSUI9JVZDNl9QQVRIJVxWQzk4XExJQjsuCi1TRVQgVE9PTFJPT1RESVI9JVZDNl9QQVRIJVxWQzk4Ci1TRVQgSU5DTFVERT1ceGNcaW5jbHVkZTslVkM2X1BBVEglXFZDOThcSU5DTFVERTsKLVNFVCBJTklUPSVWQzZfUEFUSCVcVkM5OAotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xWQzMyLk1LCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPTEKLVNFVCBXSU4zMl9HVUk9MQotU0VUIFVTRV9WWEQ9Ci1TRVQgVVNFX05URFJWPQotU0VUIFVTRV9SVFRBUkdFVD0KLVNFVCBVU0VfU05BUD0KLVNFVCBWQ19MSUJCQVNFPXZjNgotUEFUSCAlU0NJVEVDSF9CSU4lOyVWQzZfUEFUSCVcVkM5OFxCSU47JVZDNl9QQVRIJVxDT01NT05cTVNERVY5OFxCSU47JURFRlBBVEglCi0KLWVjaG8gVmlzdWFsIEMrKyA2LjAgWDExIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdzJrZGRrLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3cya2Rkay5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyODU4ZDEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vdzJrZGRrLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLUBlY2hvIG9mZgotUkVNOiBTZXQgdXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBNaWNyb3NvZnQgV2luZG93cyBOVCBEREsgZGV2ZWxvcG1lbnQuCi1SRU06IE5vdGUgdGhhdCB3ZSBoYXZlIGhhcmQgY29kZWQgdGhpcyBmb3IgV2luZG93cyBOVCBpMzg2IGRldmVsb3BtZW50LgotCi1TRVQgVVNFX05URFJWPTEKLVNFVCBVU0VfVzJLRFJWPTEKLVNFVCBCQVNFRElSPSVXMktfRERLUk9PVCUKLVNFVCBQQVRIPSVCQVNFRElSJVxiaW47JVBBVEglCi1TRVQgTlRNQUtFRU5WPSVCQVNFRElSJVxpbmMKLVNFVCBCVUlMRF9NQUtFX1BST0dSQU09bm1ha2UuZXhlCi1TRVQgQlVJTERfREVGQVVMVD0tZWkgLW5tYWtlIC1pCi1TRVQgQlVJTERfREVGQVVMVF9UQVJHRVRTPS0zODYKLVNFVCBfT0JKX0RJUj1vYmoKLVNFVCBORVdfQ1JUUz0xCi1TRVQgX05UUk9PVD0lQkFTRURJUiUKLVNFVCBJTkNMVURFPSVCQVNFRElSJVxpbmM7JUJBU0VESVIlXGluY1xkZGs7JUlOQ0xVREUlCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZAotCi1SRU06IHNldCB1cCBhbiBOVCBmcmVlIGJ1aWxkIGVudmlyb25tZW50Ci1TRVQgRERLQlVJTERFTlY9ZnJlZQotU0VUIENfREVGSU5FUz0tRF9JRFdCVUlMRAotU0VUIE5UREJHRklMRVM9MQotU0VUIE5UREVCVUc9Ci1TRVQgTlRERUJVR1RZUEU9Ci1TRVQgTVNDX09QVElNSVpBVElPTj0KLXNldCBMSUI9JUJBU0VESVIlXGxpYmZyZVxpMzg2OyVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcVzJLRFJWXFZDNjslTVNWQ0RpciVcTElCOy4KLQotZ290byBkb25lCi0KLTpjaGVja2VkCi0KLVJFTTogc2V0IHVwIGFuIE5UIGNoZWNrZWQgYnVpbGQgZW52aXJvbm1lbnQKLVNFVCBEREtCVUlMREVOVj1jaGVja2VkCi1TRVQgQ19ERUZJTkVTPS1EX0lEV0JVSUxEIC1EUkRSREJHIC1EU1JWREJHCi1TRVQgTlREQkdGSUxFUz0KLVNFVCBOVERFQlVHPW50c2QKLVNFVCBOVERFQlVHVFlQRT1ib3RoCi1TRVQgTVNDX09QVElNSVpBVElPTj0vT2QgL09pCi1zZXQgTElCPSVCQVNFRElSJVxsaWJjaGtcaTM4NjslU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXMktEUlZcVkM2OyVNU1ZDRGlyJVxMSUI7LgotCi06ZG9uZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1jMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1jMzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDczOGYzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtYzMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTAuNiBpbiAzMiBiaXQgbW9kZQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4zMlxXQzEwOyVXQzEwX1BBVEglXExJQjM4NjslV0MxMF9QQVRIJVxMSUIzODZcTlQ7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMzJcV0MxMDslV0MxMF9QQVRIJVxMSUIzODY7JVdDMTBfUEFUSCVcTElCMzg2XE5UOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzEwX1BBVEglXEVEREFUCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVXQzEwX1BBVEglXEg7JVdDMTBfUEFUSCVcSFxOVDsKLVNFVCBXQVRDT009JVdDMTBfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1gzMj0KLVNFVCBVU0VfWDMyVk09Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0xCi1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX09TMjE2PQotU0VUIFVTRV9PUzIzMj0KLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIFVTRV9RTlg0PQotU0VUIFdDX0xJQkJBU0U9V0MxMAotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwX1BBVEglXEJJTk5UOyVXQzEwX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLWVjaG8gV2F0Y29tIEMvQysrIDEwLjYgV2luMzIgY29uc29sZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtZDE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtZDE2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWM1M2E5MC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLWQxNi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjYgaW4gMzIgYml0IG1vZGUgKERPUzRHVykKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMTZcV0MxMDsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MxNlxXQzEwOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzEwX1BBVEglXEVEREFUCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVXQzEwX1BBVEglXEg7JVdDMTBfUEFUSCVcSFxXSU47Ci1TRVQgV0FUQ09NPSVXQzEwX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMTYuTUsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBVU0VfUU5YND0KLVNFVCBXQ19MSUJCQVNFPVdDMTAKLVNFVCBFRFBBVEg9JVdDMTBfUEFUSCVcRUREQVQKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMF9QQVRIJVxCSU5OVDslV0MxMF9QQVRIJVxCSU5XOyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMC42IDE2LWJpdCBET1MgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1kMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1kMzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNWM3MjEwLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtZDMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTAuNiBpbiAzMiBiaXQgbW9kZSAoRE9TNEdXKQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MzMlxXQzEwOyVXQzEwX1BBVEglXExJQjM4NjslV0MxMF9QQVRIJVxMSUIzODZcRE9TOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzMyXFdDMTA7JVdDMTBfUEFUSCVcTElCMzg2OyVXQzEwX1BBVEglXExJQjM4NlxET1M7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTBfUEFUSCVcRUREQVQKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVdDMTBfUEFUSCVcSDsKLVNFVCBXQVRDT009JVdDMTBfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1gzMj0KLVNFVCBVU0VfWDMyVk09Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfV0lOMzg2PQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBVU0VfUU5YND0KLVNFVCBXQ19MSUJCQVNFPVdDMTAKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMF9QQVRIJVxCSU5OVDslV0MxMF9QQVRIJVxCSU5XOyVESl9QQVRIJVxCSU47JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLWVjaG8gV2F0Y29tIEMvQysrIDEwLjYgMzItYml0IERPUyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAgKERPUzRHVykKLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1vMTYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1vMTYuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NzlkZWNlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtbzE2LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTAuNiBpbiAxNi1iaXQgT1MvMiBtb2RlCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXGxpYlxyZWxlYXNlXG9zMjE2XHdjMTA7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxsaWJcZGVidWdcb3MyMTZcd2MxMDsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMF9QQVRIJVxlZGRhdAotU0VUIElOQ0xVREU9aW5jbHVkZTslU0NJVEVDSCVcaW5jbHVkZTslUFJJVkFURSVcaW5jbHVkZTslV0MxMF9QQVRIJVxoXG9zMjslV0MxMF9QQVRIJVxoCi1TRVQgV0FUQ09NPSVXQzEwX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXG1ha2VkZWZzXHdjMTYubWsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgVVNFX09TMjE2PTEKLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBVU0VfUU5YND0KLVNFVCBXQ19MSUJCQVNFPXdjMTAKLVNFVCBFRFBBVEg9JVdDMTBfUEFUSCVcRUREQVQKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMF9QQVRIJVxCSU5OVDslV0MxMF9QQVRIJVxCSU5XOyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMC42IDE2LWJpdCBPUy8yIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtbzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtbzMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzQwNGI0Mi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLW8zMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjYgaW4gMzItYml0IE9TLzIgbW9kZQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxsaWJccmVsZWFzZVxvczIzMlx3YzEwOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcbGliXGRlYnVnXG9zMjMyXHdjMTA7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTBfUEFUSCVcZWRkYXQKLVNFVCBJTkNMVURFPWluY2x1ZGU7JVNDSVRFQ0glXGluY2x1ZGU7JVBSSVZBVEUlXGluY2x1ZGU7JVdDMTBfUEFUSCVcaFxvczI7JVdDMTBfUEFUSCVcaAotU0VUIFdBVENPTT0lV0MxMF9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxtYWtlZGVmc1x3YzMyLm1rCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfV0lOMzg2PQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9MQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVVNFX1FOWDQ9Ci1TRVQgV0NfTElCQkFTRT13YzEwCi1TRVQgRURQQVRIPSVXQzEwX1BBVEglXEVEREFUCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBfUEFUSCVcQklOTlQ7JVdDMTBfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTAuNiAzMi1iaXQgT1MvMiBjb25zb2xlIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtcDMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtcDMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTcwNTdkZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXAzMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjYgaW4gMzItYml0IE9TLzIgbW9kZQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxsaWJccmVsZWFzZVxvczIzMlx3YzEwOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcbGliXGRlYnVnXG9zMjMyXHdjMTA7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTBfUEFUSCVcZWRkYXQKLVNFVCBJTkNMVURFPWluY2x1ZGU7JVNDSVRFQ0glXGluY2x1ZGU7JVBSSVZBVEUlXGluY2x1ZGU7JVdDMTBfUEFUSCVcaFxvczI7JVdDMTBfUEFUSCVcaAotU0VUIFdBVENPTT0lV0MxMF9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxtYWtlZGVmc1x3YzMyLm1rCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfV0lOMzg2PQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9MQotU0VUIFVTRV9PUzJHVUk9MQotU0VUIFVTRV9TTkFQPQotU0VUIFVTRV9RTlg0PQotU0VUIFdDX0xJQkJBU0U9d2MxMAotU0VUIEVEUEFUSD0lV0MxMF9QQVRIJVxFRERBVAotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwX1BBVEglXEJJTk5UOyVXQzEwX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLWVjaG8gV2F0Y29tIEMvQysrIDEwLjYgMzItYml0IE9TLzIgR1VJIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtcW54LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtcW54LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDZmODY1OS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXFueC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjYgaW4gMzIgYml0IG1vZGUgKFFOWCA0KQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxRTlg0XFdDMTA7JVdDMTBfUEFUSCVcTElCMzg2OyVXQzEwX1BBVEglXExJQjM4NlxRTlg7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcUU5YNFxXQzEwOyVXQzEwX1BBVEglXExJQjM4NjslV0MxMF9QQVRIJVxMSUIzODZcUU5YOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzEwX1BBVEglXEVEREFUCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVXQzEwX1BBVEglXFFIOwotU0VUIFdBVENPTT0lV0MxMF9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzMyLk1LCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfWDMyPQotU0VUIFVTRV9YMzJWTT0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgVVNFX09TMjE2PQotU0VUIFVTRV9PUzIzMj0KLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIFVTRV9RTlg0PTEKLVNFVCBXQ19MSUJCQVNFPVdDMTAKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMF9QQVRIJVxCSU5OVDslV0MxMF9QQVRIJVxCSU5XOyVESl9QQVRIJVxCSU47JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLWVjaG8gV2F0Y29tIEMvQysrIDEwLjYgMzItYml0IFFOWCBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAKLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1zbnAuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC1zbnAuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZmRlNjI0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtc25wLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTAuNiBpbiAzMiBiaXQgbW9kZQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxTTkFQXFdDMTA7JVdDMTBfUEFUSCVcTElCMzg2OyVXQzEwX1BBVEglXExJQjM4NlxOVDsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xTTkFQXFdDMTA7JVdDMTBfUEFUSCVcTElCMzg2OyVXQzEwX1BBVEglXExJQjM4NlxOVDsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMF9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMF9QQVRIJVxICi1TRVQgV0FUQ09NPSVXQzEwX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9YMzI9Ci1TRVQgVVNFX1gzMlZNPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX09TMjE2PQotU0VUIFVTRV9PUzIzMj0KLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPTEKLVNFVCBVU0VfUU5YND0KLVNFVCBXQ19MSUJCQVNFPVdDMTAKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMF9QQVRIJVxCSU5OVDslV0MxMF9QQVRIJVxCSU5XOyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMC42IFNuYXAgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXRudC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXRudC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQxMmYwNDIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC10bnQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC42IGluIDMyIGJpdCBtb2RlIHdpdGggUGhhciBMYXAgVE5UCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzMyXFdDMTA7JVdDMTBfUEFUSCVcTElCMzg2OyVXQzEwX1BBVEglXExJQjM4NlxET1M7JVROVF9QQVRIJVxMSUI7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMzJcV0MxMDslV0MxMF9QQVRIJVxMSUIzODY7JVdDMTBfUEFUSCVcTElCMzg2XERPUzslVE5UX1BBVEglXExJQjsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMF9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMF9QQVRIJVxIOyVXQzEwX1BBVEglXEhcTlQ7JVROVF9QQVRIJVxJTkNMVURFCi1TRVQgV0FUQ09NPSVXQzEwX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMzIuTUsKLVNFVCBVU0VfVE5UPTEKLVNFVCBVU0VfWDMyPQotU0VUIFVTRV9YMzJWTT0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgVVNFX09TMjE2PQotU0VUIFVTRV9PUzIzMj0KLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIFVTRV9RTlg0PQotU0VUIFdDX0xJQkJBU0U9V0MxMAotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwX1BBVEglXEJJTk5UOyVXQzEwX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLVJFTSBJZiB5b3Ugc2V0IHRoZSBmb2xsb3dpbmcgdG8gYSAxLCBhIFROVCBEb3NTdHlsZSBhcHAgd2lsbCBiZSBjcmVhdGVkLgotUkVNIE90aGVyd2lzZSBhIFROVCBOdFN0eWxlIGFwcCB3aWxsIGJlIGNyZWF0ZWQuIE50U3R5bGUgYXBwcyB3aWxsICpvbmx5KgotUkVNIHJ1biB1bmRlciByZWFsIERPUyB3aGVuIHVzaW5nIG91ciBsaWJyYXJpZXMsIHNpbmNlIHdlIHJlcXVpcmUgYWNjZXNzCi1SRU0gdG8gZnVuY3Rpb25zIHRoYXQgdGhlIFdpbjMyIEFQSSBkb2VzIG5vdCBzdXBwb3J0IChzdWNoIGFzIGRpcmVjdCBhY2Nlc3MKLVJFTSB0byB2aWRlbyBtZW1vcnksIGNhbGxpbmcgSW50IDEwaCBCSU9TIGZ1bmN0aW9ucyBldGMpLiBEb3NTdHlsZSBhcHBzCi1SRU0gd2lsbCBob3dldmVyIHJ1biBmaW5lIGluIGJvdGggRE9TIGFuZCBhIFdpbjk1IERPUyBib3ggKE5UIERPUyBib3hlcyBkb24ndAotUkVNIHdvcmsgdG9vIHdlbGwpLgotUkVNCi1SRU0gSWYgeW91IGFyZSB1c2luZyB0aGUgUmVhbFRpbWUgRE9TIGV4dGVuZGVyLCB5b3VyIGFwcHMgKm11c3QqIGJlIE50U3R5bGUsCi1SRU0gYW5kIGhlbmNlIHdpbGwgbmV2ZXIgYmUgYWJsZSB0byBydW4gdW5kZXIgV2luOTUgb3IgV2luTlQsIG9ubHkgRE9TLgotCi1TRVQgRE9TU1RZTEU9MQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMC42IDMyLWJpdCBET1MgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwIChUTlQpLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC13MTYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC13MTYuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOGJhODcxLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtdzE2LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTAuNiBpbiAxNiBiaXQgV2luZG93cyBtb2RlCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFdJTjE2XFdDMTA7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMTZcV0MxMDsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMF9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMF9QQVRIJVxIOyVXQzEwX1BBVEglXEhcV0lOOwotU0VUIFdBVENPTT0lV0MxMF9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzE2Lk1LCi1TRVQgVVNFX1dJTjE2PTEKLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVVNFX1FOWDQ9Ci1TRVQgV0NfTElCQkFTRT1XQzEwCi1TRVQgRURQQVRIPSVXQzEwX1BBVEglXEVEREFUCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBfUEFUSCVcQklOTlQ7JVdDMTBfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTAuNiAxNi1iaXQgV2luZG93cyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCi0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtdzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTAtdzMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODM5YmRkZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXczMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjYgaW4gMzIgYml0IG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcV0MxMDslV0MxMF9QQVRIJVxMSUIzODY7JVdDMTBfUEFUSCVcTElCMzg2XE5UOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXFdDMTA7JVdDMTBfUEFUSCVcTElCMzg2OyVXQzEwX1BBVEglXExJQjM4NlxOVDsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMF9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMF9QQVRIJVxIOyVXQzEwX1BBVEglXEhcTlQ7Ci1TRVQgV0FUQ09NPSVXQzEwX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9YMzI9Ci1TRVQgVVNFX1gzMlZNPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9MQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgV0lOMzJfR1VJPTEKLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVVNFX1FOWDQ9Ci1TRVQgV0NfTElCQkFTRT1XQzEwCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBfUEFUSCVcQklOTlQ7JVdDMTBfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTAuNiBXaW4zMiBHVUkgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXgxMS5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwLXgxMS5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZjNzgzZDguLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMC14MTEuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC42IGluIDMyIGJpdCBtb2RlCi0KLVNFVCBMSUI9JVdDMTBfUEFUSCVcTElCMzg2OyVXQzEwX1BBVEglXExJQjM4NlxOVDsuCi1TRVQgRURQQVRIPSVXQzEwX1BBVEglXEVEREFUCi1TRVQgSU5DTFVERT0lV0MxMF9QQVRIJVxIOyVXQzEwX1BBVEglXEhcTlQ7Ci1TRVQgV0FUQ09NPSVXQzEwX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9YMzI9Ci1TRVQgVVNFX1gzMlZNPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9MQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgV0lOMzJfR1VJPTEKLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVVNFX1FOWDQ9Ci1TRVQgV0NfTElCQkFTRT1XQzEwCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBfUEFUSCVcQklOTlQ7JVdDMTBfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTAuNiBYMTEgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYWMzMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYWMzMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZlMGMyNGQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGFjMzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC4wYSBpbiAzMiBiaXQgbW9kZQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4zMlxXQzEwQTslV0MxMEFfUEFUSCVcTElCMzg2OyVXQzEwQV9QQVRIJVxMSUIzODZcTlQ7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMzJcV0MxMEE7JVdDMTBBX1BBVEglXExJQjM4NjslV0MxMEFfUEFUSCVcTElCMzg2XE5UOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzEwQV9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMEFfUEFUSCVcSDslV0MxMEFfUEFUSCVcSFxOVDsKLVNFVCBXQVRDT009JVdDMTBBX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9YMzI9Ci1TRVQgVVNFX1gzMlZNPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9MQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBXQ19MSUJCQVNFPVdDMTBBCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBBX1BBVEglXEJJTk5UOyVXQzEwQV9QQVRIJVxCSU5COyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMC4wYSBXaW4zMiBjb25zb2xlIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGFkMTYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGFkMTYuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOWVjYjY3Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhZDE2LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTAuMGEgaW4gMzIgYml0IG1vZGUgKERPUzRHVykKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMTZcV0MxMEE7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMTZcV0MxMEE7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTBBX1BBVEglXEVEREFUCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVXQzEwQV9QQVRIJVxIOyVXQzEwQV9QQVRIJVxIXFdJTjsKLVNFVCBXQVRDT009JVdDMTBBX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMTYuTUsKLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBXQ19MSUJCQVNFPVdDMTBBCi1TRVQgRURQQVRIPSVXQzEwQV9QQVRIJVxFRERBVAotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwQV9QQVRIJVxCSU5OVDslV0MxMEFfUEFUSCVcQklOQjslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTAuMGEgMTYtYml0IERPUyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYWQzMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYWQzMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ1MmI3OWEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGFkMzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC4wYSBpbiAzMiBiaXQgbW9kZSAoRE9TNEdXKQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MzMlxXQzEwQTslV0MxMEFfUEFUSCVcTElCMzg2OyVXQzEwQV9QQVRIJVxMSUIzODZcRE9TOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzMyXFdDMTBBOyVXQzEwQV9QQVRIJVxMSUIzODY7JVdDMTBBX1BBVEglXExJQjM4NlxET1M7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTBBX1BBVEglXEVEREFUCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVXQzEwQV9QQVRIJVxIOwotU0VUIFdBVENPTT0lV0MxMEFfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1gzMj0KLVNFVCBVU0VfWDMyVk09Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfV0lOMzg2PQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBXQ19MSUJCQVNFPVdDMTBBCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBBX1BBVEglXEJJTk5UOyVXQzEwQV9QQVRIJVxCSU5COyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMC4wYSAzMi1iaXQgRE9TIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cCAoRE9TNEdXKQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGFvMTYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGFvMTYuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTczNTFkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhbzE2LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTAuMGEgaW4gMTYtYml0IE9TLzIgbW9kZQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxsaWJccmVsZWFzZVxvczIxNlx3YzEwOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcbGliXGRlYnVnXG9zMjE2XHdjMTA7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTBBX1BBVEglXGVkZGF0Ci1TRVQgSU5DTFVERT1pbmNsdWRlOyVTQ0lURUNIJVxpbmNsdWRlOyVQUklWQVRFJVxpbmNsdWRlOyVXQzEwQV9QQVRIJVxoXG9zMjslV0MxMEFfUEFUSCVcaAotU0VUIFdBVENPTT0lV0MxMEFfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcbWFrZWRlZnNcd2MxNi5tawotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBVU0VfT1MyMTY9MQotU0VUIFVTRV9PUzIzMj0KLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIFdDX0xJQkJBU0U9d2MxMAotU0VUIEVEUEFUSD0lV0MxMEFfUEFUSCVcRUREQVQKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMEFfUEFUSCVcQklOTlQ7JVdDMTBBX1BBVEglXEJJTkI7JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLWVjaG8gV2F0Y29tIEMvQysrIDEwLjBhIDE2LWJpdCBPUy8yIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhbzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhbzMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjNjYWE1OS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYW8zMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjBhIGluIDMyLWJpdCBPUy8yIG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcbGliXHJlbGVhc2Vcb3MyMzJcd2MxMDsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXGxpYlxkZWJ1Z1xvczIzMlx3YzEwOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzEwQUFfUEFUSCVcZWRkYXQKLVNFVCBJTkNMVURFPWluY2x1ZGU7JVNDSVRFQ0glXGluY2x1ZGU7JVBSSVZBVEUlXGluY2x1ZGU7JVdDMTBBQV9QQVRIJVxoXG9zMjslV0MxMEFBX1BBVEglXGgKLVNFVCBXQVRDT009JVdDMTBBQV9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxtYWtlZGVmc1x3YzMyLm1rCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfV0lOMzg2PQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9MQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgV0NfTElCQkFTRT1XQzEwQQotU0VUIEVEUEFUSD0lV0MxMEFBX1BBVEglXEVEREFUCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBBQV9QQVRIJVxCSU5OVDslV0MxMEFBNl9QQVRIJVxCSU5COyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMC4wYSAzMi1iaXQgT1MvMiBjb25zb2xlIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhcDMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhcDMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGQyMWM2Mi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYXAzMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjBhIGluIDMyLWJpdCBPUy8yIG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcbGliXHJlbGVhc2Vcb3MyMzJcd2MxMDsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXGxpYlxkZWJ1Z1xvczIzMlx3YzEwOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzEwX1BBVEglXGVkZGF0Ci1TRVQgSU5DTFVERT1pbmNsdWRlOyVTQ0lURUNIJVxpbmNsdWRlOyVQUklWQVRFJVxpbmNsdWRlOyVXQzEwX1BBVEglXGhcb3MyOyVXQzEwX1BBVEglXGgKLVNFVCBXQVRDT009JVdDMTBfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcbWFrZWRlZnNcd2MzMi5tawotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPTEKLVNFVCBVU0VfT1MyR1VJPTEKLVNFVCBVU0VfU05BUD0KLVNFVCBXQ19MSUJCQVNFPVdDMTBBCi1TRVQgRURQQVRIPSVXQzEwX1BBVEglXEVEREFUCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBfUEFUSCVcQklOTlQ7JVdDMTBfUEFUSCVcQklOQjslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTAuMGEgMzItYml0IE9TLzIgR1VJIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhc25wLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhc25wLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjhmODU3Yy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYXNucC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjBhIGluIDMyIGJpdCBtb2RlCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXFNOQVBcV0MxMEE7JVdDMTBBX1BBVEglXExJQjM4NjslV0MxMEFfUEFUSCVcTElCMzg2XE5UOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFNOQVBcV0MxMEE7JVdDMTBBX1BBVEglXExJQjM4NjslV0MxMEFfUEFUSCVcTElCMzg2XE5UOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzEwQV9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERQotU0VUIFdBVENPTT0lV0MxMEFfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1gzMj0KLVNFVCBVU0VfWDMyVk09Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0xCi1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBXSU4zMl9HVUk9Ci1TRVQgVVNFX09TMjE2PQotU0VUIFVTRV9PUzIzMj0KLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPTEKLVNFVCBXQ19MSUJCQVNFPVdDMTBBCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTBBX1BBVEglXEJJTk5UOyVXQzEwQV9QQVRIJVxCSU5COyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMC4wYSBTbmFwIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGF0bnQuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGF0bnQuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMmIzMjE5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhdG50LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTAuMGEgaW4gMzIgYml0IG1vZGUgd2l0aCBQaGFyIExhcCBUTlQKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMzJcV0MxMEE7JVdDMTBBX1BBVEglXExJQjM4NjslV0MxMEFfUEFUSCVcTElCMzg2XERPUzslVE5UX1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MzMlxXQzEwQTslV0MxMEFfUEFUSCVcTElCMzg2OyVXQzEwQV9QQVRIJVxMSUIzODZcRE9TOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzEwQV9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMEFfUEFUSCVcSDslV0MxMEFfUEFUSCVcSFxOVDslVE5UX1BBVEglXElOQ0xVREUKLVNFVCBXQVRDT009JVdDMTBBX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMzIuTUsKLVNFVCBVU0VfVE5UPTEKLVNFVCBVU0VfWDMyPQotU0VUIFVTRV9YMzJWTT0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgVVNFX09TMjE2PQotU0VUIFVTRV9PUzIzMj0KLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIFdDX0xJQkJBU0U9V0MxMEEKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMEFfUEFUSCVcQklOTlQ7JVdDMTBBX1BBVEglXEJJTkI7JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLVJFTSBJZiB5b3Ugc2V0IHRoZSBmb2xsb3dpbmcgdG8gYSAxLCBhIFROVCBEb3NTdHlsZSBhcHAgd2lsbCBiZSBjcmVhdGVkLgotUkVNIE90aGVyd2lzZSBhIFROVCBOdFN0eWxlIGFwcCB3aWxsIGJlIGNyZWF0ZWQuIE50U3R5bGUgYXBwcyB3aWxsICpvbmx5KgotUkVNIHJ1biB1bmRlciByZWFsIERPUyB3aGVuIHVzaW5nIG91ciBsaWJyYXJpZXMsIHNpbmNlIHdlIHJlcXVpcmUgYWNjZXNzCi1SRU0gdG8gZnVuY3Rpb25zIHRoYXQgdGhlIFdpbjMyIEFQSSBkb2VzIG5vdCBzdXBwb3J0IChzdWNoIGFzIGRpcmVjdCBhY2Nlc3MKLVJFTSB0byB2aWRlbyBtZW1vcnksIGNhbGxpbmcgSW50IDEwaCBCSU9TIGZ1bmN0aW9ucyBldGMpLiBEb3NTdHlsZSBhcHBzCi1SRU0gd2lsbCBob3dldmVyIHJ1biBmaW5lIGluIGJvdGggRE9TIGFuZCBhIFdpbjk1IERPUyBib3ggKE5UIERPUyBib3hlcyBkb24ndAotUkVNIHdvcmsgdG9vIHdlbGwpLgotUkVNCi1SRU0gSWYgeW91IGFyZSB1c2luZyB0aGUgUmVhbFRpbWUgRE9TIGV4dGVuZGVyLCB5b3VyIGFwcHMgKm11c3QqIGJlIE50U3R5bGUsCi1SRU0gYW5kIGhlbmNlIHdpbGwgbmV2ZXIgYmUgYWJsZSB0byBydW4gdW5kZXIgV2luOTUgb3IgV2luTlQsIG9ubHkgRE9TLgotCi1TRVQgRE9TU1RZTEU9MQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMC4wYSAzMi1iaXQgRE9TIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cCAoVE5UKS4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhdzE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTBhdzE2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTQwMTFjYy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYXcxNi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDEwLjBhIGluIDE2IGJpdCBXaW5kb3dzIG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMTZcV0MxMEE7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMTZcV0MxMEE7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTBBX1BBVEglXEVEREFUCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVXQzEwQV9QQVRIJVxIOyVXQzEwQV9QQVRIJVxIXFdJTjsKLVNFVCBXQVRDT009JVdDMTBBX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMTYuTUsKLVNFVCBVU0VfV0lOMTY9MQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfV0lOMzg2PQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBXQ19MSUJCQVNFPVdDMTBBCi1TRVQgRURQQVRIPSVXQzEwQV9QQVRIJVxFRERBVAotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwQV9QQVRIJVxCSU5OVDslV0MxMEFfUEFUSCVcQklOQjslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTAuMGEgMTYtYml0IFdpbmRvd3MgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwLgotCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYXczMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzEwYXczMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFlMTRkYmMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMGF3MzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMC4wYSBpbiAzMiBiaXQgbW9kZQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4zMlxXQzEwQTslV0MxMEFfUEFUSCVcTElCMzg2OyVXQzEwQV9QQVRIJVxMSUIzODZcTlQ7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMzJcV0MxMEE7JVdDMTBBX1BBVEglXExJQjM4NjslV0MxMEFfUEFUSCVcTElCMzg2XE5UOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzEwQV9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMEFfUEFUSCVcSDslV0MxMEFfUEFUSCVcSFxOVDsKLVNFVCBXQVRDT009JVdDMTBBX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9YMzI9Ci1TRVQgVVNFX1gzMlZNPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9MQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgV0lOMzJfR1VJPTEKLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgV0NfTElCQkFTRT1XQzEwQQotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzEwQV9QQVRIJVxCSU5OVDslV0MxMEFfUEFUSCVcQklOQjslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTAuMGEgV2luMzIgR1VJIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1jMzIuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1jMzIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNzUzMTI5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtYzMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNldHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTEuMCBpbiAzMiBiaXQgbW9kZQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxXSU4zMlxXQzExOyVXQzExX1BBVEglXExJQjM4NjslV0MxMV9QQVRIJVxMSUIzODZcTlQ7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcV0lOMzJcV0MxMTslV0MxMV9QQVRIJVxMSUIzODY7JVdDMTFfUEFUSCVcTElCMzg2XE5UOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzExX1BBVEglXEVEREFUCi1TRVQgQ19JTkNMVURFPSVXQzExX1BBVEglXEg7JVdDMTFfUEFUSCVcSFxOVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslQ19JTkNMVURFJQotU0VUIFdBVENPTT0lV0MxMV9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzMyLk1LCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfWDMyPQotU0VUIFVTRV9YMzJWTT0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPTEKLVNFVCBVU0VfV0lOMzg2PQotU0VUIFdJTjMyX0dVST0KLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVVNFX1FOWDQ9Ci1TRVQgV0NfTElCQkFTRT1XQzExCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTFfUEFUSCVcQklOTlQ7JVdDMTFfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotUkVNOiBFbmFibGUgV2luMzIgU0RLIGlmIGRlc2lyZWQgKHNkayBvbiBjb21tYW5kIGxpbmUpCi1pZiBOT1QgLiUxJT09LnNkayBnb3RvIGRvbmUKLWNhbGwgd2luMzJzZGsuYmF0Ci0KLTpkb25lCi1lY2hvIFdhdGNvbSBDL0MrKyAxMS4wIFdpbjMyIGNvbnNvbGUgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1kMTYuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1kMTYuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MzM4YWRhLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtZDE2LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIFNFVHVwIGZvciBjb21waWxpbmcgd2l0aCBXYXRjb20gQy9DKysgMTEuMCBpbiAxNiBiaXQgbW9kZQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcUkVMRUFTRVxET1MxNlxXQzExOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXERPUzE2XFdDMTE7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTFfUEFUSCVcRUREQVQKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVdDMTFfUEFUSCVcSDslV0MxMV9QQVRIJVxIXFdJTjsKLVNFVCBXQVRDT009JVdDMTFfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MxNi5NSwotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX09TMjE2PQotU0VUIFVTRV9PUzIzMj0KLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIFVTRV9RTlg0PQotU0VUIFdDX0xJQkJBU0U9V0MxMQotU0VUIEVEUEFUSD0lV0MxMV9QQVRIJVxFRERBVAotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzExX1BBVEglXEJJTk5UOyVXQzExX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLWVjaG8gV2F0Y29tIEMvQysrIDExLjAgMTYtYml0IERPUyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLWQzMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLWQzMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU1YTU0ZDQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1kMzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMS4wIGluIDMyIGJpdCBtb2RlIChET1M0R1cpCi0KLWlmIC4lQ0hFQ0tFRCU9PS4xIGdvdG8gY2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxSRUxFQVNFXERPUzMyXFdDMTE7JVdDMTFfUEFUSCVcTElCMzg2OyVXQzExX1BBVEglXExJQjM4NlxET1M7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcRE9TMzJcV0MxMTslV0MxMV9QQVRIJVxMSUIzODY7JVdDMTFfUEFUSCVcTElCMzg2XERPUzsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMV9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMV9QQVRIJVxIOwotU0VUIFdBVENPTT0lV0MxMV9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzMyLk1LCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfWDMyPQotU0VUIFVTRV9YMzJWTT0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgVVNFX09TMjE2PQotU0VUIFVTRV9PUzIzMj0KLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIFVTRV9RTlg0PQotU0VUIFdDX0xJQkJBU0U9V0MxMQotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzExX1BBVEglXEJJTk5UOyVXQzExX1BBVEglXEJJTlc7JURKX1BBVEglXEJJTjslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTEuMCAzMi1iaXQgRE9TIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cCAoRE9TNEdXKS4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtbzE2LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtbzE2LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDQ2NzU0YS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLW8xNi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDExLjAgaW4gMTYtYml0IE9TLzIgbW9kZQotCi1pZiAuJUNIRUNLRUQlPT0uMSBnb3RvIGNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxsaWJccmVsZWFzZVxvczIxNlx3YzExOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcbGliXGRlYnVnXG9zMjE2XHdjMTE7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTFfUEFUSCVcZWRkYXQKLVNFVCBJTkNMVURFPWluY2x1ZGU7JVNDSVRFQ0glXGluY2x1ZGU7JVBSSVZBVEUlXGluY2x1ZGU7JVdDMTFfUEFUSCVcaFxvczI7JVdDMTFfUEFUSCVcaAotU0VUIFdBVENPTT0lV0MxMV9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxtYWtlZGVmc1x3YzE2Lm1rCi1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfV0lOMzg2PQotU0VUIFVTRV9PUzIxNj0xCi1TRVQgVVNFX09TMjMyPQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVVNFX1FOWDQ9Ci1TRVQgV0NfTElCQkFTRT13YzExCi1TRVQgRURQQVRIPSVXQzExX1BBVEglXEVEREFUCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTFfUEFUSCVcQklOTlQ7JVdDMTFfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTEuMCAxNi1iaXQgT1MvMiBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLW8zMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLW8zMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM3ZjVkYzcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1vMzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMS4wIGluIDMyLWJpdCBPUy8yIG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcbGliXHJlbGVhc2Vcb3MyMzJcd2MxMTsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXGxpYlxkZWJ1Z1xvczIzMlx3YzExOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzExX1BBVEglXGVkZGF0Ci1TRVQgSU5DTFVERT1pbmNsdWRlOyVTQ0lURUNIJVxpbmNsdWRlOyVQUklWQVRFJVxpbmNsdWRlOyVXQzExX1BBVEglXGhcb3MyOyVXQzExX1BBVEglXGgKLVNFVCBXQVRDT009JVdDMTFfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcbWFrZWRlZnNcd2MzMi5tawotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPTEKLVNFVCBVU0VfT1MyR1VJPQotU0VUIFVTRV9TTkFQPQotU0VUIFVTRV9RTlg0PQotU0VUIFdDX0xJQkJBU0U9d2MxMQotU0VUIEVEUEFUSD0lV0MxMV9QQVRIJVxFRERBVAotUEFUSCAlU0NJVEVDSF9CSU4lOyVXQzExX1BBVEglXEJJTk5UOyVXQzExX1BBVEglXEJJTlc7JURFRlBBVEglJVdDX0NEX1BBVEglCi0KLWVjaG8gV2F0Y29tIEMvQysrIDExLjAgMzItYml0IE9TLzIgY29uc29sZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXAzMi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXAzMi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0OGNiYmQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1wMzIuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMS4wIGluIDMyLWJpdCBPUy8yIG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcbGliXHJlbGVhc2Vcb3MyMzJcd2MxMTsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXGxpYlxkZWJ1Z1xvczIzMlx3YzExOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzExX1BBVEglXGVkZGF0Ci1TRVQgSU5DTFVERT1pbmNsdWRlOyVTQ0lURUNIJVxpbmNsdWRlOyVQUklWQVRFJVxpbmNsdWRlOyVXQzExX1BBVEglXGhcb3MyOyVXQzExX1BBVEglXGgKLVNFVCBXQVRDT009JVdDMTFfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcbWFrZWRlZnNcd2MzMi5tawotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPTEKLVNFVCBVU0VfT1MyR1VJPTEKLVNFVCBVU0VfU05BUD0KLVNFVCBVU0VfUU5YND0KLVNFVCBXQ19MSUJCQVNFPXdjMTEKLVNFVCBFRFBBVEg9JVdDMTFfUEFUSCVcRUREQVQKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMV9QQVRIJVxCSU5OVDslV0MxMV9QQVRIJVxCSU5XOyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMS4wIDMyLWJpdCBPUy8yIEdVSSBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXFueC5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXFueC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFmZDYwZmUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS1xbnguYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMS4wIGluIDMyIGJpdCBtb2RlIChRTlggNCkKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcUU5YNFxXQzExOyVXQzExX1BBVEglXExJQjM4NjslV0MxMV9QQVRIJVxMSUIzODZcUU5YOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFFOWDRcV0MxMTslV0MxMV9QQVRIJVxMSUIzODY7JVdDMTFfUEFUSCVcTElCMzg2XFFOWDsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMV9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMV9QQVRIJVxRSDsKLVNFVCBXQVRDT009JVdDMTFfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1gzMj0KLVNFVCBVU0VfWDMyVk09Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfV0lOMzg2PQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBVU0VfUU5YND0xCi1TRVQgV0NfTElCQkFTRT1XQzExCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTFfUEFUSCVcQklOTlQ7JVdDMTFfUEFUSCVcQklOVzslREpfUEFUSCVcQklOOyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMS4wIDMyLWJpdCBRTlggY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwCi0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtc25wLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtc25wLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmQyYWM1Ny4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXNucC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDExLjAgaW4gMzIgYml0IG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcU05BUFxXQzExOyVXQzExX1BBVEglXExJQjM4NjslV0MxMV9QQVRIJVxMSUIzODZcTlQ7LgotZWNobyBSZWxlYXNlIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOmNoZWNrZWRfYnVpbGQKLVNFVCBMSUI9JVNDSVRFQ0hfTElCJVxMSUJcREVCVUdcU05BUFxXQzExOyVXQzExX1BBVEglXExJQjM4NjslV0MxMV9QQVRIJVxMSUIzODZcTlQ7LgotZWNobyBDaGVja2VkIGRlYnVnIGJ1aWxkIGVuYWJsZWQuCi1nb3RvIHNldHZhcnMKLQotOnNldHZhcnMKLVNFVCBFRFBBVEg9JVdDMTFfUEFUSCVcRUREQVQKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JVdDMTFfUEFUSCVcSAotU0VUIFdBVENPTT0lV0MxMV9QQVRIJQotU0VUIE1BS0VTVEFSVFVQPSVTQ0lURUNIJVxNQUtFREVGU1xXQzMyLk1LCi1TRVQgVVNFX1ROVD0KLVNFVCBVU0VfWDMyPQotU0VUIFVTRV9YMzJWTT0KLVNFVCBVU0VfV0lOMTY9Ci1TRVQgVVNFX1dJTjMyPQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgV0lOMzJfR1VJPQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0xCi1TRVQgVVNFX1FOWDQ9Ci1TRVQgV0NfTElCQkFTRT1XQzExCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTFfUEFUSCVcQklOTlQ7JVdDMTFfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTEuMCBTbmFwIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtdG50LmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtdG50LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDRkYmYyNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXRudC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDExLjAgaW4gMzIgYml0IG1vZGUgd2l0aCBQaGFyIExhcCBUTlQKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcRE9TMzJcV0MxMTslV0MxMV9QQVRIJVxMSUIzODY7JVdDMTFfUEFUSCVcTElCMzg2XERPUzslVE5UX1BBVEglXExJQjsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xET1MzMlxXQzExOyVXQzExX1BBVEglXExJQjM4NjslV0MxMV9QQVRIJVxMSUIzODZcRE9TOyVUTlRfUEFUSCVcTElCOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzExX1BBVEglXEVEREFUCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVXQzExX1BBVEglXEg7JVdDMTFfUEFUSCVcSFxOVDslVE5UX1BBVEglXElOQ0xVREUKLVNFVCBXQVRDT009JVdDMTFfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MzMi5NSwotU0VUIFVTRV9UTlQ9MQotU0VUIFVTRV9YMzI9Ci1TRVQgVVNFX1gzMlZNPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9Ci1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVVNFX1FOWDQ9Ci1TRVQgV0NfTElCQkFTRT1XQzExCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTFfUEFUSCVcQklOTlQ7JVdDMTFfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotUkVNIElmIHlvdSBzZXQgdGhlIGZvbGxvd2luZyB0byBhIDEsIGEgVE5UIERvc1N0eWxlIGFwcCB3aWxsIGJlIGNyZWF0ZWQuCi1SRU0gT3RoZXJ3aXNlIGEgVE5UIE50U3R5bGUgYXBwIHdpbGwgYmUgY3JlYXRlZC4gTnRTdHlsZSBhcHBzIHdpbGwgKm9ubHkqCi1SRU0gcnVuIHVuZGVyIHJlYWwgRE9TIHdoZW4gdXNpbmcgb3VyIGxpYnJhcmllcywgc2luY2Ugd2UgcmVxdWlyZSBhY2Nlc3MKLVJFTSB0byBmdW5jdGlvbnMgdGhhdCB0aGUgV2luMzIgQVBJIGRvZXMgbm90IHN1cHBvcnQgKHN1Y2ggYXMgZGlyZWN0IGFjY2VzcwotUkVNIHRvIHZpZGVvIG1lbW9yeSwgY2FsbGluZyBJbnQgMTBoIEJJT1MgZnVuY3Rpb25zIGV0YykuIERvc1N0eWxlIGFwcHMKLVJFTSB3aWxsIGhvd2V2ZXIgcnVuIGZpbmUgaW4gYm90aCBET1MgYW5kIGEgV2luOTUgRE9TIGJveCAoTlQgRE9TIGJveGVzIGRvbid0Ci1SRU0gd29yayB0b28gd2VsbCkuCi1SRU0KLVJFTSBJZiB5b3UgYXJlIHVzaW5nIHRoZSBSZWFsVGltZSBET1MgZXh0ZW5kZXIsIHlvdXIgYXBwcyAqbXVzdCogYmUgTnRTdHlsZSwKLVJFTSBhbmQgaGVuY2Ugd2lsbCBuZXZlciBiZSBhYmxlIHRvIHJ1biB1bmRlciBXaW45NSBvciBXaW5OVCwgb25seSBET1MuCi0KLVNFVCBET1NTVFlMRT0xCi0KLWVjaG8gV2F0Y29tIEMvQysrIDExLjAgMzItYml0IERPUyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCBzZXQgdXAgKFROVCkuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXcxNi5iYXQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXcxNi5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU2NWM3MGUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2MxMS13MTYuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gU2V0dXAgZm9yIGNvbXBpbGluZyB3aXRoIFdhdGNvbSBDL0MrKyAxMS4wIGluIDE2IGJpdCBXaW5kb3dzIG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMTZcV0MxMTsuCi1lY2hvIFJlbGVhc2UgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06Y2hlY2tlZF9idWlsZAotU0VUIExJQj0lU0NJVEVDSF9MSUIlXExJQlxERUJVR1xXSU4xNlxXQzExOy4KLWVjaG8gQ2hlY2tlZCBkZWJ1ZyBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpzZXR2YXJzCi1TRVQgRURQQVRIPSVXQzExX1BBVEglXEVEREFUCi1TRVQgSU5DTFVERT1JTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVXQzExX1BBVEglXEg7JVdDMTFfUEFUSCVcSFxXSU47Ci1TRVQgV0FUQ09NPSVXQzExX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMTYuTUsKLVNFVCBVU0VfV0lOMTY9MQotU0VUIFVTRV9XSU4zMj0KLVNFVCBVU0VfV0lOMzg2PQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBVU0VfUU5YND0KLVNFVCBXQ19MSUJCQVNFPVdDMTEKLVNFVCBFRFBBVEg9JVdDMTFfUEFUSCVcRUREQVQKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMV9QQVRIJVxCSU5OVDslV0MxMV9QQVRIJVxCSU5XOyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1lY2hvIFdhdGNvbSBDL0MrKyAxMS4wIDE2LWJpdCBXaW5kb3dzIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtdzMyLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEtdzMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzY0Y2RiZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXczMi5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDExLjAgaW4gMzIgYml0IG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcV0MxMTslV0MxMV9QQVRIJVxMSUIzODY7JVdDMTFfUEFUSCVcTElCMzg2XE5UOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXFdDMTE7JVdDMTFfUEFUSCVcTElCMzg2OyVXQzExX1BBVEglXExJQjM4NlxOVDsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMV9QQVRIJVxFRERBVAotU0VUIENfSU5DTFVERT0lV0MxMV9QQVRIJVxIOyVXQzExX1BBVEglXEhcTlQKLVNFVCBJTkNMVURFPUlOQ0xVREU7JVNDSVRFQ0glXElOQ0xVREU7JVBSSVZBVEUlXElOQ0xVREU7JUNfSU5DTFVERSUKLVNFVCBXQVRDT009JVdDMTFfUEFUSCUKLVNFVCBNQUtFU1RBUlRVUD0lU0NJVEVDSCVcTUFLRURFRlNcV0MzMi5NSwotU0VUIFVTRV9UTlQ9Ci1TRVQgVVNFX1gzMj0KLVNFVCBVU0VfWDMyVk09Ci1TRVQgVVNFX1dJTjE2PQotU0VUIFVTRV9XSU4zMj0xCi1TRVQgVVNFX1dJTjM4Nj0KLVNFVCBXSU4zMl9HVUk9MQotU0VUIFVTRV9PUzIxNj0KLVNFVCBVU0VfT1MyMzI9Ci1TRVQgVVNFX09TMkdVST0KLVNFVCBVU0VfU05BUD0KLVNFVCBVU0VfUU5YND0KLVNFVCBXQ19MSUJCQVNFPVdDMTEKLVBBVEggJVNDSVRFQ0hfQklOJTslV0MxMV9QQVRIJVxCSU5OVDslV0MxMV9QQVRIJVxCSU5XOyVERUZQQVRIJSVXQ19DRF9QQVRIJQotCi1SRU06IEVuYWJsZSBXaW4zMiBTREsgaWYgZGVzaXJlZCAoc2RrIG9uIGNvbW1hbmQgbGluZSkKLWlmIE5PVCAuJTElPT0uc2RrIGdvdG8gZG9uZQotY2FsbCB3aW4zMnNkay5iYXQKLQotOmRvbmUKLWVjaG8gV2F0Y29tIEMvQysrIDExLjAgV2luMzIgR1VJIGNvbXBpbGF0aW9uIGVudmlyb25tZW50IHNldCB1cC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEteDExLmJhdCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3djMTEteDExLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzI1NjlhMy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2Jpbi93YzExLXgxMS5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBTZXR1cCBmb3IgY29tcGlsaW5nIHdpdGggV2F0Y29tIEMvQysrIDExLjAgaW4gMzIgYml0IG1vZGUKLQotaWYgLiVDSEVDS0VEJT09LjEgZ290byBjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXFJFTEVBU0VcV0lOMzJcV0MxMTslV0MxMV9QQVRIJVxMSUIzODY7JVdDMTFfUEFUSCVcTElCMzg2XE5UOy4KLWVjaG8gUmVsZWFzZSBidWlsZCBlbmFibGVkLgotZ290byBzZXR2YXJzCi0KLTpjaGVja2VkX2J1aWxkCi1TRVQgTElCPSVTQ0lURUNIX0xJQiVcTElCXERFQlVHXFdJTjMyXFdDMTE7JVdDMTFfUEFUSCVcTElCMzg2OyVXQzExX1BBVEglXExJQjM4NlxOVDsuCi1lY2hvIENoZWNrZWQgZGVidWcgYnVpbGQgZW5hYmxlZC4KLWdvdG8gc2V0dmFycwotCi06c2V0dmFycwotU0VUIEVEUEFUSD0lV0MxMV9QQVRIJVxFRERBVAotU0VUIElOQ0xVREU9SU5DTFVERTslU0NJVEVDSCVcSU5DTFVERTslUFJJVkFURSVcSU5DTFVERTslV0MxMV9QQVRIJVxIOyVXQzExX1BBVEglXEhcTlQ7Ci1TRVQgV0FUQ09NPSVXQzExX1BBVEglCi1TRVQgTUFLRVNUQVJUVVA9JVNDSVRFQ0glXE1BS0VERUZTXFdDMzIuTUsKLVNFVCBVU0VfVE5UPQotU0VUIFVTRV9YMzI9Ci1TRVQgVVNFX1gzMlZNPQotU0VUIFVTRV9XSU4xNj0KLVNFVCBVU0VfV0lOMzI9MQotU0VUIFVTRV9XSU4zODY9Ci1TRVQgV0lOMzJfR1VJPTEKLVNFVCBVU0VfT1MyMTY9Ci1TRVQgVVNFX09TMjMyPQotU0VUIFVTRV9PUzJHVUk9Ci1TRVQgVVNFX1NOQVA9Ci1TRVQgVVNFX1FOWDQ9Ci1TRVQgV0NfTElCQkFTRT1XQzExCi1QQVRIICVTQ0lURUNIX0JJTiU7JVdDMTFfUEFUSCVcQklOTlQ7JVdDMTFfUEFUSCVcQklOVzslREVGUEFUSCUlV0NfQ0RfUEFUSCUKLQotZWNobyBXYXRjb20gQy9DKysgMTEuMCBXaW4zMiBHVUkgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgc2V0IHVwLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2luMzJzZGsuYmF0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9iaW4vd2luMzJzZGsuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYzdmMDE3Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvYmluL3dpbjMyc2RrLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLUBlY2hvIG9mZgotUkVNOiBTZXQgdXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBNaWNyb3NvZnQgUGxhdGZvcm0gU0RLIGRldmVsb3BtZW50Ci1SRU06IE5vdGUgdGhhdCB3ZSBoYXZlIGhhcmQgY29kZWQgdGhpcyBmb3IgV2luZG93cyBOVCBpMzg2IGRldmVsb3BtZW50LgotCi1TRVQgTVNUT09MUz0lTVNTREslCi1TRVQgRFhTREtST09UPSVNU1RPT0xTJQotU0VUIElORVRTREs9JU1TVE9PTFMlCi1TRVQgQktPRkZJQ0U9JU1TVE9PTFMlCi1TRVQgQkFTRU1BS0U9JUJLT0ZGSUNFJVxJTkNMVURFXEJLT2ZmaWNlLk1hawotU0VUIElOQ0xVREU9LjtJTkNMVURFOyVTQ0lURUNIJVxJTkNMVURFOyVQUklWQVRFJVxJTkNMVURFOyVNU1RPT0xTJVxJTkNMVURFOyVDX0lOQ0xVREUlCi1pZiAuJTElPT0uYm9ybGFuZCBnb3RvIGJvcmxhbmQKLVNFVCBMSUI9JU1TVE9PTFMlXExJQjslTElCJQotZ290byBub3Rib3JsYW5kCi06Ym9ybGFuZAotU0VUIExJQj0lTVNUT09MUyVcTElCXEJPUkxBTkQ7JUxJQiUKLTpub3Rib3JsYW5kCi1TRVQgUEFUSD0lTVNUT09MUyVcQmluXDslTVNUT09MUyVcQmluXFdpbk5UOyVQQVRIJQotU0VUIENQVT1pMzg2Ci0KLWVjaG8gTWljcm9zb2Z0IFBsYXRmb3JtIFNESyBzdXBwb3J0IGVuYmFibGVkLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL2Jpb3NlbXUuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9iaW9zZW11LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYzMzYTcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL2Jpb3NlbXUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgIEJJT1MgZW11bGF0b3IgYW5kIGludGVyZmFjZQotKiAgICAgICAgICAgICAgICAgICAgICB0byBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIHRoZSByZWFsIG1vZGUgeDg2IEJJT1MgZW11bGF0b3IsIHdoaWNoIGlzCi0qICAgICAgICAgICAgICAgdXNlZCB0byB3YXJtYm9vdCBhbnkgbnVtYmVyIG9mIFZHQSBjb21wYXRpYmxlIFBDSS9BR1AKLSogICAgICAgICAgICAgICBjb250cm9sbGVycyB1bmRlciBhbnkgT1MsIG9uIGFueSBwcm9jZXNzb3IgZmFtaWx5IHRoYXQKLSogICAgICAgICAgICAgICBzdXBwb3J0cyBQQ0kuIFdlIGFsc28gYWxsb3cgdGhlIHVzZXIgYXBwbGljYXRpb24gdG8gY2FsbAotKiAgICAgICAgICAgICAgIHJlYWwgbW9kZSBCSU9TIGZ1bmN0aW9ucyBhbmQgSW50IDEwaCBmdW5jdGlvbnMgKGluY2x1ZGluZwotKiAgICAgICAgICAgICAgIHRoZSBWRVNBIEJJT1MpLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX0JJT1NFTVVfSAotI2RlZmluZSBfX0JJT1NFTVVfSAotCi0jaW5jbHVkZSAieDg2ZW11LmgiCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJwY2lsaWIuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hY3JvcyBhbmQgdHlwZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI3ByYWdtYSBwYWNrKDEpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSB0aGUgZGV0YWlscyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgVkdBCi1jb250cm9sbGVyLiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gYWxsb3cgdGhlIFZHQSBjb250cm9sbGVyIHRvIGJlCi1zd2FwcGVkIG9uIHRoZSBmbHkgd2l0aGluIHRoZSBCSU9TIGVtdWxhdG9yLgotCi1IRUFERVI6Ci1iaW9zZW11LmgKLQotTUVNQkVSUzoKLXBjaUluZm8gICAgICAgICAtIFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gYmxvY2sgZm9yIHRoZSBjb250cm9sbGVyCi1CSU9TSW1hZ2UgICAgICAgLSBQb2ludGVyIHRvIGEgcmVhZC93cml0ZSBjb3B5IG9mIHRoZSBCSU9TIGltYWdlCi1CSU9TSW1hZ2VMZW4gICAgLSBMZW5ndGggb2YgdGhlIEJJT1MgaW1hZ2UKLUxvd01lbSAgICAgICAgICAtIENvcHkgb2Yga2V5IGxvdyBtZW1vcnkgYXJlYXMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgUENJRGV2aWNlSW5mbyAgICpwY2lJbmZvOwotICAgIHZvaWQgICAgICAgICAgICAqQklPU0ltYWdlOwotICAgIHVsb25nICAgICAgICAgICBCSU9TSW1hZ2VMZW47Ci0gICAgdWNoYXIgICAgICAgICAgIExvd01lbVsxNTM2XTsKLSAgICB9IEJFX1ZHQUluZm87Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSB0aGUgZGV0YWlscyBmb3IgdGhlIEJJT1MgZW11bGF0b3Igc3lzdGVtCi1lbnZpcm9ubWVudCBhcyB1c2VkIGJ5IHRoZSBYODYgZW11bGF0b3IgbGlicmFyeS4KLQotSEVBREVSOgotYmlvc2VtdS5oCi0KLU1FTUJFUlM6Ci12Z2FJbmZvICAgICAgICAgLSBWR0EgQklPUyBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKLWJpb3NtZW1fYmFzZSAgICAtIEJhc2Ugb2YgdGhlIEJJT1MgaW1hZ2UKLWJpb3NtZW1fbGltaXQgICAtIExpbWl0IG9mIHRoZSBCSU9TIGltYWdlCi1idXNtZW1fYmFzZSAgICAgLSBCYXNlIG9mIHRoZSBWR0EgYnVzIG1lbW9yeQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBCRV9WR0FJbmZvICAgICAgdmdhSW5mbzsKLSAgICB1bG9uZyAgICAgICAgICAgYmlvc21lbV9iYXNlOwotICAgIHVsb25nICAgICAgICAgICBiaW9zbWVtX2xpbWl0OwotICAgIHVsb25nICAgICAgICAgICBidXNtZW1fYmFzZTsKLSAgICB9IEJFX3N5c0VudjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TdHJ1Y3R1cmUgZGVmaW5pbmcgYWxsIHRoZSBCSU9TIEVtdWxhdG9yIEFQSSBmdW5jdGlvbnMgYXMgZXhwb3J0ZWQgZnJvbQotdGhlIEJpbmFyeSBQb3J0YWJsZSBETEwuCi17c2VjcmV0fQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bG9uZyAgIGR3U2l6ZTsKLSAgICBpYm9vbCAgIChQTUFQSVAgQkVfaW5pdCkodTMyIGRlYnVnRmxhZ3MsaW50IG1lbVNpemUsQkVfVkdBSW5mbyAqaW5mbyk7Ci0gICAgdm9pZCAgICAoUE1BUElQIEJFX3NldFZHQSkoQkVfVkdBSW5mbyAqaW5mbyk7Ci0gICAgdm9pZCAgICAoUE1BUElQIEJFX2dldFZHQSkoQkVfVkdBSW5mbyAqaW5mbyk7Ci0gICAgdm9pZCAqICAoUE1BUElQIEJFX21hcFJlYWxQb2ludGVyKSh1aW50IHJfc2VnLHVpbnQgcl9vZmYpOwotICAgIHZvaWQgKiAgKFBNQVBJUCBCRV9nZXRWRVNBQnVmKSh1aW50ICpsZW4sdWludCAqcnNlZyx1aW50ICpyb2ZmKTsKLSAgICB2b2lkICAgIChQTUFQSVAgQkVfY2FsbFJlYWxNb2RlKSh1aW50IHNlZyx1aW50IG9mZixSTVJFR1MgKnJlZ3MsUk1TUkVHUyAqc3JlZ3MpOwotICAgIGludCAgICAgKFBNQVBJUCBCRV9pbnQ4NikoaW50IGludG5vLFJNUkVHUyAqaW4sUk1SRUdTICpvdXQpOwotICAgIGludCAgICAgKFBNQVBJUCBCRV9pbnQ4NngpKGludCBpbnRubyxSTVJFR1MgKmluLFJNUkVHUyAqb3V0LFJNU1JFR1MgKnNyZWdzKTsKLSAgICB2b2lkICogIHJlc2VydmVkMTsKLSAgICB2b2lkICAgIChQTUFQSVAgQkVfZXhpdCkodm9pZCk7Ci0gICAgfSBCRV9leHBvcnRzOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHBvaW50ZXIgdHlwZSBmb3IgdGhlIEJpbmFyeSBQb3J0YWJsZSBETEwgaW5pdGlhbGlzYXRpb24gZW50cnkgcG9pbnQuCi17c2VjcmV0fQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgQkVfZXhwb3J0cyAqIChQTUFQSVAgQkVfaW5pdExpYnJhcnlfdCkoUE1faW1wb3J0cyAqUE1JbXApOwotCi0jcHJhZ21hIHBhY2soKQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLwotI2VuZGlmCi0KLS8qIHtzZWNyZXR9IEdsb2JhbCBCSU9TIGVtdWxhdG9yIHN5c3RlbSBlbnZpcm9ubWVudCAqLwotZXh0ZXJuIEJFX3N5c0VudiBfQkVfZW52OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9uIFByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBCSU9TIGVtdWxhdG9yIGxpYnJhcnkgZW50cnkgcG9pbnRzICovCi0KLWlib29sICAgUE1BUEkgQkVfaW5pdCh1MzIgZGVidWdGbGFncyxpbnQgbWVtU2l6ZSxCRV9WR0FJbmZvICppbmZvKTsKLXZvaWQgICAgUE1BUEkgQkVfc2V0VkdBKEJFX1ZHQUluZm8gKmluZm8pOwotdm9pZCAgICBQTUFQSSBCRV9nZXRWR0EoQkVfVkdBSW5mbyAqaW5mbyk7Ci12b2lkICAgIFBNQVBJIEJFX3NldERlYnVnRmxhZ3ModTMyIGRlYnVnRmxhZ3MpOwotdm9pZCAqICBQTUFQSSBCRV9tYXBSZWFsUG9pbnRlcih1aW50IHJfc2VnLHVpbnQgcl9vZmYpOwotdm9pZCAqICBQTUFQSSBCRV9nZXRWRVNBQnVmKHVpbnQgKmxlbix1aW50ICpyc2VnLHVpbnQgKnJvZmYpOwotdm9pZCAgICBQTUFQSSBCRV9jYWxsUmVhbE1vZGUodWludCBzZWcsdWludCBvZmYsUk1SRUdTICpyZWdzLFJNU1JFR1MgKnNyZWdzKTsKLWludCAgICAgUE1BUEkgQkVfaW50ODYoaW50IGludG5vLFJNUkVHUyAqaW4sUk1SRUdTICpvdXQpOwotaW50ICAgICBQTUFQSSBCRV9pbnQ4NngoaW50IGludG5vLFJNUkVHUyAqaW4sUk1SRUdTICpvdXQsUk1TUkVHUyAqc3JlZ3MpOwotdm9pZCAgICBQTUFQSSBCRV9leGl0KHZvaWQpOwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKyAgICAgICAqLwotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX0JJT1NFTVVfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL2V2ZW50LmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvZXZlbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVlYWM4Ny4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvZXZlbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDY5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBIZWFkZXIgZmlsZSBmb3IgdGhlIFNjaVRlY2ggY3Jvc3MgcGxhdGZvcm0gZXZlbnQgbGlicmFyeQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX0VWRU5UX0gKLSNkZWZpbmUgX19FVkVOVF9ICi0KLSNpbmNsdWRlICJzY2l0ZWNoLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIHR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgcGFjaygxKQotCi0vKiAnQycgY2FsbGluZyBjb252ZW50aW9ucyBhbHdheXMgKi8KLQotI2RlZmluZSBFVlRBUEkgIF9BU01BUEkKLSNkZWZpbmUgRVZUQVBJUCBfQVNNQVBJUAotCi0vKiBFdmVudCBtZXNzYWdlIG1hc2tzIGZvciBrZXlEb3duIGV2ZW50cyAqLwotCi0jZGVmaW5lIEVWVF9BU0NJSU1BU0sgICAweDAwRkYgICAgICAvKiBBU0NJSSBjb2RlIG9mIGtleSBwcmVzc2VkICAgICAgICAqLwotI2RlZmluZSBFVlRfU0NBTk1BU0sgICAgMHhGRjAwICAgICAgLyogU2NhbiBjb2RlIG9mIGtleSBwcmVzc2VkICAgICAgICAgKi8KLSNkZWZpbmUgRVZUX0NPVU5UTUFTSyAgIDB4N0ZGRjAwMDBMIC8qIENvdW50IGZvciBLRVlSRVBFQVQncyAgICAgICAgICAgICovCi0KLS8qIE1hY3JvcyB0byBleHRyYWN0IHZhbHVlcyBmcm9tIHRoZSBtZXNzYWdlIGZpZWxkcyAqLwotCi0jZGVmaW5lIEVWVF9hc2NpaUNvZGUobSkgICAgKCAodWNoYXIpIChtICYgRVZUX0FTQ0lJTUFTSykgKQotI2RlZmluZSBFVlRfc2NhbkNvZGUobSkgICAgICggKHVjaGFyKSAoIChtICYgRVZUX1NDQU5NQVNLKSA+PiA4ICkgKQotI2RlZmluZSBFVlRfcmVwZWF0Q291bnQobSkgICggKHNob3J0KSAoIChtICYgRVZUX0NPVU5UTUFTSykgPj4gMTYgKSApCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGVmaW5lcyB0aGUgc2V0IG9mIEFTQ0lJIGNvZGVzIHJlcG9ydGVkIGJ5IHRoZSBldmVudCBsaWJyYXJ5IGZ1bmN0aW9ucwotaW4gdGhlIG1lc3NhZ2UgZmllbGQuIFVzZSB0aGUgRVZUX2FzY2lpQ29kZSBtYWNybyB0byBleHRyYWN0IHRoZSBjb2RlCi1mcm9tIHRoZSBldmVudCBzdHJ1Y3R1cmUuCi0KLUhFQURFUjoKLWV2ZW50LmgKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIGVudW0gewotICAgIEFTQ0lJX2N0cmxBICAgICAgICAgICAgID0gMHgwMSwKLSAgICBBU0NJSV9jdHJsQiAgICAgICAgICAgICA9IDB4MDIsCi0gICAgQVNDSUlfY3RybEMgICAgICAgICAgICAgPSAweDAzLAotICAgIEFTQ0lJX2N0cmxEICAgICAgICAgICAgID0gMHgwNCwKLSAgICBBU0NJSV9jdHJsRSAgICAgICAgICAgICA9IDB4MDUsCi0gICAgQVNDSUlfY3RybEYgICAgICAgICAgICAgPSAweDA2LAotICAgIEFTQ0lJX2N0cmxHICAgICAgICAgICAgID0gMHgwNywKLSAgICBBU0NJSV9iYWNrc3BhY2UgICAgICAgICA9IDB4MDgsCi0gICAgQVNDSUlfY3RybEggICAgICAgICAgICAgPSAweDA4LAotICAgIEFTQ0lJX3RhYiAgICAgICAgICAgICAgID0gMHgwOSwKLSAgICBBU0NJSV9jdHJsSSAgICAgICAgICAgICA9IDB4MDksCi0gICAgQVNDSUlfY3RybEogICAgICAgICAgICAgPSAweDBBLAotICAgIEFTQ0lJX2N0cmxLICAgICAgICAgICAgID0gMHgwQiwKLSAgICBBU0NJSV9jdHJsTCAgICAgICAgICAgICA9IDB4MEMsCi0gICAgQVNDSUlfZW50ZXIgICAgICAgICAgICAgPSAweDBELAotICAgIEFTQ0lJX2N0cmxNICAgICAgICAgICAgID0gMHgwRCwKLSAgICBBU0NJSV9jdHJsTiAgICAgICAgICAgICA9IDB4MEUsCi0gICAgQVNDSUlfY3RybE8gICAgICAgICAgICAgPSAweDBGLAotICAgIEFTQ0lJX2N0cmxQICAgICAgICAgICAgID0gMHgxMCwKLSAgICBBU0NJSV9jdHJsUSAgICAgICAgICAgICA9IDB4MTEsCi0gICAgQVNDSUlfY3RybFIgICAgICAgICAgICAgPSAweDEyLAotICAgIEFTQ0lJX2N0cmxTICAgICAgICAgICAgID0gMHgxMywKLSAgICBBU0NJSV9jdHJsVCAgICAgICAgICAgICA9IDB4MTQsCi0gICAgQVNDSUlfY3RybFUgICAgICAgICAgICAgPSAweDE1LAotICAgIEFTQ0lJX2N0cmxWICAgICAgICAgICAgID0gMHgxNiwKLSAgICBBU0NJSV9jdHJsVyAgICAgICAgICAgICA9IDB4MTcsCi0gICAgQVNDSUlfY3RybFggICAgICAgICAgICAgPSAweDE4LAotICAgIEFTQ0lJX2N0cmxZICAgICAgICAgICAgID0gMHgxOSwKLSAgICBBU0NJSV9jdHJsWiAgICAgICAgICAgICA9IDB4MUEsCi0gICAgQVNDSUlfZXNjICAgICAgICAgICAgICAgPSAweDFCLAotICAgIEFTQ0lJX3NwYWNlICAgICAgICAgICAgID0gMHgyMCwKLSAgICBBU0NJSV9leGNsYW1hdGlvbiAgICAgICA9IDB4MjEsIC8qICEgKi8KLSAgICBBU0NJSV9xdW90ZSAgICAgICAgICAgICA9IDB4MjIsIC8qICIgKi8KLSAgICBBU0NJSV9wb3VuZCAgICAgICAgICAgICA9IDB4MjMsIC8qICMgKi8KLSAgICBBU0NJSV9kb2xsYXIgICAgICAgICAgICA9IDB4MjQsIC8qICQgKi8KLSAgICBBU0NJSV9wZXJjZW50ICAgICAgICAgICA9IDB4MjUsIC8qICUgKi8KLSAgICBBU0NJSV9hbXBlcnNhbmQgICAgICAgICA9IDB4MjYsIC8qICYgKi8KLSAgICBBU0NJSV9hcG9zdHJvcGhlICAgICAgICA9IDB4MjcsIC8qICcgKi8KLSAgICBBU0NJSV9sZWZ0QnJhY2UgICAgICAgICA9IDB4MjgsIC8qICggKi8KLSAgICBBU0NJSV9yaWdodEJyYWNlICAgICAgICA9IDB4MjksIC8qICkgKi8KLSAgICBBU0NJSV90aW1lcyAgICAgICAgICAgICA9IDB4MkEsIC8qICogKi8KLSAgICBBU0NJSV9wbHVzICAgICAgICAgICAgICA9IDB4MkIsIC8qICsgKi8KLSAgICBBU0NJSV9jb21tYSAgICAgICAgICAgICA9IDB4MkMsIC8qICwgKi8KLSAgICBBU0NJSV9taW51cyAgICAgICAgICAgICA9IDB4MkQsIC8qIC0gKi8KLSAgICBBU0NJSV9wZXJpb2QgICAgICAgICAgICA9IDB4MkUsIC8qIC4gKi8KLSAgICBBU0NJSV9kaXZpZGUgICAgICAgICAgICA9IDB4MkYsIC8qIC8gKi8KLSAgICBBU0NJSV8wICAgICAgICAgICAgICAgICA9IDB4MzAsCi0gICAgQVNDSUlfMSAgICAgICAgICAgICAgICAgPSAweDMxLAotICAgIEFTQ0lJXzIgICAgICAgICAgICAgICAgID0gMHgzMiwKLSAgICBBU0NJSV8zICAgICAgICAgICAgICAgICA9IDB4MzMsCi0gICAgQVNDSUlfNCAgICAgICAgICAgICAgICAgPSAweDM0LAotICAgIEFTQ0lJXzUgICAgICAgICAgICAgICAgID0gMHgzNSwKLSAgICBBU0NJSV82ICAgICAgICAgICAgICAgICA9IDB4MzYsCi0gICAgQVNDSUlfNyAgICAgICAgICAgICAgICAgPSAweDM3LAotICAgIEFTQ0lJXzggICAgICAgICAgICAgICAgID0gMHgzOCwKLSAgICBBU0NJSV85ICAgICAgICAgICAgICAgICA9IDB4MzksCi0gICAgQVNDSUlfY29sb24gICAgICAgICAgICAgPSAweDNBLCAvKiA6ICovCi0gICAgQVNDSUlfc2VtaWNvbG9uICAgICAgICAgPSAweDNCLCAvKiA7ICovCi0gICAgQVNDSUlfbGVzc1RoYW4gICAgICAgICAgPSAweDNDLCAvKiA8ICovCi0gICAgQVNDSUlfZXF1YWxzICAgICAgICAgICAgPSAweDNELCAvKiA9ICovCi0gICAgQVNDSUlfZ3JlYXRlclRoYW4gICAgICAgPSAweDNFLCAvKiA+ICovCi0gICAgQVNDSUlfcXVlc3Rpb24gICAgICAgICAgPSAweDNGLCAvKiA/ICovCi0gICAgQVNDSUlfYXQgICAgICAgICAgICAgICAgPSAweDQwLCAvKiBAICovCi0gICAgQVNDSUlfQSAgICAgICAgICAgICAgICAgPSAweDQxLAotICAgIEFTQ0lJX0IgICAgICAgICAgICAgICAgID0gMHg0MiwKLSAgICBBU0NJSV9DICAgICAgICAgICAgICAgICA9IDB4NDMsCi0gICAgQVNDSUlfRCAgICAgICAgICAgICAgICAgPSAweDQ0LAotICAgIEFTQ0lJX0UgICAgICAgICAgICAgICAgID0gMHg0NSwKLSAgICBBU0NJSV9GICAgICAgICAgICAgICAgICA9IDB4NDYsCi0gICAgQVNDSUlfRyAgICAgICAgICAgICAgICAgPSAweDQ3LAotICAgIEFTQ0lJX0ggICAgICAgICAgICAgICAgID0gMHg0OCwKLSAgICBBU0NJSV9JICAgICAgICAgICAgICAgICA9IDB4NDksCi0gICAgQVNDSUlfSiAgICAgICAgICAgICAgICAgPSAweDRBLAotICAgIEFTQ0lJX0sgICAgICAgICAgICAgICAgID0gMHg0QiwKLSAgICBBU0NJSV9MICAgICAgICAgICAgICAgICA9IDB4NEMsCi0gICAgQVNDSUlfTSAgICAgICAgICAgICAgICAgPSAweDRELAotICAgIEFTQ0lJX04gICAgICAgICAgICAgICAgID0gMHg0RSwKLSAgICBBU0NJSV9PICAgICAgICAgICAgICAgICA9IDB4NEYsCi0gICAgQVNDSUlfUCAgICAgICAgICAgICAgICAgPSAweDUwLAotICAgIEFTQ0lJX1EgICAgICAgICAgICAgICAgID0gMHg1MSwKLSAgICBBU0NJSV9SICAgICAgICAgICAgICAgICA9IDB4NTIsCi0gICAgQVNDSUlfUyAgICAgICAgICAgICAgICAgPSAweDUzLAotICAgIEFTQ0lJX1QgICAgICAgICAgICAgICAgID0gMHg1NCwKLSAgICBBU0NJSV9VICAgICAgICAgICAgICAgICA9IDB4NTUsCi0gICAgQVNDSUlfViAgICAgICAgICAgICAgICAgPSAweDU2LAotICAgIEFTQ0lJX1cgICAgICAgICAgICAgICAgID0gMHg1NywKLSAgICBBU0NJSV9YICAgICAgICAgICAgICAgICA9IDB4NTgsCi0gICAgQVNDSUlfWSAgICAgICAgICAgICAgICAgPSAweDU5LAotICAgIEFTQ0lJX1ogICAgICAgICAgICAgICAgID0gMHg1QSwKLSAgICBBU0NJSV9sZWZ0U3F1YXJlQnJhY2UgICA9IDB4NUIsIC8qIFsgKi8KLSAgICBBU0NJSV9iYWNrU2xhc2ggICAgICAgICA9IDB4NUMsIC8qIFwgKi8KLSAgICBBU0NJSV9yaWdodFNxdWFyZUJyYWNlICA9IDB4NUQsIC8qIF0gKi8KLSAgICBBU0NJSV9jYXJldCAgICAgICAgICAgICA9IDB4NUUsIC8qIF4gKi8KLSAgICBBU0NJSV91bmRlcnNjb3JlICAgICAgICA9IDB4NUYsIC8qIF8gKi8KLSAgICBBU0NJSV9sZWZ0QXBvc3Ryb3BoZSAgICA9IDB4NjAsIC8qIGAgKi8KLSAgICBBU0NJSV9hICAgICAgICAgICAgICAgICA9IDB4NjEsCi0gICAgQVNDSUlfYiAgICAgICAgICAgICAgICAgPSAweDYyLAotICAgIEFTQ0lJX2MgICAgICAgICAgICAgICAgID0gMHg2MywKLSAgICBBU0NJSV9kICAgICAgICAgICAgICAgICA9IDB4NjQsCi0gICAgQVNDSUlfZSAgICAgICAgICAgICAgICAgPSAweDY1LAotICAgIEFTQ0lJX2YgICAgICAgICAgICAgICAgID0gMHg2NiwKLSAgICBBU0NJSV9nICAgICAgICAgICAgICAgICA9IDB4NjcsCi0gICAgQVNDSUlfaCAgICAgICAgICAgICAgICAgPSAweDY4LAotICAgIEFTQ0lJX2kgICAgICAgICAgICAgICAgID0gMHg2OSwKLSAgICBBU0NJSV9qICAgICAgICAgICAgICAgICA9IDB4NkEsCi0gICAgQVNDSUlfayAgICAgICAgICAgICAgICAgPSAweDZCLAotICAgIEFTQ0lJX2wgICAgICAgICAgICAgICAgID0gMHg2QywKLSAgICBBU0NJSV9tICAgICAgICAgICAgICAgICA9IDB4NkQsCi0gICAgQVNDSUlfbiAgICAgICAgICAgICAgICAgPSAweDZFLAotICAgIEFTQ0lJX28gICAgICAgICAgICAgICAgID0gMHg2RiwKLSAgICBBU0NJSV9wICAgICAgICAgICAgICAgICA9IDB4NzAsCi0gICAgQVNDSUlfcSAgICAgICAgICAgICAgICAgPSAweDcxLAotICAgIEFTQ0lJX3IgICAgICAgICAgICAgICAgID0gMHg3MiwKLSAgICBBU0NJSV9zICAgICAgICAgICAgICAgICA9IDB4NzMsCi0gICAgQVNDSUlfdCAgICAgICAgICAgICAgICAgPSAweDc0LAotICAgIEFTQ0lJX3UgICAgICAgICAgICAgICAgID0gMHg3NSwKLSAgICBBU0NJSV92ICAgICAgICAgICAgICAgICA9IDB4NzYsCi0gICAgQVNDSUlfdyAgICAgICAgICAgICAgICAgPSAweDc3LAotICAgIEFTQ0lJX3ggICAgICAgICAgICAgICAgID0gMHg3OCwKLSAgICBBU0NJSV95ICAgICAgICAgICAgICAgICA9IDB4NzksCi0gICAgQVNDSUlfeiAgICAgICAgICAgICAgICAgPSAweDdBLAotICAgIEFTQ0lJX2xlZnRDdXJseUJyYWNlICAgID0gMHg3QiwgLyogeyAqLwotICAgIEFTQ0lJX3ZlcnRpY2FsQmFyICAgICAgID0gMHg3QywgLyogfCAqLwotICAgIEFTQ0lJX3JpZ2h0Q3VybHlCcmFjZSAgID0gMHg3RCwgLyogfSAqLwotICAgIEFTQ0lJX3RpbGRlICAgICAgICAgICAgID0gMHg3RSAgLyogfiAqLwotICAgIH0gRVZUX2FzY2lpQ29kZXNUeXBlOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURlZmluZXMgdGhlIHNldCBvZiBzY2FuIGNvZGVzIHJlcG9ydGVkIGJ5IHRoZSBldmVudCBsaWJyYXJ5IGZ1bmN0aW9ucwotaW4gdGhlIG1lc3NhZ2UgZmllbGQuIFVzZSB0aGUgRVZUX3NjYW5Db2RlIG1hY3JvIHRvIGV4dHJhY3QgdGhlIGNvZGUKLWZyb20gdGhlIGV2ZW50IHN0cnVjdHVyZS4gTm90ZSB0aGF0IHRoZSBzY2FuIGNvZGVzIHJlcG9ydGVkIHdpbGwgYmUgdGhlCi1zYW1lIGFjcm9zcyBhbGwga2V5Ym9hcmRzIChhc3N1bWluZyB0aGUgcGxhY2VtZW50IG9mIGtleXMgb24gYSAxMDEga2V5IFVTCi1rZXlib2FyZCksIGJ1dCB0aGUgdHJhbnNsYXRlZCBBU0NJSSB2YWx1ZXMgbWF5IGJlIGRpZmZlcmVudCBkZXBlbmRpbmcgb24KLXRoZSBjb3VudHJ5IGNvZGUgcGFnZXMgaW4gdXNlLgotCi1OT1RFOiAgIFNjYW4gY29kZXMgaW4gdGhlIGV2ZW50IGxpYnJhcnkgYXJlIG5vdCByZWFsbHkgaGFyZHdhcmUgc2NhbiBjb2RlcywKLQlidXQgcmF0aGVyIHZpcnR1YWwgc2NhbiBjb2RlcyBhcyBnZW5lcmF0ZWQgYnkgYSBsb3cgbGV2ZWwga2V5Ym9hcmQKLQlpbnRlcmZhY2UgZHJpdmVyLiBBbGwgdmlydHVhbCBjb2RlcyBiZWdpbiB3aXRoIHNjYW4gY29kZSAweDYwIGFuZAotCXJhbmdlIHVwIGZyb20gdGhlcmUuCi0KLUhFQURFUjoKLWV2ZW50LmgKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIGVudW0gewotICAgIEtCX3BhZEVudGVyICAgICAgICAgICAgID0gMHg2MCwgLyogS2V5cGFkIGtleXMgKi8KLSAgICBLQl9wYWRNaW51cyAgICAgICAgICAgICA9IDB4NEEsCi0gICAgS0JfcGFkUGx1cyAgICAgICAgICAgICAgPSAweDRFLAotICAgIEtCX3BhZFRpbWVzICAgICAgICAgICAgID0gMHgzNywKLSAgICBLQl9wYWREaXZpZGUgICAgICAgICAgICA9IDB4NjEsCi0gICAgS0JfcGFkTGVmdCAgICAgICAgICAgICAgPSAweDYyLAotICAgIEtCX3BhZFJpZ2h0ICAgICAgICAgICAgID0gMHg2MywKLSAgICBLQl9wYWRVcCAgICAgICAgICAgICAgICA9IDB4NjQsCi0gICAgS0JfcGFkRG93biAgICAgICAgICAgICAgPSAweDY1LAotICAgIEtCX3BhZEluc2VydCAgICAgICAgICAgID0gMHg2NiwKLSAgICBLQl9wYWREZWxldGUgICAgICAgICAgICA9IDB4NjcsCi0gICAgS0JfcGFkSG9tZSAgICAgICAgICAgICAgPSAweDY4LAotICAgIEtCX3BhZEVuZCAgICAgICAgICAgICAgID0gMHg2OSwKLSAgICBLQl9wYWRQYWdlVXAgICAgICAgICAgICA9IDB4NkEsCi0gICAgS0JfcGFkUGFnZURvd24gICAgICAgICAgPSAweDZCLAotICAgIEtCX3BhZENlbnRlciAgICAgICAgICAgID0gMHg0QywKLSAgICBLQl9GMSAgICAgICAgICAgICAgICAgICA9IDB4M0IsIC8qIEZ1bmN0aW9uIGtleXMgKi8KLSAgICBLQl9GMiAgICAgICAgICAgICAgICAgICA9IDB4M0MsCi0gICAgS0JfRjMgICAgICAgICAgICAgICAgICAgPSAweDNELAotICAgIEtCX0Y0ICAgICAgICAgICAgICAgICAgID0gMHgzRSwKLSAgICBLQl9GNSAgICAgICAgICAgICAgICAgICA9IDB4M0YsCi0gICAgS0JfRjYgICAgICAgICAgICAgICAgICAgPSAweDQwLAotICAgIEtCX0Y3ICAgICAgICAgICAgICAgICAgID0gMHg0MSwKLSAgICBLQl9GOCAgICAgICAgICAgICAgICAgICA9IDB4NDIsCi0gICAgS0JfRjkgICAgICAgICAgICAgICAgICAgPSAweDQzLAotICAgIEtCX0YxMCAgICAgICAgICAgICAgICAgID0gMHg0NCwKLSAgICBLQl9GMTEgICAgICAgICAgICAgICAgICA9IDB4NTcsCi0gICAgS0JfRjEyICAgICAgICAgICAgICAgICAgPSAweDU4LAotICAgIEtCX2xlZnQgICAgICAgICAgICAgICAgID0gMHg0QiwgLyogQ3Vyc29yIGNvbnRyb2wga2V5cyAqLwotICAgIEtCX3JpZ2h0ICAgICAgICAgICAgICAgID0gMHg0RCwKLSAgICBLQl91cCAgICAgICAgICAgICAgICAgICA9IDB4NDgsCi0gICAgS0JfZG93biAgICAgICAgICAgICAgICAgPSAweDUwLAotICAgIEtCX2luc2VydCAgICAgICAgICAgICAgID0gMHg1MiwKLSAgICBLQl9kZWxldGUgICAgICAgICAgICAgICA9IDB4NTMsCi0gICAgS0JfaG9tZSAgICAgICAgICAgICAgICAgPSAweDQ3LAotICAgIEtCX2VuZCAgICAgICAgICAgICAgICAgID0gMHg0RiwKLSAgICBLQl9wYWdlVXAgICAgICAgICAgICAgICA9IDB4NDksCi0gICAgS0JfcGFnZURvd24gICAgICAgICAgICAgPSAweDUxLAotICAgIEtCX2NhcHNMb2NrICAgICAgICAgICAgID0gMHgzQSwKLSAgICBLQl9udW1Mb2NrICAgICAgICAgICAgICA9IDB4NDUsCi0gICAgS0Jfc2Nyb2xsTG9jayAgICAgICAgICAgPSAweDQ2LAotICAgIEtCX2xlZnRTaGlmdCAgICAgICAgICAgID0gMHgyQSwKLSAgICBLQl9yaWdodFNoaWZ0ICAgICAgICAgICA9IDB4MzYsCi0gICAgS0JfbGVmdEN0cmwgICAgICAgICAgICAgPSAweDFELAotICAgIEtCX3JpZ2h0Q3RybCAgICAgICAgICAgID0gMHg2QywKLSAgICBLQl9sZWZ0QWx0ICAgICAgICAgICAgICA9IDB4MzgsCi0gICAgS0JfcmlnaHRBbHQgICAgICAgICAgICAgPSAweDZELAotICAgIEtCX2xlZnRXaW5kb3dzICAgICAgICAgID0gMHg1QiwKLSAgICBLQl9yaWdodFdpbmRvd3MgICAgICAgICA9IDB4NUMsCi0gICAgS0JfbWVudSAgICAgICAgICAgICAgICAgPSAweDVELAotICAgIEtCX3N5c1JlcSAgICAgICAgICAgICAgID0gMHg1NCwKLSAgICBLQl9lc2MgICAgICAgICAgICAgICAgICA9IDB4MDEsIC8qIE5vcm1hbCBrZXlib2FyZCBrZXlzICovCi0gICAgS0JfMSAgICAgICAgICAgICAgICAgICAgPSAweDAyLAotICAgIEtCXzIgICAgICAgICAgICAgICAgICAgID0gMHgwMywKLSAgICBLQl8zICAgICAgICAgICAgICAgICAgICA9IDB4MDQsCi0gICAgS0JfNCAgICAgICAgICAgICAgICAgICAgPSAweDA1LAotICAgIEtCXzUgICAgICAgICAgICAgICAgICAgID0gMHgwNiwKLSAgICBLQl82ICAgICAgICAgICAgICAgICAgICA9IDB4MDcsCi0gICAgS0JfNyAgICAgICAgICAgICAgICAgICAgPSAweDA4LAotICAgIEtCXzggICAgICAgICAgICAgICAgICAgID0gMHgwOSwKLSAgICBLQl85ICAgICAgICAgICAgICAgICAgICA9IDB4MEEsCi0gICAgS0JfMCAgICAgICAgICAgICAgICAgICAgPSAweDBCLAotICAgIEtCX21pbnVzICAgICAgICAgICAgICAgID0gMHgwQywKLSAgICBLQl9lcXVhbHMgICAgICAgICAgICAgICA9IDB4MEQsCi0gICAgS0JfYmFja1NsYXNoICAgICAgICAgICAgPSAweDJCLAotICAgIEtCX2JhY2tzcGFjZSAgICAgICAgICAgID0gMHgwRSwKLSAgICBLQl90YWIgICAgICAgICAgICAgICAgICA9IDB4MEYsCi0gICAgS0JfUSAgICAgICAgICAgICAgICAgICAgPSAweDEwLAotICAgIEtCX1cgICAgICAgICAgICAgICAgICAgID0gMHgxMSwKLSAgICBLQl9FICAgICAgICAgICAgICAgICAgICA9IDB4MTIsCi0gICAgS0JfUiAgICAgICAgICAgICAgICAgICAgPSAweDEzLAotICAgIEtCX1QgICAgICAgICAgICAgICAgICAgID0gMHgxNCwKLSAgICBLQl9ZICAgICAgICAgICAgICAgICAgICA9IDB4MTUsCi0gICAgS0JfVSAgICAgICAgICAgICAgICAgICAgPSAweDE2LAotICAgIEtCX0kgICAgICAgICAgICAgICAgICAgID0gMHgxNywKLSAgICBLQl9PICAgICAgICAgICAgICAgICAgICA9IDB4MTgsCi0gICAgS0JfUCAgICAgICAgICAgICAgICAgICAgPSAweDE5LAotICAgIEtCX2xlZnRTcXVhcmVCcmFjZSAgICAgID0gMHgxQSwKLSAgICBLQl9yaWdodFNxdWFyZUJyYWNlICAgICA9IDB4MUIsCi0gICAgS0JfZW50ZXIgICAgICAgICAgICAgICAgPSAweDFDLAotICAgIEtCX0EgICAgICAgICAgICAgICAgICAgID0gMHgxRSwKLSAgICBLQl9TICAgICAgICAgICAgICAgICAgICA9IDB4MUYsCi0gICAgS0JfRCAgICAgICAgICAgICAgICAgICAgPSAweDIwLAotICAgIEtCX0YgICAgICAgICAgICAgICAgICAgID0gMHgyMSwKLSAgICBLQl9HICAgICAgICAgICAgICAgICAgICA9IDB4MjIsCi0gICAgS0JfSCAgICAgICAgICAgICAgICAgICAgPSAweDIzLAotICAgIEtCX0ogICAgICAgICAgICAgICAgICAgID0gMHgyNCwKLSAgICBLQl9LICAgICAgICAgICAgICAgICAgICA9IDB4MjUsCi0gICAgS0JfTCAgICAgICAgICAgICAgICAgICAgPSAweDI2LAotICAgIEtCX3NlbWljb2xvbiAgICAgICAgICAgID0gMHgyNywKLSAgICBLQl9hcG9zdHJvcGhlICAgICAgICAgICA9IDB4MjgsCi0gICAgS0JfWiAgICAgICAgICAgICAgICAgICAgPSAweDJDLAotICAgIEtCX1ggICAgICAgICAgICAgICAgICAgID0gMHgyRCwKLSAgICBLQl9DICAgICAgICAgICAgICAgICAgICA9IDB4MkUsCi0gICAgS0JfViAgICAgICAgICAgICAgICAgICAgPSAweDJGLAotICAgIEtCX0IgICAgICAgICAgICAgICAgICAgID0gMHgzMCwKLSAgICBLQl9OICAgICAgICAgICAgICAgICAgICA9IDB4MzEsCi0gICAgS0JfTSAgICAgICAgICAgICAgICAgICAgPSAweDMyLAotICAgIEtCX2NvbW1hICAgICAgICAgICAgICAgID0gMHgzMywKLSAgICBLQl9wZXJpb2QgICAgICAgICAgICAgICA9IDB4MzQsCi0gICAgS0JfZGl2aWRlICAgICAgICAgICAgICAgPSAweDM1LAotICAgIEtCX3NwYWNlICAgICAgICAgICAgICAgID0gMHgzOSwKLSAgICBLQl90aWxkZSAgICAgICAgICAgICAgICA9IDB4MjkKLSAgICB9IEVWVF9zY2FuQ29kZXNUeXBlOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURlZmluZXMgdGhlIG1hc2sgZm9yIHRoZSBqb3lzdGljayBheGVzIHRoYXQgYXJlIHByZXNlbnQKLQotSEVBREVSOgotZXZlbnQuaAotCi1NRU1CRVJTOgotRVZUX0pPWV9BWElTX1gxICAgICAtIEpveXN0aWNrIDEsIFggYXhpcyBpcyBwcmVzZW50Ci1FVlRfSk9ZX0FYSVNfWTEgICAgIC0gSm95c3RpY2sgMSwgWSBheGlzIGlzIHByZXNlbnQKLUVWVF9KT1lfQVhJU19YMiAgICAgLSBKb3lzdGljayAyLCBYIGF4aXMgaXMgcHJlc2VudAotRVZUX0pPWV9BWElTX1kyICAgICAtIEpveXN0aWNrIDIsIFkgYXhpcyBpcyBwcmVzZW50Ci1FVlRfSk9ZX0FYSVNfQUxMICAgIC0gTWFzayBmb3IgYWxsIGF4ZXMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIGVudW0gewotICAgIEVWVF9KT1lfQVhJU19YMSAgICAgPSAweDAwMDAwMDAxLAotICAgIEVWVF9KT1lfQVhJU19ZMSAgICAgPSAweDAwMDAwMDAyLAotICAgIEVWVF9KT1lfQVhJU19YMiAgICAgPSAweDAwMDAwMDA0LAotICAgIEVWVF9KT1lfQVhJU19ZMiAgICAgPSAweDAwMDAwMDA4LAotICAgIEVWVF9KT1lfQVhJU19BTEwgICAgPSAweDAwMDAwMDBGCi0gICAgfSBFVlRfZXZlbnRKb3lBeGlzVHlwZTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EZWZpbmVzIHRoZSBldmVudCBtZXNzYWdlIG1hc2tzIGZvciBqb3lzdGljayBldmVudHMKLQotSEVBREVSOgotZXZlbnQuaAotCi1NRU1CRVJTOgotRVZUX0pPWTFfQlVUVE9OQSAgICAtIEpveXN0aWNrIDEsIGJ1dHRvbiBBIGlzIGRvd24KLUVWVF9KT1kxX0JVVFRPTkIgICAgLSBKb3lzdGljayAxLCBidXR0b24gQiBpcyBkb3duCi1FVlRfSk9ZMl9CVVRUT05BICAgIC0gSm95c3RpY2sgMiwgYnV0dG9uIEEgaXMgZG93bgotRVZUX0pPWTJfQlVUVE9OQiAgICAtIEpveXN0aWNrIDIsIGJ1dHRvbiBCIGlzIGRvd24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIGVudW0gewotICAgIEVWVF9KT1kxX0JVVFRPTkEgICAgPSAweDAwMDAwMDAxLAotICAgIEVWVF9KT1kxX0JVVFRPTkIgICAgPSAweDAwMDAwMDAyLAotICAgIEVWVF9KT1kyX0JVVFRPTkEgICAgPSAweDAwMDAwMDA0LAotICAgIEVWVF9KT1kyX0JVVFRPTkIgICAgPSAweDAwMDAwMDA4Ci0gICAgfSBFVlRfZXZlbnRKb3lNYXNrVHlwZTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EZWZpbmVzIHRoZSBldmVudCBtZXNzYWdlIG1hc2tzIGZvciBtb3VzZSBldmVudHMKLQotSEVBREVSOgotZXZlbnQuaAotCi1NRU1CRVJTOgotRVZUX0xFRlRCTUFTSyAgIC0gTGVmdCBidXR0b24gaXMgaGVsZCBkb3duCi1FVlRfUklHSFRCTUFTSyAgLSBSaWdodCBidXR0b24gaXMgaGVsZCBkb3duCi1FVlRfTUlERExFQk1BU0sgLSBNaWRkbGUgYnV0dG9uIGlzIGhlbGQgZG93bgotRVZUX0JPVEhCTUFTSyAgIC0gQm90aCBsZWZ0IGFuZCByaWdodCBoZWxkIGRvd24gdG9nZXRoZXIKLUVWVF9BTExCTUFTSyAgICAtIEFsbCBidXR0b25zIHByZXNzZWQKLUVWVF9EQkxDTElDSyAgICAtIFNldCBpZiBtb3VzZSBkb3duIGV2ZW50IHdhcyBhIGRvdWJsZSBjbGljawotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgRVZUX0xFRlRCTUFTSyAgID0gMHgwMDAwMDAwMSwKLSAgICBFVlRfUklHSFRCTUFTSyAgPSAweDAwMDAwMDAyLAotICAgIEVWVF9NSURETEVCTUFTSyA9IDB4MDAwMDAwMDQsCi0gICAgRVZUX0JPVEhCTUFTSyAgID0gMHgwMDAwMDAwNywKLSAgICBFVlRfQUxMQk1BU0sgICAgPSAweDAwMDAwMDA3LAotICAgIEVWVF9EQkxDTElDSyAgICA9IDB4MDAwMTAwMDAKLSAgICB9IEVWVF9ldmVudE1vdXNlTWFza1R5cGU7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGVmaW5lcyB0aGUgZXZlbnQgbW9kaWZpZXIgbWFza3MuIFRoZXNlIGFyZSB0aGUgbWFza3MgdXNlZCB0byBleHRyYWN0Ci10aGUgbW9kaWZpZXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgbW9kaWZpZXJzIGZpZWxkIG9mIHRoZSBldmVudF90IHN0cnVjdHVyZS4KLU5vdGUgdGhhdCB0aGUgdmFsdWVzIGluIHRoZSBtb2RpZmllcnMgZmllbGQgcmVwcmVzZW50IHRoZSB2YWx1ZXMgb2YgdGhlc2UKLW1vZGlmaWVyIGtleXMgYXQgdGhlIHRpbWUgdGhlIGV2ZW50IG9jY3VycmVkLCBub3QgdGhlIHRpbWUgeW91IGRlY2lkZWQKLXRvIHByb2Nlc3MgdGhlIGV2ZW50LgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLU1FTUJFUlM6Ci1FVlRfTEVGVEJVVCAgICAgLSBTZXQgaWYgbGVmdCBtb3VzZSBidXR0b24gd2FzIGRvd24KLUVWVF9SSUdIVEJVVCAgICAtIFNldCBpZiByaWdodCBtb3VzZSBidXR0b24gd2FzIGRvd24KLUVWVF9NSURETEVCVVQgICAtIFNldCBpZiB0aGUgbWlkZGxlIGJ1dHRvbiB3YXMgZG93bgotRVZUX1JJR0hUU0hJRlQgIC0gU2V0IGlmIHJpZ2h0IHNoaWZ0IHdhcyBkb3duCi1FVlRfTEVGVFNISUZUICAgLSBTZXQgaWYgbGVmdCBzaGlmdCB3YXMgZG93bgotRVZUX1JJR0hUQ1RSTCAgIC0gU2V0IGlmIHJpZ2h0IGN0cmwga2V5IHdhcyBkb3duCi1FVlRfUklHSFRBTFQgICAgLSBTZXQgaWYgcmlnaHQgYWx0IGtleSB3YXMgZG93bgotRVZUX0xFRlRDVFJMICAgIC0gU2V0IGlmIGxlZnQgY3RybCBrZXkgd2FzIGRvd24KLUVWVF9MRUZUQUxUICAgICAtIFNldCBpZiBsZWZ0IGFsdCBrZXkgd2FzIGRvd24KLUVWVF9TSElGVEtFWSAgICAtIE1hc2sgZm9yIGFueSBzaGlmdCBrZXkgZG93bgotRVZUX0NUUkxTVEFURSAgIC0gU2V0IGlmIGN0cmwga2V5IHdhcyBkb3duCi1FVlRfQUxUU1RBVEUgICAgLSBTZXQgaWYgYWx0IGtleSB3YXMgZG93bgotRVZUX0NBUFNMT0NLICAgIC0gQ2FwcyBsb2NrIGlzIGFjdGl2ZQotRVZUX05VTUxPQ0sgICAgIC0gTnVtIGxvY2sgaXMgYWN0aXZlCi1FVlRfU0NST0xMTE9DSyAgLSBTY3JvbGwgbG9jayBpcyBhY3RpdmUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIGVudW0gewotICAgIEVWVF9MRUZUQlVUICAgICA9IDB4MDAwMDAwMDEsCi0gICAgRVZUX1JJR0hUQlVUICAgID0gMHgwMDAwMDAwMiwKLSAgICBFVlRfTUlERExFQlVUICAgPSAweDAwMDAwMDA0LAotICAgIEVWVF9SSUdIVFNISUZUICA9IDB4MDAwMDAwMDgsCi0gICAgRVZUX0xFRlRTSElGVCAgID0gMHgwMDAwMDAxMCwKLSAgICBFVlRfUklHSFRDVFJMICAgPSAweDAwMDAwMDIwLAotICAgIEVWVF9SSUdIVEFMVCAgICA9IDB4MDAwMDAwNDAsCi0gICAgRVZUX0xFRlRDVFJMICAgID0gMHgwMDAwMDA4MCwKLSAgICBFVlRfTEVGVEFMVCAgICAgPSAweDAwMDAwMTAwLAotICAgIEVWVF9TSElGVEtFWSAgICA9IDB4MDAwMDAwMTgsCi0gICAgRVZUX0NUUkxTVEFURSAgID0gMHgwMDAwMDBBMCwKLSAgICBFVlRfQUxUU1RBVEUgICAgPSAweDAwMDAwMTQwLAotICAgIEVWVF9TQ1JPTExMT0NLICA9IDB4MDAwMDAyMDAsCi0gICAgRVZUX05VTUxPQ0sgICAgID0gMHgwMDAwMDQwMCwKLSAgICBFVlRfQ0FQU0xPQ0sgICAgPSAweDAwMDAwODAwCi0gICAgfSBFVlRfZXZlbnRNb2RNYXNrVHlwZTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EZWZpbmVzIHRoZSBldmVudCBjb2RlcyByZXR1cm5lZCBpbiB0aGUgZXZlbnRfdCBzdHJ1Y3R1cmVzIHdoYXQgZmllbGQuIE5vdGUKLXRoYXQgdGhlc2UgYXJlIGRlZmluZWQgYXMgYSBzZXQgb2YgbXV0dWFsbHkgZXhsdXNpdmUgYml0IGZpZWxkcywgc28geW91Ci1jYW4gdGVzdCBmb3IgbXVsdGlwbGUgZXZlbnQgdHlwZXMgdXNpbmcgdGhlIGNvbWJpbmVkIGV2ZW50IG1hc2tzIGRlZmluZWQKLWluIHRoZSBFVlRfZXZlbnRNYXNrVHlwZSBlbnVtZXJhdGlvbi4KLQotSEVBREVSOgotZXZlbnQuaAotCi1NRU1CRVJTOgotRVZUX05VTExFVlQgICAgIC0gQSBudWxsIGV2ZW50Ci1FVlRfS0VZRE9XTiAgICAgLSBLZXkgZG93biBldmVudAotRVZUX0tFWVJFUEVBVCAgIC0gS2V5IHJlcGVhdCBldmVudAotRVZUX0tFWVVQICAgICAgIC0gS2V5IHVwIGV2ZW50Ci1FVlRfTU9VU0VET1dOICAgLSBNb3VzZSBkb3duIGV2ZW50Ci1FVlRfTU9VU0VBVVRPICAgLSBNb3VzZSBkb3duIGF1dG9yZXBlYXQgZXZlbnQKLUVWVF9NT1VTRVVQICAgICAtIE1vdXNlIHVwIGV2ZW50Ci1FVlRfTU9VU0VNT1ZFICAgLSBNb3VzZSBtb3ZlbWVudCBldmVudAotRVZUX0pPWUNMSUNLICAgIC0gSm95c3RpY2sgYnV0dG9uIHN0YXRlIGNoYW5nZSBldmVudAotRVZUX0pPWU1PVkUgICAgIC0gSm95c3RpY2sgbW92ZW1lbnQgZXZlbnQKLUVWVF9VU0VSRVZUICAgICAtIEZpcnN0IHVzZXIgZXZlbnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIGVudW0gewotICAgIEVWVF9OVUxMRVZUICAgICA9IDB4MDAwMDAwMDAsCi0gICAgRVZUX0tFWURPV04gICAgID0gMHgwMDAwMDAwMSwKLSAgICBFVlRfS0VZUkVQRUFUICAgPSAweDAwMDAwMDAyLAotICAgIEVWVF9LRVlVUCAgICAgICA9IDB4MDAwMDAwMDQsCi0gICAgRVZUX01PVVNFRE9XTiAgID0gMHgwMDAwMDAwOCwKLSAgICBFVlRfTU9VU0VBVVRPICAgPSAweDAwMDAwMDEwLAotICAgIEVWVF9NT1VTRVVQICAgICA9IDB4MDAwMDAwMjAsCi0gICAgRVZUX01PVVNFTU9WRSAgID0gMHgwMDAwMDA0MCwKLSAgICBFVlRfSk9ZQ0xJQ0sgICAgPSAweDAwMDAwMDgwLAotICAgIEVWVF9KT1lNT1ZFICAgICA9IDB4MDAwMDAxMDAsCi0gICAgRVZUX1VTRVJFVlQgICAgID0gMHgwMDAwMDIwMAotICAgIH0gRVZUX2V2ZW50VHlwZTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EZWZpbmVzIHRoZSBldmVudCBjb2RlIG1hc2tzIHlvdSBjYW4gdXNlIHRvIHRlc3QgZm9yIG11bHRpcGxlIHR5cGVzIG9mCi1ldmVudHMsIHNpbmNlIHRoZSBldmVudCBjb2RlcyBhcmUgbXV0dWFsbHkgZXhsdXNpdmUgYml0IGZpZWxkcy4KLQotSEVBREVSOgotZXZlbnQuaAotCi1NRU1CRVJTOgotRVZUX0tFWUVWVCAgICAgIC0gTWFzayBmb3IgYW55IGtleSBldmVudAotRVZUX01PVVNFRVZUICAgIC0gTWFzayBmb3IgYW55IG1vdXNlIGV2ZW50Ci1FVlRfTU9VU0VDTElDSyAgLSBNYXNrIGZvciBhbnkgbW91c2UgY2xpY2sgZXZlbnQKLUVWVF9KT1lFVlQgICAgICAtIE1hc2sgZm9yIGFueSBqb3lzdGljayBldmVudAotRVZUX0VWRVJZRVZUICAgIC0gTWFzayBmb3IgYW55IGV2ZW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBlbnVtIHsKLSAgICBFVlRfS0VZRVZUICAgICAgPSAoRVZUX0tFWURPV04gfCBFVlRfS0VZUkVQRUFUIHwgRVZUX0tFWVVQKSwKLSAgICBFVlRfTU9VU0VFVlQgICAgPSAoRVZUX01PVVNFRE9XTiB8IEVWVF9NT1VTRUFVVE8gfCBFVlRfTU9VU0VVUCB8IEVWVF9NT1VTRU1PVkUpLAotICAgIEVWVF9NT1VTRUNMSUNLICA9IChFVlRfTU9VU0VET1dOIHwgRVZUX01PVVNFVVApLAotICAgIEVWVF9KT1lFVlQgICAgICA9IChFVlRfSk9ZQ0xJQ0sgfCBFVlRfSk9ZTU9WRSksCi0gICAgRVZUX0VWRVJZRVZUICAgID0gMHg3RkZGRkZGRgotICAgIH0gRVZUX2V2ZW50TWFza1R5cGU7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiBhbiBldmVudCBleHRyYWN0ZWQgZnJvbQotdGhlIGV2ZW50IHF1ZXVlLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLU1FTUJFUlM6Ci13aGljaCAgICAgICAtIFdpbmRvdyBpZGVudGlmaWVyIGZvciBtZXNzYWdlIGZvciB1c2UgYnkgaGlnaCBsZXZlbCB3aW5kb3cgbWFuYWdlcgotCSAgICAgIGNvZGUgKGkuZS4gTWVnYVZpc2lvbiBHVUkgb3IgV2luZG93cyBBUEkpLgotd2hhdCAgICAgICAgLSBUeXBlIG9mIGV2ZW50IHRoYXQgb2NjdXJyZWQuIFdpbGwgYmUgb25lIG9mIHRoZSB2YWx1ZXMgZGVmaW5lZCBieQotCSAgICAgIHRoZSBFVlRfZXZlbnRUeXBlIGVudW1lcmF0aW9uLgotd2hlbiAgICAgICAgLSBUaW1lIHRoYXQgdGhlIGV2ZW50IG9jY3VycmVkIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBzdGFydHVwCi13aGVyZV94ICAgICAtIFggY29vcmRpbmF0ZSBvZiB0aGUgbW91c2UgY3Vyc29yIGxvY2F0aW9uIGF0IHRoZSB0aW1lIG9mIHRoZSBldmVudAotCSAgICAgIChpbiBzY3JlZW4gY29vcmRpbmF0ZXMpLiBGb3Igam95c3RpY2sgZXZlbnRzIHRoaXMgcmVwcmVzZW50cwotCSAgICAgIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3Qgam95c3RpY2sgWCBheGlzLgotd2hlcmVfeSAgICAgLSBZIGNvb3JkaW5hdGUgb2YgdGhlIG1vdXNlIGN1cnNvciBsb2NhdGlvbiBhdCB0aGUgdGltZSBvZiB0aGUgZXZlbnQKLQkgICAgICAoaW4gc2NyZWVuIGNvb3JkaW5hdGVzKS4gRm9yIGpveXN0aWNrIGV2ZW50cyB0aGlzIHJlcHJlc2VudHMKLQkgICAgICB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGpveXN0aWNrIFkgYXhpcy4KLXJlbGF0aXZlX3ggIC0gUmVsYXRpdmUgbW92ZW1lbnQgb2YgdGhlIG1vdXNlIGN1cnNvciBpbiB0aGUgWCBkaXJlY3Rpb24gKGluCi0JICAgICAgdW5pdHMgb2YgbWlja2V5cywgb3IgMS8yMDB0aCBvZiBhbiBpbmNoKS4gRm9yIGpveXN0aWNrIGV2ZW50cwotCSAgICAgIHRoaXMgcmVwcmVzZW50cyB0aGUgcG9zaXRpb24gb2YgdGhlIHNlY29uZCBqb3lzdGljayBYIGF4aXMuCi1yZWxhdGl2ZV95ICAtIFJlbGF0aXZlIG1vdmVtZW50IG9mIHRoZSBtb3VzZSBjdXJzb3IgaW4gdGhlIFkgZGlyZWN0aW9uIChpbgotCSAgICAgIHVuaXRzIG9mIG1pY2tleXMsIG9yIDEvMjAwdGggb2YgYW4gaW5jaCkuIEZvciBqb3lzdGljayBldmVudHMKLQkgICAgICB0aGlzIHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBzZWNvbmQgam95c3RpY2sgWSBheGlzLgotbWVzc2FnZSAgICAgLSBFdmVudCBzcGVjaWZpYyBtZXNzYWdlIGZvciB0aGUgZXZlbnQuIEZvciB1c2UgZXZlbnRzIHRoaXMgY2FuIGJlCi0JICAgICAgYW55IHVzZXIgc3BlY2lmaWMgaW5mb3JtYXRpb24uIEZvciBrZXlib2FyZCBldmVudHMgdGhpcyBjb250YWlucwotCSAgICAgIHRoZSBBU0NJSSBjb2RlIGluIGJpdHMgMC03LCB0aGUga2V5Ym9hcmQgc2NhbiBjb2RlIGluIGJpdHMgOC0xNSBhbmQKLQkgICAgICB0aGUgY2hhcmFjdGVyIHJlcGVhdCBjb3VudCBpbiBiaXRzIDE2LTMwLiBZb3UgY2FuIHVzZSB0aGUKLQkgICAgICBFVlRfYXNjaWlDb2RlLCBFVlRfc2NhbkNvZGUgYW5kIEVWVF9yZXBlYXRDb3VudCBtYWNyb3MgdG8gZXh0cmFjdAotCSAgICAgIHRoaXMgaW5mb3JtYXRpb24gZnJvbSB0aGUgbWVzc2FnZSBmaWVsZC4gRm9yIG1vdXNlIGV2ZW50cyB0aGlzCi0JICAgICAgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgd2hpY2ggYnV0dG9uIHdhcyBwcmVzc2VkLCBhbmQgd2lsbCBiZSBhCi0JICAgICAgY29tYmluYXRpb24gb2YgdGhlIGZsYWdzIGRlZmluZWQgYnkgdGhlIEVWVF9ldmVudE1vdXNlTWFza1R5cGUKLQkgICAgICBlbnVtZXJhdGlvbi4gRm9yIGpveXN0aWNrIGV2ZW50cywgdGhpcyBjb25hdGlucyBpbmZvcm1hdGlvbgotCSAgICAgIGFib3V0IHdoaWNoIGJ1dHRvbnMgd2VyZSBwcmVzc2VkLCBhbmQgd2lsbCBiZSBhIGNvbWJpbmF0aW9uIG9mCi0JICAgICAgdGhlIGZsYWdzIGRlZmluZWQgYnkgdGhlIEVWVF9ldmVudEpveU1hc2tUeXBlIGVudW1lcmF0aW9uLgotbW9kaWZpZXJzICAgLSBDb250YWlucyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0ZSBvZiB0aGUga2V5Ym9hcmQKLQkgICAgICBzaGlmdCBtb2RpZmllcnMgKEN0cmwsIEFsdCBhbmQgU2hpZnQga2V5cykgd2hlbiB0aGUgZXZlbnQKLQkgICAgICBvY2N1cnJlZC4gRm9yIG1vdXNlIGV2ZW50cyBpdCB3aWxsIGFsc28gY29udGFpbiB0aGUgc3RhdGUgb2YKLQkgICAgICB0aGUgbW91c2UgYnV0dG9ucy4gV2lsbCBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSB2YWx1ZXMgZGVmaW5lZAotCSAgICAgIGJ5IHRoZSBFVlRfZXZlbnRNb2RNYXNrVHlwZSBlbnVtZXJhdGlvbi4KLW5leHQgICAgICAgIC0gSW50ZXJuYWwgdXNlOyBkbyBub3QgdXNlLgotcHJldiAgICAgICAgLSBJbnRlcm5hbCB1c2U7IGRvIG5vdCB1c2UuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVsb25nICAgICAgIHdoaWNoOwotICAgIHVsb25nICAgICAgIHdoYXQ7Ci0gICAgdWxvbmcgICAgICAgd2hlbjsKLSAgICBpbnQgICAgICAgICB3aGVyZV94OwotICAgIGludCAgICAgICAgIHdoZXJlX3k7Ci0gICAgaW50ICAgICAgICAgcmVsYXRpdmVfeDsKLSAgICBpbnQgICAgICAgICByZWxhdGl2ZV95OwotICAgIHVsb25nICAgICAgIG1lc3NhZ2U7Ci0gICAgdWxvbmcgICAgICAgbW9kaWZpZXJzOwotICAgIGludCAgICAgICAgIG5leHQ7Ci0gICAgaW50ICAgICAgICAgcHJldjsKLSAgICB9IGV2ZW50X3Q7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU3RydWN0dXJlIGRlc2NyaWJpbmcgYW4gZW50cnkgaW4gdGhlIGNvZGUgcGFnZSB0YWJsZS4gQSB0YWJsZSBvZiB0cmFuc2xhdGlvbgotY29kZXMgZm9yIHNjYW4gY29kZXMgdG8gQVNDSUkgY29kZXMgaXMgcHJvdmlkZWQgaW4gdGhpcyB0YWJsZSB0byBiZSB1c2VkCi1ieSB0aGUga2V5Ym9hcmQgZXZlbnQgbGlicmFyaWVzLiBPbiBzb21lIE9TJ2VzIHRoZSBrZXlib2FyZCB0cmFuc2xhdGlvbiBpcwotaGFuZGxlZCBieSB0aGUgT1MsIGJ1dCBmb3IgRE9TIGFuZCBlbWJlZGRlZCBzeXN0ZW1zIHlvdSBtdXN0IHJlZ2lzdGVyIGEKLWRpZmZlcmVudCBjb2RlIHBhZ2UgdHJhbnNsYXRpb24gdGFibGUgaWYgeW91IHdhbnQgdG8gc3VwcG9ydCBrZXlib2FyZHMKLW90aGVyIHRoYW4gdGhlIFVTIEVuZ2xpc2gga2V5Ym9hcmQgKHRoZSBkZWZhdWx0KS4KLQotTk9URTogICBFbnRyaWVzIGluIGNvZGUgcGFnZSB0YWJsZXMgKm11c3QqIGJlIGluIGFzY2VuZGluZyBvcmRlciBmb3IgdGhlCi0Jc2NhbiBjb2RlcyBhcyB3ZSBkbyBhIGJpbmFyeSBzZWFyY2ggb24gdGhlIHRhYmxlcyBmb3IgdGhlIEFTQ0lJCi0JY29kZSBlcXVpdmFsZW50cy4KLQotSEVBREVSOgotZXZlbnQuaAotCi1NRU1CRVJTOgotc2NhbkNvZGUgICAgLSBTY2FuIGNvZGUgdG8gdHJhbnNsYXRlIChyZWFsbHkgdGhlIHZpcnR1YWwgc2NhbiBjb2RlKS4KLWFzY2lpQ29kZSAgIC0gQVNDSUkgY29kZSBmb3IgdGhpcyBzY2FuIGNvZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVjaGFyICAgICAgIHNjYW5Db2RlOwotICAgIHVjaGFyICAgICAgIGFzY2lpQ29kZTsKLSAgICB9IGNvZGVwYWdlX2VudHJ5X3Q7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU3RydWN0dXJlIGRlc2NyaWJpbmcgYSBjb21wbGV0ZSBjb2RlIHBhZ2UgdHJhbnNsYXRpb24gdGFibGUuIFRoZSB0YWJsZQotY29udGFpbnMgdHJhbnNsYXRpb24gdGFibGVzIGZvciBub3JtYWwga2V5cywgc2hpZnRlZCBrZXlzIGFuZCBjdHJsIGtleXMuCi1UaGUgQ3RybCBrZXkgYWx3YXlzIGhhcyBwcmVjZWRlbmNlIG92ZXIgdGhlIHNoaWZ0IHRhYmxlLCBhbmQgdGhlIHNoaWZ0Ci10YWJsZSBpcyB1c2VkIHdoZW4gdGhlIHNoaWZ0IGtleSBpcyBkb3duIG9yIHRoZSBDQVBTTE9DSyBrZXkgaXMgZG93bi4KLQotSEVBREVSOgotZXZlbnQuaAotCi1NRU1CRVJTOgotbmFtZSAgICAgICAgICAgIC0gTmFtZSBvZiB0aGUgY29kZSBwYWdlIHRhYmxlIChpZTogIlVTIEVuZ2xpc2giKQotbm9ybWFsICAgICAgICAgIC0gQ29kZSBwYWdlIGZvciB0cmFuc2xhdGluZyBub3JtYWwga2V5cwotbm9ybWFsTGVuICAgICAgIC0gTGVuZ3RoIG9mIG5vcm1hbCB0cmFuc2xhdGlvbiB0YWJsZQotY2FwcyAgICAgICAgICAgIC0gQ29kZSBwYWdlIGZvciB0cmFuc2xhdGluZyBrZXlzIHdoZW4gQ0FQU0xPQ0sgaXMgZG93bgotY2Fwc0xlbiAgICAgICAgIC0gTGVuZ3RoIG9mIENBUFNMT0NLIHRyYW5zbGF0aW9uIHRhYmxlCi1zaGlmdCAgICAgICAgICAgLSBDb2RlIHBhZ2UgZm9yIHNoaWZ0ZWQga2V5cyAoaWU6IHNoaWZ0IGtleSBpcyBoZWxkIGRvd24pCi1zaGlmdExlbiAgICAgICAgLSBMZW5ndGggb2Ygc2hpZnRlZCB0cmFuc2xhdGlvbiB0YWJsZQotc2hpZnRDYXBzICAgICAgIC0gQ29kZSBwYWdlIGZvciBzaGlmdGVkIGtleXMgd2hlbiBDQVBTTE9DSyBpcyBkb3duCi1zaGlmdENhcHNMZW4gICAgLSBMZW5ndGggb2Ygc2hpZnRlZCBDQVBTTE9DSyB0cmFuc2xhdGlvbiB0YWJsZQotY3RybCAgICAgICAgICAgIC0gQ29kZSBwYWdlIGZvciBjdHJsJ2VkIGtleXMgKGllOiBjdHJsIGtleSBpcyBoZWxkIGRvd24pCi1jdHJsTGVuICAgICAgICAgLSBMZW5ndGggb2YgY3RybCdlZCB0cmFuc2xhdGlvbiB0YWJsZQotbnVtUGFkICAgICAgICAgIC0gQ29kZSBwYWdlIGZvciBOVU1MT0NLJ2VkIGtleXBhZCBrZXlzCi1udW1QYWRMZW4gICAgICAgLSBMZW5ndGggb2YgTlVNTE9DSydlZCB0cmFuc2xhdGlvbiB0YWJsZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjaGFyICAgICAgICAgICAgICAgIG5hbWVbMjBdOwotICAgIGNvZGVwYWdlX2VudHJ5X3QgICAgKm5vcm1hbDsKLSAgICBpbnQgICAgICAgICAgICAgICAgIG5vcm1hbExlbjsKLSAgICBjb2RlcGFnZV9lbnRyeV90ICAgICpjYXBzOwotICAgIGludCAgICAgICAgICAgICAgICAgY2Fwc0xlbjsKLSAgICBjb2RlcGFnZV9lbnRyeV90ICAgICpzaGlmdDsKLSAgICBpbnQgICAgICAgICAgICAgICAgIHNoaWZ0TGVuOwotICAgIGNvZGVwYWdlX2VudHJ5X3QgICAgKnNoaWZ0Q2FwczsKLSAgICBpbnQgICAgICAgICAgICAgICAgIHNoaWZ0Q2Fwc0xlbjsKLSAgICBjb2RlcGFnZV9lbnRyeV90ICAgICpjdHJsOwotICAgIGludCAgICAgICAgICAgICAgICAgY3RybExlbjsKLSAgICBjb2RlcGFnZV9lbnRyeV90ICAgICpudW1QYWQ7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBudW1QYWRMZW47Ci0gICAgfSBjb2RlcGFnZV90OwotCi0vKiB7c2VjcmV0fSAqLwotdHlwZWRlZiBpYm9vbCAoRVZUQVBJUCBfRVZUX3VzZXJFdmVudEZpbHRlcikoZXZlbnRfdCAqZXZ0KTsKLS8qIHtzZWNyZXR9ICovCi10eXBlZGVmIHZvaWQgKEVWVEFQSVAgX0VWVF9tb3VzZU1vdmVIYW5kbGVyKShpbnQgeCxpbnQgeSk7Ci0vKiB7c2VjcmV0fSAqLwotdHlwZWRlZiB2b2lkIChFVlRBUElQIF9FVlRfaGVhcnRCZWF0Q2FsbGJhY2spKHZvaWQgKnBhcmFtcyk7Ci0KLS8qIE1hY3JvIHRvIGZpbmQgdGhlIHNpemUgb2YgYSBzdGF0aWMgYXJyYXkgKi8KLQotI2RlZmluZSBFVlRfQVJSX1NJWkUoYSkgICAgICAgICAoc2l6ZW9mKGEpL3NpemVvZigoYSlbMF0pKQotCi0jcHJhZ21hIHBhY2soKQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgICAgICAgICAgICAvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLwotI2VuZGlmCi0KLS8qIFN0YW5kYXJkIGNvZGUgcGFnZSB0YWJsZXMgKi8KLQotZXh0ZXJuIGNvZGVwYWdlX3QgX0NQX1VTX0VuZ2xpc2g7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbiBQcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFB1YmxpYyBBUEkgZnVuY3Rpb25zIGZvciB1c2VyIGFwcGxpY2F0aW9ucyAqLwotCi1pYm9vbCAgIEVWVEFQSSBFVlRfZ2V0TmV4dChldmVudF90ICpldnQsdWxvbmcgbWFzayk7Ci1pYm9vbCAgIEVWVEFQSSBFVlRfcGVla05leHQoZXZlbnRfdCAqZXZ0LHVsb25nIG1hc2spOwotaWJvb2wgICBFVlRBUEkgRVZUX3Bvc3QodWxvbmcgd2hpY2gsdWxvbmcgd2hhdCx1bG9uZyBtZXNzYWdlLHVsb25nIG1vZGlmaWVycyk7Ci12b2lkICAgIEVWVEFQSSBFVlRfZmx1c2godWxvbmcgbWFzayk7Ci12b2lkICAgIEVWVEFQSSBFVlRfaGFsdChldmVudF90ICpldnQsdWxvbmcgbWFzayk7Ci1pYm9vbCAgIEVWVEFQSSBFVlRfaXNLZXlEb3duKHVjaGFyIHNjYW5Db2RlKTsKLXZvaWQgICAgRVZUQVBJIEVWVF9zZXRNb3VzZVBvcyhpbnQgeCxpbnQgeSk7Ci12b2lkICAgIEVWVEFQSSBFVlRfZ2V0TW91c2VQb3MoaW50ICp4LGludCAqeSk7Ci0KLS8qIEZ1bmN0aW9uIHRvIGVuYWJsZS9kaXNhYmxlIHVwZGF0aW5nIG9mIGtleWJvYXJkIExFRCBzdGF0dXMgaW5kaWNhdG9ycyAqLwotCi12b2lkICAgIEVWVEFQSSBFVlRfYWxsb3dMRURTKGlib29sIGVuYWJsZSk7Ci0KLS8qIEZ1bmN0aW9uIHRvIGluc3RhbGwgYSBjdXN0b20ga2V5Ym9hcmQgY29kZSBwYWdlLiBEZWZhdWx0IGlzIFVTIEVuZ2xpc2ggKi8KLQotY29kZXBhZ2VfdCAqRVZUQVBJIEVWVF9nZXRDb2RlUGFnZSh2b2lkKTsKLXZvaWQgICAgRVZUQVBJIEVWVF9zZXRDb2RlUGFnZShjb2RlcGFnZV90ICpwYWdlKTsKLQotLyogRnVuY3Rpb25zIGZvciBmaW5lIGdyYWluZWQgam95c3RpY2sgY2FsaWJyYXRpb24gKi8KLQotdm9pZCAgICBFVlRBUEkgRVZUX3BvbGxKb3lzdGljayh2b2lkKTsKLWludCAgICAgRVZUQVBJIEVWVF9qb3lJc1ByZXNlbnQodm9pZCk7Ci12b2lkICAgIEVWVEFQSSBFVlRfam95U2V0VXBwZXJMZWZ0KHZvaWQpOwotdm9pZCAgICBFVlRBUEkgRVZUX2pveVNldExvd2VyUmlnaHQodm9pZCk7Ci12b2lkICAgIEVWVEFQSSBFVlRfam95U2V0Q2VudGVyKHZvaWQpOwotCi0vKiBJbnN0YWxsIHVzZXIgc3VwcGxpZWQgZXZlbnQgZmlsdGVyIGNhbGxiYWNrICovCi0KLXZvaWQgICAgRVZUQVBJIEVWVF9zZXRVc2VyRXZlbnRGaWx0ZXIoX0VWVF91c2VyRXZlbnRGaWx0ZXIgZmlsdGVyKTsKLQotLyogSW5zdGFsbCB1c2VyIHN1cHBsaWVkIGV2ZW50IGhlYXJ0YmVhdCBjYWxsYmFjayBmdW5jdGlvbiAqLwotCi12b2lkICAgIEVWVEFQSSBFVlRfc2V0SGVhcnRCZWF0Q2FsbGJhY2soX0VWVF9oZWFydEJlYXRDYWxsYmFjayBjYWxsYmFjayx2b2lkICpwYXJhbXMpOwotdm9pZCAgICBFVlRBUEkgRVZUX2dldEhlYXJ0QmVhdENhbGxiYWNrKF9FVlRfaGVhcnRCZWF0Q2FsbGJhY2sgKmNhbGxiYWNrLHZvaWQgKipwYXJhbXMpOwotCi0vKiBJbnRlcm5hbCBmdW5jdGlvbnMgdG8gaW5pdGlhbGlzZSBhbmQga2lsbCB0aGUgZXZlbnQgbWFuYWdlci4gTUdMCi0gKiBhcHBsaWNhdGlvbnMgc2hvdWxkIG5ldmVyIGNhbGwgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IGFzIHRoZSBNR0wKLSAqIGxpYnJhcmllcyBkbyBpdCBmb3IgeW91LgotICovCi0KLS8qIHtzZWNyZXR9ICovCi12b2lkICAgIEVWVEFQSSBFVlRfaW5pdChfRVZUX21vdXNlTW92ZUhhbmRsZXIgbW91c2VNb3ZlKTsKLS8qIHtzZWNyZXR9ICovCi12b2lkICAgIEVWVEFQSSBFVlRfc2V0TW91c2VSYW5nZShpbnQgeFJlcyxpbnQgeVJlcyk7Ci0vKiB7c2VjcmV0fSAqLwotdm9pZCAgICBFVlRBUEkgRVZUX3N1c3BlbmQodm9pZCk7Ci0vKiB7c2VjcmV0fSAqLwotdm9pZCAgICBFVlRBUEkgRVZUX3Jlc3VtZSh2b2lkKTsKLS8qIHtzZWNyZXR9ICovCi12b2lkICAgIEVWVEFQSSBFVlRfZXhpdCh2b2lkKTsKLQotI2lmZGVmICBfX2NwbHVzcGx1cwotfSAgICAgICAgICAgICAgICAgICAgICAgLyogRW5kIG9mICJDIiBsaW5rYWdlIGZvciBDKysgICAqLwotI2VuZGlmICAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgIC8qIF9fRVZFTlRfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL210cnIuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9tdHJyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOTgxMmMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL210cnIuaAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIEluY2x1ZGUgZmlsZSBkZWZpbmluZyB0aGUgZXh0ZXJuYWwgcmluZyAwIGhlbHBlciBmdW5jdGlvbnMKLSogICAgICAgICAgICAgICBuZWVkZWQgYnkgdGhlIE1UUlIgbW9kdWxlLiBUaGVzZSBmdW5jdGlvbnMgbWF5IGJlIGluY2x1ZGVkCi0qICAgICAgICAgICAgICAgZGlyZWN0bHkgZm9yIG5hdGl2ZSByaW5nIDAgZGV2aWNlIGRyaXZlcnMsIG9yIHRoZXkgbWF5Ci0qICAgICAgICAgICAgICAgYmUgY2FsbHMgZG93biB0byBhIHJpbmcgMCBoZWxwZXIgZGV2aWNlIGRyaXZlciB3aGVyZQotKiAgICAgICAgICAgICAgIGFwcHJvcHJpYXRlIChvciB0aGUgZW50aXJlIE1UUlIgbW9kdWxlIG1heSBiZSBsb2NhdGVkIGluCi0qICAgICAgICAgICAgICAgdGhlIGRldmljZSBkcml2ZXIgaWYgdGhlIGRldmljZSBkcml2ZXIgaXMgMzItYml0KS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19NVFJSX0gKLSNkZWZpbmUgX19NVFJSX0gKLQotI2luY2x1ZGUgInNjaXRlY2guaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnVuY3Rpb24gUHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmICBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7ICAgICAgICAgICAgLyogVXNlICJDIiBsaW5rYWdlIHdoZW4gaW4gQysrIG1vZGUgKi8KLSNlbmRpZgotCi0vKiBJbnRlcm5hbCBmdW5jdGlvbnMgKHJlcXVpcmVzIHJpbmcgMCBhY2Nlc3Mgb3IgaGVscGVyIGZ1bmN0aW9ucyEpICovCi0KLXZvaWQgICAgTVRSUl9pbml0KHZvaWQpOwotaW50ICAgICBNVFJSX2VuYWJsZVdyaXRlQ29tYmluZSh1bG9uZyBiYXNlLHVsb25nIHNpemUsdWludCB0eXBlKTsKLQotLyogRXh0ZXJuYWwgYXNzZW1ibGVyIGhlbHBlciBmdW5jdGlvbnMgKi8KLQotaWJvb2wgICBfQVNNQVBJIF9NVFJSX2lzUmluZzAodm9pZCk7Ci11bG9uZyAgIF9BU01BUEkgX01UUlJfZGlzYWJsZUludCh2b2lkKTsKLXZvaWQgICAgX0FTTUFQSSBfTVRSUl9yZXN0b3JlSW50KHVsb25nIGZsYWdzKTsKLXVsb25nICAgX0FTTUFQSSBfTVRSUl9zYXZlQ1I0KHZvaWQpOwotdm9pZCAgICBfQVNNQVBJIF9NVFJSX3Jlc3RvcmVDUjQodWxvbmcgY3I0VmFsKTsKLXVjaGFyICAgX0FTTUFQSSBfTVRSUl9nZXRDeDg2KHVjaGFyIHJlZyk7Ci12b2lkICAgIF9BU01BUEkgX01UUlJfc2V0Q3g4Nih1Y2hhciByZWcsdWNoYXIgZGF0YSk7Ci0jaWZkZWYgIF9fMTZCSVRfXwotdm9pZCAgICBfQVNNQVBJIF9NVFJSX3JlYWRNU1IodWxvbmcgcmVnLCB1bG9uZyBmYXIgKmVheCwgdWxvbmcgZmFyICplZHgpOwotI2Vsc2UKLXZvaWQgICAgX0FTTUFQSSBfTVRSUl9yZWFkTVNSKHVsb25nIHJlZywgdWxvbmcgKmVheCwgdWxvbmcgKmVkeCk7Ci0jZW5kaWYKLXZvaWQgICAgX0FTTUFQSSBfTVRSUl93cml0ZU1TUih1bG9uZyByZWcsIHVsb25nIGVheCwgdWxvbmcgZWR4KTsKLQotI2lmZGVmICBfX2NwbHVzcGx1cwotfSAgICAgICAgICAgICAgICAgICAgICAgLyogRW5kIG9mICJDIiBsaW5rYWdlIGZvciBDKysgICAqLwotI2VuZGlmCi0KLSNlbmRpZiAgLyogX19NVFJSX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9wY2lsaWIuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9wY2lsaWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM4ZjhlZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvcGNpbGliLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIGludGVyZmFjZSByb3V0aW5lcyB0byB0aGUgUENJIGJ1cy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19QQ0lMSUJfSAotI2RlZmluZSBfX1BDSUxJQl9ICi0KLSNpbmNsdWRlICJzY2l0ZWNoLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIHR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgcGFjaygxKQotCi0vKiBEZWZpbmVzIGZvciBQQ0lEZXZpY2VJbmZvLkhlYWRlclR5cGUgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBQQ0lfZGV2aWNlVHlwZSAgICAgICAgICAgICAgICAgID0gMHgwMCwKLSAgICBQQ0lfYnJpZGdlVHlwZSAgICAgICAgICAgICAgICAgID0gMHgwMSwKLSAgICBQQ0lfY2FyZEJ1c0JyaWRnZVR5cGUgICAgICAgICAgID0gMHgwMiwKLSAgICBQQ0lfbXVsdGlGdW5jdGlvblR5cGUgICAgICAgICAgID0gMHg4MAotICAgIH0gUENJSGVhZGVyVHlwZUZsYWdzOwotCi0vKiBEZWZpbmVzIGZvciBQQ0lEZXZpY2VJbmZvLkNvbW1hbmQgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBQQ0lfZW5hYmxlSU9TcGFjZSAgICAgICAgICAgICAgID0gMHgwMDAxLAotICAgIFBDSV9lbmFibGVNZW1vcnlTcGFjZSAgICAgICAgICAgPSAweDAwMDIsCi0gICAgUENJX2VuYWJsZUJ1c01hc3RlciAgICAgICAgICAgICA9IDB4MDAwNCwKLSAgICBQQ0lfZW5hYmxlU3BlY2lhbEN5bGNlcyAgICAgICAgID0gMHgwMDA4LAotICAgIFBDSV9lbmFibGVXcml0ZUFuZEludmFsaWRhdGUgICAgPSAweDAwMTAsCi0gICAgUENJX2VuYWJsZVZHQUNvbXBhdGlibGVQYWxldHRlICA9IDB4MDAyMCwKLSAgICBQQ0lfZW5hYmxlUGFyaXR5ICAgICAgICAgICAgICAgID0gMHgwMDQwLAotICAgIFBDSV9lbmFibGVXYWl0Q3ljbGUgICAgICAgICAgICAgPSAweDAwODAsCi0gICAgUENJX2VuYWJsZVNlcnIgICAgICAgICAgICAgICAgICA9IDB4MDEwMCwKLSAgICBQQ0lfZW5hYmxlRmFzdEJhY2tUb0JhY2sgICAgICAgID0gMHgwMjAwCi0gICAgfSBQQ0lDb21tYW5kRmxhZ3M7Ci0KLS8qIERlZmluZXMgZm9yIFBDSURldmljZUluZm8uU3RhdHVzICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgUENJX3N0YXR1c0NhcGFiaWxpdGllc0xpc3QgICAgICA9IDB4MDAxMCwKLSAgICBQQ0lfc3RhdHVzNjZNaHpDYXBhYmxlICAgICAgICAgID0gMHgwMDIwLAotICAgIFBDSV9zdGF0dXNVREZTdXBwb3J0ZWQgICAgICAgICAgPSAweDAwNDAsCi0gICAgUENJX3N0YXR1c0Zhc3RCYWNrVG9CYWNrICAgICAgICA9IDB4MDA4MCwKLSAgICBQQ0lfc3RhdHVzRGF0YVBhcml0eURldGVjdGVkICAgID0gMHgwMTAwLAotICAgIFBDSV9zdGF0dXNEZXZTZWwgICAgICAgICAgICAgICAgPSAweDA2MDAsCi0gICAgUENJX3N0YXR1c1NpZ25hbGVkVGFyZ2V0QWJvcnQgICA9IDB4MDgwMCwKLSAgICBQQ0lfc3RhdHVzUmVjaWV2ZWRUYXJnZXRBYm9ydCAgID0gMHgxMDAwLAotICAgIFBDSV9zdGF0dXNSZWNpZXZlZE1hc3RlckFib3J0ICAgPSAweDIwMDAsCi0gICAgUENJX3N0YXR1c1NpZ25hbGVkU3lzdGVtRXJyb3IgICA9IDB4NDAwMCwKLSAgICBQQ0lfc3RhdHVzRGV0ZWN0ZWRQYXJpdHlFcnJvciAgID0gMHg4MDAwCi0gICAgfSBQQ0lTdGF0dXNGbGFnczsKLQotLyogUENJIGNhcGFiaWxpdHkgSURzICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgUENJX2NhcHNQb3dlck1hbmFnZW1lbnQgICAgICAgICA9IDB4MDEsCi0gICAgUENJX2NhcHNBR1AgICAgICAgICAgICAgICAgICAgICA9IDB4MDIsCi0gICAgUENJX2NhcHNNU0kgICAgICAgICAgICAgICAgICAgICA9IDB4MDUKLSAgICB9IFBDSUNhcHNUeXBlOwotCi0vKiBQQ0kgQUdQIHJhdGUgZGVmaW5pdGlvbnMgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBQQ0lfQUdQUmF0ZTFYICAgICAgICAgICAgICAgICAgID0gMHgxLAotICAgIFBDSV9BR1BSYXRlMlggICAgICAgICAgICAgICAgICAgPSAweDIsCi0gICAgUENJX0FHUFJhdGU0WCAgICAgICAgICAgICAgICAgICA9IDB4NAotICAgIH0gUENJQUdQUmF0ZVR5cGU7Ci0KLS8qIE5PVEU6IFdlIGRlZmluZSBhbGwgYml0ZmllbGQncyBhcyB1aW50J3MsIHNwZWNpZmljYWxseSBzbyB0aGF0IHRoZSBJQk0KLSAqICAgICAgIFZpc3VhbCBBZ2UgQysrIGNvbXBpbGVyIGRvZXMgbm90IGNvbXBsYWluLiBXZSBuZWVkIHRoZW0gdG8gYmUKLSAqICAgICAgIDMyLWJpdHMgd2lkZSwgYW5kIHRoaXMgaXMgdGhlIHdpZHRoIG9mIGFuIHVuc2lnbmVkIGludGVnZXIsIGJ1dAotICogICAgICAgd2UgY2FuJ3QgdXNlIGEgdWxvbmcgdG8gbWFrZSB0aGlzIGV4cGxpY2l0IG9yIHdlIGdldCBlcnJvcnMuCi0gKi8KLQotLyogU3RydWN0dXJlIGRlZmluaW5nIGEgUENJIHNsb3QgaWRlbnRpZmllciAqLwotCi10eXBlZGVmIHVuaW9uIHsKLSAgICBzdHJ1Y3QgewotCXVpbnQgICAgWmVybzoyOwotCXVpbnQgICAgUmVnaXN0ZXI6NjsKLQl1aW50ICAgIEZ1bmN0aW9uOjM7Ci0JdWludCAgICBEZXZpY2U6NTsKLQl1aW50ICAgIEJ1czo4OwotCXVpbnQgICAgUmVzZXJ2ZWQ6NzsKLQl1aW50ICAgIEVuYWJsZToxOwotCX0gcDsKLSAgICB1bG9uZyAgIGk7Ci0gICAgfSBQQ0lzbG90OwotCi0vKiBTdHJ1Y3R1cmUgZGVmaW5pbmcgdGhlIHJlZ3VsYXIgKHR5cGUgMCkgUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKLSAqIGxheW91dC4gV2UgdXNlIHRoaXMgaW4gYSB1bmlvbiBiZWxvdyBzbyB3ZSBjYW4gZGVzY3JpYmUgYWxsIHR5cGVzIG9mCi0gKiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZXMgd2l0aCBhIHNpbmdsZSBzdHJ1Y3R1cmUuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVsb25nICAgQmFzZUFkZHJlc3MxMDsKLSAgICB1bG9uZyAgIEJhc2VBZGRyZXNzMTQ7Ci0gICAgdWxvbmcgICBCYXNlQWRkcmVzczE4OwotICAgIHVsb25nICAgQmFzZUFkZHJlc3MxQzsKLSAgICB1bG9uZyAgIEJhc2VBZGRyZXNzMjA7Ci0gICAgdWxvbmcgICBCYXNlQWRkcmVzczI0OwotICAgIHVsb25nICAgQ2FyZGJ1c0NJU1BvaW50ZXI7Ci0gICAgdXNob3J0ICBTdWJTeXN0ZW1WZW5kb3JJRDsKLSAgICB1c2hvcnQgIFN1YlN5c3RlbUlEOwotICAgIHVsb25nICAgUk9NQmFzZUFkZHJlc3M7Ci0gICAgdWNoYXIgICBDYXBhYmlsaXRpZXNQb2ludGVyOwotICAgIHVjaGFyICAgcmVzZXJ2ZWQxOwotICAgIHVjaGFyICAgcmVzZXJ2ZWQyOwotICAgIHVjaGFyICAgcmVzZXJ2ZWQzOwotICAgIHVsb25nICAgcmVzZXJ2ZWQ0OwotICAgIHVjaGFyICAgSW50ZXJydXB0TGluZTsKLSAgICB1Y2hhciAgIEludGVycnVwdFBpbjsKLSAgICB1Y2hhciAgIE1pbmltdW1HcmFudDsKLSAgICB1Y2hhciAgIE1heGltdW1MYXRlbmN5OwotCi0gICAgLyogVGhlc2UgYXJlIG5vdCBpbiB0aGUgYWN0dWFsIGNvbmZpZyBzcGFjZSwgYnV0IHdlIGVudW1lcmF0ZSB0aGVtICovCi0gICAgdWxvbmcgICBCYXNlQWRkcmVzczEwTGVuOwotICAgIHVsb25nICAgQmFzZUFkZHJlc3MxNExlbjsKLSAgICB1bG9uZyAgIEJhc2VBZGRyZXNzMThMZW47Ci0gICAgdWxvbmcgICBCYXNlQWRkcmVzczFDTGVuOwotICAgIHVsb25nICAgQmFzZUFkZHJlc3MyMExlbjsKLSAgICB1bG9uZyAgIEJhc2VBZGRyZXNzMjRMZW47Ci0gICAgdWxvbmcgICBST01CYXNlQWRkcmVzc0xlbjsKLSAgICB9IFBDSVR5cGUwSW5mbzsKLQotLyogU3RydWN0dXJlIGRlZmluaW5nIFBDSSB0byBQQ0kgYnJpZGdlICh0eXBlIDEpIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCi0gKiBsYXlvdXQuIFdlIHVzZSB0aGlzIGluIGEgdW5pb24gYmVsb3cgc28gd2UgY2FuIGRlc2NyaWJlIGFsbCB0eXBlcyBvZgotICogUENJIGNvbmZpZ3VyYXRpb24gc3BhY2VzIHdpdGggYSBzaW5nbGUgc3RydWN0dXJlLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bG9uZyAgIEJhc2VBZGRyZXNzMTA7Ci0gICAgdWxvbmcgICBCYXNlQWRkcmVzczE0OwotICAgIHVjaGFyICAgUHJpbWFyeUJ1c051bWJlcjsKLSAgICB1Y2hhciAgIFNlY29uZGF5QnVzTnVtYmVyOwotICAgIHVjaGFyICAgU3Vib3JkaW5hdGVCdXNOdW1iZXI7Ci0gICAgdWNoYXIgICBTZWNvbmRhcnlMYXRlbmN5VGltZXI7Ci0gICAgdWNoYXIgICBJT0Jhc2U7Ci0gICAgdWNoYXIgICBJT0xpbWl0OwotICAgIHVzaG9ydCAgU2Vjb25kYXJ5U3RhdHVzOwotICAgIHVzaG9ydCAgTWVtb3J5QmFzZTsKLSAgICB1c2hvcnQgIE1lbW9yeUxpbWl0OwotICAgIHVzaG9ydCAgUHJlZmV0Y2hhYmxlTWVtb3J5QmFzZTsKLSAgICB1c2hvcnQgIFByZWZldGNoYWJsZU1lbW9yeUxpbWl0OwotICAgIHVsb25nICAgUHJlZmV0Y2hhYmxlQmFzZUhpOwotICAgIHVsb25nICAgUHJlZmV0Y2hhYmxlTGltaXRIaTsKLSAgICB1c2hvcnQgIElPQmFzZUhpOwotICAgIHVzaG9ydCAgSU9MaW1pdEhpOwotICAgIHVjaGFyICAgQ2FwYWJpbGl0aWVzUG9pbnRlcjsKLSAgICB1Y2hhciAgIHJlc2VydmVkMTsKLSAgICB1Y2hhciAgIHJlc2VydmVkMjsKLSAgICB1Y2hhciAgIHJlc2VydmVkMzsKLSAgICB1bG9uZyAgIFJPTUJhc2VBZGRyZXNzOwotICAgIHVjaGFyICAgSW50ZXJydXB0TGluZTsKLSAgICB1Y2hhciAgIEludGVycnVwdFBpbjsKLSAgICB1c2hvcnQgIEJyaWRnZUNvbnRyb2w7Ci0gICAgfSBQQ0lUeXBlMUluZm87Ci0KLS8qIFBDSSB0byBDYXJkQnVzIGJyaWRnZSAodHlwZSAyKSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWxvbmcgICBTb2NrZXRSZWdpc3RlcnNCYXNlQWRkcmVzczsKLSAgICB1Y2hhciAgIENhcGFiaWxpdGllc1BvaW50ZXI7Ci0gICAgdWNoYXIgICByZXNlcnZlZDE7Ci0gICAgdXNob3J0ICBTZWNvbmRhcnlTdGF0dXM7Ci0gICAgdWNoYXIgICBQcmltYXJ5QnVzOwotICAgIHVjaGFyICAgU2Vjb25kYXJ5QnVzOwotICAgIHVjaGFyICAgU3Vib3JkaW5hdGVCdXM7Ci0gICAgdWNoYXIgICBTZWNvbmRhcnlMYXRlbmN5OwotICAgIHN0cnVjdCAgewotCXVsb25nICAgQmFzZTsKLQl1bG9uZyAgIExpbWl0OwotCX0gUmFuZ2VbNF07Ci0gICAgdWNoYXIgICBJbnRlcnJ1cHRMaW5lOwotICAgIHVjaGFyICAgSW50ZXJydXB0UGluOwotICAgIHVzaG9ydCAgQnJpZGdlQ29udHJvbDsKLSAgICB9IFBDSVR5cGUySW5mbzsKLQotLyogU3RydWN0dXJlIGRlZmluaW5nIHRoZSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSBpbmZvcm1hdGlvbiBmb3IgYQotICogc2luZ2xlIFBDSSBkZXZpY2Ugb24gdGhlIFBDSSBidXMuIFdlIGVudW1lcmF0ZSBhbGwgdGhpcyBpbmZvcm1hdGlvbgotICogZm9yIGFsbCBQQ0kgZGV2aWNlcyBvbiB0aGUgYnVzLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bG9uZyAgICAgICAgICAgICAgIGR3U2l6ZTsKLSAgICBQQ0lzbG90ICAgICAgICAgICAgIHNsb3Q7Ci0gICAgdWxvbmcgICAgICAgICAgICAgICBtZWNoMTsKLSAgICB1c2hvcnQgICAgICAgICAgICAgIFZlbmRvcklEOwotICAgIHVzaG9ydCAgICAgICAgICAgICAgRGV2aWNlSUQ7Ci0gICAgdXNob3J0ICAgICAgICAgICAgICBDb21tYW5kOwotICAgIHVzaG9ydCAgICAgICAgICAgICAgU3RhdHVzOwotICAgIHVjaGFyICAgICAgICAgICAgICAgUmV2SUQ7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBJbnRlcmZhY2U7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBTdWJDbGFzczsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIEJhc2VDbGFzczsKLSAgICB1Y2hhciAgICAgICAgICAgICAgIENhY2hlTGluZVNpemU7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBMYXRlbmN5VGltZXI7Ci0gICAgdWNoYXIgICAgICAgICAgICAgICBIZWFkZXJUeXBlOwotICAgIHVjaGFyICAgICAgICAgICAgICAgQklTVDsKLSAgICB1bmlvbiB7Ci0JUENJVHlwZTBJbmZvICAgIHR5cGUwOwotCVBDSVR5cGUxSW5mbyAgICB0eXBlMTsKLQlQQ0lUeXBlMkluZm8gICAgdHlwZTI7Ci0JfSB1OwotICAgIH0gUENJRGV2aWNlSW5mbzsKLQotLyogUENJIENhcGFiaWxpdHkgaGVhZGVyIHN0cnVjdHVyZS4gQWxsIFBDSSBjYXBhYmlsaXRpZXMgaGF2ZSB0aGUKLSAqIGZvbGxvd2luZyBoZWFkZXIuCi0gKgotICogY2Fwc0lEIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHR5cGUgb2YgdGhlIHN0cnVjdHVyZSBhcyBkZWZpbmUgYWJvdmUuCi0gKgotICogbmV4dCBpcyB0aGUgb2Zmc2V0IGluIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlICgweDQwLTB4RkMpIG9mIHRoZQotICogbmV4dCBjYXBhYmlsaXR5IHN0cnVjdHVyZSBpbiB0aGUgbGlzdCwgb3IgMHgwMCBpZiB0aGVyZSBhcmUgbm8gbW9yZQotICogZW50cmllcy4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWNoYXIgICBjYXBzSUQ7Ci0gICAgdWNoYXIgICBuZXh0OwotICAgIH0gUENJQ2Fwc0hlYWRlcjsKLQotLyogU3RydWN0dXJlIGRlZmluaW5nIHRoZSBQQ0kgQUdQIHN0YXR1cyByZWdpc3RlciBjb250ZW50cyAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWludCAgICByYXRlOjM7Ci0gICAgdWludCAgICByc3ZkMToxOwotICAgIHVpbnQgICAgZmFzdFdyaXRlOjE7Ci0gICAgdWludCAgICBmb3VyR0I6MTsKLSAgICB1aW50ICAgIHJzdmQyOjM7Ci0gICAgdWludCAgICBzaWRlQmFuZEFkZHJlc3Npbmc6MTsKLSAgICB1aW50ICAgIHJzdmQzOjE0OwotICAgIHVpbnQgICAgcmVxdWVzdFF1ZXVlRGVwdGhNYXhpbXVtOjg7Ci0gICAgfSBQQ0lBR1BTdGF0dXM7Ci0KLS8qIFN0cnVjdHVyZSBkZWZpbmluZyB0aGUgUENJIEFHUCBjb21tYW5kIHJlZ2lzdGVyIGNvbnRlbnRzICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1aW50ICAgIHJhdGU6MzsKLSAgICB1aW50ICAgIHJzdmQxOjE7Ci0gICAgdWludCAgICBmYXN0V3JpdGVFbmFibGU6MTsKLSAgICB1aW50ICAgIGZvdXJHQkVuYWJsZToxOwotICAgIHVpbnQgICAgcnN2ZDI6MjsKLSAgICB1aW50ICAgIEFHUEVuYWJsZToxOwotICAgIHVpbnQgICAgU0JBRW5hYmxlOjE7Ci0gICAgdWludCAgICByc3ZkMzoxNDsKLSAgICB1aW50ICAgIHJlcXVlc3RRdWV1ZURlcHRoOjg7Ci0gICAgfSBQQ0lBR1BDb21tYW5kOwotCi0vKiBBR1AgQ2FwYWJpbGl0eSBzdHJ1Y3R1cmUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFBDSUNhcHNIZWFkZXIgICBoOwotICAgIHVzaG9ydCAgICAgICAgICBtYWpNaW47Ci0gICAgUENJQUdQU3RhdHVzICAgIEFHUFN0YXR1czsKLSAgICBQQ0lBR1BDb21tYW5kICAgQUdQQ29tbWFuZDsKLSAgICB9IFBDSUFHUENhcGFiaWxpdHk7Ci0KLS8qIFN0cnVjdHVyZSBmb3Igb2J0YWluaW5nIHRoZSBQQ0kgSVJRIHJvdXRpbmcgaW5mb3JtYXRpb24gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVjaGFyICAgYnVzOwotICAgIHVjaGFyICAgZGV2aWNlOwotICAgIHVjaGFyICAgbGlua0E7Ci0gICAgdXNob3J0ICBtYXBBOwotICAgIHVjaGFyICAgbGlua0I7Ci0gICAgdXNob3J0ICBtYXBCOwotICAgIHVjaGFyICAgbGlua0M7Ci0gICAgdXNob3J0ICBtYXBDOwotICAgIHVjaGFyICAgbGlua0Q7Ci0gICAgdXNob3J0ICBtYXBEOwotICAgIHVjaGFyICAgc2xvdDsKLSAgICB1Y2hhciAgIHJlc2VydmVkOwotICAgIH0gUENJUm91dGVJbmZvOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdXNob3J0ICAgICAgICAgIEJ1ZmZlclNpemU7Ci0gICAgUENJUm91dGVJbmZvICAgICpEYXRhQnVmZmVyOwotICAgIH0gUENJUm91dGluZ09wdGlvbnNCdWZmZXI7Ci0KLSNkZWZpbmUgTlVNX1BDSV9SRUcgICAgICAgICAgICAgICAgIChzaXplb2YoUENJRGV2aWNlSW5mbykgLyA0KSAtIDEwCi0jZGVmaW5lIFBDSV9CUklER0VfQ0xBU1MgICAgICAgICAgICAweDA2Ci0jZGVmaW5lIFBDSV9IT1NUX0JSSURHRV9TVUJDTEFTUyAgICAweDAwCi0jZGVmaW5lIFBDSV9FQVJMWV9WR0FfQ0xBU1MgICAgICAgICAweDAwCi0jZGVmaW5lIFBDSV9FQVJMWV9WR0FfU1VCQ0xBU1MgICAgICAweDAxCi0jZGVmaW5lIFBDSV9ESVNQTEFZX0NMQVNTICAgICAgICAgICAweDAzCi0jZGVmaW5lIFBDSV9ESVNQTEFZX1ZHQV9TVUJDTEFTUyAgICAweDAwCi0jZGVmaW5lIFBDSV9ESVNQTEFZX1hHQV9TVUJDTEFTUyAgICAweDAxCi0jZGVmaW5lIFBDSV9ESVNQTEFZX09USEVSX1NVQkNMQVNTICAweDgwCi0jZGVmaW5lIFBDSV9NTV9DTEFTUyAgICAgICAgICAgICAgICAweDA0Ci0jZGVmaW5lIFBDSV9BVURJT19TVUJDTEFTUyAgICAgICAgICAweDAxCi0KLS8qIE1hY3JvcyB0byBkZXRlY3Qgc3BlY2lmaWMgY2xhc3NlcyBvZiBkZXZpY2VzICovCi0KLSNkZWZpbmUgUENJX0lTXzNETEFCU19OT05WR0FfQ0xBU1MocGNpKSBcCi0gICAoKChwY2kpLT5CYXNlQ2xhc3MgPT0gUENJX0RJU1BMQVlfQ0xBU1MgJiYgKHBjaSktPlN1YkNsYXNzID09IFBDSV9ESVNQTEFZX09USEVSX1NVQkNMQVNTKSBcCi0gJiYgKChwY2kpLT5WZW5kb3JJRCA9PSAweDNEM0QgfHwgKHBjaSktPlZlbmRvcklEID09IDB4MTA0QykpCi0KLSNkZWZpbmUgUENJX0lTX0RJU1BMQVlfQ0xBU1MocGNpKSBcCi0gICAoKChwY2kpLT5CYXNlQ2xhc3MgPT0gUENJX0RJU1BMQVlfQ0xBU1MgJiYgKHBjaSktPlN1YkNsYXNzID09IFBDSV9ESVNQTEFZX1ZHQV9TVUJDTEFTUykgXAotIHx8ICgocGNpKS0+QmFzZUNsYXNzID09IFBDSV9ESVNQTEFZX0NMQVNTICYmIChwY2kpLT5TdWJDbGFzcyA9PSBQQ0lfRElTUExBWV9YR0FfU1VCQ0xBU1MpIFwKLSB8fCAoKHBjaSktPkJhc2VDbGFzcyA9PSBQQ0lfRUFSTFlfVkdBX0NMQVNTICYmIChwY2kpLT5TdWJDbGFzcyA9PSBQQ0lfRUFSTFlfVkdBX1NVQkNMQVNTKSBcCi0gfHwgUENJX0lTXzNETEFCU19OT05WR0FfQ0xBU1MocGNpKSkKLQotLyogRnVuY3Rpb24gY29kZXMgdG8gcGFzcyB0byBQQ0lfYWNjZXNzUmVnICovCi0KLSNkZWZpbmUgUENJX1JFQURfQllURSAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgUENJX1JFQURfV09SRCAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgUENJX1JFQURfRFdPUkQgICAgICAgICAgICAgIDIKLSNkZWZpbmUgUENJX1dSSVRFX0JZVEUgICAgICAgICAgICAgIDMKLSNkZWZpbmUgUENJX1dSSVRFX1dPUkQgICAgICAgICAgICAgIDQKLSNkZWZpbmUgUENJX1dSSVRFX0RXT1JEICAgICAgICAgICAgIDUKLQotLyogTWFjcm9zIHRvIHJlYWQvd3JpdGUgUENJIHJlZ2lzdGVycy4gVGhlc2UgYXNzdW1lIGEgZ2xvYmFsIFBDSSBhcnJheQotICogb2YgZGV2aWNlIGluZm9ybWF0aW9uLgotICovCi0KLSNkZWZpbmUgUENJX3JlYWRQQ0lSZWdCKGluZGV4LGRldmljZSkgICBcCi0gICAgUENJX2FjY2Vzc1JlZyhpbmRleCwwLDAsJlBDSVtEZXZpY2VJbmRleFtkZXZpY2VdXSkKLQotI2RlZmluZSBQQ0lfcmVhZFBDSVJlZ1coaW5kZXgsZGV2aWNlKSAgIFwKLSAgICBQQ0lfYWNjZXNzUmVnKGluZGV4LDAsMSwmUENJW0RldmljZUluZGV4W2RldmljZV1dKQotCi0jZGVmaW5lIFBDSV9yZWFkUENJUmVnTChpbmRleCxkZXZpY2UpICAgXAotICAgIFBDSV9hY2Nlc3NSZWcoaW5kZXgsMCwyLCZQQ0lbRGV2aWNlSW5kZXhbZGV2aWNlXV0pCi0KLSNkZWZpbmUgUENJX3dyaXRlUENJUmVnQihpbmRleCx2YWx1ZSxkZXZpY2UpICAgIFwKLSAgICBQQ0lfYWNjZXNzUmVnKGluZGV4LHZhbHVlLDMsJlBDSVtEZXZpY2VJbmRleFtkZXZpY2VdXSkKLQotI2RlZmluZSBQQ0lfd3JpdGVQQ0lSZWdXKGluZGV4LHZhbHVlLGRldmljZSkgICAgXAotICAgIFBDSV9hY2Nlc3NSZWcoaW5kZXgsdmFsdWUsNCwmUENJW0RldmljZUluZGV4W2RldmljZV1dKQotCi0jZGVmaW5lIFBDSV93cml0ZVBDSVJlZ0woaW5kZXgsdmFsdWUsZGV2aWNlKSAgICBcCi0gICAgUENJX2FjY2Vzc1JlZyhpbmRleCx2YWx1ZSw1LCZQQ0lbRGV2aWNlSW5kZXhbZGV2aWNlXV0pCi0KLSNwcmFnbWEgcGFjaygpCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnVuY3Rpb24gUHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiAgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVzZSAiQyIgbGlua2FnZSB3aGVuIGluIEMrKyBtb2RlICovCi0jZW5kaWYKLQotLyogRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgUENJIGRldmljZXMgaW4gdGhlIHN5c3RlbSAqLwotCi1pbnQgICAgIF9BU01BUEkgUENJX2dldE51bURldmljZXModm9pZCk7Ci0KLS8qIEZ1bmN0aW9uIHRvIGVudW1lcmF0ZSBhbGwgZGV2aWNlIG9uIHRoZSBQQ0kgYnVzICovCi0KLWludCAgICAgX0FTTUFQSSBQQ0lfZW51bWVyYXRlKFBDSURldmljZUluZm8gaW5mb1tdKTsKLQotLyogRnVuY3Rpb24gdG8gYWNjZXNzIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLwotCi11bG9uZyAgIF9BU01BUEkgUENJX2FjY2Vzc1JlZyhpbnQgaW5kZXgsdWxvbmcgdmFsdWUsaW50IGZ1bmMsUENJRGV2aWNlSW5mbyAqaW5mbyk7Ci0KLS8qIEZ1bmN0aW9uIHRvIGdldCBQQ0kgSVJRIHJvdXRpbmcgb3B0aW9ucyBmb3IgYSBjYXJkICovCi0KLWludCAgICAgX0FTTUFQSSBQQ0lfZ2V0SVJRUm91dGluZ09wdGlvbnMoaW50IG51bURldmljZXMsUENJUm91dGVJbmZvICpidWZmZXIpOwotCi0vKiBGdW5jdGlvbiB0byByZS1yb3V0ZSB0aGUgUENJIElSUSBzZXR0aW5nIGZvciBhIGRldmljZSAqLwotCi1pYm9vbCAgIF9BU01BUEkgUENJX3NldEhhcmR3YXJlSVJRKFBDSURldmljZUluZm8gKmluZm8sdWludCBpbnRQaW4sdWludCBJUlEpOwotCi0vKiBGdW5jdGlvbiB0byBnZW5lcmF0ZSBhIHNwZWNpYWwgY3lsZSBvbiB0aGUgc3BlY2lmaWVkIFBDSSBidXMgKi8KLQotdm9pZCAgICBfQVNNQVBJIFBDSV9nZW5lcmF0ZVNwZWNpYWxDeWxlKHVpbnQgYnVzLHVsb25nIHNwZWNpYWxDeWNsZURhdGEpOwotCi0vKiBGdW5jdGlvbiB0byBkZXRlcm1pbmUgdGhlIHNpemUgb2YgYSBQQ0kgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyICovCi0KLXVsb25nICAgX0FTTUFQSSBQQ0lfZmluZEJBUlNpemUoaW50IGJhcixQQ0lEZXZpY2VJbmZvICpwY2kpOwotCi0vKiBGdW5jdGlvbiB0byByZWFkIGEgYmxvY2sgb2YgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgcmVnaXN0ZXJzICovCi0KLXZvaWQgICAgX0FTTUFQSSBQQ0lfcmVhZFJlZ0Jsb2NrKFBDSURldmljZUluZm8gKmluZm8saW50IGluZGV4LHZvaWQgKmRzdCxpbnQgY291bnQpOwotCi0vKiBGdW5jdGlvbiB0byB3cml0ZSBhIGJsb2NrIG9mIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIHJlZ2lzdGVycyAqLwotCi12b2lkICAgIF9BU01BUEkgUENJX3dyaXRlUmVnQmxvY2soUENJRGV2aWNlSW5mbyAqaW5mbyxpbnQgaW5kZXgsdm9pZCAqc3JjLGludCBjb3VudCk7Ci0KLS8qIEZ1bmN0aW9uIHRvIHJldHVybiB0aGUgMzItYml0IFBDSSBCSU9TIGVudHJ5IHBvaW50ICovCi0KLXVsb25nICAgX0FTTUFQSSBQQ0lCSU9TX2dldEVudHJ5KHZvaWQpOwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKyAgICAgICAqLwotI2VuZGlmCi0KLSNlbmRpZiAgLyogX19QQ0lMSUJfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3BtX2hlbHAuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9wbV9oZWxwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNmEyYmEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3BtX2hlbHAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBXaW4zMiwgT1MvMgotKgotKiBEZXNjcmlwdGlvbjogIEluY2x1ZGUgZmlsZSBmb3IgdGhlIFNjaVRlY2ggUG9ydGFiaWxpdHkgTWFuYWdlciAzMi1iaXQKLSogICAgICAgICAgICAgICBoZWxwZXIgVnhEIGZvciBXaW5kb3dzIDl4IGZvciBhbmQgdGhlIDE2LWJpdCByaW5nIDAKLSogICAgICAgICAgICAgICBoZWxwZXIgZGV2aWNlIGRyaXZlciBmb3IgT1MvMi4KLSoKLSogICAgICAgICAgICAgICBUaGlzIGZpbGUgZG9jdW1lbnRzIGFsbCB0aGUgcHVibGljIHNlcnZpY2VzIHVzZWQgYnkgdGhlCi0qICAgICAgICAgICAgICAgU2NpVGVjaCBQb3J0YWJpbGl0eSBNYW5hZ2VyIGxpYnJhcnkgYW5kIFNjaVRlY2ggTnVjbGV1cwotKiAgICAgICAgICAgICAgIGxvYWRlciBsaWJyYXJ5LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX1BNSEVMUF9ICi0jZGVmaW5lIF9fUE1IRUxQX0gKLQotLyogSW5jbHVkZSB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0KLSNpbmNsdWRlICJzZGQvc2RkdmVyLmgiCi0jZGVmaW5lIFBNSEVMUF9NYWpvciAgICAgICAgICAgIFNERF9SRUxFQVNFX01BSk9SCi0jZGVmaW5lIFBNSEVMUF9NaW5vciAgICAgICAgICAgIFNERF9SRUxFQVNFX01JTk9SCi0jZGVmaW5lIFBNSEVMUF9WRVJTSU9OICAgICAgICAgICgoUE1IRUxQX01ham9yIDw8IDgpIHwgUE1IRUxQX01pbm9yKQotCi0jaWZkZWYgIF9fT1MyX18KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogUHVibGljIE9TLzIgU3VwcG9ydCBmdW5jdGlvbnMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJzY2l0ZWNoLmgiCi0jaW5jbHVkZSAibnVjbGV1cy9ncmFwaGljcy5oIgotCi0vKiBOYW1lIG9mIGRldmljZSBkcml2ZXIgKi8KLQotI2RlZmluZSBQTUhFTFBfTkFNRSAgICAgICAgICAgICAgICAgKFBTWikic2RkaGVscCQiCi0KLS8qIE1haW4gSU9DVEwgZnVuY3Rpb24gdG8gdGFsayB0byBkZXZpY2UgZHJpdmVyICovCi0KLSNkZWZpbmUgUE1IRUxQX0lPQ1RMICAgICAgICAgICAgICAgIDB4MDA4MAotCi0vKiBNYWNybyBkZWZpbml0aW9uIGZvciBkZWZpbmluZyBJT0NUTCBmdW5jdGlvbiBjb250cm9sIGNvZGVzIGZvciB0aGUgU0RESEVMUAotICogZGV2aWNlIGRyaXZlciBmb3IgT1MvMi4gU2ltaWxhciB0byB0aGF0IHVzZWQgZm9yIHRoZSBET1MvV2luMzIgdmVyc2lvbi4KLSAqLwotCi0jZGVmaW5lIFBNSEVMUF9DVExfQ09ERShuYW1lLHZhbHVlKSBcCi0gICAgUE1IRUxQXyMjbmFtZSA9IHZhbHVlCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgLyogVmVyc2lvbiBmdW5jdGlvbiB1c2VkIGJ5IGFsbCBkcml2ZXJzICovCi0gICAgUE1IRUxQX0NUTF9DT0RFKEdFVFZFUiAgICAgICAgICAgICAgICAgICAgICAsMHgwMDAxKSwKLSAgICBQTUhFTFBfQ1RMX0NPREUoTUFQUEhZUyAgICAgICAgICAgICAgICAgICAgICwweDAwMDIpLAotICAgIFBNSEVMUF9DVExfQ09ERShBTExPQ0xPQ0tFRCAgICAgICAgICAgICAgICAgLDB4MDAwMyksCi0gICAgUE1IRUxQX0NUTF9DT0RFKEZSRUVMT0NLRUQgICAgICAgICAgICAgICAgICAsMHgwMDA0KSwKLSAgICBQTUhFTFBfQ1RMX0NPREUoR0VUR0RUMzIgICAgICAgICAgICAgICAgICAgICwweDAwMDUpLAotICAgIFBNSEVMUF9DVExfQ09ERShNQUxMT0NTSEFSRUQgICAgICAgICAgICAgICAgLDB4MDAwNyksCi0gICAgUE1IRUxQX0NUTF9DT0RFKEZSRUVTSEFSRUQgICAgICAgICAgICAgICAgICAsMHgwMDA4KSwKLSAgICBQTUhFTFBfQ1RMX0NPREUoTUFQVE9QUk9DRVNTICAgICAgICAgICAgICAgICwweDAwMDkpLAotICAgIFBNSEVMUF9DVExfQ09ERShGUkVFUEhZUyAgICAgICAgICAgICAgICAgICAgLDB4MDAwQSksCi0gICAgUE1IRUxQX0NUTF9DT0RFKEZMVVNIVExCICAgICAgICAgICAgICAgICAgICAsMHgwMDBCKSwKLSAgICBQTUhFTFBfQ1RMX0NPREUoU0FWRUNSNCAgICAgICAgICAgICAgICAgICAgICwweDAwMEMpLAotICAgIFBNSEVMUF9DVExfQ09ERShSRVNUT1JFQ1I0ICAgICAgICAgICAgICAgICAgLDB4MDAwRCksCi0gICAgUE1IRUxQX0NUTF9DT0RFKFJFQURNU1IgICAgICAgICAgICAgICAgICAgICAsMHgwMDBFKSwKLSAgICBQTUhFTFBfQ1RMX0NPREUoV1JJVEVNU1IgICAgICAgICAgICAgICAgICAgICwweDAwMEYpLAotICAgIFBNSEVMUF9DVExfQ09ERShHRVRQSFlTSUNBTEFERFIgICAgICAgICAgICAgLDB4MDAxMCksCi0gICAgUE1IRUxQX0NUTF9DT0RFKEdFVFBIWVNJQ0FMQUREUlJBTkdFICAgICAgICAsMHgwMDExKSwKLSAgICBQTUhFTFBfQ1RMX0NPREUoTE9DS1BBR0VTICAgICAgICAgICAgICAgICAgICwweDAwMTIpLAotICAgIFBNSEVMUF9DVExfQ09ERShVTkxPQ0tQQUdFUyAgICAgICAgICAgICAgICAgLDB4MDAxMyksCi0gICAgUE1IRUxQX0NUTF9DT0RFKEdFVFNIQVJFREVYUCAgICAgICAgICAgICAgICAsMHgwMDQyKSwKLSAgICBQTUhFTFBfQ1RMX0NPREUoU0VUU0hBUkVERVhQICAgICAgICAgICAgICAgICwweDAwNDMpLAotICAgIFBNSEVMUF9DVExfQ09ERShHRVRTVEFDS1NXSVRDSFJUTiAgICAgICAgICAgLDB4MDA0NCksCi0gICAgUE1IRUxQX0NUTF9DT0RFKEdFVEJVSUxETk8gICAgICAgICAgICAgICAgICAsMHgwMDUwKSwKLSAgICB9IFBNSEVMUF9jdGxDb2RlczsKLQotI2Vsc2UKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogUHVibGljIERPUy9XaW5kb3dzIFN1cHBvcnQgZnVuY3Rpb25zCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgIERFVklDRV9NQUlOCi0jaW5jbHVkZSA8dnRvb2xzYy5oPgotI2RlZmluZSBQTUhFTFBfSW5pdF9PcmRlciAgIChWRERfSU5JVF9PUkRFUi0xKQotI2RlZmluZSBSRVRVUk5fTE9OR1MobikgICAgICpwLT5kaW9jX2J5dGVzcmV0ID0gKG4pICogc2l6ZW9mKHVsb25nKQotI2VuZGlmICAvKiBERVZJQ0VfTUFJTiAqLwotI2luY2x1ZGUgInNjaXRlY2guaCIKLSNpbmNsdWRlICJudWNsZXVzL2dyYXBoaWNzLmgiCi0KLS8qIFdlIGNvbm5lY3QgdG8gdGhlIFNEREhFTFAuVlhEIG1vZHVsZSBpZiBpdCBpcyBzdGF0aWNseSBsb2FkZWQgKGFzIHBhcnQKLSAqIG9mIFNjaVRlY2ggRGlzcGxheSBEb2N0b3IpLCBvdGhlcndpc2Ugd2UgZHluYW1pY2FsbHkgbG9hZCB0aGUgUE1IRUxQLlZYRAotICogcHVibGljIGhlbHBlciBWeEQuCi0gKi8KLQotI2RlZmluZSBQTUhFTFBfRGV2aWNlSUQgICAgICAgICAweDAwMDAKLSNkZWZpbmUgU0RESEVMUF9EZXZpY2VJRCAgICAgICAgMHgzREY4Ci0jZGVmaW5lIFZYRExEUl9EZXZpY2VJRCAgICAgICAgIDB4MDAyNwotI2RlZmluZSBTRERIRUxQX01PRFVMRSAgICAgICAgICAiU0RESEVMUCIKLSNkZWZpbmUgU0RESEVMUF9OQU1FICAgICAgICAgICAgIlNEREhFTFAuVlhEIgotI2RlZmluZSBQTUhFTFBfTU9EVUxFICAgICAgICAgICAiUE1IRUxQIgotI2RlZmluZSBQTUhFTFBfTkFNRSAgICAgICAgICAgICAiUE1IRUxQLlZYRCIKLSNkZWZpbmUgUE1IRUxQX0REQk5BTUUgICAgICAgICAgInBtaGVscCAgIgotI2RlZmluZSBTRERIRUxQX01PRFVMRV9QQVRIICAgICAiXFxcXC5cXCIgU0RESEVMUF9NT0RVTEUKLSNkZWZpbmUgUE1IRUxQX01PRFVMRV9QQVRIICAgICAgIlxcXFwuXFwiIFBNSEVMUF9NT0RVTEUKLSNkZWZpbmUgUE1IRUxQX1ZYRF9QQVRIICAgICAgICAgIlxcXFwuXFwiIFBNSEVMUF9OQU1FCi0KLS8qIE1hY3JvIGRlZmluaXRpb24gZm9yIGRlZmluaW5nIElPQ1RMIGZ1bmN0aW9uIGNvbnRyb2wgY29kZXMgZm9yIHRoZSBQTUhFTFAKLSAqIGRldmljZSBkcml2ZXJzIGZvciBXaW5kb3dzIDl4IGFuZCBOVC4gVGhpcyBtYWNybyBpcyBiYXNpY2FsbHkgZGVyaXZlZCBmcm9tCi0gKiB0aGUgQ1RMX0NPREUgbWFjcm8gaW4gdGhlIFdpbmRvd3MgMjAwMCBEREssIGJ1dCB3ZSBoYXJkIGNvZGUgaXQgaGVyZSB0bwotICogYXZvaWQgaGF2aW5nIHRvICNpbmNsdWRlIGFueSBvZiB0aGUgV2luZG93cyAyMDAwIERESyBoZWFkZXIgZmlsZXMuIFdlIGFsc28KLSAqIGRlZmluZSBib3RoIGEgMTYtYml0IGFuZCAzMi1iaXQgdmVyc2lvbiBvZiB0aGUgY29udHJvbCBjb2RlIHdpdGhpbiB0aGUgc2FtZQotICogbWFjcm8gdG8gc2ltcGxpZnkgZnV0dXJlIGFkZGl0aW9ucy4KLSAqCi0gKiBFc3NlbnRpYWxseSB0aGUgV2luMzIgbWFjcm8gd291bGQgbm9ybWFsbHkgZXhwYW5kIHRvIHRoZSBmb2xsb3dpbmc6Ci0gKgotICogIENUTF9DT0RFKEZJTEVfREVWSUNFX1ZJREVPLDB4ODAwK3ZhbHVlLE1FVEhPRF9CVUZGRVJFRCxGSUxFX0FOWV9BQ0NFU1MpCi0gKi8KLQotI2RlZmluZSBQTUhFTFBfQ1RMX0NPREUobmFtZSx2YWx1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgUE1IRUxQXyMjbmFtZSA9IHZhbHVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBQTUhFTFBfIyNuYW1lIyMzMiA9ICgoMHgyMyA8PCAxNikgfCAoMCA8PCAxNCkgfCAoKDB4ODAwK3ZhbHVlKSA8PCAyKSB8ICgwKSkKLQotdHlwZWRlZiBlbnVtIHsKLSAgICAvKiBJbmNsdWRlIGFsbCB0aGUgY29udHJvbCBjb2Rlcy4gV2Uga2VlcCB0aGVtIGluIGEgc2VwYXJhdGUgaGVhZGVyCi0gICAgICogZmlsZSBzbyB3ZSBjYW4gaW5jbHVkZSB0aGVtIGluIG11bHRpcGxlIHBsYWNlcyB0byBtYWtlIHRoaXMKLSAgICAgKiBtb3JlIHZlcnNhdGlsZS4KLSAgICAgKi8KLSAgICAjaW5jbHVkZSAicG1fd2N0bC5oIgotICAgIH0gUE1IRUxQX2N0bENvZGVzOwotCi0vKiBGb3IgcmVhbCBtb2RlIFZ4RCBjYWxscywgd2UgcHV0IHRoZSBmdW5jdGlvbiBudW1iZXIgaW50byB0aGUgaGlnaAotICogb3JkZXIgd29yZCBvZiBFQVgsIGFuZCBhIHZhbHVlIG9mIDB4NEZGRiBpbiBBWC4gVGhpcyBhbGxvd3Mgb3VyCi0gKiBWeEQgaGFuZGxlciB3aGljaCBpcyBzZXQgdXAgdG8gaGFuZGxlIEludCAxMCdzIHRvIHJlY29nbmlzZSBhIG5hdGl2ZQotICogUE1IRUxQIEFQSSBjYWxsIGZyb20gYSByZWFsIG1vZGUgRE9TIHByb2dyYW0uCi0gKi8KLQotI2lmZGVmICBSRUFMTU9ERQotI2RlZmluZSBBUElfTlVNKG51bSkgICAgKCgodWxvbmcpKG51bSkgPDwgMTYpIHwgMHg0RkZGKQotI2Vsc2UKLSNkZWZpbmUgQVBJX05VTShudW0pICAgIChudW0pCi0jZW5kaWYKLQotI2VuZGlmICAvKiAhX19PUzJfXyAqLwotCi0jZW5kaWYgIC8qIF9fUE1IRUxQX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9wbV93Y3RsLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvcG1fd2N0bC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGFhMTVlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9wbV93Y3RsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBXaW4zMiwgT1MvMgotKgotKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIHRvIGRlZmluZSBhbGwgdGhlIGNvbnRyb2wgY29kZXMgZm9yIHRoZSBET1MKLSogICAgICAgICAgICAgICBhbmQgV2luMzIgZGV2aWNlIGRyaXZlciBBUEkncyBmb3IgY2FsbGluZyBmcm9tIHJpbmcgMwotKiAgICAgICAgICAgICAgIGludG8gdGhlIHJpbmcgMCBkZXZpY2UgZHJpdmVycy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFZlcnNpb24gZnVuY3Rpb24gdXNlZCBieSBhbGwgZHJpdmVycyAqLwotUE1IRUxQX0NUTF9DT0RFKEdFVFZFUiAgICAgICAgICAgICAgICAgICAgICAsMHgwMDAwKSwKLQotLyogRnVuY3Rpb25zIHVzZWQgYnkgb2Jzb2xldGUgMTYtYml0IERPUyBUU1IgKi8KLVBNSEVMUF9DVExfQ09ERShSRFJFR0IgICAgICAgICAgICAgICAgICAgICAgLDB4MDAwMyksCi1QTUhFTFBfQ1RMX0NPREUoV1JSRUdCICAgICAgICAgICAgICAgICAgICAgICwweDAwMDQpLAotUE1IRUxQX0NUTF9DT0RFKFJEUkVHVyAgICAgICAgICAgICAgICAgICAgICAsMHgwMDA1KSwKLVBNSEVMUF9DVExfQ09ERShXUlJFR1cgICAgICAgICAgICAgICAgICAgICAgLDB4MDAwNiksCi1QTUhFTFBfQ1RMX0NPREUoUkRSRUdMICAgICAgICAgICAgICAgICAgICAgICwweDAwMDgpLAotUE1IRUxQX0NUTF9DT0RFKFdSUkVHTCAgICAgICAgICAgICAgICAgICAgICAsMHgwMDA5KSwKLQotLyogRnVuY3Rpb25zIHVzZWQgYnkgb2Jzb2xldGUgV2luRGlyZWN0ICovCi1QTUhFTFBfQ1RMX0NPREUoTUFQUEhZUyAgICAgICAgICAgICAgICAgICAgICwweDAwMEYpLAotUE1IRUxQX0NUTF9DT0RFKEdFVFZFU0FCVUYgICAgICAgICAgICAgICAgICAsMHgwMDEzKSwKLQotLyogRnVuY3Rpb25zIHVzZWQgYnkgUE0gbGlicmFyeSAqLwotUE1IRUxQX0NUTF9DT0RFKERQTUlJTlQ4NiAgICAgICAgICAgICAgICAgICAsMHgwMDE0KSwKLVBNSEVMUF9DVExfQ09ERShJTlQ4NiAgICAgICAgICAgICAgICAgICAgICAgLDB4MDAxNSksCi1QTUhFTFBfQ1RMX0NPREUoSU5UODZYICAgICAgICAgICAgICAgICAgICAgICwweDAwMTYpLAotUE1IRUxQX0NUTF9DT0RFKENBTExSRUFMTU9ERSAgICAgICAgICAgICAgICAsMHgwMDE3KSwKLVBNSEVMUF9DVExfQ09ERShBTExPQ0xPQ0tFRCAgICAgICAgICAgICAgICAgLDB4MDAxOCksCi1QTUhFTFBfQ1RMX0NPREUoRlJFRUxPQ0tFRCAgICAgICAgICAgICAgICAgICwweDAwMTkpLAotUE1IRUxQX0NUTF9DT0RFKEVOQUJMRUxGQkNPTUIgICAgICAgICAgICAgICAsMHgwMDFBKSwKLVBNSEVMUF9DVExfQ09ERShHRVRQSFlTSUNBTEFERFIgICAgICAgICAgICAgLDB4MDAxQiksCi1QTUhFTFBfQ1RMX0NPREUoTUFMTE9DU0hBUkVEICAgICAgICAgICAgICAgICwweDAwMUQpLAotUE1IRUxQX0NUTF9DT0RFKEZSRUVTSEFSRUQgICAgICAgICAgICAgICAgICAsMHgwMDFGKSwKLVBNSEVMUF9DVExfQ09ERShMT0NLREFUQVBBR0VTICAgICAgICAgICAgICAgLDB4MDAyMCksCi1QTUhFTFBfQ1RMX0NPREUoVU5MT0NLREFUQVBBR0VTICAgICAgICAgICAgICwweDAwMjEpLAotUE1IRUxQX0NUTF9DT0RFKExPQ0tDT0RFUEFHRVMgICAgICAgICAgICAgICAsMHgwMDIyKSwKLVBNSEVMUF9DVExfQ09ERShVTkxPQ0tDT0RFUEFHRVMgICAgICAgICAgICAgLDB4MDAyMyksCi1QTUhFTFBfQ1RMX0NPREUoR0VUQ0FMTEdBVEUgICAgICAgICAgICAgICAgICwweDAwMjQpLAotUE1IRUxQX0NUTF9DT0RFKFNFVENOVFBBVEggICAgICAgICAgICAgICAgICAsMHgwMDI1KSwKLVBNSEVMUF9DVExfQ09ERShHRVRQREIgICAgICAgICAgICAgICAgICAgICAgLDB4MDAyNiksCi1QTUhFTFBfQ1RMX0NPREUoRkxVU0hUTEIgICAgICAgICAgICAgICAgICAgICwweDAwMjcpLAotUE1IRUxQX0NUTF9DT0RFKEdFVFBIWVNJQ0FMQUREUlJBTkdFICAgICAgICAsMHgwMDI4KSwKLVBNSEVMUF9DVExfQ09ERShBTExPQ1BBR0UgICAgICAgICAgICAgICAgICAgLDB4MDAyOSksCi1QTUhFTFBfQ1RMX0NPREUoRlJFRVBBR0UgICAgICAgICAgICAgICAgICAgICwweDAwMkEpLAotUE1IRUxQX0NUTF9DT0RFKEVOQUJMRVJJTkczSU9QTCAgICAgICAgICAgICAsMHgwMDJCKSwKLVBNSEVMUF9DVExfQ09ERShESVNBQkxFUklORzNJT1BMICAgICAgICAgICAgLDB4MDAyQyksCi1QTUhFTFBfQ1RMX0NPREUoR0FTRVRMT0NBTFBBVEggICAgICAgICAgICAgICwweDAwMkQpLAotUE1IRUxQX0NUTF9DT0RFKEdBR0VURVhQT1JUUyAgICAgICAgICAgICAgICAsMHgwMDJFKSwKLVBNSEVMUF9DVExfQ09ERShHQVRIVU5LICAgICAgICAgICAgICAgICAgICAgLDB4MDAyRiksCi1QTUhFTFBfQ1RMX0NPREUoU0VUTlVDTEVVU1BBVEggICAgICAgICAgICAgICwweDAwMzApLApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3BtYXBpLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvcG1hcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RkYWNlNy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvcG1hcGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIHRoZSBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnksIHdoaWNoCi0qICAgICAgICAgICAgICAgY29udGFpbnMgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBPUyBzcGVjaWZpYyBzZXJ2aWNlcyBpbiBhCi0qICAgICAgICAgICAgICAgZ2VuZXJpYywgY3Jvc3MgcGxhdGZvcm0gQVBJLiBQb3J0aW5nIHRoZSBPUyBQb3J0YWJpbGl0eQotKiAgICAgICAgICAgICAgIE1hbmFnZXIgbGlicmFyeSBpcyB0aGUgZmlyc3Qgc3RlcCB0byBwb3J0aW5nIGFueSBTY2lUZWNoCi0qICAgICAgICAgICAgICAgcHJvZHVjdHMgdG8gYSBuZXcgcGxhdGZvcm0uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fUE1BUElfSAotI2RlZmluZSBfX1BNQVBJX0gKLQotI2luY2x1ZGUgInNjaXRlY2guaCIKLSNpbmNsdWRlICJwY2lsaWIuaCIKLSNpbmNsdWRlICJ6dGltZXJjLmgiCi0jaWYgIWRlZmluZWQoX19XSU4zMl9WWERfXykgJiYgIWRlZmluZWQoX19PUzJfVkREX18pICYmICFkZWZpbmVkKF9fTlRfRFJJVkVSX18pCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIFR5cGVkZWZzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBZb3Ugd2lsbCBuZWVkIHRvIGRlZmluZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBiZWZvcmUgeW91IGNvbXBpbGUgdGhpcwotICogbGlicmFyeSBmb3IgaXQgdG8gd29yayBjb3JyZWN0bHkgd2l0aCB0aGUgRE9TIGV4dGVuZGVyIHRoYXQgeW91IGFyZQotICogdXNpbmcgd2hlbiBjb21waWxpbmcgZm9yIGV4dGVuZGVkIERPUzoKLSAqCi0gKiAgICAgIFROVCAgICAgICAgIC0gUGhhciBMYXAgVE5UIERPUyBFeHRlbmRlcgotICogICAgICBET1M0R1cgICAgICAtIFJhdGlvbmFsIERPUy80R1csIERPUy80R1cgUHJvLCBDYXVzZXdheSBhbmQgUE1PREUvVwotICogICAgICBESkdQUCAgICAgICAtIERKR1BQIHBvcnQgb2YgR05VIEMrKwotICoKLSAqIElmIG5vbmUgaXMgc3BlY2lmaWVkLCB3ZSB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIHdoaWNoIG9wZXJhdGluZwotICogc3lzdGVtIGlzIGJlaW5nIHRhcmdldHRlZCBhbmQgdGhlIGZvbGxvd2luZyB3aWxsIGJlIGRlZmluZWQgKHByb3ZpZGVkIGJ5Ci0gKiBzY2l0ZWNoLmggaGVhZGVyIGZpbGUpOgotICoKLSAqICAgICAgX19NU0RPUzE2X18gICAgIC0gRGVmYXVsdCBmb3IgMTYgYml0IE1TRE9TIG1vZGUKLSAqICAgICAgX19NU0RPUzMyX18gICAgIC0gRGVmYXVsdCBmb3IgMzIgYml0IE1TRE9TCi0gKiAgICAgIF9fV0lORE9XUzE2X18gICAtIERlZmF1bHQgZm9yIDE2IGJpdCBXaW5kb3dzCi0gKiAgICAgIF9fV0lORE9XUzMyX18gICAtIERlZmF1bHQgZm9yIDMyIGJpdCBXaW5kb3dzCi0gKgotICogT25lIG9mIHRoZSBmb2xsb3dpbmcgd2lsbCBiZSBkZWZpbmVkIGF1dG9tYXRpY2FsbHkgZm9yIHlvdSB0byBzZWxlY3QKLSAqIHdoaWNoIG1lbW9yeSBtb2RlbCBpcyBpbiBlZmZlY3Q6Ci0gKgotICogICAgICBSRUFMTU9ERSAgICAtIDE2IGJpdCByZWFsIG1vZGUgKGxhcmdlIG1lbW9yeSBtb2RlbCkKLSAqICAgICAgUE0yODYgICAgICAgLSAxNiBwcm90ZWN0ZWQgbW9kZSAobGFyZ2UgbWVtb3J5IG1vZGVsKQotICogICAgICBQTTM4NiAgICAgICAtIDMyIHByb3RlY3RlZCBtb2RlIChmbGF0IG1lbW9yeSBtb2RlbCkKLSAqLwotCi0jaWYgZGVmaW5lZChfX1VOSVhfXykgJiYgIWRlZmluZWQoX01BWF9QQVRIKQotI2RlZmluZSBfTUFYX1BBVEggMjU2Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoVE5UKSB8fCBkZWZpbmVkKERPU1gpIHx8IGRlZmluZWQoWDMyVk0pIHx8IGRlZmluZWQoRFBNSTMyKSAgICAgIFwKLSAgICB8fCBkZWZpbmVkKERPUzRHVykgfHwgZGVmaW5lZChESkdQUCkgfHwgZGVmaW5lZChfX1dJTkRPV1MzMl9fKSAgICAgICAgICBcCi0gICAgfHwgZGVmaW5lZChfX01TRE9TMzJfXykgfHwgZGVmaW5lZChfX1VOSVhfXykgfHwgZGVmaW5lZChfX1dJTjMyX1ZYRF9fKSBcCi0gICAgfHwgZGVmaW5lZChfXzMyQklUX18pIHx8IGRlZmluZWQoX19TTVgzMl9fKSB8fCBkZWZpbmVkKF9fUlRUQVJHRVRfXykKLSNkZWZpbmUgUE0zODYKLSNlbGlmIGRlZmluZWQoRFBNSTE2KSB8fCBkZWZpbmVkKF9fV0lORE9XUzE2X18pCi0jZGVmaW5lIFBNMjg2Ci0jZWxzZQotI2RlZmluZSBSRUFMTU9ERQotI2VuZGlmCi0KLSNwcmFnbWEgcGFjaygxKQotCi0vKiBQcm92aWRlIHRoZSB0eXBlZGVmcyBmb3IgdGhlIFBNX2ludDM4NiBmdW5jdGlvbnMsIHdoaWNoIGlzc3VlIG5hdGl2ZQotICogaW50ZXJydXB0cyBpbiByZWFsIG9yIHByb3RlY3RlZCBtb2RlIGFuZCBjYW4gcGFzcyBleHRlbmRlZCByZWdpc3RlcnMKLSAqIGFyb3VuZC4KLSAqLwotCi1zdHJ1Y3QgX1BNRFdPUkRSRUdTIHsKLSAgICB1bG9uZyAgIGVheCxlYngsZWN4LGVkeCxlc2ksZWRpLGNmbGFnOwotICAgIH07Ci0KLXN0cnVjdCBfUE1XT1JEUkVHUyB7Ci0gICAgdXNob3J0ICBheCxheF9oaTsKLSAgICB1c2hvcnQgIGJ4LGJ4X2hpOwotICAgIHVzaG9ydCAgY3gsY3hfaGk7Ci0gICAgdXNob3J0ICBkeCxkeF9oaTsKLSAgICB1c2hvcnQgIHNpLHNpX2hpOwotICAgIHVzaG9ydCAgZGksZGlfaGk7Ci0gICAgdXNob3J0ICBjZmxhZyxjZmxhZ19oaTsKLSAgICB9OwotCi1zdHJ1Y3QgX1BNQllURVJFR1MgewotICAgIHVjaGFyICAgYWwsIGFoOyB1c2hvcnQgYXhfaGk7Ci0gICAgdWNoYXIgICBibCwgYmg7IHVzaG9ydCBieF9oaTsKLSAgICB1Y2hhciAgIGNsLCBjaDsgdXNob3J0IGN4X2hpOwotICAgIHVjaGFyICAgZGwsIGRoOyB1c2hvcnQgZHhfaGk7Ci0gICAgfTsKLQotdHlwZWRlZiB1bmlvbiB7Ci0gICAgc3RydWN0ICBfUE1EV09SRFJFR1MgZTsKLSAgICBzdHJ1Y3QgIF9QTVdPUkRSRUdTICB4OwotICAgIHN0cnVjdCAgX1BNQllURVJFR1MgIGg7Ci0gICAgfSBQTVJFR1M7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1c2hvcnQgIGVzOwotICAgIHVzaG9ydCAgY3M7Ci0gICAgdXNob3J0ICBzczsKLSAgICB1c2hvcnQgIGRzOwotICAgIHVzaG9ydCAgZnM7Ci0gICAgdXNob3J0ICBnczsKLSAgICB9IFBNU1JFR1M7Ci0KLS8qIFByb3ZpZGUgZGVmaW5pdGlvbnMgZm9yIHRoZSByZWFsIG1vZGUgcmVnaXN0ZXIgc3RydWN0dXJlcyBwYXNzZWQgdG8KLSAqIHRoZSBQTV9pbnQ4NigpIGFuZCBQTV9pbnQ4NngoKSByb3V0aW5lcy4gTm90ZSB0aGF0IHdlIHByb3ZpZGUgb3VyIG93bgotICogZnVuY3Rpb25zIHRvIGRvIHRoaXMgZm9yIDE2LWJpdCBjb2RlIHRoYXQgY2FsbHMgdGhlIFBNX2ludDM4NiBmdW5jdGlvbnMuCi0gKi8KLQotdHlwZWRlZiBQTVJFR1MgIFJNUkVHUzsKLXR5cGVkZWYgUE1TUkVHUyBSTVNSRUdTOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgbG9uZyAgICBlZGk7Ci0gICAgbG9uZyAgICBlc2k7Ci0gICAgbG9uZyAgICBlYnA7Ci0gICAgbG9uZyAgICByZXNlcnZlZDsKLSAgICBsb25nICAgIGVieDsKLSAgICBsb25nICAgIGVkeDsKLSAgICBsb25nICAgIGVjeDsKLSAgICBsb25nICAgIGVheDsKLSAgICBzaG9ydCAgIGZsYWdzOwotICAgIHNob3J0ICAgZXMsZHMsZnMsZ3MsaXAsY3Msc3Asc3M7Ci0gICAgfSBEUE1JX3JlZ3M7Ci0KLSNpZmRlZiAgX19NU0RPU19fCi0vKiBSZWdpc3RlciBzdHJ1Y3R1cmUgcGFzc2VkIHRvIFBNX1Z4RENhbGwgZnVuY3Rpb24gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bG9uZyAgIGVheDsKLSAgICB1bG9uZyAgIGVieDsKLSAgICB1bG9uZyAgIGVjeDsKLSAgICB1bG9uZyAgIGVkeDsKLSAgICB1bG9uZyAgIGVzaTsKLSAgICB1bG9uZyAgIGVkaTsKLSAgICB1c2hvcnQgIGRzLGVzOwotICAgIH0gVlhEX3JlZ3M7Ci0jZW5kaWYKLQotI2RlZmluZSBQTV9NQVhfRFJJVkUgICAgICAgICAgICAgICAgMwotI2RlZmluZSBQTV9NQVhfUEFUSCAgICAgICAgICAgICAgICAgMjU2Ci0jZGVmaW5lIFBNX0ZJTEVfSU5WQUxJRCAgICAgICAgICAgICAodm9pZCopMHhGRkZGRkZGRgotCi0vKiBTdHJ1Y3R1cmUgZm9yIGdlbmVyaWMgZGlyZWN0b3J5IHRyYXZlcnNhbCBhbmQgbWFuYWdlbWVudC4gQWxzbyB0aGUgc2FtZQotICogdmFsdWVzIGFyZSBwYXNzZWQgdG8gUE1fc2V0RmlsZUF0dHIgdG8gY2hhbmdlIHRoZSBmaWxlIGF0dHJpYnV0ZXMuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVsb25nICAgZHdTaXplOwotICAgIHVsb25nICAgYXR0cmliOwotICAgIHVsb25nICAgc2l6ZUxvOwotICAgIHVsb25nICAgc2l6ZUhpOwotICAgIGNoYXIgICAgbmFtZVtQTV9NQVhfUEFUSF07Ci0gICAgfSBQTV9maW5kRGF0YTsKLQotLyogTWFjcm8gdG8gY29tcHV0ZSB0aGUgYnl0ZSBvZmZzZXQgb2YgYSBmaWVsZCBpbiBhIHN0cnVjdHVyZSBvZiB0eXBlIHR5cGUgKi8KLQotI2RlZmluZSBQTV9GSUVMRF9PRkZTRVQodHlwZSxmaWVsZCkgKChsb25nKSYoKCh0eXBlKikwKS0+ZmllbGQpKQotCi0vKiBNYXJjdG8gdG8gY29tcHV0ZSB0aGUgYWRkcmVzcyBvZiB0aGUgYmFzZSBvZiB0aGUgc3RydWN0dXJlIGdpdmVuIGl0cyB0eXBlLAotICogYW5kIGFuIGFkZHJlc3Mgb2YgYSBmaWVsZCB3aXRoaW4gdGhlIHN0cnVjdHVyZS4KLSAqLwotCi0jZGVmaW5lIFBNX0NPTlRBSU5JTkdfUkVDT1JEKGFkZHJlc3MsIHR5cGUsIGZpZWxkKSAgICAgIFwKLSAgICAoKHR5cGUqKSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChjaGFyKikoYWRkcmVzcykgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKGNoYXIqKSgmKCh0eXBlKikwKS0+ZmllbGQpKSkKLQotLyogRmxhZ3Mgc3RvcmVkIGluIHRoZSBQTV9maW5kRGF0YSBzdHJ1Y3R1cmUsIGFuZCBhbHNvIHZhbHVlcyBwYXNzZWQgdG8KLSAqIFBNX3NldEZpbGVBdHRyIHRvIGNoYW5nZSB0aGUgZmlsZSBhdHRyaWJ1dGVzLgotICovCi0KLSNkZWZpbmUgUE1fRklMRV9OT1JNQUwgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgUE1fRklMRV9SRUFET05MWSAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgUE1fRklMRV9ESVJFQ1RPUlkgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgUE1fRklMRV9BUkNISVZFICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgUE1fRklMRV9ISURERU4gICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgUE1fRklMRV9TWVNURU0gICAgICAgICAgICAgIDB4MDAwMDAwMTAKLQotLyogRmxhZ3MgcmV0dXJuZWQgYnkgdGhlIFBNX3NwbGl0cGF0aCBmdW5jdGlvbiAqLwotCi0jZGVmaW5lIFBNX0hBU19XSUxEQ0FSRFMgMHgwMQotI2RlZmluZSBQTV9IQVNfRVhURU5TSU9OIDB4MDIKLSNkZWZpbmUgUE1fSEFTX0ZJTEVOQU1FICAweDA0Ci0jZGVmaW5lIFBNX0hBU19ESVJFQ1RPUlkgMHgwOAotI2RlZmluZSBQTV9IQVNfRFJJVkUgICAgIDB4MTAKLQotLyogU3RydWN0dXJlIHBhc3NlZCB0byB0aGUgUE1fc2V0RmlsZVRpbWUgZnVuY3Rpb25zICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgc2hvcnQgICBzZWM7ICAgICAgICAvKiBTZWNvbmRzICovCi0gICAgc2hvcnQgICBtaW47ICAgICAgICAvKiBNaW51dGVzICovCi0gICAgc2hvcnQgICBob3VyOyAgICAgICAvKiBIb3VyICgwLS0yMykgKi8KLSAgICBzaG9ydCAgIGRheTsgICAgICAgIC8qIERheSBvZiBtb250aCAoMS0tMzEpICovCi0gICAgc2hvcnQgICBtb247ICAgICAgICAvKiBNb250aCAoMC0tMTEpICovCi0gICAgc2hvcnQgICB5ZWFyOyAgICAgICAvKiBZZWFyIChjYWxlbmRhciB5ZWFyIG1pbnVzIDE5MDApICovCi0gICAgfSBQTV90aW1lOwotCi0vKiBEZWZpbmUgYSBtYWNybyBmb3IgY3JlYXRpbmcgcGh5c2ljYWwgYmFzZSBhZGRyZXNzZXMgZnJvbSBzZWdtZW50Om9mZnNldCAqLwotCi0jZGVmaW5lIE1LX1BIWVMocyxvKSAgKCgodWxvbmcpKHMpIDw8IDQpICsgKHVsb25nKShvKSkKLQotLyogRGVmaW5lIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgbW9kZXMgc3VwcG9ydGVkLiBUaGlzIGlzIGEgZ2xvYmFsIHZhcmlhYmxlCi0gKiB0aGF0IGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgdHlwZSBhdCBydW50aW1lIHdoaWNoIHdpbGwgY29udGFpbgotICogb25lIG9mIHRoZXNlIHZhbHVlcy4KLSAqLwotCi10eXBlZGVmIGVudW0gewotICAgIFBNX3JlYWxNb2RlLAotICAgIFBNXzI4NiwKLSAgICBQTV8zODYKLSAgICB9IFBNX21vZGVfZW51bTsKLQotLyogRGVmaW5lIHR5cGVzIHBhc3NlZCB0byBQTV9lbmFibGVXcml0ZUNvbWJpbmUgKi8KLQotI2RlZmluZSBQTV9NVFJSX1VOQ0FDSEFCTEUgIDAKLSNkZWZpbmUgUE1fTVRSUl9XUkNPTUIgICAgICAxCi0jZGVmaW5lIFBNX01UUlJfV1JUSFJPVUdIICAgNAotI2RlZmluZSBQTV9NVFJSX1dSUFJPVCAgICAgIDUKLSNkZWZpbmUgUE1fTVRSUl9XUkJBQ0sgICAgICA2Ci0jZGVmaW5lIFBNX01UUlJfTUFYICAgICAgICAgNgotCi0vKiBFcnJvciBjb2RlcyByZXR1cm5lZCBieSBQTV9lbmFibGVXcml0ZUNvbWJpbmUgKi8KLQotI2RlZmluZSBQTV9NVFJSX0VSUl9PSyAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgUE1fTVRSUl9OT1RfU1VQUE9SVEVEICAgICAgICAgICAtMQotI2RlZmluZSBQTV9NVFJSX0VSUl9QQVJBTVMgICAgICAgICAgICAgIC0yCi0jZGVmaW5lIFBNX01UUlJfRVJSX05PVF80S0JfQUxJR05FRCAgICAgLTMKLSNkZWZpbmUgUE1fTVRSUl9FUlJfQkVMT1dfMU1CICAgICAgICAgICAtNAotI2RlZmluZSBQTV9NVFJSX0VSUl9OT1RfQUxJR05FRCAgICAgICAgIC01Ci0jZGVmaW5lIFBNX01UUlJfRVJSX09WRVJMQVAgICAgICAgICAgICAgLTYKLSNkZWZpbmUgUE1fTVRSUl9FUlJfVFlQRV9NSVNNQVRDSCAgICAgICAtNwotI2RlZmluZSBQTV9NVFJSX0VSUl9OT05FX0ZSRUUgICAgICAgICAgIC04Ci0jZGVmaW5lIFBNX01UUlJfRVJSX05PV1JDT01CICAgICAgICAgICAgLTkKLSNkZWZpbmUgUE1fTVRSUl9FUlJfTk9fT1NfU1VQUE9SVCAgICAgICAtMTAKLQotLyogVmFsdWVzIHBhc3NlZCB0byB0aGUgUE1fRE1BQ1Byb2dyYW0gZnVuY3Rpb24gKi8KLQotI2RlZmluZSBQTV9ETUFfUkVBRF9PTkVTSE9UICAgICAweDQ0ICAgIC8qIE9uZS1zaG90IERNQSByZWFkICAgICAgICAqLwotI2RlZmluZSBQTV9ETUFfV1JJVEVfT05FU0hPVCAgICAweDQ4ICAgIC8qIE9uZS1zaG90IERNQSB3cml0ZSAgICAgICAqLwotI2RlZmluZSBQTV9ETUFfUkVBRF9BVVRPSU5JVCAgICAweDU0ICAgIC8qIEF1dG8taW5pdCBETUEgcmVhZCAgICAgICAqLwotI2RlZmluZSBQTV9ETUFfV1JJVEVfQVVUT0lOSVQgICAweDU4ICAgIC8qIEF1dG8taW5pdCBETUEgd3JpdGUgICAgICAqLwotCi0vKiBGbGFncyBwYXNzZWQgdG8gc3VzcGVuZCBhcHBsaWNhdGlvbiBjYWxsYmFjayAqLwotCi0jZGVmaW5lIFBNX0RFQUNUSVZBVEUgICAgICAgMQotI2RlZmluZSBQTV9SRUFDVElWQVRFICAgICAgIDIKLQotLyogUmV0dXJuIGNvZGVzIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGNhbiByZXR1cm4gZnJvbSB0aGUgc3VzcGVuZCBhcHBsaWNhdGlvbgotICogY2FsbGJhY2sgcmVnaXN0ZXJlZCB3aXRoIHRoZSBQTSBsaWJyYXJ5LiBTZWUgdGhlIE1HTCBkb2N1bWVudGF0aW9uIGZvcgotICogbW9yZSBkZXRhaWxzLgotICovCi0jZGVmaW5lIFBNX1NVU1BFTkRfQVBQICAgICAgMAotI2RlZmluZSBQTV9OT19TVVNQRU5EX0FQUCAgIDEKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIHR5cGUgdmFsdWVzIHBhc3NlZCB0byB0aGUgUE1fYWdwUmVzZXJ2ZVBoeXNpY2FsCi1mdW5jdGlvbiwgdG8gZGVmaW5lIGhvdyB0aGUgcGh5c2ljYWwgbWVtb3J5IG1hcHBpbmcgc2hvdWxkIGJlIGhhbmRsZWQuCi0KLVRoZSBQTV9hZ3BVbmNhY2hlZCB0eXBlIGluZGljYXRlcyB0aGF0IHRoZSBtZW1vcnkgc2hvdWxkIGJlIGFsbG9jYXRlZCBhcwotdW5jYWNoZWQgbWVtb3J5LgotCi1UaGUgUE1fYWdwV3JpdGVDb21iaW5lIHR5cGUgaW5kaWNhdGVzIHRoYXQgd3JpdGUgY29tYmluaW5nIHNob3VsZCBiZSBlbmFibGVkCi1mb3IgcGh5c2ljYWwgbWVtb3J5IG1hcHBpbmcuIFRoaXMgaXMgdXNlZCBmb3IgZnJhbWVidWZmZXIgd3JpdGUgY29tYmluZyBhbmQKLXNwZWVkcyB1cCBkaXJlY3QgZnJhbWVidWZmZXIgd3JpdGVzIHRvIHRoZSBtZW1vcnkuCi0KLVRoZSBQTV9hZ3BJbnRlbERDQUNIRSB0eXBlIGluZGljYXRlcyB0aGF0IG1lbW9yeSBzaG91bGQgY29tZSBmcm9tIHRoZSBJbnRlbAotaTgxeCBEaXNwbGF5IENhY2hlIChvciBEQ0FDSEUpIG1lbW9yeSBwb29sLiBUaGlzIGZsYWcgaXMgc3BlY2lmaWMgdG8gdGhlCi1JbnRlbCBpODEwIGFuZCBpODE1IGNvbnRyb2xsZXJzLCBhbmQgc2hvdWxkIG5vdCBiZSBwYXNzZWQgZm9yIGFueSBvdGhlcgotY29udHJvbGxlciB0eXBlLgotCi1IRUFERVI6Ci1wbWFwaS5oCi0KLU1FTUJFUlM6Ci1QTV9hZ3BVbmNhY2hlZCAgICAgIC0gSW5kaWNhdGVzIHRoYXQgdGhlIG1lbW9yeSBzaG91bGQgYmUgdW5jYWNoZWQKLVBNX2FncFdyaXRlQ29tYmluZSAgLSBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVtb3J5IHNob3VsZCBiZSB3cml0ZSBjb21iaW5lZAotUE1fYWdwSW50ZWxEQ0FDSEUgICAtIEluZGljYXRlcyB0aGF0IHRoZSBtZW1vcnkgc2hvdWxkIGNvbWUgZnJvbSBEQ0FDSEUgcG9vbAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgUE1fYWdwVW5jYWNoZWQsCi0gICAgUE1fYWdwV3JpdGVDb21iaW5lLAotICAgIFBNX2FncEludGVsRENBQ0hFCi0gICAgfSBQTV9hZ3BNZW1vcnlUeXBlOwotCi0vKiBEZWZpbmVzIHRoZSBzaXplIG9mIGFuIHN5c3RlbSBtZW1vcnkgcGFnZSAqLwotCi0jZGVmaW5lIFBNX1BBR0VfU0laRSAgICAgICAgNDA5NgotCi0vKiBUeXBlIGRlZmluaXRpb24gZm9yIGEgcGh5c2ljYWwgbWVtb3J5IGFkZHJlc3MgKi8KLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIFBNX3BoeXNBZGRyOwotCi0vKiBEZWZpbmUgYSBiYWQgcGh5c2ljYWwgYWRkcmVzcyByZXR1cm5lZCBieSBtYXAgcGh5c2ljYWwgZnVuY3Rpb25zICovCi0KLSNkZWZpbmUgUE1fQkFEX1BIWVNfQUREUkVTUyAweEZGRkZGRkZGCi0KLS8qIFR5cGUgZGVmaW5pdGlvbiBmb3IgdGhlIDEyLWJ5dGUgbG9jayBoYW5kbGUgZm9yIGxvY2tpbmcgbGluZWFyIG1lbW9yeSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWxvbmcgICBoWzNdOwotICAgIH0gUE1fbG9ja0hhbmRsZTsKLQotLyogJ0MnIGNhbGxpbmcgY29udmVudGlvbnMgYWx3YXlzICAgICAgICovCi0KLSNkZWZpbmUgUE1BUEkgICBfQVNNQVBJCi0jZGVmaW5lIFBNQVBJUCAgX0FTTUFQSVAKLQotLyogSW50ZXJuYWwgdHlwZWRlZiB0byBvdmVycmlkZSBEUE1JX2ludDg2IGhhbmRsZXIgKi8KLQotdHlwZWRlZiBpYm9vbCAoUE1BUElQIERQTUlfaGFuZGxlcl90KShEUE1JX3JlZ3MgKnJlZ3MpOwotdm9pZCBQTUFQSSBEUE1JX3NldEludDEwSGFuZGxlcihEUE1JX2hhbmRsZXJfdCBoYW5kbGVyKTsKLQotLyogVHlwZSBkZWZpbml0aW9ucyBmb3IgYSB3aW5kb3cgaGFuZGxlIGZvciBjb25zb2xlIG1vZGVzICovCi0KLSNpZiAgICAgZGVmaW5lZChfX0RSSVZFUl9fKSB8fCBkZWZpbmVkKF9fV0lOMzJfVlhEX18pIHx8IGRlZmluZWQoX19OVF9EUklWRVJfXykKLXR5cGVkZWYgdm9pZCAgICAgICAgKlBNX0hXTkQ7ICAgLyogUG9pbnRlciBmb3IgcG9ydGFibGUgZHJpdmVycyAgICAgICAgICovCi10eXBlZGVmIHZvaWQgICAgICAgICpQTV9NT0RVTEU7IC8qIE1vZHVsZSBoYW5kbGUgZm9yIHBvcnRhYmxlIGRyaXZlcnMgICAqLwotI2VsaWYgICBkZWZpbmVkKF9fV0lORE9XU19fKQotI2lmZGVmICBERUNMQVJFX0hBTkRMRQotdHlwZWRlZiBIV05EICAgICAgICBQTV9IV05EOyAgICAvKiBSZWFsIHdpbmRvdyBoYW5kbGUgICAgICAgICAgICAgICAgICAgKi8KLXR5cGVkZWYgSElOU1RBTkNFICAgUE1fTU9EVUxFOyAgLyogV2luMzIgRExMIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICovCi0jZWxzZQotdHlwZWRlZiB2b2lkICAgICAgICAqUE1fSFdORDsgICAvKiBQbGFjZSBob2xkZXIgaWYgd2luZG93cy5oIG5vdCBpbmNsdWRlZCAqLwotdHlwZWRlZiB2b2lkICAgICAgICAqUE1fTU9EVUxFOyAvKiBQbGFjZSBob2xkZXIgaWYgd2luZG93cy5oIG5vdCBpbmNsdWRlZCAqLwotI2VuZGlmCi0jZWxpZiAgIGRlZmluZWQoX19VU0VfWDExX18pCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgV2luZG93ICAgICAgKndpbmRvdzsKLSAgICBEaXNwbGF5ICAgICAqZGlzcGxheTsKLSAgICB9IFBNX0hXTkQ7ICAgICAgICAgICAgICAgICAgLyogWDExIHdpbmRvdyBoYW5kbGUgKi8KLSNlbGlmICAgZGVmaW5lZChfX09TMl9fKQotdHlwZWRlZiB2b2lkICAgICpQTV9IV05EOwotdHlwZWRlZiB2b2lkICAgICpQTV9NT0RVTEU7Ci0jZWxpZiAgIGRlZmluZWQoX19MSU5VWF9fKQotdHlwZWRlZiBpbnQgICAgIFBNX0hXTkQ7ICAgICAgICAvKiBDb25zb2xlIGlkIGZvciBmdWxsc2NyZWVuIExpbnV4ICovCi10eXBlZGVmIHZvaWQgICAgKlBNX01PRFVMRTsKLSNlbGlmICAgZGVmaW5lZChfX1FOWF9fKQotdHlwZWRlZiBpbnQgICAgIFBNX0hXTkQ7ICAgICAgICAvKiBDb25zb2xlIGlkIGZvciBmdWxsc2NyZWVuIFFOWCAqLwotdHlwZWRlZiB2b2lkICAgICpQTV9NT0RVTEU7Ci0jZWxpZiAgIGRlZmluZWQoX19SVFRBUkdFVF9fKQotdHlwZWRlZiBpbnQgICAgIFBNX0hXTkQ7ICAgICAgICAvKiBQbGFjZWhvbGRlciBmb3IgUlRUYXJnZXQtMzIgKi8KLXR5cGVkZWYgdm9pZCAgICAqUE1fTU9EVUxFOwotI2VsaWYgICBkZWZpbmVkKF9fUkVBTERPU19fKQotdHlwZWRlZiBpbnQgICAgIFBNX0hXTkQ7ICAgICAgICAvKiBQbGFjZWhvbGRlciBmb3IgZnVsbHNjcmVlbiBET1MgKi8KLXR5cGVkZWYgdm9pZCAgICAqUE1fTU9EVUxFOyAgICAgLyogUGxhY2Vob2xkZXIgZm9yIGZ1bGxzY3JlZW4gRE9TICovCi0jZWxpZiAgIGRlZmluZWQoX19TTVgzMl9fKQotdHlwZWRlZiBpbnQgICAgIFBNX0hXTkQ7ICAgICAgICAvKiBQbGFjZWhvbGRlciBmb3IgZnVsbHNjcmVlbiBTTVggKi8KLXR5cGVkZWYgdm9pZCAgICAqUE1fTU9EVUxFOwotI2VsaWYgICBkZWZpbmVkKF9fU05BUF9fKQotdHlwZWRlZiB2b2lkICAgICpQTV9IV05EOwotdHlwZWRlZiB2b2lkICAgICpQTV9NT0RVTEU7Ci0jZWxzZQotI2Vycm9yICBQTSBsaWJyYXJ5IG5vdCBwb3J0ZWQgdG8gdGhpcyBwbGF0Zm9ybSB5ZXQhCi0jZW5kaWYKLQotLyogVHlwZSBkZWZpbml0aW9uIGZvciBjb2RlIHBvaW50ZXJzICovCi0KLXR5cGVkZWYgdm9pZCAoKl9fY29kZVB0cikoKTsKLQotLyogVHlwZSBkZWZpbml0aW9uIGZvciBhIEMgYmFzZWQgaW50ZXJydXB0IGhhbmRsZXIgKi8KLQotdHlwZWRlZiB2b2lkIChQTUFQSVAgUE1faW50SGFuZGxlcikodm9pZCk7Ci10eXBlZGVmIGlib29sIChQTUFQSVAgUE1faXJxSGFuZGxlcikodm9pZCk7Ci0KLS8qIEhhcmR3YXJlIElSUSBoYW5kbGUgdXNlZCB0byBzYXZlIGFuZCByZXN0b3JlIHRoZSBoYXJkd2FyZSBJUlEgKi8KLQotdHlwZWRlZiB2b2lkICpQTV9JUlFIYW5kbGU7Ci0KLS8qIFR5cGUgZGVmaW5pdGlvbiBmb3IgdGhlIGZhdGFsIGNsZWFudXAgaGFuZGxlciAqLwotCi10eXBlZGVmIHZvaWQgKFBNQVBJUCBQTV9mYXRhbENsZWFudXBIYW5kbGVyKSh2b2lkKTsKLQotLyogVHlwZSBkZWZpZmluaXRpb24gZm9yIHNhdmUgc3RhdGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KLQotdHlwZWRlZiBpbnQgKFBNQVBJUCBQTV9zYXZlU3RhdGVfY2IpKGludCBmbGFncyk7Ci0KLS8qIFR5cGUgZGVmaW5pbnRpb24gZm9yIGVudW0gd3JpdGUgY29tYmluZWQgY2FsbGJhY2sgZnVuY3Rpb24gKi8KLQotdHlwZWRlZiB2b2lkIChQTUFQSVAgUE1fZW51bVdyaXRlQ29tYmluZV90KSh1bG9uZyBiYXNlLHVsb25nIGxlbmd0aCx1aW50IHR5cGUpOwotCi0vKiBTdHJ1Y3R1cmUgZGVmaW5pbmcgYWxsIHRoZSBQTSBBUEkgZnVuY3Rpb25zIGFzIGV4cG9ydGVkIHRvCi0gKiB0aGUgYmluYXJ5IHBvcnRhYmxlIERMTCdzLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bG9uZyAgIGR3U2l6ZTsKLSAgICBpbnQgICAgIChQTUFQSVAgUE1fZ2V0TW9kZVR5cGUpKHZvaWQpOwotICAgIHZvaWQgKiAgKFBNQVBJUCBQTV9nZXRCSU9TUG9pbnRlcikodm9pZCk7Ci0gICAgdm9pZCAqICAoUE1BUElQIFBNX2dldEEwMDAwUG9pbnRlcikodm9pZCk7Ci0gICAgdm9pZCAqICAoUE1BUElQIFBNX21hcFBoeXNpY2FsQWRkcikodWxvbmcgYmFzZSx1bG9uZyBsaW1pdCxpYm9vbCBpc0NhY2hlZCk7Ci0gICAgdm9pZCAqICAoUE1BUElQIFBNX21hbGxvY1NoYXJlZCkobG9uZyBzaXplKTsKLSAgICB2b2lkICogIHJlc2VydmVkMTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fZnJlZVNoYXJlZCkodm9pZCAqcHRyKTsKLSAgICB2b2lkICogIChQTUFQSVAgUE1fbWFwVG9Qcm9jZXNzKSh2b2lkICpsaW5lYXIsdWxvbmcgbGltaXQpOwotICAgIHZvaWQgKiAgKFBNQVBJUCBQTV9tYXBSZWFsUG9pbnRlcikodWludCByX3NlZyx1aW50IHJfb2ZmKTsKLSAgICB2b2lkICogIChQTUFQSVAgUE1fYWxsb2NSZWFsU2VnKSh1aW50IHNpemUsdWludCAqcl9zZWcsdWludCAqcl9vZmYpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9mcmVlUmVhbFNlZykodm9pZCAqbWVtKTsKLSAgICB2b2lkICogIChQTUFQSVAgUE1fYWxsb2NMb2NrZWRNZW0pKHVpbnQgc2l6ZSx1bG9uZyAqcGh5c0FkZHIsaWJvb2wgY29udGlndW91cyxpYm9vbCBiZWxvdzE2TWVnKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fZnJlZUxvY2tlZE1lbSkodm9pZCAqcCx1aW50IHNpemUsaWJvb2wgY29udGlndW91cyk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX2NhbGxSZWFsTW9kZSkodWludCBzZWcsdWludCBvZmYsIFJNUkVHUyAqcmVncyxSTVNSRUdTICpzcmVncyk7Ci0gICAgaW50ICAgICAoUE1BUElQIFBNX2ludDg2KShpbnQgaW50bm8sIFJNUkVHUyAqaW4sIFJNUkVHUyAqb3V0KTsKLSAgICBpbnQgICAgIChQTUFQSVAgUE1faW50ODZ4KShpbnQgaW50bm8sIFJNUkVHUyAqaW4sIFJNUkVHUyAqb3V0LFJNU1JFR1MgKnNyZWdzKTsKLSAgICB2b2lkICAgIChQTUFQSVAgRFBNSV9pbnQ4NikoaW50IGludG5vLCBEUE1JX3JlZ3MgKnJlZ3MpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9hdmFpbGFibGVNZW1vcnkpKHVsb25nICpwaHlzaWNhbCx1bG9uZyAqdG90YWwpOwotICAgIHZvaWQgKiAgKFBNQVBJUCBQTV9nZXRWRVNBQnVmKSh1aW50ICpsZW4sdWludCAqcnNlZyx1aW50ICpyb2ZmKTsKLSAgICBsb25nICAgIChQTUFQSVAgUE1fZ2V0T1NUeXBlKSh2b2lkKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fZmF0YWxFcnJvcikoY29uc3QgY2hhciAqbXNnKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fc2V0QmFua0EpKGludCBiYW5rKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fc2V0QmFua0FCKShpbnQgYmFuayk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX3NldENSVFN0YXJ0KShpbnQgeCxpbnQgeSxpbnQgd2FpdFZSVCk7Ci0gICAgY2hhciAqICAoUE1BUElQIFBNX2dldEN1cnJlbnRQYXRoKShjaGFyICpwYXRoLGludCBtYXhMZW4pOwotICAgIGNvbnN0IGNoYXIgKiAoUE1BUElQIFBNX2dldFZCRUFGUGF0aCkodm9pZCk7Ci0gICAgY29uc3QgY2hhciAqIChQTUFQSVAgUE1fZ2V0TnVjbGV1c1BhdGgpKHZvaWQpOwotICAgIGNvbnN0IGNoYXIgKiAoUE1BUElQIFBNX2dldE51Y2xldXNDb25maWdQYXRoKSh2b2lkKTsKLSAgICBjb25zdCBjaGFyICogKFBNQVBJUCBQTV9nZXRVbmlxdWVJRCkodm9pZCk7Ci0gICAgY29uc3QgY2hhciAqIChQTUFQSVAgUE1fZ2V0TWFjaGluZU5hbWUpKHZvaWQpOwotICAgIGlib29sICAgKFBNQVBJUCBWRl9hdmFpbGFibGUpKHZvaWQpOwotICAgIHZvaWQgKiAgKFBNQVBJUCBWRl9pbml0KSh1bG9uZyBiYXNlQWRkcixpbnQgYmFua1NpemUsaW50IGNvZGVMZW4sdm9pZCAqYmFua0Z1bmMpOwotICAgIHZvaWQgICAgKFBNQVBJUCBWRl9leGl0KSh2b2lkKTsKLSAgICBQTV9IV05EIChQTUFQSVAgUE1fb3BlbkNvbnNvbGUpKFBNX0hXTkQgaHduZFVzZXIsaW50IGRldmljZSxpbnQgeFJlcyxpbnQgeVJlcyxpbnQgYnBwLGlib29sIGZ1bGxTY3JlZW4pOwotICAgIGludCAgICAgKFBNQVBJUCBQTV9nZXRDb25zb2xlU3RhdGVTaXplKSh2b2lkKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fc2F2ZUNvbnNvbGVTdGF0ZSkodm9pZCAqc3RhdGVCdWYsUE1fSFdORCBod25kQ29uc29sZSk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX3Jlc3RvcmVDb25zb2xlU3RhdGUpKGNvbnN0IHZvaWQgKnN0YXRlQnVmLFBNX0hXTkQgaHduZENvbnNvbGUpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9jbG9zZUNvbnNvbGUpKFBNX0hXTkQgaHduZENvbnNvbGUpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9zZXRPU0N1cnNvckxvY2F0aW9uKShpbnQgeCxpbnQgeSk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX3NldE9TU2NyZWVuV2lkdGgpKGludCB3aWR0aCxpbnQgaGVpZ2h0KTsKLSAgICBpbnQgICAgIChQTUFQSVAgUE1fZW5hYmxlV3JpdGVDb21iaW5lKSh1bG9uZyBiYXNlLHVsb25nIGxlbmd0aCx1aW50IHR5cGUpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9iYWNrc2xhc2gpKGNoYXIgKmZpbGVuYW1lKTsKLSAgICBpbnQgICAgIChQTUFQSVAgUE1fbG9ja0RhdGFQYWdlcykodm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsb2NrSGFuZGxlKTsKLSAgICBpbnQgICAgIChQTUFQSVAgUE1fdW5sb2NrRGF0YVBhZ2VzKSh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxvY2tIYW5kbGUpOwotICAgIGludCAgICAgKFBNQVBJUCBQTV9sb2NrQ29kZVBhZ2VzKShfX2NvZGVQdHIgcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsb2NrSGFuZGxlKTsKLSAgICBpbnQgICAgIChQTUFQSVAgUE1fdW5sb2NrQ29kZVBhZ2VzKShfX2NvZGVQdHIgcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsb2NrSGFuZGxlKTsKLSAgICBpYm9vbCAgIChQTUFQSVAgUE1fc2V0UmVhbFRpbWVDbG9ja0hhbmRsZXIpKFBNX2ludEhhbmRsZXIgaWgsaW50IGZyZXF1ZW5jeSk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3kpKGludCBmcmVxdWVuY3kpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9yZXN0b3JlUmVhbFRpbWVDbG9ja0hhbmRsZXIpKHZvaWQpOwotICAgIGlib29sICAgKFBNQVBJUCBQTV9kb0JJT1NQT1NUKSh1c2hvcnQgYXhWYWwsdWxvbmcgQklPU1BoeXNBZGRyLHZvaWQgKkJJT1NQdHIsdWxvbmcgQklPU0xlbik7Ci0gICAgY2hhciAgICAoUE1BUElQIFBNX2dldEJvb3REcml2ZSkodm9pZCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX2ZyZWVQaHlzaWNhbEFkZHIpKHZvaWQgKnB0cix1bG9uZyBsaW1pdCk7Ci0gICAgdWNoYXIgICAoUE1BUElQIFBNX2lucGIpKGludCBwb3J0KTsKLSAgICB1c2hvcnQgIChQTUFQSVAgUE1faW5wdykoaW50IHBvcnQpOwotICAgIHVsb25nICAgKFBNQVBJUCBQTV9pbnBkKShpbnQgcG9ydCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX291dHBiKShpbnQgcG9ydCx1Y2hhciB2YWwpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9vdXRwdykoaW50IHBvcnQsdXNob3J0IHZhbCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX291dHBkKShpbnQgcG9ydCx1bG9uZyB2YWwpOwotICAgIHZvaWQgKiAgcmVzZXJ2ZWQyOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2spKFBNX3NhdmVTdGF0ZV9jYiBzYXZlU3RhdGUpOwotICAgIGlib29sICAgKFBNQVBJUCBQTV9oYXZlQklPU0FjY2Vzcykodm9pZCk7Ci0gICAgaW50ICAgICAoUE1BUElQIFBNX2tiaGl0KSh2b2lkKTsKLSAgICBpbnQgICAgIChQTUFQSVAgUE1fZ2V0Y2gpKHZvaWQpOwotICAgIGlib29sICAgKFBNQVBJUCBQTV9maW5kQlBEKShjb25zdCBjaGFyICpkbGxuYW1lLGNoYXIgKmJwZHBhdGgpOwotICAgIHVsb25nICAgKFBNQVBJUCBQTV9nZXRQaHlzaWNhbEFkZHIpKHZvaWQgKnApOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9zbGVlcCkodWxvbmcgbWlsbGlzZWNvbmRzKTsKLSAgICBpbnQgICAgIChQTUFQSVAgUE1fZ2V0Q09NUG9ydCkoaW50IHBvcnQpOwotICAgIGludCAgICAgKFBNQVBJUCBQTV9nZXRMUFRQb3J0KShpbnQgcG9ydCk7Ci0gICAgUE1fTU9EVUxFIChQTUFQSVAgUE1fbG9hZExpYnJhcnkpKGNvbnN0IGNoYXIgKnN6RExMTmFtZSk7Ci0gICAgdm9pZCAqICAoUE1BUElQIFBNX2dldFByb2NBZGRyZXNzKShQTV9NT0RVTEUgaE1vZHVsZSxjb25zdCBjaGFyICpzelByb2NOYW1lKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fZnJlZUxpYnJhcnkpKFBNX01PRFVMRSBoTW9kdWxlKTsKLSAgICBpbnQgICAgIChQTUFQSVAgUENJX2VudW1lcmF0ZSkoUENJRGV2aWNlSW5mbyBpbmZvW10pOwotICAgIHVsb25nICAgKFBNQVBJUCBQQ0lfYWNjZXNzUmVnKShpbnQgaW5kZXgsdWxvbmcgdmFsdWUsaW50IGZ1bmMsUENJRGV2aWNlSW5mbyAqaW5mbyk7Ci0gICAgaWJvb2wgICAoUE1BUElQIFBDSV9zZXRIYXJkd2FyZUlSUSkoUENJRGV2aWNlSW5mbyAqaW5mbyx1aW50IGludFBpbix1aW50IElSUSk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBDSV9nZW5lcmF0ZVNwZWNpYWxDeWxlKSh1aW50IGJ1cyx1bG9uZyBzcGVjaWFsQ3ljbGVEYXRhKTsKLSAgICB2b2lkICogIHJlc2VydmVkMzsKLSAgICB1bG9uZyAgIChQTUFQSVAgUENJQklPU19nZXRFbnRyeSkodm9pZCk7Ci0gICAgdWludCAgICAoUE1BUElQIENQVV9nZXRQcm9jZXNzb3JUeXBlKSh2b2lkKTsKLSAgICBpYm9vbCAgIChQTUFQSVAgQ1BVX2hhdmVNTVgpKHZvaWQpOwotICAgIGlib29sICAgKFBNQVBJUCBDUFVfaGF2ZTNETm93KSh2b2lkKTsKLSAgICBpYm9vbCAgIChQTUFQSVAgQ1BVX2hhdmVTU0UpKHZvaWQpOwotICAgIGlib29sICAgKFBNQVBJUCBDUFVfaGF2ZVJEVFNDKSh2b2lkKTsKLSAgICB1bG9uZyAgIChQTUFQSVAgQ1BVX2dldFByb2Nlc3NvclNwZWVkKShpYm9vbCBhY2N1cmF0ZSk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFpUaW1lckluaXQpKHZvaWQpOwotICAgIHZvaWQgICAgKFBNQVBJUCBMWlRpbWVyT24pKHZvaWQpOwotICAgIHVsb25nICAgKFBNQVBJUCBMWlRpbWVyTGFwKSh2b2lkKTsKLSAgICB2b2lkICAgIChQTUFQSVAgTFpUaW1lck9mZikodm9pZCk7Ci0gICAgdWxvbmcgICAoUE1BUElQIExaVGltZXJDb3VudCkodm9pZCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIExaVGltZXJPbkV4dCkoTFpUaW1lck9iamVjdCAqdG0pOwotICAgIHVsb25nICAgKFBNQVBJUCBMWlRpbWVyTGFwRXh0KShMWlRpbWVyT2JqZWN0ICp0bSk7Ci0gICAgdm9pZCAgICAoUE1BUElQIExaVGltZXJPZmZFeHQpKExaVGltZXJPYmplY3QgKnRtKTsKLSAgICB1bG9uZyAgIChQTUFQSVAgTFpUaW1lckNvdW50RXh0KShMWlRpbWVyT2JqZWN0ICp0bSk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFVMWlRpbWVyT24pKHZvaWQpOwotICAgIHVsb25nICAgKFBNQVBJUCBVTFpUaW1lckxhcCkodm9pZCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFVMWlRpbWVyT2ZmKSh2b2lkKTsKLSAgICB1bG9uZyAgIChQTUFQSVAgVUxaVGltZXJDb3VudCkodm9pZCk7Ci0gICAgdWxvbmcgICAoUE1BUElQIFVMWlJlYWRUaW1lKSh2b2lkKTsKLSAgICB1bG9uZyAgIChQTUFQSVAgVUxaRWxhcHNlZFRpbWUpKHVsb25nIHN0YXJ0LHVsb25nIGZpbmlzaCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFVMWlRpbWVyUmVzb2x1dGlvbikodWxvbmcgKnJlc29sdXRpb24pOwotICAgIHZvaWQgKiAgKFBNQVBJUCBQTV9maW5kRmlyc3RGaWxlKShjb25zdCBjaGFyICpmaWxlbmFtZSxQTV9maW5kRGF0YSAqZmluZERhdGEpOwotICAgIGlib29sICAgKFBNQVBJUCBQTV9maW5kTmV4dEZpbGUpKHZvaWQgKmhhbmRsZSxQTV9maW5kRGF0YSAqZmluZERhdGEpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9maW5kQ2xvc2UpKHZvaWQgKmhhbmRsZSk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX21ha2VwYXRoKShjaGFyICpwLGNvbnN0IGNoYXIgKmRyaXZlLGNvbnN0IGNoYXIgKmRpcixjb25zdCBjaGFyICpuYW1lLGNvbnN0IGNoYXIgKmV4dCk7Ci0gICAgaW50ICAgICAoUE1BUElQIFBNX3NwbGl0cGF0aCkoY29uc3QgY2hhciAqZm4sY2hhciAqZHJpdmUsY2hhciAqZGlyLGNoYXIgKm5hbWUsY2hhciAqZXh0KTsKLSAgICBpYm9vbCAgIChQTUFQSVAgUE1fZHJpdmVWYWxpZCkoY2hhciBkcml2ZSk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX2dldGRjd2QpKGludCBkcml2ZSxjaGFyICpkaXIsaW50IGxlbik7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX3NldEZpbGVBdHRyKShjb25zdCBjaGFyICpmaWxlbmFtZSx1aW50IGF0dHJpYik7Ci0gICAgaWJvb2wgICAoUE1BUElQIFBNX21rZGlyKShjb25zdCBjaGFyICpmaWxlbmFtZSk7Ci0gICAgaWJvb2wgICAoUE1BUElQIFBNX3JtZGlyKShjb25zdCBjaGFyICpmaWxlbmFtZSk7Ci0gICAgdWludCAgICAoUE1BUElQIFBNX2dldEZpbGVBdHRyKShjb25zdCBjaGFyICpmaWxlbmFtZSk7Ci0gICAgaWJvb2wgICAoUE1BUElQIFBNX2dldEZpbGVUaW1lKShjb25zdCBjaGFyICpmaWxlbmFtZSxpYm9vbCBnbXRUaW1lLFBNX3RpbWUgKnRpbWUpOwotICAgIGlib29sICAgKFBNQVBJUCBQTV9zZXRGaWxlVGltZSkoY29uc3QgY2hhciAqZmlsZW5hbWUsaWJvb2wgZ210VGltZSxQTV90aW1lICp0aW1lKTsKLSAgICBjaGFyICogIChQTUFQSVAgQ1BVX2dldFByb2Nlc3Nvck5hbWUpKHZvaWQpOwotICAgIGludCAgICAgKFBNQVBJUCBQTV9nZXRWR0FTdGF0ZVNpemUpKHZvaWQpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9zYXZlVkdBU3RhdGUpKHZvaWQgKnN0YXRlQnVmKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fcmVzdG9yZVZHQVN0YXRlKShjb25zdCB2b2lkICpzdGF0ZUJ1Zik7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX3ZnYUJsYW5rRGlzcGxheSkodm9pZCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX3ZnYVVuYmxhbmtEaXNwbGF5KSh2b2lkKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fYmxvY2tVbnRpbFRpbWVvdXQpKHVsb25nIG1pbGxpc2Vjb25kcyk7Ci0gICAgdm9pZCAgICAoUE1BUElQIF9QTV9hZGQ2NCkodTMyIGFfbG93LHMzMiBhX2hpZ2gsdTMyIGJfbG93LHMzMiBiX2hpZ2gsX19pNjQgKnJlc3VsdCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIF9QTV9zdWI2NCkodTMyIGFfbG93LHMzMiBhX2hpZ2gsdTMyIGJfbG93LHMzMiBiX2hpZ2gsX19pNjQgKnJlc3VsdCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIF9QTV9tdWw2NCkodTMyIGFfbG93LHMzMiBhX2hpZ2gsdTMyIGJfbG93LHMzMiBiX2hpZ2gsX19pNjQgKnJlc3VsdCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIF9QTV9kaXY2NCkodTMyIGFfbG93LHMzMiBhX2hpZ2gsdTMyIGJfbG93LHMzMiBiX2hpZ2gsX19pNjQgKnJlc3VsdCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIF9QTV9zaHI2NCkodTMyIGFfbG93LHMzMiBhX2hpZ2gsczMyIHNoaWZ0LF9faTY0ICpyZXN1bHQpOwotICAgIHZvaWQgICAgKFBNQVBJUCBfUE1fc2FyNjQpKHUzMiBhX2xvdyxzMzIgYV9oaWdoLHMzMiBzaGlmdCxfX2k2NCAqcmVzdWx0KTsKLSAgICB2b2lkICAgIChQTUFQSVAgX1BNX3NobDY0KSh1MzIgYV9sb3csczMyIGFfaGlnaCxzMzIgc2hpZnQsX19pNjQgKnJlc3VsdCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIF9QTV9uZWc2NCkodTMyIGFfbG93LHMzMiBhX2hpZ2gsX19pNjQgKnJlc3VsdCk7Ci0gICAgdWxvbmcgICAoUE1BUElQIFBDSV9maW5kQkFSU2l6ZSkoaW50IGJhcixQQ0lEZXZpY2VJbmZvICpwY2kpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQQ0lfcmVhZFJlZ0Jsb2NrKShQQ0lEZXZpY2VJbmZvICppbmZvLGludCBpbmRleCx2b2lkICpkc3QsaW50IGNvdW50KTsKLSAgICB2b2lkICAgIChQTUFQSVAgUENJX3dyaXRlUmVnQmxvY2spKFBDSURldmljZUluZm8gKmluZm8saW50IGluZGV4LHZvaWQgKnNyYyxpbnQgY291bnQpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9mbHVzaFRMQikodm9pZCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX3VzZUxvY2FsTWFsbG9jKSh2b2lkICogKCptYWxsb2MpKHNpemVfdCBzaXplKSx2b2lkICogKCpjYWxsb2MpKHNpemVfdCBuZWxlbSxzaXplX3Qgc2l6ZSksdm9pZCAqICgqcmVhbGxvYykodm9pZCAqcHRyLHNpemVfdCBzaXplKSx2b2lkICgqZnJlZSkodm9pZCAqcCkpOwotICAgIHZvaWQgKiAgKFBNQVBJUCBQTV9tYWxsb2MpKHNpemVfdCBzaXplKTsKLSAgICB2b2lkICogIChQTUFQSVAgUE1fY2FsbG9jKShzaXplX3QgbmVsZW0sc2l6ZV90IHNpemUpOwotICAgIHZvaWQgKiAgKFBNQVBJUCBQTV9yZWFsbG9jKSh2b2lkICpwdHIsc2l6ZV90IHNpemUpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV9mcmVlKSh2b2lkICpwKTsKLSAgICBpYm9vbCAgIChQTUFQSVAgUE1fZ2V0UGh5c2ljYWxBZGRyUmFuZ2UpKHZvaWQgKnAsdWxvbmcgbGVuZ3RoLHVsb25nICpwaHlzQWRkcmVzcyk7Ci0gICAgdm9pZCAqICAoUE1BUElQIFBNX2FsbG9jUGFnZSkoaWJvb2wgbG9ja2VkKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fZnJlZVBhZ2UpKHZvaWQgKnApOwotICAgIHVsb25nICAgKFBNQVBJUCBQTV9hZ3BJbml0KSh2b2lkKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fYWdwRXhpdCkodm9pZCk7Ci0gICAgaWJvb2wgICAoUE1BUElQIFBNX2FncFJlc2VydmVQaHlzaWNhbCkodWxvbmcgbnVtUGFnZXMsaW50IHR5cGUsdm9pZCAqKnBoeXNDb250ZXh0LFBNX3BoeXNBZGRyICpwaHlzQWRkcik7Ci0gICAgaWJvb2wgICAoUE1BUElQIFBNX2FncFJlbGVhc2VQaHlzaWNhbCkodm9pZCAqcGh5c0NvbnRleHQpOwotICAgIGlib29sICAgKFBNQVBJUCBQTV9hZ3BDb21taXRQaHlzaWNhbCkodm9pZCAqcGh5c0NvbnRleHQsdWxvbmcgbnVtUGFnZXMsdWxvbmcgc3RhcnRPZmZzZXQsUE1fcGh5c0FkZHIgKnBoeXNBZGRyKTsKLSAgICBpYm9vbCAgIChQTUFQSVAgUE1fYWdwRnJlZVBoeXNpY2FsKSh2b2lkICpwaHlzQ29udGV4dCx1bG9uZyBudW1QYWdlcyx1bG9uZyBzdGFydE9mZnNldCk7Ci0gICAgaW50ICAgICAoUE1BUElQIFBDSV9nZXROdW1EZXZpY2VzKSh2b2lkKTsKLSAgICB2b2lkICAgIChQTUFQSVAgUE1fc2V0TG9jYWxCUERQYXRoKShjb25zdCBjaGFyICpwYXRoKTsKLSAgICB2b2lkICogIChQTUFQSVAgUE1fbG9hZERpcmVjdERyYXcpKGludCBkZXZpY2UpOwotICAgIHZvaWQgICAgKFBNQVBJUCBQTV91bmxvYWREaXJlY3REcmF3KShpbnQgZGV2aWNlKTsKLSAgICBQTV9IV05EIChQTUFQSVAgUE1fZ2V0RGlyZWN0RHJhd1dpbmRvdykodm9pZCk7Ci0gICAgdm9pZCAgICAoUE1BUElQIFBNX2RvU3VzcGVuZEFwcCkodm9pZCk7Ci0gICAgfSBQTV9pbXBvcnRzOwotCi0jcHJhZ21hIHBhY2soKQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgICAgICAgICAgICAvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLwotI2VuZGlmCi0KLSNpZmRlZiAgX19XSU4zMl9WWERfXwotI2RlZmluZSBWRVNBX0JVRl9TSVpFIDEwMjQKLWV4dGVybiB1Y2hhciAqX1BNX3JtQnVmQWRkcjsKLSNlbmRpZgotCi0vKiB7c2VjcmV0fSBQb2ludGVyIHRvIGdsb2JhbCBleHBvcnRzIHN0cnVjdHVyZS4KLSAqIFNob3VsZCBub3QgYmUgdXNlZCBieSBhcHBsaWNhdGlvbiBwcm9ncmFtcy4KLSAqLwotZXh0ZXJuIFBNX2ltcG9ydHMgX1ZBUkFQSSBfUE1faW1wb3J0czsKLQotLyoge3NlY3JldH0gKi8KLWV4dGVybiB2b2lkICogKCpfX1BNX21hbGxvYykoc2l6ZV90IHNpemUpOwotLyoge3NlY3JldH0gKi8KLWV4dGVybiB2b2lkICogKCpfX1BNX2NhbGxvYykoc2l6ZV90IG5lbGVtLHNpemVfdCBzaXplKTsKLS8qIHtzZWNyZXR9ICovCi1leHRlcm4gdm9pZCAqICgqX19QTV9yZWFsbG9jKSh2b2lkICpwdHIsc2l6ZV90IHNpemUpOwotLyoge3NlY3JldH0gKi8KLWV4dGVybiB2b2lkICgqX19QTV9mcmVlKSh2b2lkICpwKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnVuY3Rpb24gUHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogUm91dGluZSB0byBpbml0aWFsaXNlIHRoZSBob3N0IHNpZGUgUE0gbGlicmFyeS4gTm90ZSB1c2VkIGZyb20gRExMJ3MgKi8KLQotdm9pZCAgICBQTUFQSSBQTV9pbml0KHZvaWQpOwotCi0vKiBSb3V0aW5lIHRvIHJldHVybiBlaXRoZXIgUE1fcmVhbE1vZGUsIFBNXzI4NiBvciBQTV8zODYgKi8KLQotaW50ICAgICBQTUFQSSBQTV9nZXRNb2RlVHlwZSh2b2lkKTsKLQotLyogUm91dGluZSB0byByZXR1cm4gYSBzZWxlY3RvciB0byB0aGUgQklPUyBkYXRhIGFyZWEgYXQgc2VnbWVudCAweDQwICovCi0KLXZvaWQgKiAgUE1BUEkgUE1fZ2V0QklPU1BvaW50ZXIodm9pZCk7Ci0KLS8qIFJvdXRpbmUgdG8gcmV0dXJuIGEgbGluZWFyIHBvaW50ZXIgdG8gdGhlIFZHQSBmcmFtZSBidWZmZXIgbWVtb3J5ICovCi0KLXZvaWQgKiAgUE1BUEkgUE1fZ2V0QTAwMDBQb2ludGVyKHZvaWQpOwotCi0vKiBSb3V0aW5lcyB0byBtYXAvZnJlZSBwaHlzaWNhbCBtZW1vcnkgaW50byB0aGUgY3VycmVudCBEUyBzZWdtZW50LiBJbgotICogc29tZSBlbnZpcm9ubWVudHMgKDMyLWJpdCBET1MgaXMgb25lKSwgYWZ0ZXIgdGhlIG1hcHBpbmcgaGFzIGJlZW4KLSAqIGFsbG9jYXRlZCwgaXQgY2Fubm90IGJlIGZyZWVkLiBIZW5jZSB5b3Ugc2hvdWxkIG9ubHkgYWxsb2NhdGUgdGhlCi0gKiBtYXBwaW5nIG9uY2UgYW5kIGNhY2hlIHRoZSB2YWx1ZSBmb3IgdXNlIGJ5IG90aGVyIHBhcnRzIG9mIHlvdXIKLSAqIGFwcGxpY2F0aW9uLiBJZiB0aGUgbWFwcGluZyBjYW5ub3QgYmUgY3JlYXRlZWQsIHRoaXMgZnVuY3Rpb24gd2lsbAotICogcmV0dXJuIGEgTlVMTCBwb2ludGVyLgotICoKLSAqIFRoaXMgcm91dGluZSB3aWxsIGFsc28gd29yayBmb3IgbWVtb3J5IGFkZHJlc3NlcyBiZWxvdyAxTWIsIGJ1dCB0aGUKLSAqIG1hcHBlZCBhZGRyZXNzIGNhbm5vdCBjcm9zcyB0aGUgMU1iIGJvdW5kYXJ5LgotICovCi0KLXZvaWQgKiAgUE1BUEkgUE1fbWFwUGh5c2ljYWxBZGRyKHVsb25nIGJhc2UsdWxvbmcgbGltaXQsaWJvb2wgaXNDYWNoZWQpOwotdm9pZCAgICBQTUFQSSBQTV9mcmVlUGh5c2ljYWxBZGRyKHZvaWQgKnB0cix1bG9uZyBsaW1pdCk7Ci0KLS8qIFJvdXRpbmUgdG8gZGV0ZXJtaW5lIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIGEgbGluZWFyIGFkZHJlc3MuIEl0IGlzCi0gKiB1cCB0byB0aGUgY2FsbGVyIHRvIGVuc3VyZSB0aGUgZW50aXJlIGFkZHJlc3MgcmFuZ2UgZm9yIGEgbGluZWFyCi0gKiBibG9jayBvZiBtZW1vcnkgaXMgcGFnZSBhbGlnbmVkIGlmIHRoYXQgaXMgcmVxdWlyZWQuCi0gKi8KLQotdWxvbmcgICBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHIodm9pZCAqcCk7Ci1pYm9vbCAgIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkclJhbmdlKHZvaWQgKnAsdWxvbmcgbGVuZ3RoLHVsb25nICpwaHlzQWRkcmVzcyk7Ci0KLS8qIFJvdXRpbmVzIGZvciBtZW1vcnkgYWxsb2NhdGlvbi4gQnkgZGVmYXVsdCB0aGVzZSBmdW5jdGlvbnMgdXNlIHRoZSByZWd1bGFyCi0gKiBDIHJ1bnRpbWUgbGlicmFyeSBtYWxsb2MvZnJlZSBmdW5jdGlvbnMsIGJ1dCB5b3UgY2FuIHVzZSB0aGUKLSAqIFBNX3VzZUxvY2FsTWFsbG9jIGZ1bmN0aW9uIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG1lbW9yeSBhbGxvY2F0b3Igd2l0aAotICogeW91ciBvd24gbWVtb3J5IGFsbG9jYXRvci4gVGhpcyB3aWxsIGVuc3VyZSB0aGF0IGFsbCBtZW1vcnkgYWxsb2NhdGlvbgotICogdXNlZCBieSBTY2lUZWNoIHByb2R1Y3RzIHdpbGwgdXNlIHlvdXIgb3ZlcnJpZGRlbiBtZW1vcnkgYWxsb2NhdG9yCi0gKiBmdW5jdGlvbnMuCi0gKgotICogTm90ZSB0aGF0IEJQRCBmaWxlcyBhdXRvbWF0aWNhbGx5IG1hcCB0aGUgQyBydW50aW1lIGxpYnJhcnkKLSAqIG1hbGxvYy9jYWxsb2MvcmVhbGxvYy9mcmVlIGNhbGxzIGZyb20gaW5zaWRlIHRoZSBCUEQgdG8gdGhlIFBNIGxpYnJhcnkKLSAqIHZlcnNpb25zIGJ5IGRlZmF1bHQuCi0gKi8KLQotdm9pZCAgICBQTUFQSSBQTV91c2VMb2NhbE1hbGxvYyh2b2lkICogKCptYWxsb2MpKHNpemVfdCBzaXplKSx2b2lkICogKCpjYWxsb2MpKHNpemVfdCBuZWxlbSxzaXplX3Qgc2l6ZSksdm9pZCAqICgqcmVhbGxvYykodm9pZCAqcHRyLHNpemVfdCBzaXplKSx2b2lkICgqZnJlZSkodm9pZCAqcCkpOwotdm9pZCAqICBQTUFQSSBQTV9tYWxsb2Moc2l6ZV90IHNpemUpOwotdm9pZCAqICBQTUFQSSBQTV9jYWxsb2Moc2l6ZV90IG5lbGVtLHNpemVfdCBzaXplKTsKLXZvaWQgKiAgUE1BUEkgUE1fcmVhbGxvYyh2b2lkICpwdHIsc2l6ZV90IHNpemUpOwotdm9pZCAgICBQTUFQSSBQTV9mcmVlKHZvaWQgKnApOwotCi0vKiBSb3V0aW5lIHRvIGFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrIGluIHRoZSBnbG9iYWwgc2hhcmVkIHJlZ2lvbiB0aGF0Ci0gKiBpcyBjb21tb24gdG8gYWxsIHRhc2tzIGFuZCBhY2Nlc3NpYmxlIGZyb20gcmluZyAwIGNvZGUuCi0gKi8KLQotdm9pZCAqICBQTUFQSSBQTV9tYWxsb2NTaGFyZWQobG9uZyBzaXplKTsKLQotLyogUm91dGluZSB0byBmcmVlIHRoZSBhbGxvY2F0ZWQgc2hhcmVkIG1lbW9yeSBibG9jayAqLwotCi12b2lkICAgIFBNQVBJIFBNX2ZyZWVTaGFyZWQodm9pZCAqcHRyKTsKLQotLyogQXR0YWNoIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgbGluZWFyIG1hcHBpbmcgdG8gYSBuZXcgcHJvY2VzcyAqLwotCi12b2lkICogIFBNQVBJIFBNX21hcFRvUHJvY2Vzcyh2b2lkICpsaW5lYXIsdWxvbmcgbGltaXQpOwotCi0vKiBNYWNyb3MgdG8gZXh0cmFjdCBieXRlLCB3b3JkIGFuZCBsb25nIHZhbHVlcyBmcm9tIGEgY2hhciBwb2ludGVyICovCi0KLSNkZWZpbmUgUE1fZ2V0Qnl0ZShwKSAgICAgICAqKCh2b2xhdGlsZSB1Y2hhciopKHApKQotI2RlZmluZSBQTV9nZXRXb3JkKHApICAgICAgICooKHZvbGF0aWxlIHVzaG9ydCopKHApKQotI2RlZmluZSBQTV9nZXRMb25nKHApICAgICAgICooKHZvbGF0aWxlIHVsb25nKikocCkpCi0jZGVmaW5lIFBNX3NldEJ5dGUocCx2KSAgICAgUE1fZ2V0Qnl0ZShwKSA9ICh2KQotI2RlZmluZSBQTV9zZXRXb3JkKHAsdikgICAgIFBNX2dldFdvcmQocCkgPSAodikKLSNkZWZpbmUgUE1fc2V0TG9uZyhwLHYpICAgICBQTV9nZXRMb25nKHApID0gKHYpCi0KLS8qIFJvdXRpbmUgZm9yIGFjY2Vzc2luZyBhIGxvdyAxTWIgbWVtb3J5IGJsb2NrLiBZb3UgZG9udCBuZWVkIHRvIGZyZWUgdGhpcwotICogcG9pbnRlciwgYnV0IGluIDE2IGJpdCBwcm90ZWN0ZWQgbW9kZSB0aGUgc2VsZWN0b3IgYWxsb2NhdGVkIHdpbGwgYmUKLSAqIHJlLXVzZWQgdGhlIG5leHQgdGltZSB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkLgotICovCi0KLXZvaWQgKiAgUE1BUEkgUE1fbWFwUmVhbFBvaW50ZXIodWludCByX3NlZyx1aW50IHJfb2ZmKTsKLQotLyogUm91dGluZSB0byBhbGxvY2F0ZSBhIGJsb2NrIG9mIGNvbnZlbnRpb25hbCBtZW1vcnkgYmVsb3cgdGhlIDFNYgotICogbGltaXQgc28gdGhhdCBpdCBjYW4gYmUgYWNjZXNzZWQgZnJvbSByZWFsIG1vZGUuIEVuc3VyZSB0aGF0IHlvdSBmcmVlCi0gKiB0aGUgc2VnbWVudCB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIGl0LgotICoKLSAqIFRoaXMgcm91dGluZSByZXR1cm5zIGEgc2VsZWN0b3IgYW5kIG9mZnNldCB0byB0aGUgc2VnbWVudCB0aGF0IGhhcyBiZWVuCi0gKiBhbGxvY2F0ZWQsIGFuZCBhbHNvIHJldHVybnMgdGhlIHJlYWwgbW9kZSBzZWdtZW50IGFuZCBvZmZzZXQgd2hpY2ggY2FuCi0gKiBiZSBwYXNzZWQgdG8gcmVhbCBtb2RlIHJvdXRpbmVzLiBXaWxsIHJldHVybiAwIGlmIG1lbW9yeSBjb3VsZCBub3QgYmUKLSAqIGFsbG9jYXRlZC4KLSAqCi0gKiBQbGVhc2Ugbm90ZSB0aGF0IHdpdGggc29tZSBET1MgZXh0ZW5kZXJzLCBtZW1vcnkgYWxsb2NhdGVkIHdpdGggdGhlCi0gKiBmb2xsb3dpbmcgZnVuY3Rpb24gY2Fubm90IGJlIGZyZWVkLCBoZW5jZSBpdCB3aWxsIGJlIGFsbG9jYXRlZCBmb3IgdGhlCi0gKiBsaWZlIG9mIHlvdXIgcHJvZ3JhbS4gVGh1cyBpZiB5b3UgbmVlZCB0byBjYWxsIGEgYnVuY2ggb2YgZGlmZmVyZW50Ci0gKiByZWFsLW1vZGUgcm91dGluZXMgaW4geW91ciBwcm9ncmFtLCBhbGxvY2F0ZSBhIHNpbmdsZSBsYXJnZSBidWZmZXIgYXQKLSAqIHByb2dyYW0gc3RhcnR1cCB0aGF0IGNhbiBiZSByZS11c2VkIHRocm91Z2hvdXQgdGhlIHByb2dyYW0gZXhlY3V0aW9uLgotICovCi0KLXZvaWQgKiAgUE1BUEkgUE1fYWxsb2NSZWFsU2VnKHVpbnQgc2l6ZSx1aW50ICpyX3NlZyx1aW50ICpyX29mZik7Ci12b2lkICAgIFBNQVBJIFBNX2ZyZWVSZWFsU2VnKHZvaWQgKm1lbSk7Ci0KLS8qIFJvdXRpbmUgdG8gYWxsb2NhdGUgYSBibG9jayBvZiBsb2NrZWQgbWVtb3J5LCBhbmQgcmV0dXJuIGJvdGggdGhlCi0gKiBsaW5lYXIgYW5kIHBoeXNpY2FsIGFkZHJlc3NlcyBvZiB0aGUgbWVtb3J5LiBZb3Ugc2hvdWxkIGFsd2F5cwotICogYWxsb2NhdGUgbG9ja2VkIG1lbW9yeSBibG9ja3MgaW4gcGFnZSBzaXplZCBjaHVua3MgKGllOiA0SyBvbiBJQTMyKS4KLSAqIElmIHRoZSBtZW1vcnkgaXMgbm90IGNvbnRpZ3VvdXMsIHlvdSB3aWxsIG5lZWQgdG8gdXNlIHRoZQotICogUE1fZ2V0UGh5c2ljYWxBZGRyIGZ1bmN0aW9uIHRvIGdldCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBsaW5lYXIKLSAqIHBhZ2VzIHdpdGhpbiB0aGUgbWVtb3J5IGJsb2NrICh0aGUgcmV0dXJuZWQgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlCi0gKiBmb3IgdGhlIGZpcnN0IGFkZHJlc3MgaW4gdGhlIG1lbW9yeSBibG9jayBvbmx5KS4KLSAqLwotCi12b2lkICogIFBNQVBJIFBNX2FsbG9jTG9ja2VkTWVtKHVpbnQgc2l6ZSx1bG9uZyAqcGh5c0FkZHIsaWJvb2wgY29udGlndW91cyxpYm9vbCBiZWxvdzE2TWVnKTsKLXZvaWQgICAgUE1BUEkgUE1fZnJlZUxvY2tlZE1lbSh2b2lkICpwLHVpbnQgc2l6ZSxpYm9vbCBjb250aWd1b3VzKTsKLQotLyogUm91dGluZSB0byBhbGxvY2F0ZSBhbmQgZnJlZSBwYWdlZCBzaXplZCBibG9ja3Mgb2Ygc2hhcmVkIG1lbW9yeS4KLSAqIEFkZHJlc3NhYmxlIGZyb20gYWxsIHByb2Nlc3NlcywgYnV0IG5vdCBmcm9tIGEgcmluZyAwIGNvbnRleHQKLSAqIHVuZGVyIE9TLzIuIE5vdGUgdGhhdCB1bmRlciBPUy8yIFBNX21hcFNoYXJlZFBhZ2VzIG11c3QgYmUgY2FsbGVkCi0gKiB0byBtYXAgdGhlIG1lbW9yeSBibG9ja3MgaW50byB0aGUgc2hhcmVkIG1lbW9yeSBhZGRyZXNzIHNwYWNlCi0gKiBvZiBlYWNoIGNvbm5lY3RpbmcgcHJvY2Vzcy4KLSAqLwotCi12b2lkICogIFBNQVBJIFBNX2FsbG9jUGFnZShpYm9vbCBsb2NrZWQpOwotdm9pZCAgICBQTUFQSSBQTV9mcmVlUGFnZSh2b2lkICpwKTsKLSNpZmRlZiBfX09TMl9fCi12b2lkICAgIFBNQVBJIFBNX21hcFNoYXJlZFBhZ2VzKHZvaWQpOwotI2VuZGlmCi0KLS8qIFJvdXRpbmUgdG8gcmV0dXJuIHRydWUgaWYgd2UgaGF2ZSBhY2Nlc3MgdG8gdGhlIEJJT1Mgb24gdGhlIGhvc3QgT1MgKi8KLQotaWJvb2wgICBQTUFQSSBQTV9oYXZlQklPU0FjY2Vzcyh2b2lkKTsKLQotLyogUm91dGluZSB0byBjYWxsIGEgcmVhbCBtb2RlIGFzc2VtYmx5IGxhbmd1YWdlIHByb2NlZHVyZS4gUmVnaXN0ZXIKLSAqIHZhbHVlcyBhcmUgcGFzc2VkIGluIGFuZCBvdXQgaW4gdGhlICdyZWdzJyBhbmQgJ3NyZWdzJyBzdHJ1Y3R1cmVzLiBXZQotICogZG8gbm90IHByb3ZpZGUgYW55IG1ldGhvZCBvZiBjb3B5aW5nIGRhdGEgZnJvbSB0aGUgcHJvdGVjdGVkIG1vZGUgc3RhY2sKLSAqIHRvIHRoZSByZWFsIG1vZGUgc3RhY2ssIHNvIGlmIHlvdSBuZWVkIHRvIHBhc3MgZGF0YSB0byByZWFsIG1vZGUsIHlvdSB3aWxsCi0gKiBuZWVkIHRvIHdyaXRlIGEgcmVhbCBtb2RlIGFzc2VtYmx5IGxhbmd1YWdlIGhvb2sgdG8gcmVjaWV2ZSB0aGUgdmFsdWVzCi0gKiBpbiByZWdpc3RlcnMsIGFuZCB0byBwYXNzIHRoZSBkYXRhIHRocm91Z2ggYSByZWFsIG1vZGUgYmxvY2sgYWxsb2NhdGVkCi0gKiB3aXRoIHRoZSBQTV9hbGxvY1JlYWxTZWcoKSByb3V0aW5lLgotICovCi0KLXZvaWQgICAgUE1BUEkgUE1fY2FsbFJlYWxNb2RlKHVpbnQgc2VnLHVpbnQgb2ZmLCBSTVJFR1MgKnJlZ3MsUk1TUkVHUyAqc3JlZ3MpOwotCi0vKiBSb3V0aW5lcyB0byBnZW5lcmF0ZSByZWFsIG1vZGUgaW50ZXJydXB0cyB1c2luZyB0aGUgc2FtZSBpbnRlcmZhY2UgdGhhdAotICogaXMgdXNlZCBieSBpbnQ4NigpIGFuZCBpbnQ4NngoKSBpbiByZWFsbW9kZS4gVGhpcyByb3V0aW5lIGlzIG5lZWQgdG8KLSAqIGNhbGwgY2VydGFpbiBCSU9TIGFuZCBET1MgZnVuY3Rpb25zIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgc29tZQotICogRE9TIGV4dGVuZGVycy4gTm8gdHJhbnNsYXRpb24gaXMgZG9uZSBvbiBhbnkgb2YgdGhlIHJlZ2lzdGVyIHZhbHVlcywKLSAqIHNvIHRoZXkgbXVzdCBiZSBjb3JyZWN0bHkgc2V0IHVwIGFuZCB0cmFuc2xhdGVkIGJ5IHRoZSBjYWxsaW5nIHByb2dyYW0uCi0gKgotICogTm9ybWFsbHkgdGhlIERPUyBleHRlbmRlcnMgd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRoZSBub3JtYWwgaW50ODYoKQotICogZnVuY3Rpb24gZGlyZWN0bHkgYW5kIHdpbGwgcGFzcyBvbiB1bmhhbmRsZWQgY2FsbHMgdG8gcmVhbCBtb2RlIHRvIGJlCi0gKiBoYW5kbGVkIGJ5IHRoZSByZWFsIG1vZGUgaGFuZGxlci4gSG93ZXZlciBjYWxscyB0byBpbnQ4NngoKSB3aXRoIHJlYWwKLSAqIG1vZGUgc2VnbWVudCB2YWx1ZXMgdG8gYmUgbG9hZGVkIHdpbGwgY2F1c2UgYSBHUEYgaWYgdXNlZCB3aXRoIHRoZQotICogc3RhbmRhcmQgaW50ODZ4KCksIHNvIHlvdSBzaG91bGQgdXNlIHRoZXNlIHJvdXRpbmVzIGlmIHlvdSBrbm93IHlvdQotICogd2FudCB0byBjYWxsIGEgcmVhbCBtb2RlIGhhbmRsZXIuCi0gKi8KLQotaW50ICAgICBQTUFQSSBQTV9pbnQ4NihpbnQgaW50bm8sIFJNUkVHUyAqaW4sIFJNUkVHUyAqb3V0KTsKLWludCAgICAgUE1BUEkgUE1faW50ODZ4KGludCBpbnRubywgUk1SRUdTICppbiwgUk1SRUdTICpvdXQsUk1TUkVHUyAqc3JlZ3MpOwotCi0vKiBSb3V0aW5lIHRvIGdlbmVyYXRlIGEgcmVhbCBtb2RlIGludGVycnVwdC4gVGhpcyBpcyBpZGVudGljYWwgdG8gdGhlCi0gKiBhYm92ZSBmdW5jdGlvbiwgYnV0IHRha2VzIGEgRFBNSV9yZWdzIHN0cnVjdHVyZSBmb3IgdGhlIHJlZ2lzdGVycwotICogd2hpY2ggaGFzIGEgbG90IG1vcmUgaW5mb3JtYXRpb24uIEl0IGlzIG9ubHkgYXZhaWxhYmxlIGZyb20gMzItYml0Ci0gKiBwcm90ZWN0ZWQgbW9kZS4KLSAqLwotCi12b2lkICAgIFBNQVBJIERQTUlfaW50ODYoaW50IGludG5vLCBEUE1JX3JlZ3MgKnJlZ3MpOwotCi0vKiBGdW5jdGlvbiB0byByZXR1cm4gdGhlIGFtb3VudCBvZiBhdmFpbGFibGUgcGh5c2ljYWwgYW5kIHRvdGFsIG1lbW9yeS4KLSAqIFRoZSByZXN1bHRzIG9mIHRoaXMgZnVuY3Rpb24gYXJlICpvbmx5KiB2YWxpZCBiZWZvcmUgeW91IGhhdmUgbWFkZSBhbnkKLSAqIGNhbGxzIHRvIG1hbGxvYygpIGFuZCBmcmVlKCkuIElmIHlvdSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgZXhhY3RseSBob3cKLSAqIG11Y2ggbWVtb3J5IGlzIGN1cnJlbnRseSBhbGxvY2F0ZWQsIHlvdSBuZWVkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB0bwotICogZ2V0IHRoZSB0b3RhbCBhbW91bnQgb2YgbWVtb3J5IGF2YWlsYWJsZSBhbmQgdGhlbiBrZWVwIHRyYWNrIG9mCi0gKiB0aGUgYXZhaWxhYmxlIG1lbW9yeSBldmVyeSB0aW1lIHlvdSBjYWxsIG1hbGxvYygpIGFuZCBmcmVlKCkuCi0gKi8KLQotdm9pZCAgICBQTUFQSSBQTV9hdmFpbGFibGVNZW1vcnkodWxvbmcgKnBoeXNpY2FsLHVsb25nICp0b3RhbCk7Ci0KLS8qIFJldHVybiB0aGUgYWRkcmVzcyBvZiBhIGdsb2JhbCBWRVNBIHJlYWwgbW9kZSB0cmFuc2ZlciBidWZmZXIgZm9yIHVzZQotICogYnkgYXBwbGljYXRpb25zLgotICovCi0KLXZvaWQgKiAgUE1BUEkgUE1fZ2V0VkVTQUJ1Zih1aW50ICpsZW4sdWludCAqcnNlZyx1aW50ICpyb2ZmKTsKLQotLyogSGFuZGxlIGZhdGFsIGVycm9yIGNvbmRpdGlvbnMgKi8KLQotdm9pZCAgICBQTUFQSSBQTV9mYXRhbEVycm9yKGNvbnN0IGNoYXIgKm1zZyk7Ci0KLS8qIEZ1bmN0aW9uIHRvIHNldCBhIGNsZWFudXAgZXJyb3IgaGFuZGxlciBjYWxsZWQgd2hlbiBQTV9mYXRhbEVycm9yCi0gKiBpcyBjYWxsZWQuIFRoaXMgYWxsb3dzIHVzIHRvIHRoZSBjb25zb2xlIGJhY2sgaW50byBhIG5vcm1hbCBzdGF0ZQotICogaWYgd2UgZ2V0IGEgZmFpbHVyZSBmcm9tIGRlZXAgaW5zaWRlIGEgQlBEIGZpbGUuIFRoaXMgZnVuY3Rpb24gaXMKLSAqIG5vdCBleHBvcnRlZCB0byBCUEQgZmlsZXMsIGFuZCBpcyBvbmx5IHVzZWQgYnkgY29kZSBjb21waWxlZCBmb3IgdGhlCi0gKiBPUy4KLSAqLwotCi12b2lkICAgIFBNQVBJIFBNX3NldEZhdGFsRXJyb3JDbGVhbnVwKFBNX2ZhdGFsQ2xlYW51cEhhbmRsZXIgY2xlYW51cCk7Ci0KLS8qIFJldHVybiB0aGUgT1MgdHlwZSBmbGFnIGFzIGRlZmluZWQgaW4gPGRydmxpYi9vcy9vcy5oPiAqLwotCi1sb25nICAgIFBNQVBJIFBNX2dldE9TVHlwZSh2b2lkKTsKLQotLyogRnVuY3Rpb25zIHRvIHNldCBhIFZCRSBiYW5rIHZpYSBhbiBJbnQgMTBoICovCi0KLXZvaWQgICAgUE1BUEkgUE1fc2V0QmFua0EoaW50IGJhbmspOwotdm9pZCAgICBQTUFQSSBQTV9zZXRCYW5rQUIoaW50IGJhbmspOwotdm9pZCAgICBQTUFQSSBQTV9zZXRDUlRTdGFydChpbnQgeCxpbnQgeSxpbnQgd2FpdFZSVCk7Ci0KLS8qIFJldHVybiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAqLwotCi1jaGFyICogIFBNQVBJIFBNX2dldEN1cnJlbnRQYXRoKGNoYXIgKnBhdGgsaW50IG1heExlbik7Ci0KLS8qIFJldHVybiBwYXRocyB0byB0aGUgVkJFL0FGIGFuZCBOdWNsZXVzIGRpcmVjdG9yaWVzICovCi0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRWQkVBRlBhdGgodm9pZCk7Ci1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c1BhdGgodm9pZCk7Ci1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgodm9pZCk7Ci0KLS8qIEZpbmQgdGhlIHBhdGggdG8gYSBiaW5hcnkgcG9ydGFibGUgRExMICovCi0KLXZvaWQgICAgUE1BUEkgUE1fc2V0TG9jYWxCUERQYXRoKGNvbnN0IGNoYXIgKnBhdGgpOwotaWJvb2wgICBQTUFQSSBQTV9maW5kQlBEKGNvbnN0IGNoYXIgKmRsbG5hbWUsY2hhciAqYnBkcGF0aCk7Ci0KLS8qIFJldHVybnMgdGhlIGRyaXZlIGxldHRlciBvZiB0aGUgYm9vdCBkcml2ZSBmb3IgRE9TLCBPUy8yIGFuZCBXaW5kb3dzICovCi0KLWNoYXIgICAgUE1BUEkgUE1fZ2V0Qm9vdERyaXZlKHZvaWQpOwotCi0vKiBSZXR1cm4gYSBuZXR3b3JrIHVuaXF1ZSBtYWNoaW5lIGlkZW50aWZpZXIgYXMgYSBzdHJpbmcgKi8KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFVuaXF1ZUlEKHZvaWQpOwotCi0vKiBSZXR1cm4gdGhlIG5ldHdvcmsgbWFjaGluZSBuYW1lIGFzIGEgc3RyaW5nICovCi0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRNYWNoaW5lTmFtZSh2b2lkKTsKLQotLyogRnVuY3Rpb25zIHRvIGluc3RhbGwgYW5kIHJlbW92ZSB0aGUgdmlydHVhbCBsaW5lYXIgZnJhbWVidWZmZXIKLSAqIGVtdWxhdGlvbiBjb2RlLiBGb3IgdW5zdXBwb3J0ZWQgRE9TIGV4dGVuZGVycyBhbmQgd2hlbiBydW5uaW5nIHVuZGVyCi0gKiBhIERQTUkgaG9zdCBsaWtlIFdpbmRvd3Mgb3IgT1MvMiwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhIE5VTEwuCi0gKi8KLQotaWJvb2wgICBQTUFQSSBWRl9hdmFpbGFibGUodm9pZCk7Ci12b2lkICogIFBNQVBJIFZGX2luaXQodWxvbmcgYmFzZUFkZHIsaW50IGJhbmtTaXplLGludCBjb2RlTGVuLHZvaWQgKmJhbmtGdW5jKTsKLXZvaWQgICAgUE1BUEkgVkZfZXhpdCh2b2lkKTsKLQotLyogRnVuY3Rpb25zIHRvIHdhaXQgZm9yIGEga2V5cHJlc3MgYW5kIHJlYWQgYSBrZXkgZm9yIGNvbW1hbmQgbGluZQotICogZW52aXJvbm1lbnRzIHN1Y2ggYXMgRE9TLCBXaW4zMiBjb25zb2xlIGFuZCBVbml4LgotICovCi0KLWludCAgICAgUE1BUEkgUE1fa2JoaXQodm9pZCk7Ci1pbnQgICAgIFBNQVBJIFBNX2dldGNoKHZvaWQpOwotCi0vKiBGdW5jdGlvbnMgdG8gY3JlYXRlIGVpdGhlciBhIGZ1bGxzY3JlZW4gb3Igd2luZG93ZWQgY29uc29sZSBvbiB0aGUKLSAqIGRlc2t0b3AsIGFuZCB0byBhbGxvdyB0aGUgcmVzb2x1dGlvbiBvZiBmdWxsc2NyZWVuIGNvbnNvbGVzIHRvIGJlCi0gKiBjaGFuZ2VkIG9uIHRoZSBmbHkgd2l0aG91dCBjbG9zaW5nIHRoZSBjb25zb2xlLiBGb3Igbm9uLXdpbmRvd2VkCi0gKiBlbnZpcm9ubWVudHMgKHN1Y2ggYXMgYSBMaW51eCBvciBPUy8yIGZ1bGxzY3JlZW4gY29uc29sZSksIHRoZXNlCi0gKiBmdW5jdGlvbnMgZW5hYmxlIGNvbnNvbGUgZ3JhcGhpY3MgbW9kZSBhbmQgcmVzdG9yZSBjb25zb2xlIHRleHQgbW9kZS4KLSAqCi0gKiBUaGUgc3VzcGVuZCBhcHBsaWNhdGlvbiBjYWxsYmFjayBpcyB1c2VkIHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0bwotICogc2F2ZSB0aGUgc3RhdGUgb2YgdGhlIGZ1bGxzY3JlZW4gY29uc29sZSBtb2RlIHRvIGFsbG93IHRlbXBvcmFyeQotICogc3dpdGNoaW5nIHRvIGFub3RoZXIgY29uc29sZSBvciBiYWNrIHRvIHRoZSByZWd1bGFyIEdVSSBkZXNrdG9wLiBJdAotICogaXMgYWxzbyBjYWxsZWQgdG8gcmVzdG9yZSB0aGUgZnVsbHNjcmVlbiBncmFwaGljcyBzdGF0ZSBhZnRlciB0aGUKLSAqIGZ1bGxzY3JlZW4gY29uc29sZSByZWdhaW5zIHRoZSBmb2N1cy4KLSAqCi0gKiBUaGUgZGV2aWNlIHBhcmFtZXRlciBhbGxvd3MgZm9yIHRoZSBjb25zb2xlIHRvIGJlIG9wZW5lZCBvbiBhIGRpZmZlcmVudAotICogZGlzcGxheSBjb250cm9sbGVycyAoMCBpcyBhbHdheXMgdGhlIHByaW1hcnkgY29udHJvbGxlcikuCi0gKi8KLQotUE1fSFdORCBQTUFQSSBQTV9vcGVuQ29uc29sZShQTV9IV05EIGh3bmRVc2VyLGludCBkZXZpY2UsaW50IHhSZXMsaW50IHlSZXMsaW50IGJwcCxpYm9vbCBmdWxsU2NyZWVuKTsKLWludCAgICAgUE1BUEkgUE1fZ2V0Q29uc29sZVN0YXRlU2l6ZSh2b2lkKTsKLXZvaWQgICAgUE1BUEkgUE1fc2F2ZUNvbnNvbGVTdGF0ZSh2b2lkICpzdGF0ZUJ1ZixQTV9IV05EIGh3bmRDb25zb2xlKTsKLXZvaWQgICAgUE1BUEkgUE1fc2V0U3VzcGVuZEFwcENhbGxiYWNrKFBNX3NhdmVTdGF0ZV9jYiBzYXZlU3RhdGUpOwotdm9pZCAgICBQTUFQSSBQTV9yZXN0b3JlQ29uc29sZVN0YXRlKGNvbnN0IHZvaWQgKnN0YXRlQnVmLFBNX0hXTkQgaHduZENvbnNvbGUpOwotdm9pZCAgICBQTUFQSSBQTV9jbG9zZUNvbnNvbGUoUE1fSFdORCBod25kQ29uc29sZSk7Ci0KLS8qIEZ1bmN0aW9ucyB0byBtb2RpZnkgT1MgY29uc29sZSBpbmZvcm1hdGlvbiAqLwotCi12b2lkICAgIFBNQVBJIFBNX3NldE9TQ3Vyc29yTG9jYXRpb24oaW50IHgsaW50IHkpOwotdm9pZCAgICBQTUFQSSBQTV9zZXRPU1NjcmVlbldpZHRoKGludCB3aWR0aCxpbnQgaGVpZ2h0KTsKLQotLyogRnVuY3Rpb24gdG8gZW1hYmxlIEludGVsIFBQcm8vUElJIHdyaXRlIGNvbWJpbmluZyAqLwotCi1pbnQgICAgIFBNQVBJIFBNX2VuYWJsZVdyaXRlQ29tYmluZSh1bG9uZyBiYXNlLHVsb25nIGxlbmd0aCx1aW50IHR5cGUpOwotaW50ICAgICBQTUFQSSBQTV9lbnVtV3JpdGVDb21iaW5lKFBNX2VudW1Xcml0ZUNvbWJpbmVfdCBjYWxsYmFjayk7Ci0KLS8qIEZ1bmN0aW9uIHRvIGFkZCBhIHBhdGggc2VwYXJhdG9yIHRvIHRoZSBlbmQgb2YgYSBmaWxlbmFtZSAoaWYgbm90IHByZXNlbnQpICovCi0KLXZvaWQgICAgUE1BUEkgUE1fYmFja3NsYXNoKGNoYXIgKmZpbGVuYW1lKTsKLQotLyogUm91dGluZXMgdG8gbG9jayBhbmQgdW5sb2NrIHJlZ2lvbnMgb2YgbWVtb3J5IHVuZGVyIGEgdmlydHVhbCBtZW1vcnkKLSAqIGVudmlyb25tZW50LiBUaGVzZSByb3V0aW5lcyBfbXVzdF8gYmUgdXNlZCB0byBsb2NrIGFsbCBoYXJkd2FyZQotICogYW5kIG1vdXNlIGludGVycnVwdCBoYW5kbGVycyBpbnN0YWxsZWQsIF9BTkRfIGFueSBnbG9iYWwgZGF0YSB0aGF0Ci0gKiB0aGVzZSBoYW5kbGVyIG1hbmlwdWxhdGUsIHNvIHRoYXQgdGhleSB3aWxsIGFsd2F5cyBiZSBwcmVzZW50IGluIG1lbW9yeQotICogdG8gaGFuZGxlIHRoZSBpbmNvbWluZyBpbnRlcnJ1cHRzLgotICoKLSAqIE5vdGUgdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gY2FsbCB0aGUgY29ycmVjdCByb3V0aW5lIGRlcGVuZGluZyBvbgotICogd2hldGhlciB0aGUgYXJlYSBiZWluZyBsb2NrZWQgaXMgY29kZSBvciBkYXRhLCBzbyB0aGF0IHVuZGVyIDMyIGJpdAotICogUE0gd2Ugd2lsbCBnZXQgdGhlIHNlbGVjdG9yIHZhbHVlIGNvcnJlY3QuCi0gKi8KLQotaW50ICAgICBQTUFQSSBQTV9sb2NrRGF0YVBhZ2VzKHZvaWQgKnAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbG9ja0hhbmRsZSk7Ci1pbnQgICAgIFBNQVBJIFBNX3VubG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxvY2tIYW5kbGUpOwotaW50ICAgICBQTUFQSSBQTV9sb2NrQ29kZVBhZ2VzKF9fY29kZVB0ciBwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxvY2tIYW5kbGUpOwotaW50ICAgICBQTUFQSSBQTV91bmxvY2tDb2RlUGFnZXMoX19jb2RlUHRyIHAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbG9ja0hhbmRsZSk7Ci0KLS8qIFJvdXRpbmVzIHRvIGluc3RhbGwgYW5kIHJlbW92ZSBSZWFsIFRpbWUgQ2xvY2sgaW50ZXJydXB0IGhhbmRsZXJzLiBUaGUKLSAqIGZyZXF1ZW5jeSBvZiB0aGUgcmVhbCB0aW1lIGNsb2NrIGNhbiBiZSBjaGFuZ2VkIGJ5IGNhbGxpbmcKLSAqIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVueSwgYW5kIHRoZSB2YWx1ZSBjYW4gYmUgYW55IHBvd2VyIG9mIDIgdmFsdWUKLSAqIGZyb20gMkh6IHRvIDgxOTJIei4KLSAqCi0gKiBOb3RlIHRoYXQgeW91IF9tdXN0XyBsb2NrIHRoZSBtZW1vcnkgY29udGFpbmluZyB0aGUgaW50ZXJydXB0Ci0gKiBoYW5kbGVycyB3aXRoIHRoZSBQTV9sb2NrUGFnZXMoKSBmdW5jdGlvbiBvdGhlcndpc2UgeW91IG1heSBlbmNvdW50ZXIKLSAqIHByb2JsZW1zIGluIHZpcnR1YWwgbWVtb3J5IGVudmlyb25tZW50cy4KLSAqCi0gKiBOT1RFOiBVc2VyIHNwYWNlIHZlcnNpb25zIG9mIHRoZSBQTSBsaWJyYXJ5IHNob3VsZCBmYWlsIHRoZXNlIGZ1bmN0aW9ucy4KLSAqLwotCi1pYm9vbCAgIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tIYW5kbGVyKFBNX2ludEhhbmRsZXIgaWgsaW50IGZyZXF1ZW5jeSk7Ci12b2lkICAgIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3koaW50IGZyZXF1ZW5jeSk7Ci12b2lkICAgIFBNQVBJIFBNX3Jlc3RvcmVSZWFsVGltZUNsb2NrSGFuZGxlcih2b2lkKTsKLQotLyogUm91dGluZXMgdG8gaW5zdGFsbCBhbmQgcmVtb3ZlIGhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVycy4KLSAqCi0gKiBOb3RlIHRoYXQgeW91IF9tdXN0XyBsb2NrIHRoZSBtZW1vcnkgY29udGFpbmluZyB0aGUgaW50ZXJydXB0Ci0gKiBoYW5kbGVycyB3aXRoIHRoZSBQTV9sb2NrUGFnZXMoKSBmdW5jdGlvbiBvdGhlcndpc2UgeW91IG1heSBlbmNvdW50ZXIKLSAqIHByb2JsZW1zIGluIHZpcnR1YWwgbWVtb3J5IGVudmlyb25tZW50cy4KLSAqCi0gKiBOT1RFOiBVc2VyIHNwYWNlIHZlcnNpb25zIG9mIHRoZSBQTSBsaWJyYXJ5IHNob3VsZCBmYWlsIHRoZXNlIGZ1bmN0aW9ucy4KLSAqLwotCi1QTV9JUlFIYW5kbGUgUE1BUEkgUE1fc2V0SVJRSGFuZGxlcihpbnQgSVJRLFBNX2lycUhhbmRsZXIgaWgpOwotdm9pZCAgICBQTUFQSSBQTV9yZXN0b3JlSVJRSGFuZGxlcihQTV9JUlFIYW5kbGUgaXJxSGFuZGxlKTsKLQotLyogRnVuY3Rpb25zIHRvIHByb2dyYW0gRE1BIHVzaW5nIHRoZSBsZWdhY3kgSVNBIERNQSBjb250cm9sbGVyICovCi0KLXZvaWQgICAgUE1BUEkgUE1fRE1BQ0VuYWJsZShpbnQgY2hhbm5lbCk7Ci12b2lkICAgIFBNQVBJIFBNX0RNQUNEaXNhYmxlKGludCBjaGFubmVsKTsKLXZvaWQgICAgUE1BUEkgUE1fRE1BQ1Byb2dyYW0oaW50IGNoYW5uZWwsaW50IG1vZGUsdWxvbmcgYnVmZmVyUGh5cyxpbnQgY291bnQpOwotdWxvbmcgICBQTUFQSSBQTV9ETUFDUG9zaXRpb24oaW50IGNoYW5uZWwpOwotCi0vKiBGdW5jdGlvbiB0byBwb3N0IHNlY29uZGFyeSBncmFwaGljcyBjb250cm9sbGVycyB1c2luZyB0aGUgQklPUyAqLwotCi1pYm9vbCAgIFBNQVBJIFBNX2RvQklPU1BPU1QodXNob3J0IGF4VmFsLHVsb25nIEJJT1NQaHlzQWRkcix2b2lkICptYXBwZWRCSU9TLHVsb25nIEJJT1NMZW4pOwotCi0vKiBGdW5jdGlvbiB0byBpbml0IHRoZSBBR1AgZnVuY3Rpb25zIGFuZCByZXR1cm4gdGhlIEFHUCBhcGVydHVyZSBzaXplIGluIE1CICovCi0KLXVsb25nICAgUE1BUEkgUE1fYWdwSW5pdCh2b2lkKTsKLXZvaWQgICAgUE1BUEkgUE1fYWdwRXhpdCh2b2lkKTsKLQotLyogRnVuY3Rpb25zIHRvIHJlc2VydmUgYW5kIHJlbGVhc2UgcGh5c2ljYWwgQUdQIG1lbW9yeSByYW5nZXMgKi8KLQotaWJvb2wgICBQTUFQSSBQTV9hZ3BSZXNlcnZlUGh5c2ljYWwodWxvbmcgbnVtUGFnZXMsaW50IHR5cGUsdm9pZCAqKnBoeXNDb250ZXh0LFBNX3BoeXNBZGRyICpwaHlzQWRkcik7Ci1pYm9vbCAgIFBNQVBJIFBNX2FncFJlbGVhc2VQaHlzaWNhbCh2b2lkICpwaHlzQ29udGV4dCk7Ci0KLS8qIEZ1bmN0aW9ucyB0byBjb21taXQgYW5kIGZyZWUgcGh5c2ljYWwgQUdQIG1lbW9yeSByYW5nZXMgKi8KLQotaWJvb2wgICBQTUFQSSBQTV9hZ3BDb21taXRQaHlzaWNhbCh2b2lkICpwaHlzQ29udGV4dCx1bG9uZyBudW1QYWdlcyx1bG9uZyBzdGFydE9mZnNldCxQTV9waHlzQWRkciAqcGh5c0FkZHIpOwotaWJvb2wgICBQTUFQSSBQTV9hZ3BGcmVlUGh5c2ljYWwodm9pZCAqcGh5c0NvbnRleHQsdWxvbmcgbnVtUGFnZXMsdWxvbmcgc3RhcnRPZmZzZXQpOwotCi0vKiBGdW5jdGlvbnMgdG8gZG8gSS9PIHBvcnQgbWFuaXB1bGF0aW9uIGRpcmVjdGx5IGZyb20gQyBjb2RlLiBUaGVzZQotICogZnVuY3Rpb25zIGFyZSBwb3J0YWJsZSBhbmQgd2lsbCB3b3JrIG9uIGFueSBwcm9jZXNzb3IgYXJjaGl0ZWN0dXJlCi0gKiB0byBhY2Nlc3MgSS9PIHNwYWNlIHJlZ2lzdGVycyBvbiBQQ0kgZGV2aWNlcy4KLSAqLwotCi11Y2hhciAgIFBNQVBJIFBNX2lucGIoaW50IHBvcnQpOwotdXNob3J0ICBQTUFQSSBQTV9pbnB3KGludCBwb3J0KTsKLXVsb25nICAgUE1BUEkgUE1faW5wZChpbnQgcG9ydCk7Ci12b2lkICAgIFBNQVBJIFBNX291dHBiKGludCBwb3J0LHVjaGFyIHZhbCk7Ci12b2lkICAgIFBNQVBJIFBNX291dHB3KGludCBwb3J0LHVzaG9ydCB2YWwpOwotdm9pZCAgICBQTUFQSSBQTV9vdXRwZChpbnQgcG9ydCx1bG9uZyB2YWwpOwotCi0vKiBGdW5jdGlvbnMgdG8gZGV0ZXJtaW5lIHRoZSBJL08gcG9ydCBsb2NhdGlvbnMgZm9yIENPTSBhbmQgTFBUIHBvcnRzLgotICogVGhlIGZ1bmN0aW9ucyBhcmUgemVybyBiYXNlZCwgc28gZm9yIENPTTEgb3IgTFBUMSBwYXNzIGluIGEgdmFsdWUgb2YgMCwKLSAqIGZvciBDT00yIG9yIExQVDIgcGFzcyBpbiBhIHZhbHVlIG9mIDEgZXRjLgotICovCi0KLWludCAgICAgUE1BUEkgUE1fZ2V0Q09NUG9ydChpbnQgcG9ydCk7Ci1pbnQgICAgIFBNQVBJIFBNX2dldExQVFBvcnQoaW50IHBvcnQpOwotCi0vKiBJbnRlcm5hbCBmdW5jdGlvbnMgdGhhdCBuZWVkIHByb3RvdHlwZXMgKi8KLQotdm9pZCAgICBQTUFQSSBfUE1fZ2V0Uk12ZWN0KGludCBpbnRubywgbG9uZyAqcmVhbGlzcik7Ci12b2lkICAgIFBNQVBJIF9QTV9zZXRSTXZlY3QoaW50IGludG5vLCBsb25nIHJlYWxpc3IpOwotdm9pZCAgICBQTUFQSSBfUE1fZnJlZU1lbW9yeU1hcHBpbmdzKHZvaWQpOwotCi0vKiBGdW5jdGlvbiB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBkZWJ1ZyBsb2cgZmlsZSBsb2NhdGlvbiAqLwotCi12b2lkICAgIFBNQVBJIFBNX3NldERlYnVnTG9nKGNvbnN0IGNoYXIgKmxvZ0ZpbGVQYXRoKTsKLQotLyogRnVuY3Rpb24gdG8gcHV0IHRoZSBwcm9jZXNzIHRvIHNsZWVwIGZvciB0aGUgc3BlY2lmaWVkIG1pbGxpc2Vjb25kcyAqLwotCi12b2lkICAgIFBNQVBJIFBNX3NsZWVwKHVsb25nIG1pbGxpc2Vjb25kcyk7Ci0KLS8qIEZ1bmN0aW9uIHRvIGJsb2NrIHVudGlsICdtaWxsaXNlY29uZHMnIGhhdmUgcGFzc2VkIHNpbmNlIGxhc3QgY2FsbCAqLwotCi12b2lkICAgIFBNQVBJIFBNX2Jsb2NrVW50aWxUaW1lb3V0KHVsb25nIG1pbGxpc2Vjb25kcyk7Ci0KLS8qIEZ1bmN0aW9ucyBmb3IgZGlyZWN0b3J5IHRyYXZlcnNhbCBhbmQgbWFuYWdlbWVudCAqLwotCi12b2lkICogIFBNQVBJIFBNX2ZpbmRGaXJzdEZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsUE1fZmluZERhdGEgKmZpbmREYXRhKTsKLWlib29sICAgUE1BUEkgUE1fZmluZE5leHRGaWxlKHZvaWQgKmhhbmRsZSxQTV9maW5kRGF0YSAqZmluZERhdGEpOwotdm9pZCAgICBQTUFQSSBQTV9maW5kQ2xvc2Uodm9pZCAqaGFuZGxlKTsKLXZvaWQgICAgUE1BUEkgUE1fbWFrZXBhdGgoY2hhciAqcCxjb25zdCBjaGFyICpkcml2ZSxjb25zdCBjaGFyICpkaXIsY29uc3QgY2hhciAqbmFtZSxjb25zdCBjaGFyICpleHQpOwotaW50ICAgICBQTUFQSSBQTV9zcGxpdHBhdGgoY29uc3QgY2hhciAqZm4sY2hhciAqZHJpdmUsY2hhciAqZGlyLGNoYXIgKm5hbWUsY2hhciAqZXh0KTsKLWlib29sICAgUE1BUEkgUE1fZHJpdmVWYWxpZChjaGFyIGRyaXZlKTsKLXZvaWQgICAgUE1BUEkgUE1fZ2V0ZGN3ZChpbnQgZHJpdmUsY2hhciAqZGlyLGludCBsZW4pOwotdWludCAgICBQTUFQSSBQTV9nZXRGaWxlQXR0cihjb25zdCBjaGFyICpmaWxlbmFtZSk7Ci12b2lkICAgIFBNQVBJIFBNX3NldEZpbGVBdHRyKGNvbnN0IGNoYXIgKmZpbGVuYW1lLHVpbnQgYXR0cmliKTsKLWlib29sICAgUE1BUEkgUE1fZ2V0RmlsZVRpbWUoY29uc3QgY2hhciAqZmlsZW5hbWUsaWJvb2wgZ21UaW1lLFBNX3RpbWUgKnRpbWUpOwotaWJvb2wgICBQTUFQSSBQTV9zZXRGaWxlVGltZShjb25zdCBjaGFyICpmaWxlbmFtZSxpYm9vbCBnbVRpbWUsUE1fdGltZSAqdGltZSk7Ci1pYm9vbCAgIFBNQVBJIFBNX21rZGlyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKLWlib29sICAgUE1BUEkgUE1fcm1kaXIoY29uc3QgY2hhciAqZmlsZW5hbWUpOwotCi0vKiBGdW5jdGlvbnMgdG8gaGFuZGxlIGxvYWRpbmcgT1Mgc3BlY2lmaWMgc2hhcmVkIGxpYnJhcmllcyAqLwotCi1QTV9NT0RVTEUgUE1BUEkgUE1fbG9hZExpYnJhcnkoY29uc3QgY2hhciAqc3pETExOYW1lKTsKLXZvaWQgKiAgUE1BUEkgUE1fZ2V0UHJvY0FkZHJlc3MoUE1fTU9EVUxFIGhNb2R1bGUsY29uc3QgY2hhciAqc3pQcm9jTmFtZSk7Ci12b2lkICAgIFBNQVBJIFBNX2ZyZWVMaWJyYXJ5KFBNX01PRFVMRSBoTW9kdWxlKTsKLQotLyogRnVuY3Rpb25zIGFuZCBtYWNyb3MgZm9yIDY0LWJpdCBhcml0aG1ldGljICovCi0KLXZvaWQgICAgUE1BUEkgX1BNX2FkZDY0KHUzMiBhX2xvdyxzMzIgYV9oaWdoLHUzMiBiX2xvdyxzMzIgYl9oaWdoLF9faTY0ICpyZXN1bHQpOwotdm9pZCAgICBQTUFQSSBfUE1fc3ViNjQodTMyIGFfbG93LHMzMiBhX2hpZ2gsdTMyIGJfbG93LHMzMiBiX2hpZ2gsX19pNjQgKnJlc3VsdCk7Ci12b2lkICAgIFBNQVBJIF9QTV9tdWw2NCh1MzIgYV9sb3csczMyIGFfaGlnaCx1MzIgYl9sb3csczMyIGJfaGlnaCxfX2k2NCAqcmVzdWx0KTsKLXZvaWQgICAgUE1BUEkgX1BNX2RpdjY0KHUzMiBhX2xvdyxzMzIgYV9oaWdoLHUzMiBiX2xvdyxzMzIgYl9oaWdoLF9faTY0ICpyZXN1bHQpOwotdm9pZCAgICBQTUFQSSBfUE1fc2hyNjQodTMyIGFfbG93LHMzMiBhX2hpZ2gsczMyIHNoaWZ0LF9faTY0ICpyZXN1bHQpOwotdm9pZCAgICBQTUFQSSBfUE1fc2FyNjQodTMyIGFfbG93LHMzMiBhX2hpZ2gsczMyIHNoaWZ0LF9faTY0ICpyZXN1bHQpOwotdm9pZCAgICBQTUFQSSBfUE1fc2hsNjQodTMyIGFfbG93LHMzMiBhX2hpZ2gsczMyIHNoaWZ0LF9faTY0ICpyZXN1bHQpOwotdm9pZCAgICBQTUFQSSBfUE1fbmVnNjQodTMyIGFfbG93LHMzMiBhX2hpZ2gsX19pNjQgKnJlc3VsdCk7Ci0jaWZkZWYgX19OQVRJVkVfSU5UNjRfXwotI2RlZmluZSBQTV9hZGQ2NChyLGEsYikgICAgIChyKSA9IChhKSArIChiKQotI2RlZmluZSBQTV9hZGQ2NF8zMihyLGEsYikgIChyKSA9IChhKSArIChiKQotI2RlZmluZSBQTV9zdWI2NChyLGEsYikgICAgIChyKSA9IChhKSAtIChiKQotI2RlZmluZSBQTV9zdWI2NF8zMihyLGEsYikgIChyKSA9IChhKSAtIChiKQotI2RlZmluZSBQTV9tdWw2NChyLGEsYikgICAgIChyKSA9IChhKSAqIChiKQotI2RlZmluZSBQTV9tdWw2NF8zMihyLGEsYikgIChyKSA9IChhKSAqIChiKQotI2RlZmluZSBQTV9kaXY2NChyLGEsYikgICAgIChyKSA9IChhKSAvIChiKQotI2RlZmluZSBQTV9kaXY2NF8zMihyLGEsYikgIChyKSA9IChhKSAvIChiKQotI2RlZmluZSBQTV9zaHI2NChyLGEscykgICAgIChyKSA9IChhKSA+PiAocykKLSNkZWZpbmUgUE1fc2FyNjQocixhLHMpICAgICAocikgPSAoKHM2NCkoYSkpID4+IChzKQotI2RlZmluZSBQTV9zaGw2NChyLGEscykgICAgIChyKSA9ICh1NjQpKGEpIDw8IChzKQotI2RlZmluZSBQTV9uZWc2NChyLGEscykgICAgIChyKSA9IC0oYSkKLSNkZWZpbmUgUE1fbm90NjQocixhLHMpICAgICAocikgPSB+KGEpCi0jZGVmaW5lIFBNX2VxNjQoYSxiKSAgICAgICAgKGEpID09IChiKQotI2RlZmluZSBQTV9ndDY0KGEsYikgICAgICAgIChhKSA+IChiKQotI2RlZmluZSBQTV9sdDY0KGEsYikgICAgICAgIChhKSA8IChiKQotI2RlZmluZSBQTV9nZXE2NChhLGIpICAgICAgIChhKSA+PSAoYikKLSNkZWZpbmUgUE1fbGVxNjQoYSxiKSAgICAgICAoYSkgPD0gKGIpCi0jZGVmaW5lIFBNXzY0dG8zMihhKSAgICAgICAgKHUzMikoYSkKLSNkZWZpbmUgUE1fNjR0b3MzMihhKSAgICAgICAoczMyKShhKQotI2RlZmluZSBQTV9zZXQ2NChhLGIsYykgICAgIChhKSA9ICgodTY0KShiKSA8PCAzMikgKyAoYykKLSNkZWZpbmUgUE1fc2V0NjRfMzIoYSxiKSAgICAoYSkgPSAoYikKLSNlbHNlCi0jZGVmaW5lIFBNX2FkZDY0KHIsYSxiKSAgICAgX1BNX2FkZDY0KChhKS5sb3csKGEpLmhpZ2gsKGIpLmxvdywoYikuaGlnaCwmKHIpKQotI2RlZmluZSBQTV9hZGQ2NF8zMihyLGEsYikgIF9QTV9hZGQ2NCgoYSkubG93LChhKS5oaWdoLGIsMCwmKHIpKQotI2RlZmluZSBQTV9zdWI2NChyLGEsYikgICAgIF9QTV9zdWI2NCgoYSkubG93LChhKS5oaWdoLChiKS5sb3csKGIpLmhpZ2gsJihyKSkKLSNkZWZpbmUgUE1fc3ViNjRfMzIocixhLGIpICBfUE1fc3ViNjQoKGEpLmxvdywoYSkuaGlnaCxiLDAsJihyKSkKLSNkZWZpbmUgUE1fbXVsNjQocixhLGIpICAgICBfUE1fbXVsNjQoKGEpLmxvdywoYSkuaGlnaCwoYikubG93LChiKS5oaWdoLCYocikpCi0jZGVmaW5lIFBNX211bDY0XzMyKHIsYSxiKSAgX1BNX211bDY0KChhKS5sb3csKGEpLmhpZ2gsYiwwLCYocikpCi0jZGVmaW5lIFBNX2RpdjY0KHIsYSxiKSAgICAgX1BNX2RpdjY0KChhKS5sb3csKGEpLmhpZ2gsKGIpLmxvdywoYikuaGlnaCwmKHIpKQotI2RlZmluZSBQTV9kaXY2NF8zMihyLGEsYikgIF9QTV9kaXY2NCgoYSkubG93LChhKS5oaWdoLGIsMCwmKHIpKQotI2RlZmluZSBQTV9zaHI2NChyLGEscykgICAgIF9QTV9zaHI2NCgoYSkubG93LChhKS5oaWdoLHMsJihyKSkKLSNkZWZpbmUgUE1fc2FyNjQocixhLHMpICAgICBfUE1fc2FyNjQoKGEpLmxvdywoYSkuaGlnaCxzLCYocikpCi0jZGVmaW5lIFBNX3NobDY0KHIsYSxzKSAgICAgX1BNX3NobDY0KChhKS5sb3csKGEpLmhpZ2gscywmKHIpKQotI2RlZmluZSBQTV9uZWc2NChyLGEscykgICAgIF9QTV9uZWc2NCgoYSkubG93LChhKS5oaWdoLCYocikpCi0jZGVmaW5lIFBNX25vdDY0KHIsYSxzKSAgICAgKHIpLmxvdyA9IH4oYSkubG93LCAocikuaGlnaCA9IH4oYSkuaGlnaAotI2RlZmluZSBQTV9lcTY0KGEsYikgICAgICAgICgoYSkubG93ID09IChiKS5sb3cgJiYgKGEpLmhpZ2ggPT0gKGIpLmhpZ2gpCi0jZGVmaW5lIFBNX2d0NjQoYSxiKSAgICAgICAgKCgoYSkuaGlnaCA+IChiKS5oaWdoKSB8fCAoKGEpLmhpZ2ggPT0gKGIpLmhpZ2ggJiYgKGEpLmxvdyA+IChiKS5sb3cpKQotI2RlZmluZSBQTV9sdDY0KGEsYikgICAgICAgICgoKGEpLmhpZ2ggPCAoYikuaGlnaCkgfHwgKChhKS5oaWdoID09IChiKS5oaWdoICYmIChhKS5sb3cgPCAoYikubG93KSkKLSNkZWZpbmUgUE1fZ2VxNjQoYSxiKSAgICAgICAoUE1fZXE2NChhLGIpIHx8IFBNX2d0NjQoYSxiKSkKLSNkZWZpbmUgUE1fbGVxNjQoYSxiKSAgICAgICAoUE1fZXE2NChhLGIpIHx8IFBNX2x0NjQoYSxiKSkKLSNkZWZpbmUgUE1fNjR0bzMyKGEpICAgICAgICAodTMyKShhLmxvdykKLSNkZWZpbmUgUE1fNjR0b3MzMihhKSAgICAgICAoKGEpLmhpZ2ggPCAwKSA/IC0oYSkubG93IDogKGEpLmxvdykKLSNkZWZpbmUgUE1fc2V0NjQoYSxiLGMpICAgICAoYSkuaGlnaCA9IChiKSwgKGEpLmxvdyA9IChjKQotI2RlZmluZSBQTV9zZXQ2NF8zMihhLGIpICAgIChhKS5oaWdoID0gMCwgKGEpLmxvdyA9IChiKQotI2VuZGlmCi0KLS8qIEZ1bmN0aW9uIHRvIGVuYWJsZSBJT1BMIGFjY2VzcyBpZiByZXF1aXJlZCAqLwotCi1pbnQgICAgIFBNQVBJIFBNX3NldElPUEwoaW50IGlvcGwpOwotCi0vKiBGdW5jdGlvbiB0byBmbHVzaCB0aGUgVExCIGFuZCBDUFUgY2FjaGVzICovCi0KLXZvaWQgICAgUE1BUEkgUE1fZmx1c2hUTEIodm9pZCk7Ci0KLS8qIERPUyBzcGVjaWZpYyBmdWNudGlvbnMgKi8KLQotI2lmZGVmICBfX01TRE9TX18KLXVpbnQgICAgUE1BUEkgUE1IRUxQX2dldFZlcnNpb24odm9pZCk7Ci12b2lkICAgIFBNQVBJIFBNX1Z4RENhbGwoVlhEX3JlZ3MgKnJlZ3MpOwotI2VuZGlmCi0KLS8qIEZ1bmN0aW9ucyB0byBzYXZlIGFuZCByZXN0b3JlIHRoZSBWR0EgaGFyZHdhcmUgc3RhdGUgKi8KLQotaW50ICAgICBQTUFQSSBQTV9nZXRWR0FTdGF0ZVNpemUodm9pZCk7Ci12b2lkICAgIFBNQVBJIFBNX3NhdmVWR0FTdGF0ZSh2b2lkICpzdGF0ZUJ1Zik7Ci12b2lkICAgIFBNQVBJIFBNX3Jlc3RvcmVWR0FTdGF0ZShjb25zdCB2b2lkICpzdGF0ZUJ1Zik7Ci12b2lkICAgIFBNQVBJIFBNX3ZnYUJsYW5rRGlzcGxheSh2b2lkKTsKLXZvaWQgICAgUE1BUEkgUE1fdmdhVW5ibGFua0Rpc3BsYXkodm9pZCk7Ci0KLS8qIEZ1bmN0aW9ucyB0byBsb2FkIGFuZCB1bmxvYWQgRGlyZWN0RHJhdyBsaWJyYXJpZXMuIE9ubHkgdXNlZCBvbgotICogV2luZG93cyBwbGF0Zm9ybXMuCi0gKi8KLQotdm9pZCAqICBQTUFQSSBQTV9sb2FkRGlyZWN0RHJhdyhpbnQgZGV2aWNlKTsKLXZvaWQgICAgUE1BUEkgUE1fdW5sb2FkRGlyZWN0RHJhdyhpbnQgZGV2aWNlKTsKLVBNX0hXTkQgUE1BUEkgUE1fZ2V0RGlyZWN0RHJhd1dpbmRvdyh2b2lkKTsKLXZvaWQgICAgUE1BUEkgUE1fZG9TdXNwZW5kQXBwKHZvaWQpOwotCi0vKiBGdW5jdGlvbnMgdG8gaW5zdGFsbCwgc3RhcnQsIHN0b3AgYW5kIHJlbW92ZSBOVCBzZXJ2aWNlcy4gVmFsaWQgb25seQotICogZm9yIFdpbjMyIGFwcHMgcnVubmluZyBvbiBXaW5kb3dzIE5ULgotICovCi0KLSNpZmRlZiBfX1dJTkRPV1MzMl9fCi11bG9uZyAgIFBNQVBJIFBNX2luc3RhbGxTZXJ2aWNlKGNvbnN0IGNoYXIgKnN6RHJpdmVyTmFtZSxjb25zdCBjaGFyICpzelNlcnZpY2VOYW1lLGNvbnN0IGNoYXIgKnN6TG9hZEdyb3VwLHVsb25nIGR3U2VydmljZVR5cGUpOwotdWxvbmcgICBQTUFQSSBQTV9zdGFydFNlcnZpY2UoY29uc3QgY2hhciAqc3pTZXJ2aWNlTmFtZSk7Ci11bG9uZyAgIFBNQVBJIFBNX3N0b3BTZXJ2aWNlKGNvbnN0IGNoYXIgKnN6U2VydmljZU5hbWUpOwotdWxvbmcgICBQTUFQSSBQTV9yZW1vdmVTZXJ2aWNlKGNvbnN0IGNoYXIgKnN6U2VydmljZU5hbWUpOwotI2VuZGlmCi0KLS8qIFJvdXRpbmVzIHRvIGdlbmVyYXRlIG5hdGl2ZSBpbnRlcnJ1cHRzIChpZTogcHJvdGVjdGVkIG1vZGUgaW50ZXJydXB0cwotICogZm9yIHByb3RlY3RlZCBtb2RlIGFwcHMpIHVzaW5nIGFuIGludGVyZmFjZSB0aGUgc2FtZSBhcyB0aGF0IHVzZSBieQotICogaW50ODYoKSBhbmQgaW50ODZ4KCkgaW4gcmVhbG1vZGUuIFRoZXNlIHJvdXRpbmVzIGFyZSByZXF1aXJlZCBiZWNhdXNlCi0gKiBtYW55IDMyIGJpdCBjb21waWxlcnMgdXNlIGRpZmZlcmVudCByZWdpc3RlciBzdHJ1Y3R1cmVzIGFuZCBkaWZmZXJlbnQKLSAqIGZ1bmN0aW9ucyBjYXVzaW5nIG1ham9yIHBvcnRhYmlsaXR5IGhlYWRhY2hlcy4gVGh1cyB3ZSBwcm92aWRlIG91cgotICogb3duIGFuZCBzb2x2ZSBpdCBhbGwgaW4gb25lIGZlbGwgc3dvb3AsIGFuZCB3ZSBhbHNvIGdldCBhIHJvdXRpbmUgdG8KLSAqIHB1dCBzdHVmZiBpbnRvIDMyIGJpdCByZWdpc3RlcnMgZnJvbSByZWFsIG1vZGUgOy0pCi0gKi8KLQotdm9pZCAgICBQTUFQSSBQTV9zZWdyZWFkKFBNU1JFR1MgKnNyZWdzKTsKLWludCAgICAgUE1BUEkgUE1faW50Mzg2KGludCBpbnRubywgUE1SRUdTICppbiwgUE1SRUdTICpvdXQpOwotaW50ICAgICBQTUFQSSBQTV9pbnQzODZ4KGludCBpbnRubywgUE1SRUdTICppbiwgUE1SRUdTICpvdXQsUE1TUkVHUyAqc3JlZ3MpOwotCi0vKiBDYWxsIHRoZSBYODYgZW11bGF0b3Igb3IgdGhlIHJlYWwgQklPUyBpbiBvdXIgdGVzdCBoYXJuZXNzICovCi0KLSNpZiBkZWZpbmVkKFRFU1RfSEFSTkVTUykgJiYgIWRlZmluZWQoUE1MSUIpCi0jZGVmaW5lIFBNX21hcFJlYWxQb2ludGVyKHJfc2VnLHJfb2ZmKSAgICAgIF9QTV9pbXBvcnRzLlBNX21hcFJlYWxQb2ludGVyKHJfc2VnLHJfb2ZmKQotI2RlZmluZSBQTV9nZXRWRVNBQnVmKGxlbixyc2VnLHJvZmYpICAgICAgICBfUE1faW1wb3J0cy5QTV9nZXRWRVNBQnVmKGxlbixyc2VnLHJvZmYpCi0jZGVmaW5lIFBNX2NhbGxSZWFsTW9kZShzZWcsb2ZmLHJlZ3Msc3JlZ3MpIF9QTV9pbXBvcnRzLlBNX2NhbGxSZWFsTW9kZShzZWcsb2ZmLHJlZ3Msc3JlZ3MpCi0jZGVmaW5lIFBNX2ludDg2KGludG5vLGluLG91dCkgICAgICAgICAgICAgIF9QTV9pbXBvcnRzLlBNX2ludDg2KGludG5vLGluLG91dCkKLSNkZWZpbmUgUE1faW50ODZ4KGludG5vLGluLG91dCxzcmVncykgICAgICAgX1BNX2ltcG9ydHMuUE1faW50ODZ4KGludG5vLGluLG91dCxzcmVncykKLSNlbmRpZgotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi19ICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKyAgICovCi0jZW5kaWYKLQotLyogSW5jbHVkZSBPUyBleHRlbnNpb25zIGZvciBpbnRlcnJ1cHQgaGFuZGxpbmcgKi8KLQotI2lmIGRlZmluZWQoX19SRUFMRE9TX18pIHx8IGRlZmluZWQoX19TTVgzMl9fKQotI2luY2x1ZGUgInBtaW50LmgiCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fUE1BUElfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3BtaW1wLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvcG1pbXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE3ZjVlNi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvcG1pbXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBIZWFkZXIgZmlsZSBkZWNsYXJpbmcgYWxsIHRoZSBQTSBpbXBvcnRzIHN0cnVjdHVyZSBmb3IgdGhlCi0qICAgICAgICAgICAgICAgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBQTSBsaWJyYXJ5LiBJbmNsdWRlZCBpbiBhbGwgY29kZQotKiAgICAgICAgICAgICAgIHRoYXQgbmVlZHMgdG8gcGFzcyB0aGUgUE0gaW1wb3J0cyB0byBCUEQgZmlsZXMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1QTV9pbXBvcnRzICBfVkFSQVBJIF9QTV9pbXBvcnRzID0gewotICAgIHNpemVvZihQTV9pbXBvcnRzKSwKLSAgICBQTV9nZXRNb2RlVHlwZSwKLSAgICBQTV9nZXRCSU9TUG9pbnRlciwKLSAgICBQTV9nZXRBMDAwMFBvaW50ZXIsCi0gICAgUE1fbWFwUGh5c2ljYWxBZGRyLAotICAgIFBNX21hbGxvY1NoYXJlZCwKLSAgICBOVUxMLAotICAgIFBNX2ZyZWVTaGFyZWQsCi0gICAgUE1fbWFwVG9Qcm9jZXNzLAotICAgIFBNX21hcFJlYWxQb2ludGVyLAotICAgIFBNX2FsbG9jUmVhbFNlZywKLSAgICBQTV9mcmVlUmVhbFNlZywKLSAgICBQTV9hbGxvY0xvY2tlZE1lbSwKLSAgICBQTV9mcmVlTG9ja2VkTWVtLAotICAgIFBNX2NhbGxSZWFsTW9kZSwKLSAgICBQTV9pbnQ4NiwKLSAgICBQTV9pbnQ4NngsCi0gICAgRFBNSV9pbnQ4NiwKLSAgICBQTV9hdmFpbGFibGVNZW1vcnksCi0gICAgUE1fZ2V0VkVTQUJ1ZiwKLSAgICBQTV9nZXRPU1R5cGUsCi0gICAgUE1fZmF0YWxFcnJvciwKLSAgICBQTV9zZXRCYW5rQSwKLSAgICBQTV9zZXRCYW5rQUIsCi0gICAgUE1fc2V0Q1JUU3RhcnQsCi0gICAgUE1fZ2V0Q3VycmVudFBhdGgsCi0gICAgUE1fZ2V0VkJFQUZQYXRoLAotICAgIFBNX2dldE51Y2xldXNQYXRoLAotICAgIFBNX2dldE51Y2xldXNDb25maWdQYXRoLAotICAgIFBNX2dldFVuaXF1ZUlELAotICAgIFBNX2dldE1hY2hpbmVOYW1lLAotICAgIFZGX2F2YWlsYWJsZSwKLSAgICBWRl9pbml0LAotICAgIFZGX2V4aXQsCi0gICAgUE1fb3BlbkNvbnNvbGUsCi0gICAgUE1fZ2V0Q29uc29sZVN0YXRlU2l6ZSwKLSAgICBQTV9zYXZlQ29uc29sZVN0YXRlLAotICAgIFBNX3Jlc3RvcmVDb25zb2xlU3RhdGUsCi0gICAgUE1fY2xvc2VDb25zb2xlLAotICAgIFBNX3NldE9TQ3Vyc29yTG9jYXRpb24sCi0gICAgUE1fc2V0T1NTY3JlZW5XaWR0aCwKLSAgICBQTV9lbmFibGVXcml0ZUNvbWJpbmUsCi0gICAgUE1fYmFja3NsYXNoLAotICAgIFBNX2xvY2tEYXRhUGFnZXMsCi0gICAgUE1fdW5sb2NrRGF0YVBhZ2VzLAotICAgIFBNX2xvY2tDb2RlUGFnZXMsCi0gICAgUE1fdW5sb2NrQ29kZVBhZ2VzLAotICAgIFBNX3NldFJlYWxUaW1lQ2xvY2tIYW5kbGVyLAotICAgIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3ksCi0gICAgUE1fcmVzdG9yZVJlYWxUaW1lQ2xvY2tIYW5kbGVyLAotICAgIFBNX2RvQklPU1BPU1QsCi0gICAgUE1fZ2V0Qm9vdERyaXZlLAotICAgIFBNX2ZyZWVQaHlzaWNhbEFkZHIsCi0gICAgUE1faW5wYiwKLSAgICBQTV9pbnB3LAotICAgIFBNX2lucGQsCi0gICAgUE1fb3V0cGIsCi0gICAgUE1fb3V0cHcsCi0gICAgUE1fb3V0cGQsCi0gICAgTlVMTCwKLSAgICBQTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2ssCi0gICAgUE1faGF2ZUJJT1NBY2Nlc3MsCi0gICAgUE1fa2JoaXQsCi0gICAgUE1fZ2V0Y2gsCi0gICAgUE1fZmluZEJQRCwKLSAgICBQTV9nZXRQaHlzaWNhbEFkZHIsCi0gICAgUE1fc2xlZXAsCi0gICAgUE1fZ2V0Q09NUG9ydCwKLSAgICBQTV9nZXRMUFRQb3J0LAotICAgIFBNX2xvYWRMaWJyYXJ5LAotICAgIFBNX2dldFByb2NBZGRyZXNzLAotICAgIFBNX2ZyZWVMaWJyYXJ5LAotICAgIFBDSV9lbnVtZXJhdGUsCi0gICAgUENJX2FjY2Vzc1JlZywKLSAgICBQQ0lfc2V0SGFyZHdhcmVJUlEsCi0gICAgUENJX2dlbmVyYXRlU3BlY2lhbEN5bGUsCi0gICAgTlVMTCwKLSAgICBQQ0lCSU9TX2dldEVudHJ5LAotICAgIENQVV9nZXRQcm9jZXNzb3JUeXBlLAotICAgIENQVV9oYXZlTU1YLAotICAgIENQVV9oYXZlM0ROb3csCi0gICAgQ1BVX2hhdmVTU0UsCi0gICAgQ1BVX2hhdmVSRFRTQywKLSAgICBDUFVfZ2V0UHJvY2Vzc29yU3BlZWQsCi0gICAgWlRpbWVySW5pdCwKLSAgICBMWlRpbWVyT24sCi0gICAgTFpUaW1lckxhcCwKLSAgICBMWlRpbWVyT2ZmLAotICAgIExaVGltZXJDb3VudCwKLSAgICBMWlRpbWVyT25FeHQsCi0gICAgTFpUaW1lckxhcEV4dCwKLSAgICBMWlRpbWVyT2ZmRXh0LAotICAgIExaVGltZXJDb3VudEV4dCwKLSAgICBVTFpUaW1lck9uLAotICAgIFVMWlRpbWVyTGFwLAotICAgIFVMWlRpbWVyT2ZmLAotICAgIFVMWlRpbWVyQ291bnQsCi0gICAgVUxaUmVhZFRpbWUsCi0gICAgVUxaRWxhcHNlZFRpbWUsCi0gICAgVUxaVGltZXJSZXNvbHV0aW9uLAotICAgIFBNX2ZpbmRGaXJzdEZpbGUsCi0gICAgUE1fZmluZE5leHRGaWxlLAotICAgIFBNX2ZpbmRDbG9zZSwKLSAgICBQTV9tYWtlcGF0aCwKLSAgICBQTV9zcGxpdHBhdGgsCi0gICAgUE1fZHJpdmVWYWxpZCwKLSAgICBQTV9nZXRkY3dkLAotICAgIFBNX3NldEZpbGVBdHRyLAotICAgIFBNX21rZGlyLAotICAgIFBNX3JtZGlyLAotICAgIFBNX2dldEZpbGVBdHRyLAotICAgIFBNX2dldEZpbGVUaW1lLAotICAgIFBNX3NldEZpbGVUaW1lLAotICAgIENQVV9nZXRQcm9jZXNzb3JOYW1lLAotICAgIFBNX2dldFZHQVN0YXRlU2l6ZSwKLSAgICBQTV9zYXZlVkdBU3RhdGUsCi0gICAgUE1fcmVzdG9yZVZHQVN0YXRlLAotICAgIFBNX3ZnYUJsYW5rRGlzcGxheSwKLSAgICBQTV92Z2FVbmJsYW5rRGlzcGxheSwKLSAgICBQTV9ibG9ja1VudGlsVGltZW91dCwKLSAgICBfUE1fYWRkNjQsCi0gICAgX1BNX3N1YjY0LAotICAgIF9QTV9tdWw2NCwKLSAgICBfUE1fZGl2NjQsCi0gICAgX1BNX3NocjY0LAotICAgIF9QTV9zYXI2NCwKLSAgICBfUE1fc2hsNjQsCi0gICAgX1BNX25lZzY0LAotICAgIFBDSV9maW5kQkFSU2l6ZSwKLSAgICBQQ0lfcmVhZFJlZ0Jsb2NrLAotICAgIFBDSV93cml0ZVJlZ0Jsb2NrLAotICAgIFBNX2ZsdXNoVExCLAotICAgIFBNX3VzZUxvY2FsTWFsbG9jLAotICAgIFBNX21hbGxvYywKLSAgICBQTV9jYWxsb2MsCi0gICAgUE1fcmVhbGxvYywKLSAgICBQTV9mcmVlLAotICAgIFBNX2dldFBoeXNpY2FsQWRkclJhbmdlLAotICAgIFBNX2FsbG9jUGFnZSwKLSAgICBQTV9mcmVlUGFnZSwKLSAgICBQTV9hZ3BJbml0LAotICAgIFBNX2FncEV4aXQsCi0gICAgUE1fYWdwUmVzZXJ2ZVBoeXNpY2FsLAotICAgIFBNX2FncFJlbGVhc2VQaHlzaWNhbCwKLSAgICBQTV9hZ3BDb21taXRQaHlzaWNhbCwKLSAgICBQTV9hZ3BGcmVlUGh5c2ljYWwsCi0gICAgUENJX2dldE51bURldmljZXMsCi0gICAgUE1fc2V0TG9jYWxCUERQYXRoLAotI2lmZGVmIF9fV0lORE9XUzMyX18KLSAgICBQTV9sb2FkRGlyZWN0RHJhdywKLSAgICBQTV91bmxvYWREaXJlY3REcmF3LAotICAgIFBNX2dldERpcmVjdERyYXdXaW5kb3csCi0gICAgUE1fZG9TdXNwZW5kQXBwLAotI2Vsc2UKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotI2VuZGlmCi0gICAgfTsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9wbWludC5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3BtaW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNzZkYWQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3BtaW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgUmVhbCBtb2RlIGFuZCAxNi8zMiBiaXQgUHJvdGVjdGVkIE1vZGUKLSoKLSogRGVzY3JpcHRpb246ICBIZWFkZXIgZmlsZSBmb3IgdGhlIGludGVycnVwdCBoYW5kbGluZyBleHRlbnNpb25zIHRvIHRoZSBPUwotKiAgICAgICAgICAgICAgIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeS4gVGhlc2UgZXh0ZW5zaW9ucyBpbmNsdWRlcwotKiAgICAgICAgICAgICAgIHNpbXBsaWZpZWQgaW50ZXJydXB0IGhhbmRsaW5nLCBhbGxvd2luZyBhbGwgY29tbW9uIGludGVycnVwdAotKiAgICAgICAgICAgICAgIGhhbmRsZXJzIHRvIGJlIGhvb2tlZCBhbmQgaGFuZGxlZCBkaXJlY3RseSB3aXRoIG5vcm1hbCBDCi0qICAgICAgICAgICAgICAgZnVuY3Rpb25zLCBib3RoIGluIDE2IGJpdCBhbmQgMzIgYml0IG1vZGVzLiBOb3RlIGhvd2V2ZXIgdGhhdAotKiAgICAgICAgICAgICAgIHNpbXBsaWZpZWQgaGFuZGxpbmcgZG9lcyBub3QgbWVhbiBzbG93IHBlcmZvcm1hbmNlISBBbGwgbG93Ci0qICAgICAgICAgICAgICAgbGV2ZWwgaW50ZXJydXB0IGhhbmRsaW5nIGlzIGRvbmUgZWZmaWNpZW50bHkgaW4gYXNzZW1ibGVyCi0qICAgICAgICAgICAgICAgZm9yIHNwZWVkICh3ZWxsIGFjdHVhbGx5IG5lY2Vzc2FyeSB0byBpbnN1bGF0ZSB0aGUKLSogICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBmcm9tIHRoZSBsYWNrIG9mIGZhciBwb2ludGVycyBpbiAzMiBiaXQgUE0pLiBUaGUKLSogICAgICAgICAgICAgICBpbnRlcnJ1cHQgaGFuZGxlcnMgY3VycmVudGx5IHN1cHBvcnRlZCBhcmU6Ci0qCi0qICAgICAgICAgICAgICAgICAgIE1vdXNlICgweDMzIGNhbGxiYWNrKQotKiAgICAgICAgICAgICAgICAgICBUaW1lciBUaWNrICgweDgpCi0qICAgICAgICAgICAgICAgICAgIEtleWJvYXJkICgweDkgYW5kIDB4MTUpCi0qICAgICAgICAgICAgICAgICAgIENvbnRyb2wgQy9CcmVhayAoMHgyMy8weDFCKQotKiAgICAgICAgICAgICAgICAgICBDcml0aWNhbCBFcnJvciAoMHgyNCkKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19QTUlOVF9ICi0jZGVmaW5lIF9fUE1JTlRfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIFR5cGVkZWZzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgX19TTVgzMl9fCi0vKiBQQyBpbnRlcnJ1cHRzIChFbnN1cmUgY29uc2lzdGVudCB3aXRoIHBtZS5pbmMpICovCi0jZGVmaW5lIFBNX0lSUTAgICAgICAweDQwCi0jZGVmaW5lIFBNX0lSUTEgICAgICAoUE1fSVJRMCsxKQotI2RlZmluZSBQTV9JUlE2ICAgICAgKFBNX0lSUTArNikKLSNkZWZpbmUgUE1fSVJRMTQgICAgIChQTV9JUlEwKzE0KQotI2VuZGlmCi0KLS8qIERlZmluZSB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGludGVycnVwdCBoYW5kbGVycyB0aGF0IHdlIHN1cHBvcnQgICAgICovCi0KLXR5cGVkZWYgdWludCAgICAoUE1BUElQIFBNX2NyaXRpY2FsSGFuZGxlcikodWludCBheFZhbHVlLHVpbnQgZGlWYWx1ZSk7Ci10eXBlZGVmIHZvaWQgICAgKFBNQVBJUCBQTV9icmVha0hhbmRsZXIpKHVpbnQgYnJlYWtIaXQpOwotdHlwZWRlZiBzaG9ydCAgIChQTUFQSVAgUE1fa2V5MTVIYW5kbGVyKShzaG9ydCBzY2FuQ29kZSk7Ci10eXBlZGVmIHZvaWQgICAgKFBNQVBJUCBQTV9tb3VzZUhhbmRsZXIpKHVpbnQgZXZlbnQsIHVpbnQgYnV0c3RhdGUsaW50IHgsaW50IHksaW50IG1pY2tleVgsaW50IG1pY2tleVkpOwotCi0vKiBDcmVhdGUgYSB0eXBlIGZvciByZXByZXNlbnRpbmcgZmFyIHBvaW50ZXJzIGluIGJvdGggMTYgYW5kIDMyIGJpdAotICogcHJvdGVjdGVkIG1vZGUuCi0gKi8KLQotI2lmZGVmICBQTTM4NgotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGxvbmcgICAgb2ZmOwotICAgIHNob3J0ICAgc2VsOwotICAgIH0gUE1GQVJQVFI7Ci0jZGVmaW5lIFBNTlVMTCAgezAsMH0KLSNlbHNlCi10eXBlZGVmIHZvaWQgKlBNRkFSUFRSOwotI2RlZmluZSBQTU5VTEwgIE5VTEwKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbiBQcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgICAgICAgICAgICAvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLwotI2VuZGlmCi0KLS8qIFJvdXRpbmUgdG8gbG9hZCBzYXZlIGRlZmF1bHQgZGF0YSBzZWdtZW50IHNlbGVjdG9yIHZhbHVlIGludG8gYSBjb2RlCi0gKiBzZWdtZW50IHZhcmlhYmxlLCBhbmQgYW5vdGhlciB0byBsb2FkIHRoZSB2YWx1ZSBpbnRvIHRoZSBEUyByZWdpc3Rlci4KLSAqLwotCi12b2lkICAgIFBNQVBJIFBNX2xvYWREUyh2b2lkKTsKLXZvaWQgICAgUE1BUEkgUE1fc2F2ZURTKHZvaWQpOwotCi0vKiBSb3V0aW5lIHRvIGluc3RhbGwgYSBtb3VzZSBpbnRlcnJ1cHQgaGFuZGxpbmcgcm91dGluZS4gVGhlCi0gKiBtb3VzZSBoYW5kbGVyIHJvdXRpbmUgaXMgYSBub3JtYWwgQyBmdW5jdGlvbiwgYW5kIHRoZSBQTSBsaWJyYXJ5Ci0gKiB3aWxsIHRha2UgY2FyZSBvZiBwYXNzaW5nIHRoZSBjb3JyZWN0IHBhcmFtZXRlcnMgdG8gdGhlIGZ1bmN0aW9uLAotICogYW5kIHN3aXRjaGluZyB0byBhIGxvY2FsIHN0YWNrLgotICoKLSAqIE5vdGUgdGhhdCB5b3UgX211c3RfIGxvY2sgdGhlIG1lbW9yeSBjb250YWluaW5nIHRoZSBtb3VzZSBpbnRlcnJ1cHQKLSAqIGhhbmRsZXIgd2l0aCB0aGUgUE1fbG9ja1BhZ2VzKCkgZnVuY3Rpb24gb3RoZXJ3aXNlIHlvdSBtYXkgZW5jb3VudGVyCi0gKiBwcm9ibGVtcyBpbiB2aXJ0dWFsIG1lbW9yeSBlbnZpcm9ubWVudHMuCi0gKi8KLQotaW50ICAgICBQTUFQSSBQTV9zZXRNb3VzZUhhbmRsZXIoaW50IG1hc2ssUE1fbW91c2VIYW5kbGVyIG1oKTsKLXZvaWQgICAgUE1BUEkgUE1fcmVzdG9yZU1vdXNlSGFuZGxlcih2b2lkKTsKLQotLyogUm91dGluZSB0byByZXNldCB0aGUgbW91c2UgZHJpdmVyLCBhbmQgcmUtaW5zdGFsbCB0aGUgY3VycmVudAotICogbW91c2UgaW50ZXJydXB0IGhhbmRsZXIgaWYgb25lIHdhcyBjdXJyZW50bHkgaW5zdGFsbGVkIChzaW5jZSB0aGUKLSAqIG1vdXNlIHJlc2V0IHdpbGwgYXV0b21hdGljYWxseSByZW1vdmUgdGhpcyBoYW5kbGVyLgotICovCi0KLXZvaWQgICAgUE1BUEkgUE1fcmVzZXRNb3VzZURyaXZlcihpbnQgaGFyZFJlc2V0KTsKLQotLyogUm91dGluZSB0byByZXNldCB0aGUgbW91c2UgZHJpdmVyLCBhbmQgcmUtaW5zdGFsbCB0aGUgY3VycmVudAotICogbW91c2UgaW50ZXJydXB0IGhhbmRsZXIgaWYgb25lIHdhcyBjdXJyZW50bHkgaW5zdGFsbGVkIChzaW5jZSB0aGUKLSAqIG1vdXNlIHJlc2V0IHdpbGwgYXV0b21hdGljYWxseSByZW1vdmUgdGhpcyBoYW5kbGVyLgotICovCi0KLXZvaWQgICAgUE1BUEkgUE1fcmVzZXRNb3VzZURyaXZlcihpbnQgaGFyZFJlc2V0KTsKLQotLyogUm91dGluZXMgdG8gaW5zdGFsbCBhbmQgcmVtb3ZlIHRpbWVyIGludGVycnVwdCBoYW5kbGVycy4KLSAqCi0gKiBOb3RlIHRoYXQgeW91IF9tdXN0XyBsb2NrIHRoZSBtZW1vcnkgY29udGFpbmluZyB0aGUgaW50ZXJydXB0Ci0gKiBoYW5kbGVycyB3aXRoIHRoZSBQTV9sb2NrUGFnZXMoKSBmdW5jdGlvbiBvdGhlcndpc2UgeW91IG1heSBlbmNvdW50ZXIKLSAqIHByb2JsZW1zIGluIHZpcnR1YWwgbWVtb3J5IGVudmlyb25tZW50cy4KLSAqLwotCi12b2lkICAgIFBNQVBJIFBNX3NldFRpbWVySGFuZGxlcihQTV9pbnRIYW5kbGVyIGloKTsKLXZvaWQgICAgUE1BUEkgUE1fY2hhaW5QcmV2VGltZXIodm9pZCk7Ci12b2lkICAgIFBNQVBJIFBNX3Jlc3RvcmVUaW1lckhhbmRsZXIodm9pZCk7Ci0KLS8qIFJvdXRpbmVzIHRvIGluc3RhbGwgYW5kIGtleWJvYXJkIGludGVycnVwdCBoYW5kbGVycy4KLSAqCi0gKiBOb3RlIHRoYXQgeW91IF9tdXN0XyBsb2NrIHRoZSBtZW1vcnkgY29udGFpbmluZyB0aGUgaW50ZXJydXB0Ci0gKiBoYW5kbGVycyB3aXRoIHRoZSBQTV9sb2NrUGFnZXMoKSBmdW5jdGlvbiBvdGhlcndpc2UgeW91IG1heSBlbmNvdW50ZXIKLSAqIHByb2JsZW1zIGluIHZpcnR1YWwgbWVtb3J5IGVudmlyb25tZW50cy4KLSAqLwotCi12b2lkICAgIFBNQVBJIFBNX3NldEtleUhhbmRsZXIoUE1faW50SGFuZGxlciBpaCk7Ci12b2lkICAgIFBNQVBJIFBNX2NoYWluUHJldktleSh2b2lkKTsKLXZvaWQgICAgUE1BUEkgUE1fcmVzdG9yZUtleUhhbmRsZXIodm9pZCk7Ci0KLS8qIFJvdXRpbmVzIHRvIGhvb2sgYW5kIHVuaG9vayB0aGUgYWx0ZXJuYXRlIEludCAxNWgga2V5Ym9hcmQgaW50ZXJjZXB0Ci0gKiBjYWxsb3V0IHJvdXRpbmUuIFlvdXIgZXZlbnQgaGFuZGxlciB3aWxsIG5lZWQgdG8gcmV0dXJuIHRoZSBmb2xsb3dpbmc6Ci0gKgotICogIHNjYW5Db2RlICAgIC0gTGV0IHRoZSBCSU9TIHByb2Nlc3Mgc2NhbiBjb2RlIChjaGFpbnMgdG8gcHJldmlvdXMgaGFuZGxlcikKLSAqICAwICAgICAgICAgICAtIFlvdSBoYXZlIHByb2Nlc3NlZCB0aGUgc2NhbiBjb2RlIHNvIGZsdXNoIGZyb20gQklPUwotICoKLSAqIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCBhdmFpbGFibGUgdW5kZXIgYWxsIERPUyBleHRlbmRlcnMsIGJ1dCBkb2VzCi0gKiB3b3JrIHVuZGVyIHJlYWwgbW9kZSwgRE9TNEdXIGFuZCBYMzItVk0uIEl0IGRvZXMgbm90IHdvcmsgdW5kZXIgdGhlCi0gKiBQb3dlclBhY2sgMzIgYml0IERPUyBleHRlbmRlcnMuIElmIHlvdSBmaWd1cmUgb3V0IGhvdyB0byBkbyBpdCBsZXQgdXMga25vdyEKLSAqLwotCi12b2lkICAgIFBNQVBJIFBNX3NldEtleTE1SGFuZGxlcihQTV9rZXkxNUhhbmRsZXIgaWgpOwotdm9pZCAgICBQTUFQSSBQTV9yZXN0b3JlS2V5MTVIYW5kbGVyKHZvaWQpOwotCi0vKiBSb3V0aW5lcyB0byBpbnN0YWxsIGFuZCByZW1vdmUgdGhlIGNvbnRyb2wgYy9icmVhayBpbnRlcnJ1cHQgaGFuZGxlcnMuCi0gKiBJbnRlcnJ1cHQgaGFuZGxpbmcgaXMgcGVyZm9ybWVkIGJ5IHRoZSBQTS9Qcm8gbGlicmFyeSwgYW5kIHlvdSBjYW4gY2FsbAotICogdGhlIHN1cHBsaWVkIHJvdXRpbmVzIHRvIHRlc3QgdGhlIHN0YXR1cyBvZiB0aGUgQ3RybC1DIGFuZCBDdHJsLUJyZWFrCi0gKiBmbGFncy4gSWYgeW91IHBhc3MgdGhlIHZhbHVlIFRSVUUgZm9yICdjbGVhckZsYWcnIHRvIHRoZXNlIHJvdXRpbmVzLAotICogdGhlIGludGVybmFsIGZsYWdzIHdpbGwgYmUgcmVzZXQgaW4gb3JkZXIgdG8gY2F0Y2ggYW5vdGhlciBDdHJsLUMgb3IKLSAqIEN0cmwtQnJlYWsgaW50ZXJydXB0LgotICovCi0KLXZvaWQgICAgUE1BUEkgUE1faW5zdGFsbEJyZWFrSGFuZGxlcih2b2lkKTsKLWludCAgICAgUE1BUEkgUE1fY3RybENIaXQoaW50IGNsZWFyRmxhZyk7Ci1pbnQgICAgIFBNQVBJIFBNX2N0cmxCcmVha0hpdChpbnQgY2xlYXJGbGFnKTsKLXZvaWQgICAgUE1BUEkgUE1fcmVzdG9yZUJyZWFrSGFuZGxlcih2b2lkKTsKLQotLyogUm91dGluZSB0byBpbnN0YWxsIGFuIGFsdGVybmF0ZSBicmVhayBoYW5kbGVyIHRoYXQgd2lsbCBjYWxsIHlvdXIKLSAqIGNvZGUgZGlyZWN0bHkuIFRoaXMgaXMgbm90IGF2YWlsYWJsZSB1bmRlciBhbGwgRE9TIGV4dGVuZGVycywgYnV0IGRvZXMKLSAqIHdvcmsgdW5kZXIgcmVhbCBtb2RlLCBET1M0R1cgYW5kIFgzMi1WTS4gSXQgZG9lcyBub3Qgd29yayB1bmRlciB0aGUKLSAqIFBvd2VyUGFjayAzMiBiaXQgRE9TIGV4dGVuZGVycy4gSWYgeW91IGZpZ3VyZSBvdXQgaG93IHRvIGRvIGl0IGxldCB1cyBrbm93IQotICoKLSAqIE5vdGUgdGhhdCB5b3Ugc2hvdWxkIGVpdGhlciBpbnN0YWxsIG9uZSBvciB0aGUgb3RoZXIsIGJ1dCBub3QgYm90aCEKLSAqLwotCi12b2lkICAgIFBNQVBJIFBNX2luc3RhbGxBbHRCcmVha0hhbmRsZXIoUE1fYnJlYWtIYW5kbGVyIGJoKTsKLQotLyogUm91dGluZXMgdG8gaW5zdGFsbCBhbmQgcmVtb3ZlIHRoZSBjcml0aWNhbCBlcnJvciBoYW5kbGVyLiBUaGUgaW50ZXJydXB0Ci0gKiBpcyBoYW5kbGVkIGJ5IHRoZSBQTS9Qcm8gbGlicmFyeSwgYW5kIHRoZSBvcGVyYXRpb24gd2lsbCBhbHdheXMgYmUgZmFpbGVkLgotICogWW91IGNhbiBjaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBjcml0aWNhbCBlcnJvciBoYW5kbGVyIHdpdGggdGhlCi0gKiBhcHByb3ByaWF0ZSBmdW5jdGlvbi4gSWYgeW91IHBhc3MgdGhlIHZhbHVlIFRSVUUgZm9yICdjbGVhckZsYWcnLCB0aGUKLSAqIGludGVybmFsIGZsYWcgd2lsbCBiZSByZXNldCByZWFkeSB0byBjYXRjaCBhbm90aGVyIGNyaXRpY2FsIGVycm9yLgotICovCi0KLXZvaWQgICAgUE1BUEkgUE1faW5zdGFsbENyaXRpY2FsSGFuZGxlcih2b2lkKTsKLWludCAgICAgUE1BUEkgUE1fY3JpdGljYWxFcnJvcihpbnQgKmF4VmFsdWUsIGludCAqZGlWYWx1ZSwgaW50IGNsZWFyRmxhZyk7Ci12b2lkICAgIFBNQVBJIFBNX3Jlc3RvcmVDcml0aWNhbEhhbmRsZXIodm9pZCk7Ci0KLS8qIFJvdXRpbmUgdG8gaW5zdGFsbCBhbiBhbHRlcm5hdGUgY3JpdGljYWwgaGFuZGxlciB0aGF0IHdpbGwgY2FsbCB5b3VyCi0gKiBjb2RlIGRpcmVjdGx5LiBUaGlzIGlzIG5vdCBhdmFpbGFibGUgdW5kZXIgYWxsIERPUyBleHRlbmRlcnMsIGJ1dCBkb2VzCi0gKiB3b3JrIHVuZGVyIHJlYWwgbW9kZSwgRE9TNEdXIGFuZCBYMzItVk0uIEl0IGRvZXMgbm90IHdvcmsgdW5kZXIgdGhlCi0gKiBQb3dlclBhY2sgMzIgYml0IERPUyBleHRlbmRlcnMuIElmIHlvdSBmaWd1cmUgb3V0IGhvdyB0byBkbyBpdCBsZXQgdXMga25vdyEKLSAqCi0gKiBOb3RlIHRoYXQgeW91IHNob3VsZCBlaXRoZXIgaW5zdGFsbCBvbmUgb3IgdGhlIG90aGVyLCBidXQgbm90IGJvdGghCi0gKi8KLQotdm9pZCAgICBQTUFQSSBQTV9pbnN0YWxsQWx0Q3JpdGljYWxIYW5kbGVyKFBNX2NyaXRpY2FsSGFuZGxlcik7Ci0KLS8qIEZ1bmN0aW9ucyB0byBtYW5hZ2UgcHJvdGVjdGVkIG1vZGUgb25seSBpbnRlcnJ1cHQgaGFuZGxlcnMgKi8KLQotdm9pZCAgICBQTUFQSSBQTV9nZXRQTXZlY3QoaW50IGludG5vLCBQTUZBUlBUUiAqaXNyKTsKLXZvaWQgICAgUE1BUEkgUE1fc2V0UE12ZWN0KGludCBpbnRubywgUE1faW50SGFuZGxlciBpaCk7Ci12b2lkICAgIFBNQVBJIFBNX3Jlc3RvcmVQTXZlY3QoaW50IGludG5vLCBQTUZBUlBUUiBpc3IpOwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi19ICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKyAgICovCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fUE1JTlRfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3NjaXRlY2guaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9zY2l0ZWNoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNWVlZTkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3NjaXRlY2guaAorKysgL2Rldi9udWxsCkBAIC0xLDcxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgYW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgR2VuZXJhbCBoZWFkZXIgZmlsZSBmb3Igb3BlcmF0aW5nIHN5c3RlbSBwb3J0YWJsZSBjb2RlLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX1NDSVRFQ0hfSAotI2RlZmluZSBfX1NDSVRFQ0hfSAotCi0vKiBXZSBoYXZlIHRoZSBmb2xsb3dpbmcgZGVmaW5lcyB0byBpZGVudGlmeSB0aGUgY29tcGlsYXRpb24gZW52aXJvbm1lbnQ6Ci0gKgotICogIF9fMTZCSVRfXyAgICAgICBDb21waWxpbmcgZm9yIDE2IGJpdCBjb2RlIChhbnkgZW52aXJvbm1lbnQpCi0gKiAgX18zMkJJVF9fICAgICAgIENvbXBpbGluZyBmb3IgMzIgYml0IGNvZGUgKGFueSBlbnZpcm9ubWVudCkKLSAqICBfX01TRE9TX18gICAgICAgQ29tcGlsaW5nIGZvciBNUy1ET1MgKGluY2x1ZGVzIF9fV0lORE9XUzE2X18sIF9fV0lOMzg2X18pCi0gKiAgX19SRUFMRE9TX18gICAgIENvbXBpbGluZyBmb3IgTVMtRE9TIChleGNsdWRlcyBfX1dJTkRPV1MxNl9fKQotICogIF9fTVNET1MxNl9fICAgICBDb21waWxpbmcgZm9yIDE2IGJpdCBNUy1ET1MKLSAqICBfX01TRE9TMzJfXyAgICAgQ29tcGlsaW5nIGZvciAzMiBiaXQgTVMtRE9TCi0gKiAgX19XSU5ET1dTX18gICAgIENvbXBpbGluZyBmb3IgV2luZG93cwotICogIF9fV0lORE9XUzE2X18gICBDb21waWxpbmcgZm9yIDE2IGJpdCBXaW5kb3dzIChfX01TRE9TX18gYWxzbyBkZWZpbmVkKQotICogIF9fV0lORE9XUzMyX18gICBDb21waWxpbmcgZm9yIDMyIGJpdCBXaW5kb3dzCi0gKiAgX19XSU4zMl9WWERfXyAgIENvbXBpbGluZyBmb3IgYSAzMi1iaXQgQyBiYXNlZCBWeEQKLSAqICBfX05UX0RSSVZFUl9fICAgQ29tcGlsaW5nIGZvciBhIDMyLWJpdCBDIGJhc2VkIE5UIGRldmljZSBkcml2ZXIKLSAqICBfX09TMl9fICAgICAgICAgQ29tcGlsaW5nIGZvciBPUy8yCi0gKiAgX19PUzJfMTZfXyAgICAgIENvbXBpbGluZyBmb3IgMTYgYml0IE9TLzIKLSAqICBfX09TMl8zMl9fICAgICAgQ29tcGlsaW5nIGZvciAzMiBiaXQgT1MvMgotICogIF9fVU5JWF9fICAgICAgICBDb21waWxpbmcgZm9yIFVuaXgKLSAqICBfX1FOWF9fICAgICAgICAgQ29tcGlsaW5nIGZvciB0aGUgUU5YIHJlYWx0aW1lIE9TIChVbml4IGNvbXBhdGlibGUpCi0gKiAgX19MSU5VWF9fICAgICAgIENvbXBpbGluZyBmb3IgdGhlIExpbnV4IE9TIChVbml4IGNvbXBhdGlibGUpCi0gKiAgX19GUkVFQlNEX18gICAgIENvbXBpbGluZyBmb3IgdGhlIEZyZWVCU0QgT1MgKFVuaXggY29tcGF0aWJsZSkKLSAqICBfX0JFT1NfXyAgICAgICAgQ29tcGlsaW5nIGZvciB0aGUgQmVPUyAoVW5peCBjb21wYXRpYmxlKQotICogIF9fU01YMzJfXyAgICAgICBDb21waWxpbmcgZm9yIHRoZSBTTVggMzItYml0IFJlYWwgVGltZSBPUwotICogIF9fRU5FQV9PU0VfXyAgICBDb21waWxpbmcgZm9yIHRoZSBPU0UgZW1iZWRkZWQgT1MKLSAqICBfX1JUVEFSR0VUX18gICAgQ29tcGlsaW5nIGZvciB0aGUgUlRUYXJnZXQgMzItYml0IGVtYmVkZGVkIE9TCi0gKiAgX19NQUNPU19fICAgICAgIENvbXBpbGluZyBmb3IgdGhlIE1hY09TIHBsYXRmb3JtIChQb3dlclBDKQotICogIF9fRFJJVkVSX18gICAgICBDb21waWxpbmcgZm9yIGEgMzItYml0IGJpbmFyeSBjb21wYXRpYmxlIGRyaXZlcgotICogIF9fQ09OU09MRV9fICAgICBDb21waWxpbmcgZm9yIGEgZnVsbHNjcmVlbiBPUyBjb25zb2xlIG1vZGUKLSAqICBfX1NOQVBfXyAgICAgICAgQ29tcGlsaW5nIGFzIGEgU25hcCBleGVjdXRlYWJsZSBvciBkeW5hbWljIGxpYnJhcnkKLSAqCi0gKiAgX19JTlRFTF9fICAgICAgIENvbXBpbGluZyBmb3IgSW50ZWwgQ1BVJ3MKLSAqICBfX0FMUEhBX18gICAgICAgQ29tcGlsaW5nIGZvciBERUMgQWxwaGEgQ1BVJ3MKLSAqICBfX01JUFNfXyAgICAgICAgQ29tcGlsaW5nIGZvciBNSVBTIENQVSdzCi0gKiAgX19QUENfXyAgICAgICAgIENvbXBpbGluZyBmb3IgUG93ZXJQQyBDUFUncwotICogIF9fTUM2OEtfXyAgICAgICBDb21waWxpbmcgZm9yIE1vdG9yb2xhIDY4MHgwCi0gKgotICogIF9fQklHX0VORElBTl9fICBDb21waWxpbmcgZm9yIGEgYmlnIGVuZGlhbiBwcm9jZXNzb3IKLSAqCi0gKi8KLQotI2lmZGVmICBfX1NDX18KLSNpZiAgICAgX19JTlRTSVpFID09IDQKLSNkZWZpbmUgX19TQzM4Nl9fCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBEZXRlcm1pbmUgc29tZSB0aGluZ3MgdGhhdCBhcmUgY29tcGlsZXIgc3BlY2lmaWMgKi8KLQotI2lmZGVmICBfX0dOVUNfXwotI2lmZGVmICBfX2NwbHVzcGx1cwotLyogRysrIGN1cnJlbnRseSBmdWNrcyB0aGlzIHVwISAqLwotI2RlZmluZSBfX2NkZWNsCi0jZGVmaW5lIF9fc3RkY2FsbAotI2Vsc2UKLSN1bmRlZiAgX19jZGVjbAotI3VuZGVmICBfX3N0ZGNhbGwKLSNkZWZpbmUgX19jZGVjbCAgICAgX19hdHRyaWJ1dGVfXyAoKGNkZWNsKSkKLSNkZWZpbmUgX19zdGRjYWxsICAgX19hdHRyaWJ1dGVfXyAoKHN0ZGNhbGwpKQotI2VuZGlmCi0jZGVmaW5lIF9fRkxBVF9fICAgICAgICAgICAgLyogR0NDIGlzIGFsd2F5cyAzMiBiaXQgZmxhdCBtb2RlbCAgICAgICAgICAqLwotI2RlZmluZSBfX0hBU19CT09MX18gICAgICAgIC8qIExhdGVzdCBHTlUgQysrIGhhcyBpYm9vbCB0eXBlICAgICAgICAgICAgKi8KLSNkZWZpbmUgX19IQVNfTE9OR19MT05HX18gICAvKiBHTlUgQyBzdXBwb3J0cyBsb25nIGxvbmcgdHlwZSAgICAgICAgICAgICovCi0jaW5jbHVkZSA8c3RkaW8uaD4gICAgICAgICAgLyogQnJpbmcgaW4gZm9yIGRlZmluaXRpb24gb2YgTlVMTCAgICAgICAgICAqLwotI2VuZGlmCi0KLSNpZmRlZiAgX19CT1JMQU5EQ19fCi0jaWYgKF9fQk9STEFORENfXyA+PSAweDUwMCkgfHwgZGVmaW5lZChDTEFTU0xJQl9ERUZTX0gpCi0jZGVmaW5lIF9fSEFTX0JPT0xfXyAgICAgICAgLyogQm9ybGFuZCBDKysgNS4wIGRlZmluZXMgaWJvb2wgdHlwZSAgICAgICAqLwotI2VuZGlmCi0jaWYgKF9fQk9STEFORENfXyA+PSAweDUwMikgJiYgIWRlZmluZWQoVlRPT0xTRCkgJiYgIWRlZmluZWQoX19TTVgzMl9fKQotI2RlZmluZSBfX0hBU19JTlQ2NF9fICAgICAgIC8qIEJvcmxhbmQgQysrIDUuMDIgc3VwcG9ydHMgX19pbnQ2NCB0eXBlICAgKi8KLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfX1NDX18pICYmICFkZWZpbmVkKFZUT09MU0QpICYmICFkZWZpbmVkKF9fU01YMzJfXykKLSNkZWZpbmUgX19IQVNfSU5UNjRfXyAgICAgICAvKiBWaXN1YWwgQysrIHN1cHBvcnRzIF9faW50NjQgdHlwZSAgICAgICAgICovCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19XQVRDT01DX18pICYmIChfX1dBVENPTUNfXyA+PSAxMTAwKSAmJiAhZGVmaW5lZChWVE9PTFNEKSAmJiAhZGVmaW5lZChfX1NNWDMyX18pCi0jZGVmaW5lIF9fSEFTX0lOVDY0X18gICAgICAgLyogV2F0Y29tIEMrKyAxMS4wIHN1cHBvcnRzIF9faW50NjQgdHlwZSAgICAqLwotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBEZXRlcm1pbmUgdGhlIGNvbXBpbGUgdGltZSBlbnZpcm9ubWVudC4gVGhpcyBtdXN0IGJlIGRvbmUgZm9yIGVhY2gKLSAqIHN1cHBvcnRlZCBwbGF0Zm9ybSBzbyB0aGF0IHdlIGNhbiBkZXRlcm1pbmUgYXQgY29tcGlsZSB0aW1lIHRoZSB0YXJnZXQKLSAqIGVudmlyb25tZW50LCBob3BlZnVsbHkgd2l0aG91dCByZXF1aXJpbmcgI2RlZmluZSdzIGZyb20gdGhlIHVzZXIuCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiAzMi1iaXQgYmluYXJ5IGNvbXBhdGlibGUgZHJpdmVyLiBDb21waWxlZCBhcyBXaW4zMiwgYnV0IGFzIE9TIG5ldXRyYWwgKi8KLSNpZmRlZiAgX19EUklWRVJfXwotI2lmbmRlZiBfXzMyQklUX18KLSNkZWZpbmUgX18zMkJJVF9fCi0jZW5kaWYKLSN1bmRlZiAgX19XSU5ET1dTX18KLSN1bmRlZiAgX1dJTjMyCi0jdW5kZWYgIF9fV0lOMzJfXwotI3VuZGVmICBfX05UX18KLQotLyogMzItYml0IFNuYXAgZXhlIG9yIGRsbC4gQ29tcGlsZWQgYXMgV2luMzIsIGJ1dCBhcyBPUyBuZXV0cmFsICovCi0jZWxpZiAgIGRlZmluZWQoX19TTkFQX18pCi0jaWZuZGVmIF9fMzJCSVRfXwotI2RlZmluZSBfXzMyQklUX18KLSNlbmRpZgotI3VuZGVmICBfX1dJTkRPV1NfXwotI3VuZGVmICBfV0lOMzIKLSN1bmRlZiAgX19XSU4zMl9fCi0jdW5kZWYgIF9fTlRfXwotCi0vKiAzMi1iaXQgV2luZG93cyBWeEQgY29tcGlsZSBlbnZpcm9ubWVudCAqLwotI2VsaWYgICBkZWZpbmVkKF9fdnRvb2xzZF9oXykgfHwgZGVmaW5lZChWVE9PTFNEKQotI2luY2x1ZGUgPHZ0b29sc2MuaD4KLSNkZWZpbmUgX19XSU4zMl9WWERfXwotI2lmbmRlZiBfXzMyQklUX18KLSNkZWZpbmUgX18zMkJJVF9fCi0jZW5kaWYKLSNkZWZpbmUgX01BWF9QQVRIICAgMjU2Ci0jdW5kZWYgX19XSU5ET1dTMzJfXwotCi0vKiAzMi1iaXQgV2luZG93cyBOVCBkcml2ZXIgY29tcGlsZSBlbnZpcm9ubWVudDogVE9ETyEhICovCi0jZWxpZiAgIGRlZmluZWQoX19OVF9EUklWRVJfXykKLSNpbmNsdWRlICJudGRyaXZlci5oIgotI2lmbmRlZiBfXzMyQklUX18KLSNkZWZpbmUgX18zMkJJVF9fCi0jZW5kaWYKLSNkZWZpbmUgX01BWF9QQVRIICAgMjU2Ci0jdW5kZWYgX19XSU5ET1dTMzJfXwotCi0vKiAzMi1iaXQgU01YIGNvbXBpbGUgZW52aXJvbm1lbnQgKi8KLSNlbGlmICAgZGVmaW5lZChfX1NNWDMyX18pCi0jaWZuZGVmIF9fTVNET1NfXwotI2RlZmluZSBfX01TRE9TX18KLSNlbmRpZgotI2lmbmRlZiBfXzMyQklUX18KLSNkZWZpbmUgX18zMkJJVF9fCi0jZW5kaWYKLSNpZm5kZWYgX19DT05TT0xFX18KLSNkZWZpbmUgX19DT05TT0xFX18KLSNlbmRpZgotCi0vKiAzMi1iaXQgRW5lYSBPU0UgZW52aXJvbm1lbnQgKi8KLSNlbGlmICAgZGVmaW5lZChfX0VORUFfT1NFX18pCi0jaWZuZGVmIF9fMzJCSVRfXwotI2RlZmluZSBfXzMyQklUX18KLSNlbmRpZgotI2lmbmRlZiBfX0NPTlNPTEVfXwotI2RlZmluZSBfX0NPTlNPTEVfXwotI2VuZGlmCi0KLS8qIDMyLWJpdCBSVFRhcmdldC0zMiBlbnZpcm9ubWVudCAqLwotI2VsaWYgICBkZWZpbmVkKF9fUlRUQVJHRVRfXykKLSNpZm5kZWYgX18zMkJJVF9fCi0jZGVmaW5lIF9fMzJCSVRfXwotI2VuZGlmCi0jaWZuZGVmIF9fQ09OU09MRV9fCi0jZGVmaW5lIF9fQ09OU09MRV9fCi0jZW5kaWYKLQotLyogMzItYml0IGV4dGVuZGVkIERPUyBjb21waWxlIGVudmlyb25tZW50ICovCi0jZWxpZiAgIGRlZmluZWQoX19NU0RPU19fKSB8fCBkZWZpbmVkKF9fTVNET1MzMl9fKSB8fCBkZWZpbmVkKF9fRE9TX18pIHx8IGRlZmluZWQoX19EUE1JMzJfXykgfHwgKGRlZmluZWQoTV9JODYpICYmICghZGVmaW5lZChfX1NDMzg2X18pICYmICFkZWZpbmVkKE1fSTM4NikpKSB8fCBkZWZpbmVkKFROVCkKLSNpZm5kZWYgX19NU0RPU19fCi0jZGVmaW5lIF9fTVNET1NfXwotI2VuZGlmCi0jaWYgICAgIGRlZmluZWQoX19NU0RPUzMyX18pIHx8IGRlZmluZWQoX18zODZfXykgfHwgZGVmaW5lZChfX0ZMQVRfXykgfHwgZGVmaW5lZChfX05UX18pIHx8IGRlZmluZWQoX19TQzM4Nl9fKQotI2lmbmRlZiBfX01TRE9TMzJfXwotI2RlZmluZSBfX01TRE9TMzJfXwotI2VuZGlmCi0jaWZuZGVmIF9fMzJCSVRfXwotI2RlZmluZSBfXzMyQklUX18KLSNlbmRpZgotI2lmbmRlZiBfX1JFQUxET1NfXwotI2RlZmluZSBfX1JFQUxET1NfXwotI2VuZGlmCi0jaWZuZGVmIF9fQ09OU09MRV9fCi0jZGVmaW5lIF9fQ09OU09MRV9fCi0jZW5kaWYKLQotLyogMTYtYml0IFdpbmRvd3MgY29tcGlsZSBlbnZpcm9ubWVudCAqLwotI2VsaWYgICAoZGVmaW5lZChfV2luZG93cykgfHwgZGVmaW5lZChfV0lORE9XUykpICYmICFkZWZpbmVkKF9fRFBNSTE2X18pCi0jaWZuZGVmIF9fMTZCSVRfXwotI2RlZmluZSBfXzE2QklUX18KLSNlbmRpZgotI2lmbmRlZiBfX1dJTkRPV1MxNl9fCi0jZGVmaW5lIF9fV0lORE9XUzE2X18KLSNlbmRpZgotI2lmbmRlZiBfX1dJTkRPV1NfXwotI2RlZmluZSBfX1dJTkRPV1NfXwotI2VuZGlmCi0jaWZuZGVmIF9fTVNET1NfXwotI2RlZmluZSBfX01TRE9TX18KLSNlbmRpZgotCi0vKiAxNi1iaXQgRE9TIGNvbXBpbGUgZW52aXJvbm1lbnQgKi8KLSNlbHNlCi0jaWZuZGVmIF9fMTZCSVRfXwotI2RlZmluZSBfXzE2QklUX18KLSNlbmRpZgotI2lmbmRlZiBfX01TRE9TMTZfXwotI2RlZmluZSBfX01TRE9TMTZfXwotI2VuZGlmCi0jaWZuZGVmIF9fUkVBTERPU19fCi0jZGVmaW5lIF9fUkVBTERPU19fCi0jZW5kaWYKLSNpZm5kZWYgX19DT05TT0xFX18KLSNkZWZpbmUgX19DT05TT0xFX18KLSNlbmRpZgotI2VuZGlmCi0KLS8qIDMyLWJpdCBXaW5kb3dzIGNvbXBpbGUgZW52aXJvbm1lbnQgKi8KLSNlbGlmICAgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVkKF9fTlRfXykKLSNpZm5kZWYgX18zMkJJVF9fCi0jZGVmaW5lIF9fMzJCSVRfXwotI2VuZGlmCi0jaWZuZGVmIF9fV0lORE9XUzMyX18KLSNkZWZpbmUgX19XSU5ET1dTMzJfXwotI2VuZGlmCi0jaWZuZGVmIF9XSU4zMgotI2RlZmluZSBfV0lOMzIgICAgICAgICAgICAgICAgICAvKiBNaWNyb3NvZnQgV2luMzIgU0RLIGhlYWRlcnMgdXNlIF9XSU4zMiAqLwotI2VuZGlmCi0jaWZuZGVmIFdJTjMyCi0jZGVmaW5lIFdJTjMyICAgICAgICAgICAgICAgICAgIC8qIE9wZW5HTCBoZWFkZXJzIHVzZSBXSU4zMiAqLwotI2VuZGlmCi0jaWZuZGVmIF9fV0lORE9XU19fCi0jZGVmaW5lIF9fV0lORE9XU19fCi0jZW5kaWYKLQotLyogMzItYml0IE9TLzIgVkREIGNvbXBpbGUgZW52aXJvbm1lbnQgKi8KLS8qIFdlJ3JlIGFzc3VtaW5nIChmb3Igbm93KSB0aGF0IENMMzg2IG11c3QgYmUgdXNlZCAqLwotI2VsaWYgICBkZWZpbmVkKE1TRE9TKSAmJiBkZWZpbmVkKE1fSTM4NikKLS8qIGZpeGVzIG5lY2Vzc2FyeSB0byBjb21waWxlIHdpdGggQ0wzODYgKi8KLSNkZWZpbmUgX19jZGVjbCAgX2NkZWNsCi10eXBlZGVmIHVuc2lnbmVkIGludCBzaXplX3Q7Ci0KLSNpbmNsdWRlIDxtdmRtLmg+Ci0KLS8qIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIHNvbWV3aGVyZSBlbHNlLi4uICAgICAgICAgICAgICAgICAqLwotLyogSW5saW5lIGVsaWdpYmxlIGZ1bmN0aW9ucyAod2UgaGF2ZSBubyBDUlQgbGlicyBmb3IgQ0wzODYpICovCi0jcHJhZ21hIGludHJpbnNpYyAoc3RyY3B5LCBzdHJjbXAsIHN0cmxlbiwgc3RyY2F0KQotI3ByYWdtYSBpbnRyaW5zaWMgKG1lbWNtcCwgbWVtY3B5LCBtZW1zZXQpCi0KLSNkZWZpbmUgX19PUzJfVkREX18KLSNpZm5kZWYgX18zMkJJVF9fCi0jZGVmaW5lIF9fMzJCSVRfXwotI2VuZGlmCi0jZGVmaW5lIENDSE1BWFBBVEggIDI1NgotI2RlZmluZSBfTUFYX1BBVEggICAyNTYKLSNpZm5kZWYgX19PUzJfXwotI2RlZmluZSBfX09TMl9fCi0jZW5kaWYKLSNpZm5kZWYgX19PUzJfMzJfXwotI2RlZmluZSBfX09TMl8zMl9fCi0jZW5kaWYKLQotLyogMTYtYml0IE9TLzIgY29tcGlsZSBlbnZpcm9ubWVudCAqLwotI2VsaWYgICBkZWZpbmVkKF9fT1MyXzE2X18pCi0jaWZuZGVmIF9fT1MyX18KLSNkZWZpbmUgX19PUzJfXwotI2VuZGlmCi0jaWZuZGVmIF9fMTZCSVRfXwotI2RlZmluZSBfXzE2QklUX18KLSNlbmRpZgotI2lmbmRlZiBfX09TMl9QTV9fCi0jaWZuZGVmIF9fQ09OU09MRV9fCi0jZGVmaW5lIF9fQ09OU09MRV9fCi0jZW5kaWYKLSNlbmRpZgotCi0vKiAzMi1iaXQgT1MvMiBjb21waWxlIGVudmlyb25tZW50ICovCi0jZWxpZiAgIGRlZmluZWQoX19PUzJfXykgfHwgZGVmaW5lZChfX09TMl8zMl9fKQotI2lmbmRlZiBfX09TMl9fCi0jZGVmaW5lIF9fT1MyX18KLSNlbmRpZgotI2lmbmRlZiBfX09TMl8zMl9fCi0jZGVmaW5lIF9fT1MyXzMyX18KLSNlbmRpZgotI2lmbmRlZiBfXzMyQklUX18KLSNkZWZpbmUgX18zMkJJVF9fCi0jZW5kaWYKLSNpZm5kZWYgX19PUzJfUE1fXwotI2lmbmRlZiBfX0NPTlNPTEVfXwotI2RlZmluZSBfX0NPTlNPTEVfXwotI2VuZGlmCi0jZW5kaWYKLQotLyogMzItYml0IFFOWCBjb21waWxlIGVudmlyb25tZW50ICovCi0jZWxpZiAgIGRlZmluZWQoX19RTlhfXykKLSNpZm5kZWYgX18zMkJJVF9fCi0jZGVmaW5lIF9fMzJCSVRfXwotI2VuZGlmCi0jaWZuZGVmIF9fVU5JWF9fCi0jZGVmaW5lIF9fVU5JWF9fCi0jZW5kaWYKLSNpZmRlZiAgX19HTlVDX18KLSNkZWZpbmUgc3RyaWNtcCBzdHJjYXNlY21wCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChfX1BIT1RPTl9fKSAmJiAhZGVmaW5lZChfX1gxMV9fKQotI2lmbmRlZiBfX0NPTlNPTEVfXwotI2RlZmluZSBfX0NPTlNPTEVfXwotI2VuZGlmCi0jZW5kaWYKLQotLyogMzItYml0IExpbnV4IGNvbXBpbGUgZW52aXJvbm1lbnQgKi8KLSNlbGlmICAgZGVmaW5lZChfX0xJTlVYX18pIHx8IGRlZmluZWQobGludXgpCi0jaWZuZGVmIF9fTElOVVhfXwotI2RlZmluZSBfX0xJTlVYX18KLSNlbmRpZgotI2lmbmRlZiBfXzMyQklUX18KLSNkZWZpbmUgX18zMkJJVF9fCi0jZW5kaWYKLSNpZm5kZWYgX19VTklYX18KLSNkZWZpbmUgX19VTklYX18KLSNlbmRpZgotI2lmZGVmICBfX0dOVUNfXwotI2RlZmluZSBzdHJpY21wIHN0cmNhc2VjbXAKLSNlbmRpZgotI2lmbmRlZiBfX1gxMV9fCi0jaWZuZGVmIF9fQ09OU09MRV9fCi0jZGVmaW5lIF9fQ09OU09MRV9fCi0jZW5kaWYKLSNlbmRpZgotCi0vKiAzMi1iaXQgRnJlZUJTRCBjb21waWxlIGVudmlyb25tZW50ICovCi0jZWxpZiAgIGRlZmluZWQoX19GUkVFQlNEX18pCi0jaWZuZGVmIF9fRlJFRUJTRF9fCi0jZGVmaW5lIF9fRlJFRUJTRF9fCi0jZW5kaWYKLSNpZm5kZWYgX18zMkJJVF9fCi0jZGVmaW5lIF9fMzJCSVRfXwotI2VuZGlmCi0jaWZuZGVmIF9fVU5JWF9fCi0jZGVmaW5lIF9fVU5JWF9fCi0jZW5kaWYKLSNpZmRlZiAgX19HTlVDX18KLSNkZWZpbmUgc3RyaWNtcCBzdHJjYXNlY21wCi0jZW5kaWYKLSNpZm5kZWYgX19YMTFfXwotI2lmbmRlZiBfX0NPTlNPTEVfXwotI2RlZmluZSBfX0NPTlNPTEVfXwotI2VuZGlmCi0jZW5kaWYKLQotLyogMzItYml0IEJlT1MgY29tcGlsZSBlbnZpcm9ubWVudCAqLwotI2VsaWYgICBkZWZpbmVkKF9fQkVPU19fKQotI2lmbmRlZiBfXzMyQklUX18KLSNkZWZpbmUgX18zMkJJVF9fCi0jZW5kaWYKLSNpZm5kZWYgX19VTklYX18KLSNkZWZpbmUgX19VTklYX18KLSNlbmRpZgotI2lmZGVmICBfX0dOVUNfXwotI2RlZmluZSBzdHJpY21wIHN0cmNhc2VjbXAKLSNlbmRpZgotCi0vKiBVbnN1cHBvcnRlZCBPUyEgKi8KLSNlbHNlCi0jZXJyb3IgIFRoaXMgcGxhdGZvcm0gaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQhCi0jZW5kaWYKLQotLyogRGV0ZXJtaW5lIHRoZSBDUFUgdHlwZSB0aGF0IHdlIGFyZSBjb21waWxpbmcgZm9yICovCi0KLSNpZiAgICAgZGVmaW5lZChfX01fQUxQSEEpIHx8IGRlZmluZWQoX19BTFBIQV8pIHx8IGRlZmluZWQoX19BTFBIQSkgfHwgZGVmaW5lZChfX2FscGhhKQotI2lmbmRlZiBfX0FMUEhBX18KLSNkZWZpbmUgX19BTFBIQV9fCi0jZW5kaWYKLSNlbGlmICAgZGVmaW5lZChfX01fUFBDKSB8fCBkZWZpbmVkKF9fUE9XRVJDKQotI2lmbmRlZiBfX1BQQ19fCi0jZGVmaW5lIF9fUFBDX18KLSNlbmRpZgotI2VsaWYgICBkZWZpbmVkKF9fTV9NUlgwMDApCi0jaWZuZGVmIF9fTUlQU19fCi0jZGVmaW5lIF9fTUlQU19fCi0jZW5kaWYKLSNlbHNlCi0jaWZuZGVmIF9fSU5URUxfXwotI2RlZmluZSBfX0lOVEVMX18gICAgICAgICAgICAgICAvKiBBc3N1bWUgSW50ZWwgaWYgbm90aGluZyBmb3VuZCAqLwotI2VuZGlmCi0jZW5kaWYKLQotLyogV2UgaGF2ZSB0aGUgZm9sbG93aW5nIGRlZmluZXMgdG8gZGVmaW5lIHRoZSBjYWxsaW5nIGNvbnZlbnRpb25zIGZvcgotICogcHVibGljbHkgYWNjZXNpYmxlIGZ1bmN0aW9uczoKLSAqCi0gKiAgX1BVQkFQSSAgLSBDb21waWxlciBkZWZhdWx0IGNhbGxpbmcgY29udmVudGlvbnMgZm9yIGFsbCBwdWJsaWMgJ0MnIGZ1bmN0aW9ucwotICogIF9BU01BUEkgIC0gQ2FsbGluZyBjb252ZW50aW9ucyBmb3IgYWxsIHB1YmxpYyBhc3NlbWJsZXIgZnVuY3Rpb25zCi0gKiAgX1ZBUkFQSSAgLSBNb2RpZmllcnMgZm9yIHZhcmlhYmxlczsgV2F0Y29tIEMrKyBtYW5nbGVzIEMrKyBnbG9iYWxzCi0gKiAgX1NURENBTEwgLSBXaW4zMiBfX3N0ZGNhbGwgd2hlcmUgcG9zc2libGUsIF9fY2RlY2wgaWYgbm90IHN1cHBvcnRlZAotICovCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19TQ19fKQotI2RlZmluZSBfX1BBU0NBTCAgICBfX3N0ZGNhbGwKLSNlbHNlCi0jZGVmaW5lIF9fUEFTQ0FMICAgIF9fcGFzY2FsCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoTk9fU1REQ0FMTCkKLSNkZWZpbmUgX1NURENBTEwgICAgX19jZGVjbAotI2Vsc2UKLSNkZWZpbmUgX1NURENBTEwgICAgX19zdGRjYWxsCi0jZW5kaWYKLQotI2lmZGVmICBfX1dBVENPTUNfXwotI2lmIChfX1dBVENPTUNfXyA+PSAxMDUwKQotI2RlZmluZSBfVkFSQVBJICAgICBfX2NkZWNsCi0jZWxzZQotI2RlZmluZSBfVkFSQVBJCi0jZW5kaWYKLSNlbHNlCi0jZGVmaW5lIF9WQVJBUEkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX0lCTUNfXykgfHwgZGVmaW5lZChfX0lCTUNQUF9fKQotI2RlZmluZSBQVFJfREVDTF9JTl9GUk9OVAotI2VuZGlmCi0KLS8qIERlZmluZSB0aGUgY2FsbGluZyBjb252ZW50aW9ucyBmb3IgYWxsIHB1YmxpYyBmdW5jdGlvbnMuIEZvciBzaW1wbGljaXR5Ci0gKiB3ZSBkZWZpbmUgYWxsIHB1YmxpYyBmdW5jdGlvbnMgYXMgX19jZGVjbCBjYWxsaW5nIGNvbnZlbnRpb25zLCBzbyB0aGF0Ci0gKiB0aGV5IGFyZSB0aGUgc2FtZSBhY3Jvc3MgYWxsIGNvbXBpbGVycyBhbmQgcnVudGltZSBETEwncy4KLSAqLwotCi0jZGVmaW5lIF9QVUJBUEkgX19jZGVjbAotI2RlZmluZSBfQVNNQVBJIF9fY2RlY2wKLQotLyogRGV0ZXJtaW5lIHRoZSBzeW50YXggZm9yIGRlY2xhcmluZyBhIGZ1bmN0aW9uIHBvaW50ZXIgd2l0aCBhCi0gKiBjYWxsaW5nIGNvbnZlbnRpb25zIG92ZXJyaWRlLiBNb3N0IGNvbXBpbGVycyByZXF1aXJlIHRoZSBjYWxsaW5nCi0gKiBjb252ZW50aW9uIHRvIGJlIGRlY2xhcmVkIGluIGZyb250IG9mIHRoZSAnKicsIGJ1dCBvdGhlcnMgcmVxdWlyZQotICogaXQgdG8gYmUgZGVjbGFyZWQgYWZ0ZXIgdGhlICcqJy4gV2UgaGFuZGxlIGJvdGggaW4gaGVyZSBkZXBlbmRpbmcKLSAqIG9uIHdoYXQgdGhlIGNvbXBpbGVyIHJlcXVpcmVzLgotICovCi0KLSNpZmRlZiAgUFRSX0RFQ0xfSU5fRlJPTlQKLSNkZWZpbmUgX1BVQkFQSVAgICAgKiBfUFVCQVBJCi0jZGVmaW5lIF9BU01BUElQICAgICogX0FTTUFQSQotI2Vsc2UKLSNkZWZpbmUgX1BVQkFQSVAgICAgX1BVQkFQSSAqCi0jZGVmaW5lIF9BU01BUElQICAgIF9BU01BUEkgKgotI2VuZGlmCi0KLS8qIFVzZWZ1bCBtYWNyb3MgKi8KLQotI2RlZmluZSBQUklWQVRFIHN0YXRpYwotI2RlZmluZSBQVUJMSUMKLQotLyogVGhpcyBIQVMgdG8gYmUgMEwgZm9yIDE2LWJpdCByZWFsIG1vZGUgY29kZSB0byB3b3JrISEhICovCi0KLSNpZm5kZWYgTlVMTAotIyAgICAgICBkZWZpbmUgX05VTEwgMEwKLSMgICAgICAgZGVmaW5lIE5VTEwgX05VTEwKLSNlbmRpZgotCi0jaWZuZGVmIE1BWAotIyAgICAgICBkZWZpbmUgTUFYKGEsYikgKCAoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKLSNlbmRpZgotI2lmbmRlZiBNSU4KLSMgICAgICAgZGVmaW5lIE1JTihhLGIpICggKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCi0jZW5kaWYKLSNpZm5kZWYgQUJTCi0jICAgICAgIGRlZmluZSBBQlMoYSkgICAoKGEpID49IDAgPyAoYSkgOiAtKGEpKQotI2VuZGlmCi0jaWZuZGVmIFNJR04KLSMgICAgICAgZGVmaW5lIFNJR04oYSkgICgoYSkgPiAwID8gMSA6IC0xKQotI2VuZGlmCi0KLS8qIEdlbmVyYWwgdHlwZWRlZnMgKi8KLQotI2lmbmRlZiBfX0dFTkRFRlMKLSNkZWZpbmUgX19HRU5ERUZTCi0jaWYgZGVmaW5lZChfX0JFT1NfXykKLSNpbmNsdWRlIDxTdXBwb3J0RGVmcy5oPgotI2Vsc2UKLSNpZmRlZiBfX0xJTlVYX18KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZmRlZiBfX1NUUklDVF9BTlNJX18KLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICB1c2hvcnQ7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICAgdWxvbmc7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICAgdWludDsKLSNlbmRpZgotI2lmZGVmICBfX0tFUk5FTF9fCi0jZGVmaW5lIF9fR0VOREVGU18yCi0jZW5kaWYKLSNlbHNlCi0jaWYgIShkZWZpbmVkKF9fUU5YTlRPX18pICYmIGRlZmluZWQoR0VORVJBTF9TVFJVQ1QpKQotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgIHVzaG9ydDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICB1bG9uZzsKLSNlbmRpZgotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgIHVpbnQ7Ci0jZW5kaWYKLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICB1Y2hhcjsKLSNlbmRpZgotdHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgIGlib29sOyAgICAgIC8qIEludGVnZXIgYm9vbGVhbiB0eXBlICAgICAgICAgKi8KLSNpZmRlZiAgVVNFX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAvKiBPbmx5IGZvciBvbGRlciBjb2RlICAgICAgICAgICovCi0jaWZuZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIGJvb2wgICAgICAgICAgICAgICAgaWJvb2wgICAgICAgLyogU3RhbmRhcmQgQyAgICAgICAgICAgICAgICAgICAqLwotI2Vsc2UKLSNpZm5kZWYgX19IQVNfQk9PTF9fCi0jZGVmaW5lIGJvb2wgICAgICAgICAgICAgICAgaWJvb2wgICAgICAgLyogT2xkZXIgQysrIGNvbXBpbGVycyAgICAgICAgICAqLwotI2VuZGlmCi0jZW5kaWYgIC8qIF9fY3BsdXNwbHVzICovCi0jZW5kaWYgIC8qIFVTRV9CT09MICovCi0jZW5kaWYgIC8qIF9fR0VOREVGUyAqLwotCi0vKiBNb3JlIGdlbmVyYWwgdHlwZWRlZnMgY29tcGF0aWJsZSB3aXRoIExpbnV4IGtlcm5lbCBjb2RlICovCi0KLSNpZm5kZWYgX19HRU5ERUZTXzIKLSNkZWZpbmUgX19HRU5ERUZTXzIKLXR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICBzODsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICB1ODsKLXR5cGVkZWYgc2hvcnQgICAgICAgICAgICAgICBzMTY7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgdTE2OwotI2lmZGVmICBfXzE2QklUX18KLXR5cGVkZWYgbG9uZyAgICAgICAgICAgICAgICBzMzI7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICAgdTMyOwotI2Vsc2UKLXR5cGVkZWYgaW50ICAgICAgICAgICAgICAgICBzMzI7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICAgdTMyOwotI2VuZGlmCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdTMyIGxvdzsKLSAgICBzMzIgaGlnaDsKLSAgICB9IF9faTY0OwotI2lmZGVmICBfX0hBU19MT05HX0xPTkdfXwotI2RlZmluZSBfX05BVElWRV9JTlQ2NF9fCi10eXBlZGVmIGxvbmcgbG9uZyAgICAgICAgICAgczY0OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgIHU2NDsKLSNlbGlmICAgZGVmaW5lZChfX0hBU19JTlQ2NF9fKSAmJiAhZGVmaW5lZChfXzE2QklUX18pCi0jZGVmaW5lIF9fTkFUSVZFX0lOVDY0X18KLXR5cGVkZWYgX19pbnQ2NCAgICAgICAgICAgICBzNjQ7Ci10eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgICAgdTY0OwotI2Vsc2UKLXR5cGVkZWYgX19pNjQgICAgICAgICAgICAgICBzNjQ7Ci10eXBlZGVmIF9faTY0ICAgICAgICAgICAgICAgdTY0OwotI2VuZGlmCi0jZW5kaWYKLQotLyogQm9vbGVhbiB0cnV0aCB2YWx1ZXMgKi8KLQotI3VuZGVmICBmYWxzZQotI3VuZGVmICB0cnVlCi0jdW5kZWYgIE5PCi0jdW5kZWYgIFlFUwotI3VuZGVmICBGQUxTRQotI3VuZGVmICBUUlVFCi0jZGVmaW5lIGZhbHNlICAgICAgIDAKLSNkZWZpbmUgdHJ1ZSAgICAgICAgMQotI2RlZmluZSBOTyAgICAgICAgICAwCi0jZGVmaW5lIFlFUyAgICAgICAgIDEKLSNkZWZpbmUgRkFMU0UgICAgICAgMAotI2RlZmluZSBUUlVFICAgICAgICAxCi0KLS8qIElubGluZSBkZWJ1Z2dlciBpbnRlcnJ1cHRzIGZvciBXYXRjb20gQysrIGFuZCBCb3JsYW5kIEMrKyAqLwotCi0jaWZkZWYgIF9fV0FUQ09NQ19fCi12b2lkIERlYnVnSW50KHZvaWQpOwotI3ByYWdtYSBhdXggRGVidWdJbnQgPSAgICAgICAgICAgICAgXAotICAgICJpbnQgICAgMyI7Ci12b2lkIERlYnVnVnhEKHZvaWQpOwotI3ByYWdtYSBhdXggRGVidWdWeEQgPSAgICAgICAgICAgICAgXAotICAgICJpbnQgICAgMSI7Ci0jZWxpZiAgIGRlZmluZWQoX19CT1JMQU5EQ19fKQotI2RlZmluZSBEZWJ1Z0ludCgpICBfX2VtaXRfXygweENDKQotI2RlZmluZSBEZWJ1Z1Z4RCgpICB7X19lbWl0X18oMHhDRCk7IF9fZW1pdF9fKDB4MDEpO30KLSNlbGlmICAgZGVmaW5lZChfTVNDX1ZFUikKLSNkZWZpbmUgRGVidWdJbnQoKSAgX2FzbSBpbnQgMHgzCi0jZGVmaW5lIERlYnVnVnhEKCkgIF9hc20gaW50IDB4MQotI2VsaWYgICBkZWZpbmVkKF9fR05VQ19fKQotI2RlZmluZSBEZWJ1Z0ludCgpICBhc20gdm9sYXRpbGUgKCJpbnQgJDB4MyIpCi0jZGVmaW5lIERlYnVnVnhEKCkgIGFzbSB2b2xhdGlsZSAoImludCAkMHgxIikKLSNlbHNlCi12b2lkIF9BU01BUEkgRGVidWdJbnQodm9pZCk7Ci12b2lkIF9BU01BUEkgRGVidWdWeEQodm9pZCk7Ci0jZW5kaWYKLQotLyogTWFjcm9zIHRvIGJyZWFrIG9uY2UgYW5kIG5ldmVyIGJyZWFrIGFnYWluICovCi0KLSNkZWZpbmUgRGVidWdJbnRPbmNlKCkgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzdGF0aWMgaWJvb2wgZmlyc3RUaW1lID0gdHJ1ZTsgIFwKLSAgICBpZiAoZmlyc3RUaW1lKSB7ICAgICAgICAgICAgICAgIFwKLQlmaXJzdFRpbWUgPSBmYWxzZTsgICAgICAgICAgXAotCURlYnVnSW50KCk7ICAgICAgICAgICAgICAgICBcCi0JfSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBEZWJ1Z1Z4RE9uY2UoKSAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHN0YXRpYyBpYm9vbCBmaXJzdFRpbWUgPSB0cnVlOyAgXAotICAgIGlmIChmaXJzdFRpbWUpIHsgICAgICAgICAgICAgICAgXAotCWZpcnN0VGltZSA9IGZhbHNlOyAgICAgICAgICBcCi0JRGVidWdWeEQoKTsgICAgICAgICAgICAgICAgIFwKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0vKiBNYWNyb3MgZm9yIGxpbnV4IHN0cmluZyBjb21wYXRpYmlsaXR5IGZ1bmN0aW9ucyAqLwotCi0jaWZkZWYgIF9fTElOVVhfXwotI2RlZmluZSBzdHJpY21wIHN0cmNhc2VjbXAKLSNkZWZpbmUgc3RybmljbXAgc3RybmNhc2VjbXAKLSNlbmRpZgotCi0vKiBNYWNyb3MgZm9yIE5UIGRyaXZlciBzdHJpbmcgY29tcGF0aWJpbGl0eSBmdW5jdGlvbnMgKi8KLQotI2lmZGVmIF9fTlRfRFJJVkVSX18KLSNkZWZpbmUgc3RyaWNtcCBfc3RyaWNtcAotI2RlZmluZSBzdHJuaWNtcCBfc3RybmljbXAKLSNlbmRpZgotCi0vKiBHZXQgcmlkIG9mIHNvbWUgaGVsYWNpb3VzbHkgYW5ub3lpbmcgVmlzdWFsIEMrKyB3YXJuaW5ncyEgKi8KLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9fTVdFUktTX18pICYmICFkZWZpbmVkKF9fU0NfXykKLSNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ3NjEpICAgLyogaW50ZWdyYWwgc2l6ZSBtaXNtYXRjaCBpbiBhcmd1bWVudDsgY29udmVyc2lvbiBzdXBwbGllZCAqLwotI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDI0NCkgICAvKiBjb252ZXJzaW9uIGZyb20gJ3Vuc2lnbmVkIHNob3J0ICcgdG8gJ3Vuc2lnbmVkIGNoYXIgJywgcG9zc2libGUgbG9zcyBvZiBkYXRhICovCi0jcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MDE4KSAgIC8qICc8JyA6IHNpZ25lZC91bnNpZ25lZCBtaXNtYXRjaCAqLwotI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDMwNSkgICAvKiAnaW5pdGlhbGl6aW5nJyA6IHRydW5jYXRpb24gZnJvbSAnY29uc3QgZG91YmxlJyB0byAnZmxvYXQnICovCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFNldCBvZiBkZWJ1Z2dpbmcgbWFjcm9zIHVzZWQgYnkgdGhlIGxpYnJhcmllcy4gSWYgdGhlIGRlYnVnIGZsYWcgaXMKLSAqIHNldCwgdGhleSBhcmUgdHVybmVkIG9uIGRlcGVuZGluZyBvbiB0aGUgc2V0dGluZyBvZiB0aGUgZmxhZy4gVXNlciBjb2RlCi0gKiBjYW4gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZnVuY3Rpb25zIGNhbGxlZCB3aGVuIGEgY2hlY2sgZmFpbHMsIGFuZCB0aGUKLSAqIE1HTCBkb2VzIHRoaXMgc28gaXQgY2FuIHJlc3RvcmUgdGhlIHN5c3RlbSBmcm9tIGdyYXBoaWNzIG1vZGUgdG8gZGlzcGxheQotICogYW4gZXJyb3IgbWVzc2FnZS4gVGhlc2UgZnVuY3Rpb25zIGFsc28gbG9nIGluZm9ybWF0aW9uIHRvIHRoZQotICogc2NpdGVjaC5sb2cgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIGhhcmQgZHJpdmUgd2hlbiBwcm9ibGVtcwotICogc2hvdyB1cC4KLSAqCi0gKiBJZiB5b3Ugc2V0IHRoZSB2YWx1ZSBvZiBDSEVDS0VEIHRvIGJlIDIsIGl0IHdpbGwgYWxzbyBlbmFibGUgY29kZSB0bwotICogaW5zZXJ0IGhhcmQgY29kZWQgZGVidWdnZXIgaW50ZXJydXB0IGludG8gdGhlIHNvdXJjZSBjb2RlIGF0IHRoZSBsaW5lIG9mCi0gKiBjb2RlIHdoZXJlIHRoZSBjaGVjayBmYWlsLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgcnVuIHRoZSBjb2RlIHVuZGVyIGEKLSAqIGRlYnVnZ2VyIGFzIGl0IHdpbGwgYnJlYWsgaW5zaWRlIHRoZSBkZWJ1Z2dlciBiZWZvcmUgZXhpdGluZyB3aXRoIGEKLSAqIGZhaWx1cmUgY29uZGl0aW9uLgotICoKLSAqIEFsc28gZm9yIGNvZGUgY29tcGlsZWQgdG8gcnVuIHVuZGVyIFdpbmRvd3MsIHdlIGFsc28gY2FsbCB0aGUKLSAqIE91dHB1dERlYnVnU3RyaW5nIGZ1bmN0aW9uIHRvIHNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIHN5c3RlbSBkZWJ1Z2dlcgotICogc3VjaCBhcyBTb2Z0LUlDRSBvciBXREVCMzg2LiBIZW5jZSBpZiB5b3UgZ2V0IGFueSBub24tZmF0YWwgd2FybmluZ3MgeW91Ci0gKiB3aWxsIHNlZSB0aG9zZSBvbiB0aGUgZGVidWdnZXIgdGVybWluYWwgYXMgd2VsbCBhcyBpbiB0aGUgbG9nIGZpbGUuCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgICAgICAgICAgICAvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLwotI2VuZGlmCi0KLWV4dGVybiB2b2lkICgqX0NIS19mYWlsKShpbnQgZmF0YWwsY29uc3QgY2hhciAqbXNnLGNvbnN0IGNoYXIgKmNvbmQsY29uc3QgY2hhciAqZmlsZSxpbnQgbGluZSk7Ci12b2lkIF9DSEtfZGVmYXVsdEZhaWwoaW50IGZhdGFsLGNvbnN0IGNoYXIgKm1zZyxjb25zdCBjaGFyICpjb25kLGNvbnN0IGNoYXIgKmZpbGUsaW50IGxpbmUpOwotCi0jaWZkZWYgIENIRUNLRUQKLSMgICAgICAgZGVmaW5lICBDSEsoeCkgICAgICB4Ci0jaWYgICAgIENIRUNLRUQgPiAxCi0jICAgICAgIGRlZmluZSAgQ0hFQ0socCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkoKHApID8gKHZvaWQpMCA6IERlYnVnSW50KCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIF9DSEtfZmFpbCgxLCJDaGVjayBmYWlsZWQ6ICclcycsIGZpbGUgJXMsIGxpbmUgJWRcbiIsICAgXAotCSAgICAjcCwgX19GSUxFX18sIF9fTElORV9fKSkKLSMgICAgICAgZGVmaW5lICBXQVJOKHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSgocCkgPyAodm9pZCkwIDogRGVidWdJbnQoKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgX0NIS19mYWlsKDAsIldhcm5pbmc6ICclcycsIGZpbGUgJXMsIGxpbmUgJWRcbiIsICAgICAgICBcCi0JICAgICNwLCBfX0ZJTEVfXywgX19MSU5FX18pKQotI2Vsc2UKLSMgICAgICAgZGVmaW5lICBDSEVDSyhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSgocCkgPyAodm9pZCkwIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgX0NIS19mYWlsKDEsIkNoZWNrIGZhaWxlZDogJyVzJywgZmlsZSAlcywgbGluZSAlZFxuIiwgICBcCi0JICAgICNwLCBfX0ZJTEVfXywgX19MSU5FX18pKQotIyAgICAgICBkZWZpbmUgIFdBUk4ocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JKChwKSA/ICh2b2lkKTAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBfQ0hLX2ZhaWwoMCwiV2FybmluZzogJyVzJywgZmlsZSAlcywgbGluZSAlZFxuIiwgICAgICAgIFwKLQkgICAgI3AsIF9fRklMRV9fLCBfX0xJTkVfXykpCi0jZW5kaWYKLSMgICAgICAgZGVmaW5lICBMT0dGQVRBTChtc2cpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBfQ0hLX2ZhaWwoMSwiRmF0YWwgZXJyb3I6ICclcycsIGZpbGUgJXMsIGxpbmUgJWRcbiIsICAgIFwKLQkgICAgbXNnLCBfX0ZJTEVfXywgX19MSU5FX18pCi0jICAgICAgIGRlZmluZSAgTE9HV0FSTihtc2cpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgX0NIS19mYWlsKDAsIldhcm5pbmc6ICclcycsIGZpbGUgJXMsIGxpbmUgJWRcbiIsICAgICAgICBcCi0JICAgIG1zZywgX19GSUxFX18sIF9fTElORV9fKQotI2Vsc2UKLSMgICAgICAgZGVmaW5lICBDSEsoeCkKLSMgICAgICAgZGVmaW5lICBDSEVDSyhwKSAgICAgICAgKCh2b2lkKTApCi0jICAgICAgIGRlZmluZSAgV0FSTihwKSAgICAgICAgICgodm9pZCkwKQotIyAgICAgICBkZWZpbmUgIExPR0ZBVEFMKG1zZykgICAoKHZvaWQpMCkKLSMgICAgICAgZGVmaW5lICBMT0dXQVJOKG1zZykgICAgKCh2b2lkKTApCi0jZW5kaWYKLQotI2lmZGVmICBfX2NwbHVzcGx1cwotfSAgICAgICAgICAgICAgICAgICAgICAgLyogRW5kIG9mICJDIiBsaW5rYWdlIGZvciBDKysgICAqLwotI2VuZGlmCi0KLSNlbmRpZiAgLyogX19TQ0lURUNIX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9zY2l0ZWNoLm1hYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS9zY2l0ZWNoLm1hYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdhMmZjMC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUvc2NpdGVjaC5tYWMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIxICswLDAgQEAKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLTsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci07KgotOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLTsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi07KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLTsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07KgotOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyoKLTsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiBMYW5ndWFnZTogICAgTmV0V2lkZSBBc3NlbWJsZXIgKE5BU00pIG9yIFR1cmJvIEFzc2VtYmxlciAoVEFTTSkKLTsqIEVudmlyb25tZW50OiBBbnkgSW50ZWwgRW52aXJvbm1lbnQKLTsqCi07KiBEZXNjcmlwdGlvbjogTWFjcm9zIHRvIHByb3ZpZGUgbWVtb3J5IG1vZGVsIGluZGVwZW5kYW50IGFzc2VtYmx5IGxhbmd1YWdlCi07KiAgICAgICAgICAgICAgbW9kdWxlIGZvciBDIHByb2dyYW1taW5nLiBTdXBwb3J0cyB0aGUgbGFyZ2UgYW5kIGZsYXQgbWVtb3J5Ci07KiAgICAgICAgICAgICAgbW9kZWxzLgotOyoKLTsqICAgICAgICAgICAgICBUaGUgZGVmaW5lcyB0aGF0IHlvdSBzaG91bGQgdXNlIHdoZW4gYXNzZW1ibGluZyBtb2R1bGVzIHRoYXQKLTsqICAgICAgICAgICAgICB1c2UgdGhpcyBtYWNybyBwYWNrYWdlIGFyZToKLTsqCi07KiAgICAgICAgICAgICAgICAgIF9fTEFSR0VfXyAgIEFzc2VtYmxlIGZvciAxNi1iaXQgbGFyZ2UgbW9kZWwKLTsqICAgICAgICAgICAgICAgICAgX19GTEFUX18gICAgQXNzZW1ibGUgZm9yIDMyLWJpdCBGTEFUIG1lbW9yeSBtb2RlbAotOyogICAgICAgICAgICAgICAgICBfX05PVV9fICAgICBObyB1bmRlcnNjb3JlIGZvciBhbGwgZXh0ZXJuYWwgQyBsYWJlbHMKLTsqICAgICAgICAgICAgICAgICAgX19OT1VfVkFSX18gTm8gdW5kZXJzY29yZSBmb3IgZ2xvYmFsIHZhcmlhYmxlcyBvbmx5Ci07KgotOyogICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHNldHRpbmdzIGFyZSBmb3IgMTYtYml0IGxhcmdlIG1lbW9yeSBtb2RlbCB3aXRoCi07KiAgICAgICAgICAgICAgbGVhZGluZyB1bmRlcnNjb3JlcyBmb3Igc3ltYm9sIG5hbWVzLgotOyoKLTsqICAgICAgICAgICAgICBUaGUgbWFpbiBpbnRlbnQgb2YgdGhlIG1hY3JvIGZpbGUgaXMgdG8gZW5hYmxlIHByb2dyYW1tZXJzCi07KiAgICAgICAgICAgICAgdG8gd3JpdGUgX29uZV8gc2V0IG9mIHNvdXJjZSB0aGF0IGNhbiBiZSBhc3NlbWJsZWQgdG8gcnVuCi07KiAgICAgICAgICAgICAgaW4gZWl0aGVyIDE2IGJpdCByZWFsIGFuZCBwcm90ZWN0ZWQgbW9kZXMgb3IgMzIgYml0Ci07KiAgICAgICAgICAgICAgcHJvdGVjdGVkIG1vZGUgd2l0aG91dCB0aGUgbmVlZCB0byByaWRkbGUgdGhlIGNvZGUgd2l0aAotOyogICAgICAgICAgICAgICdpZiBmbGF0bW9kZWwnIHN0eWxlIGNvbmRpdGlvbmFsIGFzc2VtYmx5IChpdCBpcyBzdGlsbCB0aGVyZQotOyogICAgICAgICAgICAgIGJ1dCBuaWNlbHkgaGlkZGVuIGJ5IGEgbWFjcm8gbGF5ZXIgdGhhdCBlbmhhbmNlcyB0aGUKLTsqICAgICAgICAgICAgICByZWFkYWJpbGl0eSBhbmQgdW5kZXJzdGFuZGFiaWxpdHkgb2YgdGhlIHJlc3VsdGluZyBjb2RlKS4KLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi07IEluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlIHZlcnNpb24gaW4gaGVyZSBkZXBlbmRpbmcgb24gdGhlIGFzc2VtYmxlci4gTkFTTQotOyBhcHBlYXJzIHRvIGFsd2F5cyB0cnkgYW5kIHBhcnNlIGNvZGUsIGV2ZW4gaWYgaXQgaXMgaW4gYSBub24tY29tcGlsaW5nCi07IGJsb2NrIG9mIGEgaWZkZWYgZXhwcmVzc2lvbiwgYW5kIGhlbmNlIGNyYXNoZXMgaWYgd2UgaW5jbHVkZSB0aGUgVEFTTQotOyBtYWNybyBwYWNrYWdlIGluIHRoZSBzYW1lIGhlYWRlciBmaWxlLiBIZW5jZSB3ZSBzcGxpdCB0aGUgbWFjcm9zIHVwIGludG8KLTsgdHdvIHNlcGFyYXRlIGhlYWRlciBmaWxlcy4KLQotaWZkZWYgX19OQVNNX01BSk9SX18KLQotOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsgTWFjcm8gcGFja2FnZSB3aGVuIGNvbXBpbGluZyB3aXRoIE5BU00uCi07PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi07IFR1cm4gb2ZmIHVuZGVyc2NvcmVzIGZvciBnbG9iYWxzIGlmIGRpc2FibGVkIGZvciBhbGwgZXh0ZXJuYWxzCi0KLSVpZmRlZiAgX19OT1VfXwotJWRlZmluZSBfX05PVV9WQVJfXwotJWVuZGlmCi0KLTsgRGVmaW5lIHRoZSBfX1dJTkRPV1NfXyBzeW1ib2wgaWYgd2UgYXJlIGNvbXBpbGluZyBmb3IgYW55IFdpbmRvd3MKLTsgZW52aXJvbm1lbnQKLQotJWlmZGVmICBfX1dJTkRPV1MxNl9fCi0lZGVmaW5lIF9fV0lORE9XU19fICAgICAgICAgMQotJWVuZGlmCi0laWZkZWYgIF9fV0lORE9XUzMyX18KLSVkZWZpbmUgX19XSU5ET1dTX18gICAgICAgICAxCi0lZGVmaW5lIF9fV0lORE9XUzMyXzM4Nl9fICAgMQotJWVuZGlmCi0KLTsgTWFjcm9zIGZvciBhY2Nlc3NpbmcgJ2dlbmVyaWMnIHJlZ2lzdGVycwotCi0laWZkZWYgIF9fRkxBVF9fCi0laWRlZmluZSBfYXggICAgZWF4Ci0laWRlZmluZSBfYnggICAgZWJ4Ci0laWRlZmluZSBfY3ggICAgZWN4Ci0laWRlZmluZSBfZHggICAgZWR4Ci0laWRlZmluZSBfc2kgICAgZXNpCi0laWRlZmluZSBfZGkgICAgZWRpCi0laWRlZmluZSBfYnAgICAgZWJwCi0laWRlZmluZSBfc3AgICAgZXNwCi0laWRlZmluZSBfZXMKLSVpZGVmaW5lIFVDSEFSICBCWVRFICAgICAgICA7IFNpemUgb2YgYSBjaGFyYWN0ZXIKLSVpZGVmaW5lIFVTSE9SVCBXT1JEICAgICAgICA7IFNpemUgb2YgYSBzaG9ydAotJWlkZWZpbmUgVUlOVCAgIERXT1JEICAgICAgIDsgU2l6ZSBvZiBhbiBpbnRlZ2VyCi0laWRlZmluZSBVTE9ORyAgRFdPUkQgICAgICAgOyBTaXplIG9mIGEgbG9uZwotJWlkZWZpbmUgQk9PTCAgIERXT1JEICAgICAgIDsgU2l6ZSBvZiBhIGJvb2xlYW4KLSVpZGVmaW5lIERQVFIgICBEV09SRCAgICAgICA7IFNpemUgb2YgYSBkYXRhIHBvaW50ZXIKLSVpZGVmaW5lIEZEUFRSICBGV09SRCAgICAgICA7IFNpemUgb2YgYSBmYXIgZGF0YSBwb2ludGVyCi0laWRlZmluZSBORFBUUiAgRFdPUkQgICAgICAgOyBTaXplIG9mIGEgbmVhciBkYXRhIHBvaW50ZXIKLSVpZGVmaW5lIENQVFIgICBEV09SRCAgICAgICA7IFNpemUgb2YgYSBjb2RlIHBvaW50ZXIKLSVpZGVmaW5lIEZDUFRSICBGV09SRCAgICAgICA7IFNpemUgb2YgYSBmYXIgY29kZSBwb2ludGVyCi0laWRlZmluZSBOQ1BUUiAgRFdPUkQgICAgICAgOyBTaXplIG9mIGEgbmVhciBjb2RlIHBvaW50ZXIKLSVpZGVmaW5lIEZQVFIgICBORUFSICAgICAgICA7IERpc3RhbmNlIGZvciBmdW5jdGlvbiBwb2ludGVycwotJWlkZWZpbmUgRFVJTlQgIGRkICAgICAgICAgIDsgRGVjbGFyZSBhIGludGVnZXIgdmFyaWFibGUKLSVpZGVmaW5lIGludHNpemUgNAotJWlkZWZpbmUgZmxhdG1vZGVsIDEKLSVlbHNlCi0laWRlZmluZSBfYXggICAgYXgKLSVpZGVmaW5lIF9ieCAgICBieAotJWlkZWZpbmUgX2N4ICAgIGN4Ci0laWRlZmluZSBfZHggICAgZHgKLSVpZGVmaW5lIF9zaSAgICBzaQotJWlkZWZpbmUgX2RpICAgIGRpCi0laWRlZmluZSBfYnAgICAgYnAKLSVpZGVmaW5lIF9zcCAgICBzcAotJWlkZWZpbmUgX2VzICAgIGVzOgotJWlkZWZpbmUgVUNIQVIgIEJZVEUgICAgICAgIDsgU2l6ZSBvZiBhIGNoYXJhY3RlcgotJWlkZWZpbmUgVVNIT1JUIFdPUkQgICAgICAgIDsgU2l6ZSBvZiBhIHNob3J0Ci0laWRlZmluZSBVSU5UICAgV09SRCAgICAgICAgOyBTaXplIG9mIGFuIGludGVnZXIKLSVpZGVmaW5lIFVMT05HICBEV09SRCAgICAgICA7IFNpemUgb2YgYSBsb25nCi0laWRlZmluZSBCT09MICAgV09SRCAgICAgICAgOyBTaXplIG9mIGEgYm9vbGVhbgotJWlkZWZpbmUgRFBUUiAgIERXT1JEICAgICAgIDsgU2l6ZSBvZiBhIGRhdGEgcG9pbnRlcgotJWlkZWZpbmUgRkRQVFIgIERXT1JEICAgICAgIDsgU2l6ZSBvZiBhIGZhciBkYXRhIHBvaW50ZXIKLSVpZGVmaW5lIE5EUFRSICBXT1JEICAgICAgICA7IFNpemUgb2YgYSBuZWFyIGRhdGEgcG9pbnRlcgotJWlkZWZpbmUgQ1BUUiAgIERXT1JEICAgICAgIDsgU2l6ZSBvZiBhIGNvZGUgcG9pbnRlcgotJWlkZWZpbmUgRkNQVFIgIERXT1JEICAgICAgIDsgU2l6ZSBvZiBhIGZhciBjb2RlIHBvaW50ZXIKLSVpZGVmaW5lIE5DUFRSICBXT1JEICAgICAgICA7IFNpemUgb2YgYSBuZWFyIGNvZGUgcG9pbnRlcgotJWlkZWZpbmUgRlBUUiAgIEZBUiAgICAgICAgIDsgRGlzdGFuY2UgZm9yIGZ1bmN0aW9uIHBvaW50ZXJzCi0laWRlZmluZSBEVUlOVCAgZHcgICAgICAgICAgOyBEZWNsYXJlIGEgaW50ZWdlciB2YXJpYWJsZQotJWlkZWZpbmUgaW50c2l6ZSAyCi0lZW5kaWYKLSVpZGVmaW5lIGludmVydCB+Ci0laWRlZmluZSBvZmZzZXQKLSVpZGVmaW5lIHVzZV9uYXNtCi0KLTsgQ29udmVydCBhbGwganVtcHMgdG8gbmVhciBqdW1wcywgc2luY2UgTkFTTSBkb2VzIG5vdCBzbyB0aGlzIGF1dG9tYXRpY2FsbHkKLQotJWlkZWZpbmUgam8gICAgIGpvIG5lYXIKLSVpZGVmaW5lIGpubyAgICBqbm8gbmVhcgotJWlkZWZpbmUganogICAgIGp6IG5lYXIKLSVpZGVmaW5lIGpueiAgICBqbnogbmVhcgotJWlkZWZpbmUgamUgICAgIGplIG5lYXIKLSVpZGVmaW5lIGpuZSAgICBqbmUgbmVhcgotJWlkZWZpbmUgamIgICAgIGpiICBuZWFyCi0laWRlZmluZSBqYmUgICAgamJlIG5lYXIKLSVpZGVmaW5lIGphICAgICBqYSAgbmVhcgotJWlkZWZpbmUgamFlICAgIGphZSBuZWFyCi0laWRlZmluZSBqbCAgICAgamwgIG5lYXIKLSVpZGVmaW5lIGpsZSAgICBqbGUgbmVhcgotJWlkZWZpbmUgamcgICAgIGpnICBuZWFyCi0laWRlZmluZSBqZ2UgICAgamdlIG5lYXIKLSVpZGVmaW5lIGpjICAgICBqYyAgbmVhcgotJWlkZWZpbmUgam5jICAgIGpuYyBuZWFyCi0laWRlZmluZSBqcyAgICAganMgIG5lYXIKLSVpZGVmaW5lIGpucyAgICBqbnMgbmVhcgotCi0laWZkZWYgIERPVUJMRQotJWlkZWZpbmUgICAgUkVBTCAgICBRV09SRAotJWlkZWZpbmUgICAgRFJFQUwgICBkcQotJWVsc2UKLSVpZGVmaW5lICAgIFJFQUwgICAgRFdPUkQKLSVpZGVmaW5lICAgIERSRUFMICAgZGQKLSVlbmRpZgotCi07IEJvb2xlYW4gdHJ1dGggdmFsdWVzIChzYW1lIGFzIHRob3NlIGluIGRlYnVnLmgpCi0KLSVpZGVmaW5lIEZhbHNlICAgICAgMAotJWlkZWZpbmUgVHJ1ZSAgICAgICAxCi0laWRlZmluZSBObyAgICAgICAgIDAKLSVpZGVmaW5lIFllcyAgICAgICAgMQotJWlkZWZpbmUgWWVzICAgICAgICAxCi0KLTsgTWFjcm8gdG8gYmUgaW52b2tlZCBhdCB0aGUgc3RhcnQgb2YgYWxsIG1vZHVsZXMgdG8gc2V0IHVwIHNlZ21lbnRzIGZvcgotOyBsYXRlciB1c2UuIERvZXMgbm90aGluZyBmb3IgTkFTTS4KLQotJWltYWNybyBoZWFkZXIgMQotJWVuZG1hY3JvCi0KLTsgTWFjcm8gdG8gYmVnaW4gYSBkYXRhIHNlZ21lbnQKLQotJWltYWNybyBiZWdkYXRhc2VnIDEKLSVpZmRlZiBfX0dOVUNfXwotc2VnbWVudCAuZGF0YSBwdWJsaWMgY2xhc3M9REFUQSB1c2UzMiBmbGF0Ci0lZWxzZQotJWlmZGVmIGZsYXRtb2RlbAotc2VnbWVudCBfREFUQSBwdWJsaWMgYWxpZ249NCBjbGFzcz1EQVRBIHVzZTMyIGZsYXQKLSVlbHNlCi1zZWdtZW50IF9EQVRBIHB1YmxpYyBhbGlnbj00IGNsYXNzPURBVEEgdXNlMTYKLSVlbmRpZgotJWVuZGlmCi0lZW5kbWFjcm8KLQotOyBNYWNybyB0byBlbmQgYSBkYXRhIHNlZ21lbnQKLQotJWltYWNybyBlbmRkYXRhc2VnIDEKLSVlbmRtYWNybwotCi07IE1hY3JvIHRvIGJlZ2luIGEgY29kZSBzZWdtZW50Ci0KLSVpbWFjcm8gYmVnY29kZXNlZyAxCi0laWZkZWYgX19QSUNfXwotJWlmZGVmIF9fTElOVVhfXwotICAgICAgICBleHRlcm4gX0dMT0JBTF9PRkZTRVRfVEFCTEVfCi0lZWxzZQotICAgICAgICBleHRlcm4gX19HTE9CQUxfT0ZGU0VUX1RBQkxFXwotJWVuZGlmCi0lZW5kaWYKLSVpZmRlZiBfX0dOVUNfXwotc2VnbWVudCAudGV4dCBwdWJsaWMgY2xhc3M9Q09ERSB1c2UzMiBmbGF0Ci0lZWxzZQotJWlmZGVmIGZsYXRtb2RlbAotc2VnbWVudCBfVEVYVCBwdWJsaWMgYWxpZ249MTYgY2xhc3M9Q09ERSB1c2UzMiBmbGF0Ci0lZWxzZQotc2VnbWVudCAlMV9URVhUIHB1YmxpYyBhbGlnbj0xNiBjbGFzcz1DT0RFIHVzZTE2Ci0lZW5kaWYKLSVlbmRpZgotJWVuZG1hY3JvCi0KLTsgTWFjcm8gdG8gYmVnaW4gYSBuZWFyIGNvZGUgc2VnbWVudAotCi0laW1hY3JvIGJlZ2NvZGVzZWdfbmVhciAwCi0laWZkZWYgX19HTlVDX18KLXNlZ21lbnQgLnRleHQgcHVibGljIGNsYXNzPUNPREUgdXNlMzIgZmxhdAotJWVsc2UKLSVpZmRlZiBmbGF0bW9kZWwKLXNlZ21lbnQgX1RFWFQgcHVibGljIGFsaWduPTE2IGNsYXNzPUNPREUgdXNlMzIgZmxhdAotJWVsc2UKLXNlZ21lbnQgX1RFWFQgcHVibGljIGFsaWduPTE2IGNsYXNzPUNPREUgdXNlMTYKLSVlbmRpZgotJWVuZGlmCi0lZW5kbWFjcm8KLQotOyBNYWNybyB0byBlbmQgYSBjb2RlIHNlZ21lbnQKLQotJWltYWNybyBlbmRjb2Rlc2VnIDEKLSVlbmRtYWNybwotCi07IE1hY3JvIHRvIGVuZCBhIG5lYXIgY29kZSBzZWdtZW50Ci0KLSVpbWFjcm8gZW5kY29kZXNlZ19uZWFyIDAKLSVlbmRtYWNybwotCi07IE1hY3JvIGZvciBhbiBleHRlcm4gQyBzeW1ib2wuIElmIHRoZSBDIGNvbXBpbGVyIHJlcXVpcmVzIGxlYWRpbmcKLTsgdW5kZXJzY29yZXMsIHRoZW4gdGhlIHVuZGVyc2NvcmVzIGFyZSBhZGRlZCB0byB0aGUgc3ltYm9sIG5hbWVzLCBvdGhlcndpc2UKLTsgdGhleSBhcmUgbGVmdCBvZmYuIFRoZSBzeW1ib2wgbmFtZSBpcyByZWZlcmVuY2VkIGluIHRoZSBhc3NlbWJsZXIgY29kZQotOyB1c2luZyB0aGUgbm9uLXVuZGVyc2NvcmVkIHN5bWJvbCBuYW1lLgotCi0laW1hY3JvIGNleHRlcm4gMgotJWlmZGVmICBfX05PVV9WQVJfXwotZXh0ZXJuICUxCi0lZWxzZQotZXh0ZXJuIF8lMQotJWRlZmluZSAlMSBfJTEKLSVlbmRpZgotJWVuZG1hY3JvCi0KLSVpbWFjcm8gY2V4dGVybmZ1bmMgMgotJWlmZGVmICBfX05PVV9fCi1leHRlcm4gJTEKLSVlbHNlCi1leHRlcm4gXyUxCi0lZGVmaW5lICUxIF8lMQotJWVuZGlmCi0lZW5kbWFjcm8KLQotOyBNYWNybyBmb3IgYSBwdWJsaWMgQyBzeW1ib2wuIElmIHRoZSBDIGNvbXBpbGVyIHJlcXVpcmVzIGxlYWRpbmcKLTsgdW5kZXJzY29yZXMsIHRoZW4gdGhlIHVuZGVyc2NvcmVzIGFyZSBhZGRlZCB0byB0aGUgc3ltYm9sIG5hbWVzLCBvdGhlcndpc2UKLTsgdGhleSBhcmUgbGVmdCBvZmYuIFRoZSBzeW1ib2wgbmFtZSBpcyByZWZlcmVuY2VkIGluIHRoZSBhc3NlbWJsZXIgY29kZQotOyB1c2luZyB0aGUgbm9uLXVuZGVyc2NvcmVkIHN5bWJvbCBuYW1lLgotCi0laW1hY3JvIGNwdWJsaWMgMQotJWlmZGVmICBfX05PVV9WQVJfXwotZ2xvYmFsICUxCi0lMToKLSVlbHNlCi1nbG9iYWwgXyUxCi1fJTE6Ci0lZGVmaW5lICUxIF8lMQotJWVuZGlmCi0lZW5kbWFjcm8KLQotOyBNYWNybyBmb3IgYW4gZ2xvYmFsIEMgc3ltYm9sLiBJZiB0aGUgQyBjb21waWxlciByZXF1aXJlcyBsZWFkaW5nCi07IHVuZGVyc2NvcmVzLCB0aGVuIHRoZSB1bmRlcnNjb3JlcyBhcmUgYWRkZWQgdG8gdGhlIHN5bWJvbCBuYW1lcywgb3RoZXJ3aXNlCi07IHRoZXkgYXJlIGxlZnQgb2ZmLiBUaGUgc3ltYm9sIG5hbWUgaXMgcmVmZXJlbmNlZCBpbiB0aGUgYXNzZW1ibGVyIGNvZGUKLTsgdXNpbmcgdGhlIG5vbi11bmRlcnNjb3JlZCBzeW1ib2wgbmFtZS4KLQotJWltYWNybyBjZ2xvYmFsIDEKLSVpZmRlZiAgX19OT1VfVkFSX18KLWdsb2JhbCAlMQotJWVsc2UKLWdsb2JhbCBfJTEKLSVkZWZpbmUgJTEgXyUxCi0lZW5kaWYKLSVlbmRtYWNybwotCi07IE1hY3JvIGZvciBhbiBnbG9iYWwgQyBmdW5jdGlvbiBzeW1ib2wuIElmIHRoZSBDIGNvbXBpbGVyIHJlcXVpcmVzIGxlYWRpbmcKLTsgdW5kZXJzY29yZXMsIHRoZW4gdGhlIHVuZGVyc2NvcmVzIGFyZSBhZGRlZCB0byB0aGUgc3ltYm9sIG5hbWVzLCBvdGhlcndpc2UKLTsgdGhleSBhcmUgbGVmdCBvZmYuIFRoZSBzeW1ib2wgbmFtZSBpcyByZWZlcmVuY2VkIGluIHRoZSBhc3NlbWJsZXIgY29kZQotOyB1c2luZyB0aGUgbm9uLXVuZGVyc2NvcmVkIHN5bWJvbCBuYW1lLgotCi0laW1hY3JvIGNnbG9iYWxmdW5jIDEKLSVpZmRlZiBfX1BJQ19fCi1nbG9iYWwgJTE6ZnVuY3Rpb24KLSVlbHNlCi0laWZkZWYgIF9fTk9VX18KLWdsb2JhbCAlMQotJWVsc2UKLWdsb2JhbCBfJTEKLSVkZWZpbmUgJTEgXyUxCi0lZW5kaWYKLSVlbmRpZgotJWVuZG1hY3JvCi0KLTsgTWFjcm8gdG8gc3RhcnQgYSBDIGNhbGxhYmxlIGZ1bmN0aW9uLiBUaGlzIHdpbGwgYmUgYSBmYXIgZnVuY3Rpb24gZm9yCi07IDE2LWJpdCBjb2RlLCBhbmQgYSBuZWFyIGZ1bmN0aW9uIGZvciAzMi1iaXQgY29kZS4KLQotJWltYWNybyBjcHJvY3N0YXRpYyAxCi0lcHVzaCBjcHJvYwotJTE6Ci0laWZkZWYgZmxhdG1vZGVsCi0lc3RhY2tzaXplIGZsYXQKLSVkZWZpbmUgcmV0IHJldG4KLSVlbHNlCi0lc3RhY2tzaXplIGxhcmdlCi0lZGVmaW5lIHJldCByZXRmCi0lZW5kaWYKLSVhc3NpZ24gJSRsb2NhbHNpemUgMAotJWVuZG1hY3JvCi0KLSVpbWFjcm8gY3Byb2NzdGFydCAxCi0lcHVzaCBjcHJvYwotICAgIGNnbG9iYWxmdW5jICUxCi0lMToKLSVpZmRlZiBmbGF0bW9kZWwKLSVzdGFja3NpemUgZmxhdAotJWRlZmluZSByZXQgcmV0bgotJWVsc2UKLSVzdGFja3NpemUgbGFyZ2UKLSVkZWZpbmUgcmV0IHJldGYKLSVlbmRpZgotJWFzc2lnbiAlJGxvY2Fsc2l6ZSAwCi0lZW5kbWFjcm8KLQotOyBUaGlzIG1hY3JvIHNldHMgdXAgYSBwcm9jZWR1cmUgdG8gYmUgZXhwb3J0ZWQgZnJvbSBhIDE2IGJpdCBETEwuIFNpbmNlIHRoZQotOyBjYWxsaW5nIGNvbnZlbnRpb25zIGFyZSBhbHdheXMgX2ZhciBfcGFzY2FsIGZvciAxNiBiaXQgRExMJ3MsIHdlIGFjdHVhbGx5Ci07IHJlbmFtZSB0aGlzIHJvdXRpbmUgd2l0aCBhbiBleHRyYSB1bmRlcnNjb3JlIHdpdGggJ0MnIGNhbGxpbmcgY29udmVudGlvbnMKLTsgYW5kIGEgc21hbGwgRExMIHN0dWIgd2lsbCBiZSBwcm92aWRlZCBieSB0aGUgaGlnaCBsZXZlbCBjb2RlIHRvIGNhbGwgdGhlCi07IGFzc2VtYmxlciByb3V0aW5lLgotCi0laW1hY3JvIGNwcm9jc3RhcnRkbGwxNiAxCi0laWZkZWYgIF9fV0lORE9XUzE2X18KLWNwcm9jc3RhcnQgIF8lMQotJWVsc2UKLWNwcm9jc3RhcnQgICUxCi0lZW5kaWYKLSVlbmRtYWNybwotCi07IE1hY3JvIHRvIHN0YXJ0IGEgQyBjYWxsYWJsZSBuZWFyIGZ1bmN0aW9uLgotCi0laW1hY3JvIGNwcm9jbmVhciAxCi0lcHVzaCBjcHJvYwotICAgIGNnbG9iYWxmdW5jICUxCi0lMToKLSVkZWZpbmUgcmV0IHJldG4KLSVpZmRlZiBmbGF0bW9kZWwKLSVzdGFja3NpemUgZmxhdAotJWVsc2UKLSVzdGFja3NpemUgc21hbGwKLSVlbmRpZgotJWFzc2lnbiAlJGxvY2Fsc2l6ZSAwCi0lZW5kbWFjcm8KLQotOyBNYWNybyB0byBzdGFydCBhIEMgY2FsbGFibGUgZmFyIGZ1bmN0aW9uLgotCi0laW1hY3JvIGNwcm9jZmFyIDEKLSVwdXNoIGNwcm9jCi0gICAgY2dsb2JhbGZ1bmMgJTEKLSUxOgotJWRlZmluZSByZXQgcmV0ZgotJWlmZGVmIGZsYXRtb2RlbAotJXN0YWNrc2l6ZSBmbGF0Ci0lZWxzZQotJXN0YWNrc2l6ZSBsYXJnZQotJWVuZGlmCi0lYXNzaWduICUkbG9jYWxzaXplIDAKLSVlbmRtYWNybwotCi07IE1hY3JvIHRvIGVuZCBhIEMgZnVuY3Rpb24KLQotJWltYWNybyBjcHJvY2VuZCAwCi0lcG9wCi0lZW5kbWFjcm8KLQotOyBNYWNyb3MgZm9yIGVudGVyaW5nIGFuZCBleGl0aW5nIEMgY2FsbGFibGUgZnVuY3Rpb25zLiBOb3RlIHRoYXQgd2UgbXVzdAotOyBhbHdheXMgc2F2ZSBhbmQgcmVzdG9yZSB0aGUgU0kgYW5kIERJIHJlZ2lzdGVycyBmb3IgQyBmdW5jdGlvbnMsIGFuZCBmb3IKLTsgMzIgYml0IEMgZnVuY3Rpb25zIHdlIGFsc28gbmVlZCB0byBzYXZlIGFuZCByZXN0b3JlIEVCWCBhbmQgY2xlYXIgdGhlCi07IGRpcmVjdGlvbiBmbGFnLgotCi0laW1hY3JvIGVudGVyX2MgMAotICAgICAgICBwdXNoICAgIF9icAotICAgICAgICBtb3YgICAgIF9icCxfc3AKLSVpZm5pZG4gJSRsb2NhbHNpemUsMAotICAgICAgICBzdWIgICAgIF9zcCwlJGxvY2Fsc2l6ZQotJWVuZGlmCi0laWZkZWYgIGZsYXRtb2RlbAotICAgICAgICBwdXNoICAgIGVieAotJWVuZGlmCi0gICAgICAgIHB1c2ggICAgX3NpCi0gICAgICAgIHB1c2ggICAgX2RpCi0lZW5kbWFjcm8KLQotJWltYWNybyBsZWF2ZV9jIDAKLSAgICAgICAgcG9wICAgICBfZGkKLSAgICAgICAgcG9wICAgICBfc2kKLSVpZmRlZiAgZmxhdG1vZGVsCi0gICAgICAgIHBvcCAgICAgZWJ4Ci0gICAgICAgIGNsZAotJWVuZGlmCi0laWZuaWRuICUkbG9jYWxzaXplLDAKLSAgICAgICAgbW92ICAgICBfc3AsX2JwCi0lZW5kaWYKLSAgICAgICAgcG9wICAgICBfYnAKLSVlbmRtYWNybwotCi0laW1hY3JvICAgdXNlX2VieCAwCi0laWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIHB1c2ggICAgZWJ4Ci0lZW5kaWYKLSVlbmRtYWNybwotCi0laW1hY3JvICAgdW51c2VfZWJ4IDAKLSVpZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgcG9wICAgICBlYngKLSVlbmRpZgotJWVuZG1hY3JvCi0KLTsgTWFjcm9zIGZvciBzYXZpbmcgYW5kIHJlc3RvcmluZyB0aGUgdmFsdWUgb2YgRFMsRVMsRlMsR1Mgd2hlbiBpdCBpcyB0bwotOyBiZSB1c2VkIGluIGFzc2VtYmx5IHJvdXRpbmVzLiBUaGlzIGV2YWx1YXRlcyB0byBub3RoaW5nIGluIHRoZSBmbGF0IG1lbW9yeQotOyBtb2RlbCwgYnV0IGlzIHNhdmVzIGFuZCByZXN0b3JlcyBEUyBpbiB0aGUgbGFyZ2UgbWVtb3J5IG1vZGVsLgotCi0laW1hY3JvIHVzZV9kcyAwCi0laWZuZGVmIGZsYXRtb2RlbAotICAgICAgICBwdXNoICAgIGRzCi0lZW5kaWYKLSVlbmRtYWNybwotCi0laW1hY3JvIHVudXNlX2RzIDAKLSVpZm5kZWYgZmxhdG1vZGVsCi0gICAgICAgIHBvcCAgICAgZHMKLSVlbmRpZgotJWVuZG1hY3JvCi0KLSVpbWFjcm8gdXNlX2VzIDAKLSVpZm5kZWYgZmxhdG1vZGVsCi0gICAgICAgIHB1c2ggICAgZXMKLSVlbmRpZgotJWVuZG1hY3JvCi0KLSVpbWFjcm8gdW51c2VfZXMgMAotJWlmbmRlZiBmbGF0bW9kZWwKLSAgICAgICAgcG9wICAgICBlcwotJWVuZGlmCi0lZW5kbWFjcm8KLQotOyBNYWNyb3MgZm9yIGxvYWRpbmcgdGhlIGFkZHJlc3Mgb2YgYSBkYXRhIHBvaW50ZXIgaW50byBhIHNlZ21lbnQgYW5kCi07IGluZGV4IHJlZ2lzdGVyIHBhaXIuIFRoZSAlaW1hY3JvIGV4cGxpY2l0bHkgbG9hZHMgRFMgb3IgRVMgaW4gdGhlIDE2IGJpdAotOyBtZW1vcnkgbW9kZWwsIG9yIGl0IHNpbXBseSBsb2FkcyB0aGUgb2Zmc2V0IGludG8gdGhlIHJlZ2lzdGVyIGluIHRoZSBmbGF0Ci07IG1lbW9yeSBtb2RlbCBzaW5jZSBEUyBhbmQgRVMgYWx3YXlzIHBvaW50IHRvIGFsbCBhZGRyZXNzYWJsZSBtZW1vcnkuIFlvdQotOyBtdXN0IHVzZSB0aGUgY29ycmVjdCBfUkVHIChpZTogX0JYKSAlaW1hY3JvcyBmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3Nlcy4KLQotJWltYWNybyBfbGRzICAgIDIKLSVpZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgbW92ICAgICAlMSwlMgotJWVsc2UKLSAgICAgICAgbGRzICAgICAlMSwlMgotJWVuZGlmCi0lZW5kbWFjcm8KLQotJWltYWNybyAgIF9sZXMgIDIKLSVpZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgbW92ICAgICAlMSwlMgotJWVsc2UKLSAgICAgICAgbGVzICAgICAlMSwlMgotJWVuZGlmCi0lZW5kbWFjcm8KLQotOyBNYWNyb3MgZm9yIGFkZGluZyBhbmQgc3VidHJhY3RpbmcgYSB2YWx1ZSBmcm9tIHJlZ2lzdGVycy4gVHdvIHZhbHVlIGFyZQotOyBwcm92aWRlZCwgb25lIGZvciAxNiBiaXQgbW9kZXMgYW5kIGFub3RoZXIgZm9yIDMyIGJpdCBtb2RlcyAodGhlIGV4dGVuZGVkCi07IHJlZ2lzdGVyIGlzIHVzZWQgaW4gMzIgYml0IG1vZGVzKS4KLQotJWltYWNybyAgIF9hZGQgIDMKLSVpZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgYWRkICAgICBlJTEsICUzCi0lZWxzZQotICAgICAgICBhZGQgICAgICUxLCAlMgotJWVuZGlmCi0lZW5kbWFjcm8KLQotJWltYWNybyBfc3ViICAgIDMKLSVpZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgc3ViICAgICBlJTEsICUzCi0lZWxzZQotICAgICAgICBzdWIgICAgICUxLCAlMgotJWVuZGlmCi0lZW5kbWFjcm8KLQotOyBNYWNybyB0byBjbGVhciB0aGUgaGlnaCBvcmRlciB3b3JkIGZvciB0aGUgMzIgYml0IGV4dGVuZGVkIHJlZ2lzdGVycy4KLTsgVGhpcyBpcyB1c2VkIHRvIGNvbnZlcnQgYW4gdW5zaWduZWQgMTYgYml0IHZhbHVlIHRvIGFuIHVuc2lnbmVkIDMyIGJpdAotOyB2YWx1ZSwgYW5kIHdpbGwgZXZhbHVhdGUgdG8gbm90aGluZyBpbiAxNiBiaXQgbW9kZXMuCi0KLSVpbWFjcm8gY2xyaGkgICAxCi0laWZkZWYgIGZsYXRtb2RlbAotICAgICAgICBtb3Z6eCAgIGUlMSwlMQotJWVuZGlmCi0lZW5kbWFjcm8KLQotJWltYWNybyBzZ25oaSAgIDEKLSVpZmRlZiAgZmxhdG1vZGVsCi0gICAgICAgIG1vdnN4ICAgZSUxLCUxCi0lZW5kaWYKLSVlbmRtYWNybwotCi07IE1hY3JvIHRvIGxvYWQgYW4gZXh0ZW5kZWQgcmVnaXN0ZXIgd2l0aCBhbiBpbnRlZ2VyIHZhbHVlIGluIGVpdGhlciBtb2RlCi0KLSVpbWFjcm8gbG9hZGludCAyCi0laWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIG1vdiAgICAgZSUxLCUyCi0lZWxzZQotICAgICAgICB4b3IgICAgIGUlMSxlJTEKLSAgICAgICAgbW92ICAgICAlMSwlMgotJWVuZGlmCi0lZW5kbWFjcm8KLQotOyBNYWNyb3MgdG8gbG9hZCBhbmQgc3RvcmUgaW50ZWdlciB2YWx1ZXMgd2l0aCBzdHJpbmcgaW5zdHJ1Y3Rpb25zCi0KLSVpbWFjcm8gTE9EU0lOVCAwCi0laWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIGxvZHNkCi0lZWxzZQotICAgICAgICBsb2RzdwotJWVuZGlmCi0lZW5kbWFjcm8KLQotJWltYWNybyBTVE9TSU5UIDAKLSVpZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgc3Rvc2QKLSVlbHNlCi0gICAgICAgIHN0b3N3Ci0lZW5kaWYKLSVlbmRtYWNybwotCi07IE1hY3JvcyB0byBwcm92aWRlIHJlc2IsIHJlc3csIHJlc2QgY29tcGF0aWJpbGl0eSB3aXRoIE5BU00KLQotJWltYWNybyBkY2xiIDEKLXRpbWVzICUxIGRiIDAKLSVlbmRtYWNybwotCi0laW1hY3JvIGRjbHcgMQotdGltZXMgJTEgZHcgMAotJWVuZG1hY3JvCi0KLSVpbWFjcm8gZGNsZCAxCi10aW1lcyAlMSBkZCAwCi0lZW5kbWFjcm8KLQotOyBNYWNybyB0byBnZXQgdGhlIGFkZHJlcyBvZiB0aGUgR09UIGZvciBMaW51eC9GcmVlQlNEIHNoYXJlZAotOyBsaWJyYXJpZXMgaW50byB0aGUgRUJYIHJlZ2lzdGVyLgotCi0laW1hY3JvICAgICBnZXRfR09UIDEKLSAgICAgICAgICAgIGNhbGwgICAgJSVnZXRnb3QKLSUlZ2V0Z290OiAgIHBvcCAgICAgJTEKLSAgICAgICAgICAgIGFkZCAgICAgJTEsX0dMT0JBTF9PRkZTRVRfVEFCTEVfKyQkLSUlZ2V0Z290IHdydCAuLmdvdHBjCi0lZW5kbWFjcm8KLQotOyBNYWNybyB0byBnZXQgdGhlIGFkZHJlc3Mgb2YgYSAqbG9jYWwqIHZhcmlhYmxlIHRoYXQgaXMgZ2xvYmFsIHRvCi07IGEgc2luZ2xlIG1vZHVsZSBpbiBhIG1hbm5lciB0aGF0IHdpbGwgd29yayBjb3JyZWN0bHkgd2hlbiBjb21waWxlZAotOyBpbnRvIGEgTGludXggc2hhcmVkIGxpYnJhcnkuIE5vdGUgdGhhdCB0aGlzIHdpbGwgKm5vdCogd29yayBmb3IKLTsgdmFyaWFibGVzIHRoYXQgYXJlIGRlZmluZWQgYXMgZ2xvYmFsIHRvIGFsbCBtb2R1bGVzLiBGb3IgdGhhdAotOyB1c2UgdGhlIExFQV9HIG1hY3JvCi0KLSVtYWNybyAgICAgIExFQV9MICAgIDIKLSVpZmRlZiBfX1BJQ19fCi0gICAgICAgIGdldF9HT1QgJTEKLSAgICAgICAgbGVhICAgICAlMSxbJTErJTIgd3J0IC4uZ290b2ZmXQotJWVsc2UKLSAgICAgICAgbGVhICAgICAlMSxbJTJdCi0lZW5kaWYKLSVlbmRtYWNybwotCi07IFNhbWUgbWFjcm8gYXMgYWJvdmUgYnV0IGZvciBnbG9iYWwgdmFyaWFibGVzIHB1YmxpYyB0byAqYWxsKgotOyBtb2R1bGVzLgotCi0lbWFjcm8gICAgICBMRUFfRyAgICAyCi0laWZkZWYgX19QSUNfXwotICAgICAgICBnZXRfR09UICUxCi0gICAgICAgIG1vdiAgICAgJTEsWyUxKyUyIHdydCAuLmdvdF0KLSVlbHNlCi0gICAgICAgIGxlYSAgICAgJTEsWyUyXQotJWVuZGlmCi0lZW5kbWFjcm8KLQotOyBtYWNyb3MgdG8gZGVjbGFyZSBhc3NlbWJsZXIgZnVuY3Rpb24gc3R1YnMgZm9yIGZ1bmN0aW9uIHN0cnVjdHVyZXMKLQotJWltYWNybyBCRUdJTl9TVFVCU19ERUYgMgotYmVnZGF0YXNlZyAgX1NUVUJTCi0laWZkZWYgIF9fTk9VX1ZBUl9fCi1leHRlcm4gJTEKLSVkZWZpbmUgU1RVQlNfU1RBUlQgJTEKLSVlbHNlCi1leHRlcm4gXyUxCi0lZGVmaW5lIFNUVUJTX1NUQVJUIF8lMQotJWVuZGlmCi1lbmRkYXRhc2VnICBfU1RVQlMKLWJlZ2NvZGVzZWcgIF9TVFVCUwotJWFzc2lnbiBvZmYgJTIKLSVlbmRtYWNybwotCi0laW1hY3JvICAgREVDTEFSRV9TVFVCICAxCi0laWZkZWYgX19QSUNfXwotICAgICAgICBnbG9iYWwgJTE6ZnVuY3Rpb24KLSUxOgotICAgICAgICBnZXRfR09UIGVheAotICAgICAgICBtb3YgICAgIGVheCxbZWF4K1NUVUJTX1NUQVJUIHdydCAuLmdvdF0KLSAgICAgICAgam1wICAgICBbZWF4K29mZl0KLSVlbHNlCi0laWZkZWYgIF9fTk9VX18KLSAgICAgICAgZ2xvYmFsICUxCi0lMToKLSVlbHNlCi0gICAgICAgIGdsb2JhbCBfJTEKLV8lMToKLSVlbmRpZgotICAgICAgICBqbXAgICAgIFtEV09SRCBTVFVCU19TVEFSVCtvZmZdCi0lZW5kaWYKLSVhc3NpZ24gb2ZmIG9mZis0Ci0lZW5kbWFjcm8KLQotJWltYWNybyAgIFNLSVBfU1RVQiAgMQotJWFzc2lnbiBvZmYgb2ZmKzQKLSVlbmRtYWNybwotCi0laW1hY3JvIERFQ0xBUkVfU1REQ0FMTCAyCi0laWZkZWYgIFNURENBTExfTUFOR0xFCi0gICAgICAgIGdsb2JhbCBfJTFAJTIKLV8lMUAlMjoKLSVlbHNlCi0laWZkZWYgU1REQ0FMTF9VU0NPUkUKLSAgICAgICAgZ2xvYmFsIF8lMQotXyUxOgotJWVsc2UKLSAgICAgICAgZ2xvYmFsICUxCi0lMToKLSVlbmRpZgotJWVuZGlmCi0gICAgICAgIGptcCAgICAgW0RXT1JEIFNUVUJTX1NUQVJUK29mZl0KLSVhc3NpZ24gb2ZmIG9mZis0Ci0lZW5kbWFjcm8KLQotJWltYWNybyAgIEVORF9TVFVCU19ERUYgMAotZW5kY29kZXNlZyAgX1NUVUJTCi0lZW5kbWFjcm8KLQotOyBtYWNyb3MgdG8gZGVjbGFyZSBhc3NlbWJsZXIgaW1wb3J0IHN0dWJzIGZvciBiaW5hcnkgbG9hZGFibGUgZHJpdmVycwotCi0laW1hY3JvIEJFR0lOX0lNUE9SVFNfREVGICAgMQotQkVHSU5fU1RVQlNfREVGICUxLDQKLSVlbmRtYWNybwotCi0laW1hY3JvICAgREVDTEFSRV9JTVAgICAyCi1ERUNMQVJFX1NUVUIgICAgJTEKLSVlbmRtYWNybwotCi0laW1hY3JvICAgU0tJUF9JTVAgICAyCi1TS0lQX1NUVUIgICAgJTEKLSVlbmRtYWNybwotCi0laW1hY3JvICAgU0tJUF9JTVAyICAgMQotREVDTEFSRV9TVFVCICAgICUxCi0lZW5kbWFjcm8KLQotJWltYWNybyAgIFNLSVBfSU1QMyAgIDEKLVNLSVBfU1RVQiAgICAlMQotJWVuZG1hY3JvCi0KLSVpbWFjcm8gICBFTkRfSU1QT1JUU19ERUYgMAotRU5EX1NUVUJTX0RFRgotJWVuZG1hY3JvCi0KLWVsc2UgICAgOyBfX05BU01fTUFKT1JfXwotCi07PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyBNYWNybyBwYWNrYWdlIHdoZW4gY29tcGlsaW5nIHdpdGggVEFTTS4KLTs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLTsgVHVybiBvZmYgdW5kZXJzY29yZXMgZm9yIGdsb2JhbHMgaWYgZGlzYWJsZWQgZm9yIGFsbCBleHRlcm5hbHMKLQotaWZkZWYgICBfX05PVV9fCi1fX05PVV9WQVJfXyAgICAgICAgID0gMQotZW5kaWYKLQotOyBEZWZpbmUgdGhlIF9fV0lORE9XU19fIHN5bWJvbCBpZiB3ZSBhcmUgY29tcGlsaW5nIGZvciBhbnkgV2luZG93cwotOyBlbnZpcm9ubWVudAotCi1pZmRlZiAgIF9fV0lORE9XUzE2X18KLV9fV0lORE9XU19fICAgICAgICAgPSAxCi1lbmRpZgotaWZkZWYgICBfX1dJTkRPV1MzMl9fCi1fX1dJTkRPV1NfXyAgICAgICAgID0gMQotX19XSU5ET1dTMzJfMzg2X18gICA9IDEKLWVuZGlmCi1pZmRlZiAgIF9fV0lOMzg2X18KLV9fV0lORE9XU19fICAgICAgICAgPSAxCi1fX1dJTkRPV1MzMl8zODZfXyAgID0gMQotZW5kaWYKLWlmZGVmICAgX19WWERfXwotX19XSU5ET1dTX18gICAgICAgICA9IDEKLV9fV0lORE9XUzMyXzM4Nl9fICAgPSAxCi0gICAgICAgIE1BU00KLSAgICAgICAgLjM4NgotICAgICAgICBOT19TRUdNRU5UUyA9IDEKLSAgICAgICAgaW5jbHVkZSB2bW0uaW5jICAgICAgICAgOyBJR05PUkUgREVQRU5ECi0gICAgICAgIGluY2x1ZGUgdnNlZ21lbnQuaW5jICAgIDsgSUdOT1JFIERFUEVORAotICAgICAgICBJREVBTAotZW5kaWYKLQotOyBNYWNyb3MgZm9yIGFjY2Vzc2luZyAnZ2VuZXJpYycgcmVnaXN0ZXJzCi0KLWlmZGVmICAgX19GTEFUX18KLSAgICAgICAgX2F4ICAgICAgICAgRVFVIGVheCAgICAgOyBFQVggaXMgdXNlZCBmb3IgYWNjdW11bGF0b3IKLSAgICAgICAgX2J4ICAgICAgICAgRVFVIGVieCAgICAgOyBFQlggaXMgdXNlZCBmb3IgYWNjdW11bGF0b3IKLSAgICAgICAgX2N4ICAgICAgICAgRVFVIGVjeCAgICAgOyBFQ1ggaXMgdXNlZCBmb3IgbG9vcGluZwotICAgICAgICBfZHggICAgICAgICBFUVUgZWR4ICAgICA7IEVEWCBpcyB1c2VkIGZvciBkYXRhIHJlZ2lzdGVyCi0gICAgICAgIF9zaSAgICAgICAgIEVRVSBlc2kgICAgIDsgRVNJIGlzIHRoZSBzb3VyY2UgaW5kZXggcmVnaXN0ZXIKLSAgICAgICAgX2RpICAgICAgICAgRVFVIGVkaSAgICAgOyBFREkgaXMgdGhlIGRlc3RpbmF0aW9uIGluZGV4IHJlZ2lzdGVyCi0gICAgICAgIF9icCAgICAgICAgIEVRVSBlYnAgICAgIDsgRUJQIGlzIHVzZWQgZm9yIGJhc2UgcG9pbnRlciByZWdpc3RlcgotICAgICAgICBfc3AgICAgICAgICBFUVUgZXNwICAgICA7IEVTUCBpcyB1c2VkIGZvciBzdGFjayBwb2ludGVyIHJlZ2lzdGVyCi0gICAgICAgIF9lcyAgICAgICAgIEVRVSAgICAgICAgIDsgRVMgYW5kIERTIGFyZSB0aGUgc2FtZSBpbiAzMiBiaXQgUE0KLSAgICAgICAgdHlwZWRlZiBVQ0hBUiBCWVRFICAgICAgOyBTaXplIG9mIGEgY2hhcmFjdGVyCi0gICAgICAgIHR5cGVkZWYgVVNIT1JUIFdPUkQgICAgIDsgU2l6ZSBvZiBhIHNob3J0Ci0gICAgICAgIHR5cGVkZWYgVUlOVCBEV09SRCAgICAgIDsgU2l6ZSBvZiBhbiBpbnRlZ2VyCi0gICAgICAgIHR5cGVkZWYgVUxPTkcgRFdPUkQgICAgIDsgU2l6ZSBvZiBhIGxvbmcKLSAgICAgICAgdHlwZWRlZiBCT09MIERXT1JEICAgICAgOyBTaXplIG9mIGEgYm9vbGVhbgotICAgICAgICB0eXBlZGVmIERQVFIgRFdPUkQgICAgICA7IFNpemUgb2YgYSBkYXRhIHBvaW50ZXIKLSAgICAgICAgdHlwZWRlZiBGRFBUUiBGV09SRCAgICAgOyBTaXplIG9mIGEgZmFyIGRhdGEgcG9pbnRlcgotICAgICAgICB0eXBlZGVmIE5EUFRSIERXT1JEICAgICA7IFNpemUgb2YgYSBuZWFyIGRhdGEgcG9pbnRlcgotICAgICAgICB0eXBlZGVmIENQVFIgRFdPUkQgICAgICA7IFNpemUgb2YgYSBjb2RlIHBvaW50ZXIKLSAgICAgICAgdHlwZWRlZiBGQ1BUUiBGV09SRCAgICAgOyBTaXplIG9mIGEgZmFyIGNvZGUgcG9pbnRlcgotICAgICAgICB0eXBlZGVmIE5DUFRSIERXT1JEICAgICA7IFNpemUgb2YgYSBuZWFyIGNvZGUgcG9pbnRlcgotICAgICAgICB0eXBlZGVmIERVSU5UIERXT1JEICAgICA7IERlY2xhcmUgYSBpbnRlZ2VyIHZhcmlhYmxlCi0gICAgICAgIEZQVFIgICAgICAgIEVRVSBORUFSICAgIDsgRGlzdGFuY2UgZm9yIGZ1bmN0aW9uIHBvaW50ZXJzCi0gICAgICAgIGludHNpemUgICAgID0gICA0ICAgICAgIDsgU2l6ZSBvZiBhbiBpbnRlZ2VyCi0gICAgICAgIGZsYXRtb2RlbCAgID0gICAxICAgICAgIDsgVGhpcyBpcyBhIGZsYXQgbWVtb3J5IG1vZGVsCi0gICAgICAgIFAzODYgICAgICAgICAgICAgICAgICAgIDsgVHVybiBvbiAzODYgY29kZSBnZW5lcmF0aW9uCi0gICAgICAgIE1PREVMICAgICAgIEZMQVQgICAgICAgIDsgU2V0IHVwIGZvciAzMiBiaXQgc2ltcGxpZmllZCBGTEFUIG1vZGVsCi1lbHNlCi0gICAgICAgIF9heCAgICAgICAgIEVRVSBheCAgICAgIDsgQVggaXMgdXNlZCBmb3IgYWNjdW11bGF0b3IKLSAgICAgICAgX2J4ICAgICAgICAgRVFVIGJ4ICAgICAgOyBCWCBpcyB1c2VkIGZvciBhY2N1bXVsYXRvcgotICAgICAgICBfY3ggICAgICAgICBFUVUgY3ggICAgICA7IENYIGlzIHVzZWQgZm9yIGxvb3BpbmcKLSAgICAgICAgX2R4ICAgICAgICAgRVFVIGR4ICAgICAgOyBEWCBpcyB1c2VkIGZvciBkYXRhIHJlZ2lzdGVyCi0gICAgICAgIF9zaSAgICAgICAgIEVRVSBzaSAgICAgIDsgU0kgaXMgdGhlIHNvdXJjZSBpbmRleCByZWdpc3RlcgotICAgICAgICBfZGkgICAgICAgICBFUVUgZGkgICAgICA7IERJIGlzIHRoZSBkZXN0aW5hdGlvbiBpbmRleCByZWdpc3RlcgotICAgICAgICBfYnAgICAgICAgICBFUVUgYnAgICAgICA7IEJQIGlzIHVzZWQgZm9yIGJhc2UgcG9pbnRlciByZWdpc3RlcgotICAgICAgICBfc3AgICAgICAgICBFUVUgc3AgICAgICA7IFNQIGlzIHVzZWQgZm9yIHN0YWNrIHBvaW50ZXIgcmVnaXN0ZXIKLSAgICAgICAgX2VzICAgICAgICAgRVFVIGVzOiAgICAgOyBFUyBpcyB1c2VkIGZvciBzZWdtZW50IG92ZXJyaWRlCi0gICAgICAgIHR5cGVkZWYgVUNIQVIgQllURSAgICAgIDsgU2l6ZSBvZiBhIGNoYXJhY3RlcgotICAgICAgICB0eXBlZGVmIFVTSE9SVCBXT1JEICAgICA7IFNpemUgb2YgYSBzaG9ydAotICAgICAgICB0eXBlZGVmIFVJTlQgV09SRCAgICAgICA7IFNpemUgb2YgYW4gaW50ZWdlcgotICAgICAgICB0eXBlZGVmIFVMT05HIERXT1JEICAgICA7IFNpemUgb2YgYSBsb25nCi0gICAgICAgIHR5cGVkZWYgQk9PTCBXT1JEICAgICAgIDsgU2l6ZSBvZiBhIGJvb2xlYW4KLSAgICAgICAgdHlwZWRlZiBEUFRSIERXT1JEICAgICAgOyBTaXplIG9mIGEgZGF0YSBwb2ludGVyCi0gICAgICAgIHR5cGVkZWYgRkRQVFIgRFdPUkQgICAgIDsgU2l6ZSBvZiBhIGZhciBkYXRhIHBvaW50ZXIKLSAgICAgICAgdHlwZWRlZiBORFBUUiBXT1JEICAgICAgOyBTaXplIG9mIGEgbmVhciBkYXRhIHBvaW50ZXIKLSAgICAgICAgdHlwZWRlZiBDUFRSIERXT1JEICAgICAgOyBTaXplIG9mIGEgY29kZSBwb2ludGVyCi0gICAgICAgIHR5cGVkZWYgRkNQVFIgRFdPUkQgICAgIDsgU2l6ZSBvZiBhIGZhciBjb2RlIHBvaW50ZXIKLSAgICAgICAgdHlwZWRlZiBOQ1BUUiBXT1JEICAgICAgOyBTaXplIG9mIGEgbmVhciBjb2RlIHBvaW50ZXIKLSAgICAgICAgdHlwZWRlZiBEVUlOVCBXT1JEICAgICAgOyBEZWNsYXJlIGEgaW50ZWdlciB2YXJpYWJsZQotICAgICAgICBGUFRSICAgICAgICBFUVUgRkFSICAgICA7IERpc3RhbmNlIGZvciBmdW5jdGlvbiBwb2ludGVycwotICAgICAgICBpbnRzaXplICAgICA9ICAgMiAgICAgICA7IFNpemUgb2YgYW4gaW50ZWdlcgotICAgICAgICBQMzg2ICAgICAgICAgICAgICAgICAgICA7IFR1cm4gb24gMzg2IGNvZGUgZ2VuZXJhdGlvbgotZW5kaWYKLSAgICAgICAgaW52ZXJ0ICAgICAgRVFVIG5vdAotCi07IFByb3ZpZGUgYSB0eXBlZGVmIGZvciByZWFsIGZsb2F0aW5nIHBvaW50IG51bWJlcnMKLQotaWZkZWYgICBET1VCTEUKLXR5cGVkZWYgUkVBTCAgICBRV09SRAotdHlwZWRlZiBEUkVBTCAgIFFXT1JECi1lbHNlCi10eXBlZGVmIFJFQUwgICAgRFdPUkQKLXR5cGVkZWYgRFJFQUwgICBEV09SRAotZW5kaWYKLQotOyBNYWNyb3MgdG8gYWNjZXNzIHRoZSBmbG9hdGluZyBwb2ludCBzdGFjayByZWdpc3RlcnMgdG8gY29udmVydCB0aGVtCi07IGZyb20gTkFTTSBzdHlsZSB0byBUQVNNIHN0eWxlCi0KLXN0MCAgICAgICAgIEVRVSAgICAgc3QoMCkKLXN0MSAgICAgICAgIEVRVSAgICAgc3QoMSkKLXN0MiAgICAgICAgIEVRVSAgICAgc3QoMikKLXN0MyAgICAgICAgIEVRVSAgICAgc3QoMykKLXN0NCAgICAgICAgIEVRVSAgICAgc3QoNCkKLXN0NSAgICAgICAgIEVRVSAgICAgc3QoNSkKLXN0NiAgICAgICAgIEVRVSAgICAgc3QoNikKLXN0NyAgICAgICAgIEVRVSAgICAgc3QoNykKLXN0OCAgICAgICAgIEVRVSAgICAgc3QoOCkKLQotOyBCb29sZWFuIHRydXRoIHZhbHVlcyAoc2FtZSBhcyB0aG9zZSBpbiBkZWJ1Zy5oKQotCi1pZm5kZWYgIF9fVlhEX18KLUZhbHNlICAgICAgID0gICAgICAgMAotVHJ1ZSAgICAgICAgPSAgICAgICAxCi1ObyAgICAgICAgICA9ICAgICAgIDAKLVllcyAgICAgICAgID0gICAgICAgMQotWWVzICAgICAgICAgPSAgICAgICAxCi1lbmRpZgotCi07IE1hY3JvcyBmb3IgdGhlIF9EQVRBIGRhdGEgc2VnbWVudC4gVGhpcyBzZWdtZW50IGNvbnRhaW5zIGluaXRpYWxpc2VkIGRhdGEuCi0KLU1BQ1JPICAgYmVnZGF0YXNlZyBuYW1lCi1pZmRlZiAgIF9fVlhEX18KLSAgICAgICAgTUFTTQotVlhEX0xPQ0tFRF9EQVRBX1NFRwotICAgICAgICBJREVBTAotZWxzZQotaWZkZWYgICBmbGF0bW9kZWwKLSAgICAgICAgREFUQVNFRwotZWxzZQotU0VHTUVOVCBfREFUQSBEV09SRCBQVUJMSUMgVVNFMTYgJ0RBVEEnCi1lbmRpZgotZW5kaWYKLUVORE0KLQotTUFDUk8gICBlbmRkYXRhc2VnIG5hbWUKLWlmZGVmICAgX19WWERfXwotICAgICAgICBNQVNNCi1WWERfTE9DS0VEX0RBVEFfRU5EUwotICAgICAgICBJREVBTAotZWxzZQotaWZuZGVmICBmbGF0bW9kZWwKLUVORFMgICAgX0RBVEEKLWVuZGlmCi1lbmRpZgotRU5ETQotCi07IE1hY3JvIGZvciB0aGUgbWFpbiBjb2RlIHNlZ21lbnQuCi0KLU1BQ1JPICAgYmVnY29kZXNlZyBuYW1lCi1pZmRlZiAgIF9fVlhEX18KLSAgICAgICAgTUFTTQotVlhEX0xPQ0tFRF9DT0RFX1NFRwotICAgICAgICBJREVBTAotZWxzZQotaWZkZWYgICBmbGF0bW9kZWwKLSAgICAgICAgQ09ERVNFRwotICAgICAgICBBU1NVTUUgIENTOkZMQVQsRFM6RkxBVCxTUzpGTEFUCi1lbHNlCi1TRUdNRU5UICZuYW1lJl9URVhUIFBBUkEgUFVCTElDIFVTRTE2ICdDT0RFJwotICAgICAgICBBU1NVTUUgQ1M6Jm5hbWUmX1RFWFQsRFM6X0RBVEEKLWVuZGlmCi1lbmRpZgotRU5ETQotCi07IE1hY3JvIGZvciBhIG5lYXIgY29kZSBzZWdtZW50Ci0KLU1BQ1JPICAgYmVnY29kZXNlZ19uZWFyCi1pZmRlZiAgIGZsYXRtb2RlbAotICAgICAgICBDT0RFU0VHCi0gICAgICAgIEFTU1VNRSAgQ1M6RkxBVCxEUzpGTEFULFNTOkZMQVQKLWVsc2UKLVNFR01FTlQgX1RFWFQgUEFSQSBQVUJMSUMgVVNFMTYgJ0NPREUnCi0gICAgICAgIEFTU1VNRSBDUzpfVEVYVCxEUzpfREFUQQotZW5kaWYKLUVORE0KLQotTUFDUk8gICBlbmRjb2Rlc2VnIG5hbWUKLWlmZGVmICAgX19WWERfXwotICAgICAgICBNQVNNCi1WWERfTE9DS0VEX0NPREVfRU5EUwotICAgICAgICBJREVBTAotZWxzZQotaWZuZGVmICBmbGF0bW9kZWwKLUVORFMgICAgJm5hbWUmX1RFWFQKLWVuZGlmCi1lbmRpZgotRU5ETQotCi1NQUNSTyAgIGVuZGNvZGVzZWdfbmVhcgotaWZuZGVmICBmbGF0bW9kZWwKLUVORFMgICAgX1RFWFQKLWVuZGlmCi1FTkRNCi0KLTsgTWFjcm8gdG8gYmUgaW52b2tlZCBhdCB0aGUgc3RhcnQgb2YgYWxsIG1vZHVsZXMgdG8gc2V0IHVwIHNlZ21lbnRzIGZvcgotOyBsYXRlciB1c2UuCi0KLU1BQ1JPICAgaGVhZGVyIG5hbWUKLWJlZ2RhdGFzZWcgbmFtZQotZW5kZGF0YXNlZyBuYW1lCi1FTkRNCi0KLTsgTWFjcm8gZm9yIGFuIGV4dGVybiBDIHN5bWJvbC4gSWYgdGhlIEMgY29tcGlsZXIgcmVxdWlyZXMgbGVhZGluZwotOyB1bmRlcnNjb3JlcywgdGhlbiB0aGUgdW5kZXJzY29yZXMgYXJlIGFkZGVkIHRvIHRoZSBzeW1ib2wgbmFtZXMsIG90aGVyd2lzZQotOyB0aGV5IGFyZSBsZWZ0IG9mZi4gVGhlIHN5bWJvbCBuYW1lIGlzIHJlZmVyZW5jZWQgaW4gdGhlIGFzc2VtYmxlciBjb2RlCi07IHVzaW5nIHRoZSBub24tdW5kZXJzY29yZWQgc3ltYm9sIG5hbWUuCi0KLU1BQ1JPICAgY2V4dGVybiBuYW1lLHNpemUKLWlmZGVmICAgX19OT1VfVkFSX18KLSAgICAgICAgRVhUUk4gICBuYW1lOnNpemUKLWVsc2UKLSAgICAgICAgRVhUUk4gICBfJm5hbWUmOnNpemUKLW5hbWUgICAgRVFVICAgICBfJm5hbWUmCi1lbmRpZgotRU5ETQotCi1NQUNSTyAgIGNleHRlcm5mdW5jIG5hbWUsc2l6ZQotaWZkZWYgICBfX05PVV9fCi0gICAgICAgIEVYVFJOICAgbmFtZTpzaXplCi1lbHNlCi0gICAgICAgIEVYVFJOICAgXyZuYW1lJjpzaXplCi1uYW1lICAgIEVRVSAgICAgXyZuYW1lJgotZW5kaWYKLUVORE0KLQotTUFDUk8gICBzdGRleHRlcm5mdW5jICAgbmFtZSxudW1fYXJncyxzaXplCi1pZmRlZiAgIFNURENBTExfTUFOR0xFCi0gICAgICAgIEVYVFJOICAgXyZuYW1lJkAmbnVtX2FyZ3MmOnNpemUKLW5hbWUgICAgRVFVICAgICBfJm5hbWUmQCZudW1fYXJncwotZWxzZQotICAgICAgICBFWFRSTiAgIG5hbWU6c2l6ZQotZW5kaWYKLUVORE0KLQotOyBNYWNybyBmb3IgYSBwdWJsaWMgQyBzeW1ib2wuIElmIHRoZSBDIGNvbXBpbGVyIHJlcXVpcmVzIGxlYWRpbmcKLTsgdW5kZXJzY29yZXMsIHRoZW4gdGhlIHVuZGVyc2NvcmVzIGFyZSBhZGRlZCB0byB0aGUgc3ltYm9sIG5hbWVzLCBvdGhlcndpc2UKLTsgdGhleSBhcmUgbGVmdCBvZmYuIFRoZSBzeW1ib2wgbmFtZSBpcyByZWZlcmVuY2VkIGluIHRoZSBhc3NlbWJsZXIgY29kZQotOyB1c2luZyB0aGUgbm9uLXVuZGVyc2NvcmVkIHN5bWJvbCBuYW1lLgotCi1NQUNSTyAgIGNwdWJsaWMgbmFtZQotaWZkZWYgICBfX05PVV9WQVJfXwotbmFtZToKLSAgICAgICAgUFVCTElDICBuYW1lCi1lbHNlCi1fJm5hbWUmOgotICAgICAgICBQVUJMSUMgIF8mbmFtZSYKLW5hbWUgICAgRVFVICAgICBfJm5hbWUmCi1lbmRpZgotRU5ETQotCi07IE1hY3JvIGZvciBhbiBnbG9iYWwgQyBzeW1ib2wuIElmIHRoZSBDIGNvbXBpbGVyIHJlcXVpcmVzIGxlYWRpbmcKLTsgdW5kZXJzY29yZXMsIHRoZW4gdGhlIHVuZGVyc2NvcmVzIGFyZSBhZGRlZCB0byB0aGUgc3ltYm9sIG5hbWVzLCBvdGhlcndpc2UKLTsgdGhleSBhcmUgbGVmdCBvZmYuIFRoZSBzeW1ib2wgbmFtZSBpcyByZWZlcmVuY2VkIGluIHRoZSBhc3NlbWJsZXIgY29kZQotOyB1c2luZyB0aGUgbm9uLXVuZGVyc2NvcmVkIHN5bWJvbCBuYW1lLgotCi1NQUNSTyAgIGNnbG9iYWwgbmFtZQotaWZkZWYgICBfX05PVV9WQVJfXwotICAgICAgICBQVUJMSUMgIG5hbWUKLWVsc2UKLSAgICAgICAgUFVCTElDICBfJm5hbWUmCi1uYW1lICAgIEVRVSAgICAgXyZuYW1lJgotZW5kaWYKLUVORE0KLQotOyBNYWNybyBmb3IgYW4gZ2xvYmFsIEMgZnVuY3Rpb24gc3ltYm9sLiBJZiB0aGUgQyBjb21waWxlciByZXF1aXJlcyBsZWFkaW5nCi07IHVuZGVyc2NvcmVzLCB0aGVuIHRoZSB1bmRlcnNjb3JlcyBhcmUgYWRkZWQgdG8gdGhlIHN5bWJvbCBuYW1lcywgb3RoZXJ3aXNlCi07IHRoZXkgYXJlIGxlZnQgb2ZmLiBUaGUgc3ltYm9sIG5hbWUgaXMgcmVmZXJlbmNlZCBpbiB0aGUgYXNzZW1ibGVyIGNvZGUKLTsgdXNpbmcgdGhlIG5vbi11bmRlcnNjb3JlZCBzeW1ib2wgbmFtZS4KLQotTUFDUk8gICBjZ2xvYmFsZnVuYyBuYW1lCi1pZmRlZiAgIF9fTk9VX18KLSAgICAgICAgUFVCTElDICBuYW1lCi1lbHNlCi0gICAgICAgIFBVQkxJQyAgXyZuYW1lJgotbmFtZSAgICBFUVUgICAgIF8mbmFtZSYKLWVuZGlmCi1FTkRNCi0KLTsgTWFjcm8gdG8gc3RhcnQgYSBDIGNhbGxhYmxlIGZ1bmN0aW9uLiBUaGlzIHdpbGwgYmUgYSBmYXIgZnVuY3Rpb24gZm9yCi07IDE2LWJpdCBjb2RlLCBhbmQgYSBuZWFyIGZ1bmN0aW9uIGZvciAzMi1iaXQgY29kZS4KLQotTUFDUk8gICBjcHJvY3N0YXRpYyBuYW1lICAgICAgICA7IFNldCB1cCBtb2RlbCBpbmRlcGVuZGFudCBwcml2YXRlIHByb2MKLWlmZGVmIGZsYXRtb2RlbAotUFJPQyAgICBuYW1lIE5FQVIKLWVsc2UKLVBST0MgICAgbmFtZSBGQVIKLWVuZGlmCi1Mb2NhbFNpemUgICA9IDAKLUVORE0KLQotTUFDUk8gICBjcHJvY3N0YXJ0IG5hbWUgICAgICAgICA7IFNldCB1cCBtb2RlbCBpbmRlcGVuZGFudCBwcm9jCi1pZmRlZiBmbGF0bW9kZWwKLWlmZGVmICAgX19OT1VfXwotUFJPQyAgICBuYW1lIE5FQVIKLWVsc2UKLVBST0MgICAgXyZuYW1lJiBORUFSCi1lbmRpZgotZWxzZQotaWZkZWYgICBfX05PVV9fCi1QUk9DICAgIG5hbWUgRkFSCi1lbHNlCi1QUk9DICAgIF8mbmFtZSYgRkFSCi1lbmRpZgotZW5kaWYKLUxvY2FsU2l6ZSAgID0gMAotICAgICAgICBjZ2xvYmFsZnVuYyBuYW1lCi1FTkRNCi0KLU1BQ1JPICAgY3Byb2NuZWFyIG5hbWUgICAgICAgICAgOyBTZXQgdXAgbmVhciBwcm9jCi1pZmRlZiAgIF9fTk9VX18KLVBST0MgICAgbmFtZSBORUFSCi1lbHNlCi1QUk9DICAgIF8mbmFtZSYgTkVBUgotZW5kaWYKLUxvY2FsU2l6ZSAgID0gMAotICAgICAgICBjZ2xvYmFsZnVuYyBuYW1lCi1FTkRNCi0KLU1BQ1JPICAgY3Byb2NmYXIgbmFtZSAgICAgICAgICAgOyBTZXQgdXAgZmFyIHByb2MKLWlmZGVmICAgX19OT1VfXwotUFJPQyAgICBuYW1lIEZBUgotZWxzZQotUFJPQyAgICBfJm5hbWUmIEZBUgotZW5kaWYKLUxvY2FsU2l6ZSAgID0gMAotICAgICAgICBjZ2xvYmFsZnVuYyBuYW1lCi1FTkRNCi0KLU1BQ1JPICAgY3Byb2NlbmQgICAgICAgICAgICAgICA7IEVuZCBwcm9jZWR1cmUgbWFjcm8KLUVORFAKLUVORE0KLQotOyBUaGlzIG1hY3JvIHNldHMgdXAgYSBwcm9jZWR1cmUgdG8gYmUgZXhwb3J0ZWQgZnJvbSBhIDE2IGJpdCBETEwuIFNpbmNlIHRoZQotOyBjYWxsaW5nIGNvbnZlbnRpb25zIGFyZSBhbHdheXMgX2ZhciBfcGFzY2FsIGZvciAxNiBiaXQgRExMJ3MsIHdlIGFjdHVhbGx5Ci07IHJlbmFtZSB0aGlzIHJvdXRpbmUgd2l0aCBhbiBleHRyYSB1bmRlcnNjb3JlIHdpdGggJ0MnIGNhbGxpbmcgY29udmVudGlvbnMKLTsgYW5kIGEgc21hbGwgRExMIHN0dWIgd2lsbCBiZSBwcm92aWRlZCBieSB0aGUgaGlnaCBsZXZlbCBjb2RlIHRvIGNhbGwgdGhlCi07IGFzc2VtYmxlciByb3V0aW5lLgotCi1NQUNSTyAgIGNwcm9jc3RhcnRkbGwxNiBuYW1lCi1pZmRlZiAgIF9fV0lORE9XUzE2X18KLWNwcm9jc3RhcnQgIF8mbmFtZSYKLWVsc2UKLWNwcm9jc3RhcnQgIG5hbWUKLWVuZGlmCi1FTkRNCi0KLTsgTWFjcm9zIGZvciBlbnRlcmluZyBhbmQgZXhpdGluZyBDIGNhbGxhYmxlIGZ1bmN0aW9ucy4gTm90ZSB0aGF0IHdlIG11c3QKLTsgYWx3YXlzIHNhdmUgYW5kIHJlc3RvcmUgdGhlIFNJIGFuZCBESSByZWdpc3RlcnMgZm9yIEMgZnVuY3Rpb25zLCBhbmQgZm9yCi07IDMyIGJpdCBDIGZ1bmN0aW9ucyB3ZSBhbHNvIG5lZWQgdG8gc2F2ZSBhbmQgcmVzdG9yZSBFQlggYW5kIGNsZWFyIHRoZQotOyBkaXJlY3Rpb24gZmxhZy4KLQotTUFDUk8gICBzYXZlX2NfcmVncwotaWZkZWYgICBmbGF0bW9kZWwKLSAgICAgICAgcHVzaCAgICBlYngKLWVuZGlmCi0gICAgICAgIHB1c2ggICAgX3NpCi0gICAgICAgIHB1c2ggICAgX2RpCi1FTkRNCi0KLU1BQ1JPICAgZW50ZXJfYwotICAgICAgICBwdXNoICAgIF9icAotICAgICAgICBtb3YgICAgIF9icCxfc3AKLSAgICBJRkRJRkkgIDxMb2NhbFNpemU+LDwwPgotICAgICAgICBzdWIgICAgIF9zcCxMb2NhbFNpemUKLSAgICBFTkRJRgotICAgICAgICBzYXZlX2NfcmVncwotRU5ETQotCi1NQUNSTyAgIHJlc3RvcmVfY19yZWdzCi0gICAgICAgIHBvcCAgICAgX2RpCi0gICAgICAgIHBvcCAgICAgX3NpCi1pZmRlZiAgIGZsYXRtb2RlbAotICAgICAgICBwb3AgICAgIGVieAotZW5kaWYKLUVORE0KLQotTUFDUk8gICBsZWF2ZV9jCi0gICAgICAgIHJlc3RvcmVfY19yZWdzCi0gICAgICAgIGNsZAotICAgIElGRElGSSAgPExvY2FsU2l6ZT4sPDA+Ci0gICAgICAgIG1vdiAgICAgX3NwLF9icAotICAgIEVORElGCi0gICAgICAgIHBvcCAgICAgX2JwCi1FTkRNCi0KLU1BQ1JPICAgdXNlX2VieAotaWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIHB1c2ggICAgZWJ4Ci1lbmRpZgotRU5ETQotCi1NQUNSTyAgIHVudXNlX2VieAotaWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIHBvcCAgICAgZWJ4Ci1lbmRpZgotRU5ETQotCi07IE1hY3JvcyBmb3Igc2F2aW5nIGFuZCByZXN0b3JpbmcgdGhlIHZhbHVlIG9mIERTLEVTLEZTLEdTIHdoZW4gaXQgaXMgdG8KLTsgYmUgdXNlZCBpbiBhc3NlbWJseSByb3V0aW5lcy4gVGhpcyBldmFsdWF0ZXMgdG8gbm90aGluZyBpbiB0aGUgZmxhdCBtZW1vcnkKLTsgbW9kZWwsIGJ1dCBpcyBzYXZlcyBhbmQgcmVzdG9yZXMgRFMgaW4gdGhlIGxhcmdlIG1lbW9yeSBtb2RlbC4KLQotTUFDUk8gICB1c2VfZHMKLWlmbmRlZiBmbGF0bW9kZWwKLSAgICAgICAgcHVzaCAgICBkcwotZW5kaWYKLUVORE0KLQotTUFDUk8gICB1bnVzZV9kcwotaWZuZGVmIGZsYXRtb2RlbAotICAgICAgICBwb3AgICAgIGRzCi1lbmRpZgotRU5ETQotCi1NQUNSTyAgIHVzZV9lcwotaWZuZGVmIGZsYXRtb2RlbAotICAgICAgICBwdXNoICAgIGVzCi1lbmRpZgotRU5ETQotCi1NQUNSTyAgIHVudXNlX2VzCi1pZm5kZWYgZmxhdG1vZGVsCi0gICAgICAgIHBvcCAgICAgZXMKLWVuZGlmCi1FTkRNCi0KLTsgTWFjcm9zIGZvciBsb2FkaW5nIHRoZSBhZGRyZXNzIG9mIGEgZGF0YSBwb2ludGVyIGludG8gYSBzZWdtZW50IGFuZAotOyBpbmRleCByZWdpc3RlciBwYWlyLiBUaGUgbWFjcm8gZXhwbGljaXRseSBsb2FkcyBEUyBvciBFUyBpbiB0aGUgMTYgYml0Ci07IG1lbW9yeSBtb2RlbCwgb3IgaXQgc2ltcGx5IGxvYWRzIHRoZSBvZmZzZXQgaW50byB0aGUgcmVnaXN0ZXIgaW4gdGhlIGZsYXQKLTsgbWVtb3J5IG1vZGVsIHNpbmNlIERTIGFuZCBFUyBhbHdheXMgcG9pbnQgdG8gYWxsIGFkZHJlc3NhYmxlIG1lbW9yeS4gWW91Ci07IG11c3QgdXNlIHRoZSBjb3JyZWN0IF9SRUcgKGllOiBfQlgpIG1hY3JvcyBmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3Nlcy4KLQotTUFDUk8gICBfbGRzICAgIHJlZywgYWRkcgotaWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIG1vdiAgICAgcmVnLGFkZHIKLWVsc2UKLSAgICAgICAgbGRzICAgICByZWcsYWRkcgotZW5kaWYKLUVORE0KLQotTUFDUk8gICBfbGVzICAgIHJlZywgYWRkcgotaWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIG1vdiAgICAgcmVnLGFkZHIKLWVsc2UKLSAgICAgICAgbGVzICAgICByZWcsYWRkcgotZW5kaWYKLUVORE0KLQotOyBNYWNyb3MgZm9yIGFkZGluZyBhbmQgc3VidHJhY3RpbmcgYSB2YWx1ZSBmcm9tIHJlZ2lzdGVycy4gVHdvIHZhbHVlIGFyZQotOyBwcm92aWRlZCwgb25lIGZvciAxNiBiaXQgbW9kZXMgYW5kIGFub3RoZXIgZm9yIDMyIGJpdCBtb2RlcyAodGhlIGV4dGVuZGVkCi07IHJlZ2lzdGVyIGlzIHVzZWQgaW4gMzIgYml0IG1vZGVzKS4KLQotTUFDUk8gICBfYWRkICAgIHJlZywgdmFsMTYsIHZhbDMyCi1pZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgYWRkICAgICBlJnJlZyYsIHZhbDMyCi1lbHNlCi0gICAgICAgIGFkZCAgICAgcmVnLCB2YWwxNgotZW5kaWYKLUVORE0KLQotTUFDUk8gICBfc3ViICAgIHJlZywgdmFsMTYsIHZhbDMyCi1pZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgc3ViICAgICBlJnJlZyYsIHZhbDMyCi1lbHNlCi0gICAgICAgIHN1YiAgICAgcmVnLCB2YWwxNgotZW5kaWYKLUVORE0KLQotOyBNYWNybyB0byBjbGVhciB0aGUgaGlnaCBvcmRlciB3b3JkIGZvciB0aGUgMzIgYml0IGV4dGVuZGVkIHJlZ2lzdGVycy4KLTsgVGhpcyBpcyB1c2VkIHRvIGNvbnZlcnQgYW4gdW5zaWduZWQgMTYgYml0IHZhbHVlIHRvIGFuIHVuc2lnbmVkIDMyIGJpdAotOyB2YWx1ZSwgYW5kIHdpbGwgZXZhbHVhdGUgdG8gbm90aGluZyBpbiAxNiBiaXQgbW9kZXMuCi0KLU1BQ1JPICAgY2xyaGkgICByZWcKLWlmZGVmICAgZmxhdG1vZGVsCi0gICAgICAgIG1vdnp4ICAgZSZyZWcmLHJlZwotZW5kaWYKLUVORE0KLQotTUFDUk8gICBzZ25oaSAgIHJlZwotaWZkZWYgICBmbGF0bW9kZWwKLSAgICAgICAgbW92c3ggICBlJnJlZyYscmVnCi1lbmRpZgotRU5ETQotCi07IE1hY3JvIHRvIGxvYWQgYW4gZXh0ZW5kZWQgcmVnaXN0ZXIgd2l0aCBhbiBpbnRlZ2VyIHZhbHVlIGluIGVpdGhlciBtb2RlCi0KLU1BQ1JPICAgbG9hZGludCByZWcsdmFsCi1pZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgbW92ICAgICBlJnJlZyYsdmFsCi1lbHNlCi0gICAgICAgIHhvciAgICAgZSZyZWcmLGUmcmVnJgotICAgICAgICBtb3YgICAgIHJlZyx2YWwKLWVuZGlmCi1FTkRNCi0KLTsgTWFjcm9zIHRvIGxvYWQgYW5kIHN0b3JlIGludGVnZXIgdmFsdWVzIHdpdGggc3RyaW5nIGluc3RydWN0aW9ucwotCi1NQUNSTyAgIExPRFNJTlQKLWlmZGVmIGZsYXRtb2RlbAotICAgICAgICBsb2RzZAotZWxzZQotICAgICAgICBsb2RzdwotZW5kaWYKLUVORE0KLQotTUFDUk8gICBTVE9TSU5UCi1pZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgc3Rvc2QKLWVsc2UKLSAgICAgICAgc3Rvc3cKLWVuZGlmCi1FTkRNCi0KLTsgTWFjcm9zIHRvIHByb3ZpZGUgcmVzYiwgcmVzdywgcmVzZCBjb21wYXRpYmlsaXR5IHdpdGggTkFTTQotCi1NQUNSTyAgIGRjbGIgICAgY291bnQKLWRiICBjb3VudCBkdXAgKDApCi1FTkRNCi0KLU1BQ1JPICAgZGNsdyAgICBjb3VudAotZHcgIGNvdW50IGR1cCAoMCkKLUVORE0KLQotTUFDUk8gICBkY2xkICAgIGNvdW50Ci1kZCAgY291bnQgZHVwICgwKQotRU5ETQotCi07IE1hY3JvcyB0byBwcm92aWRlIHJlc2IsIHJlc3csIHJlc2QgY29tcGF0aWJpbGl0eSB3aXRoIE5BU00KLQotTUFDUk8gICByZXNiICAgIGNvdW50Ci1kYiAgY291bnQgZHVwICg/KQotRU5ETQotCi1NQUNSTyAgIHJlc3cgICAgY291bnQKLWR3ICBjb3VudCBkdXAgKD8pCi1FTkRNCi0KLU1BQ1JPICAgcmVzZCAgICBjb3VudAotZGQgIGNvdW50IGR1cCAoPykKLUVORE0KLQotOyBNYWNyb3MgdG8gZGVjbGFyZSBhc3NlbWJsZXIgc3R1YnMgZm9yIGZ1bmN0aW9uIHN0cnVjdHVyZXMKLQotTUFDUk8gICBCRUdJTl9TVFVCU19ERUYgbmFtZSwgZmlyc3RPZmZzZXQKLWJlZ2RhdGFzZWcgIF9TVFVCUwotaWZkZWYgICBfX05PVV9WQVJfXwotICAgICAgICBFWFRSTiAgIG5hbWU6RFdPUkQKLVNUVUJTX1NUQVJUID0gICBuYW1lCi1lbHNlCi0gICAgICAgIEVYVFJOICAgXyZuYW1lJjpEV09SRAotbmFtZSAgICBFUVUgICAgIF8mbmFtZSYKLVNUVUJTX1NUQVJUID0gICBfJm5hbWUKLWVuZGlmCi1lbmRkYXRhc2VnICBfU1RVQlMKLWJlZ2NvZGVzZWcgIF9TVFVCUwotb2ZmID0gZmlyc3RPZmZzZXQKLUVORE0KLQotTUFDUk8gICBERUNMQVJFX1NUVUIgICAgbmFtZQotaWZkZWYgICBfX05PVV9fCi1uYW1lOgotICAgICAgICBQVUJMSUMgIG5hbWUKLWVsc2UKLV8mbmFtZToKLSAgICAgICAgUFVCTElDICBfJm5hbWUKLWVuZGlmCi0gICAgICAgIGptcCAgICAgW0RXT1JEIFNUVUJTX1NUQVJUK29mZl0KLW9mZiA9IG9mZiArIDQKLUVORE0KLQotTUFDUk8gICBTS0lQX1NUVUIgICAgbmFtZQotb2ZmID0gb2ZmICsgNAotRU5ETQotCi1NQUNSTyAgIERFQ0xBUkVfU1REQ0FMTCBuYW1lLG51bV9hcmdzCi1pZmRlZiAgIFNURENBTExfTUFOR0xFCi1fJm5hbWUmQCZudW1fYXJncyY6Ci0gICAgICAgIFBVQkxJQyAgXyZuYW1lJkAmbnVtX2FyZ3MmCi1lbHNlCi1uYW1lOgotICAgICAgICBQVUJMSUMgIG5hbWUKLWVuZGlmCi0gICAgICAgIGptcCAgICAgW0RXT1JEIFNUVUJTX1NUQVJUK29mZl0KLW9mZiA9IG9mZiArIDQKLUVORE0KLQotTUFDUk8gICBFTkRfU1RVQlNfREVGCi1lbmRjb2Rlc2VnICBfU1RVQlMKLUVORE0KLQotTUFDUk8gICBCRUdJTl9JTVBPUlRTX0RFRiAgIG5hbWUKLUJFR0lOX1NUVUJTX0RFRiBuYW1lLDQKLUVORE0KLQotaWZuZGVmIExPQ0FMX0RFQ0xBUkVfSU1QCi1NQUNSTyAgIERFQ0xBUkVfSU1QIG5hbWUsIG51bUFyZ3MKLURFQ0xBUkVfU1RVQiAgICBuYW1lCi1FTkRNCi0KLU1BQ1JPICAgU0tJUF9JTVAgbmFtZQotU0tJUF9TVFVCICAgICAgIG5hbWUKLUVORE0KLQotTUFDUk8gICBTS0lQX0lNUDIgbmFtZSwgbnVtQXJncwotREVDTEFSRV9TVFVCICAgIG5hbWUKLUVORE0KLQotTUFDUk8gICBTS0lQX0lNUDMgbmFtZQotU0tJUF9TVFVCICAgICAgIG5hbWUKLUVORE0KLWVuZGlmCi0KLU1BQ1JPICAgRU5EX0lNUE9SVFNfREVGCi1FTkRfU1RVQlNfREVGCi1FTkRNCi0KLU1BQ1JPICAgTEVBX0wgICAgcmVnLG5hbWUKLSAgICAgICAgbGVhICAgICByZWcsW25hbWVdCi1FTkRNCi0KLU1BQ1JPICAgTEVBX0cgICAgcmVnLG5hbWUKLSAgICAgICAgbGVhICAgICByZWcsW25hbWVdCi1FTkRNCi0KLWVuZGlmCi0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS94ODZlbXUuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS94ODZlbXUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ4N2Q0ZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUveDg2ZW11LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZwotKiAgICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIHB1YmxpYyBzcGVjaWZpYyBmdW5jdGlvbnMuCi0qICAgICAgICAgICAgICAgQW55IGFwcGxpY2F0aW9uIGxpbmtpbmcgYWdhaW5zdCB1cyBzaG91bGQgb25seQotKiAgICAgICAgICAgICAgIGluY2x1ZGUgdGhpcyBoZWFkZXIKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19YODZFTVVfWDg2RU1VX0gKLSNkZWZpbmUgX19YODZFTVVfWDg2RU1VX0gKLQotI2lmZGVmIFNDSVRFQ0gKLSNpbmNsdWRlICJzY2l0ZWNoLmgiCi0jZGVmaW5lIFg4NkFQSSAgX0FTTUFQSQotI2RlZmluZSBYODZBUElQIF9BU01BUElQCi10eXBlZGVmIGludCBYODZFTVVfcGlvQWRkcjsKLSNlbHNlCi0jaW5jbHVkZSAieDg2ZW11L3R5cGVzLmgiCi0jZGVmaW5lIFg4NkFQSQotI2RlZmluZSBYODZBUElQICoKLSNlbmRpZgotI2luY2x1ZGUgIng4NmVtdS9yZWdzLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIHR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgcGFjaygxKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgcG9udGVycyB0byBwcm9ncmFtbWVkIEkvTyBmdW5jdGlvbnMgdXNlZCBieSB0aGUKLWVtdWxhdG9yLiBUaGlzIGlzIHVzZWQgc28gdGhhdCB0aGUgdXNlciBwcm9ncmFtIGNhbiBob29rIGFsbCBwcm9ncmFtbWVkCi1JL08gZm9yIHRoZSBlbXVsYXRvciB0byBoYW5kbGVkIGFzIG5lY2Vzc2FyeSBieSB0aGUgdXNlciBwcm9ncmFtLiBCeQotZGVmYXVsdCB0aGUgZW11bGF0b3IgY29udGFpbnMgc2ltcGxlIGZ1bmN0aW9ucyB0aGF0IGRvIG5vdCBkbyBhY2Nlc3MgdGhlCi1oYXJkd2FyZSBpbiBhbnkgd2F5LiBUbyBhbGxvdyB0aGUgZW11YWx0b3IgYWNjZXNzIHRoZSBoYXJkd2FyZSwgeW91IHdpbGwKLW5lZWQgdG8gb3ZlcnJpZGUgdGhlIHByb2dyYW1tZWQgSS9PIGZ1bmN0aW9ucyB1c2luZyB0aGUgWDg2RU1VX3NldHVwUGlvRnVuY3MKLWZ1bmN0aW9uLgotCi1IRUFERVI6Ci14ODZlbXUuaAotCi1NRU1CRVJTOgotaW5iICAgICAtIEZ1bmN0aW9uIHRvIHJlYWQgYSBieXRlIGZyb20gYW4gSS9PIHBvcnQKLWludyAgICAgLSBGdW5jdGlvbiB0byByZWFkIGEgd29yZCBmcm9tIGFuIEkvTyBwb3J0Ci1pbmwgICAgIC0gRnVuY3Rpb24gdG8gcmVhZCBhIGR3b3JkIGZyb20gYW4gSS9PIHBvcnQKLW91dGIgICAgLSBGdW5jdGlvbiB0byB3cml0ZSBhIGJ5dGUgdG8gYW4gSS9PIHBvcnQKLW91dHcgICAgLSBGdW5jdGlvbiB0byB3cml0ZSBhIHdvcmQgdG8gYW4gSS9PIHBvcnQKLW91dGwgICAgLSBGdW5jdGlvbiB0byB3cml0ZSBhIGR3b3JkIHRvIGFuIEkvTyBwb3J0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHU4ICAgICAgKFg4NkFQSVAgaW5iKShYODZFTVVfcGlvQWRkciBhZGRyKTsKLSAgICB1MTYgICAgIChYODZBUElQIGludykoWDg2RU1VX3Bpb0FkZHIgYWRkcik7Ci0gICAgdTMyICAgICAoWDg2QVBJUCBpbmwpKFg4NkVNVV9waW9BZGRyIGFkZHIpOwotICAgIHZvaWQgICAgKFg4NkFQSVAgb3V0YikoWDg2RU1VX3Bpb0FkZHIgYWRkciwgdTggdmFsKTsKLSAgICB2b2lkICAgIChYODZBUElQIG91dHcpKFg4NkVNVV9waW9BZGRyIGFkZHIsIHUxNiB2YWwpOwotICAgIHZvaWQgICAgKFg4NkFQSVAgb3V0bCkoWDg2RU1VX3Bpb0FkZHIgYWRkciwgdTMyIHZhbCk7Ci0gICAgfSBYODZFTVVfcGlvRnVuY3M7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGF0YSBzdHJ1Y3R1cmUgY29udGFpbmluZyBwb250ZXJzIHRvIG1lbW9yeSBhY2Nlc3MgZnVuY3Rpb25zIHVzZWQgYnkgdGhlCi1lbXVsYXRvci4gVGhpcyBpcyB1c2VkIHNvIHRoYXQgdGhlIHVzZXIgcHJvZ3JhbSBjYW4gaG9vayBhbGwgbWVtb3J5Ci1hY2Nlc3MgZnVuY3Rpb25zIGFzIG5lY2Vzc2FyeSBmb3IgdGhlIGVtdWxhdG9yLiBCeSBkZWZhdWx0IHRoZSBlbXVsYXRvcgotY29udGFpbnMgc2ltcGxlIGZ1bmN0aW9ucyB0aGF0IG9ubHkgYWNjZXNzIHRoZSBpbnRlcm5hbCBtZW1vcnkgb2YgdGhlCi1lbXVsYXRvci4gSWYgeW91IG5lZWQgc3BlY2lhbGlzZWQgZnVuY3Rpb25zIHRvIGhhbmRsZSBhY2Nlc3MgdG8gZGlmZmVyZW50Ci10eXBlcyBvZiBtZW1vcnkgKGllOiBoYXJkd2FyZSBmcmFtZWJ1ZmZlciBhY2Nlc3NlcyBhbmQgQklPUyBtZW1vcnkgYWNjZXNzCi1ldGMpLCB5b3Ugd2lsbCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgdXNpbmcgdGhlIFg4NkVNVV9zZXR1cE1lbUZ1bmNzCi1mdW5jdGlvbi4KLQotSEVBREVSOgoteDg2ZW11LmgKLQotTUVNQkVSUzoKLXJkYiAgICAgLSBGdW5jdGlvbiB0byByZWFkIGEgYnl0ZSBmcm9tIGFuIGFkZHJlc3MKLXJkdyAgICAgLSBGdW5jdGlvbiB0byByZWFkIGEgd29yZCBmcm9tIGFuIGFkZHJlc3MKLXJkbCAgICAgLSBGdW5jdGlvbiB0byByZWFkIGEgZHdvcmQgZnJvbSBhbiBhZGRyZXNzCi13cmIgICAgIC0gRnVuY3Rpb24gdG8gd3JpdGUgYSBieXRlIHRvIGFuIGFkZHJlc3MKLXdydyAgICAgLSBGdW5jdGlvbiB0byB3cml0ZSBhIHdvcmQgdG8gYW4gYWRkcmVzcwotd3JsICAgICAtIEZ1bmN0aW9uIHRvIHdyaXRlIGEgZHdvcmQgdG8gYW4gYWRkcmVzcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1OCAgICAgIChYODZBUElQIHJkYikodTMyIGFkZHIpOwotICAgIHUxNiAgICAgKFg4NkFQSVAgcmR3KSh1MzIgYWRkcik7Ci0gICAgdTMyICAgICAoWDg2QVBJUCByZGwpKHUzMiBhZGRyKTsKLSAgICB2b2lkICAgIChYODZBUElQIHdyYikodTMyIGFkZHIsIHU4IHZhbCk7Ci0gICAgdm9pZCAgICAoWDg2QVBJUCB3cncpKHUzMiBhZGRyLCB1MTYgdmFsKTsKLSAgICB2b2lkICAgIChYODZBUElQIHdybCkodTMyIGFkZHIsIHUzMiB2YWwpOwotICAgIH0gWDg2RU1VX21lbUZ1bmNzOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICBIZXJlIGFyZSB0aGUgZGVmYXVsdCBtZW1vcnkgcmVhZCBhbmQgd3JpdGUKLSAgZnVuY3Rpb24gaW4gY2FzZSB0aGV5IGFyZSBuZWVkZWQgYXMgZmFsbGJhY2tzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHU4IFg4NkFQSSByZGIodTMyIGFkZHIpOwotZXh0ZXJuIHUxNiBYODZBUEkgcmR3KHUzMiBhZGRyKTsKLWV4dGVybiB1MzIgWDg2QVBJIHJkbCh1MzIgYWRkcik7Ci1leHRlcm4gdm9pZCBYODZBUEkgd3JiKHUzMiBhZGRyLCB1OCB2YWwpOwotZXh0ZXJuIHZvaWQgWDg2QVBJIHdydyh1MzIgYWRkciwgdTE2IHZhbCk7Ci1leHRlcm4gdm9pZCBYODZBUEkgd3JsKHUzMiBhZGRyLCB1MzIgdmFsKTsKLQotI3ByYWdtYSBwYWNrKCkKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gdHlwZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXR5cGVkZWYgdm9pZCAoWDg2QVBJUCBYODZFTVVfaW50ckZ1bmNzKShpbnQgbnVtKTsKLWV4dGVybiBYODZFTVVfaW50ckZ1bmNzIF9YODZFTVVfaW50clRhYlsyNTZdOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9uIFByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLwotI2VuZGlmCi0KLXZvaWQgICAgWDg2RU1VX3NldHVwTWVtRnVuY3MoWDg2RU1VX21lbUZ1bmNzICpmdW5jcyk7Ci12b2lkICAgIFg4NkVNVV9zZXR1cFBpb0Z1bmNzKFg4NkVNVV9waW9GdW5jcyAqZnVuY3MpOwotdm9pZCAgICBYODZFTVVfc2V0dXBJbnRyRnVuY3MoWDg2RU1VX2ludHJGdW5jcyBmdW5jc1tdKTsKLXZvaWQgICAgWDg2RU1VX3ByZXBhcmVGb3JJbnQoaW50IG51bSk7Ci0KLS8qIGRlY29kZS5jICovCi0KLXZvaWQgICAgWDg2RU1VX2V4ZWModm9pZCk7Ci12b2lkICAgIFg4NkVNVV9oYWx0X3N5cyh2b2lkKTsKLQotI2lmZGVmICBERUJVRwotI2RlZmluZSBIQUxUX1NZUygpICBcCi0gICAgcHJpbnRrKCJoYWx0X3N5czogZmlsZSAlcywgbGluZSAlZFxuIiwgX19GSUxFX18sIF9fTElORV9fKSwgXAotICAgIFg4NkVNVV9oYWx0X3N5cygpCi0jZWxzZQotI2RlZmluZSBIQUxUX1NZUygpICBYODZFTVVfaGFsdF9zeXMoKQotI2VuZGlmCi0KLS8qIERlYnVnIG9wdGlvbnMgKi8KLQotI2RlZmluZSBERUJVR19ERUNPREVfRiAgICAgICAgICAweDAwMDEgIC8qIHByaW50IGRlY29kZWQgaW5zdHJ1Y3Rpb24gICovCi0jZGVmaW5lIERFQlVHX1RSQUNFX0YgICAgICAgICAgIDB4MDAwMiAgLyogZHVtcCByZWdzIGJlZm9yZS9hZnRlciBleGVjdXRpb24gKi8KLSNkZWZpbmUgREVCVUdfU1RFUF9GICAgICAgICAgICAgMHgwMDA0Ci0jZGVmaW5lIERFQlVHX0RJU0FTU0VNQkxFX0YgICAgIDB4MDAwOAotI2RlZmluZSBERUJVR19CUkVBS19GICAgICAgICAgICAweDAwMTAKLSNkZWZpbmUgREVCVUdfU1ZDX0YgICAgICAgICAgICAgMHgwMDIwCi0jZGVmaW5lIERFQlVHX1NBVkVfQ1NfSVAgICAgICAgIDB4MDA0MAotI2RlZmluZSBERUJVR19GU19GICAgICAgICAgICAgICAweDAwODAKLSNkZWZpbmUgREVCVUdfUFJPQ19GICAgICAgICAgICAgMHgwMTAwCi0jZGVmaW5lIERFQlVHX1NZU0lOVF9GICAgICAgICAgIDB4MDIwMCAvKiBiaW9zIHN5c3RlbSBpbnRlcnJ1cHRzLiAqLwotI2RlZmluZSBERUJVR19UUkFDRUNBTExfRiAgICAgICAweDA0MDAKLSNkZWZpbmUgREVCVUdfSU5TVFJVTUVOVF9GICAgICAgMHgwODAwCi0jZGVmaW5lIERFQlVHX01FTV9UUkFDRV9GICAgICAgIDB4MTAwMAotI2RlZmluZSBERUJVR19JT19UUkFDRV9GICAgICAgICAweDIwMDAKLSNkZWZpbmUgREVCVUdfVFJBQ0VDQUxMX1JFR1NfRiAgMHg0MDAwCi0jZGVmaW5lIERFQlVHX0RFQ09ERV9OT1BSSU5UX0YgIDB4ODAwMAotI2RlZmluZSBERUJVR19FWElUICAgICAgICAgICAgICAweDEwMDAwCi0jZGVmaW5lIERFQlVHX1NZU19GICAgICAgICAgICAgIChERUJVR19TVkNfRnxERUJVR19GU19GfERFQlVHX1BST0NfRikKLQotdm9pZCAgICBYODZFTVVfdHJhY2VfcmVncyh2b2lkKTsKLXZvaWQgICAgWDg2RU1VX3RyYWNlX3hyZWdzKHZvaWQpOwotdm9pZCAgICBYODZFTVVfZHVtcF9tZW1vcnkodTE2IHNlZywgdTE2IG9mZiwgdTMyIGFtdCk7Ci1pbnQgICAgIFg4NkVNVV90cmFjZV9vbih2b2lkKTsKLWludCAgICAgWDg2RU1VX3RyYWNlX29mZih2b2lkKTsKLQotI2lmZGVmICBfX2NwbHVzcGx1cwotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5kIG9mICJDIiBsaW5rYWdlIGZvciBDKysgICAgICAgKi8KLSNlbmRpZgotCi0jZW5kaWYgLyogX19YODZFTVVfWDg2RU1VX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS94ODZlbXUvZnB1X3JlZ3MuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS94ODZlbXUvZnB1X3JlZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc3YjAzYy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUveDg2ZW11L2ZwdV9yZWdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZwotKiAgICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIEZQVSByZWdpc3RlciBkZWZpbml0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19YODZFTVVfRlBVX1JFR1NfSAotI2RlZmluZSBfX1g4NkVNVV9GUFVfUkVHU19ICi0KLSNpZmRlZiBYODZfRlBVX1NVUFBPUlQKLQotI3ByYWdtYSBwYWNrKDEpCi0KLS8qIEJhc2ljIDgwODcgcmVnaXN0ZXIgY2FuIGhvbGQgYW55IG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAqLwotCi11bmlvbiB4ODZfZnB1X3JlZ191IHsKLSAgICBzOCAgICAgICAgICAgICAgICAgIHRlbmJ5dGVzWzEwXTsKLSAgICBkb3VibGUgICAgICAgICAgICAgIGR2YWw7Ci0gICAgZmxvYXQgICAgICAgICAgICAgICBmdmFsOwotICAgIHMxNiAgICAgICAgICAgICAgICAgc3ZhbDsKLSAgICBzMzIgICAgICAgICAgICAgICAgIGx2YWw7Ci0gICAgfTsKLQotc3RydWN0IHg4Nl9mcHVfcmVnIHsKLSAgICB1bmlvbiB4ODZfZnB1X3JlZ191IHJlZzsKLSAgICBjaGFyICAgICAgICAgICAgICAgIHRhZzsKLSAgICB9OwotCi0vKgotICogU2luY2Ugd2UgYXJlIG5vdCBnb2luZyB0byB3b3JyeSBhYm91dCB0aGUgcHJvYmxlbXMgb2YgYWxpYXNpbmcKLSAqIHJlZ2lzdGVycywgZXZlcnkgdGltZSBhIHJlZ2lzdGVyIGlzIG1vZGlmaWVkLCBpdHMgcmVzdWx0IHR5cGUgaXMKLSAqIHNldCBpbiB0aGUgdGFnIGZpZWxkcyBmb3IgdGhhdCByZWdpc3Rlci4gIElmIHNvbWUgb3BlcmF0aW9uCi0gKiBhdHRlbXB0cyB0byBhY2Nlc3MgdGhlIHR5cGUgaW4gYSB3YXkgaW5jb25zaXN0ZW50IHdpdGggaXRzIGN1cnJlbnQKLSAqIHN0b3JhZ2UgZm9ybWF0LCB0aGVuIHdlIGZsYWcgdGhlIG9wZXJhdGlvbi4gIElmIGNvbW1vbiwgd2UnbGwKLSAqIGF0dGVtcHQgdGhlIGNvbnZlcnNpb24uCi0gKi8KLQotI2RlZmluZSAgWDg2X0ZQVV9WQUxJRCAgICAgICAgICAweDgwCi0jZGVmaW5lICBYODZfRlBVX1JFR1RZUChyKSAgICAgICgocikgJiAweDdGKQotCi0jZGVmaW5lICBYODZfRlBVX1dPUkQgICAgICAgICAgIDB4MAotI2RlZmluZSAgWDg2X0ZQVV9TSE9SVCAgICAgICAgICAweDEKLSNkZWZpbmUgIFg4Nl9GUFVfTE9ORyAgICAgICAgICAgMHgyCi0jZGVmaW5lICBYODZfRlBVX0ZMT0FUICAgICAgICAgIDB4MwotI2RlZmluZSAgWDg2X0ZQVV9ET1VCTEUgICAgICAgICAweDQKLSNkZWZpbmUgIFg4Nl9GUFVfTERCTCAgICAgICAgICAgMHg1Ci0jZGVmaW5lICBYODZfRlBVX0JTRCAgICAgICAgICAgIDB4NgotCi0jZGVmaW5lICBYODZfRlBVX1NUS1RPUCAgMAotCi1zdHJ1Y3QgeDg2X2ZwdV9yZWdpc3RlcnMgewotICAgIHN0cnVjdCB4ODZfZnB1X3JlZyAgeDg2X2ZwdV9zdGFja1s4XTsKLSAgICBpbnQgICAgICAgICAgICAgICAgIHg4Nl9mcHVfZmxhZ3M7Ci0gICAgaW50ICAgICAgICAgICAgICAgICB4ODZfZnB1X2NvbmZpZzsgICAgICAgICAvKiByb3VuZGluZyBtb2RlcywgZXRjLiAqLwotICAgIHNob3J0ICAgICAgICAgICAgICAgeDg2X2ZwdV90b3MsIHg4Nl9mcHVfYm9zOwotICAgIH07Ci0KLSNwcmFnbWEgcGFjaygpCi0KLS8qCi0gKiBUaGVyZSBhcmUgdHdvIHZlcnNpb25zIG9mIHRoZSBmb2xsb3dpbmcgbWFjcm8uCi0gKgotICogT25lIHZlcnNpb24gaXMgZm9yIG9wY29kZSBEOSwgZm9yIHdoaWNoIHRoZXJlIGFyZSBtb3JlIHRoYW4gMzIKLSAqIGluc3RydWN0aW9ucyBlbmNvZGVkIGluIHRoZSBzZWNvbmQgYnl0ZSBvZiB0aGUgb3Bjb2RlLgotICoKLSAqIFRoZSBvdGhlciB2ZXJzaW9uLCBkZWFscyB3aXRoIGFsbCB0aGUgb3RoZXIgNyBpODcgb3Bjb2RlcywgZm9yCi0gKiB3aGljaCB0aGVyZSBhcmUgb25seSAzMiBzdHJpbmdzIG5lZWRlZCB0byBkZXNjcmliZSB0aGUKLSAqIGluc3RydWN0aW9ucy4KLSAqLwotCi0jZW5kaWYgLyogWDg2X0ZQVV9TVVBQT1JUICovCi0KLSNpZmRlZiBERUJVRwotIyBkZWZpbmUgREVDT0RFX1BSSU5USU5TVFIzMih0LG1vZCxyaCxybCkgICAgICAgXAotICAgIERFQ09ERV9QUklOVEYodFsobW9kPDwzKSsocmgpXSk7Ci0jIGRlZmluZSBERUNPREVfUFJJTlRJTlNUUjI1Nih0LG1vZCxyaCxybCkgICAgICBcCi0gICAgREVDT0RFX1BSSU5URih0Wyhtb2Q8PDYpKyhyaDw8MykrKHJsKV0pOwotI2Vsc2UKLSMgZGVmaW5lIERFQ09ERV9QUklOVElOU1RSMzIodCxtb2QscmgscmwpCi0jIGRlZmluZSBERUNPREVfUFJJTlRJTlNUUjI1Nih0LG1vZCxyaCxybCkKLSNlbmRpZgotCi0jZW5kaWYgLyogX19YODZFTVVfRlBVX1JFR1NfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3g4NmVtdS9yZWdzLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUveDg2ZW11L3JlZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEyMDE3Yi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2luY2x1ZGUveDg2ZW11L3JlZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCi0qICAgICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAotKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0qICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCi0qICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCi0qICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubwotKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KLSogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0qCi0qICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0qICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi0qICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLSogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKLSoKLSogRGVzY3JpcHRpb246ICBIZWFkZXIgZmlsZSBmb3IgeDg2IHJlZ2lzdGVyIGRlZmluaXRpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX1g4NkVNVV9SRUdTX0gKLSNkZWZpbmUgX19YODZFTVVfUkVHU19ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIHR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNwcmFnbWEgcGFjaygxKQotCi0vKgotICogR2VuZXJhbCBFQVgsIEVCWCwgRUNYLCBFRFggdHlwZSByZWdpc3RlcnMuICBOb3RlIHRoYXQgZm9yCi0gKiBwb3J0YWJpbGl0eSwgYW5kIHNwZWVkLCB0aGUgaXNzdWUgb2YgYnl0ZSBzd2FwcGluZyBpcyBub3QgYWRkcmVzc2VkCi0gKiBpbiB0aGUgcmVnaXN0ZXJzLiAgQWxsIHJlZ2lzdGVycyBhcmUgc3RvcmVkIGluIHRoZSBkZWZhdWx0IGZvcm1hdAotICogYXZhaWxhYmxlIG9uIHRoZSBob3N0IG1hY2hpbmUuICBUaGUgb25seSBjcml0aWNhbCBpc3N1ZSBpcyB0aGF0IHRoZQotICogcmVnaXN0ZXJzIHNob3VsZCBsaW5lIHVwIEVYQUNUTFkgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHRoZXkgZG8gaW4KLSAqIHRoZSAzODYuICBUaGF0IGlzOgotICoKLSAqIEVBWCAmIDB4ZmYgID09PSBBTAotICogRUFYICYgMHhmZmZmID09IEFYCi0gKgotICogZXRjLiAgVGhlIHJlc3VsdCBpcyB0aGF0IGFsb3Qgb2YgdGhlIGNhbGN1bGF0aW9ucyBjYW4gdGhlbiBiZQotICogZG9uZSB1c2luZyB0aGUgbmF0aXZlIGluc3RydWN0aW9uIHNldCBmdWxseS4KLSAqLwotCi0jaWZkZWYgIF9fQklHX0VORElBTl9fCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1MzIgZV9yZWc7Ci0gICAgfSBJMzJfcmVnX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1MTYgZmlsbGVyMCwgeF9yZWc7Ci0gICAgfSBJMTZfcmVnX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1OCBmaWxsZXIwLCBmaWxsZXIxLCBoX3JlZywgbF9yZWc7Ci0gICAgfSBJOF9yZWdfdDsKLQotI2Vsc2UgLyogIV9fQklHX0VORElBTl9fICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1MzIgZV9yZWc7Ci0gICAgfSBJMzJfcmVnX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1MTYgeF9yZWc7Ci0gICAgfSBJMTZfcmVnX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1OCBsX3JlZywgaF9yZWc7Ci0gICAgfSBJOF9yZWdfdDsKLQotI2VuZGlmIC8qIEJJR19FTkRJQU4gKi8KLQotdHlwZWRlZiB1bmlvbiB7Ci0gICAgSTMyX3JlZ190ICAgSTMyX3JlZzsKLSAgICBJMTZfcmVnX3QgICBJMTZfcmVnOwotICAgIEk4X3JlZ190ICAgIEk4X3JlZzsKLSAgICB9IGkzODZfZ2VuZXJhbF9yZWdpc3RlcjsKLQotc3RydWN0IGkzODZfZ2VuZXJhbF9yZWdzIHsKLSAgICBpMzg2X2dlbmVyYWxfcmVnaXN0ZXIgQSwgQiwgQywgRDsKLSAgICB9OwotCi10eXBlZGVmIHN0cnVjdCBpMzg2X2dlbmVyYWxfcmVncyBHZW5fcmVnX3Q7Ci0KLXN0cnVjdCBpMzg2X3NwZWNpYWxfcmVncyB7Ci0gICAgaTM4Nl9nZW5lcmFsX3JlZ2lzdGVyIFNQLCBCUCwgU0ksIERJLCBJUDsKLSAgICB1MzIgRkxBR1M7Ci0gICAgfTsKLQotLyoKLSAqIFNlZ21lbnQgcmVnaXN0ZXJzIGhlcmUgcmVwcmVzZW50IHRoZSAxNiBiaXQgcXVhbnRpdGllcwotICogQ1MsIERTLCBFUywgU1MuCi0gKi8KLQotc3RydWN0IGkzODZfc2VnbWVudF9yZWdzIHsKLSAgICB1MTYgQ1MsIERTLCBTUywgRVMsIEZTLCBHUzsKLSAgICB9OwotCi0vKiA4IGJpdCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUl9BSCAgZ2VuLkEuSThfcmVnLmhfcmVnCi0jZGVmaW5lIFJfQUwgIGdlbi5BLkk4X3JlZy5sX3JlZwotI2RlZmluZSBSX0JIICBnZW4uQi5JOF9yZWcuaF9yZWcKLSNkZWZpbmUgUl9CTCAgZ2VuLkIuSThfcmVnLmxfcmVnCi0jZGVmaW5lIFJfQ0ggIGdlbi5DLkk4X3JlZy5oX3JlZwotI2RlZmluZSBSX0NMICBnZW4uQy5JOF9yZWcubF9yZWcKLSNkZWZpbmUgUl9ESCAgZ2VuLkQuSThfcmVnLmhfcmVnCi0jZGVmaW5lIFJfREwgIGdlbi5ELkk4X3JlZy5sX3JlZwotCi0vKiAxNiBiaXQgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFJfQVggIGdlbi5BLkkxNl9yZWcueF9yZWcKLSNkZWZpbmUgUl9CWCAgZ2VuLkIuSTE2X3JlZy54X3JlZwotI2RlZmluZSBSX0NYICBnZW4uQy5JMTZfcmVnLnhfcmVnCi0jZGVmaW5lIFJfRFggIGdlbi5ELkkxNl9yZWcueF9yZWcKLQotLyogMzIgYml0IGV4dGVuZGVkIHJlZ2lzdGVycyAqLwotI2RlZmluZSBSX0VBWCAgZ2VuLkEuSTMyX3JlZy5lX3JlZwotI2RlZmluZSBSX0VCWCAgZ2VuLkIuSTMyX3JlZy5lX3JlZwotI2RlZmluZSBSX0VDWCAgZ2VuLkMuSTMyX3JlZy5lX3JlZwotI2RlZmluZSBSX0VEWCAgZ2VuLkQuSTMyX3JlZy5lX3JlZwotCi0vKiBzcGVjaWFsIHJlZ2lzdGVycyAqLwotI2RlZmluZSBSX1NQICBzcGMuU1AuSTE2X3JlZy54X3JlZwotI2RlZmluZSBSX0JQICBzcGMuQlAuSTE2X3JlZy54X3JlZwotI2RlZmluZSBSX1NJICBzcGMuU0kuSTE2X3JlZy54X3JlZwotI2RlZmluZSBSX0RJICBzcGMuREkuSTE2X3JlZy54X3JlZwotI2RlZmluZSBSX0lQICBzcGMuSVAuSTE2X3JlZy54X3JlZwotI2RlZmluZSBSX0ZMRyBzcGMuRkxBR1MKLQotLyogc3BlY2lhbCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUl9TUCAgc3BjLlNQLkkxNl9yZWcueF9yZWcKLSNkZWZpbmUgUl9CUCAgc3BjLkJQLkkxNl9yZWcueF9yZWcKLSNkZWZpbmUgUl9TSSAgc3BjLlNJLkkxNl9yZWcueF9yZWcKLSNkZWZpbmUgUl9ESSAgc3BjLkRJLkkxNl9yZWcueF9yZWcKLSNkZWZpbmUgUl9JUCAgc3BjLklQLkkxNl9yZWcueF9yZWcKLSNkZWZpbmUgUl9GTEcgc3BjLkZMQUdTCi0KLS8qIHNwZWNpYWwgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFJfRVNQICBzcGMuU1AuSTMyX3JlZy5lX3JlZwotI2RlZmluZSBSX0VCUCAgc3BjLkJQLkkzMl9yZWcuZV9yZWcKLSNkZWZpbmUgUl9FU0kgIHNwYy5TSS5JMzJfcmVnLmVfcmVnCi0jZGVmaW5lIFJfRURJICBzcGMuREkuSTMyX3JlZy5lX3JlZwotI2RlZmluZSBSX0VJUCAgc3BjLklQLkkzMl9yZWcuZV9yZWcKLSNkZWZpbmUgUl9FRkxHIHNwYy5GTEFHUwotCi0vKiBzZWdtZW50IHJlZ2lzdGVycyAqLwotI2RlZmluZSBSX0NTICBzZWcuQ1MKLSNkZWZpbmUgUl9EUyAgc2VnLkRTCi0jZGVmaW5lIFJfU1MgIHNlZy5TUwotI2RlZmluZSBSX0VTICBzZWcuRVMKLSNkZWZpbmUgUl9GUyAgc2VnLkZTCi0jZGVmaW5lIFJfR1MgIHNlZy5HUwotCi0vKiBmbGFnIGNvbmRpdGlvbnMgICAqLwotI2RlZmluZSBGQl9DRiAweDAwMDEgICAgICAgICAgICAvKiBDQVJSWSBmbGFnICAqLwotI2RlZmluZSBGQl9QRiAweDAwMDQgICAgICAgICAgICAvKiBQQVJJVFkgZmxhZyAqLwotI2RlZmluZSBGQl9BRiAweDAwMTAgICAgICAgICAgICAvKiBBVVggIGZsYWcgICAqLwotI2RlZmluZSBGQl9aRiAweDAwNDAgICAgICAgICAgICAvKiBaRVJPIGZsYWcgICAqLwotI2RlZmluZSBGQl9TRiAweDAwODAgICAgICAgICAgICAvKiBTSUdOIGZsYWcgICAqLwotI2RlZmluZSBGQl9URiAweDAxMDAgICAgICAgICAgICAvKiBUUkFQIGZsYWcgICAqLwotI2RlZmluZSBGQl9JRiAweDAyMDAgICAgICAgICAgICAvKiBJTlRFUlJVUFQgRU5BQkxFIGZsYWcgKi8KLSNkZWZpbmUgRkJfREYgMHgwNDAwICAgICAgICAgICAgLyogRElSIGZsYWcgICAgKi8KLSNkZWZpbmUgRkJfT0YgMHgwODAwICAgICAgICAgICAgLyogT1ZFUkZMT1cgZmxhZyAqLwotCi0vKiA4MDI4NiBhbmQgYWJvdmUgYWx3YXlzIGhhdmUgYml0IzEgc2V0ICovCi0jZGVmaW5lIEZfQUxXQVlTX09OICAoMHgwMDAyKSAgIC8qIGZsYWcgYml0cyBhbHdheXMgb24gKi8KLQotLyoKLSAqIERlZmluZSBhIG1hc2sgZm9yIG9ubHkgdGhvc2UgZmxhZyBiaXRzIHdlIHdpbGwgZXZlciBwYXNzIGJhY2sKLSAqICh2aWEgUFVTSEYpCi0gKi8KLSNkZWZpbmUgRl9NU0sgKEZCX0NGfEZCX1BGfEZCX0FGfEZCX1pGfEZCX1NGfEZCX1RGfEZCX0lGfEZCX0RGfEZCX09GKQotCi0vKiBmb2xsb3dpbmcgYml0cyBtYXNrZWQgaW4gdG8gYSAxNmJpdCBxdWFudGl0eSAqLwotCi0jZGVmaW5lIEZfQ0YgMHgwMDAxICAgICAgICAgICAgIC8qIENBUlJZIGZsYWcgICovCi0jZGVmaW5lIEZfUEYgMHgwMDA0ICAgICAgICAgICAgIC8qIFBBUklUWSBmbGFnICovCi0jZGVmaW5lIEZfQUYgMHgwMDEwICAgICAgICAgICAgIC8qIEFVWCAgZmxhZyAgICovCi0jZGVmaW5lIEZfWkYgMHgwMDQwICAgICAgICAgICAgIC8qIFpFUk8gZmxhZyAgICovCi0jZGVmaW5lIEZfU0YgMHgwMDgwICAgICAgICAgICAgIC8qIFNJR04gZmxhZyAgICovCi0jZGVmaW5lIEZfVEYgMHgwMTAwICAgICAgICAgICAgIC8qIFRSQVAgZmxhZyAgICovCi0jZGVmaW5lIEZfSUYgMHgwMjAwICAgICAgICAgICAgIC8qIElOVEVSUlVQVCBFTkFCTEUgZmxhZyAqLwotI2RlZmluZSBGX0RGIDB4MDQwMCAgICAgICAgICAgICAvKiBESVIgZmxhZyAgICAqLwotI2RlZmluZSBGX09GIDB4MDgwMCAgICAgICAgICAgICAvKiBPVkVSRkxPVyBmbGFnICovCi0KLSNkZWZpbmUgVE9HR0xFX0ZMQUcoZmxhZykgICAgICAgKE0ueDg2LlJfRkxHIF49IChmbGFnKSkKLSNkZWZpbmUgU0VUX0ZMQUcoZmxhZykgICAgICAgICAgKE0ueDg2LlJfRkxHIHw9IChmbGFnKSkKLSNkZWZpbmUgQ0xFQVJfRkxBRyhmbGFnKSAgICAgICAgKE0ueDg2LlJfRkxHICY9IH4oZmxhZykpCi0jZGVmaW5lIEFDQ0VTU19GTEFHKGZsYWcpICAgICAgIChNLng4Ni5SX0ZMRyAmIChmbGFnKSkKLSNkZWZpbmUgQ0xFQVJBTExfRkxBRyhtKSAgICAgICAgKE0ueDg2LlJfRkxHID0gMCkKLQotI2RlZmluZSBDT05ESVRJT05BTF9TRVRfRkxBRyhDT05ELEZMQUcpIFwKLSAgaWYgKENPTkQpIFNFVF9GTEFHKEZMQUcpOyBlbHNlIENMRUFSX0ZMQUcoRkxBRykKLQotI2RlZmluZSBGX1BGX0NBTEMgMHgwMTAwMDAgICAgICAvKiBQQVJJVFkgZmxhZyBoYXMgYmVlbiBjYWxjZWQgICAgKi8KLSNkZWZpbmUgRl9aRl9DQUxDIDB4MDIwMDAwICAgICAgLyogWkVSTyBmbGFnIGhhcyBiZWVuIGNhbGNlZCAgICAgICovCi0jZGVmaW5lIEZfU0ZfQ0FMQyAweDA0MDAwMCAgICAgIC8qIFNJR04gZmxhZyBoYXMgYmVlbiBjYWxjZWQgICAgICAqLwotCi0jZGVmaW5lIEZfQUxMX0NBTEMgICAgICAweGZmMDAwMCAgICAgICAgLyogQWxsIGhhdmUgYmVlbiBjYWxjZWQgICAqLwotCi0vKgotICogRW11bGF0b3IgbWFjaGluZSBzdGF0ZS4KLSAqIFNlZ21lbnQgdXNhZ2UgY29udHJvbC4KLSAqLwotI2RlZmluZSBTWVNNT0RFX1NFR19EU19TUyAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFNZU01PREVfU0VHT1ZSX0NTICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgU1lTTU9ERV9TRUdPVlJfRFMgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBTWVNNT0RFX1NFR09WUl9FUyAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIFNZU01PREVfU0VHT1ZSX0ZTICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgU1lTTU9ERV9TRUdPVlJfR1MgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBTWVNNT0RFX1NFR09WUl9TUyAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIFNZU01PREVfUFJFRklYX1JFUEUgICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgU1lTTU9ERV9QUkVGSVhfUkVQTkUgICAgMHgwMDAwMDEwMAotI2RlZmluZSBTWVNNT0RFX1BSRUZJWF9EQVRBICAgICAweDAwMDAwMjAwCi0jZGVmaW5lIFNZU01PREVfUFJFRklYX0FERFIgICAgIDB4MDAwMDA0MDAKLSNkZWZpbmUgU1lTTU9ERV9JTlRSX1BFTkRJTkcgICAgMHgxMDAwMDAwMAotI2RlZmluZSBTWVNNT0RFX0VYVFJOX0lOVFIgICAgICAweDIwMDAwMDAwCi0jZGVmaW5lIFNZU01PREVfSEFMVEVEICAgICAgICAgIDB4NDAwMDAwMDAKLQotI2RlZmluZSBTWVNNT0RFX1NFR01BU0sgKFNZU01PREVfU0VHX0RTX1NTICAgICAgfCBcCi0JCQkgU1lTTU9ERV9TRUdPVlJfQ1MgICAgICB8IFwKLQkJCSBTWVNNT0RFX1NFR09WUl9EUyAgICAgIHwgXAotCQkJIFNZU01PREVfU0VHT1ZSX0VTICAgICAgfCBcCi0JCQkgU1lTTU9ERV9TRUdPVlJfRlMgICAgICB8IFwKLQkJCSBTWVNNT0RFX1NFR09WUl9HUyAgICAgIHwgXAotCQkJIFNZU01PREVfU0VHT1ZSX1NTKQotI2RlZmluZSBTWVNNT0RFX0NMUk1BU0sgKFNZU01PREVfU0VHX0RTX1NTICAgICAgfCBcCi0JCQkgU1lTTU9ERV9TRUdPVlJfQ1MgICAgICB8IFwKLQkJCSBTWVNNT0RFX1NFR09WUl9EUyAgICAgIHwgXAotCQkJIFNZU01PREVfU0VHT1ZSX0VTICAgICAgfCBcCi0JCQkgU1lTTU9ERV9TRUdPVlJfRlMgICAgICB8IFwKLQkJCSBTWVNNT0RFX1NFR09WUl9HUyAgICAgIHwgXAotCQkJIFNZU01PREVfU0VHT1ZSX1NTICAgICAgfCBcCi0JCQkgU1lTTU9ERV9QUkVGSVhfREFUQSAgICB8IFwKLQkJCSBTWVNNT0RFX1BSRUZJWF9BRERSKQotCi0jZGVmaW5lICBJTlRSX1NZTkNIICAgICAgICAgICAweDEKLSNkZWZpbmUgIElOVFJfQVNZTkNIICAgICAgICAgIDB4MgotI2RlZmluZSAgSU5UUl9IQUxURUQgICAgICAgICAgMHg0Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBzdHJ1Y3QgaTM4Nl9nZW5lcmFsX3JlZ3MgICAgZ2VuOwotICAgIHN0cnVjdCBpMzg2X3NwZWNpYWxfcmVncyAgICBzcGM7Ci0gICAgc3RydWN0IGkzODZfc2VnbWVudF9yZWdzICAgIHNlZzsKLSAgICAvKgotICAgICAqIE1PREUgY29udGFpbnMgaW5mb3JtYXRpb24gb246Ci0gICAgICogIFJFUEUgcHJlZml4ICAgICAgICAgICAgIDIgYml0cyAgcmVwZSxyZXBuZQotICAgICAqICBTRUdNRU5UIG92ZXJyaWRlcyAgICAgICA1IGJpdHMgIG5vcm1hbCxEUyxTUyxDUyxFUwotICAgICAqICBEZWxheWVkIGZsYWcgc2V0ICAgICAgICAzIGJpdHMgICh6ZXJvLCBzaWduZWQsIHBhcml0eSkKLSAgICAgKiAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgNiBiaXRzCi0gICAgICogIGludGVycnVwdCAjICAgICAgICAgICAgIDggYml0cyAgaW5zdHJ1Y3Rpb24gcmFpc2VkIGludGVycnVwdAotICAgICAqICBCSU9TIHZpZGVvIHNlZ3JlZ3MgICAgICA0IGJpdHMKLSAgICAgKiAgSW50ZXJydXB0IFBlbmRpbmcgICAgICAgMSBiaXRzCi0gICAgICogIEV4dGVybiBpbnRlcnJ1cHQgICAgICAgIDEgYml0cwotICAgICAqICBIYWx0ZWQgICAgICAgICAgICAgICAgICAxIGJpdHMKLSAgICAgKi8KLSAgICBsb25nICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTsKLSAgICB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgaW50bm87Ci0gICAgdm9sYXRpbGUgaW50ICAgICAgICAgICAgICAgIGludHI7ICAgLyogbWFzayBvZiBwZW5kaW5nIGludGVycnVwdHMgKi8KLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWc7Ci0jaWZkZWYgREVCVUcKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2s7Ci0gICAgdTE2ICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkX2lwOwotICAgIHUxNiAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlZF9jczsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgZW5jX3BvczsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgZW5jX3N0cl9wb3M7Ci0gICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9idWZbMzJdOyAvKiBlbmNvZGVkIGJ5dGUgc3RyZWFtICAqLwotICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkX2J1ZlsyNTZdOyAvKiBkaXNhc3NlbWJsZWQgc3RyaW5ncyAqLwotI2VuZGlmCi0gICAgfSBYODZFTVVfcmVnczsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TdHJ1Y3R1cmUgbWFpbnRhaW5pbmcgdGhlIGVtdWxhdG9yIG1hY2hpbmUgc3RhdGUuCi0KLU1FTUJFUlM6Ci14ODYgICAgICAgICAgICAgLSBYODYgcmVnaXN0ZXJzCi1tZW1fYmFzZSAgICAgICAgLSBCYXNlIHJlYWwgbW9kZSBtZW1vcnkgZm9yIHRoZSBlbXVsYXRvcgotbWVtX3NpemUgICAgICAgIC0gU2l6ZSBvZiB0aGUgcmVhbCBtb2RlIG1lbW9yeSBibG9jayBmb3IgdGhlIGVtdWxhdG9yCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFg4NkVNVV9yZWdzICAgICB4ODY7Ci0gICAgdW5zaWduZWQgbG9uZyAgIG1lbV9iYXNlOwotICAgIHVuc2lnbmVkIGxvbmcgICBtZW1fc2l6ZTsKLSAgICB2b2lkKiAgICAgICAgICAgcHJpdmF0ZTsKLSAgICB9IFg4NkVNVV9zeXNFbnY7Ci0KLSNwcmFnbWEgcGFjaygpCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiAgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVzZSAiQyIgbGlua2FnZSB3aGVuIGluIEMrKyBtb2RlICovCi0jZW5kaWYKLQotLyogR2xvYmFsIGVtdWxhdG9yIG1hY2hpbmUgc3RhdGUuCi0gKgotICogV2Uga2VlcCBpdCBnbG9iYWwgdG8gYXZvaWQgcG9pbnRlciBkZXJlZmVyZW5jZXMgaW4gdGhlIGNvZGUgZm9yIHNwZWVkLgotICovCi0KLWV4dGVybiAgICBYODZFTVVfc3lzRW52IF9YODZFTVVfZW52OwotI2RlZmluZSAgIE0gICAgICAgICAgICAgX1g4NkVNVV9lbnYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbiBQcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogRnVuY3Rpb24gdG8gbG9nIGluZm9ybWF0aW9uIGF0IHJ1bnRpbWUgKi8KLQotLyp2b2lkICAgIHByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLik7ICovCi0KLSNpZmRlZiAgX19jcGx1c3BsdXMKLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiAiQyIgbGlua2FnZSBmb3IgQysrICAgICAgICovCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fWDg2RU1VX1JFR1NfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3g4NmVtdS90eXBlcy5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9pbmNsdWRlL3g4NmVtdS90eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTE3YzU0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvaW5jbHVkZS94ODZlbXUvdHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKLSogICAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCi0qICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0qICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci0qICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKLSogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKLSogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCi0qICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgotKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSoKLSogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKLSogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgotKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAotKgotKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIGZvciB4ODYgZW11bGF0b3IgdHlwZSBkZWZpbml0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19YODZFTVVfVFlQRVNfSAotI2RlZmluZSBfX1g4NkVNVV9UWVBFU19ICi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hY3JvcyBhbmQgdHlwZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogQ3VycmVudGx5IG9ubHkgZm9yIExpbnV4LzMyYml0ICovCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoTk9fTE9OR19MT05HKQotI2RlZmluZSBfX0hBU19MT05HX0xPTkdfXwotI2VuZGlmCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICB1ODsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICB1MTY7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICAgdTMyOwotI2lmZGVmIF9fSEFTX0xPTkdfTE9OR19fCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyAgdTY0OwotI2VuZGlmCi0KLXR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICBzODsKLXR5cGVkZWYgc2hvcnQgICAgICAgICAgICAgICBzMTY7Ci10eXBlZGVmIGxvbmcgICAgICAgICAgICAgICAgczMyOwotI2lmZGVmIF9fSEFTX0xPTkdfTE9OR19fCi10eXBlZGVmIGxvbmcgbG9uZyAgICAgICAgICAgczY0OwotI2VuZGlmCi0KLS8qdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICB1aW50OyovCi10eXBlZGVmIGludCAgICAgICAgICAgICAgICAgc2ludDsKLQotdHlwZWRlZiB1MTYgWDg2RU1VX3Bpb0FkZHI7Ci0KLSNlbmRpZiAgLyogX19YODZFTVVfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvZGVidWcvbGludXgvZ2NjL2dsaWJjLnNvL3JlYWRtZS50eHQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9kZWJ1Zy9saW51eC9nY2MvZ2xpYmMuc28vcmVhZG1lLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ4N2VmZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9kZWJ1Zy9saW51eC9nY2MvZ2xpYmMuc28vcmVhZG1lLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRoaXMgZmlsZSBpcyBqdXN0IHRvIGVuc3VyZSB0aGF0IHRoZSBkaXJlY3RvcnkgaXMgY3JlYXRlZC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbGliL2RlYnVnL2xpbnV4L2djYy9nbGliYy9yZWFkbWUudHh0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvZGVidWcvbGludXgvZ2NjL2dsaWJjL3JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkODdlZmYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvZGVidWcvbGludXgvZ2NjL2dsaWJjL3JlYWRtZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1UaGlzIGZpbGUgaXMganVzdCB0byBlbnN1cmUgdGhhdCB0aGUgZGlyZWN0b3J5IGlzIGNyZWF0ZWQuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9kZWJ1Zy9saW51eC9nY2MvbGliYy5zby9yZWFkbWUudHh0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvZGVidWcvbGludXgvZ2NjL2xpYmMuc28vcmVhZG1lLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ4N2VmZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9kZWJ1Zy9saW51eC9nY2MvbGliYy5zby9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotVGhpcyBmaWxlIGlzIGp1c3QgdG8gZW5zdXJlIHRoYXQgdGhlIGRpcmVjdG9yeSBpcyBjcmVhdGVkLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvZGVidWcvbGludXgvZ2NjL2xpYmMvcmVhZG1lLnR4dCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbGliL2RlYnVnL2xpbnV4L2djYy9saWJjL3JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkODdlZmYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvZGVidWcvbGludXgvZ2NjL2xpYmMvcmVhZG1lLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRoaXMgZmlsZSBpcyBqdXN0IHRvIGVuc3VyZSB0aGF0IHRoZSBkaXJlY3RvcnkgaXMgY3JlYXRlZC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbGliL3JlbGVhc2UvbGludXgvZ2NjL2dsaWJjLnNvL3JlYWRtZS50eHQgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9yZWxlYXNlL2xpbnV4L2djYy9nbGliYy5zby9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDg3ZWZmLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbGliL3JlbGVhc2UvbGludXgvZ2NjL2dsaWJjLnNvL3JlYWRtZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1UaGlzIGZpbGUgaXMganVzdCB0byBlbnN1cmUgdGhhdCB0aGUgZGlyZWN0b3J5IGlzIGNyZWF0ZWQuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9yZWxlYXNlL2xpbnV4L2djYy9nbGliYy9yZWFkbWUudHh0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvcmVsZWFzZS9saW51eC9nY2MvZ2xpYmMvcmVhZG1lLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ4N2VmZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9yZWxlYXNlL2xpbnV4L2djYy9nbGliYy9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotVGhpcyBmaWxlIGlzIGp1c3QgdG8gZW5zdXJlIHRoYXQgdGhlIGRpcmVjdG9yeSBpcyBjcmVhdGVkLgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvcmVsZWFzZS9saW51eC9nY2MvbGliYy5zby9yZWFkbWUudHh0IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9saWIvcmVsZWFzZS9saW51eC9nY2MvbGliYy5zby9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDg3ZWZmLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbGliL3JlbGVhc2UvbGludXgvZ2NjL2xpYmMuc28vcmVhZG1lLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRoaXMgZmlsZSBpcyBqdXN0IHRvIGVuc3VyZSB0aGF0IHRoZSBkaXJlY3RvcnkgaXMgY3JlYXRlZC4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbGliL3JlbGVhc2UvbGludXgvZ2NjL2xpYmMvcmVhZG1lLnR4dCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbGliL3JlbGVhc2UvbGludXgvZ2NjL2xpYmMvcmVhZG1lLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ4N2VmZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL2xpYi9yZWxlYXNlL2xpbnV4L2djYy9saWJjL3JlYWRtZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1UaGlzIGZpbGUgaXMganVzdCB0byBlbnN1cmUgdGhhdCB0aGUgZGlyZWN0b3J5IGlzIGNyZWF0ZWQuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2JjMTYubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2JjMTYubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNGZlNzYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9iYzE2Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKLSMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAotIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCi0jICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KLSMKLSMgICAgICAgICAgICAgICBCb3JsYW5kIEMrKyA0LnggMTYgYml0IHZlcnNpb24uIFN1cHBvcnRzIDE2IGJpdCBET1MsCi0jICAgICAgICAgICAgICAgRFBNSTE2IERPUyBleHRlbmRlciBhbmQgMTYgYml0IFdpbmRvd3MgZGV2ZWxvcG1lbnQuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKLS5JTVBPUlQ6IFNDSVRFQ0gKLS5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgotCi0jIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKLS5JTVBPUlQgLklHTk9SRSA6IFVTRV9XSU4xNiBVU0VfQkM1IEJDX0xJQkJBU0UgVVNFX1dJTjk1Ci0KLSMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZwotICAgQ0MgICAgICAgICAgIDo9IGJjYwotICAgQ0ZMQUdTICAgICAgIDo9IC1tbCAtSD1iY2Muc3ltIC1pNjAgLWQgLWRjIC00IC1mMjg3Ci0uSUYgJChVU0VfVEFTTTMyKQotICAgQVMgICAgICAgICAgIDo9IHRhc20zMgotLkVMSUYgJChVU0VfVEFTTVgpCi0gICBBUyAgICAgICAgICAgOj0gdGFzbXgKLS5FTFNFCi0gICBBUyAgICAgICAgICAgOj0gdGFzbQotLkVORElGCi0gICBBU0ZMQUdTICAgICAgOj0gL3QgL214IC9tIC9pSU5DTFVERSAvaUlOQ0xVREUgL2kkKFNDSVRFQ0gpXElOQ0xVREUKLSAgIExEICAgICAgICAgICA6PSBiY2xpbmsgdGxpbmsuZXhlCi0gICBMREZMQUdTICAgICAgOj0gLWMKLSAgIFJDICAgICAgICAgICA6PSBicmMKLSAgIFJDRkxBR1MgICAgICA6PQotLklGICQoVVNFX0JDNSkKLS5JRiAkKFVTRV9XSU45NSkKLSAgIFdJTl9WRVJTSU9OICA6PSAtVjQuMAotLkVORElGCi0uRU5ESUYKLSAgIExJQlIgICAgICAgICA6PSB0bGliCi0gICBMSUJGTEFHUyAgICAgOj0gL0MgL1AzMgotICAgSUxJQiAgICAgICAgIDo9IGltcGxpYgotICAgSUxJQkZMQUdTICAgIDo9IC1jCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotLklGICQoREJHKQotICAgQ0ZMQUdTICAgICAgICs9IC12Ci0gICBMREZMQUdTICAgICAgKz0gLXYKLSAgIEFTRkxBR1MgICAgICArPSAvemkKLSAgIExJQkZMQUdTICAgICArPSAvUDEyOAotLkVMU0UKLSAgIExERkxBR1MgICAgICArPSAteAotICAgQVNGTEFHUyAgICAgICs9IC9xCi0uRU5ECi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIG9wdGltaXNhdGlvbnMKLS5JRiAkKE9QVCkKLSAgIENGTEFHUyAgICAgICArPSAtTzIgLWstCi0uRUxJRiAkKE9QVF9TSVpFKQotICAgQ0ZMQUdTICAgICAgICs9IC1PMSAtay0KLS5FTkQKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGlyZWN0IGkzODcgRlBVIGluc3RydWN0aW9ucwotCi0uSUYgJChGUFUpCi0gICBDRkxBR1MgICAgICAgKz0gLURGUFUzODcKLSAgIEFTRkxBR1MgICAgICArPSAtREZQVTM4NwotLkVORAotCi0jIE9wdGlvbmFsbHkgY29tcGlsZSBhIGJldGEgcmVsZWFzZSB2ZXJzaW9uIG9mIGEgcHJvZHVjdAotLklGICQoQkVUQSkKLSAgIENGTEFHUyAgICAgICArPSAtREJFVEEKLSAgIEFTRkxBR1MgICAgICArPSAtREJFVEEKLS5FTkQKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYXMgV2luMTYKLS5JRiAkKFVTRV9XSU4xNikKLS5JRiAkKEJVSUxEX0RMTCkKLSAgIENGTEFHUyAgICAgICArPSAtV0QgLUZzLSAtREJVSUxEX0RMTAotICAgQVNGTEFHUyAgICAgICs9IC1EQlVJTERfRExMCi0uRUxTRQotICAgQ0ZMQUdTICAgICAgICs9IC1XIC1Gcy0KLS5FTkRJRgotICAgREVGX0xJQlMJCTo9IGltcG9ydC5saWIgbWF0aHdsLmxpYiBjd2wubGliCi0gICBEWF9BU0ZMQUdTICAgKz0gLURfX1dJTkRPV1MxNl9fCi0gICBMSUJfT1MgICAgICAgPSBXSU4xNgotLkVMU0UKLSAgIFVTRV9SRUFMRE9TCTo9IDEKLSAgIERFRl9MSUJTICAgICA6PSBtYXRobC5saWIgZnA4Ny5saWIgY2wubGliCi0gICBMSUJfT1MgICAgICAgPSBET1MxNgotLkVORAotCi0jIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKLQotLklGICQoVVNFX0RQTUkxNikKLVBNTElCICAgICAgICAgICA6PSBkcG1pMTZccG0ubGliCi0uRUxTRQotUE1MSUIgICAgICAgICAgIDo9IHBtLmxpYgotLkVORAotCi0jIERlZmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIGxpYnJhcnkgZmlsZXMKLQotLklGICQoQ0hFQ0tFRCkKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJcZGVidWcKLUNGTEFHUwkJCSs9IC1EQ0hFQ0tFRD0xCi0uRUxTRQotTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxyZWxlYXNlCi0uRU5ESUYKLQotIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCi0gICBMSUJfQkFTRSAgICAgOj0gJChMSUJfQkFTRV9ESVIpXCQoTElCX09TKVwkKEJDX0xJQkJBU0UpCi0gICBMSUJfREVTVCAgICAgOj0gJChMSUJfQkFTRSkKLQotIyBEZWZpbmUgd2hpY2ggZmlsZSBjb250YWlucyBvdXIgcnVsZXMKLQotICAgUlVMRVNfTUFLCTo9IGJjMTYubWsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvYmMzLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9iYzMubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzM2Q4MGUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9iYzMubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcwotIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50Ci0jICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKLSMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgotIwotIyAgICAgICAgICAgICAgIEJvcmxhbmQgQysrIDMuMSB2ZXJzaW9uLiBTdXBwb3J0cyAxNiBiaXQgRE9TIGRldmVsb3BtZW50LgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBJbmNsdWRlIHN0YW5kYXJkIHN0YXJ0dXAgc2NyaXB0IGRlZmluaXRpb25zCi0uSU1QT1JUOiBTQ0lURUNICi0uSU5DTFVERTogIiQoU0NJVEVDSClcbWFrZWRlZnNcc3RhcnR1cC5tayIKLQotIyBEZWZhdWx0IGNvbW1hbmRzIGZvciBjb21waWxpbmcsIGFzc2VtYmxpbmcgbGlua2luZyBhbmQgYXJjaGl2aW5nCi0gICBDQyAgICAgICAgICAgOj0gYmNjCi0gICBDRkxBR1MgICAgICAgOj0gLW1sIC1IPWJjYy5zeW0gLWk2MCAtZAotLklGICQoVVNFX1RBU00zMikKLSAgIEFTICAgICAgICAgICA6PSB0YXNtMzIKLS5FTElGICQoVVNFX1RBU01YKQotICAgQVMgICAgICAgICAgIDo9IHRhc214Ci0uRUxTRQotICAgQVMgICAgICAgICAgIDo9IHRhc20KLS5FTkRJRgotICAgQVNGTEFHUyAgICAgIDo9IC90IC9teCAvbSAvaUlOQ0xVREUgL2kkKFNDSVRFQ0gpXElOQ0xVREUKLSAgIExEICAgICAgICAgICA6PSBiY2xpbmsgdGxpbmsuZXhlCi0gICBMREZMQUdTICAgICAgOj0gLWMKLSAgIExJQiAgICAgICAgICA6PSB0bGliCi0gICBMSUJGTEFHUyAgICAgOj0gL0MKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gLXYKLSAgIExERkxBR1MgICAgICArPSAtdgotICAgQVNGTEFHUyAgICAgICs9IC96aQotICAgTElCRkxBR1MgICAgICs9IC9QMTI4Ci0uRUxTRQotICAgTERGTEFHUyAgICAgICs9IC14Ci0gICBBU0ZMQUdTICAgICAgKz0gL3EKLS5FTkQKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucwotLklGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC0zIC1PMgotLkVMSUYgJChPUFRfU0laRSkKLSAgIENGTEFHUyAgICAgICArPSAtMyAtTzEKLS5FTkQKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGlyZWN0IGkzODcgRlBVIGluc3RydWN0aW9ucwotCi0uSUYgJChGUFUpCi0gICBDRkxBR1MgICAgICAgKz0gLWYyODcgLURGUFUzODcKLSAgIEFTRkxBR1MgICAgICArPSAtREZQVTM4NwotLkVORAotCi0jIE9wdGlvbmFsbHkgY29tcGlsZSBhIGJldGEgcmVsZWFzZSB2ZXJzaW9uIG9mIGEgcHJvZHVjdAotLklGICQoQkVUQSkKLSAgIENGTEFHUyAgICAgICArPSAtREJFVEEKLSAgIEFTRkxBR1MgICAgICArPSAtREJFVEEKLS5FTkQKLSAgIFVTRV9SRUFMRE9TCTo9IDEKLQotIyBEZWZpbmUgdGhlIGRlZmF1bHQgbGlicmFyaWVzIHRvIGxpbmsgd2l0aAotICAgREVGX0xJQlMJCTo9IG1hdGhsLmxpYiBjbC5saWIKLQotIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKENIRUNLRUQpCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXGRlYnVnCi1DRkxBR1MJCQkrPSAtRENIRUNLRUQ9MQotLkVMU0UKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJccmVsZWFzZQotLkVORElGCi0KLSMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcwotICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0VfRElSKVxkb3MxNlxiYzMKLQotIyBEZWZpbmUgd2hpY2ggZmlsZSBjb250YWlucyBvdXIgcnVsZXMKLQotICAgUlVMRVNfTUFLCTo9IGJjMy5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9iYzMyLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9iYzMyLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDZkZTFkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvYmMzMi5taworKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgRE1BS0Ugc3RhcnR1cCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmaWxlLiBBc3N1bWVzCi0jICAgICAgICAgICAgICAgdGhhdCB0aGUgU0NJVEVDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgdG8gcG9pbnQKLSMgICAgICAgICAgICAgICB0byB3aGVyZSBhbGwgb3VyIHN0dWZmIGlzIGluc3RhbGxlZC4gWW91IHNob3VsZCBub3QgbmVlZAotIyAgICAgICAgICAgICAgIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGlzIGZpbGUuCi0jCi0jICAgICAgICAgICAgICAgQm9ybGFuZCBDKysgNC4wIDMyIGJpdCB2ZXJzaW9uLiBTdXBwb3J0cyBCb3JsYW5kJ3MgRE9TIFBvd2VyCi0jICAgICAgICAgICAgICAgUGFjayBEUE1JMzIgRE9TIGV4dGVuZGVyLCBQaGFyIExhcCdzIFROVCBET1MgRXh0ZW5kZXIgYW5kCi0jICAgICAgICAgICAgICAgMzIgYml0IFdpbmRvd3MgZGV2ZWxvcG1lbnQuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKLS5JTVBPUlQ6IFNDSVRFQ0gKLS5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgotCi0jIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKLS5JTVBPUlQgLklHTk9SRSA6IFVTRV9TTVgzMiBVU0VfVE5UIFVTRV9XSU4zMiBVU0VfQkM1IFVTRV9WWEQgQkNfTElCQkFTRQotLklNUE9SVCAuSUdOT1JFIDogVlRPT0xTRAotCi0jIFdlIGFyZSBjb21waWxpbmcgZm9yIGEgMzIgYml0IGVudmlvbm1lbnQKLSAgIF8zMkJJVF8gICAgICA6PSAxCi0KLSMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZwotICAgQ0MgICAgICAgICAgIDo9IGJjYzMyCi0uSUYgJChVU0VfVlhEKQotICAgQ0ZMQUdTICAgICAgIDo9IC00IC1pNjAgLWQgLXctc3R1Ci0uRUxTRQotICAgQ0ZMQUdTICAgICAgIDo9IC00IC1IPWJjYzMyLnN5bSAtaTYwIC1kIC13LXN0dQotLkVORElGCi0uSUYgJChVU0VfTkFTTSkKLSAgIEFTCQkJOj0gbmFzbQotICAgQVNGTEFHUyAgICAgIDo9IC10IC1mIG9iaiAtZF9fRkxBVF9fIC1pSU5DTFVERSAtaSQoU0NJVEVDSClcSU5DTFVERQotLkVMU0UKLS5JRiAkKFVTRV9UQVNNMzIpCi0gICBBUyAgICAgICAgICAgOj0gdGFzbTMyCi0uRUxJRiAkKFVTRV9UQVNNWCkKLSAgIEFTICAgICAgICAgICA6PSB0YXNteAotLkVMU0UKLSAgIEFTICAgICAgICAgICA6PSB0YXNtCi0uRU5ESUYKLSAgIEFTRkxBR1MgICAgICA6PSAvdCAvbXggL20gL3ctcmVzIC93LW1jcCAvRF9fRkxBVF9fIC9pSU5DTFVERSAvaSQoU0NJVEVDSClcSU5DTFVERQotLkVORElGCi0gICBMRCAgICAgICAgICAgOj0gYmNsaW5rIHRsaW5rMzIuZXhlCi0gICBMREZMQUdTICAgICAgOj0gLWMKLSAgIFJDICAgICAgICAgICA6PSBicmMzMgotLklGICQoVVNFX0JDNSkKLSAgIFdJTl9WRVJTSU9OICA6PSAtVjQuMAotICAgUkNGTEFHUyAgICAgIDo9IC0zMgotLkVMU0UKLSAgIFJDRkxBR1MgICAgICA6PSAtdzMyCi0uRU5ESUYKLSAgIExJQiAgICAgICAgICA6PSB0bGliCi0gICBMSUJGTEFHUyAgICAgOj0gL0MKLSAgIElMSUIgICAgICAgICA6PSBpbXBsaWIKLSAgIElMSUJGTEFHUyAgICA6PSAtYwotICAgSU5URUxfWDg2CTo9IDEKLSAgIE5NU1lNICAgCQk6PSAkKFNPRlRJQ0VfUEFUSClcbm1zeW0uZXhlCi0gICBOTVNZTUZMQUdTCTo9IC9UUkFOU0xBVEU6c291cmNlLHBhY2thZ2UsYWx3YXlzIC9QUk9NUFQgL1NPVVJDRTokKFNDSVRFQ0gpXHNyY1xwbTskKFNDSVRFQ0gpXHNyY1xwbVxjb21tb247JChTQ0lURUNIKVxzcmNccG1cd2luMzIKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gLXYKLSAgIExERkxBR1MgICAgICArPSAtdgotICAgTElCRkxBR1MgICAgICs9IC9QMjU2Ci0uSUYgJChVU0VfTkFTTSkKLSAgIEFTRkxBR1MgICAgICArPSAtRiBib3JsYW5kIC1nCi0uRUxTRQotICAgQVNGTEFHUyAgICAgICs9IC96aQotLkVORElGCi0uRUxTRQotICAgTERGTEFHUyAgICAgICs9IC14Ci0gICBMSUJGTEFHUwkJKz0gL1AxMjgKLS5JRiAkKFVTRV9OQVNNKQotICAgQVNGTEFHUyAgICAgICs9IC1GIG51bGwKLS5FTFNFCi0gICBBU0ZMQUdTICAgICAgKz0gL3EKLS5FTkRJRgotLkVORAotCi0jIE9wdGlvbmFsbHkgZGlzYWJsZSBuYWdnaW5nIHdhcm5pbmdzIGlmIE1BWF9XQVJOIGlzIG5vdCBvbgotLklGICQoTUFYX1dBUk4pCi0uRUxTRQotICAgQ0ZMQUdTCQkrPSAtdy1hdXMgLXctcGFyIC13LWhpZCAtdy1waWEKLS5FTkRJRgotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zICgtNSAtTzIgYnJlYWtzIEJDKysgNC4wLTQuNSBzb21ldGltZXMpCi0uSUYgJChPUFQpCi0gICBDRkxBR1MgICAgICAgKz0gLTUgLU8yIC1rLQotLkVMSUYgJChPUFRfU0laRSkKLSAgIENGTEFHUyAgICAgICArPSAtNSAtTzEgLWstCi0uRU5ECi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMKLS5JRiAkKEZQVSkKLSAgIENGTEFHUyAgICAgICArPSAtREZQVTM4NwotICAgQVNGTEFHUyAgICAgICs9IC1kRlBVMzg3Ci0uRU5ECi0KLSMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0Ci0uSUYgJChCRVRBKQotICAgQ0ZMQUdTICAgICAgICs9IC1EQkVUQQotICAgQVNGTEFHUyAgICAgICs9IC1kQkVUQQotLkVORAotCi0jIE9wdGlvbmFsbHkgdXNlIFBoYXIgTGFwJ3MgVE5UIERPUyBFeHRlbmRlciwgb3RoZXJ3aXNlIHVzZSB0aGUgRE9TIFBvd2VyIFBhY2sKLS5JRiAkKFVTRV9UTlQpCi0gICBDRkxBR1MgICAgICAgKz0gLURfX01TRE9TX18KLSAgIERYX0NGTEFHUyAgICArPSAtRFROVAotICAgRFhfQVNGTEFHUyAgICs9IC1kVE5UCi0gICBMSUJfT1MgICAgICAgPSBET1MzMgotICAgREVGX0xJQlMJCTo9IGltcG9ydDMyLmxpYiBjdzMyLmxpYiBkb3N4MzIubGliIHRudGFwaS5saWIKLS5FTElGICQoVVNFX1ZYRCkKLSAgIExERkxBR1MJCSs9IC1uIC1QLSAteAotICAgQ0ZMQUdTICAgICAgICs9IC1SVC0gLXgtIC1PaSAtVkMgLUkkKFZUT09MU0QpXElOQ0xVREUgLURJU18zMiAtRFdBTlRWWERXUkFQUyAtRFZUT09MU0QgLURXSU40MCAtRFdJTjQwX09SX0xBVEVSIC1EREVGU0VHPTEgLXpDX0xURVhUIC16QUxDT0RFIC16Ul9MREFUQSAtelRMQ09ERQotICAgREVGX0xJQlMJCTo9ICQoVlRPT0xTRClcbGliXGNmYmM0NDBkLmxpYiAkKFZUT09MU0QpXGxpYlx3cjBiYzQ0MC5saWIgJChWVE9PTFNEKVxsaWJcd3IxYmM0NDAubGliICQoVlRPT0xTRClcbGliXHdyMmJjNDQwLmxpYiAkKFZUT09MU0QpXGxpYlx3cjNiYzQ0MC5saWIgJChWVE9PTFNEKVxsaWJccnRiYzQ0MGQubGliCi0gICBEWF9BU0ZMQUdTICAgKz0gLWRfX1ZYRF9fIC1kX19CT1JMQU5EQ19fPTEgLUkkKFZUT09MU0QpXElOQ0xVREUgLUkkKFZUT09MU0QpXExJQlxJTkNMVURFCi0gICBMSUJfT1MgICAgICAgPSBWWEQKLS5FTElGICQoVVNFX1dJTjMyKQotLklGICQoV0lOMzJfR1VJKQotLkVMU0UKLSAgICBDRkxBR1MgICAgICAgKz0gLURfX0NPTlNPTEVfXwotLkVORElGCi0uSUYgJChCVUlMRF9ETEwpCi0gICBDRkxBR1MgICAgICAgKz0gLVdEIC1EQlVJTERfRExMCi0gICBBU0ZMQUdTICAgICAgKz0gLWRCVUlMRF9ETEwKLS5FTFNFCi0gICBDRkxBR1MgICAgICAgKz0gLVcgLVdNCi0uRU5ESUYKLS5JRiAkKFVTRV9CQzUpCi0uRUxTRQotICAgQ0ZMQUdTCQkrPSAtRF9XSU4zMgotLkVORElGCi0gICBERUZfTElCUwkJOj0gaW1wb3J0MzIubGliIGN3MzJtdC5saWIKLSAgIERYX0FTRkxBR1MgICArPSAtZF9fV0lORE9XUzMyX18KLSAgIExJQl9PUyAgICAgICA9IFdJTjMyCi0uRUxJRiAkKFVTRV9TTVgzMikKLSAgIENGTEFHUyAgICAgICArPSAtRF9fU01YMzJfXyAtRFBNRTMyCi0gICBEWF9DRkxBR1MgICAgKz0KLSAgIERYX0FTRkxBR1MgICArPSAtZF9fU01YMzJfXyAtZERQTUkzMiAtZFBNRTMyCi0gICBVU0VfUkVBTERPUwk6PSAxCi0gICBMSUJfT1MgICAgICAgPSBTTVgzMgotICAgREVGX0xJQlMgICAgIDo9IGN3MzJtdC5saWIKLS5FTFNFCi0gICBVU0VfRFBNSTMyICAgOj0gMQotICAgQ0ZMQUdTICAgICAgICs9IC1EX19NU0RPU19fCi0gICBEWF9DRkxBR1MgICAgKz0gLVdYIC1ERFBNSTMyCi0gICBEWF9BU0ZMQUdTICAgKz0gLWREUE1JMzIKLSAgIFVTRV9SRUFMRE9TCTo9IDEKLSAgIExJQl9PUyAgICAgICA9IERPUzMyCi0gICBERUZfTElCUwkJOj0KLS5FTkQKLQotIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKENIRUNLRUQpCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXGRlYnVnCi1DRkxBR1MJCQkrPSAtRENIRUNLRUQ9MQotLkVMU0UKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJccmVsZWFzZQotLkVORElGCi0KLSMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcwotICAgTElCX0JBU0UgICAgIDo9ICQoTElCX0JBU0VfRElSKVwkKExJQl9PUylcJChCQ19MSUJCQVNFKQotICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0UpCi0KLSMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcwotCi0uSUYgJChVU0VfVE5UKQotUE1MSUIgICAgICAgICAgIDo9ICQoTElCX0JBU0UpXHRudFxwbS5saWIKLS5FTElGICQoVVNFX0RQTUkzMikKLVBNTElCICAgICAgICAgICA6PSAkKExJQl9CQVNFKVxkcG1pMzJccG0ubGliCi0uRUxTRQotUE1MSUIgICAgICAgICAgIDo9ICQoTElCX0JBU0UpXHBtLmxpYgotLkVORAotCi0jIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcwotCi0gICBSVUxFU19NQUsJOj0gYmMzMi5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9iY29zMi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvYmNvczIubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYWViN2MuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9iY29zMi5taworKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgRE1BS0Ugc3RhcnR1cCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmaWxlLiBBc3N1bWVzCi0jICAgICAgICAgICAgICAgdGhhdCB0aGUgU0NJVEVDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgdG8gcG9pbnQKLSMgICAgICAgICAgICAgICB0byB3aGVyZSBhbGwgb3VyIHN0dWZmIGlzIGluc3RhbGxlZC4gWW91IHNob3VsZCBub3QgbmVlZAotIyAgICAgICAgICAgICAgIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGlzIGZpbGUuCi0jCi0jICAgICAgICAgICAgICAgQm9ybGFuZCBDKysgMi4wIDMyLWJpdCBPUy8yIHZlcnNpb24uCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKLS5JTVBPUlQ6IFNDSVRFQ0gKLS5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgotCi0jIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKLS5JTVBPUlQgLklHTk9SRSA6IFVTRV9PUzJHVUkgQkNfTElCQkFTRQotCi0jIFdlIGFyZSBjb21waWxpbmcgZm9yIGEgMzIgYml0IGVudmlvbm1lbnQKLSAgIF8zMkJJVF8gICAgICA6PSAxCi0KLSMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZwotICAgQ0MgICAgICAgICAgIDo9IGJjYwotICAgQ0ZMQUdTICAgICAgIDo9IC13LSAtNCAtSD1iY2MzMi5zeW0gLWk2MCAtZAotLklGICQoVVNFX05BU00pCi0gICBBUyAgICAgICAgICAgOj0gbmFzbQotICAgQVNGTEFHUyAgICAgIDo9IC10IC1mIG9iaiAtZF9fRkxBVF9fIC1pSU5DTFVERSAtaSQoU0NJVEVDSClcSU5DTFVERQotLkVMU0UKLSAgIEFTICAgICAgICAgICA6PSB0YXNtCi0gICBBU0ZMQUdTICAgICAgOj0gL3QgL214IC9tIC9EX19GTEFUX18gL0RfX09TMl9fIC9pSU5DTFVERSAvaSQoU0NJVEVDSClcSU5DTFVERQotLkVORElGCi0gICBMRCAgICAgICAgICAgOj0gYmNsaW5rIHRsaW5rLmV4ZQotICAgTERGTEFHUyAgICAgIDo9IC1jCi0gICBSQyAgICAgICAgICAgOj0gYnJjYwotICAgUkNGTEFHUyAgICAgIDo9Ci0gICBMSUIgICAgICAgICAgOj0gdGxpYgotICAgTElCRkxBR1MgICAgIDo9IC9DIC9QMzIKLSAgIElMSUIgICAgICAgICA6PSBpbXBsaWIKLSAgIElMSUJGTEFHUyAgICA6PSAtYwotLklGICQoVVNFX09TMkdVSSkKLSAgIENGTEFHUwkJKz0gLURfX09TMl9QTV9fCi0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gLXYKLSAgIExERkxBR1MgICAgICArPSAtdgotICAgTElCRkxBR1MgICAgICs9IC9QMTI4Ci0uSUYgJChVU0VfTkFTTSkKLSAgIEFTRkxBR1MgICAgICArPSAtRiBib3JsYW5kCi0uRUxTRQotICAgQVNGTEFHUyAgICAgICs9IC96aQotLkVORElGCi0uRUxTRQotICAgTERGTEFHUyAgICAgICs9IC14Ci0uSUYgJChVU0VfTkFTTSkKLSAgIEFTRkxBR1MgICAgICArPSAtRiBudWxsCi0uRUxTRQotICAgQVNGTEFHUyAgICAgICs9IC9xCi0uRU5ESUYKLS5FTkQKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucwotLklGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC01IC1PMiAtay0KLS5FTElGICQoT1BUX1NJWkUpCi0gICBDRkxBR1MgICAgICAgKz0gLTUgLU8xIC1rLQotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zCi0uSUYgJChGUFUpCi0gICBDRkxBR1MgICAgICAgKz0gLURGUFUzODcKLSAgIEFTRkxBR1MgICAgICArPSAtZEZQVTM4NwotLkVORAotCi0jIE9wdGlvbmFsbHkgY29tcGlsZSBhIGJldGEgcmVsZWFzZSB2ZXJzaW9uIG9mIGEgcHJvZHVjdAotLklGICQoQkVUQSkKLSAgIENGTEFHUyAgICAgICArPSAtREJFVEEKLSAgIEFTRkxBR1MgICAgICArPSAtZEJFVEEKLS5FTkQKLQotIyBPcHRpb25hbGx5IHVzZSBQaGFyIExhcCdzIFROVCBET1MgRXh0ZW5kZXIsIG90aGVyd2lzZSB1c2UgdGhlIERPUyBQb3dlciBQYWNrCi0uSUYgJChCVUlMRF9ETEwpCi0gICBDRkxBR1MgICAgICAgKz0gLXNkIC1zbSAtREJVSUxEX0RMTAotICAgQVNGTEFHUyAgICAgICs9IC1kQlVJTERfRExMCi0uRUxTRQotICAgQ0ZMQUdTICAgICAgICs9IC1zbQotLkVORElGCi0gICBERUZfTElCUwk6PSBvczIubGliIGMybXQubGliCi0gICBEWF9BU0ZMQUdTICAgKz0gLWRfX09TMl9fCi0gICBMSUJfT1MgICAgICAgPSBvczIzMgotCi0jIERlZmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIGxpYnJhcnkgZmlsZXMKLQotLklGICQoQ0hFQ0tFRCkKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJcZGVidWcKLUNGTEFHUyAgICAgICAgICArPSAtRENIRUNLRUQ9MQotLkVMU0UKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJccmVsZWFzZQotLkVORElGCi0KLSMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcwotICAgTElCX0JBU0UgICAgIDo9ICQoTElCX0JBU0VfRElSKVwkKExJQl9PUylcJChCQ19MSUJCQVNFKQotICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0UpCi0KLSMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcwotCi0uSUYgJChVU0VfT1MyR1VJKQotREVGX0xJQlMgICAgICAgICs9IHBtX3BtLmxpYgotLkVMU0UKLURFRl9MSUJTICAgICAgICArPSBwbS5saWIKLS5FTkRJRgotCi0jIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcwotCi0gICBSVUxFU19NQUsJOj0gYmNvczIubWsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvY2wxNi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvY2wxNi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYyOWExNS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2NsMTYubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcwotIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50Ci0jICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKLSMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgotIwotIyAgICAgICAgICAgICAgIE1pY3Jvc29mdCBDIDYuMCAxNiBiaXQgdmVyc2lvbi4gU3VwcG9ydHMgMTYgYml0Ci0jICAgICAgICAgICAgICAgT1MvMiBkZXZlbG9wbWVudC4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgSW5jbHVkZSBzdGFuZGFyZCBzdGFydHVwIHNjcmlwdCBkZWZpbml0aW9ucwotLklNUE9SVDogU0NJVEVDSAotLklOQ0xVREU6ICIkKFNDSVRFQ0gpXG1ha2VkZWZzXHN0YXJ0dXAubWsiCi0KLSMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZQotLklNUE9SVCAuSUdOT1JFIDogVkNfTElCQkFTRQotLklNUE9SVCAuSUdOT1JFIDogVVNFX01BU00KLQotIyBEZWZhdWx0IGNvbW1hbmRzIGZvciBjb21waWxpbmcsIGFzc2VtYmxpbmcgbGlua2luZyBhbmQgYXJjaGl2aW5nCi0gICBDQyAgICAgICAgICAgOj0gY2wgICAgICAgIyBDLWNvbXBpbGVyIGFuZCBmbGFncwotICAgQ0ZMQUdTICAgICAgIDo9IC93IC9HcwotICAgQVNGTEFHUyAgICAgIDo9IC90IC9teCAvbSAvRF9fQ09NTV9fIC9pSU5DTFVERSAvaSQoU0NJVEVDSClcSU5DTFVERQotLklGICQoVVNFX1RBU00zMikKLSAgIEFTICAgICAgICAgICA6PSB0YXNtMzIKLS5FTElGICQoVVNFX1RBU01YKQotICAgQVMgICAgICAgICAgIDo9IHRhc214ICAgICMgQXNzZW1ibGVyIGFuZCBmbGFncwotLkVMSUYgJChVU0VfTUFTTSkKLSAgIEFTICAgICAgICAgICA6PSBtYXNtICAgICMgQXNzZW1ibGVyIGFuZCBmbGFncwotICAgQVNGTEFHUyAgICAgIDo9IC9EX19DT01NX18gL2lJTkNMVURFIC9pJChTQ0lURUNIKVxJTkNMVURFCi0uRUxTRQotICAgQVMgICAgICAgICAgIDo9IHRhc20gICAgICMgQXNzZW1ibGVyIGFuZCBmbGFncwotLkVORElGCi0gICBMRCAgICAgICAgICAgOj0gY2wgICAgICAgIyBMb2FkZXIgYW5kIGZsYWdzCi0gICBMREZMQUdTICAgICAgID0gJChDRkxBR1MpCi0gICBSQyAgICAgICAgICAgOj0gcmMgICAgICAgIyBXSW5kb3dzIHJlc291cmNlIGNvbXBpbGVyCi0gICBSQ0ZMQUdTICAgICAgOj0KLSAgIExJQiAgICAgICAgICA6PSBsaWIgICAgICAjIExpYnJhcmlhbgotICAgTElCRkxBR1MgICAgIDo9IC9OT0kgL05PRQotICAgSUxJQiAgICAgICAgIDo9IGltcGxpYiAgICMgSW1wb3J0IGxpYnJhcmlhbgotICAgSUxJQkZMQUdTICAgIDo9IC9ub2lnbm9yZWNhc2UKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gL1ppICAjIFR1cm4gb24gZGVidWdnaW5nIGZvciBDIGNvbXBpbGVyCi0gICBBU0ZMQUdTICAgICAgKz0gL3ppICAgICAgIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgYXNzZW1ibGVyCi0uRUxTRQotICAgQVNGTEFHUyAgICAgICs9IC9xICAgICAgICMgU3VwcHJlc3Mgb2JqZWN0IHJlY29yZHMgbm90IG5lZWRlZCBmb3IgbGlua2luZwotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCi0uSUYgJChPUFQpCi0gICBDRkxBR1MgICAgICAgKz0gL094Ci0uRU5ECi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMKLQotLklGICQoRlBVKQotICAgQ0ZMQUdTICAgICAgICs9IC9GUGk4NyAvREZQVTM4NwotICAgQVNGTEFHUyAgICAgICs9IC9ERlBVMzg3IC9ERlBVX1JFR19SVE4KLS5FTkQKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKLS5JRiAkKEJFVEEpCi0gICBDRkxBR1MgICAgICAgKz0gL0RCRVRBCi0gICBBU0ZMQUdTICAgICAgKz0gL0RCRVRBCi0uRU5ECi0KLSMgVXNlIGEgbGFyZ2VyIHN0YWNrIGR1cmluZyBsaW5raW5nIGlmIHJlcXVlc3RlZCA/Pz8/IEhvdyB0aGUgZnVjayBkbyB5b3UKLSMgc3BlY2lmeSBsaW5rZXIgb3B0aW9ucyBvbiB0aGUgQ0wgY29tbWFuZCBsaW5lPz8/Pz8KLQotLklGICQoU1RLU0laRSkKLS5FTkRJRgotCi0jIE9wdGlvbmFsbHkgY29tcGlsZSBmb3IgMTYgYml0IFdpbmRvd3MKLS5JRiAkKFVTRV9XSU4xNikKLS5JRiAkKEJVSUxEX0RMTCkKLSAgIENGTEFHUyAgICAgICArPSAvR0QgL0FsZncgL0RCVUlMRF9ETEwKLSAgIEFTRkxBR1MgICAgICArPSAtREJVSUxEX0RMTAotLkVMU0UKLSAgIENGTEFHUyAgICAgICArPSAvR0EgL0FMCi0uRU5ESUYKLSAgIERYX0FTRkxBR1MgICArPSAtRF9fV0lORE9XUzE2X18KLSAgIExJQl9PUyAgICAgICA9IFdJTjE2Ci0uRUxTRQotICAgVVNFX1JFQUxET1MJOj0gMQotICAgQ0ZMQUdTICAgICAgICs9IC9BTAotICAgTElCX09TICAgICAgID0gRE9TMTYKLS5FTkQKLQotIyBQbGFjZSB0byBsb29rIGZvciBQTU9ERSBsaWJyYXJ5IGZpbGVzCi0KLVBNTElCICAgICAgICAgICA6PSBwbS5saWIKLQotIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKENIRUNLRUQpCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXGRlYnVnCi1DRkxBR1MJCQkrPSAtRENIRUNLRUQ9MQotLkVMU0UKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJccmVsZWFzZQotLkVORElGCi0KLSMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcwotICAgTElCX0JBU0UgICAgIDo9ICQoTElCX0JBU0VfRElSKVwkKExJQl9PUylcJChWQ19MSUJCQVNFKQotICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0UpCi0KLSMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCi0KLSAgIFJVTEVTX01BSwk6PSBjbDE2Lm1rCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2NsMzg2Lm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9jbDM4Ni5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIxNTdmOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2NsMzg2Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgRE1BS0Ugc3RhcnR1cCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmaWxlLiBBc3N1bWVzCi0jICAgICAgICAgICAgICAgdGhhdCB0aGUgU0NJVEVDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgdG8gcG9pbnQKLSMgICAgICAgICAgICAgICB0byB3aGVyZSBhbGwgb3VyIHN0dWZmIGlzIGluc3RhbGxlZC4gWW91IHNob3VsZCBub3QgbmVlZAotIyAgICAgICAgICAgICAgIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGlzIGZpbGUuCi0jCi0jICAgICAgICAgICAgICAgTWljcm9zb2Z0IDM4NiBDIDYuMCAzMiBiaXQuIFN1cHBvcnRzIDMyIGJpdAotIyAgICAgICAgICAgICAgIE9TLzIgZGV2ZWxvcG1lbnQuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKLS5JTVBPUlQ6IFNDSVRFQ0gKLS5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgotCi0jIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKLS5JTVBPUlQgLklHTk9SRSA6IENMX0xJQkJBU0UgVVNFX1ZERAotLklNUE9SVCAuSUdOT1JFIDogVVNFX01BU00KLQotIyBEZWZhdWx0IGNvbW1hbmRzIGZvciBjb21waWxpbmcsIGFzc2VtYmxpbmcgbGlua2luZyBhbmQgYXJjaGl2aW5nCi0gICBDQyAgICAgICAgICAgOj0gY2wzODYgICAgICAgIyBDLWNvbXBpbGVyIGFuZCBmbGFncwotICAgIyBOQjogVGhlIC1aZiBmbGFnIGlzIEFCU09MVVRFTFkgTkVDRVNTQVJZIHRvIGNvbXBpbGUgSUJNJ3MgT1MvMiBoZWFkZXJzLgotICAgIyAgICAgSXQgaXNuJ3QgZG9jdW1lbnRlZCBhbnl3aGVyZSBidXQgb2J2aW91c2x5IGFkZHMgc3VwcG9ydCBmb3IgNDgtYml0Ci0gICAjICAgICBmYXIgcG9pbnRlcnMgKGllLiBfZmFyIGlzIHZhbGlkIGluIDMyLWJpdCBjb2RlKS4gR3JlYXQuCi0gICBDRkxBR1MgICAgICAgOj0gLUczcyAtWmYgLURfXzM4Nl9fCi0gICBBU0ZMQUdTICAgICAgOj0gL3QgL214IC9tIC9vaSAvRF9fRkxBVF9fIC9EU1REQ0FMTF9NQU5HTEUgL0RfX05PVV9WQVJfXyAvaUlOQ0xVREUgL2kkKFNDSVRFQ0gpXElOQ0xVREUKLS5JRiAkKFVTRV9UQVNNMzIpCi0gICBBUyAgICAgICAgICAgOj0gdGFzbTMyCi0uRUxJRiAkKFVTRV9UQVNNWCkKLSAgIEFTICAgICAgICAgICA6PSB0YXNteCAgICMgQXNzZW1ibGVyIGFuZCBmbGFncwotLkVMSUYgJChVU0VfTUFTTSkKLSAgIEFTICAgICAgICAgICA6PSBtYXNtICAgICMgQXNzZW1ibGVyIGFuZCBmbGFncwotICAgQVNGTEFHUyAgICAgIDo9IC90IC9teCAvRF9fRkxBVF9fIC9EU1REQ0FMTF9NQU5HTEUgL0RfX05PVV9WQVJfXyAvaUlOQ0xVREUgL2kkKFNDSVRFQ0gpXElOQ0xVREUKLS5FTFNFCi0gICBBUyAgICAgICAgICAgOj0gdGFzbSAgICAgIyBBc3NlbWJsZXIgYW5kIGZsYWdzCi0uRU5ESUYKLSAgIExEICAgICAgICAgICA6PSBsaW5rMzg2ICAjIExpbmtlciBhbmQgZmxhZ3MKLSAgIExERkxBR1MgICAgICAgPSAkKENGTEFHUykKLSAgIFJDICAgICAgICAgICA6PSByYyAgICAgICAjIFdpbmRvd3MgcmVzb3VyY2UgY29tcGlsZXIKLSAgIFJDRkxBR1MgICAgICA6PQotICAgTElCICAgICAgICAgIDo9IGxpYiAgICAgICMgTGlicmFyaWFuCi0gICBMSUJGTEFHUyAgICAgOj0gL05PSSAvTk9FCi0gICBJTElCICAgICAgICAgOj0gaW1wbGliICAgIyBJbXBvcnQgbGlicmFyaWFuCi0gICBJTElCRkxBR1MgICAgOj0gL25vaWdub3JlY2FzZQotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLS5JRiAkKERCRykKLSAgIENGTEFHUyAgICAgICArPSAtWmkgICAgICAjIFR1cm4gb24gZGVidWdnaW5nIGZvciBDIGNvbXBpbGVyCi0gICBBU0ZMQUdTICAgICAgKz0gL3ppICAgICAgIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgYXNzZW1ibGVyCi0uRUxTRQotICAgQVNGTEFHUyAgICAgICs9IC9xICAgICAgICMgU3VwcHJlc3Mgb2JqZWN0IHJlY29yZHMgbm90IG5lZWRlZCBmb3IgbGlua2luZwotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCi0uSUYgJChPUFQpCi0gICBDRkxBR1MgICAgICAgKz0gL094Ci0uRU5ECi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMKLQotLklGICQoRlBVKQotICAgQ0ZMQUdTICAgICAgICs9IC9GUGk4NyAvREZQVTM4NwotICAgQVNGTEFHUyAgICAgICs9IC9ERlBVMzg3IC9ERlBVX1JFR19SVE4KLS5FTkQKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKLS5JRiAkKEJFVEEpCi0gICBDRkxBR1MgICAgICAgKz0gL0RCRVRBCi0gICBBU0ZMQUdTICAgICAgKz0gL0RCRVRBCi0uRU5ECi0KLSMgVXNlIGEgbGFyZ2VyIHN0YWNrIGR1cmluZyBsaW5raW5nIGlmIHJlcXVlc3RlZCA/Pz8/IEhvdyB0aGUgZnVjayBkbyB5b3UKLSMgc3BlY2lmeSBsaW5rZXIgb3B0aW9ucyBvbiB0aGUgQ0wgY29tbWFuZCBsaW5lPz8/Pz8KLQotLklGICQoU1RLU0laRSkKLS5FTkRJRgotCi0jIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKLQotUE1MSUIgICAgICAgICAgIDo9IHBtLmxpYgotCi0jIERlZmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIGxpYnJhcnkgZmlsZXMKLQotLklGICQoQ0hFQ0tFRCkKLUxJQl9CQVNFX0RJUiAgICA6PSAkKFNDSVRFQ0hfTElCKVxsaWJcZGVidWcKLUNGTEFHUyAgICAgICAgICAgICAgICAgICs9IC1EQ0hFQ0tFRD0xCi0uRUxTRQotTElCX0JBU0VfRElSICAgIDo9ICQoU0NJVEVDSF9MSUIpXGxpYlxyZWxlYXNlCi0uRU5ESUYKLQotIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCi0gICBMSUJfT1MgICAgICAgPSBvczIzMgotICAgTElCX0JBU0UgICAgIDo9ICQoTElCX0JBU0VfRElSKVwkKExJQl9PUylcJChDTF9MSUJCQVNFKQotICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0UpCi0KLSMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCi0KLSAgIFJVTEVTX01BSyAgICA6PSBjbDM4Ni5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9jb21tb24ubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2NvbW1vbi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMzNzE1Mi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2NvbW1vbi5taworKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIENvbW1vbiBtYWtlZmlsZSB0YXJnZXRzIHVzZWQgYnkgYWxsIFNjaVRlY2ggU29mdHdhcmUKLSMgICAgICAgICAgICAgICBtYWtlZmlsZXMuIFRoaXMgZmlsZSBpbmNsdWRlcyB0YXJnZXRzIGZvciBjbGVhbmluZyB0aGUKLSMgICAgICAgICAgICAgICBjdXJyZW50IGRpcmVjdG9yeSwgYW5kIG1haW50YWluaW5nIHRoZSBzb3VyY2UgZmlsZXMgd2l0aAotIyAgICAgICAgICAgICAgIFJDUy4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgT3ZlcnJpZGUgZ2xvYmFsIE9wZW5HTCBpbmNsdWRlcyB3aGVuIGNvbXBpbGluZyBhZ2FpbnN0IE1HTCB2ZXJzaW9uCi0KLS5JRiAkKFVTRV9NR0xfT1BFTkdMKQotLklGICQoVU5JWF9IT1NUKQotQ0ZMQUdTCQkrPSAtSSQoU0NJVEVDSCkvaW5jbHVkZS9tZ2xnbAotREVQRU5EX0lOQwkrPSAkKFNDSVRFQ0gpL2luY2x1ZGUvbWdsZ2wKLS5FTFNFCi1DRkxBR1MJCSs9IC1JJChTQ0lURUNIKVxpbmNsdWRlXG1nbGdsCi1ERVBFTkRfSU5DCSs9ICQoU0NJVEVDSClcaW5jbHVkZS9tZ2xnbAotLkVORElGCi0uRU5ESUYKLQotIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBhbGwgY29tcGlsZWQgRExMIGZpbGVzCi0KLS5JRiAkKFVOSVhfSE9TVCkKLS5JRiAkKENIRUNLRUQpCi1ETExfREVTVCAgICA6PSAkKFNDSVRFQ0hfTElCKS9yZWRpc3QvZGVidWcKLS5FTFNFCi1ETExfREVTVCAgICA6PSAkKFNDSVRFQ0hfTElCKS9yZWRpc3QvcmVsZWFzZQotLkVORElGCi0uRUxTRQotLklGICQoQ0hFQ0tFRCkKLURMTF9ERVNUICAgIDo9ICQoU0NJVEVDSF9MSUIpXHJlZGlzdFxkZWJ1ZwotLkVMU0UKLURMTF9ERVNUICAgIDo9ICQoU0NJVEVDSF9MSUIpXHJlZGlzdFxyZWxlYXNlCi0uRU5ESUYKLS5FTkRJRgotCi0jIFRhcmdldCB0byBidWlsZCB0aGUgbGlicmFyeSBhbmQgRExMIGZpbGUgaWYgc3BlY2lmaWVkCi0KLS5JRiAkKExJQkZJTEUpCi0KLWxpYjogJChMSUJGSUxFKQotCi0uSUYgJChETExGSUxFKQotCi0jIEJ1aWxkIGFuZCBpbnN0YWxsIGEgRExMIGZpbGUsIG9yIHNpbXBseSBidWlsZCBpbXBvcnQgbGlicmFyeSBhbmQgaW5zdGFsbAotCi0uSUYgJChCVUlMRF9ETEwpCi0KLSQoRExMRklMRSk6ICQoT0JKRUNUUykKLSQoTElCRklMRSk6ICQoRExMRklMRSkKLWluc3RhbGw6ICQoTElCRklMRSkgJChETExGSUxFKQotCSQoSU5TVEFMTCkgJChMSUJGSUxFKSAkKExJQl9ERVNUKSQoTElCX0VYVEVOREVSKQotCSQoSU5TVEFMTCkgJChETExGSUxFKSAkKERMTF9ERVNUKQotLklGICQoVVNFX1NPRlRJQ0UpCi0JJChJTlNUQUxMKSAkKERMTEZJTEU6cy8uZGxsLy5ubXMpICQoRExMX0RFU1QpCi0uRU5ESUYKLS5FTFNFCi0KLSQoTElCRklMRSk6ICQoRExMX0RFU1QpXCQoRExMRklMRSkKLWluc3RhbGw6ICQoTElCRklMRSkKLQkkKElOU1RBTEwpICQoTElCRklMRSkgJChMSUJfREVTVCkkKExJQl9FWFRFTkRFUikKLQotLkVORElGCi0uRUxTRQotCi0uSUYgJChCVUlMRF9ETEwpCi0KLSMgQnVpbGQgYW5kIGluc3RhbGwgYSBVbml4IHNoYXJlZCBsaWJyYXJ5Ci0KLSQoTElCRklMRSk6ICQoT0JKRUNUUykKLWluc3RhbGw6ICQoTElCRklMRSkKLQkkKElOU1RBTEwpICQoTElCRklMRSkgJChMSUJfREVTVCkkKExJQl9FWFRFTkRFUikKLQkkKElOU1RBTEwpICQoTElCRklMRSkgJChETExfREVTVCkvJChMSUJGSUxFKS4kKFZFUlNJT04pCi0KLS5FTFNFCi0KLSMgQnVpbGQgYW5kIGluc3RhbGwgYSBub3JtYWwgbGlicmFyeSBmaWxlCi0KLS5JRiAkKFVTRV9ETEwpCi0uRUxTRQotJChMSUJGSUxFKTogJChPQkpFQ1RTKQotaW5zdGFsbDogJChMSUJGSUxFKQotCSQoSU5TVEFMTCkgJChMSUJGSUxFKSAkKExJQl9ERVNUKSQoTElCX0VYVEVOREVSKQotLkVORElGCi0uRU5ESUYKLS5FTkRJRgotLkVORElGCi0KLSMgQnVpbGQgYW5kIGluc3RhbGwgYSBWeEQgZmlsZSwgaW5jbHVkaW5nIGRlYnVnIGluZm9ybWF0aW9uCi0KLS5JRiAkKFZYREZJTEUpCi0kKFZYREZJTEU6cy8udnhkLy5kbGwpOiAkKE9CSkVDVFMpCi0kKFZYREZJTEUpOiAkKFZYREZJTEU6cy8udnhkLy5kbGwpCi1pbnN0YWxsOiAkKFZYREZJTEUpCi0JJChJTlNUQUxMKSAkKFZYREZJTEUpICQoRExMX0RFU1QpCi0uSUYgJChEQkcpCi0JJChJTlNUQUxMKSAkKFZYREZJTEU6cy8udnhkLy5ubXMpICQoRExMX0RFU1QpCi0uRU5ESUYKLS5FTkRJRgotCi0jIENsZWFuIHVwIGRpcmVjdG9yeSByZW1vdmluZyBhbGwgZmlsZXMgbm90IG5lZWRlZCB0byBtYWtlIHRoZSBsaWJyYXJ5LgotCi1fX0NMRUFOX0ZJTEVTIDo9ICoub2JqICoubyAqLnN5bSAqLmJhayAqLnRkayAqLnN3cCAqLm1hcCAqLmVyciAqLmNzbSAqLmxpYiAqLmFwcyAqLm5tcyAqLnN5cwotX19DTEVBTl9GSUxFUyArPSAqLn4qICoudGQgKi50ciAqLnRyPyAqLnRkPyAqLnJ3cyAqLnJlcyAqLmV4cCAqLmlsayAqLnBkYiAqLnBjaCAqLmEgYmNjMzIuKgotX19DTEVBTl9GSUxFUyArPSAkKExJQkNMRUFOKQotX19DTEVBTkVYRV9GSUxFUyA6PSAkKF9fQ0xFQU5fRklMRVMpICokRSAqLmRydiAqLnJleCAqLmRsbCAqLnZ4ZCAqLm5tcyAqLnBlbCAqLnNtZiAqLnNvLioKLQotLlBIT05ZIGNsZWFuOgotCUAkKFJNKSAtZiAtUyAkKG1rdG1wICQoX19DTEVBTl9GSUxFUzp0IlxuIikpCi0KLS5QSE9OWSBjbGVhbmV4ZToKLQlAJChSTSkgLWYgLVMgJChta3RtcCAkKF9fQ0xFQU5FWEVfRklMRVM6dCJcbiIpKQotCi0jIERlZmluZSB0aGUgc291cmNlIGRpcmVjdG9yaWVzIHRvIGZpbmQgY29tbW9uIGZpbGVzCi0KLS5JRiAkKE5PX1NDSVRFQ0hfQ09NTU9OKQotLkVMU0UKLS5TT1VSQ0U6CQkgICAkKFNDSVRFQ0gpL3NyYy9jb21tb24KLS5FTkRJRgotCi0jIENyZWF0ZSB0aGUgaW5jbHVkZSBmaWxlIGRlcGVuZGVuY2llcyB1c2luZyB0aGUgTUtVVElMIG1ha2VkZXAgcHJvZ3JhbSBpZgotIyB0aGUgbGlzdCBvZiBkZXBlbmRlbnQgb2JqZWN0IGZpbGVzIGlzIGRlZmluZWQKLQotLklGICQoREVQRU5EX09CSikKLWRlcGVuZDoKLQlAJChSTSkgLWYgbWFrZWZpbGUuZGVwCi0uSUYgJChERVBFTkRfU1JDKQotLklGICQoREVQRU5EX0lOQykKLQlAbWFrZWRlcCAtYW1ha2VmaWxlLmRlcCAtciAtcyAtSUAkKG1rdG1wICQoREVQRU5EX0lOQzpzL1wvXFwpKSAtU0AkKG1rdG1wICQoREVQRU5EX1NSQzpzL1wvXFwpOyQoU0NJVEVDSCkvc3JjL2NvbW1vbikgQCQobWt0bXAgJChERVBFTkRfT0JKOnQiXG4iKVxuKQotLkVMU0UKLQlAbWFrZWRlcCAtYW1ha2VmaWxlLmRlcCAtciAtcyAtU0AkKG1rdG1wICQoREVQRU5EX1NSQzpzL1wvXFwpOyQoU0NJVEVDSCkvc3JjL2NvbW1vbikgQCQobWt0bXAgJChERVBFTkRfT0JKOnQiXG4iKVxuKQotLkVORElGCi0uRUxTRQotLklGICQoREVQRU5EX0lOQykKLQlAbWFrZWRlcCAtYW1ha2VmaWxlLmRlcCAtciAtcyAtSUAkKG1rdG1wICQoREVQRU5EX0lOQzpzL1wvXFwpKSAtU0AkKG1rdG1wICQoU0NJVEVDSCkvc3JjL2NvbW1vbikgQCQobWt0bXAgJChERVBFTkRfT0JKOnQiXG4iKVxuKQotLkVMU0UKLQlAbWFrZWRlcCAtYW1ha2VmaWxlLmRlcCAtciAtcyAtU0AkKG1rdG1wICQoU0NJVEVDSCkvc3JjL2NvbW1vbikgQCQobWt0bXAgJChERVBFTkRfT0JKOnQiXG4iKVxuKQotLkVORElGCi0uRU5ESUYKLQlAJChFQ0hPKSBPYmplY3QgZmlsZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGdlbmVyYXRlZC4KLS5FTkRJRgotCi0jIFNldCB1cCBmb3IgY29tcGlsaW5nIFNuYXAgZXhlY3V0ZWFibGVzIGFuZCBkeW5hbWljIGxpbmsgbGlicmFyaWVzCi0KLS5JRiAkKFVTRV9TTkFQKQotI0NGTEFHUyAgICAgCSs9IC1JJChQUklWQVRFKVxpbmNsdWRlXGRydmxpYiAtSSQoU0NJVEVDSClcaW5jbHVkZVxkcnZsaWIgLURfX1NOQVBfXwotQ0ZMQUdTICAgICAJKz0gLURfX1NOQVBfXwotQVNGTEFHUyAgIAkrPSAtZF9fU05BUF9fCi0jRVhFTElCUwkJKz0gc25hcCRMCi0uRU5ESUYKLQotIyBJbmNsdWRlIHJ1bGUgZGVmaW5pdGlvbnMgZm9yIHRoZSBjb21waWxlcgotCi0uSU5DTFVERTogIiQoU0NJVEVDSCkvbWFrZWRlZnMvcnVsZXMvJChSVUxFU19NQUspIgotCi0jIEluY2x1ZGUgZmlsZSBkZXBlbmRlbmNpZXMKLQotLklOQ0xVREUgLklHTk9SRTogIm1ha2VmaWxlLmRlcCIKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZW14Lm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9lbXgubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1Njk3OTAuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9lbXgubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcwotIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50Ci0jICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKLSMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgotIwotIyAgICAgICAgICAgICAgIE9TLzIgdmVyc2lvbiBmb3IgRU1YL0dOVSBDL0MrKy4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgSW5jbHVkZSBzdGFuZGFyZCBzdGFydHVwIHNjcmlwdCBkZWZpbml0aW9ucwotLklNUE9SVDogU0NJVEVDSAotLklOQ0xVREU6ICIkKFNDSVRFQ0gpXG1ha2VkZWZzXHN0YXJ0dXAubWsiCi0KLSMgRGlzYWJsZSB3YXJuaW5ncyBmb3IgbWFjcm9zIHJlZGVmaW5lZCBoZXJlIHRoYXQgd2VyZSBnaXZlbgotIyBvbiB0aGUgY29tbWFuZCBsaW5lLgotX18uU0lMRU5UICAgICAgIDo9ICQoLlNJTEVOVCkKLS5TSUxFTlQgICAgICAgICA6PSB5ZXMKLQotIyBJbXBvcnQgZW5pdm9ybm1lbnQgdmFyaWFibGVzIHRoYXQgd2UgdXNlIGNvbW1vbiB0byBhbGwgY29tcGlsZXJzCi0uSU1QT1JUIC5JR05PUkUgOiBURU1QIFNIRUxMIElOQ0xVREUgTElCIFNDSVRFQ0ggUFJJVkFURSBTQ0lURUNIX0xJQgotLklNUE9SVCAuSUdOT1JFIDogREJHIE9QVCBPUFRfU0laRSBDUlRETEwgU0hXIEJFVEEgQ0hFQ0tFRCBOT19FWENFUFQgTk9fUlRUSQotLklNUE9SVCAuSUdOT1JFIDogRlVMTFNDUkVFTiBTSE9XX0FSR1MKLSAgIFRNUERJUiAgICAgICA6PSAkKFRFTVApCi0KLSMgU3RhbmRhcmQgZmlsZSBzdWZmaXggZGVmaW5pdGlvbnMKLSAgIEwgICAgICAgICAgICA6PSAubGliICAgICAgICAgIyBMaWJyYXJpZXMKLSAgIEUgICAgICAgICAgICA6PSAuZXhlICAgICAgICAgIyBFeGVjdXRhYmxlcwotICAgTyAgICAgICAgICAgIDo9IC5vYmogICAgICAgICAjIE9iamVjdHMKLSAgIEEgICAgICAgICAgICA6PSAuYXNtICAgICAgICAgIyBBc3NlbWJsZXIgc291cmNlcwotICAgUyAgICAgICAgICAgIDo9IC5zICAgICAgICAgICAjIEdOVSBhc3NlbWJsZXIgc291cmNlcwotICAgUCAgICAgICAgICAgIDo9IC5jcHAgICAgICAgICAjIEMrKyBzb3VyY2VzCi0KLSMgRmlsZSBwcmVmaXgvc3VmZml4IGRlZmluaXRpb25zLiBUaGUgZm9sbG93aW5nIHByZWZpeGVzIGFyZSBkZWZpbmVkLCBhbmQgYXJlCi0jIHVzZWQgcHJpbWFyaWx5IHRvIGFic3RyYWN0IGJldHdlZW4gdGhlIFVuaXggc3R5bGUgbGliWFguYSBuYW1pbmcgY29udmVudGlvbgotIyBhbmQgdGhlIERPUy9XaW5kb3dzL09TMiBuYW1pbmcgY29udmVudGlvbiBvZiBYWC5saWIuCi0gICBMUCAgICAgICAgICAgOj0gICAgICAgICAgICAgICMgTFAgLSBMaWJyYXJ5IGZpbGUgcHJlZml4IChuYW1lIG9mIGZpbGUgb24gZGlzaykKLSAgIExMICAgICAgICAgICA6PSAtbCAgICAgICAgICAgIyBMaWJyYXJ5IGxpbmsgcHJlZml4IChuYW1lIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCi0gICBMRSAgICAgICAgICAgOj0gICAgICAgICAgICAgICMgTGlicmFyeSBsaW5rIHN1ZmZpeCAoZXh0ZW5zaW9uIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCi0KLSMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZQotLklNUE9SVCAuSUdOT1JFIDogRU1YX0xJQkJBU0UgVVNFX09TMjMyIFVTRV9PUzJHVUkKLQotIyBXZSBhcmUgY29tcGlsaW5nIGZvciBhIDMyIGJpdCBlbnZpb25tZW50Ci0gICBfMzJCSVRfICAgICAgOj0gMQotCi0jIERNQUtFIHVzZXMgdGhpcyByZWNpcGUgdG8gcmVtb3ZlIGludGVybWVkaWF0ZSB0YXJnZXRzCi0uUkVNT1ZFIDo7ICQoUk0pIC1mICQ8Ci0KLSMgVHVybiB3YXJuaW5ncyBiYWNrIHRvIHByZXZpb3VzIHNldHRpbmcuCi0uU0lMRU5UIDo9ICQoX18uU0lMRU5UKQotCi0jIFdlIGRvbnQgdXNlIFRBQlMgaW4gb3VyIG1ha2VmaWxlcwotLk5PVEFCUyAgICAgICAgIDo9IHllcwotCi0jIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcuCi0gICBDQyAgICAgICAgICAgOj0gZ2NjCi0gICBDRkxBR1MgICAgICAgOj0gLVptdCAtWm9tZiAtV2FsbCAtSS4gLUkkKElOQ0xVREUpCi0gICBDWFggICAgICAgICAgOj0gZ2NjIC14IGMrKyAtZm5vLWV4Y2VwdGlvbnMgLWZuby1ydHRpCi0uSUYgJChVU0VfTkFTTSkKLSAgIEFTICAgICAgICAgICA6PSBuYXNtCi0gICBBU0ZMQUdTICAgICAgOj0gLXQgLWYgb2JqIC1GIG51bGwgLWRfX0ZMQVRfXyAtZF9fTk9VX18gLWlJTkNMVURFIC1pJChTQ0lURUNIKVxJTkNMVURFCi0uRUxTRQotICAgQVMgICAgICAgICAgIDo9IHRhc20gICAgICMgQXNzZW1ibGVyIGFuZCBmbGFncwotICAgQVNGTEFHUyAgICAgIDo9IC90IC9teCAvbSAvb2kgL0RfX0ZMQVRfXyAvRF9fTk9VX18gL2lJTkNMVURFIC9pJChTQ0lURUNIKVxJTkNMVURFCi0uRU5ESUYKLSAgIExEICAgICAgICAgICA6PSBnY2MKLSAgIExEWFggICAgICAgICA6PSBnY2MgLXggYysrCi0gICBMREZMQUdTICAgICAgOj0gLUwuIC1ab21mIC1abXQKLSAgIExJQiAgICAgICAgICA6PSBlbXhvbWZhcgotICAgTElCRkxBR1MgICAgIDo9IC1wMzIgcmN2Ci0KLSAgIFlBQ0MgICAgICAgICA6PSBiaXNvbiAteQotICAgTEVYICAgICAgICAgIDo9IGZsZXgKLSAgIFNFRCAgICAgICAgICA6PSBzZWQKLQotIyBPcHRpb25hbGx5IHR1cm4gb2ZmIGV4Y2VwdGlvbnMgYW5kIFJUVEkgZm9yIEMrKyBjb2RlCi0uSUYgJChOT19FWENFUFQpCi0gICBDWFggICAgICAgICAgKz0gLWZuby1leGNlcHRpb25zCi0uRU5ESUYKLS5JRiAkKE5PX1JUVEkpCi0gICBDWFggICAgICAgICAgKz0gLWZuby1ydHRpCi0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gLWcKLS5FTFNFCi0jIFdpdGhvdXQgLXMsIGVteCBhbHdheXMgcnVucyBMSU5LMzg2IHdpdGggdGhlIC9ERUJVRyBvcHRpb24KLSAgIENGTEFHUyAgICAgICArPSAtcwotICAgTERGTEFHUyAgICAgICs9IC1zCi0jIE5BU00gZG9lcyBub3Qgc3VwcG9ydCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24geWV0Ci0gICBBU0ZMQUdTICAgICAgKz0KLS5FTkRJRgotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCi0uSUYgJChPUFRfTUFYKQotICAgQ0ZMQUdTICAgICAgICs9IC1PNgotLkVMSUYgJChPUFQpCi0gICBDRkxBR1MgICAgICAgKz0gLU8zIC1mb21pdC1mcmFtZS1wb2ludGVyCi0uRUxJRiAkKE9QVF9TSVpFKQotICAgQ0ZMQUdTICAgICAgICs9IC1PcwotLkVORElGCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMKLS5JRiAkKEZQVSkKLSAgIENGTEFHUyAgICAgICArPSAtREZQVTM4NwotICAgQVNGTEFHUyAgICAgICs9IC1kRlBVMzg3Ci0uRU5ECi0KLSMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0Ci0uSUYgJChCRVRBKQotICAgQ0ZMQUdTICAgICAgICs9IC1EQkVUQQotICAgQVNGTEFHUyAgICAgICs9IC1kQkVUQQotLkVORElGCi0KLSMgRGlzYWJsZSBzdGFuZGFyZCBDIHJ1bnRpbWUgbGlicmFyeQotLklGICQoTk9fUlVOVElNRSkKLUNGTEFHUyAgICAgICAgICAgICAgICAgICs9IC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMKLS5FTkRJRgotCi0jIExpbmsgYWdhaW5zdCBFTVggRExMcyAoQ1JURExMPTEpIG9yIGxpbmsgd2l0aCBzdGF0aWMgQyBydW50aW1lIGxpYnJhcmllcwotLklGICQoQ1JURExMKQotICBMREZMQUdTICAgICAgICs9IC1aY3J0ZGxsCi0uRUxTRQotICBDRkxBR1MJCSs9IC1ac3lzCi0gIExERkxBR1MgICAgICAgKz0gLVpzeXMKLS5FTkRJRgotCi0jIFRhcmdldCBlbnZpcm9ubWVudCBkZXBlbmRhbnQgZmxhZ3MKLSAgIENGTEFHUyAgICAgICArPSAtRF9fT1MyXzMyX18KLSAgIENGTEFHUyAgICAgICArPSAtRF9fT1MyX18KLSAgIEFTRkxBR1MgICAgICArPSAtZF9fT1MyX18KLQotIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKENIRUNLRUQpCi1MSUJfQkFTRV9ESVIgICAgOj0gJChTQ0lURUNIX0xJQikvbGliL2RlYnVnCi1DRkxBR1MgICAgICAgICAgKz0gLURDSEVDS0VEPTEKLS5FTFNFCi1MSUJfQkFTRV9ESVIgICAgOj0gJChTQ0lURUNIX0xJQikvbGliL3JlbGVhc2UKLS5FTkRJRgotCi0jIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKLSAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFX0RJUilcT1MyMzJcJChFTVhfTElCQkFTRSkKLSAgIExERkxBR1MgICAgICArPSAtTCQoTElCX0RFU1QpCi0KLSMgQnVpbGQgMzItYml0IE9TLzIgYXBwcwotLklGICQoQlVJTERfRExMKQotICAgQ0ZMQUdTICAgICAgICs9IC1aZGxsIC1EQlVJTERfRExMCi0gICBMREZMQUdTICAgICAgKz0gLVpkbGwKLSAgIEFTRkxBR1MgICAgICArPSAtZEJVSUxEX0RMTAotLkVMU0UKLS5JRiAkKFVTRV9PUzJHVUkpCi0gICBDRkxBR1MgICAgICAgKz0gLURfX09TMl9QTV9fCi0gICBMREZMQUdTICAgICAgKz0gLVpsaW5rZXIgL1BNVFlQRTpQTQotLkVMU0UKLS5JRiAkKEZVTExTQ1JFRU4pCi0gICBMREZMQUdTICAgICAgKz0gLVpsaW5rZXIgL1BNVFlQRTpOT1ZJTwotLkVMU0UKLSAgIExERkxBR1MgICAgICArPSAtWmxpbmtlciAvUE1UWVBFOlZJTwotLkVORElGCi0uRU5ESUYKLS5FTkRJRgotCi0jIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKLQotUE1MSUIgICAgICAgICAgIDo9IC1scG0KLQotIyBEZWZpbmUgd2hpY2ggZmlsZSBjb250YWlucyBvdXIgcnVsZXMKLQotICAgUlVMRVNfTUFLICAgIDo9IGVteC5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9nY2NfYmVvcy5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZ2NjX2Jlb3MubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNjJmZGYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9nY2NfYmVvcy5taworKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgRE1BS0Ugc3RhcnR1cCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmaWxlLiBBc3N1bWVzCi0jICAgICAgICAgICAgICAgdGhhdCB0aGUgU0NJVEVDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgdG8gcG9pbnQKLSMgICAgICAgICAgICAgICB0byB3aGVyZSBhbGwgb3VyIHN0dWZmIGlzIGluc3RhbGxlZC4gWW91IHNob3VsZCBub3QgbmVlZAotIyAgICAgICAgICAgICAgIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGlzIGZpbGUuCi0jCi0jICAgICAgICAgICAgICAgQmVPUyB2ZXJzaW9uIGZvciBHTlUgQy9DKysuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIERpc2FibGUgd2FybmluZ3MgZm9yIG1hY3JvcyByZWRlZmluZWQgaGVyZSB0aGF0IHdlcmUgZ2l2ZW4KLSMgb24gdGhlIGNvbW1hbmQgbGluZS4KLV9fLlNJTEVOVCAgICAgICA6PSAkKC5TSUxFTlQpCi0uU0lMRU5UICAgICAgICAgOj0geWVzCi0KLSMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZSBjb21tb24gdG8gYWxsIGNvbXBpbGVycwotLklNUE9SVCAuSUdOT1JFIDogVEVNUCBTSEVMTCBJTkNMVURFIExJQiBTQ0lURUNIIFBSSVZBVEUgU0NJVEVDSF9MSUIKLS5JTVBPUlQgLklHTk9SRSA6IERCRyBPUFQgT1BUX1NJWkUgU0hXIEJFVEEgQ0hFQ0tFRCBVU0VfWDExIFVTRV9MSU5VWAotLklNUE9SVCAuSUdOT1JFIDogVVNFX0VHQ1MgVVNFX1BHQ0MgU1RBVElDX0xJQlMgTElCQwotICAgVE1QRElSICAgICAgIDo9ICQoVEVNUCkKLQotIyBTdGFuZGFyZCBmaWxlIHN1ZmZpeCBkZWZpbml0aW9ucwotIwotIyBOT1RFOiBCZU9TIGRvZXMgbm90IHJlcXVpcmUgYW55IGV4dGVuaW9uIGZvciBleGVjdXRlYWJsZSBmaWxlcywgYnV0IHlvdQotIyAgICAgICBjYW4gdXNlIGFuIGV4dGVuc2lvbiBpZiB5b3Ugd2lzaC4gV2UgdXNlIHRoZSAueCBleHRlbnNpb24gZm9yIGJ1aWxkaW5nCi0jICAgICAgIGV4ZWN1dGVhYmxlIGZpbGVzIHNvIHRoYXQgd2UgY2FuIHVzZSBpbXBsaWNpdCBydWxlcyB0byBtYWtlIHRoZQotIyAgICAgICBtYWtlZmlsZXMgc2ltcGxlciBhbmQgbW9yZSBwb3J0YWJsZSBiZXR3ZWVuIHN5c3RlbXMuIFdoZW4geW91IGluc3RhbGwKLSMgICAgICAgdGhlIGZpbGVzIHRvIGEgbG9jYWwgYmluIGRpcmVjdG9yeSwgeW91IHdpbGwgcHJvYmFibHkgd2FudCB0byByZW1vdmUKLSMgICAgICAgdGhlIC54IGV4dGVuc2lvbi4KLSAgIEwgICAgICAgICAgICA6PSAuYSAgIAkjIExpYnJhcmllcwotICAgRSAgICAgICAgICAgIDo9IC54ICAgCSMgRXhlY3V0YWJsZXMKLSAgIE8gICAgICAgICAgICA6PSAubyAgIAkjIE9iamVjdHMKLSAgIEEgICAgICAgICAgICA6PSAuYXNtICAgCSMgQXNzZW1ibGVyIHNvdXJjZXMKLSAgIFMgICAgICAgICAgICA6PSAucyAgICAgICAjIEdOVSBhc3NlbWJsZXIgc291cmNlcwotICAgUCAgICAgICAgICAgIDo9IC5jcHAgICAJIyBDKysgc291cmNlcwotCi0jIEZpbGUgcHJlZml4L3N1ZmZpeCBkZWZpbml0aW9ucy4gVGhlIGZvbGxvd2luZyBwcmVmaXhlcyBhcmUgZGVmaW5lZCwgYW5kIGFyZQotIyB1c2VkIHByaW1hcmlseSB0byBhYnN0cmFjdCBiZXR3ZWVuIHRoZSBVbml4IHN0eWxlIGxpYlhYLmEgbmFtaW5nIGNvbnZlbnRpb24KLSMgYW5kIHRoZSBET1MvV2luZG93cy9PUzIgbmFtaW5nIGNvbnZlbnRpb24gb2YgWFgubGliLgotICAgTFAgICAgICAgICAgIDo9IGxpYiAgICAgICMgTFAgLSBMaWJyYXJ5IGZpbGUgcHJlZml4IChuYW1lIG9mIGZpbGUgb24gZGlzaykKLSAgIExMICAgICAgICAgICA6PSAtbAkJIyBMaWJyYXJ5IGxpbmsgcHJlZml4IChuYW1lIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCi0gICBMRSAgICAgICAgICAgOj0gCQkgICAgIyBMaWJyYXJ5IGxpbmsgc3VmZml4IChleHRlbnNpb24gb2YgbGlicmFyeSBvbiBsaW5rIGNvbW1hbmQgbGluZSkKLQotIyBXZSB1c2UgdGhlIFVuaXggc2hlbGwgYXQgYWxsIHRpbWVzCi0gICBTSEVMTEZMQUdTICAgOj0gLWMKLQotIyBEZWZpbml0aW9uIG9mICQoTUFLRSkgbWFjcm8gZm9yIHJlY3Vyc2l2ZSBtYWtlcy4KLSAgIE1BS0UgPSAkKE1BS0VDTUQpICQoTUZMQUdTKQotCi0jIE1hY3JvIHRvIGluc3RhbGwgYSBsaWJyYXJ5IGZpbGUKLSAgIElOU1RBTEwgICAgICA6PSBjcAotCi0jIERNQUtFIHVzZXMgdGhpcyByZWNpcGUgdG8gcmVtb3ZlIGludGVybWVkaWF0ZSB0YXJnZXRzCi0uUkVNT1ZFIDo7ICQoUk0pIC1mICQ8Ci0KLSMgVHVybiB3YXJuaW5ncyBiYWNrIHRvIHByZXZpb3VzIHNldHRpbmcuCi0uU0lMRU5UIDo9ICQoX18uU0lMRU5UKQotCi0jIFdlIGRvbnQgdXNlIFRBQlMgaW4gb3VyIG1ha2VmaWxlcwotLk5PVEFCUyAgICAgICAgIDo9IHllcwotCi0jIERlZmluZSB0aGF0IHdlIGFyZSBjb21waWxpbmcgZm9yIEJlT1MKLSAgIFVTRV9CRU9TICAgICA6PSAxCi0KLSMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZy4KLSAgIENDICAgICAgICAgICA6PSBnY2MKLSAgIENGTEFHUyAgICAgICA6PSAtV2FsbCAtSS4gLUlpbmNsdWRlICQoSU5DTFVERSkKLSAgIENYWCAgICAgICAgICA6PSBnKysKLSAgIEFTICAgICAgICAgICA6PSBuYXNtCi0gICBBU0ZMQUdTICAgICAgOj0gLWYgZWxmIC1kX19GTEFUX18gLWlpbmNsdWRlIC1pJChTQ0lURUNIKS9pbmNsdWRlIC1kX19OT1VfXwotICAgTEQgICAgICAgICAgIDo9IGdjYwotICAgTERGTEFHUyAgICAgIDo9IC1MLgotICAgTElCICAgICAgICAgIDo9IGFyCi0gICBMSUJGTEFHUyAgICAgOj0gcmNzCi0KLSMgTGluayB0byBzdGF0aWMgbGlicmFyaWVzIGlmIHJlcXVlc3RlZAotLklGICQoU1RBVElDX0xJQlMpCi0gICBMREZMQUdTICAgICAgKz0gLXN0YXRpYwotLkVORElGCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotLklGICQoREJHKQotICAgQ0ZMQUdTICAgICAgICs9IC1nCi0uRUxTRQotIyBOQVNNIGRvZXMgbm90IHN1cHBvcnQgZGVidWdnaW5nIGluZm9ybWF0aW9uIHlldAotICAgQVNGTEFHUyAgICAgICs9Ci0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucwotLklGICQoT1BUX01BWCkKLSAgIENGTEFHUyAgICAgICArPSAtTzYKLS5FTElGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC1PMgotLkVMSUYgJChPUFRfU0laRSkKLSAgIENGTEFHUyAgICAgICArPSAtTzEKLS5FTkRJRgotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zCi0uSUYgJChGUFUpCi0gICBDRkxBR1MgICAgICAgKz0gLURGUFUzODcKLSAgIEFTRkxBR1MgICAgICArPSAtZEZQVTM4NwotLkVORAotCi0jIE9wdGlvbmFsbHkgY29tcGlsZSBhIGJldGEgcmVsZWFzZSB2ZXJzaW9uIG9mIGEgcHJvZHVjdAotLklGICQoQkVUQSkKLSAgIENGTEFHUyAgICAgICArPSAtREJFVEEKLSAgIEFTRkxBR1MgICAgICArPSAtZEJFVEEKLS5FTkRJRgotCi0jIERpc2FibGUgc3RhbmRhcmQgQyBydW50aW1lIGxpYnJhcnkKLQotLklGICQoTk9fUlVOVElNRSkKLUNGTEFHUwkJCSs9IC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMKLS5FTkRJRgotCi0jIFRhcmdldCBlbnZpcm9ubWVudCBkZXBlbmRhbnQgZmxhZ3MKLSAgIENGTEFHUyAgICAgICArPSAtRF9fQkVPU19fCi0gICBBU0ZMQUdTICAgICAgKz0gLWRfX0JFT1NfXyAtZF9fVU5JWF9fCi0KLSMgRGVmaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcwotCi0uSUYgJChDSEVDS0VEKQotTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpL2xpYi9kZWJ1ZwotQ0ZMQUdTCQkrPSAtRENIRUNLRUQ9MQotLkVMU0UKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKS9saWIvcmVsZWFzZQotLkVORElGCi0KLSMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcwotTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0VfRElSKS9iZW9zL2djYwotTERGTEFHUyAgICAgICs9IC1MJChMSUJfREVTVCkKLQotIyBQbGFjZSB0byBsb29rIGZvciBQTU9ERSBsaWJyYXJ5IGZpbGVzCi0KLVBNTElCICAgICAgICAgICA6PSAtbHBtCi0KLSMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCi0KLSAgIFJVTEVTX01BSwk6PSBnY2NfYmVvcy5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9nY2NfZG9zLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9nY2NfZG9zLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTU4OWM4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZ2NjX2Rvcy5taworKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgRE1BS0Ugc3RhcnR1cCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmaWxlLiBBc3N1bWVzCi0jICAgICAgICAgICAgICAgdGhhdCB0aGUgU0NJVEVDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgdG8gcG9pbnQKLSMgICAgICAgICAgICAgICB0byB3aGVyZSBhbGwgb3VyIHN0dWZmIGlzIGluc3RhbGxlZC4gWW91IHNob3VsZCBub3QgbmVlZAotIyAgICAgICAgICAgICAgIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGlzIGZpbGUuCi0jCi0jICAgICAgICAgICAgICAgREpHUFAgVjIgcG9ydCBvZiBHTlUgQy9DKysgdG8gRE9TIHdpdGggRFBNSSBvbmx5LgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBJbmNsdWRlIHN0YW5kYXJkIHN0YXJ0dXAgc2NyaXB0IGRlZmluaXRpb25zCi0uSU1QT1JUOiBTQ0lURUNICi0uSU5DTFVERTogIiQoU0NJVEVDSClcbWFrZWRlZnNcc3RhcnR1cC5tayIKLQotIyBPdmVycmlkZSBzb21lIGZpbGUgc3VmZml4IGRlZmluaXRpb25zCi0gICBMICAgICAgICAgICAgOj0gLmEgICAgICMgTGlicmFyaWVzCi0gICBPICAgICAgICAgICAgOj0gLm8gICAgICMgT2JqZWN0cwotCi0jIE92ZXJyaWRlIHRoZSBmaWxlIHByZWZpeC9zdWZmaXggZGVmaW5pdGlvbnMgZm9yIGxpYnJhcnkgbmFtaW5nLgotICAgTFAgICAgICAgICAgIDo9IGxpYgkJIyBMUCAtIExpYnJhcnkgZmlsZSBwcmVmaXggKG5hbWUgb2YgZmlsZSBvbiBkaXNrKQotICAgTEwgICAgICAgICAgIDo9IC1sCQkjIExpYnJhcnkgbGluayBwcmVmaXggKG5hbWUgb2YgbGlicmFyeSBvbiBsaW5rIGNvbW1hbmQgbGluZSkKLSAgIExFICAgICAgICAgICA6PQkJCSMgTGlicmFyeSBsaW5rIHN1ZmZpeCAoZXh0ZW5zaW9uIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCi0KLSMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZQotLklNUE9SVCAuSUdOT1JFIDogREpfTElCQkFTRQotCi0jIFdlIGFyZSBjb21waWxpbmcgZm9yIGEgMzIgYml0IGVudmlvbm1lbnQKLSAgIF8zMkJJVF8gICAgICA6PSAxCi0KLSMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZwotICAgQ0MgICAgICAgICAgIDo9IGdjYyAgICAgICMgQy1jb21waWxlciBhbmQgZmxhZ3MKLSAgIENGTEFHUyAgICAgICA6PSAtV2FsbAotICAgQVMJCQk6PSBuYXNtCi0gICBBU0ZMQUdTICAgICAgOj0gLXQgLWYgY29mZiAtRiBudWxsIC1kX19GTEFUX18gLWRfX0dOVUNfXyAtZFNURENBTExfVVNDT1JFIC1pSU5DTFVERSAtaSQoU0NJVEVDSClcSU5DTFVERQotICAgTEQgICAgICAgICAgIDo9IGRqX2xkICAgICMgTG9hZGVyIGFuZCBmbGFncwotICAgTERGTEFHUyAgICAgIDo9Ci0gICBMSUIgICAgICAgICAgOj0gYXIgICAgICAgIyBMaWJyYXJpYW4KLSAgIExJQkZMQUdTICAgICA6PSBycwotICAgVVNFX05BU00JCTo9IDEKLSAgIFVTRV9HQ0MJCTo9IDEKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gLWcgICAgICAgIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgQyBjb21waWxlcgotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCi0uSUYgJChPUFQpCi0gICBDRkxBR1MgICAgICAgKz0gLU8yCi0uRUxJRiAkKE9QVF9TSVpFKQotICAgQ0ZMQUdTICAgICAgICs9IC1PMQotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zCi0KLS5JRiAkKEZQVSkKLSAgIENGTEFHUyAgICAgICArPSAtREZQVTM4NwotICAgQVNGTEFHUyAgICAgICs9IC1kRlBVMzg3Ci0uRU5ECi0KLSMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0Ci0uSUYgJChCRVRBKQotICAgQ0ZMQUdTICAgICAgICs9IC1EQkVUQQotICAgQVNGTEFHUyAgICAgICs9IC1kQkVUQQotLkVORAotCi0jIERPUyBleHRlbmRlciBkZXBlbmRhbnQgZmxhZ3MKLSAgIERYX0NGTEFHUyAgICArPQotICAgRFhfQVNGTEFHUyAgICs9IC1kREpHUFAKLSAgIFVTRV9SRUFMRE9TCTo9IDEKLQotIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKENIRUNLRUQpCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXGRlYnVnCi1DRkxBR1MJCQkrPSAtRENIRUNLRUQ9MQotLkVMU0UKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJccmVsZWFzZQotLkVORElGCi0KLSMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcwotICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0VfRElSKVxET1MzMlwkKERKX0xJQkJBU0UpCi0KLSMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcwotCi1QTUxJQiAgICAgICAgICAgOj0gLWxwbQotCi0jIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcwotCi0gICBSVUxFU19NQUsJOj0gZGozMi5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9nY2NfZnJlZWJzZC5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZ2NjX2ZyZWVic2QubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYjRiODUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9nY2NfZnJlZWJzZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgRE1BS0Ugc3RhcnR1cCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmaWxlLiBBc3N1bWVzCi0jICAgICAgICAgICAgICAgdGhhdCB0aGUgU0NJVEVDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgdG8gcG9pbnQKLSMgICAgICAgICAgICAgICB0byB3aGVyZSBhbGwgb3VyIHN0dWZmIGlzIGluc3RhbGxlZC4gWW91IHNob3VsZCBub3QgbmVlZAotIyAgICAgICAgICAgICAgIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGlzIGZpbGUuCi0jCi0jICAgICAgICAgICAgICAgTGludXggdmVyc2lvbiBmb3IgR05VIEMvQysrLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBEaXNhYmxlIHdhcm5pbmdzIGZvciBtYWNyb3MgcmVkZWZpbmVkIGhlcmUgdGhhdCB3ZXJlIGdpdmVuCi0jIG9uIHRoZSBjb21tYW5kIGxpbmUuCi1fXy5TSUxFTlQgICAgICAgOj0gJCguU0lMRU5UKQotLlNJTEVOVCAgICAgICAgIDo9IHllcwotCi0jIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UgY29tbW9uIHRvIGFsbCBjb21waWxlcnMKLS5JTVBPUlQgLklHTk9SRSA6IFRFTVAgU0hFTEwgSU5DTFVERSBMSUIgU0NJVEVDSCBQUklWQVRFIFNDSVRFQ0hfTElCCi0uSU1QT1JUIC5JR05PUkUgOiBEQkcgT1BUIE9QVF9TSVpFIFNIVyBCRVRBIENIRUNLRUQgVVNFX1gxMSBVU0VfRlJFRUJTRAotLklNUE9SVCAuSUdOT1JFIDogVVNFX0VHQ1MgVVNFX1BHQ0MgU1RBVElDX0xJQlMKLSAgIFRNUERJUiAgICAgICA6PSAkKFRFTVApCi0KLSMgU3RhbmRhcmQgZmlsZSBzdWZmaXggZGVmaW5pdGlvbnMKLSMKLSMgTk9URTogTGludXggZG9lcyBub3QgcmVxdWlyZSBhbnkgZXh0ZW5pb24gZm9yIGV4ZWN1dGVhYmxlIGZpbGVzLCBidXQgeW91Ci0jICAgICAgIGNhbiB1c2UgYW4gZXh0ZW5zaW9uIGlmIHlvdSB3aXNoLiBXZSB1c2UgdGhlIC54IGV4dGVuc2lvbiBmb3IgYnVpbGRpbmcKLSMgICAgICAgZXhlY3V0ZWFibGUgZmlsZXMgc28gdGhhdCB3ZSBjYW4gdXNlIGltcGxpY2l0IHJ1bGVzIHRvIG1ha2UgdGhlCi0jICAgICAgIG1ha2VmaWxlcyBzaW1wbGVyIGFuZCBtb3JlIHBvcnRhYmxlIGJldHdlZW4gc3lzdGVtcy4gV2hlbiB5b3UgaW5zdGFsbAotIyAgICAgICB0aGUgZmlsZXMgdG8gYSBsb2NhbCBiaW4gZGlyZWN0b3J5LCB5b3Ugd2lsbCBwcm9iYWJseSB3YW50IHRvIHJlbW92ZQotIyAgICAgICB0aGUgLnggZXh0ZW5zaW9uLgotICAgTCAgICAgICAgICAgIDo9IC5hICAgCSMgTGlicmFyaWVzCi0gICBFICAgICAgICAgICAgOj0gLnggICAJIyBFeGVjdXRhYmxlcwotICAgTyAgICAgICAgICAgIDo9IC5vICAgCSMgT2JqZWN0cwotICAgQSAgICAgICAgICAgIDo9IC5hc20gICAJIyBBc3NlbWJsZXIgc291cmNlcwotICAgUyAgICAgICAgICAgIDo9IC5zICAgICAgICMgR05VIGFzc2VtYmxlciBzb3VyY2VzCi0gICBQICAgICAgICAgICAgOj0gLmNwcCAgIAkjIEMrKyBzb3VyY2VzCi0KLSMgRmlsZSBwcmVmaXgvc3VmZml4IGRlZmluaXRpb25zLiBUaGUgZm9sbG93aW5nIHByZWZpeGVzIGFyZSBkZWZpbmVkLCBhbmQgYXJlCi0jIHVzZWQgcHJpbWFyaWx5IHRvIGFic3RyYWN0IGJldHdlZW4gdGhlIFVuaXggc3R5bGUgbGliWFguYSBuYW1pbmcgY29udmVudGlvbgotIyBhbmQgdGhlIERPUy9XaW5kb3dzL09TMiBuYW1pbmcgY29udmVudGlvbiBvZiBYWC5saWIuCi0gICBMUCAgICAgICAgICAgOj0gbGliICAgICAgIyBMUCAtIExpYnJhcnkgZmlsZSBwcmVmaXggKG5hbWUgb2YgZmlsZSBvbiBkaXNrKQotICAgTEwgICAgICAgICAgIDo9IC1sCQkjIExpYnJhcnkgbGluayBwcmVmaXggKG5hbWUgb2YgbGlicmFyeSBvbiBsaW5rIGNvbW1hbmQgbGluZSkKLSAgIExFICAgICAgICAgICA6PSAJCSAgICAjIExpYnJhcnkgbGluayBzdWZmaXggKGV4dGVuc2lvbiBvZiBsaWJyYXJ5IG9uIGxpbmsgY29tbWFuZCBsaW5lKQotCi0jIFdlIHVzZSB0aGUgVW5peCBzaGVsbCBhdCBhbGwgdGltZXMKLSAgIFNIRUxMCQk6PSAvYmluL3NoCi0gICBTSEVMTEZMQUdTICAgOj0gLWMKLQotIyBEZWZpbml0aW9uIG9mICQoTUFLRSkgbWFjcm8gZm9yIHJlY3Vyc2l2ZSBtYWtlcy4KLSAgIE1BS0UgPSAkKE1BS0VDTUQpICQoTUZMQUdTKQotCi0jIE1hY3JvIHRvIGluc3RhbGwgYSBsaWJyYXJ5IGZpbGUKLSAgIElOU1RBTEwgICAgICA6PSBjcAotCi0jIERNQUtFIHVzZXMgdGhpcyByZWNpcGUgdG8gcmVtb3ZlIGludGVybWVkaWF0ZSB0YXJnZXRzCi0uUkVNT1ZFIDo7ICQoUk0pIC1mICQ8Ci0KLSMgVHVybiB3YXJuaW5ncyBiYWNrIHRvIHByZXZpb3VzIHNldHRpbmcuCi0uU0lMRU5UIDo9ICQoX18uU0lMRU5UKQotCi0jIFdlIGRvbnQgdXNlIFRBQlMgaW4gb3VyIG1ha2VmaWxlcwotLk5PVEFCUyAgICAgICAgIDo9IHllcwotCi0jIERlZmluZSB0aGF0IHdlIGFyZSBjb21waWxpbmcgZm9yIEZyZWVCU0QKLSAgIFVTRV9MSU5VWCAgICA6PSAxCi0KLSMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZy4KLS5JRiAkKFVTRV9FR0NTKQotICAgQ0MgICAgICAgICAgIDo9IGVnY3MKLS5FTElGICQoVVNFX1BHQ0MpCi0gICBDQwkJOj0gcGdjYwotLkVMU0UKLSAgIENDICAgICAgICAgICA6PSBnY2MKLS5FTkRJRgotICAgQ0ZMQUdTICAgICAgIDo9IC1XYWxsIC1JLiAtSWluY2x1ZGUgJChJTkNMVURFKQotICAgQ1hYICAgICAgICAgIDo9IGcrKwotICAgQVMgICAgICAgICAgIDo9IG5hc20KLSMgVE9ETzogT24gZWFybGllciB2ZXJzaW9ucyBvZiBGcmVlQlNEICg8My4wKSBhLm91dCBpcyB1c2VkIGluc3RlYWQgb2YgRUxGCi0gICBBU0ZMQUdTICAgICAgOj0gLWYgZWxmIC1kX19GTEFUX18gLWlpbmNsdWRlIC1pJChTQ0lURUNIKS9pbmNsdWRlIC1kX19OT1VfXwotICAgTEQgICAgICAgICAgIDo9IGcrKwotICAgTERGTEFHUyAgICAgIDo9IC1MLgotICAgTElCICAgICAgICAgIDo9IGFyCi0gICBMSUJGTEFHUyAgICAgOj0gcmNzCi0KLSMgTGluayB0byBzdGF0aWMgbGlicmFyaWVzIGlmIHJlcXVlc3RlZAotLklGICQoU1RBVElDX0xJQlMpCi0gICBMREZMQUdTICAgICAgKz0gLXN0YXRpYwotLkVORElGCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotLklGICQoREJHKQotICAgQ0ZMQUdTICAgICAgICs9IC1nCi0uRUxTRQotIyBOQVNNIGRvZXMgbm90IHN1cHBvcnQgZGVidWdnaW5nIGluZm9ybWF0aW9uIHlldAotICAgQVNGTEFHUyAgICAgICs9Ci0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucwotLklGICQoT1BUX01BWCkKLSAgIENGTEFHUyAgICAgICArPSAtTzYKLS5FTElGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC1PMgotLkVMSUYgJChPUFRfU0laRSkKLSAgIENGTEFHUyAgICAgICArPSAtTzEKLS5FTkRJRgotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zCi0uSUYgJChGUFUpCi0gICBDRkxBR1MgICAgICAgKz0gLURGUFUzODcKLSAgIEFTRkxBR1MgICAgICArPSAtZEZQVTM4NwotLkVORAotCi0jIE9wdGlvbmFsbHkgY29tcGlsZSBhIGJldGEgcmVsZWFzZSB2ZXJzaW9uIG9mIGEgcHJvZHVjdAotLklGICQoQkVUQSkKLSAgIENGTEFHUyAgICAgICArPSAtREJFVEEKLSAgIEFTRkxBR1MgICAgICArPSAtZEJFVEEKLS5FTkRJRgotCi0jIERpc2FibGUgc3RhbmRhcmQgQyBydW50aW1lIGxpYnJhcnkKLQotLklGICQoTk9fUlVOVElNRSkKLUNGTEFHUwkJCSs9IC1mbm8tYnVpbHRpbiAtbm9zdGRpbmMKLS5FTkRJRgotCi0jIENvbXBpbGUgZmxhZyBmb3Igd2hldGhlciB0byBidWlsZCBYMTEgb3Igbm9uLVgxMSBsaWIKLS5JRiAkKFVTRV9YMTEpCi0gICBDRkxBR1MgICAgICAgKz0gLURfX1gxMV9fCi0uRU5ESUYKLQotIyBUYXJnZXQgZW52aXJvbm1lbnQgZGVwZW5kYW50IGZsYWdzCi0gICBDRkxBR1MgICAgICAgKz0gLURfX0ZSRUVCU0RfXwotICAgQVNGTEFHUyAgICAgICs9IC1kX19GUkVFQlNEX18gLWRfX1VOSVhfXwotCi0jIERlZmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIGxpYnJhcnkgZmlsZXMKLQotLklGICQoQ0hFQ0tFRCkKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKS9saWIvZGVidWcKLUNGTEFHUwkJKz0gLURDSEVDS0VEPTEKLS5FTFNFCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQikvbGliL3JlbGVhc2UKLS5FTkRJRgotCi0jIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKLSAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFX0RJUikvZnJlZWJzZC9nY2MKLSAgIExERkxBR1MgICAgICArPSAtTCQoTElCX0RFU1QpCi0KLSMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcwotCi1QTUxJQiAgICAgICAgICAgOj0gLWxwbQotCi0jIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcwotCi0gICBSVUxFU19NQUsJOj0gZ2NjX2ZyZWVic2QubWsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZ2NjX2xpbnV4Lm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9nY2NfbGludXgubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYzRjZWQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9nY2NfbGludXgubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcwotIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50Ci0jICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKLSMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgotIwotIyAgICAgICAgICAgICAgIExpbnV4IHZlcnNpb24gZm9yIEdOVSBDL0MrKy4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgSW5jbHVkZSBzdGFuZGFyZCBzdGFydHVwIHNjcmlwdCBkZWZpbml0aW9ucwotLklNUE9SVDogU0NJVEVDSAotLklOQ0xVREU6ICIkKFNDSVRFQ0gpL21ha2VkZWZzL3N0YXJ0dXAubWsiCi0KLSMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZQotLklNUE9SVCAuSUdOT1JFIDogR0NDMl9MSUJCQVNFCi0KLSMgT3ZlcnJpZGUgc29tZSBmaWxlIHN1ZmZpeCBkZWZpbml0aW9ucwotICAgTCAgICAgICAgICAgIDo9IC5hICAgICAjIExpYnJhcmllcwotICAgTyAgICAgICAgICAgIDo9IC5vICAgICAjIE9iamVjdHMKLQotIyBPdmVycmlkZSB0aGUgZmlsZSBwcmVmaXgvc3VmZml4IGRlZmluaXRpb25zIGZvciBsaWJyYXJ5IG5hbWluZy4KLSAgIExQICAgICAgICAgICA6PSBsaWIJCSMgTFAgLSBMaWJyYXJ5IGZpbGUgcHJlZml4IChuYW1lIG9mIGZpbGUgb24gZGlzaykKLSAgIExMICAgICAgICAgICA6PSAtbAkJIyBMaWJyYXJ5IGxpbmsgcHJlZml4IChuYW1lIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCi0gICBMRSAgICAgICAgICAgOj0JCQkjIExpYnJhcnkgbGluayBzdWZmaXggKGV4dGVuc2lvbiBvZiBsaWJyYXJ5IG9uIGxpbmsgY29tbWFuZCBsaW5lKQotCi0jIFdlIGFyZSBjb21waWxpbmcgZm9yIGEgMzIgYml0IGVudmlvbm1lbnQKLSAgIF8zMkJJVF8gICAgICA6PSAxCi0KLSMgRGVmaW5lIHRoYXQgd2UgYXJlIGNvbXBpbGluZyBmb3IgTGludXgKLSAgIFVTRV9MSU5VWCAgICA6PSAxCi0KLSMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZy4KLSAgIENDICAgICAgICAgICA6PSBnY2MKLSAgIENGTEFHUyAgICAgICA6PSAtV2FsbCAtSS4gLUlpbmNsdWRlIC1JJChTQ0lURUNIOnMsXCwvKS9pbmNsdWRlIC1JJChQUklWQVRFOnMsXCwvKS9pbmNsdWRlCi0gICBTSE9XX0NGTEFHUwk6PSAtYwotICAgQ1hYICAgICAgICAgIDo9IGcrKwotICAgQVMgICAgICAgICAgIDo9IG5hc20KLSAgIEFTRkxBR1MgICAgICA6PSAtdCAtZiBlbGYgLWRfX0ZMQVRfXyAtZF9fR05VQ19fIC1paW5jbHVkZSAtaSQoU0NJVEVDSCkvaW5jbHVkZSAtZF9fTk9VX18KLSAgIFNIT1dfQVNGTEFHUwk6PSAtZiBlbGYKLSAgIExEICAgICAgICAgICA6PSBnY2MKLSAgIExEWFgJCQk6PSBnKysKLSAgIExERkxBR1MgICAgICA6PSAtTC4KLSAgIExJQiAgICAgICAgICA6PSBhcgotICAgTElCRkxBR1MgICAgIDo9IHJjcwotICAgWUFDQwkJCTo9IGJpc29uIC15Ci0gICBMRVgJCQk6PSBmbGV4Ci0gICBTRUQJCQk6PSBzZWQKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gLWcKLSAgIFNIT1dfQ0ZMQUdTICArPSAtZwotLkVMU0UKLSMgTkFTTSBkb2VzIG5vdCBzdXBwb3J0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB5ZXQKLSAgIEFTRkxBR1MgICAgICArPQotLkVORElGCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIG9wdGltaXNhdGlvbnMKLS5JRiAkKE9QVF9NQVgpCi0gICBDRkxBR1MgICAgICAgKz0gLU82Ci0gICBTSE9XX0NGTEFHUyAgKz0gLU82Ci0uRUxJRiAkKE9QVCkKLSAgIENGTEFHUyAgICAgICArPSAtTzIKLSAgIFNIT1dfQ0ZMQUdTICArPSAtTzIKLS5FTElGICQoT1BUX1NJWkUpCi0gICBDRkxBR1MgICAgICAgKz0gLU8xCi0gICBTSE9XX0NGTEFHUyAgKz0gLU8xCi0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGlyZWN0IGkzODcgRlBVIGluc3RydWN0aW9ucwotLklGICQoRlBVKQotICAgQ0ZMQUdTICAgICAgICs9IC1ERlBVMzg3Ci0gICBBU0ZMQUdTICAgICAgKz0gLWRGUFUzODcKLS5FTkQKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKLS5JRiAkKEJFVEEpCi0gICBDRkxBR1MgICAgICAgKz0gLURCRVRBCi0gICBTSE9XX0NGTEFHUyAgKz0gLURCRVRBCi0gICBBU0ZMQUdTICAgICAgKz0gLWRCRVRBCi0gICBTSE9XX0FTRkxBR1MgKz0gLWRCRVRBCi0uRU5ESUYKLQotIyBEaXNhYmxlIHN0YW5kYXJkIEMgcnVudGltZSBsaWJyYXJ5Ci0KLS5JRiAkKE5PX1JVTlRJTUUpCi1DRkxBR1MJCQkrPSAtZm5vLWJ1aWx0aW4gLW5vc3RkaW5jCi0uRU5ESUYKLQotIyBDb21waWxlIGZsYWcgZm9yIHdoZXRoZXIgdG8gYnVpbGQgWDExIG9yIG5vbi1YMTEgbGliCi0uSUYgJChVU0VfWDExKQotICAgQ0ZMQUdTICAgICAgICs9IC1EX19YMTFfXwotLkVORElGCi0KLSMgVGFyZ2V0IGVudmlyb25tZW50IGRlcGVuZGFudCBmbGFncwotICAgQ0ZMQUdTICAgICAgICs9IC1EX19MSU5VWF9fCi0gICBBU0ZMQUdTICAgICAgKz0gLWRfX0xJTlVYX18gLWRfX1VOSVhfXwotCi0jIERlZmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIGxpYnJhcnkgZmlsZXMKLQotLklGICQoQ0hFQ0tFRCkKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKS9saWIvZGVidWcKLUNGTEFHUwkJICAgICs9IC1EQ0hFQ0tFRD0xCi1TSE9XX0NGTEFHUwkgICAgKz0gLURDSEVDS0VEPTEKLS5FTFNFCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQikvbGliL3JlbGVhc2UKLS5FTkRJRgotCi0jIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKLS5JRiAkKExJQkMpCi0gICBMSUJfREVTVF9TSEFSRUQgIDo9ICQoTElCX0JBU0VfRElSKS9saW51eC9nY2MvbGliYy5zbwotICAgTElCX0RFU1RfU1RBVElDICA6PSAkKExJQl9CQVNFX0RJUikvbGludXgvZ2NjL2xpYmMKLS5FTFNFCi0gICBMSUJfREVTVF9TSEFSRUQgIDo9ICQoTElCX0JBU0VfRElSKS9saW51eC9nY2MvZ2xpYmMuc28KLSAgIExJQl9ERVNUX1NUQVRJQyAgOj0gJChMSUJfQkFTRV9ESVIpL2xpbnV4L2djYy9nbGliYwotLkVORElGCi0KLSMgTGluayB0byBzdGF0aWMgbGlicmFyaWVzIGlmIHJlcXVlc3RlZAotLklGICQoU1RBVElDX0xJQlNfQUxMKQotICAgTERGTEFHUyAgICAgICs9IC1zdGF0aWMKLSAgIFNUQVRJQ19MSUJTICA6PSAxCi0uRU5ESUYKLQotIyBMaW5rIHRvIHN0YXRpYyBsaWJyYXJpZXMgaWYgcmVxdWVzdGVkCi0uSUYgJChTVEFUSUNfTElCUykKLSAgIExERkxBR1MgICAgICArPSAtTCQoTElCX0RFU1RfU1RBVElDKQotLkVMU0UKLSAgIExERkxBR1MgICAgICArPSAtTCQoTElCX0RFU1RfU0hBUkVEKSAtTCQoTElCX0RFU1RfU1RBVElDKQotLkVORElGCi0KLSMgT3B0aW9uYWxseSBlbmFibGUgc29tZSAgZHluYW1pYyBsaWJyYXJpZXMgdG8gYmUgYnVpbHQKLS5JRiAkKEJVSUxEX0RMTCkKLS5JRiAkKFZFUlNJT05NQUopCi0uRUxTRQotICAgVkVSU0lPTk1BSgk6PSA1Ci0gICBWRVJTSU9OTUlOCTo9IDAKLS5FTkRJRgotICAgVkVSU0lPTiAgICAgIDo9ICQoVkVSU0lPTk1BSikuJChWRVJTSU9OTUlOKQotICAgTElCCQkgICAgOj0gZ2NjIC1zaGFyZWQKLSAgIExJQkZMQUdTCSAgICA6PQotICAgTAkJICAgIDo9IC5zbwotICAgQ0ZMQUdTCSAgICArPSAtZlBJQwotICAgU0hPV19DRkxBR1MJKz0gLWZQSUMKLSAgIEFTRkxBR1MgICAgICArPSAtRF9fUElDX18KLSAgIFNIT1dfQVNGTEFHUyArPSAtRF9fUElDX18KLSAgIExJQl9ERVNUICAgICA6PSAkKExJQl9ERVNUX1NIQVJFRCkKLS5FTFNFCi0gICBMSUJfREVTVCAgICAgOj0gJChMSUJfREVTVF9TVEFUSUMpCi0uRU5ESUYKLQotIyBQbGFjZSB0byBsb29rIGZvciBQTU9ERSBsaWJyYXJ5IGZpbGVzCi0KLVBNTElCICAgICAgICAgICA6PSAtbHBtCi0KLSMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCi0KLSAgIFJVTEVTX01BSwk6PSBnY2NfbGludXgubWsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvZ2NjX3dpbjMyLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9nY2Nfd2luMzIubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxY2NmOTcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9nY2Nfd2luMzIubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcwotIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50Ci0jICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKLSMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgotIwotIyAgICAgICAgICAgICAgIEN5Z3dpbiBwb3J0IG9mIEdOVSBDL0MrKyB0byBXaW4zMi4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgSW5jbHVkZSBzdGFuZGFyZCBzdGFydHVwIHNjcmlwdCBkZWZpbml0aW9ucwotLklNUE9SVDogU0NJVEVDSAotLklOQ0xVREU6ICIkKFNDSVRFQ0gpXG1ha2VkZWZzXHN0YXJ0dXAubWsiCi0KLSMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZQotLklNUE9SVCAuSUdOT1JFIDogR0NDMl9MSUJCQVNFCi0KLSMgT3ZlcnJpZGUgc29tZSBmaWxlIHN1ZmZpeCBkZWZpbml0aW9ucwotICAgTCAgICAgICAgICAgIDo9IC5hICAgICAjIExpYnJhcmllcwotICAgTyAgICAgICAgICAgIDo9IC5vICAgICAjIE9iamVjdHMKLQotIyBPdmVycmlkZSB0aGUgZmlsZSBwcmVmaXgvc3VmZml4IGRlZmluaXRpb25zIGZvciBsaWJyYXJ5IG5hbWluZy4KLSAgIExQICAgICAgICAgICA6PSBsaWIJCSMgTFAgLSBMaWJyYXJ5IGZpbGUgcHJlZml4IChuYW1lIG9mIGZpbGUgb24gZGlzaykKLSAgIExMICAgICAgICAgICA6PSAtbAkJIyBMaWJyYXJ5IGxpbmsgcHJlZml4IChuYW1lIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCi0gICBMRSAgICAgICAgICAgOj0JCQkjIExpYnJhcnkgbGluayBzdWZmaXggKGV4dGVuc2lvbiBvZiBsaWJyYXJ5IG9uIGxpbmsgY29tbWFuZCBsaW5lKQotCi0jIFdlIGFyZSBjb21waWxpbmcgZm9yIGEgMzIgYml0IGVudmlvbm1lbnQKLSAgIF8zMkJJVF8gICAgICA6PSAxCi0KLSMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZwotICAgQ0MgICAgICAgICAgIDo9IGdjYyAgICAgICMgQy1jb21waWxlciBhbmQgZmxhZ3MKLSAgIENGTEFHUyAgICAgICA6PSAtV2FsbCAtSS4gLUlpbmNsdWRlIC1JJChTQ0lURUNIOnMsXCwvKS9pbmNsdWRlIC1JJChQUklWQVRFOnMsXCwvKS9pbmNsdWRlCi0gICBTSE9XX0NGTEFHUwk6PSAtYwotICAgQ1hYICAgICAgICAgIDo9IGcrKwotICAgQVMJCQk6PSBuYXNtCi0gICBBU0ZMQUdTICAgICAgOj0gLXQgLWYgY29mZiAtRiBudWxsIC1kX19GTEFUX18gLWRfX0dOVUNfXyAtZFNURENBTExfVVNDT1JFIC1pSU5DTFVERSAtaSQoU0NJVEVDSClcSU5DTFVERQotICAgU0hPV19BU0ZMQUdTCTo9IC1mIGNvZmYKLSAgIExEICAgICAgICAgICA6PSBnY2MgICAgCSMgTG9hZGVyIGFuZCBmbGFncwotICAgTERYWAkJCTo9IGcrKwotLklGICQoV0lOMzJfR1VJKQotICAgTERGTEFHUyAgICAgIDo9IC1MLiAtbXdpbmRvd3MgLWUgX21haW5DUlRTdGFydHVwCi0uRUxTRQotICAgTERGTEFHUyAgICAgIDo9IC1MLgotLkVORElGCi0gICBSQyAgICAgICAgICAgOj0gd2luZHJlcwotICAgUkNGTEFHUwkJOj0gLU8gY29mZgotICAgTElCICAgICAgICAgIDo9IGFyICAgICAgICMgTGlicmFyaWFuCi0gICBMSUJGTEFHUyAgICAgOj0gcmNzCi0gICBZQUNDCQkJOj0gYmlzb24gLXkKLSAgIExFWAkJCTo9IGZsZXgKLSAgIFNFRAkJCTo9IHNlZAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLS5JRiAkKERCRykKLSAgIENGTEFHUyAgICAgICArPSAtZwotICAgU0hPV19DRkxBR1MgICs9IC1nCi0uRUxTRQotIyBOQVNNIGRvZXMgbm90IHN1cHBvcnQgZGVidWdnaW5nIGluZm9ybWF0aW9uIHlldAotICAgQVNGTEFHUyAgICAgICs9Ci0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucwotLklGICQoT1BUX01BWCkKLSAgIENGTEFHUyAgICAgICArPSAtTzYKLSAgIFNIT1dfQ0ZMQUdTICArPSAtTzYKLS5FTElGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC1PMgotICAgU0hPV19DRkxBR1MgICs9IC1PMgotLkVMSUYgJChPUFRfU0laRSkKLSAgIENGTEFHUyAgICAgICArPSAtTzEKLSAgIFNIT1dfQ0ZMQUdTICArPSAtTzEKLS5FTkRJRgotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zCi0KLS5JRiAkKEZQVSkKLSAgIENGTEFHUyAgICAgICArPSAtREZQVTM4NwotICAgQVNGTEFHUyAgICAgICs9IC1kRlBVMzg3Ci0uRU5ECi0KLSMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0Ci0uSUYgJChCRVRBKQotICAgQ0ZMQUdTICAgICAgICs9IC1EQkVUQQotICAgU0hPV19DRkxBR1MgICs9IC1EQkVUQQotICAgQVNGTEFHUyAgICAgICs9IC1kQkVUQQotICAgU0hPV19BU0ZMQUdTICs9IC1kQkVUQQotLkVORElGCi0KLSMgRE9TIGV4dGVuZGVyIGRlcGVuZGFudCBmbGFncwotICAgRFhfQ0ZMQUdTICAgICs9Ci0gICBEWF9BU0ZMQUdTICAgKz0gLWRHQ0NfV0lOMzIKLQotIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKENIRUNLRUQpCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXGRlYnVnCi1DRkxBR1MJCQkrPSAtRENIRUNLRUQ9MQotU0hPV19DRkxBR1MJICAgICs9IC1EQ0hFQ0tFRD0xCi0uRUxTRQotTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxyZWxlYXNlCi0uRU5ESUYKLQotIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCi0gICBMSUJfREVTVCAgICAgOj0gJChMSUJfQkFTRV9ESVIpXFdJTjMyXCQoR0NDMl9MSUJCQVNFKQotICAgTERGTEFHUyAgICAgICs9IC1MJChMSUJfREVTVCkKLQotIyBQbGFjZSB0byBsb29rIGZvciBQTU9ERSBsaWJyYXJ5IGZpbGVzCi0KLVBNTElCICAgICAgICAgICA6PSAtbHBtCi0KLSMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCi0KLSAgIFJVTEVTX01BSwk6PSBnY2Nfd2luMzIubWsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvaGMzMi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvaGMzMi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBiMDY1YS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL2hjMzIubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcwotIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50Ci0jICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKLSMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgotIwotIyAgICAgICAgICAgICAgIE1ldGF3YXJlIEhpZ2ggQy9DKysgMy4yMSAzMiBiaXQgdmVyc2lvbi4gU3VwcG9ydHMgUGhhciBMYXAncwotIyAgICAgICAgICAgICAgIFROVCBET1MgRXh0ZW5kZXIuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKLS5JTVBPUlQ6IFNDSVRFQ0gKLS5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgotCi0jIFdlIGFyZSBjb21waWxpbmcgZm9yIGEgMzIgYml0IGVudmlvbm1lbnQKLSAgIF8zMkJJVF8gICAgICA6PSAxCi0KLSMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZwotICAgQ0MgICAgICAgICAgIDo9IGhjMzg2ICAgICMgQy1jb21waWxlciBhbmQgZmxhZ3MKLSAgIENGTEFHUyAgICAgICA6PQotLklGICQoVVNFX1RBU00zMikKLSAgIEFTICAgICAgICAgICA6PSB0YXNtMzIKLS5FTElGICQoVVNFX1RBU01YKQotICAgQVMgICAgICAgICAgIDo9IHRhc214ICAgICMgQXNzZW1ibGVyIGFuZCBmbGFncwotLkVMU0UKLSAgIEFTICAgICAgICAgICA6PSB0YXNtICAgICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKLS5FTkRJRgotICAgQVNGTEFHUyAgICAgIDo9IC90IC9teCAvbSAvRF9fRkxBVF9fIC9pSU5DTFVERSAvaSQoU0NJVEVDSClcSU5DTFVERQotICAgTEQgICAgICAgICAgIDo9IGhjMzg2Ci0gICBMREZMQUdTICAgICAgID0gJChDRkxBR1MpCi0gICBMSUIgICAgICAgICAgOj0gMzg2bGliICAgIyBUTlQgMzg2fGxpYiBMaWJyYXJpYW4KLSAgIExJQkZMQUdTICAgICA6PSAtVEMKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gLWcgICAgICAgIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgQyBjb21waWxlcgotICAgQVNGTEFHUyAgICAgICs9IC96aSAgICAgICMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIGFzc2VtYmxlcgotLkVMU0UKLSAgIEFTRkxBR1MgICAgICArPSAvcSAgICAgICAjIFN1cHByZXNzIG9iamVjdCByZWNvcmRzIG5vdCBuZWVkZWQgZm9yIGxpbmtpbmcKLS5FTkQKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucwotLklGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC01ODYgLU8KLS5FTElGICQoT1BUX1NJWkUpCi0gICBDRkxBR1MgICAgICAgKz0gLTU4NiAtTzEKLS5FTFNFCi0gICBDRkxBR1MgICAgICAgKz0gLU8wCi0uRU5ECi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMKLQotLklGICQoRlBVKQotICAgQ0ZMQUdTICAgICAgICs9IC1ERlBVMzg3Ci0gICBBU0ZMQUdTICAgICAgKz0gLURGUFUzODcKLS5FTkQKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKLS5JRiAkKEJFVEEpCi0gICBDRkxBR1MgICAgICAgKz0gLURCRVRBCi0gICBBU0ZMQUdTICAgICAgKz0gLURCRVRBCi0uRU5ECi0KLSMgRE9TIGV4dGVuZGVyIGRlcGVuZGFudCBmbGFncwotICAgVVNFX1ROVCAgICAgIDo9IDEKLSAgIFVTRV9SRUFMRE9TCTo9IDEKLSAgIERYX0NGTEFHUyAgICArPSAtRFROVAotICAgRFhfQVNGTEFHUyAgICs9IC1EVE5UCi0gICBMREZMQUdTICAgICAgKz0gLUxIOlxUTlRcTElCCi0KLSMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcwotCi1QTUxJQiAgICAgICAgICAgOj0gdG50XHBtLmxpYgotCi0jIERlZmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIGxpYnJhcnkgZmlsZXMKLQotLklGICQoQ0hFQ0tFRCkKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJcZGVidWcKLUNGTEFHUwkJCSs9IC1EQ0hFQ0tFRD0xCi0uRUxTRQotTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxyZWxlYXNlCi0uRU5ESUYKLQotIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCi0gICBMSUJfQkFTRSAgICAgOj0gJChMSUJfQkFTRV9ESVIpXERPUzMyXEhDCi0gICBMSUJfREVTVCAgICAgOj0gJChMSUJfQkFTRSkKLQotIyBEZWZpbmUgd2hpY2ggZmlsZSBjb250YWlucyBvdXIgcnVsZXMKLQotICAgUlVMRVNfTUFLCTo9IGhjMzIubWsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcW54NC5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcW54NC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU4M2FmMy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3FueDQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcwotIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50Ci0jICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKLSMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgotIwotIyAgICAgICAgICAgICAgIFFOWCB2ZXJzaW9uIGZvciBXYXRjb20gQy4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgRGlzYWJsZSB3YXJuaW5ncyBmb3IgbWFjcm9zIHJlZGVmaW5lZCBoZXJlIHRoYXQgd2VyZSBnaXZlbgotIyBvbiB0aGUgY29tbWFuZCBsaW5lLgotX18uU0lMRU5UICAgICAgIDo9ICQoLlNJTEVOVCkKLS5TSUxFTlQgICAgICAgICA6PSB5ZXMKLQotIyBJbXBvcnQgZW5pdm9ybm1lbnQgdmFyaWFibGVzIHRoYXQgd2UgdXNlIGNvbW1vbiB0byBhbGwgY29tcGlsZXJzCi0uSU1QT1JUIC5JR05PUkUgOiBURU1QIFNIRUxMIElOQ0xVREUgTElCIFNDSVRFQ0ggUFJJVkFURSBTQ0lURUNIX0xJQgotLklNUE9SVCAuSUdOT1JFIDogREJHIE9QVCBPUFRfU0laRSBTSFcgQkVUQSBDSEVDS0VEIFVTRV9RTlggVVNFX1FOWDQKLS5JTVBPUlQgLklHTk9SRSA6IFVTRV9QSE9UT04gVVNFX1gxMSBVU0VfQklPUyBTSE9XX0FSR1MgTUFYX1dBUk4gV0NfTElCQkFTRQotICAgVE1QRElSICAgICAgIDo9ICQoVEVNUCkKLQotIyBTdGFuZGFyZCBmaWxlIHN1ZmZpeCBkZWZpbml0aW9ucwotIwotIyBOT1RFOiBRbnggZG9lcyBub3QgcmVxdWlyZSBhbnkgZXh0ZW5zaW9uIGZvciBleGVjdXRlYWJsZSBmaWxlcywgYnV0IHlvdQotIyAgICAgICBjYW4gdXNlIGFuIGV4dGVuc2lvbiBpZiB5b3Ugd2lzaC4gV2UgdXNlIHRoZSAueCBleHRlbnNpb24gZm9yIGJ1aWxkaW5nCi0jICAgICAgIGV4ZWN1dGVhYmxlIGZpbGVzIHNvIHRoYXQgd2UgY2FuIHVzZSBpbXBsaWNpdCBydWxlcyB0byBtYWtlIHRoZQotIyAgICAgICBtYWtlZmlsZXMgc2ltcGxlciBhbmQgbW9yZSBwb3J0YWJsZSBiZXR3ZWVuIHN5c3RlbXMuIFdoZW4geW91IGluc3RhbGwKLSMgICAgICAgdGhlIGZpbGVzIHRvIGEgbG9jYWwgYmluIGRpcmVjdG9yeSwgeW91IHdpbGwgcHJvYmFibHkgd2FudCB0byByZW1vdmUKLSMgICAgICAgdGhlIC54IGV4dGVuc2lvbi4KLSAgIEwgICAgICAgICAgICA6PSAuYSAgIAkjIExpYnJhcmllcwotICAgRSAgICAgICAgICAgIDo9IC5leGUgICAJIyBFeGVjdXRhYmxlcwotICAgTyAgICAgICAgICAgIDo9IC5vICAgCSMgT2JqZWN0cwotICAgQSAgICAgICAgICAgIDo9IC5hc20gICAJIyBBc3NlbWJsZXIgc291cmNlcwotICAgUyAgICAgICAgICAgIDo9IC5zICAgICAgICMgR05VIGFzc2VtYmxlciBzb3VyY2VzCi0gICBQICAgICAgICAgICAgOj0gLmNwcCAgIAkjIEMrKyBzb3VyY2VzCi0KLSMgRmlsZSBwcmVmaXgvc3VmZml4IGRlZmluaXRpb25zLiBUaGUgZm9sbG93aW5nIHByZWZpeGVzIGFyZSBkZWZpbmVkLCBhbmQgYXJlCi0jIHVzZWQgcHJpbWFyaWx5IHRvIGFic3RyYWN0IGJldHdlZW4gdGhlIFVuaXggc3R5bGUgbGliWFguYSBuYW1pbmcgY29udmVudGlvbgotIyBhbmQgdGhlIERPUy9XaW5kb3dzL09TMiBuYW1pbmcgY29udmVudGlvbiBvZiBYWC5saWIuCi0gICBMUCAgICAgICAgICAgOj0gbGliICAgICAgIyBMUCAtIExpYnJhcnkgZmlsZSBwcmVmaXggKG5hbWUgb2YgZmlsZSBvbiBkaXNrKQotICAgTEwgICAgICAgICAgIDo9IC1sCQkjIExpYnJhcnkgbGluayBwcmVmaXggKG5hbWUgb2YgbGlicmFyeSBvbiBsaW5rIGNvbW1hbmQgbGluZSkKLSAgIExFICAgICAgICAgICA6PSAJCSAgICAjIExpYnJhcnkgbGluayBzdWZmaXggKGV4dGVuc2lvbiBvZiBsaWJyYXJ5IG9uIGxpbmsgY29tbWFuZCBsaW5lKQotCi0jIFdlIHVzZSB0aGUgVW5peCBzaGVsbCBhdCBhbGwgdGltZXMKLSAgIFNIRUxMCQk6PSAvYmluL3NoCi0gICBTSEVMTEZMQUdTICAgOj0gLWMKLQotIyBEZWZpbml0aW9uIG9mICQoTUFLRSkgbWFjcm8gZm9yIHJlY3Vyc2l2ZSBtYWtlcy4KLSAgIE1BS0UgPSAkKE1BS0VDTUQpICQoTUZMQUdTKQotCi0jIE1hY3JvIHRvIGluc3RhbGwgYSBsaWJyYXJ5IGZpbGUKLSAgIElOU1RBTEwgICAgICA6PSBjcAotCi0jIERNQUtFIHVzZXMgdGhpcyByZWNpcGUgdG8gcmVtb3ZlIGludGVybWVkaWF0ZSB0YXJnZXRzCi0uUkVNT1ZFIDo7ICQoUk0pIC1mICQ8Ci0KLSMgVHVybiB3YXJuaW5ncyBiYWNrIHRvIHByZXZpb3VzIHNldHRpbmcuCi0uU0lMRU5UIDo9ICQoX18uU0lMRU5UKQotCi0jIFdlIGRvbnQgdXNlIFRBQlMgaW4gb3VyIG1ha2VmaWxlcwotLk5PVEFCUyAgICAgICAgIDo9IHllcwotCi0jIERlZmluZSB0aGF0IHdlIGFyZSBjb21waWxpbmcgZm9yIFFOWAotICAgVVNFX1FOWCAgICAJOj0gMQotCi0jIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcuCi0gICBDQyAgICAgICAgICAgOj0gd2NjMzg2Ci0gICBDRkxBR1MgICAgICAgOj0gLUkuIC1JaW5jbHVkZSAkKElOQ0xVREUpCi0gICBDWFggICAgICAgICAgOj0gd3BwMzg2Ci0gICBBUyAgICAgICAgICAgOj0gbmFzbQotICAgQVNGTEFHUyAgICAgIDo9IC10IC1mIG9iaiAtZF9fRkxBVF9fIC1kU1REQ0FMTF9NQU5HTEUgLWlpbmNsdWRlIC1pJChTQ0lURUNIKS9pbmNsdWRlCi0gICBMRCAgICAgICAgICAgOj0gY2MKLSAgIExERkxBR1MgICAgICA6PSAtTC4KLSAgIExJQiAgICAgICAgICA6PSBhcgotICAgTElCRkxBR1MgICAgIDo9IHJjCi0KLSMgU2V0IHRoZSBjb21waWxlciB3YXJuaW5nIGxldmVsCi0uSUYgJChNQVhfV0FSTikKLSAgIENGTEFHUyAgICAgICArPSAtdzQKLS5FTFNFCi0gICBDRkxBR1MgICAgICAgKz0gLXcxCi0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gLWQyCi0gICBMREZMQUdTICAgICAgKz0gLWcyCi0uRUxTRQotIyBOQVNNIGRvZXMgbm90IHN1cHBvcnQgZGVidWdnaW5nIGluZm9ybWF0aW9uIHlldAotICAgQVNGTEFHUyAgICAgICs9Ci0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucwotLklGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC1vbmF0eC01ci1mcDUKLS5FTElGICQoT1BUX1NJWkUpCi0gICBDRkxBR1MgICAgICAgKz0gLW9uYXNsbXItNXItZnA1Ci0uRUxJRiAkKE5PT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC1vZC01cgotLkVORAotCi0jIENvbXBpbGUgZmxhZyBmb3Igd2hldGhlciB0byBidWlsZCBwaG90b24gb3Igbm9uLXBob3RvbiBsaWIKLS5JRiAkKFVTRV9QSE9UT04pCi0gICBDRkxBR1MgICAgICAgKz0gLURfX1BIT1RPTl9fCi0uRU5ESUYKLQotIyBDb21waWxlIGZsYWcgZm9yIHdoZXRoZXIgdG8gYnVpbGQgWDExIG9yIG5vbi1YMTEgbGliCi0uSUYgJChVU0VfWDExKQotICAgQ0ZMQUdTICAgICAgICs9IC1EX19YMTFfXwotLkVORElGCi0KLSMgT3B0aW9uYWxseSBjb21waWxlIGEgYmV0YSByZWxlYXNlIHZlcnNpb24gb2YgYSBwcm9kdWN0Ci0uSUYgJChCRVRBKQotICAgQ0ZMQUdTICAgICAgICs9IC1EQkVUQQotICAgQVNGTEFHUyAgICAgICs9IC1kQkVUQQotLkVORElGCi0KLSMgVGFyZ2V0IGVudmlyb25tZW50IGRlcGVuZGFudCBmbGFncwotICAgQ0ZMQUdTICAgICAgICs9IC1EX19RTlhfXyAtRF9fVU5JWF9fCi0gICBBU0ZMQUdTICAgICAgKz0gLWRfX1FOWF9fIC1kX19VTklYX18KLQotIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKENIRUNLRUQpCi0gIExJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKS9saWIvZGVidWcKLSAgQ0ZMQUdTCQkrPSAtRENIRUNLRUQ9MQotLkVMU0UKLSAgTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpL2xpYi9yZWxlYXNlCi0uRU5ESUYKLQotIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCi0gICBMSUJfQkFTRSAgICAgOj0gJChMSUJfQkFTRV9ESVIpL3FueDQvJChXQ19MSUJCQVNFKQotICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0UpCi0gICBMREZMQUdTICAgICAgKz0gLUwkKExJQl9ERVNUKQotCi0jIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKLQotUE1MSUIgICAgICAgICAgIDo9IC1scG0KLQotIyBEZWZpbmUgd2hpY2ggZmlsZSBjb250YWlucyBvdXIgcnVsZXMKLQotICAgUlVMRVNfTUFLCTo9IHFueDQubWsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcW54bnRvLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9xbnhudG8ubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNjhlZDIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9xbnhudG8ubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcwotIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50Ci0jICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKLSMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgotIwotIyAgICAgICAgICAgICAgIFFOWCBOZXV0cmlubyB2ZXJzaW9uIGZvciBHTlUgQy9DKysKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgRGlzYWJsZSB3YXJuaW5ncyBmb3IgbWFjcm9zIHJlZGVmaW5lZCBoZXJlIHRoYXQgd2VyZSBnaXZlbgotIyBvbiB0aGUgY29tbWFuZCBsaW5lLgotX18uU0lMRU5UICAgICAgIDo9ICQoLlNJTEVOVCkKLS5TSUxFTlQgICAgICAgICA6PSB5ZXMKLQotIyBJbXBvcnQgZW5pdm9ybm1lbnQgdmFyaWFibGVzIHRoYXQgd2UgdXNlIGNvbW1vbiB0byBhbGwgY29tcGlsZXJzCi0uSU1QT1JUIC5JR05PUkUgOiBURU1QIFNIRUxMIElOQ0xVREUgTElCIFNDSVRFQ0ggUFJJVkFURSBTQ0lURUNIX0xJQgotLklNUE9SVCAuSUdOT1JFIDogREJHIE9QVCBPUFRfU0laRSBTSFcgQkVUQSBDSEVDS0VEIFVTRV9RTlggVVNFX1FOWE5UTwotLklNUE9SVCAuSUdOT1JFIDogVVNFX0VHQ1MgVVNFX1BIT1RPTiBVU0VfWDExIFVTRV9CSU9TCi0gICBUTVBESVIgICAgICAgOj0gJChURU1QKQotCi0jIFN0YW5kYXJkIGZpbGUgc3VmZml4IGRlZmluaXRpb25zCi0jCi0jIE5PVEU6IFFueCBkb2VzIG5vdCByZXF1aXJlIGFueSBleHRlbnNpb24gZm9yIGV4ZWN1dGVhYmxlIGZpbGVzLCBidXQgeW91Ci0jICAgICAgIGNhbiB1c2UgYW4gZXh0ZW5zaW9uIGlmIHlvdSB3aXNoLiBXZSB1c2UgdGhlIC54IGV4dGVuc2lvbiBmb3IgYnVpbGRpbmcKLSMgICAgICAgZXhlY3V0ZWFibGUgZmlsZXMgc28gdGhhdCB3ZSBjYW4gdXNlIGltcGxpY2l0IHJ1bGVzIHRvIG1ha2UgdGhlCi0jICAgICAgIG1ha2VmaWxlcyBzaW1wbGVyIGFuZCBtb3JlIHBvcnRhYmxlIGJldHdlZW4gc3lzdGVtcy4gV2hlbiB5b3UgaW5zdGFsbAotIyAgICAgICB0aGUgZmlsZXMgdG8gYSBsb2NhbCBiaW4gZGlyZWN0b3J5LCB5b3Ugd2lsbCBwcm9iYWJseSB3YW50IHRvIHJlbW92ZQotIyAgICAgICB0aGUgLnggZXh0ZW5zaW9uLgotICAgTCAgICAgICAgICAgIDo9IC5hICAgCSMgTGlicmFyaWVzCi0gICBFICAgICAgICAgICAgOj0gLnggICAJIyBFeGVjdXRhYmxlcwotICAgTyAgICAgICAgICAgIDo9IC5vICAgCSMgT2JqZWN0cwotICAgQSAgICAgICAgICAgIDo9IC5hc20gICAJIyBBc3NlbWJsZXIgc291cmNlcwotICAgUyAgICAgICAgICAgIDo9IC5zICAgICAgICMgR05VIGFzc2VtYmxlciBzb3VyY2VzCi0gICBQICAgICAgICAgICAgOj0gLmNwcCAgIAkjIEMrKyBzb3VyY2VzCi0KLSMgRmlsZSBwcmVmaXgvc3VmZml4IGRlZmluaXRpb25zLiBUaGUgZm9sbG93aW5nIHByZWZpeGVzIGFyZSBkZWZpbmVkLCBhbmQgYXJlCi0jIHVzZWQgcHJpbWFyaWx5IHRvIGFic3RyYWN0IGJldHdlZW4gdGhlIFVuaXggc3R5bGUgbGliWFguYSBuYW1pbmcgY29udmVudGlvbgotIyBhbmQgdGhlIERPUy9XaW5kb3dzL09TMiBuYW1pbmcgY29udmVudGlvbiBvZiBYWC5saWIuCi0gICBMUCAgICAgICAgICAgOj0gbGliICAgICAgIyBMUCAtIExpYnJhcnkgZmlsZSBwcmVmaXggKG5hbWUgb2YgZmlsZSBvbiBkaXNrKQotICAgTEwgICAgICAgICAgIDo9IC1sCQkjIExpYnJhcnkgbGluayBwcmVmaXggKG5hbWUgb2YgbGlicmFyeSBvbiBsaW5rIGNvbW1hbmQgbGluZSkKLSAgIExFICAgICAgICAgICA6PSAJCSAgICAjIExpYnJhcnkgbGluayBzdWZmaXggKGV4dGVuc2lvbiBvZiBsaWJyYXJ5IG9uIGxpbmsgY29tbWFuZCBsaW5lKQotCi0jIFdlIHVzZSB0aGUgVW5peCBzaGVsbCBhdCBhbGwgdGltZXMKLSAgIFNIRUxMCQk6PSAvYmluL3NoCi0gICBTSEVMTEZMQUdTICAgOj0gLWMKLQotIyBEZWZpbml0aW9uIG9mICQoTUFLRSkgbWFjcm8gZm9yIHJlY3Vyc2l2ZSBtYWtlcy4KLSAgIE1BS0UgPSAkKE1BS0VDTUQpICQoTUZMQUdTKQotCi0jIE1hY3JvIHRvIGluc3RhbGwgYSBsaWJyYXJ5IGZpbGUKLSAgIElOU1RBTEwgICAgICA6PSBjcAotCi0jIERNQUtFIHVzZXMgdGhpcyByZWNpcGUgdG8gcmVtb3ZlIGludGVybWVkaWF0ZSB0YXJnZXRzCi0uUkVNT1ZFIDo7ICQoUk0pIC1mICQ8Ci0KLSMgVHVybiB3YXJuaW5ncyBiYWNrIHRvIHByZXZpb3VzIHNldHRpbmcuCi0uU0lMRU5UIDo9ICQoX18uU0lMRU5UKQotCi0jIFdlIGRvbnQgdXNlIFRBQlMgaW4gb3VyIG1ha2VmaWxlcwotLk5PVEFCUyAgICAgICAgIDo9IHllcwotCi0jIERlZmluZSB0aGF0IHdlIGFyZSBjb21waWxpbmcgZm9yIFFOWAotICAgVVNFX1FOWCAgICAJOj0gMQotCi0jIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcuCi0gICBDQyAgICAgICAgICAgOj0gcWNjCi0gICBDRkxBR1MgICAgICAgOj0gLVZnY2NfbnRveDg2IC1JLiAtSWluY2x1ZGUgJChJTkNMVURFKQotICAgQ1BQRkxBR1MgICAgIDo9IC1WZ2NjX250b3g4NiAtSS4gLUlpbmNsdWRlICQoSU5DTFVERSkKLSAgIENYWCAgICAgICAgICA6PSBRQ0MKLSAgIEFTICAgICAgICAgICA6PSBuYXNtCi0gICBBU0ZMQUdTICAgICAgOj0gLXQgLWYgZWxmIC1kX19GTEFUX18gLWRfX0dOVUNfXyAtZFNURENBTExfTUFOR0xFIC1paW5jbHVkZSAtaSQoU0NJVEVDSCkvaW5jbHVkZSAtZF9fTk9VX18KLSAgIExEICAgICAgICAgICA6PSBxY2MKLSAgIExERkxBR1MgICAgICA6PSAtVmdjY19udG94ODYgLUwuIC1sbQotICAgTElCICAgICAgICAgIDo9IGFyCi0gICBMSUJGTEFHUyAgICAgOj0gcmMKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gLWcyCi0gICBMREZMQUdTICAgICAgKz0gLWcyCi0uRUxTRQotIyBOQVNNIGRvZXMgbm90IHN1cHBvcnQgZGVidWdnaW5nIGluZm9ybWF0aW9uIHlldAotICAgQVNGTEFHUyAgICAgICs9Ci0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucwotLklGICQoT1BUX01BWCkKLSAgIENGTEFHUyAgICAgICArPSAtT3QKLS5FTElGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC1PCi0uRUxJRiAkKE9QVF9TSVpFKQotICAgQ0ZMQUdTICAgICAgICs9IC1PcwotLkVORElGCi0KLSMgQ29tcGlsZSBmbGFnIGZvciB3aGV0aGVyIHRvIGJ1aWxkIHBob3RvbiBvciBub24tcGhvdG9uIGxpYgotLklGICQoVVNFX1BIT1RPTikKLSAgIENGTEFHUyAgICAgICArPSAtRF9fUEhPVE9OX18KLS5FTkRJRgotCi0jIENvbXBpbGUgZmxhZyBmb3Igd2hldGhlciB0byBidWlsZCBYMTEgb3Igbm9uLVgxMSBsaWIKLS5JRiAkKFVTRV9YMTEpCi0gICBDRkxBR1MgICAgICAgKz0gLURfX1gxMV9fCi0uRU5ESUYKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKLS5JRiAkKEJFVEEpCi0gICBDRkxBR1MgICAgICAgKz0gLURCRVRBCi0gICBBU0ZMQUdTICAgICAgKz0gLWRCRVRBCi0uRU5ESUYKLQotIyBUYXJnZXQgZW52aXJvbm1lbnQgZGVwZW5kYW50IGZsYWdzCi0gICBDRkxBR1MgICAgICAgKz0gLURfX1FOWF9fIC1EX19VTklYX18KLSAgIEFTRkxBR1MgICAgICArPSAtZF9fUU5YX18gLWRfX1VOSVhfXwotCi0jIERlZmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIGxpYnJhcnkgZmlsZXMKLQotLklGICQoQ0hFQ0tFRCkKLSAgTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpL2xpYi9kZWJ1ZwotICBDRkxBR1MJCSs9IC1EQ0hFQ0tFRD0xCi0uRUxTRQotICBMSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQikvbGliL3JlbGVhc2UKLS5FTkRJRgotCi0jIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKLSAgIExJQl9ERVNUCTo9ICQoTElCX0JBU0VfRElSKS9xbnhudG8KLSAgIExERkxBR1MgICAgICArPSAtTCQoTElCX0RFU1QpCi0KLSMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcwotCi1QTUxJQiAgICAgICAgICAgOj0gLWxwbQotCi0jIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcwotCi0gICBSVUxFU19NQUsJOj0gcW54bnRvLm1rCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2JjMTYubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2JjMTYubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YWU5MTAuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9iYzE2Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0Ci0KLS5JRiAkKE5PX1BNTElCKQotUE1MSUIgOj0KLS5FTkRJRgotCi0jIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMKLSUkTzogJS5jIDsgJChDQykgQCQobWt0bXAgJChDRkxBR1M6cy9cL1xcKSkgLWMgJDwKLSUkTzogJSRQIDsgJChDQykgQCQobWt0bXAgJChDRkxBR1M6cy9cL1xcKSkgLWMgJDwKLSUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyByZXNvdXJjZSBmaWxlcwotJSRSOiAlLnJjIDsgJChSQykgJChSQ0ZMQUdTKSAtciAkPAotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgRExMIHVzaW5nIGEgcmVzcG9uc2UgZmlsZQotJSREOiAgICAgIDsgJChMRCkgJChta3RtcCAkKExERkxBR1MpIC1DIC1Ud2QgYzBkbC5vYmorXG4kKCY6cy9cL1xcKVxuJEBcbiQqLm1hcFxuJChERUZfTElCUykgJChFWEVMSUJTKVxuJCouZGVmKQotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLS5JRiAkKEJVSUxEX0RMTCkKLSUkTDogOwotICAgIEAkKFJNKSAkQAotICAgICQoSUxJQikgJChJTElCRkxBR1MpICRAICQ/Ci0uRUxJRiAkKElNUE9SVF9ETEwpCi0lJEw6IDsKLSAgICBAJChSTSkgJEAKLSAgICAkKElMSUIpICQoSUxJQkZMQUdTKSAkQCAkPwotLkVMU0UKLSUkTDogOwotICAgIEAkKFJNKSAkQAotICAgICQoTElCUikgJChMSUJGTEFHUykgJEAgQCQobWt0bXAgKyQoJjp0IiAmXG4rIilcbikKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCi0uSUYgJChVU0VfV0lOMTYpCi0lJEU6IDsgJChMRCkgJChta3RtcCAkKExERkxBR1MpIC1DIC1Ud2UgJChXSU5fVkVSU0lPTikgYzB3bC5vYmorXG4kKCY6cy9cL1xcKVxuJEBcbiQqLm1hcFxuJChERUZfTElCUykgJChFWEVMSUJTKVxuJCouZGVmKQotLkVMU0UKLSUkRTogOyAkKExEKSAkKG1rdG1wICQoTERGTEFHUykgLVRkZSBjMGwub2JqK1xuJCgmOnMvXC9cXClcbiRAXG4kKi5tYXBcbiQoUE1MSUIpICQoREVGX0xJQlMpICQoRVhFTElCUykpCi0uRU5ESUYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvYmMzLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9iYzMubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZDA3MWMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9iYzMubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIFJ1bGVzIG1ha2VmaWxlIGRlZmluaXRpb25zLCB3aGljaCBkZWZpbmUgdGhlIHJ1bGVzIHVzZWQgdG8KLSMJCQkJYnVpbGQgdGFyZ2V0cy4gV2UgaW5jbHVkZSB0aGVtIGhlcmUgYXQgdGhlIGVuZCBvZiB0aGUKLSMJCQkJbWFrZWZpbGUgc28gdGhlIGdlbmVyaWMgcHJvamVjdCBtYWtlZmlsZXMgY2FuIG92ZXJyaWRlCi0jCQkJCWNlcnRhaW4gdGhpbmdzIHdpdGggbWFjcm9zIChzdWNoIGFzIGxpbmtpbmcgQysrIHByb2dyYW1zCi0jCQkJCWRpZmZlcmVudGx5KS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgSW1wbGljaXQgZ2VuZXJhdGlvbiBydWxlcyBmb3IgbWFraW5nIG9iamVjdCBmaWxlcwotJSRPOiAlLmMgOyAkKENDKSBAJChta3RtcCAkKENGTEFHUykpIC1jICQ8Ci0lJE86ICUkUCA7ICQoQ0MpIEAkKG1rdG1wICQoQ0ZMQUdTKSkgLWMgJDwKLSUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgJChBU0ZMQUdTKSkgJCg8OnMsLyxcKQotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLSUkTDogOwotICAgIEAkKFJNKSAkQAotICAgICQoTElCUikgJChMSUJGTEFHUykgJEAgQCQobWt0bXAgKyQoJjp0IiAmXG4rIilcbikKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotJSRFOiA7ICQoTEQpICQobWt0bXAgJChMREZMQUdTKSAtVGRlIGMwbC5vYmorXG4kKCY6cy9cL1xcKVxuJEBcbiQqLm1hcFxuJChERUZfTElCUykgJChFWEVMSUJTKSkKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvYmMzMi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvYmMzMi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNjZTI1Yi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2JjMzIubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0Ci0KLS5JRiAkKE5PX1BNTElCKQotUE1MSUIgOj0KLS5FTkRJRgotCi0uSUYgJChVU0VfVlhEKQotCi0jIEltcGxpY2l0IHJ1bGUgZ2VuZXJhdGlvbiB0byBidWlsZCBWeEQncwotCi0lJE86ICUuYyA7Ci0JJChDQykgQCQobWt0bXAgJChDRkxBR1M6cy9cL1xcKSkgLWMgJCg8OnMsLyxcKQotCUAkKFZUT09MU0QpXGJpblxzZWdhbGlhcy5leGUgLXAgJChWVE9PTFNEKVxpbmNsdWRlXGRlZmF1bHQuc2VnICRACi0KLSUkTzogJSRQIDsKLQkkKENDKSBAJChta3RtcCAkKENGTEFHUzpzL1wvXFwpKSAtYyAkKDw6cywvLFwpCi0JQCQoVlRPT0xTRClcYmluXHNlZ2FsaWFzLmV4ZSAtcCAkKFZUT09MU0QpXGluY2x1ZGVcZGVmYXVsdC5zZWcgJEAKLQotJSRPOiAlJEEgOyAkKEFTKSBAJChta3RtcCAkKEFTRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQotCi0lJEw6IDsgJChMSUIpICQoTElCRkxBR1MpICRAIEAkKG1rdG1wIC0rJCg/OnQiICZcbi0rIilcbikKLQotJS5kbGw6IDsKLQlAJChDUCkgJChta3RtcCBFWFBPUlRTXG5fVGhlX0REQiBAMSkgJCouZGVmCi0JdGxpbmszMi5leGUgQCQobWt0bXAgJChMREZMQUdTKSAtVHBkICQoVlRPT0xTRDpzL1wvXFwpXGxpYlxpY3J0YmM0Lm9iaitcbiQoJjpzL1wvXFwpXG4kKi5kbGxcbiQqLm1hcFxuJChERUZfTElCUzpzL1wvXFwpICQoUE1MSUI6cy9cL1xcKSAkKEVYRUxJQlM6cy9cL1xcKVxuJCouZGVmKQotCUAkKFJNKSAtUyAkKG1rdG1wICQqLmRlZikKLQotJS52eGQ6ICUuZGxsIDsKLQlAJChDUCkgJChta3RtcCBEWU5BTUlDXG5BVFRSSUIgSUNPREUgSU5JVFxuQVRUUklCIExDT0RFIExPQ0tFRFxuQVRUUklCIFBDT0RFIFBBR0VBQkxFXG5BVFRSSUIgU0NPREUgU1RBVElDXG5BVFRSSUIgREJPQ09ERSBERUJVR1xuTUVSR0UgSUNPREUgSU5JVERBVDAgSU5JVERBVEEpICQqLnBlbAotCUAkKFZUT09MU0QpXGJpblx2eGR2ZXIuZXhlICQqLnZyYyAkKi5yZXMKLQlAJChWVE9PTFNEKVxiaW5ccGVsZS5leGUgLWQgLXMgJCouc21mIC1jICQqLnBlbCAtbyAkQCAtayA0MDAgJCouZGxsCi0JQCQoVlRPT0xTRClcYmluXHNldGhkci5leGUgLW4gJCogLXggJEAgLXIgJCoucmVzCi0uSUYgJChEQkcpCi0JJChOTVNZTSkgL1RSQU5TOnNvdXJjZSxwYWNrYWdlIC9TT1VSQ0U6JChWWERTT1VSQ0UpICQqLnNtZgotLkVORElGCi0JQCQoUk0pIC1TICQobWt0bXAgJCoucGVsKQotCi0uRUxTRQotCi0jIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMsIGxpYnJhcmllcyBhbmQgZXhlJ3MKLQotJSRPOiAlLmMgOyAkKENDKSBAJChta3RtcCAkKENGTEFHUzpzL1wvXFwpKSAtYyAkKDw6cywvLFwpCi0lJE86ICUkUCA7ICQoQ0MpIEAkKG1rdG1wICQoQ0ZMQUdTOnMvXC9cXCkpIC1jICQoPDpzLC8sXCkKLS5JRiAkKFVTRV9OQVNNKQotJSRPOiAlJEEgOyAkKEFTKSBAJChta3RtcCAtbyAkQCAkKEFTRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQotLkVMU0UKLSUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIHJlc291cmNlIGZpbGVzCi0lJFI6ICUucmMgOyAkKFJDKSAkKFJDRkxBR1MpIC1yICQ8Ci0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBETEwgdXNpbmcgYSByZXNwb25zZSBmaWxlCi0uSUYgJChJTVBPUlRfRExMKQotLkVMU0UKLS5JRiAkKE5PX1JVTlRJTUUpCi0lJEQ6IDsgJChMRCkgJChta3RtcCAkKExERkxBR1MpIC1UcGQgLWFhICQoJjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKEVYRUxJQlMpXG4kKi5kZWYpCi0uRUxTRQotJSREOiA7Ci0JbWFrZWRlZiAkKEA6YikKLQkkKExEKSAkKG1rdG1wICQoTERGTEFHUykgLVRwZCAtYWEgYzBkMzIub2JqK1xuJCgmOnMvXC9cXClcbiRAXG4kKi5tYXBcbiQoREVGX0xJQlM6cy9cL1xcKSAkKFBNTElCOnMvXC9cXCkgJChFWEVMSUJTKVxuJCouZGVmKQotLklGICQoREJHKQotLklGICQoVVNFX1NPRlRJQ0UpCi0JJChOTVNZTSkgJChOTVNZTUZMQUdTKTskKFNJX1NPVVJDRSkgJEAKLQl0ZHN0cnAzMiAkQAotLkVORElGCi0uRU5ESUYKLS5FTkRJRgotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotLklGICQoQlVJTERfRExMKQotJSRMOiA7Ci0gICAgQCQoUk0pICRACi0gICAgJChJTElCKSAkKElMSUJGTEFHUykgJEAgJD8KLS5FTElGICQoSU1QT1JUX0RMTCkKLSUkTDogOwotICAgIEAkKFJNKSAkQAotICAgICQoSUxJQikgJChJTElCRkxBR1MpICRAICQ/Ci0uRUxTRQotJSRMOiA7Ci0gICAgQCQoUk0pICRACi0gICAgJChMSUIpICQoTElCRkxBR1MpICRAIEAkKG1rdG1wICskKCY6dCIgJlxuKyIpXG4pCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotCi0uSUYgJChVU0VfV0lOMzIpCi0uSUYgJChXSU4zMl9HVUkpCi0lJEU6IDsKLQkkKExEKSAkKG1rdG1wICQoTERGTEFHUykgLVRwZSAtYWEgJChXSU5fVkVSU0lPTikgYzB3MzIub2JqK1xuJCgmOnMvXC9cXClcbiRAXG4kKi5tYXBcbiQoREVGX0xJQlM6cy9cL1xcKSAkKFBNTElCOnMvXC9cXCkgJChFWEVMSUJTKVxuJCouZGVmKQotLklGICQoREJHKQotLklGICQoVVNFX1NPRlRJQ0UpCi0JJChOTVNZTSkgJChOTVNZTUZMQUdTKTskKFNJX1NPVVJDRSkgJEAKLQl0ZHN0cnAzMiAkQAotLkVORElGCi0uRU5ESUYKLS5FTFNFCi0lJEU6IDsKLQkkKExEKSAkKG1rdG1wICQoTERGTEFHUykgLVRwZSAtYXAgYzB4MzIub2JqK1xuJCgmOnMvXC9cXClcbiRAXG4kKi5tYXBcbiQoREVGX0xJQlM6cy9cL1xcKSAkKFBNTElCOnMvXC9cXCkgJChFWEVMSUJTKVxuJCouZGVmKQotLklGICQoVVNFX1NPRlRJQ0UpCi0JJChOTVNZTSkgJChOTVNZTUZMQUdTKTskKFNJX1NPVVJDRSkgJEAKLQl0ZHN0cnAzMiAkQAotLkVORElGCi0uRU5ESUYKLS5FTElGICQoVVNFX1ROVCkKLSUkRTogOwotCUAkKENQKSAkKG1rdG1wIHN0dWIgJ2dvdG50LmV4ZScpICQqLmRlZgotCUAkKExEKSAkKG1rdG1wICQoTERGTEFHUykgLVRwZSAtYXAgYzB4MzIub2JqK1xuJCgmOnMvXC9cXClcbiRAXG4kKi5tYXBcbiQoREVGX0xJQlMpICQoUE1MSUI6cy9cL1xcKSAkKEVYRUxJQlMpXG4kKi5kZWYpCi0uSUYgJChET1NTVFlMRSkKLQlAbWFya3BoYXIgJEAKLS5FTkRJRgotCUAkKFJNKSAtUyAkKG1rdG1wICQqLmRlZikKLS5FTElGICQoVVNFX1NNWDMyKQotJSRFOiA7ICQoTEQpICQobWt0bXAgJChMREZMQUdTKSAtVHBlIC1hcCBjMHgzMi5vYmorXG4kKCY6cy9cL1xcKVxuJEBcbiQqLm1hcFxuJChERUZfTElCUykgJChQTUxJQjpzL1wvXFwpICQoRVhFTElCUylcbiQqLmRlZikKLS5FTFNFCi0lJEU6IDsgJChMRCkgJChta3RtcCAkKExERkxBR1MpIC1UcGUgLWFwIGMweDMyLm9iaitcbiQoJjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKERFRl9MSUJTKSAkKFBNTElCOnMvXC9cXCkgJChFWEVMSUJTKVxuJCouZGVmKQotLkVORAotCi0uRU5ESUYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvYmNvczIubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2Jjb3MyLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDczZmVjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvYmNvczIubWsKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIFJ1bGVzIG1ha2VmaWxlIGRlZmluaXRpb25zLCB3aGljaCBkZWZpbmUgdGhlIHJ1bGVzIHVzZWQgdG8KLSMJCQkJYnVpbGQgdGFyZ2V0cy4gV2UgaW5jbHVkZSB0aGVtIGhlcmUgYXQgdGhlIGVuZCBvZiB0aGUKLSMJCQkJbWFrZWZpbGUgc28gdGhlIGdlbmVyaWMgcHJvamVjdCBtYWtlZmlsZXMgY2FuIG92ZXJyaWRlCi0jCQkJCWNlcnRhaW4gdGhpbmdzIHdpdGggbWFjcm9zIChzdWNoIGFzIGxpbmtpbmcgQysrIHByb2dyYW1zCi0jCQkJCWRpZmZlcmVudGx5KS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgSW1wbGljaXQgZ2VuZXJhdGlvbiBydWxlcyBmb3IgbWFraW5nIG9iamVjdCBmaWxlcwotJSRPOiAlLmMgOyAkKENDKSBAJChta3RtcCAkKENGTEFHUzpzL1wvXFwpKSAtYyAkKDw6cywvLFwpCi0lJE86ICUkUCA7ICQoQ0MpIEAkKG1rdG1wICQoQ0ZMQUdTOnMvXC9cXCkpIC1jICQoPDpzLC8sXCkKLS5JRiAkKFVTRV9OQVNNKQotJSRPOiAlJEEgOyAkKEFTKSBAJChta3RtcCAtbyAkQCAkKEFTRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQotLkVMU0UKLSUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIHJlc291cmNlIGZpbGVzCi0lJFI6ICUucmMgOyAkKFJDKSAkKFJDRkxBR1MpIC1yICQ8Ci0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBETEwgdXNpbmcgYSByZXNwb25zZSBmaWxlCi0lJEQ6IDsKLQltYWtlZGVmICQoQDpiKQotCSQoTEQpICQobWt0bXAgJChMREZMQUdTKSAtVG9kIC1hYSBjMDJkLm9iaitcbiQoJjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKERFRl9MSUJTOnMvXC9cXCkgJChFWEVMSUJTKVxuJCouZGVmKQotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLS5JRiAkKEJVSUxEX0RMTCkKLSUkTDogOwotICAgIEAkKFJNKSAkQAotICAgICQoSUxJQikgJChJTElCRkxBR1MpICRAICQ/Ci0uRUxJRiAkKElNUE9SVF9ETEwpCi0lJEw6IDsKLSAgICBAJChSTSkgJEAKLSAgICAkKElMSUIpICQoSUxJQkZMQUdTKSAkQCAkPwotLkVMU0UKLSUkTDogOwotICAgIEAkKFJNKSAkQAotICAgICQoTElCKSAkKExJQkZMQUdTKSAkQCBAJChta3RtcCArJCgmOnQiICZcbisiKVxuKQotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLQotLklGICQoVVNFX09TMkdVSSkKLSUkRTogOyAkKExEKSAkKG1rdG1wICQoTERGTEFHUykgLVRvZSAtYWEgYzAyLm9iaitcbiQoJjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKERFRl9MSUJTOnMvXC9cXCkgJChFWEVMSUJTKVxuJCouZGVmKQotLkVMU0UKLSUkRTogOyAkKExEKSAkKG1rdG1wICQoTERGTEFHUykgLVRvZSAtYXAgYzAyLm9iaitcbiQoJjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKERFRl9MSUJTOnMvXC9cXCkgJChFWEVMSUJTKVxuJCouZGVmKQotLkVORElGCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2NsMTYubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2NsMTYubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ODlhM2UuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9jbDE2Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0Ci0KLS5JRiAkKE5PX1BNTElCKQotUE1MSUIgOj0KLS5FTkRJRgotCi0jIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMKLSUkTzogJS5jIDsgJChDQykgL25vbG9nbyAkKENGTEFHUykgL2MgJDwKLSUkTzogJSRQIDsgJChDQykgL25vbG9nbyAkKENGTEFHUykgL2MgJDwKLSUkTzogJSRBIDsgJChBUykgJChBU0ZMQUdTKSAkPCAkKiBOVUwgTlVMCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgcmVzb3VyY2UgZmlsZXMKLSUkUjogJS5yYyA7ICQoUkMpICQoUkNGTEFHUykgLXIgJDwKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIERMTCB1c2luZyBhIHJlc3BvbnNlIGZpbGUKLSMlJEQ6IDsgcmNsaW5rICQoTEQpICQoUkMpICRAICQobWt0bXAgJChMREZMQUdTOnMvXC9cXCkgLWUkQFxuJCgmOnQiXG4iOnMvXC9cXClcbiQoRVhFTElCUykpCi0jJSREOiA7ICQoTEQpICQoTERGTEFHUykgL0ZlJEAgJCYgJChFWEVMSUJTKQotJSREOiA7ICBsaW5rIEBkZWZhdWx0LnJzcAotCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotLklGICQoQlVJTERfRExMKQotJSRMOiAgICAgIDsgJChJTElCKSAkKElMSUJGTEFHUykgJEAgJD8KLS5FTElGICQoSU1QT1JUX0RMTCkKLSUkTDogICAgICA7ICQoSUxJQikgJChJTElCRkxBR1MpICRAICQ/Ci0uRUxTRQotJSRMOiA7ICQoTElCKSAvbm9sb2dvICQoTElCRkxBR1MpICRAIEAkKG1rdG1wIC0rJCg/OnQiICZcbi0rIikgJlxuLCxcbikKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCi0uSUYgJChVU0VfV0lOMTYpCi0jJSRFOiA7IHJjbGluayAkKExEKSAkKFJDKSAkQCAkKG1rdG1wICQoTERGTEFHUykgL0ZlJEAgJCgmOnMvXC9cXCkgJChFWEVMSUJTKSkKLSUkRTogOyAkKExEKSBAJChta3RtcCAkKExERkxBR1MpIC9GZSRAICQoJjpzL1wvXFwpICQoRVhFTElCUykpCi0uRUxTRQotJSRFOiA7ICQoTEQpIEAkKG1rdG1wICQoTERGTEFHUykgL0ZlJEAgJCgmOnMvXC9cXCkgJChQTUxJQikgJChFWEVMSUJTKSkKLS5FTkRJRgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9jbDM4Ni5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvY2wzODYubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MGIyNzQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9jbDM4Ni5taworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bwotIwkJCQlidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQotIwkJCQltYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKLSMJCQkJY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKLSMJCQkJZGlmZmVyZW50bHkpLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUYWtlIG91dCBQTUxJQiBpZiB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgd2l0aCBpdAotCi0uSUYgJChOT19QTUxJQikKLVBNTElCIDo9Ci0uRU5ESUYKLQotIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzCi0lJE86ICUuYyA7ICQoQ0MpIC1ub2xvZ28gJChDRkxBR1MpIC1jICQ8Ci0lJE86ICUkUCA7ICQoQ0MpIC1ub2xvZ28gJChDRkxBR1MpIC1jICQ8Ci0lJE86ICUkQSA7ICQoQVMpICQoQVNGTEFHUykgJDwgJCogTlVMIE5VTAotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIHJlc291cmNlIGZpbGVzCi0lJFI6ICUucmMgOyAkKFJDKSAkKFJDRkxBR1MpIC1yICQ8Ci0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBETEwgdXNpbmcgYSByZXNwb25zZSBmaWxlCi0jJSREOiA7IHJjbGluayAkKExEKSAkKFJDKSAkQCAkKG1rdG1wICQoTERGTEFHUzpzL1wvXFwpIC1lJEBcbiQoJjp0IlxuIjpzL1wvXFwpXG4kKEVYRUxJQlMpKQotIyUkRDogOyAkKExEKSAkKExERkxBR1MpIC9GZSRAICQmICQoRVhFTElCUykKLSUkRDogOyAgbGluazM4NiBAZGVmYXVsdC5yc3AKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIGRldmljZSBkcml2ZXIgdXNpbmcgYSByZXNwb25zZSBmaWxlCi0lLlNZUzogOyAgbGluazM4NiBAZGVmYXVsdC5yc3AKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIGxpYnJhcnkgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCi0uSUYgJChCVUlMRF9ETEwpCi0lJEw6ICAgICAgOyAkKElMSUIpICQoSUxJQkZMQUdTKSAkQCAkPwotLkVMSUYgJChJTVBPUlRfRExMKQotJSRMOiAgICAgIDsgJChJTElCKSAkKElMSUJGTEFHUykgJEAgJD8KLS5FTFNFCi0lJEw6IDsgJChMSUIpIC9ub2xvZ28gJChMSUJGTEFHUykgJEAgQCQobWt0bXAgLSskKD86dCIgJlxuLSsiKSAmXG4sLFxuKQotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLS5JRiAkKFVTRV9XSU4xNikKLSMlJEU6IDsgcmNsaW5rICQoTEQpICQoUkMpICRAICQobWt0bXAgJChMREZMQUdTKSAvRmUkQCAkKCY6cy9cL1xcKSAkKEVYRUxJQlMpKQotJSRFOiA7ICQoTEQpIEAkKG1rdG1wICQoTERGTEFHUykgL0ZlJEAgJCgmOnMvXC9cXCkgJChFWEVMSUJTKSkKLS5FTFNFCi0lJEU6IDsgJChMRCkgQCQobWt0bXAgJChMREZMQUdTKSAvRmUkQCAkKCY6cy9cL1xcKSAkKFBNTElCKSAkKEVYRUxJQlMpKQotLkVORElGCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2RqMzIubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2RqMzIubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmOTE3YmIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9kajMyLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0Ci0KLS5JRiAkKE5PX1BNTElCKQotUE1MSUIgOj0KLS5FTkRJRgotCi0jIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMKLSUkTzogJS5jIDsgJChDQykgQCQobWt0bXAgJChDRkxBR1M6cy9cL1xcKSAtYykgJCg8OnMsLyxcKQotJSRPOiAlJFAgOyAkKENDKSBAJChta3RtcCAkKENGTEFHUzpzL1wvXFwpIC1jKSAkKDw6cywvLFwpCi0lJE86ICUkQSA7ICQoQVMpIEAkKG1rdG1wIC1vICRAICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotJSRMOiAgICAgIDsgJChMSUIpICQoTElCRkxBR1MpICRAIEAkKG1rdG1wICQoJjpzL1wvXFwpXG4pCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLSUkRTogICAgICA7ICQoTEQpICQoTERGTEFHUykgJEAgQCQobWt0bXAgJCgmOnMvXC9cXCkgJChFWEVMSUJTKSAkKFBNTElCKSAtbHN0ZGN4eCAtbG0pCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2VteC5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvZW14Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmQyMjNhLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvZW14Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jICAgICAgICAgICAgICAgT1MvMiB2ZXJzaW9uIGZvciBFTVgvR05VIEMvQysrLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUYWtlIG91dCBQTUxJQiBpZiB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgd2l0aCBpdAotCi0uSUYgJChOT19QTUxJQikKLVBNTElCIDo9Ci0uRU5ESUYKLQotIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzCi0lJE86ICUuYyA7Ci0uSUYgJChTSE9XX0FSR1MpCi0JJChDQykgLWMgJChDRkxBR1MpICQoPDpzLFwsLykKLS5FTFNFCi0JQGVjaG8gJChDQykgLWMgJCg8OnMsXCwvKQotCUAkKENDKSAtYyAkKENGTEFHUykgJCg8OnMsXCwvKQotLkVORElGCi0KLSUkTzogJSRQIDsKLS5JRiAkKFNIT1dfQVJHUykKLQkkKENYWCkgLWMgJChDRkxBR1MpICQoPDpzLFwsLykKLS5FTFNFCi0JQGVjaG8gJChDWFgpIC1jICQoPDpzLFwsLykKLQlAJChDWFgpIC1jICQoQ0ZMQUdTKSAkKDw6cyxcLC8pCi0uRU5ESUYKLQotJSRPOiAlJEEgOwotLklGICQoVVNFX05BU00pCi0uSUYgJChTSE9XX0FSR1MpCi0JJChBUykgLW8gJEAgJChBU0ZMQUdTKSAkKDw6cyxcLC8pCi0uRUxTRQotCUBlY2hvICQoQVMpICQoPDpzLFwsLykKLQlAJChBUykgQCQobWt0bXAgLW8gJEAgJChBU0ZMQUdTKSkgJCg8OnMsXCwvKQotLkVORElGCi0uRUxTRQotLklGICQoU0hPV19BUkdTKQotCi0gICAgJChBUykgIEAkKG1rdG1wICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCi0uRUxTRQotCUBlY2hvICQoQVMpICQoPDpzLC8sXCkKLSAgICAkKEFTKSAgQCQobWt0bXAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKLS5FTkRJRgotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotJSRMOiAgICAgOwotLklGICQoU0hPV19BUkdTKQotCSQoTElCKSAkKExJQkZMQUdTKSAkQCAkKCY6cyxcLC8pCi0uRUxTRQotCUBlY2hvICQoTElCKSAkQAotCUAkKExJQikgJChMSUJGTEFHUykgJEAgQCQobWt0bXAgJCg/OnQiXG4iKSkKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCi0lJEU6ICAgICA7Ci0uSUYgJChTSE9XX0FSR1MpCi0JJChMRCkgJChMREZMQUdTKSAtbyAkQCAkKCY6cyxcLC8pICQoRVhFTElCUykgJChQTUxJQikgLWxncHAgLWxzdGRjcHAKLS5FTFNFCi0JQGVjaG8gJChMRCkgJEAKLQlAJChMRCkgJChMREZMQUdTKSAtbyAkQCAkKCY6cyxcLC8pICQoRVhFTElCUykgJChQTUxJQikgLWxncHAgLWxzdGRjcHAKLS5FTkRJRgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9nY2NfYmVvcy5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvZ2NjX2Jlb3MubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MWI2OTguLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9nY2NfYmVvcy5taworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bwotIwkJCQlidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQotIwkJCQltYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKLSMJCQkJY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKLSMJCQkJZGlmZmVyZW50bHkpLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUYWtlIG91dCBQTUxJQiBpZiB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgd2l0aCBpdAotCi0uSUYgJChOT19QTUxJQikKLVBNTElCIDo9Ci0uRU5ESUYKLQotIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzIGZyb20gc291cmNlIGZpbGVzCi0lJE86ICUuYyA7ICQoQ0MpICQoQ0ZMQUdTKSAtYyAkPAotJSRPOiAlJFAgOyAkKENYWCkgJChDRkxBR1MpIC1jICQ8Ci0lJE86ICUkQSA7ICQoQVMpICQoQVNGTEFHUykgJDwKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIGxpYnJhcnkgZmlsZQotJSRMOiAgICAgOyAkKExJQikgJChMSUJGTEFHUykgJEAgJCYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUKLSUkRTogICAgIDsgJChMRCkgJChMREZMQUdTKSAtbyAkQCAkJiAkKEVYRUxJQlMpICQoUE1MSUIpCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2djY19mcmVlYnNkLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9nY2NfZnJlZWJzZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI0ZDIzNi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2djY19mcmVlYnNkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0Ci0KLS5JRiAkKE5PX1BNTElCKQotUE1MSUIgOj0KLS5FTkRJRgotCi0jIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMgZnJvbSBzb3VyY2UgZmlsZXMKLSUkTzogJS5jIDsgJChDQykgJChDRkxBR1MpIC1jICQ8Ci0lJE86ICUkUCA7ICQoQ1hYKSAkKENGTEFHUykgLWMgJDwKLSUkTzogJSRBIDsgJChBUykgLW8gJEAgJChBU0ZMQUdTKSAkPAotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlCi0lJEw6ICAgICA7ICQoTElCKSAkKExJQkZMQUdTKSAkQCAkJgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZQotJSRFOiAgICAgOyAkKExEKSAkKExERkxBR1MpIC1vICRAICQmICQoRVhFTElCUykgJChQTUxJQikgLWxtCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2djY19saW51eC5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvZ2NjX2xpbnV4Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjkxZmU1Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvZ2NjX2xpbnV4Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0Ci0KLS5JRiAkKE5PX1BNTElCKQotUE1MSUIgOj0KLS5FTkRJRgotCi0uSUYgJChVU0VfQ1hYX0xJTktFUikKLUxECTo9ICQoTERYWCkKLS5FTkRJRgotCi0jIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMgZnJvbSBzb3VyY2UgZmlsZXMKLSUkTzogJS5jIDsKLS5JRiAkKFNIT1dfQVJHUykKLSAgICAkKENDKSAtYyAkKENGTEFHUykgJDwKLS5FTFNFCi0gICAgQCQoRUNITykgJChDQykgJChTSE9XX0NGTEFHUykgJDwKLSAgICBAJChDQykgLWMgJChDRkxBR1MpICQ8Ci0uRU5ESUYKLQotJSRPOiAlJFAgOwotLklGICQoU0hPV19BUkdTKQotICAgICQoQ1hYKSAtYyAkKENGTEFHUykgJDwKLS5FTFNFCi0gICAgQCQoRUNITykgJChDWFgpICQoU0hPV19DRkxBR1MpICQ8Ci0gICAgQCQoQ1hYKSAtYyAkKENGTEFHUykgJDwKLS5FTkRJRgotCi0lJE86ICUkQSA7Ci0uSUYgJChTSE9XX0FSR1MpCi0gICAgJChBUykgLW8gJEAgJChBU0ZMQUdTKSAkPAotLkVMU0UKLSAgICBAJChFQ0hPKSAkKEFTKSAkKFNIT1dfQVNGTEFHUykgJDwKLSAgICBAJChBUykgQCQobWt0bXAgLW8gJEAgJChBU0ZMQUdTKSkgJDwKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlCi0uSUYgJChCVUlMRF9ETEwpCi0lJEw6ICAgICA7Ci0uSUYgJChTSE9XX0FSR1MpCi0gICAgJChMSUIpICQoTElCRkxBR1MpIC1XbCwtc29uYW1lLCRALiQoVkVSU0lPTk1BSikgLW8gJEAgJCYgJChMSUJTKQotLkVMU0UKLSAgICBAJChFQ0hPKSAkKExJQikgJEAKLSAgICBAJChMSUIpICQoTElCRkxBR1MpIC1XbCwtc29uYW1lLCRALiQoVkVSU0lPTk1BSikgLW8gJEAgJCYgJChMSUJTKQotLkVORElGCi0uRUxTRQotJSRMOiAgICAgOwotLklGICQoU0hPV19BUkdTKQotICAgICQoTElCKSAkKExJQkZMQUdTKSAkQCAkJgotLkVMU0UKLSAgICBAJChFQ0hPKSAkKExJQikgJEAKLSAgICBAJChMSUIpICQoTElCRkxBR1MpICRAICQmCi0uRU5ESUYKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZQotJSRFOiAgICAgOwotLklGICQoU0hPV19BUkdTKQotICAgICQoTEQpICQoTERGTEFHUykgLW8gJEAgJCYgJChFWEVMSUJTKSAkKFBNTElCKSAtbG0KLS5FTFNFCi0gICAgQCQoRUNITykgbGQgJEAKLSAgICBAJChMRCkgJChMREZMQUdTKSAtbyAkQCAkJiAkKEVYRUxJQlMpICQoUE1MSUIpIC1sbQotLkVORElGCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2djY193aW4zMi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvZ2NjX3dpbjMyLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODVkMTY2Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvZ2NjX3dpbjMyLm1rCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0Ci0KLS5JRiAkKE5PX1BNTElCKQotUE1MSUIgOj0KLS5FTkRJRgotCi0uSUYgJChVU0VfQ1hYX0xJTktFUikKLUxECTo9ICQoTERYWCkKLS5FTkRJRgotCi0jIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMgZnJvbSBzb3VyY2UgZmlsZXMKLSUkTzogJS5jIDsKLS5JRiAkKFNIT1dfQVJHUykKLSAgICAkKENDKSAtYyAkKENGTEFHUzpzL1wvXFwpICQoPDpzLC8sXCkKLS5FTFNFCi0gICAgQCQoRUNITykgJChDQykgJChTSE9XX0NGTEFHUzpzL1wvXFwpICQoPDpzLC8sXCkKLSAgICBAJChDQykgLWMgJChDRkxBR1M6cy9cL1xcKSAkKDw6cywvLFwpCi0uRU5ESUYKLQotJSRPOiAlJFAgOwotLklGICQoU0hPV19BUkdTKQotICAgICQoQ1hYKSAtYyAkKENGTEFHUzpzL1wvXFwpICQoPDpzLC8sXCkKLS5FTFNFCi0gICAgQCQoRUNITykgJChDWFgpICQoU0hPV19DRkxBR1M6cy9cL1xcKSAkKDw6cywvLFwpCi0gICAgQCQoQ1hYKSAtYyAkKENGTEFHUzpzL1wvXFwpICQoPDpzLC8sXCkKLS5FTkRJRgotCi0lJE86ICUkQSA7Ci0uSUYgJChTSE9XX0FSR1MpCi0gICAgJChBUykgLW8gJChBU0ZMQUdTOnMvXC9cXCkgJCg8OnMsLyxcKQotLkVMU0UKLSAgICBAJChFQ0hPKSAkKEFTKSAkKFNIT1dfQVNGTEFHUzpzL1wvXFwpICQoPDpzLC8sXCkKLSAgICBAJChBUykgQCQobWt0bXAgLW8gJEAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIHJlc291cmNlIGZpbGVzCi0lJFI6ICUucmMgOyAkKFJDKSAkPCAkKFJDRkxBR1MpIC1vICRACi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBETEwKLSMgVE9ETyEKLSMlJEQ6IDsgK3JjbGluayAkKExEKSAkKFJDKSAkQCAkKG1rdG1wICQoTERGTEFHUykgL0ZlJEAgJCgmOnQiXG4icy9cL1xcKSAkKFBNTElCKSAkKEVYRUxJQlMpICQoREVGX0xJQlMpICQoTERFTkRGTEFHUykpCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUKLSUkTDogICAgIDsKLS5JRiAkKFNIT1dfQVJHUykKLSAgICAkKExJQikgJChMSUJGTEFHUykgJEAgJCYKLS5FTFNFCi0gICAgQCQoRUNITykgJChMSUIpICRACi0gICAgQCQoTElCKSAkKExJQkZMQUdTKSAkQCBAJChta3RtcCAkKCY6cy9cL1xcKVxuKQotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlCi0lJEU6ICAgICA7Ci0uSUYgJChTSE9XX0FSR1MpCi0gICAgJChMRCkgJChMREZMQUdTKSAtbyAkQCAkJiAkKEVYRUxJQlMpICQoUE1MSUIpIC1sbQotLkVMU0UKLSAgICBAJChFQ0hPKSBsZCAkQAotICAgIEAkKExEKSAkKExERkxBR1MpIC1vICRAIEAkKG1rdG1wICQoJjpzL1wvXFwpICQoRVhFTElCUykgJChQTUxJQikgLWxtKQotLkVORElGCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2hjMzIubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL2hjMzIubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMWU5YWIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9oYzMyLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0Ci0KLS5JRiAkKE5PX1BNTElCKQotUE1MSUIgOj0KLS5FTkRJRgotCi0jIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMKLSUkTzogJS5jIDsgJChDQykgJChDRkxBR1MpIC1jICQ8Ci0lJE86ICUkUCA7ICQoQ0MpICQoQ0ZMQUdTKSAtYyAkPAotLklGICQoVVNFX05BU00pCi0lJE86ICUkQSA7ICQoQVMpIEAkKG1rdG1wIC1vICRAICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCi0uRUxTRQotJSRPOiAlJEEgOyAkKEFTKSBAJChta3RtcCAkKEFTRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotJSRMOiAgICAgIDsgJChMSUIpICQoTElCRkxBR1MpICRAIEAkKG1rdG1wLCQqLnJzcCAtUiAkPykKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotJSRFOiAgICAgIDsgJChMRCkgJChMREZMQUdTKSAtbyAkQCBAJChta3RtcCAkKCY6cy9cL1xcKSAkKFBNTElCKSAkKEVYRUxJQlMpIC1sZG9zeDMyLmxpYikKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvcW54NC5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvcW54NC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVkYzAzNS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3FueDQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIFJ1bGVzIG1ha2VmaWxlIGRlZmluaXRpb25zLCB3aGljaCBkZWZpbmUgdGhlIHJ1bGVzIHVzZWQgdG8KLSMJCQkJYnVpbGQgdGFyZ2V0cy4gV2UgaW5jbHVkZSB0aGVtIGhlcmUgYXQgdGhlIGVuZCBvZiB0aGUKLSMJCQkJbWFrZWZpbGUgc28gdGhlIGdlbmVyaWMgcHJvamVjdCBtYWtlZmlsZXMgY2FuIG92ZXJyaWRlCi0jCQkJCWNlcnRhaW4gdGhpbmdzIHdpdGggbWFjcm9zIChzdWNoIGFzIGxpbmtpbmcgQysrIHByb2dyYW1zCi0jCQkJCWRpZmZlcmVudGx5KS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgVGFrZSBvdXQgUE1MSUIgaWYgd2UgZG9uJ3QgbmVlZCB0byBsaW5rIHdpdGggaXQKLQotLklGICQoTk9fUE1MSUIpCi1QTUxJQiA6PQotLkVORElGCi0KLSMgV2hldGhlciB0byBsaW5rIGluIHJlYWwgVkJJT1MgbGlicmFyeSwgb3IganVzdCB0aGUgc3R1YiBsaWJyYXJ5Ci0KLS5JRiAkKFVTRV9CSU9TKQotVkJJT1NMSUIgOj0gLWx2Ymlvcy5saWIKLS5FTFNFCi1WQklPU0xJQiA6PSAtbHZic3R1YnMubGliCi0uRU5ECi0KLSMgUmVxdWlyZSBzcGVjaWFsIHByaXZsZWRnZXMgZm9yIE51Y2xldXMgcHJvZ3JhbXMgKHJlcXVpcmVzIHJvb3QgYWNjZXNzKQotCi0uSUYgJChVU0VfTlVDTEVVUykKLUxERkxBR1MJCSs9IC1UMQotLkVORElGCi0KLSMgSW1wbGljaXQgZ2VuZXJhdGlvbiBydWxlcyBmb3IgbWFraW5nIG9iamVjdCBmaWxlcyBmcm9tIHNvdXJjZSBmaWxlcwotJSRPOiAlLmMgOwotLklGICQoU0hPV19BUkdTKQotICAgICQoQ0MpICQoQ0ZMQUdTKSAkPAotLkVMU0UKLSAgICBAZWNobyAkKENDKSAtYyAkPAotCStAJChDQykgJChDRkxBR1MpICQ8ID4gL2Rldi9udWxsCi0uRU5ESUYKLQotJSRPOiAlJFAgOwotLklGICQoU0hPV19BUkdTKQotCSQoQ1hYKSAkKENGTEFHUykgJDwKLS5FTFNFCi0JQGVjaG8gJChDWFgpIC1jICQ8Ci0JK0AkKENYWCkgJChDRkxBR1MpICQ8ID4gL2Rldi9udWxsCi0uRU5ESUYKLQotJSRPOiAlJEEgOwotLklGICQoU0hPV19BUkdTKQotICAgICQoQVMpIC1vICRAICQoQVNGTEFHUykgJDwKLS5FTFNFCi0gICAgQGVjaG8gJChBUykgJDwKLQlAJChBUykgLW8gJEAgJChBU0ZMQUdTKSAkPAotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUKLSUkTDogICAgIDsKLS5JRiAkKFNIT1dfQVJHUykKLSAgICAkKExJQikgJChMSUJGTEFHUykgLXEgJEAgJCYKLS5FTFNFCi0gICAgQGVjaG8gJChMSUIpICRACi0JK0AkKExJQikgJChMSUJGTEFHUykgLXEgJEAgJCYgPiAvZGV2L251bGwKLS5FTkRJRgotCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlCi0lJEU6ICAgICA7Ci0uSUYgJChTSE9XX0FSR1MpCi0JJChMRCkgJChMREZMQUdTKSAtbyAkQCAkJiAkKEVYRUxJQlMpICQoUE1MSUIpICQoVkJJT1NMSUIpCi0uRUxTRQotCUBlY2hvIHdsaW5rICRACi0JK0AkKExEKSAkKExERkxBR1MpIC1vICRAICQmICQoRVhFTElCUykgJChQTUxJQikgJChWQklPU0xJQikgPiAvZGV2L251bGwKLS5FTkRJRgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9xbnhudG8ubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3FueG50by5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQzYWQxZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3FueG50by5taworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bwotIwkJCQlidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQotIwkJCQltYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKLSMJCQkJY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKLSMJCQkJZGlmZmVyZW50bHkpLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUYWtlIG91dCBQTUxJQiBpZiB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgd2l0aCBpdAotCi0uSUYgJChOT19QTUxJQikKLVBNTElCIDo9Ci0uRU5ESUYKLQotIyBXaGV0aGVyIHRvIGxpbmsgaW4gcmVhbCBWQklPUyBsaWJyYXJ5LCBvciBqdXN0IHRoZSBzdHViIGxpYnJhcnkKLQotLklGICQoVVNFX0JJT1MpCi1WQklPU0xJQiA6PSAtbHZiaW9zCi0uRUxTRQotVkJJT1NMSUIgOj0gLWx2YnN0dWJzCi0uRU5ECi0KLSMgSW1wbGljaXQgZ2VuZXJhdGlvbiBydWxlcyBmb3IgbWFraW5nIG9iamVjdCBmaWxlcyBmcm9tIHNvdXJjZSBmaWxlcwotJSRPOiAlLmMgOyAkKENDKSAkKENGTEFHUykgLWMgJDwKLSUkTzogJSRQIDsgJChDWFgpICQoQ1BQRkxBR1MpIC1jICQ8Ci0lJE86ICUkQSA7ICQoQVMpIC1vICRAICQoQVNGTEFHUykgJDwKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIGxpYnJhcnkgZmlsZQotJSRMOiAgICAgOyAkKExJQikgJChMSUJGTEFHUykgJEAgJCYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUKLSUkRTogICAgIDsgJChMRCkgJChMREZMQUdTKSAtbyAkQCAkJiAkKEVYRUxJQlMpICQoUE1MSUIpICQoVkJJT1NMSUIpCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3NjMTYubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3NjMTYubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzM2JjZDguLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy9zYzE2Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0Ci0KLS5JRiAkKE5PX1BNTElCKQotUE1MSUIgOj0KLS5FTkRJRgotCi0jIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMKLSUkTzogJS5jIDsgJChDQykgJChDRkxBR1MpIC1jICQ8Ci0lJE86ICUkUCA7ICQoQ0MpICQoQ0ZMQUdTKSAtYyAkPAotJSRPOiAlJEEgOyAkKEFTKSBAJChta3RtcCAkKEFTRkxBR1MpKSAkKDw6cywvLFwpCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgcmVzb3VyY2UgZmlsZXMKLSUkUjogJS5yYyA7ICQoUkMpICQoUkNGTEFHUykgLXIgJDwKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIERMTCB1c2luZyBhIHJlc3BvbnNlIGZpbGUKLSUkRDogOyAkKExEKSAkKExERkxBR1MpIEAkKG1rdG1wICQoJjpzL1wvXFwpICQoRVhFTElCUykpCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotLklGICQoQlVJTERfRExMKQotJSRMOiA7ICQoSUxJQikgJChJTElCRkxBR1MpICRAICQ/Ci0uRUxJRiAkKElNUE9SVF9ETEwpCi0lJEw6IDsgJChJTElCKSAkKElMSUJGTEFHUykgJEAgJD8KLS5FTFNFCi0lJEw6IDsgJChMSUIpICQoTElCRkxBR1MpICRAIEAkKG1rdG1wIC0rJCg/OnQiICZcbi0rIilcbikKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCi0uSUYgJChVU0VfV0lOMTYpCi0lJEU6IDsgJChMRCkgJChMREZMQUdTKSBAJChta3RtcCAkKCY6cy9cL1xcKSAkKEVYRUxJQlMpKQotLkVMU0UKLSUkRTogOyAkKExEKSAkKExERkxBR1MpIEAkKG1rdG1wICQoJjpzL1wvXFwpICQoUE1MSUIpICQoRVhFTElCUykpCi0uRU5ESUYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvc2MzMi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvc2MzMi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIzMTkwNi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3NjMzIubWsKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIFJ1bGVzIG1ha2VmaWxlIGRlZmluaXRpb25zLCB3aGljaCBkZWZpbmUgdGhlIHJ1bGVzIHVzZWQgdG8KLSMJCQkJYnVpbGQgdGFyZ2V0cy4gV2UgaW5jbHVkZSB0aGVtIGhlcmUgYXQgdGhlIGVuZCBvZiB0aGUKLSMJCQkJbWFrZWZpbGUgc28gdGhlIGdlbmVyaWMgcHJvamVjdCBtYWtlZmlsZXMgY2FuIG92ZXJyaWRlCi0jCQkJCWNlcnRhaW4gdGhpbmdzIHdpdGggbWFjcm9zIChzdWNoIGFzIGxpbmtpbmcgQysrIHByb2dyYW1zCi0jCQkJCWRpZmZlcmVudGx5KS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgVGFrZSBvdXQgUE1MSUIgaWYgd2UgZG9uJ3QgbmVlZCB0byBsaW5rIHdpdGggaXQKLQotLklGICQoTk9fUE1MSUIpCi1QTUxJQiA6PQotLkVORElGCi0KLSMgSW1wbGljaXQgZ2VuZXJhdGlvbiBydWxlcyBmb3IgbWFraW5nIG9iamVjdCBmaWxlcwotJSRPOiAlLmMgOyAkKENDKSAkKENGTEFHUykgLWMgJDwKLSUkTzogJSRQIDsgJChDQykgJChDRkxBR1MpIC1jICQ8Ci0uSUYgJChVU0VfTkFTTSkKLSUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgLW8gJEAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKLS5FTFNFCi0lJE86ICUkQSA7ICQoQVMpIEAkKG1rdG1wICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyByZXNvdXJjZSBmaWxlcwotJSRSOiAlLnJjIDsgJChSQykgJChSQ0ZMQUdTKSAtciAkPAotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgRExMIHVzaW5nIGEgcmVzcG9uc2UgZmlsZQotJSREOiA7ICQoTEQpICQoTERGTEFHUykgQCQobWt0bXAsJCoubG5rICQoJjpzL1wvXFwpICQoRVhFTElCUykga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbm1tLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliKQotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLS5JRiAkKEJVSUxEX0RMTCkKLSUkTDogOyAkKElMSUIpICQoSUxJQkZMQUdTKSAkQCAkPwotLkVMSUYgJChJTVBPUlRfRExMKQotJSRMOiA7ICQoSUxJQikgJChJTElCRkxBR1MpICRAICQ/Ci0uRUxTRQotJSRMOiA7ICQoTElCKSAkKExJQkZMQUdTKSAkQCBAJChta3RtcCAtKyQoPzp0IiAmXG4tKyIpXG4pCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotLklGICQoVVNFX1ROVCkKLSUkRTogOyAkKExEKSAkKExERkxBR1MpIEAkKG1rdG1wLCQqLmxuayAkKCY6cy9cL1xcKSAkKFBNTElCKSAkKEVYRUxJQlMpKQotLkVMSUYgJChVU0VfV0lOMzIpCi0lJEU6IDsgJChMRCkgJChMREZMQUdTKSBAJChta3RtcCwkKi5sbmsgJCgmOnMvXC9cXCkgJChFWEVMSUJTKSBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2lubW0ubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIpCi0uRUxTRQotJSRFOiA7ICQoTEQpICQoTERGTEFHUykgQCQobWt0bXAsJCoubG5rICQoJjpzL1wvXFwpICQoUE1MSUIpICQoRVhFTElCUykpCi0uRU5ESUYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvdmEzMi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvdmEzMi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEyMDMxOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3ZhMzIubWsKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0Ci0KLS5JRiAkKE5PX1BNTElCKQotUE1MSUIgOj0KLS5FTkRJRgotCi0jIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMKLSUkTzogJS5jIDsgJChDQykgIC1jIEAkKG1rdG1wICQoQ0ZMQUdTOnMvXC9cXCkpICAkKDw6cywvLFwpCi0lJE86ICUkUCA7ICQoQ1BQKSAtYyBAJChta3RtcCAkKENGTEFHUzpzL1wvXFwpKSAgJCg8OnMsLyxcKQotLklGICQoVVNFX05BU00pCi0lJE86ICUkQSA7ICQoQVMpICBAJChta3RtcCAtbyAkQCAkKEFTRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQotLkVMU0UKLSUkTzogJSRBIDsgJChBUykgIEAkKG1rdG1wICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyByZXNvdXJjZSBmaWxlcwotJSRSOiAlLnJjIDsgJChSQykgJChSQ0ZMQUdTKSAtciAkPAotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGhlbHAgZmlsZXMKLSUuaGxwOiAlLmlwZjsgJChJUEZDKSAkKElQRkNGTEFHUykgJDwKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIERMTCB1c2luZyBhIHJlc3BvbnNlIGZpbGUKLS5JRiAkKFVTRV9PUzJHVUkpCi0lJEQ6IDsgcmNsaW5rICQoTEQpICQoUkMpICRAICQobWt0bXAgJChMREZMQUdTKSAkKCY6dCIrXG4iOnMvXC9cXClcbiRAXG4kKi5tYXBcbiQoRVhFTElCUykgJChQTUxJQilcbiQqLmRlZlxuKQotLkVMU0UKLSUkRDogOyAkKExEKSAvbm9mcmVlIC9ub2wgQCQobWt0bXAgJChMREZMQUdTKSAkKCY6dCIrXG4iOnMvXC9cXClcbiRAXG4kKi5tYXBcbiQoRVhFTElCUykgJChQTUxJQilcbiQqLmRlZlxuKQotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotLklGICQoQlVJTERfRExMKQotJSRMOiA7ICQoSUxJQikgJChJTElCRkxBR1MpICRAICQ/Ci0uRUxJRiAkKElNUE9SVF9ETEwpCi0lJEw6IDsgJChJTElCKSAkKElMSUJGTEFHUykgJEAgJD8KLS5FTFNFCi0lJEw6IDsgJChMSUIpICQoTElCRkxBR1MpIEAkKG1rdG1wICRALSskKD86dCImXG4tKyI6cy9cL1xcKTspCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotLklGICQoVVNFX09TMkdVSSkKLSUkRTogOwotCXJjbGluayAkKExEKSAkKFJDKSAkQCAkKG1rdG1wICQoTERGTEFHUykgJCgmOnQiK1xuIjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKEVYRUxJQlMpICQoUE1MSUIpXG4kKi5kZWZcbikKLS5JRiAkKExYTElURSkKLQlseGxpdGUgJEAKLS5FTkRJRgotLkVMU0UKLSUkRTogOwotCXJjbGluayAkKExEKSAkKFJDKSAkQCAkKG1rdG1wICQoTERGTEFHUykgJCgmOnQiK1xuIjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKEVYRUxJQlMpICQoUE1MSUIpXG5cbikKLS5JRiAkKExYTElURSkKLQlseGxpdGUgJEAKLS5FTkRJRgotLkVORElGCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3ZhMzY1Lm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy92YTM2NS5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI0MTgwMS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3ZhMzY1Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50bHkpLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUYWtlIG91dCBQTUxJQiBpZiB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgd2l0aCBpdAotCi0uSUYgJChOT19QTUxJQikKLVBNTElCIDo9Ci0uRU5ESUYKLQotIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzCi0lJE86ICUuYyA7ICQoQ0MpIC1jIEAkKG1rdG1wICQoQ0ZMQUdTOnMvXC9cXCkpICAkKDw6cywvLFwpCi0lJE86ICUkUCA7ICQoQ1BQKSAtYyBAJChta3RtcCAkKENGTEFHUzpzL1wvXFwpKSAgJCg8OnMsLyxcKQotLklGICQoVVNFX05BU00pCi0lJE86ICUkQSA7ICQoQVMpIEAkKG1rdG1wIC1vICRAICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCi0uRUxTRQotJSRPOiAlJEEgOyAkKEFTKSBAJChta3RtcCAkKEFTRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgcmVzb3VyY2UgZmlsZXMKLSUkUjogJS5yYyA7ICQoUkMpICQoUkNGTEFHUykgLXIgJDwKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIERMTCB1c2luZyBhIHJlc3BvbnNlIGZpbGUKLS5JRiAkKFVTRV9PUzJHVUkpCi0lJEQ6IDsgcmNsaW5rICQoTEQpICQoUkMpICRAICQobWt0bXAgJChMREZMQUdTKSAkKCY6dCIrXG4iOnMvXC9cXClcbiRAXG4kKi5tYXBcbiQoRVhFTElCUykgJChQTUxJQilcbiQqLmRlZlxuKQotLkVMU0UKLSUkRDogOyAkKExEKSAvbm9mcmVlIC9ub2wgQCQobWt0bXAgJChMREZMQUdTKSAkKCY6dCIrXG4iOnMvXC9cXClcbiRAXG4kKi5tYXBcbiQoRVhFTElCUykgJChQTUxJQilcbiQqLmRlZlxuKQotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotLklGICQoQlVJTERfRExMKQotJSRMOiA7ICQoSUxJQikgJChJTElCRkxBR1MpIC9vdXQ6JEAgJD8KLS5FTElGICQoSU1QT1JUX0RMTCkKLSUkTDogOyAkKElMSUIpICQoSUxJQkZMQUdTKSAvb3V0OiRAICQ/Ci0uRUxTRQotJSRMOiA7ICQoTElCKSAkKExJQkZMQUdTKSAvbm93YXJuOjg2IC9vdXQ6JEAgQCQobWt0bXAgJCg/OnQiXG4iOnMvXC9cXCkpCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotLklGICQoVVNFX09TMkdVSSkKLSUkRTogOwotCXJjbGluayAkKExEKSAkKFJDKSAkQCAkKG1rdG1wICQoTERGTEFHUykgJCgmOnQiK1xuIjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKEVYRUxJQlMpICQoUE1MSUIpXG4kKi5kZWZcbikKLS5JRiAkKExYTElURSkKLQlseGxpdGUgJEAKLS5FTkRJRgotLkVMU0UKLSUkRTogOwotCXJjbGluayAkKExEKSAkKFJDKSAkQCAkKG1rdG1wICQoTERGTEFHUykgJCgmOnQiK1xuIjpzL1wvXFwpXG4kQFxuJCoubWFwXG4kKEVYRUxJQlMpICQoUE1MSUIpXG5cbikKLS5JRiAkKExYTElURSkKLQlseGxpdGUgJEAKLS5FTkRJRgotLkVORElGCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3ZjMTYubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3ZjMTYubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZmMyNzAuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy92YzE2Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRha2Ugb3V0IFBNTElCIGlmIHdlIGRvbid0IG5lZWQgdG8gbGluayB3aXRoIGl0Ci0KLS5JRiAkKE5PX1BNTElCKQotUE1MSUIgOj0KLS5FTkRJRgotCi0jIEltcGxpY2l0IGdlbmVyYXRpb24gcnVsZXMgZm9yIG1ha2luZyBvYmplY3QgZmlsZXMKLSUkTzogJS5jIDsgJChDQykgL25vbG9nbyAkKENGTEFHUykgL2MgJDwKLSUkTzogJSRQIDsgJChDQykgL25vbG9nbyAkKENGTEFHUykgL2MgJDwKLSUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgJChBU0ZMQUdTKSkgJCg8OnMsLyxcKQotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIHJlc291cmNlIGZpbGVzCi0lJFI6ICUucmMgOyAkKFJDKSAkKFJDRkxBR1MpIC1yICQ8Ci0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBETEwgdXNpbmcgYSByZXNwb25zZSBmaWxlCi0lJEQ6IDsgcmNsaW5rICQoTEQpICQoUkMpICRAICQobWt0bXAgJChMREZMQUdTKSAtZSRAXG4kKCY6dCJcbiI6cy9cL1xcKVxuJChFWEVMSUJTKSkKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIGxpYnJhcnkgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCi0uSUYgJChCVUlMRF9ETEwpCi0lJEw6IDsKLSAgICBAJChSTSkgJEAKLSAgICAkKElMSUIpICQoSUxJQkZMQUdTKSAkQCAkPwotLkVMSUYgJChJTVBPUlRfRExMKQotJSRMOiA7Ci0gICAgQCQoUk0pICRACi0gICAgJChJTElCKSAkKElMSUJGTEFHUykgJEAgJD8KLS5FTFNFCi0lJEw6IDsKLSAgICBAJChSTSkgJEAKLSAgICAkKExJQikgJEAgL25vbG9nbyAkKExJQkZMQUdTKSBAJChta3RtcCArJCgmOnQiICZcbisiKSAmXG4sXG4pCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhbiBleGVjdXRhYmxlIGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotLklGICQoVVNFX1dJTjE2KQotJSRFOiA7IHJjbGluayAkKExEKSAkKFJDKSAkQCAkKG1rdG1wICQoTERGTEFHUykgL0ZlJEAgJCgmOnMvXC9cXCkgJChFWEVMSUJTKSkKLSMlJEU6IDsgJChMRCkgQCQobWt0bXAgJChMREZMQUdTKSAvRmUkQCAkKCY6cy9cL1xcKSAkKEVYRUxJQlMpKQotLkVMU0UKLSUkRTogOyAkKExEKSBAJChta3RtcCAkKExERkxBR1MpIC9GZSRAICQoJjpzL1wvXFwpICQoUE1MSUIpICQoRVhFTElCUykpCi0uRU5ESUYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvdmMzMi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvdmMzMi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdmMWEwYy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3J1bGVzL3ZjMzIubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBSdWxlcyBtYWtlZmlsZSBkZWZpbml0aW9ucywgd2hpY2ggZGVmaW5lIHRoZSBydWxlcyB1c2VkIHRvCi0jCQkJCWJ1aWxkIHRhcmdldHMuIFdlIGluY2x1ZGUgdGhlbSBoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCi0jCQkJCW1ha2VmaWxlIHNvIHRoZSBnZW5lcmljIHByb2plY3QgbWFrZWZpbGVzIGNhbiBvdmVycmlkZQotIwkJCQljZXJ0YWluIHRoaW5ncyB3aXRoIG1hY3JvcyAoc3VjaCBhcyBsaW5raW5nIEMrKyBwcm9ncmFtcwotIwkJCQlkaWZmZXJlbnRseSkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFR1cm4gb24gcHJlLWNvbXBpbGVkIGhlYWRlcnMgYXMgbmVjY2Vzc2FyeQotLklGICQoUFJFQ09NUF9IRFIpCi0gICBDRkxBR1MgICAgICAgKz0gLVlYIiQoUFJFQ09NUF9IRFIpIgotLkVORElGCi0KLSMgVHVybiBvbiBydW50aW1lIHR5cGUgaW5mb3JtYXRpb24gYXMgbmVjZXNzYXJ5Ci0uSUYgJChVU0VfUlRUSSkKLQlDRkxBR1MJCSs9IC9HUgotLkVORElGCi0KLSMgVHVybiBvbiBDKysgZXhjZXB0aW9uIGhhbmRsaW5nIGFzIG5lY2Vzc2FyeQotLklGICQoVVNFX0NQUEVYQ0VQVCkKLQlDRkxBR1MJCSs9IC9HWAotLkVORElGCi0KLSMgVGFrZSBvdXQgUE1MSUIgaWYgd2UgZG9uJ3QgbmVlZCB0byBsaW5rIHdpdGggaXQKLQotLklGICQoTk9fUE1MSUIpCi1QTUxJQiA6PQotLkVORElGCi0KLSMgSW1wbGljaXQgZ2VuZXJhdGlvbiBydWxlcyBmb3IgbWFraW5nIG9iamVjdCBmaWxlcwotJSRPOiAlLmMgOyAkKENDKSAvbm9sb2dvIEAkKG1rdG1wICQoQ0ZMQUdTOnMvXC9cXCkpIC9jICQoPDpzLC8sXCkKLSUkTzogJSRQIDsgJChDQykgL25vbG9nbyBAJChta3RtcCAkKENGTEFHUzpzL1wvXFwpKSAvYyAkKDw6cywvLFwpCi0uSUYgJChVU0VfTkFTTSkKLSUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgLW8gJEAgJChBU0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKLS5FTFNFCi0lJE86ICUkQSA7ICQoQVMpIEAkKG1rdG1wICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyByZXNvdXJjZSBmaWxlcwotJSRSOiAlLnJjIDsgJChSQykgJChSQ0ZMQUdTKSAtciAkPAotCi0jIEltcGxpY2l0IHJ1bGVzIGZvciBidWlsZGluZyBOVCBkZXZpY2UgZHJpdmVycwotCi0lLnN5czogOwotCSQoTEQpIC9ub2xvZ28gQCQobWt0bXAgJChMREZMQUdTKSAvRmUkQCAkKCY6dCJcbiJzL1wvXFwpICQoUE1MSUIpICQoRVhFTElCUykgJChERUZfTElCUykgJChMREVOREZMQUdTKSkKLS5JRiAkKERCRykKLS5JRiAkKFVTRV9TT0ZUSUNFKQotCSQoTk1TWU0pICQoTk1TWU1GTEFHUyk7JChTSV9TT1VSQ0UpICRACi0uRU5ESUYKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgRExMIHVzaW5nIGEgcmVzcG9uc2UgZmlsZQotLklGICQoSU1QT1JUX0RMTCkKLS5FTFNFCi0uSUYgJChOT19SVU5USU1FKQotJSREOiA7ICQoTEQpIC9ub2xvZ28gQCQobWt0bXAgJChMREZMQUdTKSAvRmUkQCAkKCY6dCJcbiJzL1wvXFwpICQoRVhFTElCUykgJChERUZfTElCUykgJChMREVOREZMQUdTKSkKLS5FTFNFCi0lJEQ6IDsKLQltYWtlZGVmIC12ICQqCi0JJChMRCkgL25vbG9nbyBAJChta3RtcCAkKExERkxBR1MpIC9GZSRAICQoJjp0IlxuInMvXC9cXCkgJChQTUxJQikgJChFWEVMSUJTKSAkKERFRl9MSUJTKSAkKExERU5ERkxBR1MpKQotLklGICQoREJHKQotLklGICQoVVNFX1NPRlRJQ0UpCi0JJChOTVNZTSkgJChOTVNZTUZMQUdTKTskKFNJX1NPVVJDRSkgJEAKLS5FTkRJRgotLkVORElGCi0uRU5ESUYKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUuIE5vdGUgdGhhdAotIyB3ZSB1c2UgYSBzcGVjaWFsIC5WQ0QgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBFWFBPUlQgZGVmaW5pdGlvbnMgZm9yIHRoZQotIyBNaWNyb3NvZnQgY29tcGlsZXIsIHNpbmNlIHRoZSBMSUIgdXRpbGl0eSBhdXRvbWF0aWNhbGx5IGFkZHMgbGVhZGluZwotIyB1bmRlcnNjb3JlcyB0byBleHBvcnRlZCBmdW5jdGlvbnMuCi0uSUYgJChJTVBPUlRfRExMKQotJSRMOiA7Ci0JbWFrZWRlZiAtdiAkKD86YikKLSAgICBAJChSTSkgJEAKLQkkKElMSUIpICQoSUxJQkZMQUdTKSAvREVGOiQoPzpiKS5kZWYgL09VVDokQAotLkVMU0UKLSUkTDogOwotICAgIEAkKFJNKSAkQAotICAgICQoTElCKSAkKExJQkZMQUdTKSAvb3V0OiRAIEAkKG1rdG1wICQoJjp0IlxuIilcbikKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCi0uSUYgJChVU0VfV0lOMzIpCi0lJEU6IDsKLQkkKExEKSAvbm9sb2dvIEAkKG1rdG1wICQoTERGTEFHUykgL0ZlJEAgJCgmOnQiXG4icy9cL1xcKSAkKFBNTElCKSAkKEVYRUxJQlMpICQoREVGX0xJQlMpICQoTERFTkRGTEFHUykpCi0uSUYgJChEQkcpCi0uSUYgJChVU0VfU09GVElDRSkKLQkkKE5NU1lNKSAkKE5NU1lNRkxBR1MpOyQoU0lfU09VUkNFKSAkQAotLkVORElGCi0uRU5ESUYKLS5FTFNFCi0lJEU6IDsKLQlAJChMRCkgL25vbG9nbyBAJChta3RtcCAkKExERkxBR1MpIC9GZSRAICQoJjp0IlxuInMvXC9cXCkgJChQTUxJQikgJChFWEVMSUJTKSAkKERFRl9MSUJTKSAkKExERU5ERkxBR1MpKQotLklGICQoRE9TU1RZTEUpCi0JQG1hcmtwaGFyICRACi0uRU5ESUYKLS5FTkRJRgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy93YzE2Lm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy93YzE2Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWNhOTE3Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvd2MxNi5taworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgUnVsZXMgbWFrZWZpbGUgZGVmaW5pdGlvbnMsIHdoaWNoIGRlZmluZSB0aGUgcnVsZXMgdXNlZCB0bwotIwkJCQlidWlsZCB0YXJnZXRzLiBXZSBpbmNsdWRlIHRoZW0gaGVyZSBhdCB0aGUgZW5kIG9mIHRoZQotIwkJCQltYWtlZmlsZSBzbyB0aGUgZ2VuZXJpYyBwcm9qZWN0IG1ha2VmaWxlcyBjYW4gb3ZlcnJpZGUKLSMJCQkJY2VydGFpbiB0aGluZ3Mgd2l0aCBtYWNyb3MgKHN1Y2ggYXMgbGlua2luZyBDKysgcHJvZ3JhbXMKLSMJCQkJZGlmZmVyZW50bHkpLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBUYWtlIG91dCBQTUxJQiBpZiB3ZSBkb24ndCBuZWVkIHRvIGxpbmsgd2l0aCBpdAotCi0uSUYgJChOT19QTUxJQikKLVBNTElCIDo9Ci0uRU5ESUYKLQotIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzCi0lJE86ICUuYyA7ICQoQ0MpIEAkKG1rdG1wICQoQ0ZMQUdTKSkgJDwKLSUkTzogJSRQIDsgJChDUFApIEAkKG1rdG1wICQoQ0ZMQUdTKSkgJDwKLSUkTzogJSRBIDsgJChBUykgQCQobWt0bXAgJChBU0ZMQUdTKSkgJCg8OnMsLyxcKQotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIHJlc291cmNlIGZpbGVzCi0lJFI6ICUucmMgOyAkKFJDKSAkKFJDRkxBR1MpIC1yICQ8Ci0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYSBsaWJyYXJ5IGZpbGUgdXNpbmcgcmVzcG9uc2UgZmlsZQotLklGICQoQlVJTERfRExMKQotJSRMOiA7Ci0gICAgQCQoUk0pICRACi0gICAgJChJTElCKSAkKElMSUJGTEFHUykgJEAgKyQ/Ci0uRUxJRiAkKElNUE9SVF9ETEwpCi0lJEw6IDsKLSAgICBAJChSTSkgJEAKLSAgICAkKElMSUIpICQoSUxJQkZMQUdTKSAkQCArJD8KLS5FTFNFCi0lJEw6IDsKLSAgICBAJChSTSkgJEAKLSAgICAkKExJQikgJChMSUJGTEFHUykgJEAgQCQobWt0bXAsJCoucnNwICskKCY6dCJcbisiOnMvXC9cXClcbikKLS5FTkRJRgotCi0jIEltcGxpY2l0IHJ1bGUgZm9yIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCi0uSUYgJChVU0VfV0lOMTYpCi0uSUYgJChCVUlMRF9ETEwpCi0lJEU6IDsKLQlAdHJpbWxpYiAkKG1rdG1wICQoTERGTEFHUykgT1AgcXVpZXQgU1lTIHdpbmRvd3NfZGxsXG5OICRAXG5GICQoJjp0IiwiOnMvXC9cXClcbkxJQlIgJChFWEVMSUJTOnQiLCIpKSAkKi5sbmsKLQlyY2xpbmsgJChMRCkgJChSQykgJEAgJCoubG5rCi0JQCQoUk0pIC1TICQobWt0bXAgJCoubG5rKQotLkVMU0UKLSUkRTogOwotCUB0cmltbGliICQobWt0bXAgJChMREZMQUdTKSBPUCBxdWlldCBTWVMgd2luZG93c1xuTiAkQFxuRiAkKCY6dCIsIjpzL1wvXFwpXG5MSUJSICQoRVhFTElCUzp0IiwiKSkgJCoubG5rCi0JcmNsaW5rICQoTEQpICQoUkMpICRAICQqLmxuawotCUAkKFJNKSAtUyAkKG1rdG1wICQqLmxuaykKLS5FTkRJRgotLkVMU0UKLSUkRTogOwotCUB0cmltbGliICQobWt0bXAgT1AgcXVpZXRcbk4gJEBcbkYgJCgmOnQiLCI6cy9cL1xcKVxuTElCUiAkKFBNTElCKSAkKEVYRUxJQlM6dCIsIikpICQqLmxuawotCSQoTEQpICQoTERGTEFHUykgQCQqLmxuawotCUAkKFJNKSAtUyAkKG1rdG1wICQqLmxuaykKLS5FTkRJRgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy93YzMyLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9ydWxlcy93YzMyLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWI4ODE5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvcnVsZXMvd2MzMi5taworKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIFJ1bGVzIG1ha2VmaWxlIGRlZmluaXRpb25zLCB3aGljaCBkZWZpbmUgdGhlIHJ1bGVzIHVzZWQgdG8KLSMJCQkJYnVpbGQgdGFyZ2V0cy4gV2UgaW5jbHVkZSB0aGVtIGhlcmUgYXQgdGhlIGVuZCBvZiB0aGUKLSMJCQkJbWFrZWZpbGUgc28gdGhlIGdlbmVyaWMgcHJvamVjdCBtYWtlZmlsZXMgY2FuIG92ZXJyaWRlCi0jCQkJCWNlcnRhaW4gdGhpbmdzIHdpdGggbWFjcm9zIChzdWNoIGFzIGxpbmtpbmcgQysrIHByb2dyYW1zCi0jCQkJCWRpZmZlcmVudGx5KS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgVGFrZSBvdXQgUE1MSUIgaWYgd2UgZG9uJ3QgbmVlZCB0byBsaW5rIHdpdGggaXQKLQotLklGICQoTk9fUE1MSUIpCi1QTUxJQiA6PQotLkVORElGCi0KLSMgVXNlIGEgbGFyZ2VyIHN0YWNrIGR1cmluZyBsaW5raW5nIGlmIHJlcXVlc3RlZCwgb3IgdXNlIGEgZGVmYXVsdCBzdGFjawotIyBvZiAyMDBrLiBUaGUgdXN1YWwgZGVmYXVsdCBzdGFjayBwcm92aWRlZCBieSBXYXRjb20gQysrIGlzICp3YXkqIHRvIHNtYWxsCi0jIGZvciByZWFsIDMyIGJpdCBjb2RlIGRldmVsb3BtZW50LiBXZSBhbHNvIG5lZWQgYSAqaHVnZSogc3RhY2sgZm9yIE9wZW5HTAotIyBzb2Z0d2FyZSByZW5kZXJpbmcgYWxzbyEKLS5JRiAkKFVTRV9RTlg0KQotICAgICMgTm90IG5lY2Vzc2FyeSBmb3IgUU5YIGNvZGUuCi0uRUxTRQotLklGICQoU1RLU0laRSkKLSAgICBMREZMQUdTCQkrPSBPUCBTVEFDSz0kKFNUS1NJWkUpCi0uRUxTRQotCUxERkxBR1MJCSs9IE9QIFNUQUNLPTIwNDgwMAotLkVORElGCi0uRU5ESUYKLQotIyBUdXJuIG9uIHJ1bnRpbWUgdHlwZSBpbmZvcm1hdGlvbiBhcyBuZWNlc3NhcnkKLS5JRiAkKFVTRV9SVFRJKQotCUNQRkxBR1MJCSs9IC14cgotLkVORElGCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIHByZS1jb21waWxlZCBoZWFkZXJzCi0uSUYgJChQUkVDT01QX0hEUikKLQlDRkxBR1MJCSs9IC1maHEKLS5FTkRJRgotCi0uSUYgJChVU0VfUU5YKQotIyBXaGV0aGVyIHRvIGxpbmsgaW4gcmVhbCBWQklPUyBsaWJyYXJ5LCBvciBqdXN0IHRoZSBzdHViIGxpYnJhcnkKLS5JRiAkKFVTRV9CSU9TKQotVkJJT1NMSUIgOj0gdmJpb3MubGliLAotLkVMU0UKLVZCSU9TTElCIDo9IHZic3R1YnMubGliLAotLkVORAotIyBSZXF1aXJlIHNwZWNpYWwgcHJpdmxlZGdlcyBmb3IgTnVjbGV1cyBwcm9ncmFtcyAocmVxdWlyZXMgcm9vdCBhY2Nlc3MpCi0uSUYgJChVU0VfTlVDTEVVUykKLUxERkxBR1MJCSs9IE9QIFBSSVY9MQotLkVORElGCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBnZW5lcmF0aW9uIHJ1bGVzIGZvciBtYWtpbmcgb2JqZWN0IGZpbGVzCi0uSUYgJChXQ19MSUJCQVNFKSA9PSBXQzEwQQotJSRPOiAlLmMgOyAkKENDKSAkKENGTEFHUykgJCg8OnMsLyxcKQotJSRPOiAlJFAgOyAkKENQUCkgJChDRkxBR1MpICQoPDpzLC8sXCkKLS5FTFNFCi0lJE86ICUuYyA7ICQoQ0MpIEAkKG1rdG1wICQoQ0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKLSUkTzogJSRQIDsgJChDUFApIEAkKG1rdG1wICQoQ1BGTEFHUzpzL1wvXFwpICQoQ0ZMQUdTOnMvXC9cXCkpICQoPDpzLC8sXCkKLS5FTkRJRgotLklGICQoVVNFX05BU00pCi0lJE86ICUkQSA7ICQoQVMpIEAkKG1rdG1wIC1vICRAICQoQVNGTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCi0uRUxTRQotJSRPOiAlJEEgOyAkKEFTKSBAJChta3RtcCAkKEFTRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQotLkVORElGCi0KLSMgSW1wbGl0IHJ1bGUgdG8gY29tcGlsZSAuUyBhc3NlbWJsZXIgZmlsZXMuIFRoZSBmaXJzdCB2ZXJzaW9uCi0jIHVzZXMgR0FTIGRpcmVjdGx5IGFuZCB0aGUgc2Vjb25kIHVzZXMgYSBwcmUtcHJvY2Vzc29yIHRvCi0jIHByb2R1Y2UgTkFTTSBjb2RlLgotCi0uSUYgJChVU0VfR0FTKQotLklGICQoV0NfTElCQkFTRSkgPT0gV0MxMQotJSRPOiAlJFMgOyAkKEdBUykgLWMgQCQobWt0bXAgJChHQVNfRkxBR1M6cy9cL1xcKSkgJCg8OnMsLyxcKQotLkVMU0UKLSMgQmxhY2sgbWFnaWMgdG8gYnVpbGQgYXNtIHNvdXJjZXMgd2l0aCBXYXRjb20gMTAuNiAocmVxdWlyZXMgc2VkKQotJSRPOiAlJFMgOwotCSQoR0FTKSAtYyBAJChta3RtcCAkKEdBU19GTEFHUzpzL1wvXFwpKSAkKDw6cywvLFwpCi0Jd2Rpc2FzbSBcXCAtYSAkKCo6cywvLFwpLm8gPiAkKCo6cywvLFwpLmxzdAotCXNlZCAtZSAicy9cLnRleHQvX1RFWFQvOyBzL1wuZGF0YS9fREFUQS87IHMvXC5ic3MvX0JTUy87IHMvXC4zODYvXC41ODYvOyBzL2xhciAqZWN4LGN4L2xhciBlY3gsZWN4LyIgJCgqOnMsLyxcKS5sc3QgPiAkKCo6cywvLFwpLmFzbQotCXdhc20gXFwgJChXRkxBR1MpIC16cSAtZnI9bnVsIC1mcDMgLWZvPSRAICQoKjpzLC8sXCkuYXNtCi0JJChSTSkgLVMgJChta3RtcCAkKCo6cywvLFwpLm8pCi0JJChSTSkgLVMgJChta3RtcCAkKCo6cywvLFwpLmxzdCkKLQkkKFJNKSAtUyAkKG1rdG1wICQoKjpzLC8sXCkuYXNtKQotLkVORElGCi0uRUxTRQotJSRPOiAlJFMgOwotCUBnY3BwIC1ETkFTTV9BU1NFTUJMRVIgLURfX1dBVENPTUNfXyAtRVAgJCg8OnMsLyxcKSA+ICQoKjpzLC8sXCkuYXNtCi0JbmFzbSBAJChta3RtcCAtZiBvYmogLW8gJEApICQoKjpzLC8sXCkuYXNtCi0JQCQoUk0pIC1TICQobWt0bXAgJCgqOnMsLyxcKS5hc20pCi0uRU5ESUYKLQotIyBTcGVjaWFsIHRhcmdldCB0byBidWlsZCBkbGxzdGFydC5hc20gdXNpbmcgQm9ybGFuZCBUQVNNCi1kbGxzdGFydC5vYmo6IGRsbHN0YXJ0LmFzbQotCSQoRExMX1RBU00pIEAkKG1rdG1wIC90IC9teCAvbSAvRF9fRkxBVF9fIC9pJChTQ0lURUNIKVxJTkNMVURFIC9xKSAkKFBSSVZBVEUpXHNyY1xjb21tb25cZGxsc3RhcnQuYXNtCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgcmVzb3VyY2UgZmlsZXMKLSUkUjogJS5yYyA7ICQoUkMpICQoUkNGTEFHUykgLXIgJDwKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIERMTCB1c2luZyBhIHJlc3BvbnNlIGZpbGUKLS5JRiAkKElNUE9SVF9ETEwpCi0uRUxTRQotLklGICQoVVNFX09TMjMyKQotJSREOiA7Ci0JQHRyaW1saWIgJChta3RtcCAkKExERkxBR1MpIE9QIHF1aWV0IFNZUyBvczJ2MiBkbGxcbk4gJEBcbkYgJCgmOnQiLFxuIjpzL1wvXFwpXG5MSUJSICQoRVhFTElCUzp0IiwiKSkgJCoubG5rCi0JcmNsaW5rICQoTEQpICQoUkMpICRAICQqLmxuawotLklGICQoTEVBVkVfTElOS0ZJTEUpCi0uRUxTRQotCUAkKFJNKSAtUyAkKG1rdG1wICoubG5rKQotLkVORElGCi0uRUxJRiAkKFVTRV9XSU4zMikKLSUkRDogOwotCUB0cmltbGliICQobWt0bXAgJChMREZMQUdTKSBPUCBxdWlldCBTWVMgbnRfZGxsXG5OICRAXG5GICQoJjp0IixcbiI6cy9cL1xcKVxuTElCUiAkKFBNTElCKSQoREVGTElCUykkKEVYRUxJQlM6dCIsIikpICQqLmxuawotCXJjbGluayAkKExEKSAkKFJDKSAkQCAkKi5sbmsKLS5JRiAkKExFQVZFX0xJTktGSUxFKQotLkVMU0UKLQlAJChSTSkgLVMgJChta3RtcCAqLmxuaykKLS5FTkRJRgotLkVMU0UKLSUkRDogOwotCUB0cmltbGliICQobWt0bXAgJChMREZMQUdTKSBPUCBxdWlldCBTWVMgd2luMzg2XG5OICQqLnJleFxuRiAkKCY6dCIsXG4iOnMvXC9cXClcbkxJQlIgJChFWEVMSUJTOnQiLCIpKSAkKi5sbmsKLQlyY2xpbmsgJChMRCkgJChSQykgJEAgJCoubG5rCi0Jd2JpbmQgJCogLWQgLXEgLW4KLS5JRiAkKExFQVZFX0xJTktGSUxFKQotLkVMU0UKLQlAJChSTSkgLVMgJChta3RtcCAqLmxuaykKLS5FTkRJRgotLkVORElGCi0uRU5ESUYKLQotIyBJbXBsaWNpdCBydWxlIGZvciBidWlsZGluZyBhIGxpYnJhcnkgZmlsZSB1c2luZyByZXNwb25zZSBmaWxlCi0uSUYgJChCVUlMRF9ETEwpCi0lJEw6IDsKLQlAJChSTSkgJEAKLQkkKElMSUIpICQoSUxJQkZMQUdTKSAkQCArJD8KLS5FTElGICQoSU1QT1JUX0RMTCkKLSUkTDogOwotCUAkKFJNKSAkQAotCSQoSUxJQikgJChJTElCRkxBR1MpICRAICskPwotLkVMU0UKLSUkTDogOwotICAgIEAkKFJNKSAkQAotICAgICQoTElCKSAkKExJQkZMQUdTKSAkQCBAJChta3RtcCwkKi5yc3AgKyQoJjp0IlxuKyI6cy9cL1xcKVxuKQotLkVORElGCi0KLSMgSW1wbGljaXQgcnVsZSBmb3IgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmaWxlIHVzaW5nIHJlc3BvbnNlIGZpbGUKLS5JRiAkKFVTRV9YMzIpCi0lJEU6IDsKLQlAdHJpbWxpYiAkKG1rdG1wIE9QIHF1aWV0XG5OICRAXG5GICQoJjp0IiwiOnMvXC9cXClcbkxJQlIgJChQTUxJQikkKEVYRUxJQlM6dCIsIikpICQqLmxuawotCSQoTEQpICQoTERGTEFHUykgQCQqLmxuawotCXgzMmZpeCAkQAotLklGICQoTEVBVkVfTElOS0ZJTEUpCi0uRUxTRQotCUAkKFJNKSAtUyAkKG1rdG1wICoubG5rKQotLkVORElGCi0uRUxJRiAkKFVTRV9PUzIzMikKLS5JRiAkKFVTRV9PUzJHVUkpCi0lJEU6IDsKLQlAdHJpbWxpYiAkKG1rdG1wICQoTERGTEFHUykgT1AgcXVpZXQgU1lTIG9zMnYyX3BtXG5OICRAXG5GICQoJjp0IiwiOnMvXC9cXClcbkxJQlIgJChQTUxJQikkKEVYRUxJQlM6dCIsIikpICQqLmxuawotCXJjbGluayAkKExEKSAkKFJDKSAkQCAkKi5sbmsKLS5JRiAkKExFQVZFX0xJTktGSUxFKQotLkVMU0UKLQlAJChSTSkgLVMgJChta3RtcCAqLmxuaykKLS5FTkRJRgotLklGICQoTFhMSVRFKQotIAlseGxpdGUgJEAKLS5FTkRJRgotLkVMU0UKLSUkRTogOwotCUB0cmltbGliICQobWt0bXAgJChMREZMQUdTKSBPUCBxdWlldCBTWVMgb3MydjJcbk4gJEBcbkYgJCgmOnQiLCI6cy9cL1xcKVxuTElCUiAkKFBNTElCKSQoRVhFTElCUzp0IiwiKSkgJCoubG5rCi0JcmNsaW5rICQoTEQpICQoUkMpICRAICQqLmxuawotLklGICQoTEVBVkVfTElOS0ZJTEUpCi0uRUxTRQotCUAkKFJNKSAtUyAkKG1rdG1wICoubG5rKQotLkVORElGCi0uSUYgJChMWExJVEUpCi0gCWx4bGl0ZSAkQAotLkVORElGCi0uRU5ESUYKLS5FTElGICQoVVNFX1NOQVApCi0lJEU6IDsKLQlAdHJpbWxpYiAkKG1rdG1wICQoTERGTEFHUykgT1AgcXVpZXQgU1lTIG50XG5OICRAXG5GICQoJjp0IiwiOnMvXC9cXClcbkxJQlIgJChERUZMSUJTKSQoRVhFTElCUzp0IiwiKSkgJCoubG5rCi0JcmNsaW5rICQoTEQpICQoUkMpICRAICQqLmxuawotLklGICQoTEVBVkVfTElOS0ZJTEUpCi0uRUxTRQotCUAkKFJNKSAtUyAkKG1rdG1wICoubG5rKQotLkVORElGCi0uRUxJRiAkKFVTRV9XSU4zMikKLS5JRiAkKFdJTjMyX0dVSSkKLSUkRTogOwotCUB0cmltbGliICQobWt0bXAgJChMREZMQUdTKSBPUCBxdWlldCBTWVMgd2luOTVcbk4gJEBcbkYgJCgmOnQiLCI6cy9cL1xcKVxuTElCUiAkKFBNTElCKSQoREVGTElCUykkKEVYRUxJQlM6dCIsIikpICQqLmxuawotCXJjbGluayAkKExEKSAkKFJDKSAkQCAkKi5sbmsKLS5JRiAkKExFQVZFX0xJTktGSUxFKQotLkVMU0UKLQlAJChSTSkgLVMgJChta3RtcCAqLmxuaykKLS5FTkRJRgotLkVMU0UKLSUkRTogOwotCUB0cmltbGliICQobWt0bXAgJChMREZMQUdTKSBPUCBxdWlldCBTWVMgbnRcbk4gJEBcbkYgJCgmOnQiLCI6cy9cL1xcKVxuTElCUiAkKFBNTElCKSQoREVGTElCUykkKEVYRUxJQlM6dCIsIikpICQqLmxuawotCXJjbGluayAkKExEKSAkKFJDKSAkQCAkKi5sbmsKLS5JRiAkKExFQVZFX0xJTktGSUxFKQotLkVMU0UKLQlAJChSTSkgLVMgJChta3RtcCAqLmxuaykKLS5FTkRJRgotLkVORElGCi0uRUxJRiAkKFVTRV9XSU4zODYpCi0lJEU6IDsKLQlAdHJpbWxpYiAkKG1rdG1wICQoTERGTEFHUykgT1AgcXVpZXQgU1lTIHdpbjM4NlxuTiAkKi5yZXhcbkYgJCgmOnQiLCI6cy9cL1xcKVxuTElCUiAkKFBNTElCKSQoRVhFTElCUzp0IiwiKSkgJCoubG5rCi0JcmNsaW5rICQoTEQpIHdiaW5kICQqLnJleCAkKi5sbmsKLS5JRiAkKExFQVZFX0xJTktGSUxFKQotLkVMU0UKLQlAJChSTSkgLVMgJChta3RtcCAqLmxuaykKLS5FTkRJRgotLkVMSUYgJChVU0VfVE5UKQotJSRFOiA7Ci0JQHRyaW1saWIgJChta3RtcCAkKExERkxBR1MpIE9QIHF1aWV0XG5OICRAXG5GICQoJjp0IiwiOnMvXC9cXClcbkxJQlIgZG9zeDMyLmxpYix0bnRhcGkubGliLCQoUE1MSUIpJChFWEVMSUJTOnQiLCIpKSAkKi5sbmsKLQkkKExEKSBAJCoubG5rCi0uSUYgJChMRUFWRV9MSU5LRklMRSkKLS5FTFNFCi0JQCQoUk0pIC1TICQobWt0bXAgKi5sbmspCi0uRU5ESUYKLS5JRiAkKERPU1NUWUxFKQotCUBtYXJrcGhhciAkQAotLkVORElGCi0uRUxJRiAkKFVTRV9RTlg0KQotJSRFOiA7Ci0JQHRyaW1saWIgJChta3RtcCAkKExERkxBR1MpIE9QIHF1aWV0XG5OICRAXG5GICQoJjp0IiwiOnMvXC9cXClcbkxJQlIgJChQTUxJQikkKFZCSU9TTElCKSQoRVhFTElCUzp0IiwiKSkgJCoubG5rCi0JQCtpZiBleGlzdCAkKi5leGUgYXR0cmliIC1zICQqLmV4ZSA+IE5VTAotCSQoTEQpIEAkKi5sbmsKLQlAYXR0cmliICtzICQqLmV4ZQotLklGICQoTEVBVkVfTElOS0ZJTEUpCi0uRUxTRQotCUAkKFJNKSAtUyAkKG1rdG1wICoubG5rKQotLkVORElGCi0uRUxTRQotJSRFOiA7Ci0JQHRyaW1saWIgJChta3RtcCAkKExERkxBR1MpIE9QIHF1aWV0XG5OICRAXG5GICQoJjp0IiwiOnMvXC9cXClcbkxJQlIgJChQTUxJQikkKEVYRUxJQlM6dCIsIikpICQqLmxuawotCSQoTEQpIEAkKi5sbmsKLS5JRiAkKExFQVZFX0xJTktGSUxFKQotLkVMU0UKLQlAJChSTSkgLVMgJChta3RtcCAqLmxuaykKLS5FTkRJRgotLkVORElGCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3NjMTYubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3NjMTYubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5OWFkNDUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9zYzE2Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKLSMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAotIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCi0jICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KLSMKLSMgICAgICAgICAgICAgICBTeW1hbnRlYyBDKysgNi54LzcueCAxNiBiaXQgdmVyc2lvbi4gU3VwcG9ydHMgMTYgYml0IERPUwotIyAgICAgICAgICAgICAgIGFuZCAxNiBiaXQgV2luZG93cyBkZXZlbG9wbWVudC4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgSW5jbHVkZSBzdGFuZGFyZCBzdGFydHVwIHNjcmlwdCBkZWZpbml0aW9ucwotLklNUE9SVDogU0NJVEVDSAotLklOQ0xVREU6ICIkKFNDSVRFQ0gpXG1ha2VkZWZzXHN0YXJ0dXAubWsiCi0KLSMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZQotLklNUE9SVCAuSUdOT1JFIDogU0NfTElCQkFTRQotCi0jIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcKLSAgIENDICAgICAgICAgICA6PSBzYyAgICAgICAjIEMtY29tcGlsZXIgYW5kIGZsYWdzCi0gICBDRkxBR1MgICAgICAgOj0gLW1sIC1KbQotLklGICQoVVNFX1RBU00zMikKLSAgIEFTICAgICAgICAgICA6PSB0YXNtMzIKLS5FTElGICQoVVNFX1RBU01YKQotICAgQVMgICAgICAgICAgIDo9IHRhc214ICAgICMgQXNzZW1ibGVyIGFuZCBmbGFncwotLkVMU0UKLSAgIEFTICAgICAgICAgICA6PSB0YXNtICAgICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKLS5FTkRJRgotICAgQVNGTEFHUyAgICAgIDo9IC90IC9teCAvbSAvRF9fQ09NTV9fIC9pSU5DTFVERSAvaSQoU0NJVEVDSClcSU5DTFVERQotICAgTEQgICAgICAgICAgIDo9IHNjICAgICAgICMgTG9hZGVyIGFuZCBmbGFncwotICAgTERGTEFHUyAgICAgICA9ICQoQ0ZMQUdTKQotICAgUkMgICAgICAgICAgIDo9IHJjYyAgICAgICMgV0luZG93cyByZXNvdXJjZSBjb21waWxlcgotICAgUkNGTEFHUyAgICAgIDo9ICAgICAgICAgICMgTWFyayBhcyBXaW4zMiBjb21wYXRpYmxlIHJlc291cmNlcwotICAgTElCICAgICAgICAgIDo9IGxpYiAgICAgICMgTGlicmFyaWFuCi0gICBMSUJGTEFHUyAgICAgOj0gL04gL0IKLSAgIElMSUIgICAgICAgICA6PSBpbXBsaWIgICAjIEltcG9ydCBsaWJyYXJpYW4KLSAgIElMSUJGTEFHUyAgICA6PQotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLS5JRiAkKERCRykKLSAgIENGTEFHUyAgICAgICArPSAtZyAgICAgICAjIFR1cm4gb24gZGVidWdnaW5nIGZvciBDIGNvbXBpbGVyCi0uRUxTRQotICAgQVNGTEFHUyAgICAgICs9IC9xICAgICAgICMgU3VwcHJlc3Mgb2JqZWN0IHJlY29yZHMgbm90IG5lZWRlZCBmb3IgbGlua2luZwotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCi0uSUYgJChPUFQpCi0gICBDRkxBR1MgICAgICAgKz0gLTUgLW8rYWxsCi0uRUxJRiAkKE9QVF9TSVpFKQotICAgQ0ZMQUdTICAgICAgICs9IC01IC1vK3NwYWNlCi0uRU5ECi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMKLQotLklGICQoRlBVKQotICAgQ0ZMQUdTICAgICAgICs9IC1mZiAtREZQVTM4NwotICAgQVNGTEFHUyAgICAgICs9IC1ERlBVMzg3IC1ERlBVX1JFR19SVE4KLS5FTkQKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKLS5JRiAkKEJFVEEpCi0gICBDRkxBR1MgICAgICAgKz0gLURCRVRBCi0gICBBU0ZMQUdTICAgICAgKz0gLURCRVRBCi0uRU5ECi0KLSMgVXNlciBhIGxhcmdlciBzdGFjayBpZiByZXF1ZXN0ZWQKLQotLklGICQoU1RLU0laRSkKLSAgICBMREZMQUdTICAgICArPSA9JChTVEtTSVpFKQotLkVORElGCi0KLSMgT3B0aW9uYWxseSBjb21waWxlIGZvciAxNiBiaXQgV2luZG93cwotLklGICQoVVNFX1dJTjE2KQotLklGICQoQlVJTERfRExMKQotICAgQ0ZMQUdTICAgICAgICs9IC1XRCAtREJVSUxEX0RMTAotICAgQVNGTEFHUyAgICAgICs9IC1EQlVJTERfRExMCi0uRUxTRQotICAgQ0ZMQUdTICAgICAgICs9IC1XQQotLkVORElGCi0gICBEWF9BU0ZMQUdTICAgKz0gLURfX1dJTkRPV1MxNl9fCi0gICBMSUJfT1MgICAgICAgPSBXSU4xNgotLkVMU0UKLSAgIFVTRV9SRUFMRE9TCTo9IDEKLSAgIExJQl9PUyAgICAgICA9IERPUzE2Ci0uRU5ECi0KLSMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcwotCi1QTUxJQiAgICAgICAgICAgOj0gcG0ubGliCi0KLSMgRGVmaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcwotCi0uSUYgJChDSEVDS0VEKQotTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxkZWJ1ZwotQ0ZMQUdTCQkJKz0gLURDSEVDS0VEPTEKLS5FTFNFCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXHJlbGVhc2UKLS5FTkRJRgotCi0jIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKLSAgIExJQl9CQVNFICAgICA6PSAkKExJQl9CQVNFX0RJUilcJChMSUJfT1MpXCQoU0NfTElCQkFTRSkKLSAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFKQotCi0jIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcwotCi0gICBSVUxFU19NQUsJOj0gc2MxNi5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9zYzMyLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9zYzMyLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2E3NTcwLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvc2MzMi5taworKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgRE1BS0Ugc3RhcnR1cCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmaWxlLiBBc3N1bWVzCi0jICAgICAgICAgICAgICAgdGhhdCB0aGUgU0NJVEVDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgdG8gcG9pbnQKLSMgICAgICAgICAgICAgICB0byB3aGVyZSBhbGwgb3VyIHN0dWZmIGlzIGluc3RhbGxlZC4gWW91IHNob3VsZCBub3QgbmVlZAotIyAgICAgICAgICAgICAgIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGlzIGZpbGUuCi0jCi0jICAgICAgICAgICAgICAgU3ltYW50ZWMgQysrIDYueC83LnggMzIgYml0IHZlcnNpb24uIFN1cHBvcnRzIHRoZSBET1NYCi0jICAgICAgICAgICAgICAgZXh0ZW5kZXIsIEZsYXNoVGVrIFgzMiBhbmQgUGhhciBMYXAncyBUTlQgRE9TIEV4dGVuZGVyCi0jICAgICAgICAgICAgICAgYW5kIDMyIGJpdCBXaW5kb3dzIGRldmVsb3BtZW50LgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBJbmNsdWRlIHN0YW5kYXJkIHN0YXJ0dXAgc2NyaXB0IGRlZmluaXRpb25zCi0uSU1QT1JUOiBTQ0lURUNICi0uSU5DTFVERTogIiQoU0NJVEVDSClcbWFrZWRlZnNcc3RhcnR1cC5tayIKLQotIyBJbXBvcnQgZW5pdm9ybm1lbnQgdmFyaWFibGVzIHRoYXQgd2UgdXNlCi0uSU1QT1JUIC5JR05PUkUgOiBVU0VfVE5UIFVTRV9YMzIgVVNFX1gzMlZNIFNDX0xJQkJBU0UKLQotIyBXZSBhcmUgY29tcGlsaW5nIGZvciBhIDMyIGJpdCBlbnZpb25tZW50Ci0gICBfMzJCSVRfICAgICAgOj0gMQotCi0jIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcKLSAgIENDICAgICAgICAgICA6PSBzYyAgICAgICAjIEMtY29tcGlsZXIgYW5kIGZsYWdzCi0gICBDRkxBR1MgICAgICAgOj0gLUptCi0uSUYgJChVU0VfVEFTTTMyKQotICAgQVMgICAgICAgICAgIDo9IHRhc20zMgotLkVMSUYgJChVU0VfVEFTTVgpCi0gICBBUyAgICAgICAgICAgOj0gdGFzbXggICAgIyBBc3NlbWJsZXIgYW5kIGZsYWdzCi0uRUxTRQotICAgQVMgICAgICAgICAgIDo9IHRhc20gICAgICMgQXNzZW1ibGVyIGFuZCBmbGFncwotLkVORElGCi0uSUYgJChVU0VfV0lOMzIpCi0gICBBU0ZMQUdTICAgICAgOj0gL3QgL214IC9tIC9EX19GTEFUX18gL2lJTkNMVURFIC9pJChTQ0lURUNIKVxJTkNMVURFCi0uRUxTRQotICAgQVNGTEFHUyAgICAgIDo9IC90IC9teCAvbSAvREVTX05PVF9EUyAvRF9fQ09NTV9fIC9pJChTQ0lURUNIKVxJTkNMVURFCi0uRU5ESUYKLSAgIExEICAgICAgICAgICA6PSBzYyAgICAgICAjIExvYWRlciBhbmQgZmxhZ3MKLSAgIExEX0ZMQUdTICAgICAgPQotICAgUkMgICAgICAgICAgIDo9IHJjYyAgICAgICMgV0luZG93cyByZXNvdXJjZSBjb21waWxlcgotICAgUkNGTEFHUyAgICAgIDo9IC0zMiAgICAgICMgTWFyayBhcyBXaW4zMiBjb21wYXRpYmxlIHJlc291cmNlcwotICAgTElCICAgICAgICAgIDo9IGxpYiAgICAgICMgTGlicmFyaWFuCi0gICBMSUJGTEFHUyAgICAgOj0gL04gL0IKLSAgIElMSUIgICAgICAgICA6PSBpbXBsaWIgICAjIEltcG9ydCBsaWJyYXJpYW4KLSAgIElMSUJGTEFHUyAgICA6PQotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLS5JRiAkKERCRykKLSAgIENGTEFHUyAgICAgICArPSAtZyAgICAgICAjIFR1cm4gb24gZGVidWdnaW5nIGZvciBDIGNvbXBpbGVyIChGbGFzaFZpZXcpCi0uSUYgJChVU0VfVE5UKQotICAgTERGTEFHUyAgICAgICs9IC1mdWxsc3ltICMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIFROVCAzODZsaW5rIGxpbmtlcgotLkVORAotLklGICQoVVNFX1gzMikgb3IgJChVU0VfWDMyVk0pCi0gICBMREZMQUdTICAgICAgKz0gLUwvbWFwICAgIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgRmxhc2hWaWV3IGRlYnVnZ2VyCi0uRU5ECi0uRUxTRQotICAgQVNGTEFHUyAgICAgICs9IC9xICAgICAgICMgU3VwcHJlc3Mgb2JqZWN0IHJlY29yZHMgbm90IG5lZWRlZCBmb3IgbGlua2luZwotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCi0uSUYgJChPUFQpCi0gICBDRkxBR1MgICAgICAgKz0gLTUgLW8rYWxsCi0uRUxJRiAkKE9QVF9TSVpFKQotICAgQ0ZMQUdTICAgICAgICs9IC01IC1vK3NwYWNlCi0uRU5ECi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMKLQotLklGICQoRlBVKQotICAgQ0ZMQUdTICAgICAgICs9IC1mZiAtREZQVTM4NwotICAgQVNGTEFHUyAgICAgICs9IC1ERlBVMzg3IC1ERlBVX1JFR19SVE4KLS5FTkQKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKLS5JRiAkKEJFVEEpCi0gICBDRkxBR1MgICAgICAgKz0gLURCRVRBCi0gICBBU0ZMQUdTICAgICAgKz0gLURCRVRBCi0uRU5ECi0KLSMgVXNlciBhIGxhcmdlciBzdGFjayBpZiByZXF1ZXN0ZWQKLQotLklGICQoU1RLU0laRSkKLSAgICBMREZMQUdTICAgICArPSA9JChTVEtTSVpFKQotLkVORElGCi0KLS5JRiAkKFVTRV9UTlQpICAgICAgICAgICAgICAgICAgIyBVc2UgUGhhciBMYXAncyBUTlQgRE9TIEV4dGVuZGVyCi0gICBDRkxBR1MgICAgICAgKz0gLW1wCi0gICBEWF9DRkxBR1MgICAgKz0gLURUTlQKLSAgIEFTRkxBR1MgICAgICArPSAvRF9fRkxBVF9fCi0gICBEWF9BU0ZMQUdTICAgKz0gLURUTlQKLSAgIExEICAgICAgICAgICA6PSAzODZsaW5rCi0gICBMREZMQUdTICAgICAgKz0gQHNjMzIuZG9zIC1leGUgJEAKLSAgIExJQl9PUyAgICAgICA9IERPUzMyCi0uRUxJRiAkKFVTRV9YMzJWTSkgICAgICAgICAgICAgICMgVXNlIEZsYXNoVGVrIFgtMzJWTSBET1MgZXh0ZW5kZXIKLSAgIENGTEFHUyAgICAgICArPSAtbXgKLSAgIERYX0NGTEFHUyAgICArPSAtRFgzMlZNCi0gICBBU0ZMQUdTICAgICAgKz0gL0RfX1gzODZfXwotICAgRFhfQVNGTEFHUyAgICs9IC1EWDMyVk0KLSAgIExEICAgICAgICAgICA6PSBzYwotICAgTERGTEFHUyAgICAgICs9ICQoQ0ZMQUdTKSB4MzJ2LmxpYgotICAgTElCX09TICAgICAgID0gRE9TMzIKLS5FTElGICQoVVNFX1gzMikgICAgICAgICAgICAgICAgIyBVc2UgRmxhc2hUZWsgWC0zMiBET1MgZXh0ZW5kZXIKLSAgIENGTEFHUyAgICAgICArPSAtbXgKLSAgIERYX0NGTEFHUyAgICArPSAtRFgzMlZNCi0gICBBU0ZMQUdTICAgICAgKz0gL0RfX1gzODZfXwotICAgRFhfQVNGTEFHUyAgICs9IC1EWDMyVk0KLSAgIExEICAgICAgICAgICA6PSBzYwotICAgTERGTEFHUyAgICAgICs9ICQoQ0ZMQUdTKSB4MzIubGliCi0gICBMSUJfT1MgICAgICAgPSBET1MzMgotLkVMSUYgJChVU0VfV0lOMzIpICAgICAgICAgICAgICAjIEJ1aWxkIDMyIGJpdCBXaW5kb3dzIE5UIGFwcAotLklGICQoQlVJTERfRExMKQotICAgQ0ZMQUdTICAgICAgICs9IC1XRCAtbW4KLSAgIEFTRkxBR1MgICAgICArPSAtREJVSUxEX0RMTAotLkVMU0UKLSAgIENGTEFHUyAgICAgICArPSAtV0EgLW1uCi0uRU5ESUYKLSAgIERYX0FTRkxBR1MgICArPSAtRF9fV0lORE9XUzMyX18KLSAgIExJQl9PUyAgICAgICA9IFdJTjMyCi0uRUxTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVXNlIGRlZmF1bHQgU3ltYW50ZWMgRE9TWCBleHRlbmRlcgotICAgVVNFX0RPU1ggICAgIDo9IDEKLSAgIFVTRV9SRUFMRE9TCTo9IDEKLSAgIENGTEFHUyAgICAgICArPSAtbXgKLSAgIERYX0NGTEFHUyAgICArPSAtRERPU1gKLSAgIEFTRkxBR1MgICAgICArPSAvRF9fWDM4Nl9fCi0gICBEWF9BU0ZMQUdTICAgKz0gLURET1NYCi0gICBMRCAgICAgICAgICAgOj0gc2MKLSAgIExERkxBR1MgICAgICArPSAkKENGTEFHUykKLSAgIExJQl9PUyAgICAgICA9IERPUzMyCi0uRU5ECi0KLSMgUGxhY2UgdG8gbG9vayBmb3IgUE1PREUgbGlicmFyeSBmaWxlcwotCi0uSUYgJChVU0VfVE5UKQotUE1MSUIgICAgICAgICAgIDo9IHRudFxwbS5saWIKLS5FTElGICQoVVNFX1gzMikKLVBNTElCICAgICAgICAgICA6PSB4MzJccG0ubGliCi0uRUxTRQotUE1MSUIgICAgICAgICAgIDo9IGRvc3hccG0ubGliCi0uRU5ECi0KLSMgRGVmaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcwotCi0uSUYgJChDSEVDS0VEKQotTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxkZWJ1ZwotQ0ZMQUdTCQkJKz0gLURDSEVDS0VEPTEKLS5FTFNFCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXHJlbGVhc2UKLS5FTkRJRgotCi0jIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKLSAgIExJQl9CQVNFICAgICA6PSAkKExJQl9CQVNFX0RJUilcJChMSUJfT1MpXCQoU0NfTElCQkFTRSkKLSAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFKQotCi0jIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcwotCi0gICBSVUxFU19NQUsJOj0gc2MzMi5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9zdGFydHVwLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy9zdGFydHVwLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGIyYmEyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvc3RhcnR1cC5taworKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0jICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0jICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotIyAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSMKLSMgICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSMgICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0jICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgRE1BS0Ugc3RhcnR1cCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmaWxlLiBBc3N1bWVzCi0jICAgICAgICAgICAgICAgdGhhdCB0aGUgU0NJVEVDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYXMgYmVlbiBzZXQgdG8gcG9pbnQKLSMgICAgICAgICAgICAgICB0byB3aGVyZSBhbGwgb3VyIHN0dWZmIGlzIGluc3RhbGxlZC4gWW91IHNob3VsZCBub3QgbmVlZAotIyAgICAgICAgICAgICAgIHRvIGNoYW5nZSBhbnl0aGluZyBpbiB0aGlzIGZpbGUuCi0jCi0jICAgICAgICAgICAgICAgQ29tbW9uIHN0YXJ0dXAgc2NyaXB0IHRoYXQgZGVmaW5lcyBhbGwgdmFyaWFibGVzIGNvbW1vbiB0bwotIwkJCQlhbGwgc3RhcnR1cCBzY3JpcHRzLiBUaGVzZSBkZWZpbmUgdGhlIERNQUtFIHJ1bnRpbWUKLSMJCQkJZW52aXJvbm1lbnQgYW5kIHRoZSB2YWx1ZXMgYXJlIGRlcGVuZGFudCBvbiB0aGUgdmVyc2lvbiBvZgotIwkJCQlETUFLRSBpbiB1c2UuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIERpc2FibGUgd2FybmluZ3MgZm9yIG1hY3JvcyByZWRlZmluZWQgaGVyZSB0aGF0IHdlcmUgZ2l2ZW4KLSMgb24gdGhlIGNvbW1hbmQgbGluZS4KLV9fLlNJTEVOVCAgICAgICA6PSAkKC5TSUxFTlQpCi0uU0lMRU5UICAgICAgICAgOj0geWVzCi0KLSMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZSBjb21tb24gdG8gYWxsIGNvbXBpbGVycwotLklNUE9SVCAuSUdOT1JFIDogVEVNUCBTSEVMTCBDT01TUEVDIElOQ0xVREUgTElCIFNDSVRFQ0ggUFJJVkFURSBTQ0lURUNIX0xJQgotLklNUE9SVCAuSUdOT1JFIDogREJHIE9QVCBPUFRfU0laRSBTSFcgQkVUQSBVU0VfV0lOMzIgRlBVIEJVSUxEX0RMTCBCVUlMRF9GT1JfRExMCi0uSU1QT1JUIC5JR05PUkUgOiBJTVBPUlRfRExMIFVTRV9UQVNNWCBXSU4zMl9HVUkgVVNFX1dJTjE2IFVTRV9OQVNNIENIRUNLRUQKLS5JTVBPUlQgLklHTk9SRSA6IE9TMl9TSEVMTCBTT0ZUSUNFX1BBVEggTUFYX1dBUk4gVVNFX1NPRlRJQ0UgVVNFX1RBU00zMgotLklNUE9SVCAuSUdOT1JFIDogRExMX1NUQVJUX1RBU00gVVNFX1NOQVAgVVNFX1gxMSBVU0VfTElOVVggU1RBVElDX0xJQlMgTElCQwotLklNUE9SVCAuSUdOT1JFIDogU0hPV19BUkdTIEJPT1RfU1RSQVBfRE1BS0UKLSAgIFRNUERJUiA6PSAkKFRFTVApCi0KLSMgRGV0ZXJtaW5lIGlmIHRoZSBob3N0IG1hY2hpbmUgaXMgYSBXaW5kb3dzL0RPUyBvciBVbml4IGJveAotLklGICQoQ09NU1BFQykKLSAgIFdJTjMyX0hPU1QgICA6PSAxCi0uRUxTRQotICAgVVNFX05BU00gICAgIDo9IDEKLSAgIFVOSVhfSE9TVCAgICA6PSAxCi0uRU5ESUYKLQotIyBTZXR1cCB0byBlaXRoZXIgdXNlciBOQVNNIG9yIFRBU00gYXMgdGhlIGFzc2VtYmxlcgotLklGICQoVVNFX05BU00pCi0uRUxTRQotICAgVVNFX1RBU00JCTo9IDEKLS5FTkRJRgotCi0uSUYgJChVTklYX0hPU1QpCi0jIFN0YW5kYXJkIGZpbGUgc3VmZml4IGRlZmluaXRpb25zCi0jCi0jIE5PVEU6IExpbnV4L1VuaXggZG9lcyBub3QgcmVxdWlyZSBhbnkgZXh0ZW5pb24gZm9yIGV4ZWN1dGVhYmxlIGZpbGVzLCBidXQgeW91Ci0jICAgICAgIGNhbiB1c2UgYW4gZXh0ZW5zaW9uIGlmIHlvdSB3aXNoLiBXZSB1c2UgdGhlIC5leGUgZXh0ZW5zaW9uIGZvciBidWlsZGluZwotIyAgICAgICBleGVjdXRlYWJsZSBmaWxlcyBzbyB0aGF0IHdlIGNhbiB1c2UgaW1wbGljaXQgcnVsZXMgdG8gbWFrZSB0aGUKLSMgICAgICAgbWFrZWZpbGVzIHNpbXBsZXIgYW5kIG1vcmUgcG9ydGFibGUgYmV0d2VlbiBzeXN0ZW1zIChleGUgYWxzbyBtYWtlcyBpdAotIyAgICAgICBlYXNpZXIgZm9yIGNyb3NzLWNvbXBpbGUvZGVidWdnaW5nIHNpdHVhdGlvbnMpLiBXaGVuIHlvdSBpbnN0YWxsCi0jICAgICAgIHRoZSBmaWxlcyB0byBhIGxvY2FsIGJpbiBkaXJlY3RvcnksIHlvdSB3aWxsIHByb2JhYmx5IHdhbnQgdG8gcmVtb3ZlCi0jICAgICAgIHRoZSAuZXhlIGV4dGVuc2lvbi4KLSAgIEwgICAgICAgICAgICA6PSAuYSAgIAkjIExpYnJhcmllcwotICAgRSAgICAgICAgICAgIDo9IC5leGUgICAJIyBFeGVjdXRhYmxlcyBmb3IgZ2xpYmMKLSAgIE8gICAgICAgICAgICA6PSAubyAgIAkjIE9iamVjdHMKLSAgIEEgICAgICAgICAgICA6PSAuYXNtICAgCSMgQXNzZW1ibGVyIHNvdXJjZXMKLSAgIFMgICAgICAgICAgICA6PSAucyAgICAgICAjIEdOVSBhc3NlbWJsZXIgc291cmNlcwotICAgUCAgICAgICAgICAgIDo9IC5jcHAgICAJIyBDKysgc291cmNlcwotCi0jIEZpbGUgcHJlZml4L3N1ZmZpeCBkZWZpbml0aW9ucy4gVGhlIGZvbGxvd2luZyBwcmVmaXhlcyBhcmUgZGVmaW5lZCwgYW5kIGFyZQotIyB1c2VkIHByaW1hcmlseSB0byBhYnN0cmFjdCBiZXR3ZWVuIHRoZSBVbml4IHN0eWxlIGxpYlhYLmEgbmFtaW5nIGNvbnZlbnRpb24KLSMgYW5kIHRoZSBET1MvV2luZG93cy9PUzIgbmFtaW5nIGNvbnZlbnRpb24gb2YgWFgubGliLgotICAgTFAgICAgICAgICAgIDo9IGxpYiAgICAgICMgTFAgLSBMaWJyYXJ5IGZpbGUgcHJlZml4IChuYW1lIG9mIGZpbGUgb24gZGlzaykKLSAgIExMICAgICAgICAgICA6PSAtbAkJIyBMaWJyYXJ5IGxpbmsgcHJlZml4IChuYW1lIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCi0gICBMRSAgICAgICAgICAgOj0gCQkgICAgIyBMaWJyYXJ5IGxpbmsgc3VmZml4IChleHRlbnNpb24gb2YgbGlicmFyeSBvbiBsaW5rIGNvbW1hbmQgbGluZSkKLQotIyBXZSB1c2UgdGhlIFVuaXggc2hlbGwgYXQgYWxsIHRpbWVzCi0gICBTSEVMTAkJOj0gL2Jpbi9zaAotICAgU0hFTExGTEFHUyAgIDo9IC1jCi0KLS5FTFNFCi0jIFN0YW5kYXJkIGZpbGUgRE9TL1dpbi9PUzIgc3VmZml4IGRlZmluaXRpb25zCi0gICBMICAgICAgICAgICAgOj0gLmxpYiAgIAkjIExpYnJhcmllcwotLklGICQoVVNFX1NOQVApCi0gICBFICAgICAgICAgICAgOj0gLnN4ZSAgIAkjIFNuYXAgRXhlY3V0YWJsZXMKLSAgIEQgICAgICAgICAgICA6PSAuc2xsICAJIyBTbmFwIER5bmFtaWMgTGluayBMaWJyYXJ5IGZpbGUKLS5FTFNFCi0gICBFICAgICAgICAgICAgOj0gLmV4ZSAgIAkjIEV4ZWN1dGFibGVzCi0gICBEICAgICAgICAgICAgOj0gLmRsbCAgIAkjIER5bmFtaWMgTGluayBMaWJyYXJ5IGZpbGUKLS5FTkRJRgotICAgTyAgICAgICAgICAgIDo9IC5vYmogICAJIyBPYmplY3RzCi0gICBBICAgICAgICAgICAgOj0gLmFzbSAgIAkjIEFzc2VtYmxlciBzb3VyY2VzCi0gICBQICAgICAgICAgICAgOj0gLmNwcCAgIAkjIEMrKyBzb3VyY2VzCi0gICBSICAgICAgICAgICAgOj0gLnJlcyAgIAkjIENvbXBpbGVkIHJlc291cmNlIGZpbGUKLSAgIFMJCQk6PSAucwkJIyBBc3N5bnRheC5oIHN0eWxlIGFzc2VtYmxlcgotCi0jIEZpbGUgcHJlZml4L3N1ZmZpeCBkZWZpbml0aW9ucy4gVGhlIGZvbGxvd2luZyBwcmVmaXhlcyBhcmUgZGVmaW5lZCwgYW5kIGFyZQotIyB1c2VkIHByaW1hcmlseSB0byBhYnN0cmFjdCBiZXR3ZWVuIHRoZSBVbml4IHN0eWxlIGxpYlhYLmEgbmFtaW5nIGNvbnZlbnRpb24KLSMgYW5kIHRoZSBET1MvV2luZG93cy9PUzIgbmFtaW5nIGNvbnZlbnRpb24gb2YgWFgubGliLgotICAgTFAgICAgICAgICAgIDo9IAkJCSMgTFAgLSBMaWJyYXJ5IGZpbGUgcHJlZml4IChuYW1lIG9mIGZpbGUgb24gZGlzaykKLSAgIExMICAgICAgICAgICA6PSAJCQkjIExpYnJhcnkgbGluayBwcmVmaXggKG5hbWUgb2YgbGlicmFyeSBvbiBsaW5rIGNvbW1hbmQgbGluZSkKLSAgIExFICAgICAgICAgICA6PSAubGliCQkjIExpYnJhcnkgbGluayBzdWZmaXggKGV4dGVuc2lvbiBvZiBsaWJyYXJ5IG9uIGxpbmsgY29tbWFuZCBsaW5lKQotCi0jIFdlIHVzZSB0aGUgRE9TL1dpbi9PUzIgc3R5bGUgc2hlbGwgYXQgYWxsIHRpbWVzCi0gICBTSEVMTCAgICAgICAgOj0gJChDT01TUEVDKQotICAgR1JPVVBTSEVMTCAgIDo9ICQoU0hFTEwpCi0gICBTSEVMTEZMQUdTICAgOj0gJChTV0lUQ0hBUiljCi0gICBHUk9VUEZMQUdTICAgOj0gJChTSEVMTEZMQUdTKQotICAgU0hFTExNRVRBUyAgIDo9ICoiPzw+Ci0uSUYgJChPUzJfU0hFTEwpCi0gICBHUk9VUFNVRkZJWCAgOj0gLmNtZAotLkVMU0UKLSAgIEdST1VQU1VGRklYICA6PSAuYmF0Ci0uRU5ESUYKLSAgIERJUlNFUFNUUiAgICA6PSBcXAotICAgRElWRklMRSAgICAgICA9ICQoVE1QRklMRTpzLC8sXCkKLQotLkVORElGCi0KLSMgU3RhbmRhcmQgVW5peCBzdHlsZSBzaGVsbCBjb21tYW5kcy4gU2luY2UgdGhlc2UgZG8gbm90IGV4aXN0IG9uCi0jIHJlZ3VsYXIgRE9TL1dpbi9PUzIgaW5zdGFsbGF0aW9ucyB3ZSB1c2Ugb3VyIG93biAnJyB2ZXJzaW9ucwotIyBpbnN0ZWFkLiBUbyBib29zdHJ0YXAgYSBuZXcgT1MgeW91IG1heSB3aXNoIHRvIHVzZSB0aGUgcmVndWxhcgotIyB1bml4IHZlcnNpb25zLgotCi0uSUYgJChCT09UX1NUUkFQX0RNQUtFKQotICAgQ1AJCQk6PSBjcAotICAgTUQJCQk6PSBta2RpcgotICAgUk0JCQk6PSBybQotICAgRUNITwkJCTo9IGVjaG8KLS5FTFNFCi0gICBDUAkJCTo9IGtfY3AKLSAgIE1ECQkJOj0ga19tZAotICAgUk0JCQk6PSBrX3JtCi0gICBFQ0hPCQkJOj0ga19lY2hvCi0uRU5ESUYKLQotIyBEZWZpbml0aW9uIG9mICQoTUFLRSkgbWFjcm8gZm9yIHJlY3Vyc2l2ZSBtYWtlcy4KLSAgIE1BS0UgPSAkKE1BS0VDTUQpICQoTUZMQUdTKQotCi0jIE1hY3JvIHRvIGluc3RhbGwgYSBsaWJyYXJ5IGZpbGUKLSAgIElOU1RBTEwgICAgICA6PSAkKENQKQotCi0jIERNQUtFIHVzZXMgdGhpcyByZWNpcGUgdG8gcmVtb3ZlIGludGVybWVkaWF0ZSB0YXJnZXRzCi0uUkVNT1ZFIDo7ICQoUk0pIC1mICQ8Ci0KLSMgVHVybiB3YXJuaW5ncyBiYWNrIHRvIHByZXZpb3VzIHNldHRpbmcuCi0uU0lMRU5UIDo9ICQoX18uU0lMRU5UKQotCi0jIFdlIGRvbnQgdXNlIFRBQlMgaW4gb3VyIG1ha2VmaWxlcwotLk5PVEFCUyAgICAgICAgIDo9IHllcwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy92YTMyLm1rIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy92YTMyLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmNhNTIzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvdmEzMi5taworKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcwotIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50Ci0jICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKLSMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgotIwotIyAgICAgICAgICAgICAgIElCTSBWaXN1YWxBZ2UgQysrIDMuMCBPUy8yIDMyLWJpdCB2ZXJzaW9uLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBJbmNsdWRlIHN0YW5kYXJkIHN0YXJ0dXAgc2NyaXB0IGRlZmluaXRpb25zCi0uSU1QT1JUOiBTQ0lURUNICi0uSU5DTFVERTogIiQoU0NJVEVDSClcbWFrZWRlZnNcc3RhcnR1cC5tayIKLQotIyBJbXBvcnQgZW5pdm9ybm1lbnQgdmFyaWFibGVzIHRoYXQgd2UgdXNlCi0uSU1QT1JUIC5JR05PUkUgOiBWQV9MSUJCQVNFIFVTRV9PUzIzMiBVU0VfT1MyR1VJIEZVTExTQ1JFRU4gTk9PUFQgTUFYX1dBUk4KLQotIyBXZSBhcmUgY29tcGlsaW5nIGZvciBhIDMyIGJpdCBlbnZpb25tZW50Ci0gICBfMzJCSVRfICAgICAgOj0gMQotCi0jIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcKLSAgIENDICAgICAgICAgICA6PSBpY2MKLSAgIENQUCAgICAgICAgICA6PSBpY2MKLSAgIENGTEFHUyAgICAgICA6PSAvUSAvRzUgL0dsKyAvRmkgL1NpIC9KLSAvU3MrIC9TcDEgL0dtKyAvSS4KLS5JRiAkKFVTRV9OQVNNKQotICAgQVMgICAgICAgICAgIDo9IG5hc20KLSAgIEFTRkxBR1MgICAgICA6PSAtdCAtZiBvYmogLUYgbnVsbCAtZF9fRkxBVF9fIC1kU1REQ0FMTF9NQU5HTEUgLWRfX05PVV9WQVJfXyAtaUlOQ0xVREUgLWkkKFNDSVRFQ0gpXElOQ0xVREUKLS5FTFNFCi0uSUYgJChVU0VfVEFTTTMyKQotICAgQVMgICAgICAgICAgIDo9IHRhc20zMgotLkVMSUYgJChVU0VfVEFTTVgpCi0gICBBUyAgICAgICAgICAgOj0gdGFzbXgKLS5FTFNFCi0gICBBUyAgICAgICAgICAgOj0gdGFzbQotLkVORElGCi0gICBBU0ZMQUdTICAgICAgOj0gL3QgL214IC9tIC9EX19GTEFUX18gL0RTVERDQUxMX01BTkdMRSAvRF9fTk9VX1ZBUl9fIC9pSU5DTFVERSAvaSQoU0NJVEVDSClcSU5DTFVERQotLkVORElGCi0gICBMRCAgICAgICAgICAgOj0gaWxpbmsKLSAgIExERkxBR1MgICAgICAgPSAvbm9pIC9leGVwYWNrOjIgL3BhY2tjb2RlIC9wYWNrZGF0YSAvYWxpZ246MzIgL21hcCAvbm9lCi0gICBSQyAgICAgICAgICAgOj0gcmMKLSAgIFJDRkxBR1MgICAgICA6PSAtbiAteDIKLSAgIExJQiAgICAgICAgICA6PSBpbGliCi0gICBMSUJGTEFHUyAgICAgOj0gL25vbG9nbwotICAgSUxJQiAgICAgICAgIDo9IGltcGxpYgotICAgSUxJQkZMQUdTICAgIDo9IC9ub2xvZ28KLSAgIElQRkMgICAgICAgICA6PSBpcGZjCi0gICBJUEZDRkxBR1MgICAgOj0KLSAgIElCTUNPQkogICAgICA6PSAxCi0KLSMgU2V0IHRoZSBjb21waWxlciB3YXJuaW5nIGxldmVsCi0uSUYgJChNQVhfV0FSTikKLSAgIENGTEFHUyAgICAgICArPSAvVzMKLS5FTFNFCi0gICBDRkxBR1MgICAgICAgKz0gL1cxCi0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gL1RpCi0gICBMREZMQUdTICAgICAgKz0gL0RFCi0uRUxTRQotLklGICQoVVNFX1RBU00pCi0gICBBU0ZMQUdTICAgICAgKz0gL3EKLS5FTkRJRgotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCi0uSUYgJChPUFQpCi0gICBDRkxBR1MgICAgICAgKz0gL0dmaSAvTyAvT2kKLS5FTElGICQoT1BUX1NJWkUpCi0gICBDRkxBR1MgICAgICAgKz0gL0dmaSAvTyAvT2MKLS5FTElGICQoTk9PUFQpCi0gICBDRkxBR1MgICAgICAgKz0gL08tCi0uRU5ECi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMgb3B0aW1pc2VkIGZvciBQZW50aXVtCi0uSUYgJChGUFUpCi0gICBDRkxBR1MgICAgICAgKz0gLURGUFUzODcKLSAgIEFTRkxBR1MgICAgICArPSAtZEZQVTM4NwotLkVORAotCi0jIE9wdGlvbmFsbHkgY29tcGlsZSBhIGJldGEgcmVsZWFzZSB2ZXJzaW9uIG9mIGEgcHJvZHVjdAotLklGICQoQkVUQSkKLSAgIENGTEFHUyAgICAgICArPSAtREJFVEEKLSAgIEFTRkxBR1MgICAgICArPSAtZEJFVEEKLS5FTkQKLQotIyBCdWlsZCAzMi1iaXQgT1MvMiBhcHBzCi0uSUYgJChCVUlMRF9ETEwpCi0gICBDRkxBR1MgICAgICAgKz0gL0dlLSAvREJVSUxEX0RMTAotICAgTERGTEFHUyAgICAgICs9IC9ETEwgL05PRQotICAgQVNGTEFHUyAgICAgICs9IC1kQlVJTERfRExMCi0uRUxTRQotLklGICQoVVNFX09TMkdVSSkKLSAgIENGTEFHUyAgICAgICArPSAtRF9fT1MyX1BNX18KLSAgIExERkxBR1MgICAgICArPSAvUE1UWVBFOlBNCi0uRUxTRQotLklGICQoRlVMTFNDUkVFTikKLSAgIExERkxBR1MgICAgICArPSAvUE1UWVBFOk5PVklPCi0uRUxTRQotICAgTERGTEFHUyAgICAgICs9IC9QTVRZUEU6VklPCi0uRU5ESUYKLS5FTkRJRgotLkVORElGCi0gICBEWF9BU0ZMQUdTICAgKz0gLWRfX09TMl9fCi0gICBMSUJfT1MgICAgICAgPSBvczIzMgotCi0jIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKLQotLklGICQoVVNFX09TMkdVSSkKLS5JRiAkKFVTRV9TRERQTURMTCkKLSNOb3RlOiBUaGlzIGlzIE9LIGZvciBub3cgYnV0IG1pZ2h0IG5lZWQgdG8gYmUgY2hhbmdlZCBpZiB0aGUgR1VJIFBNIGxpYnJhcnkKLSMgICAgICB3ZXJlIHJlYWxseSBkaWZmZXJlbnQKLVBNTElCICAgICAgICAgICA6PSBzZGRwbWxpYi5saWIKLS5FTFNFCi1QTUxJQiAgICAgICAgICAgOj0gcG1fcG0ubGliCi0uRU5ESUYKLS5FTFNFCi0uSUYgJChVU0VfU0REUE1ETEwpCi1QTUxJQiAgICAgICAgICAgOj0gc2RkcG1saWIubGliCi0uRUxTRQotUE1MSUIgICAgICAgICAgIDo9IHBtLmxpYgotLkVORElGCi0uRU5ESUYKLQotIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKENIRUNLRUQpCi1MSUJfQkFTRV9ESVIgICAgOj0gJChTQ0lURUNIX0xJQilcbGliXGRlYnVnCi1DRkxBR1MgICAgICAgICAgKz0gL0RDSEVDS0VEPTEKLS5FTFNFCi1MSUJfQkFTRV9ESVIgICAgOj0gJChTQ0lURUNIX0xJQilcbGliXHJlbGVhc2UKLS5FTkRJRgotCi0jIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKLSAgIExJQl9CQVNFICAgICA6PSAkKExJQl9CQVNFX0RJUilcJChMSUJfT1MpXCQoVkFfTElCQkFTRSkKLSAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFKQotCi0jIERlZmluZSB3aGljaCBmaWxlIGNvbnRhaW5zIG91ciBydWxlcwotCi0gICBSVUxFU19NQUsgICAgOj0gdmEzMi5tawpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy92YTM2NS5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvdmEzNjUubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMmVjY2IuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy92YTM2NS5taworKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAgCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKLSMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAotIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCi0jICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KLSMKLSMgICAgICAgICAgICAgICBJQk0gVmlzdWFsQWdlIEMrKyAzLjY1IE9TLzIgMzItYml0IHZlcnNpb24uCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKLS5JTVBPUlQ6IFNDSVRFQ0gKLS5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgotCi0jIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKLS5JTVBPUlQgLklHTk9SRSA6IFZBX0xJQkJBU0UgVVNFX09TMjMyIFVTRV9PUzJHVUkgRlVMTFNDUkVFTiBOT09QVCBNQVhfV0FSTgotCi0jIFdlIGFyZSBjb21waWxpbmcgZm9yIGEgMzIgYml0IGVudmlvbm1lbnQKLSAgIF8zMkJJVF8gICAgICA6PSAxCi0KLSMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZwotICAgQ0MgICAgICAgICAgIDo9IGljYwotICAgQ1BQICAgICAgICAgIDo9IGljYwotICAgQ0ZMQUdTICAgICAgIDo9IC9RIC9HNWwgL0ZpIC9TaSAvSi0gL1NzKyAvU3AxIC9HbSsgL0kuCi0uSUYgJChVU0VfTkFTTSkKLSAgIEFTICAgICAgICAgICA6PSBuYXNtCi0gICBBU0ZMQUdTICAgICAgOj0gLXQgLWYgb2JqIC1GIG51bGwgLWRfX0ZMQVRfXyAtZFNURENBTExfTUFOR0xFIC1kX19OT1VfVkFSX18gLWlJTkNMVURFIC1pJChTQ0lURUNIKVxJTkNMVURFCi0uRUxTRQotLklGICQoVVNFX1RBU00zMikKLSAgIEFTICAgICAgICAgICA6PSB0YXNtMzIKLS5FTElGICQoVVNFX1RBU01YKQotICAgQVMgICAgICAgICAgIDo9IHRhc214Ci0uRUxTRQotICAgQVMgICAgICAgICAgIDo9IHRhc20KLS5FTkRJRgotICAgQVNGTEFHUyAgICAgIDo9IC90IC9teCAvbSAvRF9fRkxBVF9fIC9EU1REQ0FMTF9NQU5HTEUgL0RfX05PVV9WQVJfXyAvaUlOQ0xVREUgL2kkKFNDSVRFQ0gpXElOQ0xVREUKLS5FTkRJRgotICAgTEQgICAgICAgICAgIDo9IGlsaW5rCi0gICBMREZMQUdTICAgICAgID0gL25vaSAvZXhlcGFjayAvcGFja2NvZGUgL3BhY2tkYXRhIC9hbGlnbjozMiAvbWFwIC9ub2UKLSAgIFJDICAgICAgICAgICA6PSByYwotICAgUkNGTEFHUyAgICAgIDo9IC9ub2xvZ28KLSAgIExJQiAgICAgICAgICA6PSBpbGliCi0gICBMSUJGTEFHUyAgICAgOj0gL25vbG9nbwotICAgSUxJQiAgICAgICAgIDo9IGltcGxpYgotICAgSUxJQkZMQUdTICAgIDo9IC9ub2xvZ28KLSAgIElCTUNPQkogICAgICA6PSAxCi0KLSMgU2V0IHRoZSBjb21waWxlciB3YXJuaW5nIGxldmVsCi0uSUYgJChNQVhfV0FSTikKLSAgIENGTEFHUyAgICAgICArPSAvVzMKLS5FTFNFCi0gICBDRkxBR1MgICAgICAgKz0gL1cxCi0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gL1RpCi0gICBMREZMQUdTICAgICAgKz0gL0RFCi0uRUxTRQotLklGICQoVVNFX1RBU00pCi0gICBBU0ZMQUdTICAgICAgKz0gL3EKLS5FTkRJRgotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCi0uSUYgJChPUFQpCi0gICBDRkxBR1MgICAgICAgKz0gL0dmaSAvTyAvT2kKLS5FTElGICQoT1BUX1NJWkUpCi0gICBDRkxBR1MgICAgICAgKz0gL0dmaSAvTyAvT2MKLS5FTElGICQoTk9PUFQpCi0gICBDRkxBR1MgICAgICAgKz0gL08tCi0uRU5ECi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMgb3B0aW1pc2VkIGZvciBQZW50aXVtCi0uSUYgJChGUFUpCi0gICBDRkxBR1MgICAgICAgKz0gLURGUFUzODcKLSAgIEFTRkxBR1MgICAgICArPSAtZEZQVTM4NwotLkVORAotCi0jIE9wdGlvbmFsbHkgY29tcGlsZSBhIGJldGEgcmVsZWFzZSB2ZXJzaW9uIG9mIGEgcHJvZHVjdAotLklGICQoQkVUQSkKLSAgIENGTEFHUyAgICAgICArPSAtREJFVEEKLSAgIEFTRkxBR1MgICAgICArPSAtZEJFVEEKLS5FTkQKLQotIyBCdWlsZCAzMi1iaXQgT1MvMiBhcHBzCi0uSUYgJChCVUlMRF9ETEwpCi0gICBDRkxBR1MgICAgICAgKz0gL0dtZS0gL0RCVUlMRF9ETEwKLSAgIExERkxBR1MgICAgICArPSAvRExMIC9OT0UKLSAgIEFTRkxBR1MgICAgICArPSAtZEJVSUxEX0RMTAotLkVMU0UKLS5JRiAkKFVTRV9PUzJHVUkpCi0gICBDRkxBR1MgICAgICAgKz0gLURfX09TMl9QTV9fCi0gICBMREZMQUdTICAgICAgKz0gL1BNVFlQRTpQTQotLkVMU0UKLS5JRiAkKEZVTExTQ1JFRU4pCi0gICBMREZMQUdTICAgICAgKz0gL1BNVFlQRTpOT1ZJTwotLkVMU0UKLSAgIExERkxBR1MgICAgICArPSAvUE1UWVBFOlZJTwotLkVORElGCi0uRU5ESUYKLS5FTkRJRgotICAgRFhfQVNGTEFHUyAgICs9IC1kX19PUzJfXwotICAgTElCX09TICAgICAgID0gb3MyMzIKLQotIyBQbGFjZSB0byBsb29rIGZvciBQTU9ERSBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKFVTRV9PUzJHVUkpCi1QTUxJQiAgICAgICAgICAgOj0gcG1fcG0ubGliCi0uRUxTRQotUE1MSUIgICAgICAgICAgIDo9IHBtLmxpYgotLkVORElGCi0KLSMgRGVmaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcwotCi0uSUYgJChDSEVDS0VEKQotTElCX0JBU0VfRElSICAgIDo9ICQoU0NJVEVDSF9MSUIpXGxpYlxkZWJ1ZwotQ0ZMQUdTICAgICAgICAgICs9IC9EQ0hFQ0tFRD0xCi0uRUxTRQotTElCX0JBU0VfRElSICAgIDo9ICQoU0NJVEVDSF9MSUIpXGxpYlxyZWxlYXNlCi0uRU5ESUYKLQotIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCi0gICBMSUJfQkFTRSAgICAgOj0gJChMSUJfQkFTRV9ESVIpXCQoTElCX09TKVwkKFZBX0xJQkJBU0UpCi0gICBMSUJfREVTVCAgICAgOj0gJChMSUJfQkFTRSkKLQotIyBEZWZpbmUgd2hpY2ggZmlsZSBjb250YWlucyBvdXIgcnVsZXMKLQotICAgUlVMRVNfTUFLICAgIDo9IHZhMzY1Lm1rCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3ZjMTYubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3ZjMTYubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxM2JmOWMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy92YzE2Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKLSMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAotIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCi0jICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KLSMKLSMgICAgICAgICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyAxLnggMTYgYml0IHZlcnNpb24uIFN1cHBvcnRzIDE2IGJpdAotIyAgICAgICAgICAgICAgIERPUyBhbmQgV2luZG93cyBkZXZlbG9wbWVudC4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgSW5jbHVkZSBzdGFuZGFyZCBzdGFydHVwIHNjcmlwdCBkZWZpbml0aW9ucwotLklNUE9SVDogU0NJVEVDSAotLklOQ0xVREU6ICIkKFNDSVRFQ0gpXG1ha2VkZWZzXHN0YXJ0dXAubWsiCi0KLSMgSW1wb3J0IGVuaXZvcm5tZW50IHZhcmlhYmxlcyB0aGF0IHdlIHVzZQotLklNUE9SVCAuSUdOT1JFIDogVkNfTElCQkFTRQotCi0jIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcKLSAgIENDICAgICAgICAgICA6PSBjbCAgICAgICAjIEMtY29tcGlsZXIgYW5kIGZsYWdzCi0gICBDRkxBR1MgICAgICAgOj0gL1lYIC93IC9HMyAvR3MKLS5JRiAkKFVTRV9UQVNNMzIpCi0gICBBUyAgICAgICAgICAgOj0gdGFzbTMyCi0uRUxJRiAkKFVTRV9UQVNNWCkKLSAgIEFTICAgICAgICAgICA6PSB0YXNteCAgICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKLS5FTFNFCi0gICBBUyAgICAgICAgICAgOj0gdGFzbSAgICAgIyBBc3NlbWJsZXIgYW5kIGZsYWdzCi0uRU5ESUYKLSAgIEFTRkxBR1MgICAgICA6PSAvdCAvbXggL20gL0RfX0NPTU1fXyAvaUlOQ0xVREUgL2kkKFNDSVRFQ0gpXElOQ0xVREUKLSAgIExEICAgICAgICAgICA6PSBjbCAgICAgICAjIExvYWRlciBhbmQgZmxhZ3MKLSAgIExERkxBR1MgICAgICAgPSAkKENGTEFHUykKLSAgIFJDICAgICAgICAgICA6PSByYyAgICAgICAjIFdJbmRvd3MgcmVzb3VyY2UgY29tcGlsZXIKLSAgIFJDRkxBR1MgICAgICA6PQotICAgTElCICAgICAgICAgIDo9IGxpYiAgICAgICMgTGlicmFyaWFuCi0gICBMSUJGTEFHUyAgICAgOj0gL05PSSAvTk9FCi0gICBJTElCICAgICAgICAgOj0gaW1wbGliICAgIyBJbXBvcnQgbGlicmFyaWFuCi0gICBJTElCRkxBR1MgICAgOj0gL25vaWdub3JlY2FzZQotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLS5JRiAkKERCRykKLSAgIENGTEFHUyAgICAgICArPSAvWWQgL1ppICAjIFR1cm4gb24gZGVidWdnaW5nIGZvciBDIGNvbXBpbGVyCi0gICBBU0ZMQUdTICAgICAgKz0gL3ppICAgICAgIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgYXNzZW1ibGVyCi0uRUxTRQotICAgQVNGTEFHUyAgICAgICs9IC9xICAgICAgICMgU3VwcHJlc3Mgb2JqZWN0IHJlY29yZHMgbm90IG5lZWRlZCBmb3IgbGlua2luZwotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCi0uSUYgJChPUFQpCi0gICBDRkxBR1MgICAgICAgKz0gL094Ci0uRU5ECi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRpcmVjdCBpMzg3IEZQVSBpbnN0cnVjdGlvbnMKLQotLklGICQoRlBVKQotICAgQ0ZMQUdTICAgICAgICs9IC9GUGk4NyAvREZQVTM4NwotICAgQVNGTEFHUyAgICAgICs9IC9ERlBVMzg3IC9ERlBVX1JFR19SVE4KLS5FTkQKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKLS5JRiAkKEJFVEEpCi0gICBDRkxBR1MgICAgICAgKz0gL0RCRVRBCi0gICBBU0ZMQUdTICAgICAgKz0gL0RCRVRBCi0uRU5ECi0KLSMgVXNlIGEgbGFyZ2VyIHN0YWNrIGR1cmluZyBsaW5raW5nIGlmIHJlcXVlc3RlZCA/Pz8/IEhvdyB0aGUgZnVjayBkbyB5b3UKLSMgc3BlY2lmeSBsaW5rZXIgb3B0aW9ucyBvbiB0aGUgQ0wgY29tbWFuZCBsaW5lPz8/Pz8KLQotLklGICQoU1RLU0laRSkKLS5FTkRJRgotCi0jIE9wdGlvbmFsbHkgY29tcGlsZSBmb3IgMTYgYml0IFdpbmRvd3MKLS5JRiAkKFVTRV9XSU4xNikKLS5JRiAkKEJVSUxEX0RMTCkKLSAgIENGTEFHUyAgICAgICArPSAvR0QgL0FsZncgL0RCVUlMRF9ETEwKLSAgIEFTRkxBR1MgICAgICArPSAtREJVSUxEX0RMTAotLkVMU0UKLSAgIENGTEFHUyAgICAgICArPSAvR0EgL0FMCi0uRU5ESUYKLSAgIERYX0FTRkxBR1MgICArPSAtRF9fV0lORE9XUzE2X18KLSAgIExJQl9PUyAgICAgICA9IFdJTjE2Ci0uRUxTRQotICAgVVNFX1JFQUxET1MJOj0gMQotICAgQ0ZMQUdTICAgICAgICs9IC9BTAotICAgTElCX09TICAgICAgID0gRE9TMTYKLS5FTkQKLQotIyBQbGFjZSB0byBsb29rIGZvciBQTU9ERSBsaWJyYXJ5IGZpbGVzCi0KLVBNTElCICAgICAgICAgICA6PSBwbS5saWIKLQotIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKENIRUNLRUQpCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXGRlYnVnCi1DRkxBR1MJCQkrPSAtRENIRUNLRUQ9MQotLkVMU0UKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJccmVsZWFzZQotLkVORElGCi0KLSMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcwotICAgTElCX0JBU0UgICAgIDo9ICQoTElCX0JBU0VfRElSKVwkKExJQl9PUylcJChWQ19MSUJCQVNFKQotICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0UpCi0KLSMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCi0KLSAgIFJVTEVTX01BSwk6PSB2YzE2Lm1rCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3ZjMzIubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3ZjMzIubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYzkwNzEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy92YzMyLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKLSMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAotIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCi0jICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KLSMKLSMgICAgICAgICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyAyLnggMzIgYml0IHZlcnNpb24uIFN1cHBvcnRzIFBoYXIgTGFwCi0jICAgICAgICAgICAgICAgVE5UIERPUyBFeHRlbmRlciBhbmQgMzIgYml0IFdpbmRvd3MgZGV2ZWxvcG1lbnQuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKLS5JTVBPUlQ6IFNDSVRFQ0gKLS5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgotCi0jIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKLS5JTVBPUlQgLklHTk9SRSA6IFROVF9QQVRIIFZDX0xJQkJBU0UgRE9TU1RZTEUgVVNFX1ROVCBVU0VfUlRUQVJHRVQgTVNWQ0RJUgotLklNUE9SVCAuSUdOT1JFIDogVVNFX1ZYRCBVU0VfTlREUlYgVVNFX1cyS0RSViBOVF9EREtST09UIFVTRV9SVFRJIFVTRV9DUFBFWENFUFQKLQotIyBXZSBhcmUgY29tcGlsaW5nIGZvciBhIDMyIGJpdCBlbnZpb25tZW50Ci0gICBfMzJCSVRfICAgICAgOj0gMQotCi0jIERlZmF1bHQgY29tbWFuZHMgZm9yIGNvbXBpbGluZywgYXNzZW1ibGluZyBsaW5raW5nIGFuZCBhcmNoaXZpbmcKLSAgIENDICAgICAgICAgICA6PSBjbCAgICAgICAjIEMtY29tcGlsZXIgYW5kIGZsYWdzCi0gICBDRkxBR1MgICAgICAgOj0KLS5JRiAkKFVTRV9OQVNNKQotICAgQVMJCQk6PSBuYXNtCi0gICBBU0ZMQUdTICAgICAgOj0gLXQgLWYgd2luMzIgLUYgbnVsbCAtZF9fRkxBVF9fIC1kU1REQ0FMTF9NQU5HTEUgLWlJTkNMVURFIC1pJChTQ0lURUNIKVxJTkNMVURFCi0uRUxTRQotLklGICQoVVNFX1RBU00zMikKLSAgIEFTICAgICAgICAgICA6PSB0YXNtMzIKLS5FTElGICQoVVNFX1RBU01YKQotICAgQVMgICAgICAgICAgIDo9IHRhc214ICAgICMgQXNzZW1ibGVyIGFuZCBmbGFncwotLkVMU0UKLSAgIEFTICAgICAgICAgICA6PSB0YXNtICAgICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKLS5FTkRJRgotICAgQVNGTEFHUyAgICAgIDo9IC90IC9teCAvbSAvRF9fRkxBVF9fIC9EU1REQ0FMTF9NQU5HTEUgL2lJTkNMVURFIC9pJChTQ0lURUNIKVxJTkNMVURFCi0uRU5ESUYKLSAgIExEICAgICAgICAgICA6PSBjbAotLklGICQoVVNFX1dJTjMyKQotICAgTERGTEFHUyAgICAgICA9ICQoQ0ZMQUdTKQotLklGICQoVVNFX05URFJWKQotICAgTERFTkRGTEFHUyAgID0gLWxpbmsgL0lOQ1JFTUVOVEFMOk5PIC9EUklWRVIgL1NVQlNZU1RFTTpOQVRJVkUsNC4wMCAvVkVSU0lPTjo0LjAwIC9NQUNISU5FOkkzODYgL05PREVGQVVMVExJQiAvREVCVUdUWVBFOkNWIC9QREI6Tk9ORSAvQUxJR046MHgyMCAvQkFTRToweDEwMDAwIC9FTlRSWTpEcml2ZXJFbnRyeUA4Ci0JIy9NRVJHRTpfcGFnZT1wYWdlIC9NRVJHRTpfdGV4dD0udGV4dCAvTUVSR0U6LnJkYXRhPS50ZXh0Ci0uRUxJRiAkKFdJTjMyX0dVSSkKLSAgIExERU5ERkxBR1MgICA9IC1saW5rIC9JTkNSRU1FTlRBTDpOTyAvREVGOiQoQDpiKS5kZWYgL1NVQlNZU1RFTTpXSU5ET1dTIC9NQUNISU5FOkkzODYgL0RFQlVHVFlQRTpDViAvUERCOk5PTkUKLS5FTFNFCi0gICBMREVOREZMQUdTICAgPSAtbGluayAvSU5DUkVNRU5UQUw6Tk8gL1NVQlNZU1RFTTpDT05TT0xFIC9NQUNISU5FOkkzODYgL0RFQlVHVFlQRTpDViAvUERCOk5PTkUKLS5FTkRJRgotLkVMU0UKLSAgIExERkxBR1MgICAgICAgPSAkKENGTEFHUykKLSAgIExERU5ERkxBR1MgICA6PSAtbGluayAtc3R1YjokKFROVF9QQVRIOnMvXC9cXClcXGJpblxcZ290bnQuZXhlIC9QREI6Tk9ORQotLkVORElGCi0gICBSQyAgICAgICAgICAgOj0gcmMgICAgICAgIyBXYXRjb20gcmVzb3VyY2UgY29tcGlsZXIKLSAgIFJDRkxBR1MgICAgICA6PSAgICAgICAgICAjIE1hcmsgYXMgV2luMzIgY29tcGF0aWJsZSByZXNvdXJjZXMKLSAgIExJQiAgICAgICAgICA6PSBsaWIgICAgICAjIExpYnJhcmlhbgotICAgTElCRkxBR1MgICAgIDo9Ci0gICBJTElCICAgICAgICAgOj0gbGliICAgICAgIyBJbXBvcnQgbGlicmFyaWFuCi0gICBJTElCRkxBR1MgICAgOj0gL01BQ0hJTkU6SVg4NgotICAgSU5URUxfWDg2CTo9IDEKLSAgIE5NU1lNICAgCQk6PSAkKFNPRlRJQ0VfUEFUSClcbm1zeW0uZXhlCi0uSUYgJChVU0VfTlREUlYpCi0gICBOTVNZTUZMQUdTCTo9IC9UUkFOU0xBVEU6c291cmNlLHBhY2thZ2UsYWx3YXlzIC9QUk9NUFQgL1NPVVJDRTokKE1TVkNESVIpXGNydFxzcmNcaW50ZWw7JChTQ0lURUNIKVxzcmNccG07JChTQ0lURUNIKVxzcmNccG1cY29tbW9uOyQoU0NJVEVDSClcc3JjXHBtXG50ZHJ2Ci0uRUxTRQotICAgTk1TWU1GTEFHUwk6PSAvVFJBTlNMQVRFOnNvdXJjZSxwYWNrYWdlLGFsd2F5cyAvUFJPTVBUIC9TT1VSQ0U6JChTQ0lURUNIKVxzcmNccG07JChTQ0lURUNIKVxzcmNccG1cY29tbW9uOyQoU0NJVEVDSClcc3JjXHBtXHdpbjMyCi0uRU5ESUYKLQotIyBTZXQgdGhlIGNvbXBpbGVyIHdhcm5pbmcgbGV2ZWwKLS5JRiAkKE1BWF9XQVJOKQotICAgQ0ZMQUdTICAgICAgICs9IC1XMwotLkVMU0UKLSAgIENGTEFHUyAgICAgICArPSAtVzEKLS5FTkRJRgotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLS5JRiAkKERCRykKLSAgIENGTEFHUyAgICAgICArPSAvWWQgL1ppICAjIFR1cm4gb24gZGVidWdnaW5nIGZvciBDIGNvbXBpbGVyCi0uSUYgJChVU0VfVEFTTSkKLSAgIEFTRkxBR1MgICAgICArPSAvemkgICAgICAjIFR1cm4gb24gZGVidWdnaW5nIGZvciBhc3NlbWJsZXIKLS5FTkRJRgotLkVMU0UKLS5JRiAkKFVTRV9UQVNNKQotICAgQVNGTEFHUyAgICAgICs9IC9xICAgICAgICMgU3VwcHJlc3Mgb2JqZWN0IHJlY29yZHMgbm90IG5lZWRlZCBmb3IgbGlua2luZwotLkVORElGCi0uRU5ECi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIG9wdGltaXNhdGlvbnMKLS5JRiAkKFZDX0xJQkJBU0UpID09IHZjNQotLklGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC9HNiAvTzIgL094IC9PaS0KLS5FTElGICQoT1BUX1NJWkUpCi0gICBDRkxBR1MgICAgICAgKz0gL0c2IC9PMQotLkVORAotLkVMU0UKLS5JRiAkKE9QVCkKLSAgIENGTEFHUyAgICAgICArPSAvRzUgL08yIC9PeAotLkVMSUYgJChPUFRfU0laRSkKLSAgIENGTEFHUyAgICAgICArPSAvRzUgL08xCi0uRU5ECi0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGlyZWN0IGkzODcgRlBVIGluc3RydWN0aW9ucwotCi0uSUYgJChGUFUpCi0gICBDRkxBR1MgICAgICAgKz0gL0RGUFUzODcKLSAgIEFTRkxBR1MgICAgICArPSAtZEZQVTM4NwotLkVORAotCi0jIE9wdGlvbmFsbHkgY29tcGlsZSBhIGJldGEgcmVsZWFzZSB2ZXJzaW9uIG9mIGEgcHJvZHVjdAotLklGICQoQkVUQSkKLSAgIENGTEFHUyAgICAgICArPSAvREJFVEEKLSAgIEFTRkxBR1MgICAgICArPSAtZEJFVEEKLS5FTkQKLQotIyBVc2UgYSBsYXJnZXIgc3RhY2sgZHVyaW5nIGxpbmtpbmcgaWYgcmVxdWVzdGVkLCBvciB1c2UgYSBkZWZhdWx0IHN0YWNrCi0jIG9mIDUway4gVGhlIHVzdWFsIGRlZmF1bHQgc3RhY2sgcHJvdmlkZWQgYnkgVmlzdWFsIEMrKyBpcyAqd2F5KiB0byBzbWFsbAotIyBmb3IgcmVhbCAzMiBiaXQgY29kZSBkZXZlbG9wbWVudC4KLQotLklGICQoVVNFX1dJTjMyKQotCSMgTm90IG5lY2Vzc2FyeSBmb3IgV2luMzIgY29kZS4KLS5FTFNFCi0uSUYgJChTVEtTSVpFKQotCUxERU5ERkxBR1MgICs9IC9TVEFDSzokKFNUS1NJWkUpCi0uRUxTRQotCUxERU5ERkxBR1MgICs9IC9TVEFDSzo1MTIwMAotLkVORElGCi0uRU5ESUYKLQotIyBET1MgZXh0ZW5kZXIgZGVwZW5kYW50IGZsYWdzCi0uSUYgJChVU0VfTlREUlYpCQkJCSMgQnVpbGQgMzIgYml0IFdpbmRvd3MgTlQgZHJpdmVyCi0gICBDRkxBR1MgICAgICAgKz0gL0xEIC9abCAvR3kgL0d6IC9HRiAvRF9fTlRfRFJJVkVSX18gL0RfWDg2Xz0xIC9EaTM4Nj0xCi0uSUYgJChEQkcpCi0gICBDRkxBR1MgICAgICAgKz0gL1FJZgotLkVORElGCi0gICBBU0ZMQUdTICAgICAgKz0KLSAgIERFRl9MSUJTCQk6PSBpbnQ2NC5saWIgbnRvc2tybmwubGliIGhhbC5saWIKLSAgIERYX0FTRkxBR1MgICArPSAtZF9fTlRfRFJJVkVSX18KLS5JRiAkKFVTRV9XMktEUlYpCQkJCSMgQnVpbGQgMzIgYml0IFdpbmRvd3MgMjAwMCBkcml2ZXIKLSAgIExJQl9PUyAgICAgICA9IFcyS0RSVgotLkVMU0UKLSAgIExJQl9PUyAgICAgICA9IE5URFJWCi0uRU5ESUYKLS5FTElGICQoVVNFX1dJTjMyKSAgICAgICAgICAgICAgIyBCdWlsZCAzMiBiaXQgV2luZG93cyBOVCBhcHAKLS5JRiAkKFdJTjMyX0dVSSkKLS5FTFNFCi0gICAgQ0ZMQUdTICAgICAgICs9IC1EX19DT05TT0xFX18KLS5FTkRJRgotLklGICQoQlVJTERfRExMKQotICAgQ0ZMQUdTICAgICAgICs9IC9NVCAvTEQgL0RCVUlMRF9ETEwKLSAgIEFTRkxBR1MgICAgICArPSAtZEJVSUxEX0RMTAotLklGICQoTk9fUlVOVElNRSkKLSAgIExERU5ERkxBR1MgICArPSAvTk9ERUZBVUxUTElCCi0gICBDRkxBR1MgCQkrPSAvWmwKLSAgIERFRl9MSUJTCQk6PQotLkVMU0UKLSAgIERFRl9MSUJTCQk6PSBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIHdpbm1tLmxpYiBjb21kbGczMi5saWIgY29tY3RsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdmVyc2lvbi5saWIgd2luc3Bvb2wubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIHdzb2NrMzIubGliIHJwY3J0NC5saWIKLS5FTkRJRgotLkVMU0UKLSAgIENGTEFHUyAgICAgICArPSAvTVQKLSAgIERFRl9MSUJTCQk6PSBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIHdpbm1tLmxpYiBjb21kbGczMi5saWIgY29tY3RsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdmVyc2lvbi5saWIgd2luc3Bvb2wubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIHdzb2NrMzIubGliIHJwY3J0NC5saWIKLS5FTkRJRgotICAgRFhfQVNGTEFHUyAgICs9IC1kX19XSU5ET1dTMzJfXwotICAgTElCX09TICAgICAgID0gV0lOMzIKLS5FTElGICQoVVNFX1JUVEFSR0VUKQotICAgQ0ZMQUdTICAgICAgICs9IC1EX19SVFRBUkdFVF9fCi0gICBEWF9DRkxBR1MgICAgKz0KLSAgIERYX0FTRkxBR1MgICArPSAtZF9fUlRUQVJHRVRfXwotICAgVVNFX1JFQUxET1MJOj0KLSAgIExJQl9PUyAgICAgICA9IFJUVDMyCi0gICBERUZfTElCUyAgICAgOj0gY3czMm10LmxpYgotLkVMU0UKLSAgIFVTRV9UTlQgICAgICA6PSAxCi0gICBVU0VfUkVBTERPUwk6PSAxCi0gICBDRkxBR1MgICAgICAgKz0gL01UIC9EX19NU0RPUzMyX18KLSAgIERYX0NGTEFHUyAgICArPSAtRFROVAotICAgRFhfQVNGTEFHUyAgICs9IC1kVE5UCi0gICBMSUJfT1MgICAgICAgPSBET1MzMgotICAgREVGX0xJQlMJCTo9IGRvc3gzMi5saWIgdG50YXBpLmxpYgotLkVORElGCi0KLSMgRGVmaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbGlicmFyeSBmaWxlcwotCi0uSUYgJChDSEVDS0VEKQotTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxkZWJ1ZwotQ0ZMQUdTCQkJKz0gL0RDSEVDS0VEPTEKLS5FTFNFCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXHJlbGVhc2UKLS5FTkRJRgotCi0jIERlZmluZSB3aGVyZSB0byBpbnN0YWxsIGxpYnJhcnkgZmlsZXMKLSAgIExJQl9CQVNFICAgICA6PSAkKExJQl9CQVNFX0RJUilcJChMSUJfT1MpXCQoVkNfTElCQkFTRSkKLSAgIExJQl9ERVNUICAgICA6PSAkKExJQl9CQVNFKQotCi0jIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKLQotLklGICQoVVNFX1ROVCkKLVBNTElCICAgICAgICAgICA6PSAkKExJQl9CQVNFOnMvXC9cXClcXHRudFxccG0ubGliCi0uRUxTRQotUE1MSUIgICAgICAgICAgIDo9ICQoTElCX0JBU0U6cy9cL1xcKVxccG0ubGliCi0uRU5ESUYKLQotIyBEZWZpbmUgd2hpY2ggZmlsZSBjb250YWlucyBvdXIgcnVsZXMKLQotICAgUlVMRVNfTUFLCTo9IHZjMzIubWsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvd2MxNi5tayBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvbWFrZWRlZnMvd2MxNi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMxNmY0Yy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3djMTYubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCVNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotIyAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotIyAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSMgICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0jCi0jICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0jICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotIyAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIERNQUtFIHN0YXJ0dXAgbWFrZWZpbGUgZGVmaW5pdGlvbnMgZmlsZS4gQXNzdW1lcwotIyAgICAgICAgICAgICAgIHRoYXQgdGhlIFNDSVRFQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gc2V0IHRvIHBvaW50Ci0jICAgICAgICAgICAgICAgdG8gd2hlcmUgYWxsIG91ciBzdHVmZiBpcyBpbnN0YWxsZWQuIFlvdSBzaG91bGQgbm90IG5lZWQKLSMgICAgICAgICAgICAgICB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhpcyBmaWxlLgotIwotIyAgICAgICAgICAgICAgIFdhdGNvbSBDKysgMTAueCAxNiBiaXQgdmVyc2lvbi4gU3VwcG9ydHMgMTYtYml0IERPUywKLSMgICAgICAgICAgICAgICAxNi1iaXQgV2luZG93cyBkZXZlbG9wbWVudCBhbmQgMTYtYml0IE9TLzIgZGV2ZWxvcG1lbnQuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKLS5JTVBPUlQ6IFNDSVRFQ0gKLS5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgotCi0jIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKLS5JTVBPUlQgLklHTk9SRSA6IFdDX0xJQkJBU0UgVVNFX1dJTjE2IFVTRV9PUzIxNiBVU0VfT1MyR1VJCi0KLSMgRGVmYXVsdCBjb21tYW5kcyBmb3IgY29tcGlsaW5nLCBhc3NlbWJsaW5nIGxpbmtpbmcgYW5kIGFyY2hpdmluZwotICAgQ0MgICAgICAgICAgIDo9IHdjYyAgICAgICMgQy1jb21waWxlciBhbmQgZmxhZ3MKLSAgIENQUCAgICAgICAgICA6PSB3cHAgICAgICAjIEMrKy1jb21waWxlciBhbmQgZmxhZ3MKLSAgIENGTEFHUyAgICAgICA6PSAtbWwtenEtai13Mi1zLWZoIC1maHEKLS5JRiAkKFVTRV9UQVNNMzIpCi0gICBBUyAgICAgICAgICAgOj0gdGFzbTMyCi0uRUxJRiAkKFVTRV9UQVNNWCkKLSAgIEFTICAgICAgICAgICA6PSB0YXNteCAgICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKLS5FTFNFCi0gICBBUyAgICAgICAgICAgOj0gdGFzbSAgICAgIyBBc3NlbWJsZXIgYW5kIGZsYWdzCi0uRU5ESUYKLSAgIEFTICAgICAgICAgICA6PSB0YXNtICAgICAjIEFzc2VtYmxlciBhbmQgZmxhZ3MKLSAgIEFTRkxBR1MgICAgICA6PSAvdCAvbXggL20gL0RfX0xBUkdFX18gL2lJTkNMVURFIC9pJChTQ0lURUNIKVxJTkNMVURFCi0gICBMRCAgICAgICAgICAgOj0gd2xpbmsgICAgIyBMb2FkZXIgYW5kIGZsYWdzCi0gICBMREZMQUdTICAgICAgID0KLSAgIFJDICAgICAgICAgICA6PSB3cmMgICAgICAjIFdhdGNvbSByZXNvdXJjZSBjb21waWxlcgotICAgUkNGTEFHUyAgICAgIDo9IC9idD13aW5kb3dzCi0gICBMSUIgICAgICAgICAgOj0gd2xpYiAgICAgIyBMaWJyYXJpYW4KLSAgIExJQkZMQUdTICAgICA6PSAtcQotICAgSUxJQiAgICAgICAgIDo9IHdsaWIgICAgICMgSW1wb3J0IGxpYnJhcmlhbgotICAgSUxJQkZMQUdTICAgIDo9IC1jCi0KLSMgT3B0aW9uYWxseSB0dXJuIG9uIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotLklGICQoREJHKQotICAgQ0ZMQUdTICAgICAgICs9IC1kMiAgICAgICMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIEMgY29tcGlsZXIKLSAgIExJQkZMQUdTICAgICArPSAtcD0xMjggICAjIExhcmdlciBwYWdlIHNpemUgZm9yIGxpYnJhcmllcyB3aXRoIGRlYnVnIGluZm8hCi0gICBBU0ZMQUdTICAgICAgKz0gL3ppICAgICAgIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgYXNzZW1ibGVyCi0gICBMREZMQUdTICAgICAgKz0gRCBBICAgICAgIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgbGlua2VyCi0uRUxTRQotICAgQVNGTEFHUyAgICAgICs9IC9xICAgICAgICMgU3VwcHJlc3Mgb2JqZWN0IHJlY29yZHMgbm90IG5lZWRlZCBmb3IgbGlua2luZwotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBvcHRpbWlzYXRpb25zCi0uSUYgJChPUFQpCi0gICBDRkxBR1MgICAgICAgKz0gLW9uYXR4LTUKLS5FTElGICQoT1BUX1NJWkUpCi0gICBDRkxBR1MgICAgICAgKz0gLW9uYXNsbXItNQotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zIG9wdGltaXNlZCBmb3IgUGVudGl1bQotCi0uSUYgJChGUFUpCi0gICBDRkxBR1MgICAgICAgKz0gLWZwaTg3LWZwNS1ERlBVMzg3Ci0gICBBU0ZMQUdTICAgICAgKz0gLURGUFUzODcKLS5FTkQKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKLS5JRiAkKEJFVEEpCi0gICBDRkxBR1MgICAgICAgKz0gLURCRVRBCi0gICBBU0ZMQUdTICAgICAgKz0gLURCRVRBCi0uRU5ECi0KLSMgVXNlIGEgbGFyZ2VyIHN0YWNrIGR1cmluZyBsaW5raW5nIGlmIHJlcXVlc3RlZAotCi0uSUYgJChTVEtTSVpFKQotICAgIExERkxBR1MgICAgICs9IE9QIFNUQUNLPSQoU1RLU0laRSkKLS5FTkRJRgotCi0uSUYgJChVU0VfT1MyMTYpCi0uSUYgJChCVUlMRF9ETEwpCi0gICAgQ0ZMQUdTICAgICAgICs9IC1iZC1idD1vczItREJVSUxEX0RMTAotICAgIEFTRkxBR1MgICAgICArPSAtREJVSUxEX0RMTAotLkVMU0UKLSAgICBDRkxBR1MgICAgICAgKz0gLWJ0PW9zMgotLkVORElGCi0gICAgRFhfQVNGTEFHUyAgICs9IC1EX19PUzIxNl9fCi0gICAgTElCX09TICAgICAgID0gb3MyMTYKLS5FTElGICQoVVNFX1dJTjE2KQotLklGICQoQlVJTERfRExMKQotICAgIENGTEFHUyAgICAgICArPSAtYmQtYnQ9d2luZG93cy1EX1dJTkRPV1MtREJVSUxEX0RMTAotICAgIEFTRkxBR1MgICAgICArPSAtREJVSUxEX0RMTAotLkVMU0UKLSAgICBDRkxBR1MgICAgICAgKz0gLWJ0PXdpbmRvd3MtRF9XSU5ET1dTCi0uRU5ESUYKLSAgICBEWF9BU0ZMQUdTICAgKz0gLURfX1dJTkRPV1MxNl9fCi0gICAgTElCX09TICAgICAgID0gV0lOMTYKLS5FTFNFCi0gICAgVVNFX1JFQUxET1MgIDo9IDEKLQlMSUJfT1MgICAgICAgPSBET1MxNgotLkVORAotCi0jIFBsYWNlIHRvIGxvb2sgZm9yIFBNT0RFIGxpYnJhcnkgZmlsZXMKLQotUE1MSUIgICAgICAgICAgIDo9IHBtLmxpYiwKLQotIyBEZWZpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJ5IGZpbGVzCi0KLS5JRiAkKENIRUNLRUQpCi1MSUJfQkFTRV9ESVIJOj0gJChTQ0lURUNIX0xJQilcbGliXGRlYnVnCi1DRkxBR1MJCQkrPSAtRENIRUNLRUQ9MQotLkVMU0UKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJccmVsZWFzZQotLkVORElGCi0KLSMgRGVmaW5lIHdoZXJlIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcwotICAgTElCX0JBU0UgICAgIDo9ICQoTElCX0JBU0VfRElSKVwkKExJQl9PUylcJChXQ19MSUJCQVNFKQotICAgTElCX0RFU1QgICAgIDo9ICQoTElCX0JBU0UpCi0KLSMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCi0KLSAgIFJVTEVTX01BSwk6PSB3YzE2Lm1rCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3djMzIubWsgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL21ha2VkZWZzL3djMzIubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MTc1Y2EuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9tYWtlZGVmcy93YzMyLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jCQkJCQlTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSMgICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSMgICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0jICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotIwotIyAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotIyAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSMgICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMgICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIwotIyAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotIyAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgR2VuZXJpYyBETUFLRSBzdGFydHVwIG1ha2VmaWxlIGRlZmluaXRpb25zIGZpbGUuIEFzc3VtZXMKLSMgICAgICAgICAgICAgICB0aGF0IHRoZSBTQ0lURUNIIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBiZWVuIHNldCB0byBwb2ludAotIyAgICAgICAgICAgICAgIHRvIHdoZXJlIGFsbCBvdXIgc3R1ZmYgaXMgaW5zdGFsbGVkLiBZb3Ugc2hvdWxkIG5vdCBuZWVkCi0jICAgICAgICAgICAgICAgdG8gY2hhbmdlIGFueXRoaW5nIGluIHRoaXMgZmlsZS4KLSMKLSMgICAgICAgICAgICAgICBXYXRjb20gQysrIDEwLnggMzIgYml0IHZlcnNpb24uIFN1cHBvcnRzIFJhdGlvbmFsJ3MgRE9TNEdXCi0jICAgICAgICAgICAgICAgRE9TIEV4dGVuZGVyLCBQTU9ERS9XLCBDYXVzZXdheSwgRmxhc2hUZWsncyBYMzItVk0sCi0jICAgICAgICAgICAgICAgUGhhciBMYXAncyBUTlQgRE9TIEV4dGVuZGVyLCAzMi1iaXQgV2luZG93cyBkZXZlbG9wbWVudCBhbmQKLSMJCQkJMzItYml0IE9TLzIgZGV2ZWxvcG1lbnQuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEluY2x1ZGUgc3RhbmRhcmQgc3RhcnR1cCBzY3JpcHQgZGVmaW5pdGlvbnMKLS5JTVBPUlQ6IFNDSVRFQ0gKLS5JTkNMVURFOiAiJChTQ0lURUNIKVxtYWtlZGVmc1xzdGFydHVwLm1rIgotCi0jIEltcG9ydCBlbml2b3JubWVudCB2YXJpYWJsZXMgdGhhdCB3ZSB1c2UKLS5JTVBPUlQgLklHTk9SRSA6IFVTRV9UTlQgVVNFX1gzMiBVU0VfWDMyVk0gVVNFX1BNT0RFVyBTVEtDQUxMIFVTRV9DQVVTRVdBWQotLklNUE9SVCAuSUdOT1JFIDogVVNFX1dJTjM4NiBVU0VfT1MyMzIgVVNFX09TMkdVSSBXQ19MSUJCQVNFIE5PT1BUIERPU1NUWUxFCi0uSU1QT1JUIC5JR05PUkUgOiBPUzJfU0hFTEwgVVNFX0NPREVWSUVXIFVTRV9ET1MzMkEgVVNFX1FOWDQgTEVBVkVfTElOS0ZJTEUKLQotIyBXZSBhcmUgY29tcGlsaW5nIGZvciBhIDMyIGJpdCBlbnZpb25tZW50Ci0gICBfMzJCSVRfICAgICAgOj0gMQotCi0jIFNldHVwIHNwZWNpYWwgZW52aXJvbm1lbnQgZm9yIFFOWCA0IChVbml4J2lzaCkKLS5JRiAkKFVTRV9RTlg0KQotICAgVVNFX1FOWCAgICAJOj0gMQotICAgTCAgICAgICAgICAgIDo9IC5hICAgCSMgTGlicmFyaWVzCi0gICBMUCAgICAgICAgICAgOj0gbGliICAgICAgIyBMUCAtIExpYnJhcnkgZmlsZSBwcmVmaXggKG5hbWUgb2YgZmlsZSBvbiBkaXNrKQotICAgTEwgICAgICAgICAgIDo9IGxpYgkJIyBMaWJyYXJ5IGxpbmsgcHJlZml4IChuYW1lIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCi0gICBMRSAgICAgICAgICAgOj0gLmEJICAgICMgTGlicmFyeSBsaW5rIHN1ZmZpeCAoZXh0ZW5zaW9uIG9mIGxpYnJhcnkgb24gbGluayBjb21tYW5kIGxpbmUpCi0uRU5ESUYKLQotIyBEZWZhdWx0IGNvbW1hbmRzIGZvciBjb21waWxpbmcsIGFzc2VtYmxpbmcgbGlua2luZyBhbmQgYXJjaGl2aW5nCi0gICBDQyAgICAgICAgICAgOj0gd2NjMzg2Ci0gICBDUFAgICAgICAgICAgOj0gd3BwMzg2Ci0gICBDRkxBR1MgICAgICAgOj0gLXpxLWotcy1mcGk4NwotLklGICQoVVNFX05BU00pCi0gICBBUwkJCTo9IG5hc20KLSAgIEFTRkxBR1MgICAgICA6PSAtdCAtZiBvYmogLWRfX0ZMQVRfXyAtZFNURENBTExfTUFOR0xFIC1pSU5DTFVERSAtaSQoU0NJVEVDSClcSU5DTFVERQotLkVMU0UKLS5JRiAkKFVTRV9UQVNNMzIpCi0gICBBUyAgICAgICAgICAgOj0gdGFzbTMyCi0gICBETExfVEFTTSAgICAgOj0gdGFzbTMyCi0uRUxJRiAkKFVTRV9UQVNNWCkKLSAgIEFTICAgICAgICAgICA6PSB0YXNteAotICAgRExMX1RBU00gICAgIDo9IHRhc214Ci0uRUxTRQotICAgQVMgICAgICAgICAgIDo9IHRhc20KLSAgIERMTF9UQVNNICAgICA6PSB0YXNtCi0uRU5ESUYKLSAgIEFTRkxBR1MgICAgICA6PSAvdCAvbXggL20gL3ctcmVzIC93LW1jcCAvRF9fRkxBVF9fIC9EU1REQ0FMTF9NQU5HTEUgL2lJTkNMVURFIC9pJChTQ0lURUNIKVxJTkNMVURFCi0gICBHQVMJCQk6PSBnY2MKLSAgIEdBU19GTEFHUyAJOj0gLURfX1dBVENPTUNfXyAtRF9fU1dfM1MgLURfX1NXX1MgLVVfX0dOVUNfXyAtVURKR1BQIC1VX191bml4X18gLVdhbGwgLUkuIC1JJChTQ0lURUNIKVxpbmNsdWRlIC14IGFzc2VtYmxlci13aXRoLWNwcAotLkVORElGCi0gICBMRCAgICAgICAgICAgOj0gd2xpbmsKLSAgIExERkxBR1MgICAgICAgPQotLklGICQoVVNFX09TMjMyKQotICAgUkMgICAgICAgICAgIDo9IHJjCi0uRUxTRQotICAgUkMgICAgICAgICAgIDo9IHdyYwotLkVORElGCi0uSUYgJChVU0VfV0lOMzIpCi0gICBSQ0ZMQUdTICAgICAgOj0gLXEgL2J0PW50Ci0uRUxJRiAkKFVTRV9PUzIzMikKLS5JRiAkKFVTRV9PUzJHVUkpCi0gICBDRkxBR1MJCSs9IC1EX19PUzJfUE1fXwotLkVORElGCi0uRUxTRQotICAgUkNGTEFHUyAgICAgIDo9IC1xCi0uRU5ESUYKLSAgIExJQiAgICAgICAgICA6PSB3bGliCi0gICBMSUJGTEFHUyAgICAgOj0gLXEKLSAgIElMSUIgICAgICAgICA6PSB3bGliCi0gICBJTElCRkxBR1MgICAgOj0gLWMKLSAgIElOVEVMX1g4Ngk6PSAxCi0KLSMgU2V0IHRoZSBjb21waWxlciB3YXJuaW5nIGxldmVsCi0uSUYgJChNQVhfV0FSTikKLSAgIENGTEFHUyAgICAgICArPSAtdzQKLS5FTFNFCi0gICBDRkxBR1MgICAgICAgKz0gLXcxCi0uRU5ESUYKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gZGVidWdnaW5nIGluZm9ybWF0aW9uIChDb2RldmlldyBmb3JtYXQpCi0uSUYgJChEQkcpCi0uSUYgJChVU0VfV0lOMzIpCi0uSUYgJChVU0VfQ09ERVZJRVcpCi0gICBDRkxBR1MgICAgICAgKz0gLWQyIC1oYwotICAgTERGTEFHUyAgICAgICs9IEQgQ09ERVZJRVcgT1BUIENWUEFDSwotLkVMU0UKLSAgIENGTEFHUyAgICAgICArPSAtZDIKLSAgIExERkxBR1MJCSs9IEQgQQotLkVORElGCi0uRUxTRQotICAgQ0ZMQUdTICAgICAgICs9IC1kMgotICAgTERGTEFHUwkJKz0gRCBBCi0uRU5ESUYKLSAgIExJQkZMQUdTICAgICArPSAtcD03NjgKLS5JRiAkKFVTRV9OQVNNKQotICAgQVNGTEFHUyAgICAgICs9IC1GIGJvcmxhbmQgLWcKLS5FTFNFCi0uSUYgJChVU0VfVEFTTTMyKQotICAgQVNGTEFHUyAgICAgICs9IC9xCQkjIFRBU00zMiBmdWNrcyB1cCBXYXRjb20gQysrIGRlYnVnIGluZm8KLS5FTElGICQoT1MyX1NIRUxMKQotICAgQVNGTEFHUyAgICAgICs9IC9xCQkjIFRBU00gZm9yIE9TLzIgZnVja3MgdXAgV2F0Y29tIEMrKyBkZWJ1ZyBpbmZvCi0uRUxTRQotICAgQVNGTEFHUyAgICAgICs9IC96aQotLkVORElGCi0uRU5ESUYKLS5FTFNFCi0uSUYgJChVU0VfTkFTTSkKLSAgIEFTRkxBR1MgICAgICArPSAtRiBudWxsCi0uRUxTRQotICAgQVNGTEFHUyAgICAgICs9IC9xCi0uRU5ESUYKLS5FTkQKLQotIyBPcHRpb25hbGx5IHR1cm4gb24gb3B0aW1pc2F0aW9ucyAod2l0aCBvciB3aXRob3V0IHN0YWNrIGNvbnZlbnRpb25zKQotLklGICQoU1RLQ0FMTCkKLS5JRiAkKE9QVCkKLSAgIENGTEFHUyAgICAgICArPSAtb25hdHgtNXMtZnA1Ci0uRUxJRiAkKE9QVF9TSVpFKQotICAgQ0ZMQUdTICAgICAgICs9IC1vbmFzbG1yLTVzLWZwNQotLkVMSUYgJChOT09QVCkKLSAgIENGTEFHUyAgICAgICArPSAtb2QtNXMKLS5FTFNFCi0gICBDRkxBR1MgICAgICAgKz0gLTNzCi0uRU5ECi0uRUxTRQotLklGICQoT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC1vbmF0eC01ci1mcDUKLS5FTElGICQoT1BUX1NJWkUpCi0gICBDRkxBR1MgICAgICAgKz0gLW9uYXNsbXItNXItZnA1Ci0uRUxJRiAkKE5PT1BUKQotICAgQ0ZMQUdTICAgICAgICs9IC1vZC01cgotLkVORAotLkVORAotCi0jIE9wdGlvbmFsbHkgdHVybiBvbiBkaXJlY3QgaTM4NyBGUFUgaW5zdHJ1Y3Rpb25zIG9wdGltaXNlZCBmb3IgUGVudGl1bQotLklGICQoRlBVKQotICAgQ0ZMQUdTICAgICAgICs9IC1ERlBVMzg3Ci0gICBBU0ZMQUdTICAgICAgKz0gLWRGUFUzODcKLS5FTkQKLQotIyBPcHRpb25hbGx5IGNvbXBpbGUgYSBiZXRhIHJlbGVhc2UgdmVyc2lvbiBvZiBhIHByb2R1Y3QKLS5JRiAkKEJFVEEpCi0gICBDRkxBR1MgICAgICAgKz0gLURCRVRBCi0gICBBU0ZMQUdTICAgICAgKz0gLWRCRVRBCi0uRU5ECi0KLS5JRiAkKFVTRV9UTlQpICAgICAgICAgICAgICAgICAgIyBVc2UgUGhhciBMYXAncyBUTlQgRE9TIEV4dGVuZGVyCi0JQ0ZMQUdTICAgICAgICs9IC1idD1udCAtRFROVAotCUFTRkxBR1MgICAJICs9IC1kVE5UCi0JTERGTEFHUyAgICAgICs9IFNZUyBOVCBPUCBTVFVCPUdPVE5ULkVYRQotCUxJQl9PUyAgICAgICA9IERPUzMyCi0uRUxJRiAkKFVTRV9YMzJWTSkgICAgICAgICAgICAgICMgVXNlIEZsYXNoVGVrIFgtMzJWTSBET1MgZXh0ZW5kZXIKLQlDRkxBR1MgICAgICAgKz0gLWJ0PWRvcwotCUxERkxBR1MgICAgICArPSBTWVMgWDMyUlYKLSAgICBEWF9DRkxBR1MgICAgKz0gLURYMzJWTQotCURYX0FTRkxBR1MgICArPSAtZFgzMlZNCi0gICAgTElCX09TICAgICAgID0gRE9TMzIKLS5FTElGICQoVVNFX1gzMikgICAgICAgICAgICAgICAgIyBVc2UgRmxhc2hUZWsgWC0zMiBET1MgZXh0ZW5kZXIKLQlDRkxBR1MgICAgICAgKz0gLWJ0PWRvcwotCUxERkxBR1MgICAgICArPSBTWVMgWDMyUgotICAgIERYX0NGTEFHUyAgICArPSAtRFgzMlZNCi0JRFhfQVNGTEFHUyAgICs9IC1kWDMyVk0KLSAgICBMSUJfT1MgICAgICAgPSBET1MzMgotLkVMSUYgJChVU0VfUU5YNCkgICAgICAgICAgICAgICAjIEJ1aWxkIFFOWCA0IGFwcAotCUNGTEFHUyAgICAgICArPSAtYnQ9cW54Mzg2Ci0JTERGTEFHUyAgICAgICs9IFNZUyBRTlgzODZGTEFUIE9QIENBU0VFWEFDVCBPUCBPRkZTRVQ9NDBrIE9QIFNUQUNLPTMyawotICAgIENGTEFHUyAgICAJICs9IC1EX19RTlhfXyAtRF9fVU5JWF9fCi0JQVNGTEFHUyAgIAkgKz0gLWRfX1FOWF9fIC1kX19VTklYX18KLSAgICBMSUJfT1MgICAgICAgPSBRTlg0Ci0uRUxJRiAkKFVTRV9PUzIzMikKLS5JRiAkKEJVSUxEX0RMTCkKLQlDRkxBR1MgICAgICAgKz0gLWJtLWJkLWJ0PW9zMi1zZy1EQlVJTERfRExMCi0JQVNGTEFHUyAgICAgICs9IC1kQlVJTERfRExMCi0uRUxTRQotCUNGTEFHUyAgICAgICArPSAtYm0tYnQ9b3MyLXNnCi0uRU5ESUYKLQlEWF9BU0ZMQUdTICAgKz0gLWRfX09TMl9fCi0gICAgTElCX09TICAgICAgID0gb3MyMzIKLS5FTElGICQoVVNFX1NOQVApICAgICAgICAgICAgICAgIyBCdWlsZCAzMiBiaXQgU25hcCBhcHAKLS5JRiAkKEJVSUxEX0RMTCkKLQlDRkxBR1MgICAgICAgKz0gLWJtLWJkLWJ0PW50LURCVUlMRF9ETEwKLQlBU0ZMQUdTICAgICAgKz0gLWRCVUlMRF9ETEwKLS5FTFNFCi0JQ0ZMQUdTICAgICAgICs9IC1ibS1idD1udC1EX1dJTjMyCi0uRU5ESUYKLQlMREZMQUdTCSAgICAgKz0gT1Agbm9kZWZhdWx0bGlicwotLklGICQoU1RLQ0FMTCkKLQlERUZMSUJTCQkgOj0gY2xpYjNzLmxpYixtYXRoM3MubGliLG5vZW11Mzg3LmxpYiwKLS5FTFNFCi0JREVGTElCUwkJIDo9IGNsaWIzci5saWIsbWF0aDNyLmxpYixub2VtdTM4Ny5saWIsCi0uRU5ESUYKLQlMSUJfT1MgICAgICAgPSBTTkFQCi0uRUxJRiAkKFVTRV9XSU4zMikgICAgICAgICAgICAgICMgQnVpbGQgMzIgYml0IFdpbmRvd3MgTlQgYXBwCi0uSUYgJChXSU4zMl9HVUkpCi0uRUxTRQotICAgIENGTEFHUyAgICAgICArPSAtRF9fQ09OU09MRV9fCi0uRU5ESUYKLS5JRiAkKEJVSUxEX0RMTCkKLQlDRkxBR1MgICAgICAgKz0gLWJtLWJkLWJ0PW50LXNnLURCVUlMRF9ETEwgLURfV0lOMzIKLQlBU0ZMQUdTICAgICAgKz0gLWRCVUlMRF9ETEwKLS5FTFNFCi0JQ0ZMQUdTICAgICAgICs9IC1ibS1idD1udC1zZy1EX1dJTjMyCi0uRU5ESUYKLQlEWF9BU0ZMQUdTICAgKz0gLWRfX1dJTkRPV1MzMl9fCi0JTElCX09TICAgICAgID0gV0lOMzIKLSAgICBERUZMSUJTCSAgICAgOj0ga2VybmVsMzIubGliLHVzZXIzMi5saWIsZ2RpMzIubGliLGFkdmFwaTMyLmxpYixzaGVsbDMyLmxpYix3aW5tbS5saWIsY29tZGxnMzIubGliLGNvbWN0bDMyLmxpYixvbGUzMi5saWIsb2xlYXV0MzIubGliLHZlcnNpb24ubGliLHdpbnNwb29sLmxpYix1dWlkLmxpYix3c29jazMyLmxpYixycGNydDQubGliLAotLkVMSUYgJChVU0VfV0lOMzg2KSAgICAgICAgICAgICAjIEJ1aWxkIDMyIGJpdCBXaW4zODYgZXh0ZW5kZWQgYXBwCi0uSUYgJChCVUlMRF9ETEwpCi0gICAgQ0ZMQUdTICAgICAgICs9IC1iZC1idD13aW5kb3dzLURCVUlMRF9ETEwKLQlBU0ZMQUdTICAgICAgKz0gLWRCVUlMRF9ETEwKLS5FTFNFCi0gICAgQ0ZMQUdTICAgICAgICs9IC1idD13aW5kb3dzCi0uRU5ESUYKLQlEWF9BU0ZMQUdTICAgKz0gLWRfX1dJTjM4Nl9fCi0gICAgTElCX09TICAgICAgID0gV0lOMzg2Ci0uRUxJRiAkKFVTRV9QTU9ERVcpICAgICAgICAgICAgICMgUE1PREUvVwotCUNGTEFHUyAgICAgICArPSAtYnQ9ZG9zCi0JVVNFX0RPUzRHVyAgIDo9IDEKLQlVU0VfUkVBTERPUyAgOj0gMQotCUxERkxBR1MgICAgICArPSBTWVMgUE1PREVXCi0JRFhfQ0ZMQUdTICAgICs9IC1ERE9TNEdXCi0JRFhfQVNGTEFHUyAgICs9IC1kRE9TNEdXCi0JTElCX09TICAgICAgID0gRE9TMzIKLS5FTElGICQoVVNFX0NBVVNFV0FZKSAgICAgICAgICAgIyBDYXVzZXdheQotCUNGTEFHUyAgICAgICArPSAtYnQ9ZG9zCi0JVVNFX0RPUzRHVyAgIDo9IDEKLQlVU0VfUkVBTERPUyAgOj0gMQotCUxERkxBR1MgICAgICArPSBTWVMgQ0FVU0VXQVkKLQlEWF9DRkxBR1MgICAgKz0gLURET1M0R1cKLQlEWF9BU0ZMQUdTICAgKz0gLWRET1M0R1cKLQlMSUJfT1MgICAgICAgPSBET1MzMgotLkVMSUYgJChVU0VfRE9TMzJBKSAgICAgICAgICAgICAjIERPUzMyL0EKLQlDRkxBR1MgICAgICAgKz0gLWJ0PWRvcwotCVVTRV9ET1M0R1cgICA6PSAxCi0JVVNFX1JFQUxET1MgIDo9IDEKLQlMREZMQUdTICAgICAgKz0gU1lTIERPUzMyQQotCURYX0NGTEFHUyAgICArPSAtRERPUzRHVwotCURYX0FTRkxBR1MgICArPSAtZERPUzRHVwotCUxJQl9PUyAgICAgICA9IERPUzMyCi0uRUxTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVXNlIERPUzRHVwotCUNGTEFHUyAgICAgICArPSAtYnQ9ZG9zCi0JVVNFX0RPUzRHVyAgIDo9IDEKLQlVU0VfUkVBTERPUyAgOj0gMQotCUxERkxBR1MgICAgICArPSBTWVMgRE9TNEcKLQlEWF9DRkxBR1MgICAgKz0gLURET1M0R1cKLQlEWF9BU0ZMQUdTICAgKz0gLWRET1M0R1cKLQlMSUJfT1MgICAgICAgPSBET1MzMgotLkVORAotCi0jIERpc2FibGUgbGlua2luZyB0byBkZWZhdWx0IEMgcnVudGltZSBsaWJyYXJ5IGFuZCBQTSBsaWJyYXJ5Ci0KLS5JRiAkKE5PX1JVTlRJTUUpCi1MREZMQUdTCQkJICs9IE9QIG5vZGVmYXVsdGxpYnMKLURFRkxJQlMgICAgICAgICAgOj0KLS5FTFNFCi0KLSMgUGxhY2UgdG8gbG9vayBmb3IgUE0gbGlicmFyeSBmaWxlcwotCi0uSUYgJChVU0VfU05BUCkgICAgICAgICAgICAgICAJIyBCdWlsZCAzMiBiaXQgU25hcCBhcHAgb3IgZGxsCi1QTUxJQiAgICAgICAgICAgOj0KLS5FTElGICQoVVNFX1dJTjMyKQotLklGICQoU1RLQ0FMTCkKLVBNTElCICAgICAgICAgICA6PSBzcG0ubGliLAotLkVMU0UKLVBNTElCICAgICAgICAgICA6PSBwbS5saWIsCi0uRU5ESUYKLS5FTElGICQoVVNFX09TMjMyKQotLklGICQoU1RLQ0FMTCkKLS5JRiAkKFVTRV9PUzJHVUkpCi1QTUxJQiAgICAgICAgICAgOj0gc3BtX3BtLmxpYiwKLS5FTFNFCi1QTUxJQiAgICAgICAgICAgOj0gc3BtLmxpYiwKLS5FTkRJRgotLkVMU0UKLS5JRiAkKFVTRV9PUzJHVUkpCi1QTUxJQiAgICAgICAgICAgOj0gcG1fcG0ubGliLAotLkVMU0UKLVBNTElCICAgICAgICAgICA6PSBwbS5saWIsCi0uRU5ESUYKLS5FTkRJRgotLkVMSUYgJChVU0VfUU5YNCkKLS5JRiAkKFNUS0NBTEwpCi1QTUxJQiAgICAgICAgICAgOj0gbGlic3BtLmEsCi0uRUxTRQotUE1MSUIgICAgICAgICAgIDo9IGxpYnBtLmEsCi0uRU5ESUYKLS5FTElGICQoVVNFX1ROVCkKLS5JRiAkKFNUS0NBTEwpCi1QTUxJQiAgICAgICAgICAgOj0gdG50XHNwbS5saWIsCi0uRUxTRQotUE1MSUIgICAgICAgICAgIDo9IHRudFxwbS5saWIsCi0uRU5ESUYKLS5FTElGICQoVVNFX1gzMikKLS5JRiAkKFNUS0NBTEwpCi1QTUxJQiAgICAgICAgICAgOj0geDMyXHNwbS5saWIsCi0uRUxTRQotUE1MSUIgICAgICAgICAgIDo9IHgzMlxwbS5saWIsCi0uRU5ESUYKLS5FTFNFCi0uSUYgJChTVEtDQUxMKQotUE1MSUIgICAgICAgICAgIDo9IGRvczRnd1xzcG0ubGliLAotLkVMU0UKLVBNTElCICAgICAgICAgICA6PSBkb3M0Z3dccG0ubGliLAotLkVORElGCi0uRU5ESUYKLS5FTkRJRgotCi0jIERlZmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIGxpYnJhcnkgZmlsZXMKLQotLklGICQoQ0hFQ0tFRCkKLUxJQl9CQVNFX0RJUgk6PSAkKFNDSVRFQ0hfTElCKVxsaWJcZGVidWcKLUNGTEFHUwkJCSs9IC1EQ0hFQ0tFRD0xCi0uRUxTRQotTElCX0JBU0VfRElSCTo9ICQoU0NJVEVDSF9MSUIpXGxpYlxyZWxlYXNlCi0uRU5ESUYKLQotIyBEZWZpbmUgd2hlcmUgdG8gaW5zdGFsbCBsaWJyYXJ5IGZpbGVzCi0gICBMSUJfQkFTRSAgICAgOj0gJChMSUJfQkFTRV9ESVIpXCQoTElCX09TKVwkKFdDX0xJQkJBU0UpCi0gICBMSUJfREVTVCAgICAgOj0gJChMSUJfQkFTRSkKLQotICAgIExERkxBR1MgKz0gb3AgbWFwCi0KLSMgRGVmaW5lIHdoaWNoIGZpbGUgY29udGFpbnMgb3VyIHJ1bGVzCi0KLSAgIFJVTEVTX01BSwk6PSB3YzMyLm1rCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L2Jlc3lzLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L2Jlc3lzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MTJjZTkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvYmlvc2VtdS9iZXN5cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgQklPUyBlbXVsYXRvciBhbmQgaW50ZXJmYWNlCi0qICAgICAgICAgICAgICAgICAgICAgIHRvIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAotKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0qICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCi0qICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCi0qICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubwotKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KLSogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0qCi0qICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0qICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi0qICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLSogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKLSoKLSogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgaW5jbHVkZXMgQklPUyBlbXVsYXRvciBJL08gYW5kIG1lbW9yeSBhY2Nlc3MKLSogICAgICAgICAgICAgICBmdW5jdGlvbnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYmlvc2VtdWkuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogTWFjcm9zIHRvIHJlYWQgYW5kIHdyaXRlIHZhbHVlcyB0byB4ODYgYnVzIG1lbW9yeS4gUmVwbGFjZSB0aGVzZSBhcwotICogbmVjZXNzYXJ5IGlmIHlvdSBuZWVkIHRvIGRvIHNvbWV0aGluZyBzcGVjaWFsIHRvIGFjY2VzcyBtZW1vcnkgb3ZlcgotICogdGhlIGJ1cyBvbiBhIHBhcnRpY3VsYXIgcHJvY2Vzc29yIGZhbWlseS4KLSAqLwotCi0jZGVmaW5lIHJlYWRiKGJhc2Usb2ZmKSAgICAgKigodTgqKSgodTMyKShiYXNlKSArIChvZmYpKSkKLSNkZWZpbmUgcmVhZHcoYmFzZSxvZmYpICAgICAqKCh1MTYqKSgodTMyKShiYXNlKSArIChvZmYpKSkKLSNkZWZpbmUgcmVhZGwoYmFzZSxvZmYpICAgICAqKCh1MzIqKSgodTMyKShiYXNlKSArIChvZmYpKSkKLSNkZWZpbmUgd3JpdGViKHYsYmFzZSxvZmYpICAqKCh1OCopKCh1MzIpKGJhc2UpICsgKG9mZikpKSA9ICh2KQotI2RlZmluZSB3cml0ZXcodixiYXNlLG9mZikgICooKHUxNiopKCh1MzIpKGJhc2UpICsgKG9mZikpKSA9ICh2KQotI2RlZmluZSB3cml0ZWwodixiYXNlLG9mZikgICooKHUzMiopKCh1MzIpKGJhc2UpICsgKG9mZikpKSA9ICh2KQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgREVCVUcKLSMgZGVmaW5lIERFQlVHX01FTSgpICAgICAgICAoTS54ODYuZGVidWcgJiBERUJVR19NRU1fVFJBQ0VfRikKLSNlbHNlCi0jIGRlZmluZSBERUJVR19NRU0oKQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYWRkciAgICAtIEVtdWxhdG9yIG1lbW9yeSBhZGRyZXNzIHRvIHJlYWQKLQotUkVUVVJOUzoKLUJ5dGUgdmFsdWUgcmVhZCBmcm9tIGVtdWxhdG9yIG1lbW9yeS4KLQotUkVNQVJLUzoKLVJlYWRzIGEgYnl0ZSB2YWx1ZSBmcm9tIHRoZSBlbXVsYXRvciBtZW1vcnkuIFdlIGhhdmUgdGhyZWUgZGlzdGluY3QgbWVtb3J5Ci1yZWdpb25zIHRoYXQgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIHdoaWNoIHRoaXMgZnVuY3Rpb24gaGFuZGxlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBYODZBUEkgQkVfcmRiKAotICAgIHUzMiBhZGRyKQotewotICAgIHU4IHZhbCA9IDA7Ci0KLSAgICBpZiAoYWRkciA+PSAweEMwMDAwICYmIGFkZHIgPD0gX0JFX2Vudi5iaW9zbWVtX2xpbWl0KSB7Ci0JdmFsID0gKih1OCopKF9CRV9lbnYuYmlvc21lbV9iYXNlICsgYWRkciAtIDB4QzAwMDApOwotCX0KLSAgICBlbHNlIGlmIChhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEZGRkZGKSB7Ci0JdmFsID0gcmVhZGIoX0JFX2Vudi5idXNtZW1fYmFzZSwgYWRkciAtIDB4QTAwMDApOwotCX0KLSAgICBlbHNlIGlmIChhZGRyID4gTS5tZW1fc2l6ZSAtIDEpIHsKLURCKCAgICAgcHJpbnRrKCJtZW1fcmVhZDogYWRkcmVzcyAlI2x4IG91dCBvZiByYW5nZSFcbiIsIGFkZHIpOykKLQlIQUxUX1NZUygpOwotCX0KLSAgICBlbHNlIHsKLQl2YWwgPSAqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIpOwotCX0KLURCKCBpZiAoREVCVUdfTUVNKCkpCi0JcHJpbnRrKCIlIzA4eCAxIC0+ICUjeFxuIiwgYWRkciwgdmFsKTspCi0gICAgcmV0dXJuIHZhbDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1hZGRyICAgIC0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAotCi1SRVRVUk5TOgotV29yZCB2YWx1ZSByZWFkIGZyb20gZW11bGF0b3IgbWVtb3J5LgotCi1SRU1BUktTOgotUmVhZHMgYSB3b3JkIHZhbHVlIGZyb20gdGhlIGVtdWxhdG9yIG1lbW9yeS4gV2UgaGF2ZSB0aHJlZSBkaXN0aW5jdCBtZW1vcnkKLXJlZ2lvbnMgdGhhdCBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgd2hpY2ggdGhpcyBmdW5jdGlvbiBoYW5kbGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiBYODZBUEkgQkVfcmR3KAotICAgIHUzMiBhZGRyKQotewotICAgIHUxNiB2YWwgPSAwOwotCi0gICAgaWYgKGFkZHIgPj0gMHhDMDAwMCAmJiBhZGRyIDw9IF9CRV9lbnYuYmlvc21lbV9saW1pdCkgewotI2lmZGVmIF9fQklHX0VORElBTl9fCi0JaWYgKGFkZHIgJiAweDEpIHsKLQkgICAgYWRkciAtPSAweEMwMDAwOwotCSAgICB2YWwgPSAoICoodTgqKShfQkVfZW52LmJpb3NtZW1fYmFzZSArIGFkZHIpIHwKLQkJICAgKCoodTgqKShfQkVfZW52LmJpb3NtZW1fYmFzZSArIGFkZHIgKyAxKSA8PCA4KSk7Ci0JICAgIH0KLQllbHNlCi0jZW5kaWYKLQkgICAgdmFsID0gKih1MTYqKShfQkVfZW52LmJpb3NtZW1fYmFzZSArIGFkZHIgLSAweEMwMDAwKTsKLQl9Ci0gICAgZWxzZSBpZiAoYWRkciA+PSAweEEwMDAwICYmIGFkZHIgPD0gMHhGRkZGRikgewotI2lmZGVmIF9fQklHX0VORElBTl9fCi0JaWYgKGFkZHIgJiAweDEpIHsKLQkgICAgYWRkciAtPSAweEEwMDAwOwotCSAgICB2YWwgPSAoIHJlYWRiKF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIpIHwKLQkJICAgKHJlYWRiKF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIgKyAxKSA8PCA4KSk7Ci0JICAgIH0KLQllbHNlCi0jZW5kaWYKLQkgICAgdmFsID0gcmVhZHcoX0JFX2Vudi5idXNtZW1fYmFzZSwgYWRkciAtIDB4QTAwMDApOwotCX0KLSAgICBlbHNlIGlmIChhZGRyID4gTS5tZW1fc2l6ZSAtIDIpIHsKLURCKCAgICAgcHJpbnRrKCJtZW1fcmVhZDogYWRkcmVzcyAlI2x4IG91dCBvZiByYW5nZSFcbiIsIGFkZHIpOykKLQlIQUxUX1NZUygpOwotCX0KLSAgICBlbHNlIHsKLSNpZmRlZiBfX0JJR19FTkRJQU5fXwotCWlmIChhZGRyICYgMHgxKSB7Ci0JICAgIHZhbCA9ICggKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyKSB8Ci0JCSAgICgqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAxKSA8PCA4KSk7Ci0JICAgIH0KLQllbHNlCi0jZW5kaWYKLQkgICAgdmFsID0gKih1MTYqKShNLm1lbV9iYXNlICsgYWRkcik7Ci0JfQotREIoIGlmIChERUJVR19NRU0oKSkKLQlwcmludGsoIiUjMDh4IDIgLT4gJSN4XG4iLCBhZGRyLCB2YWwpOykKLSAgICByZXR1cm4gdmFsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWFkZHIgICAgLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCi0KLVJFVFVSTlM6Ci1Mb25nIHZhbHVlIHJlYWQgZnJvbSBlbXVsYXRvciBtZW1vcnkuCi0KLVJFTUFSS1M6Ci1SZWFkcyBhIGxvbmcgdmFsdWUgZnJvbSB0aGUgZW11bGF0b3IgbWVtb3J5LiBXZSBoYXZlIHRocmVlIGRpc3RpbmN0IG1lbW9yeQotcmVnaW9ucyB0aGF0IGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LCB3aGljaCB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIFg4NkFQSSBCRV9yZGwoCi0gICAgdTMyIGFkZHIpCi17Ci0gICAgdTMyIHZhbCA9IDA7Ci0KLSAgICBpZiAoYWRkciA+PSAweEMwMDAwICYmIGFkZHIgPD0gX0JFX2Vudi5iaW9zbWVtX2xpbWl0KSB7Ci0jaWZkZWYgX19CSUdfRU5ESUFOX18KLQlpZiAoYWRkciAmIDB4MykgewotCSAgICBhZGRyIC09IDB4QzAwMDA7Ci0JICAgIHZhbCA9ICggKih1OCopKF9CRV9lbnYuYmlvc21lbV9iYXNlICsgYWRkciArIDApIHwKLQkJICAgKCoodTgqKShfQkVfZW52LmJpb3NtZW1fYmFzZSArIGFkZHIgKyAxKSA8PCA4KSB8Ci0JCSAgICgqKHU4KikoX0JFX2Vudi5iaW9zbWVtX2Jhc2UgKyBhZGRyICsgMikgPDwgMTYpIHwKLQkJICAgKCoodTgqKShfQkVfZW52LmJpb3NtZW1fYmFzZSArIGFkZHIgKyAzKSA8PCAyNCkpOwotCSAgICB9Ci0JZWxzZQotI2VuZGlmCi0JICAgIHZhbCA9ICoodTMyKikoX0JFX2Vudi5iaW9zbWVtX2Jhc2UgKyBhZGRyIC0gMHhDMDAwMCk7Ci0JfQotICAgIGVsc2UgaWYgKGFkZHIgPj0gMHhBMDAwMCAmJiBhZGRyIDw9IDB4RkZGRkYpIHsKLSNpZmRlZiBfX0JJR19FTkRJQU5fXwotCWlmIChhZGRyICYgMHgzKSB7Ci0JICAgIGFkZHIgLT0gMHhBMDAwMDsKLQkgICAgdmFsID0gKCByZWFkYihfQkVfZW52LmJ1c21lbV9iYXNlLCBhZGRyKSB8Ci0JCSAgIChyZWFkYihfQkVfZW52LmJ1c21lbV9iYXNlLCBhZGRyICsgMSkgPDwgIDgpIHwKLQkJICAgKHJlYWRiKF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIgKyAyKSA8PCAxNikgfAotCQkgICAocmVhZGIoX0JFX2Vudi5idXNtZW1fYmFzZSwgYWRkciArIDMpIDw8IDI0KSk7Ci0JICAgIH0KLQllbHNlCi0jZW5kaWYKLQkgICAgdmFsID0gcmVhZGwoX0JFX2Vudi5idXNtZW1fYmFzZSwgYWRkciAtIDB4QTAwMDApOwotCX0KLSAgICBlbHNlIGlmIChhZGRyID4gTS5tZW1fc2l6ZSAtIDQpIHsKLURCKCAgICAgcHJpbnRrKCJtZW1fcmVhZDogYWRkcmVzcyAlI2x4IG91dCBvZiByYW5nZSFcbiIsIGFkZHIpOykKLQlIQUxUX1NZUygpOwotCX0KLSAgICBlbHNlIHsKLSNpZmRlZiBfX0JJR19FTkRJQU5fXwotCWlmIChhZGRyICYgMHgzKSB7Ci0JICAgIHZhbCA9ICggKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMCkgfAotCQkgICAoKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMSkgPDwgOCkgfAotCQkgICAoKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMikgPDwgMTYpIHwKLQkJICAgKCoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDMpIDw8IDI0KSk7Ci0JICAgIH0KLQllbHNlCi0jZW5kaWYKLQkgICAgdmFsID0gKih1MzIqKShNLm1lbV9iYXNlICsgYWRkcik7Ci0JfQotREIoIGlmIChERUJVR19NRU0oKSkKLQlwcmludGsoIiUjMDh4IDQgLT4gJSN4XG4iLCBhZGRyLCB2YWwpOykKLSAgICByZXR1cm4gdmFsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWFkZHIgICAgLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCi12YWwgICAgIC0gVmFsdWUgdG8gc3RvcmUKLQotUkVNQVJLUzoKLVdyaXRlcyBhIGJ5dGUgdmFsdWUgdG8gZW11bGF0b3IgbWVtb3J5LiBXZSBoYXZlIHRocmVlIGRpc3RpbmN0IG1lbW9yeQotcmVnaW9ucyB0aGF0IGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LCB3aGljaCB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBYODZBUEkgQkVfd3JiKAotICAgIHUzMiBhZGRyLAotICAgIHU4IHZhbCkKLXsKLURCKCBpZiAoREVCVUdfTUVNKCkpCi0JcHJpbnRrKCIlIzA4eCAxIDwtICUjeFxuIiwgYWRkciwgdmFsKTspCi0gICAgaWYgKGFkZHIgPj0gMHhDMDAwMCAmJiBhZGRyIDw9IF9CRV9lbnYuYmlvc21lbV9saW1pdCkgewotCSoodTgqKShfQkVfZW52LmJpb3NtZW1fYmFzZSArIGFkZHIgLSAweEMwMDAwKSA9IHZhbDsKLQl9Ci0gICAgZWxzZSBpZiAoYWRkciA+PSAweEEwMDAwICYmIGFkZHIgPD0gMHhGRkZGRikgewotCXdyaXRlYih2YWwsIF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIgLSAweEEwMDAwKTsKLQl9Ci0gICAgZWxzZSBpZiAoYWRkciA+IE0ubWVtX3NpemUtMSkgewotREIoICAgICBwcmludGsoIm1lbV93cml0ZTogYWRkcmVzcyAlI2x4IG91dCBvZiByYW5nZSFcbiIsIGFkZHIpOykKLQlIQUxUX1NZUygpOwotCX0KLSAgICBlbHNlIHsKLQkqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIpID0gdmFsOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1hZGRyICAgIC0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAotdmFsICAgICAtIFZhbHVlIHRvIHN0b3JlCi0KLVJFTUFSS1M6Ci1Xcml0ZXMgYSB3b3JkIHZhbHVlIHRvIGVtdWxhdG9yIG1lbW9yeS4gV2UgaGF2ZSB0aHJlZSBkaXN0aW5jdCBtZW1vcnkKLXJlZ2lvbnMgdGhhdCBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgd2hpY2ggdGhpcyBmdW5jdGlvbiBoYW5kbGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgWDg2QVBJIEJFX3dydygKLSAgICB1MzIgYWRkciwKLSAgICB1MTYgdmFsKQotewotREIoIGlmIChERUJVR19NRU0oKSkKLQlwcmludGsoIiUjMDh4IDIgPC0gJSN4XG4iLCBhZGRyLCB2YWwpOykKLSAgICBpZiAoYWRkciA+PSAweEMwMDAwICYmIGFkZHIgPD0gX0JFX2Vudi5iaW9zbWVtX2xpbWl0KSB7Ci0jaWZkZWYgX19CSUdfRU5ESUFOX18KLQlpZiAoYWRkciAmIDB4MSkgewotCSAgICBhZGRyIC09IDB4QzAwMDA7Ci0JICAgICoodTgqKShfQkVfZW52LmJpb3NtZW1fYmFzZSArIGFkZHIgKyAwKSA9ICh2YWwgPj4gMCkgJiAweGZmOwotCSAgICAqKHU4KikoX0JFX2Vudi5iaW9zbWVtX2Jhc2UgKyBhZGRyICsgMSkgPSAodmFsID4+IDgpICYgMHhmZjsKLQkgICAgfQotCWVsc2UKLSNlbmRpZgotCSAgICAqKHUxNiopKF9CRV9lbnYuYmlvc21lbV9iYXNlICsgYWRkciAtIDB4QzAwMDApID0gdmFsOwotCX0KLSAgICBlbHNlIGlmIChhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEZGRkZGKSB7Ci0jaWZkZWYgX19CSUdfRU5ESUFOX18KLQlpZiAoYWRkciAmIDB4MSkgewotCSAgICBhZGRyIC09IDB4QTAwMDA7Ci0JICAgIHdyaXRlYih2YWwgPj4gMCwgX0JFX2Vudi5idXNtZW1fYmFzZSwgYWRkcik7Ci0JICAgIHdyaXRlYih2YWwgPj4gOCwgX0JFX2Vudi5idXNtZW1fYmFzZSwgYWRkciArIDEpOwotCSAgICB9Ci0JZWxzZQotI2VuZGlmCi0JICAgIHdyaXRldyh2YWwsIF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIgLSAweEEwMDAwKTsKLQl9Ci0gICAgZWxzZSBpZiAoYWRkciA+IE0ubWVtX3NpemUtMikgewotREIoICAgICBwcmludGsoIm1lbV93cml0ZTogYWRkcmVzcyAlI2x4IG91dCBvZiByYW5nZSFcbiIsIGFkZHIpOykKLQlIQUxUX1NZUygpOwotCX0KLSAgICBlbHNlIHsKLSNpZmRlZiBfX0JJR19FTkRJQU5fXwotCWlmIChhZGRyICYgMHgxKSB7Ci0JICAgICoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDApID0gKHZhbCA+PiAwKSAmIDB4ZmY7Ci0JICAgICoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDEpID0gKHZhbCA+PiA4KSAmIDB4ZmY7Ci0JICAgIH0KLQllbHNlCi0jZW5kaWYKLQkgICAgKih1MTYqKShNLm1lbV9iYXNlICsgYWRkcikgPSB2YWw7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWFkZHIgICAgLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCi12YWwgICAgIC0gVmFsdWUgdG8gc3RvcmUKLQotUkVNQVJLUzoKLVdyaXRlcyBhIGxvbmcgdmFsdWUgdG8gZW11bGF0b3IgbWVtb3J5LiBXZSBoYXZlIHRocmVlIGRpc3RpbmN0IG1lbW9yeQotcmVnaW9ucyB0aGF0IGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LCB3aGljaCB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBYODZBUEkgQkVfd3JsKAotICAgIHUzMiBhZGRyLAotICAgIHUzMiB2YWwpCi17Ci1EQiggaWYgKERFQlVHX01FTSgpKQotCXByaW50aygiJSMwOHggNCA8LSAlI3hcbiIsIGFkZHIsIHZhbCk7KQotICAgIGlmIChhZGRyID49IDB4QzAwMDAgJiYgYWRkciA8PSBfQkVfZW52LmJpb3NtZW1fbGltaXQpIHsKLSNpZmRlZiBfX0JJR19FTkRJQU5fXwotCWlmIChhZGRyICYgMHgxKSB7Ci0JICAgIGFkZHIgLT0gMHhDMDAwMDsKLQkgICAgKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMCkgPSAodmFsID4+ICAwKSAmIDB4ZmY7Ci0JICAgICoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDEpID0gKHZhbCA+PiAgOCkgJiAweGZmOwotCSAgICAqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAyKSA9ICh2YWwgPj4gMTYpICYgMHhmZjsKLQkgICAgKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMykgPSAodmFsID4+IDI0KSAmIDB4ZmY7Ci0JICAgIH0KLQllbHNlCi0jZW5kaWYKLQkgICAgKih1MzIqKShNLm1lbV9iYXNlICsgYWRkciAtIDB4QzAwMDApID0gdmFsOwotCX0KLSAgICBlbHNlIGlmIChhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEZGRkZGKSB7Ci0jaWZkZWYgX19CSUdfRU5ESUFOX18KLQlpZiAoYWRkciAmIDB4MykgewotCSAgICBhZGRyIC09IDB4QTAwMDA7Ci0JICAgIHdyaXRlYih2YWwgPj4gIDAsIF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIpOwotCSAgICB3cml0ZWIodmFsID4+ICA4LCBfQkVfZW52LmJ1c21lbV9iYXNlLCBhZGRyICsgMSk7Ci0JICAgIHdyaXRlYih2YWwgPj4gMTYsIF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIgKyAxKTsKLQkgICAgd3JpdGViKHZhbCA+PiAyNCwgX0JFX2Vudi5idXNtZW1fYmFzZSwgYWRkciArIDEpOwotCSAgICB9Ci0JZWxzZQotI2VuZGlmCi0JICAgIHdyaXRlbCh2YWwsIF9CRV9lbnYuYnVzbWVtX2Jhc2UsIGFkZHIgLSAweEEwMDAwKTsKLQl9Ci0gICAgZWxzZSBpZiAoYWRkciA+IE0ubWVtX3NpemUtNCkgewotREIoICAgICBwcmludGsoIm1lbV93cml0ZTogYWRkcmVzcyAlI2x4IG91dCBvZiByYW5nZSFcbiIsIGFkZHIpOykKLQlIQUxUX1NZUygpOwotCX0KLSAgICBlbHNlIHsKLSNpZmRlZiBfX0JJR19FTkRJQU5fXwotCWlmIChhZGRyICYgMHgxKSB7Ci0JICAgICoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDApID0gKHZhbCA+PiAgMCkgJiAweGZmOwotCSAgICAqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAxKSA9ICh2YWwgPj4gIDgpICYgMHhmZjsKLQkgICAgKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMikgPSAodmFsID4+IDE2KSAmIDB4ZmY7Ci0JICAgICoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDMpID0gKHZhbCA+PiAyNCkgJiAweGZmOwotCSAgICB9Ci0JZWxzZQotI2VuZGlmCi0JICAgICoodTMyKikoTS5tZW1fYmFzZSArIGFkZHIpID0gdmFsOwotCX0KLX0KLQotLyogRGVidWcgZnVuY3Rpb25zIHRvIGRvIElTQS9QQ0kgYnVzIHBvcnQgSS9PICovCi0KLSNpZmRlZiAgREVCVUcKLSNkZWZpbmUgREVCVUdfSU8oKSAgICAgICAgICAoTS54ODYuZGVidWcgJiBERUJVR19JT19UUkFDRV9GKQotCi11OCBYODZBUEkgQkVfaW5iKGludCBwb3J0KQotewotICAgIHU4IHZhbCA9IFBNX2lucGIocG9ydCk7Ci0gICAgaWYgKERFQlVHX0lPKCkpCi0JcHJpbnRrKCIlMDRYOiUwNFg6ICBpbmIuJTA0WCAtPiAlMDJYXG4iLE0ueDg2LnNhdmVkX2NzLCBNLng4Ni5zYXZlZF9pcCwgKHVzaG9ydClwb3J0LCB2YWwpOwotICAgIHJldHVybiB2YWw7Ci19Ci0KLXUxNiBYODZBUEkgQkVfaW53KGludCBwb3J0KQotewotICAgIHUxNiB2YWwgPSBQTV9pbnB3KHBvcnQpOwotICAgIGlmIChERUJVR19JTygpKQotCXByaW50aygiJTA0WDolMDRYOiAgaW53LiUwNFggLT4gJTA0WFxuIixNLng4Ni5zYXZlZF9jcywgTS54ODYuc2F2ZWRfaXAsICh1c2hvcnQpcG9ydCwgdmFsKTsKLSAgICByZXR1cm4gdmFsOwotfQotCi11MzIgWDg2QVBJIEJFX2lubChpbnQgcG9ydCkKLXsKLSAgICB1MzIgdmFsID0gUE1faW5wZChwb3J0KTsKLSAgICBpZiAoREVCVUdfSU8oKSkKLQlwcmludGsoIiUwNFg6JTA0WDogIGlubC4lMDRYIC0+ICUwOFhcbiIsTS54ODYuc2F2ZWRfY3MsIE0ueDg2LnNhdmVkX2lwLCAodXNob3J0KXBvcnQsIHZhbCk7Ci0gICAgcmV0dXJuIHZhbDsKLX0KLQotdm9pZCBYODZBUEkgQkVfb3V0YihpbnQgcG9ydCwgdTggdmFsKQotewotICAgIGlmIChERUJVR19JTygpKQotCXByaW50aygiJTA0WDolMDRYOiBvdXRiLiUwNFggPC0gJTAyWFxuIixNLng4Ni5zYXZlZF9jcywgTS54ODYuc2F2ZWRfaXAsICh1c2hvcnQpcG9ydCwgdmFsKTsKLSAgICBQTV9vdXRwYihwb3J0LHZhbCk7Ci19Ci0KLXZvaWQgWDg2QVBJIEJFX291dHcoaW50IHBvcnQsIHUxNiB2YWwpCi17Ci0gICAgaWYgKERFQlVHX0lPKCkpCi0JcHJpbnRrKCIlMDRYOiUwNFg6IG91dHcuJTA0WCA8LSAlMDRYXG4iLE0ueDg2LnNhdmVkX2NzLCBNLng4Ni5zYXZlZF9pcCwgKHVzaG9ydClwb3J0LCB2YWwpOwotICAgIFBNX291dHB3KHBvcnQsdmFsKTsKLX0KLQotdm9pZCBYODZBUEkgQkVfb3V0bChpbnQgcG9ydCwgdTMyIHZhbCkKLXsKLSAgICBpZiAoREVCVUdfSU8oKSkKLQlwcmludGsoIiUwNFg6JTA0WDogb3V0bC4lMDRYIDwtICUwOFhcbiIsTS54ODYuc2F2ZWRfY3MsIE0ueDg2LnNhdmVkX2lwLCAodXNob3J0KXBvcnQsIHZhbCk7Ci0gICAgUE1fb3V0cGQocG9ydCx2YWwpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L2Jpb3MuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2Jpb3NlbXUvYmlvcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGY0YTRiLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2Jpb3NlbXUvYmlvcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgQklPUyBlbXVsYXRvciBhbmQgaW50ZXJmYWNlCi0qICAgICAgICAgICAgICAgICAgICAgIHRvIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAotKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0qICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCi0qICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCi0qICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubwotKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KLSogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0qCi0qICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0qICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi0qICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLSogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKLSoKLSogRGVzY3JpcHRpb246ICBNb2R1bGUgaW1wbGVtZW50aW5nIHRoZSBCSU9TIHNwZWNpZmljIGZ1bmN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJiaW9zZW11aS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWludG5vICAgLSBJbnRlcnJ1cHQgbnVtYmVyIGJlaW5nIHNlcnZpY2VkCi0KLVJFTUFSS1M6Ci1IYW5kbGVyIGZvciB1bmRlZmluZWQgaW50ZXJydXB0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBYODZBUEkgdW5kZWZpbmVkX2ludHIoCi0gICAgaW50IGludG5vKQotewotICAgIGlmIChCRV9yZHcoaW50bm8gKiA0ICsgMikgPT0gQklPU19TRUcpCi0JcHJpbnRrKCJiaW9zRW11OiB1bmRlZmluZWQgaW50ZXJydXB0ICV4aCBjYWxsZWQhXG4iLGludG5vKTsKLSAgICBlbHNlCi0JWDg2RU1VX3ByZXBhcmVGb3JJbnQoaW50bm8pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWludG5vICAgLSBJbnRlcnJ1cHQgbnVtYmVyIGJlaW5nIHNlcnZpY2VkCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGRlZmF1bHQgc3lzdGVtIEJJT1MgSW50IDEwaCAodGhlIGRlZmF1bHQgaXMgc3RvcmVkCi1pbiB0aGUgSW50IDQyaCB2ZWN0b3IgYnkgdGhlIHN5c3RlbSBCSU9TIGF0IGJvb3R1cCkuIFdlIG9ubHkgbmVlZCB0byBoYW5kbGUKLWEgc21hbGwgbnVtYmVyIG9mIHNwZWNpYWwgZnVuY3Rpb25zIHVzZWQgYnkgdGhlIEJJT1MgZHVyaW5nIFBPU1QgdGltZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBYODZBUEkgaW50NDIoCi0gICAgaW50IGludG5vKQotewotICAgIGlmIChNLng4Ni5SX0FIID09IDB4MTIgJiYgTS54ODYuUl9CTCA9PSAweDMyKSB7Ci0JaWYgKE0ueDg2LlJfQUwgPT0gMCkgewotCSAgICAvKiBFbmFibGUgQ1BVIGFjY2Vzc2VzIHRvIHZpZGVvIG1lbW9yeSAqLwotCSAgICBQTV9vdXRwYigweDNjMiwgUE1faW5wYigweDNjYykgfCAodTgpMHgwMik7Ci0JICAgIHJldHVybjsKLQkgICAgfQotCWVsc2UgaWYgKE0ueDg2LlJfQUwgPT0gMSkgewotCSAgICAvKiBEaXNhYmxlIENQVSBhY2Nlc3NlcyB0byB2aWRlbyBtZW1vcnkgKi8KLQkgICAgUE1fb3V0cGIoMHgzYzIsIFBNX2lucGIoMHgzY2MpICYgKHU4KX4weDAyKTsKLQkgICAgcmV0dXJuOwotCSAgICB9Ci0jaWZkZWYgIERFQlVHCi0JZWxzZSB7Ci0JICAgIHByaW50aygiYmlvc0VtdS9iaW9zLmludDQyOiB1bmtub3duIGZ1bmN0aW9uIEFIPTB4MTIsIEJMPTB4MzIsIEFMPSUjMDJ4XG4iLE0ueDg2LlJfQUwpOwotCSAgICB9Ci0jZW5kaWYKLQl9Ci0jaWZkZWYgIERFQlVHCi0gICAgZWxzZSB7Ci0JcHJpbnRrKCJiaW9zRW11L2Jpb3MuaW50NDI6IHVua25vd24gZnVuY3Rpb24gQUg9JSMwMngsIEFMPSUjMDJ4LCBCTD0lIzAyeFxuIixNLng4Ni5SX0FILCBNLng4Ni5SX0FMLCBNLng4Ni5SX0JMKTsKLQl9Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1pbnRubyAgIC0gSW50ZXJydXB0IG51bWJlciBiZWluZyBzZXJ2aWNlZAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBkZWZhdWx0IHN5c3RlbSBCSU9TIEludCAxMGguIElmIHRoZSBQT1NUIGNvZGUKLWhhcyBub3QgeWV0IHJlLXZlY3RvcmVkIHRoZSBJbnQgMTBoIEJJT1MgaW50ZXJydXB0IHZlY3Rvciwgd2UgaGFuZGxlIHRoaXMKLWJ5IHNpbXBseSBjYWxsaW5nIHRoZSBpbnQ0MiBpbnRlcnJ1cHQgaGFuZGxlciBhYm92ZS4gVmVyeSBlYXJseSBpbiB0aGUKLUJJT1MgUE9TVCBwcm9jZXNzLCB0aGUgdmVjdG9yIGdldHMgcmVwbGFjZWQgYW5kIHdlIHNpbXBseSBsZXQgdGhlIHJlYWwKLW1vZGUgaW50ZXJydXB0IGhhbmRsZXIgcHJvY2VzcyB0aGUgaW50ZXJydXB0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIFg4NkFQSSBpbnQxMCgKLSAgICBpbnQgaW50bm8pCi17Ci0gICAgaWYgKEJFX3JkdyhpbnRubyAqIDQgKyAyKSA9PSBCSU9TX1NFRykKLQlpbnQ0MihpbnRubyk7Ci0gICAgZWxzZQotCVg4NkVNVV9wcmVwYXJlRm9ySW50KGludG5vKTsKLX0KLQotLyogUmVzdWx0IGNvZGVzIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUyAqLwotCi0jZGVmaW5lIFNVQ0NFU1NGVUwgICAgICAgICAgMHgwMAotI2RlZmluZSBGVU5DX05PVF9TVVBQT1JUICAgIDB4ODEKLSNkZWZpbmUgQkFEX1ZFTkRPUl9JRCAgICAgICAweDgzCi0jZGVmaW5lIERFVklDRV9OT1RfRk9VTkQgICAgMHg4NgotI2RlZmluZSBCQURfUkVHSVNURVJfTlVNQkVSIDB4ODcKLSNkZWZpbmUgU0VUX0ZBSUxFRCAgICAgICAgICAweDg4Ci0jZGVmaW5lIEJVRkZFUl9UT09fU01BTEwgICAgMHg4OQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWludG5vICAgLSBJbnRlcnJ1cHQgbnVtYmVyIGJlaW5nIHNlcnZpY2VkCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGRlZmF1bHQgSW50IDFBaCBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIHJlYWwKLW1vZGUgY29kZSwgd2hpY2ggcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIFBDSSBCSU9TIGZ1bmN0aW9ucy4gU2luY2Ugd2Ugb25seQotd2FudCB0byBhbGxvdyB0aGUgcmVhbCBtb2RlIEJJT1MgY29kZSAqb25seSogc2VlIHRoZSBQQ0kgY29uZmlnIHNwYWNlIGZvcgotaXRzIG93biBkZXZpY2UsIHdlIG9ubHkgcmV0dXJuIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWMgUENJIGNvbmZpZwotc3BhY2UgdGhhdCB3ZSBoYXZlIHBhc3NlZCBpbiB0byB0aGUgaW5pdCBmdW5jdGlvbi4gVGhpcyBzb2x2ZXMgcHJvYmxlbXMKLXdoZW4gdXNpbmcgdGhlIEJJT1MgdG8gd2FybSBib290IGEgc2Vjb25kYXJ5IGFkYXB0ZXIgd2hlbiB0aGVyZSBpcyBhbgotaWRlbnRpY2FsIGFkYXB0ZXIgYmVmb3JlIGl0IG9uIHRoZSBidXMgKHNvbWUgQklPUydlcyBnZXQgY29uZnVzZWQgaW4gdGhpcwotY2FzZSkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgWDg2QVBJIGludDFBKAotICAgIHVudXNlZCkKLXsKLSAgICB1MTYgcGNpU2xvdDsKLQotICAgIC8qIEZhaWwgaWYgbm8gUENJIGRldmljZSBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZWdpc3RlcmVkICovCi0gICAgaWYgKCFfQkVfZW52LnZnYUluZm8ucGNpSW5mbykKLQlyZXR1cm47Ci0gICAgcGNpU2xvdCA9ICh1MTYpKF9CRV9lbnYudmdhSW5mby5wY2lJbmZvLT5zbG90LmkgPj4gOCk7Ci0gICAgc3dpdGNoIChNLng4Ni5SX0FYKSB7Ci0JY2FzZSAweEIxMDE6ICAgICAgICAgICAgICAgICAgICAvKiBQQ0kgYmlvcyBwcmVzZW50PyAqLwotCSAgICBNLng4Ni5SX0FMICA9IDB4MDA7ICAgICAgICAgLyogbm8gY29uZmlnIHNwYWNlL3NwZWNpYWwgY3ljbGUgZ2VuZXJhdGlvbiBzdXBwb3J0ICovCi0JICAgIE0ueDg2LlJfRURYID0gMHgyMDQ5NDM1MDsgICAvKiAiIElDUCIgKi8KLQkgICAgTS54ODYuUl9CWCAgPSAweDAyMTA7ICAgICAgIC8qIFZlcnNpb24gMi4xMCAqLwotCSAgICBNLng4Ni5SX0NMICA9IDA7ICAgICAgICAgICAgLyogTWF4IGJ1cyBudW1iZXIgaW4gc3lzdGVtICovCi0JICAgIENMRUFSX0ZMQUcoRl9DRik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMHhCMTAyOiAgICAgICAgICAgICAgICAgICAgLyogRmluZCBQQ0kgZGV2aWNlICovCi0JICAgIE0ueDg2LlJfQUggPSBERVZJQ0VfTk9UX0ZPVU5EOwotCSAgICBpZiAoTS54ODYuUl9EWCA9PSBfQkVfZW52LnZnYUluZm8ucGNpSW5mby0+VmVuZG9ySUQgJiYKLQkJICAgIE0ueDg2LlJfQ1ggPT0gX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8tPkRldmljZUlEICYmCi0JCSAgICBNLng4Ni5SX1NJID09IDApIHsKLQkJTS54ODYuUl9BSCA9IFNVQ0NFU1NGVUw7Ci0JCU0ueDg2LlJfQlggPSBwY2lTbG90OwotCQl9Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFNVQ0NFU1NGVUwpLCBGX0NGKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAweEIxMDM6ICAgICAgICAgICAgICAgICAgICAvKiBGaW5kIFBDSSBjbGFzcyBjb2RlICovCi0JICAgIE0ueDg2LlJfQUggPSBERVZJQ0VfTk9UX0ZPVU5EOwotCSAgICBpZiAoTS54ODYuUl9DTCA9PSBfQkVfZW52LnZnYUluZm8ucGNpSW5mby0+SW50ZXJmYWNlICYmCi0JCSAgICBNLng4Ni5SX0NIID09IF9CRV9lbnYudmdhSW5mby5wY2lJbmZvLT5TdWJDbGFzcyAmJgotCQkgICAgKHU4KShNLng4Ni5SX0VDWCA+PiAxNikgPT0gX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8tPkJhc2VDbGFzcykgewotCQlNLng4Ni5SX0FIID0gU1VDQ0VTU0ZVTDsKLQkJTS54ODYuUl9CWCA9IHBjaVNsb3Q7Ci0JCX0KLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKE0ueDg2LlJfQUggIT0gU1VDQ0VTU0ZVTCksIEZfQ0YpOwotCSAgICBicmVhazsKLQljYXNlIDB4QjEwODogICAgICAgICAgICAgICAgICAgIC8qIFJlYWQgY29uZmlndXJhdGlvbiBieXRlICovCi0JICAgIE0ueDg2LlJfQUggPSBCQURfUkVHSVNURVJfTlVNQkVSOwotCSAgICBpZiAoTS54ODYuUl9CWCA9PSBwY2lTbG90KSB7Ci0JCU0ueDg2LlJfQUggPSBTVUNDRVNTRlVMOwotCQlNLng4Ni5SX0NMID0gKHU4KVBDSV9hY2Nlc3NSZWcoTS54ODYuUl9ESSwwLFBDSV9SRUFEX0JZVEUsX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8pOwotCQl9Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFNVQ0NFU1NGVUwpLCBGX0NGKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAweEIxMDk6ICAgICAgICAgICAgICAgICAgICAvKiBSZWFkIGNvbmZpZ3VyYXRpb24gd29yZCAqLwotCSAgICBNLng4Ni5SX0FIID0gQkFEX1JFR0lTVEVSX05VTUJFUjsKLQkgICAgaWYgKE0ueDg2LlJfQlggPT0gcGNpU2xvdCkgewotCQlNLng4Ni5SX0FIID0gU1VDQ0VTU0ZVTDsKLQkJTS54ODYuUl9DWCA9ICh1MTYpUENJX2FjY2Vzc1JlZyhNLng4Ni5SX0RJLDAsUENJX1JFQURfV09SRCxfQkVfZW52LnZnYUluZm8ucGNpSW5mbyk7Ci0JCX0KLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKE0ueDg2LlJfQUggIT0gU1VDQ0VTU0ZVTCksIEZfQ0YpOwotCSAgICBicmVhazsKLQljYXNlIDB4QjEwQTogICAgICAgICAgICAgICAgICAgIC8qIFJlYWQgY29uZmlndXJhdGlvbiBkd29yZCAqLwotCSAgICBNLng4Ni5SX0FIID0gQkFEX1JFR0lTVEVSX05VTUJFUjsKLQkgICAgaWYgKE0ueDg2LlJfQlggPT0gcGNpU2xvdCkgewotCQlNLng4Ni5SX0FIID0gU1VDQ0VTU0ZVTDsKLQkJTS54ODYuUl9FQ1ggPSAodTMyKVBDSV9hY2Nlc3NSZWcoTS54ODYuUl9ESSwwLFBDSV9SRUFEX0RXT1JELF9CRV9lbnYudmdhSW5mby5wY2lJbmZvKTsKLQkJfQotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBTVUNDRVNTRlVMKSwgRl9DRik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMHhCMTBCOiAgICAgICAgICAgICAgICAgICAgLyogV3JpdGUgY29uZmlndXJhdGlvbiBieXRlICovCi0JICAgIE0ueDg2LlJfQUggPSBCQURfUkVHSVNURVJfTlVNQkVSOwotCSAgICBpZiAoTS54ODYuUl9CWCA9PSBwY2lTbG90KSB7Ci0JCU0ueDg2LlJfQUggPSBTVUNDRVNTRlVMOwotCQlQQ0lfYWNjZXNzUmVnKE0ueDg2LlJfREksTS54ODYuUl9DTCxQQ0lfV1JJVEVfQllURSxfQkVfZW52LnZnYUluZm8ucGNpSW5mbyk7Ci0JCX0KLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKE0ueDg2LlJfQUggIT0gU1VDQ0VTU0ZVTCksIEZfQ0YpOwotCSAgICBicmVhazsKLQljYXNlIDB4QjEwQzogICAgICAgICAgICAgICAgICAgIC8qIFdyaXRlIGNvbmZpZ3VyYXRpb24gd29yZCAqLwotCSAgICBNLng4Ni5SX0FIID0gQkFEX1JFR0lTVEVSX05VTUJFUjsKLQkgICAgaWYgKE0ueDg2LlJfQlggPT0gcGNpU2xvdCkgewotCQlNLng4Ni5SX0FIID0gU1VDQ0VTU0ZVTDsKLQkJUENJX2FjY2Vzc1JlZyhNLng4Ni5SX0RJLE0ueDg2LlJfQ1gsUENJX1dSSVRFX1dPUkQsX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8pOwotCQl9Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFNVQ0NFU1NGVUwpLCBGX0NGKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAweEIxMEQ6ICAgICAgICAgICAgICAgICAgICAvKiBXcml0ZSBjb25maWd1cmF0aW9uIGR3b3JkICovCi0JICAgIE0ueDg2LlJfQUggPSBCQURfUkVHSVNURVJfTlVNQkVSOwotCSAgICBpZiAoTS54ODYuUl9CWCA9PSBwY2lTbG90KSB7Ci0JCU0ueDg2LlJfQUggPSBTVUNDRVNTRlVMOwotCQlQQ0lfYWNjZXNzUmVnKE0ueDg2LlJfREksTS54ODYuUl9FQ1gsUENJX1dSSVRFX0RXT1JELF9CRV9lbnYudmdhSW5mby5wY2lJbmZvKTsKLQkJfQotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBTVUNDRVNTRlVMKSwgRl9DRik7Ci0JICAgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAgIHByaW50aygiYmlvc0VtdS9iaW9zLmludDFhOiB1bmtub3duIGZ1bmN0aW9uIEFYPSUjMDR4XG4iLCBNLng4Ni5SX0FYKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgQklPUyBlbXVsYXRpb24gZnVuY3Rpb25zIGZvciB0aGUgc3BlY2lmaWMKLVBDSSBkaXNwbGF5IGRldmljZS4gV2UgaW5zdWxhdGUgdGhlIHJlYWwgbW9kZSBCSU9TIGZyb20gYW55IG90aGVyIGRldmljZXMKLW9uIHRoZSBidXMsIHNvIHRoYXQgaXQgd2lsbCB3b3JrIGNvcnJlY3RseSB0aGlua2luZyB0aGF0IGl0IGlzIHRoZSBvbmx5Ci1kZXZpY2UgcHJlc2VudCBvbiB0aGUgYnVzIChpZTogYXZvaWRpbmcgYW55IGFkYXB0ZXJzIHByZXNlbnQgaW4gZnJvbSBvZgotdGhlIGRldmljZSB3ZSBhcmUgdHJ5aW5nIHRvIGNvbnRyb2wpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0JFX2Jpb3NfaW5pdCgKLSAgICB1MzIgKmludHJUYWIpCi17Ci0gICAgaW50ICAgICAgICAgICAgICAgICBpOwotICAgIFg4NkVNVV9pbnRyRnVuY3MgICAgYmlvc19pbnRyX3RhYlsyNTZdOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSB7Ci0JaW50clRhYltpXSA9IEJJT1NfU0VHIDw8IDE2OwotCWJpb3NfaW50cl90YWJbaV0gPSB1bmRlZmluZWRfaW50cjsKLQl9Ci0gICAgYmlvc19pbnRyX3RhYlsweDEwXSA9IGludDEwOwotICAgIGJpb3NfaW50cl90YWJbMHgxQV0gPSBpbnQxQTsKLSAgICBiaW9zX2ludHJfdGFiWzB4NDJdID0gaW50NDI7Ci0gICAgWDg2RU1VX3NldHVwSW50ckZ1bmNzKGJpb3NfaW50cl90YWIpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvYmlvc2VtdS9iaW9zZW11LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L2Jpb3NlbXUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA1MjcwOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L2Jpb3NlbXUuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgIEJJT1MgZW11bGF0b3IgYW5kIGludGVyZmFjZQotKiAgICAgICAgICAgICAgICAgICAgICB0byBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgTW9kdWxlIGltcGxlbWVudGluZyB0aGUgc3lzdGVtIHNwZWNpZmljIGZ1bmN0aW9ucy4gVGhpcwotKiAgICAgICAgICAgICAgIG1vZHVsZSBpcyBhbHdheXMgY29tcGlsZWQgYW5kIGxpbmtlZCBpbiB0aGUgT1MgZGVwZWRlbnQKLSogICAgICAgICAgICAgICBsaWJyYXJpZXMsIGFuZCBuZXZlciBpbiBhIGJpbmFyeSBwb3J0YWJsZSBkcml2ZXIuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYmlvc2VtdWkuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotQkVfc3lzRW52ICAgICAgICAgICBfQkVfZW52OwotI2lmZGVmICBfX0RSSVZFUl9fCi1QTV9pbXBvcnRzICBfVkFSQVBJIF9QTV9pbXBvcnRzOwotI2VuZGlmCi1zdGF0aWMgWDg2RU1VX21lbUZ1bmNzIF9CRV9tZW0gPSB7Ci0gICAgQkVfcmRiLAotICAgIEJFX3JkdywKLSAgICBCRV9yZGwsCi0gICAgQkVfd3JiLAotICAgIEJFX3dydywKLSAgICBCRV93cmwsCi0gICAgfTsKLSNpZmRlZiAgREVCVUcKLXN0YXRpYyBYODZFTVVfcGlvRnVuY3MgX0JFX3BpbyA9IHsKLSAgICBCRV9pbmIsCi0gICAgQkVfaW53LAotICAgIEJFX2lubCwKLSAgICBCRV9vdXRiLAotICAgIEJFX291dHcsCi0gICAgQkVfb3V0bCwKLSAgICB9OwotI2Vsc2UKLXN0YXRpYyBYODZFTVVfcGlvRnVuY3MgX0JFX3BpbyA9IHsKLSAgICAodm9pZCopUE1faW5wYiwKLSAgICAodm9pZCopUE1faW5wdywKLSAgICAodm9pZCopUE1faW5wZCwKLSAgICAodm9pZCopUE1fb3V0cGIsCi0gICAgKHZvaWQqKVBNX291dHB3LAotICAgICh2b2lkKilQTV9vdXRwZCwKLSAgICB9OwotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgT0ZGKGFkZHIpICAgICAgICh1MTYpKCgoYWRkcikgPj4gMCkgJiAweGZmZmYpCi0jZGVmaW5lIFNFRyhhZGRyKSAgICAgICAodTE2KSgoKGFkZHIpID4+IDQpICYgMHhmMDAwKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWRlYnVnRmxhZ3MgIC0gRmxhZ3MgdG8gZW5hYmxlIGRlYnVnZ2luZyBvcHRpb25zIChkZWJ1ZyBidWlsZHMgb25seSkKLW1lbVNpemUgICAgIC0gQW1vdW50IG9mIG1lbW9yeSB0byBhbGxvY2F0ZSBmb3IgcmVhbCBtb2RlIG1hY2hpbmUKLWluZm8gICAgICAgIC0gUG9pbnRlciB0byBkZWZhdWx0IFZHQSBkZXZpY2UgaW5mb3JtYXRpb24KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb25zIGluaXRpYWxpc2VzIHRoZSBCRWxpYiwgYW5kIHVzZXMgdGhlIHBhc3NlZCBpbgotQklPUyBpbWFnZSBhcyB0aGUgQklPUyB0aGF0IGlzIHVzZWQgYW5kIGVtdWxhdGVkIGF0IDB4QzAwMDAuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgQkVfaW5pdCgKLSAgICB1MzIgZGVidWdGbGFncywKLSAgICBpbnQgbWVtU2l6ZSwKLSAgICBCRV9WR0FJbmZvICppbmZvKQotewotI2lmbmRlZiBfX0RSSVZFUl9fCi0gICAgUE1faW5pdCgpOwotI2VuZGlmCi0gICAgbWVtc2V0KCZNLDAsc2l6ZW9mKE0pKTsKLSAgICBpZiAobWVtU2l6ZSA8IDIwNDgwKQotCVBNX2ZhdGFsRXJyb3IoIkVtdWxhdG9yIHJlcXVpcmVzIGF0IGxlYXN0IDIwS2Igb2YgbWVtb3J5IVxuIik7Ci0gICAgaWYgKChNLm1lbV9iYXNlID0gKHVuc2lnbmVkIGxvbmcpbWFsbG9jKG1lbVNpemUpKSA9PSBOVUxMKQotCVBNX2ZhdGFsRXJyb3IoIk91dCBvZiBtZW1vcnkhIik7Ci0gICAgTS5tZW1fc2l6ZSA9IG1lbVNpemU7Ci0gICAgX0JFX2Vudi5idXNtZW1fYmFzZSA9ICh1bG9uZylQTV9tYXBQaHlzaWNhbEFkZHIoMHhBMDAwMCwweDVGRkZGLHRydWUpOwotICAgIE0ueDg2LmRlYnVnID0gZGVidWdGbGFnczsKLSAgICBfQkVfYmlvc19pbml0KCh1MzIqKWluZm8tPkxvd01lbSk7Ci0gICAgWDg2RU1VX3NldHVwTWVtRnVuY3MoJl9CRV9tZW0pOwotICAgIFg4NkVNVV9zZXR1cFBpb0Z1bmNzKCZfQkVfcGlvKTsKLSAgICBCRV9zZXRWR0EoaW5mbyk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZGVidWdGbGFncyAgLSBGbGFncyB0byBlbmFibGUgZGVidWdnaW5nIG9wdGlvbnMgKGRlYnVnIGJ1aWxkcyBvbmx5KQotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIGVuYWJsZSBsb2dnaW5nIGFuZCBkZWJ1ZyBmbGFncwotb24gYSBmdW5jdGlvbiBjYWxsIGJhc2lzLCBzbyB3ZSBjYW4gc3BlY2lmaWNhbGx5IGVuYWJsZSBsb2dnaW5nIG9ubHkKLWZvciBzcGVjaWZpYyBmdW5jdGlvbnMgdGhhdCBhcmUgY2F1c2luZyBwcm9ibGVtcyBpbiBkZWJ1ZyBtb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgQkVfc2V0RGVidWdGbGFncygKLSAgICB1MzIgZGVidWdGbGFncykKLXsKLSAgICBNLng4Ni5kZWJ1ZyA9IGRlYnVnRmxhZ3M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotaW5mbyAgICAgICAgLSBQb2ludGVyIHRvIFZHQSBkZXZpY2UgaW5mb3JtYXRpb24gdG8gbWFrZSBjdXJyZW50Ci0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHNldHMgdGhlIFZHQSBCSU9TIGZ1bmN0aW9ucyBpbiB0aGUgZW11bGF0b3IgdG8gcG9pbnQgdG8gdGhlCi1zcGVjaWZpYyBWR0EgQklPUyBpbiB1c2UuIFRoaXMgaW5jbHVkZXMgc3dhcHBpbmcgdGhlIEJJT1MgaW50ZXJydXB0Ci12ZWN0b3JzLCBCSU9TIGltYWdlIGFuZCBCSU9TIGRhdGEgYXJlYSB0byB0aGUgbmV3IEJJT1MuIFRoaXMgYWxsb3dzIHRoZQotcmVhbCBtb2RlIEJJT1MgdG8gYmUgc3dhcHBlZCB3aXRob3V0IHJlc2V0dGluZyB0aGUgZW50aXJlIGVtdWxhdG9yLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgQkVfc2V0VkdBKAotICAgIEJFX1ZHQUluZm8gKmluZm8pCi17Ci0gICAgX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8gPSBpbmZvLT5wY2lJbmZvOwotICAgIF9CRV9lbnYudmdhSW5mby5CSU9TSW1hZ2UgPSBpbmZvLT5CSU9TSW1hZ2U7Ci0gICAgaWYgKGluZm8tPkJJT1NJbWFnZSkgewotCV9CRV9lbnYuYmlvc21lbV9iYXNlID0gKHVsb25nKWluZm8tPkJJT1NJbWFnZTsKLQlfQkVfZW52LmJpb3NtZW1fbGltaXQgPSAweEMwMDAwICsgaW5mby0+QklPU0ltYWdlTGVuLTE7Ci0JfQotICAgIGVsc2UgewotCV9CRV9lbnYuYmlvc21lbV9iYXNlID0gX0JFX2Vudi5idXNtZW1fYmFzZSArIDB4MjAwMDA7Ci0JX0JFX2Vudi5iaW9zbWVtX2xpbWl0ID0gMHhDN0ZGRjsKLQl9Ci0gICAgaWYgKCooKHUzMiopaW5mby0+TG93TWVtKSA9PSAwKQotCV9CRV9iaW9zX2luaXQoKHUzMiopaW5mby0+TG93TWVtKTsKLSAgICBtZW1jcHkoKHU4KilNLm1lbV9iYXNlLGluZm8tPkxvd01lbSxzaXplb2YoaW5mby0+TG93TWVtKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotaW5mbyAgICAgICAgLSBQb2ludGVyIHRvIFZHQSBkZXZpY2UgaW5mb3JtYXRpb24gdG8gcmV0cmlldmUgY3VycmVudAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBWR0EgQklPUyBmdW5jdGlvbnMgY3VycmVudGx5IGFjdGl2ZSBpbiB0aGUKLWVtdWxhdG9yLCBzbyB0aGV5IGNhbiBiZSByZXN0b3JlZCBhdCBhIGxhdGVyIGRhdGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBCRV9nZXRWR0EoCi0gICAgQkVfVkdBSW5mbyAqaW5mbykKLXsKLSAgICBpbmZvLT5wY2lJbmZvID0gX0JFX2Vudi52Z2FJbmZvLnBjaUluZm87Ci0gICAgaW5mby0+QklPU0ltYWdlID0gX0JFX2Vudi52Z2FJbmZvLkJJT1NJbWFnZTsKLSAgICBtZW1jcHkoaW5mby0+TG93TWVtLCh1OCopTS5tZW1fYmFzZSxzaXplb2YoaW5mby0+TG93TWVtKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcl9zZWcgICAtIFNlZ21lbnQgZm9yIHBvaW50ZXIgdG8gY29udmVydAotcl9vZmYgICAtIE9mZnNldCBmb3IgcG9pbnRlciB0byBjb252ZXJ0Ci0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIG1hcHMgYSByZWFsIG1vZGUgcG9pbnRlciBpbiB0aGUgZW11bGF0b3IgbWVtb3J5IHRvIGEgcHJvdGVjdGVkCi1tb2RlIHBvaW50ZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBkaXJlY3RseSBhY2Nlc3MgdGhlIG1lbW9yeS4KLQotTk9URTogICBUaGUgbWVtb3J5IGlzICphbHdheXMqIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0LCBzb24gb24gbm9uLXg4NgotCXN5c3RlbXMgeW91IHdpbGwgbmVlZCB0byBkbyBlbmRpYW4gdHJhbnNsYXRpb25zIHRvIGFjY2VzcyB0aGlzCi0JbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBCRV9tYXBSZWFsUG9pbnRlcigKLSAgICB1aW50IHJfc2VnLAotICAgIHVpbnQgcl9vZmYpCi17Ci0gICAgdTMyIGFkZHIgPSAoKHUzMilyX3NlZyA8PCA0KSArIHJfb2ZmOwotCi0gICAgaWYgKGFkZHIgPj0gMHhDMDAwMCAmJiBhZGRyIDw9IF9CRV9lbnYuYmlvc21lbV9saW1pdCkgewotCXJldHVybiAodm9pZCopKF9CRV9lbnYuYmlvc21lbV9iYXNlICsgYWRkciAtIDB4QzAwMDApOwotCX0KLSAgICBlbHNlIGlmIChhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEZGRkZGKSB7Ci0JcmV0dXJuICh2b2lkKikoX0JFX2Vudi5idXNtZW1fYmFzZSArIGFkZHIgLSAweEEwMDAwKTsKLQl9Ci0gICAgcmV0dXJuICh2b2lkKikoTS5tZW1fYmFzZSArIGFkZHIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWxlbiAgICAgLSBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgVkVTQSBidWZmZXIKLXJzZWcgICAgLSBQbGFjZSB0byBzdG9yZSBWRVNBIGJ1ZmZlciBzZWdtZW50Ci1yb2ZmICAgIC0gUGxhY2UgdG8gc3RvcmUgVkVTQSBidWZmZXIgb2Zmc2V0Ci0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIFZFU0EgdHJhbnNmZXIgYnVmZmVyIGluIHJlYWwKLW1vZGUgZW11bGF0b3IgbWVtb3J5LiBUaGUgVkVTQSB0cmFuc2ZlciBidWZmZXIgaXMgYWx3YXlzIDEwMjQgYnl0ZXMgbG9uZywKLWFuZCBsb2NhdGVkIGF0IDE1S2IgaW50byB0aGUgc3RhcnQgb2YgdGhlIHJlYWwgbW9kZSBtZW1vcnkgKDE2S2IgaXMgd2hlcmUKLXdlIHB1dCB0aGUgcmVhbCBtb2RlIGNvZGUgd2UgZXhlY3V0ZSBmb3IgaXNzdWluZyBpbnRlcnJ1cHRzKS4KLQotTk9URTogICBUaGUgbWVtb3J5IGlzICphbHdheXMqIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0LCBzb24gb24gbm9uLXg4NgotCXN5c3RlbXMgeW91IHdpbGwgbmVlZCB0byBkbyBlbmRpYW4gdHJhbnNsYXRpb25zIHRvIGFjY2VzcyB0aGlzCi0JbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBCRV9nZXRWRVNBQnVmKAotICAgIHVpbnQgKmxlbiwKLSAgICB1aW50ICpyc2VnLAotICAgIHVpbnQgKnJvZmYpCi17Ci0gICAgKmxlbiA9IDEwMjQ7Ci0gICAgKnJzZWcgPSBTRUcoMHgwM0MwMCk7Ci0gICAgKnJvZmYgPSBPRkYoMHgwM0MwMCk7Ci0gICAgcmV0dXJuICh2b2lkKikoTS5tZW1fYmFzZSArICgodTMyKSpyc2VnIDw8IDQpICsgKnJvZmYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNsZWFucyB1cCBhbmQgZXhpdHMgdGhlIGVtdWxhdG9yLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgQkVfZXhpdCh2b2lkKQotewotICAgIGZyZWUoKHZvaWQqKU0ubWVtX2Jhc2UpOwotICAgIFBNX2ZyZWVQaHlzaWNhbEFkZHIoKHZvaWQqKV9CRV9lbnYuYnVzbWVtX2Jhc2UsMHg1RkZGRik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc2VnICAgICAtIFNlZ21lbnQgb2YgY29kZSB0byBjYWxsCi1vZmYgICAgIC0gT2Zmc2V0IG9mIGNvZGUgdG8gY2FsbAotcmVncyAgICAtIFJlYWwgbW9kZSByZWdpc3RlcnMgdG8gbG9hZAotc3JlZ3MgICAtIFJlYWwgbW9kZSBzZWdtZW50IHJlZ2lzdGVycyB0byBsb2FkCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9ucyBjYWxscyBhIHJlYWwgbW9kZSBmYXIgZnVuY3Rpb24gYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLAotYW5kIGxvYWRzIGFsbCB0aGUgeDg2IHJlZ2lzdGVycyBmcm9tIHRoZSBwYXNzZWQgaW4gcmVnaXN0ZXJzIHN0cnVjdHVyZS4KLU9uIGV4aXQgdGhlIHJlZ2lzdGVycyByZXR1cm5lZCBmcm9tIHRoZSBjYWxsIGFyZSByZXR1cm5lZCBpbiB0aGUgc2FtZQotc3RydWN0dXJlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIEJFX2NhbGxSZWFsTW9kZSgKLSAgICB1aW50IHNlZywKLSAgICB1aW50IG9mZiwKLSAgICBSTVJFR1MgKnJlZ3MsCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgTS54ODYuUl9FQVggPSByZWdzLT5lLmVheDsKLSAgICBNLng4Ni5SX0VCWCA9IHJlZ3MtPmUuZWJ4OwotICAgIE0ueDg2LlJfRUNYID0gcmVncy0+ZS5lY3g7Ci0gICAgTS54ODYuUl9FRFggPSByZWdzLT5lLmVkeDsKLSAgICBNLng4Ni5SX0VTSSA9IHJlZ3MtPmUuZXNpOwotICAgIE0ueDg2LlJfRURJID0gcmVncy0+ZS5lZGk7Ci0gICAgTS54ODYuUl9EUyA9IHNyZWdzLT5kczsKLSAgICBNLng4Ni5SX0VTID0gc3JlZ3MtPmVzOwotICAgIE0ueDg2LlJfRlMgPSBzcmVncy0+ZnM7Ci0gICAgTS54ODYuUl9HUyA9IHNyZWdzLT5nczsKLSAgICBNLng4Ni5SX0NTID0gKHUxNilzZWc7Ci0gICAgTS54ODYuUl9JUCA9ICh1MTYpb2ZmOwotICAgIE0ueDg2LlJfU1MgPSBTRUcoTS5tZW1fc2l6ZSAtIDEpOwotICAgIE0ueDg2LlJfU1AgPSBPRkYoTS5tZW1fc2l6ZSAtIDEpOwotICAgIFg4NkVNVV9leGVjKCk7Ci0gICAgcmVncy0+ZS5jZmxhZyA9IE0ueDg2LlJfRUZMRyAmIEZfQ0Y7Ci0gICAgcmVncy0+ZS5lYXggPSBNLng4Ni5SX0VBWDsKLSAgICByZWdzLT5lLmVieCA9IE0ueDg2LlJfRUJYOwotICAgIHJlZ3MtPmUuZWN4ID0gTS54ODYuUl9FQ1g7Ci0gICAgcmVncy0+ZS5lZHggPSBNLng4Ni5SX0VEWDsKLSAgICByZWdzLT5lLmVzaSA9IE0ueDg2LlJfRVNJOwotICAgIHJlZ3MtPmUuZWRpID0gTS54ODYuUl9FREk7Ci0gICAgc3JlZ3MtPmRzID0gTS54ODYuUl9EUzsKLSAgICBzcmVncy0+ZXMgPSBNLng4Ni5SX0VTOwotICAgIHNyZWdzLT5mcyA9IE0ueDg2LlJfRlM7Ci0gICAgc3JlZ3MtPmdzID0gTS54ODYuUl9HUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1pbnRubyAgIC0gSW50ZXJydXB0IG51bWJlciB0byBleGVjdXRlCi1pbiAgICAgIC0gUmVhbCBtb2RlIHJlZ2lzdGVycyB0byBsb2FkCi1vdXQgICAgIC0gUGxhY2UgdG8gc3RvcmUgcmVzdWx0aW5nIHJlYWwgbW9kZSByZWdpc3RlcnMKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb25zIGNhbGxzIGEgcmVhbCBtb2RlIGludGVycnVwdCBmdW5jdGlvbiBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MsCi1hbmQgbG9hZHMgYWxsIHRoZSB4ODYgcmVnaXN0ZXJzIGZyb20gdGhlIHBhc3NlZCBpbiByZWdpc3RlcnMgc3RydWN0dXJlLgotT24gZXhpdCB0aGUgcmVnaXN0ZXJzIHJldHVybmVkIGZyb20gdGhlIGNhbGwgYXJlIHJldHVybmVkIGluIG91dCBzdHVjdHVyZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgQkVfaW50ODYoCi0gICAgaW50IGludG5vLAotICAgIFJNUkVHUyAqaW4sCi0gICAgUk1SRUdTICpvdXQpCi17Ci0gICAgTS54ODYuUl9FQVggPSBpbi0+ZS5lYXg7Ci0gICAgTS54ODYuUl9FQlggPSBpbi0+ZS5lYng7Ci0gICAgTS54ODYuUl9FQ1ggPSBpbi0+ZS5lY3g7Ci0gICAgTS54ODYuUl9FRFggPSBpbi0+ZS5lZHg7Ci0gICAgTS54ODYuUl9FU0kgPSBpbi0+ZS5lc2k7Ci0gICAgTS54ODYuUl9FREkgPSBpbi0+ZS5lZGk7Ci0gICAgKCh1OCopTS5tZW1fYmFzZSlbMHg0MDAwXSA9IDB4Q0Q7Ci0gICAgKCh1OCopTS5tZW1fYmFzZSlbMHg0MDAxXSA9ICh1OClpbnRubzsKLSAgICAoKHU4KilNLm1lbV9iYXNlKVsweDQwMDJdID0gMHhDMzsKLSAgICBNLng4Ni5SX0NTID0gU0VHKDB4MDQwMDApOwotICAgIE0ueDg2LlJfSVAgPSBPRkYoMHgwNDAwMCk7Ci0gICAgTS54ODYuUl9TUyA9IFNFRyhNLm1lbV9zaXplIC0gMSk7Ci0gICAgTS54ODYuUl9TUCA9IE9GRihNLm1lbV9zaXplIC0gMSk7Ci0gICAgWDg2RU1VX2V4ZWMoKTsKLSAgICBvdXQtPmUuY2ZsYWcgPSBNLng4Ni5SX0VGTEcgJiBGX0NGOwotICAgIG91dC0+ZS5lYXggPSBNLng4Ni5SX0VBWDsKLSAgICBvdXQtPmUuZWJ4ID0gTS54ODYuUl9FQlg7Ci0gICAgb3V0LT5lLmVjeCA9IE0ueDg2LlJfRUNYOwotICAgIG91dC0+ZS5lZHggPSBNLng4Ni5SX0VEWDsKLSAgICBvdXQtPmUuZXNpID0gTS54ODYuUl9FU0k7Ci0gICAgb3V0LT5lLmVkaSA9IE0ueDg2LlJfRURJOwotICAgIHJldHVybiBvdXQtPnguYXg7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotaW50bm8gICAtIEludGVycnVwdCBudW1iZXIgdG8gZXhlY3V0ZQotaW4gICAgICAtIFJlYWwgbW9kZSByZWdpc3RlcnMgdG8gbG9hZAotb3V0ICAgICAtIFBsYWNlIHRvIHN0b3JlIHJlc3VsdGluZyByZWFsIG1vZGUgcmVnaXN0ZXJzCi1zcmVncyAgIC0gUmVhbCBtb2RlIHNlZ21lbnQgcmVnaXN0ZXJzIHRvIGxvYWQKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb25zIGNhbGxzIGEgcmVhbCBtb2RlIGludGVycnVwdCBmdW5jdGlvbiBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MsCi1hbmQgbG9hZHMgYWxsIHRoZSB4ODYgcmVnaXN0ZXJzIGZyb20gdGhlIHBhc3NlZCBpbiByZWdpc3RlcnMgc3RydWN0dXJlLgotT24gZXhpdCB0aGUgcmVnaXN0ZXJzIHJldHVybmVkIGZyb20gdGhlIGNhbGwgYXJlIHJldHVybmVkIGluIG91dCBzdHVjdHVyZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgQkVfaW50ODZ4KAotICAgIGludCBpbnRubywKLSAgICBSTVJFR1MgKmluLAotICAgIFJNUkVHUyAqb3V0LAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIE0ueDg2LlJfRUFYID0gaW4tPmUuZWF4OwotICAgIE0ueDg2LlJfRUJYID0gaW4tPmUuZWJ4OwotICAgIE0ueDg2LlJfRUNYID0gaW4tPmUuZWN4OwotICAgIE0ueDg2LlJfRURYID0gaW4tPmUuZWR4OwotICAgIE0ueDg2LlJfRVNJID0gaW4tPmUuZXNpOwotICAgIE0ueDg2LlJfRURJID0gaW4tPmUuZWRpOwotICAgIE0ueDg2LlJfRFMgPSBzcmVncy0+ZHM7Ci0gICAgTS54ODYuUl9FUyA9IHNyZWdzLT5lczsKLSAgICBNLng4Ni5SX0ZTID0gc3JlZ3MtPmZzOwotICAgIE0ueDg2LlJfR1MgPSBzcmVncy0+Z3M7Ci0gICAgKCh1OCopTS5tZW1fYmFzZSlbMHg0MDAwXSA9IDB4Q0Q7Ci0gICAgKCh1OCopTS5tZW1fYmFzZSlbMHg0MDAxXSA9ICh1OClpbnRubzsKLSAgICAoKHU4KilNLm1lbV9iYXNlKVsweDQwMDJdID0gMHhDMzsKLSAgICBNLng4Ni5SX0NTID0gU0VHKDB4MDQwMDApOwotICAgIE0ueDg2LlJfSVAgPSBPRkYoMHgwNDAwMCk7Ci0gICAgTS54ODYuUl9TUyA9IFNFRyhNLm1lbV9zaXplIC0gMSk7Ci0gICAgTS54ODYuUl9TUCA9IE9GRihNLm1lbV9zaXplIC0gMSk7Ci0gICAgWDg2RU1VX2V4ZWMoKTsKLSAgICBvdXQtPmUuY2ZsYWcgPSBNLng4Ni5SX0VGTEcgJiBGX0NGOwotICAgIG91dC0+ZS5lYXggPSBNLng4Ni5SX0VBWDsKLSAgICBvdXQtPmUuZWJ4ID0gTS54ODYuUl9FQlg7Ci0gICAgb3V0LT5lLmVjeCA9IE0ueDg2LlJfRUNYOwotICAgIG91dC0+ZS5lZHggPSBNLng4Ni5SX0VEWDsKLSAgICBvdXQtPmUuZXNpID0gTS54ODYuUl9FU0k7Ci0gICAgb3V0LT5lLmVkaSA9IE0ueDg2LlJfRURJOwotICAgIHNyZWdzLT5kcyA9IE0ueDg2LlJfRFM7Ci0gICAgc3JlZ3MtPmVzID0gTS54ODYuUl9FUzsKLSAgICBzcmVncy0+ZnMgPSBNLng4Ni5SX0ZTOwotICAgIHNyZWdzLT5ncyA9IE0ueDg2LlJfR1M7Ci0gICAgcmV0dXJuIG91dC0+eC5heDsKLX0KLQotI2lmZGVmICBfX0RSSVZFUl9fCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRW1wdHkgbG9nIGZ1bmN0aW9uIGZvciBiaW5hcnkgcG9ydGFibGUgRExMLiBUaGUgQlBEIGlzIGNvbXBpbGVkIHdpdGhvdXQKLWRlYnVnIGluZm9ybWF0aW9uLCBzbyB2ZXJ5IGxpdHRsZSBpcyBsb2dnZWQgYW55d2F5IHNvIGl0IGlzIHNpbXBsZXIgdGhpcwotd2F5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcHJpbnRrKGNvbnN0IGNoYXIgKm1zZywgLi4uKQotewotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZhdGFsIGVycm9yIGhhbmRsZXIgY2FsbGVkIHdoZW4gYSBub24taW1wb3J0ZWQgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZQotZHJpdmVyLiBXZSBsZWF2ZSB0aGlzIHRvIGEgcnVudGltZSBlcnJvciBzbyB0aGF0IG9sZGVyIGFwcGxpY2F0aW9ucyBhbmQKLXNoZWxsIGRyaXZlcnMgd2lsbCB3b3JrIHdpdGggbmV3ZXIgYnBkIGRyaXZlcnMgcHJvdmlkZWQgbm8gbmV3ZXIgZnVuY3Rpb25zCi1hcmUgcmVxdWlyZWQgYnkgdGhlIGRyaXZlciBpdHNlbGYuIElmIHRoZXkgYXJlLCB0aGUgYXBwbGljYXRpb24gb3Igc2hlbGwKLWRyaXZlciBuZWVkcyB0byBiZSByZWNvbXBpbGVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9QTV9mYXRhbEVycm9ySGFuZGxlcih2b2lkKQotewotICAgIFBNX2ZhdGFsRXJyb3IoIlVuc3VwcG9ydGVkIFBNX2ltcG9ydHMgaW1wb3J0IGZ1bmN0aW9uIGNhbGxlZCEgUGxlYXNlIHJlLWNvbXBpbGUhXG4iKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1iZUltcCAgIC0gQkUgbGlicmFyeSBpbXBvcnRzCi1iZUltcCAgIC0gR2VuZXJpYyBlbXVsYXRvciBpbXBvcnRzCi0KLVJFVFVSTlM6Ci1Qb2ludGVyIHRvIGV4cG9ydGVkIGZ1bmN0aW9uIGxpc3QKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIEJJT1MgZW11bGF0b3IgbGlicmFyeSBhbmQgcmV0dXJucyB0aGUgbGlzdCBvZgotbG9hZGVyIGxpYnJhcnkgZXhwb3J0ZWQgZnVuY3Rpb25zLgote3NlY3JldH0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1CRV9leHBvcnRzICogX0NFWFBPUlQgQkVfaW5pdExpYnJhcnkoCi0gICAgUE1faW1wb3J0cyAqcG1JbXApCi17Ci0gICAgc3RhdGljIEJFX2V4cG9ydHMgX0JFX2V4cG9ydHMgPSB7Ci0Jc2l6ZW9mKEJFX2V4cG9ydHMpLAotCUJFX2luaXQsCi0JQkVfc2V0VkdBLAotCUJFX2dldFZHQSwKLQlCRV9tYXBSZWFsUG9pbnRlciwKLQlCRV9nZXRWRVNBQnVmLAotCUJFX2NhbGxSZWFsTW9kZSwKLQlCRV9pbnQ4NiwKLQlCRV9pbnQ4NngsCi0JTlVMTCwKLQlCRV9leGl0LAotCX07Ci0gICAgaW50ICAgICBpLG1heDsKLSAgICB1bG9uZyAgICpwOwotCi0gICAgLyogSW5pdGlhbGl6ZSBhbGwgZGVmYXVsdCBpbXBvcnRzIHRvIHBvaW50IHRvIGZhdGFsIGVycm9yIGhhbmRsZXIgKi8KLSAgICAvKiBmb3IgdXB3YXJkcyBjb21wYXRpYmlsaXR5LiAqLwotICAgIG1heCA9IHNpemVvZihfUE1faW1wb3J0cykvc2l6ZW9mKEJFX2luaXRMaWJyYXJ5X3QpOwotICAgIGZvciAoaSA9IDAscCA9ICh1bG9uZyopJl9QTV9pbXBvcnRzOyBpIDwgbWF4OyBpKyspCi0JKnArKyA9ICh1bG9uZylfUE1fZmF0YWxFcnJvckhhbmRsZXI7Ci0KLSAgICAvKiBOb3cgY29weSBhbGwgb3VyIGltcG9ydGVkIGZ1bmN0aW9ucyAqLwotICAgIG1lbWNweSgmX1BNX2ltcG9ydHMscG1JbXAsTUlOKHNpemVvZihfUE1faW1wb3J0cykscG1JbXAtPmR3U2l6ZSkpOwotICAgIHJldHVybiAmX0JFX2V4cG9ydHM7Ci19Ci0KLSNlbmRpZiAgLyogX19EUklWRVJfXyAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvYmlvc2VtdS9iaW9zZW11aS5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvYmlvc2VtdS9iaW9zZW11aS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2VkZWJjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2Jpb3NlbXUvYmlvc2VtdWkuaAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgQklPUyBlbXVsYXRvciBhbmQgaW50ZXJmYWNlCi0qICAgICAgICAgICAgICAgICAgICAgIHRvIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAotKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0qICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCi0qICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCi0qICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubwotKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KLSogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0qCi0qICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0qICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi0qICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLSogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKLSoKLSogRGVzY3JpcHRpb246ICBJbnRlcm5hbCBoZWFkZXIgZmlsZSBmb3IgdGhlIEJJT1MgZW11bGF0b3IgbGlicmFyeS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19CSU9TRU1VSV9ICi0jZGVmaW5lIF9fQklPU0VNVUlfSAotCi0jaW5jbHVkZSA8Ymlvc2VtdS5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFjcm9zIGFuZCB0eXBlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgREVCVUcKLSNkZWZpbmUgREIoeCkgICB4Ci0jZWxzZQotI2RlZmluZSBEQih4KQotI2VuZGlmCi0KLSNkZWZpbmUgQklPU19TRUcgICAgICAgIDB4ZmZmMAotCi0jZGVmaW5lIE0gICAgICAgICAgICAgICBfWDg2RU1VX2VudgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9uIFByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBiaW9zLmMgKi8KLQotdm9pZCAgICBfQkVfYmlvc19pbml0KHUzMiAqaW50clRhYik7Ci12b2lkICAgIF9CRV9zZXR1cF9mdW5jcyh2b2lkKTsKLQotLyogYmVzeXMuYyAqLwotCi11OCAgICAgIFg4NkFQSSBCRV9yZGIodTMyIGFkZHIpOwotdTE2ICAgICBYODZBUEkgQkVfcmR3KHUzMiBhZGRyKTsKLXUzMiAgICAgWDg2QVBJIEJFX3JkbCh1MzIgYWRkcik7Ci12b2lkICAgIFg4NkFQSSBCRV93cmIodTMyIGFkZHIsdTggdmFsKTsKLXZvaWQgICAgWDg2QVBJIEJFX3dydyh1MzIgYWRkcix1MTYgdmFsKTsKLXZvaWQgICAgWDg2QVBJIEJFX3dybCh1MzIgYWRkcix1MzIgdmFsKTsKLSNpZmRlZiAgREVCVUcKLXU4ICAgICAgWDg2QVBJIEJFX2luYihpbnQgcG9ydCk7Ci11MTYgICAgIFg4NkFQSSBCRV9pbncoaW50IHBvcnQpOwotdTMyICAgICBYODZBUEkgQkVfaW5sKGludCBwb3J0KTsKLXZvaWQgICAgWDg2QVBJIEJFX291dGIoaW50IHBvcnQsIHU4IHZhbCk7Ci12b2lkICAgIFg4NkFQSSBCRV9vdXR3KGludCBwb3J0LCB1MTYgdmFsKTsKLXZvaWQgICAgWDg2QVBJIEJFX291dGwoaW50IHBvcnQsIHUzMiB2YWwpOwotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX0JJT1NFTVVJX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2Jpb3NlbXUvbWFrZWZpbGUgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L21ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDczMGIyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2Jpb3NlbXUvbWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAgICAgICAgICAgICAgICAgICAgICAgIEJJT1MgZW11bGF0b3IgYW5kIGludGVyZmFjZQotIyAgICAgICAgICAgICAgICAgICAgICB0byBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotIwotIyAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSMgIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSMgIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSMgIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotIyAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotIyAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotIyAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSMgIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0jICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotIwotIyAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0jICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0jICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotIyAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotIyAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0jICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0jICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgR2VuZXJpYyBtYWtlZmlsZSBmb3IgdGhlIHg4NmVtdSBsaWJyYXJ5LiBSZXF1aXJlcwotIyAgICAgICAgICAgICAgIHRoZSBTY2lUZWNoIFNvZnR3YXJlIG1ha2VmaWxlIGRlZmluaXRpb25zIHBhY2thZ2UgdG8gYmUKLSMgICAgICAgICAgICAgICBpbnN0YWxsZWQsIHdoaWNoIHVzZXMgdGhlIERNQUtFIG1ha2UgcHJvZ3JhbS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLS5JTVBPUlQgLklHTk9SRTogREVCVUcKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRGVmaW5lIHRoZSBsaXN0cyBvZiBvYmplY3QgZmlsZXMKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLURMTF9PQkpTICAgICAgICA9IGRsbHN0YXJ0JE8gX3BtX2ltcCRPCi1CSU9TX09CSlMgICAgICAgPSBiaW9zZW11JE8gYmlvcyRPIGJlc3lzJE8KLVg4Nl9PQkpTICAgICAgICA9IHN5cyRPIGRlY29kZSRPIG9wcyRPIG9wczIkTyBwcmltX29wcyRPIGZwdSRPIGRlYnVnJE8KLUNGTEFHUyAgICAgICAgICArPSAtRFNDSVRFQ0ggLUkkKFNDSVRFQ0gpXHNyY1x4ODZlbXUKLQotLklGICQoQlVJTERfRExMKQotCi1DRkxBR1MgICAgICAgICAgKz0gLUkkKFBSSVZBVEUpXGluY2x1ZGVcZHJ2bGliIC1JJChTQ0lURUNIKVxpbmNsdWRlXGRydmxpYiAtRF9fRFJJVkVSX18KLUFTRkxBR1MgICAgICAgICArPSAtZF9fRFJJVkVSX18KLUVYRUxJQlMgICAgICAgICA9IGRydmxpYiRMCi0KLS5FTFNFCi0KLS5JRiAkKERFQlVHKQotQ0ZMQUdTICAgICAgICAgICs9IC1EREVCVUcKLS5FTkRJRgotT0JKRUNUUyAgICAgICAgID0gJChCSU9TX09CSlMpICQoWDg2X09CSlMpCi1MSUJDTEVBTiAgICAgICAgPSAqLmRsbCAqLmxpYiAqLmEKLUxJQkZJTEUgICAgICAgICA9ICQoTFApYmlvc2VtdSRMCi0KLS5FTkRJRgotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBTYW1wbGUgdGVzdCBwcm9ncmFtcwotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYWxsOiAkKExJQkZJTEUpIHdhcm1ib290JEUKLQotd2FybWJvb3QkRTogd2FybWJvb3QkTyAkKExJQkZJTEUpCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRhcmdldCB0byBidWlsZCB0aGUgQmluYXJ5IFBvcnRhYmxlIERMTCB0YXJnZXQKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWJpb3NlbXUuZGxsOiAkKERMTF9PQkpTKSAkKEJJT1NfT0JKUykgJChYODZfT0JKUykKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVGFyZ2V0IHRvIGJ1aWxkIGFsbCBJbnRlbCBiaW5hcnkgZHJpdmVycwotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLlBIT05ZIG1rZHJ2OgotICAgIEBidWlsZCB3YzExLXczMiBiaW9zZW11LmRsbCAtdSBCVUlMRF9ETEw9MSBOT19SVU5USU1FPTEgT1BUPTEKLSAgICBAJChDUCkgYmlvc2VtdS5kbGwgJChQUklWQVRFKVxudWNsZXVzXGdyYXBoaWNzXGJpb3NlbXUuYnBkCi0gICAgQGRtYWtlIGNsZWFuZXhlCi0KLS5QSE9OWSBkYjoKLSAgICBAYnVpbGQgd2MxMS13MzIgYmlvc2VtdS5kbGwgQlVJTERfRExMPTEgTk9fUlVOVElNRT0xIE9QVD0xCi0gICAgQCQoQ1ApIGJpb3NlbXUuZGxsICQoUFJJVkFURSlcbnVjbGV1c1xncmFwaGljc1xiaW9zZW11LmJwZAotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBEZWZpbmUgdGhlIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzIHRvIGNyZWF0ZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGZvcgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotREVQRU5EX09CSiAgICAgID0gd2FybWJvb3QkTyAkKEJJT1NfT0JKUykgJChYODZfT0JKUykgJChETExfT0JKUykKLURFUEVORF9TUkMgICAgICA9ICQoU0NJVEVDSCkvc3JjL3g4NmVtdTskKFBSSVZBVEUpL3NyYy9jb21tb24KLS5TT1VSQ0U6ICAgICAgICAgICQoU0NJVEVDSCkvc3JjL3g4NmVtdSAkKFBSSVZBVEUpL3NyYy9jb21tb24KLQotLklOQ0xVREU6ICIkKFNDSVRFQ0gpL21ha2VkZWZzL2NvbW1vbi5tayIKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2Jpb3NlbXUvbWFrZWZpbGUuY3Jvc3MgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9iaW9zZW11L21ha2VmaWxlLmNyb3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTQxMDAzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2Jpb3NlbXUvbWFrZWZpbGUuY3Jvc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1DQyA9IHBwYy1lbGYzMi1nY2MKLUFSID0gcHBjLWVsZjMyLWFyCi0KLUNGTEFHUyA9IC1EX19EUklWRVJfXyAtSS4uLy4uL2luY2x1ZGUgLURERUJVRyAtSS4KLQotQklPU19PQkpTID0gYmlvc2VtdS5vIGJpb3MubyBiZXN5cy5vCi1YODZfT0JKUyA9IHN5cy5vIGRlY29kZS5vIG9wcy5vIHByaW1fb3BzLm8gZnB1Lm8gZGVidWcubwotCi1saWJiaW9zLmE6ICQoQklPU19PQkpTKQotCSQoQVIpIHJjcyBsaWJiaW9zLmEgJChCSU9TX09CSlMpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvYmlvc2VtdS93YXJtYm9vdC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvYmlvc2VtdS93YXJtYm9vdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGQ1ZmI4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2Jpb3NlbXUvd2FybWJvb3QuYworKysgL2Rldi9udWxsCkBAIC0xLDU2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgIEJJT1MgZW11bGF0b3IgYW5kIGludGVyZmFjZQotKiAgICAgICAgICAgICAgICAgICAgICB0byBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgTW9kdWxlIHRvIGltcGxlbWVudCB3YXJtIGJvb3Rpbmcgb2YgYWxsIFBDSS9BR1AgY29udHJvbGxlcnMKLSogICAgICAgICAgICAgICBvbiB0aGUgYnVzLiBXZSB1c2UgdGhlIHg4NiByZWFsIG1vZGUgZW11bGF0b3IgdG8gcnVuIHRoZQotKiAgICAgICAgICAgICAgIEJJT1Mgb24gdGhlIHByaW1hcnkgYW5kIHNlY29uZGFyeSBjb250cm9sbGVycyB0byBicmluZwotKiAgICAgICAgICAgICAgIHRoZSBjYXJkcyB1cC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgImJpb3NlbXUuaCIKLSNpZm5kZWYgX01BWF9QQVRICi0jZGVmaW5lIF9NQVhfUEFUSCAyNTYKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgUENJRGV2aWNlSW5mbyAgICBQQ0lbTUFYX1BDSV9ERVZJQ0VTXTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgIE51bVBDSSA9IC0xOwotc3RhdGljIGludCAgICAgICAgICAgICAgQnJpZGdlSW5kZXhbTUFYX1BDSV9ERVZJQ0VTXSA9IHswfTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgIE51bUJyaWRnZXM7Ci1zdGF0aWMgUENJQnJpZGdlSW5mbyAgICAqQUdQQnJpZGdlID0gTlVMTDsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgIERldmljZUluZGV4W01BWF9QQ0lfREVWSUNFU10gPSB7MH07Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICBOdW1EZXZpY2VzOwotc3RhdGljIHUzMiAgICAgICAgICAgICAgZGVidWdGbGFncyA9IDA7Ci1zdGF0aWMgQkVfVkdBSW5mbyAgICAgICBWR0FJbmZvW01BWF9QQ0lfREVWSUNFU10gPSB7ezB9fTsKLXN0YXRpYyBpYm9vbCAgICAgICAgICAgIHVzZVY4NiA9IGZhbHNlOwotc3RhdGljIGlib29sICAgICAgICAgICAgZm9yY2VQb3N0ID0gZmFsc2U7Ci0KLS8qIExlbmd0aCBvZiB0aGUgQklPUyBpbWFnZSAqLwotCi0jZGVmaW5lIE1BWF9CSU9TTEVOICAgICAgICAgKDY0ICogMTAyNEwpCi0jZGVmaW5lIEZJTkFMX0JJT1NMRU4gICAgICAgKDMyICogMTAyNEwpCi0KLS8qIE1hY3JvIHRvIGRldGVybWluZSBpZiB0aGUgVkdBIGlzIGVuYWJsZWQgYW5kIHJlc3BvbmRpbmcgKi8KLQotI2RlZmluZSBWR0FfTk9UX0FDVElWRSgpICAgIChmb3JjZVBvc3QgfHwgKFBNX2lucGIoMHgzQ0MpID09IDB4RkYpIHx8ICgoUE1faW5wYigweDNDQykgJiAweDIpID09IDApKQotCi0jZGVmaW5lIEVOQUJMRV9ERVZJQ0UoZGV2aWNlKSAgIFwKLSAgICBQQ0lfd3JpdGVQQ0lSZWdCKDB4NCxQQ0lbRGV2aWNlSW5kZXhbZGV2aWNlXV0uQ29tbWFuZCB8IDB4NyxkZXZpY2UpCi0KLSNkZWZpbmUgRElTQUJMRV9ERVZJQ0UoZGV2aWNlKSAgXAotICAgIFBDSV93cml0ZVBDSVJlZ0IoMHg0LDAsZGV2aWNlKQotCi0vKiBNYWNyb3MgdG8gZW5hYmxlIGFuZCBkaXNhYmxlIEFHUCBWR0EgcmVzb3VyY2VzICovCi0KLSNkZWZpbmUgRU5BQkxFX0FHUF9WR0EoKSAgICBcCi0gICAgUENJX2FjY2Vzc1JlZygweDNFLEFHUEJyaWRnZS0+QnJpZGdlQ29udHJvbCB8IDB4OCxQQ0lfV1JJVEVfV09SRCwoUENJRGV2aWNlSW5mbyopQUdQQnJpZGdlKQotCi0jZGVmaW5lIERJU0FCTEVfQUdQX1ZHQSgpICAgXAotICAgIFBDSV9hY2Nlc3NSZWcoMHgzRSxBR1BCcmlkZ2UtPkJyaWRnZUNvbnRyb2wgJiB+MHg4LFBDSV9XUklURV9XT1JELChQQ0lEZXZpY2VJbmZvKilBR1BCcmlkZ2UpCi0KLSNkZWZpbmUgUkVTVE9SRV9BR1BfVkdBKCkgICBcCi0gICAgUENJX2FjY2Vzc1JlZygweDNFLEFHUEJyaWRnZS0+QnJpZGdlQ29udHJvbCxQQ0lfV1JJVEVfV09SRCwoUENJRGV2aWNlSW5mbyopQUdQQnJpZGdlKQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVUVVJOUzoKLVRoZSBhZGRyZXNzIHRvIHVzZSB0byBtYXAgdGhlIHNlY29uZGFyeSBCSU9TIChQQ0kvQUdQIGRldmljZXMpCi0KLVJFTUFSS1M6Ci1TZWFyY2hlcyBhbGwgdGhlIFBDSSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXJzIGZvciB0aGUgZGV2aWNlIGxvb2tpbmcgZm9yIGEKLW1lbW9yeSBtYXBwaW5nIHRoYXQgaXMgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb3VyIFJPTSBCSU9TLiBXZSB1c3VhbGx5IGVuZCB1cAotZmluZGluZyB0aGUgZnJhbWVidWZmZXIgbWFwcGluZyAodXN1YWxseSBCQVIgMHgxMCksIGFuZCB3ZSB1c2UgdGhpcyBtYXBwaW5nCi10byBtYXAgdGhlIEJJT1MgZm9yIHRoZSBkZXZpY2UgaW50by4gV2UgdXNlIGEgbWFwcGluZyB0aGF0IGlzIGFscmVhZHkKLWFzc2lnbmVkIHRvIHRoZSBkZXZpY2UgdG8gZW5zdXJlIHRoZSBtZW1vcnkgcmFuZ2Ugd2lsbCBiZSBwYXNzZWQgdGhyb3VnaAotYnkgYW55IFBDSS0+UENJIG9yIEFHUC0+UENJIGJyaWRnZSB0aGF0IG1heSBiZSBwcmVzZW50LgotCi1OT1RFOiBVc3VhbGx5IHRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIGZvciBBR1AgZGV2aWNlcywgYnV0IGl0IG1heSBiZQotICAgICAgdXNlZCBmb3IgUENJIGRldmljZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBQT1NUJ2VkIGFuZCB0aGUgQklPUwotICAgICAgUk9NIGJhc2UgYWRkcmVzcyBoYXMgYmVlbiB6ZXJvJ2VkIG91dC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgUENJX2ZpbmRCSU9TQWRkcigKLSAgICBpbnQgZGV2aWNlKQotewotICAgIHVsb25nICAgYmFzZSxzaXplOwotICAgIGludCAgICAgYmFyOwotCi0gICAgZm9yIChiYXIgPSAweDEwOyBiYXIgPD0gMHgxNDsgYmFyKyspIHsKLQliYXNlID0gUENJX3JlYWRQQ0lSZWdMKGJhcixkZXZpY2UpICYgfjB4RkY7Ci0JaWYgKCEoYmFzZSAmIDB4MSkpIHsKLQkgICAgUENJX3dyaXRlUENJUmVnTChiYXIsMHhGRkZGRkZGRixkZXZpY2UpOwotCSAgICBzaXplID0gUENJX3JlYWRQQ0lSZWdMKGJhcixkZXZpY2UpICYgfjB4RkY7Ci0JICAgIHNpemUgPSB+c2l6ZSsxOwotCSAgICBQQ0lfd3JpdGVQQ0lSZWdMKGJhciwwLGRldmljZSk7Ci0JICAgIGlmIChzaXplID49IE1BWF9CSU9TTEVOKQotCQlyZXR1cm4gYmFzZTsKLQkgICAgfQotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZS13cml0ZXMgdGhlIFBDSSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXJzIGZvciB0aGUgc2Vjb25kYXJ5IFBDSSBjb250cm9sbGVyCi13aXRoIHRoZSB2YWx1ZXMgZnJvbSBvdXIgaW5pdGlhbCBQQ0kgYnVzIGVudW1lcmF0aW9uLiBUaGlzIGZpeGVzIHVwIHRoZQotdmFsdWVzIGFmdGVyIHdlIGhhdmUgUE9TVCdlZCB0aGUgc2Vjb25kYXJ5IGRpc3BsYXkgY29udHJvbGxlciBCSU9TLCB3aGljaAotbWF5IGhhdmUgaW5jb3JyZWN0bHkgcmUtcHJvZ3JhbW1lZCB0aGUgYmFzZSByZWdpc3RlcnMgdGhlIHNhbWUgYXMgdGhlCi1wcmltYXJ5IGRpc3BsYXkgY29udHJvbGxlciAodGhlIGNhc2UgZm9yIGlkZW50aWNhbCBTMyBjYXJkcykuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX1BDSV9maXh1cFNlY29uZGFyeUJBUnModm9pZCkKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBOdW1EZXZpY2VzOyBpKyspIHsKLQlQQ0lfd3JpdGVQQ0lSZWdMKDB4MTAsUENJW0RldmljZUluZGV4W2ldXS5CYXNlQWRkcmVzczEwLGkpOwotCVBDSV93cml0ZVBDSVJlZ0woMHgxNCxQQ0lbRGV2aWNlSW5kZXhbaV1dLkJhc2VBZGRyZXNzMTQsaSk7Ci0JUENJX3dyaXRlUENJUmVnTCgweDE4LFBDSVtEZXZpY2VJbmRleFtpXV0uQmFzZUFkZHJlc3MxOCxpKTsKLQlQQ0lfd3JpdGVQQ0lSZWdMKDB4MUMsUENJW0RldmljZUluZGV4W2ldXS5CYXNlQWRkcmVzczFDLGkpOwotCVBDSV93cml0ZVBDSVJlZ0woMHgyMCxQQ0lbRGV2aWNlSW5kZXhbaV1dLkJhc2VBZGRyZXNzMjAsaSk7Ci0JUENJX3dyaXRlUENJUmVnTCgweDI0LFBDSVtEZXZpY2VJbmRleFtpXV0uQmFzZUFkZHJlc3MyNCxpKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVRVUk5TOgotVHJ1ZSBpZiBzdWNjZXNzZnVsbHkgaW5pdGlhbGlzZWQsIGZhbHNlIGlmIG5vdC4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgdGhlIEJJT1MgUE9TVCBjb2RlIG9uIHRoZSBjb250cm9sbGVyLiBXZSBhc3N1bWUgdGhhdAotYXQgdGhpcyBzdGFnZSB0aGUgY29udHJvbGxlciBoYXMgaXRzIEkvTyBhbmQgbWVtb3J5IHNwYWNlIGVuYWJsZWQgYW5kCi10aGF0IGFsbCBvdGhlciBjb250cm9sbGVycyBhcmUgaW4gYSBkaXNhYmxlZCBzdGF0ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBQQ0lfZG9CSU9TUE9TVCgKLSAgICBpbnQgZGV2aWNlLAotICAgIHVsb25nIEJJT1NQaHlzQWRkciwKLSAgICB2b2lkICptYXBwZWRCSU9TLAotICAgIHVsb25nIEJJT1NMZW4pCi17Ci0gICAgUk1SRUdTICAgICAgICAgIHJlZ3M7Ci0gICAgUk1TUkVHUyAgICAgICAgIHNyZWdzOwotCi0gICAgLyogRGV0ZXJtaW5lIHRoZSB2YWx1ZSB0byBzdG9yZSBpbiBBWCBmb3IgQklPUyBQT1NUICovCi0gICAgcmVncy54LmF4ID0gKHUxNikoUENJW0RldmljZUluZGV4W2RldmljZV1dLnNsb3QuaSA+PiA4KTsKLSAgICBpZiAodXNlVjg2KSB7Ci0JLyogUG9zdCB0aGUgQklPUyB1c2luZyB0aGUgUE0gZnVuY3Rpb25zIChpZTogdjg2IG1vZGUgb24gTGludXgpICovCi0JaWYgKCFQTV9kb0JJT1NQT1NUKHJlZ3MueC5heCxCSU9TUGh5c0FkZHIsbWFwcGVkQklPUyxCSU9TTGVuKSkgewotCSAgICAvKiBJZiB0aGUgUE0gZnVuY3Rpb24gZmFpbHMsIHRoaXMgcHJvYmFibHkgbWVhbnMgYXJlIHdlIGFyZSBvbiAqLwotCSAgICAvKiBET1MgYW5kIGNhbid0IHJlLW1hcCB0aGUgcmVhbCBtb2RlIDB4QzAwMDAgcmVnaW9uLiBJbiB0aGlzZSAqLwotCSAgICAvKiBjYXNlIGlmIHRoZSBkZXZpY2UgaXMgdGhlIHByaW1hcnksIHdlIGNhbiB1c2UgdGhlIHJlYWwgKi8KLQkgICAgLyogQklPUyBhdCAweEMwMDAwIGRpcmVjdGx5LiAqLwotCSAgICBpZiAoZGV2aWNlID09IDApCi0JCVBNX2RvQklPU1BPU1QocmVncy54LmF4LDB4QzAwMDAsbWFwcGVkQklPUyxCSU9TTGVuKTsKLQkgICAgfQotCX0KLSAgICBlbHNlIHsKLQkvKiBTZXR1cCB0aGUgWDg2IGVtdWxhdG9yIGZvciB0aGUgVkdBIEJJT1MgKi8KLQlCRV9zZXRWR0EoJlZHQUluZm9bZGV2aWNlXSk7Ci0KLQkvKiBFeGVjdXRlIHRoZSBCSU9TIFBPU1QgY29kZSAqLwotCUJFX2NhbGxSZWFsTW9kZSgweEMwMDAsMHgwMDAzLCZyZWdzLCZzcmVncyk7Ci0KLQkvKiBDbGVhbnVwIGFuZCBleGl0ICovCi0JQkVfZ2V0VkdBKCZWR0FJbmZvW2RldmljZV0pOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1UcnVlIGlmIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXNlZCwgZmFsc2UgaWYgbm90LgotCi1SRU1BUktTOgotTG9hZHMgYW5kIFBPU1QncyB0aGUgc2Vjb25kYXJ5IGNvbnRyb2xsZXJzIEJJT1MsIGRpcmVjdGx5IGZyb20gdGhlIEJJT1MKLWltYWdlIHdlIGNhbiBleHRyYWN0IG92ZXIgdGhlIFBDSSBidXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGlib29sIFBDSV9wb3N0Q29udHJvbGxlcnModm9pZCkKLXsKLSAgICBpbnQgICAgIGRldmljZTsKLSAgICB1bG9uZyAgIEJJT1NJbWFnZUxlbixtYXBwZWRCSU9TUGh5czsKLSAgICB1Y2hhciAgICptYXBwZWRCSU9TLCpjb3B5T2ZCSU9TOwotICAgIGNoYXIgICAgZmlsZW5hbWVbX01BWF9QQVRIXTsKLSAgICBGSUxFICAgICpmOwotCi0gICAgLyogRGlzYWJsZSB0aGUgcHJpbWFyeSBkaXNwbGF5IGNvbnRyb2xsZXIgYW5kIEFHUCBWR0EgcGFzcy10aHJvdWdoICovCi0gICAgRElTQUJMRV9ERVZJQ0UoMCk7Ci0gICAgaWYgKEFHUEJyaWRnZSkKLQlESVNBQkxFX0FHUF9WR0EoKTsKLQotICAgIC8qIE5vdyBQT1NUIGFsbCB0aGUgc2Vjb25kYXJ5IGNvbnRyb2xsZXJzICovCi0gICAgZm9yIChkZXZpY2UgPSAwOyBkZXZpY2UgPCBOdW1EZXZpY2VzOyBkZXZpY2UrKykgewotCS8qIFNraXAgdGhlIGRldmljZSBpZiBpdCBpcyBub3QgZW5hYmxlZCAocHJvYmFibHkgYW4gSVNBIGRldmljZSkgKi8KLQlpZiAoRGV2aWNlSW5kZXhbZGV2aWNlXSA9PSAtMSkKLQkgICAgY29udGludWU7Ci0KLQkvKiBFbmFibGUgc2Vjb25kYXJ5IGRpc3BsYXkgY29udHJvbGxlci4gSWYgdGhlIHNlY29uZGFyeSBjb250cm9sbGVyICovCi0JLyogaXMgb24gdGhlIEFHUCBidXMsIHRoZW4gZW5hYmxlIFZHQSByZXNvdXJjZXMgZm9yIHRoZSBBR1AgZGV2aWNlLiAqLwotCUVOQUJMRV9ERVZJQ0UoZGV2aWNlKTsKLQlpZiAoQUdQQnJpZGdlICYmIEFHUEJyaWRnZS0+U2Vjb25kYXlCdXNOdW1iZXIgPT0gUENJW0RldmljZUluZGV4W2RldmljZV1dLnNsb3QucC5CdXMpCi0JICAgIEVOQUJMRV9BR1BfVkdBKCk7Ci0KLQkvKiBDaGVjayBpZiB0aGUgY29udHJvbGxlciBoYXMgYWxyZWFkeSBiZWVuIFBPU1QnZWQgKi8KLQlpZiAoVkdBX05PVF9BQ1RJVkUoKSkgewotCSAgICAvKiBGaW5kIGEgdmlhYmxlIHBsYWNlIHRvIG1hcCB0aGUgc2Vjb25kYXJ5IFBDSSBCSU9TIGltYWdlIGFuZCBtYXAgaXQgKi8KLQkgICAgcHJpbnRrKCJEZXZpY2UgJWQgbm90IGVuYWJsZWQsIHNvIGF0dGVtcHRpbmcgd2FybSBib290IGl0XG4iLCBkZXZpY2UpOwotCi0JICAgIC8qIEZvciBBR1AgZGV2aWNlcyAoYW5kIFBDSSBkZXZpY2VzIHRoYXQgZG8gaGF2ZSB0aGUgUk9NIGJhc2UgKi8KLQkgICAgLyogYWRkcmVzcyB6ZXJvJ2VkIG91dCkgd2UgaGF2ZSB0byBtYXAgdGhlIEJJT1MgdG8gYSBsb2NhdGlvbiAqLwotCSAgICAvKiB0aGF0IGlzIHBhc3NlZCBieSB0aGUgQUdQIGJyaWRnZSB0byB0aGUgYnVzLiBTb21lIEFHUCBkZXZpY2VzICovCi0JICAgIC8qIGhhdmUgdGhlIFJPTSBiYXNlIGFkZHJlc3MgYWxyZWFkeSBzZXQgdXAgZm9yIHVzLCBhbmQgc29tZSAqLwotCSAgICAvKiBkbyBub3QgKHdlIG1hcCB0byBvbmUgb2YgdGhlIGV4aXN0aW5nIEJBUiBsb2NhdGlvbnMgaW4gKi8KLQkgICAgLyogdGhpcyBjYXNlKS4gKi8KLQkgICAgbWFwcGVkQklPUyA9IE5VTEw7Ci0JICAgIGlmIChQQ0lbRGV2aWNlSW5kZXhbZGV2aWNlXV0uUk9NQmFzZUFkZHJlc3MgIT0gMCkKLQkJbWFwcGVkQklPU1BoeXMgPSBQQ0lbRGV2aWNlSW5kZXhbZGV2aWNlXV0uUk9NQmFzZUFkZHJlc3MgJiB+MHhGOwotCSAgICBlbHNlCi0JCW1hcHBlZEJJT1NQaHlzID0gUENJX2ZpbmRCSU9TQWRkcihkZXZpY2UpOwotCSAgICBwcmludGsoIk1hcHBpbmcgQklPUyBpbWFnZSB0byAweCUwOFhcbiIsIG1hcHBlZEJJT1NQaHlzKTsKLQkgICAgbWFwcGVkQklPUyA9IFBNX21hcFBoeXNpY2FsQWRkcihtYXBwZWRCSU9TUGh5cyxNQVhfQklPU0xFTi0xLGZhbHNlKTsKLQkgICAgUENJX3dyaXRlUENJUmVnTCgweDMwLG1hcHBlZEJJT1NQaHlzIHwgMHgxLGRldmljZSk7Ci0JICAgIEJJT1NJbWFnZUxlbiA9IG1hcHBlZEJJT1NbMl0gKiA1MTI7Ci0JICAgIGlmICgoY29weU9mQklPUyA9IG1hbGxvYyhCSU9TSW1hZ2VMZW4pKSA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIG1lbWNweShjb3B5T2ZCSU9TLG1hcHBlZEJJT1MsQklPU0ltYWdlTGVuKTsKLQkgICAgUE1fZnJlZVBoeXNpY2FsQWRkcihtYXBwZWRCSU9TLE1BWF9CSU9TTEVOLTEpOwotCi0JICAgIC8qIEFsbG9jYXRlIG1lbW9yeSB0byBzdG9yZSBjb3B5IG9mIEJJT1MgZnJvbSBzZWNvbmRhcnkgY29udHJvbGxlcnMgKi8KLQkgICAgVkdBSW5mb1tkZXZpY2VdLnBjaUluZm8gPSAmUENJW0RldmljZUluZGV4W2RldmljZV1dOwotCSAgICBWR0FJbmZvW2RldmljZV0uQklPU0ltYWdlID0gY29weU9mQklPUzsKLQkgICAgVkdBSW5mb1tkZXZpY2VdLkJJT1NJbWFnZUxlbiA9IEJJT1NJbWFnZUxlbjsKLQotCSAgICAvKiBSZXN0b3JlIGRldmljZSBtYXBwaW5ncyAqLwotCSAgICBQQ0lfd3JpdGVQQ0lSZWdMKDB4MzAsUENJW0RldmljZUluZGV4W2RldmljZV1dLlJPTUJhc2VBZGRyZXNzLGRldmljZSk7Ci0JICAgIFBDSV93cml0ZVBDSVJlZ0woMHgxMCxQQ0lbRGV2aWNlSW5kZXhbZGV2aWNlXV0uQmFzZUFkZHJlc3MxMCxkZXZpY2UpOwotCSAgICBQQ0lfd3JpdGVQQ0lSZWdMKDB4MTQsUENJW0RldmljZUluZGV4W2RldmljZV1dLkJhc2VBZGRyZXNzMTQsZGV2aWNlKTsKLQotCSAgICAvKiBOb3cgZXhlY3V0ZSB0aGUgQklPUyBQT1NUIGZvciB0aGUgZGV2aWNlICovCi0JICAgIGlmIChjb3B5T2ZCSU9TWzBdID09IDB4NTUgJiYgY29weU9mQklPU1sxXSA9PSAweEFBKSB7Ci0JCXByaW50aygiRXhlY3V0aW5nIEJJT1MgUE9TVCBmb3IgY29udHJvbGxlci5cbiIpOwotCQlQQ0lfZG9CSU9TUE9TVChkZXZpY2UsbWFwcGVkQklPU1BoeXMsY29weU9mQklPUyxCSU9TSW1hZ2VMZW4pOwotCQl9Ci0KLQkgICAgLyogUmVzZXQgdGhlIHNpemUgb2YgdGhlIEJJT1MgaW1hZ2UgdG8gdGhlIGZpbmFsIHNpemUgKi8KLQkgICAgVkdBSW5mb1tkZXZpY2VdLkJJT1NJbWFnZUxlbiA9IEZJTkFMX0JJT1NMRU47Ci0KLQkgICAgLyogU2F2ZSB0aGUgQklPUyBhbmQgaW50ZXJydXB0IHZlY3RvciBpbmZvcm1hdGlvbiB0byBkaXNrICovCi0JICAgIHNwcmludGYoZmlsZW5hbWUsIiVzL2Jpb3MuJTAyZCIsUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgoKSxkZXZpY2UpOwotCSAgICBpZiAoKGYgPSBmb3BlbihmaWxlbmFtZSwid2IiKSkgIT0gTlVMTCkgewotCQlmd3JpdGUoY29weU9mQklPUywxLEZJTkFMX0JJT1NMRU4sZik7Ci0JCWZ3cml0ZShWR0FJbmZvW2RldmljZV0uTG93TWVtLDEsc2l6ZW9mKFZHQUluZm9bZGV2aWNlXS5Mb3dNZW0pLGYpOwotCQlmY2xvc2UoZik7Ci0JCX0KLQkgICAgfQotCWVsc2UgewotCSAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgdG8gc3RvcmUgY29weSBvZiBCSU9TIGZyb20gc2Vjb25kYXJ5IGNvbnRyb2xsZXJzICovCi0JICAgIGlmICgoY29weU9mQklPUyA9IG1hbGxvYyhGSU5BTF9CSU9TTEVOKSkgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICBWR0FJbmZvW2RldmljZV0ucGNpSW5mbyA9ICZQQ0lbRGV2aWNlSW5kZXhbZGV2aWNlXV07Ci0JICAgIFZHQUluZm9bZGV2aWNlXS5CSU9TSW1hZ2UgPSBjb3B5T2ZCSU9TOwotCSAgICBWR0FJbmZvW2RldmljZV0uQklPU0ltYWdlTGVuID0gRklOQUxfQklPU0xFTjsKLQotCSAgICAvKiBMb2FkIHRoZSBCSU9TIGFuZCBpbnRlcnJ1cHQgdmVjdG9yIGluZm9ybWF0aW9uIGZyb20gZGlzayAqLwotCSAgICBzcHJpbnRmKGZpbGVuYW1lLCIlcy9iaW9zLiUwMmQiLFBNX2dldE51Y2xldXNDb25maWdQYXRoKCksZGV2aWNlKTsKLQkgICAgaWYgKChmID0gZm9wZW4oZmlsZW5hbWUsInJiIikpICE9IE5VTEwpIHsKLQkJZnJlYWQoY29weU9mQklPUywxLEZJTkFMX0JJT1NMRU4sZik7Ci0JCWZyZWFkKFZHQUluZm9bZGV2aWNlXS5Mb3dNZW0sMSxzaXplb2YoVkdBSW5mb1tkZXZpY2VdLkxvd01lbSksZik7Ci0JCWZjbG9zZShmKTsKLQkJfQotCSAgICB9Ci0KLQkvKiBGaXggdXAgYWxsIHRoZSBzZWNvbmRhcnkgUENJIGJhc2UgYWRkcmVzcyByZWdpc3RlcnMgKi8KLQkvKiAocmVzdG9yZXMgdGhlbSBhbGwgZnJvbSB0aGUgdmFsdWVzIHdlIHJlYWQgcHJldmlvdXNseSkgKi8KLQlfUENJX2ZpeHVwU2Vjb25kYXJ5QkFScygpOwotCi0JLyogRGlzYWJsZSB0aGUgc2Vjb25kYXJ5IGNvbnRyb2xsZXIgYW5kIEFHUCBWR0EgcGFzcy10aHJvdWdoICovCi0JRElTQUJMRV9ERVZJQ0UoZGV2aWNlKTsKLQlpZiAoQUdQQnJpZGdlKQotCSAgICBESVNBQkxFX0FHUF9WR0EoKTsKLQl9Ci0KLSAgICAvKiBSZWVuYWJsZSBwcmltYXJ5IGRpc3BsYXkgY29udHJvbGxlciBhbmQgcmVzZXQgQUdQIGJyaWRnZSBjb250cm9sICovCi0gICAgaWYgKEFHUEJyaWRnZSkKLQlSRVNUT1JFX0FHUF9WR0EoKTsKLSAgICBFTkFCTEVfREVWSUNFKDApOwotCi0gICAgLyogRnJlZSBwaHlzaWNhbCBCSU9TIGltYWdlIG1hcHBpbmcgKi8KLSAgICBQTV9mcmVlUGh5c2ljYWxBZGRyKG1hcHBlZEJJT1MsTUFYX0JJT1NMRU4tMSk7Ci0KLSAgICAvKiBSZXN0b3JlIHRoZSBYODYgZW11bGF0b3IgQklPUyBpbmZvIHRvIHByaW1hcnkgY29udHJvbGxlciAqLwotICAgIGlmICghdXNlVjg2KQotCUJFX3NldFZHQSgmVkdBSW5mb1swXSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRW51bWVyYXRlcyB0aGUgUENJIGJ1cyBhbmQgZHVtcHMgdGhlIFBDSSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHRvIHRoZQotbG9nIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgRW51bWVyYXRlUENJKHZvaWQpCi17Ci0gICAgaW50ICAgICAgICAgICAgIGksaW5kZXg7Ci0gICAgUENJQnJpZGdlSW5mbyAgICppbmZvOwotCi0gICAgcHJpbnRrKCJEaXNwbGF5aW5nIGVudW1lcmF0aW9uIG9mIFBDSSBidXMgKCVkIGRldmljZXMsICVkIGRpc3BsYXkgZGV2aWNlcylcbiIsCi0JTnVtUENJLCBOdW1EZXZpY2VzKTsKLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOdW1EZXZpY2VzOyBpbmRleCsrKQotCXByaW50aygiICBEaXNwbGF5IGRldmljZSAlZCBpcyBQQ0kgZGV2aWNlICVkXG4iLGluZGV4LERldmljZUluZGV4W2luZGV4XSk7Ci0gICAgcHJpbnRrKCJcbiIpOwotICAgIHByaW50aygiQnVzIFNsb3QgRm5jIERldmljZUlEICBTdWJTeXN0ZW0gUmV2IENsYXNzIElSUSBJbnQgQ21kXG4iKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTnVtUENJOyBpKyspIHsKLQlwcmludGsoIiUyZCAgICUyZCAgJTJkICAlMDRYOiUwNFggJTA0WDolMDRYICUwMlggICUwMlg6JTAyWCAlMDJYICAlMDJYICAlMDRYICAgIiwKLQkgICAgUENJW2ldLnNsb3QucC5CdXMsCi0JICAgIFBDSVtpXS5zbG90LnAuRGV2aWNlLAotCSAgICBQQ0lbaV0uc2xvdC5wLkZ1bmN0aW9uLAotCSAgICBQQ0lbaV0uVmVuZG9ySUQsCi0JICAgIFBDSVtpXS5EZXZpY2VJRCwKLQkgICAgUENJW2ldLlN1YlN5c3RlbVZlbmRvcklELAotCSAgICBQQ0lbaV0uU3ViU3lzdGVtSUQsCi0JICAgIFBDSVtpXS5SZXZJRCwKLQkgICAgUENJW2ldLkJhc2VDbGFzcywKLQkgICAgUENJW2ldLlN1YkNsYXNzLAotCSAgICBQQ0lbaV0uSW50ZXJydXB0TGluZSwKLQkgICAgUENJW2ldLkludGVycnVwdFBpbiwKLQkgICAgUENJW2ldLkNvbW1hbmQpOwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE51bURldmljZXM7IGluZGV4KyspIHsKLQkgICAgaWYgKERldmljZUluZGV4W2luZGV4XSA9PSBpKQotCQlicmVhazsKLQkgICAgfQotCWlmIChpbmRleCA8IE51bURldmljZXMpCi0JICAgIHByaW50aygiPC0gJWRcbiIsIGluZGV4KTsKLQllbHNlCi0JICAgIHByaW50aygiXG4iKTsKLQl9Ci0gICAgcHJpbnRrKCJcbiIpOwotICAgIHByaW50aygiRGV2aWNlSUQgIFN0YXQgSWZjIENjaCBMYXQgSGRyIEJJU1RcbiIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBOdW1QQ0k7IGkrKykgewotCXByaW50aygiJTA0WDolMDRYICUwNFggICUwMlggICUwMlggICUwMlggICUwMlggICUwMlggICAiLAotCSAgICBQQ0lbaV0uVmVuZG9ySUQsCi0JICAgIFBDSVtpXS5EZXZpY2VJRCwKLQkgICAgUENJW2ldLlN0YXR1cywKLQkgICAgUENJW2ldLkludGVyZmFjZSwKLQkgICAgUENJW2ldLkNhY2hlTGluZVNpemUsCi0JICAgIFBDSVtpXS5MYXRlbmN5VGltZXIsCi0JICAgIFBDSVtpXS5IZWFkZXJUeXBlLAotCSAgICBQQ0lbaV0uQklTVCk7Ci0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTnVtRGV2aWNlczsgaW5kZXgrKykgewotCSAgICBpZiAoRGV2aWNlSW5kZXhbaW5kZXhdID09IGkpCi0JCWJyZWFrOwotCSAgICB9Ci0JaWYgKGluZGV4IDwgTnVtRGV2aWNlcykKLQkgICAgcHJpbnRrKCI8LSAlZFxuIiwgaW5kZXgpOwotCWVsc2UKLQkgICAgcHJpbnRrKCJcbiIpOwotCX0KLSAgICBwcmludGsoIlxuIik7Ci0gICAgcHJpbnRrKCJEZXZpY2VJRCAgQmFzZTEwaCAgQmFzZTE0aCAgQmFzZTE4aCAgQmFzZTFDaCAgQmFzZTIwaCAgQmFzZTI0aCAgUk9NQmFzZVxuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IE51bVBDSTsgaSsrKSB7Ci0JcHJpbnRrKCIlMDRYOiUwNFggJTA4WCAlMDhYICUwOFggJTA4WCAlMDhYICUwOFggJTA4WCAiLAotCSAgICBQQ0lbaV0uVmVuZG9ySUQsCi0JICAgIFBDSVtpXS5EZXZpY2VJRCwKLQkgICAgUENJW2ldLkJhc2VBZGRyZXNzMTAsCi0JICAgIFBDSVtpXS5CYXNlQWRkcmVzczE0LAotCSAgICBQQ0lbaV0uQmFzZUFkZHJlc3MxOCwKLQkgICAgUENJW2ldLkJhc2VBZGRyZXNzMUMsCi0JICAgIFBDSVtpXS5CYXNlQWRkcmVzczIwLAotCSAgICBQQ0lbaV0uQmFzZUFkZHJlc3MyNCwKLQkgICAgUENJW2ldLlJPTUJhc2VBZGRyZXNzKTsKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOdW1EZXZpY2VzOyBpbmRleCsrKSB7Ci0JICAgIGlmIChEZXZpY2VJbmRleFtpbmRleF0gPT0gaSkKLQkJYnJlYWs7Ci0JICAgIH0KLQlpZiAoaW5kZXggPCBOdW1EZXZpY2VzKQotCSAgICBwcmludGsoIjwtICVkXG4iLCBpbmRleCk7Ci0JZWxzZQotCSAgICBwcmludGsoIlxuIik7Ci0JfQotICAgIHByaW50aygiXG4iKTsKLSAgICBwcmludGsoIkRldmljZUlEICBCQVIxMExlbiBCQVIxNExlbiBCQVIxOExlbiBCQVIxQ0xlbiBCQVIyMExlbiBCQVIyNExlbiBST01MZW5cbiIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBOdW1QQ0k7IGkrKykgewotCXByaW50aygiJTA0WDolMDRYICUwOFggJTA4WCAlMDhYICUwOFggJTA4WCAlMDhYICUwOFggIiwKLQkgICAgUENJW2ldLlZlbmRvcklELAotCSAgICBQQ0lbaV0uRGV2aWNlSUQsCi0JICAgIFBDSVtpXS5CYXNlQWRkcmVzczEwTGVuLAotCSAgICBQQ0lbaV0uQmFzZUFkZHJlc3MxNExlbiwKLQkgICAgUENJW2ldLkJhc2VBZGRyZXNzMThMZW4sCi0JICAgIFBDSVtpXS5CYXNlQWRkcmVzczFDTGVuLAotCSAgICBQQ0lbaV0uQmFzZUFkZHJlc3MyMExlbiwKLQkgICAgUENJW2ldLkJhc2VBZGRyZXNzMjRMZW4sCi0JICAgIFBDSVtpXS5ST01CYXNlQWRkcmVzc0xlbik7Ci0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTnVtRGV2aWNlczsgaW5kZXgrKykgewotCSAgICBpZiAoRGV2aWNlSW5kZXhbaW5kZXhdID09IGkpCi0JCWJyZWFrOwotCSAgICB9Ci0JaWYgKGluZGV4IDwgTnVtRGV2aWNlcykKLQkgICAgcHJpbnRrKCI8LSAlZFxuIiwgaW5kZXgpOwotCWVsc2UKLQkgICAgcHJpbnRrKCJcbiIpOwotCX0KLSAgICBwcmludGsoIlxuIik7Ci0gICAgcHJpbnRrKCJEaXNwbGF5aW5nIGVudW1lcmF0aW9uIG9mICVkIGJyaWRnZSBkZXZpY2VzXG4iLE51bUJyaWRnZXMpOwotICAgIHByaW50aygiXG4iKTsKLSAgICBwcmludGsoIkRldmljZUlEICBQIyBTIyBCIyBJT0IgIElPTCAgTWVtQmFzZSAgTWVtTGltaXQgUHJlQmFzZSAgUHJlTGltaXQgQ3RybFxuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IE51bUJyaWRnZXM7IGkrKykgewotCWluZm8gPSAoUENJQnJpZGdlSW5mbyopJlBDSVtCcmlkZ2VJbmRleFtpXV07Ci0JcHJpbnRrKCIlMDRYOiUwNFggJTAyWCAlMDJYICUwMlggJTA0WCAlMDRYICUwOFggJTA4WCAlMDhYICUwOFggJTA0WFxuIiwKLQkgICAgaW5mby0+VmVuZG9ySUQsCi0JICAgIGluZm8tPkRldmljZUlELAotCSAgICBpbmZvLT5QcmltYXJ5QnVzTnVtYmVyLAotCSAgICBpbmZvLT5TZWNvbmRheUJ1c051bWJlciwKLQkgICAgaW5mby0+U3Vib3JkaW5hdGVCdXNOdW1iZXIsCi0JICAgICgodTE2KWluZm8tPklPQmFzZSA8PCA4KSAmIDB4RjAwMCwKLQkgICAgaW5mby0+SU9MaW1pdCA/Ci0JCSgodTE2KWluZm8tPklPTGltaXQgPDwgOCkgfCAweEZGRiA6IDAsCi0JICAgICgodTMyKWluZm8tPk1lbW9yeUJhc2UgPDwgMTYpICYgMHhGRkYwMDAwMCwKLQkgICAgaW5mby0+TWVtb3J5TGltaXQgPwotCQkoKHUzMilpbmZvLT5NZW1vcnlMaW1pdCA8PCAxNikgfCAweEZGRkZGIDogMCwKLQkgICAgKCh1MzIpaW5mby0+UHJlZmV0Y2hhYmxlTWVtb3J5QmFzZSA8PCAxNikgJiAweEZGRjAwMDAwLAotCSAgICBpbmZvLT5QcmVmZXRjaGFibGVNZW1vcnlMaW1pdCA/Ci0JCSgodTMyKWluZm8tPlByZWZldGNoYWJsZU1lbW9yeUxpbWl0IDw8IDE2KSB8IDB4RkZGRkYgOiAwLAotCSAgICBpbmZvLT5CcmlkZ2VDb250cm9sKTsKLQl9Ci0gICAgcHJpbnRrKCJcbiIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVUVVJOUzoKLU51bWJlciBvZiBkaXNwbGF5IGRldmljZXMgZm91bmQuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGVudW1lcmF0ZXMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgZGlzcGxheSBkZXZpY2VzIG9uIHRoZQotUENJIGJ1cywgYW5kIHJldHVybnMgdGhlIG51bWJlciBmb3VuZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IFBDSV9lbnVtZXJhdGVEZXZpY2VzKHZvaWQpCi17Ci0gICAgaW50ICAgICAgICAgICAgIGksajsKLSAgICBQQ0lCcmlkZ2VJbmZvICAgKmluZm87Ci0KLSAgICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgYmVlbiBjYWxsZWQsIGVudW1lcmF0ZSBhbGwgKi8KLSAgICAvKiBkZXZpY2VzIG9uIHRoZSBQQ0kgYnVzLiAqLwotICAgIGlmIChOdW1QQ0kgPT0gLTEpIHsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX1BDSV9ERVZJQ0VTOyBpKyspCi0JICAgIFBDSVtpXS5kd1NpemUgPSBzaXplb2YoUENJW2ldKTsKLQlpZiAoKE51bVBDSSA9IFBDSV9lbnVtZXJhdGUoUENJLE1BWF9QQ0lfREVWSUNFUykpID09IDApCi0JICAgIHJldHVybiAtMTsKLQotCS8qIEJ1aWxkIGEgbGlzdCBvZiBhbGwgUENJIGJyaWRnZSBkZXZpY2VzICovCi0JZm9yIChpID0gMCxOdW1CcmlkZ2VzID0gMCxCcmlkZ2VJbmRleFswXSA9IC0xOyBpIDwgTnVtUENJOyBpKyspIHsKLQkgICAgaWYgKFBDSVtpXS5CYXNlQ2xhc3MgPT0gUENJX0JSSURHRV9DTEFTUykgewotCQlpZiAoTnVtQnJpZGdlcyA8IE1BWF9QQ0lfREVWSUNFUykKLQkJICAgIEJyaWRnZUluZGV4W051bUJyaWRnZXMrK10gPSBpOwotCQl9Ci0JICAgIH0KLQotCS8qIE5vdyBidWlsZCBhIGxpc3Qgb2YgYWxsIGRpc3BsYXkgY2xhc3MgZGV2aWNlcyAqLwotCWZvciAoaSA9IDAsTnVtRGV2aWNlcyA9IDEsRGV2aWNlSW5kZXhbMF0gPSAtMTsgaSA8IE51bVBDSTsgaSsrKSB7Ci0JICAgIGlmIChQQ0lfSVNfRElTUExBWV9DTEFTUygmUENJW2ldKSkgewotCQlpZiAoKFBDSVtpXS5Db21tYW5kICYgMHgzKSA9PSAweDMpIHsKLQkJICAgIERldmljZUluZGV4WzBdID0gaTsKLQkJICAgIH0KLQkJZWxzZSB7Ci0JCSAgICBpZiAoTnVtRGV2aWNlcyA8IE1BWF9QQ0lfREVWSUNFUykKLQkJCURldmljZUluZGV4W051bURldmljZXMrK10gPSBpOwotCQkgICAgfQotCQlpZiAoUENJW2ldLnNsb3QucC5CdXMgIT0gMCkgewotCQkgICAgLyogVGhpcyBkZXZpY2UgaXMgb24gYSBkaWZmZXJlbnQgYnVzIHRoYW4gdGhlIHByaW1hcnkgKi8KLQkJICAgIC8qIFBDSSBidXMsIHNvIGl0IGlzIHByb2JhYmx5IGFuIEFHUCBkZXZpY2UuIEZpbmQgdGhlICovCi0JCSAgICAvKiBBR1AgYnVzIGRldmljZSB0aGF0IGNvbnRyb2xzIHRoYXQgYnVzIHNvIHdlIGNhbiAqLwotCQkgICAgLyogY29udHJvbCBpdC4gKi8KLQkJICAgIGZvciAoaiA9IDA7IGogPCBOdW1CcmlkZ2VzOyBqKyspIHsKLQkJCWluZm8gPSAoUENJQnJpZGdlSW5mbyopJlBDSVtCcmlkZ2VJbmRleFtqXV07Ci0JCQlpZiAoaW5mby0+U2Vjb25kYXlCdXNOdW1iZXIgPT0gUENJW2ldLnNsb3QucC5CdXMpIHsKLQkJCSAgICBBR1BCcmlkZ2UgPSBpbmZvOwotCQkJICAgIGJyZWFrOwotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkvKiBFbnVtZXJhdGUgYWxsIFBDSSBhbmQgYnJpZGdlIGRldmljZXMgdG8gbG9nIGZpbGUgKi8KLQlFbnVtZXJhdGVQQ0koKTsKLQl9Ci0gICAgcmV0dXJuIE51bURldmljZXM7Ci19Ci0KLUZJTEUgKmxvZ2ZpbGU7Ci0KLXZvaWQgcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotICAgIHZhX2xpc3QgYXJncHRyOwotICAgIHZhX3N0YXJ0KGFyZ3B0ciwgZm10KTsKLSAgICB2ZnByaW50Zihsb2dmaWxlLCBmbXQsIGFyZ3B0cik7Ci0gICAgZmZsdXNoKGxvZ2ZpbGUpOwotICAgIHZhX2VuZChhcmdwdHIpOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10pCi17Ci0gICAgd2hpbGUgKGFyZ2MgPiAxKSB7Ci0JaWYgKHN0cmljbXAoYXJndlsxXSwiLXVzZXY4NiIpID09IDApIHsKLQkgICAgdXNlVjg2ID0gdHJ1ZTsKLQkgICAgfQotCWVsc2UgaWYgKHN0cmljbXAoYXJndlsxXSwiLWZvcmNlIikgPT0gMCkgewotCSAgICBmb3JjZVBvc3QgPSB0cnVlOwotCSAgICB9Ci0jaWZkZWYgIERFQlVHCi0JZWxzZSBpZiAoc3RyaWNtcChhcmd2WzFdLCItZGVjb2RlIikgPT0gMCkgewotCSAgICBkZWJ1Z0ZsYWdzIHw9IERFQlVHX0RFQ09ERV9GOwotCSAgICB9Ci0JZWxzZSBpZiAoc3RyaWNtcChhcmd2WzFdLCItaW90cmFjZSIpID09IDApIHsKLQkgICAgZGVidWdGbGFncyB8PSBERUJVR19JT19UUkFDRV9GOwotCSAgICB9Ci0jZW5kaWYKLQllbHNlIHsKLQkgICAgcHJpbnRmKCJVc2FnZTogd2FybWJvb3QgWy11c2V2ODZdIFstZm9yY2VdIFstZGVjb2RlXSBbLWlvdHJhY2VdXG4iKTsKLQkgICAgZXhpdCgtMSk7Ci0JICAgIH0KLQlhcmdjLS07Ci0JYXJndisrOwotCX0KLSAgICBpZiAoKGxvZ2ZpbGUgPSBmb3Blbigid2FybWJvb3QubG9nIiwidyIpKSA9PSBOVUxMKQotCWV4aXQoMSk7Ci0KLSAgICBQTV9pbml0KCk7Ci0gICAgaWYgKCF1c2VWODYpIHsKLQkvKiBJbml0aWFsaXNlIHRoZSB4ODYgQklPUyBlbXVsYXRvciAqLwotCUJFX2luaXQoZmFsc2UsZGVidWdGbGFncyw2NTUzNiwmVkdBSW5mb1swXSk7Ci0JfQotCi0gICAgLyogRW51bWVyYXRlIGFsbCBkZXZpY2VzICh3aGljaCBQT1NUJ3MgdGhlbSBhdCB0aGUgc2FtZSB0aW1lKSAqLwotICAgIGlmIChQQ0lfZW51bWVyYXRlRGV2aWNlcygpIDwgMSkgewotCXByaW50aygiTm8gUENJIGRpc3BsYXkgZGV2aWNlcyBmb3VuZCFcbiIpOwotCXJldHVybiAtMTsKLQl9Ci0KLSAgICAvKiBQb3N0IGFsbCB0aGUgZGlzcGxheSBjb250cm9sbGVyIEJJT1MnZXMgKi8KLSAgICBQQ0lfcG9zdENvbnRyb2xsZXJzKCk7Ci0KLSAgICAvKiBDbGVhbnVwIGFuZCBleGl0IHRoZSBlbXVsYXRvciAqLwotICAgIGlmICghdXNlVjg2KQotCUJFX2V4aXQoKTsKLSAgICBmY2xvc2UobG9nZmlsZSk7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vX2FhX2ltcC5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vX2FhX2ltcC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYTkwMjQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL19hYV9pbXAuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqCi07KiAgICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBBdWRpbyBBcmNoaXRlY3R1cmUKLTsqCi07KiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci07KiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotOyogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKLTsqICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Ci07KiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAotOyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLTsqICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Ci07KiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAotOyogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKLTsqICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Ci07KiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotOyogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKLTsqICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Ci07KiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAotOyogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLTsqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci07KiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiBMYW5ndWFnZTogICAgVEFTTSA0LjAgb3IgTkFTTQotOyogRW52aXJvbm1lbnQ6IElCTSBQQyAzMiBiaXQgUHJvdGVjdGVkIE1vZGUuCi07KgotOyogRGVzY3JpcHRpb246IE1vZHVsZSB0byBpbXBsZW1lbnQgdGhlIGltcG9ydCBzdHVicyBmb3IgYWxsIHRoZSBOdWNsZXVzCi07KiAgICAgICAgICAgICAgQXVkaW8gQVBJIGZ1bmN0aW9ucyBmb3IgSW50ZWwgYmluYXJ5IGNvbXBhdGlibGUgZHJpdmVycy4KLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIElERUFMCi0KLWluY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgOyBNZW1vcnkgbW9kZWwgbWFjcm9zCi0KLUJFR0lOX0lNUE9SVFNfREVGICAgX0FBX2V4cG9ydHMKLVNLSVBfSU1QICAgIEFBX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIDsgSW1wbGVtZW50ZWQgaW4gQyBjb2RlCi1TS0lQX0lNUCAgICBBQV9lcnJvck1zZyAgICAgICAgICAgICAgICAgICA7IEltcGxlbWVudGVkIGluIEMgY29kZQotU0tJUF9JTVAgICAgQUFfZ2V0RGF5c0xlZnQgICAgICAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKLVNLSVBfSU1QICAgIEFBX3JlZ2lzdGVyTGljZW5zZSAgICAgICAgICAgIDsgSW1wbGVtZW50ZWQgaW4gQyBjb2RlCi1TS0lQX0lNUCAgICBBQV9lbnVtZXJhdGVEZXZpY2VzICAgICAgICAgICA7IEltcGxlbWVudGVkIGluIEMgY29kZQotU0tJUF9JTVAgICAgQUFfbG9hZERyaXZlciAgICAgICAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKLURFQ0xBUkVfSU1QIEFBX3VubG9hZERyaXZlcgotREVDTEFSRV9JTVAgQUFfc2F2ZU9wdGlvbnMKLUVORF9JTVBPUlRTX0RFRgotCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL19nYV9pbXAuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL19nYV9pbXAuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzE3NjAwLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9fZ2FfaW1wLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQotOyoKLTsqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLTsqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci07KiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAotOyogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKLTsqICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci07KiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotOyogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKLTsqICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci07KiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAotOyogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKLTsqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci07KiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAotOyogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKLTsqICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci07KiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotOyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLTsqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqIExhbmd1YWdlOiAgICBUQVNNIDQuMCBvciBOQVNNCi07KiBFbnZpcm9ubWVudDogSUJNIFBDIDMyIGJpdCBQcm90ZWN0ZWQgTW9kZS4KLTsqCi07KiBEZXNjcmlwdGlvbjogTW9kdWxlIHRvIGltcGxlbWVudCB0aGUgaW1wb3J0IHN0dWJzIGZvciBhbGwgdGhlIE51Y2xldXMKLTsqICAgICAgICAgICAgICBHcmFwaGljcyBBUEkgZnVuY3Rpb25zIGZvciBJbnRlbCBiaW5hcnkgY29tcGF0aWJsZSBkcml2ZXJzLgotOyoKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgSURFQUwKLQotaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKLQotQkVHSU5fSU1QT1JUU19ERUYgICBfX0dBX2V4cG9ydHMKLVNLSVBfSU1QICAgIEdBX3N0YXR1cywwICAgICAgICAgICAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKLVNLSVBfSU1QICAgIEdBX2Vycm9yTXNnLDEgICAgICAgICAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKLVNLSVBfSU1QICAgIEdBX2dldERheXNMZWZ0LDEgICAgICAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKLVNLSVBfSU1QICAgIEdBX3JlZ2lzdGVyTGljZW5zZSwyICAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKLVNLSVBfSU1QICAgIEdBX2VudW1lcmF0ZURldmljZXMsMSAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKLVNLSVBfSU1QICAgIEdBX2xvYWREcml2ZXIsMiAgICAgICAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKLURFQ0xBUkVfSU1QIEdBX3NldEFjdGl2ZURldmljZSwxCi1TS0lQX0lNUCAgICBHQV9yZXNlcnZlZDEsMCAgICAgICAgICAgICAgICAgIDsgSW1wbGVtZW50ZWQgaW4gQyBjb2RlCi1ERUNMQVJFX0lNUCBHQV91bmxvYWREcml2ZXIsMQotREVDTEFSRV9JTVAgUkVGMkRfbG9hZERyaXZlciw2Ci1ERUNMQVJFX0lNUCBSRUYyRF91bmxvYWREcml2ZXIsMgotREVDTEFSRV9JTVAgR0FfbG9hZFJlZjJkLDUKLURFQ0xBUkVfSU1QIEdBX3VubG9hZFJlZjJkLDEKLURFQ0xBUkVfSU1QIEdBX3NvZnRTdGVyZW9Jbml0LDEKLURFQ0xBUkVfSU1QIEdBX3NvZnRTdGVyZW9PbiwwCi1ERUNMQVJFX0lNUCBHQV9zb2Z0U3RlcmVvU2NoZWR1bGVGbGlwLDIKLURFQ0xBUkVfSU1QIEdBX3NvZnRTdGVyZW9HZXRGbGlwU3RhdHVzLDAKLURFQ0xBUkVfSU1QIEdBX3NvZnRTdGVyZW9XYWl0VGlsbEZsaXBwZWQsMAotREVDTEFSRV9JTVAgR0Ffc29mdFN0ZXJlb09mZiwwCi1ERUNMQVJFX0lNUCBHQV9zb2Z0U3RlcmVvRXhpdCwwCi1ERUNMQVJFX0lNUCBHQV9zYXZlTW9kZVByb2ZpbGUsMgotREVDTEFSRV9JTVAgR0Ffc2F2ZU9wdGlvbnMsMgotREVDTEFSRV9JTVAgR0Ffc2F2ZUNSVENUaW1pbmdzLDEKLURFQ0xBUkVfSU1QIEdBX3Jlc3RvcmVDUlRDVGltaW5ncywxCi1ERUNMQVJFX0lNUCBERENfaW5pdCwxCi1ERUNMQVJFX0lNUCBERENfcmVhZEVESUQsNQotREVDTEFSRV9JTVAgRURJRF9wYXJzZSwzCi1ERUNMQVJFX0lNUCBNQ1NfYmVnaW4sMQotREVDTEFSRV9JTVAgTUNTX2dldENhcGFiaWxpdGllc1N0cmluZywyCi1ERUNMQVJFX0lNUCBNQ1NfaXNDb250cm9sU3VwcG9ydGVkLDEKLURFQ0xBUkVfSU1QIE1DU19lbmFibGVDb250cm9sLDIKLURFQ0xBUkVfSU1QIE1DU19nZXRDb250cm9sTWF4LDIKLURFQ0xBUkVfSU1QIE1DU19nZXRDb250cm9sVmFsdWUsMgotREVDTEFSRV9JTVAgTUNTX2dldENvbnRyb2xWYWx1ZXMsMwotREVDTEFSRV9JTVAgTUNTX3NldENvbnRyb2xWYWx1ZSwyCi1ERUNMQVJFX0lNUCBNQ1Nfc2V0Q29udHJvbFZhbHVlcywzCi1ERUNMQVJFX0lNUCBNQ1NfcmVzZXRDb250cm9sLDEKLURFQ0xBUkVfSU1QIE1DU19zYXZlQ3VycmVudFNldHRpbmdzLDAKLURFQ0xBUkVfSU1QIE1DU19nZXRUaW1pbmdSZXBvcnQsMwotREVDTEFSRV9JTVAgTUNTX2dldFNlbGZUZXN0UmVwb3J0LDMKLURFQ0xBUkVfSU1QIE1DU19lbmQsMAotU0tJUF9JTVAgICAgR0FfbG9hZEluR1VJLDEgICAgICAgICAgICAgICAgICA7IEltcGxlbWVudGVkIGluIEMgY29kZQotREVDTEFSRV9JTVAgRERDX3dyaXRlRURJRCw2Ci1ERUNMQVJFX0lNUCBHQV91c2VEb3VibGVTY2FuLDEKLURFQ0xBUkVfSU1QIEdBX2dldE1heFJlZnJlc2hSYXRlLDQKLURFQ0xBUkVfSU1QIEdBX2NvbXB1dGVDUlRDVGltaW5ncyw2Ci1ERUNMQVJFX0lNUCBHQV9hZGRNb2RlLDUKLURFQ0xBUkVfSU1QIEdBX2FkZFJlZnJlc2gsNQotREVDTEFSRV9JTVAgR0FfZGVsTW9kZSw1Ci1ERUNMQVJFX0lNUCBOX2dldExvZ05hbWUsMAotU0tJUF9JTVAyICAgTl9sb2cKLURFQ0xBUkVfSU1QIE1EQlhfZ2V0RXJyQ29kZSwwCi1ERUNMQVJFX0lNUCBNREJYX2dldEVycm9yTXNnLDAKLURFQ0xBUkVfSU1QIE1EQlhfb3BlbiwxCi1ERUNMQVJFX0lNUCBNREJYX2Nsb3NlLDAKLURFQ0xBUkVfSU1QIE1EQlhfZmlyc3QsMQotREVDTEFSRV9JTVAgTURCWF9sYXN0LDEKLURFQ0xBUkVfSU1QIE1EQlhfbmV4dCwxCi1ERUNMQVJFX0lNUCBNREJYX3ByZXYsMQotREVDTEFSRV9JTVAgTURCWF9pbnNlcnQsMQotREVDTEFSRV9JTVAgTURCWF91cGRhdGUsMQotREVDTEFSRV9JTVAgTURCWF9mbHVzaCwwCi1ERUNMQVJFX0lNUCBNREJYX2ltcG9ydElORiwyCi1TS0lQX0lNUCAgICBHQV9nZXRHbG9iYWxPcHRpb25zLDIgICAgICAgICAgIDsgSW1wbGVtZW50ZWQgaW4gQyBjb2RlCi1ERUNMQVJFX0lNUCBHQV9zZXRHbG9iYWxPcHRpb25zLDEKLURFQ0xBUkVfSU1QIEdBX3NhdmVHbG9iYWxPcHRpb25zLDEKLURFQ0xBUkVfSU1QIEdBX2dldEludGVybmFsTmFtZSwxCi1ERUNMQVJFX0lNUCBHQV9nZXROdWNsZXVzQ29uZmlnUGF0aCwwCi1ERUNMQVJFX0lNUCBHQV9nZXRGYWtlUENJSUQsMAotU0tJUF9JTVAgICAgR0FfbG9hZExpYnJhcnksMyAgICAgICAgICAgICAgICA7IEltcGxlbWVudGVkIGluIEMgY29kZQotU0tJUF9JTVAgICAgR0FfaXNPRU1WZXJzaW9uLDEgICAgICAgICAgICAgICA7IEltcGxlbWVudGVkIGluIEMgY29kZQotREVDTEFSRV9JTVAgR0FfaXNMaXRlVmVyc2lvbiwxCi1ERUNMQVJFX0lNUCBHQV9nZXREaXNwbGF5U2VyaWFsTm8sMQotREVDTEFSRV9JTVAgR0FfZ2V0RGlzcGxheVVzZXJOYW1lLDEKLVNLSVBfSU1QICAgIEdBX2dldEN1cnJlbnREcml2ZXIsMSAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKLVNLSVBfSU1QICAgIEdBX2dldEN1cnJlbnRSZWYyZCwxICAgICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKLVNLSVBfSU1QICAgIEdBX2dldExpY2Vuc2VkRGV2aWNlcywxICAgICAgICAgOyBJbXBsZW1lbnRlZCBpbiBDIGNvZGUKLURFQ0xBUkVfSU1QIEREQ19pbml0RXh0LDIKLURFQ0xBUkVfSU1QIE1DU19iZWdpbkV4dCwyCi1ERUNMQVJFX0lNUCBHQV9sb2FkUmVnaW9uTWdyLDMKLURFQ0xBUkVfSU1QIEdBX3VubG9hZFJlZ2lvbk1nciwxCi1ERUNMQVJFX0lNUCBHQV9nZXRQcm9jQWRkcmVzcywyCi1ERUNMQVJFX0lNUCBHQV9lbmFibGVWQkVNb2RlLDUKLURFQ0xBUkVfSU1QIEdBX2Rpc2FibGVWQkVNb2RlLDUKLURFQ0xBUkVfSU1QIEdBX2xvYWRNb2RlUHJvZmlsZSwyCi1ERUNMQVJFX0lNUCBHQV9nZXRDUlRDVGltaW5ncyw0Ci1ERUNMQVJFX0lNUCBHQV9zZXRDUlRDVGltaW5ncyw0Ci1ERUNMQVJFX0lNUCBHQV9zZXREZWZhdWx0UmVmcmVzaCw2Ci1ERUNMQVJFX0lNUCBHQV9zYXZlTW9uaXRvckluZm8sMgotREVDTEFSRV9JTVAgR0FfZGV0ZWN0UG5QTW9uaXRvciwzCi1TS0lQX0lNUDMgICBHQV9xdWVyeUZ1bmN0aW9ucwotU0tJUF9JTVAzICAgUkVGMkRfcXVlcnlGdW5jdGlvbnMKLUVORF9JTVBPUlRTX0RFRgotCi0gICAgICAgIEVORAotCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vX2dhdGltZXIuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL19nYXRpbWVyLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE5NGE2Mi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vX2dhdGltZXIuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KgotOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCi07KgotOyogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotOyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLTsqICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8Ci07KiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAotOyogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKLTsqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci07KiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAotOyogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKLTsqICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8Ci07KiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAotOyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLTsqICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8Ci07KiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAotOyogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKLTsqICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci07KiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotOyogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogTGFuZ3VhZ2U6ICAgIDgwMzg2IEFzc2VtYmxlciwgTkFTTSBvciBUQVNNCi07KiBFbnZpcm9ubWVudDogSUJNIFBDIDMyIGJpdCBQcm90ZWN0ZWQgTW9kZS4KLTsqCi07KiBEZXNjcmlwdGlvbjogQXNzZW1ibHkgc3VwcG9ydCBmdW5jdGlvbnMgZm9yIHRoZSBOdWNsZXVzIGxpYnJhcnkgZm9yCi07KiAgICAgICAgICAgICAgdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1pbmcgc3VwcG9ydCBmdW5jdGlvbnMgcHJvdmlkZWQgYnkKLTsqICAgICAgICAgICAgICB0aGUgSW50ZWwgUGVudGl1bSBhbmQgY29tcGF0aWJsZSBwcm9jZXNzb3JzLgotOyoKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgSURFQUwKLQotaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKLQotaGVhZGVyICBfZ2F0aW1lcgotCi1iZWdjb2Rlc2VnICBfZ2F0aW1lcgotCi1pZmRlZiAgIFVTRV9OQVNNCi0lbWFjcm8gbUNQVV9JRCAwCi1kYiAgMDBGaCwwQTJoCi0lZW5kbWFjcm8KLWVsc2UKLU1BQ1JPICAgbUNQVV9JRAotZGIgIDAwRmgsMEEyaAotRU5ETQotZW5kaWYKLQotaWZkZWYgICBVU0VfTkFTTQotJW1hY3JvIG1SRFRTQyAwCi1kYiAgMDBGaCwwMzFoCi0lZW5kbWFjcm8KLWVsc2UKLU1BQ1JPICAgbVJEVFNDCi1kYiAgMDBGaCwwMzFoCi1FTkRNCi1lbmRpZgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBib29sIF9HQV9oYXZlQ1BVSUQodm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERldGVybWluZXMgaWYgd2UgaGF2ZSBzdXBwb3J0IGZvciB0aGUgQ1BVSUQgaW5zdHJ1Y3Rpb24uCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX0dBX2hhdmVDUFVJRAotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgICAgIDsgR2V0IG9yaWdpbmFsIEVGTEFHUwotICAgICAgICBwb3AgICAgIGVheAotICAgICAgICBtb3YgICAgIGVjeCwgZWF4Ci0gICAgICAgIHhvciAgICAgZWF4LCAyMDAwMDBoICAgICAgICA7IEZsaXAgSUQgYml0IGluIEVGTEFHUwotICAgICAgICBwdXNoICAgIGVheCAgICAgICAgICAgICAgICAgOyBTYXZlIG5ldyBFRkxBR1MgdmFsdWUgb24gc3RhY2sKLSAgICAgICAgcG9wZmQgICAgICAgICAgICAgICAgICAgICAgIDsgUmVwbGFjZSBjdXJyZW50IEVGTEFHUyB2YWx1ZQotICAgICAgICBwdXNoZmQgICAgICAgICAgICAgICAgICAgICAgOyBHZXQgbmV3IEVGTEFHUwotICAgICAgICBwb3AgICAgIGVheCAgICAgICAgICAgICAgICAgOyBTdG9yZSBuZXcgRUZMQUdTIGluIEVBWAotICAgICAgICB4b3IgICAgIGVheCwgZWN4ICAgICAgICAgICAgOyBDYW4gbm90IHRvZ2dsZSBJRCBiaXQsCi0gICAgICAgIGpueiAgICAgQEAxICAgICAgICAgICAgICAgICA7IFByb2Nlc3Nvcj04MDQ4NgotICAgICAgICBtb3YgICAgIGVheCwwICAgICAgICAgICAgICAgOyBXZSBkb250IGhhdmUgQ1BVSUQgc3VwcG9ydAotICAgICAgICBqbXAgICAgIEBARG9uZQotQEAxOiAgICBtb3YgICAgIGVheCwxICAgICAgICAgICAgICAgOyBXZSBoYXZlIENQVUlEIHN1cHBvcnQKLUBARG9uZTogbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWludCBfR0FfZ2V0Q1BVSURGZWF0dXJlcyh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRGV0ZXJtaW5lcyB0aGUgQ1BVIHR5cGUgdXNpbmcgdGhlIENQVUlEIGluc3RydWN0aW9uLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9HQV9nZXRDUFVJREZlYXR1cmVzCi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIHhvciAgICAgZWF4LCBlYXggICAgICAgICAgICA7IFNldCB1cCBmb3IgQ1BVSUQgaW5zdHJ1Y3Rpb24KLSAgICAgICAgbUNQVV9JRCAgICAgICAgICAgICAgICAgICAgIDsgR2V0IGFuZCBzYXZlIHZlbmRvciBJRAotICAgICAgICBjbXAgICAgIGVheCwgMSAgICAgICAgICAgICAgOyBNYWtlIHN1cmUgMSBpcyB2YWxpZCBpbnB1dCBmb3IgQ1BVSUQKLSAgICAgICAgamwgICAgICBAQEZhaWwgICAgICAgICAgICAgIDsgV2UgZG9udCBoYXZlIHRoZSBDUFVJRCBpbnN0cnVjdGlvbgotICAgICAgICB4b3IgICAgIGVheCwgZWF4Ci0gICAgICAgIGluYyAgICAgZWF4Ci0gICAgICAgIG1DUFVfSUQgICAgICAgICAgICAgICAgICAgICA7IEdldCBmYW1pbHkvbW9kZWwvc3RlcHBpbmcvZmVhdHVyZXMKLSAgICAgICAgbW92ICAgICBlYXgsIGVkeAotQEBEb25lOiBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1AQEZhaWw6IHhvciAgICAgZWF4LGVheAotICAgICAgICBqbXAgICAgIEBARG9uZQotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkICBfR0FfcmVhZFRpbWVTdGFtcChHQV9sYXJnZUludGVnZXIgKnRpbWUpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZWFkcyB0aGUgdGltZSBzdGFtcCBjb3VudGVyIGFuZCByZXR1cm5zIHRoZSA2NC1iaXQgcmVzdWx0LgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9HQV9yZWFkVGltZVN0YW1wCi0KLSAgICAgICAgbVJEVFNDCi0gICAgICAgIG1vdiAgICAgZWN4LFtlc3ArNF0gICAgIDsgQWNjZXNzIGRpcmVjdGx5IHdpdGhvdXQgc3RhY2sgZnJhbWUKLSAgICAgICAgbW92ICAgICBbZWN4XSxlYXgKLSAgICAgICAgbW92ICAgICBbZWN4KzRdLGVkeAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTl91aW50MzIgR0FfVGltZXJEaWZmZXJlbmNlKEdBX2xhcmdlSW50ZWdlciAqYSxHQV9sYXJnZUludGVnZXIgKmIpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDb21wdXRlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byA2NC1iaXQgbnVtYmVycyAoYS1iKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIEdBX1RpbWVyRGlmZmVyZW5jZQotCi0gICAgICAgIEFSRyAgICAgYTpEUFRSLCBiOkRQVFIsIHQ6RFBUUgotCi0gICAgICAgIGVudGVyX2MKLQotICAgICAgICBtb3YgICAgIGVjeCxbYV0KLSAgICAgICAgbW92ICAgICBlYXgsW2VjeF0gICAgICAgOyBFQVggOj0gYi5sb3cKLSAgICAgICAgbW92ICAgICBlY3gsW2JdCi0gICAgICAgIHN1YiAgICAgZWF4LFtlY3hdCi0gICAgICAgIG1vdiAgICAgZWR4LGVheCAgICAgICAgIDsgRURYIDo9IGxvdyBkaWZmZXJlbmNlCi0gICAgICAgIG1vdiAgICAgZWN4LFthXQotICAgICAgICBtb3YgICAgIGVheCxbZWN4KzRdICAgICA7IEVDWCA6PSBiLmhpZ2gKLSAgICAgICAgbW92ICAgICBlY3gsW2JdCi0gICAgICAgIHNiYiAgICAgZWF4LFtlY3grNF0gICAgIDsgRUFYIDo9IGhpZ2ggZGlmZmVyZW5jZQotICAgICAgICBtb3YgICAgIGVheCxlZHggICAgICAgICA7IFJldHVybiBsb3cgcGFydAotCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTsgTWFjcm8gdG8gZGVsYXkgYnJpZWZseSB0byBlbnN1cmUgdGhhdCBlbm91Z2ggdGltZSBoYXMgZWxhcHNlZCBiZXR3ZWVuCi07IHN1Y2Nlc3NpdmUgSS9PIGFjY2Vzc2VzIHNvIHRoYXQgdGhlIGRldmljZSBiZWluZyBhY2Nlc3NlZCBjYW4gcmVzcG9uZAotOyB0byBib3RoIGFjY2Vzc2VzIGV2ZW4gb24gYSB2ZXJ5IGZhc3QgUEMuCi0KLWlmZGVmICAgVVNFX05BU00KLSVtYWNybyAgREVMQVlfVElNRVIgMAotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotJWVuZG1hY3JvCi1lbHNlCi1tYWNybyAgIERFTEFZX1RJTUVSCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi1lbmRtCi1lbmRpZgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9PU19kZWxheTgyNTMoTl91aW50MzIgbWljcm9TZWNvbmRzKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERlbGF5cyBmb3IgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWljcm9zZWNvbmRzLCBieSBkaXJlY3RseSBwcm9ncmFtbWluZwotOyB0aGUgODI1MyB0aW1lciBjaGlwcy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfT1NfZGVsYXk4MjUzCi0KLSAgICAgICAgQVJHICAgICBtaWNyb1NlYzpVSU5UCi0KLSAgICAgICAgZW50ZXJfYwotCi07IFN0YXJ0IHRpbWVyIDIgY291bnRpbmcKLQotICAgICAgICBtb3YgICAgIF9heCxbbWljcm9TZWNdICAgICAgOyBFQVggOj0gY291bnQgaW4gbWljcm9zZWNvbmRzCi0gICAgICAgIG1vdiAgICAgZWN4LDExOTYKLSAgICAgICAgbXVsICAgICBlY3gKLSAgICAgICAgbW92ICAgICBlY3gsMTAwMAotICAgICAgICBkaXYgICAgIGVjeAotICAgICAgICBtb3YgICAgIGVjeCxlYXggICAgICAgICAgICAgOyBFQ1ggOj0gY291bnQgaW4gdGltZXIgdGlja3MKLSAgICAgICAgaW4gICAgICBhbCw2MWgKLSAgICAgICAgb3IgICAgICBhbCwxCi0gICAgICAgIG91dCAgICAgNjFoLGFsCi0KLTsgU2V0IHRoZSB0aW1lciAyIGNvdW50IHRvIDAgYWdhaW4gdG8gc3RhcnQgdGhlIHRpbWluZyBpbnRlcnZhbC4KLQotICAgICAgICBtb3YgICAgIGFsLDEwMTEwMTAwYiAgICAgICAgOyBzZXQgdXAgdG8gbG9hZCBpbml0aWFsICh0aW1lciAyKQotICAgICAgICBvdXQgICAgIDQzaCxhbCAgICAgICAgICAgICAgOyB0aW1lciBjb3VudAotICAgICAgICBERUxBWV9USU1FUgotICAgICAgICBzdWIgICAgIGFsLGFsCi0gICAgICAgIG91dCAgICAgNDJoLGFsICAgICAgICAgICAgICA7IGxvYWQgY291bnQgbHNiCi0gICAgICAgIERFTEFZX1RJTUVSCi0gICAgICAgIG91dCAgICAgNDJoLGFsICAgICAgICAgICAgICA7IGxvYWQgY291bnQgbXNiCi0gICAgICAgIHhvciAgICAgZGksZGkgICAgICAgICAgICAgICA7IEFsbG93IG1heCA2NEsgbG9vcCBpdGVyYXRpb25zCi0KLUBATG9vcFN0YXJ0OgotICAgICAgICBkZWMgICAgIGRpICAgICAgICAgICAgICAgICAgOyBUaGlzIGlzIGEgZ3VhcmQgYWdhaW5zdCB0aGUgcG9zc2liaWxpdHkgdGhhdAotICAgICAgICBqeiAgICAgIEBATG9vcEVuZCAgICAgICAgICAgOyBzb21lb25lIGVnLiBzdG9wcGVkIHRoZSB0aW1lciBiZWhpbmQgb3VyIGJhY2suCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IEFmdGVyIDY0SyBpdGVyYXRpb25zIHdlIGJhaWwgb3V0IG5vIG1hdHRlciB3aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IChhbmQgaG9wZSBpdCB3YXNuJ3QgdG9vIHNvb24pCi0gICAgICAgIG1vdiAgICAgYWwsMDAwMDAwMDBiICAgICAgICA7IGxhdGNoIHRpbWVyIDAKLSAgICAgICAgb3V0ICAgICA0M2gsYWwKLSAgICAgICAgREVMQVlfVElNRVIKLSAgICAgICAgaW4gICAgICBhbCw0MmggICAgICAgICAgICAgIDsgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZQotICAgICAgICBERUxBWV9USU1FUgotICAgICAgICBtb3YgICAgIGFoLGFsCi0gICAgICAgIGluICAgICAgYWwsNDJoICAgICAgICAgICAgICA7IG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZQotICAgICAgICB4Y2hnICAgIGFoLGFsCi0gICAgICAgIG5lZyAgICAgYXggICAgICAgICAgICAgICAgICA7IENvbnZlcnQgZnJvbSBjb3VudGRvd24gcmVtYWluaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ICB0byBlbGFwc2VkIGNvdW50Ci0gICAgICAgIGNtcCAgICAgYXgsY3ggICAgICAgICAgICAgICA7IEhhcyBkZWxheSBleHBpcmVkPwotICAgICAgICBqYiAgICAgIEBATG9vcFN0YXJ0ICAgICAgICAgOyBObywgc28gbG9vcCB0aWxsIGRvbmUKLQotOyBTdG9wIHRpbWVyIDIgZnJvbSBjb3VudGluZwotQEBMb29wRW5kOgotICAgICAgICBpbiAgICAgIGFsLDYxSAotICAgICAgICBhbmQgICAgIGFsLDBGRWgKLSAgICAgICAgb3V0ICAgICA2MUgsYWwKLQotOyBTb21lIHByb2dyYW1zIGhhdmUgYSBwcm9ibGVtIGlmIHdlIGNoYW5nZSB0aGUgY29udHJvbCBwb3J0OyBiZXR0ZXIgY2hhbmdlIGl0Ci07IHRvIHNvbWV0aGluZyB0aGV5IGV4cGVjdCAobW9kZSAzIC0gc3F1YXJlIHdhdmUgZ2VuZXJhdG9yKS4uLgotICAgICAgICBtb3YgICAgIGFsLDBCNmgKLSAgICAgICAgb3V0ICAgICA0M2gsYWwKLQotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi1lbmRjb2Rlc2VnICBfZ2F0aW1lcgotCi0gICAgICAgIEVORAotCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vX3BtX2ltcC5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vX3BtX2ltcC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YjExNzkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL19wbV9pbXAuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KgotOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotOyoKLTsqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLTsqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci07KiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAotOyogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKLTsqICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci07KiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotOyogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKLTsqICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci07KiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAotOyogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKLTsqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci07KiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAotOyogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKLTsqICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci07KiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotOyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLTsqICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqIExhbmd1YWdlOiAgICBUQVNNIDQuMCBvciBOQVNNCi07KiBFbnZpcm9ubWVudDogSUJNIFBDIDMyIGJpdCBQcm90ZWN0ZWQgTW9kZS4KLTsqCi07KiBEZXNjcmlwdGlvbjogTW9kdWxlIHRvIGltcGxlbWVudCB0aGUgaW1wb3J0IHN0dWJzIGZvciBhbGwgdGhlIFBNCi07KiAgICAgICAgICAgICAgQVBJIGZ1bmN0aW9ucyBmb3IgSW50ZWwgYmluYXJ5IHBvcnRhYmxlIGRyaXZlcnMuCi07KgotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICBJREVBTAotCi1pbmNsdWRlICJzY2l0ZWNoLm1hYyIgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcwotCi1CRUdJTl9JTVBPUlRTX0RFRiAgIF9QTV9pbXBvcnRzCi1ERUNMQVJFX0lNUCBQTV9nZXRNb2RlVHlwZSwwCi1ERUNMQVJFX0lNUCBQTV9nZXRCSU9TUG9pbnRlciwwCi1ERUNMQVJFX0lNUCBQTV9nZXRBMDAwMFBvaW50ZXIsMAotREVDTEFSRV9JTVAgUE1fbWFwUGh5c2ljYWxBZGRyLDAKLURFQ0xBUkVfSU1QIFBNX21hbGxvY1NoYXJlZCwwCi1TS0lQX0lNUCAgICBfUE1fcmVzZXJ2ZWQxLDAKLURFQ0xBUkVfSU1QIFBNX2ZyZWVTaGFyZWQsMAotREVDTEFSRV9JTVAgUE1fbWFwVG9Qcm9jZXNzLDAKLURFQ0xBUkVfSU1QIFBNX21hcFJlYWxQb2ludGVyLDAKLURFQ0xBUkVfSU1QIFBNX2FsbG9jUmVhbFNlZywwCi1ERUNMQVJFX0lNUCBQTV9mcmVlUmVhbFNlZywwCi1ERUNMQVJFX0lNUCBQTV9hbGxvY0xvY2tlZE1lbSwwCi1ERUNMQVJFX0lNUCBQTV9mcmVlTG9ja2VkTWVtLDAKLURFQ0xBUkVfSU1QIFBNX2NhbGxSZWFsTW9kZSwwCi1ERUNMQVJFX0lNUCBQTV9pbnQ4NiwwCi1ERUNMQVJFX0lNUCBQTV9pbnQ4NngsMAotREVDTEFSRV9JTVAgRFBNSV9pbnQ4NiwwCi1ERUNMQVJFX0lNUCBQTV9hdmFpbGFibGVNZW1vcnksMAotREVDTEFSRV9JTVAgUE1fZ2V0VkVTQUJ1ZiwwCi1ERUNMQVJFX0lNUCBQTV9nZXRPU1R5cGUsMAotREVDTEFSRV9JTVAgUE1fZmF0YWxFcnJvciwwCi1ERUNMQVJFX0lNUCBQTV9zZXRCYW5rQSwwCi1ERUNMQVJFX0lNUCBQTV9zZXRCYW5rQUIsMAotREVDTEFSRV9JTVAgUE1fc2V0Q1JUU3RhcnQsMAotREVDTEFSRV9JTVAgUE1fZ2V0Q3VycmVudFBhdCwwCi1ERUNMQVJFX0lNUCBQTV9nZXRWQkVBRlBhdGgsMAotREVDTEFSRV9JTVAgUE1fZ2V0TnVjbGV1c1BhdGgsMAotREVDTEFSRV9JTVAgUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgsMAotREVDTEFSRV9JTVAgUE1fZ2V0VW5pcXVlSUQsMAotREVDTEFSRV9JTVAgUE1fZ2V0TWFjaGluZU5hbWUsMAotREVDTEFSRV9JTVAgVkZfYXZhaWxhYmxlLDAKLURFQ0xBUkVfSU1QIFZGX2luaXQsMAotREVDTEFSRV9JTVAgVkZfZXhpdCwwCi1ERUNMQVJFX0lNUCBQTV9vcGVuQ29uc29sZSwwCi1ERUNMQVJFX0lNUCBQTV9nZXRDb25zb2xlU3RhdGVTaXplLDAKLURFQ0xBUkVfSU1QIFBNX3NhdmVDb25zb2xlU3RhdGUsMAotREVDTEFSRV9JTVAgUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZSwwCi1ERUNMQVJFX0lNUCBQTV9jbG9zZUNvbnNvbGUsMAotREVDTEFSRV9JTVAgUE1fc2V0T1NDdXJzb3JMb2NhdGlvbiwwCi1ERUNMQVJFX0lNUCBQTV9zZXRPU1NjcmVlbldpZHRoLDAKLURFQ0xBUkVfSU1QIFBNX2VuYWJsZVdyaXRlQ29tYmluZSwwCi1ERUNMQVJFX0lNUCBQTV9iYWNrc2xhc2gsMAotREVDTEFSRV9JTVAgUE1fbG9ja0RhdGFQYWdlcywwCi1ERUNMQVJFX0lNUCBQTV91bmxvY2tEYXRhUGFnZXMsMAotREVDTEFSRV9JTVAgUE1fbG9ja0NvZGVQYWdlcywwCi1ERUNMQVJFX0lNUCBQTV91bmxvY2tDb2RlUGFnZXMsMAotREVDTEFSRV9JTVAgUE1fc2V0UmVhbFRpbWVDbG9ja0hhbmRsZXIsMAotREVDTEFSRV9JTVAgUE1fc2V0UmVhbFRpbWVDbG9ja0ZyZXF1ZW5jeSwwCi1ERUNMQVJFX0lNUCBQTV9yZXN0b3JlUmVhbFRpbWVDbG9ja0hhbmRsZXIsMAotREVDTEFSRV9JTVAgUE1fZG9CSU9TUE9TVCwwCi1ERUNMQVJFX0lNUCBQTV9nZXRCb290RHJpdmUsMAotREVDTEFSRV9JTVAgUE1fZnJlZVBoeXNpY2FsQWRkciwwCi1ERUNMQVJFX0lNUCBQTV9pbnBiLDAKLURFQ0xBUkVfSU1QIFBNX2lucHcsMAotREVDTEFSRV9JTVAgUE1faW5wZCwwCi1ERUNMQVJFX0lNUCBQTV9vdXRwYiwwCi1ERUNMQVJFX0lNUCBQTV9vdXRwdywwCi1ERUNMQVJFX0lNUCBQTV9vdXRwZCwwCi1TS0lQX0lNUCAgICBfUE1fcmVzZXJ2ZWQyLDAKLURFQ0xBUkVfSU1QIFBNX3NldFN1c3BlbmRBcHBDYWxsYmFjaywwCi1ERUNMQVJFX0lNUCBQTV9oYXZlQklPU0FjY2VzcywwCi1ERUNMQVJFX0lNUCBQTV9rYmhpdCwwCi1ERUNMQVJFX0lNUCBQTV9nZXRjaCwwCi1ERUNMQVJFX0lNUCBQTV9maW5kQlBELDAKLURFQ0xBUkVfSU1QIFBNX2dldFBoeXNpY2FsQWRkciwwCi1ERUNMQVJFX0lNUCBQTV9zbGVlcCwwCi1ERUNMQVJFX0lNUCBQTV9nZXRDT01Qb3J0LDAKLURFQ0xBUkVfSU1QIFBNX2dldExQVFBvcnQsMAotREVDTEFSRV9JTVAgUE1fbG9hZExpYnJhcnksMAotREVDTEFSRV9JTVAgUE1fZ2V0UHJvY0FkZHJlc3MsMAotREVDTEFSRV9JTVAgUE1fZnJlZUxpYnJhcnksMAotREVDTEFSRV9JTVAgUENJX2VudW1lcmF0ZSwwCi1ERUNMQVJFX0lNUCBQQ0lfYWNjZXNzUmVnLDAKLURFQ0xBUkVfSU1QIFBDSV9zZXRIYXJkd2FyZUlSUSwwCi1ERUNMQVJFX0lNUCBQQ0lfZ2VuZXJhdGVTcGVjaWFsQ3lsZSwwCi1TS0lQX0lNUCAgICBfUE1fcmVzZXJ2ZWQzLDAKLURFQ0xBUkVfSU1QIFBDSUJJT1NfZ2V0RW50cnksMAotREVDTEFSRV9JTVAgQ1BVX2dldFByb2Nlc3NvclR5cGUsMAotREVDTEFSRV9JTVAgQ1BVX2hhdmVNTVgsMAotREVDTEFSRV9JTVAgQ1BVX2hhdmUzRE5vdywwCi1ERUNMQVJFX0lNUCBDUFVfaGF2ZVNTRSwwCi1ERUNMQVJFX0lNUCBDUFVfaGF2ZVJEVFNDLDAKLURFQ0xBUkVfSU1QIENQVV9nZXRQcm9jZXNzb3JTcGVlZCwwCi1ERUNMQVJFX0lNUCBaVGltZXJJbml0LDAKLURFQ0xBUkVfSU1QIExaVGltZXJPbiwwCi1ERUNMQVJFX0lNUCBMWlRpbWVyTGFwLDAKLURFQ0xBUkVfSU1QIExaVGltZXJPZmYsMAotREVDTEFSRV9JTVAgTFpUaW1lckNvdW50LDAKLURFQ0xBUkVfSU1QIExaVGltZXJPbkV4dCwwCi1ERUNMQVJFX0lNUCBMWlRpbWVyTGFwRXh0LDAKLURFQ0xBUkVfSU1QIExaVGltZXJPZmZFeHQsMAotREVDTEFSRV9JTVAgTFpUaW1lckNvdW50RXh0LDAKLURFQ0xBUkVfSU1QIFVMWlRpbWVyT24sMAotREVDTEFSRV9JTVAgVUxaVGltZXJMYXAsMAotREVDTEFSRV9JTVAgVUxaVGltZXJPZmYsMAotREVDTEFSRV9JTVAgVUxaVGltZXJDb3VudCwwCi1ERUNMQVJFX0lNUCBVTFpSZWFkVGltZSwwCi1ERUNMQVJFX0lNUCBVTFpFbGFwc2VkVGltZSwwCi1ERUNMQVJFX0lNUCBVTFpUaW1lclJlc29sdXRpb24sMAotREVDTEFSRV9JTVAgUE1fZmluZEZpcnN0RmlsZSwwCi1ERUNMQVJFX0lNUCBQTV9maW5kTmV4dEZpbGUsMAotREVDTEFSRV9JTVAgUE1fZmluZENsb3NlLDAKLURFQ0xBUkVfSU1QIFBNX21ha2VwYXRoLDAKLURFQ0xBUkVfSU1QIFBNX3NwbGl0cGF0aCwwCi1ERUNMQVJFX0lNUCBQTV9kcml2ZVZhbGlkLDAKLURFQ0xBUkVfSU1QIFBNX2dldGRjd2QsMAotREVDTEFSRV9JTVAgUE1fc2V0RmlsZUF0dHIsMAotREVDTEFSRV9JTVAgUE1fbWtkaXIsMAotREVDTEFSRV9JTVAgUE1fcm1kaXIsMAotREVDTEFSRV9JTVAgUE1fZ2V0RmlsZUF0dHIsMAotREVDTEFSRV9JTVAgUE1fZ2V0RmlsZVRpbWUsMAotREVDTEFSRV9JTVAgUE1fc2V0RmlsZVRpbWUsMAotREVDTEFSRV9JTVAgQ1BVX2dldFByb2Nlc3Nvck5hbWUsMAotREVDTEFSRV9JTVAgUE1fZ2V0VkdBU3RhdGVTaXplLDAKLURFQ0xBUkVfSU1QIFBNX3NhdmVWR0FTdGF0ZSwwCi1ERUNMQVJFX0lNUCBQTV9yZXN0b3JlVkdBU3RhdGUsMAotREVDTEFSRV9JTVAgUE1fdmdhQmxhbmtEaXNwbGF5LDAKLURFQ0xBUkVfSU1QIFBNX3ZnYVVuYmxhbmtEaXNwbGF5LDAKLURFQ0xBUkVfSU1QIFBNX2Jsb2NrVW50aWxUaW1lb3V0LDAKLURFQ0xBUkVfSU1QIF9QTV9hZGQ2NCwwCi1ERUNMQVJFX0lNUCBfUE1fc3ViNjQsMAotREVDTEFSRV9JTVAgX1BNX211bDY0LDAKLURFQ0xBUkVfSU1QIF9QTV9kaXY2NCwwCi1ERUNMQVJFX0lNUCBfUE1fc2hyNjQsMAotREVDTEFSRV9JTVAgX1BNX3NhcjY0LDAKLURFQ0xBUkVfSU1QIF9QTV9zaGw2NCwwCi1ERUNMQVJFX0lNUCBfUE1fbmVnNjQsMAotREVDTEFSRV9JTVAgUENJX2ZpbmRCQVJTaXplLDAKLURFQ0xBUkVfSU1QIFBDSV9yZWFkUmVnQmxvY2ssMAotREVDTEFSRV9JTVAgUENJX3dyaXRlUmVnQmxvY2ssMAotREVDTEFSRV9JTVAgUE1fZmx1c2hUTEIsMAotREVDTEFSRV9JTVAgUE1fdXNlTG9jYWxNYWxsb2MsMAotREVDTEFSRV9JTVAgUE1fbWFsbG9jLDAKLURFQ0xBUkVfSU1QIFBNX2NhbGxvYywwCi1ERUNMQVJFX0lNUCBQTV9yZWFsbG9jLDAKLURFQ0xBUkVfSU1QIFBNX2ZyZWUsMAotREVDTEFSRV9JTVAgUE1fZ2V0UGh5c2ljYWxBZGRyUmFuZ2UsMAotREVDTEFSRV9JTVAgUE1fYWxsb2NQYWdlLDAKLURFQ0xBUkVfSU1QIFBNX2ZyZWVQYWdlLDAKLURFQ0xBUkVfSU1QIFBNX2FncEluaXQsMAotREVDTEFSRV9JTVAgUE1fYWdwRXhpdCwwCi1ERUNMQVJFX0lNUCBQTV9hZ3BSZXNlcnZlUGh5c2ljYWwsMAotREVDTEFSRV9JTVAgUE1fYWdwUmVsZWFzZVBoeXNpY2FsLDAKLURFQ0xBUkVfSU1QIFBNX2FncENvbW1pdFBoeXNpY2FsLDAKLURFQ0xBUkVfSU1QIFBNX2FncEZyZWVQaHlzaWNhbCwwCi1ERUNMQVJFX0lNUCBQQ0lfZ2V0TnVtRGV2aWNlcywwCi1ERUNMQVJFX0lNUCBQTV9zZXRMb2NhbEJQRFBhdGgsMAotREVDTEFSRV9JTVAgUE1fbG9hZERpcmVjdERyYXcsMAotREVDTEFSRV9JTVAgUE1fdW5sb2FkRGlyZWN0RHJhdywwCi1ERUNMQVJFX0lNUCBQTV9nZXREaXJlY3REcmF3V2luZG93LDAKLURFQ0xBUkVfSU1QIFBNX2RvU3VzcGVuZEFwcCwwCi1FTkRfSU1QT1JUU19ERUYKLQotICAgICAgICBFTkQKLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhYmVvcy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhYmVvcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDU2OThhLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYWJlb3MuYworKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8Ci0qICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Ci0qICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Ci0qICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci0qICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8Ci0qICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8Ci0qICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Ci0qICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci0qICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgTGludXgKLSoKLSogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZSBzZXJ2aWNlcyBmb3IKLSogICAgICAgICAgICAgICB0aGUgTGludXggb3BlcmF0aW5nIHN5c3RlbS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJudWNsZXVzL2dyYXBoaWNzLmgiCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLQotc3RhdGljIGlib29sICAgICAgICAgICAgaGF2ZVJEVFNDOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1HQV9zaGFyZWRJbmZvICogTkFQSSBHQV9nZXRTaGFyZWRJbmZvKAotICAgIGludCBkZXZpY2UpCi17Ci0gICAgKHZvaWQpZGV2aWNlOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX2dldFNoYXJlZEV4cG9ydHMoCi0gICAgR0FfZXhwb3J0cyAqZ2FFeHApCi17Ci0gICAgKHZvaWQpZ2FFeHA7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWluZyBmdW5jdGlvbnMgZm9yIHRoZQotTnVjbGV1cyBsb2FkZXIgbGlicmFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX1RpbWVySW5pdCh2b2lkKQotewotICAgIGlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKQotCWhhdmVSRFRTQyA9IHRydWU7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTkFQSSBHQV9UaW1lclJlYWQoCi0gICAgR0FfbGFyZ2VJbnRlZ2VyICp2YWx1ZSkKLXsKLSAgICBpZiAoaGF2ZVJEVFNDKQotCV9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKLSAgICBlbHNlIHsKLQlzdHJ1Y3QgdGltZXZhbCB0OwotCWdldHRpbWVvZmRheSgmdCwgTlVMTCk7Ci0JdmFsdWUtPmxvdyA9IHQudHZfc2VjKjEwMDAwMDAgKyB0LnR2X3VzZWM7Ci0JdmFsdWUtPmhpZ2ggPSAwOwotCX0KLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYWRvcy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhZG9zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MmQyZjMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhZG9zLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCi0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAotKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAotKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAotKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAotKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAotKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAotKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAotKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAotKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIE1TRE9TCi0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUgc2VydmljZXMgZm9yCi0qICAgICAgICAgICAgICAgdGhlIE1TRE9TIG9wZXJhdGluZyBzeXN0ZW0uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1faGVscC5oIgotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGluaXRpYWxpc2VzIHRoZSBoaWdoIHByZWNpc2lvbiB0aW1pbmcgZnVuY3Rpb25zIGZvciB0aGUgRE9TCi1OdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCi17Ci0gICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApCi0JcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgR0FfVGltZXJSZWFkKAotICAgIEdBX2xhcmdlSW50ZWdlciAqdmFsdWUpCi17Ci0gICAgX0dBX3JlYWRUaW1lU3RhbXAodmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhbGliLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFsaWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAwM2IyMi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFsaWIuYworKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBBdWRpbyBBcmNoaXRlY3R1cmUKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8Ci0qICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Ci0qICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Ci0qICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci0qICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8Ci0qICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8Ci0qICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Ci0qICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci0qICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55IDMyLWJpdCBwcm90ZWN0ZWQgbW9kZSBlbnZpcm9ubWVudAotKgotKiBEZXNjcmlwdGlvbjogIEMgbW9kdWxlIGZvciB0aGUgR3JhcGhpY3MgQWNjZWxlcmF0b3IgRHJpdmVyIEFQSS4gVXNlcwotKiAgICAgICAgICAgICAgIHRoZSBTY2lUZWNoIFBNIGxpYnJhcnkgZm9yIGludGVyZmFjaW5nIHdpdGggRE9TCi0qICAgICAgICAgICAgICAgZXh0ZW5kZXIgc3BlY2lmaWMgZnVuY3Rpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm51Y2xldXMvYXVkaW8uaCIKLSNpZmRlZiBfX1dJTjMyX1ZYRF9fCi0jaW5jbHVkZSAic2RkL3NkZGhlbHAuaCIKLSNlbHNlCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgIFRFU1RfSEFSTkVTUwotZXh0ZXJuIFBNX2ltcG9ydHMgICBfVkFSQVBJIF9QTV9pbXBvcnRzOwotI2Vsc2UKLUFBX2V4cG9ydHMgIF9WQVJBUEkgX0FBX2V4cG9ydHM7Ci1zdGF0aWMgaW50ICAgICAgICAgIGxvYWRlZCA9IGZhbHNlOwotc3RhdGljIFBFX01PRFVMRSAgICAqaE1vZEJQRCA9IE5VTEw7Ci0KLSNpZmRlZiAgX19EUklWRVJfXwotZXh0ZXJuIFBNX2ltcG9ydHMgX1BNX2ltcG9ydHM7Ci0jZWxzZQotI2luY2x1ZGUgInBtaW1wLmgiCi0jZW5kaWYKLQotc3RhdGljIE5faW1wb3J0cyBfTl9pbXBvcnRzID0gewotICAgIHNpemVvZihOX2ltcG9ydHMpLAotICAgIF9PU19kZWxheSwKLSAgICB9OwotCi0jaWZkZWYgIF9fRFJJVkVSX18KLWV4dGVybiBBQV9pbXBvcnRzIF9BQV9pbXBvcnRzOwotI2Vsc2UKLXN0YXRpYyBBQV9pbXBvcnRzIF9BQV9pbXBvcnRzID0gewotICAgIHNpemVvZihBQV9pbXBvcnRzKSwKLSAgICB9OwotI2VuZGlmCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBETExfTkFNRSAgICAgICAgImF1ZGlvLmJwZCIKLQotI2lmbmRlZiBURVNUX0hBUk5FU1MKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRmF0YWwgZXJyb3IgaGFuZGxlciBmb3Igbm9uLWV4cG9ydGVkIEFBX2V4cG9ydHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX0FBX2ZhdGFsRXJyb3JIYW5kbGVyKHZvaWQpCi17Ci0gICAgUE1fZmF0YWxFcnJvcigiVW5zdXBwb3J0ZWQgTnVjbGV1cyBleHBvcnQgZnVuY3Rpb24gY2FsbGVkISBQbGVhc2UgdXBncmFkZSB5b3VyIGNvcHkgb2YgTnVjbGV1cyFcbiIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUxvYWRzIHRoZSBOdWNsZXVzIGJpbmFyeSBwb3J0YWJsZSBETEwgaW50byBtZW1vcnkgYW5kIGluaXRpbGlzZXMgaXQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGlib29sIExvYWREcml2ZXIodm9pZCkKLXsKLSAgICBBQV9pbml0TGlicmFyeV90ICAgIEFBX2luaXRMaWJyYXJ5OwotICAgIEFBX2V4cG9ydHMgICAgICAgICAgKmFhRXhwOwotICAgIGNoYXIgICAgICAgICAgICAgICAgZmlsZW5hbWVbUE1fTUFYX1BBVEhdOwotICAgIGNoYXIgICAgICAgICAgICAgICAgYnBkcGF0aFtQTV9NQVhfUEFUSF07Ci0gICAgaW50ICAgICAgICAgICAgICAgICBpLG1heDsKLSAgICB1bG9uZyAgICAgICAgICAgICAgICpwOwotCi0gICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBhbHJlYWR5IGxvYWRlZCB0aGUgZHJpdmVyICovCi0gICAgaWYgKGxvYWRlZCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICBQTV9pbml0KCk7Ci0gICAgX0FBX2V4cG9ydHMuZHdTaXplID0gc2l6ZW9mKF9BQV9leHBvcnRzKTsKLQotICAgIC8qIE9wZW4gdGhlIEJQRCBmaWxlICovCi0gICAgaWYgKCFQTV9maW5kQlBEKERMTF9OQU1FLGJwZHBhdGgpKQotCXJldHVybiBmYWxzZTsKLSAgICBzdHJjcHkoZmlsZW5hbWUsYnBkcGF0aCk7Ci0gICAgc3RyY2F0KGZpbGVuYW1lLERMTF9OQU1FKTsKLSAgICBpZiAoKGhNb2RCUEQgPSBQRV9sb2FkTGlicmFyeShmaWxlbmFtZSxmYWxzZSkpID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIGlmICgoQUFfaW5pdExpYnJhcnkgPSAoQUFfaW5pdExpYnJhcnlfdClQRV9nZXRQcm9jQWRkcmVzcyhoTW9kQlBELCJfQUFfaW5pdExpYnJhcnkiKSkgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgYnBkcGF0aFtzdHJsZW4oYnBkcGF0aCktMV0gPSAwOwotICAgIGlmIChzdHJjbXAoYnBkcGF0aCxQTV9nZXROdWNsZXVzUGF0aCgpKSA9PSAwKQotCXN0cmNweShicGRwYXRoLFBNX2dldE51Y2xldXNDb25maWdQYXRoKCkpOwotICAgIGVsc2UgewotCVBNX2JhY2tzbGFzaChicGRwYXRoKTsKLQlzdHJjYXQoYnBkcGF0aCwiY29uZmlnIik7Ci0JfQotICAgIGlmICgoYWFFeHAgPSBBQV9pbml0TGlicmFyeShicGRwYXRoLGZpbGVuYW1lLCZfUE1faW1wb3J0cywmX05faW1wb3J0cywmX0FBX2ltcG9ydHMpKSA9PSBOVUxMKQotCVBNX2ZhdGFsRXJyb3IoIkFBX2luaXRMaWJyYXJ5IGZhaWxlZCFcbiIpOwotCi0gICAgLyogSW5pdGlhbGl6ZSBhbGwgZGVmYXVsdCBpbXBvcnRzIHRvIHBvaW50IHRvIGZhdGFsIGVycm9yIGhhbmRsZXIKLSAgICAgKiBmb3IgdXB3YXJkcyBjb21wYXRpYmlsaXR5LCBhbmQgY29weSB0aGUgZXhwb3J0ZWQgZnVuY3Rpb25zLgotICAgICAqLwotICAgIG1heCA9IHNpemVvZihfQUFfZXhwb3J0cykvc2l6ZW9mKEFBX2luaXRMaWJyYXJ5X3QpOwotICAgIGZvciAoaSA9IDAscCA9ICh1bG9uZyopJl9BQV9leHBvcnRzOyBpIDwgbWF4OyBpKyspCi0JKnArKyA9ICh1bG9uZylfQUFfZmF0YWxFcnJvckhhbmRsZXI7Ci0gICAgbWVtY3B5KCZfQUFfZXhwb3J0cyxhYUV4cCxNSU4oc2l6ZW9mKF9BQV9leHBvcnRzKSxhYUV4cC0+ZHdTaXplKSk7Ci0gICAgbG9hZGVkID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhlIGZvbGxvd2luZyBhcmUgc3R1YiBlbnRyeSBwb2ludHMgdGhhdCB0aGUgYXBwbGljYXRpb24gY2FsbHMgdG8KLSAqIGluaXRpYWxpc2UgdGhlIE51Y2xldXMgbG9hZGVyIGxpYnJhcnksIGFuZCB3ZSB1c2UgdGhpcyB0byBsb2FkIG91cgotICogZHJpdmVyIERMTCBmcm9tIGRpc2sgYW5kIGluaXRpYWxpc2UgdGhlIGxpYnJhcnkgdXNpbmcgaXQuCi0gKi8KLQotLyoge3NlY3JldH0gKi8KLWludCBOQVBJIEFBX3N0YXR1cyh2b2lkKQotewotICAgIGlmICghbG9hZGVkKQotCXJldHVybiBuRHJpdmVyTm90Rm91bmQ7Ci0gICAgcmV0dXJuIF9BQV9leHBvcnRzLkFBX3N0YXR1cygpOwotfQotCi0vKiB7c2VjcmV0fSAqLwotY29uc3QgY2hhciAqIE5BUEkgQUFfZXJyb3JNc2coCi0gICAgTl9pbnQzMiBzdGF0dXMpCi17Ci0gICAgaWYgKCFsb2FkZWQpCi0JcmV0dXJuICJVbmFibGUgdG8gbG9hZCBOdWNsZXVzIGRldmljZSBkcml2ZXIhIjsKLSAgICByZXR1cm4gX0FBX2V4cG9ydHMuQUFfZXJyb3JNc2coc3RhdHVzKTsKLX0KLQotLyoge3NlY3JldH0gKi8KLWludCBOQVBJIEFBX2dldERheXNMZWZ0KHZvaWQpCi17Ci0gICAgaWYgKCFMb2FkRHJpdmVyKCkpCi0JcmV0dXJuIC0xOwotICAgIHJldHVybiBfQUFfZXhwb3J0cy5BQV9nZXREYXlzTGVmdCgpOwotfQotCi0vKiB7c2VjcmV0fSAqLwotaW50IE5BUEkgQUFfcmVnaXN0ZXJMaWNlbnNlKHVjaGFyICpsaWNlbnNlKQotewotICAgIGlmICghTG9hZERyaXZlcigpKQotCXJldHVybiAwOwotICAgIHJldHVybiBfQUFfZXhwb3J0cy5BQV9yZWdpc3RlckxpY2Vuc2UobGljZW5zZSk7Ci19Ci0KLS8qIHtzZWNyZXR9ICovCi1pbnQgTkFQSSBBQV9lbnVtZXJhdGVEZXZpY2VzKHZvaWQpCi17Ci0gICAgaWYgKCFMb2FkRHJpdmVyKCkpCi0JcmV0dXJuIDA7Ci0gICAgcmV0dXJuIF9BQV9leHBvcnRzLkFBX2VudW1lcmF0ZURldmljZXMoKTsKLX0KLQotLyoge3NlY3JldH0gKi8KLUFBX2RldkN0eCAqIE5BUEkgQUFfbG9hZERyaXZlcihOX2ludDMyIGRldmljZUluZGV4KQotewotICAgIGlmICghTG9hZERyaXZlcigpKQotCXJldHVybiBOVUxMOwotICAgIHJldHVybiBfQUFfZXhwb3J0cy5BQV9sb2FkRHJpdmVyKGRldmljZUluZGV4KTsKLX0KLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTl91aW50MzIgICAgbG93OwotICAgIE5fdWludDMyICAgIGhpZ2g7Ci0gICAgfSBBQV9sYXJnZUludGVnZXI7Ci0KLXZvaWQgICAgTkFQSSBfT1NfZGVsYXk4MjUzKE5fdWludDMyIG1pY3JvU2Vjb25kcyk7Ci1pYm9vbCAgIE5BUEkgX0dBX2hhdmVDUFVJRCh2b2lkKTsKLXVpbnQgICAgTkFQSSBfR0FfZ2V0Q1BVSURGZWF0dXJlcyh2b2lkKTsKLXZvaWQgICAgTkFQSSBfR0FfcmVhZFRpbWVTdGFtcChBQV9sYXJnZUludGVnZXIgKnRpbWUpOwotI2RlZmluZSBDUFVfSGF2ZVJEVFNDICAgMHgwMDAwMDAxMAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gZGVsYXlzIGZvciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWNyb3NlY29uZHMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgX09TX2RlbGF5KAotICAgIE5fdWludDMyIG1pY3JvU2Vjb25kcykKLXsKLSAgICBzdGF0aWMgaWJvb2wgICAgaW5pdGVkID0gZmFsc2U7Ci0gICAgTFpUaW1lck9iamVjdCAgIHRtOwotCi0gICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApIHsKLQlpZiAoIWluaXRlZCkgewotCSAgICBaVGltZXJJbml0KCk7Ci0JICAgIGluaXRlZCA9IHRydWU7Ci0JICAgIH0KLQlMWlRpbWVyT25FeHQoJnRtKTsKLQl3aGlsZSAoTFpUaW1lckxhcEV4dCgmdG0pIDwgbWljcm9TZWNvbmRzKQotCSAgICA7Ci0JTFpUaW1lck9uRXh0KCZ0bSk7Ci0JfQotICAgIGVsc2UKLQlfT1NfZGVsYXk4MjUzKG1pY3JvU2Vjb25kcyk7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFsaW51eC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhbGludXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNkNDY4ZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFsaW51eC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKLSogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKLSogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKLSogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKLSogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKLSogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKLSogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKLSogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKLSogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBMaW51eAotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlIHNlcnZpY2VzIGZvcgotKiAgICAgICAgICAgICAgIHRoZSBMaW51eCBvcGVyYXRpbmcgc3lzdGVtLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm51Y2xldXMvZ3JhcGhpY3MuaCIKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaWJvb2wgICAgICAgIGhhdmVSRFRTQzsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotR0Ffc2hhcmVkSW5mbyAqIE5BUEkgR0FfZ2V0U2hhcmVkSW5mbygKLSAgICBpbnQgZGV2aWNlKQotewotICAgICh2b2lkKWRldmljZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9nZXRTaGFyZWRFeHBvcnRzKAotICAgIEdBX2V4cG9ydHMgKmdhRXhwKQotewotICAgICh2b2lkKWdhRXhwOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGluaXRpYWxpc2VzIHRoZSBoaWdoIHByZWNpc2lvbiB0aW1pbmcgZnVuY3Rpb25zIGZvciB0aGUKLU51Y2xldXMgbG9hZGVyIGxpYnJhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9UaW1lckluaXQodm9pZCkKLXsKLSAgICBpZiAoX0dBX2hhdmVDUFVJRCgpICYmIChfR0FfZ2V0Q1BVSURGZWF0dXJlcygpICYgQ1BVX0hhdmVSRFRTQykgIT0gMCkKLQloYXZlUkRUU0MgPSB0cnVlOwotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgR0FfVGltZXJSZWFkKAotICAgIEdBX2xhcmdlSW50ZWdlciAqdmFsdWUpCi17Ci0gICAgaWYgKGhhdmVSRFRTQykKLQlfR0FfcmVhZFRpbWVTdGFtcCh2YWx1ZSk7Ci0gICAgZWxzZSB7Ci0Jc3RydWN0IHRpbWV2YWwgdDsKLQlnZXR0aW1lb2ZkYXkoJnQsIE5VTEwpOwotCXZhbHVlLT5sb3cgPSB0LnR2X3NlYyoxMDAwMDAwICsgdC50dl91c2VjOwotCXZhbHVlLT5oaWdoID0gMDsKLQl9Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFvczIuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYW9zMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWM4YzlmLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYW9zMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8Ci0qICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Ci0qICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Ci0qICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci0qICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8Ci0qICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8Ci0qICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Ci0qICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci0qICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgT1MvMiAzMi1iaXQKLSoKLSogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZSBzZXJ2aWNlcyBmb3IKLSogICAgICAgICAgICAgICB0aGUgT1MvMiBvcGVyYXRpbmcgc3lzdGVtIGVudmlyb25tZW50cy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbV9oZWxwLmgiCi0jZGVmaW5lIElOQ0xfRE9TRVJST1JTCi0jZGVmaW5lIElOQ0xfRE9TCi0jZGVmaW5lIElOQ0xfU1VCCi0jZGVmaW5lIElOQ0xfVklPCi0jZGVmaW5lIElOQ0xfS0JECi0jaW5jbHVkZSA8b3MyLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBIRklMRSAgICAgICAgaFNEREhlbHA7Ci1zdGF0aWMgdWxvbmcgICAgICAgIG91dExlbjsgICAgICAgICAvKiBNdXN0IG5vdCBjcm9zcyA2NEtiIGJvdW5kYXJ5ISAgICAqLwotc3RhdGljIHVsb25nICAgICAgICByZXN1bHQ7ICAgICAgICAgLyogTXVzdCBub3QgY3Jvc3MgNjRLYiBib3VuZGFyeSEgICAgKi8KLXN0YXRpYyBpYm9vbCAgICAgICAgaGF2ZVJEVFNDOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGNvbW1vbiBncmFwaGljcyBkcml2ZXIgbG9hZGVkIGluIHRoZQotaGVscGVyIFZ4RC4gVGhlIG1lbW9yeSBmb3IgdGhlIFZ4RCBpcyBzaGFyZWQgYmV0d2VlbiBhbGwgcHJvY2Vzc2VzIHZpYQotdGhlIFZ4RCwgc28gdGhhdCB0aGUgVnhELCAxNi1iaXQgY29kZSBhbmQgMzItYml0IGNvZGUgYWxsIHNlZSB0aGUgc2FtZQotc3RhdGUgd2hlbiBhY2Nlc3NpbmcgdGhlIGdyYXBoaWNzIGJpbmFyeSBwb3J0YWJsZSBkcml2ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotR0Ffc2hhcmVkSW5mbyAqIE5BUEkgR0FfZ2V0U2hhcmVkSW5mbygKLSAgICBpbnQgZGV2aWNlKQotewotICAgIC8qIEluaXRpYWxpc2UgdGhlIFBNIGxpYnJhcnkgYW5kIGNvbm5lY3QgdG8gb3VyIHJ1bnRpbWUgRExMJ3MgKi8KLSAgICBQTV9pbml0KCk7Ci0KLSAgICAvKiBPcGVuIG91ciBoZWxwZXIgZGV2aWNlIGRyaXZlciAqLwotICAgIGlmIChEb3NPcGVuKFBNSEVMUF9OQU1FLCZoU0RESGVscCwmcmVzdWx0LDAsMCwKLQkgICAgRklMRV9PUEVOLCBPUEVOX1NIQVJFX0RFTllOT05FIHwgT1BFTl9BQ0NFU1NfUkVBRFdSSVRFLAotCSAgICBOVUxMKSkKLQlQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gb3BlbiBTRERIRUxQJCBoZWxwZXIgZGV2aWNlIGRyaXZlciEiKTsKLSAgICBvdXRMZW4gPSBzaXplb2YocmVzdWx0KTsKLSAgICBEb3NEZXZJT0N0bChoU0RESGVscCxQTUhFTFBfSU9DVEwsUE1IRUxQX0dFVFNIQVJFRElORk8sCi0JTlVMTCwgMCwgTlVMTCwKLQkmcmVzdWx0LCBvdXRMZW4sICZvdXRMZW4pOwotICAgIERvc0Nsb3NlKGhTRERIZWxwKTsKLSAgICBpZiAocmVzdWx0KSB7Ci0JLyogV2UgaGF2ZSBmb3VuZCB0aGUgc2hhcmVkIE51Y2xldXMgcGFja2V0LiBCZWNhdXNlIG5vdCBhbGwgcHJvY2Vzc2VzCi0JICogbWFwIHRvIFNERFBNSS5ETEwsIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgd2UgY29ubmVjdCB0byB0aGlzCi0JICogRExMIHNvIHRoYXQgaXQgZ2V0cyBtYXBwZWQgaW50byBvdXIgYWRkcmVzcyBzcGFjZSAodGhhdCBpcwotCSAqIHdoZXJlIHRoZSBzaGFyZWQgTnVjbGV1cyBwYWNrZXQgaXMgbG9jYXRlZCkuIFNpbXBseSBkb2luZyBhCi0JICogRG9zTG9hZE1vZHVsZSBvbiBpdCBpcyBlbm91Z2ggZm9yIHRoaXMuCi0JICovCi0JSE1PRFVMRSBoTW9kU0REUE1JOwotCWNoYXIgICAgYnVmWzgwXTsKLQlEb3NMb2FkTW9kdWxlKChQU1opYnVmLHNpemVvZihidWYpLChQU1opIlNERFBNSS5ETEwiLCZoTW9kU0REUE1JKTsKLQl9Ci0gICAgcmV0dXJuIChHQV9zaGFyZWRJbmZvKilyZXN1bHQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfZ2V0U2hhcmVkRXhwb3J0cygKLSAgICBHQV9leHBvcnRzICpnYUV4cCkKLXsKLSAgICAodm9pZClnYUV4cDsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgaGlnaCBwcmVjaXNpb24gdGltaW5nIGZ1bmN0aW9ucyBmb3IgdGhlCi1OdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCi17Ci0gICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApCi0JaGF2ZVJEVFNDID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKLSAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQotewotICAgIGlmIChoYXZlUkRUU0MpCi0JX0dBX3JlYWRUaW1lU3RhbXAodmFsdWUpOwotICAgIGVsc2UKLQlEb3NUbXJRdWVyeVRpbWUoKFFXT1JEKil2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFxbnguYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYXFueC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzUzMWJlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYXFueC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKLSogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKLSogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKLSogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKLSogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKLSogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKLSogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKLSogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKLSogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBRTlgKLSoKLSogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZSBzZXJ2aWNlcyBmb3IKLSogICAgICAgICAgICAgICB0aGUgUU5YIG9wZXJhdGluZyBzeXN0ZW0uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAibnVjbGV1cy9ncmFwaGljcy5oIgotI2luY2x1ZGUgPHRpbWUuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGlib29sICAgICAgICBoYXZlUkRUU0M7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUdBX3NoYXJlZEluZm8gKiBOQVBJIEdBX2dldFNoYXJlZEluZm8oCi0gICAgaW50IGRldmljZSkKLXsKLSAgICAodm9pZClkZXZpY2U7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfZ2V0U2hhcmVkRXhwb3J0cygKLSAgICBHQV9leHBvcnRzICpnYUV4cCkKLXsKLSAgICAodm9pZClnYUV4cDsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgaGlnaCBwcmVjaXNpb24gdGltaW5nIGZ1bmN0aW9ucyBmb3IgdGhlCi1OdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCi17Ci0gICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApCi0JaGF2ZVJEVFNDID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKLSAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQotewotICAgIGlmIChoYXZlUkRUU0MpCi0JX0dBX3JlYWRUaW1lU3RhbXAodmFsdWUpOwotICAgIGVsc2UgewotCXN0cnVjdCB0aW1lc3BlYyB0czsKLQotCWNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZ0cyk7Ci0JdmFsdWUtPmxvdyA9ICh0cy50dl9uc2VjIC8gMTAwMCArIHRzLnR2X3NlYyAqIDEwMDAwMDApOwotCXZhbHVlLT5oaWdoID0gMDsKLQl9Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFydHQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYXJ0dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTVhNjdhLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYXJ0dC5jCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKLSogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKLSogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKLSogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKLSogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKLSogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKLSogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKLSogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKLSogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBSVFRhcmdldC0zMgotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlIHNlcnZpY2VzIGZvcgotKiAgICAgICAgICAgICAgIHRoZSBSVFRhcmdldC0zMiBvcGVyYXRpbmcgc3lzdGVtIGVudmlyb25tZW50cy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJudWNsZXVzL2dyYXBoaWNzLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpYm9vbCAgICAgICAgICAgIGhhdmVSRFRTQzsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotR0Ffc2hhcmVkSW5mbyAqIE5BUEkgR0FfZ2V0U2hhcmVkSW5mbygKLSAgICBpbnQgZGV2aWNlKQotewotICAgICh2b2lkKWRldmljZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9nZXRTaGFyZWRFeHBvcnRzKAotICAgIEdBX2V4cG9ydHMgKmdhRXhwKQotewotICAgICh2b2lkKWdhRXhwOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGluaXRpYWxpc2VzIHRoZSBoaWdoIHByZWNpc2lvbiB0aW1pbmcgZnVuY3Rpb25zIGZvciB0aGUKLU51Y2xldXMgbG9hZGVyIGxpYnJhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9UaW1lckluaXQodm9pZCkKLXsKLSAgICBpZiAoX0dBX2hhdmVDUFVJRCgpICYmIChfR0FfZ2V0Q1BVSURGZWF0dXJlcygpICYgQ1BVX0hhdmVSRFRTQykgIT0gMCkgewotCWhhdmVSRFRTQyA9IHRydWU7Ci0JcmV0dXJuIHRydWU7Ci0JfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKLSAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQotewotICAgIGlmIChoYXZlUkRUU0MpCi0JX0dBX3JlYWRUaW1lU3RhbXAodmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2Fhc214LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFzbXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYzMDYwZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWFzbXguYworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8Ci0qICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Ci0qICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Ci0qICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci0qICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8Ci0qICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8Ci0qICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Ci0qICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci0qICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgc214MzIKLSoKLSogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZSBzZXJ2aWNlcyBmb3IKLSogICAgICAgICAgICAgICB0aGUgc214MzIgcGxhdGZvcm0gLS0gbm8gdnhEIHN1cHBvcnQuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJudWNsZXVzL2dyYXBoaWNzLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUdBX3NoYXJlZEluZm8gKiBOQVBJIEdBX2dldFNoYXJlZEluZm8oCi0gICAgaW50IGRldmljZSkKLXsKLSAgICAodm9pZClkZXZpY2U7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfZ2V0U2hhcmVkRXhwb3J0cygKLSAgICBHQV9leHBvcnRzICpnYUV4cCkKLXsKLSAgICAodm9pZClnYUV4cDsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgaGlnaCBwcmVjaXNpb24gdGltaW5nIGZ1bmN0aW9ucyBmb3IgdGhlCi1OdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCi17Ci0gICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApCi0JcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgR0FfVGltZXJSZWFkKAotICAgIEdBX2xhcmdlSW50ZWdlciAqdmFsdWUpCi17Ci0gICAgX0dBX3JlYWRUaW1lU3RhbXAodmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FhdnhkLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWF2eGQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIxYjAyYi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWF2eGQuYworKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8Ci0qICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Ci0qICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Ci0qICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci0qICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8Ci0qICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8Ci0qICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Ci0qICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci0qICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgV2luMzIgVnhECi0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUgc2VydmljZXMgZm9yCi0qICAgICAgICAgICAgICAgdGhlIFdpbjMyIFZ4RCdzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInNkZC9zZGRoZWxwLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpYm9vbCAgICAgICAgICAgIGhhdmVSRFRTQzsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIGludGVybmFsIHNoYXJlZCBpbmZvIHN0cnVjdHVyZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1HQV9zaGFyZWRJbmZvICogTkFQSSBHQV9nZXRTaGFyZWRJbmZvKAotICAgIGludCBkZXZpY2UpCi17Ci0gICAgc3RhdGljIEdBX3NoYXJlZEluZm8gc2hhcmVkID0gezAsLTF9OwotICAgIHJldHVybiAmc2hhcmVkOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX2dldFNoYXJlZEV4cG9ydHMoCi0gICAgR0FfZXhwb3J0cyAqZ2FFeHApCi17Ci0gICAgKHZvaWQpZ2FFeHA7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWluZyBmdW5jdGlvbnMgZm9yIHRoZQotTnVjbGV1cyBsb2FkZXIgbGlicmFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX1RpbWVySW5pdCh2b2lkKQotewotICAgIGlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKSB7Ci0JaGF2ZVJEVFNDID0gdHJ1ZTsKLQl9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTkFQSSBHQV9UaW1lclJlYWQoCi0gICAgR0FfbGFyZ2VJbnRlZ2VyICp2YWx1ZSkKLXsKLSAgICBpZiAoaGF2ZVJEVFNDKQotCV9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKLSAgICBlbHNlCi0JVlREX0dldF9SZWFsX1RpbWUoJnZhbHVlLT5oaWdoLCZ2YWx1ZS0+bG93KTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYXdpbjMyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vYWF3aW4zMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDFkZjRhLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hYXdpbjMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKLSogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKLSogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKLSogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKLSogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKLSogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKLSogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKLSogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKLSogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBXaW4zMgotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlIHNlcnZpY2VzIGZvcgotKiAgICAgICAgICAgICAgIHRoZSBXaW4zMiBvcGVyYXRpbmcgc3lzdGVtIGVudmlyb25tZW50cy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbV9oZWxwLmgiCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2RlZmluZSBTVFJJQ1QKLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmIEdBX01BWF9ERVZJQ0VTID4gNAotI2Vycm9yIEdBX01BWF9ERVZJQ0VTIGhhcyBjaGFuZ2VkIQotI2VuZGlmCi0KLXN0YXRpYyBpYm9vbCAgICAgICAgICAgIGhhdmVSRFRTQzsKLXN0YXRpYyBHQV9sYXJnZUludGVnZXIgIGNvdW50RnJlcTsKLXN0YXRpYyBHQV9sb2FkRHJpdmVyX3QgIE9SR19HQV9sb2FkRHJpdmVyOwotZXh0ZXJuIEhBTkRMRSAgICAgICAgICAgX1BNX2hEZXZpY2U7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUdldCB0aGUgY3VycmVudCBncmFwaGljcyBkcml2ZXIgaW1wb3J0cyBmcm9tIHRoZSBWeEQKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGNvbW1vbiBncmFwaGljcyBkcml2ZXIgbG9hZGVkIGluIHRoZQotaGVscGVyIFZ4RC4gVGhlIG1lbW9yeSBmb3IgdGhlIFZ4RCBpcyBzaGFyZWQgYmV0d2VlbiBhbGwgcHJvY2Vzc2VzIHZpYQotdGhlIFZ4RCwgc28gdGhhdCB0aGUgVnhELCAxNi1iaXQgY29kZSBhbmQgMzItYml0IGNvZGUgYWxsIHNlZSB0aGUgc2FtZQotc3RhdGUgd2hlbiBhY2Nlc3NpbmcgdGhlIGdyYXBoaWNzIGJpbmFyeSBwb3J0YWJsZSBkcml2ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotR0Ffc2hhcmVkSW5mbyAqIE5BUEkgR0FfZ2V0U2hhcmVkSW5mbygKLSAgICBpbnQgZGV2aWNlKQotewotICAgIERXT1JEICAgaW5CdWZbMV07ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KLSAgICBEV09SRCAgIG91dEJ1ZlsyXTsgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCi0gICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLwotCi0gICAgUE1faW5pdCgpOwotICAgIGluQnVmWzBdID0gZGV2aWNlOwotICAgIGlmIChEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9HRVRTSEFSRURJTkZPMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAotCSAgICBvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpKSB7Ci0JcmV0dXJuIChHQV9zaGFyZWRJbmZvKilvdXRCdWZbMF07Ci0JfQotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX2dldFNoYXJlZEV4cG9ydHMoCi0gICAgR0FfZXhwb3J0cyAqZ2FFeHApCi17Ci0gICAgKHZvaWQpZ2FFeHA7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIHNvZnR3YXJlIHN0ZXJlbyBtb2R1bGUgYnkgZWl0aGVyIGNhbGxpbmcKLXRoZSBOdWNsZXVzIGxpYnJhcmllcyBkaXJlY3RseSwgb3IgY2FsbGluZyBpbnRvIHRoZSBWeEQgaWYgd2UgYXJlIHJ1bm5pbmcKLW9uIHRoZSBzaGFyZWQgTnVjbGV1cyBsaWJyYXJpZXMgbG9hZGVkIGJ5IHRoZSBXaW5kb3dzIFZ4RC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaWJvb2wgTkFQSSBfR0Ffc29mdFN0ZXJlb0luaXQoCi0gICAgR0FfZGV2Q3R4ICpkYykKLXsKLSAgICBpZiAoX1BNX2hEZXZpY2UpIHsKLQlEV09SRCAgIGluQnVmWzFdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCi0JRFdPUkQgICBvdXRCdWZbMV07ICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLwotCURXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KLQotCWluQnVmWzBdID0gKHVsb25nKWRjOwotCWlmIChEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9HQVNURVJFT0lOSVQzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksCi0JCW91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkpIHsKLQkgICAgcmV0dXJuIG91dEJ1ZlswXTsKLQkgICAgfQotCX0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiB0dXJucyBvbiBzb2Z0d2FyZSBzdGVyZW8gbW9kZSwgZWl0aGVyIGRpcmVjdGx5IG9yIHZpYSB0aGUgVnhELgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIE5BUEkgX0dBX3NvZnRTdGVyZW9Pbih2b2lkKQotewotICAgIGlmIChfUE1faERldmljZSkgewotCURldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0dBU1RFUkVPT04zMiwgTlVMTCwgMCwKLQkgICAgTlVMTCwgMCwgTlVMTCwgTlVMTCk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gc2NoZWR1bGVzIGEgc29mdHdhcmUgc3RlcmVvIG1vZGUgcGFnZSBmbGlwLCBlaXRoZXIgZGlyZWN0bHkKLW9yIHZpYSB0aGUgVnhELgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIE5BUEkgX0dBX3NvZnRTdGVyZW9TY2hlZHVsZUZsaXAoCi0gICAgTl91aW50MzIgbGVmdEFkZHIsCi0gICAgTl91aW50MzIgcmlnaHRBZGRyKQotewotICAgIGlmIChfUE1faERldmljZSkgewotCURXT1JEICAgaW5CdWZbMl07ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KLQlEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCi0KLQlpbkJ1ZlswXSA9ICh1bG9uZylsZWZ0QWRkcjsKLQlpbkJ1ZlsxXSA9ICh1bG9uZylyaWdodEFkZHI7Ci0JRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfR0FTVEVSRU9GTElQMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAotCSAgICBOVUxMLCAwLCAmY291bnQsIE5VTEwpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHR1cm5zIG9mZiBzb2Z0d2FyZSBzdGVyZW8gbW9kZSwgZWl0aGVyIGRpcmVjdGx5IG9yIHZpYSB0aGUgVnhELgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBOX2ludDMyIE5BUEkgX0dBX3NvZnRTdGVyZW9HZXRGbGlwU3RhdHVzKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9oRGV2aWNlKSB7Ci0JRFdPUkQgICBvdXRCdWZbMV07ICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLwotCURXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KLQotCWlmIChEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9HQVNURVJFT0ZMSVBTVEFUVVMzMiwgTlVMTCwgMCwKLQkJb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSkgewotCSAgICByZXR1cm4gb3V0QnVmWzBdOwotCSAgICB9Ci0JfQotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gdHVybnMgb2ZmIHNvZnR3YXJlIHN0ZXJlbyBtb2RlLCBlaXRoZXIgZGlyZWN0bHkgb3IgdmlhIHRoZSBWeEQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgTkFQSSBfR0Ffc29mdFN0ZXJlb1dhaXRUaWxsRmxpcHBlZCh2b2lkKQotewotICAgIHdoaWxlICghX0dBX3NvZnRTdGVyZW9HZXRGbGlwU3RhdHVzKCkpCi0JOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gdHVybnMgb2ZmIHNvZnR3YXJlIHN0ZXJlbyBtb2RlLCBlaXRoZXIgZGlyZWN0bHkgb3IgdmlhIHRoZSBWeEQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgTkFQSSBfR0Ffc29mdFN0ZXJlb09mZih2b2lkKQotewotICAgIGlmIChfUE1faERldmljZSkgewotCURldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0dBU1RFUkVPT0ZGMzIsIE5VTEwsIDAsCi0JICAgIE5VTEwsIDAsIE5VTEwsIE5VTEwpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGRpc2FibGUgdGhlIHNvZnR3YXJlIHN0ZXJlbyBoYW5kbGVyLCBlaXRoZXIgZGlyZWN0bHkgb3IgdmlhCi10aGUgVnhELgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIE5BUEkgX0dBX3NvZnRTdGVyZW9FeGl0KHZvaWQpCi17Ci0gICAgaWYgKF9QTV9oRGV2aWNlKSB7Ci0JRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfR0FTVEVSRU9FWElUMzIsIE5VTEwsIDAsCi0JICAgIE5VTEwsIDAsIE5VTEwsIE5VTEwpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1XZSBob29rIHRoaXMgZnVuY3Rpb24gaW4gaGVyZSBzbyB0aGF0IHdlIGNhbiBhdm9pZCB0aGUgbWVtb3J5IGRldGVjdCBhbmQKLW90aGVyIGRlc3RydWN0aXZlIHNlcXVlbmNlcyBpbiB0aGUgZHJpdmVycyBpZiB3ZSBhcmUgbG9hZGluZyB0aGUgZHJpdmVyCi1mcm9tIGEgV2luMzIgYXBwbGljYXRpb24gKG91ciBkaXNwbGF5IGRyaXZlcnMgaW4gY29udHJhc3QgbG9hZCB0aGVtIGluc2lkZQotdGhlIFZ4RCBkaXJlY3RseSwgYnV0IHRoZSBjb250cm9sIHBhbmVsIGFwcGxldHMgdXNlIHRoaXMgZnVuY3Rpb24pLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBHQV9kZXZDdHggKiBOQVBJIF9HQV9sb2FkRHJpdmVyKAotICAgIE5faW50MzIgZGV2aWNlSW5kZXgsCi0gICAgTl9pbnQzMiBzaGFyZWQpCi17Ci0gICAgR0FfZGV2Q3R4ICAgKmRjOwotICAgIERXT1JEICAgICAgIGluQnVmWzFdOwotICAgIERXT1JEICAgICAgIG91dEJ1ZlsxXTsKLSAgICBOX2ludDMyICAgICB0b3RhbE1lbW9yeSA9IDAsb2xkSU9QTDsKLQotICAgIGlmIChkZXZpY2VJbmRleCA+PSBHQV9NQVhfREVWSUNFUykKLQlQTV9mYXRhbEVycm9yKCJEZXZpY2VJbmRleCB0b28gbGFyZ2UgaW4gR0FfbG9hZERyaXZlciEiKTsKLSAgICBQTV9pbml0KCk7Ci0gICAgaW5CdWZbMF0gPSBkZXZpY2VJbmRleDsKLSAgICBpZiAoRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfR0VUTUVNU0laRTMyLAotCSAgICBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgTlVMTCwgTlVMTCkpCi0JdG90YWxNZW1vcnkgPSBvdXRCdWZbMF07Ci0gICAgaWYgKHRvdGFsTWVtb3J5ID09IDApCi0JdG90YWxNZW1vcnkgPSA4MTkyOwotICAgIF9HQV9leHBvcnRzLkdBX2ZvcmNlTWVtU2l6ZSh0b3RhbE1lbW9yeSxzaGFyZWQpOwotICAgIG9sZElPUEwgPSBQTV9zZXRJT1BMKDMpOwotICAgIGRjID0gT1JHX0dBX2xvYWREcml2ZXIoZGV2aWNlSW5kZXgsc2hhcmVkKTsKLSAgICBQTV9zZXRJT1BMKG9sZElPUEwpOwotICAgIHJldHVybiBkYzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGluaXRpYWxpc2VzIHRoZSBoaWdoIHByZWNpc2lvbiB0aW1pbmcgZnVuY3Rpb25zIGZvciB0aGUKLU51Y2xldXMgbG9hZGVyIGxpYnJhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9UaW1lckluaXQodm9pZCkKLXsKLSAgICBpZiAoX0dBX2hhdmVDUFVJRCgpICYmIChfR0FfZ2V0Q1BVSURGZWF0dXJlcygpICYgQ1BVX0hhdmVSRFRTQykgIT0gMCkgewotCWhhdmVSRFRTQyA9IHRydWU7Ci0JcmV0dXJuIHRydWU7Ci0JfQotICAgIGVsc2UgaWYgKFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koKExBUkdFX0lOVEVHRVIqKSZjb3VudEZyZXEpKSB7Ci0JaGF2ZVJEVFNDID0gZmFsc2U7Ci0JcmV0dXJuIHRydWU7Ci0JfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKLSAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQotewotICAgIGlmIChoYXZlUkRUU0MpCi0JX0dBX3JlYWRUaW1lU3RhbXAodmFsdWUpOwotICAgIGVsc2UKLQlRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigoTEFSR0VfSU5URUdFUiopdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FncGxpYi5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2FncGxpYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzZlZWRjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9hZ3BsaWIuYworKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCi0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAotKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAotKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAotKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAotKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAotKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAotKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAotKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAotKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueSAzMi1iaXQgcHJvdGVjdGVkIG1vZGUgZW52aXJvbm1lbnQKLSoKLSogRGVzY3JpcHRpb246ICBDIG1vZHVsZSBmb3IgdGhlIEdyYXBoaWNzIEFjY2VsZXJhdG9yIERyaXZlciBBUEkuIFVzZXMKLSogICAgICAgICAgICAgICB0aGUgU2NpVGVjaCBQTSBsaWJyYXJ5IGZvciBpbnRlcmZhY2luZyB3aXRoIERPUwotKiAgICAgICAgICAgICAgIGV4dGVuZGVyIHNwZWNpZmljIGZ1bmN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJudWNsZXVzL2dyYXBoaWNzLmgiCi0jaW5jbHVkZSAibnVjbGV1cy9hZ3AuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBERUJVR19BR1BfRFJJVkVSCi1zdGF0aWMgQUdQX2V4cG9ydHMgIF9BR1BfZXhwb3J0czsKLXN0YXRpYyBpbnQgICAgICAgICAgbG9hZGVkID0gZmFsc2U7Ci1zdGF0aWMgUEVfTU9EVUxFICAgICpoTW9kQlBEID0gTlVMTDsKLQotc3RhdGljIE5faW1wb3J0cyBfTl9pbXBvcnRzID0gewotICAgIHNpemVvZihOX2ltcG9ydHMpLAotICAgIF9PU19kZWxheSwKLSAgICB9OwotCi1zdGF0aWMgQUdQX2ltcG9ydHMgX0FHUF9pbXBvcnRzID0gewotICAgIHNpemVvZihBR1BfaW1wb3J0cyksCi0gICAgfTsKLSNlbmRpZgotCi0jaW5jbHVkZSAicG1pbXAuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBETExfTkFNRSAgICAgICAgImFncC5icGQiCi0KLSNpZm5kZWYgREVCVUdfQUdQX0RSSVZFUgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GYXRhbCBlcnJvciBoYW5kbGVyIGZvciBub24tZXhwb3J0ZWQgR0FfZXhwb3J0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfQUdQX2ZhdGFsRXJyb3JIYW5kbGVyKHZvaWQpCi17Ci0gICAgUE1fZmF0YWxFcnJvcigiVW5zdXBwb3J0ZWQgQUdQIGV4cG9ydCBmdW5jdGlvbiBjYWxsZWQhIFBsZWFzZSB1cGdyYWRlIHlvdXIgY29weSBvZiBBR1AhXG4iKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zaGFyZWQgIC0gVHJ1ZSB0byBsb2FkIHRoZSBkcml2ZXIgaW50byBzaGFyZWQgbWVtb3J5LgotCi1SRU1BUktTOgotTG9hZHMgdGhlIE51Y2xldXMgYmluYXJ5IHBvcnRhYmxlIERMTCBpbnRvIG1lbW9yeSBhbmQgaW5pdGlsaXNlcyBpdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaWJvb2wgTG9hZERyaXZlcih2b2lkKQotewotICAgIEFHUF9pbml0TGlicmFyeV90ICAgQUdQX2luaXRMaWJyYXJ5OwotICAgIEFHUF9leHBvcnRzICAgICAgICAgKmFncEV4cDsKLSAgICBjaGFyICAgICAgICAgICAgICAgIGZpbGVuYW1lW1BNX01BWF9QQVRIXTsKLSAgICBjaGFyICAgICAgICAgICAgICAgIGJwZHBhdGhbUE1fTUFYX1BBVEhdOwotICAgIGludCAgICAgICAgICAgICAgICAgaSxtYXg7Ci0gICAgdWxvbmcgICAgICAgICAgICAgICAqcDsKLQotICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgYWxyZWFkeSBsb2FkZWQgdGhlIGRyaXZlciAqLwotICAgIGlmIChsb2FkZWQpCi0JcmV0dXJuIHRydWU7Ci0gICAgUE1faW5pdCgpOwotCi0gICAgLyogT3BlbiB0aGUgQlBEIGZpbGUgKi8KLSAgICBpZiAoIVBNX2ZpbmRCUEQoRExMX05BTUUsYnBkcGF0aCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIHN0cmNweShmaWxlbmFtZSxicGRwYXRoKTsKLSAgICBzdHJjYXQoZmlsZW5hbWUsRExMX05BTUUpOwotICAgIGlmICgoaE1vZEJQRCA9IFBFX2xvYWRMaWJyYXJ5KGZpbGVuYW1lLGZhbHNlKSkgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgaWYgKChBR1BfaW5pdExpYnJhcnkgPSAoQUdQX2luaXRMaWJyYXJ5X3QpUEVfZ2V0UHJvY0FkZHJlc3MoaE1vZEJQRCwiX0FHUF9pbml0TGlicmFyeSIpKSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICBicGRwYXRoW3N0cmxlbihicGRwYXRoKS0xXSA9IDA7Ci0gICAgaWYgKHN0cmNtcChicGRwYXRoLFBNX2dldE51Y2xldXNQYXRoKCkpID09IDApCi0Jc3RyY3B5KGJwZHBhdGgsUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgoKSk7Ci0gICAgZWxzZSB7Ci0JUE1fYmFja3NsYXNoKGJwZHBhdGgpOwotCXN0cmNhdChicGRwYXRoLCJjb25maWciKTsKLQl9Ci0gICAgaWYgKChhZ3BFeHAgPSBBR1BfaW5pdExpYnJhcnkoYnBkcGF0aCxmaWxlbmFtZSxHQV9nZXRTeXN0ZW1QTUltcG9ydHMoKSwmX05faW1wb3J0cywmX0FHUF9pbXBvcnRzKSkgPT0gTlVMTCkKLQlQTV9mYXRhbEVycm9yKCJBR1BfaW5pdExpYnJhcnkgZmFpbGVkIVxuIik7Ci0gICAgX0FHUF9leHBvcnRzLmR3U2l6ZSA9IHNpemVvZihfQUdQX2V4cG9ydHMpOwotICAgIG1heCA9IHNpemVvZihfQUdQX2V4cG9ydHMpL3NpemVvZihBR1BfaW5pdExpYnJhcnlfdCk7Ci0gICAgZm9yIChpID0gMCxwID0gKHVsb25nKikmX0FHUF9leHBvcnRzOyBpIDwgbWF4OyBpKyspCi0JKnArKyA9ICh1bG9uZylfQUdQX2ZhdGFsRXJyb3JIYW5kbGVyOwotICAgIG1lbWNweSgmX0FHUF9leHBvcnRzLGFncEV4cCxNSU4oc2l6ZW9mKF9BR1BfZXhwb3J0cyksYWdwRXhwLT5kd1NpemUpKTsKLSAgICBsb2FkZWQgPSB0cnVlOwotICAgIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGUgZm9sbG93aW5nIGFyZSBzdHViIGVudHJ5IHBvaW50cyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBjYWxscyB0bwotICogaW5pdGlhbGlzZSB0aGUgTnVjbGV1cyBsb2FkZXIgbGlicmFyeSwgYW5kIHdlIHVzZSB0aGlzIHRvIGxvYWQgb3VyCi0gKiBkcml2ZXIgRExMIGZyb20gZGlzayBhbmQgaW5pdGlhbGlzZSB0aGUgbGlicmFyeSB1c2luZyBpdC4KLSAqLwotCi0vKiB7c2VjcmV0fSAqLwotaW50IE5BUEkgQUdQX3N0YXR1cyh2b2lkKQotewotICAgIGlmICghbG9hZGVkKQotCXJldHVybiBuRHJpdmVyTm90Rm91bmQ7Ci0gICAgcmV0dXJuIF9BR1BfZXhwb3J0cy5BR1Bfc3RhdHVzKCk7Ci19Ci0KLS8qIHtzZWNyZXR9ICovCi1jb25zdCBjaGFyICogTkFQSSBBR1BfZXJyb3JNc2coCi0gICAgTl9pbnQzMiBzdGF0dXMpCi17Ci0gICAgaWYgKCFsb2FkZWQpCi0JcmV0dXJuICJVbmFibGUgdG8gbG9hZCBOdWNsZXVzIGRldmljZSBkcml2ZXIhIjsKLSAgICByZXR1cm4gX0FHUF9leHBvcnRzLkFHUF9lcnJvck1zZyhzdGF0dXMpOwotfQotCi0vKiB7c2VjcmV0fSAqLwotQUdQX2RldkN0eCAqIE5BUEkgQUdQX2xvYWREcml2ZXIoTl9pbnQzMiBkZXZpY2VJbmRleCkKLXsKLSAgICBpZiAoIUxvYWREcml2ZXIoKSkKLQlyZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gX0FHUF9leHBvcnRzLkFHUF9sb2FkRHJpdmVyKGRldmljZUluZGV4KTsKLX0KLQotLyoge3NlY3JldH0gKi8KLXZvaWQgTkFQSSBBR1BfdW5sb2FkRHJpdmVyKAotICAgIEFHUF9kZXZDdHggKmRjKQotewotICAgIGlmIChsb2FkZWQpCi0JX0FHUF9leHBvcnRzLkFHUF91bmxvYWREcml2ZXIoZGMpOwotfQotCi0vKiB7c2VjcmV0fSAqLwotdm9pZCBOQVBJIEFHUF9nZXRHbG9iYWxPcHRpb25zKAotICAgIEFHUF9nbG9iYWxPcHRpb25zICpvcHRpb25zKQotewotICAgIGlmIChMb2FkRHJpdmVyKCkpCi0JX0FHUF9leHBvcnRzLkFHUF9nZXRHbG9iYWxPcHRpb25zKG9wdGlvbnMpOwotfQotCi0vKiB7c2VjcmV0fSAqLwotdm9pZCBOQVBJIEFHUF9zZXRHbG9iYWxPcHRpb25zKAotICAgIEFHUF9nbG9iYWxPcHRpb25zICpvcHRpb25zKQotewotICAgIGlmIChMb2FkRHJpdmVyKCkpCi0JX0FHUF9leHBvcnRzLkFHUF9zZXRHbG9iYWxPcHRpb25zKG9wdGlvbnMpOwotfQotCi0vKiB7c2VjcmV0fSAqLwotdm9pZCBOQVBJIEFHUF9zYXZlR2xvYmFsT3B0aW9ucygKLSAgICBBR1BfZ2xvYmFsT3B0aW9ucyAqb3B0aW9ucykKLXsKLSAgICBpZiAobG9hZGVkKQotCV9BR1BfZXhwb3J0cy5BR1Bfc2F2ZUdsb2JhbE9wdGlvbnMob3B0aW9ucyk7Ci19Ci0jZW5kaWYKLQotLyoge3NlY3JldH0gKi8KLXZvaWQgTkFQSSBfT1NfZGVsYXk4MjUzKE5fdWludDMyIG1pY3JvU2Vjb25kcyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBkZWxheXMgZm9yIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTkFQSSBfT1NfZGVsYXkoCi0gICAgTl91aW50MzIgbWljcm9TZWNvbmRzKQotewotICAgIHN0YXRpYyBpYm9vbCAgICBpbml0ZWQgPSBmYWxzZTsKLSAgICBzdGF0aWMgaWJvb2wgICAgaGF2ZVJEVFNDOwotICAgIExaVGltZXJPYmplY3QgICB0bTsKLQotICAgIGlmICghaW5pdGVkKSB7Ci0jaWZuZGVmIF9fV0lOMzJfVlhEX18KLQkvKiBUaGlzIGhhcyBiZWVuIGNhdXNpbmcgcHJvYmxlbXMgaW4gVnhEJ3MgZm9yIHNvbWUgcmVhc29uLCBzbyBmb3Igbm93ICovCi0JLyogd2UgYXZvaWQgdXNpbmcgaXQuICovCi0JaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApIHsKLQkgICAgWlRpbWVySW5pdCgpOwotCSAgICBoYXZlUkRUU0MgPSB0cnVlOwotCSAgICB9Ci0JZWxzZQotI2VuZGlmCi0JICAgIGhhdmVSRFRTQyA9IGZhbHNlOwotCWluaXRlZCA9IHRydWU7Ci0JfQotICAgIGlmIChoYXZlUkRUU0MpIHsKLQlMWlRpbWVyT25FeHQoJnRtKTsKLQl3aGlsZSAoTFpUaW1lckxhcEV4dCgmdG0pIDwgbWljcm9TZWNvbmRzKQotCSAgICA7Ci0JTFpUaW1lck9uRXh0KCZ0bSk7Ci0JfQotICAgIGVsc2UKLQlfT1NfZGVsYXk4MjUzKG1pY3JvU2Vjb25kcyk7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vY2VudGVyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vY2VudGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZTE3YzIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2NlbnRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgRGlzcGxheSBEb2N0b3IgV2luZG93cyBJbnRlcmZhY2UgQ29kZQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBpcyBhIHByb3ByaWV0YXJ5IHRyYWRlIHNlY3JldCBvZiAgICAgfAotKiAgfFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCBDaGljbywgQ0EgOTU5MjggfAotKiAgfFVTQSAod3d3LnNjaXRlY2hzb2Z0LmNvbSkuICBBTlkgVU5BVVRIT1JJWkVEIFBPU1NFU1NJT04sIFVTRSwgICAgICAgfAotKiAgfFZJRVdJTkcsIENPUFlJTkcsIE1PRElGSUNBVElPTiBPUiBESVNTRU1JTkFUSU9OIE9GIFRISVMgQ09ERSBJUyAgICAgfAotKiAgfFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXLiAgVW5sZXNzIHlvdSBoYXZlIGN1cnJlbnQsIGV4cHJlc3MgICAgICAgfAotKiAgfHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFNjaVRlY2ggdG8gcG9zc2VzcyBvciB1c2UgdGhpcyBjb2RlLCB5b3UgfAotKiAgfG1heSBiZSBzdWJqZWN0IHRvIGNpdmlsIGFuZC9vciBjcmltaW5hbCBwZW5hbHRpZXMuICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfElmIHlvdSByZWNlaXZlZCB0aGlzIGNvZGUgaW4gZXJyb3Igb3IgeW91IHdvdWxkIGxpa2UgdG8gcmVwb3J0ICAgICAgfAotKiAgfGltcHJvcGVyIHVzZSwgcGxlYXNlIGltbWVkaWF0ZWx5IGNvbnRhY3QgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiBhdCAgfAotKiAgfDUzMC04OTQtODQwMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEMrKyAzLjAKLSogRW52aXJvbm1lbnQ6ICBXaW4xNgotKgotKiBEZXNjcmlwdGlvbjogIERpYWxvZyBkcml2ZW4gY29uZmlndXJhdGlvbiBwcm9ncmFtIGZvciBVbmlWQkUgYW5kCi0qICAgICAgICAgICAgICAgV2luRGlyZWN0IFByb2Zlc3Npb25hbCBwcm9kdWN0cy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJjZW50ZXIuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBfRVhQT1JUIENlbnRlcldpbmRvdyhIV05EIGhXbmRDZW50ZXIsIEhXTkQgcGFyZW50LCBCT09MIHJlcGFpbnQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIENlbnRlcldpbmRvdwotKiBQYXJhbWV0ZXJzOiAgIGhXbmRDZW50ZXIgIC0gV2luZG93IHRvIGNlbnRlcgotKiAgICAgICAgICAgICAgIHBhcmVudCAgICAgIC0gSGFuZGxlIGZvciBwYXJlbnQgd2luZG93Ci0qICAgICAgICAgICAgICAgcmVwYWludCAgICAgLSB0cnVlIGlmIHdpbmRvdyBzaG91bGQgYmUgcmUtcGFpbnRlZAotKgotKiBEZXNjcmlwdGlvbjogIENlbnRlcnMgdGhlIHNwZWNpZmllZCB3aW5kb3cgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlCi0qICAgICAgICAgICAgICAgc3BlY2lmaWVkIHBhcmVudCB3aW5kb3cuIElmIHRoZSBwYXJlbnQgd2luZG93IGlzIE5VTEwsIHRoZW4KLSogICAgICAgICAgICAgICB3ZSBjZW50ZXIgaXQgdXNpbmcgdGhlIERlc2t0b3Agd2luZG93LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBIV05EICAgIGhXbmRQYXJlbnQgPSAocGFyZW50ID8gcGFyZW50IDogR2V0RGVza3RvcFdpbmRvdygpKTsKLSAgICBSRUNUICAgIFJlY3RQYXJlbnQ7Ci0gICAgUkVDVCAgICBSZWN0Q2VudGVyOwotICAgIGludCAgICAgQ2VudGVyWCxDZW50ZXJZLEhlaWdodCxXaWR0aDsKLQotICAgIEdldFdpbmRvd1JlY3QoaFduZFBhcmVudCwgJlJlY3RQYXJlbnQpOwotICAgIEdldFdpbmRvd1JlY3QoaFduZENlbnRlciwgJlJlY3RDZW50ZXIpOwotCi0gICAgV2lkdGggPSAoUmVjdENlbnRlci5yaWdodCAtIFJlY3RDZW50ZXIubGVmdCk7Ci0gICAgSGVpZ2h0ID0gKFJlY3RDZW50ZXIuYm90dG9tIC0gUmVjdENlbnRlci50b3ApOwotICAgIENlbnRlclggPSAoKFJlY3RQYXJlbnQucmlnaHQgLSBSZWN0UGFyZW50LmxlZnQpIC0gV2lkdGgpIC8gMjsKLSAgICBDZW50ZXJZID0gKChSZWN0UGFyZW50LmJvdHRvbSAtIFJlY3RQYXJlbnQudG9wKSAtIEhlaWdodCkgLyAyOwotCi0gICAgaWYgKChDZW50ZXJYIDwgMCkgfHwgKENlbnRlclkgPCAwKSkgewotCS8qIFRoZSBDZW50ZXIgV2luZG93IGlzIHNtYWxsZXIgdGhhbiB0aGUgcGFyZW50IHdpbmRvdy4gKi8KLQlpZiAoaFduZFBhcmVudCAhPSBHZXREZXNrdG9wV2luZG93KCkpIHsKLQkgICAgLyogSWYgdGhlIHBhcmVudCB3aW5kb3cgaXMgbm90IHRoZSBkZXNrdG9wIHVzZSB0aGUgZGVza3RvcCBzaXplLiAqLwotCSAgICBDZW50ZXJYID0gKEdldFN5c3RlbU1ldHJpY3MoU01fQ1hTQ1JFRU4pIC0gV2lkdGgpIC8gMjsKLQkgICAgQ2VudGVyWSA9IChHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0NSRUVOKSAtIEhlaWdodCkgLyAyOwotCSAgICB9Ci0JQ2VudGVyWCA9IChDZW50ZXJYIDwgMCkgPyAwOiBDZW50ZXJYOwotCUNlbnRlclkgPSAoQ2VudGVyWSA8IDApID8gMDogQ2VudGVyWTsKLQl9Ci0gICAgZWxzZSB7Ci0JQ2VudGVyWCArPSBSZWN0UGFyZW50LmxlZnQ7Ci0JQ2VudGVyWSArPSBSZWN0UGFyZW50LnRvcDsKLQl9Ci0KLSAgICAvKiBDb3B5IHRoZSB2YWx1ZXMgaW50byBSZWN0Q2VudGVyICovCi0gICAgUmVjdENlbnRlci5sZWZ0ID0gQ2VudGVyWDsKLSAgICBSZWN0Q2VudGVyLnJpZ2h0ID0gQ2VudGVyWCArIFdpZHRoOwotICAgIFJlY3RDZW50ZXIudG9wID0gQ2VudGVyWTsKLSAgICBSZWN0Q2VudGVyLmJvdHRvbSA9IENlbnRlclkgKyBIZWlnaHQ7Ci0KLSAgICAvKiBNb3ZlIHRoZSB3aW5kb3cgdG8gdGhlIG5ldyBsb2NhdGlvbiAqLwotICAgIE1vdmVXaW5kb3coaFduZENlbnRlciwgUmVjdENlbnRlci5sZWZ0LCBSZWN0Q2VudGVyLnRvcCwKLQkgICAgKFJlY3RDZW50ZXIucmlnaHQgLSBSZWN0Q2VudGVyLmxlZnQpLAotCSAgICAoUmVjdENlbnRlci5ib3R0b20gLSBSZWN0Q2VudGVyLnRvcCksIHJlcGFpbnQpOwotfQotCi12b2lkIF9FWFBPUlQgQ2VudGVyTG9nbyhIV05EIGhXbmRMb2dvLCBIV05EIGhXbmRQYXJlbnQsIGludCBDZW50ZXJZKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBDZW50ZXJMb2dvCi0qIFBhcmFtZXRlcnM6ICAgaFduZExvZ28gICAgLSBXaW5kb3cgdG8gY2VudGVyCi0qICAgICAgICAgICAgICAgaFduZFBhcmVudCAgLSBIYW5kbGUgZm9yIHBhcmVudCB3aW5kb3cKLSogICAgICAgICAgICAgICBDZW50ZXJZICAgICAtIFRvcCBjb29yZGluYXRlIGZvciBsb2dvCi0qCi0qIERlc2NyaXB0aW9uOiAgQ2VudGVycyB0aGUgc3BlY2lmaWVkIHdpbmRvdyB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGUKLSogICAgICAgICAgICAgICBzcGVjaWZpZWQgcGFyZW50IHdpbmRvdyBpbiB0aGUgaG9yaXpvbnRhbCBkaXJlY3Rpb24gb25seS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgUkVDVCAgICBSZWN0UGFyZW50OwotICAgIFJFQ1QgICAgUmVjdENlbnRlcjsKLSAgICBpbnQgICAgIENlbnRlclgsSGVpZ2h0LFdpZHRoOwotCi0gICAgR2V0V2luZG93UmVjdChoV25kUGFyZW50LCAmUmVjdFBhcmVudCk7Ci0gICAgR2V0V2luZG93UmVjdChoV25kTG9nbywgJlJlY3RDZW50ZXIpOwotICAgIFdpZHRoID0gKFJlY3RDZW50ZXIucmlnaHQgLSBSZWN0Q2VudGVyLmxlZnQpOwotICAgIEhlaWdodCA9IChSZWN0Q2VudGVyLmJvdHRvbSAtIFJlY3RDZW50ZXIudG9wKTsKLSAgICBDZW50ZXJYID0gKChSZWN0UGFyZW50LnJpZ2h0IC0gUmVjdFBhcmVudC5sZWZ0KSAtIFdpZHRoKSAvIDI7Ci0KLSAgICAvKiBDb3B5IHRoZSB2YWx1ZXMgaW50byBSZWN0Q2VudGVyICovCi0gICAgUmVjdENlbnRlci5sZWZ0ID0gQ2VudGVyWDsKLSAgICBSZWN0Q2VudGVyLnJpZ2h0ID0gQ2VudGVyWCArIFdpZHRoOwotICAgIFJlY3RDZW50ZXIudG9wID0gQ2VudGVyWTsKLSAgICBSZWN0Q2VudGVyLmJvdHRvbSA9IENlbnRlclkgKyBIZWlnaHQ7Ci0KLSAgICAvKiBNb3ZlIHRoZSB3aW5kb3cgdG8gdGhlIG5ldyBsb2NhdGlvbiAqLwotICAgIE1vdmVXaW5kb3coaFduZExvZ28sIFJlY3RDZW50ZXIubGVmdCwgUmVjdENlbnRlci50b3AsCi0JICAgIChSZWN0Q2VudGVyLnJpZ2h0IC0gUmVjdENlbnRlci5sZWZ0KSwKLQkgICAgKFJlY3RDZW50ZXIuYm90dG9tIC0gUmVjdENlbnRlci50b3ApLCBmYWxzZSk7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vY21kbGluZS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2NtZGxpbmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMxZTVlMS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vY21kbGluZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIGFueQotKgotKiBEZXNjcmlwdGlvbjogIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGNvZGUgdG8gcGFyc2UgdGhlIGNvbW1hbmQgbGluZSwKLSogICAgICAgICAgICAgICBleHRyYWN0aW5nIG9wdGlvbnMgYW5kIHBhcmFtZXRlcnMgaW4gc3RhbmRhcmQgU3lzdGVtIFYKLSogICAgICAgICAgICAgICBzdHlsZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiY21kbGluZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1pbnQgICAgIG5leHRhcmd2ICAgID0gICAxOyAgICAgICAgICAvKiBJbmRleCBpbnRvIGFyZ3YgYXJyYXkgICAgICAgICAgICAqLwotY2hhciAgICAqbmV4dGNoYXIgICA9ICAgTlVMTDsgICAgICAgLyogUG9pbnRlciB0byBuZXh0IGNoYXJhY3RlciAgICAgICAgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBJU19TV0lUQ0hfQ0hBUihjKSAgICAgICAoKGMpID09ICctJykKLSNkZWZpbmUgSVNfTk9UX1NXSVRDSF9DSEFSKGMpICAgKChjKSAhPSAnLScpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVBhcnNlIHRoZSBjb21tYW5kIGxpbmUgZm9yIHNwZWNpZmljIG9wdGlvbnMKLQotSEVBREVSOgotY21kbGluZS5oCi0KLVBBUkFNRVRFUlM6Ci1hcmdjICAgICAgICAtIFZhbHVlIHBhc3NlZCB0byBwcm9ncmFtIHRocm91Z2ggYXJnYyB2YXJpYWJsZQotYXJndiAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBhcmd2IGFycmF5IHBhc3NlZCB0byB0aGUgcHJvZ3JhbQotZm9ybWF0ICAgICAgLSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGV4cGVjdGVkIGZvcm1hdCBvZiB0aGUgY29tbWFuZCBsaW5lCi1hcmd1bWVudCAgICAtIFBvaW50ZXIgdG8gb3B0aW9uYWwgYXJndW1lbnQgb24gY29tbWFuZCBsaW5lCi0KLVJFVFVSTlM6Ci1DaGFyYWN0ZXIgY29kZSByZXByZXNlbnRpbmcgdGhlIG5leHQgb3B0aW9uIHBhcnNlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgYnkKLWdldGNtZG9wdC4gUmV0dXJucyBBTExET05FICgtMSkgd2hlbiB0aGVyZSBhcmUgbm8gbW9yZSBwYXJhbWV0ZXJzIHRvIGJlIHBhcnNlZAotb24gdGhlIGNvbW1hbmQgbGluZSwgUEFSQU1FVEVSICgtMikgd2hlbiB0aGUgYXJndW1lbnQgYmVpbmcgcGFyc2VkIGlzIGEKLXBhcmFtZXRlciBhbmQgbm90IGFuIG9wdGlvbiBzd2l0Y2ggYW5kIGxhc3RseSBJTlZBTElEICgtMykgaWYgYW4gZXJyb3IKLW9jY3VyZWQgd2hpbGUgcGFyc2luZyB0aGUgY29tbWFuZCBsaW5lLgotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gcGFyc2UgdGhlIGNvbW1hbmQgbGluZSBvcHRpb24gc3dpdGNoZXMgaW4gVU5JWCBTeXN0ZW0gViBzdHlsZS4KLVdoZW4gZ2V0Y21kb3B0IGlzIGNhbGxlZCwgaXQgcmV0dXJucyB0aGUgY2hhcmFjdGVyIGNvZGUgb2YgdGhlIG5leHQgdmFsaWQKLW9wdGlvbiB0aGF0IGlzIHBhcnNlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgYXMgc3BlY2lmaWVkIGJ5IHRoZSBGb3JtYXQKLXN0cmluZy4gVGhlIGZvcm1hdCBzdHJpbmcgc2hvdWxkIGJlIGluIHRoZSBmb2xsb3dpbmcgZm9ybToKLQotICAgICJhYmNkOmU6ZjoiCi0KLXdoZXJlIGEsYiBhbmQgYyByZXByZXNlbnQgc2luZ2xlIHN3aXRjaCBzdHlsZSBvcHRpb25zIGFuZCB0aGUgY2hhcmFjdGVyCi1jb2RlIHJldHVybmVkIGJ5IGdldGNtZG9wdCBpcyB0aGUgb25seSB2YWx1ZSByZXR1cm5lZC4gQWxzbyBkLCBlIGFuZCBmCi1yZXByZXNlbnQgb3B0aW9ucyB0aGF0IGV4cGVjdCBhcmd1bWVudHMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlbSBvbiB0aGUKLWNvbW1hbmQgbGluZS4gVGhlIGFyZ3VtZW50IHRoYXQgZm9sbG93cyB0aGUgb3B0aW9uIG9uIHRoZSBjb21tYW5kIGxpbmUgaXMKLXJldHVybmVkIHZpYSBhIHJlZmVyZW5jZSBpbiB0aGUgcG9pbnRlciBhcmd1bWVudC4gVGh1cyBhIHZhbGlkIGNvbW1hbmQgbGluZQotZm9yIHRoaXMgZm9ybWF0IHN0cmluZyBtaWdodCBiZToKLQotICAgIG15cHJvZ3JhbSAtYWRsaW5lcyAtYiAtZiBmb3JtYXQgaW5maWxlIG91dGZpbGUKLQotd2hlcmUgYSBhbmQgYiB3aWxsIGJlIHJldHVybmVkIGFzIHNpbmdsZSBjaGFyYWN0ZXIgb3B0aW9ucyB3aXRoIG5vIGFyZ3VtZW50LAotd2hpbGUgZCBpcyByZXR1cm5lZCB3aXRoIHRoZSBhcmd1bWVudCBsaW5lcyBhbmQgZiBpcyByZXR1cm5lZCB3aXRoIHRoZQotYXJndW1lbnQgZm9ybWF0LgotCi1XaGVuIGdldGNtZG9wdCByZXR1cm5zIHdpdGggUEFSQU1FVEVSICh3ZSBhdHRlbXB0ZWQgdG8gcGFyc2UgYSBwYXJhbXRlciwgbm90Ci1hbiBvcHRpb24pLCB0aGUgZ2xvYmFsIHZhcmlhYmxlIE5leHRBcmd2IHdpbGwgaG9sZCBhbiBpbmRleCBpbiB0aGUgYXJndgotYXJyYXkgdG8gdGhlIGFyZ3VtZW50IG9uIHRoZSBjb21tYW5kIGxpbmUgQUZURVIgdGhlIG9wdGlvbnMsIGllIGluIHRoZQotYWJvdmUgZXhhbXBsZSB0aGUgc3RyaW5nICdpbmZpbGUnLiBJZiB0aGUgcGFyYW1ldGVyIGlzIHN1Y2Nlc3NmdWxseSB1c2VkLAotTmV4dEFyZ3Ygc2hvdWxkIGJlIGluY3JlbWVudGVkIGFuZCBnZXRjbWRvcHQgY2FuIGJlIGNhbGxlZCBhZ2FpbiB0byBwYXJzZSBhbnkKLW1vcmUgb3B0aW9ucy4gVGh1cyB5b3UgY2FuIGFsc28gaGF2ZSBvcHRpb25zIGludGVyc3BlcnNlZCB0aHJvdWdodCB0aGUKLWNvbW1hbmQgbGluZS4gZWc6Ci0KLSAgICBteXByb2dyYW0gLWFkbGluZXMgaW5maWxlIC1iIG91dGZpbGUgLWYgZm9ybWF0Ci0KLWNhbiBiZSBtYWRlIHRvIGJlIGEgdmFsaWQgZm9ybSBvZiB0aGUgYWJvdmUgY29tbWFuZCBsaW5lLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBnZXRjbWRvcHQoCi0gICAgaW50IGFyZ2MsCi0gICAgY2hhciAqKmFyZ3YsCi0gICAgY2hhciAqZm9ybWF0LAotICAgIGNoYXIgKiphcmd1bWVudCkKLXsKLSAgICBjaGFyICAgIGNoOwotICAgIGNoYXIgICAgKmZvcm1hdGNoYXI7Ci0KLSAgICBpZiAoYXJnYyA+IG5leHRhcmd2KSB7Ci0JaWYgKG5leHRjaGFyID09IE5VTEwpIHsKLQkgICAgbmV4dGNoYXIgPSBhcmd2W25leHRhcmd2XTsgICAgICAvKiBJbmRleCBuZXh0IGFyZ3VtZW50ICAgICAgKi8KLQkgICAgaWYgKG5leHRjaGFyID09IE5VTEwpIHsKLQkJbmV4dGFyZ3YrKzsKLQkJcmV0dXJuIEFMTERPTkU7ICAgICAgICAgICAgIC8qIE5vIG1vcmUgb3B0aW9ucyAgICAgICAgICAqLwotCQl9Ci0JICAgIGlmIChJU19OT1RfU1dJVENIX0NIQVIoKm5leHRjaGFyKSkgewotCQluZXh0Y2hhciA9IE5VTEw7Ci0JCXJldHVybiBQQVJBTUVURVI7ICAgICAgICAgICAvKiBXZSBoYXZlIGEgcGFyYW1ldGVyICAgICAgKi8KLQkJfQotCSAgICBuZXh0Y2hhcisrOyAgICAgICAgICAgICAgICAgICAgIC8qIE1vdmUgcGFzdCBzd2l0Y2ggb3BlcmF0b3IgKi8KLQkgICAgaWYgKElTX1NXSVRDSF9DSEFSKCpuZXh0Y2hhcikpIHsKLQkJbmV4dGNoYXIgPSBOVUxMOwotCQlyZXR1cm4gSU5WQUxJRDsgICAgICAgICAgICAgLyogSWdub3JlIHJlc3Qgb2YgbGluZSAgICAgICovCi0JCX0KLQkgICAgfQotCWlmICgoY2ggPSAqKG5leHRjaGFyKyspKSA9PSAwKSB7Ci0JICAgIG5leHRjaGFyID0gTlVMTDsKLQkgICAgcmV0dXJuIElOVkFMSUQ7ICAgICAgICAgICAgICAgICAvKiBObyBvcHRpb25zIG9uIGxpbmUgICAgICAgKi8KLQkgICAgfQotCi0JaWYgKGNoID09ICc6JyB8fCAgKGZvcm1hdGNoYXIgPSBzdHJjaHIoZm9ybWF0LCBjaCkpID09IE5VTEwpCi0JICAgIHJldHVybiBJTlZBTElEOwotCi0JaWYgKCooKytmb3JtYXRjaGFyKSA9PSAnOicpIHsgICAvKiBFeHBlY3QgYW4gYXJndW1lbnQgYWZ0ZXIgb3B0aW9uICovCi0JICAgIG5leHRhcmd2Kys7Ci0JICAgIGlmICgqbmV4dGNoYXIgPT0gMCkgewotCQlpZiAoYXJnYyA8PSBuZXh0YXJndikKLQkJICAgIHJldHVybiBJTlZBTElEOwotCQluZXh0Y2hhciA9IGFyZ3ZbbmV4dGFyZ3YrK107Ci0JCX0KLQkgICAgKmFyZ3VtZW50ID0gbmV4dGNoYXI7Ci0JICAgIG5leHRjaGFyID0gTlVMTDsKLQkgICAgfQotCWVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiBXZSBoYXZlIGEgc3dpdGNoIHN0eWxlIG9wdGlvbiAgICAqLwotCSAgICBpZiAoKm5leHRjaGFyID09IDApIHsKLQkJbmV4dGFyZ3YrKzsKLQkJbmV4dGNoYXIgPSBOVUxMOwotCQl9Ci0JICAgICphcmd1bWVudCA9IE5VTEw7Ci0JICAgIH0KLQlyZXR1cm4gY2g7ICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIHRoZSBvcHRpb24gc3BlY2lmaWVyICAgICAgKi8KLQl9Ci0gICAgbmV4dGNoYXIgPSBOVUxMOwotICAgIG5leHRhcmd2Kys7Ci0gICAgcmV0dXJuIEFMTERPTkU7ICAgICAgICAgICAgICAgICAvKiBubyBhcmd1bWVudHMgb24gY29tbWFuZCBsaW5lICAgICAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW9wdGFyciAgICAgIC0gRGVzY3JpcHRpb24gZm9yIHRoZSBvcHRpb24gd2UgYXJlIHBhcnNpbmcKLWFyZ3VtZW50ICAgIC0gU3RyaW5nIHRvIHBhcnNlCi0KLVJFVFVSTlM6Ci1JTlZBTElEIG9uIGVycm9yLCBBTExET05FIG9uIHN1Y2Nlc3MuCi0KLVJFTUFSS1M6Ci1QYXJzZXMgdGhlIGFyZ3VtZW50IHN0cmluZyBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgYXJndW1lbnQgdGhhdCBpcwotZXhwZWN0ZWQsIGZpbGxpbmcgaW4gdGhlIGFyZ3VtZW50IGZvciB0aGF0IG9wdGlvbi4gTm90ZSB0aGF0IHRvIHBhcnNlIGEKLXN0cmluZywgd2Ugc2ltcGx5IHJldHVybiBhIHBvaW50ZXIgdG8gYXJndW1lbnQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBwYXJzZV9vcHRpb24oCi0gICAgT3B0aW9uICpvcHRhcnIsCi0gICAgY2hhciAqYXJndW1lbnQpCi17Ci0gICAgaW50ICAgICBudW1fcmVhZDsKLQotICAgIHN3aXRjaCAoKGludCkob3B0YXJyLT50eXBlKSkgewotCWNhc2UgT1BUX0lOVEVHRVI6Ci0JICAgIG51bV9yZWFkID0gc3NjYW5mKGFyZ3VtZW50LCIlZCIsKGludCopb3B0YXJyLT5hcmcpOwotCSAgICBicmVhazsKLQljYXNlIE9QVF9IRVg6Ci0JICAgIG51bV9yZWFkID0gc3NjYW5mKGFyZ3VtZW50LCIleCIsKGludCopb3B0YXJyLT5hcmcpOwotCSAgICBicmVhazsKLQljYXNlIE9QVF9PQ1RBTDoKLQkgICAgbnVtX3JlYWQgPSBzc2NhbmYoYXJndW1lbnQsIiVvIiwoaW50KilvcHRhcnItPmFyZyk7Ci0JICAgIGJyZWFrOwotCWNhc2UgT1BUX1VOU0lHTkVEOgotCSAgICBudW1fcmVhZCA9IHNzY2FuZihhcmd1bWVudCwiJXUiLCh1aW50KilvcHRhcnItPmFyZyk7Ci0JICAgIGJyZWFrOwotCWNhc2UgT1BUX0xJTlRFR0VSOgotCSAgICBudW1fcmVhZCA9IHNzY2FuZihhcmd1bWVudCwiJWxkIiwobG9uZyopb3B0YXJyLT5hcmcpOwotCSAgICBicmVhazsKLQljYXNlIE9QVF9MSEVYOgotCSAgICBudW1fcmVhZCA9IHNzY2FuZihhcmd1bWVudCwiJWx4IiwobG9uZyopb3B0YXJyLT5hcmcpOwotCSAgICBicmVhazsKLQljYXNlIE9QVF9MT0NUQUw6Ci0JICAgIG51bV9yZWFkID0gc3NjYW5mKGFyZ3VtZW50LCIlbG8iLChsb25nKilvcHRhcnItPmFyZyk7Ci0JICAgIGJyZWFrOwotCWNhc2UgT1BUX0xVTlNJR05FRDoKLQkgICAgbnVtX3JlYWQgPSBzc2NhbmYoYXJndW1lbnQsIiVsdSIsKHVsb25nKilvcHRhcnItPmFyZyk7Ci0JICAgIGJyZWFrOwotCWNhc2UgT1BUX0ZMT0FUOgotCSAgICBudW1fcmVhZCA9IHNzY2FuZihhcmd1bWVudCwiJWYiLChmbG9hdCopb3B0YXJyLT5hcmcpOwotCSAgICBicmVhazsKLQljYXNlIE9QVF9ET1VCTEU6Ci0JICAgIG51bV9yZWFkID0gc3NjYW5mKGFyZ3VtZW50LCIlbGYiLChkb3VibGUqKW9wdGFyci0+YXJnKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBPUFRfTERPVUJMRToKLQkgICAgbnVtX3JlYWQgPSBzc2NhbmYoYXJndW1lbnQsIiVMZiIsKGxvbmcgZG91YmxlKilvcHRhcnItPmFyZyk7Ci0JICAgIGJyZWFrOwotCWNhc2UgT1BUX1NUUklORzoKLQkgICAgbnVtX3JlYWQgPSAxOyAgICAgICAgICAgLyogVGhpcyBhbHdheXMgd29ya3MgICAgKi8KLQkgICAgKigoY2hhcioqKW9wdGFyci0+YXJnKSA9IGFyZ3VtZW50OwotCSAgICBicmVhazsKLQlkZWZhdWx0OgotCSAgICByZXR1cm4gSU5WQUxJRDsKLQl9Ci0KLSAgICBpZiAobnVtX3JlYWQgPT0gMCkKLQlyZXR1cm4gSU5WQUxJRDsKLSAgICBlbHNlCi0JcmV0dXJuIEFMTERPTkU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1IRUFERVI6Ci1jbWRsaW5lLmgKLQotUEFSQU1FVEVSUzoKLWFyZ2MgICAgICAgIC0gTnVtYmVyIG9mIGFyZ3VtZW50cyBvbiBjb21tYW5kIGxpbmUKLWFyZ3YgICAgICAgIC0gQXJyYXkgb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cwotbnVtX29wdCAgICAgLSBOdW1iZXIgb2Ygb3B0aW9ucyBpbiBvcHRpb24gYXJyYXkKLW9wdGFyciAgICAgIC0gQXJyYXkgdG8gc3BlY2lmeSBob3cgdG8gcGFyc2UgdGhlIGNvbW1hbmQgbGluZQotZG9fcGFyYW0gICAgLSBSb3V0aW5lIHRvIGhhbmRsZSBhIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIKLQotUkVUVVJOUzoKLUFMTERPTkUsIElOVkFMSUQgb3IgSEVMUAotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gcGFyc2UgdGhlIGNvbW1hbmQgbGluZSBhY2NvcmRpbmcgdG8gYSB0YWJsZSBvZiBvcHRpb25zLiBUaGlzCi1yb3V0aW5lIGNhbGxzIGdldGNtZG9wdCBhYm92ZSB0byBwYXJzZSBlYWNoIGluZGl2aWR1YWwgb3B0aW9uIGFuZCBhdHRlbXB0cwotdG8gcGFyc2UgZWFjaCBvcHRpb24gaW50byBhIHZhcmlhYmxlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4gVGhlIHJvdXRpbmUKLWNhbiBwYXJzZSBpbnRlZ2VycyBhbmQgbG9uZyBpbnRlZ2VycyBpbiBlaXRoZXIgZGVjaW1hbCwgb2N0YWwsIGhleGFkZWNpbWFsCi1ub3RhdGlvbiwgdW5zaWduZWQgaW50ZWdlcnMgYW5kIHVuc2lnbmVkIGxvbmdzLCBzdHJpbmdzIGFuZCBvcHRpb24gc3dpdGNoZXMuCi1PcHRpb24gc3dpdGNoZXMgYXJlIHNpbXBseSBib29sZWFuIHZhcmlhYmxlcyB0aGF0IGdldCB0dXJuZWQgb24gaWYgdGhlCi1zd2l0Y2ggd2FzIHBhcnNlZC4KLQotUGFyYW1ldGVycyBhcmUgZXh0cmFjdGVkIGZyb20gdGhlIGNvbW1hbmQgbGluZSBieSBjYWxsaW5nIGEgdXNlciBzdXBwbGllZAotcm91dGluZSBkb19wYXJhbSgpIHRvIGhhbmRsZSBlYWNoIHBhcmFtZXRlciBhcyBpdCBpcyBlbmNvdW50ZXJlZC4gVGhlCi1yb3V0aW5lIGRvX3BhcmFtKCkgc2hvdWxkIGFjY2VwdCBhIHBvaW50ZXIgdG8gdGhlIHBhcmFtZXRlciBvbiB0aGUgY29tbWFuZAotbGluZSBhbmQgYW4gaW50ZWdlciByZXByZXNlbnRpbmcgaG93IG1hbnkgcGFyYW1ldGVycyBoYXZlIGJlZW4gZW5jb3VudGVyZWQKLShpZTogMSBpZiB0aGlzIGlzIHRoZSBmaXJzdCBwYXJhbWV0ZXIsIDEwIGlmIGl0IGlzIHRoZSAxMHRoIGV0YyksIGFuZCByZXR1cm4KLUFMTERPTkUgdXBvbiBzdWNjZXNzZnVsbHkgcGFyc2luZyBpdCBvciBJTlZBTElEIGlmIHRoZSBwYXJhbWV0ZXIgd2FzIGludmFsaWQuCi0KLVdlIHJldHVybiBlaXRoZXIgQUxMRE9ORSBpZiBhbGwgdGhlIG9wdGlvbnMgd2VyZSBzdWNjZXNzZnVsbHkgcGFyc2VkLAotSU5WQUxJRCBpZiBhbiBpbnZhbGlkIG9wdGlvbiB3YXMgZW5jb3VudGVyZWQgb3IgSEVMUCBpZiBhbnkgb2YgLWgsIC1IIG9yCi0tPyB3ZXJlIHByZXNlbnQgb24gdGhlIGNvbW1hbmQgbGluZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgZ2V0YXJncygKLSAgICBpbnQgYXJnYywKLSAgICBjaGFyICphcmd2W10sCi0gICAgaW50IG51bV9vcHQsCi0gICAgT3B0aW9uIG9wdGFycltdLAotICAgIGludCAoKmRvX3BhcmFtKSgKLQljaGFyICpwYXJhbSwKLQlpbnQgbnVtKSkKLXsKLSAgICBpbnQgICAgIGksb3B0OwotICAgIGNoYXIgICAgKmFyZ3VtZW50OwotICAgIGludCAgICAgcGFyYW1fbnVtID0gMTsKLSAgICBjaGFyICAgIGNtZHN0cltNQVhBUkcqMiArIDRdOwotCi0gICAgLyogQnVpbGQgdGhlIGNvbW1hbmQgc3RyaW5nIGZyb20gdGhlIGFycmF5IG9mIG9wdGlvbnMgICAqLwotCi0gICAgc3RyY3B5KGNtZHN0ciwiaEg/Iik7Ci0gICAgZm9yIChpID0gMCxvcHQgPSAzOyBpIDwgbnVtX29wdDsgaSsrLG9wdCsrKSB7Ci0JY21kc3RyW29wdF0gPSBvcHRhcnJbaV0ub3B0OwotCWlmIChvcHRhcnJbaV0udHlwZSAhPSBPUFRfU1dJVENIKSB7Ci0JICAgIGNtZHN0clsrK29wdF0gPSAnOic7Ci0JICAgIH0KLQl9Ci0gICAgY21kc3RyW29wdF0gPSAnXDAnOwotCi0gICAgZm9yICg7OykgewotCW9wdCA9IGdldGNtZG9wdChhcmdjLGFyZ3YsY21kc3RyLCZhcmd1bWVudCk7Ci0Jc3dpdGNoIChvcHQpIHsKLQkgICAgY2FzZSAnSCc6Ci0JICAgIGNhc2UgJ2gnOgotCSAgICBjYXNlICc/JzoKLQkJcmV0dXJuIEhFTFA7Ci0JICAgIGNhc2UgQUxMRE9ORToKLQkJcmV0dXJuIEFMTERPTkU7Ci0JICAgIGNhc2UgSU5WQUxJRDoKLQkJcmV0dXJuIElOVkFMSUQ7Ci0JICAgIGNhc2UgUEFSQU1FVEVSOgotCQlpZiAoZG9fcGFyYW0gPT0gTlVMTCkKLQkJICAgIHJldHVybiBJTlZBTElEOwotCQlpZiAoZG9fcGFyYW0oYXJndltuZXh0YXJndl0scGFyYW1fbnVtKSA9PSBJTlZBTElEKQotCQkgICAgcmV0dXJuIElOVkFMSUQ7Ci0JCW5leHRhcmd2Kys7Ci0JCXBhcmFtX251bSsrOwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQotCQkvKiBTZWFyY2ggZm9yIHRoZSBvcHRpb24gaW4gdGhlIG9wdGlvbiBhcnJheS4gV2UgYXJlCi0JCSAqIGd1YXJhbnRlZWQgdG8gZmluZCBpdC4KLQkJICovCi0KLQkJZm9yIChpID0gMDsgaSA8IG51bV9vcHQ7IGkrKykgewotCQkgICAgaWYgKG9wdGFycltpXS5vcHQgPT0gb3B0KQotCQkJYnJlYWs7Ci0JCSAgICB9Ci0JCWlmIChvcHRhcnJbaV0udHlwZSA9PSBPUFRfU1dJVENIKQotCQkgICAgKigoaWJvb2wqKW9wdGFycltpXS5hcmcpID0gdHJ1ZTsKLQkJZWxzZSB7Ci0JCSAgICBpZiAocGFyc2Vfb3B0aW9uKCZvcHRhcnJbaV0sYXJndW1lbnQpID09IElOVkFMSUQpCi0JCQlyZXR1cm4gSU5WQUxJRDsKLQkJICAgIH0KLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1IRUFERVI6Ci1jbWRsaW5lLmgKLQotUEFSQU1FVEVSUzoKLW51bV9vcHQgLSBOdW1iZXIgb2Ygb3B0aW9ucyBpbiB0aGUgdGFibGUKLW9wdGFyciAgLSBUYWJsZSBvZiBvcHRpb24gZGVzY3JpcHRpb25zCi0KLVJFTUFSS1M6Ci1QcmludHMgdGhlIGRlc2NyaXB0aW9uIG9mIGVhY2ggb3B0aW9uIGluIGEgc3RhbmRhcmQgZm9ybWF0IHRvIHRoZSBzdGFuZGFyZAotb3V0cHV0IGRldmljZS4gVGhlIGRlc2NyaXB0aW9uIGZvciBlYWNoIG9wdGlvbiBpcyBvYnRhaW5lZCBmcm9tIHRoZSB0YWJsZQotb2Ygb3B0aW9ucy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHByaW50X2Rlc2MoCi0gICAgaW50IG51bV9vcHQsCi0gICAgT3B0aW9uIG9wdGFycltdKQotewotICAgIGludCAgICAgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBudW1fb3B0OyBpKyspIHsKLQlpZiAob3B0YXJyW2ldLnR5cGUgPT0gT1BUX1NXSVRDSCkKLQkgICAgcHJpbnRmKCIgIC0lYyAgICAgICAlc1xuIixvcHRhcnJbaV0ub3B0LG9wdGFycltpXS5kZXNjKTsKLQllbHNlCi0JICAgIHByaW50ZigiICAtJWM8YXJnPiAgJXNcbiIsb3B0YXJyW2ldLm9wdCxvcHRhcnJbaV0uZGVzYyk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotSEVBREVSOgotY21kbGluZS5oCi0KLVBBUkFNRVRFUlM6Ci1tb2R1bGVOYW1lICAtIE1vZHVsZSBuYW1lIGZvciBwcm9ncmFtCi1jbWRMaW5lICAgICAtIENvbW1hbmQgbGluZSB0byBwYXJzZQotcGFyZ2MgICAgICAgLSBQb2ludGVyIHRvICdhcmdjJyBwYXJhbWV0ZXIKLXBhcmd2ICAgICAgIC0gUG9pbnRlciB0byAnYXJndicgcGFyYW1ldGVyCi1tYXhBcmdjICAgICAtIE1heGltdW0gYXJndiBhcnJheSBpbmRleAotCi1SRU1BUktTOgotUGFyc2VzIGEgY29tbWFuZCBsaW5lIGZyb20gYSBzaW5nbGUgc3RyaW5nIGludG8gdGhlIEMgc3R5bGUgJ2FyZ2MnIGFuZAotJ2FyZ3YnIGZvcm1hdC4gTW9zdCB1c2VmdWwgZm9yIFdpbmRvd3MgcHJvZ3JhbXMgd2hlcmUgdGhlIGNvbW1hbmQgbGluZQotaXMgcGFzc2VkIGluIHZlcmJhdGltLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBwYXJzZV9jb21tYW5kbGluZSgKLSAgICBjaGFyICptb2R1bGVOYW1lLAotICAgIGNoYXIgKmNtZExpbmUsCi0gICAgaW50ICpwYXJnYywKLSAgICBjaGFyICphcmd2W10sCi0gICAgaW50IG1heEFyZ3YpCi17Ci0gICAgc3RhdGljIGNoYXIgc3RyWzUxMl07Ci0gICAgc3RhdGljIGNoYXIgZmlsZW5hbWVbMjYwXTsKLSAgICBjaGFyICAgICAgICAqcHJldldvcmQgPSBOVUxMOwotICAgIGlib29sICAgICAgICBpblF1b3RlID0gRkFMU0U7Ci0gICAgaWJvb2wgICAgICAgIG5vU3RyaXAgPSBGQUxTRTsKLSAgICBpbnQgICAgICAgICBhcmdjOwotCi0gICAgYXJnYyA9IDA7Ci0gICAgc3RyY3B5KGZpbGVuYW1lLG1vZHVsZU5hbWUpOwotICAgIGFyZ3ZbYXJnYysrXSA9IGZpbGVuYW1lOwotICAgIGNtZExpbmUgPSBzdHJuY3B5KHN0ciwgY21kTGluZSwgc2l6ZW9mKHN0ciktMSk7Ci0gICAgd2hpbGUgKCpjbWRMaW5lKSB7Ci0Jc3dpdGNoICgqY21kTGluZSkgewotCSAgICBjYXNlICciJyA6Ci0JCWlmIChwcmV2V29yZCAhPSBOVUxMKSB7Ci0JCSAgICBpZiAoaW5RdW90ZSkgewotCQkJaWYgKCFub1N0cmlwKQotCQkJICAgICpjbWRMaW5lID0gJ1wwJzsKLQkJCWFyZ3YgW2FyZ2MrK10gPSBwcmV2V29yZDsKLQkJCXByZXZXb3JkID0gTlVMTDsKLQkJCX0KLQkJICAgIGVsc2UKLQkJCW5vU3RyaXAgPSBUUlVFOwotCQkgICAgfQotCQlpblF1b3RlID0gIWluUXVvdGU7Ci0JCWJyZWFrOwotCSAgICBjYXNlICcgJyA6Ci0JICAgIGNhc2UgJ1x0JyA6Ci0JCWlmICghaW5RdW90ZSkgewotCQkgICAgaWYgKHByZXZXb3JkICE9IE5VTEwpIHsKLQkJCSpjbWRMaW5lID0gJ1wwJzsKLQkJCWFyZ3YgW2FyZ2MrK10gPSBwcmV2V29yZDsKLQkJCXByZXZXb3JkID0gTlVMTDsKLQkJCW5vU3RyaXAgPSBGQUxTRTsKLQkJCX0KLQkJICAgIH0KLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQgOgotCQlpZiAocHJldldvcmQgPT0gTlVMTCkKLQkJICAgIHByZXZXb3JkID0gY21kTGluZTsKLQkJYnJlYWs7Ci0JCX0KLQlpZiAoYXJnYyA+PSBtYXhBcmd2IC0gMSkKLQkgICAgYnJlYWs7Ci0JY21kTGluZSsrOwotCX0KLQotICAgIGlmICgocHJldldvcmQgIT0gTlVMTCB8fCAoaW5RdW90ZSAmJiBwcmV2V29yZCAhPSBOVUxMKSkgJiYgYXJnYyA8IG1heEFyZ3YgLSAxKSB7Ci0JKmNtZExpbmUgPSAnXDAnOwotCWFyZ3YgW2FyZ2MrK10gPSBwcmV2V29yZDsKLQl9Ci0gICAgYXJndlthcmdjXSA9IE5VTEw7Ci0KLSAgICAvKiBSZXR1cm4gdXBkYXRlZCBwYXJhbWV0ZXJzICovCi0gICAgcmV0dXJuICgqcGFyZ2MgPSBhcmdjKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYWJlb3MuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYWJlb3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkzNGJkMS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FiZW9zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKLSogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKLSogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKLSogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKLSogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKLSogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKLSogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKLSogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKLSogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBMaW51eAotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlIHNlcnZpY2VzIGZvcgotKiAgICAgICAgICAgICAgIHRoZSBMaW51eCBvcGVyYXRpbmcgc3lzdGVtLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm51Y2xldXMvZ3JhcGhpY3MuaCIKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotCi1zdGF0aWMgaWJvb2wgICAgICAgICAgICBoYXZlUkRUU0M7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcGF0aCAgICAtIExvY2FsIHBhdGggdG8gdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtIHRvIG92ZXJyaWRlIHRoZSBsb2NhdGlvbgotb2YgdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzIHRoYXQgYXJlIGxvYWRlZC4gTm9ybWFsbHkgdGhlIGxvYWRlciBjb2RlCi13aWxsIGxvb2sgaW4gdGhlIHN5c3RlbSBOdWNsZXVzIGRpcmVjdG9yaWVzIGZpcnN0LCB0aGVuIGluIHRoZSAnZHJpdmVycycKLWRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIGZpbmFsbHkgcmVsYXRpdmUKLXRvIHRoZSBNR0xfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgR0Ffc2V0TG9jYWxQYXRoKAotICAgIGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gICAgUE1fc2V0TG9jYWxCUERQYXRoKHBhdGgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVUVVJOUzoKLVBvaW50ZXIgdG8gdGhlIHN5c3RlbSB3aWRlIFBNIGxpYnJhcnkgaW1wb3J0cywgb3IgdGhlIGludGVybmFsIHZlcnNpb24gaWYgbm9uZQotCi1SRU1BUktTOgotSW4gb3JkZXIgdG8gc3VwcG9ydCBkZXBsb3lpbmcgbmV3IE51Y2xldXMgZHJpdmVycyB0aGF0IG1heSByZXF1aXJlIHVwZGF0ZWQKLVBNIGxpYnJhcnkgZnVuY3Rpb25zLCB3ZSBjaGVjayBoZXJlIHRvIHNlZSBpZiB0aGVyZSBpcyBhIHN5c3RlbSB3aWRlIHZlcnNpb24KLW9mIHRoZSBQTSBmdW5jdGlvbnMgYXZhaWxhYmxlLiBJZiBzbyB3ZSByZXR1cm4gdGhvc2UgZnVuY3Rpb25zIGZvciB1c2Ugd2l0aAotdGhlIHN5c3RlbSB3aWRlIE51Y2xldXMgZHJpdmVycywgb3RoZXJ3aXNlIHRoZSBjb21waWxlZCBpbiB2ZXJzaW9uIG9mIHRoZSBQTQotbGlicmFyeSBpcyB1c2VkIHdpdGggdGhlIGFwcGxpY2F0aW9uIGxvY2FsIHZlcnNpb24gb2YgTnVjbGV1cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1QTV9pbXBvcnRzICogTkFQSSBHQV9nZXRTeXN0ZW1QTUltcG9ydHModm9pZCkKLXsKLSAgICAvKiBUT0RPOiBXZSBtYXkgdmVyeSB3ZWxsIHdhbnQgdG8gcHJvdmlkZSBhIHN5c3RlbSBzaGFyZWQgbGlicmFyeSAqLwotICAgIC8qICAgICAgIHRoYXQgZXBvcnRzIHRoZSBQTSBmdW5jdGlvbnMgcmVxdWlyZWQgYnkgdGhlIE51Y2xldXMgbGlicmFyeSAqLwotICAgIC8qICAgICAgIGZvciBCZU9TIGhlcmUuIFRoYXQgd2lsbCBlbGltaW5hdGUgZmF0YWwgZXJyb3JzIGxvYWRpbmcgbmV3ICovCi0gICAgLyogICAgICAgZHJpdmVycyBvbiBCZU9TISAqLwotICAgIHJldHVybiAmX1BNX2ltcG9ydHM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfZ2V0U2hhcmVkRXhwb3J0cygKLSAgICBHQV9leHBvcnRzICpnYUV4cCwKLSAgICBpYm9vbCBzaGFyZWQpCi17Ci0gICAgKHZvaWQpZ2FFeHA7Ci0gICAgKHZvaWQpc2hhcmVkOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotI2lmbmRlZiBURVNUX0hBUk5FU1MKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9xdWVyeUZ1bmN0aW9ucygKLSAgICBHQV9kZXZDdHggKmRjLAotICAgIE5fdWludDMyIGlkLAotICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQotewotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfcXVlcnlGdW5jdGlvbnMoZGMsaWQsZnVuY3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgUkVGMkRfcXVlcnlGdW5jdGlvbnMoCi0gICAgUkVGMkRfZHJpdmVyICpyZWYyZCwKLSAgICBOX3VpbnQzMiBpZCwKLSAgICB2b2lkIF9GQVJfICpmdW5jcykKLXsKLSAgICByZXR1cm4gX19HQV9leHBvcnRzLlJFRjJEX3F1ZXJ5RnVuY3Rpb25zKHJlZjJkLGlkLGZ1bmNzKTsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWluZyBmdW5jdGlvbnMgZm9yIHRoZQotTnVjbGV1cyBsb2FkZXIgbGlicmFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX1RpbWVySW5pdCh2b2lkKQotewotICAgIGlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKQotCWhhdmVSRFRTQyA9IHRydWU7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTkFQSSBHQV9UaW1lclJlYWQoCi0gICAgR0FfbGFyZ2VJbnRlZ2VyICp2YWx1ZSkKLXsKLSAgICBpZiAoaGF2ZVJEVFNDKQotCV9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKLSAgICBlbHNlIHsKLQlzdHJ1Y3QgdGltZXZhbCB0OwotCWdldHRpbWVvZmRheSgmdCwgTlVMTCk7Ci0JdmFsdWUtPmxvdyA9IHQudHZfc2VjKjEwMDAwMDAgKyB0LnR2X3VzZWM7Ci0JdmFsdWUtPmhpZ2ggPSAwOwotCX0KLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYWRvcy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhZG9zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYmU3NzYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhZG9zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKLSogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKLSogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKLSogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKLSogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKLSogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKLSogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKLSogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKLSogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBNU0RPUwotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlIHNlcnZpY2VzIGZvcgotKiAgICAgICAgICAgICAgIHRoZSBNU0RPUyBvcGVyYXRpbmcgc3lzdGVtLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtX2hlbHAuaCIKLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcGF0aCAgICAtIExvY2FsIHBhdGggdG8gdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtIHRvIG92ZXJyaWRlIHRoZSBsb2NhdGlvbgotb2YgdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzIHRoYXQgYXJlIGxvYWRlZC4gTm9ybWFsbHkgdGhlIGxvYWRlciBjb2RlCi13aWxsIGxvb2sgaW4gdGhlIHN5c3RlbSBOdWNsZXVzIGRpcmVjdG9yaWVzIGZpcnN0LCB0aGVuIGluIHRoZSAnZHJpdmVycycKLWRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIGZpbmFsbHkgcmVsYXRpdmUKLXRvIHRoZSBNR0xfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgR0Ffc2V0TG9jYWxQYXRoKAotICAgIGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gICAgUE1fc2V0TG9jYWxCUERQYXRoKHBhdGgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVUVVJOUzoKLVBvaW50ZXIgdG8gdGhlIHN5c3RlbSB3aWRlIFBNIGxpYnJhcnkgaW1wb3J0cywgb3IgdGhlIGludGVybmFsIHZlcnNpb24gaWYgbm9uZQotCi1SRU1BUktTOgotTm90aGluZyB0byBkbyBoZXJlIGZvciBET1MuIEJhc2ljYWxseSBzaW5jZSBET1MgaGFzIG5vIHN5c3RlbSB3aWRlIHNoYXJlZAotbGlicmFyeSBtZWNoYW5pc20gd2UgYXJlIGVzc2VudGlhbGx5IHNjcmV3ZWQgaWYgdGhlIGJpbmFyeSBBUEkgY2hhbmdlcy4KLUJ5IGRlZmF1bHQgZm9yIDMyLWJpdCBET1MgYXBwcyB0aGUgbG9jYWwgTnVjbGV1cyBkcml2ZXJzIHNob3VsZCBhbHdheXMgYmUKLXVzZWQgaW4gcHJlZmVyZW5jZSB0byB0aGUgc3lzdGVtIHdpZGUgTnVjbGV1cyBkcml2ZXJzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVBNX2ltcG9ydHMgKiBOQVBJIEdBX2dldFN5c3RlbVBNSW1wb3J0cyh2b2lkKQotewotICAgIHJldHVybiAmX1BNX2ltcG9ydHM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfZ2V0U2hhcmVkRXhwb3J0cygKLSAgICBHQV9leHBvcnRzICpnYUV4cCwKLSAgICBpYm9vbCBzaGFyZWQpCi17Ci0gICAgKHZvaWQpZ2FFeHA7Ci0gICAgKHZvaWQpc2hhcmVkOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotI2lmICFkZWZpbmVkKFRFU1RfSEFSTkVTUykgJiYgIWRlZmluZWQoVkJFVEVTVCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9xdWVyeUZ1bmN0aW9ucygKLSAgICBHQV9kZXZDdHggKmRjLAotICAgIE5fdWludDMyIGlkLAotICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQotewotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfcXVlcnlGdW5jdGlvbnMoZGMsaWQsZnVuY3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgUkVGMkRfcXVlcnlGdW5jdGlvbnMoCi0gICAgUkVGMkRfZHJpdmVyICpyZWYyZCwKLSAgICBOX3VpbnQzMiBpZCwKLSAgICB2b2lkIF9GQVJfICpmdW5jcykKLXsKLSAgICByZXR1cm4gX19HQV9leHBvcnRzLlJFRjJEX3F1ZXJ5RnVuY3Rpb25zKHJlZjJkLGlkLGZ1bmNzKTsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWluZyBmdW5jdGlvbnMgZm9yIHRoZSBET1MKLU51Y2xldXMgbG9hZGVyIGxpYnJhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9UaW1lckluaXQodm9pZCkKLXsKLSAgICBpZiAoX0dBX2hhdmVDUFVJRCgpICYmIChfR0FfZ2V0Q1BVSURGZWF0dXJlcygpICYgQ1BVX0hhdmVSRFRTQykgIT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTkFQSSBHQV9UaW1lclJlYWQoCi0gICAgR0FfbGFyZ2VJbnRlZ2VyICp2YWx1ZSkKLXsKLSAgICBfR0FfcmVhZFRpbWVTdGFtcCh2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FsaWIuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYWxpYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmVhY2MzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYWxpYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8Ci0qICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Ci0qICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Ci0qICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci0qICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8Ci0qICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8Ci0qICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Ci0qICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci0qICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55IDMyLWJpdCBwcm90ZWN0ZWQgbW9kZSBlbnZpcm9ubWVudAotKgotKiBEZXNjcmlwdGlvbjogIEMgbW9kdWxlIGZvciB0aGUgR3JhcGhpY3MgQWNjZWxlcmF0b3IgRHJpdmVyIEFQSS4gVXNlcwotKiAgICAgICAgICAgICAgIHRoZSBTY2lUZWNoIFBNIGxpYnJhcnkgZm9yIGludGVyZmFjaW5nIHdpdGggRE9TCi0qICAgICAgICAgICAgICAgZXh0ZW5kZXIgc3BlY2lmaWMgZnVuY3Rpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm51Y2xldXMvZ3JhcGhpY3MuaCIKLSNpZiBkZWZpbmVkKF9fV0lOMzJfVlhEX18pIHx8IGRlZmluZWQoX19OVF9EUklWRVJfXykKLSNpbmNsdWRlICJzZGQvc2RkaGVscC5oIgotI2Vsc2UKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgVEVTVF9IQVJORVNTCi1HQV9leHBvcnRzICBfVkFSQVBJIF9fR0FfZXhwb3J0czsKLXN0YXRpYyBpbnQgICAgICAgICAgbG9hZGVkID0gZmFsc2U7Ci1zdGF0aWMgUEVfTU9EVUxFICAgICpoTW9kQlBEID0gTlVMTDsKLQotc3RhdGljIE5faW1wb3J0cyBfTl9pbXBvcnRzID0gewotICAgIHNpemVvZihOX2ltcG9ydHMpLAotICAgIF9PU19kZWxheSwKLSAgICB9OwotCi1zdGF0aWMgR0FfaW1wb3J0cyBfR0FfaW1wb3J0cyA9IHsKLSAgICBzaXplb2YoR0FfaW1wb3J0cyksCi0gICAgR0FfZ2V0U2hhcmVkSW5mbywKLSAgICBHQV9UaW1lckluaXQsCi0gICAgR0FfVGltZXJSZWFkLAotICAgIEdBX1RpbWVyRGlmZmVyZW5jZSwKLSAgICB9OwotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgRExMX05BTUUgICAgICAgICJncmFwaGljcy5icGQiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyBubyBsb25nZXIgdXNlZCBidXQgd2UgbXVzdCBpbXBsZW1lbnQgaXQgYW5kIHJldHVybiBOVUxMCi1mb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIGJpbmFyeSBkcml2ZXJzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUdBX3NoYXJlZEluZm8gKiBOQVBJIEdBX2dldFNoYXJlZEluZm8oCi0gICAgaW50IGRldmljZSkKLXsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotI2lmbmRlZiBURVNUX0hBUk5FU1MKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRmF0YWwgZXJyb3IgaGFuZGxlciBmb3Igbm9uLWV4cG9ydGVkIEdBX2V4cG9ydHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX0dBX2ZhdGFsRXJyb3JIYW5kbGVyKHZvaWQpCi17Ci0gICAgUE1fZmF0YWxFcnJvcigiVW5zdXBwb3J0ZWQgTnVjbGV1cyBleHBvcnQgZnVuY3Rpb24gY2FsbGVkISBQbGVhc2UgdXBncmFkZSB5b3VyIGNvcHkgb2YgTnVjbGV1cyFcbiIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXNoYXJlZCAgLSBUcnVlIHRvIGxvYWQgdGhlIGRyaXZlciBpbnRvIHNoYXJlZCBtZW1vcnkuCi0KLVJFTUFSS1M6Ci1Mb2FkcyB0aGUgTnVjbGV1cyBiaW5hcnkgcG9ydGFibGUgRExMIGludG8gbWVtb3J5IGFuZCBpbml0aWxpc2VzIGl0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpYm9vbCBMb2FkRHJpdmVyKAotICAgIGlib29sIHNoYXJlZCkKLXsKLSAgICBHQV9pbml0TGlicmFyeV90ICAgIEdBX2luaXRMaWJyYXJ5OwotICAgIEdBX2V4cG9ydHMgICAgICAgICAgKmdhRXhwOwotICAgIGNoYXIgICAgICAgICAgICAgICAgZmlsZW5hbWVbUE1fTUFYX1BBVEhdOwotICAgIGNoYXIgICAgICAgICAgICAgICAgYnBkcGF0aFtQTV9NQVhfUEFUSF07Ci0gICAgaW50ICAgICAgICAgICAgICAgICBpLG1heDsKLSAgICB1bG9uZyAgICAgICAgICAgICAgICpwOwotCi0gICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBhbHJlYWR5IGxvYWRlZCB0aGUgZHJpdmVyICovCi0gICAgaWYgKGxvYWRlZCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICBQTV9pbml0KCk7Ci0KLSAgICAvKiBGaXJzdCB0cnkgdG8gc2VlIGlmIHdlIGNhbiBmaW5kIHRoZSBzeXN0ZW0gd2lkZSBzaGFyZWQgZXhwb3J0cwotICAgICAqIGlmIHRoZXkgYXJlIGF2YWlsYWJsZS4gVW5kZXIgT1MvMiB0aGlzIGNvbm5lY3RzIHRvIG91ciBnbG9iYWwKLSAgICAgKiBzaGFyZWQgTnVjbGV1cyBsb2FkZXIgaW4gU0REUE1JLkRMTC4KLSAgICAgKi8KLSAgICBfX0dBX2V4cG9ydHMuZHdTaXplID0gc2l6ZW9mKF9fR0FfZXhwb3J0cyk7Ci0gICAgaWYgKEdBX2dldFNoYXJlZEV4cG9ydHMoJl9fR0FfZXhwb3J0cyxzaGFyZWQpKQotCXJldHVybiBsb2FkZWQgPSB0cnVlOwotCi0gICAgLyogT3BlbiB0aGUgQlBEIGZpbGUgKi8KLSAgICBpZiAoIVBNX2ZpbmRCUEQoRExMX05BTUUsYnBkcGF0aCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIHN0cmNweShmaWxlbmFtZSxicGRwYXRoKTsKLSAgICBzdHJjYXQoZmlsZW5hbWUsRExMX05BTUUpOwotICAgIGlmICgoaE1vZEJQRCA9IFBFX2xvYWRMaWJyYXJ5KGZpbGVuYW1lLHNoYXJlZCkpID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIGlmICgoR0FfaW5pdExpYnJhcnkgPSAoR0FfaW5pdExpYnJhcnlfdClQRV9nZXRQcm9jQWRkcmVzcyhoTW9kQlBELCJfR0FfaW5pdExpYnJhcnkiKSkgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgYnBkcGF0aFtzdHJsZW4oYnBkcGF0aCktMV0gPSAwOwotICAgIGlmIChzdHJjbXAoYnBkcGF0aCxQTV9nZXROdWNsZXVzUGF0aCgpKSA9PSAwKQotCXN0cmNweShicGRwYXRoLFBNX2dldE51Y2xldXNDb25maWdQYXRoKCkpOwotICAgIGVsc2UgewotCVBNX2JhY2tzbGFzaChicGRwYXRoKTsKLQlzdHJjYXQoYnBkcGF0aCwiY29uZmlnIik7Ci0JfQotICAgIGlmICgoZ2FFeHAgPSBHQV9pbml0TGlicmFyeShzaGFyZWQsYnBkcGF0aCxmaWxlbmFtZSxHQV9nZXRTeXN0ZW1QTUltcG9ydHMoKSwmX05faW1wb3J0cywmX0dBX2ltcG9ydHMpKSA9PSBOVUxMKQotCVBNX2ZhdGFsRXJyb3IoIkdBX2luaXRMaWJyYXJ5IGZhaWxlZCFcbiIpOwotCi0gICAgLyogSW5pdGlhbGl6ZSBhbGwgZGVmYXVsdCBpbXBvcnRzIHRvIHBvaW50IHRvIGZhdGFsIGVycm9yIGhhbmRsZXIKLSAgICAgKiBmb3IgdXB3YXJkcyBjb21wYXRpYmlsaXR5LCBhbmQgY29weSB0aGUgZXhwb3J0ZWQgZnVuY3Rpb25zLgotICAgICAqLwotICAgIG1heCA9IHNpemVvZihfX0dBX2V4cG9ydHMpL3NpemVvZihHQV9pbml0TGlicmFyeV90KTsKLSAgICBmb3IgKGkgPSAwLHAgPSAodWxvbmcqKSZfX0dBX2V4cG9ydHM7IGkgPCBtYXg7IGkrKykKLQkqcCsrID0gKHVsb25nKV9HQV9mYXRhbEVycm9ySGFuZGxlcjsKLSAgICBtZW1jcHkoJl9fR0FfZXhwb3J0cyxnYUV4cCxNSU4oc2l6ZW9mKF9fR0FfZXhwb3J0cyksZ2FFeHAtPmR3U2l6ZSkpOwotICAgIGxvYWRlZCA9IHRydWU7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoZSBmb2xsb3dpbmcgYXJlIHN0dWIgZW50cnkgcG9pbnRzIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGNhbGxzIHRvCi0gKiBpbml0aWFsaXNlIHRoZSBOdWNsZXVzIGxvYWRlciBsaWJyYXJ5LCBhbmQgd2UgdXNlIHRoaXMgdG8gbG9hZCBvdXIKLSAqIGRyaXZlciBETEwgZnJvbSBkaXNrIGFuZCBpbml0aWFsaXNlIHRoZSBsaWJyYXJ5IHVzaW5nIGl0LgotICovCi0KLS8qIHtzZWNyZXR9ICovCi1pbnQgTkFQSSBHQV9zdGF0dXModm9pZCkKLXsKLSAgICBpZiAoIWxvYWRlZCkKLQlyZXR1cm4gbkRyaXZlck5vdEZvdW5kOwotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0Ffc3RhdHVzKCk7Ci19Ci0KLS8qIHtzZWNyZXR9ICovCi1jb25zdCBjaGFyICogTkFQSSBHQV9lcnJvck1zZygKLSAgICBOX2ludDMyIHN0YXR1cykKLXsKLSAgICBpZiAoIWxvYWRlZCkKLQlyZXR1cm4gIlVuYWJsZSB0byBsb2FkIE51Y2xldXMgZGV2aWNlIGRyaXZlciEiOwotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfZXJyb3JNc2coc3RhdHVzKTsKLX0KLQotLyoge3NlY3JldH0gKi8KLWludCBOQVBJIEdBX2dldERheXNMZWZ0KE5faW50MzIgc2hhcmVkKQotewotICAgIGlmICghTG9hZERyaXZlcihzaGFyZWQpKQotCXJldHVybiAtMTsKLSAgICByZXR1cm4gX19HQV9leHBvcnRzLkdBX2dldERheXNMZWZ0KHNoYXJlZCk7Ci19Ci0KLS8qIHtzZWNyZXR9ICovCi1pbnQgTkFQSSBHQV9yZWdpc3RlckxpY2Vuc2UodWNoYXIgKmxpY2Vuc2UsTl9pbnQzMiBzaGFyZWQpCi17Ci0gICAgaWYgKCFMb2FkRHJpdmVyKHNoYXJlZCkpCi0JcmV0dXJuIDA7Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9yZWdpc3RlckxpY2Vuc2UobGljZW5zZSxzaGFyZWQpOwotfQotCi0vKiB7c2VjcmV0fSAqLwotaWJvb2wgTkFQSSBHQV9sb2FkSW5HVUkoTl9pbnQzMiBzaGFyZWQpCi17Ci0gICAgaWYgKCFMb2FkRHJpdmVyKHNoYXJlZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfbG9hZEluR1VJKHNoYXJlZCk7Ci19Ci0KLS8qIHtzZWNyZXR9ICovCi1pbnQgTkFQSSBHQV9lbnVtZXJhdGVEZXZpY2VzKE5faW50MzIgc2hhcmVkKQotewotICAgIGlmICghTG9hZERyaXZlcihzaGFyZWQpKQotCXJldHVybiAwOwotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfZW51bWVyYXRlRGV2aWNlcyhzaGFyZWQpOwotfQotCi0vKiB7c2VjcmV0fSAqLwotR0FfZGV2Q3R4ICogTkFQSSBHQV9sb2FkRHJpdmVyKE5faW50MzIgZGV2aWNlSW5kZXgsTl9pbnQzMiBzaGFyZWQpCi17Ci0gICAgaWYgKCFMb2FkRHJpdmVyKHNoYXJlZCkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9sb2FkRHJpdmVyKGRldmljZUluZGV4LHNoYXJlZCk7Ci19Ci0KLS8qIHtzZWNyZXR9ICovCi12b2lkIE5BUEkgR0FfZ2V0R2xvYmFsT3B0aW9ucygKLSAgICBHQV9nbG9iYWxPcHRpb25zICpvcHRpb25zLAotICAgIGlib29sIHNoYXJlZCkKLXsKLSAgICBpZiAoTG9hZERyaXZlcihzaGFyZWQpKQotCV9fR0FfZXhwb3J0cy5HQV9nZXRHbG9iYWxPcHRpb25zKG9wdGlvbnMsc2hhcmVkKTsKLX0KLQotLyoge3NlY3JldH0gKi8KLVBFX01PRFVMRSAqIE5BUEkgR0FfbG9hZExpYnJhcnkoCi0gICAgY29uc3QgY2hhciAqc3pCUEROYW1lLAotICAgIHVsb25nICpzaXplLAotICAgIGlib29sIHNoYXJlZCkKLXsKLSAgICBpZiAoIUxvYWREcml2ZXIoc2hhcmVkKSkKLQlyZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gX19HQV9leHBvcnRzLkdBX2xvYWRMaWJyYXJ5KHN6QlBETmFtZSxzaXplLHNoYXJlZCk7Ci19Ci0KLS8qIHtzZWNyZXR9ICovCi1HQV9kZXZDdHggKiBOQVBJIEdBX2dldEN1cnJlbnREcml2ZXIoCi0gICAgTl9pbnQzMiBkZXZpY2VJbmRleCkKLXsKLSAgICAvKiBCYWlsIGZvciBvbGRlciBkcml2ZXJzIHRoYXQgZGlkbid0IGV4cG9ydCB0aGlzIGZ1bmN0aW9uISAqLwotICAgIGlmICghX19HQV9leHBvcnRzLkdBX2dldEN1cnJlbnREcml2ZXIpCi0JcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9nZXRDdXJyZW50RHJpdmVyKGRldmljZUluZGV4KTsKLX0KLQotLyoge3NlY3JldH0gKi8KLVJFRjJEX2RyaXZlciAqIE5BUEkgR0FfZ2V0Q3VycmVudFJlZjJkKAotICAgIE5faW50MzIgZGV2aWNlSW5kZXgpCi17Ci0gICAgLyogQmFpbCBmb3Igb2xkZXIgZHJpdmVycyB0aGF0IGRpZG4ndCBleHBvcnQgdGhpcyBmdW5jdGlvbiEgKi8KLSAgICBpZiAoIV9fR0FfZXhwb3J0cy5HQV9nZXRDdXJyZW50UmVmMmQpCi0JcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9nZXRDdXJyZW50UmVmMmQoZGV2aWNlSW5kZXgpOwotfQotCi0vKiB7c2VjcmV0fSAqLwotaW50IE5BUEkgR0FfaXNPRU1WZXJzaW9uKGlib29sIHNoYXJlZCkKLXsKLSAgICBpZiAoIUxvYWREcml2ZXIoc2hhcmVkKSkKLQlyZXR1cm4gMDsKLSAgICByZXR1cm4gX19HQV9leHBvcnRzLkdBX2lzT0VNVmVyc2lvbihzaGFyZWQpOwotfQotCi0vKiB7c2VjcmV0fSAqLwotTl91aW50MzIgKiBOQVBJIEdBX2dldExpY2Vuc2VkRGV2aWNlcyhpYm9vbCBzaGFyZWQpCi17Ci0gICAgaWYgKCFMb2FkRHJpdmVyKHNoYXJlZCkpCi0JcmV0dXJuIDA7Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9nZXRMaWNlbnNlZERldmljZXMoc2hhcmVkKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhbGludXguYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYWxpbnV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZTRlODUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhbGludXguYworKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCi0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAotKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAotKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAotKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAotKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAotKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAotKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAotKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAotKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIExpbnV4Ci0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUgc2VydmljZXMgZm9yCi0qICAgICAgICAgICAgICAgdGhlIExpbnV4IG9wZXJhdGluZyBzeXN0ZW0uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAibnVjbGV1cy9ncmFwaGljcy5oIgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpYm9vbCAgICAgICAgaGF2ZVJEVFNDOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXBhdGggICAgLSBMb2NhbCBwYXRoIHRvIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcy4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbSB0byBvdmVycmlkZSB0aGUgbG9jYXRpb24KLW9mIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcyB0aGF0IGFyZSBsb2FkZWQuIE5vcm1hbGx5IHRoZSBsb2FkZXIgY29kZQotd2lsbCBsb29rIGluIHRoZSBzeXN0ZW0gTnVjbGV1cyBkaXJlY3RvcmllcyBmaXJzdCwgdGhlbiBpbiB0aGUgJ2RyaXZlcnMnCi1kaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCBmaW5hbGx5IHJlbGF0aXZlCi10byB0aGUgTUdMX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX3NldExvY2FsUGF0aCgKLSAgICBjb25zdCBjaGFyICpwYXRoKQotewotICAgIFBNX3NldExvY2FsQlBEUGF0aChwYXRoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1Qb2ludGVyIHRvIHRoZSBzeXN0ZW0gd2lkZSBQTSBsaWJyYXJ5IGltcG9ydHMsIG9yIHRoZSBpbnRlcm5hbCB2ZXJzaW9uIGlmIG5vbmUKLQotUkVNQVJLUzoKLUluIG9yZGVyIHRvIHN1cHBvcnQgZGVwbG95aW5nIG5ldyBOdWNsZXVzIGRyaXZlcnMgdGhhdCBtYXkgcmVxdWlyZSB1cGRhdGVkCi1QTSBsaWJyYXJ5IGZ1bmN0aW9ucywgd2UgY2hlY2sgaGVyZSB0byBzZWUgaWYgdGhlcmUgaXMgYSBzeXN0ZW0gd2lkZSB2ZXJzaW9uCi1vZiB0aGUgUE0gZnVuY3Rpb25zIGF2YWlsYWJsZS4gSWYgc28gd2UgcmV0dXJuIHRob3NlIGZ1bmN0aW9ucyBmb3IgdXNlIHdpdGgKLXRoZSBzeXN0ZW0gd2lkZSBOdWNsZXVzIGRyaXZlcnMsIG90aGVyd2lzZSB0aGUgY29tcGlsZWQgaW4gdmVyc2lvbiBvZiB0aGUgUE0KLWxpYnJhcnkgaXMgdXNlZCB3aXRoIHRoZSBhcHBsaWNhdGlvbiBsb2NhbCB2ZXJzaW9uIG9mIE51Y2xldXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUE1faW1wb3J0cyAqIE5BUEkgR0FfZ2V0U3lzdGVtUE1JbXBvcnRzKHZvaWQpCi17Ci0gICAgLyogVE9ETzogV2UgbWF5IHZlcnkgd2VsbCB3YW50IHRvIHByb3ZpZGUgYSBzeXN0ZW0gc2hhcmVkIGxpYnJhcnkgKi8KLSAgICAvKiAgICAgICB0aGF0IGVwb3J0cyB0aGUgUE0gZnVuY3Rpb25zIHJlcXVpcmVkIGJ5IHRoZSBOdWNsZXVzIGxpYnJhcnkgKi8KLSAgICAvKiAgICAgICBmb3IgTGludXggaGVyZS4gVGhhdCB3aWxsIGVsaW1pbmF0ZSBmYXRhbCBlcnJvcnMgbG9hZGluZyBuZXcgKi8KLSAgICAvKiAgICAgICBkcml2ZXJzIG9uIExpbnV4ISAqLwotICAgIHJldHVybiAmX1BNX2ltcG9ydHM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfZ2V0U2hhcmVkRXhwb3J0cygKLSAgICBHQV9leHBvcnRzICpnYUV4cCwKLSAgICBpYm9vbCBzaGFyZWQpCi17Ci0gICAgKHZvaWQpZ2FFeHA7Ci0gICAgKHZvaWQpc2hhcmVkOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotI2lmbmRlZiBURVNUX0hBUk5FU1MKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9xdWVyeUZ1bmN0aW9ucygKLSAgICBHQV9kZXZDdHggKmRjLAotICAgIE5fdWludDMyIGlkLAotICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQotewotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfcXVlcnlGdW5jdGlvbnMoZGMsaWQsZnVuY3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgUkVGMkRfcXVlcnlGdW5jdGlvbnMoCi0gICAgUkVGMkRfZHJpdmVyICpyZWYyZCwKLSAgICBOX3VpbnQzMiBpZCwKLSAgICB2b2lkIF9GQVJfICpmdW5jcykKLXsKLSAgICByZXR1cm4gX19HQV9leHBvcnRzLlJFRjJEX3F1ZXJ5RnVuY3Rpb25zKHJlZjJkLGlkLGZ1bmNzKTsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWluZyBmdW5jdGlvbnMgZm9yIHRoZQotTnVjbGV1cyBsb2FkZXIgbGlicmFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX1RpbWVySW5pdCh2b2lkKQotewotICAgIGlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKQotCWhhdmVSRFRTQyA9IHRydWU7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTkFQSSBHQV9UaW1lclJlYWQoCi0gICAgR0FfbGFyZ2VJbnRlZ2VyICp2YWx1ZSkKLXsKLSAgICBpZiAoaGF2ZVJEVFNDKQotCV9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKLSAgICBlbHNlIHsKLQlzdHJ1Y3QgdGltZXZhbCB0OwotCWdldHRpbWVvZmRheSgmdCwgTlVMTCk7Ci0JdmFsdWUtPmxvdyA9IHQudHZfc2VjKjEwMDAwMDAgKyB0LnR2X3VzZWM7Ci0JdmFsdWUtPmhpZ2ggPSAwOwotCX0KLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYW50ZHJ2LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FudGRydi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTBmNzM3Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYW50ZHJ2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKLSogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKLSogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKLSogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKLSogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKLSogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKLSogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKLSogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKLSogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBOVCBkZXZpY2UgZHJpdmVyCi0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUgc2VydmljZXMgZm9yCi0qICAgICAgICAgICAgICAgdGhlIE5UIGRldmljZSBkcml2ZXJzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInNkZC9zZGRoZWxwLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpYm9vbCAgICAgICAgICAgIGhhdmVSRFRTQzsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1wYXRoICAgIC0gTG9jYWwgcGF0aCB0byB0aGUgTnVjbGV1cyBkcml2ZXIgZmlsZXMuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHByb2dyYW0gdG8gb3ZlcnJpZGUgdGhlIGxvY2F0aW9uCi1vZiB0aGUgTnVjbGV1cyBkcml2ZXIgZmlsZXMgdGhhdCBhcmUgbG9hZGVkLiBOb3JtYWxseSB0aGUgbG9hZGVyIGNvZGUKLXdpbGwgbG9vayBpbiB0aGUgc3lzdGVtIE51Y2xldXMgZGlyZWN0b3JpZXMgZmlyc3QsIHRoZW4gaW4gdGhlICdkcml2ZXJzJwotZGlyZWN0b3J5IHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBhbmQgZmluYWxseSByZWxhdGl2ZQotdG8gdGhlIE1HTF9ST09UIGVudmlyb25tZW50IHZhcmlhYmxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTkFQSSBHQV9zZXRMb2NhbFBhdGgoCi0gICAgY29uc3QgY2hhciAqcGF0aCkKLXsKLSAgICBQTV9zZXRMb2NhbEJQRFBhdGgocGF0aCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVRVUk5TOgotUG9pbnRlciB0byB0aGUgc3lzdGVtIHdpZGUgUE0gbGlicmFyeSBpbXBvcnRzLCBvciB0aGUgaW50ZXJuYWwgdmVyc2lvbiBpZiBub25lCi0KLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUE1faW1wb3J0cyAqIE5BUEkgR0FfZ2V0U3lzdGVtUE1JbXBvcnRzKHZvaWQpCi17Ci0gICAgcmV0dXJuICZfUE1faW1wb3J0czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9nZXRTaGFyZWRFeHBvcnRzKAotICAgIEdBX2V4cG9ydHMgKmdhRXhwLAotICAgIGlib29sIHNoYXJlZCkKLXsKLSAgICAodm9pZClnYUV4cDsKLSAgICAodm9pZClzaGFyZWQ7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0jaWZuZGVmIFRFU1RfSEFSTkVTUwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX3F1ZXJ5RnVuY3Rpb25zKAotICAgIEdBX2RldkN0eCAqZGMsCi0gICAgTl91aW50MzIgaWQsCi0gICAgdm9pZCBfRkFSXyAqZnVuY3MpCi17Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9xdWVyeUZ1bmN0aW9ucyhkYyxpZCxmdW5jcyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBSRUYyRF9xdWVyeUZ1bmN0aW9ucygKLSAgICBSRUYyRF9kcml2ZXIgKnJlZjJkLAotICAgIE5fdWludDMyIGlkLAotICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQotewotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuUkVGMkRfcXVlcnlGdW5jdGlvbnMocmVmMmQsaWQsZnVuY3MpOwotfQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgaGlnaCBwcmVjaXNpb24gdGltaW5nIGZ1bmN0aW9ucyBmb3IgdGhlCi1OdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCi17Ci0gICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApIHsKLQloYXZlUkRUU0MgPSB0cnVlOwotCX0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKLSAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQotewotICAgIGlmIChoYXZlUkRUU0MpCi0JX0dBX3JlYWRUaW1lU3RhbXAodmFsdWUpOwotICAgIGVsc2UKLQlLZVF1ZXJ5U3lzdGVtVGltZSgoTEFSR0VfSU5URUdFUiopdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhb3MyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FvczIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZlNjUwMy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FvczIuYworKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCi0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAotKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAotKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAotKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAotKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAotKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAotKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAotKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAotKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIE9TLzIgMzItYml0Ci0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUgc2VydmljZXMgZm9yCi0qICAgICAgICAgICAgICAgdGhlIE9TLzIgb3BlcmF0aW5nIHN5c3RlbSBlbnZpcm9ubWVudHMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1faGVscC5oIgotI2RlZmluZSBJTkNMX0RPU0VSUk9SUwotI2RlZmluZSBJTkNMX0RPUwotI2RlZmluZSBJTkNMX1NVQgotI2RlZmluZSBJTkNMX1ZJTwotI2RlZmluZSBJTkNMX0tCRAotI2luY2x1ZGUgPG9zMi5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaWJvb2wgICAgaGF2ZVJEVFNDID0gZmFsc2U7Ci1zdGF0aWMgdWxvbmcgICAgcGFybXNbM107ICAgICAgIC8qIE11c3Qgbm90IGNyb3NzIDY0S2IgYm91bmRhcnkhICAgICovCi1zdGF0aWMgdWxvbmcgICAgcmVzdWx0WzRdOyAgICAgIC8qIE11c3Qgbm90IGNyb3NzIDY0S2IgYm91bmRhcnkhICAgICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZnVuYyAgICAgICAgLSBIZWxwZXIgZGV2aWNlIGRyaXZlciBmdW5jdGlvbiB0byBjYWxsCi0KLVJFVFVSTlM6Ci1GaXJzdCByZXR1cm4gdmFsdWUgZnJvbSB0aGUgZGV2aWNlIGRyaXZlciBpbiBwYXJtc091dFswXQotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gb3BlbiBvdXIgaGVscGVyIGRldmljZSBkcml2ZXIsIGNhbGwgaXQgYW5kIGNsb3NlIHRoZSBmaWxlCi1oYW5kbGUuIE5vdGUgdGhhdCB3ZSBoYXZlIHRvIG9wZW4gdGhlIGRldmljZSBkcml2ZXIgZm9yIGV2ZXJ5IGNhbGwgYmVjYXVzZQotb2YgdHdvIHByb2JsZW1zOgotCi0gMS4gV2UgY2Fubm90IG9wZW4gYSBzaW5nbGUgZmlsZSBoYW5kbGUgaW4gYSBETEwgdGhhdCBpcyBzaGFyZWQgYW1vbmdzdAotICAgIHByb2dyYW1zLCBzaW5jZSBldmVyeSBwcm9jZXNzIG11c3QgaGF2ZSBpdCdzIG93biBvcGVuIGZpbGUgaGFuZGxlLgotCi0gMi4gRm9yIHNvbWUgcmVhc29uIHRoZXJlIGFwcGVhcnMgdG8gYmUgYSBsaW1pdCBvZiBhYm91dCAxMiBvcGVuIGZpbGUKLSAgICBoYW5kbGVzIG9uIGEgZGV2aWNlIGRyaXZlciBpbiB0aGUgc3lzdGVtLiBIZW5jZSB3aGVuIHdlIG9wZW4gbW9yZQotICAgIHRoYW4gYWJvdXQgMTIgZmlsZSBoYW5kbGVzIHRoaW5ncyBzdGFydCB0byBnbyB2ZXJ5IHN0cmFuZ2UuCi0KLUhlbmNlIHdlIHNpbXBseSBvcGVuIHRoZSBmaWxlIGhhbmRsZSBldmVyeSB0aW1lIHRoYXQgd2UgbmVlZCB0byBjYWxsIHRoZQotZGV2aWNlIGRyaXZlciB0byB3b3JrIGFyb3VuZCB0aGVzZSBwcm9ibGVtcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgQ2FsbFNEREhlbHAoCi0gICAgaW50IGZ1bmMpCi17Ci0gICAgc3RhdGljIHVsb25nICAgIGluTGVuOyAgICAgICAgICAvKiBNdXN0IG5vdCBjcm9zcyA2NEtiIGJvdW5kYXJ5ISAgICAqLwotICAgIHN0YXRpYyB1bG9uZyAgICBvdXRMZW47ICAgICAgICAgLyogTXVzdCBub3QgY3Jvc3MgNjRLYiBib3VuZGFyeSEgICAgKi8KLSAgICBIRklMRSAgICAgICAgICAgaFNEREhlbHA7Ci0KLSAgICAvKiBJZiB0aGlzIGNvZGUgaW4gaGVyZSBmYWlscywgd2UgYXJlIHNjcmV3ZWQhIE1hbnkgb2Ygb3VyIGRyaXZlcnMKLSAgICAgKiB1c2UgdGhpcyBjb2RlIGFuZCBkb24ndCBoYXZlIGEgQyBsaWJyYXJ5LCBzbyB3ZSBzaW1wbHkgYXNzdW1lIHdlCi0gICAgICogY2FuJ3QgZmFpbCBoZXJlLgotICAgICAqLwotICAgIERvc09wZW4oUE1IRUxQX05BTUUsJmhTRERIZWxwLCZyZXN1bHRbMF0sMCwwLAotCSAgICBGSUxFX09QRU4sIE9QRU5fU0hBUkVfREVOWU5PTkUgfCBPUEVOX0FDQ0VTU19SRUFEV1JJVEUsCi0JICAgIE5VTEwpOwotICAgIERvc0RldklPQ3RsKGhTRERIZWxwLFBNSEVMUF9JT0NUTCxmdW5jLAotCSAgICAgJnBhcm1zLCBpbkxlbiA9IHNpemVvZihwYXJtcyksICZpbkxlbiwKLQkgICAgJnJlc3VsdCwgb3V0TGVuID0gc2l6ZW9mKHJlc3VsdCksICZvdXRMZW4pOwotICAgIERvc0Nsb3NlKGhTRERIZWxwKTsKLSAgICByZXR1cm4gcmVzdWx0WzBdOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXBhdGggICAgLSBMb2NhbCBwYXRoIHRvIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcy4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbSB0byBvdmVycmlkZSB0aGUgbG9jYXRpb24KLW9mIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcyB0aGF0IGFyZSBsb2FkZWQuIE5vcm1hbGx5IHRoZSBsb2FkZXIgY29kZQotd2lsbCBsb29rIGluIHRoZSBzeXN0ZW0gTnVjbGV1cyBkaXJlY3RvcmllcyBmaXJzdCwgdGhlbiBpbiB0aGUgJ2RyaXZlcnMnCi1kaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCBmaW5hbGx5IHJlbGF0aXZlCi10byB0aGUgTUdMX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX3NldExvY2FsUGF0aCgKLSAgICBjb25zdCBjaGFyICpwYXRoKQotewotICAgIFBNX3NldExvY2FsQlBEUGF0aChwYXRoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1Qb2ludGVyIHRvIHRoZSBzeXN0ZW0gd2lkZSBQTSBsaWJyYXJ5IGltcG9ydHMsIG9yIHRoZSBpbnRlcm5hbCB2ZXJzaW9uIGlmIG5vbmUKLQotUkVNQVJLUzoKLUZvciBPUy8yIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgc3BlY2lhbCBiZWNhdXNlIE51Y2xldXMgaXMgYWx3YXlzCi1sb2FkZWQgdmlhIHRoZSBzaGFyZWQgU0REUE1JIGRyaXZlciB3aGVuIFNERCBpcyBsb2FkZWQgc28gd2UgZG9uJ3QgbmVlZAotYSBzeXN0ZW0gd2lkZSBQTSBsaWJyYXJ5IGltcG9ydHMgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUE1faW1wb3J0cyAqIE5BUEkgR0FfZ2V0U3lzdGVtUE1JbXBvcnRzKHZvaWQpCi17Ci0gICAgcmV0dXJuICZfUE1faW1wb3J0czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1nYUV4cCAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIGV4cG9ydGVkIGZ1bmN0aW9ucwotc2hhcmVkICAtIFRydWUgaWYgY29ubmVjdGluZyB0byB0aGUgc2hhcmVkLCBnbG9iYWwgTnVjbGV1cyBkcml2ZXIKLQotUkVNQVJLUzoKLUZvciBPUy8yIGlmIFNERCBpcyBsb2FkZWQgd2UgKmFsd2F5cyogY29ubmVjdCB0byB0aGUgc2hhcmVkIE51Y2xldXMgZnVuY3Rpb25zCi1jb250YWluZWQgd2l0aGluIHRoZSBTRERQTUkgZHJpdmVyLiBUaGlzIGFsbG93cyB0aGUgTnVjbGV1cyBmdW5jdGlvbnMgY29udGFpbmVkCi13aXRoaW4gdGhpcyBkcml2ZXIgdG8gYmUgdXRpbGlzZWQgYnkgYWxsIE51Y2xldXMgYXBwcyBpbiB0aGUgc3lzdGVtIGFuZAotbWFpbnRhaW5zIGEgY29uc2lzdGVudCBzdGF0ZSBiZXR3ZWVuIHZlcnNpb25zLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfZ2V0U2hhcmVkRXhwb3J0cygKLSAgICBHQV9leHBvcnRzICpnYUV4cCwKLSAgICBpYm9vbCBzaGFyZWQpCi17Ci0gICAgLyogSW4gdGVzdCBoYXJuZXNzIG1vZGUsIHdlIG5lZWQgdG8gbG9hZCBhIGxvY2FsIGNvcHkgb2YgTnVjbGV1cyAqLwotI2lmICFkZWZpbmVkIChURVNUX0hBUk5FU1MpIHx8IGRlZmluZWQgKERFQlVHX1NERFBNSSkKLSAgICBITU9EVUxFICAgICBoTW9kU0REUE1JOwotICAgIGNoYXIgICAgICAgIGJ1Zls4MF07Ci0gICAgR0FfZXhwb3J0cyAgKmV4cDsKLQotICAgIC8qIEluaXRpYWxpc2UgdGhlIFBNIGxpYnJhcnkgYW5kIGNvbm5lY3QgdG8gb3VyIHJ1bnRpbWUgRExMJ3MgKi8KLSAgICBQTV9pbml0KCk7Ci0gICAgaWYgKENhbGxTRERIZWxwKFBNSEVMUF9HRVRTSEFSRURFWFApICE9IDApIHsKLQkvKiBXZSBoYXZlIGZvdW5kIHRoZSBzaGFyZWQgTnVjbGV1cyBleHBvcnRzLiBCZWNhdXNlIG5vdCBhbGwgcHJvY2Vzc2VzCi0JICogbWFwIHRvIFNERFBNSS5ETEwsIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgd2UgY29ubmVjdCB0byB0aGlzCi0JICogRExMIHNvIHRoYXQgaXQgZ2V0cyBtYXBwZWQgaW50byBvdXIgYWRkcmVzcyBzcGFjZSAodGhhdCBpcwotCSAqIHdoZXJlIHRoZSBzaGFyZWQgTnVjbGV1cyBsb2FkZXIgY29kZSBpcyBsb2NhdGVkKS4gU2ltcGx5IGRvaW5nIGEKLQkgKiBEb3NMb2FkTW9kdWxlIG9uIGl0IGlzIGVub3VnaCBmb3IgdGhpcy4KLQkgKi8KLQlEb3NMb2FkTW9kdWxlKChQU1opYnVmLHNpemVvZihidWYpLChQU1opIlNERFBNSS5ETEwiLCZoTW9kU0REUE1JKTsKLQlleHAgPSAoR0FfZXhwb3J0cyopcmVzdWx0WzBdOwotCW1lbWNweShnYUV4cCxleHAsTUlOKGdhRXhwLT5kd1NpemUsZXhwLT5kd1NpemUpKTsKLQlyZXR1cm4gdHJ1ZTsKLQl9Ci0jZW5kaWYKLSAgICAodm9pZClzaGFyZWQ7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0jaWZuZGVmIFRFU1RfSEFSTkVTUwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX3F1ZXJ5RnVuY3Rpb25zKAotICAgIEdBX2RldkN0eCAqZGMsCi0gICAgTl91aW50MzIgaWQsCi0gICAgdm9pZCBfRkFSXyAqZnVuY3MpCi17Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9xdWVyeUZ1bmN0aW9ucyhkYyxpZCxmdW5jcyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBSRUYyRF9xdWVyeUZ1bmN0aW9ucygKLSAgICBSRUYyRF9kcml2ZXIgKnJlZjJkLAotICAgIE5fdWludDMyIGlkLAotICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQotewotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuUkVGMkRfcXVlcnlGdW5jdGlvbnMocmVmMmQsaWQsZnVuY3MpOwotfQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgaGlnaCBwcmVjaXNpb24gdGltaW5nIGZ1bmN0aW9ucyBmb3IgdGhlCi1OdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCi17Ci0gICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApCi0JaGF2ZVJEVFNDID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKLSAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQotewotICAgIGlmIChoYXZlUkRUU0MpCi0JX0dBX3JlYWRUaW1lU3RhbXAodmFsdWUpOwotICAgIGVsc2UKLQlEb3NUbXJRdWVyeVRpbWUoKFFXT1JEKil2YWx1ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotT24gT1MvMiwgd2UgbmVlZCBzcGVjaWFsIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyBpZiB3ZSBidWlsZCBTRERQTUkgaW4KLXRlc3QgaGFybmVzcyBtb2RlLiBCdXQgaWYgd2UgYnVpbGQgR0FUZXN0IGV0Yy4gaW4gdGVzdCBtb2RlLCB3ZSB3YW50IHRvIHVzZQotdGhlIG5vcm1hbCBDIHJ1bnRpbWUgZnVuY3Rpb25zLCBzbyByb3V0ZSB0aGVtIGJhY2sgaGVyZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZiBkZWZpbmVkIChURVNUX0hBUk5FU1MpICYmICFkZWZpbmVkIChERUJVR19TRERQTUkpCi0KLS8qIFVuZGVmaW5lIHRoZXNlIG1hY3JvcyBmaXJzdCBvciB3ZSdsbCByZWN1cnNlIHRvIGhlbGwhICovCi0jdW5kZWYgbWFsbG9jCi0jdW5kZWYgY2FsbG9jCi0jdW5kZWYgcmVhbGxvYwotI3VuZGVmIGZyZWUKLQotdm9pZCAqU0REUE1JX21hbGxvYyhzaXplX3Qgc2l6ZSkgewotICAgIHJldHVybiBtYWxsb2Moc2l6ZSk7Ci19Ci0KLXZvaWQgKlNERFBNSV9jYWxsb2Moc2l6ZV90IG51bSwgc2l6ZV90IHNpemUpIHsKLSAgICByZXR1cm4gY2FsbG9jKG51bSwgc2l6ZSk7Ci19Ci0KLXZvaWQgU0REUE1JX2ZyZWUodm9pZCAqcHRyKSB7Ci0gICAgZnJlZShwdHIpOwotfQotCi12b2lkICpTRERQTUlfcmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBzaXplKSB7Ci0gICAgcmV0dXJuIHJlYWxsb2MocHRyLCBzaXplKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FxbnguYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYXFueC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjVkNjYyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYXFueC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8Ci0qICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Ci0qICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Ci0qICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci0qICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8Ci0qICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8Ci0qICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Ci0qICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci0qICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgUU5YCi0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUgc2VydmljZXMgZm9yCi0qICAgICAgICAgICAgICAgdGhlIFFOWCBvcGVyYXRpbmcgc3lzdGVtLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm51Y2xldXMvZ3JhcGhpY3MuaCIKLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpYm9vbCAgICAgICAgaGF2ZVJEVFNDOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXBhdGggICAgLSBMb2NhbCBwYXRoIHRvIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcy4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbSB0byBvdmVycmlkZSB0aGUgbG9jYXRpb24KLW9mIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcyB0aGF0IGFyZSBsb2FkZWQuIE5vcm1hbGx5IHRoZSBsb2FkZXIgY29kZQotd2lsbCBsb29rIGluIHRoZSBzeXN0ZW0gTnVjbGV1cyBkaXJlY3RvcmllcyBmaXJzdCwgdGhlbiBpbiB0aGUgJ2RyaXZlcnMnCi1kaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCBmaW5hbGx5IHJlbGF0aXZlCi10byB0aGUgTUdMX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX3NldExvY2FsUGF0aCgKLSAgICBjb25zdCBjaGFyICpwYXRoKQotewotICAgIFBNX3NldExvY2FsQlBEUGF0aChwYXRoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1Qb2ludGVyIHRvIHRoZSBzeXN0ZW0gd2lkZSBQTSBsaWJyYXJ5IGltcG9ydHMsIG9yIHRoZSBpbnRlcm5hbCB2ZXJzaW9uIGlmIG5vbmUKLQotUkVNQVJLUzoKLUluIG9yZGVyIHRvIHN1cHBvcnQgZGVwbG95aW5nIG5ldyBOdWNsZXVzIGRyaXZlcnMgdGhhdCBtYXkgcmVxdWlyZSB1cGRhdGVkCi1QTSBsaWJyYXJ5IGZ1bmN0aW9ucywgd2UgY2hlY2sgaGVyZSB0byBzZWUgaWYgdGhlcmUgaXMgYSBzeXN0ZW0gd2lkZSB2ZXJzaW9uCi1vZiB0aGUgUE0gZnVuY3Rpb25zIGF2YWlsYWJsZS4gSWYgc28gd2UgcmV0dXJuIHRob3NlIGZ1bmN0aW9ucyBmb3IgdXNlIHdpdGgKLXRoZSBzeXN0ZW0gd2lkZSBOdWNsZXVzIGRyaXZlcnMsIG90aGVyd2lzZSB0aGUgY29tcGlsZWQgaW4gdmVyc2lvbiBvZiB0aGUgUE0KLWxpYnJhcnkgaXMgdXNlZCB3aXRoIHRoZSBhcHBsaWNhdGlvbiBsb2NhbCB2ZXJzaW9uIG9mIE51Y2xldXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUE1faW1wb3J0cyAqIE5BUEkgR0FfZ2V0U3lzdGVtUE1JbXBvcnRzKHZvaWQpCi17Ci0gICAgLyogVE9ETzogV2UgbWF5IHZlcnkgd2VsbCB3YW50IHRvIHByb3ZpZGUgYSBzeXN0ZW0gc2hhcmVkIGxpYnJhcnkgKi8KLSAgICAvKiAgICAgICB0aGF0IGVwb3J0cyB0aGUgUE0gZnVuY3Rpb25zIHJlcXVpcmVkIGJ5IHRoZSBOdWNsZXVzIGxpYnJhcnkgKi8KLSAgICAvKiAgICAgICBmb3IgUU5YIGhlcmUuIFRoYXQgd2lsbCBlbGltaW5hdGUgZmF0YWwgZXJyb3JzIGxvYWRpbmcgbmV3ICovCi0gICAgLyogICAgICAgZHJpdmVycyBvbiBRTlghICovCi0gICAgcmV0dXJuICZfUE1faW1wb3J0czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9nZXRTaGFyZWRFeHBvcnRzKAotICAgIEdBX2V4cG9ydHMgKmdhRXhwLAotICAgIGlib29sIHNoYXJlZCkKLXsKLSAgICAodm9pZClnYUV4cDsKLSAgICAodm9pZClzaGFyZWQ7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0jaWZuZGVmIFRFU1RfSEFSTkVTUwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX3F1ZXJ5RnVuY3Rpb25zKAotICAgIEdBX2RldkN0eCAqZGMsCi0gICAgTl91aW50MzIgaWQsCi0gICAgdm9pZCBfRkFSXyAqZnVuY3MpCi17Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9xdWVyeUZ1bmN0aW9ucyhkYyxpZCxmdW5jcyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBSRUYyRF9xdWVyeUZ1bmN0aW9ucygKLSAgICBSRUYyRF9kcml2ZXIgKnJlZjJkLAotICAgIE5fdWludDMyIGlkLAotICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQotewotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuUkVGMkRfcXVlcnlGdW5jdGlvbnMocmVmMmQsaWQsZnVuY3MpOwotfQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgaGlnaCBwcmVjaXNpb24gdGltaW5nIGZ1bmN0aW9ucyBmb3IgdGhlCi1OdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCi17Ci0gICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApCi0JaGF2ZVJEVFNDID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKLSAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQotewotICAgIGlmIChoYXZlUkRUU0MpCi0JX0dBX3JlYWRUaW1lU3RhbXAodmFsdWUpOwotICAgIGVsc2UgewotCXN0cnVjdCB0aW1lc3BlYyB0czsKLQotCWNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZ0cyk7Ci0JdmFsdWUtPmxvdyA9ICh0cy50dl9uc2VjIC8gMTAwMCArIHRzLnR2X3NlYyAqIDEwMDAwMDApOwotCXZhbHVlLT5oaWdoID0gMDsKLQl9Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FydHQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYXJ0dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTQxZjU5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYXJ0dC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGNvbnRhaW5zIHByb3ByaWV0YXJ5IHRlY2hub2xvZ3kgICAgICB8Ci0qICB8b3duZWQgYnkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsICAgICAgICB8Ci0qICB8Q2hpY28sIENBIDk1OTI4IFVTQSAoaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20pLiAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBOdWNsZXVzICAgICAgICB8Ci0qICB8TGljZW5zZTsgeW91IG1heSAqbm90KiB1c2UgdGhpcyBmaWxlIG9yIHJlbGF0ZWQgc29mdHdhcmUgZXhjZXB0IGluICB8Ci0qICB8Y29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgICB8Ci0qICB8YXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbnVjbGV1cy1saWNlbnNlLnR4dCAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8U29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICB8Ci0qICB8IkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgICAgICB8Ci0qICB8aW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nICAgICAgICB8Ci0qICB8cmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgUlRUYXJnZXQtMzIKLSoKLSogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZSBzZXJ2aWNlcyBmb3IKLSogICAgICAgICAgICAgICB0aGUgUlRUYXJnZXQtMzIgb3BlcmF0aW5nIHN5c3RlbSBlbnZpcm9ubWVudHMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAibnVjbGV1cy9ncmFwaGljcy5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaWJvb2wgICAgICAgICAgICBoYXZlUkRUU0M7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcGF0aCAgICAtIExvY2FsIHBhdGggdG8gdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtIHRvIG92ZXJyaWRlIHRoZSBsb2NhdGlvbgotb2YgdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzIHRoYXQgYXJlIGxvYWRlZC4gTm9ybWFsbHkgdGhlIGxvYWRlciBjb2RlCi13aWxsIGxvb2sgaW4gdGhlIHN5c3RlbSBOdWNsZXVzIGRpcmVjdG9yaWVzIGZpcnN0LCB0aGVuIGluIHRoZSAnZHJpdmVycycKLWRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIGZpbmFsbHkgcmVsYXRpdmUKLXRvIHRoZSBNR0xfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgR0Ffc2V0TG9jYWxQYXRoKAotICAgIGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gICAgUE1fc2V0TG9jYWxCUERQYXRoKHBhdGgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVUVVJOUzoKLVBvaW50ZXIgdG8gdGhlIHN5c3RlbSB3aWRlIFBNIGxpYnJhcnkgaW1wb3J0cywgb3IgdGhlIGludGVybmFsIHZlcnNpb24gaWYgbm9uZQotCi1SRU1BUktTOgotSW4gb3JkZXIgdG8gc3VwcG9ydCBkZXBsb3lpbmcgbmV3IE51Y2xldXMgZHJpdmVycyB0aGF0IG1heSByZXF1aXJlIHVwZGF0ZWQKLVBNIGxpYnJhcnkgZnVuY3Rpb25zLCB3ZSBjaGVjayBoZXJlIHRvIHNlZSBpZiB0aGVyZSBpcyBhIHN5c3RlbSB3aWRlIHZlcnNpb24KLW9mIHRoZSBQTSBmdW5jdGlvbnMgYXZhaWxhYmxlLiBJZiBzbyB3ZSByZXR1cm4gdGhvc2UgZnVuY3Rpb25zIGZvciB1c2Ugd2l0aAotdGhlIHN5c3RlbSB3aWRlIE51Y2xldXMgZHJpdmVycywgb3RoZXJ3aXNlIHRoZSBjb21waWxlZCBpbiB2ZXJzaW9uIG9mIHRoZSBQTQotbGlicmFyeSBpcyB1c2VkIHdpdGggdGhlIGFwcGxpY2F0aW9uIGxvY2FsIHZlcnNpb24gb2YgTnVjbGV1cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1QTV9pbXBvcnRzICogTkFQSSBHQV9nZXRTeXN0ZW1QTUltcG9ydHModm9pZCkKLXsKLSAgICByZXR1cm4gJl9QTV9pbXBvcnRzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX2dldFNoYXJlZEV4cG9ydHMoCi0gICAgR0FfZXhwb3J0cyAqZ2FFeHAsCi0gICAgaWJvb2wgc2hhcmVkKQotewotICAgICh2b2lkKWdhRXhwOwotICAgICh2b2lkKXNoYXJlZDsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLSNpZm5kZWYgVEVTVF9IQVJORVNTCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfcXVlcnlGdW5jdGlvbnMoCi0gICAgR0FfZGV2Q3R4ICpkYywKLSAgICBOX3VpbnQzMiBpZCwKLSAgICB2b2lkIF9GQVJfICpmdW5jcykKLXsKLSAgICByZXR1cm4gX19HQV9leHBvcnRzLkdBX3F1ZXJ5RnVuY3Rpb25zKGRjLGlkLGZ1bmNzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIFJFRjJEX3F1ZXJ5RnVuY3Rpb25zKAotICAgIFJFRjJEX2RyaXZlciAqcmVmMmQsCi0gICAgTl91aW50MzIgaWQsCi0gICAgdm9pZCBfRkFSXyAqZnVuY3MpCi17Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5SRUYyRF9xdWVyeUZ1bmN0aW9ucyhyZWYyZCxpZCxmdW5jcyk7Ci19Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGluaXRpYWxpc2VzIHRoZSBoaWdoIHByZWNpc2lvbiB0aW1pbmcgZnVuY3Rpb25zIGZvciB0aGUKLU51Y2xldXMgbG9hZGVyIGxpYnJhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9UaW1lckluaXQodm9pZCkKLXsKLSAgICBpZiAoX0dBX2hhdmVDUFVJRCgpICYmIChfR0FfZ2V0Q1BVSURGZWF0dXJlcygpICYgQ1BVX0hhdmVSRFRTQykgIT0gMCkgewotCWhhdmVSRFRTQyA9IHRydWU7Ci0JcmV0dXJuIHRydWU7Ci0JfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX1RpbWVyUmVhZCgKLSAgICBHQV9sYXJnZUludGVnZXIgKnZhbHVlKQotewotICAgIGlmIChoYXZlUkRUU0MpCi0JX0dBX3JlYWRUaW1lU3RhbXAodmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhc214LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FzbXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUzMTk0MS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2FzbXguYworKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCi0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAotKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAotKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAotKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAotKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAotKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAotKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAotKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAotKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIHNteDMyCi0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgTnVjbGV1cyBHcmFwaGljcyBBcmNoaXRlY3R1cmUgc2VydmljZXMgZm9yCi0qICAgICAgICAgICAgICAgdGhlIHNteDMyIHBsYXRmb3JtIC0tIG5vIHZ4RCBzdXBwb3J0LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAibnVjbGV1cy9ncmFwaGljcy5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXBhdGggICAgLSBMb2NhbCBwYXRoIHRvIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcy4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbSB0byBvdmVycmlkZSB0aGUgbG9jYXRpb24KLW9mIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcyB0aGF0IGFyZSBsb2FkZWQuIE5vcm1hbGx5IHRoZSBsb2FkZXIgY29kZQotd2lsbCBsb29rIGluIHRoZSBzeXN0ZW0gTnVjbGV1cyBkaXJlY3RvcmllcyBmaXJzdCwgdGhlbiBpbiB0aGUgJ2RyaXZlcnMnCi1kaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFuZCBmaW5hbGx5IHJlbGF0aXZlCi10byB0aGUgTUdMX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBOQVBJIEdBX3NldExvY2FsUGF0aCgKLSAgICBjb25zdCBjaGFyICpwYXRoKQotewotICAgIFBNX3NldExvY2FsQlBEUGF0aChwYXRoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1Qb2ludGVyIHRvIHRoZSBzeXN0ZW0gd2lkZSBQTSBsaWJyYXJ5IGltcG9ydHMsIG9yIHRoZSBpbnRlcm5hbCB2ZXJzaW9uIGlmIG5vbmUKLQotUkVNQVJLUzoKLUluIG9yZGVyIHRvIHN1cHBvcnQgZGVwbG95aW5nIG5ldyBOdWNsZXVzIGRyaXZlcnMgdGhhdCBtYXkgcmVxdWlyZSB1cGRhdGVkCi1QTSBsaWJyYXJ5IGZ1bmN0aW9ucywgd2UgY2hlY2sgaGVyZSB0byBzZWUgaWYgdGhlcmUgaXMgYSBzeXN0ZW0gd2lkZSB2ZXJzaW9uCi1vZiB0aGUgUE0gZnVuY3Rpb25zIGF2YWlsYWJsZS4gSWYgc28gd2UgcmV0dXJuIHRob3NlIGZ1bmN0aW9ucyBmb3IgdXNlIHdpdGgKLXRoZSBzeXN0ZW0gd2lkZSBOdWNsZXVzIGRyaXZlcnMsIG90aGVyd2lzZSB0aGUgY29tcGlsZWQgaW4gdmVyc2lvbiBvZiB0aGUgUE0KLWxpYnJhcnkgaXMgdXNlZCB3aXRoIHRoZSBhcHBsaWNhdGlvbiBsb2NhbCB2ZXJzaW9uIG9mIE51Y2xldXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUE1faW1wb3J0cyAqIE5BUEkgR0FfZ2V0U3lzdGVtUE1JbXBvcnRzKHZvaWQpCi17Ci0gICAgcmV0dXJuICZfUE1faW1wb3J0czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9nZXRTaGFyZWRFeHBvcnRzKAotICAgIEdBX2V4cG9ydHMgKmdhRXhwLAotICAgIGlib29sIHNoYXJlZCkKLXsKLSAgICAodm9pZClnYUV4cDsKLSAgICAodm9pZClzaGFyZWQ7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0jaWZuZGVmIFRFU1RfSEFSTkVTUwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX3F1ZXJ5RnVuY3Rpb25zKAotICAgIEdBX2RldkN0eCAqZGMsCi0gICAgTl91aW50MzIgaWQsCi0gICAgdm9pZCBfRkFSXyAqZnVuY3MpCi17Ci0gICAgcmV0dXJuIF9fR0FfZXhwb3J0cy5HQV9xdWVyeUZ1bmN0aW9ucyhkYyxpZCxmdW5jcyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBSRUYyRF9xdWVyeUZ1bmN0aW9ucygKLSAgICBSRUYyRF9kcml2ZXIgKnJlZjJkLAotICAgIE5fdWludDMyIGlkLAotICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQotewotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuUkVGMkRfcXVlcnlGdW5jdGlvbnMocmVmMmQsaWQsZnVuY3MpOwotfQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpbml0aWFsaXNlcyB0aGUgaGlnaCBwcmVjaXNpb24gdGltaW5nIGZ1bmN0aW9ucyBmb3IgdGhlCi1OdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfVGltZXJJbml0KHZvaWQpCi17Ci0gICAgaWYgKF9HQV9oYXZlQ1BVSUQoKSAmJiAoX0dBX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlUkRUU0MpICE9IDApCi0JcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgR0FfVGltZXJSZWFkKAotICAgIEdBX2xhcmdlSW50ZWdlciAqdmFsdWUpCi17Ci0gICAgX0dBX3JlYWRUaW1lU3RhbXAodmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2dhdnhkLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2F2eGQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM4YmE4ZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2F2eGQuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlCi0qCi0qICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoaXMgY29weXJpZ2h0ZWQgY29tcHV0ZXIgY29kZSBjb250YWlucyBwcm9wcmlldGFyeSB0ZWNobm9sb2d5ICAgICAgfAotKiAgfG93bmVkIGJ5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4sIGxvY2F0ZWQgYXQgNTA1IFdhbGwgU3RyZWV0LCAgICAgICAgfAotKiAgfENoaWNvLCBDQSA5NTkyOCBVU0EgKGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tKS4gICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTnVjbGV1cyAgICAgICAgfAotKiAgfExpY2Vuc2U7IHlvdSBtYXkgKm5vdCogdXNlIHRoaXMgZmlsZSBvciByZWxhdGVkIHNvZnR3YXJlIGV4Y2VwdCBpbiAgfAotKiAgfGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlICAgfAotKiAgfGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL251Y2xldXMtbGljZW5zZS50eHQgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgfAotKiAgfCJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yICAgICAgfAotKiAgfGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyAgICAgICAgfAotKiAgfHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiAgfFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRISVMgSEVBREVSIElTIFNUUklDVExZIFBST0hJQklURUQgQlkgTEFXfAotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIFdpbjMyIFZ4RAotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlIHNlcnZpY2VzIGZvcgotKiAgICAgICAgICAgICAgIHRoZSBXaW4zMiBWeEQncy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJzZGQvc2RkaGVscC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaWJvb2wgICAgICAgICAgICBoYXZlUkRUU0M7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcGF0aCAgICAtIExvY2FsIHBhdGggdG8gdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtIHRvIG92ZXJyaWRlIHRoZSBsb2NhdGlvbgotb2YgdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzIHRoYXQgYXJlIGxvYWRlZC4gTm9ybWFsbHkgdGhlIGxvYWRlciBjb2RlCi13aWxsIGxvb2sgaW4gdGhlIHN5c3RlbSBOdWNsZXVzIGRpcmVjdG9yaWVzIGZpcnN0LCB0aGVuIGluIHRoZSAnZHJpdmVycycKLWRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgYW5kIGZpbmFsbHkgcmVsYXRpdmUKLXRvIHRoZSBNR0xfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgR0Ffc2V0TG9jYWxQYXRoKAotICAgIGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gICAgUE1fc2V0TG9jYWxCUERQYXRoKHBhdGgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVUVVJOUzoKLVBvaW50ZXIgdG8gdGhlIHN5c3RlbSB3aWRlIFBNIGxpYnJhcnkgaW1wb3J0cywgb3IgdGhlIGludGVybmFsIHZlcnNpb24gaWYgbm9uZQotCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVBNX2ltcG9ydHMgKiBOQVBJIEdBX2dldFN5c3RlbVBNSW1wb3J0cyh2b2lkKQotewotICAgIHJldHVybiAmX1BNX2ltcG9ydHM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgR0FfZ2V0U2hhcmVkRXhwb3J0cygKLSAgICBHQV9leHBvcnRzICpnYUV4cCwKLSAgICBpYm9vbCBzaGFyZWQpCi17Ci0gICAgKHZvaWQpZ2FFeHA7Ci0gICAgKHZvaWQpc2hhcmVkOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotI2lmbmRlZiBURVNUX0hBUk5FU1MKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTm90aGluZyBzcGVjaWFsIGZvciB0aGlzIE9TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgTkFQSSBHQV9xdWVyeUZ1bmN0aW9ucygKLSAgICBHQV9kZXZDdHggKmRjLAotICAgIE5fdWludDMyIGlkLAotICAgIHZvaWQgX0ZBUl8gKmZ1bmNzKQotewotICAgIHJldHVybiBfX0dBX2V4cG9ydHMuR0FfcXVlcnlGdW5jdGlvbnMoZGMsaWQsZnVuY3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5vdGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBPUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIE5BUEkgUkVGMkRfcXVlcnlGdW5jdGlvbnMoCi0gICAgUkVGMkRfZHJpdmVyICpyZWYyZCwKLSAgICBOX3VpbnQzMiBpZCwKLSAgICB2b2lkIF9GQVJfICpmdW5jcykKLXsKLSAgICByZXR1cm4gX19HQV9leHBvcnRzLlJFRjJEX3F1ZXJ5RnVuY3Rpb25zKHJlZjJkLGlkLGZ1bmNzKTsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWluZyBmdW5jdGlvbnMgZm9yIHRoZQotTnVjbGV1cyBsb2FkZXIgbGlicmFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX1RpbWVySW5pdCh2b2lkKQotewotICAgIGlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKSB7Ci0JaGF2ZVJEVFNDID0gdHJ1ZTsKLQl9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTkFQSSBHQV9UaW1lclJlYWQoCi0gICAgR0FfbGFyZ2VJbnRlZ2VyICp2YWx1ZSkKLXsKLSAgICBpZiAoaGF2ZVJEVFNDKQotCV9HQV9yZWFkVGltZVN0YW1wKHZhbHVlKTsKLSAgICBlbHNlCi0JVlREX0dldF9SZWFsX1RpbWUoJnZhbHVlLT5oaWdoLCZ2YWx1ZS0+bG93KTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYXdpbjMyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ2F3aW4zMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTQ0MzM0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9nYXdpbjMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEdyYXBoaWNzIEFyY2hpdGVjdHVyZQotKgotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGlzIGNvcHlyaWdodGVkIGNvbXB1dGVyIGNvZGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdGVjaG5vbG9neSAgICAgIHwKLSogIHxvd25lZCBieSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuLCBsb2NhdGVkIGF0IDUwNSBXYWxsIFN0cmVldCwgICAgICAgIHwKLSogIHxDaGljbywgQ0EgOTU5MjggVVNBIChodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbSkuICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE51Y2xldXMgICAgICAgIHwKLSogIHxMaWNlbnNlOyB5b3UgbWF5ICpub3QqIHVzZSB0aGlzIGZpbGUgb3IgcmVsYXRlZCBzb2Z0d2FyZSBleGNlcHQgaW4gIHwKLSogIHxjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSAgIHwKLSogIHxhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9udWNsZXVzLWxpY2Vuc2UudHh0ICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgICAgICAgIHwKLSogIHwiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciAgICAgIHwKLSogIHxpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgICAgICAgIHwKLSogIHxyaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSogIHxSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSElTIEhFQURFUiBJUyBTVFJJQ1RMWSBQUk9ISUJJVEVEIEJZIExBV3wKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBXaW4zMgotKgotKiBEZXNjcmlwdGlvbjogIE9TIHNwZWNpZmljIE51Y2xldXMgR3JhcGhpY3MgQXJjaGl0ZWN0dXJlIHNlcnZpY2VzIGZvcgotKiAgICAgICAgICAgICAgIHRoZSBXaW4zMiBvcGVyYXRpbmcgc3lzdGVtIGVudmlyb25tZW50cy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbV9oZWxwLmgiCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2RlZmluZSBTVFJJQ1QKLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBETExfTkFNRSAgICAgICAgIm5nYV93MzIuZGxsIgotCi1leHRlcm4gSEFORExFICAgICAgICAgICBfUE1faERldmljZTsKLXN0YXRpYyBITU9EVUxFICAgICAgICAgIGhNb2RETEwgPSBOVUxMOwotc3RhdGljIGlib29sICAgICAgICAgICAgdXNlUmluZzBEcml2ZXIgPSBmYWxzZTsKLXN0YXRpYyBpYm9vbCAgICAgICAgICAgIGhhdmVSRFRTQzsKLXN0YXRpYyBHQV9sYXJnZUludGVnZXIgIGNvdW50RnJlcTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Mb2FkcyB0aGUgc2hhcmVkICJuZ2FfdzMyLmRsbCIgbGlicmFyeSBmcm9tIGRpc2sgYW5kIGNvbm5lY3RzIHRvIGl0LiBUaGlzCi1saWJyYXJ5IGlzICphbHdheXMqIGxvY2F0ZWQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBOdWNsZXVzCi1ncmFwaGljcy5icGQgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaWJvb2wgTG9hZFNoYXJlZERMTCh2b2lkKQotewotICAgIGNoYXIgICAgICAgICAgICAgICAgZmlsZW5hbWVbUE1fTUFYX1BBVEhdOwotICAgIGNoYXIgICAgICAgICAgICAgICAgYnBkcGF0aFtQTV9NQVhfUEFUSF07Ci0KLSAgICAvKiBDaGVjayBpZiB3ZSBoYXZlIGFscmVhZHkgbG9hZGVkIHRoZSBETEwgKi8KLSAgICBpZiAoaE1vZERMTCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICBQTV9pbml0KCk7Ci0KLSAgICAvKiBPcGVuIHRoZSBETEwgZmlsZSAqLwotICAgIGlmICghUE1fZmluZEJQRChETExfTkFNRSxicGRwYXRoKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgc3RyY3B5KGZpbGVuYW1lLGJwZHBhdGgpOwotICAgIHN0cmNhdChmaWxlbmFtZSxETExfTkFNRSk7Ci0gICAgaWYgKChoTW9kRExMID0gTG9hZExpYnJhcnkoZmlsZW5hbWUpKSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1wYXRoICAgIC0gTG9jYWwgcGF0aCB0byB0aGUgTnVjbGV1cyBkcml2ZXIgZmlsZXMuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHByb2dyYW0gdG8gb3ZlcnJpZGUgdGhlIGxvY2F0aW9uCi1vZiB0aGUgTnVjbGV1cyBkcml2ZXIgZmlsZXMgdGhhdCBhcmUgbG9hZGVkLiBOb3JtYWxseSB0aGUgbG9hZGVyIGNvZGUKLXdpbGwgbG9vayBpbiB0aGUgc3lzdGVtIE51Y2xldXMgZGlyZWN0b3JpZXMgZmlyc3QsIHRoZW4gaW4gdGhlICdkcml2ZXJzJwotZGlyZWN0b3J5IHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBhbmQgZmluYWxseSByZWxhdGl2ZQotdG8gdGhlIE1HTF9ST09UIGVudmlyb25tZW50IHZhcmlhYmxlLgotCi1Ob3RlIHRoYXQgZm9yIFdpbjMyIHdlIGFsc28gY2FsbCBpbnRvIHRoZSBsb2FkZWQgUE1IRUxQIGRldmljZSBkcml2ZXIKLWFzIG5lY2Vzc2FyeSB0byBjaGFuZ2UgdGhlIGxvY2FsIE51Y2xldXMgcGF0aCBmb3Igc3lzdGVtIHdpZGUgTnVjbGV1cwotZHJpdmVycy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgR0Ffc2V0TG9jYWxQYXRoKAotICAgIGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gICAgRFdPUkQgICBpbkJ1ZlsxXTsKLSAgICBEV09SRCAgIG91dEJ1ZlsxXSxvdXRDbnQ7Ci0KLSAgICBQTV9zZXRMb2NhbEJQRFBhdGgocGF0aCk7Ci0gICAgaWYgKF9QTV9oRGV2aWNlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0JaW5CdWZbMF0gPSAoRFdPUkQpcGF0aDsKLQlEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9HQVNFVExPQ0FMUEFUSDMyLAotCSAgICBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJm91dENudCwgTlVMTCk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVUVVJOUzoKLVBvaW50ZXIgdG8gdGhlIHN5c3RlbSB3aWRlIFBNIGxpYnJhcnkgaW1wb3J0cywgb3IgdGhlIGludGVybmFsIHZlcnNpb24gaWYgbm9uZQotCi1SRU1BUktTOgotSW4gb3JkZXIgdG8gc3VwcG9ydCBkZXBsb3lpbmcgbmV3IE51Y2xldXMgZHJpdmVycyB0aGF0IG1heSByZXF1aXJlIHVwZGF0ZWQKLVBNIGxpYnJhcnkgZnVuY3Rpb25zLCB3ZSBjaGVjayBoZXJlIHRvIHNlZSBpZiB0aGVyZSBpcyBhIHN5c3RlbSB3aWRlIHZlcnNpb24KLW9mIHRoZSBQTSBmdW5jdGlvbnMgYXZhaWxhYmxlLiBJZiBzbyB3ZSByZXR1cm4gdGhvc2UgZnVuY3Rpb25zIGZvciB1c2Ugd2l0aAotdGhlIHN5c3RlbSB3aWRlIE51Y2xldXMgZHJpdmVycywgb3RoZXJ3aXNlIHRoZSBjb21waWxlZCBpbiB2ZXJzaW9uIG9mIHRoZSBQTQotbGlicmFyeSBpcyB1c2VkIHdpdGggdGhlIGFwcGxpY2F0aW9uIGxvY2FsIHZlcnNpb24gb2YgTnVjbGV1cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1QTV9pbXBvcnRzICogTkFQSSBHQV9nZXRTeXN0ZW1QTUltcG9ydHModm9pZCkKLXsKLSAgICBQTV9pbXBvcnRzICogcG1JbXA7Ci0gICAgUE1faW1wb3J0cyAqIChOQVBJUCBfR0FfZ2V0U3lzdGVtUE1JbXBvcnRzKSh2b2lkKTsKLQotICAgIGlmIChMb2FkU2hhcmVkRExMKCkpIHsKLQkvKiBOb3RlIHRoYXQgVmlzdWFsIEMrKyBidWlsZCBETEwncyB3aXRoIG9ubHkgYSBzaW5nbGUgdW5kZXJzY29yZSBpbiBmcm9udAotCSAqIG9mIHRoZSBleHBvcnRlZCBuYW1lIHdoaWxlIFdhdGNvbSBDIHByb3ZpZGVzIHR3byBvZiB0aGVtLiBXZSBjaGVjayBmb3IKLQkgKiBib3RoIHRvIGFsbG93IHdvcmtpbmcgd2l0aCBlaXRoZXIgY29tcGlsZWQgRExMLgotCSAqLwotCWlmICgoX0dBX2dldFN5c3RlbVBNSW1wb3J0cyA9ICh2b2lkKilHZXRQcm9jQWRkcmVzcyhoTW9kRExMLCJfR0FfZ2V0U3lzdGVtUE1JbXBvcnRzIikpICE9IE5VTEwpIHsKLQkgICAgaWYgKChfR0FfZ2V0U3lzdGVtUE1JbXBvcnRzID0gKHZvaWQqKUdldFByb2NBZGRyZXNzKGhNb2RETEwsIl9fR0FfZ2V0U3lzdGVtUE1JbXBvcnRzIikpICE9IE5VTEwpIHsKLQkJcG1JbXAgPSBfR0FfZ2V0U3lzdGVtUE1JbXBvcnRzKCk7Ci0JCW1lbWNweSgmX1BNX2ltcG9ydHMscG1JbXAsTUlOKF9QTV9pbXBvcnRzLmR3U2l6ZSxwbUltcC0+ZHdTaXplKSk7Ci0JCXJldHVybiBwbUltcDsKLQkJfQotCSAgICB9Ci0JfQotICAgIHJldHVybiAmX1BNX2ltcG9ydHM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZ2FFeHAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSBleHBvcnRlZCBmdW5jdGlvbnMKLXNoYXJlZCAgLSBUcnVlIGlmIGNvbm5lY3RpbmcgdG8gdGhlIHNoYXJlZCwgZ2xvYmFsIE51Y2xldXMgZHJpdmVyCi0KLVJFTUFSS1M6Ci1Gb3IgV2luMzIgaWYgd2UgYXJlIGNvbm5lY3RpbmcgdG8gdGhlIHNoYXJlZCwgZ2xvYmFsIE51Y2xldXMgZHJpdmVyIChsb2FkZWQKLWF0IHJpbmcgMCkgdGhlbiB3ZSBuZWVkIHRvIGxvYWQgYSBzcGVjaWFsIG5nYV93MzIuZGxsIGxpYnJhcnkgd2hpY2ggY29udGFpbnMKLXRodW5rcyB0byBjYWxsIGRvd24gaW50byB0aGUgUmluZyAwIGRldmljZSBkcml2ZXIgYXMgbmVjZXNzYXJ5LiBJZiB3ZSBhcmUKLWNvbm5lY3RpbmcgdG8gdGhlIGFwcGxpY2F0aW9uIGxvY2FsIE51Y2xldXMgZHJpdmVycyAoaWU6IE51Y2xldXMgb24gRGlyZWN0RHJhdwotZW11bGF0aW9uIGxheWVyKSB0aGVuIHdlIGRvIG5vdGhpbmcgaGVyZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX2dldFNoYXJlZEV4cG9ydHMoCi0gICAgR0FfZXhwb3J0cyAqZ2FFeHAsCi0gICAgaWJvb2wgc2hhcmVkKQotewotICAgIEdBX2V4cG9ydHMgKiBleHA7Ci0gICAgR0FfZXhwb3J0cyAqIChOQVBJUCBfR0FfZ2V0U3lzdGVtR0FFeHBvcnRzKSh2b2lkKTsKLQotICAgIHVzZVJpbmcwRHJpdmVyID0gZmFsc2U7Ci0gICAgaWYgKHNoYXJlZCkgewotCWlmICghTG9hZFNoYXJlZERMTCgpKQotCSAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gbG9hZCAiIERMTF9OQU1FICIhIik7Ci0JaWYgKChfR0FfZ2V0U3lzdGVtR0FFeHBvcnRzID0gKHZvaWQqKUdldFByb2NBZGRyZXNzKGhNb2RETEwsIl9HQV9nZXRTeXN0ZW1HQUV4cG9ydHMiKSkgPT0gTlVMTCkKLQkgICAgaWYgKChfR0FfZ2V0U3lzdGVtR0FFeHBvcnRzID0gKHZvaWQqKUdldFByb2NBZGRyZXNzKGhNb2RETEwsIl9fR0FfZ2V0U3lzdGVtR0FFeHBvcnRzIikpID09IE5VTEwpCi0JCVBNX2ZhdGFsRXJyb3IoIlVuYWJsZSB0byBsb2FkICIgRExMX05BTUUgIiEiKTsKLQlleHAgPSBfR0FfZ2V0U3lzdGVtR0FFeHBvcnRzKCk7Ci0JbWVtY3B5KGdhRXhwLGV4cCxNSU4oZ2FFeHAtPmR3U2l6ZSxleHAtPmR3U2l6ZSkpOwotCXVzZVJpbmcwRHJpdmVyID0gdHJ1ZTsKLQlyZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0jaWZuZGVmIFRFU1RfSEFSTkVTUwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX3F1ZXJ5RnVuY3Rpb25zKAotICAgIEdBX2RldkN0eCAqZGMsCi0gICAgTl91aW50MzIgaWQsCi0gICAgdm9pZCBfRkFSXyAqZnVuY3MpCi17Ci0gICAgc3RhdGljIGlib29sIChOQVBJUCBfR0FfcXVlcnlGdW5jdGlvbnMpKEdBX2RldkN0eCAqZGMsTl91aW50MzIgaWQsdm9pZCBfRkFSXyAqZnVuY3MpID0gTlVMTDsKLQotICAgIGlmICh1c2VSaW5nMERyaXZlcikgewotCS8qIENhbGwgdGhlIHZlcnNpb24gaW4gbmdhX3czMi5kbGwgaWYgaXQgaXMgbG9hZGVkICovCi0JaWYgKCFfR0FfcXVlcnlGdW5jdGlvbnMpIHsKLQkgICAgaWYgKChfR0FfcXVlcnlGdW5jdGlvbnMgPSAodm9pZCopR2V0UHJvY0FkZHJlc3MoaE1vZERMTCwiX0dBX3F1ZXJ5RnVuY3Rpb25zIikpID09IE5VTEwpCi0JCWlmICgoX0dBX3F1ZXJ5RnVuY3Rpb25zID0gKHZvaWQqKUdldFByb2NBZGRyZXNzKGhNb2RETEwsIl9fR0FfcXVlcnlGdW5jdGlvbnMiKSkgPT0gTlVMTCkKLQkJICAgIFBNX2ZhdGFsRXJyb3IoIlVuYWJsZSB0byBnZXQgZXhwb3J0cyBmcm9tICIgRExMX05BTUUgIiEiKTsKLQkgICAgfQotCXJldHVybiBfR0FfcXVlcnlGdW5jdGlvbnMoZGMsaWQsZnVuY3MpOwotCX0KLSAgICByZXR1cm4gX19HQV9leHBvcnRzLkdBX3F1ZXJ5RnVuY3Rpb25zKGRjLGlkLGZ1bmNzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Ob3RoaW5nIHNwZWNpYWwgZm9yIHRoaXMgT1MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIFJFRjJEX3F1ZXJ5RnVuY3Rpb25zKAotICAgIFJFRjJEX2RyaXZlciAqcmVmMmQsCi0gICAgTl91aW50MzIgaWQsCi0gICAgdm9pZCBfRkFSXyAqZnVuY3MpCi17Ci0gICAgc3RhdGljIGlib29sIChOQVBJUCBfUkVGMkRfcXVlcnlGdW5jdGlvbnMpKFJFRjJEX2RyaXZlciAqcmVmMmQsTl91aW50MzIgaWQsdm9pZCBfRkFSXyAqZnVuY3MpID0gTlVMTDsKLQotICAgIGlmICh1c2VSaW5nMERyaXZlcikgewotCS8qIENhbGwgdGhlIHZlcnNpb24gaW4gbmdhX3czMi5kbGwgaWYgaXQgaXMgbG9hZGVkICovCi0JaWYgKCFfUkVGMkRfcXVlcnlGdW5jdGlvbnMpIHsKLQkgICAgaWYgKChfUkVGMkRfcXVlcnlGdW5jdGlvbnMgPSAodm9pZCopR2V0UHJvY0FkZHJlc3MoaE1vZERMTCwiX1JFRjJEX3F1ZXJ5RnVuY3Rpb25zIikpID09IE5VTEwpCi0JCWlmICgoX1JFRjJEX3F1ZXJ5RnVuY3Rpb25zID0gKHZvaWQqKUdldFByb2NBZGRyZXNzKGhNb2RETEwsIl9fUkVGMkRfcXVlcnlGdW5jdGlvbnMiKSkgPT0gTlVMTCkKLQkJICAgIFBNX2ZhdGFsRXJyb3IoIlVuYWJsZSB0byBnZXQgZXhwb3J0cyBmcm9tICIgRExMX05BTUUgIiEiKTsKLQkgICAgfQotCXJldHVybiBfUkVGMkRfcXVlcnlGdW5jdGlvbnMocmVmMmQsaWQsZnVuY3MpOwotCX0KLSAgICByZXR1cm4gX19HQV9leHBvcnRzLlJFRjJEX3F1ZXJ5RnVuY3Rpb25zKHJlZjJkLGlkLGZ1bmNzKTsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIGhpZ2ggcHJlY2lzaW9uIHRpbWluZyBmdW5jdGlvbnMgZm9yIHRoZQotTnVjbGV1cyBsb2FkZXIgbGlicmFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBOQVBJIEdBX1RpbWVySW5pdCh2b2lkKQotewotICAgIGlmIChfR0FfaGF2ZUNQVUlEKCkgJiYgKF9HQV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwKSB7Ci0JaGF2ZVJEVFNDID0gdHJ1ZTsKLQlyZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgZWxzZSBpZiAoUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgoTEFSR0VfSU5URUdFUiopJmNvdW50RnJlcSkpIHsKLQloYXZlUkRUU0MgPSBmYWxzZTsKLQlyZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE5BUEkgR0FfVGltZXJSZWFkKAotICAgIEdBX2xhcmdlSW50ZWdlciAqdmFsdWUpCi17Ci0gICAgaWYgKGhhdmVSRFRTQykKLQlfR0FfcmVhZFRpbWVTdGFtcCh2YWx1ZSk7Ci0gICAgZWxzZQotCVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKChMQVJHRV9JTlRFR0VSKil2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ3RmY2FsYy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2d0ZmNhbGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ1NDdlOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vZ3RmY2FsYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFZFU0EgR2VuZXJhbGl6ZWQgVGltaW5nIEZvcm11bGEgKEdURikKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAxLjEKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIERldmVsb3BlZCBieTogU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueS4KLSoKLSogRGVzY3JpcHRpb246ICBDIG1vZHVsZSBmb3IgZ2VuZXJhdGluZyBHVEYgY29tcGF0aWJsZSB0aW1pbmdzIGdpdmVuIGEgc2V0Ci0qICAgICAgICAgICAgICAgb2YgaW5wdXQgcmVxdWlyZW1lbnRzLiBUcmFuc2xhdGVkIGZyb20gdGhlIG9yaWdpbmFsIEdURgotKiAgICAgICAgICAgICAgIDEuMTQgc3ByZWFkc2hlZXQgZGVmaW5pdGlvbi4KLSoKLSogICAgICAgICAgICAgICBDb21waWxlIHdpdGggI2RlZmluZSBURVNUSU5HIHRvIGJ1aWxkIGEgY29tbWFuZCBsaW5lIHRlc3QKLSogICAgICAgICAgICAgICBwcm9ncmFtLgotKgotKiAgICAgICAgICAgICAgIE5PVEU6IFRoZSBjb2RlIGluIGhlcmUgaGFzIGJlZW4gd3JpdHRlbiBmb3IgY2xhcml0eSBhbmQKLSogICAgICAgICAgICAgICAgICAgICB0byBmb2xsb3cgdGhlIG9yaWdpbmFsIEdURiBzcGVjIGFzIGNsb3NlbHkgYXMKLSogICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJndGYuaCIKLSNpZm5kZWYgX19XSU4zMl9WWERfXwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIEdURl9jb25zdGFudHMgR0MgPSB7Ci0gICAgMS44LCAgICAgICAgICAgICAgICAgICAgLyogTWFyZ2luIHNpemUgYXMgcGVyY2VudGFnZSBvZiBkaXNwbGF5ICAgICAqLwotICAgIDgsICAgICAgICAgICAgICAgICAgICAgIC8qIENoYXJhY3RlciBjZWxsIGdyYW51bGFyaXR5ICAgICAgICAgICAgICAgKi8KLSAgICAxLCAgICAgICAgICAgICAgICAgICAgICAvKiBNaW5pbXVtIGZyb250IHBvcmNoIGluIGxpbmVzL2NoYXJzICAgICAgICovCi0gICAgMywgICAgICAgICAgICAgICAgICAgICAgLyogV2lkdGggb2YgViBzeW5jIGluIGxpbmVzICAgICAgICAgICAgICAgICAqLwotICAgIDgsICAgICAgICAgICAgICAgICAgICAgIC8qIFdpZHRoIG9mIEggc3luYyBhcyBwZXJjZW50IG9mIHRvdGFsICAgICAgKi8KLSAgICA1NTAsICAgICAgICAgICAgICAgICAgICAvKiBNaW5pbXVtIHZlcnRpY2FsIHN5bmMgKyBiYWNrIHBvcmNoICh1cykgICovCi0gICAgNjAwLCAgICAgICAgICAgICAgICAgICAgLyogQmxhbmtpbmcgZm9ybXVsYSBncmFkaWVudCAgICAgICAgICAgICAgICAqLwotICAgIDQwLCAgICAgICAgICAgICAgICAgICAgIC8qIEJsYW5raW5nIGZvcm11bGEgb2Zmc2V0ICAgICAgICAgICAgICAgICAgKi8KLSAgICAxMjgsICAgICAgICAgICAgICAgICAgICAvKiBCbGFua2luZyBmb3JtdWxhIHNjYWxpbmcgZmFjdG9yICAgICAgICAgICovCi0gICAgMjAsICAgICAgICAgICAgICAgICAgICAgLyogQmxhbmtpbmcgZm9ybXVsYSBzY2FsaW5nIGZhY3RvciB3ZWlnaHQgICAqLwotICAgIH07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiBfX1dJTjMyX1ZYRF9fCi0vKiBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gYSBWeEQsIHNvIHdlIHN0dWIgdGhlbSBvdXQgc28gdGhpcwotICogbW9kdWxlIHdpbGwgYXQgbGVhc3QgY29tcGlsZS4gQ2FsbGluZyB0aGUgZnVuY3Rpb25zIGluIGhlcmUgd2lsbCBkbwotICogc29tZXRoaW5nIHdpZXJkIQotICovCi1kb3VibGUgc3FydChkb3VibGUgeCkKLXsgcmV0dXJuIHg7IH0KLQotZG91YmxlIGZsb29yKGRvdWJsZSB4KQoteyByZXR1cm4geDsgfQotCi1kb3VibGUgcG93KGRvdWJsZSB4LGRvdWJsZSB5KQoteyByZXR1cm4geCp5OyB9Ci0jZW5kaWYKLQotc3RhdGljIGRvdWJsZSByb3VuZChkb3VibGUgdikKLXsKLSAgICByZXR1cm4gZmxvb3IodiArIDAuNSk7Ci19Ci0KLXN0YXRpYyB2b2lkIEdldEludGVybmFsQ29uc3RhbnRzKEdURl9jb25zdGFudHMgKmMpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIEdldEludGVybmFsQ29uc3RhbnRzCi0qIFBhcmFtZXRlcnM6ICAgYyAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIGludGVybmFsIGNvbnN0YW50cwotKgotKiBEZXNjcmlwdGlvbjogIENhbGN1bGF0ZXMgdGhlIHJvdW5kZWQsIGludGVybmFsIHNldCBvZiBHVEYgY29uc3RhbnRzLgotKiAgICAgICAgICAgICAgIFRoZXNlIGNvbnN0YW50cyBhcmUgZGlmZmVyZW50IHRvIHRoZSByZWFsIEdURiBjb25zdGFudHMKLSogICAgICAgICAgICAgICB0aGF0IGNhbiBiZSBzZXQgdXAgZm9yIHRoZSBtb25pdG9yLiBUaGUgY2FsY3VsYXRpb25zIHRvCi0qICAgICAgICAgICAgICAgZ2V0IHRoZXNlIHJlYWwgY29uc3RhbnRzIGFyZSBkZWZpbmVkIGluIHRoZSAnV29yayBBcmVhJwotKiAgICAgICAgICAgICAgIGFmdGVyIHRoZSBjb25zdGFudHMgYXJlIGRlZmluZWQgaW4gdGhlIEV4Y2VsIHNwcmVhZHNoZWV0LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBjLT5tYXJnaW4gPSBHQy5tYXJnaW47Ci0gICAgYy0+Y2VsbEdyYW4gPSByb3VuZChHQy5jZWxsR3Jhbik7Ci0gICAgYy0+bWluUG9yY2ggPSByb3VuZChHQy5taW5Qb3JjaCk7Ci0gICAgYy0+dlN5bmNScWQgPSByb3VuZChHQy52U3luY1JxZCk7Ci0gICAgYy0+aFN5bmMgPSBHQy5oU3luYzsKLSAgICBjLT5taW5WU3luY0JQID0gR0MubWluVlN5bmNCUDsKLSAgICBpZiAoR0MuayA9PSAwKQotCWMtPmsgPSAwLjAwMTsKLSAgICBlbHNlCi0JYy0+ayA9IEdDLms7Ci0gICAgYy0+bSA9IChjLT5rIC8gMjU2KSAqIEdDLm07Ci0gICAgYy0+YyA9IChHQy5jIC0gR0MuaikgKiAoYy0+ayAvIDI1NikgKyBHQy5qOwotICAgIGMtPmogPSBHQy5qOwotfQotCi12b2lkIEdURl9jYWxjVGltaW5ncyhkb3VibGUgaFBpeGVscyxkb3VibGUgdkxpbmVzLGRvdWJsZSBmcmVxLAotICAgIGludCB0eXBlLGlib29sIHdhbnRNYXJnaW5zLGlib29sIHdhbnRJbnRlcmxhY2UsR1RGX3RpbWluZ3MgKnQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIEdURl9jYWxjVGltaW5ncwotKiBQYXJhbWV0ZXJzOiAgIGhQaXhlbHMgICAgIC0gWCByZXNvbHV0aW9uCi0qICAgICAgICAgICAgICAgdkxpbmVzICAgICAgLSBZIHJlc29sdXRpb24KLSogICAgICAgICAgICAgICBmcmVxICAgICAgICAtIEZyZXF1ZW5jeSAoSHosIEtIeiBvciBNSHogZGVwZW5kaW5nIG9uIHR5cGUpCi0qICAgICAgICAgICAgICAgdHlwZSAgICAgICAgLSAxIC0gdmVydGljYWwsIDIgLSBob3Jpem9udGFsLCAzIC0gZG90IGNsb2NrCi0qICAgICAgICAgICAgICAgbWFyZ2lucyAgICAgLSBUcnVlIGlmIG1hcmdpbnMgc2hvdWxkIGJlIGdlbmVyYXRlZAotKiAgICAgICAgICAgICAgIGludGVybGFjZSAgIC0gVHJ1ZSBpZiBpbnRlcmxhY2VkIHRpbWluZ3MgdG8gYmUgZ2VuZXJhdGVkCi0qICAgICAgICAgICAgICAgdCAgICAgICAgICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgcmVzdWx0aW5nIHRpbWluZ3MKLSoKLSogRGVzY3JpcHRpb246ICBDYWxjdWxhdGVzIGEgc2V0IG9mIEdURiB0aW1pbmcgcGFyYW1ldGVycyBnaXZlbiBhIHNwZWNpZmllZAotKiAgICAgICAgICAgICAgIHJlc29sdXRpb24gYW5kIHZlcnRpY2FsIGZyZXF1ZW5jeS4gVGhlIGhvcml6b250YWwgZnJlcXVlbmN5Ci0qICAgICAgICAgICAgICAgYW5kIGRvdCBjbG9jayB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoaXMKLSogICAgICAgICAgICAgICByb3V0aW5lcy4KLSoKLSogICAgICAgICAgICAgICBGb3IgaW50ZXJsYWNlZCBtb2RlcyB0aGUgQ1JUQyBwYXJhbWV0ZXJzIGFyZSBjYWxjdWxhdGVkIGZvcgotKiAgICAgICAgICAgICAgIGEgc2luZ2xlIGZpZWxkLCBzbyB3aWxsIGJlIGhhbGYgd2hhdCB3b3VsZCBiZSB1c2VkIGluCi0qICAgICAgICAgICAgICAgYSBub24taW50ZXJsYWNlZCBtb2RlLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBkb3VibGUgICAgICAgICAgaW50ZXJsYWNlLHZGaWVsZFJhdGUsaFBlcmlvZDsKLSAgICBkb3VibGUgICAgICAgICAgdG9wTWFyZ2luTGluZXMsYm90TWFyZ2luTGluZXM7Ci0gICAgZG91YmxlICAgICAgICAgIGxlZnRNYXJnaW5QaXhlbHMscmlnaHRNYXJnaW5QaXhlbHM7Ci0gICAgZG91YmxlICAgICAgICAgIGhQZXJpb2RFc3QsdlN5bmNCUCx2QmFja1BvcmNoOwotICAgIGRvdWJsZSAgICAgICAgICB2VG90YWxMaW5lcyx2RmllbGRSYXRlRXN0OwotICAgIGRvdWJsZSAgICAgICAgICBoVG90YWxQaXhlbHMsaFRvdGFsQWN0aXZlUGl4ZWxzLGhCbGFua1BpeGVsczsKLSAgICBkb3VibGUgICAgICAgICAgaWRlYWxEdXR5Q3ljbGUsaFN5bmNXaWR0aCxoU3luY0JQLGhCYWNrUG9yY2g7Ci0gICAgZG91YmxlICAgICAgICAgIGlkZWFsSFBlcmlvZDsKLSAgICBkb3VibGUgICAgICAgICAgdkZyZXEsaEZyZXEsZG90Q2xvY2s7Ci0gICAgR1RGX2NvbnN0YW50cyAgIGM7Ci0KLSAgICAvKiBHZXQgcm91bmRlZCBHVEYgY29uc3RhbnRzIHVzZWQgZm9yIGludGVybmFsIGNhbGN1bGF0aW9ucyAqLwotICAgIEdldEludGVybmFsQ29uc3RhbnRzKCZjKTsKLQotICAgIC8qIE1vdmUgaW5wdXQgcGFyYW1ldGVycyBpbnRvIGFwcHJvcHJpYXRlIHZhcmlhYmxlcyAqLwotICAgIHZGcmVxID0gaEZyZXEgPSBkb3RDbG9jayA9IGZyZXE7Ci0KLSAgICAvKiBSb3VuZCBwaXhlbHMgdG8gY2hhcmFjdGVyIGNlbGwgZ3JhbnVsYXJpdHkgKi8KLSAgICBoUGl4ZWxzID0gcm91bmQoaFBpeGVscyAvIGMuY2VsbEdyYW4pICogYy5jZWxsR3JhbjsKLQotICAgIC8qIEZvciBpbnRlcmxhY2VkIG1vZGUgaGFsdmUgdGhlIHZlcnRpY2FsIHBhcmFtZXRlcnMsIGFuZCBkb3VibGUKLSAgICAgKiB0aGUgcmVxdWlyZWQgZmllbGQgcmVmcmVzaCByYXRlLgotICAgICAqLwotICAgIHZGaWVsZFJhdGUgPSB2RnJlcTsKLSAgICBpbnRlcmxhY2UgPSAwOwotICAgIGlmICh3YW50SW50ZXJsYWNlKQotCWRvdENsb2NrICo9IDI7Ci0KLSAgICAvKiBEZXRlcm1pbmUgdGhlIGxpbmVzIGZvciBtYXJnaW5zICovCi0gICAgaWYgKHdhbnRNYXJnaW5zKSB7Ci0JdG9wTWFyZ2luTGluZXMgPSByb3VuZChjLm1hcmdpbiAvIDEwMCAqIHZMaW5lcyk7Ci0JYm90TWFyZ2luTGluZXMgPSByb3VuZChjLm1hcmdpbiAvIDEwMCAqIHZMaW5lcyk7Ci0JfQotICAgIGVsc2UgewotCXRvcE1hcmdpbkxpbmVzID0gMDsKLQlib3RNYXJnaW5MaW5lcyA9IDA7Ci0JfQotCi0gICAgaWYgKHR5cGUgIT0gR1RGX2xvY2tQRikgewotCWlmICh0eXBlID09IEdURl9sb2NrVkYpIHsKLQkgICAgLyogRXN0aW1hdGUgdGhlIGhvcml6b250YWwgcGVyaW9kICovCi0JICAgIGhQZXJpb2RFc3QgPSAoKDEvdkZpZWxkUmF0ZSkgLSAoYy5taW5WU3luY0JQLzEwMDAwMDApKSAvCi0JCSh2TGluZXMgKyAoMip0b3BNYXJnaW5MaW5lcykgKyBjLm1pblBvcmNoICsgaW50ZXJsYWNlKSAqIDEwMDAwMDA7Ci0KLQkgICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHZTeW5jICsgYmFjayBwb3JjaCAqLwotCSAgICB2U3luY0JQID0gcm91bmQoYy5taW5WU3luY0JQIC8gaFBlcmlvZEVzdCk7Ci0JICAgIH0KLQllbHNlIGlmICh0eXBlID09IEdURl9sb2NrSEYpIHsKLQkgICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHZTeW5jICsgYmFjayBwb3JjaCAqLwotCSAgICB2U3luY0JQID0gcm91bmQoKGMubWluVlN5bmNCUCAqIGhGcmVxKSAvIDEwMDApOwotCSAgICB9Ci0KLQkvKiBGaW5kIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIFYgYmFjayBwb3JjaCBhbG9uZSAqLwotCXZCYWNrUG9yY2ggPSB2U3luY0JQIC0gYy52U3luY1JxZDsKLQotCS8qIEZpbmQgdGhlIHRvdGFsIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgdmVydGljYWwgcGVyaW9kICovCi0JdlRvdGFsTGluZXMgPSB2TGluZXMgKyB0b3BNYXJnaW5MaW5lcyArIGJvdE1hcmdpbkxpbmVzICsgdlN5bmNCUAotCSAgICArIGludGVybGFjZSArIGMubWluUG9yY2g7Ci0KLQlpZiAodHlwZSA9PSBHVEZfbG9ja1ZGKSB7Ci0JICAgIC8qIEVzdGltYXRlIHRoZSB2ZXJ0aWNhbCBmcmVxdWVuY3kgKi8KLQkgICAgdkZpZWxkUmF0ZUVzdCA9IDEwMDAwMDAgLyAoaFBlcmlvZEVzdCAqIHZUb3RhbExpbmVzKTsKLQotCSAgICAvKiBGaW5kIHRoZSBhY3R1YWwgaG9yaXpvbnRhbCBwZXJpb2QgKi8KLQkgICAgaFBlcmlvZCA9IChoUGVyaW9kRXN0ICogdkZpZWxkUmF0ZUVzdCkgLyB2RmllbGRSYXRlOwotCi0JICAgIC8qIEZpbmQgdGhlIGFjdHVhbCB2ZXJ0aWNhbCBmaWVsZCBmcmVxdWVuY3kgKi8KLQkgICAgdkZpZWxkUmF0ZSA9IDEwMDAwMDAgLyAoaFBlcmlvZCAqIHZUb3RhbExpbmVzKTsKLQkgICAgfQotCWVsc2UgaWYgKHR5cGUgPT0gR1RGX2xvY2tIRikgewotCSAgICAvKiBGaW5kIHRoZSBhY3R1YWwgdmVydGljYWwgZmllbGQgZnJlcXVlbmN5ICovCi0JICAgIHZGaWVsZFJhdGUgPSAoaEZyZXEgLyB2VG90YWxMaW5lcykgKiAxMDAwOwotCSAgICB9Ci0JfQotCi0gICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIHBpeGVscyBpbiB0aGUgbGVmdCBhbmQgcmlnaHQgbWFyZ2lucyAqLwotICAgIGlmICh3YW50TWFyZ2lucykgewotCWxlZnRNYXJnaW5QaXhlbHMgPSByb3VuZChoUGl4ZWxzICogYy5tYXJnaW4pIC8gKDEwMCAqIGMuY2VsbEdyYW4pOwotCXJpZ2h0TWFyZ2luUGl4ZWxzID0gcm91bmQoaFBpeGVscyAqIGMubWFyZ2luKSAvICgxMDAgKiBjLmNlbGxHcmFuKTsKLQl9Ci0gICAgZWxzZSB7Ci0JbGVmdE1hcmdpblBpeGVscyA9IDA7Ci0JcmlnaHRNYXJnaW5QaXhlbHMgPSAwOwotCX0KLQotICAgIC8qIEZpbmQgdGhlIHRvdGFsIG51bWJlciBvZiBhY3RpdmUgcGl4ZWxzIGluIGltYWdlICsgbWFyZ2lucyAqLwotICAgIGhUb3RhbEFjdGl2ZVBpeGVscyA9IGhQaXhlbHMgKyBsZWZ0TWFyZ2luUGl4ZWxzICsgcmlnaHRNYXJnaW5QaXhlbHM7Ci0KLSAgICBpZiAodHlwZSA9PSBHVEZfbG9ja1ZGKSB7Ci0JLyogRmluZCB0aGUgaWRlYWwgYmxhbmtpbmcgZHV0eSBjeWNsZSAqLwotCWlkZWFsRHV0eUN5Y2xlID0gYy5jIC0gKChjLm0gKiBoUGVyaW9kKSAvIDEwMDApOwotCX0KLSAgICBlbHNlIGlmICh0eXBlID09IEdURl9sb2NrSEYpIHsKLQkvKiBGaW5kIHRoZSBpZGVhbCBibGFua2luZyBkdXR5IGN5Y2xlICovCi0JaWRlYWxEdXR5Q3ljbGUgPSBjLmMgLSAoYy5tIC8gaEZyZXEpOwotCX0KLSAgICBlbHNlIGlmICh0eXBlID09IEdURl9sb2NrUEYpIHsKLQkvKiBGaW5kIGlkZWFsIGhvcml6b250YWwgcGVyaW9kIGZyb20gYmxhbmtpbmcgZHV0eSBjeWNsZSBmb3JtdWxhICovCi0JaWRlYWxIUGVyaW9kID0gKCgoYy5jIC0gMTAwKSArIChzcXJ0KChwb3coMTAwLWMuYywyKSkgKwotCSAgICAoMC40ICogYy5tICogKGhUb3RhbEFjdGl2ZVBpeGVscyArIHJpZ2h0TWFyZ2luUGl4ZWxzICsKLQkgICAgbGVmdE1hcmdpblBpeGVscykgLyBkb3RDbG9jaykpKSkgLyAoMiAqIGMubSkpICogMTAwMDsKLQotCS8qIEZpbmQgdGhlIGlkZWFsIGJsYW5raW5nIGR1dHkgY3ljbGUgKi8KLQlpZGVhbER1dHlDeWNsZSA9IGMuYyAtICgoYy5tICogaWRlYWxIUGVyaW9kKSAvIDEwMDApOwotCX0KLQotICAgIC8qIEZpbmQgdGhlIG51bWJlciBvZiBwaXhlbHMgaW4gYmxhbmtpbmcgdGltZSAqLwotICAgIGhCbGFua1BpeGVscyA9IHJvdW5kKChoVG90YWxBY3RpdmVQaXhlbHMgKiBpZGVhbER1dHlDeWNsZSkgLwotCSgoMTAwIC0gaWRlYWxEdXR5Q3ljbGUpICogYy5jZWxsR3JhbikpICogYy5jZWxsR3JhbjsKLQotICAgIC8qIEZpbmQgdGhlIHRvdGFsIG51bWJlciBvZiBwaXhlbHMgKi8KLSAgICBoVG90YWxQaXhlbHMgPSBoVG90YWxBY3RpdmVQaXhlbHMgKyBoQmxhbmtQaXhlbHM7Ci0KLSAgICAvKiBGaW5kIHRoZSBob3Jpem9udGFsIGJhY2sgcG9yY2ggKi8KLSAgICBoQmFja1BvcmNoID0gcm91bmQoKGhCbGFua1BpeGVscyAvIDIpIC8gYy5jZWxsR3JhbikgKiBjLmNlbGxHcmFuOwotCi0gICAgLyogRmluZCB0aGUgaG9yaXpvbnRhbCBzeW5jIHdpZHRoICovCi0gICAgaFN5bmNXaWR0aCA9IHJvdW5kKCgoYy5oU3luYy8xMDApICogaFRvdGFsUGl4ZWxzKSAvIGMuY2VsbEdyYW4pICogYy5jZWxsR3JhbjsKLQotICAgIC8qIEZpbmQgdGhlIGhvcml6b250YWwgc3luYyArIGJhY2sgcG9yY2ggKi8KLSAgICBoU3luY0JQID0gaEJhY2tQb3JjaCArIGhTeW5jV2lkdGg7Ci0KLSAgICBpZiAodHlwZSA9PSBHVEZfbG9ja1BGKSB7Ci0JLyogRmluZCB0aGUgaG9yaXpvbnRhbCBmcmVxdWVuY3kgKi8KLQloRnJlcSA9IChkb3RDbG9jayAvIGhUb3RhbFBpeGVscykgKiAxMDAwOwotCi0JLyogRmluZCB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHZTeW5jICsgYmFjayBwb3JjaCAqLwotCXZTeW5jQlAgPSByb3VuZCgoYy5taW5WU3luY0JQICogaEZyZXEpIC8gMTAwMCk7Ci0KLQkvKiBGaW5kIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIFYgYmFjayBwb3JjaCBhbG9uZSAqLwotCXZCYWNrUG9yY2ggPSB2U3luY0JQIC0gYy52U3luY1JxZDsKLQotCS8qIEZpbmQgdGhlIHRvdGFsIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgdmVydGljYWwgcGVyaW9kICovCi0JdlRvdGFsTGluZXMgPSB2TGluZXMgKyB0b3BNYXJnaW5MaW5lcyArIGJvdE1hcmdpbkxpbmVzICsgdlN5bmNCUAotCSAgICArIGludGVybGFjZSArIGMubWluUG9yY2g7Ci0KLQkvKiBGaW5kIHRoZSBhY3R1YWwgdmVydGljYWwgZmllbGQgZnJlcXVlbmN5ICovCi0JdkZpZWxkUmF0ZSA9IChoRnJlcSAvIHZUb3RhbExpbmVzKSAqIDEwMDA7Ci0JfQotICAgIGVsc2UgewotCWlmICh0eXBlID09IEdURl9sb2NrVkYpIHsKLQkgICAgLyogRmluZCB0aGUgaG9yaXpvbnRhbCBmcmVxdWVuY3kgKi8KLQkgICAgaEZyZXEgPSAxMDAwIC8gaFBlcmlvZDsKLQkgICAgfQotCWVsc2UgaWYgKHR5cGUgPT0gR1RGX2xvY2tIRikgewotCSAgICAvKiBGaW5kIHRoZSBob3Jpem9udGFsIGZyZXF1ZW5jeSAqLwotCSAgICBoUGVyaW9kID0gMTAwMCAvIGhGcmVxOwotCSAgICB9Ci0KLQkvKiBGaW5kIHRoZSBwaXhlbCBjbG9jayBmcmVxdWVuY3kgKi8KLQlkb3RDbG9jayA9IGhUb3RhbFBpeGVscyAvIGhQZXJpb2Q7Ci0JfQotCi0gICAgLyogUmV0dXJuIHRoZSBjb21wdXRlZCBmcmVxdWVuY2llcyAqLwotICAgIHQtPnZGcmVxID0gdkZpZWxkUmF0ZTsKLSAgICB0LT5oRnJlcSA9IGhGcmVxOwotICAgIHQtPmRvdENsb2NrID0gZG90Q2xvY2s7Ci0KLSAgICAvKiBEZXRlcm1pbmUgdGhlIHZlcnRpY2FsIHRpbWluZyBwYXJhbWV0ZXJzICovCi0gICAgdC0+aC5oVG90YWwgPSAoaW50KWhUb3RhbFBpeGVsczsKLSAgICB0LT5oLmhEaXNwID0gKGludCloVG90YWxBY3RpdmVQaXhlbHM7Ci0gICAgdC0+aC5oU3luY1N0YXJ0ID0gdC0+aC5oVG90YWwgLSAoaW50KWhTeW5jQlA7Ci0gICAgdC0+aC5oU3luY0VuZCA9IHQtPmguaFRvdGFsIC0gKGludCloQmFja1BvcmNoOwotICAgIHQtPmguaEZyb250UG9yY2ggPSB0LT5oLmhTeW5jU3RhcnQgLSB0LT5oLmhEaXNwOwotICAgIHQtPmguaFN5bmNXaWR0aCA9IChpbnQpaFN5bmNXaWR0aDsKLSAgICB0LT5oLmhCYWNrUG9yY2ggPSAoaW50KWhCYWNrUG9yY2g7Ci0KLSAgICAvKiBEZXRlcm1pbmUgdGhlIHZlcnRpY2FsIHRpbWluZyBwYXJhbWV0ZXJzICovCi0gICAgdC0+di52VG90YWwgPSAoaW50KXZUb3RhbExpbmVzOwotICAgIHQtPnYudkRpc3AgPSAoaW50KXZMaW5lczsKLSAgICB0LT52LnZTeW5jU3RhcnQgPSB0LT52LnZUb3RhbCAtIChpbnQpdlN5bmNCUDsKLSAgICB0LT52LnZTeW5jRW5kID0gdC0+di52VG90YWwgLSAoaW50KXZCYWNrUG9yY2g7Ci0gICAgdC0+di52RnJvbnRQb3JjaCA9IHQtPnYudlN5bmNTdGFydCAtIHQtPnYudkRpc3A7Ci0gICAgdC0+di52U3luY1dpZHRoID0gKGludCljLnZTeW5jUnFkOwotICAgIHQtPnYudkJhY2tQb3JjaCA9IChpbnQpdkJhY2tQb3JjaDsKLSAgICBpZiAod2FudEludGVybGFjZSkgewotCS8qIEhhbHZlIHRoZSB0aW1pbmdzIGZvciBpbnRlcmxhY2VkIG1vZGVzICovCi0JdC0+di52VG90YWwgLz0gMjsKLQl0LT52LnZEaXNwIC89IDI7Ci0JdC0+di52U3luY1N0YXJ0IC89IDI7Ci0JdC0+di52U3luY0VuZCAvPSAyOwotCXQtPnYudkZyb250UG9yY2ggLz0gMjsKLQl0LT52LnZTeW5jV2lkdGggLz0gMjsKLQl0LT52LnZCYWNrUG9yY2ggLz0gMjsKLQl0LT5kb3RDbG9jayAvPSAyOwotCX0KLQotICAgIC8qIE1hcmsgYXMgR1RGIHRpbWluZyB1c2luZyB0aGUgc3luYyBwb2xhcml0aWVzICovCi0gICAgdC0+aW50ZXJsYWNlID0gKHdhbnRJbnRlcmxhY2UpID8gJ0knIDogJ04nOwotICAgIHQtPmhTeW5jUG9sID0gJy0nOwotICAgIHQtPnZTeW5jUG9sID0gJysnOwotfQotCi12b2lkIEdURl9nZXRDb25zdGFudHMoR1RGX2NvbnN0YW50cyAqY29uc3RhbnRzKQoteyAqY29uc3RhbnRzID0gR0M7IH0KLQotdm9pZCBHVEZfc2V0Q29uc3RhbnRzKEdURl9jb25zdGFudHMgKmNvbnN0YW50cykKLXsgR0MgPSAqY29uc3RhbnRzOyB9Ci0KLSNpZmRlZiAgVEVTVElOR19HVEYKLQotdm9pZCBtYWluKGludCBhcmdjLGNoYXIgKmFyZ3ZbXSkKLXsKLSAgICBGSUxFICAgICAgICAqZjsKLSAgICBkb3VibGUgICAgICB4UGl4ZWxzLHlQaXhlbHMsZnJlcTsKLSAgICBpYm9vbCAgICAgICBpbnRlcmxhY2U7Ci0gICAgR1RGX3RpbWluZ3MgdDsKLQotICAgIGlmIChhcmdjICE9IDUgJiYgYXJnYyAhPSA2KSB7Ci0JcHJpbnRmKCJVc2FnZTogR1RGQ0FMQyA8eFBpeGVscz4gPHlQaXhlbHM+IDxmcmVxPiBbW0h6XSBbS0h6XSBbTUh6XV0gW0ldXG4iKTsKLQlwcmludGYoIlxuIik7Ci0JcHJpbnRmKCJ3aGVyZSA8eFBpeGVscz4gaXMgdGhlIGhvcml6b250YWwgcmVzb2x1dGlvbiBvZiB0aGUgbW9kZSwgPHlQaXhlbHM+IGlzIHRoZVxuIik7Ci0JcHJpbnRmKCJ2ZXJ0aWNhbCByZXNvbHV0aW9uIG9mIHRoZSBtb2RlLiBUaGUgPGZyZXE+IHZhbHVlIHdpbGwgYmUgdGhlIGZyZXF1ZW5jeSB0b1xuIik7Ci0JcHJpbnRmKCJkcml2ZSB0aGUgY2FsY3VsYXRpb25zLCBhbmQgd2lsbCBiZSBlaXRoZXIgdGhlIHZlcnRpY2FsIGZyZXF1ZW5jeSAoaW4gSHopXG4iKTsKLQlwcmludGYoInRoZSBob3Jpem9udGFsIGZyZXF1ZW5jeSAoaW4gS0h6KSBvciB0aGUgZG90IGNsb2NrIChpbiBNSHopLiBUbyBnZW5lcmF0ZVxuIik7Ci0JcHJpbnRmKCJ0aW1pbmdzIGZvciBhbiBpbnRlcmxhY2VkIG1vZGUsIGFkZCAnSScgdG8gdGhlIGVuZCBvZiB0aGUgY29tbWFuZCBsaW5lLlxuIik7Ci0JcHJpbnRmKCJcbiIpOwotCXByaW50ZigiRm9yIGV4YW1wbGUgdG8gZ2VuZXJhdGUgdGltaW5ncyBmb3IgNjQweDQ4MCBhdCA2MEh6IHZlcnRpY2FsOlxuIik7Ci0JcHJpbnRmKCJcbiIpOwotCXByaW50ZigiICAgIEdURkNBTEMgNjQwIDQ4MCA2MCBIelxuIik7Ci0JcHJpbnRmKCJcbiIpOwotCXByaW50ZigiRm9yIGV4YW1wbGUgdG8gZ2VuZXJhdGUgdGltaW5ncyBmb3IgNjQweDQ4MCBhdCAzMS41S0h6IGhvcml6b250YWw6XG4iKTsKLQlwcmludGYoIlxuIik7Ci0JcHJpbnRmKCIgICAgR1RGQ0FMQyA2NDAgNDgwIDMxLjUgS0h6XG4iKTsKLQlwcmludGYoIlxuIik7Ci0JcHJpbnRmKCJGb3IgZXhhbXBsZSB0byBnZW5lcmF0ZSB0aW1pbmdzIGZvciA2NDB4NDgwIHdpdGggYSAyNS4xNzVNaHogZG90IGNsb2NrOlxuIik7Ci0JcHJpbnRmKCJcbiIpOwotCXByaW50ZigiICAgIEdURkNBTEMgNjQwIDQ4MCAyNS4xNzUgTUh6XG4iKTsKLQlwcmludGYoIlxuIik7Ci0JcHJpbnRmKCJHVEZDQUxDIHdpbGwgcHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSByZXN1bHRzIGZvdW5kLCBhbmQgZHVtcCB0aGUgQ1JUQ1xuIik7Ci0JcHJpbnRmKCJ2YWx1ZXMgdG8gdGhlIFVWQ09ORklHLkNSVCBmaWxlIGluIHRoZSBmb3JtYXQgdXNlZCBieSBTY2lUZWNoIERpc3BsYXkgRG9jdG9yLlxuIik7Ci0JZXhpdCgxKTsKLQl9Ci0KLSAgICAvKiBHZXQgdmFsdWVzIGZyb20gY29tbWFuZCBsaW5lICovCi0gICAgeFBpeGVscyA9IGF0b2YoYXJndlsxXSk7Ci0gICAgeVBpeGVscyA9IGF0b2YoYXJndlsyXSk7Ci0gICAgZnJlcSA9IGF0b2YoYXJndlszXSk7Ci0gICAgaW50ZXJsYWNlID0gKChhcmdjID09IDYpICYmIChhcmd2WzVdWzBdID09ICdJJykpOwotCi0gICAgLyogQ29tcHV0ZSB0aGUgQ1JUQyB0aW1pbmdzICovCi0gICAgaWYgKHRvdXBwZXIoYXJndls0XVswXSkgPT0gJ0gnKQotCUdURl9jYWxjVGltaW5ncyh4UGl4ZWxzLHlQaXhlbHMsZnJlcSxHVEZfbG9ja1ZGLGZhbHNlLGludGVybGFjZSwmdCk7Ci0gICAgZWxzZSBpZiAodG91cHBlcihhcmd2WzRdWzBdKSA9PSAnSycpCi0JR1RGX2NhbGNUaW1pbmdzKHhQaXhlbHMseVBpeGVscyxmcmVxLEdURl9sb2NrSEYsZmFsc2UsaW50ZXJsYWNlLCZ0KTsKLSAgICBlbHNlIGlmICh0b3VwcGVyKGFyZ3ZbNF1bMF0pID09ICdNJykKLQlHVEZfY2FsY1RpbWluZ3MoeFBpeGVscyx5UGl4ZWxzLGZyZXEsR1RGX2xvY2tQRixmYWxzZSxpbnRlcmxhY2UsJnQpOwotICAgIGVsc2UgewotCXByaW50ZigiVW5rbm93biBjb21tYW5kIGxpbmUhXG4iKTsKLQlleGl0KDEpOwotCX0KLQotICAgIC8qIER1bXAgc3VtbWFyeSBpbmZvIHRvIHN0YW5kYXJkIG91dHB1dCAqLwotICAgIHByaW50ZigiQ1JUQyB2YWx1ZXMgZm9yICUuMGZ4JS4wZiBAICUuMmYgJXNcbiIsIHhQaXhlbHMsIHlQaXhlbHMsIGZyZXEsIGFyZ3ZbNF0pOwotICAgIHByaW50ZigiXG4iKTsKLSAgICBwcmludGYoIiAgaFRvdGFsICAgICAgPSAlLTRkICAgIHZUb3RhbCAgICAgID0gJS00ZFxuIiwKLQl0LmguaFRvdGFsLCB0LnYudlRvdGFsKTsKLSAgICBwcmludGYoIiAgaERpc3AgICAgICAgPSAlLTRkICAgIHZEaXNwICAgICAgID0gJS00ZFxuIiwKLQl0LmguaERpc3AsIHQudi52RGlzcCk7Ci0gICAgcHJpbnRmKCIgIGhTeW5jU3RhcnQgID0gJS00ZCAgICB2U3luY1N0YXJ0ICA9ICUtNGRcbiIsCi0JdC5oLmhTeW5jU3RhcnQsIHQudi52U3luY1N0YXJ0KTsKLSAgICBwcmludGYoIiAgaFN5bmNFbmQgICAgPSAlLTRkICAgIHZTeW5jRW5kICAgID0gJS00ZFxuIiwKLQl0LmguaFN5bmNFbmQsIHQudi52U3luY0VuZCk7Ci0gICAgcHJpbnRmKCIgIGhGcm9udFBvcmNoID0gJS00ZCAgICB2RnJvbnRQb3JjaCA9ICUtNGRcbiIsCi0JdC5oLmhGcm9udFBvcmNoLCB0LnYudkZyb250UG9yY2gpOwotICAgIHByaW50ZigiICBoU3luY1dpZHRoICA9ICUtNGQgICAgdlN5bmNXaWR0aCAgPSAlLTRkXG4iLAotCXQuaC5oU3luY1dpZHRoLCB0LnYudlN5bmNXaWR0aCk7Ci0gICAgcHJpbnRmKCIgIGhCYWNrUG9yY2ggID0gJS00ZCAgICB2QmFja1BvcmNoICA9ICUtNGRcbiIsCi0JdC5oLmhCYWNrUG9yY2gsIHQudi52QmFja1BvcmNoKTsKLSAgICBwcmludGYoIlxuIik7Ci0gICAgcHJpbnRmKCIgIEludGVybGFjZWQgID0gJXNcbiIsICh0LmludGVybGFjZSA9PSAnSScpID8gIlllcyIgOiAiTm8iKTsKLSAgICBwcmludGYoIiAgSCBzeW5jIHBvbCAgPSAlY1xuIiwgdC5oU3luY1BvbCk7Ci0gICAgcHJpbnRmKCIgIFYgc3luYyBwb2wgID0gJWNcbiIsIHQudlN5bmNQb2wpOwotICAgIHByaW50ZigiXG4iKTsKLSAgICBwcmludGYoIiAgVmVydCBmcmVxICAgPSAlLjJmIEh6XG4iLCB0LnZGcmVxKTsKLSAgICBwcmludGYoIiAgSG9yaXogZnJlcSAgPSAlLjJmIEtIelxuIiwgdC5oRnJlcSk7Ci0gICAgcHJpbnRmKCIgIERvdCBDbG9jayAgID0gJS4yZiBNaHpcbiIsICAgIHQuZG90Q2xvY2spOwotCi0gICAgLyogRHVtcCB0byBmaWxlIGluIGZvcm1hdCB1c2VkIGJ5IFNjaVRlY2ggRGlzcGxheSBEb2N0b3IgKi8KLSAgICBpZiAoKGYgPSBmb3BlbigiVVZDT05GSUcuQ1JUIiwidyIpKSAhPSBOVUxMKSB7Ci0JZnByaW50ZihmLCAiWyUuMGYgJS4wZl1cbiIsIHhQaXhlbHMsIHlQaXhlbHMpOwotCWZwcmludGYoZiwgIiVkICVkICVkICVkICclYycgJXNcbiIsCi0JICAgIHQuaC5oVG90YWwsIHQuaC5oRGlzcCwKLQkgICAgdC5oLmhTeW5jU3RhcnQsIHQuaC5oU3luY0VuZCwKLQkgICAgdC5oU3luY1BvbCwgKHQuaW50ZXJsYWNlID09ICdJJykgPyAiSSIgOiAiTkkiKTsKLQlmcHJpbnRmKGYsICIlZCAlZCAlZCAlZCAnJWMnXG4iLAotCSAgICB0LnYudlRvdGFsLCB0LnYudkRpc3AsCi0JICAgIHQudi52U3luY1N0YXJ0LCB0LnYudlN5bmNFbmQsCi0JICAgIHQudlN5bmNQb2wpOwotCWZwcmludGYoZiwgIiUuMmZcbiIsIHQuZG90Q2xvY2spOwotCWZjbG9zZShmKTsKLQl9Ci19Ci0KLSNlbmRpZiAgLyogVEVTVElORyAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2xpYmNpbXAuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9saWJjaW1wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNzNhZDUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL2xpYmNpbXAuYworKysgL2Rldi9udWxsCkBAIC0xLDgyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgU2NpVGVjaCBNR0wgR3JhcGhpY3MgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBNb2R1bGUgdG8gaW1wbGVtZW50IGEgdGhlIE9TIHNwZWNpZmljIHNpZGUgb2YgdGhlIEJpbmFyeQotKiAgICAgICAgICAgICAgIFBvcnRhYmxlIERMTCBDIHJ1bnRpbWUgbGlicmFyeS4gVGhlIGZ1bmN0aW9ucyBpbiBoZXJlCi0qICAgICAgICAgICAgICAgYXJlIGltcG9ydGVkIGludG8gdGhlIEJpbmFyeSBQb3J0YWJsZSBETEwncyB0byBpbXBsZW1lbnQKLSogICAgICAgICAgICAgICBPUyBzcGVjaWZpYyBzZXJ2aWNlcy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2lmIGRlZmluZWQoX19XSU4zMl9WWERfXykgfHwgZGVmaW5lZChfX05UX0RSSVZFUl9fKQotI2luY2x1ZGUgImRydmxpYi9wZWxvYWRlci5oIgotI2luY2x1ZGUgImRydmxpYi9hdHRyaWIuaCIKLSNpbmNsdWRlICJkcnZsaWIvbGliYy9pbml0LmgiCi0jZGVmaW5lIF9fQlVJTERJTkdfUEVfTE9BREVSX18KLSNpbmNsdWRlICJkcnZsaWIvbGliYy9maWxlLmgiCi0jaWYgZGVmaW5lZChfX1dJTjMyX1ZYRF9fKQotI2luY2x1ZGUgInZ4ZGZpbGUuaCIKLSNlbmRpZgotI2Vsc2UKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPG1hbGxvYy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2lmIGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19VTklYX18pCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNlbHNlCi0jaW5jbHVkZSA8aW8uaD4KLSNlbmRpZgotI2luY2x1ZGUgImRydmxpYi9hdHRyaWIuaCIKLSNpbmNsdWRlICJkcnZsaWIvbGliYy9pbml0LmgiCi0jZGVmaW5lIF9fQlVJTERJTkdfUEVfTE9BREVSX18KLSNpbmNsdWRlICJkcnZsaWIvbGliYy9maWxlLmgiCi0jaWYgZGVmaW5lZChfX1dJTkRPV1NfXykgfHwgZGVmaW5lZChUTlQpIHx8IGRlZmluZWQoX19SVFRBUkdFVF9fKQotI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCi0jZGVmaW5lIFNUUklDVAotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNlbmRpZgotI2lmZGVmICBfX01TRE9TX18KLSNpbmNsdWRlIDxkb3MuaD4KLSNlbmRpZgotI2lmZGVmICBfX09TMl9fCi0jZGVmaW5lIElOQ0xfRE9TCi0jZGVmaW5lIElOQ0xfRE9TRVJST1JTCi0jZGVmaW5lIElOQ0xfU1VCCi0jaW5jbHVkZSA8b3MyLmg+Ci0jZW5kaWYKLSNlbmRpZgotCi0vKiBObyB0ZXh0IG9yIGJpbmFyeSBtb2RlcyBmb3IgVW5peCAqLwotCi0jaWZuZGVmIE9fQklOQVJZCi0jZGVmaW5lIE9fQklOQVJZICAgIDAKLSNkZWZpbmUgT19URVhUICAgICAgMAotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZiBkZWZpbmVkKF9fV0lOMzJfVlhEX18pIHx8IGRlZmluZWQoX19OVF9EUklWRVJfXykKLSNkZWZpbmUgTUFYX0ZJTEVTICAgMTYKLXN0YXRpYyBGSUxFICpvcGVuSGFuZGxlc1tNQVhfRklMRVNdID0ge05VTEx9OwotI2VuZGlmCi0KLS8qIDxzdGRsaWIuaD4gc3R1YiBmdW5jdGlvbnMgKi8KLXZvaWQgICAgX0NERUNMIHN0dWJfYWJvcnQodm9pZCk7Ci1pbnQgICAgIF9DREVDTCBzdHViX2F0ZXhpdCh2b2lkICgqKSh2b2lkKSk7Ci12b2lkICogIF9DREVDTCBzdHViX2NhbGxvYyhzaXplX3QgX25lbGVtLCBzaXplX3QgX3NpemUpOwotdm9pZCAgICBfQ0RFQ0wgc3R1Yl9leGl0KGludCBfc3RhdHVzKTsKLXZvaWQgICAgX0NERUNMIHN0dWJfZnJlZSh2b2lkICpfcHRyKTsKLWNoYXIgKiAgX0NERUNMIHN0dWJfZ2V0ZW52KGNvbnN0IGNoYXIgKl9uYW1lKTsKLXZvaWQgKiAgX0NERUNMIHN0dWJfbWFsbG9jKHNpemVfdCBfc2l6ZSk7Ci12b2lkICogIF9DREVDTCBzdHViX3JlYWxsb2Modm9pZCAqX3B0ciwgc2l6ZV90IF9zaXplKTsKLWludCAgICAgX0NERUNMIHN0dWJfc3lzdGVtKGNvbnN0IGNoYXIgKl9zKTsKLWludCAgICAgX0NERUNMIHN0dWJfcHV0ZW52KGNvbnN0IGNoYXIgKl92YWwpOwotCi0vKiA8bGliYy9maWxlLmg+IHN0dWIgZnVuY3Rpb25zICovCi1pbnQgICAgIF9DREVDTCBzdHViX29wZW4oY29uc3QgY2hhciAqX3BhdGgsIGludCBfb2ZsYWcsIHVuc2lnbmVkIF9tb2RlKTsKLWludCAgICAgX0NERUNMIHN0dWJfYWNjZXNzKGNvbnN0IGNoYXIgKl9wYXRoLCBpbnQgX2Ftb2RlKTsKLWludCAgICAgX0NERUNMIHN0dWJfY2xvc2UoaW50IF9maWxkZXMpOwotb2ZmX3QgICBfQ0RFQ0wgc3R1Yl9sc2VlayhpbnQgX2ZpbGRlcywgb2ZmX3QgX29mZnNldCwgaW50IF93aGVuY2UpOwotc2l6ZV90ICBfQ0RFQ0wgc3R1Yl9yZWFkKGludCBfZmlsZGVzLCB2b2lkICpfYnVmLCBzaXplX3QgX25ieXRlKTsKLWludCAgICAgX0NERUNMIHN0dWJfdW5saW5rKGNvbnN0IGNoYXIgKl9wYXRoKTsKLXNpemVfdCAgX0NERUNMIHN0dWJfd3JpdGUoaW50IF9maWxkZXMsIGNvbnN0IHZvaWQgKl9idWYsIHNpemVfdCBfbmJ5dGUpOwotaW50ICAgICBfQ0RFQ0wgc3R1Yl9pc2F0dHkoaW50IF9maWxkZXMpOwotCi0vKiA8c3RkaW8uaD4gc3R1YiBmdW5jdGlvbnMgKi8KLWludCAgICAgX0NERUNMIHN0dWJfcmVtb3ZlKGNvbnN0IGNoYXIgKl9maWxlbmFtZSk7Ci1pbnQgICAgIF9DREVDTCBzdHViX3JlbmFtZShjb25zdCBjaGFyICpfb2xkLCBjb25zdCBjaGFyICpfbmV3KTsKLQotLyogPHRpbWUuaD4gc3R1YiBmdW5jdGlvbnMgKi8KLXRpbWVfdCAgX0NERUNMIHN0dWJfdGltZSh0aW1lX3QgKl90b2QpOwotCi0vKiA8c2lnbmFsLmg+IHN0dWIgZnVuY3Rpb25zICovCi1pbnQgICAgIF9DREVDTCBzdHViX3JhaXNlKGludCk7Ci12b2lkICogIF9DREVDTCBzdHViX3NpZ25hbChpbnQsIHZvaWQgKik7Ci0KLS8qIDxkcnZsaWIvYXR0cmliLmg+IGZ1bmN0aW9ucyAqLwotI2RlZmluZSBzdHViX09TX3NldGZpbGVhdHRyICAgIF9PU19zZXRmaWxlYXR0cgotI2RlZmluZSBzdHViX09TX2dldGN1cnJlbnRkYXRlIF9PU19nZXRjdXJyZW50ZGF0ZQotCi1MSUJDX2ltcG9ydHMgICAgX1ZBUkFQSSBfX19pbXBvcnRzID0gewotICAgIHNpemVvZihMSUJDX2ltcG9ydHMpLAotCi0gICAgLyogPHN0ZGxpYi5oPiBleHBvcnRzICovCi0gICAgc3R1Yl9hYm9ydCwKLSAgICBzdHViX2F0ZXhpdCwKLSAgICBzdHViX2NhbGxvYywKLSAgICBzdHViX2V4aXQsCi0gICAgc3R1Yl9mcmVlLAotICAgIHN0dWJfZ2V0ZW52LAotICAgIHN0dWJfbWFsbG9jLAotICAgIHN0dWJfcmVhbGxvYywKLSAgICBzdHViX3N5c3RlbSwKLSAgICBzdHViX3B1dGVudiwKLQotICAgIC8qIDxsaWJjL2ZpbGUuaD4gZXhwb3J0cyAqLwotICAgIHN0dWJfb3BlbiwKLSAgICBzdHViX2FjY2VzcywKLSAgICBzdHViX2Nsb3NlLAotICAgIHN0dWJfbHNlZWssCi0gICAgc3R1Yl9yZWFkLAotICAgIHN0dWJfdW5saW5rLAotICAgIHN0dWJfd3JpdGUsCi0gICAgc3R1Yl9pc2F0dHksCi0KLSAgICAvKiA8c3RkaW8uaD4gZXhwb3J0cyAqLwotICAgIHN0dWJfcmVtb3ZlLAotICAgIHN0dWJfcmVuYW1lLAotCi0gICAgLyogPHNpZ25hbC5oPiBmdW5jdGlvbnMgKi8KLSAgICBzdHViX3JhaXNlLAotICAgIHN0dWJfc2lnbmFsLAotCi0gICAgLyogPHRpbWUuaD4gZXhwb3J0cyAqLwotICAgIHN0dWJfdGltZSwKLQotICAgIC8qIDxkcnZsaWIvYXR0cmliLmg+IGV4cG9ydHMgKi8KLSAgICBzdHViX09TX3NldGZpbGVhdHRyLAotICAgIHN0dWJfT1NfZ2V0Y3VycmVudGRhdGUsCi0gICAgfTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0dWIgZnVuY3Rpb24gaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogPHN0ZGxpYi5oPiBzdHViIGZ1bmN0aW9ucyAqLwotdm9pZCBfQ0RFQ0wgc3R1Yl9hYm9ydCh2b2lkKQotewotI2lmICFkZWZpbmVkKCBfX1dJTjMyX1ZYRF9fKSAmJiAhZGVmaW5lZChfX05UX0RSSVZFUl9fKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotaW50IF9DREVDTCBzdHViX2F0ZXhpdCh2b2lkICgqZnVuYykodm9pZCkpCi17Ci0jaWYgIWRlZmluZWQoIF9fV0lOMzJfVlhEX18pICYmICFkZWZpbmVkKF9fTlRfRFJJVkVSX18pCi0gICAgcmV0dXJuIGF0ZXhpdCgodm9pZCgqKSh2b2lkKSlmdW5jKTsKLSNlbHNlCi0gICAgcmV0dXJuIC0xOwotI2VuZGlmCi19Ci0KLXZvaWQgKiBfQ0RFQ0wgc3R1Yl9jYWxsb2Moc2l6ZV90IF9uZWxlbSwgc2l6ZV90IF9zaXplKQoteyByZXR1cm4gX19QTV9jYWxsb2MoX25lbGVtLF9zaXplKTsgfQotCi12b2lkIF9DREVDTCBzdHViX2V4aXQoaW50IF9zdGF0dXMpCi17Ci0jaWYgIWRlZmluZWQoIF9fV0lOMzJfVlhEX18pICYmICFkZWZpbmVkKF9fTlRfRFJJVkVSX18pCi0gICAgZXhpdChfc3RhdHVzKTsKLSNlbmRpZgotfQotCi12b2lkIF9DREVDTCBzdHViX2ZyZWUodm9pZCAqX3B0cikKLXsgX19QTV9mcmVlKF9wdHIpOyB9Ci0KLWNoYXIgKiBfQ0RFQ0wgc3R1Yl9nZXRlbnYoY29uc3QgY2hhciAqX25hbWUpCi17Ci0jaWYgZGVmaW5lZCggX19XSU4zMl9WWERfXykgfHwgZGVmaW5lZChfX05UX0RSSVZFUl9fKQotICAgIHJldHVybiBOVUxMOwotI2Vsc2UKLSAgICByZXR1cm4gZ2V0ZW52KF9uYW1lKTsKLSNlbmRpZgotfQotCi12b2lkICogX0NERUNMIHN0dWJfbWFsbG9jKHNpemVfdCBfc2l6ZSkKLXsgcmV0dXJuIF9fUE1fbWFsbG9jKF9zaXplKTsgfQotCi12b2lkICogX0NERUNMIHN0dWJfcmVhbGxvYyh2b2lkICpfcHRyLCBzaXplX3QgX3NpemUpCi17IHJldHVybiBfX1BNX3JlYWxsb2MoX3B0cixfc2l6ZSk7IH0KLQotaW50IF9DREVDTCBzdHViX3N5c3RlbShjb25zdCBjaGFyICpfcykKLXsKLSNpZiBkZWZpbmVkKF9fV0lORE9XU19fKSB8fCBkZWZpbmVkKF9fV0lOMzJfVlhEX18pIHx8IGRlZmluZWQoX19OVF9EUklWRVJfXykgfHwgZGVmaW5lZChfX1NNWDMyX18pIHx8IGRlZmluZWQoX19SVFRBUkdFVF9fKQotICAgICh2b2lkKV9zOwotICAgIHJldHVybiAtMTsKLSNlbHNlCi0gICAgcmV0dXJuIHN5c3RlbShfcyk7Ci0jZW5kaWYKLX0KLQotaW50IF9DREVDTCBzdHViX3B1dGVudihjb25zdCBjaGFyICpfdmFsKQotewotI2lmIGRlZmluZWQoIF9fV0lOMzJfVlhEX18pIHx8IGRlZmluZWQoX19OVF9EUklWRVJfXykKLSAgICByZXR1cm4gLTE7Ci0jZWxzZQotICAgIHJldHVybiBwdXRlbnYoKGNoYXIqKV92YWwpOwotI2VuZGlmCi19Ci0KLXRpbWVfdCBfQ0RFQ0wgc3R1Yl90aW1lKHRpbWVfdCAqX3RvZCkKLXsKLSNpZiBkZWZpbmVkKCBfX1dJTjMyX1ZYRF9fKSB8fCBkZWZpbmVkKF9fTlRfRFJJVkVSX18pCi0gICAgcmV0dXJuIDA7Ci0jZWxzZQotICAgIHJldHVybiB0aW1lKF90b2QpOwotI2VuZGlmCi19Ci0KLSNpZiAgICAgZGVmaW5lZChfX01TRE9TX18pCi0KLSNpZiBkZWZpbmVkKFROVCkgJiYgZGVmaW5lZChfTVNDX1ZFUikKLQotdm9pZCBfQ0RFQ0wgX09TX3NldGZpbGVhdHRyKGNvbnN0IGNoYXIgKmZpbGVuYW1lLHVuc2lnbmVkIGF0dHJpYikKLXsgU2V0RmlsZUF0dHJpYnV0ZXMoKExQU1RSKWZpbGVuYW1lLCAoRFdPUkQpYXR0cmliKTsgfQotCi0jZWxzZQotCi12b2lkIF9DREVDTCBfT1Nfc2V0ZmlsZWF0dHIoY29uc3QgY2hhciAqZmlsZW5hbWUsdW5zaWduZWQgYXR0cmliKQoteyBfZG9zX3NldGZpbGVhdHRyKGZpbGVuYW1lLGF0dHJpYik7IH0KLQotI2VuZGlmCi0KLSNlbGlmICAgZGVmaW5lZChfX1dJTjMyX1ZYRF9fKQotCi0jZGVmaW5lIFVTRV9MT0NBTF9GSUxFSU8KLSNkZWZpbmUgVVNFX0xPQ0FMX0dFVERBVEUKLQotLyogPGxpYmMvZmlsZS5oPiBzdHViIGZ1bmN0aW9ucyAqLwotaW50IF9DREVDTCBzdHViX29wZW4oY29uc3QgY2hhciAqX3BhdGgsIGludCBfb2ZsYWcsIHVuc2lnbmVkIF9tb2RlKQotewotICAgIGNoYXIgICAgbW9kZVsxMF07Ci0gICAgaW50ICAgICBpOwotCi0gICAgLyogRmluZCBhbiBlbXB0eSBmaWxlIGhhbmRsZSB0byB1c2UgKi8KLSAgICBmb3IgKGkgPSAzOyBpIDwgTUFYX0ZJTEVTOyBpKyspIHsKLQlpZiAoIW9wZW5IYW5kbGVzW2ldKQotCSAgICBicmVhazsKLQl9Ci0gICAgaWYgKG9wZW5IYW5kbGVzW2ldKQotCXJldHVybiAtMTsKLQotICAgIC8qIEZpbmQgdGhlIG9wZW4gZmxhZ3MgdG8gdXNlICovCi0gICAgaWYgKF9vZmxhZyAmIF9fX09fVFJVTkMpCi0Jc3RyY3B5KG1vZGUsInciKTsKLSAgICBlbHNlIGlmIChfb2ZsYWcgJiBfX19PX0NSRUFUKQotCXN0cmNweShtb2RlLCJhIik7Ci0gICAgZWxzZQotCXN0cmNweShtb2RlLCJyIik7Ci0gICAgaWYgKF9vZmxhZyAmIF9fX09fQklOQVJZKQotCXN0cmNhdChtb2RlLCJiIik7Ci0gICAgaWYgKF9vZmxhZyAmIF9fX09fVEVYVCkKLQlzdHJjYXQobW9kZSwidCIpOwotCi0gICAgLyogT3BlbiB0aGUgZmlsZSBhbmQgc3RvcmUgdGhlIGZpbGUgaGFuZGxlICovCi0gICAgaWYgKChvcGVuSGFuZGxlc1tpXSA9IGZvcGVuKF9wYXRoLG1vZGUpKSA9PSBOVUxMKQotCXJldHVybiAtMTsKLSAgICByZXR1cm4gaTsKLX0KLQotaW50IF9DREVDTCBzdHViX2FjY2Vzcyhjb25zdCBjaGFyICpfcGF0aCwgaW50IF9hbW9kZSkKLXsgcmV0dXJuIC0xOyB9Ci0KLWludCBfQ0RFQ0wgc3R1Yl9jbG9zZShpbnQgX2ZpbGRlcykKLXsKLSAgICBpZiAoX2ZpbGRlcyA+PSAzICYmIG9wZW5IYW5kbGVzW19maWxkZXNdKSB7Ci0JZmNsb3NlKG9wZW5IYW5kbGVzW19maWxkZXNdKTsKLQlvcGVuSGFuZGxlc1tfZmlsZGVzXSA9IE5VTEw7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi1vZmZfdCBfQ0RFQ0wgc3R1Yl9sc2VlayhpbnQgX2ZpbGRlcywgb2ZmX3QgX29mZnNldCwgaW50IF93aGVuY2UpCi17Ci0gICAgaWYgKF9maWxkZXMgPj0gMykgewotCWZzZWVrKG9wZW5IYW5kbGVzW19maWxkZXNdLF9vZmZzZXQsX3doZW5jZSk7Ci0JcmV0dXJuIGZ0ZWxsKG9wZW5IYW5kbGVzW19maWxkZXNdKTsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXNpemVfdCBfQ0RFQ0wgc3R1Yl9yZWFkKGludCBfZmlsZGVzLCB2b2lkICpfYnVmLCBzaXplX3QgX25ieXRlKQotewotICAgIGlmIChfZmlsZGVzID49IDMpCi0JcmV0dXJuIGZyZWFkKF9idWYsMSxfbmJ5dGUsb3BlbkhhbmRsZXNbX2ZpbGRlc10pOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgX0NERUNMIHN0dWJfdW5saW5rKGNvbnN0IGNoYXIgKl9wYXRoKQotewotICAgIFdPUkQgZXJyb3I7Ci0KLSAgICBpZiAoaW5pdENvbXBsZXRlKSB7Ci0JaWYgKFIwX0RlbGV0ZUZpbGUoKGNoYXIqKV9wYXRoLDAsJmVycm9yKSkKLQkgICAgcmV0dXJuIDA7Ci0JcmV0dXJuIC0xOwotCX0KLSAgICBlbHNlCi0JcmV0dXJuIGlfcmVtb3ZlKF9wYXRoKTsKLX0KLQotc2l6ZV90IF9DREVDTCBzdHViX3dyaXRlKGludCBfZmlsZGVzLCBjb25zdCB2b2lkICpfYnVmLCBzaXplX3QgX25ieXRlKQotewotICAgIGlmIChfZmlsZGVzID49IDMpCi0JcmV0dXJuIGZ3cml0ZShfYnVmLDEsX25ieXRlLG9wZW5IYW5kbGVzW19maWxkZXNdKTsKLSAgICByZXR1cm4gX25ieXRlOwotfQotCi1pbnQgX0NERUNMIHN0dWJfaXNhdHR5KGludCBfZmlsZGVzKQoteyByZXR1cm4gMDsgfQotCi0vKiA8c3RkaW8uaD4gc3R1YiBmdW5jdGlvbnMgKi8KLWludCBfQ0RFQ0wgc3R1Yl9yZW1vdmUoY29uc3QgY2hhciAqX2ZpbGVuYW1lKQoteyByZXR1cm4gc3R1Yl91bmxpbmsoX2ZpbGVuYW1lKTsgfQotCi1pbnQgX0NERUNMIHN0dWJfcmVuYW1lKGNvbnN0IGNoYXIgKl9vbGQsIGNvbnN0IGNoYXIgKl9uZXcpCi17IHJldHVybiAtMTsgfQotCi12b2lkIF9DREVDTCBfT1Nfc2V0ZmlsZWF0dHIoY29uc3QgY2hhciAqZmlsZW5hbWUsdW5zaWduZWQgYXR0cmliKQotewotICAgIFdPUkQgZXJyb3I7Ci0gICAgaWYgKGluaXRDb21wbGV0ZSkKLQlSMF9TZXRGaWxlQXR0cmlidXRlcygoY2hhciopZmlsZW5hbWUsYXR0cmliLCZlcnJvcik7Ci19Ci0KLS8qIFJldHVybiB0aGUgY3VycmVudCBkYXRlIGluIGRheXMgc2luY2UgMS8xLzE5ODAgKi8KLXVsb25nIF9DREVDTCBfT1NfZ2V0Y3VycmVudGRhdGUodm9pZCkKLXsKLSAgICBEV09SRCAgIGRhdGU7Ci0gICAgVlREX0dldF9EYXRlX0FuZF9UaW1lKCZkYXRlKTsKLSAgICByZXR1cm4gZGF0ZTsKLX0KLQotI2VsaWYgICBkZWZpbmVkKF9fTlRfRFJJVkVSX18pCi0KLSNkZWZpbmUgVVNFX0xPQ0FMX0ZJTEVJTwotI2RlZmluZSBVU0VfTE9DQUxfR0VUREFURQotCi0vKiA8bGliYy9maWxlLmg+IHN0dWIgZnVuY3Rpb25zICovCi1pbnQgX0NERUNMIHN0dWJfb3Blbihjb25zdCBjaGFyICpfcGF0aCwgaW50IF9vZmxhZywgdW5zaWduZWQgX21vZGUpCi17Ci0gICAgY2hhciAgICBtb2RlWzEwXTsKLSAgICBpbnQgICAgIGk7Ci0KLSAgICAvKiBGaW5kIGFuIGVtcHR5IGZpbGUgaGFuZGxlIHRvIHVzZSAqLwotICAgIGZvciAoaSA9IDM7IGkgPCBNQVhfRklMRVM7IGkrKykgewotCWlmICghb3BlbkhhbmRsZXNbaV0pCi0JICAgIGJyZWFrOwotCX0KLSAgICBpZiAob3BlbkhhbmRsZXNbaV0pCi0JcmV0dXJuIC0xOwotCi0gICAgLyogRmluZCB0aGUgb3BlbiBmbGFncyB0byB1c2UgKi8KLSAgICBpZiAoX29mbGFnICYgX19fT19UUlVOQykKLQlzdHJjcHkobW9kZSwidyIpOwotICAgIGVsc2UgaWYgKF9vZmxhZyAmIF9fX09fQ1JFQVQpCi0Jc3RyY3B5KG1vZGUsImEiKTsKLSAgICBlbHNlCi0Jc3RyY3B5KG1vZGUsInIiKTsKLSAgICBpZiAoX29mbGFnICYgX19fT19CSU5BUlkpCi0Jc3RyY2F0KG1vZGUsImIiKTsKLSAgICBpZiAoX29mbGFnICYgX19fT19URVhUKQotCXN0cmNhdChtb2RlLCJ0Iik7Ci0KLSAgICAvKiBPcGVuIHRoZSBmaWxlIGFuZCBzdG9yZSB0aGUgZmlsZSBoYW5kbGUgKi8KLSAgICBpZiAoKG9wZW5IYW5kbGVzW2ldID0gZm9wZW4oX3BhdGgsbW9kZSkpID09IE5VTEwpCi0JcmV0dXJuIC0xOwotICAgIHJldHVybiBpOwotfQotCi1pbnQgX0NERUNMIHN0dWJfY2xvc2UoaW50IF9maWxkZXMpCi17Ci0gICAgaWYgKF9maWxkZXMgPj0gMyAmJiBvcGVuSGFuZGxlc1tfZmlsZGVzXSkgewotCWZjbG9zZShvcGVuSGFuZGxlc1tfZmlsZGVzXSk7Ci0Jb3BlbkhhbmRsZXNbX2ZpbGRlc10gPSBOVUxMOwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotb2ZmX3QgX0NERUNMIHN0dWJfbHNlZWsoaW50IF9maWxkZXMsIG9mZl90IF9vZmZzZXQsIGludCBfd2hlbmNlKQotewotICAgIGlmIChfZmlsZGVzID49IDMpIHsKLQlmc2VlayhvcGVuSGFuZGxlc1tfZmlsZGVzXSxfb2Zmc2V0LF93aGVuY2UpOwotCXJldHVybiBmdGVsbChvcGVuSGFuZGxlc1tfZmlsZGVzXSk7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi1zaXplX3QgX0NERUNMIHN0dWJfcmVhZChpbnQgX2ZpbGRlcywgdm9pZCAqX2J1Ziwgc2l6ZV90IF9uYnl0ZSkKLXsKLSAgICBpZiAoX2ZpbGRlcyA+PSAzKQotCXJldHVybiBmcmVhZChfYnVmLDEsX25ieXRlLG9wZW5IYW5kbGVzW19maWxkZXNdKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc2l6ZV90IF9DREVDTCBzdHViX3dyaXRlKGludCBfZmlsZGVzLCBjb25zdCB2b2lkICpfYnVmLCBzaXplX3QgX25ieXRlKQotewotICAgIGlmIChfZmlsZGVzID49IDMpCi0JcmV0dXJuIGZ3cml0ZShfYnVmLDEsX25ieXRlLG9wZW5IYW5kbGVzW19maWxkZXNdKTsKLSAgICByZXR1cm4gX25ieXRlOwotfQotCi1pbnQgX0NERUNMIHN0dWJfYWNjZXNzKGNvbnN0IGNoYXIgKl9wYXRoLCBpbnQgX2Ftb2RlKQoteyByZXR1cm4gLTE7IH0KLQotaW50IF9DREVDTCBzdHViX2lzYXR0eShpbnQgX2ZpbGRlcykKLXsgcmV0dXJuIDA7IH0KLQotaW50IF9DREVDTCBzdHViX3VubGluayhjb25zdCBjaGFyICpfcGF0aCkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyEgKi8KLSAgICByZXR1cm4gLTE7Ci19Ci0KLS8qIDxzdGRpby5oPiBzdHViIGZ1bmN0aW9ucyAqLwotaW50IF9DREVDTCBzdHViX3JlbW92ZShjb25zdCBjaGFyICpfZmlsZW5hbWUpCi17IHJldHVybiBzdHViX3VubGluayhfZmlsZW5hbWUpOyB9Ci0KLWludCBfQ0RFQ0wgc3R1Yl9yZW5hbWUoY29uc3QgY2hhciAqX29sZCwgY29uc3QgY2hhciAqX25ldykKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyEgKi8KLSAgICByZXR1cm4gLTE7Ci19Ci0KLXZvaWQgX0NERUNMIF9PU19zZXRmaWxlYXR0cihjb25zdCBjaGFyICpmaWxlbmFtZSx1bnNpZ25lZCBhdHRyaWIpCi17Ci0gICAgdWludCBfYXR0ciA9IDA7Ci0gICAgaWYgKGF0dHJpYiAmIF9fQV9SRE9OTFkpCi0JX2F0dHIgfD0gRklMRV9BVFRSSUJVVEVfUkVBRE9OTFk7Ci0gICAgaWYgKGF0dHJpYiAmIF9fQV9ISURERU4pCi0JX2F0dHIgfD0gRklMRV9BVFRSSUJVVEVfSElEREVOOwotICAgIGlmIChhdHRyaWIgJiBfX0FfU1lTVEVNKQotCV9hdHRyIHw9IEZJTEVfQVRUUklCVVRFX1NZU1RFTTsKLSAgICBQTV9zZXRGaWxlQXR0cihmaWxlbmFtZSxfYXR0cik7Ci19Ci0KLS8qIFJldHVybiB0aGUgY3VycmVudCBkYXRlIGluIGRheXMgc2luY2UgMS8xLzE5ODAgKi8KLXVsb25nIF9DREVDTCBfT1NfZ2V0Y3VycmVudGRhdGUodm9pZCkKLXsKLSAgICBUSU1FX0ZJRUxEUyB0bTsKLSAgICBfaW50NjQgICAgICBjb3VudCxjb3VudF8xXzFfMTk4MDsKLQotICAgIHRtLlllYXIgICAgICAgICA9IDE5ODA7Ci0gICAgdG0uTW9udGggICAgICAgID0gMTsKLSAgICB0bS5EYXkgICAgICAgICAgPSAxOwotICAgIHRtLkhvdXIgICAgICAgICA9IDA7Ci0gICAgdG0uTWludXRlICAgICAgID0gMDsKLSAgICB0bS5TZWNvbmQgICAgICAgPSAwOwotICAgIHRtLk1pbGxpc2Vjb25kcyA9IDA7Ci0gICAgdG0uV2Vla2RheSAgICAgID0gMDsKLSAgICBSdGxUaW1lRmllbGRzVG9UaW1lKCZ0bSwoUExBUkdFX0lOVEVHRVIpJmNvdW50XzFfMV8xOTgwKTsKLSAgICBLZVF1ZXJ5U3lzdGVtVGltZSgoUExBUkdFX0lOVEVHRVIpJmNvdW50KTsKLSAgICByZXR1cm4gKHVsb25nKSggKGNvdW50IC0gY291bnRfMV8xXzE5ODApIC8gKChfaW50NjQpMjQgKiAoX2ludDY0KTM2MDAgKiAoX2ludDY0KTEwMDAwMDAwKSApOwotfQotCi0jZWxpZiAgIGRlZmluZWQoX19XSU5ET1dTMzJfXykgfHwgZGVmaW5lZChfX1JUVEFSR0VUX18pCi0KLXZvaWQgX0NERUNMIF9PU19zZXRmaWxlYXR0cihjb25zdCBjaGFyICpmaWxlbmFtZSx1bnNpZ25lZCBhdHRyaWIpCi17IFNldEZpbGVBdHRyaWJ1dGVzKChMUFNUUilmaWxlbmFtZSwgKERXT1JEKWF0dHJpYik7IH0KLQotI2VsaWYgICBkZWZpbmVkKF9fT1MyX18pCi0KLSNkZWZpbmUgVVNFX0xPQ0FMX0ZJTEVJTwotCi0jaWZuZGVmIFdfT0sKLSNkZWZpbmUgV19PSyAgICAgICAgICAgICAgICAgICAgMHgwMgotI2VuZGlmCi0KLXZvaWQgX0NERUNMIF9PU19zZXRmaWxlYXR0cihjb25zdCBjaGFyICpmaWxlbmFtZSx1bnNpZ25lZCBhdHRyaWIpCi17Ci0gICAgRklMRVNUQVRVUzMgczsKLSAgICBpZiAoRG9zUXVlcnlQYXRoSW5mbygoUFNaKWZpbGVuYW1lLEZJTF9TVEFOREFSRCwoUFZPSUQpJnMsc2l6ZW9mKHMpKSkKLQlyZXR1cm47Ci0gICAgcy5hdHRyRmlsZSA9IGF0dHJpYjsKLSAgICBEb3NTZXRQYXRoSW5mbygoUFNaKWZpbGVuYW1lLEZJTF9TVEFOREFSRCwoUFZPSUQpJnMsc2l6ZW9mKHMpLDBMKTsKLX0KLQotLyogPGxpYmMvZmlsZS5oPiBzdHViIGZ1bmN0aW9ucyAqLwotCi0jZGVmaW5lIEJVRl9TSVpFICAgIDQwOTYKLQotLyogTm90ZTogdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzdGFuZGFyZCBVbml4LWlzaCBoYW5kbGUtYmFzZWQgSS9PIGlzbid0Ci0gKiAgICAgICBjb21wbGV0ZSAtIGJ1dCB0aGF0IHdhc24ndCB0aGUgaW50ZW50IGVpdGhlci4gTm90ZSBhbHNvIHRoYXQgd2UKLSAqICAgICAgIGRvbid0IHByZXNlbnRseSBzdXBwb3J0IHRleHQgZmlsZSBJL08sIHNvIGFsbCB0ZXh0IGZpbGVzIGVuZAotICogICAgICAgdXAgaW4gVW5peCBmb3JtYXQgKGFuZCBhcmUgbm90IHRyYW5zbGF0ZWQhKS4KLSAqLwotaW50IF9DREVDTCBzdHViX29wZW4oY29uc3QgY2hhciAqX3BhdGgsIGludCBfb2ZsYWcsIHVuc2lnbmVkIF9tb2RlKQotewotICAgIEhGSUxFICAgaGFuZGxlOwotICAgIFVMT05HICAgZXJyb3IsIGFjdGlvbnRha2VuLCBvcGVuZmxhZywgb3Blbm1vZGU7Ci0gICAgY2hhciAgICBwYXRoW1BNX01BWF9QQVRIXTsKLQotICAgIC8qIERldGVybWluZSBvcGVuIGZsYWdzICovCi0gICAgaWYgKF9vZmxhZyAmIF9fX09fQ1JFQVQpIHsKLQlpZiAoX29mbGFnICYgX19fT19FWENMKQotCSAgICBvcGVuZmxhZyA9IE9QRU5fQUNUSU9OX0ZBSUxfSUZfRVhJU1RTIHwgT1BFTl9BQ1RJT05fQ1JFQVRFX0lGX05FVzsKLQllbHNlIGlmIChfb2ZsYWcgJiBfX19PX1RSVU5DKQotCSAgICBvcGVuZmxhZyA9IE9QRU5fQUNUSU9OX1JFUExBQ0VfSUZfRVhJU1RTIHwgT1BFTl9BQ1RJT05fQ1JFQVRFX0lGX05FVzsKLQllbHNlCi0JICAgIG9wZW5mbGFnID0gT1BFTl9BQ1RJT05fT1BFTl9JRl9FWElTVFMgfCBPUEVOX0FDVElPTl9DUkVBVEVfSUZfTkVXOwotCX0KLSAgICBlbHNlIGlmIChfb2ZsYWcgJiBfX19PX1RSVU5DKQotCW9wZW5mbGFnID0gT1BFTl9BQ1RJT05fUkVQTEFDRV9JRl9FWElTVFM7Ci0gICAgZWxzZQotCW9wZW5mbGFnID0gT1BFTl9BQ1RJT05fT1BFTl9JRl9FWElTVFM7Ci0KLSAgICAvKiBEZXRlcm1pbmUgb3BlbiBtb2RlIGZsYWdzICovCi0gICAgaWYgKF9vZmxhZyAmIF9fX09fUkRPTkxZKQotCW9wZW5tb2RlID0gT1BFTl9BQ0NFU1NfUkVBRE9OTFkgfCBPUEVOX1NIQVJFX0RFTllOT05FOwotICAgIGVsc2UgaWYgKF9vZmxhZyAmIF9fX09fV1JPTkxZKQotCW9wZW5tb2RlID0gT1BFTl9BQ0NFU1NfV1JJVEVPTkxZIHwgT1BFTl9TSEFSRV9ERU5ZV1JJVEU7Ci0gICAgZWxzZQotCW9wZW5tb2RlID0gT1BFTl9BQ0NFU1NfUkVBRFdSSVRFIHwgT1BFTl9TSEFSRV9ERU5ZV1JJVEU7Ci0KLSAgICAvKiBDb3B5IHRoZSBwYXRoIHRvIGEgdmFyaWFibGUgb24gdGhlIHN0YWNrLiBXZSBuZWVkIHRvIGRvIHRoaXMKLSAgICAgKiBmb3IgT1MvMiBhcyB3aGVuIHRoZSBkcml2ZXJzIGFyZSBsb2FkZWQgaW50byBzaGFyZWQga2VybmVsCi0gICAgICogbWVtb3J5LCB3ZSBjYW4ndCBwYXNzIGFuIGFkZHJlc3MgZnJvbSB0aGF0IG1lbW9yeSByYW5nZSB0bwotICAgICAqIHRoaXMgZnVuY3Rpb24uCi0gICAgICovCi0gICAgc3RyY3B5KHBhdGgsX3BhdGgpOwotICAgIGlmIChEb3NPcGVuKHBhdGgsICZoYW5kbGUsICZhY3Rpb250YWtlbiwgMCwgRklMRV9OT1JNQUwsCi0JICAgIG9wZW5mbGFnLCBvcGVubW9kZSwgTlVMTCkgIT0gTk9fRVJST1IpCi0JcmV0dXJuIC0xOwotCi0gICAgLyogSGFuZGxlIGFwcGVuZCBtb2RlIG9mIG9wZXJhdGlvbiAqLwotICAgIGlmIChfb2ZsYWcgJiBfX19PX0FQUEVORCkgewotCWlmIChEb3NTZXRGaWxlUHRyKGhhbmRsZSwgMCwgRklMRV9FTkQsICZlcnJvcikgIT0gTk9fRVJST1IpCi0JICAgIHJldHVybiAtMTsKLQl9Ci0gICAgcmV0dXJuIGhhbmRsZTsKLX0KLQotaW50IF9DREVDTCBzdHViX2FjY2Vzcyhjb25zdCBjaGFyICpfcGF0aCwgaW50IF9hbW9kZSkKLXsKLSAgICBjaGFyICAgICAgICBwYXRoW1BNX01BWF9QQVRIXTsKLSAgICBGSUxFU1RBVFVTICBmczsKLQotICAgIC8qIENvcHkgdGhlIHBhdGggdG8gYSB2YXJpYWJsZSBvbiB0aGUgc3RhY2suIFdlIG5lZWQgdG8gZG8gdGhpcwotICAgICAqIGZvciBPUy8yIGFzIHdoZW4gdGhlIGRyaXZlcnMgYXJlIGxvYWRlZCBpbnRvIHNoYXJlZCBrZXJuZWwKLSAgICAgKiBtZW1vcnksIHdlIGNhbid0IHBhc3MgYW4gYWRkcmVzcyBmcm9tIHRoYXQgbWVtb3J5IHJhbmdlIHRvCi0gICAgICogdGhpcyBmdW5jdGlvbi4KLSAgICAgKi8KLSAgICBzdHJjcHkocGF0aCxfcGF0aCk7Ci0gICAgaWYgKERvc1F1ZXJ5UGF0aEluZm8ocGF0aCwgRklMX1NUQU5EQVJELCAmZnMsIHNpemVvZihmcykpICE9IE5PX0VSUk9SKQotCXJldHVybiAtMTsKLSAgICBpZiAoKF9hbW9kZSAmIFdfT0spICYmIChmcy5hdHRyRmlsZSAmIEZJTEVfUkVBRE9OTFkpKQotCXJldHVybiAtMTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IF9DREVDTCBzdHViX2Nsb3NlKGludCBfZmlsZGVzKQotewotICAgIGlmIChEb3NDbG9zZShfZmlsZGVzKSAhPSBOT19FUlJPUikKLQlyZXR1cm4gLTE7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLW9mZl90IF9DREVDTCBzdHViX2xzZWVrKGludCBfZmlsZGVzLCBvZmZfdCBfb2Zmc2V0LCBpbnQgX3doZW5jZSkKLXsKLSAgICBVTE9ORyAgY2JBY3R1YWwsIG9yaWdpbjsKLQotICAgIHN3aXRjaCAoX3doZW5jZSkgewotCWNhc2UgU0VFS19DVVI6Ci0JICAgIG9yaWdpbiA9IEZJTEVfQ1VSUkVOVDsKLQkgICAgYnJlYWs7Ci0JY2FzZSBTRUVLX0VORDoKLQkgICAgb3JpZ2luID0gRklMRV9FTkQ7Ci0JICAgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAgIG9yaWdpbiA9IEZJTEVfQkVHSU47Ci0JfQotICAgIGlmIChEb3NTZXRGaWxlUHRyKF9maWxkZXMsIF9vZmZzZXQsIG9yaWdpbiwgJmNiQWN0dWFsKSAhPSBOT19FUlJPUikKLQlyZXR1cm4gLTE7Ci0gICAgcmV0dXJuIGNiQWN0dWFsOwotfQotCi1zaXplX3QgX0NERUNMIHN0dWJfcmVhZChpbnQgX2ZpbGRlcywgdm9pZCAqX2J1Ziwgc2l6ZV90IF9uYnl0ZSkKLXsKLSAgICBVTE9ORyAgIGNiQWN0dWFsID0gMCxjYlJlYWQ7Ci0gICAgdWNoYXIgICAqcCA9IF9idWY7Ci0gICAgdWNoYXIgICBmaWxlX2lvX2J1ZltCVUZfU0laRV07Ci0KLSAgICAvKiBXZSBuZWVkIHRvIHBlcmZvcm0gdGhlIHBoeXNpY2FsIHJlYWQgaW4gY2h1bmtzIGludG8gYQotICAgICAqIGEgdGVtcG9yYXJ5IHN0YXRpYyBidWZmZXIsIHNpbmNlIHRoZSBidWZmZXIgcGFzc2VkIGluIG1heSBiZQotICAgICAqIGluIGtlcm5lbCBzcGFjZSBhbmQgd2lsbCBjYXVzZSBEb3NSZWFkIHRvIGJhaWwgaW50ZXJuYWxseS4KLSAgICAgKi8KLSAgICB3aGlsZSAoX25ieXRlID4gQlVGX1NJWkUpIHsKLQlpZiAoRG9zUmVhZChfZmlsZGVzLCBmaWxlX2lvX2J1ZiwgQlVGX1NJWkUsICZjYlJlYWQpICE9IE5PX0VSUk9SKQotCSAgICByZXR1cm4gLTE7Ci0JY2JBY3R1YWwgKz0gY2JSZWFkOwotCW1lbWNweShwLGZpbGVfaW9fYnVmLEJVRl9TSVpFKTsKLQlwICs9IEJVRl9TSVpFOwotCV9uYnl0ZSAtPSBCVUZfU0laRTsKLQl9Ci0gICAgaWYgKF9uYnl0ZSkgewotCWlmIChEb3NSZWFkKF9maWxkZXMsIGZpbGVfaW9fYnVmLCBfbmJ5dGUsICZjYlJlYWQpICE9IE5PX0VSUk9SKQotCSAgICByZXR1cm4gLTE7Ci0JY2JBY3R1YWwgKz0gY2JSZWFkOwotCW1lbWNweShwLGZpbGVfaW9fYnVmLF9uYnl0ZSk7Ci0JfQotICAgIHJldHVybiBjYkFjdHVhbDsKLX0KLQotc2l6ZV90IF9DREVDTCBzdHViX3dyaXRlKGludCBfZmlsZGVzLCBjb25zdCB2b2lkICpfYnVmLCBzaXplX3QgX25ieXRlKQotewotICAgIFVMT05HICAgY2JBY3R1YWwgPSAwLGNiV3JpdGU7Ci0gICAgdWNoYXIgICAqcCA9IChQVk9JRClfYnVmOwotICAgIHVjaGFyICAgZmlsZV9pb19idWZbQlVGX1NJWkVdOwotCi0gICAgLyogV2UgbmVlZCB0byBwZXJmb3JtIHRoZSBwaHlzaWNhbCB3cml0ZSBpbiBjaHVua3MgZnJvbSBhCi0gICAgICogYSB0ZW1wb3Jhcnkgc3RhdGljIGJ1ZmZlciwgc2luY2UgdGhlIGJ1ZmZlciBwYXNzZWQgaW4gbWF5IGJlCi0gICAgICogaW4ga2VybmVsIHNwYWNlIGFuZCB3aWxsIGNhdXNlIERvc1dyaXRlIHRvIGJhaWwgaW50ZXJuYWxseS4KLSAgICAgKi8KLSAgICB3aGlsZSAoX25ieXRlID4gQlVGX1NJWkUpIHsKLQltZW1jcHkoZmlsZV9pb19idWYscCxCVUZfU0laRSk7Ci0JaWYgKERvc1dyaXRlKF9maWxkZXMsIGZpbGVfaW9fYnVmLCBCVUZfU0laRSwgJmNiV3JpdGUpICE9IE5PX0VSUk9SKQotCSAgICByZXR1cm4gLTE7Ci0JY2JBY3R1YWwgKz0gY2JXcml0ZTsKLQlwICs9IEJVRl9TSVpFOwotCV9uYnl0ZSAtPSBCVUZfU0laRTsKLQl9Ci0gICAgaWYgKF9uYnl0ZSkgewotCW1lbWNweShmaWxlX2lvX2J1ZixwLF9uYnl0ZSk7Ci0JaWYgKERvc1dyaXRlKF9maWxkZXMsIGZpbGVfaW9fYnVmLCBfbmJ5dGUsICZjYldyaXRlKSAhPSBOT19FUlJPUikKLQkgICAgcmV0dXJuIC0xOwotCWNiQWN0dWFsICs9IGNiV3JpdGU7Ci0JfQotICAgIHJldHVybiBjYkFjdHVhbDsKLX0KLQotaW50IF9DREVDTCBzdHViX3VubGluayhjb25zdCBjaGFyICpfcGF0aCkKLXsKLSAgICBjaGFyICAgIHBhdGhbUE1fTUFYX1BBVEhdOwotCi0gICAgLyogQ29weSB0aGUgcGF0aCB0byBhIHZhcmlhYmxlIG9uIHRoZSBzdGFjay4gV2UgbmVlZCB0byBkbyB0aGlzCi0gICAgICogZm9yIE9TLzIgYXMgd2hlbiB0aGUgZHJpdmVycyBhcmUgbG9hZGVkIGludG8gc2hhcmVkIGtlcm5lbAotICAgICAqIG1lbW9yeSwgd2UgY2FuJ3QgcGFzcyBhbiBhZGRyZXNzIGZyb20gdGhhdCBtZW1vcnkgcmFuZ2UgdG8KLSAgICAgKiB0aGlzIGZ1bmN0aW9uLgotICAgICAqLwotICAgIHN0cmNweShwYXRoLF9wYXRoKTsKLSAgICBpZiAoRG9zRGVsZXRlKHBhdGgpICE9IE5PX0VSUk9SKQotCXJldHVybiAtMTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IF9DREVDTCBzdHViX2lzYXR0eShpbnQgX2ZpbGRlcykKLXsKLSAgICBVTE9ORyAgaHR5cGUsIGZsYWdzOwotCi0gICAgaWYgKERvc1F1ZXJ5SFR5cGUoX2ZpbGRlcywgJmh0eXBlLCAmZmxhZ3MpICE9IE5PX0VSUk9SKQotCXJldHVybiAwOwotICAgIHJldHVybiAoKGh0eXBlICYgMHhGRikgPT0gSEFORFRZUEVfREVWSUNFKTsKLX0KLQotLyogPHN0ZGlvLmg+IHN0dWIgZnVuY3Rpb25zICovCi1pbnQgX0NERUNMIHN0dWJfcmVtb3ZlKGNvbnN0IGNoYXIgKl9wYXRoKQotewotICAgIGNoYXIgICAgcGF0aFtQTV9NQVhfUEFUSF07Ci0KLSAgICAvKiBDb3B5IHRoZSBwYXRoIHRvIGEgdmFyaWFibGUgb24gdGhlIHN0YWNrLiBXZSBuZWVkIHRvIGRvIHRoaXMKLSAgICAgKiBmb3IgT1MvMiBhcyB3aGVuIHRoZSBkcml2ZXJzIGFyZSBsb2FkZWQgaW50byBzaGFyZWQga2VybmVsCi0gICAgICogbWVtb3J5LCB3ZSBjYW4ndCBwYXNzIGFuIGFkZHJlc3MgZnJvbSB0aGF0IG1lbW9yeSByYW5nZSB0bwotICAgICAqIHRoaXMgZnVuY3Rpb24uCi0gICAgICovCi0gICAgc3RyY3B5KHBhdGgsX3BhdGgpOwotICAgIGlmIChEb3NEZWxldGUocGF0aCkgIT0gTk9fRVJST1IpCi0JcmV0dXJuIC0xOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgX0NERUNMIHN0dWJfcmVuYW1lKGNvbnN0IGNoYXIgKl9vbGQsIGNvbnN0IGNoYXIgKl9uZXcpCi17Ci0gICAgY2hhciAgICBvbGRbUE1fTUFYX1BBVEhdOwotICAgIGNoYXIgICAgbmV3W1BNX01BWF9QQVRIXTsKLQotICAgIC8qIENvcHkgdGhlIHBhdGggdG8gYSB2YXJpYWJsZSBvbiB0aGUgc3RhY2suIFdlIG5lZWQgdG8gZG8gdGhpcwotICAgICAqIGZvciBPUy8yIGFzIHdoZW4gdGhlIGRyaXZlcnMgYXJlIGxvYWRlZCBpbnRvIHNoYXJlZCBrZXJuZWwKLSAgICAgKiBtZW1vcnksIHdlIGNhbid0IHBhc3MgYW4gYWRkcmVzcyBmcm9tIHRoYXQgbWVtb3J5IHJhbmdlIHRvCi0gICAgICogdGhpcyBmdW5jdGlvbi4KLSAgICAgKi8KLSAgICBzdHJjcHkob2xkLF9vbGQpOwotICAgIHN0cmNweShuZXcsX25ldyk7Ci0gICAgaWYgKERvc01vdmUob2xkLCBuZXcpICE9IE5PX0VSUk9SKQotCXJldHVybiAtMTsKLSAgICByZXR1cm4gMDsKLX0KLQotI2Vsc2UKLQotdm9pZCBfQ0RFQ0wgX09TX3NldGZpbGVhdHRyKGNvbnN0IGNoYXIgKmZpbGVuYW1lLHVuc2lnbmVkIGF0dHJpYikKLXsgLyogVW5hYmxlIHRvIHNldCBoaWRkZW4sIHN5c3RlbSBhdHRyaWJ1dGVzIG9uIFVuaXguICovIH0KLQotI2VuZGlmCi0KLSNpZm5kZWYgVVNFX0xPQ0FMX0ZJTEVJTwotCi0vKiA8bGliYy9maWxlLmg+IHN0dWIgZnVuY3Rpb25zICovCi1pbnQgX0NERUNMIHN0dWJfb3Blbihjb25zdCBjaGFyICpfcGF0aCwgaW50IF9vZmxhZywgdW5zaWduZWQgX21vZGUpCi17Ci0gICAgaW50IG9mbGFnX3RhYltdID0gewotCV9fX09fUkRPTkxZLCAgICBPX1JET05MWSwKLQlfX19PX1dST05MWSwgICAgT19XUk9OTFksCi0JX19fT19SRFdSLCAgICAgIE9fUkRXUiwKLQlfX19PX0JJTkFSWSwgICAgT19CSU5BUlksCi0JX19fT19URVhULCAgICAgIE9fVEVYVCwKLQlfX19PX0NSRUFULCAgICAgT19DUkVBVCwKLQlfX19PX0VYQ0wsICAgICAgT19FWENMLAotCV9fX09fVFJVTkMsICAgICBPX1RSVU5DLAotCV9fX09fQVBQRU5ELCAgICBPX0FQUEVORCwKLQl9OwotICAgIGludCBpLG9mbGFnID0gMDsKLQotICAgIC8qIFRyYW5zbGF0ZSB0aGUgb2ZsYWcncyB0byB0aGUgT1MgZGVwZW5kZW50IHZlcnNpb25zICovCi0gICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihvZmxhZ190YWIpIC8gc2l6ZW9mKGludCk7IGkgKz0gMikgewotCWlmIChfb2ZsYWcgJiBvZmxhZ190YWJbaV0pCi0JICAgIG9mbGFnIHw9IG9mbGFnX3RhYltpKzFdOwotCX0KLSAgICByZXR1cm4gb3BlbihfcGF0aCxvZmxhZyxfbW9kZSk7Ci19Ci0KLWludCBfQ0RFQ0wgc3R1Yl9hY2Nlc3MoY29uc3QgY2hhciAqX3BhdGgsIGludCBfYW1vZGUpCi17IHJldHVybiBhY2Nlc3MoX3BhdGgsX2Ftb2RlKTsgfQotCi1pbnQgX0NERUNMIHN0dWJfY2xvc2UoaW50IF9maWxkZXMpCi17IHJldHVybiBjbG9zZShfZmlsZGVzKTsgfQotCi1vZmZfdCBfQ0RFQ0wgc3R1Yl9sc2VlayhpbnQgX2ZpbGRlcywgb2ZmX3QgX29mZnNldCwgaW50IF93aGVuY2UpCi17IHJldHVybiBsc2VlayhfZmlsZGVzLF9vZmZzZXQsX3doZW5jZSk7IH0KLQotc2l6ZV90IF9DREVDTCBzdHViX3JlYWQoaW50IF9maWxkZXMsIHZvaWQgKl9idWYsIHNpemVfdCBfbmJ5dGUpCi17IHJldHVybiByZWFkKF9maWxkZXMsX2J1ZixfbmJ5dGUpOyB9Ci0KLWludCBfQ0RFQ0wgc3R1Yl91bmxpbmsoY29uc3QgY2hhciAqX3BhdGgpCi17IHJldHVybiB1bmxpbmsoX3BhdGgpOyB9Ci0KLXNpemVfdCBfQ0RFQ0wgc3R1Yl93cml0ZShpbnQgX2ZpbGRlcywgY29uc3Qgdm9pZCAqX2J1Ziwgc2l6ZV90IF9uYnl0ZSkKLXsgcmV0dXJuIHdyaXRlKF9maWxkZXMsX2J1ZixfbmJ5dGUpOyB9Ci0KLWludCBfQ0RFQ0wgc3R1Yl9pc2F0dHkoaW50IF9maWxkZXMpCi17IHJldHVybiBpc2F0dHkoX2ZpbGRlcyk7IH0KLQotLyogPHN0ZGlvLmg+IHN0dWIgZnVuY3Rpb25zICovCi1pbnQgX0NERUNMIHN0dWJfcmVtb3ZlKGNvbnN0IGNoYXIgKl9maWxlbmFtZSkKLXsgcmV0dXJuIHJlbW92ZShfZmlsZW5hbWUpOyB9Ci0KLWludCBfQ0RFQ0wgc3R1Yl9yZW5hbWUoY29uc3QgY2hhciAqX29sZCwgY29uc3QgY2hhciAqX25ldykKLXsgcmV0dXJuIHJlbmFtZShfb2xkLF9uZXcpOyB9Ci0KLSNlbmRpZgotCi0jaWZuZGVmIFVTRV9MT0NBTF9HRVREQVRFCi0KLS8qIFJldHVybiB0aGUgY3VycmVudCBkYXRlIGluIGRheXMgc2luY2UgMS8xLzE5ODAgKi8KLXVsb25nIF9DREVDTCBfT1NfZ2V0Y3VycmVudGRhdGUodm9pZCkKLXsKLSAgICBzdHJ1Y3QgdG0gcmVmVGltZTsKLSAgICByZWZUaW1lLnRtX3llYXIgPSA4MDsKLSAgICByZWZUaW1lLnRtX21vbiAgPSAwOwotICAgIHJlZlRpbWUudG1fbWRheSA9IDE7Ci0gICAgcmVmVGltZS50bV9ob3VyID0gMDsKLSAgICByZWZUaW1lLnRtX21pbiAgPSAwOwotICAgIHJlZlRpbWUudG1fc2VjICA9IDA7Ci0gICAgcmVmVGltZS50bV9pc2RzdCA9IC0xOwotICAgIHJldHVybiAodGltZShOVUxMKSAtIG1rdGltZSgmcmVmVGltZSkpIC8gKDI0ICogMzYwMEwpOwotfQotCi0jZW5kaWYKLQotaW50IF9DREVDTCBzdHViX3JhaXNlKGludCBzaWcpCi17Ci0jaWYgZGVmaW5lZChfX1dJTjMyX1ZYRF9fKSB8fCBkZWZpbmVkKF9fTlRfRFJJVkVSX18pIHx8IGRlZmluZWQoX19TTVgzMl9fKQotICAgIHJldHVybiAtMTsKLSNlbHNlCi0gICAgcmV0dXJuIHJhaXNlKHNpZyk7Ci0jZW5kaWYKLX0KLQotI2lmZGVmIF9fV0lORE9XUzMyX18KLXR5cGVkZWYgdm9pZCAoKl9fY29kZV9wdHIpKGludCk7Ci0jZWxzZQotdHlwZWRlZiB2b2lkICgqX19jb2RlX3B0cikoKTsKLSNlbmRpZgotCi12b2lkICogX0NERUNMIHN0dWJfc2lnbmFsKGludCBzaWcsIHZvaWQgKmhhbmRsZXIpCi17Ci0jaWYgZGVmaW5lZChfX1dJTjMyX1ZYRF9fKSB8fCBkZWZpbmVkKF9fTlRfRFJJVkVSX18pIHx8IGRlZmluZWQoX19TTVgzMl9fKQotICAgIHJldHVybiBOVUxMOwotI2Vsc2UKLSAgICByZXR1cm4gKHZvaWQqKXNpZ25hbChzaWcsKF9fY29kZV9wdHIpaGFuZGxlcik7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9tYWtlZmlsZSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9tYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFhYzAzOC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vbWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTYgU2NpVGVjaCBTb2Z0d2FyZS4KLSMgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIwotIyBEZXNjcmlwdG9uOiAgIE1ha2VmaWxlIGZvciBVbmlWQkUodG0pLCBVbmlQT1dFUih0bSksIFVWQkVMaWIodG0pIGFuZAotIyAgICAgICAgICAgICAgIERQTVNMaWIgbGlicmFyeSBmaWxlcy4gUmVxdWlyZXMgQm9ybGFuZCBDKysgNC41MiB0byBidWlsZAotIyAgICAgICAgICAgICAgIHNvbWUgY29tcG9uZW50cy4KLSMKLSMgJERhdGU6IDIwMDIvMTAvMDIgMTU6MzU6MjAgJCAkQXV0aG9yOiBoZnJpZWRlbiAkCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1DRkxBR1MgKz0gLURURVNUSU5HX0dURgotCi1ndGZjYWxjJEU6ICBndGZjYWxjJE8KLQotLklOQ0xVREU6ICIkKFNDSVRFQ0gpL21ha2VkZWZzL2NvbW1vbi5tayIKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi9wZWxvYWRlci5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL3BlbG9hZGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMzRiYjAuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvY29tbW9uL3BlbG9hZGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTUdMIEdyYXBoaWNzIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgTW9kdWxlIHRvIGltcGxlbWVudCBhIHNpbXBsZSBQb3J0YWJsZSBCaW5hcnkgRExMIGxvYWRlcgotKiAgICAgICAgICAgICAgIGxpYnJhcnkuIFRoaXMgbGlicmFyeSBjYW4gYmUgdXNlZCB0byBsb2FkIFBFIERMTCdzIHVuZGVyCi0qICAgICAgICAgICAgICAgYW55IEludGVsIGJhc2VkIE9TLCBwcm92aWRlZCB0aGUgRExMJ3MgZG8gbm90IGhhdmUgYW55Ci0qICAgICAgICAgICAgICAgaW1wb3J0cyBpbiB0aGUgaW1wb3J0IHRhYmxlLgotKgotKiAgICAgICAgICAgICAgIE5PVEU6IFRoaXMgbG9hZGVyIG1vZHVsZSBleHBlY3RzIHRoZSBETEwncyB0byBiZSBidWlsdCB3aXRoCi0qICAgICAgICAgICAgICAgICAgICAgV2F0Y29tIEMrKyBhbmQgbWF5IHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzIHdpdGgKLSogICAgICAgICAgICAgICAgICAgICBETEwncyBsaW5rZWQgYnkgYW5vdGhlciBjb21waWxlci4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJkcnZsaWIvcGVsb2FkZXIuaCIKLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgImRydmxpYi9vcy9vcy5oIgotI2luY2x1ZGUgImRydmxpYi9saWJjL2luaXQuaCIKLSNpZiAoZGVmaW5lZChfX1dJTkRPV1MzMl9fKSB8fCBkZWZpbmVkKF9fRFJJVkVSX18pKSAmJiBkZWZpbmVkKENIRUNLRUQpCi0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSNkZWZpbmUgU1RSSUNUCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2VuZGlmCi0jaW5jbHVkZSAiZHJ2bGliL3BlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgICAgICAgICAgcmVzdWx0ID0gUEVfb2s7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZiAgICAgICAgICAgLSBIYW5kbGUgdG8gb3BlbiBmaWxlIHRvIHJlYWQgZHJpdmVyIGZyb20KLXN0YXJ0T2Zmc2V0IC0gT2Zmc2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgZHJpdmVyIHdpdGhpbiB0aGUgZmlsZQotCi1SRVRVUk5TOgotSGFuZGxlIHRvIGxvYWRlZCBQRSBETEwsIG9yIE5VTEwgb24gZmFpbHVyZS4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gbG9hZHMgYSBQb3J0YWJsZSBCaW5hcnkgRExMIGxpYnJhcnkgZnJvbSBkaXNrLCByZWxvY2F0ZXMKLXRoZSBjb2RlIGFuZCByZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBsb2FkZWQgbGlicmFyeS4gVGhpcyBmdW5jdGlvbiBpcyB0aGUKLXNhbWUgYXMgdGhlIHJlZ3VsYXIgUEVfbG9hZExpYnJhcnkgZXhjZXB0IHRoYXQgaXQgdGFrZSBhIGhhbmRsZSB0byBhbgotb3BlbiBmaWxlIGFuZCBhbiBvZmZzZXQgd2l0aGluIHRoYXQgZmlsZSBmb3IgdGhlIERMTCB0byBsb2FkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgUEVfcmVhZEhlYWRlcigKLSAgICBGSUxFICpmLAotICAgIGxvbmcgc3RhcnRPZmZzZXQsCi0gICAgRklMRV9IRFIgKmZpbGVoZHIsCi0gICAgT1BUSU9OQUxfSERSICpvcHRoZHIpCi17Ci0gICAgRVhFX0hEUiBleGVoZHI7Ci0gICAgdWxvbmcgICBvZmZzZXQsc2lnbmF0dXJlOwotCi0gICAgLyogUmVhZCB0aGUgRVhFIGhlYWRlciBhbmQgY2hlY2sgZm9yIHZhbGlkIGhlYWRlciBzaWduYXR1cmUgKi8KLSAgICByZXN1bHQgPSBQRV9pbnZhbGlkRExMSW1hZ2U7Ci0gICAgZnNlZWsoZiwgc3RhcnRPZmZzZXQsIFNFRUtfU0VUKTsKLSAgICBpZiAoZnJlYWQoJmV4ZWhkciwgMSwgc2l6ZW9mKGV4ZWhkciksIGYpICE9IHNpemVvZihleGVoZHIpKQotCXJldHVybiBmYWxzZTsKLSAgICBpZiAoZXhlaGRyLnNpZ25hdHVyZSAhPSAweDVBNEQpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgLyogTm93IHNlZWsgdG8gdGhlIHN0YXJ0IG9mIHRoZSBQRSBoZWFkZXIgZGVmaW5lZCBhdCBvZmZzZXQgMHgzQwotICAgICAqIGluIHRoZSBNUy1ET1MgRVhFIGhlYWRlciwgYW5kIHJlYWQgdGhlIHNpZ25hdHVyZSBhbmQgY2hlY2sgaXQuCi0gICAgICovCi0gICAgZnNlZWsoZiwgc3RhcnRPZmZzZXQrMHgzQywgU0VFS19TRVQpOwotICAgIGlmIChmcmVhZCgmb2Zmc2V0LCAxLCBzaXplb2Yob2Zmc2V0KSwgZikgIT0gc2l6ZW9mKG9mZnNldCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIGZzZWVrKGYsIHN0YXJ0T2Zmc2V0K29mZnNldCwgU0VFS19TRVQpOwotICAgIGlmIChmcmVhZCgmc2lnbmF0dXJlLCAxLCBzaXplb2Yoc2lnbmF0dXJlKSwgZikgIT0gc2l6ZW9mKHNpZ25hdHVyZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIGlmIChzaWduYXR1cmUgIT0gMHgwMDAwNDU1MCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAvKiBOb3cgcmVhZCB0aGUgUEUgZmlsZSBoZWFkZXIgYW5kIGNoZWNrIHRoYXQgaXQgaXMgY29ycmVjdCAqLwotICAgIGlmIChmcmVhZChmaWxlaGRyLCAxLCBzaXplb2YoKmZpbGVoZHIpLCBmKSAhPSBzaXplb2YoKmZpbGVoZHIpKQotCXJldHVybiBmYWxzZTsKLSAgICBpZiAoZmlsZWhkci0+TWFjaGluZSAhPSBJTUFHRV9GSUxFX01BQ0hJTkVfSTM4NikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCEoZmlsZWhkci0+Q2hhcmFjdGVyaXN0aWNzICYgSU1BR0VfRklMRV8zMkJJVF9NQUNISU5FKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCEoZmlsZWhkci0+Q2hhcmFjdGVyaXN0aWNzICYgSU1BR0VfRklMRV9ETEwpKQotCXJldHVybiBmYWxzZTsKLSAgICBpZiAoZnJlYWQob3B0aGRyLCAxLCBzaXplb2YoKm9wdGhkciksIGYpICE9IHNpemVvZigqb3B0aGRyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgaWYgKG9wdGhkci0+TWFnaWMgIT0gMHgxMEIpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgLyogU3VjY2Vzcywgc28gcmV0dXJuIHRydWUhICovCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZiAgICAgICAgICAgLSBIYW5kbGUgdG8gb3BlbiBmaWxlIHRvIHJlYWQgZHJpdmVyIGZyb20KLXN0YXJ0T2Zmc2V0IC0gT2Zmc2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgZHJpdmVyIHdpdGhpbiB0aGUgZmlsZQotCi1SRVRVUk5TOgotU2l6ZSBvZiB0aGUgRExMIGZpbGUgb24gZGlzaywgb3IgLTEgb24gZXJyb3IKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gc2NhbnMgdGhlIGhlYWRlcnMgZm9yIGEgUG9ydGFibGUgQmluYXJ5IERMTCB0byBkZXRlcm1pbmUgdGhlCi1sZW5ndGggb2YgdGhlIERMTCBmaWxlIG9uIGRpc2suCi17c2VjcmV0fQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIFBFQVBJIFBFX2dldEZpbGVTaXplKAotICAgIEZJTEUgKmYsCi0gICAgdWxvbmcgc3RhcnRPZmZzZXQpCi17Ci0gICAgRklMRV9IRFIgICAgICAgIGZpbGVoZHI7Ci0gICAgT1BUSU9OQUxfSERSICAgIG9wdGhkcjsKLSAgICBTRUNUSU9OX0hEUiAgICAgc2VjdGhkcjsKLSAgICB1bG9uZyAgICAgICAgICAgc2l6ZTsKLSAgICBpbnQgICAgICAgICAgICAgaTsKLQotICAgIC8qIFJlYWQgdGhlIFBFIGZpbGUgaGVhZGVycyBmcm9tIGRpc2sgKi8KLSAgICBpZiAoIVBFX3JlYWRIZWFkZXIoZixzdGFydE9mZnNldCwmZmlsZWhkciwmb3B0aGRyKSkKLQlyZXR1cm4gMHhGRkZGRkZGRjsKLQotICAgIC8qIFNjYW4gYWxsIHRoZSBzZWN0aW9uIGhlYWRlcnMgc3VtbWluZyB1cCB0aGUgdG90YWwgc2l6ZSAqLwotICAgIHNpemUgPSBvcHRoZHIuU2l6ZU9mSGVhZGVyczsKLSAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZWhkci5OdW1iZXJPZlNlY3Rpb25zOyBpKyspIHsKLQlpZiAoZnJlYWQoJnNlY3RoZHIsIDEsIHNpemVvZihzZWN0aGRyKSwgZikgIT0gc2l6ZW9mKHNlY3RoZHIpKQotCSAgICByZXR1cm4gMHhGRkZGRkZGRjsKLQlzaXplICs9IHNlY3RoZHIuU2l6ZU9mUmF3RGF0YTsKLQl9Ci0gICAgcmV0dXJuIHNpemU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUxvYWRzIGEgUG9ydGFibGUgQmluYXJ5IERMTCBpbnRvIG1lbW9yeSBmcm9tIGFuIG9wZW4gZmlsZQotCi1IRUFERVI6Ci1wZWxvYWRlci5oCi0KLVBBUkFNRVRFUlM6Ci1mICAgICAgICAgICAtIEhhbmRsZSB0byBvcGVuIGZpbGUgdG8gcmVhZCBkcml2ZXIgZnJvbQotc3RhcnRPZmZzZXQgLSBPZmZzZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBkcml2ZXIgd2l0aGluIHRoZSBmaWxlCi1zaXplICAgICAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSBzaXplIG9mIHRoZSBkcml2ZXIgbG9hZGVkCi1zaGFyZWQgICAgICAtIFRydWUgdG8gbG9hZCBtb2R1bGUgaW50byBzaGFyZWQgbWVtb3J5Ci0KLVJFVFVSTlM6Ci1IYW5kbGUgdG8gbG9hZGVkIFBFIERMTCwgb3IgTlVMTCBvbiBmYWlsdXJlLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBsb2FkcyBhIFBvcnRhYmxlIEJpbmFyeSBETEwgbGlicmFyeSBmcm9tIGRpc2ssIHJlbG9jYXRlcwotdGhlIGNvZGUgYW5kIHJldHVybnMgYSBoYW5kbGUgdG8gdGhlIGxvYWRlZCBsaWJyYXJ5LiBUaGlzIGZ1bmN0aW9uIGlzIHRoZQotc2FtZSBhcyB0aGUgcmVndWxhciBQRV9sb2FkTGlicmFyeSBleGNlcHQgdGhhdCBpdCB0YWtlIGEgaGFuZGxlIHRvIGFuCi1vcGVuIGZpbGUgYW5kIGFuIG9mZnNldCB3aXRoaW4gdGhhdCBmaWxlIGZvciB0aGUgRExMIHRvIGxvYWQuCi0KLVNFRSBBTFNPOgotUEVfbG9hZExpYnJhcnksIFBFX2dldFByb2NBZGRyZXNzLCBQRV9mcmVlTGlicmFyeQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVBFX01PRFVMRSAqIFBFQVBJIFBFX2xvYWRMaWJyYXJ5RXh0KAotICAgIEZJTEUgKmYsCi0gICAgdWxvbmcgc3RhcnRPZmZzZXQsCi0gICAgdWxvbmcgKnNpemUsCi0gICAgaWJvb2wgc2hhcmVkKQotewotICAgIEZJTEVfSERSICAgICAgICBmaWxlaGRyOwotICAgIE9QVElPTkFMX0hEUiAgICBvcHRoZHI7Ci0gICAgU0VDVElPTl9IRFIgICAgIHNlY3RoZHI7Ci0gICAgdWxvbmcgICAgICAgICAgIG9mZnNldCxwYWdlT2Zmc2V0OwotICAgIHVsb25nICAgICAgICAgICB0ZXh0X29mZix0ZXh0X2FkZHIsdGV4dF9zaXplOwotICAgIHVsb25nICAgICAgICAgICBkYXRhX29mZixkYXRhX2FkZHIsZGF0YV9zaXplLGRhdGFfZW5kOwotICAgIHVsb25nICAgICAgICAgICBleHBvcnRfb2ZmLGV4cG9ydF9hZGRyLGV4cG9ydF9zaXplLGV4cG9ydF9lbmQ7Ci0gICAgdWxvbmcgICAgICAgICAgIHJlbG9jX29mZixyZWxvY19zaXplOwotICAgIHVsb25nICAgICAgICAgICBpbWFnZV9zaXplOwotICAgIGludCAgICAgICAgICAgICBpLGRlbHRhLG51bUZpeHVwczsKLSAgICB1c2hvcnQgICAgICAgICAgcmVsb2NUeXBlLCpmaXh1cDsKLSAgICBQRV9NT0RVTEUgICAgICAgKmhNb2QgPSBOVUxMOwotICAgIHZvaWQgICAgICAgICAgICAqcmVsb2MgPSBOVUxMOwotICAgIEJBU0VfUkVMT0NBVElPTiAqYmFzZVJlbG9jOwotICAgIEluaXRMaWJDX3QgICAgICBJbml0TGliQzsKLQotICAgIC8qIFJlYWQgdGhlIFBFIGZpbGUgaGVhZGVycyBmcm9tIGRpc2sgKi8KLSAgICBpZiAoIVBFX3JlYWRIZWFkZXIoZixzdGFydE9mZnNldCwmZmlsZWhkciwmb3B0aGRyKSkKLQlyZXR1cm4gTlVMTDsKLQotICAgIC8qIFNjYW4gYWxsIHRoZSBzZWN0aW9uIGhlYWRlcnMgYW5kIGZpbmQgdGhlIG5lY2Vzc2FyeSBzZWN0aW9ucyAqLwotICAgIHRleHRfb2ZmID0gZGF0YV9vZmYgPSByZWxvY19vZmYgPSBleHBvcnRfb2ZmID0gMDsKLSAgICB0ZXh0X2FkZHIgPSB0ZXh0X3NpemUgPSAwOwotICAgIGRhdGFfYWRkciA9IGRhdGFfc2l6ZSA9IGRhdGFfZW5kID0gMDsKLSAgICBleHBvcnRfYWRkciA9IGV4cG9ydF9zaXplID0gZXhwb3J0X2VuZCA9IDA7Ci0gICAgcmVsb2Nfc2l6ZSA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IGZpbGVoZHIuTnVtYmVyT2ZTZWN0aW9uczsgaSsrKSB7Ci0JaWYgKGZyZWFkKCZzZWN0aGRyLCAxLCBzaXplb2Yoc2VjdGhkciksIGYpICE9IHNpemVvZihzZWN0aGRyKSkKLQkgICAgZ290byBFcnJvcjsKLQlpZiAoc3RyY21wKHNlY3RoZHIuTmFtZSwgIi5lZGF0YSIpID09IDAgfHwgc3RyY21wKHNlY3RoZHIuTmFtZSwgIi5yZGF0YSIpID09IDApIHsKLQkgICAgLyogRXhwb3J0cyBzZWN0aW9uICovCi0JICAgIGV4cG9ydF9vZmYgPSBzZWN0aGRyLlBvaW50ZXJUb1Jhd0RhdGE7Ci0JICAgIGV4cG9ydF9hZGRyID0gc2VjdGhkci5WaXJ0dWFsQWRkcmVzczsKLQkgICAgZXhwb3J0X3NpemUgPSBzZWN0aGRyLlNpemVPZlJhd0RhdGE7Ci0JICAgIGV4cG9ydF9lbmQgPSBleHBvcnRfYWRkciArIGV4cG9ydF9zaXplOwotCSAgICB9Ci0JZWxzZSBpZiAoc3RyY21wKHNlY3RoZHIuTmFtZSwgIi5pZGF0YSIpID09IDApIHsKLQkgICAgLyogSW1wb3J0cyBzZWN0aW9uLCBpZ25vcmUgKi8KLQkgICAgfQotCWVsc2UgaWYgKHN0cmNtcChzZWN0aGRyLk5hbWUsICIucmVsb2MiKSA9PSAwKSB7Ci0JICAgIC8qIFJlbG9jYXRpb25zIHNlY3Rpb24gKi8KLQkgICAgcmVsb2Nfb2ZmID0gc2VjdGhkci5Qb2ludGVyVG9SYXdEYXRhOwotCSAgICByZWxvY19zaXplID0gc2VjdGhkci5TaXplT2ZSYXdEYXRhOwotCSAgICB9Ci0JZWxzZSBpZiAoIXRleHRfb2ZmICYmIHNlY3RoZHIuQ2hhcmFjdGVyaXN0aWNzICYgSU1BR0VfU0NOX0NOVF9DT0RFKSB7Ci0JICAgIC8qIENvZGUgc2VjdGlvbiAqLwotCSAgICB0ZXh0X29mZiA9IHNlY3RoZHIuUG9pbnRlclRvUmF3RGF0YTsKLQkgICAgdGV4dF9hZGRyID0gc2VjdGhkci5WaXJ0dWFsQWRkcmVzczsKLQkgICAgdGV4dF9zaXplID0gc2VjdGhkci5TaXplT2ZSYXdEYXRhOwotCSAgICB9Ci0JZWxzZSBpZiAoIWRhdGFfb2ZmICYmIHNlY3RoZHIuQ2hhcmFjdGVyaXN0aWNzICYgSU1BR0VfU0NOX0NOVF9JTklUSUFMSVpFRF9EQVRBKSB7Ci0JICAgIC8qIERhdGEgc2VjdGlvbiAqLwotCSAgICBkYXRhX29mZiA9IHNlY3RoZHIuUG9pbnRlclRvUmF3RGF0YTsKLQkgICAgZGF0YV9hZGRyID0gc2VjdGhkci5WaXJ0dWFsQWRkcmVzczsKLQkgICAgZGF0YV9zaXplID0gc2VjdGhkci5TaXplT2ZSYXdEYXRhOwotCSAgICBkYXRhX2VuZCA9IGRhdGFfYWRkciArIGRhdGFfc2l6ZTsKLQkgICAgfQotCX0KLQotICAgIC8qIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYWxsIHRoZSBzZWN0aW9ucyB3ZSBuZWVkICovCi0gICAgaWYgKCF0ZXh0X29mZiB8fCAhZGF0YV9vZmYgfHwgIWV4cG9ydF9vZmYgfHwgIXJlbG9jX29mZikgewotCXJlc3VsdCA9IFBFX2ludmFsaWRETExJbWFnZTsKLQlnb3RvIEVycm9yOwotCX0KLQotICAgIC8qIEZpbmQgdGhlIHNpemUgb2YgdGhlIGltYWdlIHRvIGxvYWQgYWxsb2NhdGUgbWVtb3J5IGZvciBpdCAqLwotICAgIGltYWdlX3NpemUgPSBNQVgoZXhwb3J0X2VuZCxkYXRhX2VuZCkgLSB0ZXh0X2FkZHI7Ci0gICAgKnNpemUgPSBzaXplb2YoUEVfTU9EVUxFKSArIGltYWdlX3NpemUgKyA0MDk2OwotICAgIGlmIChzaGFyZWQpCi0JaE1vZCA9IFBNX21hbGxvY1NoYXJlZCgqc2l6ZSk7Ci0gICAgZWxzZQotCWhNb2QgPSBQTV9tYWxsb2MoKnNpemUpOwotICAgIHJlbG9jID0gUE1fbWFsbG9jKHJlbG9jX3NpemUpOwotICAgIGlmICghaE1vZCB8fCAhcmVsb2MpIHsKLQlyZXN1bHQgPSBQRV9vdXRPZk1lbW9yeTsKLQlnb3RvIEVycm9yOwotCX0KLQotICAgIGhNb2QtPnRleHQgPSAodWNoYXIqKVJPVU5EXzRLKCh1bG9uZyloTW9kICsgc2l6ZW9mKFBFX01PRFVMRSkpOwotICAgIGhNb2QtPmRhdGEgPSAodWNoYXIqKSgodWxvbmcpaE1vZC0+dGV4dCArIChkYXRhX2FkZHIgLSB0ZXh0X2FkZHIpKTsKLSAgICBoTW9kLT5leHBvcnQgPSAodWNoYXIqKSgodWxvbmcpaE1vZC0+dGV4dCArIChleHBvcnRfYWRkciAtIHRleHRfYWRkcikpOwotICAgIGhNb2QtPnRleHRCYXNlID0gdGV4dF9hZGRyOwotICAgIGhNb2QtPmRhdGFCYXNlID0gZGF0YV9hZGRyOwotICAgIGhNb2QtPmV4cG9ydEJhc2UgPSBleHBvcnRfYWRkcjsKLSAgICBoTW9kLT5leHBvcnREaXIgPSBvcHRoZHIuRGF0YURpcmVjdG9yeVswXS5SZWxWaXJ0dWFsQWRkcmVzcyAtIGV4cG9ydF9hZGRyOwotICAgIGhNb2QtPnNoYXJlZCA9IHNoYXJlZDsKLQotICAgIC8qIE5vdyByZWFkIHRoZSBzZWN0aW9uIGltYWdlcyBmcm9tIGRpc2sgKi8KLSAgICByZXN1bHQgPSBQRV9pbnZhbGlkRExMSW1hZ2U7Ci0gICAgZnNlZWsoZiwgc3RhcnRPZmZzZXQrdGV4dF9vZmYsIFNFRUtfU0VUKTsKLSAgICBpZiAoZnJlYWQoaE1vZC0+dGV4dCwgMSwgdGV4dF9zaXplLCBmKSAhPSB0ZXh0X3NpemUpCi0JZ290byBFcnJvcjsKLSAgICBmc2VlayhmLCBzdGFydE9mZnNldCtkYXRhX29mZiwgU0VFS19TRVQpOwotICAgIGlmIChmcmVhZChoTW9kLT5kYXRhLCAxLCBkYXRhX3NpemUsIGYpICE9IGRhdGFfc2l6ZSkKLQlnb3RvIEVycm9yOwotICAgIGZzZWVrKGYsIHN0YXJ0T2Zmc2V0K2V4cG9ydF9vZmYsIFNFRUtfU0VUKTsKLSAgICBpZiAoZnJlYWQoaE1vZC0+ZXhwb3J0LCAxLCBleHBvcnRfc2l6ZSwgZikgIT0gZXhwb3J0X3NpemUpCi0JZ290byBFcnJvcjsKLSAgICBmc2VlayhmLCBzdGFydE9mZnNldCtyZWxvY19vZmYsIFNFRUtfU0VUKTsKLSAgICBpZiAoZnJlYWQocmVsb2MsIDEsIHJlbG9jX3NpemUsIGYpICE9IHJlbG9jX3NpemUpCi0JZ290byBFcnJvcjsKLQotICAgIC8qIE5vdyBwZXJmb3JtIHJlbG9jYXRpb25zIG9uIGFsbCBzZWN0aW9ucyBpbiB0aGUgaW1hZ2UgKi8KLSAgICBkZWx0YSA9ICh1bG9uZyloTW9kLT50ZXh0IC0gb3B0aGRyLkltYWdlQmFzZSAtIHRleHRfYWRkcjsKLSAgICBiYXNlUmVsb2MgPSAoQkFTRV9SRUxPQ0FUSU9OKilyZWxvYzsKLSAgICBmb3IgKDs7KSB7Ci0JLyogQ2hlY2sgZm9yIHRlcm1pbmF0aW9uIGNvbmRpdGlvbiAqLwotCWlmICghYmFzZVJlbG9jLT5QYWdlUlZBIHx8ICFiYXNlUmVsb2MtPkJsb2NrU2l6ZSkKLQkgICAgYnJlYWs7Ci0KLQkvKiBEbyBmaXh1cHMgKi8KLQlwYWdlT2Zmc2V0ID0gYmFzZVJlbG9jLT5QYWdlUlZBIC0gaE1vZC0+dGV4dEJhc2U7Ci0JbnVtRml4dXBzID0gKGJhc2VSZWxvYy0+QmxvY2tTaXplIC0gc2l6ZW9mKEJBU0VfUkVMT0NBVElPTikpIC8gc2l6ZW9mKHVzaG9ydCk7Ci0JZml4dXAgPSAodXNob3J0KikoYmFzZVJlbG9jICsgMSk7Ci0JZm9yIChpID0gMDsgaSA8IG51bUZpeHVwczsgaSsrKSB7Ci0JICAgIHJlbG9jVHlwZSA9ICpmaXh1cCA+PiAxMjsKLQkgICAgaWYgKHJlbG9jVHlwZSkgewotCQlvZmZzZXQgPSBwYWdlT2Zmc2V0ICsgKCpmaXh1cCAmIDB4MEZGRik7Ci0JCSoodWxvbmcqKShoTW9kLT50ZXh0ICsgb2Zmc2V0KSArPSBkZWx0YTsKLQkJfQotCSAgICBmaXh1cCsrOwotCSAgICB9Ci0KLQkvKiBNb3ZlIHRvIG5leHQgcmVsb2NhdGlvbiBibG9jayAqLwotCWJhc2VSZWxvYyA9IChCQVNFX1JFTE9DQVRJT04qKSgodWxvbmcpYmFzZVJlbG9jICsgYmFzZVJlbG9jLT5CbG9ja1NpemUpOwotCX0KLQotICAgIC8qIEluaXRpYWxpc2UgdGhlIEMgcnVudGltZSBsaWJyYXJ5IGZvciB0aGUgbG9hZGVkIERMTCAqLwotICAgIHJlc3VsdCA9IFBFX3VuYWJsZVRvSW5pdExpYkM7Ci0gICAgaWYgKChJbml0TGliQyA9IChJbml0TGliQ190KVBFX2dldFByb2NBZGRyZXNzKGhNb2QsIl9Jbml0TGliQyIpKSA9PSBOVUxMKQotCWdvdG8gRXJyb3I7Ci0gICAgaWYgKCFJbml0TGliQygmX19faW1wb3J0cyxQTV9nZXRPU1R5cGUoKSkpCi0JZ290byBFcnJvcjsKLQotICAgIC8qIENsZWFuIHVwLCBjbG9zZSB0aGUgZmlsZSBhbmQgcmV0dXJuIHRoZSBsb2FkZWQgbW9kdWxlIGhhbmRsZSAqLwotICAgIFBNX2ZyZWUocmVsb2MpOwotICAgIHJlc3VsdCA9IFBFX29rOwotICAgIHJldHVybiBoTW9kOwotCi1FcnJvcjoKLSAgICBpZiAoc2hhcmVkKQotCVBNX2ZyZWVTaGFyZWQoaE1vZCk7Ci0gICAgZWxzZQotCVBNX2ZyZWUoaE1vZCk7Ci0gICAgUE1fZnJlZShyZWxvYyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUxvYWRzIGEgUG9ydGFibGUgQmluYXJ5IERMTCBpbnRvIG1lbW9yeQotCi1IRUFERVI6Ci1wZWxvYWRlci5oCi0KLVBBUkFNRVRFUlM6Ci1zekRMTE5hbWUgICAtIE5hbWUgb2YgdGhlIFBFIERMTCBsaWJyYXJ5IHRvIGxvYWQKLXNoYXJlZCAgICAgIC0gVHJ1ZSB0byBsb2FkIG1vZHVsZSBpbnRvIHNoYXJlZCBtZW1vcnkKLQotUkVUVVJOUzoKLUhhbmRsZSB0byBsb2FkZWQgUEUgRExMLCBvciBOVUxMIG9uIGZhaWx1cmUuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGxvYWRzIGEgUG9ydGFibGUgQmluYXJ5IERMTCBsaWJyYXJ5IGZyb20gZGlzaywgcmVsb2NhdGVzCi10aGUgY29kZSBhbmQgcmV0dXJucyBhIGhhbmRsZSB0byB0aGUgbG9hZGVkIGxpYnJhcnkuIFRoaXMgZnVuY3Rpb24KLXdpbGwgb25seSB3b3JrIG9uIERMTCdzIHRoYXQgZG8gbm90IGhhdmUgYW55IGltcG9ydHMsIHNpbmNlIHdlIGRvbid0Ci1yZXNvbHZlIGltcG9ydCBkZXBlbmRlbmNpZXMgaW4gdGhpcyBmdW5jdGlvbi4KLQotU0VFIEFMU086Ci1QRV9nZXRQcm9jQWRkcmVzcywgUEVfZnJlZUxpYnJhcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1QRV9NT0RVTEUgKiBQRUFQSSBQRV9sb2FkTGlicmFyeSgKLSAgICBjb25zdCBjaGFyICpzekRMTE5hbWUsCi0gICAgaWJvb2wgc2hhcmVkKQotewotICAgIFBFX01PRFVMRSAgICpoTW9kOwotCi0jaWYgKGRlZmluZWQoX19XSU5ET1dTMzJfXykgfHwgZGVmaW5lZChfX0RSSVZFUl9fKSkgJiYgZGVmaW5lZChDSEVDS0VEKQotICAgIGlmICghc2hhcmVkKSB7Ci0JUE1fTU9EVUxFICAgICAgIGhJbnN0OwotCUluaXRMaWJDX3QgICAgICBJbml0TGliQzsKLQotCS8qIEZvciBXaW4zMiBpZiBhcmUgYnVpbGRpbmcgY2hlY2tlZCBsaWJyYXJpZXMgZm9yIGRlYnVnZ2luZywgd2UgdXNlCi0JICogdGhlIHJlYWwgV2luMzIgRExMIGZ1bmN0aW9ucyBzbyB0aGF0IHdlIGNhbiBkZWJ1ZyB0aGUgcmVzdWx0aW5nIERMTAotCSAqIGZpbGVzIHdpdGggdGhlIFdpbjMyIGRlYnVnZ2Vycy4gTm90ZSB0aGF0IHdlIGNhbid0IGRvIHRoaXMgaWYKLQkgKiB3ZSBuZWVkIHRvIGxvYWQgdGhlIGZpbGVzIGludG8gYSBzaGFyZWQgbWVtb3J5IGNvbnRleHQuCi0JICovCi0JaWYgKChoSW5zdCA9IFBNX2xvYWRMaWJyYXJ5KHN6RExMTmFtZSkpID09IE5VTEwpIHsKLQkgICAgcmVzdWx0ID0gUEVfZmlsZU5vdEZvdW5kOwotCSAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCi0JLyogSW5pdGlhbGlzZSB0aGUgQyBydW50aW1lIGxpYnJhcnkgZm9yIHRoZSBsb2FkZWQgRExMICovCi0JcmVzdWx0ID0gUEVfdW5hYmxlVG9Jbml0TGliQzsKLQlpZiAoKEluaXRMaWJDID0gKHZvaWQqKVBNX2dldFByb2NBZGRyZXNzKGhJbnN0LCJfSW5pdExpYkMiKSkgPT0gTlVMTCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JaWYgKCFJbml0TGliQygmX19faW1wb3J0cyxQTV9nZXRPU1R5cGUoKSkpCi0JICAgIHJldHVybiBOVUxMOwotCi0JLyogQWxsb2NhdGUgdGhlIFBFX01PRFVMRSBzdHJ1Y3R1cmUgKi8KLQlpZiAoKGhNb2QgPSBQTV9tYWxsb2Moc2l6ZW9mKCpoTW9kKSkpID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotCWhNb2QtPnRleHQgPSAodm9pZCopaEluc3Q7Ci0JaE1vZC0+c2hhcmVkID0gLTE7Ci0KLQkvKiBETEwgbG9hZGVkIHN1Y2Nlc3NmdWxseSBzbyByZXR1cm4gbW9kdWxlIGhhbmRsZSAqLwotCXJlc3VsdCA9IFBFX29rOwotCXJldHVybiBoTW9kOwotCX0KLSAgICBlbHNlCi0jZW5kaWYKLQl7Ci0JRklMRSAgICAgICAgKmY7Ci0JdWxvbmcgICAgICAgc2l6ZTsKLQotCS8qIEF0dGVtcHQgdG8gb3BlbiB0aGUgZmlsZSBvbiBkaXNrICovCi0JaWYgKHNoYXJlZCA8IDApCi0JICAgIHNoYXJlZCA9IDA7Ci0JaWYgKChmID0gZm9wZW4oc3pETExOYW1lLCJyYiIpKSA9PSBOVUxMKSB7Ci0JICAgIHJlc3VsdCA9IFBFX2ZpbGVOb3RGb3VuZDsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQloTW9kID0gUEVfbG9hZExpYnJhcnlFeHQoZiwwLCZzaXplLHNoYXJlZCk7Ci0JZmNsb3NlKGYpOwotCXJldHVybiBoTW9kOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotTG9hZHMgYSBQb3J0YWJsZSBCaW5hcnkgRExMIGludG8gbWVtb3J5Ci0KLUhFQURFUjoKLXBlbG9hZGVyLmgKLQotUEFSQU1FVEVSUzoKLXN6RExMTmFtZSAgIC0gTmFtZSBvZiB0aGUgUEUgRExMIGxpYnJhcnkgdG8gbG9hZAotc2hhcmVkICAgICAgLSBUcnVlIHRvIGxvYWQgbW9kdWxlIGludG8gc2hhcmVkIG1lbW9yeQotCi1SRVRVUk5TOgotSGFuZGxlIHRvIGxvYWRlZCBQRSBETEwsIG9yIE5VTEwgb24gZmFpbHVyZS4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdGhlIHNhbWUgYXMgdGhlIHJlZ3VsYXIgUEVfbG9hZExpYnJhcnkgZnVuY3Rpb24sIGV4Y2VwdAotdGhhdCBpdCBsb29rcyBmb3IgdGhlIGRyaXZlcnMgaW4gdGhlIE1HTF9ST09UL2RyaXZlcnMgZGlyZWN0b3J5IG9yIGEKLS9kcml2ZXJzIGRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkuCi0KLVNFRSBBTFNPOgotUEVfbG9hZExpYnJhcnlNR0wsIFBFX2dldFByb2NBZGRyZXNzLCBQRV9mcmVlTGlicmFyeQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVBFX01PRFVMRSAqIFBFQVBJIFBFX2xvYWRMaWJyYXJ5TUdMKAotICAgIGNvbnN0IGNoYXIgKnN6RExMTmFtZSwKLSAgICBpYm9vbCBzaGFyZWQpCi17Ci0jaWYgIWRlZmluZWQoX19XSU4zMl9WWERfXykgJiYgIWRlZmluZWQoX19OVF9EUklWRVJfXykKLSAgICBQRV9NT0RVTEUgICAqaE1vZDsKLSNlbmRpZgotICAgIGNoYXIgICAgICAgIHBhdGhbMjU2XSA9ICIiOwotCi0gICAgLyogV2UgbG9vayBpbiB0aGUgJ2RyaXZlcnMnIGRpcmVjdG9yeSwgb3B0aW9uYWxseSB1bmRlciB0aGUgTUdMX1JPT1QKLSAgICAgKiBlbnZpcm9ubWVudCB2YXJpYWJsZSBkaXJlY3RvcnkuCi0gICAgICovCi0jaWYgIWRlZmluZWQoX19XSU4zMl9WWERfXykgJiYgIWRlZmluZWQoX19OVF9EUklWRVJfXykKLSAgICBpZiAoZ2V0ZW52KCJNR0xfUk9PVCIpKSB7Ci0Jc3RyY3B5KHBhdGgsZ2V0ZW52KCJNR0xfUk9PVCIpKTsKLQlQTV9iYWNrc2xhc2gocGF0aCk7Ci0JfQotICAgIHN0cmNhdChwYXRoLCJkcml2ZXJzIik7Ci0gICAgUE1fYmFja3NsYXNoKHBhdGgpOwotICAgIHN0cmNhdChwYXRoLHN6RExMTmFtZSk7Ci0gICAgaWYgKChoTW9kID0gUEVfbG9hZExpYnJhcnkocGF0aCxzaGFyZWQpKSAhPSBOVUxMKQotCXJldHVybiBoTW9kOwotI2VuZGlmCi0gICAgc3RyY3B5KHBhdGgsImRyaXZlcnMiKTsKLSAgICBQTV9iYWNrc2xhc2gocGF0aCk7Ci0gICAgc3RyY2F0KHBhdGgsc3pETExOYW1lKTsKLSAgICByZXR1cm4gUEVfbG9hZExpYnJhcnkocGF0aCxzaGFyZWQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1HZXRzIGEgZnVuY3Rpb24gYWRkcmVzcyBmcm9tIGEgUG9ydGFibGUgQmluYXJ5IERMTAotCi1IRUFERVI6Ci1wZWxvYWRlci5oCi0KLVBBUkFNRVRFUlM6Ci1oTW9kdWxlICAgICAtIEhhbmRsZSB0byBhIGxvYWRlZCBQRSBETEwgbGlicmFyeQotc3pQcm9jTmFtZSAgLSBOYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGFkZHJlc3Mgb2YKLQotUkVUVVJOUzoKLVBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uLCBvciBOVUxMIG9uIGZhaWx1cmUuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIGZvciB0aGUgbmFtZWQsIGV4cG9ydGVkIGZ1bmN0aW9uIGluIGEgbG9hZGVkIFBFCi1ETEwgbGlicmFyeSwgYW5kIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uLiBJZiB0aGUgZnVuY3Rpb24gaXMKLW5vdCBmb3VuZCBpbiB0aGUgbGlicmFyeSwgdGhpcyBmdW5jdGlvbiByZXR1cm4gTlVMTC4KLQotU0VFIEFMU086Ci1QRV9sb2FkTGlicmFyeSwgUEVfZnJlZUxpYnJhcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUEVBUEkgUEVfZ2V0UHJvY0FkZHJlc3MoCi0gICAgUEVfTU9EVUxFICpoTW9kdWxlLAotICAgIGNvbnN0IGNoYXIgKnN6UHJvY05hbWUpCi17Ci0jaWYgKGRlZmluZWQoX19XSU5ET1dTMzJfXykgfHwgZGVmaW5lZChfX0RSSVZFUl9fKSkgJiYgZGVmaW5lZChDSEVDS0VEKQotICAgIGlmIChoTW9kdWxlLT5zaGFyZWQgPT0gLTEpCi0JcmV0dXJuICh2b2lkKilQTV9nZXRQcm9jQWRkcmVzcyhoTW9kdWxlLT50ZXh0LHN6UHJvY05hbWUpOwotICAgIGVsc2UKLSNlbmRpZgotCXsKLQl1aW50ICAgICAgICAgICAgICAgIGk7Ci0JRVhQT1JUX0RJUkVDVE9SWSAgICAqZXhwb3J0czsKLQl1bG9uZyAgICAgICAgICAgICAgIGZ1bmNPZmZzZXQ7Ci0JdWxvbmcgICAgICAgICAgICAgICAqQWRkcmVzc1RhYmxlOwotCXVsb25nICAgICAgICAgICAgICAgKk5hbWVUYWJsZTsKLQl1c2hvcnQgICAgICAgICAgICAgICpPcmRpbmFsVGFibGU7Ci0JY2hhciAgICAgICAgICAgICAgICAqbmFtZTsKLQotCS8qIEZpbmQgdGhlIGFkZHJlc3Mgb2YgdGhlIGV4cG9ydCB0YWJsZXMgZnJvbSB0aGUgZXhwb3J0IHNlY3Rpb24gKi8KLQlpZiAoIWhNb2R1bGUpCi0JICAgIHJldHVybiBOVUxMOwotCWV4cG9ydHMgPSAoRVhQT1JUX0RJUkVDVE9SWSopKGhNb2R1bGUtPmV4cG9ydCArIGhNb2R1bGUtPmV4cG9ydERpcik7Ci0JQWRkcmVzc1RhYmxlID0gKHVsb25nKikoaE1vZHVsZS0+ZXhwb3J0ICsgZXhwb3J0cy0+QWRkcmVzc1RhYmxlUlZBIC0gaE1vZHVsZS0+ZXhwb3J0QmFzZSk7Ci0JTmFtZVRhYmxlID0gKHVsb25nKikoaE1vZHVsZS0+ZXhwb3J0ICsgZXhwb3J0cy0+TmFtZVRhYmxlUlZBIC0gaE1vZHVsZS0+ZXhwb3J0QmFzZSk7Ci0JT3JkaW5hbFRhYmxlID0gKHVzaG9ydCopKGhNb2R1bGUtPmV4cG9ydCArIGV4cG9ydHMtPk9yZGluYWxUYWJsZVJWQSAtIGhNb2R1bGUtPmV4cG9ydEJhc2UpOwotCi0JLyogU2VhcmNoIHRoZSBleHBvcnQgbmFtZSB0YWJsZSB0byBmaW5kIHRoZSBmdW5jdGlvbiBuYW1lICovCi0JZm9yIChpID0gMDsgaSA8IGV4cG9ydHMtPk51bWJlck9mTmFtZVBvaW50ZXJzOyBpKyspIHsKLQkgICAgbmFtZSA9IChjaGFyKikoaE1vZHVsZS0+ZXhwb3J0ICsgTmFtZVRhYmxlW2ldIC0gaE1vZHVsZS0+ZXhwb3J0QmFzZSk7Ci0JICAgIGlmIChzdHJjbXAobmFtZSxzelByb2NOYW1lKSA9PSAwKQotCQlicmVhazsKLQkgICAgfQotCWlmIChpID09IGV4cG9ydHMtPk51bWJlck9mTmFtZVBvaW50ZXJzKQotCSAgICByZXR1cm4gTlVMTDsKLQlmdW5jT2Zmc2V0ID0gQWRkcmVzc1RhYmxlW09yZGluYWxUYWJsZVtpXV07Ci0JaWYgKCFmdW5jT2Zmc2V0KQotCSAgICByZXR1cm4gTlVMTDsKLQlyZXR1cm4gKHZvaWQqKShoTW9kdWxlLT50ZXh0ICsgZnVuY09mZnNldCAtIGhNb2R1bGUtPnRleHRCYXNlKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUZyZWVzIGEgbG9hZGVkIFBvcnRhYmxlIEJpbmFyeSBETEwKLQotSEVBREVSOgotcGVsb2FkZXIuaAotCi1QQVJBTUVURVJTOgotaE1vZHVsZSAgICAgLSBIYW5kbGUgdG8gYSBsb2FkZWQgUEUgRExMIGxpYnJhcnkgdG8gZnJlZQotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBmcmVlcyBhIGxvYWRlZCBQRSBETEwgbGlicmFyeSBmcm9tIG1lbW9yeS4KLQotU0VFIEFMU086Ci1QRV9nZXRQcm9jQWRkcmVzcywgUEVfbG9hZExpYnJhcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBFQVBJIFBFX2ZyZWVMaWJyYXJ5KAotICAgIFBFX01PRFVMRSAqaE1vZHVsZSkKLXsKLSAgICBUZXJtaW5hdGVMaWJDX3QgVGVybWluYXRlTGliQzsKLQotI2lmIChkZWZpbmVkKF9fV0lORE9XUzMyX18pIHx8IGRlZmluZWQoX19EUklWRVJfXykpICYmIGRlZmluZWQoQ0hFQ0tFRCkKLSAgICBpZiAoaE1vZHVsZS0+c2hhcmVkID09IC0xKSB7Ci0JLyogUnVuIHRoZSBDIHJ1bnRpbWUgbGlicmFyeSBleGl0IGNvZGUgb24gbW9kdWxlIHVubG9hZCAqLwotCWlmICgoVGVybWluYXRlTGliQyA9IChUZXJtaW5hdGVMaWJDX3QpUE1fZ2V0UHJvY0FkZHJlc3MoaE1vZHVsZS0+dGV4dCwiX1Rlcm1pbmF0ZUxpYkMiKSkgIT0gTlVMTCkKLQkgICAgVGVybWluYXRlTGliQygpOwotCVBNX2ZyZWVMaWJyYXJ5KGhNb2R1bGUtPnRleHQpOwotCVBNX2ZyZWUoaE1vZHVsZSk7Ci0JfQotICAgIGVsc2UKLSNlbmRpZgotCXsKLQlpZiAoaE1vZHVsZSkgewotCSAgICAvKiBSdW4gdGhlIEMgcnVudGltZSBsaWJyYXJ5IGV4aXQgY29kZSBvbiBtb2R1bGUgdW5sb2FkICovCi0JICAgIGlmICgoVGVybWluYXRlTGliQyA9IChUZXJtaW5hdGVMaWJDX3QpUEVfZ2V0UHJvY0FkZHJlc3MoaE1vZHVsZSwiX1Rlcm1pbmF0ZUxpYkMiKSkgIT0gTlVMTCkKLQkJVGVybWluYXRlTGliQygpOwotCSAgICBpZiAoaE1vZHVsZS0+c2hhcmVkKQotCQlQTV9mcmVlU2hhcmVkKGhNb2R1bGUpOwotCSAgICBlbHNlCi0JCVBNX2ZyZWUoaE1vZHVsZSk7Ci0JICAgIH0KLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVJldHVybnMgdGhlIGVycm9yIGNvZGUgZm9yIHRoZSBsYXN0IG9wZXJhdGlvbgotCi1IRUFERVI6Ci1wZWxvYWRlci5oCi0KLVJFVFVSTlM6Ci1FcnJvciBjb2RlIGZvciB0aGUgbGFzdCBvcGVyYXRpb24uCi0KLVNFRSBBTFNPOgotUEVfZ2V0UHJvY0FkZHJlc3MsIFBFX2xvYWRMaWJyYXJ5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBFQVBJIFBFX2dldEVycm9yKHZvaWQpCi17Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi92ZXNhdmJlLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9jb21tb24vdmVzYXZiZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjY5ZTVjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL2NvbW1vbi92ZXNhdmJlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICBUaGUgU3VwZXJWR0EgS2l0IC0gVW5pVkJFIFNvZnR3YXJlIERldmVsb3BtZW50IEtpdAotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBJQk0gUEMgUmVhbCBNb2RlIGFuZCAxNi8zMiBiaXQgUHJvdGVjdGVkIE1vZGUuCi0qCi0qIERlc2NyaXB0aW9uOiAgTW9kdWxlIHRvIGltcGxlbWVudCBhIEMgY2FsbGFibGUgaW50ZXJmYWNlIHRvIHRoZSBzdGFuZGFyZAotKiAgICAgICAgICAgICAgIFZFU0EgVkJFIHJvdXRpbmVzLiBZb3Ugc2hvdWxkIHJpcCBvdXQgdGhpcyBtb2R1bGUgYW5kIHVzZSBpdAotKiAgICAgICAgICAgICAgIGRpcmVjdGx5IGluIHlvdXIgb3duIGFwcGxpY2F0aW9ucywgb3IgeW91IGNhbiB1c2UgdGhlCi0qICAgICAgICAgICAgICAgaGlnaCBsZXZlbCBTREsgZnVuY3Rpb25zLgotKgotKiAgICAgICAgICAgICAgIE1VU1QgYmUgY29tcGlsZWQgaW4gdGhlIExBUkdFIG9yIEZMQVQgbW9kZWxzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAidmVzYXZiZS5oIgotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAiZHJ2bGliL29zL29zLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgVkJFX1NVQ0NFU1MgICAgIDB4MDA0RgotI2RlZmluZSBNQVhfTElOX1BUUlMgICAgMTAKLQotc3RhdGljIHVpbnQgICAgICAgICBWRVNBQnVmX2xlbiA9IDEwMjQ7LyogTGVuZ3RoIG9mIHRoZSBWRVNBQnVmIGJ1ZmZlciAgKi8KLXN0YXRpYyBpYm9vbCAgICAgICAgaGF2ZVJpdmExMjg7ICAgIC8qIFRydWUgaWYgd2UgaGF2ZSBhIFJpdmExMjggICAgICAgICovCi1zdGF0aWMgVkJFX3N0YXRlICAgIGRlZlN0YXRlID0gezB9OyAvKiBEZWZhdWx0IHN0YXRlIGJ1ZmZlciAgICAgICAgICAgICAqLwotc3RhdGljIFZCRV9zdGF0ZSAgICAqc3RhdGUgPSAmZGVmU3RhdGU7IC8qIFBvaW50ZXIgdG8gY3VycmVudCBidWZmZXIgICAgKi8KLXN0YXRpYyBpbnQgICAgICAgICAgVkJFX3NoYXJlZCA9IDA7Ci0jaWZuZGVmIFJFQUxNT0RFCi1zdGF0aWMgY2hhciAgICAgICAgIGxvY2FsQnVmWzUxMl07ICAvKiBHbG9iYWwgUE0gc3RyaW5nIHRyYW5zbGF0ZSBidWYgICAqLwotI2RlZmluZSBNQVhfTE9DQUxfQlVGICZsb2NhbEJ1Zls1MTFdCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogc3RhdGljIGZ1bmN0aW9uIGluIFdpbkRpcmVjdCBmb3IgcGFzc2luZyAzMi1iaXQgcmVnaXN0ZXJzIHRvIEJJT1MgKi8KLWludCBQTUFQSSBXRF9pbnQzODYoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCk7Ci0KLXZvaWQgVkJFQVBJIFZCRV9pbml0KHZvaWQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9pbml0Ci0qCi0qIERlc2NyaXB0aW9uOiAgSW5pdGlhbGlzZXMgdGhlIFZCRSB0cmFuc2ZlciBidWZmZXIgaW4gcmVhbCBtb2RlIERDLm1lbW9yeS4KLSogICAgICAgICAgICAgICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBWRVNBVkJFIG1vZHVsZSBldmVyeSB0aW1lCi0qICAgICAgICAgICAgICAgaXQgbmVlZHMgdG8gdXNlIHRoZSB0cmFuc2ZlciBidWZmZXIsIHNvIHdlIHNpbXBseSBhbGxvY2F0ZQotKiAgICAgICAgICAgICAgIGl0IG9uY2UgYW5kIHRoZW4gcmV0dXJuLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBpZiAoIXN0YXRlLT5WRVNBQnVmX3B0cikgewotCS8qIEFsbG9jYXRlIGEgZ2xvYmFsIGJ1ZmZlciBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBWRVNBIFZCRSAqLwotCWlmICgoc3RhdGUtPlZFU0FCdWZfcHRyID0gUE1fZ2V0VkVTQUJ1ZigmVkVTQUJ1Zl9sZW4sICZzdGF0ZS0+VkVTQUJ1Zl9yc2VnLCAmc3RhdGUtPlZFU0FCdWZfcm9mZikpID09IE5VTEwpCi0JICAgIFBNX2ZhdGFsRXJyb3IoIlZFU0FWQkUuQzogUmVhbCBtb2RlIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCEiKTsKLQl9Ci19Ci0KLXZvaWQgKiBWQkVBUEkgVkJFX2dldFJNQnVmKHVpbnQgKmxlbix1aW50ICpyc2VnLHVpbnQgKnJvZmYpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9nZXRSTUJ1ZgotKgotKiBEZXNjcmlwdGlvbjogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbG9jYXRpb24gYW5kIGxlbmd0aCBvZiB0aGUgcmVhbAotKiAgICAgICAgICAgICAgIG1vZGUgbWVtb3J5IGJ1ZmZlciBmb3IgY2FsbGluZyByZWFsIG1vZGUgZnVuY3Rpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICAqbGVuID0gVkVTQUJ1Zl9sZW47Ci0gICAgKnJzZWcgPSBzdGF0ZS0+VkVTQUJ1Zl9yc2VnOwotICAgICpyb2ZmID0gc3RhdGUtPlZFU0FCdWZfcm9mZjsKLSAgICByZXR1cm4gc3RhdGUtPlZFU0FCdWZfcHRyOwotfQotCi12b2lkIFZCRUFQSSBWQkVfc2V0U3RhdGVCdWZmZXIoVkJFX3N0YXRlICpzKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfc2V0U3RhdGVCdWZmZXIKLSoKLSogRGVzY3JpcHRpb246ICBUaGlzIGZ1bmN0aW9ucyBzZXRzIHRoZSBpbnRlcm5hbCBzdGF0ZSBidWZmZXIgZm9yIHRoZQotKiAgICAgICAgICAgICAgIFZCRSBtb2R1bGUgdG8gdGhlIHBhc3NlZCBpbiBidWZmZXIuIEJ5IGRlZmF1bHQgdGhlIGludGVybmFsCi0qICAgICAgICAgICAgICAgZ2xvYmFsIGJ1ZmZlciBpcyB1c2VkLCBidXQgeW91IG11c3QgdXNlIHNlcGFyYXRlIGJ1ZmZlcnMKLSogICAgICAgICAgICAgICBmb3IgZWFjaCBkZXZpY2UgaW4gYSBtdWx0aS1jb250cm9sbGVyIGVudmlyb25tZW50LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBzdGF0ZSA9IHM7Ci19Ci0KLXZvaWQgVkJFQVBJIFZCRV9jYWxsRVNESShSTVJFR1MgKnJlZ3MsIHZvaWQgKmJ1ZmZlciwgaW50IHNpemUpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9jYWxsRVNESQotKiBQYXJhbWV0ZXJzOiAgIHJlZ3MgICAgLSBSZWdpc3RlcnMgdG8gbG9hZCB3aGVuIGNhbGxpbmcgVkJFCi0qICAgICAgICAgICAgICAgYnVmZmVyICAtIEJ1ZmZlciB0byBjb3B5IFZCRSBpbmZvIGJsb2NrIHRvCi0qICAgICAgICAgICAgICAgc2l6ZSAgICAtIFNpemUgb2YgYnVmZmVyIHRvIGZpbGwKLSoKLSogRGVzY3JpcHRpb246ICBDYWxscyB0aGUgVkVTQSBWQkUgYW5kIHBhc3NlcyBpbiBhIGJ1ZmZlciBmb3IgdGhlIFZCRSB0bwotKiAgICAgICAgICAgICAgIHN0b3JlIGluZm9ybWF0aW9uIGluLCB3aGljaCBpcyB0aGVuIGNvcGllZCBpbnRvIHRoZSB1c2VycwotKiAgICAgICAgICAgICAgIGJ1ZmZlciBzcGFjZS4gVGhpcyB3b3JrcyBpbiBwcm90ZWN0ZWQgbW9kZSBhcyB0aGUgYnVmZmVyCi0qICAgICAgICAgICAgICAgcGFzc2VkIHRvIHRoZSBWRVNBIFZCRSBpcyBhbGxvY2F0ZWQgaW4gY29udmVudGlvbmFsCi0qICAgICAgICAgICAgICAgbWVtb3J5LCBhbmQgaXMgdGhlbiBjb3BpZWQgaW50byB0aGUgdXNlcnMgbWVtb3J5IGJsb2NrLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBSTVNSRUdTIHNyZWdzOwotCi0gICAgaWYgKCFzdGF0ZS0+VkVTQUJ1Zl9wdHIpCi0JUE1fZmF0YWxFcnJvcigiWW91ICpNVVNUKiBjYWxsIFZCRV9pbml0KCkgYmVmb3JlIHlvdSBjYW4gY2FsbCB0aGUgVkVTQVZCRS5DIG1vZHVsZSEiKTsKLSAgICBzcmVncy5lcyA9ICh1c2hvcnQpc3RhdGUtPlZFU0FCdWZfcnNlZzsKLSAgICByZWdzLT54LmRpID0gKHVzaG9ydClzdGF0ZS0+VkVTQUJ1Zl9yb2ZmOwotICAgIG1lbWNweShzdGF0ZS0+VkVTQUJ1Zl9wdHIsIGJ1ZmZlciwgc2l6ZSk7Ci0gICAgUE1faW50ODZ4KDB4MTAsIHJlZ3MsIHJlZ3MsICZzcmVncyk7Ci0gICAgbWVtY3B5KGJ1ZmZlciwgc3RhdGUtPlZFU0FCdWZfcHRyLCBzaXplKTsKLX0KLQotI2lmbmRlZiBSRUFMTU9ERQotc3RhdGljIGNoYXIgKlZCRV9jb3B5U3RyVG9Mb2NhbChjaGFyICpwLGNoYXIgKnJlYWxQdHIsY2hhciAqbWF4KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfY29weVN0clRvTG9jYWwKLSogUGFyYW1ldGVyczogICBwICAgICAgIC0gRmxhdCBtb2RlbCBidWZmZXIgdG8gY29weSB0bwotKiAgICAgICAgICAgICAgIHJlYWxQdHIgLSBSZWFsIG1vZGUgcG9pbnRlciB0byBjb3B5Ci0qIFJldHVybnM6ICAgICAgUG9pbnRlciB0byB0aGUgbmV4dCBieXRlIGFmdGVyIHN0cmluZwotKgotKiBEZXNjcmlwdGlvbjogIENvcGllcyB0aGUgc3RyaW5nIGZyb20gdGhlIHJlYWwgbW9kZSBsb2NhdGlvbiBwb2ludGVkIHRvCi0qICAgICAgICAgICAgICAgYnkgJ3JlYWxQdHInIGludG8gdGhlIGZsYXQgbW9kZWwgYnVmZmVyIHBvaW50ZWQgdG8gYnkKLSogICAgICAgICAgICAgICAncCcuIFdlIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG5leHQgYnl0ZSBwYXN0IHRoZSBjb3BpZWQKLSogICAgICAgICAgICAgICBzdHJpbmcuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIHVjaGFyICAgKnY7Ci0KLSAgICB2ID0gUE1fbWFwUmVhbFBvaW50ZXIoKHVpbnQpKCh1bG9uZylyZWFsUHRyID4+IDE2KSwgKHVpbnQpKCh1bG9uZylyZWFsUHRyICYgMHhGRkZGKSk7Ci0gICAgd2hpbGUgKCp2ICE9IDAgJiYgcCA8IG1heCkKLQkqcCsrID0gKnYrKzsKLSAgICAqcCsrID0gMDsKLSAgICByZXR1cm4gcDsKLX0KLQotc3RhdGljIHZvaWQgVkJFX2NvcHlTaG9ydFRvTG9jYWwodXNob3J0ICpwLHVzaG9ydCAqcmVhbFB0cikKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgVkJFX2NvcHlTaG9ydFRvTG9jYWwKLSogUGFyYW1ldGVyczogICBwICAgICAgIC0gRmxhdCBtb2RlbCBidWZmZXIgdG8gY29weSB0bwotKiAgICAgICAgICAgICAgIHJlYWxQdHIgLSBSZWFsIG1vZGUgcG9pbnRlciB0byBjb3B5Ci0qCi0qIERlc2NyaXB0aW9uOiAgQ29waWVzIHRoZSBtb2RlIHRhYmxlIGZyb20gcmVhbCBtb2RlIG1lbW9yeSB0byB0aGUgZmxhdAotKiAgICAgICAgICAgICAgIG1vZGVsIGJ1ZmZlci4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgdXNob3J0ICAqdjsKLQotICAgIHYgPSBQTV9tYXBSZWFsUG9pbnRlcigodWludCkoKHVsb25nKXJlYWxQdHIgPj4gMTYpLCh1aW50KSgodWxvbmcpcmVhbFB0ciAmIDB4RkZGRikpOwotICAgIHdoaWxlICgqdiAhPSAweEZGRkYpCi0JKnArKyA9ICp2Kys7Ci0gICAgKnAgPSAweEZGRkY7Ci19Ci0jZW5kaWYKLQotaW50IFZCRUFQSSBWQkVfZGV0ZWN0RVhUKFZCRV92Z2FJbmZvICp2Z2FJbmZvLGlib29sIGZvcmNlVW5pVkJFKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfZGV0ZWN0Ci0qIFBhcmFtZXRlcnM6ICAgdmdhSW5mbyAtIFBsYWNlIHRvIHN0b3JlIHRoZSBWR0EgaW5mb3JtYXRpb24gYmxvY2sKLSogUmV0dXJuczogICAgICBWQkUgdmVyc2lvbiBudW1iZXIsIG9yIDAgaWYgbm90IGRldGVjdGVkLgotKgotKiBEZXNjcmlwdGlvbjogIERldGVjdHMgaWYgYSBWRVNBIFZCRSBpcyBvdXQgdGhlcmUgYW5kIGZ1bmN0aW9uaW5nCi0qICAgICAgICAgICAgICAgY29ycmVjdGx5LiBJZiB3ZSBkZXRlY3QgYSBWQkUgaW50ZXJmYWNlIHdlIHJldHVybiB0aGUKLSogICAgICAgICAgICAgICBWR0FJbmZvQmxvY2sgcmV0dXJuZWQgYnkgdGhlIFZCRSBhbmQgdGhlIFZCRSB2ZXJzaW9uIG51bWJlci4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgcmVncy54LmF4ID0gMHg0RjAwOyAgICAgLyogR2V0IFN1cGVyVkdBIGluZm9ybWF0aW9uICovCi0gICAgaWYgKGZvcmNlVW5pVkJFKSB7Ci0JcmVncy54LmJ4ID0gMHgxMjM0OwotCXJlZ3MueC5jeCA9IDB4NDMyMTsKLQl9Ci0gICAgZWxzZSB7Ci0JcmVncy54LmJ4ID0gMDsKLQlyZWdzLnguY3ggPSAwOwotCX0KLSAgICBzdHJuY3B5KHZnYUluZm8tPlZFU0FTaWduYXR1cmUsIlZCRTIiLDQpOwotICAgIFZCRV9jYWxsRVNESSgmcmVncywgdmdhSW5mbywgc2l6ZW9mKCp2Z2FJbmZvKSk7Ci0gICAgaWYgKHJlZ3MueC5heCAhPSBWQkVfU1VDQ0VTUykKLQlyZXR1cm4gMDsKLSAgICBpZiAoc3RybmNtcCh2Z2FJbmZvLT5WRVNBU2lnbmF0dXJlLCJWRVNBIiw0KSAhPSAwKQotCXJldHVybiAwOwotCi0gICAgLyogQ2hlY2sgZm9yIGJvZ3VzIEJJT1NlcyB0aGF0IHJldHVybiBhIFZCRSB2ZXJzaW9uIG51bWJlciB0aGF0IGlzCi0gICAgICogbm90IGNvcnJlY3QsIGFuZCBmaXggaXQgdXAuIFdlIGFsc28gY2hlY2sgdGhlIE9lbVZlbmRvck5hbWVQdHIgZm9yIGEKLSAgICAgKiB2YWxpZCB2YWx1ZSwgYW5kIGlmIGl0IGlzIGludmFsaWQgdGhlbiB3ZSBhbHNvIHJlc2V0IHRvIFZCRSAxLjIuCi0gICAgICovCi0gICAgaWYgKHZnYUluZm8tPlZFU0FWZXJzaW9uID49IDB4MjAwICYmIHZnYUluZm8tPk9lbVZlbmRvck5hbWVQdHIgPT0gMCkKLQl2Z2FJbmZvLT5WRVNBVmVyc2lvbiA9IDB4MTAyOwotI2lmbmRlZiBSRUFMTU9ERQotICAgIC8qIFJlbG9jYXRlIGFsbCB0aGUgaW5kaXJlY3QgaW5mb3JtYXRpb24gKG1vZGUgdGFibGVzLCBPRU0gc3RyaW5ncwotICAgICAqIGV0YykgZnJvbSB0aGUgbG93IDFNYiBtZW1vcnkgcmVnaW9uIGludG8gYSBzdGF0aWMgYnVmZmVyIGluCi0gICAgICogb3VyIGRlZmF1bHQgZGF0YSBzZWdtZW50LiBXZSBkbyB0aGlzIHRvIGluc3VsYXRlIHRoZSBhcHBsaWNhdGlvbgotICAgICAqIGZyb20gbWFwcGluZyB0aGUgc3RyaW5ncyBmcm9tIHJlYWwgbW9kZSB0byBwcm90ZWN0ZWQgbW9kZS4KLSAgICAgKi8KLSAgICB7Ci0JY2hhciAqcCwqcDI7Ci0gICAgIHAyID0gVkJFX2NvcHlTdHJUb0xvY2FsKGxvY2FsQnVmLHZnYUluZm8tPk9lbVN0cmluZ1B0cixNQVhfTE9DQUxfQlVGKTsKLSAgICAgdmdhSW5mby0+T2VtU3RyaW5nUHRyID0gbG9jYWxCdWY7Ci0gICAgIGlmICh2Z2FJbmZvLT5WRVNBVmVyc2lvbiA+PSAweDIwMCkgewotCSBwID0gVkJFX2NvcHlTdHJUb0xvY2FsKHAyLHZnYUluZm8tPk9lbVZlbmRvck5hbWVQdHIsTUFYX0xPQ0FMX0JVRik7Ci0JIHZnYUluZm8tPk9lbVZlbmRvck5hbWVQdHIgPSBwMjsKLQkgcDIgPSBWQkVfY29weVN0clRvTG9jYWwocCx2Z2FJbmZvLT5PZW1Qcm9kdWN0TmFtZVB0cixNQVhfTE9DQUxfQlVGKTsKLQkgdmdhSW5mby0+T2VtUHJvZHVjdE5hbWVQdHIgPSBwOwotCSBwID0gVkJFX2NvcHlTdHJUb0xvY2FsKHAyLHZnYUluZm8tPk9lbVByb2R1Y3RSZXZQdHIsTUFYX0xPQ0FMX0JVRik7Ci0JIHZnYUluZm8tPk9lbVByb2R1Y3RSZXZQdHIgPSBwMjsKLQkgVkJFX2NvcHlTaG9ydFRvTG9jYWwoKHVzaG9ydCopcCx2Z2FJbmZvLT5WaWRlb01vZGVQdHIpOwotCSB2Z2FJbmZvLT5WaWRlb01vZGVQdHIgPSAodXNob3J0KilwOwotCSB9Ci0gICAgIGVsc2UgewotCSBWQkVfY29weVNob3J0VG9Mb2NhbCgodXNob3J0KilwMix2Z2FJbmZvLT5WaWRlb01vZGVQdHIpOwotCSB2Z2FJbmZvLT5WaWRlb01vZGVQdHIgPSAodXNob3J0KilwMjsKLQkgfQotICAgIH0KLSNlbmRpZgotICAgIHN0YXRlLT5WQkVNZW1vcnkgPSB2Z2FJbmZvLT5Ub3RhbE1lbW9yeSAqIDY0OwotCi0gICAgLyogQ2hlY2sgZm9yIFJpdmExMjggYmFzZWQgY2FyZHMgc2luY2UgdGhleSBoYXZlIGJyb2tlbiB0cmlwbGUgYnVmZmVyaW5nCi0gICAgICogYW5kIHN0ZXJlbyBzdXBwb3J0LgotICAgICAqLwotICAgIGhhdmVSaXZhMTI4ID0gZmFsc2U7Ci0gICAgaWYgKHZnYUluZm8tPlZFU0FWZXJzaW9uID49IDB4MzAwICYmCi0JICAgKHN0cnN0cih2Z2FJbmZvLT5PZW1TdHJpbmdQdHIsIk5WaWRpYSIpICE9IE5VTEwgfHwKLQkgICAgc3Ryc3RyKHZnYUluZm8tPk9lbVN0cmluZ1B0ciwiUml2YSIpICE9IE5VTEwpKSB7Ci0JaGF2ZVJpdmExMjggPSB0cnVlOwotCX0KLQotICAgIC8qIENoZWNrIGZvciBNYXRyb3ggRzQwMCBjYXJkcyB3aGljaCBjbGFpbSB0byBiZSBWQkUgMy4wCi0gICAgICogY29tcGxpYW50IHlldCB0aGV5IGRvbid0IGltcGxlbWVudCB0aGUgcmVmcmVzaCByYXRlIGNvbnRyb2wKLSAgICAgKiBmdW5jdGlvbnMuCi0gICAgICovCi0gICAgaWYgKHZnYUluZm8tPlZFU0FWZXJzaW9uID49IDB4MzAwICYmIChzdHJjbXAodmdhSW5mby0+T2VtUHJvZHVjdE5hbWVQdHIsIk1hdHJveCBHNDAwIikgPT0gMCkpCi0JdmdhSW5mby0+VkVTQVZlcnNpb24gPSAweDIwMDsKLSAgICByZXR1cm4gKHN0YXRlLT5WQkVWZXJzaW9uID0gdmdhSW5mby0+VkVTQVZlcnNpb24pOwotfQotCi1pbnQgVkJFQVBJIFZCRV9kZXRlY3QoVkJFX3ZnYUluZm8gKnZnYUluZm8pCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9kZXRlY3QKLSogUGFyYW1ldGVyczogICB2Z2FJbmZvIC0gUGxhY2UgdG8gc3RvcmUgdGhlIFZHQSBpbmZvcm1hdGlvbiBibG9jawotKiBSZXR1cm5zOiAgICAgIFZCRSB2ZXJzaW9uIG51bWJlciwgb3IgMCBpZiBub3QgZGV0ZWN0ZWQuCi0qCi0qIERlc2NyaXB0aW9uOiAgRGV0ZWN0cyBpZiBhIFZFU0EgVkJFIGlzIG91dCB0aGVyZSBhbmQgZnVuY3Rpb25pbmcKLSogICAgICAgICAgICAgICBjb3JyZWN0bHkuIElmIHdlIGRldGVjdCBhIFZCRSBpbnRlcmZhY2Ugd2UgcmV0dXJuIHRoZQotKiAgICAgICAgICAgICAgIFZHQUluZm9CbG9jayByZXR1cm5lZCBieSB0aGUgVkJFIGFuZCB0aGUgVkJFIHZlcnNpb24gbnVtYmVyLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICByZXR1cm4gVkJFX2RldGVjdEVYVCh2Z2FJbmZvLGZhbHNlKTsKLX0KLQotaWJvb2wgVkJFQVBJIFZCRV9nZXRNb2RlSW5mbyhpbnQgbW9kZSxWQkVfbW9kZUluZm8gKm1vZGVJbmZvKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfZ2V0TW9kZUluZm8KLSogUGFyYW1ldGVyczogICBtb2RlICAgICAgICAtIFZCRSBtb2RlIHRvIGdldCBpbmZvcm1hdGlvbiBmb3IKLSogICAgICAgICAgICAgICBtb2RlSW5mbyAgICAtIFBsYWNlIHRvIHN0b3JlIFZCRSBtb2RlIGluZm9ybWF0aW9uCi0qIFJldHVybnM6ICAgICAgVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBmdW5jdGlvbiBmYWlsZWQuCi0qCi0qIERlc2NyaXB0aW9uOiAgT2J0YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIHZpZGVvIG1vZGUgZnJvbSB0aGUKLSogICAgICAgICAgICAgICBWQkUuIFlvdSBzaG91bGQgdXNlIHRoaXMgZnVuY3Rpb24gdG8gZmluZCB0aGUgdmlkZW8gbW9kZQotKiAgICAgICAgICAgICAgIHlvdSB3aXNoIHRvIHNldCwgYXMgdGhlIG5ldyBWQkUgMi4wIG1vZGUgbnVtYmVycyBtYXkgYmUKLSogICAgICAgICAgICAgICBjb21wbGV0ZWx5IGFyYml0cmFyeS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgUk1SRUdTICByZWdzOwotICAgIGludCAgICAgYml0czsKLQotICAgIHJlZ3MueC5heCA9IDB4NEYwMTsgICAgICAgICAgICAgLyogR2V0IG1vZGUgaW5mb3JtYXRpb24gICAgICAgICAqLwotICAgIHJlZ3MueC5jeCA9ICh1c2hvcnQpbW9kZTsKLSAgICBWQkVfY2FsbEVTREkoJnJlZ3MsIG1vZGVJbmZvLCBzaXplb2YoKm1vZGVJbmZvKSk7Ci0gICAgaWYgKHJlZ3MueC5heCAhPSBWQkVfU1VDQ0VTUykKLQlyZXR1cm4gZmFsc2U7Ci0gICAgaWYgKChtb2RlSW5mby0+TW9kZUF0dHJpYnV0ZXMgJiB2YmVNZEF2YWlsYWJsZSkgPT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAvKiBNYXAgb3V0IHRyaXBsZSBidWZmZXIgYW5kIHN0ZXJlbyBmbGFncyBmb3IgTlZpZGlhIFJpdmExMjgKLSAgICAgKiBjaGlwcy4KLSAgICAgKi8KLSAgICBpZiAoaGF2ZVJpdmExMjgpIHsKLQltb2RlSW5mby0+TW9kZUF0dHJpYnV0ZXMgJj0gfnZiZU1kVHJpcGxlQnVmOwotCW1vZGVJbmZvLT5Nb2RlQXR0cmlidXRlcyAmPSB+dmJlTWRTdGVyZW87Ci0JfQotCi0gICAgLyogU3VwcG9ydCBvbGQgc3R5bGUgUkdCIGRlZmluaXRpb25zIGZvciBWQkUgMS4xIEJJT1NlcyAqLwotICAgIGJpdHMgPSBtb2RlSW5mby0+Qml0c1BlclBpeGVsOwotICAgIGlmIChtb2RlSW5mby0+TWVtb3J5TW9kZWwgPT0gdmJlTWVtUEsgJiYgYml0cyA+IDgpIHsKLQltb2RlSW5mby0+TWVtb3J5TW9kZWwgPSB2YmVNZW1SR0I7Ci0Jc3dpdGNoIChiaXRzKSB7Ci0JICAgIGNhc2UgMTU6Ci0JCW1vZGVJbmZvLT5SZWRNYXNrU2l6ZSA9IDU7Ci0JCW1vZGVJbmZvLT5SZWRGaWVsZFBvc2l0aW9uID0gMTA7Ci0JCW1vZGVJbmZvLT5HcmVlbk1hc2tTaXplID0gNTsKLQkJbW9kZUluZm8tPkdyZWVuRmllbGRQb3NpdGlvbiA9IDU7Ci0JCW1vZGVJbmZvLT5CbHVlTWFza1NpemUgPSA1OwotCQltb2RlSW5mby0+Qmx1ZUZpZWxkUG9zaXRpb24gPSAwOwotCQltb2RlSW5mby0+UnN2ZE1hc2tTaXplID0gMTsKLQkJbW9kZUluZm8tPlJzdmRGaWVsZFBvc2l0aW9uID0gMTU7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDE2OgotCQltb2RlSW5mby0+UmVkTWFza1NpemUgPSA1OwotCQltb2RlSW5mby0+UmVkRmllbGRQb3NpdGlvbiA9IDExOwotCQltb2RlSW5mby0+R3JlZW5NYXNrU2l6ZSA9IDU7Ci0JCW1vZGVJbmZvLT5HcmVlbkZpZWxkUG9zaXRpb24gPSA1OwotCQltb2RlSW5mby0+Qmx1ZU1hc2tTaXplID0gNTsKLQkJbW9kZUluZm8tPkJsdWVGaWVsZFBvc2l0aW9uID0gMDsKLQkJbW9kZUluZm8tPlJzdmRNYXNrU2l6ZSA9IDA7Ci0JCW1vZGVJbmZvLT5Sc3ZkRmllbGRQb3NpdGlvbiA9IDA7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDI0OgotCQltb2RlSW5mby0+UmVkTWFza1NpemUgPSA4OwotCQltb2RlSW5mby0+UmVkRmllbGRQb3NpdGlvbiA9IDE2OwotCQltb2RlSW5mby0+R3JlZW5NYXNrU2l6ZSA9IDg7Ci0JCW1vZGVJbmZvLT5HcmVlbkZpZWxkUG9zaXRpb24gPSA4OwotCQltb2RlSW5mby0+Qmx1ZU1hc2tTaXplID0gODsKLQkJbW9kZUluZm8tPkJsdWVGaWVsZFBvc2l0aW9uID0gMDsKLQkJbW9kZUluZm8tPlJzdmRNYXNrU2l6ZSA9IDA7Ci0JCW1vZGVJbmZvLT5Sc3ZkRmllbGRQb3NpdGlvbiA9IDA7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgLyogQ29udmVydCB0aGUgMzJrIGRpcmVjdCBjb2xvciBtb2RlcyBvZiBWQkUgMS4yKyBCSU9TZXMgdG8KLSAgICAgKiBiZSByZWNvZ25pc2VkIGFzIDE1IGJpdHMgcGVyIHBpeGVsIG1vZGVzLgotICAgICAqLwotICAgIGlmIChiaXRzID09IDE2ICYmIG1vZGVJbmZvLT5Sc3ZkTWFza1NpemUgPT0gMSkKLQltb2RlSW5mby0+Qml0c1BlclBpeGVsID0gMTU7Ci0KLSAgICAvKiBGaXggdXAgYm9ndXMgQklPUydlcyB0aGF0IHJlcG9ydCBpbmNvcnJlY3QgcmVzZXJ2ZWQgcGl4ZWwgbWFza3MKLSAgICAgKiBmb3IgMzJLIGNvbG9yIG1vZGVzLiBRdWl0ZSBhIG51bWJlciBvZiBCSU9TJ2VzIGhhdmUgdGhpcyBwcm9ibGVtLAotICAgICAqIGFuZCB0aGlzIGFmZmVjdHMgb3VyIE9TLzIgZHJpdmVycyBpbiBWQkUgZmFsbGJhY2sgbW9kZS4KLSAgICAgKi8KLSAgICBpZiAoYml0cyA9PSAxNSAmJiAobW9kZUluZm8tPlJzdmRNYXNrU2l6ZSAhPSAxIHx8IG1vZGVJbmZvLT5Sc3ZkRmllbGRQb3NpdGlvbiAhPSAxNSkpIHsKLQltb2RlSW5mby0+UnN2ZE1hc2tTaXplID0gMTsKLQltb2RlSW5mby0+UnN2ZEZpZWxkUG9zaXRpb24gPSAxNTsKLQl9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWxvbmcgVkJFQVBJIFZCRV9nZXRQYWdlU2l6ZShWQkVfbW9kZUluZm8gKm1pKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfZ2V0UGFnZVNpemUKLSogUGFyYW1ldGVyczogICBtaSAgLSBQb2ludGVyIHRvIG1vZGUgaW5mb3JtYXRpb24gYmxvY2sKLSogUmV0dXJuczogICAgICBDYWN1bGF0ZWQgcGFnZSBzaXplIGluIGJ5dGVzIHJvdW5kZWQgdG8gY29ycmVjdCBib3VuZGFyeQotKgotKiBEZXNjcmlwdGlvbjogIENvbXB1dGVzIHRoZSBwYWdlIHNpemUgaW4gYnl0ZXMgZm9yIHRoZSBzcGVjaWZpZWQgbW9kZQotKiAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGJsb2NrLCByb3VuZGVkIHVwIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeQotKiAgICAgICAgICAgICAgICg4aywgMTZrLCAzMmsgb3IgNjRrKS4gUGFnZXMgPj0gNjRrIGluIHNpemUgYXJlIGFsd2F5cwotKiAgICAgICAgICAgICAgIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgNjRrIGJvdW5kYXJ5IChzbyB0aGUgc3RhcnQgb2YgYQotKiAgICAgICAgICAgICAgIHBhZ2UgaXMgYWx3YXlzIGJhbmsgYWxpZ25lZCkuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIGxvbmcgc2l6ZTsKLQotICAgIHNpemUgPSAobG9uZyltaS0+Qnl0ZXNQZXJTY2FuTGluZSAqIChsb25nKW1pLT5ZUmVzb2x1dGlvbjsKLSAgICBpZiAobWktPkJpdHNQZXJQaXhlbCA9PSA0KSB7Ci0JLyogV2UgaGF2ZSBhIDE2IGNvbG9yIHZpZGVvIG1vZGUsIHNvIHJvdW5kIHVwIHRoZSBwYWdlIHNpemUgdG8KLQkgKiA4aywgMTZrLCAzMmsgb3IgNjRrIGJvdW5kYXJpZXMgZGVwZW5kaW5nIG9uIGhvdyBsYXJnZSBpdCBpcy4KLQkgKi8KLQotCXNpemUgPSAoc2l6ZSArIDB4MUZGRkwpICYgMHhGRkZGRTAwMEw7Ci0JaWYgKHNpemUgIT0gMHgyMDAwKSB7Ci0JICAgIHNpemUgPSAoc2l6ZSArIDB4M0ZGRkwpICYgMHhGRkZGQzAwMEw7Ci0JICAgIGlmIChzaXplICE9IDB4NDAwMCkgewotCQlzaXplID0gKHNpemUgKyAweDdGRkZMKSAmIDB4RkZGRjgwMDBMOwotCQlpZiAoc2l6ZSAhPSAweDgwMDApCi0JCSAgICBzaXplID0gKHNpemUgKyAweEZGRkZMKSAmIDB4RkZGRjAwMDBMOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgZWxzZSBzaXplID0gKHNpemUgKyAweEZGRkZMKSAmIDB4RkZGRjAwMDBMOwotICAgIHJldHVybiBzaXplOwotfQotCi1pYm9vbCBWQkVBUEkgVkJFX3NldFZpZGVvTW9kZUV4dChpbnQgbW9kZSxWQkVfQ1JUQ0luZm8gKmNydGMpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9zZXRWaWRlb01vZGVFeHQKLSogUGFyYW1ldGVyczogICBtb2RlICAgIC0gU3VwZXJWR0EgdmlkZW8gbW9kZSB0byBzZXQuCi0qIFJldHVybnM6ICAgICAgVHJ1ZSBpZiB0aGUgbW9kZSB3YXMgc2V0LCBmYWxzZSBpZiBub3QuCi0qCi0qIERlc2NyaXB0aW9uOiAgQXR0ZW1wdHMgdG8gc2V0IHRoZSBzcGVjaWZpZWQgdmlkZW8gbW9kZS4gVGhpcyB2ZXJzaW9uCi0qICAgICAgICAgICAgICAgaW5jbHVkZXMgc3VwcG9ydCBmb3IgdGhlIFZCRS9Db3JlIDMuMCByZWZyZXNoIHJhdGUgY29udHJvbAotKiAgICAgICAgICAgICAgIG1lY2hhbmlzbS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgaWYgKHN0YXRlLT5WQkVWZXJzaW9uIDwgMHgyMDAgJiYgbW9kZSA8IDB4MTAwKSB7Ci0JLyogU29tZSBWQkUgaW1wbGVtZW50YXRpb25zIGJhcmYgdGVycmlibHkgaWYgeW91IHRyeSB0byBzZXQgbm9uLVZCRQotCSAqIHZpZGVvIG1vZGVzIHdpdGggdGhlIFZCRSBzZXQgbW9kZSBjYWxsLiBWQkUgMi4wIGltcGxlbWVudGF0aW9ucwotCSAqIG11c3QgYmUgYWJsZSB0byBoYW5kbGUgdGhpcy4KLQkgKi8KLQlyZWdzLmguYWwgPSAodXNob3J0KW1vZGU7Ci0JcmVncy5oLmFoID0gMDsKLQlQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLQl9Ci0gICAgZWxzZSB7Ci0JaWYgKHN0YXRlLT5WQkVWZXJzaW9uIDwgMHgzMDAgJiYgKG1vZGUgJiB2YmVSZWZyZXNoQ3RybCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQlyZWdzLnguYXggPSAweDRGMDI7Ci0JcmVncy54LmJ4ID0gKHVzaG9ydCltb2RlOwotCWlmICgobW9kZSAmIHZiZVJlZnJlc2hDdHJsKSAmJiBjcnRjKQotCSAgICBWQkVfY2FsbEVTREkoJnJlZ3MsIGNydGMsIHNpemVvZigqY3J0YykpOwotCWVsc2UKLQkgICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7Ci0JaWYgKHJlZ3MueC5heCAhPSBWQkVfU1VDQ0VTUykKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotaWJvb2wgVkJFQVBJIFZCRV9zZXRWaWRlb01vZGUoaW50IG1vZGUpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9zZXRWaWRlb01vZGUKLSogUGFyYW1ldGVyczogICBtb2RlICAgIC0gU3VwZXJWR0EgdmlkZW8gbW9kZSB0byBzZXQuCi0qIFJldHVybnM6ICAgICAgVHJ1ZSBpZiB0aGUgbW9kZSB3YXMgc2V0LCBmYWxzZSBpZiBub3QuCi0qCi0qIERlc2NyaXB0aW9uOiAgQXR0ZW1wdHMgdG8gc2V0IHRoZSBzcGVjaWZpZWQgdmlkZW8gbW9kZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgcmV0dXJuIFZCRV9zZXRWaWRlb01vZGVFeHQobW9kZSxOVUxMKTsKLX0KLQotaW50IFZCRUFQSSBWQkVfZ2V0VmlkZW9Nb2RlKHZvaWQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9nZXRWaWRlb01vZGUKLSogUmV0dXJuczogICAgICBDdXJyZW50IHZpZGVvIG1vZGUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgcmVncy54LmF4ID0gMHg0RjAzOwotICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotICAgIGlmIChyZWdzLnguYXggIT0gVkJFX1NVQ0NFU1MpCi0JcmV0dXJuIC0xOwotICAgIHJldHVybiByZWdzLnguYng7Ci19Ci0KLWlib29sIFZCRUFQSSBWQkVfc2V0QmFuayhpbnQgd2luZG93LGludCBiYW5rKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfc2V0QmFuawotKiBQYXJhbWV0ZXJzOiAgIHdpbmRvdyAgLSBXaW5kb3cgdG8gc2V0Ci0qICAgICAgICAgICAgICAgYmFuayAgICAtIEJhbmsgbnVtYmVyIHRvIHNldCB3aW5kb3cgdG8KLSogUmV0dXJuczogICAgICBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIHJlZ3MueC5heCA9IDB4NEYwNTsKLSAgICByZWdzLmguYmggPSAwOwotICAgIHJlZ3MuaC5ibCA9IHdpbmRvdzsKLSAgICByZWdzLnguZHggPSBiYW5rOwotICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotICAgIHJldHVybiByZWdzLnguYXggPT0gVkJFX1NVQ0NFU1M7Ci19Ci0KLWludCBWQkVBUEkgVkJFX2dldEJhbmsoaW50IHdpbmRvdykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgVkJFX3NldEJhbmsKLSogUGFyYW1ldGVyczogICB3aW5kb3cgIC0gV2luZG93IHRvIHJlYWQKLSogUmV0dXJuczogICAgICBCYW5rIG51bWJlciBmb3IgdGhlIHdpbmRvdyAoLTEgb24gZmFpbHVyZSkKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgcmVncy54LmF4ID0gMHg0RjA1OwotICAgIHJlZ3MuaC5iaCA9IDE7Ci0gICAgcmVncy5oLmJsID0gd2luZG93OwotICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotICAgIGlmIChyZWdzLnguYXggIT0gVkJFX1NVQ0NFU1MpCi0JcmV0dXJuIC0xOwotICAgIHJldHVybiByZWdzLnguZHg7Ci19Ci0KLWlib29sIFZCRUFQSSBWQkVfc2V0UGl4ZWxzUGVyTGluZShpbnQgcGl4ZWxzUGVyTGluZSxpbnQgKm5ld0J5dGVzLAotICAgIGludCAqbmV3UGl4ZWxzLGludCAqbWF4U2NhbmxpbmVzKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfc2V0UGl4ZWxzUGVyTGluZQotKiBQYXJhbWV0ZXJzOiAgIHBpeGVsc1BlckxpbmUgICAtIFBpeGVscyBwZXIgc2NhbmxpbmUKLSogICAgICAgICAgICAgICBuZXdCeXRlcyAgICAgICAgLSBTdG9yYWdlIGZvciBieXRlcyBwZXIgbGluZSB2YWx1ZSBzZXQKLSogICAgICAgICAgICAgICBuZXdQaXhlbHMgICAgICAgLSBTdG9yYWdlIGZvciBwaXhlbHMgcGVyIGxpbmUgdmFsdWUgc2V0Ci0qICAgICAgICAgICAgICAgbWF4U2NhbkxpbmVzICAgIC0gU3RvcmFnZSBmb3IgbWF4aW11bSBudW1iZXIgb2Ygc2NhbmxpbmVzCi0qIFJldHVybnM6ICAgICAgVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlCi0qCi0qIERlc2NyaXB0aW9uOiAgU2V0cyB0aGUgc2NhbmxpbmUgbGVuZ3RoIGZvciB0aGUgdmlkZW8gbW9kZSB0byB0aGUgc3BlY2lmaWVkCi0qICAgICAgICAgICAgICAgbnVtYmVyIG9mIHBpeGVscyBwZXIgc2NhbmxpbmUuIElmIHlvdSBuZWVkIG1vcmUgZ3JhbnVsYXJpdHkKLSogICAgICAgICAgICAgICBpbiBUcnVlQ29sb3IgbW9kZXMsIHVzZSB0aGUgVkJFX3NldEJ5dGVzUGVyTGluZSByb3V0aW5lCi0qICAgICAgICAgICAgICAgKG9ubHkgdmFsaWQgZm9yIFZCRSAyLjApLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0KLSAgICByZWdzLnguYXggPSAweDRGMDY7Ci0gICAgcmVncy5oLmJsID0gMDsKLSAgICByZWdzLnguY3ggPSBwaXhlbHNQZXJMaW5lOwotICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotICAgICpuZXdCeXRlcyA9IHJlZ3MueC5ieDsKLSAgICAqbmV3UGl4ZWxzID0gcmVncy54LmN4OwotICAgICptYXhTY2FubGluZXMgPSByZWdzLnguZHg7Ci0gICAgcmV0dXJuIHJlZ3MueC5heCA9PSBWQkVfU1VDQ0VTUzsKLX0KLQotaWJvb2wgVkJFQVBJIFZCRV9zZXRCeXRlc1BlckxpbmUoaW50IGJ5dGVzUGVyTGluZSxpbnQgKm5ld0J5dGVzLAotICAgIGludCAqbmV3UGl4ZWxzLGludCAqbWF4U2NhbmxpbmVzKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfc2V0Qnl0ZXNQZXJMaW5lCi0qIFBhcmFtZXRlcnM6ICAgcGl4ZWxzUGVyTGluZSAgIC0gUGl4ZWxzIHBlciBzY2FubGluZQotKiAgICAgICAgICAgICAgIG5ld0J5dGVzICAgICAgICAtIFN0b3JhZ2UgZm9yIGJ5dGVzIHBlciBsaW5lIHZhbHVlIHNldAotKiAgICAgICAgICAgICAgIG5ld1BpeGVscyAgICAgICAtIFN0b3JhZ2UgZm9yIHBpeGVscyBwZXIgbGluZSB2YWx1ZSBzZXQKLSogICAgICAgICAgICAgICBtYXhTY2FuTGluZXMgICAgLSBTdG9yYWdlIGZvciBtYXhpbXVtIG51bWJlciBvZiBzY2FubGluZXMKLSogUmV0dXJuczogICAgICBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUKLSoKLSogRGVzY3JpcHRpb246ICBTZXRzIHRoZSBzY2FubGluZSBsZW5ndGggZm9yIHRoZSB2aWRlbyBtb2RlIHRvIHRoZSBzcGVjaWZpZWQKLSogICAgICAgICAgICAgICBudW1iZXIgb2YgYnl0ZXMgcGVyIHNjYW5saW5lICh2YWxpZCBmb3IgVkJFIDIuMCBvbmx5KS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgcmVncy54LmF4ID0gMHg0RjA2OwotICAgIHJlZ3MuaC5ibCA9IDI7Ci0gICAgcmVncy54LmN4ID0gYnl0ZXNQZXJMaW5lOwotICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotICAgICpuZXdCeXRlcyA9IHJlZ3MueC5ieDsKLSAgICAqbmV3UGl4ZWxzID0gcmVncy54LmN4OwotICAgICptYXhTY2FubGluZXMgPSByZWdzLnguZHg7Ci0gICAgcmV0dXJuIHJlZ3MueC5heCA9PSBWQkVfU1VDQ0VTUzsKLX0KLQotaWJvb2wgVkJFQVBJIFZCRV9nZXRTY2FubGluZUxlbmd0aChpbnQgKmJ5dGVzUGVyTGluZSxpbnQgKnBpeGVsc1BlckxpbmUsCi0gICAgaW50ICptYXhTY2FubGluZXMpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9nZXRTY2FubGluZUxlbmd0aAotKiBQYXJhbWV0ZXJzOiAgIGJ5dGVzUGVyTGluZSAgICAtIFN0b3JhZ2UgZm9yIGJ5dGVzIHBlciBzY2FubGluZQotKiAgICAgICAgICAgICAgIHBpeGVsc1BlckxpbmUgICAtIFN0b3JhZ2UgZm9yIHBpeGVscyBwZXIgc2NhbmxpbmUKLSogICAgICAgICAgICAgICBtYXhTY2FuTGluZXMgICAgLSBTdG9yYWdlIGZvciBtYXhpbXVtIG51bWJlciBvZiBzY2FubGluZXMKLSogUmV0dXJuczogICAgICBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgcmVncy54LmF4ID0gMHg0RjA2OwotICAgIHJlZ3MuaC5ibCA9IDE7Ci0gICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7Ci0gICAgKmJ5dGVzUGVyTGluZSA9IHJlZ3MueC5ieDsKLSAgICAqcGl4ZWxzUGVyTGluZSA9IHJlZ3MueC5jeDsKLSAgICAqbWF4U2NhbmxpbmVzID0gcmVncy54LmR4OwotICAgIHJldHVybiByZWdzLnguYXggPT0gVkJFX1NVQ0NFU1M7Ci19Ci0KLWlib29sIFZCRUFQSSBWQkVfZ2V0TWF4U2NhbmxpbmVMZW5ndGgoaW50ICptYXhCeXRlcyxpbnQgKm1heFBpeGVscykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgVkJFX2dldE1heFNjYW5saW5lTGVuZ3RoCi0qIFBhcmFtZXRlcnM6ICAgbWF4Qnl0ZXMgICAgLSBNYXhpbXVtIHNjYW5saW5lIHdpZHRoIGluIGJ5dGVzCi0qICAgICAgICAgICAgICAgbWF4UGl4ZWxzICAgLSBNYXhpbXVtIHNjYW5saW5lIHdpZHRoIGluIHBpeGVscwotKiBSZXR1cm5zOiAgICAgIFRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2UgaWYgZnVuY3Rpb24gZmFpbGVkCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIHJlZ3MueC5heCA9IDB4NEYwNjsKLSAgICByZWdzLmguYmwgPSAzOwotICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotICAgICptYXhCeXRlcyA9IHJlZ3MueC5ieDsKLSAgICAqbWF4UGl4ZWxzID0gcmVncy54LmN4OwotICAgIHJldHVybiByZWdzLnguYXggPT0gVkJFX1NVQ0NFU1M7Ci19Ci0KLWlib29sIFZCRUFQSSBWQkVfc2V0RGlzcGxheVN0YXJ0KGludCB4LGludCB5LGlib29sIHdhaXRWUlQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9zZXREaXNwbGF5U3RhcnQKLSogUGFyYW1ldGVyczogICB4LHkgICAgIC0gUG9zaXRpb24gb2YgdGhlIGZpcnN0IHBpeGVsIHRvIGRpc3BsYXkKLSogICAgICAgICAgICAgICB3YWl0VlJUIC0gVHJ1ZSB0byB3YWl0IGZvciByZXRyYWNlLCBmYWxzZSBpZiBub3QKLSogUmV0dXJuczogICAgICBUcnVlIGlmIGZ1bmN0aW9uIHdhcyBzdWNjZXNzZnVsLgotKgotKiBEZXNjcmlwdGlvbjogIFNldHMgdGhlIG5ldyBzdGFydGluZyBkaXNwbGF5IHBvc2l0aW9uIHRvIGltcGxlbWVudAotKiAgICAgICAgICAgICAgIGhhcmR3YXJlIHNjcm9sbGluZy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgcmVncy54LmF4ID0gMHg0RjA3OwotICAgIGlmICh3YWl0VlJUKQotCXJlZ3MueC5ieCA9IDB4ODA7Ci0gICAgZWxzZSByZWdzLnguYnggPSAweDAwOwotICAgIHJlZ3MueC5jeCA9IHg7Ci0gICAgcmVncy54LmR4ID0geTsKLSAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLSAgICByZXR1cm4gcmVncy54LmF4ID09IFZCRV9TVUNDRVNTOwotfQotCi1pYm9vbCBWQkVBUEkgVkJFX2dldERpc3BsYXlTdGFydChpbnQgKngsaW50ICp5KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfZ2V0RGlzcGxheVN0YXJ0Ci0qIFBhcmFtZXRlcnM6ICAgeCx5IC0gUGxhY2UgdG8gc3RvcmUgc3RhcnRpbmcgYWRkcmVzcyB2YWx1ZQotKiBSZXR1cm5zOiAgICAgIFRydWUgaWYgZnVuY3Rpb24gd2FzIHN1Y2Nlc3NmdWwuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIHJlZ3MueC5heCA9IDB4NEYwNzsKLSAgICByZWdzLnguYnggPSAweDAxOwotICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotICAgICp4ID0gcmVncy54LmN4OwotICAgICp5ID0gcmVncy54LmR4OwotICAgIHJldHVybiByZWdzLnguYXggPT0gVkJFX1NVQ0NFU1M7Ci19Ci0KLWlib29sIFZCRUFQSSBWQkVfc2V0RGlzcGxheVN0YXJ0QWx0KHVsb25nIHN0YXJ0QWRkcixpYm9vbCB3YWl0VlJUKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfc2V0RGlzcGxheVN0YXJ0QWx0Ci0qIFBhcmFtZXRlcnM6ICAgc3RhcnRBZGRyICAgLSAzMi1iaXQgc3RhcnRpbmcgYWRkcmVzcyBpbiBkaXNwbGF5IG1lbW9yeQotKiAgICAgICAgICAgICAgIHdhaXRWUlQgICAgIC0gVHJ1ZSB0byB3YWl0IGZvciB2ZXJ0aWNhbCByZXRyYWNlLCBmYWxzZSBpZiBub3QKLSogUmV0dXJuczogICAgICBUcnVlIGlmIGZ1bmN0aW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBpZiBub3Qgc3VwcG9ydGVkLgotKgotKiBEZXNjcmlwdGlvbjogIFNldHMgdGhlIG5ldyBzdGFydGluZyBkaXNwbGF5IHBvc2l0aW9uIHRvIHRoZSBzcGVjaWZpZWQKLSogICAgICAgICAgICAgICAzMi1iaXQgZGlzcGxheSBzdGFydCBhZGRyZXNzLiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcwotKiAgICAgICAgICAgICAgIGRpZmZlcmVudCB0aGUgdGhlIHZlcnNpb24gYWJvdmUsIHNpbmNlIGl0IHRha2VzIGEgMzItYml0Ci0qICAgICAgICAgICAgICAgYnl0ZSBvZmZzZXQgaW4gdmlkZW8gbWVtb3J5IGFzIHRoZSBzdGFydGluZyBhZGRyZXNzIHdoaWNoCi0qICAgICAgICAgICAgICAgZ2l2ZXMgdGhlIHByb2dyYW1tZXIgbWF4aW11bSBjb250cm9sIG92ZXIgdGhlIHN0YXQgYWRkcmVzcy4KLSoKLSogICAgICAgICAgICAgICBOT1RFOiBSZXF1aXJlcyBWQkUvQ29yZSAzLjAKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgaWYgKHN0YXRlLT5WQkVWZXJzaW9uID49IDB4MzAwKSB7Ci0JcmVncy54LmF4ID0gMHg0RjA3OwotCXJlZ3MueC5ieCA9IHdhaXRWUlQgPyAweDgyIDogMHgwMjsKLQlyZWdzLmUuZWN4ID0gc3RhcnRBZGRyOwotCVBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotCXJldHVybiByZWdzLnguYXggPT0gVkJFX1NVQ0NFU1M7Ci0JfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotaW50IFZCRUFQSSBWQkVfZ2V0RGlzcGxheVN0YXJ0U3RhdHVzKHZvaWQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9nZXREaXNwbGF5U3RhcnRTdGF0dXMKLSogUmV0dXJuczogICAgICAwIGlmIGxhc3QgZmxpcCBub3Qgb2NjdXJyZWQsIDEgaWYgYWxyZWFkeSBmbGlwcGVkCi0qICAgICAgICAgICAgICAgLTEgaWYgbm90IHN1cHBvcnRlZAotKgotKiBEZXNjcmlwdGlvbjogIFJldHVybnMgdGhlIHN0YXR1cyBvZiB0aGUgcHJldmlvdXMgZGlzcGxheSBzdGFydCByZXF1ZXN0LgotKiAgICAgICAgICAgICAgIElmIHRoaXMgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIHRoZSBwcm9ncmFtbWVyIGNhbiBpbXBsZW1lbnQKLSogICAgICAgICAgICAgICBoYXJkd2FyZSB0cmlwbGUgYnVmZmVyaW5nIHVzaW5nIHRoaXMgZnVuY3Rpb24uCi0qCi0qICAgICAgICAgICAgICAgTk9URTogUmVxdWlyZXMgVkJFL0NvcmUgMy4wCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIGlmIChzdGF0ZS0+VkJFVmVyc2lvbiA+PSAweDMwMCkgewotCXJlZ3MueC5heCA9IDB4NEYwNzsKLQlyZWdzLnguYnggPSAweDAwMDQ7Ci0JUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7Ci0JaWYgKHJlZ3MueC5heCA9PSBWQkVfU1VDQ0VTUykKLQkgICAgcmV0dXJuIChyZWdzLnguY3ggIT0gMCk7Ci0JfQotICAgIHJldHVybiAtMTsKLX0KLQotaWJvb2wgVkJFQVBJIFZCRV9lbmFibGVTdGVyZW9Nb2RlKHZvaWQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9lbmFibGVTdGVyZW9Nb2RlCi0qIFJldHVybnM6ICAgICAgVHJ1ZSBpZiBzdGVyZW8gbW9kZSBlbmFibGVkLCBmYWxzZSBpZiBub3Qgc3VwcG9ydGVkLgotKgotKiBEZXNjcmlwdGlvbjogIFB1dHMgdGhlIHN5c3RlbSBpbnRvIGhhcmR3YXJlIHN0ZXJlbyBtb2RlIGZvciBMQyBzaHV0dGVyCi0qICAgICAgICAgICAgICAgZ2xhc3Nlcywgd2hlcmUgdGhlIGRpc3BsYXkgc3dhcHMgYmV0d2VlbiB0d28gZGlzcGxheSBzdGFydAotKiAgICAgICAgICAgICAgIGFkZHJlc3NlcyBldmVyeSB2ZXJ0aWNhbCByZXRyYWNlLgotKgotKiAgICAgICAgICAgICAgIE5PVEU6IFJlcXVpcmVzIFZCRS9Db3JlIDMuMAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0KLSAgICBpZiAoc3RhdGUtPlZCRVZlcnNpb24gPj0gMHgzMDApIHsKLQlyZWdzLnguYXggPSAweDRGMDc7Ci0JcmVncy54LmJ4ID0gMHgwMDA1OwotCVBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotCXJldHVybiByZWdzLnguYXggPT0gVkJFX1NVQ0NFU1M7Ci0JfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotaWJvb2wgVkJFQVBJIFZCRV9kaXNhYmxlU3RlcmVvTW9kZSh2b2lkKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfZGlzYWJsZVN0ZXJlb01vZGUKLSogUmV0dXJuczogICAgICBUcnVlIGlmIHN0ZXJlbyBtb2RlIGRpc2FibGVkLCBmYWxzZSBpZiBub3Qgc3VwcG9ydGVkLgotKgotKiBEZXNjcmlwdGlvbjogIFB1dHMgdGhlIHN5c3RlbSBiYWNrIGludG8gbm9ybWFsLCBub24tc3RlcmVvIGRpc3BsYXkgbW9kZQotKiAgICAgICAgICAgICAgIGFmdGVyIGhhdmluZyBzdGVyZW8gbW9kZSBlbmFibGVkLgotKgotKiAgICAgICAgICAgICAgIE5PVEU6IFJlcXVpcmVzIFZCRS9Db3JlIDMuMAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0KLSAgICBpZiAoc3RhdGUtPlZCRVZlcnNpb24gPj0gMHgzMDApIHsKLQlyZWdzLnguYXggPSAweDRGMDc7Ci0JcmVncy54LmJ4ID0gMHgwMDA2OwotCVBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotCXJldHVybiByZWdzLnguYXggPT0gVkJFX1NVQ0NFU1M7Ci0JfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotaWJvb2wgVkJFQVBJIFZCRV9zZXRTdGVyZW9EaXNwbGF5U3RhcnQodWxvbmcgbGVmdEFkZHIsdWxvbmcgcmlnaHRBZGRyLAotICAgIGlib29sIHdhaXRWUlQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9zZXRTdGVyZW9EaXNwbGF5U3RhcnQKLSogUGFyYW1ldGVyczogICBsZWZ0QWRkciAgICAtIDMyLWJpdCBzdGFydCBhZGRyZXNzIGZvciBsZWZ0IGltYWdlCi0qICAgICAgICAgICAgICAgcmlnaHRBZGRyICAgLSAzMi1iaXQgc3RhcnQgYWRkcmVzcyBmb3IgcmlnaHQgaW1hZ2UKLSogICAgICAgICAgICAgICB3YWl0VlJUICAgICAtIFRydWUgdG8gd2FpdCBmb3IgdmVydGljYWwgcmV0cmFjZSwgZmFsc2UgaWYgbm90Ci0qIFJldHVybnM6ICAgICAgVHJ1ZSBpZiBmdW5jdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2UgaWYgbm90IHN1cHBvcnRlZC4KLSoKLSogRGVzY3JpcHRpb246ICBTZXRzIHRoZSBuZXcgc3RhcnRpbmcgZGlzcGxheSBwb3NpdGlvbiB0byB0aGUgc3BlY2lmaWVkCi0qICAgICAgICAgICAgICAgMzItYml0IGRpc3BsYXkgc3RhcnQgYWRkcmVzcy4gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMKLSogICAgICAgICAgICAgICBkaWZmZXJlbnQgdGhlIHRoZSB2ZXJzaW9uIGFib3ZlLCBzaW5jZSBpdCB0YWtlcyBhIDMyLWJpdAotKiAgICAgICAgICAgICAgIGJ5dGUgb2Zmc2V0IGluIHZpZGVvIG1lbW9yeSBhcyB0aGUgc3RhcnRpbmcgYWRkcmVzcyB3aGljaAotKiAgICAgICAgICAgICAgIGdpdmVzIHRoZSBwcm9ncmFtbWVyIG1heGltdW0gY29udHJvbCBvdmVyIHRoZSBzdGF0IGFkZHJlc3MuCi0qCi0qICAgICAgICAgICAgICAgTk9URTogUmVxdWlyZXMgVkJFL0NvcmUgMy4wCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIGlmIChzdGF0ZS0+VkJFVmVyc2lvbiA+PSAweDMwMCkgewotCXJlZ3MueC5heCA9IDB4NEYwNzsKLQlyZWdzLnguYnggPSB3YWl0VlJUID8gMHg4MyA6IDB4MDM7Ci0JcmVncy5lLmVjeCA9IGxlZnRBZGRyOwotCXJlZ3MuZS5lZHggPSByaWdodEFkZHI7Ci0JUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7Ci0JcmV0dXJuIHJlZ3MueC5heCA9PSBWQkVfU1VDQ0VTUzsKLQl9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi11bG9uZyBWQkVBUEkgVkJFX2dldENsb3Nlc3RDbG9jayh1c2hvcnQgbW9kZSx1bG9uZyBwaXhlbENsb2NrKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfZ2V0Q2xvc2VzdENsb2NrCi0qIFBhcmFtZXRlcnM6ICAgbW9kZSAgICAgICAgLSBWQkUgbW9kZSB0byBiZSB1c2VkIChpbmNsdWRlIHZiZUxpbmVhckJ1ZmZlcikKLSogICAgICAgICAgICAgICBwaXhlbENsb2NrICAtIERlc2lyZWQgcGl4ZWwgY2xvY2sKLSogUmV0dXJuczogICAgICBDbG9zZXN0IHBpeGVsIGNsb2NrIHRvIGRlc2lyZWQgY2xvY2sgKC0xIGlmIG5vdCBzdXBwb3J0ZWQpCi0qCi0qIERlc2NyaXB0aW9uOiAgQ2FsbHMgdGhlIFZCRS9Db3JlIDMuMCBpbnRlcmZhY2UgdG8gZGV0ZXJtaW5lIHRoZSBjbG9zZXN0Ci0qICAgICAgICAgICAgICAgcGl4ZWwgY2xvY2sgdG8gdGhlIHJlcXVlc3RlZCB2YWx1ZS4gVGhlIEJJT1Mgd2lsbCBhbHdheXMKLSogICAgICAgICAgICAgICBzZWFyY2ggZm9yIGEgcGl4ZWwgY2xvY2sgdGhhdCBpcyBubyBtb3JlIHRoYW4gMSUgYmVsb3cgdGhlCi0qICAgICAgICAgICAgICAgcmVxdWVzdGVkIGNsb2NrIG9yIHNvbWV3aGVyZSBoaWdoZXIgdGhhbiB0aGUgY2xvY2suIElmIHRoZQotKiAgICAgICAgICAgICAgIGNsb2NrIGlzIGhpZ2hlciBub3RlIHRoYXQgaXQgbWF5IHdlbGwgYmUgbWFueSBNaHogaGlnaGVyCi0qICAgICAgICAgICAgICAgdGhhdCByZXF1ZXN0ZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiB3aWxsIGhhdmUgdG8gY2hlY2sgdGhhdAotKiAgICAgICAgICAgICAgIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBzdWl0YWJsZSBmb3IgaXQncyBuZWVkcy4gVGhpcyBmdW5jdGlvbgotKiAgICAgICAgICAgICAgIHJldHVybnMgdGhlIGFjdHVhbCBwaXhlbCBjbG9jayB0aGF0IHdpbGwgYmUgcHJvZ3JhbW1lZCBieQotKiAgICAgICAgICAgICAgIHRoZSBoYXJkd2FyZS4KLSoKLSogICAgICAgICAgICAgICBOb3RlIHRoYXQgaWYgdGhlIHBpeGVsIGNsb2NrIHdpbGwgYmUgdXNlZCB3aXRoIGEgbGluZWFyCi0qICAgICAgICAgICAgICAgZnJhbWVidWZmZXIgbW9kZSwgbWFrZSBzdXJlIHlvdSBwYXNzIGluIHRoZSBsaW5lYXIKLSogICAgICAgICAgICAgICBmcmFtZWJ1ZmZlciBmbGFnIHRvIHRoaXMgZnVuY3Rpb24uCi0qCi0qICAgICAgICAgICAgICAgTk9URTogUmVxdWlyZXMgVkJFL0NvcmUgMy4wCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIGlmIChzdGF0ZS0+VkJFVmVyc2lvbiA+PSAweDMwMCkgewotCXJlZ3MueC5heCA9IDB4NEYwQjsKLQlyZWdzLmguYmwgPSAweDAwOwotCXJlZ3MuZS5lY3ggPSBwaXhlbENsb2NrOwotCXJlZ3MueC5keCA9IG1vZGU7Ci0JUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7Ci0JaWYgKHJlZ3MueC5heCA9PSBWQkVfU1VDQ0VTUykKLQkgICAgcmV0dXJuIHJlZ3MuZS5lY3g7Ci0JfQotICAgIHJldHVybiAtMTsKLX0KLQotaWJvb2wgVkJFQVBJIFZCRV9zZXREQUNXaWR0aChpbnQgd2lkdGgpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9zZXREQUNXaWR0aAotKiBQYXJhbWV0ZXJzOiAgIHdpZHRoICAgLSBXaWR0aCB0byBzZXQgdGhlIERBQyB0bwotKiBSZXR1cm5zOiAgICAgIFRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0KLSAgICByZWdzLnguYXggPSAweDRGMDg7Ci0gICAgcmVncy5oLmJsID0gMHgwMDsKLSAgICByZWdzLmguYmggPSB3aWR0aDsKLSAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLSAgICByZXR1cm4gcmVncy54LmF4ID09IFZCRV9TVUNDRVNTOwotfQotCi1pbnQgVkJFQVBJIFZCRV9nZXREQUNXaWR0aCh2b2lkKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfZ2V0REFDV2lkdGgKLSogUmV0dXJuczogICAgICBDdXJyZW50IHdpZHRoIG9mIHRoZSBwYWxldHRlIERBQwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0KLSAgICByZWdzLnguYXggPSAweDRGMDg7Ci0gICAgcmVncy5oLmJsID0gMHgwMTsKLSAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLSAgICBpZiAocmVncy54LmF4ICE9IFZCRV9TVUNDRVNTKQotCXJldHVybiAtMTsKLSAgICByZXR1cm4gcmVncy5oLmJoOwotfQotCi1pYm9vbCBWQkVBUEkgVkJFX3NldFBhbGV0dGUoaW50IHN0YXJ0LGludCBudW0sVkJFX3BhbGV0dGUgKnBhbCxpYm9vbCB3YWl0VlJUKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWQkVfc2V0UGFsZXR0ZQotKiBQYXJhbWV0ZXJzOiAgIHN0YXJ0ICAgLSBTdGFydGluZyBwYWxldHRlIGluZGV4IHRvIHByb2dyYW0KLSogICAgICAgICAgICAgICBudW0gICAgIC0gTnVtYmVyIG9mIHBhbGV0dGUgaW5kZXhlcyB0byBwcm9ncmFtCi0qICAgICAgICAgICAgICAgcGFsICAgICAtIFBhbGV0dGUgYnVmZmVyIGNvbnRhaW5pbmcgdmFsdWVzCi0qICAgICAgICAgICAgICAgd2FpdFZSVCAtIFdhaXQgZm9yIHZlcnRpY2FsIHJldHJhY2UgZmxhZwotKiBSZXR1cm5zOiAgICAgIFRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZQotKgotKiBEZXNjcmlwdGlvbjogIFNldHMgYSBibG9jayBvZiBwYWxldHRlIHJlZ2lzdGVycyBieSBjYWxsaW5nIHRoZSBWQkUgMi4wCi0qICAgICAgICAgICAgICAgQklPUy4gVGhpcyBmdW5jdGlvbiB3aWxsIGZhaWwgb24gVkJFIDEuMiBpbXBsZW1lbnRhdGlvbnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIHJlZ3MueC5heCA9IDB4NEYwOTsKLSAgICByZWdzLmguYmwgPSB3YWl0VlJUID8gMHg4MCA6IDB4MDA7Ci0gICAgcmVncy54LmN4ID0gbnVtOwotICAgIHJlZ3MueC5keCA9IHN0YXJ0OwotICAgIFZCRV9jYWxsRVNESSgmcmVncywgcGFsLCBzaXplb2YoVkJFX3BhbGV0dGUpICogbnVtKTsKLSAgICByZXR1cm4gcmVncy54LmF4ID09IFZCRV9TVUNDRVNTOwotfQotCi12b2lkICogVkJFQVBJIFZCRV9nZXRCYW5rZWRQb2ludGVyKFZCRV9tb2RlSW5mbyAqbW9kZUluZm8pCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9nZXRCYW5rZWRQb2ludGVyCi0qIFBhcmFtZXRlcnM6ICAgbW9kZUluZm8gICAgLSBNb2RlIGluZm8gYmxvY2sgZm9yIHZpZGVvIG1vZGUKLSogUmV0dXJuczogICAgICBTZWxlY3RvciB0byB0aGUgbGluZWFyIGZyYW1lYnVmZmVyICgwIG9uIGZhaWx1cmUpCi0qCi0qIERlc2NyaXB0aW9uOiAgUmV0dXJucyBhIG5lYXIgcG9pbnRlciB0byB0aGUgVkdBIGZyYW1lYnVmZmVyIGFyZWEuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIC8qIFdlIGp1c3QgbWFwIHRoZSBwb2ludGVyIGV2ZXJ5IHRpbWUsIHNpbmNlIHRoZSBwb2ludGVyIHdpbGwgYWx3YXlzCi0gICAgICogYmUgaW4gcmVhbCBtb2RlIG1lbW9yeSwgc28gd2Ugd29udCBhY3R1YWxseSBiZSBtYXBwaW5nIGFueSByZWFsCi0gICAgICogbWVtb3J5LgotICAgICAqCi0gICAgICogTk9URTogV2UgY2Fubm90IGN1cnJlbnRseSBtYXAgYSBuZWFyIHBvaW50ZXIgdG8gdGhlIGJhbmtlZCBmcmFtZQotICAgICAqICAgICAgIGJ1ZmZlciBmb3IgV2F0Y29tIFdpbjM4Niwgc28gd2UgY3JlYXRlIGEgMTY6MTYgZmFyIHBvaW50ZXIgdG8KLSAgICAgKiAgICAgICB0aGUgdmlkZW8gbWVtb3J5LiBBbGwgdGhlIGFzc2VtYmxlciBjb2RlIHdpbGwgcmVuZGVyIHRvIHRoZQotICAgICAqICAgICAgIHZpZGVvIG1lbW9yeSBieSBsb2FkaW5nIHRoZSBzZWxlY3RvciByYXRoZXIgdGhhbiB1c2luZyBhCi0gICAgICogICAgICAgbmVhciBwb2ludGVyLgotICAgICAqLwotICAgIHVsb25nIHNlZyA9ICh1c2hvcnQpbW9kZUluZm8tPldpbkFTZWdtZW50OwotICAgIGlmIChzZWcgIT0gMCkgewotCWlmIChzZWcgPT0gMHhBMDAwKQotCSAgICByZXR1cm4gKHZvaWQqKVBNX2dldEEwMDAwUG9pbnRlcigpOwotCWVsc2UKLQkgICAgcmV0dXJuICh2b2lkKilQTV9tYXBQaHlzaWNhbEFkZHIoc2VnIDw8IDQsMHhGRkZGLHRydWUpOwotCX0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotI2lmbmRlZiBSRUFMTU9ERQotCi12b2lkICogVkJFQVBJIFZCRV9nZXRMaW5lYXJQb2ludGVyKFZCRV9tb2RlSW5mbyAqbW9kZUluZm8pCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9nZXRMaW5lYXJQb2ludGVyCi0qIFBhcmFtZXRlcnM6ICAgbW9kZUluZm8gICAgLSBNb2RlIGluZm8gYmxvY2sgZm9yIHZpZGVvIG1vZGUKLSogUmV0dXJuczogICAgICBTZWxlY3RvciB0byB0aGUgbGluZWFyIGZyYW1lYnVmZmVyICgwIG9uIGZhaWx1cmUpCi0qCi0qIERlc2NyaXB0aW9uOiAgUmV0dXJucyBhIG5lYXIgcG9pbnRlciB0byB0aGUgbGluZWFyIGZyYW1lYnVmZmVyIGZvciB0aGUgdmlkZW8KLSogICAgICAgICAgICAgICBtb2RlLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBzdGF0aWMgdWxvbmcgcGh5c1B0cltNQVhfTElOX1BUUlNdID0gezB9OwotICAgIHN0YXRpYyB2b2lkICpsaW5QdHJbTUFYX0xJTl9QVFJTXSA9IHswfTsKLSAgICBzdGF0aWMgaW50IG51bVB0cnMgPSAwOwotICAgIGludCBpOwotCi0gICAgLyogU2VhcmNoIGZvciBhbiBhbHJlYWR5IG1hcHBlZCBwb2ludGVyICovCi0gICAgZm9yIChpID0gMDsgaSA8IG51bVB0cnM7IGkrKykgewotCWlmIChwaHlzUHRyW2ldID09IG1vZGVJbmZvLT5QaHlzQmFzZVB0cikKLQkgICAgcmV0dXJuIGxpblB0cltpXTsKLQl9Ci0gICAgaWYgKG51bVB0cnMgPCBNQVhfTElOX1BUUlMpIHsKLQlwaHlzUHRyW251bVB0cnNdID0gbW9kZUluZm8tPlBoeXNCYXNlUHRyOwotCWxpblB0cltudW1QdHJzXSA9IFBNX21hcFBoeXNpY2FsQWRkcihtb2RlSW5mby0+UGh5c0Jhc2VQdHIsKHN0YXRlLT5WQkVNZW1vcnkgKiAxMDI0TCktMSx0cnVlKTsKLQlyZXR1cm4gbGluUHRyW251bVB0cnMrK107Ci0JfQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBJbml0UE1Db2RlKHZvaWQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIEluaXRQTUNvZGUgIC0gMzIgYml0IHByb3RlY3RlZCBtb2RlIHZlcnNpb24KLSoKLSogRGVzY3JpcHRpb246ICBGaW5kcyB0aGUgYWRkcmVzcyBvZiBhbmQgcmVsb2NhdGVzIHRoZSBwcm90ZWN0ZWQgbW9kZQotKiAgICAgICAgICAgICAgIGNvZGUgYmxvY2sgZnJvbSB0aGUgVkJFIDIuMCBpbnRvIGEgbG9jYWwgbWVtb3J5IGJsb2NrLiBUaGUKLSogICAgICAgICAgICAgICBtZW1vcnkgYmxvY2sgaXMgYWxsb2NhdGVkIHdpdGggbWFsbG9jKCkgYW5kIG11c3QgYmUgZnJlZWQKLSogICAgICAgICAgICAgICB3aXRoIFZCRV9mcmVlUE1Db2RlKCkgYWZ0ZXIgZ3JhcGhpY3MgcHJvY2Vzc2luZyBpcyBjb21wbGV0ZS4KLSoKLSogICAgICAgICAgICAgICBOb3RlIHRoYXQgdGhpcyBidWZmZXIgX211c3RfIGJlIHJlY29waWVkIGFmdGVyIGVhY2ggbW9kZSBzZXQsCi0qICAgICAgICAgICAgICAgYXMgdGhlIHJvdXRpbmVzIHdpbGwgY2hhbmdlIGRlcGVuZGluZyBvbiB0aGUgdW5kZXJseWluZwotKiAgICAgICAgICAgICAgIHZpZGVvIG1vZGUuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFJNUkVHUyAgICAgIHJlZ3M7Ci0gICAgUk1TUkVHUyAgICAgc3JlZ3M7Ci0gICAgdWNoYXIgICAgICAgKmNvZGU7Ci0gICAgaW50ICAgICAgICAgcG1MZW47Ci0KLSAgICBpZiAoIXN0YXRlLT5wbUluZm8gJiYgc3RhdGUtPlZCRVZlcnNpb24gPj0gMHgyMDApIHsKLQlyZWdzLnguYXggPSAweDRGMEE7Ci0JcmVncy54LmJ4ID0gMDsKLQlQTV9pbnQ4NngoMHgxMCwmcmVncywmcmVncywmc3JlZ3MpOwotCWlmIChyZWdzLnguYXggIT0gVkJFX1NVQ0NFU1MpCi0JICAgIHJldHVybjsKLQlpZiAoVkJFX3NoYXJlZCkKLQkgICAgc3RhdGUtPnBtSW5mbyA9IFBNX21hbGxvY1NoYXJlZChyZWdzLnguY3gpOwotCWVsc2UKLQkgICAgc3RhdGUtPnBtSW5mbyA9IFBNX21hbGxvYyhyZWdzLnguY3gpOwotCWlmIChzdGF0ZS0+cG1JbmZvID09IE5VTEwpCi0JICAgIHJldHVybjsKLQlzdGF0ZS0+cG1JbmZvMzIgPSBzdGF0ZS0+cG1JbmZvOwotCXBtTGVuID0gcmVncy54LmN4OwotCi0JLyogUmVsb2NhdGUgdGhlIGJsb2NrIGludG8gb3VyIGxvY2FsIGRhdGEgc2VnbWVudCAqLwotCWNvZGUgPSBQTV9tYXBSZWFsUG9pbnRlcihzcmVncy5lcyxyZWdzLnguZGkpOwotCW1lbWNweShzdGF0ZS0+cG1JbmZvLGNvZGUscG1MZW4pOwotCi0JLyogTm93IGRvIGEgc2FuaXR5IGNoZWNrIG9uIHRoZSBpbmZvcm1hdGlvbiB3ZSByZWNpZXZlIHRvIGVuc3VyZQotCSAqIHRoYXQgaXMgaXMgY29ycmVjdC4gU29tZSBCSU9TIHJldHVybiB0b3RhbGx5IGJvZ3VzIGluZm9ybWF0aW9uCi0JICogaW4gaGVyZSAoTWF0cm94IGlzIG9uZSkhIFVuZGVyIERPUyB0aGlzIHdvcmtzIE9LLCBidXQgdW5kZXIgT1MvMgotCSAqIHdlIGFyZSBzY3Jld2VkLgotCSAqLwotCWlmIChzdGF0ZS0+cG1JbmZvLT5zZXRXaW5kb3cgPj0gcG1MZW4gfHwKLQkgICAgc3RhdGUtPnBtSW5mby0+c2V0RGlzcGxheVN0YXJ0ID49IHBtTGVuIHx8Ci0JICAgIHN0YXRlLT5wbUluZm8tPnNldFBhbGV0dGUgPj0gcG1MZW4gfHwKLQkgICAgc3RhdGUtPnBtSW5mby0+SU9Qcml2SW5mbyA+PSBwbUxlbikgewotCSAgICBpZiAoVkJFX3NoYXJlZCkKLQkJUE1fZnJlZVNoYXJlZChzdGF0ZS0+cG1JbmZvKTsKLQkgICAgZWxzZQotCQlQTV9mcmVlKHN0YXRlLT5wbUluZm8pOwotCSAgICBzdGF0ZS0+cG1JbmZvMzIgPSBzdGF0ZS0+cG1JbmZvID0gTlVMTDsKLQkgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkvKiBSZWFkIHRoZSBJTyBwcml2ZWxlZGdlIGluZm8gYW5kIGRldGVybWluZSBpZiB3ZSBuZWVkIHRvCi0JICogcGFzcyBhIHNlbGVjdG9yIHRvIE1NSU8gcmVnaXN0ZXJzIHRvIHRoZSBiYW5rIHN3aXRjaCBjb2RlLgotCSAqIFNpbmNlIHdlIG5vIGxvbmdlciBzdXBwb3J0IHNlbGVjdG9yIGFsbG9jYXRpb24sIHdlIG5vIGxvbmdlcgotCSAqIHN1cHBvcnQgdGhpcyBtZWNoYW5pc20gc28gd2UgZGlzYWJsZSB0aGUgcHJvdGVjdGVkIG1vZGUKLQkgKiBpbnRlcmZhY2UgaW4gdGhpcyBjYXNlLgotCSAqLwotCWlmIChzdGF0ZS0+cG1JbmZvLT5JT1ByaXZJbmZvICYmICFzdGF0ZS0+TU1JT1NlbCkgewotCSAgICB1c2hvcnQgKnAgPSAodXNob3J0KikoKHVjaGFyKilzdGF0ZS0+cG1JbmZvICsgc3RhdGUtPnBtSW5mby0+SU9Qcml2SW5mbyk7Ci0JICAgIHdoaWxlICgqcCAhPSAweEZGRkYpCi0JCXArKzsKLQkgICAgcCsrOwotCSAgICBpZiAoKnAgIT0gMHhGRkZGKQotCQlWQkVfZnJlZVBNQ29kZSgpOwotCSAgICB9Ci0JfQotfQotCi12b2lkICogVkJFQVBJIFZCRV9nZXRTZXRCYW5rKHZvaWQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9nZXRTZXRCYW5rCi0qIFJldHVybnM6ICAgICAgUG9pbnRlciB0byB0aGUgMzIgVkJFIDIuMCBiaXQgYmFuayBzd2l0Y2hpbmcgcm91dGluZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgaWYgKHN0YXRlLT5WQkVWZXJzaW9uID49IDB4MjAwKSB7Ci0JSW5pdFBNQ29kZSgpOwotCWlmIChzdGF0ZS0+cG1JbmZvKQotCSAgICByZXR1cm4gKHVjaGFyKilzdGF0ZS0+cG1JbmZvICsgc3RhdGUtPnBtSW5mby0+c2V0V2luZG93OwotCX0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCAqIFZCRUFQSSBWQkVfZ2V0U2V0RGlzcGxheVN0YXJ0KHZvaWQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9nZXRTZXREaXNwbGF5U3RhcnQKLSogUmV0dXJuczogICAgICBQb2ludGVyIHRvIHRoZSAzMiBWQkUgMi4wIGJpdCBDUlQgc3RhcnQgYWRkcmVzcyByb3V0aW5lLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBpZiAoc3RhdGUtPlZCRVZlcnNpb24gPj0gMHgyMDApIHsKLQlJbml0UE1Db2RlKCk7Ci0JaWYgKHN0YXRlLT5wbUluZm8pCi0JICAgIHJldHVybiAodWNoYXIqKXN0YXRlLT5wbUluZm8gKyBzdGF0ZS0+cG1JbmZvLT5zZXREaXNwbGF5U3RhcnQ7Ci0JfQotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkICogVkJFQVBJIFZCRV9nZXRTZXRQYWxldHRlKHZvaWQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9nZXRTZXRQYWxldHRlCi0qIFJldHVybnM6ICAgICAgUG9pbnRlciB0byB0aGUgMzIgVkJFIDIuMCBiaXQgcGFsZXR0ZSBwcm9ncmFtbWluZyByb3V0aW5lLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBpZiAoc3RhdGUtPlZCRVZlcnNpb24gPj0gMHgyMDApIHsKLQlJbml0UE1Db2RlKCk7Ci0JaWYgKHN0YXRlLT5wbUluZm8pCi0JICAgIHJldHVybiAodWNoYXIqKXN0YXRlLT5wbUluZm8gKyBzdGF0ZS0+cG1JbmZvLT5zZXRQYWxldHRlOwotCX0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBWQkVBUEkgVkJFX2ZyZWVQTUNvZGUodm9pZCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgVkJFX2ZyZWVQTUNvZGUKLSoKLSogRGVzY3JpcHRpb246ICBUaGlzIHJvdXRpbmUgZnJlZXMgdGhlIHByb3RlY3RlZCBtb2RlIGNvZGUgYmxvY2tzIHRoYXQKLSogICAgICAgICAgICAgICB3ZSBjb3BpZWQgZnJvbSB0aGUgVkJFIDIuMCBpbnRlcmZhY2UuIFRoaXMgcm91dGluZSBtdXN0Ci0qICAgICAgICAgICAgICAgYmUgYWZ0ZXIgeW91IGhhdmUgZmluaXNoZWQgZ3JhcGhpY3MgcHJvY2Vzc2luZyB0byBmcmVlIHVwCi0qICAgICAgICAgICAgICAgdGhlIG1lbW9yeSBvY2N1cGllZCBieSB0aGUgcm91dGluZXMuIFRoaXMgaXMgbmVjZXNzYXJ5Ci0qICAgICAgICAgICAgICAgYmVjYXVzZSB0aGUgUE0gaW5mbyBtZW1vcnkgYmxvY2sgbXVzdCBiZSByZS1jb3BpZWQgYWZ0ZXIKLSogICAgICAgICAgICAgICBldmVyeSB2aWRlbyBtb2RlIHNldCBmcm9tIHRoZSBWQkUgMi4wIGltcGxlbWVudGF0aW9uLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBpZiAoc3RhdGUtPnBtSW5mbykgewotCWlmIChWQkVfc2hhcmVkKQotCSAgICBQTV9mcmVlU2hhcmVkKHN0YXRlLT5wbUluZm8pOwotCWVsc2UKLQkgICAgUE1fZnJlZShzdGF0ZS0+cG1JbmZvKTsKLQlzdGF0ZS0+cG1JbmZvID0gTlVMTDsKLQlzdGF0ZS0+cG1JbmZvMzIgPSBOVUxMOwotCX0KLX0KLQotdm9pZCBWQkVBUEkgVkJFX3NoYXJlUE1Db2RlKHZvaWQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZCRV9zaGFyZVBNQ29kZQotKgotKiBEZXNjcmlwdGlvbjogIEVuYWJsZXMgaW50ZXJuYWwgc2hhcmluZyBvZiB0aGUgUE0gY29kZSBidWZmZXIgZm9yIE9TLzIuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIFZCRV9zaGFyZWQgPSB0cnVlOwotfQotCi0vKiBTZXQgb2YgY29kZSBzdHVicyB1c2VkIHRvIGJ1aWxkIHRoZSBmaW5hbCBiYW5rIHN3aXRjaCBjb2RlICovCi0KLSNkZWZpbmUgVkJFMjBfYWRqdXN0T2Zmc2V0ICA3Ci0KLXN0YXRpYyB1Y2hhciBWQkUyMEFfYmFua0Z1bmMzMl9TdGFydFtdID0gewotICAgIDB4NTMsMHg1MSwgICAgICAgICAgICAgICAgICAvKiAgcHVzaCAgICBlYngsZWN4ICAgICAqLwotICAgIDB4OEIsMHhEMCwgICAgICAgICAgICAgICAgICAvKiAgbW92ICAgICBlZHgsZWF4ICAgICAqLwotICAgIDB4MzMsMHhEQiwgICAgICAgICAgICAgICAgICAvKiAgeG9yICAgICBlYngsZWJ4ICAgICAqLwotICAgIDB4QjEsMHgwMCwgICAgICAgICAgICAgICAgICAvKiAgbW92ICAgICBjbCwwICAgICAgICAqLwotICAgIDB4RDIsMHhFMiwgICAgICAgICAgICAgICAgICAvKiAgc2hsICAgICBkbCxjbCAgICAgICAqLwotICAgIH07Ci0KLXN0YXRpYyB1Y2hhciBWQkUyMF9iYW5rRnVuYzMyX0VuZFtdID0gewotICAgIDB4NTksMHg1QiwgICAgICAgICAgICAgICAgICAvKiAgcG9wICAgICBlY3gsZWJ4ICAgICAqLwotICAgIH07Ci0KLXN0YXRpYyB1Y2hhciBiYW5rRnVuYzMyWzEwMF07Ci0KLSNkZWZpbmUgY29weShwLGIsYSkgbWVtY3B5KGIsYSxzaXplb2YoYSkpOyAocCkgPSAoYikgKyBzaXplb2YoYSkKLQotaWJvb2wgVkJFQVBJIFZCRV9nZXRCYW5rRnVuYzMyKGludCAqY29kZUxlbix2b2lkICoqYmFua0Z1bmMsaW50IGR1YWxCYW5rcywKLSAgICBpbnQgYmFua0FkanVzdCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgVkJFX2dldEJhbmtGdW5jMzIKLSogUGFyYW1ldGVyczogICBjb2RlTGVuICAgICAtIFBsYWNlIHRvIHN0b3JlIGxlbmd0aCBvZiBjb2RlCi0qICAgICAgICAgICAgICAgYmFua0Z1bmMgICAgLSBQbGFjZSB0byBzdG9yZSBwb2ludGVyIHRvIGJhbmsgc3dpdGNoIGNvZGUKLSogICAgICAgICAgICAgICBkdWFsQmFua3MgICAtIFRydWUgaWYgZHVhbCBiYW5rcyBhcmUgaW4gZWZmZWN0Ci0qICAgICAgICAgICAgICAgYmFua0FkanVzdCAgLSBCYW5rIHNoaWZ0IGFkanVzdG1lbnQgZmFjdG9yCi0qIFJldHVybnM6ICAgICAgVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBub3QgY29tcGF0aWJsZS4KLSoKLSogRGVzY3JpcHRpb246ICBDcmVhdGVzIGEgbG9jYWwgMzIgYml0IGJhbmsgc3dpdGNoIGZ1bmN0aW9uIGZyb20gdGhlCi0qICAgICAgICAgICAgICAgVkJFIDIuMCBiYW5rIHN3aXRjaCBjb2RlIHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZQotKiAgICAgICAgICAgICAgIHZpcnR1YWwgZmxhdCBmcmFtZWJ1ZmZlciBkZXZpY2VzIChkb2VzIG5vdCBoYXZlIGEgcmV0dXJuCi0qICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24gYXQgdGhlIGVuZCBhbmQgdGFrZXMgdGhlIGJhbmsgbnVtYmVyIGluIEVBWAotKiAgICAgICAgICAgICAgIG5vdCBFRFgpLiBOb3RlIHRoYXQgdGhpcyAzMiBiaXQgY29kZSBjYW5ub3QgaW5jbHVkZSBpbnQgMTBoCi0qICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zLCBzbyB3ZSBjYW4gb25seSBkbyB0aGlzIGlmIHdlIGhhdmUgVkJFIDIuMAotKiAgICAgICAgICAgICAgIG9yIGxhdGVyLgotKgotKiAgICAgICAgICAgICAgIE5vdGUgdGhhdCB3ZSBuZWVkIHRvIGtub3cgdGhlIGxlbmd0aCBvZiB0aGUgMzIgYml0Ci0qICAgICAgICAgICAgICAgYmFuayBzd2l0Y2ggZnVuY3Rpb24sIHdoaWNoIHRoZSBzdGFuZGFyZCBWQkUgMi4wIHNwZWMKLSogICAgICAgICAgICAgICBkb2VzIG5vdCBwcm92aWRlLiBJbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgd2UgaGF2ZQotKiAgICAgICAgICAgICAgIGV4dGVuZGVkIHRoZSBWQkUgMi4wIHN0YXRlLT5wbUluZm8gc3RydWN0dXJlIGluIFVuaVZCRSA1LjIgaW4gYQotKiAgICAgICAgICAgICAgIHdheSB0byBzdXBwb3J0IHRoaXMsIGFuZCB3ZSBob3BlIHRoYXQgdGhpcyB3aWxsIGJlY29tZQotKiAgICAgICAgICAgICAgIGEgVkJFIDIuMCBhbW1lbmRtZW50LgotKgotKiAgICAgICAgICAgICAgIE5vdGUgYWxzbyB0aGF0IHdlIGNhbm5vdCBydW4gdGhlIGxpbmVhciBmcmFtZWJ1ZmZlcgotKiAgICAgICAgICAgICAgIGVtdWxhdGlvbiBjb2RlIHdpdGggYmFuayBzd2l0Y2hpbmcgcm91dGluZXMgdGhhdCByZXF1aXJlCi0qICAgICAgICAgICAgICAgYSBzZWxlY3RvciB0byB0aGUgbWVtb3J5IG1hcHBlZCByZWdpc3RlcnMgcGFzc2VkIGluIEVTLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBpbnQgICAgIGxlbjsKLSAgICB1Y2hhciAgICpjb2RlOwotICAgIHVjaGFyICAgKnA7Ci0KLSAgICBJbml0UE1Db2RlKCk7Ci0gICAgaWYgKHN0YXRlLT5WQkVWZXJzaW9uID49IDB4MjAwICYmIHN0YXRlLT5wbUluZm8zMiAmJiAhc3RhdGUtPk1NSU9TZWwpIHsKLQljb2RlID0gKHVjaGFyKilzdGF0ZS0+cG1JbmZvMzIgKyBzdGF0ZS0+cG1JbmZvMzItPnNldFdpbmRvdzsKLQlpZiAoc3RhdGUtPnBtSW5mbzMyLT5leHRlbnNpb25TaWcgPT0gVkJFMjBfRVhUX1NJRykKLQkgICAgbGVuID0gc3RhdGUtPnBtSW5mbzMyLT5zZXRXaW5kb3dMZW4tMTsKLQllbHNlIHsKLQkgICAgLyogV2UgYXJlIHJ1bm5pbmcgb24gYSBzeXN0ZW0gd2l0aG91dCB0aGUgVW5pVkJFIDUuMiBleHRlbnNpb24uCi0JICAgICAqIFdlIGRvIGFzIGJlc3Qgd2UgY2FuIGJ5IHNjYW5uaW5nIHRocm91Z2ggdGhlIGNvZGUgZm9yIHRoZQotCSAgICAgKiByZXQgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoZSBsZW5ndGguIFRoaXMgaXMgbm90IGZvb2xwcm9vZiwKLQkgICAgICogYnV0IGlzIHRoZSBiZXN0IHdlIGNhbiBkby4KLQkgICAgICovCi0JICAgIHAgPSBjb2RlOwotCSAgICB3aGlsZSAoKnAgIT0gMHhDMykKLQkJcCsrOwotCSAgICBsZW4gPSBwIC0gY29kZTsKLQkgICAgfQotCWlmICgobGVuICsgc2l6ZW9mKFZCRTIwQV9iYW5rRnVuYzMyX1N0YXJ0KSArIHNpemVvZihWQkUyMF9iYW5rRnVuYzMyX0VuZCkpID4gc2l6ZW9mKGJhbmtGdW5jMzIpKQotCSAgICBQTV9mYXRhbEVycm9yKCIzMi1iaXQgYmFuayBzd2l0Y2ggZnVuY3Rpb24gdG9vIGxvbmchIik7Ci0JY29weShwLGJhbmtGdW5jMzIsVkJFMjBBX2JhbmtGdW5jMzJfU3RhcnQpOwotCW1lbWNweShwLGNvZGUsbGVuKTsKLQlwICs9IGxlbjsKLQljb3B5KHAscCxWQkUyMF9iYW5rRnVuYzMyX0VuZCk7Ci0JKmNvZGVMZW4gPSBwIC0gYmFua0Z1bmMzMjsKLQliYW5rRnVuYzMyW1ZCRTIwX2FkanVzdE9mZnNldF0gPSAodWNoYXIpYmFua0FkanVzdDsKLQkqYmFua0Z1bmMgPSBiYW5rRnVuYzMyOwotCXJldHVybiB0cnVlOwotCX0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vYmVvcy9jcHVpbmZvLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9iZW9zL2NwdWluZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IzYWZlMi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9iZW9zL2NwdWluZm8uYworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogICoqKiBUT0RPOiBBREQgWU9VUiBPUyBFTlZJUk9OTUVOVCBOQU1FIEhFUkUgKioqCi0qCi0qIERlc2NyaXB0aW9uOiAgTW9kdWxlIHRvIGltcGxlbWVudCBPUyBzcGVjaWZpYyBzZXJ2aWNlcyB0byBtZWFzdXJlIHRoZQotKiAgICAgICAgICAgICAgIENQVSBmcmVxdWVuY3kuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8T1MuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbmNyZWFzZSB0aGUgdGhyZWFkIHByaW9yaXR5IHRvIG1heGltdW0sIGlmIHBvc3NpYmxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgU2V0TWF4VGhyZWFkUHJpb3JpdHkodm9pZCkKLXsKLSAgICB0aHJlYWRfaWQgdGhpZCA9IGZpbmRfdGhyZWFkKE5VTEwpOwotICAgIHRocmVhZF9pbmZvIHRpbmZvOwotICAgIGdldF90aHJlYWRfaW5mbyh0aGlkLCAmdGluZm8pOwotICAgIHNldF90aHJlYWRfcHJpb3JpdHkodGhpZCwgQl9SRUFMX1RJTUVfUFJJT1JJVFkpOwotICAgIHJldHVybiB0aW5mby5wcmlvcml0eTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXN0b3JlIHRoZSBvcmlnaW5hbCB0aHJlYWQgcHJpb3JpdHkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgUmVzdG9yZVRocmVhZFByaW9yaXR5KAotICAgIGludCBwcmlvcml0eSkKLXsKLSAgICB0aHJlYWRfaWQgdGhpZCA9IGZpbmRfdGhyZWFkKE5VTEwpOwotICAgIHNldF90aHJlYWRfcHJpb3JpdHkodGhpZCwgcHJpb3JpdHkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgZnJlcXVlbmN5IG9mIHRoZSBjb3VudGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEdldENvdW50ZXJGcmVxdWVuY3koCi0gICAgQ1BVX2xhcmdlSW50ZWdlciAqZnJlcSkKLXsKLSAgICAvKiBUT0RPOiBSZXR1cm4gdGhlIGZyZXF1ZW5jeSBvZiB0aGUgY291bnRlciBpbiBoZXJlLiBZb3Ugc2hvdWxkIHRyeSB0byAqLwotICAgIC8qICAgICAgIG5vcm1hbGlzZSB0aGlzIHZhbHVlIHRvIGJlIGFyb3VuZCAxMDAsMDAwIHRpY2tzIHBlciBzZWNvbmQuICovCi0gICAgZnJlcS0+bG93ID0gMTAwMDAwMDsKLSAgICBmcmVxLT5oaWdoID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGNvdW50ZXIgdmFsdWUuCi0KLVRPRE86IEltcGxlbWVudCB0aGlzIHRvIHJlYWQgdGhlIGNvdW50ZXIuIEl0IHNob3VsZCBiZSBkb25lIGFzIGEgbWFjcm8KLSAgICAgIGZvciBhY2N1cmFjeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEdldENvdW50ZXIodCkgeyAqKChiaWd0aW1lX3QqKSB0KSA9IHN5c3RlbV90aW1lKCk7IH0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Jlb3MvZXZlbnQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Jlb3MvZXZlbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNjNmMwYS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9iZW9zL2V2ZW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQmVPUwotKgotKiBEZXNjcmlwdGlvbjogIEJlT1MgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBTY2lUZWNoIGNyb3NzIHBsYXRmb3JtCi0qICAgICAgICAgICAgICAgZXZlbnQgbGlicmFyeS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1c2hvcnQgICAgICAga2V5VXBNc2dbMjU2XSA9IHswfTsvKiBUYWJsZSBvZiBrZXkgdXAgbWVzc2FnZXMgICAgICovCi1zdGF0aWMgaW50ICAgICAgICAgIHJhbmdlWCxyYW5nZVk7ICAgICAgLyogUmFuZ2Ugb2YgbW91c2UgY29vcmRpbmF0ZXMgICAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBUaGVzZSBhcmUgbm90IHVzZWQgdW5kZXIgbm9uLURPUyBzeXN0ZW1zICovCi0jZGVmaW5lIF9FVlRfZGlzYWJsZUludCgpICAgICAgIDEKLSNkZWZpbmUgX0VWVF9yZXN0b3JlSW50KGZsYWdzKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXNjYW5Db2RlICAgIC0gU2NhbiBjb2RlIHRvIHRlc3QKLQotUkVNQVJLUzoKLVRoaXMgbWFjcm8gZGV0ZXJtaW5lcyBpZiBhIHNwZWNpZmllZCBrZXkgaXMgY3VycmVudGx5IGRvd24gYXQgdGhlCi10aW1lIHRoYXQgdGhlIGNhbGwgaXMgbWFkZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9FVlRfaXNLZXlEb3duKHNjYW5Db2RlKSAgICAoa2V5VXBNc2dbc2NhbkNvZGVdICE9IDApCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIHRpY2tzIHNpbmNlIHN5c3RlbQotc3RhcnR1cCBpbiBtaWxsaXNlY29uZHMuIFRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIHZhbHVlIHRoYXQgaXMgcGxhY2VkIGludG8KLXRoZSB0aW1lIHN0YW1wIGZpZWxkcyBvZiBldmVudHMsIGFuZCBpcyB1c2VkIHRvIGltcGxlbWVudCBhdXRvIG1vdXNlIGRvd24KLWV2ZW50cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfRVZUX2dldFRpY2tzKHZvaWQpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgZm9yIHlvdXIgT1MhICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUHVtcHMgYWxsIG1lc3NhZ2VzIGluIHRoZSBhcHBsaWNhdGlvbiBtZXNzYWdlIHF1ZXVlIGludG8gb3VyIGV2ZW50IHF1ZXVlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9FVlRfcHVtcE1lc3NhZ2VzKHZvaWQpCi17Ci0gICAgLyogVE9ETzogVGhlIHB1cnBvc2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyB0byByZWFkIGFsbCBrZXlib2FyZCBhbmQgbW91c2UgKi8KLSAgICAvKiAgICAgICBldmVudHMgZnJvbSB0aGUgT1Mgc3BlY2lmaWMgZXZlbnQgcXVldWUsIHRyYW5zbGF0ZSB0aGVtIGFuZCBwb3N0ICovCi0gICAgLyogICAgICAgdGhlbSBpbnRvIHRoZSBTY2lUZWNoIGV2ZW50IHF1ZXVlLiAqLwotICAgIC8qICovCi0gICAgLyogTk9URTogVGhlcmUgYXJlIGEgY291cGxlIG9mIGltcG9ydGFudCB0aGluZ3MgdGhhdCB0aGlzIGZ1bmN0aW9uIG11c3QgKi8KLSAgICAvKiAgICAgICB0YWtlIGNhcmUgb2Y6ICovCi0gICAgLyogKi8KLSAgICAvKiAgMS4gU3VwcG9ydCBmb3IgS0VZRE9XTiwgS0VZUkVQRUFUIGFuZCBLRVlVUCBpcyByZXF1aXJlZC4gKi8KLSAgICAvKiAqLwotICAgIC8qICAyLiBTdXBwb3J0IGZvciByZWFkaW5nIGhhcmR3YXJlIHNjYW4gY29kZSBhcyB3ZWxsIGFzIEFTQ0lJICovCi0gICAgLyogICAgIHRyYW5zbGF0ZWQgdmFsdWVzIGlzIHJlcXVpcmVkLiBHYW1lcyB1c2UgdGhlIHNjYW4gY29kZXMgcmF0aGVyICovCi0gICAgLyogICAgIHRoYW4gQVNDSUkgdmFsdWVzLiBTY2FuIGNvZGVzIGdvIGludG8gdGhlIGhpZ2ggb3JkZXIgYnl0ZSBvZiB0aGUgKi8KLSAgICAvKiAgICAga2V5Ym9hcmQgbWVzc2FnZSBmaWVsZC4gKi8KLSAgICAvKiAqLwotICAgIC8qICAzLiBTdXBwb3J0IGZvciBhdCBsZWFzdCByZWFkaW5nIG1vdXNlIG1vdGlvbiBkYXRhIChtaWNrZXlzKSBmcm9tIHRoZSAqLwotICAgIC8qICAgICBtb3VzZSBpcyByZXF1aXJlZC4gVXNpbmcgdGhlIG1pY2tleSB2YWx1ZXMsIHdlIGNhbiB0aGVuIHRyYW5zbGF0ZSAqLwotICAgIC8qICAgICB0byBtb3VzZSBjdXJzb3IgY29vcmRpbmF0ZXMgc2NhbGVkIHRvIHRoZSByYW5nZSBvZiB0aGUgY3VycmVudCAqLwotICAgIC8qICAgICBncmFwaGljcyBkaXNwbGF5IG1vZGUuIE1vdXNlIHZhbHVlcyBhcmUgc2NhbGVkIGJhc2VkIG9uIHRoZSAqLwotICAgIC8qICAgICBnbG9iYWwgJ3JhbmdlWCcgYW5kICdyYW5nZVknLiAqLwotICAgIC8qICovCi0gICAgLyogIDQuIFN1cHBvcnQgZm9yIGEgdGltZXN0YW1wIGZvciB0aGUgZXZlbnRzIGlzIHJlcXVpcmVkLCB3aGljaCBpcyAqLwotICAgIC8qICAgICBkZWZpbmVkIGFzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIHNvbWUgZXZlbnQgKHVzdWFsbHkgKi8KLSAgICAvKiAgICAgc3lzdGVtIHN0YXJ0dXApLiBUaGlzIGlzIHRoZSB0aW1lc3RhbXAgd2hlbiB0aGUgZXZlbnQgb2NjdXJyZWQgKi8KLSAgICAvKiAgICAgKGllOiBhdCBpbnRlcnJ1cHQgdGltZSkgbm90IHdoZW4gaXQgd2FzIHN0dWZmIGludG8gdGhlIFNjaVRlY2ggKi8KLSAgICAvKiAgICAgZXZlbnQgcXVldWUuICovCi0gICAgLyogKi8KLSAgICAvKiAgNS4gU3VwcG9ydCBmb3IgbW91c2UgZG91YmxlIGNsaWNrIGV2ZW50cy4gSWYgdGhlIE9TIGhhcyBhIG5hdGl2ZSAqLwotICAgIC8qICAgICBtZWNoYW5pc20gdG8gZGV0ZXJtaW5lIHRoaXMsIGl0IHNob3VsZCBiZSB1c2VkLiBPdGhlcndpc2UgdGhlICovCi0gICAgLyogICAgIHRpbWUgc3RhbXAgaW5mb3JtYXRpb24gd2lsbCBiZSB1c2VkIGJ5IHRoZSBnZW5lcmljIGV2ZW50IGNvZGUgKi8KLSAgICAvKiAgICAgdG8gZ2VuZXJhdGUgZG91YmxlIGNsaWNrIGV2ZW50cy4gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIG1hY3JvL2Z1bmN0aW9uIGlzIHVzZWQgdG8gY29udmVydHMgdGhlIHNjYW4gY29kZXMgcmVwb3J0ZWQgYnkgdGhlCi1rZXlib2FyZCB0byBvdXIgZXZlbnQgbGlicmFyaWVzIG5vcm1hbGlzZWQgZm9ybWF0LiBXZSBvbmx5IGhhdmUgb25lIHNjYW4KLWNvZGUgZm9yIHRoZSAnQScga2V5LCBhbmQgdXNlIHNoaWZ0IG1vZGlmaWVycyB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYQotQ3RybC1GMSwgQWx0LUYxIGV0Yy4gVGhlIHJhdyBzY2FuIGNvZGVzIGZyb20gdGhlIGtleWJvYXJkIHdvcmsgdGhpcyB3YXksCi1idXQgdGhlIE9TIGdpdmVzIHVzICdjb29rZWQnIHNjYW4gY29kZXMsIHdlIGhhdmUgdG8gdHJhbnNsYXRlIHRoZW0gYmFjawotdG8gdGhlIHJhdyBmb3JtYXQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX21hc2tLZXlDb2RlKGV2dCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TYWZlbHkgYWJvcnQgdGhlIGV2ZW50IG1vZHVsZSB1cG9uIGNhdGNoaW5nIGEgZmF0YWwgZXJyb3IuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfRVZUX2Fib3J0KCkKLXsKLSAgICBFVlRfZXhpdCgpOwotICAgIFBNX2ZhdGFsRXJyb3IoIlVuaGFuZGxlZCBleGNlcHRpb24hIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotbW91c2VNb3ZlICAgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW5ldmUgdGhlIG1vdXNlIG5lZWRzIHRvIGJlIG1vdmVkCi0KLVJFTUFSS1M6Ci1Jbml0aWxpYXNlIHRoZSBldmVudCBoYW5kbGluZyBtb2R1bGUuIEhlcmUgd2UgaW5zdGFsbCBvdXIgbW91c2UgaGFuZGxpbmcgSVNSCi10byBiZSBjYWxsZWQgd2hlbmV2ZXIgYW55IGJ1dHRvbidzIGFyZSBwcmVzc2VkIG9yIHJlbGVhc2VkLiBXZSBhbHNvIGJ1aWxkCi10aGUgZnJlZSBsaXN0IG9mIGV2ZW50cyBpbiB0aGUgZXZlbnQgcXVldWUuCi0KLVdlIHVzZSBoYW5kbGVyIG51bWJlciAyIG9mIHRoZSBtb3VzZSBsaWJyYXJpZXMgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBvdXIKLWV2ZW50IGhhbmRsaW5nIHJvdXRpbmVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9pbml0KAotICAgIF9FVlRfbW91c2VNb3ZlSGFuZGxlciBtb3VzZU1vdmUpCi17Ci0gICAgLyogSW5pdGlhbGlzZSB0aGUgZXZlbnQgcXVldWUgKi8KLSAgICBfbW91c2VNb3ZlID0gbW91c2VNb3ZlOwotICAgIGluaXRFdmVudFF1ZXVlKCk7Ci0gICAgbWVtc2V0KGtleVVwTXNnLDAsc2l6ZW9mKGtleVVwTXNnKSk7Ci0KLSAgICAvKiBUT0RPOiBEbyBhbnkgT1Mgc3BlY2lmaWMgaW5pdGlhbGlzYXRpb24gaGVyZSAqLwotCi0gICAgLyogQ2F0Y2ggcHJvZ3JhbSB0ZXJtaW5hdGlvbiBzaWduYWxzIHNvIHdlIGNhbiBjbGVhbiB1cCBwcm9wZXJseSAqLwotICAgIHNpZ25hbChTSUdBQlJULCBfRVZUX2Fib3J0KTsKLSAgICBzaWduYWwoU0lHRlBFLCBfRVZUX2Fib3J0KTsKLSAgICBzaWduYWwoU0lHSU5ULCBfRVZUX2Fib3J0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLUNoYW5nZXMgdGhlIHJhbmdlIG9mIGNvb3JkaW5hdGVzIHJldHVybmVkIGJ5IHRoZSBtb3VzZSBmdW5jdGlvbnMgdG8gdGhlCi1zcGVjaWZpZWQgcmFuZ2Ugb2YgdmFsdWVzLiBUaGlzIGlzIHVzZWQgd2hlbiBjaGFuZ2luZyBiZXR3ZWVuIGdyYXBoaWNzCi1tb2RlcyBzZXQgdGhlIHJhbmdlIG9mIG1vdXNlIGNvb3JkaW5hdGVzIGZvciB0aGUgbmV3IGRpc3BsYXkgbW9kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfc2V0TW91c2VSYW5nZSgKLSAgICBpbnQgeFJlcywKLSAgICBpbnQgeVJlcykKLXsKLSAgICByYW5nZVggPSB4UmVzOwotICAgIHJhbmdlWSA9IHlSZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhaWxpc2VzIHRoZSBpbnRlcm5hbCBldmVudCBoYW5kbGluZyBtb2R1bGVzLiBUaGUgRVZUX3N1c3BlbmQgZnVuY3Rpb24KLWNhbiBiZSBjYWxsZWQgdG8gc3VzcGVuZCBldmVudCBoYW5kbGluZyAoc3VjaCBhcyB3aGVuIHNoZWxsaW5nIG91dCB0byBET1MpLAotYW5kIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVzdW1lIGl0IGFnYWluIGxhdGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX3Jlc3VtZSh2b2lkKQotewotICAgIC8qIERvIG5vdGhpbmcgZm9yIG5vbiBET1Mgc3lzdGVtcyAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotU3VzcGVuZHMgYWxsIG9mIG91ciBldmVudCBoYW5kbGluZyBvcGVyYXRpb25zLiBUaGlzIGlzIGFsc28gdXNlZCB0bwotZGUtaW5zdGFsbCB0aGUgZXZlbnQgaGFuZGxpbmcgY29kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVF9zdXNwZW5kKHZvaWQpCi17Ci0gICAgLyogRG8gbm90aGluZyBmb3Igbm9uIERPUyBzeXN0ZW1zICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1FeGl0cyB0aGUgZXZlbnQgbW9kdWxlIGZvciBwcm9ncmFtIHRlcm1pbmF0YXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfZXhpdCh2b2lkKQotewotICAgIC8qIFJlc3RvcmUgc2lnbmFsIGhhbmRsZXJzICovCi0gICAgc2lnbmFsKFNJR0FCUlQsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdGUEUsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdJTlQsIFNJR19ERkwpOwotCi0gICAgLyogVE9ETzogRG8gYW55IE9TIHNwZWNpZmljIGNsZWFudXAgaW4gaGVyZSAqLwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vYmVvcy9vc2hkci5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vYmVvcy9vc2hkci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDNkNzNlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Jlb3Mvb3NoZHIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEJlT1MKLSoKLSogRGVzY3JpcHRpb246ICBJbmNsdWRlIGZpbGUgdG8gaW5jbHVkZSBhbGwgT1Mgc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhpcyBpcyB3aGVyZSB5b3UgaW5jbHVkZSBPUyBzcGVjaWZpYyBoZWFkZXJzIGZvciB0aGUgZXZlbnQgaGFuZGxpbmcgKi8KLS8qIGxpYnJhcnkuICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9iZW9zL3BtLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9iZW9zL3BtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkY2IxYjguLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vYmVvcy9wbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEJlT1MKLSoKLSogRGVzY3JpcHRpb246ICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeSwgd2hpY2gKLSogICAgICAgICAgICAgICBjb250YWlucyBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IE9TIHNwZWNpZmljIHNlcnZpY2VzIGluIGEKLSogICAgICAgICAgICAgICBnZW5lcmljLCBjcm9zcyBwbGF0Zm9ybSBBUEkuIFBvcnRpbmcgdGhlIE9TIFBvcnRhYmlsaXR5Ci0qICAgICAgICAgICAgICAgTWFuYWdlciBsaWJyYXJ5IGlzIHRoZSBmaXJzdCBzdGVwIHRvIHBvcnRpbmcgYW55IFNjaVRlY2gKLSogICAgICAgICAgICAgICBwcm9kdWN0cyB0byBhIG5ldyBwbGF0Zm9ybS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgImRydmxpYi9vcy9vcy5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLS8qIFRPRE86IEluY2x1ZGUgYW55IEJlT1Mgc3BlY2lmaWMgaGVhZGVycyBoZXJlISAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdm9pZCAoUE1BUElQIGZhdGFsRXJyb3JDbGVhbnVwKSh2b2lkKSA9IE5VTEw7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgUE1BUEkgUE1faW5pdCh2b2lkKQotewotICAgIC8qIFRPRE86IERvIGFueSBpbml0aWFsaXNhdGlvbiBpbiBoZXJlLiBUaGlzIGluY2x1ZGVzIGdldHRpbmcgSU9QTCAqLwotICAgIC8qICAgICAgIGFjY2VzcyBmb3IgdGhlIHByb2Nlc3MgY2FsbGluZyBQTV9pbml0LiBUaGlzIHdpbGwgZ2V0IGNhbGxlZCAqLwotICAgIC8qICAgICAgIG1vcmUgdGhhbiBvbmNlLiAqLwotCi0gICAgLyogVE9ETzogSWYgeW91IHN1cHBvcnQgdGhlIHN1cHBsaWVkIE1UUlIgcmVnaXN0ZXIgc3R1ZmYgKHlvdSBuZWVkIHRvICovCi0gICAgLyogICAgICAgYmUgYXQgcmluZyAwIGZvciB0aGlzISksIHlvdSBzaG91bGQgaW5pdGlhbGlzZSBpdCBpbiBoZXJlLiAqLwotCi0vKiBNVFJSX2luaXQoKTsgKi8KLX0KLQotbG9uZyBQTUFQSSBQTV9nZXRPU1R5cGUodm9pZCkKLXsgcmV0dXJuIF9PU19CRU9TOyB9Ci0KLWludCBQTUFQSSBQTV9nZXRNb2RlVHlwZSh2b2lkKQoteyByZXR1cm4gUE1fMzg2OyB9Ci0KLXZvaWQgUE1BUEkgUE1fYmFja3NsYXNoKGNoYXIgKnMpCi17Ci0gICAgdWludCBwb3MgPSBzdHJsZW4ocyk7Ci0gICAgaWYgKHNbcG9zLTFdICE9ICcvJykgewotCXNbcG9zXSA9ICcvJzsKLQlzW3BvcysxXSA9ICdcMCc7Ci0JfQotfQotCi12b2lkIFBNQVBJIFBNX3NldEZhdGFsRXJyb3JDbGVhbnVwKAotICAgIHZvaWQgKFBNQVBJUCBjbGVhbnVwKSh2b2lkKSkKLXsKLSAgICBmYXRhbEVycm9yQ2xlYW51cCA9IGNsZWFudXA7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZmF0YWxFcnJvcihjb25zdCBjaGFyICptc2cpCi17Ci0gICAgLyogVE9ETzogSWYgeW91IGFyZSBydW5uaW5nIGluIGEgR1VJIGVudmlyb25tZW50IHdpdGhvdXQgYSBjb25zb2xlLCAqLwotICAgIC8qICAgICAgIHRoaXMgbmVlZHMgdG8gYmUgY2hhbmdlZCB0byBicmluZyB1cCBhIGZhdGFsIGVycm9yIG1lc3NhZ2UgKi8KLSAgICAvKiAgICAgICBib3ggYW5kIHRlcm1pbmF0ZSB0aGUgcHJvZ3JhbS4gKi8KLSAgICBpZiAoZmF0YWxFcnJvckNsZWFudXApCi0JZmF0YWxFcnJvckNsZWFudXAoKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwiJXNcbiIsIG1zZyk7Ci0gICAgZXhpdCgxKTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2dldFZFU0FCdWYodWludCAqbGVuLHVpbnQgKnJzZWcsdWludCAqcm9mZikKLXsKLSAgICAvKiBObyBCSU9TIGFjY2VzcyBmb3IgdGhlIEJlT1MgKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotaW50IFBNQVBJIFBNX2tiaGl0KHZvaWQpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgYSBrZXkgaXMgYXZhaWxhYmxlIHRvIGJlIHJlYWQuIFRoaXMgKi8KLSAgICAvKiAgICAgICBzaG91bGQgYmUgaW1wbGVtZW50ZWQsIGJ1dCBpcyBtb3N0bHkgdXNlZCBieSB0aGUgdGVzdCBwcm9ncmFtcyAqLwotICAgIC8qICAgICAgIHRoZXNlIGRheXMuICovCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWludCBQTUFQSSBQTV9nZXRjaCh2b2lkKQotewotICAgIC8qIFRPRE86IFRoaXMgcmV0dXJucyB0aGUgQVNDSUkgY29kZSBvZiB0aGUga2V5IHByZXNzZWQuIFRoaXMgKi8KLSAgICAvKiAgICAgICBzaG91bGQgYmUgaW1wbGVtZW50ZWQsIGJ1dCBpcyBtb3N0bHkgdXNlZCBieSB0aGUgdGVzdCBwcm9ncmFtcyAqLwotICAgIC8qICAgICAgIHRoZXNlIGRheXMuICovCi0gICAgcmV0dXJuIDB4RDsKLX0KLQotaW50IFBNQVBJIFBNX29wZW5Db25zb2xlKHZvaWQpCi17Ci0gICAgLyogVE9ETzogT3BlbnMgdXAgYSBmdWxsc2NyZWVuIGNvbnNvbGUgZm9yIGdyYXBoaWNzIG91dHB1dC4gSWYgeW91ciAqLwotICAgIC8qICAgICAgIGNvbnNvbGUgZG9lcyBub3QgaGF2ZSBncmFwaGljcy90ZXh0IG1vZGVzLCB0aGlzIGNhbiBiZSBsZWZ0ICovCi0gICAgLyogICAgICAgZW1wdHkuIFRoZSBtYWluIHB1cnBvc2Ugb2YgdGhpcyBpcyB0byBkaXNhYmxlIGNvbnNvbGUgc3dpdGNoaW5nICovCi0gICAgLyogICAgICAgd2hlbiBpbiBncmFwaGljcyBtb2RlcyBpZiB5b3UgY2FuIHN3aXRjaCBhd2F5IGZyb20gZnVsbHNjcmVlbiAqLwotICAgIC8qICAgICAgIGNvbnNvbGVzIChpZiB5b3Ugd2FudCB0byBhbGxvdyBzd2l0Y2hpbmcsIHRoaXMgY2FuIGJlIGRvbmUgKi8KLSAgICAvKiAgICAgICBlbHNld2hlcmUgd2l0aCBhIGZ1bGwgc2F2ZS9yZXN0b3JlIHN0YXRlIG9mIHRoZSBncmFwaGljcyBtb2RlKS4gKi8KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IFBNQVBJIFBNX2dldENvbnNvbGVTdGF0ZVNpemUodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBjb25zb2xlIHN0YXRlIGJ1ZmZlciB1c2VkIHRvIHNhdmUgdGhlICovCi0gICAgLyogICAgICAgc3RhdGUgb2YgdGhlIGNvbnNvbGUgYmVmb3JlIGdvaW5nIGludG8gZ3JhcGhpY3MgbW9kZS4gVGhpcyBpcyAqLwotICAgIC8qICAgICAgIHVzZWQgdG8gcmVzdG9yZSB0aGUgY29uc29sZSBiYWNrIHRvIG5vcm1hbCB3aGVuIHdlIGFyZSBkb25lLiAqLwotICAgIHJldHVybiAxOwotfQotCi12b2lkIFBNQVBJIFBNX3NhdmVDb25zb2xlU3RhdGUodm9pZCAqc3RhdGVCdWYsaW50IGNvbnNvbGVfaWQpCi17Ci0gICAgLyogVE9ETzogU2F2ZXMgdGhlIHN0YXRlIG9mIHRoZSBjb25zb2xlIGludG8gdGhlIHN0YXRlIGJ1ZmZlci4gVGhpcyBpcyAqLwotICAgIC8qICAgICAgIHVzZWQgdG8gcmVzdG9yZSB0aGUgY29uc29sZSBiYWNrIHRvIG5vcm1hbCB3aGVuIHdlIGFyZSBkb25lLiAqLwotICAgIC8qICAgICAgIFdlIHdpbGwgYWx3YXlzIHJlc3RvcmUgODB4MjUgdGV4dCBtb2RlIGFmdGVyIGJlaW5nIGluIGdyYXBoaWNzICovCi0gICAgLyogICAgICAgbW9kZSwgc28gaWYgcmVzdG9yaW5nIHRleHQgbW9kZSBpcyBhbGwgeW91IG5lZWQgdG8gZG8gdGhpcyBjYW4gKi8KLSAgICAvKiAgICAgICBiZSBsZWZ0IGVtcHR5LiAqLwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVDb25zb2xlU3RhdGUoY29uc3Qgdm9pZCAqc3RhdGVCdWYsaW50IGNvbnNvbGVfaWQpCi17Ci0gICAgLyogVE9ETzogUmVzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIGNvbnNvbGUgZnJvbSB0aGUgc3RhdGUgYnVmZmVyLiBUaGlzIGlzICovCi0gICAgLyogICAgICAgdXNlZCB0byByZXN0b3JlIHRoZSBjb25zb2xlIGJhY2sgdG8gbm9ybWFsIHdoZW4gd2UgYXJlIGRvbmUuICovCi0gICAgLyogICAgICAgV2Ugd2lsbCBhbHdheXMgcmVzdG9yZSA4MHgyNSB0ZXh0IG1vZGUgYWZ0ZXIgYmVpbmcgaW4gZ3JhcGhpY3MgKi8KLSAgICAvKiAgICAgICBtb2RlLCBzbyBpZiByZXN0b3JpbmcgdGV4dCBtb2RlIGlzIGFsbCB5b3UgbmVlZCB0byBkbyB0aGlzIGNhbiAqLwotICAgIC8qICAgICAgIGJlIGxlZnQgZW1wdHkuICovCi19Ci0KLXZvaWQgUE1BUEkgUE1fY2xvc2VDb25zb2xlKGludCBjb25zb2xlX2lkKQotewotICAgIC8qIFRPRE86IENsb3NlIHRoZSBjb25zb2xlIHdoZW4gd2UgYXJlIGRvbmUsIGdvaW5nIGJhY2sgdG8gdGV4dCBtb2RlLiAqLwotfQotCi12b2lkIFBNX3NldE9TQ3Vyc29yTG9jYXRpb24oaW50IHgsaW50IHkpCi17Ci0gICAgLyogVE9ETzogU2V0IHRoZSBPUyBjb25zb2xlIGN1cnNvciBsb2NhdGlvbiB0byB0aGUgbmV3IHZhbHVlLiBUaGlzIGlzICovCi0gICAgLyogICAgICAgZ2VuZXJhbGx5IHVzZWQgZm9yIG5ldyBPUyBwb3J0cyAodXNlZCBtb3N0bHkgZm9yIERPUykuICovCi19Ci0KLXZvaWQgUE1fc2V0T1NTY3JlZW5XaWR0aChpbnQgd2lkdGgsaW50IGhlaWdodCkKLXsKLSAgICAvKiBUT0RPOiBTZXQgdGhlIE9TIGNvbnNvbGUgc2NyZWVuIHdpZHRoLiBUaGlzIGlzIGdlbmVyYWxseSB1bnVzZWQgZm9yICovCi0gICAgLyogICAgICAgbmV3IE9TIHBvcnRzLiAqLwotfQotCi1pYm9vbCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrSGFuZGxlcihQTV9pbnRIYW5kbGVyIGloLCBpbnQgZnJlcXVlbmN5KQotewotICAgIC8qIFRPRE86IEluc3RhbGwgYSByZWFsIHRpbWUgY2xvY2sgaW50ZXJydXB0IGhhbmRsZXIuIE5vcm1hbGx5IHRoaXMgKi8KLSAgICAvKiAgICAgICB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgZnJvbSBtb3N0IE9TJ2VzIGluIHVzZXIgbGFuZCwgc28gYW4gKi8KLSAgICAvKiAgICAgICBhbHRlcm5hdGl2ZSBtZWNoYW5pc20gaXMgbmVlZGVkIHRvIGVuYWJsZSBzb2Z0d2FyZSBzdGVyZW8uICovCi0gICAgLyogICAgICAgSGVuY2UgbGVhdmUgdGhpcyB1bmltcGxlbWVudGVkIHVubGVzcyB5b3UgaGF2ZSBhIGhpZ2ggcHJpb3JpdHkgKi8KLSAgICAvKiAgICAgICBtZWNoYW5pc20gdG8gY2FsbCB0aGUgMzItYml0IGNhbGxiYWNrIHdoZW4gdGhlIHJlYWwgdGltZSBjbG9jayAqLwotICAgIC8qICAgICAgIGludGVycnVwdCBmaXJlcy4gKi8KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0ZyZXF1ZW5jeShpbnQgZnJlcXVlbmN5KQotewotICAgIC8qIFRPRE86IFNldCB0aGUgcmVhbCB0aW1lIGNsb2NrIGludGVycnVwdCBmcmVxdWVuY3kuIFVzZWQgZm9yIHN0ZXJlbyAqLwotICAgIC8qICAgICAgIExDIHNodXR0ZXIgZ2xhc3NlcyB3aGVuIGRvaW5nIHNvZnR3YXJlIHN0ZXJlby4gVXN1YWxseSBzZXRzICovCi0gICAgLyogICAgICAgdGhlIGZyZXF1ZW5jeSB0byBhcm91bmQgMjA0OCBIei4gKi8KLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlUmVhbFRpbWVDbG9ja0hhbmRsZXIodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBSZXN0b3JlcyB0aGUgcmVhbCB0aW1lIGNsb2NrIGhhbmRsZXIuICovCi19Ci0KLWNoYXIgKiBQTUFQSSBQTV9nZXRDdXJyZW50UGF0aCgKLSAgICBjaGFyICpwYXRoLAotICAgIGludCBtYXhMZW4pCi17Ci0gICAgcmV0dXJuIGdldGN3ZChwYXRoLG1heExlbik7Ci19Ci0KLWNoYXIgUE1BUEkgUE1fZ2V0Qm9vdERyaXZlKHZvaWQpCi17IHJldHVybiAnLyc7IH0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFZCRUFGUGF0aCh2b2lkKQoteyByZXR1cm4gUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgoKTsgfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c1BhdGgodm9pZCkKLXsKLSAgICBjaGFyICplbnYgPSBnZXRlbnYoIk5VQ0xFVVNfUEFUSCIpOwotICAgIHJldHVybiBlbnYgPyBlbnYgOiAiL3Vzci9saWIvbnVjbGV1cyI7Ci19Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIHBhdGhbMjU2XTsKLSAgICBzdHJjcHkocGF0aCxQTV9nZXROdWNsZXVzUGF0aCgpKTsKLSAgICBQTV9iYWNrc2xhc2gocGF0aCk7Ci0gICAgc3RyY2F0KHBhdGgsImNvbmZpZyIpOwotICAgIHJldHVybiBwYXRoOwotfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VW5pcXVlSUQodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBSZXR1cm4gYSB1bmlxdWUgSUQgZm9yIHRoZSBtYWNoaW5lLiBJZiBhIHVuaXF1ZSBJRCBpcyBub3QgKi8KLSAgICAvKiAgICAgICBhdmFpbGFibGUsIHJldHVybiB0aGUgbWFjaGluZSBuYW1lLiAqLwotICAgIHN0YXRpYyBjaGFyIGJ1ZlsxMjhdOwotICAgIGdldGhvc3RuYW1lKGJ1ZiwgMTI4KTsKLSAgICByZXR1cm4gYnVmOwotfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TWFjaGluZU5hbWUodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBSZXR1cm4gdGhlIG5ldHdvcmsgbWFjaGluZSBuYW1lIGZvciB0aGUgbWFjaGluZS4gKi8KLSAgICBzdGF0aWMgY2hhciBidWZbMTI4XTsKLSAgICBnZXRob3N0bmFtZShidWYsIDEyOCk7Ci0gICAgcmV0dXJuIGJ1ZjsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2dldEJJT1NQb2ludGVyKHZvaWQpCi17Ci0gICAgLyogTm8gQklPUyBhY2Nlc3Mgb24gdGhlIEJlT1MgKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2dldEEwMDAwUG9pbnRlcih2b2lkKQotewotICAgIHN0YXRpYyB2b2lkICpiYW5rUHRyOwotICAgIGlmICghYmFua1B0cikKLQliYW5rUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDB4QTAwMDAsMHhGRkZGLHRydWUpOwotICAgIHJldHVybiBiYW5rUHRyOwotfQotCi12b2lkICogUE1BUEkgUE1fbWFwUGh5c2ljYWxBZGRyKHVsb25nIGJhc2UsdWxvbmcgbGltaXQsaWJvb2wgaXNDYWNoZWQpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBtYXBzIGEgcGh5c2ljYWwgbWVtb3J5IGFkZHJlc3MgdG8gYSBsaW5lYXIgKi8KLSAgICAvKiAgICAgICBhZGRyZXNzIGluIHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MuICovCi0KLSAgICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uICptdXN0KiBiZSBhYmxlIHRvIGhhbmRsZSBhbnkgcGhzeWljYWwgYmFzZSAqLwotICAgIC8qICAgICAgIGFkZHJlc3MsIGFuZCBoZW5jZSB5b3Ugd2lsbCBoYXZlIHRvIGhhbmRsZSByb3VuZGluZyBvZiAqLwotICAgIC8qICAgICAgIHRoZSBwaHlzaWNhbCBiYXNlIGFkZHJlc3MgdG8gYSBwYWdlIGJvdW5kYXJ5IChpZTogNEtiIG9uICovCi0gICAgLyogICAgICAgeDg2IENQVSdzKSB0byBiZSBhYmxlIHRvIHByb3Blcmx5IG1hcCBpbiB0aGUgbWVtb3J5ICovCi0gICAgLyogICAgICAgcmVnaW9uLiAqLwotCi0gICAgLyogTk9URTogSWYgcG9zc2libGUgdGhlIGlzQ2FjaGVkIGJpdCBzaG91bGQgYmUgdXNlZCB0byBlbnN1cmUgdGhhdCAqLwotICAgIC8qICAgICAgIHRoZSBQQ0QgKFBhZ2UgQ2FjaGUgRGlzYWJsZSkgYW5kIFBXVCAoUGFnZSBXcml0ZSBUaHJvdWdoKSAqLwotICAgIC8qICAgICAgIGJpdHMgYXJlIHNldCB0byBkaXNhYmxlIGNhY2hpbmcgZm9yIGEgbWVtb3J5IG1hcHBpbmcgdXNlZCAqLwotICAgIC8qICAgICAgIGZvciBNTUlPIHJlZ2lzdGVyIGFjY2Vzcy4gV2UgYWxzbyBkaXNhYmxlIGNhY2hpbmcgdXNpbmcgKi8KLSAgICAvKiAgICAgICB0aGUgTVRSUiByZWdpc3RlcnMgZm9yIFBlbnRpdW0gUHJvIGFuZCBsYXRlciBjaGlwc2V0cyBzbyBpZiAqLwotICAgIC8qICAgICAgIE1UUlIgc3VwcG9ydCBpcyBlbmFibGVkIGZvciB5b3VyIE9TIHRoZW4geW91IGNhbiBzYWZlbHkgaWdub3JlICovCi0gICAgLyogICAgICAgdGhlIGlzQ2FjaGVkIGZsYWcgYW5kIGFsd2F5cyBlbmFibGUgY2FjaGluZyBpbiB0aGUgcGFnZSAqLwotICAgIC8qICAgICAgIHRhYmxlcy4gKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlUGh5c2ljYWxBZGRyKHZvaWQgKnB0cix1bG9uZyBsaW1pdCkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHdpbGwgZnJlZSBhIHBoeXNpY2FsIG1lbW9yeSBtYXBwaW5nIHByZXZpb3VzbHkgKi8KLSAgICAvKiAgICAgICBhbGxvY2F0ZWQgd2l0aCBQTV9tYXBQaHlzaWNhbEFkZHIoKSBpZiBhdCBhbGwgcG9zc2libGUuIElmICovCi0gICAgLyogICAgICAgeW91IGNhbid0IGZyZWUgcGh5c2ljYWwgbWVtb3J5IG1hcHBpbmdzLCBzaW1wbHkgZG8gbm90aGluZy4gKi8KLX0KLQotdWxvbmcgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyKHZvaWQgKnApCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgZmluZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIGxpbmVhciAqLwotICAgIC8qICAgICAgIGFkZHJlc3MuICovCi0gICAgcmV0dXJuIDB4RkZGRkZGRkZVTDsKLX0KLQotdm9pZCBQTUFQSSBQTV9zbGVlcCh1bG9uZyBtaWxsaXNlY29uZHMpCi17Ci0gICAgLyogVE9ETzogUHV0IHRoZSBwcm9jZXNzIHRvIHNsZWVwIGZvciBtaWxsaXNlY29uZHMgKi8KLX0KLQotaW50IFBNQVBJIFBNX2dldENPTVBvcnQoaW50IHBvcnQpCi17Ci0gICAgLyogVE9ETzogUmUtY29kZSB0aGlzIHRvIGRldGVybWluZSByZWFsIHZhbHVlcyB1c2luZyB0aGUgUGx1ZyBhbmQgUGxheSAqLwotICAgIC8qICAgICAgIG1hbmFnZXIgZm9yIHRoZSBPUy4gKi8KLSAgICBzd2l0Y2ggKHBvcnQpIHsKLQljYXNlIDA6IHJldHVybiAweDNGODsKLQljYXNlIDE6IHJldHVybiAweDJGODsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBQTUFQSSBQTV9nZXRMUFRQb3J0KGludCBwb3J0KQotewotICAgIC8qIFRPRE86IFJlLWNvZGUgdGhpcyB0byBkZXRlcm1pbmUgcmVhbCB2YWx1ZXMgdXNpbmcgdGhlIFBsdWcgYW5kIFBsYXkgKi8KLSAgICAvKiAgICAgICBtYW5hZ2VyIGZvciB0aGUgT1MuICovCi0gICAgc3dpdGNoIChwb3J0KSB7Ci0JY2FzZSAwOiByZXR1cm4gMHgzQkM7Ci0JY2FzZSAxOiByZXR1cm4gMHgzNzg7Ci0JY2FzZSAyOiByZXR1cm4gMHgyNzg7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi12b2lkICogUE1BUEkgUE1fbWFsbG9jU2hhcmVkKGxvbmcgc2l6ZSkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGlzIHVzZWQgdG8gYWxsb2NhdGUgbWVtb3J5IHRoYXQgaXMgc2hhcmVkIGJldHdlZW4gcHJvY2VzcyAqLwotICAgIC8qICAgICAgIHRoYXQgYWxsIGFjY2VzcyB0aGUgY29tbW9uIE51Y2xldXMgZHJpdmVycyB2aWEgYSBjb21tb24gZGlzcGxheSAqLwotICAgIC8qICAgICAgIGRyaXZlciBETEwuIElmIHlvdXIgT1MgZG9lcyBub3Qgc3VwcG9ydCBzaGFyZWQgbWVtb3J5IChvciBpZiAqLwotICAgIC8qICAgICAgIHRoZSBkaXNwbGF5IGRyaXZlciBkb2VzIG5vdCBuZWVkIHRvIGFsbG9jYXRlIHNoYXJlZCBtZW1vcnkgKi8KLSAgICAvKiAgICAgICBmb3IgZWFjaCBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UpLCB0aGlzIHNob3VsZCBqdXN0IGNhbGwgUE1fbWFsbG9jLiAqLwotICAgIHJldHVybiBQTV9tYWxsb2Moc2l6ZSk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZVNoYXJlZCh2b2lkICpwdHIpCi17Ci0gICAgLyogVE9ETzogRnJlZSB0aGUgc2hhcmVkIG1lbW9yeSBibG9jay4gVGhpcyB3aWxsIGJlIGNhbGxlZCBpbiB0aGUgY29udGV4dCAqLwotICAgIC8qICAgICAgIG9mIHRoZSBvcmlnaW5hbCBjYWxsaW5nIHByb2Nlc3MgdGhhdCBhbGxvY2F0ZWQgdGhlIHNoYXJlZCAqLwotICAgIC8qICAgICAgIG1lbW9yeSB3aXRoIFBNX21hbGxvY1NoYXJlZC4gU2ltcGx5IGNhbGwgZnJlZSBpZiB5b3UgZG8gbm90ICovCi0gICAgLyogICAgICAgbmVlZCB0aGlzLiAqLwotICAgIFBNX2ZyZWUocHRyKTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX21hcFRvUHJvY2Vzcyh2b2lkICpiYXNlLHVsb25nIGxpbWl0KQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBtYXAgYSBwaHlzaWNhbCBtZW1vcnkgbWFwcGluZyAqLwotICAgIC8qICAgICAgIHByZXZpb3VzbHkgYWxsb2NhdGVkIHdpdGggUE1fbWFwUGh5c2ljYWxBZGRyIGludG8gdGhlICovCi0gICAgLyogICAgICAgYWRkcmVzcyBzcGFjZSBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLiBJZiB0aGUgbWVtb3J5IG1hcHBpbmcgKi8KLSAgICAvKiAgICAgICBhbGxvY2F0ZWQgYnkgUE1fbWFwUGh5c2ljYWxBZGRyIGlzIGdsb2JhbCB0byBhbGwgcHJvY2Vzc2VzLCAqLwotICAgIC8qICAgICAgIHNpbXBseSByZXR1cm4gdGhlIHBvaW50ZXIuICovCi0gICAgcmV0dXJuIGJhc2U7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9tYXBSZWFsUG9pbnRlcih1aW50IHJfc2VnLHVpbnQgcl9vZmYpCi17Ci0gICAgLyogTm8gQklPUyBhY2Nlc3Mgb24gdGhlIEJlT1MgKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2FsbG9jUmVhbFNlZyh1aW50IHNpemUsdWludCAqcl9zZWcsdWludCAqcl9vZmYpCi17Ci0gICAgLyogTm8gQklPUyBhY2Nlc3Mgb24gdGhlIEJlT1MgKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlUmVhbFNlZyh2b2lkICptZW0pCi17Ci0gICAgLyogTm8gQklPUyBhY2Nlc3Mgb24gdGhlIEJlT1MgKi8KLX0KLQotdm9pZCBQTUFQSSBEUE1JX2ludDg2KGludCBpbnRubywgRFBNSV9yZWdzICpyZWdzKQotewotICAgIC8qIE5vIEJJT1MgYWNjZXNzIG9uIHRoZSBCZU9TICovCi19Ci0KLWludCBQTUFQSSBQTV9pbnQ4NihpbnQgaW50bm8sIFJNUkVHUyAqaW4sIFJNUkVHUyAqb3V0KQotewotICAgIC8qIE5vIEJJT1MgYWNjZXNzIG9uIHRoZSBCZU9TICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBQTUFQSSBQTV9pbnQ4NngoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICAvKiBObyBCSU9TIGFjY2VzcyBvbiB0aGUgQmVPUyAqLwotICAgIHJldHVybiAwOwotfQotCi12b2lkIFBNQVBJIFBNX2NhbGxSZWFsTW9kZSh1aW50IHNlZyx1aW50IG9mZiwgUk1SRUdTICppbiwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICAvKiBObyBCSU9TIGFjY2VzcyBvbiB0aGUgQmVPUyAqLwotfQotCi12b2lkIFBNQVBJIFBNX2F2YWlsYWJsZU1lbW9yeSh1bG9uZyAqcGh5c2ljYWwsdWxvbmcgKnRvdGFsKQotewotICAgIC8qIFRPRE86IFJlcG9ydCB0aGUgYW1vdW50IG9mIGF2YWlsYWJsZSBtZW1vcnksIGJvdGggdGhlIGFtb3VudCBvZiAqLwotICAgIC8qICAgICAgIHBoeXNpY2FsIG1lbW9yeSBsZWZ0IGFuZCB0aGUgYW1vdW50IG9mIHZpcnR1YWwgbWVtb3J5IGxlZnQuICovCi0gICAgLyogICAgICAgSWYgdGhlIE9TIGRvZXMgbm90IHByb3ZpZGUgdGhlc2Ugc2VydmljZXMsIHJlcG9ydCAwJ3MuICovCi0gICAgKnBoeXNpY2FsID0gKnRvdGFsID0gMDsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2FsbG9jTG9ja2VkTWVtKHVpbnQgc2l6ZSx1bG9uZyAqcGh5c0FkZHIsaWJvb2wgY29udGlndW91cyxpYm9vbCBiZWxvdzE2TWVnKQotewotICAgIC8qIFRPRE86IEFsbG9jYXRlIGEgYmxvY2sgb2YgbG9ja2VkLCBwaHlzaWNhbCBtZW1vcnkgb2YgdGhlIHNwZWNpZmllZCAqLwotICAgIC8qICAgICAgIHNpemUuIFRoaXMgaXMgdXNlZCBmb3IgYnVzIG1hc3RlciBvcGVyYXRpb25zLiBJZiB0aGlzIGlzIG5vdCAqLwotICAgIC8qICAgICAgIHN1cHBvcnRlZCBieSB0aGUgT1MsIHJldHVybiBOVUxMIGFuZCBidXMgbWFzdGVyaW5nIHdpbGwgbm90ICovCi0gICAgLyogICAgICAgYmUgdXNlZC4gKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlTG9ja2VkTWVtKHZvaWQgKnAsdWludCBzaXplLGlib29sIGNvbnRpZ3VvdXMpCi17Ci0gICAgLyogVE9ETzogRnJlZSBhIG1lbW9yeSBibG9jayBhbGxvY2F0ZWQgd2l0aCBQTV9hbGxvY0xvY2tlZE1lbS4gKi8KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRCYW5rQShpbnQgYmFuaykKLXsKLSAgICAvKiBObyBCSU9TIGFjY2VzcyBvbiB0aGUgQmVPUyAqLwotfQotCi12b2lkIFBNQVBJIFBNX3NldEJhbmtBQihpbnQgYmFuaykKLXsKLSAgICAvKiBObyBCSU9TIGFjY2VzcyBvbiB0aGUgQmVPUyAqLwotfQotCi12b2lkIFBNQVBJIFBNX3NldENSVFN0YXJ0KGludCB4LGludCB5LGludCB3YWl0VlJUKQotewotICAgIC8qIE5vIEJJT1MgYWNjZXNzIG9uIHRoZSBCZU9TICovCi19Ci0KLWlib29sIFBNQVBJIFBNX2VuYWJsZVdyaXRlQ29tYmluZSh1bG9uZyBiYXNlLHVsb25nIGxlbmd0aCx1aW50IHR5cGUpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgZW5hYmxlIFBlbnRpdW0gUHJvIGFuZCBQZW50aXVtIElJIE1UUlIgKi8KLSAgICAvKiAgICAgICB3cml0ZSBjb21iaW5pbmcgZm9yIHRoZSBwYXNzZWQgaW4gcGh5c2ljYWwgbWVtb3J5IGJhc2UgYWRkcmVzcyAqLwotICAgIC8qICAgICAgIGFuZCBsZW5ndGguIE5vcm1hbGx5IHRoaXMgaXMgZG9uZSB2aWEgY2FsbHMgdG8gYW4gT1Mgc3BlY2lmaWMgKi8KLSAgICAvKiAgICAgICBkZXZpY2UgZHJpdmVyIGFzIHRoaXMgY2FuIG9ubHkgYmUgZG9uZSBhdCByaW5nIDAuICovCi0gICAgLyogKi8KLSAgICAvKiBOT1RFOiBUaGlzIGlzIGEgKnZlcnkqIGltcG9ydGFudCBmdW5jdGlvbiB0byBpbXBsZW1lbnQhIElmIHlvdSBkbyAqLwotICAgIC8qICAgICAgIG5vdCBpbXBsZW1lbnQsIGdyYXBoaWNzIHBlcmZvcm1hbmNlIG9uIHRoZSBsYXRlc3QgSW50ZWwgY2hpcHMgKi8KLSAgICAvKiAgICAgICB3aWxsIGJlIHNldmVybHkgaW1wYWlyZWQuIEZvciBzYW1wbGUgY29kZSB0aGF0IGNhbiBiZSB1c2VkICovCi0gICAgLyogICAgICAgZGlyZWN0bHkgaW4gYSByaW5nIDAgZGV2aWNlIGRyaXZlciwgc2VlIHRoZSBNU0RPUyBpbXBsZW1lbnRhdGlvbiAqLwotICAgIC8qICAgICAgIHdoaWNoIGluY2x1ZGVzIGFzc2VtYmxlciBjb2RlIHRvIGRvIHRoaXMgZGlyZWN0bHkgKGlmIHRoZSAqLwotICAgIC8qICAgICAgIHByb2dyYW0gaXMgcnVubmluZyBhdCByaW5nIDApLiAqLwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotaWJvb2wgUE1BUEkgUE1fZG9CSU9TUE9TVCh1c2hvcnQgYXhWYWwsdWxvbmcgQklPU1BoeXNBZGRyLHZvaWQgKm1hcHBlZEJJT1MpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJ1biB0aGUgQklPUyBQT1NUIGNvZGUgb24gYSBzZWNvbmRhcnkgKi8KLSAgICAvKiAgICAgICBjb250cm9sbGVyIHRvIGluaXRpYWxpc2UgaXQgZm9yIHVzZS4gVGhpcyBpcyBub3QgbmVjZXNzYXJ5ICovCi0gICAgLyogICAgICAgZm9yIG11bHRpLWNvbnRyb2xsZXIgb3BlcmF0aW9uLCBidXQgaXQgd2lsbCBtYWtlIGl0IGEgbG90ICovCi0gICAgLyogICAgICAgbW9yZSBjb252ZW5pY2VudCBmb3IgZW5kIHVzZXJzIChvdGhlcndpc2UgdGhleSBoYXZlIHRvIGJvb3QgKi8KLSAgICAvKiAgICAgICB0aGUgc3lzdGVtIG9uY2Ugd2l0aCB0aGUgc2Vjb25kYXJ5IGNvbnRyb2xsZXIgYXMgcHJpbWFyeSwgYW5kICovCi0gICAgLyogICAgICAgdGhlbiBib290IHdpdGggYm90aCBjb250cm9sbGVycyBpbnN0YWxsZWQpLiAqLwotICAgIC8qICovCi0gICAgLyogICAgICAgRXZlbiBpZiB5b3UgZG9uJ3Qgc3VwcG9ydCBmdWxsIEJJT1MgYWNjZXNzLCBpdCB3b3VsZCBiZSAqLwotICAgIC8qICAgICAgIGFkdmlzZWFibGUgdG8gYmUgYWJsZSB0byBQT1NUIHRoZSBzZWNvbmRhcnkgY29udHJvbGxlcnMgaW4gdGhlICovCi0gICAgLyogICAgICAgc3lzdGVtIHVzaW5nIHRoaXMgZnVuY3Rpb24gYXMgYSBtaW5pbXVtIHJlcXVpcmVtZW50LiBTb21lICovCi0gICAgLyogICAgICAgZ3JhcGhpY3MgaGFyZHdhcmUgaGFzIHJlZ2lzdGVycyB0aGF0IGNvbnRhaW4gdmFsdWVzIHRoYXQgb25seSAqLwotICAgIC8qICAgICAgIHRoZSBCSU9TIGtub3dzIGFib3V0LCB3aGljaCBtYWtlcyBicmluZyB1cCBhIGNhcmQgZnJvbSBjb2xkICovCi0gICAgLyogICAgICAgcmVzZXQgZGlmZmljdWx0IGlmIHRoZSBCSU9TIGhhcyBub3QgUE9TVCdlZCBpdC4gKi8KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZmluZCB0aGUgZmlyc3QgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBQTUFQSSBQTV9maW5kRmlyc3RGaWxlKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKLXsKLSAgICAodm9pZClmaWxlbmFtZTsKLSAgICAodm9pZClmaW5kRGF0YTsKLSAgICByZXR1cm4gUE1fRklMRV9JTlZBTElEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGZpbmQgdGhlIG5leHQgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9maW5kTmV4dEZpbGUoCi0gICAgdWxvbmcgaGFuZGxlLAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKLXsKLSAgICAodm9pZCloYW5kbGU7Ci0gICAgKHZvaWQpZmluZERhdGE7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNsb3NlIHRoZSBmaW5kIHByb2Nlc3MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZpbmRDbG9zZSgKLSAgICB1bG9uZyBoYW5kbGUpCi17Ci0gICAgKHZvaWQpaGFuZGxlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIGRyaXZlIGlzIGEgdmFsaWQgZHJpdmUgb3Igbm90LiBVbmRlciBVbml4IHRoaXMKLWZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIGZvciBhbnl0aGluZyBleGNlcHQgYSB2YWx1ZSBvZiAzIChjb25zaWRlcmVkCi10aGUgcm9vdCBkcml2ZSwgYW5kIGVxdWl2YWxlbnQgdG8gQzogZm9yIG5vbi1Vbml4IHN5c3RlbXMpLiBUaGUgZHJpdmUKLW51bWJlcmluZyBpczoKLQotICAgIDEgICAtIERyaXZlIEE6Ci0gICAgMiAgIC0gRHJpdmUgQjoKLSAgICAzICAgLSBEcml2ZSBDOgotICAgIGV0YwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZHJpdmVWYWxpZCgKLSAgICBjaGFyIGRyaXZlKQotewotICAgIGlmIChkcml2ZSA9PSAzKQotCXJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSBzcGVjaWZpZmVkIGRyaXZlLgotVW5kZXIgVW5peCB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSByZWdhcmRsZXNzCi1vZiB3aGF0IHRoZSB2YWx1ZSBvZiAnZHJpdmUnIGlzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZ2V0ZGN3ZCgKLSAgICBpbnQgZHJpdmUsCi0gICAgY2hhciAqZGlyLAotICAgIGludCBsZW4pCi17Ci0gICAgKHZvaWQpZHJpdmU7Ci0gICAgZ2V0Y3dkKGRpcixsZW4pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNoYW5nZSB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRGaWxlQXR0cigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICB1aW50IGF0dHJpYikKLXsKLSAgICAvKiBUT0RPOiBTZXQgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBmaWxlICovCi0gICAgKHZvaWQpZmlsZW5hbWU7Ci0gICAgKHZvaWQpYXR0cmliOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vYmVvcy92ZmxhdC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vYmVvcy92ZmxhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzllZjJjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Jlb3MvdmZsYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIER1bW15IG1vZHVsZTsgbm8gdmlydHVhbCBmcmFtZWJ1ZmZlciBmb3IgdGhpcyBPUwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0KLWlib29sIFBNQVBJIFZGX2F2YWlsYWJsZSh2b2lkKQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCAqIFBNQVBJIFZGX2luaXQodWxvbmcgYmFzZUFkZHIsaW50IGJhbmtTaXplLGludCBjb2RlTGVuLHZvaWQgKmJhbmtGdW5jKQotewotICAgIGJhc2VBZGRyID0gYmFzZUFkZHI7Ci0gICAgYmFua1NpemUgPSBiYW5rU2l6ZTsKLSAgICBjb2RlTGVuID0gY29kZUxlbjsKLSAgICBiYW5rRnVuYyA9IGJhbmtGdW5jOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFZGX2V4aXQodm9pZCkKLXsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Jlb3MvenRpbWVyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9iZW9zL3p0aW1lci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTI4YjczLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Jlb3MvenRpbWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgKioqIFRPRE86IEFERCBZT1VSIE9TIEVOVklST05NRU5UIE5BTUUgSEVSRSAqKioKLSoKLSogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFplbiBUaW1lciBmdW5jdGlvbnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIFplbiBUaW1lciBtb2R1bGUgaW50ZXJuYWxzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX1pUaW1lckluaXQodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBEbyBhbnkgc3BlY2lmaWMgaW50ZXJuYWwgaW5pdGlhbGlzYXRpb24gaW4gaGVyZSAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVN0YXJ0IHRoZSBaZW4gVGltZXIgY291bnRpbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX0xaVGltZXJPbigKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSAgICAvKiBUT0RPOiBTdGFydCB0aGUgWmVuIFRpbWVyIGNvdW50aW5nLiBUaGlzIHNob3VsZCBiZSBhIG1hY3JvIGlmICovCi0gICAgLyogICAgICAgcG9zc2libGUuICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29tcHV0ZSB0aGUgbGFwIHRpbWUgc2luY2UgdGhlIHRpbWVyIHdhcyBzdGFydGVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfTFpUaW1lckxhcCgKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSAgICAvKiBUT0RPOiBDb21wdXRlIHRoZSBsYXAgdGltZSBiZXR3ZWVuIHRoZSBjdXJyZW50IHRpbWUgYW5kIHdoZW4gdGhlICovCi0gICAgLyogICAgICAgdGltZXIgd2FzIHN0YXJ0ZWQuICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU3RvcCB0aGUgWmVuIFRpbWVyIGNvdW50aW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9MWlRpbWVyT2ZmKAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotICAgIC8qIFRPRE86IFN0b3AgdGhlIHRpbWVyIGNvdW50aW5nLiBTaG91bGQgYmUgYSBtYWNybyBpZiBwb3NzaWJsZS4gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Db21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgaW4gbWljcm9zZWNvbmRzIGJldHdlZW4gc3RhcnQgYW5kIGVuZCB0aW1pbmdzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfTFpUaW1lckNvdW50KAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotICAgIC8qIFRPRE86IENvbXB1dGUgdGhlIGVsYXBzZWQgdGltZSBhbmQgcmV0dXJuIGl0LiBBbHdheXMgbWljcm9zZWNvbmRzLiAqLwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURlZmluZSB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgbG9uZyBwZXJpb2QgdGltZXIgYXMgbWljcm9zZWNvbmRzIHBlciB0aW1lciB0aWNrLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgVUxaVElNRVJfUkVTT0xVVElPTiAxCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCB0aGUgTG9uZyBQZXJpb2QgdGltZXIgZnJvbSB0aGUgT1MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX1VMWlJlYWRUaW1lKHZvaWQpCi17Ci0gICAgLyogVE9ETzogUmVhZCB0aGUgbG9uZyBwZXJpb2QgdGltZXIgZnJvbSB0aGUgT1MuIFRoZSByZXNvbHV0aW9uIG9mIHRoaXMgKi8KLSAgICAvKiAgICAgICB0aW1lciBzaG91bGQgYmUgYXJvdW5kIDEvMjAgb2YgYSBzZWNvbmQgZm9yIHRpbWluZyBsb25nICovCi0gICAgLyogICAgICAgcGVyaW9kcyBpZiBwb3NzaWJsZS4gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Db21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgZnJvbSB0aGUgQklPUyB0aW1lciB0aWNrLiBOb3RlIHRoYXQgd2UgY2hlY2sgdG8gc2VlCi13aGV0aGVyIGEgbWlkbmlnaHQgYm91bmRhcnkgaGFzIHBhc3NlZCwgYW5kIGlmIHNvIGFkanVzdCB0aGUgZmluaXNoIHRpbWUgdG8KLWFjY291bnQgZm9yIHRoaXMuIFdlIGNhbm5vdCBkZXRlY3QgaWYgbW9yZSB0aGF0IG9uZSBtaWRuaWdodCBib3VuZGFyeSBoYXMKLXBhc3NlZCwgc28gaWYgdGhpcyBoYXBwZW5zIHdlIHdpbGwgYmUgZ2VuZXJhdGluZyBlcnJvbm91cyByZXN1bHRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9VTFpFbGFwc2VkVGltZSh1bG9uZyBzdGFydCx1bG9uZyBmaW5pc2gpCi17IHJldHVybiBmaW5pc2ggLSBzdGFydDsgfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29kZXBhZ2UvdXNfZW5nLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb2RlcGFnZS91c19lbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhODcxNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb2RlcGFnZS91c19lbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBLZXlib2FyZCB0cmFuc2xhdGlvbiBjb2RlIHBhZ2VzIGZvciBVUyBFbmdsaXNoIGtleWJvYXJkcy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJldmVudC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBUaGlzIHRhYmxlIGlzIHVzZWQgZm9yIGFsbCBub3JtYWwga2V5IHRyYW5zbGF0aW9ucywgYW5kIGlzIHRoZSBmYWxsYmFjawotICogdGFibGUgaWYgdGhlIGtleSBpcyBub3QgZm91bmQgaW4gYW55IG9mIHRoZSBvdGhlciB0cmFuc2xhdGlvbiB0YWJsZXMuCi0gKiBJZiB0aGUgY29kZSBpcyBub3QgZm91bmQgaW4gdGhpcyB0YWJsZSwgdGhlIEFTQ0lJIGNvZGUgaXMgc2V0IHRvIDAgdG8KLSAqIGluZGljYXRlIHRoYXQgdGhlcmUgaXMgbm8gQVNDSUkgY29kZSBlcXVpdmFsZW50IGZvciB0aGlzIGtleS4KLSAqLwotc3RhdGljIGNvZGVwYWdlX2VudHJ5X3QgVVNfbm9ybWFsW10gPSB7Ci0gICAgezB4MDEsICAweDFCfSwKLSAgICB7MHgwMiwgICcxJ30sCi0gICAgezB4MDMsICAnMid9LAotICAgIHsweDA0LCAgJzMnfSwKLSAgICB7MHgwNSwgICc0J30sCi0gICAgezB4MDYsICAnNSd9LAotICAgIHsweDA3LCAgJzYnfSwKLSAgICB7MHgwOCwgICc3J30sCi0gICAgezB4MDksICAnOCd9LAotICAgIHsweDBBLCAgJzknfSwKLSAgICB7MHgwQiwgICcwJ30sCi0gICAgezB4MEMsICAnLSd9LAotICAgIHsweDBELCAgJz0nfSwKLSAgICB7MHgwRSwgIDB4MDh9LAotICAgIHsweDBGLCAgMHgwOX0sCi0gICAgezB4MTAsICAncSd9LAotICAgIHsweDExLCAgJ3cnfSwKLSAgICB7MHgxMiwgICdlJ30sCi0gICAgezB4MTMsICAncid9LAotICAgIHsweDE0LCAgJ3QnfSwKLSAgICB7MHgxNSwgICd5J30sCi0gICAgezB4MTYsICAndSd9LAotICAgIHsweDE3LCAgJ2knfSwKLSAgICB7MHgxOCwgICdvJ30sCi0gICAgezB4MTksICAncCd9LAotICAgIHsweDFBLCAgJ1snfSwKLSAgICB7MHgxQiwgICddJ30sCi0gICAgezB4MUMsICAweDBEfSwKLSAgICB7MHgxRSwgICdhJ30sCi0gICAgezB4MUYsICAncyd9LAotICAgIHsweDIwLCAgJ2QnfSwKLSAgICB7MHgyMSwgICdmJ30sCi0gICAgezB4MjIsICAnZyd9LAotICAgIHsweDIzLCAgJ2gnfSwKLSAgICB7MHgyNCwgICdqJ30sCi0gICAgezB4MjUsICAnayd9LAotICAgIHsweDI2LCAgJ2wnfSwKLSAgICB7MHgyNywgICc7J30sCi0gICAgezB4MjgsICAnXCcnfSwKLSAgICB7MHgyOSwgICdgJ30sCi0gICAgezB4MkIsICAnXFwnfSwKLSAgICB7MHgyQywgICd6J30sCi0gICAgezB4MkQsICAneCd9LAotICAgIHsweDJFLCAgJ2MnfSwKLSAgICB7MHgyRiwgICd2J30sCi0gICAgezB4MzAsICAnYid9LAotICAgIHsweDMxLCAgJ24nfSwKLSAgICB7MHgzMiwgICdtJ30sCi0gICAgezB4MzMsICAnLCd9LAotICAgIHsweDM0LCAgJy4nfSwKLSAgICB7MHgzNSwgICcvJ30sCi0gICAgezB4MzcsICAnKid9LCAgICAgICAgICAgLyogS2V5cGFkICovCi0gICAgezB4MzksICAnICd9LAotICAgIHsweDRBLCAgJy0nfSwgICAgICAgICAgIC8qIEtleXBhZCAqLwotICAgIHsweDRFLCAgJysnfSwgICAgICAgICAgIC8qIEtleXBhZCAqLwotICAgIHsweDYwLCAgMHgwRH0sICAgICAgICAgIC8qIEtleXBhZCAqLwotICAgIHsweDYxLCAgJy8nfSwgICAgICAgICAgIC8qIEtleXBhZCAqLwotICAgIH07Ci0KLS8qIFRoaXMgdGFibGUgaXMgdXNlZCBmb3Igd2hlbiBDQVBTTE9DSyBpcyBhY3RpdmUgYW5kIHRoZSBzaGlmdCBvciBjdHJsCi0gKiBrZXlzIGFyZSBub3QgZG93bi4gSWYgdGhlIGNvZGUgaXMgbm90IGZvdW5kIGluIHRoaXMgdGFibGUsIHRoZSBub3JtYWwKLSAqIHRhYmxlIGFib3ZlIGlzIHRoZW4gc2VhcmNoZWQuCi0gKi8KLXN0YXRpYyBjb2RlcGFnZV9lbnRyeV90IFVTX2NhcHNbXSA9IHsKLSAgICB7MHgxMCwgICdRJ30sCi0gICAgezB4MTEsICAnVyd9LAotICAgIHsweDEyLCAgJ0UnfSwKLSAgICB7MHgxMywgICdSJ30sCi0gICAgezB4MTQsICAnVCd9LAotICAgIHsweDE1LCAgJ1knfSwKLSAgICB7MHgxNiwgICdVJ30sCi0gICAgezB4MTcsICAnSSd9LAotICAgIHsweDE4LCAgJ08nfSwKLSAgICB7MHgxOSwgICdQJ30sCi0gICAgezB4MUUsICAnQSd9LAotICAgIHsweDFGLCAgJ1MnfSwKLSAgICB7MHgyMCwgICdEJ30sCi0gICAgezB4MjEsICAnRid9LAotICAgIHsweDIyLCAgJ0cnfSwKLSAgICB7MHgyMywgICdIJ30sCi0gICAgezB4MjQsICAnSid9LAotICAgIHsweDI1LCAgJ0snfSwKLSAgICB7MHgyNiwgICdMJ30sCi0gICAgezB4MkMsICAnWid9LAotICAgIHsweDJELCAgJ1gnfSwKLSAgICB7MHgyRSwgICdDJ30sCi0gICAgezB4MkYsICAnVid9LAotICAgIHsweDMwLCAgJ0InfSwKLSAgICB7MHgzMSwgICdOJ30sCi0gICAgezB4MzIsICAnTSd9LAotICAgIH07Ci0KLS8qIFRoaXMgdGFibGUgaXMgdXNlZCBmb3Igd2hlbiBzaGlmdCBrZXkgaXMgZG93biwgYnV0IHRoZSBjdHJsIGtleSBpcyBub3QKLSAqIGRvd24gYW5kIENBUFNMT0NLIGlzIG5vdCBhY3RpdmUuIElmIHRoZSBjb2RlIGlzIG5vdCBmb3VuZCBpbiB0aGlzIHRhYmxlLAotICogdGhlIG5vcm1hbCB0YWJsZSBhYm92ZSBpcyB0aGVuIHNlYXJjaGVkLgotICovCi1zdGF0aWMgY29kZXBhZ2VfZW50cnlfdCBVU19zaGlmdFtdID0gewotICAgIHsweDAyLCAgJyEnfSwKLSAgICB7MHgwMywgICdAJ30sCi0gICAgezB4MDQsICAnIyd9LAotICAgIHsweDA1LCAgJyQnfSwKLSAgICB7MHgwNiwgICclJ30sCi0gICAgezB4MDcsICAnXid9LAotICAgIHsweDA4LCAgJyYnfSwKLSAgICB7MHgwOSwgICcqJ30sCi0gICAgezB4MEEsICAnKCd9LAotICAgIHsweDBCLCAgJyknfSwKLSAgICB7MHgwQywgICdfJ30sCi0gICAgezB4MEQsICAnKyd9LAotICAgIHsweDEwLCAgJ1EnfSwKLSAgICB7MHgxMSwgICdXJ30sCi0gICAgezB4MTIsICAnRSd9LAotICAgIHsweDEzLCAgJ1InfSwKLSAgICB7MHgxNCwgICdUJ30sCi0gICAgezB4MTUsICAnWSd9LAotICAgIHsweDE2LCAgJ1UnfSwKLSAgICB7MHgxNywgICdJJ30sCi0gICAgezB4MTgsICAnTyd9LAotICAgIHsweDE5LCAgJ1AnfSwKLSAgICB7MHgxQSwgICd7J30sCi0gICAgezB4MUIsICAnfSd9LAotICAgIHsweDFFLCAgJ0EnfSwKLSAgICB7MHgxRiwgICdTJ30sCi0gICAgezB4MjAsICAnRCd9LAotICAgIHsweDIxLCAgJ0YnfSwKLSAgICB7MHgyMiwgICdHJ30sCi0gICAgezB4MjMsICAnSCd9LAotICAgIHsweDI0LCAgJ0onfSwKLSAgICB7MHgyNSwgICdLJ30sCi0gICAgezB4MjYsICAnTCd9LAotICAgIHsweDI3LCAgJzonfSwKLSAgICB7MHgyOCwgICciJ30sCi0gICAgezB4MjksICAnfid9LAotICAgIHsweDJCLCAgJ3wnfSwKLSAgICB7MHgyQywgICdaJ30sCi0gICAgezB4MkQsICAnWCd9LAotICAgIHsweDJFLCAgJ0MnfSwKLSAgICB7MHgyRiwgICdWJ30sCi0gICAgezB4MzAsICAnQid9LAotICAgIHsweDMxLCAgJ04nfSwKLSAgICB7MHgzMiwgICdNJ30sCi0gICAgezB4MzMsICAnPCd9LAotICAgIHsweDM0LCAgJz4nfSwKLSAgICB7MHgzNSwgICc/J30sCi0gICAgfTsKLQotLyogVGhpcyB0YWJsZSBpcyB1c2VkIGZvciB3aGVuIENBUFNMT0NLIGlzIGFjdGl2ZSBhbmQgdGhlIHNoaWZ0IGtleSBpcwotICogZG93biwgYnV0IHRoZSBjdHJsIGtleSBpcyBub3QuIElmIHRoZSBjb2RlIGlzIG5vdCBmb3VuZCBpbiB0aGlzIHRhYmxlLAotICogdGhlIHNoaWZ0IHRhYmxlIGFib3ZlIGlzIHRoZW4gc2VhcmNoZWQuCi0gKi8KLXN0YXRpYyBjb2RlcGFnZV9lbnRyeV90IFVTX3NoaWZ0Q2Fwc1tdID0gewotICAgIHsweDEwLCAgJ3EnfSwKLSAgICB7MHgxMSwgICd3J30sCi0gICAgezB4MTIsICAnZSd9LAotICAgIHsweDEzLCAgJ3InfSwKLSAgICB7MHgxNCwgICd0J30sCi0gICAgezB4MTUsICAneSd9LAotICAgIHsweDE2LCAgJ3UnfSwKLSAgICB7MHgxNywgICdpJ30sCi0gICAgezB4MTgsICAnbyd9LAotICAgIHsweDE5LCAgJ3AnfSwKLSAgICB7MHgxRSwgICdhJ30sCi0gICAgezB4MUYsICAncyd9LAotICAgIHsweDIwLCAgJ2QnfSwKLSAgICB7MHgyMSwgICdmJ30sCi0gICAgezB4MjIsICAnZyd9LAotICAgIHsweDIzLCAgJ2gnfSwKLSAgICB7MHgyNCwgICdqJ30sCi0gICAgezB4MjUsICAnayd9LAotICAgIHsweDI2LCAgJ2wnfSwKLSAgICB7MHgyQywgICd6J30sCi0gICAgezB4MkQsICAneCd9LAotICAgIHsweDJFLCAgJ2MnfSwKLSAgICB7MHgyRiwgICd2J30sCi0gICAgezB4MzAsICAnYid9LAotICAgIHsweDMxLCAgJ24nfSwKLSAgICB7MHgzMiwgICdtJ30sCi0gICAgfTsKLQotLyogVGhpcyB0YWJsZSBpcyB1c2VkIGZvciBhbGwga2V5IHRyYW5zbGF0aW9ucyB3aGVuIHRoZSBjdHJsIGtleSBpcyBkb3duLAotICogcmVnYXJkbGVzcyBvZiB0aGUgc3RhdGUgb2YgdGhlIHNoaWZ0IGtleSBhbmQgQ0FQU0xPQ0suIElmIHRoZSBjb2RlIGlzCi0gKiBub3QgZm91bmQgaW4gdGhpcyB0YWJsZSwgdGhlIEFTQ0lJIGNvZGUgaXMgc2V0IHRvIDAgdG8gaW5kaWNhdGUgdGhhdAotICogdGhlcmUgaXMgbm8gQVNDSUkgY29kZSBlcXVpdmFsZW50IGZvciB0aGlzIGtleS4KLSAqLwotc3RhdGljIGNvZGVwYWdlX2VudHJ5X3QgVVNfY3RybFtdID0gewotICAgIHsweDAxLCAgMHgxQn0sCi0gICAgezB4MDYsICAweDFFfSwKLSAgICB7MHgwQywgIDB4MUZ9LAotICAgIHsweDBFLCAgMHg3Rn0sCi0gICAgezB4MTAsICAweDExfSwKLSAgICB7MHgxMSwgIDB4MTd9LAotICAgIHsweDEyLCAgMHgwNX0sCi0gICAgezB4MTMsICAweDEyfSwKLSAgICB7MHgxNCwgIDB4MTR9LAotICAgIHsweDE1LCAgMHgxOX0sCi0gICAgezB4MTYsICAweDE2fSwKLSAgICB7MHgxNywgIDB4MDl9LAotICAgIHsweDE4LCAgMHgwRn0sCi0gICAgezB4MTksICAweDEwfSwKLSAgICB7MHgxQSwgIDB4MUJ9LAotICAgIHsweDFCLCAgMHgxRH0sCi0gICAgezB4MUMsICAweDBBfSwKLSAgICB7MHgxRSwgIDB4MDF9LAotICAgIHsweDFGLCAgMHgxM30sCi0gICAgezB4MjAsICAweDA0fSwKLSAgICB7MHgyMSwgIDB4MDZ9LAotICAgIHsweDIyLCAgMHgwN30sCi0gICAgezB4MjMsICAweDA4fSwKLSAgICB7MHgyNCwgIDB4MEF9LAotICAgIHsweDI1LCAgMHgwQn0sCi0gICAgezB4MjYsICAweDBDfSwKLSAgICB7MHgyQiwgIDB4MUN9LAotICAgIHsweDJDLCAgMHgxQX0sCi0gICAgezB4MkQsICAweDE4fSwKLSAgICB7MHgyRSwgIDB4MDN9LAotICAgIHsweDJGLCAgMHgxNn0sCi0gICAgezB4MzAsICAweDAyfSwKLSAgICB7MHgzMSwgIDB4MEV9LAotICAgIHsweDMyLCAgMHgwRH0sCi0gICAgezB4MzksICAnICd9LAotICAgIH07Ci0KLXN0YXRpYyBjb2RlcGFnZV9lbnRyeV90IFVTX251bVBhZFtdID0gewotICAgIHsweDRDLCAgJzUnfSwKLSAgICB7MHg2MiwgICc0J30sCi0gICAgezB4NjMsICAnNid9LAotICAgIHsweDY0LCAgJzgnfSwKLSAgICB7MHg2NSwgICcyJ30sCi0gICAgezB4NjYsICAnMCd9LAotICAgIHsweDY3LCAgJy4nfSwKLSAgICB7MHg2OCwgICc3J30sCi0gICAgezB4NjksICAnMSd9LAotICAgIHsweDZBLCAgJzknfSwKLSAgICB7MHg2QiwgICczJ30sCi0gICAgfTsKLQotY29kZXBhZ2VfdCBfQ1BfVVNfRW5nbGlzaCA9IHsKLSAgICAiVVMgRW5nbGlzaCIsCi0gICAgVVNfbm9ybWFsLCAgICAgIEVWVF9BUlJfU0laRShVU19ub3JtYWwpLAotICAgIFVTX2NhcHMsICAgICAgICBFVlRfQVJSX1NJWkUoVVNfY2FwcyksCi0gICAgVVNfc2hpZnQsICAgICAgIEVWVF9BUlJfU0laRShVU19zaGlmdCksCi0gICAgVVNfc2hpZnRDYXBzLCAgIEVWVF9BUlJfU0laRShVU19zaGlmdENhcHMpLAotICAgIFVTX2N0cmwsICAgICAgICBFVlRfQVJSX1NJWkUoVVNfY3RybCksCi0gICAgVVNfbnVtUGFkLCAgICAgIEVWVF9BUlJfU0laRShVU19udW1QYWQpLAotICAgIH07CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWE4ZThmLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIE1vZHVsZSBjb250YWluaW5nIGNvZGUgY29tbW9uIHRvIGFsbCBwbGF0Zm9ybXMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJkcnZsaWIvb3Mvb3MuaCIKLSNpZiBkZWZpbmVkKF9fV0lOMzJfVlhEX18pIHx8IGRlZmluZWQoX19PUzJfVkREX18pIHx8IGRlZmluZWQoX19OVF9EUklWRVJfXykKLSNpbmNsdWRlICJzZGQvc2RkaGVscC5oIgotI2Vsc2UKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIHtzZWNyZXR9ICovCi1sb25nIF9WQVJBUEkgICAgX19fZHJ2X29zX3R5cGUgPSBfT1NfVU5TVVBQT1JURUQ7Ci1zdGF0aWMgY2hhciAgICAgbG9jYWxCUERQYXRoW1BNX01BWF9QQVRIXSA9ICIiOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXBhdGggICAgLSBMb2NhbCBwYXRoIHRvIHRoZSBOdWNsZXVzIEJQRCBkcml2ZXIgZmlsZXMuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHByb2dyYW0gdG8gb3ZlcnJpZGUgdGhlIGxvY2F0aW9uCi1vZiB0aGUgTnVjbGV1cyBkcml2ZXIgZmlsZXMgdGhhdCBhcmUgbG9hZGVkLiBOb3JtYWxseSB0aGUgbG9hZGVyIGNvZGUKLXdpbGwgbG9vayBpbiB0aGUgc3lzdGVtIE51Y2xldXMgZGlyZWN0b3JpZXMgZmlyc3QsIHRoZW4gaW4gdGhlICdkcml2ZXJzJwotZGlyZWN0b3J5IHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBhbmQgZmluYWxseSByZWxhdGl2ZQotdG8gdGhlIE1HTF9ST09UIGVudmlyb25tZW50IHZhcmlhYmxlLiBCeSBkZWZhdWx0IHRoZSBsb2NhbCBCUEQgcGF0aCBpcwotYWx3YXlzIHNldCB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkgaWYgbm90IGluaXRpYWxpc2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0TG9jYWxCUERQYXRoKAotICAgIGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gICAgUE1faW5pdCgpOwotICAgIHN0cm5jcHkobG9jYWxCUERQYXRoLHBhdGgsc2l6ZW9mKGxvY2FsQlBEUGF0aCkpOwotICAgIGxvY2FsQlBEUGF0aFtzaXplb2YobG9jYWxCUERQYXRoKS0xXSA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYnBkcGF0aCAgICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgYWN0dWFsIHBhdGggdG8gdGhlIGZpbGUKLWNhY2hlZHBhdGggIC0gUGxhY2UgdG8gc3RvcmUgdGhlIGNhY2hlZCBCUEQgZHJpdmVyIHBhdGgKLXRyeXBhdGggICAgIC0gUGF0aCB0byB0cnkgdG8gZmluZCB0aGUgQlBEIGZpbGUgaW4KLXN1YnBhdGggICAgIC0gT3B0aW9uYWwgc3ViIHBhdGggdG8gYXBwZW5kIHRvIHRyeXBhdGgKLWRsbG5hbWUgICAgIC0gTmFtZSBvZiB0aGUgQmluYXJ5IFBvcnRhYmxlIERMTCB0byBsb2FkCi0KLVJFVFVSTlM6Ci1UcnVlIGlmIGZvdW5kLCBmYWxzZSBpZiBub3QuCi0KLVJFTUFSS1M6Ci1UcnlzIHRoZSBzcGVjaWZpZWQgcGF0aCB0byBzZWUgaWYgdGhlIEJQRCBmaWxlIGNhbiBiZSBmb3VuZCBvciBub3QuIElmIHNvLAotdGhlIHBhdGggdXNlZCBpcyByZXR1cm5lZCBpbiBicGRwYXRoIGFuZCBjYWNoZWRwYXRoLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpYm9vbCBUcnlQYXRoKAotICAgIGNoYXIgKmJwZHBhdGgsCi0gICAgY2hhciAqY2FjaGVkcGF0aCwKLSAgICBjb25zdCBjaGFyICp0cnlwYXRoLAotICAgIGNvbnN0IGNoYXIgKnN1YnBhdGgsCi0gICAgY29uc3QgY2hhciAqZGxsbmFtZSkKLXsKLSAgICBjaGFyICAgIGZpbGVuYW1lWzI1Nl07Ci0gICAgRklMRSAgICAqZjsKLQotICAgIHN0cmNweShicGRwYXRoLCB0cnlwYXRoKTsKLSAgICBQTV9iYWNrc2xhc2goYnBkcGF0aCk7Ci0gICAgc3RyY2F0KGJwZHBhdGgsc3VicGF0aCk7Ci0gICAgUE1fYmFja3NsYXNoKGJwZHBhdGgpOwotICAgIHN0cmNweShmaWxlbmFtZSxicGRwYXRoKTsKLSAgICBzdHJjYXQoZmlsZW5hbWUsZGxsbmFtZSk7Ci0gICAgaWYgKChmID0gZm9wZW4oZmlsZW5hbWUsInJiIikpID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIGlmIChjYWNoZWRwYXRoKQotCXN0cmNweShjYWNoZWRwYXRoLGJwZHBhdGgpOwotICAgIGZjbG9zZShmKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1UcnVlIGlmIGxvY2FsIG92ZXJyaWRlIGVuYWJsZWQsIGZhbHNlIGlmIG5vdC4KLQotUkVNQVJLUzoKLVRlc3RzIHRvIHNlZSBpZiB0aGUgbG9jYWwgb3ZlcnJpZGUgb3B0aW9uIGlzIGVuYWJsZWQsIGFuZCBpZiBzbyBpdCB3aWxsCi1sb29rIGZvciB0aGUgTnVjbGV1cyBkcml2ZXJzIGluIHRoZSBsb2NhbCBhcHBsaWNhdGlvbiBkaXJlY3RvcmllcyBpbgotcHJlZmVyZW5jZSB0byB0aGUgTnVjbGV1cyBzeXN0ZW0gZGlyZWN0b3JpZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGlib29sIEdldExvY2FsT3ZlcnJpZGUodm9pZCkKLXsKLSAgICBjaGFyICAgICAgICAgICAgZmlsZW5hbWVbMjU2XTsKLSAgICBGSUxFICAgICAgICAgICAgKmY7Ci0gICAgc3RhdGljIGlib29sICAgIGxvY2FsX292ZXJyaWRlID0gLTE7Ci0KLSAgICBpZiAobG9jYWxfb3ZlcnJpZGUgPT0gLTEpIHsKLQlsb2NhbF9vdmVycmlkZSA9IGZhbHNlOwotCXN0cmNweShmaWxlbmFtZSxQTV9nZXROdWNsZXVzUGF0aCgpKTsKLQlQTV9iYWNrc2xhc2goZmlsZW5hbWUpOwotCXN0cmNhdChmaWxlbmFtZSwiZ3JhcGhpY3MuaW5pIik7Ci0JaWYgKChmID0gZm9wZW4oZmlsZW5hbWUsInIiKSkgIT0gTlVMTCkgewotCSAgICB3aGlsZSAoIWZlb2YoZikgJiYgZmdldHMoZmlsZW5hbWUsc2l6ZW9mKGZpbGVuYW1lKSxmKSkgewotCQlpZiAoc3RybmljbXAoZmlsZW5hbWUsInVzZWxvY2FsIiw4KSA9PSAwKSB7Ci0JCSAgICBsb2NhbF9vdmVycmlkZSA9ICgoKihmaWxlbmFtZSs5KSAtICcwJykgPT0gMSk7Ci0JCSAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICBmY2xvc2UoZik7Ci0JICAgIH0KLQl9Ci0gICAgcmV0dXJuIGxvY2FsX292ZXJyaWRlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1TZXRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZGVidWcgbG9nIGZpbGUuCi0KLUhFQURFUjoKLXBtYXBpLmgKLQotUEFSQU1FVEVSUzoKLWRsbG5hbWUgLSBOYW1lIG9mIHRoZSBCaW5hcnkgUG9ydGFibGUgRExMIHRvIGxvYWQKLWJwZHBhdGggLSBQbGFjZSB0byBzdG9yZSB0aGUgYWN0dWFsIHBhdGggdG8gdGhlIGZpbGUKLQotUkVUVVJOUzoKLVRydWUgaWYgZm91bmQsIGZhbHNlIGlmIG5vdC4KLQotUkVNQVJLUzoKLUZpbmRzIHRoZSBsb2NhdGlvbiBvZiBhIHNwZWNpZmljIEJpbmFyeSBQb3J0YWJsZSBETEwsIGJ5IHNlYXJjaGluZyBhbGwKLXRoZSBzdGFuZGFyZCBTY2lUZWNoIE51Y2xldXMgZHJpdmVyIGxvY2F0aW9ucy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9maW5kQlBEKAotICAgIGNvbnN0IGNoYXIgKmRsbG5hbWUsCi0gICAgY2hhciAqYnBkcGF0aCkKLXsKLSAgICBzdGF0aWMgY2hhciBjYWNoZWRwYXRoW1BNX01BWF9QQVRIXSA9ICIiOwotCi0gICAgLyogT24gdGhlIGZpcnN0IGNhbGwgZGV0ZXJtaW5lIHRoZSBwYXRoIHRvIHRoZSBOdWNsZXVzIGRyaXZlcnMgKi8KLSAgICBpZiAoY2FjaGVkcGF0aFswXSA9PSAwKSB7Ci0JLyogRmlyc3QgdHJ5IGluIHRoZSBnbG9iYWwgc3lzdGVtIE51Y2xldXMgZHJpdmVyIHBhdGggaWYKLQkgKiB0aGUgbG9jYWwgb3ZlcnJpZGUgc2V0dGluZyBpcyBub3QgZW5hYmxlZC4KLQkgKi8KLQlQTV9pbml0KCk7Ci0JaWYgKCFHZXRMb2NhbE92ZXJyaWRlKCkpIHsKLQkgICAgaWYgKFRyeVBhdGgoYnBkcGF0aCxjYWNoZWRwYXRoLFBNX2dldE51Y2xldXNQYXRoKCksIiIsZGxsbmFtZSkpCi0JCXJldHVybiB0cnVlOwotCSAgICB9Ci0KLQkvKiBOZXh0IHRyeSBpbiB0aGUgbG9jYWwgYXBwbGljYXRpb24gZGlyZWN0b3J5IGlmIGF2YWlsYWJsZSAqLwotCWlmIChsb2NhbEJQRFBhdGhbMF0gIT0gMCkgewotCSAgICBpZiAoVHJ5UGF0aChicGRwYXRoLGNhY2hlZHBhdGgsbG9jYWxCUERQYXRoLCIiLGRsbG5hbWUpKQotCQlyZXR1cm4gdHJ1ZTsKLQkgICAgfQotCWVsc2UgewotI2lmICFkZWZpbmVkKF9fV0lOMzJfVlhEX18pICYmICFkZWZpbmVkKF9fTlRfRFJJVkVSX18pCi0JICAgIGNoYXIgICAgKm1nbF9yb290OwotCSAgICBpZiAoKG1nbF9yb290ID0gZ2V0ZW52KCJNR0xfUk9PVCIpKSAhPSBOVUxMKSB7Ci0JCWlmIChUcnlQYXRoKGJwZHBhdGgsY2FjaGVkcGF0aCxtZ2xfcm9vdCwiZHJpdmVycyIsZGxsbmFtZSkpCi0JCSAgICByZXR1cm4gdHJ1ZTsKLQkJfQotI2VuZGlmCi0JICAgIFBNX2dldEN1cnJlbnRQYXRoKGJwZHBhdGgsUE1fTUFYX1BBVEgpOwotCSAgICBpZiAoVHJ5UGF0aChicGRwYXRoLGNhY2hlZHBhdGgsYnBkcGF0aCwiZHJpdmVycyIsZGxsbmFtZSkpCi0JCXJldHVybiB0cnVlOwotCSAgICB9Ci0KLQkvKiBGaW5hbGx5IHRyeSBpbiB0aGUgZ2xvYmFsIHN5c3RlbSBwYXRoIGFnYWluIHNvIHRoYXQgd2UKLQkgKiB3aWxsIHN0aWxsIGZpbmQgdGhlIGRyaXZlcnMgaW4gdGhlIGdsb2JhbCBzeXN0ZW0gcGF0aCBpZgotCSAqIHRoZSBsb2NhbCBvdmVycmlkZSBvcHRpb24gaXMgb24sIGJ1dCB0aGUgYXBwbGljYXRpb24gZG9lcwotCSAqIG5vdCBoYXZlIGFueSBsb2NhbCBvdmVycmlkZSBkcml2ZXJzLgotCSAqLwotCWlmIChUcnlQYXRoKGJwZHBhdGgsY2FjaGVkcGF0aCxQTV9nZXROdWNsZXVzUGF0aCgpLCIiLGRsbG5hbWUpKQotCSAgICByZXR1cm4gdHJ1ZTsKLQotCS8qIFdob29wcywgd2UgY2FuJ3QgZmluZCB0aGUgQlBEIGZpbGUhICovCi0JcmV0dXJuIGZhbHNlOwotCX0KLQotICAgIC8qIEFsd2F5cyB0cnkgaW4gdGhlIHByZXZpb3VzbHkgZGlzY292ZXJlZCBwYXRoICovCi0gICAgcmV0dXJuIFRyeVBhdGgoYnBkcGF0aCxOVUxMLGNhY2hlZHBhdGgsIiIsZGxsbmFtZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29waWVzIGEgc3RyaW5nIGludG8gYW5vdGhlciwgYW5kIHJldHVybnMgZGVzdCArIHN0cmxlbihzcmMpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBjaGFyICpfc3RwY3B5KAotICAgIGNoYXIgKl9kZXN0LAotICAgIGNvbnN0IGNoYXIgKl9zcmMpCi17Ci0gICAgaWYgKCFfZGVzdCB8fCAhX3NyYykKLQlyZXR1cm4gMDsKLSAgICB3aGlsZSAoKCpfZGVzdCsrID0gKl9zcmMrKykgIT0gMCkKLQk7Ci0gICAgcmV0dXJuIC0tX2Rlc3Q7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29waWVzIGEgc3RyaW5nIGludG8gYW5vdGhlciwgc3RvcHBpbmcgYXQgdGhlIG1heGltdW0gbGVuZ3RoLiBUaGUgc3RyaW5nCi1pcyBwcm9wZXJseSB0ZXJtaW5hdGVkICh1bmxpa2Ugc3RybmNweSkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgc2FmZV9zdHJuY3B5KAotICAgIGNoYXIgKmRzdCwKLSAgICBjb25zdCBjaGFyICpzcmMsCi0gICAgdW5zaWduZWQgbWF4bGVuKQotewotICAgIGlmIChkc3QpIHsKLQlpZihzdHJsZW4oc3JjKSA+PSBtYXhsZW4pIHsKLQkgICAgc3RybmNweShkc3QsIHNyYywgbWF4bGVuKTsKLQkgICAgZHN0W21heGxlbl0gPSAwOwotCSAgICB9Ci0JZWxzZQotCSAgICBzdHJjcHkoZHN0LCBzcmMpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EZXRlcm1pbnMgaWYgdGhlIGRvdCBzZXBhcmF0b3IgaXMgcHJlc2VudCBpbiB0aGUgc3RyaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgZmluZERvdCgKLSAgICBjaGFyICpwKQotewotICAgIGlmICgqKHAtMSkgPT0gJy4nKQotCXAtLTsKLSAgICBzd2l0Y2ggKCotLXApIHsKLQljYXNlICc6JzoKLQkgICAgaWYgKCoocC0yKSAhPSAnXDAnKQotCQlicmVhazsKLQljYXNlICcvJzoKLQljYXNlICdcXCc6Ci0JY2FzZSAnXDAnOgotCSAgICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1NYWtlIGEgZnVsbCBwYXRobmFtZSBmcm9tIHNwbGl0IGNvbXBvbmVudHMuCi0KLUhFQURFUjoKLXBtYXBpLmgKLQotUEFSQU1FVEVSUzoKLXBhdGggICAgLSBQbGFjZSB0byBzdG9yZSBmdWxsIHBhdGgKLWRyaXZlICAgLSBEcml2ZSBjb21wb25lbnQgZm9yIHBhdGgKLWRpciAgICAgLSBEaXJlY3RvcnkgY29tcG9uZW50IGZvciBwYXRoCi1uYW1lICAgIC0gRmlsZW5hbWUgY29tcG9uZW50IGZvciBwYXRoCi1leHQgICAgIC0gRXh0ZW5zaW9uIGNvbXBvbmVudCBmb3IgcGF0aAotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gbWFrZSBhIGZ1bGwgcGF0aG5hbWUgZnJvbSBzcGxpdCBjb21wb25lbnRzLiBVbmRlciBVbml4IHRoZQotZHJpdmUgY29tcG9uZW50IHdpbGwgdXN1YWxseSBiZSBlbXB0eS4gSWYgdGhlIGRyaXZlLCBkaXIsIG5hbWUsIG9yIGV4dAotcGFyYW1ldGVycyBhcmUgbnVsbCBvciBlbXB0eSwgdGhleSBhcmUgbm90IGluc2VydGVkIGluIHRoZSBwYXRoIHN0cmluZy4KLU90aGVyd2lzZSwgaWYgdGhlIGRyaXZlIGRvZXNuJ3QgZW5kIHdpdGggYSBjb2xvbiwgb25lIGlzIGluc2VydGVkIGluIHRoZQotcGF0aC4gSWYgdGhlIGRpciBkb2Vzbid0IGVuZCBpbiBhIHNsYXNoLCBvbmUgaXMgaW5zZXJ0ZWQgaW4gdGhlIHBhdGguCi1JZiB0aGUgZXh0IGRvZXNuJ3Qgc3RhcnQgd2l0aCBhIGRvdCwgb25lIGlzIGluc2VydGVkIGluIHRoZSBwYXRoLgotCi1UaGUgbWF4aW11bSBzaXplcyBmb3IgdGhlIHBhdGggc3RyaW5nIGlzIGdpdmVuIGJ5IHRoZSBjb25zdGFudCBQTV9NQVhfUEFUSCwKLXdoaWNoIGluY2x1ZGVzIHNwYWNlIGZvciB0aGUgbnVsbC10ZXJtaW5hdG9yLgotCi1TRUUgQUxTTzoKLVBNX3NwbGl0UGF0aAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fbWFrZXBhdGgoCi0gICAgY2hhciAqcGF0aCwKLSAgICBjb25zdCBjaGFyICpkcml2ZSwKLSAgICBjb25zdCBjaGFyICpkaXIsCi0gICAgY29uc3QgY2hhciAqbmFtZSwKLSAgICBjb25zdCBjaGFyICpleHQpCi17Ci0gICAgaWYgKGRyaXZlICYmICpkcml2ZSkgewotCSpwYXRoKysgPSAqZHJpdmU7Ci0JKnBhdGgrKyA9ICc6JzsKLQl9Ci0gICAgaWYgKGRpciAmJiAqZGlyKSB7Ci0JcGF0aCA9IF9zdHBjcHkocGF0aCxkaXIpOwotCWlmICgqKHBhdGgtMSkgIT0gJ1xcJyAmJiAqKHBhdGgtMSkgIT0gJy8nKQotI2lmZGVmICBfX1VOSVhfXwotCSAgICAqcGF0aCsrID0gJy8nOwotI2Vsc2UKLQkgICAgKnBhdGgrKyA9ICdcXCc7Ci0jZW5kaWYKLQl9Ci0gICAgaWYgKG5hbWUpCi0JcGF0aCA9IF9zdHBjcHkocGF0aCxuYW1lKTsKLSAgICBpZiAoZXh0ICYmICpleHQpIHsKLQlpZiAoKmV4dCAhPSAnLicpCi0JICAgICpwYXRoKysgPSAnLic7Ci0JcGF0aCA9IF9zdHBjcHkocGF0aCxleHQpOwotCX0KLSAgICAqcGF0aCA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVNwbGl0IGEgZnVsbCBwYXRobmFtZSBpbnRvIGNvbXBvbmVudHMuCi0KLUhFQURFUjoKLXBtYXBpLmgKLQotUEFSQU1FVEVSUzoKLXBhdGggICAgLSBGdWxsIHBhdGggdG8gc3BsaXQKLWRyaXZlICAgLSBEcml2ZSBjb21wb25lbnQgZm9yIHBhdGgKLWRpciAgICAgLSBEaXJlY3RvcnkgY29tcG9uZW50IGZvciBwYXRoCi1uYW1lICAgIC0gRmlsZW5hbWUgY29tcG9uZW50IGZvciBwYXRoCi1leHQgICAgIC0gRXh0ZW5zaW9uIGNvbXBvbmVudCBmb3IgcGF0aAotCi1SRVRVUk5TOgotRmxhZ3MgaW5kaWNhdGluZyB3aGF0IGNvbXBvbmVudHMgd2VyZSBwYXJzZWQuCi0KLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBzcGxpdCBhIGZ1bGwgcGF0aG1hbWUgaW50byBzZXBhcmF0ZSBjb21wb25lbnRzIGluIHRoZSBmb3JtCi0KLSAgICBYOlxESVJcU1VCRElSXE5BTUUuRVhUCi0KLWFuZCBzcGxpdHMgcGF0aCBpbnRvIGl0cyBmb3VyIGNvbXBvbmVudHMuIEl0IHRoZW4gc3RvcmVzIHRob3NlIGNvbXBvbmVudHMKLWluIHRoZSBzdHJpbmdzIHBvaW50ZWQgdG8gYnkgZHJpdmUsIGRpciwgbmFtZSBhbmQgZXh0LiAoRWFjaCBjb21wb25lbnQgaXMKLXJlcXVpcmVkIGJ1dCBjYW4gYmUgYSBOVUxMLCB3aGljaCBtZWFucyB0aGUgY29ycmVzcG9uZGluZyBjb21wb25lbnQgd2lsbCBiZQotcGFyc2VkIGJ1dCBub3Qgc3RvcmVkKS4KLQotVGhlIG1heGltdW0gc2l6ZXMgZm9yIHRoZXNlIHN0cmluZ3MgYXJlIGdpdmVuIGJ5IHRoZSBjb25zdGFudHMgUE1fTUFYX0RSSVZFCi1hbmQgUE1fTUFYX1BBVEguIFBNX01BWF9EUklWRSBpcyBhbHdheXMgNCwgYW5kIFBNX01BWF9QQVRIIGlzIHVzdWFsbHkgYXQKLWxlYXN0IDI1NiBjaGFyYWN0ZXJzLiBVbmRlciBVbml4IHRoZSBkaXIsIG5hbWUgYW5kIGV4dCBjb21wb25lbnRzIG1heSBiZQotdXAgdG8gdGhlIGZ1bGwgcGF0aCBpbiBsZW5ndGguCi0KLVNFRSBBTFNPOgotUE1fbWFrZVBhdGgKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fc3BsaXRwYXRoKAotICAgIGNvbnN0IGNoYXIgKnBhdGgsCi0gICAgY2hhciAqZHJpdmUsCi0gICAgY2hhciAqZGlyLAotICAgIGNoYXIgKm5hbWUsCi0gICAgY2hhciAqZXh0KQotewotICAgIGNoYXIgICAgKnA7Ci0gICAgaW50ICAgICB0ZW1wLHJldDsKLSAgICBjaGFyICAgIGJ1ZltQTV9NQVhfUEFUSCsyXTsKLQotICAgIC8qIFNldCBhbGwgc3RyaW5nIHRvIGRlZmF1bHQgdmFsdWUgemVybyAqLwotICAgIHJldCA9IDA7Ci0gICAgaWYgKGRyaXZlKSAgKmRyaXZlID0gMDsKLSAgICBpZiAoZGlyKSAgICAqZGlyID0gMDsKLSAgICBpZiAobmFtZSkgICAqbmFtZSA9IDA7Ci0gICAgaWYgKGV4dCkgICAgKmV4dCA9IDA7Ci0KLSAgICAvKiBDb3B5IGZpbGVuYW1lIGludG8gdGVtcGxhdGUgdXAgdG8gUE1fTUFYX1BBVEggY2hhcmFjdGVycyAqLwotICAgIHAgPSBidWY7Ci0gICAgaWYgKCh0ZW1wID0gc3RybGVuKHBhdGgpKSA+IFBNX01BWF9QQVRIKQotCXRlbXAgPSBQTV9NQVhfUEFUSDsKLSAgICAqcCsrID0gMDsKLSAgICBzdHJuY3B5KHAsIHBhdGgsIHRlbXApOwotICAgICoocCArPSB0ZW1wKSA9IDA7Ci0KLSAgICAvKiBTcGxpdCB0aGUgZmlsZW5hbWUgYW5kIGZpbGwgY29ycmVzcG9uZGluZyBub256ZXJvIHBvaW50ZXJzICovCi0gICAgdGVtcCA9IDA7Ci0gICAgZm9yICg7OykgewotCXN3aXRjaCAoKi0tcCkgewotCSAgICBjYXNlICcuJzoKLQkJaWYgKCF0ZW1wICYmICgqKHArMSkgPT0gJ1wwJykpCi0JCSAgICB0ZW1wID0gZmluZERvdChwKTsKLQkJaWYgKCghdGVtcCkgJiYgKChyZXQgJiBQTV9IQVNfRVhURU5TSU9OKSA9PSAwKSkgewotCQkgICAgcmV0IHw9IFBNX0hBU19FWFRFTlNJT047Ci0JCSAgICBzYWZlX3N0cm5jcHkoZXh0LCBwLCBQTV9NQVhfUEFUSCAtIDEpOwotCQkgICAgKnAgPSAwOwotCQkgICAgfQotCQljb250aW51ZTsKLQkgICAgY2FzZSAnOic6Ci0JCWlmIChwICE9ICZidWZbMl0pCi0JCSAgICBjb250aW51ZTsKLQkgICAgY2FzZSAnXDAnOgotCQlpZiAodGVtcCkgewotCQkgICAgaWYgKCorK3ApCi0JCQlyZXQgfD0gUE1fSEFTX0RJUkVDVE9SWTsKLQkJICAgIHNhZmVfc3RybmNweShkaXIsIHAsIFBNX01BWF9QQVRIIC0gMSk7Ci0JCSAgICAqcC0tID0gMDsKLQkJICAgIGJyZWFrOwotCQkgICAgfQotCSAgICBjYXNlICcvJzoKLQkgICAgY2FzZSAnXFwnOgotCQlpZiAoIXRlbXApIHsKLQkJICAgIHRlbXArKzsKLQkJICAgIGlmICgqKytwKQotCQkJcmV0IHw9IFBNX0hBU19GSUxFTkFNRTsKLQkJICAgIHNhZmVfc3RybmNweShuYW1lLCBwLCBQTV9NQVhfUEFUSCAtIDEpOwotCQkgICAgKnAtLSA9IDA7Ci0JCSAgICBpZiAoKnAgPT0gMCB8fCAoKnAgPT0gJzonICYmIHAgPT0gJmJ1ZlsyXSkpCi0JCQlicmVhazsKLQkJICAgIH0KLQkJY29udGludWU7Ci0JICAgIGNhc2UgJyonOgotCSAgICBjYXNlICc/JzoKLQkJaWYgKCF0ZW1wKQotCQkgICAgcmV0IHw9IFBNX0hBU19XSUxEQ0FSRFM7Ci0JICAgIGRlZmF1bHQ6Ci0JCWNvbnRpbnVlOwotCSAgICB9Ci0JYnJlYWs7Ci0JfQotICAgIGlmICgqcCA9PSAnOicpIHsKLQlpZiAoYnVmWzFdKQotCSAgICByZXQgfD0gUE1fSEFTX0RSSVZFOwotCXNhZmVfc3RybmNweShkcml2ZSwgJmJ1ZlsxXSwgUE1fTUFYX0RSSVZFIC0gMSk7Ci0JfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUJsb2NrIHVudGlsIGEgc3BlY2lmaWMgdGltZSBoYXMgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCBjYWxsCi0KLUhFQURFUjoKLXBtYXBpLmgKLQotUEFSQU1FVEVSUzoKLW1pbGxpc2Vjb25kcyAgICAtIE51bWJlciBvZiBtaWxsaXNlY29uZHMgZm9yIGRlbGF5Ci0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHdpbGwgYmxvY2sgdGhlIGNhbGxpbmcgdGhyZWFkIG9yIHByb2Nlc3MgdW50aWwgdGhlIHNwZWNpZmllZAotbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBoYXZlIHBhc3NlZCBzaW5jZSB0aGUgL2xhc3QvIGNhbGwgdG8gdGhpcyBmdW5jdGlvbi4KLVRoZSBmaXJzdCB0aW1lIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBpbW1lZGlhdGVseS4gT24KLXN1YnNxdWVudCBjYWxscyBpdCB3aWxsIGJsb2NrIHVudGlsIHRoZSBzcGVjaWZpZWQgdGltZSBoYXMgZWxhcHNlZCwgb3IgaXQKLXdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5IGlmIHRoZSB0aW1lIGhhcyBhbHJlYWR5IGVsYXBzZWQuCi0KLVRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIHRvIHByb3ZpZGUgY29uc3RhbnQgdGltZSBmdW5jdGlvbmFsaXR5IGluIGEKLXByb2dyYW0sIHN1Y2ggYXMgYSBmcmFtZSByYXRlIGxpbWl0ZXIgZm9yIGdyYXBoaWNzIGFwcGxpY2F0aW9ucyBldGMuCi0KLVNFRSBBTFNPOgotUE1fc2xlZXAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2Jsb2NrVW50aWxUaW1lb3V0KAotICAgIHVsb25nIG1pbGxpc2Vjb25kcykKLXsKLSAgICB1bG9uZyAgICAgICAgICAgICAgICAgICBtaWNyb3NlY29uZHMgPSBtaWxsaXNlY29uZHMgKiAxMDAwTCxtc0RlbGF5OwotICAgIHN0YXRpYyBMWlRpbWVyT2JqZWN0ICAgIHRtOwotICAgIHN0YXRpYyBpYm9vbCAgICAgICAgICAgIGZpcnN0VGltZSA9IHRydWU7Ci0KLSAgICBpZiAoZmlyc3RUaW1lKSB7Ci0JZmlyc3RUaW1lID0gZmFsc2U7Ci0JTFpUaW1lck9uRXh0KCZ0bSk7Ci0JfQotICAgIGVsc2UgewotCWlmICgobXNEZWxheSA9IChtaWNyb3NlY29uZHMgLSBMWlRpbWVyTGFwRXh0KCZ0bSkpIC8gMTAwMEwpID4gMCkKLQkgICAgUE1fc2xlZXAobXNEZWxheSk7Ci0Jd2hpbGUgKExaVGltZXJMYXBFeHQoJnRtKSA8IG1pY3Jvc2Vjb25kcykKLQkgICAgOwotCUxaVGltZXJPZmZFeHQoJnRtKTsKLQlMWlRpbWVyT25FeHQoJnRtKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vX2NwdWluZm8uYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19jcHVpbmZvLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBlYmVkNy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vX2NwdWluZm8uYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNjAwICswLDAgQEAKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KgotOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLTsqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi07KiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLTsqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotOyoKLTsqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi07KiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotOyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi07KiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyoKLTsqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqCi07KiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogTGFuZ3VhZ2U6ICAgIE5BU00gb3IgVEFTTSBBc3NlbWJsZXIKLTsqIEVudmlyb25tZW50OiBJbnRlbCAzMiBiaXQgUHJvdGVjdGVkIE1vZGUuCi07KgotOyogRGVzY3JpcHRpb246IENvZGUgdG8gZGV0ZXJtaW5lIHRoZSBJbnRlbCBwcm9jZXNzb3IgdHlwZS4KLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIElERUFMCi0KLWluY2x1ZGUgInNjaXRlY2gubWFjIgotCi1oZWFkZXIgICAgICBfY3B1aW5mbwotCi1iZWdkYXRhc2VnICBfY3B1aW5mbyAgICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGRhdGEgc2VnbWVudAotCi1jYWNoZV9pZCAgICBkYiAgIjAxMjM0NTY3ODkwMTIzNDU2IgotaW50ZWxfaWQgICAgZGIgICJHZW51aW5lSW50ZWwiICAgICAgOyBJbnRlbCB2ZW5kb3IgSUQKLWN5cml4X2lkICAgIGRiICAiQ3lyaXhJbnN0ZWFkIiAgICAgIDsgQ3lyaXggdmVuZG9yIElECi1hbWRfaWQgICAgICBkYiAgIkF1dGhlbnRpY0FNRCIgICAgICA7IEFNRCB2ZW5kb3IgSUQKLWlkdF9pZCAgICAgIGRiICAiQ2VudGF1ckhhdWxzIiAgICAgIDsgSURUIHZlbmRvciBJRAotCi1DUFVfSURUICAgICBFUVUgMDEwMDBoICAgICAgICAgICAgICA7IEZsYWcgZm9yIElEVCBwcm9jZXNzb3JzCi1DUFVfQ3lyaXggICBFUVUgMDIwMDBoICAgICAgICAgICAgICA7IEZsYWcgZm9yIEN5cml4IHByb2Nlc3NvcnMKLUNQVV9BTUQgICAgIEVRVSAwNDAwMGggICAgICAgICAgICAgIDsgRmxhZyBmb3IgQU1EIHByb2Nlc3NvcnMKLUNQVV9JbnRlbCAgIEVRVSAwODAwMGggICAgICAgICAgICAgIDsgRmxhZyBmb3IgSW50ZWwgcHJvY2Vzc29ycwotCi1lbmRkYXRhc2VnICBfY3B1aW5mbwotCi1iZWdjb2Rlc2VnICBfY3B1aW5mbyAgICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGNvZGUgc2VnbWVudAotCi1pZmRlZiAgIFVTRV9OQVNNCi0lbWFjcm8gbUNQVV9JRCAwCi1kYiAgMDBGaCwwQTJoCi0lZW5kbWFjcm8KLWVsc2UKLU1BQ1JPICAgbUNQVV9JRAotZGIgIDAwRmgsMEEyaAotRU5ETQotZW5kaWYKLQotaWZkZWYgICBVU0VfTkFTTQotJW1hY3JvIG1SRFRTQyAwCi1kYiAgMDBGaCwwMzFoCi0lZW5kbWFjcm8KLWVsc2UKLU1BQ1JPICAgbVJEVFNDCi1kYiAgMDBGaCwwMzFoCi1FTkRNCi1lbmRpZgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBib29sIF9DUFVfY2hlY2s4MDM4Nih2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRGV0ZXJtaW5lcyBpZiB3ZSBoYXZlIGFuIGkzODYgcHJvY2Vzc29yLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9DUFVfY2hlY2s4MDM4NgotCi0gICAgICAgIGVudGVyX2MKLQotICAgICAgICB4b3IgICAgIGVkeCxlZHggICAgICAgICAgICAgOyBFRFggPSAwLCBub3QgYW4gODAzODYKLSAgICAgICAgbW92ICAgICBieCwgc3AKLWlmZGVmICAgVVNFX05BU00KLSAgICAgICAgYW5kICAgICBzcCwgfjMKLWVsc2UKLSAgICAgICAgYW5kICAgICBzcCwgbm90IDMKLWVuZGlmCi0gICAgICAgIHB1c2hmZCAgICAgICAgICAgICAgICAgICAgICA7IFB1c2ggb3JpZ2luYWwgRUZMQUdTCi0gICAgICAgIHBvcCAgICAgZWF4ICAgICAgICAgICAgICAgICA7IEdldCBvcmlnaW5hbCBFRkxBR1MKLSAgICAgICAgbW92ICAgICBlY3gsIGVheCAgICAgICAgICAgIDsgU2F2ZSBvcmlnaW5hbCBFRkxBR1MKLSAgICAgICAgeG9yICAgICBlYXgsIDQwMDAwaCAgICAgICAgIDsgRmxpcCBBQyBiaXQgaW4gRUZMQUdTCi0gICAgICAgIHB1c2ggICAgZWF4ICAgICAgICAgICAgICAgICA7IFNhdmUgbmV3IEVGTEFHUyB2YWx1ZSBvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAgIHN0YWNrCi0gICAgICAgIHBvcGZkICAgICAgICAgICAgICAgICAgICAgICA7IFJlcGxhY2UgY3VycmVudCBFRkxBR1MgdmFsdWUKLSAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgICAgIDsgR2V0IG5ldyBFRkxBR1MKLSAgICAgICAgcG9wICAgICBlYXggICAgICAgICAgICAgICAgIDsgU3RvcmUgbmV3IEVGTEFHUyBpbiBFQVgKLSAgICAgICAgeG9yICAgICBlYXgsIGVjeCAgICAgICAgICAgIDsgQ2FuJ3QgdG9nZ2xlIEFDIGJpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgICBwcm9jZXNzb3I9ODAzODYKLSAgICAgICAgam56ICAgICBAQERvbmUgICAgICAgICAgICAgIDsgSnVtcCBpZiBub3QgYW4gODAzODYgcHJvY2Vzc29yCi0gICAgICAgIGluYyAgICAgZWR4ICAgICAgICAgICAgICAgICA7IFdlIGhhdmUgYW4gODAzODYKLQotQEBEb25lOiBwdXNoICAgIGVjeAotICAgICAgICBwb3BmZAotICAgICAgICBtb3YgICAgIHNwLCBieAotICAgICAgICBtb3YgICAgIGVheCwgZWR4Ci0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGJvb2wgX0NQVV9jaGVjazgwNDg2KHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBEZXRlcm1pbmVzIGlmIHdlIGhhdmUgYW4gaTQ4NiBwcm9jZXNzb3IuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX0NQVV9jaGVjazgwNDg2Ci0KLSAgICAgICAgZW50ZXJfYwotCi07IERpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIGk0ODYgYW5kIFBlbnRpdW0gYnkgdGhlIGFiaWxpdHkgdG8gc2V0IHRoZSBJRCBmbGFnCi07IGluIHRoZSBFRkxBR1MgcmVnaXN0ZXIuIElmIHRoZSBJRCBmbGFnIGlzIHNldCwgdGhlbiB3ZSBjYW4gdXNlIHRoZSBDUFVJRAotOyBpbnN0cnVjdGlvbiB0byBkZXRlcm1pbmUgdGhlIGZpbmFsIHZlcnNpb24gb2YgdGhlIGNoaXAuIE90aGVyd2lzZSB3ZQotOyBzaW1wbHkgaGF2ZSBhbiA4MDQ4Ni4KLQotOyBEaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSBpNDg2IGFuZCBQZW50aXVtIGJ5IHRoZSBhYmlsaXR5IHRvIHNldCB0aGUgSUQgZmxhZwotOyBpbiB0aGUgRUZMQUdTIHJlZ2lzdGVyLiBJZiB0aGUgSUQgZmxhZyBpcyBzZXQsIHRoZW4gd2UgY2FuIHVzZSB0aGUgQ1BVSUQKLTsgaW5zdHJ1Y3Rpb24gdG8gZGV0ZXJtaW5lIHRoZSBmaW5hbCB2ZXJzaW9uIG9mIHRoZSBjaGlwLiBPdGhlcndpc2Ugd2UKLTsgc2ltcGx5IGhhdmUgYW4gODA0ODYuCi0KLSAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgICAgIDsgR2V0IG9yaWdpbmFsIEVGTEFHUwotICAgICAgICBwb3AgICAgIGVheAotICAgICAgICBtb3YgICAgIGVjeCwgZWF4Ci0gICAgICAgIHhvciAgICAgZWF4LCAyMDAwMDBoICAgICAgICA7IEZsaXAgSUQgYml0IGluIEVGTEFHUwotICAgICAgICBwdXNoICAgIGVheCAgICAgICAgICAgICAgICAgOyBTYXZlIG5ldyBFRkxBR1MgdmFsdWUgb24gc3RhY2sKLSAgICAgICAgcG9wZmQgICAgICAgICAgICAgICAgICAgICAgIDsgUmVwbGFjZSBjdXJyZW50IEVGTEFHUyB2YWx1ZQotICAgICAgICBwdXNoZmQgICAgICAgICAgICAgICAgICAgICAgOyBHZXQgbmV3IEVGTEFHUwotICAgICAgICBwb3AgICAgIGVheCAgICAgICAgICAgICAgICAgOyBTdG9yZSBuZXcgRUZMQUdTIGluIEVBWAotICAgICAgICB4b3IgICAgIGVheCwgZWN4ICAgICAgICAgICAgOyBDYW4gbm90IHRvZ2dsZSBJRCBiaXQsCi0gICAgICAgIGpueiAgICAgQEAxICAgICAgICAgICAgICAgICA7IFByb2Nlc3Nvcj04MDQ4NgotICAgICAgICBtb3YgICAgIGVheCwxICAgICAgICAgICAgICAgOyBXZSBkb250IGhhdmUgYSBQZW50aXVtCi0gICAgICAgIGptcCAgICAgQEBEb25lCi1AQDE6ICAgIG1vdiAgICAgZWF4LDAgICAgICAgICAgICAgICA7IFdlIGhhdmUgUGVudGl1bSBvciBsYXRlcgotQEBEb25lOiBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBib29sIF9DUFVfY2hlY2tDbG9uZSh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ2hlY2tzIGlmIHRoZSBpMzg2IG9yIGk0ODYgcHJvY2Vzc29yIGlzIGEgY2xvbmUgb3IgZ2VudWluZSBJbnRlbC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfQ1BVX2NoZWNrQ2xvbmUKLQotICAgICAgICBlbnRlcl9jCi0KLSAgICAgICAgbW92ICAgICBheCw1NTU1aCAgICAgICAgICAgIDsgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoaXMgaXMgYSAzMi1iaXQgcHJvY2Vzc29yCi0gICAgICAgIHhvciAgICAgZHgsZHgKLSAgICAgICAgbW92ICAgICBjeCwyaAotICAgICAgICBkaXYgICAgIGN4ICAgICAgICAgICAgICAgICAgOyBQZXJmb3JtIERpdmlzaW9uCi0gICAgICAgIGNsYwotICAgICAgICBqbnogICAgIEBATm9DbG9uZQotICAgICAgICBqbXAgICAgIEBAQ2xvbmUKLUBATm9DbG9uZToKLSAgICAgICAgc3RjCi1AQENsb25lOgotICAgICAgICBwdXNoZmQKLSAgICAgICAgcG9wICAgICBlYXggICAgICAgICAgICAgICAgIDsgR2V0IHRoZSBmbGFncwotICAgICAgICBhbmQgICAgIGVheCwxCi0gICAgICAgIHhvciAgICAgZWF4LDEgICAgICAgICAgICAgICA7IEVBWD0wIGlzIHByb2JhYmx5IEludGVsLCBFQVg9MSBpcyBhIENsb25lCi0KLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgYm9vbCBfQ1BVX2hhdmVDUFVJRCh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRGV0ZXJtaW5lcyBpZiB3ZSBoYXZlIHN1cHBvcnQgZm9yIHRoZSBDUFVJRCBpbnN0cnVjdGlvbi4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfQ1BVX2hhdmVDUFVJRAotCi0gICAgICAgIGVudGVyX2MKLQotaWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIHB1c2hmZCAgICAgICAgICAgICAgICAgICAgICA7IEdldCBvcmlnaW5hbCBFRkxBR1MKLSAgICAgICAgcG9wICAgICBlYXgKLSAgICAgICAgbW92ICAgICBlY3gsIGVheAotICAgICAgICB4b3IgICAgIGVheCwgMjAwMDAwaCAgICAgICAgOyBGbGlwIElEIGJpdCBpbiBFRkxBR1MKLSAgICAgICAgcHVzaCAgICBlYXggICAgICAgICAgICAgICAgIDsgU2F2ZSBuZXcgRUZMQUdTIHZhbHVlIG9uIHN0YWNrCi0gICAgICAgIHBvcGZkICAgICAgICAgICAgICAgICAgICAgICA7IFJlcGxhY2UgY3VycmVudCBFRkxBR1MgdmFsdWUKLSAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgICAgIDsgR2V0IG5ldyBFRkxBR1MKLSAgICAgICAgcG9wICAgICBlYXggICAgICAgICAgICAgICAgIDsgU3RvcmUgbmV3IEVGTEFHUyBpbiBFQVgKLSAgICAgICAgeG9yICAgICBlYXgsIGVjeCAgICAgICAgICAgIDsgQ2FuIG5vdCB0b2dnbGUgSUQgYml0LAotICAgICAgICBqbnogICAgIEBAMSAgICAgICAgICAgICAgICAgOyBQcm9jZXNzb3I9ODA0ODYKLSAgICAgICAgbW92ICAgICBlYXgsMCAgICAgICAgICAgICAgIDsgV2UgZG9udCBoYXZlIENQVUlEIHN1cHBvcnQKLSAgICAgICAgam1wICAgICBAQERvbmUKLUBAMTogICAgbW92ICAgICBlYXgsMSAgICAgICAgICAgICAgIDsgV2UgaGF2ZSBDUFVJRCBzdXBwb3J0Ci1lbHNlCi0gICAgICAgIG1vdiAgICAgZWF4LDAgICAgICAgICAgICAgICA7IENQVUlEIHJlcXVpcmVzIDMyLWJpdCBwbW9kZQotZW5kaWYKLUBARG9uZTogbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWludCBfQ1BVX2NoZWNrQ1BVSUQodm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERldGVybWluZXMgdGhlIENQVSB0eXBlIHVzaW5nIHRoZSBDUFVJRCBpbnN0cnVjdGlvbi4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfQ1BVX2NoZWNrQ1BVSUQKLQotICAgICAgICBlbnRlcl9jCi0KLSAgICAgICAgeG9yICAgICBlYXgsIGVheCAgICAgICAgICAgIDsgU2V0IHVwIGZvciBDUFVJRCBpbnN0cnVjdGlvbgotICAgICAgICBtQ1BVX0lEICAgICAgICAgICAgICAgICAgICAgOyBHZXQgYW5kIHNhdmUgdmVuZG9yIElECi0gICAgICAgIGNtcCAgICAgZWF4LCAxICAgICAgICAgICAgICA7IE1ha2Ugc3VyZSAxIGlzIHZhbGlkIGlucHV0IGZvciBDUFVJRAotICAgICAgICBqbCAgICAgIEBARmFpbCAgICAgICAgICAgICAgOyBXZSBkb250IGhhdmUgdGhlIENQVUlEIGluc3RydWN0aW9uCi0gICAgICAgIHhvciAgICAgZWF4LGVheCAgICAgICAgICAgICA7IEFzc3VtZSB2ZW5kb3IgaXMgdW5rbm93bgotCi07IENoZWNrIGZvciBHZW51aW5lSW50ZWwgcHJvY2Vzc29ycwotCi0gICAgICAgIExFQV9MICAgZXNpLGludGVsX2lkCi0gICAgICAgIGNtcCAgICAgW0RXT1JEIGVzaV0sIGVieAotICAgICAgICBqbmUgICAgIEBATm90SW50ZWwKLSAgICAgICAgY21wICAgICBbRFdPUkQgZXNpKzRdLCBlZHgKLSAgICAgICAgam5lICAgICBAQE5vdEludGVsCi0gICAgICAgIGNtcCAgICAgW0RXT1JEIGVzaSs4XSwgZWN4Ci0gICAgICAgIGpuZSAgICAgQEBOb3RJbnRlbAotICAgICAgICBtb3YgICAgIGVheCxDUFVfSW50ZWwgICAgICAgOyBGbGFnIHRoYXQgd2UgaGF2ZSBHZW51aW5lSW50ZWwKLSAgICAgICAgam1wICAgICBAQEZvdW5kVmVuZG9yCi0KLTsgQ2hlY2sgZm9yIEN5cml4SW5zdGVhZCBwcm9jZXNzb3JzCi0KLUBATm90SW50ZWw6Ci0gICAgICAgIExFQV9MICAgZXNpLGN5cml4X2lkCi0gICAgICAgIGNtcCAgICAgW0RXT1JEIGVzaV0sIGVieAotICAgICAgICBqbmUgICAgIEBATm90Q3lyaXgKLSAgICAgICAgY21wICAgICBbRFdPUkQgZXNpKzRdLCBlZHgKLSAgICAgICAgam5lICAgICBAQE5vdEN5cml4Ci0gICAgICAgIGNtcCAgICAgW0RXT1JEIGVzaSs4XSwgZWN4Ci0gICAgICAgIGpuZSAgICAgQEBOb3RDeXJpeAotICAgICAgICBtb3YgICAgIGVheCxDUFVfQ3lyaXggICAgICAgOyBGbGFnIHRoYXQgd2UgaGF2ZSBDeXJpeEluc3RlYWQKLSAgICAgICAgam1wICAgICBAQEZvdW5kVmVuZG9yCi0KLTsgQ2hlY2sgZm9yIEF1dGhlbnRpY0FNRCBwcm9jZXNzb3JzCi0KLUBATm90Q3lyaXg6Ci0gICAgICAgIExFQV9MICAgZXNpLGFtZF9pZAotICAgICAgICBjbXAgICAgIFtEV09SRCBlc2ldLCBlYngKLSAgICAgICAgam5lICAgICBAQE5vdEFNRAotICAgICAgICBjbXAgICAgIFtEV09SRCBlc2krNF0sIGVkeAotICAgICAgICBqbmUgICAgIEBATm90QU1ECi0gICAgICAgIGNtcCAgICAgW0RXT1JEIGVzaSs4XSwgZWN4Ci0gICAgICAgIGpuZSAgICAgQEBOb3RBTUQKLSAgICAgICAgbW92ICAgICBlYXgsQ1BVX0FNRCAgICAgICAgIDsgRmxhZyB0aGF0IHdlIGhhdmUgQXV0aGVudGljQU1ECi0gICAgICAgIGptcCAgICAgQEBGb3VuZFZlbmRvcgotCi07IENoZWNrIGZvciBDZW50YXVySGF1bHMgcHJvY2Vzc29ycwotCi1AQE5vdEFNRDoKLSAgICAgICAgTEVBX0wgICBlc2ksaWR0X2lkCi0gICAgICAgIGNtcCAgICAgW0RXT1JEIGVzaV0sIGVieAotICAgICAgICBqbmUgICAgIEBATm90SURUCi0gICAgICAgIGNtcCAgICAgW0RXT1JEIGVzaSs0XSwgZWR4Ci0gICAgICAgIGpuZSAgICAgQEBOb3RJRFQKLSAgICAgICAgY21wICAgICBbRFdPUkQgZXNpKzhdLCBlY3gKLSAgICAgICAgam5lICAgICBAQE5vdElEVAotICAgICAgICBtb3YgICAgIGVheCxDUFVfSURUICAgICAgICAgOyBGbGFnIHRoYXQgd2UgaGF2ZSBBdXRoZW50aWNJRFQKLSAgICAgICAgam1wICAgICBAQEZvdW5kVmVuZG9yCi0KLUBATm90SURUOgotCi1AQEZvdW5kVmVuZG9yOgotICAgICAgICBwdXNoICAgIGVheAotICAgICAgICB4b3IgICAgIGVheCwgZWF4Ci0gICAgICAgIGluYyAgICAgZWF4Ci0gICAgICAgIG1DUFVfSUQgICAgICAgICAgICAgICAgICAgICA7IEdldCBmYW1pbHkvbW9kZWwvc3RlcHBpbmcvZmVhdHVyZXMKLSAgICAgICAgYW5kICAgICBlYXgsIDBGMDBoCi0gICAgICAgIHNociAgICAgZWF4LCA4ICAgICAgICAgICAgICA7IElzb2xhdGUgZmFtaWx5Ci0gICAgICAgIGFuZCAgICAgZWF4LCAwRmgKLSAgICAgICAgcG9wICAgICBlY3gKLSAgICAgICAgb3IgICAgICBlYXgsZWN4ICAgICAgICAgICAgIDsgQ29tYmluZSBpbiB0aGUgY2xvbmUgZmxhZwotQEBEb25lOiBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1AQEZhaWw6IHhvciAgICAgZWF4LGVheAotICAgICAgICBqbXAgICAgIEBARG9uZQotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1aW50IF9DUFVfZ2V0Q1BVSURNb2RlbCh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRGV0ZXJtaW5lcyB0aGUgQ1BVIHR5cGUgdXNpbmcgdGhlIENQVUlEIGluc3RydWN0aW9uLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9DUFVfZ2V0Q1BVSURNb2RlbAotCi0gICAgICAgIGVudGVyX2MKLQotICAgICAgICB4b3IgICAgIGVheCwgZWF4ICAgICAgICAgICAgOyBTZXQgdXAgZm9yIENQVUlEIGluc3RydWN0aW9uCi0gICAgICAgIG1DUFVfSUQgICAgICAgICAgICAgICAgICAgICA7IEdldCBhbmQgc2F2ZSB2ZW5kb3IgSUQKLSAgICAgICAgY21wICAgICBlYXgsIDEgICAgICAgICAgICAgIDsgTWFrZSBzdXJlIDEgaXMgdmFsaWQgaW5wdXQgZm9yIENQVUlECi0gICAgICAgIGpsICAgICAgQEBGYWlsICAgICAgICAgICAgICA7IFdlIGRvbnQgaGF2ZSB0aGUgQ1BVSUQgaW5zdHJ1Y3Rpb24KLSAgICAgICAgeG9yICAgICBlYXgsIGVheAotICAgICAgICBpbmMgICAgIGVheAotICAgICAgICBtQ1BVX0lEICAgICAgICAgICAgICAgICAgICAgOyBHZXQgZmFtaWx5L21vZGVsL3N0ZXBwaW5nL2ZlYXR1cmVzCi0gICAgICAgIGFuZCAgICAgZWF4LCAwRjBoCi0gICAgICAgIHNociAgICAgZWF4LCA0ICAgICAgICAgICAgICA7IElzb2xhdGUgbW9kZWwKLUBARG9uZTogbGVhdmVfYwotICAgICAgICByZXQKLQotQEBGYWlsOiB4b3IgICAgIGVheCxlYXgKLSAgICAgICAgam1wICAgICBAQERvbmUKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWludCBfQ1BVX2dldENQVUlEU3RlcHBpbmcodm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERldGVybWluZXMgdGhlIENQVSB0eXBlIHVzaW5nIHRoZSBDUFVJRCBpbnN0cnVjdGlvbi4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfQ1BVX2dldENQVUlEU3RlcHBpbmcKLQotICAgICAgICBlbnRlcl9jCi0KLSAgICAgICAgeG9yICAgICBlYXgsIGVheCAgICAgICAgICAgIDsgU2V0IHVwIGZvciBDUFVJRCBpbnN0cnVjdGlvbgotICAgICAgICBtQ1BVX0lEICAgICAgICAgICAgICAgICAgICAgOyBHZXQgYW5kIHNhdmUgdmVuZG9yIElECi0gICAgICAgIGNtcCAgICAgZWF4LCAxICAgICAgICAgICAgICA7IE1ha2Ugc3VyZSAxIGlzIHZhbGlkIGlucHV0IGZvciBDUFVJRAotICAgICAgICBqbCAgICAgIEBARmFpbCAgICAgICAgICAgICAgOyBXZSBkb250IGhhdmUgdGhlIENQVUlEIGluc3RydWN0aW9uCi0gICAgICAgIHhvciAgICAgZWF4LCBlYXgKLSAgICAgICAgaW5jICAgICBlYXgKLSAgICAgICAgbUNQVV9JRCAgICAgICAgICAgICAgICAgICAgIDsgR2V0IGZhbWlseS9tb2RlbC9zdGVwcGluZy9mZWF0dXJlcwotICAgICAgICBhbmQgICAgIGVheCwgMDBGaCAgICAgICAgICAgOyBJc29sYXRlIHN0ZXBwaW5nCi1AQERvbmU6IGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLUBARmFpbDogeG9yICAgICBlYXgsZWF4Ci0gICAgICAgIGptcCAgICAgQEBEb25lCi0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVpbnQgX0NQVV9nZXRDUFVJREZlYXR1cmVzKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBEZXRlcm1pbmVzIHRoZSBDUFUgdHlwZSB1c2luZyB0aGUgQ1BVSUQgaW5zdHJ1Y3Rpb24uCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX0NQVV9nZXRDUFVJREZlYXR1cmVzCi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIHhvciAgICAgZWF4LCBlYXggICAgICAgICAgICA7IFNldCB1cCBmb3IgQ1BVSUQgaW5zdHJ1Y3Rpb24KLSAgICAgICAgbUNQVV9JRCAgICAgICAgICAgICAgICAgICAgIDsgR2V0IGFuZCBzYXZlIHZlbmRvciBJRAotICAgICAgICBjbXAgICAgIGVheCwgMSAgICAgICAgICAgICAgOyBNYWtlIHN1cmUgMSBpcyB2YWxpZCBpbnB1dCBmb3IgQ1BVSUQKLSAgICAgICAgamwgICAgICBAQEZhaWwgICAgICAgICAgICAgIDsgV2UgZG9udCBoYXZlIHRoZSBDUFVJRCBpbnN0cnVjdGlvbgotICAgICAgICB4b3IgICAgIGVheCwgZWF4Ci0gICAgICAgIGluYyAgICAgZWF4Ci0gICAgICAgIG1DUFVfSUQgICAgICAgICAgICAgICAgICAgICA7IEdldCBmYW1pbHkvbW9kZWwvc3RlcHBpbmcvZmVhdHVyZXMKLSAgICAgICAgbW92ICAgICBlYXgsIGVkeAotQEBEb25lOiBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1AQEZhaWw6IHhvciAgICAgZWF4LGVheAotICAgICAgICBqbXAgICAgIEBARG9uZQotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1aW50IF9DUFVfZ2V0Q2FjaGVTaXplKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBEZXRlcm1pbmVzIHRoZSBDUFUgY2FjaGUgc2l6ZSBmb3IgSW50ZWwgcHJvY2Vzc29ycwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9DUFVfZ2V0Q2FjaGVTaXplCi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICB4b3IgICAgIGVheCwgZWF4ICAgICAgICAgICAgOyBTZXQgdXAgZm9yIENQVUlEIGluc3RydWN0aW9uCi0gICAgICAgIG1DUFVfSUQgICAgICAgICAgICAgICAgICAgICA7IEdldCBhbmQgc2F2ZSB2ZW5kb3IgSUQKLSAgICAgICAgY21wICAgICBlYXgsMiAgICAgICAgICAgICAgIDsgTWFrZSBzdXJlIDIgaXMgdmFsaWQgaW5wdXQgZm9yIENQVUlECi0gICAgICAgIGpsICAgICAgQEBGYWlsICAgICAgICAgICAgICA7IFdlIGRvbnQgaGF2ZSB0aGUgQ1BVSUQgaW5zdHJ1Y3Rpb24KLSAgICAgICAgbW92ICAgICBlYXgsMgotICAgICAgICBtQ1BVX0lEICAgICAgICAgICAgICAgICAgICAgOyBHZXQgY2FjaGUgZGVzY3JpcHRvcnMKLSAgICAgICAgTEVBX0wgICBlc2ksY2FjaGVfaWQgICAgICAgIDsgR2V0IGFkZHJlc3Mgb2YgY2FjaGUgSUQgKC1mUElDIGF3YXJlKQotICAgICAgICBzaHIgICAgIGVheCw4Ci0gICAgICAgIG1vdiAgICAgW2VzaSswXSxlYXgKLSAgICAgICAgbW92ICAgICBbZXNpKzNdLGVieAotICAgICAgICBtb3YgICAgIFtlc2krN10sZWN4Ci0gICAgICAgIG1vdiAgICAgW2VzaSsxMV0sZWR4Ci0gICAgICAgIHhvciAgICAgZWF4LGVheAotICAgICAgICBMRUFfTCAgIGVzaSxjYWNoZV9pZCAgICAgICAgOyBHZXQgYWRkcmVzcyBvZiBjYWNoZSBJRCAoLWZQSUMgYXdhcmUpCi0gICAgICAgIG1vdiAgICAgZWRpLDE1Ci1AQFNjYW5Mb29wOgotICAgICAgICBjbXAgICAgIFtCWVRFIGVzaV0sNDFoCi0gICAgICAgIG1vdiAgICAgZWF4LDEyOAotICAgICAgICBqZSAgICAgIEBARG9uZQotICAgICAgICBjbXAgICAgIFtCWVRFIGVzaV0sNDJoCi0gICAgICAgIG1vdiAgICAgZWF4LDI1NgotICAgICAgICBqZSAgICAgIEBARG9uZQotICAgICAgICBjbXAgICAgIFtCWVRFIGVzaV0sNDNoCi0gICAgICAgIG1vdiAgICAgZWF4LDUxMgotICAgICAgICBqZSAgICAgIEBARG9uZQotICAgICAgICBjbXAgICAgIFtCWVRFIGVzaV0sNDRoCi0gICAgICAgIG1vdiAgICAgZWF4LDEwMjQKLSAgICAgICAgamUgICAgICBAQERvbmUKLSAgICAgICAgY21wICAgICBbQllURSBlc2ldLDQ1aAotICAgICAgICBtb3YgICAgIGVheCwyMDQ4Ci0gICAgICAgIGplICAgICAgQEBEb25lCi0gICAgICAgIGluYyAgICAgZXNpCi0gICAgICAgIGRlYyAgICAgZWRpCi0gICAgICAgIGpueiAgICAgQEBTY2FuTG9vcAotCi1AQERvbmU6IGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLUBARmFpbDogeG9yICAgICBlYXgsZWF4Ci0gICAgICAgIGptcCAgICAgQEBEb25lCi0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVpbnQgX0NQVV9oYXZlM0ROb3codm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERldGVybWluZXMgdGhlIENQVSB0eXBlIHVzaW5nIHRoZSBDUFVJRCBpbnN0cnVjdGlvbi4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfQ1BVX2hhdmUzRE5vdwotCi0gICAgICAgIGVudGVyX2MKLQotICAgICAgICBtb3YgICAgIGVheCw4MDAwMDAwMGggICAgICAgOyBRdWVyeSBmb3IgZXh0ZW5kZWQgZnVuY3Rpb25zCi0gICAgICAgIG1DUFVfSUQgICAgICAgICAgICAgICAgICAgICA7IEdldCBleHRlbmRlZCBmdW5jdGlvbiBsaW1pdAotICAgICAgICBjbXAgICAgIGVheCw4MDAwMDAwMWgKLSAgICAgICAgamJlICAgICBAQEZhaWwgICAgICAgICAgICAgIDsgTm9wZSwgd2UgZG9udCBoYXZlIGZ1bmN0aW9uIDgwMDAwMDAwMWgKLSAgICAgICAgbW92ICAgICBlYXgsODAwMDAwMDFoICAgICAgIDsgU2V0dXAgZXh0ZW5kZWQgZnVuY3Rpb24gODAwMDAwMDAxaAotICAgICAgICBtQ1BVX0lEICAgICAgICAgICAgICAgICAgICAgOyBhbmQgZ2V0IHRoZSBpbmZvcm1hdGlvbgotICAgICAgICB0ZXN0ICAgIGVkeCw4MDAwMDAwMGggICAgICAgOyBCaXQgMzEgaXMgc2V0IGlmIDNETm93ISBwcmVzZW50Ci0gICAgICAgIGp6ICAgICAgQEBGYWlsICAgICAgICAgICAgICA7IE5vcGUsIHdlIGRvbnQgaGF2ZSAzRE5vdyBzdXBwb3J0Ci0gICAgICAgIG1vdiAgICAgZWF4LDEgICAgICAgICAgICAgICA7IFllcCwgd2UgaGF2ZSAzRE5vdyEgc3VwcG9ydCEKLUBARG9uZTogbGVhdmVfYwotICAgICAgICByZXQKLQotQEBGYWlsOiB4b3IgICAgIGVheCxlYXgKLSAgICAgICAgam1wICAgICBAQERvbmUKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWxvbmcgX0NQVV9xdWlja1JEVFNDKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZWFkcyB0aGUgdGltZSBzdGFtcCBjb3VudGVyIGFuZCByZXR1cm5zIHRoZSBsb3cgb3JkZXIgMzItYml0cwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9DUFVfcXVpY2tSRFRTQwotCi0gICAgICAgIG1SRFRTQwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfQ1BVX3J1bkJTRkxvb3AodWxvbmcgaW50ZXJhdGlvbnMpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSdW5zIGEgbG9vcCBvZiBCU0YgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBpdGVyYXRpb25zCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX0NQVV9ydW5CU0ZMb29wCi0KLSAgICAgICAgQVJHICAgICBpdGVyYXRpb25zOlVMT05HCi0KLSAgICAgICAgcHVzaCAgICBfYnAKLSAgICAgICAgbW92ICAgICBfYnAsX3NwCi0gICAgICAgIHB1c2ggICAgX2J4Ci0KLSAgICAgICAgbW92ICAgICBlZHgsW2l0ZXJhdGlvbnNdCi0gICAgICAgIG1vdiAgICAgZWF4LDgwMDAwMDAwaAotICAgICAgICBtb3YgICAgIGVieCxlZHgKLQotICAgICAgICBBTElHTiAgIDQKLQotQEBsb29wOiBic2YgICAgIGVjeCxlYXgKLSAgICAgICAgZGVjICAgICBlYngKLSAgICAgICAgam56ICAgICBAQGxvb3AKLQotICAgICAgICBwb3AgICAgIF9ieAotICAgICAgICBwb3AgICAgIF9icAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCAgX0NQVV9yZWFkVGltZVN0YW1wKENQVV9sYXJnZUludGVnZXIgKnRpbWUpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVhZHMgdGhlIHRpbWUgc3RhbXAgY291bnRlciBhbmQgcmV0dXJucyB0aGUgNjQtYml0IHJlc3VsdC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfQ1BVX3JlYWRUaW1lU3RhbXAKLQotICAgICAgICBtUkRUU0MKLSAgICAgICAgbW92ICAgICBlY3gsW2VzcCs0XSAgICAgOyBBY2Nlc3MgZGlyZWN0bHkgd2l0aG91dCBzdGFjayBmcmFtZQotICAgICAgICBtb3YgICAgIFtlY3hdLGVheAotICAgICAgICBtb3YgICAgIFtlY3grNF0sZWR4Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1bG9uZyBfQ1BVX2RpZmZUaW1lNjQoQ1BVX2xhcmdlSW50ZWdlciAqdDEsQ1BVX2xhcmdlSW50ZWdlciAqdDIsQ1BVX2xhcmdlSW50ZWdlciAqdCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENvbXB1dGVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIDY0LWJpdCBudW1iZXJzLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9DUFVfZGlmZlRpbWU2NAotCi0gICAgICAgIEFSRyAgICAgdDE6RFBUUiwgdDI6RFBUUiwgdDpEUFRSCi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIG1vdiAgICAgZWN4LFt0Ml0KLSAgICAgICAgbW92ICAgICBlYXgsW2VjeF0gICAgICAgOyBFQVggOj0gdDIubG93Ci0gICAgICAgIG1vdiAgICAgZWN4LFt0MV0KLSAgICAgICAgc3ViICAgICBlYXgsW2VjeF0KLSAgICAgICAgbW92ICAgICBlZHgsZWF4ICAgICAgICAgOyBFRFggOj0gbG93IGRpZmZlcmVuY2UKLSAgICAgICAgbW92ICAgICBlY3gsW3QyXQotICAgICAgICBtb3YgICAgIGVheCxbZWN4KzRdICAgICA7IEVDWCA6PSB0Mi5oaWdoCi0gICAgICAgIG1vdiAgICAgZWN4LFt0MV0KLSAgICAgICAgc2JiICAgICBlYXgsW2VjeCs0XSAgICAgOyBFQVggOj0gaGlnaCBkaWZmZXJlbmNlCi0KLSAgICAgICAgbW92ICAgICBlYngsW3RdICAgICAgICAgOyBTdG9yZSB0aGUgcmVzdWx0Ci0gICAgICAgIG1vdiAgICAgW2VieF0sZWR4ICAgICAgIDsgU3RvcmUgbG93IHBhcnQKLSAgICAgICAgbW92ICAgICBbZWJ4KzRdLGVheCAgICAgOyBTdG9yZSBoaWdoIHBhcnQKLSAgICAgICAgbW92ICAgICBlYXgsZWR4ICAgICAgICAgOyBSZXR1cm4gbG93IHBhcnQKLWlmbmRlZiBmbGF0bW9kZWwKLSAgICAgICAgc2hsZCAgICBlZHgsZWF4LDE2ICAgICAgOyBSZXR1cm4gaW4gRFg6QVgKLWVuZGlmCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVsb25nIF9DUFVfY2FsY01pY3JvU2VjKENQVV9sYXJnZUludGVnZXIgKmNvdW50LHVsb25nIGZyZXEpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ29tcHV0ZXMgdGhlIHZhbHVlIGluIG1pY3Jvc2Vjb25kcyBmb3IgdGhlIGVsYXBzZWQgdGltZSB3aXRoIG1heGltdW0KLTsgcHJlY2lzaW9uLiBUaGUgZm9ybXVsYSB3ZSB1c2UgaXM6Ci07Ci07ICAgdXMgPSAoKChkaWZmICogMHgxMDAwMDApIC8gZnJlcSkgKiAxMDAwMDAwKSAvIDB4MTAwMDAwKQotOwotOyBUaGUgcG93ZXIgb2YgdHdvIG11bHRpcGxlIGJlZm9yZSB0aGUgZmlyc3QgZGl2aWRlIGFsbG93cyB1cyB0byBzY2FsZSB0aGUKLTsgNjQtYml0IGRpZmZlcmVuY2UgdXNpbmcgc2ltcGxlIHNoaWZ0cywgYW5kIHRoZW4gdGhlIGRpdmlkZSBicmluZ3MgdGhlCi07IGZpbmFsIHJlc3VsdCBpbnRvIHRoZSByYW5nZSB0byBmaXQgaW50byBhIDMyLWJpdCBpbnRlZ2VyLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9DUFVfY2FsY01pY3JvU2VjCi0KLSAgICAgICAgQVJHICAgICBjb3VudDpEUFRSLCBmcmVxOlVMT05HCi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIG1vdiAgICAgZWN4LFtjb3VudF0KLSAgICAgICAgbW92ICAgICBlYXgsW2VjeF0gICAgICAgOyBFQVggOj0gbG93IHBhcnQKLSAgICAgICAgbW92ICAgICBlZHgsW2VjeCs0XSAgICAgOyBFRFggOj0gaGlnaCBwYXJ0Ci0gICAgICAgIHNobGQgICAgZWR4LGVheCwyMAotICAgICAgICBzaGwgICAgIGVheCwyMCAgICAgICAgICA7IGRpZmYgKiAweDEwMDAwMAotICAgICAgICBkaXYgICAgIFtEV09SRCBmcmVxXSAgICA7IChkaWZmICogMHgxMDAwMDApIC8gZnJlcQotICAgICAgICBtb3YgICAgIGVjeCwxMDAwMDAwCi0gICAgICAgIHhvciAgICAgZWR4LGVkeAotICAgICAgICBtdWwgICAgIGVjeCAgICAgICAgICAgICA7ICgoZGlmZiAqIDB4MTAwMDAwKSAvIGZyZXEpICogMTAwMDAwMCkKLSAgICAgICAgc2hyZCAgICBlYXgsZWR4LDIwICAgICAgOyAoKGRpZmYgKiAweDEwMDAwMCkgLyBmcmVxKSAqIDEwMDAwMDApIC8gMHgxMDAwMDAKLWlmbmRlZiBmbGF0bW9kZWwKLSAgICAgICAgc2hsZCAgICBlZHgsZWF4LDE2ICAgICAgOyBSZXR1cm4gaW4gRFg6QVgKLWVuZGlmCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVsb25nIF9DUFVfbXVsRGl2KHVsb25nIGEsdWxvbmcgYix1bG9uZyBjKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENvbXB1dGVzIHRoZSBmb2xsb3dpbmcgd2l0aCA2NC1iaXQgaW50ZWdlciBwcmVjaXNpb246Ci07Ci07ICAgcmVzdWx0ID0gKGEgKiBiKSAvIGMKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfQ1BVX211bERpdgotCi0gICAgICAgIEFSRyAgICAgYTpVTE9ORywgYjpVTE9ORywgYzpVTE9ORwotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgbW92ICAgICBlYXgsW2FdCi0gICAgICAgIGltdWwgICAgW1VMT05HIGJdCi0gICAgICAgIGlkaXYgICAgW1VMT05HIGNdCi1pZm5kZWYgZmxhdG1vZGVsCi0gICAgICAgIHNobGQgICAgZWR4LGVheCwxNiAgICAgIDsgUmV0dXJuIGluIERYOkFYCi1lbmRpZgotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi1lbmRjb2Rlc2VnICBfY3B1aW5mbwotCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19kbWEuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19kbWEuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjZlMWU4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9fZG1hLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi07KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi07KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLTsqCi07KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLTsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsqCi07KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KgotOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqIExhbmd1YWdlOiAgICA4MDM4NiBBc3NlbWJsZXIsIFRBU00gNC4wIG9yIE5BU00KLTsqIEVudmlyb25tZW50OiAxNi8zMiBiaXQgUmluZyAwIGRldmljZSBkcml2ZXIKLTsqCi07KiBEZXNjcmlwdGlvbjogQXNzZW1ibGVyIHN1cHBvcnQgcm91dGluZXMgZm9yIElTQSBETUEgY29udHJvbGxlci4KLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIElERUFMCi0KLWluY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgOyBNZW1vcnkgbW9kZWwgbWFjcm9zCi0KLWhlYWRlciAgICAgIF9kbWEgICAgICAgICAgICAgICAgOyBTZXQgdXAgbWVtb3J5IG1vZGVsCi0KLWJlZ2RhdGFzZWcgIF9kbWEgICAgICAgICAgICAgICAgOyBTdGFydCBvZiBkYXRhIHNlZ21lbnQKLQotY3B1YmxpYyBfUE1fRE1BRGF0YVN0YXJ0Ci0KLTsgRE1BIHJlZ2lzdGVyIEkvTyBhZGRyZXNzZXMgZm9yIGNoYW5uZWxzIDAtNyAoZXhjZXB0IDQpCi0KLURNQUNfcGFnZSAgICAgICBkYiAwODdoLDA4M2gsMDgxaCwwODJoLCAtMSwwOEJoLDA4OWgsMDhBaAotRE1BQ19hZGRyICAgICAgIGRiIDAwMGgsMDAyaCwwMDRoLDAwNmgsIC0xLDBDNGgsMEM4aCwwQ0NoCi1ETUFDX2NudCAgICAgICAgZGIgMDAxaCwwMDNoLDAwNWgsMDA3aCwgLTEsMEM2aCwwQ0FoLDBDRWgKLURNQUNfbWFzayAgICAgICBkYiAwMEFoLDAwQWgsMDBBaCwwMEFoLCAtMSwwRDRoLDBENGgsMEQ0aAotRE1BQ19tb2RlICAgICAgIGRiIDAwQmgsMDBCaCwwMEJoLDAwQmgsIC0xLDBENmgsMEQ2aCwwRDZoCi1ETUFDX0ZGICAgICAgICAgZGIgMDBDaCwwMENoLDAwQ2gsMDBDaCwgLTEsMEQ4aCwwRDhoLDBEOGgKLQotY3B1YmxpYyBfUE1fRE1BRGF0YUVuZAotCi1lbmRkYXRhc2VnICBfZG1hCi0KLWJlZ2NvZGVzZWcgIF9kbWEgICAgICAgICAgICAgICAgOyBTdGFydCBvZiBjb2RlIHNlZ21lbnQKLQotaWZkZWYgICBmbGF0bW9kZWwKLQotY3B1YmxpYyBfUE1fRE1BQ29kZVN0YXJ0Ci0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fRE1BQ0Rpc2FibGUoaW50IGNoYW5uZWwpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTWFza3MgRE1BIGNoYW5uZWwsIGluaGliaXRpbmcgRE1BIHRyYW5zZmVycwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX0RNQUNEaXNhYmxlCi0KLSAgICAgICAgQVJHICAgICBjaGFubmVsOlVJTlQKLQotICAgICAgICBwdXNoICAgIGVicAotICAgICAgICBtb3YgICAgIGVicCxlc3AKLSAgICAgICAgbW92ICAgICBlY3gsW2NoYW5uZWxdICAgICAgIDsgRUNYIGluZGV4ZXMgRE1BQyByZWdpc3RlciB0YWJsZXMKLSAgICAgICAgbW92ICAgICBkaCwwICAgICAgICAgICAgICAgIDsgREggPSAwIGZvciBETUFDIHJlZ2lzdGVyIHBvcnQgYWNjZXNzCi0gICAgICAgIG1vdiAgICAgYWwsY2wKLSAgICAgICAgYW5kICAgICBhbCwxMWIKLSAgICAgICAgb3IgICAgICBhbCwxMDBiICAgICAgICAgICAgIDsgQUwgPSAoY2hhbm5lbCAmIDMpIHwgInNldCBtYXNrIGJpdCIKLSAgICAgICAgbW92ICAgICBkbCxbRE1BQ19tYXNrK2VjeF0KLSAgICAgICAgb3V0ICAgICBkeCxhbAotICAgICAgICBwb3AgICAgIGVicAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBQTV9ETUFDRW5hYmxlKGludCBjaGFubmVsKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFVubWFza3MgRE1BIGNoYW5uZWwsIGVuYWJsaW5nIERNQSB0cmFuc2ZlcnMKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9ETUFDRW5hYmxlCi0KLSAgICAgICAgQVJHICAgICBjaGFubmVsOlVJTlQKLQotICAgICAgICBwdXNoICAgIGVicAotICAgICAgICBtb3YgICAgIGVicCxlc3AKLSAgICAgICAgbW92ICAgICBlY3gsW2NoYW5uZWxdICAgICAgIDsgRUNYIGluZGV4ZXMgRE1BQyByZWdpc3RlciB0YWJsZXMKLSAgICAgICAgbW92ICAgICBkaCwwICAgICAgICAgICAgICAgIDsgREggPSAwIGZvciBETUFDIHJlZ2lzdGVyIHBvcnQgYWNjZXNzCi0gICAgICAgIG1vdiAgICAgYWwsY2wKLSAgICAgICAgYW5kICAgICBhbCwxMWIgICAgICAgICAgICAgIDsgQUwgPSAoY2hhbm5lbCAmIDMpLCAic2V0IG1hc2sgYml0Ij0wCi0gICAgICAgIG1vdiAgICAgZGwsW0RNQUNfbWFzaytlY3hdCi0gICAgICAgIG91dCAgICAgZHgsYWwKLSAgICAgICAgcG9wICAgICBlYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fRE1BQ1Byb2dyYW0oaW50IGNoYW5uZWwsaW50IG1vZGUsdWxvbmcgYnVmZmVyUGh5cyxpbnQgY291bnQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUHVycG9zZTogUHJvZ3JhbSBETUEgY29udHJvbGxlciB0byBwZXJmb3JtIHRyYW5zZmVyIGZyb20gZmlyc3QgMTZNQgotOyBiYXNlZCBvbiBwcmV2aW91c2x5IHNlbGVjdGVkIG1vZGUgYW5kIGNoYW5uZWwuIERNQSB0cmFuc2ZlciBtYXkgYmUgZW5hYmxlZAotOyBieSBzdWJzZXF1ZW50IGNhbGwgdG8gUE1fRE1BQ0VuYWJsZS4KLTsKLTsgRW50cnk6ICAgIGNoYW5uZWwgLSBETUEgY2hhbm5lbCBpbiB1c2UgKDAtNykKLTsgICAgICAgICAgIG1vZGUgICAgLSBTZWxlY3RlZCBETUFNT0RFIHR5cGUgZm9yIHRyYW5zZmVyCi07ICAgICAgICAgICBidWZmZXIgIC0gMzItYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgRE1BIGJ1ZmZlcgotOyAgICAgICAgICAgY291bnQgICAtIERNQSBieXRlIGNvdW50ICgxLTY1NTM2IGJ5dGVzKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX0RNQUNQcm9ncmFtCi0KLSAgICAgICAgQVJHICAgICBjaGFubmVsOlVJTlQsIG1vZGU6VUlOVCwgYnVmZmVyUGh5czpVTE9ORywgY291bnQ6VUlOVAotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgcHVzaGZkCi0gICAgICAgIGNsaSAgICAgICAgICAgICAgICAgICAgICAgICA7IERpc2FibGUgaW50ZXJydXB0cwotCi07IE1hc2sgRE1BIGNoYW5uZWwgdG8gZGlzYWJsZSBpdAotCi0gICAgICAgIG1vdiAgICAgZWJ4LFtjaGFubmVsXSAgICAgICA7IEVCWCBpbmRleGVzIERNQUMgcmVnaXN0ZXIgdGFibGVzCi0gICAgICAgIG1vdiAgICAgZGgsMCAgICAgICAgICAgICAgICA7IERIID0gMCBmb3IgRE1BQyByZWdpc3RlciBwb3J0IGFjY2VzcwotICAgICAgICBtb3YgICAgIGFsLGJsCi0gICAgICAgIGFuZCAgICAgYWwsMTFiCi0gICAgICAgIG9yICAgICAgYWwsMTAwYiAgICAgICAgICAgICA7IEFMID0gKGNoYW5uZWwgJiAzKSB8ICJzZXQgbWFzayBiaXQiCi0gICAgICAgIG1vdiAgICAgZGwsW0RNQUNfbWFzaytlYnhdCi0gICAgICAgIG91dCAgICAgZHgsYWwKLQotOyBHZW5lcmF0ZSBJT1cgdG8gY2xlYXIgRkYgdG9nZ2xlIHN0YXRlCi0KLSAgICAgICAgbW92ICAgICBhbCwwCi0gICAgICAgIG1vdiAgICAgZGwsW0RNQUNfRkYrZWJ4XQotICAgICAgICBvdXQgICAgIGR4LGFsCi0KLTsgQ29tcHV0ZSBidWZmZXIgYWRkcmVzcyB0byBwcm9ncmFtCi0KLSAgICAgICAgbW92ICAgICBlYXgsW2J1ZmZlclBoeXNdICAgIDsgQVggOj0gRE1BIGFkZHJlc3Mgb2Zmc2V0Ci0gICAgICAgIG1vdiAgICAgZWN4LGVheAotICAgICAgICBzaHIgICAgIGVjeCwxNiAgICAgICAgICAgICAgOyBDTCA6PSBidWZmZXJQaHlzID4+IDE2IChETUEgcGFnZSkKLSAgICAgICAgbW92ICAgICBlc2ksW2NvdW50XSAgICAgICAgIDsgRVNJID0gIyBvZiBieXRlcyB0byB0cmFuc2ZlcgotICAgICAgICBjbXAgICAgIGVieCw0ICAgICAgICAgICAgICAgOyAxNi1iaXQgY2hhbm5lbD8KLSAgICAgICAgamIgICAgICBAQFdyaXRlRE1BQyAgICAgICAgIDsgTm8sIHByb2dyYW0gRE1BQwotICAgICAgICBzaHIgICAgIGVheCwxICAgICAgICAgICAgICAgOyBZZXMsIGNvbnZlcnQgYWRkcmVzcyBhbmQgY291bnQKLSAgICAgICAgc2hyICAgICBlc2ksMSAgICAgICAgICAgICAgIDsgdG8gMTYtYml0LCAxMjhLL3BhZ2UgZm9ybWF0Ci0KLTsgU2V0IHRoZSBETUEgYWRkcmVzcyB3b3JkIChiaXRzIDAtMTUpCi0KLUBAV3JpdGVETUFDOgotICAgICAgICBtb3YgICAgIGRsLFtETUFDX2FkZHIrZWJ4XQotICAgICAgICBvdXQgICAgIGR4LGFsCi0gICAgICAgIG1vdiAgICAgYWwsYWgKLSAgICAgICAgb3V0ICAgICBkeCxhbAotCi07IFNldCBETUEgdHJhbnNmZXIgY291bnQKLQotICAgICAgICBtb3YgICAgIGVheCxlc2kKLSAgICAgICAgZGVjICAgICBlYXggICAgICAgICAgICAgICAgIDsgRVNJID0gIyBvZiBieXRlcyB0byB0cmFuc2ZlciAtIDEKLSAgICAgICAgbW92ICAgICBkbCxbRE1BQ19jbnQrZWJ4XQotICAgICAgICBvdXQgICAgIGR4LGFsCi0gICAgICAgIG1vdiAgICAgYWwsYWgKLSAgICAgICAgb3V0ICAgICBkeCxhbAotCi07IFNldCBETUEgcGFnZSBieXRlIChiaXRzIDE2LTIzKQotCi0gICAgICAgIG1vdiAgICAgYWwsY2wKLSAgICAgICAgbW92ICAgICBkbCxbRE1BQ19wYWdlK2VieF0KLSAgICAgICAgb3V0ICAgICBkeCxhbAotCi07IFNldCB0aGUgRE1BIGNoYW5uZWwgbW9kZQotCi0gICAgICAgIG1vdiAgICAgYWwsYmwKLSAgICAgICAgYW5kICAgICBhbCwxMWIKLSAgICAgICAgb3IgICAgICBhbCxbQllURSBtb2RlXSAgICAgIDsgRUFYID0gKGNoYW5uZWwgJiAzKSB8IG1vZGUKLSAgICAgICAgbW92ICAgICBkbCxbRE1BQ19tb2RlK2VieF0KLSAgICAgICAgb3V0ICAgICBkeCxhbAotCi0gICAgICAgIHBvcCAgICAgZWF4ICAgICAgICAgICAgICAgICA7IFNNUCBzYWZlIGludGVycnVwdCBzdGF0ZSByZXN0b3JlIQotICAgICAgICB0ZXN0ICAgIGVheCwyMDBoCi0gICAgICAgIGp6ICAgICAgQEAxCi0gICAgICAgIHN0aQotQEAxOiAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1bG9uZyBQTUFQSSBQTV9ETUFDUG9zaXRpb24oaW50IGNoYW5uZWwpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmV0dXJucyB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBhIGRtYSB0cmFuc2Zlci4gSW50ZXJydXB0cyBzaG91bGQgYmUKLTsgZGlzYWJsZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9ETUFDUG9zaXRpb24KLQotICAgICAgICBBUkcgICAgIGNoYW5uZWw6VUlOVAotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgbW92ICAgICBlY3gsW2NoYW5uZWxdICAgICAgIDsgRUNYIGluZGV4ZXMgRE1BQyByZWdpc3RlciB0YWJsZXMKLSAgICAgICAgbW92ICAgICBkaCwwICAgICAgICAgICAgICAgIDsgREggPSAwIGZvciBETUFDIHJlZ2lzdGVyIHBvcnQgYWNjZXNzCi0KLTsgR2VuZXJhdGUgSU9XIHRvIGNsZWFyIEZGIHRvZ2dsZSBzdGF0ZQotCi0gICAgICAgIG1vdiAgICAgYWwsMAotICAgICAgICBtb3YgICAgIGRsLFtETUFDX0ZGK2VieF0KLSAgICAgICAgb3V0ICAgICBkeCxhbAotICAgICAgICB4b3IgICAgIGVheCxlYXgKLSAgICAgICAgeG9yICAgICBlY3gsZWN4Ci0KLTsgTm93IHJlYWQgdGhlIGN1cnJlbnQgcG9zaXRpb24gZm9yIHRoZSBjaGFubmVsCi0KLUBAUmVhZExvb3A6Ci0gICAgICAgIG1vdiAgICAgZGwsW0RNQUNfY250K2VieF0KLSAgICAgICAgb3V0ICAgICBkeCxhbAotICAgICAgICBpbiAgICAgIGFsLGR4Ci0gICAgICAgIG1vdiAgICAgY2wsYWwKLSAgICAgICAgaW4gICAgICBhbCxkeAotICAgICAgICBtb3YgICAgIGNoLGFsICAgICAgICAgICAgICAgOyBFQ1ggOj0gZmlyc3QgY291bnQgcmVhZAotICAgICAgICBpbiAgICAgIGFsLGR4Ci0gICAgICAgIG1vdiAgICAgYWgsYWwKLSAgICAgICAgaW4gICAgICBhbCxkeAotICAgICAgICB4Y2hnICAgIGFsLGFoICAgICAgICAgICAgICAgOyBFQVggOj0gc2Vjb25kIGNvdW50IHJlYWQKLSAgICAgICAgc3ViICAgICBlY3gsZWF4Ci0gICAgICAgIGNtcCAgICAgZWN4LDQwaAotICAgICAgICBqZyAgICAgIEBAUmVhZExvb3AKLSAgICAgICAgY21wICAgICBlYngsNCAgICAgICAgICAgICAgIDsgMTYtYml0IGNoYW5uZWw/Ci0gICAgICAgIGpiICAgICAgQEBFeGl0ICAgICAgICAgICAgICA7IE5vLCB3ZSBhcmUgZG9uZQotICAgICAgICBzaGwgICAgIGVheCwxICAgICAgICAgICAgICAgOyBZZXMsIGFkanVzdCB0byBieXRlIGFkZHJlc3MKLQotQEBFeGl0OiBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi0KLWNwdWJsaWMgX1BNX0RNQUNvZGVFbmQKLQotZW5kaWYKLQotZW5kY29kZXNlZyAgX2RtYQotCi0gICAgICAgIEVORCAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19pbnQ2NC5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vX2ludDY0LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRlYzFiNS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vX2ludDY0LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi07KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi07KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLTsqCi07KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLTsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsqCi07KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KgotOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqIExhbmd1YWdlOiAgICBOQVNNIG9yIFRBU00gQXNzZW1ibGVyCi07KiBFbnZpcm9ubWVudDogSW50ZWwgMzIgYml0IFByb3RlY3RlZCBNb2RlLgotOyoKLTsqIERlc2NyaXB0aW9uOiBDb2RlIGZvciA2NC1iaXQgYXJoaXRobWV0aWMKLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIElERUFMCi0KLWluY2x1ZGUgInNjaXRlY2gubWFjIgotCi1oZWFkZXIgICAgICBfaW50NjQKLQotYmVnY29kZXNlZyAgX2ludDY0ICAgICAgICAgICAgICAgICAgOyBTdGFydCBvZiBjb2RlIHNlZ21lbnQKLQotYV9sb3cgICAgICAgRVFVIDA0aCAgICAgICAgICAgICAgICAgOyBBY2Nlc3MgYV9sb3cgZGlyZWN0bHkgb24gc3RhY2sKLWFfaGlnaCAgICAgIEVRVSAwOGggICAgICAgICAgICAgICAgIDsgQWNjZXNzIGFfaGlnaCBkaXJlY3RseSBvbiBzdGFjawotYl9sb3cgICAgICAgRVFVIDBDaCAgICAgICAgICAgICAgICAgOyBBY2Nlc3MgYl9sb3cgZGlyZWN0bHkgb24gc3RhY2sKLXNoaWZ0ICAgICAgIEVRVSAwQ2ggICAgICAgICAgICAgICAgIDsgQWNjZXNzIHNoaWZ0IGRpcmVjdGx5IG9uIHN0YWNrCi1yZXN1bHRfMiAgICBFUVUgMENoICAgICAgICAgICAgICAgICA7IEFjY2VzcyByZXN1bHQgZGlyZWN0bHkgb24gc3RhY2sKLWJfaGlnaCAgICAgIEVRVSAxMGggICAgICAgICAgICAgICAgIDsgQWNjZXNzIGJfaGlnaCBkaXJlY3RseSBvbiBzdGFjawotcmVzdWx0XzMgICAgRVFVIDEwaCAgICAgICAgICAgICAgICAgOyBBY2Nlc3MgcmVzdWx0IGRpcmVjdGx5IG9uIHN0YWNrCi1yZXN1bHRfNCAgICBFUVUgMTRoICAgICAgICAgICAgICAgICA7IEFjY2VzcyByZXN1bHQgZGlyZWN0bHkgb24gc3RhY2sKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfUE1fYWRkNjQodTMyIGFfbG93LHUzMiBhX2hpZ2gsdTMyIGJfbG93LHUzMiBiX2hpZ2gsX191NjQgKnJlc3VsdCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBBZGRzIHR3byA2NC1iaXQgbnVtYmVycy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fYWRkNjQKLQotICAgICAgICBtb3YgICAgIGVheCxbZXNwK2FfbG93XQotICAgICAgICBhZGQgICAgIGVheCxbZXNwK2JfbG93XQotICAgICAgICBtb3YgICAgIGVkeCxbZXNwK2FfaGlnaF0KLSAgICAgICAgYWRjICAgICBlZHgsW2VzcCtiX2hpZ2hdCi0gICAgICAgIG1vdiAgICAgZWN4LFtlc3ArcmVzdWx0XzRdCi0gICAgICAgIG1vdiAgICAgW2VjeF0sZWF4Ci0gICAgICAgIG1vdiAgICAgW2VjeCs0XSxlZHgKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgX1BNX3N1YjY0KHUzMiBhX2xvdyx1MzIgYV9oaWdoLHUzMiBiX2xvdyx1MzIgYl9oaWdoLF9fdTY0ICpyZXN1bHQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgU3VidHJhY3RzIHR3byA2NC1iaXQgbnVtYmVycy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fc3ViNjQKLQotICAgICAgICBtb3YgICAgIGVheCxbZXNwK2FfbG93XQotICAgICAgICBzdWIgICAgIGVheCxbZXNwK2JfbG93XQotICAgICAgICBtb3YgICAgIGVkeCxbZXNwK2FfaGlnaF0KLSAgICAgICAgc2JiICAgICBlZHgsW2VzcCtiX2hpZ2hdCi0gICAgICAgIG1vdiAgICAgZWN4LFtlc3ArcmVzdWx0XzRdCi0gICAgICAgIG1vdiAgICAgW2VjeF0sZWF4Ci0gICAgICAgIG1vdiAgICAgW2VjeCs0XSxlZHgKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgX1BNX211bDY0KHUzMiBhX2hpZ2gsdTMyIGFfbG93LHUzMiBiX2hpZ2gsdTMyIGJfbG93LF9fdTY0ICpyZXN1bHQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTXVsdGlwbGVzIHR3byA2NC1iaXQgbnVtYmVycy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fbXVsNjQKLQotICAgICAgICBtb3YgICAgIGVheCxbZXNwK2FfaGlnaF0KLSAgICAgICAgbW92ICAgICBlY3gsW2VzcCtiX2hpZ2hdCi0gICAgICAgIG9yICAgICAgZWN4LGVheAotICAgICAgICBtb3YgICAgIGVjeCxbZXNwK2JfbG93XQotICAgICAgICBqbnogICAgIEBARnVsbE11bHRpcGx5Ci0gICAgICAgIG1vdiAgICAgZWF4LFtlc3ArYV9sb3ddICAgICAgICAgOyBFRFg6RUFYID0gYi5sb3cgKiBhLmxvdwotICAgICAgICBtdWwgICAgIGVjeAotICAgICAgICBtb3YgICAgIGVjeCxbZXNwK3Jlc3VsdF80XQotICAgICAgICBtb3YgICAgIFtlY3hdLGVheAotICAgICAgICBtb3YgICAgIFtlY3grNF0sZWR4Ci0gICAgICAgIHJldAotCi1AQEZ1bGxNdWx0aXBseToKLSAgICAgICAgcHVzaCAgICBlYngKLSAgICAgICAgbXVsICAgICBlY3ggICAgICAgICAgICAgICAgICAgICA7IEVEWDpFQVggPSBhLmhpZ2ggKiBiLmxvdwotICAgICAgICBtb3YgICAgIGVieCxlYXgKLSAgICAgICAgbW92ICAgICBlYXgsW2VzcCthX2xvdys0XQotICAgICAgICBtdWwgICAgIFtEV09SRCBlc3ArYl9oaWdoKzRdICAgIDsgRURYOkVBWCA9IGIuaGlnaCAqIGEubG93Ci0gICAgICAgIGFkZCAgICAgZWJ4LGVheAotICAgICAgICBtb3YgICAgIGVheCxbZXNwK2FfbG93KzRdCi0gICAgICAgIG11bCAgICAgZWN4ICAgICAgICAgICAgICAgICAgICAgOyBFRFg6RUFYID0gYS5sb3cgKiBiLmxvdwotICAgICAgICBhZGQgICAgIGVkeCxlYngKLSAgICAgICAgcG9wICAgICBlYngKLSAgICAgICAgbW92ICAgICBlY3gsW2VzcCtyZXN1bHRfNF0KLSAgICAgICAgbW92ICAgICBbZWN4XSxlYXgKLSAgICAgICAgbW92ICAgICBbZWN4KzRdLGVkeAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfUE1fZGl2NjQodTMyIGFfbG93LHUzMiBhX2hpZ2gsdTMyIGJfbG93LHUzMiBiX2hpZ2gsX191NjQgKnJlc3VsdCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBEaXZpZGVzIHR3byA2NC1iaXQgbnVtYmVycy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fZGl2NjQKLQotICAgICAgICBwdXNoICAgIGVkaQotICAgICAgICBwdXNoICAgIGVzaQotICAgICAgICBwdXNoICAgIGVieAotICAgICAgICB4b3IgICAgIGVkaSxlZGkKLSAgICAgICAgbW92ICAgICBlYXgsW2VzcCthX2hpZ2grMENoXQotICAgICAgICBvciAgICAgIGVheCxlYXgKLSAgICAgICAgam5zICAgICBAQEFOb3ROZWcKLQotOyBEaXZpZGVuZCBpcyBuZWdhdGl2ZSwgc28gbmVnYXRlIGl0IGFuZCBzYXZlIHJlc3VsdCBmb3IgbGF0ZXIKLQotICAgICAgICBpbmMgICAgIGVkaQotICAgICAgICBtb3YgICAgIGVkeCxbZXNwK2FfbG93KzBDaF0KLSAgICAgICAgbmVnICAgICBlYXgKLSAgICAgICAgbmVnICAgICBlZHgKLSAgICAgICAgc2JiICAgICBlYXgsMAotICAgICAgICBtb3YgICAgIFtlc3ArYV9oaWdoKzBDaF0sZWF4Ci0gICAgICAgIG1vdiAgICAgW2VzcCthX2xvdyswQ2hdLGVkeAotCi1AQEFOb3ROZWc6Ci0gICAgICAgIG1vdiAgICAgZWF4LFtlc3ArYl9oaWdoKzBDaF0KLSAgICAgICAgb3IgICAgICBlYXgsZWF4Ci0gICAgICAgIGpucyAgICAgQEBCTm90TmVnCi0KLTsgRGl2aXNvciBpcyBuZWdhdGl2ZSwgc28gbmVnYXRlIGl0IGFuZCBzYXZlIHJlc3VsdCBmb3IgbGF0ZXIKLQotICAgICAgICBpbmMgICAgIGVkaQotICAgICAgICBtb3YgICAgIGVkeCxbZXNwK2JfbG93KzBDaF0KLSAgICAgICAgbmVnICAgICBlYXgKLSAgICAgICAgbmVnICAgICBlZHgKLSAgICAgICAgc2JiICAgICBlYXgsMAotICAgICAgICBtb3YgICAgIFtlc3ArYl9oaWdoKzBDaF0sZWF4Ci0gICAgICAgIG1vdiAgICAgW2VzcCtiX2xvdyswQ2hdLGVkeAotCi1AQEJOb3ROZWc6Ci0gICAgICAgIG9yICAgICAgZWF4LGVheAotICAgICAgICBqbnogICAgIEBAQkhpZ2hOb3RaZXJvCi0KLTsgYi5oaWdoIGlzIHplcm8sIHNvIGhhbmRsZSB0aGlzIGZhc3RlcgotCi0gICAgICAgIG1vdiAgICAgZWN4LFtlc3ArYl9sb3crMENoXQotICAgICAgICBtb3YgICAgIGVheCxbZXNwK2FfaGlnaCswQ2hdCi0gICAgICAgIHhvciAgICAgZWR4LGVkeAotICAgICAgICBkaXYgICAgIGVjeAotICAgICAgICBtb3YgICAgIGVieCxlYXgKLSAgICAgICAgbW92ICAgICBlYXgsW2VzcCthX2xvdyswQ2hdCi0gICAgICAgIGRpdiAgICAgZWN4Ci0gICAgICAgIG1vdiAgICAgZWR4LGVieAotICAgICAgICBqbXAgICAgIEBAQkhpZ2haZXJvCi0KLUBAQkhpZ2hOb3RaZXJvOgotICAgICAgICBtb3YgICAgIGVieCxlYXgKLSAgICAgICAgbW92ICAgICBlY3gsW2VzcCtiX2xvdyswQ2hdCi0gICAgICAgIG1vdiAgICAgZWR4LFtlc3ArYV9oaWdoKzBDaF0KLSAgICAgICAgbW92ICAgICBlYXgsW2VzcCthX2xvdyswQ2hdCi0KLTsgU2hpZnQgdmFsdWVzIHJpZ2h0IHVudGlsIGIuaGlnaCBiZWNvbWVzIHplcm8KLQotQEBTaGlmdExvb3A6Ci0gICAgICAgIHNociAgICAgZWJ4LDEKLSAgICAgICAgcmNyICAgICBlY3gsMQotICAgICAgICBzaHIgICAgIGVkeCwxCi0gICAgICAgIHJjciAgICAgZWF4LDEKLSAgICAgICAgb3IgICAgICBlYngsZWJ4Ci0gICAgICAgIGpueiAgICAgQEBTaGlmdExvb3AKLQotOyBOb3cgY29tcGxldGUgdGhlIGRpdmlkZSBwcm9jZXNzCi0KLSAgICAgICAgZGl2ICAgICBlY3gKLSAgICAgICAgbW92ICAgICBlc2ksZWF4Ci0gICAgICAgIG11bCAgICAgW0RXT1JEIGVzcCtiX2hpZ2grMENoXQotICAgICAgICBtb3YgICAgIGVjeCxlYXgKLSAgICAgICAgbW92ICAgICBlYXgsW2VzcCtiX2xvdyswQ2hdCi0gICAgICAgIG11bCAgICAgZXNpCi0gICAgICAgIGFkZCAgICAgZWR4LGVjeAotICAgICAgICBqYiAgICAgIEBAOAotICAgICAgICBjbXAgICAgIGVkeCxbZXNwK2FfaGlnaCswQ2hdCi0gICAgICAgIGphICAgICAgQEA4Ci0gICAgICAgIGpiICAgICAgQEA5Ci0gICAgICAgIGNtcCAgICAgZWF4LFtlc3ArYV9sb3crMENoXQotICAgICAgICBqYmUgICAgIEBAOQotQEA4OiAgICBkZWMgICAgIGVzaQotQEA5OiAgICB4b3IgICAgIGVkeCxlZHgKLSAgICAgICAgbW92ICAgICBlYXgsZXNpCi0KLUBAQkhpZ2haZXJvOgotICAgICAgICBkZWMgICAgIGVkaQotICAgICAgICBqbnogICAgIEBARG9uZQotCi07IFRoZSByZXN1bHQgbmVlZHMgdG8gYmUgbmVnYXRlZCBhcyBlaXRoZXIgYSBvciBiIHdhcyBuZWdhdGl2ZQotCi0gICAgICAgIG5lZyAgICAgZWR4Ci0gICAgICAgIG5lZyAgICAgZWF4Ci0gICAgICAgIHNiYiAgICAgZWR4LDAKLQotQEBEb25lOiBwb3AgICAgIGVieAotICAgICAgICBwb3AgICAgIGVzaQotICAgICAgICBwb3AgICAgIGVkaQotICAgICAgICBtb3YgICAgIGVjeCxbZXNwK3Jlc3VsdF80XQotICAgICAgICBtb3YgICAgIFtlY3hdLGVheAotICAgICAgICBtb3YgICAgIFtlY3grNF0sZWR4Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBfX2k2NCBfUE1fc2hyNjQodTMyIGFfbG93LHMzMiBhX2hpZ2gsczMyIHNoaWZ0LF9fdTY0ICpyZXN1bHQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgU2hpZnQgYSA2NC1iaXQgbnVtYmVyIHJpZ2h0Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX3NocjY0Ci0KLSAgICAgICAgbW92ICAgICBlYXgsW2VzcCthX2xvd10KLSAgICAgICAgbW92ICAgICBlZHgsW2VzcCthX2hpZ2hdCi0gICAgICAgIG1vdiAgICAgY2wsW2VzcCtzaGlmdF0KLSAgICAgICAgc2hyZCAgICBlZHgsZWF4LGNsCi0gICAgICAgIG1vdiAgICAgZWN4LFtlc3ArcmVzdWx0XzNdCi0gICAgICAgIG1vdiAgICAgW2VjeF0sZWF4Ci0gICAgICAgIG1vdiAgICAgW2VjeCs0XSxlZHgKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IF9faTY0IF9QTV9zYXI2NCh1MzIgYV9sb3csczMyIGFfaGlnaCxzMzIgc2hpZnQsX191NjQgKnJlc3VsdCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBTaGlmdCBhIDY0LWJpdCBudW1iZXIgcmlnaHQgKHNpZ25lZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fc2FyNjQKLQotICAgICAgICBtb3YgICAgIGVheCxbZXNwK2FfbG93XQotICAgICAgICBtb3YgICAgIGVkeCxbZXNwK2FfaGlnaF0KLSAgICAgICAgbW92ICAgICBjbCxbZXNwK3NoaWZ0XQotICAgICAgICBzYXIgICAgIGVkeCxjbAotICAgICAgICByY3IgICAgIGVheCxjbAotICAgICAgICBtb3YgICAgIGVjeCxbZXNwK3Jlc3VsdF8zXQotICAgICAgICBtb3YgICAgIFtlY3hdLGVheAotICAgICAgICBtb3YgICAgIFtlY3grNF0sZWR4Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBfX2k2NCBfUE1fc2hsNjQodTMyIGFfbG93LHMzMiBhX2hpZ2gsczMyIHNoaWZ0LF9fdTY0ICpyZXN1bHQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgU2hpZnQgYSA2NC1iaXQgbnVtYmVyIGxlZnQKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fc2hsNjQKLQotICAgICAgICBtb3YgICAgIGVheCxbZXNwK2FfbG93XQotICAgICAgICBtb3YgICAgIGVkeCxbZXNwK2FfaGlnaF0KLSAgICAgICAgbW92ICAgICBjbCxbZXNwK3NoaWZ0XQotICAgICAgICBzaGxkICAgIGVkeCxlYXgsY2wKLSAgICAgICAgbW92ICAgICBlY3gsW2VzcCtyZXN1bHRfM10KLSAgICAgICAgbW92ICAgICBbZWN4XSxlYXgKLSAgICAgICAgbW92ICAgICBbZWN4KzRdLGVkeAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgX19pNjQgX1BNX25lZzY0KHUzMiBhX2xvdyxzMzIgYV9oaWdoLF9fdTY0ICpyZXN1bHQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgU2hpZnQgYSA2NC1iaXQgbnVtYmVyIGxlZnQKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fbmVnNjQKLQotICAgICAgICBtb3YgICAgIGVheCxbZXNwK2FfbG93XQotICAgICAgICBtb3YgICAgIGVkeCxbZXNwK2FfaGlnaF0KLSAgICAgICAgbmVnICAgICBlYXgKLSAgICAgICAgbmVnICAgICBlZHgKLSAgICAgICAgc2JiICAgICBlYXgsMAotICAgICAgICBtb3YgICAgIGVjeCxbZXNwK3Jlc3VsdF8yXQotICAgICAgICBtb3YgICAgIFtlY3hdLGVheAotICAgICAgICBtb3YgICAgIFtlY3grNF0sZWR4Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi0KLWVuZGNvZGVzZWcgIF9pbnQ2NAotCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19qb3kuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19qb3kuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmYxZWNmLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9fam95LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi07KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi07KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLTsqCi07KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLTsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsqCi07KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KgotOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqIExhbmd1YWdlOiAgICA4MDM4NiBBc3NlbWJsZXIKLTsqIEVudmlyb25tZW50OiBJbnRlbCB4ODYsIGFueSBPUwotOyoKLTsqIERlc2NyaXB0aW9uOiBBc3NlbWJseSBsYW5ndWFnZSBzdXBwb3J0IHJvdXRpbmVzIGZvciByZWFkaW5nIGFuYWxvZ3VlCi07KiAgICAgICAgICAgICAgam95c3RpY2tzLgotOyoKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgaWRlYWwKLQotaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKLQotaWZkZWYgZmxhdG1vZGVsCi0KLWhlYWRlciAgX2pveSAgICAgICAgICAgICAgICAgICAgOyBTZXQgdXAgbWVtb3J5IG1vZGVsCi0KLWJlZ2NvZGVzZWcgIF9qb3kgICAgICAgICAgICAgICAgOyBTdGFydCBvZiBjb2RlIHNlZ21lbnQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW5pdFRpbWVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBTZXRzIHVwIDgyNTMgdGltZXIgMiAoUEMgc3BlYWtlcikgdG8gc3RhcnQgdGltaW5nLCBidXQgbm90IHByb2R1Y2Ugb3V0cHV0LgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhdGljIGluaXRUaW1lcgotCi07IFN0YXJ0IHRpbWVyIDIgY291bnRpbmcKLQotICAgICAgICBpbiAgICAgIGFsLDYxaAotICAgICAgICBhbmQgICAgIGFsLDBGRGggICAgICAgICAgICAgOyBEaXNhYmxlIHNwZWFrZXIgb3V0cHV0IChqdXN0IGluIGNhc2UpCi0gICAgICAgIG9yICAgICAgYWwsMQotICAgICAgICBvdXQgICAgIDYxaCxhbAotCi07IFNldCB0aGUgdGltZXIgMiBjb3VudCB0byAwIGFnYWluIHRvIHN0YXJ0IHRoZSB0aW1pbmcgaW50ZXJ2YWwuCi0KLSAgICAgICAgbW92ICAgICBhbCwxMDExMDEwMGIgICAgICAgIDsgc2V0IHVwIHRvIGxvYWQgaW5pdGlhbCAodGltZXIgMikKLSAgICAgICAgb3V0ICAgICA0M2gsYWwgICAgICAgICAgICAgIDsgdGltZXIgY291bnQKLSAgICAgICAgc3ViICAgICBhbCxhbAotICAgICAgICBvdXQgICAgIDQyaCxhbCAgICAgICAgICAgICAgOyBsb2FkIGNvdW50IGxzYgotICAgICAgICBvdXQgICAgIDQyaCxhbCAgICAgICAgICAgICAgOyBsb2FkIGNvdW50IG1zYgotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgcmVhZFRpbWVyMgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVhZHMgdGhlIG51bWJlciBvZiB0aWNrcyBmcm9tIHRoZSA4MjUzIHRpbWVyIGNoaXAgdXNpbmcgY2hhbm5lbCAyIChQQwotOyBzcGVha2VyKS4gVGhpcyBpcyBub24tZGVzdHJ1Y3RpdmUgYW5kIGRvZXMgbm90IHNjcmV3IHVwIG90aGVyIGxpYnJhcmllcy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXRpYyByZWFkVGltZXIKLQotICAgICAgICB4b3IgICAgIGFsLGFsICAgICAgICAgICAgICAgOyBMYXRjaCB0aW1lciAwIGNvbW1hbmQKLSAgICAgICAgb3V0ICAgICA0M2gsYWwgICAgICAgICAgICAgIDsgTGF0Y2ggdGltZXIKLSAgICAgICAgaW4gICAgICBhbCw0MmggICAgICAgICAgICAgIDsgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZQotICAgICAgICBtb3YgICAgIGFoLGFsCi0gICAgICAgIGluICAgICAgYWwsNDJoICAgICAgICAgICAgICA7IG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZQotICAgICAgICB4Y2hnICAgIGFoLGFsCi0gICAgICAgIGFuZCAgICAgZWF4LDBGRkZGaAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgZXhpdFRpbWVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBTdG9wcyB0aGUgODI1MyB0aW1lciAyIChQQyBzcGVha2VyKSBjb3VudGluZwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhdGljIGV4aXRUaW1lcgotCi07IFN0b3AgdGltZXIgMiBmcm9tIGNvdW50aW5nCi0KLSAgICAgICAgcHVzaCAgICBlYXgKLSAgICAgICAgaW4gICAgICBhbCw2MWgKLSAgICAgICAgYW5kICAgICBhbCwwRkVoCi0gICAgICAgIG91dCAgICAgNjFoLGFsCi0gICAgICAgIAotOyBTb21lIHByb2dyYW1zIGhhdmUgYSBwcm9ibGVtIGlmIHdlIGNoYW5nZSB0aGUgY29udHJvbCBwb3J0OyBiZXR0ZXIgY2hhbmdlIGl0Ci07IHRvIHNvbWV0aGluZyB0aGV5IGV4cGVjdCAobW9kZSAzIC0gc3F1YXJlIHdhdmUgZ2VuZXJhdG9yKS4uLgotICAgICAgICBtb3YgICAgIGFsLDBCNmgKLSAgICAgICAgb3V0ICAgICA0M2gsYWwKLSAgICAgICAgCi0gICAgICAgIHBvcCAgICAgZWF4Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpbnQgX0VWVF9yZWFkSm95QXhpcyhpbnQgam1hc2ssaW50ICpheGlzKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEZ1bmN0aW9uIHRvIHBvbGwgdGhlIGpveXN0aWNrIHRvIHJlYWQgdGhlIGN1cnJlbnQgYXhpcyBwb3NpdGlvbnMuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX0VWVF9yZWFkSm95QXhpcwotCi0gICAgICAgIEFSRyAgICAgam1hc2s6VUlOVCwgYXhpczpEUFRSCi0KLSAgICAgICAgTE9DQUwgICBmaXJzdFRpY2s6VUlOVCwgbGFzdFRpY2s6VUlOVCwgdG90YWxUaWNrczpVSU5UID0gTG9jYWxTaXplCi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIG1vdiAgICAgZWJ4LFtqbWFza10KLSAgICAgICAgbW92ICAgICBlZGksW2F4aXNdCi0gICAgICAgIG1vdiAgICAgZWN4LCgxMTkzMTgwLzEwMCkKLSAgICAgICAgYW5kICAgICBlYngsMDExMTFiICAgICAgICAgIDsgTWFzayBvdXQgc3VwcG9ydGVkIGF4ZXMKLSAgICAgICAgbW92ICAgICBkeCwyMDFoICAgICAgICAgICAgIDsgRFggOj0gam95c3RpY2sgSS9PIHBvcnQKLSAgICAgICAgY2FsbCAgICBpbml0VGltZXIgICAgICAgICAgIDsgU3RhcnQgdGltZXIgMiBjb3VudGluZwotICAgICAgICBjYWxsICAgIHJlYWRUaW1lciAgICAgICAgICAgOyBSZXR1cm5zIGNvdW50ZXIgaW4gRUFYCi0gICAgICAgIG1vdiAgICAgW2xhc3RUaWNrXSxlYXgKLQotQEBXYWl0U3RhYmxlOgotICAgICAgICBpbiAgICAgIGFsLGR4Ci0gICAgICAgIGFuZCAgICAgYWwsYmwgICAgICAgICAgICAgICA7IFdhaXQgZm9yIHRoZSBheGVzIGluIHF1ZXN0aW9uIHRvIGJlCi0gICAgICAgIGp6ICAgICAgQEBTdGFibGUgICAgICAgICAgICA7ICBkb25lIHJlYWRpbmcuLi4KLSAgICAgICAgY2FsbCAgICByZWFkVGltZXIgICAgICAgICAgIDsgUmV0dXJucyBjb3VudGVyIGluIEVBWAotICAgICAgICB4Y2hnICAgIGVheCxbbGFzdFRpY2tdCi0gICAgICAgIGNtcCAgICAgZWF4LFtsYXN0VGlja10KLSAgICAgICAgamIgICAgICBAQDEKLSAgICAgICAgc3ViICAgICBlYXgsW2xhc3RUaWNrXQotQEAxOiAgICBhZGQgICAgIFt0b3RhbFRpY2tzXSxlYXgKLSAgICAgICAgY21wICAgICBbdG90YWxUaWNrc10sZWN4ICAgIDsgQ2hlY2sgZm9yIHRpbWVvdXQKLSAgICAgICAgamFlICAgICBAQFN0YWJsZQotICAgICAgICBqbXAgICAgIEBAV2FpdFN0YWJsZQotCi1AQFN0YWJsZToKLSAgICAgICAgbW92ICAgICBhbCwwRkZoCi0gICAgICAgIG91dCAgICAgZHgsYWwgICAgICAgICAgICAgICA7IFN0YXJ0IGpveXN0aWNrIHJlYWRpbmcKLSAgICAgICAgY2FsbCAgICBpbml0VGltZXIgICAgICAgICAgIDsgU3RhcnQgdGltZXIgMiBjb3VudGluZwotICAgICAgICBjYWxsICAgIHJlYWRUaW1lciAgICAgICAgICAgOyBSZXR1cm5zIGNvdW50ZXIgaW4gRUFYCi0gICAgICAgIG1vdiAgICAgW2ZpcnN0VGlja10sZWF4ICAgICA7IFN0b3JlIGluaXRpYWwgY291bnQKLSAgICAgICAgbW92ICAgICBbbGFzdFRpY2tdLGVheAotICAgICAgICBtb3YgICAgIFtEV09SRCB0b3RhbFRpY2tzXSwwCi0gICAgICAgIGNsaQotCi1AQFBvbGxMb29wOgotICAgICAgICBpbiAgICAgIGFsLGR4ICAgICAgICAgICAgICAgOyBSZWFkIEpveXN0aWNrIHBvcnQKLSAgICAgICAgbm90ICAgICBhbAotICAgICAgICBhbmQgICAgIGFsLGJsICAgICAgICAgICAgICAgOyBNYXNrIG9mZiBjaGFubmVscyB3ZSBkb24ndCB3YW50IHRvIHJlYWQKLSAgICAgICAgam56ICAgICBAQEF4aXNGbGlwcGVkICAgICAgIDsgU2VlIGlmIGFueSBvZiB0aGUgY2hhbm5lbHMgZmxpcHBlZAotICAgICAgICBjYWxsICAgIHJlYWRUaW1lciAgICAgICAgICAgOyBSZXR1cm5zIGNvdW50ZXIgaW4gRUFYCi0gICAgICAgIHhjaGcgICAgZWF4LFtsYXN0VGlja10KLSAgICAgICAgY21wICAgICBlYXgsW2xhc3RUaWNrXQotICAgICAgICBqYiAgICAgIEBAMgotICAgICAgICBzdWIgICAgIGVheCxbbGFzdFRpY2tdCi1AQDI6ICAgIGFkZCAgICAgW3RvdGFsVGlja3NdLGVheAotICAgICAgICBjbXAgICAgIFt0b3RhbFRpY2tzXSxlY3ggICAgOyBDaGVjayBmb3IgdGltZW91dAotICAgICAgICBqYWUgICAgIEBAVGltZWRPdXQKLSAgICAgICAgam1wICAgICBAQFBvbGxMb29wCi0KLUBAQXhpc0ZsaXBwZWQ6Ci0gICAgICAgIHhvciAgICAgZXNpLGVzaQotICAgICAgICBtb3YgICAgIGFoLDEKLSAgICAgICAgdGVzdCAgICBhbCxhaAotICAgICAgICBqbnogICAgIEBAU3RvcmVDb3VudCAgICAgICAgOyBKb3lzdGljayAxLCBYIGF4aXMgZmxpcHBlZAotICAgICAgICBhZGQgICAgIGVzaSw0Ci0gICAgICAgIG1vdiAgICAgYWgsMgotICAgICAgICB0ZXN0ICAgIGFsLGFoCi0gICAgICAgIGpueiAgICAgQEBTdG9yZUNvdW50ICAgICAgICA7IEpveXN0aWNrIDEsIFkgYXhpcyBmbGlwcGVkCi0gICAgICAgIGFkZCAgICAgZXNpLDQKLSAgICAgICAgbW92ICAgICBhaCw0Ci0gICAgICAgIHRlc3QgICAgYWwsYWgKLSAgICAgICAgam56ICAgICBAQFN0b3JlQ291bnQgICAgICAgIDsgSm95c3RpY2sgMiwgWCBheGlzIGZsaXBwZWQKLSAgICAgICAgYWRkICAgICBlc2ksNCAgICAgICAgICAgICAgIDsgSm95c3RpY2sgMiwgWSBheGlzIGZsaXBwZWQKLSAgICAgICAgbW92ICAgICBhaCw4Ci0KLUBAU3RvcmVDb3VudDoKLSAgICAgICAgb3IgICAgICBiaCxhaCAgICAgICAgICAgICAgIDsgSW5kaWNhdGUgdGhpcyBheGlzIGlzIGFjdGl2ZQotICAgICAgICB4b3IgICAgIGJsLGFoICAgICAgICAgICAgICAgOyBVbm1hcmsgdGhlIGNoYW5uZWxzIHRoYXQganVzdCB0cmlwcGVkCi0gICAgICAgIGNhbGwgICAgcmVhZFRpbWVyICAgICAgICAgICA7IFJldHVybnMgY291bnRlciBpbiBFQVgKLSAgICAgICAgeGNoZyAgICBlYXgsW2xhc3RUaWNrXQotICAgICAgICBjbXAgICAgIGVheCxbbGFzdFRpY2tdCi0gICAgICAgIGpiICAgICAgQEAzCi0gICAgICAgIHN1YiAgICAgZWF4LFtsYXN0VGlja10KLUBAMzogICAgYWRkICAgICBbdG90YWxUaWNrc10sZWF4Ci0gICAgICAgIG1vdiAgICAgZWF4LFt0b3RhbFRpY2tzXQotICAgICAgICBtb3YgICAgIFtlZGkrZXNpXSxlYXggICAgICAgOyBSZWNvcmQgdGhlIHRpbWUgdGhpcyBjaGFubmVsIGZsaXBwZWQKLSAgICAgICAgY21wICAgICBibCwwICAgICAgICAgICAgICAgIDsgSWYgdGhlcmUgYXJlIG1vcmUgY2hhbm5lbHMgdG8gcmVhZCwKLSAgICAgICAgam5lICAgICBAQFBvbGxMb29wICAgICAgICAgIDsgICBrZWVwIGxvb3BpbmcKLQotQEBUaW1lZE91dDoKLSAgICAgICAgc3RpCi0gICAgICAgIGNhbGwgICAgZXhpdFRpbWVyICAgICAgICAgICA7IFN0b3AgdGltZXIgMiBjb3VudGluZwotICAgICAgICBtb3Z6eCAgIGVheCxiaCAgICAgICAgICAgICAgOyBSZXR1cm4gdGhlIG1hc2sgb2Ygd29ya2luZyBheGVzCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBfRVZUX3JlYWRKb3lCdXR0b25zKHZvaWQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRnVuY3Rpb24gdG8gcG9sbCB0aGUgY3VycmVudCBqb3lzdGljayBidXR0b25zCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX0VWVF9yZWFkSm95QnV0dG9ucwotCi0gICAgICAgIG1vdiAgICAgZHgsMDIwMWgKLSAgICAgICAgaW4gICAgICBhbCxkeAotICAgICAgICBzaHIgICAgIGFsLDQKLSAgICAgICAgbm90ICAgICBhbAotICAgICAgICBhbmQgICAgIGVheCwwRmgKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLWVuZGNvZGVzZWcgIF9qb3kKLQotZW5kaWYKLQotICAgICAgICBFTkQgICAgICAgICAgICAgICAgICAgICAgICAgOyBFbmQgb2YgbW9kdWxlCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vX210cnIuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19tdHJyLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUwYTY5Ni4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vX210cnIuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KgotOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLTsqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi07KiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLTsqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotOyoKLTsqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi07KiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotOyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi07KiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyoKLTsqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqCi07KiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogTGFuZ3VhZ2U6ICAgIDgwMzg2IEFzc2VtYmxlciwgVEFTTSA0LjAgb3IgTkFTTQotOyogRW52aXJvbm1lbnQ6IDE2LzMyIGJpdCBSaW5nIDAgZGV2aWNlIGRyaXZlcgotOyoKLTsqIERlc2NyaXB0aW9uOiBBc3NlbWJsZXIgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIE1lbW9yeSBUeXBlIFJhbmdlIFJlZ2lzdGVyCi07KiAgICAgICAgICAgICAgKE1UUlIpIG1vZHVsZS4KLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIElERUFMCi0KLWluY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgOyBNZW1vcnkgbW9kZWwgbWFjcm9zCi0KLWhlYWRlciAgICAgIF9tdHJyICAgICAgICAgICAgICAgOyBTZXQgdXAgbWVtb3J5IG1vZGVsCi0KLWJlZ2RhdGFzZWcgIF9tdHJyCi0KLWlmZGVmICAgRE9TNEdXCi0gICAgY2V4dGVybiBfUE1faGF2ZUNhdXNlV2F5LFVJTlQKLWVuZGlmCi0KLWVuZGRhdGFzZWcgIF9tdHJyCi0KLWJlZ2NvZGVzZWcgIF9tdHJyICAgICAgICAgICAgICAgOyBTdGFydCBvZiBjb2RlIHNlZ21lbnQKLQotUDU4NgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpYm9vbCBfTVRSUl9pc1JpbmcwKHZvaWQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ2hlY2tzIHRvIHNlZSBpZiB3ZSBhcmUgcnVubmluZyBhdCByaW5nIDAuIFRoaXMgY2hlY2sgaXMgb25seSByZWxldmFudAotOyBmb3IgMzItYml0IERPUzRHVyBhbmQgY29tcGF0aWJsZSBwcm9ncmFtcy4gSWYgd2UgYXJlIG5vdCBydW5uaW5nIHVuZGVyCi07IERPUzRHVywgdGhlbiB3ZSBzaW1wbHkgYXNzdW1lIHdlIGFyZSBhIHJpbmcgMCBkZXZpY2UgZHJpdmVyLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jbmVhciAgIF9NVFJSX2lzUmluZzAKLQotOyBBcmUgd2UgcnVubmluZyB1bmRlciBDYXVzZVdheT8KLQotaWZkZWYgICBET1M0R1cKLSAgICAgICAgZW50ZXJfYwotICAgICAgICBtb3YgICAgIGF4LGNzCi0gICAgICAgIGFuZCAgICAgZWF4LDMKLSAgICAgICAgeG9yICAgICBlYXgsMwotICAgICAgICBqbnogICAgIEBARXhpdAotCi07IENhdXNlV2F5IHJ1bnMgdGhlIGFwcHMgYXQgcmluZyAzLCBidXQgaW1wbGVtZW50cyBzdXBwb3J0IGZvciBzcGVjaWZpYwotOyByaW5nIDAgaW5zdHJ1Y3Rpb25zIHRoYXQgd2UgbmVlZCB0byBnZXQgc3R1ZmYgZG9uZSB1bmRlciByZWFsIERPUy4KLQotICAgICAgICBtb3YgICAgIGVheCwxCi0gICAgICAgIGNtcCAgICAgW1VJTlQgX1BNX2hhdmVDYXVzZVdheV0sMAotICAgICAgICBqbnogICAgIEBARXhpdAotQEBGYWlsOiB4b3IgICAgIGVheCxlYXgKLUBARXhpdDogbGVhdmVfYwotICAgICAgICByZXQKLWVsc2UKLWlmZGVmIF9fU01YMzJfXwotICAgICAgICBtb3YgICAgIGVheCwxICAgICAgICAgICAgICAgICAgIDsgU01YIGlzIHJpbmcgMCEKLSAgICAgICAgcmV0Ci1lbHNlCi1pZmRlZiBfX1ZYRF9fCi0gICAgICAgIG1vdiAgICAgZWF4LDEgICAgICAgICAgICAgICAgICAgOyBWeEQgaXMgcmluZyAwIQotICAgICAgICByZXQKLWVsc2UKLWlmZGVmIF9fTlRfRFJJVkVSX18KLSAgICAgICAgbW92ICAgICBlYXgsMSAgICAgICAgICAgICAgICAgICA7IE5UL1cySyBpcyByaW5nIDAhCi0gICAgICAgIHJldAotZWxzZQotZWxzZQotICAgICAgICB4b3IgICAgIGVheCxlYXggICAgICAgICAgICAgICAgIDsgQXNzdW1lIHJpbmcgMyBmb3IgMzItYml0IERPUwotICAgICAgICByZXQKLWVuZGlmCi1lbmRpZgotZW5kaWYKLWVuZGlmCi0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVsb25nIF9NVFJSX2Rpc2FibGVJbnQodm9pZCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZXR1cm4gcHJvY2Vzc29yIGludGVycnVwdCBzdGF0dXMgYW5kIGRpc2FibGUgaW50ZXJydXB0cy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfTVRSUl9kaXNhYmxlSW50Ci0KLSAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgOyBQdXQgZmxhZyB3b3JkIG9uIHN0YWNrCi0gICAgICAgIGNsaSAgICAgICAgICAgICAgICAgICAgIDsgRGlzYWJsZSBpbnRlcnJ1cHRzIQotICAgICAgICBwb3AgICAgIGVheCAgICAgICAgICAgICA7IGRlcG9zaXQgZmxhZyB3b3JkIGluIHJldHVybiByZWdpc3RlcgotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfTVRSUl9yZXN0b3JlSW50KHVsb25nIHBzKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJlc3RvcmUgcHJvY2Vzc29yIGludGVycnVwdCBzdGF0dXMuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX01UUlJfcmVzdG9yZUludAotCi0gICAgICAgIEFSRyAgICAgcHM6VUxPTkcKLQotICAgICAgICBwdXNoICAgIGVicAotICAgICAgICBtb3YgICAgIGVicCxlc3AgICAgICAgICA7IFNldCB1cCBzdGFjayBmcmFtZQotICAgICAgICBtb3YgICAgIGVjeCxbcHNdCi0gICAgICAgIHRlc3QgICAgZWN4LDIwMGggICAgICAgIDsgU01QIHNhZmUgaW50ZXJydXB0IGZsYWcgcmVzdG9yZSEKLSAgICAgICAganogICAgICBAQDEKLSAgICAgICAgc3RpCi1AQDE6ICAgIHBvcCAgICAgZWJwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1bG9uZyBfTVRSUl9zYXZlQ1I0KHZvaWQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgU2F2ZSB0aGUgdmFsdWUgb2YgQ1I0IGFuZCBjbGVhciB0aGUgUGFnZSBHbG9iYWwgRW5hYmxlIChiaXQgNykuIFdlIGFsc28KLTsgZGlzYWJsZSBhbmQgZmx1c2ggdGhlIGNhY2hlcy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfTVRSUl9zYXZlQ1I0Ci0KLSAgICAgICAgZW50ZXJfYwotCi07IFNhdmUgdmFsdWUgb2YgQ1I0IGFuZCBjbGVhciBQYWdlIEdsb2JhbCBFbmFibGUgKGJpdCA3KQotCi0gICAgICAgIG1vdiAgICAgZWJ4LGNyNAotICAgICAgICBtb3YgICAgIGVheCxlYngKLSAgICAgICAgYW5kICAgICBhbCw3RmgKLSAgICAgICAgbW92ICAgICBjcjQsZWF4Ci0KLTsgRGlzYWJsZSBhbmQgZmx1c2ggY2FjaGVzCi0KLSAgICAgICAgbW92ICAgICBlYXgsY3IwCi0gICAgICAgIG9yICAgICAgZWF4LDQwMDAwMDAwaAotICAgICAgICB3YmludmQKLSAgICAgICAgbW92ICAgICBjcjAsZWF4Ci0gICAgICAgIHdiaW52ZAotCi07IFJldHVybiB2YWx1ZSBmcm9tIENSNAotCi0gICAgICAgIG1vdiAgICAgZWF4LGVieAotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9NVFJSX3Jlc3RvcmVDUjQodWxvbmcgY3I0VmFsKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgU2F2ZSB0aGUgdmFsdWUgb2YgQ1I0IGFuZCBjbGVhciB0aGUgUGFnZSBHbG9iYWwgRW5hYmxlIChiaXQgNykuIFdlIGFsc28KLTsgZGlzYWJsZSBhbmQgZmx1c2ggdGhlIGNhY2hlcy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfTVRSUl9yZXN0b3JlQ1I0Ci0KLSAgICAgICAgQVJHICAgICBjcjRWYWw6VUxPTkcKLQotICAgICAgICBlbnRlcl9jCi0KLTsgRW5hYmxlIGNhY2hlcwotCi0gICAgICAgIG1vdiAgICAgZWF4LGNyMAotICAgICAgICBhbmQgICAgIGVheCwwQkZGRkZGRkZoCi0gICAgICAgIG1vdiAgICAgY3IwLGVheAotICAgICAgICBtb3YgICAgIGVheCxbY3I0VmFsXQotICAgICAgICBtb3YgICAgIGNyNCxlYXgKLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWNoYXIgX01UUlJfZ2V0Q3g4Nih1Y2hhciByZWcpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVhZCBhIEN5cml4IENQVSBpbmRleGVkIHJlZ2lzdGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX01UUlJfZ2V0Q3g4NgotCi0gICAgICAgIEFSRyAgICAgcmVnOlVDSEFSCi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICBtb3YgICAgIGFsLFtyZWddCi0gICAgICAgIG91dCAgICAgMjJoLGFsCi0gICAgICAgIGluICAgICAgYWwsMjNoCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVjaGFyIF9NVFJSX3NldEN4ODYodWNoYXIgcmVnLHVjaGFyIHZhbCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBXcml0ZSBhIEN5cml4IENQVSBpbmRleGVkIHJlZ2lzdGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX01UUlJfc2V0Q3g4NgotCi0gICAgICAgIEFSRyAgICAgcmVnOlVDSEFSLCB2YWw6VUNIQVIKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIG1vdiAgICAgYWwsW3JlZ10KLSAgICAgICAgb3V0ICAgICAyMmgsYWwKLSAgICAgICAgbW92ICAgICBhbCxbdmFsXQotICAgICAgICBvdXQgICAgIDIzaCxhbAotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9NVFJSX3JlYWRNU1IodW9uZyByZWcsIHVsb25nIEZBUiAqZWF4LCB1bG9uZyBGQVIgKmVkeCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBXcml0ZXMgdGhlIHNwZWNpZmljIE1hY2hpbmUgU3RhdHVzIFJlZ2lzdGVyIHVzZWQgb24gdGhlIG5ld2VyIEludGVsCi07IFBlbnRpdW0gUHJvIGFuZCBQZW50aXVtIElJIG1vdGhlcmJvYXJkcy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY25lYXIgICBfTVRSUl9yZWFkTVNSCi0KLSAgICAgICAgQVJHICAgICByZWc6VUxPTkcsIHZfZWF4OkRQVFIsIHZfZWR4OkRQVFIKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIG1vdiAgICAgZWN4LFtyZWddCi0gICAgICAgIHJkbXNyCi0gICAgICAgIG1vdiAgICAgZWJ4LFt2X2VheF0KLSAgICAgICAgbW92ICAgICBbZWJ4XSxlYXgKLSAgICAgICAgbW92ICAgICBlYngsW3ZfZWR4XQotICAgICAgICBtb3YgICAgIFtlYnhdLGVkeAotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9NVFJSX3dyaXRlTVNSKHVvbmcgcmVnLCB1bG9uZyBlYXgsIHVsb25nIGVkeCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBXcml0ZXMgdGhlIHNwZWNpZmljIE1hY2hpbmUgU3RhdHVzIFJlZ2lzdGVyIHVzZWQgb24gdGhlIG5ld2VyIEludGVsCi07IFBlbnRpdW0gUHJvIGFuZCBQZW50aXVtIElJIG1vdGhlcmJvYXJkcy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY25lYXIgICBfTVRSUl93cml0ZU1TUgotCi0gICAgICAgIEFSRyAgICAgcmVnOlVMT05HLCB2X2VheDpVTE9ORywgdl9lZHg6VUxPTkcKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIG1vdiAgICAgZWN4LFtyZWddCi0gICAgICAgIG1vdiAgICAgZWF4LFt2X2VheF0KLSAgICAgICAgbW92ICAgICBlZHgsW3ZfZWR4XQotICAgICAgICB3cm1zcgotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi1lbmRjb2Rlc2VnICBfbXRycgotCi0gICAgICAgIEVORCAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19wY2loZWxwLmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9fcGNpaGVscC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOGRiY2MuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL19wY2loZWxwLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi07KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi07KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLTsqCi07KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLTsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsqCi07KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KgotOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqIExhbmd1YWdlOiAgICA4MDM4NiBBc3NlbWJsZXIsIFRBU00gNC4wIG9yIE5BU00KLTsqIEVudmlyb25tZW50OiBBbnkKLTsqCi07KiBEZXNjcmlwdGlvbjogSGVscGVyIGFzc2VtYmxlciBmdW5jdGlvbnMgZm9yIFBDSSBhY2Nlc3MgbW9kdWxlLgotOyoKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgSURFQUwKLQotaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKLQotaGVhZGVyICBfcGNpbGliCi0KLWJlZ2NvZGVzZWcgIF9wY2lsaWIKLQotaWZkZWYgZmxhdG1vZGVsCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVjaGFyIF9BU01BUEkgX0JJT1MzMl9zZXJ2aWNlKAotOyAgIHVsb25nIHNlcnZpY2UsCi07ICAgdWxvbmcgZnVuYywKLTsgICB1bG9uZyAqcGh5c0Jhc2UsCi07ICAgdWxvbmcgKmxlbmd0aCwKLTsgICB1bG9uZyAqc2VydmljZU9mZnNldCwKLTsgICBQQ0lCSU9TX2VudHJ5IGVudHJ5KTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENhbGwgdGhlIEJJT1MzMiBzZXJ2aWNlcyBkaXJlY3RvcnkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICAgX0JJT1MzMl9zZXJ2aWNlCi0KLSAgICAgICAgQVJHICAgICBzZXJ2aWNlOlVMT05HLCBmdW5jOlVMT05HLCBwaHlzQmFzZTpEUFRSLCBsZW46RFBUUiwgb2ZmOkRQVFIsIGVudHJ5OlFXT1JECi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICBtb3YgICAgIGVheCxbc2VydmljZV0KLSAgICAgICAgbW92ICAgICBlYngsW2Z1bmNdCi1pZmRlZiAgIFVTRV9OQVNNCi0gICAgICAgIGNhbGwgZmFyIGR3b3JkIFtlbnRyeV0KLWVsc2UKLSAgICAgICAgY2FsbCAgICBbRldPUkQgZW50cnldCi1lbmRpZgotICAgICAgICBtb3YgICAgIGVzaSxbcGh5c0Jhc2VdCi0gICAgICAgIG1vdiAgICAgW2VzaV0sZWJ4Ci0gICAgICAgIG1vdiAgICAgZXNpLFtsZW5dCi0gICAgICAgIG1vdiAgICAgW2VzaV0sZWN4Ci0gICAgICAgIG1vdiAgICAgZXNpLFtvZmZdCi0gICAgICAgIG1vdiAgICAgW2VzaV0sZWR4Ci0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLWVuZGlmCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVzaG9ydCBfQVNNQVBJIF9QQ0lCSU9TX2lzUHJlc2VudCh1bG9uZyBpX2VheCx1bG9uZyAqb19lZHgsdXNob3J0ICpvZWF4LAotOyAgIHVjaGFyICpvX2NsLFBDSUJJT1NfZW50cnkgZW50cnkpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDYWxsIHRoZSBQQ0kgQklPUyB0byBkZXRlcm1pbmUgaWYgaXQgaXMgcHJlc2VudC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICAgX1BDSUJJT1NfaXNQcmVzZW50Ci0KLSAgICAgICAgQVJHICAgICBpX2VheDpVTE9ORywgb19lZHg6RFBUUiwgb2VheDpEUFRSLCBvX2NsOkRQVFIsIGVudHJ5OlFXT1JECi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICBtb3YgICAgIGVheCxbaV9lYXhdCi1pZmRlZiAgIGZsYXRtb2RlbAotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBjYWxsIGZhciBkd29yZCBbZW50cnldCi1lbHNlCi0gICAgICAgIGNhbGwgICAgW0ZXT1JEIGVudHJ5XQotZW5kaWYKLWVsc2UKLSAgICAgICAgaW50ICAgICAxQWgKLWVuZGlmCi0gICAgICAgIF9sZXMgICAgX3NpLFtvX2VkeF0KLSAgICAgICAgbW92ICAgICBbX0VTIF9zaV0sZWR4Ci0gICAgICAgIF9sZXMgICAgX3NpLFtvZWF4XQotICAgICAgICBtb3YgICAgIFtfRVMgX3NpXSxheAotICAgICAgICBfbGVzICAgIF9zaSxbb19jbF0KLSAgICAgICAgbW92ICAgICBbX0VTIF9zaV0sY2wKLSAgICAgICAgbW92ICAgICBheCxieAotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1bG9uZyBfUENJQklPU19zZXJ2aWNlKHVsb25nIHJfZWF4LHVsb25nIHJfZWJ4LHVsb25nIHJfZWRpLHVsb25nIHJfZWN4LAotOyAgIFBDSUJJT1NfZW50cnkgZW50cnkpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDYWxsIHRoZSBQQ0kgQklPUyBzZXJ2aWNlcywgZWl0aGVyIHZpYSB0aGUgMzItYml0IHByb3RlY3RlZCBtb2RlIGVudHJ5Ci07IHBvaW50IG9yIHZpYSB0aGUgSW50IDFBaCAxNi1iaXQgaW50ZXJydXB0LgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgICBfUENJQklPU19zZXJ2aWNlCi0KLSAgICAgICAgQVJHICAgICByX2VheDpVTE9ORywgcl9lYng6VUxPTkcsIHJfZWRpOlVMT05HLCByX2VjeDpVTE9ORywgZW50cnk6UVdPUkQKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIG1vdiAgICAgZWF4LFtyX2VheF0KLSAgICAgICAgbW92ICAgICBlYngsW3JfZWJ4XQotICAgICAgICBtb3YgICAgIGVkaSxbcl9lZGldCi0gICAgICAgIG1vdiAgICAgZWN4LFtyX2VjeF0KLWlmZGVmICAgZmxhdG1vZGVsCi1pZmRlZiAgIFVTRV9OQVNNCi0gICAgICAgIGNhbGwgZmFyIGR3b3JkIFtlbnRyeV0KLWVsc2UKLSAgICAgICAgY2FsbCAgICBbRldPUkQgZW50cnldCi1lbmRpZgotZWxzZQotICAgICAgICBpbnQgICAgIDFBaAotZW5kaWYKLSAgICAgICAgbW92ICAgICBlYXgsZWN4Ci1pZm5kZWYgIGZsYXRtb2RlbAotICAgICAgICBzaGxkICAgIGVkeCxlYXgsMTYgICAgICA7IFJldHVybiByZXN1bHQgaW4gRFg6QVgKLWVuZGlmCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBfUENJQklPU19nZXRSb3V0aW5nKFBDSVJvdXRpbmdPcHRpb25zQnVmZmVyICpidWYsUENJQklPU19lbnRyeSBlbnRyeSk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBHZXQgdGhlIHJvdXRpbmcgb3B0aW9ucyBmb3IgUENJIGRldmljZXMKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICAgX1BDSUJJT1NfZ2V0Um91dGluZwotCi0gICAgICAgIEFSRyAgICAgYnVmOkRQVFIsIGVudHJ5OlFXT1JECi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICBtb3YgICAgIGVheCwwQjEwRWgKLSAgICAgICAgbW92ICAgICBieCwwCi0gICAgICAgIF9sZXMgICAgX2RpLFtidWZdCi1pZmRlZiAgIGZsYXRtb2RlbAotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBjYWxsIGZhciBkd29yZCBbZW50cnldCi1lbHNlCi0gICAgICAgIGNhbGwgICAgW0ZXT1JEIGVudHJ5XQotZW5kaWYKLWVsc2UKLSAgICAgICAgaW50ICAgICAxQWgKLWVuZGlmCi0gICAgICAgIG1vdnp4ICAgZWF4LGFoCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGlib29sIF9QQ0lCSU9TX3NldElSUShpbnQgYnVzRGV2LGludCBpbnRQaW4saW50IElSUSxQQ0lCSU9TX2VudHJ5IGVudHJ5KTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENoYW5nZSB0aGUgSVJRIHJvdXRpbmcgZm9yIHRoZSBQQ0kgZGV2aWNlCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgIF9QQ0lCSU9TX3NldElSUQotCi0gICAgICAgIEFSRyAgICAgYnVzRGV2OlVJTlQsIGludFBpbjpVSU5ULCBJUlE6VUlOVCwgZW50cnk6UVdPUkQKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIG1vdiAgICAgZWF4LDBCMTBGaAotICAgICAgICBtb3YgICAgIGJ4LFtVU0hPUlQgYnVzRGV2XQotICAgICAgICBtb3YgICAgIGNsLFtCWVRFIGludFBpbl0KLSAgICAgICAgbW92ICAgICBjaCxbQllURSBJUlFdCi1pZmRlZiAgIGZsYXRtb2RlbAotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBjYWxsIGZhciBkd29yZCBbZW50cnldCi1lbHNlCi0gICAgICAgIGNhbGwgICAgW0ZXT1JEIGVudHJ5XQotZW5kaWYKLWVsc2UKLSAgICAgICAgaW50ICAgICAxQWgKLWVuZGlmCi0gICAgICAgIG1vdiAgICAgZWF4LDEKLSAgICAgICAgam5jICAgICBAQDEKLSAgICAgICAgeG9yICAgICBlYXgsZWF4ICAgICAgICAgOyBGdW5jdGlvbiBmYWlsZWQhCi1AQDE6ICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVsb25nIF9QQ0lCSU9TX3NwZWNpYWxDeWNsZShpbnQgYnVzLHVsb25nIGRhdGEsUENJQklPU19lbnRyeSBlbnRyeSk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBHZW5lcmF0ZSBhIHNwZWNpYWwgY3ljbGUgdmlhIHRoZSBQQ0kgQklPUy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICAgX1BDSUJJT1Nfc3BlY2lhbEN5Y2xlCi0KLSAgICAgICAgQVJHICAgICBidXM6VUlOVCwgZGF0YTpVTE9ORywgZW50cnk6UVdPUkQKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIG1vdiAgICAgZWF4LDBCMTA2aAotICAgICAgICBtb3YgICAgIGJoLFtCWVRFIGJ1c10KLSAgICAgICAgbW92ICAgICBlY3gsW2RhdGFdCi1pZmRlZiAgIGZsYXRtb2RlbAotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBjYWxsIGZhciBkd29yZCBbZW50cnldCi1lbHNlCi0gICAgICAgIGNhbGwgICAgW0ZXT1JEIGVudHJ5XQotZW5kaWYKLWVsc2UKLSAgICAgICAgaW50ICAgICAxQWgKLWVuZGlmCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVzaG9ydCBfUENJX2dldENTKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgIF9QQ0lfZ2V0Q1MKLQotICAgICAgICBtb3YgICAgIGF4LGNzCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpbnQgUE1faW5wYihpbnQgcG9ydCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJlYWRzIGEgYnl0ZSBmcm9tIHRoZSBzcGVjaWZpZWQgcG9ydAotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX2lucGIKLQotICAgICAgICBBUkcgICAgIHBvcnQ6VUlOVAotCi0gICAgICAgIHB1c2ggICAgX2JwCi0gICAgICAgIG1vdiAgICAgX2JwLF9zcAotICAgICAgICB4b3IgICAgIF9heCxfYXgKLSAgICAgICAgbW92ICAgICBfZHgsW3BvcnRdCi0gICAgICAgIGluICAgICAgYWwsZHgKLSAgICAgICAgcG9wICAgICBfYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBQTV9pbnB3KGludCBwb3J0KQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVhZHMgYSB3b3JkIGZyb20gdGhlIHNwZWNpZmllZCBwb3J0Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUE1faW5wdwotCi0gICAgICAgIEFSRyAgICAgcG9ydDpVSU5UCi0KLSAgICAgICAgcHVzaCAgICBfYnAKLSAgICAgICAgbW92ICAgICBfYnAsX3NwCi0gICAgICAgIHhvciAgICAgX2F4LF9heAotICAgICAgICBtb3YgICAgIF9keCxbcG9ydF0KLSAgICAgICAgaW4gICAgICBheCxkeAotICAgICAgICBwb3AgICAgIF9icAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWxvbmcgUE1faW5wZChpbnQgcG9ydCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJlYWRzIGEgd29yZCBmcm9tIHRoZSBzcGVjaWZpZWQgcG9ydAotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX2lucGQKLQotICAgICAgICBBUkcgICAgIHBvcnQ6VUlOVAotCi0gICAgICAgIHB1c2ggICAgX2JwCi0gICAgICAgIG1vdiAgICAgX2JwLF9zcAotICAgICAgICBtb3YgICAgIF9keCxbcG9ydF0KLSAgICAgICAgaW4gICAgICBlYXgsZHgKLWlmbmRlZiBmbGF0bW9kZWwKLSAgICAgICAgc2hsZCAgICBlZHgsZWF4LDE2ICAgICAgOyBEWDpBWCA9IHJlc3VsdAotZW5kaWYKLSAgICAgICAgcG9wICAgICBfYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fb3V0cGIoaW50IHBvcnQsaW50IHZhbHVlKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgV3JpdGUgYSBieXRlIHRvIHRoZSBzcGVjaWZpZWQgcG9ydC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9vdXRwYgotCi0gICAgICAgIEFSRyAgICAgcG9ydDpVSU5ULCB2YWx1ZTpVSU5UCi0KLSAgICAgICAgcHVzaCAgICBfYnAKLSAgICAgICAgbW92ICAgICBfYnAsX3NwCi0gICAgICAgIG1vdiAgICAgX2R4LFtwb3J0XQotICAgICAgICBtb3YgICAgIF9heCxbdmFsdWVdCi0gICAgICAgIG91dCAgICAgZHgsYWwKLSAgICAgICAgcG9wICAgICBfYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fb3V0cHcoaW50IHBvcnQsaW50IHZhbHVlKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgV3JpdGUgYSB3b3JkIHRvIHRoZSBzcGVjaWZpZWQgcG9ydC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9vdXRwdwotCi0gICAgICAgIEFSRyAgICAgcG9ydDpVSU5ULCB2YWx1ZTpVSU5UCi0KLSAgICAgICAgcHVzaCAgICBfYnAKLSAgICAgICAgbW92ICAgICBfYnAsX3NwCi0gICAgICAgIG1vdiAgICAgX2R4LFtwb3J0XQotICAgICAgICBtb3YgICAgIF9heCxbdmFsdWVdCi0gICAgICAgIG91dCAgICAgZHgsYXgKLSAgICAgICAgcG9wICAgICBfYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fb3V0cGQoaW50IHBvcnQsdWxvbmcgdmFsdWUpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBXcml0ZSBhIHdvcmQgdG8gdGhlIHNwZWNpZmllZCBwb3J0LgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX291dHBkCi0KLSAgICAgICAgQVJHICAgICBwb3J0OlVJTlQsIHZhbHVlOlVMT05HCi0KLSAgICAgICAgcHVzaCAgICBfYnAKLSAgICAgICAgbW92ICAgICBfYnAsX3NwCi0gICAgICAgIG1vdiAgICAgX2R4LFtwb3J0XQotICAgICAgICBtb3YgICAgIGVheCxbdmFsdWVdCi0gICAgICAgIG91dCAgICAgZHgsZWF4Ci0gICAgICAgIHBvcCAgICAgX2JwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi1lbmRjb2Rlc2VnICBfcGNpbGliCi0KLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vYWdwLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vYWdwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1M2JjODguLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL2FncC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBSaW5nIDAgZGV2aWNlIGRyaXZlcgotKgotKiBEZXNjcmlwdGlvbjogIEdlbmVyaWMgbW9kdWxlIHRvIGltcGxlbWVudCBBR1Agc3VwcG9ydCBmdW5jdGlvbnMgdXNpbmcgdGhlCi0qICAgICAgICAgICAgICAgU2NpVGVjaCBOdWNsZXVzIEFHUCBzdXBwb3J0IGRyaXZlcnMuIElmIHRoZSBPUyBwcm92aWRlcwotKiAgICAgICAgICAgICAgIG5hdGl2ZSBBR1Agc3VwcG9ydCwgdGhpcyBtb2R1bGUgc2hvdWxkICpOT1QqIGJlIHVzZWQuIEluc3RlYWQKLSogICAgICAgICAgICAgICB3cmFwcGVycyBzaG91bGQgYmUgcGxhY2VkIGFyb3VuZCB0aGUgT1Mgc3VwcG9ydCBmdW5jdGlvbnMKLSogICAgICAgICAgICAgICB0byBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaWZuZGVmIFJFQUxNT0RFCi0jaW5jbHVkZSAibnVjbGV1cy9hZ3AuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIEFHUF9kZXZDdHggICAgICAgKmFncDsKLXN0YXRpYyBBR1BfZHJpdmVyRnVuY3MgIGRyaXZlcjsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1TaXplIG9mIEFHUCBhcGVydHVyZSBpbiBNQiBvbiBzdWNjZXNzLCAwIG9uIGZhaWx1cmUuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGluaXRpYWxpc2VzIHRoZSBBR1AgZHJpdmVyIGluIHRoZSBzeXN0ZW0gYW5kIHJldHVybnMgdGhlCi1zaXplIG9mIHRoZSBhdmFpbGFibGUgQUdQIGFwZXJ0dXJlIGluIG1lZ2FieXRlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBQTUFQSSBQTV9hZ3BJbml0KHZvaWQpCi17Ci0gICAgaWYgKChhZ3AgPSBBR1BfbG9hZERyaXZlcigwKSkgPT0gTlVMTCkKLQlyZXR1cm4gMDsKLSAgICBkcml2ZXIuZHdTaXplID0gc2l6ZW9mKGRyaXZlcik7Ci0gICAgaWYgKCFhZ3AtPlF1ZXJ5RnVuY3Rpb25zKEFHUF9HRVRfRFJJVkVSRlVOQ1MsJmRyaXZlcikpCi0JcmV0dXJuIDA7Ci0gICAgc3dpdGNoIChkcml2ZXIuR2V0QXBlcnR1cmVTaXplKCkpIHsKLQljYXNlIGFncFNpemU0TUI6ICAgIHJldHVybiA0OwotCWNhc2UgYWdwU2l6ZThNQjogICAgcmV0dXJuIDg7Ci0JY2FzZSBhZ3BTaXplMTZNQjogICByZXR1cm4gMTY7Ci0JY2FzZSBhZ3BTaXplMzJNQjogICByZXR1cm4gMzI7Ci0JY2FzZSBhZ3BTaXplNjRNQjogICByZXR1cm4gNjQ7Ci0JY2FzZSBhZ3BTaXplMTI4TUI6ICByZXR1cm4gMTI4OwotCWNhc2UgYWdwU2l6ZTI1Nk1COiAgcmV0dXJuIDI1NjsKLQljYXNlIGFncFNpemU1MTJNQjogIHJldHVybiA1MTI7Ci0JY2FzZSBhZ3BTaXplMUdCOiAgICByZXR1cm4gMTAyNDsKLQljYXNlIGFncFNpemUyR0I6ICAgIHJldHVybiAyMDQ4OwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGNsb3NlcyBkb3duIHRoZSBsb2FkZWQgQUdQIGRyaXZlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2FncEV4aXQodm9pZCkKLXsKLSAgICBBR1BfdW5sb2FkRHJpdmVyKGFncCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotbnVtUGFnZXMgICAgLSBOdW1iZXIgb2YgbWVtb3J5IHBhZ2VzIHRoYXQgc2hvdWxkIGJlIHJlc2VydmVkCi10eXBlICAgICAgICAtIFR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlCi1waHlzQ29udGV4dCAtIFJldHVybnMgdGhlIHBoeXNpY2FsIGNvbnRleHQgaGFuZGxlIGZvciB0aGUgbWFwcGluZwotcGh5c0FkZHIgICAgLSBSZXR1cm5zIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGZvciB0aGUgbWFwcGluZwotCi1SRVRVUk5TOgotVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZXNlcnZlcyBhIHJhbmdlIG9mIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzZXMgb24gdGhlIHN5c3RlbQotYnVzIHdoaWNoIHRoZSBBR1AgY29udHJvbGxlciB3aWxsIHJlc3BvbmQgdG8uIElmIHRoaXMgZnVuY3Rpb24gc3VjY2VlZHMsCi10aGUgQUdQIGNvbnRyb2xsZXIgY2FuIHJlc3BvbmQgdG8gdGhlIHJlc2VydmVkIHBoeXNpY2FsIGFkZHJlc3MgcmFuZ2Ugb24KLXRoZSBidXMuIEhvd2V2ZXIgeW91IG11c3QgZmlyc3QgY2FsbCBBR1BfY29tbWl0UGh5c2ljYWwgdG8gY2F1c2UgdGhpcyBtZW1vcnkKLXRvIGFjdHVhbGx5IGJlIGNvbW1pdHRlZCBmb3IgdXNlIGJlZm9yZSBpdCBjYW4gYmUgYWNjZXNzZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fYWdwUmVzZXJ2ZVBoeXNpY2FsKAotICAgIHVsb25nIG51bVBhZ2VzLAotICAgIGludCB0eXBlLAotICAgIHZvaWQgKipwaHlzQ29udGV4dCwKLSAgICBQTV9waHlzQWRkciAqcGh5c0FkZHIpCi17Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBQTV9hZ3BVbmNhY2hlZDoKLQkgICAgdHlwZSA9IGFncFVuY2FjaGVkOwotCSAgICBicmVhazsKLQljYXNlIFBNX2FncFdyaXRlQ29tYmluZToKLQkgICAgdHlwZSA9IGFncFdyaXRlQ29tYmluZTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV9hZ3BJbnRlbERDQUNIRToKLQkgICAgdHlwZSA9IGFncEludGVsRENBQ0hFOwotCSAgICBicmVhazsKLQlkZWZhdWx0OgotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIHJldHVybiBkcml2ZXIuUmVzZXJ2ZVBoeXNpY2FsKG51bVBhZ2VzLHR5cGUscGh5c0NvbnRleHQscGh5c0FkZHIpID09IG5PSzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1waHlzQ29udGV4dCAtIFBoeXNpY2FsIEFHUCBjb250ZXh0IHRvIHJlbGVhc2UKLQotUkVUVVJOUzoKLVRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZS4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmVsZWFzZXMgYSByYW5nZSBvZiBwaHlzaWNhbCBtZW1vcnkgYWRkcmVzc2VzIG9uIHRoZSBzeXN0ZW0KLWJ1cyB3aGljaCB0aGUgQUdQIGNvbnRyb2xsZXIgd2lsbCByZXNwb25kIHRvLiBBbGwgY29tbWl0dGVkIG1lbW9yeSBmb3IKLXRoZSBwaHlzaWNhbCBhZGRyZXNzIHJhbmdlIGNvdmVyZWQgYnkgdGhlIGNvbnRleHQgd2lsbCBiZSByZWxlYXNlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9hZ3BSZWxlYXNlUGh5c2ljYWwoCi0gICAgdm9pZCAqcGh5c0NvbnRleHQpCi17Ci0gICAgcmV0dXJuIGRyaXZlci5SZWxlYXNlUGh5c2ljYWwocGh5c0NvbnRleHQpID09IG5PSzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1waHlzQ29udGV4dCAtIFBoeXNpY2FsIEFHUCBjb250ZXh0IHRvIGNvbW1pdCBtZW1vcnkgZm9yCi1udW1QYWdlcyAgICAtIE51bWJlciBvZiBwYWdlcyB0byBiZSBjb21taXR0ZWQKLXN0YXJ0T2Zmc2V0IC0gT2Zmc2V0IGluIHBhZ2VzIGludG8gdGhlIHJlc2VydmVkIHBoeXNpY2FsIGNvbnRleHQKLXBoeXNBZGRyICAgIC0gUmV0dXJucyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgY29tbWl0dGVkIG1lbW9yeQotCi1SRVRVUk5TOgotVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBjb21taXRzIGludG8gdGhlIHNwZWNpZmllZCBwaHlzaWNhbCBjb250ZXh0IHRoYXQgd2FzIHByZXZpb3VzbHkKLXJlc2VydmVkIGJ5IGEgY2FsbCB0byBSZXNlcnZlUGh5c2ljYWwuIFlvdSBjYW4gdXNlIHRoZSBzdGFydE9mZnNldCBhbmQKLW51bVBhZ2VzIHBhcmFtZXRlcnMgdG8gb25seSBjb21taXQgcG9ydGlvbnMgb2YgdGhlIHJlc2VydmVkIG1lbW9yeSByYW5nZSBhdAotYSB0aW1lLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2FncENvbW1pdFBoeXNpY2FsKAotICAgIHZvaWQgKnBoeXNDb250ZXh0LAotICAgIHVsb25nIG51bVBhZ2VzLAotICAgIHVsb25nIHN0YXJ0T2Zmc2V0LAotICAgIFBNX3BoeXNBZGRyICpwaHlzQWRkcikKLXsKLSAgICByZXR1cm4gZHJpdmVyLkNvbW1pdFBoeXNpY2FsKHBoeXNDb250ZXh0LG51bVBhZ2VzLHN0YXJ0T2Zmc2V0LHBoeXNBZGRyKSA9PSBuT0s7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcGh5c0NvbnRleHQgLSBQaHlzaWNhbCBBR1AgY29udGV4dCB0byBmcmVlIG1lbW9yeSBmb3IKLW51bVBhZ2VzICAgIC0gTnVtYmVyIG9mIHBhZ2VzIHRvIGJlIGZyZWVkCi1zdGFydE9mZnNldCAtIE9mZnNldCBpbiBwYWdlcyBpbnRvIHRoZSByZXNlcnZlZCBwaHlzaWNhbCBjb250ZXh0Ci0KLVJFVFVSTlM6Ci1UcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGZyZWVzIG1lbW9yeSBwcmV2aW91c2x5IGNvbW1pdHRlZCBieSB0aGUgQ29tbWl0UGh5c2ljYWwKLWZ1bmN0aW9uLiBOb3RlIHRoYXQgeW91IGNhbiBmcmVlIGEgcG9ydGlvbiBvZiBhIG1lbW9yeSByYW5nZSB0aGF0IHdhcwotcHJldmlvdXNseSBjb21taXR0ZWQgaWYgeW91IHdpc2guCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fYWdwRnJlZVBoeXNpY2FsKAotICAgIHZvaWQgKnBoeXNDb250ZXh0LAotICAgIHVsb25nIG51bVBhZ2VzLAotICAgIHVsb25nIHN0YXJ0T2Zmc2V0KQotewotICAgIHJldHVybiBkcml2ZXIuRnJlZVBoeXNpY2FsKHBoeXNDb250ZXh0LG51bVBhZ2VzLHN0YXJ0T2Zmc2V0KSA9PSBuT0s7Ci19Ci0KLSNlbmRpZiAgLyogIVJFQUxNT0RFICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24va2V5Ym9hcmQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9rZXlib2FyZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjg2N2JkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9rZXlib2FyZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIERpcmVjdCBrZXlib2FyZCBldmVudCBoYW5kbGluZyBtb2R1bGUuIFRoaXMgbW9kdWxlIGNvbnRhaW5zCi0qICAgICAgICAgICAgICAgY29kZSB0byBwcm9jZXNzIHJhdyBzY2FuIGNvZGUgaW5mb3JtYXRpb24sIGNvbnZlcnQgaXQgdG8KLSogICAgICAgICAgICAgICB2aXJ0dWFsIHNjYW4gY29kZXMgYW5kIGRvIGNvZGUgcGFnZSB0cmFuc2xhdGlvbiB0byBBU0NJSQotKiAgICAgICAgICAgICAgIGZvciBkaWZmZXJlbnQgaW50ZXJuYXRpb25hbCBrZXlib2FyZCBsYXlvdXRzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zY2FuQ29kZSAgICAtIEtleWJvYXJkIHNjYW4gY29kZSB0byB0cmFuc2xhdGUKLXRhYmxlICAgICAgIC0gQ29kZSBwYWdlIHRhYmxlIHRvIHNlYXJjaAotY291bnQgICAgICAgLSBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY29kZSBwYWdlIHRhYmxlCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgdGhlIHNjYW4gY29kZXMgZnJvbSBrZXlib2FyZCBzY2FuIGNvZGVzIHRvIEFTQ0lJCi1jb2RlcyB1c2luZyBhIGJpbmFyeSBzZWFyY2ggb24gdGhlIGNvZGUgcGFnZSB0YWJsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWNoYXIgdHJhbnNsYXRlU2NhbigKLSAgICB1Y2hhciBzY2FuQ29kZSwKLSAgICBjb2RlcGFnZV9lbnRyeV90ICp0YWJsZSwKLSAgICBpbnQgY291bnQpCi17Ci0gICAgY29kZXBhZ2VfZW50cnlfdCAgICAqdGVzdDsKLSAgICBpbnQgICAgICAgICAgICAgICAgIG4scGl2b3QsdmFsOwotCi0gICAgZm9yIChuID0gY291bnQ7IG4gPiAwOyApIHsKLQlwaXZvdCA9IG4gPj4gMTsKLQl0ZXN0ID0gdGFibGUgKyBwaXZvdDsKLQl2YWwgPSBzY2FuQ29kZSAtIHRlc3QtPnNjYW5Db2RlOwotCWlmICh2YWwgPCAwKQotCSAgICBuID0gcGl2b3Q7Ci0JZWxzZSBpZiAodmFsID09IDApCi0JICAgIHJldHVybiB0ZXN0LT5hc2NpaUNvZGU7Ci0JZWxzZSB7Ci0JICAgIHRhYmxlID0gdGVzdCArIDE7Ci0JICAgIG4gLT0gcGl2b3QgKyAxOwotCSAgICB9Ci0JfQotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgbWFjcm8vZnVuY3Rpb24gaXMgdXNlZCB0byBjb252ZXJ0cyB0aGUgc2NhbiBjb2RlcyByZXBvcnRlZCBieSB0aGUKLWtleWJvYXJkIHRvIG91ciBldmVudCBsaWJyYXJpZXMgbm9ybWFsaXNlZCBmb3JtYXQuIFdlIG9ubHkgaGF2ZSBvbmUgc2NhbgotY29kZSBmb3IgdGhlICdBJyBrZXksIGFuZCB1c2Ugc2hpZnQgbW9kaWZpZXJzIHRvIGRldGVybWluZSBpZiBpdCBpcyBhCi1DdHJsLUYxLCBBbHQtRjEgZXRjLiBUaGUgcmF3IHNjYW4gY29kZXMgZnJvbSB0aGUga2V5Ym9hcmQgd29yayB0aGlzIHdheSwKLWJ1dCB0aGUgT1MgZ2l2ZXMgdXMgJ2Nvb2tlZCcgc2NhbiBjb2Rlcywgd2UgaGF2ZSB0byB0cmFuc2xhdGUgdGhlbSBiYWNrCi10byB0aGUgcmF3IGZvcm1hdC4KLXtzZWNyZXR9Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfRVZUX21hc2tLZXlDb2RlKAotICAgIGV2ZW50X3QgKmV2dCkKLXsKLSAgICBpbnQgYXNjaWksc2NhbiA9IEVWVF9zY2FuQ29kZShldnQtPm1lc3NhZ2UpOwotCi0gICAgZXZ0LT5tZXNzYWdlICY9IH4weEZGOwotICAgIGlmIChldnQtPm1vZGlmaWVycyAmIEVWVF9OVU1MT0NLKSB7Ci0JaWYgKChhc2NpaSA9IHRyYW5zbGF0ZVNjYW4oc2NhbixFVlQuY29kZVBhZ2UtPm51bVBhZCxFVlQuY29kZVBhZ2UtPm51bVBhZExlbikpICE9IDApIHsKLQkgICAgZXZ0LT5tZXNzYWdlIHw9IGFzY2lpOwotCSAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgaWYgKGV2dC0+bW9kaWZpZXJzICYgRVZUX0NUUkxTVEFURSkgewotCWV2dC0+bWVzc2FnZSB8PSB0cmFuc2xhdGVTY2FuKHNjYW4sRVZULmNvZGVQYWdlLT5jdHJsLEVWVC5jb2RlUGFnZS0+Y3RybExlbik7Ci0JcmV0dXJuOwotCX0KLSAgICBpZiAoZXZ0LT5tb2RpZmllcnMgJiBFVlRfQ0FQU0xPQ0spIHsKLQlpZiAoZXZ0LT5tb2RpZmllcnMgJiBFVlRfU0hJRlRLRVkpIHsKLQkgICAgaWYgKChhc2NpaSA9IHRyYW5zbGF0ZVNjYW4oc2NhbixFVlQuY29kZVBhZ2UtPnNoaWZ0Q2FwcyxFVlQuY29kZVBhZ2UtPnNoaWZ0Q2Fwc0xlbikpICE9IDApIHsKLQkJZXZ0LT5tZXNzYWdlIHw9IGFzY2lpOwotCQlyZXR1cm47Ci0JCX0KLQkgICAgfQotCWVsc2UgewotCSAgICBpZiAoKGFzY2lpID0gdHJhbnNsYXRlU2NhbihzY2FuLEVWVC5jb2RlUGFnZS0+Y2FwcyxFVlQuY29kZVBhZ2UtPmNhcHNMZW4pKSAhPSAwKSB7Ci0JCWV2dC0+bWVzc2FnZSB8PSBhc2NpaTsKLQkJcmV0dXJuOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgaWYgKGV2dC0+bW9kaWZpZXJzICYgRVZUX1NISUZUS0VZKSB7Ci0JaWYgKChhc2NpaSA9IHRyYW5zbGF0ZVNjYW4oc2NhbixFVlQuY29kZVBhZ2UtPnNoaWZ0LEVWVC5jb2RlUGFnZS0+c2hpZnRMZW4pKSAhPSAwKSB7Ci0JICAgIGV2dC0+bWVzc2FnZSB8PSBhc2NpaTsKLQkgICAgcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIGV2dC0+bWVzc2FnZSB8PSB0cmFuc2xhdGVTY2FuKHNjYW4sRVZULmNvZGVQYWdlLT5ub3JtYWwsRVZULmNvZGVQYWdlLT5ub3JtYWxMZW4pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybnMgdHJ1ZSBpZiB0aGUga2V5IHdpdGggdGhlIHNwZWNpZmllZCBzY2FuIGNvZGUgaXMgYmVpbmcgaGVsZCBkb3duLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpYm9vbCBfRVZUX2lzS2V5RG93bigKLSAgICB1Y2hhciBzY2FuQ29kZSkKLXsKLSAgICBpZiAoc2NhbkNvZGUgPiAweDdGKQotCXJldHVybiBmYWxzZTsKLSAgICBlbHNlCi0JcmV0dXJuIEVWVC5rZXlUYWJsZVtzY2FuQ29kZV0gIT0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci13aGF0ICAgICAgICAtIEV2ZW50IGNvZGUKLW1lc3NhZ2UgICAgIC0gRXZlbnQgbWVzc2FnZSAoQVNDSUkgY29kZSBhbmQgc2NhbiBjb2RlKQotCi1SRU1BUktTOgotQWRkcyBhIG5ldyBrZXlib2FyZCBldmVudCB0byB0aGUgZXZlbnQgcXVldWUuIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbQotd2l0aGluIHRoZSBrZXlib2FyZCBpbnRlcnJ1cHQgc3Vicm91dGluZSEKLQotTk9URTogICBJbnRlcnJ1cHRzIGFyZSBPRkYgd2hlbiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBrZXlib2FyZCBJU1IsCi0JYW5kIHdlIGxlYXZlIHRoZW0gT0ZGIHRoZSBlbnRpcmUgdGltZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhZGRLZXlFdmVudCgKLSAgICB1aW50IHdoYXQsCi0gICAgdWludCBtZXNzYWdlKQotewotICAgIGV2ZW50X3QgZXZ0OwotCi0gICAgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpIHsKLQkvKiBTYXZlIGluZm9ybWF0aW9uIGluIGV2ZW50IHJlY29yZCAqLwotCWV2dC53aGVuID0gX0VWVF9nZXRUaWNrcygpOwotCWV2dC53aGF0ID0gd2hhdDsKLQlldnQubWVzc2FnZSA9IG1lc3NhZ2UgfCAweDEwMDAwVUw7Ci0JZXZ0LndoZXJlX3ggPSAwOwotCWV2dC53aGVyZV95ID0gMDsKLQlldnQucmVsYXRpdmVfeCA9IDA7Ci0JZXZ0LnJlbGF0aXZlX3kgPSAwOwotCWV2dC5tb2RpZmllcnMgPSBFVlQua2V5TW9kaWZpZXJzOwotCWlmIChldnQud2hhdCA9PSBFVlRfS0VZUkVQRUFUKSB7Ci0JICAgIGlmIChFVlQub2xkS2V5ICE9IC0xKQotCQlFVlQuZXZ0cVtFVlQub2xkS2V5XS5tZXNzYWdlICs9IDB4MTAwMDBVTDsKLQkgICAgZWxzZSB7Ci0JCUVWVC5vbGRLZXkgPSBFVlQuZnJlZUhlYWQ7Ci0JCWFkZEV2ZW50KCZldnQpOyAgICAgICAgIC8qIEFkZCB0byB0YWlsIG9mIGV2ZW50IHF1ZXVlICAgKi8KLQkJfQotCSAgICB9Ci0JZWxzZSB7Ci0jaWZkZWYgX19RTlhfXwotCSAgICBfRVZUX21hc2tLZXlDb2RlKCZldnQpOwotI2VuZGlmCi0JICAgIGFkZEV2ZW50KCZldnQpOyAgICAgICAgICAgICAvKiBBZGQgdG8gdGFpbCBvZiBldmVudCBxdWV1ZSAgICovCi0JICAgIH0KLQlFVlQub2xkTW92ZSA9IC0xOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHdhaXRzIGZvciB0aGUga2V5Ym9hcmQgY29udHJvbGxlciB0byBzZXQgdGhlIHJlYWR5LWZvci13cml0ZQotYml0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQga2JXYWl0Rm9yV3JpdGVSZWFkeSh2b2lkKQotewotICAgIGludCB0aW1lb3V0ID0gODE5MjsKLSAgICB3aGlsZSAoKHRpbWVvdXQgPiAwKSAmJiAoUE1faW5wYigweDY0KSAmIDB4MDIpKQotCXRpbWVvdXQtLTsKLSAgICByZXR1cm4gKHRpbWVvdXQgPiAwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHdhaXRzIGZvciB0aGUga2V5Ym9hcmQgY29udHJvbGxlciB0byBzZXQgdGhlIHJlYWR5LWZvci1yZWFkCi1iaXQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBrYldhaXRGb3JSZWFkUmVhZHkodm9pZCkKLXsKLSAgICBpbnQgdGltZW91dCA9IDgxOTI7Ci0gICAgd2hpbGUgKCh0aW1lb3V0ID4gMCkgJiYgKCEoUE1faW5wYigweDY0KSAmIDB4MDEpKSkKLQl0aW1lb3V0LS07Ci0gICAgcmV0dXJuICh0aW1lb3V0ID4gMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZGF0YSAgICAtIERhdGEgdG8gc2VuZCB0byB0aGUga2V5Ym9hcmQKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gc2VuZHMgYSBkYXRhIGJ5dGUgdG8gdGhlIGtleWJvYXJkIGNvbnRyb2xsZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBrYlNlbmREYXRhKAotICAgIHVjaGFyIGRhdGEpCi17Ci0gICAgaW50IHJlc2VuZHMgPSA0OwotICAgIGludCB0aW1lb3V0LCB0ZW1wOwotCi0gICAgZG8gewotCWlmICgha2JXYWl0Rm9yV3JpdGVSZWFkeSgpKQotCSAgICByZXR1cm4gMDsKLQlQTV9vdXRwYigweDYwLGRhdGEpOwotCXRpbWVvdXQgPSA4MTkyOwotCXdoaWxlICgtLXRpbWVvdXQgPiAwKSB7Ci0JICAgIGlmICgha2JXYWl0Rm9yUmVhZFJlYWR5KCkpCi0JCXJldHVybiAwOwotCSAgICB0ZW1wID0gUE1faW5wYigweDYwKTsKLQkgICAgaWYgKHRlbXAgPT0gMHhGQSkKLQkJcmV0dXJuIDE7Ci0JICAgIGlmICh0ZW1wID09IDB4RkUpCi0JCWJyZWFrOwotCSAgICB9Ci0JfSB3aGlsZSAoKHJlc2VuZHMtLSA+IDApICYmICh0aW1lb3V0ID4gMCkpOwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW1vZGlmaWVycyAgIC0gS2V5Ym9hcmQgbW9kaWZpZXIgZmxhZ3MKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmUtcHJvZ3JhbXMgdGhlIExFRCdzIG9uIHRoZSBrZXlib2FyZCB0byB0aGUgdmFsdWVzIHN0b3JlZAotaW4gdGhlIHBhc3NlZCBpbiBtb2RpZmllciBmbGFncy4gSWYgdGhlICdhbGxvd0xFRFMnIGZsYWcgaXMgZmFsc2UsIHRoaXMKLWZ1bmN0aW9uIGRvZXMgbm90aGluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBzZXRMRURTKAotICAgIHVpbnQgbW9kaWZpZXJzKQotewotICAgIGlmIChFVlQuYWxsb3dMRURTKSB7Ci0JaWYgKCFrYlNlbmREYXRhKDB4RUQpIHx8ICFrYlNlbmREYXRhKChtb2RpZmllcnM+PjkpICYgNykpIHsKLQkgICAga2JTZW5kRGF0YSgweEY0KTsKLQkgICAgfQotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBwcm9jZXNzIHJhdyBzY2FuIGNvZGVzIHJlYWQgZnJvbSB0aGUga2V5Ym9hcmQgY29udHJvbGxlci4KLQotTk9URTogICBJbnRlcnJ1cHRzIGFyZSBPRkYgd2hlbiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBrZXlib2FyZCBJU1IsCi0JYW5kIHdlIGxlYXZlIHRoZW0gT0ZGIHRoZSBlbnRpcmUgdGltZS4KLXtzZWNyZXR9Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBwcm9jZXNzUmF3U2NhbkNvZGUoCi0gICAgaW50IHNjYW4pCi17Ci0gICAgc3RhdGljIGludCAgcGF1c2VMb29wID0gMDsKLSAgICBzdGF0aWMgaW50ICBleHRlbmRlZCA9IDA7Ci0gICAgaW50ICAgICAgICAgd2hhdDsKLQotICAgIGlmIChwYXVzZUxvb3ApIHsKLQkvKiBTa2lwIHNjYW4gY29kZXMgdW50aWwgdGhlIHBhdXNlIGtleSBzZXF1ZW5jZSBoYXMgYmVlbiByZWFkICovCi0JcGF1c2VMb29wLS07Ci0JfQotICAgIGVsc2UgaWYgKHNjYW4gPT0gMHhFMCkgewotCS8qIFRoaXMgc2lnbmFscyB0aGUgc3RhcnQgb2YgYW4gZXh0ZW5kZWQgc2NhbiBjb2RlIHNlcXVlbmNlICovCi0JZXh0ZW5kZWQgPSAxOwotCX0KLSAgICBlbHNlIGlmIChzY2FuID09IDB4RTEpIHsKLQkvKiBUaGUgUGF1c2Uga2V5IHNlbmRzIGEgc3RyYW5nZSBzY2FuIGNvZGUgc2VxdWVuY2UsIHdoaWNoIGlzOgotCSAqCi0JICogIEUxIDFEIDUyIEUxIDlEIEQyCi0JICoKLQkgKiBIb3dldmVyIHRoZXJlIGlzIG5ldmVyIGFueSByZWxlYXNlIGNvZGUgbm9yIGFueSBhdXRvLXJlcGVhdCBmb3IKLQkgKiB0aGlzIGtleS4gRm9yIHRoaXMgcmVhc29uIHdlIHNpbXBseSBpZ25vcmUgdGhlIGtleSBhbmQgc2tpcCB0aGUKLQkgKiBuZXh0IDUgc2NhbiBjb2RlcyByZWFkIGZyb20gdGhlIGtleWJvYXJkLgotCSAqLwotCXBhdXNlTG9vcCA9IDU7Ci0JfQotICAgIGVsc2UgewotCS8qIFByb2Nlc3MgdGhlIHNjYW4gY29kZSBub3JtYWxseSAoaXQgbWF5IGJlIGFuIGV4dGVuZGVkIGNvZGUKLQkgKiBob3dldmVyISkuIEJpdCA3IG1lYW5zIGtleSB3YXMgcmVsZWFzZWQsIGFuZCBiaXRzIDAtNiBhcmUgdGhlCi0JICogc2NhbiBjb2RlLgotCSAqLwotCXdoYXQgPSAoc2NhbiAmIDB4ODApID8gRVZUX0tFWVVQIDogRVZUX0tFWURPV047Ci0Jc2NhbiAmPSAweDdGOwotCWlmIChleHRlbmRlZCkgewotCSAgICBleHRlbmRlZCA9IDA7Ci0JICAgIGlmIChzY2FuID09IDB4MkEgfHwgc2NhbiA9PSAweDM2KSB7Ci0JCS8qIElnbm9yZSB0aGVzZSBleHRlbmRlZCBzY2FuIGNvZGUgc2VxdWVuY2VzLiBUaGVzZSBhcmUKLQkJICogdXNlZCBieSB0aGUga2V5Ym9hcmQgY29udHJvbGxlciB0byB3cmFwIGFyb3VuZCBjZXJ0YWluCi0JCSAqIGtleSBzZXF1ZW5jZXMgZm9yIHRoZSBrZXlwYWQgKGFuZCB3aGVuIE5VTUxPQ0sgaXMgZG93bgotCQkgKiBpbnRlcm5hbGx5KS4KLQkJICovCi0JCXJldHVybjsKLQkJfQotCi0JICAgIC8qIENvbnZlcnQgZXh0ZW5kZWQgY29kZXMgZm9yIGtleSBzZXF1ZW5jZXMgdGhhdCB3ZSBtYXAgdG8KLQkgICAgICogdmlydHVhbCBzY2FuIGNvZGVzIHNvIHRoZSB1c2VyIGNhbiBkZXRlY3QgdGhlbSBpbiB0aGVpcgotCSAgICAgKiBjb2RlLgotCSAgICAgKi8KLQkgICAgc3dpdGNoIChzY2FuKSB7Ci0JCWNhc2UgS0JfbGVmdEN0cmw6ICAgc2NhbiA9IEtCX3JpZ2h0Q3RybDsgICAgYnJlYWs7Ci0JCWNhc2UgS0JfbGVmdEFsdDogICAgc2NhbiA9IEtCX3JpZ2h0QWx0OyAgICAgYnJlYWs7Ci0JCWNhc2UgS0JfZGl2aWRlOiAgICAgc2NhbiA9IEtCX3BhZERpdmlkZTsgICAgYnJlYWs7Ci0JCWNhc2UgS0JfZW50ZXI6ICAgICAgc2NhbiA9IEtCX3BhZEVudGVyOyAgICAgYnJlYWs7Ci0JCWNhc2UgS0JfcGFkVGltZXM6ICAgc2NhbiA9IEtCX3N5c1JlcTsgICAgICAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCWVsc2UgewotCSAgICAvKiBDb252ZXJ0IHJlZ3VsYXIgc2NhbiBjb2RlcyBmb3Iga2V5IHNlcXVlbmNlcyB0aGF0IHdlIG1hcCB0bwotCSAgICAgKiB2aXJ0dWFsIHNjYW4gY29kZXMgc28gdGhlIHVzZXIgY2FuIGRldGVjdCB0aGVtIGluIHRoZWlyCi0JICAgICAqIGNvZGUuCi0JICAgICAqLwotCSAgICBzd2l0Y2ggKHNjYW4pIHsKLQkJY2FzZSBLQl9sZWZ0OiAgICAgICBzY2FuID0gS0JfcGFkTGVmdDsgICAgICBicmVhazsKLQkJY2FzZSBLQl9yaWdodDogICAgICBzY2FuID0gS0JfcGFkUmlnaHQ7ICAgICBicmVhazsKLQkJY2FzZSBLQl91cDogICAgICAgICBzY2FuID0gS0JfcGFkVXA7ICAgICAgICBicmVhazsKLQkJY2FzZSBLQl9kb3duOiAgICAgICBzY2FuID0gS0JfcGFkRG93bjsgICAgICBicmVhazsKLQkJY2FzZSBLQl9pbnNlcnQ6ICAgICBzY2FuID0gS0JfcGFkSW5zZXJ0OyAgICBicmVhazsKLQkJY2FzZSBLQl9kZWxldGU6ICAgICBzY2FuID0gS0JfcGFkRGVsZXRlOyAgICBicmVhazsKLQkJY2FzZSBLQl9ob21lOiAgICAgICBzY2FuID0gS0JfcGFkSG9tZTsgICAgICBicmVhazsKLQkJY2FzZSBLQl9lbmQ6ICAgICAgICBzY2FuID0gS0JfcGFkRW5kOyAgICAgICBicmVhazsKLQkJY2FzZSBLQl9wYWdlVXA6ICAgICBzY2FuID0gS0JfcGFkUGFnZVVwOyAgICBicmVhazsKLQkJY2FzZSBLQl9wYWdlRG93bjogICBzY2FuID0gS0JfcGFkUGFnZURvd247ICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkvKiBEZXRlcm1pbmUgaWYgdGhlIGtleSBpcyBhbiBVUCwgRE9XTiBvciBSRVBFQVQgYW5kIG1haW50YWluIHRoZQotCSAqIHVwL2Rvd24gc3RhdHVzIG9mIGFsbCBrZXlzIGluIG91ciBnbG9iYWwga2V5IGFycmF5LgotCSAqLwotCWlmICh3aGF0ID09IEVWVF9LRVlET1dOKSB7Ci0JICAgIGlmIChFVlQua2V5VGFibGVbc2Nhbl0pCi0JCXdoYXQgPSBFVlRfS0VZUkVQRUFUOwotCSAgICBlbHNlCi0JCUVWVC5rZXlUYWJsZVtzY2FuXSA9IHNjYW47Ci0JICAgIH0KLQllbHNlIHsKLQkgICAgRVZULmtleVRhYmxlW3NjYW5dID0gMDsKLQkgICAgfQotCi0JLyogSGFuZGxlIHNoaWZ0IGtleSBtb2RpZmllcnMgKi8KLQlpZiAod2hhdCAhPSBFVlRfS0VZUkVQRUFUKSB7Ci0JICAgIHN3aXRjaCAoc2NhbikgewotCQljYXNlIEtCX2NhcHNMb2NrOgotCQkgICAgaWYgKHdoYXQgPT0gRVZUX0tFWURPV04pCi0JCQlFVlQua2V5TW9kaWZpZXJzIF49IEVWVF9DQVBTTE9DSzsKLQkJICAgIHNldExFRFMoRVZULmtleU1vZGlmaWVycyk7Ci0JCSAgICBicmVhazsKLQkJY2FzZSBLQl9udW1Mb2NrOgotCQkgICAgaWYgKHdoYXQgPT0gRVZUX0tFWURPV04pCi0JCQlFVlQua2V5TW9kaWZpZXJzIF49IEVWVF9OVU1MT0NLOwotCQkgICAgc2V0TEVEUyhFVlQua2V5TW9kaWZpZXJzKTsKLQkJICAgIGJyZWFrOwotCQljYXNlIEtCX3Njcm9sbExvY2s6Ci0JCSAgICBpZiAod2hhdCA9PSBFVlRfS0VZRE9XTikKLQkJCUVWVC5rZXlNb2RpZmllcnMgXj0gRVZUX1NDUk9MTExPQ0s7Ci0JCSAgICBzZXRMRURTKEVWVC5rZXlNb2RpZmllcnMpOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgS0JfbGVmdFNoaWZ0OgotCQkgICAgaWYgKHdoYXQgPT0gRVZUX0tFWVVQKQotCQkJRVZULmtleU1vZGlmaWVycyAmPSB+RVZUX0xFRlRTSElGVDsKLQkJICAgIGVsc2UKLQkJCUVWVC5rZXlNb2RpZmllcnMgfD0gRVZUX0xFRlRTSElGVDsKLQkJICAgIGJyZWFrOwotCQljYXNlIEtCX3JpZ2h0U2hpZnQ6Ci0JCSAgICBpZiAod2hhdCA9PSBFVlRfS0VZVVApCi0JCQlFVlQua2V5TW9kaWZpZXJzICY9IH5FVlRfUklHSFRTSElGVDsKLQkJICAgIGVsc2UKLQkJCUVWVC5rZXlNb2RpZmllcnMgfD0gRVZUX1JJR0hUU0hJRlQ7Ci0JCSAgICBicmVhazsKLQkJY2FzZSBLQl9sZWZ0Q3RybDoKLQkJICAgIGlmICh3aGF0ID09IEVWVF9LRVlVUCkKLQkJCUVWVC5rZXlNb2RpZmllcnMgJj0gfkVWVF9MRUZUQ1RSTDsKLQkJICAgIGVsc2UKLQkJCUVWVC5rZXlNb2RpZmllcnMgfD0gRVZUX0xFRlRDVFJMOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgS0JfcmlnaHRDdHJsOgotCQkgICAgaWYgKHdoYXQgPT0gRVZUX0tFWVVQKQotCQkJRVZULmtleU1vZGlmaWVycyAmPSB+RVZUX1JJR0hUQ1RSTDsKLQkJICAgIGVsc2UKLQkJCUVWVC5rZXlNb2RpZmllcnMgfD0gRVZUX1JJR0hUQ1RSTDsKLQkJICAgIGJyZWFrOwotCQljYXNlIEtCX2xlZnRBbHQ6Ci0JCSAgICBpZiAod2hhdCA9PSBFVlRfS0VZVVApCi0JCQlFVlQua2V5TW9kaWZpZXJzICY9IH5FVlRfTEVGVEFMVDsKLQkJICAgIGVsc2UKLQkJCUVWVC5rZXlNb2RpZmllcnMgfD0gRVZUX0xFRlRBTFQ7Ci0JCSAgICBicmVhazsKLQkJY2FzZSBLQl9yaWdodEFsdDoKLQkJICAgIGlmICh3aGF0ID09IEVWVF9LRVlVUCkKLQkJCUVWVC5rZXlNb2RpZmllcnMgJj0gfkVWVF9SSUdIVEFMVDsKLQkJICAgIGVsc2UKLQkJCUVWVC5rZXlNb2RpZmllcnMgfD0gRVZUX1JJR0hUQUxUOwotCQkgICAgYnJlYWs7Ci0jaWZkZWYgU1VQUE9SVF9DVFJMX0FMVF9ERUwKLQkJY2FzZSBLQl9kZWxldGU6Ci0JCSAgICBpZiAoKEVWVC5rZXlNb2RpZmllcnMgJiBFVlRfQ1RSTFNUQVRFKSAmJiAoRVZULmtleU1vZGlmaWVycyAmIEVWVF9BTFRTVEFURSkpCi0JCQlSZWJvb3QoKTsKLQkJICAgIGJyZWFrOwotI2VuZGlmCi0JCX0KLQkgICAgfQotCi0JLyogQWRkIHRoZSB1bnRyYW5zbGF0ZWQga2V5IGNvZGUgdG8gdGhlIGV2ZW50IHF1ZXVlLiBBbGwKLQkgKiB0cmFuc2xhdGlvbiB0byBBU0NJSSBmcm9tIHRoZSBrZXkgY29kZXMgb2NjdXJzIHdoZW4gdGhlIGtleQotCSAqIGlzIGV4dHJhY3RlZCBmcm9tIHRoZSBxdWV1ZSwgc2F2aW5nIHRpbWUgaW4gdGhlIGxvdyBsZXZlbAotCSAqIGludGVycnVwdCBoYW5kbGVyLgotCSAqLwotCWFkZEtleUV2ZW50KHdoYXQsc2NhbiA8PCA4KTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUVuYWJsZXMvZGlzYWJsZXMgdGhlIHVwZGF0ZSBvZiB0aGUga2V5Ym9hcmQgTEVEIHN0YXR1cyBpbmRpY2F0b3JzLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVBBUkFNRVRFUlM6Ci1lbmFibGUgIC0gVHJ1ZSB0byBlbmFibGUsIGZhbHNlIHRvIGRpc2FibGUKLQotUkVNQVJLUzoKLUVuYWJsZXMgdGhlIHVwZGF0ZSBvZiB0aGUga2V5Ym9hcmQgTEVEIHN0YXR1cyBpbmRpY2F0b3JzLiBTb21ldGltZXMgaXQgbWF5Ci1iZSBjb252ZW5pZW50IGluIHRoZSBhcHBsaWNhdGlvbiB0byB0dXJuIG9mZiB0aGUgdXBkYXRpbmcgb2YgdGhlIExFRAotc3RhdHVzIGluZGljYXRvcnMgKHN1Y2ggYXMgaWYgYSBnYW1lIGlzIHVzaW5nIHRoZSBDQVBTTE9DSyBrZXkgZm9yIHNvbWUKLWZ1bmN0aW9uKS4gUGFzc2luZyBpbiBhIHZhbHVlIG9mIEZBTFNFIHRvIHRoaXMgZnVuY3Rpb24gd2lsbCB0dXJuIG9mZiBhbGwKLXRoZSBMRURTLCBhbmQgc3RvcCB1cGRhdGluZyB0aGVtIHdoZW4gdGhlIGludGVybmFsIHN0YXR1cyBjaGFuZ2VzIChub3RlCi1ob3dldmVyIHRoYXQgaW50ZXJuYWxseSB3ZSBzdGlsbCBrZWVwIHRyYWNrIG9mIHRoZSB0b2dnbGUga2V5IHN0YXR1cyEpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9hbGxvd0xFRFMoCi0gICAgaWJvb2wgZW5hYmxlKQotewotICAgIEVWVC5hbGxvd0xFRFMgPSB0cnVlOwotICAgIGlmIChlbmFibGUpCi0Jc2V0TEVEUyhFVlQua2V5TW9kaWZpZXJzKTsKLSAgICBlbHNlCi0Jc2V0TEVEUygwKTsKLSAgICBFVlQuYWxsb3dMRURTID0gZW5hYmxlOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL21hbGxvYy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL21hbGxvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2VmMjIxLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9tYWxsb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBNb2R1bGUgZm9yIGltcGxlbWVudGluZyB0aGUgUE0gbGlicmFyeSBvdmVycmlkZWFibGUgbWVtb3J5Ci0qICAgICAgICAgICAgICAgYWxsb2NhdG9yIGZ1bmN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkICogKCpfX1BNX21hbGxvYykoc2l6ZV90IHNpemUpICAgICAgICAgICAgICA9IG1hbGxvYzsKLXZvaWQgKiAoKl9fUE1fY2FsbG9jKShzaXplX3QgbmVsZW0sc2l6ZV90IHNpemUpID0gY2FsbG9jOwotdm9pZCAqICgqX19QTV9yZWFsbG9jKSh2b2lkICpwdHIsc2l6ZV90IHNpemUpICAgPSByZWFsbG9jOwotdm9pZCAoKl9fUE1fZnJlZSkodm9pZCAqcCkgICAgICAgICAgICAgICAgICAgICAgPSBmcmVlOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1Vc2UgbG9jYWwgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMuCi0KLUhFQURFUjoKLXBtYXBpLmgKLQotUEFSQU1FVEVSUzoKLW1hbGxvYyAgLSBQb2ludGVyIHRvIG5ldyBtYWxsb2Mgcm91dGluZSB0byB1c2UKLWNhbGxvYyAgLSBQb2ludGVyIHRvIG5ldyBjYWFsbG9jIHJvdXRpbmUgdG8gdXNlCi1yZWFsbG9jIC0gUG9pbnRlciB0byBuZXcgcmVhbGxvYyByb3V0aW5lIHRvIHVzZQotZnJlZSAgICAtIFBvaW50ZXIgdG8gbmV3IGZyZWUgcm91dGluZSB0byB1c2UKLQotUkVNQVJLUzoKLVRlbGxzIHRoZSBQTSBsaWJyYXJ5IHRvIHVzZSBhIHNldCBvZiB1c2VyIHNwZWNpZmllZCBtZW1vcnkgYWxsb2NhdGlvbgotcm91dGluZXMgaW5zdGVhZCBvZiB1c2luZyB0aGUgbm9ybWFsIG1hbGxvYy9jYWxsb2MvcmVhbGxvYy9mcmVlIHN0YW5kYXJkCi1DIGxpYnJhcnkgZnVuY3Rpb25zLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2lzaCB0byB1c2UgYSB0aGlyZCBwYXJ0eQotZGVidWdnaW5nIG1hbGxvYyBsaWJyYXJ5IG9yIHBlcmhhcHMgYSBzZXQgb2YgZmFzdGVyIG1lbW9yeSBhbGxvY2F0aW9uCi1mdW5jdGlvbnMgd2l0aCB0aGUgUE0gbGlicmFyeSwgb3IgYW55IGFwcHMgdGhhdCB1c2UgdGhlIFBNIGxpYnJhcnkgKHN1Y2ggYXMKLXRoZSBNR0wpLiBPbmNlIHlvdSBoYXZlIHJlZ2lzdGVyZWQgeW91ciBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcywgYWxsCi1jYWxscyB0byBQTV9tYWxsb2MsIFBNX2NhbGxvYywgUE1fcmVhbGxvYyBhbmQgUE1fZnJlZSB3aWxsIGJlIHJldmVjdG9yZWQgdG8KLXlvdXIgbG9jYWwgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMuCi0KLVRoaXMgaXMgYWxzbyB1c2VmdWwgaWYgeW91IG5lZWQgdG8ga2VlcCB0cmFjayBvZiBqdXN0IGhvdyBtdWNoIHBoeXNpY2FsCi1tZW1vcnkgeW91ciBwcm9ncmFtIGhhcyBiZWVuIHVzaW5nLiBZb3UgY2FuIHVzZSB0aGUgUE1fYXZhaWxhYmxlTWVtb3J5Ci1mdW5jdGlvbiB0byBmaW5kIG91dCBob3cgbXVjaCBwaHlzaWNhbCBtZW1vcnkgaXMgYXZhaWxhYmxlIHdoZW4gdGhlIHByb2dyYW0KLXN0YXJ0cywgYW5kIHRoZW4geW91IGNhbiB1c2UgeW91ciBvd24gbG9jYWwgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMgdG8KLWtlZXAgdHJhY2sgb2YgaG93IG11Y2ggbWVtb3J5IGhhcyBiZWVuIHVzZWQgYW5kIGZyZWVkLgotCi1OT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgcmlnaHQgYXQgdGhlIHN0YXJ0IG9mIHlvdXIgYXBwbGljYXRpb24sCi0gICAgICBiZWZvcmUgeW91IGluaXRpYWxpc2UgYW55IG90aGVyIGNvbXBvbmVudHMgb3IgbGlicmFyaWVzLgotCi1OT1RFOiBDb2RlIGNvbXBpbGVkIGludG8gQmluYXJ5IFBvcnRhYmxlIERMTCdzIGFuZCBEcml2ZXJzIGF1dG9tYXRpY2FsbHkKLSAgICAgIGVuZCB1cCBjYWxsaW5nIHRoZXNlIGZ1bmN0aW9ucyB2aWEgdGhlIEJQRCBDIHJ1bnRpbWUgbGlicmFyeS4KLQotU0VFIEFMU086Ci1QTV9tYWxsb2MsIFBNX2NhbGxvYywgUE1fcmVhbGxvYywgUE1fZnJlZSwgUE1fYXZhaWxhYmxlTWVtb3J5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV91c2VMb2NhbE1hbGxvYygKLSAgICB2b2lkICogKCptYWxsb2MpKHNpemVfdCBzaXplKSwKLSAgICB2b2lkICogKCpjYWxsb2MpKHNpemVfdCBuZWxlbSxzaXplX3Qgc2l6ZSksCi0gICAgdm9pZCAqICgqcmVhbGxvYykodm9pZCAqcHRyLHNpemVfdCBzaXplKSwKLSAgICB2b2lkICgqZnJlZSkodm9pZCAqcCkpCi17Ci0gICAgX19QTV9tYWxsb2MgPSBtYWxsb2M7Ci0gICAgX19QTV9jYWxsb2MgPSBjYWxsb2M7Ci0gICAgX19QTV9yZWFsbG9jID0gcmVhbGxvYzsKLSAgICBfX1BNX2ZyZWUgPSBmcmVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1BbGxvY2F0ZSBhIGJsb2NrIG9mIG1lbW9yeS4KLQotSEVBREVSOgotcG1hcGkuaAotCi1QQVJBTUVURVJTOgotc2l6ZSAgICAtIFNpemUgb2YgYmxvY2sgdG8gYWxsb2NhdGUgaW4gYnl0ZXMKLQotUkVUVVJOUzoKLVBvaW50ZXIgdG8gYWxsb2NhdGVkIGJsb2NrLCBvciBOVUxMIGlmIG91dCBvZiBtZW1vcnkuCi0KLVJFTUFSS1M6Ci1BbGxvY2F0ZXMgYSBibG9jayBvZiBtZW1vcnkgb2YgbGVuZ3RoIHNpemUuIElmIHlvdSBoYXZlIGNoYW5nZWQgdGhlIG1lbW9yeQotYWxsb2NhdGlvbiByb3V0aW5lcyB3aXRoIHRoZSBQTV91c2VMb2NhbE1hbGxvYyBmdW5jdGlvbiwgdGhlbiBjYWxscyB0byB0aGlzCi1mdW5jdGlvbiB3aWxsIGFjdHVhbGx5IG1ha2UgY2FsbHMgdG8gdGhlIGxvY2FsIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzCi10aGF0IHlvdSBoYXZlIHJlZ2lzdGVyZWQuCi0KLVNFRSBBTFNPOgotUE1fY2FsbG9jLCBQTV9yZWFsbG9jLCBQTV9mcmVlLCBQTV91c2VMb2NhbE1hbGxvYwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9tYWxsb2MoCi0gICAgc2l6ZV90IHNpemUpCi17Ci0gICAgcmV0dXJuIF9fUE1fbWFsbG9jKHNpemUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1BbGxvY2F0ZSBhbmQgY2xlYXIgYSBsYXJnZSBtZW1vcnkgYmxvY2suCi0KLUhFQURFUjoKLXBtYXBpLmgKLQotUEFSQU1FVEVSUzoKLW5lbGVtICAgLSBudW1iZXIgb2YgY29udGlndW91cyBzaXplLWJ5dGUgdW5pdHMgdG8gYWxsb2NhdGUKLXNpemUgICAgLSBzaXplIG9mIHVuaXQgaW4gYnl0ZXMKLQotUkVUVVJOUzoKLVBvaW50ZXIgdG8gYWxsb2NhdGVkIG1lbW9yeSBpZiBzdWNjZXNzZnVsLCBOVUxMIGlmIG91dCBvZiBtZW1vcnkuCi0KLVJFTUFSS1M6Ci1BbGxvY2F0ZXMgYSBibG9jayBvZiBtZW1vcnkgb2YgbGVuZ3RoIChzaXplICogbmVsZW0pLCBhbmQgY2xlYXJzIHRoZQotYWxsb2NhdGVkIGFyZWEgd2l0aCB6ZXJvcyAoMCkuIElmIHlvdSBoYXZlIGNoYW5nZWQgdGhlIG1lbW9yeSBhbGxvY2F0aW9uCi1yb3V0aW5lcyB3aXRoIHRoZSBQTV91c2VMb2NhbE1hbGxvYyBmdW5jdGlvbiwgdGhlbiBjYWxscyB0byB0aGlzIGZ1bmN0aW9uCi13aWxsIGFjdHVhbGx5IG1ha2UgY2FsbHMgdG8gdGhlIGxvY2FsIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIHRoYXQgeW91Ci1oYXZlIHJlZ2lzdGVyZWQuCi0KLVNFRSBBTFNPOgotUE1fbWFsbG9jLCBQTV9yZWFsbG9jLCBQTV9mcmVlLCBQTV91c2VMb2NhbE1hbGxvYwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9jYWxsb2MoCi0gICAgc2l6ZV90IG5lbGVtLAotICAgIHNpemVfdCBzaXplKQotewotICAgIHJldHVybiBfX1BNX2NhbGxvYyhuZWxlbSxzaXplKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotUmUtYWxsb2NhdGUgYSBibG9jayBvZiBtZW1vcnkKLQotSEVBREVSOgotcG1hcGkuaAotCi1QQVJBTUVURVJTOgotcHRyICAgICAtIFBvaW50ZXIgdG8gYmxvY2sgdG8gcmVzaXplCi1zaXplICAgIC0gc2l6ZSBvZiB1bml0IGluIGJ5dGVzCi0KLVJFVFVSTlM6Ci1Qb2ludGVyIHRvIGFsbG9jYXRlZCBtZW1vcnkgaWYgc3VjY2Vzc2Z1bCwgTlVMTCBpZiBvdXQgb2YgbWVtb3J5LgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZWFsbG9jYXRlcyBhIGJsb2NrIG9mIG1lbW9yeSB0aGF0IGhhcyBiZWVuIHByZXZpb3VzbHkgYmVlbgotYWxsb2NhdGVkIHRvIHRoZSBuZXcgb2Ygc2l6ZS4gVGhlIG5ldyBzaXplIG1heSBiZSBzbWFsbGVyIG9yIGxhcmdlciB0aGFuCi10aGUgb3JpZ2luYWwgYmxvY2sgb2YgbWVtb3J5LiBJZiB5b3UgaGF2ZSBjaGFuZ2VkIHRoZSBtZW1vcnkgYWxsb2NhdGlvbgotcm91dGluZXMgd2l0aCB0aGUgUE1fdXNlTG9jYWxNYWxsb2MgZnVuY3Rpb24sIHRoZW4gY2FsbHMgdG8gdGhpcyBmdW5jdGlvbgotd2lsbCBhY3R1YWxseSBtYWtlIGNhbGxzIHRvIHRoZSBsb2NhbCBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcyB0aGF0IHlvdQotaGF2ZSByZWdpc3RlcmVkLgotCi1TRUUgQUxTTzoKLVBNX21hbGxvYywgUE1fY2FsbG9jLCBQTV9mcmVlLCBQTV91c2VMb2NhbE1hbGxvYwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9yZWFsbG9jKAotICAgIHZvaWQgKnB0ciwKLSAgICBzaXplX3Qgc2l6ZSkKLXsKLSAgICByZXR1cm4gX19QTV9yZWFsbG9jKHB0cixzaXplKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotRnJlZXMgYSBibG9jayBvZiBtZW1vcnkuCi0KLUhFQURFUjoKLXBtYXBpLmgKLQotUEFSQU1FVEVSUzoKLXAgICAtIFBvaW50ZXIgdG8gbWVtb3J5IGJsb2NrIHRvIGZyZWUKLQotUkVNQVJLUzoKLUZyZWVzIGEgYmxvY2sgb2YgbWVtb3J5IHByZXZpb3VzbHkgYWxsb2NhdGVkIHdpdGggZWl0aGVyIFBNX21hbGxvYywKLVBNX2NhbGxvYyBvciBQTV9yZWFsbG9jLgotCi1TRUUgQUxTTzoKLVBNX21hbGxvYywgUE1fY2FsbG9jLCBQTV9yZWFsbG9jLCBQTV91c2VMb2NhbE1hbGxvYwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZSgKLSAgICB2b2lkICpwKQotewotICAgIF9fUE1fZnJlZShwKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9tdHJyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vbXRyci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWQ1ZjQ1Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9tdHJyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgICAgICAgICAgICAgSGVhdmlseSBiYXNlZCBvbiBjb2RlIGNvcHlyaWdodCAoQykgUmljaGFyZCBHb29jaAotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBSaW5nIDAgZGV2aWNlIGRyaXZlcgotKgotKiBEZXNjcmlwdGlvbjogIEdlbmVyaWMgTWVtb3J5IFR5cGUgUmFuZ2UgUmVnaXN0ZXIgKE1UUlIpIGZ1bmN0aW9ucyB0bwotKiAgICAgICAgICAgICAgIG1hbmlwdWxhdGUgdGhlIE1UUlIgcmVnaXN0ZXJzIG9uIHN1cHBvcnRlZCBDUFUncy4gVGhpcyBjb2RlCi0qICAgICAgICAgICAgICAgKm11c3QqIHJ1biBhdCByaW5nIDAsIHNvIHlvdSBjYW4ndCBub3JtYWxseSBpbmNsdWRlIHRoaXMKLSogICAgICAgICAgICAgICBjb2RlIGRpcmVjdGx5IGluIG5vcm1hbCBhcHBsaWNhdGlvbnMgKHRoZSBleGNlcHQgaXMgRE9TNEdXCi0qICAgICAgICAgICAgICAgYXBwcyB3aGljaCBydW4gYXQgcmluZyAwIHVuZGVyIHJlYWwgRE9TKS4gVGh1cyB0aGlzIGNvZGUKLSogICAgICAgICAgICAgICB3aWxsIG5vcm1hbGx5IGJlIGNvbXBpbGVkIGludG8gYSByaW5nIDAgZGV2aWNlIGRyaXZlciBmb3IKLSogICAgICAgICAgICAgICB0aGUgdGFyZ2V0IG9wZXJhdGluZyBzeXN0ZW0uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJ6dGltZXJjLmgiCi0jaW5jbHVkZSAibXRyci5oIgotCi0jaWZuZGVmIFJFQUxNT0RFCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEludGVsIHByZS1kZWZpbmVkIE1UUlIgcmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgTlVNX0ZJWEVEX1JBTkdFUyAgICAgICAgODgKLSNkZWZpbmUgSU5URUxfY2FwX01TUiAgICAgICAgICAgMHgwRkUKLSNkZWZpbmUgSU5URUxfZGVmVHlwZV9NU1IgICAgICAgMHgyRkYKLSNkZWZpbmUgSU5URUxfZml4NjRLXzAwMDAwX01TUiAgMHgyNTAKLSNkZWZpbmUgSU5URUxfZml4MTZLXzgwMDAwX01TUiAgMHgyNTgKLSNkZWZpbmUgSU5URUxfZml4MTZLX0EwMDAwX01TUiAgMHgyNTkKLSNkZWZpbmUgSU5URUxfZml4NEtfQzAwMDBfTVNSICAgMHgyNjgKLSNkZWZpbmUgSU5URUxfZml4NEtfQzgwMDBfTVNSICAgMHgyNjkKLSNkZWZpbmUgSU5URUxfZml4NEtfRDAwMDBfTVNSICAgMHgyNkEKLSNkZWZpbmUgSU5URUxfZml4NEtfRDgwMDBfTVNSICAgMHgyNkIKLSNkZWZpbmUgSU5URUxfZml4NEtfRTAwMDBfTVNSICAgMHgyNkMKLSNkZWZpbmUgSU5URUxfZml4NEtfRTgwMDBfTVNSICAgMHgyNkQKLSNkZWZpbmUgSU5URUxfZml4NEtfRjAwMDBfTVNSICAgMHgyNkUKLSNkZWZpbmUgSU5URUxfZml4NEtfRjgwMDBfTVNSICAgMHgyNkYKLQotLyogTWFjcm9zIHRvIGZpbmQgdGhlIGFkZHJlc3Mgb2YgYSBwYXJpY3VsYXIgTVNSIHJlZ2lzdGVyICovCi0KLSNkZWZpbmUgSU5URUxfcGh5c0Jhc2VfTVNSKHJlZykgKDB4MjAwICsgMiAqIChyZWcpKQotI2RlZmluZSBJTlRFTF9waHlzTWFza19NU1IocmVnKSAoMHgyMDAgKyAyICogKHJlZykgKyAxKQotCi0vKiBDeXJpeCBDUFUgY29uZmlndXJhdGlvbiByZWdpc3RlciBpbmRleGVzICovCi0jZGVmaW5lIENYODZfQ0NSMCAweEMwCi0jZGVmaW5lIENYODZfQ0NSMSAweEMxCi0jZGVmaW5lIENYODZfQ0NSMiAweEMyCi0jZGVmaW5lIENYODZfQ0NSMyAweEMzCi0jZGVmaW5lIENYODZfQ0NSNCAweEU4Ci0jZGVmaW5lIENYODZfQ0NSNSAweEU5Ci0jZGVmaW5lIENYODZfQ0NSNiAweEVBCi0jZGVmaW5lIENYODZfRElSMCAweEZFCi0jZGVmaW5lIENYODZfRElSMSAweEZGCi0jZGVmaW5lIENYODZfQVJSX0JBU0UgMHhDNAotI2RlZmluZSBDWDg2X1JDUl9CQVNFIDB4REMKLQotLyogU3RydWN0dXJlIHRvIG1haW50YWluIG1hY2hpbmUgc3RhdGUgd2hpbGUgdXBkYXRpbmcgTVRSUiByZWdpc3RlcnMgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVsb25nICAgZmxhZ3M7Ci0gICAgdWxvbmcgICBkZWZUeXBlTG87Ci0gICAgdWxvbmcgICBkZWZUeXBlSGk7Ci0gICAgdWxvbmcgICBjcjRWYWw7Ci0gICAgdWxvbmcgICBjY3IzOwotICAgIH0gTVRSUkNvbnRleHQ7Ci0KLXN0YXRpYyBpbnQgICAgICBudW1NVFJSID0gLTE7Ci1zdGF0aWMgaW50ICAgICAgY3B1RmFtaWx5LGNwdVR5cGUsY3B1U3RlcHBpbmc7Ci1zdGF0aWMgdm9pZCAgICAgKCpnZXRNVFJSKSh1aW50IHJlZyx1bG9uZyAqYmFzZSx1bG9uZyAqc2l6ZSxpbnQgKnR5cGUpID0gTlVMTDsKLXN0YXRpYyB2b2lkICAgICAoKnNldE1UUlIpKHVpbnQgcmVnLHVsb25nIGJhc2UsdWxvbmcgc2l6ZSxpbnQgdHlwZSkgPSBOVUxMOwotc3RhdGljIGludCAgICAgICgqZ2V0RnJlZVJlZ2lvbikodWxvbmcgYmFzZSx1bG9uZyBzaXplKSA9IE5VTEw7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVRVUk5TOgotUmV0dXJucyBub24temVybyBpZiB3ZSBoYXZlIHRoZSB3cml0ZS1jb21iaW5pbmcgbWVtb3J5IHR5cGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IE1UUlJfaGF2ZVdyaXRlQ29tYmluZSh2b2lkKQotewotICAgIHVsb25nICAgY29uZmlnLGR1bW15OwotCi0gICAgc3dpdGNoIChjcHVGYW1pbHkpIHsKLQljYXNlIENQVV9BTUQ6Ci0JICAgIGlmIChjcHVUeXBlIDwgQ1BVX0FNREF0aGxvbikgewotCQkvKiBBTUQgSzYtMiBzdGVwcGluZyA4IGFuZCBsYXRlciBzdXBwb3J0IHRoZSBNVFJSIHJlZ2lzdGVycy4KLQkJICogVGhlIGVhcmxpZXIgSzYtMiBzdGVwcGluZ3MgKDMwME1oeiBtb2RlbHMpIGRvIG5vdAotCQkgKiBzdXBwb3J0IE1UUlIncy4KLQkJICovCi0JCWlmICgoY3B1VHlwZSA8IENQVV9BTURLNl8yKSB8fCAoY3B1VHlwZSA9PSBDUFVfQU1ESzZfMiAmJiBjcHVTdGVwcGluZyA8IDgpKQotCQkgICAgcmV0dXJuIDA7Ci0JCXJldHVybiAxOwotCQl9Ci0JICAgIC8qIEZhbGwgdGhyb3VnaCBmb3IgQU1EIEF0aGxvbiB3aGljaCB1c2VzIFA2IHN0eWxlIE1UUlIncyAqLwotCWNhc2UgQ1BVX0ludGVsOgotCSAgICBfTVRSUl9yZWFkTVNSKElOVEVMX2NhcF9NU1IsJmNvbmZpZywmZHVtbXkpOwotCSAgICByZXR1cm4gKGNvbmZpZyAmICgxIDw8IDEwKSk7Ci0JY2FzZSBDUFVfQ3lyaXg6Ci0JICAgIC8qIEN5cml4IDZ4ODYgYW5kIGxhdGVyIHN1cHBvcnQgdGhlIE1UUlIgcmVnaXN0ZXJzICovCi0JICAgIGlmIChjcHVUeXBlIDwgQ1BVX0N5cml4Nng4NikKLQkJcmV0dXJuIDA7Ci0JICAgIHJldHVybiAxOwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1iYXNlICAgIC0gVGhlIHN0YXJ0aW5nIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgcmVnaW9uCi1zaXplICAgIC0gVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlZ2lvbgotCi1SRVRVUk5TOgotVGhlIGluZGV4IG9mIHRoZSByZWdpb24gb24gc3VjY2VzcywgZWxzZSAtMSBvbiBlcnJvci4KLQotUkVNQVJLUzoKLUdlbmVyaWMgZnVuY3Rpb24gdG8gZmluZCB0aGUgbG9jYXRpb24gb2YgYSBmcmVlIE1UUlIgcmVnaXN0ZXIgdG8gYmUgdXNlZAotZm9yIGNyZWF0aW5nIGEgbmV3IG1hcHBpbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBHRU5FUklDX2dldEZyZWVSZWdpb24oCi0gICAgdWxvbmcgYmFzZSwKLSAgICB1bG9uZyBzaXplKQotewotICAgIGludCAgICAgaSxsdHlwZTsKLSAgICB1bG9uZyAgIGxiYXNlLGxzaXplOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG51bU1UUlI7IGkrKykgewotCWdldE1UUlIoaSwmbGJhc2UsJmxzaXplLCZsdHlwZSk7Ci0JaWYgKGxzaXplIDwgMSkKLQkgICAgcmV0dXJuIGk7Ci0JfQotICAgICh2b2lkKWJhc2U7Ci0gICAgKHZvaWQpc2l6ZTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYmFzZSAgICAtIFRoZSBzdGFydGluZyBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgotc2l6ZSAgICAtIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZWdpb24KLQotUkVUVVJOUzoKLVRoZSBpbmRleCBvZiB0aGUgcmVnaW9uIG9uIHN1Y2Nlc3MsIGVsc2UgLTEgb24gZXJyb3IuCi0KLVJFTUFSS1M6Ci1HZW5lcmljIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGxvY2F0aW9uIG9mIGEgZnJlZSBNVFJSIHJlZ2lzdGVyIHRvIGJlIHVzZWQKLWZvciBjcmVhdGluZyBhIG5ldyBtYXBwaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgQU1ESzZfZ2V0RnJlZVJlZ2lvbigKLSAgICB1bG9uZyBiYXNlLAotICAgIHVsb25nIHNpemUpCi17Ci0gICAgaW50ICAgICBpLGx0eXBlOwotICAgIHVsb25nICAgbGJhc2UsbHNpemU7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTVRSUjsgaSsrKSB7Ci0JZ2V0TVRSUihpLCZsYmFzZSwmbHNpemUsJmx0eXBlKTsKLQlpZiAobHNpemUgPCAxKQotCSAgICByZXR1cm4gaTsKLQl9Ci0gICAgKHZvaWQpYmFzZTsKLSAgICAodm9pZClzaXplOwotICAgIHJldHVybiAtMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1iYXNlICAgIC0gVGhlIHN0YXJ0aW5nIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgcmVnaW9uCi1zaXplICAgIC0gVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlZ2lvbgotCi1SRVRVUk5TOgotVGhlIGluZGV4IG9mIHRoZSByZWdpb24gb24gc3VjY2VzcywgZWxzZSAtMSBvbiBlcnJvci4KLQotUkVNQVJLUzoKLUN5cml4IHNwZWNpZmljIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGxvY2F0aW9uIG9mIGEgZnJlZSBNVFJSIHJlZ2lzdGVyIHRvIGJlCi11c2VkIGZvciBjcmVhdGluZyBhIG5ldyBtYXBwaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgQ1lSSVhfZ2V0RnJlZVJlZ2lvbigKLSAgICB1bG9uZyBiYXNlLAotICAgIHVsb25nIHNpemUpCi17Ci0gICAgaW50ICAgICBpLGx0eXBlOwotICAgIHVsb25nICAgbGJhc2UsIGxzaXplOwotCi0gICAgaWYgKHNpemUgPiAweDIwMDAwMDBVTCkgewotCS8qIElmIHdlIGFyZSB0byBzZXQgdXAgYSByZWdpb24gPjMyTSB0aGVuIGxvb2sgYXQgQVJSNyBpbW1lZGlhdGVseSAqLwotCWdldE1UUlIoNywmbGJhc2UsJmxzaXplLCZsdHlwZSk7Ci0JaWYgKGxzaXplIDwgMSkKLQkgICAgcmV0dXJuIDc7Ci0JfQotICAgIGVsc2UgewotCS8qIENoZWNrIEFSUjAtNiByZWdpc3RlcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7Ci0JICAgIGdldE1UUlIoaSwmbGJhc2UsJmxzaXplLCZsdHlwZSk7Ci0JICAgIGlmIChsc2l6ZSA8IDEpCi0JCXJldHVybiBpOwotCSAgICB9Ci0JLyogVHJ5IEFSUjcgYnV0IGl0cyBzaXplIG11c3QgYmUgYXQgbGVhc3QgMjU2SyAqLwotCWdldE1UUlIoNywmbGJhc2UsJmxzaXplLCZsdHlwZSk7Ci0JaWYgKChsc2l6ZSA8IDEpICYmIChzaXplID49IDB4NDAwMDApKQotCSAgICByZXR1cm4gaTsKLQl9Ci0gICAgKHZvaWQpYmFzZTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYyAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIG1hY2hpbmUgY29udGV4dCBhY3Jvc3MgdGhlIGNhbGwKLQotUkVNQVJLUzoKLVB1dHMgdGhlIHByb2Nlc3NvciBpbnRvIGEgc3RhdGUgd2hlcmUgTVRSUnMgY2FuIGJlIHNhZmVseSB1cGRhdGVkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgTVRSUl9iZWdpblVwZGF0ZSgKLSAgICBNVFJSQ29udGV4dCAqYykKLXsKLSAgICBjLT5mbGFncyA9IF9NVFJSX2Rpc2FibGVJbnQoKTsKLSAgICBpZiAoY3B1RmFtaWx5ICE9IENQVV9BTUQgfHwgKGNwdUZhbWlseSA9PSBDUFVfQU1EICYmIGNwdVR5cGUgPj0gQ1BVX0FNREF0aGxvbikpIHsKLQlzd2l0Y2ggKGNwdUZhbWlseSkgewotCSAgICBjYXNlIENQVV9JbnRlbDoKLQkgICAgY2FzZSBDUFVfQU1EOgotCQkvKiBEaXNhYmxlIE1UUlJzLCBhbmQgc2V0IHRoZSBkZWZhdWx0IHR5cGUgdG8gdW5jYWNoZWQgKi8KLQkJYy0+Y3I0VmFsID0gX01UUlJfc2F2ZUNSNCgpOwotCQlfTVRSUl9yZWFkTVNSKElOVEVMX2RlZlR5cGVfTVNSLCZjLT5kZWZUeXBlTG8sJmMtPmRlZlR5cGVIaSk7Ci0JCV9NVFJSX3dyaXRlTVNSKElOVEVMX2RlZlR5cGVfTVNSLGMtPmRlZlR5cGVMbyAmIDB4RjMwMFVMLGMtPmRlZlR5cGVIaSk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIENQVV9DeXJpeDoKLQkJYy0+Y2NyMyA9IF9NVFJSX2dldEN4ODYoQ1g4Nl9DQ1IzKTsKLQkJX01UUlJfc2V0Q3g4NihDWDg2X0NDUjMsICh1Y2hhcikoKGMtPmNjcjMgJiAweDBGKSB8IDB4MTApKTsKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYyAgIC0gUGxhY2UgdG8gcmVzdG9yZSB0aGUgbWFjaGluZSBjb250ZXh0IGZyb20KLQotUkVNQVJLUzoKLVJlc3RvcmVzIHRoZSBwcm9jZXNzb3IgYWZ0ZXIgdXBkYXRpbmcgYW55IG9mIHRoZSByZWdpc3RlcnMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBNVFJSX2VuZFVwZGF0ZSgKLSAgICBNVFJSQ29udGV4dCAqYykKLXsKLSAgICBpZiAoY3B1RmFtaWx5ICE9IENQVV9BTUQgfHwgKGNwdUZhbWlseSA9PSBDUFVfQU1EICYmIGNwdVR5cGUgPj0gQ1BVX0FNREF0aGxvbikpIHsKLQlQTV9mbHVzaFRMQigpOwotCXN3aXRjaCAoY3B1RmFtaWx5KSB7Ci0JICAgIGNhc2UgQ1BVX0ludGVsOgotCSAgICBjYXNlIENQVV9BTUQ6Ci0JCV9NVFJSX3dyaXRlTVNSKElOVEVMX2RlZlR5cGVfTVNSLGMtPmRlZlR5cGVMbyxjLT5kZWZUeXBlSGkpOwotCQlfTVRSUl9yZXN0b3JlQ1I0KGMtPmNyNFZhbCk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIENQVV9DeXJpeDoKLQkJX01UUlJfc2V0Q3g4NihDWDg2X0NDUjMsKHVjaGFyKWMtPmNjcjMpOwotCQlicmVhazsKLQkgICAgfQotCX0KLQotICAgIC8qIFJlLWVuYWJsZSBpbnRlcnJ1cHRzIChpZiBlbmFibGVkIHByZXZpb3VzbHkpICovCi0gICAgX01UUlJfcmVzdG9yZUludChjLT5mbGFncyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcmVnICAgICAtIE1UUlIgcmVnaXN0ZXIgdG8gcmVhZAotYmFzZSAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSBzdGFydGluZyBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgotc2l6ZSAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZWdpb24KLXR5cGUgICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgdHlwZSBvZiB0aGUgTVRSUiByZWdpc3RlcgotCi1SRU1BUktTOgotSW50ZWwgc3BlY2lmaWMgZnVuY3Rpb24gdG8gcmVhZCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBNVFJSIHJlZ2lzdGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIElOVEVMX2dldE1UUlIoCi0gICAgdWludCByZWcsCi0gICAgdWxvbmcgKmJhc2UsCi0gICAgdWxvbmcgKnNpemUsCi0gICAgaW50ICp0eXBlKQotewotICAgIHVsb25nIGhpLG1hc2tMbyxiYXNlTG87Ci0KLSAgICBfTVRSUl9yZWFkTVNSKElOVEVMX3BoeXNNYXNrX01TUihyZWcpLCZtYXNrTG8sJmhpKTsKLSAgICBpZiAoKG1hc2tMbyAmIDB4ODAwKSA9PSAwKSB7Ci0JLyogTVRSUiBpcyBkaXNhYmxlZCwgc28gaXQgaXMgZnJlZSAqLwotCSpiYXNlID0gMDsKLQkqc2l6ZSA9IDA7Ci0JKnR5cGUgPSAwOwotCXJldHVybjsKLQl9Ci0gICAgX01UUlJfcmVhZE1TUihJTlRFTF9waHlzQmFzZV9NU1IocmVnKSwmYmFzZUxvLCZoaSk7Ci0gICAgbWFza0xvID0gKG1hc2tMbyAmIDB4RkZGRkYwMDBVTCk7Ci0gICAgKnNpemUgPSB+KG1hc2tMbyAtIDEpOwotICAgICpiYXNlID0gKGJhc2VMbyAmIDB4RkZGRkYwMDBVTCk7Ci0gICAgKnR5cGUgPSAoYmFzZUxvICYgMHhGRik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcmVnICAgICAtIE1UUlIgcmVnaXN0ZXIgdG8gc2V0Ci1iYXNlICAgIC0gVGhlIHN0YXJ0aW5nIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgcmVnaW9uCi1zaXplICAgIC0gVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlZ2lvbgotdHlwZSAgICAtIFR5cGUgdG8gcGxhY2UgaW50byB0aGUgTVRSUiByZWdpc3RlcgotCi1SRU1BUktTOgotSW50ZWwgc3BlY2lmaWMgZnVuY3Rpb24gdG8gc2V0IHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIE1UUlIgcmVnaXN0ZXIgdG8KLXRoZSBwYXNzZWQgaW4gYmFzZSwgc2l6ZSBhbmQgdHlwZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBJTlRFTF9zZXRNVFJSKAotICAgIHVpbnQgcmVnLAotICAgIHVsb25nIGJhc2UsCi0gICAgdWxvbmcgc2l6ZSwKLSAgICBpbnQgdHlwZSkKLXsKLSAgICBNVFJSQ29udGV4dCBjOwotCi0gICAgTVRSUl9iZWdpblVwZGF0ZSgmYyk7Ci0gICAgaWYgKHNpemUgPT0gMCkgewotCS8qIFRoZSBpbnZhbGlkIGJpdCBpcyBrZXB0IGluIHRoZSBtYXNrLCBzbyB3ZSBzaW1wbHkgY2xlYXIgdGhlCi0JICogcmVsZXZhbnQgbWFzayByZWdpc3RlciB0byBkaXNhYmxlIGEgcmFuZ2UuCi0JICovCi0JX01UUlJfd3JpdGVNU1IoSU5URUxfcGh5c01hc2tfTVNSKHJlZyksMCwwKTsKLQl9Ci0gICAgZWxzZSB7Ci0JX01UUlJfd3JpdGVNU1IoSU5URUxfcGh5c0Jhc2VfTVNSKHJlZyksYmFzZSB8IHR5cGUsMCk7Ci0JX01UUlJfd3JpdGVNU1IoSU5URUxfcGh5c01hc2tfTVNSKHJlZyksfihzaXplIC0gMSkgfCAweDgwMCwwKTsKLQl9Ci0gICAgTVRSUl9lbmRVcGRhdGUoJmMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURpc2FibGVkIGJhbmtlZCB3cml0ZSBjb21iaW5nIGZvciBJbnRlbCBwcm9jZXNzb3JzLiBXZSBhbHdheXMgZGlzYWJsZSB0aGlzCi1iZWNhdXNlIGl0IGludmFyaWFibHkgY2F1c2VzIHByb2JsZW1zIHdpdGggb2xkZXIgaGFyZHdhcmUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgSU5URUxfZGlzYWJsZUJhbmtlZFdyaXRlQ29tYmluZSh2b2lkKQotewotICAgIE1UUlJDb250ZXh0IGM7Ci0KLSAgICBNVFJSX2JlZ2luVXBkYXRlKCZjKTsKLSAgICBfTVRSUl93cml0ZU1TUihJTlRFTF9maXgxNktfQTAwMDBfTVNSLDAsMCk7Ci0gICAgTVRSUl9lbmRVcGRhdGUoJmMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXJlZyAgICAgLSBNVFJSIHJlZ2lzdGVyIHRvIHNldAotYmFzZSAgICAtIFRoZSBzdGFydGluZyBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgotc2l6ZSAgICAtIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZWdpb24KLXR5cGUgICAgLSBUeXBlIHRvIHBsYWNlIGludG8gdGhlIE1UUlIgcmVnaXN0ZXIKLQotUkVNQVJLUzoKLUludGVsIHNwZWNpZmljIGZ1bmN0aW9uIHRvIHNldCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBNVFJSIHJlZ2lzdGVyIHRvCi10aGUgcGFzc2VkIGluIGJhc2UsIHNpemUgYW5kIHR5cGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgQU1EX2dldE1UUlIoCi0gICAgdWludCByZWcsCi0gICAgdWxvbmcgKmJhc2UsCi0gICAgdWxvbmcgKnNpemUsCi0gICAgaW50ICp0eXBlKQotewotICAgIHVsb25nICAgbG93LGhpZ2g7Ci0KLSAgICAvKiAgVXBwZXIgZHdvcmQgaXMgcmVnaW9uIDEsIGxvd2VyIGlzIHJlZ2lvbiAwICAqLwotICAgIF9NVFJSX3JlYWRNU1IoMHhDMDAwMDA4NSwgJmxvdywgJmhpZ2gpOwotICAgIGlmIChyZWcgPT0gMSkKLQlsb3cgPSBoaWdoOwotCi0gICAgLyogRmluZCB0aGUgYmFzZSBhbmQgdHlwZSBmb3IgdGhlIHJlZ2lvbiAqLwotICAgICpiYXNlID0gbG93ICYgMHhGRkZFMDAwMDsKLSAgICAqdHlwZSA9IDA7Ci0gICAgaWYgKGxvdyAmIDEpCi0JKnR5cGUgPSBQTV9NVFJSX1VOQ0FDSEFCTEU7Ci0gICAgaWYgKGxvdyAmIDIpCi0JKnR5cGUgPSBQTV9NVFJSX1dSQ09NQjsKLSAgICBpZiAoKGxvdyAmIDMpID09IDApIHsKLQkqc2l6ZSA9IDA7Ci0JcmV0dXJuOwotCX0KLQotICAgIC8qIFRoaXMgbmVlZHMgYSBsaXR0bGUgZXhwbGFpbmluZy4gVGhlIHNpemUgaXMgc3RvcmVkIGFzIGFuCi0gICAgICogaW52ZXJ0ZWQgbWFzayBvZiBiaXRzIG9mIDEyOEsgZ3JhbnVsYXJpdHkgMTUgYml0cyBsb25nIG9mZnNldAotICAgICAqIDIgYml0cwotICAgICAqCi0gICAgICogU28gdG8gZ2V0IGEgc2l6ZSB3ZSBkbyBpbnZlcnQgdGhlIG1hc2sgYW5kIGFkZCAxIHRvIHRoZSBsb3dlc3QKLSAgICAgKiBtYXNrIGJpdCAoNCBhcyBpdHMgMiBiaXRzIGluKS4gVGhpcyBnaXZlcyB1cyBhIHNpemUgd2UgdGhlbiBzaGlmdAotICAgICAqIHRvIHR1cm4gaW50byAxMjhLIGJsb2NrcwotICAgICAqCi0gICAgICogIGVnICAgICAgICAgICAgICAxMTEgMTExMSAxMTExIDExMDAgICAgICBpcyA1MTJLCi0gICAgICoKLSAgICAgKiAgaW52ZXJ0ICAgICAgICAgIDAwMCAwMDAwIDAwMDAgMDAxMQotICAgICAqICArMSAgICAgICAgICAgICAgMDAwIDAwMDAgMDAwMCAwMTAwCi0gICAgICogICoxMjhLICAgLi4uCi0gICAgICovCi0gICAgbG93ID0gKH5sb3cpICYgMHgwRkZGQzsKLSAgICAqc2l6ZSA9IChsb3cgKyA0KSA8PCAxNTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1yZWcgICAgIC0gTVRSUiByZWdpc3RlciB0byBzZXQKLWJhc2UgICAgLSBUaGUgc3RhcnRpbmcgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24KLXNpemUgICAgLSBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVnaW9uCi10eXBlICAgIC0gVHlwZSB0byBwbGFjZSBpbnRvIHRoZSBNVFJSIHJlZ2lzdGVyCi0KLVJFTUFSS1M6Ci1JbnRlbCBzcGVjaWZpYyBmdW5jdGlvbiB0byBzZXQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgTVRSUiByZWdpc3RlciB0bwotdGhlIHBhc3NlZCBpbiBiYXNlLCBzaXplIGFuZCB0eXBlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEFNRF9zZXRNVFJSKAotICAgIHVpbnQgcmVnLAotICAgIHVsb25nIGJhc2UsCi0gICAgdWxvbmcgc2l6ZSwKLSAgICBpbnQgdHlwZSkKLXsKLSAgICB1bG9uZyAgICAgICBsb3csaGlnaCxuZXdWYWw7Ci0gICAgTVRSUkNvbnRleHQgYzsKLQotICAgIE1UUlJfYmVnaW5VcGRhdGUoJmMpOwotICAgIF9NVFJSX3JlYWRNU1IoMHhDMDAwMDA4NSwgJmxvdywgJmhpZ2gpOwotICAgIGlmIChzaXplID09IDApIHsKLQkvKiBDbGVhciByZWdpc3RlciB0byBkaXNhYmxlICovCi0JaWYgKHJlZykKLQkgICAgaGlnaCA9IDA7Ci0JZWxzZQotCSAgICBsb3cgPSAwOwotCX0KLSAgICBlbHNlIHsKLQkvKiBTZXQgdGhlIHJlZ2lzdGVyIHRvIHRoZSBiYXNlIChhbHJlYWR5IHNoaWZ0ZWQgZm9yIHVzKSwgdGhlCi0JICogdHlwZSAob2ZmIGJ5IG9uZSkgYW5kIGFuIGludmVydGVkIGJpdG1hc2sgb2YgdGhlIHNpemUKLQkgKiBUaGUgc2l6ZSBpcyB0aGUgb25seSBvZGQgYml0LiBXZSBhcmUgZmVkIHNheSA1MTJLCi0JICogV2UgaW52ZXJ0IHRoaXMgYW5kIHdlIGdldCAxMTEgMTExMSAxMTExIDEwMTEgYnV0Ci0JICogaWYgeW91IHN1YnRyYWN0IG9uZSBhbmQgaW52ZXJ0IHlvdSBnZXQgdGhlIGRlc2lyZWQKLQkgKiAxMTEgMTExMSAxMTExIDExMDAgbWFzawotCSAqLwotCW5ld1ZhbCA9ICgoKH4oc2l6ZS0xKSkgPj4gMTUpICYgMHgwMDAxRkZGQykgfCBiYXNlIHwgKHR5cGUrMSk7Ci0JaWYgKHJlZykKLQkgICAgaGlnaCA9IG5ld1ZhbDsKLQllbHNlCi0JICAgIGxvdyA9IG5ld1ZhbDsKLQl9Ci0KLSAgICAvKiBUaGUgd3JpdGViYWNrIHJ1bGUgaXMgcXVpdGUgc3BlY2lmaWMuIFNlZSB0aGUgbWFudWFsLiBJdHMKLSAgICAgKiBkaXNhYmxlIGxvY2FsIGludGVycnVwdHMsIHdyaXRlIGJhY2sgdGhlIGNhY2hlLCBzZXQgdGhlIE1UUlIKLSAgICAgKi8KLSAgICBQTV9mbHVzaFRMQigpOwotICAgIF9NVFJSX3dyaXRlTVNSKDB4QzAwMDAwODUsIGxvdywgaGlnaCk7Ci0gICAgTVRSUl9lbmRVcGRhdGUoJmMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXJlZyAgICAgLSBNVFJSIHJlZ2lzdGVyIHRvIHNldAotYmFzZSAgICAtIFRoZSBzdGFydGluZyBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgotc2l6ZSAgICAtIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZWdpb24KLXR5cGUgICAgLSBUeXBlIHRvIHBsYWNlIGludG8gdGhlIE1UUlIgcmVnaXN0ZXIKLQotUkVNQVJLUzoKLUludGVsIHNwZWNpZmljIGZ1bmN0aW9uIHRvIHNldCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBNVFJSIHJlZ2lzdGVyIHRvCi10aGUgcGFzc2VkIGluIGJhc2UsIHNpemUgYW5kIHR5cGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgQ1lSSVhfZ2V0TVRSUigKLSAgICB1aW50IHJlZywKLSAgICB1bG9uZyAqYmFzZSwKLSAgICB1bG9uZyAqc2l6ZSwKLSAgICBpbnQgKnR5cGUpCi17Ci0gICAgTVRSUkNvbnRleHQgYzsKLSAgICB1Y2hhciAgICAgICBhcnIgPSBDWDg2X0FSUl9CQVNFICsgcmVnKjM7Ci0gICAgdWNoYXIgICAgICAgcmNyLHNoaWZ0OwotCi0gICAgLyogU2F2ZSBmbGFncyBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzICovCi0gICAgTVRSUl9iZWdpblVwZGF0ZSgmYyk7Ci0gICAgKCh1Y2hhciopYmFzZSlbM10gID0gX01UUlJfZ2V0Q3g4NihhcnIpOwotICAgICgodWNoYXIqKWJhc2UpWzJdICA9IF9NVFJSX2dldEN4ODYoKHVjaGFyKShhcnIrMSkpOwotICAgICgodWNoYXIqKWJhc2UpWzFdICA9IF9NVFJSX2dldEN4ODYoKHVjaGFyKShhcnIrMikpOwotICAgIHJjciA9IF9NVFJSX2dldEN4ODYoKHVjaGFyKShDWDg2X1JDUl9CQVNFICsgcmVnKSk7Ci0gICAgTVRSUl9lbmRVcGRhdGUoJmMpOwotCi0gICAgLyogRW5hYmxlIGludGVycnVwdHMgaWYgaXQgd2FzIGVuYWJsZWQgcHJldmlvdXNseSAqLwotICAgIHNoaWZ0ID0gKCh1Y2hhciopYmFzZSlbMV0gJiAweDBmOwotICAgICpiYXNlICY9IDB4RkZGRkYwMDBVTDsKLQotICAgIC8qIFBvd2VyIG9mIHR3bywgYXQgbGVhc3QgNEsgb24gQVJSMC1BUlI2LCAyNTZLIG9uIEFSUjcKLSAgICAgKiBOb3RlOiBzaGlmdD09MHhGIG1lYW5zIDRHLCB0aGlzIGlzIHVuc3VwcG9ydGVkLgotICAgICAqLwotICAgIGlmIChzaGlmdCkKLQkqc2l6ZSA9IChyZWcgPCA3ID8gMHg4MDBVTCA6IDB4MjAwMDBVTCkgPDwgc2hpZnQ7Ci0gICAgZWxzZQotCSpzaXplID0gMDsKLQotICAgIC8qIEJpdCAwIGlzIENhY2hlIEVuYWJsZSBvbiBBUlI3LCBDYWNoZSBEaXNhYmxlIG9uIEFSUjAtQVJSNiAqLwotICAgIGlmIChyZWcgPCA3KSB7Ci0Jc3dpdGNoIChyY3IpIHsKLQkgICAgY2FzZSAgMTogKnR5cGUgPSBQTV9NVFJSX1VOQ0FDSEFCTEU7IGJyZWFrOwotCSAgICBjYXNlICA4OiAqdHlwZSA9IFBNX01UUlJfV1JCQUNLOyAgICAgYnJlYWs7Ci0JICAgIGNhc2UgIDk6ICp0eXBlID0gUE1fTVRSUl9XUkNPTUI7ICAgICBicmVhazsKLQkgICAgY2FzZSAyNDoKLQkgICAgZGVmYXVsdDogKnR5cGUgPSBQTV9NVFJSX1dSVEhST1VHSDsgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIGVsc2UgewotCXN3aXRjaCAocmNyKSB7Ci0JICAgIGNhc2UgIDA6ICp0eXBlID0gUE1fTVRSUl9VTkNBQ0hBQkxFOyBicmVhazsKLQkgICAgY2FzZSAgODogKnR5cGUgPSBQTV9NVFJSX1dSQ09NQjsgICAgIGJyZWFrOwotCSAgICBjYXNlICA5OiAqdHlwZSA9IFBNX01UUlJfV1JCQUNLOyAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMjU6Ci0JICAgIGRlZmF1bHQ6ICp0eXBlID0gUE1fTVRSUl9XUlRIUk9VR0g7ICBicmVhazsKLQkgICAgfQotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1yZWcgICAgIC0gTVRSUiByZWdpc3RlciB0byBzZXQKLWJhc2UgICAgLSBUaGUgc3RhcnRpbmcgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24KLXNpemUgICAgLSBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVnaW9uCi10eXBlICAgIC0gVHlwZSB0byBwbGFjZSBpbnRvIHRoZSBNVFJSIHJlZ2lzdGVyCi0KLVJFTUFSS1M6Ci1JbnRlbCBzcGVjaWZpYyBmdW5jdGlvbiB0byBzZXQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgTVRSUiByZWdpc3RlciB0bwotdGhlIHBhc3NlZCBpbiBiYXNlLCBzaXplIGFuZCB0eXBlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIENZUklYX3NldE1UUlIoCi0gICAgdWludCByZWcsCi0gICAgdWxvbmcgYmFzZSwKLSAgICB1bG9uZyBzaXplLAotICAgIGludCB0eXBlKQotewotICAgIE1UUlJDb250ZXh0IGM7Ci0gICAgdWNoYXIgICAgICAgYXJyID0gQ1g4Nl9BUlJfQkFTRSArIHJlZyozOwotICAgIHVjaGFyICAgICAgIGFycl90eXBlLGFycl9zaXplOwotCi0gICAgLyogQ291bnQgZG93biBmcm9tIDMyTSAoQVJSMC1BUlI2KSBvciBmcm9tIDJHIChBUlI3KSAqLwotICAgIHNpemUgPj49IChyZWcgPCA3ID8gMTIgOiAxOCk7Ci0gICAgc2l6ZSAmPSAweDdGRkY7IC8qIE1ha2Ugc3VyZSBhcnJfc2l6ZSA8PSAxNCAqLwotICAgIGZvciAoYXJyX3NpemUgPSAwOyBzaXplOyBhcnJfc2l6ZSsrLCBzaXplID4+PSAxKQotCTsKLSAgICBpZiAocmVnIDwgNykgewotCXN3aXRjaCAodHlwZSkgewotCSAgICBjYXNlIFBNX01UUlJfVU5DQUNIQUJMRTogICAgYXJyX3R5cGUgPSAgMTsgYnJlYWs7Ci0JICAgIGNhc2UgUE1fTVRSUl9XUkNPTUI6ICAgICAgICBhcnJfdHlwZSA9ICA5OyBicmVhazsKLQkgICAgY2FzZSBQTV9NVFJSX1dSVEhST1VHSDogICAgIGFycl90eXBlID0gMjQ7IGJyZWFrOwotCSAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgYXJyX3R5cGUgPSAgODsgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgZWxzZSB7Ci0Jc3dpdGNoICh0eXBlKSB7Ci0JICAgIGNhc2UgUE1fTVRSUl9VTkNBQ0hBQkxFOiAgICBhcnJfdHlwZSA9ICAwOyBicmVhazsKLQkgICAgY2FzZSBQTV9NVFJSX1dSQ09NQjogICAgICAgIGFycl90eXBlID0gIDg7IGJyZWFrOwotCSAgICBjYXNlIFBNX01UUlJfV1JUSFJPVUdIOiAgICAgYXJyX3R5cGUgPSAyNTsgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICBhcnJfdHlwZSA9ICA5OyBicmVhazsKLQkgICAgfQotCX0KLSAgICBNVFJSX2JlZ2luVXBkYXRlKCZjKTsKLSAgICBfTVRSUl9zZXRDeDg2KCh1Y2hhcilhcnIsICAgICAoKHVjaGFyKikmYmFzZSlbM10pOwotICAgIF9NVFJSX3NldEN4ODYoKHVjaGFyKShhcnIrMSksICgodWNoYXIqKSZiYXNlKVsyXSk7Ci0gICAgX01UUlJfc2V0Q3g4NigodWNoYXIpKGFycisyKSwgKHVjaGFyKSgoKCh1Y2hhciopJmJhc2UpWzFdKSB8IGFycl9zaXplKSk7Ci0gICAgX01UUlJfc2V0Q3g4NigodWNoYXIpKENYODZfUkNSX0JBU0UgKyByZWcpLCAodWNoYXIpYXJyX3R5cGUpOwotICAgIE1UUlJfZW5kVXBkYXRlKCZjKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1PbiBDeXJpeCA2eDg2KE1YKSBhbmQgTUlJIHRoZSBBUlIzIGlzIHNwZWNpYWw6IGl0IGhhcyBjb25uZWN0aW9uCi13aXRoIHRoZSBTTU0gKFN5c3RlbSBNYW5hZ2VtZW50IE1vZGUpIG1vZGUuIFNvIHdlIG5lZWQgdGhlIGZvbGxvd2luZzoKLUNoZWNrIHdoZXRoZXIgU01JX0xPQ0sgKENDUjMgYml0IDApIGlzIHNldAotICBpZiBpdCBpcyBzZXQsIEFSUjMgY2Fubm90IGJlIGNoYW5nZWQgIChpdCBjYW5ub3QgYmUgY2hhbmdlZCB1bnRpbCB0aGUKLSAgICBuZXh0IHByb2Nlc3NvciByZXNldCkKLSAgaWYgaXQgaXMgcmVzZXQsIHRoZW4gd2UgY2FuIGNoYW5nZSBpdCwgc2V0IGFsbCB0aGUgbmVlZGVkIGJpdHM6Ci0gICAtIGRpc2FibGUgYWNjZXNzIHRvIFNNTSBtZW1vcnkgdGhyb3VnaCBBUlIzIHJhbmdlIChDQ1IxIGJpdCA3IHJlc2V0KQotICAgLSBkaXNhYmxlIGFjY2VzcyB0byBTTU0gbWVtb3J5IChDQ1IxIGJpdCAyIHJlc2V0KQotICAgLSBkaXNhYmxlIFNNTSBtb2RlIChDQ1IxIGJpdCAxIHJlc2V0KQotICAgLSBkaXNhYmxlIHdyaXRlIHByb3RlY3Rpb24gb2YgQVJSMyAoQ0NSNiBiaXQgMSByZXNldCkKLSAgIC0gKG1heWJlKSBkaXNhYmxlIEFSUjMKLUp1c3QgdG8gYmUgc3VyZSwgd2UgZW5hYmxlIEFSUiB1c2FnZSBieSB0aGUgcHJvY2Vzc29yIChDQ1I1IGJpdCA1IHNldCkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBDWVJJWF9pbml0QVJSKHZvaWQpCi17Ci0gICAgTVRSUkNvbnRleHQgYzsKLSAgICB1Y2hhciAgICAgICBjY3JbN107Ci0gICAgaW50ICAgICAgICAgY2NyY1s3XSA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OwotCi0gICAgLyogQmVnaW4gdXBkYXRpbmcgKi8KLSAgICBNVFJSX2JlZ2luVXBkYXRlKCZjKTsKLQotICAgIC8qIFNhdmUgYWxsIENDUnMgbG9jYWxseSAqLwotICAgIGNjclswXSA9IF9NVFJSX2dldEN4ODYoQ1g4Nl9DQ1IwKTsKLSAgICBjY3JbMV0gPSBfTVRSUl9nZXRDeDg2KENYODZfQ0NSMSk7Ci0gICAgY2NyWzJdID0gX01UUlJfZ2V0Q3g4NihDWDg2X0NDUjIpOwotICAgIGNjclszXSA9ICh1Y2hhciljLmNjcjM7Ci0gICAgY2NyWzRdID0gX01UUlJfZ2V0Q3g4NihDWDg2X0NDUjQpOwotICAgIGNjcls1XSA9IF9NVFJSX2dldEN4ODYoQ1g4Nl9DQ1I1KTsKLSAgICBjY3JbNl0gPSBfTVRSUl9nZXRDeDg2KENYODZfQ0NSNik7Ci0gICAgaWYgKGNjclszXSAmIDEpCi0JY2NyY1szXSA9IDE7Ci0gICAgZWxzZSB7Ci0JLyogRGlzYWJsZSBTTU0gbW9kZSAoYml0IDEpLCBhY2Nlc3MgdG8gU01NIG1lbW9yeSAoYml0IDIpIGFuZAotCSAqIGFjY2VzcyB0byBTTU0gbWVtb3J5IHRocm91Z2ggQVJSMyAoYml0IDcpLgotCSAqLwotCWlmIChjY3JbNl0gJiAweDAyKSB7Ci0JICAgIGNjcls2XSAmPSAweEZEOwotCSAgICBjY3JjWzZdID0gMTsgICAgICAgIC8qIERpc2FibGUgd3JpdGUgcHJvdGVjdGlvbiBvZiBBUlIzLiAqLwotCSAgICBfTVRSUl9zZXRDeDg2KENYODZfQ0NSNixjY3JbNl0pOwotCSAgICB9Ci0JfQotCi0gICAgLyogSWYgd2UgY2hhbmdlZCBDQ1IxIGluIG1lbW9yeSwgY2hhbmdlIGl0IGluIHRoZSBwcm9jZXNzb3IsIHRvby4gKi8KLSAgICBpZiAoY2NyY1sxXSkKLQlfTVRSUl9zZXRDeDg2KENYODZfQ0NSMSxjY3JbMV0pOwotCi0gICAgLyogRW5hYmxlIEFSUiB1c2FnZSBieSB0aGUgcHJvY2Vzc29yICovCi0gICAgaWYgKCEoY2NyWzVdICYgMHgyMCkpIHsKLQljY3JbNV0gfD0gMHgyMDsKLQljY3JjWzVdID0gMTsKLQlfTVRSUl9zZXRDeDg2KENYODZfQ0NSNSxjY3JbNV0pOwotCX0KLQotICAgIC8qIFdlIGFyZSBmaW5pc2hlZCB1cGRhdGluZyAqLwotICAgIE1UUlJfZW5kVXBkYXRlKCZjKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBNVFJSIG1vZHVsZSwgYnkgZGV0ZWN0aW5nIHRoZSBwcm9jZXNzb3IgdHlwZSBhbmQgZGV0ZXJtaW5pbmcKLWlmIHRoZSBwcm9jZXNzb3Igc3VwcG9ydHMgdGhlIE1UUlIgZnVuY3Rpb25hbGl0eS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE1UUlJfaW5pdCh2b2lkKQotewotICAgIGludCAgICAgaSxjcHUsbHR5cGU7Ci0gICAgdWxvbmcgICBlYXgsZWR4LGxiYXNlLGxzaXplOwotCi0gICAgLyogQ2hlY2sgdGhhdCB3ZSBoYXZlIGEgY29tcGF0aWJsZSBDUFUgKi8KLSAgICBpZiAobnVtTVRSUiA9PSAtMSkgewotCW51bU1UUlIgPSAwOwotCWlmICghX01UUlJfaXNSaW5nMCgpKQotCSAgICByZXR1cm47Ci0JY3B1ID0gQ1BVX2dldFByb2Nlc3NvclR5cGUoKTsKLQljcHVGYW1pbHkgPSBjcHUgJiBDUFVfZmFtaWx5TWFzazsKLQljcHVUeXBlID0gY3B1ICYgQ1BVX21hc2s7Ci0JY3B1U3RlcHBpbmcgPSAoY3B1ICYgQ1BVX3N0ZXBwaW5nTWFzaykgPj4gQ1BVX3N0ZXBwaW5nU2hpZnQ7Ci0Jc3dpdGNoIChjcHVGYW1pbHkpIHsKLQkgICAgY2FzZSBDUFVfSW50ZWw6Ci0JCS8qIEludGVsIFBlbnRpdW0gUHJvIGFuZCBsYXRlciBzdXBwb3J0IHRoZSBNVFJSIHJlZ2lzdGVycyAqLwotCQlpZiAoY3B1VHlwZSA8IENQVV9QZW50aXVtUHJvKQotCQkgICAgcmV0dXJuOwotCQlfTVRSUl9yZWFkTVNSKElOVEVMX2NhcF9NU1IsJmVheCwmZWR4KTsKLQkJbnVtTVRSUiA9IGVheCAmIDB4RkY7Ci0JCWdldE1UUlIgPSBJTlRFTF9nZXRNVFJSOwotCQlzZXRNVFJSID0gSU5URUxfc2V0TVRSUjsKLQkJZ2V0RnJlZVJlZ2lvbiA9IEdFTkVSSUNfZ2V0RnJlZVJlZ2lvbjsKLQkJSU5URUxfZGlzYWJsZUJhbmtlZFdyaXRlQ29tYmluZSgpOwotCQlicmVhazsKLQkgICAgY2FzZSBDUFVfQU1EOgotCQkvKiBBTUQgSzYtMiBhbmQgbGF0ZXIgc3VwcG9ydCB0aGUgTVRSUiByZWdpc3RlcnMgKi8KLQkJaWYgKChjcHVUeXBlIDwgQ1BVX0FNREs2XzIpIHx8IChjcHVUeXBlID09IENQVV9BTURLNl8yICYmIGNwdVN0ZXBwaW5nIDwgOCkpCi0JCSAgICByZXR1cm47Ci0JCWlmIChjcHVUeXBlIDwgQ1BVX0FNREF0aGxvbikgewotCQkgICAgbnVtTVRSUiA9IDI7ICAgICAgICAvKiBBTUQgQ1BVJ3MgaGF2ZSAyIE1UUlIncyAqLwotCQkgICAgZ2V0TVRSUiA9IEFNRF9nZXRNVFJSOwotCQkgICAgc2V0TVRSUiA9IEFNRF9zZXRNVFJSOwotCQkgICAgZ2V0RnJlZVJlZ2lvbiA9IEFNREs2X2dldEZyZWVSZWdpb247Ci0KLQkJICAgIC8qIEZvciBzb21lIHJlYXNvbiBzb21lIElCTSBzeXN0ZW1zIHdpdGggSzYtMiBwcm9jZXNzb3JzCi0JCSAgICAgKiBoYXZlIHdyaXRlIGNvbWJpbmVkIGVuYWJsZWQgZm9yIHRoZSBzeXN0ZW0gQklPUwotCQkgICAgICogcmVnaW9uIGZyb20gMHhFMDAwMCB0byAweEZGRkZGRi4gV2UgbmVlZCAqYm90aCogTVRSUidzCi0JCSAgICAgKiBmb3Igb3VyIG93biBncmFwaGljcyBkcml2ZXJzLCBzbyBpZiB3ZSBkZXRlY3QgYW55Ci0JCSAgICAgKiByZWdpb25zIGJlbG93IHRoZSAxTWVnIGJvdW5kYXJ5LCB3ZSByZW1vdmUgdGhlbQotCQkgICAgICogc28gd2UgY2FuIHVzZSB0aGlzIE1UUlIgcmVnaXN0ZXIgb3Vyc2VsdmVzLgotCQkgICAgICovCi0JCSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTVRSUjsgaSsrKSB7Ci0JCQlnZXRNVFJSKGksJmxiYXNlLCZsc2l6ZSwmbHR5cGUpOwotCQkJaWYgKGxiYXNlIDwgMHgxMDAwMDApCi0JCQkgICAgc2V0TVRSUihpLDAsMCwwKTsKLQkJCX0KLQkJICAgIH0KLQkJZWxzZSB7Ci0JCSAgICAvKiBBTUQgQXRobG9uIHVzZXMgUDYgc3R5bGUgTVRSUidzICovCi0JCSAgICBfTVRSUl9yZWFkTVNSKElOVEVMX2NhcF9NU1IsJmVheCwmZWR4KTsKLQkJICAgIG51bU1UUlIgPSBlYXggJiAweEZGOwotCQkgICAgZ2V0TVRSUiA9IElOVEVMX2dldE1UUlI7Ci0JCSAgICBzZXRNVFJSID0gSU5URUxfc2V0TVRSUjsKLQkJICAgIGdldEZyZWVSZWdpb24gPSBHRU5FUklDX2dldEZyZWVSZWdpb247Ci0JCSAgICBJTlRFTF9kaXNhYmxlQmFua2VkV3JpdGVDb21iaW5lKCk7Ci0JCSAgICB9Ci0JCWJyZWFrOwotCSAgICBjYXNlIENQVV9DeXJpeDoKLQkJLyogQ3lyaXggNng4NiBhbmQgbGF0ZXIgc3VwcG9ydCB0aGUgTVRSUiByZWdpc3RlcnMgKi8KLQkJaWYgKGNwdVR5cGUgPCBDUFVfQ3lyaXg2eDg2IHx8IGNwdVR5cGUgPj0gQ1BVX0N5cml4TWVkaWFHWCkKLQkJICAgIHJldHVybjsKLQkJbnVtTVRSUiA9IDg7ICAgICAgICAvKiBDeXJpeCBDUFUncyBoYXZlIDggQVJSJ3MgKi8KLQkJZ2V0TVRSUiA9IENZUklYX2dldE1UUlI7Ci0JCXNldE1UUlIgPSBDWVJJWF9zZXRNVFJSOwotCQlnZXRGcmVlUmVnaW9uID0gQ1lSSVhfZ2V0RnJlZVJlZ2lvbjsKLQkJQ1lSSVhfaW5pdEFSUigpOwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJcmV0dXJuOwotCSAgICB9Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWJhc2UgICAgLSBUaGUgc3RhcnRpbmcgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24KLXNpemUgICAgLSBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVnaW9uCi10eXBlICAgIC0gVHlwZSB0byBwbGFjZSBpbnRvIHRoZSBNVFJSIHJlZ2lzdGVyCi0KLVJFVFVSTlM6Ci1FcnJvciBjb2RlIGRlc2NyaWJpbmcgdGhlIHJlc3VsdC4KLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGVuYWJsZSB3cml0ZSBjb21iaW5pbmcgZm9yIHRoZSBzcGVjaWZpZWQgcmVnaW9uIG9mIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgTVRSUl9lbmFibGVXcml0ZUNvbWJpbmUoCi0gICAgdWxvbmcgYmFzZSwKLSAgICB1bG9uZyBzaXplLAotICAgIHVpbnQgdHlwZSkKLXsKLSAgICBpbnQgICAgIGk7Ci0gICAgaW50ICAgICBsdHlwZTsKLSAgICB1bG9uZyAgIGxiYXNlLGxzaXplLGxhc3Q7Ci0KLSAgICAvKiBDaGVjayB0aGF0IHdlIGhhdmUgYSBDUFUgdGhhdCBzdXBwb3J0cyBNVFJSJ3MgYW5kIHR5cGUgaXMgdmFsaWQgKi8KLSAgICBpZiAobnVtTVRSUiA8PSAwKSB7Ci0JaWYgKCFfTVRSUl9pc1JpbmcwKCkpCi0JICAgIHJldHVybiBQTV9NVFJSX0VSUl9OT19PU19TVVBQT1JUOwotCXJldHVybiBQTV9NVFJSX05PVF9TVVBQT1JURUQ7Ci0JfQotICAgIGlmICh0eXBlID49IFBNX01UUlJfTUFYKQotCXJldHVybiBQTV9NVFJSX0VSUl9QQVJBTVM7Ci0KLSAgICAvKiBJZiB0aGUgdHlwZSBpcyBXQywgY2hlY2sgdGhhdCB0aGlzIHByb2Nlc3NvciBzdXBwb3J0cyBpdCAqLwotICAgIGlmICghTVRSUl9oYXZlV3JpdGVDb21iaW5lKCkpCi0JcmV0dXJuIFBNX01UUlJfRVJSX05PV1JDT01COwotCi0gICAgLyogQWRqdXN0IHRoZSBib3VuZGFyaWVzIGRlcGVuZGluZyBvbiB0aGUgQ1BVIHR5cGUgKi8KLSAgICBzd2l0Y2ggKGNwdUZhbWlseSkgewotCWNhc2UgQ1BVX0FNRDoKLQkgICAgaWYgKGNwdVR5cGUgPCBDUFVfQU1EQXRobG9uKSB7Ci0JCS8qIEFwcGx5IHRoZSBLNiBibG9jayBhbGlnbm1lbnQgYW5kIHNpemUgcnVsZXMuIEluIG9yZGVyOgotCQkgKiAgbyBVbmNhY2hlZCBvciBnYXRoZXJpbmcgb25seQotCQkgKiAgbyAxMjhLIG9yIGJpZ2dlciBibG9jawotCQkgKiAgbyBQb3dlciBvZiAyIGJsb2NrCi0JCSAqICBvIGJhc2Ugc3VpdGFibHkgYWxpZ25lZCB0byB0aGUgcG93ZXIKLQkJICovCi0JCWlmICh0eXBlID4gUE1fTVRSUl9XUkNPTUIgJiYgKHNpemUgPCAoMSA8PCAxNykgfHwgKHNpemUgJiB+KHNpemUtMSkpLXNpemUgfHwgKGJhc2UgJiAoc2l6ZS0xKSkpKQotCQkgICAgcmV0dXJuIFBNX01UUlJfRVJSX05PVF9BTElHTkVEOwotCQlicmVhazsKLQkJfQotCSAgICAvKiBGYWxsIHRocm91Z2ggZm9yIEFNRCBBdGhsb24gd2hpY2ggdXNlcyBQNiBzdHlsZSBNVFJSJ3MgKi8KLQljYXNlIENQVV9JbnRlbDoKLQljYXNlIENQVV9DeXJpeDoKLQkgICAgaWYgKChiYXNlICYgMHhGRkYpIHx8IChzaXplICYgMHhGRkYpKSB7Ci0JCS8qIEJhc2UgYW5kIHNpemUgbXVzdCBiZSBtdWx0aXBsZXMgb2YgNEtiICovCi0JCXJldHVybiBQTV9NVFJSX0VSUl9OT1RfNEtCX0FMSUdORUQ7Ci0JCX0KLQkgICAgaWYgKGJhc2UgPCAweDEwMDAwMCkgewotCQkvKiBCYXNlIG11c3QgYmUgPj0gMU1iICovCi0JCXJldHVybiBQTV9NVFJSX0VSUl9CRUxPV18xTUI7Ci0JCX0KLQotCSAgICAvKiBDaGVjayB1cHBlciBiaXRzIG9mIGJhc2UgYW5kIGxhc3QgYXJlIGVxdWFsIGFuZCBsb3dlciBiaXRzCi0JICAgICAqIGFyZSAwIGZvciBiYXNlIGFuZCAxIGZvciBsYXN0Ci0JICAgICAqLwotCSAgICBsYXN0ID0gYmFzZSArIHNpemUgLSAxOwotCSAgICBmb3IgKGxiYXNlID0gYmFzZTsgIShsYmFzZSAmIDEpICYmIChsYXN0ICYgMSk7IGxiYXNlID0gbGJhc2UgPj4gMSwgbGFzdCA9IGxhc3QgPj4gMSkKLQkJOwotCSAgICBpZiAobGJhc2UgIT0gbGFzdCkgewotCQkvKiBCYXNlIGlzIG5vdCBhbGlnbmVkIG9uIHRoZSBjb3JyZWN0IGJvdW5kYXJ5ICovCi0JCXJldHVybiBQTV9NVFJSX0VSUl9OT1RfQUxJR05FRDsKLQkJfQotCSAgICBicmVhazsKLQlkZWZhdWx0OgotCSAgICByZXR1cm4gUE1fTVRSUl9OT1RfU1VQUE9SVEVEOwotCX0KLQotICAgIC8qIFNlYXJjaCBmb3IgZXhpc3RpbmcgTVRSUiAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1NVFJSOyArK2kpIHsKLQlnZXRNVFJSKGksJmxiYXNlLCZsc2l6ZSwmbHR5cGUpOwotCWlmIChsYmFzZSA9PSAwICYmIGxzaXplID09IDApCi0JICAgIGNvbnRpbnVlOwotCWlmIChiYXNlID4gbGJhc2UgKyAobHNpemUtMSkpCi0JICAgIGNvbnRpbnVlOwotCWlmICgoYmFzZSA8IGxiYXNlKSAmJiAoYmFzZStzaXplLTEgPCBsYmFzZSkpCi0JICAgIGNvbnRpbnVlOwotCi0JLyogQ2hlY2sgdGhhdCB3ZSBkb24ndCBvdmVybGFwIGFuIGV4aXN0aW5nIHJlZ2lvbiAqLwotCWlmICh0eXBlICE9IFBNX01UUlJfVU5DQUNIQUJMRSkgewotCSAgICBpZiAoKGJhc2UgPCBsYmFzZSkgfHwgKGJhc2Urc2l6ZS0xID4gbGJhc2UrbHNpemUtMSkpCi0JCXJldHVybiBQTV9NVFJSX0VSUl9PVkVSTEFQOwotCSAgICB9Ci0JZWxzZSBpZiAoYmFzZSA9PSBsYmFzZSAmJiBzaXplID09IGxzaXplKSB7Ci0JICAgIC8qIFRoZSByZWdpb24gYWxyZWFkeSBleGlzdHMgc28gbGVhdmUgaXQgYWxvbmUgKi8KLQkgICAgcmV0dXJuIFBNX01UUlJfRVJSX09LOwotCSAgICB9Ci0KLQkvKiBOZXcgcmVnaW9uIGlzIGVuY2xvc2VkIGJ5IGFuIGV4aXN0aW5nIHJlZ2lvbiwgc28gb25seSBhbGxvdwotCSAqIGEgbmV3IHR5cGUgdG8gYmUgY3JlYXRlZCBpZiB3ZSBhcmUgc2V0dGluZyBhIHJlZ2lvbiB0byBiZQotCSAqIHVuY2FjaGVhYmxlIChzdWNoIGFzIE1NSU8gcmVnaXN0ZXJzIHdpdGhpbiBhIGZyYW1lYnVmZmVyKS4KLQkgKi8KLQlpZiAobHR5cGUgIT0gKGludCl0eXBlKSB7Ci0JICAgIGlmICh0eXBlID09IFBNX01UUlJfVU5DQUNIQUJMRSkKLQkJY29udGludWU7Ci0JICAgIHJldHVybiBQTV9NVFJSX0VSUl9UWVBFX01JU01BVENIOwotCSAgICB9Ci0JcmV0dXJuIFBNX01UUlJfRVJSX09LOwotCX0KLQotICAgIC8qIFNlYXJjaCBmb3IgYW4gZW1wdHkgTVRSUiAqLwotICAgIGlmICgoaSA9IGdldEZyZWVSZWdpb24oYmFzZSxzaXplKSkgPCAwKQotCXJldHVybiBQTV9NVFJSX0VSUl9OT05FX0ZSRUU7Ci0gICAgc2V0TVRSUihpLGJhc2Usc2l6ZSx0eXBlKTsKLSAgICByZXR1cm4gUE1fTVRSUl9FUlJfT0s7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotY2FsbGJhY2sgICAgLSBGdW5jdGlvbiB0byBjYWxsYmFjayB3aXRoIHdyaXRlIGNvbWJpbmUgaW5mb3JtYXRpb24KLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGVudW1lcmF0ZSBhbGwgd3JpdGUgY29tYmluZSByZWdpb25zIGN1cnJlbnRseSBlbmFibGVkIGZvciB0aGUKLXByb2Nlc3Nvci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZW51bVdyaXRlQ29tYmluZSgKLSAgICBQTV9lbnVtV3JpdGVDb21iaW5lX3QgY2FsbGJhY2spCi17Ci0gICAgaW50ICAgICBpLGx0eXBlOwotICAgIHVsb25nICAgbGJhc2UsbHNpemU7Ci0KLSAgICAvKiBDaGVjayB0aGF0IHdlIGhhdmUgYSBDUFUgdGhhdCBzdXBwb3J0cyBNVFJSJ3MgYW5kIHR5cGUgaXMgdmFsaWQgKi8KLSAgICBpZiAobnVtTVRSUiA8PSAwKSB7Ci0JaWYgKCFfTVRSUl9pc1JpbmcwKCkpCi0JICAgIHJldHVybiBQTV9NVFJSX0VSUl9OT19PU19TVVBQT1JUOwotCXJldHVybiBQTV9NVFJSX05PVF9TVVBQT1JURUQ7Ci0JfQotCi0gICAgLyogRW51bWVyYXRlIGFsbCBleGlzdGluZyBNVFJSJ3MgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTVRSUjsgKytpKSB7Ci0JZ2V0TVRSUihpLCZsYmFzZSwmbHNpemUsJmx0eXBlKTsKLQljYWxsYmFjayhsYmFzZSxsc2l6ZSxsdHlwZSk7Ci0JfQotICAgIHJldHVybiBQTV9NVFJSX0VSUl9PSzsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL3BjaWxpYi5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL3BjaWxpYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDU0MmZjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi9wY2lsaWIuYworKysgL2Rldi9udWxsCkBAIC0xLDc0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBNb2R1bGUgZm9yIGludGVyZmFjaW5nIHRvIHRoZSBQQ0kgYnVzIGFuZCBjb25maWd1cmF0aW9uCi0qICAgICAgICAgICAgICAgc3BhY2UgcmVnaXN0ZXJzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAicGNpbGliLmgiCi0jaWYgIWRlZmluZWQoX19XSU4zMl9WWERfXykgJiYgIWRlZmluZWQoX19OVF9EUklWRVJfXykKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFjcm9zIGFuZCB0eXBlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jcHJhZ21hIHBhY2soMSkKLQotLyogTGVuZ3RoIG9mIHRoZSBtZW1vcnkgbWFwcGluZyBmb3IgdGhlIFBDSSBCSU9TICovCi0KLSNkZWZpbmUgQklPU19MSU1JVCAgICAgICAgICAoMTI4ICogMTAyNEwgLSAxKQotCi0vKiBNYWNyb3MgZm9yIGFjY2Vzc2luZyB0aGUgUENJIEJJT1MgZnVuY3Rpb25zIGZyb20gMzItYml0IHByb3RlY3RlZCBtb2RlICovCi0KLSNkZWZpbmUgQklPUzMyX1NJR05BVFVSRSAgICAoKCh1bG9uZyknXycgPDwgMCkgKyAoKHVsb25nKSczJyA8PCA4KSArICgodWxvbmcpJzInIDw8IDE2KSArICgodWxvbmcpJ18nIDw8IDI0KSkKLSNkZWZpbmUgUENJX1NJR05BVFVSRSAgICAgICAoKCh1bG9uZyknUCcgPDwgMCkgKyAoKHVsb25nKSdDJyA8PCA4KSArICgodWxvbmcpJ0knIDw8IDE2KSArICgodWxvbmcpJyAnIDw8IDI0KSkKLSNkZWZpbmUgUENJX1NFUlZJQ0UgICAgICAgICAoKCh1bG9uZyknJCcgPDwgMCkgKyAoKHVsb25nKSdQJyA8PCA4KSArICgodWxvbmcpJ0MnIDw8IDE2KSArICgodWxvbmcpJ0knIDw8IDI0KSkKLSNkZWZpbmUgUENJX0JJT1NfUFJFU0VOVCAgICAweEIxMDEKLSNkZWZpbmUgRklORF9QQ0lfREVWSUNFICAgICAweEIxMDIKLSNkZWZpbmUgRklORF9QQ0lfQ0xBU1MgICAgICAweEIxMDMKLSNkZWZpbmUgR0VORVJBVEVfU1BFQ0lBTCAgICAweEIxMDYKLSNkZWZpbmUgUkVBRF9DT05GSUdfQllURSAgICAweEIxMDgKLSNkZWZpbmUgUkVBRF9DT05GSUdfV09SRCAgICAweEIxMDkKLSNkZWZpbmUgUkVBRF9DT05GSUdfRFdPUkQgICAweEIxMEEKLSNkZWZpbmUgV1JJVEVfQ09ORklHX0JZVEUgICAweEIxMEIKLSNkZWZpbmUgV1JJVEVfQ09ORklHX1dPUkQgICAweEIxMEMKLSNkZWZpbmUgV1JJVEVfQ09ORklHX0RXT1JEICAweEIxMEQKLSNkZWZpbmUgR0VUX0lSUV9ST1VUSU5HX09QVCAweEIxMEUKLSNkZWZpbmUgU0VUX1BDSV9JUlEgICAgICAgICAweEIxMEYKLQotLyogVGhpcyBpcyB0aGUgc3RhbmRhcmQgc3RydWN0dXJlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGVudHJ5IHBvaW50IHRvIHRoZQotICogQklPUzMyIFNlcnZpY2UgRGlyZWN0b3J5LCBhcyBkb2N1bWVudGVkIGluIFBDSSAyLjEgQklPUyBTcGVjaWNpdGlvbi4KLSAqLwotCi10eXBlZGVmIHVuaW9uIHsKLSAgICBzdHJ1Y3QgewotCXVsb25nIHNpZ25hdHVyZTsgICAgICAgIC8qIF8zMl8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCXVsb25nIGVudHJ5OyAgICAgICAgICAgIC8qIDMyIGJpdCBwaHlzaWNhbCBhZGRyZXNzICAgICAgICAgICAgICAqLwotCXVjaGFyIHJldmlzaW9uOyAgICAgICAgIC8qIFJldmlzaW9uIGxldmVsLCAwICAgICAgICAgICAgICAgICAgICAqLwotCXVjaGFyIGxlbmd0aDsgICAgICAgICAgIC8qIExlbmd0aCBpbiBwYXJhZ3JhcGhzIHNob3VsZCBiZSAwMSAgICAqLwotCXVjaGFyIGNoZWNrc3VtOyAgICAgICAgIC8qIEFsbCBieXRlcyBtdXN0IGFkZCB1cCB0byB6ZXJvICAgICAgICAqLwotCXVjaGFyIHJlc2VydmVkWzVdOyAgICAgIC8qIE11c3QgYmUgemVybyAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCX0gZmllbGRzOwotICAgIGNoYXIgY2hhcnNbMTZdOwotICAgIH0gUENJX2Jpb3MzMjsKLQotLyogU3RydWN0dXJlIGZvciBhIGZhciBwb2ludGVyIHRvIGNhbGwgdGhlIFBDSSBCSU9TIHNlcnZpY2VzIHdpdGggKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVsb25nICAgYWRkcmVzczsKLSAgICB1c2hvcnQgIHNlZ21lbnQ7Ci0gICAgfSBQQ0lCSU9TX2VudHJ5OwotCi0vKiBNYWNyb3MgdG8gY29weSBhIHN0cnVjdHVyZSB0aGF0IGluY2x1ZGVzIGR3U2l6ZSBtZW1iZXJzICovCi0KLSNkZWZpbmUgQ09QWV9TVFJVQ1RVUkUoZCxzKSBtZW1jcHkoZCxzLE1JTigocyktPmR3U2l6ZSwoZCktPmR3U2l6ZSkpCi0KLSNwcmFnbWEgcGFjaygpCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1Y2hhciAgICAgICAgICAgICpCSU9TSW1hZ2UgPSBOVUxMOyAgLyogQklPUyBpbWFnZSBtYXBwaW5nICAgICAgICovCi1zdGF0aWMgaW50ICAgICAgICAgICAgICBQQ0lCSU9TVmVyc2lvbiA9IC0xOy8qIFBDSSBCSU9TIHZlcnNpb24gICAgICAgICAqLwotc3RhdGljIFBDSUJJT1NfZW50cnkgICAgUENJRW50cnk7ICAgICAgICAgICAvKiBQQ0kgc2VydmljZXMgZW50cnkgcG9pbnQgKi8KLXN0YXRpYyB1bG9uZyAgICAgICAgICAgIFBDSVBoeXNFbnRyeSA9IDA7ICAgLyogUGh5c2ljYWwgYWRkcmVzcyAgICAgICAgICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEV4dGVybmFsIGFzc2VtYmxlciBoZWxwZXIgZnVuY3Rpb25zICovCi0KLXVjaGFyICAgX0FTTUFQSSBfQklPUzMyX3NlcnZpY2UodWxvbmcgc2VydmljZSx1bG9uZyBmdW5jdGlvbix1bG9uZyAqcGh5c0Jhc2UsdWxvbmcgKmxlbmd0aCx1bG9uZyAqc2VydmljZU9mZnNldCxQQ0lCSU9TX2VudHJ5IGVudHJ5KTsKLXVzaG9ydCAgX0FTTUFQSSBfUENJQklPU19pc1ByZXNlbnQodWxvbmcgaV9lYXgsdWxvbmcgKm9fZWR4LHVzaG9ydCAqb19heCx1Y2hhciAqb19jbCxQQ0lCSU9TX2VudHJ5IGVudHJ5KTsKLXVsb25nICAgX0FTTUFQSSBfUENJQklPU19zZXJ2aWNlKHVsb25nIHJfZWF4LHVsb25nIHJfZWJ4LHVsb25nIHJfZWRpLHVsb25nIHJfZWN4LFBDSUJJT1NfZW50cnkgZW50cnkpOwotaW50ICAgICBfQVNNQVBJIF9QQ0lCSU9TX2dldFJvdXRpbmcoUENJUm91dGluZ09wdGlvbnNCdWZmZXIgKmJ1ZixQQ0lCSU9TX2VudHJ5IGVudHJ5KTsKLWlib29sICAgX0FTTUFQSSBfUENJQklPU19zZXRJUlEoaW50IGJ1c0RldixpbnQgaW50UGluLGludCBJUlEsUENJQklPU19lbnRyeSBlbnRyeSk7Ci11bG9uZyAgIF9BU01BUEkgX1BDSUJJT1Nfc3BlY2lhbEN5Y2xlKGludCBidXMsdWxvbmcgZGF0YSxQQ0lCSU9TX2VudHJ5IGVudHJ5KTsKLXVzaG9ydCAgX0FTTUFQSSBfUENJX2dldENTKHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb25zIHJldHVybnMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIFBDSSBCSU9TIGVudHJ5IHBvaW50LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9BU01BUEkgUENJQklPU19nZXRFbnRyeSh2b2lkKQoteyByZXR1cm4gUENJUGh5c0VudHJ5OyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotaHdUeXBlICAtIFBsYWNlIHRvIHN0b3JlIHRoZSBQQ0kgaGFyZHdhcmUgYWNjZXNzIG1lY2hhbmlzbSBmbGFncwotbGFzdEJ1cyAtIFBsYWNlIHRvIHN0b3JlIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBQQ0kgYnVzIGluIHRoZSBzeXN0ZW0KLQotUkVUVVJOUzoKLVZlcnNpb24gbnVtYmVyIG9mIHRoZSBQQ0kgQklPUyBmb3VuZC4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUgUENJIEJJT1MgaXMgcHJlc2VudCBpbiB0aGUgc3lzdGVtLCBhbmQgaWYKLXNvIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IHRoZSBQQ0kgQklPUyBkZXRlY3QgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBQQ0lCSU9TX2RldGVjdCgKLSAgICB1Y2hhciAqaHdUeXBlLAotICAgIHVjaGFyICpsYXN0QnVzKQotewotICAgIHVsb25nICAgc2lnbmF0dXJlOwotICAgIHVzaG9ydCAgc3RhdCx2ZXJzaW9uOwotCi0jaWZuZGVmIF9fMTZCSVRfXwotICAgIFBDSUJJT1NfZW50cnkgICBCSU9TRW50cnkgPSB7MH07Ci0gICAgdWNoYXIgICAgICAgICAgICpCSU9TRW5kOwotICAgIFBDSV9iaW9zMzIgICAgICAqQklPU0RpcjsKLSAgICB1bG9uZyAgICAgICAgICAgcGh5c0Jhc2UsbGVuZ3RoLG9mZnNldDsKLQotICAgIC8qIEJhaWwgaWYgd2UgaGF2ZSBhbHJlYWR5IGRldGVjdGVkIG5vIEJJT1MgaXMgcHJlc2VudCAqLwotICAgIGlmIChQQ0lCSU9TVmVyc2lvbiA9PSAwKQotCXJldHVybiAwOwotCi0gICAgLyogRmlyc3Qgc2NhbiB0aGUgbWVtb3J5IGZyb20gMHhFMDAwMCB0byAweEZGRkZGIGxvb2tpbmcgZm9yIHRoZQotICAgICAqIEJJT1MzMiBzZXJ2aWNlIGRpcmVjdG9yeSwgc28gd2UgY2FuIGRldGVybWluZSBpZiB3ZSBjYW4gY2FsbCBpdAotICAgICAqIGZyb20gMzItYml0IHByb3RlY3RlZCBtb2RlLgotICAgICAqLwotICAgIGlmIChQQ0lCSU9TVmVyc2lvbiA9PSAtMSkgewotCVBDSUJJT1NWZXJzaW9uID0gMDsKLQlCSU9TSW1hZ2UgPSBQTV9tYXBQaHlzaWNhbEFkZHIoMHhFMDAwMCxCSU9TX0xJTUlULGZhbHNlKTsKLQlpZiAoIUJJT1NJbWFnZSkKLQkgICAgcmV0dXJuIDA7Ci0JQklPU0VuZCA9IEJJT1NJbWFnZSArIDB4MjAwMDA7Ci0JZm9yIChCSU9TRGlyID0gKFBDSV9iaW9zMzIqKUJJT1NJbWFnZTsgQklPU0RpciA8IChQQ0lfYmlvczMyKilCSU9TRW5kOyBCSU9TRGlyKyspIHsKLQkgICAgdWNoYXIgICBzdW07Ci0JICAgIGludCAgICAgaSxsZW5ndGg7Ci0KLQkgICAgaWYgKEJJT1NEaXItPmZpZWxkcy5zaWduYXR1cmUgIT0gQklPUzMyX1NJR05BVFVSRSkKLQkJY29udGludWU7Ci0JICAgIGxlbmd0aCA9IEJJT1NEaXItPmZpZWxkcy5sZW5ndGggKiAxNjsKLQkgICAgaWYgKCFsZW5ndGgpCi0JCWNvbnRpbnVlOwotCSAgICBmb3IgKHN1bSA9IGkgPSAwOyBpIDwgbGVuZ3RoIDsgaSsrKQotCQlzdW0gKz0gQklPU0Rpci0+Y2hhcnNbaV07Ci0JICAgIGlmIChzdW0gIT0gMCkKLQkJY29udGludWU7Ci0JICAgIEJJT1NFbnRyeS5hZGRyZXNzID0gKHVsb25nKUJJT1NJbWFnZSArIChCSU9TRGlyLT5maWVsZHMuZW50cnkgLSAweEUwMDAwKTsKLQkgICAgQklPU0VudHJ5LnNlZ21lbnQgPSBfUENJX2dldENTKCk7Ci0JICAgIGJyZWFrOwotCSAgICB9Ci0KLQkvKiBJZiB3ZSBmb3VuZCB0aGUgQklPUzMyIGRpcmVjdG9yeSwgY2FsbCBpdCB0byBnZXQgdGhlIGFkZHJlc3Mgb2YgdGhlCi0JICogUENJIHNlcnZpY2VzLgotCSAqLwotCWlmIChCSU9TRW50cnkuYWRkcmVzcyA9PSAwKQotCSAgICByZXR1cm4gMDsKLQlpZiAoX0JJT1MzMl9zZXJ2aWNlKFBDSV9TRVJWSUNFLDAsJnBoeXNCYXNlLCZsZW5ndGgsJm9mZnNldCxCSU9TRW50cnkpICE9IDApCi0JICAgIHJldHVybiAwOwotCVBDSVBoeXNFbnRyeSA9IHBoeXNCYXNlICsgb2Zmc2V0OwotCVBDSUVudHJ5LmFkZHJlc3MgPSAodWxvbmcpQklPU0ltYWdlICsgKFBDSVBoeXNFbnRyeSAtIDB4RTAwMDApOwotCVBDSUVudHJ5LnNlZ21lbnQgPSBfUENJX2dldENTKCk7Ci0JfQotI2VuZGlmCi0gICAgLyogV2UgZm91bmQgdGhlIEJJT1MgZW50cnksIHNvIG5vdyBkbyB0aGUgdmVyc2lvbiBjaGVjayAqLwotICAgIHZlcnNpb24gPSBfUENJQklPU19pc1ByZXNlbnQoUENJX0JJT1NfUFJFU0VOVCwmc2lnbmF0dXJlLCZzdGF0LGxhc3RCdXMsUENJRW50cnkpOwotICAgIGlmICh2ZXJzaW9uID4gMCAmJiAoKHN0YXQgPj4gOCkgPT0gMCkgJiYgc2lnbmF0dXJlID09IFBDSV9TSUdOQVRVUkUpIHsKLQkqaHdUeXBlID0gc3RhdCAmIDB4RkY7Ci0JcmV0dXJuIFBDSUJJT1NWZXJzaW9uID0gdmVyc2lvbjsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotaW5mbyAgICAtIEFycmF5IG9mIFBDSURldmljZUluZm8gc3RydWN0dXJlcyB0byBjaGVjayBhZ2FpbnN0Ci1pbmRleCAgIC0gSW5kZXggb2YgdGhlIGN1cnJlbnQgZGV2aWNlIHRvIGNoZWNrCi0KLVJFVFVSTlM6Ci1UcnVlIGlmIHRoZSBkZXZpY2UgaXMgYSBkdXBsaWNhdGUsIGZhbHNlIGlmIG5vdC4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gZ29lcyB0aHJvdWdoIHRoZSBsaXN0IG9mIGFsbCBkZXZpY2VzIHByZWNlZWRpbmcgdGhlIG5ld2x5Ci1mb3VuZCBkZXZpY2UgaW4gdGhlIGluZm8gc3RydWN0dXJlLCBhbmQgY2hlY2tzIHRoYXQgdGhlIGRldmljZSBpcyBub3QgYQotZHVwbGljYXRlIG9mIGEgcHJldmlvdXMgZGV2aWNlLiBTb21lIGRldmljZXMgaW5jb3JyZWN0bHkgZW51bWVyYXRlCi10aGVtc2VsdmVzIGF0IGRpZmZlcmVudCBmdW5jdGlvbiBhZGRyZXNzZXMgc28gd2UgY2hlY2sgaGVyZSB0byBleGNsdWRlCi10aG9zZSBjYXNlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaWJvb2wgQ2hlY2tEdXBsaWNhdGUoCi0gICAgUENJRGV2aWNlSW5mbyAqaW5mbywKLSAgICBQQ0lEZXZpY2VJbmZvICpwcmV2KQotewotICAgIC8qIElnbm9yZSBkZXZpY2VzIHdpdGggYSB2ZW5kb3IgSUQgb2YgMCAqLwotICAgIGlmIChpbmZvLT5WZW5kb3JJRCA9PSAwKQotCXJldHVybiB0cnVlOwotCi0gICAgLyogTk9URTogV2Ugb25seSBjaGVjayBhZ2FpbnN0IHRoZSBjdXJyZW50IGRldmljZSBvbgotICAgICAqICAgICAgIHRoZSBidXMgdG8gZW5zdXJlIHRoYXQgd2UgZG8gbm90IGV4Y2x1ZGUKLSAgICAgKiAgICAgICBtdWx0aXBsZSBjb250cm9sbGVycyBvZiB0aGUgc2FtZSBkZXZpY2UgSUQuCi0gICAgICovCi0gICAgaWYgKGluZm8tPnNsb3QucC5CdXMgPT0gcHJldi0+c2xvdC5wLkJ1cyAmJgotCWluZm8tPnNsb3QucC5EZXZpY2UgPT0gcHJldi0+c2xvdC5wLkRldmljZSAmJgotCWluZm8tPkRldmljZUlEID09IHByZXYtPkRldmljZUlEKQotCXJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1pbmZvICAgICAgICAtIEFycmF5IG9mIFBDSURldmljZUluZm8gc3RydWN0dXJlcyB0byBmaWxsIGluCi1tYXhEZXZpY2VzICAtIE1heGltdW0gbnVtYmVyIG9mIG9mIGRldmljZXMgdG8gZW51bWVyYXRlIGludG8gYXJyYXkKLQotUkVUVVJOUzoKLU51bWJlciBvZiBQQ0kgZGV2aWNlcyBmb3VuZCBhbmQgZW51bWVyYXRlZCBvbiB0aGUgUENJIGJ1cywgMCBpZiBub3QgUENJLgotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZW51bWVyYXRlIGFsbCBhdmFpbGFibGUgZGV2aWNlcyBvbiB0aGUgUENJIGJ1cyBpbnRvIGFuIGFycmF5Ci1vZiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGJsb2Nrcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IFBDSV9lbnVtZXJhdGVNZWNoMSgKLSAgICBQQ0lEZXZpY2VJbmZvIGluZm9bXSkKLXsKLSAgICBpbnQgICAgICAgICAgICAgYnVzLGRldmljZSxmdW5jdGlvbixpLG51bUZvdW5kID0gMDsKLSAgICB1bG9uZyAgICAgICAgICAgKmxwLHRtcDsKLSAgICBQQ0lzbG90ICAgICAgICAgc2xvdCA9IHt7MCwwLDAsMCwwLDAsMX19OwotICAgIFBDSURldmljZUluZm8gICBwY2kscHJldiA9IHswfTsKLQotICAgIC8qIFRyeSBQQ0kgYWNjZXNzIG1lY2hhbmlzbSAxICovCi0gICAgUE1fb3V0cGIoMHhDRkIsMHgwMSk7Ci0gICAgdG1wID0gUE1faW5wZCgweENGOCk7Ci0gICAgUE1fb3V0cGQoMHhDRjgsc2xvdC5pKTsKLSAgICBpZiAoKFBNX2lucGQoMHhDRjgpID09IHNsb3QuaSkgJiYgKFBNX2lucGQoMHhDRkMpICE9IDB4RkZGRkZGRkZVTCkpIHsKLQkvKiBQQ0kgYWNjZXNzIG1lY2hhbmlzbSAxIC0gdGhlIHByZWZlcnJlZCBtZWNoYW5pc20gKi8KLQlmb3IgKGJ1cyA9IDA7IGJ1cyA8IDg7IGJ1cysrKSB7Ci0JICAgIHNsb3QucC5CdXMgPSBidXM7Ci0JICAgIGZvciAoZGV2aWNlID0gMDsgZGV2aWNlIDwgMzI7IGRldmljZSsrKSB7Ci0JCXNsb3QucC5EZXZpY2UgPSBkZXZpY2U7Ci0JCWZvciAoZnVuY3Rpb24gPSAwOyBmdW5jdGlvbiA8IDg7IGZ1bmN0aW9uKyspIHsKLQkJICAgIHNsb3QucC5GdW5jdGlvbiA9IGZ1bmN0aW9uOwotCQkgICAgc2xvdC5wLlJlZ2lzdGVyID0gMDsKLQkJICAgIFBNX291dHBkKDB4Q0Y4LHNsb3QuaSk7Ci0JCSAgICBpZiAoUE1faW5wZCgweENGQykgIT0gMHhGRkZGRkZGRlVMKSB7Ci0JCQltZW1zZXQoJnBjaSwwLHNpemVvZihwY2kpKTsKLQkJCXBjaS5kd1NpemUgPSBzaXplb2YocGNpKTsKLQkJCXBjaS5tZWNoMSA9IDE7Ci0JCQlwY2kuc2xvdCA9IHNsb3Q7Ci0JCQlscCA9ICh1bG9uZyopJihwY2kuVmVuZG9ySUQpOwotCQkJZm9yIChpID0gMDsgaSA8IE5VTV9QQ0lfUkVHOyBpKyssIGxwKyspIHsKLQkJCSAgICBzbG90LnAuUmVnaXN0ZXIgPSBpOwotCQkJICAgIFBNX291dHBkKDB4Q0Y4LHNsb3QuaSk7Ci0JCQkgICAgKmxwID0gUE1faW5wZCgweENGQyk7Ci0JCQkgICAgfQotCQkJaWYgKCFDaGVja0R1cGxpY2F0ZSgmcGNpLCZwcmV2KSkgewotCQkJICAgIGlmIChpbmZvKQotCQkJCUNPUFlfU1RSVUNUVVJFKCZpbmZvW251bUZvdW5kXSwmcGNpKTsKLQkJCSAgICArK251bUZvdW5kOwotCQkJICAgIH0KLQkJCXByZXYgPSBwY2k7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JLyogRGlzYWJsZSBQQ0kgY29uZmlnIGN5Y2xlIG9uIGV4aXQgKi8KLQlQTV9vdXRwZCgweENGOCwwKTsKLQlyZXR1cm4gbnVtRm91bmQ7Ci0JfQotICAgIFBNX291dHBkKDB4Q0Y4LHRtcCk7Ci0KLSAgICAvKiBObyBoYXJkd2FyZSBhY2Nlc3MgbWVjaGFuaXNtIDEgZm91bmQgKi8KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1pbmZvICAgICAgICAtIEFycmF5IG9mIFBDSURldmljZUluZm8gc3RydWN0dXJlcyB0byBmaWxsIGluCi1tYXhEZXZpY2VzICAtIE1heGltdW0gbnVtYmVyIG9mIG9mIGRldmljZXMgdG8gZW51bWVyYXRlIGludG8gYXJyYXkKLQotUkVUVVJOUzoKLU51bWJlciBvZiBQQ0kgZGV2aWNlcyBmb3VuZCBhbmQgZW51bWVyYXRlZCBvbiB0aGUgUENJIGJ1cywgMCBpZiBub3QgUENJLgotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZW51bWVyYXRlIGFsbCBhdmFpbGFibGUgZGV2aWNlcyBvbiB0aGUgUENJIGJ1cyBpbnRvIGFuIGFycmF5Ci1vZiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGJsb2Nrcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IFBDSV9lbnVtZXJhdGVNZWNoMigKLSAgICBQQ0lEZXZpY2VJbmZvIGluZm9bXSkKLXsKLSAgICBpbnQgICAgICAgICAgICAgYnVzLGRldmljZSxmdW5jdGlvbixpLG51bUZvdW5kID0gMDsKLSAgICB1c2hvcnQgICAgICAgICAgZGV2aWNlSU87Ci0gICAgdWxvbmcgICAgICAgICAgICpscDsKLSAgICBQQ0lzbG90ICAgICAgICAgc2xvdCA9IHt7MCwwLDAsMCwwLDAsMX19OwotICAgIFBDSURldmljZUluZm8gICBwY2kscHJldiA9IHswfTsKLQotICAgIC8qIFRyeSBQQ0kgYWNjZXNzIG1lY2hhbmlzbSAyICovCi0gICAgUE1fb3V0cGIoMHhDRkIsMHgwMCk7Ci0gICAgUE1fb3V0cGIoMHhDRjgsMHgwMCk7Ci0gICAgUE1fb3V0cGIoMHhDRkEsMHgwMCk7Ci0gICAgaWYgKFBNX2lucGIoMHhDRjgpID09IDB4MDAgJiYgUE1faW5wYigweENGQikgPT0gMHgwMCkgewotCS8qIFBDSSBhY2Nlc3MgbWVjaGFuaXNtIDIgLSB0aGUgb2xkZXIgbWVjaGFuaXNtIGZvciBsZWdhY3kgYnVzc2VzICovCi0JZm9yIChidXMgPSAwOyBidXMgPCAyOyBidXMrKykgewotCSAgICBzbG90LnAuQnVzID0gYnVzOwotCSAgICBQTV9vdXRwYigweENGQSwodWNoYXIpYnVzKTsKLQkgICAgZm9yIChkZXZpY2UgPSAwOyBkZXZpY2UgPCAxNjsgZGV2aWNlKyspIHsKLQkJc2xvdC5wLkRldmljZSA9IGRldmljZTsKLQkJZGV2aWNlSU8gPSAweEMwMDAgKyAoZGV2aWNlIDw8IDgpOwotCQlmb3IgKGZ1bmN0aW9uID0gMDsgZnVuY3Rpb24gPCA4OyBmdW5jdGlvbisrKSB7Ci0JCSAgICBzbG90LnAuRnVuY3Rpb24gPSBmdW5jdGlvbjsKLQkJICAgIHNsb3QucC5SZWdpc3RlciA9IDA7Ci0JCSAgICBQTV9vdXRwYigweENGOCwodWNoYXIpKChmdW5jdGlvbiA8PCAxKSB8IDB4MTApKTsKLQkJICAgIGlmIChQTV9pbnBkKGRldmljZUlPKSAhPSAweEZGRkZGRkZGVUwpIHsKLQkJCW1lbXNldCgmcGNpLDAsc2l6ZW9mKHBjaSkpOwotCQkJcGNpLmR3U2l6ZSA9IHNpemVvZihwY2kpOwotCQkJcGNpLm1lY2gxID0gMDsKLQkJCXBjaS5zbG90ID0gc2xvdDsKLQkJCWxwID0gKHVsb25nKikmKHBjaS5WZW5kb3JJRCk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1BDSV9SRUc7IGkrKywgbHArKykgewotCQkJICAgIHNsb3QucC5SZWdpc3RlciA9IGk7Ci0JCQkgICAgKmxwID0gUE1faW5wZChkZXZpY2VJTyArIChpIDw8IDIpKTsKLQkJCSAgICB9Ci0JCQlpZiAoIUNoZWNrRHVwbGljYXRlKCZwY2ksJnByZXYpKSB7Ci0JCQkgICAgaWYgKGluZm8pCi0JCQkJQ09QWV9TVFJVQ1RVUkUoJmluZm9bbnVtRm91bmRdLCZwY2kpOwotCQkJICAgICsrbnVtRm91bmQ7Ci0JCQkgICAgfQotCQkJcHJldiA9IHBjaTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkvKiBEaXNhYmxlIFBDSSBjb25maWcgY3ljbGUgb24gZXhpdCAqLwotCVBNX291dHBiKDB4Q0Y4LDApOwotCXJldHVybiBudW1Gb3VuZDsKLQl9Ci0KLSAgICAvKiBObyBoYXJkd2FyZSBhY2Nlc3MgbWVjaGFuaXNtIDIgZm91bmQgKi8KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9ucyByZWFkcyBhIGNvbmZpZ3VyYXRpb24gZHdvcmQgdmlhIHRoZSBQQ0kgQklPUy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgUENJQklPU19yZWFkRFdPUkQoCi0gICAgaW50IGluZGV4LAotICAgIHVsb25nIHNsb3QpCi17Ci0gICAgcmV0dXJuICh1bG9uZylfUENJQklPU19zZXJ2aWNlKFJFQURfQ09ORklHX0RXT1JELHNsb3QgPj4gOCxpbmRleCwwLFBDSUVudHJ5KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1pbmZvICAgICAgICAtIEFycmF5IG9mIFBDSURldmljZUluZm8gc3RydWN0dXJlcyB0byBmaWxsIGluCi1tYXhEZXZpY2VzICAtIE1heGltdW0gbnVtYmVyIG9mIG9mIGRldmljZXMgdG8gZW51bWVyYXRlIGludG8gYXJyYXkKLQotUkVUVVJOUzoKLU51bWJlciBvZiBQQ0kgZGV2aWNlcyBmb3VuZCBhbmQgZW51bWVyYXRlZCBvbiB0aGUgUENJIGJ1cywgMCBpZiBub3QgUENJLgotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZW51bWVyYXRlIGFsbCBhdmFpbGFibGUgZGV2aWNlcyBvbiB0aGUgUENJIGJ1cyBpbnRvIGFuIGFycmF5Ci1vZiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGJsb2Nrcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IFBDSV9lbnVtZXJhdGVCSU9TKAotICAgIFBDSURldmljZUluZm8gaW5mb1tdKQotewotICAgIHVjaGFyICAgICAgICAgICBod1R5cGUsbGFzdEJ1czsKLSAgICBpbnQgICAgICAgICAgICAgYnVzLGRldmljZSxmdW5jdGlvbixpLG51bUZvdW5kID0gMDsKLSAgICB1bG9uZyAgICAgICAgICAgKmxwOwotICAgIFBDSXNsb3QgICAgICAgICBzbG90ID0ge3swLDAsMCwwLDAsMCwxfX07Ci0gICAgUENJRGV2aWNlSW5mbyAgIHBjaSxwcmV2ID0gezB9OwotCi0gICAgaWYgKFBDSUJJT1NfZGV0ZWN0KCZod1R5cGUsJmxhc3RCdXMpKSB7Ci0JLyogUENJIEJJT1MgYWNjZXNzIC0gdGhlIHVsdGltYXRlIGZhbGxiYWNrICovCi0JZm9yIChidXMgPSAwOyBidXMgPD0gbGFzdEJ1czsgYnVzKyspIHsKLQkgICAgc2xvdC5wLkJ1cyA9IGJ1czsKLQkgICAgZm9yIChkZXZpY2UgPSAwOyBkZXZpY2UgPCAzMjsgZGV2aWNlKyspIHsKLQkJc2xvdC5wLkRldmljZSA9IGRldmljZTsKLQkJZm9yIChmdW5jdGlvbiA9IDA7IGZ1bmN0aW9uIDwgODsgZnVuY3Rpb24rKykgewotCQkgICAgc2xvdC5wLkZ1bmN0aW9uID0gZnVuY3Rpb247Ci0JCSAgICBpZiAoUENJQklPU19yZWFkRFdPUkQoMCxzbG90LmkpICE9IDB4RkZGRkZGRkZVTCkgewotCQkJbWVtc2V0KCZwY2ksMCxzaXplb2YocGNpKSk7Ci0JCQlwY2kuZHdTaXplID0gc2l6ZW9mKHBjaSk7Ci0JCQlwY2kubWVjaDEgPSAyOwotCQkJcGNpLnNsb3QgPSBzbG90OwotCQkJbHAgPSAodWxvbmcqKSYocGNpLlZlbmRvcklEKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBOVU1fUENJX1JFRzsgaSsrLCBscCsrKQotCQkJICAgICpscCA9IFBDSUJJT1NfcmVhZERXT1JEKGkgPDwgMixzbG90LmkpOwotCQkJaWYgKCFDaGVja0R1cGxpY2F0ZSgmcGNpLCZwcmV2KSkgewotCQkJICAgIGlmIChpbmZvKQotCQkJCUNPUFlfU1RSVUNUVVJFKCZpbmZvW251bUZvdW5kXSwmcGNpKTsKLQkJCSAgICArK251bUZvdW5kOwotCQkJICAgIH0KLQkJCXByZXYgPSBwY2k7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLQotICAgIC8qIFJldHVybiBudW1iZXIgb2YgZGV2aWNlcyBmb3VuZCAqLwotICAgIHJldHVybiBudW1Gb3VuZDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1pbmZvICAgICAgICAtIEFycmF5IG9mIFBDSURldmljZUluZm8gc3RydWN0dXJlcyB0byBmaWxsIGluCi1tYXhEZXZpY2VzICAtIE1heGltdW0gbnVtYmVyIG9mIG9mIGRldmljZXMgdG8gZW51bWVyYXRlIGludG8gYXJyYXkKLQotUkVUVVJOUzoKLU51bWJlciBvZiBQQ0kgZGV2aWNlcyBmb3VuZCBhbmQgZW51bWVyYXRlZCBvbiB0aGUgUENJIGJ1cywgMCBpZiBub3QgUENJLgotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZW51bWVyYXRlIGFsbCBhdmFpbGFibGUgZGV2aWNlcyBvbiB0aGUgUENJIGJ1cyBpbnRvIGFuIGFycmF5Ci1vZiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGJsb2Nrcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgX0FTTUFQSSBQQ0lfZW51bWVyYXRlKAotICAgIFBDSURldmljZUluZm8gaW5mb1tdKQotewotICAgIGludCBudW1Gb3VuZDsKLQotICAgIC8qIEZpcnN0IHRyeSB2aWEgdGhlIGRpcmVjdCBhY2Nlc3MgbWVjaGFuaXNtcyB3aGljaCBhcmUgZmFzdGVyIGlmIHdlCi0gICAgICogaGF2ZSB0aGVtIChuZWFybHkgYWx3YXlzKS4gVGhlIEJJT1MgaXMgdXNlZCBhcyBhIGZhbGxiYWNrLCBhbmQgZm9yCi0gICAgICogc3R1ZmYgd2UgY2FuJ3QgZG8gZGlyZWN0bHkuCi0gICAgICovCi0gICAgaWYgKChudW1Gb3VuZCA9IFBDSV9lbnVtZXJhdGVNZWNoMShpbmZvKSkgPT0gMCkgewotCWlmICgobnVtRm91bmQgPSBQQ0lfZW51bWVyYXRlTWVjaDIoaW5mbykpID09IDApIHsKLQkgICAgaWYgKChudW1Gb3VuZCA9IFBDSV9lbnVtZXJhdGVCSU9TKGluZm8pKSA9PSAwKQotCQlyZXR1cm4gMDsKLQkgICAgfQotCX0KLSAgICByZXR1cm4gbnVtRm91bmQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotaW5mbyAgICAgICAgLSBBcnJheSBvZiBQQ0lEZXZpY2VJbmZvIHN0cnVjdHVyZXMgdG8gZmlsbCBpbgotbWF4RGV2aWNlcyAgLSBNYXhpbXVtIG51bWJlciBvZiBvZiBkZXZpY2VzIHRvIGVudW1lcmF0ZSBpbnRvIGFycmF5Ci0KLVJFVFVSTlM6Ci1OdW1iZXIgb2YgUENJIGRldmljZXMgZm91bmQgYW5kIGVudW1lcmF0ZWQgb24gdGhlIFBDSSBidXMsIDAgaWYgbm90IFBDSS4KLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGVudW1lcmF0ZSBhbGwgYXZhaWxhYmxlIGRldmljZXMgb24gdGhlIFBDSSBidXMgaW50byBhbiBhcnJheQotb2YgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBibG9ja3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IF9BU01BUEkgUENJX2dldE51bURldmljZXModm9pZCkKLXsKLSAgICByZXR1cm4gUENJX2VudW1lcmF0ZShOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1iYXIgLSBCYXNlIGFkZHJlc3MgdG8gbWVhc3VyZQotcGNpIC0gUENJIGRldmljZSB0byBhY2Nlc3MKLQotUkVUVVJOUzoKLVNpemUgb2YgdGhlIFBDSSBiYXNlIGFkZHJlc3MgaW4gYnl0ZXMKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gbWVhc3VyZXMgdGhlIHNpemUgb2YgdGhlIFBDSSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgaW4gYnl0ZXMsCi1ieSB3cml0aW5nIGFsbCBGJ3MgdG8gdGhlIHJlZ2lzdGVyLCBhbmQgcmVhZGluZyB0aGUgdmFsdWUgYmFjay4gVGhlIHNpemUKLW9mIHRoZSBiYXNlIGFkZHJlc3MgaXMgZGV0ZXJtaW5lcyBieSB0aGUgYml0cyB0aGF0IGFyZSBoYXJkd2lyZWQgdG8gemVybydzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9BU01BUEkgUENJX2ZpbmRCQVJTaXplKAotICAgIGludCBiYXIsCi0gICAgUENJRGV2aWNlSW5mbyAqcGNpKQotewotICAgIHVsb25nICAgYmFzZSxzaXplID0gMDsKLQotICAgIGJhc2UgPSBQQ0lfYWNjZXNzUmVnKGJhciwwLFBDSV9SRUFEX0RXT1JELHBjaSk7Ci0gICAgaWYgKGJhc2UgJiYgIShiYXNlICYgMHgxKSkgewotCS8qIEZvciBzb21lIHN0cmFuZ2UgcmVhc29uIHNvbWUgZGV2aWNlcyBkb24ndCBwcm9wZXJseSBkZWNvZGUKLQkgKiB0aGVpciBiYXNlIGFkZHJlc3MgcmVnaXN0ZXJzIChJbnRlbCBQQ0kvUENJIGJyaWRnZXMhKSwgYW5kCi0JICogd2UgcmVhZCBjb21wbGV0ZWx5IGJvZ3VzIHZhbHVlcy4gV2UgY2hlY2sgZm9yIHRoYXQgaGVyZQotCSAqIGFuZCBjbGVhciBvdXQgdGhvc2UgQkFSJ3MuCi0JICoKLQkgKiBXZSBjaGVjayBmb3IgdGhhdCBoZXJlIGJlY2F1c2UgYXQgbGVhc3QgdGhlIGxvdyAxMiBiaXRzCi0JICogb2YgdGhlIGFkZHJlc3MgcmFuZ2UgbXVzdCBiZSB6ZXJvcywgc2luY2UgdGhlIHBhZ2Ugc2l6ZQotCSAqIG9uIElBMzIgcHJvY2Vzc29ycyBpcyBhbHdheXMgNEtiLgotCSAqLwotCWlmICgoYmFzZSAmIDB4RkZGKSA9PSAwKSB7Ci0JICAgIFBDSV9hY2Nlc3NSZWcoYmFyLDB4RkZGRkZGRkYsUENJX1dSSVRFX0RXT1JELHBjaSk7Ci0JICAgIHNpemUgPSBQQ0lfYWNjZXNzUmVnKGJhciwwLFBDSV9SRUFEX0RXT1JELHBjaSkgJiB+MHhGRjsKLQkgICAgc2l6ZSA9IH5zaXplKzE7Ci0JICAgIFBDSV9hY2Nlc3NSZWcoYmFyLGJhc2UsUENJX1dSSVRFX0RXT1JELHBjaSk7Ci0JICAgIH0KLQl9Ci0gICAgcGNpLT5zbG90LnAuUmVnaXN0ZXIgPSAwOwotICAgIHJldHVybiBzaXplOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWluZGV4ICAgLSBEV09SRCBpbmRleCBvZiB0aGUgcmVnaXN0ZXIgdG8gYWNjZXNzCi12YWx1ZSAgIC0gVmFsdWUgdG8gd3JpdGUgdG8gdGhlIHJlZ2lzdGVyIGZvciB3cml0ZSBhY2Nlc3MKLWZ1bmMgICAgLSBGdW5jdGlvbiB0byBpbXBsZW1lbnQKLQotUkVUVVJOUzoKLVRoZSB2YWx1ZSByZWFkIGZyb20gdGhlIHJlZ2lzdGVyIGZvciByZWFkIG9wZXJhdGlvbnMKLQotUkVNQVJLUzoKLVRoZSBmdW5jdGlvbiBjb2RlIGFyZSBkZWZpbmVkIGFzIGZvbGxvd3MKLQotY29kZSAgICAtIGZ1bmN0aW9uCi0wICAgICAgIC0gUmVhZCBCWVRFCi0xICAgICAgIC0gUmVhZCBXT1JECi0yICAgICAgIC0gUmVhZCBEV09SRAotMyAgICAgICAtIFdyaXRlIEJZVEUKLTQgICAgICAgLSBXcml0ZSBXT1JECi01ICAgICAgIC0gV3JpdGUgRFdPUkQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfQVNNQVBJIFBDSV9hY2Nlc3NSZWcoCi0gICAgaW50IGluZGV4LAotICAgIHVsb25nIHZhbHVlLAotICAgIGludCBmdW5jLAotICAgIFBDSURldmljZUluZm8gKmluZm8pCi17Ci0gICAgaW50IGlvYmFzZTsKLQotICAgIGlmIChpbmZvLT5tZWNoMSA9PSAyKSB7Ci0JLyogVXNlIFBDSSBCSU9TIGFjY2VzcyBzaW5jZSB3ZSBkb250IGhhdmUgZGlyZWN0IGhhcmR3YXJlIGFjY2VzcyAqLwotCXN3aXRjaCAoZnVuYykgewotCSAgICBjYXNlIFBDSV9SRUFEX0JZVEU6Ci0JCXJldHVybiAodWNoYXIpX1BDSUJJT1Nfc2VydmljZShSRUFEX0NPTkZJR19CWVRFLGluZm8tPnNsb3QuaSA+PiA4LGluZGV4LDAsUENJRW50cnkpOwotCSAgICBjYXNlIFBDSV9SRUFEX1dPUkQ6Ci0JCXJldHVybiAodXNob3J0KV9QQ0lCSU9TX3NlcnZpY2UoUkVBRF9DT05GSUdfV09SRCxpbmZvLT5zbG90LmkgPj4gOCxpbmRleCwwLFBDSUVudHJ5KTsKLQkgICAgY2FzZSBQQ0lfUkVBRF9EV09SRDoKLQkJcmV0dXJuICh1bG9uZylfUENJQklPU19zZXJ2aWNlKFJFQURfQ09ORklHX0RXT1JELGluZm8tPnNsb3QuaSA+PiA4LGluZGV4LDAsUENJRW50cnkpOwotCSAgICBjYXNlIFBDSV9XUklURV9CWVRFOgotCQlfUENJQklPU19zZXJ2aWNlKFdSSVRFX0NPTkZJR19CWVRFLGluZm8tPnNsb3QuaSA+PiA4LGluZGV4LHZhbHVlLFBDSUVudHJ5KTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgUENJX1dSSVRFX1dPUkQ6Ci0JCV9QQ0lCSU9TX3NlcnZpY2UoV1JJVEVfQ09ORklHX1dPUkQsaW5mby0+c2xvdC5pID4+IDgsaW5kZXgsdmFsdWUsUENJRW50cnkpOwotCQlicmVhazsKLQkgICAgY2FzZSBQQ0lfV1JJVEVfRFdPUkQ6Ci0JCV9QQ0lCSU9TX3NlcnZpY2UoV1JJVEVfQ09ORklHX0RXT1JELGluZm8tPnNsb3QuaSA+PiA4LGluZGV4LHZhbHVlLFBDSUVudHJ5KTsKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgZWxzZSB7Ci0JLyogVXNlIGRpcmVjdCBoYXJkd2FyZSBhY2Nlc3MgbWVjaGFuaXNtcyAqLwotCWlmIChpbmZvLT5tZWNoMSkgewotCSAgICAvKiBQQ0kgYWNjZXNzIG1lY2hhbmlzbSAxICovCi0JICAgIGlvYmFzZSA9IDB4Q0ZDICsgKGluZGV4ICYgMyk7Ci0JICAgIGluZm8tPnNsb3QucC5SZWdpc3RlciA9IGluZGV4ID4+IDI7Ci0JICAgIFBNX291dHBkKDB4Q0Y4LGluZm8tPnNsb3QuaSk7Ci0JICAgIH0KLQllbHNlIHsKLQkgICAgLyogUENJIGFjY2VzcyBtZWNoYW5pc20gMiAqLwotCSAgICBQTV9vdXRwYigweENGOCwodWNoYXIpKChpbmZvLT5zbG90LnAuRnVuY3Rpb24gPDwgMSkgfCAweDEwKSk7Ci0JICAgIFBNX291dHBiKDB4Q0ZBLCh1Y2hhcilpbmZvLT5zbG90LnAuQnVzKTsKLQkgICAgaW9iYXNlID0gMHhDMDAwICsgKGluZm8tPnNsb3QucC5EZXZpY2UgPDwgOCkgKyBpbmRleDsKLQkgICAgfQotCXN3aXRjaCAoZnVuYykgewotCSAgICBjYXNlIFBDSV9SRUFEX0JZVEU6Ci0JICAgIGNhc2UgUENJX1JFQURfV09SRDoKLQkgICAgY2FzZSBQQ0lfUkVBRF9EV09SRDogICAgdmFsdWUgPSBQTV9pbnBkKGlvYmFzZSk7ICAgICAgICBicmVhazsKLQkgICAgY2FzZSBQQ0lfV1JJVEVfQllURTogICAgUE1fb3V0cGIoaW9iYXNlLCh1Y2hhcil2YWx1ZSk7ICBicmVhazsKLQkgICAgY2FzZSBQQ0lfV1JJVEVfV09SRDogICAgUE1fb3V0cHcoaW9iYXNlLCh1c2hvcnQpdmFsdWUpOyBicmVhazsKLQkgICAgY2FzZSBQQ0lfV1JJVEVfRFdPUkQ6ICAgUE1fb3V0cGQoaW9iYXNlLCh1bG9uZyl2YWx1ZSk7ICBicmVhazsKLQkgICAgfQotCVBNX291dHBkKDB4Q0Y4LDApOwotCX0KLSAgICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotbnVtRGV2aWNlcyAgLSBOdW1iZXIgb2YgZGV2aWNlcyB0byBxdWVyeSBpbmZvIGZvcgotCi1SRVRVUk5TOgotMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciwgbnVtYmVyIG9mIGRldmljZXMgdG8gZW51bWVyYXRlIGlmIG51bURldmljZXMgPSAwCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBQQ0kgcm91dGluZyBpbmZvcm1hdGlvbi4gSWYgeW91IHBhc3MgYSB2YWx1ZSBvZgotMCBmb3IgbnVtRGV2aWNlcywgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB3aXRoIHRoZSBudW1iZXIgb2YgZGV2aWNlcwotbmVlZGVkIGluIHRoZSByb3V0aW5nIGJ1ZmZlciB0aGF0IHdpbGwgYmUgZmlsbGVkIGluIGJ5IHRoZSBCSU9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIF9BU01BUEkgUENJX2dldElSUVJvdXRpbmdPcHRpb25zKAotICAgIGludCBudW1EZXZpY2VzLAotICAgIFBDSVJvdXRlSW5mbyAqYnVmZmVyKQotewotICAgIFBDSVJvdXRpbmdPcHRpb25zQnVmZmVyIGJ1ZjsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICByZXQ7Ci0KLSAgICBpZiAoUENJUGh5c0VudHJ5KSB7Ci0JYnVmLkJ1ZmZlclNpemUgPSBudW1EZXZpY2VzICogc2l6ZW9mKFBDSVJvdXRlSW5mbyk7Ci0JYnVmLkRhdGFCdWZmZXIgPSBidWZmZXI7Ci0JaWYgKChyZXQgPSBfUENJQklPU19nZXRSb3V0aW5nKCZidWYsUENJRW50cnkpKSA9PSAweDg5KQotCSAgICByZXR1cm4gYnVmLkJ1ZmZlclNpemUgLyBzaXplb2YoUENJUm91dGVJbmZvKTsKLQlpZiAocmV0ICE9IDApCi0JICAgIHJldHVybiAtMTsKLQlyZXR1cm4gMDsKLQl9Ci0KLSAgICAvKiBXZSBjdXJyZW50bHkgb25seSBzdXBwb3J0IHRoaXMgdmlhIHRoZSBQQ0kgQklPUyBmdW5jdGlvbnMgKi8KLSAgICByZXR1cm4gLTE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotaW5mbyAgICAtIFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgZGV2aWNlCi1pbnRQaW4gIC0gVmFsdWUgdG8gc3RvcmUgaW4gdGhlIFBDSSBJbnRlcnJ1cHRQaW4gcmVnaXN0ZXIKLUlSUSAgICAgLSBOZXcgSVNBIElSUSB0byBtYXAgdGhlIFBDSSBpbnRlcnJ1cHQgdG8gKDAtMTUpCi0KLVJFVFVSTlM6Ci1UcnVlIG9uIHN1Y2Nlc3MsIG9yIGZhbHNlIGlmIHRoaXMgZnVuY3Rpb24gZmFpbGVkLgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHRoZSBQQ0kgSVJRIHJvdXRpbmcgZm9yIHRoZSBzcGVjaWZpZWQgZGV2aWNlIHRvIHRoZQotZGVzaXJlZCBQQ0kgaW50ZXJydXB0IGFuZCB0aGUgZGVzaXJlZCBJU0EgYnVzIGNvbXBhdGlibGUgSVJRLiBUaGlzIGZ1bmN0aW9uCi1tYXkgbm90IGJlIHN1cHBvcnRlZCBieSB0aGUgUENJIEJJT1MsIGluIHdoaWNoIGNhc2UgdGhpcyBmdW5jdGlvbiB3aWxsCi1mYWlsLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIF9BU01BUEkgUENJX3NldEhhcmR3YXJlSVJRKAotICAgIFBDSURldmljZUluZm8gKmluZm8sCi0gICAgdWludCBpbnRQaW4sCi0gICAgdWludCBJUlEpCi17Ci0gICAgaWYgKFBDSVBoeXNFbnRyeSkgewotCWlmIChfUENJQklPU19zZXRJUlEoaW5mby0+c2xvdC5pID4+IDgsaW50UGluLElSUSxQQ0lFbnRyeSkpIHsKLQkgICAgaW5mby0+dS50eXBlMC5JbnRlcnJ1cHRQaW4gPSBpbnRQaW47Ci0JICAgIGluZm8tPnUudHlwZTAuSW50ZXJydXB0TGluZSA9IElSUTsKLQkgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgLyogV2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCB0aGlzIHZpYSB0aGUgUENJIEJJT1MgZnVuY3Rpb25zICovCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWJ1cyAgICAgICAgICAgICAgICAgLSBCdXMgbnVtYmVyIHRvIGdlbmVyYXRlIHRoZSBzcGVjaWFsIGN5Y2xlIGZvcgotc3BlY2lhbEN5Y2xlRGF0YSAgICAtIERhdGEgdG8gc2VuZCBmb3IgdGhlIHNwZWNpYWwgY3lsZQotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgYSBzcGVjaWFsIGN5Y2xlIG9uIHRoZSBzcGVjaWZpZWQgYnVzIHVzaW5nIHdpdGgKLXRoZSBzcGVjaWZpZWQgZGF0YS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9BU01BUEkgUENJX2dlbmVyYXRlU3BlY2lhbEN5bGUoCi0gICAgdWludCBidXMsCi0gICAgdWxvbmcgc3BlY2lhbEN5Y2xlRGF0YSkKLXsKLSAgICBpZiAoUENJUGh5c0VudHJ5KQotCV9QQ0lCSU9TX3NwZWNpYWxDeWNsZShidXMsc3BlY2lhbEN5Y2xlRGF0YSxQQ0lFbnRyeSk7Ci0gICAgLyogV2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCB0aGlzIHZpYSB0aGUgUENJIEJJT1MgZnVuY3Rpb25zICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotaW5mbyAgICAtIFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gYmxvY2sgZm9yIGRldmljZSB0byBhY2Nlc3MKLWluZGV4ICAgLSBJbmRleCBvZiByZWdpc3RlciB0byBzdGFydCByZWFkaW5nIGZyb20KLWRzdCAgICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgdmFsdWVzIHJlYWQgZnJvbSBjb25maWd1cmF0aW9uIHNwYWNlCi1jb3VudCAgIC0gQ291bnQgb2YgYnl0ZXMgdG8gcmVhZCBmcm9tIGNvbmZpZ3VyYXRpb24gc3BhY2UKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWFkIGEgYmxvY2sgb2YgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgcmVnaXN0ZXJzCi1mcm9tIHRoZSBjb25maWd1cmF0aW9uIHNwYWNlIGludG8gdGhlIHBhc3NlZCBpbiBkYXRhIGJsb2NrLiBUaGlzIGZ1bmN0aW9uCi13aWxsIHByb3Blcmx5IGhhbmRsZSByZWFkaW5nIG5vbi1EV09SRCBhbGlnbmVkIGRhdGEgZnJvbSB0aGUgY29uZmlndXJhdGlvbgotc3BhY2UgY29ycmVjdGx5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0FTTUFQSSBQQ0lfcmVhZFJlZ0Jsb2NrKAotICAgIFBDSURldmljZUluZm8gKmluZm8sCi0gICAgaW50IGluZGV4LAotICAgIHZvaWQgKmRzdCwKLSAgICBpbnQgY291bnQpCi17Ci0gICAgdWNoYXIgICAqcGI7Ci0gICAgdWxvbmcgICAqcGQ7Ci0gICAgaW50ICAgICBpOwotICAgIGludCAgICAgc3RhcnRDb3VudCA9IChpbmRleCAmIDMpOwotICAgIGludCAgICAgbWlkZGxlQ291bnQgPSAoY291bnQgLSBzdGFydENvdW50KSA+PiAyOwotICAgIGludCAgICAgZW5kQ291bnQgPSBjb3VudCAtIG1pZGRsZUNvdW50ICogNCAtIHN0YXJ0Q291bnQ7Ci0KLSAgICBmb3IgKGkgPSAwLHBiID0gZHN0OyBpIDwgc3RhcnRDb3VudDsgaSsrLCBpbmRleCsrKSB7Ci0JKnBiKysgPSAodWNoYXIpUENJX2FjY2Vzc1JlZyhpbmRleCwwLFBDSV9SRUFEX0JZVEUsaW5mbyk7Ci0JfQotICAgIGZvciAoaSA9IDAscGQgPSAodWxvbmcqKXBiOyBpIDwgbWlkZGxlQ291bnQ7IGkrKywgaW5kZXggKz0gNCkgewotCSpwZCsrID0gKHVsb25nKVBDSV9hY2Nlc3NSZWcoaW5kZXgsMCxQQ0lfUkVBRF9EV09SRCxpbmZvKTsKLQl9Ci0gICAgZm9yIChpID0gMCxwYiA9ICh1Y2hhciopcGQ7IGkgPCBlbmRDb3VudDsgaSsrLCBpbmRleCsrKSB7Ci0JKnBiKysgPSAodWNoYXIpUENJX2FjY2Vzc1JlZyhpbmRleCwwLFBDSV9SRUFEX0JZVEUsaW5mbyk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWluZm8gICAgLSBQQ0kgZGV2aWNlIGluZm9ybWF0aW9uIGJsb2NrIGZvciBkZXZpY2UgdG8gYWNjZXNzCi1pbmRleCAgIC0gSW5kZXggb2YgcmVnaXN0ZXIgdG8gc3RhcnQgcmVhZGluZyBmcm9tCi1kc3QgICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIHZhbHVlcyByZWFkIGZyb20gY29uZmlndXJhdGlvbiBzcGFjZQotY291bnQgICAtIENvdW50IG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSBjb25maWd1cmF0aW9uIHNwYWNlCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gd3JpdGUgYSBibG9jayBvZiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSByZWdpc3RlcnMKLXRvIHRoZSBjb25maWd1cmF0aW9uIHNwYWNlIGZyb20gdGhlIHBhc3NlZCBpbiBkYXRhIGJsb2NrLiBUaGlzIGZ1bmN0aW9uCi13aWxsIHByb3Blcmx5IGhhbmRsZSB3cml0aW5nIG5vbi1EV09SRCBhbGlnbmVkIGRhdGEgdG8gdGhlIGNvbmZpZ3VyYXRpb24KLXNwYWNlIGNvcnJlY3RseS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9BU01BUEkgUENJX3dyaXRlUmVnQmxvY2soCi0gICAgUENJRGV2aWNlSW5mbyAqaW5mbywKLSAgICBpbnQgaW5kZXgsCi0gICAgdm9pZCAqc3JjLAotICAgIGludCBjb3VudCkKLXsKLSAgICB1Y2hhciAgICpwYjsKLSAgICB1bG9uZyAgICpwZDsKLSAgICBpbnQgICAgIGk7Ci0gICAgaW50ICAgICBzdGFydENvdW50ID0gKGluZGV4ICYgMyk7Ci0gICAgaW50ICAgICBtaWRkbGVDb3VudCA9IChjb3VudCAtIHN0YXJ0Q291bnQpID4+IDI7Ci0gICAgaW50ICAgICBlbmRDb3VudCA9IGNvdW50IC0gbWlkZGxlQ291bnQgKiA0IC0gc3RhcnRDb3VudDsKLQotICAgIGZvciAoaSA9IDAscGIgPSBzcmM7IGkgPCBzdGFydENvdW50OyBpKyssIGluZGV4KyspIHsKLQlQQ0lfYWNjZXNzUmVnKGluZGV4LCpwYisrLFBDSV9XUklURV9CWVRFLGluZm8pOwotCX0KLSAgICBmb3IgKGkgPSAwLHBkID0gKHVsb25nKilwYjsgaSA8IG1pZGRsZUNvdW50OyBpKyssIGluZGV4ICs9IDQpIHsKLQlQQ0lfYWNjZXNzUmVnKGluZGV4LCpwZCsrLFBDSV9XUklURV9EV09SRCxpbmZvKTsKLQl9Ci0gICAgZm9yIChpID0gMCxwYiA9ICh1Y2hhciopcGQ7IGkgPCBlbmRDb3VudDsgaSsrLCBpbmRleCsrKSB7Ci0JUENJX2FjY2Vzc1JlZyhpbmRleCwqcGIrKyxQQ0lfV1JJVEVfQllURSxpbmZvKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vdW5peGlvLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vdW5peGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYTY2YTcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vY29tbW9uL3VuaXhpby5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIE1vZHVsZSBjb250YWluaW5nIFVuaXggSS9PIGZ1bmN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxkaXJlbnQuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoge3NlY3JldH0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBESVIgICAgICpkOwotICAgIGNoYXIgICAgcGF0aFtQTV9NQVhfUEFUSF07Ci0gICAgY2hhciAgICBtYXNrW1BNX01BWF9QQVRIXTsKLSAgICB9IFBNX2ZpbmRIYW5kbGU7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW50ZXJuYWwgZnVuY3Rpb24gdG8gY29udmVydCB0aGUgZmluZCBkYXRhIHRvIHRoZSBnZW5lcmljIGludGVyZmFjZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBjb252ZXJ0RmluZERhdGEoCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhLAotICAgIHN0cnVjdCBkaXJlbnQgKmJsaywKLSAgICBjb25zdCBjaGFyICpwYXRoKQotewotICAgIHVsb25nICAgICAgIGR3U2l6ZSA9IGZpbmREYXRhLT5kd1NpemU7Ci0gICAgc3RydWN0IHN0YXQgc3Q7Ci0gICAgY2hhciAgICAgICAgZmlsZW5hbWVbUE1fTUFYX1BBVEhdOwotCi0gICAgbWVtc2V0KGZpbmREYXRhLDAsZmluZERhdGEtPmR3U2l6ZSk7Ci0gICAgZmluZERhdGEtPmR3U2l6ZSA9IGR3U2l6ZTsKLSAgICBzdHJjcHkoZmlsZW5hbWUscGF0aCk7Ci0gICAgUE1fYmFja3NsYXNoKGZpbGVuYW1lKTsKLSAgICBzdHJjYXQoZmlsZW5hbWUsYmxrLT5kX25hbWUpOwotICAgIHN0YXQoZmlsZW5hbWUsJnN0KTsKLSAgICBpZiAoIShzdC5zdF9tb2RlICYgU19JV1JJVEUpKQotCWZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9SRUFET05MWTsKLSAgICBpZiAoc3Quc3RfbW9kZSAmIFNfSUZESVIpCi0JZmluZERhdGEtPmF0dHJpYiB8PSBQTV9GSUxFX0RJUkVDVE9SWTsKLSAgICBmaW5kRGF0YS0+c2l6ZUxvID0gc3Quc3Rfc2l6ZTsKLSAgICBmaW5kRGF0YS0+c2l6ZUhpID0gMDsKLSAgICBzdHJuY3B5KGZpbmREYXRhLT5uYW1lLGJsay0+ZF9uYW1lLFBNX01BWF9QQVRIKTsKLSAgICBmaW5kRGF0YS0+bmFtZVtQTV9NQVhfUEFUSC0xXSA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGV0ZXJtaW5lcyBpZiBhIGZpbGUgbmFtZSBtYXRjaGVzIHRoZSBwYXNzZWQgaW4gcGF0dGVybi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaWJvb2wgZmlsZW1hdGNoKAotICAgIGNoYXIgKnBhdHRlcm4sCi0gICAgY2hhciAqZGlycGF0aCwKLSAgICBzdHJ1Y3QgZGlyZW50ICpkaXJlKQotewotICAgIHN0cnVjdCBzdGF0IHN0OwotICAgIGludCAgICAgICAgIGkgPSAwLGogPSAwLGxhc3RjaGFyID0gJ1wwJzsKLSAgICBjaGFyICAgICAgICBmdWxscGF0aFtQTV9NQVhfUEFUSF07Ci0KLSAgICBzdHJjcHkoZnVsbHBhdGgsZGlycGF0aCk7Ci0gICAgUE1fYmFja3NsYXNoKGZ1bGxwYXRoKTsKLSAgICBzdHJjYXQoZnVsbHBhdGgsIGRpcmUtPmRfbmFtZSk7Ci0gICAgaWYgKHN0YXQoZnVsbHBhdGgsICZzdCkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgZm9yICg7IGkgPCAoaW50KXN0cmxlbihkaXJlLT5kX25hbWUpICYmIGogPCAoaW50KXN0cmxlbihwYXR0ZXJuKTsgaSsrLCBqKyspIHsKLQlpZiAocGF0dGVybltqXSA9PSAnKicgJiYgbGFzdGNoYXIgIT0gJ1xcJykgewotCSAgICBpZiAocGF0dGVybltqKzFdID09ICdcMCcpCi0JCXJldHVybiB0cnVlOwotCSAgICB3aGlsZSAoZGlyZS0+ZF9uYW1lW2krK10gIT0gcGF0dGVybltqKzFdKSB7Ci0JCWlmIChkaXJlLT5kX25hbWVbaV0gPT0gJ1wwJykKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICBpIC09IDI7Ci0JICAgIH0KLQllbHNlIGlmIChkaXJlLT5kX25hbWVbaV0gIT0gcGF0dGVybltqXSAmJgotCQkhKHBhdHRlcm5bal0gPT0gJz8nICYmIGxhc3RjaGFyICE9ICdcXCcpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JbGFzdGNoYXIgPSBwYXR0ZXJuW2ldOwotCX0KLSAgICBpZiAoaiA9PSAoaW50KXN0cmxlbihwYXR0ZXJuKSAmJiBpID09IChpbnQpc3RybGVuKGRpcmUtPmRfbmFtZSkpCi0JcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGZpbmQgdGhlIGZpcnN0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2ZpbmRGaXJzdEZpbGUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhKQotewotICAgIFBNX2ZpbmRIYW5kbGUgICAqZDsKLSAgICBzdHJ1Y3QgZGlyZW50ICAgKmRpcmU7Ci0gICAgY2hhciAgICAgICAgICAgIG5hbWVbUE1fTUFYX1BBVEhdOwotICAgIGNoYXIgICAgICAgICAgICBleHRbUE1fTUFYX1BBVEhdOwotCi0gICAgaWYgKChkID0gUE1fbWFsbG9jKHNpemVvZigqZCkpKSA9PSBOVUxMKQotCXJldHVybiBQTV9GSUxFX0lOVkFMSUQ7Ci0gICAgUE1fc3BsaXRwYXRoKGZpbGVuYW1lLE5VTEwsZC0+cGF0aCxuYW1lLGV4dCk7Ci0gICAgc3RyY3B5KGQtPm1hc2ssbmFtZSk7Ci0gICAgc3RyY2F0KGQtPm1hc2ssZXh0KTsKLSAgICBpZiAoc3RybGVuKGQtPnBhdGgpID09IDApCi0Jc3RyY3B5KGQtPnBhdGgsICIuIik7Ci0gICAgaWYgKGQtPnBhdGhbc3RybGVuKGQtPnBhdGgpLTFdID09ICcvJykKLQlkLT5wYXRoW3N0cmxlbihkLT5wYXRoKS0xXSA9IDA7Ci0gICAgaWYgKChkLT5kID0gb3BlbmRpcihkLT5wYXRoKSkgIT0gTlVMTCkgewotCXdoaWxlICgoZGlyZSA9IHJlYWRkaXIoZC0+ZCkpICE9IE5VTEwpIHsKLQkgICAgaWYgKGZpbGVtYXRjaChkLT5tYXNrLGQtPnBhdGgsZGlyZSkpIHsKLQkJY29udmVydEZpbmREYXRhKGZpbmREYXRhLGRpcmUsZC0+cGF0aCk7Ci0JCXJldHVybiBkOwotCQl9Ci0JICAgIH0KLQljbG9zZWRpcihkLT5kKTsKLQl9Ci0gICAgUE1fZnJlZShkKTsKLSAgICByZXR1cm4gUE1fRklMRV9JTlZBTElEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGZpbmQgdGhlIG5leHQgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9maW5kTmV4dEZpbGUoCi0gICAgdm9pZCAqaGFuZGxlLAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKLXsKLSAgICBQTV9maW5kSGFuZGxlICAgKmQgPSBoYW5kbGU7Ci0gICAgc3RydWN0IGRpcmVudCAgICpkaXJlOwotCi0gICAgd2hpbGUgKChkaXJlID0gcmVhZGRpcihkLT5kKSkgIT0gTlVMTCkgewotCWlmIChmaWxlbWF0Y2goZC0+bWFzayxkLT5wYXRoLGRpcmUpKSB7Ci0JICAgIGNvbnZlcnRGaW5kRGF0YShmaW5kRGF0YSxkaXJlLGQtPnBhdGgpOwotCSAgICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gY2xvc2UgdGhlIGZpbmQgcHJvY2VzcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZmluZENsb3NlKAotICAgIHZvaWQgKmhhbmRsZSkKLXsKLSAgICBQTV9maW5kSGFuZGxlICAgKmQgPSBoYW5kbGU7Ci0KLSAgICBjbG9zZWRpcihkLT5kKTsKLSAgICBmcmVlKGQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIGRyaXZlIGlzIGEgdmFsaWQgZHJpdmUgb3Igbm90LiBVbmRlciBVbml4IHRoaXMKLWZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIGZvciBhbnl0aGluZyBleGNlcHQgYSB2YWx1ZSBvZiAzIChjb25zaWRlcmVkCi10aGUgcm9vdCBkcml2ZSwgYW5kIGVxdWl2YWxlbnQgdG8gQzogZm9yIG5vbi1Vbml4IHN5c3RlbXMpLiBUaGUgZHJpdmUKLW51bWJlcmluZyBpczoKLQotICAgIDEgICAtIERyaXZlIEE6Ci0gICAgMiAgIC0gRHJpdmUgQjoKLSAgICAzICAgLSBEcml2ZSBDOgotICAgIGV0YwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZHJpdmVWYWxpZCgKLSAgICBjaGFyIGRyaXZlKQotewotICAgIGlmIChkcml2ZSA9PSAzKQotCXJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSBzcGVjaWZpZmVkIGRyaXZlLgotVW5kZXIgVW5peCB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSByZWdhcmRsZXNzCi1vZiB3aGF0IHRoZSB2YWx1ZSBvZiAnZHJpdmUnIGlzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZ2V0ZGN3ZCgKLSAgICBpbnQgZHJpdmUsCi0gICAgY2hhciAqZGlyLAotICAgIGludCBsZW4pCi17Ci0gICAgKHZvaWQpZHJpdmU7Ci0gICAgZ2V0Y3dkKGRpcixsZW4pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNoYW5nZSB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRGaWxlQXR0cigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICB1aW50IGF0dHJpYikKLXsKLSAgICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgICBtb2RlX3QgICAgICBtb2RlOwotCi0gICAgc3RhdChmaWxlbmFtZSwmc3QpOwotICAgIG1vZGUgPSBzdC5zdF9tb2RlOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX1JFQURPTkxZKQotCW1vZGUgJj0gflNfSVdSSVRFOwotICAgIGVsc2UKLQltb2RlIHw9IFNfSVdSSVRFOwotICAgIGNobW9kKGZpbGVuYW1lLG1vZGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGdldCB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludCBQTUFQSSBQTV9nZXRGaWxlQXR0cigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICBzdHJ1Y3Qgc3RhdCBzdDsKLQotICAgIHN0YXQoZmlsZW5hbWUsJnN0KTsKLSAgICBpZiAoc3Quc3RfbW9kZSAmIFNfSVdSSVRFKQotCXJldHVybiAwOwotICAgIHJldHVybiBQTV9GSUxFX1JFQURPTkxZOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9ta2RpcigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICByZXR1cm4gbWtkaXIoZmlsZW5hbWUsMHgxRkYpID09IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gcmVtb3ZlIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX3JtZGlyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIHJldHVybiBybWRpcihmaWxlbmFtZSkgPT0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGZpbGUgdGltZSBhbmQgZGF0ZSBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2dldEZpbGVUaW1lKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIGlib29sIGdtVGltZSwKLSAgICBQTV90aW1lICp0aW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzISAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgICh2b2lkKWdtVGltZTsKLSAgICAodm9pZCl0aW1lOwotICAgIFBNX2ZhdGFsRXJyb3IoIlBNX2dldEZpbGVUaW1lIG5vdCBpbXBsZW1lbnRlZCB5ZXQhIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIHNldCB0aGUgZmlsZSB0aW1lIGFuZCBkYXRlIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fc2V0RmlsZVRpbWUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgaWJvb2wgZ21UaW1lLAotICAgIFBNX3RpbWUgKnRpbWUpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMhICovCi0gICAgKHZvaWQpZmlsZW5hbWU7Ci0gICAgKHZvaWQpZ21UaW1lOwotICAgICh2b2lkKXRpbWU7Ci0gICAgUE1fZmF0YWxFcnJvcigiUE1fc2V0RmlsZVRpbWUgbm90IGltcGxlbWVudGVkIHlldCEiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jb21tb24vdmdhc3RhdGUuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi92Z2FzdGF0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDU2ZTlhLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NvbW1vbi92Z2FzdGF0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICAgICAgICAgICAgICAgICBQb3J0aW9ucyBjb3B5cmlnaHQgKEMpIEpvc2ggVmFuZGVyaG9vZgotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIEZ1bmN0aW9ucyB0byBzYXZlIGFuZCByZXN0b3JlIHRoZSBWR0EgaGFyZHdhcmUgc3RhdGUuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpZiBkZWZpbmVkKF9fV0lOMzJfVlhEX18pIHx8IGRlZmluZWQoX19OVF9EUklWRVJfXykKLSNpbmNsdWRlICJzZGQvc2RkaGVscC5oIgotI2Vsc2UKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBWR0EgaW5kZXggcmVnaXN0ZXIgcG9ydHMgKi8KLSNkZWZpbmUgQ1JUX0kgICAweDNENCAgICAgICAvKiBDUlQgQ29udHJvbGxlciBJbmRleCAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEFUVF9JVyAgMHgzQzAgICAgICAgLyogQXR0cmlidXRlIENvbnRyb2xsZXIgSW5kZXggJiBEYXRhICAgICAgICAqLwotI2RlZmluZSBHUkFfSSAgIDB4M0NFICAgICAgIC8qIEdyYXBoaWNzIENvbnRyb2xsZXIgSW5kZXggICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0VRX0kgICAweDNDNCAgICAgICAvKiBTZXF1ZW5jZXIgSW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLS8qIFZHQSBkYXRhIHJlZ2lzdGVyIHBvcnRzICovCi0jZGVmaW5lIENSVF9EICAgMHgzRDUgICAgICAgLyogQ1JUIENvbnRyb2xsZXIgRGF0YSBSZWdpc3RlciAgICAgICAgICAgICAqLwotI2RlZmluZSBBVFRfUiAgIDB4M0MxICAgICAgIC8qIEF0dHJpYnV0ZSBDb250cm9sbGVyIERhdGEgUmVhZCBSZWdpc3RlciAgKi8KLSNkZWZpbmUgR1JBX0QgICAweDNDRiAgICAgICAvKiBHcmFwaGljcyBDb250cm9sbGVyIERhdGEgUmVnaXN0ZXIgICAgICAgICovCi0jZGVmaW5lIFNFUV9EICAgMHgzQzUgICAgICAgLyogU2VxdWVuY2VyIERhdGEgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBNSVNfUiAgIDB4M0NDICAgICAgIC8qIE1pc2MgT3V0cHV0IFJlYWQgUmVnaXN0ZXIgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTUlTX1cgICAweDNDMiAgICAgICAvKiBNaXNjIE91dHB1dCBXcml0ZSBSZWdpc3RlciAgICAgICAgICAgICAgICovCi0jZGVmaW5lIElTMV9SICAgMHgzREEgICAgICAgLyogSW5wdXQgU3RhdHVzIFJlZ2lzdGVyIDEgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBQRUxfSVcgIDB4M0M4ICAgICAgIC8qIFBFTCBXcml0ZSBJbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgUEVMX0lSICAweDNDNyAgICAgICAvKiBQRUwgUmVhZCBJbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFBFTF9EICAgMHgzQzkgICAgICAgLyogUEVMIERhdGEgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0vKiBzdGFuZGFyZCBWR0EgaW5kZXhlcyBtYXggY291bnRzICovCi0jZGVmaW5lIENSVF9DICAgMjQgICAgICAgICAgLyogMjQgIENSVCBDb250cm9sbGVyIFJlZ2lzdGVycyAgICAgICAgICAgICAqLwotI2RlZmluZSBBVFRfQyAgIDIxICAgICAgICAgIC8qIDIxICBBdHRyaWJ1dGUgQ29udHJvbGxlciBSZWdpc3RlcnMgICAgICAgKi8KLSNkZWZpbmUgR1JBX0MgICA5ICAgICAgICAgICAvKiA5ICAgR3JhcGhpY3MgQ29udHJvbGxlciBSZWdpc3RlcnMgICAgICAgICovCi0jZGVmaW5lIFNFUV9DICAgNSAgICAgICAgICAgLyogNSAgIFNlcXVlbmNlciBSZWdpc3RlcnMgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBNSVNfQyAgIDEgICAgICAgICAgIC8qIDEgICBNaXNjIE91dHB1dCBSZWdpc3RlciAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgUEFMX0MgICA3NjggICAgICAgICAvKiA3NjggUGFsZXR0ZSBSZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZPTlRfQyAgODE5MiAgICAgICAgLyogVG90YWwgc2l6ZSBvZiBjaGFyYWN0ZXIgZ2VuZXJhdG9yIFJBTSAgICAqLwotCi0vKiBWR0EgcmVnaXN0ZXJzIHNhdmluZyBpbmRleGVzICovCi0jZGVmaW5lIENSVCAgICAgMCAgICAgICAgICAgLyogQ1JUIENvbnRyb2xsZXIgUmVnaXN0ZXJzIHN0YXJ0ICAgICAgICAgICAqLwotI2RlZmluZSBBVFQgICAgIChDUlQrQ1JUX0MpIC8qIEF0dHJpYnV0ZSBDb250cm9sbGVyIFJlZ2lzdGVycyBzdGFydCAgICAgKi8KLSNkZWZpbmUgR1JBICAgICAoQVRUK0FUVF9DKSAvKiBHcmFwaGljcyBDb250cm9sbGVyIFJlZ2lzdGVycyBzdGFydCAgICAgICovCi0jZGVmaW5lIFNFUSAgICAgKEdSQStHUkFfQykgLyogU2VxdWVuY2VyIFJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBNSVMgICAgIChTRVErU0VRX0MpIC8qIEdlbmVyYWwgUmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgUEFMICAgICAoTUlTK01JU19DKSAvKiBWR0EgUGFsZXR0ZSBSZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZPTlQgICAgKFBBTCtQQUxfQykgLyogVkdBIGZvbnQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0vKiBNYWNyb3MgZm9yIHBvcnQgSS9PIHdpdGggYXJndW1lbnRzIHJldmVyc2VkICovCi0KLSNkZWZpbmUgX3BvcnRfb3V0KHYscCkgIFBNX291dHBiKHAsKHVjaGFyKSh2KSkKLSNkZWZpbmUgX3BvcnRfaW4ocCkgICAgIFBNX2lucGIocCkKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBWR0Egc3RhdGUgYnVmZmVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9nZXRWR0FTdGF0ZVNpemUodm9pZCkKLXsKLSAgICByZXR1cm4gQ1JUX0MgKyBBVFRfQyArIEdSQV9DICsgU0VRX0MgKyBNSVNfQyArIFBBTF9DICsgRk9OVF9DOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURlbGF5IGZvciBhIHNob3J0IHBlcmlvZCBvZiB0aW1lLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHZnYV9kZWxheSh2b2lkKQotewotICAgIGludCBpOwotCi0gICAgLyogRm9yIHRoZSBsb29wIGhlcmUgd2UgcHJvZ3JhbSB0aGUgUE9TVCByZWdpc3Rlci4gVGhlIGxlbmd0aCBvZiB0aGlzCi0gICAgICogZGVsYXkgaXMgZGVwZW5kYW50IG9ubHkgb24gSVNBIGJ1cyBzcGVlZCwgYnV0IGl0IGlzIGVub3VnaCBmb3IKLSAgICAgKiB3aGF0IHdlIG5lZWQuCi0gICAgICovCi0gICAgZm9yIChpID0gMDsgaSA8PSAxMDsgaSsrKQotCVBNX291dHBiKDB4ODAsIDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXBvcnQgICAgLSBJL08gcG9ydCB0byByZWFkIHZhbHVlIGZyb20KLWluZGV4ICAgLSBQb3J0IGluZGV4IHRvIHJlYWQKLQotUkVUVVJOUzoKLUJ5dGUgcmVhZCBmcm9tICdwb3J0JyByZWdpc3RlciAnaW5kZXgnLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1c2hvcnQgdmdhX3JkaW54KAotICAgIHVzaG9ydCBwb3J0LAotICAgIHVzaG9ydCBpbmRleCkKLXsKLSAgICBQTV9vdXRwYihwb3J0LCh1Y2hhcilpbmRleCk7Ci0gICAgcmV0dXJuIFBNX2lucGIocG9ydCsxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1wb3J0ICAgIC0gSS9PIHBvcnQgdG8gd3JpdGUgdG8KLWluZGV4ICAgLSBQb3J0IGluZGV4IHRvIHdyaXRlCi12YWx1ZSAgIC0gQnl0ZSB0byB3cml0ZSB0byBwb3J0Ci0KLVJFTUFSS1M6Ci1Xcml0ZXMgYSBieXRlIHZhbHVlIHRvIHRoZSAncG9ydCcgcmVnaXN0ZXIgJ2luZGV4Jy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCB2Z2Ffd3JpbngoCi0gICAgdXNob3J0IHBvcnQsCi0gICAgdXNob3J0IGluZGV4LAotICAgIHVzaG9ydCB2YWx1ZSkKLXsKLSAgICBQTV9vdXRwYihwb3J0LCh1Y2hhcilpbmRleCk7Ci0gICAgUE1fb3V0cGIocG9ydCsxLCh1Y2hhcil2YWx1ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2F2ZSB0aGUgY29sb3IgcGFsZXR0ZSB2YWx1ZXMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCB2Z2Ffc2F2ZXBhbGV0dGUoCi0gICAgdWNoYXIgKnBhbCkKLXsKLSAgICBpbnQgaTsKLQotICAgIF9wb3J0X291dCgwLCBQRUxfSVIpOwotICAgIGZvciAoaSA9IDA7IGkgPCA3Njg7IGkrKykgewotCXZnYV9kZWxheSgpOwotCSpwYWwrKyA9IF9wb3J0X2luKFBFTF9EKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVzdG9yZSB0aGUgY29sb3IgcGFsZXR0ZSB2YWx1ZXMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCB2Z2FfcmVzdG9yZXBhbGV0dGUoCi0gICAgY29uc3QgdWNoYXIgKnBhbCkKLXsKLSAgICBpbnQgaTsKLQotICAgIC8qIHJlc3RvcmUgc2F2ZWQgcGFsZXR0ZSAqLwotICAgIF9wb3J0X291dCgwLCBQRUxfSVcpOwotICAgIGZvciAoaSA9IDA7IGkgPCA3Njg7IGkrKykgewotCXZnYV9kZWxheSgpOwotCV9wb3J0X291dCgqcGFsKyssIFBFTF9EKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCB0aGUgZm9udCBkYXRhIGZyb20gdGhlIFZHQSBjaGFyYWN0ZXIgZ2VuZXJhdG9yIFJBTQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHZnYV9zYXZlRm9udCgKLSAgICB1Y2hhciAqZGF0YSkKLXsKLSAgICB1Y2hhciAgICpBMDAwMFB0ciA9IFBNX2dldEEwMDAwUG9pbnRlcigpOwotICAgIHVjaGFyICAgc2F2ZVs3XTsKLQotICAgIC8qIEVuYWJsZSBhY2Nlc3MgdG8gY2hhcmFjdGVyIGdlbmVyYXRvciBSQU0gKi8KLSAgICBzYXZlWzBdID0gKHVjaGFyKXZnYV9yZGlueChTRVFfSSwweDAwKTsKLSAgICBzYXZlWzFdID0gKHVjaGFyKXZnYV9yZGlueChTRVFfSSwweDAyKTsKLSAgICBzYXZlWzJdID0gKHVjaGFyKXZnYV9yZGlueChTRVFfSSwweDA0KTsKLSAgICBzYXZlWzNdID0gKHVjaGFyKXZnYV9yZGlueChTRVFfSSwweDAwKTsKLSAgICBzYXZlWzRdID0gKHVjaGFyKXZnYV9yZGlueChHUkFfSSwweDA0KTsKLSAgICBzYXZlWzVdID0gKHVjaGFyKXZnYV9yZGlueChHUkFfSSwweDA1KTsKLSAgICBzYXZlWzZdID0gKHVjaGFyKXZnYV9yZGlueChHUkFfSSwweDA2KTsKLSAgICB2Z2Ffd3JpbngoU0VRX0ksMHgwMCwweDAxKTsKLSAgICB2Z2Ffd3JpbngoU0VRX0ksMHgwMiwweDA0KTsKLSAgICB2Z2Ffd3JpbngoU0VRX0ksMHgwNCwweDA3KTsKLSAgICB2Z2Ffd3JpbngoU0VRX0ksMHgwMCwweDAzKTsKLSAgICB2Z2Ffd3JpbngoR1JBX0ksMHgwNCwweDAyKTsKLSAgICB2Z2Ffd3JpbngoR1JBX0ksMHgwNSwweDAwKTsKLSAgICB2Z2Ffd3JpbngoR1JBX0ksMHgwNiwweDAwKTsKLQotICAgIC8qIENvcHkgY2hhcmFjdGVyIGdlbmVyYXRvciBSQU0gKi8KLSAgICBtZW1jcHkoZGF0YSxBMDAwMFB0cixGT05UX0MpOwotCi0gICAgLyogUmVzdG9yZSBWR0Egc3RhdGUgKi8KLSAgICB2Z2Ffd3JpbngoU0VRX0ksMHgwMCxzYXZlWzBdKTsKLSAgICB2Z2Ffd3JpbngoU0VRX0ksMHgwMixzYXZlWzFdKTsKLSAgICB2Z2Ffd3JpbngoU0VRX0ksMHgwNCxzYXZlWzJdKTsKLSAgICB2Z2Ffd3JpbngoU0VRX0ksMHgwMCxzYXZlWzNdKTsKLSAgICB2Z2Ffd3JpbngoR1JBX0ksMHgwNCxzYXZlWzRdKTsKLSAgICB2Z2Ffd3JpbngoR1JBX0ksMHgwNSxzYXZlWzVdKTsKLSAgICB2Z2Ffd3JpbngoR1JBX0ksMHgwNixzYXZlWzZdKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Eb3dubG9hZHMgdGhlIGZvbnQgZGF0YSB0byB0aGUgVkdBIGNoYXJhY3RlciBnZW5lcmF0b3IgUkFNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgdmdhX3Jlc3RvcmVGb250KAotICAgIGNvbnN0IHVjaGFyICpkYXRhKQotewotICAgIHVjaGFyICAgKkEwMDAwUHRyID0gUE1fZ2V0QTAwMDBQb2ludGVyKCk7Ci0KLSAgICAvKiBFbmFibGUgYWNjZXNzIHRvIGNoYXJhY3RlciBnZW5lcmF0b3IgUkFNICovCi0gICAgdmdhX3dyaW54KFNFUV9JLDB4MDAsMHgwMSk7Ci0gICAgdmdhX3dyaW54KFNFUV9JLDB4MDIsMHgwNCk7Ci0gICAgdmdhX3dyaW54KFNFUV9JLDB4MDQsMHgwNyk7Ci0gICAgdmdhX3dyaW54KFNFUV9JLDB4MDAsMHgwMyk7Ci0gICAgdmdhX3dyaW54KEdSQV9JLDB4MDQsMHgwMik7Ci0gICAgdmdhX3dyaW54KEdSQV9JLDB4MDUsMHgwMCk7Ci0gICAgdmdhX3dyaW54KEdSQV9JLDB4MDYsMHgwMCk7Ci0KLSAgICAvKiBDb3B5IGZvbnQgYmFjayB0byBjaGFyYWN0ZXIgZ2VuZXJhdG9yIFJBTSAqLwotICAgIG1lbWNweShBMDAwMFB0cixkYXRhLEZPTlRfQyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2F2ZSB0aGUgc3RhdGUgb2YgYWxsIFZHQSBjb21wYXRpYmxlIHJlZ2lzdGVycwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2F2ZVZHQVN0YXRlKAotICAgIHZvaWQgKnN0YXRlQnVmKQotewotICAgIHVjaGFyICAgKnJlZ3MgPSBzdGF0ZUJ1ZjsKLSAgICBpbnQgICAgIGk7Ci0KLSAgICAvKiBTYXZlIHN0YXRlIG9mIFZHQSByZWdpc3RlcnMgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgQ1JUX0M7IGkrKykgewotCV9wb3J0X291dChpLCBDUlRfSSk7Ci0JcmVnc1tDUlQgKyBpXSA9IF9wb3J0X2luKENSVF9EKTsKLQl9Ci0gICAgZm9yIChpID0gMDsgaSA8IEFUVF9DOyBpKyspIHsKLQlfcG9ydF9pbihJUzFfUik7Ci0JdmdhX2RlbGF5KCk7Ci0JX3BvcnRfb3V0KGksIEFUVF9JVyk7Ci0JdmdhX2RlbGF5KCk7Ci0JcmVnc1tBVFQgKyBpXSA9IF9wb3J0X2luKEFUVF9SKTsKLQl2Z2FfZGVsYXkoKTsKLQl9Ci0gICAgZm9yIChpID0gMDsgaSA8IEdSQV9DOyBpKyspIHsKLQlfcG9ydF9vdXQoaSwgR1JBX0kpOwotCXJlZ3NbR1JBICsgaV0gPSBfcG9ydF9pbihHUkFfRCk7Ci0JfQotICAgIGZvciAoaSA9IDA7IGkgPCBTRVFfQzsgaSsrKSB7Ci0JX3BvcnRfb3V0KGksIFNFUV9JKTsKLQlyZWdzW1NFUSArIGldID0gX3BvcnRfaW4oU0VRX0QpOwotCX0KLSAgICByZWdzW01JU10gPSBfcG9ydF9pbihNSVNfUik7Ci0KLSAgICAvKiBTYXZlIHRoZSBWR0EgcGFsZXR0ZSB2YWx1ZXMgKi8KLSAgICB2Z2Ffc2F2ZXBhbGV0dGUoJnJlZ3NbUEFMXSk7Ci0KLSAgICAvKiBTYXZlIHRoZSBWR0EgY2hhcmFjdGVyIGdlbmVyYXRvciBSQU0gKi8KLSAgICB2Z2Ffc2F2ZUZvbnQoJnJlZ3NbRk9OVF0pOwotCi0gICAgLyogVHVybiB0aGUgVkdBIGRpc3BsYXkgYmFjayBvbiAqLwotICAgIFBNX3ZnYVVuYmxhbmtEaXNwbGF5KCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0b3JlIHRoZSBzdGF0ZSBvZiBhbGwgVkdBIGNvbXBhdGlibGUgcmVnaXN0ZXJzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9yZXN0b3JlVkdBU3RhdGUoCi0gICAgY29uc3Qgdm9pZCAqc3RhdGVCdWYpCi17Ci0gICAgY29uc3QgdWNoYXIgKnJlZ3MgPSBzdGF0ZUJ1ZjsKLSAgICBpbnQgICAgICAgICBpOwotCi0gICAgLyogQmxhbmsgdGhlIGRpc3BsYXkgYmVmb3JlIHdlIHN0YXJ0IHRoZSByZXN0b3JlICovCi0gICAgUE1fdmdhQmxhbmtEaXNwbGF5KCk7Ci0KLSAgICAvKiBSZXN0b3JlIHRoZSBWR0EgY2hhcmFjdGVyIGdlbmVyYXRvciBSQU0gKi8KLSAgICB2Z2FfcmVzdG9yZUZvbnQoJnJlZ3NbRk9OVF0pOwotCi0gICAgLyogUmVzdG9yZSB0aGUgVkdBIHBhbGV0dGUgdmFsdWVzICovCi0gICAgdmdhX3Jlc3RvcmVwYWxldHRlKCZyZWdzW1BBTF0pOwotCi0gICAgLyogUmVzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIFZHQSBjb21wYXRpYmxlIHJlZ2lzdGVycyAqLwotICAgIF9wb3J0X291dChyZWdzW01JU10sIE1JU19XKTsKLQotICAgIC8qIERlbGF5IHRvIGFsbG93IGNsb2NrIGNoYW5nZSB0byBzZXR0bGUgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKLQl2Z2FfZGVsYXkoKTsKLQotICAgIC8qIFN5bmNocm9ub3VzIHJlc2V0IG9uICovCi0gICAgX3BvcnRfb3V0KDB4MDAsU0VRX0kpOwotICAgIF9wb3J0X291dCgweDAxLFNFUV9EKTsKLQotICAgIC8qIFdyaXRlIHNlcWV1ZW5jZXIgcmVnaXN0ZXJzICovCi0gICAgX3BvcnRfb3V0KDEsIFNFUV9JKTsKLSAgICBfcG9ydF9vdXQocmVnc1tTRVEgKyAxXSB8IDB4MjAsIFNFUV9EKTsKLSAgICBmb3IgKGkgPSAyOyBpIDwgU0VRX0M7IGkrKykgewotCV9wb3J0X291dChpLCBTRVFfSSk7Ci0JX3BvcnRfb3V0KHJlZ3NbU0VRICsgaV0sIFNFUV9EKTsKLQl9Ci0KLSAgICAvKiBTeW5jaHJvbm91cyByZXNldCBvZmYgKi8KLSAgICBfcG9ydF9vdXQoMHgwMCxTRVFfSSk7Ci0gICAgX3BvcnRfb3V0KDB4MDMsU0VRX0QpOwotCi0gICAgLyogRGVwcm90ZWN0IENSVCByZWdpc3RlcnMgMC03IGFuZCB3cml0ZSBDUlRDICovCi0gICAgX3BvcnRfb3V0KDB4MTEsIENSVF9JKTsKLSAgICBfcG9ydF9vdXQoX3BvcnRfaW4oQ1JUX0QpICYgMHg3RiwgQ1JUX0QpOwotICAgIGZvciAoaSA9IDA7IGkgPCBDUlRfQzsgaSsrKSB7Ci0JX3BvcnRfb3V0KGksIENSVF9JKTsKLQlfcG9ydF9vdXQocmVnc1tDUlQgKyBpXSwgQ1JUX0QpOwotCX0KLSAgICBmb3IgKGkgPSAwOyBpIDwgR1JBX0M7IGkrKykgewotCV9wb3J0X291dChpLCBHUkFfSSk7Ci0JX3BvcnRfb3V0KHJlZ3NbR1JBICsgaV0sIEdSQV9EKTsKLQl9Ci0gICAgZm9yIChpID0gMDsgaSA8IEFUVF9DOyBpKyspIHsKLQlfcG9ydF9pbihJUzFfUik7ICAgICAgICAvKiByZXNldCBmbGlwLWZsb3AgKi8KLQl2Z2FfZGVsYXkoKTsKLQlfcG9ydF9vdXQoaSwgQVRUX0lXKTsKLQl2Z2FfZGVsYXkoKTsKLQlfcG9ydF9vdXQocmVnc1tBVFQgKyBpXSwgQVRUX0lXKTsKLQl2Z2FfZGVsYXkoKTsKLQl9Ci0KLSAgICAvKiBFbnN1cmUgdGhlIFZHQSBzY3JlZW4gaXMgdHVybmVkIG9uICovCi0gICAgUE1fdmdhVW5ibGFua0Rpc3BsYXkoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EaXNhYmxlcyB0aGUgVkdBIGRpc3BsYXkgZm9yIHNjcmVlbiBvdXRwdXQgbWFraW5nIGl0IGJsYW5rLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fdmdhQmxhbmtEaXNwbGF5KHZvaWQpCi17Ci0gICAgLyogVHVybiBzY3JlZW4gb2ZmICovCi0gICAgX3BvcnRfb3V0KDB4MDEsIFNFUV9JKTsKLSAgICBfcG9ydF9vdXQoX3BvcnRfaW4oU0VRX0QpIHwgMHgyMCwgU0VRX0QpOwotCi0gICAgLyogRGlzYWJsZSB2aWRlbyBvdXRwdXQgKi8KLSAgICBfcG9ydF9pbihJUzFfUik7Ci0gICAgdmdhX2RlbGF5KCk7Ci0gICAgIF9wb3J0X291dCgweDAwLCBBVFRfSVcpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUVuYWJsZXMgdGhlIFZHQSBkaXNwbGF5IGZvciBzY3JlZW4gb3V0cHV0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fdmdhVW5ibGFua0Rpc3BsYXkodm9pZCkKLXsKLSAgICAvKiBUdXJuIHNjcmVlbiBiYWNrIG9uICovCi0gICAgX3BvcnRfb3V0KDB4MDEsIFNFUV9JKTsKLSAgICBfcG9ydF9vdXQoX3BvcnRfaW4oU0VRX0QpICYgMHhERiwgU0VRX0QpOwotCi0gICAgLyogRW5hYmxlIHZpZGVvIG91dHB1dCAqLwotICAgIF9wb3J0X2luKElTMV9SKTsKLSAgICB2Z2FfZGVsYXkoKTsKLSAgICBfcG9ydF9vdXQoMHgyMCwgQVRUX0lXKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NwdWluZm8uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2NwdWluZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM2MmU4MS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9jcHVpbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgTWFpbiBtb2R1bGUgdG8gaW1wbGVtZW50IHRoZSBaZW4gVGltZXIgc3VwcG9ydCBmdW5jdGlvbnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAienRpbWVyLmgiCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJvc2hkci5oIgotI2lmICFkZWZpbmVkKF9fV0lOMzJfVlhEX18pICYmICFkZWZpbmVkKF9fT1MyX1ZERF9fKSAmJiAhZGVmaW5lZChfX05UX0RSSVZFUl9fKQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogRXh0ZXJuYWwgSW50ZWwgYXNzZW1ibGVyIGZ1bmN0aW9ucyAqLwotI2lmZGVmICBfX0lOVEVMX18KLS8qIHtzZWNyZXR9ICovCi1pYm9vbCAgIF9BU01BUEkgX0NQVV9oYXZlQ1BVSUQodm9pZCk7Ci0vKiB7c2VjcmV0fSAqLwotaWJvb2wgICBfQVNNQVBJIF9DUFVfY2hlY2s4MDM4Nih2b2lkKTsKLS8qIHtzZWNyZXR9ICovCi1pYm9vbCAgIF9BU01BUEkgX0NQVV9jaGVjazgwNDg2KHZvaWQpOwotLyoge3NlY3JldH0gKi8KLXVpbnQgICAgX0FTTUFQSSBfQ1BVX2NoZWNrQ1BVSUQodm9pZCk7Ci0vKiB7c2VjcmV0fSAqLwotdWludCAgICBfQVNNQVBJIF9DUFVfZ2V0Q1BVSURNb2RlbCh2b2lkKTsKLS8qIHtzZWNyZXR9ICovCi11aW50ICAgIF9BU01BUEkgX0NQVV9nZXRDUFVJRFN0ZXBwaW5nKHZvaWQpOwotLyoge3NlY3JldH0gKi8KLXVpbnQgICAgX0FTTUFQSSBfQ1BVX2dldENQVUlERmVhdHVyZXModm9pZCk7Ci0vKiB7c2VjcmV0fSAqLwotdWludCAgICBfQVNNQVBJIF9DUFVfZ2V0Q2FjaGVTaXplKHZvaWQpOwotLyoge3NlY3JldH0gKi8KLXVpbnQgICAgX0FTTUFQSSBfQ1BVX2hhdmUzRE5vdyh2b2lkKTsKLS8qIHtzZWNyZXR9ICovCi1pYm9vbCAgIF9BU01BUEkgX0NQVV9jaGVja0Nsb25lKHZvaWQpOwotLyoge3NlY3JldH0gKi8KLXZvaWQgICAgX0FTTUFQSSBfQ1BVX3JlYWRUaW1lU3RhbXAoQ1BVX2xhcmdlSW50ZWdlciAqdGltZSk7Ci0vKiB7c2VjcmV0fSAqLwotdm9pZCAgICBfQVNNQVBJIF9DUFVfcnVuQlNGTG9vcCh1bG9uZyBpdGVyYXRpb25zKTsKLS8qIHtzZWNyZXR9ICovCi11bG9uZyAgIF9BU01BUEkgX0NQVV9tdWxEaXYodWxvbmcgYSx1bG9uZyBiLHVsb25nIGMpOwotLyoge3NlY3JldH0gKi8KLXZvaWQgWlRpbWVyUXVpY2tJbml0KHZvaWQpOwotI2RlZmluZSBDUFVfSGF2ZU1NWCAgICAgMHgwMDgwMDAwMAotI2RlZmluZSBDUFVfSGF2ZVJEVFNDICAgMHgwMDAwMDAxMAotI2RlZmluZSBDUFVfSGF2ZVNTRSAgICAgMHgwMjAwMDAwMAotI2VuZGlmCi0KLSNpZiAgICAgZGVmaW5lZChfX1NNWDMyX18pCi0jaW5jbHVkZSAic214L2NwdWluZm8uYyIKLSNlbGlmICAgZGVmaW5lZChfX1JUVEFSR0VUX18pCi0jaW5jbHVkZSAicnR0YXJnZXQvY3B1aW5mby5jIgotI2VsaWYgICBkZWZpbmVkKF9fUkVBTERPU19fKQotI2luY2x1ZGUgImRvcy9jcHVpbmZvLmMiCi0jZWxpZiAgIGRlZmluZWQoX19OVF9EUklWRVJfXykKLSNpbmNsdWRlICJudGRydi9jcHVpbmZvLmMiCi0jZWxpZiAgIGRlZmluZWQoX19XSU4zMl9WWERfXykKLSNpbmNsdWRlICJ2eGQvY3B1aW5mby5jIgotI2VsaWYgICBkZWZpbmVkKF9fV0lORE9XUzMyX18pCi0jaW5jbHVkZSAid2luMzIvY3B1aW5mby5jIgotI2VsaWYgICBkZWZpbmVkKF9fT1MyX1ZERF9fKQotI2luY2x1ZGUgInZkZC9jcHVpbmZvLmMiCi0jZWxpZiAgIGRlZmluZWQoX19PUzJfXykKLSNpbmNsdWRlICJvczIvY3B1aW5mby5jIgotI2VsaWYgICBkZWZpbmVkKF9fTElOVVhfXykKLSNpbmNsdWRlICJsaW51eC9jcHVpbmZvLmMiCi0jZWxpZiAgIGRlZmluZWQoX19RTlhfXykKLSNpbmNsdWRlICJxbngvY3B1aW5mby5jIgotI2VsaWYgICBkZWZpbmVkKF9fQkVPU19fKQotI2luY2x1ZGUgImJlb3MvY3B1aW5mby5jIgotI2Vsc2UKLSNlcnJvciAgQ1BVIGxpYnJhcnkgbm90IHBvcnRlZCB0byB0aGlzIHBsYXRmb3JtIHlldCEKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgaW50ZXJmYWNlIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgYW4gSS9PIHBvcnQgbG9jYXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVjaGFyIHJkaW54KAotICAgIGludCBwb3J0LAotICAgIGludCBpbmRleCkKLXsKLSAgICBQTV9vdXRwYihwb3J0LCh1Y2hhcilpbmRleCk7Ci0gICAgcmV0dXJuIFBNX2lucGIocG9ydCsxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Xcml0ZSBhbiBJL08gcG9ydCBsb2NhdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCB3cmlueCgKLSAgICB1c2hvcnQgcG9ydCwKLSAgICB1c2hvcnQgaW5kZXgsCi0gICAgdXNob3J0IHZhbHVlKQotewotICAgIFBNX291dHBiKHBvcnQsKHVjaGFyKWluZGV4KTsKLSAgICBQTV9vdXRwYihwb3J0KzEsKHVjaGFyKXZhbHVlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1FbmFibGVzIHRoZSBDeXJpeCBDUFVJRCBpbnN0cnVjdGlvbiB0byBwcm9wZXJseSBkZXRlY3QgTWVkaWFHWCBhbmQgNng4NgotcHJvY2Vzc29ycy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfQ1BVX2VuYWJsZUN5cml4Q1BVSUQodm9pZCkKLXsKLSAgICB1Y2hhciAgIGNjcjM7Ci0KLSAgICBQTV9pbml0KCk7Ci0gICAgY2NyMyA9IHJkaW54KDB4MjIsMHhDMyk7Ci0gICAgd3JpbngoMHgyMiwweEMzLCh1Y2hhcikoY2NyMyB8IDB4MTApKTsKLSAgICB3cmlueCgweDIyLDB4RTgsKHVjaGFyKShyZGlueCgweDIyLDB4RTgpIHwgMHg4MCkpOwotICAgIHdyaW54KDB4MjIsMHhDMyxjY3IzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotUmV0dXJucyB0aGUgdHlwZSBvZiBwcm9jZXNzb3IgaW4gdGhlIHN5c3RlbS4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUkVUVVJOUzoKLU51bWVyaWNhbCBpZGVudGlmaWVyIGZvciB0aGUgaW5zdGFsbGVkIHByb2Nlc3NvcgotCi1SRU1BUktTOgotUmV0dXJucyB0aGUgdHlwZSBvZiBwcm9jZXNzb3IgaW4gdGhlIHN5c3RlbS4gTm90ZSB0aGF0IGlmIHRoZSBDUFUgaXMgYW4KLXVua25vd24gUGVudGl1bSBmYW1pbHkgcHJvY2Vzc29yIHRoYXQgd2UgZG9uJ3QgaGF2ZSBhbiBlbnVtZXJhdGlvbiBmb3IsCi10aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSB2YWx1ZSBvZiBDUFVfVW5rUGVudGl1bQotKGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIENQVUlEIGluc3RydWN0aW9uKS4KLQotU0VFIEFMU086Ci1DUFVfZ2V0UHJvY2Vzc29yU3BlZWQsIENQVV9oYXZlTU1YLCBDUFVfZ2V0UHJvY2Vzc29yTmFtZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQgWkFQSSBDUFVfZ2V0UHJvY2Vzc29yVHlwZSh2b2lkKQotewotI2lmICAgICBkZWZpbmVkKF9fSU5URUxfXykKLSAgICB1aW50ICAgICAgICAgICAgY3B1LHZlbmRvcixtb2RlbCxjYWNoZVNpemU7Ci0gICAgc3RhdGljIGlib29sICAgIGZpcnN0VGltZSA9IHRydWU7Ci0KLSAgICBpZiAoX0NQVV9oYXZlQ1BVSUQoKSkgewotCWNwdSA9IF9DUFVfY2hlY2tDUFVJRCgpOwotCXZlbmRvciA9IGNwdSAmIH5DUFVfbWFzazsKLQlpZiAodmVuZG9yID09IENQVV9JbnRlbCkgewotCSAgICAvKiBDaGVjayBmb3IgSW50ZWwgcHJvY2Vzc29ycyAqLwotCSAgICBzd2l0Y2ggKGNwdSAmIENQVV9tYXNrKSB7Ci0JCWNhc2UgNDogY3B1ID0gQ1BVX2k0ODY7ICAgICAgICAgYnJlYWs7Ci0JCWNhc2UgNTogY3B1ID0gQ1BVX1BlbnRpdW07ICAgICAgYnJlYWs7Ci0JCWNhc2UgNjoKLQkJICAgIGlmICgobW9kZWwgPSBfQ1BVX2dldENQVUlETW9kZWwoKSkgPT0gMSkKLQkJCWNwdSA9IENQVV9QZW50aXVtUHJvOwotCQkgICAgZWxzZSBpZiAobW9kZWwgPD0gNikgewotCQkJY2FjaGVTaXplID0gX0NQVV9nZXRDYWNoZVNpemUoKTsKLQkJCWlmICgobW9kZWwgPT0gNSAmJiBjYWNoZVNpemUgPT0gMCkgfHwKLQkJCSAgICAobW9kZWwgPT0gNSAmJiBjYWNoZVNpemUgPT0gMjU2KSB8fAotCQkJICAgIChtb2RlbCA9PSA2ICYmIGNhY2hlU2l6ZSA9PSAxMjgpKQotCQkJICAgIGNwdSA9IENQVV9DZWxlcm9uOwotCQkJZWxzZQotCQkJICAgIGNwdSA9IENQVV9QZW50aXVtSUk7Ci0JCQl9Ci0JCSAgICBlbHNlIGlmIChtb2RlbCA+PSA3KSB7Ci0JCQkvKiBNb2RlbCA3ID09IFBlbnRpdW0gSUlJICovCi0JCQkvKiBNb2RlbCA4ID09IENlbGVyb24vUGVudGl1bSBJSUkgQ29wcGVybWluZSAqLwotCQkJY2FjaGVTaXplID0gX0NQVV9nZXRDYWNoZVNpemUoKTsKLQkJCWlmICgobW9kZWwgPT0gOCAmJiBjYWNoZVNpemUgPT0gMTI4KSkKLQkJCSAgICBjcHUgPSBDUFVfQ2VsZXJvbjsKLQkJCWVsc2UKLQkJCSAgICBjcHUgPSBDUFVfUGVudGl1bUlJSTsKLQkJCX0KLQkJICAgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgICAgY3B1ID0gQ1BVX1Vua0ludGVsOwotCQl9Ci0JICAgIH0KLQllbHNlIGlmICh2ZW5kb3IgPT0gQ1BVX0N5cml4KSB7Ci0JICAgIC8qIENoZWNrIGZvciBDeXJpeCBwcm9jZXNzb3JzICovCi0JICAgIHN3aXRjaCAoY3B1ICYgQ1BVX21hc2spIHsKLQkJY2FzZSA0OgotCQkgICAgaWYgKChtb2RlbCA9IF9DUFVfZ2V0Q1BVSURNb2RlbCgpKSA9PSA0KQotCQkJY3B1ID0gQ1BVX0N5cml4TWVkaWFHWDsKLQkJICAgIGVsc2UKLQkJCWNwdSA9IENQVV9VbmtDeXJpeDsKLQkJICAgIGJyZWFrOwotCQljYXNlIDU6Ci0JCSAgICBpZiAoKG1vZGVsID0gX0NQVV9nZXRDUFVJRE1vZGVsKCkpID09IDIpCi0JCQljcHUgPSBDUFVfQ3lyaXg2eDg2OwotCQkgICAgZWxzZSBpZiAobW9kZWwgPT0gNCkKLQkJCWNwdSA9IENQVV9DeXJpeE1lZGlhR1htOwotCQkgICAgZWxzZQotCQkJY3B1ID0gQ1BVX1Vua0N5cml4OwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgNjoKLQkJICAgIGlmICgobW9kZWwgPSBfQ1BVX2dldENQVUlETW9kZWwoKSkgPD0gMSkKLQkJCWNwdSA9IENQVV9DeXJpeDZ4ODZNWDsKLQkJICAgIGVsc2UKLQkJCWNwdSA9IENQVV9VbmtDeXJpeDsKLQkJICAgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgICAgY3B1ID0gQ1BVX1Vua0N5cml4OwotCQl9Ci0JICAgIH0KLQllbHNlIGlmICh2ZW5kb3IgPT0gQ1BVX0FNRCkgewotCSAgICAvKiBDaGVjayBmb3IgQU1EIHByb2Nlc3NvcnMgKi8KLQkgICAgc3dpdGNoIChjcHUgJiBDUFVfbWFzaykgewotCQljYXNlIDQ6Ci0JCSAgICBpZiAoKG1vZGVsID0gX0NQVV9nZXRDUFVJRE1vZGVsKCkpID09IDApCi0JCQljcHUgPSBDUFVfQU1EQW01eDg2OwotCQkgICAgZWxzZQotCQkJY3B1ID0gQ1BVX0FNREFtNDg2OwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgNToKLQkJICAgIGlmICgobW9kZWwgPSBfQ1BVX2dldENQVUlETW9kZWwoKSkgPD0gMykKLQkJCWNwdSA9IENQVV9BTURLNTsKLQkJICAgIGVsc2UgaWYgKG1vZGVsIDw9IDcpCi0JCQljcHUgPSBDUFVfQU1ESzY7Ci0JCSAgICBlbHNlIGlmIChtb2RlbCA9PSA4KQotCQkJY3B1ID0gQ1BVX0FNREs2XzI7Ci0JCSAgICBlbHNlIGlmIChtb2RlbCA9PSA5KQotCQkJY3B1ID0gQ1BVX0FNREs2X0lJSTsKLQkJICAgIGVsc2UgaWYgKG1vZGVsID09IDEzKSB7Ci0JCQlpZiAoX0NQVV9nZXRDUFVJRFN0ZXBwaW5nKCkgPD0gMykKLQkJCSAgICBjcHUgPSBDUFVfQU1ESzZfSUlJcGx1czsKLQkJCWVsc2UKLQkJCSAgICBjcHUgPSBDUFVfQU1ESzZfMnBsdXM7Ci0JCQl9Ci0JCSAgICBlbHNlCi0JCQljcHUgPSBDUFVfVW5rQU1EOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgNjoKLQkJICAgIGlmICgobW9kZWwgPSBfQ1BVX2dldENQVUlETW9kZWwoKSkgPT0gMykKLQkJCWNwdSA9IENQVV9BTUREdXJvbjsKLQkJICAgIGVsc2UKLQkJCWNwdSA9IENQVV9BTURBdGhsb247Ci0JCSAgICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICAgIGNwdSA9IENQVV9VbmtBTUQ7Ci0JCX0KLQkgICAgfQotCWVsc2UgaWYgKHZlbmRvciA9PSBDUFVfSURUKSB7Ci0JICAgIC8qIENoZWNrIGZvciBJRFQgV2luQ2hpcCBwcm9jZXNzb3JzICovCi0JICAgIHN3aXRjaCAoY3B1ICYgQ1BVX21hc2spIHsKLQkJY2FzZSA1OgotCQkgICAgaWYgKChtb2RlbCA9IF9DUFVfZ2V0Q1BVSURNb2RlbCgpKSA8PSA0KQotCQkJY3B1ID0gQ1BVX1dpbkNoaXBDNjsKLQkJICAgIGVsc2UgaWYgKG1vZGVsID09IDgpCi0JCQljcHUgPSBDUFVfV2luQ2hpcDI7Ci0JCSAgICBlbHNlCi0JCQljcHUgPSBDUFVfVW5rSURUOwotCQkgICAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgICBjcHUgPSBDUFVfVW5rSURUOwotCQl9Ci0JICAgIH0KLQllbHNlIHsKLQkgICAgLyogQXNzdW1lIGEgUGVudGl1bSBjb21wYXRpYmxlIEludGVsIGNsb25lICovCi0JICAgIGNwdSA9IENQVV9QZW50aXVtOwotCSAgICB9Ci0JcmV0dXJuIGNwdSB8IHZlbmRvciB8IChfQ1BVX2dldENQVUlEU3RlcHBpbmcoKSA8PCBDUFVfc3RlcHBpbmdTaGlmdCk7Ci0JfQotICAgIGVsc2UgewotCWlmIChfQ1BVX2NoZWNrODAzODYoKSkKLQkgICAgY3B1ID0gQ1BVX2kzODY7Ci0JZWxzZSAgaWYgKF9DUFVfY2hlY2s4MDQ4NigpKSB7Ci0JICAgIC8qIElmIHdlIGdldCBoZXJlIHdlIG1heSBoYXZlIGEgQ3lyaXggcHJvY2Vzc29yIHNvIHdlIGNhbiB0cnkKLQkgICAgICogZW5hYmxpbmcgdGhlIENQVUlEIGluc3RydWN0aW9uIGFuZCB0cnlpbmcgYWdhaW4uCi0JICAgICAqLwotCSAgICBpZiAoZmlyc3RUaW1lKSB7Ci0JCWZpcnN0VGltZSA9IGZhbHNlOwotCQlfQ1BVX2VuYWJsZUN5cml4Q1BVSUQoKTsKLQkJcmV0dXJuIENQVV9nZXRQcm9jZXNzb3JUeXBlKCk7Ci0JCX0KLQkgICAgY3B1ID0gQ1BVX2k0ODY7Ci0JICAgIH0KLQllbHNlCi0JICAgIGNwdSA9IENQVV9QZW50aXVtOwotCWlmICghX0NQVV9jaGVja0Nsb25lKCkpCi0JICAgIHJldHVybiBjcHUgfCBDUFVfSW50ZWw7Ci0JcmV0dXJuIGNwdTsKLQl9Ci0jZWxpZiAgIGRlZmluZWQoX19BTFBIQV9fKQotICAgIHJldHVybiBDUFVfQWxwaGE7Ci0jZWxpZiAgIGRlZmluZWQoX19NSVBTX18pCi0gICAgcmV0dXJuIENQVV9NaXBzOwotI2VsaWYgICBkZWZpbmVkKF9fUFBDX18pCi0gICAgcmV0dXJuIENQVV9Qb3dlclBDOwotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvY2Vzc29yIHN1cHBvcnRzIEludGVsIE1NWCBleHRlbnNpb25zLgotCi1IRUFERVI6Ci16dGltZXIuaAotCi1SRVRVUk5TOgotVHJ1ZSBpZiBNTVggaXMgYXZhaWxhYmxlLCBmYWxzZSBpZiBub3QuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgaWYgdGhlIHByb2Nlc3NvciBzdXBwb3J0cyB0aGUgSW50ZWwgTU1YIGV4dGVuZGVkCi1pbnN0cnVjdGlvbiBzZXQuCi0KLVNFRSBBTFNPOgotQ1BVX2dldFByb2Nlc3NvclR5cGUsIENQVV9nZXRQcm9jZXNzb3JTcGVlZCwgQ1BVX2hhdmUzRE5vdywgQ1BVX2hhdmVTU0UsCi1DUFVfZ2V0UHJvY2Vzc29yTmFtZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFpBUEkgQ1BVX2hhdmVNTVgodm9pZCkKLXsKLSNpZmRlZiAgX19JTlRFTF9fCi0gICAgaWYgKF9DUFVfaGF2ZUNQVUlEKCkpCi0JcmV0dXJuIChfQ1BVX2dldENQVUlERmVhdHVyZXMoKSAmIENQVV9IYXZlTU1YKSAhPSAwOwotICAgIHJldHVybiBmYWxzZTsKLSNlbHNlCi0gICAgcmV0dXJuIGZhbHNlOwotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvY2Vzc29yIHN1cHBvcnRzIEFNRCAzRE5vdyEgZXh0ZW5zaW9ucy4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUkVUVVJOUzoKLVRydWUgaWYgM0ROb3chIGlzIGF2YWlsYWJsZSwgZmFsc2UgaWYgbm90LgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIHRoZSBwcm9jZXNzb3Igc3VwcG9ydHMgdGhlIEFNRCAzRE5vdyEgZXh0ZW5kZWQKLWluc3RydWN0aW9uIHNldC4KLQotU0VFIEFMU086Ci1DUFVfZ2V0UHJvY2Vzc29yVHlwZSwgQ1BVX2dldFByb2Nlc3NvclNwZWVkLCBDUFVfaGF2ZU1NWCwgQ1BVX2hhdmVTU0UsCi1DUFVfZ2V0UHJvY2Vzc29yTmFtZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFpBUEkgQ1BVX2hhdmUzRE5vdyh2b2lkKQotewotI2lmZGVmICBfX0lOVEVMX18KLSAgICBpZiAoX0NQVV9oYXZlQ1BVSUQoKSkKLQlyZXR1cm4gX0NQVV9oYXZlM0ROb3coKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0jZWxzZQotICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1SZXR1cm5zIHRydWUgaWYgdGhlIHByb2Nlc3NvciBzdXBwb3J0cyBJbnRlbCBLTkkgZXh0ZW5zaW9ucy4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUkVUVVJOUzoKLVRydWUgaWYgSW50ZWwgS05JIGlzIGF2YWlsYWJsZSwgZmFsc2UgaWYgbm90LgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIHRoZSBwcm9jZXNzb3Igc3VwcG9ydHMgdGhlIEludGVsIEtOSSBleHRlbmRlZAotaW5zdHJ1Y3Rpb24gc2V0LgotCi1TRUUgQUxTTzoKLUNQVV9nZXRQcm9jZXNzb3JUeXBlLCBDUFVfZ2V0UHJvY2Vzc29yU3BlZWQsIENQVV9oYXZlTU1YLCBDUFVfaGF2ZTNETm93LAotQ1BVX2dldFByb2Nlc3Nvck5hbWUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBaQVBJIENQVV9oYXZlU1NFKHZvaWQpCi17Ci0jaWZkZWYgIF9fSU5URUxfXwotICAgIGlmIChfQ1BVX2hhdmVDUFVJRCgpKQotCXJldHVybiAoX0NQVV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVNTRSkgIT0gMDsKLSAgICByZXR1cm4gZmFsc2U7Ci0jZWxzZQotICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVUVVJOUzoKLVRydWUgaWYgdGhlIFJUU0MgaW5zdHJ1Y3Rpb24gaXMgYXZhaWxhYmxlLCBmYWxzZSBpZiBub3QuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgaWYgdGhlIHByb2Nlc3NvciBzdXBwb3J0cyB0aGUgSW50ZWwgUkRUU0MKLWluc3RydWN0aW9uLCBmb3IgaGlnaCBwcmVjaXNpb24gdGltaW5nLiBJZiB0aGUgcHJvY2Vzc29yIGlzIG5vdCBhbiBJbnRlbCBvcgotSW50ZWwgY2xvbmUgQ1BVLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIHJldHVybiBmYWxzZS4KLQotREVTQ1JJUFRJT046Ci1SZXR1cm5zIHRydWUgaWYgdGhlIHByb2Nlc3NvciBzdXBwb3J0cyBSRFRTQyBleHRlbnNpb25zLgotCi1IRUFERVI6Ci16dGltZXIuaAotCi1SRVRVUk5TOgotVHJ1ZSBpZiBSVFNDIGlzIGF2YWlsYWJsZSwgZmFsc2UgaWYgbm90LgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIHRoZSBwcm9jZXNzb3Igc3VwcG9ydHMgdGhlIFJEVFNDIGluc3RydWN0aW9uCi1mb3IgcmVhZGluZyB0aGUgcHJvY2Vzc29yIHRpbWUgc3RhbXAgY291bnRlci4KLQotU0VFIEFMU086Ci1DUFVfZ2V0UHJvY2Vzc29yVHlwZSwgQ1BVX2dldFByb2Nlc3NvclNwZWVkLCBDUFVfaGF2ZU1NWCwgQ1BVX2hhdmUzRE5vdywKLUNQVV9nZXRQcm9jZXNzb3JOYW1lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgWkFQSSBDUFVfaGF2ZVJEVFNDKHZvaWQpCi17Ci0jaWZkZWYgIF9fSU5URUxfXwotICAgIGlmIChfQ1BVX2hhdmVDUFVJRCgpKQotCXJldHVybiAoX0NQVV9nZXRDUFVJREZlYXR1cmVzKCkgJiBDUFVfSGF2ZVJEVFNDKSAhPSAwOwotICAgIHJldHVybiBmYWxzZTsKLSNlbHNlCi0gICAgcmV0dXJuIGZhbHNlOwotI2VuZGlmCi19Ci0KLSNpZmRlZiAgX19JTlRFTF9fCi0KLSNkZWZpbmUgSVRFUkFUSU9OUyAgICAgIDE2MDAwCi0jZGVmaW5lIFNBTVBMSU5HUyAgICAgICAyCi0jZGVmaW5lIElOTkVSX0xPT1BTICAgICA0MDAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JZiBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCB0aW1lIHN0YW1wIHJlYWRpbmcsIGJ1dCBpcyBhdCBsZWFzdCBhIDM4NiBvcgotYWJvdmUsIHV0aWxpemUgbWV0aG9kIG9mIHRpbWluZyBhIGxvb3Agb2YgQlNGIGluc3RydWN0aW9ucyB3aGljaCB0YWtlIGEKLWtub3duIG51bWJlciBvZiBjeWNsZXMgdG8gcnVuIG9uIGkzODYodG0pLCBpNDg2KHRtKSwgYW5kIFBlbnRpdW0oUikKLXByb2Nlc3NvcnMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIEdldEJTRkNwdVNwZWVkKAotICAgIHVsb25nIGN5Y2xlcykKLXsKLSAgICBDUFVfbGFyZ2VJbnRlZ2VyIHQwLHQxLGNvdW50X2ZyZXE7Ci0gICAgdWxvbmcgICB0aWNrczsgICAgICAgICAgICAgIC8qIE1pY3Jvc2Vjb25kcyBlbGFwc2VkIGR1cmluZyB0ZXN0ICAgICAqLwotICAgIHVsb25nICAgY3VycmVudDsgICAgICAgICAgICAvKiBWYXJpYWJsZSB0byBzdG9yZSB0aW1lIGVsYXBzZWQgICAgICAgKi8KLSAgICBpbnQgICAgIGksaixpUHJpb3JpdHk7Ci0gICAgdWxvbmcgICBsb3dlc3QgID0gKHVsb25nKS0xOwotCi0gICAgaVByaW9yaXR5ID0gU2V0TWF4VGhyZWFkUHJpb3JpdHkoKTsKLSAgICBHZXRDb3VudGVyRnJlcXVlbmN5KCZjb3VudF9mcmVxKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgU0FNUExJTkdTOyBpKyspIHsKLQlHZXRDb3VudGVyKCZ0MCk7Ci0JZm9yIChqID0gMDsgaiA8IElOTkVSX0xPT1BTOyBqKyspCi0JICAgIF9DUFVfcnVuQlNGTG9vcChJVEVSQVRJT05TKTsKLQlHZXRDb3VudGVyKCZ0MSk7Ci0JY3VycmVudCA9IHQxLmxvdyAtIHQwLmxvdzsKLQlpZiAoY3VycmVudCA8IGxvd2VzdCkKLQkgICAgbG93ZXN0ID0gY3VycmVudDsKLQl9Ci0gICAgUmVzdG9yZVRocmVhZFByaW9yaXR5KGlQcmlvcml0eSk7Ci0KLSAgICAvKiBDb21wdXRlIGZyZXF1ZW5jeSAqLwotICAgIHRpY2tzID0gX0NQVV9tdWxEaXYobG93ZXN0LDEwMDAwMDAsY291bnRfZnJlcS5sb3cpOwotICAgIGlmICgodGlja3MgJSBjb3VudF9mcmVxLmxvdykgPiAoY291bnRfZnJlcS5sb3cvMikpCi0JdGlja3MrKzsgICAgICAgICAgICAvKiBSb3VuZCB1cCBpZiBuZWNlc3NhcnkgKi8KLSAgICBpZiAodGlja3MgPT0gMCkKLQlyZXR1cm4gMDsKLSAgICByZXR1cm4gKChjeWNsZXMqSU5ORVJfTE9PUFMpL3RpY2tzKTsKLX0KLQotI2RlZmluZSBUT0xFUkFOQ0UgICAgICAgMQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU9uIHByb2Nlc3NvcnMgc3VwcG9ydGluZyB0aGUgUmVhZCBUaW1lIFN0YW1wIG9wY29kZSwgY29tcGFyZSBlbGFwc2VkCi10aW1lIG9uIHRoZSBIaWdoLVJlc29sdXRpb24gQ291bnRlciB3aXRoIGVsYXBzZWQgY3ljbGVzIG9uIHRoZSBUaW1lCi1TdGFtcCBSZWdpc3Rlci4KLQotVGhlIGlubmVyIGxvb3AgcnVucyB1cCB0byAyMCB0aW1lcyBvcnVudGlsIHRoZSBhdmVyYWdlIG9mIHRoZSBwcmV2aW91cwotdGhyZWUgY2FsY3VsYXRlZCBmcmVxdWVuY2llcyBpcyB3aXRoaW4gMSBNSHogb2YgZWFjaCBvZiB0aGUgaW5kaXZpZHVhbAotY2FsY3VsYXRlZCBmcmVxdWVuY2llcy4gVGhpcyByZXNhbXBsaW5nIGluY3JlYXNlcyB0aGUgYWNjdXJhY3kgb2YgdGhlCi1yZXN1bHRzIHNpbmNlIG91dHNpZGUgZmFjdG9ycyBjb3VsZCBhZmZlY3QgdGhpcyBjYWxjdWxhdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgR2V0UkRUU0NDcHVTcGVlZCgKLSAgICBpYm9vbCBhY2N1cmF0ZSkKLXsKLSAgICBDUFVfbGFyZ2VJbnRlZ2VyICAgIHQwLHQxLHMwLHMxLGNvdW50X2ZyZXE7Ci0gICAgdTY0ICAgICAgICAgICAgICAgICBzdGFtcDAsIHN0YW1wMSwgdGlja3MwLCB0aWNrczE7Ci0gICAgdTY0ICAgICAgICAgICAgICAgICB0b3RhbF9jeWNsZXMsIGN5Y2xlcywgaHosIGZyZXE7Ci0gICAgdTY0ICAgICAgICAgICAgICAgICB0b3RhbF90aWNrcywgdGlja3M7Ci0gICAgaW50ICAgICAgICAgICAgICAgICB0cmllcyxpUHJpb3JpdHk7Ci0gICAgdWxvbmcgICAgICAgICAgICAgICBtYXhDb3VudDsKLQotICAgIFBNX3NldDY0XzMyKHRvdGFsX2N5Y2xlcywwKTsKLSAgICBQTV9zZXQ2NF8zMih0b3RhbF90aWNrcywwKTsKLSAgICBtYXhDb3VudCA9IGFjY3VyYXRlID8gNjAwMDAwIDogMzAwMDA7Ci0gICAgaVByaW9yaXR5ID0gU2V0TWF4VGhyZWFkUHJpb3JpdHkoKTsKLSAgICBHZXRDb3VudGVyRnJlcXVlbmN5KCZjb3VudF9mcmVxKTsKLSAgICBQTV9zZXQ2NChmcmVxLGNvdW50X2ZyZXEuaGlnaCxjb3VudF9mcmVxLmxvdyk7Ci0gICAgZm9yICh0cmllcyA9IDA7IHRyaWVzIDwgMzsgdHJpZXMrKykgewotCS8qIExvb3AgdW50aWwgMTAwIHRpY2tzIGhhdmUgcGFzc2VkIHNpbmNlIGxhc3QgcmVhZCBvZiBoaS1yZXMKLQkgKiBjb3VudGVyLiBUaGlzIGFjY291bnRzIGZvciBvdmVyaGVhZCBsYXRlci4KLQkgKi8KLQlHZXRDb3VudGVyKCZ0MCk7Ci0JdDEubG93ID0gdDAubG93OwotCXQxLmhpZ2ggPSB0MC5oaWdoOwotCXdoaWxlICgodDEubG93IC0gdDAubG93KSA8IDEwMCkgewotCSAgICBHZXRDb3VudGVyKCZ0MSk7Ci0JICAgIF9DUFVfcmVhZFRpbWVTdGFtcCgmczApOwotCSAgICB9Ci0KLQkvKiBMb29wIHVudGlsIDMwMDAwIHRpY2tzIGhhdmUgcGFzc2VkIHNpbmNlIGxhc3QgcmVhZCBvZiBoaS1yZXMgY291bnRlci4KLQkgKiBUaGlzIGFsbG93cyBmb3IgZWxhcHNlZCB0aW1lIGZvciBzYW1wbGluZy4gRm9yIGEgaGktcmVzIGZyZXF1ZW5jeQotCSAqIG9mIDFNSHosIHRoaXMgaXMgYWJvdXQgMC4wMyBvZiBhIHNlY29uZC4gVGhlIGZyZXF1ZW5jeSByZXBvcnRlZAotCSAqIGJ5IHRoZSBPUyBkZXBlbmRlbnQgY29kZSBzaG91bGQgYmUgdHVuZWQgdG8gcHJvdmlkZSBhIGdvb2QKLQkgKiBzYW1wbGUgcGVyaW9kIGRlcGVuZGluZyBvbiB0aGUgYWNjdXJhY3kgb2YgdGhlIE9TIHRpbWVycyAoaWU6Ci0JICogaWYgdGhlIGFjY3VyYWN5IGlzIGxvd2VyLCBsb3dlciB0aGUgZnJlcXVlbmN5IHRvIHNwZW5kIG1vcmUgdGltZQotCSAqIGluIHRoZSBpbm5lciBsb29wIHRvIGdldCBiZXR0ZXIgYWNjdXJhY3kpLgotCSAqLwotCXQwLmxvdyA9IHQxLmxvdzsKLQl0MC5oaWdoID0gdDEuaGlnaDsKLQl3aGlsZSAoKHQxLmxvdyAtIHQwLmxvdykgPCBtYXhDb3VudCkgewotCSAgICBHZXRDb3VudGVyKCZ0MSk7Ci0JICAgIF9DUFVfcmVhZFRpbWVTdGFtcCgmczEpOwotCSAgICB9Ci0KLQkvKiBGaW5kIHRoZSBkaWZmZXJlbmNlIGR1cmluZyB0aGUgdGltaW5nIGxvb3AgKi8KLQlQTV9zZXQ2NChzdGFtcDAsczAuaGlnaCxzMC5sb3cpOwotCVBNX3NldDY0KHN0YW1wMSxzMS5oaWdoLHMxLmxvdyk7Ci0JUE1fc2V0NjQodGlja3MwLHQwLmhpZ2gsdDAubG93KTsKLQlQTV9zZXQ2NCh0aWNrczEsdDEuaGlnaCx0MS5sb3cpOwotCVBNX3N1YjY0KGN5Y2xlcyxzdGFtcDEsc3RhbXAwKTsKLQlQTV9zdWI2NCh0aWNrcyx0aWNrczEsdGlja3MwKTsKLQotCS8qIFN1bSB1cCB0aGUgcmVzdWx0cyAqLwotCVBNX2FkZDY0KHRvdGFsX3RpY2tzLHRvdGFsX3RpY2tzLHRpY2tzKTsKLQlQTV9hZGQ2NCh0b3RhbF9jeWNsZXMsdG90YWxfY3ljbGVzLGN5Y2xlcyk7Ci0JfQotICAgIFJlc3RvcmVUaHJlYWRQcmlvcml0eShpUHJpb3JpdHkpOwotCi0gICAgLyogQ29tcHV0ZSBmcmVxdWVuY3kgaW4gSHogKi8KLSAgICBQTV9tdWw2NChoeix0b3RhbF9jeWNsZXMsZnJlcSk7Ci0gICAgUE1fZGl2NjQoaHosaHosdG90YWxfdGlja3MpOwotICAgIHJldHVybiBQTV82NHRvMzIoaHopOwotfQotCi0jZW5kaWYgIC8qIF9fSU5URUxfXyAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1SZXR1cm5zIHRoZSBzcGVlZCBvZiB0aGUgcHJvY2Vzc29yIGluIE1Iei4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUEFSQU1FVEVSUzoKLWFjY3VyYXRlICAgIC0gVHJ1ZSBvZiB0aGUgc3BlZWQgc2hvdWxkIGJlIG1lYXN1cmVkIGFjY3VyYXRlbHkKLQotUkVUVVJOUzoKLVByb2Nlc3NvciBzcGVlZCBpbiBNSHouCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNwZWVkIG9mIHRoZSBDUFUgaW4gTUh6LiBOb3RlIHRoYXQgaWYgdGhlIHNwZWVkCi1jYW5ub3QgYmUgZGV0ZXJtaW5lZCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAwLgotCi1JZiB0aGUgYWNjdXJhdGUgcGFyYW1ldGVyIGlzIHNldCB0byB0cnVlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgc3BlbmQgbG9uZ2VyCi1wcm9maWxpbmcgdGhlIHNwZWVkIG9mIHRoZSBDUFUsIGFuZCB3aWxsIG5vdCByb3VuZCB0aGUgQ1BVIHNwZWVkIHRoYXQgaXMKLXJlcG9ydGVkLiBUaGlzIGlzIGltcG9ydGFudCBmb3IgaGlnaGx5IGFjY3VyYXRlIHRpbWluZyB1c2luZyB0aGUgUGVudGl1bQotUkRUU0MgaW5zdHJ1Y3Rpb24sIGJ1dCBpdCBkb2VzIHRha2UgYSBsb3QgbG9uZ2VyIGZvciB0aGUgcHJvZmlsaW5nIHRvCi1wcm9kdWNlIGFjY3VyYXRlIHJlc3VsdHMuCi0KLVNFRSBBTFNPOgotQ1BVX2dldFByb2Nlc3NvclNwZWVkSW5IeiwgQ1BVX2dldFByb2Nlc3NvclR5cGUsIENQVV9oYXZlTU1YLAotQ1BVX2dldFByb2Nlc3Nvck5hbWUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBaQVBJIENQVV9nZXRQcm9jZXNzb3JTcGVlZCgKLSAgICBpYm9vbCBhY2N1cmF0ZSkKLXsKLSNpZiBkZWZpbmVkKF9fSU5URUxfXykKLSAgICAvKiBOdW1iZXIgb2YgY3ljbGVzIG5lZWRlZCB0byBleGVjdXRlIGEgc2luZ2xlIEJTRiBpbnN0cnVjdGlvbiBvbiBpMzg2KwotICAgICAqIHByb2Nlc3NvcnMuCi0gICAgICovCi0gICAgdWxvbmcgICBjcHVTcGVlZDsKLSAgICB1aW50ICAgIGk7Ci0gICAgc3RhdGljICB1bG9uZyBpbnRlbF9jeWNsZXNbXSA9IHsKLQkxMTUsNDcsNDMsCi0JfTsKLSAgICBzdGF0aWMgIHVsb25nIGN5cml4X2N5Y2xlc1tdID0gewotCTM4LDM4LDUyLDUyLAotCX07Ci0gICAgc3RhdGljICB1bG9uZyBhbWRfY3ljbGVzW10gPSB7Ci0JNDksCi0JfTsKLSAgICBzdGF0aWMgIHVsb25nIGtub3duX3NwZWVkc1tdID0gewotCTEwMDAsOTUwLDkwMCw4NTAsODAwLDc1MCw3MDAsNjUwLDYwMCw1NTAsNTAwLDQ1MCw0MzMsNDAwLDM1MCwKLQkzMzMsMzAwLDI2NiwyMzMsMjAwLDE2NiwxNTAsMTMzLDEyMCwxMDAsOTAsNzUsNjYsNjAsNTAsMzMsMjAsMCwKLQl9OwotCi0gICAgaWYgKENQVV9oYXZlUkRUU0MoKSkgewotCWNwdVNwZWVkID0gKEdldFJEVFNDQ3B1U3BlZWQoYWNjdXJhdGUpICsgNTAwMDAwKSAvIDEwMDAwMDA7Ci0JfQotICAgIGVsc2UgewotCWludCB0eXBlID0gQ1BVX2dldFByb2Nlc3NvclR5cGUoKTsKLQlpbnQgcHJvY2Vzc29yID0gdHlwZSAmIENQVV9tYXNrOwotCWludCB2ZW5kb3IgPSB0eXBlICYgQ1BVX2ZhbWlseU1hc2s7Ci0JaWYgKHZlbmRvciA9PSBDUFVfSW50ZWwpCi0JICAgIGNwdVNwZWVkID0gR2V0QlNGQ3B1U3BlZWQoSVRFUkFUSU9OUyAqIGludGVsX2N5Y2xlc1twcm9jZXNzb3IgLSBDUFVfaTM4Nl0pOwotCWVsc2UgaWYgKHZlbmRvciA9PSBDUFVfQ3lyaXgpCi0JICAgIGNwdVNwZWVkID0gR2V0QlNGQ3B1U3BlZWQoSVRFUkFUSU9OUyAqIGN5cml4X2N5Y2xlc1twcm9jZXNzb3IgLSBDUFVfQ3lyaXg2eDg2XSk7Ci0JZWxzZSBpZiAodmVuZG9yID09IENQVV9BTUQpCi0JICAgIGNwdVNwZWVkID0gR2V0QlNGQ3B1U3BlZWQoSVRFUkFUSU9OUyAqIGFtZF9jeWNsZXNbMF0pOwotCWVsc2UKLQkgICAgcmV0dXJuIDA7Ci0JfQotCi0gICAgLyogTm93IG5vcm1hbGlzZSB0aGUgcmVzdWx0cyBnaXZlbiBrbm93biBwcm9jZXNzb3JzIHNwZWVkcywgaWYgdGhlCi0gICAgICogc3BlZWQgd2UgbWVhc3VyZSBpcyB3aXRoaW4gMk1IeiBvZiB0aGUgZXhwZWN0ZWQgdmFsdWVzCi0gICAgICovCi0gICAgaWYgKCFhY2N1cmF0ZSkgewotCWZvciAoaSA9IDA7IGtub3duX3NwZWVkc1tpXSAhPSAwOyBpKyspIHsKLQkgICAgaWYgKGNwdVNwZWVkID49IChrbm93bl9zcGVlZHNbaV0tMykgJiYgY3B1U3BlZWQgPD0gKGtub3duX3NwZWVkc1tpXSszKSkgewotCQlyZXR1cm4ga25vd25fc3BlZWRzW2ldOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgcmV0dXJuIGNwdVNwZWVkOwotI2Vsc2UKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1SZXR1cm5zIHRoZSBzcGVlZCBvZiB0aGUgcHJvY2Vzc29yIGluIEh6LgotCi1IRUFERVI6Ci16dGltZXIuaAotCi1SRVRVUk5TOgotQWNjdXJhdGUgcHJvY2Vzc29yIHNwZWVkIGluIEh6LgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBhY2N1cmF0ZSBzcGVlZCBvZiB0aGUgQ1BVIGluIEh6LiBOb3RlIHRoYXQgaWYgdGhlCi1zcGVlZCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAwLgotCi1UaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gdGhlIENQVV9nZXRQcm9jZXNzb3JTcGVlZCBmdW5jdGlvbiwgZXhjZXB0IHRoYXQKLWl0IGF0dGVtcHRzIHRvIGFjY3VyYXRlbHkgbWVhc3VyZSB0aGUgQ1BVIHNwZWVkIGluIEh6LiBUaGlzIGlzIHVzZWQKLWludGVybmFsbHkgaW4gdGhlIFplbiBUaW1lciBsaWJyYXJpZXMgdG8gcHJvdmlkZSBhY2N1cmF0ZSByZWFsIHdvcmxkIHRpbWluZwotaW5mb3JtYXRpb24uIFRoaXMgaXMgaW1wb3J0YW50IGZvciBoaWdobHkgYWNjdXJhdGUgdGltaW5nIHVzaW5nIHRoZSBQZW50aXVtCi1SRFRTQyBpbnN0cnVjdGlvbiwgYnV0IGl0IGRvZXMgdGFrZSBhIGxvdCBsb25nZXIgZm9yIHRoZSBwcm9maWxpbmcgdG8KLXByb2R1Y2UgYWNjdXJhdGUgcmVzdWx0cy4KLQotU0VFIEFMU086Ci1DUFVfZ2V0UHJvY2Vzc29yU3BlZWQsIENQVV9nZXRQcm9jZXNzb3JUeXBlLCBDUFVfaGF2ZU1NWCwKLUNQVV9nZXRQcm9jZXNzb3JOYW1lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgWkFQSSBDUFVfZ2V0UHJvY2Vzc29yU3BlZWRJbkhaKAotICAgIGlib29sIGFjY3VyYXRlKQotewotI2lmIGRlZmluZWQoX19JTlRFTF9fKQotICAgIGlmIChDUFVfaGF2ZVJEVFNDKCkpIHsKLQlyZXR1cm4gR2V0UkRUU0NDcHVTcGVlZChhY2N1cmF0ZSk7Ci0JfQotICAgIHJldHVybiBDUFVfZ2V0UHJvY2Vzc29yU3BlZWQoZmFsc2UpICogMTAwMDAwMDsKLSNlbHNlCi0gICAgcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotUmV0dXJucyBhIHN0cmluZyBkZWZpbmluZyB0aGUgc3BlZWQgYW5kIG5hbWUgb2YgdGhlIHByb2Nlc3Nvci4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUkVUVVJOUzoKLVByb2Nlc3NvciBuYW1lIHN0cmluZy4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBFbmdsaXNoIHN0cmluZyBkZXNjcmliaW5nIHRoZSBzcGVlZCBhbmQgbmFtZSBvZiB0aGUKLUNQVS4KLQotU0VFIEFMU086Ci1DUFVfZ2V0UHJvY2Vzc29yVHlwZSwgQ1BVX2hhdmVNTVgsIENQVV9nZXRQcm9jZXNzb3JOYW1lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2hhciAqIFpBUEkgQ1BVX2dldFByb2Nlc3Nvck5hbWUodm9pZCkKLXsKLSNpZiBkZWZpbmVkKF9fSU5URUxfXykKLSAgICBzdGF0aWMgaW50ICBjcHUsc3BlZWQgPSAtMTsKLSAgICBzdGF0aWMgY2hhciBuYW1lWzgwXTsKLQotICAgIGlmIChzcGVlZCA9PSAtMSkgewotCWNwdSA9IENQVV9nZXRQcm9jZXNzb3JUeXBlKCk7Ci0Jc3BlZWQgPSBDUFVfZ2V0UHJvY2Vzc29yU3BlZWQoZmFsc2UpOwotCX0KLSAgICBzcHJpbnRmKG5hbWUsIiVkIE1IeiAiLCBzcGVlZCk7Ci0gICAgc3dpdGNoIChjcHUgJiBDUFVfbWFzaykgewotCWNhc2UgQ1BVX2kzODY6Ci0JICAgIHN0cmNhdChuYW1lLCJJbnRlbCBpMzg2IHByb2Nlc3NvciIpOwotCSAgICBicmVhazsKLQljYXNlIENQVV9pNDg2OgotCSAgICBzdHJjYXQobmFtZSwiSW50ZWwgaTQ4NiBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfUGVudGl1bToKLQkgICAgc3RyY2F0KG5hbWUsIkludGVsIFBlbnRpdW0gcHJvY2Vzc29yIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ1BVX1BlbnRpdW1Qcm86Ci0JICAgIHN0cmNhdChuYW1lLCJJbnRlbCBQZW50aXVtIFBybyBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfUGVudGl1bUlJOgotCSAgICBzdHJjYXQobmFtZSwiSW50ZWwgUGVudGl1bSBJSSBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfQ2VsZXJvbjoKLQkgICAgc3RyY2F0KG5hbWUsIkludGVsIENlbGVyb24gcHJvY2Vzc29yIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ1BVX1BlbnRpdW1JSUk6Ci0JICAgIHN0cmNhdChuYW1lLCJJbnRlbCBQZW50aXVtIElJSSBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfVW5rSW50ZWw6Ci0JICAgIHN0cmNhdChuYW1lLCJVbmtub3duIEludGVsIHByb2Nlc3NvciIpOwotCSAgICBicmVhazsKLQljYXNlIENQVV9DeXJpeDZ4ODY6Ci0JICAgIHN0cmNhdChuYW1lLCJDeXJpeCA2eDg2IHByb2Nlc3NvciIpOwotCSAgICBicmVhazsKLQljYXNlIENQVV9DeXJpeDZ4ODZNWDoKLQkgICAgc3RyY2F0KG5hbWUsIkN5cml4IDZ4ODZNWCBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfQ3lyaXhNZWRpYUdYOgotCSAgICBzdHJjYXQobmFtZSwiQ3lyaXggTWVkaWFHWCBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfQ3lyaXhNZWRpYUdYbToKLQkgICAgc3RyY2F0KG5hbWUsIkN5cml4IE1lZGlhR1htIHByb2Nlc3NvciIpOwotCSAgICBicmVhazsKLQljYXNlIENQVV9VbmtDeXJpeDoKLQkgICAgc3RyY2F0KG5hbWUsIlVua25vd24gQ3lyaXggcHJvY2Vzc29yIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ1BVX0FNREFtNDg2OgotCSAgICBzdHJjYXQobmFtZSwiQU1EIEFtNDg2IHByb2Nlc3NvciIpOwotCSAgICBicmVhazsKLQljYXNlIENQVV9BTURBbTV4ODY6Ci0JICAgIHN0cmNhdChuYW1lLCJBTUQgQW01eDg2IHByb2Nlc3NvciIpOwotCSAgICBicmVhazsKLQljYXNlIENQVV9BTURLNToKLQkgICAgc3RyY2F0KG5hbWUsIkFNRCBLNSBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfQU1ESzY6Ci0JICAgIHN0cmNhdChuYW1lLCJBTUQgSzYgcHJvY2Vzc29yIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ1BVX0FNREs2XzI6Ci0JICAgIHN0cmNhdChuYW1lLCJBTUQgSzYtMiBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfQU1ESzZfSUlJOgotCSAgICBzdHJjYXQobmFtZSwiQU1EIEs2LUlJSSBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfQU1ESzZfMnBsdXM6Ci0JICAgIHN0cmNhdChuYW1lLCJBTUQgSzYtMisgcHJvY2Vzc29yIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ1BVX0FNREs2X0lJSXBsdXM6Ci0JICAgIHN0cmNhdChuYW1lLCJBTUQgSzYtSUlJKyBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfVW5rQU1EOgotCSAgICBzdHJjYXQobmFtZSwiVW5rbm93biBBTUQgcHJvY2Vzc29yIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ1BVX0FNREF0aGxvbjoKLQkgICAgc3RyY2F0KG5hbWUsIkFNRCBBdGhsb24gcHJvY2Vzc29yIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgQ1BVX0FNRER1cm9uOgotCSAgICBzdHJjYXQobmFtZSwiQU1EIER1cm9uIHByb2Nlc3NvciIpOwotCSAgICBicmVhazsKLQljYXNlIENQVV9XaW5DaGlwQzY6Ci0JICAgIHN0cmNhdChuYW1lLCJJRFQgV2luQ2hpcCBDNiBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBDUFVfV2luQ2hpcDI6Ci0JICAgIHN0cmNhdChuYW1lLCJJRFQgV2luQ2hpcCAyIHByb2Nlc3NvciIpOwotCSAgICBicmVhazsKLQljYXNlIENQVV9VbmtJRFQ6Ci0JICAgIHN0cmNhdChuYW1lLCJVbmtub3duIElEVCBwcm9jZXNzb3IiKTsKLQkgICAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgICAgc3RyY2F0KG5hbWUsIlVua25vd24gcHJvY2Vzc29yIik7Ci0JfQotICAgIGlmIChDUFVfaGF2ZU1NWCgpKQotCXN0cmNhdChuYW1lLCIgd2l0aCBNTVgoUikiKTsKLSAgICBpZiAoQ1BVX2hhdmUzRE5vdygpKQotCXN0cmNhdChuYW1lLCIsIDNETm93IShSKSIpOwotICAgIGlmIChDUFVfaGF2ZVNTRSgpKQotCXN0cmNhdChuYW1lLCIsIFNTRShSKSIpOwotICAgIHJldHVybiBuYW1lOwotI2Vsc2UKLSAgICByZXR1cm4gIlVua25vd24iOwotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kZWJ1Zy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZGVidWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYmYwOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kZWJ1Zy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIE1haW4gbW9kdWxlIGNvbnRhaW5pbmcgZGVidWcgY2hlY2tpbmcgZmVhdHVyZXMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpZmRlZiAgX19XSU4zMl9WWERfXwotI2luY2x1ZGUgInZ4ZGZpbGUuaCIKLSNlbGlmIGRlZmluZWQoX19OVF9EUklWRVJfXykKLSNpbmNsdWRlICJudGRyaXZlci5oIgotI2VsaWYgZGVmaW5lZChfX09TMl9WRERfXykKLSNpbmNsdWRlICJ2ZGRmaWxlLmgiCi0jZWxzZQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoge3NlY3JldH0gKi8KLXZvaWQgKCpfQ0hLX2ZhaWwpKGludCBmYXRhbCxjb25zdCBjaGFyICptc2csY29uc3QgY2hhciAqY29uZCxjb25zdCBjaGFyICpmaWxlLGludCBsaW5lKSA9IF9DSEtfZGVmYXVsdEZhaWw7Ci1zdGF0aWMgY2hhciBsb2dGaWxlWzI1Nl0gPSAiIjsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmICBDSEVDS0VECi12b2lkIF9DSEtfZGVmYXVsdEZhaWwoCi0gICAgaW50IGZhdGFsLAotICAgIGNvbnN0IGNoYXIgKm1zZywKLSAgICBjb25zdCBjaGFyICpjb25kLAotICAgIGNvbnN0IGNoYXIgKmZpbGUsCi0gICAgaW50IGxpbmUpCi17Ci0gICAgRklMRSAgICAqZjsKLSAgICBjaGFyICAgIGJ1ZlsyNTZdOwotCi0gICAgaWYgKGxvZ0ZpbGVbMF0gPT0gMCkgewotCXN0cmNweShsb2dGaWxlLFBNX2dldE51Y2xldXNQYXRoKCkpOwotCVBNX2JhY2tzbGFzaChsb2dGaWxlKTsKLQlzdHJjYXQobG9nRmlsZSwic2NpdGVjaC5sb2ciKTsKLQl9Ci0gICAgaWYgKChmID0gZm9wZW4obG9nRmlsZSwiYSsiKSkgIT0gTlVMTCkgewotI2lmIGRlZmluZWQoX19XSU4zMl9WWERfXykgfHwgZGVmaW5lZChfX09TMl9WRERfXykgfHwgZGVmaW5lZChfX05UX0RSSVZFUl9fKQotCXNwcmludGYoYnVmLG1zZyxjb25kLGZpbGUsbGluZSk7Ci0JZndyaXRlKGJ1ZiwxLHN0cmxlbihidWYpLGYpOwotI2Vsc2UKLQlmcHJpbnRmKGYsbXNnLGNvbmQsZmlsZSxsaW5lKTsKLSNlbmRpZgotCWZjbG9zZShmKTsKLQl9Ci0gICAgaWYgKGZhdGFsKSB7Ci0Jc3ByaW50ZihidWYsIkNoZWNrIGZhaWxlZDogY2hlY2sgJyVzJyBmb3IgZGV0YWlscyIsIGxvZ0ZpbGUpOwotCVBNX2ZhdGFsRXJyb3IoYnVmKTsKLQl9Ci19Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotU2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIGRlYnVnIGxvZyBmaWxlLgotCi1IRUFERVI6Ci1wbWFwaS5oCi0KLVBBUkFNRVRFUlM6Ci1sb2dGaWxlUGF0aCAtIEZ1bGwgZmlsZSBhbmQgcGF0aCBuYW1lIHRvIGRlYnVnIGxvZyBmaWxlLgotCi1SRU1BUktTOgotU2V0cyB0aGUgbmFtZSBhbmQgbG9jYXRpb24gb2YgdGhlIGRlYnVnIGxvZyBmaWxlLiBUaGUgZGVidWcgbG9nIGZpbGUgaXMKLWNyZWF0ZWQgYW5kIHdyaXR0ZW4gdG8gd2hlbiBydW50aW1lIGNoZWNrcywgd2FybmluZ3MgYW5kIGZhaWx1cmUgY29uZGl0aW9ucwotYXJlIGxvZ2dlZCB0byBkaXNrIHdoZW4gY29kZSBpcyBjb21waWxlZCBpbiBDSEVDS0VEIG1vZGUuIEJ5IGRlZmF1bHQgdGhlCi1sb2cgZmlsZSBpcyBjYWxsZWQgJ3NjaXRlY2gubG9nJyBhbmQgZ29lcyBpbnRvIHRoZSBjdXJyZW50IFNjaVRlY2ggTnVjbGV1cwotcGF0aCBmb3IgdGhlIGFwcGxpY2F0aW9uLiBZb3UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIHNldCB0aGUgZmlsZW5hbWUKLWFuZCBsb2NhdGlvbiBvZiB0aGUgZGVidWcgbG9nIGZpbGUgdG8geW91ciBvd24gYXBwbGljYXRpb24gc3BlY2lmaWMKLWRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldERlYnVnTG9nKAotICAgIGNvbnN0IGNoYXIgKmxvZ0ZpbGVQYXRoKQotewotICAgIHN0cmNweShsb2dGaWxlLGxvZ0ZpbGVQYXRoKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9fZXZlbnQuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL19ldmVudC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZGNhYWIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL19ldmVudC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqCi07KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLTsqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi07KiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLTsqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotOyoKLTsqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi07KiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotOyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi07KiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyoKLTsqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqCi07KiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogTGFuZ3VhZ2U6ICAgIDgwMzg2IEFzc2VtYmxlcgotOyogRW52aXJvbm1lbnQ6IElCTSBQQyAoTVMgRE9TKQotOyoKLTsqIERlc2NyaXB0aW9uOiBBc3NlbWJseSBsYW5ndWFnZSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgZXZlbnQgbW9kdWxlLgotOyoKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgaWRlYWwKLQotaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKLQotaWZkZWYgZmxhdG1vZGVsCi0KLWhlYWRlciAgX2V2ZW50ICAgICAgICAgICAgICAgICAgOyBTZXQgdXAgbWVtb3J5IG1vZGVsCi0KLWJlZ2RhdGFzZWcgIF9ldmVudAotCi0gICAgY2V4dGVybiAgX0VWVF9iaW9zUHRyLERQVFIKLQotaWZkZWYgICBVU0VfTkFTTQotJWRlZmluZSBLQl9IRUFEICAgICBXT1JEIGVzaSswMUFoICAgOyBLZXlib2FyZCBidWZmZXIgaGVhZCBpbiBCSU9TIGRhdGEgYXJlYQotJWRlZmluZSBLQl9UQUlMICAgICBXT1JEIGVzaSswMUNoICAgOyBLZXlib2FyZCBidWZmZXIgdGFpbCBpbiBCSU9TIGRhdGEgYXJlYQotJWRlZmluZSBLQl9TVEFSVCAgICBXT1JEIGVzaSswODBoICAgOyBTdGFydCBvZiBrZXlib2FyZCBidWZmZXIgaW4gQklPUyBkYXRhIGFyZWEKLSVkZWZpbmUgS0JfRU5EICAgICAgV09SRCBlc2krMDgyaCAgIDsgRW5kIG9mIGtleWJvYXJkIGJ1ZmZlciBpbiBCSU9TIGRhdGEgYXJlYQotZWxzZQotS0JfSEVBRCAgICAgRVFVIFdPUkQgZXNpKzAxQWggICAgICAgOyBLZXlib2FyZCBidWZmZXIgaGVhZCBpbiBCSU9TIGRhdGEgYXJlYQotS0JfVEFJTCAgICAgRVFVIFdPUkQgZXNpKzAxQ2ggICAgICAgOyBLZXlib2FyZCBidWZmZXIgdGFpbCBpbiBCSU9TIGRhdGEgYXJlYQotS0JfU1RBUlQgICAgRVFVIFdPUkQgZXNpKzA4MGggICAgICAgOyBTdGFydCBvZiBrZXlib2FyZCBidWZmZXIgaW4gQklPUyBkYXRhIGFyZWEKLUtCX0VORCAgICAgIEVRVSBXT1JEIGVzaSswODJoICAgICAgIDsgRW5kIG9mIGtleWJvYXJkIGJ1ZmZlciBpbiBCSU9TIGRhdGEgYXJlYQotZW5kaWYKLQotZW5kZGF0YXNlZyAgX2V2ZW50Ci0KLWJlZ2NvZGVzZWcgIF9ldmVudCAgICAgICAgICAgICAgOyBTdGFydCBvZiBjb2RlIHNlZ21lbnQKLQotICAgIGNwdWJsaWMgX0VWVF9jb2RlU3RhcnQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50IF9FVlRfZ2V0S2V5Q29kZSh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmV0dXJucyB0aGUga2V5IGNvZGUgZm9yIHRoZSBuZXh0IGF2YWlsYWJsZSBrZXkgYnkgZXh0cmFjdGluZyBpdCBmcm9tCi07IHRoZSBCSU9TIGtleWJvYXJkIGJ1ZmZlci4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfRVZUX2dldEtleUNvZGUKLQotICAgICAgICBlbnRlcl9jCi0KLSAgICAgICAgbW92ICAgICBlc2ksW19FVlRfYmlvc1B0cl0KLSAgICAgICAgeG9yICAgICBlYngsZWJ4Ci0gICAgICAgIHhvciAgICAgZWF4LGVheAotICAgICAgICBtb3YgICAgIGJ4LFtLQl9IRUFEXQotICAgICAgICBjbXAgICAgIGJ4LFtLQl9UQUlMXQotICAgICAgICBqeiAgICAgIEBARG9uZQotICAgICAgICB4b3IgICAgIGVheCxlYXgKLSAgICAgICAgbW92ICAgICBheCxbZXNpK2VieF0gICAgOyBFQVggOj0gY2hhcmFjdGVyIGZyb20ga2V5Ym9hcmQgYnVmZmVyCi0gICAgICAgIGluYyAgICAgX2J4Ci0gICAgICAgIGluYyAgICAgX2J4Ci0gICAgICAgIGNtcCAgICAgYngsW0tCX0VORF0gICAgIDsgSGl0IHRoZSBlbmQgb2YgdGhlIGtleWJvYXJkIGJ1ZmZlcj8KLSAgICAgICAgamwgICAgICBAQDEKLSAgICAgICAgbW92ICAgICBieCxbS0JfU1RBUlRdCi1AQDE6ICAgIG1vdiAgICAgW0tCX0hFQURdLGJ4ICAgIDsgVXBkYXRlIGtleWJvYXJkIGJ1ZmZlciBoZWFkIHBvaW50ZXIKLQotQEBEb25lOiBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9FVlRfcHVtcE1lc3NhZ2VzKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBUaGlzIGZ1bmN0aW9uIHdvdWxkIG5vcm1hbGx5IGRvIG5vdGhpbmcsIGhvd2V2ZXIgZHVlIHRvIHN0cmFuZ2UgYnVncwotOyBpbiB0aGUgV2luZG93cyAzLjEgYW5kIE9TLzIgRE9TIGJveGVzLCB3ZSBkb24ndCBnZXQgYW55IGhhcmR3YXJlIGtleWJvYXJkCi07IGludGVycnVwdHMgdW5sZXNzIHdlIHBlcmlvZGljYWxseSBjYWxsIHRoZSBCSU9TIGtleWJvYXJkIGZ1bmN0aW9ucy4gSGVuY2UKLTsgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCBldmVyeSB0aW1lIHRoYXQgd2UgY2hlY2sgZm9yIGV2ZW50cywgYW5kIHdvcmtzCi07IGFyb3VuZCB0aGlzIHByb2JsZW0gKGluIGVzc2VuY2UgaXQgdGVsbHMgdGhlIERPUyBWRE0gdG8gcHVtcCB0aGUKLTsga2V5Ym9hcmQgZXZlbnRzIHRvIG91ciBwcm9ncmFtIDstKS4KLTsKLTsgTm90ZSB0aGF0IHRoaXMgYnVnIGlzIG5vdCBwcmVzZW50IHVuZGVyIFdpbiA5eCBET1MgYm94ZXMuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX0VWVF9wdW1wTWVzc2FnZXMKLQotICAgICAgICBtb3YgICAgIGFoLDExaCAgICAgICAgICA7IEZ1bmN0aW9uIC0gQ2hlY2sga2V5Ym9hcmQgc3RhdHVzCi0gICAgICAgIGludCAgICAgMTZoICAgICAgICAgICAgIDsgQ2FsbCBCSU9TCi0gICAgICAgIAotICAgICAgICBtb3YgICAgIGF4LCAwQmggICAgICAgICA7IFJlc2V0IE1vdmUgTW91c2UKLSAgICAgICAgaW50ICAgICAzM2gKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBfRVZUX2Rpc2FibGVJbnQodm9pZCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZXR1cm4gcHJvY2Vzc29yIGludGVycnVwdCBzdGF0dXMgYW5kIGRpc2FibGUgaW50ZXJydXB0cy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfRVZUX2Rpc2FibGVJbnQKLQotICAgICAgICBwdXNoZiAgICAgICAgICAgICAgICAgICA7IFB1dCBmbGFnIHdvcmQgb24gc3RhY2sKLSAgICAgICAgY2xpICAgICAgICAgICAgICAgICAgICAgOyBEaXNhYmxlIGludGVycnVwdHMhCi0gICAgICAgIHBvcCAgICAgZWF4ICAgICAgICAgICAgIDsgZGVwb3NpdCBmbGFnIHdvcmQgaW4gcmV0dXJuIHJlZ2lzdGVyCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9FVlRfcmVzdG9yZUludChpbnQgcHMpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVzdG9yZSBwcm9jZXNzb3IgaW50ZXJydXB0IHN0YXR1cy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfRVZUX3Jlc3RvcmVJbnQKLQotICAgICAgICBBUkcgICAgIHBzOlVJTlQKLQotICAgICAgICBwdXNoICAgIGVicAotICAgICAgICBtb3YgICAgIGVicCxlc3AgICAgICAgICA7IFNldCB1cCBzdGFjayBmcmFtZQotICAgICAgICBwdXNoICAgIFtEV09SRCBwc10KLSAgICAgICAgcG9wZiAgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIHByb2Nlc3NvciBzdGF0dXMgKGFuZCBpbnRlcnJ1cHRzKQotICAgICAgICBwb3AgICAgIGVicAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50IEVWVF9yZGlueChpbnQgcG9ydCxpbnQgaW5kZXgpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZWFkcyBhbiBpbmRleGVkIHJlZ2lzdGVyIHZhbHVlIGZyb20gYW4gSS9PIHBvcnQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgRVZUX3JkaW54Ci0KLSAgICAgICAgQVJHICAgICBwb3J0OlVJTlQsIGluZGV4OlVJTlQKLQotICAgICAgICBwdXNoICAgIGVicAotICAgICAgICBtb3YgICAgIGVicCxlc3AKLSAgICAgICAgbW92ICAgICBlZHgsW3BvcnRdCi0gICAgICAgIG1vdiAgICAgYWwsW0JZVEUgaW5kZXhdCi0gICAgICAgIG91dCAgICAgZHgsYWwKLSAgICAgICAgaW5jICAgICBkeAotICAgICAgICBpbiAgICAgIGFsLGR4Ci0gICAgICAgIG1vdnp4ICAgZWF4LGFsCi0gICAgICAgIHBvcCAgICAgZWJwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIEVWVF93cmlueChpbnQgcG9ydCxpbnQgaW5kZXgsaW50IHZhbHVlKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgV3JpdGVzIGFuIGluZGV4ZWQgcmVnaXN0ZXIgdmFsdWUgdG8gYW4gSS9PIHBvcnQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgRVZUX3dyaW54Ci0KLSAgICAgICAgQVJHICAgICBwb3J0OlVJTlQsIGluZGV4OlVJTlQsIHZhbHVlOlVJTlQKLQotICAgICAgICBwdXNoICAgIGVicAotICAgICAgICBtb3YgICAgIGVicCxlc3AKLSAgICAgICAgbW92ICAgICBlZHgsW3BvcnRdCi0gICAgICAgIG1vdiAgICAgYWwsW0JZVEUgaW5kZXhdCi0gICAgICAgIG1vdiAgICAgYWgsW0JZVEUgdmFsdWVdCi0gICAgICAgIG91dCAgICAgZHgsYXgKLSAgICAgICAgcG9wICAgICBlYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLSAgICBjcHVibGljIF9FVlRfY29kZUVuZAotCi1lbmRjb2Rlc2VnICBfZXZlbnQKLQotZW5kaWYKLQotICAgICAgICBFTkQgICAgICAgICAgICAgICAgICAgICAgICAgOyBFbmQgb2YgbW9kdWxlCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvX2x6dGltZXIuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL19senRpbWVyLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRhOWM3OS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvX2x6dGltZXIuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNDM4ICswLDAgQEAKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KgotOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLTsqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi07KiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLTsqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotOyoKLTsqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi07KiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotOyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi07KiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyoKLTsqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqCi07KiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogTGFuZ3VhZ2U6ICAgIE5BU00gb3IgVEFTTSBBc3NlbWJsZXIKLTsqIEVudmlyb25tZW50OiBJQk0gUEMgKE1TIERPUykKLTsqCi07KiBEZXNjcmlwdGlvbjogVXNlcyB0aGUgODI1MyB0aW1lciBhbmQgdGhlIEJJT1MgdGltZS1vZi1kYXkgY291bnQgdG8gdGltZQotOyogICAgICAgICAgICAgIHRoZSBwZXJmb3JtYW5jZSBvZiBjb2RlIHRoYXQgdGFrZXMgbGVzcyB0aGFuIGFuIGhvdXIgdG8KLTsqICAgICAgICAgICAgICBleGVjdXRlLgotOyoKLTsqICAgICAgICAgICAgICBUaGUgcm91dGluZXMgaW4gdGhpcyBwYWNrYWdlIG9ubHkgd29ya3Mgd2l0aCBpbnRlcnJ1cHRzCi07KiAgICAgICAgICAgICAgZW5hYmxlZCwgYW5kIGluIGZhY3Qgd2lsbCBleHBsaWNpdGx5IHR1cm4gaW50ZXJydXB0cyBvbgotOyogICAgICAgICAgICAgIGluIG9yZGVyIHRvIGVuc3VyZSB3ZSBnZXQgYWNjdXJhdGUgcmVzdWx0cyBmcm9tIHRoZSB0aW1lci4KLTsqCi07KiAgRXh0ZXJuYWxseSAnQycgY2FsbGFibGUgcm91dGluZXM6Ci07KgotOyogIExaX3RpbWVyT246ICAgICBTYXZlcyB0aGUgQklPUyB0aW1lIG9mIGRheSBjb3VudCBhbmQgc3RhcnRzIHRoZQotOyogICAgICAgICAgICAgICAgICBsb25nIHBlcmlvZCBaZW4gVGltZXIuCi07KgotOyogIExaX3RpbWVyTGFwOiAgICBMYXRjaGVzIHRoZSBjdXJyZW50IGNvdW50LCBhbmQga2VlcHMgdGhlIHRpbWVyIHJ1bm5pbmcKLTsqCi07KiAgTFpfdGltZXJPZmY6ICAgIFN0b3BzIHRoZSBsb25nLXBlcmlvZCBaZW4gVGltZXIgYW5kIHNhdmVzIHRoZSB0aW1lcgotOyogICAgICAgICAgICAgICAgICBjb3VudCBhbmQgdGhlIEJJT1MgdGltZSBvZiBkYXkgY291bnQuCi07KgotOyogIExaX3RpbWVyQ291bnQ6ICBSZXR1cm5zIGFuIHVuc2lnbmVkIGxvbmcgcmVwcmVzZW50aW5nIHRoZSB0aW1lZCBjb3VudAotOyogICAgICAgICAgICAgICAgICBpbiBtaWNyb3NlY29uZHMuIElmIG1vcmUgdGhhbiBhbiBob3VyIHBhc3NlZCBkdXJpbmcKLTsqICAgICAgICAgICAgICAgICAgdGhlIHRpbWluZyBpbnRlcnZhbCwgTFpfdGltZXJDb3VudCB3aWxsIHJldHVybiB0aGUKLTsqICAgICAgICAgICAgICAgICAgdmFsdWUgMHhGRkZGRkZGRiAoYW4gaW52YWxpZCBjb3VudCkuCi07KgotOyogIE5vdGU6ICAgSWYgZWl0aGVyIG1vcmUgdGhhbiBhbiBob3VyIHBhc3NlcyBiZXR3ZWVuIGNhbGxzIHRvIExaX3RpbWVyT24KLTsqICAgICAgICAgIGFuZCBMWl90aW1lck9mZiwgYW4gZXJyb3IgaXMgcmVwb3J0ZWQuIEZvciB0aW1pbmcgY29kZSB0aGF0IHRha2VzCi07KiAgICAgICAgICBtb3JlIHRoYW4gYSBmZXcgbWludXRlcyB0byBleGVjdXRlLCB1c2UgdGhlIGxvdyByZXNvbHV0aW9uCi07KiAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBaZW4gVGltZXIgY29kZSwgd2hpY2ggc2hvdWxkIGJlIGFjY3VyYXRlCi07KiAgICAgICAgICBlbm91Z2ggZm9yIG1vc3QgcHVycG9zZXMuCi07KgotOyogIE5vdGU6ICAgRWFjaCBibG9jayBvZiBjb2RlIGJlaW5nIHRpbWVkIHNob3VsZCBpZGVhbGx5IGJlIHJ1biBzZXZlcmFsCi07KiAgICAgICAgICB0aW1lcywgd2l0aCBhdCBsZWFzdCB0d28gc2ltaWxhciByZWFkaW5ncyByZXF1aXJlZCB0bwotOyogICAgICAgICAgZXN0YWJsaXNoIGEgdHJ1ZSBtZWFzdXJlbWVudCwgaW4gb3JkZXIgdG8gZWxpbWluYXRlIGFueQotOyogICAgICAgICAgdmFyaWFiaWxpdHkgY2F1c2VkIGJ5IGludGVycnVwdHMuCi07KgotOyogIE5vdGU6ICAgSW50ZXJydXB0cyBtdXN0IG5vdCBiZSBkaXNhYmxlZCBmb3IgbW9yZSB0aGFuIDU0IG1zIGF0IGEKLTsqICAgICAgICAgIHN0cmV0Y2ggZHVyaW5nIHRoZSB0aW1pbmcgaW50ZXJ2YWwuIEJlY2F1c2UgaW50ZXJydXB0cyBhcmUKLTsqICAgICAgICAgIGVuYWJsZWQsIGtleSwgbWljZSwgYW5kIG90aGVyIGRldmljZXMgdGhhdCBnZW5lcmF0ZSBpbnRlcnJ1cHRzCi07KiAgICAgICAgICBzaG91bGQgbm90IGJlIHVzZWQgZHVyaW5nIHRoZSB0aW1pbmcgaW50ZXJ2YWwuCi07KgotOyogIE5vdGU6ICAgQW55IGV4dHJhIGNvZGUgcnVubmluZyBvZmYgdGhlIHRpbWVyIGludGVycnVwdCAoc3VjaCBhcwotOyogICAgICAgICAgc29tZSBtZW1vcnkgcmVzaWRlbnQgdXRpbGl0aWVzKSB3aWxsIGluY3JlYXNlIHRoZSB0aW1lCi07KiAgICAgICAgICBtZWFzdXJlZCBieSB0aGUgWmVuIFRpbWVyLgotOyoKLTsqICBOb3RlOiAgIFRoZXNlIHJvdXRpbmVzIGNhbiBpbnRyb2R1Y2UgaW5hY2N1cmFjaWVzIG9mIHVwIHRvIGEgZmV3Ci07KiAgICAgICAgICB0ZW50aHMgb2YgYSBzZWNvbmQgaW50byB0aGUgc3lzdGVtIGNsb2NrIGNvdW50IGZvciBlYWNoCi07KiAgICAgICAgICBjb2RlIHNlY3Rpb24gYmVpbmcgdGltZWQuIENvbnNlcXVlbnRseSwgaXQncyBhIGdvb2QgaWRlYSB0bwotOyogICAgICAgICAgcmVib290IGF0IHRoZSBjb25jbHVzaW9uIG9mIHRpbWluZyBzZXNzaW9ucy4gKFRoZQotOyogICAgICAgICAgYmF0dGVyeS1iYWNrZWQgY2xvY2ssIGlmIGFueSwgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSBaZW4KLTsqICAgICAgICAgIHRpbWVyLikKLTsqCi07KiAgQWxsIHJlZ2lzdGVycyBhbmQgYWxsIGZsYWdzIGFyZSBwcmVzZXJ2ZWQgYnkgYWxsIHJvdXRpbmVzLCBleGNlcHQKLTsqICBpbnRlcnJ1cHRzIHdoaWNoIGFyZSBhbHdheXMgdHVybmVkIG9uCi07KgotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICBJREVBTAotCi1pbmNsdWRlICJzY2l0ZWNoLm1hYyIKLQotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsKLTsgRXF1YXRlcyB1c2VkIGJ5IGxvbmcgcGVyaW9kIFplbiBUaW1lcgotOwotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotOyBCYXNlIGFkZHJlc3Mgb2YgODI1MyB0aW1lciBjaGlwCi0KLUJBU0VfODI1MyAgICAgICBlcXUgICAgIDQwaAotCi07IFRoZSBhZGRyZXNzIG9mIHRoZSB0aW1lciAwIGNvdW50IHJlZ2lzdGVycyBpbiB0aGUgODI1MwotCi1USU1FUl8wXzgyNTMgICAgZXF1ICAgICBCQVNFXzgyNTMgKyAwCi0KLTsgVGhlIGFkZHJlc3Mgb2YgdGhlIG1vZGUgcmVnaXN0ZXIgaW4gdGhlIDgyNTMKLQotTU9ERV84MjUzICAgICAgIGVxdSAgICAgQkFTRV84MjUzICsgMwotCi07IFRoZSBhZGRyZXNzIG9mIHRoZSBCSU9TIHRpbWVyIGNvdW50IHZhcmlhYmxlIGluIHRoZSBCSU9TIGRhdGEgYXJlYS4KLQotVElNRVJfQ09VTlQgICAgIGVxdSAgICAgNkNoCi0KLTsgTWFjcm8gdG8gZGVsYXkgYnJpZWZseSB0byBlbnN1cmUgdGhhdCBlbm91Z2ggdGltZSBoYXMgZWxhcHNlZCBiZXR3ZWVuCi07IHN1Y2Nlc3NpdmUgSS9PIGFjY2Vzc2VzIHNvIHRoYXQgdGhlIGRldmljZSBiZWluZyBhY2Nlc3NlZCBjYW4gcmVzcG9uZAotOyB0byBib3RoIGFjY2Vzc2VzIGV2ZW4gb24gYSB2ZXJ5IGZhc3QgUEMuCi0KLWlmZGVmICAgVVNFX05BU00KLSVtYWNybyAgREVMQVkgMAotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotJWVuZG1hY3JvCi1lbHNlCi1tYWNybyAgIERFTEFZCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi1lbmRtCi1lbmRpZgotCi1oZWFkZXIgICAgICBfbHp0aW1lcgotCi1iZWdkYXRhc2VnICBfbHp0aW1lcgotCi0gICAgICAgIGNleHRlcm4gIF9aVGltZXJCSU9TUHRyLERQVFIKLQotU3RhcnRCSU9TQ291bnQgICAgICBkZCAgMCAgICAgICA7IFN0YXJ0aW5nIEJJT1MgY291bnQgZHdvcmQKLUVuZEJJT1NDb3VudCAgICAgICAgZGQgIDAgICAgICAgOyBFbmRpbmcgQklPUyBjb3VudCBkd29yZAotRW5kVGltZWRDb3VudCAgICAgICBkdyAgMCAgICAgICA7IFRpbWVyIDAgY291bnQgYXQgdGhlIGVuZCBvZiB0aW1pbmcgcGVyaW9kCi0KLWVuZGRhdGFzZWcgIF9senRpbWVyCi0KLWJlZ2NvZGVzZWcgIF9senRpbWVyICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgTFpfdGltZXJPbih2b2lkKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFN0YXJ0cyB0aGUgTG9uZyBwZXJpb2QgWmVuIHRpbWVyIGNvdW50aW5nLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIExaX3RpbWVyT24KLQotOyBTZXQgdGhlIHRpbWVyIDAgb2YgdGhlIDgyNTMgdG8gbW9kZSAyIChkaXZpZGUtYnktTiksIHRvIGNhdXNlCi07IGxpbmVhciBjb3VudGluZyByYXRoZXIgdGhhbiBjb3VudC1ieS10d28gY291bnRpbmcuIEFsc28gc3RvcHMKLTsgdGltZXIgMCB1bnRpbCB0aGUgdGltZXIgY291bnQgaXMgbG9hZGVkLCBleGNlcHQgb24gUFMvMiBjb21wdXRlcnMuCi0KLSAgICAgICAgbW92ICAgICBhbCwwMDExMDEwMGIgICAgICAgIDsgbW9kZSAyCi0gICAgICAgIG91dCAgICAgTU9ERV84MjUzLGFsCi0KLTsgU2V0IHRoZSB0aW1lciBjb3VudCB0byAwLCBzbyB3ZSBrbm93IHdlIHdvbid0IGdldCBhbm90aGVyIHRpbWVyCi07IGludGVycnVwdCByaWdodCBhd2F5LiBOb3RlOiB0aGlzIGludHJvZHVjZXMgYW4gaW5hY2N1cmFjeSBvZiB1cCB0byA1NCBtcwotOyBpbiB0aGUgc3lzdGVtIGNsb2NrIGNvdW50IGVhY2ggdGltZSBpdCBpcyBleGVjdXRlZC4KLQotICAgICAgICBERUxBWQotICAgICAgICBzdWIgICAgIGFsLGFsCi0gICAgICAgIG91dCAgICAgVElNRVJfMF84MjUzLGFsICAgICA7IGxzYgotICAgICAgICBERUxBWQotICAgICAgICBvdXQgICAgIFRJTUVSXzBfODI1MyxhbCAgICAgOyBtc2IKLQotOyBTdG9yZSB0aGUgdGltaW5nIHN0YXJ0IEJJT1MgY291bnQKLQotICAgICAgICB1c2VfZXMKLWlmZGVmICAgZmxhdG1vZGVsCi0gICAgICAgIG1vdiAgICAgZWJ4LFtfWlRpbWVyQklPU1B0cl0KLWVsc2UKLSAgICAgICAgbGVzICAgICBieCxbX1pUaW1lckJJT1NQdHJdCi1lbmRpZgotICAgICAgICBjbGkgICAgICAgICAgICAgICAgICAgICAgICAgOyBObyBpbnRlcnJ1cHRzIHdoaWxlIHdlIGdyYWIgdGhlIGNvdW50Ci0gICAgICAgIG1vdiAgICAgZWF4LFtfRVMgX2J4K1RJTUVSX0NPVU5UXQotICAgICAgICBzdGkKLSAgICAgICAgbW92ICAgICBbU3RhcnRCSU9TQ291bnRdLGVheAotICAgICAgICB1bnVzZV9lcwotCi07IFNldCB0aGUgdGltZXIgY291bnQgdG8gMCBhZ2FpbiB0byBzdGFydCB0aGUgdGltaW5nIGludGVydmFsLgotCi0gICAgICAgIG1vdiAgICAgYWwsMDAxMTAxMDBiICAgICAgICA7IHNldCB1cCB0byBsb2FkIGluaXRpYWwKLSAgICAgICAgb3V0ICAgICBNT0RFXzgyNTMsYWwgICAgICAgIDsgdGltZXIgY291bnQKLSAgICAgICAgREVMQVkKLSAgICAgICAgc3ViICAgICBhbCxhbAotICAgICAgICBvdXQgICAgIFRJTUVSXzBfODI1MyxhbCAgICAgOyBsb2FkIGNvdW50IGxzYgotICAgICAgICBERUxBWQotICAgICAgICBvdXQgICAgIFRJTUVSXzBfODI1MyxhbCAgICAgOyBsb2FkIGNvdW50IG1zYgotCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIExaX3RpbWVyT2ZmKHZvaWQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgU3RvcHMgdGhlIGxvbmcgcGVyaW9kIFplbiB0aW1lciBhbmQgc2F2ZXMgY291bnQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgTFpfdGltZXJPZmYKLQotOyBMYXRjaCB0aGUgdGltZXIgY291bnQuCi0KLSAgICAgICAgbW92ICAgICBhbCwwMDAwMDAwMGIgICAgICAgIDsgbGF0Y2ggdGltZXIgMAotICAgICAgICBvdXQgICAgIE1PREVfODI1MyxhbAotICAgICAgICBjbGkgICAgICAgICAgICAgICAgICAgICAgICAgOyBTdG9wIHRoZSBCSU9TIGNvdW50Ci0KLTsgUmVhZCB0aGUgQklPUyBjb3VudC4gKFNpbmNlIGludGVycnVwdHMgYXJlIGRpc2FibGVkLCB0aGUgQklPUwotOyBjb3VudCB3b24ndCBjaGFuZ2UpLgotCi0gICAgICAgIHVzZV9lcwotaWZkZWYgICBmbGF0bW9kZWwKLSAgICAgICAgbW92ICAgICBlYngsW19aVGltZXJCSU9TUHRyXQotZWxzZQotICAgICAgICBsZXMgICAgIGJ4LFtfWlRpbWVyQklPU1B0cl0KLWVuZGlmCi0gICAgICAgIG1vdiAgICAgZWF4LFtfRVMgX2J4K1RJTUVSX0NPVU5UXQotICAgICAgICBtb3YgICAgIFtFbmRCSU9TQ291bnRdLGVheAotICAgICAgICB1bnVzZV9lcwotCi07IFJlYWQgb3V0IHRoZSBjb3VudCB3ZSBsYXRjaGVkIGVhcmxpZXIuCi0KLSAgICAgICAgaW4gICAgICBhbCxUSU1FUl8wXzgyNTMgICAgIDsgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZQotICAgICAgICBERUxBWQotICAgICAgICBtb3YgICAgIGFoLGFsCi0gICAgICAgIGluICAgICAgYWwsVElNRVJfMF84MjUzICAgICA7IG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZQotICAgICAgICB4Y2hnICAgIGFoLGFsCi0gICAgICAgIG5lZyAgICAgYXggICAgICAgICAgICAgICAgICA7IENvbnZlcnQgZnJvbSBjb3VudGRvd24gcmVtYWluaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ICB0byBlbGFwc2VkIGNvdW50Ci0gICAgICAgIG1vdiAgICAgW0VuZFRpbWVkQ291bnRdLGF4Ci0gICAgICAgIHN0aSAgICAgICAgICAgICAgICAgICAgICAgICA7IExldCB0aGUgQklPUyBjb3VudCBjb250aW51ZQotCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1bnNpZ25lZCBsb25nIExaX3RpbWVyTGFwKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBMYXRjaGVzIHRoZSBjdXJyZW50IGNvdW50IGFuZCBjb252ZXJ0cyBpdCB0byBhIG1pY3Jvc2Vjb25kIHRpbWluZyB2YWx1ZSwKLTsgYnV0IGxlYXZlcyB0aGUgdGltZXIgc3RpbGwgcnVubmluZy4gV2UgZG9udCBjaGVjayBmb3IgYW5kIG92ZXJmbG93LAotOyB3aGVyZSB0aGUgdGltZSBoYXMgZ29uZSBvdmVyIGFuIGhvdXIgaW4gdGhpcyByb3V0aW5lLCBzaW5jZSB3ZSB3YW50IGl0Ci07IHRvIGV4ZWN1dGUgYXMgZmFzdCBhcyBwb3NzaWJsZS4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBMWl90aW1lckxhcAotCi0gICAgICAgIHB1c2ggICAgZWJ4ICAgICAgICAgICAgICAgICA7IFNhdmUgRUJYIGZvciAzMiBiaXQgY29kZQotCi07IExhdGNoIHRoZSB0aW1lciBjb3VudC4KLQotICAgICAgICBtb3YgICAgIGFsLDAwMDAwMDAwYiAgICAgICAgOyBsYXRjaCB0aW1lciAwCi0gICAgICAgIG91dCAgICAgTU9ERV84MjUzLGFsCi0gICAgICAgIGNsaSAgICAgICAgICAgICAgICAgICAgICAgICA7IFN0b3AgdGhlIEJJT1MgY291bnQKLQotOyBSZWFkIHRoZSBCSU9TIGNvdW50LiAoU2luY2UgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQsIHRoZSBCSU9TCi07IGNvdW50IHdvbnQgY2hhbmdlKS4KLQotICAgICAgICB1c2VfZXMKLWlmZGVmICAgZmxhdG1vZGVsCi0gICAgICAgIG1vdiAgICAgZWJ4LFtfWlRpbWVyQklPU1B0cl0KLWVsc2UKLSAgICAgICAgbGVzICAgICBieCxbX1pUaW1lckJJT1NQdHJdCi1lbmRpZgotICAgICAgICBtb3YgICAgIGVheCxbX0VTIF9ieCtUSU1FUl9DT1VOVF0KLSAgICAgICAgbW92ICAgICBbRW5kQklPU0NvdW50XSxlYXgKLSAgICAgICAgdW51c2VfZXMKLQotOyBSZWFkIG91dCB0aGUgY291bnQgd2UgbGF0Y2hlZCBlYXJsaWVyLgotCi0gICAgICAgIGluICAgICAgYWwsVElNRVJfMF84MjUzICAgICA7IGxlYXN0IHNpZ25pZmljYW50IGJ5dGUKLSAgICAgICAgREVMQVkKLSAgICAgICAgbW92ICAgICBhaCxhbAotICAgICAgICBpbiAgICAgIGFsLFRJTUVSXzBfODI1MyAgICAgOyBtb3N0IHNpZ25pZmljYW50IGJ5dGUKLSAgICAgICAgeGNoZyAgICBhaCxhbAotICAgICAgICBuZWcgICAgIGF4ICAgICAgICAgICAgICAgICAgOyBDb252ZXJ0IGZyb20gY291bnRkb3duIHJlbWFpbmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAgdG8gZWxhcHNlZCBjb3VudAotICAgICAgICBtb3YgICAgIFtFbmRUaW1lZENvdW50XSxheAotICAgICAgICBzdGkgICAgICAgICAgICAgICAgICAgICAgICAgOyBMZXQgdGhlIEJJT1MgY291bnQgY29udGludWUKLQotOyBTZWUgaWYgYSBtaWRuaWdodCBib3VuZGFyeSBoYXMgcGFzc2VkIGFuZCBhZGp1c3QgdGhlIGZpbmlzaGluZyBCSU9TCi07IGNvdW50IGJ5IHRoZSBudW1iZXIgb2YgdGlja3MgaW4gMjQgaG91cnMuIFdlIHdvbnQgYmUgYWJsZSB0byBkZXRlY3QKLTsgbW9yZSB0aGFuIDI0IGhvdXJzLCBidXQgYXQgbGVhc3Qgd2UgY2FuIHRpbWUgYWNyb3NzIGEgbWlkbmlnaHQKLTsgYm91bmRhcnkKLQotICAgICAgICBtb3YgICAgIGVheCxbRW5kQklPU0NvdW50XSAgICAgIDsgSXMgZW5kIDwgc3RhcnQ/Ci0gICAgICAgIGNtcCAgICAgZWF4LFtTdGFydEJJT1NDb3VudF0KLSAgICAgICAgamFlICAgICBAQENhbGNCSU9TVGltZSAgICAgICAgICA7IE5vLCBjYWxjdWxhdGUgdGhlIHRpbWUgdGFrZW4KLQotOyBBZGp1c3QgdGhlIGZpbmlzaGluZyB0aW1lIGJ5IGFkZGluZyB0aGUgbnVtYmVyIG9mIHRpY2tzIGluIDI0IGhvdXJzCi07ICgxNTczMDQwKS4KLQotICAgICAgICBhZGQgICAgIFtEV09SRCBFbmRCSU9TQ291bnRdLDE4MDBCMGgKLQotOyBDb252ZXJ0IHRoZSBCSU9TIHRpbWUgdG8gbWljcm9zZWNvbmRzCi0KLUBAQ2FsY0JJT1NUaW1lOgotICAgICAgICBtb3YgICAgIGF4LFtXT1JEIEVuZEJJT1NDb3VudF0KLSAgICAgICAgc3ViICAgICBheCxbV09SRCBTdGFydEJJT1NDb3VudF0KLSAgICAgICAgbW92ICAgICBkeCw1NDkyNSAgICAgICAgICAgIDsgTnVtYmVyIG9mIG1pY3Jvc2Vjb25kcyBlYWNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ICBCSU9TIGNvdW50IHJlcHJlc2VudHMuCi0gICAgICAgIG11bCAgICAgZHgKLSAgICAgICAgbW92ICAgICBieCxheCAgICAgICAgICAgICAgIDsgc2V0IGFzaWRlIEJJT1MgY291bnQgaW4KLSAgICAgICAgbW92ICAgICBjeCxkeCAgICAgICAgICAgICAgIDsgIG1pY3Jvc2Vjb25kcwotCi07IENvbnZlcnQgdGltZXIgY291bnQgdG8gbWljcm9zZWNvbmRzCi0KLSAgICAgICAgcHVzaCAgICBfc2kKLSAgICAgICAgbW92ICAgICBheCxbRW5kVGltZWRDb3VudF0KLSAgICAgICAgbW92ICAgICBzaSw4MzgxCi0gICAgICAgIG11bCAgICAgc2kKLSAgICAgICAgbW92ICAgICBzaSwxMDAwMAotICAgICAgICBkaXYgICAgIHNpICAgICAgICAgICAgICAgICAgOyAqIDAuODM4MSA9ICogODM4MSAvIDEwMDAwCi0gICAgICAgIHBvcCAgICAgX3NpCi0KLTsgQWRkIHRoZSB0aW1lciBhbmQgQklPUyBjb3VudHMgdG9nZXRoZXIgdG8gZ2V0IGFuIG92ZXJhbGwgdGltZSBpbgotOyBtaWNyb3NlY29uZHMuCi0KLSAgICAgICAgYWRkICAgICBheCxieAotICAgICAgICBhZGMgICAgIGN4LDAKLWlmZGVmIGZsYXRtb2RlbAotICAgICAgICBzaGwgICAgIGVjeCwxNgotICAgICAgICBtb3YgICAgIGN4LGF4Ci0gICAgICAgIG1vdiAgICAgZWF4LGVjeCAgICAgICAgICAgICA7IEVBWCA6PSB0aW1lciBjb3VudAotZWxzZQotICAgICAgICBtb3YgICAgIGR4LGN4Ci1lbmRpZgotICAgICAgICBwb3AgICAgIGVieCAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIEVCWCBmb3IgMzIgYml0IGNvZGUKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVuc2lnbmVkIGxvbmcgTFpfdGltZXJDb3VudCh2b2lkKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJldHVybnMgYW4gdW5zaWduZWQgbG9uZyByZXByZXNlbnRpbmcgdGhlIG5ldCB0aW1lIGluIG1pY3Jvc2Vjb25kcy4KLTsKLTsgSWYgYW4gaG91ciBoYXMgcGFzc2VkIHdoaWxlIHRpbWluZywgd2UgcmV0dXJuIDB4RkZGRkZGRkYgYXMgdGhlIGNvdW50Ci07ICh3aGljaCBpcyBub3QgYSBwb3NzaWJsZSBjb3VudCBpbiBpdHNlbGYpLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIExaX3RpbWVyQ291bnQKLQotICAgICAgICBwdXNoICAgIGVieCAgICAgICAgICAgICAgICAgOyBTYXZlIEVCWCBmb3IgMzIgYml0IGNvZGUKLQotOyBTZWUgaWYgYSBtaWRuaWdodCBib3VuZGFyeSBoYXMgcGFzc2VkIGFuZCBhZGp1c3QgdGhlIGZpbmlzaGluZyBCSU9TCi07IGNvdW50IGJ5IHRoZSBudW1iZXIgb2YgdGlja3MgaW4gMjQgaG91cnMuIFdlIHdvbnQgYmUgYWJsZSB0byBkZXRlY3QKLTsgbW9yZSB0aGFuIDI0IGhvdXJzLCBidXQgYXQgbGVhc3Qgd2UgY2FuIHRpbWUgYWNyb3NzIGEgbWlkbmlnaHQKLTsgYm91bmRhcnkKLQotICAgICAgICBtb3YgICAgIGVheCxbRW5kQklPU0NvdW50XSAgICAgIDsgSXMgZW5kIDwgc3RhcnQ/Ci0gICAgICAgIGNtcCAgICAgZWF4LFtTdGFydEJJT1NDb3VudF0KLSAgICAgICAgamFlICAgICBAQENoZWNrRm9ySG91ciAgICAgICAgICA7IE5vLCBjaGVjayBmb3IgaG91ciBwYXNzaW5nCi0KLTsgQWRqdXN0IHRoZSBmaW5pc2hpbmcgdGltZSBieSBhZGRpbmcgdGhlIG51bWJlciBvZiB0aWNrcyBpbiAyNCBob3VycwotOyAoMTU3MzA0MCkuCi0KLSAgICAgICAgYWRkICAgICBbRFdPUkQgRW5kQklPU0NvdW50XSwxODAwQjBoCi0KLTsgU2VlIGlmIG1vcmUgdGhhbiBhbiBob3VyIHBhc3NlZCBkdXJpbmcgdGltaW5nLiBJZiBzbywgbm90aWZ5IHRoZSB1c2VyLgotCi1AQENoZWNrRm9ySG91cjoKLSAgICAgICAgbW92ICAgICBheCxbV09SRCBTdGFydEJJT1NDb3VudCsyXQotICAgICAgICBjbXAgICAgIGF4LFtXT1JEIEVuZEJJT1NDb3VudCsyXQotICAgICAgICBqeiAgICAgIEBAQ2FsY0JJT1NUaW1lICAgICAgOyBIb3VyIGNvdW50IGRpZG4ndCBjaGFuZ2UsIHNvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ICBldmVyeXRoaW5nIGlzIGZpbmUKLQotICAgICAgICBpbmMgICAgIGF4Ci0gICAgICAgIGNtcCAgICAgYXgsW1dPUkQgRW5kQklPU0NvdW50KzJdCi0gICAgICAgIGpueiAgICAgQEBUZXN0VG9vTG9uZyAgICAgICA7IFR3byBob3VyIGJvdW5kYXJpZXMgcGFzc2VkLCBzbyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgIHJlc3VsdHMgYXJlIG5vIGdvb2QKLSAgICAgICAgbW92ICAgICBheCxbV09SRCBFbmRCSU9TQ291bnRdCi0gICAgICAgIGNtcCAgICAgYXgsW1dPUkQgU3RhcnRCSU9TQ291bnRdCi0gICAgICAgIGpiICAgICAgQEBDYWxjQklPU1RpbWUgICAgICA7IGEgc2luZ2xlIGhvdXIgYm91bmRhcnkgcGFzc2VkLiBUaGF0J3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgT0ssIHNvIGxvbmcgYXMgdGhlIHRvdGFsIHRpbWUgd2Fzbid0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IG1vcmUgdGhhbiBhbiBob3VyLgotCi07IE92ZXIgYW4gaG91ciBlbGFwc2VkIHBhc3NlZCBkdXJpbmcgdGltaW5nLCB3aGljaCByZW5kZXJzCi07IHRoZSByZXN1bHRzIGludmFsaWQuIE5vdGlmeSB0aGUgdXNlci4gVGhpcyBtaXNzZXMgdGhlIGNhc2Ugd2hlcmUgYQotOyBtdWx0aXBsZSBvZiAyNCBob3VycyBoYXMgcGFzc2VkLCBidXQgd2UnbGwgcmVseSBvbiB0aGUgcGVyc3BpY2FjaXR5IG9mCi07IHRoZSB1c2VyIHRvIGRldGVjdCB0aGF0IGNhc2UgOi0pLgotCi1AQFRlc3RUb29Mb25nOgotaWZkZWYgICBmbGF0bW9kZWwKLSAgICAgICAgbW92ICAgICBlYXgsMEZGRkZGRkZGaAotZWxzZQotICAgICAgICBtb3YgICAgIGF4LDBGRkZGaAotICAgICAgICBtb3YgICAgIGR4LDBGRkZGaAotZW5kaWYKLSAgICAgICAgam1wICAgICBzaG9ydCBAQERvbmUKLQotOyBDb252ZXJ0IHRoZSBCSU9TIHRpbWUgdG8gbWljcm9zZWNvbmRzCi0KLUBAQ2FsY0JJT1NUaW1lOgotICAgICAgICBtb3YgICAgIGF4LFtXT1JEIEVuZEJJT1NDb3VudF0KLSAgICAgICAgc3ViICAgICBheCxbV09SRCBTdGFydEJJT1NDb3VudF0KLSAgICAgICAgbW92ICAgICBkeCw1NDkyNSAgICAgICAgICAgIDsgTnVtYmVyIG9mIG1pY3Jvc2Vjb25kcyBlYWNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ICBCSU9TIGNvdW50IHJlcHJlc2VudHMuCi0gICAgICAgIG11bCAgICAgZHgKLSAgICAgICAgbW92ICAgICBieCxheCAgICAgICAgICAgICAgIDsgc2V0IGFzaWRlIEJJT1MgY291bnQgaW4KLSAgICAgICAgbW92ICAgICBjeCxkeCAgICAgICAgICAgICAgIDsgIG1pY3Jvc2Vjb25kcwotCi07IENvbnZlcnQgdGltZXIgY291bnQgdG8gbWljcm9zZWNvbmRzCi0KLSAgICAgICAgcHVzaCAgICBfc2kKLSAgICAgICAgbW92ICAgICBheCxbRW5kVGltZWRDb3VudF0KLSAgICAgICAgbW92ICAgICBzaSw4MzgxCi0gICAgICAgIG11bCAgICAgc2kKLSAgICAgICAgbW92ICAgICBzaSwxMDAwMAotICAgICAgICBkaXYgICAgIHNpICAgICAgICAgICAgICAgICAgOyAqIDAuODM4MSA9ICogODM4MSAvIDEwMDAwCi0gICAgICAgIHBvcCAgICAgX3NpCi0KLTsgQWRkIHRoZSB0aW1lciBhbmQgQklPUyBjb3VudHMgdG9nZXRoZXIgdG8gZ2V0IGFuIG92ZXJhbGwgdGltZSBpbgotOyBtaWNyb3NlY29uZHMuCi0KLSAgICAgICAgYWRkICAgICBheCxieAotICAgICAgICBhZGMgICAgIGN4LDAKLWlmZGVmIGZsYXRtb2RlbAotICAgICAgICBzaGwgICAgIGVjeCwxNgotICAgICAgICBtb3YgICAgIGN4LGF4Ci0gICAgICAgIG1vdiAgICAgZWF4LGVjeCAgICAgICAgICAgICA7IEVBWCA6PSB0aW1lciBjb3VudAotZWxzZQotICAgICAgICBtb3YgICAgIGR4LGN4Ci1lbmRpZgotCi1AQERvbmU6IHBvcCAgICAgZWJ4ICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgRUJYIGZvciAzMiBiaXQgY29kZQotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotY3Byb2NzdGFydCAgIExaX2Rpc2FibGUKLSAgICAgICAgY2xpCi0gICAgICAgIHJldAotY3Byb2NlbmQKLQotY3Byb2NzdGFydCAgIExaX2VuYWJsZQotICAgICAgICBzdGkKLSAgICAgICAgcmV0Ci1jcHJvY2VuZAotCi1lbmRjb2Rlc2VnICBfbHp0aW1lcgotCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL19wbS5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvX3BtLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJiNWNmMy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvX3BtLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDY1NiArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi07KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi07KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLTsqCi07KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLTsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsqCi07KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KgotOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqIExhbmd1YWdlOiAgICA4MDM4NiBBc3NlbWJsZXIsIFRBU00gNC4wIG9yIE5BU00KLTsqIEVudmlyb25tZW50OiBJQk0gUEMgUmVhbCBtb2RlIGFuZCAxNi8zMiBiaXQgcHJvdGVjdGVkIG1vZGUKLTsqCi07KiBEZXNjcmlwdGlvbjogTG93IGxldmVsIGFzc2VtYmx5IHN1cHBvcnQgZm9yIHRoZSBQTSBsaWJyYXJ5IHNwZWNpZmljIHRvCi07KiAgICAgICAgICAgICAgTVNET1MuCi07KgotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICBJREVBTAotCi1pbmNsdWRlICJzY2l0ZWNoLm1hYyIgICAgICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKLQotaGVhZGVyICAgICAgX3BtZG9zICAgICAgICAgICAgICAgICAgOyBTZXQgdXAgbWVtb3J5IG1vZGVsCi0KLWJlZ2RhdGFzZWcgIF9wbWRvcwotCi1pZm5kZWYgIGZsYXRtb2RlbAotCi1zdHJ1YyAgIHJtcmVnc19zCi1heCAgICAgICAgICBkdyAgPwotYXhfaGlnaCAgICAgZHcgID8KLWJ4ICAgICAgICAgIGR3ICA/Ci1ieF9oaWdoICAgICBkdyAgPwotY3ggICAgICAgICAgZHcgID8KLWN4X2hpZ2ggICAgIGR3ICA/Ci1keCAgICAgICAgICBkdyAgPwotZHhfaGlnaCAgICAgZHcgID8KLXNpICAgICAgICAgIGR3ICA/Ci1zaV9oaWdoICAgICBkdyAgPwotZGkgICAgICAgICAgZHcgID8KLWRpX2hpZ2ggICAgIGR3ICA/Ci1jZmxhZyAgICAgICBkdyAgPwotY2ZsYWdfaGlnaCAgZHcgID8KLWVuZHMgICAgcm1yZWdzX3MKLVJNUkVHUyAgPSAocm1yZWdzX3MgUFRSIGVzOmJ4KQotCi1zdHJ1YyAgIHJtc3JlZ3NfcwotZXMgICAgICBkdyAgPwotY3MgICAgICBkdyAgPwotc3MgICAgICBkdyAgPwotZHMgICAgICBkdyAgPwotZW5kcyAgICBybXNyZWdzX3MKLVJNU1JFR1MgPSAocm1zcmVnc19zIFBUUiBlczpieCkKLQotZW5kaWYgICA7ICFmbGF0bW9kZWwKLQotaWZkZWYgZmxhdG1vZGVsCi0gICAgY2V4dGVybiBfUE1fc2F2ZWREUyxVU0hPUlQKLSAgICBjZXh0ZXJuIF9QTV9WWERfb2ZmLFVJTlQKLSAgICBjZXh0ZXJuIF9QTV9WWERfc2VsLFVJTlQKLWlmZGVmICAgRE9TNEdXCi0gICAgY2V4dGVybiBfUE1faGF2ZUNhdXNlV2F5LFVJTlQKLWVuZGlmCi1lbmRpZgotaW50ZWxfaWQgICAgICAgIGRiICAiR2VudWluZUludGVsIiAgOyBJbnRlbCB2ZW5kb3IgSUQKLQotUE1IRUxQX0dFVFBEQiAgICAgICBFUVUgMDAyNmgKLVBNSEVMUF9GTFVTSFRMQiAgICAgRVFVIDAwMjdoCi0KLWVuZGRhdGFzZWcgIF9wbWRvcwotCi1QNTg2Ci0KLWJlZ2NvZGVzZWcgIF9wbWRvcyAgICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLWlmbmRlZiAgZmxhdG1vZGVsCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fY2FsbFJlYWxNb2RlKHVuc2lnbmVkIHMsdW5zaWduZWQgbywgUk1SRUdTICpyZWdzLAotOyAgIFJNU1JFR1MgKnNyZWdzKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ2FsbHMgYSByZWFsIG1vZGUgcHJvY2VkdXJlLCBsb2FkaW5nIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlcnMgdmFsdWVzCi07IGZyb20gdGhlIHBhc3NlZCBpbiBzdHJ1Y3R1cmVzLiBPbmx5IHRoZSBEUyBhbmQgRVMgcmVnaXN0ZXIgYXJlIGxvYWRlZAotOyBmcm9tIHRoZSBTUkVHUyBzdHJ1Y3R1cmUuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUE1fY2FsbFJlYWxNb2RlCi0KLSAgICAgICAgQVJHICAgICBzOldPUkQsIG86V09SRCwgcmVnczpEV09SRCwgc3JlZ3M6RFdPUkQKLQotICAgICAgICBMT0NBTCAgIGFkZHI6RFdPUkQsIGJ4VmFsOldPUkQsIGVzVmFsOldPUkQsIGZsYWdzOldPUkQgPSBMb2NhbFNpemUKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIHB1c2ggICAgZHMKLSAgICAgICAgcHVzaCAgICBlcwotCi0gICAgICAgIG1vdiAgICAgYXgsW29dICAgICAgICAgICAgICA7IEJ1aWxkIHRoZSBhZGRyZXNzIHRvIGNhbGwgaW4gJ2FkZHInCi0gICAgICAgIG1vdiAgICAgW1dPUkQgYWRkcl0sYXgKLSAgICAgICAgbW92ICAgICBheCxbc10KLSAgICAgICAgbW92ICAgICBbV09SRCBhZGRyKzJdLGF4Ci0KLSAgICAgICAgbGVzICAgICBieCxbc3JlZ3NdCi0gICAgICAgIG1vdiAgICAgYXgsW1JNU1JFR1MuZHNdCi0gICAgICAgIG1vdiAgICAgZHMsYXggICAgICAgICAgICAgICA7IERTIDo9IHBhc3NlZCBpbiB2YWx1ZQotICAgICAgICBtb3YgICAgIGF4LFtSTVNSRUdTLmVzXQotICAgICAgICBtb3YgICAgIFtlc1ZhbF0sYXgKLSAgICAgICAgbGVzICAgICBieCxbcmVnc10KLSAgICAgICAgbW92ICAgICBheCxbUk1SRUdTLmJ4XQotICAgICAgICBtb3YgICAgIFtieFZhbF0sYXgKLSAgICAgICAgbW92ICAgICBheCxbUk1SRUdTLmF4XSAgICAgIDsgQVggOj0gcGFzc2VkIGluIHZhbHVlCi0gICAgICAgIG1vdiAgICAgY3gsW1JNUkVHUy5jeF0gICAgICA7IENYIDo9IHBhc3NlZCBpbiB2YWx1ZQotICAgICAgICBtb3YgICAgIGR4LFtSTVJFR1MuZHhdICAgICAgOyBEWCA6PSBwYXNzZWQgaW4gdmFsdWUKLSAgICAgICAgbW92ICAgICBzaSxbUk1SRUdTLnNpXSAgICAgIDsgU0kgOj0gcGFzc2VkIGluIHZhbHVlCi0gICAgICAgIG1vdiAgICAgZGksW1JNUkVHUy5kaV0gICAgICA7IERJIDo9IHBhc3NlZCBpbiB2YWx1ZQotICAgICAgICBwdXNoICAgIGJwCi0gICAgICAgIHB1c2ggICAgW2VzVmFsXQotICAgICAgICBwb3AgICAgIGVzICAgICAgICAgICAgICAgICAgOyBFUyA6PSBwYXNzZWQgaW4gdmFsdWUKLSAgICAgICAgbW92ICAgICBieCxbYnhWYWxdICAgICAgICAgIDsgQlggOj0gcGFzc2VkIGluIHZhbHVlCi0KLSAgICAgICAgY2FsbCAgICBbYWRkcl0gICAgICAgICAgICAgIDsgQ2FsbCB0aGUgc3BlY2lmaWVkIHJvdXRpbmUKLQotICAgICAgICBwdXNoZiAgICAgICAgICAgICAgICAgICAgICAgOyBTYXZlIGZsYWdzIGZvciBsYXRlcgotICAgICAgICBwb3AgICAgIFtmbGFnc10KLQotICAgICAgICBwb3AgICAgIGJwCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgcG9wICAgICBbZXNWYWxdCi0gICAgICAgIHB1c2ggICAgYngKLSAgICAgICAgcG9wICAgICBbYnhWYWxdCi0gICAgICAgIGxlcyAgICAgYngsW3NyZWdzXQotICAgICAgICBwdXNoICAgIGRzCi0gICAgICAgIHBvcCAgICAgW1JNU1JFR1MuZHNdICAgICAgICA7IFNhdmUgdmFsdWUgb2YgRFMKLSAgICAgICAgcHVzaCAgICBbZXNWYWxdCi0gICAgICAgIHBvcCAgICAgW1JNU1JFR1MuZXNdICAgICAgICA7IFNhdmUgdmFsdWUgb2YgRVMKLSAgICAgICAgbGVzICAgICBieCxbcmVnc10KLSAgICAgICAgbW92ICAgICBbUk1SRUdTLmF4XSxheCAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBBWAotICAgICAgICBtb3YgICAgIFtSTVJFR1MuY3hdLGN4ICAgICAgOyBTYXZlIHZhbHVlIG9mIENYCi0gICAgICAgIG1vdiAgICAgW1JNUkVHUy5keF0sZHggICAgICA7IFNhdmUgdmFsdWUgb2YgRFgKLSAgICAgICAgbW92ICAgICBbUk1SRUdTLnNpXSxzaSAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBTSQotICAgICAgICBtb3YgICAgIFtSTVJFR1MuZGldLGRpICAgICAgOyBTYXZlIHZhbHVlIG9mIERJCi0gICAgICAgIG1vdiAgICAgYXgsW2ZsYWdzXSAgICAgICAgICA7IFJldHVybiBmbGFncwotICAgICAgICBhbmQgICAgIGF4LDFoICAgICAgICAgICAgICAgOyBJc29sYXRlIGNhcnJ5IGZsYWcKLSAgICAgICAgbW92ICAgICBbUk1SRUdTLmNmbGFnXSxheCAgIDsgU2F2ZSBjYXJyeSBmbGFnIHN0YXR1cwotICAgICAgICBtb3YgICAgIGF4LFtieFZhbF0KLSAgICAgICAgbW92ICAgICBbUk1SRUdTLmJ4XSxheCAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBCWAotCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi1lbmRpZgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX3NlZ3JlYWQoUE1TUkVHUyAqc3JlZ3MpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZWFkIHRoZSBjdXJyZW50IHZhbHVlIG9mIGFsbCBzZWdtZW50IHJlZ2lzdGVycwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnRkbGwxNiBQTV9zZWdyZWFkCi0KLSAgICAgICAgQVJHICAgICBzcmVnczpEUFRSCi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIG1vdiAgICAgYXgsZXMKLSAgICAgICAgX2xlcyAgICBfc2ksW3NyZWdzXQotICAgICAgICBtb3YgICAgIFtfRVMgX3NpXSxheAotICAgICAgICBtb3YgICAgIFtfRVMgX3NpKzJdLGNzCi0gICAgICAgIG1vdiAgICAgW19FUyBfc2krNF0sc3MKLSAgICAgICAgbW92ICAgICBbX0VTIF9zaSs2XSxkcwotICAgICAgICBtb3YgICAgIFtfRVMgX3NpKzhdLGZzCi0gICAgICAgIG1vdiAgICAgW19FUyBfc2krMTBdLGdzCi0KLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOyBDcmVhdGUgYSB0YWJsZSBvZiB0aGUgMjU2IGRpZmZlcmVudCBpbnRlcnJ1cHQgY2FsbHMgdGhhdCB3ZSBjYW4ganVtcAotOyBpbnRvCi0KLWlmZGVmICAgVVNFX05BU00KLQotJWFzc2lnbiBpbnRubyAwCi0KLWludFRhYmxlOgotJXJlcCAgICAyNTYKLSAgICAgICAgZGIgICAgICAwQ0RoCi0gICAgICAgIGRiICAgICAgaW50bm8KLSVhc3NpZ24gaW50bm8gICBpbnRubyArIDEKLSAgICAgICAgcmV0Ci0gICAgICAgIG5vcAotJWVuZHJlcAotCi1lbHNlCi0KLWludG5vID0gMAotCi1pbnRUYWJsZToKLSAgICAgICAgUkVQVCAgICAyNTYKLSAgICAgICAgZGIgICAgICAwQ0RoCi0gICAgICAgIGRiICAgICAgaW50bm8KLWludG5vID0gaW50bm8gKyAxCi0gICAgICAgIHJldAotICAgICAgICBub3AKLSAgICAgICAgRU5ETQotCi1lbmRpZgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBfUE1fZ2VuSW50ICAgIC0gR2VuZXJhdGUgdGhlIGFwcHJvcHJpYXRlIGludGVycnVwdAotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jbmVhciAgIF9QTV9nZW5JbnQKLQotICAgICAgICBwdXNoICAgIF9heCAgICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBfYXgKLSAgICAgICAgcHVzaCAgICBfYnggICAgICAgICAgICAgICAgICAgICA7IFNhdmUgX2J4Ci1pZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgbW92ICAgICBlYngsW1VJTlQgZXNwKzEyXSAgICAgICA7IEVCWCA6PSBpbnRlcnJ1cHQgbnVtYmVyCi1lbHNlCi0gICAgICAgIG1vdiAgICAgYngsc3AgICAgICAgICAgICAgICAgICAgOyBNYWtlIHN1cmUgRVNQIGlzIHplcm9lZAotICAgICAgICBtb3YgICAgIGJ4LFtVSU5UIHNzOmJ4KzZdICAgICAgIDsgQlggOj0gaW50ZXJydXB0IG51bWJlcgotZW5kaWYKLSAgICAgICAgbW92ICAgICBfYXgsb2Zmc2V0IGludFRhYmxlICAgICA7IFBvaW50IHRvIGludGVycnVwdCBnZW5lcmF0aW9uIHRhYmxlCi0gICAgICAgIHNobCAgICAgX2J4LDIgICAgICAgICAgICAgICAgICAgOyBfQlggOj0gaW5kZXggaW50byB0YWJsZQotICAgICAgICBhZGQgICAgIF9heCxfYnggICAgICAgICAgICAgICAgIDsgX0FYIDo9IHBvaW50ZXIgdG8gaW50ZXJydXB0IGNvZGUKLWlmZGVmIGZsYXRtb2RlbAotICAgICAgICB4Y2hnICAgIGVheCxbZXNwKzRdICAgICAgICAgICAgIDsgUmVzdG9yZSBlYXgsIGFuZCBzZXQgZm9yIGludAotZWxzZQotICAgICAgICBtb3YgICAgIGJ4LHNwCi0gICAgICAgIHhjaGcgICAgYXgsW3NzOmJ4KzJdICAgICAgICAgICAgOyBSZXN0b3JlIGF4LCBhbmQgc2V0IGZvciBpbnQKLWVuZGlmCi0gICAgICAgIHBvcCAgICAgX2J4ICAgICAgICAgICAgICAgICAgICAgOyByZXN0b3JlIF9ieAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50IFBNX2ludDM4NngoaW50IGludG5vLCBQTVJFR1MgKmluLCBQTVJFR1MgKm91dCxQTVNSRUdTICpzcmVncykKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IElzc3VlcyBhIHNvZnR3YXJlIGludGVycnVwdCBpbiBwcm90ZWN0ZWQgbW9kZS4gVGhpcyByb3V0aW5lIGhhcyBiZWVuCi07IHdyaXR0ZW4gdG8gYWxsb3cgdXNlciBwcm9ncmFtcyB0byBsb2FkIENTIGFuZCBEUyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMKLTsgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ZGxsMTYgUE1faW50Mzg2eAotCi0gICAgICAgIEFSRyAgICAgaW50bm86VUlOVCwgaW5wdHI6RFBUUiwgb3V0cHRyOkRQVFIsIHNyZWdzOkRQVFIKLQotICAgICAgICBMT0NBTCAgIGZsYWdzOlVJTlQsIHN2X2RzOlVJTlQsIHN2X2VzaTpVTE9ORyA9IExvY2FsU2l6ZQotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgcHVzaCAgICBkcwotICAgICAgICBwdXNoICAgIGVzICAgICAgICAgICAgICAgICAgOyBTYXZlIHNlZ21lbnQgcmVnaXN0ZXJzCi0gICAgICAgIHB1c2ggICAgZnMKLSAgICAgICAgcHVzaCAgICBncwotCi0gICAgICAgIF9sZHMgICAgX3NpLFtzcmVnc10gICAgICAgICA7IERTOl9TSSAtPiBMb2FkIHNlZ21lbnQgcmVnaXN0ZXJzCi0gICAgICAgIG1vdiAgICAgZXMsW19zaV0KLSAgICAgICAgbW92ICAgICBieCxbX3NpKzZdCi0gICAgICAgIG1vdiAgICAgW3N2X2RzXSxfYnggICAgICAgICA7IFNhdmUgdmFsdWUgb2YgdXNlciBEUyBvbiBzdGFjawotICAgICAgICBtb3YgICAgIGZzLFtfc2krOF0KLSAgICAgICAgbW92ICAgICBncyxbX3NpKzEwXQotCi0gICAgICAgIF9sZHMgICAgX3NpLFtpbnB0cl0gICAgICAgICA7IExvYWQgQ1BVIHJlZ2lzdGVycwotICAgICAgICBtb3YgICAgIGVheCxbX3NpXQotICAgICAgICBtb3YgICAgIGVieCxbX3NpKzRdCi0gICAgICAgIG1vdiAgICAgZWN4LFtfc2krOF0KLSAgICAgICAgbW92ICAgICBlZHgsW19zaSsxMl0KLSAgICAgICAgbW92ICAgICBlZGksW19zaSsyMF0KLSAgICAgICAgbW92ICAgICBlc2ksW19zaSsxNl0KLQotICAgICAgICBwdXNoICAgIGRzICAgICAgICAgICAgICAgICAgOyBTYXZlIHZhbHVlIG9mIERTCi0gICAgICAgIHB1c2ggICAgX2JwICAgICAgICAgICAgICAgICA7IFNvbWUgaW50ZXJydXB0cyB0cmFzaCB0aGlzIQotICAgICAgICBjbGMgICAgICAgICAgICAgICAgICAgICAgICAgOyBHZW5lcmF0ZSB0aGUgaW50ZXJydXB0Ci0gICAgICAgIHB1c2ggICAgW1VJTlQgaW50bm9dCi0gICAgICAgIG1vdiAgICAgZHMsW1dPUkQgc3ZfZHNdICAgICA7IFNldCB2YWx1ZSBvZiB1c2VyJ3MgRFMgc2VsZWN0b3IKLSAgICAgICAgY2FsbCAgICBfUE1fZ2VuSW50Ci0gICAgICAgIHBvcCAgICAgX2JwICAgICAgICAgICAgICAgICA7IFBvcCBpbnRubyBmcm9tIHN0YWNrIChmbGFncyB1bmNoYW5nZWQpCi0gICAgICAgIHBvcCAgICAgX2JwICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgdmFsdWUgb2Ygc3RhY2sgZnJhbWUgcG9pbnRlcgotICAgICAgICBwb3AgICAgIGRzICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIHZhbHVlIG9mIERTCi0KLSAgICAgICAgcHVzaGYgICAgICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBmbGFncyBmb3IgbGF0ZXIKLSAgICAgICAgcG9wICAgICBbVUlOVCBmbGFnc10KLSAgICAgICAgcHVzaCAgICBlc2kgICAgICAgICAgICAgICAgIDsgU2F2ZSBFU0kgZm9yIGxhdGVyCi0gICAgICAgIHBvcCAgICAgW0RXT1JEIHN2X2VzaV0KLSAgICAgICAgcHVzaCAgICBkcyAgICAgICAgICAgICAgICAgIDsgU2F2ZSBEUyBmb3IgbGF0ZXIKLSAgICAgICAgcG9wICAgICBbVUlOVCBzdl9kc10KLQotICAgICAgICBfbGRzICAgIF9zaSxbb3V0cHRyXSAgICAgICAgOyBTYXZlIENQVSByZWdpc3RlcnMKLSAgICAgICAgbW92ICAgICBbX3NpXSxlYXgKLSAgICAgICAgbW92ICAgICBbX3NpKzRdLGVieAotICAgICAgICBtb3YgICAgIFtfc2krOF0sZWN4Ci0gICAgICAgIG1vdiAgICAgW19zaSsxMl0sZWR4Ci0gICAgICAgIHB1c2ggICAgW0RXT1JEIHN2X2VzaV0KLSAgICAgICAgcG9wICAgICBbRFdPUkQgX3NpKzE2XQotICAgICAgICBtb3YgICAgIFtfc2krMjBdLGVkaQotCi0gICAgICAgIG1vdiAgICAgX2J4LFtmbGFnc10gICAgICAgICA7IFJldHVybiBmbGFncwotICAgICAgICBhbmQgICAgIGVieCwxaCAgICAgICAgICAgICAgOyBJc29sYXRlIGNhcnJ5IGZsYWcKLSAgICAgICAgbW92ICAgICBbX3NpKzI0XSxlYnggICAgICAgIDsgU2F2ZSBjYXJyeSBmbGFnIHN0YXR1cwotCi0gICAgICAgIF9sZHMgICAgX3NpLFtzcmVnc10gICAgICAgICA7IFNhdmUgc2VnbWVudCByZWdpc3RlcnMKLSAgICAgICAgbW92ICAgICBbX3NpXSxlcwotICAgICAgICBtb3YgICAgIF9ieCxbc3ZfZHNdCi0gICAgICAgIG1vdiAgICAgW19zaSs2XSxieCAgICAgICAgICA7IEdldCByZXR1cm5lZCBEUyBmcm9tIHN0YWNrCi0gICAgICAgIG1vdiAgICAgW19zaSs4XSxmcwotICAgICAgICBtb3YgICAgIFtfc2krMTBdLGdzCi0KLSAgICAgICAgcG9wICAgICBncyAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBzZWdtZW50IHJlZ2lzdGVycwotICAgICAgICBwb3AgICAgIGZzCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi1pZm5kZWYgZmxhdG1vZGVsCi1fUE1fc2F2ZWREUyAgICAgZHcgIF9EQVRBICAgICAgICAgICA7IFNhdmVkIHZhbHVlIG9mIERTCi1lbmRpZgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX3NhdmVEUyh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgU2F2ZSB0aGUgdmFsdWUgb2YgRFMgaW50byBhIHNlY3Rpb24gb2YgdGhlIGNvZGUgc2VnbWVudCwgc28gdGhhdCB3ZSBjYW4KLTsgcXVpY2tseSBsb2FkIHRoaXMgdmFsdWUgYXQgYSBsYXRlciBkYXRlIGluIHRoZSBQTV9sb2FkRFMoKSByb3V0aW5lIGZyb20KLTsgaW5zaWRlIGludGVycnVwdCBoYW5kbGVycyBldGMuIFRoZSBtZXRob2QgdG8gZG8gdGhpcyBpcyBkaWZmZXJlbnQKLTsgZGVwZW5kaW5nIG9uIHRoZSBET1MgZXh0ZW5kZXIgYmVpbmcgdXNlZC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ZGxsMTYgUE1fc2F2ZURTCi0KLWlmZGVmIGZsYXRtb2RlbAotICAgICAgICBtb3YgICAgIFtfUE1fc2F2ZWREU10sZHMgICAgOyBTdG9yZSBhd2F5IGluIGRhdGEgc2VnbWVudAotZW5kaWYKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fbG9hZERTKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSb3V0aW5lIHRvIGxvYWQgdGhlIERTIHJlZ2lzdGVyIHdpdGggdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBjdXJyZW50Ci07IERPUyBleHRlbmRlci4gT25seSB0aGUgRFMgcmVnaXN0ZXIgaXMgbG9hZGVkLCBub3QgdGhlIEVTIHJlZ2lzdGVyLCBzbwotOyBpZiB5b3Ugd2lzaCB0byBjYWxsIEMgY29kZSwgeW91IHdpbGwgbmVlZCB0byBhbHNvIGxvYWQgdGhlIEVTIHJlZ2lzdGVyCi07IGluIDMyIGJpdCBwcm90ZWN0ZWQgbW9kZS4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ZGxsMTYgUE1fbG9hZERTCi0KLSAgICAgICAgbW92ICAgICBkcyxbY3M6X1BNX3NhdmVkRFNdIDsgV2UgY2FuIGFjY2VzcyB0aGUgcHJvcGVyIERTIHRocm91Z2ggQ1MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLWlmZGVmIGZsYXRtb2RlbAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpYm9vbCBEUE1JX2FsbG9jYXRlQ2FsbGJhY2sodm9pZCAoKnBtY29kZSkoKSwgdm9pZCAqcm1yZWdzLCBsb25nICpSTUNCKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9EUE1JX2FsbG9jYXRlQ2FsbGJhY2sKLQotICAgICAgICBBUkcgICAgIHBtY29kZTpDUFRSLCBybXJlZ3M6RFBUUiwgUk1DQjpEUFRSCi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICBwdXNoICAgIGRzCi0gICAgICAgIHB1c2ggICAgZXMKLQotICAgICAgICBwdXNoICAgIGNzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgbW92ICAgICBlc2ksW3BtY29kZV0gICAgOyBEUzpFU0kgLT4gcHJvdGVjdGVkIG1vZGUgY29kZSB0byBjYWxsCi0gICAgICAgIG1vdiAgICAgZWRpLFtybXJlZ3NdICAgIDsgRVM6RURJIC0+IHJlYWwgbW9kZSByZWdpc3RlciBidWZmZXIKLSAgICAgICAgbW92ICAgICBheCwzMDNoICAgICAgICAgOyBBWCA6PSBhbGxvY2F0ZSByZWFsbW9kZSBjYWxsYmFjayBmdW5jdGlvbgotICAgICAgICBpbnQgICAgIDMxaAotICAgICAgICBtb3YgICAgIGVheCwwICAgICAgICAgICA7IFJldHVybiBmYWlsdXJlIQotICAgICAgICBqYyAgICAgIEBARmFpbAotCi0gICAgICAgIG1vdiAgICAgZWF4LFtSTUNCXQotICAgICAgICBzaGwgICAgIGVjeCwxNgotICAgICAgICBtb3YgICAgIGN4LGR4Ci0gICAgICAgIG1vdiAgICAgW2VzOmVheF0sZWN4ICAgIDsgUmV0dXJuIHJlYWwgbW9kZSBhZGRyZXNzCi0gICAgICAgIG1vdiAgICAgZWF4LDEgICAgICAgICAgIDsgUmV0dXJuIHN1Y2Nlc3MhCi0KLUBARmFpbDogcG9wICAgICBlcwotICAgICAgICBwb3AgICAgIGRzCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgRFBNSV9mcmVlQ2FsbGJhY2sobG9uZyBSTUNCKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9EUE1JX2ZyZWVDYWxsYmFjawotCi0gICAgICAgIEFSRyAgICAgUk1DQjpVTE9ORwotCi0gICAgICAgIGVudGVyX2MKLQotICAgICAgICBtb3YgICAgIGN4LFtXT1JEIFJNQ0IrMl0KLSAgICAgICAgbW92ICAgICBkeCxbV09SRCBSTUNCXSAgOyBDWDpEWCA6PSByZWFsIG1vZGUgY2FsbGJhY2sKLSAgICAgICAgbW92ICAgICBheCwzMDRoCi0gICAgICAgIGludCAgICAgMzFoCi0KLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotZW5kaWYKLQotOyBNYWNybyB0byBkZWxheSBicmllZmx5IHRvIGVuc3VyZSB0aGF0IGVub3VnaCB0aW1lIGhhcyBlbGFwc2VkIGJldHdlZW4KLTsgc3VjY2Vzc2l2ZSBJL08gYWNjZXNzZXMgc28gdGhhdCB0aGUgZGV2aWNlIGJlaW5nIGFjY2Vzc2VkIGNhbiByZXNwb25kCi07IHRvIGJvdGggYWNjZXNzZXMgZXZlbiBvbiBhIHZlcnkgZmFzdCBQQy4KLQotaWZkZWYgICBVU0VfTkFTTQotJW1hY3JvICBERUxBWSAwCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0lZW5kbWFjcm8KLSVtYWNybyAgSU9ERUxBWU4gMQotJXJlcCAgICAlMQotICAgICAgICBERUxBWQotJWVuZHJlcAotJWVuZG1hY3JvCi1lbHNlCi1tYWNybyAgIERFTEFZCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi1lbmRtCi1tYWNybyAgIElPREVMQVlOICAgIE4KLSAgICByZXB0ICAgIE4KLSAgICAgICAgREVMQVkKLSAgICBlbmRtCi1lbmRtCi1lbmRpZgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1Y2hhciBfUE1fcmVhZENNT1MoaW50IGluZGV4KQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVhZCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBDTU9TIHJlZ2lzdGVyLiBXZSBkbyB0aGlzIHdpdGggYm90aAotOyBub3JtYWwgaW50ZXJydXB0cyBhbmQgTk1JIGRpc2FibGVkLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV9yZWFkQ01PUwotCi0gICAgICAgIEFSRyAgICAgaW5kZXg6VUlOVAotCi0gICAgICAgIHB1c2ggICAgX2JwCi0gICAgICAgIG1vdiAgICAgX2JwLF9zcAotICAgICAgICBwdXNoZmQKLSAgICAgICAgbW92ICAgICBhbCxbQllURSBpbmRleF0KLSAgICAgICAgb3IgICAgICBhbCw4MGggICAgICAgICAgICAgIDsgQWRkIGRpc2FibGUgTk1JIGZsYWcKLSAgICAgICAgY2xpCi0gICAgICAgIG91dCAgICAgNzBoLGFsCi0gICAgICAgIElPREVMQVlOIDUKLSAgICAgICAgaW4gICAgICBhbCw3MWgKLSAgICAgICAgbW92ICAgICBhaCxhbAotICAgICAgICB4b3IgICAgIGFsLGFsCi0gICAgICAgIElPREVMQVlOIDUKLSAgICAgICAgb3V0ICAgICA3MGgsYWwgICAgICAgICAgICAgIDsgUmUtZW5hYmxlIE5NSQotICAgICAgICBzdGkKLSAgICAgICAgbW92ICAgICBhbCxhaCAgICAgICAgICAgICAgIDsgUmV0dXJuIHZhbHVlIGluIEFMCi0gICAgICAgIHBvcGZkCi0gICAgICAgIHBvcCAgICAgX2JwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9QTV93cml0ZUNNT1MoaW50IGluZGV4LHVjaGFyIHZhbHVlKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVhZCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBDTU9TIHJlZ2lzdGVyLiBXZSBkbyB0aGlzIHdpdGggYm90aAotOyBub3JtYWwgaW50ZXJydXB0cyBhbmQgTk1JIGRpc2FibGVkLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV93cml0ZUNNT1MKLQotICAgICAgICBBUkcgICAgIGluZGV4OlVJTlQsIHZhbHVlOlVDSEFSCi0KLSAgICAgICAgcHVzaCAgICBfYnAKLSAgICAgICAgbW92ICAgICBfYnAsX3NwCi0gICAgICAgIHB1c2hmZAotICAgICAgICBtb3YgICAgIGFsLFtCWVRFIGluZGV4XQotICAgICAgICBvciAgICAgIGFsLDgwaCAgICAgICAgICAgICAgOyBBZGQgZGlzYWJsZSBOTUkgZmxhZwotICAgICAgICBjbGkKLSAgICAgICAgb3V0ICAgICA3MGgsYWwKLSAgICAgICAgSU9ERUxBWU4gNQotICAgICAgICBtb3YgICAgIGFsLFt2YWx1ZV0KLSAgICAgICAgb3V0ICAgICA3MWgsYWwKLSAgICAgICAgeG9yICAgICBhbCxhbAotICAgICAgICBJT0RFTEFZTiA1Ci0gICAgICAgIG91dCAgICAgNzBoLGFsICAgICAgICAgICAgICA7IFJlLWVuYWJsZSBOTUkKLSAgICAgICAgc3RpCi0gICAgICAgIHBvcGZkCi0gICAgICAgIHBvcCAgICAgX2JwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi1pZmRlZiAgIGZsYXRtb2RlbAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpbnQgX1BNX3BhZ2luZ0VuYWJsZWQodm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJldHVybnMgMSBpZiBwYWdpbmcgaXMgZW5hYmxlZCwgMCBpZiBub3Qgb3IgLTEgaWYgbm90IGF0IHJpbmcgMAotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV9wYWdpbmdFbmFibGVkCi0KLSAgICAgICAgbW92ICAgICBlYXgsLTEKLWlmZGVmICAgRE9TNEdXCi0gICAgICAgIG1vdiAgICAgY3gsY3MKLSAgICAgICAgYW5kICAgICBlY3gsMwotICAgICAgICBqeiAgICAgIEBAUmluZzAKLSAgICAgICAgY21wICAgICBbVUlOVCBfUE1faGF2ZUNhdXNlV2F5XSwwCi0gICAgICAgIGpueiAgICAgQEBSaW5nMAotICAgICAgICBqbXAgICAgIEBARXhpdAotCi1AQFJpbmcwOgotICAgICAgICBtb3YgICAgIGVheCxjcjAgICAgICAgICAgICAgICAgIDsgTG9hZCBDUjAKLSAgICAgICAgc2hyICAgICBlYXgsMzEgICAgICAgICAgICAgICAgICA7IElzb2xhdGUgcGFnaW5nIGVuYWJsZWQgYml0Ci1lbmRpZgotQEBFeGl0OiByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgX1BNX2dldFBEQiAtIFJldHVybiB0aGUgUGFnZSBUYWJsZSBEaXJlY3RvcnkgQmFzZSBhZGRyZXNzCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX2dldFBEQgotCi1pZmRlZiAgIERPUzRHVwotICAgICAgICBtb3YgICAgIGF4LGNzCi0gICAgICAgIGFuZCAgICAgZWF4LDMKLSAgICAgICAganogICAgICBAQFJpbmcwCi0gICAgICAgIGNtcCAgICAgW1VJTlQgX1BNX2hhdmVDYXVzZVdheV0sMAotICAgICAgICBqbnogICAgIEBAUmluZzAKLWVuZGlmCi0KLTsgQ2FsbCBWeEQgaWYgcnVubmluZyBhdCByaW5nIDMgaW4gYSBET1MgYm94Ci0KLSAgICAgICAgY21wICAgICBbV09SRCBfUE1fVlhEX3NlbF0sMAotICAgICAgICBqeiAgICAgIEBARmFpbAotICAgICAgICBtb3YgICAgIGVheCxQTUhFTFBfR0VUUERCCi1pZmRlZiAgIFVTRV9OQVNNCi0gICAgICAgIGNhbGwgICAgZmFyIGR3b3JkIFtfUE1fVlhEX29mZl0KLWVsc2UKLSAgICAgICAgY2FsbCAgICBbRkNQVFIgX1BNX1ZYRF9vZmZdCi1lbmRpZgotICAgICAgICByZXQKLQotQEBSaW5nMDoKLWlmZGVmICAgRE9TNEdXCi0gICAgICAgIG1vdiAgICAgZWF4LGNyMwotICAgICAgICBhbmQgICAgIGVheCwwRkZGRkYwMDBoCi0gICAgICAgIHJldAotZW5kaWYKLUBARmFpbDogeG9yICAgICBlYXgsZWF4Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQTV9mbHVzaFRMQiAtIEZsdXNoIHRoZSBUcmFuc2xhdGlvbiBMb29rYXNpZGUgYnVmZmVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUE1fZmx1c2hUTEIKLQotICAgICAgICBtb3YgICAgIGF4LGNzCi0gICAgICAgIGFuZCAgICAgZWF4LDMKLSAgICAgICAganogICAgICBAQFJpbmcwCi1pZmRlZiAgIERPUzRHVwotICAgICAgICBjbXAgICAgIFtVSU5UIF9QTV9oYXZlQ2F1c2VXYXldLDAKLSAgICAgICAgam56ICAgICBAQFJpbmcwCi1lbmRpZgotCi07IENhbGwgVnhEIGlmIHJ1bm5pbmcgYXQgcmluZyAzIGluIGEgRE9TIGJveAotCi0gICAgICAgIGNtcCAgICAgW1dPUkQgX1BNX1ZYRF9zZWxdLDAKLSAgICAgICAganogICAgICBAQEZhaWwKLSAgICAgICAgbW92ICAgICBlYXgsUE1IRUxQX0ZMVVNIVExCCi1pZmRlZiAgIFVTRV9OQVNNCi0gICAgICAgIGNhbGwgICAgZmFyIGR3b3JkIFtfUE1fVlhEX29mZl0KLWVsc2UKLSAgICAgICAgY2FsbCAgICBbRkNQVFIgX1BNX1ZYRF9vZmZdCi1lbmRpZgotICAgICAgICByZXQKLQotQEBSaW5nMDoKLWlmZGVmICAgRE9TNEdXCi0gICAgICAgIHdiaW52ZCAgICAgICAgICAgICAgICAgIDsgRmx1c2ggdGhlIENQVSBjYWNoZQotICAgICAgICBtb3YgICAgIGVheCxjcjMKLSAgICAgICAgbW92ICAgICBjcjMsZWF4ICAgICAgICAgOyBGbHVzaCB0aGUgVExCCi1lbmRpZgotQEBGYWlsOiByZXQKLQotY3Byb2NlbmQKLQotZW5kaWYKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfUE1fVnhEQ2FsbChWWERfcmVncyBmYXIgKnIsdWludCBvZmYsdWludCBzZWwpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV9WeERDYWxsCi0KLSAgICAgICAgQVJHICAgICByOkRQVFIsIG9mZjpVSU5ULCBzZWw6VUlOVAotCi0gICAgICAgIGVudGVyX2MKLQotOyBMb2FkIGFsbCByZWdpc3RlcnMgZnJvbSB0aGUgcmVnaXN0ZXJzIHN0cnVjdHVyZQotCi0gICAgICAgIG1vdiAgICAgZWJ4LFtyXQotICAgICAgICBtb3YgICAgIGVheCxbZWJ4KzBdCi0gICAgICAgIG1vdiAgICAgZWN4LFtlYngrOF0KLSAgICAgICAgbW92ICAgICBlZHgsW2VieCsxMl0KLSAgICAgICAgbW92ICAgICBlc2ksW2VieCsxNl0KLSAgICAgICAgbW92ICAgICBlZGksW2VieCsyMF0KLSAgICAgICAgbW92ICAgICBlYngsW2VieCs0XSAgICAgICAgIDsgVHJhc2hlcyBCWCBzdHJ1Y3R1cmUgcG9pbnRlciEKLQotOyBDYWxsIHRoZSBWeEQgZW50cnkgcG9pbnQgKG9uIHN0YWNrKQotCi1pZmRlZiAgIFVTRV9OQVNNCi0gICAgICAgIGNhbGwgZmFyIGR3b3JkIFtvZmZdCi1lbHNlCi0gICAgICAgIGNhbGwgICAgW0ZDUFRSIG9mZl0KLWVuZGlmCi0KLTsgU2F2ZSBhbGwgcmVnaXN0ZXJzIGJhY2sgaW4gdGhlIHN0cnVjdHVyZQotCi0gICAgICAgIHB1c2ggICAgZWJ4ICAgICAgICAgICAgICAgICA7IFB1c2ggRUJYIG9udG8gc3RhY2sgZm9yIGxhdGVyCi0gICAgICAgIG1vdiAgICAgZWJ4LFtyXQotICAgICAgICBtb3YgICAgIFtlYngrMF0sZWF4Ci0gICAgICAgIG1vdiAgICAgW2VieCs4XSxlY3gKLSAgICAgICAgbW92ICAgICBbZWJ4KzEyXSxlZHgKLSAgICAgICAgbW92ICAgICBbZWJ4KzE2XSxlc2kKLSAgICAgICAgbW92ICAgICBbZWJ4KzIwXSxlZGkKLSAgICAgICAgcG9wICAgICBbRFdPUkQgZWJ4KzRdICAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBFQlggZnJvbSBzdGFjawotCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLWVuZGNvZGVzZWcgIF9wbWRvcwotCi0gICAgICAgIEVORCAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL19wbWRvcy5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvX3BtZG9zLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM3NDFmMy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvX3BtZG9zLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDExMDUgKzAsMCBAQAotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqCi07KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLTsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci07KgotOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLTsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi07KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLTsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07KgotOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyoKLTsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiBMYW5ndWFnZTogICAgODAzODYgQXNzZW1ibGVyLCBUQVNNIDQuMCBvciBOQVNNCi07KiBFbnZpcm9ubWVudDogSUJNIFBDIFJlYWwgbW9kZSBhbmQgMTYvMzIgYml0IHByb3RlY3RlZCBtb2RlCi07KgotOyogRGVzY3JpcHRpb246IExvdyBsZXZlbCBhc3NlbWJseSBzdXBwb3J0IGZvciB0aGUgUE0gbGlicmFyeSBzcGVjaWZpYyB0bwotOyogICAgICAgICAgICAgIE1TRE9TIGludGVycnVwdCBoYW5kbGluZy4KLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIElERUFMCi0KLWluY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgOyBNZW1vcnkgbW9kZWwgbWFjcm9zCi0KLWhlYWRlciAgICAgIF9wbWRvcyAgICAgICAgICAgICAgOyBTZXQgdXAgbWVtb3J5IG1vZGVsCi0KLTsgRGVmaW5lIHRoZSBzaXplIG9mIG91ciBsb2NhbCBzdGFja3MuIEZvciByZWFsIG1vZGUgY29kZSB0aGV5IGNhbnQgYmUKLTsgdGhhdCBiaWcsIGJ1dCBmb3IgMzIgYml0IHByb3RlY3RlZCBtb2RlIGNvZGUgd2UgY2FuIG1ha2UgdGhlbSBuaWNlIGFuZAotOyBsYXJnZSBzbyB0aGF0IGNvbXBsZXggQyBmdW5jdGlvbnMgY2FuIGJlIHVzZWQuCi0KLWlmZGVmIGZsYXRtb2RlbAotTU9VU0VfU1RBQ0sgRVFVIDQwOTYKLVRJTUVSX1NUQUNLIEVRVSA0MDk2Ci1LRVlfU1RBQ0sgICBFUVUgMTAyNAotSU5UMTBfU1RBQ0sgRVFVIDEwMjQKLUlSUV9TVEFDSyAgIEVRVSAxMDI0Ci1lbHNlCi1NT1VTRV9TVEFDSyBFUVUgMTAyNAotVElNRVJfU1RBQ0sgRVFVIDUxMgotS0VZX1NUQUNLICAgRVFVIDI1NgotSU5UMTBfU1RBQ0sgRVFVIDI1NgotSVJRX1NUQUNLICAgRVFVIDI1NgotZW5kaWYKLQotaWZkZWYgICBVU0VfTkFTTQotCi07IE1hY3JvIHRvIGxvYWQgRFMgYW5kIEVTIHJlZ2lzdGVycyB3aXRoIGNvcnJlY3QgdmFsdWUuCi0KLSVpbWFjcm8gICBMT0FEX0RTIDAKLSVpZmRlZiAgZmxhdG1vZGVsCi0gICAgICAgIG1vdiAgICAgZHMsW2NzOl9QTV9zYXZlZERTXQotICAgICAgICBtb3YgICAgIGVzLFtjczpfUE1fc2F2ZWREU10KLSVlbHNlCi0gICAgICAgIHB1c2ggICAgYXgKLSAgICAgICAgbW92ICAgICBheCxfREFUQQotICAgICAgICBtb3YgICAgIGRzLGF4Ci0gICAgICAgIHBvcCAgICAgYXgKLSVlbmRpZgotJWVuZG1hY3JvCi0KLTsgTm90ZSB0aGF0IGludGVycnVwdHMgd2UgZGlzYWJsZSBpbnRlcnJ1cHRzIGR1cmluZyB0aGUgZm9sbG93aW5nIHN0YWNrCi07ICVpbWFjcm8gZm9yIGNvcnJlY3Qgb3BlcmF0aW9uLCBidXQgd2UgZG8gbm90IGVuYWJsZSB0aGVtIGFnYWluLiBOb3JtYWxseQotOyB0aGVzZSAlaW1hY3JvcyBhcmUgdXNlZCB3aXRoaW4gaW50ZXJydXB0IGhhbmRsZXJzIHNvIGludGVycnVwdHMgc2hvdWxkCi07IGFscmVhZHkgYmUgb2ZmLiBXZSB0dXJuIHRoZW0gYmFjayBvbiBleHBsaWNpdGx5IGxhdGVyIGlmIHRoZSB1c2VyIGNvZGUKLTsgbmVlZHMgdGhlbSB0byBiZSBiYWNrIG9uLgotCi07IE1hY3JvIHRvIHN3aXRjaCB0byBhIG5ldyBsb2NhbCBzdGFjay4KLQotJWltYWNybyBORVdTVEsgIDEKLSAgICAgICAgY2xpCi0gICAgICAgIG1vdiAgICAgW3NlZ18lMV0sc3MKLSAgICAgICAgbW92ICAgICBbcHRyXyUxXSxfc3AKLSAgICAgICAgbW92ICAgICBbVGVtcFNlZ10sZHMKLSAgICAgICAgbW92ICAgICBzcyxbVGVtcFNlZ10KLSAgICAgICAgbW92ICAgICBfc3Asb2Zmc2V0ICUxCi0lZW5kbWFjcm8KLQotOyAlaW1hY3JvIHRvIHN3aXRjaCBiYWNrIHRvIHRoZSBvbGQgc3RhY2suCi0KLSVpbWFjcm8gICBSRVNUU1RLICAgMQotICAgICAgICBjbGkKLSAgICAgICAgbW92ICAgICBzcyxbc2VnXyUxXQotICAgICAgICBtb3YgICAgIF9zcCxbcHRyXyUxXQotJWVuZG1hY3JvCi0KLTsgJWltYWNybyB0byBzd2FwIHRoZSBjdXJyZW50IHN0YWNrIHdpdGggdGhlIG9uZSBzYXZlZCBhd2F5LgotCi0laW1hY3JvIFNXQVBTVEsgMQotICAgICAgICBjbGkKLSAgICAgICAgbW92ICAgICBheCxzcwotICAgICAgICB4Y2hnICAgIGF4LFtzZWdfJTFdCi0gICAgICAgIG1vdiAgICAgc3MsYXgKLSAgICAgICAgeGNoZyAgICBfc3AsW3B0cl8lMV0KLSVlbmRtYWNybwotCi1lbHNlCi0KLTsgTWFjcm8gdG8gbG9hZCBEUyBhbmQgRVMgcmVnaXN0ZXJzIHdpdGggY29ycmVjdCB2YWx1ZS4KLQotTUFDUk8gICBMT0FEX0RTCi1pZmRlZiAgIGZsYXRtb2RlbAotICAgICAgICBtb3YgICAgIGRzLFtjczpfUE1fc2F2ZWREU10KLSAgICAgICAgbW92ICAgICBlcyxbY3M6X1BNX3NhdmVkRFNdCi1lbHNlCi0gICAgICAgIHB1c2ggICAgYXgKLSAgICAgICAgbW92ICAgICBheCxfREFUQQotICAgICAgICBtb3YgICAgIGRzLGF4Ci0gICAgICAgIHBvcCAgICAgYXgKLWVuZGlmCi1FTkRNCi0KLTsgTm90ZSB0aGF0IGludGVycnVwdHMgd2UgZGlzYWJsZSBpbnRlcnJ1cHRzIGR1cmluZyB0aGUgZm9sbG93aW5nIHN0YWNrCi07IG1hY3JvIGZvciBjb3JyZWN0IG9wZXJhdGlvbiwgYnV0IHdlIGRvIG5vdCBlbmFibGUgdGhlbSBhZ2Fpbi4gTm9ybWFsbHkKLTsgdGhlc2UgbWFjcm9zIGFyZSB1c2VkIHdpdGhpbiBpbnRlcnJ1cHQgaGFuZGxlcnMgc28gaW50ZXJydXB0cyBzaG91bGQKLTsgYWxyZWFkeSBiZSBvZmYuIFdlIHR1cm4gdGhlbSBiYWNrIG9uIGV4cGxpY2l0bHkgbGF0ZXIgaWYgdGhlIHVzZXIgY29kZQotOyBuZWVkcyB0aGVtIHRvIGJlIGJhY2sgb24uCi0KLTsgTWFjcm8gdG8gc3dpdGNoIHRvIGEgbmV3IGxvY2FsIHN0YWNrLgotCi1NQUNSTyAgIE5FV1NUSyAgc3RrbmFtZQotICAgICAgICBjbGkKLSAgICAgICAgbW92ICAgICBbc2VnXyZzdGtuYW1lJl0sc3MKLSAgICAgICAgbW92ICAgICBbcHRyXyZzdGtuYW1lJl0sX3NwCi0gICAgICAgIG1vdiAgICAgW1RlbXBTZWddLGRzCi0gICAgICAgIG1vdiAgICAgc3MsW1RlbXBTZWddCi0gICAgICAgIG1vdiAgICAgX3NwLG9mZnNldCBzdGtuYW1lCi1FTkRNCi0KLTsgTWFjcm8gdG8gc3dpdGNoIGJhY2sgdG8gdGhlIG9sZCBzdGFjay4KLQotTUFDUk8gICBSRVNUU1RLIHN0a25hbWUKLSAgICAgICAgY2xpCi0gICAgICAgIG1vdiAgICAgc3MsW3NlZ18mc3RrbmFtZSZdCi0gICAgICAgIG1vdiAgICAgX3NwLFtwdHJfJnN0a25hbWUmXQotRU5ETQotCi07IE1hY3JvIHRvIHN3YXAgdGhlIGN1cnJlbnQgc3RhY2sgd2l0aCB0aGUgb25lIHNhdmVkIGF3YXkuCi0KLU1BQ1JPICAgU1dBUFNUSyBzdGtuYW1lCi0gICAgICAgIGNsaQotICAgICAgICBtb3YgICAgIGF4LHNzCi0gICAgICAgIHhjaGcgICAgYXgsW3NlZ18mc3RrbmFtZSZdCi0gICAgICAgIG1vdiAgICAgc3MsYXgKLSAgICAgICAgeGNoZyAgICBfc3AsW3B0cl8mc3RrbmFtZSZdCi1FTkRNCi0KLWVuZGlmCi0KLWJlZ2RhdGFzZWcgIF9wbWRvcwotCi1pZmRlZiBmbGF0bW9kZWwKLSAgICBjZXh0ZXJuIF9QTV9zYXZlZERTLFVTSE9SVAotZW5kaWYKLSAgICBjZXh0ZXJuIF9QTV9jcml0SGFuZGxlcixDUFRSCi0gICAgY2V4dGVybiBfUE1fYnJlYWtIYW5kbGVyLENQVFIKLSAgICBjZXh0ZXJuIF9QTV90aW1lckhhbmRsZXIsQ1BUUgotICAgIGNleHRlcm4gX1BNX3J0Y0hhbmRsZXIsQ1BUUgotICAgIGNleHRlcm4gX1BNX2tleUhhbmRsZXIsQ1BUUgotICAgIGNleHRlcm4gX1BNX2tleTE1SGFuZGxlcixDUFRSCi0gICAgY2V4dGVybiBfUE1fbW91c2VIYW5kbGVyLENQVFIKLSAgICBjZXh0ZXJuIF9QTV9pbnQxMEhhbmRsZXIsQ1BUUgotCi0gICAgY2V4dGVybiBfUE1fY3RybENQdHIsRFBUUgotICAgIGNleHRlcm4gX1BNX2N0cmxCUHRyLERQVFIKLSAgICBjZXh0ZXJuIF9QTV9jcml0UHRyLERQVFIKLQotICAgIGNleHRlcm4gX1BNX3ByZXZUaW1lcixGQ1BUUgotICAgIGNleHRlcm4gX1BNX3ByZXZSVEMsRkNQVFIKLSAgICBjZXh0ZXJuIF9QTV9wcmV2S2V5LEZDUFRSCi0gICAgY2V4dGVybiBfUE1fcHJldktleTE1LEZDUFRSCi0gICAgY2V4dGVybiBfUE1fcHJldkJyZWFrLEZDUFRSCi0gICAgY2V4dGVybiBfUE1fcHJldkN0cmxDLEZDUFRSCi0gICAgY2V4dGVybiBfUE1fcHJldkNyaXRpY2FsLEZDUFRSCi0gICAgY2V4dGVybiBfUE1fcHJldlJlYWxUaW1lcixVTE9ORwotICAgIGNleHRlcm4gX1BNX3ByZXZSZWFsUlRDLFVMT05HCi0gICAgY2V4dGVybiBfUE1fcHJldlJlYWxLZXksVUxPTkcKLSAgICBjZXh0ZXJuIF9QTV9wcmV2UmVhbEtleTE1LFVMT05HCi0gICAgY2V4dGVybiBfUE1fcHJldlJlYWxJbnQxMCxVTE9ORwotCi1jcHVibGljIF9QTV9wbWRvc0RhdGFTdGFydAotCi07IEFsbG9jYXRlIHNwYWNlIGZvciBhbGwgb2YgdGhlIGxvY2FsIHN0YWNrcyB0aGF0IHdlIG5lZWQuIFRoZXNlIHN0YWNrcwotOyBhcmUgbm90IHZlcnkgbGFyZ2UsIGJ1dCBzaG91bGQgYmUgbGFyZ2UgZW5vdWdoIGZvciBtb3N0IHB1cnBvc2VzCi07IChnZW5lcmFsbHkgeW91IHdhbnQgdG8gaGFuZGxlIHRoZXNlIGludGVycnVwdHMgcXVpY2tseSwgc2ltcGx5IHN0b3JpbmcKLTsgdGhlIGluZm9ybWF0aW9uIGZvciBsYXRlciBhbmQgdGhlbiByZXR1cm5pbmcpLiBJZiB5b3UgbmVlZCBiaWdnZXIKLTsgc3RhY2tzIHRoZW4gY2hhbmdlIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBpbiBoZXJlLgotCi0gICAgICAgICAgICBBTElHTiAgIDQKLSAgICAgICAgICAgIGRjbGIgTU9VU0VfU1RBQ0sgICAgOyBTcGFjZSBmb3IgbG9jYWwgc3RhY2sgKHNtYWxsKQotTXNTdGFjazogICAgICAgICAgICAgICAgICAgICAgICA7IFN0YWNrIHN0YXJ0cyBhdCBlbmQhCi1wdHJfTXNTdGFjayBEVUlOVCAgIDAgICAgICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIG9mZnNldAotc2VnX01zU3RhY2sgZHcgICAgICAwICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBzZWdtZW50Ci0KLSAgICAgICAgICAgIEFMSUdOICAgNAotICAgICAgICAgICAgZGNsYiBJTlQxMF9TVEFDSyAgICA7IFNwYWNlIGZvciBsb2NhbCBzdGFjayAoc21hbGwpCi1JbnQxMFN0YWNrOiAgICAgICAgICAgICAgICAgICAgIDsgU3RhY2sgc3RhcnRzIGF0IGVuZCEKLXB0cl9JbnQxMFN0YWNrICBEVUlOVCAgIDAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgb2Zmc2V0Ci1zZWdfSW50MTBTdGFjayAgZHcgICAgICAwICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIHNlZ21lbnQKLQotICAgICAgICAgICAgQUxJR04gICA0Ci0gICAgICAgICAgICBkY2xiIFRJTUVSX1NUQUNLICAgIDsgU3BhY2UgZm9yIGxvY2FsIHN0YWNrIChzbWFsbCkKLVRtU3RhY2s6ICAgICAgICAgICAgICAgICAgICAgICAgOyBTdGFjayBzdGFydHMgYXQgZW5kIQotcHRyX1RtU3RhY2sgRFVJTlQgICAwICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBvZmZzZXQKLXNlZ19UbVN0YWNrIGR3ICAgICAgMCAgICAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgc2VnbWVudAotCi0gICAgICAgICAgICBBTElHTiAgIDQKLSAgICAgICAgICAgIGRjbGIgVElNRVJfU1RBQ0sgICAgOyBTcGFjZSBmb3IgbG9jYWwgc3RhY2sgKHNtYWxsKQotUnRjU3RhY2s6ICAgICAgICAgICAgICAgICAgICAgICA7IFN0YWNrIHN0YXJ0cyBhdCBlbmQhCi1wdHJfUnRjU3RhY2sgRFVJTlQgIDAgICAgICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIG9mZnNldAotc2VnX1J0Y1N0YWNrIGR3ICAgICAwICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBzZWdtZW50Ci1SdGNJbnNpZGUgICBkdyAgICAgIDAgICAgICAgICAgIDsgQXJlIHdlIHN0aWxsIGhhbmRsaW5nIGN1cnJlbnQgaW50ZXJydXB0Ci0KLSAgICAgICAgICAgIEFMSUdOICAgNAotICAgICAgICAgICAgZGNsYiBLRVlfU1RBQ0sgICAgICA7IFNwYWNlIGZvciBsb2NhbCBzdGFjayAoc21hbGwpCi1LeVN0YWNrOiAgICAgICAgICAgICAgICAgICAgICAgIDsgU3RhY2sgc3RhcnRzIGF0IGVuZCEKLXB0cl9LeVN0YWNrIERVSU5UICAgMCAgICAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgb2Zmc2V0Ci1zZWdfS3lTdGFjayBkdyAgICAgIDAgICAgICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIHNlZ21lbnQKLUt5SW5zaWRlICAgIGR3ICAgICAgMCAgICAgICAgICAgOyBBcmUgd2Ugc3RpbGwgaGFuZGxpbmcgY3VycmVudCBpbnRlcnJ1cHQKLQotICAgICAgICAgICAgQUxJR04gICA0Ci0gICAgICAgICAgICBkY2xiIEtFWV9TVEFDSyAgICAgIDsgU3BhY2UgZm9yIGxvY2FsIHN0YWNrIChzbWFsbCkKLUt5MTVTdGFjazogICAgICAgICAgICAgICAgICAgICAgOyBTdGFjayBzdGFydHMgYXQgZW5kIQotcHRyX0t5MTVTdGFjayAgIERVSU5UICAgMCAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBvZmZzZXQKLXNlZ19LeTE1U3RhY2sgICBkdyAgICAgIDAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgc2VnbWVudAotCi1UZW1wU2VnICAgICBkdyAgICAgIDAgICAgICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgc3RhY2sgc2VnbWVudAotCi1jcHVibGljIF9QTV9wbWRvc0RhdGFFbmQKLQotZW5kZGF0YXNlZyAgX3BtZG9zCi0KLWJlZ2NvZGVzZWcgIF9wbWRvcyAgICAgICAgICAgICAgOyBTdGFydCBvZiBjb2RlIHNlZ21lbnQKLQotY3B1YmxpYyBfUE1fcG1kb3NDb2RlU3RhcnQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUE1fbW91c2VJU1IgLSBNb3VzZSBpbnRlcnJ1cHQgc3Vicm91dGluZSBkaXNwYXRjaGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJbnRlcnJ1cHQgc3Vicm91dGluZSBjYWxsZWQgYnkgdGhlIG1vdXNlIGRyaXZlciB1cG9uIGludGVycnVwdHMsIHRvCi07IGRpc3BhdGNoIGNvbnRyb2wgdG8gaGlnaCBsZXZlbCBDIGJhc2VkIHN1YnJvdXRpbmVzLiBJbnRlcnJ1cHRzIGFyZSBvbgotOyB3aGVuIHdlIGNhbGwgdGhlIHVzZXIgY29kZS4KLTsKLTsgSXQgaXMgX2V4dHJlbWVseV8gaW1wb3J0YW50IHRvIHNhdmUgdGhlIHN0YXRlIG9mIHRoZSBleHRlbmRlZCByZWdpc3RlcnMKLTsgYXMgdGhlc2UgbWF5IHdlbGwgYmUgdHJhc2hlZCBieSB0aGUgcm91dGluZXMgY2FsbGVkIGZyb20gaGVyZSBhbmQgbm90Ci07IHJlc3RvcmVkIGNvcnJlY3RseSBieSB0aGUgbW91c2UgaW50ZXJmYWNlIG1vZHVsZS4KLTsKLTsgTk9URTogVGhpcyByb3V0aW5lIHN3aXRjaGVzIHRvIGEgbG9jYWwgc3RhY2sgYmVmb3JlIGNhbGxpbmcgYW55IEMgY29kZSwKLTsgICAgICAgYW5kIGhlbmNlIGlzIF9ub3RfIHJlLWVudHJhbnQuIEZvciBtb3VzZSBoYW5kbGVycyB0aGlzIGlzIG5vdCBhCi07ICAgICAgIHByb2JsZW0sIGFzIHRoZSBtb3VzZSBkcml2ZXIgYXJiaXRyYXRlcyBjYWxscyB0byB0aGUgdXNlciBtb3VzZQotOyAgICAgICBoYW5kbGVyIGZvciB1cy4KLTsKLTsgRW50cnk6ICAgIEFYICAtIENvbmRpdGlvbiBtYXNrIGdpdmluZyByZWFzb24gZm9yIGNhbGwKLTsgICAgICAgICAgIEJYICAtIE1vdXNlIGJ1dHRvbiBzdGF0ZQotOyAgICAgICAgICAgQ1ggIC0gSG9yaXpvbnRhbCBjdXJzb3IgY29vcmRpbmF0ZQotOyAgICAgICAgICAgRFggIC0gVmVydGljYWwgY3Vyc29yIGNvb3JkaW5hdGUKLTsgICAgICAgICAgIFNJICAtIEhvcml6b250YWwgbWlja2V5IHZhbHVlCi07ICAgICAgICAgICBESSAgLSBWZXJ0aWNhbCBtaWNrZXkgdmFsdWUKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pZmRlZiAgIERKR1BQCi1jcHJvY3N0YXJ0ICBfUE1fbW91c2VJU1IKLWVsc2UKLWNwcm9jZmFyICAgIF9QTV9tb3VzZUlTUgotZW5kaWYKLQotICAgICAgICBwdXNoICAgIGRzICAgICAgICAgICAgICA7IFNhdmUgdmFsdWUgb2YgRFMKLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBwdXNoYWQgICAgICAgICAgICAgICAgICA7IFNhdmUgX2FsbF8gZXh0ZW5kZWQgcmVnaXN0ZXJzCi0gICAgICAgIGNsZCAgICAgICAgICAgICAgICAgICAgIDsgQ2xlYXIgZGlyZWN0aW9uIGZsYWcKLQotICAgICAgICBMT0FEX0RTICAgICAgICAgICAgICAgICA7IExvYWQgRFMgcmVnaXN0ZXIKLSAgICAgICAgTkVXU1RLICBNc1N0YWNrICAgICAgICAgOyBTd2l0Y2ggdG8gbG9jYWwgc3RhY2sKLQotOyBDYWxsIHRoZSBpbnN0YWxsZWQgaGlnaCBsZXZlbCBDIGNvZGUgcm91dGluZQotCi0gICAgICAgIGNscmhpICAgZHggICAgICAgICAgICAgIDsgQ2xlYXIgb3V0IGhpZ2ggb3JkZXIgdmFsdWVzCi0gICAgICAgIGNscmhpICAgY3gKLSAgICAgICAgY2xyaGkgICBieAotICAgICAgICBjbHJoaSAgIGF4Ci0gICAgICAgIHNnbmhpICAgc2kKLSAgICAgICAgc2duaGkgICBkaQotCi0gICAgICAgIHB1c2ggICAgX2RpCi0gICAgICAgIHB1c2ggICAgX3NpCi0gICAgICAgIHB1c2ggICAgX2R4Ci0gICAgICAgIHB1c2ggICAgX2N4Ci0gICAgICAgIHB1c2ggICAgX2J4Ci0gICAgICAgIHB1c2ggICAgX2F4Ci0gICAgICAgIHN0aSAgICAgICAgICAgICAgICAgICAgIDsgRW5hYmxlIGludGVycnVwdHMKLSAgICAgICAgY2FsbCAgICBbQ1BUUiBfUE1fbW91c2VIYW5kbGVyXQotICAgICAgICBfYWRkICAgIHNwLDEyLDI0Ci0KLSAgICAgICAgUkVTVFNUSyBNc1N0YWNrICAgICAgICAgOyBSZXN0b3JlIHByZXZpb3VzIHN0YWNrCi0KLSAgICAgICAgcG9wYWQgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIGFsbCBleHRlbmRlZCByZWdpc3RlcnMKLSAgICAgICAgcG9wICAgICBlcwotICAgICAgICBwb3AgICAgIGRzCi0gICAgICAgIHJldCAgICAgICAgICAgICAgICAgICAgIDsgV2UgYXJlIGRvbmUhIQotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQTV90aW1lcklTUiAtIFRpbWVyIGludGVycnVwdCBzdWJyb3V0aW5lIGRpc3BhdGNoZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgdGltZXIgaW50ZXJydXB0LCB0byBkaXNwYXRjaCBjb250cm9sCi07IHRvIGhpZ2ggbGV2ZWwgQyBiYXNlZCBzdWJyb3V0aW5lcy4gV2Ugc2F2ZSB0aGUgc3RhdGUgb2YgYWxsIHJlZ2lzdGVycwotOyBpbiB0aGlzIHJvdXRpbmUsIGFuZCBzd2l0Y2ggdG8gYSBsb2NhbCBzdGFjay4gSW50ZXJydXB0cyBhcmUgKm9mZioKLTsgd2hlbiB3ZSBjYWxsIHRoZSB1c2VyIGNvZGUuCi07Ci07IE5PVEU6IFRoaXMgcm91dGluZSBzd2l0Y2hlcyB0byBhIGxvY2FsIHN0YWNrIGJlZm9yZSBjYWxsaW5nIGFueSBDIGNvZGUsCi07ICAgICAgIGFuZCBoZW5jZSBpcyBfbm90XyByZS1lbnRyYW50LiBNYWtlIHN1cmUgeW91ciBDIGNvZGUgZXhlY3V0ZXMgYXMKLTsgICAgICAgcXVpY2tseSBhcyBwb3NzaWJsZSwgc2luY2UgYSB0aW1lciBvdmVycnVuIHdpbGwgc2ltcGx5IGhhbmcgdGhlCi07ICAgICAgIHN5c3RlbS4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY2ZhciAgICBfUE1fdGltZXJJU1IKLQotICAgICAgICBwdXNoICAgIGRzICAgICAgICAgICAgICA7IFNhdmUgdmFsdWUgb2YgRFMKLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBwdXNoYWQgICAgICAgICAgICAgICAgICA7IFNhdmUgX2FsbF8gZXh0ZW5kZWQgcmVnaXN0ZXJzCi0gICAgICAgIGNsZCAgICAgICAgICAgICAgICAgICAgIDsgQ2xlYXIgZGlyZWN0aW9uIGZsYWcKLQotICAgICAgICBMT0FEX0RTICAgICAgICAgICAgICAgICA7IExvYWQgRFMgcmVnaXN0ZXIKLQotICAgICAgICBORVdTVEsgIFRtU3RhY2sgICAgICAgICA7IFN3aXRjaCB0byBsb2NhbCBzdGFjawotICAgICAgICBjYWxsICAgIFtDUFRSIF9QTV90aW1lckhhbmRsZXJdCi0gICAgICAgIFJFU1RTVEsgVG1TdGFjayAgICAgICAgIDsgUmVzdG9yZSBwcmV2aW91cyBzdGFjawotCi0gICAgICAgIHBvcGFkICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBhbGwgZXh0ZW5kZWQgcmVnaXN0ZXJzCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBpcmV0ICAgICAgICAgICAgICAgICAgICA7IFJldHVybiBmcm9tIGludGVycnVwdAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQTV9jaGFpblByZXZUaW1lciAtIENoYWluIHRvIHByZXZpb3VzIHRpbWVyIGludGVycnVwdCBhbmQgcmV0dXJuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDaGFpbnMgdG8gdGhlIHByZXZpb3VzIHRpbWVyIGludGVycnVwdCByb3V0aW5lIGFuZCByZXR1cm5zIGNvbnRyb2wKLTsgYmFjayB0byB0aGUgaGlnaCBsZXZlbCBpbnRlcnJ1cHQgaGFuZGxlci4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9jaGFpblByZXZUaW1lcgotCi1pZmRlZiAgIFROVAotICAgICAgICBwdXNoICAgIGVheAotICAgICAgICBwdXNoICAgIGVieAotICAgICAgICBwdXNoICAgIGVjeAotICAgICAgICBwdXNoZmQgICAgICAgICAgICAgICAgICA7IFB1c2ggZmxhZ3Mgb24gc3RhY2sgdG8gc2ltdWxhdGUgaW50ZXJydXB0Ci0gICAgICAgIG1vdiAgICAgYXgsMjUwRWggICAgICAgIDsgQ2FsbCByZWFsIG1vZGUgcHJvY2VkdXJlIGZ1bmN0aW9uCi0gICAgICAgIG1vdiAgICAgZWJ4LFtfUE1fcHJldlJlYWxUaW1lcl0KLSAgICAgICAgbW92ICAgICBlY3gsMSAgICAgICAgICAgOyBDb3B5IHJlYWwgbW9kZSBmbGFncyB0byByZWFsIG1vZGUgc3RhY2sKLSAgICAgICAgaW50ICAgICAyMWggICAgICAgICAgICAgOyBDYWxsIHRoZSByZWFsIG1vZGUgY29kZQotICAgICAgICBwb3BmZAotICAgICAgICBwb3AgICAgIGVjeAotICAgICAgICBwb3AgICAgIGVieAotICAgICAgICBwb3AgICAgIGVheAotICAgICAgICByZXQKLWVsc2UKLSAgICAgICAgU1dBUFNUSyBUbVN0YWNrICAgICAgICAgOyBTd2FwIGJhY2sgdG8gcHJldmlvdXMgc3RhY2sKLSAgICAgICAgcHVzaGYgICAgICAgICAgICAgICAgICAgOyBTYXZlIHN0YXRlIG9mIGludGVycnVwdCBmbGFnCi0gICAgICAgIHB1c2hmICAgICAgICAgICAgICAgICAgIDsgUHVzaCBmbGFncyBvbiBzdGFjayB0byBzaW11bGF0ZSBpbnRlcnJ1cHQKLWlmZGVmICAgVVNFX05BU00KLSAgICAgICAgY2FsbCBmYXIgZHdvcmQgW19QTV9wcmV2VGltZXJdCi1lbHNlCi0gICAgICAgIGNhbGwgICAgW19QTV9wcmV2VGltZXJdCi1lbmRpZgotICAgICAgICBwb3BmICAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgc3RhdGUgb2YgaW50ZXJydXB0IGZsYWcKLSAgICAgICAgU1dBUFNUSyBUbVN0YWNrICAgICAgICAgOyBTd2FwIGJhY2sgdG8gQyBzdGFjayBhZ2FpbgotICAgICAgICByZXQKLWVuZGlmCi0KLWNwcm9jZW5kCi0KLTsgTWFjcm8gdG8gZGVsYXkgYnJpZWZseSB0byBlbnN1cmUgdGhhdCBlbm91Z2ggdGltZSBoYXMgZWxhcHNlZCBiZXR3ZWVuCi07IHN1Y2Nlc3NpdmUgSS9PIGFjY2Vzc2VzIHNvIHRoYXQgdGhlIGRldmljZSBiZWluZyBhY2Nlc3NlZCBjYW4gcmVzcG9uZAotOyB0byBib3RoIGFjY2Vzc2VzIGV2ZW4gb24gYSB2ZXJ5IGZhc3QgUEMuCi0KLWlmZGVmICAgVVNFX05BU00KLSVtYWNybyAgREVMQVkgMAotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotJWVuZG1hY3JvCi0lbWFjcm8gIElPREVMQVlOIDEKLSVyZXAgICAgJTEKLSAgICAgICAgREVMQVkKLSVlbmRyZXAKLSVlbmRtYWNybwotZWxzZQotbWFjcm8gICBERUxBWQotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotZW5kbQotbWFjcm8gICBJT0RFTEFZTiAgICBOCi0gICAgcmVwdCAgICBOCi0gICAgICAgIERFTEFZCi0gICAgZW5kbQotZW5kbQotZW5kaWYKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUE1fcnRjSVNSIC0gUmVhbCB0aW1lIGNsb2NrIGludGVycnVwdCBzdWJyb3V0aW5lIGRpc3BhdGNoZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgdGltZXIgaW50ZXJydXB0LCB0byBkaXNwYXRjaCBjb250cm9sCi07IHRvIGhpZ2ggbGV2ZWwgQyBiYXNlZCBzdWJyb3V0aW5lcy4gV2Ugc2F2ZSB0aGUgc3RhdGUgb2YgYWxsIHJlZ2lzdGVycwotOyBpbiB0aGlzIHJvdXRpbmUsIGFuZCBzd2l0Y2ggdG8gYSBsb2NhbCBzdGFjay4gSW50ZXJydXB0cyBhcmUgKm9mZioKLTsgd2hlbiB3ZSBjYWxsIHRoZSB1c2VyIGNvZGUuCi07Ci07IE5PVEU6IFRoaXMgcm91dGluZSBzd2l0Y2hlcyB0byBhIGxvY2FsIHN0YWNrIGJlZm9yZSBjYWxsaW5nIGFueSBDIGNvZGUsCi07ICAgICAgIGFuZCBoZW5jZSBpcyBfbm90XyByZS1lbnRyYW50LiBNYWtlIHN1cmUgeW91ciBDIGNvZGUgZXhlY3V0ZXMgYXMKLTsgICAgICAgcXVpY2tseSBhcyBwb3NzaWJsZSwgc2luY2UgYSB0aW1lciBvdmVycnVuIHdpbGwgc2ltcGx5IGhhbmcgdGhlCi07ICAgICAgIHN5c3RlbS4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY2ZhciAgICBfUE1fcnRjSVNSCi0KLSAgICAgICAgcHVzaCAgICBkcyAgICAgICAgICAgICAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBEUwotICAgICAgICBwdXNoICAgIGVzCi0gICAgICAgIHB1c2hhZCAgICAgICAgICAgICAgICAgICAgICA7IFNhdmUgX2FsbF8gZXh0ZW5kZWQgcmVnaXN0ZXJzCi0gICAgICAgIGNsZCAgICAgICAgICAgICAgICAgICAgICAgICA7IENsZWFyIGRpcmVjdGlvbiBmbGFnCi0KLTsgQ2xlYXIgcHJpb3JpdHkgaW50ZXJydXB0IGNvbnRyb2xsZXIgYW5kIHJlLWVuYWJsZSBpbnRlcnJ1cHRzIHNvIHdlCi07IGRvbnQgbG9jayB0aGluZ3MgdXAgZm9yIGxvbmcuCi0KLSAgICAgICAgbW92ICAgICBhbCwyMGgKLSAgICAgICAgb3V0ICAgICAwQTBoLGFsCi0gICAgICAgIG91dCAgICAgMDIwaCxhbAotCi07IENsZWFyIHJlYWwtdGltZSBjbG9jayB0aW1lb3V0Ci0KLSAgICAgICAgaW4gICAgICBhbCw3MGggICAgICAgICAgICAgIDsgUmVhZCBDTU9TIGluZGV4IHJlZ2lzdGVyCi0gICAgICAgIHB1c2ggICAgX2F4ICAgICAgICAgICAgICAgICA7ICBhbmQgc2F2ZSBmb3IgbGF0ZXIKLSAgICAgICAgSU9ERUxBWU4gMwotICAgICAgICBtb3YgICAgIGFsLDBDaAotICAgICAgICBvdXQgICAgIDcwaCxhbAotICAgICAgICBJT0RFTEFZTiA1Ci0gICAgICAgIGluICAgICAgYWwsNzFoCi0KLTsgQ2FsbCB0aGUgQyBpbnRlcnJ1cHQgaGFuZGxlciBmdW5jdGlvbgotCi0gICAgICAgIExPQURfRFMgICAgICAgICAgICAgICAgICAgICA7IExvYWQgRFMgcmVnaXN0ZXIKLSAgICAgICAgY21wICAgICBbQllURSBSdGNJbnNpZGVdLDEgIDsgQ2hlY2sgZm9yIG11dHVhbCBleGNsdXNpb24KLSAgICAgICAgamUgICAgICBAQEV4aXQKLSAgICAgICAgbW92ICAgICBbQllURSBSdGNJbnNpZGVdLDEKLSAgICAgICAgTkVXU1RLICBSdGNTdGFjayAgICAgICAgICAgIDsgU3dpdGNoIHRvIGxvY2FsIHN0YWNrCi0gICAgICAgIHN0aSAgICAgICAgICAgICAgICAgICAgICAgICA7IFJlLWVuYWJsZSBpbnRlcnJ1cHRzCi0gICAgICAgIGNhbGwgICAgW0NQVFIgX1BNX3J0Y0hhbmRsZXJdCi0gICAgICAgIFJFU1RTVEsgUnRjU3RhY2sgICAgICAgICAgICA7IFJlc3RvcmUgcHJldmlvdXMgc3RhY2sKLSAgICAgICAgbW92ICAgICBbQllURSBSdGNJbnNpZGVdLDAKLQotQEBFeGl0OiBwb3AgICAgIF9heAotICAgICAgICBvdXQgICAgIDcwaCxhbCAgICAgICAgICAgICAgOyBSZXN0b3JlIENNT1MgaW5kZXggcmVnaXN0ZXIKLSAgICAgICAgcG9wYWQgICAgICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBhbGwgZXh0ZW5kZWQgcmVnaXN0ZXJzCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBpcmV0ICAgICAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gZnJvbSBpbnRlcnJ1cHQKLQotY3Byb2NlbmQKLQotaWZkZWYgZmxhdG1vZGVsCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQTV9pcnFJU1JUZW1wbGF0ZSAtIEhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVyIElSUSB0ZW1wbGF0ZQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIgZm9yIGFueSBpbnRlcnJ1cHQsIHRvIGRpc3BhdGNoIGNvbnRyb2wKLTsgdG8gaGlnaCBsZXZlbCBDIGJhc2VkIHN1YnJvdXRpbmVzLiBXZSBzYXZlIHRoZSBzdGF0ZSBvZiBhbGwgcmVnaXN0ZXJzCi07IGluIHRoaXMgcm91dGluZSwgYW5kIHN3aXRjaCB0byBhIGxvY2FsIHN0YWNrLiBJbnRlcnJ1cHRzIGFyZSAqb2ZmKgotOyB3aGVuIHdlIGNhbGwgdGhlIHVzZXIgY29kZS4KLTsKLTsgTk9URTogVGhpcyByb3V0aW5lIHN3aXRjaGVzIHRvIGEgbG9jYWwgc3RhY2sgYmVmb3JlIGNhbGxpbmcgYW55IEMgY29kZSwKLTsgICAgICAgYW5kIGhlbmNlIGlzIF9ub3RfIHJlLWVudHJhbnQuIE1ha2Ugc3VyZSB5b3VyIEMgY29kZSBleGVjdXRlcyBhcwotOyAgICAgICBxdWlja2x5IGFzIHBvc3NpYmxlLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jZmFyICAgIF9QTV9pcnFJU1JUZW1wbGF0ZQotCi0gICAgICAgIHB1c2ggICAgZWJ4Ci0gICAgICAgIG1vdiAgICAgZWJ4LDAgICAgICAgICAgIDsgUmVsb2NhdGlvbiBhZGp1c3RtZW50IGZhY3RvcgotICAgICAgICBqbXAgICAgIF9fSVJRRW50cnkKLQotOyBHbG9iYWwgdmFyaWFibGVzIHN0b3JlZCBpbiB0aGUgSVJRIHRodW5rIGNvZGUgc2VnbWVudAotCi1fQ0hhbmRsZXIgICAgICAgZGQgICAgICAwICAgICAgIDsgUG9pbnRlciB0byBDIGludGVycnVwdCBoYW5kbGVyCi1fUHJldklSUSAgICAgICAgZGQgICAgICAwICAgICAgIDsgUHJldmlvdXMgSVJRIGhhbmRsZXIKLSAgICAgICAgICAgICAgICBkZCAgICAgIDAKLV9JUlEgICAgICAgICAgICBkZCAgICAgIDAgICAgICAgOyBJUlEgd2UgYXJlIGhvb2tlZCBmb3IKLXB0cl9JUlFTdGFjayAgICBEVUlOVCAgIDAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgb2Zmc2V0Ci1zZWdfSVJRU3RhY2sgICAgZHcgICAgICAwICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIHNlZ21lbnQKLV9JbnNpZGUgICAgICAgICBkYiAgICAgIDAgICAgICAgOyBNdXR1YWwgZXhjbHVzaW9uIGZsYWcKLSAgICAgICAgQUxJR04gICA0Ci0gICAgICAgIGRjbGIgSVJRX1NUQUNLICAgICAgICAgIDsgU3BhY2UgZm9yIGxvY2FsIHN0YWNrCi1fSVJRU3RhY2s6ICAgICAgICAgICAgICAgICAgICAgIDsgU3RhY2sgc3RhcnRzIGF0IGVuZCEKLQotOyBDaGVjayBmb3IgYW5kIHJlamVjdCBzcHVyaW91cyBJUlEgNyBzaWduYWxzCi0KLV9fSVJRRW50cnk6Ci0gICAgICAgIGNtcCAgICAgW0JZVEUgY3M6ZWJ4K19JUlFdLDcgICAgOyBTcHVyaW91cyBJUlFzIG9jY3VyIG9ubHkgb24gSVJRIDcKLSAgICAgICAgam1wICAgICBAQFZhbGlkSVJRCi0gICAgICAgIHB1c2ggICAgZWF4Ci0gICAgICAgIG1vdiAgICAgYWwsMTAxMWIgICAgICAgICAgICA7IE9DVzM6IHJlYWQgSVNSCi0gICAgICAgIG91dCAgICAgMjBoLGFsICAgICAgICAgICAgICA7IChJbnRlbCBQZXJpcGhlcmFsIENvbXBvbmVudHMsIDE5OTEsCi0gICAgICAgIGluICAgICAgYWwsMjBoICAgICAgICAgICAgICA7IHAuIDMtMTg4KQotICAgICAgICBzaGwgICAgIGFsLDEgICAgICAgICAgICAgICAgOyBTZXQgQyA9IGJpdCA3IChJUlEgNykgb2YgSVNSIHJlZ2lzdGVyCi0gICAgICAgIHBvcCAgICAgZWF4Ci0gICAgICAgIGpjICAgICAgQEBWYWxpZElSUQotICAgICAgICBpcmV0ICAgICAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gZnJvbSBpbnRlcnJ1cHQKLQotOyBTYXZlIGFsbCByZWdpc3RlcnMgZm9yIGR1cmF0aW9uIG9mIElSUSBoYW5kbGVyCi0KLUBAVmFsaWRJUlE6Ci0gICAgICAgIHB1c2ggICAgZHMgICAgICAgICAgICAgICAgICA7IFNhdmUgdmFsdWUgb2YgRFMKLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBwdXNoYWQgICAgICAgICAgICAgICAgICAgICAgOyBTYXZlIF9hbGxfIGV4dGVuZGVkIHJlZ2lzdGVycwotICAgICAgICBjbGQgICAgICAgICAgICAgICAgICAgICAgICAgOyBDbGVhciBkaXJlY3Rpb24gZmxhZwotICAgICAgICBMT0FEX0RTICAgICAgICAgICAgICAgICAgICAgOyBMb2FkIERTIHJlZ2lzdGVyCi0KLTsgU2VuZCBhbiBFT0kgdG8gdGhlIFBJQwotCi0gICAgICAgIG1vdiAgICAgYWwsMjBoICAgICAgICAgICAgICA7IFNlbmQgRU9JIHRvIFBJQwotICAgICAgICBjbXAgICAgIFtCWVRFIGVieCtfSVJRXSw4ICAgOyBDbGVhciBQSUMxIGZpcnN0IGlmIElSUSA+PSA4Ci0gICAgICAgIGpiICAgICAgQEAxCi0gICAgICAgIG91dCAgICAgMEEwaCxhbAotQEAxOiAgICBvdXQgICAgIDIwaCxhbAotCi07IENoZWNrIGZvciBtdXR1YWwgZXhjbHVzaW9uCi0KLSAgICAgICAgY21wICAgICBbQllURSBlYngrX0luc2lkZV0sMQotICAgICAgICBqZSAgICAgIEBAQ2hhaW5PbGRIYW5kbGVyCi0gICAgICAgIG1vdiAgICAgW0JZVEUgZWJ4K19JbnNpZGVdLDEKLQotOyBDYWxsIHRoZSBDIGludGVycnVwdCBoYW5kbGVyIGZ1bmN0aW9uCi0KLSAgICAgICAgbW92ICAgICBbZWJ4K3NlZ19JUlFTdGFja10sc3MgICA7IFN3aXRjaCB0byBsb2NhbCBzdGFjawotICAgICAgICBtb3YgICAgIFtlYngrcHRyX0lSUVN0YWNrXSxlc3AKLSAgICAgICAgbW92ICAgICBbVGVtcFNlZ10sZHMKLSAgICAgICAgbW92ICAgICBzcyxbVGVtcFNlZ10KLSAgICAgICAgbGVhICAgICBlc3AsW2VieCtfSVJRU3RhY2tdCi0gICAgICAgIHN0aSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBSZS1lbmFibGUgaW50ZXJydXB0cwotICAgICAgICBwdXNoICAgIGVieAotICAgICAgICBjYWxsICAgIFtEV09SRCBlYngrX0NIYW5kbGVyXQotICAgICAgICBwb3AgICAgIGVieAotICAgICAgICBjbGkKLSAgICAgICAgbW92ICAgICBzcyxbZWJ4K3NlZ19JUlFTdGFja10gICA7IFJlc3RvcmUgcHJldmlvdXMgc3RhY2sKLSAgICAgICAgbW92ICAgICBlc3AsW2VieCtwdHJfSVJRU3RhY2tdCi0gICAgICAgIG9yICAgICAgZWF4LGVheAotICAgICAgICBqeiAgICAgIEBAQ2hhaW5PbGRIYW5kbGVyICAgOyBDaGFpbiBpZiBub3QgaGFuZGxlZCBmb3Igc2hhcmVkIElSUQotCi1AQEV4aXQ6IG1vdiAgICAgW0JZVEUgZWJ4K19JbnNpZGVdLDAKLSAgICAgICAgcG9wYWQgICAgICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBhbGwgZXh0ZW5kZWQgcmVnaXN0ZXJzCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBwb3AgICAgIGVieAotICAgICAgICBpcmV0ICAgICAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gZnJvbSBpbnRlcnJ1cHQKLQotQEBDaGFpbk9sZEhhbmRsZXI6Ci0gICAgICAgIGNtcCAgICAgW0RXT1JEIGVieCtfUHJldklSUV0sMAotICAgICAgICBqeiAgICAgIEBARXhpdAotICAgICAgICBtb3YgICAgIFtCWVRFIGVieCtfSW5zaWRlXSwwCi0gICAgICAgIG1vdiAgICAgZWF4LFtEV09SRCBlYngrX1ByZXZJUlFdCi0gICAgICAgIG1vdiAgICAgZWJ4LFtEV09SRCBlYngrX1ByZXZJUlErNF0KLSAgICAgICAgbW92ICAgICBbRFdPUkQgX1ByZXZJUlFdLGVheAotICAgICAgICBtb3YgICAgIFtEV09SRCBfUHJldklSUSs0XSxlYngKLSAgICAgICAgcG9wYWQgICAgICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBhbGwgZXh0ZW5kZWQgcmVnaXN0ZXJzCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBwb3AgICAgIGVieAotICAgICAgICBqbXAgICAgIFtjczpfUHJldklSUV0gICAgICAgOyBDaGFpbiB0byBwcmV2aW91cyBJUlEgaGFuZGxlcgotCi1jcHJvY2VuZAotY3B1YmxpYyBfUE1faXJxSVNSVGVtcGxhdGVFbmQKLWVuZGlmCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFBNX2tleUlTUiAtIGtleWJvYXJkIGludGVycnVwdCBzdWJyb3V0aW5lIGRpc3BhdGNoZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUga2V5Ym9hcmQgaW50ZXJydXB0LCB0byBkaXNwYXRjaCBjb250cm9sCi07IHRvIGhpZ2ggbGV2ZWwgQyBiYXNlZCBzdWJyb3V0aW5lcy4gV2Ugc2F2ZSB0aGUgc3RhdGUgb2YgYWxsIHJlZ2lzdGVycwotOyBpbiB0aGlzIHJvdXRpbmUsIGFuZCBzd2l0Y2ggdG8gYSBsb2NhbCBzdGFjay4gSW50ZXJydXB0cyBhcmUgKm9mZioKLTsgd2hlbiB3ZSBjYWxsIHRoZSB1c2VyIGNvZGUuCi07Ci07IE5PVEU6IFRoaXMgcm91dGluZSBzd2l0Y2hlcyB0byBhIGxvY2FsIHN0YWNrIGJlZm9yZSBjYWxsaW5nIGFueSBDIGNvZGUsCi07ICAgICAgIGFuZCBoZW5jZSBpcyBfbm90XyByZS1lbnRyYW50LiBIb3dldmVyIHdlIGVuc3VyZSB3aXRoaW4gdGhpcyByb3V0aW5lCi07ICAgICAgIG11dHVhbCBleGNsdXNpb24gdG8gdGhlIGtleWJvYXJkIGhhbmRsaW5nIHJvdXRpbmUuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NmYXIgICAgX1BNX2tleUlTUgotCi0gICAgICAgIHB1c2ggICAgZHMgICAgICAgICAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBEUwotICAgICAgICBwdXNoICAgIGVzCi0gICAgICAgIHB1c2hhZCAgICAgICAgICAgICAgICAgIDsgU2F2ZSBfYWxsXyBleHRlbmRlZCByZWdpc3RlcnMKLSAgICAgICAgY2xkICAgICAgICAgICAgICAgICAgICAgOyBDbGVhciBkaXJlY3Rpb24gZmxhZwotCi0gICAgICAgIExPQURfRFMgICAgICAgICAgICAgICAgIDsgTG9hZCBEUyByZWdpc3RlcgotCi0gICAgICAgIGNtcCAgICAgW0JZVEUgS3lJbnNpZGVdLDEgICA7IENoZWNrIGZvciBtdXR1YWwgZXhjbHVzaW9uCi0gICAgICAgIGplICAgICAgQEBSZWlzc3VlZAotCi0gICAgICAgIG1vdiAgICAgW0JZVEUgS3lJbnNpZGVdLDEKLSAgICAgICAgTkVXU1RLICBLeVN0YWNrICAgICAgICAgOyBTd2l0Y2ggdG8gbG9jYWwgc3RhY2sKLSAgICAgICAgY2FsbCAgICBbQ1BUUiBfUE1fa2V5SGFuZGxlcl0gICA7IENhbGwgQyBjb2RlCi0gICAgICAgIFJFU1RTVEsgS3lTdGFjayAgICAgICAgIDsgUmVzdG9yZSBwcmV2aW91cyBzdGFjawotICAgICAgICBtb3YgICAgIFtCWVRFIEt5SW5zaWRlXSwwCi0KLUBARXhpdDogcG9wYWQgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIGFsbCBleHRlbmRlZCByZWdpc3RlcnMKLSAgICAgICAgcG9wICAgICBlcwotICAgICAgICBwb3AgICAgIGRzCi0gICAgICAgIGlyZXQgICAgICAgICAgICAgICAgICAgIDsgUmV0dXJuIGZyb20gaW50ZXJydXB0Ci0KLTsgV2hlbiB0aGUgQklPUyBrZXlib2FyZCBoYW5kbGVyIG5lZWRzIHRvIGNoYW5nZSB0aGUgU0hJRlQgc3RhdHVzIGxpZ2h0cwotOyBvbiB0aGUga2V5Ym9hcmQsIGluIHRoZSBwcm9jZXNzIG9mIGRvaW5nIHRoaXMgdGhlIGtleWJvYXJkIGNvbnRyb2xsZXIKLTsgcmUtaXNzdWVzIGFub3RoZXIgaW50ZXJydXB0LCB3aGlsZSB0aGUgY3VycmVudCBoYW5kbGVyIGlzIHN0aWxsIGV4ZWN1dGluZy4KLTsgSWYgd2UgcmVjaWV2ZSBhbm90aGVyIGludGVycnVwdCB3aGlsZSBzdGlsbCBoYW5kbGluZyB0aGUgY3VycmVudCBvbmUsCi07IHRoZW4gc2ltcGx5IGNoYWluIGRpcmVjdGx5IHRvIHRoZSBwcmV2aW91cyBoYW5kbGVyLgotOwotOyBOb3RlIHRoYXQgZm9yIG1vc3QgRE9TIGV4dGVuZGVycywgdGhlIHJlYWwgbW9kZSBpbnRlcnJ1cHQgaGFuZGxlciB0aGF0IHdlCi07IGluc3RhbGwgdGFrZXMgY2FyZSBvZiB0aGlzIGZvciB1cy4KLQotQEBSZWlzc3VlZDoKLWlmZGVmICAgVE5UCi0gICAgICAgIHB1c2ggICAgZWF4Ci0gICAgICAgIHB1c2ggICAgZWJ4Ci0gICAgICAgIHB1c2ggICAgZWN4Ci0gICAgICAgIHB1c2hmZCAgICAgICAgICAgICAgICAgIDsgUHVzaCBmbGFncyBvbiBzdGFjayB0byBzaW11bGF0ZSBpbnRlcnJ1cHQKLSAgICAgICAgbW92ICAgICBheCwyNTBFaCAgICAgICAgOyBDYWxsIHJlYWwgbW9kZSBwcm9jZWR1cmUgZnVuY3Rpb24KLSAgICAgICAgbW92ICAgICBlYngsW19QTV9wcmV2UmVhbEtleV0KLSAgICAgICAgbW92ICAgICBlY3gsMSAgICAgICAgICAgOyBDb3B5IHJlYWwgbW9kZSBmbGFncyB0byByZWFsIG1vZGUgc3RhY2sKLSAgICAgICAgaW50ICAgICAyMWggICAgICAgICAgICAgOyBDYWxsIHRoZSByZWFsIG1vZGUgY29kZQotICAgICAgICBwb3BmZAotICAgICAgICBwb3AgICAgIGVjeAotICAgICAgICBwb3AgICAgIGVieAotICAgICAgICBwb3AgICAgIGVheAotZWxzZQotICAgICAgICBwdXNoZgotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBjYWxsIGZhciBkd29yZCBbX1BNX3ByZXZLZXldCi1lbHNlCi0gICAgICAgIGNhbGwgICAgW19QTV9wcmV2S2V5XQotZW5kaWYKLWVuZGlmCi0gICAgICAgIGptcCAgICAgQEBFeGl0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFBNX2NoYWluUHJldmtleSAtIENoYWluIHRvIHByZXZpb3VzIGtleSBpbnRlcnJ1cHQgYW5kIHJldHVybgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ2hhaW5zIHRvIHRoZSBwcmV2aW91cyBrZXkgaW50ZXJydXB0IHJvdXRpbmUgYW5kIHJldHVybnMgY29udHJvbAotOyBiYWNrIHRvIHRoZSBoaWdoIGxldmVsIGludGVycnVwdCBoYW5kbGVyLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX2NoYWluUHJldktleQotCi1pZmRlZiAgIFROVAotICAgICAgICBwdXNoICAgIGVheAotICAgICAgICBwdXNoICAgIGVieAotICAgICAgICBwdXNoICAgIGVjeAotICAgICAgICBwdXNoZmQgICAgICAgICAgICAgICAgICA7IFB1c2ggZmxhZ3Mgb24gc3RhY2sgdG8gc2ltdWxhdGUgaW50ZXJydXB0Ci0gICAgICAgIG1vdiAgICAgYXgsMjUwRWggICAgICAgIDsgQ2FsbCByZWFsIG1vZGUgcHJvY2VkdXJlIGZ1bmN0aW9uCi0gICAgICAgIG1vdiAgICAgZWJ4LFtfUE1fcHJldlJlYWxLZXldCi0gICAgICAgIG1vdiAgICAgZWN4LDEgICAgICAgICAgIDsgQ29weSByZWFsIG1vZGUgZmxhZ3MgdG8gcmVhbCBtb2RlIHN0YWNrCi0gICAgICAgIGludCAgICAgMjFoICAgICAgICAgICAgIDsgQ2FsbCB0aGUgcmVhbCBtb2RlIGNvZGUKLSAgICAgICAgcG9wZmQKLSAgICAgICAgcG9wICAgICBlY3gKLSAgICAgICAgcG9wICAgICBlYngKLSAgICAgICAgcG9wICAgICBlYXgKLSAgICAgICAgcmV0Ci1lbHNlCi0KLTsgWUlLRVMhIEZvciBzb21lIHN0cmFuZ2UgcmVhc29uLCB3aGVuIGV4ZWN1dGlvbiByZXR1cm5zIGZyb20gdGhlCi07IHByZXZpb3VzIGtleWJvYXJkIGhhbmRsZXIsIGludGVycnVwdHMgYXJlIHJlLWVuYWJsZWQhISBTaW5jZSB3ZSBleHBlY3QKLTsgaW50ZXJydXB0cyB0byByZW1haW4gb2ZmIGR1cmluZyB0aGUgZHVyYXRpb24gb2Ygb3VyIGhhbmRsZXIsIHRoaXMgY2FuCi07IGNhdXNlIGhhdm9jLiBIb3dldmVyIG91ciBzdGFjayBtYWNyb3MgYWx3YXlzIHR1cm4gb2ZmIGludGVycnVwdHMsIHNvIHRoZXkKLTsgd2lsbCBiZSBvZmYgd2hlbiB3ZSBleGl0IHRoaXMgcm91dGluZS4gT2J2aW91c2x5IHRoZXJlIGlzIGEgdGlueSB3ZWVueQotOyB3aW5kb3cgd2hlbiBpbnRlcnJ1cHRzIHdpbGwgYmUgZW5hYmxlZCwgYnV0IHRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuCi07IGRvIGFib3V0IHRoaXMuCi0KLSAgICAgICAgU1dBUFNUSyBLeVN0YWNrICAgICAgICAgOyBTd2FwIGJhY2sgdG8gcHJldmlvdXMgc3RhY2sKLSAgICAgICAgcHVzaGYgICAgICAgICAgICAgICAgICAgOyBQdXNoIGZsYWdzIG9uIHN0YWNrIHRvIHNpbXVsYXRlIGludGVycnVwdAotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBjYWxsIGZhciBkd29yZCBbX1BNX3ByZXZLZXldCi1lbHNlCi0gICAgICAgIGNhbGwgICAgW19QTV9wcmV2S2V5XQotZW5kaWYKLSAgICAgICAgU1dBUFNUSyBLeVN0YWNrICAgICAgICAgOyBTd2FwIGJhY2sgdG8gQyBzdGFjayBhZ2FpbgotICAgICAgICByZXQKLWVuZGlmCi0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFBNX2tleTE1SVNSIC0gSW50IDE1aCBrZXlib2FyZCBpbnRlcnJ1cHQgc3Vicm91dGluZSBkaXNwYXRjaGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBUaGlzIHJvdXRpbmUgZ2V0cyBjYWxsZWQgaWYgd2UgaGF2ZSBiZWVuIGNhbGxlZCB0byBoYW5kbGUgdGhlIEludCAxNWgKLTsga2V5Ym9hcmQgaW50ZXJydXB0IGNhbGxvdXQgZnJvbSByZWFsIG1vZGUuCi07Ci07ICAgRW50cnk6ICBBWCAgLSBIYXJkd2FyZSBzY2FuIGNvZGUgdG8gcHJvY2VzcwotOyAgIEV4aXQ6ICAgQVggIC0gSGFyZHdhcmUgc2NhbiBjb2RlIHRvIHByb2Nlc3MgKDAgdG8gaWdub3JlKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jZmFyICAgIF9QTV9rZXkxNUlTUgotCi0gICAgICAgIHB1c2ggICAgZHMKLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBMT0FEX0RTCi0gICAgICAgIGNtcCAgICAgYWgsNEZoCi0gICAgICAgIGpueiAgICAgQEBOb3RPdXJzICAgICAgIDsgUXVpdCBpZiBub3Qga2V5Ym9hcmQgY2FsbG91dAotCi0gICAgICAgIHB1c2hhZAotICAgICAgICBjbGQgICAgICAgICAgICAgICAgICAgICA7IENsZWFyIGRpcmVjdGlvbiBmbGFnCi0gICAgICAgIHhvciAgICAgYWgsYWggICAgICAgICAgIDsgQVggOj0gc2NhbiBjb2RlCi0gICAgICAgIE5FV1NUSyAgS3kxNVN0YWNrICAgICAgIDsgU3dpdGNoIHRvIGxvY2FsIHN0YWNrCi0gICAgICAgIHB1c2ggICAgX2F4Ci0gICAgICAgIGNhbGwgICAgW0NQVFIgX1BNX2tleTE1SGFuZGxlcl0gOyBDYWxsIEMgY29kZQotICAgICAgICBfYWRkICAgIHNwLDIsNAotICAgICAgICBSRVNUU1RLIEt5MTVTdGFjayAgICAgICA7IFJlc3RvcmUgcHJldmlvdXMgc3RhY2sKLSAgICAgICAgdGVzdCAgICBheCxheAotICAgICAgICBqeiAgICAgIEBAMQotICAgICAgICBzdGMgICAgICAgICAgICAgICAgICAgICA7IFNldCBjYXJyeSB0byBwcm9jZXNzIGFzIG5vcm1hbAotICAgICAgICBqbXAgICAgIEBAMgotQEAxOiAgICBjbGMgICAgICAgICAgICAgICAgICAgICA7IENsZWFyIGNhcnJ5IHRvIGlnbm9yZSBzY2FuIGNvZGUKLUBAMjogICAgcG9wYWQKLSAgICAgICAgam1wICAgICBAQEV4aXQgICAgICAgICAgOyBXZSBhcmUgZG9uZQotCi1AQE5vdE91cnM6Ci1pZmRlZiAgIFROVAotICAgICAgICBwdXNoICAgIGVheAotICAgICAgICBwdXNoICAgIGVieAotICAgICAgICBwdXNoICAgIGVjeAotICAgICAgICBwdXNoZmQgICAgICAgICAgICAgICAgICA7IFB1c2ggZmxhZ3Mgb24gc3RhY2sgdG8gc2ltdWxhdGUgaW50ZXJydXB0Ci0gICAgICAgIG1vdiAgICAgYXgsMjUwRWggICAgICAgIDsgQ2FsbCByZWFsIG1vZGUgcHJvY2VkdXJlIGZ1bmN0aW9uCi0gICAgICAgIG1vdiAgICAgZWJ4LFtfUE1fcHJldlJlYWxLZXkxNV0KLSAgICAgICAgbW92ICAgICBlY3gsMSAgICAgICAgICAgOyBDb3B5IHJlYWwgbW9kZSBmbGFncyB0byByZWFsIG1vZGUgc3RhY2sKLSAgICAgICAgaW50ICAgICAyMWggICAgICAgICAgICAgOyBDYWxsIHRoZSByZWFsIG1vZGUgY29kZQotICAgICAgICBwb3BmZAotICAgICAgICBwb3AgICAgIGVjeAotICAgICAgICBwb3AgICAgIGVieAotICAgICAgICBwb3AgICAgIGVheAotZWxzZQotICAgICAgICBwdXNoZgotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBjYWxsIGZhciBkd29yZCBbX1BNX3ByZXZLZXkxNV0KLWVsc2UKLSAgICAgICAgY2FsbCAgICBbX1BNX3ByZXZLZXkxNV0KLWVuZGlmCi1lbmRpZgotQEBFeGl0OiBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLWlmZGVmIGZsYXRtb2RlbAotICAgICAgICByZXRmICAgIDQKLWVsc2UKLSAgICAgICAgcmV0ZiAgICAyCi1lbmRpZgotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQTV9icmVha0lTUiAtIENvbnRyb2wgQnJlYWsgaW50ZXJydXB0IHN1YnJvdXRpbmUgZGlzcGF0Y2hlcgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBDdHJsLUJyZWFrIGludGVycnVwdC4gV2Ugc2ltcGx5IHNldAotOyB0aGUgQ3RybC1CcmVhayBmbGFnIHRvIGEgMSBhbmQgbGVhdmUgKG5vdGUgdGhhdCB0aGlzIGlzIGFjY2Vzc2VkIHRocm91Z2gKLTsgYSBmYXIgcG9pbnRlciwgYXMgaXQgbWF5IHdlbGwgYmUgbG9jYXRlZCBpbiBjb252ZW50aW9uYWwgbWVtb3J5KS4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY2ZhciAgICBfUE1fYnJlYWtJU1IKLQotICAgICAgICBzdGkKLSAgICAgICAgcHVzaCAgICBkcyAgICAgICAgICAgICAgOyBTYXZlIHZhbHVlIG9mIERTCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgcHVzaCAgICBfYngKLQotICAgICAgICBMT0FEX0RTICAgICAgICAgICAgICAgICA7IExvYWQgRFMgcmVnaXN0ZXIKLWlmZGVmIGZsYXRtb2RlbAotICAgICAgICBtb3YgICAgIGVieCxbX1BNX2N0cmxCUHRyXQotZWxzZQotICAgICAgICBsZXMgICAgIGJ4LFtfUE1fY3RybEJQdHJdCi1lbmRpZgotICAgICAgICBtb3YgICAgIFtVSU5UIF9FUyBfYnhdLDEKLQotOyBSdW4gYWx0ZXJuYXRlIGJyZWFrIGhhbmRsZXIgY29kZSBpZiBpbnN0YWxsZWQKLQotICAgICAgICBjbXAgICAgIFtDUFRSIF9QTV9icmVha0hhbmRsZXJdLDAKLSAgICAgICAgamUgICAgICBAQEV4aXQKLQotICAgICAgICBwdXNoYWQKLSAgICAgICAgbW92ICAgICBfYXgsMQotICAgICAgICBwdXNoICAgIF9heAotICAgICAgICBjYWxsICAgIFtDUFRSIF9QTV9icmVha0hhbmRsZXJdIDsgQ2FsbCBDIGNvZGUKLSAgICAgICAgcG9wICAgICBfYXgKLSAgICAgICAgcG9wYWQKLQotQEBFeGl0OiBwb3AgICAgIF9ieAotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gZnJvbSBpbnRlcnJ1cHQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50IFBNX2N0cmxCcmVha0hpdChpbnQgY2xlYXJGbGFnKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgQ3RybC1CcmVhayBmbGFnIGFuZCBwb3NzaWJseSBjbGVhcnMgaXQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUE1fY3RybEJyZWFrSGl0Ci0KLSAgICAgICAgQVJHICAgICBjbGVhckZsYWc6VUlOVAotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgcHVzaGYgICAgICAgICAgICAgICAgICAgOyBTYXZlIGludGVycnVwdCBzdGF0dXMKLSAgICAgICAgcHVzaCAgICBlcwotaWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIG1vdiAgICAgZWJ4LFtfUE1fY3RybEJQdHJdCi1lbHNlCi0gICAgICAgIGxlcyAgICAgYngsW19QTV9jdHJsQlB0cl0KLWVuZGlmCi0gICAgICAgIGNsaSAgICAgICAgICAgICAgICAgICAgIDsgTm8gaW50ZXJydXB0cyB0aGFua3MhCi0gICAgICAgIG1vdiAgICAgX2F4LFtfRVMgX2J4XQotICAgICAgICB0ZXN0ICAgIFtCWVRFIGNsZWFyRmxhZ10sMQotICAgICAgICBqeiAgICAgIEBARG9uZQotICAgICAgICBtb3YgICAgIFtVSU5UIF9FUyBfYnhdLDAKLQotQEBEb25lOiBwb3AgICAgIGVzCi0gICAgICAgIHBvcGYgICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBpbnRlcnJ1cHQgc3RhdHVzCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFBNX2N0cmxDSVNSIC0gQ29udHJvbCBCcmVhayBpbnRlcnJ1cHQgc3Vicm91dGluZSBkaXNwYXRjaGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBIYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIEN0cmwtQyBpbnRlcnJ1cHQuIFdlIHNpbXBseSBzZXQKLTsgdGhlIEN0cmwtQyBmbGFnIHRvIGEgMSBhbmQgbGVhdmUgKG5vdGUgdGhhdCB0aGlzIGlzIGFjY2Vzc2VkIHRocm91Z2gKLTsgYSBmYXIgcG9pbnRlciwgYXMgaXQgbWF5IHdlbGwgYmUgbG9jYXRlZCBpbiBjb252ZW50aW9uYWwgbWVtb3J5KS4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY2ZhciAgICBfUE1fY3RybENJU1IKLQotICAgICAgICBzdGkKLSAgICAgICAgcHVzaCAgICBkcyAgICAgICAgICAgICAgOyBTYXZlIHZhbHVlIG9mIERTCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgcHVzaCAgICBfYngKLQotICAgICAgICBMT0FEX0RTICAgICAgICAgICAgICAgICA7IExvYWQgRFMgcmVnaXN0ZXIKLWlmZGVmIGZsYXRtb2RlbAotICAgICAgICBtb3YgICAgIGVieCxbX1BNX2N0cmxDUHRyXQotZWxzZQotICAgICAgICBsZXMgICAgIGJ4LFtfUE1fY3RybENQdHJdCi1lbmRpZgotICAgICAgICBtb3YgICAgIFtVSU5UIF9FUyBfYnhdLDEKLQotOyBSdW4gYWx0ZXJuYXRlIGJyZWFrIGhhbmRsZXIgY29kZSBpZiBpbnN0YWxsZWQKLQotICAgICAgICBjbXAgICAgIFtDUFRSIF9QTV9icmVha0hhbmRsZXJdLDAKLSAgICAgICAgamUgICAgICBAQEV4aXQKLQotICAgICAgICBwdXNoYWQKLSAgICAgICAgbW92ICAgICBfYXgsMAotICAgICAgICBwdXNoICAgIF9heAotICAgICAgICBjYWxsICAgIFtDUFRSIF9QTV9icmVha0hhbmRsZXJdIDsgQ2FsbCBDIGNvZGUKLSAgICAgICAgcG9wICAgICBfYXgKLSAgICAgICAgcG9wYWQKLQotQEBFeGl0OiBwb3AgICAgIF9ieAotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gZnJvbSBpbnRlcnJ1cHQKLSAgICAgICAgaXJldGQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50IFBNX2N0cmxDSGl0KGludCBjbGVhckZsYWcpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBDdHJsLUMgZmxhZyBhbmQgcG9zc2libHkgY2xlYXJzIGl0LgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX2N0cmxDSGl0Ci0KLSAgICAgICAgQVJHICAgICBjbGVhckZsYWc6VUlOVAotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgcHVzaGYgICAgICAgICAgICAgICAgICAgOyBTYXZlIGludGVycnVwdCBzdGF0dXMKLSAgICAgICAgcHVzaCAgICBlcwotaWZkZWYgZmxhdG1vZGVsCi0gICAgICAgIG1vdiAgICAgZWJ4LFtfUE1fY3RybENQdHJdCi1lbHNlCi0gICAgICAgIGxlcyAgICAgYngsW19QTV9jdHJsQ1B0cl0KLWVuZGlmCi0gICAgICAgIGNsaSAgICAgICAgICAgICAgICAgICAgIDsgTm8gaW50ZXJydXB0cyB0aGFua3MhCi0gICAgICAgIG1vdiAgICAgX2F4LFtfRVMgX2J4XQotICAgICAgICB0ZXN0ICAgIFtCWVRFIGNsZWFyRmxhZ10sMQotICAgICAgICBqeiAgICAgIEBARG9uZQotICAgICAgICBtb3YgICAgIFtVSU5UIF9FUyBfYnhdLDAKLQotQEBEb25lOgotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcGYgICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBpbnRlcnJ1cHQgc3RhdHVzCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFBNX2NyaXRpY2FsSVNSIC0gQ29udHJvbCBFcnJvciBoYW5kbGVyIGludGVycnVwdCBzdWJyb3V0aW5lIGRpc3BhdGNoZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgTVNET1MgQ3JpdGljYWwgRXJyb3IgaW50ZXJydXB0LCB0byBkaXNwYXRjaAotOyBjb250cm9sIHRvIGhpZ2ggbGV2ZWwgQyBiYXNlZCBzdWJyb3V0aW5lcy4gV2Ugc2F2ZSB0aGUgc3RhdGUgb2YgYWxsCi07IHJlZ2lzdGVycyBpbiB0aGlzIHJvdXRpbmUsIGFuZCBzd2l0Y2ggdG8gYSBsb2NhbCBzdGFjay4gV2UgYWxzbyBwYXNzCi07IHRoZSB2YWx1ZXMgb2YgdGhlIEFYIGFuZCBESSByZWdpc3RlcnMgdG8gdGhlIGFzIHBvaW50ZXJzLCBzbyB0aGF0IHRoZQotOyB2YWx1ZXMgY2FuIGJlIG1vZGlmaWVkIGJlZm9yZSByZXR1cm5pbmcgdG8gTVNET1MuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NmYXIgICAgX1BNX2NyaXRpY2FsSVNSCi0KLSAgICAgICAgc3RpCi0gICAgICAgIHB1c2ggICAgZHMgICAgICAgICAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBEUwotICAgICAgICBwdXNoICAgIGVzCi0gICAgICAgIHB1c2ggICAgX2J4ICAgICAgICAgICAgIDsgU2F2ZSByZWdpc3RlciB2YWx1ZXMgY2hhbmdlZAotICAgICAgICBjbGQgICAgICAgICAgICAgICAgICAgICA7IENsZWFyIGRpcmVjdGlvbiBmbGFnCi0KLSAgICAgICAgTE9BRF9EUyAgICAgICAgICAgICAgICAgOyBMb2FkIERTIHJlZ2lzdGVyCi1pZmRlZiBmbGF0bW9kZWwKLSAgICAgICAgbW92ICAgICBlYngsW19QTV9jcml0UHRyXQotZWxzZQotICAgICAgICBsZXMgICAgIGJ4LFtfUE1fY3JpdFB0cl0KLWVuZGlmCi0gICAgICAgIG1vdiAgICAgW19FUyBfYnhdLGF4Ci0gICAgICAgIG1vdiAgICAgW19FUyBfYngrMl0sZGkKLQotOyBSdW4gYWx0ZXJuYXRlIGNyaXRpY2FsIGhhbmRsZXIgY29kZSBpZiBpbnN0YWxsZWQKLQotICAgICAgICBjbXAgICAgIFtDUFRSIF9QTV9jcml0SGFuZGxlcl0sMAotICAgICAgICBqZSAgICAgIEBATm9BbHRIYW5kbGVyCi0KLSAgICAgICAgcHVzaGFkCi0gICAgICAgIHB1c2ggICAgX2RpCi0gICAgICAgIHB1c2ggICAgX2F4Ci0gICAgICAgIGNhbGwgICAgW0NQVFIgX1BNX2NyaXRIYW5kbGVyXSAgOyBDYWxsIEMgY29kZQotICAgICAgICBfYWRkICAgIHNwLDQsOAotICAgICAgICBwb3BhZAotCi0gICAgICAgIHBvcCAgICAgX2J4Ci0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBpcmV0ICAgICAgICAgICAgICAgICAgICA7IFJldHVybiBmcm9tIGludGVycnVwdAotCi1AQE5vQWx0SGFuZGxlcjoKLSAgICAgICAgbW92ICAgICBheCwzICAgICAgICAgICAgOyBUZWxsIE1TRE9TIHRvIGZhaWwgdGhlIG9wZXJhdGlvbgotICAgICAgICBwb3AgICAgIF9ieAotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gZnJvbSBpbnRlcnJ1cHQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50IFBNX2NyaXRpY2FsRXJyb3IoaW50ICpheFZhbCxpbnQgKmRpVmFsLGludCBjbGVhckZsYWcpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjcml0aWNhbCBlcnJvciBmbGFncywgYW5kIHRoZSB2YWx1ZXMgdGhhdAotOyBNU0RPUyBwYXNzZWQgaW4gdGhlIEFYIGFuZCBESSByZWdpc3RlcnMgdG8gb3VyIGhhbmRsZXIuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUE1fY3JpdGljYWxFcnJvcgotCi0gICAgICAgIEFSRyAgICAgYXhWYWw6RFBUUiwgZGlWYWw6RFBUUiwgY2xlYXJGbGFnOlVJTlQKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIHB1c2hmICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBpbnRlcnJ1cHQgc3RhdHVzCi0gICAgICAgIHB1c2ggICAgZXMKLWlmZGVmIGZsYXRtb2RlbAotICAgICAgICBtb3YgICAgIGVieCxbX1BNX2NyaXRQdHJdCi1lbHNlCi0gICAgICAgIGxlcyAgICAgYngsW19QTV9jcml0UHRyXQotZW5kaWYKLSAgICAgICAgY2xpICAgICAgICAgICAgICAgICAgICAgOyBObyBpbnRlcnJ1cHRzIHRoYW5rcyEKLSAgICAgICAgeG9yICAgICBfYXgsX2F4Ci0gICAgICAgIHhvciAgICAgX2RpLF9kaQotICAgICAgICBtb3YgICAgIGF4LFtfRVMgX2J4XQotICAgICAgICBtb3YgICAgIGRpLFtfRVMgX2J4KzJdCi0gICAgICAgIHRlc3QgICAgW0JZVEUgY2xlYXJGbGFnXSwxCi0gICAgICAgIGp6ICAgICAgQEBOb0NsZWFyCi0gICAgICAgIG1vdiAgICAgW1VMT05HIF9FUyBfYnhdLDAKLUBATm9DbGVhcjoKLSAgICAgICAgX2xlcyAgICBfYngsW2F4VmFsXQotICAgICAgICBtb3YgICAgIFtfRVMgX2J4XSxfYXgKLSAgICAgICAgX2xlcyAgICBfYngsW2RpVmFsXQotICAgICAgICBtb3YgICAgIFtfRVMgX2J4XSxfZGkKLSAgICAgICAgcG9wICAgICBlcwotICAgICAgICBwb3BmICAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgaW50ZXJydXB0IHN0YXR1cwotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX3NldE1vdXNlSGFuZGxlcihpbnQgbWFzaywgUE1fbW91c2VIYW5kbGVyIG1oKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV9zZXRNb3VzZUhhbmRsZXIKLQotICAgICAgICBBUkcgICAgIG1vdXNlTWFzazpVSU5UCi0KLSAgICAgICAgZW50ZXJfYwotICAgICAgICBwdXNoICAgIGVzCi0KLSAgICAgICAgbW92ICAgICBheCwwQ2ggICAgICAgICAgOyBBWCA6PSBGdW5jdGlvbiAxMiAtIGluc3RhbGwgaW50ZXJydXB0IHN1YgotICAgICAgICBtb3YgICAgIF9jeCxbbW91c2VNYXNrXSA7IENYIDo9IG1vdXNlIG1hc2sKLSAgICAgICAgbW92ICAgICBfZHgsb2Zmc2V0IF9QTV9tb3VzZUlTUgotICAgICAgICBwdXNoICAgIGNzCi0gICAgICAgIHBvcCAgICAgZXMgICAgICAgICAgICAgIDsgRVM6X0RYIC0+IG1vdXNlIGhhbmRsZXIKLSAgICAgICAgaW50ICAgICAzM2ggICAgICAgICAgICAgOyBDYWxsIG1vdXNlIGRyaXZlcgotCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotaWZkZWYgZmxhdG1vZGVsCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fbW91c2VQTUNCKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBNb3VzZSByZWFsbW9kZSBjYWxsYmFjayByb3V0aW5lLiBVcG9uIGVudHJ5IHRvIHRoaXMgcm91dGluZSwgd2UgcmVjaWV2ZQotOyB0aGUgZm9sbG93aW5nIGZyb20gdGhlIERQTUkgc2VydmVyOgotOwotOyAgIEVudHJ5OiAgRFM6X1NJICAtPiBSZWFsIG1vZGUgc3RhY2sgYXQgdGltZSBvZiBjYWxsCi07ICAgICAgICAgICBFUzpfREkgIC0+IFJlYWwgbW9kZSByZWdpc3RlciBkYXRhIHN0cnVjdHVyZQotOyAgICAgICAgICAgU1M6X1NQICAtPiBMb2NrZWQgcHJvdGVjdGVkIG1vZGUgc3RhY2sgdG8gdXNlCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NmYXIgICAgX1BNX21vdXNlUE1DQgotCi0gICAgICAgIHB1c2hhZAotICAgICAgICBtb3YgICAgIGVheCxbZXM6X2RpKzFDaF0gICAgOyBMb2FkIHJlZ2lzdGVyIHZhbHVlcyBmcm9tIHJlYWwgbW9kZQotICAgICAgICBtb3YgICAgIGVieCxbZXM6X2RpKzEwaF0KLSAgICAgICAgbW92ICAgICBlY3gsW2VzOl9kaSsxOGhdCi0gICAgICAgIG1vdiAgICAgZWR4LFtlczpfZGkrMTRoXQotICAgICAgICBtb3YgICAgIGVzaSxbZXM6X2RpKzA0aF0KLSAgICAgICAgbW92ICAgICBlZGksW2VzOl9kaV0KLSAgICAgICAgY2FsbCAgICBfUE1fbW91c2VJU1IgICAgICAgIDsgQ2FsbCB0aGUgbW91c2UgaGFuZGxlcgotICAgICAgICBwb3BhZAotCi0gICAgICAgIG1vdiAgICAgYXgsW2RzOl9zaV0KLSAgICAgICAgbW92ICAgICBbZXM6X2RpKzJBaF0sYXggICAgIDsgUGx1ZyBpbiByZXR1cm4gSVAgYWRkcmVzcwotICAgICAgICBtb3YgICAgIGF4LFtkczpfc2krMl0KLSAgICAgICAgbW92ICAgICBbZXM6X2RpKzJDaF0sYXggICAgIDsgUGx1ZyBpbiByZXR1cm4gQ1MgdmFsdWUKLSAgICAgICAgYWRkICAgICBbV09SRCBlczpfZGkrMkVoXSw0IDsgUmVtb3ZlIHJldHVybiBhZGRyZXNzIGZyb20gc3RhY2sKLSAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgICAgIDsgR28gYmFjayB0byByZWFsIG1vZGUhCi0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1faW50MTBQTUNCKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpbnQxMCByZWFsbW9kZSBjYWxsYmFjayByb3V0aW5lLiBVcG9uIGVudHJ5IHRvIHRoaXMgcm91dGluZSwgd2UgcmVjaWV2ZQotOyB0aGUgZm9sbG93aW5nIGZyb20gdGhlIERQTUkgc2VydmVyOgotOwotOyAgIEVudHJ5OiAgRFM6RVNJICAtPiBSZWFsIG1vZGUgc3RhY2sgYXQgdGltZSBvZiBjYWxsCi07ICAgICAgICAgICBFUzpFREkgIC0+IFJlYWwgbW9kZSByZWdpc3RlciBkYXRhIHN0cnVjdHVyZQotOyAgICAgICAgICAgU1M6RVNQICAtPiBMb2NrZWQgcHJvdGVjdGVkIG1vZGUgc3RhY2sgdG8gdXNlCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NmYXIgICAgICAgIF9QTV9pbnQxMFBNQ0IKLQotICAgICAgICBwdXNoYWQKLSAgICAgICAgcHVzaCAgICBkcwotICAgICAgICBwdXNoICAgIGVzCi0gICAgICAgIHB1c2ggICAgZnMKLQotICAgICAgICBwdXNoZmQKLSAgICAgICAgcG9wICAgICBlYXgKLSAgICAgICAgbW92ICAgICBbZXM6ZWRpKzIwaF0sYXggICAgIDsgU2F2ZSByZXR1cm4gZmxhZyBzdGF0dXMKLSAgICAgICAgbW92ICAgICBheCxbZHM6ZXNpXQotICAgICAgICBtb3YgICAgIFtlczplZGkrMkFoXSxheCAgICAgOyBQbHVnIGluIHJldHVybiBJUCBhZGRyZXNzCi0gICAgICAgIG1vdiAgICAgYXgsW2RzOmVzaSsyXQotICAgICAgICBtb3YgICAgIFtlczplZGkrMkNoXSxheCAgICAgOyBQbHVnIGluIHJldHVybiBDUyB2YWx1ZQotICAgICAgICBhZGQgICAgIFtXT1JEIGVzOmVkaSsyRWhdLDQgOyBSZW1vdmUgcmV0dXJuIGFkZHJlc3MgZnJvbSBzdGFjawotCi07IENhbGwgdGhlIGluc3RhbGwgaW50MTAgaGFuZGxlciBpbiBwcm90ZWN0ZWQgbW9kZS4gVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZAotOyB3aXRoIERTIHNldCB0byB0aGUgY3VycmVudCBkYXRhIHNlbGVjdG9yLCBhbmQgRVM6RURJIHBvaW50aW5nIHRoZSB0aGUKLTsgcmVhbCBtb2RlIERQTUkgcmVnaXN0ZXIgc3RydWN0dXJlIGF0IHRoZSB0aW1lIG9mIHRoZSBpbnRlcnJ1cHQuIFRoZQotOyBoYW5kbGUgbXVzdCBiZSB3cml0dGVuIGluIGFzc2VtYmxlciB0byBiZSBhYmxlIHRvIGV4dHJhY3QgdGhlIHJlYWwgbW9kZQotOyByZWdpc3RlciB2YWx1ZXMgZnJvbSB0aGUgc3RydWN0dXJlCi0KLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBwb3AgICAgIGZzICAgICAgICAgICAgICAgICAgOyBGUzpFREkgLT4gcmVhbCBtb2RlIHJlZ2lzdGVycwotICAgICAgICBMT0FEX0RTCi0gICAgICAgIE5FV1NUSyAgSW50MTBTdGFjayAgICAgICAgICA7IFN3aXRjaCB0byBsb2NhbCBzdGFjawotCi0gICAgICAgIGNhbGwgICAgW19QTV9pbnQxMEhhbmRsZXJdCi0KLSAgICAgICAgUkVTVFNUSyBJbnQxMFN0YWNrICAgICAgICAgIDsgUmVzdG9yZSBwcmV2aW91cyBzdGFjawotICAgICAgICBwb3AgICAgIGZzCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBwb3BhZAotICAgICAgICBpcmV0ICAgICAgICAgICAgICAgICAgICAgICAgOyBHbyBiYWNrIHRvIHJlYWwgbW9kZSEKLQotY3Byb2NlbmQKLQotZW5kaWYKLQotY3B1YmxpYyBfUE1fcG1kb3NDb2RlRW5kCi0KLWVuZGNvZGVzZWcgIF9wbWRvcwotCi0gICAgICAgIEVORCAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL192ZmxhdC5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvX3ZmbGF0LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ5ODVhOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvX3ZmbGF0LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDY1MiArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi07KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi07KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLTsqCi07KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLTsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsqCi07KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KgotOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqICAgICAgICAgICAgQmFzZWQgb24gb3JpZ2luYWwgY29kZSBDb3B5cmlnaHQgMTk5NCBPdHRvIENocm9ucwotOyoKLTsqIExhbmd1YWdlOiAgICA4MDM4NiBBc3NlbWJsZXIsIFRBU00gNC4wIG9yIGxhdGVyCi07KiBFbnZpcm9ubWVudDogSUJNIFBDIDMyIGJpdCBwcm90ZWN0ZWQgbW9kZQotOyoKLTsqIERlc2NyaXB0aW9uOiBMb3cgbGV2ZWwgcGFnZSBmYXVsdCBoYW5kbGVyIGZvciB2aXJ0dWFsIGxpbmVhciBmcmFtZWJ1ZmZlcnMuCi07KgotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICBJREVBTAotICAgICAgICBKVU1QUwotCi1pbmNsdWRlICJzY2l0ZWNoLm1hYyIgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcwotCi1oZWFkZXIgICAgICBfdmZsYXQgICAgICAgICAgICAgIDsgU2V0IHVwIG1lbW9yeSBtb2RlbAotCi1WRkxBVF9TVEFSVCAgICAgRVFVIDBGMDAwMDAwMGgKLVZGTEFUX0VORCAgICAgICBFUVUgMEYwM0ZGRkZGaAotUEFHRV9QUkVTRU5UICAgIEVRVSAxCi1QQUdFX05PVFBSRVNFTlQgRVFVIDAKLVBBR0VfUkVBRCAgICAgICBFUVUgMAotUEFHRV9XUklURSAgICAgIEVRVSAyCi0KLWlmZGVmICAgRE9TNEdXCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERPUzRHL1cgZmxhdCBsaW5lYXIgZnJhbWVidWZmZXIgZW11bGF0aW9uLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYmVnZGF0YXNlZyAgX3ZmbGF0Ci0KLTsgTmVhciBwb2ludGVycyB0byB0aGUgcGFnZSBkaXJlY3RvcnkgYmFzZSBhbmQgb3VyIHBhZ2UgdGFibGVzLiBBbGwgb2YKLTsgdGhpcyBtZW1vcnkgaXMgYWx3YXlzIGxvY2F0ZWQgaW4gdGhlIGZpcnN0IE1iIG9mIERPUyBtZW1vcnkuCi0KLVBEQlIgICAgICAgICAgICBkZCAgMCAgICAgICAgICAgICAgIDsgUGFnZSBkaXJlY3RvcnkgYmFzZSByZWdpc3RlciAoQ1IzKQotYWNjZXNzUGFnZUFkZHIgIGRkICAwCi1hY2Nlc3NQYWdlVGFibGUgZGQgIDAKLQotOyBDYXVzZVdheSBwYWdlIGRpcmVjdG9yeSAmIDFzdCBwYWdlIHRhYmxlIGxpbmVhciBhZGRyZXNzZXMuCi0KLUNhdXNlV2F5RElSTGluZWFyIGRkIDAKLUNhdXNlV2F5MXN0TGluZWFyIGRkIDAKLQotOyBQbGFjZSB0byBzdG9yZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIFBhZ2UgVGFibGUgRGlyZWN0b3J5IGJlZm9yZSB3ZQotOyBpbnRpYWxpc2VkIG91ciB2aXJ0dWFsIGJ1ZmZlciBjb2RlLgotCi1wYWdlRGlyZWN0b3J5OiAgcmVzZCAxMDI0ICAgICAgICAgICA7IFNhdmVkIHBhZ2UgdGFibGUgZGlyZWN0b3J5Ci0KLVZhbGlkQ1MgICAgICAgICBkdyAgMCAgICAgICAgICAgICAgIDsgVmFsaWQgQ1MgZm9yIHBhZ2UgZmF1bHRzCi1SaW5nMENTICAgICAgICAgZHcgIDAgICAgICAgICAgICAgICA7IE91ciByaW5nIDAgY29kZSBzZWxlY3RvcgotTGFzdFBhZ2UgICAgICAgIGRkICAwICAgICAgICAgICAgICAgOyBMYXN0IHBhZ2Ugd2UgbWFwcGVkIGluCi1CYW5rRnVuY0J1ZjogICAgcmVzYiAxMDEgICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIGJhbmsgc3dpdGNoIGNvZGUKLUJhbmtGdW5jUHRyICAgICBkZCAgb2Zmc2V0IEJhbmtGdW5jQnVmCi0KLUlOVDE0R2F0ZToKLUlOVDE0T2Zmc2V0ICAgICBkZCAgICAgIDAgICAgICAgICAgIDsgZWlwIG9mIG9yaWdpbmFsIHZlY3RvcgotSU5UMTRTZWxlY3RvciAgIGR3ICAgICAgMCAgICAgICAgICAgOyBjcyBvZiBvcmlnaW5hbCB2ZWN0b3IKLQotICAgICAgICBjZXh0ZXJuIF9QTV9zYXZlZERTLFVTSE9SVAotICAgICAgICBjZXh0ZXJuIFZGX2hhdmVDYXVzZVdheSxCT09MCi0KLWVuZGRhdGFzZWcgIF92ZmxhdAotCi1iZWdjb2Rlc2VnICBfdmZsYXQgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLSAgICAgICAgY2V4dGVybiBWRl9tYWxsb2MsRlBUUgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQRl9oYW5kbGVyNjRrIC0gUGFnZSBmYXVsdCBoYW5kbGVyIGZvciA2NGsgYmFua3MKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFRoZSBoYW5kbGVyIGJlbG93IGlzIGEgMzIgYml0IHJpbmcgMCBwYWdlIGZhdWx0IGhhbmRsZXIuICBJdCByZWNlaXZlcwotOyBjb250cm9sIGltbWVkaWF0ZWx5IGFmdGVyIGFueSBwYWdlIGZhdWx0IG9yIGFmdGVyIGFuIElSUTYgKGhhcmR3YXJlCi07IGludGVycnVwdCkuIFRoaXMgcHJvdmlkZXMgdGhlIGZhc3Rlc3QgcG9zc2libGUgaGFuZGxpbmcgb2YgcGFnZSBmYXVsdHMKLTsgc2luY2UgaXQganVtcCBkaXJlY3RseSBoZXJlLiAgSWYgdGhpcyBpcyBhIHBhZ2UgZmF1bHQsIHRoZSBudW1iZXIKLTsgaW1tZWRpYXRlbHkgb24gdGhlIHN0YWNrIHdpbGwgYmUgYW4gZXJyb3IgY29kZSwgYXQgb2Zmc2V0IDQgd2lsbCBiZQotOyB0aGUgZWlwIG9mIHRoZSBmYXVsdGluZyBpbnN0cnVjdGlvbiwgYXQgb2Zmc2V0IDggd2lsbCBiZSB0aGUgY3Mgb2YgdGhlCi07IGZhdWx0aW5nIGluc3RydWN0aW9uLiAgSWYgaXQgaXMgYSBoYXJkd2FyZSBpbnRlcnJ1cHQsIGl0IHdpbGwgbm90IGhhdmUKLTsgdGhlIGVycm9yIGNvZGUgYW5kIHRoZSBlZmxhZ3Mgd2lsbCBiZSBhdCBvZmZzZXQgOC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY2ZhciAgICBQRl9oYW5kbGVyNjRrCi0KLTsgQ2hlY2sgaWYgdGhpcyBpcyBhIHByb2Nlc3NvciBleGVjZXB0aW9uIG9yIGEgcGFnZSBmYXVsdAotCi0gICAgICAgIHB1c2ggICAgZWF4Ci0gICAgICAgIG1vdiAgICAgYXgsW2NzOlZhbGlkQ1NdICAgICA7IFVzZSBDUyBvdmVycmlkZSB0byBhY2Nlc3MgZGF0YQotICAgICAgICBjbXAgICAgIFtzczplc3ArMTJdLGF4ICAgICAgOyBJcyB0aGlzIGEgcGFnZSBmYXVsdD8KLSAgICAgICAgam5lICAgICBAQFRvT2xkSGFuZGxlciAgICAgIDsgTm9wZSwganVtcCB0byB0aGUgcHJldmlvdXMgaGFuZGxlcgotCi07IEdldCBhZGRyZXNzIG9mIHBhZ2UgZmF1bHQgYW5kIGNoZWNrIGlmIHdpdGhpbiBvdXIgaGFuZGxlcnMgcmFuZ2UKLQotICAgICAgICBtb3YgICAgIGVheCxjcjIgICAgICAgICAgICAgOyBFQlggaGFzIHBhZ2UgZmF1bHQgbGluZWFyIGFkZHJlc3MKLSAgICAgICAgY21wICAgICBlYXgsVkZMQVRfU1RBUlQgICAgIDsgSXMgdGhlIGZhdWx0IGxlc3MgdGhhbiBvdXJzPwotICAgICAgICBqYiAgICAgIEBAVG9PbGRIYW5kbGVyICAgICAgOyBZZXAsIGdvIHRvIHByZXZpb3VzIGhhbmRsZXIKLSAgICAgICAgY21wICAgICBlYXgsVkZMQVRfRU5EICAgICAgIDsgSXMgdGhlIGZhdWx0IG1vcmUgdGhhbiBvdXJzPwotICAgICAgICBqYWUgICAgIEBAVG9PbGRIYW5kbGVyICAgICAgOyBZZXAsIGdvIHRvIHByZXZpb3VzIGhhbmRsZXIKLQotOyBUaGlzIGlzIG91ciBwYWdlIGZhdWx0LCBzbyB3ZSBuZWVkIHRvIGhhbmRsZSBpdAotCi0gICAgICAgIHB1c2hhZAotICAgICAgICBwdXNoICAgIGRzCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgbW92ICAgICBlYngsZWF4ICAgICAgICAgICAgIDsgRUJYIDo9IHBhZ2UgZmF1bHQgYWRkcmVzcwotICAgICAgICBhbmQgICAgIGVieCxpbnZlcnQgMEZGRkZoICAgOyBNYXNrIHRvIDY0ayBiYW5rIGJvdW5kYXJ5Ci0gICAgICAgIG1vdiAgICAgZHMsW2NzOl9QTV9zYXZlZERTXTsgTG9hZCBzZWdtZW50IHJlZ2lzdGVycwotICAgICAgICBtb3YgICAgIGVzLFtjczpfUE1fc2F2ZWREU10KLQotOyBNYXAgaW4gdGhlIHBhZ2UgdGFibGUgZm9yIG91ciB2aXJ0dWFsIGZyYW1lYnVmZmVyIGFyZWEgZm9yIG1vZGlmaWNhdGlvbgotCi0gICAgICAgIG1vdiAgICAgZWRpLFtQREJSXSAgICAgICAgICA7IEVESSBwb2ludHMgdG8gcGFnZSBkaXJlY3RvcnkKLSAgICAgICAgbW92ICAgICBlZHgsZWJ4ICAgICAgICAgICAgIDsgRURYID0gbGluZWFyIGFkZHJlc3MKLSAgICAgICAgc2hyICAgICBlZHgsMjIgICAgICAgICAgICAgIDsgRURYID0gb2Zmc2V0IHRvIHBhZ2UgZGlyZWN0b3J5Ci0gICAgICAgIG1vdiAgICAgZWR4LFtlZHgqNCtlZGldICAgICA7IEVEWCA9IHBoeXNpY2FsIHBhZ2UgdGFibGUgYWRkcmVzcwotICAgICAgICBtb3YgICAgIGVheCxlZHgKLSAgICAgICAgbW92ICAgICBlZHgsW2FjY2Vzc1BhZ2VUYWJsZV0KLSAgICAgICAgb3IgICAgICBlYXgsNwotICAgICAgICBtb3YgICAgIFtlZHhdLGVheAotICAgICAgICBtb3YgICAgIGVheCxjcjMKLSAgICAgICAgbW92ICAgICBjcjMsZWF4ICAgICAgICAgICAgIDsgVXBkYXRlIHBhZ2UgdGFibGUgY2FjaGUKLQotOyBNYXJrIGFsbCBwYWdlcyB2YWxpZCBmb3IgdGhlIG5ldyBwYWdlIGZhdWx0IGFyZWEKLQotICAgICAgICBtb3YgICAgIGVzaSxlYnggICAgICAgICAgICAgOyBFU0kgOj0gbGluZWFyIGFkZHJlc3MgZm9yIHBhZ2UKLSAgICAgICAgc2hyICAgICBlc2ksMTAKLSAgICAgICAgYW5kICAgICBlc2ksMEZGRmggICAgICAgICAgIDsgT2Zmc2V0IGludG8gcGFnZSB0YWJsZQotICAgICAgICBhZGQgICAgIGVzaSxbYWNjZXNzUGFnZUFkZHJdCi1pZmRlZiAgIFVTRV9OQVNNCi0lYXNzaWduIG9mZiAwCi0lcmVwIDE2Ci0gICAgICAgIG9yICAgICAgW0RXT1JEIGVzaStvZmZdLDAwMDAwMDAwMDFoIDsgRW5hYmxlIHBhZ2VzCi0lYXNzaWduIG9mZiBvZmYrNAotJWVuZHJlcAotZWxzZQotb2ZmID0gMAotUkVQVCAgICAxNgotICAgICAgICBvciAgICAgIFtEV09SRCBlc2krb2ZmXSwwMDAwMDAwMDAxaCA7IEVuYWJsZSBwYWdlcwotb2ZmID0gb2ZmKzQKLUVORE0KLWVuZGlmCi0KLTsgTWFyayBhbGwgcGFnZXMgaW52YWxpZCBmb3IgdGhlIHByZXZpb3VzbHkgbWFwcGVkIGFyZWEKLQotICAgICAgICB4Y2hnICAgIGVzaSxbTGFzdFBhZ2VdICAgICAgOyBTYXZlIGxhc3QgcGFnZSBmb3IgbmV4dCBwYWdlIGZhdWx0Ci0gICAgICAgIHRlc3QgICAgZXNpLGVzaQotICAgICAgICBqeiAgICAgIEBARG9uZU1hcHBpbmcgICAgICAgOyBEb250IHVwZGF0ZSBpZiBmaXJzdCB0aW1lIHJvdW5kCi1pZmRlZiAgIFVTRV9OQVNNCi0lYXNzaWduIG9mZiAwCi0lcmVwIDE2Ci0gICAgICAgIG9yICAgICAgW0RXT1JEIGVzaStvZmZdLDBGRkZGRkZGRWggIDsgRGlzYWJsZSBwYWdlcwotJWFzc2lnbiBvZmYgb2ZmKzQKLSVlbmRyZXAKLWVsc2UKLW9mZiA9IDAKLVJFUFQgICAgMTYKLSAgICAgICAgYW5kICAgICBbRFdPUkQgZXNpK29mZl0sMEZGRkZGRkZFaCAgOyBEaXNhYmxlIHBhZ2VzCi1vZmYgPSBvZmYrNAotRU5ETQotZW5kaWYKLQotQEBEb25lTWFwcGluZzoKLSAgICAgICAgbW92ICAgICBlYXgsY3IzCi0gICAgICAgIG1vdiAgICAgY3IzLGVheCAgICAgICAgICAgICA7IEZsdXNoIHRoZSBUTEIKLQotOyBOb3cgcHJvZ3JhbSB0aGUgbmV3IFN1cGVyVkdBIHN0YXJ0aW5nIGJhbmsgYWRkcmVzcwotCi0gICAgICAgIG1vdiAgICAgZWF4LGVieCAgICAgICAgICAgICA7IEVBWCA6PSBwYWdlIGZhdWx0IGFkZHJlc3MKLSAgICAgICAgc2hyICAgICBlYXgsMTYKLSAgICAgICAgYW5kICAgICBlYXgsMEZGaCAgICAgICAgICAgIDsgTWFzayB0byAwLTI1NQotICAgICAgICBjYWxsICAgIFtCYW5rRnVuY1B0cl0gICAgICAgOyBDYWxsIHRoZSBiYW5rIHN3aXRjaCBmdW5jdGlvbgotCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBwb3BhZAotICAgICAgICBwb3AgICAgIGVheAotICAgICAgICBhZGQgICAgIGVzcCw0ICAgICAgICAgICAgICAgOyBQb3AgdGhlIGVycm9yIGNvZGUgZnJvbSBzdGFjawotICAgICAgICBpcmV0ZCAgICAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gdG8gZmF1bHRpbmcgaW5zdHJ1Y3Rpb24KLQotQEBUb09sZEhhbmRsZXI6Ci0gICAgICAgIHBvcCAgICAgZWF4Ci1pZmRlZiAgIFVTRV9OQVNNCi0gICAgICAgIGptcCBmYXIgZHdvcmQgW2NzOklOVDE0R2F0ZV07IENoYWluIHRvIHByZXZpb3VzIGhhbmRsZXIKLWVsc2UKLSAgICAgICAgam1wICAgICBbRldPUkQgY3M6SU5UMTRHYXRlXTsgQ2hhaW4gdG8gcHJldmlvdXMgaGFuZGxlcgotZW5kaWYKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUEZfaGFuZGxlcjRrICAtIFBhZ2UgZmF1bHQgaGFuZGxlciBmb3IgNGsgYmFua3MKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFRoZSBoYW5kbGVyIGJlbG93IGlzIGEgMzIgYml0IHJpbmcgMCBwYWdlIGZhdWx0IGhhbmRsZXIuICBJdCByZWNlaXZlcwotOyBjb250cm9sIGltbWVkaWF0ZWx5IGFmdGVyIGFueSBwYWdlIGZhdWx0IG9yIGFmdGVyIGFuIElSUTYgKGhhcmR3YXJlCi07IGludGVycnVwdCkuIFRoaXMgcHJvdmlkZXMgdGhlIGZhc3Rlc3QgcG9zc2libGUgaGFuZGxpbmcgb2YgcGFnZSBmYXVsdHMKLTsgc2luY2UgaXQganVtcCBkaXJlY3RseSBoZXJlLiAgSWYgdGhpcyBpcyBhIHBhZ2UgZmF1bHQsIHRoZSBudW1iZXIKLTsgaW1tZWRpYXRlbHkgb24gdGhlIHN0YWNrIHdpbGwgYmUgYW4gZXJyb3IgY29kZSwgYXQgb2Zmc2V0IDQgd2lsbCBiZQotOyB0aGUgZWlwIG9mIHRoZSBmYXVsdGluZyBpbnN0cnVjdGlvbiwgYXQgb2Zmc2V0IDggd2lsbCBiZSB0aGUgY3Mgb2YgdGhlCi07IGZhdWx0aW5nIGluc3RydWN0aW9uLiAgSWYgaXQgaXMgYSBoYXJkd2FyZSBpbnRlcnJ1cHQsIGl0IHdpbGwgbm90IGhhdmUKLTsgdGhlIGVycm9yIGNvZGUgYW5kIHRoZSBlZmxhZ3Mgd2lsbCBiZSBhdCBvZmZzZXQgOC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY2ZhciAgICBQRl9oYW5kbGVyNGsKLQotOyBGaWxsIGluIHdoZW4gd2UgaGF2ZSB0ZXN0ZWQgYWxsIHRoZSA2NEtiIGNvZGUKLQotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBqbXAgZmFyIGR3b3JkIFtjczpJTlQxNEdhdGVdOyBDaGFpbiB0byBwcmV2aW91cyBoYW5kbGVyCi1lbHNlCi0gICAgICAgIGptcCAgICAgW0ZXT1JEIGNzOklOVDE0R2F0ZV07IENoYWluIHRvIHByZXZpb3VzIGhhbmRsZXIKLWVuZGlmCi0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgSW5zdGFsbEZhdWx0SGFuZGxlcih2b2lkICpiYXNlQWRkcixpbnQgYmFua1NpemUpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJbnN0YWxsZXMgdGhlIHBhZ2UgZmF1bHQgaGFuZGxlciBkaXJlY3RseSBpbnQgdGhlIGludGVycnVwdCBkZXNjcmlwdG9yCi07IHRhYmxlIGZvciBtYXhpbXVtIHBlcmZvcm1hbmNlLiBUaGlzIG9mIGNvdXJzZSByZXF1aXJlcyByaW5nIDAgYWNjZXNzLAotOyBidXQgbm9uZSBvZiB0aGlzIHN0dWZmIHdpbGwgcnVuIHdpdGhvdXQgcmluZyAwIQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIEluc3RhbGxGYXVsdEhhbmRsZXIKLQotICAgICAgICBBUkcgICAgIGJhc2VBZGRyOlVMT05HLCBiYW5rU2l6ZTpVSU5UCi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIG1vdiAgICAgW0RXT1JEIExhc3RQYWdlXSwwICA7IE5vIHBhZ2VzIGhhdmUgYmVlbiBtYXBwZWQKLSAgICAgICAgbW92ICAgICBheCxjcwotICAgICAgICBtb3YgICAgIFtWYWxpZENTXSxheCAgICAgICAgOyBTYXZlIENTIHZhbHVlIGZvciBwYWdlIGZhdWx0cwotCi07IFB1dCBhZGRyZXNzIG9mIG91ciBwYWdlIGZhdWx0IGhhbmRsZXIgaW50byB0aGUgSURUIGRpcmVjdGx5Ci0KLSAgICAgICAgc3ViICAgICBlc3AsNiAgICAgICAgICAgICAgIDsgQWxsb2NhdGUgc3BhY2Ugb24gc3RhY2sKLWlmZGVmICAgVVNFX05BU00KLSAgICAgICAgc2lkdCAgICBbc3M6ZXNwXSAgICAgICAgICAgIDsgU3RvcmUgcG9pbnRlciB0byBJRFQKLWVsc2UKLSAgICAgICAgc2lkdCAgICBbRldPUkQgc3M6ZXNwXSAgICAgIDsgU3RvcmUgcG9pbnRlciB0byBJRFQKLWVuZGlmCi0gICAgICAgIHBvcCAgICAgYXggICAgICAgICAgICAgICAgICA7IGFkZCBlc3AsMgotICAgICAgICBwb3AgICAgIGVheCAgICAgICAgICAgICAgICAgOyBBYnNvbHV0ZSBhZGRyZXNzIG9mIElEVAotICAgICAgICBhZGQgICAgIGVheCwxNCo4ICAgICAgICAgICAgOyBQb2ludCB0byBJbnQgIzE0Ci0KLTsgTm90ZSB0aGF0IEludGVycnVwdCBnYXRlcyBkbyBub3QgaGF2ZSB0aGUgaGlnaCBhbmQgbG93IHdvcmQgb2YgdGhlCi07IG9mZnNldCBpbiBhZGphY2VudCB3b3JkcyBpbiBtZW1vcnksIHRoZXJlIGFyZSA0IGJ5dGVzIHNlcGFyYXRpbmcgdGhlbS4KLQotICAgICAgICBtb3YgICAgIGVjeCxbZWF4XSAgICAgICAgICAgOyBHZXQgY3MgYW5kIGxvdyAxNiBiaXRzIG9mIG9mZnNldAotICAgICAgICBtb3YgICAgIGVkeCxbZWF4KzZdICAgICAgICAgOyBHZXQgaGlnaCAxNiBiaXRzIG9mIG9mZnNldCBpbiBkeAotICAgICAgICBzaGwgICAgIGVkeCwxNgotICAgICAgICBtb3YgICAgIGR4LGN4ICAgICAgICAgICAgICAgOyBlZHggaGFzIG9mZnNldAotICAgICAgICBtb3YgICAgIFtJTlQxNE9mZnNldF0sZWR4ICAgOyBTYXZlIG9mZnNldAotICAgICAgICBzaHIgICAgIGVjeCwxNgotICAgICAgICBtb3YgICAgIFtJTlQxNFNlbGVjdG9yXSxjeCAgOyBTYXZlIG9yaWdpbmFsIGNzCi0gICAgICAgIG1vdiAgICAgW2VheCsyXSxjcyAgICAgICAgICA7IEluc3RhbGwgbmV3IGNzCi0gICAgICAgIG1vdiAgICAgZWR4LG9mZnNldCBQRl9oYW5kbGVyNjRrCi0gICAgICAgIGNtcCAgICAgW1VJTlQgYmFua1NpemVdLDQKLSAgICAgICAgam5lICAgICBAQDEKLSAgICAgICAgbW92ICAgICBlZHgsb2Zmc2V0IFBGX2hhbmRsZXI0awotQEAxOiAgICBtb3YgICAgIFtlYXhdLGR4ICAgICAgICAgICAgOyBJbnN0YWxsIGxvdyB3b3JkIG9mIG9mZnNldAotICAgICAgICBzaHIgICAgIGVkeCwxNgotICAgICAgICBtb3YgICAgIFtlYXgrNl0sZHggICAgICAgICAgOyBJbnN0YWxsIGhpZ2ggd29yZCBvZiBvZmZzZXQKLQotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFJlbW92ZUZhdWx0SGFuZGxlcih2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ2xvc2VzIGRvd24gdGhlIHZpcnR1YWwgZnJhbWVidWZmZXIgc2VydmljZXMgYW5kIHJlc3RvcmVzIHRoZSBwcmV2aW91cwotOyBwYWdlIGZhdWx0IGhhbmRsZXIuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUmVtb3ZlRmF1bHRIYW5kbGVyCi0KLSAgICAgICAgZW50ZXJfYwotCi07IFJlbW92ZSBwYWdlIGZhdWx0IGhhbmRsZXIgZnJvbSBJRFQKLQotICAgICAgICBzdWIgICAgIGVzcCw2ICAgICAgICAgICAgICAgOyBBbGxvY2F0ZSBzcGFjZSBvbiBzdGFjawotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBzaWR0ICAgIFtzczplc3BdICAgICAgICAgICAgOyBTdG9yZSBwb2ludGVyIHRvIElEVAotZWxzZQotICAgICAgICBzaWR0ICAgIFtGV09SRCBzczplc3BdICAgICAgOyBTdG9yZSBwb2ludGVyIHRvIElEVAotZW5kaWYKLQotICAgICAgICBwb3AgICAgIGF4ICAgICAgICAgICAgICAgICAgOyBhZGQgZXNwLDIKLSAgICAgICAgcG9wICAgICBlYXggICAgICAgICAgICAgICAgIDsgQWJzb2x1dGUgYWRkcmVzcyBvZiBJRFQKLSAgICAgICAgYWRkICAgICBlYXgsMTQqOCAgICAgICAgICAgIDsgUG9pbnQgdG8gSW50ICMxNAotICAgICAgICBtb3YgICAgIGN4LFtJTlQxNFNlbGVjdG9yXQotICAgICAgICBtb3YgICAgIFtlYXgrMl0sY3ggICAgICAgICAgOyBSZXN0b3JlIG9yaWdpbmFsIENTCi0gICAgICAgIG1vdiAgICAgZWR4LFtJTlQxNE9mZnNldF0KLSAgICAgICAgbW92ICAgICBbZWF4XSxkeCAgICAgICAgICAgIDsgSW5zdGFsbCBsb3cgd29yZCBvZiBvZmZzZXQKLSAgICAgICAgc2hyICAgICBlZHgsMTYKLSAgICAgICAgbW92ICAgICBbZWF4KzZdLGR4ICAgICAgICAgIDsgSW5zdGFsbCBoaWdoIHdvcmQgb2Ygb2Zmc2V0Ci0KLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBJbnN0YWxsQmFua0Z1bmMoaW50IGNvZGVMZW4sdm9pZCAqYmFua0Z1bmMpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJbnN0YWxscyB0aGUgYmFuayBzd2l0Y2ggZnVuY3Rpb24gYnkgcmVsb2NhdGluZyBpdCBpbnRvIG91ciBkYXRhIHNlZ21lbnQKLTsgYW5kIG1ha2luZyBpdCBpbnRvIGEgY2FsbGFibGUgZnVuY3Rpb24uIFdlIGRvIGl0IHRoaXMgd2F5IHRvIG1ha2UgdGhlCi07IGNvZGUgaWRlbnRpY2FsIHRvIHRoZSB3YXkgdGhhdCB0aGUgVmZsYXREIGRldmljZXMgd29yayB1bmRlciBXaW5kb3dzLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIEluc3RhbGxCYW5rRnVuYwotCi0gICAgICAgIEFSRyAgICAgY29kZUxlbjpVSU5ULCBiYW5rRnVuYzpEUFRSCi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIG1vdiAgICAgZXNpLFtiYW5rRnVuY10gICAgICA7IENvcHkgdGhlIGNvZGUgaW50byBidWZmZXIKLSAgICAgICAgbW92ICAgICBlZGksb2Zmc2V0IEJhbmtGdW5jQnVmCi0gICAgICAgIG1vdiAgICAgZWN4LFtjb2RlTGVuXQotICAgIHJlcCBtb3ZzYgotICAgICAgICBtb3YgICAgIFtCWVRFIGVkaV0sMEMzaCAgICAgOyBUZXJtaW5hdGUgdGhlIGZ1bmN0aW9uIHdpdGggYSBuZWFyIHJldAotCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBJbml0UGFnaW5nKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJbml0aWFsaXplcyBwYWdpbmcgc3lzdGVtLiBJZiBwYWdpbmcgaXMgbm90IGVuYWJsZWQsIGJ1aWxkcyBhIHBhZ2UgdGFibGUKLTsgZGlyZWN0b3J5IGFuZCBwYWdlIHRhYmxlcyBmb3IgcGh5c2ljYWwgbWVtb3J5Ci07Ci07ICAgRXhpdDogICAgICAgMCAgIC0gU3VjY2Vzc2Z1bAotOyAgICAgICAgICAgICAgIC0xICAtIENvdWxkbid0IGluaXRpYWxpemUgcGFnaW5nIG1lY2hhbmlzbQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIEluaXRQYWdpbmcKLQotICAgICAgICBwdXNoICAgIGVieAotICAgICAgICBwdXNoICAgIGVjeAotICAgICAgICBwdXNoICAgIGVkeAotICAgICAgICBwdXNoICAgIGVzaQotICAgICAgICBwdXNoICAgIGVkaQotCi07IEFyZSB3ZSBydW5uaW5nIHVuZGVyIENhdXNlV2F5PwotCi0gICAgICAgIG1vdiAgICAgYXgsMEZGRjloCi0gICAgICAgIGludCAgICAgMzFoCi0gICAgICAgIGpjICAgICAgQEBOb3RDYXVzZXdheQotICAgICAgICBjbXAgICAgIGVjeCwiQ0FVUyIKLSAgICAgICAgam56ICAgICBAQE5vdENhdXNld2F5Ci0gICAgICAgIGNtcCAgICAgZWR4LCJFV0FZIgotICAgICAgICBqbnogICAgIEBATm90Q2F1c2V3YXkKLQotICAgICAgICBtb3YgICAgIFtCT09MIFZGX2hhdmVDYXVzZVdheV0sMQotICAgICAgICBtb3YgICAgIFtDYXVzZVdheURJUkxpbmVhcl0sZXNpCi0gICAgICAgIG1vdiAgICAgW0NhdXNlV2F5MXN0TGluZWFyXSxlZGkKLQotOyBDaGVjayBmb3IgRFBNSQotCi0gICAgICAgIG1vdiAgICAgYXgsMGZmMDBoCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgaW50ICAgICAzMWgKLSAgICAgICAgcG9wICAgICBlcwotICAgICAgICBzaHIgICAgIGVkaSwyCi0gICAgICAgIGFuZCAgICAgZWRpLDMKLSAgICAgICAgY21wICAgICBlZGksMgotICAgICAgICBqeiAgICAgIEBARXJyRXhpdCAgICAgICAgICAgICAgIDsgTm90IHN1cHBvcnRlZCB1bmRlciBEUE1JCi0KLSAgICAgICAgbW92ICAgICBlYXgsW0NhdXNlV2F5RElSTGluZWFyXQotICAgICAgICBqbXAgICAgIEBAQ29weUNSMwotCi1AQE5vdENhdXNld2F5OgotICAgICAgICBtb3YgICAgIGF4LGNzCi0gICAgICAgIHRlc3QgICAgYXgsMyAgICAgICAgICAgICAgICAgICAgOyBXaGljaCByaW5nIGFyZSB3ZSBydW5uaW5nCi0gICAgICAgIGpueiAgICAgQEBFcnJFeGl0ICAgICAgICAgICAgICAgOyBOZWVkcyB6ZXJvIHJpbmcgdG8gYWNjZXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwYWdlIHRhYmxlcyAoQ1IzKQotICAgICAgICBtb3YgICAgIGVheCxjcjAgICAgICAgICAgICAgICAgIDsgTG9hZCBDUjAKLSAgICAgICAgdGVzdCAgICBlYXgsODAwMDAwMDBoICAgICAgICAgICA7IElzIHBhZ2luZyBlbmFibGVkPwotICAgICAgICBqeiAgICAgIEBARXJyRXhpdCAgICAgICAgICAgICAgIDsgTm8sIHdlIG11c3QgaGF2ZSBwYWdpbmchCi0KLSAgICAgICAgbW92ICAgICBlYXgsY3IzICAgICAgICAgICAgICAgICA7IExvYWQgZGlyZWN0b3J5IGFkZHJlc3MKLSAgICAgICAgYW5kICAgICBlYXgsMEZGRkZGMDAwaAotCi1AQENvcHlDUjM6Ci0gICAgICAgIG1vdiAgICAgW1BEQlJdLGVheCAgICAgICAgICAgICAgOyBTYXZlIGl0Ci0gICAgICAgIG1vdiAgICAgZXNpLGVheAotICAgICAgICBtb3YgICAgIGVkaSxvZmZzZXQgcGFnZURpcmVjdG9yeQotICAgICAgICBtb3YgICAgIGVjeCwxMDI0Ci0gICAgICAgIGNsZAotICAgICAgICByZXAgICAgIG1vdnNkICAgICAgICAgICAgICAgICAgIDsgQ29weSB0aGUgb3JpZ2luYWwgcGFnZSB0YWJsZSBkaXJlY3RvcnkKLSAgICAgICAgY21wICAgICBbRFdPUkQgYWNjZXNzUGFnZUFkZHJdLDA7IENoZWNrIGlmIHdlIGhhdmUgYWxsb2NhdGVkIHBhZ2UKLSAgICAgICAgam5lICAgICBAQEhhdmVSZWFsTWVtICAgICAgICAgICA7IHRhYmxlIGFscmVhZHkgKHdlIGNhbnQgZnJlZSBpdCkKLQotICAgICAgICBtb3YgICAgIGVheCwwMTAwaCAgICAgICAgICAgICAgIDsgRFBNSSBET1MgYWxsb2NhdGUKLSAgICAgICAgbW92ICAgICBlYngsODE5Mi8xNgotICAgICAgICBpbnQgICAgIDMxaCAgICAgICAgICAgICAgICAgICAgIDsgQWxsb2NhdGUgODE5MiBieXRlcwotICAgICAgICBhbmQgICAgIGVheCwwRkZGRmgKLSAgICAgICAgc2hsICAgICBlYXgsNCAgICAgICAgICAgICAgICAgICA7IEVBWCBwb2ludHMgdG8gbmV3bHkgYWxsb2NhdGVkIG1lbW9yeQotICAgICAgICBhZGQgICAgIGVheCw0MDk1Ci0gICAgICAgIGFuZCAgICAgZWF4LDBGRkZGRjAwMGggICAgICAgICAgOyBQYWdlIGFsaWduCi0gICAgICAgIG1vdiAgICAgW2FjY2Vzc1BhZ2VBZGRyXSxlYXgKLQotQEBIYXZlUmVhbE1lbToKLSAgICAgICAgbW92ICAgICBlYXgsW2FjY2Vzc1BhZ2VBZGRyXSAgICA7IEVBWCAtPiBwYWdlIHRhYmxlIGluIDFzdCBNYgotICAgICAgICBzaHIgICAgIGVheCwxMgotICAgICAgICBhbmQgICAgIGVheCwzRkZoICAgICAgICAgICAgICAgIDsgUGFnZSB0YWJsZSBvZmZzZXQKLSAgICAgICAgc2hsICAgICBlYXgsMgotICAgICAgICBjbXAgICAgIFtCT09MIFZGX2hhdmVDYXVzZVdheV0sMAotICAgICAgICBqeiAgICAgIEBATm90Q1cwCi0gICAgICAgIG1vdiAgICAgZWJ4LFtDYXVzZVdheTFzdExpbmVhcl0KLSAgICAgICAgam1wICAgICBAQFB1dDFzdAotCi1AQE5vdENXMDoKLSAgICAgICAgbW92ICAgICBlYngsW1BEQlJdCi0gICAgICAgIG1vdiAgICAgZWJ4LFtlYnhdCi0gICAgICAgIGFuZCAgICAgZWJ4LDBGRkZGRjAwMGggICAgICAgICAgOyBQYWdlIHRhYmxlIGZvciAxc3QgbWVnYWJ5dGUKLQotQEBQdXQxc3Q6Ci0gICAgICAgIGFkZCAgICAgZWF4LGVieAotICAgICAgICBtb3YgICAgIFthY2Nlc3NQYWdlVGFibGVdLGVheAotICAgICAgICBzdWIgICAgIGVheCxlYXggICAgICAgICAgICAgICAgIDsgTm8gZXJyb3IKLSAgICAgICAgam1wICAgICBAQEV4aXQKLQotQEBFcnJFeGl0OgotICAgICAgICBtb3YgICAgIGVheCwtMQotCi1AQEV4aXQ6IHBvcCAgICAgZWRpCi0gICAgICAgIHBvcCAgICAgZXNpCi0gICAgICAgIHBvcCAgICAgZWR4Ci0gICAgICAgIHBvcCAgICAgZWN4Ci0gICAgICAgIHBvcCAgICAgZWJ4Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIENsb3NlUGFnaW5nKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDbG9zZXMgdGhlIHBhZ2luZyBzeXN0ZW0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBDbG9zZVBhZ2luZwotCi0gICAgICAgIHB1c2ggICAgZWF4Ci0gICAgICAgIHB1c2ggICAgZWN4Ci0gICAgICAgIHB1c2ggICAgZWR4Ci0gICAgICAgIHB1c2ggICAgZXNpCi0gICAgICAgIHB1c2ggICAgZWRpCi0KLSAgICAgICAgbW92ICAgICBlYXgsW2FjY2Vzc1BhZ2VBZGRyXQotICAgICAgICBjYWxsICAgIEFjY2Vzc1BhZ2UgICAgICAgICAgICAgIDsgUmVzdG9yZSBBY2Nlc3NQYWdlIG1hcHBpbmcKLSAgICAgICAgbW92ICAgICBlZGksW1BEQlJdCi0gICAgICAgIG1vdiAgICAgZXNpLG9mZnNldCBwYWdlRGlyZWN0b3J5Ci0gICAgICAgIG1vdiAgICAgZWN4LDEwMjQKLSAgICAgICAgY2xkCi0gICAgICAgIHJlcCAgICAgbW92c2QgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBwYWdlIHRhYmxlIGRpcmVjdG9yeQotCi1AQEV4aXQ6IHBvcCAgICAgZWRpCi0gICAgICAgIHBvcCAgICAgZXNpCi0gICAgICAgIHBvcCAgICAgZWR4Ci0gICAgICAgIHBvcCAgICAgZWN4Ci0gICAgICAgIHBvcCAgICAgZWF4Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBsb25nIEFjY2Vzc1BhZ2UobG9uZyBwaHlzKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTWFwcyBhIGtub3duIHBhZ2UgdG8gZ2l2ZW4gcGh5c2ljYWwgbWVtb3J5Ci07ICAgRW50cnk6ICAgICAgRUFYIC0gUGh5c2ljYWwgbWVtb3J5Ci07ICAgRXhpdDogICAgICAgRUFYIC0gTGluZWFyIG1lbW9yeSBhZGRyZXNzIG9mIG1hcHBlZCBwaHlzIG1lbQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhdGljICAgICBBY2Nlc3NQYWdlCi0KLSAgICAgICAgcHVzaCAgICBlZHgKLSAgICAgICAgbW92ICAgICBlZHgsW2FjY2Vzc1BhZ2VUYWJsZV0KLSAgICAgICAgb3IgICAgICBlYXgsNwotICAgICAgICBtb3YgICAgIFtlZHhdLGVheAotICAgICAgICBtb3YgICAgIGVheCxjcjMKLSAgICAgICAgbW92ICAgICBjcjMsZWF4ICAgICAgICAgICAgICAgICA7IFVwZGF0ZSBwYWdlIHRhYmxlIGNhY2hlCi0gICAgICAgIG1vdiAgICAgZWF4LFthY2Nlc3NQYWdlQWRkcl0KLSAgICAgICAgcG9wICAgICBlZHgKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGxvbmcgR2V0UGh5c2ljYWxBZGRyZXNzKGxvbmcgbGluZWFyKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmV0dXJucyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBsaW5lYXIgYWRkcmVzcwotOyAgIEVudHJ5OiAgICAgIEVBWCAtIExpbmVhciBhZGRyZXNzIHRvIGNvbnZlcnQKLTsgICBFeGl0OiAgICAgICBFQVggLSBQaHlzaWNhbCBhZGRyZXNzCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGF0aWMgICAgIEdldFBoeXNpY2FsQWRkcmVzcwotCi0gICAgICAgIHB1c2ggICAgZWJ4Ci0gICAgICAgIHB1c2ggICAgZWR4Ci0gICAgICAgIG1vdiAgICAgZWR4LGVheAotICAgICAgICBzaHIgICAgIGVkeCwyMiAgICAgICAgICAgICAgICAgIDsgRURYIGlzIHRoZSBkaXJlY3Rvcnkgb2Zmc2V0Ci0gICAgICAgIG1vdiAgICAgZWJ4LFtQREJSXQotICAgICAgICBtb3YgICAgIGVkeCxbZWR4KjQrZWJ4XSAgICAgICAgIDsgTG9hZCBwYWdlIHRhYmxlIGFkZHJlc3MKLSAgICAgICAgcHVzaCAgICBlYXgKLSAgICAgICAgbW92ICAgICBlYXgsZWR4Ci0gICAgICAgIGNhbGwgICAgQWNjZXNzUGFnZSAgICAgICAgICAgICAgOyBBY2Nlc3MgdGhlIHBhZ2UgdGFibGUKLSAgICAgICAgbW92ICAgICBlZHgsZWF4Ci0gICAgICAgIHBvcCAgICAgZWF4Ci0gICAgICAgIHNociAgICAgZWF4LDEyCi0gICAgICAgIGFuZCAgICAgZWF4LDAzRkZoICAgICAgICAgICAgICAgOyBFQVggb2Zmc2V0IGludG8gcGFnZSB0YWJsZQotICAgICAgICBtb3YgICAgIGVheCxbZWR4K2VheCo0XSAgICAgICAgIDsgTG9hZCBwaHlzaWNhbCBhZGRyZXNzCi0gICAgICAgIGFuZCAgICAgZWF4LDBGRkZGRjAwMGgKLSAgICAgICAgcG9wICAgICBlZHgKLSAgICAgICAgcG9wICAgICBlYngKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgQ3JlYXRlUGFnZVRhYmxlKGxvbmcgcGFnZURFbnRyeSkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENyZWF0ZXMgYSBwYWdlIHRhYmxlIGZvciBzcGVjaWZpYyBhZGRyZXNzICg0TUIpCi07ICAgICAgIEVudHJ5OiAgRUFYIC0gUGFnZSBkaXJlY3RvcnkgZW50cnkgKHRvcCAxMC1iaXRzIG9mIGFkZHJlc3MpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGF0aWMgICAgIENyZWF0ZVBhZ2VUYWJsZQotCi0gICAgICAgIHB1c2ggICAgZWJ4Ci0gICAgICAgIHB1c2ggICAgZWN4Ci0gICAgICAgIHB1c2ggICAgZWR4Ci0gICAgICAgIHB1c2ggICAgZWRpCi0gICAgICAgIG1vdiAgICAgZWJ4LGVheCAgICAgICAgICAgICAgICAgOyBTYXZlIGFkZHJlc3MKLSAgICAgICAgbW92ICAgICBlYXgsODE5MgotICAgICAgICBwdXNoICAgIGVheAotICAgICAgICBjYWxsICAgIFZGX21hbGxvYyAgICAgICAgICAgICAgOyBBbGxvY2F0ZSBwYWdlIHRhYmxlIGRpcmVjdG9yeQotICAgICAgICBhZGQgICAgIGVzcCw0Ci0gICAgICAgIGFkZCAgICAgZWF4LDBGRkZoCi0gICAgICAgIGFuZCAgICAgZWF4LDBGRkZGRjAwMGggICAgICAgICAgOyBQYWdlIGFsaWduICg0S0IpCi0gICAgICAgIG1vdiAgICAgZWRpLGVheCAgICAgICAgICAgICAgICAgOyBTYXZlIHBhZ2UgdGFibGUgbGluZWFyIGFkZHJlc3MKLSAgICAgICAgc3ViICAgICBlYXgsZWF4ICAgICAgICAgICAgICAgICA7IEZpbGwgd2l0aCB6ZXJvCi0gICAgICAgIG1vdiAgICAgZWN4LDEwMjQKLSAgICAgICAgY2xkCi0gICAgICAgIHJlcCAgICAgc3Rvc2QgICAgICAgICAgICAgICAgICAgOyBDbGVhciBwYWdlIHRhYmxlCi0gICAgICAgIHN1YiAgICAgZWRpLDQwOTYKLSAgICAgICAgbW92ICAgICBlYXgsZWRpCi0gICAgICAgIGNhbGwgICAgR2V0UGh5c2ljYWxBZGRyZXNzCi0gICAgICAgIG1vdiAgICAgZWR4LFtQREJSXQotICAgICAgICBvciAgICAgIGVheCw3ICAgICAgICAgICAgICAgICAgIDsgUHJlc2VudC93cml0ZS91c2VyIGJpdAotICAgICAgICBtb3YgICAgIFtlZHgrZWJ4KjRdLGVheCAgICAgICAgIDsgU2F2ZSBwaHlzaWNhbCBhZGRyZXNzIGludG8gcGFnZSBkaXJlY3RvcnkKLSAgICAgICAgbW92ICAgICBlYXgsY3IzCi0gICAgICAgIG1vdiAgICAgY3IzLGVheCAgICAgICAgICAgICAgICAgOyBVcGRhdGUgcGFnZSB0YWJsZSBjYWNoZQotICAgICAgICBwb3AgICAgIGVkaQotICAgICAgICBwb3AgICAgIGVkeAotICAgICAgICBwb3AgICAgIGVjeAotICAgICAgICBwb3AgICAgIGVieAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBNYXBQaHlzaWNhbDJMaW5lYXIodWxvbmcgcEFkZHIsIHVsb25nIGxBZGRyLCBpbnQgcGFnZXMsIGludCBmbGFncyk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBNYXBzIHBoeXNpY2FsIG1lbW9yeSBpbnRvIGxpbmVhciBtZW1vcnkKLTsgICBFbnRyeTogICAgICBwQWRkciAgIC0gUGh5c2ljYWwgYWRkcmVzcwotOyAgICAgICAgICAgICAgIGxBZGRyICAgLSBMaW5lYXIgYWRkcmVzcwotOyAgICAgICAgICAgICAgIHBhZ2VzICAgLSBOdW1iZXIgb2YgNEsgcGFnZXMgdG8gbWFwCi07ICAgICAgICAgICAgICAgZmxhZ3MgICAtIFBhZ2UgZmxhZ3MKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgMCAgID0gICAgICAgcHJlc2VudAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdCAxICAgPSAgICAgICBSZWFkKDApL1dyaXRlKDEpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgTWFwUGh5c2ljYWwyTGluZWFyCi0KLSAgICAgICAgQVJHICAgICBwQWRkcjpVTE9ORywgbEFkZHI6VUxPTkcsIHBhZ2VzOlVJTlQsIHBmbGFnczpVSU5UCi0KLSAgICAgICAgZW50ZXJfYwotCi0gICAgICAgIGFuZCAgICAgW1VMT05HIHBBZGRyXSwwRkZGRkYwMDBoOyBQYWdlIGJvdW5kYXJ5Ci0gICAgICAgIGFuZCAgICAgW1VMT05HIGxBZGRyXSwwRkZGRkYwMDBoOyBQYWdlIGJvdW5kYXJ5Ci0gICAgICAgIG1vdiAgICAgZWN4LFtwZmxhZ3NdCi0gICAgICAgIGFuZCAgICAgZWN4LDExYiAgICAgICAgICAgICAgICAgOyBKdXN0IHR3byBiaXRzCi0gICAgICAgIG9yICAgICAgZWN4LDEwMGIgICAgICAgICAgICAgICAgOyBTdXBlcnZpc29yIGJpdAotICAgICAgICBtb3YgICAgIFtwZmxhZ3NdLGVjeAotCi0gICAgICAgIG1vdiAgICAgZWR4LFtsQWRkcl0KLSAgICAgICAgc2hyICAgICBlZHgsMjIgICAgICAgICAgICAgICAgICA7IEVEWCA9IERpcmVjdG9yeQotICAgICAgICBtb3YgICAgIGVzaSxbUERCUl0KLSAgICAgICAgbW92ICAgICBlZGksW3BhZ2VzXSAgICAgICAgICAgICA7IEVESSBwYWdlIGNvdW50Ci0gICAgICAgIG1vdiAgICAgZWJ4LFtsQWRkcl0KLQotQEBDcmVhdGVMb29wOgotICAgICAgICBtb3YgICAgIGVjeCxbZXNpK2VkeCo0XSAgICAgICAgIDsgTG9hZCBwYWdlIHRhYmxlIGFkZHJlc3MKLSAgICAgICAgdGVzdCAgICBlY3gsMSAgICAgICAgICAgICAgICAgICA7IElzIGl0IHByZXNlbnQ/Ci0gICAgICAgIGpueiAgICAgQEBUYWJsZU9LCi0gICAgICAgIG1vdiAgICAgZWF4LGVkeAotICAgICAgICBjYWxsICAgIENyZWF0ZVBhZ2VUYWJsZSAgICAgICAgIDsgQ3JlYXRlIGEgcGFnZSB0YWJsZQotQEBUYWJsZU9LOgotICAgICAgICBtb3YgICAgIGVheCxlYngKLSAgICAgICAgc2hyICAgICBlYXgsMTIKLSAgICAgICAgYW5kICAgICBlYXgsM0ZGaAotICAgICAgICBzdWIgICAgIGVheCwxMDI0Ci0gICAgICAgIG5lZyAgICAgZWF4ICAgICAgICAgICAgICAgICAgICAgOyBFQVggPSBwYWdlIGNvdW50IGluIHRoaXMgdGFibGUKLSAgICAgICAgaW5jICAgICBlZHggICAgICAgICAgICAgICAgICAgICA7IE5leHQgdGFibGUKLSAgICAgICAgbW92ICAgICBlYngsMCAgICAgICAgICAgICAgICAgICA7IE5leHQgdGltZSB3ZSdsbCBtYXAgMUsgcGFnZXMKLSAgICAgICAgc3ViICAgICBlZGksZWF4ICAgICAgICAgICAgICAgICA7IFN1YnRyYWN0IG1hcHBlZCBwYWdlcyBmcm9tIHBhZ2UgY291bnQKLSAgICAgICAgam5zICAgICBAQENyZWF0ZUxvb3AgICAgICAgICAgICA7IENyZWF0ZSBtb3JlIHRhYmxlcyBpZiBuZWNlc3NhcnkKLQotICAgICAgICBtb3YgICAgIGVjeCxbcGFnZXNdICAgICAgICAgICAgIDsgRUNYID0gUGFnZSBjb3VudAotICAgICAgICBtb3YgICAgIGVzaSxbbEFkZHJdCi0gICAgICAgIHNociAgICAgZXNpLDEyICAgICAgICAgICAgICAgICAgOyBPZmZzZXQgcGFydCBpc24ndCBuZWVkZWQKLSAgICAgICAgbW92ICAgICBlZGksW3BBZGRyXQotQEBNYXBwaW5nTG9vcDoKLSAgICAgICAgbW92ICAgICBlYXgsZXNpCi0gICAgICAgIHNociAgICAgZWF4LDEwICAgICAgICAgICAgICAgICAgOyBFQVggPSBvZmZzZXQgdG8gcGFnZSBkaXJlY3RvcnkKLSAgICAgICAgbW92ICAgICBlYngsW1BEQlJdCi0gICAgICAgIG1vdiAgICAgZWF4LFtlYXgqNCtlYnhdICAgICAgICAgOyBFQVggPSBwYWdlIHRhYmxlIGFkZHJlc3MKLSAgICAgICAgY2FsbCAgICBBY2Nlc3NQYWdlCi0gICAgICAgIG1vdiAgICAgZWJ4LGVzaQotICAgICAgICBhbmQgICAgIGVieCwzRkZoICAgICAgICAgICAgICAgIDsgRUJYID0gb2Zmc2V0IHRvIHBhZ2UgdGFibGUKLSAgICAgICAgbW92ICAgICBlZHgsZWRpCi0gICAgICAgIGFkZCAgICAgZWRpLDQwOTYgICAgICAgICAgICAgICAgOyBOZXh0IHBoeXNpY2FsIGFkZHJlc3MKLSAgICAgICAgaW5jICAgICBlc2kgICAgICAgICAgICAgICAgICAgICA7IE5leHQgbGluZWFyIHBhZ2UKLSAgICAgICAgb3IgICAgICBlZHgsW3BmbGFnc10gICAgICAgICAgICA7IFVwZGF0ZSBmbGFncy4uLgotICAgICAgICBtb3YgICAgIFtlYXgrZWJ4KjRdLGVkeCAgICAgICAgIDsgU3RvcmUgcGFnZSB0YWJsZSBlbnRyeQotICAgICAgICBsb29wICAgIEBATWFwcGluZ0xvb3AKLSAgICAgICAgbW92ICAgICBlYXgsY3IzCi0gICAgICAgIG1vdiAgICAgY3IzLGVheCAgICAgICAgICAgICAgICAgOyBVcGRhdGUgcGFnZSB0YWJsZSBjYWNoZQotCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLWVuZGNvZGVzZWcgIF92ZmxhdAotCi1lbmRpZgotCi0gICAgICAgIEVORCAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL2NwdWluZm8uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9jcHVpbmZvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMTE3YzcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL2NwdWluZm8uYworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIERPUwotKgotKiBEZXNjcmlwdGlvbjogIE1TRE9TIHNwZWNpZmljIGNvZGUgZm9yIHRoZSBDUFUgZGV0ZWN0aW9uIG1vZHVsZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEV4dGVybmFsIHRpbWluZyBmdW5jdGlvbiAqLwotCi12b2lkIF9fWlRpbWVySW5pdCh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EbyBub3RoaW5nIGZvciBET1MgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHRocmVhZCBwcmlvcml0aWVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgU2V0TWF4VGhyZWFkUHJpb3JpdHkoKSAgICAgIDAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EbyBub3RoaW5nIGZvciBET1MgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHRocmVhZCBwcmlvcml0aWVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgUmVzdG9yZVRocmVhZFByaW9yaXR5KGkpICAgICh2b2lkKShpKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgZnJlcXVlbmN5IG9mIHRoZSBjb3VudGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEdldENvdW50ZXJGcmVxdWVuY3koCi0gICAgQ1BVX2xhcmdlSW50ZWdlciAqZnJlcSkKLXsKLSAgICB1bG9uZyAgIHJlc29sdXRpb247Ci0KLSAgICBfX1pUaW1lckluaXQoKTsKLSAgICBVTFpUaW1lclJlc29sdXRpb24oJnJlc29sdXRpb24pOwotICAgIGZyZXEtPmxvdyA9ICh1bG9uZykoMTAwMDAwMDAwMDAuMCAvIHJlc29sdXRpb24pOwotICAgIGZyZXEtPmhpZ2ggPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgY291bnRlciB2YWx1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEdldENvdW50ZXIodCkgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAodCktPmxvdyA9IFVMWlJlYWRUaW1lKCkgKiAxMDAwMEw7ICBcCi0gICAgKHQpLT5oaWdoID0gMDsgICAgICAgICAgICAgICAgICAgICAgXAotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL2V2ZW50LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvZXZlbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk2OWQxMS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvZXZlbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgRE9TCi0qCi0qIERlc2NyaXB0aW9uOiAgMzItYml0IERPUyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFNjaVRlY2ggY3Jvc3MgcGxhdGZvcm0KLSogICAgICAgICAgICAgICBldmVudCBsaWJyYXJ5LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotaWJvb2wgX1ZBUkFQSSAgIF9FVlRfdXNlRXZlbnRzID0gdHJ1ZTsgIC8qIFRydWUgdG8gdXNlIGV2ZW50IGhhbmRsaW5nICAgKi8KLWlib29sIF9WQVJBUEkgICBfRVZUX2luc3RhbGxlZCA9IDA7ICAgICAvKiBFdmVudCBoYW5kZXJzIGluc3RhbGxlZD8gICAgICovCi11Y2hhciBfVkFSQVBJICAgKl9FVlRfYmlvc1B0ciA9IE5VTEw7ICAgLyogUG9pbnRlciB0byB0aGUgQklPUyBkYXRhIGFyZWEgKi8KLXN0YXRpYyBpYm9vbCAgICBoYXZlTW91c2UgPSBmYWxzZTsgICAgICAvKiBUcnVlIGlmIHdlIGhhdmUgYSBtb3VzZSAgICAgICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEV4dGVybmFsIGFzc2VtYmxlciBmdW5jdGlvbnMgKi8KLQotdm9pZCAgICBFVlRBUEkgX0VWVF9wb2xsSm95c3RpY2sodm9pZCk7Ci11aW50ICAgIEVWVEFQSSBfRVZUX2Rpc2FibGVJbnQodm9pZCk7Ci11aW50ICAgIEVWVEFQSSBfRVZUX3Jlc3RvcmVJbnQodWludCBmbGFncyk7Ci12b2lkICAgIEVWVEFQSSBfRVZUX2NvZGVTdGFydCh2b2lkKTsKLXZvaWQgICAgRVZUQVBJIF9FVlRfY29kZUVuZCh2b2lkKTsKLXZvaWQgICAgRVZUQVBJIF9FVlRfY0NvZGVTdGFydCh2b2lkKTsKLXZvaWQgICAgRVZUQVBJIF9FVlRfY0NvZGVFbmQodm9pZCk7Ci1pbnQgICAgIEVWVEFQSSBfRVZUX2dldEtleUNvZGUodm9pZCk7Ci12b2lkICAgIEVWVEFQSSBfRVZUX3B1bXBNZXNzYWdlcyh2b2lkKTsKLWludCAgICAgRVZUQVBJIEVWVF9yZGlueChpbnQgcG9ydCxpbnQgaW5kZXgpOwotdm9pZCAgICBFVlRBUEkgRVZUX3dyaW54KGludCBwb3J0LGludCBpbmRleCxpbnQgdmFsdWUpOwotCi0jaWZkZWYgTk9fS0VZQk9BUkRfSU5URVJSVVBUCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwdW1wIGFsbCBrZXlib2FyZCBtZXNzYWdlcyBmcm9tIHRoZSBCSU9TIGtleWJvYXJkCi1oYW5kbGVyIGludG8gb3VyIGV2ZW50IHF1ZXVlLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGF2b2lkIHVzaW5nIHRoZQotaW5zdGFsbGFibGUga2V5Ym9hcmQgaGFuZGxlciBpZiB0aGlzIGlzIGNhdXNpbmcgcHJvYmxlbXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgRVZUQVBJIF9FVlRfcHVtcE1lc3NhZ2VzKHZvaWQpCi17Ci0gICAgUk1SRUdTICByZWdzOwotCXVpbnQgICAga2V5LHBzOwotCi0JLyogU2luY2UgdGhlIGtleWJvYXJkIElTUiBoYXMgbm90IGJlZW4gaW5zdGFsbGVkIGlmIE5PX0lERV9CVUcgaGFzCi0JICogYmVlbiBkZWZpbmVkLCB3ZSBmaXJzdCBjaGVjayBmb3IgYW55IHBlbmRpbmcga2V5Ym9hcmQgZXZlbnRzCi0JICogaGVyZSwgYW5kIGlmIHRoZXJlIGFyZSBzb21lIGluc2VydCB0aGVtIGludG8gdGhlIGV2ZW50IHF1ZXVlIHRvCi0JICogYmUgcGlja2VkIHVwIGxhdGVyIC0gd2hhdCBhIGtsdWRnZS4KLQkgKi8KLQl3aGlsZSAoKGtleSA9IF9FVlRfZ2V0S2V5Q29kZSgpKSAhPSAwKSB7Ci0JCXBzID0gX0VWVF9kaXNhYmxlSW50KCk7Ci0JCWFkZEtleUV2ZW50KEVWVF9LRVlET1dOLCBrZXkpOwotCQlfRVZUX3Jlc3RvcmVJbnQocHMpOwotCQl9Ci0KLSAgICByZWdzLnguYXggPSAweDBCOyAgICAgICAgICAgLyogUmVzZXQgTW92ZSBNb3VzZSAqLwotICAgIFBNX2ludDg2KDB4MzMsJnJlZ3MsJnJlZ3MpOwotfQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIHRpY2tzIHNpbmNlIHN5c3RlbQotc3RhcnR1cCBpbiBtaWxsaXNlY29uZHMuIFRoaXMgc2hvdWxkIGJlIHRoZSBzYW1lIHZhbHVlIHRoYXQgaXMgcGxhY2VkIGludG8KLXRoZSB0aW1lIHN0YW1wIGZpZWxkcyBvZiBldmVudHMsIGFuZCBpcyB1c2VkIHRvIGltcGxlbWVudCBhdXRvIG1vdXNlIGRvd24KLWV2ZW50cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfRVZUX2dldFRpY2tzKHZvaWQpCi17Ci0gICAgcmV0dXJuICh1bG9uZylQTV9nZXRMb25nKF9FVlRfYmlvc1B0cisweDZDKSAqIDU1VUw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVib290cyB0aGUgbWFjaGluZSBmcm9tIERPUyAod2FybSBib290KQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIFJlYm9vdCh2b2lkKQotewotICAgIFBNUkVHUyAgcmVnczsKLSAgICBQTVNSRUdTIHNyZWdzOwotCi0gICAgdXNob3J0ICpyZWJvb3RUeXBlID0gUE1fbWFwUmVhbFBvaW50ZXIoMHg0MCwweDcyKTsKLSAgICAqcmVib290VHlwZSA9IDB4MTIzNDsKLSAgICBQTV9jYWxsUmVhbE1vZGUoMHhGRkZGLDB4MDAwMCwmcmVncywmc3JlZ3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluY2x1ZGUgZ2VuZXJpYyByYXcgc2NhbmNvZGUga2V5Ym9hcmQgbW9kdWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgU1VQUE9SVF9DVFJMX0FMVF9ERUwKLSNpbmNsdWRlICJjb21tb24va2V5Ym9hcmQuYyIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGZvb2xzIHRoZSBET1MgbW91c2UgZHJpdmVyIGludG8gdGhpbmtpbmcgdGhhdCBpdCBpcyBydW5uaW5nCi1pbiBncmFwaGljcyBtb2RlLCByYXRoZXIgdGhhbiB0ZXh0IG1vZGUgc28gd2UgYWx3YXlzIGdldCB2aXJ0dWFsIGNvb3JkaW5hdGVzCi1jb3JyZWN0bHkgcmF0aGVyIHRoYW4gY2hhcmFjdGVyIGNvb3JkaW5hdGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBfRVZUX2Zvb2xNb3VzZSh2b2lkKQotewotICAgIGludCBvbGRtb2RlID0gUE1fZ2V0Qnl0ZShfRVZUX2Jpb3NQdHIrMHg0OSk7Ci0gICAgUE1fc2V0Qnl0ZShfRVZUX2Jpb3NQdHIrMHg0OSwweDEwKTsKLSAgICBvbGRtb2RlIHw9IChFVlRfcmRpbngoMHgzQzQsMHgyKSA8PCA4KTsKLSAgICByZXR1cm4gb2xkbW9kZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHVuZm9vbHMgdGhlIERPUyBtb3VzZSBkcml2ZXIgYWZ0ZXIgd2UgaGF2ZSBmaW5pc2hlZCBjYWxsaW5nIGl0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0VWVF91bmZvb2xNb3VzZSgKLSAgICBpbnQgb2xkbW9kZSkKLXsKLSAgICBQTV9zZXRCeXRlKF9FVlRfYmlvc1B0cisweDQ5LG9sZG1vZGUpOwotCi0gICAgLyogU29tZSBtb3VzZSBkcml2ZXJzIHJlc2V0IHRoZSBwbGFuZSBtYXNrIHJlZ2lzdGVyIGZvciBWR0EgcGxhbmUgNAotICAgICAqIG1vZGVzLCB3aGljaCBzY3Jld3MgdXAgdGhlIGRpc3BsYXkgb24gc29tZSBWR0EgY29tcGF0aWJsZSBjb250cm9sbGVycwotICAgICAqIGluIFN1cGVyVkdBIG1vZGVzLiBXZSByZXNldCB0aGUgdmFsdWUgYmFjayBhZ2FpbiBpbiBoZXJlIHRvIHNvbHZlCi0gICAgICogdGhlIHByb2JsZW0uCi0gICAgICovCi0gICAgRVZUX3dyaW54KDB4M0M0LDB4MixvbGRtb2RlID4+IDgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURldGVybWluZXMgaWYgd2UgaGF2ZSBhIG1vdXNlIGF0dGFjaGVkIGFuZCBmdW5jdGlvbmluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaWJvb2wgZGV0ZWN0TW91c2Uodm9pZCkKLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0gICAgUk1TUkVHUyBzcmVnczsKLSAgICB1Y2hhciAgICpwOwotICAgIGlib29sICAgcmV0dmFsOwotCi0gICAgcmVncy54LmF4ID0gMHgzNTMzOyAgICAgICAgICAgICAgICAgLyogR2V0IGludGVycnVwdCB2ZWN0b3IgMHgzMyAgICAqLwotICAgIFBNX2ludDg2eCgweDIxLCZyZWdzLCZyZWdzLCZzcmVncyk7Ci0KLSAgICAvKiBDaGVjayB0aGF0IGludGVycnVwdCB2ZWN0b3IgMHgzMyBpcyBub3QgYSB6ZXJvLCBhbmQgdGhhdCB0aGUgZmlyc3QKLSAgICAgKiBpbnN0cnVjdGlvbiBpbiB0aGUgaW50ZXJydXB0IHZlY3RvciBpcyBub3QgYW4gSVJFVCBpbnN0cnVjdGlvbgotICAgICAqLwotICAgIHAgPSBQTV9tYXBSZWFsUG9pbnRlcihzcmVncy5lcywgcmVncy54LmJ4KTsKLSAgICByZXR2YWwgPSAoKHNyZWdzLmVzICE9IDApIHx8IChyZWdzLnguYnggIT0gMCkpICYmIChQTV9nZXRCeXRlKHApICE9IDIwNyk7Ci0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci13aGF0ICAgICAgICAtIEV2ZW50IGNvZGUKLW1lc3NhZ2UgICAgIC0gRXZlbnQgbWVzc2FnZQoteCx5ICAgICAgICAgLSBNb3VzZSBwb3NpdGlvbiBhdCB0aW1lIG9mIGV2ZW50Ci1idXRfc3RhdCAgICAtIE1vdXNlIGJ1dHRvbiBzdGF0dXMgYXQgdGltZSBvZiBldmVudAotCi1SRU1BUktTOgotQWRkcyBhIG5ldyBtb3VzZSBldmVudCB0byB0aGUgZXZlbnQgcXVldWUuIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSB3aXRoaW4KLXRoZSBtb3VzZSBpbnRlcnJ1cHQgc3Vicm91dGluZSwgc28gaXQgbXVzdCBiZSBlZmZpY2llbnQuCi0KLU5PVEU6ICAgSW50ZXJydXB0cyBNVVNUIGJlIE9GRiB3aGlsZSB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGVuc3VyZSB3ZSBoYXZlCi0JbXV0dWFsbHkgZXhjbHVzaXZlIGFjY2VzcyB0byBvdXIgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIGZvcgotCWludGVycnVwdCBkcml2ZW4gc3lzdGVtcyAobGlrZSB1bmRlciBET1MpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGFkZE1vdXNlRXZlbnQoCi0gICAgdWludCB3aGF0LAotICAgIHVpbnQgbWVzc2FnZSwKLSAgICBpbnQgeCwKLSAgICBpbnQgeSwKLSAgICBpbnQgbWlja2V5WCwKLSAgICBpbnQgbWlja2V5WSwKLSAgICB1aW50IGJ1dF9zdGF0KQotewotICAgIGV2ZW50X3QgZXZ0OwotCi0gICAgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpIHsKLQkvKiBTYXZlIGluZm9ybWF0aW9uIGluIGV2ZW50IHJlY29yZC4gKi8KLQlldnQud2hlbiA9IF9FVlRfZ2V0VGlja3MoKTsKLQlldnQud2hhdCA9IHdoYXQ7Ci0JZXZ0Lm1lc3NhZ2UgPSBtZXNzYWdlOwotCWV2dC5tb2RpZmllcnMgPSBidXRfc3RhdDsKLQlldnQud2hlcmVfeCA9IHg7ICAgICAgICAgICAgICAgIC8qIFNhdmUgbW91c2UgZXZlbnQgcG9zaXRpb24gICAgKi8KLQlldnQud2hlcmVfeSA9IHk7Ci0JZXZ0LnJlbGF0aXZlX3ggPSBtaWNrZXlYOwotCWV2dC5yZWxhdGl2ZV95ID0gbWlja2V5WTsKLQlldnQubW9kaWZpZXJzIHw9IEVWVC5rZXlNb2RpZmllcnM7Ci0JYWRkRXZlbnQoJmV2dCk7ICAgICAgICAgICAgICAgICAvKiBBZGQgdG8gdGFpbCBvZiBldmVudCBxdWV1ZSAgICovCi0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW1hc2sgICAgICAgIC0gRXZlbnQgbWFzawotYnV0c3RhdGUgICAgLSBCdXR0b24gc3RhdGUKLXggICAgICAgICAgIC0gTW91c2UgeCBjb29yZGluYXRlCi15ICAgICAgICAgICAtIE1vdXNlIHkgY29vcmRpbmF0ZQotCi1SRU1BUktTOgotTW91c2UgZXZlbnQgaGFuZGxpbmcgcm91dGluZS4gVGhpcyBnZXRzIGNhbGxlZCB3aGVuIGEgbW91c2UgZXZlbnQgb2NjdXJzLAotYW5kIHdlIGNhbGwgdGhlIGFkZE1vdXNlRXZlbnQoKSByb3V0aW5lIHRvIGFkZCB0aGUgYXBwcm9wcmlhdGUgbW91c2UgZXZlbnQKLXRvIHRoZSBldmVudCBxdWV1ZS4KLQotTm90ZTogSW50ZXJydXB0cyBhcmUgT04gd2hlbiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBtb3VzZSBkcml2ZXIgY29kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBFVlRBUEkgbW91c2VJU1IoCi0gICAgdWludCBtYXNrLAotICAgIHVpbnQgYnV0c3RhdGUsCi0gICAgaW50IHgsCi0gICAgaW50IHksCi0gICAgaW50IG1pY2tleVgsCi0gICAgaW50IG1pY2tleVkpCi17Ci0gICAgdWludCAgICBwczsKLSAgICB1aW50ICAgIGJ1dHRvbk1hc2s7Ci0KLSAgICBpZiAobWFzayAmIDEpIHsKLQkvKiBTYXZlIHRoZSBjdXJyZW50IG1vdXNlIGNvb3JkaW5hdGVzICovCi0JRVZULm14ID0geDsgRVZULm15ID0geTsKLQotCS8qIElmIHRoZSBsYXN0IGV2ZW50IHdhcyBhIG1vdmVtZW50IGV2ZW50LCB0aGVuIG1vZGlmeSB0aGUgbGFzdAotCSAqIGV2ZW50IHJhdGhlciB0aGFuIHBvc3QgYSBuZXcgb25lLCBzbyB0aGF0IHRoZSBxdWV1ZSB3aWxsIG5vdAotCSAqIGJlY29tZSBzYXR1cmF0ZWQuIEJlZm9yZSB3ZSBtb2RpZnkgdGhlIGRhdGEgc3RydWN0dXJlcywgd2UKLQkgKiBNVVNUIGVuc3VyZSB0aGF0IGludGVycnVwdHMgYXJlIG9mZi4KLQkgKi8KLQlwcyA9IF9FVlRfZGlzYWJsZUludCgpOwotCWlmIChFVlQub2xkTW92ZSAhPSAtMSkgewotCSAgICBFVlQuZXZ0cVtFVlQub2xkTW92ZV0ud2hlcmVfeCA9IHg7ICAvKiBNb2RpZnkgZXhpc3Rpbmcgb25lICAqLwotCSAgICBFVlQuZXZ0cVtFVlQub2xkTW92ZV0ud2hlcmVfeSA9IHk7Ci0JICAgIEVWVC5ldnRxW0VWVC5vbGRNb3ZlXS5yZWxhdGl2ZV94ICs9IG1pY2tleVg7Ci0JICAgIEVWVC5ldnRxW0VWVC5vbGRNb3ZlXS5yZWxhdGl2ZV95ICs9IG1pY2tleVk7Ci0JICAgIH0KLQllbHNlIHsKLQkgICAgRVZULm9sZE1vdmUgPSBFVlQuZnJlZUhlYWQ7ICAgICAgICAgLyogU2F2ZSBpZCBvZiB0aGlzIG1vdmUgZXZlbnQgICAqLwotCSAgICBhZGRNb3VzZUV2ZW50KEVWVF9NT1VTRU1PVkUsMCx4LHksbWlja2V5WCxtaWNrZXlZLGJ1dHN0YXRlKTsKLQkgICAgfQotCV9FVlRfcmVzdG9yZUludChwcyk7Ci0JfQotICAgIGlmIChtYXNrICYgMHgyQSkgewotCXBzID0gX0VWVF9kaXNhYmxlSW50KCk7Ci0JYnV0dG9uTWFzayA9IDA7Ci0JaWYgKG1hc2sgJiAyKSAgYnV0dG9uTWFzayB8PSBFVlRfTEVGVEJNQVNLOwotCWlmIChtYXNrICYgOCkgIGJ1dHRvbk1hc2sgfD0gRVZUX1JJR0hUQk1BU0s7Ci0JaWYgKG1hc2sgJiAzMikgYnV0dG9uTWFzayB8PSBFVlRfTUlERExFQk1BU0s7Ci0JYWRkTW91c2VFdmVudChFVlRfTU9VU0VET1dOLGJ1dHRvbk1hc2sseCx5LDAsMCxidXRzdGF0ZSk7Ci0JRVZULm9sZE1vdmUgPSAtMTsKLQlfRVZUX3Jlc3RvcmVJbnQocHMpOwotCX0KLSAgICBpZiAobWFzayAmIDB4NTQpIHsKLQlwcyA9IF9FVlRfZGlzYWJsZUludCgpOwotCWJ1dHRvbk1hc2sgPSAwOwotCWlmIChtYXNrICYgMikgIGJ1dHRvbk1hc2sgfD0gRVZUX0xFRlRCTUFTSzsKLQlpZiAobWFzayAmIDgpICBidXR0b25NYXNrIHw9IEVWVF9SSUdIVEJNQVNLOwotCWlmIChtYXNrICYgMzIpIGJ1dHRvbk1hc2sgfD0gRVZUX01JRERMRUJNQVNLOwotCWFkZE1vdXNlRXZlbnQoRVZUX01PVVNFVVAsYnV0dG9uTWFzayx4LHksMCwwLGJ1dHN0YXRlKTsKLQlFVlQub2xkTW92ZSA9IC0xOwotCV9FVlRfcmVzdG9yZUludChwcyk7Ci0JfQotICAgIEVWVC5vbGRLZXkgPSAtMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1LZXlib2FyZCBpbnRlcnJ1cHQgaGFuZGxlciBmdW5jdGlvbi4KLQotTk9URTogICBJbnRlcnJ1cHRzIGFyZSBPRkYgd2hlbiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBrZXlib2FyZCBJU1IsCi0JYW5kIHdlIGxlYXZlIHRoZW0gT0ZGIHRoZSBlbnRpcmUgdGltZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBFVlRBUEkga2V5Ym9hcmRJU1Iodm9pZCkKLXsKLSAgICBwcm9jZXNzUmF3U2NhbkNvZGUoUE1faW5wYigweDYwKSk7Ci0gICAgUE1fb3V0cGIoMHgyMCwweDIwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TYWZlbHkgYWJvcnQgdGhlIGV2ZW50IG1vZHVsZSB1cG9uIGNhdGNoaW5nIGEgZmF0YWwgZXJyb3IuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfRVZUX2Fib3J0KCkKLXsKLSAgICBFVlRfZXhpdCgpOwotICAgIFBNX2ZhdGFsRXJyb3IoIlVuaGFuZGxlZCBleGNlcHRpb24hIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotbW91c2VNb3ZlICAgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW5ldmUgdGhlIG1vdXNlIG5lZWRzIHRvIGJlIG1vdmVkCi0KLVJFTUFSS1M6Ci1Jbml0aWxpYXNlIHRoZSBldmVudCBoYW5kbGluZyBtb2R1bGUuIEhlcmUgd2UgaW5zdGFsbCBvdXIgbW91c2UgaGFuZGxpbmcgSVNSCi10byBiZSBjYWxsZWQgd2hlbmV2ZXIgYW55IGJ1dHRvbidzIGFyZSBwcmVzc2VkIG9yIHJlbGVhc2VkLiBXZSBhbHNvIGJ1aWxkCi10aGUgZnJlZSBsaXN0IG9mIGV2ZW50cyBpbiB0aGUgZXZlbnQgcXVldWUuCi0KLVdlIHVzZSBoYW5kbGVyIG51bWJlciAyIG9mIHRoZSBtb3VzZSBsaWJyYXJpZXMgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBvdXIKLWV2ZW50IGhhbmRsaW5nIHJvdXRpbmVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9pbml0KAotICAgIF9FVlRfbW91c2VNb3ZlSGFuZGxlciBtb3VzZU1vdmUpCi17Ci0gICAgaW50ICAgICBpOwotCi0gICAgUE1faW5pdCgpOwotICAgIEVWVC5tb3VzZU1vdmUgPSBtb3VzZU1vdmU7Ci0gICAgX0VWVF9iaW9zUHRyID0gUE1fZ2V0QklPU1BvaW50ZXIoKTsKLSAgICBFVlRfcmVzdW1lKCk7Ci0KLSAgICAvKiBHcmFiIGFsbCBjaGFyYWN0ZXJzIHBlbmRpbmcgaW4gdGhlIGtleWJvYXJkIGJ1ZmZlciBhbmQgc3R1ZmYKLSAgICAgKiB0aGVtIGludG8gb3VyIGV2ZW50IGJ1ZmZlci4gVGhpcyBhbGxvd3MgdXMgdG8gcGljayB1cCBhbnkga2V5cHJlc3NlcwotICAgICAqIHdoaWxlIHRoZSBwcm9ncmFtIGlzIGluaXRpYWxpc2luZy4KLSAgICAgKi8KLSAgICB3aGlsZSAoKGkgPSBfRVZUX2dldEtleUNvZGUoKSkgIT0gMCkKLQlhZGRLZXlFdmVudChFVlRfS0VZRE9XTixpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFpbGlzZXMgdGhlIGludGVybmFsIGV2ZW50IGhhbmRsaW5nIG1vZHVsZXMuIFRoZSBFVlRfc3VzcGVuZCBmdW5jdGlvbgotY2FuIGJlIGNhbGxlZCB0byBzdXNwZW5kIGV2ZW50IGhhbmRsaW5nIChzdWNoIGFzIHdoZW4gc2hlbGxpbmcgb3V0IHRvIERPUyksCi1hbmQgdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgaXQgYWdhaW4gbGF0ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX3Jlc3VtZSh2b2lkKQotewotICAgIHN0YXRpYyBpbnQgICAgICBsb2NrZWQgPSAwOwotICAgIGludCAgICAgICAgICAgICBzdGF0OwotICAgIHVjaGFyICAgICAgICAgICBtb2RzOwotICAgIFBNX2xvY2tIYW5kbGUgICBsaDsgLyogVW51c2VkIGluIERPUyAqLwotCi0gICAgaWYgKF9FVlRfdXNlRXZlbnRzKSB7Ci0JLyogSW5pdGlhbGlzZSB0aGUgZXZlbnQgcXVldWUgYW5kIGVuYWJsZSBvdXIgaW50ZXJydXB0IGhhbmRsZXJzICovCi0JaW5pdEV2ZW50UXVldWUoKTsKLSNpZm5kZWYgTk9fS0VZQk9BUkRfSU5URVJSVVBUCi0JUE1fc2V0S2V5SGFuZGxlcihrZXlib2FyZElTUik7Ci0jZW5kaWYKLSNpZm5kZWYgTk9fTU9VU0VfSU5URVJSVVBUCi0JaWYgKChoYXZlTW91c2UgPSBkZXRlY3RNb3VzZSgpKSAhPSAwKSB7Ci0JICAgIGludCBvbGRtb2RlID0gX0VWVF9mb29sTW91c2UoKTsKLQkgICAgUE1fc2V0TW91c2VIYW5kbGVyKDB4RkZGRixtb3VzZUlTUik7Ci0JICAgIF9FVlRfdW5mb29sTW91c2Uob2xkbW9kZSk7Ci0JICAgIH0KLSNlbmRpZgotCi0JLyogUmVhZCB0aGUga2V5Ym9hcmQgbW9kaWZpZXIgZmxhZ3MgZnJvbSB0aGUgQklPUyB0byBnZXQgdGhlCi0JICogY29ycmVjdCBpbml0aWFsaXNhdGlvbiBzdGF0ZS4gVGhlIG9ubHkgc3RhdGUgd2UgY2FyZSBhYm91dCBpcwotCSAqIHRoZSBjb3JyZWN0IHRvZ2dsZSBzdGF0ZSBmbGFncyBzdWNoIGFzIFNDUk9MTExPQ0ssIE5VTUxPQ0sgYW5kCi0JICogQ0FQU0xPQ0suCi0JICovCi0JRVZULmtleU1vZGlmaWVycyA9IDA7Ci0JbW9kcyA9IFBNX2dldEJ5dGUoX0VWVF9iaW9zUHRyKzB4MTcpOwotCWlmIChtb2RzICYgMHgxMCkKLQkgICAgRVZULmtleU1vZGlmaWVycyB8PSBFVlRfU0NST0xMTE9DSzsKLQlpZiAobW9kcyAmIDB4MjApCi0JICAgIEVWVC5rZXlNb2RpZmllcnMgfD0gRVZUX05VTUxPQ0s7Ci0JaWYgKG1vZHMgJiAweDQwKQotCSAgICBFVlQua2V5TW9kaWZpZXJzIHw9IEVWVF9DQVBTTE9DSzsKLQotCS8qIExvY2sgYWxsIG9mIHRoZSBjb2RlIGFuZCBkYXRhIHVzZWQgYnkgb3VyIHByb3RlY3RlZCBtb2RlIGludGVycnVwdAotCSAqIGhhbmRsaW5nIHJvdXRpbmVzLCBzbyB0aGF0IGl0IHdpbGwgY29udGludWUgdG8gd29yayBjb3JyZWN0bHkKLQkgKiB1bmRlciByZWFsIG1vZGUuCi0JICovCi0JaWYgKCFsb2NrZWQpIHsKLQkgICAgLyogSXQgaXMgZGlmZmljdWx0IHRvIGVuc3VyZSB0aGF0IHdlIGxvY2sgb3VyIGdsb2JhbCBkYXRhLCBzbyB3ZQotCSAgICAgKiBkbyB0aGlzIGJ5IHRha2luZyB0aGUgYWRkcmVzcyBvZiBhIHZhcmlhYmxlIGxvY2tpbmcgYWxsIGRhdGEKLQkgICAgICogMktiIG9uIGVpdGhlciBzaWRlLiBUaGlzIHNob3VsZCBwcm9wZXJseSBjb3ZlciB0aGUgZ2xvYmFsIGRhdGEKLQkgICAgICogdXNlZCBieSB0aGUgbW9kdWxlICh0aGUgb3RoZXIgYWx0ZXJuYXRpdmUgaXMgdG8gZGVjbGFyZSB0aGUKLQkgICAgICogdmFyaWFibGVzIGluIGFzc2VtYmxlciwgaW4gd2hpY2ggY2FzZSB3ZSBrbm93IGl0IHdpbGwgYmUKLQkgICAgICogY29ycmVjdCkuCi0JICAgICAqLwotCSAgICBzdGF0ICA9ICFQTV9sb2NrRGF0YVBhZ2VzKCZFVlQsc2l6ZW9mKEVWVCksJmxoKTsKLQkgICAgc3RhdCB8PSAhUE1fbG9ja0RhdGFQYWdlcygmX0VWVF9iaW9zUHRyLHNpemVvZihfRVZUX2Jpb3NQdHIpLCZsaCk7Ci0JICAgIHN0YXQgfD0gIVBNX2xvY2tDb2RlUGFnZXMoKF9fY29kZVB0cilfRVZUX2NDb2RlU3RhcnQsKGludClfRVZUX2NDb2RlRW5kLShpbnQpX0VWVF9jQ29kZVN0YXJ0LCZsaCk7Ci0JICAgIHN0YXQgfD0gIVBNX2xvY2tDb2RlUGFnZXMoKF9fY29kZVB0cilfRVZUX2NvZGVTdGFydCwoaW50KV9FVlRfY29kZUVuZC0oaW50KV9FVlRfY29kZVN0YXJ0LCZsaCk7Ci0JICAgIGlmIChzdGF0KSB7Ci0JCVBNX2ZhdGFsRXJyb3IoIlBhZ2UgbG9ja2luZyBzZXJ2aWNlcyBmYWlsZWQgLSBpbnRlcnJ1cHQgaGFuZGxpbmcgbm90IHNhZmUhIik7Ci0JCWV4aXQoMSk7Ci0JCX0KLQkgICAgbG9ja2VkID0gMTsKLQkgICAgfQotCi0JLyogQ2F0Y2ggcHJvZ3JhbSB0ZXJtaW5hdGlvbiBzaWduYWxzIHNvIHdlIGNhbiBjbGVhbiB1cCBwcm9wZXJseSAqLwotCXNpZ25hbChTSUdBQlJULCBfRVZUX2Fib3J0KTsKLQlzaWduYWwoU0lHRlBFLCBfRVZUX2Fib3J0KTsKLQlzaWduYWwoU0lHSU5ULCBfRVZUX2Fib3J0KTsKLQlfRVZUX2luc3RhbGxlZCA9IHRydWU7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotQ2hhbmdlcyB0aGUgcmFuZ2Ugb2YgY29vcmRpbmF0ZXMgcmV0dXJuZWQgYnkgdGhlIG1vdXNlIGZ1bmN0aW9ucyB0byB0aGUKLXNwZWNpZmllZCByYW5nZSBvZiB2YWx1ZXMuIFRoaXMgaXMgdXNlZCB3aGVuIGNoYW5naW5nIGJldHdlZW4gZ3JhcGhpY3MKLW1vZGVzIHNldCB0aGUgcmFuZ2Ugb2YgbW91c2UgY29vcmRpbmF0ZXMgZm9yIHRoZSBuZXcgZGlzcGxheSBtb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9zZXRNb3VzZVJhbmdlKAotICAgIGludCB4UmVzLAotICAgIGludCB5UmVzKQotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIGlmIChoYXZlTW91c2UpIHsKLQlpbnQgb2xkbW9kZSA9IF9FVlRfZm9vbE1vdXNlKCk7Ci0JUE1fcmVzZXRNb3VzZURyaXZlcigxKTsKLQlyZWdzLnguYXggPSA3OyAgLyogTW91c2UgZnVuY3Rpb24gNyAtIFNldCBob3Jpem9udGFsIG1pbiBhbmQgbWF4ICovCi0JcmVncy54LmN4ID0gMDsKLQlyZWdzLnguZHggPSB4UmVzOwotCVBNX2ludDg2KDB4MzMsJnJlZ3MsJnJlZ3MpOwotCXJlZ3MueC5heCA9IDg7ICAvKiBNb3VzZSBmdW5jdGlvbiA4IC0gU2V0IHZlcnRpY2FsIG1pbiBhbmQgbWF4ICAgKi8KLQlyZWdzLnguY3ggPSAwOwotCXJlZ3MueC5keCA9IHlSZXM7Ci0JUE1faW50ODYoMHgzMywmcmVncywmcmVncyk7Ci0JX0VWVF91bmZvb2xNb3VzZShvbGRtb2RlKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1Nb2RpZmVzIHRoZSBtb3VzZSBjb29yZGluYXRlcyBhcyBuZWNlc3NhcnkgaWYgc2NhbGluZyB0byBPUyBjb29yZGluYXRlcywKLWFuZCBzZXRzIHRoZSBPUyBtb3VzZSBjdXJzb3IgcG9zaXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfRVZUX3NldE1vdXNlUG9zKAotICAgIGludCAqeCwKLSAgICBpbnQgKnkpCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgaWYgKGhhdmVNb3VzZSkgewotCWludCBvbGRtb2RlID0gX0VWVF9mb29sTW91c2UoKTsKLQlyZWdzLnguYXggPSA0OyAgICAgIC8qIE1vdXNlIGZ1bmN0aW9uIDQgLSBTZXQgbW91c2UgcG9zaXRpb24gICAgKi8KLQlyZWdzLnguY3ggPSAqeDsgICAgIC8qIE5ldyBob3Jpem9udGFsIGNvb3JkaW5hdGUgICAgICAgICAgICAgICAgKi8KLQlyZWdzLnguZHggPSAqeTsgICAgIC8qIE5ldyB2ZXJ0aWNhbCBjb29yZGluYXRlICAgICAgICAgICAgICAgICAgKi8KLQlQTV9pbnQ4NigweDMzLCZyZWdzLCZyZWdzKTsKLQlfRVZUX3VuZm9vbE1vdXNlKG9sZG1vZGUpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLVN1c3BlbmRzIGFsbCBvZiBvdXIgZXZlbnQgaGFuZGxpbmcgb3BlcmF0aW9ucy4gVGhpcyBpcyBhbHNvIHVzZWQgdG8KLWRlLWluc3RhbGwgdGhlIGV2ZW50IGhhbmRsaW5nIGNvZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX3N1c3BlbmQodm9pZCkKLXsKLSAgICB1Y2hhciAgIG1vZHM7Ci0KLSAgICBpZiAoX0VWVF9pbnN0YWxsZWQpIHsKLQkvKiBSZXN0b3JlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcnMgKi8KLQlQTV9yZXN0b3JlS2V5SGFuZGxlcigpOwotCWlmIChoYXZlTW91c2UpCi0JICAgIFBNX3Jlc3RvcmVNb3VzZUhhbmRsZXIoKTsKLQlzaWduYWwoU0lHQUJSVCwgU0lHX0RGTCk7Ci0Jc2lnbmFsKFNJR0ZQRSwgU0lHX0RGTCk7Ci0Jc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCk7Ci0KLQkvKiBTZXQgdGhlIGtleWJvYXJkIG1vZGlmaWVyIGZsYWdzIGluIHRoZSBCSU9TIHRvIG91ciB2YWx1ZXMgKi8KLQlFVlRfYWxsb3dMRURTKHRydWUpOwotCW1vZHMgPSBQTV9nZXRCeXRlKF9FVlRfYmlvc1B0cisweDE3KSAmIH4weDcwOwotCWlmIChFVlQua2V5TW9kaWZpZXJzICYgRVZUX1NDUk9MTExPQ0spCi0JICAgIG1vZHMgfD0gMHgxMDsKLQlpZiAoRVZULmtleU1vZGlmaWVycyAmIEVWVF9OVU1MT0NLKQotCSAgICBtb2RzIHw9IDB4MjA7Ci0JaWYgKEVWVC5rZXlNb2RpZmllcnMgJiBFVlRfQ0FQU0xPQ0spCi0JICAgIG1vZHMgfD0gMHg0MDsKLQlQTV9zZXRCeXRlKF9FVlRfYmlvc1B0cisweDE3LG1vZHMpOwotCi0JLyogRmxhZyB0aGF0IHdlIGFyZSBubyBsb25nZXIgaW5zdGFsbGVkICovCi0JX0VWVF9pbnN0YWxsZWQgPSBmYWxzZTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1FeGl0cyB0aGUgZXZlbnQgbW9kdWxlIGZvciBwcm9ncmFtIHRlcm1pbmF0YXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2V4aXQodm9pZCkKLXsKLSAgICBFVlRfc3VzcGVuZCgpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL29zaGRyLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3Mvb3NoZHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVlOGUwMC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3Mvb3NoZHIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBET1MKLSoKLSogRGVzY3JpcHRpb246ICBJbmNsdWRlIGZpbGUgdG8gaW5jbHVkZSBhbGwgT1Mgc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy9wbS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL3BtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZDllMzQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL3BtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDE2LzMyIGJpdCBET1MKLSoKLSogRGVzY3JpcHRpb246ICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeSwgd2hpY2gKLSogICAgICAgICAgICAgICBjb250YWlucyBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IE9TIHNwZWNpZmljIHNlcnZpY2VzIGluIGEKLSogICAgICAgICAgICAgICBnZW5lcmljLCBjcm9zcyBwbGF0Zm9ybSBBUEkuIFBvcnRpbmcgdGhlIE9TIFBvcnRhYmlsaXR5Ci0qICAgICAgICAgICAgICAgTWFuYWdlciBsaWJyYXJ5IGlzIHRoZSBmaXJzdCBzdGVwIHRvIHBvcnRpbmcgYW55IFNjaVRlY2gKLSogICAgICAgICAgICAgICBwcm9kdWN0cyB0byBhIG5ldyBwbGF0Zm9ybS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgImRydmxpYi9vcy9vcy5oIgotI2luY2x1ZGUgInp0aW1lcmMuaCIKLSNpbmNsdWRlICJtdHJyLmgiCi0jaW5jbHVkZSAicG1faGVscC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZG9zLmg+Ci0jaW5jbHVkZSA8Y29uaW8uaD4KLSNpZmRlZiAgX19HTlVDX18KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvbmVhcnB0ci5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jZWxzZQotI2luY2x1ZGUgPGRpcmVjdC5oPgotI2VuZGlmCi0jaWZkZWYgIF9fQk9STEFORENfXwotI3ByYWdtYSB3YXJuIC1wYXIKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50ICAgICBvbGRNb2RlOwotICAgIGludCAgICAgb2xkNTBMaW5lczsKLSAgICB9IERPU19zdGF0ZUJ1ZjsKLQotI2RlZmluZSBNQVhfUk1fQkxPQ0tTICAgMTAKLQotc3RhdGljIHN0cnVjdCB7Ci0gICAgdm9pZCAgICAqcDsKLSAgICB1aW50ICAgIHRhZzsKLSAgICB9IHJtQmxvY2tzW01BWF9STV9CTE9DS1NdOwotCi1zdGF0aWMgdWludCAgICAgVkVTQUJ1Zl9sZW4gPSAxMDI0OyAgICAgLyogTGVuZ3RoIG9mIHRoZSBWRVNBQnVmIGJ1ZmZlciAgICAgKi8KLXN0YXRpYyB2b2lkICAgICAqVkVTQUJ1Zl9wdHIgPSBOVUxMOyAgICAvKiBOZWFyIHBvaW50ZXIgdG8gVkVTQUJ1ZiAgICAgICAgICAqLwotc3RhdGljIHVpbnQgICAgIFZFU0FCdWZfcnNlZzsgICAgICAgICAgIC8qIFJlYWwgbW9kZSBzZWdtZW50IG9mIFZFU0FCdWYgICAgICovCi1zdGF0aWMgdWludCAgICAgVkVTQUJ1Zl9yb2ZmOyAgICAgICAgICAgLyogUmVhbCBtb2RlIG9mZnNldCBvZiBWRVNBQnVmICAgICAgKi8KLXN0YXRpYyB2b2lkICAgICAoUE1BUElQIGZhdGFsRXJyb3JDbGVhbnVwKSh2b2lkKSA9IE5VTEw7Ci11c2hvcnQgX1ZBUkFQSSAgX1BNX3NhdmVkRFMgPSAwOwotI2lmZGVmICBET1M0R1cKLXN0YXRpYyB1bG9uZyAgICBQREIgPSAwLCpwUERCID0gTlVMTDsKLSNlbmRpZgotI2lmbmRlZiBSRUFMTU9ERQotc3RhdGljIGNoYXIgICAgIFZYRF9uYW1lW10gPSBQTUhFTFBfTkFNRTsKLXN0YXRpYyBjaGFyICAgICBWWERfbW9kdWxlW10gPSBQTUhFTFBfTU9EVUxFOwotc3RhdGljIGNoYXIgICAgIFZYRF9EREJOYW1lW10gPSBQTUhFTFBfRERCTkFNRTsKLXN0YXRpYyB1aW50ICAgICBWWERfdmVyc2lvbiA9IC0xOwotc3RhdGljIHVpbnQgICAgIFZYRF9sb2FkT2ZmID0gMDsKLXN0YXRpYyB1aW50ICAgICBWWERfbG9hZFNlbCA9IDA7Ci11aW50IF9WQVJBUEkgICAgX1BNX1ZYRF9vZmYgPSAwOwotdWludCBfVkFSQVBJICAgIF9QTV9WWERfc2VsID0gMDsKLWludCBfVkFSQVBJICAgICBfUE1faGF2ZUNhdXNlV2F5ID0gLTE7Ci0KLS8qIE1lbW9yeSBtYXBwaW5nIGNhY2hlICovCi0KLSNkZWZpbmUgTUFYX01FTU9SWV9NQVBQSU5HUyAxMDAKLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bG9uZyAgIHBoeXNpY2FsOwotICAgIHVsb25nICAgbGluZWFyOwotICAgIHVsb25nICAgbGltaXQ7Ci0gICAgfSBtbWFwcGluZzsKLXN0YXRpYyBtbWFwcGluZyAgICAgbWFwc1tNQVhfTUVNT1JZX01BUFBJTkdTXSA9IHswfTsKLXN0YXRpYyBpbnQgICAgICAgICAgbnVtTWFwcyA9IDA7Ci0KLS8qIFBhZ2Ugc2l6ZWQgYmxvY2sgY2FjaGUgKi8KLQotI2RlZmluZSBQQUdFU19QRVJfQkxPQ0sgICAgIDEwMAotI2RlZmluZSBGUkVFTElTVF9ORVhUKHApICAgICgqKHZvaWQqKikocCkpCi10eXBlZGVmIHN0cnVjdCBwYWdlYmxvY2sgewotICAgIHN0cnVjdCBwYWdlYmxvY2sgICAgKm5leHQ7Ci0gICAgc3RydWN0IHBhZ2VibG9jayAgICAqcHJldjsKLSAgICB2b2lkICAgICAgICAgICAgICAgICpmcmVlTGlzdFN0YXJ0OwotICAgIHZvaWQgICAgICAgICAgICAgICAgKmZyZWVMaXN0OwotICAgIHZvaWQgICAgICAgICAgICAgICAgKmZyZWVMaXN0RW5kOwotICAgIGludCAgICAgICAgICAgICAgICAgZnJlZUNvdW50OwotICAgIH0gcGFnZWJsb2NrOwotc3RhdGljIHBhZ2VibG9jayAgICAqcGFnZUJsb2NrcyA9IE5VTEw7Ci0jZW5kaWYKLQotLyogU3RhcnQgb2YgYWxsIHBhZ2UgdGFibGVzIGluIENhdXNlV2F5ICovCi0KLSNkZWZpbmUgQ1dfUEFHRV9UQUJMRV9TVEFSVCAoMTAyNFVMKjQwOTZVTCoxMDIzVUwpCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEV4dGVybmFsIGFzc2VtYmxlciBmdW5jdGlvbnMgKi8KLQotdWxvbmcgICBfQVNNQVBJIF9QTV9nZXRQREIodm9pZCk7Ci1pbnQgICAgIF9BU01BUEkgX1BNX3BhZ2luZ0VuYWJsZWQodm9pZCk7Ci12b2lkICAgIF9BU01BUEkgX1BNX1Z4RENhbGwoVlhEX3JlZ3MgKnJlZ3MsdWludCBvZmYsdWludCBzZWwpOwotCi0jaWZuZGVmIFJFQUxNT0RFCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUV4aXQgZnVuY3Rpb24gdG8gdW5sb2FkIHRoZSBkeW5hbWljYWxseSBsb2FkZWQgVnhECi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgVW5sb2FkVnhEKHZvaWQpCi17Ci0gICAgUE1TUkVHUyAgICAgc3JlZ3M7Ci0gICAgVlhEX3JlZ3MgICAgcjsKLQotICAgIHIuZWF4ID0gMjsKLSAgICByLmVieCA9IDA7Ci0gICAgci5lZHggPSAodWludClWWERfbW9kdWxlOwotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSNpZmRlZiAgX18xNkJJVF9fCi0gICAgci5kcyA9ICgodWxvbmcpVlhEX21vZHVsZSkgPj4gMTY7Ci0jZWxzZQotICAgIHIuZHMgPSBzcmVncy5kczsKLSNlbmRpZgotICAgIHIuZXMgPSBzcmVncy5lczsKLSAgICBfUE1fVnhEQ2FsbCgmcixWWERfbG9hZE9mZixWWERfbG9hZFNlbCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRXh0ZXJuYWwgZnVuY3Rpb24gdG8gY2FsbCB0aGUgUE1IRUxQIGhlbHBlciBWeEQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9WeERDYWxsKAotICAgIFZYRF9yZWdzICpyZWdzKQotewotICAgIGlmIChfUE1fVlhEX3NlbCAhPSAwIHx8IF9QTV9WWERfb2ZmICE9IDApCi0JX1BNX1Z4RENhbGwocmVncyxfUE1fVlhEX29mZixfUE1fVlhEX3NlbCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVRVUk5TOgotQkNEIGNvZGVkIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBWeEQsIG9yIDAgaWYgbm90IGxvYWRlZCAoaWU6IDB4MjAyIC0gMi4yKQotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIFZ4RCB0aGF0IHdlIGhhdmUgY29ubmVjdGVkIHRvLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQgUE1BUEkgUE1IRUxQX2dldFZlcnNpb24odm9pZCkKLXsKLSAgICBWWERfcmVncyAgICByOwotCi0gICAgLyogQ2FsbCB0aGUgaGVscGVyIFZ4RCB0byBkZXRlcm1pbmUgdGhlIHZlcnNpb24gbnVtYmVyICovCi0gICAgaWYgKF9QTV9WWERfc2VsICE9IDAgfHwgX1BNX1ZYRF9vZmYgIT0gMCkgewotCW1lbXNldCgmciwwLHNpemVvZihyKSk7Ci0Jci5lYXggPSBBUElfTlVNKFBNSEVMUF9HRVRWRVIpOwotCV9QTV9WeERDYWxsKCZyLF9QTV9WWERfb2ZmLF9QTV9WWERfc2VsKTsKLQlyZXR1cm4gVlhEX3ZlcnNpb24gPSAodWludClyLmVheDsKLQl9Ci0gICAgcmV0dXJuIFZYRF92ZXJzaW9uID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotQ29ubmVjdHMgdG8gdGhlIGhlbHBlciBWeEQgYW5kIHJldHVybnMgdGhlIHZlcnNpb24gbnVtYmVyCi0KLVJFVFVSTlM6Ci1UcnVlIGlmIHRoZSBWeEQgd2FzIGZvdW5kIGFuZCBsb2FkZWQsIGZhbHNlIG90aGVyd2lzZS4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gY29ubmVjdHMgdG8gdGhlIFZ4RCAobG9hZGluZyBpdCBpZiBpdCBpcyBkeW5hbWljYWxseSBsb2FkYWJsZSkKLWFuZCByZXR1cm5zIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgVnhELgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpYm9vbCBQTUhFTFBfY29ubmVjdCh2b2lkKQotewotICAgIFBNUkVHUyAgICAgIHJlZ3M7Ci0gICAgUE1TUkVHUyAgICAgc3JlZ3M7Ci0gICAgVlhEX3JlZ3MgICAgcjsKLQotICAgIC8qIEJhaWwgZWFybHkgaWYgd2UgaGF2ZSBhbHJlYWQgY29ubmVjdGVkICovCi0gICAgaWYgKFZYRF92ZXJzaW9uICE9IC0xKQotCXJldHVybiBWWERfdmVyc2lvbiAhPSAwOwotCi0gICAgLyogR2V0IHRoZSBzdGF0aWMgU0RESEVMUC5WWEQgZW50cnkgcG9pbnQgaWYgYXZhaWxhYmxlICovCi0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHJlZ3MueC5heCA9IDB4MTY4NDsKLSAgICByZWdzLnguYnggPSBTRERIRUxQX0RldmljZUlEOwotICAgIHJlZ3MueC5kaSA9IDA7Ci0gICAgc3JlZ3MuZXMgPSAwOwotICAgIFBNX2ludDM4NngoMHgyRiwmcmVncywmcmVncywmc3JlZ3MpOwotICAgIF9QTV9WWERfc2VsID0gc3JlZ3MuZXM7Ci0gICAgX1BNX1ZYRF9vZmYgPSByZWdzLnguZGk7Ci0gICAgaWYgKF9QTV9WWERfc2VsICE9IDAgfHwgX1BNX1ZYRF9vZmYgIT0gMCkgewotCWlmIChQTUhFTFBfZ2V0VmVyc2lvbigpID49IFBNSEVMUF9WRVJTSU9OKQotCSAgICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAvKiBJZiB3ZSBnZXQgaGVyZSwgdGhlbiBlaXRoZXIgU0RESEVMUC5WWEQgaXMgbm90IGxvYWRlZCwgb3IgaXQgaXMgYW4KLSAgICAgKiBlYXJsaWVyIHZlcnNpb24uIEluIHRoaXMgY2FzZSB0cnkgdG8gZHluYW1pY2FsbHkgbG9hZCB0aGUgUE1IRUxQLlZYRAotICAgICAqIGhlbHBlciBWeEQgaW5zdGVhZC4KLSAgICAgKi8KLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0gICAgcmVncy54LmF4ID0gMHgxNjg0OwotICAgIHJlZ3MueC5ieCA9IFZYRExEUl9EZXZpY2VJRDsKLSAgICByZWdzLnguZGkgPSAwOwotICAgIHNyZWdzLmVzID0gMDsKLSAgICBQTV9pbnQzODZ4KDB4MkYsJnJlZ3MsJnJlZ3MsJnNyZWdzKTsKLSAgICBWWERfbG9hZFNlbCA9IHNyZWdzLmVzOwotICAgIFZYRF9sb2FkT2ZmID0gcmVncy54LmRpOwotICAgIGlmIChWWERfbG9hZFNlbCA9PSAwICYmIFZYRF9sb2FkT2ZmID09IDApCi0JcmV0dXJuIFZYRF92ZXJzaW9uID0gMDsKLSAgICByLmVheCA9IDE7Ci0gICAgci5lYnggPSAwOwotICAgIHIuZWR4ID0gKHVpbnQpVlhEX25hbWU7Ci0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHIuZHMgPSBzcmVncy5kczsKLSAgICByLmVzID0gc3JlZ3MuZXM7Ci0gICAgX1BNX1Z4RENhbGwoJnIsVlhEX2xvYWRPZmYsVlhEX2xvYWRTZWwpOwotICAgIGlmIChyLmVheCAhPSAwKQotCXJldHVybiBWWERfdmVyc2lvbiA9IDA7Ci0KLSAgICAvKiBHZXQgdGhlIGR5bmFtaWMgVnhEIGVudHJ5IHBvaW50IHNvIHdlIGNhbiBjYWxsIGl0ICovCi0gICAgYXRleGl0KFVubG9hZFZ4RCk7Ci0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHJlZ3MueC5heCA9IDB4MTY4NDsKLSAgICByZWdzLnguYnggPSAwOwotICAgIHJlZ3MuZS5lZGkgPSAodWludClWWERfRERCTmFtZTsKLSAgICBQTV9pbnQzODZ4KDB4MkYsJnJlZ3MsJnJlZ3MsJnNyZWdzKTsKLSAgICBfUE1fVlhEX3NlbCA9IHNyZWdzLmVzOwotICAgIF9QTV9WWERfb2ZmID0gcmVncy54LmRpOwotICAgIGlmIChfUE1fVlhEX3NlbCA9PSAwICYmIF9QTV9WWERfb2ZmID09IDApCi0JcmV0dXJuIFZYRF92ZXJzaW9uID0gMDsKLSAgICBpZiAoUE1IRUxQX2dldFZlcnNpb24oKSA+PSBQTUhFTFBfVkVSU0lPTikKLQlyZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gVlhEX3ZlcnNpb24gPSAwOwotfQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgUE0gbGlicmFyeS4gRmlyc3Qgd2UgdHJ5IHRvIGNvbm5lY3QgdG8gYSBzdGF0aWMgU0RESEVMUC5WWEQKLWhlbHBlciBWeEQsIGFuZCBjaGVjayB0aGF0IGl0IGlzIGEgdmVyc2lvbiB3ZSBjYW4gdXNlLiBJZiBub3Qgd2UgdHJ5IHRvCi1keW5hbWljYWxseSBsb2FkIHRoZSBQTUhFTFAuVlhEIGhlbHBlciBWeEQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2luaXQodm9pZCkKLXsKLSNpZm5kZWYgUkVBTE1PREUKLSAgICBQTVJFR1MgIHJlZ3M7Ci0KLSAgICAvKiBDaGVjayBpZiB3ZSBhcmUgcnVubmluZyB1bmRlciBDYXVzZVdheSB1bmRlciByZWFsIERPUyAqLwotICAgIGlmIChfUE1faGF2ZUNhdXNlV2F5ID09IC0xKSB7Ci0JLyogQ2hlY2sgaWYgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgRFBNSSBpbiB3aGljaCBjYXNlIHdlIHdpbGwgbm90IGJlCi0JICogYWJsZSB0byB1c2Ugb3VyIHNwZWNpYWwgcmluZyAwIENhdXNlV2F5IGZ1bmN0aW9ucy4KLQkgKi8KLQlfUE1faGF2ZUNhdXNlV2F5ID0gZmFsc2U7Ci0JcmVncy54LmF4ID0gMHhGRjAwOwotCVBNX2ludDM4NigweDMxLCZyZWdzLCZyZWdzKTsKLQlpZiAocmVncy54LmNmbGFnIHx8ICEocmVncy5lLmVkaSAmIDgpKSB7Ci0JICAgIC8qIFdlIGFyZSBub3QgdW5kZXIgRFBNSSwgc28gbm93IGNoZWNrIGlmIENhdXNlV2F5IGlzIGFjdGl2ZSAqLwotCSAgICByZWdzLnguYXggPSAweEZGRjk7Ci0JICAgIFBNX2ludDM4NigweDMxLCZyZWdzLCZyZWdzKTsKLQkgICAgaWYgKCFyZWdzLnguY2ZsYWcgJiYgcmVncy5lLmVjeCA9PSAweDQzNDE1NTUzICYmIHJlZ3MuZS5lZHggPT0gMHg0NTU3NDE1OSkKLQkJX1BNX2hhdmVDYXVzZVdheSA9IHRydWU7Ci0JICAgIH0KLQotCS8qIE5vdyBjb25uZWN0IHRvIFBNSEVMUC5WWEQgYW5kIGluaXRpYWxpc2UgTVRSUiBtb2R1bGUgKi8KLQlpZiAoIVBNSEVMUF9jb25uZWN0KCkpCi0JICAgIE1UUlJfaW5pdCgpOwotCX0KLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWJhc2UgICAgLSBUaGUgc3RhcnRpbmcgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24KLXNpemUgICAgLSBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVnaW9uCi10eXBlICAgIC0gVHlwZSB0byBwbGFjZSBpbnRvIHRoZSBNVFJSIHJlZ2lzdGVyCi0KLVJFVFVSTlM6Ci1FcnJvciBjb2RlIGRlc2NyaWJpbmcgdGhlIHJlc3VsdC4KLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGVuYWJsZSB3cml0ZSBjb21iaW5pbmcgZm9yIHRoZSBzcGVjaWZpZWQgcmVnaW9uIG9mIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZW5hYmxlV3JpdGVDb21iaW5lKAotICAgIHVsb25nIGJhc2UsCi0gICAgdWxvbmcgc2l6ZSwKLSAgICB1aW50IHR5cGUpCi17Ci0jaWZuZGVmIFJFQUxNT0RFCi0gICAgVlhEX3JlZ3MgICAgcmVnczsKLQotICAgIGlmIChQTUhFTFBfY29ubmVjdCgpKSB7Ci0JbWVtc2V0KCZyZWdzLDAsc2l6ZW9mKHJlZ3MpKTsKLQlyZWdzLmVheCA9IEFQSV9OVU0oUE1IRUxQX0VOQUJMRUxGQkNPTUIpOwotCXJlZ3MuZWJ4ID0gYmFzZTsKLQlyZWdzLmVjeCA9IHNpemU7Ci0JcmVncy5lZHggPSB0eXBlOwotCV9QTV9WeERDYWxsKCZyZWdzLF9QTV9WWERfb2ZmLF9QTV9WWERfc2VsKTsKLQlyZXR1cm4gcmVncy5lYXg7Ci0JfQotICAgIHJldHVybiBNVFJSX2VuYWJsZVdyaXRlQ29tYmluZShiYXNlLHNpemUsdHlwZSk7Ci0jZWxzZQotICAgIHJldHVybiBQTV9NVFJSX05PVF9TVVBQT1JURUQ7Ci0jZW5kaWYKLX0KLQotaWJvb2wgUE1BUEkgUE1faGF2ZUJJT1NBY2Nlc3Modm9pZCkKLXsgcmV0dXJuIHRydWU7IH0KLQotbG9uZyBQTUFQSSBQTV9nZXRPU1R5cGUodm9pZCkKLXsgcmV0dXJuIF9PU19ET1M7IH0KLQotaW50IFBNQVBJIFBNX2dldE1vZGVUeXBlKHZvaWQpCi17Ci0jaWYgZGVmaW5lZChSRUFMTU9ERSkKLSAgICByZXR1cm4gUE1fcmVhbE1vZGU7Ci0jZWxpZiBkZWZpbmVkKFBNMjg2KQotICAgIHJldHVybiBQTV8yODY7Ci0jZWxpZiBkZWZpbmVkKFBNMzg2KQotICAgIHJldHVybiBQTV8zODY7Ci0jZW5kaWYKLX0KLQotdm9pZCBQTUFQSSBQTV9iYWNrc2xhc2goY2hhciAqcykKLXsKLSAgICB1aW50IHBvcyA9IHN0cmxlbihzKTsKLSAgICBpZiAoc1twb3MtMV0gIT0gJ1xcJykgewotCXNbcG9zXSA9ICdcXCc7Ci0Jc1twb3MrMV0gPSAnXDAnOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRGYXRhbEVycm9yQ2xlYW51cCgKLSAgICB2b2lkIChQTUFQSVAgY2xlYW51cCkodm9pZCkpCi17Ci0gICAgZmF0YWxFcnJvckNsZWFudXAgPSBjbGVhbnVwOwotfQotCi12b2lkIFBNQVBJIFBNX2ZhdGFsRXJyb3IoY29uc3QgY2hhciAqbXNnKQotewotICAgIGlmIChmYXRhbEVycm9yQ2xlYW51cCkKLQlmYXRhbEVycm9yQ2xlYW51cCgpOwotICAgIGZwcmludGYoc3RkZXJyLCIlc1xuIiwgbXNnKTsKLSAgICBleGl0KDEpOwotfQotCi1zdGF0aWMgdm9pZCBFeGl0VkJFQnVmKHZvaWQpCi17Ci0gICAgaWYgKFZFU0FCdWZfcHRyKQotCVBNX2ZyZWVSZWFsU2VnKFZFU0FCdWZfcHRyKTsKLSAgICBWRVNBQnVmX3B0ciA9IDA7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRWRVNBQnVmKHVpbnQgKmxlbix1aW50ICpyc2VnLHVpbnQgKnJvZmYpCi17Ci0gICAgaWYgKCFWRVNBQnVmX3B0cikgewotCS8qIEFsbG9jYXRlIGEgZ2xvYmFsIGJ1ZmZlciBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBWRVNBIFZCRSAqLwotCWlmICgoVkVTQUJ1Zl9wdHIgPSBQTV9hbGxvY1JlYWxTZWcoVkVTQUJ1Zl9sZW4sICZWRVNBQnVmX3JzZWcsICZWRVNBQnVmX3JvZmYpKSA9PSBOVUxMKQotCSAgICByZXR1cm4gTlVMTDsKLQlhdGV4aXQoRXhpdFZCRUJ1Zik7Ci0JfQotICAgICpsZW4gPSBWRVNBQnVmX2xlbjsKLSAgICAqcnNlZyA9IFZFU0FCdWZfcnNlZzsKLSAgICAqcm9mZiA9IFZFU0FCdWZfcm9mZjsKLSAgICByZXR1cm4gVkVTQUJ1Zl9wdHI7Ci19Ci0KLWludCBQTUFQSSBQTV9pbnQzODYoaW50IGludG5vLCBQTVJFR1MgKmluLCBQTVJFR1MgKm91dCkKLXsKLSAgICBQTVNSRUdTIHNyZWdzOwotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICByZXR1cm4gUE1faW50Mzg2eChpbnRubyxpbixvdXQsJnNyZWdzKTsKLX0KLQotLyogUm91dGluZXMgdG8gc2V0IGFuZCBnZXQgdGhlIHJlYWwgbW9kZSBpbnRlcnJ1cHQgdmVjdG9ycywgYnkgbWFraW5nCi0gKiBkaXJlY3QgcmVhbCBtb2RlIGNhbGxzIHRvIERPUyBhbmQgYnlwYXNzaW5nIHRoZSBET1MgZXh0ZW5kZXJzIEFQSS4KLSAqIFRoaXMgaXMgdGhlIHNhZmVzdCB3YXkgdG8gaGFuZGxlIHRoaXMsIGFzIHNvbWUgc2VydmVycyB0cnkgdG8gYmUKLSAqIHNtYXJ0IGFib3V0IGNoYW5naW5nIHJlYWwgbW9kZSB2ZWN0b3JzLgotICovCi0KLXZvaWQgUE1BUEkgX1BNX2dldFJNdmVjdChpbnQgaW50bm8sIGxvbmcgKnJlYWxpc3IpCi17Ci0gICAgUk1SRUdTICByZWdzOwotICAgIFJNU1JFR1Mgc3JlZ3M7Ci0KLSAgICBQTV9zYXZlRFMoKTsKLSAgICByZWdzLmguYWggPSAweDM1OwotICAgIHJlZ3MuaC5hbCA9IGludG5vOwotICAgIFBNX2ludDg2eCgweDIxLCAmcmVncywgJnJlZ3MsICZzcmVncyk7Ci0gICAgKnJlYWxpc3IgPSAoKGxvbmcpc3JlZ3MuZXMgPDwgMTYpIHwgcmVncy54LmJ4OwotfQotCi12b2lkIFBNQVBJIF9QTV9zZXRSTXZlY3QoaW50IGludG5vLCBsb25nIHJlYWxpc3IpCi17Ci0gICAgUk1SRUdTICByZWdzOwotICAgIFJNU1JFR1Mgc3JlZ3M7Ci0KLSAgICBQTV9zYXZlRFMoKTsKLSAgICByZWdzLmguYWggPSAweDI1OwotICAgIHJlZ3MuaC5hbCA9IGludG5vOwotICAgIHNyZWdzLmRzID0gKGludCkocmVhbGlzciA+PiAxNik7Ci0gICAgcmVncy54LmR4ID0gKGludCkocmVhbGlzciAmIDB4RkZGRik7Ci0gICAgUE1faW50ODZ4KDB4MjEsICZyZWdzLCAmcmVncywgJnNyZWdzKTsKLX0KLQotdm9pZCBQTUFQSSBfUE1fYWRkUmVhbE1vZGVCbG9jayh2b2lkICptZW0sdWludCB0YWcpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1JNX0JMT0NLUzsgaSsrKSB7Ci0JaWYgKHJtQmxvY2tzW2ldLnAgPT0gTlVMTCkgewotCSAgICBybUJsb2Nrc1tpXS5wID0gbWVtOwotCSAgICBybUJsb2Nrc1tpXS50YWcgPSB0YWc7Ci0JICAgIHJldHVybjsKLQkgICAgfQotCX0KLSAgICBQTV9mYXRhbEVycm9yKCJUbyBtYW55IHJlYWwgbW9kZSBtZW1vcnkgYmxvY2sgYWxsb2NhdGlvbnMhIik7Ci19Ci0KLXVpbnQgUE1BUEkgX1BNX2ZpbmRSZWFsTW9kZUJsb2NrKHZvaWQgKm1lbSkKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfUk1fQkxPQ0tTOyBpKyspIHsKLQlpZiAocm1CbG9ja3NbaV0ucCA9PSBtZW0pCi0JICAgIHJldHVybiBybUJsb2Nrc1tpXS50YWc7Ci0JfQotICAgIFBNX2ZhdGFsRXJyb3IoIkNvdWxkIG5vdCBmaW5kIHByaW9yIHJlYWwgbW9kZSBtZW1vcnkgYmxvY2sgYWxsb2NhdGlvbiEiKTsKLSAgICByZXR1cm4gMDsKLX0KLQotY2hhciAqIFBNQVBJIFBNX2dldEN1cnJlbnRQYXRoKAotICAgIGNoYXIgKnBhdGgsCi0gICAgaW50IG1heExlbikKLXsKLSAgICByZXR1cm4gZ2V0Y3dkKHBhdGgsbWF4TGVuKTsKLX0KLQotY2hhciBQTUFQSSBQTV9nZXRCb290RHJpdmUodm9pZCkKLXsgcmV0dXJuICdDJzsgfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VkJFQUZQYXRoKHZvaWQpCi17IHJldHVybiAiYzpcXCI7IH0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNQYXRoKHZvaWQpCi17Ci0gICAgc3RhdGljIGNoYXIgcGF0aFsyNTZdOwotICAgIGNoYXIgICAgICAgICplbnY7Ci0KLSAgICBpZiAoKGVudiA9IGdldGVudigiTlVDTEVVU19QQVRIIikpICE9IE5VTEwpCi0JcmV0dXJuIGVudjsKLSAgICBpZiAoKGVudiA9IGdldGVudigiV0lOQk9PVERJUiIpKSAhPSBOVUxMKSB7Ci0JLyogUnVubmluZyBpbiBhIFdpbmRvd3MgOXggRE9TIGJveCBvciBET1MgbW9kZSAqLwotCXN0cmNweShwYXRoLGVudik7Ci0Jc3RyY2F0KHBhdGgsIlxcc3lzdGVtXFxudWNsZXVzIik7Ci0JcmV0dXJuIHBhdGg7Ci0JfQotICAgIGlmICgoZW52ID0gZ2V0ZW52KCJTeXN0ZW1Sb290IikpICE9IE5VTEwpIHsKLQkvKiBSdW5uaW5nIGluIGFuIE5ULzJLIERPUyBib3ggKi8KLQlzdHJjcHkocGF0aCxlbnYpOwotCXN0cmNhdChwYXRoLCJcXHN5c3RlbTMyXFxudWNsZXVzIik7Ci0JcmV0dXJuIHBhdGg7Ci0JfQotICAgIHJldHVybiAiYzpcXG51Y2xldXMiOwotfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBwYXRoWzI1Nl07Ci0gICAgc3RyY3B5KHBhdGgsUE1fZ2V0TnVjbGV1c1BhdGgoKSk7Ci0gICAgUE1fYmFja3NsYXNoKHBhdGgpOwotICAgIHN0cmNhdChwYXRoLCJjb25maWciKTsKLSAgICByZXR1cm4gcGF0aDsKLX0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFVuaXF1ZUlEKHZvaWQpCi17IHJldHVybiAiRE9TIjsgfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TWFjaGluZU5hbWUodm9pZCkKLXsgcmV0dXJuICJET1MiOyB9Ci0KLWludCBQTUFQSSBQTV9rYmhpdCh2b2lkKQotewotICAgIHJldHVybiBrYmhpdCgpOwotfQotCi1pbnQgUE1BUEkgUE1fZ2V0Y2godm9pZCkKLXsKLSAgICByZXR1cm4gZ2V0Y2goKTsKLX0KLQotUE1fSFdORCBQTUFQSSBQTV9vcGVuQ29uc29sZShQTV9IV05EIGh3bmRVc2VyLGludCBkZXZpY2UsaW50IHhSZXMsaW50IHlSZXMsaW50IGJwcCxpYm9vbCBmdWxsU2NyZWVuKQotewotICAgIC8qIE5vdCB1c2VkIGZvciBET1MgKi8KLSAgICAodm9pZClod25kVXNlcjsKLSAgICAodm9pZClkZXZpY2U7Ci0gICAgKHZvaWQpeFJlczsKLSAgICAodm9pZCl5UmVzOwotICAgICh2b2lkKWJwcDsKLSAgICAodm9pZClmdWxsU2NyZWVuOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgUE1BUEkgUE1fZ2V0Q29uc29sZVN0YXRlU2l6ZSh2b2lkKQotewotICAgIHJldHVybiBzaXplb2YoRE9TX3N0YXRlQnVmKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zYXZlQ29uc29sZVN0YXRlKHZvaWQgKnN0YXRlQnVmLFBNX0hXTkQgaHduZENvbnNvbGUpCi17Ci0gICAgUk1SRUdTICAgICAgICAgIHJlZ3M7Ci0gICAgRE9TX3N0YXRlQnVmICAgICpzYiA9IHN0YXRlQnVmOwotCi0gICAgLyogU2F2ZSB0aGUgb2xkIHZpZGVvIG1vZGUgc3RhdGUgKi8KLSAgICByZWdzLmguYWggPSAweDBGOwotICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotICAgIHNiLT5vbGRNb2RlID0gcmVncy5oLmFsICYgMHg3RjsKLSAgICBzYi0+b2xkNTBMaW5lcyA9IGZhbHNlOwotICAgIGlmIChzYi0+b2xkTW9kZSA9PSAweDMpIHsKLQlyZWdzLnguYXggPSAweDExMzA7Ci0JcmVncy54LmJ4ID0gMDsKLQlyZWdzLnguZHggPSAwOwotCVBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotCXNiLT5vbGQ1MExpbmVzID0gKHJlZ3MuaC5kbCA9PSA0MiB8fCByZWdzLmguZGwgPT0gNDkpOwotCX0KLSAgICAodm9pZClod25kQ29uc29sZTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2soaW50IChfQVNNQVBJUCBzYXZlU3RhdGUpKGludCBmbGFncykpCi17Ci0gICAgLyogTm90IHVzZWQgZm9yIERPUyAqLwotICAgICh2b2lkKXNhdmVTdGF0ZTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlQ29uc29sZVN0YXRlKGNvbnN0IHZvaWQgKnN0YXRlQnVmLFBNX0hXTkQgaHduZENvbnNvbGUpCi17Ci0gICAgUk1SRUdTICAgICAgICAgICAgICByZWdzOwotICAgIGNvbnN0IERPU19zdGF0ZUJ1ZiAgKnNiID0gc3RhdGVCdWY7Ci0KLSAgICAvKiBSZXRvcmUgNTAgbGluZSBtb2RlIGlmIHNldCAqLwotICAgIGlmIChzYi0+b2xkNTBMaW5lcykgewotCXJlZ3MueC5heCA9IDB4MTExMjsKLQlyZWdzLnguYnggPSAwOwotCVBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotCX0KLSAgICAodm9pZClod25kQ29uc29sZTsKLX0KLQotdm9pZCBQTUFQSSBQTV9jbG9zZUNvbnNvbGUoUE1fSFdORCBod25kQ29uc29sZSkKLXsKLSAgICAvKiBOb3QgdXNlZCBmb3IgRE9TICovCi0gICAgKHZvaWQpaHduZENvbnNvbGU7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0T1NDdXJzb3JMb2NhdGlvbihpbnQgeCxpbnQgeSkKLXsKLSAgICB1Y2hhciAqX2Jpb3NQdHIgPSBQTV9nZXRCSU9TUG9pbnRlcigpOwotICAgIFBNX3NldEJ5dGUoX2Jpb3NQdHIrMHg1MCx4KTsKLSAgICBQTV9zZXRCeXRlKF9iaW9zUHRyKzB4NTEseSk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0T1NTY3JlZW5XaWR0aChpbnQgd2lkdGgsaW50IGhlaWdodCkKLXsKLSAgICB1Y2hhciAqX2Jpb3NQdHIgPSBQTV9nZXRCSU9TUG9pbnRlcigpOwotICAgIFBNX3NldFdvcmQoX2Jpb3NQdHIrMHg0QSx3aWR0aCk7Ci0gICAgUE1fc2V0V29yZChfYmlvc1B0cisweDRDLHdpZHRoKjIpOwotICAgIFBNX3NldEJ5dGUoX2Jpb3NQdHIrMHg4NCxoZWlnaHQtMSk7Ci0gICAgaWYgKGhlaWdodCA+IDI1KSB7Ci0JUE1fc2V0V29yZChfYmlvc1B0cisweDYwLDB4MDYwNyk7Ci0JUE1fc2V0Qnl0ZShfYmlvc1B0cisweDg1LDB4MDgpOwotCX0KLSAgICBlbHNlIHsKLQlQTV9zZXRXb3JkKF9iaW9zUHRyKzB4NjAsMHgwRDBFKTsKLQlQTV9zZXRCeXRlKF9iaW9zUHRyKzB4ODUsMHgwMTYpOwotCX0KLX0KLQotdm9pZCAqIFBNQVBJIFBNX21hbGxvY1NoYXJlZChsb25nIHNpemUpCi17Ci0gICAgcmV0dXJuIFBNX21hbGxvYyhzaXplKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlU2hhcmVkKHZvaWQgKnB0cikKLXsKLSAgICBQTV9mcmVlKHB0cik7Ci19Ci0KLSNkZWZpbmUgR2V0Uk1WZWN0KGludG5vLGlzcikgICAgKihpc3IpID0gKCh1bG9uZyopcm1aZXJvUHRyKVtpbnRub10KLSNkZWZpbmUgU2V0Uk1WZWN0KGludG5vLGlzcikgICAgKCh1bG9uZyopcm1aZXJvUHRyKVtpbnRub10gPSAoaXNyKQotCi1pYm9vbCBQTUFQSSBQTV9kb0JJT1NQT1NUKAotICAgIHVzaG9ydCBheFZhbCwKLSAgICB1bG9uZyBCSU9TUGh5c0FkZHIsCi0gICAgdm9pZCAqbWFwcGVkQklPUywKLSAgICB1bG9uZyBCSU9TTGVuKQotewotICAgIHN0YXRpYyBpbnQgICAgICBmaXJzdFRpbWUgPSB0cnVlOwotICAgIHN0YXRpYyB1Y2hhciAgICAqcm1aZXJvUHRyOwotICAgIGxvbmcgICAgICAgICAgICBDdXJyZW50MTAsQ3VycmVudDZELEN1cnJlbnQ0MjsKLSAgICBSTVJFR1MgICAgICAgICAgcmVnczsKLSAgICBSTVNSRUdTICAgICAgICAgc3JlZ3M7Ci0KLSAgICAvKiBDcmVhdGUgYSB6ZXJvIG1lbW9yeSBtYXBwaW5nIGZvciB1cyB0byB1c2UgKi8KLSAgICBpZiAoZmlyc3RUaW1lKSB7Ci0Jcm1aZXJvUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDAsMHg3RkZGLHRydWUpOwotCWZpcnN0VGltZSA9IGZhbHNlOwotCX0KLQotICAgIC8qIFJlbWFwIHRoZSBzZWNvbmRhcnkgQklPUyB0byAweEMwMDAwIHBoeXNpY2FsICovCi0gICAgaWYgKEJJT1NQaHlzQWRkciAhPSAweEMwMDAwTCB8fCBCSU9TTGVuID4gMzI3NjgpIHsKLQkvKiBET1MgY2Fubm90IHZpcnR1YWxseSByZW1hcCB0aGUgQklPUywgc28gd2UgY2FuIG9ubHkgd29yayBpZiBhbGwKLQkgKiB0aGUgc2Vjb25kYXJ5IGNvbnRyb2xsZXJzIGFyZSBpZGVudGljYWwsIGFuZCB3ZSB0aGVuIHVzZSB0aGUKLQkgKiBCSU9TIG9uIHRoZSBmaXJzdCBjb250cm9sbGVyIGZvciBhbGwgdGhlIHJlbWFpbmluZyBjb250cm9sbGVycy4KLQkgKgotCSAqIEZvciBPUydlcyB0aGF0IGRvIHZpcnR1YWwgbWVtb3J5LCBhbmQgcmVtYXBwaW5nIG9mIDB4QzAwMDAKLQkgKiBwaHlzaWNhbCAocGVyaGFwcyBhIGNvcHkgb24gd3JpdGUgbWFwcGluZykgc2hvdWxkIGJlIGFsbCB0aGF0Ci0JICogaXMgbmVlZGVkLgotCSAqLwotCXJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAvKiBTYXZlIGN1cnJlbnQgaGFuZGxlcnMgb2YgaW50IDEwaCBhbmQgNkRoICovCi0gICAgR2V0Uk1WZWN0KDB4MTAsJkN1cnJlbnQxMCk7Ci0gICAgR2V0Uk1WZWN0KDB4NkQsJkN1cnJlbnQ2RCk7Ci0KLSAgICAvKiBQT1NUIHRoZSBzZWNvbmRhcnkgQklPUyAqLwotICAgIEdldFJNVmVjdCgweDQyLCZDdXJyZW50NDIpOwotICAgIFNldFJNVmVjdCgweDEwLEN1cnJlbnQ0Mik7ICAvKiBSZXN0b3JlIGludCAxMGggdG8gU1RELUJJT1MgKi8KLSAgICByZWdzLnguYXggPSBheFZhbDsKLSAgICBQTV9jYWxsUmVhbE1vZGUoMHhDMDAwLDB4MDAwMywmcmVncywmc3JlZ3MpOwotCi0gICAgLyogUmVzdG9yZSBjdXJyZW50IGhhbmRsZXJzICovCi0gICAgU2V0Uk1WZWN0KDB4MTAsQ3VycmVudDEwKTsKLSAgICBTZXRSTVZlY3QoMHg2RCxDdXJyZW50NkQpOwotCi0gICAgLyogU2Vjb25kIHRoZSBwcmltYXJ5IEJJT1MgbWFwcGluIDE6MSBmb3IgMHhDMDAwMCBwaHlzaWNhbCAqLwotICAgIGlmIChCSU9TUGh5c0FkZHIgIT0gMHhDMDAwMEwpIHsKLQkvKiBET1MgZG9lcyBub3Qgc3VwcG9ydCB0aGlzICovCi0JKHZvaWQpbWFwcGVkQklPUzsKLQl9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2xlZXAodWxvbmcgbWlsbGlzZWNvbmRzKQotewotICAgIHVsb25nICAgICAgICAgICBtaWNyb3NlY29uZHMgPSBtaWxsaXNlY29uZHMgKiAxMDAwTDsKLSAgICBMWlRpbWVyT2JqZWN0ICAgdG07Ci0KLSAgICBMWlRpbWVyT25FeHQoJnRtKTsKLSAgICB3aGlsZSAoTFpUaW1lckxhcEV4dCgmdG0pIDwgbWljcm9zZWNvbmRzKQotCTsKLSAgICBMWlRpbWVyT2ZmRXh0KCZ0bSk7Ci19Ci0KLWludCBQTUFQSSBQTV9nZXRDT01Qb3J0KGludCBwb3J0KQotewotICAgIHN3aXRjaCAocG9ydCkgewotCWNhc2UgMDogcmV0dXJuIDB4M0Y4OwotCWNhc2UgMTogcmV0dXJuIDB4MkY4OwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IFBNQVBJIFBNX2dldExQVFBvcnQoaW50IHBvcnQpCi17Ci0gICAgc3dpdGNoIChwb3J0KSB7Ci0JY2FzZSAwOiByZXR1cm4gMHgzQkM7Ci0JY2FzZSAxOiByZXR1cm4gMHgzNzg7Ci0JY2FzZSAyOiByZXR1cm4gMHgyNzg7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi1QTV9NT0RVTEUgUE1BUEkgUE1fbG9hZExpYnJhcnkoCi0gICAgY29uc3QgY2hhciAqc3pETExOYW1lKQotewotICAgICh2b2lkKXN6RExMTmFtZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2dldFByb2NBZGRyZXNzKAotICAgIFBNX01PRFVMRSBoTW9kdWxlLAotICAgIGNvbnN0IGNoYXIgKnN6UHJvY05hbWUpCi17Ci0gICAgKHZvaWQpaE1vZHVsZTsKLSAgICAodm9pZClzelByb2NOYW1lOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVMaWJyYXJ5KAotICAgIFBNX01PRFVMRSBoTW9kdWxlKQotewotICAgICh2b2lkKWhNb2R1bGU7Ci19Ci0KLWludCBQTUFQSSBQTV9zZXRJT1BMKAotICAgIGludCBsZXZlbCkKLXsKLSAgICByZXR1cm4gbGV2ZWw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW50ZXJuYWwgZnVuY3Rpb24gdG8gY29udmVydCB0aGUgZmluZCBkYXRhIHRvIHRoZSBnZW5lcmljIGludGVyZmFjZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBjb252ZXJ0RmluZERhdGEoCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhLAotICAgIHN0cnVjdCBmaW5kX3QgKmJsaykKLXsKLSAgICB1bG9uZyAgIGR3U2l6ZSA9IGZpbmREYXRhLT5kd1NpemU7Ci0KLSAgICBtZW1zZXQoZmluZERhdGEsMCxmaW5kRGF0YS0+ZHdTaXplKTsKLSAgICBmaW5kRGF0YS0+ZHdTaXplID0gZHdTaXplOwotICAgIGlmIChibGstPmF0dHJpYiAmIF9BX1JET05MWSkKLQlmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfUkVBRE9OTFk7Ci0gICAgaWYgKGJsay0+YXR0cmliICYgX0FfU1VCRElSKQotCWZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9ESVJFQ1RPUlk7Ci0gICAgaWYgKGJsay0+YXR0cmliICYgX0FfQVJDSCkKLQlmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfQVJDSElWRTsKLSAgICBpZiAoYmxrLT5hdHRyaWIgJiBfQV9ISURERU4pCi0JZmluZERhdGEtPmF0dHJpYiB8PSBQTV9GSUxFX0hJRERFTjsKLSAgICBpZiAoYmxrLT5hdHRyaWIgJiBfQV9TWVNURU0pCi0JZmluZERhdGEtPmF0dHJpYiB8PSBQTV9GSUxFX1NZU1RFTTsKLSAgICBmaW5kRGF0YS0+c2l6ZUxvID0gYmxrLT5zaXplOwotICAgIHN0cm5jcHkoZmluZERhdGEtPm5hbWUsYmxrLT5uYW1lLFBNX01BWF9QQVRIKTsKLSAgICBmaW5kRGF0YS0+bmFtZVtQTV9NQVhfUEFUSC0xXSA9IDA7Ci19Ci0KLSNkZWZpbmUgRklORF9NQVNLICAgKF9BX1JET05MWSB8IF9BX0FSQ0ggfCBfQV9TVUJESVIgfCBfQV9ISURERU4gfCBfQV9TWVNURU0pCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZmluZCB0aGUgZmlyc3QgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fZmluZEZpcnN0RmlsZSgKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICBQTV9maW5kRGF0YSAqZmluZERhdGEpCi17Ci0gICAgc3RydWN0IGZpbmRfdCAqYmxrOwotCi0gICAgaWYgKChibGsgPSBQTV9tYWxsb2Moc2l6ZW9mKCpibGspKSkgPT0gTlVMTCkKLQlyZXR1cm4gUE1fRklMRV9JTlZBTElEOwotICAgIGlmIChfZG9zX2ZpbmRmaXJzdCgoY2hhciopZmlsZW5hbWUsRklORF9NQVNLLGJsaykgPT0gMCkgewotCWNvbnZlcnRGaW5kRGF0YShmaW5kRGF0YSxibGspOwotCXJldHVybiBibGs7Ci0JfQotICAgIHJldHVybiBQTV9GSUxFX0lOVkFMSUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZmluZCB0aGUgbmV4dCBmaWxlIG1hdGNoaW5nIGEgc2VhcmNoIGNyaXRlcmlhIGluIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2ZpbmROZXh0RmlsZSgKLSAgICB2b2lkICpoYW5kbGUsCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhKQotewotICAgIHN0cnVjdCBmaW5kX3QgKmJsayA9IGhhbmRsZTsKLQotICAgIGlmIChfZG9zX2ZpbmRuZXh0KGJsaykgPT0gMCkgewotCWNvbnZlcnRGaW5kRGF0YShmaW5kRGF0YSxibGspOwotCXJldHVybiB0cnVlOwotCX0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gY2xvc2UgdGhlIGZpbmQgcHJvY2VzcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZmluZENsb3NlKAotICAgIHZvaWQgKmhhbmRsZSkKLXsKLSAgICBQTV9mcmVlKGhhbmRsZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIGEgZHJpdmUgaXMgYSB2YWxpZCBkcml2ZSBvciBub3QuIFVuZGVyIFVuaXggdGhpcwotZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UgZm9yIGFueXRoaW5nIGV4Y2VwdCBhIHZhbHVlIG9mIDMgKGNvbnNpZGVyZWQKLXRoZSByb290IGRyaXZlLCBhbmQgZXF1aXZhbGVudCB0byBDOiBmb3Igbm9uLVVuaXggc3lzdGVtcykuIFRoZSBkcml2ZQotbnVtYmVyaW5nIGlzOgotCi0gICAgMSAgIC0gRHJpdmUgQToKLSAgICAyICAgLSBEcml2ZSBCOgotICAgIDMgICAtIERyaXZlIEM6Ci0gICAgZXRjCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9kcml2ZVZhbGlkKAotICAgIGNoYXIgZHJpdmUpCi17Ci0gICAgUk1SRUdTICByZWdzOwotICAgIHJlZ3MuaC5kbCA9ICh1Y2hhcikoZHJpdmUgLSAnQScgKyAxKTsKLSAgICByZWdzLmguYWggPSAweDM2OyAgICAgICAgICAgICAgIC8qIEdldCBkaXNrIGluZm9ybWF0aW9uIHNlcnZpY2UgKi8KLSAgICBQTV9pbnQ4NigweDIxLCZyZWdzLCZyZWdzKTsKLSAgICByZXR1cm4gcmVncy54LmF4ICE9IDB4RkZGRjsgICAgIC8qIEFYID0gMHhGRkZGIGlmIGRpc2sgaXMgaW52YWxpZCAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGdldCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIHNwZWNpZmlmZWQgZHJpdmUuCi1VbmRlciBVbml4IHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHJlZ2FyZGxlc3MKLW9mIHdoYXQgdGhlIHZhbHVlIG9mICdkcml2ZScgaXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9nZXRkY3dkKAotICAgIGludCBkcml2ZSwKLSAgICBjaGFyICpkaXIsCi0gICAgaW50IGxlbikKLXsKLSAgICB1aW50IG9sZERyaXZlLG1heERyaXZlczsKLSAgICBfZG9zX2dldGRyaXZlKCZvbGREcml2ZSk7Ci0gICAgX2Rvc19zZXRkcml2ZShkcml2ZSwmbWF4RHJpdmVzKTsKLSAgICBnZXRjd2QoZGlyLGxlbik7Ci0gICAgX2Rvc19zZXRkcml2ZShvbGREcml2ZSwmbWF4RHJpdmVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjaGFuZ2UgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0RmlsZUF0dHIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgdWludCBhdHRyaWIpCi17Ci0jaWYgZGVmaW5lZChUTlQpICYmIGRlZmluZWQoX01TQ19WRVIpCi0gICAgRFdPUkQgYXR0ciA9IDA7Ci0KLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9SRUFET05MWSkKLQlhdHRyIHw9IEZJTEVfQVRUUklCVVRFX1JFQURPTkxZOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX0FSQ0hJVkUpCi0JYXR0ciB8PSBGSUxFX0FUVFJJQlVURV9BUkNISVZFOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX0hJRERFTikKLQlhdHRyIHw9IEZJTEVfQVRUUklCVVRFX0hJRERFTjsKLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9TWVNURU0pCi0JYXR0ciB8PSBGSUxFX0FUVFJJQlVURV9TWVNURU07Ci0gICAgU2V0RmlsZUF0dHJpYnV0ZXMoKExQU1RSKWZpbGVuYW1lLCBhdHRyKTsKLSNlbHNlCi0gICAgdWludCBhdHRyID0gMDsKLQotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX1JFQURPTkxZKQotCWF0dHIgfD0gX0FfUkRPTkxZOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX0FSQ0hJVkUpCi0JYXR0ciB8PSBfQV9BUkNIOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX0hJRERFTikKLQlhdHRyIHw9IF9BX0hJRERFTjsKLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9TWVNURU0pCi0JYXR0ciB8PSBfQV9TWVNURU07Ci0gICAgX2Rvc19zZXRmaWxlYXR0cihmaWxlbmFtZSxhdHRyKTsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9ta2RpcigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSNpZmRlZiAgX19HTlVDX18KLSAgICByZXR1cm4gbWtkaXIoZmlsZW5hbWUsU19JUlVTUikgPT0gMDsKLSNlbHNlCi0gICAgcmV0dXJuIG1rZGlyKGZpbGVuYW1lKSA9PSAwOwotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gcmVtb3ZlIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX3JtZGlyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIHJldHVybiBybWRpcihmaWxlbmFtZSkgPT0gMDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEdlbmVyaWMgRFBNSSByb3V0aW5lcyBjb21tb24gdG8gMTYvMzIgYml0IGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIFJFQUxNT0RFCi11bG9uZyBQTUFQSSBEUE1JX21hcFBoeXNpY2FsVG9MaW5lYXIodWxvbmcgcGh5c0FkZHIsdWxvbmcgbGltaXQpCi17Ci0gICAgUE1SRUdTICByOwotICAgIGludCAgICAgaTsKLSAgICB1bG9uZyAgIGJhc2VBZGRyLGJhc2VPZnMscm91bmRlZExpbWl0OwotCi0gICAgLyogV2UgY2FuJ3QgbWFwIG1lbW9yeSBiZWxvdyAxTWIsIGJ1dCB0aGUgbGluZWFyIGFkZHJlc3MgYXJlIGFscmVhZHkKLSAgICAgKiBtYXBwZWQgMToxIGZvciB0aGlzIG1lbW9yeSBhbnl3YXkgc28gd2UganVzdCByZXR1cm4gdGhlIGJhc2UgYWRkcmVzcy4KLSAgICAgKi8KLSAgICBpZiAocGh5c0FkZHIgPCAweDEwMDAwMEwpCi0JcmV0dXJuIHBoeXNBZGRyOwotCi0gICAgLyogU2VhcmNoIHRhYmxlIG9mIGV4aXN0aW5nIG1hcHBpbmdzIHRvIHNlZSBpZiB3ZSBoYXZlIGFscmVhZHkgbWFwcGVkCi0gICAgICogYSByZWdpb24gb2YgbWVtb3J5IHRoYXQgd2lsbCBzZXJ2ZSB0aGlzIHB1cnBvc2UuIFdlIGRvIHRoaXMgYmVjYXVzZQotICAgICAqIERQTUkgMC45IGRvZXMgbm90IGFsbG93IHVzIHRvIGZyZWUgcGh5c2ljYWwgbWVtb3J5IG1hcHBpbmdzLCBhbmQgaWYKLSAgICAgKiB0aGUgbWFwcGluZ3MgZ2V0IHJlLXVzZWQgaW4gdGhlIHByb2dyYW0gd2Ugd2FudCB0byBhdm9pZCBhbGxvY2F0aW5nCi0gICAgICogbW9yZSBtYXBwaW5ncyB0aGFuIG5lY2Vzc2FyeS4KLSAgICAgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTWFwczsgaSsrKSB7Ci0JaWYgKG1hcHNbaV0ucGh5c2ljYWwgPT0gcGh5c0FkZHIgJiYgbWFwc1tpXS5saW1pdCA9PSBsaW1pdCkKLQkgICAgcmV0dXJuIG1hcHNbaV0ubGluZWFyOwotCX0KLQotICAgIC8qIEZpbmQgYSBmcmVlIHNsb3QgaW4gb3VyIHBoeXNpY2FsIG1lbW9yeSBtYXBwaW5nIHRhYmxlICovCi0gICAgZm9yIChpID0gMDsgaSA8IG51bU1hcHM7IGkrKykgewotCWlmIChtYXBzW2ldLmxpbWl0ID09IDApCi0JICAgIGJyZWFrOwotCX0KLSAgICBpZiAoaSA9PSBudW1NYXBzKSB7Ci0JaSA9IG51bU1hcHMrKzsKLQlpZiAoaSA9PSBNQVhfTUVNT1JZX01BUFBJTkdTKQotCSAgICByZXR1cm4gTlVMTDsKLQl9Ci0KLSAgICAvKiBSb3VuZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyB0byBhIDRLYiBib3VuZGFyeSBhbmQgdGhlIGxpbWl0IHRvIGEKLSAgICAgKiA0S2ItMSBib3VuZGFyeSBiZWZvcmUgcGFzc2luZyB0aGUgdmFsdWVzIHRvIERQTUkgYXMgc29tZSBleHRlbmRlcnMKLSAgICAgKiB3aWxsIGZhaWwgdGhlIGNhbGxzIHVubGVzcyB0aGlzIGlzIHRoZSBjYXNlLiBJZiB3ZSByb3VuZCB0aGUKLSAgICAgKiBwaHlzaWNhbCBhZGRyZXNzLCB0aGVuIHdlIGFsc28gYWRkIGFuIGV4dHJhIG9mZnNldCBpbnRvIHRoZSBhZGRyZXNzCi0gICAgICogdGhhdCB3ZSByZXR1cm4uCi0gICAgICovCi0gICAgYmFzZU9mcyA9IHBoeXNBZGRyICYgNDA5NTsKLSAgICBiYXNlQWRkciA9IHBoeXNBZGRyICYgfjQwOTU7Ci0gICAgcm91bmRlZExpbWl0ID0gKChsaW1pdCtiYXNlT2ZzKzErNDA5NSkgJiB+NDA5NSktMTsKLSAgICByLnguYXggPSAweDgwMDsKLSAgICByLnguYnggPSBiYXNlQWRkciA+PiAxNjsKLSAgICByLnguY3ggPSBiYXNlQWRkciAmIDB4RkZGRjsKLSAgICByLnguc2kgPSByb3VuZGVkTGltaXQgPj4gMTY7Ci0gICAgci54LmRpID0gcm91bmRlZExpbWl0ICYgMHhGRkZGOwotICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOwotICAgIGlmIChyLnguY2ZsYWcpCi0JcmV0dXJuIDB4RkZGRkZGRkZVTDsKLSAgICBtYXBzW2ldLnBoeXNpY2FsID0gcGh5c0FkZHI7Ci0gICAgbWFwc1tpXS5saW1pdCA9IGxpbWl0OwotICAgIG1hcHNbaV0ubGluZWFyID0gKCh1bG9uZylyLnguYnggPDwgMTYpICsgci54LmN4ICsgYmFzZU9mczsKLSAgICByZXR1cm4gbWFwc1tpXS5saW5lYXI7Ci19Ci0KLWludCBQTUFQSSBEUE1JX3NldFNlbGVjdG9yQmFzZSh1c2hvcnQgc2VsLHVsb25nIGxpbkFkZHIpCi17Ci0gICAgUE1SRUdTICByOwotCi0gICAgci54LmF4ID0gNzsgICAgICAgICAgICAgICAgICAgICAvKiBEUE1JIHNldCBzZWxlY3RvciBiYXNlIGFkZHJlc3MgICAqLwotICAgIHIueC5ieCA9IHNlbDsKLSAgICByLnguY3ggPSBsaW5BZGRyID4+IDE2OwotICAgIHIueC5keCA9IGxpbkFkZHIgJiAweEZGRkY7Ci0gICAgUE1faW50Mzg2KDB4MzEsICZyLCAmcik7Ci0gICAgaWYgKHIueC5jZmxhZykKLQlyZXR1cm4gMDsKLSAgICByZXR1cm4gMTsKLX0KLQotdWxvbmcgUE1BUEkgRFBNSV9nZXRTZWxlY3RvckJhc2UodXNob3J0IHNlbCkKLXsKLSAgICBQTVJFR1MgIHI7Ci0KLSAgICByLnguYXggPSA2OyAgICAgICAgICAgICAgICAgICAgIC8qIERQTUkgZ2V0IHNlbGVjdG9yIGJhc2UgYWRkcmVzcyAgICovCi0gICAgci54LmJ4ID0gc2VsOwotICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOwotICAgIHJldHVybiAoKHVsb25nKXIueC5jeCA8PCAxNikgKyByLnguZHg7Ci19Ci0KLWludCBQTUFQSSBEUE1JX3NldFNlbGVjdG9yTGltaXQodXNob3J0IHNlbCx1bG9uZyBsaW1pdCkKLXsKLSAgICBQTVJFR1MgIHI7Ci0KLSAgICByLnguYXggPSA4OyAgICAgICAgICAgICAgICAgICAgIC8qIERQTUkgc2V0IHNlbGVjdG9yIGxpbWl0ICAgICAgICAgICovCi0gICAgci54LmJ4ID0gc2VsOwotICAgIHIueC5jeCA9IGxpbWl0ID4+IDE2OwotICAgIHIueC5keCA9IGxpbWl0ICYgMHhGRkZGOwotICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOwotICAgIGlmIChyLnguY2ZsYWcpCi0JcmV0dXJuIDA7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXVpbnQgUE1BUEkgRFBNSV9jcmVhdGVTZWxlY3Rvcih1bG9uZyBiYXNlLHVsb25nIGxpbWl0KQotewotICAgIHVpbnQgICAgc2VsOwotICAgIFBNUkVHUyAgcjsKLQotICAgIC8qIEFsbG9jYXRlIDEgZGVzY3JpcHRvciAqLwotICAgIHIueC5heCA9IDA7Ci0gICAgci54LmN4ID0gMTsKLSAgICBQTV9pbnQzODYoMHgzMSwgJnIsICZyKTsKLSAgICBpZiAoci54LmNmbGFnKSByZXR1cm4gMDsKLSAgICBzZWwgPSByLnguYXg7Ci0KLSAgICAvKiBTZXQgdGhlIGRlc2NyaXB0b3IgYWNjZXNzIHJpZ2h0cyAoZm9yIGEgMzIgYml0IHBhZ2UgZ3JhbnVsYXIKLSAgICAgKiBzZWdtZW50KS4KLSAgICAgKi8KLSAgICBpZiAobGltaXQgPj0gMHgxMDAwMEwpIHsKLQlyLnguYXggPSA5OwotCXIueC5ieCA9IHNlbDsKLQlyLnguY3ggPSAweDQwRjM7Ci0JUE1faW50Mzg2KDB4MzEsICZyLCAmcik7Ci0JfQotCi0gICAgLyogTWFwIHBoeXNpY2FsIG1lbW9yeSBhbmQgY3JlYXRlIHNlbGVjdG9yICovCi0gICAgaWYgKChiYXNlID0gRFBNSV9tYXBQaHlzaWNhbFRvTGluZWFyKGJhc2UsbGltaXQpKSA9PSAweEZGRkZGRkZGVUwpCi0JcmV0dXJuIDA7Ci0gICAgaWYgKCFEUE1JX3NldFNlbGVjdG9yQmFzZShzZWwsYmFzZSkpCi0JcmV0dXJuIDA7Ci0gICAgaWYgKCFEUE1JX3NldFNlbGVjdG9yTGltaXQoc2VsLGxpbWl0KSkKLQlyZXR1cm4gMDsKLSAgICByZXR1cm4gc2VsOwotfQotCi12b2lkIFBNQVBJIERQTUlfZnJlZVNlbGVjdG9yKHVpbnQgc2VsKQotewotICAgIFBNUkVHUyAgcjsKLQotICAgIHIueC5heCA9IDE7Ci0gICAgci54LmJ4ID0gc2VsOwotICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOwotfQotCi1pbnQgUE1BUEkgRFBNSV9sb2NrTGluZWFyUGFnZXModWxvbmcgbGluZWFyLHVsb25nIGxlbikKLXsKLSAgICBQTVJFR1MgIHI7Ci0KLSAgICByLnguYXggPSAweDYwMDsgICAgICAgICAgICAgICAgICAgICAvKiBEUE1JIExvY2sgTGluZWFyIFJlZ2lvbiAgICAgICovCi0gICAgci54LmJ4ID0gKGxpbmVhciA+PiAxNik7ICAgICAgICAgICAgLyogTGluZWFyIGFkZHJlc3MgaW4gQlg6Q1ggICAgICAqLwotICAgIHIueC5jeCA9IChsaW5lYXIgJiAweEZGRkYpOwotICAgIHIueC5zaSA9IChsZW4gPj4gMTYpOyAgICAgICAgICAgICAgIC8qIExlbmd0aCBpbiBTSTpESSAgICAgICAgICAgICAgKi8KLSAgICByLnguZGkgPSAobGVuICYgMHhGRkZGKTsKLSAgICBQTV9pbnQzODYoMHgzMSwgJnIsICZyKTsKLSAgICByZXR1cm4gKCFyLnguY2ZsYWcpOwotfQotCi1pbnQgUE1BUEkgRFBNSV91bmxvY2tMaW5lYXJQYWdlcyh1bG9uZyBsaW5lYXIsdWxvbmcgbGVuKQotewotICAgIFBNUkVHUyAgcjsKLQotICAgIHIueC5heCA9IDB4NjAxOyAgICAgICAgICAgICAgICAgICAgIC8qIERQTUkgVW5sb2NrIExpbmVhciBSZWdpb24gICAgKi8KLSAgICByLnguYnggPSAobGluZWFyID4+IDE2KTsgICAgICAgICAgICAvKiBMaW5lYXIgYWRkcmVzcyBpbiBCWDpDWCAgICAgICovCi0gICAgci54LmN4ID0gKGxpbmVhciAmIDB4RkZGRik7Ci0gICAgci54LnNpID0gKGxlbiA+PiAxNik7ICAgICAgICAgICAgICAgLyogTGVuZ3RoIGluIFNJOkRJICAgICAgICAgICAgICAqLwotICAgIHIueC5kaSA9IChsZW4gJiAweEZGRkYpOwotICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOwotICAgIHJldHVybiAoIXIueC5jZmxhZyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWRqdXN0IHRoZSBwYWdlIHRhYmxlIGNhY2hpbmcgYml0cyBkaXJlY3RseS4gUmVxdWlyZXMgcmluZyAwIGFjY2VzcyBhbmQKLW9ubHkgd29ya3Mgd2l0aCBET1M0R1cgYW5kIGNvbXBhdGlibGUgZXh0ZW5kZXJzIChDYXVzZVdheSBhbHNvIHdvcmtzIHNpbmNlCi1pdCBoYXMgZGlyZWN0IHN1cHBvcnQgZm9yIHRoZSByaW5nIDAgaW5zdHJ1Y3Rpb25zIHdlIG5lZWQgZnJvbSByaW5nIDMpLiBXaWxsCi1ub3Qgd29yayBpbiBhIERPUyBib3gsIGJ1dCB3ZSBjYWxsIGludG8gdGhlIHJpbmcgMCBoZWxwZXIgVnhEIHNvIHdlIHNob3VsZAotbmV2ZXIgZ2V0IGhlcmUgaW4gYSBET1MgYm94IGFueXdheSAoYXNzdW1pbmcgdGhlIFZ4RCBpcyBwcmVzZW50KS4gSWYgd2UKLWRvIGdldCBoZXJlIGFuZCB3ZSBhcmUgaW4gd2luZG93cywgdGhpcyBjb2RlIHdpbGwgYmUgc2tpcHBlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBQTV9hZGp1c3RQYWdlVGFibGVzKAotICAgIHVsb25nIGxpbmVhciwKLSAgICB1bG9uZyBsaW1pdCwKLSAgICBpYm9vbCBpc0NhY2hlZCkKLXsKLSNpZmRlZiAgRE9TNEdXCi0gICAgaW50ICAgICBzdGFydFBEQixlbmRQREIsaVBEQixzdGFydFBhZ2UsZW5kUGFnZSxzdGFydCxlbmQsaVBhZ2U7Ci0gICAgdWxvbmcgICBhbmRNYXNrLG9yTWFzayxwYWdlVGFibGUsKnBQYWdlVGFibGU7Ci0KLSAgICBhbmRNYXNrID0gfjB4MTg7Ci0gICAgb3JNYXNrID0gKGlzQ2FjaGVkKSA/IDB4MDAgOiAweDE4OwotICAgIGlmIChfUE1fcGFnaW5nRW5hYmxlZCgpID09IDEgJiYgKFBEQiA9IF9QTV9nZXRQREIoKSkgIT0gMCkgewotCWlmIChfUE1faGF2ZUNhdXNlV2F5KSB7Ci0JICAgIC8qIENhdXNlV2F5IGlzIGEgbGl0dGxlIGRpZmZlcmVudCBpbiB0aGUgcGFnZSB0YWJsZSBoYW5kbGluZy4KLQkgICAgICogVGhlIGNvZGUgdGhhdCB3ZSB1c2UgZm9yIERPUzRHL1cgZG9lcyBub3QgYXBwZWFyIHRvIHdvcmsKLQkgICAgICogd2l0aCBDYXVzZVdheSBjb3JyZWN0bHkgYXMgaXQgZG9lcyBub3QgYXBwZWFyIHRvIGFsbG93IHVzCi0JICAgICAqIHRvIG1hcCB0aGUgcGFnZSB0YWJsZXMgZGlyZWN0bHkuIEluc3RlYWQgd2UgY2FuIGRpcmVjdGx5Ci0JICAgICAqIGFjY2VzcyB0aGUgcGFnZSB0YWJsZSBlbnRyaWVzIGluIGV4dGVuZGVkIG1lbW9yeSB3aGVyZQotCSAgICAgKiBDYXVzZVdheSBhbHdheXMgbG9jYXRlcyB0aGVtIChzdGFydGluZyBhdCAxMDI0KjQwOTYqMTAyMykKLQkgICAgICovCi0JICAgIHN0YXJ0UGFnZSA9IChsaW5lYXIgPj4gMTIpOwotCSAgICBlbmRQYWdlID0gKChsaW5lYXIrbGltaXQpID4+IDEyKTsKLQkgICAgcFBhZ2VUYWJsZSA9ICh1bG9uZyopQ1dfUEFHRV9UQUJMRV9TVEFSVDsKLQkgICAgZm9yIChpUGFnZSA9IHN0YXJ0UGFnZTsgaVBhZ2UgPD0gZW5kUGFnZTsgaVBhZ2UrKykKLQkJcFBhZ2VUYWJsZVtpUGFnZV0gPSAocFBhZ2VUYWJsZVtpUGFnZV0gJiBhbmRNYXNrKSB8IG9yTWFzazsKLQkgICAgfQotCWVsc2UgewotCSAgICBwUERCID0gKHVsb25nKilEUE1JX21hcFBoeXNpY2FsVG9MaW5lYXIoUERCLDB4RkZGKTsKLQkgICAgaWYgKHBQREIpIHsKLQkJc3RhcnRQREIgPSAobGluZWFyID4+IDIyKSAmIDB4M0ZGOwotCQlzdGFydFBhZ2UgPSAobGluZWFyID4+IDEyKSAmIDB4M0ZGOwotCQllbmRQREIgPSAoKGxpbmVhcitsaW1pdCkgPj4gMjIpICYgMHgzRkY7Ci0JCWVuZFBhZ2UgPSAoKGxpbmVhcitsaW1pdCkgPj4gMTIpICYgMHgzRkY7Ci0JCWZvciAoaVBEQiA9IHN0YXJ0UERCOyBpUERCIDw9IGVuZFBEQjsgaVBEQisrKSB7Ci0JCSAgICBwYWdlVGFibGUgPSBwUERCW2lQREJdICYgfjB4RkZGOwotCQkgICAgcFBhZ2VUYWJsZSA9ICh1bG9uZyopRFBNSV9tYXBQaHlzaWNhbFRvTGluZWFyKHBhZ2VUYWJsZSwweEZGRik7Ci0JCSAgICBzdGFydCA9IChpUERCID09IHN0YXJ0UERCKSA/IHN0YXJ0UGFnZSA6IDA7Ci0JCSAgICBlbmQgPSAoaVBEQiA9PSBlbmRQREIpID8gZW5kUGFnZSA6IDB4M0ZGOwotCQkgICAgZm9yIChpUGFnZSA9IHN0YXJ0OyBpUGFnZSA8PSBlbmQ7IGlQYWdlKyspCi0JCQlwUGFnZVRhYmxlW2lQYWdlXSA9IChwUGFnZVRhYmxlW2lQYWdlXSAmIGFuZE1hc2spIHwgb3JNYXNrOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQlQTV9mbHVzaFRMQigpOwotCX0KLSNlbmRpZgotfQotCi12b2lkICogUE1BUEkgRFBNSV9tYXBQaHlzaWNhbEFkZHIodWxvbmcgYmFzZSx1bG9uZyBsaW1pdCxpYm9vbCBpc0NhY2hlZCkKLXsKLSAgICBQTVNSRUdTICAgICBzcmVnczsKLSAgICB1bG9uZyAgICAgICBsaW5BZGRyOwotICAgIHVsb25nICAgICAgIERTQmFzZUFkZHI7Ci0KLSAgICAvKiBHZXQgdGhlIGJhc2UgYWRkcmVzcyBmb3IgdGhlIGRlZmF1bHQgRFMgc2VsZWN0b3IgKi8KLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0gICAgRFNCYXNlQWRkciA9IERQTUlfZ2V0U2VsZWN0b3JCYXNlKHNyZWdzLmRzKTsKLSAgICBpZiAoKGJhc2UgPCAweDEwMDAwMCkgJiYgKERTQmFzZUFkZHIgPT0gMCkpIHsKLQkvKiBEUyBpcyB6ZXJvIGJhc2VkLCBzbyB3ZSBjYW4gZGlyZWN0bHkgYWNjZXNzIHRoZSBmaXJzdCAxTWIgb2YKLQkgKiBzeXN0ZW0gbWVtb3J5IChsaWtlIHVuZGVyIERPUzRHVykuCi0JICovCi0JcmV0dXJuICh2b2lkKiliYXNlOwotCX0KLQotICAgIC8qIE1hcCB0aGUgbWVtb3J5IHRvIGEgbGluZWFyIGFkZHJlc3MgdXNpbmcgRFBNSSBmdW5jdGlvbiAweDgwMCAqLwotICAgIGlmICgobGluQWRkciA9IERQTUlfbWFwUGh5c2ljYWxUb0xpbmVhcihiYXNlLGxpbWl0KSkgPT0gMHhGRkZGRkZGRikgewotCWlmIChiYXNlID49IDB4MTAwMDAwKQotCSAgICByZXR1cm4gTlVMTDsKLQkvKiBJZiB0aGUgbGluZWFyIGFkZHJlc3MgbWFwcGluZyBmYWlscyBidXQgd2UgYXJlIHRyeWluZyB0bwotCSAqIG1hcCBhbiBhcmVhIGluIHRoZSBmaXJzdCAxTWIgb2Ygc3lzdGVtIG1lbW9yeSwgdGhlbiB3ZSBtdXN0Ci0JICogYmUgcnVubmluZyB1bmRlciBhIFdpbmRvd3Mgb3IgT1MvMiBET1MgYm94LiBVbmRlciB0aGVzZQotCSAqIGVudmlyb25tZW50cyB3ZSBjYW4gdXNlIHRoZSBzZWdtZW50IHdyYXAgYXJvdW5kIGFzIGEgZmFsbGJhY2sKLQkgKiBtZWFzdXJlLCBhcyB0aGlzIGRvZXMgd29yayBwcm9wZXJseS4KLQkgKi8KLQlsaW5BZGRyID0gYmFzZTsKLQl9Ci0KLSAgICAvKiBOb3cgZXhwYW5kIHRoZSBkZWZhdWx0IERTIHNlbGVjdG9yIHRvIDRHYiBzbyB3ZSBjYW4gYWNjZXNzIGl0ICovCi0gICAgaWYgKCFEUE1JX3NldFNlbGVjdG9yTGltaXQoc3JlZ3MuZHMsMHhGRkZGRkZGRlVMKSkKLQlyZXR1cm4gTlVMTDsKLQotICAgIC8qIEZpbmFsbHkgZW5hYmxlIGNhY2hpbmcgZm9yIHRoZSBwYWdlIHRhYmxlcyB0aGF0IHdlIGp1c3QgbWFwcGVkIGluLAotICAgICAqIHNpbmNlIERPUzRHVyBhbmQgUE1PREUvVyBjcmVhdGUgdGhlIHBhZ2UgdGFibGUgZW50cmllcyB3aXRob3V0Ci0gICAgICogY2FjaGluZyBlbmFibGVkIHdoaWNoIGh1cnRzIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgbGluZWFyIGZyYW1lYnVmZmVyCi0gICAgICogYXMgaXQgZGlzYWJsZXMgd3JpdGUgY29tYmluaW5nIG9uIFBlbnRpdW0gUHJvIGFuZCBhYm92ZSBwcm9jZXNzb3JzLgotICAgICAqCi0gICAgICogRm9yIHRob3NlIHByb2Nlc3NvcnMgY2FjaGUgZGlzYWJsaW5nIGlzIGJldHRlciBoYW5kbGVkIHRocm91Z2ggdGhlCi0gICAgICogTVRSUiByZWdpc3RlcnMgYW55d2F5ICh3ZSBjYW4gd3JpdGUgY29tYmluZSBhIHJlZ2lvbiBidXQgZGlzYWJsZQotICAgICAqIGNhY2hpbmcpIHNvIHRoYXQgTU1JTyByZWdpc3RlciByZWdpb25zIGRvIG5vdCBzY3JldyB1cC4KLSAgICAgKi8KLSAgICBpZiAoRFNCYXNlQWRkciA9PSAwKQotCVBNX2FkanVzdFBhZ2VUYWJsZXMobGluQWRkcixsaW1pdCxpc0NhY2hlZCk7Ci0KLSAgICAvKiBOb3cgcmV0dXJuIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSBpbnRvIHRoZSBkZWZhdWx0IERTICovCi0gICAgcmV0dXJuICh2b2lkKikobGluQWRkciAtIERTQmFzZUFkZHIpOwotfQotCi0jaWYgZGVmaW5lZChQTTM4NikKLQotLyogU29tZSBET1MgZXh0ZW5kZXIgaW1wbGVtZW50YXRpb25zIGRvIG5vdCBkaXJlY3RseSBzdXBwb3J0IGNhbGxpbmcgYQotICogcmVhbCBtb2RlIHByb2NlZHVyZSBmcm9tIHByb3RlY3RlZCBtb2RlLiBIb3dldmVyIHdlIGNhbiBzaW11bGF0ZSB3aGF0Ci0gKiB3ZSBuZWVkIHRlbXBvcmFyaWx5IGhvb2tpbmcgdGhlIElOVCA2QWggdmVjdG9yIHdpdGggYSBzbWFsbCByZWFsIG1vZGUKLSAqIHN0dWIgdGhhdCB3aWxsIGNhbGwgb3VyIHJlYWwgbW9kZSBjb2RlIGZvciB1cy4KLSAqLwotCi1zdGF0aWMgdWNoYXIgaW50NkFIYW5kbGVyW10gPSB7Ci0gICAgMHgwMCwweDAwLDB4MDAsMHgwMCwgICAgICAgIC8qICBfX1BNT0RFX2NhbGxSZWFsIHZhcmlhYmxlICAgICAgICAgICAqLwotICAgIDB4RkIsICAgICAgICAgICAgICAgICAgICAgICAvKiAgc3RpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAweDJFLDB4RkYsMHgxRSwweDAwLDB4MDAsICAgLyogIGNhbGwgICAgW2NzOl9fUE1PREVfY2FsbFJlYWxdICAgICAgICovCi0gICAgMHhDRiwgICAgICAgICAgICAgICAgICAgICAgIC8qICBpcmV0ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIH07Ci1zdGF0aWMgdWNoYXIgKmNyUHRyID0gTlVMTDsgLyogUG9pbnRlciB0byBvZiBpbnQgNkEgaGFuZGxlciAgICAgICAgICovCi1zdGF0aWMgdWludCBjclJTZWcsY3JST2ZmOyAgLyogUmVhbCBtb2RlIHNlZzpvZmZzZXQgb2YgaGFuZGxlciAgICAgICovCi0KLXZvaWQgUE1BUEkgUE1fY2FsbFJlYWxNb2RlKHVpbnQgc2VnLHVpbnQgb2ZmLCBSTVJFR1MgKmluLAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIHVjaGFyICAgKnA7Ci0gICAgdWludCAgICBvbGRTZWcsb2xkT2ZmOwotCi0gICAgaWYgKCFjclB0cikgewotCS8qIEFsbG9jYXRlIGFuZCBjb3B5IHRoZSBtZW1vcnkgYmxvY2sgb25seSBvbmNlICovCi0JY3JQdHIgPSBQTV9hbGxvY1JlYWxTZWcoc2l6ZW9mKGludDZBSGFuZGxlciksICZjclJTZWcsICZjclJPZmYpOwotCW1lbWNweShjclB0cixpbnQ2QUhhbmRsZXIsc2l6ZW9mKGludDZBSGFuZGxlcikpOwotCX0KLSAgICBQTV9zZXRXb3JkKGNyUHRyLG9mZik7ICAgICAgICAgICAgICAvKiBQbHVnIGluIGFkZHJlc3MgdG8gY2FsbCAgKi8KLSAgICBQTV9zZXRXb3JkKGNyUHRyKzIsc2VnKTsKLSAgICBwID0gUE1fbWFwUmVhbFBvaW50ZXIoMCwweDZBICogNCk7Ci0gICAgb2xkT2ZmID0gUE1fZ2V0V29yZChwKTsgICAgICAgICAgICAgLyogU2F2ZSBvbGQgaGFuZGxlciBhZGRyZXNzICovCi0gICAgb2xkU2VnID0gUE1fZ2V0V29yZChwKzIpOwotICAgIFBNX3NldFdvcmQocCxjclJPZmYrNCk7ICAgICAgICAgICAgIC8qIEhvb2sgNkEgaGFuZGxlciAgICAgICAgICAqLwotICAgIFBNX3NldFdvcmQocCsyLGNyUlNlZyk7Ci0gICAgUE1faW50ODZ4KDB4NkEsIGluLCBpbiwgc3JlZ3MpOyAgICAgLyogQ2FsbCByZWFsIG1vZGUgY29kZSAgICAgICovCi0gICAgUE1fc2V0V29yZChwLG9sZE9mZik7ICAgICAgICAgICAgICAgLyogUmVzdG9yZSBvbGQgaGFuZGxlciAgICAgICovCi0gICAgUE1fc2V0V29yZChwKzIsb2xkU2VnKTsKLX0KLQotI2VuZGlmICAvKiBQTTM4NiAqLwotCi0jZW5kaWYgIC8qICFSRUFMTU9ERSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlcyBhIGJsb2NrIG9mIGxvY2tlZCwgcGh5c2ljYWxseSBjb250aWd1b3VzIG1lbW9yeS4gVGhlIG1lbW9yeQotbWF5IGJlIHJlcXVpcmVkIHRvIGJlIGJlbG93IHRoZSAxNk1lZyBib3VuZGFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fYWxsb2NMb2NrZWRNZW0oCi0gICAgdWludCBzaXplLAotICAgIHVsb25nICpwaHlzQWRkciwKLSAgICBpYm9vbCBjb250aWd1b3VzLAotICAgIGlib29sIGJlbG93MTZNZWcpCi17Ci0gICAgdWNoYXIgICAgICAgICAgICpwLCpyb3VuZGVkUDsKLSAgICB1aW50ICAgICAgICAgICAgcl9zZWcscl9vZmY7Ci0gICAgdWludCAgICAgICAgICAgIHJvdW5kZWRTaXplID0gKHNpemUgKyA0ICsgMHhGRkYpICYgfjB4RkZGOwotICAgIFBNX2xvY2tIYW5kbGUgICBsaDsgLyogVW51c2VkIGluIERPUyAqLwotI2lmbmRlZiBSRUFMTU9ERQotICAgIFZYRF9yZWdzICAgICAgICByZWdzOwotCi0gICAgLyogSWYgd2UgaGF2ZSBjb25uZWN0ZWQgdG8gb3VyIGhlbHBlciBWeEQgaW4gYSBXaW5kb3dzIERPUyBib3gsIHVzZSB0aGUKLSAgICAgKiBoZWxwZXIgVnhEIHNlcnZpY2VzIHRvIGFsbG9jYXRlIHRoZSBtZW1vcnkgdGhhdCB3ZSBuZWVkLgotICAgICAqLwotICAgIGlmIChWWERfdmVyc2lvbikgewotCW1lbXNldCgmcmVncywwLHNpemVvZihyZWdzKSk7Ci0JcmVncy5lYXggPSBBUElfTlVNKFBNSEVMUF9BTExPQ0xPQ0tFRCk7Ci0JcmVncy5lYnggPSBzaXplOwotCXJlZ3MuZWN4ID0gKHVsb25nKXBoeXNBZGRyOwotCXJlZ3MuZWR4ID0gY29udGlndW91cyB8IChiZWxvdzE2TWVnIDw8IDgpOwotCV9QTV9WeERDYWxsKCZyZWdzLF9QTV9WWERfb2ZmLF9QTV9WWERfc2VsKTsKLQlyZXR1cm4gKHZvaWQqKXJlZ3MuZWF4OwotCX0KLQotICAgIC8qIElmIHRoZSBtZW1vcnkgaXMgbm90IGNvbnRpZ3VvdXMsIHdlIHNpbXBseSBuZWVkIHRvIGFsbG9jYXRlIGl0Ci0gICAgICogdXNpbmcgcmVndWxhciBtZW1vcnkgYWxsb2NhdGlvbiBzZXJ2aWNlcywgYW5kIGxvY2sgaXQgZG93bgotICAgICAqIGluIG1lbW9yeS4KLSAgICAgKgotICAgICAqIEZvciBjb250aWd1b3VzIG1lbW9yeSBibG9ja3MsIHRoZSBvbmx5IHdheSB0byBndWFyYW50ZWUgY29udGlndW91cyBwaHlzaWNhbAotICAgICAqIG1lbW9yeSBhZGRyZXNzZXMgdW5kZXIgRE9TIGlzIHRvIGFsbG9jYXRlIHRoZSBtZW1vcnkgYmVsb3cgdGhlCi0gICAgICogMU1lZyBib3VuZGFyeSBhcyByZWFsIG1vZGUgbWVtb3J5LgotICAgICAqCi0gICAgICogTm90ZSB0aGF0IHdlIG11c3QgcGFnZSBhbGlnbiB0aGUgbWVtb3J5IGJsb2NrLCBhbmQgd2UgYWxzbyBtdXN0Ci0gICAgICoga2VlcCB0cmFjayBvZiB0aGUgbm9uLWFsaWduZWQgcG9pbnRlciBzbyB3ZSBjYW4gcHJvcGVybHkgZnJlZQotICAgICAqIGl0IGxhdGVyLiBIZW5jZSB3ZSBhY3R1YWxseSBhbGxvY2F0ZSA0IGJ5dGVzIG1vcmUgdGhhbiB0aGUKLSAgICAgKiBzaXplIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgNEsgYm91bmRhcnkuCi0gICAgICovCi0gICAgaWYgKCFjb250aWd1b3VzKQotCXAgPSBQTV9tYWxsb2Mocm91bmRlZFNpemUpOwotICAgIGVsc2UKLSNlbmRpZgotCXAgPSBQTV9hbGxvY1JlYWxTZWcocm91bmRlZFNpemUsJnJfc2VnLCZyX29mZik7Ci0gICAgaWYgKHAgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLSAgICByb3VuZGVkUCA9ICh2b2lkKikoKCh1bG9uZylwICsgMHhGRkYpICYgfjB4RkZGKTsKLSAgICAqKCh1bG9uZyopKHJvdW5kZWRQICsgc2l6ZSkpID0gKHVsb25nKXA7Ci0gICAgUE1fbG9ja0RhdGFQYWdlcyhyb3VuZGVkUCxzaXplLCZsaCk7Ci0gICAgaWYgKCgqcGh5c0FkZHIgPSBQTV9nZXRQaHlzaWNhbEFkZHIocm91bmRlZFApKSA9PSAweEZGRkZGRkZGKSB7Ci0JUE1fZnJlZUxvY2tlZE1lbShyb3VuZGVkUCxzaXplLGNvbnRpZ3VvdXMpOwotCXJldHVybiBOVUxMOwotCX0KLQotICAgIC8qIERpc2FibGUgY2FjaGluZyBmb3IgdGhlIG1lbW9yeSBzaW5jZSBpdCBpcyBwcm9iYWJseSBhIERNQSBidWZmZXIgKi8KLSNpZm5kZWYgUkVBTE1PREUKLSAgICBQTV9hZGp1c3RQYWdlVGFibGVzKCh1bG9uZylyb3VuZGVkUCxzaXplLTEsZmFsc2UpOwotI2VuZGlmCi0gICAgcmV0dXJuIHJvdW5kZWRQOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZyZWUgYSBibG9jayBvZiBsb2NrZWQgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZUxvY2tlZE1lbSh2b2lkICpwLHVpbnQgc2l6ZSxpYm9vbCBjb250aWd1b3VzKQotewotI2lmbmRlZiBSRUFMTU9ERQotICAgIFZYRF9yZWdzICAgICAgICByZWdzOwotICAgIFBNX2xvY2tIYW5kbGUgICBsaDsgLyogVW51c2VkIGluIERPUyAqLwotCi0gICAgaWYgKCFwKQotCXJldHVybjsKLSAgICBpZiAoVlhEX3ZlcnNpb24pIHsKLQltZW1zZXQoJnJlZ3MsMCxzaXplb2YocmVncykpOwotCXJlZ3MuZWF4ID0gQVBJX05VTShQTUhFTFBfRlJFRUxPQ0tFRCk7Ci0JcmVncy5lYnggPSAodWxvbmcpcDsKLQlyZWdzLmVjeCA9IHNpemU7Ci0JcmVncy5lZHggPSBjb250aWd1b3VzOwotCV9QTV9WeERDYWxsKCZyZWdzLF9QTV9WWERfb2ZmLF9QTV9WWERfc2VsKTsKLQlyZXR1cm47Ci0JfQotICAgIFBNX3VubG9ja0RhdGFQYWdlcyhwLHNpemUsJmxoKTsKLSAgICBpZiAoIWNvbnRpZ3VvdXMpCi0JZnJlZSgqKCh2b2lkKiopKCh1Y2hhciopcCArIHNpemUpKSk7Ci0gICAgZWxzZQotI2VuZGlmCi0JUE1fZnJlZVJlYWxTZWcoKigodm9pZCoqKSgoY2hhciopcCArIHNpemUpKSk7Ci19Ci0KLSNpZm5kZWYgUkVBTE1PREUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGVzIGEgbmV3IGJsb2NrIG9mIHBhZ2VzIGZvciB0aGUgcGFnZSBibG9jayBtYW5hZ2VyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBwYWdlYmxvY2sgKlBNX2FkZE5ld1BhZ2VCbG9jayh2b2lkKQotewotICAgIGludCAgICAgICAgIGksc2l6ZTsKLSAgICBwYWdlYmxvY2sgICAqbmV3QmxvY2s7Ci0gICAgY2hhciAgICAgICAgKnAsKm5leHQ7Ci0KLSAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBuZXcgcGFnZSBibG9jaywgYW5kIGFkZCB0byBoZWFkIG9mIGxpc3QgKi8KLSAgICBzaXplID0gUEFHRVNfUEVSX0JMT0NLICogUE1fUEFHRV9TSVpFICsgKFBNX1BBR0VfU0laRS0xKSArIHNpemVvZihwYWdlYmxvY2spOwotICAgIGlmICgobmV3QmxvY2sgPSBQTV9tYWxsb2Moc2l6ZSkpID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0gICAgbmV3QmxvY2stPnByZXYgPSBOVUxMOwotICAgIG5ld0Jsb2NrLT5uZXh0ID0gcGFnZUJsb2NrczsKLSAgICBpZiAocGFnZUJsb2NrcykKLQlwYWdlQmxvY2tzLT5wcmV2ID0gbmV3QmxvY2s7Ci0gICAgcGFnZUJsb2NrcyA9IG5ld0Jsb2NrOwotCi0gICAgLyogSW5pdGlhbGlzZSB0aGUgcGFnZSBhbGlnbmVkIGZyZWUgbGlzdCBmb3IgdGhlIHBhZ2UgYmxvY2sgKi8KLSAgICBuZXdCbG9jay0+ZnJlZUNvdW50ID0gUEFHRVNfUEVSX0JMT0NLOwotICAgIG5ld0Jsb2NrLT5mcmVlTGlzdCA9IHAgPSAoY2hhciopKCgodWxvbmcpKG5ld0Jsb2NrICsgMSkgKyAoUE1fUEFHRV9TSVpFLTEpKSAmIH4oUE1fUEFHRV9TSVpFLTEpKTsKLSAgICBuZXdCbG9jay0+ZnJlZUxpc3RTdGFydCA9IG5ld0Jsb2NrLT5mcmVlTGlzdDsKLSAgICBuZXdCbG9jay0+ZnJlZUxpc3RFbmQgPSBwICsgKFBBR0VTX1BFUl9CTE9DSy0xKSAqIFBNX1BBR0VfU0laRTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgUEFHRVNfUEVSX0JMT0NLOyBpKysscCA9IG5leHQpCi0JRlJFRUxJU1RfTkVYVChwKSA9IG5leHQgPSBwICsgUE1fUEFHRV9TSVpFOwotICAgIEZSRUVMSVNUX05FWFQocCAtIFBNX1BBR0VfU0laRSkgPSBOVUxMOwotICAgIHJldHVybiBuZXdCbG9jazsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlcyBhIHBhZ2UgYWxpZ25lZCBhbmQgcGFnZSBzaXplZCBibG9jayBvZiBtZW1vcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fYWxsb2NQYWdlKAotICAgIGlib29sIGxvY2tlZCkKLXsKLSNpZm5kZWYgUkVBTE1PREUKLSAgICBWWERfcmVncyAgICAgICAgcmVnczsKLSAgICBwYWdlYmxvY2sgICAgICAgKmJsb2NrOwotICAgIHZvaWQgICAgICAgICAgICAqcDsKLSAgICBQTV9sb2NrSGFuZGxlICAgbGg7IC8qIFVudXNlZCBpbiBET1MgKi8KLQotICAgIC8qIENhbGwgdGhlIGhlbHBlciBWeEQgZm9yIHRoaXMgc2VydmljZSBpZiB3ZSBhcmUgcnVubmluZyBpbiBhIERPUyBib3ggKi8KLSAgICBpZiAoVlhEX3ZlcnNpb24pIHsKLQltZW1zZXQoJnJlZ3MsMCxzaXplb2YocmVncykpOwotCXJlZ3MuZWF4ID0gQVBJX05VTShQTUhFTFBfQUxMT0NQQUdFKTsKLQlyZWdzLmVieCA9IGxvY2tlZDsKLQlfUE1fVnhEQ2FsbCgmcmVncyxfUE1fVlhEX29mZixfUE1fVlhEX3NlbCk7Ci0JcmV0dXJuICh2b2lkKilyZWdzLmVheDsKLQl9Ci0KLSAgICAvKiBTY2FuIHRoZSBibG9jayBsaXN0IGxvb2tpbmcgZm9yIGFueSBmcmVlIGJsb2Nrcy4gQWxsb2NhdGUgYSBuZXcKLSAgICAgKiBwYWdlIGJsb2NrIGlmIG5vIGZyZWUgYmxvY2tzIGFyZSBmb3VuZC4KLSAgICAgKi8KLSAgICBmb3IgKGJsb2NrID0gcGFnZUJsb2NrczsgYmxvY2sgIT0gTlVMTDsgYmxvY2sgPSBibG9jay0+bmV4dCkgewotCWlmIChibG9jay0+ZnJlZUNvdW50KQotCSAgICBicmVhazsKLQl9Ci0gICAgaWYgKGJsb2NrID09IE5VTEwgJiYgKGJsb2NrID0gUE1fYWRkTmV3UGFnZUJsb2NrKCkpID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0gICAgYmxvY2stPmZyZWVDb3VudC0tOwotICAgIHAgPSBibG9jay0+ZnJlZUxpc3Q7Ci0gICAgYmxvY2stPmZyZWVMaXN0ID0gRlJFRUxJU1RfTkVYVChwKTsKLSAgICBpZiAobG9ja2VkKQotCVBNX2xvY2tEYXRhUGFnZXMocCxQTV9QQUdFX1NJWkUsJmxoKTsKLSAgICByZXR1cm4gcDsKLSNlbHNlCi0gICAgcmV0dXJuIE5VTEw7Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgcGFnZSBhbGlnbmVkIGFuZCBwYWdlIHNpemVkIGJsb2NrIG9mIG1lbW9yeQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZVBhZ2UoCi0gICAgdm9pZCAqcCkKLXsKLSNpZm5kZWYgUkVBTE1PREUKLSAgICBWWERfcmVncyAgICByZWdzOwotICAgIHBhZ2VibG9jayAgICpibG9jazsKLQotICAgIC8qIENhbGwgdGhlIGhlbHBlciBWeEQgZm9yIHRoaXMgc2VydmljZSBpZiB3ZSBhcmUgcnVubmluZyBpbiBhIERPUyBib3ggKi8KLSAgICBpZiAoVlhEX3ZlcnNpb24pIHsKLQltZW1zZXQoJnJlZ3MsMCxzaXplb2YocmVncykpOwotCXJlZ3MuZWF4ID0gQVBJX05VTShQTUhFTFBfRlJFRVBBR0UpOwotCXJlZ3MuZWJ4ID0gKHVsb25nKXA7Ci0JX1BNX1Z4RENhbGwoJnJlZ3MsX1BNX1ZYRF9vZmYsX1BNX1ZYRF9zZWwpOwotCXJldHVybjsKLQl9Ci0KLSAgICAvKiBGaXJzdCBmaW5kIHRoZSBwYWdlIGJsb2NrIHRoYXQgdGhpcyBwYWdlIGJlbG9uZ3MgdG8gKi8KLSAgICBmb3IgKGJsb2NrID0gcGFnZUJsb2NrczsgYmxvY2sgIT0gTlVMTDsgYmxvY2sgPSBibG9jay0+bmV4dCkgewotCWlmIChwID49IGJsb2NrLT5mcmVlTGlzdFN0YXJ0ICYmIHAgPD0gYmxvY2stPmZyZWVMaXN0RW5kKQotCSAgICBicmVhazsKLQl9Ci0gICAgQ0hFQ0soYmxvY2sgIT0gTlVMTCk7Ci0KLSAgICAvKiBOb3cgZnJlZSB0aGUgYmxvY2sgYnkgYWRkaW5nIGl0IHRvIHRoZSBmcmVlIGxpc3QgKi8KLSAgICBGUkVFTElTVF9ORVhUKHApID0gYmxvY2stPmZyZWVMaXN0OwotICAgIGJsb2NrLT5mcmVlTGlzdCA9IHA7Ci0gICAgaWYgKCsrYmxvY2stPmZyZWVDb3VudCA9PSBQQUdFU19QRVJfQkxPQ0spIHsKLQkvKiBJZiBhbGwgcGFnZXMgaW4gdGhlIHBhZ2UgYmxvY2sgYXJlIG5vdyBmcmVlLCBmcmVlIHRoZSBlbnRpcmUKLQkgKiBwYWdlIGJsb2NrIGl0c2VsZi4KLQkgKi8KLQlpZiAoYmxvY2sgPT0gcGFnZUJsb2NrcykgewotCSAgICAvKiBEZWxldGUgZnJvbSBoZWFkICovCi0JICAgIHBhZ2VCbG9ja3MgPSBibG9jay0+bmV4dDsKLQkgICAgaWYgKGJsb2NrLT5uZXh0KQotCQlibG9jay0+bmV4dC0+cHJldiA9IE5VTEw7Ci0JICAgIH0KLQllbHNlIHsKLQkgICAgLyogRGVsZXRlIGZyb20gbWlkZGxlIG9mIGxpc3QgKi8KLQkgICAgQ0hFQ0soYmxvY2stPnByZXYgIT0gTlVMTCk7Ci0JICAgIGJsb2NrLT5wcmV2LT5uZXh0ID0gYmxvY2stPm5leHQ7Ci0JICAgIGlmIChibG9jay0+bmV4dCkKLQkJYmxvY2stPm5leHQtPnByZXYgPSBibG9jay0+cHJldjsKLQkgICAgfQotCVBNX2ZyZWUoYmxvY2spOwotCX0KLSNlbHNlCi0gICAgKHZvaWQpcDsKLSNlbmRpZgotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRE9TIFJlYWwgTW9kZSBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiBSRUFMTU9ERQotCi0jaWZuZGVmIE1LX0ZQCi0jZGVmaW5lIE1LX0ZQKHMsbykgICggKHZvaWQgZmFyICopKCAoKHVsb25nKShzKSA8PCAxNikgKyBcCi0JCSAgICAodWxvbmcpKG8pICkpCi0jZW5kaWYKLQotdm9pZCAqIFBNQVBJIFBNX21hcFJlYWxQb2ludGVyKHVpbnQgcl9zZWcsdWludCByX29mZikKLXsgcmV0dXJuIE1LX0ZQKHJfc2VnLHJfb2ZmKTsgfQotCi12b2lkICogUE1BUEkgUE1fZ2V0QklPU1BvaW50ZXIodm9pZCkKLXsKLSAgICByZXR1cm4gTUtfRlAoMHg0MCwwKTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2dldEEwMDAwUG9pbnRlcih2b2lkKQotewotICAgIHJldHVybiBNS19GUCgweEEwMDAsMCk7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9tYXBQaHlzaWNhbEFkZHIodWxvbmcgYmFzZSx1bG9uZyBsaW1pdCxpYm9vbCBpc0NhY2hlZCkKLXsKLSAgICB1aW50IHNlbCA9IGJhc2UgPj4gNDsKLSAgICB1aW50IG9mZiA9IGJhc2UgJiAweEY7Ci0gICAgbGltaXQgPSBsaW1pdDsKLSAgICByZXR1cm4gTUtfRlAoc2VsLG9mZik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZVBoeXNpY2FsQWRkcih2b2lkICpwdHIsdWxvbmcgbGltaXQpCi17IHB0ciA9IHB0cjsgfQotCi11bG9uZyBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHIodm9pZCAqcCkKLXsKLSAgICByZXR1cm4gKCgoKHVsb25nKXAgPj4gMTYpIDw8IDQpICsgKHVzaG9ydClwKTsKLX0KLQotaWJvb2wgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyUmFuZ2Uodm9pZCAqcCx1bG9uZyBsZW5ndGgsdWxvbmcgKnBoeXNBZGRyZXNzKQoteyByZXR1cm4gZmFsc2U7IH0KLQotdm9pZCAqIFBNQVBJIFBNX21hcFRvUHJvY2Vzcyh2b2lkICpiYXNlLHVsb25nIGxpbWl0KQoteyByZXR1cm4gKHZvaWQqKWJhc2U7IH0KLQotdm9pZCAqIFBNQVBJIFBNX2FsbG9jUmVhbFNlZyh1aW50IHNpemUsdWludCAqcl9zZWcsdWludCAqcl9vZmYpCi17Ci0gICAgLyogQ2FsbCBtYWxsb2MoKSB0byBhbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciB1cyAqLwotICAgIHZvaWQgKnAgPSBQTV9tYWxsb2Moc2l6ZSk7Ci0gICAgKnJfc2VnID0gRlBfU0VHKHApOwotICAgICpyX29mZiA9IEZQX09GRihwKTsKLSAgICByZXR1cm4gcDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlUmVhbFNlZyh2b2lkICptZW0pCi17Ci0gICAgaWYgKG1lbSkgUE1fZnJlZShtZW0pOwotfQotCi1pbnQgUE1BUEkgUE1faW50ODYoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCkKLXsKLSAgICByZXR1cm4gUE1faW50Mzg2KGludG5vLGluLG91dCk7Ci19Ci0KLWludCBQTUFQSSBQTV9pbnQ4NngoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICByZXR1cm4gUE1faW50Mzg2eChpbnRubyxpbixvdXQsc3JlZ3MpOwotfQotCi12b2lkIFBNQVBJIFBNX2F2YWlsYWJsZU1lbW9yeSh1bG9uZyAqcGh5c2ljYWwsdWxvbmcgKnRvdGFsKQotewotICAgIFBNUkVHUyByZWdzOwotCi0gICAgcmVncy5oLmFoID0gMHg0ODsKLSAgICByZWdzLnguYnggPSAweEZGRkY7Ci0gICAgUE1faW50ODYoMHgyMSwmcmVncywmcmVncyk7Ci0gICAgKnBoeXNpY2FsID0gKnRvdGFsID0gcmVncy54LmJ4ICogMTZVTDsKLX0KLQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBQaGFyIExhcCBUTlQgRE9TIEV4dGVuZGVyIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmIFROVAotCi0jaW5jbHVkZSA8cGxkb3MzMi5oPgotI2luY2x1ZGUgPHBoYXJsYXAuaD4KLSNpbmNsdWRlIDxodzM4Ni5oPgotCi1zdGF0aWMgdWNoYXIgKnplcm9QdHIgPSBOVUxMOwotCi12b2lkICogUE1BUEkgUE1fZ2V0QklPU1BvaW50ZXIodm9pZCkKLXsKLSAgICBpZiAoIXplcm9QdHIpCi0JemVyb1B0ciA9IFBNX21hcFBoeXNpY2FsQWRkcigwLDB4RkZGRkYsdHJ1ZSk7Ci0gICAgcmV0dXJuICh2b2lkKikoemVyb1B0ciArIDB4NDAwKTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2dldEEwMDAwUG9pbnRlcih2b2lkKQotewotICAgIHN0YXRpYyB2b2lkICpiYW5rUHRyOwotICAgIGlmICghYmFua1B0cikKLQliYW5rUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDB4QTAwMDAsMHhGRkZGLHRydWUpOwotICAgIHJldHVybiBiYW5rUHRyOwotfQotCi12b2lkICogUE1BUEkgUE1fbWFwUGh5c2ljYWxBZGRyKHVsb25nIGJhc2UsdWxvbmcgbGltaXQsaWJvb2wgaXNDYWNoZWQpCi17Ci0gICAgQ09ORklHX0lORiAgY29uZmlnOwotICAgIFVMT05HICAgICAgIG9mZnNldDsKLSAgICBpbnQgICAgICAgICBlcnI7Ci0gICAgdWxvbmcgICAgICAgYmFzZUFkZHIsYmFzZU9mcyxuZXdMaW1pdDsKLSAgICBWWERfcmVncyAgICByZWdzOwotCi0gICAgLyogSWYgd2UgaGF2ZSBjb25uZWN0ZWQgdG8gb3VyIGhlbHBlciBWeEQgaW4gYSBXaW5kb3dzIERPUyBib3gsIHVzZQotICAgICAqIHRoZSBoZWxwZXIgVnhEIHNlcnZpY2VzIHRvIG1hcCBtZW1vcnkgaW5zdGVhZCBvZiB0aGUgRFBNSSBzZXJ2aWNlcy4KLSAgICAgKiBXZSBkbyB0aGlzIGJlY2F1c2UgdGhlIGhlbHBlciBWeEQgY2FuIHByb3Blcmx5IGRpc2FibGUgY2FjaGluZwotICAgICAqIHdoZXJlIG5lY2Vzc2FyeSwgd2hpY2ggd2UgY2FuIG9ubHkgZG8gZGlyZWN0bHkgaGVyZSBpZiB3ZSBhcmUKLSAgICAgKiBydW5uaW5nIGF0IHJpbmcgMCAoaWU6IHVuZGVyIHJlYWwgRE9TKS4KLSAgICAgKi8KLSAgICBpZiAoVlhEX3ZlcnNpb24gPT0gLTEpCi0JUE1faW5pdCgpOwotICAgIGlmIChWWERfdmVyc2lvbikgewotCW1lbXNldCgmcmVncywwLHNpemVvZihyZWdzKSk7Ci0JcmVncy5lYXggPSBBUElfTlVNKFBNSEVMUF9NQVBQSFlTKTsKLQlyZWdzLmVieCA9IGJhc2U7Ci0JcmVncy5lY3ggPSBsaW1pdDsKLQlyZWdzLmVkeCA9IGlzQ2FjaGVkOwotCV9QTV9WeERDYWxsKCZyZWdzLF9QTV9WWERfb2ZmLF9QTV9WWERfc2VsKTsKLQlyZXR1cm4gKHZvaWQqKXJlZ3MuZWF4OwotCX0KLQotICAgIC8qIFJvdW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHRvIGEgNEtiIGJvdW5kYXJ5IGFuZCB0aGUgbGltaXQgdG8gYQotICAgICAqIDRLYi0xIGJvdW5kYXJ5IGJlZm9yZSBwYXNzaW5nIHRoZSB2YWx1ZXMgdG8gVE5ULiBJZiB3ZSByb3VuZCB0aGUKLSAgICAgKiBwaHlzaWNhbCBhZGRyZXNzLCB0aGVuIHdlIGFsc28gYWRkIGFuIGV4dHJhIG9mZnNldCBpbnRvIHRoZSBhZGRyZXNzCi0gICAgICogdGhhdCB3ZSByZXR1cm4uCi0gICAgICovCi0gICAgYmFzZU9mcyA9IGJhc2UgJiA0MDk1OwotICAgIGJhc2VBZGRyID0gYmFzZSAmIH40MDk1OwotICAgIG5ld0xpbWl0ID0gKChsaW1pdCtiYXNlT2ZzKzErNDA5NSkgJiB+NDA5NSktMTsKLSAgICBfZHhfY29uZmlnX2luZigmY29uZmlnLCAoVUNIQVIqKSZjb25maWcpOwotICAgIGVyciA9IF9keF9tYXBfcGh5cyhjb25maWcuY19kc19zZWwsYmFzZUFkZHIsKG5ld0xpbWl0ICsgNDA5NSkgLyA0MDk2LCZvZmZzZXQpOwotICAgIGlmIChlcnIgPT0gMTMwKSB7Ci0JLyogSWYgdGhlIFROVCBmdW5jdGlvbiBmYWlsZWQsIHdlIGFyZSBydW5uaW5nIGluIGEgRFBNSSBlbnZpcm9ubWVudAotCSAqIGFuZCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHdvcmsuIEhvd2V2ZXIgd2Uga25vdyBob3cgdG8gaGFuZGxlCi0JICogRFBNSSBwcm9wZXJseSwgc28gd2UgdXNlIG91ciBnZW5lcmljIERQTUkgZnVuY3Rpb25zIHRvIGRvCi0JICogd2hhdCB0aGUgVE5UIHJ1bnRpbWUgbGlicmFyaWVzIGNhbid0LgotCSAqLwotCXJldHVybiBEUE1JX21hcFBoeXNpY2FsQWRkcihiYXNlLGxpbWl0LGlzQ2FjaGVkKTsKLQl9Ci0gICAgaWYgKGVyciA9PSAwKQotCXJldHVybiAodm9pZCopKG9mZnNldCArIGJhc2VPZnMpOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVQaHlzaWNhbEFkZHIodm9pZCAqcHRyLHVsb25nIGxpbWl0KQotewotfQotCi11bG9uZyBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHIodm9pZCAqcCkKLXsgcmV0dXJuIDB4RkZGRkZGRkZVTDsgfQotCi1pYm9vbCBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHJSYW5nZSh2b2lkICpwLHVsb25nIGxlbmd0aCx1bG9uZyAqcGh5c0FkZHJlc3MpCi17IHJldHVybiBmYWxzZTsgfQotCi12b2lkICogUE1BUEkgUE1fbWFwVG9Qcm9jZXNzKHZvaWQgKmJhc2UsdWxvbmcgbGltaXQpCi17IHJldHVybiAodm9pZCopYmFzZTsgfQotCi12b2lkICogUE1BUEkgUE1fbWFwUmVhbFBvaW50ZXIodWludCByX3NlZyx1aW50IHJfb2ZmKQotewotICAgIGlmICghemVyb1B0cikKLQl6ZXJvUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDAsMHhGRkZGRik7Ci0gICAgcmV0dXJuICh2b2lkKikoemVyb1B0ciArIE1LX1BIWVMocl9zZWcscl9vZmYpKTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2FsbG9jUmVhbFNlZyh1aW50IHNpemUsdWludCAqcl9zZWcsdWludCAqcl9vZmYpCi17Ci0gICAgVVNIT1JUICBhZGRyLHQ7Ci0gICAgdm9pZCAgICAqcDsKLQotICAgIGlmIChfZHhfcmVhbF9hbGxvYygoc2l6ZSArIDB4RikgPj4gNCwmYWRkciwmdCkgIT0gMCkKLQlyZXR1cm4gMDsKLSAgICAqcl9zZWcgPSBhZGRyOyAgICAgICAgICAgICAgICAgIC8qIFJlYWwgbW9kZSBzZWdtZW50IGFkZHJlc3MgICAgKi8KLSAgICAqcl9vZmYgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIFJlYWwgbW9kZSBzZWdtZW50IG9mZnNldCAgICAgKi8KLSAgICBwID0gUE1fbWFwUmVhbFBvaW50ZXIoKnJfc2VnLCpyX29mZik7Ci0gICAgX1BNX2FkZFJlYWxNb2RlQmxvY2socCxhZGRyKTsKLSAgICByZXR1cm4gcDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlUmVhbFNlZyh2b2lkICptZW0pCi17Ci0gICAgaWYgKG1lbSkgX2R4X3JlYWxfZnJlZShfUE1fZmluZFJlYWxNb2RlQmxvY2sobWVtKSk7Ci19Ci0KLSNkZWZpbmUgSU5EUE1JKHJlZykgICAgIHJtcmVncy5yZWcgPSByZWdzLT5yZWcKLSNkZWZpbmUgT1VURFBNSShyZWcpICAgIHJlZ3MtPnJlZyA9IHJtcmVncy5yZWcKLQotdm9pZCBQTUFQSSBEUE1JX2ludDg2KGludCBpbnRubywgRFBNSV9yZWdzICpyZWdzKQotewotICAgIFNXSV9SRUdTICAgIHJtcmVnczsKLQotICAgIG1lbXNldCgmcm1yZWdzLCAwLCBzaXplb2Yocm1yZWdzKSk7Ci0gICAgSU5EUE1JKGVheCk7IElORFBNSShlYngpOyBJTkRQTUkoZWN4KTsgSU5EUE1JKGVkeCk7IElORFBNSShlc2kpOyBJTkRQTUkoZWRpKTsKLQotICAgIF9keF9yZWFsX2ludChpbnRubywmcm1yZWdzKTsKLQotICAgIE9VVERQTUkoZWF4KTsgT1VURFBNSShlYngpOyBPVVREUE1JKGVjeCk7IE9VVERQTUkoZWR4KTsgT1VURFBNSShlc2kpOyBPVVREUE1JKGVkaSk7Ci0gICAgcmVncy0+ZmxhZ3MgPSBybXJlZ3MuZmxhZ3M7Ci19Ci0KLSNkZWZpbmUgSU4ocmVnKSAgICAgcm1yZWdzLnJlZyA9IGluLT5lLnJlZwotI2RlZmluZSBPVVQocmVnKSAgICBvdXQtPmUucmVnID0gcm1yZWdzLnJlZwotCi1pbnQgUE1BUEkgUE1faW50ODYoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCkKLXsKLSAgICBTV0lfUkVHUyAgICBybXJlZ3M7Ci0KLSAgICBtZW1zZXQoJnJtcmVncywgMCwgc2l6ZW9mKHJtcmVncykpOwotICAgIElOKGVheCk7IElOKGVieCk7IElOKGVjeCk7IElOKGVkeCk7IElOKGVzaSk7IElOKGVkaSk7Ci0KLSAgICBfZHhfcmVhbF9pbnQoaW50bm8sJnJtcmVncyk7Ci0KLSAgICBPVVQoZWF4KTsgT1VUKGVieCk7IE9VVChlY3gpOyBPVVQoZWR4KTsgT1VUKGVzaSk7IE9VVChlZGkpOwotICAgIG91dC0+eC5jZmxhZyA9IHJtcmVncy5mbGFncyAmIDB4MTsKLSAgICByZXR1cm4gb3V0LT54LmF4OwotfQotCi1pbnQgUE1BUEkgUE1faW50ODZ4KGludCBpbnRubywgUk1SRUdTICppbiwgUk1SRUdTICpvdXQsCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgU1dJX1JFR1MgICAgcm1yZWdzOwotCi0gICAgbWVtc2V0KCZybXJlZ3MsIDAsIHNpemVvZihybXJlZ3MpKTsKLSAgICBJTihlYXgpOyBJTihlYngpOyBJTihlY3gpOyBJTihlZHgpOyBJTihlc2kpOyBJTihlZGkpOwotICAgIHJtcmVncy5lcyA9IHNyZWdzLT5lczsKLSAgICBybXJlZ3MuZHMgPSBzcmVncy0+ZHM7Ci0KLSAgICBfZHhfcmVhbF9pbnQoaW50bm8sJnJtcmVncyk7Ci0KLSAgICBPVVQoZWF4KTsgT1VUKGVieCk7IE9VVChlY3gpOyBPVVQoZWR4KTsgT1VUKGVzaSk7IE9VVChlZGkpOwotICAgIHNyZWdzLT5lcyA9IHJtcmVncy5lczsKLSAgICBzcmVncy0+Y3MgPSBybXJlZ3MuY3M7Ci0gICAgc3JlZ3MtPnNzID0gcm1yZWdzLnNzOwotICAgIHNyZWdzLT5kcyA9IHJtcmVncy5kczsKLSAgICBvdXQtPnguY2ZsYWcgPSBybXJlZ3MuZmxhZ3MgJiAweDE7Ci0gICAgcmV0dXJuIG91dC0+eC5heDsKLX0KLQotdm9pZCBQTUFQSSBQTV9hdmFpbGFibGVNZW1vcnkodWxvbmcgKnBoeXNpY2FsLHVsb25nICp0b3RhbCkKLXsKLSAgICBQTVJFR1MgIHI7Ci0gICAgdWludCAgICBkYXRhWzI1XTsKLQotICAgIHIueC5heCA9IDB4MjUyMDsgICAgICAgICAgICAgICAgLyogR2V0IGZyZWUgbWVtb3J5IGluZm8gKi8KLSAgICByLnguYnggPSAwOwotICAgIHIuZS5lZHggPSAodWludClkYXRhOwotICAgIFBNX2ludDM4NigweDIxLCAmciwgJnIpOwotICAgICpwaHlzaWNhbCA9IGRhdGFbMjFdICogNDA5NjsKLSAgICAqdG90YWwgPSBkYXRhWzIzXSAqIDQwOTY7Ci19Ci0KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogU3ltYW50ZWMgQysrIERPU1ggYW5kIEZsYXNoVGVrIFgtMzIvWC0zMlZNIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZiBkZWZpbmVkKERPU1gpIHx8IGRlZmluZWQoWDMyVk0pCi0KLSNpZmRlZiAgWDMyVk0KLSNpbmNsdWRlIDx4MzIuaD4KLQotI2RlZmluZSBfeDM4Nl9ta19wcm90ZWN0ZWRfcHRyKHApICAgX3gzMl9ta19wcm90ZWN0ZWRfcHRyKCh2b2lkKilwKQotI2RlZmluZSBfeDM4Nl9mcmVlX3Byb3RlY3RlZF9wdHIocCkgX3gzMl9mcmVlX3Byb3RlY3RlZF9wdHIocCkKLSNkZWZpbmUgX3gzODZfemVyb19iYXNlX3B0ciAgICAgICAgIF94MzJfemVyb19iYXNlX3B0cgotI2Vsc2UKLWV4dGVybiB2b2lkICpfeDM4Nl96ZXJvX2Jhc2VfcHRyOwotI2VuZGlmCi0KLXZvaWQgKiBQTUFQSSBQTV9tYXBSZWFsUG9pbnRlcih1aW50IHJfc2VnLHVpbnQgcl9vZmYpCi17Ci0gICAgcmV0dXJuICh2b2lkKikoKHVsb25nKV94Mzg2X3plcm9fYmFzZV9wdHIgKyBNS19QSFlTKHJfc2VnLHJfb2ZmKSk7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY1JlYWxTZWcodWludCBzaXplLHVpbnQgKnJfc2VnLHVpbnQgKnJfb2ZmKQotewotICAgIFBNUkVHUyAgcjsKLQotICAgIHIuaC5haCA9IDB4NDg7ICAgICAgICAgICAgICAgICAgLyogRE9TIGZ1bmN0aW9uIDQ4aCAtIGFsbG9jYXRlIG1lbSAgKi8KLSAgICByLnguYnggPSAoc2l6ZSArIDB4RikgPj4gNDsgICAgIC8qIE51bWJlciBvZiBwYXJhZ3JhcGhzIHRvIGFsbG9jYXRlICovCi0gICAgUE1faW50Mzg2KDB4MjEsICZyLCAmcik7ICAgICAgICAvKiBDYWxsIERPUyBleHRlbmRlciAgICAgICAgICAgICAgICAqLwotICAgIGlmIChyLnguY2ZsYWcpCi0JcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgIC8qIENvdWxkIG5vdCBhbGxvY2F0ZSB0aGUgbWVtb3J5ICAgICovCi0gICAgKnJfc2VnID0gci5lLmVheDsKLSAgICAqcl9vZmYgPSAwOwotICAgIHJldHVybiBQTV9tYXBSZWFsUG9pbnRlcigqcl9zZWcsKnJfb2ZmKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlUmVhbFNlZyh2b2lkICptZW0pCi17Ci0gICAgLyogQ2Fubm90IGRlLWFsbG9jYXRlIHRoaXMgbWVtb3J5ICovCi0gICAgbWVtID0gbWVtOwotfQotCi0jcHJhZ21hIHBhY2soMSkKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVzaG9ydCAgaW50bm87Ci0gICAgdXNob3J0ICBkczsKLSAgICB1c2hvcnQgIGVzOwotICAgIHVzaG9ydCAgZnM7Ci0gICAgdXNob3J0ICBnczsKLSAgICB1bG9uZyAgIGVheDsKLSAgICB1bG9uZyAgIGVkeDsKLSAgICB9IF9STVJFR1M7Ci0KLSNwcmFnbWEgcGFjaygpCi0KLSNkZWZpbmUgSU4ocmVnKSAgICAgcmVncy5lLnJlZyA9IGluLT5lLnJlZwotI2RlZmluZSBPVVQocmVnKSAgICBvdXQtPmUucmVnID0gcmVncy5lLnJlZwotCi1pbnQgUE1BUEkgUE1faW50ODYoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCkKLXsKLSAgICBfUk1SRUdTIHJtcmVnczsKLSAgICBQTVJFR1MgIHJlZ3M7Ci0gICAgUE1TUkVHUyBwbXNyZWdzOwotCi0gICAgcm1yZWdzLmludG5vID0gaW50bm87Ci0gICAgcm1yZWdzLmVheCA9IGluLT5lLmVheDsKLSAgICBybXJlZ3MuZWR4ID0gaW4tPmUuZWR4OwotICAgIElOKGVieCk7IElOKGVjeCk7IElOKGVzaSk7IElOKGVkaSk7Ci0gICAgcmVncy54LmF4ID0gMHgyNTExOwotICAgIHJlZ3MuZS5lZHggPSAodWludCkoJnJtcmVncyk7Ci0gICAgUE1fc2VncmVhZCgmcG1zcmVncyk7Ci0gICAgUE1faW50Mzg2eCgweDIxLCZyZWdzLCZyZWdzLCZwbXNyZWdzKTsKLQotICAgIE9VVChlYXgpOyBPVVQoZWJ4KTsgT1VUKGVjeCk7IE9VVChlc2kpOyBPVVQoZWRpKTsKLSAgICBvdXQtPnguZHggPSBybXJlZ3MuZWR4OwotICAgIG91dC0+eC5jZmxhZyA9IHJlZ3MueC5jZmxhZzsKLSAgICByZXR1cm4gb3V0LT54LmF4OwotfQotCi1pbnQgUE1BUEkgUE1faW50ODZ4KGludCBpbnRubywgUk1SRUdTICppbiwgUk1SRUdTICpvdXQsIFJNU1JFR1MgKnNyZWdzKQotewotICAgIF9STVJFR1Mgcm1yZWdzOwotICAgIFBNUkVHUyAgcmVnczsKLSAgICBQTVNSRUdTIHBtc3JlZ3M7Ci0KLSAgICBybXJlZ3MuaW50bm8gPSBpbnRubzsKLSAgICBybXJlZ3MuZWF4ID0gaW4tPmUuZWF4OwotICAgIHJtcmVncy5lZHggPSBpbi0+ZS5lZHg7Ci0gICAgcm1yZWdzLmVzID0gc3JlZ3MtPmVzOwotICAgIHJtcmVncy5kcyA9IHNyZWdzLT5kczsKLSAgICBJTihlYngpOyBJTihlY3gpOyBJTihlc2kpOyBJTihlZGkpOwotICAgIHJlZ3MueC5heCA9IDB4MjUxMTsKLSAgICByZWdzLmUuZWR4ID0gKHVpbnQpKCZybXJlZ3MpOwotICAgIFBNX3NlZ3JlYWQoJnBtc3JlZ3MpOwotICAgIFBNX2ludDM4NngoMHgyMSwmcmVncywmcmVncywmcG1zcmVncyk7Ci0KLSAgICBPVVQoZWF4KTsgT1VUKGVieCk7IE9VVChlY3gpOyBPVVQoZXNpKTsgT1VUKGVkaSk7Ci0gICAgc3JlZ3MtPmVzID0gcm1yZWdzLmVzOwotICAgIHNyZWdzLT5kcyA9IHJtcmVncy5kczsKLSAgICBvdXQtPnguZHggPSBybXJlZ3MuZWR4OwotICAgIG91dC0+eC5jZmxhZyA9IHJlZ3MueC5jZmxhZzsKLSAgICByZXR1cm4gb3V0LT54LmF4OwotfQotCi12b2lkICogUE1BUEkgUE1fZ2V0QklPU1BvaW50ZXIodm9pZCkKLXsKLSAgICByZXR1cm4gKHZvaWQqKSgodWxvbmcpX3gzODZfemVyb19iYXNlX3B0ciArIDB4NDAwKTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2dldEEwMDAwUG9pbnRlcih2b2lkKQotewotICAgIHJldHVybiAodm9pZCopKCh1bG9uZylfeDM4Nl96ZXJvX2Jhc2VfcHRyICsgMHhBMDAwMCk7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9tYXBQaHlzaWNhbEFkZHIodWxvbmcgYmFzZSx1bG9uZyBsaW1pdCxpYm9vbCBpc0NhY2hlZCkKLXsKLSAgICBWWERfcmVncyAgICByZWdzOwotCi0gICAgLyogSWYgd2UgaGF2ZSBjb25uZWN0ZWQgdG8gb3VyIGhlbHBlciBWeEQgaW4gYSBXaW5kb3dzIERPUyBib3gsIHVzZQotICAgICAqIHRoZSBoZWxwZXIgVnhEIHNlcnZpY2VzIHRvIG1hcCBtZW1vcnkgaW5zdGVhZCBvZiB0aGUgRFBNSSBzZXJ2aWNlcy4KLSAgICAgKiBXZSBkbyB0aGlzIGJlY2F1c2UgdGhlIGhlbHBlciBWeEQgY2FuIHByb3Blcmx5IGRpc2FibGUgY2FjaGluZwotICAgICAqIHdoZXJlIG5lY2Vzc2FyeSwgd2hpY2ggd2UgY2FuIG9ubHkgZG8gZGlyZWN0bHkgaGVyZSBpZiB3ZSBhcmUKLSAgICAgKiBydW5uaW5nIGF0IHJpbmcgMCAoaWU6IHVuZGVyIHJlYWwgRE9TKS4KLSAgICAgKi8KLSAgICBpZiAoVlhEX3ZlcnNpb24gPT0gLTEpCi0JUE1faW5pdCgpOwotICAgIGlmIChWWERfdmVyc2lvbikgewotCW1lbXNldCgmcmVncywwLHNpemVvZihyZWdzKSk7Ci0JcmVncy5lYXggPSBBUElfTlVNKFBNSEVMUF9NQVBQSFlTKTsKLQlyZWdzLmVieCA9IGJhc2U7Ci0JcmVncy5lY3ggPSBsaW1pdDsKLQlyZWdzLmVkeCA9IGlzQ2FjaGVkOwotCV9QTV9WeERDYWxsKCZyZWdzLF9QTV9WWERfb2ZmLF9QTV9WWERfc2VsKTsKLQlyZXR1cm4gKHZvaWQqKXJlZ3MuZWF4OwotCX0KLQotICAgIGlmIChiYXNlID4gMHgxMDAwMDApCi0JcmV0dXJuIF94Mzg2X21hcF9waHlzaWNhbF9hZGRyZXNzKCh2b2lkKiliYXNlLGxpbWl0KTsKLSAgICByZXR1cm4gKHZvaWQqKSgodWxvbmcpX3gzODZfemVyb19iYXNlX3B0ciArIGJhc2UpOwotfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVQaHlzaWNhbEFkZHIodm9pZCAqcHRyLHVsb25nIGxpbWl0KQotewotICAgIC8qIE1hcHBpbmcgY2Fubm90IGJlIGZyZWVkICovCi19Ci0KLXVsb25nIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkcih2b2lkICpwKQoteyByZXR1cm4gMHhGRkZGRkZGRlVMOyB9Ci0KLWlib29sIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkclJhbmdlKHZvaWQgKnAsdWxvbmcgbGVuZ3RoLHVsb25nICpwaHlzQWRkcmVzcykKLXsgcmV0dXJuIGZhbHNlOyB9Ci0KLXZvaWQgKiBQTUFQSSBQTV9tYXBUb1Byb2Nlc3Modm9pZCAqYmFzZSx1bG9uZyBsaW1pdCkKLXsgcmV0dXJuICh2b2lkKiliYXNlOyB9Ci0KLXVsb25nIF9jZGVjbCBfWDMyX2dldFBoeXNNZW0odm9pZCk7Ci0KLXZvaWQgUE1BUEkgUE1fYXZhaWxhYmxlTWVtb3J5KHVsb25nICpwaHlzaWNhbCx1bG9uZyAqdG90YWwpCi17Ci0gICAgUE1SRUdTICByZWdzOwotCi0gICAgLyogR2V0IHRvdGFsIG1lbW9yeSBhdmFpbGFibGUsIGluY2x1ZGluZyB2aXJ0dWFsIG1lbW9yeSAqLwotICAgIHJlZ3MueC5heCA9IDB4MzUwQjsKLSAgICBQTV9pbnQzODYoMHgyMSwmcmVncywmcmVncyk7Ci0gICAgKnRvdGFsID0gcmVncy5lLmVheDsKLQotICAgIC8qIEdldCBwaHlzaWNhbCBtZW1vcnkgYXZhaWxhYmxlICovCi0gICAgKnBoeXNpY2FsID0gX1gzMl9nZXRQaHlzTWVtKCk7Ci0gICAgaWYgKCpwaHlzaWNhbCA+ICp0b3RhbCkKLQkqcGh5c2ljYWwgPSAqdG90YWw7Ci19Ci0KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQm9ybGFuZCdzIERQTUkzMiwgV2F0Y29tIERPUzRHVyBhbmQgREpHUFAgRFBNSSBzdXBwb3J0IHJvdXRpbmVzICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZiBkZWZpbmVkKERQTUkzMikgfHwgZGVmaW5lZChET1M0R1cpIHx8IGRlZmluZWQoREpHUFApCi0KLXZvaWQgKiBQTUFQSSBQTV9nZXRCSU9TUG9pbnRlcih2b2lkKQotewotICAgIHJldHVybiBQTV9tYXBQaHlzaWNhbEFkZHIoMHg0MDAsMHhGRkZGLHRydWUpOwotfQotCi12b2lkICogUE1BUEkgUE1fZ2V0QTAwMDBQb2ludGVyKHZvaWQpCi17Ci0gICAgcmV0dXJuIFBNX21hcFBoeXNpY2FsQWRkcigweEEwMDAwLDB4RkZGRix0cnVlKTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX21hcFBoeXNpY2FsQWRkcih1bG9uZyBiYXNlLHVsb25nIGxpbWl0LGlib29sIGlzQ2FjaGVkKQotewotICAgIFZYRF9yZWdzICAgIHJlZ3M7Ci0KLSNpZmRlZiAgREpHUFAKLSAgICAvKiBFbmFibGUgbmVhciBwb2ludGVycyBmb3IgREpHUFAgVjIgKi8KLSAgICBfX2RqZ3BwX25lYXJwdHJfZW5hYmxlKCk7Ci0jZW5kaWYKLSAgICAvKiBJZiB3ZSBoYXZlIGNvbm5lY3RlZCB0byBvdXIgaGVscGVyIFZ4RCBpbiBhIFdpbmRvd3MgRE9TIGJveCwgdXNlCi0gICAgICogdGhlIGhlbHBlciBWeEQgc2VydmljZXMgdG8gbWFwIG1lbW9yeSBpbnN0ZWFkIG9mIHRoZSBEUE1JIHNlcnZpY2VzLgotICAgICAqIFdlIGRvIHRoaXMgYmVjYXVzZSB0aGUgaGVscGVyIFZ4RCBjYW4gcHJvcGVybHkgZGlzYWJsZSBjYWNoaW5nCi0gICAgICogd2hlcmUgbmVjZXNzYXJ5LCB3aGljaCB3ZSBjYW4gb25seSBkbyBkaXJlY3RseSBoZXJlIGlmIHdlIGFyZQotICAgICAqIHJ1bm5pbmcgYXQgcmluZyAwIChpZTogdW5kZXIgcmVhbCBET1MpLgotICAgICAqLwotICAgIGlmIChWWERfdmVyc2lvbiA9PSAtMSkKLQlQTV9pbml0KCk7Ci0gICAgaWYgKFZYRF92ZXJzaW9uKSB7Ci0JbWVtc2V0KCZyZWdzLDAsc2l6ZW9mKHJlZ3MpKTsKLQlyZWdzLmVheCA9IEFQSV9OVU0oUE1IRUxQX01BUFBIWVMpOwotCXJlZ3MuZWJ4ID0gYmFzZTsKLQlyZWdzLmVjeCA9IGxpbWl0OwotCXJlZ3MuZWR4ID0gaXNDYWNoZWQ7Ci0JX1BNX1Z4RENhbGwoJnJlZ3MsX1BNX1ZYRF9vZmYsX1BNX1ZYRF9zZWwpOwotCXJldHVybiAodm9pZCopcmVncy5lYXg7Ci0JfQotICAgIHJldHVybiBEUE1JX21hcFBoeXNpY2FsQWRkcihiYXNlLGxpbWl0LGlzQ2FjaGVkKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlUGh5c2ljYWxBZGRyKHZvaWQgKnB0cix1bG9uZyBsaW1pdCkKLXsKLSAgICAvKiBNYXBwaW5nIGNhbm5vdCBiZSBmcmVlZCAqLwotICAgICh2b2lkKXB0cjsKLSAgICAodm9pZClsaW1pdDsKLX0KLQotdWxvbmcgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyKHZvaWQgKnApCi17Ci0gICAgdWxvbmcgICBwaHlzQWRkcjsKLSAgICBpZiAoIVBNX2dldFBoeXNpY2FsQWRkclJhbmdlKHAsMSwmcGh5c0FkZHIpKQotCXJldHVybiAweEZGRkZGRkZGOwotICAgIHJldHVybiBwaHlzQWRkciB8ICgodWxvbmcpcCAmIDB4RkZGKTsKLX0KLQotaWJvb2wgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyUmFuZ2UoCi0gICAgdm9pZCAqcCwKLSAgICB1bG9uZyBsZW5ndGgsCi0gICAgdWxvbmcgKnBoeXNBZGRyZXNzKQotewotICAgIFZYRF9yZWdzICAgIHJlZ3M7Ci0gICAgdWxvbmcgICAgICAgcHRlOwotICAgIFBNU1JFR1MgICAgIHNyZWdzOwotICAgIHVsb25nICAgICAgIERTQmFzZUFkZHI7Ci0KLSAgICAvKiBJZiB3ZSBoYXZlIGNvbm5lY3RlZCB0byBvdXIgaGVscGVyIFZ4RCBpbiBhIFdpbmRvd3MgRE9TIGJveCwgdXNlIHRoZQotICAgICAqIGhlbHBlciBWeEQgc2VydmljZXMgdG8gZmluZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhbiBhZGRyZXNzLgotICAgICAqLwotICAgIGlmIChWWERfdmVyc2lvbikgewotCW1lbXNldCgmcmVncywwLHNpemVvZihyZWdzKSk7Ci0JcmVncy5lYXggPSBBUElfTlVNKFBNSEVMUF9HRVRQSFlTSUNBTEFERFJSQU5HRSk7Ci0JcmVncy5lYnggPSAodWxvbmcpcDsKLQlyZWdzLmVjeCA9ICh1bG9uZylsZW5ndGg7Ci0JcmVncy5lZHggPSAodWxvbmcpcGh5c0FkZHJlc3M7Ci0JX1BNX1Z4RENhbGwoJnJlZ3MsX1BNX1ZYRF9vZmYsX1BNX1ZYRF9zZWwpOwotCXJldHVybiByZWdzLmVheDsKLQl9Ci0KLSAgICAvKiBGaW5kIGJhc2UgYWRkcmVzcyBmb3IgZGVmYXVsdCBEUyBzZWxlY3RvciAqLwotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICBEU0Jhc2VBZGRyID0gRFBNSV9nZXRTZWxlY3RvckJhc2Uoc3JlZ3MuZHMpOwotCi0gICAgLyogT3RoZXJ3aXNlIGRpcmVjdGx5IGFjY2VzcyB0aGUgcGFnZSB0YWJsZXMgdG8gZGV0ZXJtaW5lIHRoZQotICAgICAqIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzLiBOb3RlIHRoYXQgd2UgdG91Y2ggdGhlIG1lbW9yeSBiZWZvcmUKLSAgICAgKiBjYWxsaW5nLCBvdGhlcndpc2UgdGhlIG1lbW9yeSBtYXkgbm90IGJlIHBhZ2VkIGluIGNvcnJlY3RseS4KLSAgICAgKi8KLSAgICBwdGUgPSAqKCh1bG9uZyopcCk7Ci0jaWZkZWYgIERPUzRHVwotICAgIGlmIChfUE1fcGFnaW5nRW5hYmxlZCgpID09IDApIHsKLQlpbnQgICAgIGNvdW50OwotCXVsb25nICAgbGluQWRkciA9ICh1bG9uZylwOwotCi0JLyogV2hlbiBwYWdpbmcgaXMgZGlzYWJsZWQgcGh5c2ljYWw9bGluZWFyICovCi0JZm9yIChjb3VudCA9IChsZW5ndGgrMHhGRkYpID4+IDEyOyBjb3VudCA+IDA7IGNvdW50LS0pIHsKLQkgICAgKnBoeXNBZGRyZXNzKysgPSBsaW5BZGRyOwotCSAgICBsaW5BZGRyICs9IDQwOTY7Ci0JICAgIH0KLQlyZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgZWxzZSBpZiAoKFBEQiA9IF9QTV9nZXRQREIoKSkgIT0gMCAmJiBEU0Jhc2VBZGRyID09IDApIHsKLQlpbnQgICAgIHN0YXJ0UERCLGVuZFBEQixpUERCLHN0YXJ0UGFnZSxlbmRQYWdlLHN0YXJ0LGVuZCxpUGFnZTsKLQl1bG9uZyAgIHBhZ2VUYWJsZSwqcFBhZ2VUYWJsZSxsaW5BZGRyID0gKHVsb25nKXA7Ci0JdWxvbmcgICBsaW1pdCA9IGxlbmd0aC0xOwotCi0JcFBEQiA9ICh1bG9uZyopRFBNSV9tYXBQaHlzaWNhbFRvTGluZWFyKFBEQiwweEZGRik7Ci0JaWYgKHBQREIpIHsKLQkgICAgc3RhcnRQREIgPSAobGluQWRkciA+PiAyMikgJiAweDNGRkw7Ci0JICAgIHN0YXJ0UGFnZSA9IChsaW5BZGRyID4+IDEyKSAmIDB4M0ZGTDsKLQkgICAgZW5kUERCID0gKChsaW5BZGRyK2xpbWl0KSA+PiAyMikgJiAweDNGRkw7Ci0JICAgIGVuZFBhZ2UgPSAoKGxpbkFkZHIrbGltaXQpID4+IDEyKSAmIDB4M0ZGTDsKLQkgICAgZm9yIChpUERCID0gc3RhcnRQREI7IGlQREIgPD0gZW5kUERCOyBpUERCKyspIHsKLQkJcGFnZVRhYmxlID0gcFBEQltpUERCXSAmIH4weEZGRkw7Ci0JCXBQYWdlVGFibGUgPSAodWxvbmcqKURQTUlfbWFwUGh5c2ljYWxUb0xpbmVhcihwYWdlVGFibGUsMHhGRkYpOwotCQlzdGFydCA9IChpUERCID09IHN0YXJ0UERCKSA/IHN0YXJ0UGFnZSA6IDA7Ci0JCWVuZCA9IChpUERCID09IGVuZFBEQikgPyBlbmRQYWdlIDogMHgzRkZMOwotCQlmb3IgKGlQYWdlID0gc3RhcnQ7IGlQYWdlIDw9IGVuZDsgaVBhZ2UrKykKLQkJICAgICpwaHlzQWRkcmVzcysrID0gKHBQYWdlVGFibGVbaVBhZ2VdICYgfjB4RkZGKTsKLQkJfQotCSAgICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotCX0KLSNlbmRpZgotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX21hcFRvUHJvY2Vzcyh2b2lkICpiYXNlLHVsb25nIGxpbWl0KQotewotICAgICh2b2lkKWxpbWl0OwotICAgIHJldHVybiAodm9pZCopYmFzZTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX21hcFJlYWxQb2ludGVyKHVpbnQgcl9zZWcsdWludCByX29mZikKLXsKLSAgICBzdGF0aWMgdWNoYXIgKnplcm9QdHIgPSBOVUxMOwotCi0gICAgaWYgKCF6ZXJvUHRyKQotCXplcm9QdHIgPSBQTV9tYXBQaHlzaWNhbEFkZHIoMCwweEZGRkZGLHRydWUpOwotICAgIHJldHVybiAodm9pZCopKHplcm9QdHIgKyBNS19QSFlTKHJfc2VnLHJfb2ZmKSk7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY1JlYWxTZWcodWludCBzaXplLHVpbnQgKnJfc2VnLHVpbnQgKnJfb2ZmKQotewotICAgIFBNUkVHUyAgICAgIHI7Ci0gICAgdm9pZCAgICAgICAgKnA7Ci0KLSAgICByLnguYXggPSAweDEwMDsgICAgICAgICAgICAgICAgIC8qIERQTUkgYWxsb2NhdGUgRE9TIG1lbW9yeSAgICAgICAgICovCi0gICAgci54LmJ4ID0gKHNpemUgKyAweEYpID4+IDQ7ICAgICAvKiBudW1iZXIgb2YgcGFyYWdyYXBocyAgICAgICAgICAgICAqLwotICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOwotICAgIGlmIChyLnguY2ZsYWcpCi0JcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIERQTUkgY2FsbCBmYWlsZWQgICAgICAgICAgICAgICAgICovCi0gICAgKnJfc2VnID0gci54LmF4OyAgICAgICAgICAgICAgICAvKiBSZWFsIG1vZGUgc2VnbWVudCAgICAgICAgICAgICAgICAqLwotICAgICpyX29mZiA9IDA7Ci0gICAgcCA9IFBNX21hcFJlYWxQb2ludGVyKCpyX3NlZywqcl9vZmYpOwotICAgIF9QTV9hZGRSZWFsTW9kZUJsb2NrKHAsci54LmR4KTsKLSAgICByZXR1cm4gcDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlUmVhbFNlZyh2b2lkICptZW0pCi17Ci0gICAgUE1SRUdTICByOwotCi0gICAgaWYgKG1lbSkgewotCXIueC5heCA9IDB4MTAxOyAgICAgICAgICAgICAgICAgICAgIC8qIERQTUkgZnJlZSBET1MgbWVtb3J5ICAgICAgICAgKi8KLQlyLnguZHggPSBfUE1fZmluZFJlYWxNb2RlQmxvY2sobWVtKTsvKiBEWCA6PSBzZWxlY3RvciBmcm9tIDB4MTAwICAgICovCi0JUE1faW50Mzg2KDB4MzEsICZyLCAmcik7Ci0JfQotfQotCi1zdGF0aWMgRFBNSV9oYW5kbGVyX3QgICBEUE1JX2ludDEwID0gTlVMTDsKLQotdm9pZCBQTUFQSSBEUE1JX3NldEludDEwSGFuZGxlcihEUE1JX2hhbmRsZXJfdCBoYW5kbGVyKQotewotICAgIERQTUlfaW50MTAgPSBoYW5kbGVyOwotfQotCi12b2lkIFBNQVBJIERQTUlfaW50ODYoaW50IGludG5vLCBEUE1JX3JlZ3MgKnJlZ3MpCi17Ci0gICAgUE1SRUdTICAgICAgcjsKLSAgICBQTVNSRUdTICAgICBzcjsKLQotICAgIGlmIChpbnRubyA9PSAweDEwICYmIERQTUlfaW50MTApIHsKLQlpZiAoRFBNSV9pbnQxMChyZWdzKSkKLQkgICAgcmV0dXJuOwotCX0KLSAgICBQTV9zZWdyZWFkKCZzcik7Ci0gICAgci54LmF4ID0gMHgzMDA7ICAgICAgICAgICAgICAgICAvKiBEUE1JIGlzc3VlIHJlYWwgaW50ZXJydXB0ICAgICovCi0gICAgci5oLmJsID0gaW50bm87Ci0gICAgci5oLmJoID0gMDsKLSAgICByLnguY3ggPSAwOwotICAgIHNyLmVzID0gc3IuZHM7Ci0gICAgci5lLmVkaSA9ICh1aW50KXJlZ3M7Ci0gICAgUE1faW50Mzg2eCgweDMxLCAmciwgJnIsICZzcik7ICAvKiBJc3N1ZSB0aGUgaW50ZXJydXB0ICAgICAgICAgICovCi19Ci0KLSNkZWZpbmUgSU4ocmVnKSAgICAgcm1yZWdzLnJlZyA9IGluLT5lLnJlZwotI2RlZmluZSBPVVQocmVnKSAgICBvdXQtPmUucmVnID0gcm1yZWdzLnJlZwotCi1pbnQgUE1BUEkgUE1faW50ODYoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCkKLXsKLSAgICBEUE1JX3JlZ3MgICBybXJlZ3M7Ci0KLSAgICBtZW1zZXQoJnJtcmVncywgMCwgc2l6ZW9mKHJtcmVncykpOwotICAgIElOKGVheCk7IElOKGVieCk7IElOKGVjeCk7IElOKGVkeCk7IElOKGVzaSk7IElOKGVkaSk7Ci0KLSAgICBEUE1JX2ludDg2KGludG5vLCZybXJlZ3MpOyAgICAgIC8qIERQTUkgaXNzdWUgcmVhbCBpbnRlcnJ1cHQgICAgKi8KLQotICAgIE9VVChlYXgpOyBPVVQoZWJ4KTsgT1VUKGVjeCk7IE9VVChlZHgpOyBPVVQoZXNpKTsgT1VUKGVkaSk7Ci0gICAgb3V0LT54LmNmbGFnID0gcm1yZWdzLmZsYWdzICYgMHgxOwotICAgIHJldHVybiBvdXQtPnguYXg7Ci19Ci0KLWludCBQTUFQSSBQTV9pbnQ4NngoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICBEUE1JX3JlZ3MgICBybXJlZ3M7Ci0KLSAgICBtZW1zZXQoJnJtcmVncywgMCwgc2l6ZW9mKHJtcmVncykpOwotICAgIElOKGVheCk7IElOKGVieCk7IElOKGVjeCk7IElOKGVkeCk7IElOKGVzaSk7IElOKGVkaSk7Ci0gICAgcm1yZWdzLmVzID0gc3JlZ3MtPmVzOwotICAgIHJtcmVncy5kcyA9IHNyZWdzLT5kczsKLQotICAgIERQTUlfaW50ODYoaW50bm8sJnJtcmVncyk7ICAgICAgLyogRFBNSSBpc3N1ZSByZWFsIGludGVycnVwdCAgICAqLwotCi0gICAgT1VUKGVheCk7IE9VVChlYngpOyBPVVQoZWN4KTsgT1VUKGVkeCk7IE9VVChlc2kpOyBPVVQoZWRpKTsKLSAgICBzcmVncy0+ZXMgPSBybXJlZ3MuZXM7Ci0gICAgc3JlZ3MtPmNzID0gcm1yZWdzLmNzOwotICAgIHNyZWdzLT5zcyA9IHJtcmVncy5zczsKLSAgICBzcmVncy0+ZHMgPSBybXJlZ3MuZHM7Ci0gICAgb3V0LT54LmNmbGFnID0gcm1yZWdzLmZsYWdzICYgMHgxOwotICAgIHJldHVybiBvdXQtPnguYXg7Ci19Ci0KLSNwcmFnbWEgcGFjaygxKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdWludCAgICBMYXJnZXN0QmxvY2tBdmFpbDsKLQl1aW50ICAgIE1heFVubG9ja2VkUGFnZTsKLQl1aW50ICAgIExhcmdlc3RMb2NrYWJsZVBhZ2U7Ci0JdWludCAgICBMaW5BZGRyU3BhY2U7Ci0JdWludCAgICBOdW1GcmVlUGFnZXNBdmFpbDsKLQl1aW50ICAgIE51bVBoeXNpY2FsUGFnZXNGcmVlOwotCXVpbnQgICAgVG90YWxQaHlzaWNhbFBhZ2VzOwotCXVpbnQgICAgRnJlZUxpbkFkZHJTcGFjZTsKLQl1aW50ICAgIFNpemVPZlBhZ2VGaWxlOwotCXVpbnQgICAgcmVzWzNdOwotCX0gTWVtSW5mbzsKLQotI3ByYWdtYSBwYWNrKCkKLQotdm9pZCBQTUFQSSBQTV9hdmFpbGFibGVNZW1vcnkodWxvbmcgKnBoeXNpY2FsLHVsb25nICp0b3RhbCkKLXsKLSAgICBQTVJFR1MgIHI7Ci0gICAgUE1TUkVHUyBzcjsKLSAgICBNZW1JbmZvIG1lbUluZm87Ci0KLSAgICBQTV9zZWdyZWFkKCZzcik7Ci0gICAgci54LmF4ID0gMHg1MDA7ICAgICAgICAgICAgICAgICAvKiBEUE1JIGdldCBmcmVlIG1lbW9yeSBpbmZvICovCi0gICAgc3IuZXMgPSBzci5kczsKLSAgICByLmUuZWRpID0gKHVpbnQpJm1lbUluZm87Ci0gICAgUE1faW50Mzg2eCgweDMxLCAmciwgJnIsICZzcik7ICAvKiBJc3N1ZSB0aGUgaW50ZXJydXB0ICovCi0gICAgKnBoeXNpY2FsID0gbWVtSW5mby5OdW1QaHlzaWNhbFBhZ2VzRnJlZSAqIDQwOTY7Ci0gICAgKnRvdGFsID0gbWVtSW5mby5MYXJnZXN0QmxvY2tBdmFpbDsKLSAgICBpZiAoKnRvdGFsIDwgKnBoeXNpY2FsKQotCSpwaHlzaWNhbCA9ICp0b3RhbDsKLX0KLQotI2VuZGlmCi0KLSNpZm5kZWYgX18xNkJJVF9fCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgVkJFL0NvcmUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGNoYW5nZSBkaXNwbGF5IGJhbmtzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0QmFua0EoCi0gICAgaW50IGJhbmspCi17Ci0gICAgRFBNSV9yZWdzICAgcmVnczsKLSAgICBtZW1zZXQoJnJlZ3MsIDAsIHNpemVvZihyZWdzKSk7Ci0gICAgcmVncy5lYXggPSAweDRGMDU7Ci0gICAgcmVncy5lYnggPSAweDAwMDA7Ci0gICAgcmVncy5lZHggPSBiYW5rOwotICAgIERQTUlfaW50ODYoMHgxMCwmcmVncyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgVkJFL0NvcmUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGNoYW5nZSBkaXNwbGF5IGJhbmtzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0QmFua0FCKAotICAgIGludCBiYW5rKQotewotICAgIERQTUlfcmVncyAgIHJlZ3M7Ci0gICAgbWVtc2V0KCZyZWdzLCAwLCBzaXplb2YocmVncykpOwotICAgIHJlZ3MuZWF4ID0gMHg0RjA1OwotICAgIHJlZ3MuZWJ4ID0gMHgwMDAwOwotICAgIHJlZ3MuZWR4ID0gYmFuazsKLSAgICBEUE1JX2ludDg2KDB4MTAsJnJlZ3MpOwotICAgIHJlZ3MuZWF4ID0gMHg0RjA1OwotICAgIHJlZ3MuZWJ4ID0gMHgwMDAxOwotICAgIHJlZ3MuZWR4ID0gYmFuazsKLSAgICBEUE1JX2ludDg2KDB4MTAsJnJlZ3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIFZCRS9Db3JlIHNvZnR3YXJlIGludGVycnVwdCB0byBjaGFuZ2UgZGlzcGxheSBzdGFydCBhZGRyZXNzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0Q1JUU3RhcnQoCi0gICAgaW50IHgsCi0gICAgaW50IHksCi0gICAgaW50IHdhaXRWUlQpCi17Ci0gICAgRFBNSV9yZWdzICAgcmVnczsKLSAgICBtZW1zZXQoJnJlZ3MsIDAsIHNpemVvZihyZWdzKSk7Ci0gICAgcmVncy5lYXggPSAweDRGMDc7Ci0gICAgcmVncy5lYnggPSB3YWl0VlJUOwotICAgIHJlZ3MuZWN4ID0geDsKLSAgICByZWdzLmVkeCA9IHk7Ci0gICAgRFBNSV9pbnQ4NigweDEwLCZyZWdzKTsKLX0KLQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZ2V0IHRoZSBmaWxlIGF0dHJpYnV0ZXMgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50IFBNQVBJIFBNX2dldEZpbGVBdHRyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzISAqLwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGdldCB0aGUgZmlsZSB0aW1lIGFuZCBkYXRlIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZ2V0RmlsZVRpbWUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgaWJvb2wgZ21UaW1lLAotICAgIFBNX3RpbWUgKnRpbWUpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMhICovCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIHNldCB0aGUgZmlsZSB0aW1lIGFuZCBkYXRlIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fc2V0RmlsZVRpbWUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgaWJvb2wgZ21UaW1lLAotICAgIFBNX3RpbWUgKnRpbWUpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMhICovCi0gICAgcmV0dXJuIGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL3BtZG9zLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvcG1kb3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVjYzJkYS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvcG1kb3MuYworKysgL2Rldi9udWxsCkBAIC0xLDE2MzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMTYvMzIgYml0IERPUwotKgotKiBEZXNjcmlwdGlvbjogIEltcGxlbWVudGF0aW9uIGZvciB0aGUgT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5LCB3aGljaAotKiAgICAgICAgICAgICAgIGNvbnRhaW5zIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQgT1Mgc3BlY2lmaWMgc2VydmljZXMgaW4gYQotKiAgICAgICAgICAgICAgIGdlbmVyaWMsIGNyb3NzIHBsYXRmb3JtIEFQSS4gUG9ydGluZyB0aGUgT1MgUG9ydGFiaWxpdHkKLSogICAgICAgICAgICAgICBNYW5hZ2VyIGxpYnJhcnkgaXMgdGhlIGZpcnN0IHN0ZXAgdG8gcG9ydGluZyBhbnkgU2NpVGVjaAotKiAgICAgICAgICAgICAgIHByb2R1Y3RzIHRvIGEgbmV3IHBsYXRmb3JtLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxkb3MuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBSRUFMTU9ERQotc3RhdGljIGludCAgZ2xvYmFsRGF0YVN0YXJ0OwotI2VuZGlmCi0KLVBNX2NyaXRpY2FsSGFuZGxlciAgX1ZBUkFQSSBfUE1fY3JpdEhhbmRsZXIgPSBOVUxMOwotUE1fYnJlYWtIYW5kbGVyICAgICBfVkFSQVBJIF9QTV9icmVha0hhbmRsZXIgPSBOVUxMOwotUE1faW50SGFuZGxlciAgICAgICBfVkFSQVBJIF9QTV90aW1lckhhbmRsZXIgPSBOVUxMOwotUE1faW50SGFuZGxlciAgICAgICBfVkFSQVBJIF9QTV9ydGNIYW5kbGVyID0gTlVMTDsKLVBNX2ludEhhbmRsZXIgICAgICAgX1ZBUkFQSSBfUE1fa2V5SGFuZGxlciA9IE5VTEw7Ci1QTV9rZXkxNUhhbmRsZXIgICAgIF9WQVJBUEkgX1BNX2tleTE1SGFuZGxlciA9IE5VTEw7Ci1QTV9tb3VzZUhhbmRsZXIgICAgIF9WQVJBUEkgX1BNX21vdXNlSGFuZGxlciA9IE5VTEw7Ci1QTV9pbnRIYW5kbGVyICAgICAgIF9WQVJBUEkgX1BNX2ludDEwSGFuZGxlciA9IE5VTEw7Ci1pbnQgICAgICAgICAgICAgICAgIF9WQVJBUEkgX1BNX21vdXNlTWFzazsKLQotdWNoYXIgKiAgICAgX1ZBUkFQSSBfUE1fY3RybENQdHI7ICAgICAgICAgICAgICAgLyogTG9jYXRpb24gb2YgQ3RybC1DIGZsYWcgICAgICAqLwotdWNoYXIgKiAgICAgX1ZBUkFQSSBfUE1fY3RybEJQdHI7ICAgICAgICAgICAgICAgLyogTG9jYXRpb24gb2YgQ3RybC1CcmVhayBmbGFnICAqLwotdWNoYXIgKiAgICAgX1ZBUkFQSSBfUE1fY3JpdFB0cjsgICAgICAgICAgICAgICAgLyogTG9jYXRpb24gb2YgQ3JpdGljYWwgZXJyb3IgQmYqLwotUE1GQVJQVFIgICAgX1ZBUkFQSSBfUE1fcHJldlRpbWVyID0gUE1OVUxMOyAgICAgLyogUHJldmlvdXMgdGltZXIgaGFuZGxlciAgICAgICAqLwotUE1GQVJQVFIgICAgX1ZBUkFQSSBfUE1fcHJldlJUQyA9IFBNTlVMTDsgICAgICAgLyogUHJldmlvdXMgUlRDIGhhbmRsZXIgICAgICAgICAqLwotUE1GQVJQVFIgICAgX1ZBUkFQSSBfUE1fcHJldktleSA9IFBNTlVMTDsgICAgICAgLyogUHJldmlvdXMga2V5IGhhbmRsZXIgICAgICAgICAqLwotUE1GQVJQVFIgICAgX1ZBUkFQSSBfUE1fcHJldktleTE1ID0gUE1OVUxMOyAgICAgLyogUHJldmlvdXMga2V5MTUgaGFuZGxlciAgICAgICAqLwotUE1GQVJQVFIgICAgX1ZBUkFQSSBfUE1fcHJldkJyZWFrID0gUE1OVUxMOyAgICAgLyogUHJldmlvdXMgYnJlYWsgaGFuZGxlciAgICAgICAqLwotUE1GQVJQVFIgICAgX1ZBUkFQSSBfUE1fcHJldkN0cmxDID0gUE1OVUxMOyAgICAgLyogUHJldmlvdXMgQ3RybEMgaGFuZGxlciAgICAgICAqLwotUE1GQVJQVFIgICAgX1ZBUkFQSSBfUE1fcHJldkNyaXRpY2FsID0gUE1OVUxMOyAgLyogUHJldmlvdXMgY3JpdGljYWwgaGFuZGxlciAgICAqLwotbG9uZyAgICAgICAgX1ZBUkFQSSBfUE1fcHJldlJlYWxUaW1lcjsgICAgICAgICAgLyogUHJldmlvdXMgcmVhbCBtb2RlIHRpbWVyICAgICAqLwotbG9uZyAgICAgICAgX1ZBUkFQSSBfUE1fcHJldlJlYWxSVEM7ICAgICAgICAgICAgLyogUHJldmlvdXMgcmVhbCBtb2RlIFJUQyAgICAgICAqLwotbG9uZyAgICAgICAgX1ZBUkFQSSBfUE1fcHJldlJlYWxLZXk7ICAgICAgICAgICAgLyogUHJldmlvdXMgcmVhbCBtb2RlIGtleSAgICAgICAqLwotbG9uZyAgICAgICAgX1ZBUkFQSSBfUE1fcHJldlJlYWxLZXkxNTsgICAgICAgICAgLyogUHJldmlvdXMgcmVhbCBtb2RlIGtleTE1ICAgICAqLwotbG9uZyAgICAgICAgX1ZBUkFQSSBfUE1fcHJldlJlYWxJbnQxMDsgICAgICAgICAgLyogUHJldmlvdXMgcmVhbCBtb2RlIGludCAxMGggICAqLwotc3RhdGljIHVjaGFyICAgICAgICBfUE1fb2xkQ01PU1JlZ0E7ICAgICAgICAgICAgLyogQ01PUyByZWdpc3RlciBBIGNvbnRlbnRzICAgICAqLwotc3RhdGljIHVjaGFyICAgICAgICBfUE1fb2xkQ01PU1JlZ0I7ICAgICAgICAgICAgLyogQ01PUyByZWdpc3RlciBCIGNvbnRlbnRzICAgICAqLwotc3RhdGljIHVjaGFyICAgICAgICBfUE1fb2xkUlRDUElDMjsgICAgICAgICAgICAgLyogTWFzayB2YWx1ZSBmb3IgUlRDIElSUTggICAgICAqLwotCi0vKiBTdHJ1Y3R1cmUgdG8gbWFpbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgaGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXJzLAotICogaW5jbHVkZSBhIGNvcHkgb2YgdGhlIGhhcmR3YXJlIElSUSBhc3NlbWJsZXIgdGh1bmsgKG9uZSBmb3IgZWFjaAotICogaG9va2VkIGludGVycnVwdCBoYW5kbGVyKS4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWNoYXIgICAgICAgSVJROwotICAgIHVjaGFyICAgICAgIElSUVZlY3Q7Ci0gICAgdWNoYXIgICAgICAgcHJldlBJQzsKLSAgICB1Y2hhciAgICAgICBwcmV2UElDMjsKLSAgICBQTUZBUlBUUiAgICBwcmV2SGFuZGxlcjsKLSAgICBsb25nICAgICAgICBwcmV2UmVhbGhhbmRsZXI7Ci0gICAgdWNoYXIgICAgICAgdGh1bmtbMV07Ci0gICAgLyogSVJRIGFzc2VtYmxlciB0aHVuayBmb2xsb3dzIC4uLiAqLwotICAgIH0gX1BNX0lSUUhhbmRsZTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR2xvYmFscyBmb3IgbG9ja2luZyBpbnRlcnJ1cHQgaGFuZGxlcnMgaW4gX3BtZG9zLmFzbSAqLwotCi0jaWZuZGVmIFJFQUxNT0RFCi1leHRlcm4gaW50ICBfVkFSQVBJIF9QTV9wbWRvc0RhdGFTdGFydDsKLWV4dGVybiBpbnQgIF9WQVJBUEkgX1BNX3BtZG9zRGF0YUVuZDsKLWV4dGVybiBpbnQgIF9WQVJBUEkgX1BNX0RNQURhdGFTdGFydDsKLWV4dGVybiBpbnQgIF9WQVJBUEkgX1BNX0RNQURhdGFFbmQ7Ci12b2lkIF9BU01BUEkgX1BNX3BtZG9zQ29kZVN0YXJ0KHZvaWQpOwotdm9pZCBfQVNNQVBJIF9QTV9wbWRvc0NvZGVFbmQodm9pZCk7Ci12b2lkIF9BU01BUEkgX1BNX0RNQUNvZGVTdGFydCh2b2lkKTsKLXZvaWQgX0FTTUFQSSBfUE1fRE1BQ29kZUVuZCh2b2lkKTsKLSNlbmRpZgotCi0vKiBQcm90ZWN0ZWQgbW9kZSBpbnRlcnJ1cHQgaGFuZGxlcnMsIGFsc28gY2FsbGVkIGJ5IFBNIGNhbGxiYWNrcyBiZWxvdyAqLwotCi12b2lkIF9BU01BUEkgX1BNX3RpbWVySVNSKHZvaWQpOwotdm9pZCBfQVNNQVBJIF9QTV9ydGNJU1Iodm9pZCk7Ci12b2lkIF9BU01BUEkgX1BNX2lycUlTUlRlbXBsYXRlKHZvaWQpOwotdm9pZCBfQVNNQVBJIF9QTV9pcnFJU1JUZW1wbGF0ZUVuZCh2b2lkKTsKLXZvaWQgX0FTTUFQSSBfUE1fa2V5SVNSKHZvaWQpOwotdm9pZCBfQVNNQVBJIF9QTV9rZXkxNUlTUih2b2lkKTsKLXZvaWQgX0FTTUFQSSBfUE1fYnJlYWtJU1Iodm9pZCk7Ci12b2lkIF9BU01BUEkgX1BNX2N0cmxDSVNSKHZvaWQpOwotdm9pZCBfQVNNQVBJIF9QTV9jcml0aWNhbElTUih2b2lkKTsKLXZvaWQgX0FTTUFQSSBfUE1fbW91c2VJU1Iodm9pZCk7Ci12b2lkIF9BU01BUEkgX1BNX2ludDEwUE1DQih2b2lkKTsKLQotLyogUHJvdGVjdGVkIG1vZGUgRFBNSSBjYWxsYmFjayBoYW5kbGVycyAqLwotCi12b2lkIF9BU01BUEkgX1BNX21vdXNlUE1DQih2b2lkKTsKLQotLyogUm91dGluZSB0byBpbnN0YWxsIGEgbW91c2UgaGFuZGxlciBmdW5jdGlvbiAqLwotCi12b2lkIF9BU01BUEkgX1BNX3NldE1vdXNlSGFuZGxlcihpbnQgbWFzayk7Ci0KLS8qIFJvdXRpbmUgdG8gYWxsb2NhdGUgRFBNSSByZWFsIG1vZGUgY2FsbGJhY2sgcm91dGluZXMgKi8KLQotaWJvb2wgX0FTTUFQSSBfRFBNSV9hbGxvY2F0ZUNhbGxiYWNrKHZvaWQgKF9BU01BUEkgKnBtY29kZSkoKSx2b2lkICpybXJlZ3MsbG9uZyAqUk1DQik7Ci12b2lkIF9BU01BUEkgX0RQTUlfZnJlZUNhbGxiYWNrKGxvbmcgUk1DQik7Ci0KLS8qIERQTUkgaGVscGVyIGZ1bmN0aW9ucyBpbiBQTUxJVEUuQyAqLwotCi11bG9uZyAgIFBNQVBJIERQTUlfbWFwUGh5c2ljYWxUb0xpbmVhcih1bG9uZyBwaHlzQWRkcix1bG9uZyBsaW1pdCk7Ci1pbnQgICAgIFBNQVBJIERQTUlfc2V0U2VsZWN0b3JCYXNlKHVzaG9ydCBzZWwsdWxvbmcgbGluQWRkcik7Ci11bG9uZyAgIFBNQVBJIERQTUlfZ2V0U2VsZWN0b3JCYXNlKHVzaG9ydCBzZWwpOwotaW50ICAgICBQTUFQSSBEUE1JX3NldFNlbGVjdG9yTGltaXQodXNob3J0IHNlbCx1bG9uZyBsaW1pdCk7Ci11aW50ICAgIFBNQVBJIERQTUlfY3JlYXRlU2VsZWN0b3IodWxvbmcgYmFzZSx1bG9uZyBsaW1pdCk7Ci12b2lkICAgIFBNQVBJIERQTUlfZnJlZVNlbGVjdG9yKHVpbnQgc2VsKTsKLWludCAgICAgUE1BUEkgRFBNSV9sb2NrTGluZWFyUGFnZXModWxvbmcgbGluZWFyLHVsb25nIGxlbik7Ci1pbnQgICAgIFBNQVBJIERQTUlfdW5sb2NrTGluZWFyUGFnZXModWxvbmcgbGluZWFyLHVsb25nIGxlbik7Ci0KLS8qIEZ1bmN0aW9ucyB0byByZWFkIGFuZCB3cml0ZSBDTU9TIHJlZ2lzdGVycyAqLwotCi11Y2hhciAgIFBNQVBJIF9QTV9yZWFkQ01PUyhpbnQgaW5kZXgpOwotdm9pZCAgICBQTUFQSSBfUE1fd3JpdGVDTU9TKGludCBpbmRleCx1Y2hhciB2YWx1ZSk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBHZW5lcmljIHJvdXRpbmVzIGNvbW1vbiB0byBhbGwgZW52aXJvbm1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBQTUFQSSBQTV9yZXNldE1vdXNlRHJpdmVyKGludCBoYXJkUmVzZXQpCi17Ci0gICAgUk1SRUdTICAgICAgICAgIHJlZ3M7Ci0gICAgUE1fbW91c2VIYW5kbGVyIG9sZEhhbmRsZXIgPSBfUE1fbW91c2VIYW5kbGVyOwotCi0gICAgUE1fcmVzdG9yZU1vdXNlSGFuZGxlcigpOwotICAgIHJlZ3MueC5heCA9IGhhcmRSZXNldCA/IDAgOiAzMzsKLSAgICBQTV9pbnQ4NigweDMzLCAmcmVncywgJnJlZ3MpOwotICAgIGlmIChvbGRIYW5kbGVyKQotCVBNX3NldE1vdXNlSGFuZGxlcihfUE1fbW91c2VNYXNrLCBvbGRIYW5kbGVyKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KGludCBmcmVxdWVuY3kpCi17Ci0gICAgc3RhdGljIHNob3J0IGNvbnZlcnRbXSA9IHsKLQk4MTkyLAotCTQwOTYsCi0JMjA0OCwKLQkxMDI0LAotCTUxMiwKLQkyNTYsCi0JMTI4LAotCTY0LAotCTMyLAotCTE2LAotCTgsCi0JNCwKLQkyLAotCS0xLAotCX07Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBGaXJzdCBjbGVhciBhbnkgcGVuZGluZyBSVEMgdGltZW91dCBpZiBub3QgY2xlYXJlZCAqLwotICAgIF9QTV9yZWFkQ01PUygweDBDKTsKLSAgICBpZiAoZnJlcXVlbmN5ID09IDApIHsKLQkvKiBEaXNhYmxlIFJUQyB0aW1vdXQgKi8KLQlfUE1fd3JpdGVDTU9TKDB4MEEsX1BNX29sZENNT1NSZWdBKTsKLQlfUE1fd3JpdGVDTU9TKDB4MEIsX1BNX29sZENNT1NSZWdCICYgMHgwRik7Ci0JfQotICAgIGVsc2UgewotCS8qIENvbnZlcnQgZnJlcXVlbmN5IHZhbHVlIHRvIFJUQyBjbG9jayBpbmRleGVzICovCi0JZm9yIChpID0gMDsgY29udmVydFtpXSAhPSAtMTsgaSsrKSB7Ci0JICAgIGlmIChjb252ZXJ0W2ldID09IGZyZXF1ZW5jeSkKLQkJYnJlYWs7Ci0JICAgIH0KLQotCS8qIFNldCBSVEMgdGltb3V0IHZhbHVlIGFuZCBlbmFibGUgdGltZW91dCAqLwotCV9QTV93cml0ZUNNT1MoMHgwQSwweDIwIHwgKGkrMykpOwotCV9QTV93cml0ZUNNT1MoMHgwQiwoX1BNX29sZENNT1NSZWdCICYgMHgwRikgfCAweDQwKTsKLQl9Ci19Ci0KLSNpZm5kZWYgUkVBTE1PREUKLQotc3RhdGljIHZvaWQgUE1BUEkgbG9ja1BNSGFuZGxlcnModm9pZCkKLXsKLSAgICBzdGF0aWMgaW50ICAgICAgbG9ja2VkID0gMDsKLSAgICBpbnQgICAgICAgICAgICAgc3RhdDsKLSAgICBQTV9sb2NrSGFuZGxlICAgbGg7IC8qIFVudXNlZCBpbiBET1MgKi8KLQotICAgIC8qIExvY2sgYWxsIG9mIHRoZSBjb2RlIGFuZCBkYXRhIHVzZWQgYnkgb3VyIHByb3RlY3RlZCBtb2RlIGludGVycnVwdAotICAgICAqIGhhbmRsaW5nIHJvdXRpbmVzLCBzbyB0aGF0IGl0IHdpbGwgY29udGludWUgdG8gd29yayBjb3JyZWN0bHkKLSAgICAgKiB1bmRlciByZWFsIG1vZGUuCi0gICAgICovCi0gICAgaWYgKCFsb2NrZWQpIHsKLQlQTV9zYXZlRFMoKTsKLQlzdGF0ICA9ICFQTV9sb2NrRGF0YVBhZ2VzKCZnbG9iYWxEYXRhU3RhcnQtMjA0OCw0MDk2LCZsaCk7Ci0Jc3RhdCB8PSAhUE1fbG9ja0RhdGFQYWdlcygmX1BNX3BtZG9zRGF0YVN0YXJ0LChpbnQpJl9QTV9wbWRvc0RhdGFFbmQgLSAoaW50KSZfUE1fcG1kb3NEYXRhU3RhcnQsJmxoKTsKLQlzdGF0IHw9ICFQTV9sb2NrQ29kZVBhZ2VzKChfX2NvZGVQdHIpX1BNX3BtZG9zQ29kZVN0YXJ0LChpbnQpX1BNX3BtZG9zQ29kZUVuZC0oaW50KV9QTV9wbWRvc0NvZGVTdGFydCwmbGgpOwotCXN0YXQgfD0gIVBNX2xvY2tEYXRhUGFnZXMoJl9QTV9ETUFEYXRhU3RhcnQsKGludCkmX1BNX0RNQURhdGFFbmQgLSAoaW50KSZfUE1fRE1BRGF0YVN0YXJ0LCZsaCk7Ci0Jc3RhdCB8PSAhUE1fbG9ja0NvZGVQYWdlcygoX19jb2RlUHRyKV9QTV9ETUFDb2RlU3RhcnQsKGludClfUE1fRE1BQ29kZUVuZC0oaW50KV9QTV9ETUFDb2RlU3RhcnQsJmxoKTsKLQlpZiAoc3RhdCkgewotCSAgICBwcmludGYoIlBhZ2UgbG9ja2luZyBzZXJ2aWNlcyBmYWlsZWQgLSBpbnRlcnJ1cHQgaGFuZGxpbmcgbm90IHNhZmUhXG4iKTsKLQkgICAgZXhpdCgxKTsKLQkgICAgfQotCWxvY2tlZCA9IDE7Ci0JfQotfQotCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIERPUyBSZWFsIE1vZGUgc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgUkVBTE1PREUKLQotI2lmbmRlZiBNS19GUAotI2RlZmluZSBNS19GUChzLG8pICAoICh2b2lkIGZhciAqKSggKCh1bG9uZykocykgPDwgMTYpICsgXAotCQkgICAgKHVsb25nKShvKSApKQotI2VuZGlmCi0KLWludCBQTUFQSSBQTV9zZXRNb3VzZUhhbmRsZXIoaW50IG1hc2ssIFBNX21vdXNlSGFuZGxlciBtaCkKLXsKLSAgICBQTV9zYXZlRFMoKTsKLSAgICBfUE1fbW91c2VIYW5kbGVyID0gbWg7Ci0gICAgX1BNX3NldE1vdXNlSGFuZGxlcihfUE1fbW91c2VNYXNrID0gbWFzayk7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZU1vdXNlSGFuZGxlcih2b2lkKQotewotICAgIHVuaW9uIFJFR1MgICAgICByZWdzOwotCi0gICAgaWYgKF9QTV9tb3VzZUhhbmRsZXIpIHsKLQlyZWdzLnguYXggPSAzMzsKLQlpbnQ4NigweDMzLCAmcmVncywgJnJlZ3MpOwotCV9QTV9tb3VzZUhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRUaW1lckhhbmRsZXIoUE1faW50SGFuZGxlciB0aCkKLXsKLSAgICBfUE1fZ2V0Uk12ZWN0KDB4OCwgKGxvbmcqKSZfUE1fcHJldlRpbWVyKTsKLSAgICBfUE1fdGltZXJIYW5kbGVyID0gdGg7Ci0gICAgX1BNX3NldFJNdmVjdCgweDgsIChsb25nKV9QTV90aW1lcklTUik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZVRpbWVySGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fdGltZXJIYW5kbGVyKSB7Ci0JX1BNX3NldFJNdmVjdCgweDgsIChsb25nKV9QTV9wcmV2VGltZXIpOwotCV9QTV90aW1lckhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotaWJvb2wgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0hhbmRsZXIoUE1faW50SGFuZGxlciB0aCxpbnQgZnJlcXVlbmN5KQotewotICAgIC8qIFNhdmUgdGhlIG9sZCBDTU9TIHJlYWwgdGltZSBjbG9jayB2YWx1ZXMgKi8KLSAgICBfUE1fb2xkQ01PU1JlZ0EgPSBfUE1fcmVhZENNT1MoMHgwQSk7Ci0gICAgX1BNX29sZENNT1NSZWdCID0gX1BNX3JlYWRDTU9TKDB4MEIpOwotCi0gICAgLyogU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgaW50ZXJydXB0IGhhbmRsZXIgKi8KLSAgICBfUE1fZ2V0Uk12ZWN0KDB4NzAsIChsb25nKikmX1BNX3ByZXZSVEMpOwotICAgIF9QTV9ydGNIYW5kbGVyID0gdGg7Ci0gICAgX1BNX3NldFJNdmVjdCgweDcwLCAobG9uZylfUE1fcnRjSVNSKTsKLQotICAgIC8qIFByb2dyYW0gdGhlIHJlYWwgdGltZSBjbG9jayBkZWZhdWx0IGZyZXF1ZW5jeSAqLwotICAgIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3koZnJlcXVlbmN5KTsKLQotICAgIC8qIFVubWFzayBJUlE4IGluIHRoZSBQSUMyICovCi0gICAgX1BNX29sZFJUQ1BJQzIgPSBQTV9pbnBiKDB4QTEpOwotICAgIFBNX291dHBiKDB4QTEsX1BNX29sZFJUQ1BJQzIgJiAweEZFKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlUmVhbFRpbWVDbG9ja0hhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX3J0Y0hhbmRsZXIpIHsKLQkvKiBSZXN0b3JlIENNT1MgcmVnaXN0ZXJzIGFuZCBtYXNrIFJUQyBjbG9jayAqLwotCV9QTV93cml0ZUNNT1MoMHgwQSxfUE1fb2xkQ01PU1JlZ0EpOwotCV9QTV93cml0ZUNNT1MoMHgwQixfUE1fb2xkQ01PU1JlZ0IpOwotCVBNX291dHBiKDB4QTEsKFBNX2lucGIoMHhBMSkgJiAweEZFKSB8IChfUE1fb2xkUlRDUElDMiAmIH4weEZFKSk7Ci0KLQkvKiBSZXN0b3JlIHRoZSBpbnRlcnJ1cHQgdmVjdG9yICovCi0JX1BNX3NldFJNdmVjdCgweDcwLCAobG9uZylfUE1fcHJldlJUQyk7Ci0JX1BNX3J0Y0hhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRLZXlIYW5kbGVyKFBNX2ludEhhbmRsZXIga2gpCi17Ci0gICAgX1BNX2dldFJNdmVjdCgweDksIChsb25nKikmX1BNX3ByZXZLZXkpOwotICAgIF9QTV9rZXlIYW5kbGVyID0ga2g7Ci0gICAgX1BNX3NldFJNdmVjdCgweDksIChsb25nKV9QTV9rZXlJU1IpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVLZXlIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9rZXlIYW5kbGVyKSB7Ci0JX1BNX3NldFJNdmVjdCgweDksIChsb25nKV9QTV9wcmV2S2V5KTsKLQlfUE1fa2V5SGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi12b2lkIFBNQVBJIFBNX3NldEtleTE1SGFuZGxlcihQTV9rZXkxNUhhbmRsZXIga2gpCi17Ci0gICAgX1BNX2dldFJNdmVjdCgweDE1LCAobG9uZyopJl9QTV9wcmV2S2V5MTUpOwotICAgIF9QTV9rZXkxNUhhbmRsZXIgPSBraDsKLSAgICBfUE1fc2V0Uk12ZWN0KDB4MTUsIChsb25nKV9QTV9rZXkxNUlTUik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUtleTE1SGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fa2V5MTVIYW5kbGVyKSB7Ci0JX1BNX3NldFJNdmVjdCgweDE1LCAobG9uZylfUE1fcHJldktleTE1KTsKLQlfUE1fa2V5MTVIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLXZvaWQgUE1BUEkgUE1faW5zdGFsbEFsdEJyZWFrSGFuZGxlcihQTV9icmVha0hhbmRsZXIgYmgpCi17Ci0gICAgc3RhdGljIGludCAgY3RybENGbGFnLGN0cmxCRmxhZzsKLQotICAgIF9QTV9jdHJsQ1B0ciA9ICh1Y2hhciopJmN0cmxDRmxhZzsKLSAgICBfUE1fY3RybEJQdHIgPSAodWNoYXIqKSZjdHJsQkZsYWc7Ci0gICAgX1BNX2dldFJNdmVjdCgweDFCLCAobG9uZyopJl9QTV9wcmV2QnJlYWspOwotICAgIF9QTV9nZXRSTXZlY3QoMHgyMywgKGxvbmcqKSZfUE1fcHJldkN0cmxDKTsKLSAgICBfUE1fYnJlYWtIYW5kbGVyID0gYmg7Ci0gICAgX1BNX3NldFJNdmVjdCgweDFCLCAobG9uZylfUE1fYnJlYWtJU1IpOwotICAgIF9QTV9zZXRSTXZlY3QoMHgyMywgKGxvbmcpX1BNX2N0cmxDSVNSKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9pbnN0YWxsQnJlYWtIYW5kbGVyKHZvaWQpCi17Ci0gICAgUE1faW5zdGFsbEFsdEJyZWFrSGFuZGxlcihOVUxMKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlQnJlYWtIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9wcmV2QnJlYWspIHsKLQlfUE1fc2V0Uk12ZWN0KDB4MUIsIChsb25nKV9QTV9wcmV2QnJlYWspOwotCV9QTV9zZXRSTXZlY3QoMHgyMywgKGxvbmcpX1BNX3ByZXZDdHJsQyk7Ci0JX1BNX3ByZXZCcmVhayA9IE5VTEw7Ci0JX1BNX2JyZWFrSGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi12b2lkIFBNQVBJIFBNX2luc3RhbGxBbHRDcml0aWNhbEhhbmRsZXIoUE1fY3JpdGljYWxIYW5kbGVyIGNoKQotewotICAgIHN0YXRpYyAgc2hvcnQgY3JpdEJ1ZlsyXTsKLQotICAgIF9QTV9jcml0UHRyID0gKHVjaGFyKiljcml0QnVmOwotICAgIF9QTV9nZXRSTXZlY3QoMHgyNCwgKGxvbmcqKSZfUE1fcHJldkNyaXRpY2FsKTsKLSAgICBfUE1fY3JpdEhhbmRsZXIgPSBjaDsKLSAgICBfUE1fc2V0Uk12ZWN0KDB4MjQsIChsb25nKV9QTV9jcml0aWNhbElTUik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1faW5zdGFsbENyaXRpY2FsSGFuZGxlcih2b2lkKQotewotICAgIFBNX2luc3RhbGxBbHRDcml0aWNhbEhhbmRsZXIoTlVMTCk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUNyaXRpY2FsSGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fcHJldkNyaXRpY2FsKSB7Ci0JX1BNX3NldFJNdmVjdCgweDI0LCAobG9uZylfUE1fcHJldkNyaXRpY2FsKTsKLQlfUE1fcHJldkNyaXRpY2FsID0gTlVMTDsKLQlfUE1fY3JpdEhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotaW50IFBNQVBJIFBNX2xvY2tEYXRhUGFnZXModm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBwID0gcDsgIGxlbiA9IGxlbjsgICAgICAvKiBEbyBub3RoaW5nIGZvciByZWFsIG1vZGUgKi8KLSAgICByZXR1cm4gMTsKLX0KLQotaW50IFBNQVBJIFBNX3VubG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIHAgPSBwOyAgbGVuID0gbGVuOyAgICAgIC8qIERvIG5vdGhpbmcgZm9yIHJlYWwgbW9kZSAqLwotICAgIHJldHVybiAxOwotfQotCi1pbnQgUE1BUEkgUE1fbG9ja0NvZGVQYWdlcyh2b2lkICgqcCkoKSx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBwID0gcDsgIGxlbiA9IGxlbjsgICAgICAvKiBEbyBub3RoaW5nIGZvciByZWFsIG1vZGUgKi8KLSAgICByZXR1cm4gMTsKLX0KLQotaW50IFBNQVBJIFBNX3VubG9ja0NvZGVQYWdlcyh2b2lkICgqcCkoKSx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBwID0gcDsgIGxlbiA9IGxlbjsgICAgICAvKiBEbyBub3RoaW5nIGZvciByZWFsIG1vZGUgKi8KLSAgICByZXR1cm4gMTsKLX0KLQotdm9pZCBQTUFQSSBQTV9nZXRQTXZlY3QoaW50IGludG5vLCBQTUZBUlBUUiAqaXNyKQotewotICAgIGxvbmcgdDsKLSAgICBfUE1fZ2V0Uk12ZWN0KGludG5vLCZ0KTsKLSAgICAqaXNyID0gKHZvaWQqKXQ7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0UE12ZWN0KGludCBpbnRubywgUE1faW50SGFuZGxlciBpc3IpCi17Ci0gICAgUE1fc2F2ZURTKCk7Ci0gICAgX1BNX3NldFJNdmVjdChpbnRubywobG9uZylpc3IpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVQTXZlY3QoaW50IGludG5vLCBQTUZBUlBUUiBpc3IpCi17Ci0gICAgX1BNX3NldFJNdmVjdChpbnRubywobG9uZylpc3IpOwotfQotCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIFBoYXIgTGFwIFROVCBET1MgRXh0ZW5kZXIgc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgVE5UCi0KLSNpbmNsdWRlIDxwbGRvczMyLmg+Ci0jaW5jbHVkZSA8cGhhcmxhcC5oPgotI2luY2x1ZGUgPGh3Mzg2Lmg+Ci0KLXN0YXRpYyBsb25nIHByZXZSZWFsQnJlYWs7ICAgICAgLyogUHJldmlvdXMgcmVhbCBtb2RlIGJyZWFrIGhhbmRsZXIgICAgICovCi1zdGF0aWMgbG9uZyBwcmV2UmVhbEN0cmxDOyAgICAgIC8qIFByZXZpb3VzIHJlYWwgbW9kZSBDdHJsQyBoYW5kbGVyICAgICAqLwotc3RhdGljIGxvbmcgcHJldlJlYWxDcml0aWNhbDsgICAvKiBQcmV2IHJlYWwgbW9kZSBjcml0aWNhbCBoYW5kbGVyICAgICAgKi8KLXN0YXRpYyB1Y2hhciAqbW91c2VQdHI7Ci0KLS8qIFRoZSBmb2xsb3dpbmcgcmVhbCBtb2RlIHJvdXRpbmUgaXMgdXNlZCB0byBjYWxsIGEgMzIgYml0IHByb3RlY3RlZAotICogbW9kZSBGQVIgZnVuY3Rpb24gZnJvbSByZWFsIG1vZGUuIFdlIHVzZSB0aGlzIGZvciBwYXNzaW5nIHVwIGNvbnRyb2wKLSAqIGZyb20gdGhlIHJlYWwgbW9kZSBtb3VzZSBjYWxsYmFjayB0byBvdXIgcHJvdGVjdGVkIG1vZGUgY29kZS4KLSAqLwotCi1zdGF0aWMgVUNIQVIgcmVhbEhhbmRsZXJbXSA9IHsgICAgICAvKiBSZWFsIG1vZGUgY29kZSBnZW5lcmljIGhhbmRsZXIgICAqLwotICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsICAgICAgICAgICAgLyogX19QTV9jYWxsUHJvdHAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAweDAwLDB4MDAsICAgICAgICAgICAgICAgICAgICAgIC8qIF9fUE1fcHJvdENTICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHgwMCwweDAwLDB4MDAsMHgwMCwgICAgICAgICAgICAvKiBfX1BNX3Byb3RIYW5kbGVyICAgICAgICAgICAgICAgICAqLwotICAgIDB4NjYsMHg2MCwgICAgICAgICAgICAgICAgICAgICAgLyogIHB1c2hhZCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAweDFFLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBwdXNoICAgIGRzICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHg2QSwweDAwLCAgICAgICAgICAgICAgICAgICAgICAvKiAgcHVzaCAgICAwICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIDB4NkEsMHgwMCwgICAgICAgICAgICAgICAgICAgICAgLyogIHB1c2ggICAgMCAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAweDJFLDB4RkYsMHgzNiwweDA0LDB4MDAsICAgICAgIC8qICBwdXNoICAgIFtjczpfX1BNX3Byb3RDU10gICAgICAgICovCi0gICAgMHg2NiwweDJFLDB4RkYsMHgzNiwweDA2LDB4MDAsICAvKiAgcHVzaCAgICBbY3M6X19QTV9wcm90SGFuZGxlcl0gICAqLwotICAgIDB4MkUsMHhGRiwweDFFLDB4MDAsMHgwMCwgICAgICAgLyogIGNhbGwgICAgW2NzOl9fUE1fY2FsbFByb3RwXSAgICAgKi8KLSAgICAweDgzLDB4QzQsMHgwQSwgICAgICAgICAgICAgICAgIC8qICBhZGQgICAgIHNwLDEwICAgICAgICAgICAgICAgICAgICovCi0gICAgMHgxRiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgcG9wICAgICBkcyAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIDB4NjYsMHg2MSwgICAgICAgICAgICAgICAgICAgICAgLyogIHBvcGFkICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAweENCLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICByZXRmICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgfTsKLQotLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgaW5zdGFsbHMgdGhlIGFib3ZlIHJlYWxtb2RlIGNhbGxiYWNrIG1lY2hhbmlzbQotICogaW4gcmVhbCBtb2RlIG1lbW9yeSBmb3IgY2FsbGluZyB0aGUgcHJvdGVjdGVkIG1vZGUgcm91dGluZS4KLSAqLwotCi11Y2hhciAqIGluc3RhbGxDYWxsYmFjayh2b2lkIChQTUFQSSAqcG1DQikoKSx1aW50ICpyc2VnLCB1aW50ICpyb2ZmKQotewotICAgIENPTkZJR19JTkYgIGNvbmZpZzsKLSAgICBSRUFMUFRSICAgICByZWFsQnVmQWRyLGNhbGxQcm90cDsKLSAgICBVTE9ORyAgICAgICBidWZTaXplOwotICAgIEZBUlBUUiAgICAgIHByb3RCdWZBZHI7Ci0gICAgdWNoYXIgICAgICAgKnA7Ci0KLSAgICAvKiBHZXQgYWRkcmVzcyBvZiByZWFsIG1vZGUgcm91dGluZSB0byBjYWxsIHVwIHRvIHByb3RlY3RlZCBtb2RlICAgICovCi0gICAgX2R4X3JtbGlua19nZXQoJmNhbGxQcm90cCwgJnJlYWxCdWZBZHIsICZidWZTaXplLCAmcHJvdEJ1ZkFkcik7Ci0gICAgX2R4X2NvbmZpZ19pbmYoJmNvbmZpZywgKFVDSEFSKikmY29uZmlnKTsKLQotICAgIC8qIEZpbGwgaW4gdGhlIHZhbHVlcyBpbiB0aGUgcmVhbCBtb2RlIGNvZGUgc2VnbWVudCBzbyB0aGF0IGl0IHdpbGwKLSAgICAgKiBjYWxsIHRoZSBjb3JyZWN0IHJvdXRpbmUuCi0gICAgICovCi0gICAgKigoUkVBTFBUUiopJnJlYWxIYW5kbGVyWzBdKSA9IGNhbGxQcm90cDsKLSAgICAqKChVU0hPUlQqKSZyZWFsSGFuZGxlcls0XSkgPSBjb25maWcuY19jc19zZWw7Ci0gICAgKigoVUxPTkcqKSZyZWFsSGFuZGxlcls2XSkgPSAoVUxPTkcpcG1DQjsKLQotICAgIC8qIENvcHkgdGhlIHJlYWwgbW9kZSBoYW5kbGVyIHRvIHJlYWwgbW9kZSBtZW1vcnkgICAqLwotICAgIGlmICgocCA9IFBNX2FsbG9jUmVhbFNlZyhzaXplb2YocmVhbEhhbmRsZXIpLHJzZWcscm9mZikpID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0gICAgbWVtY3B5KHAscmVhbEhhbmRsZXIsc2l6ZW9mKHJlYWxIYW5kbGVyKSk7Ci0KLSAgICAvKiBTa2lwIHBhc3QgZ2xvYmFsIHZhcmlhYmxzIGluIHJlYWwgbW9kZSBjb2RlIHNlZ21lbnQgKi8KLSAgICAqcm9mZiArPSAweDBBOwotICAgIHJldHVybiBwOwotfQotCi1pbnQgUE1BUEkgUE1fc2V0TW91c2VIYW5kbGVyKGludCBtYXNrLCBQTV9tb3VzZUhhbmRsZXIgbWgpCi17Ci0gICAgUk1SRUdTICAgICAgcmVnczsKLSAgICBSTVNSRUdTICAgICBzcmVnczsKLSAgICB1aW50ICAgICAgICByc2VnLHJvZmY7Ci0KLSAgICBsb2NrUE1IYW5kbGVycygpOyAgICAgICAgICAgLyogRW5zdXJlIG91ciBoYW5kbGVycyBhcmUgbG9ja2VkICAgKi8KLQotICAgIGlmICgobW91c2VQdHIgPSBpbnN0YWxsQ2FsbGJhY2soX1BNX21vdXNlSVNSLCAmcnNlZywgJnJvZmYpKSA9PSBOVUxMKQotCXJldHVybiAwOwotICAgIF9QTV9tb3VzZUhhbmRsZXIgPSBtaDsKLQotICAgIC8qIEluc3RhbGwgdGhlIHJlYWwgbW9kZSBtb3VzZSBoYW5kbGVyICAqLwotICAgIHNyZWdzLmVzID0gcnNlZzsKLSAgICByZWdzLnguZHggPSByb2ZmOwotICAgIHJlZ3MueC5jeCA9IF9QTV9tb3VzZU1hc2sgPSBtYXNrOwotICAgIHJlZ3MueC5heCA9IDB4QzsKLSAgICBQTV9pbnQ4NngoMHgzMywgJnJlZ3MsICZyZWdzLCAmc3JlZ3MpOwotICAgIHJldHVybiAxOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVNb3VzZUhhbmRsZXIodm9pZCkKLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0KLSAgICBpZiAoX1BNX21vdXNlSGFuZGxlcikgewotCXJlZ3MueC5heCA9IDMzOwotCVBNX2ludDg2KDB4MzMsICZyZWdzLCAmcmVncyk7Ci0JUE1fZnJlZVJlYWxTZWcobW91c2VQdHIpOwotCV9QTV9tb3VzZUhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9nZXRQTXZlY3QoaW50IGludG5vLCBQTUZBUlBUUiAqaXNyKQotewotICAgIEZBUlBUUiAgcGg7Ci0KLSAgICBfZHhfcG1pdl9nZXQoaW50bm8sICZwaCk7Ci0gICAgaXNyLT5zZWwgPSBGUF9TRUwocGgpOwotICAgIGlzci0+b2ZmID0gRlBfT0ZGKHBoKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRQTXZlY3QoaW50IGludG5vLCBQTV9pbnRIYW5kbGVyIGlzcikKLXsKLSAgICBDT05GSUdfSU5GICBjb25maWc7Ci0gICAgRkFSUFRSICAgICAgcGg7Ci0KLSAgICBQTV9zYXZlRFMoKTsKLSAgICBfZHhfY29uZmlnX2luZigmY29uZmlnLCAoVUNIQVIqKSZjb25maWcpOwotICAgIEZQX1NFVChwaCwodWludClpc3IsY29uZmlnLmNfY3Nfc2VsKTsKLSAgICBfZHhfcG1pdl9zZXQoaW50bm8scGgpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVQTXZlY3QoaW50IGludG5vLCBQTUZBUlBUUiBpc3IpCi17Ci0gICAgRkFSUFRSICBwaDsKLQotICAgIEZQX1NFVChwaCxpc3Iub2ZmLGlzci5zZWwpOwotICAgIF9keF9wbWl2X3NldChpbnRubyxwaCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGdldElTUihpbnQgaW50bm8sIFBNRkFSUFRSICpwbWlzciwgbG9uZyAqcmVhbGlzcikKLXsKLSAgICBQTV9nZXRQTXZlY3QoaW50bm8scG1pc3IpOwotICAgIF9QTV9nZXRSTXZlY3QoaW50bm8sIHJlYWxpc3IpOwotfQotCi1zdGF0aWMgdm9pZCByZXN0b3JlSVNSKGludCBpbnRubywgUE1GQVJQVFIgcG1pc3IsIGxvbmcgcmVhbGlzcikKLXsKLSAgICBfUE1fc2V0Uk12ZWN0KGludG5vLHJlYWxpc3IpOwotICAgIFBNX3Jlc3RvcmVQTXZlY3QoaW50bm8scG1pc3IpOwotfQotCi1zdGF0aWMgdm9pZCBzZXRJU1IoaW50IGludG5vLCB2b2lkIChQTUFQSSAqaXNyKSgpKQotewotICAgIENPTkZJR19JTkYgIGNvbmZpZzsKLSAgICBGQVJQVFIgICAgICBwaDsKLQotICAgIGxvY2tQTUhhbmRsZXJzKCk7ICAgICAgICAgICAvKiBFbnN1cmUgb3VyIGhhbmRsZXJzIGFyZSBsb2NrZWQgICAqLwotCi0gICAgX2R4X2NvbmZpZ19pbmYoJmNvbmZpZywgKFVDSEFSKikmY29uZmlnKTsKLSAgICBGUF9TRVQocGgsKHVpbnQpaXNyLGNvbmZpZy5jX2NzX3NlbCk7Ci0gICAgX2R4X2FwbWl2X3NldChpbnRubyxwaCk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0VGltZXJIYW5kbGVyKFBNX2ludEhhbmRsZXIgdGgpCi17Ci0gICAgZ2V0SVNSKDB4OCwgJl9QTV9wcmV2VGltZXIsICZfUE1fcHJldlJlYWxUaW1lcik7Ci0gICAgX1BNX3RpbWVySGFuZGxlciA9IHRoOwotICAgIHNldElTUigweDgsIF9QTV90aW1lcklTUik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZVRpbWVySGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fdGltZXJIYW5kbGVyKSB7Ci0JcmVzdG9yZUlTUigweDgsIF9QTV9wcmV2VGltZXIsIF9QTV9wcmV2UmVhbFRpbWVyKTsKLQlfUE1fdGltZXJIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLWlib29sIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tIYW5kbGVyKFBNX2ludEhhbmRsZXIgdGgsaW50IGZyZXF1ZW5jeSkKLXsKLSAgICAvKiBTYXZlIHRoZSBvbGQgQ01PUyByZWFsIHRpbWUgY2xvY2sgdmFsdWVzICovCi0gICAgX1BNX29sZENNT1NSZWdBID0gX1BNX3JlYWRDTU9TKDB4MEEpOwotICAgIF9QTV9vbGRDTU9TUmVnQiA9IF9QTV9yZWFkQ01PUygweDBCKTsKLQotICAgIC8qIFNldCB0aGUgcmVhbCB0aW1lIGNsb2NrIGludGVycnVwdCBoYW5kbGVyICovCi0gICAgZ2V0SVNSKDB4NzAsICZfUE1fcHJldlJUQywgJl9QTV9wcmV2UmVhbFJUQyk7Ci0gICAgX1BNX3J0Y0hhbmRsZXIgPSB0aDsKLSAgICBzZXRJU1IoMHg3MCwgX1BNX3J0Y0lTUik7Ci0KLSAgICAvKiBQcm9ncmFtIHRoZSByZWFsIHRpbWUgY2xvY2sgZGVmYXVsdCBmcmVxdWVuY3kgKi8KLSAgICBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KGZyZXF1ZW5jeSk7Ci0KLSAgICAvKiBVbm1hc2sgSVJROCBpbiB0aGUgUElDMiAqLwotICAgIF9QTV9vbGRSVENQSUMyID0gUE1faW5wYigweEExKTsKLSAgICBQTV9vdXRwYigweEExLF9QTV9vbGRSVENQSUMyICYgMHhGRSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZVJlYWxUaW1lQ2xvY2tIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9ydGNIYW5kbGVyKSB7Ci0JLyogUmVzdG9yZSBDTU9TIHJlZ2lzdGVycyBhbmQgbWFzayBSVEMgY2xvY2sgKi8KLQlfUE1fd3JpdGVDTU9TKDB4MEEsX1BNX29sZENNT1NSZWdBKTsKLQlfUE1fd3JpdGVDTU9TKDB4MEIsX1BNX29sZENNT1NSZWdCKTsKLQlQTV9vdXRwYigweEExLChQTV9pbnBiKDB4QTEpICYgMHhGRSkgfCAoX1BNX29sZFJUQ1BJQzIgJiB+MHhGRSkpOwotCi0JLyogUmVzdG9yZSB0aGUgaW50ZXJydXB0IHZlY3RvciAqLwotCXJlc3RvcmVJU1IoMHg3MCwgX1BNX3ByZXZSVEMsIF9QTV9wcmV2UmVhbFJUQyk7Ci0JX1BNX3J0Y0hhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRLZXlIYW5kbGVyKFBNX2ludEhhbmRsZXIga2gpCi17Ci0gICAgZ2V0SVNSKDB4OSwgJl9QTV9wcmV2S2V5LCAmX1BNX3ByZXZSZWFsS2V5KTsKLSAgICBfUE1fa2V5SGFuZGxlciA9IGtoOwotICAgIHNldElTUigweDksIF9QTV9rZXlJU1IpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVLZXlIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9rZXlIYW5kbGVyKSB7Ci0JcmVzdG9yZUlTUigweDksIF9QTV9wcmV2S2V5LCBfUE1fcHJldlJlYWxLZXkpOwotCV9QTV9rZXlIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0S2V5MTVIYW5kbGVyKFBNX2tleTE1SGFuZGxlciBraCkKLXsKLSAgICBnZXRJU1IoMHgxNSwgJl9QTV9wcmV2S2V5MTUsICZfUE1fcHJldlJlYWxLZXkxNSk7Ci0gICAgX1BNX2tleTE1SGFuZGxlciA9IGtoOwotICAgIHNldElTUigweDE1LCBfUE1fa2V5MTVJU1IpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVLZXkxNUhhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX2tleTE1SGFuZGxlcikgewotCXJlc3RvcmVJU1IoMHgxNSwgX1BNX3ByZXZLZXkxNSwgX1BNX3ByZXZSZWFsS2V5MTUpOwotCV9QTV9rZXkxNUhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9pbnN0YWxsQWx0QnJlYWtIYW5kbGVyKFBNX2JyZWFrSGFuZGxlciBiaCkKLXsKLSAgICBzdGF0aWMgaW50ICBjdHJsQ0ZsYWcsY3RybEJGbGFnOwotCi0gICAgX1BNX2N0cmxDUHRyID0gKHVjaGFyKikmY3RybENGbGFnOwotICAgIF9QTV9jdHJsQlB0ciA9ICh1Y2hhciopJmN0cmxCRmxhZzsKLSAgICBnZXRJU1IoMHgxQiwgJl9QTV9wcmV2QnJlYWssICZwcmV2UmVhbEJyZWFrKTsKLSAgICBnZXRJU1IoMHgyMywgJl9QTV9wcmV2Q3RybEMsICZwcmV2UmVhbEN0cmxDKTsKLSAgICBfUE1fYnJlYWtIYW5kbGVyID0gYmg7Ci0gICAgc2V0SVNSKDB4MUIsIF9QTV9icmVha0lTUik7Ci0gICAgc2V0SVNSKDB4MjMsIF9QTV9jdHJsQ0lTUik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1faW5zdGFsbEJyZWFrSGFuZGxlcih2b2lkKQotewotICAgIFBNX2luc3RhbGxBbHRCcmVha0hhbmRsZXIoTlVMTCk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUJyZWFrSGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fcHJldkJyZWFrLnNlbCkgewotCXJlc3RvcmVJU1IoMHgxQiwgX1BNX3ByZXZCcmVhaywgcHJldlJlYWxCcmVhayk7Ci0JcmVzdG9yZUlTUigweDIzLCBfUE1fcHJldkN0cmxDLCBwcmV2UmVhbEN0cmxDKTsKLQlfUE1fcHJldkJyZWFrLnNlbCA9IDA7Ci0JX1BNX2JyZWFrSGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi12b2lkIFBNQVBJIFBNX2luc3RhbGxBbHRDcml0aWNhbEhhbmRsZXIoUE1fY3JpdGljYWxIYW5kbGVyIGNoKQotewotICAgIHN0YXRpYyBzaG9ydCAgICBjcml0QnVmWzJdOwotCi0gICAgX1BNX2NyaXRQdHIgPSAodWNoYXIqKWNyaXRCdWY7Ci0gICAgZ2V0SVNSKDB4MjQsICZfUE1fcHJldkNyaXRpY2FsLCAmcHJldlJlYWxDcml0aWNhbCk7Ci0gICAgX1BNX2NyaXRIYW5kbGVyID0gY2g7Ci0gICAgc2V0SVNSKDB4MjQsIF9QTV9jcml0aWNhbElTUik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1faW5zdGFsbENyaXRpY2FsSGFuZGxlcih2b2lkKQotewotICAgIFBNX2luc3RhbGxBbHRDcml0aWNhbEhhbmRsZXIoTlVMTCk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUNyaXRpY2FsSGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fcHJldkNyaXRpY2FsLnNlbCkgewotCXJlc3RvcmVJU1IoMHgyNCwgX1BNX3ByZXZDcml0aWNhbCwgcHJldlJlYWxDcml0aWNhbCk7Ci0JX1BNX3ByZXZDcml0aWNhbC5zZWwgPSAwOwotCV9QTV9jcml0SGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi1pbnQgUE1BUEkgUE1fbG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIHJldHVybiAoX2R4X2xvY2tfcGdzbihwLGxlbikgPT0gMCk7Ci19Ci0KLWludCBQTUFQSSBQTV91bmxvY2tEYXRhUGFnZXModm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICByZXR1cm4gKF9keF91bG9ja19wZ3NuKHAsbGVuKSA9PSAwKTsKLX0KLQotaW50IFBNQVBJIFBNX2xvY2tDb2RlUGFnZXModm9pZCAoKnApKCksdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgQ09ORklHX0lORiAgY29uZmlnOwotICAgIEZBUlBUUiAgICAgIGZwOwotCi0gICAgX2R4X2NvbmZpZ19pbmYoJmNvbmZpZywgKFVDSEFSKikmY29uZmlnKTsKLSAgICBGUF9TRVQoZnAscCxjb25maWcuY19jc19zZWwpOwotICAgIHJldHVybiAoX2R4X2xvY2tfcGdzKGZwLGxlbikgPT0gMCk7Ci19Ci0KLWludCBQTUFQSSBQTV91bmxvY2tDb2RlUGFnZXModm9pZCAoKnApKCksdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgQ09ORklHX0lORiAgY29uZmlnOwotICAgIEZBUlBUUiAgICAgIGZwOwotCi0gICAgX2R4X2NvbmZpZ19pbmYoJmNvbmZpZywgKFVDSEFSKikmY29uZmlnKTsKLSAgICBGUF9TRVQoZnAscCxjb25maWcuY19jc19zZWwpOwotICAgIHJldHVybiAoX2R4X3Vsb2NrX3BncyhmcCxsZW4pID09IDApOwotfQotCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIFN5bWFudGVjIEMrKyBET1NYIGFuZCBGbGFzaFRlayBYLTMyL1gtMzJWTSBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWYgZGVmaW5lZChET1NYKSB8fCBkZWZpbmVkKFgzMlZNKQotCi0jaWZkZWYgIFgzMlZNCi0jaW5jbHVkZSA8eDMyLmg+Ci0jZW5kaWYKLQotc3RhdGljIGxvbmcgcHJldlJlYWxCcmVhazsgICAgICAvKiBQcmV2aW91cyByZWFsIG1vZGUgYnJlYWsgaGFuZGxlciAgICAgKi8KLXN0YXRpYyBsb25nIHByZXZSZWFsQ3RybEM7ICAgICAgLyogUHJldmlvdXMgcmVhbCBtb2RlIEN0cmxDIGhhbmRsZXIgICAgICovCi1zdGF0aWMgbG9uZyBwcmV2UmVhbENyaXRpY2FsOyAgIC8qIFByZXYgcmVhbCBtb2RlIGNyaXRpY2FsIGhhbmRsZXIgICAgICAqLwotCi1zdGF0aWMgdWludCBtb3VzZVNlbCA9IDAsbW91c2VPZmY7Ci0KLS8qIFRoZSBmb2xsb3dpbmcgcmVhbCBtb2RlIHJvdXRpbmUgaXMgdXNlZCB0byBjYWxsIGEgMzIgYml0IHByb3RlY3RlZAotICogbW9kZSBGQVIgZnVuY3Rpb24gZnJvbSByZWFsIG1vZGUuIFdlIHVzZSB0aGlzIGZvciBwYXNzaW5nIHVwIGNvbnRyb2wKLSAqIGZyb20gdGhlIHJlYWwgbW9kZSBtb3VzZSBjYWxsYmFjayB0byBvdXIgcHJvdGVjdGVkIG1vZGUgY29kZS4KLSAqLwotCi1zdGF0aWMgY2hhciByZWFsSGFuZGxlcltdID0geyAgICAgICAvKiBSZWFsIG1vZGUgY29kZSBnZW5lcmljIGhhbmRsZXIgICAqLwotICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsICAgICAgICAgICAgLyogX19QTV9jYWxsUHJvdHAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAweDAwLDB4MDAsICAgICAgICAgICAgICAgICAgICAgIC8qIF9fUE1fcHJvdENTICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHgwMCwweDAwLDB4MDAsMHgwMCwgICAgICAgICAgICAvKiBfX1BNX3Byb3RIYW5kbGVyICAgICAgICAgICAgICAgICAqLwotICAgIDB4MUUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHB1c2ggICAgZHMgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAweDZBLDB4MDAsICAgICAgICAgICAgICAgICAgICAgIC8qICBwdXNoICAgIDAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHg2QSwweDAwLCAgICAgICAgICAgICAgICAgICAgICAvKiAgcHVzaCAgICAwICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIDB4MkUsMHhGRiwweDM2LDB4MDQsMHgwMCwgICAgICAgLyogIHB1c2ggICAgW2NzOl9fUE1fcHJvdENTXSAgICAgICAgKi8KLSAgICAweDY2LDB4MkUsMHhGRiwweDM2LDB4MDYsMHgwMCwgIC8qICBwdXNoICAgIFtjczpfX1BNX3Byb3RIYW5kbGVyXSAgICovCi0gICAgMHgyRSwweEZGLDB4MUUsMHgwMCwweDAwLCAgICAgICAvKiAgY2FsbCAgICBbY3M6X19QTV9jYWxsUHJvdHBdICAgICAqLwotICAgIDB4ODMsMHhDNCwweDBBLCAgICAgICAgICAgICAgICAgLyogIGFkZCAgICAgc3AsMTAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAweDFGLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBwb3AgICAgIGRzICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHhDQiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgcmV0ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIH07Ci0KLS8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGluc3RhbGxzIHRoZSBhYm92ZSByZWFsbW9kZSBjYWxsYmFjayBtZWNoYW5pc20KLSAqIGluIHJlYWwgbW9kZSBtZW1vcnkgZm9yIGNhbGxpbmcgdGhlIHByb3RlY3RlZCBtb2RlIHJvdXRpbmUuCi0gKi8KLQotaW50IGluc3RhbGxDYWxsYmFjayh2b2lkIChQTUFQSSAqcG1DQikoKSx1aW50ICpwc2VsLCB1aW50ICpwb2ZmLAotICAgIHVpbnQgKnJzZWcsIHVpbnQgKnJvZmYpCi17Ci0gICAgUE1SRUdTICAgICAgICAgIHJlZ3M7Ci0gICAgUE1TUkVHUyAgICAgICAgIHNyZWdzOwotCi0gICAgcmVncy54LmF4ID0gMHgyNTBEOwotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICBQTV9pbnQzODZ4KDB4MjEsJnJlZ3MsJnJlZ3MsJnNyZWdzKTsgICAgLyogR2V0IFJNIGNhbGxiYWNrIGFkZHJlc3MgICovCi0KLSAgICAvKiBGaWxsIGluIHRoZSB2YWx1ZXMgaW4gdGhlIHJlYWwgbW9kZSBjb2RlIHNlZ21lbnQgc28gdGhhdCBpdCB3aWxsCi0gICAgICogY2FsbCB0aGUgY29ycmVjdCByb3V0aW5lLgotICAgICAqLwotICAgICooKHVsb25nKikmcmVhbEhhbmRsZXJbMF0pID0gcmVncy5lLmVheDsKLSAgICAqKCh1c2hvcnQqKSZyZWFsSGFuZGxlcls0XSkgPSBzcmVncy5jczsKLSAgICAqKCh1bG9uZyopJnJlYWxIYW5kbGVyWzZdKSA9ICh1bG9uZylwbUNCOwotCi0gICAgLyogQ29weSB0aGUgcmVhbCBtb2RlIGhhbmRsZXIgdG8gcmVhbCBtb2RlIG1lbW9yeSAob25seSBhbGxvY2F0ZSB0aGUKLSAgICAgKiBidWZmZXIgb25jZSBzaW5jZSB3ZSBjYW50IGRlYWxsb2F0ZSBpdCB3aXRoIFgzMikuCi0gICAgICovCi0gICAgaWYgKCpwc2VsID09IDApIHsKLQlpZiAoIVBNX2FsbG9jUmVhbFNlZyhzaXplb2YocmVhbEhhbmRsZXIpLHBzZWwscG9mZixyc2VnLHJvZmYpKQotCSAgICByZXR1cm4gMDsKLQl9Ci0gICAgUE1fbWVtY3B5Zm4oKnBzZWwsKnBvZmYscmVhbEhhbmRsZXIsc2l6ZW9mKHJlYWxIYW5kbGVyKSk7Ci0KLSAgICAvKiBTa2lwIHBhc3QgZ2xvYmFsIHZhcmlhYmxlcyBpbiByZWFsIG1vZGUgY29kZSBzZWdtZW50ICovCi0gICAgKnJvZmYgKz0gMHgwQTsKLSAgICByZXR1cm4gMTsKLX0KLQotaW50IFBNQVBJIFBNX3NldE1vdXNlSGFuZGxlcihpbnQgbWFzaywgUE1fbW91c2VIYW5kbGVyIG1oKQotewotICAgIFJNUkVHUyAgICAgIHJlZ3M7Ci0gICAgUk1TUkVHUyAgICAgc3JlZ3M7Ci0gICAgdWludCAgICByc2VnLHJvZmY7Ci0KLSAgICBsb2NrUE1IYW5kbGVycygpOyAgICAgICAgICAgLyogRW5zdXJlIG91ciBoYW5kbGVycyBhcmUgbG9ja2VkICAgKi8KLQotICAgIGlmICghaW5zdGFsbENhbGxiYWNrKF9QTV9tb3VzZUlTUiwgJm1vdXNlU2VsLCAmbW91c2VPZmYsICZyc2VnLCAmcm9mZikpCi0JcmV0dXJuIDA7Ci0gICAgX1BNX21vdXNlSGFuZGxlciA9IG1oOwotCi0gICAgLyogSW5zdGFsbCB0aGUgcmVhbCBtb2RlIG1vdXNlIGhhbmRsZXIgICovCi0gICAgc3JlZ3MuZXMgPSByc2VnOwotICAgIHJlZ3MueC5keCA9IHJvZmY7Ci0gICAgcmVncy54LmN4ID0gX1BNX21vdXNlTWFzayA9IG1hc2s7Ci0gICAgcmVncy54LmF4ID0gMHhDOwotICAgIFBNX2ludDg2eCgweDMzLCAmcmVncywgJnJlZ3MsICZzcmVncyk7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZU1vdXNlSGFuZGxlcih2b2lkKQotewotICAgIFJNUkVHUyAgcmVnczsKLQotICAgIGlmIChfUE1fbW91c2VIYW5kbGVyKSB7Ci0JcmVncy54LmF4ID0gMzM7Ci0JUE1faW50ODYoMHgzMywgJnJlZ3MsICZyZWdzKTsKLQlfUE1fbW91c2VIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZ2V0UE12ZWN0KGludCBpbnRubywgUE1GQVJQVFIgKmlzcikKLXsKLSAgICBQTVJFR1MgIHJlZ3M7Ci0gICAgUE1TUkVHUyBzcmVnczsKLQotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICByZWdzLnguYXggPSAweDI1MDI7ICAgICAgICAgLyogR2V0IFBNIGludGVycnVwdCB2ZWN0b3IgICAgICAgICAgICAgICovCi0gICAgcmVncy54LmN4ID0gaW50bm87Ci0gICAgUE1faW50Mzg2eCgweDIxLCAmcmVncywgJnJlZ3MsICZzcmVncyk7Ci0gICAgaXNyLT5zZWwgPSBzcmVncy5lczsKLSAgICBpc3ItPm9mZiA9IHJlZ3MuZS5lYng7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0UE12ZWN0KGludCBpbnRubywgUE1faW50SGFuZGxlciBpc3IpCi17Ci0gICAgUE1GQVJQVFIgICAgcG1pc3I7Ci0gICAgUE1TUkVHUyAgICAgc3JlZ3M7Ci0KLSAgICBQTV9zYXZlRFMoKTsKLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0gICAgcG1pc3Iuc2VsID0gc3JlZ3MuY3M7Ci0gICAgcG1pc3Iub2ZmID0gKHVpbnQpaXNyOwotICAgIFBNX3Jlc3RvcmVQTXZlY3QoaW50bm8sIHBtaXNyKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlUE12ZWN0KGludCBpbnRubywgUE1GQVJQVFIgaXNyKQotewotICAgIFBNUkVHUyAgcmVnczsKLSAgICBQTVNSRUdTIHNyZWdzOwotCi0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHJlZ3MueC5heCA9IDB4MjUwNTsgICAgICAgICAvKiBTZXQgUE0gaW50ZXJydXB0IHZlY3RvciAgICAgICAgICAgICAgKi8KLSAgICByZWdzLnguY3ggPSBpbnRubzsKLSAgICBzcmVncy5kcyA9IGlzci5zZWw7Ci0gICAgcmVncy5lLmVkeCA9IGlzci5vZmY7Ci0gICAgUE1faW50Mzg2eCgweDIxLCAmcmVncywgJnJlZ3MsICZzcmVncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGdldElTUihpbnQgaW50bm8sIFBNRkFSUFRSICpwbWlzciwgbG9uZyAqcmVhbGlzcikKLXsKLSAgICBQTV9nZXRQTXZlY3QoaW50bm8scG1pc3IpOwotICAgIF9QTV9nZXRSTXZlY3QoaW50bm8scmVhbGlzcik7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlc3RvcmVJU1IoaW50IGludG5vLCBQTUZBUlBUUiBwbWlzciwgbG9uZyByZWFsaXNyKQotewotICAgIFBNUkVHUyAgcmVnczsKLSAgICBQTVNSRUdTIHNyZWdzOwotCi0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHJlZ3MueC5heCA9IDB4MjUwNzsgICAgICAgICAvKiBTZXQgcmVhbCBhbmQgUE0gdmVjdG9ycyAgICAgICAgICAgICAgKi8KLSAgICByZWdzLnguY3ggPSBpbnRubzsKLSAgICBzcmVncy5kcyA9IHBtaXNyLnNlbDsKLSAgICByZWdzLmUuZWR4ID0gcG1pc3Iub2ZmOwotICAgIHJlZ3MuZS5lYnggPSByZWFsaXNyOwotICAgIFBNX2ludDM4NngoMHgyMSwgJnJlZ3MsICZyZWdzLCAmc3JlZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBzZXRJU1IoaW50IGludG5vLCB2b2lkICppc3IpCi17Ci0gICAgUE1SRUdTICByZWdzOwotICAgIFBNU1JFR1Mgc3JlZ3M7Ci0KLSAgICBsb2NrUE1IYW5kbGVycygpOyAgICAgICAgICAgLyogRW5zdXJlIG91ciBoYW5kbGVycyBhcmUgbG9ja2VkICAgICAgICovCi0KLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0gICAgcmVncy54LmF4ID0gMHgyNTA2OyAgICAgICAgIC8qIEhvb2sgcmVhbCBhbmQgcHJvdGVjdGVkIHZlY3RvcnMgICAgICAqLwotICAgIHJlZ3MueC5jeCA9IGludG5vOwotICAgIHNyZWdzLmRzID0gc3JlZ3MuY3M7Ci0gICAgcmVncy5lLmVkeCA9ICh1aW50KWlzcjsKLSAgICBQTV9pbnQzODZ4KDB4MjEsICZyZWdzLCAmcmVncywgJnNyZWdzKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRUaW1lckhhbmRsZXIoUE1faW50SGFuZGxlciB0aCkKLXsKLSAgICBnZXRJU1IoMHg4LCAmX1BNX3ByZXZUaW1lciwgJl9QTV9wcmV2UmVhbFRpbWVyKTsKLSAgICBfUE1fdGltZXJIYW5kbGVyID0gdGg7Ci0gICAgc2V0SVNSKDB4OCwgX1BNX3RpbWVySVNSKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlVGltZXJIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV90aW1lckhhbmRsZXIpIHsKLQlyZXN0b3JlSVNSKDB4OCwgX1BNX3ByZXZUaW1lciwgX1BNX3ByZXZSZWFsVGltZXIpOwotCV9QTV90aW1lckhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotaWJvb2wgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0hhbmRsZXIoUE1faW50SGFuZGxlciB0aCxpbnQgZnJlcXVlbmN5KQotewotICAgIC8qIFNhdmUgdGhlIG9sZCBDTU9TIHJlYWwgdGltZSBjbG9jayB2YWx1ZXMgKi8KLSAgICBfUE1fb2xkQ01PU1JlZ0EgPSBfUE1fcmVhZENNT1MoMHgwQSk7Ci0gICAgX1BNX29sZENNT1NSZWdCID0gX1BNX3JlYWRDTU9TKDB4MEIpOwotCi0gICAgLyogU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgaW50ZXJydXB0IGhhbmRsZXIgKi8KLSAgICBnZXRJU1IoMHg3MCwgJl9QTV9wcmV2UlRDLCAmX1BNX3ByZXZSZWFsUlRDKTsKLSAgICBfUE1fcnRjSGFuZGxlciA9IHRoOwotICAgIHNldElTUigweDcwLCBfUE1fcnRjSVNSKTsKLQotICAgIC8qIFByb2dyYW0gdGhlIHJlYWwgdGltZSBjbG9jayBkZWZhdWx0IGZyZXF1ZW5jeSAqLwotICAgIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3koZnJlcXVlbmN5KTsKLQotICAgIC8qIFVubWFzayBJUlE4IGluIHRoZSBQSUMyICovCi0gICAgX1BNX29sZFJUQ1BJQzIgPSBQTV9pbnBiKDB4QTEpOwotICAgIFBNX291dHBiKDB4QTEsX1BNX29sZFJUQ1BJQzIgJiAweEZFKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlUmVhbFRpbWVDbG9ja0hhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX3J0Y0hhbmRsZXIpIHsKLQkvKiBSZXN0b3JlIENNT1MgcmVnaXN0ZXJzIGFuZCBtYXNrIFJUQyBjbG9jayAqLwotCV9QTV93cml0ZUNNT1MoMHgwQSxfUE1fb2xkQ01PU1JlZ0EpOwotCV9QTV93cml0ZUNNT1MoMHgwQixfUE1fb2xkQ01PU1JlZ0IpOwotCVBNX291dHBiKDB4QTEsKFBNX2lucGIoMHhBMSkgJiAweEZFKSB8IChfUE1fb2xkUlRDUElDMiAmIH4weEZFKSk7Ci0KLQkvKiBSZXN0b3JlIHRoZSBpbnRlcnJ1cHQgdmVjdG9yICovCi0JcmVzdG9yZUlTUigweDcwLCBfUE1fcHJldlJUQywgX1BNX3ByZXZSZWFsUlRDKTsKLQlfUE1fcnRjSGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi12b2lkIFBNQVBJIFBNX3NldEtleUhhbmRsZXIoUE1faW50SGFuZGxlciBraCkKLXsKLSAgICBnZXRJU1IoMHg5LCAmX1BNX3ByZXZLZXksICZfUE1fcHJldlJlYWxLZXkpOwotICAgIF9QTV9rZXlIYW5kbGVyID0ga2g7Ci0gICAgc2V0SVNSKDB4OSwgX1BNX2tleUlTUik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUtleUhhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX2tleUhhbmRsZXIpIHsKLQlyZXN0b3JlSVNSKDB4OSwgX1BNX3ByZXZLZXksIF9QTV9wcmV2UmVhbEtleSk7Ci0JX1BNX2tleUhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRLZXkxNUhhbmRsZXIoUE1fa2V5MTVIYW5kbGVyIGtoKQotewotICAgIGdldElTUigweDE1LCAmX1BNX3ByZXZLZXkxNSwgJl9QTV9wcmV2UmVhbEtleTE1KTsKLSAgICBfUE1fa2V5MTVIYW5kbGVyID0ga2g7Ci0gICAgc2V0SVNSKDB4MTUsIF9QTV9rZXkxNUlTUik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUtleTE1SGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fa2V5MTVIYW5kbGVyKSB7Ci0JcmVzdG9yZUlTUigweDE1LCBfUE1fcHJldktleTE1LCBfUE1fcHJldlJlYWxLZXkxNSk7Ci0JX1BNX2tleTE1SGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi12b2lkIFBNQVBJIFBNX2luc3RhbGxBbHRCcmVha0hhbmRsZXIoUE1fYnJlYWtIYW5kbGVyIGJoKQotewotICAgIHN0YXRpYyBpbnQgIGN0cmxDRmxhZyxjdHJsQkZsYWc7Ci0KLSAgICBfUE1fY3RybENQdHIgPSAodWNoYXIqKSZjdHJsQ0ZsYWc7Ci0gICAgX1BNX2N0cmxCUHRyID0gKHVjaGFyKikmY3RybEJGbGFnOwotICAgIGdldElTUigweDFCLCAmX1BNX3ByZXZCcmVhaywgJnByZXZSZWFsQnJlYWspOwotICAgIGdldElTUigweDIzLCAmX1BNX3ByZXZDdHJsQywgJnByZXZSZWFsQ3RybEMpOwotICAgIF9QTV9icmVha0hhbmRsZXIgPSBiaDsKLSAgICBzZXRJU1IoMHgxQiwgX1BNX2JyZWFrSVNSKTsKLSAgICBzZXRJU1IoMHgyMywgX1BNX2N0cmxDSVNSKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9pbnN0YWxsQnJlYWtIYW5kbGVyKHZvaWQpCi17Ci0gICAgUE1faW5zdGFsbEFsdEJyZWFrSGFuZGxlcihOVUxMKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlQnJlYWtIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9wcmV2QnJlYWsuc2VsKSB7Ci0JcmVzdG9yZUlTUigweDFCLCBfUE1fcHJldkJyZWFrLCBwcmV2UmVhbEJyZWFrKTsKLQlyZXN0b3JlSVNSKDB4MjMsIF9QTV9wcmV2Q3RybEMsIHByZXZSZWFsQ3RybEMpOwotCV9QTV9wcmV2QnJlYWsuc2VsID0gMDsKLQlfUE1fYnJlYWtIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLXZvaWQgUE1BUEkgUE1faW5zdGFsbEFsdENyaXRpY2FsSGFuZGxlcihQTV9jcml0aWNhbEhhbmRsZXIgY2gpCi17Ci0gICAgc3RhdGljIHNob3J0ICAgIGNyaXRCdWZbMl07Ci0KLSAgICBfUE1fY3JpdFB0ciA9ICh1Y2hhciopY3JpdEJ1ZjsKLSAgICBnZXRJU1IoMHgyNCwgJl9QTV9wcmV2Q3JpdGljYWwsICZwcmV2UmVhbENyaXRpY2FsKTsKLSAgICBfUE1fY3JpdEhhbmRsZXIgPSBjaDsKLSAgICBzZXRJU1IoMHgyNCwgX1BNX2NyaXRpY2FsSVNSKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9pbnN0YWxsQ3JpdGljYWxIYW5kbGVyKHZvaWQpCi17Ci0gICAgUE1faW5zdGFsbEFsdENyaXRpY2FsSGFuZGxlcihOVUxMKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlQ3JpdGljYWxIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9wcmV2Q3JpdGljYWwuc2VsKSB7Ci0JcmVzdG9yZUlTUigweDI0LCBfUE1fcHJldkNyaXRpY2FsLCBwcmV2UmVhbENyaXRpY2FsKTsKLQlfUE1fcHJldkNyaXRpY2FsLnNlbCA9IDA7Ci0JX1BNX2NyaXRIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLWludCBQTUFQSSBQTV9sb2NrRGF0YVBhZ2VzKHZvaWQgKnAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgcmV0dXJuIChfeDM4Nl9tZW1sb2NrKHAsbGVuKSA9PSAwKTsKLX0KLQotaW50IFBNQVBJIFBNX3VubG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIHJldHVybiAoX3gzODZfbWVtdW5sb2NrKHAsbGVuKSA9PSAwKTsKLX0KLQotaW50IFBNQVBJIFBNX2xvY2tDb2RlUGFnZXModm9pZCAoKnApKCksdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgcmV0dXJuIChfeDM4Nl9tZW1sb2NrKHAsbGVuKSA9PSAwKTsKLX0KLQotaW50IFBNQVBJIFBNX3VubG9ja0NvZGVQYWdlcyh2b2lkICgqcCkoKSx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICByZXR1cm4gKF94Mzg2X21lbXVubG9jayhwLGxlbikgPT0gMCk7Ci19Ci0KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQm9ybGFuZCdzIERQTUkzMiBET1MgUG93ZXIgUGFjayBFeHRlbmRlciBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiAgRFBNSTMyCi0jZGVmaW5lIEdFTkVSSUNfRFBNSTMyICAgICAgICAgIC8qIFVzZSBnZW5lcmljIDMyIGJpdCBEUE1JIHJvdXRpbmVzICovCi0KLXZvaWQgUE1BUEkgUE1fZ2V0UE12ZWN0KGludCBpbnRubywgUE1GQVJQVFIgKmlzcikKLXsKLSAgICBQTVJFR1MgIHJlZ3M7Ci0KLSAgICByZWdzLnguYXggPSAweDIwNDsKLSAgICByZWdzLmguYmwgPSBpbnRubzsKLSAgICBQTV9pbnQzODYoMHgzMSwmcmVncywmcmVncyk7Ci0gICAgaXNyLT5zZWwgPSByZWdzLnguY3g7Ci0gICAgaXNyLT5vZmYgPSByZWdzLmUuZWR4OwotfQotCi12b2lkIFBNQVBJIFBNX3NldFBNdmVjdChpbnQgaW50bm8sIFBNX2ludEhhbmRsZXIgaXNyKQotewotICAgIFBNU1JFR1Mgc3JlZ3M7Ci0gICAgUE1SRUdTICByZWdzOwotCi0gICAgUE1fc2F2ZURTKCk7Ci0gICAgcmVncy54LmF4ID0gMHgyMDU7ICAgICAgICAgIC8qIFNldCBwcm90ZWN0ZWQgbW9kZSB2ZWN0b3IgICAgICAgICovCi0gICAgcmVncy5oLmJsID0gaW50bm87Ci0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHJlZ3MueC5jeCA9IHNyZWdzLmNzOwotICAgIHJlZ3MuZS5lZHggPSAodWludClpc3I7Ci0gICAgUE1faW50Mzg2KDB4MzEsJnJlZ3MsJnJlZ3MpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVQTXZlY3QoaW50IGludG5vLCBQTUZBUlBUUiBpc3IpCi17Ci0gICAgUE1SRUdTICByZWdzOwotCi0gICAgcmVncy54LmF4ID0gMHgyMDU7Ci0gICAgcmVncy5oLmJsID0gaW50bm87Ci0gICAgcmVncy54LmN4ID0gaXNyLnNlbDsKLSAgICByZWdzLmUuZWR4ID0gaXNyLm9mZjsKLSAgICBQTV9pbnQzODYoMHgzMSwmcmVncywmcmVncyk7Ci19Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIFdhdGNvbSBDL0MrKyB3aXRoIFJhdGlvbmFsIERPUy80R1cgc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgIERPUzRHVwotI2RlZmluZSBHRU5FUklDX0RQTUkzMiAgICAgICAgICAvKiBVc2UgZ2VuZXJpYyAzMiBiaXQgRFBNSSByb3V0aW5lcyAqLwotCi0jZGVmaW5lIE1PVVNFX1NVUFBPUlRFRCAgICAgICAgIC8qIERPUzRHVyBkaXJlY3RseSBzdXBwb3J0cyBtb3VzZSAgICovCi0KLS8qIFdlIHVzZSB0aGUgbm9ybWFsIERPUyBzZXJ2aWNlcyB0byBzYXZlIGFuZCByZXN0b3JlIGludGVycnVwdHMgaGFuZGxlcnMKLSAqIGZvciBXYXRjb20gQysrLCBiZWNhdXNlIHVzaW5nIHRoZSBkaXJlY3QgRFBNSSBmdW5jdGlvbnMgZG9lcyBub3QKLSAqIGFwcGVhciB0byB3b3JrIHByb3Blcmx5LiBBdCBsZWFzdCBpZiB3ZSB1c2UgdGhlIERQTUkgZnVuY3Rpb25zLCB3ZQotICogZG9udCBnZXQgdGhlIGF1dG8tcGFzc3VwIGZlYXR1cmUgdGhhdCB3ZSBuZWVkIHRvIGNvcnJlY3RseSB0cmFwCi0gKiByZWFsIGFuZCBwcm90ZWN0ZWQgbW9kZSBpbnRlcnJ1cHRzIHdpdGhvdXQgaW5zdGFsbGluZyBCaS1tb2RlbAotICogaW50ZXJydXB0IGhhbmRsZXJzLgotICovCi0KLXZvaWQgUE1BUEkgUE1fZ2V0UE12ZWN0KGludCBpbnRubywgUE1GQVJQVFIgKmlzcikKLXsKLSAgICBQTVJFR1MgIHJlZ3M7Ci0gICAgUE1TUkVHUyBzcmVnczsKLQotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICByZWdzLmguYWggPSAweDM1OwotICAgIHJlZ3MuaC5hbCA9IGludG5vOwotICAgIFBNX2ludDM4NngoMHgyMSwmcmVncywmcmVncywmc3JlZ3MpOwotICAgIGlzci0+c2VsID0gc3JlZ3MuZXM7Ci0gICAgaXNyLT5vZmYgPSByZWdzLmUuZWJ4OwotfQotCi12b2lkIFBNQVBJIFBNX3NldFBNdmVjdChpbnQgaW50bm8sIFBNX2ludEhhbmRsZXIgaXNyKQotewotICAgIFBNUkVHUyAgcmVnczsKLSAgICBQTVNSRUdTIHNyZWdzOwotCi0gICAgUE1fc2F2ZURTKCk7Ci0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHJlZ3MuaC5haCA9IDB4MjU7Ci0gICAgcmVncy5oLmFsID0gaW50bm87Ci0gICAgc3JlZ3MuZHMgPSBzcmVncy5jczsKLSAgICByZWdzLmUuZWR4ID0gKHVpbnQpaXNyOwotICAgIFBNX2ludDM4NngoMHgyMSwmcmVncywmcmVncywmc3JlZ3MpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVQTXZlY3QoaW50IGludG5vLCBQTUZBUlBUUiBpc3IpCi17Ci0gICAgUE1SRUdTICByZWdzOwotICAgIFBNU1JFR1Mgc3JlZ3M7Ci0KLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0gICAgcmVncy5oLmFoID0gMHgyNTsKLSAgICByZWdzLmguYWwgPSBpbnRubzsKLSAgICBzcmVncy5kcyA9IGlzci5zZWw7Ci0gICAgcmVncy5lLmVkeCA9IGlzci5vZmY7Ci0gICAgUE1faW50Mzg2eCgweDIxLCZyZWdzLCZyZWdzLCZzcmVncyk7Ci19Ci0KLWludCBQTUFQSSBQTV9zZXRNb3VzZUhhbmRsZXIoaW50IG1hc2ssIFBNX21vdXNlSGFuZGxlciBtaCkKLXsKLSAgICBsb2NrUE1IYW5kbGVycygpOyAgICAgICAgICAgLyogRW5zdXJlIG91ciBoYW5kbGVycyBhcmUgbG9ja2VkICAgKi8KLQotICAgIF9QTV9tb3VzZUhhbmRsZXIgPSBtaDsKLSAgICBfUE1fc2V0TW91c2VIYW5kbGVyKF9QTV9tb3VzZU1hc2sgPSBtYXNrKTsKLSAgICByZXR1cm4gMTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlTW91c2VIYW5kbGVyKHZvaWQpCi17Ci0gICAgUE1SRUdTICByZWdzOwotCi0gICAgaWYgKF9QTV9tb3VzZUhhbmRsZXIpIHsKLQlyZWdzLnguYXggPSAzMzsKLQlQTV9pbnQzODYoMHgzMywgJnJlZ3MsICZyZWdzKTsKLQlfUE1fbW91c2VIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogREpHUFAgcG9ydCBvZiBHTlUgQysrIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiBESkdQUAotI2RlZmluZSBHRU5FUklDX0RQTUkzMiAgICAgICAgICAvKiBVc2UgZ2VuZXJpYyAzMiBiaXQgRFBNSSByb3V0aW5lcyAqLwotCi12b2lkIFBNQVBJIFBNX2dldFBNdmVjdChpbnQgaW50bm8sIFBNRkFSUFRSICppc3IpCi17Ci0gICAgUE1SRUdTICByZWdzOwotCi0gICAgcmVncy54LmF4ID0gMHgyMDQ7Ci0gICAgcmVncy5oLmJsID0gaW50bm87Ci0gICAgUE1faW50Mzg2KDB4MzEsJnJlZ3MsJnJlZ3MpOwotICAgIGlzci0+c2VsID0gcmVncy54LmN4OwotICAgIGlzci0+b2ZmID0gcmVncy5lLmVkeDsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRQTXZlY3QoaW50IGludG5vLCBQTV9pbnRIYW5kbGVyIGlzcikKLXsKLSAgICBQTVNSRUdTIHNyZWdzOwotICAgIFBNUkVHUyAgcmVnczsKLQotICAgIFBNX3NhdmVEUygpOwotICAgIHJlZ3MueC5heCA9IDB4MjA1OyAgICAgICAgICAvKiBTZXQgcHJvdGVjdGVkIG1vZGUgdmVjdG9yICAgICAgICAqLwotICAgIHJlZ3MuaC5ibCA9IGludG5vOwotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICByZWdzLnguY3ggPSBzcmVncy5jczsKLSAgICByZWdzLmUuZWR4ID0gKHVpbnQpaXNyOwotICAgIFBNX2ludDM4NigweDMxLCZyZWdzLCZyZWdzKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlUE12ZWN0KGludCBpbnRubywgUE1GQVJQVFIgaXNyKQotewotICAgIFBNUkVHUyAgcmVnczsKLQotICAgIHJlZ3MueC5heCA9IDB4MjA1OwotICAgIHJlZ3MuaC5ibCA9IGludG5vOwotICAgIHJlZ3MueC5jeCA9IGlzci5zZWw7Ci0gICAgcmVncy5lLmVkeCA9IGlzci5vZmY7Ci0gICAgUE1faW50Mzg2KDB4MzEsJnJlZ3MsJnJlZ3MpOwotfQotCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEdlbmVyaWMgMzIgYml0IERQTUkgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWYgZGVmaW5lZChHRU5FUklDX0RQTUkzMikKLQotc3RhdGljIGxvbmcgcHJldlJlYWxCcmVhazsgICAgICAvKiBQcmV2aW91cyByZWFsIG1vZGUgYnJlYWsgaGFuZGxlciAgICAgKi8KLXN0YXRpYyBsb25nIHByZXZSZWFsQ3RybEM7ICAgICAgLyogUHJldmlvdXMgcmVhbCBtb2RlIEN0cmxDIGhhbmRsZXIgICAgICovCi1zdGF0aWMgbG9uZyBwcmV2UmVhbENyaXRpY2FsOyAgIC8qIFByZXYgcmVhbCBtb2RlIGNyaXRpY2FsIGhhbmRsZXIgICAgICAqLwotCi0jaWZuZGVmIE1PVVNFX1NVUFBPUlRFRAotCi0vKiBUaGUgZm9sbG93aW5nIHJlYWwgbW9kZSByb3V0aW5lIGlzIHVzZWQgdG8gY2FsbCBhIDMyIGJpdCBwcm90ZWN0ZWQKLSAqIG1vZGUgRkFSIGZ1bmN0aW9uIGZyb20gcmVhbCBtb2RlLiBXZSB1c2UgdGhpcyBmb3IgcGFzc2luZyB1cCBjb250cm9sCi0gKiBmcm9tIHRoZSByZWFsIG1vZGUgbW91c2UgY2FsbGJhY2sgdG8gb3VyIHByb3RlY3RlZCBtb2RlIGNvZGUuCi0gKi8KLQotc3RhdGljIGxvbmcgbW91c2VSTUNCOyAgICAgICAgICAvKiBNb3VzZSByZWFsIG1vZGUgY2FsbGJhY2sgYWRkcmVzcyAgICAgKi8KLXN0YXRpYyB1Y2hhciAqbW91c2VQdHI7Ci1zdGF0aWMgY2hhciBtb3VzZVJlZ3NbMHgzMl07ICAgIC8qIFJlYWwgbW9kZSByZWdzIGZvciBtb3VzZSBjYWxsYmFjayAgICAqLwotc3RhdGljIHVjaGFyIG1vdXNlSGFuZGxlcltdID0gewotICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsICAgICAgICAvKiBfcmVhbFJNQ0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAweDJFLDB4RkYsMHgxRSwweDAwLDB4MDAsICAgLyogIGNhbGwgICAgW2NzOl9yZWFsUk1DQl0gICAgICAgICAgICAgICovCi0gICAgMHhDQiwgICAgICAgICAgICAgICAgICAgICAgIC8qICByZXRmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIH07Ci0KLWludCBQTUFQSSBQTV9zZXRNb3VzZUhhbmRsZXIoaW50IG1hc2ssIFBNX21vdXNlSGFuZGxlciBtaCkKLXsKLSAgICBSTVJFR1MgICAgICByZWdzOwotICAgIFJNU1JFR1MgICAgIHNyZWdzOwotICAgIHVpbnQgICAgICAgIHJzZWcscm9mZjsKLQotICAgIGxvY2tQTUhhbmRsZXJzKCk7ICAgICAgICAgICAvKiBFbnN1cmUgb3VyIGhhbmRsZXJzIGFyZSBsb2NrZWQgICAqLwotCi0gICAgLyogQ29weSB0aGUgcmVhbCBtb2RlIGhhbmRsZXIgdG8gcmVhbCBtb2RlIG1lbW9yeSAgICovCi0gICAgaWYgKChtb3VzZVB0ciA9IFBNX2FsbG9jUmVhbFNlZyhzaXplb2YobW91c2VIYW5kbGVyKSwmcnNlZywmcm9mZikpID09IE5VTEwpCi0JcmV0dXJuIDA7Ci0gICAgbWVtY3B5KG1vdXNlUHRyLG1vdXNlSGFuZGxlcixzaXplb2YobW91c2VIYW5kbGVyKSk7Ci0gICAgaWYgKCFfRFBNSV9hbGxvY2F0ZUNhbGxiYWNrKF9QTV9tb3VzZVBNQ0IsIG1vdXNlUmVncywgJm1vdXNlUk1DQikpCi0JUE1fZmF0YWxFcnJvcigiVW5hYmxlIHRvIGFsbG9jYXRlIHJlYWwgbW9kZSBjYWxsYmFjayFcbiIpOwotICAgIFBNX3NldExvbmcobW91c2VQdHIsbW91c2VSTUNCKTsKLQotICAgIC8qIEluc3RhbGwgdGhlIHJlYWwgbW9kZSBtb3VzZSBoYW5kbGVyICAqLwotICAgIF9QTV9tb3VzZUhhbmRsZXIgPSBtaDsKLSAgICBzcmVncy5lcyA9IHJzZWc7Ci0gICAgcmVncy54LmR4ID0gcm9mZis0OwotICAgIHJlZ3MueC5jeCA9IF9QTV9tb3VzZU1hc2sgPSBtYXNrOwotICAgIHJlZ3MueC5heCA9IDB4QzsKLSAgICBQTV9pbnQ4NngoMHgzMywgJnJlZ3MsICZyZWdzLCAmc3JlZ3MpOwotICAgIHJldHVybiAxOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVNb3VzZUhhbmRsZXIodm9pZCkKLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0KLSAgICBpZiAoX1BNX21vdXNlSGFuZGxlcikgewotCXJlZ3MueC5heCA9IDMzOwotCVBNX2ludDg2KDB4MzMsICZyZWdzLCAmcmVncyk7Ci0JUE1fZnJlZVJlYWxTZWcobW91c2VQdHIpOwotCV9EUE1JX2ZyZWVDYWxsYmFjayhtb3VzZVJNQ0IpOwotCV9QTV9tb3VzZUhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGdldElTUihpbnQgaW50bm8sIFBNRkFSUFRSICpwbWlzciwgbG9uZyAqcmVhbGlzcikKLXsKLSAgICBQTV9nZXRQTXZlY3QoaW50bm8scG1pc3IpOwotICAgIF9QTV9nZXRSTXZlY3QoaW50bm8scmVhbGlzcik7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlc3RvcmVJU1IoaW50IGludG5vLCBQTUZBUlBUUiBwbWlzciwgbG9uZyByZWFsaXNyKQotewotICAgIF9QTV9zZXRSTXZlY3QoaW50bm8scmVhbGlzcik7Ci0gICAgUE1fcmVzdG9yZVBNdmVjdChpbnRubyxwbWlzcik7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldElTUihpbnQgaW50bm8sIHZvaWQgKCogUE1BUEkgcG1pc3IpKCkpCi17Ci0gICAgbG9ja1BNSGFuZGxlcnMoKTsgICAgICAgICAgIC8qIEVuc3VyZSBvdXIgaGFuZGxlcnMgYXJlIGxvY2tlZCAgICovCi0gICAgUE1fc2V0UE12ZWN0KGludG5vLHBtaXNyKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRUaW1lckhhbmRsZXIoUE1faW50SGFuZGxlciB0aCkKLXsKLSAgICBnZXRJU1IoMHg4LCAmX1BNX3ByZXZUaW1lciwgJl9QTV9wcmV2UmVhbFRpbWVyKTsKLSAgICBfUE1fdGltZXJIYW5kbGVyID0gdGg7Ci0gICAgc2V0SVNSKDB4OCwgX1BNX3RpbWVySVNSKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlVGltZXJIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV90aW1lckhhbmRsZXIpIHsKLQlyZXN0b3JlSVNSKDB4OCwgX1BNX3ByZXZUaW1lciwgX1BNX3ByZXZSZWFsVGltZXIpOwotCV9QTV90aW1lckhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotaWJvb2wgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0hhbmRsZXIoUE1faW50SGFuZGxlciB0aCxpbnQgZnJlcXVlbmN5KQotewotICAgIC8qIFNhdmUgdGhlIG9sZCBDTU9TIHJlYWwgdGltZSBjbG9jayB2YWx1ZXMgKi8KLSAgICBfUE1fb2xkQ01PU1JlZ0EgPSBfUE1fcmVhZENNT1MoMHgwQSk7Ci0gICAgX1BNX29sZENNT1NSZWdCID0gX1BNX3JlYWRDTU9TKDB4MEIpOwotCi0gICAgLyogU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgaW50ZXJydXB0IGhhbmRsZXIgKi8KLSAgICBnZXRJU1IoMHg3MCwgJl9QTV9wcmV2UlRDLCAmX1BNX3ByZXZSZWFsUlRDKTsKLSAgICBfUE1fcnRjSGFuZGxlciA9IHRoOwotICAgIHNldElTUigweDcwLCBfUE1fcnRjSVNSKTsKLQotICAgIC8qIFByb2dyYW0gdGhlIHJlYWwgdGltZSBjbG9jayBkZWZhdWx0IGZyZXF1ZW5jeSAqLwotICAgIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3koZnJlcXVlbmN5KTsKLQotICAgIC8qIFVubWFzayBJUlE4IGluIHRoZSBQSUMyICovCi0gICAgX1BNX29sZFJUQ1BJQzIgPSBQTV9pbnBiKDB4QTEpOwotICAgIFBNX291dHBiKDB4QTEsX1BNX29sZFJUQ1BJQzIgJiAweEZFKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlUmVhbFRpbWVDbG9ja0hhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX3J0Y0hhbmRsZXIpIHsKLQkvKiBSZXN0b3JlIENNT1MgcmVnaXN0ZXJzIGFuZCBtYXNrIFJUQyBjbG9jayAqLwotCV9QTV93cml0ZUNNT1MoMHgwQSxfUE1fb2xkQ01PU1JlZ0EpOwotCV9QTV93cml0ZUNNT1MoMHgwQixfUE1fb2xkQ01PU1JlZ0IpOwotCVBNX291dHBiKDB4QTEsKFBNX2lucGIoMHhBMSkgJiAweEZFKSB8IChfUE1fb2xkUlRDUElDMiAmIH4weEZFKSk7Ci0KLQkvKiBSZXN0b3JlIHRoZSBpbnRlcnJ1cHQgdmVjdG9yICovCi0JcmVzdG9yZUlTUigweDcwLCBfUE1fcHJldlJUQywgX1BNX3ByZXZSZWFsUlRDKTsKLQlfUE1fcnRjSGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi1QTV9JUlFIYW5kbGUgUE1BUEkgUE1fc2V0SVJRSGFuZGxlcigKLSAgICBpbnQgSVJRLAotICAgIFBNX2lycUhhbmRsZXIgaWgpCi17Ci0gICAgaW50ICAgICAgICAgICAgIHRodW5rU2l6ZSxQSUNtYXNrLGNoYWluUHJldmlvdXM7Ci0gICAgdWxvbmcgICAgICAgICAgIG9mZnNldEFkanVzdDsKLSAgICBfUE1fSVJRSGFuZGxlICAgKmhhbmRsZTsKLQotICAgIHRodW5rU2l6ZSA9ICh1bG9uZylfUE1faXJxSVNSVGVtcGxhdGVFbmQgLSAodWxvbmcpX1BNX2lycUlTUlRlbXBsYXRlOwotICAgIGlmICgoaGFuZGxlID0gUE1fbWFsbG9jKHNpemVvZihfUE1fSVJRSGFuZGxlKSArIHRodW5rU2l6ZSkpID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0gICAgaGFuZGxlLT5JUlEgPSBJUlE7Ci0gICAgaGFuZGxlLT5wcmV2UElDID0gUE1faW5wYigweDIxKTsKLSAgICBoYW5kbGUtPnByZXZQSUMyID0gUE1faW5wYigweEExKTsKLSAgICBpZiAoSVJRIDwgOCkgewotCWhhbmRsZS0+SVJRVmVjdCA9IChJUlEgKyA4KTsKLQlQSUNtYXNrID0gKDEgPDwgSVJRKTsKLQljaGFpblByZXZpb3VzID0gKChoYW5kbGUtPnByZXZQSUMgJiBQSUNtYXNrKSA9PSAwKTsKLQl9Ci0gICAgZWxzZSB7Ci0JaGFuZGxlLT5JUlFWZWN0ID0gKDB4NjAgKyBJUlEgKyA4KTsKLQlQSUNtYXNrID0gKCgxIDw8IElSUSkgfCAweDQpOwotCWNoYWluUHJldmlvdXMgPSAoKGhhbmRsZS0+cHJldlBJQzIgJiAoUElDbWFzayA+PiA4KSkgPT0gMCk7Ci0JfQotCi0gICAgLyogQ29weSBhbmQgc2V0dXAgdGhlIGFzc2VtYmxlciB0aHVuayAqLwotICAgIG9mZnNldEFkanVzdCA9ICh1bG9uZyloYW5kbGUtPnRodW5rIC0gKHVsb25nKV9QTV9pcnFJU1JUZW1wbGF0ZTsKLSAgICBtZW1jcHkoaGFuZGxlLT50aHVuayxfUE1faXJxSVNSVGVtcGxhdGUsdGh1bmtTaXplKTsKLSAgICAqKCh1bG9uZyopJmhhbmRsZS0+dGh1bmtbMl0pID0gb2Zmc2V0QWRqdXN0OwotICAgICooKHVsb25nKikmaGFuZGxlLT50aHVua1sxMSswXSkgPSAodWxvbmcpaWg7Ci0gICAgaWYgKGNoYWluUHJldmlvdXMpIHsKLQkqKCh1bG9uZyopJmhhbmRsZS0+dGh1bmtbMTErNF0pID0gaGFuZGxlLT5wcmV2SGFuZGxlci5vZmY7Ci0JKigodWxvbmcqKSZoYW5kbGUtPnRodW5rWzExKzhdKSA9IGhhbmRsZS0+cHJldkhhbmRsZXIuc2VsOwotCX0KLSAgICBlbHNlIHsKLQkqKCh1bG9uZyopJmhhbmRsZS0+dGh1bmtbMTErNF0pID0gMDsKLQkqKCh1bG9uZyopJmhhbmRsZS0+dGh1bmtbMTErOF0pID0gMDsKLQl9Ci0gICAgKigodWxvbmcqKSZoYW5kbGUtPnRodW5rWzExKzEyXSkgPSBJUlE7Ci0KLSAgICAvKiBTZXQgdGhlIHJlYWwgdGltZSBjbG9jayBpbnRlcnJ1cHQgaGFuZGxlciAqLwotICAgIGdldElTUihoYW5kbGUtPklSUVZlY3QsICZoYW5kbGUtPnByZXZIYW5kbGVyLCAmaGFuZGxlLT5wcmV2UmVhbGhhbmRsZXIpOwotICAgIHNldElTUihoYW5kbGUtPklSUVZlY3QsIChQTV9pbnRIYW5kbGVyKWhhbmRsZS0+dGh1bmspOwotCi0gICAgLyogVW5tYXNrIHRoZSBJUlEgaW4gdGhlIFBJQyAqLwotICAgIFBNX291dHBiKDB4QTEsaGFuZGxlLT5wcmV2UElDMiAmIH4oUElDbWFzayA+PiA4KSk7Ci0gICAgUE1fb3V0cGIoMHgyMSxoYW5kbGUtPnByZXZQSUMgJiB+UElDbWFzayk7Ci0gICAgcmV0dXJuIGhhbmRsZTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlSVJRSGFuZGxlcigKLSAgICBQTV9JUlFIYW5kbGUgaXJxSGFuZGxlKQotewotICAgIGludCAgICAgICAgICAgICBQSUNtYXNrOwotICAgIF9QTV9JUlFIYW5kbGUgICAqaGFuZGxlID0gaXJxSGFuZGxlOwotCi0gICAgLyogUmVzdG9yZSBQSUMgbWFzayBmb3IgdGhlIGludGVycnVwdCAqLwotICAgIGlmIChoYW5kbGUtPklSUSA8IDgpCi0JUElDbWFzayA9ICgxIDw8IGhhbmRsZS0+SVJRKTsKLSAgICBlbHNlCi0JUElDbWFzayA9ICgoMSA8PCBoYW5kbGUtPklSUSkgfCAweDQpOwotICAgIFBNX291dHBiKDB4QTEsKFBNX2lucGIoMHhBMSkgJiB+KFBJQ21hc2sgPj4gOCkpIHwgKGhhbmRsZS0+cHJldlBJQzIgJiAoUElDbWFzayA+PiA4KSkpOwotICAgIFBNX291dHBiKDB4MjEsKFBNX2lucGIoMHgyMSkgJiB+UElDbWFzaykgfCAoaGFuZGxlLT5wcmV2UElDICYgUElDbWFzaykpOwotCi0gICAgLyogUmVzdG9yZSB0aGUgaW50ZXJydXB0IHZlY3RvciAqLwotICAgIHJlc3RvcmVJU1IoaGFuZGxlLT5JUlFWZWN0LCBoYW5kbGUtPnByZXZIYW5kbGVyLCBoYW5kbGUtPnByZXZSZWFsaGFuZGxlcik7Ci0KLSAgICAvKiBGaW5hbGx5IGZyZWUgdGhlIHRodW5rICovCi0gICAgUE1fZnJlZShoYW5kbGUpOwotfQotCi12b2lkIFBNQVBJIFBNX3NldEtleUhhbmRsZXIoUE1faW50SGFuZGxlciBraCkKLXsKLSAgICBnZXRJU1IoMHg5LCAmX1BNX3ByZXZLZXksICZfUE1fcHJldlJlYWxLZXkpOwotICAgIF9QTV9rZXlIYW5kbGVyID0ga2g7Ci0gICAgc2V0SVNSKDB4OSwgX1BNX2tleUlTUik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUtleUhhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX2tleUhhbmRsZXIpIHsKLQlyZXN0b3JlSVNSKDB4OSwgX1BNX3ByZXZLZXksIF9QTV9wcmV2UmVhbEtleSk7Ci0JX1BNX2tleUhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRLZXkxNUhhbmRsZXIoUE1fa2V5MTVIYW5kbGVyIGtoKQotewotICAgIGdldElTUigweDE1LCAmX1BNX3ByZXZLZXkxNSwgJl9QTV9wcmV2UmVhbEtleTE1KTsKLSAgICBfUE1fa2V5MTVIYW5kbGVyID0ga2g7Ci0gICAgc2V0SVNSKDB4MTUsIF9QTV9rZXkxNUlTUik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUtleTE1SGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fa2V5MTVIYW5kbGVyKSB7Ci0JcmVzdG9yZUlTUigweDE1LCBfUE1fcHJldktleTE1LCBfUE1fcHJldlJlYWxLZXkxNSk7Ci0JX1BNX2tleTE1SGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi0vKiBSZWFsIG1vZGUgQ3RybC1DIGFuZCBDdHJsLUJyZWFrIGhhbmRsZXIuIFRoaXMgaGFuZGxlciBzaW1wbHkgc2V0cyBhCi0gKiBmbGFnIGluIHRoZSByZWFsIG1vZGUgY29kZSBzZWdtZW50IGFuZCBleGl0LiBXZSBzYXZlIHRoZSBsb2NhdGlvbgotICogb2YgdGhpcyBmbGFnIGluIHJlYWwgbW9kZSBtZW1vcnkgc28gdGhhdCBib3RoIHRoZSByZWFsIG1vZGUgYW5kCi0gKiBwcm90ZWN0ZWQgbW9kZSBjb2RlIHdpbGwgYmUgbW9kaWZ5aW5nIHRoZSBzYW1lIGZsYWdzLgotICovCi0KLSNpZm5kZWYgRE9TNEdXCi1zdGF0aWMgdWNoYXIgY3RybEhhbmRsZXJbXSA9IHsKLSAgICAweDAwLDB4MDAsMHgwMCwweDAwLCAgICAgICAgICAgIC8qICBjdHJsQkZsYWcgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHg2NiwweDJFLDB4QzcsMHgwNiwweDAwLDB4MDAsCi0gICAgMHgwMSwweDAwLDB4MDAsMHgwMCwgICAgICAgICAgICAvKiAgbW92ICAgICBbY3M6Y3RybEJGbGFnXSwxICAgICAgICAqLwotICAgIDB4Q0YsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGlyZXRmICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB9OwotI2VuZGlmCi0KLXZvaWQgUE1BUEkgUE1faW5zdGFsbEFsdEJyZWFrSGFuZGxlcihQTV9icmVha0hhbmRsZXIgYmgpCi17Ci0jaWZuZGVmIERPUzRHVwotICAgIHVpbnQgICAgcnNlZyxyb2ZmOwotI2Vsc2UKLSAgICBzdGF0aWMgaW50ICBjdHJsQ0ZsYWcsY3RybEJGbGFnOwotCi0gICAgX1BNX2N0cmxDUHRyID0gKHVjaGFyKikmY3RybENGbGFnOwotICAgIF9QTV9jdHJsQlB0ciA9ICh1Y2hhciopJmN0cmxCRmxhZzsKLSNlbmRpZgotCi0gICAgZ2V0SVNSKDB4MUIsICZfUE1fcHJldkJyZWFrLCAmcHJldlJlYWxCcmVhayk7Ci0gICAgZ2V0SVNSKDB4MjMsICZfUE1fcHJldkN0cmxDLCAmcHJldlJlYWxDdHJsQyk7Ci0gICAgX1BNX2JyZWFrSGFuZGxlciA9IGJoOwotICAgIHNldElTUigweDFCLCBfUE1fYnJlYWtJU1IpOwotICAgIHNldElTUigweDIzLCBfUE1fY3RybENJU1IpOwotCi0jaWZuZGVmIERPUzRHVwotICAgIC8qIEhvb2sgdGhlIHJlYWwgbW9kZSB2ZWN0b3JzIGZvciB0aGVzZSBoYW5kbGVycywgYXMgdGhlc2UgYXJlIG5vdAotICAgICAqIG5vcm1hbGx5IHJlZmxlY3RlZCBieSB0aGUgRFBNSSBzZXJ2ZXIgdXAgdG8gcHJvdGVjdGVkIG1vZGUKLSAgICAgKi8KLSAgICBfUE1fY3RybEJQdHIgPSBQTV9hbGxvY1JlYWxTZWcoc2l6ZW9mKGN0cmxIYW5kbGVyKSoyLCAmcnNlZywgJnJvZmYpOwotICAgIG1lbWNweShfUE1fY3RybEJQdHIsY3RybEhhbmRsZXIsc2l6ZW9mKGN0cmxIYW5kbGVyKSk7Ci0gICAgbWVtY3B5KF9QTV9jdHJsQlB0citzaXplb2YoY3RybEhhbmRsZXIpLGN0cmxIYW5kbGVyLHNpemVvZihjdHJsSGFuZGxlcikpOwotICAgIF9QTV9jdHJsQ1B0ciA9IF9QTV9jdHJsQlB0ciArIHNpemVvZihjdHJsSGFuZGxlcik7Ci0gICAgX1BNX3NldFJNdmVjdCgweDFCLCgobG9uZylyc2VnIDw8IDE2KSB8IChyb2ZmKzQpKTsKLSAgICBfUE1fc2V0Uk12ZWN0KDB4MjMsKChsb25nKXJzZWcgPDwgMTYpIHwgKHJvZmYrc2l6ZW9mKGN0cmxIYW5kbGVyKSs0KSk7Ci0jZW5kaWYKLX0KLQotdm9pZCBQTUFQSSBQTV9pbnN0YWxsQnJlYWtIYW5kbGVyKHZvaWQpCi17Ci0gICAgUE1faW5zdGFsbEFsdEJyZWFrSGFuZGxlcihOVUxMKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlQnJlYWtIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9wcmV2QnJlYWsuc2VsKSB7Ci0JcmVzdG9yZUlTUigweDFCLCBfUE1fcHJldkJyZWFrLCBwcmV2UmVhbEJyZWFrKTsKLQlyZXN0b3JlSVNSKDB4MjMsIF9QTV9wcmV2Q3RybEMsIHByZXZSZWFsQ3RybEMpOwotCV9QTV9wcmV2QnJlYWsuc2VsID0gMDsKLQlfUE1fYnJlYWtIYW5kbGVyID0gTlVMTDsKLSNpZm5kZWYgRE9TNEdXCi0JUE1fZnJlZVJlYWxTZWcoX1BNX2N0cmxCUHRyKTsKLSNlbmRpZgotCX0KLX0KLQotLyogUmVhbCBtb2RlIENyaXRpY2FsIEVycm9yIGhhbmRsZXIuIFRoaXMgaGFuZGxlciBzaW1wbHkgc2F2ZXMgdGhlIEFYIGFuZAotICogREkgdmFsdWVzIGluIHRoZSByZWFsIG1vZGUgY29kZSBzZWdtZW50IGFuZCBleGl0cy4gV2Ugc2F2ZSB0aGUgbG9jYXRpb24KLSAqIG9mIHRoaXMgZmxhZyBpbiByZWFsIG1vZGUgbWVtb3J5IHNvIHRoYXQgYm90aCB0aGUgcmVhbCBtb2RlIGFuZAotICogcHJvdGVjdGVkIG1vZGUgY29kZSB3aWxsIGJlIG1vZGlmeWluZyB0aGUgc2FtZSBmbGFncy4KLSAqLwotCi0jaWZuZGVmIERPUzRHVwotc3RhdGljIHVjaGFyIGNyaXRpY2FsSGFuZGxlcltdID0gewotICAgIDB4MDAsMHgwMCwgICAgICAgICAgICAgICAgICAgICAgLyogIGF4Q29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAweDAwLDB4MDAsICAgICAgICAgICAgICAgICAgICAgIC8qICBkaUNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHgyRSwweEEzLDB4MDAsMHgwMCwgICAgICAgICAgICAvKiAgbW92ICAgICBbY3M6YXhDb2RlXSxheCAgICAgICAgICAqLwotICAgIDB4MkUsMHg4OSwweDNFLDB4MDIsMHgwMCwgICAgICAgLyogIG1vdiAgICAgW2NzOmRpQ29kZV0sZGkgICAgICAgICAgKi8KLSAgICAweEI4LDB4MDMsMHgwMCwgICAgICAgICAgICAgICAgIC8qICBtb3YgICAgIGF4LDMgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHhDRiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgaXJldGYgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIH07Ci0jZW5kaWYKLQotdm9pZCBQTUFQSSBQTV9pbnN0YWxsQWx0Q3JpdGljYWxIYW5kbGVyKFBNX2NyaXRpY2FsSGFuZGxlciBjaCkKLXsKLSNpZm5kZWYgRE9TNEdXCi0gICAgdWludCAgICByc2VnLHJvZmY7Ci0jZWxzZQotICAgIHN0YXRpYyAgc2hvcnQgICBjcml0QnVmWzJdOwotCi0gICAgX1BNX2NyaXRQdHIgPSAodWNoYXIqKWNyaXRCdWY7Ci0jZW5kaWYKLQotICAgIGdldElTUigweDI0LCAmX1BNX3ByZXZDcml0aWNhbCwgJnByZXZSZWFsQ3JpdGljYWwpOwotICAgIF9QTV9jcml0SGFuZGxlciA9IGNoOwotICAgIHNldElTUigweDI0LCBfUE1fY3JpdGljYWxJU1IpOwotCi0jaWZuZGVmIERPUzRHVwotICAgIC8qIEhvb2sgdGhlIHJlYWwgbW9kZSB2ZWN0b3IsIGFzIHRoaXMgaXMgbm90IG5vcm1hbGx5IHJlZmxlY3RlZCBieSB0aGUKLSAgICAgKiBEUE1JIHNlcnZlciB1cCB0byBwcm90ZWN0ZWQgbW9kZS4KLSAgICAgKi8KLSAgICBfUE1fY3JpdFB0ciA9IFBNX2FsbG9jUmVhbFNlZyhzaXplb2YoY3JpdGljYWxIYW5kbGVyKSoyLCAmcnNlZywgJnJvZmYpOwotICAgIG1lbWNweShfUE1fY3JpdFB0cixjcml0aWNhbEhhbmRsZXIsc2l6ZW9mKGNyaXRpY2FsSGFuZGxlcikpOwotICAgIF9QTV9zZXRSTXZlY3QoMHgyNCwoKGxvbmcpcnNlZyA8PCAxNikgfCAocm9mZis0KSk7Ci0jZW5kaWYKLX0KLQotdm9pZCBQTUFQSSBQTV9pbnN0YWxsQ3JpdGljYWxIYW5kbGVyKHZvaWQpCi17Ci0gICAgUE1faW5zdGFsbEFsdENyaXRpY2FsSGFuZGxlcihOVUxMKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlQ3JpdGljYWxIYW5kbGVyKHZvaWQpCi17Ci0gICAgaWYgKF9QTV9wcmV2Q3JpdGljYWwuc2VsKSB7Ci0JcmVzdG9yZUlTUigweDI0LCBfUE1fcHJldkNyaXRpY2FsLCBwcmV2UmVhbENyaXRpY2FsKTsKLQlQTV9mcmVlUmVhbFNlZyhfUE1fY3JpdFB0cik7Ci0JX1BNX3ByZXZDcml0aWNhbC5zZWwgPSAwOwotCV9QTV9jcml0SGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi1pbnQgUE1BUEkgUE1fbG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIFBNU1JFR1Mgc3JlZ3M7Ci0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHJldHVybiBEUE1JX2xvY2tMaW5lYXJQYWdlcygodWludClwICsgRFBNSV9nZXRTZWxlY3RvckJhc2Uoc3JlZ3MuZHMpLGxlbik7Ci19Ci0KLWludCBQTUFQSSBQTV91bmxvY2tEYXRhUGFnZXModm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBQTVNSRUdTIHNyZWdzOwotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICByZXR1cm4gRFBNSV91bmxvY2tMaW5lYXJQYWdlcygodWludClwICsgRFBNSV9nZXRTZWxlY3RvckJhc2Uoc3JlZ3MuZHMpLGxlbik7Ci19Ci0KLWludCBQTUFQSSBQTV9sb2NrQ29kZVBhZ2VzKHZvaWQgKCpwKSgpLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIFBNU1JFR1Mgc3JlZ3M7Ci0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHJldHVybiBEUE1JX2xvY2tMaW5lYXJQYWdlcygodWludClwICsgRFBNSV9nZXRTZWxlY3RvckJhc2Uoc3JlZ3MuY3MpLGxlbik7Ci19Ci0KLWludCBQTUFQSSBQTV91bmxvY2tDb2RlUGFnZXModm9pZCAoKnApKCksdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgUE1TUkVHUyBzcmVnczsKLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0gICAgcmV0dXJuIERQTUlfdW5sb2NrTGluZWFyUGFnZXMoKHVpbnQpcCArIERQTUlfZ2V0U2VsZWN0b3JCYXNlKHNyZWdzLmNzKSxsZW4pOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2Rvcy92ZmxhdC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL3ZmbGF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZTliNmMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL3ZmbGF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IERPUwotKgotKiBEZXNjcmlwdGlvbjogIE1haW4gQyBtb2R1bGUgZm9yIHRoZSBWRmxhdCBmcmFtZWJ1ZmZlciByb3V0aW5lcy4gVGhlIHBhZ2UKLSogICAgICAgICAgICAgICBmYXVsdCBoYW5kbGVyIGlzIGFsd2F5cyBpbnN0YWxsZWQgdG8gaGFuZGxlIHVwIHRvIGEgNE1iCi0qICAgICAgICAgICAgICAgZnJhbWVidWZmZXIgd2l0aCBhIHdpbmRvdyBzaXplIG9mIDRLYiBvciA2NEtiIGluIHNpemUuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxkb3MuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIERPUzRHL1csIFBNT0RFL1cgYW5kIENhdXNlV2F5IHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWYgZGVmaW5lZChET1M0R1cpCi0KLSNkZWZpbmUgVkZMQVRfU1RBUlRfQUREUiAgICAweEYwMDAwMDAwVQotI2RlZmluZSBWRkxBVF9FTkRfQUREUiAgICAgIDB4RjAzRkZGRkZVCi0jZGVmaW5lIFZGTEFUX0xJTUlUICAgICAgICAgKFZGTEFUX0VORF9BRERSIC0gVkZMQVRfU1RBUlRfQUREUikKLSNkZWZpbmUgUEFHRV9QUkVTRU5UICAgICAgICAxCi0jZGVmaW5lIFBBR0VfTk9UUFJFU0VOVCAgICAgMAotI2RlZmluZSBQQUdFX1JFQUQgICAgICAgICAgIDAKLSNkZWZpbmUgUEFHRV9XUklURSAgICAgICAgICAyCi0KLVBSSVZBVEUgaWJvb2wgICBpbnN0YWxsZWQgPSBmYWxzZTsKLVBSSVZBVEUgaWJvb2wgICBoYXZlRFBNSSA9IGZhbHNlOwotUFVCTElDICBpYm9vbCAgIF9BU01BUEkgVkZfaGF2ZUNhdXNlV2F5ID0gZmFsc2U7Ci1QVUJMSUMgIHVjaGFyICogX0FTTUFQSSBWRl96ZXJvUHRyID0gTlVMTDsKLQotLyogTG93IGxldmVsIGFzc2VtYmxlciBjb2RlICovCi0KLWludCAgICAgX0FTTUFQSSBJbml0UGFnaW5nKHZvaWQpOwotdm9pZCAgICBfQVNNQVBJIENsb3NlUGFnaW5nKHZvaWQpOwotdm9pZCAgICBfQVNNQVBJIE1hcFBoeXNpY2FsMkxpbmVhcih1bG9uZyBwQWRkciwgdWxvbmcgbEFkZHIsIGludCBwYWdlcywgaW50IGZsYWdzKTsKLXZvaWQgICAgX0FTTUFQSSBJbnN0YWxsRmF1bHRIYW5kbGVyKHVsb25nIGJhc2VBZGRyLGludCBiYW5rU2l6ZSk7Ci12b2lkICAgIF9BU01BUEkgUmVtb3ZlRmF1bHRIYW5kbGVyKHZvaWQpOwotdm9pZCAgICBfQVNNQVBJIEluc3RhbGxCYW5rRnVuYyhpbnQgY29kZUxlbix2b2lkICpiYW5rRnVuYyk7Ci0KLXZvaWQgKiBfQVNNQVBJIFZGX21hbGxvYyh1aW50IHNpemUpCi17IHJldHVybiBQTV9tYWxsb2Moc2l6ZSk7IH0KLQotdm9pZCBfQVNNQVBJIFZGX2ZyZWUodm9pZCAqcCkKLXsgUE1fZnJlZShwKTsgfQotCi1QUklWQVRFIGlib29sIENoZWNrRFBNSSh2b2lkKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBDaGVja0RQTUkKLSogUmV0dXJuczogICAgICBUcnVlIGlmIHdlIGFyZSBydW5uaW5nIHVuZGVyIERQTUkKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgUE1SRUdTICByZWdzOwotCi0gICAgaWYgKGhhdmVEUE1JKQotCXJldHVybiB0cnVlOwotCi0gICAgLyogQ2hlY2sgaWYgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgRFBNSSBpbiB3aGljaCBjYXNlIHdlIHdpbGwgbm90IGJlCi0gICAgICogYWJsZSB0byBpbnN0YWxsIG91ciBwYWdlIGZhdWx0IGhhbmRsZXJzLiBXZSBjYW4gaG93ZXZlciB1c2UgdGhlCi0gICAgICogRFZBLjM4NiBvciBWRkxBVEQuMzg2IHZpcnR1YWwgZGV2aWNlIGRyaXZlcnMgaWYgdGhleSBhcmUgcHJlc2VudC4KLSAgICAgKi8KLSAgICByZWdzLnguYXggPSAweEZGMDA7Ci0gICAgUE1faW50Mzg2KDB4MzEsJnJlZ3MsJnJlZ3MpOwotICAgIGlmICghcmVncy54LmNmbGFnICYmIChyZWdzLmUuZWRpICYgOCkpCi0JcmV0dXJuIChoYXZlRFBNSSA9IHRydWUpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotaWJvb2wgUE1BUEkgVkZfYXZhaWxhYmxlKHZvaWQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIFZGX2F2YWlsYWJsZQotKiBSZXR1cm5zOiAgICAgIFRydWUgaWYgdmlydHVhbCBidWZmZXIgaXMgYXZhaWxhYmxlLCBmYWxzZSBpZiBub3QuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIGlmICghVkZfemVyb1B0cikKLQlWRl96ZXJvUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDAsMHhGRkZGRkZGRix0cnVlKTsKLSAgICBpZiAoQ2hlY2tEUE1JKCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgLyogU3RhbmRhcmQgRE9TNEdXLCBQTU9ERS9XIGFuZCBDYXVzZXdheSAqLwotICAgIGlmIChJbml0UGFnaW5nKCkgPT0gLTEpCi0JcmV0dXJuIGZhbHNlOwotICAgIENsb3NlUGFnaW5nKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgKiBQTUFQSSBJbml0RFBNSSh1bG9uZyBiYXNlQWRkcixpbnQgYmFua1NpemUsaW50IGNvZGVMZW4sdm9pZCAqYmFua0Z1bmMpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGdW5jdGlvbjogICAgIEluaXRET1M0R1cKLSogUGFyYW1ldGVyczogICBiYXNlQWRkciAgICAtIEJhc2UgYWRkcmVzcyBvZiBmcmFtZWJ1ZmZlciBiYW5rIHdpbmRvdwotKiAgICAgICAgICAgICAgIGJhbmtTaXplICAgIC0gUGh5c2ljYWwgc2l6ZSBvZiBiYW5rcyBpbiBLYiAoNCBvciA2NCkKLSogICAgICAgICAgICAgICBjb2RlTGVuICAgICAtIExlbmd0aCBvZiAzMiBiaXQgYmFuayBzd2l0Y2ggZnVuY3Rpb24KLSogICAgICAgICAgICAgICBiYW5rRnVuYyAgICAtIFBvaW50ZXIgdG8gcHJvdGVjdGVkIG1vZGUgYmFuayBmdW5jdGlvbgotKiBSZXR1cm5zOiAgICAgIE5lYXIgcG9pbnRlciB0byB2aXJ0dWFsIGZyYW1lYnVmZmVyLCBvciBOVUxMIG9uIGZhaWx1cmUuCi0qCi0qIERlc2NyaXB0aW9uOiAgSW5zdGFsbHMgdGhlIHZpcnR1YWwgbGluZWFyIGZyYW1lYnVmZmVyIGhhbmRsaW5nIGZvcgotKiAgICAgICAgICAgICAgIERQTUkgZW52aXJvbm1lbnRzLiBUaGlzIHJlcXVpcmVzIHRoZSBEVkEuMzg2IG9yIFZGTEFURC4zODYKLSogICAgICAgICAgICAgICB2aXJ0dWFsIGRldmljZSBkcml2ZXJzIHRvIGJlIGluc3RhbGxlZCBhbmQgZnVuY3Rpb25pbmcuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgICh2b2lkKWJhc2VBZGRyOwotICAgICh2b2lkKWJhbmtTaXplOwotICAgICh2b2lkKWNvZGVMZW47Ci0gICAgKHZvaWQpYmFua0Z1bmM7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgKiBQTUFQSSBJbml0RE9TNEdXKHVsb25nIGJhc2VBZGRyLGludCBiYW5rU2l6ZSxpbnQgY29kZUxlbix2b2lkICpiYW5rRnVuYykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIEZ1bmN0aW9uOiAgICAgSW5pdERPUzRHVwotKiBQYXJhbWV0ZXJzOiAgIGJhc2VBZGRyICAgIC0gQmFzZSBhZGRyZXNzIG9mIGZyYW1lYnVmZmVyIGJhbmsgd2luZG93Ci0qICAgICAgICAgICAgICAgYmFua1NpemUgICAgLSBQaHlzaWNhbCBzaXplIG9mIGJhbmtzIGluIEtiICg0IG9yIDY0KQotKiAgICAgICAgICAgICAgIGNvZGVMZW4gICAgIC0gTGVuZ3RoIG9mIDMyIGJpdCBiYW5rIHN3aXRjaCBmdW5jdGlvbgotKiAgICAgICAgICAgICAgIGJhbmtGdW5jICAgIC0gUG9pbnRlciB0byBwcm90ZWN0ZWQgbW9kZSBiYW5rIGZ1bmN0aW9uCi0qIFJldHVybnM6ICAgICAgTmVhciBwb2ludGVyIHRvIHZpcnR1YWwgZnJhbWVidWZmZXIsIG9yIE5VTEwgb24gZmFpbHVyZS4KLSoKLSogRGVzY3JpcHRpb246ICBJbnN0YWxscyB0aGUgdmlydHVhbCBsaW5lYXIgZnJhbWVidWZmZXIgaGFuZGxpbmcgZm9yCi0qICAgICAgICAgICAgICAgdGhlIERPUzRHVyBleHRlbmRlci4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgaW50ICAgICBpOwotCi0gICAgaWYgKEluaXRQYWdpbmcoKSA9PSAtMSkKLQlyZXR1cm4gTlVMTDsgICAgICAgICAgICAvKiBDYW5ub3QgZG8gaGFyZHdhcmUgcGFnaW5nISAgICAgICAqLwotCi0gICAgLyogTWFwIDRNQiBvZiB2aWRlbyBtZW1vcnkgaW50byBsaW5lYXIgYWRkcmVzcyBzcGFjZSAocmVhZC93cml0ZSkgKi8KLSAgICBpZiAoYmFua1NpemUgPT0gNjQpIHsKLQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewotCSAgICBNYXBQaHlzaWNhbDJMaW5lYXIoYmFzZUFkZHIsVkZMQVRfU1RBUlRfQUREUisoaTw8MTYpLDE2LAotCQlQQUdFX1dSSVRFIHwgUEFHRV9OT1RQUkVTRU5UKTsKLQkgICAgfQotCX0KLSAgICBlbHNlIHsKLQlmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKSB7Ci0JICAgIE1hcFBoeXNpY2FsMkxpbmVhcihiYXNlQWRkcixWRkxBVF9TVEFSVF9BRERSKyhpPDwxMiksMSwKLQkJUEFHRV9XUklURSB8IFBBR0VfTk9UUFJFU0VOVCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAvKiBJbnN0YWxsIG91ciBwYWdlIGZhdWx0IGhhbmRsZXIgYW5kIGJhbmtzIHN3aXRjaCBmdW5jdGlvbiAqLwotICAgIEluc3RhbGxGYXVsdEhhbmRsZXIoYmFzZUFkZHIsYmFua1NpemUpOwotICAgIEluc3RhbGxCYW5rRnVuYyhjb2RlTGVuLGJhbmtGdW5jKTsKLSAgICBpbnN0YWxsZWQgPSB0cnVlOwotICAgIHJldHVybiAodm9pZCopVkZMQVRfU1RBUlRfQUREUjsKLX0KLQotdm9pZCAqIFBNQVBJIFZGX2luaXQodWxvbmcgYmFzZUFkZHIsaW50IGJhbmtTaXplLGludCBjb2RlTGVuLHZvaWQgKmJhbmtGdW5jKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWRl9pbml0Ci0qIFBhcmFtZXRlcnM6ICAgYmFzZUFkZHIgICAgLSBCYXNlIGFkZHJlc3Mgb2YgZnJhbWVidWZmZXIgYmFuayB3aW5kb3cKLSogICAgICAgICAgICAgICBiYW5rU2l6ZSAgICAtIFBoeXNpY2FsIHNpemUgb2YgYmFua3MgaW4gS2IgKDQgb3IgNjQpCi0qICAgICAgICAgICAgICAgY29kZUxlbiAgICAgLSBMZW5ndGggb2YgMzIgYml0IGJhbmsgc3dpdGNoIGZ1bmN0aW9uCi0qICAgICAgICAgICAgICAgYmFua0Z1bmMgICAgLSBQb2ludGVyIHRvIHByb3RlY3RlZCBtb2RlIGJhbmsgZnVuY3Rpb24KLSogUmV0dXJuczogICAgICBOZWFyIHBvaW50ZXIgdG8gdmlydHVhbCBmcmFtZWJ1ZmZlciwgb3IgTlVMTCBvbiBmYWlsdXJlLgotKgotKiBEZXNjcmlwdGlvbjogIEluc3RhbGxzIHRoZSB2aXJ0dWFsIGxpbmVhciBmcmFtZWJ1ZmZlciBoYW5kbGluZy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgaWYgKGluc3RhbGxlZCkKLQlyZXR1cm4gKHZvaWQqKVZGTEFUX1NUQVJUX0FERFI7Ci0gICAgaWYgKGNvZGVMZW4gPiAxMDApCi0JcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIEJhbmsgZnVuY3Rpb24gaXMgdG9vIGxhcmdlISAgICAgICovCi0gICAgaWYgKCFWRl96ZXJvUHRyKQotCVZGX3plcm9QdHIgPSBQTV9tYXBQaHlzaWNhbEFkZHIoMCwweEZGRkZGRkZGLHRydWUpOwotICAgIGlmIChDaGVja0RQTUkoKSkKLQlyZXR1cm4gSW5pdERQTUkoYmFzZUFkZHIsYmFua1NpemUsY29kZUxlbixiYW5rRnVuYyk7Ci0gICAgcmV0dXJuIEluaXRET1M0R1coYmFzZUFkZHIsYmFua1NpemUsY29kZUxlbixiYW5rRnVuYyk7Ci19Ci0KLXZvaWQgUE1BUEkgVkZfZXhpdCh2b2lkKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246ICAgICBWRl9leGl0Ci0qCi0qIERlc2NyaXB0aW9uOiAgQ2xvc2VzIGRvd24gdGhlIHZpcnR1YWwgZnJhbWVidWZmZXIgc2VydmljZXMgYW5kCi0qICAgICAgICAgICAgICAgcmVzdG9yZXMgdGhlIHByZXZpb3VzIHBhZ2UgZmF1bHQgaGFuZGxlci4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgaWYgKGluc3RhbGxlZCkgewotCWlmIChoYXZlRFBNSSkgewotCSAgICAvKiBEUE1JIHN1cHBvcnQgKi8KLQkgICAgfQotCWVsc2UgewotCSAgICAvKiBTdGFuZGFyZCBET1M0R1cgYW5kIFBNT0RFL1cgc3VwcG9ydCAqLwotCSAgICBSZW1vdmVGYXVsdEhhbmRsZXIoKTsKLQkgICAgQ2xvc2VQYWdpbmcoKTsKLQkgICAgfQotCWluc3RhbGxlZCA9IGZhbHNlOwotCX0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIFN1cHBvcnQgbWFwcGVkIG91dCBmb3Igb3RoZXIgY29tcGlsZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZWxzZQotCi1pYm9vbCBQTUFQSSBWRl9hdmFpbGFibGUodm9pZCkKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgKiBQTUFQSSBWRl9pbml0KHVsb25nIGJhc2VBZGRyLGludCBiYW5rU2l6ZSxpbnQgY29kZUxlbix2b2lkICpiYW5rRnVuYykKLXsKLSAgICAodm9pZCliYXNlQWRkcjsKLSAgICAodm9pZCliYW5rU2l6ZTsKLSAgICAodm9pZCljb2RlTGVuOwotICAgICh2b2lkKWJhbmtGdW5jOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFZGX2V4aXQodm9pZCkKLXsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvenRpbWVyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9kb3MvenRpbWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYWIxNmMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZG9zL3p0aW1lci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIE1TRE9TCi0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBaZW4gVGltZXIgZnVuY3Rpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11Y2hhciAqIF9WQVJBUEkgX1pUaW1lckJJT1NQdHI7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEV4dGVybmFsIGFzc2VtYmxlciBmdW5jdGlvbnMgKi8KLQotdm9pZCAgICBfQVNNQVBJIExaX3RpbWVyT24odm9pZCk7Ci11bG9uZyAgIF9BU01BUEkgTFpfdGltZXJMYXAodm9pZCk7Ci12b2lkICAgIF9BU01BUEkgTFpfdGltZXJPZmYodm9pZCk7Ci11bG9uZyAgIF9BU01BUEkgTFpfdGltZXJDb3VudCh2b2lkKTsKLXZvaWQgICAgX0FTTUFQSSBMWl9kaXNhYmxlKHZvaWQpOwotdm9pZCAgICBfQVNNQVBJIExaX2VuYWJsZSh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBaZW4gVGltZXIgbW9kdWxlIGludGVybmFscy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9fWlRpbWVySW5pdCh2b2lkKQotewotICAgIF9aVGltZXJCSU9TUHRyID0gUE1fZ2V0QklPU1BvaW50ZXIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX19MWlRpbWVyT24odG0pICAgICBMWl90aW1lck9uKCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX19MWlRpbWVyTGFwKHRtKSAgICAgICAgTFpfdGltZXJMYXAoKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfX0xaVGltZXJPZmYodG0pICAgICAgICBMWl90aW1lck9mZigpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgYXNzZW1ibGVyIFplbiBUaW1lciBmdW5jdGlvbnMgdG8gZG8gdGhlIHRpbWluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9fTFpUaW1lckNvdW50KHRtKSAgTFpfdGltZXJDb3VudCgpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGVmaW5lIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBsb25nIHBlcmlvZCB0aW1lciBhcyBtaWNyb3NlY29uZHMgcGVyIHRpbWVyIHRpY2suCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBVTFpUSU1FUl9SRVNPTFVUSU9OICAgICA1NDkyNQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIExvbmcgUGVyaW9kIHRpbWVyIHZhbHVlIGZyb20gdGhlIEJJT1MgdGltZXIgdGljay4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX19VTFpSZWFkVGltZSh2b2lkKQotewotICAgIHVsb25nICAgdGlja3M7Ci0gICAgTFpfZGlzYWJsZSgpOyAgICAgICAgICAgIC8qIFR1cm4gb2YgaW50ZXJydXB0cyAgICAgICAgICAgICAgICovCi0gICAgdGlja3MgPSBQTV9nZXRMb25nKF9aVGltZXJCSU9TUHRyKzB4NkMpOwotICAgIExaX2VuYWJsZSgpOyAgICAgICAgICAgICAvKiBUdXJuIG9uIGludGVycnVwdHMgYWdhaW4gICAgICAgICAqLwotICAgIHJldHVybiB0aWNrczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Db21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgZnJvbSB0aGUgQklPUyB0aW1lciB0aWNrLiBOb3RlIHRoYXQgd2UgY2hlY2sgdG8gc2VlCi13aGV0aGVyIGEgbWlkbmlnaHQgYm91bmRhcnkgaGFzIHBhc3NlZCwgYW5kIGlmIHNvIGFkanVzdCB0aGUgZmluaXNoIHRpbWUgdG8KLWFjY291bnQgZm9yIHRoaXMuIFdlIGNhbm5vdCBkZXRlY3QgaWYgbW9yZSB0aGF0IG9uZSBtaWRuaWdodCBib3VuZGFyeSBoYXMKLXBhc3NlZCwgc28gaWYgdGhpcyBoYXBwZW5zIHdlIHdpbGwgYmUgZ2VuZXJhdGluZyBlcnJvbm91cyByZXN1bHRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9fVUxaRWxhcHNlZFRpbWUodWxvbmcgc3RhcnQsdWxvbmcgZmluaXNoKQotewotICAgIGlmIChmaW5pc2ggPCBzdGFydCkKLQlmaW5pc2ggKz0gMTU3MzA0MEw7ICAgICAgICAgLyogTnVtYmVyIG9mIHRpY2tzIGluIDI0IGhvdXJzICAgICAgKi8KLSAgICByZXR1cm4gZmluaXNoIC0gc3RhcnQ7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9ldmVudC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vZXZlbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZmNDU4Ni4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9ldmVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBNYWluIGltcGxlbWVudGF0aW9uIGZvciB0aGUgU2NpVGVjaCBjcm9zcyBwbGF0Zm9ybSBldmVudAotKiAgICAgICAgICAgICAgIGxpYnJhcnkuIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGFsbCB0aGUgZ2VuZXJpYyBjcm9zcyBwbGF0Zm9ybQotKiAgICAgICAgICAgICAgIGNvZGUsIGFuZCBwdWxscyBpbiBtb2R1bGVzIHNwZWNpZmljIHRvIGVhY2ggdGFyZ2V0IE9TCi0qICAgICAgICAgICAgICAgZW52aXJvbm1lbnQuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiZXZlbnQuaCIKLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgIm9zaGRyLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgRVZFTlRRU0laRSAgICAgIDEwMCAgICAgLyogTnVtYmVyIG9mIGV2ZW50cyBpbiBldmVudCBxdWV1ZSAgICAgICovCi0jZGVmaW5lIEpPWV9OVU1fQVhFUyAgICA0ICAgICAgIC8qIE51bWJlciBvZiBqb3lzdGljayBheGVzIHN1cHBvcnRlZCAgICAqLwotCi1zdGF0aWMgc3RydWN0IHsKLSAgICBpbnQgICAgICAgICBteCxteTsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgbW91c2UgcG9zaXRpb24gICAgICAgICAgICovCi0gICAgaW50ICAgICAgICAgaGVhZDsgICAgICAgICAgICAgICAvKiBIZWFkIG9mIGV2ZW50IHF1ZXVlICAgICAgICAgICAgICAqLwotICAgIGludCAgICAgICAgIHRhaWw7ICAgICAgICAgICAgICAgLyogVGFpbCBvZiBldmVudCBxdWV1ZSAgICAgICAgICAgICAgKi8KLSAgICBpbnQgICAgICAgICBmcmVlSGVhZDsgICAgICAgICAgIC8qIEhlYWQgb2YgZnJlZSBsaXN0ICAgICAgICAgICAgICAgICovCi0gICAgaW50ICAgICAgICAgY291bnQ7ICAgICAgICAgICAgICAvKiBOby4gb2YgaXRlbXMgY3VycmVudGx5IGluIHF1ZXVlICAqLwotICAgIGV2ZW50X3QgICAgIGV2dHFbRVZFTlRRU0laRV07ICAgLyogVGhlIHF1ZXVlIHN0cnVjdHVyZSBpdHNlbGYgICAgICAgKi8KLSAgICBpbnQgICAgICAgICBvbGRNb3ZlOyAgICAgICAgICAgIC8qIFByZXZpb3VzIG1vdmVtZW50IGV2ZW50ICAgICAgICAgICovCi0gICAgaW50ICAgICAgICAgb2xkS2V5OyAgICAgICAgICAgICAvKiBQcmV2aW91cyBrZXkgcmVwZWF0IGV2ZW50ICAgICAgICAqLwotICAgIGludCAgICAgICAgIG9sZEpveU1vdmU7ICAgICAgICAgLyogUHJldmlvdXMgam95c3RpY2sgbW92ZW1lbnQgZXZlbnQgKi8KLSAgICBpbnQgICAgICAgICBqb3lNYXNrOyAgICAgICAgICAgIC8qIE1hc2sgb2Ygam95c3RpY2sgYXhlcyBwcmVzZW50ICAgICovCi0gICAgaW50ICAgICAgICAgam95TWluW0pPWV9OVU1fQVhFU107Ci0gICAgaW50ICAgICAgICAgam95Q2VudGVyW0pPWV9OVU1fQVhFU107Ci0gICAgaW50ICAgICAgICAgam95TWF4W0pPWV9OVU1fQVhFU107Ci0gICAgaW50ICAgICAgICAgam95UHJldltKT1lfTlVNX0FYRVNdOwotICAgIGludCAgICAgICAgIGpveUJ1dFN0YXRlOwotICAgIHVsb25nICAgICAgIGRvdWJsZUNsaWNrOwotICAgIHVsb25nICAgICAgIGF1dG9SZXBlYXQ7Ci0gICAgdWxvbmcgICAgICAgYXV0b0RlbGF5OwotICAgIHVsb25nICAgICAgIGF1dG9UaWNrczsKLSAgICB1bG9uZyAgICAgICBkb3VibGVDbGlja1RocmVzaDsKLSAgICB1bG9uZyAgICAgICBmaXJzdEF1dG87Ci0gICAgaW50ICAgICAgICAgYXV0b01vdXNlX3g7Ci0gICAgaW50ICAgICAgICAgYXV0b01vdXNlX3k7Ci0gICAgZXZlbnRfdCAgICAgZG93bk1vdXNlOwotICAgIHVsb25nICAgICAgIGtleU1vZGlmaWVyczsgICAgICAgLyogQ3VycmVudCBrZXlib2FyZCBtb2RpZmllcnMgICAgICAgKi8KLSAgICB1Y2hhciAgICAgICBrZXlUYWJsZVsxMjhdOyAgICAgIC8qIFRhYmxlIG9mIGtleSB1cC9kb3duIGZsYWdzICAgICAgICovCi0gICAgaWJvb2wgICAgICAgYWxsb3dMRURTOyAgICAgICAgICAvKiBUcnVlIGlmIExFRFMgc2hvdWxkIGNoYW5nZSAgICAgICAqLwotICAgIF9FVlRfdXNlckV2ZW50RmlsdGVyICAgIHVzZXJFdmVudENhbGxiYWNrOwotICAgIF9FVlRfbW91c2VNb3ZlSGFuZGxlciAgIG1vdXNlTW92ZTsKLSAgICBfRVZUX2hlYXJ0QmVhdENhbGxiYWNrICBoZWFydEJlYXQ7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKmhlYXJ0QmVhdFBhcmFtczsKLSAgICBjb2RlcGFnZV90ICAgICAgICAgICAgICAqY29kZVBhZ2U7Ci0gICAgfSBFVlQ7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZiBkZWZpbmVkKF9fUkVBTERPU19fKSB8fCBkZWZpbmVkKF9fU01YMzJfXykKLS8qIHtzZWNyZXR9ICovCi12b2lkIEVWVEFQSSBfRVZUX2NDb2RlU3RhcnQodm9pZCkge30KLSNlbmRpZgotCi0vKiBFeHRlcm5hbCBhc3NlbWJsZXIgZnVuY3Rpb25zICovCi0KLWludCBFVlRBUEkgX0VWVF9yZWFkSm95QXhpcyhpbnQgbWFzayxpbnQgKmF4aXMpOwotaW50IEVWVEFQSSBfRVZUX3JlYWRKb3lCdXR0b25zKHZvaWQpOwotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCi0KLXVsb25nIF9FVlRfZ2V0VGlja3Modm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZXZ0IC0gRXZlbnQgdG8gYWRkIHRvIHRoZSBldmVudCBxdWV1ZQotCi1SRU1BUktTOgotQWRkcyBhbiBldmVudCB0byB0aGUgZXZlbnQgcXVldWUgYnkgdGFja2luZyBpdCBvbnRvIHRoZSB0YWlsIG9mIHRoZSBldmVudAotcXVldWUuIFRoaXMgcm91dGluZSBhc3N1bWVzIHRoYXQgYXQgbGVhc3Qgb25lIHNwb3QgaXMgYXZhaWxhYmxlIG9uIHRoZQotZnJlZUxpc3QgZm9yIHRoZSBldmVudCB0byBiZSBpbnNlcnRlZC4KLQotTk9URTogICBJbnRlcnJ1cHRzIE1VU1QgYmUgT0ZGIHdoaWxlIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gZW5zdXJlIHdlIGhhdmUKLQltdXR1YWxseSBleGNsdXNpdmUgYWNjZXNzIHRvIG91ciBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgZm9yCi0JaW50ZXJydXB0IGRyaXZlbiBzeXN0ZW1zIChsaWtlIHVuZGVyIERPUykuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYWRkRXZlbnQoCi0gICAgZXZlbnRfdCAqZXZ0KQotewotICAgIGludCBldnRJRDsKLQotICAgIC8qIENoZWNrIGZvciBtb3VzZSBkb3VibGUgY2xpY2sgZXZlbnRzICovCi0gICAgaWYgKGV2dC0+d2hhdCAmIEVWVF9NT1VTRUVWVCkgewotCUVWVC5hdXRvTW91c2VfeCA9IGV2dC0+d2hlcmVfeDsKLQlFVlQuYXV0b01vdXNlX3kgPSBldnQtPndoZXJlX3k7Ci0JaWYgKChldnQtPndoYXQgJiBFVlRfTU9VU0VET1dOKSAmJiAhKGV2dC0+bWVzc2FnZSAmIEVWVF9EQkxDTElDSykpIHsKLQkgICAgLyogRGV0ZXJtaW5lIGlmIHRoZSBsYXN0IG1vdXNlIGV2ZW50IHdhcyBhIGRvdWJsZSBjbGljayBldmVudCAqLwotCSAgICB1aW50IGRpZmZfeCA9IEFCUyhldnQtPndoZXJlX3ggLSBFVlQuZG93bk1vdXNlLndoZXJlX3gpOwotCSAgICB1aW50IGRpZmZfeSA9IEFCUyhldnQtPndoZXJlX3kgLSBFVlQuZG93bk1vdXNlLndoZXJlX3kpOwotCSAgICBpZiAoKGV2dC0+bWVzc2FnZSA9PSBFVlQuZG93bk1vdXNlLm1lc3NhZ2UpCi0JCSYmICgoZXZ0LT53aGVuIC0gRVZULmRvd25Nb3VzZS53aGVuKSA8PSBFVlQuZG91YmxlQ2xpY2spCi0JCSYmIChkaWZmX3ggPD0gRVZULmRvdWJsZUNsaWNrVGhyZXNoKQotCQkmJiAoZGlmZl95IDw9IEVWVC5kb3VibGVDbGlja1RocmVzaCkpIHsKLQkJZXZ0LT5tZXNzYWdlIHw9IEVWVF9EQkxDTElDSzsKLQkJRVZULmRvd25Nb3VzZSA9ICpldnQ7Ci0JCUVWVC5kb3duTW91c2Uud2hlbiA9IDA7Ci0JCX0KLQkgICAgZWxzZQotCQlFVlQuZG93bk1vdXNlID0gKmV2dDsKLQkgICAgRVZULmF1dG9UaWNrcyA9IF9FVlRfZ2V0VGlja3MoKTsKLQkgICAgfQotCWVsc2UgaWYgKGV2dC0+d2hhdCAmIEVWVF9NT1VTRVVQKSB7Ci0JICAgIEVWVC5kb3duTW91c2Uud2hhdCA9IEVWVF9OVUxMRVZUOwotCSAgICBFVlQuZmlyc3RBdXRvID0gdHJ1ZTsKLQkgICAgfQotCX0KLQotICAgIC8qIENhbGwgdXNlciBzdXBwbGllZCBjYWxsYmFjayB0byBtb2RpZnkgdGhlIGV2ZW50IGlmIGRlc2lyZWQgKi8KLSAgICBpZiAoRVZULnVzZXJFdmVudENhbGxiYWNrKSB7Ci0JaWYgKCFFVlQudXNlckV2ZW50Q2FsbGJhY2soZXZ0KSkKLQkgICAgcmV0dXJuOwotCX0KLQotICAgIC8qIEdldCBzcG90IHRvIHBsYWNlIHRoZSBldmVudCBmcm9tIHRoZSBmcmVlIGxpc3QgKi8KLSAgICBldnRJRCA9IEVWVC5mcmVlSGVhZDsKLSAgICBFVlQuZnJlZUhlYWQgPSBFVlQuZXZ0cVtFVlQuZnJlZUhlYWRdLm5leHQ7Ci0KLSAgICAvKiBBZGQgdG8gdGhlIEVWVC50YWlsIG9mIHRoZSBldmVudCBxdWV1ZSAgICovCi0gICAgZXZ0LT5uZXh0ID0gLTE7Ci0gICAgZXZ0LT5wcmV2ID0gRVZULnRhaWw7Ci0gICAgaWYgKEVWVC50YWlsICE9IC0xKQotCUVWVC5ldnRxW0VWVC50YWlsXS5uZXh0ID0gZXZ0SUQ7Ci0gICAgZWxzZQotCUVWVC5oZWFkID0gZXZ0SUQ7Ci0gICAgRVZULnRhaWwgPSBldnRJRDsKLSAgICBFVlQuZXZ0cVtldnRJRF0gPSAqZXZ0OwotICAgIEVWVC5jb3VudCsrOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUludGVybmFsIGZ1bmN0aW9uIHRvIGluaXRpYWxpc2UgdGhlIGV2ZW50IHF1ZXVlIHRvIHRoZSBlbXB0eSBzdGF0ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBpbml0RXZlbnRRdWV1ZSh2b2lkKQotewotICAgIGludCBpOwotCi0gICAgLyogQnVpbGQgZnJlZSBsaXN0LCBhbmQgaW5pdGlhbGl6ZSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0gICAgZm9yIChpID0gMDsgaSA8IEVWRU5UUVNJWkU7IGkrKykKLQlFVlQuZXZ0cVtpXS5uZXh0ID0gaSsxOwotICAgIEVWVC5ldnRxW0VWRU5UUVNJWkUtMV0ubmV4dCA9IC0xOyAgICAgICAvKiBUZXJtaW5hdGUgbGlzdCAgICAgICAgICAgKi8KLSAgICBFVlQuY291bnQgPSBFVlQuZnJlZUhlYWQgPSAwOwotICAgIEVWVC5oZWFkID0gRVZULnRhaWwgPSAtMTsKLSAgICBFVlQub2xkTW92ZSA9IC0xOwotICAgIEVWVC5vbGRLZXkgPSAtMTsKLSAgICBFVlQub2xkSm95TW92ZSA9IC0xOwotICAgIEVWVC5qb3lCdXRTdGF0ZSA9IDA7Ci0gICAgRVZULm14ID0gRVZULm15ID0gMDsKLSAgICBFVlQua2V5TW9kaWZpZXJzID0gMDsKLSAgICBFVlQuYWxsb3dMRURTID0gdHJ1ZTsKLQotICAgIC8qIFNldCBkZWZhdWx0IHZhbHVlcyBmb3IgbW91c2UgZG91YmxlIGNsaWNrIGFuZCBtb3VzZSBhdXRvIGV2ZW50cyAqLwotICAgIEVWVC5kb3VibGVDbGljayA9IDQ0MDsKLSAgICBFVlQuYXV0b1JlcGVhdCA9IDU1OwotICAgIEVWVC5hdXRvRGVsYXkgPSAzMzA7Ci0gICAgRVZULmF1dG9UaWNrcyA9IDA7Ci0gICAgRVZULmRvdWJsZUNsaWNrVGhyZXNoID0gNTsKLSAgICBFVlQuZmlyc3RBdXRvID0gdHJ1ZTsKLSAgICBFVlQuYXV0b01vdXNlX3ggPSBFVlQuYXV0b01vdXNlX3kgPSAwOwotICAgIG1lbXNldCgmRVZULmRvd25Nb3VzZSwwLHNpemVvZihFVlQuZG93bk1vdXNlKSk7Ci0KLSAgICAvKiBTZXR1cCBkZWZhdWx0IHBvaW50ZXJzIGZvciBldmVudCBsaWJyYXJ5ICovCi0gICAgRVZULnVzZXJFdmVudENhbGxiYWNrID0gTlVMTDsKLSAgICBFVlQuY29kZVBhZ2UgPSAmX0NQX1VTX0VuZ2xpc2g7Ci0KLSAgICAvKiBJbml0aWFsaXNlIHRoZSBqb3lzdGljayBtb2R1bGUgYW5kIGRvIGJhc2ljIGNhbGlicmF0aW9uICh3aGljaCBhc3N1bWVzCi0gICAgICogdGhlIGpveXN0aWNrIGlzIGNlbnRlcmVkLgotICAgICAqLwotICAgIEVWVC5qb3lNYXNrID0gRVZUX2pveUlzUHJlc2VudCgpOwotfQotCi0jaWYgZGVmaW5lZChORUVEX1NDQUxFX0pPWV9BWElTKSB8fCAhZGVmaW5lZChVU0VfT1NfSk9ZU1RJQ0spCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gc2NhbGVzIGEgam95c3RpY2sgYXhpcyB2YWx1ZSB0byBub3JtYWxpc2VkIGZvcm0uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBzY2FsZUpveUF4aXMoCi0gICAgaW50IHJhdywKLSAgICBpbnQgYXhpcykKLXsKLSAgICBpbnQgc2NhbGVkLHJhbmdlOwotCi0gICAgLyogTWFrZSBzdXJlIHRoZSBqb3lzdGljayBpcyBjYWxpYnJhdGVkIHByb3Blcmx5ICovCi0gICAgaWYgKEVWVC5qb3lDZW50ZXJbYXhpc10gLSBFVlQuam95TWluW2F4aXNdIDwgNSkKLQlyZXR1cm4gcmF3OwotICAgIGlmIChFVlQuam95TWF4W2F4aXNdIC0gRVZULmpveUNlbnRlcltheGlzXSA8IDUpCi0JcmV0dXJuIHJhdzsKLQotICAgIC8qIE5vdyBzY2FsZSB0aGUgY29vcmRpbmF0ZXMgdG8gLTEyOCB0byAxMjcgKi8KLSAgICByYXcgLT0gRVZULmpveUNlbnRlcltheGlzXTsKLSAgICBpZiAocmF3IDwgMCkKLQlyYW5nZSA9IEVWVC5qb3lDZW50ZXJbYXhpc10tRVZULmpveU1pbltheGlzXTsKLSAgICBlbHNlCi0JcmFuZ2UgPSBFVlQuam95TWF4W2F4aXNdLUVWVC5qb3lDZW50ZXJbYXhpc107Ci0gICAgc2NhbGVkID0gKHJhdyAqIDEyOCkgLyByYW5nZTsKLSAgICBpZiAoc2NhbGVkIDwgLTEyOCkKLQlzY2FsZWQgPSAtMTI4OwotICAgIGlmIChzY2FsZWQgPiAxMjcpCi0Jc2NhbGVkID0gMTI3OwotICAgIHJldHVybiBzY2FsZWQ7Ci19Ci0jZW5kaWYKLQotI2lmICAgICBkZWZpbmVkKF9fU01YMzJfXykKLSNpbmNsdWRlICJzbXgvZXZlbnQuYyIKLSNlbGlmICAgZGVmaW5lZChfX1JUVEFSR0VUX18pCi0jaW5jbHVkZSAicnR0YXJnZXQvZXZlbnQuYyIKLSNlbGlmICAgZGVmaW5lZChfX1JFQUxET1NfXykKLSNpbmNsdWRlICJkb3MvZXZlbnQuYyIKLSNlbGlmICAgZGVmaW5lZChfX1dJTkRPV1MzMl9fKQotI2luY2x1ZGUgIndpbjMyL2V2ZW50LmMiCi0jZWxpZiAgIGRlZmluZWQoX19PUzJfXykKLSNpZiAgICAgZGVmaW5lZChfX09TMl9QTV9fKQotI2luY2x1ZGUgIm9zMnBtL2V2ZW50LmMiCi0jZWxzZQotI2luY2x1ZGUgIm9zMi9ldmVudC5jIgotI2VuZGlmCi0jZWxpZiAgIGRlZmluZWQoX19MSU5VWF9fKQotI2lmICAgICBkZWZpbmVkKF9fVVNFX1gxMV9fKQotI2luY2x1ZGUgIngxMS9ldmVudC5jIgotI2Vsc2UKLSNpbmNsdWRlICJsaW51eC9ldmVudC5jIgotI2VuZGlmCi0jZWxpZiAgIGRlZmluZWQoX19RTlhfXykKLSNpZiAgICAgZGVmaW5lZChfX1VTRV9QSE9UT05fXykKLSNpbmNsdWRlICJwaG90b24vZXZlbnQuYyIKLSNlbGlmICAgZGVmaW5lZChfX1VTRV9YMTFfXykKLSNpbmNsdWRlICJ4MTEvZXZlbnQuYyIKLSNlbHNlCi0jaW5jbHVkZSAicW54L2V2ZW50LmMiCi0jZW5kaWYKLSNlbGlmICAgZGVmaW5lZChfX0JFT1NfXykKLSNpbmNsdWRlICJiZW9zL2V2ZW50LmMiCi0jZWxzZQotI2Vycm9yICBFdmVudCBsaWJyYXJ5IG5vdCBwb3J0ZWQgdG8gdGhpcyBwbGF0Zm9ybSB5ZXQhCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIGludGVyZmFjZSByb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogSWYgVVNFX09TX0pPWVNUSUNLIGlzIGRlZmluZWQsIHRoZSBPUyBzcGVjaWZpYyBsaWJyYXJpZXMgd2lsbCBpbXBsZW1lbnQKLSAqIHRoZSBqb3lzdGljayBjb2RlIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBnZW5lcmljIE9TIHBvcnRhYmxlIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBVU0VfT1NfSk9ZU1RJQ0sKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVJldHVybnMgdGhlIG1hc2sgaW5kaWNhdGluZyB3aGF0IGpveXN0aWNrIGF4ZXMgYXJlIGF0dGFjaGVkLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZGV0ZWN0IHRoZSBhdHRhY2hlZCBqb3lzdGlja3MsIGFuZCBkZXRlcm1pbmUKLXdoYXQgYXhlcyBhcmUgcHJlc2VudCBhbmQgZnVuY3Rpb25pbmcuIFRoaXMgZnVuY3Rpb24gd2lsbCByZS1kZXRlY3QgYW55Ci1hdHRhY2hlZCBqb3lzdGlja3Mgd2hlbiBpdCBpcyBjYWxsZWQsIHNvIGlmIHRoZSB1c2VyIGZvcmdvdCB0byBhdHRhY2gKLXRoZSBqb3lzdGljayB3aGVuIHRoZSBhcHBsaWNhdGlvbiBzdGFydGVkLCB5b3UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiB0bwotcmUtZGV0ZWN0IGFueSBuZXdseSBhdHRhY2hlZCBqb3lzdGlja3MuCi0KLVNFRSBBTFNPOgotRVZUX2pveVNldExvd2VyUmlnaHQsIEVWVF9qb3lTZXRDZW50ZXIsIEVWVF9qb3lJc1ByZXNlbnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgRVZUQVBJIEVWVF9qb3lJc1ByZXNlbnQodm9pZCkKLXsKLSAgICBpbnQgbWFzayxpOwotCi0gICAgbWVtc2V0KEVWVC5qb3lNaW4sMCxzaXplb2YoRVZULmpveU1pbikpOwotICAgIG1lbXNldChFVlQuam95Q2VudGVyLDAsc2l6ZW9mKEVWVC5qb3lDZW50ZXIpKTsKLSAgICBtZW1zZXQoRVZULmpveU1heCwwLHNpemVvZihFVlQuam95TWF4KSk7Ci0gICAgbWVtc2V0KEVWVC5qb3lQcmV2LDAsc2l6ZW9mKEVWVC5qb3lQcmV2KSk7Ci0gICAgRVZULmpveUJ1dFN0YXRlID0gMDsKLSNpZmRlZiBfX0xJTlVYX18KLSAgICBQTV9pbml0KCk7Ci0jZW5kaWYKLSAgICBtYXNrID0gX0VWVF9yZWFkSm95QXhpcyhFVlRfSk9ZX0FYSVNfQUxMLEVWVC5qb3lDZW50ZXIpOwotICAgIGlmIChtYXNrKSB7Ci0JZm9yIChpID0gMDsgaSA8IEpPWV9OVU1fQVhFUzsgaSsrKQotCSAgICBFVlQuam95TWF4W2ldID0gRVZULmpveUNlbnRlcltpXSoyOwotCX0KLSAgICByZXR1cm4gbWFzazsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotUG9sbHMgdGhlIGpveXN0aWNrIGZvciBwb3NpdGlvbiBhbmQgYnV0dG9uIGluZm9ybWF0aW9uLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVJFTUFSS1M6Ci1UaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBwb2xsIGFuYWxvZ3VlIGpveXN0aWNrcyBmb3IgYnV0dG9uIGFuZCBwb3NpdGlvbgotaW5mb3JtYXRpb24uIEl0IHNob3VsZCBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCBtYWluIGxvb3Agb2YgdGhlIHVzZXIKLWFwcGxpY2F0aW9uLCBqdXN0IGJlZm9yZSBwcm9jZXNzaW5nIGFsbCBwZW5kaW5nIGV2ZW50cyB2aWEgRVZUX2dldE5leHQuCi1BbGwgaW5mb3JtYXRpb24gcG9sbGVkIGZyb20gdGhlIGpveXN0aWNrIHdpbGwgYmUgcG9zdGVkIHRvIHRoZSBldmVudAotcXVldWUgZm9yIGxhdGVyIHJldHJpZXZhbC4KLQotTm90ZTogICBNb3N0IGFuYWxvZ3VlIGpveXN0aWNrcyB3aWxsIHByb3ZpZGUgcmVhZGluZ3MgdGhhdCBjaGFuZ2UgZXZlbgotCXRob3VnaCB0aGUgam95c3RpY2sgaGFzIG5vdCBtb3ZlZC4gSGVuY2UgaWYgeW91IGNhbGwgdGhpcyByb3V0aW5lCi0JeW91IHdpbGwgbGlrZWx5IGdldCBhbiBFVlRfSk9ZTU9WRSBldmVudCBldmVyeSB0aW1lIHRocm91Z2ggeW91cgotCWV2ZW50IGxvb3AuCi0KLVNFRSBBTFNPOgotRVZUX2dldE5leHQsIEVWVF9wZWVrTmV4dCwgRVZUX2pveVNldFVwcGVyTGVmdCwgRVZUX2pveVNldExvd2VyUmlnaHQsCi1FVlRfam95U2V0Q2VudGVyLCBFVlRfam95SXNQcmVzZW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX3BvbGxKb3lzdGljayh2b2lkKQotewotICAgIGV2ZW50X3QgZXZ0OwotICAgIGludCAgICAgaSxheGlzW0pPWV9OVU1fQVhFU10sbmV3QnV0U3RhdGUsbWFzayxtb3ZlZCxwczsKLQotICAgIGlmIChFVlQuam95TWFzaykgewotCS8qIFJlYWQgam95c3RpY2sgYXhlcyBhbmQgcG9zdCBtb3ZlbWVudCBldmVudHMgaWYgdGhleSBoYXZlCi0JICogY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIHBvbGxlZC4gVW50aWwgdGhlIGV2ZW50cyBhcmUKLQkgKiBhY3R1YWxseSBmbHVzaGVkLCB3ZSBrZWVwIG1vZGlmeWluZyB0aGUgc2FtZSBqb3lzdGljayBtb3ZlbWVudAotCSAqIGV2ZW50LCBzbyB5b3Ugd29uJ3QgZ2V0IG11bHRpcGxlIG1vdmVtZW50IGV2ZW50Ci0JICovCi0JbWFzayA9IF9FVlRfcmVhZEpveUF4aXMoRVZULmpveU1hc2ssYXhpcyk7Ci0JbmV3QnV0U3RhdGUgPSBfRVZUX3JlYWRKb3lCdXR0b25zKCk7Ci0JbW92ZWQgPSBmYWxzZTsKLQlmb3IgKGkgPSAwOyBpIDwgSk9ZX05VTV9BWEVTOyBpKyspIHsKLQkgICAgaWYgKG1hc2sgJiAoRVZUX0pPWV9BWElTX1gxIDw8IGkpKQotCQlheGlzW2ldID0gc2NhbGVKb3lBeGlzKGF4aXNbaV0saSk7Ci0JICAgIGVsc2UKLQkJYXhpc1tpXSA9IEVWVC5qb3lQcmV2W2ldOwotCSAgICBpZiAoYXhpc1tpXSAhPSBFVlQuam95UHJldltpXSkKLQkJbW92ZWQgPSB0cnVlOwotCSAgICB9Ci0JaWYgKG1vdmVkKSB7Ci0JICAgIG1lbWNweShFVlQuam95UHJldixheGlzLHNpemVvZihFVlQuam95UHJldikpOwotCSAgICBwcyA9IF9FVlRfZGlzYWJsZUludCgpOwotCSAgICBpZiAoRVZULm9sZEpveU1vdmUgIT0gLTEpIHsKLQkJLyogTW9kaWZ5IHRoZSBleGlzdGluZyBqb3lzdGljayBtb3ZlbWVudCBldmVudCAqLwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ubWVzc2FnZSA9IG5ld0J1dFN0YXRlOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ud2hlcmVfeCA9IEVWVC5qb3lQcmV2WzBdOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ud2hlcmVfeSA9IEVWVC5qb3lQcmV2WzFdOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ucmVsYXRpdmVfeCA9IEVWVC5qb3lQcmV2WzJdOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ucmVsYXRpdmVfeSA9IEVWVC5qb3lQcmV2WzNdOwotCQl9Ci0JICAgIGVsc2UgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpIHsKLQkJLyogQWRkIGEgbmV3IGpveXN0aWNrIG1vdmVtZW50IGV2ZW50ICovCi0JCUVWVC5vbGRKb3lNb3ZlID0gRVZULmZyZWVIZWFkOwotCQltZW1zZXQoJmV2dCwwLHNpemVvZihldnQpKTsKLQkJZXZ0LndoYXQgPSBFVlRfSk9ZTU9WRTsKLQkJZXZ0Lm1lc3NhZ2UgPSBFVlQuam95QnV0U3RhdGU7Ci0JCWV2dC53aGVyZV94ID0gRVZULmpveVByZXZbMF07Ci0JCWV2dC53aGVyZV95ID0gRVZULmpveVByZXZbMV07Ci0JCWV2dC5yZWxhdGl2ZV94ID0gRVZULmpveVByZXZbMl07Ci0JCWV2dC5yZWxhdGl2ZV95ID0gRVZULmpveVByZXZbM107Ci0JCWFkZEV2ZW50KCZldnQpOwotCQl9Ci0JICAgIF9FVlRfcmVzdG9yZUludChwcyk7Ci0JICAgIH0KLQotCS8qIFJlYWQgdGhlIGpveXN0aWNrIGJ1dHRvbnMsIGFuZCBwb3N0IGV2ZW50cyB0byByZWZsZWN0IHRoZSBjaGFuZ2UKLQkgKiBpbiBzdGF0ZSBmb3IgdGhlIGpveXN0aWNrIGJ1dHRvbnMuCi0JICovCi0JaWYgKG5ld0J1dFN0YXRlICE9IEVWVC5qb3lCdXRTdGF0ZSkgewotCSAgICBpZiAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkgewotCQkvKiBBZGQgYSBuZXcgam95c3RpY2sgY2xpY2sgZXZlbnQgKi8KLQkJcHMgPSBfRVZUX2Rpc2FibGVJbnQoKTsKLQkJbWVtc2V0KCZldnQsMCxzaXplb2YoZXZ0KSk7Ci0JCWV2dC53aGF0ID0gRVZUX0pPWUNMSUNLOwotCQlldnQubWVzc2FnZSA9IG5ld0J1dFN0YXRlOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ud2hlcmVfeCA9IEVWVC5qb3lQcmV2WzBdOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ud2hlcmVfeSA9IEVWVC5qb3lQcmV2WzFdOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ucmVsYXRpdmVfeCA9IEVWVC5qb3lQcmV2WzJdOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ucmVsYXRpdmVfeSA9IEVWVC5qb3lQcmV2WzNdOwotCQlhZGRFdmVudCgmZXZ0KTsKLQkJX0VWVF9yZXN0b3JlSW50KHBzKTsKLQkJfQotCSAgICBFVlQuam95QnV0U3RhdGUgPSBuZXdCdXRTdGF0ZTsKLQkgICAgfQotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotQ2FsaWJyYXRlcyB0aGUgam95c3RpY2sgdXBwZXIgbGVmdCBwb3NpdGlvbgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHplcm8gaW4gb24gYmV0dGVyIGpveXN0aWNrIGNhbGlicmF0aW9uIGZhY3RvcnMsCi13aGljaCBtYXkgd29yayBiZXR0ZXIgdGhhbiB0aGUgZGVmYXVsdCBzaW1wbGlzdGljIGNhbGlicmF0aW9uICh3aGljaCBhc3N1bWVzCi10aGUgam95c3RpY2sgaXMgY2VudGVyZWQgd2hlbiB0aGUgZXZlbnQgbGlicmFyeSBpcyBpbml0aWFsaXNlZCkuCi1UbyB1c2UgdGhpcyBmdW5jdGlvbiwgYXNrIHRoZSB1c2VyIHRvIGhvbGQgdGhlIHN0aWNrIGluIHRoZSB1cHBlciBsZWZ0Ci1wb3NpdGlvbiBhbmQgdGhlbiBoYXZlIHRoZW0gcHJlc3MgYSBrZXkgb3IgYnV0dG9uLiBhbmQgdGhlbiBjYWxsIHRoaXMKLWZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGhlbiByZWFkIHRoZSBqb3lzdGljayBhbmQgdXBkYXRlIHRoZQotY2FsaWJyYXRpb24gZmFjdG9ycy4KLQotVXN1YWxseSwgYXNzdW1pbmcgdGhhdCB0aGUgc3RpY2sgd2FzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgd2FzCi1pbml0aWFsaXplZCwgeW91IHJlYWxseSBvbmx5IG5lZWQgdG8gY2FsbCBFVlRfam95U2V0TG93ZXJSaWdodCBzaW5jZSB0aGUKLXVwcGVyIGxlZnQgcG9zaXRpb24gaXMgdXN1YWxseSBhbHdheXMgMCwwIG9uIG1vc3Qgam95c3RpY2tzLiBIb3dldmVyLCB0aGUKLXNhZmVzdCBwcm9jZWR1cmUgaXMgdG8gY2FsbCBhbGwgdGhyZWUgY2FsaWJyYXRpb24gZnVuY3Rpb25zLgotCi1TRUUgQUxTTzoKLUVWVF9qb3lTZXRVcHBlckxlZnQsIEVWVF9qb3lTZXRMb3dlclJpZ2h0LCBFVlRfam95SXNQcmVzZW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2pveVNldFVwcGVyTGVmdCh2b2lkKQotewotICAgIF9FVlRfcmVhZEpveUF4aXMoRVZUX0pPWV9BWElTX0FMTCxFVlQuam95TWluKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotQ2FsaWJyYXRlcyB0aGUgam95c3RpY2sgbG93ZXIgcmlnaHQgcG9zaXRpb24KLQotSEVBREVSOgotZXZlbnQuaAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byB6ZXJvIGluIG9uIGJldHRlciBqb3lzdGljayBjYWxpYnJhdGlvbiBmYWN0b3JzLAotd2hpY2ggbWF5IHdvcmsgYmV0dGVyIHRoYW4gdGhlIGRlZmF1bHQgc2ltcGxpc3RpYyBjYWxpYnJhdGlvbiAod2hpY2ggYXNzdW1lcwotdGhlIGpveXN0aWNrIGlzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgaXMgaW5pdGlhbGlzZWQpLgotVG8gdXNlIHRoaXMgZnVuY3Rpb24sIGFzayB0aGUgdXNlciB0byBob2xkIHRoZSBzdGljayBpbiB0aGUgbG93ZXIgcmlnaHQKLXBvc2l0aW9uIGFuZCB0aGVuIGhhdmUgdGhlbSBwcmVzcyBhIGtleSBvciBidXR0b24uIGFuZCB0aGVuIGNhbGwgdGhpcwotZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gd2lsbCB0aGVuIHJlYWQgdGhlIGpveXN0aWNrIGFuZCB1cGRhdGUgdGhlCi1jYWxpYnJhdGlvbiBmYWN0b3JzLgotCi1Vc3VhbGx5LCBhc3N1bWluZyB0aGF0IHRoZSBzdGljayB3YXMgY2VudGVyZWQgd2hlbiB0aGUgZXZlbnQgbGlicmFyeSB3YXMKLWluaXRpYWxpemVkLCB5b3UgcmVhbGx5IG9ubHkgbmVlZCB0byBjYWxsIEVWVF9qb3lTZXRMb3dlclJpZ2h0IHNpbmNlIHRoZQotdXBwZXIgbGVmdCBwb3NpdGlvbiBpcyB1c3VhbGx5IGFsd2F5cyAwLDAgb24gbW9zdCBqb3lzdGlja3MuIEhvd2V2ZXIsIHRoZQotc2FmZXN0IHByb2NlZHVyZSBpcyB0byBjYWxsIGFsbCB0aHJlZSBjYWxpYnJhdGlvbiBmdW5jdGlvbnMuCi0KLVNFRSBBTFNPOgotRVZUX2pveVNldFVwcGVyTGVmdCwgRVZUX2pveVNldENlbnRlciwgRVZUX2pveUlzUHJlc2VudAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9qb3lTZXRMb3dlclJpZ2h0KHZvaWQpCi17Ci0gICAgX0VWVF9yZWFkSm95QXhpcyhFVlRfSk9ZX0FYSVNfQUxMLEVWVC5qb3lNYXgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1DYWxpYnJhdGVzIHRoZSBqb3lzdGljayBjZW50ZXIgcG9zaXRpb24KLQotSEVBREVSOgotZXZlbnQuaAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byB6ZXJvIGluIG9uIGJldHRlciBqb3lzdGljayBjYWxpYnJhdGlvbiBmYWN0b3JzLAotd2hpY2ggbWF5IHdvcmsgYmV0dGVyIHRoYW4gdGhlIGRlZmF1bHQgc2ltcGxpc3RpYyBjYWxpYnJhdGlvbiAod2hpY2ggYXNzdW1lcwotdGhlIGpveXN0aWNrIGlzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgaXMgaW5pdGlhbGlzZWQpLgotVG8gdXNlIHRoaXMgZnVuY3Rpb24sIGFzayB0aGUgdXNlciB0byBob2xkIHRoZSBzdGljayBpbiB0aGUgY2VudGVyCi1wb3NpdGlvbiBhbmQgdGhlbiBoYXZlIHRoZW0gcHJlc3MgYSBrZXkgb3IgYnV0dG9uLiBhbmQgdGhlbiBjYWxsIHRoaXMKLWZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGhlbiByZWFkIHRoZSBqb3lzdGljayBhbmQgdXBkYXRlIHRoZQotY2FsaWJyYXRpb24gZmFjdG9ycy4KLQotVXN1YWxseSwgYXNzdW1pbmcgdGhhdCB0aGUgc3RpY2sgd2FzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgd2FzCi1pbml0aWFsaXplZCwgeW91IHJlYWxseSBvbmx5IG5lZWQgdG8gY2FsbCBFVlRfam95U2V0TG93ZXJSaWdodCBzaW5jZSB0aGUKLXVwcGVyIGxlZnQgcG9zaXRpb24gaXMgdXN1YWxseSBhbHdheXMgMCwwIG9uIG1vc3Qgam95c3RpY2tzLiBIb3dldmVyLCB0aGUKLXNhZmVzdCBwcm9jZWR1cmUgaXMgdG8gY2FsbCBhbGwgdGhyZWUgY2FsaWJyYXRpb24gZnVuY3Rpb25zLgotCi1TRUUgQUxTTzoKLUVWVF9qb3lTZXRVcHBlckxlZnQsIEVWVF9qb3lTZXRMb3dlclJpZ2h0LCBFVlRfam95U2V0Q2VudGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2pveVNldENlbnRlcih2b2lkKQotewotICAgIF9FVlRfcmVhZEpveUF4aXMoRVZUX0pPWV9BWElTX0FMTCxFVlQuam95Q2VudGVyKTsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1Qb3N0cyBhIHVzZXIgZGVmaW5lZCBldmVudCB0byB0aGUgZXZlbnQgcXVldWUKLQotSEVBREVSOgotZXZlbnQuaAotCi1SRVRVUk5TOgotVHJ1ZSBpZiBldmVudCB3YXMgcG9zdGVkLCBmYWxzZSBpZiBldmVudCBxdWV1ZSBpcyBmdWxsLgotCi1QQVJBTUVURVJTOgotd2hhdCAgICAgICAgLSBUeXBlIGNvZGUgZm9yIG1lc3NhZ2UgdG8gcG9zdAotbWVzc2FnZSAgICAgLSBFdmVudCBzcGVjaWZpYyBtZXNzYWdlIHRvIHBvc3QKLW1vZGlmaWVycyAgIC0gRXZlbnQgc3BlY2lmaWMgbW9kaWZpZXIgZmxhZ3MgdG8gcG9zdAotCi1SRU1BUktTOgotVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gcG9zdCB1c2VyIGRlZmluZWQgZXZlbnRzIHRvIHRoZSBldmVudCBxdWV1ZS4KLQotU0VFIEFMU086Ci1FVlRfZmx1c2gsIEVWVF9nZXROZXh0LCBFVlRfcGVla05leHQsIEVWVF9oYWx0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgRVZUQVBJIEVWVF9wb3N0KAotICAgIHVsb25nIHdoaWNoLAotICAgIHVsb25nIHdoYXQsCi0gICAgdWxvbmcgbWVzc2FnZSwKLSAgICB1bG9uZyBtb2RpZmllcnMpCi17Ci0gICAgZXZlbnRfdCBldnQ7Ci0gICAgdWludCAgICBwczsKLQotICAgIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKSB7Ci0JLyogU2F2ZSBpbmZvcm1hdGlvbiBpbiBldmVudCByZWNvcmQgKi8KLQlwcyA9IF9FVlRfZGlzYWJsZUludCgpOwotCWV2dC53aGljaCA9IHdoaWNoOwotCWV2dC53aGVuID0gX0VWVF9nZXRUaWNrcygpOwotCWV2dC53aGF0ID0gd2hhdDsKLQlldnQubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JZXZ0Lm1vZGlmaWVycyA9IG1vZGlmaWVyczsKLQlhZGRFdmVudCgmZXZ0KTsgICAgICAgICAgICAgLyogQWRkIHRvIEVWVC50YWlsIG9mIGV2ZW50IHF1ZXVlICAgKi8KLQlfRVZUX3Jlc3RvcmVJbnQocHMpOwotCXJldHVybiB0cnVlOwotCX0KLSAgICBlbHNlCi0JcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1GbHVzaGVzIGFsbCBldmVudHMgb2YgYSBzcGVjaWZpZWQgdHlwZSBmcm9tIHRoZSBldmVudCBxdWV1ZS4KLQotUEFSQU1FVEVSUzoKLW1hc2sgICAgLSBNYXNrIHNwZWNpZnlpbmcgdGhlIHR5cGVzIG9mIGV2ZW50cyB0aGF0IHNob3VsZCBiZSByZW1vdmVkCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotUkVNQVJLUzoKLUZsdXNoZXMgKHJlbW92ZXMpIGFsbCBwZW5kaW5nIGV2ZW50cyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgZnJvbSB0aGUgZXZlbnQKLXF1ZXVlLiBZb3UgbWF5IGNvbWJpbmUgdGhlIG1hc2tzIGZvciBkaWZmZXJlbnQgZXZlbnQgdHlwZXMgd2l0aCBhIHNpbXBsZQotbG9naWNhbCBPUi4KLQotU0VFIEFMU086Ci1FVlRfZ2V0TmV4dCwgRVZUX2hhbHQsIEVWVF9wZWVrTmV4dAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9mbHVzaCgKLSAgICB1bG9uZyBtYXNrKQotewotICAgIGV2ZW50X3QgZXZ0OwotCi0gICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbHVzaCBhbGwgZXZlbnRzICovCi0JRVZUX2dldE5leHQoJmV2dCxtYXNrKTsKLQl9IHdoaWxlIChldnQud2hhdCAhPSBFVlRfTlVMTEVWVCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUhhbHRzIHVudGlsIGFuZCBldmVudCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgaXMgcmVjaWV2ZWQuCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotUEFSQU1FVEVSUzoKLWV2dCAgICAgLSBQb2ludGVyIHRvCi1tYXNrICAgIC0gTWFzayBzcGVjaWZ5aW5nIHRoZSB0eXBlcyBvZiBldmVudHMgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbnMgaGFsdHMgZXhjZXV0aW9uIHVudGlsIGFuIGV2ZW50IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBpcwotcmVjaWV2ZWQgaW50byB0aGUgZXZlbnQgcXVldWUuIEl0IGRvZXMgbm90IGZsdXNoIHRoZSBldmVudCBxdWV1ZSBvZiBldmVudHMKLWJlZm9yZSBwZXJmb3JtaW5nIHRoZSBidXN5IGxvb3AuIEhvd2V2ZXIgdGhpcyBmdW5jdGlvbiBkb2VzIHRocm93IGF3YXkKLWFueSBldmVudHMgb3RoZXIgdGhhbiB0aGUgb25lcyB5b3UgaGF2ZSByZXF1ZXN0ZWQgdmlhIHRoZSBldmVudCBtYXNrLCB0bwotYXZvaWQgdGhlIGV2ZW50IHF1ZXVlIGZpbGxpbmcgdXAgd2l0aCB1bndhbnRlZCBldmVudHMgKGxpa2UgRVZUX0tFWVVQIG9yCi1FVlRfTU9VU0VNT1ZFIGV2ZW50cykuCi0KLVNFRSBBTFNPOgotRVZUX2dldE5leHQsIEVWVF9mbHVzaCwgRVZUX3BlZWtOZXh0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2hhbHQoCi0gICAgZXZlbnRfdCAqZXZ0LAotICAgIHVsb25nIG1hc2spCi17Ci0gICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXYWl0IGZvciBhbiBldmVudCAgICAqLwotCWlmIChtYXNrICYgKEVWVF9KT1lFVlQpKQotCSAgICBFVlRfcG9sbEpveXN0aWNrKCk7Ci0JRVZUX2dldE5leHQoZXZ0LEVWVF9FVkVSWUVWVCk7Ci0JfSB3aGlsZSAoIShldnQtPndoYXQgJiBtYXNrKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVBlZWtzIGF0IHRoZSBuZXh0IHBlbmRpbmcgZXZlbnQgaW4gdGhlIGV2ZW50IHF1ZXVlLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVJFVFVSTlM6Ci1UcnVlIGlmIGFuIGV2ZW50IGlzIHBlbmRpbmcsIGZhbHNlIGlmIG5vdC4KLQotUEFSQU1FVEVSUzoKLWV2dCAgICAgLSBQb2ludGVyIHRvIHN0cnVjdHVyZSB0byByZXR1cm4gdGhlIGV2ZW50IGluZm8gaW4KLW1hc2sgICAgLSBNYXNrIHNwZWNpZnlpbmcgdGhlIHR5cGVzIG9mIGV2ZW50cyB0aGF0IHNob3VsZCBiZSByZW1vdmVkCi0KLVJFTUFSS1M6Ci1QZWVrcyBhdCB0aGUgbmV4dCBwZW5kaW5nIGV2ZW50IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBpbiB0aGUgZXZlbnQgcXVldWUuIFRoZQotbWFzayBwYXJhbWV0ZXIgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIGV2ZW50cyB0byBiZSBwZWVrZWQgYXQsIGFuZAotY2FuIGJlIGFueSBsb2dpY2FsIGNvbWJpbmF0aW9uIG9mIGFueSBvZiB0aGUgZmxhZ3MgZGVmaW5lZCBieSB0aGUKLUVWVF9ldmVudFR5cGUgZW51bWVyYXRpb24uCi0KLUluIGNvbnRyYXN0IHRvIEVWVF9nZXROZXh0LCB0aGUgZXZlbnQgaXMgbm90IHJlbW92ZWQgZnJvbSB0aGUgZXZlbnQgcXVldWUuCi1Zb3UgbWF5IGNvbWJpbmUgdGhlIG1hc2tzIGZvciBkaWZmZXJlbnQgZXZlbnQgdHlwZXMgd2l0aCBhIHNpbXBsZSBsb2dpY2FsIE9SLgotCi1TRUUgQUxTTzoKLUVWVF9mbHVzaCwgRVZUX2dldE5leHQsIEVWVF9oYWx0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgRVZUQVBJIEVWVF9wZWVrTmV4dCgKLSAgICBldmVudF90ICpldnQsCi0gICAgdWxvbmcgbWFzaykKLXsKLSAgICBpbnQgICAgIGV2dElEOwotICAgIHVpbnQgICAgcHM7Ci0KLSAgICBpZiAoRVZULmhlYXJ0QmVhdCkKLQlFVlQuaGVhcnRCZWF0KEVWVC5oZWFydEJlYXRQYXJhbXMpOwotICAgIF9FVlRfcHVtcE1lc3NhZ2VzKCk7ICAgICAgICAgICAgICAgIC8qIFB1bXAgYWxsIG1lc3NhZ2VzIGludG8gcXVldWUgKi8KLSAgICBFVlQubW91c2VNb3ZlKEVWVC5teCxFVlQubXkpOyAgICAgICAvKiBNb3ZlIHRoZSBtb3VzZSBjdXJzb3IgICAgICAgICovCi0gICAgZXZ0LT53aGF0ID0gRVZUX05VTExFVlQ7ICAgICAgICAgICAgLyogRGVmYXVsdCB0byBudWxsIGV2ZW50ICAgICAgICAqLwotICAgIGlmIChFVlQuY291bnQpIHsKLQkvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IGFuIGV2ZW50IGJlIHBvc3RlZCB3aGlsZSB3ZSBhcmUgdHJ5aW5nCi0JICogdG8gYWNjZXNzIHRoZSBldmVudCBxdWV1ZS4gVGhpcyB3b3VsZCBjcmVhdGUgcHJvYmxlbXMgc2luY2UKLQkgKiB3ZSBtYXkgZW5kIHVwIHdpdGggaW52YWxpZCBkYXRhIGZvciBvdXIgZXZlbnQgcXVldWUgcG9pbnRlcnMuIFRvCi0JICogYWxsZXZpYXRlIHRoaXMsIGFsbCBpbnRlcnJ1cHRzIGFyZSBzdXNwZW5kZWQgd2hpbGUgd2UgbWFuaXB1bGF0ZQotCSAqIG91ciBwb2ludGVycy4KLQkgKi8KLQlwcyA9IF9FVlRfZGlzYWJsZUludCgpOyAgICAgICAgICAgICAvKiBkaXNhYmxlIGludGVycnVwdHMgICAgICAgKi8KLQlmb3IgKGV2dElEID0gRVZULmhlYWQ7IGV2dElEICE9IC0xOyBldnRJRCA9IEVWVC5ldnRxW2V2dElEXS5uZXh0KSB7Ci0JICAgIGlmIChFVlQuZXZ0cVtldnRJRF0ud2hhdCAmIG1hc2spCi0JCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAvKiBGb3VuZCBhbiBldmVudCAgICAgICAgICAgKi8KLQkgICAgfQotCWlmIChldnRJRCA9PSAtMSkgewotCSAgICBfRVZUX3Jlc3RvcmVJbnQocHMpOwotCSAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgIC8qIEV2ZW50IHdhcyBub3QgZm91bmQgICAgICAqLwotCSAgICB9Ci0JKmV2dCA9IEVWVC5ldnRxW2V2dElEXTsgICAgICAgICAgICAgICAgIC8qIFJldHVybiB0aGUgZXZlbnQgICAgICAgICAqLwotCV9FVlRfcmVzdG9yZUludChwcyk7Ci0JaWYgKGV2dC0+d2hhdCAmIEVWVF9LRVlFVlQpCi0JICAgIF9FVlRfbWFza0tleUNvZGUoZXZ0KTsKLQl9Ci0gICAgcmV0dXJuIGV2dC0+d2hhdCAhPSBFVlRfTlVMTEVWVDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotUmV0cmlldmVzIHRoZSBuZXh0IHBlbmRpbmcgZXZlbnQgZnJvbSB0aGUgZXZlbnQgcXVldWUuCi0KLVBBUkFNRVRFUlM6Ci1ldnQgICAgIC0gUG9pbnRlciB0byBzdHJ1Y3R1cmUgdG8gcmV0dXJuIHRoZSBldmVudCBpbmZvIGluCi1tYXNrICAgIC0gTWFzayBzcGVjaWZ5aW5nIHRoZSB0eXBlcyBvZiBldmVudHMgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZAotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVJFVFVSTlM6Ci1UcnVlIGlmIGFuIGV2ZW50IHdhcyBwZW5kaW5nLCBmYWxzZSBpZiBub3QuCi0KLVJFTUFSS1M6Ci1SZXRyaWV2ZXMgdGhlIG5leHQgcGVuZGluZyBldmVudCBmcm9tIHRoZSBldmVudCBxdWV1ZSwgYW5kIHN0b3JlcyBpdCBpbiBhCi1ldmVudF90IHN0cnVjdHVyZS4gVGhlIG1hc2sgcGFyYW1ldGVyIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiBldmVudHMKLXRvIGJlIHJlbW92ZWQsIGFuZCBjYW4gYmUgYW55IGxvZ2ljYWwgY29tYmluYXRpb24gb2YgYW55IG9mIHRoZSBmbGFncyBkZWZpbmVkCi1ieSB0aGUgRVZUX2V2ZW50VHlwZSBlbnVtZXJhdGlvbi4KLQotVGhlIHdoYXQgZmllbGQgb2YgdGhlIGV2ZW50IGNvbnRhaW5zIHRoZSBldmVudCBjb2RlIG9mIHRoZSBldmVudCB0aGF0IHdhcwotZXh0cmFjdGVkLiBBbGwgYXBwbGljYXRpb24gc3BlY2lmaWMgZXZlbnRzIHNob3VsZCBiZWdpbiB3aXRoIHRoZSBFVlRfVVNFUkVWVAotY29kZSBhbmQgYnVpbGQgZnJvbSB0aGVyZS4gU2luY2UgdGhlIGV2ZW50IGNvZGUgaXMgc3RvcmVkIGluIGFuIGludGVnZXIsCi10aGVyZSBpcyBhIG1heGltdW0gb2YgMzIgZGlmZmVyZW50IGV2ZW50IGNvZGVzIHRoYXQgY2FuIGJlIGRpc3Rpbmd1aXNoZWQuCi1Zb3UgY2FuIHN0b3JlIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBldmVudCBpbiB0aGUgbWVzc2FnZSBmaWVsZCB0bwotZGlzdGluZ3Vpc2ggYmV0d2VlbiBldmVudHMgb2YgdGhlIHNhbWUgY2xhc3MgKGZvciBpbnN0YW5jZSB0aGUgYnV0dG9uIHVzZWQgaW4KLWEgRVZUX01PVVNFRE9XTiBldmVudCkuCi0KLUlmIGFuIGV2ZW50IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB3YXMgbm90IGluIHRoZSBldmVudCBxdWV1ZSwgdGhlIHdoYXQgZmllbGQKLW9mIHRoZSBldmVudCB3aWxsIGJlIHNldCB0byBOVUxMRVZULCBhbmQgdGhlIHJldHVybiB2YWx1ZSB3aWxsIHJldHVybiBmYWxzZS4KLQotTm90ZTogICBZb3Ugc2hvdWxkIC9hbHdheXMvIHVzZSB0aGUgRVZUX0VWRVJZRVZUIG1hc2sgZm9yIGV4dHJhY3RpbmcgZXZlbnRzCi0JZnJvbSB5b3VyIG1haW4gZXZlbnQgbG9vcCBoYW5kbGVyLiBVc2luZyBhIG1hc2sgZm9yIG9ubHkgYSBzcGVjaWZpYwotCXR5cGUgb2YgZXZlbnQgZm9yIGxvbmcgcGVyaW9kcyBvZiB0aW1lIHdpbGwgY2F1c2UgdGhlIGV2ZW50IHF1ZXVlIHRvCi0JZmlsbCB1cCB3aXRoIGV2ZW50cyBvZiB0aGUgdHlwZSB5b3UgYXJlIGlnbm9yaW5nLCBldmVudHVhbGx5IGNhdXNpbmcKLQl0aGUgYXBwbGljYXRpb24gdG8gaGFuZyB3aGVuIHRoZSBldmVudCBxdWV1ZSBiZWNvbWVzIGZ1bGwuCi0KLVNFRSBBTFNPOgotRVZUX2ZsdXNoLCBFVlRfaGFsdCwgRVZUX3BlZWtOZXh0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgRVZUQVBJIEVWVF9nZXROZXh0KAotICAgIGV2ZW50X3QgKmV2dCwKLSAgICB1bG9uZyBtYXNrKQotewotICAgIGludCAgICAgZXZ0SUQsbmV4dCxwcmV2OwotICAgIHVpbnQgICAgcHM7Ci0KLSAgICBpZiAoRVZULmhlYXJ0QmVhdCkKLQlFVlQuaGVhcnRCZWF0KEVWVC5oZWFydEJlYXRQYXJhbXMpOwotICAgIF9FVlRfcHVtcE1lc3NhZ2VzKCk7ICAgICAgICAgICAgICAgIC8qIFB1bXAgYWxsIG1lc3NhZ2VzIGludG8gcXVldWUgKi8KLSAgICBFVlQubW91c2VNb3ZlKEVWVC5teCxFVlQubXkpOyAgICAgICAvKiBNb3ZlIHRoZSBtb3VzZSBjdXJzb3IgICAgICAgICovCi0gICAgZXZ0LT53aGF0ID0gRVZUX05VTExFVlQ7ICAgICAgICAgICAgLyogRGVmYXVsdCB0byBudWxsIGV2ZW50ICAgICAgICAqLwotICAgIGlmIChFVlQuY291bnQpIHsKLQkvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IGFuIGV2ZW50IGJlIHBvc3RlZCB3aGlsZSB3ZSBhcmUgdHJ5aW5nCi0JICogdG8gYWNjZXNzIHRoZSBldmVudCBxdWV1ZS4gVGhpcyB3b3VsZCBjcmVhdGUgcHJvYmxlbXMgc2luY2UKLQkgKiB3ZSBtYXkgZW5kIHVwIHdpdGggaW52YWxpZCBkYXRhIGZvciBvdXIgZXZlbnQgcXVldWUgcG9pbnRlcnMuIFRvCi0JICogYWxsZXZpYXRlIHRoaXMsIGFsbCBpbnRlcnJ1cHRzIGFyZSBzdXNwZW5kZWQgd2hpbGUgd2UgbWFuaXB1bGF0ZQotCSAqIG91ciBwb2ludGVycy4KLQkgKi8KLQlwcyA9IF9FVlRfZGlzYWJsZUludCgpOyAgICAgICAgICAgICAvKiBkaXNhYmxlIGludGVycnVwdHMgICAgICAgKi8KLQlmb3IgKGV2dElEID0gRVZULmhlYWQ7IGV2dElEICE9IC0xOyBldnRJRCA9IEVWVC5ldnRxW2V2dElEXS5uZXh0KSB7Ci0JICAgIGlmIChFVlQuZXZ0cVtldnRJRF0ud2hhdCAmIG1hc2spCi0JCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAvKiBGb3VuZCBhbiBldmVudCAgICAgICAgICAgKi8KLQkgICAgfQotCWlmIChldnRJRCA9PSAtMSkgewotCSAgICBfRVZUX3Jlc3RvcmVJbnQocHMpOwotCSAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgIC8qIEV2ZW50IHdhcyBub3QgZm91bmQgICAgICAqLwotCSAgICB9Ci0JbmV4dCA9IEVWVC5ldnRxW2V2dElEXS5uZXh0OwotCXByZXYgPSBFVlQuZXZ0cVtldnRJRF0ucHJldjsKLQlpZiAocHJldiAhPSAtMSkKLQkgICAgRVZULmV2dHFbcHJldl0ubmV4dCA9IG5leHQ7Ci0JZWxzZQotCSAgICBFVlQuaGVhZCA9IG5leHQ7Ci0JaWYgKG5leHQgIT0gLTEpCi0JICAgIEVWVC5ldnRxW25leHRdLnByZXYgPSBwcmV2OwotCWVsc2UKLQkgICAgRVZULnRhaWwgPSBwcmV2OwotCSpldnQgPSBFVlQuZXZ0cVtldnRJRF07ICAgICAgICAgICAgICAgICAvKiBSZXR1cm4gdGhlIGV2ZW50ICAgICAgICAgKi8KLQlFVlQuZXZ0cVtldnRJRF0ubmV4dCA9IEVWVC5mcmVlSGVhZDsgICAgICAgIC8qIGFuZCByZXR1cm4gdG8gZnJlZSBsaXN0ICAqLwotCUVWVC5mcmVlSGVhZCA9IGV2dElEOwotCUVWVC5jb3VudC0tOwotCWlmIChldnQtPndoYXQgPT0gRVZUX01PVVNFTU9WRSkKLQkgICAgRVZULm9sZE1vdmUgPSAtMTsKLQlpZiAoZXZ0LT53aGF0ID09IEVWVF9LRVlSRVBFQVQpCi0JICAgIEVWVC5vbGRLZXkgPSAtMTsKLQlpZiAoZXZ0LT53aGF0ID09IEVWVF9KT1lNT1ZFKQotCSAgICBFVlQub2xkSm95TW92ZSA9IC0xOwotCV9FVlRfcmVzdG9yZUludChwcyk7ICAgICAgICAgICAgICAgIC8qIGVuYWJsZSBpbnRlcnJ1cHRzICAgICAgICAqLwotCWlmIChldnQtPndoYXQgJiBFVlRfS0VZRVZUKQotCSAgICBfRVZUX21hc2tLZXlDb2RlKGV2dCk7Ci0JfQotCi0gICAgLyogSWYgdGhlcmUgaXMgbm8gZXZlbnQgcGVuZGluZywgY2hlY2sgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIGFuIGF1dG8KLSAgICAgKiBtb3VzZSBkb3duIGV2ZW50IGlmIHRoZSBtb3VzZSBpcyBzdGlsbCBjdXJyZW50bHkgZG93bi4KLSAgICAgKi8KLSAgICBpZiAoZXZ0LT53aGF0ID09IEVWVF9OVUxMRVZUICYmIEVWVC5hdXRvUmVwZWF0ICYmIChtYXNrICYgRVZUX01PVVNFQVVUTykgJiYgKEVWVC5kb3duTW91c2Uud2hhdCAmIEVWVF9NT1VTRURPV04pKSB7Ci0JdWxvbmcgdGlja3MgPSBfRVZUX2dldFRpY2tzKCk7Ci0JaWYgKCh0aWNrcyAtIEVWVC5hdXRvVGlja3MpID49IChFVlQuYXV0b1JlcGVhdCArIChFVlQuZmlyc3RBdXRvID8gRVZULmF1dG9EZWxheSA6IDApKSkgewotCSAgICBldnQtPndoYXQgPSBFVlRfTU9VU0VBVVRPOwotCSAgICBldnQtPm1lc3NhZ2UgPSBFVlQuZG93bk1vdXNlLm1lc3NhZ2U7Ci0JICAgIGV2dC0+bW9kaWZpZXJzID0gRVZULmRvd25Nb3VzZS5tb2RpZmllcnM7Ci0JICAgIGV2dC0+d2hlcmVfeCA9IEVWVC5hdXRvTW91c2VfeDsKLQkgICAgZXZ0LT53aGVyZV95ID0gRVZULmF1dG9Nb3VzZV95OwotCSAgICBldnQtPnJlbGF0aXZlX3ggPSAwOwotCSAgICBldnQtPnJlbGF0aXZlX3kgPSAwOwotCSAgICBFVlQuYXV0b1RpY2tzID0gZXZ0LT53aGVuID0gdGlja3M7Ci0JICAgIEVWVC5maXJzdEF1dG8gPSBmYWxzZTsKLQkgICAgfQotCX0KLSAgICByZXR1cm4gZXZ0LT53aGF0ICE9IEVWVF9OVUxMRVZUOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1JbnN0YWxscyBhIHVzZXIgc3VwcGxpZWQgZXZlbnQgZmlsdGVyIGNhbGxiYWNrIGZvciBldmVudCBoYW5kbGluZy4KLQotSEVBREVSOgotZXZlbnQuaAotCi1QQVJBTUVURVJTOgotdXNlckV2ZW50RmlsdGVyIC0gQWRkcmVzcyBvZiB1c2VyIHN1cHBsaWVkIGV2ZW50IGZpbHRlciBjYWxsYmFjawotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHByb2dyYW1tZXIgdG8gaW5zdGFsbCBhbiBldmVudCBmaWx0ZXIKLWNhbGxiYWNrIGZvciBldmVudCBoYW5kbGluZy4gT25jZSB5b3UgaW5zdGFsbCB5b3VyIGNhbGxiYWNrLCB0aGUgTUdMCi1ldmVudCBoYW5kbGluZyByb3V0aW5lcyB3aWxsIGNhbGwgeW91ciBjYWxsYmFjayB3aXRoIGEgcG9pbnRlciB0byB0aGUKLW5ldyBldmVudCB0aGF0IHdpbGwgYmUgcGxhY2VkIGludG8gdGhlIGV2ZW50IHF1ZXVlLiBZb3VyIGNhbGxiYWNrIGNhbiB0aGUKLW1vZGlmeSB0aGUgY29udGVudHMgb2YgdGhlIGV2ZW50IGJlZm9yZSBpdCBpcyBwbGFjZWQgaW50byB0aGUgcXVldWUgKGZvcgotaW5zdGFuY2UgYWRkaW5nIGN1c3RvbSBpbmZvcm1hdGlvbiBvciBwZXJoYXBzIGhpZ2ggcHJlY2lzaW9uIHRpbWluZwotaW5mb3JtYXRpb24pLgotCi1JZiB5b3VyIGNhbGxiYWNrIHJldHVybnMgRkFMU0UsIHRoZSBldmVudCB3aWxsIGJlIGlnbm9yZSBhbmQgd2lsbCBub3QgYmUKLXBvc3RlZCB0byB0aGUgZXZlbnQgcXVldWUuIFlvdSBzaG91bGQgYWx3YXlzIHJldHVybiB0cnVlIGZyb20geW91ciBldmVudAotY2FsbGJhY2sgdW5sZXNzIHlvdSBwbGFuIHRvIHVzZSB0aGUgZXZlbnRzIGltbWVkaWF0ZWx5IHRoYXQgdGhleSBhcmUKLXJlY2lldmVkLgotCi1Ob3RlOiAgIFlvdXIgZXZlbnQgY2FsbGJhY2sgbWF5IGJlIGNhbGxlZCBpbiByZXNwb25zZSB0byBhIGhhcmR3YXJlCi0JaW50ZXJydXB0IGFuZCB3aWxsIGJlIGV4ZWN1dGluZyBpbiB0aGUgY29udGV4dCBvZiB0aGUgaGFyZHdhcmUKLQlpbnRlcnJ1cHQgaGFuZGxlciB1bmRlciBNU0RPUyAoaWU6IGtleWJvYXJkIGludGVycnVwdCBvciBtb3VzZQotCWludGVycnVwdCkuIEZvciB0aGlzIHJlYXNvbiB0aGUgY29kZSBwYWdlcyBmb3IgdGhlIGNhbGxiYWNrIHRoYXQKLQl5b3UgcmVnaXN0ZXIgbXVzdCBiZSBsb2NrZWQgaW4gbWVtb3J5IHdpdGggdGhlIFBNX2xvY2tDb2RlUGFnZXMKLQlmdW5jdGlvbi4gWW91IG11c3QgYWxzbyBsb2NrIGRvd24gYW55IGRhdGEgcGFnZXMgdGhhdCB5b3VyIGZ1bmN0aW9uCi0JbmVlZHMgdG8gcmVmZXJlbmNlIGFzIHdlbGwuCi0KLU5vdGU6ICAgWW91IGNhbiBhbHNvIHVzZSB0aGlzIGZpbHRlciBjYWxsYmFjayB0byBwcm9jZXNzIGV2ZW50cyBhdCB0aGUKLQl0aW1lIHRoZXkgYXJlIGFjdGl2YXRlZCBieSB0aGUgdXNlciAoaWU6IHdoZW4gdGhlIHVzZXIgaGl0cyB0aGUKLQlrZXkgb3IgbW92ZXMgdGhlIG1vdXNlKSwgYnV0IG1ha2Ugc3VyZSB5b3VyIGNvZGUgcnVucyBhcyBmYXN0IGFzCi0JcG9zc2libGUgYXMgaXQgd2lsbCBiZSBleGVjdXRpbmcgaW5zaWRlIHRoZSBjb250ZXh0IG9mIGFuIGludGVycnVwdAotCWhhbmRsZXIgb24gc29tZSBzeXN0ZW1zLgotCi1TRUUgQUxTTzoKLUVWVF9nZXROZXh0LCBFVlRfcGVla05leHQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfc2V0VXNlckV2ZW50RmlsdGVyKAotICAgIF9FVlRfdXNlckV2ZW50RmlsdGVyIGZpbHRlcikKLXsKLSAgICBFVlQudXNlckV2ZW50Q2FsbGJhY2sgPSBmaWx0ZXI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUluc3RhbGxzIGEgdXNlciBzdXBwbGllZCBldmVudCBoZWFydGJlYXQgY2FsbGJhY2sgZnVuY3Rpb24uCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotUEFSQU1FVEVSUzoKLWNhbGxiYWNrICAgIC0gQWRkcmVzcyBvZiB1c2VyIHN1cHBsaWVkIGV2ZW50IGhlYXJ0YmVhdCBjYWxsYmFjawotcGFyYW1zICAgICAgLSBQYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIGV2ZW50IGhlYXJ0YmVhdCBmdW5jdGlvbgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHByb2dyYW1tZXIgdG8gaW5zdGFsbCBhbiBldmVudCBoZWF0YmVhdAotZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBldmVyeSB0aW1lIHRoYXQgRVZUX2dldE5leHQgb3IgRVZUX3BlZWtOZXh0Ci1pcyBjYWxsZWQuIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3Igc2ltdWxhdGluZyB0ZXh0IG1vZGUgY3Vyc29ycyBpbnNpZGUKLWV2ZW50IGhhbmRsaW5nIGNvZGUgd2hlbiBydW5uaW5nIGluIGdyYXBoaWNzIG1vZGVzIGFzIG9wcG9zZWQgdG8gaGFyZHdhcmUKLXRleHQgbW9kZXMuCi0KLVNFRSBBTFNPOgotRVZUX2dldE5leHQsIEVWVF9wZWVrTmV4dCwgRVZUX2dldEhlYXJ0QmVhdENhbGxiYWNrCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX3NldEhlYXJ0QmVhdENhbGxiYWNrKAotICAgIF9FVlRfaGVhcnRCZWF0Q2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgdm9pZCAqcGFyYW1zKQotewotICAgIEVWVC5oZWFydEJlYXQgPSBjYWxsYmFjazsKLSAgICBFVlQuaGVhcnRCZWF0UGFyYW1zID0gcGFyYW1zOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVJldHVybnMgdGhlIGN1cnJlbnQgdXNlciBzdXBwbGllZCBldmVudCBoZWFydGJlYXQgY2FsbGJhY2sgZnVuY3Rpb24uCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotUEFSQU1FVEVSUzoKLWNhbGxiYWNrICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIGFkZHJlc3Mgb2YgdXNlciBzdXBwbGllZCBldmVudCBoZWFydGJlYXQgY2FsbGJhY2sKLXBhcmFtcyAgICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgZXZlbnQgaGVhcnRiZWF0IGZ1bmN0aW9uCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgY3VycmVudCBldmVudCBoZWF0YmVhdCBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkCi1ldmVyeSB0aW1lIHRoYXQgRVZUX2dldE5leHQgb3IgRVZUX3BlZWtOZXh0IGlzIGNhbGxlZC4KLQotU0VFIEFMU086Ci1FVlRfZ2V0TmV4dCwgRVZUX3BlZWtOZXh0LCBFVlRfc2V0SGVhcnRCZWF0Q2FsbGJhY2sKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfZ2V0SGVhcnRCZWF0Q2FsbGJhY2soCi0gICAgX0VWVF9oZWFydEJlYXRDYWxsYmFjayAqY2FsbGJhY2ssCi0gICAgdm9pZCAqKnBhcmFtcykKLXsKLSAgICAqY2FsbGJhY2sgPSBFVlQuaGVhcnRCZWF0OwotICAgICpwYXJhbXMgPSBFVlQuaGVhcnRCZWF0UGFyYW1zOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1EZXRlcm1pbmVzIGlmIGEgc3BlY2lmaWVkIGtleSBpcyBjdXJyZW50bHkgZG93bi4KLQotUEFSQU1FVEVSUzoKLXNjYW5Db2RlICAgIC0gU2NhbiBjb2RlIHRvIHRlc3QKLQotUkVUVVJOUzoKLVRydWUgb2YgdGhlIHNwZWNpZmllZCBrZXkgaXMgY3VycmVudGx5IGhlbGQgZG93bi4KLQotSEVBREVSOgotZXZlbnQuaAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIGEgc3BlY2lmaWVkIGtleSBpcyBjdXJyZW50bHkgZG93biBhdCB0aGUKLXRpbWUgdGhhdCB0aGUgY2FsbCBpcyBtYWRlLiBZb3Ugc2ltcGx5IG5lZWQgdG8gcGFzcyBpbiB0aGUgc2NhbiBjb2RlIG9mCi10aGUga2V5IHRoYXQgeW91IHdpc2ggdG8gdGVzdCwgYW5kIHRoZSBNR0wgd2lsbCB0ZWxsIHlvdSBpZiBpdCBpcyBjdXJyZW50bHkKLWRvd24gb3Igbm90LiBUaGUgTUdMIGRvZXMgdGhpcyBieSBrZWVwaW5nIHRyYWNrIG9mIHRoZSB1cCBhbmQgZG93biBzdGF0ZQotb2YgYWxsIHRoZSBrZXlzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIEVWVEFQSSBFVlRfaXNLZXlEb3duKAotICAgIHVjaGFyIHNjYW5Db2RlKQotewotICAgIHJldHVybiBfRVZUX2lzS2V5RG93bihzY2FuQ29kZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVNldCB0aGUgbW91c2UgcG9zaXRpb24gZm9yIHRoZSBldmVudCBtb2R1bGUKLQotUEFSQU1FVEVSUzoKLXggICAtIFggY29vcmRpbmF0ZSB0byBtb3ZlIHRoZSBtb3VzZSBjdXJzb3IgcG9zaXRpb24gdG8KLXkgICAtIFkgY29vcmRpbmF0ZSB0byBtb3ZlIHRoZSBtb3VzZSBjdXJzb3IgcG9zaXRpb24gdG8KLQotSEVBREVSOgotZXZlbnQuaAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBtb3ZlcyB0aGUgbW91c2UgY3Vyc29yIHBvc2l0aW9uIGZvciB0aGUgZXZlbnQgbW9kdWxlIHRvIHRoZQotc3BlY2lmaWVkIGxvY2F0aW9uLgotCi1TRUUgQUxTTzoKLUVWVF9nZXRNb3VzZVBvcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9zZXRNb3VzZVBvcygKLSAgICBpbnQgeCwKLSAgICBpbnQgeSkKLXsKLSAgICBFVlQubXggPSB4OwotICAgIEVWVC5teSA9IHk7Ci0gICAgX0VWVF9zZXRNb3VzZVBvcygmRVZULm14LCZFVlQubXkpOwotICAgIEVWVC5tb3VzZU1vdmUoRVZULm14LEVWVC5teSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVJldHVybnMgdGhlIGN1cnJlbnQgbW91c2UgY3Vyc29yIGxvY2F0aW9uLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVBBUkFNRVRFUlM6Ci14ICAgLSBQbGFjZSB0byBzdG9yZSB2YWx1ZSBmb3IgbW91c2UgeCBjb29yZGluYXRlIChzY3JlZW4gY29vcmRpbmF0ZXMpCi15ICAgLSBQbGFjZSB0byBzdG9yZSB2YWx1ZSBmb3IgbW91c2UgeSBjb29yZGluYXRlIChzY3JlZW4gY29vcmRpbmF0ZXMpCi0KLVJFTUFSS1M6Ci1PYnRhaW5zIHRoZSBjdXJyZW50IG1vdXNlIGN1cnNvciBwb3NpdGlvbiBpbiBzY3JlZW4gY29vcmRpbmF0ZXMuIE5vcm1hbGx5IHRoZQotbW91c2UgY3Vyc29yIGxvY2F0aW9uIGlzIHRyYWNrZWQgdXNpbmcgdGhlIG1vdXNlIG1vdmVtZW50IGV2ZW50cyB0aGF0IGFyZQotcG9zdGVkIHRvIHRoZSBldmVudCBxdWV1ZSB3aGVuIHRoZSBtb3VzZSBtb3ZlcywgaG93ZXZlciB0aGlzIHJvdXRpbmUKLXByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIG1ldGhvZCBvZiBwb2xsaW5nIHRoZSBtb3VzZSBjdXJzb3IgbG9jYXRpb24uCi0KLVNFRSBBTFNPOgotRVZUX3NldE1vdXNlUG9zCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2dldE1vdXNlUG9zKAotICAgIGludCAqeCwKLSAgICBpbnQgKnkpCi17Ci0gICAgKnggPSBFVlQubXg7Ci0gICAgKnkgPSBFVlQubXk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVJldHVybnMgdGhlIGN1cnJlbnRseSBhY3RpdmUgY29kZSBwYWdlIGZvciB0cmFuc2xhdGlvbiBvZiBrZXlib2FyZCBjaGFyYWN0ZXJzLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVJFVFVSTlM6Ci1Qb2ludGVyIHRvIHRoZSBjdXJyZW50bHkgYWN0aXZlIGNvZGUgcGFnZSB0cmFuc2xhdGlvbiB0YWJsZS4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnRseSBhY3RpdmUgY29kZSBwYWdlCi10cmFuc2xhdGlvbiB0YWJsZS4gU2VlIEVWVF9zZXRDb2RlUGFnZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotU0VFIEFMU086Ci1FVlRfc2V0Q29kZVBhZ2UKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb2RlcGFnZV90ICogRVZUQVBJIEVWVF9nZXRDb2RlUGFnZSh2b2lkKQotewotICAgIHJldHVybiBFVlQuY29kZVBhZ2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVNldHMgdGhlIGN1cnJlbnRseSBhY3RpdmUgY29kZSBwYWdlIGZvciB0cmFuc2xhdGlvbiBvZiBrZXlib2FyZCBjaGFyYWN0ZXJzLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVBBUkFNRVRFUlM6Ci1wYWdlICAgIC0gTmV3IGNvZGUgcGFnZSB0byBtYWtlIGFjdGl2ZQotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCBhIG5ldyBjb2RlIHBhZ2UgdHJhbnNsYXRpb24gdGFibGUgdGhhdCBpcyB1c2VkCi10byB0cmFuc2xhdGUgdmlydHVhbCBzY2FuIGNvZGUgdmFsdWVzIHRvIEFTQ0lJIGNoYXJhY3RlcnMgZm9yIGRpZmZlcmVudAota2V5Ym9hcmQgY29uZmlndXJhdGlvbnMuIFRoZSBkZWZhdWx0IGlzIHVzdWFsbHkgVVMgRW5nbGlzaCwgYWx0aG91Z2ggaWYKLXBvc3NpYmxlIHRoZSBQTSBsaWJyYXJ5IHdpbGwgYXV0by1kZXRlY3QgdGhlIGNvcnJlY3QgY29kZSBwYWdlIHRyYW5zbGF0aW9uCi1mb3IgdGhlIHRhcmdldCBPUyBpZiBPUyBzZXJ2aWNlcyBhcmUgYXZhaWxhYmxlIHRvIGRldGVybWluZSB3aGF0IHR5cGUgb2YKLWtleWJvYXJkIGlzIGN1cnJlbnRseSBhdHRhY2hlZC4KLQotU0VFIEFMU086Ci1FVlRfZ2V0Q29kZVBhZ2UKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfc2V0Q29kZVBhZ2UoCi0gICAgY29kZXBhZ2VfdCAqcGFnZSkKLXsKLSAgICBFVlQuY29kZVBhZ2UgPSBwYWdlOwotfQotCi0vKiBUaGUgZm9sbG93aW5nIGNvbnRhaW5zIGZha2UgQyBwcm90b3R5cGVzIGFuZCBkb2N1bWVudGF0aW9uIGZvciB0aGUKLSAqIG1hY3JvIGZ1bmN0aW9ucyBpbiB0aGUgZXZlbnQuaCBoZWFkZXIgZmlsZS4gVGhlc2UgZXhpc3Qgc29sZXkgc28KLSAqIHRoYXQgRG9jSmV0IHdpbGwgY29ycmVjdGx5IHB1bGwgaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZXNlIGZ1bmN0aW9ucy4KLSAqLwotI2lmZGVmICBJTkNMVURFX0RPQ19GVU5DVElPTlMKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotTWFjcm8gdG8gZXh0cmFjdCB0aGUgQVNDSUkgY29kZSBmcm9tIGEgbWVzc2FnZS4KLQotUEFSQU1FVEVSUzoKLW1lc3NhZ2UgLSBNZXNzYWdlIHRvIGV4dHJhY3QgQVNDSUkgY29kZSBmcm9tCi0KLVJFVFVSTlM6Ci1BU0NJSSBjb2RlIGV4dHJhY3RlZCBmcm9tIHRoZSBtZXNzYWdlLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVJFTUFSS1M6Ci1NYWNybyB0byBleHRyYWN0IHRoZSBBU0NJSSBjb2RlIGZyb20gdGhlIG1lc3NhZ2UgZmllbGQgb2YgdGhlIGV2ZW50X3QKLXN0cnVjdHVyZS4gWW91IHBhc3MgdGhlIG1lc3NhZ2UgZmllbGQgdG8gdGhlIG1hY3JvIGFzIHRoZSBwYXJhbWV0ZXIgYW5kCi10aGUgQVNDSUkgY29kZSBpcyB0aGUgcmVzdWx0LCBmb3IgZXhhbXBsZToKLQotICAgIGV2ZW50X3QgRVZULm15RXZlbnQ7Ci0gICAgdWNoYXIgICBjb2RlOwotICAgIGNvZGUgPSBFVlRfYXNjaWlDb2RlKEVWVC5teUV2ZW50Lm1lc3NhZ2UpOwotCi1TRUUgQUxTTzoKLUVWVF9zY2FuQ29kZSwgRVZUX3JlcGVhdENvdW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWNoYXIgRVZUX2FzY2lpQ29kZSgKLSAgICB1bG9uZyBtZXNzYWdlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotTWFjcm8gdG8gZXh0cmFjdCB0aGUga2V5Ym9hcmQgc2NhbiBjb2RlIGZyb20gYSBtZXNzYWdlLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVBBUkFNRVRFUlM6Ci1tZXNzYWdlIC0gTWVzc2FnZSB0byBleHRyYWN0IHNjYW4gY29kZSBmcm9tCi0KLVJFVFVSTlM6Ci1LZXlib2FyZCBzY2FuIGNvZGUgZXh0cmFjdGVkIGZyb20gdGhlIG1lc3NhZ2UuCi0KLVJFTUFSS1M6Ci1NYWNybyB0byBleHRyYWN0IHRoZSBrZXlib2FyZCBzY2FuIGNvZGUgZnJvbSB0aGUgbWVzc2FnZSBmaWVsZCBvZiB0aGUgZXZlbnQKLXN0cnVjdHVyZS4gWW91IHBhc3MgdGhlIG1lc3NhZ2UgZmllbGQgdG8gdGhlIG1hY3JvIGFzIHRoZSBwYXJhbWV0ZXIgYW5kCi10aGUgc2NhbiBjb2RlIGlzIHRoZSByZXN1bHQsIGZvciBleGFtcGxlOgotCi0gICAgZXZlbnRfdCBFVlQubXlFdmVudDsKLSAgICB1Y2hhciAgIGNvZGU7Ci0gICAgY29kZSA9IEVWVF9zY2FuQ29kZShFVlQubXlFdmVudC5tZXNzYWdlKTsKLQotTk9URTogICBTY2FuIGNvZGVzIGluIHRoZSBldmVudCBsaWJyYXJ5IGFyZSBub3QgcmVhbGx5IGhhcmR3YXJlIHNjYW4gY29kZXMsCi0JYnV0IHJhdGhlciB2aXJ0dWFsIHNjYW4gY29kZXMgYXMgZ2VuZXJhdGVkIGJ5IGEgbG93IGxldmVsIGtleWJvYXJkCi0JaW50ZXJmYWNlIGRyaXZlci4gQWxsIHZpcnR1YWwgc2NhbiBjb2RlIHZhbHVlcyBhcmUgZGVmaW5lZCBieSB0aGUKLQlFVlRfc2NhbkNvZGVzVHlwZSBlbnVtZXJhdGlvbiwgYW5kIHdpbGwgYmUgaWRlbnRpY2FsIGFjcm9zcyBhbGwKLQlzdXBwb3J0cyBPUydlcyBhbmQgcGxhdGZvcm1zLgotCi1TRUUgQUxTTzoKLUVWVF9hc2NpaUNvZGUsIEVWVF9yZXBlYXRDb3VudAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVjaGFyIEVWVF9zY2FuQ29kZSgKLSAgICB1bG9uZyBtZXNzYWdlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotTWFjcm8gdG8gZXh0cmFjdCB0aGUgcmVwZWF0IGNvdW50IGZyb20gYSBtZXNzYWdlLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVBBUkFNRVRFUlM6Ci1tZXNzYWdlIC0gTWVzc2FnZSB0byBleHRyYWN0IHJlcGVhdCBjb3VudCBmcm9tCi0KLVJFVFVSTlM6Ci1SZXBlYXQgY291bnQgZXh0cmFjdGVkIGZyb20gdGhlIG1lc3NhZ2UuCi0KLVJFTUFSS1M6Ci1NYWNybyB0byBleHRyYWN0IHRoZSByZXBlYXQgY291bnQgZnJvbSB0aGUgbWVzc2FnZSBmaWVsZCBvZiB0aGUgZXZlbnQKLXN0cnVjdHVyZS4gVGhlIHJlcGVhdCBjb3VudCBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgdGhlIGtleSByZXBlYXRlZAotYmVmb3JlIHRoZXJlIHdhcyBhbm90aGVyIGtleWJvYXJkIGV2ZW50IHRvIGJlIHBsYWNlIGluIHRoZSBxdWV1ZSwgYW5kCi1hbGxvd3MgdGhlIGV2ZW50IGhhbmRsaW5nIGNvZGUgdG8gYXZvaWQga2V5Ym9hcmQgYnVmZmVyIG92ZXJmbG93Ci1jb25kaXRpb25zIHdoZW4gYSBzaW5nbGUga2V5IGlzIGhlbGQgZG93biBieSB0aGUgdXNlci4gSWYgeW91IGFyZSBwcm9jZXNzaW5nCi1hIGtleSByZXBlYXQgY29kZSwgeW91IHdpbGwgcHJvYmFibHkgd2FudCB0byBjaGVjayB0aGlzIGZpZWxkIHRvIHNlZSBob3cKLW1hbnkga2V5IHJlcGVhdHMgeW91IHNob3VsZCBwcm9jZXNzIGZvciB0aGlzIG1lc3NhZ2UuCi0KLVNFRSBBTFNPOgotRVZUX2FzY2lpQ29kZSwgRVZUX3JlcGVhdENvdW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc2hvcnQgRVZUX3JlcGVhdENvdW50KAotICAgIHVsb25nIG1lc3NhZ2UpOwotCi0jZW5kaWYgIC8qIERPQyBGVU5DVElPTlMgKi8KLQotI2lmIGRlZmluZWQoX19SRUFMRE9TX18pIHx8IGRlZmluZWQoX19TTVgzMl9fKQotLyoge3NlY3JldH0gKi8KLXZvaWQgRVZUQVBJIF9FVlRfY0NvZGVFbmQodm9pZCkge30KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvY3B1aW5mby5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvY3B1aW5mby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODhkMjEwLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L2NwdWluZm8uYworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIExpbnV4Ci0qCi0qIERlc2NyaXB0aW9uOiAgTGludXggc3BlY2lmaWMgY29kZSBmb3IgdGhlIENQVSBkZXRlY3Rpb24gbW9kdWxlLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHp0aW1lci5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRPRE86IFdlIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBmb3IgTGludXghCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBTZXRNYXhUaHJlYWRQcmlvcml0eSgpICAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVE9ETzogV2Ugc2hvdWxkIGltcGxlbWVudCB0aGlzIGZvciBMaW51eCEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFJlc3RvcmVUaHJlYWRQcmlvcml0eShpKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgZnJlcXVlbmN5IG9mIHRoZSBjb3VudGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEdldENvdW50ZXJGcmVxdWVuY3koCi0gICAgQ1BVX2xhcmdlSW50ZWdlciAqZnJlcSkKLXsKLSAgICBmcmVxLT5sb3cgPSAxMDAwMDAwOwotICAgIGZyZXEtPmhpZ2ggPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgY291bnRlciB2YWx1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEdldENvdW50ZXIodCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc3RydWN0IHRpbWV2YWwgdHY7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2V0dGltZW9mZGF5KCZ0dixOVUxMKTsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHQpLT5sb3cgPSB0di50dl9zZWMqMTAwMDAwMCArIHR2LnR2X3VzZWM7ICBcCi0gICAgKHQpLT5oaWdoID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9saW51eC9ldmVudC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvZXZlbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UzODczMi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9saW51eC9ldmVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgTGludXgKLSoKLSogRGVzY3JpcHRpb246ICBMaW51eCBmdWxsc2NyZWVuIGNvbnNvbGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBTY2lUZWNoCi0qICAgICAgICAgICAgICAgY3Jvc3MgcGxhdGZvcm0gZXZlbnQgbGlicmFyeS4KLSogICAgICAgICAgICAgICBQb3J0aW9ucyByaXBwZWQgc3RyYWlndGggZnJvbSB0aGUgZ3BtIHNvdXJjZSBjb2RlIGZvciBtb3VzZQotKiAgICAgICAgICAgICAgIGhhbmRsaW5nLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotZXh0ZXJuIGludCAgICAgICAgICAgICAgX1BNX2NvbnNvbGVfZmQ7Ci1zdGF0aWMgdXNob3J0ICAgICAgICAgICBrZXlVcE1zZ1syNTZdID0gezB9Owotc3RhdGljIGludCAgICAgICAgICAgICAgX0VWVF9tb3VzZV9mZCA9IDA7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICByYW5nZV94LCByYW5nZV95Owotc3RhdGljIGludCAgICAgICAgICAgICAgb3B0X2JhdWQgPSAxMjAwLCBvcHRfc2FtcGxlID0gMTAwOwotI2lmZGVmIFVTRV9PU19KT1lTVElDSwotc3RhdGljIHNob3J0ICAgICAgICAgICAgKmF4aXMwID0gTlVMTCwgKmF4aXMxID0gTlVMTDsKLXN0YXRpYyB1Y2hhciAgICAgICAgICAgICpidXRzMCA9IE5VTEwsICpidXRzMSA9IE5VTEw7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICBqb3lzdGljazBfZmQgPSAwLCBqb3lzdGljazFfZmQgPSAwOwotc3RhdGljIGludCAgICAgICAgICAgICAganNfdmVyc2lvbiA9IDA7Ci0jZW5kaWYKLQotLyogVGhpcyBkZWZpbmVzIHRoZSBzdXBwb3J0ZWQgbW91c2UgZHJpdmVycyAqLwotCi10eXBlZGVmIGVudW0gewotICAgIEVWVF9ub01vdXNlID0gLTEsCi0gICAgRVZUX21pY3Jvc29mdCA9IDAsCi0gICAgRVZUX3BzMiwKLSAgICBFVlRfbW91c2VzeXN0ZW1zLAotICAgIEVWVF9ncG0sCi0gICAgRVZUX01Nc2VyaWVzLAotICAgIEVWVF9sb2dpdGVjaCwKLSAgICBFVlRfYnVzbW91c2UsCi0gICAgRVZUX21vdXNlbWFuLAotICAgIEVWVF9pbnRlbGxpbW91c2UsCi0gICAgRVZUX2ludGVsbGltb3VzZV9wczIsCi0gICAgfSBtb3VzZV9kcml2ZXJzX3Q7Ci0KLXN0YXRpYyBtb3VzZV9kcml2ZXJzX3QgbW91c2VfZHJpdmVyID0gRVZUX25vTW91c2U7Ci1zdGF0aWMgY2hhciBtb3VzZV9kZXZbMjBdID0gIi9kZXYvbW91c2UiOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY2hhciAgICAqbmFtZTsKLSAgICBpbnQgICAgIGZsYWdzOwotICAgIHZvaWQgICAgKCppbml0KSh2b2lkKTsKLSAgICB1Y2hhciAgIHByb3RvWzRdOwotICAgIGludCAgICAgcGFja2V0X2xlbjsKLSAgICBpbnQgICAgIHJlYWQ7Ci0gICAgfSBtb3VzZV9pbmZvOwotCi0jZGVmaW5lIFNURF9GTEcgKENSRUFEIHwgQ0xPQ0FMIHwgSFVQQ0wpCi0KLXN0YXRpYyB2b2lkIF9FVlRfbW91c2VfaW5pdCh2b2lkKTsKLXN0YXRpYyB2b2lkIF9FVlRfbG9naXRlY2hfaW5pdCh2b2lkKTsKLXN0YXRpYyB2b2lkIF9FVlRfcG5wbW91c2VfaW5pdCh2b2lkKTsKLQotbW91c2VfaW5mbyBtb3VzZV9pbmZvc1tdID0gewotICAgIHsiTWljcm9zb2Z0IiwgICAgICAgQ1M3IHwgQjEyMDAgfCBTVERfRkxHLCAgICAgICAgICAgICAgX0VWVF9tb3VzZV9pbml0LCAgICB7MHg0MCwgMHg0MCwgMHg0MCwgMHgwMH0sIDMsIDF9LAotICAgIHsiUFMyIiwgICAgICAgICAgICAgU1REX0ZMRywgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICB7MHhjMCwgMHgwMCwgMHgwMCwgMHgwMH0sIDMsIDF9LAotICAgIHsiTW91c2VTeXN0ZW1zIiwgICAgQ1M4IHwgQ1NUT1BCIHwgU1REX0ZMRywgICAgICAgICAgICAgX0VWVF9tb3VzZV9pbml0LCAgICB7MHhmOCwgMHg4MCwgMHgwMCwgMHgwMH0sIDUsIDV9LAotICAgIHsiR1BNIiwgICAgICAgICAgICAgQ1M4IHwgQ1NUT1BCIHwgU1REX0ZMRywgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICB7MHhmOCwgMHg4MCwgMHgwMCwgMHgwMH0sIDUsIDV9LAotICAgIHsiTU1TZXJpZXMiLCAgICAgICAgQ1M4IHwgUEFSRU5CIHwgUEFST0REIHwgU1REX0ZMRywgICAgX0VWVF9tb3VzZV9pbml0LCAgICB7MHhlMCwgMHg4MCwgMHg4MCwgMHgwMH0sIDMsIDF9LAotICAgIHsiTG9naXRlY2giLCAgICAgICAgQ1M4IHwgQ1NUT1BCIHwgU1REX0ZMRywgICAgICAgICAgICAgX0VWVF9sb2dpdGVjaF9pbml0LCB7MHhlMCwgMHg4MCwgMHg4MCwgMHgwMH0sIDMsIDN9LAotICAgIHsiQnVzTW91c2UiLCAgICAgICAgU1REX0ZMRywgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICB7MHhmOCwgMHg4MCwgMHgwMCwgMHgwMH0sIDMsIDN9LAotICAgIHsiTW91c2VNYW4iLCAgICAgICAgQ1M3IHwgU1REX0ZMRywgICAgICAgICAgICAgICAgICAgICAgX0VWVF9tb3VzZV9pbml0LCAgICB7MHg0MCwgMHg0MCwgMHg0MCwgMHgwMH0sIDMsIDF9LAotICAgIHsiSW50ZWxsaU1vdXNlIiwgICAgQ1M3IHwgU1REX0ZMRywgICAgICAgICAgICAgICAgICAgICAgX0VWVF9wbnBtb3VzZV9pbml0LCB7MHhjMCwgMHg0MCwgMHhjMCwgMHgwMH0sIDQsIDF9LAotICAgIHsiSU1QUzIiLCAgICAgICAgICAgQ1M3IHwgU1REX0ZMRywgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICB7MHhjMCwgMHg0MCwgMHhjMCwgMHgwMH0sIDQsIDF9LCAvKiA/ICovCi0gICAgfTsKLQotI2RlZmluZSBOQl9NSUNFIChzaXplb2YobW91c2VfaW5mb3MpL3NpemVvZihtb3VzZV9pbmZvKSkKLQotLyogVGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0IGFyZSB1c2VkIHRvIGNoYW5nZSB0aGUgZGVmYXVsdHMgYWJvdmUgKi8KLQotI2RlZmluZSBFTlZfTU9VU0VEUlYgIk1HTF9NT1VTRURSViIKLSNkZWZpbmUgRU5WX01PVVNFREVWICJNR0xfTU9VU0VERVYiCi0jZGVmaW5lIEVOVl9NT1VTRVNQRCAiTUdMX01PVVNFU1BEIgotI2RlZmluZSBFTlZfSk9ZREVWMCAgIk1HTF9KT1lERVYxIgotI2RlZmluZSBFTlZfSk9ZREVWMSAgIk1HTF9KT1lERVYyIgotCi0vKiBTY2FuY29kZSBtYXBwaW5ncyBvbiBMaW51eCBmb3Igc3BlY2lhbCBrZXlzICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgc2NhbjsKLSAgICBpbnQgbWFwOwotICAgIH0ga2V5bWFwOwotCi0vKiBUT0RPOiBGaXggdGhpcyBhbmQgc2V0IGl0IHVwIHNvIHdlIGNhbiBkbyBhIGJpbmFyeSBzZWFyY2ghICovCi0KLWtleW1hcCBrZXltYXBzW10gPSB7Ci0gICAgezk2LCBLQl9wYWRFbnRlcn0sCi0gICAgezc0LCBLQl9wYWRNaW51c30sCi0gICAgezc4LCBLQl9wYWRQbHVzfSwKLSAgICB7NTUsIEtCX3BhZFRpbWVzfSwKLSAgICB7OTgsIEtCX3BhZERpdmlkZX0sCi0gICAgezcxLCBLQl9wYWRIb21lfSwKLSAgICB7NzIsIEtCX3BhZFVwfSwKLSAgICB7NzMsIEtCX3BhZFBhZ2VVcH0sCi0gICAgezc1LCBLQl9wYWRMZWZ0fSwKLSAgICB7NzYsIEtCX3BhZENlbnRlcn0sCi0gICAgezc3LCBLQl9wYWRSaWdodH0sCi0gICAgezc5LCBLQl9wYWRFbmR9LAotICAgIHs4MCwgS0JfcGFkRG93bn0sCi0gICAgezgxLCBLQl9wYWRQYWdlRG93bn0sCi0gICAgezgyLCBLQl9wYWRJbnNlcnR9LAotICAgIHs4MywgS0JfcGFkRGVsZXRlfSwKLSAgICB7MTA1LEtCX2xlZnR9LAotICAgIHsxMDgsS0JfZG93bn0sCi0gICAgezEwNixLQl9yaWdodH0sCi0gICAgezEwMyxLQl91cH0sCi0gICAgezExMCxLQl9pbnNlcnR9LAotICAgIHsxMDIsS0JfaG9tZX0sCi0gICAgezEwNCxLQl9wYWdlVXB9LAotICAgIHsxMTEsS0JfZGVsZXRlfSwKLSAgICB7MTA3LEtCX2VuZH0sCi0gICAgezEwOSxLQl9wYWdlRG93bn0sCi0gICAgezEyNSxLQl9sZWZ0V2luZG93c30sCi0gICAgezEyNixLQl9yaWdodFdpbmRvd3N9LAotICAgIHsxMjcsS0JfbWVudX0sCi0gICAgezEwMCxLQl9yaWdodEFsdH0sCi0gICAgezk3LEtCX3JpZ2h0Q3RybH0sCi0gICAgfTsKLQotLyogQW5kIHRoZSBrZXlwYWQgd2l0aCBudW0gbG9jayB0dXJuZWQgb24gKGNoYW5nZXMgdGhlIEFTQ0lJIGNvZGUgb25seSkgKi8KLQota2V5bWFwIGtleXBhZFtdID0gewotICAgIHs3MSwgQVNDSUlfN30sCi0gICAgezcyLCBBU0NJSV84fSwKLSAgICB7NzMsIEFTQ0lJXzl9LAotICAgIHs3NSwgQVNDSUlfNH0sCi0gICAgezc2LCBBU0NJSV81fSwKLSAgICB7NzcsIEFTQ0lJXzZ9LAotICAgIHs3OSwgQVNDSUlfMX0sCi0gICAgezgwLCBBU0NJSV8yfSwKLSAgICB7ODEsIEFTQ0lJXzN9LAotICAgIHs4MiwgQVNDSUlfMH0sCi0gICAgezgzLCBBU0NJSV9wZXJpb2R9LAotICAgIH07Ci0KLSNkZWZpbmUgTkJfS0VZTUFQUyAoc2l6ZW9mKGtleW1hcHMpL3NpemVvZihrZXltYXBzWzBdKSkKLSNkZWZpbmUgTkJfS0VZUEFEIChzaXplb2Yoa2V5cGFkKS9zaXplb2Yoa2V5cGFkWzBdKSkKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCAgICAgc2FtcGxlOwotICAgIGNoYXIgICAgY29kZVsyXTsKLSAgICB9IHNhbXBsZV9yYXRlOwotCi1zYW1wbGVfcmF0ZSBzYW1wbGV0YWJbXT17Ci0gICAgeyAgMCwiTyJ9LAotICAgIHsgMTUsIkoifSwKLSAgICB7IDI3LCJLIn0sCi0gICAgeyA0MiwiTCJ9LAotICAgIHsgNjAsIlIifSwKLSAgICB7IDg1LCJNIn0sCi0gICAgezEyNSwiUSJ9LAotICAgIHsxRTksIk4ifSwKLSAgICB9OwotCi0vKiBOdW1iZXIgb2Yga2V5Y29kZXMgdG8gcmVhZCBhdCBhIHRpbWUgZnJvbSB0aGUgY29uc29sZSAqLwotCi0jZGVmaW5lIEtCRFJFQURCVUZGRVJTSVpFIDMyCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFRoZXNlIGFyZSBub3QgdXNlZCB1bmRlciBMaW51eCAqLwotI2RlZmluZSBfRVZUX2Rpc2FibGVJbnQoKSAgICAgICAxCi0jZGVmaW5lIF9FVlRfcmVzdG9yZUludChmbGFwcykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zY2FuQ29kZSAgICAtIFNjYW4gY29kZSB0byB0ZXN0Ci0KLVJFTUFSS1M6Ci1UaGlzIG1hY3JvIGRldGVybWluZXMgaWYgYSBzcGVjaWZpZWQga2V5IGlzIGN1cnJlbnRseSBkb3duIGF0IHRoZQotdGltZSB0aGF0IHRoZSBjYWxsIGlzIG1hZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX2lzS2V5RG93bihzY2FuQ29kZSkgICAgKGtleVVwTXNnW3NjYW5Db2RlXSAhPSAwKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXR1cm4gdGhlIG51bWJlciBvZiB0aWNrcyBzaW5jZSBzeXN0ZW0KLXN0YXJ0dXAgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIHNob3VsZCBiZSB0aGUgc2FtZSB2YWx1ZSB0aGF0IGlzIHBsYWNlZCBpbnRvCi10aGUgdGltZSBzdGFtcCBmaWVsZHMgb2YgZXZlbnRzLCBhbmQgaXMgdXNlZCB0byBpbXBsZW1lbnQgYXV0byBtb3VzZSBkb3duCi1ldmVudHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgX0VWVF9nZXRUaWNrcyh2b2lkKQotewotICAgIHN0YXRpYyB1aW50ICAgICBzdGFydHRpbWUgPSAwOwotICAgIHN0cnVjdCB0aW1ldmFsICB0OwotCi0gICAgZ2V0dGltZW9mZGF5KCZ0LCBOVUxMKTsKLSAgICBpZiAoc3RhcnR0aW1lID09IDApCi0gICAgICBzdGFydHRpbWUgPSB0LnR2X3NlYyAqIDEwMDAgKyAodC50dl91c2VjLzEwMDApOwotICAgIHJldHVybiAoKHQudHZfc2VjICogMTAwMCArICh0LnR2X3VzZWMvMTAwMCkpIC0gc3RhcnR0aW1lKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TbWFsbCBVbml4IGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGZvciBhdmFpbGFiaWxpdHkgb24gYSBmaWxlIHVzaW5nIHNlbGVjdCgpCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGlib29sIGRhdGFSZWFkeSgKLSAgICBpbnQgZmQpCi17Ci0gICAgc3RhdGljIHN0cnVjdCB0aW1ldmFsICAgdCA9IHsgMEwsIDBMIH07Ci0gICAgZmRfc2V0ICAgICAgICAgICAgICAgICAgZmRzOwotCi0gICAgRkRfWkVSTygmZmRzKTsKLSAgICBGRF9TRVQoZmQsICZmZHMpOwotICAgIHJldHVybiBzZWxlY3QoZmQrMSwgJmZkcywgTlVMTCwgTlVMTCwgJnQpID4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkcyBtb3VzZSBkYXRhIGFjY29yZGluZyB0byB0aGUgc2VsZWN0ZWQgbW91c2UgZHJpdmVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpYm9vbCByZWFkTW91c2VEYXRhKAotICAgIGludCAqYnV0dG9ucywKLSAgICBpbnQgKmR4LAotICAgIGludCAqZHkpCi17Ci0gICAgc3RhdGljIHVjaGFyICAgIGRhdGFbMzJdLHByZXYgPSAwOwotICAgIGludCAgICAgICAgICAgICBjbnQgPSAwLHJldDsKLSAgICBtb3VzZV9pbmZvICAgICAgKmRydjsKLQotICAgIC8qIFJlYWQgdGhlIGZpcnN0IGJ5dGUgdG8gY2hlY2sgZm9yIHRoZSBwcm90b2NvbCAqLwotICAgIGRydiA9ICZtb3VzZV9pbmZvc1ttb3VzZV9kcml2ZXJdOwotICAgIGlmIChyZWFkKF9FVlRfbW91c2VfZmQsIGRhdGEsIGRydi0+cmVhZCkgIT0gZHJ2LT5yZWFkKSB7Ci0JcGVycm9yKCJyZWFkIik7Ci0JcmV0dXJuIGZhbHNlOwotCX0KLSAgICBpZiAoKGRhdGFbMF0gJiBkcnYtPnByb3RvWzBdKSAhPSBkcnYtPnByb3RvWzFdKQotCXJldHVybiBmYWxzZTsKLQotICAgIC8qIExvYWQgYSB3aG9sZSBwcm90b2NvbCBwYWNrZXQgKi8KLSAgICBjbnQgKz0gZHJ2LT5yZWFkOwotICAgIHdoaWxlIChjbnQgPCBkcnYtPnBhY2tldF9sZW4pIHsKLQlyZXQgPSByZWFkKF9FVlRfbW91c2VfZmQsIGRhdGErY250LCBkcnYtPnJlYWQpOwotCWlmIChyZXQgPT0gZHJ2LT5yZWFkKQotCSAgICBjbnQgKz0gcmV0OwotCWVsc2UgewotCSAgICBwZXJyb3IoInJlYWQiKTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgIGlmICgoZGF0YVsxXSAmIGRydi0+cHJvdG9bMl0pICE9IGRydi0+cHJvdG9bM10pCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgLyogTm93IGRlY29kZSB0aGUgcHJvdG9jb2wgcGFja2V0ICovCi0gICAgc3dpdGNoIChtb3VzZV9kcml2ZXIpIHsKLQljYXNlIEVWVF9taWNyb3NvZnQ6Ci0JICAgIGlmIChkYXRhWzBdID09IDB4NDAgJiYgIShwcmV2fGRhdGFbMV18ZGF0YVsyXSkpCi0JCSpidXR0b25zID0gMjsgICAvKiBUaGlyZCBidXR0b24gb24gTVMgY29tcGF0aWJsZSBtb3VzZSAqLwotCSAgICBlbHNlCi0JCSpidXR0b25zPSAoKGRhdGFbMF0gJiAweDIwKSA+PiAzKSB8ICgoZGF0YVswXSAmIDB4MTApID4+IDQpOwotCSAgICBwcmV2ID0gKmJ1dHRvbnM7Ci0JICAgICpkeCA9IChjaGFyKSgoKGRhdGFbMF0gJiAweDAzKSA8PCA2KSB8IChkYXRhWzFdICYgMHgzRikpOwotCSAgICAqZHkgPSAoY2hhcikoKChkYXRhWzBdICYgMHgwQykgPDwgNCkgfCAoZGF0YVsyXSAmIDB4M0YpKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBFVlRfcHMyOgotCSAgICAqYnV0dG9ucyA9ICEhKGRhdGFbMF0mMSkgKiA0ICsgISEoZGF0YVswXSYyKSAqIDEgKyAhIShkYXRhWzBdJjQpICogMjsKLQkgICAgaWYgKGRhdGFbMV0gIT0gMCkKLQkJKmR4ID0gKGRhdGFbMF0gJiAweDEwKSA/IGRhdGFbMV0tMjU2IDogZGF0YVsxXTsKLQkgICAgZWxzZQotCQkqZHggPSAwOwotCSAgICBpZiAoZGF0YVsyXSAhPSAwKQotCQkqZHkgPSAtKChkYXRhWzBdICYgMHgyMCkgPyBkYXRhWzJdLTI1NiA6IGRhdGFbMl0pOwotCSAgICBlbHNlCi0JCSpkeSA9IDA7Ci0JICAgIGJyZWFrOwotCWNhc2UgRVZUX21vdXNlc3lzdGVtczogY2FzZSBFVlRfZ3BtOgotCSAgICAqYnV0dG9ucyA9ICh+ZGF0YVswXSkgJiAweDA3OwotCSAgICAqZHggPSAoY2hhcikoZGF0YVsxXSkgKyAoY2hhcikoZGF0YVszXSk7Ci0JICAgICpkeSA9IC0oKGNoYXIpKGRhdGFbMl0pICsgKGNoYXIpKGRhdGFbNF0pKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBFVlRfbG9naXRlY2g6Ci0JICAgICpidXR0b25zPSBkYXRhWzBdICYgMHgwNzsKLQkgICAgKmR4ID0gKGRhdGFbMF0gJiAweDEwKSA/ICAgZGF0YVsxXSA6IC0gZGF0YVsxXTsKLQkgICAgKmR5ID0gKGRhdGFbMF0gJiAweDA4KSA/IC0gZGF0YVsyXSA6ICAgZGF0YVsyXTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBFVlRfYnVzbW91c2U6Ci0JICAgICpidXR0b25zPSAofmRhdGFbMF0pICYgMHgwNzsKLQkgICAgKmR4ID0gKGNoYXIpZGF0YVsxXTsKLQkgICAgKmR5ID0gLShjaGFyKWRhdGFbMl07Ci0JICAgIGJyZWFrOwotCWNhc2UgRVZUX01Nc2VyaWVzOgotCSAgICAqYnV0dG9ucyA9IGRhdGFbMF0gJiAweDA3OwotCSAgICAqZHggPSAoZGF0YVswXSAmIDB4MTApID8gICBkYXRhWzFdIDogLSBkYXRhWzFdOwotCSAgICAqZHkgPSAoZGF0YVswXSAmIDB4MDgpID8gLSBkYXRhWzJdIDogICBkYXRhWzJdOwotCSAgICBicmVhazsKLQljYXNlIEVWVF9pbnRlbGxpbW91c2U6Ci0JICAgICpidXR0b25zID0gKChkYXRhWzBdICYgMHgyMCkgPj4gMykgIC8qIGxlZnQgKi8KLQkJICAgICB8ICgoZGF0YVszXSAmIDB4MTApID4+IDMpICAvKiBtaWRkbGUgKi8KLQkJICAgICB8ICgoZGF0YVswXSAmIDB4MTApID4+IDQpOyAvKiByaWdodCAqLwotCSAgICAqZHggPSAoY2hhcikoKChkYXRhWzBdICYgMHgwMykgPDwgNikgfCAoZGF0YVsxXSAmIDB4M0YpKTsKLQkgICAgKmR5ID0gKGNoYXIpKCgoZGF0YVswXSAmIDB4MEMpIDw8IDQpIHwgKGRhdGFbMl0gJiAweDNGKSk7Ci0JICAgIGJyZWFrOwotCWNhc2UgRVZUX2ludGVsbGltb3VzZV9wczI6Ci0JICAgICpidXR0b25zID0gKGRhdGFbMF0gJiAweDA0KSA+PiAxIC8qIE1pZGRsZSAqLwotCQl8IChkYXRhWzBdICYgMHgwMikgPj4gMSAvKiBSaWdodCAqLwotCQl8IChkYXRhWzBdICYgMHgwMSkgPDwgMjsgLyogTGVmdCAqLwotCSAgICAqZHggPSAoZGF0YVswXSAmIDB4MTApID8gICAgZGF0YVsxXS0yNTYgIDogIGRhdGFbMV07Ci0JICAgICpkeSA9IChkYXRhWzBdICYgMHgyMCkgPyAgLShkYXRhWzJdLTI1NikgOiAtZGF0YVsyXTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBFVlRfbW91c2VtYW46IHsKLQkgICAgc3RhdGljIGludCAgICAgIGdldGV4dHJhOwotCSAgICBzdGF0aWMgdWNoYXIgICAgcHJldj0wOwotCSAgICB1Y2hhciAgICAgICAgICAgYjsKLQotCSAgICAvKiBUaGUgZGFtbmVkIE1vdXNlTWFuIGhhcyAzLzQgYnl0ZXMgcGFja2V0cy4gVGhlIGV4dHJhIGJ5dGUKLQkgICAgICogaXMgb25seSB0aGVyZSBpZiB0aGUgbWlkZGxlIGJ1dHRvbiBpcyBhY3RpdmUuCi0JICAgICAqIEkgZ2V0IHRoZSBleHRyYSBieXRlIGFzIGEgcGFja2V0IHdpdGggbWFnaWMgbnVtYmVycyBpbiBpdC4KLQkgICAgICogYW5kIHRoZW4gc3dpdGNoIHRvIDQtYnl0ZSBtb2RlLgotCSAgICAgKi8KLQkgICAgaWYgKGRhdGFbMV0gPT0gMHhBQSAmJiBkYXRhWzJdID09IDB4NTUpIHsKLQkJLyogR290IHVuZXhwZWN0ZWQgZm91cnRoIGJ5dGUgKi8KLQkJaWYgKChiID0gKCpkYXRhPj40KSkgPiAweDMpCi0JCSAgICByZXR1cm4gZmFsc2U7ICAvKiBqdXN0IGEgc2FuaXR5IGNoZWNrICovCi0JCSpkeCA9ICpkeSA9IDA7Ci0JCWRydi0+cGFja2V0X2xlbj00OwotCQlnZXRleHRyYT0wOwotCQl9Ci0JICAgIGVsc2UgewotCQkvKiBHb3QgMy80LCBhcyBleHBlY3RlZCAqLwotCQkvKiBNb3Rpb24gaXMgaW5kZXBlbmRlbnQgb2YgcGFja2V0bGVuLi4uICovCi0JCSpkeCA9IChjaGFyKSgoKGRhdGFbMF0gJiAweDAzKSA8PCA2KSB8IChkYXRhWzFdICYgMHgzRikpOwotCQkqZHkgPSAoY2hhcikoKChkYXRhWzBdICYgMHgwQykgPDwgNCkgfCAoZGF0YVsyXSAmIDB4M0YpKTsKLQkJcHJldiA9ICgoZGF0YVswXSAmIDB4MjApID4+IDMpIHwgKChkYXRhWzBdICYgMHgxMCkgPj4gNCk7Ci0JCWlmIChkcnYtPnBhY2tldF9sZW49PTQpCi0JCSAgICBiID0gZGF0YVszXT4+NDsKLQkJfQotCSAgICBpZiAoZHJ2LT5wYWNrZXRfbGVuID09IDQpIHsKLQkJaWYgKGIgPT0gMCkgewotCQkgICAgZHJ2LT5wYWNrZXRfbGVuID0gMzsKLQkJICAgIGdldGV4dHJhID0gMTsKLQkJICAgIH0KLQkJZWxzZSB7Ci0JCSAgICBpZiAoYiAmIDB4MikKLQkJCXByZXYgfD0gMjsKLQkJICAgIH0KLQkJfQotCSAgICAqYnV0dG9ucyA9IHByZXY7Ci0KLQkgICAgLyogVGhpcyAiY2hvcmQtbWlkZGxlIiBiZWhhdmlvdXIgd2FzIHJlcG9ydGVkIGJ5IERhdmlkIEEuIHZhbiBMZWV1d2VuICovCi0JICAgIGlmICgoKHByZXYgXiAqYnV0dG9ucykgJiA1KSA9PSA1KQotCQkqYnV0dG9ucyA9ICpidXR0b25zID8gMiA6IDA7Ci0JICAgIHByZXYgPSAqYnV0dG9uczsKLQkgICAgYnJlYWs7Ci0JICAgIH0KLQljYXNlIEVWVF9ub01vdXNlOgotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGJyZWFrOwotCX0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1NYXAgYSBrZXlwcmVzcyB2aWEgdGhlIGtleSBtYXBwaW5nIHRhYmxlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBnZXRLZXlNYXBwaW5nKAotICAgIGtleW1hcCAqdGFiLAotICAgIGludCBuYiwKLSAgICBpbnQga2V5KQotewotICAgIGludCBpOwotCi0gICAgZm9yKGkgPSAwOyBpIDwgbmI7IGkrKykgewotCWlmICh0YWJbaV0uc2NhbiA9PSBrZXkpCi0JICAgIHJldHVybiB0YWJbaV0ubWFwOwotCX0KLSAgICByZXR1cm4ga2V5OwotfQotCi0jaWZkZWYgVVNFX09TX0pPWVNUSUNLCi0KLXN0YXRpYyBjaGFyIGpzMF9heGVzID0gMCwganMwX2J1dHRvbnMgPSAwOwotc3RhdGljIGNoYXIganMxX2F4ZXMgPSAwLCBqczFfYnV0dG9ucyA9IDA7Ci1zdGF0aWMgY2hhciBqb3lzdGljazBfZGV2WzIwXSA9ICIvZGV2L2pzMCI7Ci1zdGF0aWMgY2hhciBqb3lzdGljazFfZGV2WzIwXSA9ICIvZGV2L2pzMSI7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ3JlYXRlIGEgam95c3RpY2sgZXZlbnQgZnJvbSB0aGUgam95c3RpY2sgZGF0YQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIG1ha2VKb3lFdmVudCgKLSAgICBldmVudF90ICpldnQpCi17Ci0gICAgZXZ0LT5tZXNzYWdlID0gMDsKLSAgICBpZiAoYnV0czAgJiYgYXhpczApIHsKLQlpZiAoYnV0czBbMF0pIGV2dC0+bWVzc2FnZSB8PSBFVlRfSk9ZMV9CVVRUT05BOwotCWlmIChidXRzMFsxXSkgZXZ0LT5tZXNzYWdlIHw9IEVWVF9KT1kxX0JVVFRPTkI7Ci0JZXZ0LT53aGVyZV94ID0gYXhpczBbMF07Ci0JZXZ0LT53aGVyZV95ID0gYXhpczBbMV07Ci0JfQotICAgIGVsc2UKLQlldnQtPndoZXJlX3ggPSBldnQtPndoZXJlX3kgPSAwOwotICAgIGlmIChidXRzMSAmJiBheGlzMSkgewotCWlmIChidXRzMVswXSkgZXZ0LT5tZXNzYWdlIHw9IEVWVF9KT1kyX0JVVFRPTkE7Ci0JaWYgKGJ1dHMxWzFdKSBldnQtPm1lc3NhZ2UgfD0gRVZUX0pPWTJfQlVUVE9OQjsKLQlldnQtPndoZXJlX3ggPSBheGlzMVswXTsKLQlldnQtPndoZXJlX3kgPSBheGlzMVsxXTsKLQl9Ci0gICAgZWxzZQotCWV2dC0+d2hlcmVfeCA9IGV2dC0+d2hlcmVfeSA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCB0aGUgam95c3RpY2sgYXhpcyBkYXRhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IEVWVEFQSSBfRVZUX3JlYWRKb3lBeGlzKAotICAgIGludCBqbWFzaywKLSAgICBpbnQgKmF4aXMpCi17Ci0gICAgaW50IG1hc2sgPSAwOwotCi0gICAgaWYgKChqc192ZXJzaW9uICYgfjB4ZmZmZikgPT0gMCkgewotCS8qIE9sZCAwLnggZHJpdmVyICovCi0Jc3RydWN0IEpTX0RBVEFfVFlQRSBqczsKLQlpZiAoam95c3RpY2swX2ZkICYmIHJlYWQoam95c3RpY2swX2ZkLCAmanMsIEpTX1JFVFVSTikgPT0gSlNfUkVUVVJOKSB7Ci0JICAgIGlmIChqbWFzayAmIEVWVF9KT1lfQVhJU19YMSkKLQkJYXhpc1swXSA9IGpzLng7Ci0JICAgIGlmIChqbWFzayAmIEVWVF9KT1lfQVhJU19ZMSkKLQkJYXhpc1sxXSA9IGpzLnk7Ci0JICAgIG1hc2sgfD0gRVZUX0pPWV9BWElTX1gxfEVWVF9KT1lfQVhJU19ZMTsKLQkgICAgfQotCWlmIChqb3lzdGljazFfZmQgJiYgcmVhZChqb3lzdGljazFfZmQsICZqcywgSlNfUkVUVVJOKSA9PSBKU19SRVRVUk4pIHsKLQkgICAgaWYgKGptYXNrICYgRVZUX0pPWV9BWElTX1gyKQotCQlheGlzWzJdID0ganMueDsKLQkgICAgaWYgKGptYXNrICYgRVZUX0pPWV9BWElTX1kyKQotCQlheGlzWzNdID0ganMueTsKLQkgICAgbWFzayB8PSBFVlRfSk9ZX0FYSVNfWDJ8RVZUX0pPWV9BWElTX1kyOwotCSAgICB9Ci0JfQotICAgIGVsc2UgewotCWlmIChheGlzMCkgewotCSAgICBpZiAoam1hc2sgJiBFVlRfSk9ZX0FYSVNfWDEpCi0JCWF4aXNbMF0gPSBheGlzMFswXTsKLQkgICAgaWYgKGptYXNrICYgRVZUX0pPWV9BWElTX1kxKQotCQlheGlzWzFdID0gYXhpczBbMV07Ci0JICAgIG1hc2sgfD0gRVZUX0pPWV9BWElTX1gxIHwgRVZUX0pPWV9BWElTX1kxOwotCSAgICB9Ci0JaWYgKGF4aXMxKSB7Ci0JICAgIGlmIChqbWFzayAmIEVWVF9KT1lfQVhJU19YMikKLQkJYXhpc1syXSA9IGF4aXMxWzBdOwotCSAgICBpZiAoam1hc2sgJiBFVlRfSk9ZX0FYSVNfWTIpCi0JCWF4aXNbM10gPSBheGlzMVsxXTsKLQkgICAgbWFzayB8PSBFVlRfSk9ZX0FYSVNfWDIgfCBFVlRfSk9ZX0FYSVNfWTI7Ci0JICAgIH0KLQl9Ci0gICAgcmV0dXJuIG1hc2s7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCB0aGUgam95c3RpY2sgYnV0dG9uIGRhdGEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgRVZUQVBJIF9FVlRfcmVhZEpveUJ1dHRvbnModm9pZCkKLXsKLSAgICBpbnQgYnV0cyA9IDA7Ci0KLSAgICBpZiAoKGpzX3ZlcnNpb24gJiB+MHhmZmZmKSA9PSAwKSB7Ci0JLyogT2xkIDAueCBkcml2ZXIgKi8KLQlzdHJ1Y3QgSlNfREFUQV9UWVBFIGpzOwotCWlmIChqb3lzdGljazBfZmQgJiYgcmVhZChqb3lzdGljazBfZmQsICZqcywgSlNfUkVUVVJOKSA9PSBKU19SRVRVUk4pCi0JICAgIGJ1dHMgPSBqcy5idXR0b25zOwotCWlmIChqb3lzdGljazFfZmQgJiYgcmVhZChqb3lzdGljazFfZmQsICZqcywgSlNfUkVUVVJOKSA9PSBKU19SRVRVUk4pCi0JICAgIGJ1dHMgfD0ganMuYnV0dG9ucyA8PCAyOwotCX0KLSAgICBlbHNlIHsKLQlpZiAoYnV0czApCi0JICAgIGJ1dHMgfD0gRVZUX0pPWTFfQlVUVE9OQSpidXRzMFswXSArIEVWVF9KT1kxX0JVVFRPTkIqYnV0czBbMV07Ci0JaWYgKGJ1dHMxKQotCSAgICBidXRzIHw9IEVWVF9KT1kyX0JVVFRPTkEqYnV0czFbMF0gKyBFVlRfSk9ZMl9CVVRUT05CKmJ1dHMxWzFdOwotCX0KLSAgICByZXR1cm4gYnV0czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotUmV0dXJucyB0aGUgbWFzayBpbmRpY2F0aW5nIHdoYXQgam95c3RpY2sgYXhlcyBhcmUgYXR0YWNoZWQuCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBkZXRlY3QgdGhlIGF0dGFjaGVkIGpveXN0aWNrcywgYW5kIGRldGVybWluZQotd2hhdCBheGVzIGFyZSBwcmVzZW50IGFuZCBmdW5jdGlvbmluZy4gVGhpcyBmdW5jdGlvbiB3aWxsIHJlLWRldGVjdCBhbnkKLWF0dGFjaGVkIGpveXN0aWNrcyB3aGVuIGl0IGlzIGNhbGxlZCwgc28gaWYgdGhlIHVzZXIgZm9yZ290IHRvIGF0dGFjaAotdGhlIGpveXN0aWNrIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHN0YXJ0ZWQsIHlvdSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIHRvCi1yZS1kZXRlY3QgYW55IG5ld2x5IGF0dGFjaGVkIGpveXN0aWNrcy4KLQotU0VFIEFMU086Ci1FVlRfam95U2V0TG93ZXJSaWdodCwgRVZUX2pveVNldENlbnRlciwgRVZUX2pveUlzUHJlc2VudAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBFVlRBUEkgRVZUX2pveUlzUHJlc2VudCh2b2lkKQotewotICAgIHN0YXRpYyBpbnQgICAgICBtYXNrID0gMDsKLSAgICBpbnQgICAgICAgICAgICAgaTsKLSAgICBjaGFyICAgICAgICAgICAgKnRtcCwgbmFtZTBbMTI4XSwgbmFtZTFbMTI4XTsKLSAgICBzdGF0aWMgaWJvb2wgICAgaW5pdGVkID0gZmFsc2U7Ci0KLSAgICBpZiAoaW5pdGVkKQotCXJldHVybiBtYXNrOwotICAgIG1lbXNldChFVlQuam95TWluLDAsc2l6ZW9mKEVWVC5qb3lNaW4pKTsKLSAgICBtZW1zZXQoRVZULmpveUNlbnRlciwwLHNpemVvZihFVlQuam95Q2VudGVyKSk7Ci0gICAgbWVtc2V0KEVWVC5qb3lNYXgsMCxzaXplb2YoRVZULmpveU1heCkpOwotICAgIG1lbXNldChFVlQuam95UHJldiwwLHNpemVvZihFVlQuam95UHJldikpOwotICAgIEVWVC5qb3lCdXRTdGF0ZSA9IDA7Ci0gICAgaWYgKCh0bXAgPSBnZXRlbnYoRU5WX0pPWURFVjApKSAhPSBOVUxMKQotCXN0cmNweShqb3lzdGljazBfZGV2LHRtcCk7Ci0gICAgaWYgKCh0bXAgPSBnZXRlbnYoRU5WX0pPWURFVjEpKSAhPSBOVUxMKQotCXN0cmNweShqb3lzdGljazFfZGV2LHRtcCk7Ci0gICAgaWYgKChqb3lzdGljazBfZmQgPSBvcGVuKGpveXN0aWNrMF9kZXYsIE9fUkRPTkxZKSkgPCAwKQotCWpveXN0aWNrMF9mZCA9IDA7Ci0gICAgaWYgKChqb3lzdGljazFfZmQgPSBvcGVuKGpveXN0aWNrMV9kZXYsIE9fUkRPTkxZKSkgPCAwKQotCWpveXN0aWNrMV9mZCA9IDA7Ci0gICAgaWYgKCFqb3lzdGljazBfZmQgJiYgIWpveXN0aWNrMV9mZCkgLyogTm8gam95c3RpY2tzIGRldGVjdGVkICovCi0JcmV0dXJuIDA7Ci0gICAgaW5pdGVkID0gdHJ1ZTsKLSAgICBpZiAoaW9jdGwoam95c3RpY2swX2ZkID8gam95c3RpY2swX2ZkIDogam95c3RpY2sxX2ZkLCBKU0lPQ0dWRVJTSU9OLCAmanNfdmVyc2lvbikgPCAwKQotCXJldHVybiAwOwotCi0gICAgLyogSW5pdGlhbGlzZSBqb3lzdGljayAwICovCi0gICAgaWYgKGpveXN0aWNrMF9mZCkgewotCWlvY3RsKGpveXN0aWNrMF9mZCwgSlNJT0NHTkFNRShzaXplb2YobmFtZTApKSwgbmFtZTApOwotCWlmIChqc192ZXJzaW9uICYgfjB4ZmZmZikgewotCSAgICBzdHJ1Y3QganNfZXZlbnQganM7Ci0KLQkgICAgaW9jdGwoam95c3RpY2swX2ZkLCBKU0lPQ0dBWEVTLCAmanMwX2F4ZXMpOwotCSAgICBpb2N0bChqb3lzdGljazBfZmQsIEpTSU9DR0JVVFRPTlMsICZqczBfYnV0dG9ucyk7Ci0JICAgIGF4aXMwID0gUE1fY2FsbG9jKChpbnQpanMwX2F4ZXMsIHNpemVvZihzaG9ydCkpOwotCSAgICBidXRzMCA9IFBNX21hbGxvYygoaW50KWpzMF9idXR0b25zKTsKLQkgICAgLyogUmVhZCB0aGUgaW5pdGlhbCBldmVudHMgKi8KLQkgICAgd2hpbGUoZGF0YVJlYWR5KGpveXN0aWNrMF9mZCkKLQkJICAmJiByZWFkKGpveXN0aWNrMF9mZCwgJmpzLCBzaXplb2Yoc3RydWN0IGpzX2V2ZW50KSkgPT0gc2l6ZW9mKHN0cnVjdCBqc19ldmVudCkKLQkJICAmJiAoanMudHlwZSAmIEpTX0VWRU5UX0lOSVQpCi0JCSAgKSB7Ci0JCWlmIChqcy50eXBlICYgSlNfRVZFTlRfQlVUVE9OKQotCQkgICAgYnV0czBbanMubnVtYmVyXSA9IGpzLnZhbHVlOwotCQllbHNlIGlmIChqcy50eXBlICYgSlNfRVZFTlRfQVhJUykKLQkJICAgIGF4aXMwW2pzLm51bWJlcl0gPSBzY2FsZUpveUF4aXMoanMudmFsdWUsanMubnVtYmVyKTsKLQkJfQotCSAgICB9Ci0JZWxzZSB7Ci0JICAgIGpzMF9heGVzID0gMjsKLQkgICAganMwX2J1dHRvbnMgPSAyOwotCSAgICBheGlzMCA9IFBNX2NhbGxvYygoaW50KWpzMF9heGVzLCBzaXplb2Yoc2hvcnQpKTsKLQkgICAgYnV0czAgPSBQTV9tYWxsb2MoKGludClqczBfYnV0dG9ucyk7Ci0JICAgIH0KLQl9Ci0KLSAgICAvKiBJbml0aWFsaXNlIGpveXN0aWNrIDEgKi8KLSAgICBpZiAoam95c3RpY2sxX2ZkKSB7Ci0JaW9jdGwoam95c3RpY2sxX2ZkLCBKU0lPQ0dOQU1FKHNpemVvZihuYW1lMSkpLCBuYW1lMSk7Ci0JaWYgKGpzX3ZlcnNpb24gJiB+MHhmZmZmKSB7Ci0JICAgIHN0cnVjdCBqc19ldmVudCBqczsKLQotCSAgICBpb2N0bChqb3lzdGljazFfZmQsIEpTSU9DR0FYRVMsICZqczFfYXhlcyk7Ci0JICAgIGlvY3RsKGpveXN0aWNrMV9mZCwgSlNJT0NHQlVUVE9OUywgJmpzMV9idXR0b25zKTsKLQkgICAgYXhpczEgPSBQTV9jYWxsb2MoKGludClqczFfYXhlcywgc2l6ZW9mKHNob3J0KSk7Ci0JICAgIGJ1dHMxID0gUE1fbWFsbG9jKChpbnQpanMxX2J1dHRvbnMpOwotCSAgICAvKiBSZWFkIHRoZSBpbml0aWFsIGV2ZW50cyAqLwotCSAgICB3aGlsZShkYXRhUmVhZHkoam95c3RpY2sxX2ZkKQotCQkgICYmIHJlYWQoam95c3RpY2sxX2ZkLCAmanMsIHNpemVvZihzdHJ1Y3QganNfZXZlbnQpKT09c2l6ZW9mKHN0cnVjdCBqc19ldmVudCkKLQkJICAmJiAoanMudHlwZSAmIEpTX0VWRU5UX0lOSVQpCi0JCSAgKSB7Ci0JCWlmIChqcy50eXBlICYgSlNfRVZFTlRfQlVUVE9OKQotCQkgICAgYnV0czFbanMubnVtYmVyXSA9IGpzLnZhbHVlOwotCQllbHNlIGlmIChqcy50eXBlICYgSlNfRVZFTlRfQVhJUykKLQkJICAgIGF4aXMxW2pzLm51bWJlcl0gPSBzY2FsZUpveUF4aXMoanMudmFsdWUsanMubnVtYmVyPDwyKTsKLQkJfQotCSAgICB9Ci0JZWxzZSB7Ci0JICAgIGpzMV9heGVzID0gMjsKLQkgICAganMxX2J1dHRvbnMgPSAyOwotCSAgICBheGlzMSA9IFBNX2NhbGxvYygoaW50KWpzMV9heGVzLCBzaXplb2Yoc2hvcnQpKTsKLQkgICAgYnV0czEgPSBQTV9tYWxsb2MoKGludClqczFfYnV0dG9ucyk7Ci0JICAgIH0KLQl9Ci0KLSNpZmRlZiAgQ0hFQ0tFRAotICAgIGZwcmludGYoc3RkZXJyLCJVc2luZyBqb3lzdGljayBkcml2ZXIgdmVyc2lvbiAlZC4lZC4lZFxuIiwKLQkgICAganNfdmVyc2lvbiA+PiAxNiwgKGpzX3ZlcnNpb24gPj4gOCkgJiAweGZmLCBqc192ZXJzaW9uICYgMHhmZik7Ci0gICAgaWYgKGpveXN0aWNrMF9mZCkKLQlmcHJpbnRmKHN0ZGVyciwiSm95c3RpY2sgMSAoJXMpOiAlc1xuIiwgam95c3RpY2swX2RldiwgbmFtZTApOwotICAgIGlmIChqb3lzdGljazFfZmQpCi0JZnByaW50ZihzdGRlcnIsIkpveXN0aWNrIDIgKCVzKTogJXNcbiIsIGpveXN0aWNrMV9kZXYsIG5hbWUxKTsKLSNlbmRpZgotICAgIG1hc2sgPSBfRVZUX3JlYWRKb3lBeGlzKEVWVF9KT1lfQVhJU19BTEwsRVZULmpveUNlbnRlcik7Ci0gICAgaWYgKG1hc2spIHsKLQlmb3IgKGkgPSAwOyBpIDwgSk9ZX05VTV9BWEVTOyBpKyspCi0JICAgIEVWVC5qb3lNYXhbaV0gPSBFVlQuam95Q2VudGVyW2ldKjI7Ci0JfQotICAgIHJldHVybiBtYXNrOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1Qb2xscyB0aGUgam95c3RpY2sgZm9yIHBvc2l0aW9uIGFuZCBidXR0b24gaW5mb3JtYXRpb24uCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotUkVNQVJLUzoKLVRoaXMgcm91dGluZSBpcyB1c2VkIHRvIHBvbGwgYW5hbG9ndWUgam95c3RpY2tzIGZvciBidXR0b24gYW5kIHBvc2l0aW9uCi1pbmZvcm1hdGlvbi4gSXQgc2hvdWxkIGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIG1haW4gbG9vcCBvZiB0aGUgdXNlcgotYXBwbGljYXRpb24sIGp1c3QgYmVmb3JlIHByb2Nlc3NpbmcgYWxsIHBlbmRpbmcgZXZlbnRzIHZpYSBFVlRfZ2V0TmV4dC4KLUFsbCBpbmZvcm1hdGlvbiBwb2xsZWQgZnJvbSB0aGUgam95c3RpY2sgd2lsbCBiZSBwb3N0ZWQgdG8gdGhlIGV2ZW50Ci1xdWV1ZSBmb3IgbGF0ZXIgcmV0cmlldmFsLgotCi1Ob3RlOiAgIE1vc3QgYW5hbG9ndWUgam95c3RpY2tzIHdpbGwgcHJvdmlkZSByZWFkaW5ncyB0aGF0IGNoYW5nZSBldmVuCi0JdGhvdWdoIHRoZSBqb3lzdGljayBoYXMgbm90IG1vdmVkLiBIZW5jZSBpZiB5b3UgY2FsbCB0aGlzIHJvdXRpbmUKLQl5b3Ugd2lsbCBsaWtlbHkgZ2V0IGFuIEVWVF9KT1lNT1ZFIGV2ZW50IGV2ZXJ5IHRpbWUgdGhyb3VnaCB5b3VyCi0JZXZlbnQgbG9vcC4KLQotU0VFIEFMU086Ci1FVlRfZ2V0TmV4dCwgRVZUX3BlZWtOZXh0LCBFVlRfam95U2V0VXBwZXJMZWZ0LCBFVlRfam95U2V0TG93ZXJSaWdodCwKLUVWVF9qb3lTZXRDZW50ZXIsIEVWVF9qb3lJc1ByZXNlbnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfcG9sbEpveXN0aWNrKHZvaWQpCi17Ci0gICAgZXZlbnRfdCBldnQ7Ci0gICAgaW50ICAgICBpLGF4aXNbSk9ZX05VTV9BWEVTXSxuZXdCdXRTdGF0ZSxtYXNrLG1vdmVkLHBzOwotCi0gICAgaWYgKChqc192ZXJzaW9uICYgfjB4RkZGRikgPT0gMCAmJiBFVlQuam95TWFzaykgewotCS8qIFJlYWQgam95c3RpY2sgYXhlcyBhbmQgcG9zdCBtb3ZlbWVudCBldmVudHMgaWYgdGhleSBoYXZlCi0JICogY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIHBvbGxlZC4gVW50aWwgdGhlIGV2ZW50cyBhcmUKLQkgKiBhY3R1YWxseSBmbHVzaGVkLCB3ZSBrZWVwIG1vZGlmeWluZyB0aGUgc2FtZSBqb3lzdGljayBtb3ZlbWVudAotCSAqIGV2ZW50LCBzbyB5b3Ugd29uJ3QgZ2V0IG11bHRpcGxlIG1vdmVtZW50IGV2ZW50Ci0JICovCi0JbWFzayA9IF9FVlRfcmVhZEpveUF4aXMoRVZULmpveU1hc2ssYXhpcyk7Ci0JbmV3QnV0U3RhdGUgPSBfRVZUX3JlYWRKb3lCdXR0b25zKCk7Ci0JbW92ZWQgPSBmYWxzZTsKLQlmb3IgKGkgPSAwOyBpIDwgSk9ZX05VTV9BWEVTOyBpKyspIHsKLQkgICAgaWYgKG1hc2sgJiAoRVZUX0pPWV9BWElTX1gxIDw8IGkpKQotCQlheGlzW2ldID0gc2NhbGVKb3lBeGlzKGF4aXNbaV0saSk7Ci0JICAgIGVsc2UKLQkJYXhpc1tpXSA9IEVWVC5qb3lQcmV2W2ldOwotCSAgICBpZiAoYXhpc1tpXSAhPSBFVlQuam95UHJldltpXSkKLQkJbW92ZWQgPSB0cnVlOwotCSAgICB9Ci0JaWYgKG1vdmVkKSB7Ci0JICAgIG1lbWNweShFVlQuam95UHJldixheGlzLHNpemVvZihFVlQuam95UHJldikpOwotCSAgICBwcyA9IF9FVlRfZGlzYWJsZUludCgpOwotCSAgICBpZiAoRVZULm9sZEpveU1vdmUgIT0gLTEpIHsKLQkJLyogTW9kaWZ5IHRoZSBleGlzdGluZyBqb3lzdGljayBtb3ZlbWVudCBldmVudCAqLwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ubWVzc2FnZSA9IG5ld0J1dFN0YXRlOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ud2hlcmVfeCA9IEVWVC5qb3lQcmV2WzBdOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ud2hlcmVfeSA9IEVWVC5qb3lQcmV2WzFdOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ucmVsYXRpdmVfeCA9IEVWVC5qb3lQcmV2WzJdOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ucmVsYXRpdmVfeSA9IEVWVC5qb3lQcmV2WzNdOwotCQl9Ci0JICAgIGVsc2UgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpIHsKLQkJLyogQWRkIGEgbmV3IGpveXN0aWNrIG1vdmVtZW50IGV2ZW50ICovCi0JCUVWVC5vbGRKb3lNb3ZlID0gRVZULmZyZWVIZWFkOwotCQltZW1zZXQoJmV2dCwwLHNpemVvZihldnQpKTsKLQkJZXZ0LndoYXQgPSBFVlRfSk9ZTU9WRTsKLQkJZXZ0Lm1lc3NhZ2UgPSBFVlQuam95QnV0U3RhdGU7Ci0JCWV2dC53aGVyZV94ID0gRVZULmpveVByZXZbMF07Ci0JCWV2dC53aGVyZV95ID0gRVZULmpveVByZXZbMV07Ci0JCWV2dC5yZWxhdGl2ZV94ID0gRVZULmpveVByZXZbMl07Ci0JCWV2dC5yZWxhdGl2ZV95ID0gRVZULmpveVByZXZbM107Ci0JCWFkZEV2ZW50KCZldnQpOwotCQl9Ci0JICAgIF9FVlRfcmVzdG9yZUludChwcyk7Ci0JICAgIH0KLQotCS8qIFJlYWQgdGhlIGpveXN0aWNrIGJ1dHRvbnMsIGFuZCBwb3N0IGV2ZW50cyB0byByZWZsZWN0IHRoZSBjaGFuZ2UKLQkgKiBpbiBzdGF0ZSBmb3IgdGhlIGpveXN0aWNrIGJ1dHRvbnMuCi0JICovCi0JaWYgKG5ld0J1dFN0YXRlICE9IEVWVC5qb3lCdXRTdGF0ZSkgewotCSAgICBpZiAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkgewotCQkvKiBBZGQgYSBuZXcgam95c3RpY2sgbW92ZW1lbnQgZXZlbnQgKi8KLQkJcHMgPSBfRVZUX2Rpc2FibGVJbnQoKTsKLQkJbWVtc2V0KCZldnQsMCxzaXplb2YoZXZ0KSk7Ci0JCWV2dC53aGF0ID0gRVZUX0pPWUNMSUNLOwotCQlldnQubWVzc2FnZSA9IG5ld0J1dFN0YXRlOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ud2hlcmVfeCA9IEVWVC5qb3lQcmV2WzBdOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ud2hlcmVfeSA9IEVWVC5qb3lQcmV2WzFdOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ucmVsYXRpdmVfeCA9IEVWVC5qb3lQcmV2WzJdOwotCQlFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0ucmVsYXRpdmVfeSA9IEVWVC5qb3lQcmV2WzNdOwotCQlhZGRFdmVudCgmZXZ0KTsKLQkJX0VWVF9yZXN0b3JlSW50KHBzKTsKLQkJfQotCSAgICBFVlQuam95QnV0U3RhdGUgPSBuZXdCdXRTdGF0ZTsKLQkgICAgfQotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotQ2FsaWJyYXRlcyB0aGUgam95c3RpY2sgdXBwZXIgbGVmdCBwb3NpdGlvbgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHplcm8gaW4gb24gYmV0dGVyIGpveXN0aWNrIGNhbGlicmF0aW9uIGZhY3RvcnMsCi13aGljaCBtYXkgd29yayBiZXR0ZXIgdGhhbiB0aGUgZGVmYXVsdCBzaW1wbGlzdGljIGNhbGlicmF0aW9uICh3aGljaCBhc3N1bWVzCi10aGUgam95c3RpY2sgaXMgY2VudGVyZWQgd2hlbiB0aGUgZXZlbnQgbGlicmFyeSBpcyBpbml0aWFsaXNlZCkuCi1UbyB1c2UgdGhpcyBmdW5jdGlvbiwgYXNrIHRoZSB1c2VyIHRvIGhvbGQgdGhlIHN0aWNrIGluIHRoZSB1cHBlciBsZWZ0Ci1wb3NpdGlvbiBhbmQgdGhlbiBoYXZlIHRoZW0gcHJlc3MgYSBrZXkgb3IgYnV0dG9uLiBhbmQgdGhlbiBjYWxsIHRoaXMKLWZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGhlbiByZWFkIHRoZSBqb3lzdGljayBhbmQgdXBkYXRlIHRoZQotY2FsaWJyYXRpb24gZmFjdG9ycy4KLQotVXN1YWxseSwgYXNzdW1pbmcgdGhhdCB0aGUgc3RpY2sgd2FzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgd2FzCi1pbml0aWFsaXplZCwgeW91IHJlYWxseSBvbmx5IG5lZWQgdG8gY2FsbCBFVlRfam95U2V0TG93ZXJSaWdodCBzaW5jZSB0aGUKLXVwcGVyIGxlZnQgcG9zaXRpb24gaXMgdXN1YWxseSBhbHdheXMgMCwwIG9uIG1vc3Qgam95c3RpY2tzLiBIb3dldmVyLCB0aGUKLXNhZmVzdCBwcm9jZWR1cmUgaXMgdG8gY2FsbCBhbGwgdGhyZWUgY2FsaWJyYXRpb24gZnVuY3Rpb25zLgotCi1TRUUgQUxTTzoKLUVWVF9qb3lTZXRVcHBlckxlZnQsIEVWVF9qb3lTZXRMb3dlclJpZ2h0LCBFVlRfam95SXNQcmVzZW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2pveVNldFVwcGVyTGVmdCh2b2lkKQotewotICAgIF9FVlRfcmVhZEpveUF4aXMoRVZUX0pPWV9BWElTX0FMTCxFVlQuam95TWluKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotQ2FsaWJyYXRlcyB0aGUgam95c3RpY2sgbG93ZXIgcmlnaHQgcG9zaXRpb24KLQotSEVBREVSOgotZXZlbnQuaAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byB6ZXJvIGluIG9uIGJldHRlciBqb3lzdGljayBjYWxpYnJhdGlvbiBmYWN0b3JzLAotd2hpY2ggbWF5IHdvcmsgYmV0dGVyIHRoYW4gdGhlIGRlZmF1bHQgc2ltcGxpc3RpYyBjYWxpYnJhdGlvbiAod2hpY2ggYXNzdW1lcwotdGhlIGpveXN0aWNrIGlzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgaXMgaW5pdGlhbGlzZWQpLgotVG8gdXNlIHRoaXMgZnVuY3Rpb24sIGFzayB0aGUgdXNlciB0byBob2xkIHRoZSBzdGljayBpbiB0aGUgbG93ZXIgcmlnaHQKLXBvc2l0aW9uIGFuZCB0aGVuIGhhdmUgdGhlbSBwcmVzcyBhIGtleSBvciBidXR0b24uIGFuZCB0aGVuIGNhbGwgdGhpcwotZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gd2lsbCB0aGVuIHJlYWQgdGhlIGpveXN0aWNrIGFuZCB1cGRhdGUgdGhlCi1jYWxpYnJhdGlvbiBmYWN0b3JzLgotCi1Vc3VhbGx5LCBhc3N1bWluZyB0aGF0IHRoZSBzdGljayB3YXMgY2VudGVyZWQgd2hlbiB0aGUgZXZlbnQgbGlicmFyeSB3YXMKLWluaXRpYWxpemVkLCB5b3UgcmVhbGx5IG9ubHkgbmVlZCB0byBjYWxsIEVWVF9qb3lTZXRMb3dlclJpZ2h0IHNpbmNlIHRoZQotdXBwZXIgbGVmdCBwb3NpdGlvbiBpcyB1c3VhbGx5IGFsd2F5cyAwLDAgb24gbW9zdCBqb3lzdGlja3MuIEhvd2V2ZXIsIHRoZQotc2FmZXN0IHByb2NlZHVyZSBpcyB0byBjYWxsIGFsbCB0aHJlZSBjYWxpYnJhdGlvbiBmdW5jdGlvbnMuCi0KLVNFRSBBTFNPOgotRVZUX2pveVNldFVwcGVyTGVmdCwgRVZUX2pveVNldENlbnRlciwgRVZUX2pveUlzUHJlc2VudAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9qb3lTZXRMb3dlclJpZ2h0KHZvaWQpCi17Ci0gICAgX0VWVF9yZWFkSm95QXhpcyhFVlRfSk9ZX0FYSVNfQUxMLEVWVC5qb3lNYXgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1DYWxpYnJhdGVzIHRoZSBqb3lzdGljayBjZW50ZXIgcG9zaXRpb24KLQotSEVBREVSOgotZXZlbnQuaAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byB6ZXJvIGluIG9uIGJldHRlciBqb3lzdGljayBjYWxpYnJhdGlvbiBmYWN0b3JzLAotd2hpY2ggbWF5IHdvcmsgYmV0dGVyIHRoYW4gdGhlIGRlZmF1bHQgc2ltcGxpc3RpYyBjYWxpYnJhdGlvbiAod2hpY2ggYXNzdW1lcwotdGhlIGpveXN0aWNrIGlzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgaXMgaW5pdGlhbGlzZWQpLgotVG8gdXNlIHRoaXMgZnVuY3Rpb24sIGFzayB0aGUgdXNlciB0byBob2xkIHRoZSBzdGljayBpbiB0aGUgY2VudGVyCi1wb3NpdGlvbiBhbmQgdGhlbiBoYXZlIHRoZW0gcHJlc3MgYSBrZXkgb3IgYnV0dG9uLiBhbmQgdGhlbiBjYWxsIHRoaXMKLWZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGhlbiByZWFkIHRoZSBqb3lzdGljayBhbmQgdXBkYXRlIHRoZQotY2FsaWJyYXRpb24gZmFjdG9ycy4KLQotVXN1YWxseSwgYXNzdW1pbmcgdGhhdCB0aGUgc3RpY2sgd2FzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgd2FzCi1pbml0aWFsaXplZCwgeW91IHJlYWxseSBvbmx5IG5lZWQgdG8gY2FsbCBFVlRfam95U2V0TG93ZXJSaWdodCBzaW5jZSB0aGUKLXVwcGVyIGxlZnQgcG9zaXRpb24gaXMgdXN1YWxseSBhbHdheXMgMCwwIG9uIG1vc3Qgam95c3RpY2tzLiBIb3dldmVyLCB0aGUKLXNhZmVzdCBwcm9jZWR1cmUgaXMgdG8gY2FsbCBhbGwgdGhyZWUgY2FsaWJyYXRpb24gZnVuY3Rpb25zLgotCi1TRUUgQUxTTzoKLUVWVF9qb3lTZXRVcHBlckxlZnQsIEVWVF9qb3lTZXRMb3dlclJpZ2h0LCBFVlRfam95U2V0Q2VudGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2pveVNldENlbnRlcih2b2lkKQotewotICAgIF9FVlRfcmVhZEpveUF4aXMoRVZUX0pPWV9BWElTX0FMTCxFVlQuam95Q2VudGVyKTsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVB1bXBzIGFsbCBtZXNzYWdlcyBpbiB0aGUgbWVzc2FnZSBxdWV1ZSBmcm9tIExpbnV4IGludG8gb3VyIGV2ZW50IHF1ZXVlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9FVlRfcHVtcE1lc3NhZ2VzKHZvaWQpCi17Ci0gICAgZXZlbnRfdCAgICAgICAgICAgICAgICAgZXZ0OwotICAgIGludCAgICAgICAgICAgICAgICAgICAgIGksbnVta2V5cywgYzsKLSAgICBpYm9vbCAgICAgICAgICAgICAgICAgICByZWxlYXNlOwotICAgIHN0YXRpYyBzdHJ1Y3Qga2JlbnRyeSAgIGtlOwotICAgIHN0YXRpYyBjaGFyICAgICAgICAgICAgIGJ1ZltLQkRSRUFEQlVGRkVSU0laRV07Ci0gICAgc3RhdGljIHVzaG9ydCAgICAgICAgICAgcmVwZWF0S2V5WzEyOF0gPSB7MH07Ci0KLSAgICAvKiBQb2xsIGtleWJvYXJkIGV2ZW50cyAqLwotICAgIHdoaWxlIChkYXRhUmVhZHkoX1BNX2NvbnNvbGVfZmQpICYmIChudW1rZXlzID0gcmVhZChfUE1fY29uc29sZV9mZCwgYnVmLCBLQkRSRUFEQlVGRkVSU0laRSkpID4gMCkgewotCWZvciAoaSA9IDA7IGkgPCBudW1rZXlzOyBpKyspIHsKLQkgICAgYyA9IGJ1ZltpXTsKLQkgICAgcmVsZWFzZSA9IGMgJiAweDgwOwotCSAgICBjICY9IDB4N0Y7Ci0KLQkgICAgLyogVE9ETzogICAgVGhpcyBpcyB3cm9uZyEgV2UgbmVlZCB0aGlzIHRvIGJlIHRoZSB0aW1lIHN0YW1wIGF0ICovCi0JICAgIC8qICAgICAgICAgICoqIGludGVycnVwdCAqKiB0aW1lISEgT25lIHNvbHV0aW9uIHdvdWxkIGJlIHRvICovCi0JICAgIC8qICAgICAgICAgIHB1dCB0aGUga2V5Ym9hcmQgYW5kIG1vdXNlIHBvbGxpbmcgbG9vcHMgaW50byAqLwotCSAgICAvKiAgICAgICAgICBhIHNlcGFyYXRlIHRocmVhZCB0aGF0IGNhbiBibG9jayBvbiBJL08gdG8gdGhlICovCi0JICAgIC8qICAgICAgICAgIG5lY2Vzc2F5IGZpbGUgZGVzY3JpcHRvci4gKi8KLQkgICAgZXZ0LndoZW4gPSBfRVZUX2dldFRpY2tzKCk7Ci0KLQkgICAgaWYgKHJlbGVhc2UpIHsKLQkJLyogS2V5IHJlbGVhc2VkICovCi0JCWV2dC53aGF0ID0gRVZUX0tFWVVQOwotCQlzd2l0Y2ggKGMpIHsKLQkJICAgIGNhc2UgS0JfbGVmdFNoaWZ0OgotCQkJX1BNX21vZGlmaWVycyAmPSB+RVZUX0xFRlRTSElGVDsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSBLQl9yaWdodFNoaWZ0OgotCQkJX1BNX21vZGlmaWVycyAmPSB+RVZUX1JJR0hUU0hJRlQ7Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgMjk6Ci0JCQlfUE1fbW9kaWZpZXJzICY9IH4oRVZUX0xFRlRDVFJMfEVWVF9DVFJMU1RBVEUpOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIDk3OiAgICAgICAgICAgIC8qIENvbnRyb2wgKi8KLQkJCV9QTV9tb2RpZmllcnMgJj0gfkVWVF9DVFJMU1RBVEU7Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgNTY6Ci0JCQlfUE1fbW9kaWZpZXJzICY9IH4oRVZUX0xFRlRBTFR8RVZUX0FMVFNUQVRFKTsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSAxMDA6Ci0JCQlfUE1fbW9kaWZpZXJzICY9IH5FVlRfQUxUU1RBVEU7Ci0JCQlicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICB9Ci0JCWV2dC5tb2RpZmllcnMgPSBfUE1fbW9kaWZpZXJzOwotCQlldnQubWVzc2FnZSA9IGtleVVwTXNnW2NdOwotCQlpZiAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkKLQkJICAgIGFkZEV2ZW50KCZldnQpOwotCQlrZXlVcE1zZ1tjXSA9IDA7Ci0JCXJlcGVhdEtleVtjXSA9IDA7Ci0JCX0KLQkgICAgZWxzZSB7Ci0JCS8qIEtleSBwcmVzc2VkICovCi0JCWV2dC53aGF0ID0gRVZUX0tFWURPV047Ci0JCXN3aXRjaCAoYykgewotCQkgICAgY2FzZSBLQl9sZWZ0U2hpZnQ6Ci0JCQlfUE1fbW9kaWZpZXJzIHw9IEVWVF9MRUZUU0hJRlQ7Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgS0JfcmlnaHRTaGlmdDoKLQkJCV9QTV9tb2RpZmllcnMgfD0gRVZUX1JJR0hUU0hJRlQ7Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgMjk6Ci0JCQlfUE1fbW9kaWZpZXJzIHw9IEVWVF9MRUZUQ1RSTHxFVlRfQ1RSTFNUQVRFOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIDk3OiAgICAgICAgICAgIC8qIENvbnRyb2wgKi8KLQkJCV9QTV9tb2RpZmllcnMgfD0gRVZUX0NUUkxTVEFURTsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSA1NjoKLQkJCV9QTV9tb2RpZmllcnMgfD0gRVZUX0xFRlRBTFR8RVZUX0FMVFNUQVRFOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIDEwMDoKLQkJCV9QTV9tb2RpZmllcnMgfD0gRVZUX0FMVFNUQVRFOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIEtCX2NhcHNMb2NrOiAgIC8qIENhcHMgTG9jayAqLwotCQkJX1BNX2xlZHMgXj0gTEVEX0NBUDsKLQkJCWlvY3RsKF9QTV9jb25zb2xlX2ZkLCBLRFNFVExFRCwgX1BNX2xlZHMpOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIEtCX251bUxvY2s6ICAgIC8qIE51bSBMb2NrICovCi0JCQlfUE1fbGVkcyBePSBMRURfTlVNOwotCQkJaW9jdGwoX1BNX2NvbnNvbGVfZmQsIEtEU0VUTEVELCBfUE1fbGVkcyk7Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgS0Jfc2Nyb2xsTG9jazogLyogU2Nyb2xsIExvY2sgKi8KLQkJCV9QTV9sZWRzIF49IExFRF9TQ1I7Ci0JCQlpb2N0bChfUE1fY29uc29sZV9mZCwgS0RTRVRMRUQsIF9QTV9sZWRzKTsKLQkJCWJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgIH0KLQkJZXZ0Lm1vZGlmaWVycyA9IF9QTV9tb2RpZmllcnM7Ci0JCWlmIChrZXlVcE1zZ1tjXSkgewotCQkgICAgZXZ0LndoYXQgPSBFVlRfS0VZUkVQRUFUOwotCQkgICAgZXZ0Lm1lc3NhZ2UgPSBrZXlVcE1zZ1tjXSB8IChyZXBlYXRLZXlbY10rKyA8PCAxNik7Ci0JCSAgICB9Ci0JCWVsc2UgewotCQkgICAgaW50IGFzYzsKLQotCQkgICAgZXZ0Lm1lc3NhZ2UgPSBnZXRLZXlNYXBwaW5nKGtleW1hcHMsIE5CX0tFWU1BUFMsIGMpIDw8IDg7Ci0JCSAgICBrZS5rYl9pbmRleCA9IGM7Ci0JCSAgICBrZS5rYl90YWJsZSA9IDA7Ci0JCSAgICBpZiAoKF9QTV9tb2RpZmllcnMgJiBFVlRfU0hJRlRLRVkpIHx8IChfUE1fbGVkcyAmIExFRF9DQVApKQotCQkJa2Uua2JfdGFibGUgfD0gS19TSElGVFRBQjsKLQkJICAgIGlmIChfUE1fbW9kaWZpZXJzICYgKEVWVF9MRUZUQUxUIHwgRVZUX0FMVFNUQVRFKSkKLQkJCWtlLmtiX3RhYmxlIHw9IEtfQUxUVEFCOwotCQkgICAgaWYgKGlvY3RsKF9QTV9jb25zb2xlX2ZkLCBLREdLQkVOVCwgKHVuc2lnbmVkIGxvbmcpJmtlKTwwKQotCQkJcGVycm9yKCJpb2N0bChLREdLQkVOVCkiKTsKLQkJICAgIGlmICgoX1BNX2xlZHMgJiBMRURfTlVNKSAmJiAoZ2V0S2V5TWFwcGluZyhrZXlwYWQsIE5CX0tFWVBBRCwgYykhPWMpKSB7Ci0JCQlhc2MgPSBnZXRLZXlNYXBwaW5nKGtleXBhZCwgTkJfS0VZUEFELCBjKTsKLQkJCX0KLQkJICAgIGVsc2UgewotCQkJc3dpdGNoIChjKSB7Ci0JCQkgICAgY2FzZSAxNDoKLQkJCQlhc2MgPSBBU0NJSV9iYWNrc3BhY2U7Ci0JCQkJYnJlYWs7Ci0JCQkgICAgY2FzZSAxNToKLQkJCQlhc2MgPSBBU0NJSV90YWI7Ci0JCQkJYnJlYWs7Ci0JCQkgICAgY2FzZSAyODoKLQkJCSAgICBjYXNlIDk2OgotCQkJCWFzYyA9IEFTQ0lJX2VudGVyOwotCQkJCWJyZWFrOwotCQkJICAgIGNhc2UgMToKLQkJCQlhc2MgPSBBU0NJSV9lc2M7Ci0JCQkgICAgZGVmYXVsdDoKLQkJCQlhc2MgPSBrZS5rYl92YWx1ZSAmIDB4RkY7Ci0JCQkJaWYgKGFzYyA8IDB4MUIpCi0JCQkJICAgIGFzYyA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgaWYgKChfUE1fbW9kaWZpZXJzICYgKEVWVF9DVFJMU1RBVEV8RVZUX0xFRlRDVFJMKSkgJiYgaXNhbHBoYShhc2MpKQotCQkJZXZ0Lm1lc3NhZ2UgfD0gdG91cHBlcihhc2MpIC0gJ0EnICsgMTsKLQkJICAgIGVsc2UKLQkJCWV2dC5tZXNzYWdlIHw9IGFzYzsKLQkJICAgIGtleVVwTXNnW2NdID0gZXZ0Lm1lc3NhZ2U7Ci0JCSAgICByZXBlYXRLZXlbY10rKzsKLQkJICAgIH0KLQkJaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpCi0JCSAgICBhZGRFdmVudCgmZXZ0KTsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgLyogUG9sbCBtb3VzZSBldmVudHMgKi8KLSAgICBpZiAoX0VWVF9tb3VzZV9mZCkgewotCWludCAgICAgICAgIGR4LCBkeSwgYnV0czsKLQlzdGF0aWMgaW50ICBvbGRidXRzOwotCi0Jd2hpbGUgKGRhdGFSZWFkeShfRVZUX21vdXNlX2ZkKSkgewotCSAgICBpZiAocmVhZE1vdXNlRGF0YSgmYnV0cywgJmR4LCAmZHkpKSB7Ci0JCUVWVC5teCArPSBkeDsKLQkJRVZULm15ICs9IGR5OwotCQlpZiAoRVZULm14IDwgMCkgRVZULm14ID0gMDsKLQkJaWYgKEVWVC5teSA8IDApIEVWVC5teSA9IDA7Ci0JCWlmIChFVlQubXggPiByYW5nZV94KSBFVlQubXggPSByYW5nZV94OwotCQlpZiAoRVZULm15ID4gcmFuZ2VfeSkgRVZULm15ID0gcmFuZ2VfeTsKLQkJZXZ0LndoZXJlX3ggPSBFVlQubXg7Ci0JCWV2dC53aGVyZV95ID0gRVZULm15OwotCQlldnQucmVsYXRpdmVfeCA9IGR4OwotCQlldnQucmVsYXRpdmVfeSA9IGR5OwotCi0JCS8qIFRPRE86ICAgIFRoaXMgaXMgd3JvbmchIFdlIG5lZWQgdGhpcyB0byBiZSB0aGUgdGltZSBzdGFtcCBhdCAqLwotCQkvKiAgICAgICAgICAqKiBpbnRlcnJ1cHQgKiogdGltZSEhIE9uZSBzb2x1dGlvbiB3b3VsZCBiZSB0byAqLwotCQkvKiAgICAgICAgICBwdXQgdGhlIGtleWJvYXJkIGFuZCBtb3VzZSBwb2xsaW5nIGxvb3BzIGludG8gKi8KLQkJLyogICAgICAgICAgYSBzZXBhcmF0ZSB0aHJlYWQgdGhhdCBjYW4gYmxvY2sgb24gSS9PIHRvIHRoZSAqLwotCQkvKiAgICAgICAgICBuZWNlc3NheSBmaWxlIGRlc2NyaXB0b3IuICovCi0JCWV2dC53aGVuID0gX0VWVF9nZXRUaWNrcygpOwotCQlldnQubW9kaWZpZXJzID0gX1BNX21vZGlmaWVyczsKLQkJaWYgKGJ1dHMgJiA0KQotCQkgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfTEVGVEJVVDsKLQkJaWYgKGJ1dHMgJiAxKQotCQkgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfUklHSFRCVVQ7Ci0JCWlmIChidXRzICYgMikKLQkJICAgIGV2dC5tb2RpZmllcnMgfD0gRVZUX01JRERMRUJVVDsKLQotCQkvKiBMZWZ0IGNsaWNrIGV2ZW50cyAqLwotCQlpZiAoKGJ1dHMmNCkgIT0gKG9sZGJ1dHMmNCkpIHsKLQkJICAgIGlmIChidXRzJjQpCi0JCQlldnQud2hhdCA9IEVWVF9NT1VTRURPV047Ci0JCSAgICBlbHNlCi0JCQlldnQud2hhdCA9IEVWVF9NT1VTRVVQOwotCQkgICAgZXZ0Lm1lc3NhZ2UgPSBFVlRfTEVGVEJNQVNLOwotCQkgICAgRVZULm9sZE1vdmUgPSAtMTsKLQkJICAgIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKQotCQkJYWRkRXZlbnQoJmV2dCk7Ci0JCSAgICB9Ci0KLQkJLyogUmlnaHQgY2xpY2sgZXZlbnRzICovCi0JCWlmICgoYnV0cyYxKSAhPSAob2xkYnV0cyYxKSkgewotCQkgICAgaWYgKGJ1dHMmMSkKLQkJCWV2dC53aGF0ID0gRVZUX01PVVNFRE9XTjsKLQkJICAgIGVsc2UKLQkJCWV2dC53aGF0ID0gRVZUX01PVVNFVVA7Ci0JCSAgICBldnQubWVzc2FnZSA9IEVWVF9SSUdIVEJNQVNLOwotCQkgICAgRVZULm9sZE1vdmUgPSAtMTsKLQkJICAgIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKQotCQkJYWRkRXZlbnQoJmV2dCk7Ci0JCSAgICB9Ci0KLQkJLyogTWlkZGxlIGNsaWNrIGV2ZW50cyAqLwotCQlpZiAoKGJ1dHMmMikgIT0gKG9sZGJ1dHMmMikpIHsKLQkJICAgIGlmIChidXRzJjIpCi0JCQlldnQud2hhdCA9IEVWVF9NT1VTRURPV047Ci0JCSAgICBlbHNlCi0JCQlldnQud2hhdCA9IEVWVF9NT1VTRVVQOwotCQkgICAgZXZ0Lm1lc3NhZ2UgPSBFVlRfTUlERExFQk1BU0s7Ci0JCSAgICBFVlQub2xkTW92ZSA9IC0xOwotCQkgICAgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpCi0JCQlhZGRFdmVudCgmZXZ0KTsKLQkJICAgIH0KLQotCQkvKiBNb3VzZSBtb3ZlbWVudCBldmVudCAqLwotCQlpZiAoZHggfHwgZHkpIHsKLQkJICAgIGV2dC53aGF0ID0gRVZUX01PVVNFTU9WRTsKLQkJICAgIGV2dC5tZXNzYWdlID0gMDsKLQkJICAgIGlmIChFVlQub2xkTW92ZSAhPSAtMSkgewotCQkJLyogTW9kaWZ5IGV4aXN0aW5nIG1vdmVtZW50IGV2ZW50ICovCi0JCQlFVlQuZXZ0cVtFVlQub2xkTW92ZV0ud2hlcmVfeCA9IGV2dC53aGVyZV94OwotCQkJRVZULmV2dHFbRVZULm9sZE1vdmVdLndoZXJlX3kgPSBldnQud2hlcmVfeTsKLQkJCX0KLQkJICAgIGVsc2UgewotCQkJLyogU2F2ZSBpZCBvZiB0aGlzIG1vdmVtZW50IGV2ZW50ICovCi0JCQlFVlQub2xkTW92ZSA9IEVWVC5mcmVlSGVhZDsKLQkJCWlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKQotCQkJICAgIGFkZEV2ZW50KCZldnQpOwotCQkJfQotCQkgICAgfQotCQlvbGRidXRzID0gYnV0czsKLQkJfQotCSAgICB9Ci0JfQotCi0jaWZkZWYgVVNFX09TX0pPWVNUSUNLCi0gICAgLyogUG9sbCBqb3lzdGljayBldmVudHMgdXNpbmcgdGhlIDEueCBqb3lzdGljayBkcml2ZXIgQVBJIGluIHRoZSAyLjIga2VybmVscyAqLwotICAgIGlmIChqc192ZXJzaW9uICYgfjB4ZmZmZikgewotCXN0YXRpYyBzdHJ1Y3QganNfZXZlbnQgIGpzOwotCi0JLyogUmVhZCBqb3lzdGljayBheGlzIDAgKi8KLQlldnQud2hlbiA9IDA7Ci0JZXZ0Lm1vZGlmaWVycyA9IF9QTV9tb2RpZmllcnM7Ci0JaWYgKGpveXN0aWNrMF9mZCAmJiBkYXRhUmVhZHkoam95c3RpY2swX2ZkKSAmJgotCQlyZWFkKGpveXN0aWNrMF9mZCwgJmpzLCBzaXplb2YoanMpKSA9PSBzaXplb2YoanMpKSB7Ci0JICAgIGlmIChqcy50eXBlICYgSlNfRVZFTlRfQlVUVE9OKSB7Ci0JCWlmIChqcy5udW1iZXIgPCAyKSB7IC8qIE9ubHkgMiBidXR0b25zIGZvciBub3cgOiggKi8KLQkJICAgIGJ1dHMwW2pzLm51bWJlcl0gPSBqcy52YWx1ZTsKLQkJICAgIGV2dC53aGF0ID0gRVZUX0pPWUNMSUNLOwotCQkgICAgbWFrZUpveUV2ZW50KCZldnQpOwotCQkgICAgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpCi0JCQlhZGRFdmVudCgmZXZ0KTsKLQkJICAgIH0KLQkJfQotCSAgICBlbHNlIGlmIChqcy50eXBlICYgSlNfRVZFTlRfQVhJUykgewotCQlheGlzMFtqcy5udW1iZXJdID0gc2NhbGVKb3lBeGlzKGpzLnZhbHVlLGpzLm51bWJlcik7Ci0JCWV2dC53aGF0ID0gRVZUX0pPWU1PVkU7Ci0JCWlmIChFVlQub2xkSm95TW92ZSAhPSAtMSkgewotCQkgICAgbWFrZUpveUV2ZW50KCZFVlQuZXZ0cVtFVlQub2xkSm95TW92ZV0pOwotCQkgICAgfQotCQllbHNlIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKSB7Ci0JCSAgICBFVlQub2xkSm95TW92ZSA9IEVWVC5mcmVlSGVhZDsKLQkJICAgIG1ha2VKb3lFdmVudCgmZXZ0KTsKLQkJICAgIGFkZEV2ZW50KCZldnQpOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCS8qIFJlYWQgam95c3RpY2sgYXhpcyAxICovCi0JaWYgKGpveXN0aWNrMV9mZCAmJiBkYXRhUmVhZHkoam95c3RpY2sxX2ZkKSAmJgotCQlyZWFkKGpveXN0aWNrMV9mZCwgJmpzLCBzaXplb2YoanMpKT09c2l6ZW9mKGpzKSkgewotCSAgICBpZiAoanMudHlwZSAmIEpTX0VWRU5UX0JVVFRPTikgewotCQlpZiAoanMubnVtYmVyIDwgMikgeyAvKiBPbmx5IDIgYnV0dG9ucyBmb3Igbm93IDooICovCi0JCSAgICBidXRzMVtqcy5udW1iZXJdID0ganMudmFsdWU7Ci0JCSAgICBldnQud2hhdCA9IEVWVF9KT1lDTElDSzsKLQkJICAgIG1ha2VKb3lFdmVudCgmZXZ0KTsKLQkJICAgIGlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKQotCQkJYWRkRXZlbnQoJmV2dCk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgZWxzZSBpZiAoanMudHlwZSAmIEpTX0VWRU5UX0FYSVMpIHsKLQkJYXhpczFbanMubnVtYmVyXSA9IHNjYWxlSm95QXhpcyhqcy52YWx1ZSxqcy5udW1iZXI8PDIpOwotCQlldnQud2hhdCA9IEVWVF9KT1lNT1ZFOwotCQlpZiAoRVZULm9sZEpveU1vdmUgIT0gLTEpIHsKLQkJICAgIG1ha2VKb3lFdmVudCgmRVZULmV2dHFbRVZULm9sZEpveU1vdmVdKTsKLQkJICAgIH0KLQkJZWxzZSBpZiAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkgewotCQkgICAgRVZULm9sZEpveU1vdmUgPSBFVlQuZnJlZUhlYWQ7Ci0JCSAgICBtYWtlSm95RXZlbnQoJmV2dCk7Ci0JCSAgICBhZGRFdmVudCgmZXZ0KTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBtYWNyby9mdW5jdGlvbiBpcyB1c2VkIHRvIGNvbnZlcnRzIHRoZSBzY2FuIGNvZGVzIHJlcG9ydGVkIGJ5IHRoZQota2V5Ym9hcmQgdG8gb3VyIGV2ZW50IGxpYnJhcmllcyBub3JtYWxpc2VkIGZvcm1hdC4gV2Ugb25seSBoYXZlIG9uZSBzY2FuCi1jb2RlIGZvciB0aGUgJ0EnIGtleSwgYW5kIHVzZSBzaGlmdCBfUE1fbW9kaWZpZXJzIHRvIGRldGVybWluZSBpZiBpdCBpcyBhCi1DdHJsLUYxLCBBbHQtRjEgZXRjLiBUaGUgcmF3IHNjYW4gY29kZXMgZnJvbSB0aGUga2V5Ym9hcmQgd29yayB0aGlzIHdheSwKLWJ1dCB0aGUgT1MgZ2l2ZXMgdXMgJ2Nvb2tlZCcgc2NhbiBjb2Rlcywgd2UgaGF2ZSB0byB0cmFuc2xhdGUgdGhlbSBiYWNrCi10byB0aGUgcmF3IGZvcm1hdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9FVlRfbWFza0tleUNvZGUoZXZ0KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNldCB0aGUgc3BlZWQgb2YgdGhlIHNlcmlhbCBwb3J0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBzZXRzcGVlZCgKLSAgICBpbnQgZmQsCi0gICAgaW50IG9sZCwKLSAgICBpbnQgbmV3LAotICAgIHVuc2lnbmVkIHNob3J0IGZsYWdzKQotewotICAgIHN0cnVjdCB0ZXJtaW9zIHR0eTsKLSAgICBjaGFyICpjOwotCi0gICAgdGNnZXRhdHRyKGZkLCAmdHR5KTsKLSAgICB0dHkuY19pZmxhZyA9IElHTkJSSyB8IElHTlBBUjsKLSAgICB0dHkuY19vZmxhZyA9IDA7Ci0gICAgdHR5LmNfbGZsYWcgPSAwOwotICAgIHR0eS5jX2xpbmUgPSAwOwotICAgIHR0eS5jX2NjW1ZUSU1FXSA9IDA7Ci0gICAgdHR5LmNfY2NbVk1JTl0gPSAxOwotICAgIHN3aXRjaCAob2xkKSB7Ci0JY2FzZSA5NjAwOiAgdHR5LmNfY2ZsYWcgPSBmbGFncyB8IEI5NjAwOyBicmVhazsKLQljYXNlIDQ4MDA6ICB0dHkuY19jZmxhZyA9IGZsYWdzIHwgQjQ4MDA7IGJyZWFrOwotCWNhc2UgMjQwMDogIHR0eS5jX2NmbGFnID0gZmxhZ3MgfCBCMjQwMDsgYnJlYWs7Ci0JY2FzZSAxMjAwOgotCWRlZmF1bHQ6ICAgIHR0eS5jX2NmbGFnID0gZmxhZ3MgfCBCMTIwMDsgYnJlYWs7Ci0JfQotICAgIHRjc2V0YXR0cihmZCwgVENTQUZMVVNILCAmdHR5KTsKLSAgICBzd2l0Y2ggKG5ldykgewotCWNhc2UgOTYwMDogIGMgPSAiKnEiOyAgdHR5LmNfY2ZsYWcgPSBmbGFncyB8IEI5NjAwOyBicmVhazsKLQljYXNlIDQ4MDA6ICBjID0gIipwIjsgIHR0eS5jX2NmbGFnID0gZmxhZ3MgfCBCNDgwMDsgYnJlYWs7Ci0JY2FzZSAyNDAwOiAgYyA9ICIqbyI7ICB0dHkuY19jZmxhZyA9IGZsYWdzIHwgQjI0MDA7IGJyZWFrOwotCWNhc2UgMTIwMDoKLQlkZWZhdWx0OiAgICBjID0gIipuIjsgIHR0eS5jX2NmbGFnID0gZmxhZ3MgfCBCMTIwMDsgYnJlYWs7Ci0JfQotICAgIHdyaXRlKGZkLCBjLCAyKTsKLSAgICB1c2xlZXAoMTAwMDAwKTsKLSAgICB0Y3NldGF0dHIoZmQsIFRDU0FGTFVTSCwgJnR0eSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotR2VuZXJpYyBtb3VzZSBkcml2ZXIgaW5pdCBjb2RlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX0VWVF9tb3VzZV9pbml0KHZvaWQpCi17Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBDaGFuZ2UgZnJvbSBhbnkgYXZhaWxhYmxlIHNwZWVkIHRvIHRoZSBjaG9zZW4gb25lICovCi0gICAgZm9yIChpID0gOTYwMDsgaSA+PSAxMjAwOyBpIC89IDIpCi0Jc2V0c3BlZWQoX0VWVF9tb3VzZV9mZCwgaSwgb3B0X2JhdWQsIG1vdXNlX2luZm9zW21vdXNlX2RyaXZlcl0uZmxhZ3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUxvZ2l0ZWNoIG1vdXNlIGRyaXZlciBpbml0IGNvZGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfRVZUX2xvZ2l0ZWNoX2luaXQodm9pZCkKLXsKLSAgICBpbnQgICAgICAgICBpOwotICAgIHN0cnVjdCBzdGF0IGJ1ZjsKLSAgICBpbnQgICAgICAgICBidXNtb3VzZTsKLQotICAgIC8qIGlzIHRoaXMgYSBzZXJpYWwtIG9yIGEgYnVzLSBtb3VzZT8gKi8KLSAgICBpZiAoZnN0YXQoX0VWVF9tb3VzZV9mZCwmYnVmKSA9PSAtMSkKLQlwZXJyb3IoImZzdGF0Iik7Ci0gICAgaSA9IE1BSk9SKGJ1Zi5zdF9yZGV2KTsKLSAgICBpZiAoc3RhdCgiL2Rldi90dHlTMCIsJmJ1ZikgPT0gLTEpCi0JcGVycm9yKCJzdGF0Iik7Ci0gICAgYnVzbW91c2U9KGkgIT0gTUFKT1IoYnVmLnN0X3JkZXYpKTsKLQotICAgIC8qIEZpeCB0aGUgaG93bWFueSBmaWVsZCwgc28gdGhhdCBzZXJpYWwgbWljZSBoYXZlIDEsIHdoaWxlIGJ1c21pY2UgaGF2ZSAzICovCi0gICAgbW91c2VfaW5mb3NbbW91c2VfZHJpdmVyXS5yZWFkID0gYnVzbW91c2UgPyAzIDogMTsKLQotICAgIC8qIENoYW5nZSBmcm9tIGFueSBhdmFpbGFibGUgc3BlZWQgdG8gdGhlIGNob3NlbiBvbmUgKi8KLSAgICBmb3IgKGkgPSA5NjAwOyBpID49IDEyMDA7IGkgLz0gMikKLQlzZXRzcGVlZChfRVZUX21vdXNlX2ZkLCBpLCBvcHRfYmF1ZCwgbW91c2VfaW5mb3NbbW91c2VfZHJpdmVyXS5mbGFncyk7Ci0KLSAgICAvKiBUaGlzIHN0dWZmIGlzIHBlY3VsaWFyIG9mIGxvZ2l0ZWNoIG1pY2UsIGFsc28gZm9yIHRoZSBzZXJpYWwgb25lcyAqLwotICAgIHdyaXRlKF9FVlRfbW91c2VfZmQsICJTIiwgMSk7Ci0gICAgc2V0c3BlZWQoX0VWVF9tb3VzZV9mZCwgb3B0X2JhdWQsIG9wdF9iYXVkLENTOCB8UEFSRU5CIHxQQVJPREQgfENSRUFEIHxDTE9DQUwgfEhVUENMKTsKLQotICAgIC8qIENvbmZpZ3VyZSB0aGUgc2FtcGxlIHJhdGUgKi8KLSAgICBmb3IgKGkgPSAwOyBvcHRfc2FtcGxlIDw9IHNhbXBsZXRhYltpXS5zYW1wbGU7IGkrKykKLQk7Ci0gICAgd3JpdGUoX0VWVF9tb3VzZV9mZCxzYW1wbGV0YWJbaV0uY29kZSwxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1NaWNyb3NvZnQgSW50ZWxsaW1vdXNlIGluaXQgY29kZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9FVlRfcG5wbW91c2VfaW5pdCh2b2lkKQotewotICAgIHN0cnVjdCB0ZXJtaW9zIHR0eTsKLQotICAgIHRjZ2V0YXR0cihfRVZUX21vdXNlX2ZkLCAmdHR5KTsKLSAgICB0dHkuY19pZmxhZyA9IElHTkJSSyB8IElHTlBBUjsKLSAgICB0dHkuY19vZmxhZyA9IDA7Ci0gICAgdHR5LmNfbGZsYWcgPSAwOwotICAgIHR0eS5jX2xpbmUgPSAwOwotICAgIHR0eS5jX2NjW1ZUSU1FXSA9IDA7Ci0gICAgdHR5LmNfY2NbVk1JTl0gPSAxOwotICAgIHR0eS5jX2NmbGFnID0gbW91c2VfaW5mb3NbbW91c2VfZHJpdmVyXS5mbGFncyB8IEIxMjAwOwotICAgIHRjc2V0YXR0cihfRVZUX21vdXNlX2ZkLCBUQ1NBRkxVU0gsICZ0dHkpOyAvKiBzZXQgcGFyYW1ldGVycyAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW1vdXNlTW92ZSAgIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuZXZlIHRoZSBtb3VzZSBuZWVkcyB0byBiZSBtb3ZlZAotCi1SRU1BUktTOgotSW5pdGlsaWFzZSB0aGUgZXZlbnQgaGFuZGxpbmcgbW9kdWxlLiBIZXJlIHdlIGluc3RhbGwgb3VyIG1vdXNlIGhhbmRsaW5nIElTUgotdG8gYmUgY2FsbGVkIHdoZW5ldmVyIGFueSBidXR0b24ncyBhcmUgcHJlc3NlZCBvciByZWxlYXNlZC4gV2UgYWxzbyBidWlsZAotdGhlIGZyZWUgbGlzdCBvZiBldmVudHMgaW4gdGhlIGV2ZW50IHF1ZXVlLgotCi1XZSB1c2UgaGFuZGxlciBudW1iZXIgMiBvZiB0aGUgbW91c2UgbGlicmFyaWVzIGludGVycnVwdCBoYW5kbGVycyBmb3Igb3VyCi1ldmVudCBoYW5kbGluZyByb3V0aW5lcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfaW5pdCgKLSAgICBfRVZUX21vdXNlTW92ZUhhbmRsZXIgbW91c2VNb3ZlKQotewotICAgIGludCAgICAgICAgIGk7Ci0gICAgY2hhciAgICAgICAgKnRtcDsKLQotICAgIC8qIEluaXRpYWxpc2UgdGhlIGV2ZW50IHF1ZXVlICovCi0gICAgRVZULm1vdXNlTW92ZSA9IG1vdXNlTW92ZTsKLSAgICBpbml0RXZlbnRRdWV1ZSgpOwotICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLQlrZXlVcE1zZ1tpXSA9IDA7Ci0KLSAgICAvKiBLZXlib2FyZCBpbml0aWFsaXphdGlvbiAqLwotICAgIGlmIChfUE1fY29uc29sZV9mZCA9PSAtMSkKLQlQTV9mYXRhbEVycm9yKCJZb3UgbXVzdCBmaXJzdCBjYWxsIFBNX29wZW5Db25zb2xlIHRvIHVzZSB0aGUgRVZUIGZ1bmN0aW9ucyEiKTsKLSAgICBfUE1fa2V5Ym9hcmRfcmF3bW9kZSgpOwotICAgIGZjbnRsKF9QTV9jb25zb2xlX2ZkLEZfU0VURkwsZmNudGwoX1BNX2NvbnNvbGVfZmQsRl9HRVRGTCkgfCBPX05PTkJMT0NLKTsKLQotICAgIC8qIE1vdXNlIGluaXRpYWxpemF0aW9uICovCi0gICAgaWYgKCh0bXAgPSBnZXRlbnYoRU5WX01PVVNFRFJWKSkgIT0gTlVMTCkgewotCWZvciAoaSA9IDA7IGkgPCBOQl9NSUNFOyBpKyspIHsKLQkgICAgaWYgKCFzdHJjYXNlY21wKHRtcCwgbW91c2VfaW5mb3NbaV0ubmFtZSkpIHsKLQkJbW91c2VfZHJpdmVyID0gaTsKLQkJYnJlYWs7Ci0JCX0KLQkgICAgfQotCWlmIChpID09IE5CX01JQ0UpIHsKLQkgICAgZnByaW50ZihzdGRlcnIsIlVua25vd24gbW91c2UgZHJpdmVyOiAlc1xuIiwgdG1wKTsKLQkgICAgbW91c2VfZHJpdmVyID0gRVZUX25vTW91c2U7Ci0JICAgIF9FVlRfbW91c2VfZmQgPSAwOwotCSAgICB9Ci0JfQotICAgIGlmIChtb3VzZV9kcml2ZXIgIT0gRVZUX25vTW91c2UpIHsKLQlpZiAobW91c2VfZHJpdmVyID09IEVWVF9ncG0pCi0JICAgIHN0cmNweShtb3VzZV9kZXYsIi9kZXYvZ3BtZGF0YSIpOwotCWlmICgodG1wID0gZ2V0ZW52KEVOVl9NT1VTRURFVikpICE9IE5VTEwpCi0JICAgIHN0cmNweShtb3VzZV9kZXYsdG1wKTsKLSNpZmRlZiAgQ0hFQ0tFRAotCWZwcmludGYoc3RkZXJyLCJVc2luZyB0aGUgJXMgTUdMIG1vdXNlIGRyaXZlciBvbiAlcy5cbiIsIG1vdXNlX2luZm9zW21vdXNlX2RyaXZlcl0ubmFtZSwgbW91c2VfZGV2KTsKLSNlbmRpZgotCWlmICgoX0VWVF9tb3VzZV9mZCA9IG9wZW4obW91c2VfZGV2LCBPX1JEV1IpKSA8IDApIHsKLQkgICAgcGVycm9yKCJvcGVuIik7Ci0JICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIG9wZW4gbW91c2UgZGV2aWNlICVzLCBkcm9wcGluZyBtb3VzZSBzdXBwb3J0LlxuIiwgbW91c2VfZGV2KTsKLQkgICAgc2xlZXAoMSk7Ci0JICAgIG1vdXNlX2RyaXZlciA9IEVWVF9ub01vdXNlOwotCSAgICBfRVZUX21vdXNlX2ZkID0gMDsKLQkgICAgfQotCWVsc2UgewotCSAgICBjaGFyIGM7Ci0KLQkgICAgLyogSW5pdCBhbmQgZmx1c2ggdGhlIG1vdXNlIHBlbmRpbmcgaW5wdXQgcXVldWUgKi8KLQkgICAgaWYgKG1vdXNlX2luZm9zW21vdXNlX2RyaXZlcl0uaW5pdCkKLQkJbW91c2VfaW5mb3NbbW91c2VfZHJpdmVyXS5pbml0KCk7Ci0JICAgIHdoaWxlKGRhdGFSZWFkeShfRVZUX21vdXNlX2ZkKSAmJiByZWFkKF9FVlRfbW91c2VfZmQsICZjLCAxKSA9PSAxKQotCQk7Ci0JICAgIH0KLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1DaGFuZ2VzIHRoZSByYW5nZSBvZiBjb29yZGluYXRlcyByZXR1cm5lZCBieSB0aGUgbW91c2UgZnVuY3Rpb25zIHRvIHRoZQotc3BlY2lmaWVkIHJhbmdlIG9mIHZhbHVlcy4gVGhpcyBpcyB1c2VkIHdoZW4gY2hhbmdpbmcgYmV0d2VlbiBncmFwaGljcwotbW9kZXMgc2V0IHRoZSByYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyBmb3IgdGhlIG5ldyBkaXNwbGF5IG1vZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX3NldE1vdXNlUmFuZ2UoCi0gICAgaW50IHhSZXMsCi0gICAgaW50IHlSZXMpCi17Ci0gICAgcmFuZ2VfeCA9IHhSZXM7Ci0gICAgcmFuZ2VfeSA9IHlSZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1Nb2RpZmVzIHRoZSBtb3VzZSBjb29yZGluYXRlcyBhcyBuZWNlc3NhcnkgaWYgc2NhbGluZyB0byBPUyBjb29yZGluYXRlcywKLWFuZCBzZXRzIHRoZSBPUyBtb3VzZSBjdXJzb3IgcG9zaXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX3NldE1vdXNlUG9zKHgseSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFpbGlzZXMgdGhlIGludGVybmFsIGV2ZW50IGhhbmRsaW5nIG1vZHVsZXMuIFRoZSBFVlRfc3VzcGVuZCBmdW5jdGlvbgotY2FuIGJlIGNhbGxlZCB0byBzdXNwZW5kIGV2ZW50IGhhbmRsaW5nIChzdWNoIGFzIHdoZW4gc2hlbGxpbmcgb3V0IHRvIERPUyksCi1hbmQgdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgaXQgYWdhaW4gbGF0ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfcmVzdW1lKHZvaWQpCi17Ci0gICAgLyogRG8gbm90aGluZyBmb3IgTGludXggKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLVN1c3BlbmRzIGFsbCBvZiBvdXIgZXZlbnQgaGFuZGxpbmcgb3BlcmF0aW9ucy4gVGhpcyBpcyBhbHNvIHVzZWQgdG8KLWRlLWluc3RhbGwgdGhlIGV2ZW50IGhhbmRsaW5nIGNvZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfc3VzcGVuZCh2b2lkKQotewotICAgIC8qIERvIG5vdGhpbmcgZm9yIExpbnV4ICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1FeGl0cyB0aGUgZXZlbnQgbW9kdWxlIGZvciBwcm9ncmFtIHRlcm1pbmF0YXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfZXhpdCh2b2lkKQotewotICAgIC8qIFJlc3RvcmUgc2lnbmFsIGhhbmRsZXJzICovCi0gICAgX1BNX3Jlc3RvcmVfa2JfbW9kZSgpOwotICAgIGlmIChfRVZUX21vdXNlX2ZkKSB7Ci0JY2xvc2UoX0VWVF9tb3VzZV9mZCk7Ci0JX0VWVF9tb3VzZV9mZCA9IDA7Ci0JfQotI2lmZGVmIFVTRV9PU19KT1lTVElDSwotICAgIGlmIChqb3lzdGljazBfZmQpIHsKLQljbG9zZShqb3lzdGljazBfZmQpOwotCWZyZWUoYXhpczApOwotCWZyZWUoYnV0czApOwotCWpveXN0aWNrMF9mZCA9IDA7Ci0JfQotICAgIGlmIChqb3lzdGljazFfZmQpIHsKLQljbG9zZShqb3lzdGljazFfZmQpOwotCWZyZWUoYXhpczEpOwotCWZyZWUoYnV0czEpOwotCWpveXN0aWNrMV9mZCA9IDA7Ci0JfQotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9saW51eC9ldmVudC5zdmdhIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvZXZlbnQuc3ZnYQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAzNThhMC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9saW51eC9ldmVudC5zdmdhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgVGhlIFN1cGVyVkdBIEtpdCAtIFVuaVZCRSBTb2Z0d2FyZSBEZXZlbG9wbWVudCBLaXQKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgSUJNIFBDIChNUyBET1MpCi0qCi0qIERlc2NyaXB0aW9uOiAgUm91dGluZXMgdG8gcHJvdmlkZSBhIExpbnV4IGV2ZW50IHF1ZXVlLCB3aGljaCBhdXRvbWF0aWNhbGx5Ci0qICAgICAgICAgICAgICAgaGFuZGxlcyBrZXlib2FyZCBhbmQgbW91c2UgZXZlbnRzIGZvciB0aGUgTGludXggY29tcGF0YWJpbGl0eQotKiAgICAgICAgICAgICAgIGxpYnJhcmllcy4gQmFzZWQgb24gdGhlIGV2ZW50IGhhbmRsaW5nIGNvZGUgaW4gdGhlIE1HTC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHRlcm1pb3MuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tleWJvYXJkLmg+Ci0jaW5jbHVkZSA8bGludXgva2QuaD4KLSNpbmNsdWRlIDxsaW51eC92dC5oPgotI2luY2x1ZGUgPGdwbS5oPgotI2luY2x1ZGUgInBtLmgiCi0jaW5jbHVkZSAidmVzYXZiZS5oIgotI2luY2x1ZGUgIndkaXJlY3QuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBFVkVOVFFTSVpFICAxMDAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGV2ZW50cyBpbiBldmVudCBxdWV1ZSAgKi8KLQotc3RhdGljIGludCAgICAgIGhlYWQgPSAtMTsgICAgICAgICAgLyogSGVhZCBvZiBldmVudCBxdWV1ZSAgICAgICAgICAgICAgKi8KLXN0YXRpYyBpbnQgICAgICB0YWlsID0gLTE7ICAgICAgICAgIC8qIFRhaWwgb2YgZXZlbnQgcXVldWUgICAgICAgICAgICAgICovCi1zdGF0aWMgaW50ICAgICAgZnJlZUhlYWQgPSAtMTsgICAgICAvKiBIZWFkIG9mIGZyZWUgbGlzdCAgICAgICAgICAgICAgICAqLwotc3RhdGljIGludCAgICAgIGNvdW50ID0gMDsgICAgICAgICAgLyogTm8uIG9mIGl0ZW1zIGN1cnJlbnRseSBpbiBxdWV1ZSAgKi8KLXN0YXRpYyBXRF9ldmVudCBldnRxW0VWRU5UUVNJWkVdOyAgIC8qIFRoZSBxdWV1ZSBzdHJ1Y3R1cmUgaXRzZWxmICAgICAgKi8KLXN0YXRpYyBpbnQgICAgICBvbGRNb3ZlID0gLTE7ICAgICAgIC8qIFByZXZpb3VzIG1vdmVtZW50IGV2ZW50ICAgICAgICAgICovCi1zdGF0aWMgaW50ICAgICAgb2xkS2V5ID0gLTE7ICAgICAgICAvKiBQcmV2aW91cyBrZXkgcmVwZWF0IGV2ZW50ICAgICAgICAqLwotc3RhdGljIGludCAgICAgIG14LG15OyAgICAgICAgICAgICAgLyogQ3VycmVudCBtb3VzZSBwb3NpdGlvbiAgICAgICAgICAgKi8KLXN0YXRpYyBpbnQgICAgICB4UmVzLHlSZXM7ICAgICAgICAgIC8qIFNjcmVlbiByZXNvbHV0aW9uIGNvb3JkaW5hdGVzICAgICovCi1zdGF0aWMgdm9pZCAgICAgKnN0YXRlQnVmOyAgICAgICAgICAvKiBQb2ludGVyIHRvIGNvbnNvbGUgc3RhdGUgYnVmZmVyICAqLwotc3RhdGljIGludCAgICAgIGNvbm47ICAgICAgICAgICAgICAgLyogR1BNIGZpbGUgZGVzY3JpcHRvciBmb3IgbW91c2UgaGFuZGxpbmcgKi8KLXN0YXRpYyBpbnQgICAgICB0dHlfZmQ7ICAgICAgICAgICAgIC8qIEZpbGUgZGVzY3JpcHRvciBmb3IgL2Rldi9jb25zb2xlICovCi1leHRlcm4gaW50ICAgICAgdHR5X3ZjOyAgICAgICAgICAgICAvKiBWaXJ0dWFsIGNvbnNvbGUgSUQsIGZyb20gdGhlIFBNL1BybyBsaWJyYXJ5ICovCi1zdGF0aWMgaWJvb2wgICAga2V5X2Rvd25bMTI4XTsgICAgICAvKiBTdGF0ZSBvZiBhbGwga2V5Ym9hcmQga2V5cyAgICAgICAqLwotc3RhdGljIHN0cnVjdCB0ZXJtaW9zIG9sZF9jb25mOyAgICAgLyogU2F2ZWQgdGVybWluYWwgY29uZmlndXJhdGlvbiAgICAgKi8KLXN0YXRpYyBpbnQgICAgICBvbGRrYm1vZGU7ICAgICAgICAgIC8qIGFuZCBwcmV2aW91cyBrZXlib2FyZCBtb2RlICAgICAgICovCi1zdHJ1Y3QgdnRfbW9kZSAgb2xkdnRtb2RlOyAgICAgICAgICAvKiBPbGQgdmlydHVhbCB0ZXJtaW5hbCBtb2RlICAgICAgICAqLwotc3RhdGljIGludCAgICAgIG9sZF9mbGFnczsgICAgICAgICAgLyogT2xkIGZsYWdzIGZvciBmY250bCAgICAgICAgICAgICAgKi8KLXN0YXRpYyB1bG9uZyAgICBrZXlfbW9kaWZpZXJzOyAgICAgIC8qIEtleWJvYXJkIG1vZGlmaWVycyAgICAgICAgICAgICAgICovCi1zdGF0aWMgaW50ICAgICAgZm9yYmlkX3Z0X3JlbGVhc2U9MDsvKiBGbGFnIHRvIGZvcmJpZCByZWxlYXNlIG9mIFZUICAgICAqLwotc3RhdGljIGludCAgICAgIGZvcmJpZF92dF9hY3F1aXJlPTA7LyogRmxhZyB0byBmb3JiaWQgY2F0dXJlIG9mIFZUICAgICAgKi8KLXN0YXRpYyBpbnQgICAgICBvbGRtb2RlOyAgICAgICAgICAgIC8qIE9sZCBTVkdBIG1vZGUgc2F2ZWQgZm9yIFZUIHN3aXRjaCovCi1zdGF0aWMgaW50ICAgICAgaW5pdG1vZGU7ICAgICAgICAgICAvKiBJbml0aWFsIHRleHQgbW9kZSAgICAgICAgICAgICAgICAqLwotc3RhdGljIGlib29sICAgIGluc3RhbGxlZCA9IGZhbHNlOyAgLyogVHJ1ZSBpZiB3ZSBhcmUgaW5zdGFsbGVkICAgICAgICAgKi8KLXN0YXRpYyB2b2lkICAgICAoX0FTTUFQSSAqbW92ZUN1cnNvcikoaW50IHgsaW50IHkpID0gTlVMTDsKLXN0YXRpYyBpbnQgICAgICAoX0FTTUFQSSAqc3VzcGVuZEFwcENhbGxiYWNrKShpbnQgZmxhZ3MpID0gTlVMTDsKLQotI2lmIDAKLS8qIEtleWJvYXJkIFRyYW5zbGF0aW9uIHRhYmxlIGZyb20gc2NhbmNvZGVzIHRvIEFTQ0lJICovCi0KLXN0YXRpYyB1Y2hhciBrZXlUYWJsZVsxMjhdID0KLSJcMFwwMzMxMjM0NTY3ODkwLT1cMDEwIgotIlwwMTFxd2VydHl1aW9wW11cMDE1IgotIlwwYXNkZmdoamtsOydgXDBcXCIKLSJ6eGN2Ym5tLC4vXDAqXDAgXDAiCi0iXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwIiAgICAgIC8qIEZ1bmN0aW9uIGtleXMgKi8KLSI3ODktNDU2KzEyMzAuXDBcMFwwXDBcMCIgICAgICAgLyogS2V5cGFkIGtleXMgKi8KLSJcMFwwXDBcMFwwXDBcMFwwMTVcMC8iOwotCi1zdGF0aWMgdWNoYXIga2V5VGFibGVTaGlmdGVkWzEyOF0gPQotIlwwXDAzMyFAIyQlXiYqKClfK1wwMTAiCi0iXDAxMVFXRVJUWVVJT1B7fVwwMTUiCi0iXDBBU0RGR0hKS0w6XCJ+XDB8IgotIlpYQ1ZCTk08Pj9cMCpcMCBcMCIKLSJcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDAiICAgICAgLyogRnVuY3Rpb24ga2V5cyAqLwotIjc4OS00NTYrMTIzMC5cMFwwXDBcMFwwIiAgICAgICAvKiBLZXlwYWQga2V5cyAqLwotIlwwXDBcMFwwXDBcMFwwXDAxNVwwLyI7Ci0jZW5kaWYKLQotLyogTWFjcm9zIHRvIGtlZXAgdHJhY2sgb2YgdGhlIENBUFMgYW5kIE5VTSBsb2NrIHN0YXRlcyAqLwotCi0jZGVmaW5lIEVWVF9DQVBTU1RBVEUgICAweDAxMDAKLSNkZWZpbmUgRVZUX05VTVNUQVRFICAgIDB4MDIwMAotCi0vKiBIZWxwZXIgbWFjcm9zIGZvciBkZWFsaW5nIHdpdGggdGltZXJzICovCi0KLSNkZWZpbmUgVElDS1NfVE9fVVNFQyh0KSAoKHQpKjY1NTM2LjAvMS4xOTMxODApCi0jZGVmaW5lIFVTRUNfVE9fVElDS1ModSkgKCh1KSoxLjE5MzE4MC82NTUzNi4wKQotCi0vKiBOdW1iZXIgb2Yga2V5Y29kZXMgdG8gcmVhZCBhdCBhIHRpbWUgZnJvbSB0aGUgY29uc29sZSAqLwotCi0jZGVmaW5lIEtCRFJFQURCVUZGRVJTSVpFIDMyCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJucyB0aGUgY3VycmVudCB0aW1lIHN0YW1wIGluIHVuaXRzIG9mIDE4LjIgdGlja3MgcGVyIHNlY29uZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgZ2V0VGltZVN0YW1wKHZvaWQpCi17Ci0gICAgcmV0dXJuICh1bG9uZykoY2xvY2soKSAvIChDTE9DS1NfUEVSX1NFQyAvIDE4LjIpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1ldnQgLSBFdmVudCB0byBwbGFjZSBvbnRvIGV2ZW50IHF1ZXVlCi0KLVJFTUFSS1M6Ci1BZGRzIGFuIGV2ZW50IHRvIHRoZSBldmVudCBxdWV1ZSBieSB0YWNraW5nIGl0IG9udG8gdGhlIHRhaWwgb2YgdGhlIGV2ZW50Ci1xdWV1ZS4gVGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCBhdCBsZWFzdCBvbmUgc3BvdCBpcyBhdmFpbGFibGUgb24gdGhlCi1mcmVlTGlzdCBmb3IgdGhlIGV2ZW50IHRvIGJlIGluc2VydGVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGFkZEV2ZW50KAotICAgIFdEX2V2ZW50ICpldnQpCi17Ci0gICAgaW50ICAgICAgICAgZXZ0SUQ7Ci0KLSAgICAvKiBHZXQgc3BvdCB0byBwbGFjZSB0aGUgZXZlbnQgZnJvbSB0aGUgZnJlZSBsaXN0ICovCi0gICAgZXZ0SUQgPSBmcmVlSGVhZDsKLSAgICBmcmVlSGVhZCA9IGV2dHFbZnJlZUhlYWRdLm5leHQ7Ci0KLSAgICAvKiBBZGQgdG8gdGhlIHRhaWwgb2YgdGhlIGV2ZW50IHF1ZXVlICAgKi8KLSAgICBldnQtPm5leHQgPSAtMTsKLSAgICBldnQtPnByZXYgPSB0YWlsOwotICAgIGlmICh0YWlsICE9IC0xKQotICAgICAgICBldnRxW3RhaWxdLm5leHQgPSBldnRJRDsKLSAgICBlbHNlCi0gICAgICAgIGhlYWQgPSBldnRJRDsKLSAgICB0YWlsID0gZXZ0SUQ7Ci0gICAgZXZ0cVtldnRJRF0gPSAqZXZ0OwotICAgIGNvdW50Kys7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotd2hhdCAgICAgICAgLSBFdmVudCBjb2RlCi1tZXNzYWdlICAgICAtIEV2ZW50IG1lc3NhZ2UKLW1vZGlmaWVycyAgIC0ga2V5Ym9hcmQgbW9kaWZpZXJzCi14ICAgICAgICAgICAtIE1vdXNlIFggcG9zaXRpb24gYXQgdGltZSBvZiBldmVudAoteSAgICAgICAgICAgLSBNb3VzZSBZIHBvc2l0aW9uIGF0IHRpbWUgb2YgZXZlbnQKLWJ1dF9zdGF0ICAgIC0gTW91c2UgYnV0dG9uIHN0YXR1cyBhdCB0aW1lIG9mIGV2ZW50Ci0KLVJFTUFSS1M6Ci1BZGRzIGEgbmV3IG1vdXNlIGV2ZW50IHRvIHRoZSBldmVudCBxdWV1ZS4gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tCi13aXRoaW4gdGhlIG1vdXNlIGludGVycnVwdCBzdWJyb3V0aW5lLCBzbyBpdCBtdXN0IGJlIGVmZmljaWVudC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhZGRNb3VzZUV2ZW50KAotICAgIHVpbnQgd2hhdCwKLSAgICB1aW50IG1lc3NhZ2UsCi0gICAgaW50IHgsCi0gICAgaW50IHksCi0gICAgdWludCBidXRfc3RhdCkKLXsKLSAgICBXRF9ldmVudCAgICBldnQ7Ci0KLSAgICBpZiAoY291bnQgPCBFVkVOVFFTSVpFKSB7Ci0gICAgICAgIGV2dC53aGF0ID0gd2hhdDsKLSAgICAgICAgZXZ0LndoZW4gPSBnZXRUaW1lU3RhbXAoKTsKLSAgICAgICAgZXZ0Lm1lc3NhZ2UgPSBtZXNzYWdlOwotICAgICAgICBldnQubW9kaWZpZXJzID0gYnV0X3N0YXQgfCBrZXlfbW9kaWZpZXJzOwotICAgICAgICBldnQud2hlcmVfeCA9IHg7Ci0gICAgICAgIGV2dC53aGVyZV95ID0geTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIoJWQsJWQpLCBidXR0b25zICVsZFxuIiwgeCx5LCBldnQubW9kaWZpZXJzKTsKLSAgICAgICAgYWRkRXZlbnQoJmV2dCk7ICAgICAgICAgICAgICAgICAvKiBBZGQgdG8gdGFpbCBvZiBldmVudCBxdWV1ZSAgICovCi0gICAgICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zY2FuY29kZSAgICAtIFJhdyBrZXlib2FyZCBzY2FuIGNvZGUKLW1vZGlmaWVycyAgIC0gS2V5Ym9hcmQgbW9kaWZpZXJzIGZsYWdzCi0KLVJFTUFSS1M6Ci1Db252ZXJ0cyB0aGUgcmF3IHNjYW4gY29kZSBpbnRvIHRoZSBhcHByb3ByaWF0ZSBBU0NJSSBjb2RlIHVzaW5nIHRoZSBzY2FuCi1jb2RlIGFuZCB0aGUga2V5Ym9hcmQgbW9kaWZpZXIgZmxhZ3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIGdldEtleU1lc3NhZ2UoCi0gICAgdWludCBzY2FuY29kZSwKLSAgICB1bG9uZyBtb2RpZmllcnMpCi17Ci0gICAgdXNob3J0ICBjb2RlID0gc2NhbmNvZGUgPDwgODsKLSAgICB1c2hvcnQgIGFzY2lpOwotICAgIHN0cnVjdCBrYmVudHJ5IGtlOwotCi0gICAga2Uua2JfaW5kZXggPSBzY2FuY29kZTsKLQotICAgIC8qIEZpbmQgdGhlIGJhc2ljIEFTQ0lJIGNvZGUgZm9yIHRoZSBzY2FuIGNvZGUgKi8KLSAgICBpZiAobW9kaWZpZXJzICYgRVZUX0NBUFNTVEFURSkgewotICAgICAgICBpZiAobW9kaWZpZXJzICYgRVZUX1NISUZUS0VZKQotICAgICAgICAgIGtlLmtiX3RhYmxlID0gS19OT1JNVEFCOwotICAgICAgICAvLyAgICAgICAgICBhc2NpaSA9IHRvbG93ZXIoa2V5VGFibGVTaGlmdGVkW3NjYW5jb2RlXSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBrZS5rYl90YWJsZSA9IEtfU0hJRlRUQUI7Ci0gICAgICAgIC8vICAgICAgICAgIGFzY2lpID0gdG91cHBlcihrZXlUYWJsZVtzY2FuY29kZV0pOwotICAgICAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGlmIChtb2RpZmllcnMgJiBFVlRfU0hJRlRLRVkpCi0gICAgICAgICAga2Uua2JfdGFibGUgPSBLX1NISUZUVEFCOwotICAgICAgICAgIC8vIGFzY2lpID0ga2V5VGFibGVTaGlmdGVkW3NjYW5jb2RlXTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGtlLmtiX3RhYmxlID0gS19OT1JNVEFCOwotICAgICAgICAgIC8vIGFzY2lpID0ga2V5VGFibGVbc2NhbmNvZGVdOwotICAgICAgICB9Ci0gICAgaWYobW9kaWZpZXJzICYgRVZUX0FMVFNUQVRFKQotICAgICAga2Uua2JfdGFibGUgfD0gS19BTFRUQUI7Ci0KLSAgICBpZiAoaW9jdGwodHR5X2ZkLCBLREdLQkVOVCwgKHVuc2lnbmVkIGxvbmcpJmtlKSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIktER0tCRU5UIGF0IGluZGV4ICVkIGluIHRhYmxlICVkOiAiLAotICAgICAgICAgICAgc2NhbmNvZGUsIGtlLmtiX3RhYmxlKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGFzY2lpID0ga2Uua2JfdmFsdWU7Ci0KLSAgICAvKiBBZGQgQVNDSUkgY29kZSBpZiBrZXkgaXMgbm90IGFsdCdlZCBvciBjdHJsJ2VkICovCi0gICAgaWYgKCEobW9kaWZpZXJzICYgKEVWVF9BTFRTVEFURSB8IEVWVF9DVFJMU1RBVEUpKSkKLSAgICAgICAgY29kZSB8PSBhc2NpaTsKLQotICAgIHJldHVybiBjb2RlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXdoYXQgICAgICAgIC0gRXZlbnQgY29kZQotc2NhbmNvZGUgICAgLSBSYXcgc2NhbmNvZGUgb2Yga2V5Ym9hcmQgZXZlbnQgdG8gYWRkCi0KLVJFTUFSS1M6Ci1BZGRzIGEgbmV3IGtleWJvYXJkIGV2ZW50IHRvIHRoZSBldmVudCBxdWV1ZS4gV2Ugb25seSB0YWtlIEtFWVVQIGFuZAotS0VZRE9XTiBldmVudCBjb2RlcywgaG93ZXZlciBpZiBhIGtleSBpcyBhbHJlYWR5IGRvd24gd2UgY29udmVydCB0aGUgS0VZRE9XTgotdG8gYSBLRVlSRVBFQVQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYWRkS2V5RXZlbnQoCi0gICAgdWludCB3aGF0LAotICAgIHVpbnQgc2NhbmNvZGUpCi17Ci0gICAgV0RfZXZlbnQgICAgZXZ0OwotCi0gICAgaWYgKGNvdW50IDwgRVZFTlRRU0laRSkgewotICAgICAgICBldnQud2hhdCA9IHdoYXQ7Ci0gICAgICAgIGV2dC53aGVuID0gZ2V0VGltZVN0YW1wKCk7Ci0gICAgICAgIGV2dC5tZXNzYWdlID0gZ2V0S2V5TWVzc2FnZShzY2FuY29kZSxrZXlfbW9kaWZpZXJzKSB8IDB4MTAwMDBVTDsKLSAgICAgICAgZXZ0LndoZXJlX3ggPSBldnQud2hlcmVfeSA9IDA7Ci0gICAgICAgIGV2dC5tb2RpZmllcnMgPSBrZXlfbW9kaWZpZXJzOwotICAgICAgICBpZiAoZXZ0LndoYXQgPT0gRVZUX0tFWVVQKQotICAgICAgICAgICAga2V5X2Rvd25bc2NhbmNvZGVdID0gZmFsc2U7Ci0gICAgICAgIGVsc2UgaWYgKGV2dC53aGF0ID09IEVWVF9LRVlET1dOKSB7Ci0gICAgICAgICAgICBpZiAoa2V5X2Rvd25bc2NhbmNvZGVdKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9sZEtleSAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICBldnRxW29sZEtleV0ubWVzc2FnZSArPSAweDEwMDAwVUw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZXZ0LndoYXQgPSBFVlRfS0VZUkVQRUFUOwotICAgICAgICAgICAgICAgICAgICBvbGRLZXkgPSBmcmVlSGVhZDsKLSAgICAgICAgICAgICAgICAgICAgYWRkRXZlbnQoJmV2dCk7Ci0gICAgICAgICAgICAgICAgICAgIG9sZE1vdmUgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBrZXlfZG93bltzY2FuY29kZV0gPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgIGFkZEV2ZW50KCZldnQpOwotICAgICAgICBvbGRNb3ZlID0gLTE7Ci0gICAgICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zaWcgLSBTaWduYWwgYmVpbmcgc2VudCB0byB0aGlzIHNpZ25hbCBoYW5kbGVyCi0KLVJFTUFSS1M6Ci1TaWduYWwgaGFuZGxlciBmb3IgdGhlIHRpbWVyLiBUaGlzIHJvdXRpbmUgdGFrZXMgY2FyZSBvZiBwZXJpb2RpY2FsbHkKLXBvc3RpbmcgdGltZXIgZXZlbnRzIHRvIHRoZSBldmVudCBxdWV1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHRpbWVySGFuZGxlcigKLSAgICBpbnQgc2lnKQotewotICAgIFdEX2V2ZW50ICAgIGV2dDsKLQotICAgIGlmIChzaWcgPT0gU0lHQUxSTSkgewotICAgICAgICBpZiAoY291bnQgPCBFVkVOVFFTSVpFKSB7Ci0gICAgICAgICAgICBldnQud2hlbiA9IGdldFRpbWVTdGFtcCgpOwotICAgICAgICAgICAgZXZ0LndoYXQgPSBFVlRfVElNRVJUSUNLOwotICAgICAgICAgICAgZXZ0Lm1lc3NhZ2UgPSAwOwotICAgICAgICAgICAgZXZ0LndoZXJlX3ggPSBldnQud2hlcmVfeSA9IDA7Ci0gICAgICAgICAgICBldnQubW9kaWZpZXJzID0gMDsKLSAgICAgICAgICAgIGFkZEV2ZW50KCZldnQpOwotICAgICAgICAgICAgb2xkTW92ZSA9IC0xOwotICAgICAgICAgICAgb2xkS2V5ID0gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIHNpZ25hbChTSUdBTFJNLCB0aW1lckhhbmRsZXIpOwotICAgICAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVzdG9yZSB0aGUgdGVybWluYWwgdG8gbm9ybWFsIG9wZXJhdGlvbiBvbiBleGl0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgcmVzdG9yZV90ZXJtKHZvaWQpCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgaWYgKGluc3RhbGxlZCkgewotICAgICAgICAvKiBSZXN0b3JlIHRleHQgbW9kZSBhbmQgdGhlIHN0YXRlIG9mIHRoZSBjb25zb2xlICovCi0gICAgICAgIHJlZ3MueC5heCA9IDB4MzsKLSAgICAgICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7Ci0gICAgICAgIFBNX3Jlc3RvcmVDb25zb2xlU3RhdGUoc3RhdGVCdWYsdHR5X2ZkKTsKLQotICAgICAgICAvKiBSZXN0b3JlIGNvbnNvbGUgdG8gbm9ybWFsIG9wZXJhdGlvbiAqLwotICAgICAgICBpb2N0bCh0dHlfZmQsIFZUX1NFVE1PREUsICZvbGR2dG1vZGUpOwotICAgICAgICBpb2N0bCh0dHlfZmQsIEtEU0tCTU9ERSwgb2xka2Jtb2RlKTsKLSAgICAgICAgdGNzZXRhdHRyKHR0eV9mZCwgVENTQUZMVVNILCAmb2xkX2NvbmYpOwotICAgICAgICBmY250bCh0dHlfZmQsRl9TRVRGTCxvbGRfZmxhZ3MgJj0gfk9fTk9OQkxPQ0spOwotICAgICAgICBQTV9jbG9zZUNvbnNvbGUodHR5X2ZkKTsKLQotICAgICAgICAvKiBDbG9zZSB0aGUgbW91c2UgZHJpdmVyICovCi0gICAgICAgIGNsb3NlKGNvbm4pOwotCi0gICAgICAgIC8qIEZsYWcgdGhhdCB3ZSBhcmUgbm90IG5vIGxvbmdlciBpbnN0YWxsZWQgKi8KLSAgICAgICAgaW5zdGFsbGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TaWduYWwgaGFuZGxlciB0byBjYXB0dXJlIGZvcmNlZCBwcm9ncmFtIHRlcm1pbmF0aW9uIGNvbmRpdGlvbnMgc28gdGhhdAotd2UgY2FuIGNsZWFuIHVwIHByb3Blcmx5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGV4aXRIYW5kbGVyKGludCBzaWcpCi17Ci0gICAgZXhpdCgtMSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2xlZXAgdW50aWwgdGhlIHZpcnR1YWwgdGVybWluYWwgaXMgYWN0aXZlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB3YWl0X3Z0X2FjdGl2ZSh2b2lkKQotewotICAgIHdoaWxlIChpb2N0bCh0dHlfZmQsIFZUX1dBSVRBQ1RJVkUsIHR0eV92YykgPCAwKSB7Ci0gICAgICAgIGlmICgoZXJybm8gIT0gRUFHQUlOKSAmJiAoZXJybm8gIT0gRUlOVFIpKSB7Ci0gICAgICAgICAgICBwZXJyb3IoImlvY3RsKFZUX1dBSVRBQ1RJVkUpIik7Ci0gICAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgICAgfQotICAgICAgICB1c2xlZXAoMTUwMDAwKTsKLSAgICAgICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNpZ25hbCBoYW5kbGVyIGNhbGxlZCB3aGVuIG91ciB2aXJ0dWFsIHRlcm1pbmFsIGhhcyBiZWVuIHJlbGVhc2VkIGFuZCB3ZSBhcmUKLWxvc2luZyB0aGUgYWN0aXZlIGZvY3VzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHJlbGVhc2VfdnRfc2lnbmFsKGludCBuKQotewotICAgIGZvcmJpZF92dF9hY3F1aXJlID0gMTsKLSAgICBpZiAoZm9yYmlkX3Z0X3JlbGVhc2UpIHsKLSAgICAgICAgZm9yYmlkX3Z0X2FjcXVpcmUgPSAwOwotICAgICAgICBpb2N0bCh0dHlfZmQsIFZUX1JFTERJU1AsIDApOwotICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgIC8vIFRPRE86IENhbGwgdGhlIHVzZXIgc3VwcGxpZWQgc3VzcGVuZEFwcENhbGxiYWNrIGFuZCByZXN0b3JlIHRleHQKLSAgICAvLyAgICAgICBtb2RlIChzYXZpbmcgdGhlIGV4aXN0aW5nIG1vZGUgc28gd2UgY2FuIHJlc3RvcmUgaXQpLgotICAgIC8vCi0gICAgLy8gICAgICAgQWxzbyBpZiB0aGUgc3VzcGVuZEFwcENhbGxiYWNrIGlzIE5VTEwgdGhlbiB3ZSBoYXZlIHRvCi0gICAgLy8gICAgICAgaWdub3JlIHRoZSBzd2l0Y2ggcmVxdWVzdCEKLSAgICBpZihzdXNwZW5kQXBwQ2FsbGJhY2spewotICAgICAgb2xkbW9kZSA9IFZCRV9nZXRWaWRlb01vZGUoKTsKLSAgICAgIHN1c3BlbmRBcHBDYWxsYmFjayh0cnVlKTsKLSAgICAgIFZCRV9zZXRWaWRlb01vZGUoaW5pdG1vZGUpOwotICAgIH0KLQotICAgIGlvY3RsKHR0eV9mZCwgVlRfUkVMRElTUCwgMSk7Ci0gICAgZm9yYmlkX3Z0X2FjcXVpcmUgPSAwOwotICAgIHdhaXRfdnRfYWN0aXZlKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2lnbmFsIGhhbmRsZXIgY2FsbGVkIHdoZW4gb3VyIHZpcnR1YWwgdGVybWluYWwgaGFzIGJlZW4gcmUtYXF1aXJlZCBhbmQgd2UKLWFyZSBub3cgcmVnYWlpbmcgdGhlIGFjdGl2ZSBmb2N1cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhY3F1aXJlX3Z0X3NpZ25hbChpbnQgbikKLXsKLSAgICBmb3JiaWRfdnRfcmVsZWFzZSA9IDE7Ci0gICAgaWYgKGZvcmJpZF92dF9hY3F1aXJlKSB7Ci0gICAgICAgIGZvcmJpZF92dF9yZWxlYXNlID0gMDsKLSAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAvLyBUT0RPOiBSZXN0b3JlIHRoZSBvbGQgZGlzcGxheSBtb2RlLCBjYWxsIHRoZSB1c2VyIHN1c3BlbmRBcHBDYWxsYmFjawotICAgIC8vICAgICAgIGFuZCBhbmQgd2Ugd2lsbCBiZSBiYWNrIGluIGdyYXBoaWNzIG1vZGUuCi0KLSAgICBpZihzdXNwZW5kQXBwQ2FsbGJhY2spewotICAgICAgVkJFX3NldFZpZGVvTW9kZShvbGRtb2RlKTsKLSAgICAgIHN1c3BlbmRBcHBDYWxsYmFjayhmYWxzZSk7Ci0gICAgfQotCi0gICAgaW9jdGwodHR5X2ZkLCBWVF9SRUxESVNQLCBWVF9BQ0tBQ1EpOwotICAgIGZvcmJpZF92dF9yZWxlYXNlID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBzZXQgdGhlIGFjdGlvbiBmb3IgYSBzcGVjaWZpYyBzaWduYWwgdG8gY2FsbCBvdXIgc2lnbmFsIGhhbmRsZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgc2V0X3NpZ2FjdGlvbihpbnQgc2lnLHZvaWQgKCpoYW5kbGVyKShpbnQpKQotewotICAgIHN0cnVjdCBzaWdhY3Rpb24gICAgc2lnYTsKLQotICAgIHNpZ2Euc2FfaGFuZGxlciA9IGhhbmRsZXI7Ci0gICAgc2lnYS5zYV9mbGFncyA9IFNBX1JFU1RBUlQ7Ci0gICAgbWVtc2V0KCYoc2lnYS5zYV9tYXNrKSwgMCwgc2l6ZW9mKHNpZ3NldF90KSk7Ci0gICAgc2lnYWN0aW9uKHNpZywgJnNpZ2EsIE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIHRha2Ugb3ZlciBjb250cm9sIG9mIFZUIHN3aXRjaGluZyBzbyB0aGF0IHdlIGNhbiBjYXB0dXJlCi12aXJ0dWFsIHRlcm1pbmFsIHJlbGVhc2UgYW5kIGFxdWlyZSBzaWduYWxzLCBhbGxvd2luZyB1cyB0byBwcm9wZXJseQotc3VwcG9ydCBWVCBzd2l0Y2hpbmcgd2hpbGUgaW4gZ3JhcGhpY3MgbW9kZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgdGFrZV92dF9jb250cm9sKHZvaWQpCi17Ci0gICAgc3RydWN0IHZ0X21vZGUgICAgICB2dG1vZGU7Ci0KLSAgICBpb2N0bCh0dHlfZmQsIFZUX0dFVE1PREUsICZ2dG1vZGUpOwotICAgIG9sZHZ0bW9kZSA9IHZ0bW9kZTsKLSAgICB2dG1vZGUubW9kZSA9IFZUX1BST0NFU1M7Ci0gICAgdnRtb2RlLnJlbHNpZyA9IFNJR1VTUjE7Ci0gICAgdnRtb2RlLmFjcXNpZyA9IFNJR1VTUjI7Ci0gICAgc2V0X3NpZ2FjdGlvbihTSUdVU1IxLCByZWxlYXNlX3Z0X3NpZ25hbCk7Ci0gICAgc2V0X3NpZ2FjdGlvbihTSUdVU1IyLCBhY3F1aXJlX3Z0X3NpZ25hbCk7Ci0gICAgaW9jdGwodHR5X2ZkLCBWVF9TRVRNT0RFLCAmb2xkdnRtb2RlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIHNoaWZ0IGtleWJvYXJkIExFRCdzIGJhc2VkIG9uIHRoZSBjdXJyZW50IGtleWJvYXJkIG1vZGlmaWVycyBmbGFncy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCB1cGRhdGVMRURTdGF0dXModm9pZCkKLXsKLSAgICBpbnQgc3RhdGUgPSAwOwotICAgIGlmIChrZXlfbW9kaWZpZXJzICYgRVZUX0NBUFNTVEFURSkKLSAgICAgICAgc3RhdGUgfD0gTEVEX0NBUDsKLSAgICBpZiAoa2V5X21vZGlmaWVycyAmIEVWVF9OVU1TVEFURSkKLSAgICAgICAgc3RhdGUgfD0gTEVEX05VTTsKLSAgICBpb2N0bCh0dHlfZmQsS0RTRVRMRUQsc3RhdGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXNjYW5jb2RlICAgIC0gUmF3IHNjYW4gY29kZSB0byBoYW5kbGUKLQotUkVNQVJLUzoKLUhhbmRsZXMgdGhlIHNoaWZ0IGtleSBtb2RpZmllcnMgYW5kIGtlZXBzIHRyYWNrIG9mIHRoZSBzaGlmdCBrZXkgc3RhdGVzCi1zbyB0aGF0IHdlIGNhbiByZXR1cm4gdGhlIGNvcnJlY3QgQVNDSUkgY29kZXMgZm9yIHRoZSBrZXlib2FyZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCB0b2dnbGVNb2RpZmllcnMoCi0gICAgaW50IHNjYW5jb2RlKQotewotICAgIHN0YXRpYyBpbnQgY2Fwc19kb3duID0gMCxudW1fZG93biA9IDA7Ci0KLSAgICBpZiAoc2NhbmNvZGUgJiAweDgwKSB7Ci0gICAgICAgIC8qIEhhbmRsZSBrZXktcmVsZWFzZSBmdW5jdGlvbiAqLwotICAgICAgICBzY2FuY29kZSAmPSAweDdGOwotICAgICAgICBpZiAoc2NhbmNvZGUgPT0gMHgyQSB8fCBzY2FuY29kZSA9PSAweDM2KQotICAgICAgICAgICAga2V5X21vZGlmaWVycyAmPSB+RVZUX1NISUZUS0VZOwotICAgICAgICBlbHNlIGlmIChzY2FuY29kZSA9PSAweDFEIHx8IHNjYW5jb2RlID09IDB4NjEpCi0gICAgICAgICAgICBrZXlfbW9kaWZpZXJzICY9IH5FVlRfQ1RSTFNUQVRFOwotICAgICAgICBlbHNlIGlmIChzY2FuY29kZSA9PSAweDM4IHx8IHNjYW5jb2RlID09IDB4NjQpCi0gICAgICAgICAgICBrZXlfbW9kaWZpZXJzICY9IH5FVlRfQUxUU1RBVEU7Ci0gICAgICAgIGVsc2UgaWYgKHNjYW5jb2RlID09IDB4M0EpCi0gICAgICAgICAgICBjYXBzX2Rvd24gPSBmYWxzZTsKLSAgICAgICAgZWxzZSBpZiAoc2NhbmNvZGUgPT0gMHg0NSkKLSAgICAgICAgICAgIG51bV9kb3duID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyogSGFuZGxlIGtleS1kb3duIGZ1bmN0aW9uICovCi0gICAgICAgIHNjYW5jb2RlICY9IDB4N0Y7Ci0gICAgICAgIGlmIChzY2FuY29kZSA9PSAweDJBIHx8IHNjYW5jb2RlID09IDB4MzYpCi0gICAgICAgICAgICBrZXlfbW9kaWZpZXJzIHw9IEVWVF9TSElGVEtFWTsKLSAgICAgICAgZWxzZSBpZiAoc2NhbmNvZGUgPT0gMHgxRCB8fCBzY2FuY29kZSA9PSAweDYxKQotICAgICAgICAgICAga2V5X21vZGlmaWVycyB8PSBFVlRfQ1RSTFNUQVRFOwotICAgICAgICBlbHNlIGlmIChzY2FuY29kZSA9PSAweDM4IHx8IHNjYW5jb2RlID09IDB4NjQpCi0gICAgICAgICAgICBrZXlfbW9kaWZpZXJzIHw9IEVWVF9BTFRTVEFURTsKLSAgICAgICAgZWxzZSBpZiAoc2NhbmNvZGUgPT0gMHgzQSkgewotICAgICAgICAgICAgaWYgKCFjYXBzX2Rvd24pIHsKLSAgICAgICAgICAgICAgICBrZXlfbW9kaWZpZXJzIF49IEVWVF9DQVBTU1RBVEU7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTEVEU3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2Fwc19kb3duID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc2NhbmNvZGUgPT0gMHg0NSkgewotICAgICAgICAgICAgaWYgKCFudW1fZG93bikgewotICAgICAgICAgICAgICAgIGtleV9tb2RpZmllcnMgXj0gRVZUX05VTVNUQVRFOwotICAgICAgICAgICAgICAgIHVwZGF0ZUxFRFN0YXR1cygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG51bV9kb3duID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJpdHMgdGhhdCBoYXZlIGNoYW5nZWQgZnJvbSAwIHRvIDEKLShhIG5lZ2F0aXZlIHZhbHVlIG1lYW5zIHRoZSBudW1iZXIgb2YgYml0cyB0aGF0IGhhdmUgY2hhbmdlZCBmcm9tIDEgdG8gMCkgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IGNvbXBhcmVCaXRzKHNob3J0IGEsIHNob3J0IGIpCi17Ci0gICAgaW50IHJldCA9IDA7Ci0gICAgaWYoIChhJjEpICE9IChiJjEpICkgcmV0ICs9IChiJjEpID8gMSA6IC0xOwotICAgIGlmKCAoYSYyKSAhPSAoYiYyKSApIHJldCArPSAoYiYyKSA/IDEgOiAtMTsKLSAgICBpZiggKGEmNCkgIT0gKGImNCkgKSByZXQgKz0gKGImNCkgPyAxIDogLTE7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVR1cm5zIG9mZiBhbGwga2V5Ym9hcmQgc3RhdGUgYmVjYXVzZSB3ZSBjYW4ndCByZWx5IG9uIHRoZW0gYW55bW9yZSBhcyBzb29uCi1hcyB3ZSBzd2l0Y2ggVlQncwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQga2V5Ym9hcmRfY2xlYXJzdGF0ZSh2b2lkKQotewotICBrZXlfbW9kaWZpZXJzID0gMDsKLSAgbWVtc2V0KGtleV9kb3duLCAwLCBzaXplb2Yoa2V5X2Rvd24pKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1QdW1wcyBhbGwgZXZlbnRzIGZyb20gdGhlIGNvbnNvbGUgZXZlbnQgcXVldWUgaW50byB0aGUgV2luRGlyZWN0IGV2ZW50IHF1ZXVlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHB1bXBFdmVudHModm9pZCkKLXsKLSAgICBzdGF0aWMgdWNoYXIgICAgYnVmW0tCRFJFQURCVUZGRVJTSVpFXTsKLSAgICBzdGF0aWMgY2hhciAgICAgZGF0YVs1XTsKLSAgICBzdGF0aWMgaW50ICAgICAgb2xkX2J1dHMsIG9sZF9teCwgb2xkX215OwotICAgIHN0YXRpYyBzdHJ1Y3QgdGltZXZhbCB0OwotICAgIGZkX3NldCBmZHM7Ci0gICAgaW50ICAgICAgICAgICAgIG51bWtleXMsaTsKLSAgICBpbnQgICAgICAgICAgICAgZHgsIGR5LCBidXRzOwotCi0gICAgLyogUmVhZCBhbGwgcGVuZGluZyBrZXlwcmVzc2VzIGZyb20ga2V5Ym9hcmQgYnVmZmVyIGFuZCBwcm9jZXNzICovCi0gICAgd2hpbGUgKChudW1rZXlzID0gcmVhZCh0dHlfZmQsIGJ1ZiwgS0JEUkVBREJVRkZFUlNJWkUpKSA+IDApIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bWtleXM7IGkrKykgewotICAgICAgICAgICAgdG9nZ2xlTW9kaWZpZXJzKGJ1ZltpXSk7Ci0gICAgICAgICAgICBpZiAoa2V5X21vZGlmaWVycyAmIEVWVF9BTFRTVEFURSl7Ci0gICAgICAgICAgICAgIGludCBma2V5ID0gMDsKLQotICAgICAgICAgICAgICAvLyBEbyBWVCBzd2l0Y2hpbmcgaGVyZSBmb3IgQWx0K0Z4IGtleXByZXNzZXMKLSAgICAgICAgICAgICAgc3dpdGNoKGJ1ZltpXSAmIDB4N0YpewotICAgICAgICAgICAgICBjYXNlIDU5IC4uLiA2ODogLyogRjEgdG8gRjEwICovCi0gICAgICAgICAgICAgICAgZmtleSA9IChidWZbaV0gJiAweDdGKSAtIDU4OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIDg3OiAvKiBGMTEgKi8KLSAgICAgICAgICAgICAgY2FzZSA4ODogLyogRjEyICovCi0gICAgICAgICAgICAgICAgZmtleSA9IChidWZbaV0gJiAweDdGKSAtIDc2OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmKGZrZXkpewotICAgICAgICAgICAgICAgIHN0cnVjdCB2dF9zdGF0IHZ0czsKLSAgICAgICAgICAgICAgICBpb2N0bCh0dHlfZmQsIFZUX0dFVFNUQVRFLCAmdnRzKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZihma2V5ICE9IHZ0cy52X2FjdGl2ZSl7Ci0gICAgICAgICAgICAgICAgICBrZXlib2FyZF9jbGVhcnN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgICBpb2N0bCh0dHlfZmQsIFZUX0FDVElWQVRFLCBma2V5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGJ1ZltpXSAmIDB4ODApCi0gICAgICAgICAgICAgICAgYWRkS2V5RXZlbnQoRVZUX0tFWVVQLGJ1ZltpXSAmIDB4N0YpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGFkZEtleUV2ZW50KEVWVF9LRVlET1dOLGJ1ZltpXSAmIDB4N0YpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE86IElmIHdlIHdhbnQgdG8gaGFuZGxlIFZDIHN3aXRjaGluZyB3ZSB3aWxsIG5lZWQgdG8gZG8gaXQKLSAgICAgICAgLy8gICAgICAgaW4gaGVyZSBzbyB0aGF0IHdlIGNhbiBzd2l0Y2ggYXdheSBmcm9tIHRoZSBWQyBhbmQgdGhlbgotICAgICAgICAvLyAgICAgICBzd2l0Y2ggYmFjayB0byBpdCBsYXRlci4gUmlnaHQgbm93IFZDIHN3aXRjaGluZyBpcyBkaXNhYmxlZAotICAgICAgICAvLyAgICAgICBhbmQgaW4gb3JkZXIgdG8gZW5hYmxlIGl0IHdlIG5lZWQgdG8gc2F2ZS9yZXN0b3JlIHRoZSBzdGF0ZQotICAgICAgICAvLyAgICAgICBvZiB0aGUgZ3JhcGhpY3Mgc2NyZWVuICh1c2luZyB0aGUgc3VzcGVuZEFwcENhbGxiYWNrIGFuZAotICAgICAgICAvLyAgICAgICBzYXZpbmcvcmVzdG9yaW5nIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBkaXNwbGF5IG1vZGUpLgotCi0gICAgICAgIH0KLQotICAgIC8qIFJlYWQgYWxsIHBlbmRpbmcgbW91c2UgZXZlbnRzIGFuZCBwcm9jZXNzIHRoZW0gKi8KLSAgICBpZihjb25uID4gMCl7Ci0gICAgICAgIEZEX1pFUk8oJmZkcyk7Ci0gICAgICAgIEZEX1NFVChjb25uLCAmZmRzKTsKLSAgICAgICAgdC50dl9zZWMgPSB0LnR2X3VzZWMgPSAwTDsKLSAgICAgICAgd2hpbGUgKHNlbGVjdChjb25uKzEsICZmZHMsIE5VTEwsIE5VTEwsICZ0KSA+IDApIHsKLSAgICAgICAgICAgIGlmKHJlYWQoY29ubiwgZGF0YSwgNSkgPT0gNSl7Ci0gICAgICAgICAgICAgICAgYnV0cyA9ICh+ZGF0YVswXSkgJiAweDA3OwotICAgICAgICAgICAgICAgIGR4ID0gKGNoYXIpKGRhdGFbMV0pICsgKGNoYXIpKGRhdGFbM10pOwotICAgICAgICAgICAgICAgIGR5ID0gLSgoY2hhcikoZGF0YVsyXSkgKyAoY2hhcikoZGF0YVs0XSkpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG14ICs9IGR4OyBteSArPSBkeTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoZHggfHwgZHkpCi0gICAgICAgICAgICAgICAgICAgIGFkZE1vdXNlRXZlbnQoRVZUX01PVVNFTU9WRSwgMCwgbXgsIG15LCBidXRzKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoYnV0cyAhPSBvbGRfYnV0cyl7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjID0gY29tcGFyZUJpdHMoYnV0cyxvbGRfYnV0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGM+MCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1vdXNlRXZlbnQoRVZUX01PVVNFRE9XTiwgMCwgbXgsIG15LCBidXRzKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihjPDApCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRNb3VzZUV2ZW50KEVWVF9NT1VTRVVQLCAwLCBteCwgbXksIGJ1dHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvbGRfbXggPSBteDsgb2xkX215ID0gbXk7Ci0gICAgICAgICAgICAgICAgb2xkX2J1dHMgPSBidXRzOwotICAgICAgICAgICAgICAgIEZEX1NFVChjb25uLCAmZmRzKTsKLSAgICAgICAgICAgICAgICB0LnR2X3NlYyA9IHQudHZfdXNlYyA9IDBMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgaW50ZXJmYWNlIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXdoaWNoICAgICAgIC0gV2hpY2ggY29kZSBmb3IgZXZlbnQgdG8gcG9zdAotd2hhdCAgICAgICAgLSBFdmVudCBjb2RlIGZvciBldmVudCB0byBwb3N0Ci1tZXNzYWdlICAgICAtIEV2ZW50IG1lc3NhZ2UKLW1vZGlmaWVycyAgIC0gU2hpZnQga2V5L21vdXNlIGJ1dHRvbiBtb2RpZmllcnMKLQotUkVUVVJOUzoKLVRydWUgaWYgdGhlIGV2ZW50IHdhcyBwb3N0ZWQsIGZhbHNlIGlmIHF1ZXVlIGlzIGZ1bGwuCi0KLVJFTUFSS1M6Ci1Qb3N0cyBhbiBldmVudCB0byB0aGUgZXZlbnQgcXVldWUuIFRoaXMgcm91dGluZSBjYW4gYmUgdXNlZCB0byBwb3N0IGFueSB0eXBlCi1vZiBldmVudCBpbnRvIHRoZSBxdWV1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBfV0RBUEkgV0RfcG9zdEV2ZW50KAotICAgIHVsb25nIHdoaWNoLAotICAgIHVpbnQgd2hhdCwKLSAgICB1bG9uZyBtZXNzYWdlLAotICAgIHVsb25nIG1vZGlmaWVycykKLXsKLSAgICBXRF9ldmVudCAgICBldnQ7Ci0KLSAgICBpZiAoY291bnQgPCBFVkVOVFFTSVpFKSB7Ci0gICAgICAgIC8qIFNhdmUgaW5mb3JtYXRpb24gaW4gZXZlbnQgcmVjb3JkICovCi0gICAgICAgIGV2dC53aGljaCA9IHdoaWNoOwotICAgICAgICBldnQud2hhdCA9IHdoYXQ7Ci0gICAgICAgIGV2dC53aGVuID0gZ2V0VGltZVN0YW1wKCk7Ci0gICAgICAgIGV2dC5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICAgICAgZXZ0Lm1vZGlmaWVycyA9IG1vZGlmaWVyczsKLSAgICAgICAgYWRkRXZlbnQoJmV2dCk7ICAgICAgICAgICAgIC8qIEFkZCB0byB0YWlsIG9mIGV2ZW50IHF1ZXVlICAgKi8KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1tYXNrICAgIC0gRXZlbnQgbWFzayB0byB1c2UKLQotUkVNQVJLUzoKLUZsdXNoZXMgYWxsIHRoZSBldmVudCBzcGVjaWZpZWQgaW4gJ21hc2snIGZyb20gdGhlIGV2ZW50IHF1ZXVlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX1dEQVBJIFdEX2ZsdXNoRXZlbnQoCi0gICAgdWludCBtYXNrKQotewotICAgIFdEX2V2ZW50ICAgIGV2dDsKLQotICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmx1c2ggYWxsIGV2ZW50cyAqLwotICAgICAgICBXRF9nZXRFdmVudCgmZXZ0LG1hc2spOwotICAgICAgICB9IHdoaWxlIChldnQud2hhdCAhPSBFVlRfTlVMTEVWVCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZXZ0ICAgICAtIFBsYWNlIHRvIHN0b3JlIGV2ZW50Ci1tYXNrICAgIC0gRXZlbnQgbWFzayB0byB1c2UKLQotUkVNQVJLUzoKLUhhbHRzIHByb2dyYW0gZXhlY3V0aW9uIHVudGlsIGEgc3BlY2lmaWVkIGV2ZW50IG9jY3Vycy4gVGhlIGV2ZW50IGlzCi1yZXR1cm5lZC4gQWxsIHBlbmRpbmcgZXZlbnRzIG5vdCBpbiB0aGUgc3BlY2lmaWVkIG1hc2sgd2lsbCBiZSBpZ25vcmVkIGFuZAotcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9XREFQSSBXRF9oYWx0RXZlbnQoCi0gICAgV0RfZXZlbnQgKmV2dCwKLSAgICB1aW50IG1hc2spCi17Ci0gICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXYWl0IGZvciBhbiBldmVudCAgICAqLwotICAgICAgICBXRF9nZXRFdmVudChldnQsRVZUX0VWRVJZRVZUKTsKLSAgICAgICAgfSB3aGlsZSAoIShldnQtPndoYXQgJiBtYXNrKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZXZ0ICAgICAtIFBsYWNlIHRvIHN0b3JlIGV2ZW50Ci1tYXNrICAgIC0gRXZlbnQgbWFzayB0byB1c2UKLQotUkVUVVJOUzoKLVRydWUgaWYgYW4gZXZlbnQgd2FzIHBlbmRpbmcuCi0KLVJFTUFSS1M6Ci1SZXRyaWV2ZXMgdGhlIG5leHQgcGVuZGluZyBldmVudCBkZWZpbmVkIGluICdtYXNrJyBmcm9tIHRoZSBldmVudCBxdWV1ZS4KLVRoZSBldmVudCBxdWV1ZSBpcyBhZGp1c3RlZCB0byByZWZsZWN0IHRoZSBuZXcgc3RhdGUgYWZ0ZXIgdGhlIGV2ZW50IGhhcwotYmVlbiByZW1vdmVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIF9XREFQSSBXRF9nZXRFdmVudCgKLSAgICBXRF9ldmVudCAqZXZ0LAotICAgIHVpbnQgbWFzaykKLXsKLSAgICBpbnQgICAgIGV2dElELG5leHQscHJldjsKLQotICAgIHB1bXBFdmVudHMoKTsKLSAgICBpZiAobW92ZUN1cnNvcikKLSAgICAgICAgbW92ZUN1cnNvcihteCxteSk7ICAgICAgICAgICAgICAgICAgLyogTW92ZSB0aGUgbW91c2UgY3Vyc29yICAgICovCi0gICAgZXZ0LT53aGF0ID0gRVZUX05VTExFVlQ7ICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgdG8gbnVsbCBldmVudCAgICAqLwotCi0gICAgaWYgKGNvdW50KSB7Ci0gICAgICAgIGZvciAoZXZ0SUQgPSBoZWFkOyBldnRJRCAhPSAtMTsgZXZ0SUQgPSBldnRxW2V2dElEXS5uZXh0KSB7Ci0gICAgICAgICAgICBpZiAoZXZ0cVtldnRJRF0ud2hhdCAmIG1hc2spCi0gICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgIC8qIEZvdW5kIGFuIGV2ZW50ICAgICAgICAgICAqLwotICAgICAgICAgICAgfQotICAgICAgICBpZiAoZXZ0SUQgPT0gLTEpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgIC8qIEV2ZW50IHdhcyBub3QgZm91bmQgICAgICAqLwotICAgICAgICBuZXh0ID0gZXZ0cVtldnRJRF0ubmV4dDsKLSAgICAgICAgcHJldiA9IGV2dHFbZXZ0SURdLnByZXY7Ci0gICAgICAgIGlmIChwcmV2ICE9IC0xKQotICAgICAgICAgICAgZXZ0cVtwcmV2XS5uZXh0ID0gbmV4dDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaGVhZCA9IG5leHQ7Ci0gICAgICAgIGlmIChuZXh0ICE9IC0xKQotICAgICAgICAgICAgZXZ0cVtuZXh0XS5wcmV2ID0gcHJldjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdGFpbCA9IHByZXY7Ci0gICAgICAgICpldnQgPSBldnRxW2V2dElEXTsgICAgICAgICAgICAgICAgIC8qIFJldHVybiB0aGUgZXZlbnQgICAgICAgICAqLwotICAgICAgICBldnRxW2V2dElEXS5uZXh0ID0gZnJlZUhlYWQ7ICAgICAgICAvKiBhbmQgcmV0dXJuIHRvIGZyZWUgbGlzdCAgKi8KLSAgICAgICAgZnJlZUhlYWQgPSBldnRJRDsKLSAgICAgICAgY291bnQtLTsKLSAgICAgICAgaWYgKGV2dC0+d2hhdCA9PSBFVlRfTU9VU0VNT1ZFKQotICAgICAgICAgICAgb2xkTW92ZSA9IC0xOwotICAgICAgICBpZiAoZXZ0LT53aGF0ID09IEVWVF9LRVlSRVBFQVQpCi0gICAgICAgICAgICBvbGRLZXkgPSAtMTsKLSAgICAgICAgfQotICAgIHJldHVybiBldnQtPndoYXQgIT0gRVZUX05VTExFVlQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZXZ0ICAgICAtIFBsYWNlIHRvIHN0b3JlIGV2ZW50Ci1tYXNrICAgIC0gRXZlbnQgbWFzayB0byB1c2UKLQotUkVUVVJOUzoKLVRydWUgaWYgYW4gZXZlbnQgaXMgcGVuZGluZy4KLQotUkVNQVJLUzoKLVBlZWtzIGF0IHRoZSBuZXh0IHBlbmRpbmcgZXZlbnQgZGVmaW5lZCBpbiAnbWFzaycgaW4gdGhlIGV2ZW50IHF1ZXVlLiBUaGUKLWV2ZW50IGlzIG5vdCByZW1vdmVkIGZyb20gdGhlIGV2ZW50IHF1ZXVlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIF9XREFQSSBXRF9wZWVrRXZlbnQoCi0gICAgV0RfZXZlbnQgKmV2dCwKLSAgICB1aW50IG1hc2spCi17Ci0gICAgaW50ICAgICBldnRJRDsKLQotICAgIHB1bXBFdmVudHMoKTsKLSAgICBpZiAobW92ZUN1cnNvcikKLSAgICAgICAgbW92ZUN1cnNvcihteCxteSk7ICAgICAgICAgICAgICAgICAgLyogTW92ZSB0aGUgbW91c2UgY3Vyc29yICAgICovCi0gICAgZXZ0LT53aGF0ID0gRVZUX05VTExFVlQ7ICAgICAgICAgICAgICAgIC8qIERlZmF1bHQgdG8gbnVsbCBldmVudCAgICAqLwotCi0gICAgaWYgKGNvdW50KSB7Ci0gICAgICAgIGZvciAoZXZ0SUQgPSBoZWFkOyBldnRJRCAhPSAtMTsgZXZ0SUQgPSBldnRxW2V2dElEXS5uZXh0KSB7Ci0gICAgICAgICAgICBpZiAoZXZ0cVtldnRJRF0ud2hhdCAmIG1hc2spCi0gICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgIC8qIEZvdW5kIGFuIGV2ZW50ICAgICAgICAgICAqLwotICAgICAgICAgICAgfQotICAgICAgICBpZiAoZXZ0SUQgPT0gLTEpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgIC8qIEV2ZW50IHdhcyBub3QgZm91bmQgICAgICAqLwotCi0gICAgICAgICpldnQgPSBldnRxW2V2dElEXTsgICAgICAgICAgICAgICAgIC8qIFJldHVybiB0aGUgZXZlbnQgICAgICAgICAqLwotICAgICAgICB9Ci0gICAgcmV0dXJuIGV2dC0+d2hhdCAhPSBFVlRfTlVMTEVWVDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1od25kTWFpbiAgICAtIEhhbmRsZSB0byBtYWluIHdpbmRvdwotX3hSZXMgICAgICAgLSBYIHJlc29sdXRpb24gb2YgZ3JhcGhpY3MgbW9kZSB0byBiZSB1c2VkCi1feVJlcyAgICAgICAtIFkgcmVzb2x1bGlvbiBvZiBncmFwaGljcyBtb2RlIHRvIGJlIHVzZWQKLQotUkVUVVJOUzoKLUhhbmRsZSB0byB0aGUgZnVsbHNjcmVlbiBldmVudCB3aW5kb3cgaWYgKHdlIHJldHVybiBod25kTWFpbiBvbiBMaW51eCkKLQotUkVNQVJLUzoKLUluaXRpbGlhc2UgdGhlIGV2ZW50IGhhbmRsaW5nIG1vZHVsZS4gSGVyZSB3ZSBpbnN0YWxsIG91ciBtb3VzZSBoYW5kbGluZwotSVNSIHRvIGJlIGNhbGxlZCB3aGVuZXZlciBhbnkgYnV0dG9uJ3MgYXJlIHByZXNzZWQgb3IgcmVsZWFzZWQuIFdlIGFsc28KLWJ1aWxkIHRoZSBmcmVlIGxpc3Qgb2YgZXZlbnRzIGluIHRoZSBldmVudCBxdWV1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1XRF9IV05EIF9XREFQSSBXRF9zdGFydEZ1bGxTY3JlZW4oCi0gICAgV0RfSFdORCBod25kTWFpbiwKLSAgICBpbnQgX3hSZXMsCi0gICAgaW50IF95UmVzKQotewotICAgIGludCAgICAgICAgICAgICBpOwotICAgIHN0cnVjdCB0ZXJtaW9zICBjb25mOwotICAgIGlmICghaW5zdGFsbGVkKSB7Ci0gICAgICAgIEdwbV9Db25uZWN0IGdwbTsKLQotICAgICAgICAvKiBCdWlsZCBmcmVlIGxpc3QsIGFuZCBpbml0aWFsaXNlIGdsb2JhbCBkYXRhIHN0cnVjdHVyZXMgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IEVWRU5UUVNJWkU7IGkrKykKLSAgICAgICAgICAgIGV2dHFbaV0ubmV4dCA9IGkrMTsKLSAgICAgICAgZXZ0cVtFVkVOVFFTSVpFLTFdLm5leHQgPSAtMTsgICAgICAgLyogVGVybWluYXRlIGxpc3QgICAgICAgICAgICovCi0gICAgICAgIGNvdW50ID0gZnJlZUhlYWQgPSAwOwotICAgICAgICBoZWFkID0gdGFpbCA9IC0xOwotICAgICAgICBvbGRNb3ZlID0gLTE7Ci0gICAgICAgIG9sZEtleSA9IC0xOwotICAgICAgICB4UmVzID0gX3hSZXM7Ci0gICAgICAgIHlSZXMgPSBfeVJlczsKLQotICAgICAgICAvKiBPcGVuIHRoZSBjb25zb2xlIGRldmljZSBhbmQgaW5pdGlhbGlzZSBpdCBmb3IgcmF3IG1vZGUgKi8KLSAgICAgICAgdHR5X2ZkID0gUE1fb3BlbkNvbnNvbGUoKTsKLQotICAgICAgICAvKiBXYWl0IHVudGlsIHZpcnR1YWwgdGVybWluYWwgaXMgYWN0aXZlIGFuZCB0YWtlIG92ZXIgY29udHJvbCAqLwotICAgICAgICB3YWl0X3Z0X2FjdGl2ZSgpOwotICAgICAgICB0YWtlX3Z0X2NvbnRyb2woKTsKLQotICAgICAgICAvKiBJbml0aWFsaXNlIGtleWJvYXJkIGhhbmRsaW5nIHRvIHJhdyBtb2RlICovCi0gICAgICAgIGlmIChpb2N0bCh0dHlfZmQsIEtER0tCTU9ERSwgJm9sZGtibW9kZSkpIHsKLSAgICAgICAgICAgIHByaW50ZigiV0Rfc3RhcnRGdWxsU2NyZWVuOiBjYW5ub3QgZ2V0IGtleWJvYXJkIG1vZGUuXG4iKTsKLSAgICAgICAgICAgIGV4aXQoLTEpOwotICAgICAgICAgICAgfQotICAgICAgICBvbGRfZmxhZ3MgPSBmY250bCh0dHlfZmQsRl9HRVRGTCk7Ci0gICAgICAgIGZjbnRsKHR0eV9mZCxGX1NFVEZMLG9sZF9mbGFncyB8PSBPX05PTkJMT0NLKTsKLSAgICAgICAgdGNnZXRhdHRyKHR0eV9mZCwgJmNvbmYpOwotICAgICAgICBvbGRfY29uZiA9IGNvbmY7Ci0gICAgICAgIGNvbmYuY19sZmxhZyAmPSB+KElDQU5PTiB8IEVDSE8gfCBFQ0hPRSB8IEVDSE9LIHwgRUNIT05MIHwgTk9GTFNIIHwgSVNJRyk7Ci0gICAgICAgIGNvbmYuY19pZmxhZyAmPSB+KElTVFJJUCB8IElHTkNSIHwgSUNSTkwgfCBJTkxDUiB8IEJSS0lOVCB8IFBBUk1SSyB8IElOUENLIHwgSVVDTEMgfCBJWE9OIHwgSVhPRkYpOwotICAgICAgICBjb25mLmNfaWZsYWcgIHw9IChJR05CUksgfCBJR05QQVIpOwotICAgICAgICBjb25mLmNfY2NbVk1JTl0gPSAxOwotICAgICAgICBjb25mLmNfY2NbVlRJTUVdID0gMDsKLSAgICAgICAgY29uZi5jX2NjW1ZTVVNQXSA9IDA7Ci0gICAgICAgIHRjc2V0YXR0cih0dHlfZmQsIFRDU0FGTFVTSCwgJmNvbmYpOwotICAgICAgICBpb2N0bCh0dHlfZmQsIEtEU0tCTU9ERSwgS19NRURJVU1SQVcpOwotCi0gICAgICAgIC8qIENsZWFyIHRoZSBrZXlib2FyZCBzdGF0ZSBpbmZvcm1hdGlvbiAqLwotICAgICAgICBtZW1zZXQoa2V5X2Rvd24sIDAsIHNpemVvZihrZXlfZG93bikpOwotICAgICAgICBpb2N0bCh0dHlfZmQsS0RTRVRMRUQsa2V5X21vZGlmaWVycyA9IDApOwotCi0gICAgICAgIC8qIEluaXRpYWxpemUgdGhlIG1vdXNlIGNvbm5lY3Rpb24gCi0gICAgICAgICAgIFRoZSB1c2VyICpNVVNUKiBydW4gZ3BtIHdpdGggdGhlICBvcHRpb24gLVIgZm9yIHRoaXMgdG8gd29yayAob3IgaGF2ZSBhIE1vdXNlU3lzdGVtcyBtb3VzZSkKLSAgICAgICAgKi8KLSAgICAgICAgaWYoR3BtX09wZW4oJmdwbSwwKSA+IDApeyAvKiBHUE0gYXZhaWxhYmxlICovCi0gICAgICAgICAgICBpZiAoKGNvbm4gPSBvcGVuKEdQTV9OT0RFX0ZJRk8sT19SRE9OTFl8T19TWU5DKSkgPCAwKQotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJXRF9zdGFydEZ1bGxTY3JlZW46IENhbid0IG9wZW4gbW91c2UgY29ubmVjdGlvbi5cbiIpOwotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJXYXJuaW5nOiB3aGVuIG5vdCB1c2luZyBncG0gLVIsIG9ubHkgTW91c2VTeXN0ZW1zIG1pY2UgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4iKTsKLSAgICAgICAgICAgIGlmICgoY29ubiA9IG9wZW4oIi9kZXYvbW91c2UiLE9fUkRPTkxZfE9fU1lOQykpIDwgMCkKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiV0Rfc3RhcnRGdWxsU2NyZWVuOiBDYW4ndCBvcGVuIC9kZXYvbW91c2UuXG4iKTsKLSAgICAgICAgfQotICAgICAgICBHcG1fQ2xvc2UoKTsKLQotICAgICAgICAvKiBUT0RPOiBTY2FsZSB0aGUgbW91c2UgY29vcmRpbmF0ZXMgdG8gdGhlIHNwZWNpZmljIHJlc29sdXRpb24gKi8KLQotICAgICAgICAvKiBTYXZlIHRoZSBzdGF0ZSBvZiB0aGUgY29uc29sZSAqLwotICAgICAgICBpZiAoKHN0YXRlQnVmID0gbWFsbG9jKFBNX2dldENvbnNvbGVTdGF0ZVNpemUoKSkpID09IE5VTEwpIHsKLSAgICAgICAgICAgIHByaW50ZigiT3V0IG9mIG1lbW9yeSFcbiIpOwotICAgICAgICAgICAgZXhpdCgtMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIFBNX3NhdmVDb25zb2xlU3RhdGUoc3RhdGVCdWYsdHR5X2ZkKTsKLSAgICAgICAgaW5pdG1vZGUgPSBWQkVfZ2V0VmlkZW9Nb2RlKCk7Ci0KLSAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgc2lnbmFsIGhhbmRsZXIgZm9yIHRpbWVyIGV2ZW50cyAqLwotICAgICAgICBzaWduYWwoU0lHQUxSTSwgdGltZXJIYW5kbGVyKTsKLQotICAgICAgICAvKiBDYXB0dXJlIHRlcm1pbmF0aW9uIHNpZ25hbHMgc28gd2UgY2FuIGNsZWFuIHVwIHByb3Blcmx5ICovCi0gICAgICAgIHNpZ25hbChTSUdURVJNLCBleGl0SGFuZGxlcik7Ci0gICAgICAgIHNpZ25hbChTSUdJTlQsIGV4aXRIYW5kbGVyKTsKLSAgICAgICAgc2lnbmFsKFNJR1FVSVQsIGV4aXRIYW5kbGVyKTsKLSAgICAgICAgYXRleGl0KHJlc3RvcmVfdGVybSk7Ci0KLSAgICAgICAgLyogU2lnbmFsIHRoYXQgd2UgYXJlIGluc3RhbGxlZCAqLwotICAgICAgICBpbnN0YWxsZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgcmV0dXJuIGh3bmRNYWluOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUxldHMgdGhlIGxpYnJhcnkga25vdyB3aGVuIGZ1bGxzY3JlZW4gZ3JhcGhpY3MgbW9kZSBoYXMgYmVlbiBpbml0aWFsaXplZCBzbwotdGhhdCB3ZSBjYW4gcHJvcGVybHkgc2NhbGUgdGhlIG1vdXNlIGRyaXZlciBjb29yZGluYXRlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9XREFQSSBXRF9pbkZ1bGxTY3JlZW4odm9pZCkKLXsKLSAgICAvKiBOb3RoaW5nIHRvIGRvIGluIGhlcmUgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TdXNwZW5kcyBhbGwgb2Ygb3VyIGV2ZW50IGhhbmRsaW5nIG9wZXJhdGlvbnMuIFRoaXMgaXMgYWxzbyB1c2VkIHRvCi1kZS1pbnN0YWxsIHRoZSBldmVudCBoYW5kbGluZyBjb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX1dEQVBJIFdEX3Jlc3RvcmVHREkodm9pZCkKLXsKLSAgICByZXN0b3JlX3Rlcm0oKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci10aWNrcyAgIC0gTnVtYmVyIG9mIHRpY2tzIGJldHdlZW4gdGltZXIgdGljayBtZXNzYWdlcwotCi1SRVRVUk5TOgotUHJldmlvdXMgdmFsdWUgZm9yIHRoZSB0aW1lciB0aWNrIGV2ZW50IHNwYWNpbmcuCi0KLVJFTUFSS1M6Ci1UaGUgZXZlbnQgbW9kdWxlIHdpbGwgYXV0b21hdGljYWxseSBnZW5lcmF0ZSBwZXJpb2RpYyB0aW1lciB0aWNrIGV2ZW50cyBmb3IKLXlvdSwgd2l0aCAndGlja3MnIGJldHdlZW4gZWFjaCBldmVudCBwb3N0aW5nLiBJZiB5b3Ugc2V0IHRoZSB2YWx1ZSBvZgotJ3RpY2tzJyB0byAwLCB0aGUgdGltZXIgdGljayBldmVudHMgYXJlIHR1cm5lZCBvZmYuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IF9XREFQSSBXRF9zZXRUaW1lclRpY2soCi0gICAgaW50IHRpY2tzKQotewotICAgIGludCAgICAgICAgICAgICAgICAgb2xkOwotICAgIHN0cnVjdCBpdGltZXJ2YWwgICAgdGltOwotICAgIGxvbmcgICAgICAgICAgICAgICAgbXMgPSBUSUNLU19UT19VU0VDKHRpY2tzKTsKLQotICAgIGdldGl0aW1lcihJVElNRVJfUkVBTCwgJnRpbSk7Ci0gICAgb2xkID0gVVNFQ19UT19USUNLUyh0aW0uaXRfdmFsdWUudHZfc2VjKjEwMDAwMDAuMCArIHRpbS5pdF92YWx1ZS50dl91c2VjKTsKLSAgICB0aW0uaXRfaW50ZXJ2YWwudHZfc2VjICA9IG1zIC8gMTAwMDAwMDsKLSAgICB0aW0uaXRfaW50ZXJ2YWwudHZfdXNlYyA9IG1zICUgMTAwMDAwMDsKLSAgICBzZXRpdGltZXIoSVRJTUVSX1JFQUwsICZ0aW0sIE5VTEwpOwotICAgIHJldHVybiBvbGQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc2F2ZVN0YXRlICAgLSBBZGRyZXNzIG9mIHN1c3BlbmQgYXBwIGNhbGxiYWNrIHRvIHJlZ2lzdGVyCi0KLVJFTUFSS1M6Ci1SZWdpc3RlcnMgYSB1c2VyIGFwcGxpY2F0aW9uIHN1cHBsaWVkIHN1c3BlbmQgYXBwbGljYXRpb24gY2FsbGJhY2sgc28gdGhhdAotd2UgY2FuIHByb3Blcmx5IGhhbmRsZSB2aXJ0dWFsIHRlcm1pbmFsIHN3aXRjaGluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9XREFQSSBXRF9zZXRTdXNwZW5kQXBwQ2FsbGJhY2soCi0gICAgaW50IChfQVNNQVBJICpzYXZlU3RhdGUpKGludCBmbGFncykpCi17Ci0gIHN1c3BlbmRBcHBDYWxsYmFjayA9IHNhdmVTdGF0ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci14ICAgLSBOZXcgWCBjb29yZGluYXRlIHRvIG1vdmUgdGhlIG1vdXNlIGN1cnNvciB0bwoteSAgIC0gTmV3IFkgY29vcmRpbmF0ZSB0byBtb3ZlIHRoZSBtb3VzZSBjdXJzb3IgdG8KLQotUkVNQVJLUzoKLU1vdmVzIHRvIG1vdXNlIGN1cnNvciB0byB0aGUgc3BlY2lmaWVkIGNvb3JkaW5hdGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfV0RBUEkgV0Rfc2V0TW91c2VQb3MoCi0gICAgaW50IHgsCi0gICAgaW50IHkpCi17Ci0gICAgbXggPSB4OwotICAgIG15ID0geTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci14ICAgLSBQbGFjZSB0byBzdG9yZSBYIGNvb3JkaW5hdGUgb2YgbW91c2UgY3Vyc29yCi15ICAgLSBQbGFjZSB0byBzdG9yZSBZIGNvb3JkaW5hdGUgb2YgbW91c2UgY3Vyc29yCi0KLVJFTUFSS1M6Ci1SZWFkcyB0aGUgY3VycmVudCBtb3VzZSBjdXJzb3IgbG9jYXRpb24gaW50ICpzY3JlZW4qIGNvb3JkaW5hdGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX1dEQVBJIFdEX2dldE1vdXNlUG9zKAotICAgIGludCAqeCwKLSAgICBpbnQgKnkpCi17Ci0gICAgKnggPSBteDsKLSAgICAqeSA9IG15OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW1jYiAtIEFkZHJlc3Mgb2YgbW91c2UgY2FsbGJhY2sgZnVuY3Rpb24KLQotUkVNQVJLUzoKLVJlZ2lzdGVycyBhbiBhcHBsaWNhdGlvbiBzdXBwbGllZCBtb3VzZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZAotd2hlbmV2ZXIgdGhlIG1vdXNlIGN1cnNvciBtb3Zlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9XREFQSSBXRF9zZXRNb3VzZUNhbGxiYWNrKAotICAgIHZvaWQgKF9BU01BUEkgKm1jYikoaW50IHgsaW50IHkpKQotewotICAgIG1vdmVDdXJzb3IgPSBtY2I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgoteFJlcyAgICAtIE5ldyBYIHJlc29sdXRpb24gb2YgZ3JhcGhpY3MgbW9kZQoteVJlcyAgICAtIE5ldyBZIHJlc29sdXRpb24gb2YgZ3JhcGhpY3MgbW9kZQotCi1SRU1BUktTOgotVGhpcyBpcyBjYWxsZWQgdG8gaW5mb3JtIHRoZSBldmVudCBoYW5kbGluZyBjb2RlIHRoYXQgdGhlIHNjcmVlbiByZXNvbHV0aW9uCi1oYXMgY2hhbmdlZCBzbyB0aGF0IHRoZSBtb3VzZSBjb29yZGluYXRlcyBjYW4gYmUgc2NhbGVkIGFwcHJvcHJpYXRlbHkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfV0RBUEkgV0RfY2hhbmdlUmVzb2x1dGlvbigKLSAgICBpbnQgeFJlcywKLSAgICBpbnQgeVJlcykKLXsKLSAgICAvLyAgR3BtX0ZpdFZhbHVlcyh4UmVzLCB5UmVzKTsgIC8vID8/Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc2NhbmNvZGUgICAgLSBTY2FuIGNvZGUgdG8gY2hlY2sgaWYgYSBrZXkgaXMgZG93bgotCi1SRU1BUktTOgotRGV0ZXJtaW5lcyBpZiBhIHBhcnRpY3VsYXIga2V5IGlzIGRvd24gYmFzZWQgb24gdGhlIHNjYW4gY29kZSBmb3IgdGhlIGtleS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBfV0RBUEkgV0RfaXNLZXlEb3duKAotICAgIHVjaGFyIHNjYW5jb2RlKQoteyAgIAotICAgIHJldHVybiBrZXlfZG93bltzY2FuY29kZV07Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGV0ZXJtaW5lcyBpZiB0aGUgYXBwbGljYXRpb24gbmVlZHMgdG8gcnVuIGluIHNhZmUgbW9kZS4gTm90IG5lY2Vzc2FyeSBmb3IKLWFueXRoaW5nIGJ1dCBicm9rZW4gV2luZG93cyA5NSBkaXNwbGF5IGRyaXZlcnMgc28gd2UgcmV0dXJuIGZhbHNlIGZvcgotTGludXguCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IF9XREFQSSBXRF9pc1NhZmVNb2RlKHZvaWQpCi17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L29zaGRyLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9saW51eC9vc2hkci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWRlZGZiLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L29zaGRyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgTGludXgKLSoKLSogRGVzY3JpcHRpb246ICBJbmNsdWRlIGFsbCB0aGUgT1Mgc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXlib2FyZC5oPgotI2luY2x1ZGUgPGxpbnV4L2tkLmg+Ci0jaW5jbHVkZSA8bGludXgvdnQuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2lmZGVmIFVTRV9PU19KT1lTVElDSwotI2luY2x1ZGUgPGxpbnV4L2pveXN0aWNrLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDx0ZXJtaW9zLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotLyogSW50ZXJuYWwgZ2xvYmFsIHZhcmlhYmxlcyAqLwotCi1leHRlcm4gaW50IF9QTV9jb25zb2xlX2ZkLF9QTV9sZWRzLF9QTV9tb2RpZmllcnM7Ci0KLS8qIEludGVybmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KLQotdm9pZCBfUE1fcmVzdG9yZV9rYl9tb2RlKHZvaWQpOwotdm9pZCBfUE1fa2V5Ym9hcmRfcmF3bW9kZSh2b2lkKTsKLQotLyogTGludXggbmVlZHMgdGhlIGdlbmVyaWMgam95c3RpY2sgc2NhbGluZyBjb2RlICovCi0KLSNkZWZpbmUgTkVFRF9TQ0FMRV9KT1lfQVhJUwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvcG0uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L3BtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMmE4MzUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvcG0uYworKysgL2Rldi9udWxsCkBAIC0xLDE4MDkgKzAsMCBAQAotOy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICAgICAgICAgICAgICAgICBQb3J0aW9ucyBjb3B5cmlnaHQgKEMpIEpvc2ggVmFuZGVyaG9vZgotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIExpbnV4Ci0qCi0qIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnksIHdoaWNoCi0qICAgICAgICAgICAgICAgY29udGFpbnMgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBPUyBzcGVjaWZpYyBzZXJ2aWNlcyBpbiBhCi0qICAgICAgICAgICAgICAgZ2VuZXJpYywgY3Jvc3MgcGxhdGZvcm0gQVBJLiBQb3J0aW5nIHRoZSBPUyBQb3J0YWJpbGl0eQotKiAgICAgICAgICAgICAgIE1hbmFnZXIgbGlicmFyeSBpcyB0aGUgZmlyc3Qgc3RlcCB0byBwb3J0aW5nIGFueSBTY2lUZWNoCi0qICAgICAgICAgICAgICAgcHJvZHVjdHMgdG8gYSBuZXcgcGxhdGZvcm0uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJkcnZsaWIvb3Mvb3MuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8c3lzL2tkLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdnQuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8dGVybWlvcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzY2FsbC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0jaWZkZWYgRU5BQkxFX01UUlIKLSNpbmNsdWRlIDxhc20vbXRyci5oPgotI2VuZGlmCi0jaW5jbHVkZSA8YXNtL3ZtODYuaD4KLSNpZmRlZiBfX0dMSUJDX18KLSNpbmNsdWRlIDxzeXMvcGVybS5oPgotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgUkVBTF9NRU1fQkFTRSAgICAgICAoKHZvaWQgKikweDEwMDAwKQotI2RlZmluZSBSRUFMX01FTV9TSVpFICAgICAgIDB4MTAwMDAKLSNkZWZpbmUgUkVBTF9NRU1fQkxPQ0tTICAgICAweDEwMAotI2RlZmluZSBERUZBVUxUX1ZNODZfRkxBR1MgIChJRl9NQVNLIHwgSU9QTF9NQVNLKQotI2RlZmluZSBERUZBVUxUX1NUQUNLX1NJWkUgIDB4MTAwMAotI2RlZmluZSBSRVRVUk5fVE9fMzJfSU5UICAgIDI1NQotCi0vKiBRdWljayBhbmQgZGlydHkgZml4IGZvciB2bTg2KCkgc3lzY2FsbCBmcm9tIGxybWkgMC42ICovCi1zdGF0aWMgaW50Ci12bTg2KHN0cnVjdCB2bTg2X3N0cnVjdCAqdm0pCi0gICAgewotICAgIGludCByOwotI2lmZGVmIF9fUElDX18KLSAgICBhc20gdm9sYXRpbGUgKAotICAgICAicHVzaGwgJSVlYnhcblx0IgotICAgICAibW92bCAlMiwgJSVlYnhcblx0IgotICAgICAiaW50ICQweDgwXG5cdCIKLSAgICAgInBvcGwgJSVlYngiCi0gICAgIDogIj1hIiAocikKLSAgICAgOiAiMCIgKDExMyksICJyIiAodm0pKTsKLSNlbHNlCi0gICAgYXNtIHZvbGF0aWxlICgKLSAgICAgImludCAkMHg4MCIKLSAgICAgOiAiPWEiIChyKQotICAgICA6ICIwIiAoMTEzKSwgImIiICh2bSkpOwotI2VuZGlmCi0gICAgcmV0dXJuIHI7Ci0gICAgfQotCi0KLXN0YXRpYyBzdHJ1Y3QgewotICAgIGludCAgICAgICAgICAgICAgICAgcmVhZHk7Ci0gICAgdW5zaWduZWQgc2hvcnQgICAgICByZXRfc2VnLCByZXRfb2ZmOwotICAgIHVuc2lnbmVkIHNob3J0ICAgICAgc3RhY2tfc2VnLCBzdGFja19vZmY7Ci0gICAgc3RydWN0IHZtODZfc3RydWN0ICB2bTsKLSAgICB9IGNvbnRleHQgPSB7MH07Ci0KLXN0cnVjdCBtZW1fYmxvY2sgewotICAgIHVuc2lnbmVkIGludCBzaXplIDogMjA7Ci0gICAgdW5zaWduZWQgaW50IGZyZWUgOiAxOwotICAgIH07Ci0KLXN0YXRpYyBzdHJ1Y3QgewotICAgIGludCByZWFkeTsKLSAgICBpbnQgY291bnQ7Ci0gICAgc3RydWN0IG1lbV9ibG9jayBibG9ja3NbUkVBTF9NRU1fQkxPQ0tTXTsKLSAgICB9IG1lbV9pbmZvID0gezB9OwotCi1pbnQgICAgICAgICAgICAgICAgICAgICBfUE1fY29uc29sZV9mZCA9IC0xOwotaW50ICAgICAgICAgICAgICAgICAgICAgX1BNX2xlZHMgPSAwLF9QTV9tb2RpZmllcnMgPSAwOwotc3RhdGljIGlib29sICAgICAgICAgICAgaW5pdGVkID0gZmFsc2U7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICB0dHlfdmMgPSAwOwotc3RhdGljIGludCAgICAgICAgICAgICAgY29uc29sZV9jb3VudCA9IDA7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICBzdGFydHVwX3ZjOwotc3RhdGljIGludCAgICAgICAgICAgICAgZmRfbWVtID0gMDsKLXN0YXRpYyBpYm9vbCAgICAgICAgICAgIGluX3Jhd19tb2RlID0gZmFsc2U7Ci0jaWZkZWYgRU5BQkxFX01UUlIKLXN0YXRpYyBpbnQgICAgICAgICAgICAgIG10cnJfZmQ7Ci0jZW5kaWYKLXN0YXRpYyB1aW50IFZFU0FCdWZfbGVuID0gMTAyNDsgICAgIC8qIExlbmd0aCBvZiB0aGUgVkVTQUJ1ZiBidWZmZXIgICAgICovCi1zdGF0aWMgdm9pZCAqVkVTQUJ1Zl9wdHIgPSBOVUxMOyAgICAvKiBOZWFyIHBvaW50ZXIgdG8gVkVTQUJ1ZiAgICAgICAgICAqLwotc3RhdGljIHVpbnQgVkVTQUJ1Zl9yc2VnOyAgICAgICAgICAgLyogUmVhbCBtb2RlIHNlZ21lbnQgb2YgVkVTQUJ1ZiAgICAgKi8KLXN0YXRpYyB1aW50IFZFU0FCdWZfcm9mZjsgICAgICAgICAgIC8qIFJlYWwgbW9kZSBvZmZzZXQgb2YgVkVTQUJ1ZiAgICAgICovCi0jaWZkZWYgVFJBQ0VfSU8KLXN0YXRpYyB1bG9uZyAgICAgICAgICAgIHRyYWNlQWRkcjsKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCAoUE1BUElQIGZhdGFsRXJyb3JDbGVhbnVwKSh2b2lkKSA9IE5VTEw7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiAgVFJBQ0VfSU8KLWV4dGVybiB2b2lkIHByaW50ayhjaGFyICptc2csLi4uKTsKLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIHZvaWQgcG9ydF9vdXQoaW50IHZhbHVlLCBpbnQgcG9ydCkKLXsKLSNpZmRlZiBUUkFDRV9JTwotICAgIHByaW50aygiJTA0WDolMDRYOiBvdXRiLiUwNFggPC0gJTAyWFxuIiwgdHJhY2VBZGRyID4+IDE2LCB0cmFjZUFkZHIgJiAweEZGRkYsICh1c2hvcnQpcG9ydCwgKHVjaGFyKXZhbHVlKTsKLSNlbmRpZgotICAgIGFzbSB2b2xhdGlsZSAoIm91dGIgJTAsJTEiCi0JICA6OiJhIiAoKHVuc2lnbmVkIGNoYXIpIHZhbHVlKSwgImQiKCh1bnNpZ25lZCBzaG9ydCkgcG9ydCkpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcG9ydF9vdXR3KGludCB2YWx1ZSwgaW50IHBvcnQpCi17Ci0jaWZkZWYgVFJBQ0VfSU8KLSAgICBwcmludGsoIiUwNFg6JTA0WDogb3V0dy4lMDRYIDwtICUwNFhcbiIsIHRyYWNlQWRkciA+PiAxNix0cmFjZUFkZHIgJiAweEZGRkYsICh1c2hvcnQpcG9ydCwgKHVzaG9ydCl2YWx1ZSk7Ci0jZW5kaWYKLSAgICBhc20gdm9sYXRpbGUgKCJvdXR3ICUwLCUxIgotCSA6OiJhIiAoKHVuc2lnbmVkIHNob3J0KSB2YWx1ZSksICJkIigodW5zaWduZWQgc2hvcnQpIHBvcnQpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHBvcnRfb3V0bChpbnQgdmFsdWUsIGludCBwb3J0KQotewotI2lmZGVmIFRSQUNFX0lPCi0gICAgcHJpbnRrKCIlMDRYOiUwNFg6IG91dGwuJTA0WCA8LSAlMDhYXG4iLCB0cmFjZUFkZHIgPj4gMTYsdHJhY2VBZGRyICYgMHhGRkZGLCAodXNob3J0KXBvcnQsICh1bG9uZyl2YWx1ZSk7Ci0jZW5kaWYKLSAgICBhc20gdm9sYXRpbGUgKCJvdXRsICUwLCUxIgotCSA6OiJhIiAoKHVuc2lnbmVkIGxvbmcpIHZhbHVlKSwgImQiKCh1bnNpZ25lZCBzaG9ydCkgcG9ydCkpOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBwb3J0X2luKGludCBwb3J0KQotewotICAgIHVuc2lnbmVkIGNoYXIgdmFsdWU7Ci0gICAgYXNtIHZvbGF0aWxlICgiaW5iICUxLCUwIgotCSAgICAgIDoiPWEiICgodW5zaWduZWQgY2hhcil2YWx1ZSkKLQkgICAgICA6ImQiKCh1bnNpZ25lZCBzaG9ydCkgcG9ydCkpOwotI2lmZGVmIFRSQUNFX0lPCi0gICAgcHJpbnRrKCIlMDRYOiUwNFg6ICBpbmIuJTA0WCAtPiAlMDJYXG4iLCB0cmFjZUFkZHIgPj4gMTYsdHJhY2VBZGRyICYgMHhGRkZGLCAodXNob3J0KXBvcnQsICh1Y2hhcil2YWx1ZSk7Ci0jZW5kaWYKLSAgICByZXR1cm4gdmFsdWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHBvcnRfaW53KGludCBwb3J0KQotewotICAgIHVuc2lnbmVkIHNob3J0IHZhbHVlOwotICAgIGFzbSB2b2xhdGlsZSAoImludyAlMSwlMCIKLQkgICAgICA6Ij1hIiAoKHVuc2lnbmVkIHNob3J0KXZhbHVlKQotCSAgICAgIDoiZCIoKHVuc2lnbmVkIHNob3J0KSBwb3J0KSk7Ci0jaWZkZWYgVFJBQ0VfSU8KLSAgICBwcmludGsoIiUwNFg6JTA0WDogIGludy4lMDRYIC0+ICUwNFhcbiIsIHRyYWNlQWRkciA+PiAxNix0cmFjZUFkZHIgJiAweEZGRkYsICh1c2hvcnQpcG9ydCwgKHVzaG9ydCl2YWx1ZSk7Ci0jZW5kaWYKLSAgICByZXR1cm4gdmFsdWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHBvcnRfaW5sKGludCBwb3J0KQotewotICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gICAgYXNtIHZvbGF0aWxlICgiaW5sICUxLCUwIgotCSAgICAgIDoiPWEiICgodW5zaWduZWQgbG9uZyl2YWx1ZSkKLQkgICAgICA6ImQiKCh1bnNpZ25lZCBzaG9ydCkgcG9ydCkpOwotI2lmZGVmIFRSQUNFX0lPCi0gICAgcHJpbnRrKCIlMDRYOiUwNFg6ICBpbmwuJTA0WCAtPiAlMDhYXG4iLCB0cmFjZUFkZHIgPj4gMTYsdHJhY2VBZGRyICYgMHhGRkZGLCAodXNob3J0KXBvcnQsICh1bG9uZyl2YWx1ZSk7Ci0jZW5kaWYKLSAgICByZXR1cm4gdmFsdWU7Ci19Ci0KLXN0YXRpYyBpbnQgcmVhbF9tZW1faW5pdCh2b2lkKQotewotICAgIHZvaWQgICAgKm07Ci0gICAgaW50ICAgICBmZF96ZXJvOwotCi0gICAgaWYgKG1lbV9pbmZvLnJlYWR5KQotCXJldHVybiAxOwotCi0gICAgaWYgKChmZF96ZXJvID0gb3BlbigiL2Rldi96ZXJvIiwgT19SRE9OTFkpKSA9PSAtMSkKLQlQTV9mYXRhbEVycm9yKCJZb3UgbXVzdCBoYXZlIHJvb3QgcHJpdmxlZGdlcyB0byBydW4gdGhpcyBwcm9ncmFtISIpOwotICAgIGlmICgobSA9IG1tYXAoKHZvaWQgKilSRUFMX01FTV9CQVNFLCBSRUFMX01FTV9TSVpFLAotCSAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFIHwgUFJPVF9FWEVDLAotCSAgICBNQVBfRklYRUQgfCBNQVBfUFJJVkFURSwgZmRfemVybywgMCkpID09ICh2b2lkICopLTEpIHsKLQljbG9zZShmZF96ZXJvKTsKLQlQTV9mYXRhbEVycm9yKCJZb3UgbXVzdCBoYXZlIHJvb3QgcHJpdmxlZGdlcyB0byBydW4gdGhpcyBwcm9ncmFtISIpOwotCX0KLSAgICBtZW1faW5mby5yZWFkeSA9IDE7Ci0gICAgbWVtX2luZm8uY291bnQgPSAxOwotICAgIG1lbV9pbmZvLmJsb2Nrc1swXS5zaXplID0gUkVBTF9NRU1fU0laRTsKLSAgICBtZW1faW5mby5ibG9ja3NbMF0uZnJlZSA9IDE7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGluc2VydF9ibG9jayhpbnQgaSkKLXsKLSAgICBtZW1tb3ZlKAotCW1lbV9pbmZvLmJsb2NrcyArIGkgKyAxLAotCW1lbV9pbmZvLmJsb2NrcyArIGksCi0JKG1lbV9pbmZvLmNvdW50IC0gaSkgKiBzaXplb2Yoc3RydWN0IG1lbV9ibG9jaykpOwotICAgIG1lbV9pbmZvLmNvdW50Kys7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlbGV0ZV9ibG9jayhpbnQgaSkKLXsKLSAgICBtZW1faW5mby5jb3VudC0tOwotCi0gICAgbWVtbW92ZSgKLQltZW1faW5mby5ibG9ja3MgKyBpLAotCW1lbV9pbmZvLmJsb2NrcyArIGkgKyAxLAotCShtZW1faW5mby5jb3VudCAtIGkpICogc2l6ZW9mKHN0cnVjdCBtZW1fYmxvY2spKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNldF9iaXQodW5zaWduZWQgaW50IGJpdCwgdm9pZCAqYXJyYXkpCi17Ci0gICAgdW5zaWduZWQgY2hhciAqYSA9IGFycmF5OwotICAgIGFbYml0IC8gOF0gfD0gKDEgPDwgKGJpdCAlIDgpKTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X2ludF9zZWcoaW50IGkpCi17Ci0gICAgcmV0dXJuICoodW5zaWduZWQgc2hvcnQgKikoaSAqIDQgKyAyKTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X2ludF9vZmYoaW50IGkpCi17Ci0gICAgcmV0dXJuICoodW5zaWduZWQgc2hvcnQgKikoaSAqIDQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcHVzaHcodW5zaWduZWQgc2hvcnQgaSkKLXsKLSAgICBzdHJ1Y3Qgdm04Nl9yZWdzICpyID0gJmNvbnRleHQudm0ucmVnczsKLSAgICByLT5lc3AgLT0gMjsKLSAgICAqKHVuc2lnbmVkIHNob3J0ICopKCgodW5zaWduZWQgaW50KXItPnNzIDw8IDQpICsgci0+ZXNwKSA9IGk7Ci19Ci0KLWlib29sIFBNQVBJIFBNX2hhdmVCSU9TQWNjZXNzKHZvaWQpCi17IHJldHVybiB0cnVlOyB9Ci0KLXZvaWQgUE1BUEkgUE1faW5pdCh2b2lkKQotewotICAgIHZvaWQgICAgKm07Ci0gICAgdWludCAgICByX3NlZyxyX29mZjsKLQotICAgIGlmIChpbml0ZWQpCi0JcmV0dXJuOwotCi0gICAgLyogTWFwIHRoZSBJbnRlcnJ1cHQgVmVjdG9ycyAoMHgwIC0gMHg0MDApICsgQklPUyBkYXRhICgweDQwMCAtIDB4NTAyKQotICAgICAqIGFuZCB0aGUgcGh5c2ljYWwgZnJhbWVidWZmZXIgYW5kIFJPTSBpbWFnZXMgZnJvbSAoMHhhMDAwMCAtIDB4MTAwMDAwKQotICAgICAqLwotICAgIHJlYWxfbWVtX2luaXQoKTsKLSAgICBpZiAoIWZkX21lbSAmJiAoZmRfbWVtID0gb3BlbigiL2Rldi9tZW0iLCBPX1JEV1IpKSA9PSAtMSkgewotCVBNX2ZhdGFsRXJyb3IoIllvdSBtdXN0IGhhdmUgcm9vdCBwcml2aWxlZ2VzIHRvIHJ1biB0aGlzIHByb2dyYW0hIik7Ci0JfQotICAgIGlmICgobSA9IG1tYXAoKHZvaWQgKikwLCAweDUwMiwKLQkgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSB8IFBST1RfRVhFQywKLQkgICAgTUFQX0ZJWEVEIHwgTUFQX1BSSVZBVEUsIGZkX21lbSwgMCkpID09ICh2b2lkICopLTEpIHsKLQlQTV9mYXRhbEVycm9yKCJZb3UgbXVzdCBoYXZlIHJvb3QgcHJpdmlsZWdlcyB0byBydW4gdGhpcyBwcm9ncmFtISIpOwotCX0KLSAgICBpZiAoKG0gPSBtbWFwKCh2b2lkICopMHhBMDAwMCwgMHhDMDAwMCAtIDB4QTAwMDAsCi0JICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9GSVhFRCB8IE1BUF9TSEFSRUQsIGZkX21lbSwgMHhBMDAwMCkpID09ICh2b2lkICopLTEpIHsKLQlQTV9mYXRhbEVycm9yKCJZb3UgbXVzdCBoYXZlIHJvb3QgcHJpdmlsZWdlcyB0byBydW4gdGhpcyBwcm9ncmFtISIpOwotCX0KLSAgICBpZiAoKG0gPSBtbWFwKCh2b2lkICopMHhDMDAwMCwgMHhEMDAwMCAtIDB4QzAwMDAsCi0JICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUgfCBQUk9UX0VYRUMsCi0JICAgIE1BUF9GSVhFRCB8IE1BUF9QUklWQVRFLCBmZF9tZW0sIDB4QzAwMDApKSA9PSAodm9pZCAqKS0xKSB7Ci0JUE1fZmF0YWxFcnJvcigiWW91IG11c3QgaGF2ZSByb290IHByaXZpbGVnZXMgdG8gcnVuIHRoaXMgcHJvZ3JhbSEiKTsKLQl9Ci0gICAgaWYgKChtID0gbW1hcCgodm9pZCAqKTB4RDAwMDAsIDB4MTAwMDAwIC0gMHhEMDAwMCwKLQkgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkgICAgTUFQX0ZJWEVEIHwgTUFQX1NIQVJFRCwgZmRfbWVtLCAweEQwMDAwKSkgPT0gKHZvaWQgKiktMSkgewotCVBNX2ZhdGFsRXJyb3IoIllvdSBtdXN0IGhhdmUgcm9vdCBwcml2aWxlZ2VzIHRvIHJ1biB0aGlzIHByb2dyYW0hIik7Ci0JfQotICAgIGluaXRlZCA9IDE7Ci0KLSAgICAvKiBBbGxvY2F0ZSBhIHN0YWNrICovCi0gICAgbSA9IFBNX2FsbG9jUmVhbFNlZyhERUZBVUxUX1NUQUNLX1NJWkUsJnJfc2VnLCZyX29mZik7Ci0gICAgY29udGV4dC5zdGFja19zZWcgPSByX3NlZzsKLSAgICBjb250ZXh0LnN0YWNrX29mZiA9IHJfb2ZmK0RFRkFVTFRfU1RBQ0tfU0laRTsKLQotICAgIC8qIEFsbG9jYXRlIHRoZSByZXR1cm4gdG8gMzIgYml0IHJvdXRpbmUgKi8KLSAgICBtID0gUE1fYWxsb2NSZWFsU2VnKDIsJnJfc2VnLCZyX29mZik7Ci0gICAgY29udGV4dC5yZXRfc2VnID0gcl9zZWc7Ci0gICAgY29udGV4dC5yZXRfb2ZmID0gcl9vZmY7Ci0gICAgKCh1Y2hhciopbSlbMF0gPSAweENEOyAgICAgICAgIC8qIGludCBvcGNvZGUgKi8KLSAgICAoKHVjaGFyKiltKVsxXSA9IFJFVFVSTl9UT18zMl9JTlQ7Ci0gICAgbWVtc2V0KCZjb250ZXh0LnZtLCAwLCBzaXplb2YoY29udGV4dC52bSkpOwotCi0gICAgLyogRW5hYmxlIGtlcm5lbCBlbXVsYXRpb24gb2YgYWxsIGludHMgZXhjZXB0IFJFVFVSTl9UT18zMl9JTlQgKi8KLSAgICBtZW1zZXQoJmNvbnRleHQudm0uaW50X3JldmVjdG9yZWQsIDAsIHNpemVvZihjb250ZXh0LnZtLmludF9yZXZlY3RvcmVkKSk7Ci0gICAgc2V0X2JpdChSRVRVUk5fVE9fMzJfSU5ULCAmY29udGV4dC52bS5pbnRfcmV2ZWN0b3JlZCk7Ci0gICAgY29udGV4dC5yZWFkeSA9IDE7Ci0jaWZkZWYgRU5BQkxFX01UUlIKLSAgICBtdHJyX2ZkID0gIG9wZW4oIi9kZXYvY3B1L210cnIiLCBPX1JEV1IsIDApOwotICAgIGlmIChtdHJyX2ZkIDwgMCkKLSAgICAgICBtdHJyX2ZkID0gIG9wZW4oIi9wcm9jL210cnIiLCBPX1JEV1IsIDApOwotI2VuZGlmCi0gICAgLyogRW5hYmxlIEkvTyBwZXJtaXNzaW9ucyB0byBkaXJlY3RseSBhY2Nlc3MgSS9PIHBvcnRzLiBXZSBicmVhayB0aGUKLSAgICAgKiBhbGxvY2F0aW9uIGludG8gdHdvIHBhcnRzLCBvbmUgZm9yIHRoZSBwb3J0cyBmcm9tIDAtMHgzRkYgYW5kCi0gICAgICogYW5vdGhlciBmb3IgdGhlIHJlbWFpbmluZyBwb3J0cyB1cCB0byAweEZGRkYuIFN0YW5kYXJkIExpbnV4IGtlcm5lbHMKLSAgICAgKiBvbmx5IGFsbG93IHRoZSBmaXJzdCAweDQwMCBwb3J0cyB0byBiZSBlbmFibGVkLCBzbyB0byBlbmFibGUgYWxsCi0gICAgICogNjU1MzYgcG9ydHMgeW91IG5lZWQgYSBwYXRjaGVkIGtlcm5lbCB0aGF0IHdpbGwgZW5hYmxlIHRoZSBmdWxsCi0gICAgICogOEtiIEkvTyBwZXJtaXNzaW9ucyBiaXRtYXAuCi0gICAgICovCi0jaWZuZGVmIFRSQUNFX0lPCi0gICAgaW9wZXJtKDB4MCwweDQwMCwxKTsKLSAgICBpb3Blcm0oMHg0MDAsMHgxMDAwMC0weDQwMCwxKTsKLSNlbmRpZgotICAgIGlvcGwoMyk7Ci19Ci0KLWxvbmcgUE1BUEkgUE1fZ2V0T1NUeXBlKHZvaWQpCi17IHJldHVybiBfT1NfTElOVVg7IH0KLQotaW50IFBNQVBJIFBNX2dldE1vZGVUeXBlKHZvaWQpCi17IHJldHVybiBQTV8zODY7IH0KLQotdm9pZCBQTUFQSSBQTV9iYWNrc2xhc2goY2hhciAqcykKLXsKLSAgICB1aW50IHBvcyA9IHN0cmxlbihzKTsKLSAgICBpZiAoc1twb3MtMV0gIT0gJy8nKSB7Ci0Jc1twb3NdID0gJy8nOwotCXNbcG9zKzFdID0gJ1wwJzsKLQl9Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0RmF0YWxFcnJvckNsZWFudXAoCi0gICAgdm9pZCAoUE1BUElQIGNsZWFudXApKHZvaWQpKQotewotICAgIGZhdGFsRXJyb3JDbGVhbnVwID0gY2xlYW51cDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mYXRhbEVycm9yKGNvbnN0IGNoYXIgKm1zZykKLXsKLSAgICBpZiAoZmF0YWxFcnJvckNsZWFudXApCi0JZmF0YWxFcnJvckNsZWFudXAoKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwiJXNcbiIsIG1zZyk7Ci0gICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgZXhpdCgxKTsKLX0KLQotc3RhdGljIHZvaWQgRXhpdFZCRUJ1Zih2b2lkKQotewotICAgIGlmIChWRVNBQnVmX3B0cikKLQlQTV9mcmVlUmVhbFNlZyhWRVNBQnVmX3B0cik7Ci0gICAgVkVTQUJ1Zl9wdHIgPSAwOwotfQotCi12b2lkICogUE1BUEkgUE1fZ2V0VkVTQUJ1Zih1aW50ICpsZW4sdWludCAqcnNlZyx1aW50ICpyb2ZmKQotewotICAgIGlmICghVkVTQUJ1Zl9wdHIpIHsKLQkvKiBBbGxvY2F0ZSBhIGdsb2JhbCBidWZmZXIgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgVkVTQSBWQkUgKi8KLQlpZiAoKFZFU0FCdWZfcHRyID0gUE1fYWxsb2NSZWFsU2VnKFZFU0FCdWZfbGVuLCAmVkVTQUJ1Zl9yc2VnLCAmVkVTQUJ1Zl9yb2ZmKSkgPT0gTlVMTCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JYXRleGl0KEV4aXRWQkVCdWYpOwotCX0KLSAgICAqbGVuID0gVkVTQUJ1Zl9sZW47Ci0gICAgKnJzZWcgPSBWRVNBQnVmX3JzZWc7Ci0gICAgKnJvZmYgPSBWRVNBQnVmX3JvZmY7Ci0gICAgcmV0dXJuIFZFU0FCdWZfcHRyOwotfQotCi0vKiBOZXcgcmF3IGNvbnNvbGUgYmFzZWQgZ2V0Y2ggYW5kIGtiaGl0IGZ1bmN0aW9ucyAqLwotCi0jZGVmaW5lIEtCX0NBUFMgICAgIExFRF9DQVAgLyogNCAqLwotI2RlZmluZSBLQl9OVU1MT0NLICBMRURfTlVNIC8qIDIgKi8KLSNkZWZpbmUgS0JfU0NST0xMICAgTEVEX1NDUiAvKiAxICovCi0jZGVmaW5lIEtCX1NISUZUICAgIDgKLSNkZWZpbmUgS0JfQ09OVFJPTCAgMTYKLSNkZWZpbmUgS0JfQUxUICAgICAgMzIKLQotLyogU3RydWN0dXJlIHVzZWQgdG8gc2F2ZSB0aGUga2V5Ym9hcmQgbW9kZSB0byBkaXNrLiBXZSBzYXZlIGl0IHRvIGRpc2sKLSAqIHNvIHRoYXQgd2UgY2FuIHByb3Blcmx5IHJlc3RvcmUgdGhlIG1vZGUgbGF0ZXIgaWYgdGhlIHByb2dyYW0gY3Jhc2hlZC4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgc3RydWN0IHRlcm1pb3MgIHRlcm1pb3M7Ci0gICAgaW50ICAgICAgICAgICAgIGtiX21vZGU7Ci0gICAgaW50ICAgICAgICAgICAgIGxlZHM7Ci0gICAgaW50ICAgICAgICAgICAgIGZsYWdzOwotICAgIGludCAgICAgICAgICAgICBzdGFydHVwX3ZjOwotICAgIH0ga2V5Ym9hcmRfbW9kZTsKLQotLyogTmFtZSBvZiB0aGUgZmlsZSB1c2VkIHRvIHNhdmUga2V5Ym9hcmQgbW9kZSBpbmZvcm1hdGlvbiAqLwotCi0jZGVmaW5lIEtCTU9ERV9EQVQgICJrYm1vZGUuZGF0IgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU9wZW4gdGhlIGtleWJvYXJkIG1vZGUgZmlsZSBvbiBkaXNrLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBGSUxFICpvcGVuX2tiX21vZGUoCi0gICAgY2hhciAqbW9kZSwKLSAgICBjaGFyICpwYXRoKQotewotICAgIGlmICghUE1fZmluZEJQRCgiZ3JhcGhpY3MuYnBkIixwYXRoKSkKLQlyZXR1cm4gTlVMTDsKLSAgICBQTV9iYWNrc2xhc2gocGF0aCk7Ci0gICAgc3RyY2F0KHBhdGgsS0JNT0RFX0RBVCk7Ci0gICAgcmV0dXJuIGZvcGVuKHBhdGgsbW9kZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVzdG9yZSB0aGUga2V5Ym9hcmQgdG8gbm9ybWFsIG1vZGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9QTV9yZXN0b3JlX2tiX21vZGUodm9pZCkKLXsKLSAgICBGSUxFICAgICAgICAgICAgKmtibW9kZTsKLSAgICBrZXlib2FyZF9tb2RlICAgbW9kZTsKLSAgICBjaGFyICAgICAgICAgICAgcGF0aFtQTV9NQVhfUEFUSF07Ci0KLSAgICBpZiAoX1BNX2NvbnNvbGVfZmQgIT0gLTEgJiYgKGtibW9kZSA9IG9wZW5fa2JfbW9kZSgicmIiLHBhdGgpKSAhPSBOVUxMKSB7Ci0JaWYgKGZyZWFkKCZtb2RlLDEsc2l6ZW9mKG1vZGUpLGtibW9kZSkgPT0gc2l6ZW9mKG1vZGUpKSB7Ci0JICAgIGlmIChtb2RlLnN0YXJ0dXBfdmMgPiAwKQotCQlpb2N0bChfUE1fY29uc29sZV9mZCwgVlRfQUNUSVZBVEUsIG1vZGUuc3RhcnR1cF92Yyk7Ci0JICAgIGlvY3RsKF9QTV9jb25zb2xlX2ZkLCBLRFNLQk1PREUsIG1vZGUua2JfbW9kZSk7Ci0JICAgIGlvY3RsKF9QTV9jb25zb2xlX2ZkLCBLRFNFVExFRCwgbW9kZS5sZWRzKTsKLQkgICAgdGNzZXRhdHRyKF9QTV9jb25zb2xlX2ZkLCBUQ1NBRkxVU0gsICZtb2RlLnRlcm1pb3MpOwotCSAgICBmY250bChfUE1fY29uc29sZV9mZCxGX1NFVEZMLG1vZGUuZmxhZ3MpOwotCSAgICB9Ci0JZmNsb3NlKGtibW9kZSk7Ci0JdW5saW5rKHBhdGgpOwotCWluX3Jhd19tb2RlID0gZmFsc2U7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNhZmVseSBhYm9ydCB0aGUgZXZlbnQgbW9kdWxlIHVwb24gY2F0Y2hpbmcgYSBmYXRhbCBlcnJvci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9QTV9hYm9ydCgKLSAgICBpbnQgc2lnbm8pCi17Ci0gICAgY2hhciAgICBidWZbODBdOwotCi0gICAgc3ByaW50ZihidWYsIlRlcm1pbmF0aW5nIG9uIHNpZ25hbCAlZCIsc2lnbm8pOwotICAgIF9QTV9yZXN0b3JlX2tiX21vZGUoKTsKLSAgICBQTV9mYXRhbEVycm9yKGJ1Zik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUHV0IHRoZSBrZXlib2FyZCBpbnRvIHJhdyBtb2RlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfUE1fa2V5Ym9hcmRfcmF3bW9kZSh2b2lkKQotewotICAgIHN0cnVjdCB0ZXJtaW9zIGNvbmY7Ci0gICAgRklMRSAgICAgICAgICAgICprYm1vZGU7Ci0gICAga2V5Ym9hcmRfbW9kZSAgIG1vZGU7Ci0gICAgY2hhciAgICAgICAgICAgIHBhdGhbUE1fTUFYX1BBVEhdOwotICAgIGludCAgICAgICAgICAgICBpOwotICAgIHN0YXRpYyBpbnQgc2lnX2xpc3RbXSA9IHsKLQlTSUdIVVAsCi0JU0lHSU5ULAotCVNJR1FVSVQsCi0JU0lHSUxMLAotCVNJR1RSQVAsCi0JU0lHQUJSVCwKLQlTSUdJT1QsCi0JU0lHQlVTLAotCVNJR0ZQRSwKLQlTSUdLSUxMLAotCVNJR1NFR1YsCi0JU0lHVEVSTSwKLQl9OwotCi0gICAgaWYgKChrYm1vZGUgPSBvcGVuX2tiX21vZGUoInJiIixwYXRoKSkgPT0gTlVMTCkgewotCWlmICgoa2Jtb2RlID0gb3Blbl9rYl9tb2RlKCJ3YiIscGF0aCkpID09IE5VTEwpCi0JICAgIFBNX2ZhdGFsRXJyb3IoIlVuYWJsZSB0byBvcGVuIGtibW9kZS5kYXQgZmlsZSBmb3Igd3JpdGluZyEiKTsKLQlpZiAoaW9jdGwoX1BNX2NvbnNvbGVfZmQsIEtER0tCTU9ERSwgJm1vZGUua2JfbW9kZSkpCi0JICAgIHBlcnJvcigiS0RHS0JNT0RFIik7Ci0JaW9jdGwoX1BNX2NvbnNvbGVfZmQsIEtER0VUTEVELCAmbW9kZS5sZWRzKTsKLQlfUE1fbGVkcyA9IG1vZGUubGVkcyAmIDB4RjsKLQlfUE1fbW9kaWZpZXJzID0gMDsKLQl0Y2dldGF0dHIoX1BNX2NvbnNvbGVfZmQsICZtb2RlLnRlcm1pb3MpOwotCWNvbmYgPSBtb2RlLnRlcm1pb3M7Ci0JY29uZi5jX2xmbGFnICY9IH4oSUNBTk9OIHwgRUNITyB8IElTSUcpOwotCWNvbmYuY19pZmxhZyAmPSB+KElTVFJJUCB8IElHTkNSIHwgSUNSTkwgfCBJTkxDUiB8IEJSS0lOVCB8IFBBUk1SSyB8IElOUENLIHwgSVVDTEMgfCBJWE9OIHwgSVhPRkYpOwotCWNvbmYuY19pZmxhZyAgfD0gKElHTkJSSyB8IElHTlBBUik7Ci0JY29uZi5jX2NjW1ZNSU5dID0gMTsKLQljb25mLmNfY2NbVlRJTUVdID0gMDsKLQljb25mLmNfY2NbVlNVU1BdID0gMDsKLQl0Y3NldGF0dHIoX1BNX2NvbnNvbGVfZmQsIFRDU0FGTFVTSCwgJmNvbmYpOwotCW1vZGUuZmxhZ3MgPSBmY250bChfUE1fY29uc29sZV9mZCxGX0dFVEZMKTsKLQlpZiAoaW9jdGwoX1BNX2NvbnNvbGVfZmQsIEtEU0tCTU9ERSwgS19NRURJVU1SQVcpKQotCSAgICBwZXJyb3IoIktEU0tCTU9ERSIpOwotCWF0ZXhpdChfUE1fcmVzdG9yZV9rYl9tb2RlKTsKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNpZ19saXN0KS9zaXplb2Yoc2lnX2xpc3RbMF0pOyBpKyspCi0JICAgIHNpZ25hbChzaWdfbGlzdFtpXSwgX1BNX2Fib3J0KTsKLQltb2RlLnN0YXJ0dXBfdmMgPSBzdGFydHVwX3ZjOwotCWlmIChmd3JpdGUoJm1vZGUsMSxzaXplb2YobW9kZSksa2Jtb2RlKSAhPSBzaXplb2YobW9kZSkpCi0JICAgIFBNX2ZhdGFsRXJyb3IoIkVycm9yIHdyaXRpbmcga2Jtb2RlLmRhdCEiKTsKLQlmY2xvc2Uoa2Jtb2RlKTsKLQlpbl9yYXdfbW9kZSA9IHRydWU7Ci0JfQotfQotCi1pbnQgUE1BUEkgUE1fa2JoaXQodm9pZCkKLXsKLSAgICBmZF9zZXQgczsKLSAgICBzdHJ1Y3QgdGltZXZhbCB0diA9IHsgMCwgMCB9OwotCi0gICAgaWYgKGNvbnNvbGVfY291bnQgPT0gMCkKLQlQTV9mYXRhbEVycm9yKCJZb3UgKm11c3QqIG9wZW4gYSBjb25zb2xlIGJlZm9yZSB1c2luZyBQTV9rYmhpdCEiKTsKLSAgICBpZiAoIWluX3Jhd19tb2RlKQotCV9QTV9rZXlib2FyZF9yYXdtb2RlKCk7Ci0gICAgRkRfWkVSTygmcyk7Ci0gICAgRkRfU0VUKF9QTV9jb25zb2xlX2ZkLCAmcyk7Ci0gICAgcmV0dXJuIHNlbGVjdChfUE1fY29uc29sZV9mZCsxLCAmcywgTlVMTCwgTlVMTCwgJnR2KSA+IDA7Ci19Ci0KLWludCBQTUFQSSBQTV9nZXRjaCh2b2lkKQotewotICAgIHN0YXRpYyB1Y2hhciAgICBjOwotICAgIGludCByZWxlYXNlOwotICAgIHN0YXRpYyBzdHJ1Y3Qga2JlbnRyeSBrZTsKLQotICAgIGlmIChjb25zb2xlX2NvdW50ID09IDApCi0JUE1fZmF0YWxFcnJvcigiWW91ICptdXN0KiBvcGVuIGEgY29uc29sZSBiZWZvcmUgdXNpbmcgUE1fZ2V0Y2ghIik7Ci0gICAgaWYgKCFpbl9yYXdfbW9kZSkKLQlfUE1fa2V5Ym9hcmRfcmF3bW9kZSgpOwotICAgIHdoaWxlIChyZWFkKF9QTV9jb25zb2xlX2ZkLCAmYywgMSkgPiAwKSB7Ci0JcmVsZWFzZSA9IGMgJiAweDgwOwotCWMgJj0gMHg3RjsKLQlpZiAocmVsZWFzZSkgewotCSAgICBzd2l0Y2goYyl7Ci0JCWNhc2UgNDI6IGNhc2UgNTQ6IC8qIFNoaWZ0ICovCi0JCSAgICBfUE1fbW9kaWZpZXJzICY9IH5LQl9TSElGVDsKLQkJICAgIGJyZWFrOwotCQljYXNlIDI5OiBjYXNlIDk3OiAvKiBDb250cm9sICovCi0JCSAgICBfUE1fbW9kaWZpZXJzICY9IH5LQl9DT05UUk9MOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgNTY6IGNhc2UgMTAwOiAvKiBBbHQgLyBBbHRHciAqLwotCQkgICAgX1BNX21vZGlmaWVycyAmPSB+S0JfQUxUOwotCQkgICAgYnJlYWs7Ci0JCX0KLQkgICAgY29udGludWU7Ci0JICAgIH0KLQlzd2l0Y2ggKGMpIHsKLQkgICAgY2FzZSA0MjogY2FzZSA1NDogLyogU2hpZnQgKi8KLQkJX1BNX21vZGlmaWVycyB8PSBLQl9TSElGVDsKLQkJIGJyZWFrOwotCSAgICBjYXNlIDI5OiBjYXNlIDk3OiAvKiBDb250cm9sICovCi0JCV9QTV9tb2RpZmllcnMgfD0gS0JfQ09OVFJPTDsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgNTY6IGNhc2UgMTAwOiAvKiBBbHQgLyBBbHRHciAqLwotCQlfUE1fbW9kaWZpZXJzIHw9IEtCX0FMVDsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgNTg6IC8qIENhcHMgTG9jayAqLwotCQlfUE1fbW9kaWZpZXJzIF49IEtCX0NBUFM7Ci0JCWlvY3RsKF9QTV9jb25zb2xlX2ZkLCBLRFNFVExFRCwgX1BNX21vZGlmaWVycyAmIDcpOwotCQlicmVhazsKLQkgICAgY2FzZSA2OTogLyogTnVtIExvY2sgKi8KLQkJX1BNX21vZGlmaWVycyBePSBLQl9OVU1MT0NLOwotCQlpb2N0bChfUE1fY29uc29sZV9mZCwgS0RTRVRMRUQsIF9QTV9tb2RpZmllcnMgJiA3KTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgNzA6IC8qIFNjcm9sbCBMb2NrICovCi0JCV9QTV9tb2RpZmllcnMgXj0gS0JfU0NST0xMOwotCQlpb2N0bChfUE1fY29uc29sZV9mZCwgS0RTRVRMRUQsIF9QTV9tb2RpZmllcnMgJiA3KTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgMjg6Ci0JCXJldHVybiAweDFDOwotCSAgICBkZWZhdWx0OgotCQlrZS5rYl9pbmRleCA9IGM7Ci0JCWtlLmtiX3RhYmxlID0gMDsKLQkJaWYgKChfUE1fbW9kaWZpZXJzICYgS0JfU0hJRlQpIHx8IChfUE1fbW9kaWZpZXJzICYgS0JfQ0FQUykpCi0JCSAgICBrZS5rYl90YWJsZSB8PSBLX1NISUZUVEFCOwotCQlpZiAoX1BNX21vZGlmaWVycyAmIEtCX0FMVCkKLQkJICAgIGtlLmtiX3RhYmxlIHw9IEtfQUxUVEFCOwotCQlpb2N0bChfUE1fY29uc29sZV9mZCwgS0RHS0JFTlQsICh1bG9uZykma2UpOwotCQljID0ga2Uua2JfdmFsdWUgJiAweEZGOwotCQlyZXR1cm4gYzsKLQkgICAgfQotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TbGVlcCB1bnRpbCB0aGUgdmlydHVhbCB0ZXJtaW5hbCBpcyBhY3RpdmUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCB3YWl0X3Z0X2FjdGl2ZSgKLSAgICBpbnQgX1BNX2NvbnNvbGVfZmQpCi17Ci0gICAgd2hpbGUgKGlvY3RsKF9QTV9jb25zb2xlX2ZkLCBWVF9XQUlUQUNUSVZFLCB0dHlfdmMpIDwgMCkgewotCWlmICgoZXJybm8gIT0gRUFHQUlOKSAmJiAoZXJybm8gIT0gRUlOVFIpKSB7Ci0JICAgIHBlcnJvcigiaW9jdGwoVlRfV0FJVEFDVElWRSkiKTsKLQkgICAgZXhpdCgxKTsKLQkgICAgfQotCXVzbGVlcCgxNTAwMDApOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DaGVja3MgdGhlIG93bmVyIG9mIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBjb25zb2xlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgY2hlY2tfb3duZXIoCi0gICAgaW50IHZjKQotewotICAgIHN0cnVjdCBzdGF0IHNidWY7Ci0gICAgY2hhciBmbmFtZVszMF07Ci0KLSAgICBzcHJpbnRmKGZuYW1lLCAiL2Rldi90dHklZCIsIHZjKTsKLSAgICBpZiAoKHN0YXQoZm5hbWUsICZzYnVmKSA+PSAwKSAmJiAoZ2V0dWlkKCkgPT0gc2J1Zi5zdF91aWQpKQotCXJldHVybiAxOwotICAgIHByaW50ZigiWW91IG11c3QgYmUgdGhlIG93bmVyIG9mIHRoZSBjdXJyZW50IGNvbnNvbGUgdG8gdXNlIHRoaXMgcHJvZ3JhbS5cbiIpOwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNoZWNrcyBpZiB0aGUgY29uc29sZSBpcyBjdXJyZW50bHkgaW4gZ3JhcGhpY3MgbW9kZSwgYW5kIGlmIHNvIHdlIGZvcmNpYmx5Ci1yZXN0b3JlIGl0IGJhY2sgdG8gdGV4dCBtb2RlIGFnYWluLiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlbiBhIE51Y2xldXMgb3IKLU1HTCBwcm9ncmFtIGNyYXNoZXMgYW5kIGxlYXZlcyB0aGUgY29uc29sZSBpbiBncmFwaGljcyBtb2RlLiBSdW5uaW5nIHRoZQotdGV4dG1vZGUgdXRpbGl0eSAob3IgYW55IG90aGVyIE51Y2xldXMvTUdMIHByb2dyYW0pIHZpYSBhIHRlbG5ldCBzZXNzaW9uCi1pbnRvIHRoZSBtYWNoaW5lIHdpbGwgcmVzdG9yZSBpdCBiYWNrIHRvIG5vcm1hbC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCByZXN0b3JlX3RleHRfY29uc29sZSgKLSAgICBpbnQgY29uc29sZV9pZCkKLXsKLSAgICBpZiAoaW9jdGwoY29uc29sZV9pZCwgS0RTRVRNT0RFLCBLRF9URVhUKSA8IDApCi0JTE9HV0FSTigiaW9jdGwoS0RTRVRNT0RFKSBmYWlsZWQiKTsKLSAgICBfUE1fcmVzdG9yZV9rYl9tb2RlKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotT3BlbnMgdXAgdGhlIGNvbnNvbGUgZGV2aWNlIGZvciBvdXRwdXQgYnkgZmluZGluZyBhbiBhcHByb3ByaWF0ZSB2aXJ1dGFsCi1jb25zb2xlIHRoYXQgd2UgY2FuIHJ1biBvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1QTV9IV05EIFBNQVBJIFBNX29wZW5Db25zb2xlKAotICAgIFBNX0hXTkQgaHduZFVzZXIsCi0gICAgaW50IGRldmljZSwKLSAgICBpbnQgeFJlcywKLSAgICBpbnQgeVJlcywKLSAgICBpbnQgYnBwLAotICAgIGlib29sIGZ1bGxTY3JlZW4pCi17Ci0gICAgc3RydWN0IHZ0X21vZGUgIHZ0bTsKLSAgICBzdHJ1Y3QgdnRfc3RhdCAgdnRzOwotICAgIHN0cnVjdCBzdGF0ICAgICBzYnVmOwotICAgIGNoYXIgICAgICAgICAgICBmbmFtZVszMF07Ci0KLSAgICAvKiBDaGVjayBpZiB3ZSBoYXZlIGFscmVhZHkgb3BlbmVkIHRoZSBjb25zb2xlICovCi0gICAgaWYgKGNvbnNvbGVfY291bnQrKykKLQlyZXR1cm4gX1BNX2NvbnNvbGVfZmQ7Ci0KLSAgICAvKiBOb3csIGl0IHdvdWxkIGJlIGdyZWF0IGlmIHdlIGNvdWxkIHVzZSAvZGV2L3R0eSBhbmQgc2VlIHdoYXQgaXQgaXMKLSAgICAgKiBjb25uZWN0ZWQgdG8uIEFsYXMsIHdlIGNhbm5vdCBmaW5kIG91dCByZWxpYWJseSB3aGF0IFZDIC9kZXYvdHR5IGlzCi0gICAgICogYm91bmQgdG8uIFRodXMgd2UgcGFyc2Ugc3RkaW4gdGhyb3VnaCBzdGRlcnIgZm9yIGEgcmVsaWFibGUgVkMuCi0gICAgICovCi0gICAgc3RhcnR1cF92YyA9IDA7Ci0gICAgZm9yIChfUE1fY29uc29sZV9mZCA9IDA7IF9QTV9jb25zb2xlX2ZkIDwgMzsgX1BNX2NvbnNvbGVfZmQrKykgewotCWlmIChmc3RhdChfUE1fY29uc29sZV9mZCwgJnNidWYpIDwgMCkKLQkgICAgY29udGludWU7Ci0JaWYgKGlvY3RsKF9QTV9jb25zb2xlX2ZkLCBWVF9HRVRNT0RFLCAmdnRtKSA8IDApCi0JICAgIGNvbnRpbnVlOwotCWlmICgoc2J1Zi5zdF9yZGV2ICYgMHhGRjAwKSAhPSAweDQwMCkKLQkgICAgY29udGludWU7Ci0JaWYgKCEoc2J1Zi5zdF9yZGV2ICYgMHhGRikpCi0JICAgIGNvbnRpbnVlOwotCXR0eV92YyA9IHNidWYuc3RfcmRldiAmIDB4RkY7Ci0JcmVzdG9yZV90ZXh0X2NvbnNvbGUoX1BNX2NvbnNvbGVfZmQpOwotCXJldHVybiBfUE1fY29uc29sZV9mZDsKLQl9Ci0gICAgaWYgKChfUE1fY29uc29sZV9mZCA9IG9wZW4oIi9kZXYvY29uc29sZSIsIE9fUkRXUikpIDwgMCkgewotCXByaW50Zigib3Blbl9kZXZfY29uc29sZTogY2FuJ3Qgb3BlbiAvZGV2L2NvbnNvbGUgXG4iKTsKLQlleGl0KDEpOwotCX0KLSAgICBpZiAoaW9jdGwoX1BNX2NvbnNvbGVfZmQsIFZUX09QRU5RUlksICZ0dHlfdmMpIDwgMCkKLQlnb3RvIEVycm9yOwotICAgIGlmICh0dHlfdmMgPD0gMCkKLQlnb3RvIEVycm9yOwotICAgIHNwcmludGYoZm5hbWUsICIvZGV2L3R0eSVkIiwgdHR5X3ZjKTsKLSAgICBjbG9zZShfUE1fY29uc29sZV9mZCk7Ci0KLSAgICAvKiBDaGFuZ2Ugb3VyIGNvbnRyb2wgdGVybWluYWwgKi8KLSAgICBzZXRzaWQoKTsKLQotICAgIC8qIFdlIG11c3QgdXNlIFJEV1IgdG8gYWxsb3cgZm9yIG91dHB1dC4uLiAqLwotICAgIGlmICgoKF9QTV9jb25zb2xlX2ZkID0gb3BlbihmbmFtZSwgT19SRFdSKSkgPj0gMCkgJiYKLQkgICAgKGlvY3RsKF9QTV9jb25zb2xlX2ZkLCBWVF9HRVRTVEFURSwgJnZ0cykgPj0gMCkpIHsKLQlpZiAoIWNoZWNrX293bmVyKHZ0cy52X2FjdGl2ZSkpCi0JICAgIGdvdG8gRXJyb3I7Ci0JcmVzdG9yZV90ZXh0X2NvbnNvbGUoX1BNX2NvbnNvbGVfZmQpOwotCi0JLyogU3VjY2VzcywgcmVkaXJlY3QgYWxsIHN0ZGlvcyAqLwotCWZmbHVzaChzdGRpbik7Ci0JZmZsdXNoKHN0ZG91dCk7Ci0JZmZsdXNoKHN0ZGVycik7Ci0JY2xvc2UoMCk7Ci0JY2xvc2UoMSk7Ci0JY2xvc2UoMik7Ci0JZHVwKF9QTV9jb25zb2xlX2ZkKTsKLQlkdXAoX1BNX2NvbnNvbGVfZmQpOwotCWR1cChfUE1fY29uc29sZV9mZCk7Ci0KLQkvKiBjbGVhciBzY3JlZW4gYW5kIHN3aXRjaCB0byBpdCAqLwotCWZ3cml0ZSgiXGVbSFxlW0oiLCA2LCAxLCBzdGRlcnIpOwotCWZmbHVzaChzdGRlcnIpOwotCWlmICh0dHlfdmMgIT0gdnRzLnZfYWN0aXZlKSB7Ci0JICAgIHN0YXJ0dXBfdmMgPSB2dHMudl9hY3RpdmU7Ci0JICAgIGlvY3RsKF9QTV9jb25zb2xlX2ZkLCBWVF9BQ1RJVkFURSwgdHR5X3ZjKTsKLQkgICAgd2FpdF92dF9hY3RpdmUoX1BNX2NvbnNvbGVfZmQpOwotCSAgICB9Ci0JfQotICAgIHJldHVybiBfUE1fY29uc29sZV9mZDsKLQotRXJyb3I6Ci0gICAgaWYgKF9QTV9jb25zb2xlX2ZkID4gMikKLQljbG9zZShfUE1fY29uc29sZV9mZCk7Ci0gICAgY29uc29sZV9jb3VudCA9IDA7Ci0gICAgUE1fZmF0YWxFcnJvcigKLQkiTm90IHJ1bm5pbmcgaW4gYSBncmFwaGljcyBjYXBhYmxlIGNvbnNvbGUsXG4iCi0JImFuZCB1bmFibGUgdG8gZmluZCBvbmUuXG4iKTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLSNkZWZpbmUgRk9OVF9DICAweDEwMDAwICAgICAvKiA2NEtCIGZvciBmb250IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgY29uc29sZSBzdGF0ZSBidWZmZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2dldENvbnNvbGVTdGF0ZVNpemUodm9pZCkKLXsKLSAgICBpZiAoIWluaXRlZCkKLQlQTV9pbml0KCk7Ci0gICAgcmV0dXJuIFBNX2dldFZHQVN0YXRlU2l6ZSgpICsgRk9OVF9DKjI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2F2ZSB0aGUgc3RhdGUgb2YgdGhlIExpbnV4IGNvbnNvbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zYXZlQ29uc29sZVN0YXRlKHZvaWQgKnN0YXRlQnVmLGludCBjb25zb2xlX2lkKQotewotICAgIHVjaGFyICAgKnJlZ3MgPSBzdGF0ZUJ1ZjsKLQotICAgIC8qIFNhdmUgdGhlIGN1cnJlbnQgY29uc29sZSBmb250ICovCi0gICAgaWYgKGlvY3RsKGNvbnNvbGVfaWQsR0lPX0ZPTlQsJnJlZ3NbUE1fZ2V0VkdBU3RhdGVTaXplKCldKSA8IDApCi0JcGVycm9yKCJpb2N0bChHSU9fRk9OVCkiKTsKLQotICAgIC8qIEluZm9ybSB0aGUgTGludXggY29uc29sZSB0aGF0IHdlIGFyZSBnb2luZyBpbnRvIGdyYXBoaWNzIG1vZGUgKi8KLSAgICBpZiAoaW9jdGwoY29uc29sZV9pZCwgS0RTRVRNT0RFLCBLRF9HUkFQSElDUykgPCAwKQotCXBlcnJvcigiaW9jdGwoS0RTRVRNT0RFKSIpOwotCi0gICAgLyogU2F2ZSBzdGF0ZSBvZiBWR0EgcmVnaXN0ZXJzICovCi0gICAgUE1fc2F2ZVZHQVN0YXRlKHN0YXRlQnVmKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2soaW50IChfQVNNQVBJUCBzYXZlU3RhdGUpKGludCBmbGFncykpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHN1cHBvcnQgZm9yIGFsbG93aW5nIGNvbnNvbGUgc3dpdGNoaW5nISAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSBMaW51eCBjb25zb2xlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZShjb25zdCB2b2lkICpzdGF0ZUJ1ZixQTV9IV05EIGNvbnNvbGVfaWQpCi17Ci0gICAgY29uc3QgdWNoYXIgKnJlZ3MgPSBzdGF0ZUJ1ZjsKLQotICAgIC8qIFJlc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSBWR0EgY29tcGF0aWJsZSByZWdpc3RlcnMgKi8KLSAgICBQTV9yZXN0b3JlVkdBU3RhdGUoc3RhdGVCdWYpOwotCi0gICAgLyogSW5mb3JtIHRoZSBMaW51eCBjb25zb2xlIHRoYXQgd2UgYXJlIGJhY2sgZnJvbSBncmFwaGljcyBtb2RlcyAqLwotICAgIGlmIChpb2N0bChjb25zb2xlX2lkLCBLRFNFVE1PREUsIEtEX1RFWFQpIDwgMCkKLQlMT0dXQVJOKCJpb2N0bChLRFNFVE1PREUpIGZhaWxlZCIpOwotCi0gICAgLyogUmVzdG9yZSB0aGUgb2xkIGNvbnNvbGUgZm9udCAqLwotICAgIGlmIChpb2N0bChjb25zb2xlX2lkLFBJT19GT05ULCZyZWdzW1BNX2dldFZHQVN0YXRlU2l6ZSgpXSkgPCAwKQotCUxPR1dBUk4oImlvY3RsKEtEU0VUTU9ERSkgZmFpbGVkIik7Ci0KLSAgICAvKiBDb21pbmcgYmFjayBmcm9tIGdyYXBoaWNzIG1vZGUgb24gTGludXggYWxzbyByZXN0b3JlZCB0aGUgcHJldmlvdXMKLSAgICAgKiB0ZXh0IG1vZGUgY29uc29sZSBjb250ZW50cywgc28gd2UgbmVlZCB0byBjbGVhciB0aGUgc2NyZWVuIHRvIGdldAotICAgICAqIGFyb3VuZCB0aGlzIHNpbmNlIHRoZSBjdXJzb3IgZG9lcyBub3QgZ2V0IGhvbWVkIGJ5IG91ciBjb2RlLgotICAgICAqLwotICAgIGZmbHVzaChzdGRvdXQpOwotICAgIGZmbHVzaChzdGRlcnIpOwotICAgIHByaW50ZigiXDAzM1tIXDAzM1tKIik7Ci0gICAgZmZsdXNoKHN0ZG91dCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2xvc2UgdGhlIExpbnV4IGNvbnNvbGUgYW5kIHB1dCBpdCBiYWNrIHRvIG5vcm1hbC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2Nsb3NlQ29uc29sZShQTV9IV05EIF9QTV9jb25zb2xlX2ZkKQotewotICAgIC8qIFJlc3RvcmUgY29uc29sZSB0byBub3JtYWwgb3BlcmF0aW9uICovCi0gICAgaWYgKC0tY29uc29sZV9jb3VudCA9PSAwKSB7Ci0JLyogUmUtYWN0aXZhdGUgdGhlIG9yaWdpbmFsIHZpcnR1YWwgY29uc29sZSAqLwotCWlmIChzdGFydHVwX3ZjID4gMCkKLQkgICAgaW9jdGwoX1BNX2NvbnNvbGVfZmQsIFZUX0FDVElWQVRFLCBzdGFydHVwX3ZjKTsKLQotCS8qIENsb3NlIHRoZSBjb25zb2xlIGZpbGUgZGVzY3JpcHRvciAqLwotCWlmIChfUE1fY29uc29sZV9mZCA+IDIpCi0JICAgIGNsb3NlKF9QTV9jb25zb2xlX2ZkKTsKLQlfUE1fY29uc29sZV9mZCA9IC0xOwotCX0KLX0KLQotdm9pZCBQTV9zZXRPU0N1cnNvckxvY2F0aW9uKGludCB4LGludCB5KQotewotICAgIC8qIE5vdGhpbmcgdG8gZG8gaW4gaGVyZSAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNldCB0aGUgc2NyZWVuIHdpZHRoIGFuZCBoZWlnaHQgZm9yIHRoZSBMaW51eCBjb25zb2xlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1fc2V0T1NTY3JlZW5XaWR0aChpbnQgd2lkdGgsaW50IGhlaWdodCkKLXsKLSAgICBzdHJ1Y3Qgd2luc2l6ZSAgd3M7Ci0gICAgc3RydWN0IHZ0X3NpemVzIHZzOwotCi0gICAgLyogUmVzaXplIHRoZSBzb2Z0d2FyZSB0ZXJtaW5hbCAqLwotICAgIHdzLndzX2NvbCA9IHdpZHRoOwotICAgIHdzLndzX3JvdyA9IGhlaWdodDsKLSAgICBpb2N0bChfUE1fY29uc29sZV9mZCwgVElPQ1NXSU5TWiwgJndzKTsKLQotICAgIC8qIEFuZCB0aGUgaGFyZHdhcmUgKi8KLSAgICB2cy52X3Jvd3MgPSBoZWlnaHQ7Ci0gICAgdnMudl9jb2xzID0gd2lkdGg7Ci0gICAgdnMudl9zY3JvbGxzaXplID0gMDsKLSAgICBpb2N0bChfUE1fY29uc29sZV9mZCwgVlRfUkVTSVpFLCAmdnMpOwotfQotCi1pYm9vbCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrSGFuZGxlcihQTV9pbnRIYW5kbGVyIGloLCBpbnQgZnJlcXVlbmN5KQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzIGZvciBMaW51eCAqLwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KGludCBmcmVxdWVuY3kpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgZm9yIExpbnV4ICovCi19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZVJlYWxUaW1lQ2xvY2tIYW5kbGVyKHZvaWQpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgZm9yIExpbnV4ICovCi19Ci0KLWNoYXIgKiBQTUFQSSBQTV9nZXRDdXJyZW50UGF0aCgKLSAgICBjaGFyICpwYXRoLAotICAgIGludCBtYXhMZW4pCi17Ci0gICAgcmV0dXJuIGdldGN3ZChwYXRoLG1heExlbik7Ci19Ci0KLWNoYXIgUE1BUEkgUE1fZ2V0Qm9vdERyaXZlKHZvaWQpCi17IHJldHVybiAnLyc7IH0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFZCRUFGUGF0aCh2b2lkKQoteyByZXR1cm4gUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgoKTsgfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c1BhdGgodm9pZCkKLXsKLSAgICBjaGFyICplbnYgPSBnZXRlbnYoIk5VQ0xFVVNfUEFUSCIpOwotICAgIHJldHVybiBlbnYgPyBlbnYgOiAiL3Vzci9saWIvbnVjbGV1cyI7Ci19Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIHBhdGhbMjU2XTsKLSAgICBzdHJjcHkocGF0aCxQTV9nZXROdWNsZXVzUGF0aCgpKTsKLSAgICBQTV9iYWNrc2xhc2gocGF0aCk7Ci0gICAgc3RyY2F0KHBhdGgsImNvbmZpZyIpOwotICAgIHJldHVybiBwYXRoOwotfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VW5pcXVlSUQodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBidWZbMTI4XTsKLSAgICBnZXRob3N0bmFtZShidWYsIDEyOCk7Ci0gICAgcmV0dXJuIGJ1ZjsKLX0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE1hY2hpbmVOYW1lKHZvaWQpCi17Ci0gICAgc3RhdGljIGNoYXIgYnVmWzEyOF07Ci0gICAgZ2V0aG9zdG5hbWUoYnVmLCAxMjgpOwotICAgIHJldHVybiBidWY7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRCSU9TUG9pbnRlcih2b2lkKQotewotICAgIHN0YXRpYyB1Y2hhciAqemVyb1B0ciA9IE5VTEw7Ci0gICAgaWYgKCF6ZXJvUHRyKQotCXplcm9QdHIgPSBQTV9tYXBQaHlzaWNhbEFkZHIoMCwweEZGRkZGLHRydWUpOwotICAgIHJldHVybiAodm9pZCopKHplcm9QdHIgKyAweDQwMCk7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRBMDAwMFBvaW50ZXIodm9pZCkKLXsKLSAgICAvKiBQTV9pbml0IG1hcHMgaW4gdGhlIDB4QTAwMDAgZnJhbWVidWZmZXIgcmVnaW9uIDE6MSB3aXRoIG91cgotICAgICAqIGFkZHJlc3MgbWFwcGluZywgc28gd2UgY2FuIHJldHVybiB0aGUgYWRkcmVzcyBoZXJlLgotICAgICAqLwotICAgIGlmICghaW5pdGVkKQotCVBNX2luaXQoKTsKLSAgICByZXR1cm4gKHZvaWQqKSgweEEwMDAwKTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX21hcFBoeXNpY2FsQWRkcih1bG9uZyBiYXNlLHVsb25nIGxpbWl0LGlib29sIGlzQ2FjaGVkKQotewotICAgIHVjaGFyICAgKnA7Ci0gICAgdWxvbmcgICBiYXNlQWRkcixiYXNlT2ZzOwotCi0gICAgaWYgKCFpbml0ZWQpCi0JUE1faW5pdCgpOwotICAgIGlmIChiYXNlID49IDB4QTAwMDAgJiYgYmFzZSA8IDB4MTAwMDAwKQotCXJldHVybiAodm9pZCopYmFzZTsKLSAgICBpZiAoIWZkX21lbSAmJiAoZmRfbWVtID0gb3BlbigiL2Rldi9tZW0iLCBPX1JEV1IpKSA9PSAtMSkKLQlyZXR1cm4gTlVMTDsKLQotICAgIC8qIFJvdW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHRvIGEgNEtiIGJvdW5kYXJ5IGFuZCB0aGUgbGltaXQgdG8gYQotICAgICAqIDRLYi0xIGJvdW5kYXJ5IGJlZm9yZSBwYXNzaW5nIHRoZSB2YWx1ZXMgdG8gbW1hcC4gSWYgd2Ugcm91bmQgdGhlCi0gICAgICogcGh5c2ljYWwgYWRkcmVzcywgdGhlbiB3ZSBhbHNvIGFkZCBhbiBleHRyYSBvZmZzZXQgaW50byB0aGUgYWRkcmVzcwotICAgICAqIHRoYXQgd2UgcmV0dXJuLgotICAgICAqLwotICAgIGJhc2VPZnMgPSBiYXNlICYgNDA5NTsKLSAgICBiYXNlQWRkciA9IGJhc2UgJiB+NDA5NTsKLSAgICBsaW1pdCA9ICgobGltaXQrYmFzZU9mcysxKzQwOTUpICYgfjQwOTUpLTE7Ci0gICAgaWYgKChwID0gbW1hcCgwLCBsaW1pdCsxLAotCSAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELAotCSAgICBmZF9tZW0sIGJhc2VBZGRyKSkgPT0gKHZvaWQgKiktMSkKLQlyZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gKHZvaWQqKShwK2Jhc2VPZnMpOwotfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVQaHlzaWNhbEFkZHIodm9pZCAqcHRyLHVsb25nIGxpbWl0KQotewotICAgIGlmICgodWxvbmcpcHRyID49IDB4MTAwMDAwKQotCW11bm1hcChwdHIsbGltaXQrMSk7Ci19Ci0KLXVsb25nIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkcih2b2lkICpwKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGZpbmQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBsaW5lYXIgKi8KLSAgICAvKiAgICAgICBhZGRyZXNzLiAqLwotICAgIHJldHVybiAweEZGRkZGRkZGVUw7Ci19Ci0KLWlib29sIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkclJhbmdlKHZvaWQgKnAsdWxvbmcgbGVuZ3RoLHVsb25nICpwaHlzQWRkcmVzcykKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBmaW5kIGEgcmFuZ2Ugb2YgcGh5c2ljYWwgYWRkcmVzc2VzICovCi0gICAgLyogICAgICAgZm9yIGEgbGluZWFyIGFkZHJlc3MuICovCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFBNQVBJIFBNX3NsZWVwKHVsb25nIG1pbGxpc2Vjb25kcykKLXsKLSAgICAvKiBUT0RPOiBQdXQgdGhlIHByb2Nlc3MgdG8gc2xlZXAgZm9yIG1pbGxpc2Vjb25kcyAqLwotfQotCi1pbnQgUE1BUEkgUE1fZ2V0Q09NUG9ydChpbnQgcG9ydCkKLXsKLSAgICAvKiBUT0RPOiBSZS1jb2RlIHRoaXMgdG8gZGV0ZXJtaW5lIHJlYWwgdmFsdWVzIHVzaW5nIHRoZSBQbHVnIGFuZCBQbGF5ICovCi0gICAgLyogICAgICAgbWFuYWdlciBmb3IgdGhlIE9TLiAqLwotICAgIHN3aXRjaCAocG9ydCkgewotCWNhc2UgMDogcmV0dXJuIDB4M0Y4OwotCWNhc2UgMTogcmV0dXJuIDB4MkY4OwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IFBNQVBJIFBNX2dldExQVFBvcnQoaW50IHBvcnQpCi17Ci0gICAgLyogVE9ETzogUmUtY29kZSB0aGlzIHRvIGRldGVybWluZSByZWFsIHZhbHVlcyB1c2luZyB0aGUgUGx1ZyBhbmQgUGxheSAqLwotICAgIC8qICAgICAgIG1hbmFnZXIgZm9yIHRoZSBPUy4gKi8KLSAgICBzd2l0Y2ggKHBvcnQpIHsKLQljYXNlIDA6IHJldHVybiAweDNCQzsKLQljYXNlIDE6IHJldHVybiAweDM3ODsKLQljYXNlIDI6IHJldHVybiAweDI3ODsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9tYWxsb2NTaGFyZWQobG9uZyBzaXplKQotewotICAgIHJldHVybiBQTV9tYWxsb2Moc2l6ZSk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZVNoYXJlZCh2b2lkICpwdHIpCi17Ci0gICAgUE1fZnJlZShwdHIpOwotfQotCi12b2lkICogUE1BUEkgUE1fbWFwVG9Qcm9jZXNzKHZvaWQgKmJhc2UsdWxvbmcgbGltaXQpCi17IHJldHVybiAodm9pZCopYmFzZTsgfQotCi12b2lkICogUE1BUEkgUE1fbWFwUmVhbFBvaW50ZXIodWludCByX3NlZyx1aW50IHJfb2ZmKQotewotICAgIC8qIFBNX2luaXQgbWFwcyBpbiB0aGUgMHhBMDAwMC0weDEwMDAwMCByZWdpb24gMToxIHdpdGggb3VyCi0gICAgICogYWRkcmVzcyBtYXBwaW5nLCBhcyB3ZWxsIGFzIGFsbCBtZW1vcnkgYmxvY2tzIGluIGEgMToxIGFkZHJlc3MKLSAgICAgKiBtYXBwaW5nIHNvIHdlIGNhbiBzaW1wbHkgcmV0dXJuIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGluIGhlcmUuCi0gICAgICovCi0gICAgaWYgKCFpbml0ZWQpCi0JUE1faW5pdCgpOwotICAgIHJldHVybiAodm9pZCopTUtfUEhZUyhyX3NlZyxyX29mZik7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY1JlYWxTZWcodWludCBzaXplLHVpbnQgKnJfc2VnLHVpbnQgKnJfb2ZmKQotewotICAgIGludCAgICAgaTsKLSAgICBjaGFyICAgICpyID0gKGNoYXIgKilSRUFMX01FTV9CQVNFOwotCi0gICAgaWYgKCFpbml0ZWQpCi0JUE1faW5pdCgpOwotICAgIGlmICghbWVtX2luZm8ucmVhZHkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgaWYgKG1lbV9pbmZvLmNvdW50ID09IFJFQUxfTUVNX0JMT0NLUykKLQlyZXR1cm4gTlVMTDsKLSAgICBzaXplID0gKHNpemUgKyAxNSkgJiB+MTU7Ci0gICAgZm9yIChpID0gMDsgaSA8IG1lbV9pbmZvLmNvdW50OyBpKyspIHsKLQlpZiAobWVtX2luZm8uYmxvY2tzW2ldLmZyZWUgJiYgc2l6ZSA8IG1lbV9pbmZvLmJsb2Nrc1tpXS5zaXplKSB7Ci0JICAgIGluc2VydF9ibG9jayhpKTsKLQkgICAgbWVtX2luZm8uYmxvY2tzW2ldLnNpemUgPSBzaXplOwotCSAgICBtZW1faW5mby5ibG9ja3NbaV0uZnJlZSA9IDA7Ci0JICAgIG1lbV9pbmZvLmJsb2Nrc1tpICsgMV0uc2l6ZSAtPSBzaXplOwotCSAgICAqcl9zZWcgPSAodWludCkocikgPj4gNDsKLQkgICAgKnJfb2ZmID0gKHVpbnQpKHIpICYgMHhGOwotCSAgICByZXR1cm4gKHZvaWQgKilyOwotCSAgICB9Ci0JciArPSBtZW1faW5mby5ibG9ja3NbaV0uc2l6ZTsKLQl9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZVJlYWxTZWcodm9pZCAqbWVtKQotewotICAgIGludCAgICAgaTsKLSAgICBjaGFyICAgICpyID0gKGNoYXIgKilSRUFMX01FTV9CQVNFOwotCi0gICAgaWYgKCFtZW1faW5mby5yZWFkeSkKLQlyZXR1cm47Ci0gICAgaSA9IDA7Ci0gICAgd2hpbGUgKG1lbSAhPSAodm9pZCAqKXIpIHsKLQlyICs9IG1lbV9pbmZvLmJsb2Nrc1tpXS5zaXplOwotCWkrKzsKLQlpZiAoaSA9PSBtZW1faW5mby5jb3VudCkKLQkgICAgcmV0dXJuOwotCX0KLSAgICBtZW1faW5mby5ibG9ja3NbaV0uZnJlZSA9IDE7Ci0gICAgaWYgKGkgKyAxIDwgbWVtX2luZm8uY291bnQgJiYgbWVtX2luZm8uYmxvY2tzW2kgKyAxXS5mcmVlKSB7Ci0JbWVtX2luZm8uYmxvY2tzW2ldLnNpemUgKz0gbWVtX2luZm8uYmxvY2tzW2kgKyAxXS5zaXplOwotCWRlbGV0ZV9ibG9jayhpICsgMSk7Ci0JfQotICAgIGlmIChpIC0gMSA+PSAwICYmIG1lbV9pbmZvLmJsb2Nrc1tpIC0gMV0uZnJlZSkgewotCW1lbV9pbmZvLmJsb2Nrc1tpIC0gMV0uc2l6ZSArPSBtZW1faW5mby5ibG9ja3NbaV0uc2l6ZTsKLQlkZWxldGVfYmxvY2soaSk7Ci0JfQotfQotCi0jZGVmaW5lIERJUkVDVElPTl9GTEFHICAoMSA8PCAxMCkKLQotc3RhdGljIHZvaWQgZW1faW5zKGludCBzaXplKQotewotICAgIHVuc2lnbmVkIGludCBlZHgsIGVkaTsKLQotICAgIGVkeCA9IGNvbnRleHQudm0ucmVncy5lZHggJiAweGZmZmY7Ci0gICAgZWRpID0gY29udGV4dC52bS5yZWdzLmVkaSAmIDB4ZmZmZjsKLSAgICBlZGkgKz0gKHVuc2lnbmVkIGludCljb250ZXh0LnZtLnJlZ3MuZHMgPDwgNDsKLSAgICBpZiAoY29udGV4dC52bS5yZWdzLmVmbGFncyAmIERJUkVDVElPTl9GTEFHKSB7Ci0JaWYgKHNpemUgPT0gNCkKLQkgICAgYXNtIHZvbGF0aWxlICgic3RkOyBpbnNsOyBjbGQiCi0JICAgICA6ICI9RCIgKGVkaSkgOiAiZCIgKGVkeCksICIwIiAoZWRpKSk7Ci0JZWxzZSBpZiAoc2l6ZSA9PSAyKQotCSAgICBhc20gdm9sYXRpbGUgKCJzdGQ7IGluc3c7IGNsZCIKLQkgICAgIDogIj1EIiAoZWRpKSA6ICJkIiAoZWR4KSwgIjAiIChlZGkpKTsKLQllbHNlCi0JICAgIGFzbSB2b2xhdGlsZSAoInN0ZDsgaW5zYjsgY2xkIgotCSAgICAgOiAiPUQiIChlZGkpIDogImQiIChlZHgpLCAiMCIgKGVkaSkpOwotCX0KLSAgICBlbHNlIHsKLQlpZiAoc2l6ZSA9PSA0KQotCSAgICBhc20gdm9sYXRpbGUgKCJjbGQ7IGluc2wiCi0JICAgICA6ICI9RCIgKGVkaSkgOiAiZCIgKGVkeCksICIwIiAoZWRpKSk7Ci0JZWxzZSBpZiAoc2l6ZSA9PSAyKQotCSAgICBhc20gdm9sYXRpbGUgKCJjbGQ7IGluc3ciCi0JICAgICA6ICI9RCIgKGVkaSkgOiAiZCIgKGVkeCksICIwIiAoZWRpKSk7Ci0JZWxzZQotCSAgICBhc20gdm9sYXRpbGUgKCJjbGQ7IGluc2IiCi0JICAgICA6ICI9RCIgKGVkaSkgOiAiZCIgKGVkeCksICIwIiAoZWRpKSk7Ci0JfQotICAgIGVkaSAtPSAodW5zaWduZWQgaW50KWNvbnRleHQudm0ucmVncy5kcyA8PCA0OwotICAgIGNvbnRleHQudm0ucmVncy5lZGkgJj0gMHhmZmZmMDAwMDsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZWRpIHw9IGVkaSAmIDB4ZmZmZjsKLX0KLQotc3RhdGljIHZvaWQgZW1fcmVwX2lucyhpbnQgc2l6ZSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgZWN4LCBlZHgsIGVkaTsKLQotICAgIGVjeCA9IGNvbnRleHQudm0ucmVncy5lY3ggJiAweGZmZmY7Ci0gICAgZWR4ID0gY29udGV4dC52bS5yZWdzLmVkeCAmIDB4ZmZmZjsKLSAgICBlZGkgPSBjb250ZXh0LnZtLnJlZ3MuZWRpICYgMHhmZmZmOwotICAgIGVkaSArPSAodW5zaWduZWQgaW50KWNvbnRleHQudm0ucmVncy5kcyA8PCA0OwotICAgIGlmIChjb250ZXh0LnZtLnJlZ3MuZWZsYWdzICYgRElSRUNUSU9OX0ZMQUcpIHsKLQlpZiAoc2l6ZSA9PSA0KQotCSAgICBhc20gdm9sYXRpbGUgKCJzdGQ7IHJlcDsgaW5zbDsgY2xkIgotCSAgICAgOiAiPUQiIChlZGkpLCAiPWMiIChlY3gpCi0JICAgICA6ICJkIiAoZWR4KSwgIjAiIChlZGkpLCAiMSIgKGVjeCkpOwotCWVsc2UgaWYgKHNpemUgPT0gMikKLQkgICAgYXNtIHZvbGF0aWxlICgic3RkOyByZXA7IGluc3c7IGNsZCIKLQkgICAgIDogIj1EIiAoZWRpKSwgIj1jIiAoZWN4KQotCSAgICAgOiAiZCIgKGVkeCksICIwIiAoZWRpKSwgIjEiIChlY3gpKTsKLQllbHNlCi0JICAgIGFzbSB2b2xhdGlsZSAoInN0ZDsgcmVwOyBpbnNiOyBjbGQiCi0JICAgICA6ICI9RCIgKGVkaSksICI9YyIgKGVjeCkKLQkgICAgIDogImQiIChlZHgpLCAiMCIgKGVkaSksICIxIiAoZWN4KSk7Ci0JfQotICAgIGVsc2UgewotCWlmIChzaXplID09IDQpCi0JICAgIGFzbSB2b2xhdGlsZSAoImNsZDsgcmVwOyBpbnNsIgotCSAgICAgOiAiPUQiIChlZGkpLCAiPWMiIChlY3gpCi0JICAgICA6ICJkIiAoZWR4KSwgIjAiIChlZGkpLCAiMSIgKGVjeCkpOwotCWVsc2UgaWYgKHNpemUgPT0gMikKLQkgICAgYXNtIHZvbGF0aWxlICgiY2xkOyByZXA7IGluc3ciCi0JICAgICA6ICI9RCIgKGVkaSksICI9YyIgKGVjeCkKLQkgICAgIDogImQiIChlZHgpLCAiMCIgKGVkaSksICIxIiAoZWN4KSk7Ci0JZWxzZQotCSAgICBhc20gdm9sYXRpbGUgKCJjbGQ7IHJlcDsgaW5zYiIKLQkgICAgIDogIj1EIiAoZWRpKSwgIj1jIiAoZWN4KQotCSAgICAgOiAiZCIgKGVkeCksICIwIiAoZWRpKSwgIjEiIChlY3gpKTsKLQl9Ci0KLSAgICBlZGkgLT0gKHVuc2lnbmVkIGludCljb250ZXh0LnZtLnJlZ3MuZHMgPDwgNDsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZWRpICY9IDB4ZmZmZjAwMDA7Ci0gICAgY29udGV4dC52bS5yZWdzLmVkaSB8PSBlZGkgJiAweGZmZmY7Ci0gICAgY29udGV4dC52bS5yZWdzLmVjeCAmPSAweGZmZmYwMDAwOwotICAgIGNvbnRleHQudm0ucmVncy5lY3ggfD0gZWN4ICYgMHhmZmZmOwotfQotCi1zdGF0aWMgdm9pZCBlbV9vdXRzKGludCBzaXplKQotewotICAgIHVuc2lnbmVkIGludCBlZHgsIGVzaTsKLQotICAgIGVkeCA9IGNvbnRleHQudm0ucmVncy5lZHggJiAweGZmZmY7Ci0gICAgZXNpID0gY29udGV4dC52bS5yZWdzLmVzaSAmIDB4ZmZmZjsKLSAgICBlc2kgKz0gKHVuc2lnbmVkIGludCljb250ZXh0LnZtLnJlZ3MuZHMgPDwgNDsKLSAgICBpZiAoY29udGV4dC52bS5yZWdzLmVmbGFncyAmIERJUkVDVElPTl9GTEFHKSB7Ci0JaWYgKHNpemUgPT0gNCkKLQkgICAgYXNtIHZvbGF0aWxlICgic3RkOyBvdXRzbDsgY2xkIgotCSAgICAgOiAiPVMiIChlc2kpIDogImQiIChlZHgpLCAiMCIgKGVzaSkpOwotCWVsc2UgaWYgKHNpemUgPT0gMikKLQkgICAgYXNtIHZvbGF0aWxlICgic3RkOyBvdXRzdzsgY2xkIgotCSAgICAgOiAiPVMiIChlc2kpIDogImQiIChlZHgpLCAiMCIgKGVzaSkpOwotCWVsc2UKLQkgICAgYXNtIHZvbGF0aWxlICgic3RkOyBvdXRzYjsgY2xkIgotCSAgICAgOiAiPVMiIChlc2kpIDogImQiIChlZHgpLCAiMCIgKGVzaSkpOwotCX0KLSAgICBlbHNlIHsKLQlpZiAoc2l6ZSA9PSA0KQotCSAgICBhc20gdm9sYXRpbGUgKCJjbGQ7IG91dHNsIgotCSAgICAgOiAiPVMiIChlc2kpIDogImQiIChlZHgpLCAiMCIgKGVzaSkpOwotCWVsc2UgaWYgKHNpemUgPT0gMikKLQkgICAgYXNtIHZvbGF0aWxlICgiY2xkOyBvdXRzdyIKLQkgICAgIDogIj1TIiAoZXNpKSA6ICJkIiAoZWR4KSwgIjAiIChlc2kpKTsKLQllbHNlCi0JICAgIGFzbSB2b2xhdGlsZSAoImNsZDsgb3V0c2IiCi0JICAgICA6ICI9UyIgKGVzaSkgOiAiZCIgKGVkeCksICIwIiAoZXNpKSk7Ci0JfQotCi0gICAgZXNpIC09ICh1bnNpZ25lZCBpbnQpY29udGV4dC52bS5yZWdzLmRzIDw8IDQ7Ci0gICAgY29udGV4dC52bS5yZWdzLmVzaSAmPSAweGZmZmYwMDAwOwotICAgIGNvbnRleHQudm0ucmVncy5lc2kgfD0gZXNpICYgMHhmZmZmOwotfQotCi1zdGF0aWMgdm9pZCBlbV9yZXBfb3V0cyhpbnQgc2l6ZSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgZWN4LCBlZHgsIGVzaTsKLQotICAgIGVjeCA9IGNvbnRleHQudm0ucmVncy5lY3ggJiAweGZmZmY7Ci0gICAgZWR4ID0gY29udGV4dC52bS5yZWdzLmVkeCAmIDB4ZmZmZjsKLSAgICBlc2kgPSBjb250ZXh0LnZtLnJlZ3MuZXNpICYgMHhmZmZmOwotICAgIGVzaSArPSAodW5zaWduZWQgaW50KWNvbnRleHQudm0ucmVncy5kcyA8PCA0OwotICAgIGlmIChjb250ZXh0LnZtLnJlZ3MuZWZsYWdzICYgRElSRUNUSU9OX0ZMQUcpIHsKLQlpZiAoc2l6ZSA9PSA0KQotCSAgICBhc20gdm9sYXRpbGUgKCJzdGQ7IHJlcDsgb3V0c2w7IGNsZCIKLQkgICAgIDogIj1TIiAoZXNpKSwgIj1jIiAoZWN4KQotCSAgICAgOiAiZCIgKGVkeCksICIwIiAoZXNpKSwgIjEiIChlY3gpKTsKLQllbHNlIGlmIChzaXplID09IDIpCi0JICAgIGFzbSB2b2xhdGlsZSAoInN0ZDsgcmVwOyBvdXRzdzsgY2xkIgotCSAgICAgOiAiPVMiIChlc2kpLCAiPWMiIChlY3gpCi0JICAgICA6ICJkIiAoZWR4KSwgIjAiIChlc2kpLCAiMSIgKGVjeCkpOwotCWVsc2UKLQkgICAgYXNtIHZvbGF0aWxlICgic3RkOyByZXA7IG91dHNiOyBjbGQiCi0JICAgICA6ICI9UyIgKGVzaSksICI9YyIgKGVjeCkKLQkgICAgIDogImQiIChlZHgpLCAiMCIgKGVzaSksICIxIiAoZWN4KSk7Ci0JfQotICAgIGVsc2UgewotCWlmIChzaXplID09IDQpCi0JICAgIGFzbSB2b2xhdGlsZSAoImNsZDsgcmVwOyBvdXRzbCIKLQkgICAgIDogIj1TIiAoZXNpKSwgIj1jIiAoZWN4KQotCSAgICAgOiAiZCIgKGVkeCksICIwIiAoZXNpKSwgIjEiIChlY3gpKTsKLQllbHNlIGlmIChzaXplID09IDIpCi0JICAgIGFzbSB2b2xhdGlsZSAoImNsZDsgcmVwOyBvdXRzdyIKLQkgICAgIDogIj1TIiAoZXNpKSwgIj1jIiAoZWN4KQotCSAgICAgOiAiZCIgKGVkeCksICIwIiAoZXNpKSwgIjEiIChlY3gpKTsKLQllbHNlCi0JICAgIGFzbSB2b2xhdGlsZSAoImNsZDsgcmVwOyBvdXRzYiIKLQkgICAgIDogIj1TIiAoZXNpKSwgIj1jIiAoZWN4KQotCSAgICAgOiAiZCIgKGVkeCksICIwIiAoZXNpKSwgIjEiIChlY3gpKTsKLQl9Ci0KLSAgICBlc2kgLT0gKHVuc2lnbmVkIGludCljb250ZXh0LnZtLnJlZ3MuZHMgPDwgNDsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZXNpICY9IDB4ZmZmZjAwMDA7Ci0gICAgY29udGV4dC52bS5yZWdzLmVzaSB8PSBlc2kgJiAweGZmZmY7Ci0gICAgY29udGV4dC52bS5yZWdzLmVjeCAmPSAweGZmZmYwMDAwOwotICAgIGNvbnRleHQudm0ucmVncy5lY3ggfD0gZWN4ICYgMHhmZmZmOwotfQotCi1zdGF0aWMgaW50IGVtdWxhdGUodm9pZCkKLXsKLSAgICB1bnNpZ25lZCBjaGFyICppbnNuOwotICAgIHN0cnVjdCB7Ci0JdW5zaWduZWQgaW50IHNpemUgOiAxOwotCXVuc2lnbmVkIGludCByZXAgOiAxOwotCX0gcHJlZml4ID0geyAwLCAwIH07Ci0gICAgaW50IGkgPSAwOwotCi0gICAgaW5zbiA9ICh1bnNpZ25lZCBjaGFyICopKCh1bnNpZ25lZCBpbnQpY29udGV4dC52bS5yZWdzLmNzIDw8IDQpOwotICAgIGluc24gKz0gY29udGV4dC52bS5yZWdzLmVpcDsKLQotICAgIHdoaWxlICgxKSB7Ci0jaWZkZWYgVFJBQ0VfSU8KLQl0cmFjZUFkZHIgPSAoKHVsb25nKWNvbnRleHQudm0ucmVncy5jcyA8PCAxNikgKyBjb250ZXh0LnZtLnJlZ3MuZWlwICsgaTsKLSNlbmRpZgotCWlmIChpbnNuW2ldID09IDB4NjYpIHsKLQkgICAgcHJlZml4LnNpemUgPSAxIC0gcHJlZml4LnNpemU7Ci0JICAgIGkrKzsKLQkgICAgfQotCWVsc2UgaWYgKGluc25baV0gPT0gMHhmMykgewotCSAgICBwcmVmaXgucmVwID0gMTsKLQkgICAgaSsrOwotCSAgICB9Ci0JZWxzZSBpZiAoaW5zbltpXSA9PSAweGYwIHx8IGluc25baV0gPT0gMHhmMgotCSAgICAgfHwgaW5zbltpXSA9PSAweDI2IHx8IGluc25baV0gPT0gMHgyZQotCSAgICAgfHwgaW5zbltpXSA9PSAweDM2IHx8IGluc25baV0gPT0gMHgzZQotCSAgICAgfHwgaW5zbltpXSA9PSAweDY0IHx8IGluc25baV0gPT0gMHg2NQotCSAgICAgfHwgaW5zbltpXSA9PSAweDY3KSB7Ci0JICAgIC8qIHRoZXNlIHByZWZpeGVzIGFyZSBqdXN0IGlnbm9yZWQgKi8KLQkgICAgaSsrOwotCSAgICB9Ci0JZWxzZSBpZiAoaW5zbltpXSA9PSAweDZjKSB7Ci0JICAgIGlmIChwcmVmaXgucmVwKQotCQllbV9yZXBfaW5zKDEpOwotCSAgICBlbHNlCi0JCWVtX2lucygxKTsKLQkgICAgaSsrOwotCSAgICBicmVhazsKLQkgICAgfQotCWVsc2UgaWYgKGluc25baV0gPT0gMHg2ZCkgewotCSAgICBpZiAocHJlZml4LnJlcCkgewotCQlpZiAocHJlZml4LnNpemUpCi0JCSAgICBlbV9yZXBfaW5zKDQpOwotCQllbHNlCi0JCSAgICBlbV9yZXBfaW5zKDIpOwotCQl9Ci0JICAgIGVsc2UgewotCQlpZiAocHJlZml4LnNpemUpCi0JCSAgICBlbV9pbnMoNCk7Ci0JCWVsc2UKLQkJICAgIGVtX2lucygyKTsKLQkJfQotCSAgICBpKys7Ci0JICAgIGJyZWFrOwotCSAgICB9Ci0JZWxzZSBpZiAoaW5zbltpXSA9PSAweDZlKSB7Ci0JICAgIGlmIChwcmVmaXgucmVwKQotCQllbV9yZXBfb3V0cygxKTsKLQkgICAgZWxzZQotCQllbV9vdXRzKDEpOwotCSAgICBpKys7Ci0JICAgIGJyZWFrOwotCSAgICB9Ci0JZWxzZSBpZiAoaW5zbltpXSA9PSAweDZmKSB7Ci0JICAgIGlmIChwcmVmaXgucmVwKSB7Ci0JCWlmIChwcmVmaXguc2l6ZSkKLQkJICAgIGVtX3JlcF9vdXRzKDQpOwotCQllbHNlCi0JCSAgICBlbV9yZXBfb3V0cygyKTsKLQkJfQotCSAgICBlbHNlIHsKLQkJaWYgKHByZWZpeC5zaXplKQotCQkgICAgZW1fb3V0cyg0KTsKLQkJZWxzZQotCQkgICAgZW1fb3V0cygyKTsKLQkJfQotCSAgICBpKys7Ci0JICAgIGJyZWFrOwotCSAgICB9Ci0JZWxzZSBpZiAoaW5zbltpXSA9PSAweGVjKSB7Ci0JICAgICooKHVjaGFyKikmY29udGV4dC52bS5yZWdzLmVheCkgPSBwb3J0X2luKGNvbnRleHQudm0ucmVncy5lZHgpOwotCSAgICBpKys7Ci0JICAgIGJyZWFrOwotCSAgICB9Ci0JZWxzZSBpZiAoaW5zbltpXSA9PSAweGVkKSB7Ci0JICAgIGlmIChwcmVmaXguc2l6ZSkKLQkJKigodWxvbmcqKSZjb250ZXh0LnZtLnJlZ3MuZWF4KSA9IHBvcnRfaW5sKGNvbnRleHQudm0ucmVncy5lZHgpOwotCSAgICBlbHNlCi0JCSooKHVzaG9ydCopJmNvbnRleHQudm0ucmVncy5lYXgpID0gcG9ydF9pbncoY29udGV4dC52bS5yZWdzLmVkeCk7Ci0JICAgIGkrKzsKLQkgICAgYnJlYWs7Ci0JICAgIH0KLQllbHNlIGlmIChpbnNuW2ldID09IDB4ZWUpIHsKLQkgICAgcG9ydF9vdXQoY29udGV4dC52bS5yZWdzLmVheCxjb250ZXh0LnZtLnJlZ3MuZWR4KTsKLQkgICAgaSsrOwotCSAgICBicmVhazsKLQkgICAgfQotCWVsc2UgaWYgKGluc25baV0gPT0gMHhlZikgewotCSAgICBpZiAocHJlZml4LnNpemUpCi0JCXBvcnRfb3V0bChjb250ZXh0LnZtLnJlZ3MuZWF4LGNvbnRleHQudm0ucmVncy5lZHgpOwotCSAgICBlbHNlCi0JCXBvcnRfb3V0dyhjb250ZXh0LnZtLnJlZ3MuZWF4LGNvbnRleHQudm0ucmVncy5lZHgpOwotCSAgICBpKys7Ci0JICAgIGJyZWFrOwotCSAgICB9Ci0JZWxzZQotCSAgICByZXR1cm4gMDsKLQl9Ci0KLSAgICBjb250ZXh0LnZtLnJlZ3MuZWlwICs9IGk7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlYnVnX2luZm8oaW50IHZyZXQpCi17Ci0gICAgaW50IGk7Ci0gICAgdW5zaWduZWQgY2hhciAqcDsKLQotICAgIGZwdXRzKCJ2bTg2KCkgZmFpbGVkXG4iLCBzdGRlcnIpOwotICAgIGZwcmludGYoc3RkZXJyLCAicmV0dXJuID0gMHgleFxuIiwgdnJldCk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJlYXggPSAweCUwOGx4XG4iLCBjb250ZXh0LnZtLnJlZ3MuZWF4KTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgImVieCA9IDB4JTA4bHhcbiIsIGNvbnRleHQudm0ucmVncy5lYngpOwotICAgIGZwcmludGYoc3RkZXJyLCAiZWN4ID0gMHglMDhseFxuIiwgY29udGV4dC52bS5yZWdzLmVjeCk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJlZHggPSAweCUwOGx4XG4iLCBjb250ZXh0LnZtLnJlZ3MuZWR4KTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgImVzaSA9IDB4JTA4bHhcbiIsIGNvbnRleHQudm0ucmVncy5lc2kpOwotICAgIGZwcmludGYoc3RkZXJyLCAiZWRpID0gMHglMDhseFxuIiwgY29udGV4dC52bS5yZWdzLmVkaSk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJlYnAgPSAweCUwOGx4XG4iLCBjb250ZXh0LnZtLnJlZ3MuZWJwKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgImVpcCA9IDB4JTA4bHhcbiIsIGNvbnRleHQudm0ucmVncy5laXApOwotICAgIGZwcmludGYoc3RkZXJyLCAiY3MgID0gMHglMDR4XG4iLCBjb250ZXh0LnZtLnJlZ3MuY3MpOwotICAgIGZwcmludGYoc3RkZXJyLCAiZXNwID0gMHglMDhseFxuIiwgY29udGV4dC52bS5yZWdzLmVzcCk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJzcyAgPSAweCUwNHhcbiIsIGNvbnRleHQudm0ucmVncy5zcyk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJkcyAgPSAweCUwNHhcbiIsIGNvbnRleHQudm0ucmVncy5kcyk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJlcyAgPSAweCUwNHhcbiIsIGNvbnRleHQudm0ucmVncy5lcyk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJmcyAgPSAweCUwNHhcbiIsIGNvbnRleHQudm0ucmVncy5mcyk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJncyAgPSAweCUwNHhcbiIsIGNvbnRleHQudm0ucmVncy5ncyk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJlZmxhZ3MgID0gMHglMDhseFxuIiwgY29udGV4dC52bS5yZWdzLmVmbGFncyk7Ci0gICAgZnB1dHMoImNzOmlwID0gWyAiLCBzdGRlcnIpOwotICAgIHAgPSAodW5zaWduZWQgY2hhciAqKSgoY29udGV4dC52bS5yZWdzLmNzIDw8IDQpICsgKGNvbnRleHQudm0ucmVncy5laXAgJiAweGZmZmYpKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkKLQkgICAgZnByaW50ZihzdGRlcnIsICIlMDJ4ICIsICh1bnNpZ25lZCBpbnQpcFtpXSk7Ci0gICAgZnB1dHMoIl1cbiIsIHN0ZGVycik7Ci0gICAgZmZsdXNoKHN0ZGVycik7Ci19Ci0KLXN0YXRpYyBpbnQgcnVuX3ZtODYodm9pZCkKLXsKLSAgICB1bnNpZ25lZCBpbnQgdnJldDsKLQotICAgIGZvciAoOzspIHsKLQl2cmV0ID0gdm04NigmY29udGV4dC52bSk7Ci0JaWYgKFZNODZfVFlQRSh2cmV0KSA9PSBWTTg2X0lOVHgpIHsKLQkgICAgdW5zaWduZWQgaW50IHYgPSBWTTg2X0FSRyh2cmV0KTsKLQkgICAgaWYgKHYgPT0gUkVUVVJOX1RPXzMyX0lOVCkKLQkJcmV0dXJuIDE7Ci0JICAgIHB1c2h3KGNvbnRleHQudm0ucmVncy5lZmxhZ3MpOwotCSAgICBwdXNodyhjb250ZXh0LnZtLnJlZ3MuY3MpOwotCSAgICBwdXNodyhjb250ZXh0LnZtLnJlZ3MuZWlwKTsKLQkgICAgY29udGV4dC52bS5yZWdzLmNzID0gZ2V0X2ludF9zZWcodik7Ci0JICAgIGNvbnRleHQudm0ucmVncy5laXAgPSBnZXRfaW50X29mZih2KTsKLQkgICAgY29udGV4dC52bS5yZWdzLmVmbGFncyAmPSB+KFZJRl9NQVNLIHwgVEZfTUFTSyk7Ci0JICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JaWYgKFZNODZfVFlQRSh2cmV0KSAhPSBWTTg2X1VOS05PV04pCi0JICAgIGJyZWFrOwotCWlmICghZW11bGF0ZSgpKQotCSAgICBicmVhazsKLQl9Ci0gICAgZGVidWdfaW5mbyh2cmV0KTsKLSAgICByZXR1cm4gMDsKLX0KLQotI2RlZmluZSBJTkQoZXJlZykgY29udGV4dC52bS5yZWdzLmVyZWcgPSByZWdzLT5lcmVnCi0jZGVmaW5lIE9VVEQoZXJlZykgcmVncy0+ZXJlZyA9IGNvbnRleHQudm0ucmVncy5lcmVnCi0KLXZvaWQgUE1BUEkgRFBNSV9pbnQ4NihpbnQgaW50bm8sIERQTUlfcmVncyAqcmVncykKLXsKLSAgICBpZiAoIWluaXRlZCkKLQlQTV9pbml0KCk7Ci0gICAgbWVtc2V0KCZjb250ZXh0LnZtLnJlZ3MsIDAsIHNpemVvZihjb250ZXh0LnZtLnJlZ3MpKTsKLSAgICBJTkQoZWF4KTsgSU5EKGVieCk7IElORChlY3gpOyBJTkQoZWR4KTsgSU5EKGVzaSk7IElORChlZGkpOwotICAgIGNvbnRleHQudm0ucmVncy5lZmxhZ3MgPSBERUZBVUxUX1ZNODZfRkxBR1M7Ci0gICAgY29udGV4dC52bS5yZWdzLmNzID0gZ2V0X2ludF9zZWcoaW50bm8pOwotICAgIGNvbnRleHQudm0ucmVncy5laXAgPSBnZXRfaW50X29mZihpbnRubyk7Ci0gICAgY29udGV4dC52bS5yZWdzLnNzID0gY29udGV4dC5zdGFja19zZWc7Ci0gICAgY29udGV4dC52bS5yZWdzLmVzcCA9IGNvbnRleHQuc3RhY2tfb2ZmOwotICAgIHB1c2h3KERFRkFVTFRfVk04Nl9GTEFHUyk7Ci0gICAgcHVzaHcoY29udGV4dC5yZXRfc2VnKTsKLSAgICBwdXNodyhjb250ZXh0LnJldF9vZmYpOwotICAgIHJ1bl92bTg2KCk7Ci0gICAgT1VURChlYXgpOyBPVVREKGVieCk7IE9VVEQoZWN4KTsgT1VURChlZHgpOyBPVVREKGVzaSk7IE9VVEQoZWRpKTsKLSAgICByZWdzLT5mbGFncyA9IGNvbnRleHQudm0ucmVncy5lZmxhZ3M7Ci19Ci0KLSNkZWZpbmUgSU4oZXJlZykgY29udGV4dC52bS5yZWdzLmVyZWcgPSBpbi0+ZS5lcmVnCi0jZGVmaW5lIE9VVChlcmVnKSBvdXQtPmUuZXJlZyA9IGNvbnRleHQudm0ucmVncy5lcmVnCi0KLWludCBQTUFQSSBQTV9pbnQ4NihpbnQgaW50bm8sIFJNUkVHUyAqaW4sIFJNUkVHUyAqb3V0KQotewotICAgIGlmICghaW5pdGVkKQotCVBNX2luaXQoKTsKLSAgICBtZW1zZXQoJmNvbnRleHQudm0ucmVncywgMCwgc2l6ZW9mKGNvbnRleHQudm0ucmVncykpOwotICAgIElOKGVheCk7IElOKGVieCk7IElOKGVjeCk7IElOKGVkeCk7IElOKGVzaSk7IElOKGVkaSk7Ci0gICAgY29udGV4dC52bS5yZWdzLmVmbGFncyA9IERFRkFVTFRfVk04Nl9GTEFHUzsKLSAgICBjb250ZXh0LnZtLnJlZ3MuY3MgPSBnZXRfaW50X3NlZyhpbnRubyk7Ci0gICAgY29udGV4dC52bS5yZWdzLmVpcCA9IGdldF9pbnRfb2ZmKGludG5vKTsKLSAgICBjb250ZXh0LnZtLnJlZ3Muc3MgPSBjb250ZXh0LnN0YWNrX3NlZzsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZXNwID0gY29udGV4dC5zdGFja19vZmY7Ci0gICAgcHVzaHcoREVGQVVMVF9WTTg2X0ZMQUdTKTsKLSAgICBwdXNodyhjb250ZXh0LnJldF9zZWcpOwotICAgIHB1c2h3KGNvbnRleHQucmV0X29mZik7Ci0gICAgcnVuX3ZtODYoKTsKLSAgICBPVVQoZWF4KTsgT1VUKGVieCk7IE9VVChlY3gpOyBPVVQoZWR4KTsgT1VUKGVzaSk7IE9VVChlZGkpOwotICAgIG91dC0+eC5jZmxhZyA9IGNvbnRleHQudm0ucmVncy5lZmxhZ3MgJiAxOwotICAgIHJldHVybiBvdXQtPnguYXg7Ci19Ci0KLWludCBQTUFQSSBQTV9pbnQ4NngoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICBpZiAoIWluaXRlZCkKLQlQTV9pbml0KCk7Ci0gICAgaWYgKGludG5vID09IDB4MjEpIHsKLQl0aW1lX3QgdG9kYXkgPSB0aW1lKE5VTEwpOwotCXN0cnVjdCB0bSAqdDsKLQl0ID0gbG9jYWx0aW1lKCZ0b2RheSk7Ci0Jb3V0LT54LmN4ID0gdC0+dG1feWVhciArIDE5MDA7Ci0Jb3V0LT5oLmRoID0gdC0+dG1fbW9uICsgMTsKLQlvdXQtPmguZGwgPSB0LT50bV9tZGF5OwotCX0KLSAgICBlbHNlIHsKLQl1bnNpZ25lZCBpbnQgc2VnLCBvZmY7Ci0Jc2VnID0gZ2V0X2ludF9zZWcoaW50bm8pOwotCW9mZiA9IGdldF9pbnRfb2ZmKGludG5vKTsKLQltZW1zZXQoJmNvbnRleHQudm0ucmVncywgMCwgc2l6ZW9mKGNvbnRleHQudm0ucmVncykpOwotCUlOKGVheCk7IElOKGVieCk7IElOKGVjeCk7IElOKGVkeCk7IElOKGVzaSk7IElOKGVkaSk7Ci0JY29udGV4dC52bS5yZWdzLmVmbGFncyA9IERFRkFVTFRfVk04Nl9GTEFHUzsKLQljb250ZXh0LnZtLnJlZ3MuY3MgPSBzZWc7Ci0JY29udGV4dC52bS5yZWdzLmVpcCA9IG9mZjsKLQljb250ZXh0LnZtLnJlZ3MuZXMgPSBzcmVncy0+ZXM7Ci0JY29udGV4dC52bS5yZWdzLmRzID0gc3JlZ3MtPmRzOwotCWNvbnRleHQudm0ucmVncy5mcyA9IHNyZWdzLT5mczsKLQljb250ZXh0LnZtLnJlZ3MuZ3MgPSBzcmVncy0+Z3M7Ci0JY29udGV4dC52bS5yZWdzLnNzID0gY29udGV4dC5zdGFja19zZWc7Ci0JY29udGV4dC52bS5yZWdzLmVzcCA9IGNvbnRleHQuc3RhY2tfb2ZmOwotCXB1c2h3KERFRkFVTFRfVk04Nl9GTEFHUyk7Ci0JcHVzaHcoY29udGV4dC5yZXRfc2VnKTsKLQlwdXNodyhjb250ZXh0LnJldF9vZmYpOwotCXJ1bl92bTg2KCk7Ci0JT1VUKGVheCk7IE9VVChlYngpOyBPVVQoZWN4KTsgT1VUKGVkeCk7IE9VVChlc2kpOyBPVVQoZWRpKTsKLQlzcmVncy0+ZXMgPSBjb250ZXh0LnZtLnJlZ3MuZXM7Ci0Jc3JlZ3MtPmRzID0gY29udGV4dC52bS5yZWdzLmRzOwotCXNyZWdzLT5mcyA9IGNvbnRleHQudm0ucmVncy5mczsKLQlzcmVncy0+Z3MgPSBjb250ZXh0LnZtLnJlZ3MuZ3M7Ci0Jb3V0LT54LmNmbGFnID0gY29udGV4dC52bS5yZWdzLmVmbGFncyAmIDE7Ci0JfQotICAgIHJldHVybiBvdXQtPmUuZWF4OwotfQotCi0jZGVmaW5lIE9VVFIoZXJlZykgaW4tPmUuZXJlZyA9IGNvbnRleHQudm0ucmVncy5lcmVnCi0KLXZvaWQgUE1BUEkgUE1fY2FsbFJlYWxNb2RlKHVpbnQgc2VnLHVpbnQgb2ZmLCBSTVJFR1MgKmluLAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIGlmICghaW5pdGVkKQotCVBNX2luaXQoKTsKLSAgICBtZW1zZXQoJmNvbnRleHQudm0ucmVncywgMCwgc2l6ZW9mKGNvbnRleHQudm0ucmVncykpOwotICAgIElOKGVheCk7IElOKGVieCk7IElOKGVjeCk7IElOKGVkeCk7IElOKGVzaSk7IElOKGVkaSk7Ci0gICAgY29udGV4dC52bS5yZWdzLmVmbGFncyA9IERFRkFVTFRfVk04Nl9GTEFHUzsKLSAgICBjb250ZXh0LnZtLnJlZ3MuY3MgPSBzZWc7Ci0gICAgY29udGV4dC52bS5yZWdzLmVpcCA9IG9mZjsKLSAgICBjb250ZXh0LnZtLnJlZ3Muc3MgPSBjb250ZXh0LnN0YWNrX3NlZzsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZXNwID0gY29udGV4dC5zdGFja19vZmY7Ci0gICAgY29udGV4dC52bS5yZWdzLmVzID0gc3JlZ3MtPmVzOwotICAgIGNvbnRleHQudm0ucmVncy5kcyA9IHNyZWdzLT5kczsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZnMgPSBzcmVncy0+ZnM7Ci0gICAgY29udGV4dC52bS5yZWdzLmdzID0gc3JlZ3MtPmdzOwotICAgIHB1c2h3KERFRkFVTFRfVk04Nl9GTEFHUyk7Ci0gICAgcHVzaHcoY29udGV4dC5yZXRfc2VnKTsKLSAgICBwdXNodyhjb250ZXh0LnJldF9vZmYpOwotICAgIHJ1bl92bTg2KCk7Ci0gICAgT1VUUihlYXgpOyBPVVRSKGVieCk7IE9VVFIoZWN4KTsgT1VUUihlZHgpOyBPVVRSKGVzaSk7IE9VVFIoZWRpKTsKLSAgICBzcmVncy0+ZXMgPSBjb250ZXh0LnZtLnJlZ3MuZXM7Ci0gICAgc3JlZ3MtPmRzID0gY29udGV4dC52bS5yZWdzLmRzOwotICAgIHNyZWdzLT5mcyA9IGNvbnRleHQudm0ucmVncy5mczsKLSAgICBzcmVncy0+Z3MgPSBjb250ZXh0LnZtLnJlZ3MuZ3M7Ci0gICAgaW4tPnguY2ZsYWcgPSBjb250ZXh0LnZtLnJlZ3MuZWZsYWdzICYgMTsKLX0KLQotdm9pZCBQTUFQSSBQTV9hdmFpbGFibGVNZW1vcnkodWxvbmcgKnBoeXNpY2FsLHVsb25nICp0b3RhbCkKLXsKLSAgICBGSUxFICAgICptZW0gPSBmb3BlbigiL3Byb2MvbWVtaW5mbyIsInIiKTsKLSAgICBjaGFyICAgIGJ1ZlsxMDI0XTsKLQotICAgIGZnZXRzKGJ1ZiwxMDI0LG1lbSk7Ci0gICAgZmdldHMoYnVmLDEwMjQsbWVtKTsKLSAgICBzc2NhbmYoYnVmLCJNZW06ICUqZCAlKmQgJWxkIiwgcGh5c2ljYWwpOwotICAgIGZnZXRzKGJ1ZiwxMDI0LG1lbSk7Ci0gICAgc3NjYW5mKGJ1ZiwiU3dhcDogJSpkICUqZCAlbGQiLCB0b3RhbCk7Ci0gICAgZmNsb3NlKG1lbSk7Ci0gICAgKnRvdGFsICs9ICpwaHlzaWNhbDsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2FsbG9jTG9ja2VkTWVtKHVpbnQgc2l6ZSx1bG9uZyAqcGh5c0FkZHIsaWJvb2wgY29udGlndW91cyxpYm9vbCBiZWxvdzE2TSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyBmb3IgTGludXggKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlTG9ja2VkTWVtKHZvaWQgKnAsdWludCBzaXplLGlib29sIGNvbnRpZ3VvdXMpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgZm9yIExpbnV4ICovCi19Ci0KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY1BhZ2UoCi0gICAgaWJvb2wgbG9ja2VkKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzIGZvciBMaW51eCAqLwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVQYWdlKAotICAgIHZvaWQgKnApCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgZm9yIExpbnV4ICovCi19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0QmFua0EoaW50IGJhbmspCi17Ci0gICAgaWYgKCFpbml0ZWQpCi0JUE1faW5pdCgpOwotICAgIG1lbXNldCgmY29udGV4dC52bS5yZWdzLCAwLCBzaXplb2YoY29udGV4dC52bS5yZWdzKSk7Ci0gICAgY29udGV4dC52bS5yZWdzLmVheCA9IDB4NEYwNTsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZWJ4ID0gMHgwMDAwOwotICAgIGNvbnRleHQudm0ucmVncy5lZHggPSBiYW5rOwotICAgIGNvbnRleHQudm0ucmVncy5lZmxhZ3MgPSBERUZBVUxUX1ZNODZfRkxBR1M7Ci0gICAgY29udGV4dC52bS5yZWdzLmNzID0gZ2V0X2ludF9zZWcoMHgxMCk7Ci0gICAgY29udGV4dC52bS5yZWdzLmVpcCA9IGdldF9pbnRfb2ZmKDB4MTApOwotICAgIGNvbnRleHQudm0ucmVncy5zcyA9IGNvbnRleHQuc3RhY2tfc2VnOwotICAgIGNvbnRleHQudm0ucmVncy5lc3AgPSBjb250ZXh0LnN0YWNrX29mZjsKLSAgICBwdXNodyhERUZBVUxUX1ZNODZfRkxBR1MpOwotICAgIHB1c2h3KGNvbnRleHQucmV0X3NlZyk7Ci0gICAgcHVzaHcoY29udGV4dC5yZXRfb2ZmKTsKLSAgICBydW5fdm04NigpOwotfQotCi12b2lkIFBNQVBJIFBNX3NldEJhbmtBQihpbnQgYmFuaykKLXsKLSAgICBpZiAoIWluaXRlZCkKLQlQTV9pbml0KCk7Ci0gICAgbWVtc2V0KCZjb250ZXh0LnZtLnJlZ3MsIDAsIHNpemVvZihjb250ZXh0LnZtLnJlZ3MpKTsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZWF4ID0gMHg0RjA1OwotICAgIGNvbnRleHQudm0ucmVncy5lYnggPSAweDAwMDA7Ci0gICAgY29udGV4dC52bS5yZWdzLmVkeCA9IGJhbms7Ci0gICAgY29udGV4dC52bS5yZWdzLmVmbGFncyA9IERFRkFVTFRfVk04Nl9GTEFHUzsKLSAgICBjb250ZXh0LnZtLnJlZ3MuY3MgPSBnZXRfaW50X3NlZygweDEwKTsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZWlwID0gZ2V0X2ludF9vZmYoMHgxMCk7Ci0gICAgY29udGV4dC52bS5yZWdzLnNzID0gY29udGV4dC5zdGFja19zZWc7Ci0gICAgY29udGV4dC52bS5yZWdzLmVzcCA9IGNvbnRleHQuc3RhY2tfb2ZmOwotICAgIHB1c2h3KERFRkFVTFRfVk04Nl9GTEFHUyk7Ci0gICAgcHVzaHcoY29udGV4dC5yZXRfc2VnKTsKLSAgICBwdXNodyhjb250ZXh0LnJldF9vZmYpOwotICAgIHJ1bl92bTg2KCk7Ci0gICAgY29udGV4dC52bS5yZWdzLmVheCA9IDB4NEYwNTsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZWJ4ID0gMHgwMDAxOwotICAgIGNvbnRleHQudm0ucmVncy5lZHggPSBiYW5rOwotICAgIGNvbnRleHQudm0ucmVncy5lZmxhZ3MgPSBERUZBVUxUX1ZNODZfRkxBR1M7Ci0gICAgY29udGV4dC52bS5yZWdzLmNzID0gZ2V0X2ludF9zZWcoMHgxMCk7Ci0gICAgY29udGV4dC52bS5yZWdzLmVpcCA9IGdldF9pbnRfb2ZmKDB4MTApOwotICAgIGNvbnRleHQudm0ucmVncy5zcyA9IGNvbnRleHQuc3RhY2tfc2VnOwotICAgIGNvbnRleHQudm0ucmVncy5lc3AgPSBjb250ZXh0LnN0YWNrX29mZjsKLSAgICBwdXNodyhERUZBVUxUX1ZNODZfRkxBR1MpOwotICAgIHB1c2h3KGNvbnRleHQucmV0X3NlZyk7Ci0gICAgcHVzaHcoY29udGV4dC5yZXRfb2ZmKTsKLSAgICBydW5fdm04NigpOwotfQotCi12b2lkIFBNQVBJIFBNX3NldENSVFN0YXJ0KGludCB4LGludCB5LGludCB3YWl0VlJUKQotewotICAgIGlmICghaW5pdGVkKQotCVBNX2luaXQoKTsKLSAgICBtZW1zZXQoJmNvbnRleHQudm0ucmVncywgMCwgc2l6ZW9mKGNvbnRleHQudm0ucmVncykpOwotICAgIGNvbnRleHQudm0ucmVncy5lYXggPSAweDRGMDc7Ci0gICAgY29udGV4dC52bS5yZWdzLmVieCA9IHdhaXRWUlQ7Ci0gICAgY29udGV4dC52bS5yZWdzLmVjeCA9IHg7Ci0gICAgY29udGV4dC52bS5yZWdzLmVkeCA9IHk7Ci0gICAgY29udGV4dC52bS5yZWdzLmVmbGFncyA9IERFRkFVTFRfVk04Nl9GTEFHUzsKLSAgICBjb250ZXh0LnZtLnJlZ3MuY3MgPSBnZXRfaW50X3NlZygweDEwKTsKLSAgICBjb250ZXh0LnZtLnJlZ3MuZWlwID0gZ2V0X2ludF9vZmYoMHgxMCk7Ci0gICAgY29udGV4dC52bS5yZWdzLnNzID0gY29udGV4dC5zdGFja19zZWc7Ci0gICAgY29udGV4dC52bS5yZWdzLmVzcCA9IGNvbnRleHQuc3RhY2tfb2ZmOwotICAgIHB1c2h3KERFRkFVTFRfVk04Nl9GTEFHUyk7Ci0gICAgcHVzaHcoY29udGV4dC5yZXRfc2VnKTsKLSAgICBwdXNodyhjb250ZXh0LnJldF9vZmYpOwotICAgIHJ1bl92bTg2KCk7Ci19Ci0KLWludCBQTUFQSSBQTV9lbmFibGVXcml0ZUNvbWJpbmUodWxvbmcgYmFzZSx1bG9uZyBsZW5ndGgsdWludCB0eXBlKQotewotI2lmZGVmIEVOQUJMRV9NVFJSCi0gICAgc3RydWN0IG10cnJfc2VudHJ5IHNlbnRyeTsKLQotICAgIGlmIChtdHJyX2ZkIDwgMCkKLQlyZXR1cm4gUE1fTVRSUl9FUlJfTk9fT1NfU1VQUE9SVDsKLSAgICBzZW50cnkuYmFzZSA9IGJhc2U7Ci0gICAgc2VudHJ5LnNpemUgPSBsZW5ndGg7Ci0gICAgc2VudHJ5LnR5cGUgPSB0eXBlOwotICAgIGlmIChpb2N0bChtdHJyX2ZkLCBNVFJSSU9DX0FERF9FTlRSWSwgJnNlbnRyeSkgPT0gLTEpIHsKLQkvKiBUT0RPOiBOZWVkIHRvIGRlY29kZSBNVFJSIGVycm9yIGNvZGVzISEgKi8KLQlyZXR1cm4gUE1fTVRSUl9OT1RfU1VQUE9SVEVEOwotCX0KLSAgICByZXR1cm4gUE1fTVRSUl9FUlJfT0s7Ci0jZWxzZQotICAgIHJldHVybiBQTV9NVFJSX0VSUl9OT19PU19TVVBQT1JUOwotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotY2FsbGJhY2sgICAgLSBGdW5jdGlvbiB0byBjYWxsYmFjayB3aXRoIHdyaXRlIGNvbWJpbmUgaW5mb3JtYXRpb24KLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGVudW1lcmF0ZSBhbGwgd3JpdGUgY29tYmluZSByZWdpb25zIGN1cnJlbnRseSBlbmFibGVkIGZvciB0aGUKLXByb2Nlc3Nvci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZW51bVdyaXRlQ29tYmluZSgKLSAgICBQTV9lbnVtV3JpdGVDb21iaW5lX3QgY2FsbGJhY2spCi17Ci0jaWZkZWYgRU5BQkxFX01UUlIKLSAgICBzdHJ1Y3QgbXRycl9nZW50cnkgZ2VudHJ5OwotCi0gICAgaWYgKG10cnJfZmQgPCAwKQotCXJldHVybiBQTV9NVFJSX0VSUl9OT19PU19TVVBQT1JUOwotCi0gICAgZm9yIChnZW50cnkucmVnbnVtID0gMDsgaW9jdGwgKG10cnJfZmQsIE1UUlJJT0NfR0VUX0VOVFJZLCAmZ2VudHJ5KSA9PSAwOwotCSArK2dlbnRyeS5yZWdudW0pIHsKLQlpZiAoZ2VudHJ5LnNpemUgPiAwKSB7Ci0JICAgIC8qIFdBUk5JTkc6IFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgdGhlIHR5cGVzIGluIHBtYXBpLmggbWF0Y2ggdGhlIG9uZXMgKi8KLQkgICAgLyogaW4gdGhlIExpbnV4IGtlcm5lbCAobXRyci5oKSAqLwotCSAgICBjYWxsYmFjayhnZW50cnkuYmFzZSwgZ2VudHJ5LnNpemUsIGdlbnRyeS50eXBlKTsKLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIFBNX01UUlJfRVJSX09LOwotI2Vsc2UKLSAgICByZXR1cm4gUE1fTVRSUl9FUlJfTk9fT1NfU1VQUE9SVDsKLSNlbmRpZgotfQotCi1pYm9vbCBQTUFQSSBQTV9kb0JJT1NQT1NUKAotICAgIHVzaG9ydCBheFZhbCwKLSAgICB1bG9uZyBCSU9TUGh5c0FkZHIsCi0gICAgdm9pZCAqY29weU9mQklPUywKLSAgICB1bG9uZyBCSU9TTGVuKQotewotICAgIGNoYXIgICAgICAgICpiaW9zX3B0ciA9IChjaGFyKikweEMwMDAwOwotICAgIGNoYXIgICAgICAgICpvbGRfYmlvczsKLSAgICB1bG9uZyAgICAgICBDdXJyZW50MTAsIEN1cnJlbnQ2RCwgKnJ2ZWMgPSAwOwotICAgIFJNUkVHUyAgICAgIHJlZ3M7Ci0gICAgUk1TUkVHUyAgICAgc3JlZ3M7Ci0KLSAgICAvKiBUaGUgQklPUyBpcyBtYXBwZWQgdG8gMHhDMDAwMCB3aXRoIGEgcHJpdmF0ZSBtZW1vcnkgbWFwcGluZyBlbmFibGVkCi0gICAgICogd2hpY2ggbWVhbnMgd2UgaGF2ZSBhIGNvcHkgb24gd3JpdGUgc2NoZW1lLiBIZW5jZSB3ZSBzaW1wbHkgY29weQotICAgICAqIHRoZSBzZWNvbmRhcnkgQklPUyBpbWFnZSBvdmVyIHRoZSB0b3Agb2YgdGhlIG9sZCBvbmUuCi0gICAgICovCi0gICAgaWYgKCFpbml0ZWQpCi0JUE1faW5pdCgpOwotICAgIGlmICgob2xkX2Jpb3MgPSBQTV9tYWxsb2MoQklPU0xlbikpID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIGlmIChCSU9TUGh5c0FkZHIgIT0gMHhDMDAwMCkgewotCW1lbWNweShvbGRfYmlvcyxiaW9zX3B0cixCSU9TTGVuKTsKLQltZW1jcHkoYmlvc19wdHIsY29weU9mQklPUyxCSU9TTGVuKTsKLQl9Ci0KLSAgICAvKiBUaGUgaW50ZXJydXB0IHZlY3RvcnMgc2hvdWxkIGFscmVhZHkgYmUgbW1hcCgpJ2VkIGZyb20gMC0weDQwMCBpbiBQTV9pbml0ICovCi0gICAgQ3VycmVudDEwID0gcnZlY1sweDEwXTsKLSAgICBDdXJyZW50NkQgPSBydmVjWzB4NkRdOwotCi0gICAgLyogUE9TVCB0aGUgc2Vjb25kYXJ5IEJJT1MgKi8KLSAgICBydmVjWzB4MTBdID0gcnZlY1sweDQyXTsgLyogUmVzdG9yZSBpbnQgMTBoIHRvIFNURC1CSU9TICovCi0gICAgcmVncy54LmF4ID0gYXhWYWw7Ci0gICAgUE1fY2FsbFJlYWxNb2RlKDB4QzAwMCwweDAwMDMsJnJlZ3MsJnNyZWdzKTsKLQotICAgIC8qIFJlc3RvcmUgaW50ZXJydXB0IHZlY3RvcnMgKi8KLSAgICBydmVjWzB4MTBdID0gQ3VycmVudDEwOwotICAgIHJ2ZWNbMHg2RF0gPSBDdXJyZW50NkQ7Ci0KLSAgICAvKiBSZXN0b3JlIG9yaWdpbmFsIEJJT1MgaW1hZ2UgKi8KLSAgICBpZiAoQklPU1BoeXNBZGRyICE9IDB4QzAwMDApCi0JbWVtY3B5KGJpb3NfcHRyLG9sZF9iaW9zLEJJT1NMZW4pOwotICAgIFBNX2ZyZWUob2xkX2Jpb3MpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1pbnQgUE1BUEkgUE1fbG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIHAgPSBwOyAgbGVuID0gbGVuOwotICAgIHJldHVybiAxOwotfQotCi1pbnQgUE1BUEkgUE1fdW5sb2NrRGF0YVBhZ2VzKHZvaWQgKnAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgcCA9IHA7ICBsZW4gPSBsZW47Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLWludCBQTUFQSSBQTV9sb2NrQ29kZVBhZ2VzKHZvaWQgKCpwKSgpLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIHAgPSBwOyAgbGVuID0gbGVuOwotICAgIHJldHVybiAxOwotfQotCi1pbnQgUE1BUEkgUE1fdW5sb2NrQ29kZVBhZ2VzKHZvaWQgKCpwKSgpLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIHAgPSBwOyAgbGVuID0gbGVuOwotICAgIHJldHVybiAxOwotfQotCi1QTV9NT0RVTEUgUE1BUEkgUE1fbG9hZExpYnJhcnkoCi0gICAgY29uc3QgY2hhciAqc3pETExOYW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzIHRvIGxvYWQgc2hhcmVkIGxpYnJhcmllcyEgKi8KLSAgICAodm9pZClzekRMTE5hbWU7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRQcm9jQWRkcmVzcygKLSAgICBQTV9NT0RVTEUgaE1vZHVsZSwKLSAgICBjb25zdCBjaGFyICpzelByb2NOYW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzISAqLwotICAgICh2b2lkKWhNb2R1bGU7Ci0gICAgKHZvaWQpc3pQcm9jTmFtZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlTGlicmFyeSgKLSAgICBQTV9NT0RVTEUgaE1vZHVsZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyEgKi8KLSAgICAodm9pZCloTW9kdWxlOwotfQotCi1pbnQgUE1BUEkgUE1fc2V0SU9QTCgKLSAgICBpbnQgbGV2ZWwpCi17Ci0gICAgLyogVE9ETzogTW92ZSB0aGUgSU9QTCBzd2l0Y2hpbmcgaW50byB0aGlzIGZ1bmN0aW9uISEgKi8KLSAgICByZXR1cm4gbGV2ZWw7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZmx1c2hUTEIodm9pZCkKLXsKLSAgICAvKiBEbyBub3RoaW5nIG9uIExpbnV4LiAqLwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvdmZsYXQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L3ZmbGF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3OWVmMmMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvdmZsYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIER1bW15IG1vZHVsZTsgbm8gdmlydHVhbCBmcmFtZWJ1ZmZlciBmb3IgdGhpcyBPUwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0KLWlib29sIFBNQVBJIFZGX2F2YWlsYWJsZSh2b2lkKQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCAqIFBNQVBJIFZGX2luaXQodWxvbmcgYmFzZUFkZHIsaW50IGJhbmtTaXplLGludCBjb2RlTGVuLHZvaWQgKmJhbmtGdW5jKQotewotICAgIGJhc2VBZGRyID0gYmFzZUFkZHI7Ci0gICAgYmFua1NpemUgPSBiYW5rU2l6ZTsKLSAgICBjb2RlTGVuID0gY29kZUxlbjsKLSAgICBiYW5rRnVuYyA9IGJhbmtGdW5jOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFZGX2V4aXQodm9pZCkKLXsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL2xpbnV4L3p0aW1lci5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvenRpbWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOWJhZTIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbGludXgvenRpbWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBMaW51eAotKgotKiBEZXNjcmlwdGlvbjogIExpbnV4IHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgWmVuIFRpbWVyIGZ1bmN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgInBtYXBpLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgWmVuIFRpbWVyIG1vZHVsZSBpbnRlcm5hbHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfX1pUaW1lckluaXQodm9pZCkKLXsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Vc2UgdGhlIGdldHRpbWVvZmRheSgpIGZ1bmN0aW9uIHRvIGdldCBtaWNyb3NlY29uZCBwcmVjaXNpb24gKHByb2JhYmx5IGxlc3MKLXRob3VnaCkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW5saW5lIHVsb25nIF9fVUxaUmVhZFRpbWUodm9pZCkKLXsKLSAgICBzdHJ1Y3QgdGltZXZhbCB0OwotICAgIGdldHRpbWVvZmRheSgmdCwgTlVMTCk7Ci0gICAgcmV0dXJuIHQudHZfc2VjKjEwMDAwMDAgKyB0LnR2X3VzZWM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU3RhcnQgdGhlIFplbiBUaW1lciBjb3VudGluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9fTFpUaW1lck9uKHRtKSAgICAgdG0tPnN0YXJ0LmxvdyA9IF9fVUxaUmVhZFRpbWUoKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNvbXB1dGUgdGhlIGxhcCB0aW1lIHNpbmNlIHRoZSB0aW1lciB3YXMgc3RhcnRlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9fTFpUaW1lckxhcCh0bSkgICAgICAgIChfX1VMWlJlYWRUaW1lKCkgLSB0bS0+c3RhcnQubG93KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfX0xaVGltZXJPZmYodG0pICAgICAgICB0bS0+ZW5kLmxvdyA9IF9fVUxaUmVhZFRpbWUoKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfX0xaVGltZXJDb3VudCh0bSkgICh0bS0+ZW5kLmxvdyAtIHRtLT5zdGFydC5sb3cpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGVmaW5lIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBsb25nIHBlcmlvZCB0aW1lciBhcyBtaWNyb3NlY29uZHMgcGVyIHRpbWVyIHRpY2suCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBVTFpUSU1FUl9SRVNPTFVUSU9OIDEKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Db21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgZnJvbSB0aGUgQklPUyB0aW1lciB0aWNrLiBOb3RlIHRoYXQgd2UgY2hlY2sgdG8gc2VlCi13aGV0aGVyIGEgbWlkbmlnaHQgYm91bmRhcnkgaGFzIHBhc3NlZCwgYW5kIGlmIHNvIGFkanVzdCB0aGUgZmluaXNoIHRpbWUgdG8KLWFjY291bnQgZm9yIHRoaXMuIFdlIGNhbm5vdCBkZXRlY3QgaWYgbW9yZSB0aGF0IG9uZSBtaWRuaWdodCBib3VuZGFyeSBoYXMKLXBhc3NlZCwgc28gaWYgdGhpcyBoYXBwZW5zIHdlIHdpbGwgYmUgZ2VuZXJhdGluZyBlcnJvbm91cyByZXN1bHRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9fVUxaRWxhcHNlZFRpbWUodWxvbmcgc3RhcnQsdWxvbmcgZmluaXNoKQoteyByZXR1cm4gZmluaXNoIC0gc3RhcnQ7IH0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL21ha2VmaWxlIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NWYwZTMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2IFNjaVRlY2ggU29mdHdhcmUuCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMKLSMgRGVzY3JpcHRvbjogICBHZW5lcmljIG1ha2VmaWxlIGZvciB0aGUgUE0gbGlicmFyeS4gQnVpbGRzIHRoZSBsaWJyYXJ5Ci0jICAgICAgICAgICAgICAgZmlsZSBhbmQgYWxsIHRlc3QgcHJvZ3JhbXMuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0uSU1QT1JUIC5JR05PUkUgOiBERUJVR19BR1BfRFJJVkVSIFRFU1RfSEFSTkVTUyBERUJVR19TRERQTUkKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQWRkIERPUyBleHRlbmRlciBkZXBlbmRhbnQgZmxhZ3MgdG8gY29tbWFuZCBsaW5lCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1DRkxBR1MgICAgICAgICAgKz0gJChEWF9DRkxBR1MpCi1BU0ZMQUdTICAgICAgICAgKz0gJChEWF9BU0ZMQUdTKQotTk9fUE1MSUIgICAgICAgIDo9IDEKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgSW5jbHVkZSBkZWZpbml0aW9ucyBzcGVjaWZpYyBmb3IgdGhlIHRhcmdldCBzeXN0ZW0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS5JRiAkKFVTRV9WWEQpCi0KLSMgQnVpbGRpbmcgZm9yIFdpbjMyIFZ4RCAobWluaW1hbCBQTSBsaWJyYXJ5IGltcGxlbWVudGF0aW9uKQotCi1MSUJOQU1FICAgICAgICAgPSBwbQotT0JKRUNUUyAgICAgICAgID0gcG0kTyB2ZmxhdCRPIHp0aW1lciRPIGNwdWluZm8kTyBtdHJyJE8gZmlsZWlvJE8gcGNpbGliJE8gXAotICAgICAgICAgICAgICAgICAgYWdwJE8gbWFsbG9jJE8gdmdhc3RhdGUkTyBnYXZ4ZCRPIF9wbSRPIF9tdHJyJE8gX2NwdWluZm8kTyBcCi0gICAgICAgICAgICAgICAgICBfaW50NjQkTyBfcGNpaGVscCRPCi1ERVBFTkRfU1JDICAgICAgOj0gdnhkO2NvbW1vbjtjb2RlcGFnZTt0ZXN0cwotLlNPVVJDRTogICAgICAgICAgIHZ4ZCBjb21tb24gY29kZXBhZ2UgdGVzdHMKLQotLkVMSUYgJChVU0VfTlREUlYpCi0KLSMgQnVpbGRpbmcgZm9yIE5UIGRldmljZSBkcml2ZXJzIChtaW5pbWFsIFBNIGxpYnJhcnkgaW1wbGVtZW50YXRpb24pCi0KLUxJQk5BTUUgICAgICAgICA9IHBtCi1PQkpFQ1RTICAgICAgICAgPSBwbSRPIHZmbGF0JE8genRpbWVyJE8gY3B1aW5mbyRPIG10cnIkTyBtZW0kTyBpcnEkTyBpbnQ4NiRPIFwKLSAgICAgICAgICAgICAgICAgIHN0ZGlvJE8gc3RkbGliJE8gcGNpbGliJE8gYWdwJE8gbWFsbG9jJE8gdmdhc3RhdGUkTyBnYW50ZHJ2JE8gXAotICAgICAgICAgICAgICAgICAgX3BtJE8gX210cnIkTyBfY3B1aW5mbyRPIF9pbnQ2NCRPIF9wY2loZWxwJE8gX2lycSRPCi1ERVBFTkRfU1JDICAgICAgOj0gbnRkcnY7Y29tbW9uO2NvZGVwYWdlO3Rlc3RzCi0uU09VUkNFOiAgICAgICAgICAgbnRkcnYgY29tbW9uIGNvZGVwYWdlIHRlc3RzCi0KLS5FTElGICQoVVNFX1dJTjMyKQotCi0jIEJ1aWxkaW5nIGZvciBXaW4zMgotCi1DRkxBR1MgICAgICAgICAgKz0gLURVU0VfT1NfSk9ZU1RJQ0sKLUxJQk5BTUUgICAgICAgICA9IHBtCi1PQkpFQ1RTICAgICAgICAgPSBwbSRPIHZmbGF0JE8gZXZlbnQkTyBkZHJhdyRPIHp0aW1lciRPIGNwdWluZm8kTyBwY2lsaWIkTyBcCi0gICAgICAgICAgICAgICAgICBhZ3AkTyBtYWxsb2MkTyB2Z2FzdGF0ZSRPIGdhd2luMzIkTyBudHNlcnZjJE8gX2pveSRPIF9jcHVpbmZvJE8gXAotICAgICAgICAgICAgICAgICAgX2ludDY0JE8gX3BjaWhlbHAkTwotREVQRU5EX1NSQyAgICAgIDo9IHdpbjMyO2NvbW1vbjtjb2RlcGFnZTt0ZXN0cwotLlNPVVJDRTogICAgICAgICAgIHdpbjMyIGNvbW1vbiBjb2RlcGFnZSB0ZXN0cwotCi0uRUxJRiAkKFVTRV9PUzIzMikKLQotIyBCdWlsZGluZyBmb3IgT1MvMgotCi0uSUYgJChVU0VfT1MyR1VJKQotTElCTkFNRSAgICAgICAgID0gcG1fcG0KLS5FTFNFCi1MSUJOQU1FICAgICAgICAgPSBwbQotLkVORElGCi1PQkpFQ1RTICAgICAgICAgPSBwbSRPIHZmbGF0JE8gZXZlbnQkTyB6dGltZXIkTyBjcHVpbmZvJE8gbXRyciRPIHBjaWxpYiRPIFwKLSAgICAgICAgICAgICAgICAgIGFncCRPIG1hbGxvYyRPIHZnYXN0YXRlJE8gZ2FvczIkTyBfcG1vczIkTyBfam95JE8gX2NwdWluZm8kTyBcCi0gICAgICAgICAgICAgICAgICBfaW50NjQkTyBfcGNpaGVscCRPIGRvc3NjdGwkTwotREVQRU5EX1NSQyAgICAgIDo9IG9zMjtjb21tb247Y29kZXBhZ2U7dGVzdHMKLS5TT1VSQ0U6ICAgICAgICAgICBvczIgY29tbW9uIGNvZGVwYWdlIHRlc3RzCi0KLS5FTElGICQoVVNFX1FOWCkKLQotIyBCdWlsZGluZyBmb3IgUU5YCi0KLVVTRV9CSU9TICAgICAgICA6PSAxCi0uSUYgJChVU0VfUEhPVE9OKQotTElCTkFNRSAgICAgICAgID0gcG1fcGgKLS5FTElGICQoVVNFX1gxMSkKLUxJQk5BTUUgICAgICAgICA9IHBtX3gxMQotLkVMU0UKLUxJQk5BTUUgICAgICAgICA9IHBtCi0uRU5ESUYKLU9CSkVDVFMgICAgICAgICA9IHBtJE8gdmZsYXQkTyBldmVudCRPIHp0aW1lciRPIGNwdWluZm8kTyBtdHJyJE8gcGNpbGliJE8gXAotICAgICAgICAgICAgICAgICAgYWdwJE8gbWFsbG9jJE8gbXRycnFueCRPIHVuaXhpbyRPIHZnYXN0YXRlJE8gZ2FxbngkTyBfam95JE8gXAotICAgICAgICAgICAgICAgICAgX210cnJxbngkTyBfY3B1aW5mbyRPIF9pbnQ2NCRPIF9wY2loZWxwJE8KLURFUEVORF9TUkMgICAgICA6PSBxbng7Y29tbW9uO2NvZGVwYWdlO3Rlc3RzCi0uU09VUkNFOiAgICAgICAgICAgcW54IGNvbW1vbiBjb2RlcGFnZSB0ZXN0cwotCi0jIEluZGljYXRlIHRoYXQgdGhpcyBwcm9ncmFtIHVzZXMgTnVjbGV1cyBkZXZpY2UgZHJpdmVycyAoc28gbmVlZHMgSS9PIGFjY2VzcykKLVVTRV9OVUNMRVVTICAgICA6PSAxCi0KLS5FTElGICQoVVNFX0xJTlVYKQotCi0jIEJ1aWxkaW5nIGZvciBMaW51eAotCi1DRkxBR1MgICAgICAgICAgKz0gLURFTkFCTEVfTVRSUiAtRFVTRV9PU19KT1lTVElDSwotLklGICQoVVNFX1gxMSkKLUxJQk5BTUUgICAgICAgICA9IHBtX3gxMQotLkVMU0UKLUxJQk5BTUUgICAgICAgICA9IHBtCi0uRU5ESUYKLU9CSkVDVFMgICAgICAgICA9IHBtJE8gdmZsYXQkTyBldmVudCRPIHp0aW1lciRPIGNwdWluZm8kTyBwY2lsaWIkTyBcCi0gICAgICAgICAgICAgICAgICBhZ3AkTyBtYWxsb2MkTyB1bml4aW8kTyB2Z2FzdGF0ZSRPIGdhbGludXgkTyBfY3B1aW5mbyRPIFwKLSAgICAgICAgICAgICAgICAgIF9pbnQ2NCRPIF9wY2loZWxwJE8KLURFUEVORF9TUkMgICAgICA6PSBsaW51eDtjb21tb247Y29kZXBhZ2U7dGVzdHM7eDExCi0uU09VUkNFOiAgICAgICAgICAgbGludXggY29tbW9uIGNvZGVwYWdlIHRlc3RzIHgxMQotCi0jIEJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkKLS5JRiAkKFNPRklMRSkKLUxJQiAgICAgICAgICAgICA6PSBsZAotTElCRkxBR1MgICAgICAgIDo9IC1yIC1vCi1DRkxBR1MgICAgICAgICAgKz0gLWZQSUMKLS5FTkRJRgotCi0uRUxJRiAkKFVTRV9CRU9TKQotCi0jIEJ1aWxkaW5nIGZvciBCZU9TIEdVSQotCi1MSUJOQU1FICAgICAgICAgPSBwbQotT0JKRUNUUyAgICAgICAgID0gcG0kTyB2ZmxhdCRPIGV2ZW50JE8genRpbWVyJE8gY3B1aW5mbyRPIHBjaWxpYiRPIFwKLSAgICAgICAgICAgICAgICAgIGFncCRPIG1hbGxvYyRPIHZnYXN0YXRlJE8gZ2FiZW9zJE8gX2pveSRPIF9jcHVpbmZvJE8gXAotICAgICAgICAgICAgICAgICAgX2ludDY0JE8gX3BjaWhlbHAkTwotREVQRU5EX1NSQyAgICAgIDo9IGJlb3M7Y29tbW9uO2NvZGVwYWdlO3Rlc3RzCi0uU09VUkNFOiAgICAgICAgICAgYmVvcyBjb21tb24gY29kZXBhZ2UgdGVzdHMKLQotLkVMSUYgJChVU0VfU01YMzIpCi0KLSMgQnVpbGRpbmcgZm9yIFNNWAotCi1MSUJOQU1FICAgICAgICAgPSBwbQotT0JKRUNUUyAgICAgICAgID0gcG0kTyBwbXNteCRPIHZmbGF0JE8gZXZlbnQkTyB6dGltZXIkTyBjcHVpbmZvJE8gbXRyciRPIHBjaWxpYiRPIFwKLSAgICAgICAgICAgICAgICAgIGFncCRPIG1hbGxvYyRPIHZnYXN0YXRlJE8gZ2FzbXgkTyBfcG0kTyBfcG1zbXgkTyBfbXRyciRPIF9ldmVudCRPIFwKLSAgICAgICAgICAgICAgICAgIF9qb3kkTyBfY3B1aW5mbyRPIF9pbnQ2NCRPIF9wY2loZWxwJE8gX2x6dGltZXIkTwotREVQRU5EX1NSQyAgICAgIDo9IHNteDtjb21tb247Y29kZXBhZ2U7dGVzdHMKLS5TT1VSQ0U6ICAgICAgICAgICBzbXggY29tbW9uIGNvZGVwYWdlIHRlc3RzCi0KLS5FTElGICQoVVNFX1JUVEFSR0VUKQotCi0jIEJ1aWxkaW5nIGZvciBSVFRhcmdldC0zMgotCi1MSUJOQU1FICAgICAgICAgPSBwbQotT0JKRUNUUyAgICAgICAgID0gcG0kTyB2ZmxhdCRPIGV2ZW50JE8genRpbWVyJE8gY3B1aW5mbyRPIG10cnIkTyBwY2lsaWIkTyBcCi0gICAgICAgICAgICAgICAgICBhZ3AkTyBtYWxsb2MkTyB2Z2FzdGF0ZSRPIGdhcnR0JE8gX210cnIkTyBfam95JE8gX2NwdWluZm8kTyBcCi0gICAgICAgICAgICAgICAgICBfaW50NjQkTyBfcGNpaGVscCRPCi1ERVBFTkRfU1JDICAgICAgOj0gcnR0YXJnZXQ7Y29tbW9uO2NvZGVwYWdlO3Rlc3RzCi0uU09VUkNFOiAgICAgICAgICAgcnR0YXJnZXQgY29tbW9uIGNvZGVwYWdlIHRlc3RzCi0KLS5FTFNFCi0KLSMgQnVpbGRpbmcgZm9yIE1TRE9TCi0KLUxJQk5BTUUgICAgICAgICA9IHBtCi1PQkpFQ1RTICAgICAgICAgPSBwbSRPIHBtZG9zJE8gdmZsYXQkTyBldmVudCRPIHp0aW1lciRPIGNwdWluZm8kTyBtdHJyJE8gXAotICAgICAgICAgICAgICAgICAgYWdwJE8gbWFsbG9jJE8gcGNpbGliJE8gdmdhc3RhdGUkTyBnYWRvcyRPIFwKLSAgICAgICAgICAgICAgICAgIF9wbSRPIF9wbWRvcyRPIF9tdHJyJE8gX3ZmbGF0JE8gX2V2ZW50JE8gX2pveSRPIF9wY2loZWxwJE8gXAotICAgICAgICAgICAgICAgICAgX2NwdWluZm8kTyBfaW50NjQkTyBfbHp0aW1lciRPIF9kbWEkTwotREVQRU5EX1NSQyAgICAgIDo9IGRvcztjb21tb247Y29kZXBhZ2U7dGVzdHMKLS5TT1VSQ0U6ICAgICAgICAgICBkb3MgY29tbW9uIGNvZGVwYWdlIHRlc3RzCi0KLS5FTkRJRgotCi0jIE9iamVjdCBtb2R1bGVzIGZvciBrZXlib2FyZCBjb2RlIHBhZ2VzCi0KLU9CSkVDVFMgICAgICAgICArPSB1c19lbmckTwotCi0jIENvbW1vbiBvYmplY3QgbW9kdWxlcwotCi1PQkpFQ1RTICAgICAgICAgKz0gY29tbW9uJE8KLS5JRiAkKENIRUNLRUQpCi1PQkpFQ1RTICAgICAgICAgKz0gZGVidWckTwotLkVORElGCi0KLSMgTnVjbGV1cyBsb2FkZXIgbGlicmFyeSBvYmplY3QgbW9kdWxlcy4gTm90ZSB0aGF0IHdoZW4gY29tcGlsaW5nIGEgdGVzdCBoYXJuZXNzCi0jIGxpYnJhcnkgd2UgbmVlZCB0byBleGNsdWRlIHRoZSBOdWNsZXVzIGxvYWRlciBsaWJyYXJ5LgotCi0uSUYgJChURVNUX0hBUk5FU1MpCi1DRkxBR1MgICAgICAgICAgKz0gLURURVNUX0hBUk5FU1MgLURQTUxJQgotTElCTkFNRSAgICAgICAgID0gcG1fdGVzdAotLkVMU0UKLU9CSkVDVFMgICAgICAgICArPSBnYWxpYiRPIF9nYV9pbXAkTwotLkVORElGCi0KLS5JRiAkKERFQlVHX1NERFBNSSkKLUNGTEFHUyAgICAgICAgICArPSAtRERFQlVHX1NERFBNSQotLkVORElGCi0KLSMgQUdQIGxpYnJhcnkgb2JqZWN0IG1vZHVsZXMKLQotLklGICQoREVCVUdfQUdQX0RSSVZFUikKLUNGTEFHUyAgICAgICAgICArPSAtRERFQlVHX0FHUF9EUklWRVIKLU9CSkVDVFMgICAgICAgICArPSBhZ3BsaWIkTwotLkVMU0UKLU9CSkVDVFMgICAgICAgICArPSBhZ3BsaWIkTyBwZWxvYWRlciRPIGxpYmNpbXAkTyBfZ2F0aW1lciRPCi0uRU5ESUYKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTmFtZSBvZiBsaWJyYXJ5IGFuZCBnZW5lcmljIG9iamVjdCBmaWxlcyByZXF1aXJlZCB0byBidWlsZCBpdAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLklGICQoU1RLQ0FMTCkKLUxJQkZJTEUgICAgICAgICA9IHMkKExQKSQoTElCTkFNRSkkTAotLkVMU0UKLUxJQkZJTEUgICAgICAgICA9ICQoTFApJChMSUJOQU1FKSRMCi0uRU5ESUYKLUxJQkNMRUFOICAgICAgICA9ICoubGliICouYQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDaGFuZ2UgZGVzdGluYXRpb24gZm9yIGxpYnJhcnkgZmlsZSBkZXBlbmRpbmcgdGhlIGV4dGVuZGVyIGJlaW5nIHVzZWQuIFRoaXMKLSMgaXMgb25seSBuZWNlc3NhcnkgZm9yIERPUyBleHRlbmRlciBzaW5jZSB0aGUgZmlsZSBnbyBpbnRvIGEgc3ViZGlyZWN0b3J5Ci0jIGluIHRoZSBub3JtYWwgbGlicmFyeSBkaXJlY3RvcnksIG9uZSBmb3IgZWFjaCBzdXBwb3J0ZWQgZXh0ZW5kZXIuIE90aGVyCi0jIE9TJ2VzIHB1dCB0aGUgZmlsZSBpbnRvIHRoZSByZWd1bGFyIGxpYnJhcnkgZGlyZWN0b3J5LCBzaW5jZSB0aGVyZSBpcwotIyBvbmx5IG9uZSBwZXIgT1MgaW4gdGhpcyBjYXNlLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTUtfUE1PREUgICAgICAgID0gMQotCi0uSUYgJChURVNUX0hBUk5FU1MpCi1MSUJfREVTVCAgICAgICAgOj0gJChMSUJfQkFTRSkKLS5FTElGICQoVVNFX1ROVCkKLUxJQl9ERVNUICAgICAgICA6PSAkKExJQl9CQVNFKVx0bnQKLS5FTElGICQoVVNFX0RPUzRHVykKLUxJQl9ERVNUICAgICAgICA6PSAkKExJQl9CQVNFKVxkb3M0Z3cKLS5FTElGICQoVVNFX1gzMikKLUxJQl9ERVNUICAgICAgICA6PSAkKExJQl9CQVNFKVx4MzIKLS5FTElGICQoVVNFX0RQTUkxNikKLUxJQl9ERVNUICAgICAgICA6PSAkKExJQl9CQVNFKVxkcG1pMTYKLS5FTElGICQoVVNFX0RQTUkzMikKLUxJQl9ERVNUICAgICAgICA6PSAkKExJQl9CQVNFKVxkcG1pMzIKLS5FTElGICQoVVNFX0RPU1gpCi1MSUJfREVTVCAgICAgICAgOj0gJChMSUJfQkFTRSlcZG9zeAotLkVORAotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOYW1lcyBvZiBhbGwgZXhlY3V0YWJsZSBmaWxlcyBidWlsdAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLklGICQoVVNFX1JFQUxET1MpCi1FWEVGSUxFUyAgICAgICAgPSBtZW10ZXN0JEUgYmlvc3B0ciRFIHZpZGVvJEUgaXN2ZXNhJEUgY2FsbHJlYWwkRSAgICAgICBcCi0gICAgICAgICAgICAgICAgICBtb3VzZSRFIHRpY2skRSBrZXkkRSBrZXkxNSRFIGJyayRFIGFsdGJyayRFICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICBjcml0aWNhbCRFIGFsdGNyaXQkRSB2ZnRlc3QkRSBydGMkRSBnZXRjaCRFICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICBjcHUkRSB0aW1lcmMkRSB0aW1lcmNwcCRFIHNob3dwY2kkRSB1c3djJEUgYmxvY2skRQotLkVMU0UKLUVYRUZJTEVTICAgICAgICA9IG1lbXRlc3QkRSB2aWRlbyRFIGlzdmVzYSRFIGNhbGxyZWFsJEUgdmZ0ZXN0JEUgZ2V0Y2gkRSBcCi0gICAgICAgICAgICAgICAgICBjcHUkRSB0aW1lcmMkRSB0aW1lcmNwcCRFIHNob3dwY2kkRSB1c3djJEUgYmxvY2skRSBcCi0gICAgICAgICAgICAgICAgICBzYXZlJEUgcmVzdG9yZSRFCi0uRU5ESUYKLQotYWxsOiAkKEVYRUZJTEVTKQotCi0kKEVYRUZJTEVTKTogJChMSUJGSUxFKQotCi1tZW10ZXN0JEU6ICBtZW10ZXN0JE8KLWJpb3NwdHIkRTogIGJpb3NwdHIkTwotdmlkZW8kRTogICAgdmlkZW8kTwotaXN2ZXNhJEU6ICAgaXN2ZXNhJE8KLW1vdXNlJEU6ICAgIG1vdXNlJE8KLXRpY2skRTogICAgIHRpY2skTwota2V5JEU6ICAgICAga2V5JE8KLWtleTE1JEU6ICAgIGtleTE1JE8KLWJyayRFOiAgICAgIGJyayRPCi1hbHRicmskRTogICBhbHRicmskTwotY3JpdGljYWwkRTogY3JpdGljYWwkTwotYWx0Y3JpdCRFOiAgYWx0Y3JpdCRPCi1jYWxscmVhbCRFOiBjYWxscmVhbCRPCi12ZnRlc3QkRTogICB2ZnRlc3QkTwotcnRjJEU6ICAgICAgcnRjJE8KLWdldGNoJEU6ICAgIGdldGNoJE8KLWNwdSRFOiAgICAgIGNwdSRPCi10aW1lcmMkRTogICB0aW1lcmMkTwotdGltZXJjcHAkRTogdGltZXJjcHAkTwotc2hvd3BjaSRFOiAgc2hvd3BjaSRPCi11c3djJEU6ICAgICB1c3djJE8KLWJsb2NrJEU6ICAgIGJsb2NrJE8KLXNhdmUkRTogICAgIHNhdmUkTwotcmVzdG9yZSRFOiAgcmVzdG9yZSRPCi10ZXN0JEU6ICAgICB0ZXN0JE8gX3Rlc3QkTwotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBEZWZpbmUgdGhlIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzIHRvIGNyZWF0ZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGZvcgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotREVQRU5EX09CSiAgICAgIDo9ICQoT0JKRUNUUykgbWVtdGVzdCRPIGJpb3NwdHIkTyB2aWRlbyRPIGlzdmVzYSRPIG1vdXNlJE8gIFwKLSAgICAgICAgICAgICAgICAgICB0aWNrJE8ga2V5JE8ga2V5JE8gYnJrJE8gYWx0YnJrJE8gY3JpdGljYWwkTyBhbHRjcml0JE8gICBcCi0gICAgICAgICAgICAgICAgICAgY2FsbHJlYWwkTyB2ZnRlc3QkTyBnZXRjaCRPIHRpbWVyY3BwJE8KLQotLklOQ0xVREU6ICIkKFNDSVRFQ0gpL21ha2VkZWZzL2NvbW1vbi5tayIKLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvX2lycS5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9faXJxLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE4MjRhMC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9faXJxLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi07KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi07KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLTsqCi07KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLTsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsqCi07KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KgotOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqIExhbmd1YWdlOiAgICA4MDM4NiBBc3NlbWJsZXIsIFRBU00gNC4wIG9yIE5BU00KLTsqIEVudmlyb25tZW50OiAzMi1iaXQgV2luZG93cyBOVCBkZXZpY2UgZHJpdmVyCi07KgotOyogRGVzY3JpcHRpb246IExvdyBsZXZlbCBhc3NlbWJseSBzdXBwb3J0IGZvciB0aGUgUE0gbGlicmFyeSBzcGVjaWZpYyB0bwotOyogICAgICAgICAgICAgIFdpbmRvd3MgTlQgZGV2aWNlIGRyaXZlcnMuCi07KgotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICBJREVBTAotCi1pbmNsdWRlICJzY2l0ZWNoLm1hYyIgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcwotCi1oZWFkZXIgICAgICBfaXJxICAgICAgICAgICAgICAgIDsgU2V0IHVwIG1lbW9yeSBtb2RlbAotCi1iZWdkYXRhc2VnICBfaXJxCi0KLSAgICBjZXh0ZXJuIF9QTV9ydGNIYW5kbGVyLENQVFIKLSAgICBjZXh0ZXJuIF9QTV9wcmV2UlRDLEZDUFRSCi0KLVJ0Y0luc2lkZSAgIGR3ICAgICAgMCAgICAgICAgICAgOyBBcmUgd2Ugc3RpbGwgaGFuZGxpbmcgY3VycmVudCBpbnRlcnJ1cHQKLXNpZHRCdWYgICAgIGRmICAgICAgMCAgICAgICAgICAgOyBCdWZmZXIgZm9yIHNpZHQgaW5zdHJ1Y3Rpb24KLQotZW5kZGF0YXNlZyAgX2lycQotCi1iZWdjb2Rlc2VnICBfaXJxICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLWNwdWJsaWMgX1BNX2lycUNvZGVTdGFydAotCi07IE1hY3JvIHRvIGRlbGF5IGJyaWVmbHkgdG8gZW5zdXJlIHRoYXQgZW5vdWdoIHRpbWUgaGFzIGVsYXBzZWQgYmV0d2VlbgotOyBzdWNjZXNzaXZlIEkvTyBhY2Nlc3NlcyBzbyB0aGF0IHRoZSBkZXZpY2UgYmVpbmcgYWNjZXNzZWQgY2FuIHJlc3BvbmQKLTsgdG8gYm90aCBhY2Nlc3NlcyBldmVuIG9uIGEgdmVyeSBmYXN0IFBDLgotCi1pZmRlZiAgIFVTRV9OQVNNCi0lbWFjcm8gIERFTEFZIDAKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSVlbmRtYWNybwotJW1hY3JvICBJT0RFTEFZTiAxCi0lcmVwICAgICUxCi0gICAgICAgIERFTEFZCi0lZW5kcmVwCi0lZW5kbWFjcm8KLWVsc2UKLW1hY3JvICAgREVMQVkKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLWVuZG0KLW1hY3JvICAgSU9ERUxBWU4gICAgTgotICAgIHJlcHQgICAgTgotICAgICAgICBERUxBWQotICAgIGVuZG0KLWVuZG0KLWVuZGlmCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFBNX3J0Y0lTUiAtIFJlYWwgdGltZSBjbG9jayBpbnRlcnJ1cHQgc3Vicm91dGluZSBkaXNwYXRjaGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBIYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIHRpbWVyIGludGVycnVwdCwgdG8gZGlzcGF0Y2ggY29udHJvbAotOyB0byBoaWdoIGxldmVsIEMgYmFzZWQgc3Vicm91dGluZXMuIFdlIHNhdmUgdGhlIHN0YXRlIG9mIGFsbCByZWdpc3RlcnMKLTsgaW4gdGhpcyByb3V0aW5lLCBhbmQgc3dpdGNoIHRvIGEgbG9jYWwgc3RhY2suIEludGVycnVwdHMgYXJlICpvZmYqCi07IHdoZW4gd2UgY2FsbCB0aGUgdXNlciBjb2RlLgotOwotOyBOT1RFOiBUaGlzIHJvdXRpbmUgc3dpdGNoZXMgdG8gYSBsb2NhbCBzdGFjayBiZWZvcmUgY2FsbGluZyBhbnkgQyBjb2RlLAotOyAgICAgICBhbmQgaGVuY2UgaXMgX25vdF8gcmUtZW50cmFudC4gTWFrZSBzdXJlIHlvdXIgQyBjb2RlIGV4ZWN1dGVzIGFzCi07ICAgICAgIHF1aWNrbHkgYXMgcG9zc2libGUsIHNpbmNlIGEgdGltZXIgb3ZlcnJ1biB3aWxsIHNpbXBseSBoYW5nIHRoZQotOyAgICAgICBzeXN0ZW0uCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NmYXIgICAgX1BNX3J0Y0lTUgotCi07KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKLTsgSWYgd2UgZW5hYmxlIGludGVycnVwdHMgYW5kIGNhbGwgaW50byBhbnkgQyBiYXNlZCBpbnRlcnJ1cHQgaGFuZGxpbmcgY29kZSwKLTsgd2UgbmVlZCB0byBzZXR1cCBhIGJ1bmNoIG9mIGltcG9ydGFudCBpbmZvcm1hdGlvbiBmb3IgdGhlIE5UIGtlcm5lbC4gVGhlCi07IGNvZGUgYmVsb3cgdGFrZXMgY2FyZSBvZiB0aGlzIGhvdXNla2VlcGluZyBmb3IgdXMgKHNlZSBVbmRvY3VtZW50ZWQgTlQgZm9yCi07IGRldGFpbHMpLiBJZiB3ZSBkb24ndCBkbyB0aGlzIGhvdXNla2VlcGluZyBhbmQgaW50ZXJydXB0cyBhcmUgZW5hYmxlZCwKLTsgdGhlIGtlcm5lbCB3aWxsIGJlY29tZSB2ZXJ5IHVuc3RhYmxlIGFuZCBjcmFzaCB3aXRoaW4gMTAgc2Vjb25kcyBvciBzby4KLTsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwotCi0gICAgICAgIHB1c2hhZAotICAgICAgICBwdXNoZmQKLSAgICAgICAgcHVzaCAgICBmcwotCi0gICAgICAgIG1vdiAgICAgZWJ4LDAwMDAwMDMwaAotICAgICAgICBtb3YgICAgIGZzLGJ4Ci0gICAgICAgIHN1YiAgICAgZXNwLDUwaAotICAgICAgICBtb3YgICAgIGVicCxlc3AKLQotOyBTZXR1cCB0aGUgZXhjZXB0aW9uIGZyYW1lIHRvIE5VTEwKLQotICAgICAgICBtb3YgICAgIGVieCxbRFdPUkQgY3M6MEZGREZGMDAwaF0KLSAgICAgICAgbW92ICAgICBbRFdPUkQgZHM6MEZGREZGMDAwaF0sIDBGRkZGRkZGRmgKLSAgICAgICAgbW92ICAgICBbRFdPUkQgZWJwXSxlYngKLQotOyBTYXZlIGF3YXkgdGhlIGV4aXN0aW5nIEtTUyBlYnAKLQotICAgICAgICBtb3YgICAgIGVzaSxbRFdPUkQgY3M6MEZGREZGMTI0aF0KLSAgICAgICAgbW92ICAgICBlYngsW0RXT1JEIGVzaSswMDAwMDEyOGhdCi0gICAgICAgIG1vdiAgICAgW0RXT1JEIGVicCs0aF0sZWJ4Ci0gICAgICAgIG1vdiAgICAgW0RXT1JEIGVzaSswMDAwMDEyOGhdLGVicAotCi07IFNhdmUgYXdheSB0aGUga2VybmVsIHRpbWUgYW5kIHRoZSB0aHJlYWQgbW9kZSAoa2VybmVsL3VzZXIpCi0KLSAgICAgICAgbW92ICAgICBlZGksW0RXT1JEIGVzaSswMDAwMDEzN2hdCi0gICAgICAgIG1vdiAgICAgW0RXT1JEIGVicCs4aF0sZWRpCi0KLTsgU2V0IHRoZSB0aHJlYWQgbW9kZSAoa2VybmVsL3VzZXIpIGJhc2VkIG9uIHRoZSBjb2RlIHNlbGVjdG9yCi0KLSAgICAgICAgbW92ICAgICBlYngsW0RXT1JEIGVicCs3Q2hdCi0gICAgICAgIGFuZCAgICAgZWJ4LDAxCi0gICAgICAgIG1vdiAgICAgW0JZVEUgZXNpKzAwMDAwMTM3aF0sYmwKLQotOysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCi07IEVuZCBvZiBzcGVjaWFsIGludGVycnVwdCBQcm9sb2cgY29kZQotOysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCi0KLTsgQ2xlYXIgcHJpb3JpdHkgaW50ZXJydXB0IGNvbnRyb2xsZXIgYW5kIHJlLWVuYWJsZSBpbnRlcnJ1cHRzIHNvIHdlCi07IGRvbnQgbG9jayB0aGluZ3MgdXAgZm9yIGxvbmcuCi0KLSAgICAgICAgbW92ICAgICBhbCwyMGgKLSAgICAgICAgb3V0ICAgICAwQTBoLGFsCi0gICAgICAgIG91dCAgICAgMDIwaCxhbAotCi07IENsZWFyIHJlYWwtdGltZSBjbG9jayB0aW1lb3V0Ci0KLSAgICAgICAgaW4gICAgICBhbCw3MGggICAgICAgICAgICAgIDsgUmVhZCBDTU9TIGluZGV4IHJlZ2lzdGVyCi0gICAgICAgIHB1c2ggICAgZWF4ICAgICAgICAgICAgICAgICA7ICBhbmQgc2F2ZSBmb3IgbGF0ZXIKLSAgICAgICAgSU9ERUxBWU4gMwotICAgICAgICBtb3YgICAgIGFsLDBDaAotICAgICAgICBvdXQgICAgIDcwaCxhbAotICAgICAgICBJT0RFTEFZTiA1Ci0gICAgICAgIGluICAgICAgYWwsNzFoCi0KLTsgQ2FsbCB0aGUgQyBpbnRlcnJ1cHQgaGFuZGxlciBmdW5jdGlvbgotCi0gICAgICAgIGNtcCAgICAgW0JZVEUgUnRjSW5zaWRlXSwxICA7IENoZWNrIGZvciBtdXR1YWwgZXhjbHVzaW9uCi0gICAgICAgIGplICAgICAgQEBFeGl0Ci0gICAgICAgIG1vdiAgICAgW0JZVEUgUnRjSW5zaWRlXSwxCi0gICAgICAgIHN0aSAgICAgICAgICAgICAgICAgICAgICAgICA7IEVuYWJsZSBpbnRlcnJ1cHRzCi0gICAgICAgIGNsZCAgICAgICAgICAgICAgICAgICAgICAgICA7IENsZWFyIGRpcmVjdGlvbiBmbGFnIGZvciBDIGNvZGUKLSAgICAgICAgY2FsbCAgICBbQ1BUUiBfUE1fcnRjSGFuZGxlcl0KLSAgICAgICAgY2xpICAgICAgICAgICAgICAgICAgICAgICAgIDsgRGlzYWJsZSBpbnRlcnJ1cHRzIG9uIGV4aXQhCi0gICAgICAgIG1vdiAgICAgW0JZVEUgUnRjSW5zaWRlXSwwCi0KLUBARXhpdDogcG9wICAgICBlYXgKLSAgICAgICAgb3V0ICAgICA3MGgsYWwgICAgICAgICAgICAgIDsgUmVzdG9yZSBDTU9TIGluZGV4IHJlZ2lzdGVyCi0KLTsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwotOyBTdGFydCBvZiBzcGVjaWFsIGVwaWxvZyBjb2RlIHRvIHJlc3RvcmUgc3R1ZmYgb24gZXhpdCBmcm9tIGhhbmRsZXIKLTsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwotCi07IFJlc3RvcmUgdGhlIEtTUyBlYnAKLQotICAgICAgICBtb3YgICAgIGVzaSxbRFdPUkQgY3M6MEZGREZGMTI0aF0KLSAgICAgICAgbW92ICAgICBlYngsW0RXT1JEIGVicCs0XQotICAgICAgICBtb3YgICAgIFtEV09SRCBlc2krMDAwMDAxMjhoXSxlYngKLQotOyBSZXN0b3JlIHRoZSBleGNlcHRpb24gZnJhbWUKLQotICAgICAgICBtb3YgICAgIGVieCxbRFdPUkQgZWJwXQotICAgICAgICBtb3YgICAgIFtEV09SRCBmczowMDAwMDAwMF0sZWJ4Ci0KLTsgUmVzdG9yZSB0aGUgdGhyZWFkIG1vZGUKLQotICAgICAgICBtb3YgICAgIGVieCxbRFdPUkQgZWJwKzhoXQotICAgICAgICBtb3YgICAgIGVzaSxbRFdPUkQgZnM6MDAwMDAxMjRoXQotICAgICAgICBtb3YgICAgIFtCWVRFIGVzaSswMDAwMDEzN2hdLGJsCi0gICAgICAgIGFkZCAgICAgZXNwLCA1MGgKLSAgICAgICAgcG9wICAgICBmcwotICAgICAgICBwb3BmZAotICAgICAgICBwb3BhZAotCi07IFJldHVybiBmcm9tIGludGVycnVwdAotCi0gICAgICAgIGlyZXQKLQotY3Byb2NlbmQKLQotY3B1YmxpYyBfUE1faXJxQ29kZUVuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9QTV9nZXRJU1IoaW50IGlycSxQTUZBUlBUUiAqaGFuZGxlcik7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBGdW5jdGlvbiB0byByZXR1cm4gdGhlIHNwZWNpZmljIElSUSBoYW5kbGVyIGRpcmVjdCBmcm9tIHRoZSBJRFQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX2dldElTUgotCi0gICAgICAgIEFSRyAgICAgaWR0RW50cnk6VUlOVCwgaGFuZGxlcjpEUFRSCi0KLSAgICAgICAgZW50ZXJfYyAwCi0gICAgICAgIG1vdiAgICAgZWN4LFtoYW5kbGVyXSAgICAgICAgICAgOyBHZXQgYWRkcmVzcyBvZiBoYW5kbGVyIHRvIGZpbGwgaW4KLSAgICAgICAgc2lkdCAgICBbc2lkdEJ1Zl0gICAgICAgICAgICAgICA7IEdldCBJRFRSIHJlZ2lzdGVyIGludG8gc2lkdEJ1ZgotICAgICAgICBtb3YgICAgIGVheCxbRFdPUkQgc2lkdEJ1ZisyXSAgIDsgR2V0IGFkZHJlc3Mgb2YgSURUIGludG8gRUFYCi0gICAgICAgIG1vdiAgICAgZWJ4LFtpZHRFbnRyeV0KLSAgICAgICAgbGVhICAgICBlYXgsW2VheCtlYngqOF0gICAgICAgICA7IEdldCBlbnRyeSBpbiB0aGUgSURUCi0gICAgICAgIG1vdnp4ICAgZWR4LFtXT1JEIGVheCs2XSAgICAgICAgOyBHZXQgaGlnaCBvcmRlciAxNi1iaXRzCi0gICAgICAgIHNobCAgICAgZWR4LDE2ICAgICAgICAgICAgICAgICAgOyBNb3ZlIGludG8gdG9wIDE2LWJpdHMgb2YgYWRkcmVzcwotICAgICAgICBtb3YgICAgIGR4LFtXT1JEIGVheF0gICAgICAgICAgIDsgR2V0IGxvdyBvcmRlciAxNi1iaXRzCi0gICAgICAgIG1vdiAgICAgW0RXT1JEIGVjeF0sZWR4ICAgICAgICAgOyBTdG9yZSBsaW5lYXIgYWRkcmVzcyBvZiBoYW5kbGVyCi0gICAgICAgIG1vdiAgICAgZHgsW1dPUkQgZWF4KzJdICAgICAgICAgOyBHZXQgc2VsZWN0b3IgdmFsdWUKLSAgICAgICAgbW92ICAgICBbV09SRCBlY3grNF0sZHggICAgICAgICA7IFN0b3JlIHNlbGVjdG9yIHZhbHVlCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kICAgIF9QTV9nZXRJU1IKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfUE1fc2V0SVNSKGludCBpcnEsdm9pZCAqaGFuZGxlcik7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBGdW5jdGlvbiB0byBzZXQgdGhlIHNwZWNpZmljIElSUSBoYW5kbGVyIGRpcmVjdCBpbiB0aGUgSURULgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV9zZXRJU1IKLQotICAgICAgICBBUkcgICAgIGlycTpVSU5ULCBoYW5kbGVyOkNQVFIKLQotICAgICAgICBlbnRlcl9jIDAKLSAgICAgICAgbW92ICAgICBlY3gsW2hhbmRsZXJdICAgICAgICAgICA7IEdldCBhZGRyZXNzIG9mIG5ldyBoYW5kbGVyCi0gICAgICAgIG1vdiAgICAgZHgsY3MgICAgICAgICAgICAgICAgICAgOyBHZXQgc2VsZWN0b3IgZm9yIG5ldyBoYW5kbGVyCi0gICAgICAgIHNpZHQgICAgW3NpZHRCdWZdICAgICAgICAgICAgICAgOyBHZXQgSURUUiByZWdpc3RlciBpbnRvIHNpZHRCdWYKLSAgICAgICAgbW92ICAgICBlYXgsW0RXT1JEIHNpZHRCdWYrMl0gICA7IEdldCBhZGRyZXNzIG9mIElEVCBpbnRvIEVBWAotICAgICAgICBtb3YgICAgIGVieCxbaWR0RW50cnldCi0gICAgICAgIGxlYSAgICAgZWF4LFtlYXgrZWJ4KjhdICAgICAgICAgOyBHZXQgZW50cnkgaW4gdGhlIElEVAotICAgICAgICBjbGkKLSAgICAgICAgbW92ICAgICBbV09SRCBlYXgrMl0sZHggICAgICAgICA7IFN0b3JlIGNvZGUgc2VnbWVudCBzZWxlY3RvcgotICAgICAgICBtb3YgICAgIFtXT1JEIGVheF0sY3ggICAgICAgICAgIDsgU3RvcmUgbG93IG9yZGVyIGJpdHMgb2YgaGFuZGxlcgotICAgICAgICBzaHIgICAgIGVjeCwxNgotICAgICAgICBtb3YgICAgIFtXT1JEIGVheCs2XSxjeCAgICAgICAgIDsgU3RvcmUgaGlnaCBvcmRlciBiaXRzIG9mIGhhbmRsZXIKLSAgICAgICAgc3RpCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kICAgIF9QTV9zZXRJU1IKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfUE1fcmVzdG9yZUlTUihpbnQgaXJxLFBNRkFSUFRSICpoYW5kbGVyKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEZ1bmN0aW9uIHRvIHNldCB0aGUgc3BlY2lmaWMgSVJRIGhhbmRsZXIgZGlyZWN0IGluIHRoZSBJRFQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX3Jlc3RvcmVJU1IKLQotICAgICAgICBBUkcgICAgIGlycTpVSU5ULCBoYW5kbGVyOkNQVFIKLQotICAgICAgICBlbnRlcl9jIDAKLSAgICAgICAgbW92ICAgICBlY3gsW2hhbmRsZXJdCi0gICAgICAgIG1vdiAgICAgZHgsW1dPUkQgZWN4KzRdICAgICAgICAgOyBHZXQgc2VsZWN0b3IgZm9yIG9sZCBoYW5kbGVyCi0gICAgICAgIG1vdiAgICAgZWN4LFtEV09SRCBlY3hdICAgICAgICAgOyBHZXQgYWRkcmVzcyBvZiBvbGQgaGFuZGxlcgotICAgICAgICBzaWR0ICAgIFtzaWR0QnVmXSAgICAgICAgICAgICAgIDsgR2V0IElEVFIgcmVnaXN0ZXIgaW50byBzaWR0QnVmCi0gICAgICAgIG1vdiAgICAgZWF4LFtEV09SRCBzaWR0QnVmKzJdICAgOyBHZXQgYWRkcmVzcyBvZiBJRFQgaW50byBFQVgKLSAgICAgICAgbW92ICAgICBlYngsW2lkdEVudHJ5XQotICAgICAgICBsZWEgICAgIGVheCxbZWF4K2VieCo4XSAgICAgICAgIDsgR2V0IGVudHJ5IGluIHRoZSBJRFQKLSAgICAgICAgY2xpCi0gICAgICAgIG1vdiAgICAgW1dPUkQgZWF4KzJdLGR4ICAgICAgICAgOyBTdG9yZSBjb2RlIHNlZ21lbnQgc2VsZWN0b3IKLSAgICAgICAgbW92ICAgICBbV09SRCBlYXhdLGN4ICAgICAgICAgICA7IFN0b3JlIGxvdyBvcmRlciBiaXRzIG9mIGhhbmRsZXIKLSAgICAgICAgc2hyICAgICBlY3gsMTYKLSAgICAgICAgbW92ICAgICBbV09SRCBlYXgrNl0sY3ggICAgICAgICA7IFN0b3JlIGhpZ2ggb3JkZXIgYml0cyBvZiBoYW5kbGVyCi0gICAgICAgIHN0aQotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZCAgICBfUE1fcmVzdG9yZUlTUgotCi1lbmRjb2Rlc2VnICBfaXJxCi0KLSAgICAgICAgRU5EICAgICAgICAgICAgICAgICAgICAgOyBFbmQgb2YgbW9kdWxlCi0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L19wbS5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9fcG0uYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2IyNzZkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L19wbS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqCi07KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLTsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci07KgotOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLTsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi07KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLTsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07KgotOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyoKLTsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiBMYW5ndWFnZTogICAgODAzODYgQXNzZW1ibGVyLCBUQVNNIDQuMCBvciBOQVNNCi07KiBFbnZpcm9ubWVudDogMzItYml0IFdpbmRvd3MgTlQgZGV2aWNlIGRyaXZlcgotOyoKLTsqIERlc2NyaXB0aW9uOiBMb3cgbGV2ZWwgYXNzZW1ibHkgc3VwcG9ydCBmb3IgdGhlIFBNIGxpYnJhcnkgc3BlY2lmaWMgdG8KLTsqICAgICAgICAgICAgICBXaW5kb3dzIE5UIGRldmljZSBkcml2ZXJzLgotOyoKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgSURFQUwKLQotaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICAgICAgOyBNZW1vcnkgbW9kZWwgbWFjcm9zCi0KLWhlYWRlciAgICAgIF9wbSAgICAgICAgICAgICAgICAgICAgIDsgU2V0IHVwIG1lbW9yeSBtb2RlbAotCi1QNTg2Ci0KLWJlZ2RhdGFzZWcKLQotOyBXYXRjb20gQysrIGV4dGVybmFscyByZXF1aXJlZCB0byBsaW5rIHdoZW4gY29tcGlsaW5nIGZsb2F0aW5nIHBvaW50Ci07IEMgY29kZS4gVGhleSBhcmUgbm90IGFjdHVhbGx5IHVzZWQgaW4gdGhlIGNvZGUgYmVjYXVzZSB3ZSBjb21waWxlIHdpdGgKLTsgaW5saW5lIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucywgaG93ZXZlciB0aGUgY29tcGlsZXIgc3RpbGwgZ2VuZXJhdGVzCi07IHRoZSByZWZlcmVuY2VzIGluIHRoZSBvYmplY3QgbW9kdWxlcy4KLQotX184MDg3ICAgICAgZGQgIDAKLSAgICAgICAgICAgIFBVQkxJQyAgX184MDg3Ci1fX2ltdGhyZWFkOgotX19mbHR1c2VkOgotX2ZsdHVzZWRfICAgZGQgIDAKLSAgICAgICAgICAgIFBVQkxJQyAgX19pbXRocmVhZAotICAgICAgICAgICAgUFVCTElDICBfZmx0dXNlZF8KLSAgICAgICAgICAgIFBVQkxJQyAgX19mbHR1c2VkCi0KLWVuZGRhdGFzZWcKLQotYmVnY29kZXNlZyAgX3BtICAgICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGNvZGUgc2VnbWVudAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX3NlZ3JlYWQoUE1TUkVHUyAqc3JlZ3MpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZWFkIHRoZSBjdXJyZW50IHZhbHVlIG9mIGFsbCBzZWdtZW50IHJlZ2lzdGVycwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX3NlZ3JlYWQKLQotICAgICAgICBBUkcgICAgIHNyZWdzOkRQVFIKLQotICAgICAgICBlbnRlcl9jCi0KLSAgICAgICAgbW92ICAgICBheCxlcwotICAgICAgICBfbGVzICAgIF9zaSxbc3JlZ3NdCi0gICAgICAgIG1vdiAgICAgW19FUyBfc2ldLGF4Ci0gICAgICAgIG1vdiAgICAgW19FUyBfc2krMl0sY3MKLSAgICAgICAgbW92ICAgICBbX0VTIF9zaSs0XSxzcwotICAgICAgICBtb3YgICAgIFtfRVMgX3NpKzZdLGRzCi0gICAgICAgIG1vdiAgICAgW19FUyBfc2krOF0sZnMKLSAgICAgICAgbW92ICAgICBbX0VTIF9zaSsxMF0sZ3MKLQotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpbnQgUE1faW50Mzg2eChpbnQgaW50bm8sIFBNUkVHUyAqaW4sIFBNUkVHUyAqb3V0LFBNU1JFR1MgKnNyZWdzKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSXNzdWVzIGEgc29mdHdhcmUgaW50ZXJydXB0IGluIHByb3RlY3RlZCBtb2RlLiBUaGlzIHJvdXRpbmUgaGFzIGJlZW4KLTsgd3JpdHRlbiB0byBhbGxvdyB1c2VyIHByb2dyYW1zIHRvIGxvYWQgQ1MgYW5kIERTIHdpdGggZGlmZmVyZW50IHZhbHVlcwotOyBvdGhlciB0aGFuIHRoZSBkZWZhdWx0LgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX2ludDM4NngKLQotOyBOb3QgdXNlZCBmb3IgTlQgZGV2aWNlIGRyaXZlcnMKLQotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBQTV9zZXRCYW5rQShpbnQgYmFuaykKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICAgICAgUE1fc2V0QmFua0EKLQotOyBOb3QgdXNlZCBmb3IgTlQgZGV2aWNlIGRyaXZlcnMKLQotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBQTV9zZXRCYW5rQUIoaW50IGJhbmspCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgICAgIFBNX3NldEJhbmtBQgotCi07IE5vdCB1c2VkIGZvciBOVCBkZXZpY2UgZHJpdmVycwotCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX3NldENSVFN0YXJ0KGludCB4LGludCB5LGludCB3YWl0VlJUKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgICAgICBQTV9zZXRDUlRTdGFydAotCi07IE5vdCB1c2VkIGZvciBOVCBkZXZpY2UgZHJpdmVycwotCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07IE1hY3JvIHRvIGRlbGF5IGJyaWVmbHkgdG8gZW5zdXJlIHRoYXQgZW5vdWdoIHRpbWUgaGFzIGVsYXBzZWQgYmV0d2VlbgotOyBzdWNjZXNzaXZlIEkvTyBhY2Nlc3NlcyBzbyB0aGF0IHRoZSBkZXZpY2UgYmVpbmcgYWNjZXNzZWQgY2FuIHJlc3BvbmQKLTsgdG8gYm90aCBhY2Nlc3NlcyBldmVuIG9uIGEgdmVyeSBmYXN0IFBDLgotCi1pZmRlZiAgIFVTRV9OQVNNCi0lbWFjcm8gIERFTEFZIDAKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSVlbmRtYWNybwotJW1hY3JvICBJT0RFTEFZTiAxCi0lcmVwICAgICUxCi0gICAgICAgIERFTEFZCi0lZW5kcmVwCi0lZW5kbWFjcm8KLWVsc2UKLW1hY3JvICAgREVMQVkKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLSAgICAgICAgam1wICAgICBzaG9ydCAkKzIKLWVuZG0KLW1hY3JvICAgSU9ERUxBWU4gICAgTgotICAgIHJlcHQgICAgTgotICAgICAgICBERUxBWQotICAgIGVuZG0KLWVuZG0KLWVuZGlmCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVjaGFyIF9QTV9yZWFkQ01PUyhpbnQgaW5kZXgpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZWFkIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIENNT1MgcmVnaXN0ZXIuIFdlIGRvIHRoaXMgd2l0aCBib3RoCi07IG5vcm1hbCBpbnRlcnJ1cHRzIGFuZCBOTUkgZGlzYWJsZWQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX3JlYWRDTU9TCi0KLSAgICAgICAgQVJHICAgICBpbmRleDpVSU5UCi0KLSAgICAgICAgcHVzaCAgICBfYnAKLSAgICAgICAgbW92ICAgICBfYnAsX3NwCi0gICAgICAgIHB1c2hmZAotICAgICAgICBtb3YgICAgIGFsLFtCWVRFIGluZGV4XQotICAgICAgICBvciAgICAgIGFsLDgwaCAgICAgICAgICAgICAgOyBBZGQgZGlzYWJsZSBOTUkgZmxhZwotICAgICAgICBjbGkKLSAgICAgICAgb3V0ICAgICA3MGgsYWwKLSAgICAgICAgSU9ERUxBWU4gNQotICAgICAgICBpbiAgICAgIGFsLDcxaAotICAgICAgICBtb3YgICAgIGFoLGFsCi0gICAgICAgIHhvciAgICAgYWwsYWwKLSAgICAgICAgSU9ERUxBWU4gNQotICAgICAgICBvdXQgICAgIDcwaCxhbCAgICAgICAgICAgICAgOyBSZS1lbmFibGUgTk1JCi0gICAgICAgIG1vdiAgICAgYWwsYWggICAgICAgICAgICAgICA7IFJldHVybiB2YWx1ZSBpbiBBTAotICAgICAgICBwb3BmZAotICAgICAgICBwb3AgICAgIF9icAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfUE1fd3JpdGVDTU9TKGludCBpbmRleCx1Y2hhciB2YWx1ZSkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJlYWQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgQ01PUyByZWdpc3Rlci4gV2UgZG8gdGhpcyB3aXRoIGJvdGgKLTsgbm9ybWFsIGludGVycnVwdHMgYW5kIE5NSSBkaXNhYmxlZC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fd3JpdGVDTU9TCi0KLSAgICAgICAgQVJHICAgICBpbmRleDpVSU5ULCB2YWx1ZTpVQ0hBUgotCi0gICAgICAgIHB1c2ggICAgX2JwCi0gICAgICAgIG1vdiAgICAgX2JwLF9zcAotICAgICAgICBwdXNoZmQKLSAgICAgICAgbW92ICAgICBhbCxbQllURSBpbmRleF0KLSAgICAgICAgb3IgICAgICBhbCw4MGggICAgICAgICAgICAgIDsgQWRkIGRpc2FibGUgTk1JIGZsYWcKLSAgICAgICAgY2xpCi0gICAgICAgIG91dCAgICAgNzBoLGFsCi0gICAgICAgIElPREVMQVlOIDUKLSAgICAgICAgbW92ICAgICBhbCxbdmFsdWVdCi0gICAgICAgIG91dCAgICAgNzFoLGFsCi0gICAgICAgIHhvciAgICAgYWwsYWwKLSAgICAgICAgSU9ERUxBWU4gNQotICAgICAgICBvdXQgICAgIDcwaCxhbCAgICAgICAgICAgICAgOyBSZS1lbmFibGUgTk1JCi0gICAgICAgIHBvcGZkCi0gICAgICAgIHBvcCAgICAgX2JwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBkb3VibGUgX2Z0b2woZG91YmxlIGYpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDYWxscyB0byBfX2Z0b2wgYXJlIGdlbmVyYXRlZCBieSB0aGUgQm9ybGFuZCBDKysgY29tcGlsZXIgZm9yIGNvZGUKLTsgdGhhdCBuZWVkcyB0byBjb252ZXJ0IGEgZmxvYXRpbmcgcG9pbnQgdHlwZSB0byBhbiBpbnRlZ3JhbCB0eXBlLgotOwotOyBJbnB1dDogZmxvYXRpbmcgcG9pbnQgbnVtYmVyIG9uIHRoZSB0b3Agb2YgdGhlICc4Ny4KLTsKLTsgT3V0cHV0OiBhIChzaWduZWQgb3IgdW5zaWduZWQpIGxvbmcgaW4gRUFYCi07IEFsbCBvdGhlciByZWdpc3RlcnMgcHJlc2VydmVkLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfZnRvbAotCi0gICAgICAgIExPQ0FMICAgdGVtcDE6V09SRCwgdGVtcDI6UVdPUkQgPSBMb2NhbFNpemUKLQotICAgICAgICBwdXNoICAgIGVicAotICAgICAgICBtb3YgICAgIGVicCxlc3AKLSAgICAgICAgc3ViICAgICBlc3AsTG9jYWxTaXplCi0KLSAgICAgICAgZnN0Y3cgICBbdGVtcDFdICAgICAgICAgICAgICAgICA7IHNhdmUgdGhlIGNvbnRyb2wgd29yZAotICAgICAgICBmd2FpdAotICAgICAgICBtb3YgICAgIGFsLFtCWVRFIHRlbXAxKzFdCi0gICAgICAgIG9yICAgICAgW0JZVEUgdGVtcDErMV0sMENoICAgICAgOyBzZXQgcm91bmRpbmcgY29udHJvbCB0byBjaG9wCi0gICAgICAgIGZsZGN3ICAgW3RlbXAxXQotICAgICAgICBmaXN0cCAgIFt0ZW1wMl0gICAgICAgICAgICAgICAgIDsgY29udmVydCB0byA2NC1iaXQgaW50ZWdlcgotICAgICAgICBtb3YgICAgIFtCWVRFIHRlbXAxKzFdLGFsCi0gICAgICAgIGZsZGN3ICAgW3RlbXAxXSAgICAgICAgICAgICAgICAgOyByZXN0b3JlIHRoZSBjb250cm9sIHdvcmQKLSAgICAgICAgbW92ICAgICBlYXgsW0RXT1JEIHRlbXAyXSAgICAgICA7IHJldHVybiBMUyAzMiBiaXRzCi0gICAgICAgIG1vdiAgICAgZWR4LFtEV09SRCB0ZW1wMis0XSAgICAgOyAgICAgICAgTVMgMzIgYml0cwotCi0gICAgICAgIG1vdiAgICAgZXNwLGVicAotICAgICAgICBwb3AgICAgIGVicAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgX1BNX2dldFBEQiAtIFJldHVybiB0aGUgUGFnZSBUYWJsZSBEaXJlY3RvcnkgQmFzZSBhZGRyZXNzCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX2dldFBEQgotCi0gICAgICAgIG1vdiAgICAgZWF4LGNyMwotICAgICAgICBhbmQgICAgIGVheCwwRkZGRkYwMDBoCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBGbHVzaCB0aGUgVHJhbnNsYXRpb24gTG9va2FzaWRlIGJ1ZmZlcgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX2ZsdXNoVExCCi0KLSAgICAgICAgd2JpbnZkICAgICAgICAgICAgICAgICAgOyBGbHVzaCB0aGUgQ1BVIGNhY2hlCi0gICAgICAgIG1vdiAgICAgZWF4LGNyMwotICAgICAgICBtb3YgICAgIGNyMyxlYXggICAgICAgICA7IEZsdXNoIHRoZSBUTEIKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLWVuZGNvZGVzZWcgIF9wbQotCi0gICAgICAgIEVORCAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvY3B1aW5mby5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvY3B1aW5mby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTViMDdjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L2NwdWluZm8uYworKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBXaW5kb3dzIFZ4RAotKgotKiBEZXNjcmlwdGlvbjogIFZ4RCBzcGVjaWZpYyBjb2RlIGZvciB0aGUgQ1BVIGRldGVjdGlvbiBtb2R1bGUuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURvIG5vdGhpbmcgZm9yIFZ4RCdzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBTZXRNYXhUaHJlYWRQcmlvcml0eSgpICAgICAgMAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURvIG5vdGhpbmcgZm9yIFZ4RCdzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBSZXN0b3JlVGhyZWFkUHJpb3JpdHkoaSkgICAgKHZvaWQpKGkpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgY291bnRlciBhbmQgcmV0dXJuIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGNvdW50ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgR2V0Q291bnRlckZyZXF1ZW5jeSgKLSAgICBDUFVfbGFyZ2VJbnRlZ2VyICpmcmVxKQotewotICAgIEtlUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoKExBUkdFX0lOVEVHRVIqKWZyZXEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgY291bnRlciB2YWx1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEdldENvdW50ZXIodCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTEFSR0VfSU5URUdFUiBsdCA9IEtlUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoTlVMTCk7ICAgICBcCi0gICAgKHQpLT5sb3cgPSBsdC5Mb3dQYXJ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHQpLT5oaWdoID0gbHQuSGlnaFBhcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9pbnQ4Ni5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvaW50ODYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgyNjQ4Yi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9pbnQ4Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBXaW5kb3dzIE5UIGRldmljZSBkcml2ZXJzLgotKgotKiBEZXNjcmlwdGlvbjogIEltcGxlbWVudGF0aW9uIGZvciB0aGUgcmVhbCBtb2RlIHNvZnR3YXJlIGludGVycnVwdAotKiAgICAgICAgICAgICAgIGhhbmRsaW5nIGZ1bmN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgImRydmxpYi9vcy9vcy5oIgotI2luY2x1ZGUgInNkZC9zZGRoZWxwLmgiCi0jaW5jbHVkZSAibXRyci5oIgotI2luY2x1ZGUgIm9zaGRyLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotV2UgZG8gaGF2ZSBsaW1pdGVkIEJJT1MgYWNjZXNzIHVuZGVyIFdpbmRvd3MgTlQgZGV2aWNlIGRyaXZlcnMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1faGF2ZUJJT1NBY2Nlc3Modm9pZCkKLXsKLSAgICAvKiBSZXR1cm4gZmFsc2UgdW5sZXNzIHdlIGhhdmUgZnVsbCBidWZmZXIgcGFzc2luZyEgKi8KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotbGVuICAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlcgotcnNlZyAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSByZWFsIG1vZGUgc2VnbWVudCBvZiB0aGUgYnVmZmVyCi1yb2ZmICAgIC0gUGxhY2UgdG8gc3RvcmUgdGhlIHJlYWwgbW9kZSBvZmZzZXQgb2YgdGhlIGJ1ZmZlcgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBhZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIGdsb2JhbCBWRVNBIHRyYW5zZmVyCi1idWZmZXIgdGhhdCBpcyB1c2VkIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIFZFU0EgQklPUyBmdW5jdGlvbnMgZnJvbQotV2luMTYgYW5kIFdpbjMyIHByb2dyYW1zIHVuZGVyIFdpbmRvd3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2dldFZFU0FCdWYoCi0gICAgdWludCAqbGVuLAotICAgIHVpbnQgKnJzZWcsCi0gICAgdWludCAqcm9mZikKLXsKLSAgICAvKiBObyBidWZmZXJzIHN1cHBvcnRlZCB1bmRlciBXaW5kb3dzIE5UIChXaW5kb3dzIFhQIGhhcyB0aGVtIGhvd2V2ZXIgaWYgKi8KLSAgICAvKiB3ZSBldmVyIGRlY2lkZSB0byBzdXBwb3J0IHRoaXMhKSAqLwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUlzc3VlIGEgcHJvdGVjdGVkIG1vZGUgc29mdHdhcmUgaW50ZXJydXB0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9pbnQzODYoCi0gICAgaW50IGludG5vLAotICAgIFBNUkVHUyAqaW4sCi0gICAgUE1SRUdTICpvdXQpCi17Ci0gICAgUE1TUkVHUyBzcmVnczsKLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0gICAgcmV0dXJuIFBNX2ludDM4NngoaW50bm8saW4sb3V0LCZzcmVncyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTWFwIGEgcmVhbCBtb2RlIHBvaW50ZXIgdG8gYSBwcm90ZWN0ZWQgbW9kZSBwb2ludGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9tYXBSZWFsUG9pbnRlcigKLSAgICB1aW50IHJfc2VnLAotICAgIHVpbnQgcl9vZmYpCi17Ci0gICAgLyogTm90IHVzZWQgZm9yIFdpbmRvd3MgTlQgZHJpdmVycyEgKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZSBhIGJsb2NrIG9mIHJlYWwgbW9kZSBtZW1vcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fYWxsb2NSZWFsU2VnKAotICAgIHVpbnQgc2l6ZSwKLSAgICB1aW50ICpyX3NlZywKLSAgICB1aW50ICpyX29mZikKLXsKLSAgICAvKiBOb3Qgc3VwcG9ydGVkIGluIE5UIGRyaXZlcnMgKi8KLSAgICAodm9pZClzaXplOwotICAgICh2b2lkKXJfc2VnOwotICAgICh2b2lkKXJfb2ZmOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZyZWUgYSBibG9jayBvZiByZWFsIG1vZGUgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZVJlYWxTZWcoCi0gICAgdm9pZCAqbWVtKQotewotICAgIC8qIE5vdCBzdXBwb3J0ZWQgaW4gTlQgZHJpdmVycyAqLwotICAgICh2b2lkKW1lbTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jc3N1ZSBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQgKHBhcmFtZXRlcnMgaW4gRFBNSSBjb21wYXRpYmxlIHN0cnVjdHVyZSkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIERQTUlfaW50ODYoCi0gICAgaW50IGludG5vLAotICAgIERQTUlfcmVncyAqcmVncykKLXsKLSAgICAvKiBOb3QgdXNlZCBpbiBOVCBkcml2ZXJzICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCBhIFY4NiByZWFsIG1vZGUgZnVuY3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIHZhbHVlcwotbG9hZGVkIGJlZm9yZSB0aGUgY2FsbC4gVGhlIGNhbGwgcmV0dXJucyB3aXRoIGEgZmFyIHJldC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2NhbGxSZWFsTW9kZSgKLSAgICB1aW50IHNlZywKLSAgICB1aW50IG9mZiwKLSAgICBSTVJFR1MgKnJlZ3MsCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgLyogVE9ETyEhICovCi0jaWYgMAotICAgIENMSUVOVF9TVFJVQ1Qgc2F2ZVJlZ3M7Ci0KLSAgICAvKiBCYWlsIGlmIHdlIGRvIG5vdCBoYXZlIEJJT1MgYWNjZXNzIChpZTogdGhlIFZ4RCB3YXMgZHluYW1pY2FsbHkKLSAgICAgKiBsb2FkZWQsIGFuZCBub3Qgc3RhdGljYWxseSBsb2FkZWQuCi0gICAgICovCi0gICAgaWYgKCFfUE1faGF2ZUJJT1MpCi0JcmV0dXJuOwotCi0gICAgVFJBQ0UoIlNEREhFTFA6IEVudGVyaW5nIFBNX2NhbGxSZWFsTW9kZSgpXG4iKTsKLSAgICBCZWdpbl9OZXN0X1Y4Nl9FeGVjKCk7Ci0gICAgTG9hZFY4NlJlZ2lzdGVycygmc2F2ZVJlZ3MscmVncyxzcmVncyk7Ci0gICAgU2ltdWxhdGVfRmFyX0NhbGwoc2VnLCBvZmYpOwotICAgIFJlc3VtZV9FeGVjKCk7Ci0gICAgUmVhZFY4NlJlZ2lzdGVycygmc2F2ZVJlZ3MscmVncyxzcmVncyk7Ci0gICAgRW5kX05lc3RfRXhlYygpOwotICAgIFRSQUNFKCJTRERIRUxQOiBFeGl0aW5nIFBNX2NhbGxSZWFsTW9kZSgpXG4iKTsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUlzc3VlIGEgVjg2IHJlYWwgbW9kZSBpbnRlcnJ1cHQgd2l0aCB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIHZhbHVlcwotbG9hZGVkIGJlZm9yZSB0aGUgaW50ZXJydXB0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9pbnQ4NigKLSAgICBpbnQgaW50bm8sCi0gICAgUk1SRUdTICppbiwKLSAgICBSTVJFR1MgKm91dCkKLXsKLSAgICAvKiBUT0RPISEgKi8KLSNpZiAwCi0gICAgUk1TUkVHUyAgICAgICAgIHNyZWdzID0gezB9OwotICAgIENMSUVOVF9TVFJVQ1QgICBzYXZlUmVnczsKLSAgICB1c2hvcnQgICAgICAgICAgb2xkRGlzYWJsZTsKLQotICAgIC8qIERpc2FibGUgcGFzcy11cCB0byBvdXIgVnhEIGhhbmRsZXIgc28gd2UgZGlyZWN0bHkgY2FsbCBCSU9TICovCi0gICAgVFJBQ0UoIlNEREhFTFA6IEVudGVyaW5nIFBNX2ludDg2KClcbiIpOwotICAgIGlmIChkaXNhYmxlVFNSRmxhZykgewotCW9sZERpc2FibGUgPSAqZGlzYWJsZVRTUkZsYWc7Ci0JKmRpc2FibGVUU1JGbGFnID0gMDsKLQl9Ci0gICAgQmVnaW5fTmVzdF9WODZfRXhlYygpOwotICAgIExvYWRWODZSZWdpc3RlcnMoJnNhdmVSZWdzLGluLCZzcmVncyk7Ci0gICAgRXhlY19JbnQoaW50bm8pOwotICAgIFJlYWRWODZSZWdpc3RlcnMoJnNhdmVSZWdzLG91dCwmc3JlZ3MpOwotICAgIEVuZF9OZXN0X0V4ZWMoKTsKLQotICAgIC8qIFJlLWVuYWJsZSBwYXNzLXVwIHRvIG91ciBWeEQgaGFuZGxlciBpZiBwcmV2aW91c2x5IGVuYWJsZWQgKi8KLSAgICBpZiAoZGlzYWJsZVRTUkZsYWcpCi0JKmRpc2FibGVUU1JGbGFnID0gb2xkRGlzYWJsZTsKLQotICAgIFRSQUNFKCJTRERIRUxQOiBFeGl0aW5nIFBNX2ludDg2KClcbiIpOwotI2Vsc2UKLSAgICAqb3V0ID0gKmluOwotI2VuZGlmCi0gICAgcmV0dXJuIG91dC0+eC5heDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jc3N1ZSBhIFY4NiByZWFsIG1vZGUgaW50ZXJydXB0IHdpdGggdGhlIHNwZWNpZmllZCByZWdpc3RlciB2YWx1ZXMKLWxvYWRlZCBiZWZvcmUgdGhlIGludGVycnVwdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1faW50ODZ4KAotICAgIGludCBpbnRubywKLSAgICBSTVJFR1MgKmluLAotICAgIFJNUkVHUyAqb3V0LAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIC8qIFRPRE8hISAqLwotI2lmIDAKLSAgICBDTElFTlRfU1RSVUNUICAgc2F2ZVJlZ3M7Ci0gICAgdXNob3J0ICAgICAgICAgIG9sZERpc2FibGU7Ci0KLSAgICAvKiBCYWlsIGlmIHdlIGRvIG5vdCBoYXZlIEJJT1MgYWNjZXNzIChpZTogdGhlIFZ4RCB3YXMgZHluYW1pY2FsbHkKLSAgICAgKiBsb2FkZWQsIGFuZCBub3Qgc3RhdGljYWxseSBsb2FkZWQuCi0gICAgICovCi0gICAgaWYgKCFfUE1faGF2ZUJJT1MpIHsKLQkqb3V0ID0gKmluOwotCXJldHVybiBvdXQtPnguYXg7Ci0JfQotCi0gICAgLyogRGlzYWJsZSBwYXNzLXVwIHRvIG91ciBWeEQgaGFuZGxlciBzbyB3ZSBkaXJlY3RseSBjYWxsIEJJT1MgKi8KLSAgICBUUkFDRSgiU0RESEVMUDogRW50ZXJpbmcgUE1faW50ODZ4KClcbiIpOwotICAgIGlmIChkaXNhYmxlVFNSRmxhZykgewotCW9sZERpc2FibGUgPSAqZGlzYWJsZVRTUkZsYWc7Ci0JKmRpc2FibGVUU1JGbGFnID0gMDsKLQl9Ci0gICAgQmVnaW5fTmVzdF9WODZfRXhlYygpOwotICAgIExvYWRWODZSZWdpc3RlcnMoJnNhdmVSZWdzLGluLHNyZWdzKTsKLSAgICBFeGVjX0ludChpbnRubyk7Ci0gICAgUmVhZFY4NlJlZ2lzdGVycygmc2F2ZVJlZ3Msb3V0LHNyZWdzKTsKLSAgICBFbmRfTmVzdF9FeGVjKCk7Ci0KLSAgICAvKiBSZS1lbmFibGUgcGFzcy11cCB0byBvdXIgVnhEIGhhbmRsZXIgaWYgcHJldmlvdXNseSBlbmFibGVkICovCi0gICAgaWYgKGRpc2FibGVUU1JGbGFnKQotCSpkaXNhYmxlVFNSRmxhZyA9IG9sZERpc2FibGU7Ci0KLSAgICBUUkFDRSgiU0RESEVMUDogRXhpdGluZyBQTV9pbnQ4NngoKVxuIik7Ci0jZWxzZQotICAgICpvdXQgPSAqaW47Ci0jZW5kaWYKLSAgICByZXR1cm4gb3V0LT54LmF4OwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvaXJxLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9pcnEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkNTIwNDcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvaXJxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IFdpbmRvd3MgTlQgZGV2aWNlIGRyaXZlcnMuCi0qCi0qIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBOVCBkcml2ZXIgSVJRIG1hbmFnZW1lbnQgZnVuY3Rpb25zCi0qICAgICAgICAgICAgICAgZm9yIHRoZSBQTSBsaWJyYXJ5LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAicG1pbnQuaCIKLSNpbmNsdWRlICJkcnZsaWIvb3Mvb3MuaCIKLSNpbmNsdWRlICJzZGQvc2RkaGVscC5oIgotI2luY2x1ZGUgIm10cnIuaCIKLSNpbmNsdWRlICJvc2hkci5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50ICAgICAgICAgIGdsb2JhbERhdGFTdGFydDsKLXN0YXRpYyB1Y2hhciAgICAgICAgX1BNX29sZENNT1NSZWdBOwotc3RhdGljIHVjaGFyICAgICAgICBfUE1fb2xkQ01PU1JlZ0I7Ci1zdGF0aWMgdWNoYXIgICAgICAgIF9QTV9vbGRSVENQSUMyOwotc3RhdGljIHVsb25nICAgICAgICBSVENfaWR0RW50cnk7Ci1QTV9pbnRIYW5kbGVyICAgICAgIF9QTV9ydGNIYW5kbGVyID0gTlVMTDsKLVBNRkFSUFRSICAgIF9WQVJBUEkgX1BNX3ByZXZSVEMgPSBQTU5VTEw7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEZ1bmN0aW9ucyB0byByZWFkIGFuZCB3cml0ZSBDTU9TIHJlZ2lzdGVycyAqLwotCi11Y2hhciAgIF9BU01BUEkgX1BNX3JlYWRDTU9TKGludCBpbmRleCk7Ci12b2lkICAgIF9BU01BUEkgX1BNX3dyaXRlQ01PUyhpbnQgaW5kZXgsdWNoYXIgdmFsdWUpOwotdm9pZCAgICBfQVNNQVBJIF9QTV9ydGNJU1Iodm9pZCk7Ci12b2lkICAgIF9BU01BUEkgX1BNX2dldElTUihpbnQgaXJxLFBNRkFSUFRSICpoYW5kbGVyKTsKLXZvaWQgICAgX0FTTUFQSSBfUE1fc2V0SVNSKGludCBpcnEsdm9pZCAqaGFuZGxlcik7Ci12b2lkICAgIF9BU01BUEkgX1BNX3Jlc3RvcmVJU1IoaW50IGlycSxQTUZBUlBUUiAqaGFuZGxlcik7Ci12b2lkICAgIF9BU01BUEkgX1BNX2lycUNvZGVTdGFydCh2b2lkKTsKLXZvaWQgICAgX0FTTUFQSSBfUE1faXJxQ29kZUVuZCh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIHJlYWwgdGltZSBjbG9jayBmcmVxdWVuY3kgKGZvciBzdGVyZW8gbW9kZXMpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0ZyZXF1ZW5jeSgKLSAgICBpbnQgZnJlcXVlbmN5KQotewotICAgIHN0YXRpYyBzaG9ydCBjb252ZXJ0W10gPSB7Ci0JODE5MiwKLQk0MDk2LAotCTIwNDgsCi0JMTAyNCwKLQk1MTIsCi0JMjU2LAotCTEyOCwKLQk2NCwKLQkzMiwKLQkxNiwKLQk4LAotCTQsCi0JMiwKLQktMSwKLQl9OwotICAgIGludCBpOwotCi0gICAgLyogRmlyc3QgY2xlYXIgYW55IHBlbmRpbmcgUlRDIHRpbWVvdXQgaWYgbm90IGNsZWFyZWQgKi8KLSAgICBfUE1fcmVhZENNT1MoMHgwQyk7Ci0gICAgaWYgKGZyZXF1ZW5jeSA9PSAwKSB7Ci0JLyogRGlzYWJsZSBSVEMgdGltb3V0ICovCi0JX1BNX3dyaXRlQ01PUygweDBBLCh1Y2hhcilfUE1fb2xkQ01PU1JlZ0EpOwotCV9QTV93cml0ZUNNT1MoMHgwQiwodWNoYXIpKF9QTV9vbGRDTU9TUmVnQiAmIDB4MEYpKTsKLQl9Ci0gICAgZWxzZSB7Ci0JLyogQ29udmVydCBmcmVxdWVuY3kgdmFsdWUgdG8gUlRDIGNsb2NrIGluZGV4ZXMgKi8KLQlmb3IgKGkgPSAwOyBjb252ZXJ0W2ldICE9IC0xOyBpKyspIHsKLQkgICAgaWYgKGNvbnZlcnRbaV0gPT0gZnJlcXVlbmN5KQotCQlicmVhazsKLQkgICAgfQotCi0JLyogU2V0IFJUQyB0aW1vdXQgdmFsdWUgYW5kIGVuYWJsZSB0aW1lb3V0ICovCi0JX1BNX3dyaXRlQ01PUygweDBBLCh1Y2hhcikoMHgyMCB8IChpKzMpKSk7Ci0JX1BNX3dyaXRlQ01PUygweDBCLCh1Y2hhcikoKF9QTV9vbGRDTU9TUmVnQiAmIDB4MEYpIHwgMHg0MCkpOwotCX0KLX0KLQotaWJvb2wgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0hhbmRsZXIoUE1faW50SGFuZGxlciB0aCxpbnQgZnJlcXVlbmN5KQotewotICAgIHN0YXRpYyBpYm9vbCAgICBsb2NrZWQgPSBmYWxzZTsKLQotICAgIC8qIFNhdmUgdGhlIG9sZCBDTU9TIHJlYWwgdGltZSBjbG9jayB2YWx1ZXMgKi8KLSAgICBfUE1fb2xkQ01PU1JlZ0EgPSBfUE1fcmVhZENNT1MoMHgwQSk7Ci0gICAgX1BNX29sZENNT1NSZWdCID0gX1BNX3JlYWRDTU9TKDB4MEIpOwotCi0gICAgLyogSW5zdGFsbCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KLSAgICBSVENfaWR0RW50cnkgPSAweDM4OwotICAgIF9QTV9nZXRJU1IoUlRDX2lkdEVudHJ5LCAmX1BNX3ByZXZSVEMpOwotICAgIF9QTV9ydGNIYW5kbGVyID0gdGg7Ci0gICAgX1BNX3NldElTUihSVENfaWR0RW50cnksIF9QTV9ydGNJU1IpOwotCi0gICAgLyogUHJvZ3JhbSB0aGUgcmVhbCB0aW1lIGNsb2NrIGRlZmF1bHQgZnJlcXVlbmN5ICovCi0gICAgUE1fc2V0UmVhbFRpbWVDbG9ja0ZyZXF1ZW5jeShmcmVxdWVuY3kpOwotCi0gICAgLyogVW5tYXNrIElSUTggaW4gdGhlIFBJQzIgKi8KLSAgICBfUE1fb2xkUlRDUElDMiA9IFBNX2lucGIoMHhBMSk7Ci0gICAgUE1fb3V0cGIoMHhBMSwodWNoYXIpKF9QTV9vbGRSVENQSUMyICYgMHhGRSkpOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVSZWFsVGltZUNsb2NrSGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fcnRjSGFuZGxlcikgewotCS8qIFJlc3RvcmUgQ01PUyByZWdpc3RlcnMgYW5kIG1hc2sgUlRDIGNsb2NrICovCi0JX1BNX3dyaXRlQ01PUygweDBBLF9QTV9vbGRDTU9TUmVnQSk7Ci0JX1BNX3dyaXRlQ01PUygweDBCLF9QTV9vbGRDTU9TUmVnQik7Ci0JUE1fb3V0cGIoMHhBMSwodWNoYXIpKChQTV9pbnBiKDB4QTEpICYgMHhGRSkgfCAoX1BNX29sZFJUQ1BJQzIgJiB+MHhGRSkpKTsKLQotCS8qIFJlc3RvcmUgdGhlIGludGVycnVwdCB2ZWN0b3IgKi8KLQlfUE1fcmVzdG9yZUlTUihSVENfaWR0RW50cnksICZfUE1fcHJldlJUQyk7Ci0JX1BNX3J0Y0hhbmRsZXIgPSBOVUxMOwotCX0KLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L21lbS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvbWVtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMjhjNmEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvbWVtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IFdpbmRvd3MgTlQgZGV2aWNlIGRyaXZlcnMuCi0qCi0qIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBOVCBkcml2ZXIgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25zCi0qICAgICAgICAgICAgICAgZm9yIHRoZSBQTSBsaWJyYXJ5LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAiZHJ2bGliL29zL29zLmgiCi0jaW5jbHVkZSAic2RkL3NkZGhlbHAuaCIKLSNpbmNsdWRlICJtdHJyLmgiCi0jaW5jbHVkZSAib3NoZHIuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBNQVhfTUVNT1JZX1NIQVJFRCAgICAgICAgICAgMTAwCi0jZGVmaW5lIE1BWF9NRU1PUllfTUFQUElOR1MgICAgICAgICAxMDAKLSNkZWZpbmUgTUFYX01FTU9SWV9MT0NLRUQgICAgICAgICAgIDEwMAotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdm9pZCAgICAqbGluZWFyOwotICAgIHVsb25nICAgbGVuZ3RoOwotICAgIFBNREwgICAgcE1kbDsKLSAgICB9IG1lbXNoYXJlZDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHZvaWQgICAgKmxpbmVhcjsKLSAgICB2b2lkICAgICptbUlvTWFwcGVkOwotICAgIHVsb25nICAgbGVuZ3RoOwotICAgIFBNREwgICAgcE1kbDsKLSAgICB9IG1lbWxvY2tlZDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVsb25nICAgcGh5c2ljYWw7Ci0gICAgdWxvbmcgICBsaW5lYXI7Ci0gICAgdWxvbmcgICBsZW5ndGg7Ci0gICAgaWJvb2wgICBpc0NhY2hlZDsKLSAgICB9IG1tYXBwaW5nOwotCi1zdGF0aWMgaW50ICAgICAgICAgIG51bU1hcHBpbmdzID0gMDsKLXN0YXRpYyBtZW1zaGFyZWQgICAgc2hhcmVkW01BWF9NRU1PUllfTUFQUElOR1NdID0gezB9Owotc3RhdGljIG1tYXBwaW5nICAgICBtYXBzW01BWF9NRU1PUllfTUFQUElOR1NdOwotc3RhdGljIG1lbWxvY2tlZCAgICBsb2NrZWRbTUFYX01FTU9SWV9MT0NLRURdOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11bG9uZyAgIFBNQVBJIF9QTV9nZXRQREIodm9pZCk7Ci0KLS8qIFBhZ2UgdGFibGUgZW50cnkgZmxhZ3MgKi8KLQotI2RlZmluZSBQQUdFX0ZMQUdTX1BSRVNFTlQJCQkweDAwMDAwMDAxCi0jZGVmaW5lIFBBR0VfRkxBR1NfV1JJVEVBQkxFCQkweDAwMDAwMDAyCi0jZGVmaW5lIFBBR0VfRkxBR1NfVVNFUgkJCQkweDAwMDAwMDA0Ci0jZGVmaW5lIFBBR0VfRkxBR1NfV1JJVEVfVEhST1VHSAkweDAwMDAwMDA4Ci0jZGVmaW5lIFBBR0VfRkxBR1NfQ0FDSEVfRElTQUJMRQkweDAwMDAwMDEwCi0jZGVmaW5lIFBBR0VfRkxBR1NfQUNDRVNTRUQJCQkweDAwMDAwMDIwCi0jZGVmaW5lIFBBR0VfRkxBR1NfRElSVFkJCQkweDAwMDAwMDQwCi0jZGVmaW5lIFBBR0VfRkxBR1NfNE1CCSAgICAgICAgICAgIDB4MDAwMDAwODAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1iYXNlICAgICAgICAtIFBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IHRvIG1hcHMgaW4KLWxpbWl0ICAgICAgIC0gTGltaXQgb2YgcGh5c2ljYWwgbWVtb3J5IHRvIHJlZ2lvbiB0byBtYXBzIGluCi0KLVJFVFVSTlM6Ci1MaW5lYXIgYWRkcmVzcyBvZiB0aGUgbmV3bHkgbWFwcGVkIG1lbW9yeS4KLQotUkVNQVJLUzoKLU1hcHMgYSBwaHlzaWNhbCBtZW1vcnkgcmFuZ2UgdG8gYSBsaW5lYXIgbWVtb3J5IHJhbmdlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfUE1fbWFwUGh5c2ljYWxUb0xpbmVhcigKLSAgICB1bG9uZyBiYXNlLAotICAgIHVsb25nIGxpbWl0LAotICAgIGlib29sIGlzQ2FjaGVkKQotewotICAgIHVsb25nICAgICAgICAgICAgICAgbGVuZ3RoID0gbGltaXQrMTsKLSAgICBQSFlTSUNBTF9BRERSRVNTICAgIHBhSW9CYXNlID0gezB9OwotCi0gICAgLyogTlQgbG92ZXMgbGFyZ2UgSW50cyAqLwotICAgIHBhSW9CYXNlID0gUnRsQ29udmVydFVsb25nVG9MYXJnZUludGVnZXIoIGJhc2UgKTsKLQotICAgIC8qIE1hcCBJTyBzcGFjZSBpbnRvIEtlcm5lbCAqLwotICAgIGlmIChpc0NhY2hlZCkKLQlyZXR1cm4gKFVMT05HKU1tTWFwSW9TcGFjZShwYUlvQmFzZSwgbGVuZ3RoLCBNbUNhY2hlZCApOwotICAgIGVsc2UKLQlyZXR1cm4gKFVMT05HKU1tTWFwSW9TcGFjZShwYUlvQmFzZSwgbGVuZ3RoLCBNbU5vbkNhY2hlZCApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFkanVzdCB0aGUgcGFnZSB0YWJsZSBjYWNoaW5nIGJpdHMgZGlyZWN0bHkuIFJlcXVpcmVzIHJpbmcgMCBhY2Nlc3MgYW5kCi1vbmx5IHdvcmtzIHdpdGggRE9TNEdXIGFuZCBjb21wYXRpYmxlIGV4dGVuZGVycyAoQ2F1c2VXYXkgYWxzbyB3b3JrcyBzaW5jZQotaXQgaGFzIGRpcmVjdCBzdXBwb3J0IGZvciB0aGUgcmluZyAwIGluc3RydWN0aW9ucyB3ZSBuZWVkIGZyb20gcmluZyAzKS4gV2lsbAotbm90IHdvcmsgaW4gYSBET1MgYm94LCBidXQgd2UgY2FsbCBpbnRvIHRoZSByaW5nIDAgaGVscGVyIFZ4RCBzbyB3ZSBzaG91bGQKLW5ldmVyIGdldCBoZXJlIGluIGEgRE9TIGJveCBhbnl3YXkgKGFzc3VtaW5nIHRoZSBWeEQgaXMgcHJlc2VudCkuIElmIHdlCi1kbyBnZXQgaGVyZSBhbmQgd2UgYXJlIGluIHdpbmRvd3MsIHRoaXMgY29kZSB3aWxsIGJlIHNraXBwZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX1BNX2FkanVzdFBhZ2VUYWJsZXMoCi0gICAgdWxvbmcgbGluZWFyLAotICAgIHVsb25nIGxpbWl0LAotCWlib29sIGlzR2xvYmFsLAotICAgIGlib29sIGlzQ2FjaGVkKQotewotICAgIGludCAgICAgc3RhcnRQREIsZW5kUERCLGlQREIsc3RhcnRQYWdlLGVuZFBhZ2Usc3RhcnQsZW5kLGlQYWdlOwotICAgIHVsb25nICAgcGFnZVRhYmxlLCpwUERCLCpwUGFnZVRhYmxlOwotCXVsb25nCW1hc2sgPSAweEZGRkZGRkZGOwotCXVsb25nCWJpdHMgPSAweDAwMDAwMDAwOwotCi0JLyogRW5hYmxlIHVzZXIgbGV2ZWwgYWNjZXNzIGZvciBwYWdlIHRhYmxlIGVudHJ5ICovCi0JaWYgKGlzR2xvYmFsKSB7Ci0JCW1hc2sgJj0gflBBR0VfRkxBR1NfVVNFUjsKLQkJYml0cyB8PSBQQUdFX0ZMQUdTX1VTRVI7Ci0JCX0KLQotCS8qIERpc2FibGUgUENEIGJpdCBpZiBwYWdlIHRhYmxlIGVudHJ5IHNob3VsZCBiZSB1bmNhY2hlZCAqLwotCWlmICghaXNDYWNoZWQpIHsKLQkJbWFzayAmPSB+KFBBR0VfRkxBR1NfQ0FDSEVfRElTQUJMRSB8IFBBR0VfRkxBR1NfV1JJVEVfVEhST1VHSCk7Ci0JCWJpdHMgfD0gKFBBR0VfRkxBR1NfQ0FDSEVfRElTQUJMRSB8IFBBR0VfRkxBR1NfV1JJVEVfVEhST1VHSCk7Ci0JCX0KLQotICAgIHBQREIgPSAodWxvbmcqKV9QTV9tYXBQaHlzaWNhbFRvTGluZWFyKF9QTV9nZXRQREIoKSwweEZGRix0cnVlKTsKLSAgICBpZiAocFBEQikgewotCXN0YXJ0UERCID0gKGxpbmVhciA+PiAyMikgJiAweDNGRjsKLQlzdGFydFBhZ2UgPSAobGluZWFyID4+IDEyKSAmIDB4M0ZGOwotCWVuZFBEQiA9ICgobGluZWFyK2xpbWl0KSA+PiAyMikgJiAweDNGRjsKLQllbmRQYWdlID0gKChsaW5lYXIrbGltaXQpID4+IDEyKSAmIDB4M0ZGOwotCWZvciAoaVBEQiA9IHN0YXJ0UERCOyBpUERCIDw9IGVuZFBEQjsgaVBEQisrKSB7Ci0JICAgIC8qIFNldCB0aGUgYml0cyBpbiB0aGUgcGFnZSBkaXJlY3RvcnkgZW50cnkgLSByZXF1aXJlZCBhcyBwZXIgKi8KLQkgICAgLyogUGVudGl1bSA0IG1hbnVhbC4gVGhpcyBhbHNvIHRha2VzIGNhcmUgb2YgdGhlIDRNQiBwYWdlIGVudHJpZXMgKi8KLQkgICAgcFBEQltpUERCXSA9IChwUERCW2lQREJdICYgbWFzaykgfCBiaXRzOwotCSAgICBpZiAoIShwUERCW2lQREJdICYgUEFHRV9GTEFHU180TUIpKSB7Ci0JCS8qIElmIHdlIGFyZSBkZWFsaW5nIHdpdGggNEtCIHBhZ2VzIHRoZW4gd2UgbmVlZCB0byBpdGVyYXRlICovCi0JCS8qIHRocm91Z2ggZWFjaCBvZiB0aGUgcGFnZSB0YWJsZSBlbnRyaWVzICovCi0JCXBhZ2VUYWJsZSA9IHBQREJbaVBEQl0gJiB+MHhGRkY7Ci0JCXBQYWdlVGFibGUgPSAodWxvbmcqKV9QTV9tYXBQaHlzaWNhbFRvTGluZWFyKHBhZ2VUYWJsZSwweEZGRix0cnVlKTsKLQkJc3RhcnQgPSAoaVBEQiA9PSBzdGFydFBEQikgPyBzdGFydFBhZ2UgOiAwOwotCQllbmQgPSAoaVBEQiA9PSBlbmRQREIpID8gZW5kUGFnZSA6IDB4M0ZGOwotCQlmb3IgKGlQYWdlID0gc3RhcnQ7IGlQYWdlIDw9IGVuZDsgaVBhZ2UrKykgewotCQkgICAgcFBhZ2VUYWJsZVtpUGFnZV0gPSAocFBhZ2VUYWJsZVtpUGFnZV0gJiBtYXNrKSB8IGJpdHM7Ci0JCSAgICB9Ci0JCU1tVW5tYXBJb1NwYWNlKHBQYWdlVGFibGUsMHhGRkYpOwotCQl9Ci0JICAgIH0KLQlNbVVubWFwSW9TcGFjZShwUERCLDB4RkZGKTsKLQlQTV9mbHVzaFRMQigpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZSBhIGJsb2NrIG9mIHNoYXJlZCBtZW1vcnkuIEZvciBOVCB3ZSBhbGxvY2F0ZSBzaGFyZWQgbWVtb3J5Ci1hcyBsb2NrZWQsIGdsb2JhbCBtZW1vcnkgdGhhdCBpcyBhY2Nlc3NpYmxlIGZyb20gYW55IG1lbW9yeSBjb250ZXh0Ci0oaW5jbHVkaW5nIGludGVycnVwdCB0aW1lIGNvbnRleHQpLCB3aGljaCBhbGxvd3MgdXMgdG8gbG9hZCBvdXIgaW1wb3J0YW50Ci1kYXRhIHN0cnVjdHVyZSBhbmQgY29kZSBzdWNoIHRoYXQgd2UgY2FuIGFjY2VzcyBpdCBkaXJlY3RseSBmcm9tIGEgcmluZwotMCBpbnRlcnJ1cHQgY29udGV4dC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbWFsbG9jU2hhcmVkKAotICAgIGxvbmcgc2l6ZSkKLXsKLSAgICBpbnQgICAgICAgICBpOwotCi0gICAgLyogRmlyc3QgZmluZCBhIGZyZWUgc2xvdCBpbiBvdXIgc2hhcmVkIG1lbW9yeSB0YWJsZSAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTUVNT1JZX1NIQVJFRDsgaSsrKSB7Ci0JaWYgKHNoYXJlZFtpXS5saW5lYXIgPT0gMCkKLQkgICAgYnJlYWs7Ci0JfQotICAgIGlmIChpID09IE1BWF9NRU1PUllfU0hBUkVEKQotCXJldHVybiBOVUxMOwotCi0gICAgLyogQWxsb2NhdGUgdGhlIHBhZ2VkIHBvb2wgKi8KLSAgICBzaGFyZWRbaV0ubGluZWFyID0gRXhBbGxvY2F0ZVBvb2woUGFnZWRQb29sLCBzaXplKTsKLQotICAgIC8qIENyZWF0ZSBhIGxpc3QgdG8gbWFuYWdlIHRoaXMgYWxsb2NhdGlvbiAqLwotICAgIHNoYXJlZFtpXS5wTWRsID0gSW9BbGxvY2F0ZU1kbChzaGFyZWRbaV0ubGluZWFyLHNpemUsRkFMU0UsRkFMU0UsKFBJUlApIE5VTEwpOwotCi0gICAgLyogTG9jayB0aGlzIGFsbG9jYXRpb24gaW4gbWVtb3J5ICovCi0gICAgTW1Qcm9iZUFuZExvY2tQYWdlcyhzaGFyZWRbaV0ucE1kbCxLZXJuZWxNb2RlLElvTW9kaWZ5QWNjZXNzKTsKLQotICAgIC8qIE1vZGlmeSBiaXRzIHRvIGdyYW50IHVzZXIgYWNjZXNzICovCi0gICAgX1BNX2FkanVzdFBhZ2VUYWJsZXMoKHVsb25nKXNoYXJlZFtpXS5saW5lYXIsIHNpemUsIHRydWUsIHRydWUpOwotICAgIHJldHVybiAodm9pZCopc2hhcmVkW2ldLmxpbmVhcjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgYmxvY2sgb2Ygc2hhcmVkIG1lbW9yeQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZVNoYXJlZCgKLSAgICB2b2lkICpwKQotewotICAgIGludCBpOwotCi0gICAgLyogRmluZCBhIHNoYXJlZCBtZW1vcnkgYmxvY2sgaW4gb3VyIHRhYmxlIGFuZCBmcmVlIGl0ICovCi0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9NRU1PUllfU0hBUkVEOyBpKyspIHsKLQlpZiAoc2hhcmVkW2ldLmxpbmVhciA9PSBwKSB7Ci0JICAgIC8qIFVubG9jayB3aGF0IHdlIGxvY2tlZCAqLwotCSAgICBNbVVubG9ja1BhZ2VzKHNoYXJlZFtpXS5wTWRsKTsKLQotCSAgICAvKiBGcmVlIG91ciBNREwgKi8KLQkgICAgSW9GcmVlTWRsKHNoYXJlZFtpXS5wTWRsKTsKLQotCSAgICAvKiBGcmVlIG91ciBtZW0gKi8KLQkgICAgRXhGcmVlUG9vbChzaGFyZWRbaV0ubGluZWFyKTsKLQotCSAgICAvKiBGbGFnIHRoYXQgaXMgZW50cnkgaXMgYXZhaWxhYmxlICovCi0JICAgIHNoYXJlZFtpXS5saW5lYXIgPSAwOwotCSAgICBicmVhazsKLQkgICAgfQotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1NYXAgYSBwaHlzaWNhbCBhZGRyZXNzIHRvIGEgbGluZWFyIGFkZHJlc3MgaW4gdGhlIGNhbGxlcnMgcHJvY2Vzcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbWFwUGh5c2ljYWxBZGRyKAotICAgIHVsb25nIGJhc2UsCi0gICAgdWxvbmcgbGltaXQsCi0gICAgaWJvb2wgaXNDYWNoZWQpCi17Ci0gICAgdWxvbmcgICBsaW5lYXIsbGVuZ3RoID0gbGltaXQrMTsKLSAgICBpbnQgICAgIGk7Ci0KLSAgICAvKiBTZWFyY2ggdGFibGUgb2YgZXhpc3RpbmcgbWFwcGluZ3MgdG8gc2VlIGlmIHdlIGhhdmUgYWxyZWFkeSBtYXBwZWQgKi8KLSAgICAvKiBhIHJlZ2lvbiBvZiBtZW1vcnkgdGhhdCB3aWxsIHNlcnZlIHRoaXMgcHVycG9zZS4gKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTWFwcGluZ3M7IGkrKykgewotCWlmIChtYXBzW2ldLnBoeXNpY2FsID09IGJhc2UgJiYgbWFwc1tpXS5sZW5ndGggPT0gbGVuZ3RoICYmIG1hcHNbaV0uaXNDYWNoZWQgPT0gaXNDYWNoZWQpIHsKLQkgICAgX1BNX2FkanVzdFBhZ2VUYWJsZXMoKHVsb25nKW1hcHNbaV0ubGluZWFyLCBtYXBzW2ldLmxlbmd0aCwgdHJ1ZSwgaXNDYWNoZWQpOwotCSAgICByZXR1cm4gKHZvaWQqKW1hcHNbaV0ubGluZWFyOwotCSAgICB9Ci0JfQotICAgIGlmIChudW1NYXBwaW5ncyA9PSBNQVhfTUVNT1JZX01BUFBJTkdTKQotCXJldHVybiBOVUxMOwotCi0gICAgLyogV2UgZGlkIG5vdCBmaW5kIGFueSBwcmV2aW91c2x5IG1hcHBlZCBtZW1vcnkgcmVnaW9uLCBzbyBtYXBzIGl0IGluLiAqLwotICAgIGlmICgobGluZWFyID0gX1BNX21hcFBoeXNpY2FsVG9MaW5lYXIoYmFzZSxsaW1pdCxpc0NhY2hlZCkpID09IDB4RkZGRkZGRkYpCi0JcmV0dXJuIE5VTEw7Ci0gICAgbWFwc1tudW1NYXBwaW5nc10ucGh5c2ljYWwgPSBiYXNlOwotICAgIG1hcHNbbnVtTWFwcGluZ3NdLmxlbmd0aCA9IGxlbmd0aDsKLSAgICBtYXBzW251bU1hcHBpbmdzXS5saW5lYXIgPSBsaW5lYXI7Ci0gICAgbWFwc1tudW1NYXBwaW5nc10uaXNDYWNoZWQgPSBpc0NhY2hlZDsKLSAgICBudW1NYXBwaW5ncysrOwotCi0gICAgLyogR3JhbnQgdXNlciBhY2Nlc3MgdG8gdGhpcyBJL08gc3BhY2UgKi8KLSAgICBfUE1fYWRqdXN0UGFnZVRhYmxlcygodWxvbmcpbGluZWFyLCBsZW5ndGgsIHRydWUsIGlzQ2FjaGVkKTsKLSAgICByZXR1cm4gKHZvaWQqKWxpbmVhcjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgcGh5c2ljYWwgYWRkcmVzcyBtYXBwaW5nIGFsbG9jYXRlZCBieSBQTV9tYXBQaHlzaWNhbEFkZHIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlUGh5c2ljYWxBZGRyKAotICAgIHZvaWQgKnB0ciwKLSAgICB1bG9uZyBsaW1pdCkKLXsKLSAgICAvKiBXZSBkb24ndCBmcmVlIHRoZSBtZW1vcnkgbWFwcGluZ3MgaW4gaGVyZSBiZWNhdXNlIHdlIGNhY2hlIGFsbCAqLwotICAgIC8qIHRoZSBtZW1vcnkgbWFwcGluZ3Mgd2UgY3JlYXRlIGluIHRoZSBzeXN0ZW0gZm9yIGxhdGVyIHVzZS4gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsZWQgd2hlbiB0aGUgZGV2aWNlIGRyaXZlciB1bmxvYWRzIHRvIGZyZWUgYWxsIHRoZSBwYWdlIHRhYmxlIG1hcHBpbmdzIQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgX1BNX2ZyZWVNZW1vcnlNYXBwaW5ncyh2b2lkKQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG51bU1hcHBpbmdzOyBpKyspCi0JTW1Vbm1hcElvU3BhY2UoKHZvaWQgKiltYXBzW2ldLmxpbmVhcixtYXBzW2ldLmxlbmd0aCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRmluZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIGxpbmVhciBtZW1vcnkgYWRkcmVzcyBpbiBjdXJyZW50IHByb2Nlc3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyKAotICAgIHZvaWQgKnApCi17Ci0gICAgUEhZU0lDQUxfQUREUkVTUyAgICBwYU91ckFkZHJlc3M7Ci0KLSAgICBwYU91ckFkZHJlc3MgPSBNbUdldFBoeXNpY2FsQWRkcmVzcyhwKTsKLSAgICByZXR1cm4gcGFPdXJBZGRyZXNzLkxvd1BhcnQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRmluZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIGxpbmVhciBtZW1vcnkgYWRkcmVzcyBpbiBjdXJyZW50IHByb2Nlc3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyUmFuZ2UoCi0gICAgdm9pZCAqcCwKLSAgICB1bG9uZyBsZW5ndGgsCi0gICAgdWxvbmcgKnBoeXNBZGRyZXNzKQotewotICAgIGludCAgICAgaTsKLSAgICB1bG9uZyAgIGxpbmVhciA9ICh1bG9uZylwICYgfjB4RkZGOwotCi0gICAgZm9yIChpID0gKGxlbmd0aCArIDB4RkZGKSA+PiAxMjsgaSA+IDA7IGktLSkgewotCWlmICgoKnBoeXNBZGRyZXNzKysgPSBQTV9nZXRQaHlzaWNhbEFkZHIoKHZvaWQqKWxpbmVhcikpID09IDB4RkZGRkZGRkYpCi0JICAgIHJldHVybiBmYWxzZTsKLQlsaW5lYXIgKz0gNDA5NjsKLQl9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGVzIGEgYmxvY2sgb2YgbG9ja2VkIHBoeXNpY2FsIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fYWxsb2NMb2NrZWRNZW0oCi0gICAgdWludCBzaXplLAotICAgIHVsb25nICpwaHlzQWRkciwKLSAgICBpYm9vbCBjb250aWd1b3VzLAotICAgIGlib29sIGJlbG93MTZNKQotewotICAgIGludCAgICAgICAgICAgICAgICAgaTsKLSAgICBQSFlTSUNBTF9BRERSRVNTICAgIHBhT3VyQWRkcmVzczsKLQotICAgIC8qIEZpcnN0IGZpbmQgYSBmcmVlIHNsb3QgaW4gb3VyIHNoYXJlZCBtZW1vcnkgdGFibGUgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01FTU9SWV9MT0NLRUQ7IGkrKykgewotCWlmIChsb2NrZWRbaV0ubGluZWFyID09IDApCi0JICAgIGJyZWFrOwotCX0KLSAgICBpZiAoaSA9PSBNQVhfTUVNT1JZX0xPQ0tFRCkKLQlyZXR1cm4gTlVMTDsKLQotICAgIC8qIEhpZ2hlc3RBY2NlcHRhYmxlQWRkcmVzcyAtIFNwZWNpZmllcyB0aGUgaGlnaGVzdCB2YWxpZCBwaHlzaWNhbCBhZGRyZXNzICovCi0gICAgLyogdGhlIGRyaXZlciBjYW4gdXNlLiBGb3IgZXhhbXBsZSwgaWYgYSBkZXZpY2UgY2FuIG9ubHkgcmVmZXJlbmNlIHBoeXNpY2FsICovCi0gICAgLyogbWVtb3J5IGluIHRoZSBsb3dlciAxNk1CLCB0aGlzIHZhbHVlIHdvdWxkIGJlIHNldCB0byAweDAwMDAwMDAwRkZGRkZGLiAqLwotICAgIHBhT3VyQWRkcmVzcy5IaWdoUGFydCA9IDA7Ci0gICAgaWYgKGJlbG93MTZNKQotCXBhT3VyQWRkcmVzcy5Mb3dQYXJ0ID0gMHgwMEZGRkZGRjsKLSAgICBlbHNlCi0JcGFPdXJBZGRyZXNzLkxvd1BhcnQgPSAweEZGRkZGRkZGOwotCi0gICAgaWYgKGNvbnRpZ3VvdXMpIHsKLQkvKiBBbGxvY2F0ZSBmcm9tIHRoZSBub24tcGFnZWQgcG9vbCAodW5mb3J0dW5hdGVseSA0TUIgcGFnZXMpICovCi0JbG9ja2VkW2ldLmxpbmVhciA9IE1tQWxsb2NhdGVDb250aWd1b3VzTWVtb3J5KHNpemUsIHBhT3VyQWRkcmVzcyk7Ci0JaWYgKCFsb2NrZWRbaV0ubGluZWFyKQotCSAgICByZXR1cm4gTlVMTDsKLQotCS8qIEZsYWcgbm8gTURMICovCi0JbG9ja2VkW2ldLnBNZGwgPSBOVUxMOwotCi0JLyogTWFwIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGZvciB0aGUgbWVtb3J5IHNvIHdlIGNhbiBtYW5hZ2UgKi8KLQkvKiB0aGUgcGFnZSB0YWJsZXMgaW4gNEtCIGNodW5rcyBtYXBwZWQgaW50byB1c2VyIHNwYWNlLiAqLwotCi0JLyogVE9ETzogTWFwIHRoaXMgd2l0aCB0aGUgcGh5c2ljYWwgYWRkcmVzcyB0byB0aGUgbGluZWFyIGFkZHJlc3NzICovCi0JbG9ja2VkW2ldLm1tSW9NYXBwZWQgPSBsb2NrZWRbaV0ubGluZWFyOwotCi0JLyogTW9kaWZ5IGJpdHMgdG8gZ3JhbnQgdXNlciBhY2Nlc3MsIGZsYWcgbm90IGNhY2hlZCAqLwotCV9QTV9hZGp1c3RQYWdlVGFibGVzKCh1bG9uZylsb2NrZWRbaV0ubW1Jb01hcHBlZCwgc2l6ZSwgdHJ1ZSwgZmFsc2UpOwotCXJldHVybiAodm9pZCopbG9ja2VkW2ldLm1tSW9NYXBwZWQ7Ci0JfQotICAgIGVsc2UgewotCS8qIEFsbG9jYXRlIGZyb20gdGhlIHBhZ2VkIHBvb2wgKi8KLQlsb2NrZWRbaV0ubGluZWFyID0gRXhBbGxvY2F0ZVBvb2woUGFnZWRQb29sLCBzaXplKTsKLQlpZiAoIWxvY2tlZFtpXS5saW5lYXIpCi0JICAgIHJldHVybiBOVUxMOwotCi0JLyogQ3JlYXRlIGEgbGlzdCB0byBtYW5hZ2UgdGhpcyBhbGxvY2F0aW9uICovCi0JbG9ja2VkW2ldLnBNZGwgPSBJb0FsbG9jYXRlTWRsKGxvY2tlZFtpXS5saW5lYXIsc2l6ZSxGQUxTRSxGQUxTRSwoUElSUCkgTlVMTCk7Ci0KLQkvKiBMb2NrIHRoaXMgYWxsb2NhdGlvbiBpbiBtZW1vcnkgKi8KLQlNbVByb2JlQW5kTG9ja1BhZ2VzKGxvY2tlZFtpXS5wTWRsLEtlcm5lbE1vZGUsSW9Nb2RpZnlBY2Nlc3MpOwotCi0JLyogTW9kaWZ5IGJpdHMgdG8gZ3JhbnQgdXNlciBhY2Nlc3MsIGZsYWcgbm90IGNhY2hlZCAqLwotCV9QTV9hZGp1c3RQYWdlVGFibGVzKCh1bG9uZylsb2NrZWRbaV0ubGluZWFyLCBzaXplLCB0cnVlLCBmYWxzZSk7Ci0JcmV0dXJuICh2b2lkKilsb2NrZWRbaV0ubGluZWFyOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlcyBhIGJsb2NrIG9mIGxvY2tlZCBwaHlzaWNhbCBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlTG9ja2VkTWVtKAotICAgIHZvaWQgKnAsCi0gICAgdWludCBzaXplLAotICAgIGlib29sIGNvbnRpZ3VvdXMpCi17Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBGaW5kIGEgbG9ja2VkIG1lbW9yeSBibG9jayBpbiBvdXIgdGFibGUgYW5kIGZyZWUgaXQgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01FTU9SWV9MT0NLRUQ7IGkrKykgewotCWlmIChsb2NrZWRbaV0ubGluZWFyID09IHApIHsKLQkgICAgLyogQW4gTWRsIGluZGljYXRlcyB0aGF0IHdlIHVzZWQgdGhlIHBhZ2VkIHBvb2wsIGFuZCBsb2NrZWQgaXQsICovCi0JICAgIC8qIHNvIG5vdyB3ZSBoYXZlIHRvIHVubG9jaywgZnJlZSB0aGUgTURMLCBhbmQgZnJlZSBwYWdlZCAqLwotCSAgICBpZiAobG9ja2VkW2ldLnBNZGwpIHsKLQkJLyogVW5sb2NrIHdoYXQgd2UgbG9ja2VkIGFuZCBmcmVlIHRoZSBNZGwgKi8KLQkJTW1VbmxvY2tQYWdlcyhsb2NrZWRbaV0ucE1kbCk7Ci0JCUlvRnJlZU1kbChsb2NrZWRbaV0ucE1kbCk7Ci0JCUV4RnJlZVBvb2wobG9ja2VkW2ldLmxpbmVhcik7Ci0JCX0KLQkgICAgZWxzZSB7Ci0JCS8qIFRPRE86IEZyZWUgdGhlIG1tSW9NYXAgbWFwcGluZyBmb3IgdGhlIG1lbW9yeSEgKi8KLQotCQkvKiBGcmVlIG5vbi1wYWdlZCBwb29sICovCi0JCU1tRnJlZUNvbnRpZ3VvdXNNZW1vcnkobG9ja2VkW2ldLmxpbmVhcik7Ci0JCX0KLQotCSAgICAvKiBGbGFnIHRoYXQgaXMgZW50cnkgaXMgYXZhaWxhYmxlICovCi0JICAgIGxvY2tlZFtpXS5saW5lYXIgPSAwOwotCSAgICBicmVhazsKLQkgICAgfQotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZXMgYSBwYWdlIGFsaWduZWQgYW5kIHBhZ2Ugc2l6ZWQgYmxvY2sgb2YgbWVtb3J5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2FsbG9jUGFnZSgKLSAgICBpYm9vbCBsb2NrZWQpCi17Ci0gICAgLyogQWxsb2NhdGUgdGhlIG1lbW9yeSBmcm9tIHRoZSBub24tcGFnZWQgcG9vbCBpZiB3ZSB3YW50IHRoZSBtZW1vcnkgKi8KLSAgICAvKiB0byBiZSBsb2NrZWQuICovCi0gICAgcmV0dXJuIEV4QWxsb2NhdGVQb29sKAotCWxvY2tlZCA/IE5vblBhZ2VkUG9vbENhY2hlQWxpZ25lZCA6IFBhZ2VkUG9vbENhY2hlQWxpZ25lZCwKLQlQQUdFX1NJWkUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZyZWUgYSBwYWdlIGFsaWduZWQgYW5kIHBhZ2Ugc2l6ZWQgYmxvY2sgb2YgbWVtb3J5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlUGFnZSgKLSAgICB2b2lkICpwKQotewotICAgIGlmIChwKSBFeEZyZWVQb29sKHApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUxvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fbG9ja0RhdGFQYWdlcygKLSAgICB2b2lkICpwLAotICAgIHVpbnQgbGVuLAotICAgIFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIE1ETCAqcE1kbDsKLQotICAgIC8qIENyZWF0ZSBhIGxpc3QgdG8gbWFuYWdlIHRoaXMgYWxsb2NhdGlvbiAqLwotICAgIGlmICgocE1kbCA9IElvQWxsb2NhdGVNZGwocCxsZW4sRkFMU0UsRkFMU0UsKFBJUlApTlVMTCkpID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgLyogTG9jayB0aGlzIGFsbG9jYXRpb24gaW4gbWVtb3J5ICovCi0gICAgTW1Qcm9iZUFuZExvY2tQYWdlcyhwTWRsLEtlcm5lbE1vZGUsSW9Nb2RpZnlBY2Nlc3MpOwotICAgICooKFBNREwqKSgmbGgtPmgpKSA9IHBNZGw7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVW5sb2NrIGxpbmVhciBtZW1vcnkgc28gaXQgd29uJ3QgYmUgcGFnZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX3VubG9ja0RhdGFQYWdlcygKLSAgICB2b2lkICpwLAotICAgIHVpbnQgbGVuLAotICAgIFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIGlmIChwICYmIGxoKSB7Ci0JLyogVW5sb2NrIHdoYXQgd2UgbG9ja2VkICovCi0JTURMICpwTWRsID0gKigoUE1ETCopKCZsaC0+aCkpOwotCU1tVW5sb2NrUGFnZXMocE1kbCk7Ci0JSW9GcmVlTWRsKHBNZGwpOwotCX0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Mb2NrIGxpbmVhciBtZW1vcnkgc28gaXQgd29uJ3QgYmUgcGFnZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2xvY2tDb2RlUGFnZXMoCi0gICAgdm9pZCAoKnApKCksCi0gICAgdWludCBsZW4sCi0gICAgUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgcmV0dXJuIFBNX2xvY2tEYXRhUGFnZXMoKHZvaWQqKXAsbGVuLGxoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1VbmxvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fdW5sb2NrQ29kZVBhZ2VzKAotICAgIHZvaWQgKCpwKSgpLAotICAgIHVpbnQgbGVuLAotICAgIFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIHJldHVybiBQTV91bmxvY2tEYXRhUGFnZXMoKHZvaWQqKXAsbGVuLGxoKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L29zaGRyLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9vc2hkci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWI3YmFlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L29zaGRyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgV2luZG93cyBOVCBkcml2ZXJzCi0qCi0qIERlc2NyaXB0aW9uOiAgSW5jbHVkZSBmaWxlIHRvIGluY2x1ZGUgYWxsIE9TIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19OVERSVl9PU0hEUl9ICi0jZGVmaW5lIF9fTlREUlZfT1NIRFJfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIFR5cGVkZWZzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbiBQcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBJbnRlcm5hbCB1bmljb2RlIHN0cmluZyBoYW5kbGluZyBmdW5jdGlvbnMgKi8KLQotVU5JQ09ERV9TVFJJTkcgKiAgICBfUE1fQ1N0cmluZ1RvVW5pY29kZVN0cmluZyhjb25zdCBjaGFyICpjc3RyKTsKLXZvaWQgICAgICAgICAgICAgICAgX1BNX0ZyZWVVbmljb2RlU3RyaW5nKFVOSUNPREVfU1RSSU5HICp1bmlTdHIpOwotCi0jZW5kaWYgIC8qIF9fTlREUlZfT1NIRFJfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvcG0uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L3BtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NjA2MzEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvcG0uYworKysgL2Rldi9udWxsCkBAIC0xLDkzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgV2luZG93cyBOVCBkZXZpY2UgZHJpdmVycy4KLSoKLSogRGVzY3JpcHRpb246ICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeSwgd2hpY2gKLSogICAgICAgICAgICAgICBjb250YWlucyBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IE9TIHNwZWNpZmljIHNlcnZpY2VzIGluIGEKLSogICAgICAgICAgICAgICBnZW5lcmljLCBjcm9zcyBwbGF0Zm9ybSBBUEkuIFBvcnRpbmcgdGhlIE9TIFBvcnRhYmlsaXR5Ci0qICAgICAgICAgICAgICAgTWFuYWdlciBsaWJyYXJ5IGlzIHRoZSBmaXJzdCBzdGVwIHRvIHBvcnRpbmcgYW55IFNjaVRlY2gKLSogICAgICAgICAgICAgICBwcm9kdWN0cyB0byBhIG5ldyBwbGF0Zm9ybS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgImRydmxpYi9vcy9vcy5oIgotI2luY2x1ZGUgInNkZC9zZGRoZWxwLmgiCi0jaW5jbHVkZSAibXRyci5oIgotI2luY2x1ZGUgIm9zaGRyLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWNoYXIgICAgICAgICAgICAgICAgX1BNX2NudFBhdGhbUE1fTUFYX1BBVEhdID0gIiI7Ci1jaGFyICAgICAgICAgICAgICAgIF9QTV9udWNsZXVzUGF0aFtQTV9NQVhfUEFUSF0gPSAiIjsKLXN0YXRpYyB2b2lkIChQTUFQSVAgZmF0YWxFcnJvckNsZWFudXApKHZvaWQpID0gTlVMTDsKLQotc3RhdGljIGNoYXIgKnN6TlRXaW5kb3dzS2V5ICAgICA9ICJcXFJFR0lTVFJZXFxNYWNoaW5lXFxTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzIE5UXFxDdXJyZW50VmVyc2lvbiI7Ci1zdGF0aWMgY2hhciAqc3pOVFN5c3RlbVJvb3QgICAgID0gIlN5c3RlbVJvb3QiOwotc3RhdGljIGNoYXIgKnN6TWFjaGluZU5hbWVLZXkgICA9ICJcXFJFR0lTVFJZXFxNYWNoaW5lXFxTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxDb21wdXRlck5hbWVcXENvbXB1dGVyTmFtZSI7Ci1zdGF0aWMgY2hhciAqc3pNYWNoaW5lTmFtZUtleU5UID0gIlxcUkVHSVNUUllcXE1hY2hpbmVcXFN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXENvbXB1dGVyTmFtZVxcQWN0aXZlQ29tcHV0ZXJOYW1lIjsKLXN0YXRpYyBjaGFyICpzek1hY2hpbmVOYW1lICAgICAgPSAiQ29tcHV0ZXJOYW1lIjsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBQTSBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1faW5pdCh2b2lkKQotewotICAgIC8qIEluaXRpYWxpYXNlIHRoZSBNVFJSIG1vZHVsZSAqLwotICAgIE1UUlJfaW5pdCgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0eXBlIGlkZW50aWZpZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotbG9uZyBQTUFQSSBQTV9nZXRPU1R5cGUodm9pZCkKLXsKLSAgICByZXR1cm4gX09TX1dJTk5URFJWOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgcnVudGltZSB0eXBlIGlkZW50aWZpZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2dldE1vZGVUeXBlKHZvaWQpCi17Ci0gICAgcmV0dXJuIFBNXzM4NjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BZGQgYSBmaWxlIGRpcmVjdG9yeSBzZXBhcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZW5hbWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9iYWNrc2xhc2goY2hhciAqcykKLXsKLSAgICB1aW50IHBvcyA9IHN0cmxlbihzKTsKLSAgICBpZiAoc1twb3MtMV0gIT0gJ1xcJykgewotCXNbcG9zXSA9ICdcXCc7Ci0Jc1twb3MrMV0gPSAnXDAnOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BZGQgYSB1c2VyIGRlZmluZWQgUE1fZmF0YWxFcnJvciBjbGVhbnVwIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0RmF0YWxFcnJvckNsZWFudXAoCi0gICAgdm9pZCAoUE1BUElQIGNsZWFudXApKHZvaWQpKQotewotICAgIGZhdGFsRXJyb3JDbGVhbnVwID0gY2xlYW51cDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGUgZmF0YWwgZXJyb3JzIGludGVybmFsbHkgaW4gdGhlIGRyaXZlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZhdGFsRXJyb3IoCi0gICAgY29uc3QgY2hhciAqbXNnKQotewotICAgIFVMT05HICAgQnVnQ2hlY2tDb2RlID0gMDsKLSAgICBVTE9ORyAgIE1vcmVCdWdDaGVja0RhdGFbNF0gPSB7MH07Ci0gICAgY2hhciAgICAqcDsKLSAgICBVTE9ORyAgIGxlbjsKLQotICAgIGlmIChmYXRhbEVycm9yQ2xlYW51cCkKLQlmYXRhbEVycm9yQ2xlYW51cCgpOwotCi0jaWZkZWYgREJHCS8qIFNlbmQgb3V0cHV0IHRvIGRlYnVnZ2VyLCBqdXN0IHJldHVybiBzbyBhcyBub3QgdG8gZm9yY2UgYSByZWJvb3QgKi8KLSNwcmFnbWEgbWVzc2FnZSgiSU5GTzogYnVpbGRpbmcgZm9yIGRlYnVnLCBQTV9mYXRhbEVycm9yKCkgcmUtcm91dGVkIikKLQlEQkdNU0cyKCJTRERIRUxQPiBQTV9mYXRhbEVycm9yKCk6IEVSUk9SOiAlc1xuIiwgbXNnKTsKLQlyZXR1cm4gOwotI2VuZGlmCi0gICAgLyogS2VCdWdDaGVja0V4IGJyaW5ncyBkb3duIHRoZSBzeXN0ZW0gaW4gYSBjb250cm9sbGVkICovCi0gICAgLyogbWFubmVyIHdoZW4gdGhlIGNhbGxlciBkaXNjb3ZlcnMgYW4gdW5yZWNvdmVyYWJsZSAqLwotICAgIC8qIGluY29uc2lzdGVuY3kgdGhhdCB3b3VsZCBjb3JydXB0IHRoZSBzeXN0ZW0gaWYgKi8KLSAgICAvKiB0aGUgY2FsbGVyIGNvbnRpbnVlZCB0byBydW4uICovCi0gICAgLyogKi8KLSAgICAvKiBoYWNrIC0gZHVtcCB0aGUgZmlyc3QgMjAgY2hhcnMgaW4gaGV4IHVzaW5nIHRoZSB2YXJpYWJsZXMgKi8KLSAgICAvKiAgICAgIHByb3ZpZGVkIC0gRWFjaCBVTE9ORyBpcyBlcXVhbCB0byBmb3VyIGNoYXJhY3RlcnMuLi4gKi8KLSAgICBmb3IobGVuID0gMDsgbGVuIDwgMjA7IGxlbisrKQotCWlmIChtc2dbbGVuXSA9PSAoY2hhcikwKQotCSAgICBicmVhazsKLQotICAgIC8qIFRoaXMgbG9va3MgYmFkIGJ1dCBpdCdzIHF1aWNrIGFuZCByZWxpYWJsZS4uLiAqLwotICAgIHAgPSAoY2hhciAqKSZCdWdDaGVja0NvZGU7Ci0gICAgaWYobGVuID4gMCkgcFszXSA9IG1zZ1swXTsKLSAgICBpZihsZW4gPiAxKSBwWzJdID0gbXNnWzFdOwotICAgIGlmKGxlbiA+IDIpIHBbMV0gPSBtc2dbMl07Ci0gICAgaWYobGVuID4gMykgcFswXSA9IG1zZ1szXTsKLQotICAgIHAgPSAoY2hhciAqKSZNb3JlQnVnQ2hlY2tEYXRhWzBdOwotICAgIGlmKGxlbiA+IDQpIHBbM10gPSBtc2dbNF07Ci0gICAgaWYobGVuID4gNSkgcFsyXSA9IG1zZ1s1XTsKLSAgICBpZihsZW4gPiA2KSBwWzFdID0gbXNnWzZdOwotICAgIGlmKGxlbiA+IDcpIHBbMF0gPSBtc2dbN107Ci0KLSAgICBwID0gKGNoYXIgKikmTW9yZUJ1Z0NoZWNrRGF0YVsxXTsKLSAgICBpZihsZW4gPiA4KSBwWzNdID0gbXNnWzhdOwotICAgIGlmKGxlbiA+IDkpIHBbMl0gPSBtc2dbOV07Ci0gICAgaWYobGVuID4gMTApIHBbMV0gPSBtc2dbMTBdOwotICAgIGlmKGxlbiA+IDExKSBwWzBdID0gbXNnWzExXTsKLQotICAgIHAgPSAoY2hhciAqKSZNb3JlQnVnQ2hlY2tEYXRhWzJdOwotICAgIGlmKGxlbiA+IDEyKSBwWzNdID0gbXNnWzEyXTsKLSAgICBpZihsZW4gPiAxMykgcFsyXSA9IG1zZ1sxM107Ci0gICAgaWYobGVuID4gMTQpIHBbMV0gPSBtc2dbMTRdOwotICAgIGlmKGxlbiA+IDE1KSBwWzBdID0gbXNnWzE1XTsKLQotICAgIHAgPSAoY2hhciAqKSZNb3JlQnVnQ2hlY2tEYXRhWzNdOwotICAgIGlmKGxlbiA+IDE2KSBwWzNdID0gbXNnWzE2XTsKLSAgICBpZihsZW4gPiAxNykgcFsyXSA9IG1zZ1sxN107Ci0gICAgaWYobGVuID4gMTgpIHBbMV0gPSBtc2dbMThdOwotICAgIGlmKGxlbiA+IDE5KSBwWzBdID0gbXNnWzE5XTsKLQotICAgIC8qIEhhbHQgdGhlIHN5c3RlbSEgKi8KLSAgICBLZUJ1Z0NoZWNrRXgoQnVnQ2hlY2tDb2RlLCBNb3JlQnVnQ2hlY2tEYXRhWzBdLCBNb3JlQnVnQ2hlY2tEYXRhWzFdLCBNb3JlQnVnQ2hlY2tEYXRhWzJdLCBNb3JlQnVnQ2hlY2tEYXRhWzNdKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBwYXRoIG9yIHdvcmtpbmcgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNoYXIgKiBQTUFQSSBQTV9nZXRDdXJyZW50UGF0aCgKLSAgICBjaGFyICpwYXRoLAotICAgIGludCBtYXhMZW4pCi17Ci0gICAgc3RybmNweShwYXRoLF9QTV9jbnRQYXRoLG1heExlbik7Ci0gICAgcGF0aFttYXhMZW4tMV0gPSAwOwotICAgIHJldHVybiBwYXRoOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXN6S2V5ICAgICAgIC0gS2V5IHRvIHF1ZXJ5IChjYW4gY29udGFpbiB2ZXJzaW9uIG51bWJlciBmb3JtYXR0aW5nKQotc3pWYWx1ZSAgICAgLSBWYWx1ZSB0byBnZXQgaW5mb3JtYXRpb24gZm9yCi12YWx1ZSAgICAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSByZWdpc3RyeSBrZXkgZGF0YSByZWFkCi1zaXplICAgICAgICAtIFNpemUgb2YgdGhlIHN0cmluZyBidWZmZXIgdG8gcmVhZCBpbnRvCi0KLVJFVFVSTlM6Ci10cnVlIGlmIHRoZSBrZXkgd2FzIGZvdW5kLCBmYWxzZSBpZiBub3QuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGlib29sIFJFR19xdWVyeVN0cmluZygKLSAgICBjaGFyICpzektleSwKLSAgICBjb25zdCBjaGFyICpzelZhbHVlLAotICAgIGNoYXIgKnZhbHVlLAotICAgIERXT1JEIHNpemUpCi17Ci0gICAgaWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0gICAgTlRTVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICBydmFsOwotICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotICAgIEhBTkRMRSAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlOwotICAgIE9CSkVDVF9BVFRSSUJVVEVTICAgICAgICAgICAgICAga2V5QXR0cmlidXRlczsKLSAgICBVTklDT0RFX1NUUklORyAgICAgICAgICAgICAgICAgICp1bmlLZXkgPSBOVUxMOwotICAgIFVOSUNPREVfU1RSSU5HICAgICAgICAgICAgICAgICAgKnVuaVZhbHVlID0gTlVMTDsKLSAgICBQS0VZX1ZBTFVFX0ZVTExfSU5GT1JNQVRJT04JCWZ1bGxJbmZvID0gTlVMTDsKLSAgICBTVFJJTkcgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ2RhdGE7Ci0gICAgVU5JQ09ERV9TVFJJTkcgICAgICAgICAgICAgICAgICB1bmlkYXRhOwotCi0gICAgLyogQ29udmVydCBzdHJpbmdzIHRvIFVuaUNvZGUgKi8KLSAgICBzdGF0dXMgPSBmYWxzZTsKLSAgICBpZiAoKHVuaUtleSA9IF9QTV9DU3RyaW5nVG9Vbmljb2RlU3RyaW5nKHN6S2V5KSkgPT0gTlVMTCkKLQlnb3RvIEV4aXQ7Ci0gICAgaWYgKCh1bmlWYWx1ZSA9IF9QTV9DU3RyaW5nVG9Vbmljb2RlU3RyaW5nKHN6VmFsdWUpKSA9PSBOVUxMKQotCWdvdG8gRXhpdDsKLQotICAgIC8qIE9wZW4gdGhlIGtleSAqLwotICAgIEluaXRpYWxpemVPYmplY3RBdHRyaWJ1dGVzKCAma2V5QXR0cmlidXRlcywKLQkJCQl1bmlLZXksCi0JCQkJT0JKX0NBU0VfSU5TRU5TSVRJVkUsCi0JCQkJTlVMTCwKLQkJCQlOVUxMICk7Ci0gICAgcnZhbCA9IFp3T3BlbktleSggJkhhbmRsZSwKLQkJICAgICAgS0VZX0FMTF9BQ0NFU1MsCi0JCSAgICAgICZrZXlBdHRyaWJ1dGVzICk7Ci0gICAgaWYgKCFOVF9TVUNDRVNTKHJ2YWwpKQotCWdvdG8gRXhpdDsKLQotICAgIC8qIFF1ZXJ5IHRoZSB2YWx1ZSAqLwotICAgIGxlbmd0aCA9IHNpemVvZiAoS0VZX1ZBTFVFX0ZVTExfSU5GT1JNQVRJT04pCi0JICAgKyBzaXplICogc2l6ZW9mKFdDSEFSKTsKLSAgICBpZiAoKGZ1bGxJbmZvID0gRXhBbGxvY2F0ZVBvb2wgKFBhZ2VkUG9vbCwgbGVuZ3RoKSkgPT0gTlVMTCkKLQlnb3RvIEV4aXQ7Ci0gICAgUnRsWmVyb01lbW9yeShmdWxsSW5mbywgbGVuZ3RoKTsKLSAgICBydmFsID0gWndRdWVyeVZhbHVlS2V5IChIYW5kbGUsCi0JCQkgICAgdW5pVmFsdWUsCi0JCQkgICAgS2V5VmFsdWVGdWxsSW5mb3JtYXRpb24sCi0JCQkgICAgZnVsbEluZm8sCi0JCQkgICAgbGVuZ3RoLAotCQkJICAgICZsZW5ndGgpOwotICAgIGlmIChOVF9TVUNDRVNTIChydmFsKSkgewotCS8qIENyZWF0ZSB0aGUgVW5pQ29kZSBzdHJpbmcgc28gd2UgY2FuIGNvbnZlcnQgaXQgKi8KLQl1bmlkYXRhLkJ1ZmZlciA9IChQV0NIQVIpKCgoUENIQVIpZnVsbEluZm8pICsgZnVsbEluZm8tPkRhdGFPZmZzZXQpOwotCXVuaWRhdGEuTGVuZ3RoID0gKFVTSE9SVClmdWxsSW5mby0+RGF0YUxlbmd0aDsKLQl1bmlkYXRhLk1heGltdW1MZW5ndGggPSAoVVNIT1JUKWZ1bGxJbmZvLT5EYXRhTGVuZ3RoICsgc2l6ZW9mKFdDSEFSKTsKLQotCS8qIENvbnZlcnQgdW5pY29kZSB1bml2YWx1ZSB0byBhbnNpIHN0cmluZy4gKi8KLQlydmFsID0gUnRsVW5pY29kZVN0cmluZ1RvQW5zaVN0cmluZygmc3RyaW5nZGF0YSwgJnVuaWRhdGEsIFRSVUUpOwotCWlmIChOVF9TVUNDRVNTKHJ2YWwpKSB7Ci0JICAgIHN0cmNweSh2YWx1ZSxzdHJpbmdkYXRhLkJ1ZmZlcik7Ci0JICAgIHN0YXR1cyA9IHRydWU7Ci0JICAgIH0KLQl9Ci0KLUV4aXQ6Ci0gICAgaWYgKGZ1bGxJbmZvKSBFeEZyZWVQb29sKGZ1bGxJbmZvKTsKLSAgICBpZiAodW5pS2V5KSBfUE1fRnJlZVVuaWNvZGVTdHJpbmcodW5pS2V5KTsKLSAgICBpZiAodW5pVmFsdWUpIF9QTV9GcmVlVW5pY29kZVN0cmluZyh1bmlWYWx1ZSk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIGRyaXZlIGxldHRlciBmb3IgdGhlIGJvb3QgZHJpdmUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2hhciBQTUFQSSBQTV9nZXRCb290RHJpdmUodm9pZCkKLXsKLSAgICBjaGFyIHBhdGhbMjU2XTsKLSAgICBpZiAoUkVHX3F1ZXJ5U3RyaW5nKHN6TlRXaW5kb3dzS2V5LHN6TlRTeXN0ZW1Sb290LHBhdGgsc2l6ZW9mKHBhdGgpKSkKLQlyZXR1cm4gJ2MnOwotICAgIHJldHVybiBwYXRoWzBdOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgcGF0aCB0byB0aGUgVkJFL0FGIGRyaXZlciBmaWxlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VkJFQUZQYXRoKHZvaWQpCi17Ci0gICAgcmV0dXJuICJjOlxcIjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIHBhdGggdG8gdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzUGF0aCh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIHBhdGhbMjU2XTsKLQotICAgIGlmIChzdHJsZW4oX1BNX251Y2xldXNQYXRoKSA+IDApIHsKLQlzdHJjcHkocGF0aCxfUE1fbnVjbGV1c1BhdGgpOwotCVBNX2JhY2tzbGFzaChwYXRoKTsKLQlyZXR1cm4gcGF0aDsKLQl9Ci0gICAgaWYgKCFSRUdfcXVlcnlTdHJpbmcoc3pOVFdpbmRvd3NLZXksc3pOVFN5c3RlbVJvb3QscGF0aCxzaXplb2YocGF0aCkpKQotCXN0cmNweShwYXRoLCJjOlxcd2lubnQiKTsKLSAgICBQTV9iYWNrc2xhc2gocGF0aCk7Ci0gICAgc3RyY2F0KHBhdGgsInN5c3RlbTMyXFxudWNsZXVzIik7Ci0gICAgcmV0dXJuIHBhdGg7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBOdWNsZXVzIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNDb25maWdQYXRoKHZvaWQpCi17Ci0gICAgc3RhdGljIGNoYXIgcGF0aFsyNTZdOwotICAgIHN0cmNweShwYXRoLFBNX2dldE51Y2xldXNQYXRoKCkpOwotICAgIFBNX2JhY2tzbGFzaChwYXRoKTsKLSAgICBzdHJjYXQocGF0aCwiY29uZmlnIik7Ci0gICAgcmV0dXJuIHBhdGg7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBtYWNoaW5lIGlmIHBvc3NpYmxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRVbmlxdWVJRCh2b2lkKQotewotICAgIHJldHVybiBQTV9nZXRNYWNoaW5lTmFtZSgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUdldCB0aGUgbmFtZSBvZiB0aGUgbWFjaGluZSBvbiB0aGUgbmV0d29yay4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TWFjaGluZU5hbWUodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBuYW1lWzI1Nl07Ci0KLSAgICBpZiAoUkVHX3F1ZXJ5U3RyaW5nKHN6TWFjaGluZU5hbWVLZXksc3pNYWNoaW5lTmFtZSxuYW1lLHNpemVvZihuYW1lKSkpCi0JcmV0dXJuIG5hbWU7Ci0gICAgaWYgKFJFR19xdWVyeVN0cmluZyhzek1hY2hpbmVOYW1lS2V5TlQsc3pNYWNoaW5lTmFtZSxuYW1lLHNpemVvZihuYW1lKSkpCi0JcmV0dXJuIG5hbWU7Ci0gICAgcmV0dXJuICJVbmtub3duIjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DaGVjayBpZiBhIGtleSBoYXMgYmVlbiBwcmVzc2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9rYmhpdCh2b2lkKQotewotICAgIC8qIE5vdCB1c2VkIGluIE5UIGRyaXZlcnMgKi8KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1XYWl0IGZvciBhbmQgcmV0dXJuIHRoZSBuZXh0IGtleXByZXNzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9nZXRjaCh2b2lkKQotewotICAgIC8qIE5vdCB1c2VkIGluIE5UIGRyaXZlcnMgKi8KLSAgICByZXR1cm4gMHhEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU9wZW4gYSBjb25zb2xlIGZvciBvdXRwdXQgdG8gdGhlIHNjcmVlbiwgY3JlYXRpbmcgdGhlIG1haW4gZXZlbnQgaGFuZGxpbmcKLXdpbmRvdyBpZiBuZWNlc3NhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUE1fSFdORCBQTUFQSSBQTV9vcGVuQ29uc29sZSgKLSAgICBQTV9IV05EIGh3bmRVc2VyLAotICAgIGludCBkZXZpY2UsCi0gICAgaW50IHhSZXMsCi0gICAgaW50IHlSZXMsCi0gICAgaW50IGJwcCwKLSAgICBpYm9vbCBmdWxsU2NyZWVuKQotewotICAgIC8qIE5vdCB1c2VkIGluIE5UIGRyaXZlcnMgKi8KLSAgICAodm9pZClod25kVXNlcjsKLSAgICAodm9pZClkZXZpY2U7Ci0gICAgKHZvaWQpeFJlczsKLSAgICAodm9pZCl5UmVzOwotICAgICh2b2lkKWJwcDsKLSAgICAodm9pZClmdWxsU2NyZWVuOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZpbmQgdGhlIHNpemUgb2YgdGhlIGNvbnNvbGUgc3RhdGUgYnVmZmVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9nZXRDb25zb2xlU3RhdGVTaXplKHZvaWQpCi17Ci0gICAgLyogTm90IHVzZWQgaW4gTlQgZHJpdmVycyAqLwotICAgIHJldHVybiAxOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNhdmUgdGhlIHN0YXRlIG9mIHRoZSBjb25zb2xlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2F2ZUNvbnNvbGVTdGF0ZSgKLSAgICB2b2lkICpzdGF0ZUJ1ZiwKLSAgICBQTV9IV05EIGh3bmRDb25zb2xlKQotewotICAgIC8qIE5vdCB1c2VkIGluIE5UIGRyaXZlcnMgKi8KLSAgICAodm9pZClzdGF0ZUJ1ZjsKLSAgICAodm9pZClod25kQ29uc29sZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIHN1c3BlbmQgYXBwbGljYXRpb24gY2FsbGJhY2sgZm9yIHRoZSBmdWxsc2NyZWVuIGNvbnNvbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2soCi0gICAgUE1fc2F2ZVN0YXRlX2NiIHNhdmVTdGF0ZSkKLXsKLSAgICAvKiBOb3QgdXNlZCBpbiBOVCBkcml2ZXJzICovCi0gICAgKHZvaWQpc2F2ZVN0YXRlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlc3RvcmUgdGhlIGNvbnNvbGUgc3RhdGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9yZXN0b3JlQ29uc29sZVN0YXRlKAotICAgIGNvbnN0IHZvaWQgKnN0YXRlQnVmLAotICAgIFBNX0hXTkQgaHduZENvbnNvbGUpCi17Ci0gICAgLyogTm90IHVzZWQgaW4gTlQgZHJpdmVycyAqLwotICAgICh2b2lkKXN0YXRlQnVmOwotICAgICh2b2lkKWh3bmRDb25zb2xlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNsb3NlIHRoZSBmdWxsc2NyZWVuIGNvbnNvbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9jbG9zZUNvbnNvbGUoCi0gICAgUE1fSFdORCBod25kQ29uc29sZSkKLXsKLSAgICAvKiBOb3QgdXNlZCBpbiBOVCBkcml2ZXJzICovCi0gICAgKHZvaWQpaHduZENvbnNvbGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgT1MgY29uc29sZSBjdXJzb3IuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRPU0N1cnNvckxvY2F0aW9uKAotICAgIGludCB4LAotICAgIGludCB5KQotewotICAgIC8qIE5vdGhpbmcgdG8gZG8gZm9yIFdpbmRvd3MgKi8KLSAgICAodm9pZCl4OwotICAgICh2b2lkKXk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2V0IHRoZSB3aWR0aCBvZiB0aGUgT1MgY29uc29sZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldE9TU2NyZWVuV2lkdGgoCi0gICAgaW50IHdpZHRoLAotICAgIGludCBoZWlnaHQpCi17Ci0gICAgLyogTm90aGluZyB0byBkbyBmb3IgV2luZG93cyAqLwotICAgICh2b2lkKXdpZHRoOwotICAgICh2b2lkKWhlaWdodDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1NYXBzIGEgc2hhcmVkIG1lbW9yeSBibG9jayBpbnRvIHByb2Nlc3MgYWRkcmVzcyBzcGFjZS4gRG9lcyBub3RoaW5nIHNpbmNlCi10aGUgbWVtb3J5IGJsb2NrcyBhcmUgYWxyZWFkeSBnbG9iYWxseSBtYXBwZWQgaW50byBhbGwgcHJvY2Vzc2VzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9tYXBUb1Byb2Nlc3MoCi0gICAgdm9pZCAqYmFzZSwKLSAgICB1bG9uZyBsaW1pdCkKLXsKLSAgICAvKiBOb3QgdXNlZCBhbnltb3JlICovCi0gICAgKHZvaWQpYmFzZTsKLSAgICAodm9pZClsaW1pdDsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1FeGVjdXRlIHRoZSBQT1NUIG9uIHRoZSBzZWNvbmRhcnkgQklPUyBmb3IgYSBjb250cm9sbGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2RvQklPU1BPU1QoCi0gICAgdXNob3J0IGF4VmFsLAotICAgIHVsb25nIEJJT1NQaHlzQWRkciwKLSAgICB2b2lkICptYXBwZWRCSU9TLAotICAgIHVsb25nIEJJT1NMZW4pCi17Ci0gICAgLyogVGhpcyBtYXkgbm90IGJlIHBvc3NpYmxlIGluIE5UIGFuZCBzaG91bGQgYmUgZG9uZSBieSB0aGUgT1MgYW55d2F5ICovCi0gICAgKHZvaWQpYXhWYWw7Ci0gICAgKHZvaWQpQklPU1BoeXNBZGRyOwotICAgICh2b2lkKW1hcHBlZEJJT1M7Ci0gICAgKHZvaWQpQklPU0xlbjsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgcmVhbCBtb2RlIEJJT1MgZGF0YSBhcmVhLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9nZXRCSU9TUG9pbnRlcih2b2lkKQotewotICAgIC8qIE5vdGUgdGhhdCBvbiBOVCB0aGlzIHByb2JhYmx5IGRvZXMgbm90IGRvIHdoYXQgd2UgZXhwZWN0ISAqLwotICAgIHJldHVybiBQTV9tYXBQaHlzaWNhbEFkZHIoMHg0MDAsIDB4MTAwMCwgdHJ1ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIGEgcG9pbnRlciB0byAweEEwMDAwIHBoeXNpY2FsIFZHQSBncmFwaGljcyBmcmFtZWJ1ZmZlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fZ2V0QTAwMDBQb2ludGVyKHZvaWQpCi17Ci0gICAgcmV0dXJuIFBNX21hcFBoeXNpY2FsQWRkcigweEEwMDAwLDB4RkZGRixmYWxzZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2xlZXAgZm9yIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NsZWVwKAotICAgIHVsb25nIG1pbGxpc2Vjb25kcykKLXsKLSAgICAvKiBXZSBuZXZlciB1c2UgdGhpcyBpbiBOVCBkcml2ZXJzICovCi0gICAgKHZvaWQpbWlsbGlzZWNvbmRzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgYmFzZSBJL08gcG9ydCBmb3IgdGhlIHNwZWNpZmllZCBDT00gcG9ydC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZ2V0Q09NUG9ydChpbnQgcG9ydCkKLXsKLSAgICAvKiBUT0RPOiBSZS1jb2RlIHRoaXMgdG8gZGV0ZXJtaW5lIHJlYWwgdmFsdWVzIHVzaW5nIHRoZSBQbHVnIGFuZCBQbGF5ICovCi0gICAgLyogICAgICAgbWFuYWdlciBmb3IgdGhlIE9TLiAqLwotICAgIHN3aXRjaCAocG9ydCkgewotCWNhc2UgMDogcmV0dXJuIDB4M0Y4OwotCWNhc2UgMTogcmV0dXJuIDB4MkY4OwotCWNhc2UgMjogcmV0dXJuIDB4M0U4OwotCWNhc2UgMzogcmV0dXJuIDB4MkU4OwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIGJhc2UgSS9PIHBvcnQgZm9yIHRoZSBzcGVjaWZpZWQgTFBUIHBvcnQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2dldExQVFBvcnQoaW50IHBvcnQpCi17Ci0gICAgLyogVE9ETzogUmUtY29kZSB0aGlzIHRvIGRldGVybWluZSByZWFsIHZhbHVlcyB1c2luZyB0aGUgUGx1ZyBhbmQgUGxheSAqLwotICAgIC8qICAgICAgIG1hbmFnZXIgZm9yIHRoZSBPUy4gKi8KLSAgICBzd2l0Y2ggKHBvcnQpIHsKLQljYXNlIDA6IHJldHVybiAweDNCQzsKLQljYXNlIDE6IHJldHVybiAweDM3ODsKLQljYXNlIDI6IHJldHVybiAweDI3ODsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJucyBhdmFpbGFibGUgbWVtb3J5LiBOb3QgcG9zc2libGUgdW5kZXIgV2luZG93cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2F2YWlsYWJsZU1lbW9yeSgKLSAgICB1bG9uZyAqcGh5c2ljYWwsCi0gICAgdWxvbmcgKnRvdGFsKQotewotICAgICpwaHlzaWNhbCA9ICp0b3RhbCA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotT1Mgc3BlY2lmaWMgc2hhcmVkIGxpYnJhcmllcyBub3Qgc3VwcG9ydGVkIGluc2lkZSBhIFZ4RAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVBNX01PRFVMRSBQTUFQSSBQTV9sb2FkTGlicmFyeSgKLSAgICBjb25zdCBjaGFyICpzekRMTE5hbWUpCi17Ci0gICAgLyogTm90IHVzZWQgaW4gTlQgZHJpdmVycyAqLwotICAgICh2b2lkKXN6RExMTmFtZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1PUyBzcGVjaWZpYyBzaGFyZWQgbGlicmFyaWVzIG5vdCBzdXBwb3J0ZWQgaW5zaWRlIGEgVnhECi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2dldFByb2NBZGRyZXNzKAotICAgIFBNX01PRFVMRSBoTW9kdWxlLAotICAgIGNvbnN0IGNoYXIgKnN6UHJvY05hbWUpCi17Ci0gICAgLyogTm90IHVzZWQgaW4gTlQgZHJpdmVycyAqLwotICAgICh2b2lkKWhNb2R1bGU7Ci0gICAgKHZvaWQpc3pQcm9jTmFtZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1PUyBzcGVjaWZpYyBzaGFyZWQgbGlicmFyaWVzIG5vdCBzdXBwb3J0ZWQgaW5zaWRlIGEgVnhECi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlTGlicmFyeSgKLSAgICBQTV9NT0RVTEUgaE1vZHVsZSkKLXsKLSAgICAvKiBOb3QgdXNlZCBpbiBOVCBkcml2ZXJzICovCi0gICAgKHZvaWQpaE1vZHVsZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBmaW5kIHRoZSBmaXJzdCBmaWxlIG1hdGNoaW5nIGEgc2VhcmNoIGNyaXRlcmlhIGluIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKlBNQVBJIFBNX2ZpbmRGaXJzdEZpbGUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIHN0YXJ0IGEgZGlyZWN0b3J5IGVudW1lcmF0aW9uIHNlYXJjaCAqLwotICAgIC8qICAgICAgIGdpdmVuIHRoZSBmaWxlbmFtZSAod2l0aCB3aWxkY2FyZHMpLiBUaGUgZGF0YSBzaG91bGQgYmUgKi8KLSAgICAvKiAgICAgICBjb252ZXJ0ZWQgYW5kIHJldHVybmVkIGluIHRoZSBmaW5kRGF0YSBzdGFuZGFyZCBmb3JtLiAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgICh2b2lkKWZpbmREYXRhOwotICAgIHJldHVybiBQTV9GSUxFX0lOVkFMSUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZmluZCB0aGUgbmV4dCBmaWxlIG1hdGNoaW5nIGEgc2VhcmNoIGNyaXRlcmlhIGluIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2ZpbmROZXh0RmlsZSgKLSAgICB2b2lkICpoYW5kbGUsCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGZpbmQgdGhlIG5leHQgZmlsZSBpbiBkaXJlY3RvcnkgZW51bWVyYXRpb24gKi8KLSAgICAvKiAgICAgICBzZWFyY2ggZ2l2ZW4gdGhlIHNlYXJjaCBjcml0ZXJpYSBkZWZpbmVkIGluIHRoZSBjYWxsIHRvICovCi0gICAgLyogICAgICAgUE1fZmluZEZpcnN0RmlsZS4gVGhlIGRhdGEgc2hvdWxkIGJlIGNvbnZlcnRlZCBhbmQgcmV0dXJuZWQgKi8KLSAgICAvKiAgICAgICBpbiB0aGUgZmluZERhdGEgc3RhbmRhcmQgZm9ybS4gKi8KLSAgICAodm9pZCloYW5kbGU7Ci0gICAgKHZvaWQpZmluZERhdGE7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNsb3NlIHRoZSBmaW5kIHByb2Nlc3MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZpbmRDbG9zZSgKLSAgICB2b2lkICpoYW5kbGUpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgY2xvc2UgdGhlIGZpbmQgcHJvY2Vzcy4gVGhpcyBtYXkgZG8gKi8KLSAgICAvKiAgICAgICBub3RoaW5nIGZvciBzb21lIE9TJ2VzLiAqLwotICAgICh2b2lkKWhhbmRsZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSBkcml2ZSBpcyBhIHZhbGlkIGRyaXZlIG9yIG5vdC4gVW5kZXIgVW5peCB0aGlzCi1mdW5jdGlvbiB3aWxsIHJldHVybiBmYWxzZSBmb3IgYW55dGhpbmcgZXhjZXB0IGEgdmFsdWUgb2YgMyAoY29uc2lkZXJlZAotdGhlIHJvb3QgZHJpdmUsIGFuZCBlcXVpdmFsZW50IHRvIEM6IGZvciBub24tVW5peCBzeXN0ZW1zKS4gVGhlIGRyaXZlCi1udW1iZXJpbmcgaXM6Ci0KLSAgICAxICAgLSBEcml2ZSBBOgotICAgIDIgICAtIERyaXZlIEI6Ci0gICAgMyAgIC0gRHJpdmUgQzoKLSAgICBldGMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2RyaXZlVmFsaWQoCi0gICAgY2hhciBkcml2ZSkKLXsKLSAgICAvKiBOb3Qgc3VwcG9ydGVkIGluIE5UIGRyaXZlcnMgKi8KLSAgICAodm9pZClkcml2ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgc3BlY2lmaWZlZCBkcml2ZS4KLVVuZGVyIFVuaXggdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgcmVnYXJkbGVzcwotb2Ygd2hhdCB0aGUgdmFsdWUgb2YgJ2RyaXZlJyBpcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2dldGRjd2QoCi0gICAgaW50IGRyaXZlLAotICAgIGNoYXIgKmRpciwKLSAgICBpbnQgbGVuKQotewotICAgIC8qIE5vdCBzdXBwb3J0ZWQgaW4gTlQgZHJpdmVycyAqLwotICAgICh2b2lkKWRyaXZlOwotICAgICh2b2lkKWRpcjsKLSAgICAodm9pZClsZW47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYmFzZSAgICAtIFRoZSBzdGFydGluZyBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgotc2l6ZSAgICAtIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZWdpb24KLXR5cGUgICAgLSBUeXBlIHRvIHBsYWNlIGludG8gdGhlIE1UUlIgcmVnaXN0ZXIKLQotUkVUVVJOUzoKLUVycm9yIGNvZGUgZGVzY3JpYmluZyB0aGUgcmVzdWx0LgotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZW5hYmxlIHdyaXRlIGNvbWJpbmluZyBmb3IgdGhlIHNwZWNpZmllZCByZWdpb24gb2YgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9lbmFibGVXcml0ZUNvbWJpbmUoCi0gICAgdWxvbmcgYmFzZSwKLSAgICB1bG9uZyBzaXplLAotICAgIHVpbnQgdHlwZSkKLXsKLSAgICByZXR1cm4gTVRSUl9lbmFibGVXcml0ZUNvbWJpbmUoYmFzZSxzaXplLHR5cGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNoYW5nZSB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRGaWxlQXR0cigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICB1aW50IGF0dHJpYikKLXsKLSAgICBOVFNUQVRVUyAgICAgICAgICAgICAgICBzdGF0dXM7Ci0gICAgQUNDRVNTX01BU0sgICAgICAgICAgICAgRGVzaXJlZEFjY2VzcyA9IEdFTkVSSUNfUkVBRCB8IEdFTkVSSUNfV1JJVEU7Ci0gICAgT0JKRUNUX0FUVFJJQlVURVMgICAgICAgT2JqZWN0QXR0cmlidXRlczsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBTaGFyZUFjY2VzcyA9IEZJTEVfU0hBUkVfUkVBRDsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBDcmVhdGVEaXNwb3NpdGlvbiA9IEZJTEVfT1BFTjsKLSAgICBIQU5ETEUgICAgICAgICAgICAgICAgICBGaWxlSGFuZGxlID0gTlVMTDsKLSAgICBVTklDT0RFX1NUUklORyAgICAgICAgICAqdW5pRmlsZSA9IE5VTEw7Ci0gICAgSU9fU1RBVFVTX0JMT0NLICAgICAgICAgSW9TdGF0dXNCbG9jazsKLSAgICBGSUxFX0JBU0lDX0lORk9STUFUSU9OICBGaWxlQmFzaWM7Ci0gICAgY2hhciAgICAgICAgICAgICAgICAgICAga2VybmVsRmlsZW5hbWVbUE1fTUFYX1BBVEgrNV07Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgRmlsZUF0dHJpYnV0ZXMgPSAwOwotCi0gICAgLyogQ29udmVydCBmaWxlIGF0dHJpYnV0ZSBmbGFncyAqLwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX1JFQURPTkxZKQotCUZpbGVBdHRyaWJ1dGVzIHw9IEZJTEVfQVRUUklCVVRFX1JFQURPTkxZOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX0FSQ0hJVkUpCi0JRmlsZUF0dHJpYnV0ZXMgfD0gRklMRV9BVFRSSUJVVEVfQVJDSElWRTsKLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9ISURERU4pCi0JRmlsZUF0dHJpYnV0ZXMgfD0gRklMRV9BVFRSSUJVVEVfSElEREVOOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX1NZU1RFTSkKLQlGaWxlQXR0cmlidXRlcyB8PSBGSUxFX0FUVFJJQlVURV9TWVNURU07Ci0KLSAgICAvKiBBZGQgcHJlZml4IGZvciBhZGRyZXNzaW5nIHRoZSBmaWxlIHN5c3RlbS4gIlw/P1wiIGlzIHNob3J0IGZvciAiXERvc0RldmljZXNcIiAqLwotICAgIHN0cmNweShrZXJuZWxGaWxlbmFtZSwgIlxcPz9cXCIpOwotICAgIHN0cmNhdChrZXJuZWxGaWxlbmFtZSwgZmlsZW5hbWUpOwotCi0gICAgLyogQ29udmVydCBmaWxlbmFtZSBzdHJpbmcgdG8gYW5zaSBzdHJpbmcgKi8KLSAgICBpZiAoKHVuaUZpbGUgPSBfUE1fQ1N0cmluZ1RvVW5pY29kZVN0cmluZyhrZXJuZWxGaWxlbmFtZSkpID09IE5VTEwpCi0JZ290byBFeGl0OwotCi0gICAgLyogTXVzdCBvcGVuIGEgZmlsZSB0byBxdWVyeSBpdCdzIGF0dHJpYnV0ZXMgKi8KLSAgICBJbml0aWFsaXplT2JqZWN0QXR0cmlidXRlcyAoJk9iamVjdEF0dHJpYnV0ZXMsCi0JCQkJdW5pRmlsZSwKLQkJCQlPQkpfQ0FTRV9JTlNFTlNJVElWRSwKLQkJCQlOVUxMLAotCQkJCU5VTEwgKTsKLSAgICBzdGF0dXMgPSBad0NyZWF0ZUZpbGUoICZGaWxlSGFuZGxlLAotCQkJICAgIERlc2lyZWRBY2Nlc3MgfCBTWU5DSFJPTklaRSwKLQkJCSAgICAmT2JqZWN0QXR0cmlidXRlcywKLQkJCSAgICAmSW9TdGF0dXNCbG9jaywKLQkJCSAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qQWxsb2NhdGlvblNpemUgIE9QVElPTkFMLCAqLwotCQkJICAgIEZJTEVfQVRUUklCVVRFX05PUk1BTCwKLQkJCSAgICBTaGFyZUFjY2VzcywKLQkJCSAgICBDcmVhdGVEaXNwb3NpdGlvbiwKLQkJCSAgICBGSUxFX1JBTkRPTV9BQ0NFU1MsICAgICAgICAvKkNyZWF0ZU9wdGlvbnMsICovCi0JCQkgICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKkVhQnVmZmVyICBPUFRJT05BTCwgKi8KLQkJCSAgICAwICAgICAgICAgICAgICAgICAgICAgIC8qRWFMZW5ndGggKHJlcXVpcmVkIGlmIEVhQnVmZmVyKSAqLwotCQkJICAgICk7Ci0gICAgaWYgKCFOVF9TVUNDRVNTIChzdGF0dXMpKQotCWdvdG8gRXhpdDsKLQotICAgIC8qIFF1ZXJ5IHRpbWVzdGFtcHMgKi8KLSAgICBzdGF0dXMgPSBad1F1ZXJ5SW5mb3JtYXRpb25GaWxlKEZpbGVIYW5kbGUsCi0JCQkJICAgICZJb1N0YXR1c0Jsb2NrLAotCQkJCSAgICAmRmlsZUJhc2ljLAotCQkJCSAgICBzaXplb2YoRklMRV9CQVNJQ19JTkZPUk1BVElPTiksCi0JCQkJICAgIEZpbGVCYXNpY0luZm9ybWF0aW9uCi0JCQkJICAgICk7Ci0gICAgaWYgKCFOVF9TVUNDRVNTIChzdGF0dXMpKQotCWdvdG8gRXhpdDsKLQotICAgIC8qIENoYW5nZSB0aGUgZm91ciBiaXRzIHdlIGNoYW5nZSAqLwotICAgIEZpbGVCYXNpYy5GaWxlQXR0cmlidXRlcyAmPSB+KEZJTEVfQVRUUklCVVRFX1JFQURPTkxZIHwgRklMRV9BVFRSSUJVVEVfQVJDSElWRQotCQkJCSAgfCBGSUxFX0FUVFJJQlVURV9ISURERU4gfCBGSUxFX0FUVFJJQlVURV9TWVNURU0pOwotICAgIEZpbGVCYXNpYy5GaWxlQXR0cmlidXRlcyB8PSBGaWxlQXR0cmlidXRlczsKLQotICAgIC8qIFNldCB0aW1lc3RhbXBzICovCi0gICAgWndTZXRJbmZvcm1hdGlvbkZpbGUoICAgRmlsZUhhbmRsZSwKLQkJCSAgICAmSW9TdGF0dXNCbG9jaywKLQkJCSAgICAmRmlsZUJhc2ljLAotCQkJICAgIHNpemVvZihGSUxFX0JBU0lDX0lORk9STUFUSU9OKSwKLQkJCSAgICBGaWxlQmFzaWNJbmZvcm1hdGlvbgotCQkJICAgICk7Ci0KLUV4aXQ6Ci0gICAgaWYgKEZpbGVIYW5kbGUpIFp3Q2xvc2UoRmlsZUhhbmRsZSk7Ci0gICAgaWYgKHVuaUZpbGUpIF9QTV9GcmVlVW5pY29kZVN0cmluZyh1bmlGaWxlKTsKLSAgICByZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZ2V0IHRoZSBmaWxlIGF0dHJpYnV0ZXMgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50IFBNQVBJIFBNX2dldEZpbGVBdHRyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIE5UU1RBVFVTICAgICAgICAgICAgICAgIHN0YXR1czsKLSAgICBBQ0NFU1NfTUFTSyAgICAgICAgICAgICBEZXNpcmVkQWNjZXNzID0gR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklURTsKLSAgICBPQkpFQ1RfQVRUUklCVVRFUyAgICAgICBPYmplY3RBdHRyaWJ1dGVzOwotICAgIFVMT05HICAgICAgICAgICAgICAgICAgIFNoYXJlQWNjZXNzID0gRklMRV9TSEFSRV9SRUFEOwotICAgIFVMT05HICAgICAgICAgICAgICAgICAgIENyZWF0ZURpc3Bvc2l0aW9uID0gRklMRV9PUEVOOwotICAgIEhBTkRMRSAgICAgICAgICAgICAgICAgIEZpbGVIYW5kbGUgPSBOVUxMOwotICAgIFVOSUNPREVfU1RSSU5HICAgICAgICAgICp1bmlGaWxlID0gTlVMTDsKLSAgICBJT19TVEFUVVNfQkxPQ0sgICAgICAgICBJb1N0YXR1c0Jsb2NrOwotICAgIEZJTEVfQkFTSUNfSU5GT1JNQVRJT04gIEZpbGVCYXNpYzsKLSAgICBjaGFyICAgICAgICAgICAgICAgICAgICBrZXJuZWxGaWxlbmFtZVtQTV9NQVhfUEFUSCs1XTsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBGaWxlQXR0cmlidXRlcyA9IDA7Ci0gICAgdWludCAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gMDsKLQotICAgIC8qIEFkZCBwcmVmaXggZm9yIGFkZHJlc3NpbmcgdGhlIGZpbGUgc3lzdGVtLiAiXD8/XCIgaXMgc2hvcnQgZm9yICJcRG9zRGV2aWNlc1wiICovCi0gICAgc3RyY3B5KGtlcm5lbEZpbGVuYW1lLCAiXFw/P1xcIik7Ci0gICAgc3RyY2F0KGtlcm5lbEZpbGVuYW1lLCBmaWxlbmFtZSk7Ci0KLSAgICAvKiBDb252ZXJ0IGZpbGVuYW1lIHN0cmluZyB0byBhbnNpIHN0cmluZyAqLwotICAgIGlmICgodW5pRmlsZSA9IF9QTV9DU3RyaW5nVG9Vbmljb2RlU3RyaW5nKGtlcm5lbEZpbGVuYW1lKSkgPT0gTlVMTCkKLQlnb3RvIEV4aXQ7Ci0KLSAgICAvKiBNdXN0IG9wZW4gYSBmaWxlIHRvIHF1ZXJ5IGl0J3MgYXR0cmlidXRlcyAqLwotICAgIEluaXRpYWxpemVPYmplY3RBdHRyaWJ1dGVzICgmT2JqZWN0QXR0cmlidXRlcywKLQkJCQl1bmlGaWxlLAotCQkJCU9CSl9DQVNFX0lOU0VOU0lUSVZFLAotCQkJCU5VTEwsCi0JCQkJTlVMTCApOwotICAgIHN0YXR1cyA9IFp3Q3JlYXRlRmlsZSggJkZpbGVIYW5kbGUsCi0JCQkgICBEZXNpcmVkQWNjZXNzIHwgU1lOQ0hST05JWkUsCi0JCQkgICAmT2JqZWN0QXR0cmlidXRlcywKLQkJCSAgICZJb1N0YXR1c0Jsb2NrLAotCQkJICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKkFsbG9jYXRpb25TaXplICBPUFRJT05BTCwgKi8KLQkJCSAgIEZJTEVfQVRUUklCVVRFX05PUk1BTCwKLQkJCSAgIFNoYXJlQWNjZXNzLAotCQkJICAgQ3JlYXRlRGlzcG9zaXRpb24sCi0JCQkgICBGSUxFX1JBTkRPTV9BQ0NFU1MsICAgICAgICAvKkNyZWF0ZU9wdGlvbnMsICovCi0JCQkgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qRWFCdWZmZXIgIE9QVElPTkFMLCAqLwotCQkJICAgMCAgICAgICAgICAgICAgICAgICAgICAvKkVhTGVuZ3RoIChyZXF1aXJlZCBpZiBFYUJ1ZmZlcikgKi8KLQkJCSAgICk7Ci0gICAgaWYgKCFOVF9TVUNDRVNTIChzdGF0dXMpKQotCWdvdG8gRXhpdDsKLQotICAgIC8qIFF1ZXJ5IHRpbWVzdGFtcHMgKi8KLSAgICBzdGF0dXMgPSBad1F1ZXJ5SW5mb3JtYXRpb25GaWxlKEZpbGVIYW5kbGUsCi0JCQkJICAgICZJb1N0YXR1c0Jsb2NrLAotCQkJCSAgICAmRmlsZUJhc2ljLAotCQkJCSAgICBzaXplb2YoRklMRV9CQVNJQ19JTkZPUk1BVElPTiksCi0JCQkJICAgIEZpbGVCYXNpY0luZm9ybWF0aW9uCi0JCQkJICAgICk7Ci0gICAgaWYgKCFOVF9TVUNDRVNTIChzdGF0dXMpKQotCWdvdG8gRXhpdDsKLQotICAgIC8qIFRyYW5zbGF0ZSB0aGUgZmlsZSBhdHRyaWJ1dGVzICovCi0gICAgaWYgKEZpbGVCYXNpYy5GaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX1JFQURPTkxZKQotCXJldHZhbCB8PSBQTV9GSUxFX1JFQURPTkxZOwotICAgIGlmIChGaWxlQmFzaWMuRmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9BUkNISVZFKQotCXJldHZhbCB8PSBQTV9GSUxFX0FSQ0hJVkU7Ci0gICAgaWYgKEZpbGVCYXNpYy5GaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0hJRERFTikKLQlyZXR2YWwgfD0gUE1fRklMRV9ISURERU47Ci0gICAgaWYgKEZpbGVCYXNpYy5GaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX1NZU1RFTSkKLQlyZXR2YWwgfD0gUE1fRklMRV9TWVNURU07Ci0KLUV4aXQ6Ci0gICAgaWYgKEZpbGVIYW5kbGUpIFp3Q2xvc2UoRmlsZUhhbmRsZSk7Ci0gICAgaWYgKHVuaUZpbGUpIF9QTV9GcmVlVW5pY29kZVN0cmluZyh1bmlGaWxlKTsKLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9ta2RpcigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICAvKiBOb3Qgc3VwcG9ydGVkIGluIE5UIGRyaXZlcnMgKi8KLSAgICAodm9pZClmaWxlbmFtZTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gcmVtb3ZlIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX3JtZGlyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIC8qIE5vdCBzdXBwb3J0ZWQgaW4gTlQgZHJpdmVycyAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGZpbGUgdGltZSBhbmQgZGF0ZSBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2dldEZpbGVUaW1lKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIGlib29sIGdtVGltZSwKLSAgICBQTV90aW1lICp0aW1lKQotewotICAgIC8qIE5vdCBzdXBwb3J0ZWQgaW4gTlQgZHJpdmVycyAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgICh2b2lkKWdtVGltZTsKLSAgICAodm9pZCl0aW1lOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBzZXQgdGhlIGZpbGUgdGltZSBhbmQgZGF0ZSBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX3NldEZpbGVUaW1lKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIGlib29sIGdtVGltZSwKLSAgICBQTV90aW1lICp0aW1lKQotewotICAgIC8qIE5vdCBzdXBwb3J0ZWQgaW4gTlQgZHJpdmVycyAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgICh2b2lkKWdtVGltZTsKLSAgICAodm9pZCl0aW1lOwotICAgIHJldHVybiBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L3N0ZGlvLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9zdGRpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NThmMWM4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L3N0ZGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IFdpbmRvd3MgTlQgZHJpdmVyCi0qCi0qIERlc2NyaXB0aW9uOiAgQyBsaWJyYXJ5IGNvbXBhdGlibGUgSS9PIGZ1bmN0aW9ucyBmb3IgdXNlIHdpdGhpbiBhIFdpbmRvd3MKLSogICAgICAgICAgICAgICBOVCBkcml2ZXIuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJvc2hkci5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWluIENvZGUgSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5UIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZvcGVuIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUZJTEUgKiBmb3BlbigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICBjb25zdCBjaGFyICptb2RlKQotewotICAgIEFDQ0VTU19NQVNLICAgICAgICAgICAgICAgICBEZXNpcmVkQWNjZXNzOyAgICAgIC8qIGZvciBad0NyZWF0ZUZpbGUuLi4gKi8KLSAgICBPQkpFQ1RfQVRUUklCVVRFUyAgICAgICAgICAgT2JqZWN0QXR0cmlidXRlczsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgU2hhcmVBY2Nlc3M7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZURpc3Bvc2l0aW9uOwotICAgIE5UU1RBVFVTICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0gICAgSEFORExFICAgICAgICAgICAgICAgICAgICAgIEZpbGVIYW5kbGU7Ci0gICAgVU5JQ09ERV9TVFJJTkcgICAgICAgICAgICAgICp1bmlGaWxlID0gTlVMTDsKLSAgICBQV0NIQVIgICAgICAgICAgICAgICAgICAgICAgYnVmRmlsZSA9IE5VTEw7Ci0gICAgSU9fU1RBVFVTX0JMT0NLICAgICAgICAgICAgIElvU3RhdHVzQmxvY2s7Ci0gICAgRklMRV9TVEFOREFSRF9JTkZPUk1BVElPTiAgIEZpbGVJbmZvcm1hdGlvbjsKLSAgICBGSUxFX1BPU0lUSU9OX0lORk9STUFUSU9OICAgRmlsZVBvc2l0aW9uOwotICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICBrZXJuZWxGaWxlbmFtZVtQTV9NQVhfUEFUSCs1XTsKLSAgICBGSUxFICAgICAgICAgICAgICAgICAgICAgICAgKmY7Ci0KLSAgICAvKiBBZGQgcHJlZml4IGZvciBhZGRyZXNzaW5nIHRoZSBmaWxlIHN5c3RlbS4gIlw/P1wiIGlzIHNob3J0IGZvciAiXERvc0RldmljZXNcIiAqLwotICAgIHN0cmNweShrZXJuZWxGaWxlbmFtZSwgIlxcPz9cXCIpOwotICAgIHN0cmNhdChrZXJuZWxGaWxlbmFtZSwgZmlsZW5hbWUpOwotICAgIGlmICgoZiA9IFBNX21hbGxvYyhzaXplb2YoRklMRSkpKSA9PSBOVUxMKQotCWdvdG8gRXJyb3I7Ci0gICAgZi0+b2Zmc2V0ID0gMDsKLSAgICBmLT50ZXh0ID0gKG1vZGVbMV0gPT0gJ3QnIHx8IG1vZGVbMl0gPT0gJ3QnKTsKLSAgICBmLT53cml0ZW1vZGUgPSAobW9kZVswXSA9PSAndycpIHx8IChtb2RlWzBdID09ICdhJyk7Ci0gICAgaWYgKG1vZGVbMF0gPT0gJ3InKSB7Ci0JLyogb21vZGUgPSBPUEVOX0FDQ0VTU19SRUFET05MWSB8IE9QRU5fU0hBUkVfQ09NUEFUSUJMRTsgKi8KLQkvKiBhY3Rpb24gPSBBQ1RJT05fSUZFWElTVFNfT1BFTiB8IEFDVElPTl9JRk5PVEVYSVNUU19GQUlMOyAqLwotCURlc2lyZWRBY2Nlc3MgPSBHRU5FUklDX1JFQUQ7Ci0JU2hhcmVBY2Nlc3MgPSBGSUxFX1NIQVJFX1JFQUQgfCBGSUxFX1NIQVJFX1dSSVRFOwotCUNyZWF0ZURpc3Bvc2l0aW9uID0gRklMRV9PUEVOOwotCX0KLSAgICBlbHNlIGlmIChtb2RlWzBdID09ICd3JykgewotCS8qIG9tb2RlID0gT1BFTl9BQ0NFU1NfV1JJVEVPTkxZIHwgT1BFTl9TSEFSRV9DT01QQVRJQkxFOyAqLwotCS8qIGFjdGlvbiA9IEFDVElPTl9JRkVYSVNUU19UUlVOQ0FURSB8IEFDVElPTl9JRk5PVEVYSVNUU19DUkVBVEU7ICovCi0JRGVzaXJlZEFjY2VzcyA9IEdFTkVSSUNfV1JJVEU7Ci0JU2hhcmVBY2Nlc3MgPSBGSUxFX1NIQVJFX1JFQUQgfCBGSUxFX1NIQVJFX1dSSVRFOwotCUNyZWF0ZURpc3Bvc2l0aW9uID0gRklMRV9TVVBFUlNFREU7Ci0JfQotICAgIGVsc2UgewotCS8qIG9tb2RlID0gT1BFTl9BQ0NFU1NfUkVBRFdSSVRFIHwgT1BFTl9TSEFSRV9DT01QQVRJQkxFOyAqLwotCS8qIGFjdGlvbiA9IEFDVElPTl9JRkVYSVNUU19PUEVOIHwgQUNUSU9OX0lGTk9URVhJU1RTX0NSRUFURTsgKi8KLQlEZXNpcmVkQWNjZXNzID0gR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklURTsKLQlTaGFyZUFjY2VzcyA9IEZJTEVfU0hBUkVfUkVBRDsKLQlDcmVhdGVEaXNwb3NpdGlvbiA9IEZJTEVfT1BFTl9JRjsKLQl9Ci0KLSAgICAvKiBDb252ZXJ0IGZpbGVuYW1lIHN0cmluZyB0byBhbnNpIHN0cmluZyBhbmQgdGhlbiB0byBVbmlDb2RlIHN0cmluZyAqLwotICAgIGlmICgodW5pRmlsZSA9IF9QTV9DU3RyaW5nVG9Vbmljb2RlU3RyaW5nKGtlcm5lbEZpbGVuYW1lKSkgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLQotICAgIC8qIENyZWF0ZSB0aGUgZmlsZSAqLwotICAgIEluaXRpYWxpemVPYmplY3RBdHRyaWJ1dGVzICgmT2JqZWN0QXR0cmlidXRlcywKLQkJCQl1bmlGaWxlLAotCQkJCU9CSl9DQVNFX0lOU0VOU0lUSVZFLAotCQkJCU5VTEwsCi0JCQkJTlVMTCk7Ci0gICAgc3RhdHVzID0gWndDcmVhdGVGaWxlKCAmRmlsZUhhbmRsZSwKLQkJCSAgICBEZXNpcmVkQWNjZXNzIHwgU1lOQ0hST05JWkUsCi0JCQkgICAgJk9iamVjdEF0dHJpYnV0ZXMsCi0JCQkgICAgJklvU3RhdHVzQmxvY2ssCi0JCQkgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgLyogQWxsb2NhdGlvblNpemUgIE9QVElPTkFMLCAqLwotCQkJICAgIEZJTEVfQVRUUklCVVRFX05PUk1BTCwKLQkJCSAgICBTaGFyZUFjY2VzcywKLQkJCSAgICBDcmVhdGVEaXNwb3NpdGlvbiwKLQkJCSAgICBGSUxFX1JBTkRPTV9BQ0NFU1MsICAgICAvKiBDcmVhdGVPcHRpb25zLCAqLwotCQkJICAgIE5VTEwsICAgICAgICAgICAgICAgICAgIC8qIEVhQnVmZmVyICBPUFRJT05BTCwgKi8KLQkJCSAgICAwICAgICAgICAgICAgICAgICAgICAgICAvKiBFYUxlbmd0aCAocmVxdWlyZWQgaWYgRWFCdWZmZXIpICovCi0JCQkgICAgKTsKLSAgICBpZiAoIU5UX1NVQ0NFU1MgKHN0YXR1cykpCi0JZ290byBFcnJvcjsKLSAgICBmLT5oYW5kbGUgPSAoaW50KUZpbGVIYW5kbGU7Ci0KLSAgICAvKiBEZXRlcm1pbmUgc2l6ZSBvZiB0aGUgZmlsZSAqLwotICAgIHN0YXR1cyA9IFp3UXVlcnlJbmZvcm1hdGlvbkZpbGUoICBGaWxlSGFuZGxlLAotCQkJCSAgICAgICZJb1N0YXR1c0Jsb2NrLAotCQkJCSAgICAgICZGaWxlSW5mb3JtYXRpb24sCi0JCQkJICAgICAgc2l6ZW9mKEZJTEVfU1RBTkRBUkRfSU5GT1JNQVRJT04pLAotCQkJCSAgICAgIEZpbGVTdGFuZGFyZEluZm9ybWF0aW9uCi0JCQkJICAgICAgKTsKLSAgICBpZiAoIU5UX1NVQ0NFU1MgKHN0YXR1cykpCi0JZ290byBFcnJvcjsKLSAgICBmLT5maWxlc2l6ZSA9IEZpbGVJbmZvcm1hdGlvbi5FbmRPZkZpbGUuTG93UGFydDsKLQotICAgIC8qIE1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBpZiB3ZSBhcmUgYXBwZW5kaW5nICovCi0gICAgaWYgKG1vZGVbMF0gPT0gJ2EnKSB7Ci0JRmlsZVBvc2l0aW9uLkN1cnJlbnRCeXRlT2Zmc2V0LkhpZ2hQYXJ0ID0gMDsKLQlGaWxlUG9zaXRpb24uQ3VycmVudEJ5dGVPZmZzZXQuTG93UGFydCA9IGYtPmZpbGVzaXplOwotCXN0YXR1cyA9IFp3U2V0SW5mb3JtYXRpb25GaWxlKCAgRmlsZUhhbmRsZSwKLQkJCQkJJklvU3RhdHVzQmxvY2ssCi0JCQkJCSZGaWxlUG9zaXRpb24sCi0JCQkJCXNpemVvZihGSUxFX1BPU0lUSU9OX0lORk9STUFUSU9OKSwKLQkJCQkJRmlsZVBvc2l0aW9uSW5mb3JtYXRpb24KLQkJCQkJKTsKLQlpZiAoIU5UX1NVQ0NFU1MgKHN0YXR1cykpCi0JICAgIGdvdG8gRXJyb3I7Ci0JfQotICAgIHJldHVybiBmOwotCi1FcnJvcjoKLSAgICBpZiAoZikgUE1fZnJlZShmKTsKLSAgICBpZiAodW5pRmlsZSkgX1BNX0ZyZWVVbmljb2RlU3RyaW5nKHVuaUZpbGUpOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5UIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZyZWFkIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXNpemVfdCBmcmVhZCgKLSAgICB2b2lkICpwdHIsCi0gICAgc2l6ZV90IHNpemUsCi0gICAgc2l6ZV90IG4sCi0gICAgRklMRSAqZikKLXsKLSAgICBOVFNUQVRVUyAgICAgICAgc3RhdHVzOwotICAgIElPX1NUQVRVU19CTE9DSyBJb1N0YXR1c0Jsb2NrOwotICAgIExBUkdFX0lOVEVHRVIgICBCeXRlT2Zmc2V0OwotCi0gICAgLyogUmVhZCBhbnkgZXh0cmEgYnl0ZXMgZnJvbSB0aGUgZmlsZSAqLwotICAgIEJ5dGVPZmZzZXQuSGlnaFBhcnQgPSAwOwotICAgIEJ5dGVPZmZzZXQuTG93UGFydCA9IGYtPm9mZnNldDsKLSAgICBzdGF0dXMgPSBad1JlYWRGaWxlKCAoSEFORExFKWYtPmhhbmRsZSwKLQkJCSBOVUxMLCAgICAgICAgICAgICAgLypJTiBIQU5ETEUgIEV2ZW50ICBPUFRJT05BTCwgKi8KLQkJCSBOVUxMLCAgICAgICAgICAgICAgLyogIElOIFBJT19BUENfUk9VVElORSAgQXBjUm91dGluZSAgT1BUSU9OQUwsICovCi0JCQkgTlVMTCwgICAgICAgICAgICAgIC8qICBJTiBQVk9JRCAgQXBjQ29udGV4dCAgT1BUSU9OQUwsICovCi0JCQkgJklvU3RhdHVzQmxvY2ssCi0JCQkgcHRyLCAgICAgICAgICAgICAgIC8qICBPVVQgUFZPSUQgIEJ1ZmZlciwgKi8KLQkJCSBzaXplICogbiwgICAgICAgICAgLypJTiBVTE9ORyAgTGVuZ3RoLCAqLwotCQkJICZCeXRlT2Zmc2V0LCAgICAgICAvKk9QVElPTkFMLCAqLwotCQkJIE5VTEwgICAgICAgICAgICAgICAvKklOIFBVTE9ORyAgS2V5ICBPUFRJT05BTCAqLwotCQkJICk7Ci0gICAgaWYgKCFOVF9TVUNDRVNTIChzdGF0dXMpKQotCXJldHVybiAwOwotICAgIGYtPm9mZnNldCArPSBJb1N0YXR1c0Jsb2NrLkluZm9ybWF0aW9uOwotICAgIHJldHVybiBJb1N0YXR1c0Jsb2NrLkluZm9ybWF0aW9uIC8gc2l6ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1OVCBkcml2ZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmd3JpdGUgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc2l6ZV90IGZ3cml0ZSgKLSAgICBjb25zdCB2b2lkICpwdHIsCi0gICAgc2l6ZV90IHNpemUsCi0gICAgc2l6ZV90IG4sCi0gICAgRklMRSAqZikKLXsKLSAgICBOVFNUQVRVUyAgICAgICAgc3RhdHVzOwotICAgIElPX1NUQVRVU19CTE9DSyBJb1N0YXR1c0Jsb2NrOwotICAgIExBUkdFX0lOVEVHRVIgICBCeXRlT2Zmc2V0OwotCi0gICAgaWYgKCFmLT53cml0ZW1vZGUpCi0JcmV0dXJuIDA7Ci0gICAgQnl0ZU9mZnNldC5IaWdoUGFydCA9IDA7Ci0gICAgQnl0ZU9mZnNldC5Mb3dQYXJ0ID0gZi0+b2Zmc2V0OwotICAgIHN0YXR1cyA9IFp3V3JpdGVGaWxlKCAoSEFORExFKWYtPmhhbmRsZSwKLQkJCSAgTlVMTCwgICAgICAgICAgICAgLypJTiBIQU5ETEUgIEV2ZW50ICBPUFRJT05BTCwgKi8KLQkJCSAgTlVMTCwgICAgICAgICAgICAgLyogIElOIFBJT19BUENfUk9VVElORSAgQXBjUm91dGluZSAgT1BUSU9OQUwsICovCi0JCQkgIE5VTEwsICAgICAgICAgICAgIC8qICBJTiBQVk9JRCAgQXBjQ29udGV4dCAgT1BUSU9OQUwsICovCi0JCQkgICZJb1N0YXR1c0Jsb2NrLAotCQkJICAodm9pZCopcHRyLCAgICAgICAvKiAgT1VUIFBWT0lEICBCdWZmZXIsICovCi0JCQkgIHNpemUgKiBuLCAgICAgICAgIC8qSU4gVUxPTkcgIExlbmd0aCwgKi8KLQkJCSAgJkJ5dGVPZmZzZXQsICAgICAgLypPUFRJT05BTCwgKi8KLQkJCSAgTlVMTCAgICAgICAgICAgICAgLypJTiBQVUxPTkcgIEtleSAgT1BUSU9OQUwgKi8KLQkJCSAgKTsKLSAgICBpZiAoIU5UX1NVQ0NFU1MgKHN0YXR1cykpCi0JcmV0dXJuIDA7Ci0gICAgZi0+b2Zmc2V0ICs9IElvU3RhdHVzQmxvY2suSW5mb3JtYXRpb247Ci0gICAgaWYgKGYtPm9mZnNldCA+IGYtPmZpbGVzaXplKQotCWYtPmZpbGVzaXplID0gZi0+b2Zmc2V0OwotICAgIHJldHVybiBJb1N0YXR1c0Jsb2NrLkluZm9ybWF0aW9uIC8gc2l6ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1OVCBkcml2ZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmZmx1c2ggZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGZmbHVzaCgKLSAgICBGSUxFICpmKQotewotICAgIC8qIE5vdGhpbmcgdG8gZG8gaGVyZSBhcyB3ZSBhcmUgbm90IGRvaW5nIGJ1ZmZlcmVkIEkvTyAqLwotICAgICh2b2lkKWY7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTlQgZHJpdmVyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZnNlZWsgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGZzZWVrKAotICAgIEZJTEUgKmYsCi0gICAgbG9uZyBpbnQgb2Zmc2V0LAotICAgIGludCB3aGVuY2UpCi17Ci0gICAgTlRTVEFUVVMgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLSAgICBGSUxFX1BPU0lUSU9OX0lORk9STUFUSU9OICAgRmlsZVBvc2l0aW9uOwotICAgIElPX1NUQVRVU19CTE9DSyAgICAgICAgICAgICBJb1N0YXR1c0Jsb2NrOwotCi0gICAgaWYgKHdoZW5jZSA9PSAwKQotCWYtPm9mZnNldCA9IG9mZnNldDsKLSAgICBlbHNlIGlmICh3aGVuY2UgPT0gMSkKLQlmLT5vZmZzZXQgKz0gb2Zmc2V0OwotICAgIGVsc2UgaWYgKHdoZW5jZSA9PSAyKQotCWYtPm9mZnNldCA9IGYtPmZpbGVzaXplICsgb2Zmc2V0OwotICAgIEZpbGVQb3NpdGlvbi5DdXJyZW50Qnl0ZU9mZnNldC5IaWdoUGFydCA9IDA7Ci0gICAgRmlsZVBvc2l0aW9uLkN1cnJlbnRCeXRlT2Zmc2V0Lkxvd1BhcnQgPSBmLT5vZmZzZXQ7Ci0gICAgc3RhdHVzID0gWndTZXRJbmZvcm1hdGlvbkZpbGUoIChIQU5ETEUpZi0+aGFuZGxlLAotCQkJCSAgICZJb1N0YXR1c0Jsb2NrLAotCQkJCSAgICZGaWxlUG9zaXRpb24sCi0JCQkJICAgc2l6ZW9mKEZJTEVfUE9TSVRJT05fSU5GT1JNQVRJT04pLAotCQkJCSAgIEZpbGVQb3NpdGlvbkluZm9ybWF0aW9uCi0JCQkJICAgKTsKLSAgICBpZiAoIU5UX1NVQ0NFU1MgKHN0YXR1cykpCi0JcmV0dXJuIC0xOwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5UIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZ0ZWxsIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWxvbmcgZnRlbGwoCi0gICAgRklMRSAqZikKLXsKLSAgICByZXR1cm4gZi0+b2Zmc2V0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU5UIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZlb2YgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGZlb2YoCi0gICAgRklMRSAqZikKLXsKLSAgICByZXR1cm4gKGYtPm9mZnNldCA9PSBmLT5maWxlc2l6ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTlQgZHJpdmVyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZmdldHMgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2hhciAqZmdldHMoCi0gICAgY2hhciAqcywKLSAgICBpbnQgbiwKLSAgICBGSUxFICpmKQotewotICAgIGludCAgICAgbGVuOwotICAgIGNoYXIgICAgKmNzOwotCi0gICAgLyogUmVhZCB0aGUgZW50aXJlIGJ1ZmZlciBpbnRvIG1lbW9yeSAob3VyIGZ1bmN0aW9ucyBhcmUgdW5idWZmZXJlZCEpICovCi0gICAgaWYgKChsZW4gPSBmcmVhZChzLDEsbixmKSkgPT0gMCkKLQlyZXR1cm4gTlVMTDsKLQotICAgIC8qIFNlYXJjaCBmb3IgJ1xuJyBvciBlbmQgb2Ygc3RyaW5nICovCi0gICAgaWYgKG4gPiBsZW4pCi0JbiA9IGxlbjsKLSAgICBjcyA9IHM7Ci0gICAgd2hpbGUgKC0tbiA+IDApIHsKLQlpZiAoKmNzID09ICdcbicpCi0JICAgIGJyZWFrOwotCWNzKys7Ci0JfQotICAgICpjcyA9ICdcMCc7Ci0gICAgcmV0dXJuIHM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTlQgZHJpdmVyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZnB1dHMgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGZwdXRzKAotICAgIGNvbnN0IGNoYXIgKnMsCi0gICAgRklMRSAqZikKLXsKLSAgICByZXR1cm4gZndyaXRlKHMsMSxzdHJsZW4ocyksZik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTlQgZHJpdmVyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZmNsb3NlIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBmY2xvc2UoCi0gICAgRklMRSAqZikKLXsKLSAgICBad0Nsb3NlKChIQU5ETEUpZi0+aGFuZGxlKTsKLSAgICBQTV9mcmVlKGYpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvc3RkbGliLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9zdGRsaWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJmMGNiZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9udGRydi9zdGRsaWIuYworKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgV2luZG93cyBOVCBkcml2ZXIKLSoKLSogRGVzY3JpcHRpb246ICBDIGxpYnJhcnkgY29tcGF0aWJsZSBzdGRsaWIuaCBmdW5jdGlvbnMgZm9yIHVzZSB3aXRoaW4gYQotKiAgICAgICAgICAgICAgIFdpbmRvd3MgTlQgZHJpdmVyLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAib3NoZHIuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFpbiBDb2RlIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1QTV9tYWxsb2Mgb3ZlcnJpZGUgZnVuY3Rpb24gZm9yIE51Y2xldXMgZHJpdmVycyBsb2FkZWQgaW4gTlQgZHJpdmVycydzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBtYWxsb2MoCi0gICAgc2l6ZV90IHNpemUpCi17Ci0gICAgcmV0dXJuIFBNX21hbGxvY1NoYXJlZChzaXplKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1jYWxsb2MgbGlicmFyeSBmdW5jdGlvbiBmb3IgTnVjbGV1cyBkcml2ZXJzIGxvYWRlZCBpbiBOVCBkcml2ZXJzJ3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIGNhbGxvYygKLSAgICBzaXplX3QgbmVsZW0sCi0gICAgc2l6ZV90IHNpemUpCi17Ci0gICAgdm9pZCAqcCA9IFBNX21hbGxvY1NoYXJlZChuZWxlbSAqIHNpemUpOwotICAgIGlmIChwKQotCW1lbXNldChwLDAsbmVsZW0gKiBzaXplKTsKLSAgICByZXR1cm4gcDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1QTV9yZWFsbG9jIG92ZXJyaWRlIGZ1bmN0aW9uIGZvciBOdWNsZXVzIGRyaXZlcnMgbG9hZGVkIGluIFZ4RCdzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiByZWFsbG9jKAotICAgIHZvaWQgKnB0ciwKLSAgICBzaXplX3Qgc2l6ZSkKLXsKLSAgICB2b2lkICpwID0gUE1fbWFsbG9jU2hhcmVkKHNpemUpOwotICAgIGlmIChwKSB7Ci0JbWVtY3B5KHAscHRyLHNpemUpOwotCVBNX2ZyZWVTaGFyZWQocHRyKTsKLQl9Ci0gICAgcmV0dXJuIHA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUE1fZnJlZSBvdmVycmlkZSBmdW5jdGlvbiBmb3IgTnVjbGV1cyBkcml2ZXJzIGxvYWRlZCBpbiBWeEQncy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGZyZWUoCi0gICAgdm9pZCAqcCkKLXsKLSAgICBQTV9mcmVlU2hhcmVkKHApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWNzdHIgICAgLSBDIHN0eWxlIEFOU0kgc3RyaW5nIHRvIGNvbnZlcnQKLQotUkVUVVJOUzoKLVBvaW50ZXIgdG8gdGhlIFVuaUNvZGUgc3RyaW5nIHN0cnVjdHVyZSBvciBOVUxMIG9uIGZhaWx1cmUgdG8gYWxsb2NhdGUgbWVtb3J5Ci0KLVJFTUFSS1M6Ci1Db252ZXJ0cyBhIEMgc3R5bGUgc3RyaW5nIHRvIGEgVW5pQ29kZSBzdHJpbmcgc3RydWN0dXJlIHRoYXQgY2FuIGJlIHBhc3NlZAotZGlyZWN0bHkgdG8gTlQga2VybmVsIGZ1bmN0aW9ucy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1VTklDT0RFX1NUUklORyAqX1BNX0NTdHJpbmdUb1VuaWNvZGVTdHJpbmcoCi0gICAgY29uc3QgY2hhciAqY3N0cikKLXsKLSAgICBpbnQgICAgICAgICAgICAgbGVuZ3RoOwotICAgIEFOU0lfU1RSSU5HICAgICBhbnNpU3RyOwotICAgIFVOSUNPREVfU1RSSU5HICAqdW5pU3RyOwotCi0gICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc3RyaW5nIHN0cnVjdHVyZSAqLwotICAgIGlmICgodW5pU3RyID0gRXhBbGxvY2F0ZVBvb2woTm9uUGFnZWRQb29sLCBzaXplb2YoVU5JQ09ERV9TVFJJTkcpKSkgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLQotICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHdpZGUgc3RyaW5nIGl0c2VsZiAqLwotICAgIGxlbmd0aCA9IChzdHJsZW4oY3N0cikgKiBzaXplb2YoV0NIQVIpKSArIHNpemVvZihXQ0hBUik7Ci0gICAgaWYgKCh1bmlTdHItPkJ1ZmZlciA9IEV4QWxsb2NhdGVQb29sKE5vblBhZ2VkUG9vbCwgbGVuZ3RoKSkgPT0gTlVMTCkgewotCUV4RnJlZVBvb2wodW5pU3RyKTsKLQlyZXR1cm4gTlVMTDsKLQl9Ci0gICAgUnRsWmVyb01lbW9yeSh1bmlTdHItPkJ1ZmZlciwgbGVuZ3RoKTsKLSAgICB1bmlTdHItPkxlbmd0aCA9IDA7Ci0gICAgdW5pU3RyLT5NYXhpbXVtTGVuZ3RoID0gKFVTSE9SVClsZW5ndGg7Ci0KLSAgICAvKiBDb252ZXJ0IGZpbGVuYW1lIHN0cmluZyB0byBhbnNpIHN0cmluZyBhbmQgdGhlbiB0byBVbmlDb2RlIHN0cmluZyAqLwotICAgIFJ0bEluaXRBbnNpU3RyaW5nKCZhbnNpU3RyLCBjc3RyKTsKLSAgICBSdGxBbnNpU3RyaW5nVG9Vbmljb2RlU3RyaW5nKHVuaVN0ciwgJmFuc2lTdHIsIEZBTFNFKTsKLSAgICByZXR1cm4gdW5pU3RyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXVuaVN0ciAgLSBVbmlDb2RlIHN0cmluZyBzdHJ1Y3R1cmUgdG8gZnJlZQotCi1SRU1BUktTOgotRnJlZXMgYSBzdHJpbmcgYWxsb2NhdGVkIGJ5IHRoZSBhYm92ZSBfUE1fQ1N0cmluZ1RvVW5pY29kZVN0cmluZyBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9QTV9GcmVlVW5pY29kZVN0cmluZygKLSAgICBVTklDT0RFX1NUUklORyAqdW5pU3RyKQotewotICAgIGlmICh1bmlTdHIpIHsKLQlFeEZyZWVQb29sKHVuaVN0ci0+QnVmZmVyKTsKLQlFeEZyZWVQb29sKHVuaVN0cik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvdmZsYXQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L3ZmbGF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMWNlMWMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvdmZsYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIER1bW15IG1vZHVsZTsgbm8gdmlydHVhbCBmcmFtZWJ1ZmZlciBmb3IgdGhpcyBPUwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0KLWlib29sIFBNQVBJIFZGX2F2YWlsYWJsZSh2b2lkKQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCAqIFBNQVBJIFZGX2luaXQodWxvbmcgYmFzZUFkZHIsaW50IGJhbmtTaXplLGludCBjb2RlTGVuLHZvaWQgKmJhbmtGdW5jKQotewotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFZGX2V4aXQodm9pZCkKLXsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL250ZHJ2L3p0aW1lci5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvenRpbWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YzRiZDQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vbnRkcnYvenRpbWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IFdpbmRvd3MgVnhECi0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBaZW4gVGltZXIgZnVuY3Rpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIENQVV9sYXJnZUludGVnZXIgY291bnRGcmVxOwotc3RhdGljIHVsb25nICAgICAgICAgICAgc3RhcnQsZmluaXNoOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIFplbiBUaW1lciBtb2R1bGUgaW50ZXJuYWxzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9fWlRpbWVySW5pdCh2b2lkKQotewotICAgIEtlUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoKExBUkdFX0lOVEVHRVIqKSZjb3VudEZyZXEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX19MWlRpbWVyT24oCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0gICAgTEFSR0VfSU5URUdFUiBsdCA9IEtlUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoTlVMTCk7Ci0gICAgdG0tPnN0YXJ0LmxvdyA9IGx0Lkxvd1BhcnQ7Ci0gICAgdG0tPnN0YXJ0LmhpZ2ggPSBsdC5IaWdoUGFydDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfX0xaVGltZXJMYXAoCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0gICAgTEFSR0VfSU5URUdFUiAgICAgICB0bUxhcCA9IEtlUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoTlVMTCk7Ci0gICAgQ1BVX2xhcmdlSW50ZWdlciAgICB0bUNvdW50OwotCi0gICAgX0NQVV9kaWZmVGltZTY0KCZ0bS0+c3RhcnQsKENQVV9sYXJnZUludGVnZXIqKSZ0bUxhcCwmdG1Db3VudCk7Ci0gICAgcmV0dXJuIF9DUFVfY2FsY01pY3JvU2VjKCZ0bUNvdW50LGNvdW50RnJlcS5sb3cpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX19MWlRpbWVyT2ZmKAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotICAgIExBUkdFX0lOVEVHRVIgbHQgPSBLZVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKE5VTEwpOwotICAgIHRtLT5lbmQubG93ID0gbHQuTG93UGFydDsKLSAgICB0bS0+ZW5kLmhpZ2ggPSBsdC5IaWdoUGFydDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfX0xaVGltZXJDb3VudCgKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSAgICBDUFVfbGFyZ2VJbnRlZ2VyICAgIHRtQ291bnQ7Ci0KLSAgICBfQ1BVX2RpZmZUaW1lNjQoJnRtLT5zdGFydCwmdG0tPmVuZCwmdG1Db3VudCk7Ci0gICAgcmV0dXJuIF9DUFVfY2FsY01pY3JvU2VjKCZ0bUNvdW50LGNvdW50RnJlcS5sb3cpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURlZmluZSB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgbG9uZyBwZXJpb2QgdGltZXIgYXMgbWljcm9zZWNvbmRzIHBlciB0aW1lciB0aWNrLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgVUxaVElNRVJfUkVTT0xVVElPTiAgICAgMQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIExvbmcgUGVyaW9kIHRpbWVyIHZhbHVlIGZyb20gdGhlIEJJT1MgdGltZXIgdGljay4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX19VTFpSZWFkVGltZSh2b2lkKQotewotICAgIExBUkdFX0lOVEVHRVIgY291bnQ7Ci0gICAgS2VRdWVyeVN5c3RlbVRpbWUoJmNvdW50KTsKLSAgICByZXR1cm4gKHVsb25nKSgqKChfaW50NjQqKSZjb3VudCkgLyAxMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29tcHV0ZSB0aGUgZWxhcHNlZCB0aW1lIGZyb20gdGhlIEJJT1MgdGltZXIgdGljay4gTm90ZSB0aGF0IHdlIGNoZWNrIHRvIHNlZQotd2hldGhlciBhIG1pZG5pZ2h0IGJvdW5kYXJ5IGhhcyBwYXNzZWQsIGFuZCBpZiBzbyBhZGp1c3QgdGhlIGZpbmlzaCB0aW1lIHRvCi1hY2NvdW50IGZvciB0aGlzLiBXZSBjYW5ub3QgZGV0ZWN0IGlmIG1vcmUgdGhhdCBvbmUgbWlkbmlnaHQgYm91bmRhcnkgaGFzCi1wYXNzZWQsIHNvIGlmIHRoaXMgaGFwcGVucyB3ZSB3aWxsIGJlIGdlbmVyYXRpbmcgZXJyb25vdXMgcmVzdWx0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfX1VMWkVsYXBzZWRUaW1lKHVsb25nIHN0YXJ0LHVsb25nIGZpbmlzaCkKLXsgcmV0dXJuIGZpbmlzaCAtIHN0YXJ0OyB9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczIvX3Btb3MyLmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi9fcG1vczIuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjFmMGY0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi9fcG1vczIuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KgotOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLTsqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi07KiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLTsqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotOyoKLTsqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi07KiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotOyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi07KiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyoKLTsqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqCi07KiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogTGFuZ3VhZ2U6ICAgIDgwMzg2IEFzc2VtYmxlciwgVEFTTSA0LjAgb3IgTkFTTQotOyogRW52aXJvbm1lbnQ6IE9TLzIgMzIgYml0IHByb3RlY3RlZCBtb2RlCi07KgotOyogRGVzY3JpcHRpb246IExvdyBsZXZlbCBhc3NlbWJseSBzdXBwb3J0IGZvciB0aGUgUE0gbGlicmFyeSBzcGVjaWZpYwotOyogICAgICAgICAgICAgIHRvIE9TLzIKLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIElERUFMCi0KLWluY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcwotCi1oZWFkZXIgICAgICBfcG1vczIgICAgICAgICAgICAgICAgICA7IFNldCB1cCBtZW1vcnkgbW9kZWwKLQotYmVnZGF0YXNlZyAgX3Btb3MyCi0KLSAgICAgICAgY2dsb2JhbCBfUE1faW9lbnRyeQotICAgICAgICBjZ2xvYmFsIF9QTV9nZHQKLV9QTV9pb2VudHJ5ICAgICBkZCAgMCAgICAgICAgICAgICAgIDsgT2Zmc2V0IHRvIGNhbGwgZ2F0ZQotX1BNX2dkdCAgICAgICAgIGR3ICAwICAgICAgICAgICAgICAgOyBTZWxlY3RvciB0byBjYWxsIGdhdGUKLQotZW5kZGF0YXNlZyAgX3Btb3MyCi0KLWJlZ2NvZGVzZWcgIF9wbW9zMiAgICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBQTV9zZXRJT1BMKGludCBpb3BsKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ2hhbmdlIHRoZSBJT1BMIGxldmVsIGZvciB0aGUgMzItYml0IHRhc2suIFJldHVybnMgdGhlIHByZXZpb3VzIGxldmVsCi07IHNvIGl0IGNhbiBiZSByZXN0b3JlZCBmb3IgdGhlIHRhc2sgY29ycmVjdGx5LgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX3NldElPUEwKLQotICAgICAgICBBUkcgICAgIGlvcGw6VUlOVAotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgICAgIDsgU2F2ZSB0aGUgb2xkIEVGTEFHUyBmb3IgbGF0ZXIKLSAgICAgICAgbW92ICAgICBlY3gsW2lvcGxdICAgICAgICAgIDsgRUNYIDo9IElPUEwgbGV2ZWwKLSAgICAgICAgeG9yICAgICBlYngsZWJ4ICAgICAgICAgICAgIDsgQ2hhbmdlIElPUEwgbGV2ZWwgZnVuY3Rpb24gY29kZSAoMCkKLWlmZGVmICAgVVNFX05BU00KLSAgICAgICAgY2FsbCBmYXIgZHdvcmQgW19QTV9pb2VudHJ5XQotZWxzZQotICAgICAgICBjYWxsICAgIFtGV09SRCBfUE1faW9lbnRyeV0KLWVuZGlmCi0gICAgICAgIHBvcCAgICAgZWF4Ci0gICAgICAgIGFuZCAgICAgZWF4LDAwMTEwMDAwMDAwMDAwMDBiCi0gICAgICAgIHNociAgICAgZWF4LDEyCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgX1BNX3NldEdEVFNlbExpbWl0KHVzaG9ydCBzZWxlY3RvciwgdWxvbmcgbGltaXQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ2hhbmdlIHRoZSBHRFQgc2VsZWN0b3IgbGltaXQgdG8gZ2l2ZW4gdmFsdWUuIFVzZWQgdG8gY2hhbmdlIHNlbGVjdG9yCi07IGxpbWl0cyB0byBhZGRyZXNzIHRoZSBlbnRpcmUgc3lzdGVtIGFkZHJlc3Mgc3BhY2UuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX3NldEdEVFNlbExpbWl0Ci0KLSAgICAgICAgQVJHICAgICBzZWxlY3RvcjpVU0hPUlQsIGxpbWl0OlVJTlQKLSAgICAgICAgCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgc3ViICAgICBlc3AsMjAgICAgICAgICAgICAgIDsgTWFrZSByb29tIGZvciBzZWxlY3RvciBkYXRhIG9uIHN0YWNrCi0gICAgICAgIG1vdiAgICAgZWN4LGVzcCAgICAgICAgICAgICA7IEVDWCA6PSBzZWxlY3RvciBkYXRhIHN0cnVjdHVyZQotICAgICAgICBtb3YgICAgIGJ4LFtzZWxlY3Rvcl0gICAgICAgOyBGaWxsIG91dCB0aGUgZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgYW5kICAgICBieCwwRkZGOGggICAgICAgICAgIDsgS2ljayBvdXQgdGhlIExEVC9HRFQgYW5kIERQTCBiaXRzICAgICAKLSAgICAgICAgbW92ICAgICBbV09SRCBlY3hdLGJ4Ci0gICAgICAgIG1vdiAgICAgZWJ4LFtsaW1pdF0KLSAgICAgICAgbW92ICAgICBbRFdPUkQgZWN4KzRdLGVieAotICAgICAgICBtb3YgICAgIGVieCw1ICAgICAgICAgICAgICAgOyBTZXQgR0RUIHNlbGVjdG9yIGxpbWl0IGZ1bmN0aW9uIGNvZGUgICAgICAKLWlmZGVmICAgVVNFX05BU00KLSAgICAgICAgY2FsbCBmYXIgZHdvcmQgW19QTV9pb2VudHJ5XQotZWxzZQotICAgICAgICBjYWxsICAgIFtGV09SRCBfUE1faW9lbnRyeV0KLWVuZGlmCi0gICAgICAgIGFkZCAgICAgZXNwLDIwCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kICAgIAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1Y2hhciBfTVRSUl9nZXRDeDg2KHVjaGFyIHJlZyk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZWFkIGEgQ3lyaXggQ1BVIGluZGV4ZWQgcmVnaXN0ZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfTVRSUl9nZXRDeDg2Ci0KLSAgICAgICAgQVJHICAgICByZWc6VUNIQVIKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIG1vdiAgICAgYWwsW3JlZ10KLSAgICAgICAgb3V0ICAgICAyMmgsYWwKLSAgICAgICAgaW4gICAgICBhbCwyM2gKLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWNoYXIgX01UUlJfc2V0Q3g4Nih1Y2hhciByZWcsdWNoYXIgdmFsKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFdyaXRlIGEgQ3lyaXggQ1BVIGluZGV4ZWQgcmVnaXN0ZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfTVRSUl9zZXRDeDg2Ci0KLSAgICAgICAgQVJHICAgICByZWc6VUNIQVIsIHZhbDpVQ0hBUgotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgbW92ICAgICBhbCxbcmVnXQotICAgICAgICBvdXQgICAgIDIyaCxhbAotICAgICAgICBtb3YgICAgIGFsLFt2YWxdCi0gICAgICAgIG91dCAgICAgMjNoLGFsCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVsb25nIF9NVFJSX2Rpc2FibGVJbnQodm9pZCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZXR1cm4gcHJvY2Vzc29yIGludGVycnVwdCBzdGF0dXMgYW5kIGRpc2FibGUgaW50ZXJydXB0cy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfTVRSUl9kaXNhYmxlSW50Ci0KLTsgRG8gbm90aGluZyEKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgX01UUlJfcmVzdG9yZUludCh1bG9uZyBwcyk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZXN0b3JlIHByb2Nlc3NvciBpbnRlcnJ1cHQgc3RhdHVzLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9NVFJSX3Jlc3RvcmVJbnQKLQotOyBEbyBub3RoaW5nIQotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBEZWJ1Z0ludCh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIERlYnVnSW50Ci0KLSAgICAgICAgaW50ICAgICAzCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi1lbmRjb2Rlc2VnICBfcG1vczIKLQotICAgICAgICBFTkQgICAgICAgICAgICAgICAgICAgICAgICAgOyBFbmQgb2YgbW9kdWxlCi0gICAgICAgIApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL2NwdWluZm8uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi9jcHVpbmZvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZTQwMGQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL2NwdWluZm8uYworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIE9TLzIKLSoKLSogRGVzY3JpcHRpb246ICBPUy8yIHNwZWNpZmljIGNvZGUgZm9yIHRoZSBDUFUgZGV0ZWN0aW9uIG1vZHVsZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVE9ETzogVGhpcyBzaG91bGQgYmUgaW1wbGVtZW50ZWQgZm9yIE9TLzIhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBTZXRNYXhUaHJlYWRQcmlvcml0eSgpICAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVE9ETzogVGhpcyBzaG91bGQgYmUgaW1wbGVtZW50ZWQgZm9yIE9TLzIhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBSZXN0b3JlVGhyZWFkUHJpb3JpdHkoaSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGZyZXF1ZW5jeSBvZiB0aGUgY291bnRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBHZXRDb3VudGVyRnJlcXVlbmN5KAotICAgIENQVV9sYXJnZUludGVnZXIgKmZyZXEpCi17Ci0gICAgZnJlcS0+bG93ID0gMTAwMDAwOwotICAgIGZyZXEtPmhpZ2ggPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgY291bnRlciB2YWx1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEdldENvdW50ZXIodCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBVTE9ORyAgIGNvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRG9zUXVlcnlTeXNJbmZvKCBRU1ZfTVNfQ09VTlQsIFFTVl9NU19DT1VOVCwgJmNvdW50LCBzaXplb2YoVUxPTkcpICk7ICAgXAotICAgICh0KS0+bG93ID0gY291bnQgKiAxMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAodCktPmhpZ2ggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczIvZXZlbnQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi9ldmVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWNjMTliLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi9ldmVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIElCTSBQQyAoT1MvMikKLSoKLSogRGVzY3JpcHRpb246ICBPUy8yIGltcGxlbWVudGF0aW9uIGZvciB0aGUgU2NpVGVjaCBjcm9zcyBwbGF0Zm9ybQotKiAgICAgICAgICAgICAgIGV2ZW50IGxpYnJhcnkuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBEZWZpbmUgZ2VuZXJvdXMga2V5Ym9hcmQgbW9uaXRvciBjaXJjdWxhciBidWZmZXIgc2l6ZSB0byBtaW5pbWl6ZQotICogdGhlIGRhbmdlciBvZiBsb3Npbmcga2V5c3Ryb2tlcwotICovCi0jZGVmaW5lIEtFWUJVRlNJWkUgIChFVkVOVFFTSVpFICsgMTApCi0KLXN0YXRpYyBpbnQgICAgICBvbGRNb3VzZVN0YXRlOyAgICAgICAgICAvKiBPbGQgbW91c2Ugc3RhdGUgICAgICAgICAgICAgICAqLwotc3RhdGljIHVsb25nICAgIG9sZEtleU1lc3NhZ2U7ICAgICAgICAgIC8qIE9sZCBrZXlib2FyZCBzdGF0ZSAgICAgICAgICAgICovCi1zdGF0aWMgdXNob3J0ICAga2V5VXBNc2dbMjU2XSA9IHswfTsgICAgLyogVGFibGUgb2Yga2V5IHVwIG1lc3NhZ2VzICAgICAgKi8KLXN0YXRpYyBpbnQgICAgICByYW5nZVgscmFuZ2VZOyAgICAgICAgICAvKiBSYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyAgICAqLwotSE1PVSAgICAgICAgICAgIF9FVlRfaE1vdXNlOyAgICAgICAgICAgIC8qIEhhbmRsZSB0byB0aGUgbW91c2UgZHJpdmVyICAgICovCi1ITU9OSVRPUiAgICAgICAgX0VWVF9oS2JkTW9uOyAgICAgICAgICAgLyogSGFuZGxlIHRvIHRoZSBrZXlib2FyZCBkcml2ZXIgKi8KLVRJRCAgICAgICAgICAgICBrYmRNb25USUQgPSAwOyAgICAgICAgICAvKiBLZXlib2FyZCBtb25pdG9yIHRocmVhZCBJRCAgICAqLwotSEVWICAgICAgICAgICAgIGhldlN0YXJ0OyAgICAgICAgICAgICAgIC8qIFN0YXJ0IGV2ZW50IHNlbWFwaG9yZSBoYW5kbGUgICovCi1CT09MICAgICAgICAgICAgYk1vblJ1bm5pbmc7ICAgICAgICAgICAgLyogRmxhZyBzZXQgaWYgbW9uaXRvciB0aHJlYWQgT0sgKi8KLUhNVFggICAgICAgICAgICBobXR4S2V5QnVmOyAgICAgICAgICAgICAvKiBNdXRleCBwcm90ZWN0aW5nIGtleSBidWZmZXIgICAqLwotS0VZUEFDS0VUICAgICAgIGtleU1vblBrdHNbS0VZQlVGU0laRV07IC8qIEFycmF5IG9mIG1vbml0b3Iga2V5IHBhY2tldHMgICovCi1pbnQgICAgICAgICAgICAga3BIZWFkID0gMDsgICAgICAgICAgICAgLyogS2V5IHBhY2tldCBidWZmZXIgaGVhZCAgICAgICAgKi8KLWludCAgICAgICAgICAgICBrcFRhaWwgPSAwOyAgICAgICAgICAgICAvKiBLZXkgcGFja2V0IGJ1ZmZlciB0YWlsICAgICAgICAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBUaGVzZSBhcmUgbm90IHVzZWQgdW5kZXIgT1MvMiAqLwotI2RlZmluZSBfRVZUX2Rpc2FibGVJbnQoKSAgICAgICAxCi0jZGVmaW5lIF9FVlRfcmVzdG9yZUludChmbGFncykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zY2FuQ29kZSAgICAtIFNjYW4gY29kZSB0byB0ZXN0Ci0KLVJFTUFSS1M6Ci1UaGlzIG1hY3JvIGRldGVybWluZXMgaWYgYSBzcGVjaWZpZWQga2V5IGlzIGN1cnJlbnRseSBkb3duIGF0IHRoZQotdGltZSB0aGF0IHRoZSBjYWxsIGlzIG1hZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX2lzS2V5RG93bihzY2FuQ29kZSkgICAgKGtleVVwTXNnW3NjYW5Db2RlXSAhPSAwKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXR1cm4gdGhlIG51bWJlciBvZiB0aWNrcyBzaW5jZSBzeXN0ZW0KLXN0YXJ0dXAgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIHNob3VsZCBiZSB0aGUgc2FtZSB2YWx1ZSB0aGF0IGlzIHBsYWNlZCBpbnRvCi10aGUgdGltZSBzdGFtcCBmaWVsZHMgb2YgZXZlbnRzLCBhbmQgaXMgdXNlZCB0byBpbXBsZW1lbnQgYXV0byBtb3VzZSBkb3duCi1ldmVudHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgX0VWVF9nZXRUaWNrcyh2b2lkKQotewotICAgIFVMT05HICAgY291bnQ7Ci0gICAgRG9zUXVlcnlTeXNJbmZvKCBRU1ZfTVNfQ09VTlQsIFFTVl9NU19DT1VOVCwgJmNvdW50LCBzaXplb2YoVUxPTkcpICk7Ci0gICAgcmV0dXJuIGNvdW50OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNvbnZlcnRzIGEgbWlja2V5IG1vdmVtZW50IHZhbHVlIHRvIGEgcGl4ZWwgYWRqdXN0bWVudCB2YWx1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IE1pY2tleVRvUGl4ZWwoCi0gICAgaW50IG1pY2tleSkKLXsKLSAgICAvKiBUT0RPOiBXZSBjYW4gYWRkIHNvbWUgY29kZSBpbiBoZXJlIHRvIGhhbmRsZSAnYWNjZWxlcmF0aW9uJyBmb3IgKi8KLSAgICAvKiAgICAgICB0aGUgbW91c2UgY3Vyc29yLiBGb3Igbm93IGp1c3QgdXNlIHRoZSBtaWNrZXlzLiAqLwotICAgIHJldHVybiBtaWNrZXk7Ci19Ci0KLS8qIFNvbWUgdXNlZnVsIGRlZmluZXMgYW55IHR5cGVkZWZzIHVzZWQgaW4gdGhlIGtleWJvYXJkIGhhbmRsaW5nICovCi0jZGVmaW5lIEtFWV9SRUxFQVNFICAgICAgICAgICAgIDB4NDAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1QdW1wcyBhbGwgbWVzc2FnZXMgaW4gdGhlIG1lc3NhZ2UgcXVldWUgZnJvbSBPUy8yIGludG8gb3VyIGV2ZW50IHF1ZXVlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9FVlRfcHVtcE1lc3NhZ2VzKHZvaWQpCi17Ci0gICAgS0JESU5GTyAgICAgICAgIGtleUluZm87ICAgICAgICAvKiBNdXN0IG5vdCBjcm9zcyBhIDY0SyBib3VuZGFyeSAqLwotICAgIEtCREtFWUlORk8gICAgICBrZXk7ICAgICAgICAgICAgLyogTXVzdCBub3QgY3Jvc3MgYSA2NEsgYm91bmRhcnkgKi8KLSAgICBNT1VRVUVJTkZPICAgICAgbXF1ZXVlOyAgICAgICAgIC8qIE11c3Qgbm90IGNyb3NzIGEgNjRLIGJvdW5kYXJ5ICovCi0gICAgTU9VRVZFTlRJTkZPICAgIG1vdXNlOyAgICAgICAgICAvKiBNdXN0IG5vdCBjcm9zcyBhIDY0SyBib3VuZGFyeSAqLwotICAgIHVzaG9ydCAgICAgICAgICBtV2FpdDsgICAgICAgICAgLyogTXVzdCBub3QgY3Jvc3MgYSA2NEsgYm91bmRhcnkgKi8KLSAgICBLRVlQQUNLRVQgICAgICAga3A7ICAgICAgICAgICAgIC8qIE11c3Qgbm90IGNyb3NzIGEgNjRLIGJvdW5kYXJ5ICovCi0gICAgZXZlbnRfdCAgICAgICAgIGV2dDsKLSAgICBpbnQgICAgICAgICAgICAgc2NhbjsKLSAgICBpYm9vbCAgICAgICAgICAgbm9JbnB1dCA9IFRSVUU7IC8qIEZsYWcgdG8gZGV0ZXJtaW5lIGlmIGFueSBpbnB1dCB3YXMgYXZhaWxhYmxlICovCi0KLSAgICAvKiBGaXJzdCBvZiBhbGwsIGNoZWNrIGlmIHdlIHNob3VsZCBkbyBhbnkgc2Vzc2lvbiBzd2l0Y2ggd29yayAqLwotICAgIF9fUE1fY2hlY2tDb25zb2xlU3dpdGNoKCk7Ci0KLSAgICAvKiBQdW1wIGFsbCBrZXlib2FyZCBtZXNzYWdlcyBmcm9tIG91ciBjaXJjdWxhciBidWZmZXIgKi8KLSAgICBmb3IgKDs7KSB7Ci0JLyogQ2hlY2sgdGhhdCB0aGUgbW9uaXRvciB0aHJlYWQgaXMgc3RpbGwgcnVubmluZyAqLwotCWlmICghYk1vblJ1bm5pbmcpCi0JICAgIFBNX2ZhdGFsRXJyb3IoIktleWJvYXJkIG1vbml0b3IgdGhyZWFkIGRpZWQhIik7Ci0KLQkvKiBQcm90ZWN0IGtleXBhY2tldCBidWZmZXIgd2l0aCBtdXRleCAqLwotCURvc1JlcXVlc3RNdXRleFNlbShobXR4S2V5QnVmLCBTRU1fSU5ERUZJTklURV9XQUlUKTsKLQlpZiAoa3BIZWFkID09IGtwVGFpbCkgewotCSAgICBEb3NSZWxlYXNlTXV0ZXhTZW0oaG10eEtleUJ1Zik7Ci0JICAgIGJyZWFrOwotCSAgICB9Ci0KLQlub0lucHV0ID0gRkFMU0U7Ci0KLQkvKiBSZWFkIHBhY2tldCBmcm9tIGNpcmN1bGFyIGJ1ZmZlciBhbmQgcmVtb3ZlIGl0ICovCi0JbWVtY3B5KCZrcCwgJmtleU1vblBrdHNba3BUYWlsXSwgc2l6ZW9mKEtFWVBBQ0tFVCkpOwotCWlmICgrK2twVGFpbCA9PSBLRVlCVUZTSVpFKQotCSAgICBrcFRhaWwgPSAwOwotCURvc1JlbGVhc2VNdXRleFNlbShobXR4S2V5QnVmKTsKLQotCS8qIENvbXBlbnNhdGUgZm9yIHRoZSAweEUwIGNoYXJhY3RlciAqLwotCWlmIChrcC5YbGF0ZWRTY2FuICYmIGtwLlhsYXRlZENoYXIgPT0gMHhFMCkKLQkgICAga3AuWGxhdGVkQ2hhciA9IDA7Ci0KLQkvKiBEZXRlcm1pbmUgdHlwZSBvZiBrZXlib2FyZCBldmVudCAqLwotCW1lbXNldCgmZXZ0LDAsc2l6ZW9mKGV2dCkpOwotCWlmIChrcC5LYmREREZsYWdXb3JkICYgS0VZX1JFTEVBU0UpCi0JICAgIGV2dC53aGF0ID0gRVZUX0tFWVVQOwotCWVsc2UKLQkgICAgZXZ0LndoYXQgPSBFVlRfS0VZRE9XTjsKLQotCS8qIENvbnZlcnQga2V5Ym9hcmQgY29kZXMgKi8KLQlzY2FuID0ga3AuTW9uRmxhZ1dvcmQgPj4gODsKLQlpZiAoZXZ0LndoYXQgPT0gRVZUX0tFWVVQKSB7Ci0JICAgIC8qIEdldCBtZXNzYWdlIGZvciBrZXl1cCBjb2RlIGZyb20gdGFibGUgb2YgY2FjaGVkIGRvd24gdmFsdWVzICovCi0JICAgIGV2dC5tZXNzYWdlID0ga2V5VXBNc2dbc2Nhbl07Ci0JICAgIGtleVVwTXNnW3NjYW5dID0gMDsKLQkgICAgb2xkS2V5TWVzc2FnZSA9IC0xOwotCSAgICB9Ci0JZWxzZSB7Ci0JICAgIGV2dC5tZXNzYWdlID0gKCh1bG9uZylzY2FuIDw8IDgpIHwga3AuWGxhdGVkQ2hhcjsKLQkgICAgaWYgKGV2dC5tZXNzYWdlID09IGtleVVwTXNnW3NjYW5dKSB7Ci0JCWV2dC53aGF0ID0gRVZUX0tFWVJFUEVBVDsKLQkJZXZ0Lm1lc3NhZ2UgfD0gMHgxMDAwMDsKLQkJfQotCSAgICBvbGRLZXlNZXNzYWdlID0gZXZ0Lm1lc3NhZ2UgJiAweDBGRkZGOwotCSAgICBrZXlVcE1zZ1tzY2FuXSA9ICh1c2hvcnQpZXZ0Lm1lc3NhZ2U7Ci0JICAgIH0KLQotCSAvKiBDb252ZXJ0IHNoaWZ0IHN0YXRlIG1vZGlmaWVycyAqLwotCSBpZiAoa3AudS5TaGlmdFN0YXRlICYgMHgwMDAxKQotCSAgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfUklHSFRTSElGVDsKLQkgaWYgKGtwLnUuU2hpZnRTdGF0ZSAmIDB4MDAwMikKLQkgICAgIGV2dC5tb2RpZmllcnMgfD0gRVZUX0xFRlRTSElGVDsKLQkgaWYgKGtwLnUuU2hpZnRTdGF0ZSAmIDB4MDEwMCkKLQkgICAgIGV2dC5tb2RpZmllcnMgfD0gRVZUX0xFRlRDVFJMOwotCSBpZiAoa3AudS5TaGlmdFN0YXRlICYgMHgwMjAwKQotCSAgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfTEVGVEFMVDsKLQkgaWYgKGtwLnUuU2hpZnRTdGF0ZSAmIDB4MDQwMCkKLQkgICAgIGV2dC5tb2RpZmllcnMgfD0gRVZUX1JJR0hUQ1RSTDsKLQkgaWYgKGtwLnUuU2hpZnRTdGF0ZSAmIDB4MDgwMCkKLQkgICAgIGV2dC5tb2RpZmllcnMgfD0gRVZUX1JJR0hUQUxUOwotCSBFVlQub2xkTW92ZSA9IC0xOwotCi0JIC8qIEFkZCB0aW1lIHN0YW1wIGFuZCBhZGQgdGhlIGV2ZW50IHRvIHRoZSBxdWV1ZSAqLwotCSBldnQud2hlbiA9IGtleS50aW1lOwotCSBpZiAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkKLQkgICAgIGFkZEV2ZW50KCZldnQpOwotCSB9Ci0KLSAgICAvKiBEb24ndCBqdXN0IGZsdXNoIGJlY2F1c2UgdGhhdCB0ZXJtaW5hbGx5IGNvbmZ1c2VzIHRoZSBtb25pdG9yICovCi0gICAgZG8gewotCUtiZENoYXJJbigma2V5LCBJT19OT1dBSVQsIDApOwotCX0gd2hpbGUgKGtleS5mYlN0YXR1cyAmIEtCRFRSRl9GSU5BTF9DSEFSX0lOKTsKLQotICAgIC8qIFB1bXAgYWxsIG1vdXNlIG1lc3NhZ2VzICovCi0gICAgS2JkR2V0U3RhdHVzKCZrZXlJbmZvLDApOwotICAgIC8qIENoZWNrIHJldHVybiBjb2RlIC0gbW91c2UgbWF5IG5vdCBiZSBvcGVyYXRpb25hbCEhICovCi0gICAgaWYgKE1vdUdldE51bVF1ZUVsKCZtcXVldWUsX0VWVF9oTW91c2UpID09IE5PX0VSUk9SKSB7Ci0Jd2hpbGUgKG1xdWV1ZS5jRXZlbnRzKSB7Ci0JICAgIHdoaWxlIChtcXVldWUuY0V2ZW50cy0tKSB7Ci0JCW1lbXNldCgmZXZ0LDAsc2l6ZW9mKGV2dCkpOwotCQltV2FpdCA9IE1PVV9OT1dBSVQ7Ci0JCU1vdVJlYWRFdmVudFF1ZSgmbW91c2UsJm1XYWl0LF9FVlRfaE1vdXNlKTsKLQotCQkvKiBVcGRhdGUgdGhlIG1vdXNlIHBvc2l0aW9uLiBXZSBnZXQgdGhlIG1vdXNlIGNvb3JkaW5hdGVzCi0JCSAqIGluIG1pY2tleXMgc28gd2UgaGF2ZSB0byB0cmFuc2xhdGUgdGhlc2UgaW50byBwaXhlbHMgYW5kCi0JCSAqIG1vdmUgb3VyIG1vdXNlIHBvc2l0aW9uLiBJZiB3ZSBkb24ndCBkbyB0aGlzLCBPUy8yIGdpdmVzCi0JCSAqIHVzIHRoZSBjb29yZGluYXRlcyBpbiBjaGFyYWN0ZXIgcG9zaXRpb25zIHNpbmNlIGl0IHN0aWxsCi0JCSAqIHRoaW5rcyB3ZSBhcmUgaW4gdGV4dCBtb2RlIQotCQkgKi8KLQkJRVZULm14ICs9IE1pY2tleVRvUGl4ZWwobW91c2UuY29sKTsKLQkJRVZULm15ICs9IE1pY2tleVRvUGl4ZWwobW91c2Uucm93KTsKLQkJaWYgKEVWVC5teCA8IDApIEVWVC5teCA9IDA7Ci0JCWlmIChFVlQubXkgPCAwKSBFVlQubXkgPSAwOwotCQlpZiAoRVZULm14ID4gcmFuZ2VYKSAgICBFVlQubXggPSByYW5nZVg7Ci0JCWlmIChFVlQubXkgPiByYW5nZVkpICAgIEVWVC5teSA9IHJhbmdlWTsKLQkJZXZ0LndoZXJlX3ggPSBFVlQubXg7Ci0JCWV2dC53aGVyZV95ID0gRVZULm15OwotCQlldnQucmVsYXRpdmVfeCA9IG1vdXNlLmNvbDsKLQkJZXZ0LnJlbGF0aXZlX3kgPSBtb3VzZS5yb3c7Ci0JCWV2dC53aGVuID0ga2V5LnRpbWU7Ci0JCWlmIChtb3VzZS5mcyAmIChNT1VTRV9CTjFfRE9XTiB8IE1PVVNFX01PVElPTl9XSVRIX0JOMV9ET1dOKSkKLQkJICAgIGV2dC5tb2RpZmllcnMgfD0gRVZUX0xFRlRCVVQ7Ci0JCWlmIChtb3VzZS5mcyAmIChNT1VTRV9CTjJfRE9XTiB8IE1PVVNFX01PVElPTl9XSVRIX0JOMl9ET1dOKSkKLQkJICAgIGV2dC5tb2RpZmllcnMgfD0gRVZUX1JJR0hUQlVUOwotCQlpZiAobW91c2UuZnMgJiAoTU9VU0VfQk4zX0RPV04gfCBNT1VTRV9NT1RJT05fV0lUSF9CTjNfRE9XTikpCi0JCSAgICBldnQubW9kaWZpZXJzIHw9IEVWVF9NSURETEVCVVQ7Ci0JCWlmIChrZXlJbmZvLmZzU3RhdGUgJiAweDAwMDEpCi0JCSAgICBldnQubW9kaWZpZXJzIHw9IEVWVF9SSUdIVFNISUZUOwotCQlpZiAoa2V5SW5mby5mc1N0YXRlICYgMHgwMDAyKQotCQkgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfTEVGVFNISUZUOwotCQlpZiAoa2V5SW5mby5mc1N0YXRlICYgMHgwMTAwKQotCQkgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfTEVGVENUUkw7Ci0JCWlmIChrZXlJbmZvLmZzU3RhdGUgJiAweDAyMDApCi0JCSAgICBldnQubW9kaWZpZXJzIHw9IEVWVF9MRUZUQUxUOwotCQlpZiAoa2V5SW5mby5mc1N0YXRlICYgMHgwNDAwKQotCQkgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfUklHSFRDVFJMOwotCQlpZiAoa2V5SW5mby5mc1N0YXRlICYgMHgwODAwKQotCQkgICAgZXZ0Lm1vZGlmaWVycyB8PSBFVlRfUklHSFRBTFQ7Ci0KLQkJLyogQ2hlY2sgZm9yIGxlZnQgbW91c2UgY2xpY2sgZXZlbnRzICovCi0JCS8qIDB4MDYgPT0gKE1PVVNFX0JOMV9ET1dOIHwgTU9VU0VfTU9USU9OX1dJVEhfQk4xX0RPV04pICovCi0JCWlmICgoKG1vdXNlLmZzICYgMHgwMDA2KSAmJiAhKG9sZE1vdXNlU3RhdGUgJiAweDAwMDYpKQotCQkJfHwgKCEobW91c2UuZnMgJiAweDAwMDYpICYmIChvbGRNb3VzZVN0YXRlICYgMHgwMDA2KSkpIHsKLQkJICAgIGlmIChtb3VzZS5mcyAmIDB4MDAwNikKLQkJCWV2dC53aGF0ID0gRVZUX01PVVNFRE9XTjsKLQkJICAgIGVsc2UKLQkJCWV2dC53aGF0ID0gRVZUX01PVVNFVVA7Ci0JCSAgICBldnQubWVzc2FnZSA9IEVWVF9MRUZUQk1BU0s7Ci0JCSAgICBFVlQub2xkTW92ZSA9IC0xOwotCQkgICAgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpCi0JCQlhZGRFdmVudCgmZXZ0KTsKLQkJICAgIH0KLQotCQkvKiBDaGVjayBmb3IgcmlnaHQgbW91c2UgY2xpY2sgZXZlbnRzICovCi0JCS8qIDB4MDAxOCA9PSAoTU9VU0VfQk4yX0RPV04gfCBNT1VTRV9NT1RJT05fV0lUSF9CTjJfRE9XTikgKi8KLQkJaWYgKCgobW91c2UuZnMgJiAweDAwMTgpICYmICEob2xkTW91c2VTdGF0ZSAmIDB4MDAxOCkpCi0JCQl8fCAoIShtb3VzZS5mcyAmIDB4MDAxOCkgJiYgKG9sZE1vdXNlU3RhdGUgJiAweDAwMTgpKSkgewotCQkgICAgaWYgKG1vdXNlLmZzICYgMHgwMDE4KQotCQkJZXZ0LndoYXQgPSBFVlRfTU9VU0VET1dOOwotCQkgICAgZWxzZQotCQkJZXZ0LndoYXQgPSBFVlRfTU9VU0VVUDsKLQkJICAgIGV2dC5tZXNzYWdlID0gRVZUX1JJR0hUQk1BU0s7Ci0JCSAgICBFVlQub2xkTW92ZSA9IC0xOwotCQkgICAgaWYgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpCi0JCQlhZGRFdmVudCgmZXZ0KTsKLQkJICAgIH0KLQotCQkvKiBDaGVjayBmb3IgbWlkZGxlIG1vdXNlIGNsaWNrIGV2ZW50cyAqLwotCQkvKiAweDAwNjAgPT0gKE1PVVNFX0JOM19ET1dOIHwgTU9VU0VfTU9USU9OX1dJVEhfQk4zX0RPV04pICovCi0JCWlmICgoKG1vdXNlLmZzICYgMHgwMDYwKSAmJiAhKG9sZE1vdXNlU3RhdGUgJiAweDAwNjApKQotCQkJfHwgKCEobW91c2UuZnMgJiAweDAwNjApICYmIChvbGRNb3VzZVN0YXRlICYgMHgwMDYwKSkpIHsKLQkJICAgIGlmIChtb3VzZS5mcyAmIDB4MDA2MCkKLQkJCWV2dC53aGF0ID0gRVZUX01PVVNFRE9XTjsKLQkJICAgIGVsc2UKLQkJCWV2dC53aGF0ID0gRVZUX01PVVNFVVA7Ci0JCSAgICBldnQubWVzc2FnZSA9IEVWVF9NSURETEVCTUFTSzsKLQkJICAgIEVWVC5vbGRNb3ZlID0gLTE7Ci0JCSAgICBpZiAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkKLQkJCWFkZEV2ZW50KCZldnQpOwotCQkgICAgfQotCi0JCS8qIENoZWNrIGZvciBtb3VzZSBtb3ZlbWVudCBldmVudCAqLwotCQlpZiAobW91c2UuZnMgJiAweDAwMkIpIHsKLQkJICAgIGV2dC53aGF0ID0gRVZUX01PVVNFTU9WRTsKLQkJICAgIGlmIChFVlQub2xkTW92ZSAhPSAtMSkgewotCQkJRVZULmV2dHFbRVZULm9sZE1vdmVdLndoZXJlX3ggPSBldnQud2hlcmVfeDsvKiBNb2RpZnkgZXhpc3Rpbmcgb25lICAqLwotCQkJRVZULmV2dHFbRVZULm9sZE1vdmVdLndoZXJlX3kgPSBldnQud2hlcmVfeTsKLQkJCX0KLQkJICAgIGVsc2UgewotCQkJRVZULm9sZE1vdmUgPSBFVlQuZnJlZUhlYWQ7IC8qIFNhdmUgaWQgb2YgdGhpcyBtb3ZlIGV2ZW50ICAgKi8KLQkJCWlmIChFVlQuY291bnQgPCBFVkVOVFFTSVpFKQotCQkJICAgIGFkZEV2ZW50KCZldnQpOwotCQkJfQotCQkgICAgfQotCi0JCS8qIFNhdmUgY3VycmVudCBtb3VzZSBzdGF0ZSAqLwotCQlvbGRNb3VzZVN0YXRlID0gbW91c2UuZnM7Ci0JCX0KLQkgICAgTW91R2V0TnVtUXVlRWwoJm1xdWV1ZSxfRVZUX2hNb3VzZSk7Ci0JICAgIH0KLQkgICAgbm9JbnB1dCA9IEZBTFNFOwotCX0KLQotICAgIC8qIElmIHRoZXJlIHdhcyBubyBpbnB1dCBhdmFpbGFibGUsIGdpdmUgdXAgdGhlIGN1cnJlbnQgdGltZXNsaWNlCi0gICAgICogTm90ZTogRG9zU2xlZXAoMCkgd2lsbCBlZmZlY3RpdmVseSBkbyBub3RoaW5nIGlmIG5vIG90aGVyIHRocmVhZCBpcyByZWFkeS4gSGVuY2UKLSAgICAgKiBEb3NTbGVlcCgwKSB3aWxsIHN0aWxsIHVzZSAxMDAlIENQVSBfYnV0XyBzaG91bGQgbm90IGludGVyZmVyZSB3aXRoIG90aGVyIHByb2dyYW1zLgotICAgICAqLwotICAgIGlmIChub0lucHV0KQotCURvc1NsZWVwKDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgbWFjcm8vZnVuY3Rpb24gaXMgdXNlZCB0byBjb252ZXJ0cyB0aGUgc2NhbiBjb2RlcyByZXBvcnRlZCBieSB0aGUKLWtleWJvYXJkIHRvIG91ciBldmVudCBsaWJyYXJpZXMgbm9ybWFsaXNlZCBmb3JtYXQuIFdlIG9ubHkgaGF2ZSBvbmUgc2NhbgotY29kZSBmb3IgdGhlICdBJyBrZXksIGFuZCB1c2Ugc2hpZnQgbW9kaWZpZXJzIHRvIGRldGVybWluZSBpZiBpdCBpcyBhCi1DdHJsLUYxLCBBbHQtRjEgZXRjLiBUaGUgcmF3IHNjYW4gY29kZXMgZnJvbSB0aGUga2V5Ym9hcmQgd29yayB0aGlzIHdheSwKLWJ1dCB0aGUgT1MgZ2l2ZXMgdXMgJ2Nvb2tlZCcgc2NhbiBjb2Rlcywgd2UgaGF2ZSB0byB0cmFuc2xhdGUgdGhlbSBiYWNrCi10byB0aGUgcmF3IGZvcm1hdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9FVlRfbWFza0tleUNvZGUoZXZ0KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUtleWJvYXJkIG1vbml0b3IgdGhyZWFkLiBOZWVkZWQgdG8gY2F0Y2ggYm90aCBrZXl1cCBhbmQga2V5ZG93biBldmVudHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX2tiZE1vblRocmVhZCgKLSAgICB2b2lkICpwYXJhbXMpCi17Ci0gICAgQVBJUkVUICAgICAgIHJjOwotICAgIEtFWVBBQ0tFVCAgICBrcDsKLSAgICBVU0hPUlQgICAgICAgY291bnQgPSBzaXplb2YoS0VZUEFDS0VUKTsKLSAgICBNT05CVUYgICAgICAgbW9uSW5idWY7Ci0gICAgTU9OQlVGICAgICAgIG1vbk91dGJ1ZjsKLSAgICBpbnQgICAgICAgICAga3BOZXc7Ci0KLSAgICAvKiBSYWlzZSB0aHJlYWQgcHJpb3JpdHkgZm9yIGhpZ2hlciByZXNwb25zaXZlbmVzcyAqLwotICAgIERvc1NldFByaW9yaXR5KFBSVFlTX1RIUkVBRCwgUFJUWUNfVElNRUNSSVRJQ0FMLCAwLCAwKTsKLSAgICBtb25JbmJ1Zi5jYiAgPSBzaXplb2YobW9uSW5idWYpIC0gc2l6ZW9mKG1vbkluYnVmLmNiKTsKLSAgICBtb25PdXRidWYuY2IgPSBzaXplb2YobW9uT3V0YnVmKSAtIHNpemVvZihtb25PdXRidWYuY2IpOwotICAgIGJNb25SdW5uaW5nID0gRkFMU0U7Ci0KLSAgICAvKiBSZWdpc3RlciB0aGUgYnVmZmVycyB0byBiZSB1c2VkIGZvciBtb25pdG9yaW5nIGZvciBjdXJyZW50IHNlc3Npb24gKi8KLSAgICBpZiAoRG9zTW9uUmVnKF9FVlRfaEtiZE1vbiwgJm1vbkluYnVmLCAoVUxPTkcqKSZtb25PdXRidWYsTU9OSVRPUl9FTkQsIC0xKSkgewotCURvc1Bvc3RFdmVudFNlbShoZXZTdGFydCk7ICAvKiB1bmJsb2NrIHRoZSBtYWluIHRocmVhZCAqLwotCXJldHVybjsKLQl9Ci0KLSAgICAvKiBVbmJsb2NrIHRoZSBtYWluIHRocmVhZCBhbmQgdGVsbCBpdCB3ZSdyZSBPSyovCi0gICAgYk1vblJ1bm5pbmcgPSBUUlVFOwotICAgIERvc1Bvc3RFdmVudFNlbShoZXZTdGFydCk7Ci0gICAgd2hpbGUgKGJNb25SdW5uaW5nKSB7ICAvKiBTdGFydCBhbiBlbmRsZXNzIGxvb3AgKi8KLQkvKiBSZWFkIGRhdGEgZnJvbSBrZXlib2FyZCBkcml2ZXIgKi8KLQlyYyA9IERvc01vblJlYWQoKFBCWVRFKSZtb25JbmJ1ZiwgSU9fV0FJVCwgKFBCWVRFKSZrcCwgKFBVU0hPUlQpJmNvdW50KTsKLQlpZiAocmMpIHsKLSNpZmRlZiBDSEVDS0VECi0JICAgIGlmIChiTW9uUnVubmluZykKLQkJcHJpbnRmKCJFcnJvciBpbiBEb3NNb25SZWFkLCByYyA9ICVsZFxuIiwgcmMpOwotI2VuZGlmCi0JICAgIGJNb25SdW5uaW5nID0gRkFMU0U7Ci0JICAgIHJldHVybjsKLQkgICAgfQotCi0JLyogUGFzcyBGTFVTSCBwYWNrZXRzIGltbWVkaWF0ZWx5ICovCi0JaWYgKGtwLk1vbkZsYWdXb3JkICYgNCkgewotI2lmZGVmIENIRUNLRUQKLQkgICAgcHJpbnRmKCJGbHVzaCBwYWNrZXQhXG4iKTsKLSNlbmRpZgotCSAgICBEb3NNb25Xcml0ZSgoUEJZVEUpJm1vbk91dGJ1ZiwgKFBCWVRFKSZrcCwgY291bnQpOwotCSAgICBjb250aW51ZTsKLQkgICAgfQotCi0JLypUT0RPOiB0byBiZSByZW1vdmVkICovCi0JLyogU2tpcCBleHRlbmRlZCBzY2FuY29kZXMgJiBzb21lIG90aGVycyAqLwotCWlmICgoKGtwLk1vbkZsYWdXb3JkID4+IDgpID09IDB4RTApIHx8ICgoa3AuS2JkRERGbGFnV29yZCAmIDB4MEYpID09IDB4MEYpKSB7Ci0JICAgIERvc01vbldyaXRlKChQQllURSkmbW9uT3V0YnVmLCAoUEJZVEUpJmtwLCBjb3VudCk7Ci0JICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLS8qICAgICAgcHJpbnRmKCJSYXdTY2FuID0gJVgsIFhsYXRlZFNjYW4gPSAlWCwgZmJTdGF0dXMgPSAlWCwgS2JkRERGbGFncyA9ICVYXG4iLCAqLwotLyogICAgICAgICAga3AuTW9uRmxhZ1dvcmQgPj4gOCwga3AuWGxhdGVkU2Nhbiwga3AudS5TaGlmdFN0YXRlLCBrcC5LYmREREZsYWdXb3JkKTsgKi8KLQotCS8qIFByb3RlY3QgYWNjZXNzIHRvIGJ1ZmZlciB3aXRoIG11dGV4IHNlbWFwaG9yZSAqLwotCXJjID0gRG9zUmVxdWVzdE11dGV4U2VtKGhtdHhLZXlCdWYsIDEwMDApOwotCWlmIChyYykgewotI2lmZGVmIENIRUNLRUQKLQkgICAgcHJpbnRmKCJDYW4ndCBnZXQgYWNjZXNzIHRvIG11dGV4LCByYyA9ICVsZFxuIiwgcmMpOwotI2VuZGlmCi0JICAgIGJNb25SdW5uaW5nID0gRkFMU0U7Ci0JICAgIHJldHVybjsKLQkgICAgfQotCi0JLyogU3RvcmUgcGFja2V0IGluIGNpcmN1bGFyIGJ1ZmZlciwgZHJvcCBpdCBpZiBpdCdzIGZ1bGwgKi8KLQlrcE5ldyA9IGtwSGVhZCArIDE7Ci0JaWYgKGtwTmV3ID09IEtFWUJVRlNJWkUpCi0JICAgIGtwTmV3ID0gMDsKLQlpZiAoa3BOZXcgIT0ga3BUYWlsKSB7Ci0JICAgIG1lbWNweSgma2V5TW9uUGt0c1trcEhlYWRdLCAma3AsIHNpemVvZihLRVlQQUNLRVQpKTsKLQkgICAgLyogVE9ETzogZml4IHRoaXMhICovCi0JICAgIC8qIENvbnZlcnQgYnJlYWsgdG8gbWFrZSBjb2RlICovCi0JICAgIGtleU1vblBrdHNba3BIZWFkXS5Nb25GbGFnV29yZCAmPSAweDdGRkY7Ci0JICAgIGtwSGVhZCA9IGtwTmV3OwotCSAgICB9Ci0JRG9zUmVsZWFzZU11dGV4U2VtKGhtdHhLZXlCdWYpOwotCi0JLyogRmluYWxseSB3cml0ZSB0aGUgcGFja2V0ICovCi0JcmMgPSBEb3NNb25Xcml0ZSgoUEJZVEUpJm1vbk91dGJ1ZiwgKFBCWVRFKSZrcCwgY291bnQpOwotCWlmIChyYykgewotI2lmZGVmIENIRUNLRUQKLQkgICAgaWYgKGJNb25SdW5uaW5nKQotCQlwcmludGYoIkVycm9yIGluIERvc01vbldyaXRlLCByYyA9ICVsZFxuIiwgcmMpOwotI2VuZGlmCi0JICAgIGJNb25SdW5uaW5nID0gRkFMU0U7Ci0JICAgIHJldHVybjsKLQkgICAgfQotCX0KLSAgICAodm9pZClwYXJhbXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2FmZWx5IGFib3J0IHRoZSBldmVudCBtb2R1bGUgdXBvbiBjYXRjaGluZyBhIGZhdGFsIGVycm9yLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0VWVF9hYm9ydCgKLSAgICBpbnQgc2lnbmFsKQotewotICAgIEVWVF9leGl0KCk7Ci0gICAgUE1fZmF0YWxFcnJvcigiVW5oYW5kbGVkIGV4Y2VwdGlvbiEiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1tb3VzZU1vdmUgICAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbmV2ZSB0aGUgbW91c2UgbmVlZHMgdG8gYmUgbW92ZWQKLQotUkVNQVJLUzoKLUluaXRpbGlhc2UgdGhlIGV2ZW50IGhhbmRsaW5nIG1vZHVsZS4gSGVyZSB3ZSBpbnN0YWxsIG91ciBtb3VzZSBoYW5kbGluZyBJU1IKLXRvIGJlIGNhbGxlZCB3aGVuZXZlciBhbnkgYnV0dG9uJ3MgYXJlIHByZXNzZWQgb3IgcmVsZWFzZWQuIFdlIGFsc28gYnVpbGQKLXRoZSBmcmVlIGxpc3Qgb2YgZXZlbnRzIGluIHRoZSBldmVudCBxdWV1ZS4KLQotV2UgdXNlIGhhbmRsZXIgbnVtYmVyIDIgb2YgdGhlIG1vdXNlIGxpYnJhcmllcyBpbnRlcnJ1cHQgaGFuZGxlcnMgZm9yIG91cgotZXZlbnQgaGFuZGxpbmcgcm91dGluZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2luaXQoCi0gICAgX0VWVF9tb3VzZU1vdmVIYW5kbGVyIG1vdXNlTW92ZSkKLXsKLSAgICB1c2hvcnQgIHN0YXQ7Ci0KLSAgICAvKiBJbml0aWFsaXNlIHRoZSBldmVudCBxdWV1ZSAqLwotICAgIFBNX2luaXQoKTsKLSAgICBFVlQubW91c2VNb3ZlID0gbW91c2VNb3ZlOwotICAgIGluaXRFdmVudFF1ZXVlKCk7Ci0gICAgb2xkTW91c2VTdGF0ZSA9IDA7Ci0gICAgb2xkS2V5TWVzc2FnZSA9IDA7Ci0gICAgbWVtc2V0KGtleVVwTXNnLDAsc2l6ZW9mKGtleVVwTXNnKSk7Ci0KLSAgICAvKiBPcGVuIHRoZSBtb3VzZSBkcml2ZXIsIGFuZCBzZXQgaXQgdXAgdG8gcmVwb3J0IGV2ZW50cyBpbiBtaWNrZXlzICovCi0gICAgTW91T3BlbihOVUxMLCZfRVZUX2hNb3VzZSk7Ci0gICAgc3RhdCA9IDB4N0Y7Ci0gICAgTW91U2V0RXZlbnRNYXNrKCZzdGF0LF9FVlRfaE1vdXNlKTsKLSAgICBzdGF0ID0gKE1PVV9OT0RSQVcgfCBNT1VfTUlDS0VZUykgPDwgODsKLSAgICBNb3VTZXREZXZTdGF0dXMoJnN0YXQsX0VWVF9oTW91c2UpOwotCi0gICAgLyogT3BlbiB0aGUga2V5Ym9hcmQgbW9uaXRvciAgKi8KLSAgICBpZiAoRG9zTW9uT3BlbigoUFNaKSJLQkQkIiwgJl9FVlRfaEtiZE1vbikpCi0JUE1fZmF0YWxFcnJvcigiVW5hYmxlIHRvIG9wZW4ga2V5Ym9hcmQgbW9uaXRvciEiKTsKLQotICAgIC8qIENyZWF0ZSBldmVudCBzZW1hcGhvcmUsIHRoZSBtb25pdG9yIHdpbGwgcG9zdCBpdCB3aGVuIGl0J3MgaW5pdGFsaXplZCAqLwotICAgIGlmIChEb3NDcmVhdGVFdmVudFNlbShOVUxMLCAmaGV2U3RhcnQsIDAsIEZBTFNFKSkKLQlQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gY3JlYXRlIGV2ZW50IHNlbWFwaG9yZSEiKTsKLQotICAgIC8qIENyZWF0ZSBtdXRleCBzZW1hcGhvcmUgcHJvdGVjdGluZyB0aGUga2V5cGFja2V0IGJ1ZmZlciAqLwotICAgIGlmIChEb3NDcmVhdGVNdXRleFNlbShOVUxMLCAmaG10eEtleUJ1ZiwgMCwgRkFMU0UpKQotCVBNX2ZhdGFsRXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgbXV0ZXggc2VtYXBob3JlISIpOwotCi0gICAgLyogU3RhcnQga2V5Ym9hcmQgbW9uaXRvciB0aHJlYWQsIHVzZSAzMksgc3RhY2sgKi8KLSAgICBrYmRNb25USUQgPSBfYmVnaW50aHJlYWQoX2tiZE1vblRocmVhZCwgTlVMTCwgMHg4MDAwLCBOVUxMKTsKLQotICAgIC8qIE5vdyBibG9jayB1bnRpbCB0aGUgbW9uaXRvciB0aHJlYWQgaXMgdXAgYW5kIHJ1bm5pbmcgKi8KLSAgICAvKiBHaXZlIHRoZSB0aHJlYWQgb25lIHNlY29uZCAqLwotICAgIERvc1dhaXRFdmVudFNlbShoZXZTdGFydCwgMTAwMCk7Ci0gICAgaWYgKCFiTW9uUnVubmluZykgeyAgLyogQ2hlY2sgdGhlIHRocmVhZCBpcyBPSyAqLwotCURvc01vbkNsb3NlKF9FVlRfaEtiZE1vbik7Ci0JUE1fZmF0YWxFcnJvcigiS2V5Ym9hcmQgbW9uaXRvciB0aHJlYWQgZGlkbid0IGluaXRpYWxpemUhIik7Ci0JfQotCi0gICAgLyogQ2F0Y2ggcHJvZ3JhbSB0ZXJtaW5hdGlvbiBzaWduYWxzIHNvIHdlIGNhbiBjbGVhbiB1cCBwcm9wZXJseSAqLwotICAgIHNpZ25hbChTSUdBQlJULCBfRVZUX2Fib3J0KTsKLSAgICBzaWduYWwoU0lHRlBFLCBfRVZUX2Fib3J0KTsKLSAgICBzaWduYWwoU0lHSU5ULCBfRVZUX2Fib3J0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLUNoYW5nZXMgdGhlIHJhbmdlIG9mIGNvb3JkaW5hdGVzIHJldHVybmVkIGJ5IHRoZSBtb3VzZSBmdW5jdGlvbnMgdG8gdGhlCi1zcGVjaWZpZWQgcmFuZ2Ugb2YgdmFsdWVzLiBUaGlzIGlzIHVzZWQgd2hlbiBjaGFuZ2luZyBiZXR3ZWVuIGdyYXBoaWNzCi1tb2RlcyBzZXQgdGhlIHJhbmdlIG9mIG1vdXNlIGNvb3JkaW5hdGVzIGZvciB0aGUgbmV3IGRpc3BsYXkgbW9kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfc2V0TW91c2VSYW5nZSgKLSAgICBpbnQgeFJlcywKLSAgICBpbnQgeVJlcykKLXsKLSAgICByYW5nZVggPSB4UmVzOwotICAgIHJhbmdlWSA9IHlSZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1Nb2RpZmVzIHRoZSBtb3VzZSBjb29yZGluYXRlcyBhcyBuZWNlc3NhcnkgaWYgc2NhbGluZyB0byBPUyBjb29yZGluYXRlcywKLWFuZCBzZXRzIHRoZSBPUyBtb3VzZSBjdXJzb3IgcG9zaXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX3NldE1vdXNlUG9zKHgseSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFpbGlzZXMgdGhlIGludGVybmFsIGV2ZW50IGhhbmRsaW5nIG1vZHVsZXMuIFRoZSBFVlRfc3VzcGVuZCBmdW5jdGlvbgotY2FuIGJlIGNhbGxlZCB0byBzdXNwZW5kIGV2ZW50IGhhbmRsaW5nIChzdWNoIGFzIHdoZW4gc2hlbGxpbmcgb3V0IHRvIERPUyksCi1hbmQgdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgaXQgYWdhaW4gbGF0ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfcmVzdW1lKHZvaWQpCi17Ci0gICAgLyogRG8gbm90aGluZyBmb3IgT1MvMiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotU3VzcGVuZHMgYWxsIG9mIG91ciBldmVudCBoYW5kbGluZyBvcGVyYXRpb25zLiBUaGlzIGlzIGFsc28gdXNlZCB0bwotZGUtaW5zdGFsbCB0aGUgZXZlbnQgaGFuZGxpbmcgY29kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVF9zdXNwZW5kKHZvaWQpCi17Ci0gICAgLyogRG8gbm90aGluZyBmb3IgT1MvMiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotRXhpdHMgdGhlIGV2ZW50IG1vZHVsZSBmb3IgcHJvZ3JhbSB0ZXJtaW5hdGF0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX2V4aXQodm9pZCkKLXsKLSAgICBBUElSRVQgICByYzsKLQotICAgIC8qIFJlc3RvcmUgc2lnbmFsIGhhbmRsZXJzICovCi0gICAgc2lnbmFsKFNJR0FCUlQsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdGUEUsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdJTlQsIFNJR19ERkwpOwotCi0gICAgLyogQ2xvc2UgdGhlIG1vdXNlIGRyaXZlciAqLwotICAgIE1vdUNsb3NlKF9FVlRfaE1vdXNlKTsKLQotICAgIC8qIFN0b3AgdGhlIGtleWJvYXJkIG1vbml0b3IgdGhyZWFkIGFuZCBjbG9zZSB0aGUgbW9uaXRvciAqLwotICAgIGJNb25SdW5uaW5nID0gRkFMU0U7Ci0gICAgcmMgPSBEb3NLaWxsVGhyZWFkKGtiZE1vblRJRCk7Ci0jaWZkZWYgQ0hFQ0tFRAotICAgIGlmIChyYykKLQlwcmludGYoIkRvc0tpbGxUaHJlYWQgZmFpbGVkLCByYyA9ICVsZFxuIiwgcmMpOwotI2VuZGlmCi0gICAgcmMgPSBEb3NNb25DbG9zZShfRVZUX2hLYmRNb24pOwotI2lmZGVmIENIRUNLRUQKLSAgICBpZiAocmMpIHsKLQlwcmludGYoIkRvc01vbkNsb3NlIGZhaWxlZCwgcmMgPSAlbGRcbiIsIHJjKTsKLQl9Ci0jZW5kaWYKLSAgICBEb3NDbG9zZUV2ZW50U2VtKGhldlN0YXJ0KTsKLSAgICBEb3NDbG9zZU11dGV4U2VtKGhtdHhLZXlCdWYpOwotICAgIEtiZEZsdXNoQnVmZmVyKDApOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL21vbi5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL21vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGQzOWZiLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi9tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgT1MvMgotKgotKiBEZXNjcmlwdGlvbjogIEluY2x1ZGUgZmlsZSB0byBpbmNsdWRlIGFsbCBPUy8yIGtleWJvYXJkIG1vbml0b3Igc3R1ZmYuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBNb25pdG9ycyBzdHVmZiAqLwotCi0jZGVmaW5lIE1PTklUT1JfREVGQVVMVCAweDAwMDAKLSNkZWZpbmUgTU9OSVRPUl9CRUdJTiAgICAgICAgMQotI2RlZmluZSBNT05JVE9SX0VORCAgICAgICAgICAyCi0KLXR5cGVkZWYgU0hBTkRMRSAgIEhNT05JVE9SOwotdHlwZWRlZiBITU9OSVRPUiAqUEhNT05JVE9SOwotCi10eXBlZGVmIHN0cnVjdCBfS0VZUEFDS0VUIHsKLSAgVVNIT1JUICBNb25GbGFnV29yZDsKLSAgVUNIQVIgICBYbGF0ZWRDaGFyOwotICBVQ0hBUiAgIFhsYXRlZFNjYW47Ci0gIFVDSEFSICAgREJDU1N0YXR1czsKLSAgVUNIQVIgICBEQkNTU2hpZnQ7Ci0KLSAgdW5pb24KLSAgewotICAgIFVTSE9SVCAgU2hpZnRTdGF0ZTsKLSAgICBVU0hPUlQgIExheWVySW5kZXg7Ci0gIH0gdTsKLQotICBVTE9ORyAgIE1pbGxpc2Vjb25kczsKLSAgVVNIT1JUICBLYmREREZsYWdXb3JkOwotfSBLRVlQQUNLRVQ7Ci0KLXR5cGVkZWYgc3RydWN0IF9NTE5QQUNLRVQgewotICBVU0hPUlQgIE1vbkZsYWdXb3JkOwotICBVU0hPUlQgIElPQ1RMOwotICBVU0hPUlQgIENQSWQ7Ci0gIFVTSE9SVCAgQ1BJbmRleDsKLSAgVUxPTkcgICBSZXNlcnZlZDsKLSAgVVNIT1JUICBLYmREREZsYWdXb3JkOwotfSBNTE5QQUNLRVQ7Ci0KLS8qIERCQ1NTdGF0dXMgKi8KLQotI2RlZmluZSBTRl9TSElGVFMgICAgICAgICAgICAgIDEgIC8qIElmIHNldCB0byAxLCBzaGlmdCBzdGF0dXMgcmV0dXJuZWQgd2l0aG91dCBhIGNoYXJhY3RlciAqLwotI2RlZmluZSBTRl9OT1RDSEFSICAgICAgICAgICAgIDIgIC8qIDAgLSBTY2FuIGNvZGUgaXMgYSBjaGFyYWN0ZXIgKi8KLQkJCQkgIC8qIDEgLSBTY2FuIGNvZGUgaXMgbm90IGEgY2hhcmFjdGVyOyAqLwotCQkJCSAgLyogICAgIGluc3RlYWQgaXQgaXMgYW4gZXh0ZW5kZWQga2V5IGNvZGUgZnJvbSB0aGUga2V5Ym9hcmQuICovCi0jZGVmaW5lIFNGX0lNTUVESUFURSAgICAgICAgICAzMiAgLyogSWYgc2V0IHRvIDEsIGltbWVkaWF0ZSBjb252ZXJzaW9uIHJlcXVlc3RlZCAqLwotI2RlZmluZSBTRl9UWVBFTUFTSyAgICAgICAgICAxOTIgIC8qIEhhcyB0aGUgZm9sbG93aW5nIHZhbHVlczogKi8KLQkJCQkgIC8qIDAwIC0gVW5kZWZpbmVkICovCi0JCQkJICAvKiAwMSAtIEZpbmFsIGNoYXJhY3RlcjsgaW50ZXJpbSBjaGFyYWN0ZXIgZmxhZyBpcyB0dXJuZWQgb2ZmICovCi0JCQkJICAvKiAxMCAtIEludGVyaW0gY2hhcmFjdGVyICovCi0JCQkJICAvKiAxMSAtIEZpbmFsIGNoYXJhY3RlcjsgaW50ZXJpbSBjaGFyYWN0ZXIgZmxhZyBpcyB0dXJuZWQgb24uICovCi0vKiBNb25GbGFnV29yZCAqLwotCi0jZGVmaW5lIE1GX09QRU4gICAgICAgICAgICAgICAgMSAgLyogb3BlbiAqLwotI2RlZmluZSBNRl9DTE9TRSAgICAgICAgICAgICAgIDIgIC8qIGNsb3NlICovCi0jZGVmaW5lIE1GX0ZMVVNIICAgICAgICAgICAgICAgNCAgLyogaXMgZmx1c2ggcGFja2V0ICovCi0KLS8qIEtiZERERmxhZ1dvcmQgKi8KLQotI2RlZmluZSBLRl9OT1RTUVBBQ0tFVCAgICAgIDEwMjQgIC8qIERvbid0IHB1dCB0aGlzIHBhY2tldCBpbiBTUSBidWZmZXIgKi8KLSNkZWZpbmUgS0ZfQUNDRU5URURLRVkgICAgICAgNTEyICAvKiBLZXkgd2FzIHRyYW5zbGF0ZWQgdXNpbmcgcHJldmlvdXMgYWNjZW50LiAqLwotI2RlZmluZSBLRl9NVUxUSU1BS0UgICAgICAgICAyNTYgIC8qIEtleSB3YXMgcmVwZWF0ZWQgbWFrZSBvZiBhIHRvZ2dsZSBrZXkuICovCi0jZGVmaW5lIEtGX1NFQ09OREFSWUtFWSAgICAgIDEyOCAgLyogUHJldmlvdXMgc2NhbiBjb2RlIHdhcyB0aGUgRTAgcHJlZml4IGNvZGUuICovCi0jZGVmaW5lIEtGX0tFWUJSRUFLICAgICAgICAgICA2NCAgLyogVGhpcyBpcyB0aGUgYnJlYWsgb2YgdGhlIGtleS4gKi8KLSNkZWZpbmUgS0ZfS0VZVFlQRU1BU0sgICAgICAgIDYzICAvKiBJc29sYXRlcyB0aGUgS2V5IFR5cGUgZmllbGQgb2YgRERGbGFncy4gKi8KLSNkZWZpbmUgS0ZfVU5ERUZLRVkgICAgICAgICAgIDYzICAvKiBLZXkgcGFja2V0IGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBLRl9TWVNSRVFLRVkgICAgICAgICAgMjMgIC8qIFRoaXMga2V5IHBhY2tldCBpcyB0aGUgU3lzUmVxIGtleSAoNDk5MCkgKi8KLSNkZWZpbmUgS0ZfUFJJTlRGTFVTSEtFWSAgICAgIDIyICAvKiBUaGlzIHBhY2tldCBpcyBDdC1BbHQtUHJ0U2NyICovCi0jZGVmaW5lIEtGX1BTUFJJTlRFQ0hPS0VZICAgICAyMSAgLyogVGhpcyBwYWNrZXQgaXMgQ3RsLVAgKi8KLSNkZWZpbmUgS0ZfUFJJTlRFQ0hPS0VZICAgICAgIDIwICAvKiBUaGlzIHBhY2tldCBpcyBDdGwtUHJ0U2NyICovCi0jZGVmaW5lIEtGX1BSVFNDUktFWSAgICAgICAgICAxOSAgLyogVGhpcyBwYWNrZXQgaXMgUHJ0U2NyICovCi0jZGVmaW5lIEtGX1BTQlJFQUtLRVkgICAgICAgICAxOCAgLyogVGhpcyBwYWNrZXQgaXMgQ3RsLUMgKi8KLSNkZWZpbmUgS0ZfQlJFQUtLRVkgICAgICAgICAgIDE3ICAvKiBUaGlzIHBhY2tldCBpcyBDdGwtQnJlYWsgKi8KLSNkZWZpbmUgS0ZfQUNDRU5US0VZICAgICAgICAgIDE2ICAvKiBUaGlzIHBhY2tldCBpcyBhbiBhY2NlbnQga2V5ICovCi0jZGVmaW5lIEtGX1hST1JQTk9UICAgICAgICAgICAxMyAgLyogVGhpcyBwYWNrZXQgaXMgYSBSZWFkIG9yIFBlZWsgTm90aWZpY2F0aW9uIFBjdC4gKi8KLSNkZWZpbmUgS0ZfTUxOT1RJRklDQVRJT04gICAgIDE0ICAvKiBwYWNrZXQgaXMgYSBNdWx0aS1MYXllciBOTFMgcGFja2V0ICovCi0jZGVmaW5lIEtGX0hPVEtFWVBBQ0tFVCAgICAgICAxMiAgLyogVGhpcyBwYWNrZXQgaXMgdGhlIGhvdCBrZXkuICovCi0jZGVmaW5lIEtGX0JBREtFWUNPTUJPICAgICAgICAxMSAgLyogQWNjZW50L2NoYXIgY29tYm8gdW5kZWZpbmVkLCBiZWVwIG9ubHkuICovCi0jZGVmaW5lIEtGX1dBS0VVUEtFWSAgICAgICAgICAxMCAgLyogVGhpcyBwYWNrZXQgaXMgb25lIGZvbGxvd2luZyBQQVVTRUtFWSAqLwotI2RlZmluZSBLRl9QU1BBVVNFS0VZICAgICAgICAgIDkgIC8qIFRoaXMgcGFja2V0IGlzIEN0bC1TICovCi0jZGVmaW5lIEtGX1BBVVNFS0VZICAgICAgICAgICAgOCAgLyogVGhpcyBwYWNrZXQgaXMgQ3RsLU51bWxvY2sgb3IgUEFVU0UgKi8KLSNkZWZpbmUgS0ZfU0hJRlRNQVNLICAgICAgICAgICA3ICAvKiBLZXkgaXMgYSBzaGlmdCBLZXkgKi8KLSNkZWZpbmUgS0ZfRFVNUEtFWSAgICAgICAgICAgICA2ICAvKiBUaGlzIHBhY2tldCBpcyBDdGwtTnVtbG9jay1OdW1Mb2NrICovCi0jZGVmaW5lIEtGX1JFQk9PVEtFWSAgICAgICAgICAgNSAgLyogVGhpcyBwYWNrZXQgaXMgQ3RsLUFsdC1EZWwgKi8KLSNkZWZpbmUgS0ZfUkVTRU5EQ09ERSAgICAgICAgICA0ICAvKiBUaGlzIHBhY2tldCBpcyByZXNlbmQgY29kZSBmcm9tIGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgS0ZfT1ZFUlJVTkNPREUgICAgICAgICAzICAvKiBUaGlzIHBhY2tldCBpcyBvdmVycnVuIGNvZGUgZnJvbSBjb250cm9sbGVyICovCi0jZGVmaW5lIEtGX1NFQ1BSRUZJWENPREUgICAgICAgMiAgLyogVGhpcyBwYWNrZXQgaXMgRTAvRTEgc2NhbiBjb2RlICovCi0jZGVmaW5lIEtGX0FDS0NPREUgICAgICAgICAgICAgMSAgLyogVGhpcyBwYWNrZXQgaXMgYWNrIGNvZGUgZnJvbSBrZXlib2FyZCAqLwotCi0KLXR5cGVkZWYgc3RydWN0IF9NT05CVUYgewotICBVU0hPUlQgICAgY2I7Ci0gIEtFWVBBQ0tFVCBCdWZmZXI7Ci0gIEJZVEUgICAgICBSZXNlcnZlZFsyMF07Ci19IE1PTkJVRjsKLQotI2RlZmluZSBSU19TWVNSRUcgICAgICAzMjc2OCAgLyogQml0IDE1ICBTeXNSZXEga2V5IGRvd24gKi8KLSNkZWZpbmUgUlNfQ0FQU0xPQ0sgICAgMTYzODQgIC8qIEJpdCAxNCAgQ2FwcyBMb2NrIGtleSBkb3duICovCi0jZGVmaW5lIFJTX05VTUxPQ0sgICAgICA4MTkyICAvKiBCaXQgMTMgIE51bUxvY2sga2V5IGRvd24gKi8KLSNkZWZpbmUgUlNfU0NST0xMTE9DSyAgIDQwOTYgIC8qIEJpdCAxMiAgU2Nyb2xsIExvY2sga2V5IGRvd24gKi8KLSNkZWZpbmUgUlNfUkFMVCAgICAgICAgIDIwNDggIC8qIEJpdCAxMSAgUmlnaHQgQWx0IGtleSBkb3duICovCi0jZGVmaW5lIFJTX1JDT05UUk9MICAgICAxMDI0ICAvKiBCaXQgMTAgIFJpZ2h0IEN0cmwga2V5IGRvd24gKi8KLSNkZWZpbmUgUlNfTEFMVCAgICAgICAgICA1MTIgIC8qIEJpdCAgOSAgTGVmdCBBbHQga2V5IGRvd24gKi8KLSNkZWZpbmUgUlNfTENPTlRST0wgICAgICAyNTYgIC8qIEJpdCAgOCAgTGVmdCBDdHJsIGtleSBkb3duICovCi0jZGVmaW5lIFJTX0lOU0VSVCAgICAgICAgMTI4ICAvKiBCaXQgIDcgIEluc2VydCBvbiAqLwotI2RlZmluZSBSU19DQVBTICAgICAgICAgICA2NCAgLyogQml0ICA2ICBDYXBzIExvY2sgb24gKi8KLSNkZWZpbmUgUlNfTlVNICAgICAgICAgICAgMzIgIC8qIEJpdCAgNSAgTnVtTG9jayBvbiAqLwotI2RlZmluZSBSU19TQ1JPTEwgICAgICAgICAxNiAgLyogQml0ICA0ICBTY3JvbGwgTG9jayBvbiAqLwotI2RlZmluZSBSU19BTFQgICAgICAgICAgICAgOCAgLyogQml0ICAzICBFaXRoZXIgQWx0IGtleSBkb3duICovCi0jZGVmaW5lIFJTX0NPTlRST0wgICAgICAgICA0ICAvKiBCaXQgIDIgIEVpdGhlciBDdHJsIGtleSBkb3duICovCi0jZGVmaW5lIFJTX0xTSElGVCAgICAgICAgICAyICAvKiBCaXQgIDEgIExlZnQgU2hpZnQga2V5IGRvd24gKi8KLSNkZWZpbmUgUlNfUlNISUZUICAgICAgICAgIDEgIC8qIEJpdCAgMCAgUmlnaHQgU2hpZnQga2V5IGRvd24gKi8KLQotCi0jZGVmaW5lIENTX1JDT05UUk9MICAgICA5MSAgICAvKiBSaWdodCBDb250cm9sICovCi0jZGVmaW5lIENTX0xTSElGVCAgICAgICA0MiAgICAvKiBMZWZ0IFNoaWZ0ICovCi0jZGVmaW5lIENTX1JTSElGVCAgICAgICA1NCAgICAvKiBSaWdodCBTaGlmdCAqLwotI2RlZmluZSBDU19MQUxUICAgICAgICAgNTYgICAgLyogTGVmdCBBbHQgKi8KLSNkZWZpbmUgQ1NfUkFMVCAgICAgICAgIDk0ICAgIC8qIFJpZ2h0IEFsdCAqLwotCi0KLS8qIERvc01vbiogcHJvdG90eXBlcyAqLwotI2lmZGVmIF9fRU1YX18KLSAgICAjZGVmaW5lICBBUElSRVQxNiAgICAgICAgVVNIT1JUCi0gICAgI2RlZmluZSAgQVBJRU5UUlkxNgotI2Vsc2UKLSAgICAjZGVmaW5lICBEb3NNb25PcGVuICAgICAgRE9TMTZNT05PUEVOCi0gICAgI2RlZmluZSAgRG9zTW9uQ2xvc2UgICAgIERPUzE2TU9OQ0xPU0UKLSAgICAjZGVmaW5lICBEb3NNb25SZWcgICAgICAgRE9TMTZNT05SRUcKLSAgICAjZGVmaW5lICBEb3NNb25SZWFkICAgICAgRE9TMTZNT05SRUFECi0gICAgI2RlZmluZSAgRG9zTW9uV3JpdGUgICAgIERPUzE2TU9OV1JJVEUKLSAgICAjZGVmaW5lICBEb3NHZXRJbmZvU2VnICAgRE9TMTZHRVRJTkZPU0VHCi0jZW5kaWYKLQotQVBJUkVUMTYgQVBJRU5UUlkxNiBEb3NNb25PcGVuICAgKFBTWiBwc3pEZXZOYW1lLCBQSE1PTklUT1IgcGhtb24pOwotQVBJUkVUMTYgQVBJRU5UUlkxNiBEb3NNb25DbG9zZSAgKEhNT05JVE9SIGhtb24pOwotQVBJUkVUMTYgQVBJRU5UUlkxNiBEb3NNb25SZWcgICAgKEhNT05JVE9SIGhtb24sIE1PTkJVRiAqcGJJbkJ1ZiwgLypNT05CVUYqL1VMT05HICpwYk91dEJ1ZiwgVVNIT1JUIGZQb3NpdGlvbiwgVVNIT1JUIHVzSW5kZXgpOwotQVBJUkVUMTYgQVBJRU5UUlkxNiBEb3NNb25SZWFkICAgKFBCWVRFIHBiSW5CdWYsIFVTSE9SVCBmV2FpdCwgUEJZVEUgcGJEYXRhQnVmLCBQVVNIT1JUIHBjYkRhdGEpOwotQVBJUkVUMTYgQVBJRU5UUlkxNiBEb3NNb25Xcml0ZSAgKFBCWVRFIHBiT3V0QnVmLCBQQllURSBwYkRhdGFCdWYsIFVTSE9SVCBjYkRhdGEpOwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL29zaGRyLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczIvb3NoZHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdhYTFjNi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczIvb3NoZHIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBPUy8yCi0qCi0qIERlc2NyaXB0aW9uOiAgSW5jbHVkZSBmaWxlIHRvIGluY2x1ZGUgYWxsIE9TIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgSU5DTF9ET1NQUk9GSUxFCi0jZGVmaW5lIElOQ0xfRE9TRVJST1JTCi0jZGVmaW5lIElOQ0xfRE9TCi0jZGVmaW5lIElOQ0xfU1VCCi0jZGVmaW5lIElOQ0xfVklPCi0jZGVmaW5lIElOQ0xfS0JECi0jaW5jbHVkZSA8b3MyLmg+Ci0jaW5jbHVkZSA8cHJvY2Vzcy5oPgotI2luY2x1ZGUgIm9zMi9tb24uaCIKLQotdm9pZCBfX1BNX2NoZWNrQ29uc29sZVN3aXRjaCh2b2lkKTsKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi9wbS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL3BtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NmVlYWQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL3BtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBPUy8yCi0qCi0qIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnksIHdoaWNoCi0qICAgICAgICAgICAgICAgY29udGFpbnMgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBPUyBzcGVjaWZpYyBzZXJ2aWNlcyBpbiBhCi0qICAgICAgICAgICAgICAgZ2VuZXJpYywgY3Jvc3MgcGxhdGZvcm0gQVBJLiBQb3J0aW5nIHRoZSBPUyBQb3J0YWJpbGl0eQotKiAgICAgICAgICAgICAgIE1hbmFnZXIgbGlicmFyeSBpcyB0aGUgZmlyc3Qgc3RlcCB0byBwb3J0aW5nIGFueSBTY2lUZWNoCi0qICAgICAgICAgICAgICAgcHJvZHVjdHMgdG8gYSBuZXcgcGxhdGZvcm0uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJkcnZsaWIvb3Mvb3MuaCIKLSNpbmNsdWRlICJwbV9oZWxwLmgiCi0jaW5jbHVkZSAibXRyci5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8cHJvY2Vzcy5oPgotI2lmbmRlZiBfX0VNWF9fCi0jaW5jbHVkZSA8ZGlyZWN0Lmg+Ci0jZW5kaWYKLSNkZWZpbmUgSU5DTF9ET1NFUlJPUlMKLSNkZWZpbmUgSU5DTF9ET1MKLSNkZWZpbmUgSU5DTF9TVUIKLSNkZWZpbmUgSU5DTF9WSU8KLSNkZWZpbmUgSU5DTF9LQkQKLSNpbmNsdWRlIDxvczIuaD4KLQotLyogU2VtYXBob3JlIGZvciBjb21tdW5pY2F0aW9uIHdpdGggb3VyIGJhY2tncm91bmQgZGFlbW9uICovCi0jZGVmaW5lIFNIQVJFRFNFTSAgICgoUFNaKSJcXFNFTTMyXFxTRERcXERBRU1PTiIpCi0jZGVmaW5lIERBRU1PTl9OQU1FICJTREREQUVNTi5FWEUiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFB1YmxpYyBzdHJ1Y3R1cmVzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBWSURFT1BNSSBmb3IgaW1wbGVtZW50aW5nCi0gKiB0aGUgYWJpbGl0eSB0byBjYWxsIHRoZSByZWFsIG1vZGUgQklPUyBmdW5jdGlvbnMuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX1ZJREVPTU9ERUlORk8gewotICAgIFVMT05HICAgbWlNb2RlSWQ7Ci0gICAgVVNIT1JUICB1c1R5cGU7Ci0gICAgVVNIT1JUICB1c0ludDEwTW9kZVNldDsKLSAgICBVU0hPUlQgIHVzWFJlc29sdXRpb247Ci0gICAgVVNIT1JUICB1c1lSZXNvbHV0aW9uOwotICAgIFVMT05HICAgdWxCdWZmZXJBZGRyZXNzOwotICAgIFVMT05HICAgdWxBcGVydHVyZVNpemU7Ci0gICAgQllURSAgICBiQml0c1BlclBpeGVsOwotICAgIEJZVEUgICAgYkJpdFBsYW5lczsKLSAgICBCWVRFICAgIGJYQ2hhclNpemU7Ci0gICAgQllURSAgICBiWUNoYXJTaXplOwotICAgIFVTSE9SVCAgdXNCeXRlc1BlclNjYW5MaW5lOwotICAgIFVTSE9SVCAgdXNUZXh0Um93czsKLSAgICBVTE9ORyAgIHVsUGFnZUxlbmd0aDsKLSAgICBVTE9ORyAgIHVsU2F2ZVNpemU7Ci0gICAgQllURSAgICBiVnJ0UmVmcmVzaDsKLSAgICBCWVRFICAgIGJIcnRSZWZyZXNoOwotICAgIEJZVEUgICAgYlZydFBvbFBvczsKLSAgICBCWVRFICAgIGJIcnRQb2xQb3M7Ci0gICAgQ0hBUiAgICBiUmVkTWFza1NpemU7Ci0gICAgQ0hBUiAgICBiUmVkRmllbGRQb3NpdGlvbjsKLSAgICBDSEFSICAgIGJHcmVlbk1hc2tTaXplOwotICAgIENIQVIgICAgYkdyZWVuRmllbGRQb3NpdGlvbjsKLSAgICBDSEFSICAgIGJCbHVlTWFza1NpemU7Ci0gICAgQ0hBUiAgICBiQmx1ZUZpZWxkUG9zaXRpb247Ci0gICAgQ0hBUiAgICBiUnN2ZE1hc2tTaXplOwotICAgIENIQVIgICAgYlJzdmRGaWVsZFBvc2l0aW9uOwotICAgIFVMT05HICAgdWxDb2xvcnM7Ci0gICAgVUxPTkcgICB1bFJlc2VydmVkWzNdOwotICAgIH0gVklERU9NT0RFSU5GTywgRkFSICpQVklERU9NT0RFSU5GTzsKLQotdHlwZWRlZiBzdHJ1Y3QgX0FEQVBURVJJTkZPIHsKLSAgICBVTE9ORyAgICAgICB1bEFkYXB0ZXJJRDsKLSAgICBDSEFSICAgICAgICBzek9FTVN0cmluZ1sxMjhdOwotICAgIENIQVIgICAgICAgIHN6REFDU3RyaW5nWzEyOF07Ci0gICAgQ0hBUiAgICAgICAgc3pSZXZpc2lvblsxMjhdOwotICAgIFVMT05HICAgICAgIHVsVG90YWxNZW1vcnk7Ci0gICAgVUxPTkcgICAgICAgdWxNTUlPQmFzZUFkZHJlc3M7Ci0gICAgVUxPTkcgICAgICAgdWxQSU9CYXNlQWRkcmVzczsKLSAgICBCWVRFICAgICAgICBiQnVzVHlwZTsKLSAgICBCWVRFICAgICAgICBiRW5kaWFuOwotICAgIFVTSE9SVCAgICAgIHVzRGV2aWNlQnVzSUQ7Ci0gICAgVVNIT1JUICAgICAgdXNWZW5kb3JCdXNJRDsKLSAgICBVU0hPUlQgICAgICBTbG90SUQ7Ci0gICAgfSBBREFQVEVSSU5GTywgRkFSICpQQURBUFRFUklORk87Ci0KLXR5cGVkZWYgc3RydWN0IF9WSURFT19BREFQVEVSIHsKLSAgICB2b2lkICAgICAgICAgICAgKmh2aWRlbzsKLSAgICBBREFQVEVSSU5GTyAgICAgQWRhcHRlcjsKLSAgICBWSURFT01PREVJTkZPICAgTW9kZUluZm87Ci0gICAgfSBWSURFT19BREFQVEVSLCBGQVIgKlBWSURFT19BREFQVEVSOwotCi0vKiBQTUlSRVFVRVNUX1NPRlRXQVJFSU5UIHN0cnVjdHVyZXMgZnJvbSBPUy8yIERESyAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgVUxPTkcgdWxGbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWRE0gaW5pdGlhbGl6YXRpb24gdHlwZSAqLwotI2RlZmluZSBWRE1fUE9TVExPQUQgICAgICAgICAgICAgICAgICAgIDB4MSAgICAgLyogYWRhcHRlciBqdXN0IGxvYWRlZCwgdXNlZCBpbnRlcm5hbGx5IGZvciBpbml0aWFsaXphdGlvbiAqLwotI2RlZmluZSBWRE1fSU5JVElBTElaRSAgICAgICAgICAgICAgICAgIDB4MiAgICAgLyogZm9yY2UgaW5pdGlhbGl6YXRpb24gb2YgYSBwZXJtYW5lbnRseSBvcGVuIFZETSwgZXZlbiBpZiBwcmV2aW91c2x5IGluaXRpYWxpemVkICovCi0jZGVmaW5lIFZETV9URVJNSU5BVEVfUE9TVElOSVRJQUxJWkUgICAgMHg2ICAgICAvKnN0YXJ0IFZETSB3aXRoIGluaXRpYWxpemF0aW9uLCBidXQgY2xvc2UgaXQgYWZ0ZXJ3YXJkcyAoaW5jbHVkZXMgVkRNX0lOSVRJQUxJWkUpICovCi0jZGVmaW5lIFZETV9RVUVSWV9DQVBBQklMSVRZICAgICAgICAgICAgMHgxMCAgICAvKiBxdWVyeSB0aGUgY3VycmVudCBpbnQgMTAgY2FwYWJpbGl0eSAqLwotI2RlZmluZSBWRE1fRlVMTF9WRE1fQ1JFQVRFRCAgICAgICAgICAgIDB4MjAgICAgLyogYSBmdWxsIFZETSBpcyBjcmVhdGVkICovCi0jZGVmaW5lIFZETV9NSU5JX1ZETV9DUkVBVEVEICAgICAgICAgICAgMHg0MCAgICAvKiBhIG1pbmkgVkRNIGlzIGNyZWF0ZWQgKi8KLSNkZWZpbmUgVkRNX01JTklfVkRNX1NVUFBPUlRFRCAgICAgICAgICAweDgwICAgIC8qIG1pbmkgVkRNIHN1cHBvcnQgaXMgYXZhaWxhYmxlICovCi0gICAgUENIQVIgc3pOYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWRE0gaW5pdGlhbGl6YXRpb24gcHJvZ3JhbSAqLwotICAgIFBDSEFSIHN6QXJnczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVkRNIGluaXRpYWxpemF0aW9uIGFyZ3VtZW50cyAqLwotICAgIH1JTklUVkRNOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgQllURSBiQnVmZmVyVHlwZTsKLSNkZWZpbmUgQlVGRkVSX05PTkUgICAgIDAKLSNkZWZpbmUgSU5QVVRfQlVGRkVSICAgIDEKLSNkZWZpbmUgT1VUUFVUX0JVRkZFUiAgIDIKLSAgICBCWVRFIGJSZXNlcnZlZDsKLSAgICBCWVRFIGJTZWxDUkY7Ci0gICAgQllURSBiT2ZmQ1JGOwotICAgIFBWT0lEIHBBZGRyZXNzOwotICAgIFVMT05HIHVsU2l6ZTsKLSAgICB9IEJVRkZFUiwgKlBCVUZGRVI7Ci0KLXR5cGVkZWYgc3RydWN0IHZjcmZfcyB7Ci0gICAgVUxPTkcgcmVnX2VheDsKLSAgICBVTE9ORyByZWdfZWJ4OwotICAgIFVMT05HIHJlZ19lY3g7Ci0gICAgVUxPTkcgcmVnX2VkeDsKLSAgICBVTE9ORyByZWdfZWJwOwotICAgIFVMT05HIHJlZ19lc2k7Ci0gICAgVUxPTkcgcmVnX2VkaTsKLSAgICBVTE9ORyByZWdfZHM7Ci0gICAgVUxPTkcgcmVnX2VzOwotICAgIFVMT05HIHJlZ19mczsKLSAgICBVTE9ORyByZWdfZ3M7Ci0gICAgVUxPTkcgcmVnX2NzOwotICAgIFVMT05HIHJlZ19laXA7Ci0gICAgVUxPTkcgcmVnX2VmbGFnOwotICAgIFVMT05HIHJlZ19zczsKLSAgICBVTE9ORyByZWdfZXNwOwotICAgIH0gVkNSRjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFVMT05HICAgdWxCSU9TSW50Tm87Ci0gICAgVkNSRiAgICBhQ1JGOwotICAgIEJVRkZFUiAgcEJbMl07Ci0gICAgfSBJTlRDUkY7Ci0KLSNkZWZpbmUgUE1JUkVRVUVTVF9MT0FEUE1JRklMRSAgICAgICAgICAyMQotI2RlZmluZSBQTUlSRVFVRVNUX0lERU5USUZZQURBUFRFUiAgICAgIDIyCi0jZGVmaW5lIFBNSVJFUVVFU1RfU09GVFdBUkVJTlQgICAgICAgICAgMjMKLQotI2lmZGVmICBQVFJfREVDTF9JTl9GUk9OVAotI2RlZmluZSBFWFBFTlRSWVAgICAqIEVYUEVOVFJZCi0jZWxzZQotI2RlZmluZSBFWFBFTlRSWVAgICBFWFBFTlRSWSAqCi0jZW5kaWYKLQotLyogRW50cnkgcG9pbnQgdG8gVklERU9QTUkzMlJlcXVlc3QuIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gYnkgZXh0ZXJuYWwKLSAqIGNvZGUgdGhhdCBoYXMgYWxyZWFkeSBsb2FkZWQgVklERU9QTUkgdG8gYXZvaWQgbG9hZGluZyBpdCB0d2ljZS4KLSAqLwotCi1BUElSRVQgKEVYUEVOVFJZUCBQTV9WSURFT1BNSTMyUmVxdWVzdCkoUFZJREVPX0FEQVBURVIsIFVMT05HLCBQVk9JRCwgUFZPSUQpID0gTlVMTDsKLXN0YXRpYyBpYm9vbCAgICAgICAgaGF2ZUludDEwID0gLTE7IC8qIFRydWUgaWYgd2UgaGF2ZSBJbnQgMTAgc3VwcG9ydCAgICovCi1zdGF0aWMgaWJvb2wgICAgICAgIHVzZVZQTUkgPSB0cnVlOyAvKiBGYWxzZSBpZiBWSURFT1BNSSB1bmF2YWlsYWJsZSAgICAqLwotc3RhdGljIFZJREVPX0FEQVBURVIgQWRhcHRlcjsgICAgICAgLyogVmlkZW8gYWRhcHRlciBmb3IgVklERU9QTUkgICAgICAgKi8KLXN0YXRpYyB1Y2hhciAgICAgICAgUk1CdWZbMTAyNF07ICAgIC8qIEZha2UgcmVhbCBtb2RlIHRyYW5zZmVyIGJ1ZmZlciAgICovCi1zdGF0aWMgdWludCAgICAgICAgIFZFU0FCdWZfbGVuID0gMTAyNDsvKiBMZW5ndGggb2YgdGhlIFZFU0FCdWYgYnVmZmVyICAqLwotc3RhdGljIHZvaWQgICAgICAgICAqVkVTQUJ1Zl9wdHIgPSBOVUxMOy8qIE5lYXIgcG9pbnRlciB0byBWRVNBQnVmICAgICAgKi8KLXN0YXRpYyB1aW50ICAgICAgICAgVkVTQUJ1Zl9yc2VnOyAgIC8qIFJlYWwgbW9kZSBzZWdtZW50IG9mIFZFU0FCdWYgICAgICovCi1zdGF0aWMgdWludCAgICAgICAgIFZFU0FCdWZfcm9mZjsgICAvKiBSZWFsIG1vZGUgb2Zmc2V0IG9mIFZFU0FCdWYgICAgICAqLwotc3RhdGljIHVjaGFyICogICAgICBsb3dNZW0gPSBOVUxMOwotc3RhdGljIGlib29sICAgICAgICBpc1Nlc3Npb25Td2l0Y2hpbmcgPSBmYWxzZTsKLXN0YXRpYyB1bG9uZyAgICAgICAgcGFybXNJbls0XTsgICAgIC8qIE11c3Qgbm90IGNyb3NzIDY0S2IgYm91bmRhcnkhICAgICovCi1zdGF0aWMgdWxvbmcgICAgICAgIHBhcm1zT3V0WzRdOyAgICAvKiBNdXN0IG5vdCBjcm9zcyA2NEtiIGJvdW5kYXJ5ISAgICAqLwotZXh0ZXJuIHVzaG9ydCAgICAgICBfUE1fZ2R0Owotc3RhdGljIHZvaWQgKFBNQVBJUCBmYXRhbEVycm9yQ2xlYW51cCkodm9pZCkgPSBOVUxMOwotCi0vKiBEb3NTeXNDdGwgcHJvdG90eXBlLiBJdCBpcyBub3QgZGVjbGFyZWQgaW4gdGhlIGhlYWRlcnMgYnV0IGl0IGlzIGluIHRoZQotICogc3RhbmRhcmQgaW1wb3J0IGxpYnJhcmllcyAoRE9TQ0FMTFMuODc2KS4gRnVubnkuCi0gKi8KLUFQSVJFVCBBUElFTlRSWSBEb3NTeXNDdGwoVUxPTkcgdWxGdW5jdGlvbiwgUFZPSUQgcHZEYXRhKTsKLQotLyogVGhpcyBpcyB0aGUgc3RhY2sgc2l6ZSBmb3IgdGhlIHRocmVhZHMgdGhhdCB0cmFjayB0aGUgc2Vzc2lvbiBzd2l0Y2ggZXZlbnQgKi8KLSNkZWZpbmUgU0VTU0lPTl9TV0lUQ0hfU1RBQ0tfU0laRSAgIDMyNzY4Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBWSU9NT0RFSU5GTyAgICAgdm1pOwotICAgIFVTSE9SVCAgICAgICAgICBDdXJzb3JYOwotICAgIFVTSE9SVCAgICAgICAgICBDdXJzb3JZOwotICAgIFVDSEFSICAgICAgICAgICBGcmFtZUJ1ZmZlclsxXTsKLSAgICB9IENPTlNPTEVfU0FWRTsKLQotdHlwZWRlZiBzdHJ1Y3QgX1NFU1dJVENIUkVDIHsKLSAgICAvKiBUaGUgZm9sbG93aW5nIHZhcmlhYmxlIGlzIHZvbGF0aWxlIGJlY2F1c2Ugb2YgUE1fU1VTUEVORF9BUFAgICAgICAgICAqLwotICAgIHZvbGF0aWxlIGludCAgICBGbGFnczsgICAgICAgICAgLyogLTEgb3IgUE1fREVBQ1RJVkFURSBvciBQTV9SRUFDVElWQVRFICovCi0gICAgUE1fc2F2ZVN0YXRlX2NiIENhbGxiYWNrOyAgICAgICAvKiBTYXZlL3Jlc3RvcmUgY29udGV4dCBjYWxsYmFjayAgICAgICAgKi8KLSAgICBITVRYICAgICAgICAgICAgTXV0ZXg7ICAgICAgICAgIC8qIEV4Y2x1c2l2ZSBhY2Nlc3MgbXV0ZXggICAgICAgICAgICAgICAqLwotICAgIEhFViAgICAgICAgICAgICBFdmVudDsgICAgICAgICAgLyogUG9zdGVkIGFmdGVyIGNhbGxiYWNrIGlzIGNhbGxlZCAgICAgICovCi0gICAgfSBTRVNXSVRDSFJFQzsKLQotLyogUGFnZSBzaXplZCBibG9jayBjYWNoZSAqLwotCi0jZGVmaW5lIFBBR0VTX1BFUl9CTE9DSyAgICAgMzIKLSNkZWZpbmUgUEFHRV9CTE9DS19TSVpFICAgICAoUEFHRVNfUEVSX0JMT0NLICogUE1fUEFHRV9TSVpFICsgKFBNX1BBR0VfU0laRS0xKSArIHNpemVvZihwYWdlYmxvY2spKQotI2RlZmluZSBGUkVFTElTVF9ORVhUKHApICAgICgqKHZvaWQqKikocCkpCi10eXBlZGVmIHN0cnVjdCBwYWdlYmxvY2sgewotICAgIHN0cnVjdCBwYWdlYmxvY2sgICAgKm5leHQ7Ci0gICAgc3RydWN0IHBhZ2VibG9jayAgICAqcHJldjsKLSAgICB2b2lkICAgICAgICAgICAgICAgICpmcmVlTGlzdFN0YXJ0OwotICAgIHZvaWQgICAgICAgICAgICAgICAgKmZyZWVMaXN0OwotICAgIHZvaWQgICAgICAgICAgICAgICAgKmZyZWVMaXN0RW5kOwotICAgIGludCAgICAgICAgICAgICAgICAgZnJlZUNvdW50OwotICAgIFBNX2xvY2tIYW5kbGUgICAgICAgbG9ja0hhbmRsZTsKLSAgICB9IHBhZ2VibG9jazsKLQotc3RhdGljIHBhZ2VibG9jayAgICAqcGFnZUJsb2NrcyA9IE5VTEw7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZnVuYyAgICAgICAgLSBIZWxwZXIgZGV2aWNlIGRyaXZlciBmdW5jdGlvbiB0byBjYWxsCi0KLVJFVFVSTlM6Ci1GaXJzdCByZXR1cm4gdmFsdWUgZnJvbSB0aGUgZGV2aWNlIGRyaXZlciBpbiBwYXJtc091dFswXQotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gb3BlbiBvdXIgaGVscGVyIGRldmljZSBkcml2ZXIsIGNhbGwgaXQgYW5kIGNsb3NlIHRoZSBmaWxlCi1oYW5kbGUuIE5vdGUgdGhhdCB3ZSBoYXZlIHRvIG9wZW4gdGhlIGRldmljZSBkcml2ZXIgZm9yIGV2ZXJ5IGNhbGwgYmVjYXVzZQotb2YgdHdvIHByb2JsZW1zOgotCi0gMS4gV2UgY2Fubm90IG9wZW4gYSBzaW5nbGUgZmlsZSBoYW5kbGUgaW4gYSBETEwgdGhhdCBpcyBzaGFyZWQgYW1vbmdzdAotICAgIHByb2dyYW1zLCBzaW5jZSBldmVyeSBwcm9jZXNzIG11c3QgaGF2ZSBpdCdzIG93biBvcGVuIGZpbGUgaGFuZGxlLgotCi0gMi4gRm9yIHNvbWUgcmVhc29uIHRoZXJlIGFwcGVhcnMgdG8gYmUgYSBsaW1pdCBvZiBhYm91dCAxMiBvcGVuIGZpbGUKLSAgICBoYW5kbGVzIG9uIGEgZGV2aWNlIGRyaXZlciBpbiB0aGUgc3lzdGVtLiBIZW5jZSB3aGVuIHdlIG9wZW4gbW9yZQotICAgIHRoYW4gYWJvdXQgMTIgZmlsZSBoYW5kbGVzIHRoaW5ncyBzdGFydCB0byBnbyB2ZXJ5IHN0cmFuZ2UuCi0KLUhlbmNlIHdlIHNpbXBseSBvcGVuIHRoZSBmaWxlIGhhbmRsZSBldmVyeSB0aW1lIHRoYXQgd2UgbmVlZCB0byBjYWxsIHRoZQotZGV2aWNlIGRyaXZlciB0byB3b3JrIGFyb3VuZCB0aGVzZSBwcm9ibGVtcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgQ2FsbFNEREhlbHAoCi0gICAgaW50IGZ1bmMpCi17Ci0gICAgc3RhdGljIHVsb25nICAgIGluTGVuOyAgICAgICAgICAvKiBNdXN0IG5vdCBjcm9zcyA2NEtiIGJvdW5kYXJ5ISAgICAqLwotICAgIHN0YXRpYyB1bG9uZyAgICBvdXRMZW47ICAgICAgICAgLyogTXVzdCBub3QgY3Jvc3MgNjRLYiBib3VuZGFyeSEgICAgKi8KLSAgICBIRklMRSAgICAgICAgICAgaFNEREhlbHA7Ci0gICAgVUxPTkcgICAgICAgICAgIHJjOwotICAgIHVsb25nICAgICAgICAgICByZXN1bHQ7Ci0KLSAgICBpZiAoKHJjID0gRG9zT3BlbihQTUhFTFBfTkFNRSwmaFNEREhlbHAsJnJlc3VsdCwwLDAsCi0JICAgIEZJTEVfT1BFTiwgT1BFTl9TSEFSRV9ERU5ZTk9ORSB8IE9QRU5fQUNDRVNTX1JFQURXUklURSwKLQkgICAgTlVMTCkpICE9IDApIHsKLQlpZiAocmMgPT0gNCkgeyAgLyogRGlkIHdlIHJ1biBvdXQgb2YgZmlsZSBoYW5kbGVzPyAqLwotCSAgICBVTE9ORyAgIHVsTmV3RkhzOwotCSAgICBMT05HICAgIGxBZGRGSHMgPSA1OwotCi0JICAgIGlmIChEb3NTZXRSZWxNYXhGSCgmbEFkZEZIcywgJnVsTmV3RkhzKSAhPSAwKQotCQlQTV9mYXRhbEVycm9yKCJGYWlsZWQgdG8gcmFpc2UgdGhlIGZpbGUgaGFuZGxlcyBsaW1pdCEiKTsKLQkgICAgZWxzZSB7Ci0JCWlmICgocmMgPSBEb3NPcGVuKFBNSEVMUF9OQU1FLCZoU0RESGVscCwmcmVzdWx0LDAsMCwKLQkJCUZJTEVfT1BFTiwgT1BFTl9TSEFSRV9ERU5ZTk9ORSB8IE9QRU5fQUNDRVNTX1JFQURXUklURSwKLQkJCU5VTEwpKSAhPSAwKSB7Ci0JCSAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gb3BlbiBTRERIRUxQJCBoZWxwZXIgZGV2aWNlIGRyaXZlciEgKCMyKSIpOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQllbHNlCi0JICAgIFBNX2ZhdGFsRXJyb3IoIlVuYWJsZSB0byBvcGVuIFNEREhFTFAkIGhlbHBlciBkZXZpY2UgZHJpdmVyISIpOwotCX0KLSAgICBpZiAoRG9zRGV2SU9DdGwoaFNEREhlbHAsUE1IRUxQX0lPQ1RMLGZ1bmMsCi0JICAgICZwYXJtc0luLCBpbkxlbiA9IHNpemVvZihwYXJtc0luKSwgJmluTGVuLAotCSAgICAmcGFybXNPdXQsIG91dExlbiA9IHNpemVvZihwYXJtc091dCksICZvdXRMZW4pICE9IDApCi0JUE1fZmF0YWxFcnJvcigiRmFpbHVyZSBjYWxsaW5nIFNEREhFTFAkIGhlbHBlciBkZXZpY2UgZHJpdmVyISIpOwotICAgIERvc0Nsb3NlKGhTRERIZWxwKTsKLSAgICByZXR1cm4gcGFybXNPdXRbMF07Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGV0ZXJtaW5lIGlmIHdlJ3JlIHJ1bm5pbmcgb24gYSBEQkNTIHN5c3RlbS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBfX0lzREJDU1N5c3RlbSh2b2lkKQotewotICAgIENIQVIgICAgICAgIGFjaERCQ1NJbmZvWzEyXTsKLSAgICBDT1VOVFJZQ09ERSBjY1N0cnVjdCA9IHswLCAwfTsKLQotICAgIG1lbXNldChhY2hEQkNTSW5mbywgMCwgMTIpOwotCi0gICAgLyogR2V0IHRoZSBEQkNTIHZlY3RvciAtIGlmIGl0J3Mgbm90IGVtcHR5LCB3ZSdyZSBvbiBEQkNTICovCi0gICAgRG9zUXVlcnlEQkNTRW52KHNpemVvZihhY2hEQkNTSW5mbyksICZjY1N0cnVjdCwgYWNoREJDU0luZm8pOwotICAgIGlmIChhY2hEQkNTSW5mb1swXSAhPSAwKQotCXJldHVybiB0cnVlOwotICAgIGVsc2UKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGV0ZXJtaW5lIGlmIFBNU0hFTEwgaXMgcnVubmluZyAtIGlmIGl0IGlzbid0LCB3ZSBjYW4ndCB1c2UgY2VydGFpbiBjYWxscwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIF9faXNTaGVsbExvYWRlZCh2b2lkKQotewotICAgIFBWT0lEICAgcHRyOwotCi0gICAgaWYgKERvc0dldE5hbWVkU2hhcmVkTWVtKCZwdHIsIChQU1opIlxcU0hBUkVNRU1cXFBNR0xPQkFMLk1FTSIsIFBBR19SRUFEKSA9PSBOT19FUlJPUikgewotCURvc0ZyZWVNZW0ocHRyKTsKLQlyZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIFBNIGxpYnJhcnkgYW5kIGNvbm5lY3QgdG8gb3VyIGhlbHBlciBkZXZpY2UgZHJpdmVyLiBJZiB3ZQotY2Fubm90IGNvbm5lY3QgdG8gb3VyIGhlbHBlciBkZXZpY2UgZHJpdmVyLCB3ZSBiYWlsIG91dCB3aXRoIGFuIGVycm9yCi1tZXNzYWdlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1faW5pdCh2b2lkKQotewotICAgIGlmICghbG93TWVtKSB7Ci0JLyogT2J0YWluIHRoZSAzMi0+MTYgY2FsbGdhdGUgZnJvbSB0aGUgZGV2aWNlIGRyaXZlciB0byBlbmFibGUgSU9QTCAqLwotCWlmICgoX1BNX2dkdCA9IENhbGxTRERIZWxwKFBNSEVMUF9HRVRHRFQzMikpID09IDApCi0JICAgIFBNX2ZhdGFsRXJyb3IoIlVuYWJsZSB0byBvYnRhaW4gY2FsbCBnYXRlIHNlbGVjdG9yISIpOwotCi0JUE1fc2V0SU9QTCgzKTsKLQotCS8qIE1hcCB0aGUgZmlyc3QgTWIgb2YgcGh5c2ljYWwgbWVtb3J5IGludG8gbG93TWVtICovCi0JaWYgKChsb3dNZW0gPSBQTV9tYXBQaHlzaWNhbEFkZHIoMCwweEZGRkZGLHRydWUpKSA9PSBOVUxMKQotCSAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gbWFwIGZpcnN0IE1iIHBoeXNpY2FsIG1lbW9yeSEiKTsKLQotCS8qIEluaXRpYWxpc2UgdGhlIE1UUlIgaW50ZXJmYWNlIGZ1bmN0aW9ucyAqLwotCU1UUlJfaW5pdCgpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBQTSBsaWJyYXJ5IGZvciBCSU9TIGFjY2VzcyB2aWEgVklERU9QTUkuIFRoaXMgc2hvdWxkIHdvcmsKLXdpdGggYW55IEdSQUREIGRyaXZlciwgaW5jbHVkaW5nIFNERC8yLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpYm9vbCBJbml0SW50MTAodm9pZCkKLXsKLSAgICBITU9EVUxFICAgICBoTW9kR0VOUE1JLGhNb2RTRERQTUksaE1vZFZpZGVvUE1JOwotICAgIENIQVIgICAgICAgIGJ1Zls4MF0scGF0aFtfTUFYX1BBVEhdOwotICAgIEhFViAgICAgICAgIGhldkRhZW1vbiA9IE5VTExIQU5ETEU7Ci0gICAgUkVTVUxUQ09ERVMgcmVzQ29kZXM7Ci0KLSAgICBpZiAoaGF2ZUludDEwID09IC0xKSB7Ci0JLyogQ29ubmVjdCB0byBWSURFT1BNSSBhbmQgZ2V0IGVudHJ5IHBvaW50LiBOb3RlIHRoYXQgd2Ugb25seQotCSAqIGRvIHRoaXMgaWYgR0VOUE1JIG9yIFNERFBNSSBhcmUgYWxyZWFkeSBsb2FkZWQsIHNpbmNlIHdlIG5lZWQKLQkgKiBhIEdSQUREIGJhc2VkIGRyaXZlciBmb3IgdGhpcyB0byB3b3JrLgotCSAqLwotCVBNX2luaXQoKTsKLQloYXZlSW50MTAgPSBmYWxzZTsKLQlpZiAoRG9zUXVlcnlNb2R1bGVIYW5kbGUoKFBTWikiR0VOUE1JLkRMTCIsJmhNb2RHRU5QTUkpICE9IDApCi0JICAgIGhNb2RHRU5QTUkgPSBOVUxMSEFORExFOwotCWlmIChEb3NRdWVyeU1vZHVsZUhhbmRsZSgoUFNaKSJTRERQTUkuRExMIiwmaE1vZFNERFBNSSkgIT0gMCkKLQkgICAgaE1vZFNERFBNSSA9IE5VTExIQU5ETEU7Ci0JaWYgKGhNb2RHRU5QTUkgfHwgaE1vZFNERFBNSSkgewotCSAgICBpZiAoRG9zTG9hZE1vZHVsZSgoUFNaKWJ1ZixzaXplb2YoYnVmKSwoUFNaKSJWSURFT1BNSS5ETEwiLCZoTW9kVmlkZW9QTUkpID09IDApIHsKLQkJaWYgKERvc1F1ZXJ5UHJvY0FkZHIoaE1vZFZpZGVvUE1JLDAsKFBTWikiVklERU9QTUkzMlJlcXVlc3QiLCh2b2lkKikmUE1fVklERU9QTUkzMlJlcXVlc3QpICE9IDApCi0JCSAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gZ2V0IFZJREVPUE1JMzJSZXF1ZXN0IGVudHJ5IHBvaW50ISIpOwotCQlzdHJjcHkocGF0aCwiWDpcXE9TMlxcU1ZHQURBVEEuUE1JIik7Ci0JCXBhdGhbMF0gPSBQTV9nZXRCb290RHJpdmUoKTsKLQkJaWYgKFBNX1ZJREVPUE1JMzJSZXF1ZXN0KCZBZGFwdGVyLFBNSVJFUVVFU1RfTE9BRFBNSUZJTEUscGF0aCxOVUxMKSAhPSAwKSB7Ci0JCSAgICBEb3NGcmVlTW9kdWxlKGhNb2RWaWRlb1BNSSk7Ci0JCSAgICBQTV9WSURFT1BNSTMyUmVxdWVzdCA9IE5VTEw7Ci0JCSAgICBoYXZlSW50MTAgPSBmYWxzZTsKLQkJICAgIH0KLQkJZWxzZSB7Ci0JCSAgICAvKiBBdHRlbXB0IHRvIGluaXRpYWxpc2UgdGhlIGZ1bGwgVkRNIGluIHRoZSBzeXN0ZW0uIFRoaXMgd2lsbCBvbmx5Ci0JCSAgICAgKiB3b3JrIGlmIFZQUlBNSS5TWVMgaXMgbG9hZGVkLCBidXQgaXQgcHJvdmlkZXMgc3VwcG9ydCBmb3IgcGFzc2luZwotCQkgICAgICogdmFsdWVzIGluIEVTL0RTL0VTSS9FREkgYmV0d2VlbiB0aGUgQklPUyB3aGljaCBkb2VzIG5vdCB3b3JrIHdpdGgKLQkJICAgICAqIGtlcm5lbCBWRE0ncyBpbiBmaXhwYWNrcyBlYXJsaWVyIHRoYW4gRlAxNS4gRlAxNSBhbmQgbGF0ZXIgYW5kCi0JCSAgICAgKiB0aGUgbmV3IFdhcnAgNC41MSBhbmQgV2FycCBTZXJ2ZXIgY29udmVuaWVuY2UgcGFja3Mgc2hvdWxkIHdvcmsKLQkJICAgICAqIGZpbmUgd2l0aCB0aGUga2VybmVsIG1pbmktVkRNLgotCQkgICAgICoKLQkJICAgICAqIEFsc28gdGhlIGZ1bGwgVkRNIGlzIHRoZSBvbmx5IHNvbHV0aW9uIGZvciByZWFsbHkgb2xkIGtlcm5lbHMKLQkJICAgICAqIChidXQgR1JBREQgd29uJ3QgcnVuIG9uIHRoZW0gc28gdGhpcyBpcyBzdXBlcmZsdW91cyA7LSkuCi0JCSAgICAgKi8KLQkJICAgIElOSVRWRE0gSW5pdFZETSA9IHtWRE1fSU5JVElBTElaRSxOVUxMLE5VTEx9OwotCQkgICAgUE1fVklERU9QTUkzMlJlcXVlc3QoJkFkYXB0ZXIsUE1JUkVRVUVTVF9TT0ZUV0FSRUlOVCwmSW5pdFZETSxOVUxMKTsKLQkJICAgIGhhdmVJbnQxMCA9IHRydWU7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCWVsc2UgewotCSAgICAvKiBBIEdSQUREIGRyaXZlciBpc24ndCBsb2FkZWQsIGhlbmNlIHdlIGNhbid0IHVzZSBWSURFT1BNSS4gQnV0IHdlIHdpbGwgdHJ5Ci0JICAgICAqIHRvIGFjY2VzcyB0aGUgbWluaS1WRE0gZGlyZWN0bHksIGZpcnN0IHZlcmlmeWluZyB0aGF0IHRoZSBzdXBwb3J0IGlzCi0JICAgICAqIGF2YWlsYWJsZSBpbiB0aGUga2VybmVsIChpdCBzaG91bGQgYmUgZm9yIGtlcm5lbHMgdGhhdCBzdXBwb3J0IEdSQUREKS4KLQkgICAgICogVGhpcyBtYXkgYmUgbmVlZGVkIGluIGEgY29tbWFuZCBsaW5lIGJvb3Qgb3IgaWYgbm9uLUdSQUREIGRyaXZlciBpcwotCSAgICAgKiB1c2VkIChNYXRyb3ggb3IgY2xhc3NpYyBWR0EpLgotCSAgICAgKiBOb3RlOiBiZWNhdXNlIG9mIHByb2JsZW1zIHdpdGggbWluaS1WRE0gc3VwcG9ydCBpbiB0aGUga2VybmVsLCB3ZSBoYXZlIHRvCi0JICAgICAqIHNwYXduIGEgZGFlbW9uIHByb2Nlc3MgdGhhdCB3aWxsIGRvIHRoZSBhY3R1YWwgbWluaS1WRE0gYWNjZXNzIGZvciB1cy4KLQkgICAgICovCi0JICAgICAvKiBUcnkgdG8gb3BlbiBzaGFyZWQgc2VtYXBob3JlIHRvIHNlZSBpZiBvdXIgZGFlbW9uIGlzIGFscmVhZHkgdXAgKi8KLQkgICAgaWYgKERvc09wZW5FdmVudFNlbShTSEFSRURTRU0sICZoZXZEYWVtb24pID09IE5PX0VSUk9SKSB7Ci0JCWlmIChEb3NXYWl0RXZlbnRTZW0oaGV2RGFlbW9uLCAxKSA9PSBOT19FUlJPUikgewotCQkgICAgLyogSWYgc2VtYXBob3JlIGlzIHBvc3RlZCwgYWxsIGlzIHdlbGwgKi8KLQkJICAgIHVzZVZQTUkgICA9IGZhbHNlOwotCQkgICAgaGF2ZUludDEwID0gdHJ1ZTsKLQkJICAgIH0KLQkJfQotCSAgICBlbHNlIHsKLQkJLyogQ3JlYXRlIHNoYXJlZCBldmVudCBzZW1hcGhvcmUgKi8KLQkJaWYgKERvc0NyZWF0ZUV2ZW50U2VtKFNIQVJFRFNFTSwgJmhldkRhZW1vbiwgRENfU0VNX1NIQVJFRCwgRkFMU0UpID09IE5PX0VSUk9SKSB7Ci0JCSAgICBQTV9maW5kQlBEKERBRU1PTl9OQU1FLCBwYXRoKTsKLQkJICAgIHN0cmNhdChwYXRoLCBEQUVNT05fTkFNRSk7Ci0JCSAgICBpZiAoRG9zRXhlY1BnbShidWYsIHNpemVvZihidWYpLCBFWEVDX0JBQ0tHUk9VTkQsIChQU1opREFFTU9OX05BTUUsCi0JCQlOVUxMLCAmcmVzQ29kZXMsIChQU1opcGF0aCkgPT0gTk9fRVJST1IpIHsKLQkJCS8qIFRoZSBkYWVtb24gd2FzIHN1Y2Nlc3NmdWxseSBzcGF3bmVkLCBub3cgZ2l2ZSBpdCBhIHNlYyB0byBjb21lIHVwICovCi0JCQlpZiAoRG9zV2FpdEV2ZW50U2VtKGhldkRhZW1vbiwgMjAwMCkgPT0gTk9fRVJST1IpIHsKLQkJCSAgICAvKiBJdCdzIHVwISAqLwotCQkJICAgIHVzZVZQTUkgICA9IGZhbHNlOwotCQkJICAgIGhhdmVJbnQxMCA9IHRydWU7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgcmV0dXJuIGhhdmVJbnQxMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1XZSAicHJvYmFibHkiIGhhdmUgQklPUyBhY2Nlc3MgdW5kZXIgT1MvMiBidXQgd2UgaGF2ZSB0byB2ZXJpZnkvaW5pdGlhbGl6ZSBpdAotZmlyc3QuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1faGF2ZUJJT1NBY2Nlc3Modm9pZCkKLXsKLSAgICByZXR1cm4gSW5pdEludDEwKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHR5cGUgaWRlbnRpZmllci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1sb25nIFBNQVBJIFBNX2dldE9TVHlwZSh2b2lkKQotewotICAgIHJldHVybiBfT1NfT1MyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgcnVudGltZSB0eXBlIGlkZW50aWZpZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2dldE1vZGVUeXBlKHZvaWQpCi17Ci0gICAgcmV0dXJuIFBNXzM4NjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BZGQgYSBmaWxlIGRpcmVjdG9yeSBzZXBhcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZW5hbWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9iYWNrc2xhc2goCi0gICAgY2hhciAqcykKLXsKLSAgICB1aW50IHBvcyA9IHN0cmxlbihzKTsKLSAgICBpZiAoc1twb3MtMV0gIT0gJ1xcJykgewotCXNbcG9zXSA9ICdcXCc7Ci0Jc1twb3MrMV0gPSAnXDAnOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BZGQgYSB1c2VyIGRlZmluZWQgUE1fZmF0YWxFcnJvciBjbGVhbnVwIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0RmF0YWxFcnJvckNsZWFudXAoCi0gICAgdm9pZCAoUE1BUElQIGNsZWFudXApKHZvaWQpKQotewotICAgIGZhdGFsRXJyb3JDbGVhbnVwID0gY2xlYW51cDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXBvcnQgYSBmYXRhbCBlcnJvciBjb25kaXRpb24gYW5kIGhhbHQgdGhlIHByb2dyYW0uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mYXRhbEVycm9yKAotICAgIGNvbnN0IGNoYXIgKm1zZykKLXsKLSAgICAvKiBCZSBwcmVwYXJlIHRvIGJlIGNhbGxlZCByZWN1cnNpdmVseSAoZmFpbGVkIHRvIGZhaWwgc2l0dWF0aW9uIDotKSAqLwotICAgIHN0YXRpYyBpbnQgZmF0YWxFcnJvckNvdW50ID0gMDsKLSAgICBpZiAoZmF0YWxFcnJvckNvdW50KysgPT0gMCkgewotCWlmIChmYXRhbEVycm9yQ2xlYW51cCkKLQkgICAgZmF0YWxFcnJvckNsZWFudXAoKTsKLQl9Ci0gICAgZnByaW50ZihzdGRlcnIsIiVzXG4iLCBtc2cpOwotICAgIGV4aXQoMSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGUgdGhlIHJlYWwgbW9kZSBWRVNBIHRyYW5zZmVyIGJ1ZmZlciBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBCSU9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9nZXRWRVNBQnVmKAotICAgIHVpbnQgKmxlbiwKLSAgICB1aW50ICpyc2VnLAotICAgIHVpbnQgKnJvZmYpCi17Ci0gICAgaWYgKCFWRVNBQnVmX3B0cikgewotCS8qIEFsbG9jYXRlIGEgZ2xvYmFsIGJ1ZmZlciBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBWRVNBIFZCRSAqLwotCWlmICgoVkVTQUJ1Zl9wdHIgPSBQTV9hbGxvY1JlYWxTZWcoVkVTQUJ1Zl9sZW4sICZWRVNBQnVmX3JzZWcsICZWRVNBQnVmX3JvZmYpKSA9PSBOVUxMKQotCSAgICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgKmxlbiA9IFZFU0FCdWZfbGVuOwotICAgICpyc2VnID0gVkVTQUJ1Zl9yc2VnOwotICAgICpyb2ZmID0gVkVTQUJ1Zl9yb2ZmOwotICAgIHJldHVybiBWRVNBQnVmX3B0cjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DaGVjayBpZiBhIGtleSBoYXMgYmVlbiBwcmVzc2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9rYmhpdCh2b2lkKQotewotICAgIEtCREtFWUlORk8gICBrZXk7ICAgICAgICAgICAgLyogTXVzdCBub3QgY3Jvc3MgYSA2NEsgYm91bmRhcnkgICAgKi8KLQotICAgIEtiZFBlZWsoJmtleSwgMCk7Ci0gICAgcmV0dXJuIChrZXkuZmJTdGF0dXMgJiBLQkRUUkZfRklOQUxfQ0hBUl9JTik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotV2FpdCBmb3IgYW5kIHJldHVybiB0aGUgbmV4dCBrZXlwcmVzcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZ2V0Y2godm9pZCkKLXsKLSAgICBLQkRLRVlJTkZPICAga2V5OyAgICAgICAgICAgIC8qIE11c3Qgbm90IGNyb3NzIGEgNjRLIGJvdW5kYXJ5ICAgICovCi0KLSAgICBLYmRDaGFySW4oJmtleSxJT19XQUlULDApOwotICAgIHJldHVybiBrZXkuY2hDaGFyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU9wZW4gYSBmdWxsc2NyZWVuIGNvbnNvbGUgZm9yIG91dHB1dCB0byB0aGUgc2NyZWVuLiBUaGlzIHJlcXVpcmVzIHRoYXQKLXRoZSBhcHBsaWNhdGlvbiBiZSBhIGZ1bGxzY3JlZW4gVklPIHByb2dyYW0uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUE1fSFdORCBQTUFQSSBQTV9vcGVuQ29uc29sZSgKLSAgICBQTV9IV05EIGh3bmRVc2VyLAotICAgIGludCBkZXZpY2UsCi0gICAgaW50IHhSZXMsCi0gICAgaW50IHlSZXMsCi0gICAgaW50IGJwcCwKLSAgICBpYm9vbCBmdWxsU2NyZWVuKQotewotICAgICh2b2lkKWh3bmRVc2VyOwotICAgICh2b2lkKWRldmljZTsKLSAgICAodm9pZCl4UmVzOwotICAgICh2b2lkKXlSZXM7Ci0gICAgKHZvaWQpYnBwOwotICAgICh2b2lkKWZ1bGxTY3JlZW47Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRmluZCB0aGUgc2l6ZSBvZiB0aGUgY29uc29sZSBzdGF0ZSBidWZmZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2dldENvbnNvbGVTdGF0ZVNpemUodm9pZCkKLXsKLSAgICBWSU9NT0RFSU5GTyB2bWk7Ci0gICAgdm1pLmNiID0gc2l6ZW9mIChWSU9NT0RFSU5GTyk7Ci0gICAgVmlvR2V0TW9kZSAoJnZtaSwgKEhWSU8pMCk7Ci0gICAgcmV0dXJuIHNpemVvZiAoQ09OU09MRV9TQVZFKSAtIDEgKyB2bWkuY29sICogdm1pLnJvdyAqIDI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2F2ZSB0aGUgc3RhdGUgb2YgdGhlIGNvbnNvbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zYXZlQ29uc29sZVN0YXRlKAotICAgIHZvaWQgKnN0YXRlQnVmLAotICAgIFBNX0hXTkQgaHduZENvbnNvbGUpCi17Ci0gICAgVVNIT1JUICAgICAgICAgIGZibGVuOwotICAgIENPTlNPTEVfU0FWRSAgICAqY3MgPSAoQ09OU09MRV9TQVZFKilzdGF0ZUJ1ZjsKLSAgICBWSU9NT0RFSU5GTyAgICAgdm1pOwotCi0gICAgLyogVGhlIHJlYXNvbiBmb3IgdGhlIFZJT01PREVJTkZPIGp1Z2dsaW5nIGlzIDE2LWJpdCBjb2RlLiBCZWNhdXNlIHRoZSB1c2VyCi0gICAgICogYWxsb2NhdGVzIHRoZSBzdGF0ZSBidWZmZXIsIGNkLT52bWkgbWlnaHQgYmUgY3Jvc3NpbmcgdGhlIDY0SyBib3VuZGFyeSBhbmQKLSAgICAgKiB0aGUgMTYtYml0IEFQSSB3b3VsZCBmYWlsLiBJZiB3ZSBjcmVhdGUgYW5vdGhlciBjb3B5IG9uIHN0YWNrLCB0aGUgY29tcGlsZXIKLSAgICAgKiBzaG91bGQgZW5zdXJlIHRoYXQgdGhlIDY0SyBib3VuZGFyeSB3aWxsIG5vdCBiZSBjcm9zc2VkIChpdCBhZGp1c3RzIHRoZSBzdGFjawotICAgICAqIGlmIGl0IHNob3VsZCBjcm9zcykuCi0gICAgICovCi0gICAgdm1pLmNiID0gc2l6ZW9mKFZJT01PREVJTkZPKTsKLSAgICBWaW9HZXRNb2RlKCZ2bWksKEhWSU8pMCk7Ci0gICAgbWVtY3B5KCZjcy0+dm1pLCAmdm1pLCBzaXplb2YoVklPTU9ERUlORk8pKTsKLSAgICBWaW9HZXRDdXJQb3MoJmNzLT5DdXJzb3JZLCAmY3MtPkN1cnNvclgsIChIVklPKTApOwotICAgIGZibGVuID0gY3MtPnZtaS5jb2wgKiBjcy0+dm1pLnJvdyAqIDI7Ci0gICAgVmlvUmVhZENlbGxTdHIoKFBDSCljcy0+RnJhbWVCdWZmZXIsICZmYmxlbiwgMCwgMCwgKEhWSU8pMCk7Ci19Ci0KLS8qIEdsb2JhbCB2YXJpYWJsZSB0byBjb21tdW5pY2F0ZSBiZXR3ZWVuIHRocmVhZHMgKi8KLXN0YXRpYyBTRVNXSVRDSFJFQyBTZXNTd2l0Y2hSZWMgPSB7IC0xIH07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbGVkIGJ5IGV4dGVybmFsIHJvdXRpbmVzIGF0IGxlYXN0IG9uY2UgcGVyIGZyYW1lIHRvIGNoZWNrIHdoZW5ldmVyIGEKLXNlc3Npb24gc2F2ZS9yZXN0b3JlIHNob3VsZCBiZSBwZXJmb3JtZWQuIFNpbmNlIHdlIHJlY2VpdmUgc3VjaCBub3RpZmljYXRpb25zCi1hc3luY3Jvbm91c2x5LCB3ZSBjYW4ndCBwZXJmb3JtIGFsbCByZXF1aXJlZCBvcGVyYXRpb25zIGF0IHRoYXQgdGltZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9fUE1fY2hlY2tDb25zb2xlU3dpdGNoKHZvaWQpCi17Ci0gICAgaW50ICAgICAgICAgICAgIEZsYWdzLCBNb2RlOwotICAgIFBNX3NhdmVTdGF0ZV9jYiBDYWxsYmFjazsKLQotICAgIC8qIFF1aWNrIG9wdGltaXplZCBwYXRoIGZvciBtb3N0IGNvbW1vbiBjYXNlICovCi0gICAgaWYgKFNlc1N3aXRjaFJlYy5GbGFncyA9PSAtMSkKLQlyZXR1cm47Ci0KLWFnYWluOgotICAgIGlmIChEb3NSZXF1ZXN0TXV0ZXhTZW0oU2VzU3dpdGNoUmVjLk11dGV4LCAxMDApKQotCXJldHVybjsKLSAgICBGbGFncyA9IFNlc1N3aXRjaFJlYy5GbGFnczsKLSAgICBDYWxsYmFjayA9IFNlc1N3aXRjaFJlYy5DYWxsYmFjazsKLSAgICBTZXNTd2l0Y2hSZWMuRmxhZ3MgPSAtMTsKLSAgICBEb3NSZWxlYXNlTXV0ZXhTZW0oU2VzU3dpdGNoUmVjLk11dGV4KTsKLQotICAgIGlzU2Vzc2lvblN3aXRjaGluZyA9IHRydWU7ICAgICAgICAgICAgLyogUHJldmVudCBWSU8gY2FsbHMgKi8KLSAgICBNb2RlID0gQ2FsbGJhY2soRmxhZ3MpOwotICAgIGlzU2Vzc2lvblN3aXRjaGluZyA9IGZhbHNlOwotICAgIERvc1Bvc3RFdmVudFNlbShTZXNTd2l0Y2hSZWMuRXZlbnQpOwotICAgIGlmIChGbGFncyA9PSBQTV9ERUFDVElWQVRFICYmIE1vZGUgPT0gUE1fU1VTUEVORF9BUFApCi0JLyogU3VzcGVuZCBhcHBsaWNhdGlvbiB1bnRpbCB3ZSBzd2l0Y2ggYmFjayB0byBvdXIgYXBwbGljYXRpb24gKi8KLQlmb3IgKDs7KSB7Ci0JICAgIERvc1NsZWVwICg1MDApOwotCSAgICAvKiBTZXNTd2l0Y2hSZWMuRmxhZ3MgaXMgdm9sYXRpbGUgc28gb3B0aW1pemVyCi0JICAgICAqIHdvbid0IGxvYWQgaXQgaW50byBhIHJlZ2lzdGVyCi0JICAgICAqLwotCSAgICBpZiAoU2VzU3dpdGNoUmVjLkZsYWdzICE9IC0xKQotCQlnb3RvIGFnYWluOwotCSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotV2FpdHMgdW50aWwgbWFpbiB0aHJlYWQgcHJvY2Vzc2VzIHRoZSBzZXNzaW9uIHN3aXRjaCBldmVudC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfUE1fU2Vzc2lvblN3aXRjaEV2ZW50KAotICAgIFBNX3NhdmVTdGF0ZV9jYiBzYXZlU3RhdGUsCi0gICAgaW50IGZsYWdzKQotewotICAgIFVMT05HIENvdW50OwotCi0gICAgaWYgKERvc1JlcXVlc3RNdXRleFNlbShTZXNTd2l0Y2hSZWMuTXV0ZXgsIDEwMDAwKSkKLQlyZXR1cm47Ci0KLSAgICAvKiBXZSdyZSBnb2luZyB0byB3YWl0IG9uIHRoYXQgc2VtYXBob3JlICovCi0gICAgRG9zUmVzZXRFdmVudFNlbShTZXNTd2l0Y2hSZWMuRXZlbnQsICZDb3VudCk7Ci0gICAgU2VzU3dpdGNoUmVjLkNhbGxiYWNrID0gc2F2ZVN0YXRlOwotICAgIFNlc1N3aXRjaFJlYy5GbGFncyA9IGZsYWdzOwotICAgIERvc1JlbGVhc2VNdXRleFNlbShTZXNTd2l0Y2hSZWMuTXV0ZXgpOwotCi0gICAgLyogTm93IHdhaXQgdW50aWwgYWxsIHJlcXVpcmVkIG9wZXJhdGlvbnMgYXJlIGNvbXBsZXRlICovCi0gICAgRG9zV2FpdEV2ZW50U2VtIChTZXNTd2l0Y2hSZWMuRXZlbnQsIDEwMDAwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGlzIHRoZSB0aHJlYWQgcmVzcG9uc2libGUgZm9yIHRyYWNraW5nIHN3aXRjaGVzIGJhY2sgdG8gb3VyCi1mdWxsc2NyZWVuIHNlc3Npb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX1BNX0NvbnNvbGVTd2l0Y2goCi0gICAgUE1fc2F2ZVN0YXRlX2NiIHNhdmVTdGF0ZSkKLXsKLSAgICBVU0hPUlQgTm90aWZ5VHlwZTsKLQotICAgIGZvciAoOzspIHsKLQlpZiAoVmlvTW9kZVdhaXQoVk1XUl9QT1BVUCwgJk5vdGlmeVR5cGUsIDApICE9IDApCi0JICAgIGJyZWFrOwotCV9QTV9TZXNzaW9uU3dpdGNoRXZlbnQoc2F2ZVN0YXRlLCBQTV9SRUFDVElWQVRFKTsKLQl9Ci0gICAgVmlvTW9kZVVuZG8oVU5ET0lfUkVMRUFTRU9XTkVSLCBVTkRPS19FUlJPUkNPREUsIChIVklPKTApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgaXMgdGhlIHRocmVhZCByZXNwb25zaWJsZSBmb3IgdHJhY2tpbmcgc2NyZWVuIHBvcHVwcyAodXN1YWxseSBmYXRhbAotZXJyb3IgaGFuZGxlciB1c2VzIHRoZW0pLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9QTV9Db25zb2xlUG9wdXAoCi0gICAgUE1fc2F2ZVN0YXRlX2NiIHNhdmVTdGF0ZSkKLXsKLSAgICBVU0hPUlQgTm90aWZ5VHlwZTsKLSAgICBmb3IgKDs7KSB7Ci0JaWYgKFZpb1NhdlJlZHJhd1dhaXQoVlNSV0lfU0FWRUFORFJFRFJBVywgJk5vdGlmeVR5cGUsIDApICE9IDApCi0JICAgIGJyZWFrOwotCWlmIChOb3RpZnlUeXBlID09IFZTUldOX1NBVkUpCi0JICAgIF9QTV9TZXNzaW9uU3dpdGNoRXZlbnQoc2F2ZVN0YXRlLCBQTV9ERUFDVElWQVRFKTsKLQllbHNlIGlmIChOb3RpZnlUeXBlID09IFZTUldOX1JFRFJBVykKLQkgICAgX1BNX1Nlc3Npb25Td2l0Y2hFdmVudChzYXZlU3RhdGUsIFBNX1JFQUNUSVZBVEUpOwotCX0KLSAgICBWaW9TYXZSZWRyYXdVbmRvKFVORE9JX1JFTEVBU0VPV05FUiwgVU5ET0tfRVJST1JDT0RFLCAoSFZJTykwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIHN1c3BlbmQgYXBwbGljYXRpb24gY2FsbGJhY2sgZm9yIHRoZSBmdWxsc2NyZWVuIGNvbnNvbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2soCi0gICAgUE1fc2F2ZVN0YXRlX2NiIHNhdmVTdGF0ZSkKLXsKLSAgICAvKiBJZiBQTSBpc24ndCBsb2FkZWQsIHRoaXMgc3R1ZmYgd2lsbCBjYXVzZSBjcmFzaGVzISAqLwotICAgIGlmIChfX2lzU2hlbGxMb2FkZWQoKSkgewotCWlmIChzYXZlU3RhdGUpIHsKLQkgICAgLyogQ3JlYXRlIHRoZSB0aHJlYWRzIHJlc3BvbnNpYmxlIGZvciB0cmFja2luZyBjb25zb2xlIHN3aXRjaGVzICovCi0JICAgIFNlc1N3aXRjaFJlYy5GbGFncyA9IC0xOwotCSAgICBEb3NDcmVhdGVNdXRleFNlbShOVUxMLCAmU2VzU3dpdGNoUmVjLk11dGV4LCAwLCBGQUxTRSk7Ci0JICAgIERvc0NyZWF0ZUV2ZW50U2VtKE5VTEwsICZTZXNTd2l0Y2hSZWMuRXZlbnQsIDAsIEZBTFNFKTsKLQkgICAgX2JlZ2ludGhyZWFkICgodm9pZCgqKSh2b2lkKikpX1BNX0NvbnNvbGVTd2l0Y2gsTlVMTCxTRVNTSU9OX1NXSVRDSF9TVEFDS19TSVpFLCAodm9pZCopc2F2ZVN0YXRlKTsKLQkgICAgX2JlZ2ludGhyZWFkICgodm9pZCgqKSh2b2lkKikpX1BNX0NvbnNvbGVQb3B1cCxOVUxMLFNFU1NJT05fU1dJVENIX1NUQUNLX1NJWkUsICh2b2lkKilzYXZlU3RhdGUpOwotCSAgICB9Ci0JZWxzZSB7Ci0JICAgIC8qIEtpbGwgdGhlIHRocmVhZHMgcmVzcG9uc2libGUgZm9yIHRyYWNraW5nIGNvbnNvbGUgc3dpdGNoZXMgKi8KLQkgICAgVmlvTW9kZVVuZG8oVU5ET0lfUkVMRUFTRU9XTkVSLCBVTkRPS19URVJNSU5BVEUsIChIVklPKTApOwotCSAgICBWaW9TYXZSZWRyYXdVbmRvKFVORE9JX1JFTEVBU0VPV05FUiwgVU5ET0tfVEVSTUlOQVRFLCAoSFZJTykwKTsKLQkgICAgRG9zQ2xvc2VFdmVudFNlbShTZXNTd2l0Y2hSZWMuRXZlbnQpOwotCSAgICBEb3NDbG9zZU11dGV4U2VtKFNlc1N3aXRjaFJlYy5NdXRleCk7Ci0JICAgIH0KLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVzdG9yZSB0aGUgY29uc29sZSBzdGF0ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVDb25zb2xlU3RhdGUoCi0gICAgY29uc3Qgdm9pZCAqc3RhdGVCdWYsCi0gICAgUE1fSFdORCBod25kQ29uc29sZSkKLXsKLSAgICBDT05TT0xFX1NBVkUgKmNzID0gKENPTlNPTEVfU0FWRSAqKXN0YXRlQnVmOwotICAgIFZJT01PREVJTkZPICB2bWk7Ci0KLSAgICBpZiAoIWNzKQotCXJldHVybjsKLQotICAgIG1lbWNweSgmdm1pLCAmY3MtPnZtaSwgc2l6ZW9mIChWSU9NT0RFSU5GTykpOwotICAgIFZpb1NldE1vZGUoJnZtaSwgKEhWSU8pMCk7Ci0gICAgVmlvU2V0Q3VyUG9zKGNzLT5DdXJzb3JZLCBjcy0+Q3Vyc29yWCwgKEhWSU8pMCk7Ci0gICAgVmlvV3J0Q2VsbFN0cigoUENIKWNzLT5GcmFtZUJ1ZmZlciwgY3MtPnZtaS5jb2wgKiBjcy0+dm1pLnJvdyAqIDIsMCwgMCwgKEhWSU8pMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2xvc2UgdGhlIGZ1bGxzY3JlZW4gY29uc29sZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2Nsb3NlQ29uc29sZSgKLSAgICBQTV9IV05EIGh3bmRDb25zb2xlKQotewotICAgIC8qIEtpbGwgdGhlIHRocmVhZHMgcmVzcG9uc2libGUgZm9yIHRyYWNraW5nIGNvbnNvbGUgc3dpdGNoZXMgKi8KLSAgICBQTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2soTlVMTCk7Ci0gICAgKHZvaWQpaHduZENvbnNvbGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgT1MgY29uc29sZSBjdXJzb3IuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTV9zZXRPU0N1cnNvckxvY2F0aW9uKAotICAgIGludCB4LAotICAgIGludCB5KQotewotICAgIC8qIElmIHNlc3Npb24gc3dpdGNoIGlzIGluIHByb2dyZXNzLCBjYWxsaW5nIGludG8gVklPIGNhdXNlcyBkZWFkbG9ja3MhICovCi0gICAgLyogQWxzbyB0aGlzIGNhbGwgdG8gVklPIHNjcmV3cyB1cCBvdXIgY29uc29sZSBsaWJyYXJ5IG9uIERCQ1MgYm94ZXMuLi4gKi8KLSAgICBpZiAoIWlzU2Vzc2lvblN3aXRjaGluZyAmJiAhX19Jc0RCQ1NTeXN0ZW0oKSkKLQlWaW9TZXRDdXJQb3MoeSx4LDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNldCB0aGUgd2lkdGggb2YgdGhlIE9TIGNvbnNvbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTV9zZXRPU1NjcmVlbldpZHRoKAotICAgIGludCB3aWR0aCwKLSAgICBpbnQgaGVpZ2h0KQotewotICAgIC8qIE5vdGhpbmcgdG8gZG8gaW4gaGVyZSAqLwotICAgICh2b2lkKXdpZHRoOwotICAgICh2b2lkKWhlaWdodDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIHJlYWwgdGltZSBjbG9jayBoYW5kbGVyICh1c2VkIGZvciBzb2Z0d2FyZSBzdGVyZW8gbW9kZXMpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tIYW5kbGVyKAotICAgIFBNX2ludEhhbmRsZXIgaWgsCi0gICAgaW50IGZyZXF1ZW5jeSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyEgKi8KLSAgICAodm9pZClpaDsKLSAgICAodm9pZClmcmVxdWVuY3k7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNldCB0aGUgcmVhbCB0aW1lIGNsb2NrIGZyZXF1ZW5jeSAoZm9yIHN0ZXJlbyBtb2RlcykuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KAotICAgIGludCBmcmVxdWVuY3kpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMhICovCi0gICAgKHZvaWQpZnJlcXVlbmN5OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlc3RvcmUgdGhlIG9yaWdpbmFsIHJlYWwgdGltZSBjbG9jayBoYW5kbGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZVJlYWxUaW1lQ2xvY2tIYW5kbGVyKHZvaWQpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMhICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBjdXJyZW50IG9wZXJhdGluZyBzeXN0ZW0gcGF0aCBvciB3b3JraW5nIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jaGFyICogUE1BUEkgUE1fZ2V0Q3VycmVudFBhdGgoCi0gICAgY2hhciAqcGF0aCwKLSAgICBpbnQgbWF4TGVuKQotewotICAgIHJldHVybiBnZXRjd2QocGF0aCxtYXhMZW4pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgZHJpdmUgbGV0dGVyIGZvciB0aGUgYm9vdCBkcml2ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jaGFyIFBNQVBJIFBNX2dldEJvb3REcml2ZSh2b2lkKQotewotICAgIHVsb25nICAgYm9vdCA9IDM7Ci0gICAgRG9zUXVlcnlTeXNJbmZvKFFTVl9CT09UX0RSSVZFLFFTVl9CT09UX0RSSVZFLCZib290LHNpemVvZihib290KSk7Ci0gICAgcmV0dXJuIChjaGFyKSgnYScgKyBib290IC0gMSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBWQkUvQUYgZHJpdmVyIGZpbGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRWQkVBRlBhdGgodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBwYXRoW0NDSE1BWFBBVEhdOwotICAgIHN0cmNweShwYXRoLCJ4OlxcIik7Ci0gICAgcGF0aFswXSA9IFBNX2dldEJvb3REcml2ZSgpOwotICAgIHJldHVybiBwYXRoOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgcGF0aCB0byB0aGUgTnVjbGV1cyBkcml2ZXIgZmlsZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNQYXRoKHZvaWQpCi17Ci0gICAgc3RhdGljIGNoYXIgcGF0aFtDQ0hNQVhQQVRIXTsKLSAgICBpZiAoZ2V0ZW52KCJOVUNMRVVTX1BBVEgiKSAhPSBOVUxMKQotCXJldHVybiBnZXRlbnYoIk5VQ0xFVVNfUEFUSCIpOwotICAgIHN0cmNweShwYXRoLCJ4Olxcb3MyXFxkcml2ZXJzIik7Ci0gICAgcGF0aFswXSA9IFBNX2dldEJvb3REcml2ZSgpOwotICAgIFBNX2JhY2tzbGFzaChwYXRoKTsKLSAgICBzdHJjYXQocGF0aCwibnVjbGV1cyIpOwotICAgIHJldHVybiBwYXRoOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgcGF0aCB0byB0aGUgTnVjbGV1cyBjb25maWd1cmF0aW9uIGZpbGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIHBhdGhbQ0NITUFYUEFUSF07Ci0gICAgc3RyY3B5KHBhdGgsUE1fZ2V0TnVjbGV1c1BhdGgoKSk7Ci0gICAgUE1fYmFja3NsYXNoKHBhdGgpOwotICAgIHN0cmNhdChwYXRoLCJjb25maWciKTsKLSAgICByZXR1cm4gcGF0aDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG1hY2hpbmUgaWYgcG9zc2libGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFVuaXF1ZUlEKHZvaWQpCi17Ci0gICAgcmV0dXJuIFBNX2dldE1hY2hpbmVOYW1lKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotR2V0IHRoZSBuYW1lIG9mIHRoZSBtYWNoaW5lIG9uIHRoZSBuZXR3b3JrLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRNYWNoaW5lTmFtZSh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIG5hbWVbNDBdLCplbnY7Ci0KLSAgICBpZiAoKGVudiA9IGdldGVudigiSE9TVE5BTUUiKSkgIT0gTlVMTCkgewotCXN0cm5jcHkobmFtZSxlbnYsc2l6ZW9mKG5hbWUpKTsKLQluYW1lW3NpemVvZihuYW1lKS0xXSA9IDA7Ci0JcmV0dXJuIG5hbWU7Ci0JfQotICAgIHJldHVybiAiT1MyIjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gYSBwb2ludGVyIHRvIHRoZSByZWFsIG1vZGUgQklPUyBkYXRhIGFyZWEuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2dldEJJT1NQb2ludGVyKHZvaWQpCi17Ci0gICAgUE1faW5pdCgpOwotICAgIHJldHVybiBsb3dNZW0gKyAweDQwMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gYSBwb2ludGVyIHRvIDB4QTAwMDAgcGh5c2ljYWwgVkdBIGdyYXBoaWNzIGZyYW1lYnVmZmVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9nZXRBMDAwMFBvaW50ZXIodm9pZCkKLXsKLSAgICBQTV9pbml0KCk7Ci0gICAgcmV0dXJuIGxvd01lbSArIDB4QTAwMDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTWFwIGEgcGh5c2ljYWwgYWRkcmVzcyB0byBhIGxpbmVhciBhZGRyZXNzIGluIHRoZSBjYWxsZXJzIHByb2Nlc3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX21hcFBoeXNpY2FsQWRkcigKLSAgICB1bG9uZyBiYXNlLAotICAgIHVsb25nIGxpbWl0LAotICAgIGlib29sIGlzQ2FjaGVkKQotewotICAgIHVsb25nICAgYmFzZUFkZHIsYmFzZU9mcyxsaW5lYXI7Ci0KLSAgICAvKiBSb3VuZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyB0byBhIDRLYiBib3VuZGFyeSBhbmQgdGhlIGxpbWl0IHRvIGEKLSAgICAgKiA0S2ItMSBib3VuZGFyeSBiZWZvcmUgcGFzc2luZyB0aGUgdmFsdWVzIHRvIG1tYXAuIElmIHdlIHJvdW5kIHRoZQotICAgICAqIHBoeXNpY2FsIGFkZHJlc3MsIHRoZW4gd2UgYWxzbyBhZGQgYW4gZXh0cmEgb2Zmc2V0IGludG8gdGhlIGFkZHJlc3MKLSAgICAgKiB0aGF0IHdlIHJldHVybi4KLSAgICAgKi8KLSAgICBiYXNlT2ZzID0gYmFzZSAmIDQwOTU7Ci0gICAgYmFzZUFkZHIgPSBiYXNlICYgfjQwOTU7Ci0gICAgbGltaXQgPSAoKGxpbWl0K2Jhc2VPZnMrMSs0MDk1KSAmIH40MDk1KS0xOwotICAgIHBhcm1zSW5bMF0gPSBiYXNlQWRkcjsKLSAgICBwYXJtc0luWzFdID0gbGltaXQ7Ci0gICAgcGFybXNJblsyXSA9IGlzQ2FjaGVkOwotICAgIGlmICgobGluZWFyID0gQ2FsbFNEREhlbHAoUE1IRUxQX01BUFBIWVMpKSA9PSAwKQotCXJldHVybiBOVUxMOwotICAgIHJldHVybiAodm9pZCopKGxpbmVhciArIGJhc2VPZnMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZyZWUgYSBwaHlzaWNhbCBhZGRyZXNzIG1hcHBpbmcgYWxsb2NhdGVkIGJ5IFBNX21hcFBoeXNpY2FsQWRkci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVQaHlzaWNhbEFkZHIoCi0gICAgdm9pZCAqcHRyLAotICAgIHVsb25nIGxpbWl0KQotewotICAgIHBhcm1zSW5bMF0gPSAodWxvbmcpcHRyOwotICAgIHBhcm1zSW5bMV0gPSBsaW1pdDsKLSAgICBDYWxsU0RESGVscChQTUhFTFBfRlJFRVBIWVMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZpbmQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBsaW5lYXIgbWVtb3J5IGFkZHJlc3MgaW4gY3VycmVudCBwcm9jZXNzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkcigKLSAgICB2b2lkICpwKQotewotICAgIHBhcm1zSW5bMF0gPSAodWxvbmcpcDsKLSAgICByZXR1cm4gQ2FsbFNEREhlbHAoUE1IRUxQX0dFVFBIWVNJQ0FMQUREUik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRmluZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIGxpbmVhciBtZW1vcnkgYWRkcmVzcyBpbiBjdXJyZW50IHByb2Nlc3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyUmFuZ2UoCi0gICAgdm9pZCAqcCwKLSAgICB1bG9uZyBsZW5ndGgsCi0gICAgdWxvbmcgKnBoeXNBZGRyZXNzKQotewotICAgIHBhcm1zSW5bMF0gPSAodWxvbmcpcDsKLSAgICBwYXJtc0luWzFdID0gKHVsb25nKWxlbmd0aDsKLSAgICBwYXJtc0luWzJdID0gKHVsb25nKXBoeXNBZGRyZXNzOwotICAgIHJldHVybiBDYWxsU0RESGVscChQTUhFTFBfR0VUUEhZU0lDQUxBRERSUkFOR0UpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNsZWVwIGZvciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zbGVlcCgKLSAgICB1bG9uZyBtaWxsaXNlY29uZHMpCi17Ci0gICAgRG9zU2xlZXAobWlsbGlzZWNvbmRzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIGJhc2UgSS9PIHBvcnQgZm9yIHRoZSBzcGVjaWZpZWQgQ09NIHBvcnQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2dldENPTVBvcnQoCi0gICAgaW50IHBvcnQpCi17Ci0gICAgc3dpdGNoIChwb3J0KSB7Ci0JY2FzZSAwOiByZXR1cm4gMHgzRjg7Ci0JY2FzZSAxOiByZXR1cm4gMHgyRjg7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgYmFzZSBJL08gcG9ydCBmb3IgdGhlIHNwZWNpZmllZCBMUFQgcG9ydC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZ2V0TFBUUG9ydCgKLSAgICBpbnQgcG9ydCkKLXsKLSAgICBzd2l0Y2ggKHBvcnQpIHsKLQljYXNlIDA6IHJldHVybiAweDNCQzsKLQljYXNlIDE6IHJldHVybiAweDM3ODsKLQljYXNlIDI6IHJldHVybiAweDI3ODsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGUgYSBibG9jayBvZiBzaGFyZWQgbWVtb3J5LiBGb3IgV2luOXggd2UgYWxsb2NhdGUgc2hhcmVkIG1lbW9yeQotYXMgbG9ja2VkLCBnbG9iYWwgbWVtb3J5IHRoYXQgaXMgYWNjZXNzaWJsZSBmcm9tIGFueSBtZW1vcnkgY29udGV4dAotKGluY2x1ZGluZyBpbnRlcnJ1cHQgdGltZSBjb250ZXh0KSwgd2hpY2ggYWxsb3dzIHVzIHRvIGxvYWQgb3VyIGltcG9ydGFudAotZGF0YSBzdHJ1Y3R1cmUgYW5kIGNvZGUgc3VjaCB0aGF0IHdlIGNhbiBhY2Nlc3MgaXQgZGlyZWN0bHkgZnJvbSBhIHJpbmcKLTAgaW50ZXJydXB0IGNvbnRleHQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX21hbGxvY1NoYXJlZCgKLSAgICBsb25nIHNpemUpCi17Ci0gICAgcGFybXNJblswXSA9IHNpemU7Ci0gICAgcmV0dXJuICh2b2lkKilDYWxsU0RESGVscChQTUhFTFBfTUFMTE9DU0hBUkVEKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgYmxvY2sgb2Ygc2hhcmVkIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVTaGFyZWQoCi0gICAgdm9pZCAqcHRyKQotewotICAgIHBhcm1zSW5bMF0gPSAodWxvbmcpcHRyOwotICAgIENhbGxTRERIZWxwKFBNSEVMUF9GUkVFU0hBUkVEKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1NYXAgYSBsaW5lYXIgbWVtb3J5IGFkZHJlc3MgdG8gdGhlIGNhbGxpbmcgcHJvY2VzcyBhZGRyZXNzIHNwYWNlLiBUaGUKLWFkZHJlc3Mgd2lsbCBoYXZlIGJlZW4gYWxsb2NhdGVkIGluIGFub3RoZXIgcHJvY2VzcyB1c2luZyB0aGUKLVBNX21hcFBoeXNpY2FsQWRkciBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbWFwVG9Qcm9jZXNzKAotICAgIHZvaWQgKmJhc2UsCi0gICAgdWxvbmcgbGltaXQpCi17Ci0gICAgdWxvbmcgICBiYXNlQWRkcixiYXNlT2ZzOwotCi0gICAgLyogUm91bmQgdGhlIHBoeXNpY2FsIGFkZHJlc3MgdG8gYSA0S2IgYm91bmRhcnkgYW5kIHRoZSBsaW1pdCB0byBhCi0gICAgICogNEtiLTEgYm91bmRhcnkgYmVmb3JlIHBhc3NpbmcgdGhlIHZhbHVlcyB0byBtbWFwLiBJZiB3ZSByb3VuZCB0aGUKLSAgICAgKiBwaHlzaWNhbCBhZGRyZXNzLCB0aGVuIHdlIGFsc28gYWRkIGFuIGV4dHJhIG9mZnNldCBpbnRvIHRoZSBhZGRyZXNzCi0gICAgICogdGhhdCB3ZSByZXR1cm4uCi0gICAgICovCi0gICAgYmFzZU9mcyA9ICh1bG9uZyliYXNlICYgNDA5NTsKLSAgICBiYXNlQWRkciA9ICh1bG9uZyliYXNlICYgfjQwOTU7Ci0gICAgbGltaXQgPSAoKGxpbWl0K2Jhc2VPZnMrMSs0MDk1KSAmIH40MDk1KS0xOwotICAgIHBhcm1zSW5bMF0gPSAodWxvbmcpYmFzZUFkZHI7Ci0gICAgcGFybXNJblsxXSA9IGxpbWl0OwotICAgIHJldHVybiAodm9pZCopKENhbGxTRERIZWxwKFBNSEVMUF9NQVBUT1BST0NFU1MpK2Jhc2VPZnMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU1hcCBhIHJlYWwgbW9kZSBwb2ludGVyIHRvIGEgcHJvdGVjdGVkIG1vZGUgcG9pbnRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbWFwUmVhbFBvaW50ZXIoCi0gICAgdWludCByX3NlZywKLSAgICB1aW50IHJfb2ZmKQotewotICAgIGlmIChyX3NlZyA9PSAweEZGRkYpCi0JcmV0dXJuICZSTUJ1ZltyX29mZl07Ci0gICAgcmV0dXJuIGxvd01lbSArIE1LX1BIWVMocl9zZWcscl9vZmYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlIGEgYmxvY2sgb2YgcmVhbCBtb2RlIG1lbW9yeQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY1JlYWxTZWcoCi0gICAgdWludCBzaXplLAotICAgIHVpbnQgKnJfc2VnLAotICAgIHVpbnQgKnJfb2ZmKQotewotICAgIGlmIChzaXplID4gc2l6ZW9mKFJNQnVmKSkKLQlyZXR1cm4gTlVMTDsKLSAgICAqcl9zZWcgPSAweEZGRkY7Ci0gICAgKnJfb2ZmID0gMHgwMDAwOwotICAgIHJldHVybiAmUk1CdWY7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnJlZSBhIGJsb2NrIG9mIHJlYWwgbW9kZSBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlUmVhbFNlZygKLSAgICB2b2lkICptZW0pCi17Ci0gICAgLyogTm90aGluZyB0byBkbyBpbiBoZXJlICovCi0gICAgKHZvaWQpbWVtOwotfQotCi0jZGVmaW5lIElORFBNSShyZWcpICAgICBybXJlZ3MuYUNSRi5yZWdfIyNyZWcgPSByZWdzLT5yZWcKLSNkZWZpbmUgT1VURFBNSShyZWcpICAgIHJlZ3MtPnJlZyA9IHJtcmVncy5hQ1JGLnJlZ18jI3JlZwotCi0jZGVmaW5lIFJFR19PRkZTRVQoZmllbGQpICAoKChVTE9ORykmKCgoVkNSRiopMCktPmZpZWxkKSkgIC8gc2l6ZW9mKFVMT05HKSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jc3N1ZSBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQgKHBhcmFtZXRlcnMgaW4gRFBNSSBjb21wYXRpYmxlIHN0cnVjdHVyZSkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIERQTUlfaW50ODYoCi0gICAgaW50IGludG5vLAotICAgIERQTUlfcmVncyAqcmVncykKLXsKLSAgICBJTlRDUkYgIHJtcmVnczsKLSAgICB1bG9uZyAgIGVheCA9IDA7Ci0KLSAgICBpZiAoIUluaXRJbnQxMCgpKQotCXJldHVybjsKLSAgICBtZW1zZXQoJnJtcmVncywgMCwgc2l6ZW9mKHJtcmVncykpOwotICAgIHJtcmVncy51bEJJT1NJbnRObyA9IGludG5vOwotICAgIElORFBNSShlYXgpOyBJTkRQTUkoZWJ4KTsgSU5EUE1JKGVjeCk7IElORFBNSShlZHgpOyBJTkRQTUkoZXNpKTsgSU5EUE1JKGVkaSk7Ci0gICAgcm1yZWdzLmFDUkYucmVnX2RzID0gcmVncy0+ZHM7Ci0gICAgcm1yZWdzLmFDUkYucmVnX2VzID0gcmVncy0+ZXM7Ci0gICAgaWYgKGludG5vID09IDB4MTApIHsKLQllYXggPSBybXJlZ3MuYUNSRi5yZWdfZWF4OwotCXN3aXRjaCAoZWF4ICYgMHhGRkZGKSB7Ci0JICAgIGNhc2UgMHg0RjAwOgotCQkvKiBXZSBoYXZlIHRvIGhhY2sgdGhlIHdheSB0aGlzIGZ1bmN0aW9uIHdvcmtzLCBkdWUgdG8KLQkJICogc29tZSBidWdzIGluIHRoZSBJQk0gbWluaS1WRE0gQklPUyBzdXBwb3J0LiBTcGVjaWZpY2FsbHkKLQkJICogd2UgbmVlZCB0byBtYWtlIHRoZSBpbnB1dCBidWZmZXIgYW5kIG91dHB1dCBidWZmZXIgdGhlCi0JCSAqICdzYW1lJyBidWZmZXIsIGFuZCB0aGF0IEVTOlNJIHBvaW50cyB0byB0aGUgb3V0cHV0Ci0JCSAqIGJ1ZmZlciAoaWdub3JlZCBieSB0aGUgQklPUykuIFRoZSBkYXRhIHdpbGwgZW5kIHVwCi0JCSAqIGJlaW5nIHJldHVybmVkIGluIHRoZSBpbnB1dCBidWZmZXIsIGV4Y2VwdCBmb3IgdGhlCi0JCSAqIGZpcnN0IGZvdXIgYnl0ZXMgKCdWRVNBJykgdGhhdCB3aWxsIG5vdCBiZSByZXR1cm5lZC4KLQkJICovCi0JCXJtcmVncy5wQlswXS5iQnVmZmVyVHlwZSA9IElOUFVUX0JVRkZFUjsKLQkJcm1yZWdzLnBCWzBdLmJTZWxDUkYgPSBSRUdfT0ZGU0VUKHJlZ19lcyk7Ci0JCXJtcmVncy5wQlswXS5iT2ZmQ1JGID0gUkVHX09GRlNFVChyZWdfZWRpKTsKLQkJcm1yZWdzLnBCWzBdLnBBZGRyZXNzID0gUk1CdWY7Ci0JCXJtcmVncy5wQlswXS51bFNpemUgPSA0OwotCQlybXJlZ3MucEJbMV0uYkJ1ZmZlclR5cGUgPSBPVVRQVVRfQlVGRkVSOwotCQlybXJlZ3MucEJbMV0uYlNlbENSRiA9IFJFR19PRkZTRVQocmVnX2VzKTsKLQkJcm1yZWdzLnBCWzFdLmJPZmZDUkYgPSBSRUdfT0ZGU0VUKHJlZ19lc2kpOwotCQlybXJlZ3MucEJbMV0ucEFkZHJlc3MgPSAoKFBCWVRFKVJNQnVmKSs0OwotCQlybXJlZ3MucEJbMV0udWxTaXplID0gNTEyLTQ7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDB4NEYwMToKLQkJcm1yZWdzLnBCWzBdLmJCdWZmZXJUeXBlID0gT1VUUFVUX0JVRkZFUjsKLQkJcm1yZWdzLnBCWzBdLmJTZWxDUkYgPSBSRUdfT0ZGU0VUKHJlZ19lcyk7Ci0JCXJtcmVncy5wQlswXS5iT2ZmQ1JGID0gUkVHX09GRlNFVChyZWdfZWRpKTsKLQkJcm1yZWdzLnBCWzBdLnBBZGRyZXNzID0gUk1CdWY7Ci0JCXJtcmVncy5wQlswXS51bFNpemUgPSAyNTY7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDB4NEYwMjoKLQkJcm1yZWdzLnBCWzBdLmJCdWZmZXJUeXBlID0gSU5QVVRfQlVGRkVSOwotCQlybXJlZ3MucEJbMF0uYlNlbENSRiA9IFJFR19PRkZTRVQocmVnX2VzKTsKLQkJcm1yZWdzLnBCWzBdLmJPZmZDUkYgPSBSRUdfT0ZGU0VUKHJlZ19lZGkpOwotCQlybXJlZ3MucEJbMF0ucEFkZHJlc3MgPSBSTUJ1ZjsKLQkJcm1yZWdzLnBCWzBdLnVsU2l6ZSA9IDI1NjsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgMHg0RjA5OgotCQlybXJlZ3MucEJbMF0uYkJ1ZmZlclR5cGUgPSBJTlBVVF9CVUZGRVI7Ci0JCXJtcmVncy5wQlswXS5iU2VsQ1JGID0gUkVHX09GRlNFVChyZWdfZXMpOwotCQlybXJlZ3MucEJbMF0uYk9mZkNSRiA9IFJFR19PRkZTRVQocmVnX2VkaSk7Ci0JCXJtcmVncy5wQlswXS5wQWRkcmVzcyA9IFJNQnVmOwotCQlybXJlZ3MucEJbMF0udWxTaXplID0gMTAyNDsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgMHg0RjBBOgotCQkvKiBEdWUgdG8gYnVncyBpbiB0aGUgbWluaS1WRE0gaW4gT1MvMiwgdGhlIDB4NEYwQSBwcm90ZWN0ZWQKLQkJICogbW9kZSBpbnRlcmZhY2UgZnVuY3Rpb25zIHdpbGwgbm90IHdvcmsgKHdlIG5ldmVyIGdldCBhbnkKLQkJICogc2VsZWN0b3JzIHJldHVybmVkKSwgc28gd2UgZmFpbCB0aGlzIGZ1bmN0aW9uIGhlcmUuIFRoZQotCQkgKiByZXN0IG9mIHRoZSBWQkUvQ29yZSBkcml2ZXIgd2lsbCB3b3JrIHByb3Blcmx5IGlmIHRoaXMKLQkJICogZnVuY3Rpb24gaXMgZmFpbGVkLCBiZWNhdXNlIHRoZSBWQkUgMi4wIGFuZCAzLjAgc3BlY3MKLQkJICogYWxsb3cgZm9yIHRoaXMuCi0JCSAqLwotCQlyZWdzLT5lYXggPSAweDAxNEY7Ci0JCXJldHVybjsKLQkgICAgfQotCX0KLSAgICBpZiAodXNlVlBNSSkKLQlQTV9WSURFT1BNSTMyUmVxdWVzdCgmQWRhcHRlcixQTUlSRVFVRVNUX1NPRlRXQVJFSU5ULE5VTEwsJnJtcmVncyk7Ci0gICAgZWxzZSB7Ci0JRG9zU3lzQ3RsKDYsICZybXJlZ3MpOwotCX0KLQotICAgIE9VVERQTUkoZWF4KTsgT1VURFBNSShlYngpOyBPVVREUE1JKGVjeCk7IE9VVERQTUkoZWR4KTsgT1VURFBNSShlc2kpOyBPVVREUE1JKGVkaSk7Ci0gICAgaWYgKCgocmVncy0+ZWF4ICYgMHhGRkZGKSA9PSAweDAwNEYpICYmICgoZWF4ICYgMHhGRkZGKSA9PSAweDRGMDApKSB7Ci0JLyogSGFjayB0byBmaXggdXAgdGhlIG1pc3NpbmcgJ1ZFU0EnIHN0cmluZyBmb3IgbWluaS1WRE0gKi8KLQltZW1jcHkoUk1CdWYsIlZFU0EiLDQpOwotCX0KLSAgICByZWdzLT5kcyA9IHJtcmVncy5hQ1JGLnJlZ19kczsKLSAgICByZWdzLT5lcyA9IHJtcmVncy5hQ1JGLnJlZ19lczsKLSAgICByZWdzLT5mbGFncyA9IHJtcmVncy5hQ1JGLnJlZ19lZmxhZzsKLX0KLQotI2RlZmluZSBJTihyZWcpICAgICBybXJlZ3MucmVnID0gaW4tPmUucmVnCi0jZGVmaW5lIE9VVChyZWcpICAgIG91dC0+ZS5yZWcgPSBybXJlZ3MucmVnCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSXNzdWUgYSByZWFsIG1vZGUgaW50ZXJydXB0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9pbnQ4NigKLSAgICBpbnQgaW50bm8sCi0gICAgUk1SRUdTICppbiwKLSAgICBSTVJFR1MgKm91dCkKLXsKLSAgICBEUE1JX3JlZ3MgICBybXJlZ3M7Ci0KLSAgICBtZW1zZXQoJnJtcmVncywgMCwgc2l6ZW9mKHJtcmVncykpOwotICAgIElOKGVheCk7IElOKGVieCk7IElOKGVjeCk7IElOKGVkeCk7IElOKGVzaSk7IElOKGVkaSk7Ci0gICAgRFBNSV9pbnQ4NihpbnRubywmcm1yZWdzKTsKLSAgICBPVVQoZWF4KTsgT1VUKGVieCk7IE9VVChlY3gpOyBPVVQoZWR4KTsgT1VUKGVzaSk7IE9VVChlZGkpOwotICAgIG91dC0+eC5jZmxhZyA9IHJtcmVncy5mbGFncyAmIDB4MTsKLSAgICByZXR1cm4gb3V0LT54LmF4OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUlzc3VlIGEgcmVhbCBtb2RlIGludGVycnVwdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1faW50ODZ4KAotICAgIGludCBpbnRubywKLSAgICBSTVJFR1MgKmluLAotICAgIFJNUkVHUyAqb3V0LAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIERQTUlfcmVncyAgIHJtcmVnczsKLQotICAgIG1lbXNldCgmcm1yZWdzLCAwLCBzaXplb2Yocm1yZWdzKSk7Ci0gICAgSU4oZWF4KTsgSU4oZWJ4KTsgSU4oZWN4KTsgSU4oZWR4KTsgSU4oZXNpKTsgSU4oZWRpKTsKLSAgICBybXJlZ3MuZXMgPSBzcmVncy0+ZXM7Ci0gICAgcm1yZWdzLmRzID0gc3JlZ3MtPmRzOwotICAgIERQTUlfaW50ODYoaW50bm8sJnJtcmVncyk7Ci0gICAgT1VUKGVheCk7IE9VVChlYngpOyBPVVQoZWN4KTsgT1VUKGVkeCk7IE9VVChlc2kpOyBPVVQoZWRpKTsKLSAgICBzcmVncy0+ZXMgPSBybXJlZ3MuZXM7Ci0gICAgc3JlZ3MtPmNzID0gcm1yZWdzLmNzOwotICAgIHNyZWdzLT5zcyA9IHJtcmVncy5zczsKLSAgICBzcmVncy0+ZHMgPSBybXJlZ3MuZHM7Ci0gICAgb3V0LT54LmNmbGFnID0gcm1yZWdzLmZsYWdzICYgMHgxOwotICAgIHJldHVybiBvdXQtPnguYXg7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCBhIHJlYWwgbW9kZSBmYXIgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9jYWxsUmVhbE1vZGUoCi0gICAgdWludCBzZWcsCi0gICAgdWludCBvZmYsCi0gICAgUk1SRUdTICppbiwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICBQTV9mYXRhbEVycm9yKCJQTV9jYWxsUmVhbE1vZGUgbm90IHN1cHBvcnRlZCBvbiBPUy8yISIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgYW1vdW50IG9mIGF2YWlsYWJsZSBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9hdmFpbGFibGVNZW1vcnkoCi0gICAgdWxvbmcgKnBoeXNpY2FsLAotICAgIHVsb25nICp0b3RhbCkKLXsKLSAgICAvKiBVbmFibGUgdG8gZ2V0IHJlbGlhYmxlIHZhbHVlcyBmcm9tIE9TLzIgZm9yIHRoaXMgKi8KLSAgICAqcGh5c2ljYWwgPSAqdG90YWwgPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlIGEgYmxvY2sgb2YgbG9ja2VkLCBwaHlzaWNhbCBtZW1vcnkgZm9yIERNQSBvcGVyYXRpb25zLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY0xvY2tlZE1lbSgKLSAgICB1aW50IHNpemUsCi0gICAgdWxvbmcgKnBoeXNBZGRyLAotICAgIGlib29sIGNvbnRpZ3VvdXMsCi0gICAgaWJvb2wgYmVsb3cxNk0pCi17Ci0gICAgcGFybXNJblswXSA9IHNpemU7Ci0gICAgcGFybXNJblsxXSA9IGNvbnRpZ3VvdXM7Ci0gICAgcGFybXNJblsyXSA9IGJlbG93MTZNOwotICAgIENhbGxTRERIZWxwKFBNSEVMUF9BTExPQ0xPQ0tFRCk7Ci0gICAgKnBoeXNBZGRyID0gcGFybXNPdXRbMV07Ci0gICAgcmV0dXJuICh2b2lkKilwYXJtc091dFswXTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgYmxvY2sgb2YgbG9ja2VkIHBoeXNpY2FsIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVMb2NrZWRNZW0oCi0gICAgdm9pZCAqcCwKLSAgICB1aW50IHNpemUsCi0gICAgaWJvb2wgY29udGlndW91cykKLXsKLSAgICBwYXJtc0luWzBdID0gKHVsb25nKXA7Ci0gICAgQ2FsbFNEREhlbHAoUE1IRUxQX0ZSRUVMT0NLRUQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlcyBhIG5ldyBibG9jayBvZiBwYWdlcyBmb3IgdGhlIHBhZ2UgYmxvY2sgbWFuYWdlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgcGFnZWJsb2NrICpQTV9hZGROZXdQYWdlQmxvY2sodm9pZCkKLXsKLSAgICBpbnQgICAgICAgICBpOwotICAgIHBhZ2VibG9jayAgICpuZXdCbG9jazsKLSAgICBjaGFyICAgICAgICAqcCwqbmV4dDsKLQotICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIG5ldyBwYWdlIGJsb2NrLCBhbmQgYWRkIHRvIGhlYWQgb2YgbGlzdCAqLwotICAgIGlmIChEb3NBbGxvY1NoYXJlZE1lbSgodm9pZCoqKSZuZXdCbG9jayxOVUxMLFBBR0VfQkxPQ0tfU0laRSxPQkpfR0VUVEFCTEUgfCBQQUdfUkVBRCB8IFBBR19XUklURSB8IFBBR19DT01NSVQpKQotCXJldHVybiBOVUxMOwotICAgIGlmICghUE1fbG9ja0RhdGFQYWdlcyhuZXdCbG9jayxQQUdFX0JMT0NLX1NJWkUsJm5ld0Jsb2NrLT5sb2NrSGFuZGxlKSkKLQlyZXR1cm4gTlVMTDsKLSAgICBuZXdCbG9jay0+cHJldiA9IE5VTEw7Ci0gICAgbmV3QmxvY2stPm5leHQgPSBwYWdlQmxvY2tzOwotICAgIGlmIChwYWdlQmxvY2tzKQotCXBhZ2VCbG9ja3MtPnByZXYgPSBuZXdCbG9jazsKLSAgICBwYWdlQmxvY2tzID0gbmV3QmxvY2s7Ci0KLSAgICAvKiBJbml0aWFsaXNlIHRoZSBwYWdlIGFsaWduZWQgZnJlZSBsaXN0IGZvciB0aGUgcGFnZSBibG9jayAqLwotICAgIG5ld0Jsb2NrLT5mcmVlQ291bnQgPSBQQUdFU19QRVJfQkxPQ0s7Ci0gICAgbmV3QmxvY2stPmZyZWVMaXN0ID0gcCA9IChjaGFyKikoKCh1bG9uZykobmV3QmxvY2sgKyAxKSArIChQTV9QQUdFX1NJWkUtMSkpICYgfihQTV9QQUdFX1NJWkUtMSkpOwotICAgIG5ld0Jsb2NrLT5mcmVlTGlzdFN0YXJ0ID0gbmV3QmxvY2stPmZyZWVMaXN0OwotICAgIG5ld0Jsb2NrLT5mcmVlTGlzdEVuZCA9IHAgKyAoUEFHRVNfUEVSX0JMT0NLLTEpICogUE1fUEFHRV9TSVpFOwotICAgIGZvciAoaSA9IDA7IGkgPCBQQUdFU19QRVJfQkxPQ0s7IGkrKyxwID0gbmV4dCkKLQlGUkVFTElTVF9ORVhUKHApID0gbmV4dCA9IHAgKyBQTV9QQUdFX1NJWkU7Ci0gICAgRlJFRUxJU1RfTkVYVChwIC0gUE1fUEFHRV9TSVpFKSA9IE5VTEw7Ci0gICAgcmV0dXJuIG5ld0Jsb2NrOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlcyBhIHBhZ2UgYWxpZ25lZCBhbmQgcGFnZSBzaXplZCBibG9jayBvZiBtZW1vcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fYWxsb2NQYWdlKAotICAgIGlib29sIGxvY2tlZCkKLXsKLSAgICBwYWdlYmxvY2sgICAqYmxvY2s7Ci0gICAgdm9pZCAgICAgICAgKnA7Ci0KLSAgICAvKiBTY2FuIHRoZSBibG9jayBsaXN0IGxvb2tpbmcgZm9yIGFueSBmcmVlIGJsb2Nrcy4gQWxsb2NhdGUgYSBuZXcKLSAgICAgKiBwYWdlIGJsb2NrIGlmIG5vIGZyZWUgYmxvY2tzIGFyZSBmb3VuZC4KLSAgICAgKi8KLSAgICBmb3IgKGJsb2NrID0gcGFnZUJsb2NrczsgYmxvY2sgIT0gTlVMTDsgYmxvY2sgPSBibG9jay0+bmV4dCkgewotCWlmIChibG9jay0+ZnJlZUNvdW50KQotCSAgICBicmVhazsKLQl9Ci0gICAgaWYgKGJsb2NrID09IE5VTEwgJiYgKGJsb2NrID0gUE1fYWRkTmV3UGFnZUJsb2NrKCkpID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0gICAgYmxvY2stPmZyZWVDb3VudC0tOwotICAgIHAgPSBibG9jay0+ZnJlZUxpc3Q7Ci0gICAgYmxvY2stPmZyZWVMaXN0ID0gRlJFRUxJU1RfTkVYVChwKTsKLSAgICAodm9pZClsb2NrZWQ7Ci0gICAgcmV0dXJuIHA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnJlZSBhIHBhZ2UgYWxpZ25lZCBhbmQgcGFnZSBzaXplZCBibG9jayBvZiBtZW1vcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVQYWdlKAotICAgIHZvaWQgKnApCi17Ci0gICAgcGFnZWJsb2NrICAgKmJsb2NrOwotCi0gICAgLyogRmlyc3QgZmluZCB0aGUgcGFnZSBibG9jayB0aGF0IHRoaXMgcGFnZSBiZWxvbmdzIHRvICovCi0gICAgZm9yIChibG9jayA9IHBhZ2VCbG9ja3M7IGJsb2NrICE9IE5VTEw7IGJsb2NrID0gYmxvY2stPm5leHQpIHsKLQlpZiAocCA+PSBibG9jay0+ZnJlZUxpc3RTdGFydCAmJiBwIDw9IGJsb2NrLT5mcmVlTGlzdEVuZCkKLQkgICAgYnJlYWs7Ci0JfQotICAgIENIRUNLKGJsb2NrICE9IE5VTEwpOwotCi0gICAgLyogTm93IGZyZWUgdGhlIGJsb2NrIGJ5IGFkZGluZyBpdCB0byB0aGUgZnJlZSBsaXN0ICovCi0gICAgRlJFRUxJU1RfTkVYVChwKSA9IGJsb2NrLT5mcmVlTGlzdDsKLSAgICBibG9jay0+ZnJlZUxpc3QgPSBwOwotICAgIGlmICgrK2Jsb2NrLT5mcmVlQ291bnQgPT0gUEFHRVNfUEVSX0JMT0NLKSB7Ci0JLyogSWYgYWxsIHBhZ2VzIGluIHRoZSBwYWdlIGJsb2NrIGFyZSBub3cgZnJlZSwgZnJlZSB0aGUgZW50aXJlCi0JICogcGFnZSBibG9jayBpdHNlbGYuCi0JICovCi0JaWYgKGJsb2NrID09IHBhZ2VCbG9ja3MpIHsKLQkgICAgLyogRGVsZXRlIGZyb20gaGVhZCAqLwotCSAgICBwYWdlQmxvY2tzID0gYmxvY2stPm5leHQ7Ci0JICAgIGlmIChibG9jay0+bmV4dCkKLQkJYmxvY2stPm5leHQtPnByZXYgPSBOVUxMOwotCSAgICB9Ci0JZWxzZSB7Ci0JICAgIC8qIERlbGV0ZSBmcm9tIG1pZGRsZSBvZiBsaXN0ICovCi0JICAgIENIRUNLKGJsb2NrLT5wcmV2ICE9IE5VTEwpOwotCSAgICBibG9jay0+cHJldi0+bmV4dCA9IGJsb2NrLT5uZXh0OwotCSAgICBpZiAoYmxvY2stPm5leHQpCi0JCWJsb2NrLT5uZXh0LT5wcmV2ID0gYmxvY2stPnByZXY7Ci0JICAgIH0KLQotCS8qIFVubG9jayB0aGUgbWVtb3J5IGFuZCBmcmVlIGl0ICovCi0JUE1fdW5sb2NrRGF0YVBhZ2VzKGJsb2NrLFBBR0VfQkxPQ0tfU0laRSwmYmxvY2stPmxvY2tIYW5kbGUpOwotCURvc0ZyZWVNZW0oYmxvY2spOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1NYXAgaW4gYWxsIHRoZSBzaGFyZWQgbWVtb3J5IGJsb2NrcyBmb3IgbWFuYWdpbmcgdGhlIG1lbW9yeSBwYWdlcyBhYm92ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX21hcFNoYXJlZFBhZ2VzKHZvaWQpCi17Ci0gICAgcGFnZWJsb2NrICAgKmJsb2NrOwotCi0gICAgLyogTWFwIGFsbCB0aGUgcGFnZSBibG9ja3MgYWJvdmUgaW50byB0aGUgc2hhcmVkIG1lbW9yeSBmb3IgcHJvY2VzcyAqLwotICAgIGZvciAoYmxvY2sgPSBwYWdlQmxvY2tzOyBibG9jayAhPSBOVUxMOyBibG9jayA9IGJsb2NrLT5uZXh0KSB7Ci0JRG9zR2V0U2hhcmVkTWVtKGJsb2NrLCBQQUdfUkVBRCB8IFBBR19XUklURSk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUxvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fbG9ja0RhdGFQYWdlcygKLSAgICB2b2lkICpwLAotICAgIHVpbnQgbGVuLAotICAgIFBNX2xvY2tIYW5kbGUgKmxvY2tIYW5kbGUpCi17Ci0gICAgcGFybXNJblswXSA9ICh1bG9uZylwOwotICAgIHBhcm1zSW5bMV0gPSBsZW47Ci0gICAgQ2FsbFNEREhlbHAoUE1IRUxQX0xPQ0tQQUdFUyk7Ci0gICAgbG9ja0hhbmRsZS0+aFswXSA9IHBhcm1zT3V0WzFdOwotICAgIGxvY2tIYW5kbGUtPmhbMV0gPSBwYXJtc091dFsyXTsKLSAgICBsb2NrSGFuZGxlLT5oWzJdID0gcGFybXNPdXRbM107Ci0gICAgcmV0dXJuIHBhcm1zT3V0WzBdOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVVubG9jayBsaW5lYXIgbWVtb3J5IHNvIGl0IHdvbid0IGJlIHBhZ2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV91bmxvY2tEYXRhUGFnZXMoCi0gICAgdm9pZCAqcCwKLSAgICB1aW50IGxlbiwKLSAgICBQTV9sb2NrSGFuZGxlICpsb2NrSGFuZGxlKQotewotICAgIHBhcm1zSW5bMF0gPSBsb2NrSGFuZGxlLT5oWzBdOwotICAgIHBhcm1zSW5bMV0gPSBsb2NrSGFuZGxlLT5oWzFdOwotICAgIHBhcm1zSW5bMl0gPSBsb2NrSGFuZGxlLT5oWzJdOwotICAgIHJldHVybiBDYWxsU0RESGVscChQTUhFTFBfVU5MT0NLUEFHRVMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUxvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fbG9ja0NvZGVQYWdlcygKLSAgICB2b2lkICgqcCkoKSwKLSAgICB1aW50IGxlbiwKLSAgICBQTV9sb2NrSGFuZGxlICpsb2NrSGFuZGxlKQotewotICAgIHBhcm1zSW5bMF0gPSAodWxvbmcpcDsKLSAgICBwYXJtc0luWzFdID0gbGVuOwotICAgIENhbGxTRERIZWxwKFBNSEVMUF9MT0NLUEFHRVMpOwotICAgIGxvY2tIYW5kbGUtPmhbMF0gPSBwYXJtc091dFsxXTsKLSAgICBsb2NrSGFuZGxlLT5oWzFdID0gcGFybXNPdXRbMl07Ci0gICAgbG9ja0hhbmRsZS0+aFsyXSA9IHBhcm1zT3V0WzNdOwotICAgIHJldHVybiBwYXJtc091dFswXTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1VbmxvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fdW5sb2NrQ29kZVBhZ2VzKAotICAgIHZvaWQgKCpwKSgpLAotICAgIHVpbnQgbGVuLAotICAgIFBNX2xvY2tIYW5kbGUgKmxvY2tIYW5kbGUpCi17Ci0gICAgcGFybXNJblswXSA9IGxvY2tIYW5kbGUtPmhbMF07Ci0gICAgcGFybXNJblsxXSA9IGxvY2tIYW5kbGUtPmhbMV07Ci0gICAgcGFybXNJblsyXSA9IGxvY2tIYW5kbGUtPmhbMl07Ci0gICAgcmV0dXJuIENhbGxTRERIZWxwKFBNSEVMUF9VTkxPQ0tQQUdFUyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgVkJFL0NvcmUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGNoYW5nZSBkaXNwbGF5IGJhbmtzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0QmFua0EoCi0gICAgaW50IGJhbmspCi17Ci0gICAgSU5UQ1JGICBybXJlZ3M7Ci0KLSAgICBpZiAoIUluaXRJbnQxMCgpKQotCXJldHVybjsKLSAgICBtZW1zZXQoJnJtcmVncywgMCwgc2l6ZW9mKHJtcmVncykpOwotICAgIHJtcmVncy51bEJJT1NJbnRObyA9IDB4MTA7Ci0gICAgcm1yZWdzLmFDUkYucmVnX2VheCA9IDB4NEYwNTsKLSAgICBybXJlZ3MuYUNSRi5yZWdfZWJ4ID0gMHgwMDAwOwotICAgIHJtcmVncy5hQ1JGLnJlZ19lZHggPSBiYW5rOwotICAgIFBNX1ZJREVPUE1JMzJSZXF1ZXN0KCZBZGFwdGVyLFBNSVJFUVVFU1RfU09GVFdBUkVJTlQsJnJtcmVncyxOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBWQkUvQ29yZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgdG8gY2hhbmdlIGRpc3BsYXkgYmFua3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRCYW5rQUIoCi0gICAgaW50IGJhbmspCi17Ci0gICAgSU5UQ1JGICBybXJlZ3M7Ci0KLSAgICBpZiAoIUluaXRJbnQxMCgpKQotCXJldHVybjsKLSAgICBtZW1zZXQoJnJtcmVncywgMCwgc2l6ZW9mKHJtcmVncykpOwotICAgIHJtcmVncy51bEJJT1NJbnRObyA9IDB4MTA7Ci0gICAgcm1yZWdzLmFDUkYucmVnX2VheCA9IDB4NEYwNTsKLSAgICBybXJlZ3MuYUNSRi5yZWdfZWJ4ID0gMHgwMDAwOwotICAgIHJtcmVncy5hQ1JGLnJlZ19lZHggPSBiYW5rOwotICAgIFBNX1ZJREVPUE1JMzJSZXF1ZXN0KCZBZGFwdGVyLFBNSVJFUVVFU1RfU09GVFdBUkVJTlQsJnJtcmVncyxOVUxMKTsKLSAgICBybXJlZ3MudWxCSU9TSW50Tm8gPSAweDEwOwotICAgIHJtcmVncy5hQ1JGLnJlZ19lYXggPSAweDRGMDU7Ci0gICAgcm1yZWdzLmFDUkYucmVnX2VieCA9IDB4MDAwMTsKLSAgICBybXJlZ3MuYUNSRi5yZWdfZWR4ID0gYmFuazsKLSAgICBQTV9WSURFT1BNSTMyUmVxdWVzdCgmQWRhcHRlcixQTUlSRVFVRVNUX1NPRlRXQVJFSU5ULCZybXJlZ3MsTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgVkJFL0NvcmUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGNoYW5nZSBkaXNwbGF5IHN0YXJ0IGFkZHJlc3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRDUlRTdGFydCgKLSAgICBpbnQgeCwKLSAgICBpbnQgeSwKLSAgICBpbnQgd2FpdFZSVCkKLXsKLSAgICBJTlRDUkYgIHJtcmVnczsKLQotICAgIGlmICghSW5pdEludDEwKCkpCi0JcmV0dXJuOwotICAgIG1lbXNldCgmcm1yZWdzLCAwLCBzaXplb2Yocm1yZWdzKSk7Ci0gICAgcm1yZWdzLnVsQklPU0ludE5vID0gMHgxMDsKLSAgICBybXJlZ3MuYUNSRi5yZWdfZWF4ID0gMHg0RjA3OwotICAgIHJtcmVncy5hQ1JGLnJlZ19lYnggPSB3YWl0VlJUOwotICAgIHJtcmVncy5hQ1JGLnJlZ19lY3ggPSB4OwotICAgIHJtcmVncy5hQ1JGLnJlZ19lZHggPSB5OwotICAgIFBNX1ZJREVPUE1JMzJSZXF1ZXN0KCZBZGFwdGVyLFBNSVJFUVVFU1RfU09GVFdBUkVJTlQsJnJtcmVncyxOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1FeGVjdXRlIHRoZSBQT1NUIG9uIHRoZSBzZWNvbmRhcnkgQklPUyBmb3IgYSBjb250cm9sbGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2RvQklPU1BPU1QoCi0gICAgdXNob3J0IGF4VmFsLAotICAgIHVsb25nIEJJT1NQaHlzQWRkciwKLSAgICB2b2lkICptYXBwZWRCSU9TLAotICAgIHVsb25nIEJJT1NMZW4pCi17Ci0gICAgKHZvaWQpYXhWYWw7Ci0gICAgKHZvaWQpQklPU1BoeXNBZGRyOwotICAgICh2b2lkKW1hcHBlZEJJT1M7Ci0gICAgKHZvaWQpQklPU0xlbjsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYmFzZSAgICAtIFRoZSBzdGFydGluZyBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgotc2l6ZSAgICAtIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZWdpb24KLXR5cGUgICAgLSBUeXBlIHRvIHBsYWNlIGludG8gdGhlIE1UUlIgcmVnaXN0ZXIKLQotUkVUVVJOUzoKLUVycm9yIGNvZGUgZGVzY3JpYmluZyB0aGUgcmVzdWx0LgotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZW5hYmxlIHdyaXRlIGNvbWJpbmluZyBmb3IgdGhlIHNwZWNpZmllZCByZWdpb24gb2YgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9lbmFibGVXcml0ZUNvbWJpbmUoCi0gICAgdWxvbmcgYmFzZSwKLSAgICB1bG9uZyBzaXplLAotICAgIHVpbnQgdHlwZSkKLXsKLSAgICByZXR1cm4gTVRSUl9lbmFibGVXcml0ZUNvbWJpbmUoYmFzZSxzaXplLHR5cGUpOwotfQotCi0vKiBUT0RPOiBNb3ZlIHRoZSBNVFJSIGhlbHBlciBzdHVmZiBpbnRvIHRoZSBjYWxsIGdhdGUsIG9yIGJldHRlciB5ZXQgKi8KLS8qICAgICAgIGVudGlyZWx5IGludG8gdGhlIHJpbmcgMCBoZWxwZXIgZHJpdmVyISEgKi8KLQotLyogTVRSUiBoZWxwZXIgZnVuY3Rpb25zLiBUbyBtYWtlIGl0IGVhc2llciB0byBpbXBsZW1lbnQgdGhlIE1UUlIgc3VwcG9ydAotICogdW5kZXIgT1MvMiwgd2Ugc2ltcGx5IHB1dCBvdXIgcmluZyAwIGhlbHBlciBmdW5jdGlvbnMgaW50byB0aGUKLSAqIGhlbHBlciBkZXZpY2UgZHJpdmVyIHJhdGhlciB0aGFuIHRoZSBlbnRpcmUgTVRSUiBtb2R1bGUuIFRoaXMgbWFrZXMKLSAqIGl0IGVhc2llciB0byBtYWludGFpbiB0aGUgTVRSUiBzdXBwb3J0IHNpbmNlIHdlIGRvbid0IG5lZWQgdG8gZGVhbAotICogd2l0aCAxNi1iaXQgcmluZyAwIGNvZGUgaW4gdGhlIE1UUlIgbGlicmFyeS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZsdXNoIHRoZSB0cmFuc2xhdGlvbiBsb29rYXNpZGUgYnVmZmVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZmx1c2hUTEIodm9pZCkKLXsKLSAgICBDYWxsU0RESGVscChQTUhFTFBfRkxVU0hUTEIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0cnVlIGlmIHJpbmcgMCAob3IgaWYgd2UgY2FuIGNhbGwgdGhlIGhlbHBlcnMgZnVuY3Rpb25zIGF0IHJpbmcgMCkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBfQVNNQVBJIF9NVFJSX2lzUmluZzAodm9pZCkKLXsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIGFuZCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBDUjQgcmVnaXN0ZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfQVNNQVBJIF9NVFJSX3NhdmVDUjQodm9pZCkKLXsKLSAgICByZXR1cm4gQ2FsbFNEREhlbHAoUE1IRUxQX1NBVkVDUjQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSBDUjQgcmVnaXN0ZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9BU01BUEkgX01UUlJfcmVzdG9yZUNSNCh1bG9uZyBjcjRWYWwpCi17Ci0gICAgcGFybXNJblswXSA9IGNyNFZhbDsKLSAgICBDYWxsU0RESGVscChQTUhFTFBfUkVTVE9SRUNSNCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCBhIG1hY2hpbmUgc3RhdHVzIHJlZ2lzdGVyIGZvciB0aGUgQ1BVLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0FTTUFQSSBfTVRSUl9yZWFkTVNSKAotICAgIHVsb25nIHJlZywKLSAgICB1bG9uZyAqZWF4LAotICAgIHVsb25nICplZHgpCi17Ci0gICAgcGFybXNJblswXSA9IHJlZzsKLSAgICBDYWxsU0RESGVscChQTUhFTFBfUkVBRE1TUik7Ci0gICAgKmVheCA9IHBhcm1zT3V0WzBdOwotICAgICplZHggPSBwYXJtc091dFsxXTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Xcml0ZSBhIG1hY2hpbmUgc3RhdHVzIHJlZ2lzdGVyIGZvciB0aGUgQ1BVLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0FTTUFQSSBfTVRSUl93cml0ZU1TUigKLSAgICB1bG9uZyByZWcsCi0gICAgdWxvbmcgZWF4LAotICAgIHVsb25nIGVkeCkKLXsKLSAgICBwYXJtc0luWzBdID0gcmVnOwotICAgIHBhcm1zSW5bMV0gPSBlYXg7Ci0gICAgcGFybXNJblsyXSA9IGVkeDsKLSAgICBDYWxsU0RESGVscChQTUhFTFBfV1JJVEVNU1IpOwotfQotCi1QTV9NT0RVTEUgUE1BUEkgUE1fbG9hZExpYnJhcnkoCi0gICAgY29uc3QgY2hhciAqc3pETExOYW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzIHRvIGxvYWQgc2hhcmVkIGxpYnJhcmllcyEgKi8KLSAgICAodm9pZClzekRMTE5hbWU7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRQcm9jQWRkcmVzcygKLSAgICBQTV9NT0RVTEUgaE1vZHVsZSwKLSAgICBjb25zdCBjaGFyICpzelByb2NOYW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzISAqLwotICAgICh2b2lkKWhNb2R1bGU7Ci0gICAgKHZvaWQpc3pQcm9jTmFtZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlTGlicmFyeSgKLSAgICBQTV9NT0RVTEUgaE1vZHVsZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyEgKi8KLSAgICAodm9pZCloTW9kdWxlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUludGVybmFsIGZ1bmN0aW9uIHRvIGNvbnZlcnQgdGhlIGZpbmQgZGF0YSB0byB0aGUgZ2VuZXJpYyBpbnRlcmZhY2UuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgY29udmVydEZpbmREYXRhKAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSwKLSAgICBGSUxFRklOREJVRjMgKmJsaykKLXsKLSAgICB1bG9uZyAgIGR3U2l6ZSA9IGZpbmREYXRhLT5kd1NpemU7Ci0KLSAgICBtZW1zZXQoZmluZERhdGEsMCxmaW5kRGF0YS0+ZHdTaXplKTsKLSAgICBmaW5kRGF0YS0+ZHdTaXplID0gZHdTaXplOwotICAgIGlmIChibGstPmF0dHJGaWxlICYgRklMRV9SRUFET05MWSkKLQlmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfUkVBRE9OTFk7Ci0gICAgaWYgKGJsay0+YXR0ckZpbGUgJiBGSUxFX0RJUkVDVE9SWSkKLQlmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfRElSRUNUT1JZOwotICAgIGlmIChibGstPmF0dHJGaWxlICYgRklMRV9BUkNISVZFRCkKLQlmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfQVJDSElWRTsKLSAgICBpZiAoYmxrLT5hdHRyRmlsZSAmIEZJTEVfSElEREVOKQotCWZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9ISURERU47Ci0gICAgaWYgKGJsay0+YXR0ckZpbGUgJiBGSUxFX1NZU1RFTSkKLQlmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfU1lTVEVNOwotICAgIGZpbmREYXRhLT5zaXplTG8gPSBibGstPmNiRmlsZTsKLSAgICBmaW5kRGF0YS0+c2l6ZUhpID0gMDsKLSAgICBzdHJuY3B5KGZpbmREYXRhLT5uYW1lLGJsay0+YWNoTmFtZSxQTV9NQVhfUEFUSCk7Ci0gICAgZmluZERhdGEtPm5hbWVbUE1fTUFYX1BBVEgtMV0gPSAwOwotfQotCi0jZGVmaW5lIEZJTkRfTUFTSyAgIChGSUxFX0FSQ0hJVkVEIHwgRklMRV9ESVJFQ1RPUlkgfCBGSUxFX1NZU1RFTSB8IEZJTEVfSElEREVOIHwgRklMRV9SRUFET05MWSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBmaW5kIHRoZSBmaXJzdCBmaWxlIG1hdGNoaW5nIGEgc2VhcmNoIGNyaXRlcmlhIGluIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKlBNQVBJIFBNX2ZpbmRGaXJzdEZpbGUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhKQotewotICAgIEZJTEVGSU5EQlVGMyAgICBibGs7Ci0gICAgSERJUiAgICAgICAgICAgIGhkaXIgPSBIRElSX0NSRUFURTsKLSAgICB1bG9uZyAgICAgICAgICAgY291bnQgPSAxOwotCi0gICAgaWYgKERvc0ZpbmRGaXJzdCgoUFNaKWZpbGVuYW1lLCZoZGlyLEZJTkRfTUFTSywmYmxrLHNpemVvZihibGspLCZjb3VudCxGSUxfU1RBTkRBUkQpID09IE5PX0VSUk9SKSB7Ci0JY29udmVydEZpbmREYXRhKGZpbmREYXRhLCZibGspOwotCXJldHVybiAodm9pZCopaGRpcjsKLQl9Ci0gICAgcmV0dXJuIFBNX0ZJTEVfSU5WQUxJRDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBmaW5kIHRoZSBuZXh0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZmluZE5leHRGaWxlKAotICAgIHZvaWQgKmhhbmRsZSwKLSAgICBQTV9maW5kRGF0YSAqZmluZERhdGEpCi17Ci0gICAgRklMRUZJTkRCVUYzICAgIGJsazsKLSAgICB1bG9uZyAgICAgICAgICAgY291bnQgPSAxOwotCi0gICAgaWYgKERvc0ZpbmROZXh0KChIRElSKWhhbmRsZSwmYmxrLHNpemVvZihibGspLCZjb3VudCkgPT0gTk9fRVJST1IpIHsKLQljb252ZXJ0RmluZERhdGEoZmluZERhdGEsJmJsayk7Ci0JcmV0dXJuIHRydWU7Ci0JfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjbG9zZSB0aGUgZmluZCBwcm9jZXNzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9maW5kQ2xvc2UoCi0gICAgdm9pZCAqaGFuZGxlKQotewotICAgIERvc0ZpbmRDbG9zZSgoSERJUiloYW5kbGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIGRyaXZlIGlzIGEgdmFsaWQgZHJpdmUgb3Igbm90LiBVbmRlciBVbml4IHRoaXMKLWZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIGZvciBhbnl0aGluZyBleGNlcHQgYSB2YWx1ZSBvZiAzIChjb25zaWRlcmVkCi10aGUgcm9vdCBkcml2ZSwgYW5kIGVxdWl2YWxlbnQgdG8gQzogZm9yIG5vbi1Vbml4IHN5c3RlbXMpLiBUaGUgZHJpdmUKLW51bWJlcmluZyBpczoKLQotICAgIDAgICAtIEN1cnJlbnQgZHJpdmUKLSAgICAxICAgLSBEcml2ZSBBOgotICAgIDIgICAtIERyaXZlIEI6Ci0gICAgMyAgIC0gRHJpdmUgQzoKLSAgICBldGMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2RyaXZlVmFsaWQoCi0gICAgY2hhciBkcml2ZSkKLXsKLSAgICB1bG9uZyAgIGNudERpc2ssY250RHJpdmVNYXA7Ci0gICAgaWJvb2wgICB2YWxpZDsKLQotICAgIERvc1F1ZXJ5Q3VycmVudERpc2soJmNudERpc2ssJmNudERyaXZlTWFwKTsKLSAgICB2YWxpZCA9IChEb3NTZXREZWZhdWx0RGlzayhkcml2ZSkgPT0gTk9fRVJST1IpOwotICAgIERvc1NldERlZmF1bHREaXNrKGNudERpc2spOwotICAgIHJldHVybiB2YWxpZDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSBzcGVjaWZpZmVkIGRyaXZlLgotVW5kZXIgVW5peCB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSByZWdhcmRsZXNzCi1vZiB3aGF0IHRoZSB2YWx1ZSBvZiAnZHJpdmUnIGlzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZ2V0ZGN3ZCgKLSAgICBpbnQgZHJpdmUsCi0gICAgY2hhciAqZGlyLAotICAgIGludCBsZW4pCi17Ci0gICAgdWxvbmcgbGVuZ3RoID0gbGVuOwotCi0gICAgRG9zUXVlcnlDdXJyZW50RGlyKGRyaXZlLCAoUFNaKWRpciwgJmxlbmd0aCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gY2hhbmdlIHRoZSBmaWxlIGF0dHJpYnV0ZXMgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldEZpbGVBdHRyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIHVpbnQgYXR0cmliKQotewotICAgIEZJTEVTVEFUVVMzIHM7Ci0KLSAgICBpZiAoRG9zUXVlcnlQYXRoSW5mbygoUFNaKWZpbGVuYW1lLEZJTF9TVEFOREFSRCwoUFZPSUQpJnMsc2l6ZW9mKHMpKSkKLQlyZXR1cm47Ci0gICAgcy5hdHRyRmlsZSA9IDA7Ci0gICAgaWYgKGF0dHJpYiAmIFBNX0ZJTEVfUkVBRE9OTFkpCi0Jcy5hdHRyRmlsZSB8PSBGSUxFX1JFQURPTkxZOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX0FSQ0hJVkUpCi0Jcy5hdHRyRmlsZSB8PSBGSUxFX0FSQ0hJVkVEOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX0hJRERFTikKLQlzLmF0dHJGaWxlIHw9IEZJTEVfSElEREVOOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX1NZU1RFTSkKLQlzLmF0dHJGaWxlIHw9IEZJTEVfU1lTVEVNOwotICAgIERvc1NldFBhdGhJbmZvKChQU1opZmlsZW5hbWUsRklMX1NUQU5EQVJELChQVk9JRCkmcyxzaXplb2YocyksMEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGdldCB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludCBQTUFQSSBQTV9nZXRGaWxlQXR0cigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICBGSUxFU1RBVFVTMyBmczM7Ci0gICAgdWludCAgICAgICAgcmV0dmFsID0gMDsKLQotICAgIGlmIChEb3NRdWVyeVBhdGhJbmZvKChQU1opZmlsZW5hbWUsIEZJTF9TVEFOREFSRCwgJmZzMywgc2l6ZW9mKEZJTEVTVEFUVVMzKSkpCi0JcmV0dXJuIDA7Ci0gICAgaWYgKGZzMy5hdHRyRmlsZSAmIEZJTEVfUkVBRE9OTFkpCi0JcmV0dmFsIHw9IFBNX0ZJTEVfUkVBRE9OTFk7Ci0gICAgaWYgKGZzMy5hdHRyRmlsZSAmIEZJTEVfQVJDSElWRUQpCi0JcmV0dmFsIHw9IFBNX0ZJTEVfQVJDSElWRTsKLSAgICBpZiAoZnMzLmF0dHJGaWxlICYgRklMRV9ISURERU4pCi0JcmV0dmFsIHw9IFBNX0ZJTEVfSElEREVOOwotICAgIGlmIChmczMuYXR0ckZpbGUgJiBGSUxFX1NZU1RFTSkKLQlyZXR2YWwgfD0gUE1fRklMRV9TWVNURU07Ci0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjcmVhdGUgYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fbWtkaXIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgcmV0dXJuIERvc0NyZWF0ZURpcigoUFNaKWZpbGVuYW1lLE5VTEwpID09IE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIHJlbW92ZSBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9ybWRpcigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICByZXR1cm4gRG9zRGVsZXRlRGlyKChQU1opZmlsZW5hbWUpID09IE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGdldCB0aGUgZmlsZSB0aW1lIGFuZCBkYXRlIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZ2V0RmlsZVRpbWUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgaWJvb2wgZ21UaW1lLAotICAgIFBNX3RpbWUgKnRpbWUpCi17Ci0gICAgRklMRVNUQVRVUzMgZnMzOwotICAgIHN0cnVjdCB0bSAgIHRjOwotICAgIHN0cnVjdCB0bSAgICpyZXQ7Ci0gICAgdGltZV90ICAgICAgdHQ7Ci0KLSAgICBpZiAoRG9zUXVlcnlQYXRoSW5mbygoUFNaKWZpbGVuYW1lLCBGSUxfU1RBTkRBUkQsICZmczMsIHNpemVvZihGSUxFU1RBVFVTMykpKQotCXJldHVybiBmYWxzZTsKLSAgICBpZiAoZ21UaW1lKSB7Ci0JdGMudG1feWVhciA9IGZzMy5mZGF0ZUxhc3RXcml0ZS55ZWFyICsgODA7Ci0JdGMudG1fbW9uID0gZnMzLmZkYXRlTGFzdFdyaXRlLm1vbnRoIC0gMTsKLQl0Yy50bV9tZGF5ID0gZnMzLmZkYXRlTGFzdFdyaXRlLmRheTsKLQl0Yy50bV9ob3VyID0gZnMzLmZ0aW1lTGFzdFdyaXRlLmhvdXJzOwotCXRjLnRtX21pbiA9IGZzMy5mdGltZUxhc3RXcml0ZS5taW51dGVzOwotCXRjLnRtX3NlYyA9IGZzMy5mdGltZUxhc3RXcml0ZS50d29zZWNzICogMjsKLQlpZigodHQgPSBta3RpbWUoJnRjKSkgPT0gLTEpCi0JICAgIHJldHVybiBmYWxzZTsKLQlpZighKHJldCA9IGdtdGltZSgmdHQpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCXRpbWUtPnNlYyA9IHJldC0+dG1fc2VjOwotCXRpbWUtPmRheSA9IHJldC0+dG1fbWRheTsKLQl0aW1lLT5tb24gPSByZXQtPnRtX21vbiArIDE7Ci0JdGltZS0+eWVhciA9IHJldC0+dG1feWVhciAtIDgwOwotCXRpbWUtPm1pbiA9IHJldC0+dG1fbWluOwotCXRpbWUtPmhvdXIgPSByZXQtPnRtX2hvdXI7Ci0JfQotICAgIGVsc2UgewotCXRpbWUtPnNlYyA9IGZzMy5mdGltZUxhc3RXcml0ZS50d29zZWNzICogMjsKLQl0aW1lLT5kYXkgPSBmczMuZmRhdGVMYXN0V3JpdGUuZGF5OwotCXRpbWUtPm1vbiA9IGZzMy5mZGF0ZUxhc3RXcml0ZS5tb250aDsKLQl0aW1lLT55ZWFyID0gZnMzLmZkYXRlTGFzdFdyaXRlLnllYXI7Ci0JdGltZS0+bWluID0gZnMzLmZ0aW1lTGFzdFdyaXRlLm1pbnV0ZXM7Ci0JdGltZS0+aG91ciA9IGZzMy5mdGltZUxhc3RXcml0ZS5ob3VyczsKLQl9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gc2V0IHRoZSBmaWxlIHRpbWUgYW5kIGRhdGUgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9zZXRGaWxlVGltZSgKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICBpYm9vbCBnbVRpbWUsCi0gICAgUE1fdGltZSAqdGltZSkKLXsKLSAgICBGSUxFU1RBVFVTMyBmczM7Ci0gICAgc3RydWN0IHRtICAgdGM7Ci0gICAgc3RydWN0IHRtICAgKnJldDsKLSAgICB0aW1lX3QgICAgICB0dDsKLQotICAgIGlmIChEb3NRdWVyeVBhdGhJbmZvKChQU1opZmlsZW5hbWUsRklMX1NUQU5EQVJELChQVk9JRCkmZnMzLHNpemVvZihmczMpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgaWYgKGdtVGltZSkgewotCXRjLnRtX3llYXIgPSB0aW1lLT55ZWFyICsgODA7Ci0JdGMudG1fbW9uID0gdGltZS0+bW9uIC0gMTsKLQl0Yy50bV9tZGF5ID0gdGltZS0+ZGF5OwotCXRjLnRtX2hvdXIgPSB0aW1lLT5ob3VyOwotCXRjLnRtX21pbiA9IHRpbWUtPm1pbjsKLQl0Yy50bV9zZWMgPSB0aW1lLT5zZWM7Ci0JaWYoKHR0ID0gbWt0aW1lKCZ0YykpID09IC0xKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JcmV0ID0gbG9jYWx0aW1lKCZ0dCk7Ci0JZnMzLmZ0aW1lTGFzdFdyaXRlLnR3b3NlY3MgPSByZXQtPnRtX3NlYyAvIDI7Ci0JZnMzLmZkYXRlTGFzdFdyaXRlLmRheSA9IHJldC0+dG1fbWRheTsKLQlmczMuZmRhdGVMYXN0V3JpdGUubW9udGggPSByZXQtPnRtX21vbiArIDE7Ci0JZnMzLmZkYXRlTGFzdFdyaXRlLnllYXIgPSByZXQtPnRtX3llYXIgLSA4MDsKLQlmczMuZnRpbWVMYXN0V3JpdGUubWludXRlcyA9IHJldC0+dG1fbWluOwotCWZzMy5mdGltZUxhc3RXcml0ZS5ob3VycyA9IHJldC0+dG1faG91cjsKLQl9Ci0gICAgZWxzZSB7Ci0JZnMzLmZ0aW1lTGFzdFdyaXRlLnR3b3NlY3MgPSB0aW1lLT5zZWMgLyAyOwotCWZzMy5mZGF0ZUxhc3RXcml0ZS5kYXkgPSB0aW1lLT5kYXk7Ci0JZnMzLmZkYXRlTGFzdFdyaXRlLm1vbnRoID0gdGltZS0+bW9uOwotCWZzMy5mZGF0ZUxhc3RXcml0ZS55ZWFyID0gdGltZS0+eWVhcjsKLQlmczMuZnRpbWVMYXN0V3JpdGUubWludXRlcyA9IHRpbWUtPm1pbjsKLQlmczMuZnRpbWVMYXN0V3JpdGUuaG91cnMgPSB0aW1lLT5ob3VyOwotCX0KLSAgICBtZW1jcHkoJmZzMy5mZGF0ZUxhc3RBY2Nlc3MsICZmczMuZmRhdGVMYXN0V3JpdGUsIHNpemVvZihGREFURSkpOwotICAgIG1lbWNweSgmZnMzLmZkYXRlQ3JlYXRpb24sICZmczMuZmRhdGVMYXN0V3JpdGUsIHNpemVvZihGREFURSkpOwotICAgIG1lbWNweSgmZnMzLmZ0aW1lTGFzdEFjY2VzcywgJmZzMy5mdGltZUxhc3RXcml0ZSwgc2l6ZW9mKEZUSU1FKSk7Ci0gICAgbWVtY3B5KCZmczMuZnRpbWVDcmVhdGlvbiwgJmZzMy5mdGltZUxhc3RXcml0ZSwgc2l6ZW9mKEZUSU1FKSk7Ci0gICAgRG9zU2V0UGF0aEluZm8oKFBTWilmaWxlbmFtZSxGSUxfU1RBTkRBUkQsKFBWT0lEKSZmczMsc2l6ZW9mKEZJTEVTVEFUVVMzKSwwTCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczIvdmZsYXQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi92ZmxhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzllZjJjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi92ZmxhdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgRHVtbXkgbW9kdWxlOyBubyB2aXJ0dWFsIGZyYW1lYnVmZmVyIGZvciB0aGlzIE9TCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLQotaWJvb2wgUE1BUEkgVkZfYXZhaWxhYmxlKHZvaWQpCi17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkICogUE1BUEkgVkZfaW5pdCh1bG9uZyBiYXNlQWRkcixpbnQgYmFua1NpemUsaW50IGNvZGVMZW4sdm9pZCAqYmFua0Z1bmMpCi17Ci0gICAgYmFzZUFkZHIgPSBiYXNlQWRkcjsKLSAgICBiYW5rU2l6ZSA9IGJhbmtTaXplOwotICAgIGNvZGVMZW4gPSBjb2RlTGVuOwotICAgIGJhbmtGdW5jID0gYmFua0Z1bmM7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgUE1BUEkgVkZfZXhpdCh2b2lkKQotewotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL3p0aW1lci5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MyL3p0aW1lci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGZmZTQzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMi96dGltZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBPUy8yCi0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBaZW4gVGltZXIgZnVuY3Rpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHVsb25nICAgIGZyZXF1ZW5jeTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBaZW4gVGltZXIgbW9kdWxlIGludGVybmFscy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9fWlRpbWVySW5pdCh2b2lkKQotewotICAgIERvc1RtclF1ZXJ5RnJlcSgmZnJlcXVlbmN5KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TdGFydCB0aGUgWmVuIFRpbWVyIGNvdW50aW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX19MWlRpbWVyT24odG0pIERvc1RtclF1ZXJ5VGltZSgoUVdPUkQqKSZ0bS0+c3RhcnQpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29tcHV0ZSB0aGUgbGFwIHRpbWUgc2luY2UgdGhlIHRpbWVyIHdhcyBzdGFydGVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfX0xaVGltZXJMYXAoCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0gICAgQ1BVX2xhcmdlSW50ZWdlciAgICB0bUxhcCx0bUNvdW50OwotCi0gICAgRG9zVG1yUXVlcnlUaW1lKChRV09SRCopJnRtTGFwKTsKLSAgICBfQ1BVX2RpZmZUaW1lNjQoJnRtLT5zdGFydCwmdG1MYXAsJnRtQ291bnQpOwotICAgIHJldHVybiBfQ1BVX2NhbGNNaWNyb1NlYygmdG1Db3VudCxmcmVxdWVuY3kpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfX0xaVGltZXJPZmYodG0pICAgIERvc1RtclF1ZXJ5VGltZSgoUVdPUkQqKSZ0bS0+ZW5kKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIF9fTFpUaW1lckNvdW50KAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotICAgIENQVV9sYXJnZUludGVnZXIgdG1Db3VudDsKLQotICAgIF9DUFVfZGlmZlRpbWU2NCgmdG0tPnN0YXJ0LCZ0bS0+ZW5kLCZ0bUNvdW50KTsKLSAgICByZXR1cm4gX0NQVV9jYWxjTWljcm9TZWMoJnRtQ291bnQsZnJlcXVlbmN5KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EZWZpbmUgdGhlIHJlc29sdXRpb24gb2YgdGhlIGxvbmcgcGVyaW9kIHRpbWVyIGFzIG1pY3Jvc2Vjb25kcyBwZXIgdGltZXIgdGljay4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFVMWlRJTUVSX1JFU09MVVRJT04gICAgIDEwMDAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIHRoZSBMb25nIFBlcmlvZCB0aW1lciB2YWx1ZSBmcm9tIHRoZSBCSU9TIHRpbWVyIHRpY2suCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIF9fVUxaUmVhZFRpbWUodm9pZCkKLXsKLSAgICBVTE9ORyAgIGNvdW50OwotICAgIERvc1F1ZXJ5U3lzSW5mbyggUVNWX01TX0NPVU5ULCBRU1ZfTVNfQ09VTlQsICZjb3VudCwgc2l6ZW9mKFVMT05HKSApOwotICAgIHJldHVybiBjb3VudDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Db21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgZnJvbSB0aGUgQklPUyB0aW1lciB0aWNrLiBOb3RlIHRoYXQgd2UgY2hlY2sgdG8gc2VlCi13aGV0aGVyIGEgbWlkbmlnaHQgYm91bmRhcnkgaGFzIHBhc3NlZCwgYW5kIGlmIHNvIGFkanVzdCB0aGUgZmluaXNoIHRpbWUgdG8KLWFjY291bnQgZm9yIHRoaXMuIFdlIGNhbm5vdCBkZXRlY3QgaWYgbW9yZSB0aGF0IG9uZSBtaWRuaWdodCBib3VuZGFyeSBoYXMKLXBhc3NlZCwgc28gaWYgdGhpcyBoYXBwZW5zIHdlIHdpbGwgYmUgZ2VuZXJhdGluZyBlcnJvbm91cyByZXN1bHRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9fVUxaRWxhcHNlZFRpbWUodWxvbmcgc3RhcnQsdWxvbmcgZmluaXNoKQoteyByZXR1cm4gZmluaXNoIC0gc3RhcnQ7IH0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMnBtL2V2ZW50LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vczJwbS9ldmVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWYyMGE5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMnBtL2V2ZW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgSUJNIFBDIChPUy8yKQotKgotKiBEZXNjcmlwdGlvbjogIE9TLzIgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBTY2lUZWNoIGNyb3NzIHBsYXRmb3JtCi0qICAgICAgICAgICAgICAgZXZlbnQgbGlicmFyeS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgICAgICAgICAgb2xkTW91c2VTdGF0ZTsgICAgICAvKiBPbGQgbW91c2Ugc3RhdGUgICAgICAgICAgICAgICovCi1zdGF0aWMgdWxvbmcgICAgICAgIG9sZEtleU1lc3NhZ2U7ICAgICAgLyogT2xkIGtleWJvYXJkIHN0YXRlICAgICAgICAgICAqLwotc3RhdGljIHVzaG9ydCAgICAgICBrZXlVcE1zZ1syNTZdID0gezB9Oy8qIFRhYmxlIG9mIGtleSB1cCBtZXNzYWdlcyAgICAgKi8KLXN0YXRpYyBpbnQgICAgICAgICAgcmFuZ2VYLHJhbmdlWTsgICAgICAvKiBSYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyAgICovCi1ITU9VICAgICAgICAgICAgICAgIF9FVlRfaE1vdXNlOyAgICAgICAgLyogSGFuZGxlIHRvIHRoZSBtb3VzZSBkcml2ZXIgICAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBUaGVzZSBhcmUgbm90IHVzZWQgdW5kZXIgT1MvMiAqLwotI2RlZmluZSBfRVZUX2Rpc2FibGVJbnQoKSAgICAgICAxCi0jZGVmaW5lIF9FVlRfcmVzdG9yZUludChmbGFncykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zY2FuQ29kZSAgICAtIFNjYW4gY29kZSB0byB0ZXN0Ci0KLVJFTUFSS1M6Ci1UaGlzIG1hY3JvIGRldGVybWluZXMgaWYgYSBzcGVjaWZpZWQga2V5IGlzIGN1cnJlbnRseSBkb3duIGF0IHRoZQotdGltZSB0aGF0IHRoZSBjYWxsIGlzIG1hZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX2lzS2V5RG93bihzY2FuQ29kZSkgICAgKGtleVVwTXNnW3NjYW5Db2RlXSAhPSAwKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVB1bXBzIGFsbCBtZXNzYWdlcyBpbiB0aGUgbWVzc2FnZSBxdWV1ZSBmcm9tIE9TLzIgaW50byBvdXIgZXZlbnQgcXVldWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX0VWVF9wdW1wTWVzc2FnZXModm9pZCkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyBmb3IgT1MvMiBQcmVzZW50YXRpb24gTWFuYWdlciBhcHBzISAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgbWFjcm8vZnVuY3Rpb24gaXMgdXNlZCB0byBjb252ZXJ0cyB0aGUgc2NhbiBjb2RlcyByZXBvcnRlZCBieSB0aGUKLWtleWJvYXJkIHRvIG91ciBldmVudCBsaWJyYXJpZXMgbm9ybWFsaXNlZCBmb3JtYXQuIFdlIG9ubHkgaGF2ZSBvbmUgc2NhbgotY29kZSBmb3IgdGhlICdBJyBrZXksIGFuZCB1c2Ugc2hpZnQgbW9kaWZpZXJzIHRvIGRldGVybWluZSBpZiBpdCBpcyBhCi1DdHJsLUYxLCBBbHQtRjEgZXRjLiBUaGUgcmF3IHNjYW4gY29kZXMgZnJvbSB0aGUga2V5Ym9hcmQgd29yayB0aGlzIHdheSwKLWJ1dCB0aGUgT1MgZ2l2ZXMgdXMgJ2Nvb2tlZCcgc2NhbiBjb2Rlcywgd2UgaGF2ZSB0byB0cmFuc2xhdGUgdGhlbSBiYWNrCi10byB0aGUgcmF3IGZvcm1hdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9FVlRfbWFza0tleUNvZGUoZXZ0KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNhZmVseSBhYm9ydCB0aGUgZXZlbnQgbW9kdWxlIHVwb24gY2F0Y2hpbmcgYSBmYXRhbCBlcnJvci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9FVlRfYWJvcnQoKQotewotICAgIEVWVF9leGl0KCk7Ci0gICAgUE1fZmF0YWxFcnJvcigiVW5oYW5kbGVkIGV4Y2VwdGlvbiEiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1tb3VzZU1vdmUgICAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbmV2ZSB0aGUgbW91c2UgbmVlZHMgdG8gYmUgbW92ZWQKLQotUkVNQVJLUzoKLUluaXRpbGlhc2UgdGhlIGV2ZW50IGhhbmRsaW5nIG1vZHVsZS4gSGVyZSB3ZSBpbnN0YWxsIG91ciBtb3VzZSBoYW5kbGluZyBJU1IKLXRvIGJlIGNhbGxlZCB3aGVuZXZlciBhbnkgYnV0dG9uJ3MgYXJlIHByZXNzZWQgb3IgcmVsZWFzZWQuIFdlIGFsc28gYnVpbGQKLXRoZSBmcmVlIGxpc3Qgb2YgZXZlbnRzIGluIHRoZSBldmVudCBxdWV1ZS4KLQotV2UgdXNlIGhhbmRsZXIgbnVtYmVyIDIgb2YgdGhlIG1vdXNlIGxpYnJhcmllcyBpbnRlcnJ1cHQgaGFuZGxlcnMgZm9yIG91cgotZXZlbnQgaGFuZGxpbmcgcm91dGluZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2luaXQoCi0gICAgX0VWVF9tb3VzZU1vdmVIYW5kbGVyIG1vdXNlTW92ZSkKLXsKLSAgICAvKiBJbml0aWFsaXNlIHRoZSBldmVudCBxdWV1ZSAqLwotICAgIEVWVC5tb3VzZU1vdmUgPSBtb3VzZU1vdmU7Ci0gICAgaW5pdEV2ZW50UXVldWUoKTsKLSAgICBvbGRNb3VzZVN0YXRlID0gMDsKLSAgICBvbGRLZXlNZXNzYWdlID0gMDsKLSAgICBtZW1zZXQoa2V5VXBNc2csMCxzaXplb2Yoa2V5VXBNc2cpKTsKLQotICAgIC8qIFRPRE86IE9TLzIgUE0gc3BlY2lmaWMgaW5pdGlhbGlzYXRpb24gY29kZSEgKi8KLQotICAgIC8qIENhdGNoIHByb2dyYW0gdGVybWluYXRpb24gc2lnbmFscyBzbyB3ZSBjYW4gY2xlYW4gdXAgcHJvcGVybHkgKi8KLSAgICBzaWduYWwoU0lHQUJSVCwgX0VWVF9hYm9ydCk7Ci0gICAgc2lnbmFsKFNJR0ZQRSwgX0VWVF9hYm9ydCk7Ci0gICAgc2lnbmFsKFNJR0lOVCwgX0VWVF9hYm9ydCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1DaGFuZ2VzIHRoZSByYW5nZSBvZiBjb29yZGluYXRlcyByZXR1cm5lZCBieSB0aGUgbW91c2UgZnVuY3Rpb25zIHRvIHRoZQotc3BlY2lmaWVkIHJhbmdlIG9mIHZhbHVlcy4gVGhpcyBpcyB1c2VkIHdoZW4gY2hhbmdpbmcgYmV0d2VlbiBncmFwaGljcwotbW9kZXMgc2V0IHRoZSByYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyBmb3IgdGhlIG5ldyBkaXNwbGF5IG1vZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX3NldE1vdXNlUmFuZ2UoCi0gICAgaW50IHhSZXMsCi0gICAgaW50IHlSZXMpCi17Ci0gICAgcmFuZ2VYID0geFJlczsKLSAgICByYW5nZVkgPSB5UmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWlsaXNlcyB0aGUgaW50ZXJuYWwgZXZlbnQgaGFuZGxpbmcgbW9kdWxlcy4gVGhlIEVWVF9zdXNwZW5kIGZ1bmN0aW9uCi1jYW4gYmUgY2FsbGVkIHRvIHN1c3BlbmQgZXZlbnQgaGFuZGxpbmcgKHN1Y2ggYXMgd2hlbiBzaGVsbGluZyBvdXQgdG8gRE9TKSwKLWFuZCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlc3VtZSBpdCBhZ2FpbiBsYXRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVF9yZXN1bWUodm9pZCkKLXsKLSAgICAvKiBEbyBub3RoaW5nIGZvciBPUy8yICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1TdXNwZW5kcyBhbGwgb2Ygb3VyIGV2ZW50IGhhbmRsaW5nIG9wZXJhdGlvbnMuIFRoaXMgaXMgYWxzbyB1c2VkIHRvCi1kZS1pbnN0YWxsIHRoZSBldmVudCBoYW5kbGluZyBjb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX3N1c3BlbmQodm9pZCkKLXsKLSAgICAvKiBEbyBub3RoaW5nIGZvciBPUy8yICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1FeGl0cyB0aGUgZXZlbnQgbW9kdWxlIGZvciBwcm9ncmFtIHRlcm1pbmF0YXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfZXhpdCh2b2lkKQotewotICAgIC8qIFJlc3RvcmUgc2lnbmFsIGhhbmRsZXJzICovCi0gICAgc2lnbmFsKFNJR0FCUlQsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdGUEUsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdJTlQsIFNJR19ERkwpOwotCi0gICAgLyogVE9ETzogT1MvMiBQTSBzcGVjaWZpYyBleGl0IGNvZGUgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLU1vZGlmZXMgdGhlIG1vdXNlIGNvb3JkaW5hdGVzIGFzIG5lY2Vzc2FyeSBpZiBzY2FsaW5nIHRvIE9TIGNvb3JkaW5hdGVzLAotYW5kIHNldHMgdGhlIE9TIG1vdXNlIGN1cnNvciBwb3NpdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9FVlRfc2V0TW91c2VQb3MoeCx5KQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MycG0vb3NoZHIuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zMnBtL29zaGRyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNjlmODIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vb3MycG0vb3NoZHIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBPUy8yCi0qCi0qIERlc2NyaXB0aW9uOiAgSW5jbHVkZSBmaWxlIHRvIGluY2x1ZGUgYWxsIE9TIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgSU5DTF9ET1NFUlJPUlMKLSNkZWZpbmUgSU5DTF9ET1MKLSNkZWZpbmUgSU5DTF9TVUIKLSNkZWZpbmUgSU5DTF9WSU8KLSNkZWZpbmUgSU5DTF9LQkQKLSNpbmNsdWRlIDxvczIuaD4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zaGRyLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9vc2hkci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDRlNWM5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL29zaGRyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBIZWFkZXIgZmlsZSB0byBwdWxsIGluIE9TIHNwZWNpZmljIGhlYWRlcnMgZm9yIHRoZSB0YXJnZXQKLSogICAgICAgICAgICAgICBPUyBlbnZpcm9ubWVudC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZiAgICAgZGVmaW5lZChfX1NNWDMyX18pCi0jaW5jbHVkZSAic214L29zaGRyLmgiCi0jZWxpZiAgIGRlZmluZWQoX19SVFRBUkdFVF9fKQotI2luY2x1ZGUgInJ0dGFyZ2V0L29zaGRyLmgiCi0jZWxpZiAgIGRlZmluZWQoX19SRUFMRE9TX18pCi0jaW5jbHVkZSAiZG9zL29zaGRyLmgiCi0jZWxpZiAgIGRlZmluZWQoX19XSU4zMl9WWERfXykKLSNpbmNsdWRlICJ2eGQvb3NoZHIuaCIKLSNlbGlmICAgZGVmaW5lZChfX05UX0RSSVZFUl9fKQotI2luY2x1ZGUgIm50ZHJ2L29zaGRyLmgiCi0jZWxpZiAgIGRlZmluZWQoX19XSU5ET1dTMzJfXykKLSNpbmNsdWRlICJ3aW4zMi9vc2hkci5oIgotI2VsaWYgICBkZWZpbmVkKF9fT1MyX1ZERF9fKQotI2luY2x1ZGUgInZ4ZC9vc2hkci5oIgotI2VsaWYgICBkZWZpbmVkKF9fT1MyX18pCi0jaWYgICAgIGRlZmluZWQoX19PUzJfUE1fXykKLSNpbmNsdWRlICJvczJwbS9vc2hkci5oIgotI2Vsc2UKLSNpbmNsdWRlICJvczIvb3NoZHIuaCIKLSNlbmRpZgotI2VsaWYgICBkZWZpbmVkKF9fTElOVVhfXykKLSNpZiAgICAgZGVmaW5lZChfX1VTRV9YMTFfXykKLSNpbmNsdWRlICJ4MTEvb3NoZHIuaCIKLSNlbHNlCi0jaW5jbHVkZSAibGludXgvb3NoZHIuaCIKLSNlbmRpZgotI2VsaWYgICBkZWZpbmVkKF9fUU5YX18pCi0jaWYgICAgIGRlZmluZWQoX19VU0VfUEhPVE9OX18pCi0jaW5jbHVkZSAicGhvdG9uL29zaGRyLmgiCi0jZWxpZiAgIGRlZmluZWQoX19VU0VfWDExX18pCi0jaW5jbHVkZSAieDExL29zaGRyLmgiCi0jZWxzZQotI2luY2x1ZGUgInFueC9vc2hkci5oIgotI2VuZGlmCi0jZWxpZiAgIGRlZmluZWQoX19CRU9TX18pCi0jaW5jbHVkZSAiYmVvcy9vc2hkci5oIgotI2Vsc2UKLSNlcnJvciAgUE0gbGlicmFyeSBub3QgcG9ydGVkIHRvIHRoaXMgcGxhdGZvcm0geWV0IQotI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9waG90b24vZXZlbnQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Bob3Rvbi9ldmVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODFkYTE2Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Bob3Rvbi9ldmVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBRTlggUGhvdG9uIEdVSQotKgotKiBEZXNjcmlwdGlvbjogIFFOWCBmdWxsc2NyZWVuIGNvbnNvbGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBTY2lUZWNoCi0qICAgICAgICAgICAgICAgY3Jvc3MgcGxhdGZvcm0gZXZlbnQgbGlicmFyeS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1c2hvcnQgICAgICAga2V5VXBNc2dbMjU2XSA9IHswfTsvKiBUYWJsZSBvZiBrZXkgdXAgbWVzc2FnZXMgICAgICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFRoZXNlIGFyZSBub3QgdXNlZCB1bmRlciBMaW51eCAqLwotI2RlZmluZSBfRVZUX2Rpc2FibGVJbnQoKSAgICAgICAxCi0jZGVmaW5lIF9FVlRfcmVzdG9yZUludChmbGFncykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zY2FuQ29kZSAgICAtIFNjYW4gY29kZSB0byB0ZXN0Ci0KLVJFTUFSS1M6Ci1UaGlzIG1hY3JvIGRldGVybWluZXMgaWYgYSBzcGVjaWZpZWQga2V5IGlzIGN1cnJlbnRseSBkb3duIGF0IHRoZQotdGltZSB0aGF0IHRoZSBjYWxsIGlzIG1hZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGlib29sIF9FVlRfaXNLZXlEb3duKAotICAgIHVjaGFyIHNjYW5jb2RlKQotewotICAgIHJldHVybiAoS2V5U3RhdGVbKHNjYW5jb2RlICYgMHhmOCkgPj4gM10gJiAoMSA8PCAoc2NhbmNvZGUgJiAweDcpKSA/Ci0JdHJ1ZSA6IGZhbHNlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXRyaWV2ZXMgYWxsIGV2ZW50cyBmcm9tIHRoZSBtb3VzZS9rZXlib2FyZCBldmVudCBxdWV1ZSBhbmQgc3R1ZmZzIHRoZW0KLWludG8gdGhlIE1HTCBldmVudCBxdWV1ZSBmb3IgZnVydGhlciBwcm9jZXNzaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9FVlRfcHVtcE1lc3NhZ2VzKHZvaWQpCi17Ci0gICAgaW50ICAgICAgICAgcGlkOwotICAgIHVpbnQgICAgICAgICAgICBtc2csIGJ1dF9zdGF0LCBtZXNzYWdlOwotICAgIHVjaGFyICAgICAgICAgICBldnRbc2l6ZW9mIChQaEV2ZW50X3QpICsgMTAyNF07Ci0gICAgUGhFdmVudF90ICAgICAgICpldmVudCA9ICh2b2lkICopZXZ0OwotICAgIFBoS2V5RXZlbnRfdCAgICAgICAgKmtleTsKLSAgICBQaFBvaW50ZXJFdmVudF90ICAgICptb3VzZTsKLSAgICBzdGF0aWMgaW50ICAgICAgZXh0ZW5kZWQ7Ci0gICAgZXZlbnRfdCAgICAgICAgIF9ldnQ7Ci0KLSAgICB3aGlsZSAoY291bnQgPCBFVkVOVFFTSVpFKSB7Ci0JdWludCAgICBtb2RzID0gMCwga2V5cCA9IDA7Ci0KLQlwaWQgPSBDcmVjZWl2ZSgwLCAmbXNnLCBzaXplb2YgKG1zZykpOwotCi0JaWYgKHBpZCA9PSAtMSkKLQkgICAgcmV0dXJuOwotCi0JaWYgKFBoRXZlbnRSZWFkKHBpZCwgZXZlbnQsIHNpemVvZiAoZXZ0KSkgPT0gUGhfRVZFTlRfTVNHKSB7Ci0JICAgIG1lbXNldCgmZXZ0LCAwLCBzaXplb2YgKGV2dCkpOwotCSAgICBpZiAoZXZlbnQtPnR5cGUgPT0gUGhfRVZfS0VZKSB7Ci0JCWtleSA9IFBoR2V0RGF0YShldmVudCk7Ci0KLQkJaWYgKGtleS0+a2V5X2ZsYWdzICYgS0VZX1NDQU5fVkFMSUQpIHsKLQkJICAgIGtleXAgPSBrZXktPmtleV9zY2FuOwotCQkgICAgaWYgKGtleS0+a2V5X2ZsYWdzICYgS0VZX0RPV04pCi0JCQlLZXlTdGF0ZVsoa2V5cCAmIDB4ZjgwMCkgPj4gMTFdCi0JCQkgICAgfD0gMSA8PCAoKGtleXAgJiAweDcwMCkgPj4gOCk7Ci0JCSAgICBlbHNlCi0JCQlLZXlTdGF0ZVsoa2V5cCAmIDB4ZjgwMCkgPj4gMTFdCi0JCQkgICAgJj0gfigxIDw8ICgoa2V5cCAmIDB4NzAwKSA+PiA4KSk7Ci0JCX0KLQkJaWYgKChrZXktPmtleV9mbGFncyAmIEtFWV9TWU1fVkFMSUQpIHx8IGV4dGVuZGVkKQotCQkgICAga2V5cCB8PSBrZXktPmtleV9zeW07Ci0KLQkJLyogTm8gd2F5IHRvIHRlbGwgbGVmdCBmcm9tIHJpZ2h0Li4uICovCi0JCWlmIChrZXktPmtleV9tb2RzICYgS0VZTU9EX1NISUZUKQotCQkgICAgbW9kcyA9IChFVlRfTEVGVFNISUZUIHwgRVZUX1JJR0hUU0hJRlQpOwotCQlpZiAoa2V5LT5rZXlfbW9kcyAmIEtFWU1PRF9DVFJMKQotCQkgICAgbW9kcyB8PSAoRVZUX0NUUkxTVEFURSB8IEVWVF9MRUZUQ1RSTCk7Ci0JCWlmIChrZXktPmtleV9tb2RzICYgS0VZTU9EX0FMVCkKLQkJICAgIG1vZHMgfD0gKEVWVF9BTFRTVEFURSB8IEVWVF9MRUZUQUxUKTsKLQotCQlfZXZ0LndoZW4gPSBldnQtPnRpbWVzdGFtcDsKLQkJaWYgKGtleS0+a2V5X2ZsYWdzICYgS0VZX1JFUEVBVCkgewotCQkgICAgX2V2dC53aGF0ID0gRVZUX0tFWVJFUEVBVDsKLQkJICAgIF9ldnQubWVzc2FnZSA9IDB4MTAwMDA7Ci0JCSAgICB9Ci0JCWVsc2UgaWYgKGtleS0+a2V5X2ZsYWdzICYgS0VZX0RPV04pCi0JCSAgICBfZXZ0LndoYXQgPSBFVlRfS0VZRE9XTjsKLQkJZWxzZQotCQkgICAgX2V2dC53aGF0ID0gRVZUX0tFWVVQOwotCQlfZXZ0Lm1vZGlmaWVycyA9IG1vZHM7Ci0JCV9ldnQubWVzc2FnZSB8PSBrZXlwOwotCi0JCWFkZEV2ZW50KCZfZXZ0KTsKLQotCQlzd2l0Y2goa2V5LT5rZXlfc2NhbiAmIDB4ZmYwMCkgewotCQkgICAgY2FzZSAweGUwMDA6Ci0JCQlleHRlbmRlZCA9IDE7Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgMHhlMDAxOgotCQkJZXh0ZW5kZWQgPSAyOwotCQkJYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkJaWYgKGV4dGVuZGVkKQotCQkJICAgIGV4dGVuZGVkLS07Ci0JCSAgICB9Ci0JCX0KLQkgICAgZWxzZSBpZiAoZXZlbnQtPnR5cGUgJiBQaF9FVl9QVFJfQUxMKSB7Ci0JCWJ1dF9zdGF0ID0gbWVzc2FnZSA9IDA7Ci0JCW1vdXNlID0gUGhHZXREYXRhKGV2ZW50KTsKLQotCQlpZiAobW91c2UtPmJ1dHRvbl9zdGF0ZSAmIFBoX0JVVFRPTl8zKQotCQkgICAgYnV0X3N0YXQgPSBFVlRfTEVGVEJVVDsKLQkJaWYgKG1vdXNlLT5idXR0b25zICYgUGhfQlVUVE9OXzMpCi0JCSAgICBtZXNzYWdlID0gRVZUX0xFRlRCTUFTSzsKLQotCQlpZiAobW91c2UtPmJ1dHRvbl9zdGF0ZSAmIFBoX0JVVFRPTl8xKQotCQkgICAgYnV0X3N0YXQgfD0gRVZUX1JJR0hUQlVUOwotCQlpZiAobW91c2UtPmJ1dHRvbnMgJiBQaF9CVVRUT05fMSkKLQkJICAgIG1lc3NhZ2UgfD0gRVZUX1JJR0hUQk1BU0s7Ci0KLQkJX2V2dC53aGVuID0gZXZ0LT50aW1lc3RhbXA7Ci0JCWlmIChldmVudC0+dHlwZSAmIFBoX0VWX1BUUl9NT1RJT04pIHsKLQkJICAgIF9ldnQud2hhdCA9IEVWVF9NT1VTRU1PVkU7Ci0JCSAgICBfZXZ0LndoZXJlX3ggPSBtb3VzZS0+cG9zLng7Ci0JCSAgICBfZXZ0LndoZXJlX3kgPSBtb3VzZS0+cG9zLnk7Ci0JCSAgICBfZXZ0Lm1vZGlmaWVycyA9IGJ1dF9zdGF0OwotCQkgICAgYWRkRXZlbnQoJl9ldnQpOwotCQkgICAgfQotCQlpZiAoZXZlbnQtPnR5cGUgJiBQaF9FVl9CVVRfUFJFU1MpCi0JCSAgICBfZXZ0LndoYXQgPSBFVlRfTU9VU0VET1dOOwotCQllbHNlCi0JCSAgICBfZXZ0LndoYXQgPSBFVlRfTU9VU0VVUDsKLQkJX2V2dC53aGVyZV94ID0gbW91c2UtPnBvcy54OwotCQlfZXZ0LndoZXJlX3kgPSBtb3VzZS0+cG9zLnk7Ci0JCV9ldnQubW9kaWZpZXJzID0gYnV0X3N0YXQ7Ci0JCV9ldnQubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCWFkZEV2ZW50KCZfZXZ0KTsKLQkJfQotCSAgICB9Ci0JZWxzZQotCSAgICByZXR1cm47Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgbWFjcm8vZnVuY3Rpb24gaXMgdXNlZCB0byBjb252ZXJ0cyB0aGUgc2NhbiBjb2RlcyByZXBvcnRlZCBieSB0aGUKLWtleWJvYXJkIHRvIG91ciBldmVudCBsaWJyYXJpZXMgbm9ybWFsaXNlZCBmb3JtYXQuIFdlIG9ubHkgaGF2ZSBvbmUgc2NhbgotY29kZSBmb3IgdGhlICdBJyBrZXksIGFuZCB1c2Ugc2hpZnQgbW9kaWZpZXJzIHRvIGRldGVybWluZSBpZiBpdCBpcyBhCi1DdHJsLUYxLCBBbHQtRjEgZXRjLiBUaGUgcmF3IHNjYW4gY29kZXMgZnJvbSB0aGUga2V5Ym9hcmQgd29yayB0aGlzIHdheSwKLWJ1dCB0aGUgT1MgZ2l2ZXMgdXMgJ2Nvb2tlZCcgc2NhbiBjb2Rlcywgd2UgaGF2ZSB0byB0cmFuc2xhdGUgdGhlbSBiYWNrCi10byB0aGUgcmF3IGZvcm1hdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9FVlRfbWFza0tleUNvZGUoZXZ0KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNhZmVseSBhYm9ydCB0aGUgZXZlbnQgbW9kdWxlIHVwb24gY2F0Y2hpbmcgYSBmYXRhbCBlcnJvci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9FVlRfYWJvcnQoCi0gICAgaW50IHNpZ25vKQotewotICAgIGNoYXIgICAgYnVmWzgwXTsKLQotICAgIEVWVF9leGl0KCk7Ci0gICAgc3ByaW50ZihidWYsIlRlcm1pbmF0aW5nIG9uIHNpZ25hbCAlZCIsc2lnbm8pOwotICAgIFBNX2ZhdGFsRXJyb3IoYnVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1tb3VzZU1vdmUgICAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbmV2ZSB0aGUgbW91c2UgbmVlZHMgdG8gYmUgbW92ZWQKLQotUkVNQVJLUzoKLUluaXRpbGlhc2UgdGhlIGV2ZW50IGhhbmRsaW5nIG1vZHVsZS4gSGVyZSB3ZSBpbnN0YWxsIG91ciBtb3VzZSBoYW5kbGluZyBJU1IKLXRvIGJlIGNhbGxlZCB3aGVuZXZlciBhbnkgYnV0dG9uJ3MgYXJlIHByZXNzZWQgb3IgcmVsZWFzZWQuIFdlIGFsc28gYnVpbGQKLXRoZSBmcmVlIGxpc3Qgb2YgZXZlbnRzIGluIHRoZSBldmVudCBxdWV1ZS4KLQotV2UgdXNlIGhhbmRsZXIgbnVtYmVyIDIgb2YgdGhlIG1vdXNlIGxpYnJhcmllcyBpbnRlcnJ1cHQgaGFuZGxlcnMgZm9yIG91cgotZXZlbnQgaGFuZGxpbmcgcm91dGluZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2luaXQoCi0gICAgX0VWVF9tb3VzZU1vdmVIYW5kbGVyIG1vdXNlTW92ZSkKLXsKLSAgICBpbnQgICAgICAgICBpOwotCi0gICAgLyogSW5pdGlhbGlzZSB0aGUgZXZlbnQgcXVldWUgKi8KLSAgICBfbW91c2VNb3ZlID0gbW91c2VNb3ZlOwotICAgIGluaXRFdmVudFF1ZXVlKCk7Ci0gICAgbWVtc2V0KCh2b2lkICopS2V5U3RhdGUsIDAsIHNpemVvZiAoS2V5U3RhdGUpKTsKLQotICAgIC8qIENhdGNoIHByb2dyYW0gdGVybWluYXRpb24gc2lnbmFscyBzbyB3ZSBjYW4gY2xlYW4gdXAgcHJvcGVybHkgKi8KLSAgICBzaWduYWwoU0lHQUJSVCwgX0VWVF9hYm9ydCk7Ci0gICAgc2lnbmFsKFNJR0ZQRSwgX0VWVF9hYm9ydCk7Ci0gICAgc2lnbmFsKFNJR0lOVCwgX0VWVF9hYm9ydCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1DaGFuZ2VzIHRoZSByYW5nZSBvZiBjb29yZGluYXRlcyByZXR1cm5lZCBieSB0aGUgbW91c2UgZnVuY3Rpb25zIHRvIHRoZQotc3BlY2lmaWVkIHJhbmdlIG9mIHZhbHVlcy4gVGhpcyBpcyB1c2VkIHdoZW4gY2hhbmdpbmcgYmV0d2VlbiBncmFwaGljcwotbW9kZXMgc2V0IHRoZSByYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyBmb3IgdGhlIG5ldyBkaXNwbGF5IG1vZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX3NldE1vdXNlUmFuZ2UoCi0gICAgaW50IHhSZXMsCi0gICAgaW50IHlSZXMpCi17Ci0gICAgLyogVE9ETzogTmVlZCB0byBjYWxsIElucHV0IHRvIGNoYW5nZSB0aGUgY29vcmRpbmF0ZXMgdGhhdCBpdCByZXR1cm5zICovCi0gICAgLyogICAgICAgZm9yIG1vdXNlIGV2ZW50cyEhICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhaWxpc2VzIHRoZSBpbnRlcm5hbCBldmVudCBoYW5kbGluZyBtb2R1bGVzLiBUaGUgRVZUX3N1c3BlbmQgZnVuY3Rpb24KLWNhbiBiZSBjYWxsZWQgdG8gc3VzcGVuZCBldmVudCBoYW5kbGluZyAoc3VjaCBhcyB3aGVuIHNoZWxsaW5nIG91dCB0byBET1MpLAotYW5kIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVzdW1lIGl0IGFnYWluIGxhdGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX3Jlc3VtZSh2b2lkKQotewotICAgIC8qIERvIG5vdGhpbmcgZm9yIFBob3RvbiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotU3VzcGVuZHMgYWxsIG9mIG91ciBldmVudCBoYW5kbGluZyBvcGVyYXRpb25zLiBUaGlzIGlzIGFsc28gdXNlZCB0bwotZGUtaW5zdGFsbCB0aGUgZXZlbnQgaGFuZGxpbmcgY29kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVF9zdXNwZW5kKHZvaWQpCi17Ci0gICAgLyogRG8gbm90aGluZyBmb3IgUGhvdG9uICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1FeGl0cyB0aGUgZXZlbnQgbW9kdWxlIGZvciBwcm9ncmFtIHRlcm1pbmF0YXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfZXhpdCh2b2lkKQotewotICAgIC8qIFJlc3RvcmUgc2lnbmFsIGhhbmRsZXJzICovCi0gICAgc2lnbmFsKFNJR0FCUlQsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdGUEUsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdJTlQsIFNJR19ERkwpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcGhvdG9uL29zaGRyLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9waG90b24vb3NoZHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3MjU2My4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9waG90b24vb3NoZHIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBRTlggUGhvdG9uIEdVSQotKgotKiBEZXNjcmlwdGlvbjogIEluY2x1ZGUgZmlsZSB0byBpbmNsdWRlIGFsbCBPUyBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3lzL21vdXNlLmg+Ci0jaW5jbHVkZSA8c3lzL2tleWJvYXJkLmg+Ci0jaW5jbHVkZSA8c3lzL2ZkLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxjb25pby5oPgotI2luY2x1ZGUgPHByb2Nlc3MuaD4KLSNpbmNsdWRlIDxzeXMva2VybmVsLmg+Ci0jaW5jbHVkZSA8UGguaD4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3BtLnZwdyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3BtLnZwdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZlNjhhNy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9wbS52cHcKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi1bRGVwZW5kZW5jaWVzXQ0KLVtDdXJyZW50UHJvamVjdF0NCi1jdXJwcm9qPXBtbGludXgudnBqDQotW1Byb2plY3RGaWxlc10NCi1wbWNvbW1vbi52cGoNCi1wbWRvcy52cGoNCi1wbWxpbnV4LnZwag0KLXBtcW54LnZwag0KLXBtdnhkLnZwag0KLXBtd2luMzIudnBqDQotel9zYW1wbGVzLnZwag0KLS4uXGEtZ2xvYmFsIGluY2x1ZGVzLnZwag0KLVtUcmVlRXhwYW5zaW9uXQ0KLSIuLlxhLWdsb2JhbCBpbmNsdWRlcy52cGoiIDANCi1wbWNvbW1vbi52cGogMA0KLXBtZG9zLnZwaiAwDQotcG1saW51eC52cGogMA0KLXBtcW54LnZwaiAwDQotcG12eGQudnBqIDANCi1wbXdpbjMyLnZwaiAwDQotel9zYW1wbGVzLnZwaiAxIDENCi1bU3RhdGVdDQotU0NSRUVOOiAxMjgwIDEwMjQgMCAwIDk2MCA3NDYgMCAwIE0gMCAwIDAgMCA5NzcgNjMxDQotQ1dEOiBDOlxzY2l0ZWNoXHNyY1xwbQ0KLUZJTEVISVNUOiA5DQotQzpcc2NpdGVjaFxtYWtlZGVmc1xnY2Nfd2luMzIubWsNCi1DOlxzY2l0ZWNoXGJpblxnY2MyLXczMi5iYXQNCi1DOlxzY2l0ZWNoXGJpblxnY2MyLWMzMi5iYXQNCi1DOlxzY2l0ZWNoXGJpblxnY2MyLWxpbnV4LmJhdA0KLUM6XHNjaXRlY2hcbWFrZWRlZnNcZ2NjX2xpbnV4Lm1rDQotQzpcc2NpdGVjaFxzcmNccG1cbGludXhcZXZlbnQuYw0KLUM6XHNjaXRlY2hcc3JjXHBtXGxpbnV4XG9zaGRyLmgNCi1DOlxzY2l0ZWNoXHNyY1xwbVxldmVudC5jDQotQzpcc2NpdGVjaFxzcmNccG1ccG1saW51eC52cGoNCi1bUHJvamVjdERhdGVzXQ0KLXBtY29tbW9uLnZwaj0yMDAxMDUxNzE2NDMzNTI5MA0KLXBtZG9zLnZwaj0yMDAxMDUxNzE2NDMzNTI5MA0KLXBtbGludXgudnBqPTIwMDEwNjIwMTc1ODI5ODEyDQotcG1xbngudnBqPTIwMDEwNTE3MTY0MzM1MjkwDQotcG12eGQudnBqPTIwMDEwNTE3MTY0MzM1MzA2DQotcG13aW4zMi52cGo9MjAwMTA1MTcxNjQzMzUzMDYNCi16X3NhbXBsZXMudnBqPTIwMDEwNTE3MTY0MzM1MzA2DQotLi5cYS1nbG9iYWwgaW5jbHVkZXMudnBqPTIwMDEwNTE3MTY0MzM0OTc4DQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG1jb21tb24udnBqIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG1jb21tb24udnBqCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGI4NzJkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3BtY29tbW9uLnZwagorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLVtDT01QSUxFUl0NCi12ZXJzaW9uPTUuMGINCi1NQUNSTz1cbg0KLWFjdGl2ZWNvbmZpZz0sd2MxMC1kMzINCi1GSUxURVJOQU1FPVNvdXJjZSBGaWxlc1xuSW5jbHVkZSBGaWxlc1xuQXNzZW1ibGVyIEZpbGVzXG5PdGhlciBGaWxlc1xuDQotRklMVEVSUEFUVEVSTj0qLmM7Ki5jcHA7Ki5jeHg7Ki5wcmc7Ki5wYXM7Ki5kcHI7Ki5iYXM7Ki5qYXZhOyouc2M7Ki5lOyouY29iOyouaHRtbDsqLnJjXG4qLmhcbiouYXNtXG4qLipcbg0KLUZJTFRFUkFTU09DSUFURUZJTEVUWVBFUz0wIDAgMCAwIA0KLUZJTFRFUkFQUENPTU1BTkQ9XG5cblxuXG4NCi12Y3Nwcm9qZWN0PVNDQzpQZXJmb3JjZSBTQ006Ly9kZXBvdA0KLXZjc2xvY2FscGF0aD1TQ0M6UGVyZm9yY2UgU0NNOmM6XA0KLWNvbXBpbGU9Y29uY3VyfGNhcHR1cmV8aGlkZXw6Q29tcGlsZTomQ29tcGlsZSwNCi1tYWtlPWNvbmN1cnxjYXB0dXJlfGhpZGV8Y2xlYXJ8c2F2ZWFsbHw6QnVpbGQ6JkJ1aWxkLA0KLXJlYnVpbGQ9Y29uY3VyfGNhcHR1cmV8aGlkZXxjbGVhcnxzYXZlYWxsfDpSZWJ1aWxkOiZSZWJ1aWxkLA0KLWRlYnVnPWNvbmN1cnxjYXB0dXJlfGhpZGV8c2F2ZW5vbmV8OkRlYnVnOiZEZWJ1ZywNCi1leGVjdXRlPWhpZGV8c2F2ZW5vbmV8OkV4ZWN1dGU6RSZ4ZWN1dGUsDQotdXNlcjE9aGlkZXw6VXNlciAxOlVzZXIgMSwNCi11c2VyMj1oaWRlfDpVc2VyIDI6VXNlciAyLA0KLXdvcmtpbmdkaXI9Lg0KLWluY2x1ZGVkaXJzPSUoU0NJVEVDSClcaW5jbHVkZTslKFBSSVZBVEUpXGluY2x1ZGUNCi1yZWZmaWxlPQ0KLVtGSUxFU10NCi1jb21tb24uYw0KLWNwdWluZm8uYw0KLWRlYnVnLmMNCi1ldmVudC5jDQotbWFrZWZpbGUNCi1vc2hkci5oDQotenRpbWVyLmMNCi0uLlxjb21tb25cYWdwbGliLmMNCi1jb2RlcGFnZVx1c19lbmcuYw0KLWNvbW1vblxfY3B1aW5mby5hc20NCi1jb21tb25cX2RtYS5hc20NCi1jb21tb25cX2ludDY0LmFzbQ0KLWNvbW1vblxfam95LmFzbQ0KLWNvbW1vblxfbXRyci5hc20NCi1jb21tb25cX3BjaWxpYi5hc20NCi1jb21tb25cYWdwLmMNCi1jb21tb25ca2V5Ym9hcmQuYw0KLWNvbW1vblxtYWxsb2MuYw0KLWNvbW1vblxtdHJyLmMNCi1jb21tb25ccGNpbGliLmMNCi1jb21tb25cdW5peGlvLmMNCi1jb21tb25cdmdhc3RhdGUuYw0KLVtBU1NPQ0lBVElPTl0NCi1bQ09ORklHVVJBVElPTlNdDQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG1kb3MudnBqIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG1kb3MudnBqCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTU3NTEzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3BtZG9zLnZwagorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLVtTY2lUZWNoXQ0KLWNvbXBpbGVyPXdjMTAtIA0KLXRhcmdldG9zPWQzMiANCi1bQ09NUElMRVJdDQotdmVyc2lvbj01LjBiDQotTUFDUk89ZW5hYmxlX2N1cnJlbnRfY29tcGlsZXJcbg0KLWFjdGl2ZWNvbmZpZz0sVEVTVF9IQVJORVNTPTENCi1GSUxURVJOQU1FPVNvdXJjZSBGaWxlc1xuSW5jbHVkZSBGaWxlc1xuQXNzZW1ibGVyIEZpbGVzXG4NCi1GSUxURVJQQVRURVJOPSouYzsqLmNwcDsqLmN4eDsqLnByZzsqLnBhczsqLmRwcjsqLmJhczsqLmphdmE7Ki5zYzsqLmU7Ki5jb2I7Ki5odG1sOyoucmNcbiouaFxuKi5hc21cbg0KLUZJTFRFUkFTU09DSUFURUZJTEVUWVBFUz0wIDAgMCANCi1GSUxURVJBUFBDT01NQU5EPVxuXG5cbg0KLXZjc3Byb2plY3Q9U0NDOlBlcmZvcmNlIFNDTTovL2RlcG90DQotdmNzbG9jYWxwYXRoPVNDQzpQZXJmb3JjZSBTQ006YzpcDQotY29tcGlsZT1jb25jdXJ8Y2FwdHVyZXxjbGVhcnw6Q29tcGlsZTomQ29tcGlsZSxkbWFrZSAlbi5vYmogLXUgJWINCi1tYWtlPWNvbmN1cnxjYXB0dXJlfGNsZWFyfHNhdmVhbGx8OkJ1aWxkOiZCdWlsZCxkbWFrZSBpbnN0YWxsICViDQotcmVidWlsZD1jb25jdXJ8Y2FwdHVyZXxjbGVhcnxzYXZlYWxsfDpSZWJ1aWxkOiZSZWJ1aWxkLGRtYWtlIGNsZWFuZXhlICYgZG1ha2UgaW5zdGFsbCAtdSAlYg0KLWRlYnVnPWNvbmN1cnxjYXB0dXJlfGhpZGV8c2F2ZW5vbmV8OkRlYnVnOiZEZWJ1ZywNCi1leGVjdXRlPWhpZGV8c2F2ZW5vbmV8bm9jaGFuZ2VkaXJ8OkV4ZWN1dGU6RSZ4ZWN1dGUsDQotdXNlcjE9aGlkZXw6VXNlciAxOlVzZXIgMSwNCi11c2VyMj1oaWRlfDpVc2VyIDI6VXNlciAyLA0KLXVzZXJ0b29sX2NsZWFuX2RpcmVjdG9yeT1jb25jdXJ8Y2FwdHVyZXxoaWRlfHNhdmVub25lfG5vY2hhbmdlZGlyfDpDbGVhbiBEaXJlY3Rvcnk6QyZsZWFuIERpcmVjdG9yeSxkbWFrZSBjbGVhbmV4ZQ0KLXdvcmtpbmdkaXI9Lg0KLWluY2x1ZGVkaXJzPSUoU0NJVEVDSClcaW5jbHVkZTslKFBSSVZBVEUpXGluY2x1ZGUNCi1yZWZmaWxlPQ0KLVtGSUxFU10NCi1kb3NcX2V2ZW50LmFzbQ0KLWRvc1xfbHp0aW1lci5hc20NCi1kb3NcX3BtLmFzbQ0KLWRvc1xfcG1kb3MuYXNtDQotZG9zXF92ZmxhdC5hc20NCi1kb3NcY3B1aW5mby5jDQotZG9zXGV2ZW50LmMNCi1kb3Ncb3NoZHIuaA0KLWRvc1xwbS5jDQotZG9zXHBtZG9zLmMNCi1kb3NcdmZsYXQuYw0KLWRvc1x6dGltZXIuYw0KLVtBU1NPQ0lBVElPTl0NCi1bQ09ORklHVVJBVElPTlNdDQotY29uZmlnPSxOT1JNQUxfQlVJTEQ9MQ0KLWNvbmZpZz0sVEVTVF9IQVJORVNTPTENCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9wbWxpbnV4LnZwaiBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3BtbGludXgudnBqCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmZiZjg0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3BtbGludXgudnBqCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotW1NjaVRlY2hdDQotY29tcGlsZXI9Z2NjMi0NCi10YXJnZXRvcz1saW51eA0KLVtDT01QSUxFUl0NCi12ZXJzaW9uPTUuMGINCi1NQUNSTz1lbmFibGVfY3VycmVudF9jb21waWxlclxuDQotRklMVEVSTkFNRT1Tb3VyY2UgRmlsZXNcbkluY2x1ZGUgRmlsZXNcbkFzc2VtYmxlciBGaWxlc1xuDQotRklMVEVSUEFUVEVSTj0qLmM7Ki5jcHA7Ki5jeHg7Ki5wcmc7Ki5wYXM7Ki5kcHI7Ki5iYXM7Ki5qYXZhOyouc2M7Ki5lOyouY29iOyouaHRtbDsqLnJjXG4qLmhcbiouYXNtXG4NCi1GSUxURVJBU1NPQ0lBVEVGSUxFVFlQRVM9MCAwIDANCi1GSUxURVJBUFBDT01NQU5EPVxuXG5cbg0KLXZjc3Byb2plY3Q9U0NDOlBlcmZvcmNlIFNDTTovL2RlcG90DQotdmNzbG9jYWxwYXRoPVNDQzpQZXJmb3JjZSBTQ006YzpcDQotYWN0aXZlY29uZmlnPSxpbnN0YWxsIEJVSUxEX0RMTD0xDQotY29tcGlsZT1jb25jdXJ8Y2FwdHVyZXxjbGVhcnw6Q29tcGlsZTomQ29tcGlsZSxkbWFrZSAlbi5vIC11DQotbWFrZT1jb25jdXJ8Y2FwdHVyZXxjbGVhcnxzYXZlYWxsfDpCdWlsZDomQnVpbGQsZG1ha2UgJWINCi1yZWJ1aWxkPWNvbmN1cnxjYXB0dXJlfGNsZWFyfHNhdmVhbGx8OlJlYnVpbGQ6JlJlYnVpbGQsZG1ha2UgY2xlYW5leGUgJiBkbWFrZSAtdSAlYg0KLWRlYnVnPWNvbmN1cnxjYXB0dXJlfGhpZGV8c2F2ZW5vbmV8OkRlYnVnOiZEZWJ1ZywNCi1leGVjdXRlPWhpZGV8c2F2ZW5vbmV8bm9jaGFuZ2VkaXJ8OkV4ZWN1dGU6RSZ4ZWN1dGUsDQotdXNlcjE9aGlkZXw6VXNlciAxOlVzZXIgMSwNCi11c2VyMj1oaWRlfDpVc2VyIDI6VXNlciAyLA0KLXVzZXJ0b29sX2NsZWFuX2RpcmVjdG9yeT1jb25jdXJ8Y2FwdHVyZXxoaWRlfHNhdmVub25lfG5vY2hhbmdlZGlyfDpDbGVhbiBEaXJlY3Rvcnk6QyZsZWFuIERpcmVjdG9yeSxkbWFrZSBjbGVhbmV4ZQ0KLXdvcmtpbmdkaXI9Lg0KLWluY2x1ZGVkaXJzPSUoU0NJVEVDSClcaW5jbHVkZTslKFBSSVZBVEUpXGluY2x1ZGUNCi1yZWZmaWxlPQ0KLVtGSUxFU10NCi1saW51eFxjcHVpbmZvLmMNCi1saW51eFxldmVudC5jDQotbGludXhcb3NoZHIuaA0KLWxpbnV4XHBtLmMNCi1saW51eFx2ZmxhdC5jDQotbGludXhcenRpbWVyLmMNCi1bQVNTT0NJQVRJT05dDQotW0NPTkZJR1VSQVRJT05TXQ0KLWNvbmZpZz0saW5zdGFsbCBCVUlMRF9ETEw9MQ0KLWNvbmZpZz0saW5zdGFsbA0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3BtbnRkcnYudnBqIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG1udGRydi52cGoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYzM1YTcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG1udGRydi52cGoKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1bU2NpVGVjaF0NCi1jb21waWxlcj12YzYwLSANCi10YXJnZXRvcz1kcnZ3MmsNCi1bQ09NUElMRVJdDQotdmVyc2lvbj01LjBiDQotTUFDUk89ZW5hYmxlX2N1cnJlbnRfY29tcGlsZXJcbg0KLWFjdGl2ZWNvbmZpZz0sd2MxMC1kMzINCi1GSUxURVJOQU1FPVNvdXJjZSBGaWxlc1xuSW5jbHVkZSBGaWxlc1xuQXNzZW1ibGVyIEZpbGVzXG4NCi1GSUxURVJQQVRURVJOPSouYzsqLmNwcDsqLmN4eDsqLnByZzsqLnBhczsqLmRwcjsqLmJhczsqLmphdmE7Ki5zYzsqLmU7Ki5jb2I7Ki5odG1sOyoucmNcbiouaFxuKi5hc21cbg0KLUZJTFRFUkFTU09DSUFURUZJTEVUWVBFUz0wIDAgMA0KLUZJTFRFUkFQUENPTU1BTkQ9XG5cblxuDQotdmNzcHJvamVjdD1TQ0M6UGVyZm9yY2UgU0NNOi8vZGVwb3QNCi12Y3Nsb2NhbHBhdGg9U0NDOlBlcmZvcmNlIFNDTTpjOlwNCi1jb21waWxlPWNvbmN1cnxjYXB0dXJlfDpDb21waWxlOiZDb21waWxlLGRtYWtlICVuLm9iag0KLW1ha2U9Y29uY3VyfGNhcHR1cmV8Y2xlYXJ8c2F2ZWFsbHw6QnVpbGQ6JkJ1aWxkLGRtYWtlIGluc3RhbGwNCi1yZWJ1aWxkPWNvbmN1cnxjYXB0dXJlfGNsZWFyfHNhdmVhbGx8OlJlYnVpbGQ6JlJlYnVpbGQsZG1ha2UgY2xlYW5leGUgJiBkbWFrZSBpbnN0YWxsIC11DQotZGVidWc9Y29uY3VyfGNhcHR1cmV8aGlkZXxzYXZlbm9uZXw6RGVidWc6JkRlYnVnLA0KLWV4ZWN1dGU9aGlkZXxzYXZlbm9uZXxub2NoYW5nZWRpcnw6RXhlY3V0ZTpFJnhlY3V0ZSwNCi11c2VyMT1oaWRlfDpVc2VyIDE6VXNlciAxLA0KLXVzZXIyPWhpZGV8OlVzZXIgMjpVc2VyIDIsDQotdXNlcnRvb2xfY2xlYW5fZGlyZWN0b3J5PWNvbmN1cnxjYXB0dXJlfGhpZGV8c2F2ZW5vbmV8OkNsZWFuIERpcmVjdG9yeTomQ2xlYW4gRGlyZWN0b3J5LGRtYWtlIGNsZWFuZXhlDQotd29ya2luZ2Rpcj0uDQotaW5jbHVkZWRpcnM9JShTQ0lURUNIKVxpbmNsdWRlOyUoUFJJVkFURSlcaW5jbHVkZQ0KLXJlZmZpbGU9DQotW0ZJTEVTXQ0KLS4uXC4uXGluY2x1ZGVcbnRkcml2ZXIuaA0KLW50ZHJ2XF9wbS5hc20NCi1udGRydlxjcHVpbmZvLmMNCi1udGRydlxpbnQ4Ni5jDQotbnRkcnZcaXJxLmMNCi1udGRydlxtZW0uYw0KLW50ZHJ2XG9zaGRyLmgNCi1udGRydlxwbS5jDQotbnRkcnZcc3RkaW8uYw0KLW50ZHJ2XHN0ZGxpYi5jDQotbnRkcnZcdmZsYXQuYw0KLW50ZHJ2XHp0aW1lci5jDQotW0FTU09DSUFUSU9OXQ0KLVtDT05GSUdVUkFUSU9OU10NCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9wbXFueC52cGogYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9wbXFueC52cGoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NDE3MDIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG1xbngudnBqCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotW1NjaVRlY2hdDQotY29tcGlsZXI9d2MxMC0NCi10YXJnZXRvcz1xbngNCi1bQ09NUElMRVJdDQotdmVyc2lvbj01LjBiDQotTUFDUk89ZW5hYmxlX2N1cnJlbnRfY29tcGlsZXJcbg0KLWFjdGl2ZWNvbmZpZz0sd2MxMC1kMzINCi1GSUxURVJOQU1FPVNvdXJjZSBGaWxlc1xuSW5jbHVkZSBGaWxlc1xuQXNzZW1ibGVyIEZpbGVzXG4NCi1GSUxURVJQQVRURVJOPSouYzsqLmNwcDsqLmN4eDsqLnByZzsqLnBhczsqLmRwcjsqLmJhczsqLmphdmE7Ki5zYzsqLmU7Ki5jb2I7Ki5odG1sOyoucmNcbiouaFxuKi5hc21cbg0KLUZJTFRFUkFTU09DSUFURUZJTEVUWVBFUz0wIDAgMA0KLUZJTFRFUkFQUENPTU1BTkQ9XG5cblxuDQotdmNzcHJvamVjdD1TQ0M6UGVyZm9yY2UgU0NNOi8vZGVwb3QNCi12Y3Nsb2NhbHBhdGg9U0NDOlBlcmZvcmNlIFNDTTpjOlwNCi1jb21waWxlPWNvbmN1cnxjYXB0dXJlfGNsZWFyfDpDb21waWxlOiZDb21waWxlLGRtYWtlICVuLm9iag0KLW1ha2U9Y29uY3VyfGNhcHR1cmV8Y2xlYXJ8c2F2ZWFsbHw6QnVpbGQ6JkJ1aWxkLGRtYWtlIGluc3RhbGwNCi1yZWJ1aWxkPWNvbmN1cnxjYXB0dXJlfGNsZWFyfHNhdmVhbGx8OlJlYnVpbGQ6JlJlYnVpbGQsZG1ha2UgY2xlYW5leGUgJiBkbWFrZSBpbnN0YWxsIC11DQotZGVidWc9Y29uY3VyfGNhcHR1cmV8aGlkZXxzYXZlbm9uZXw6RGVidWc6JkRlYnVnLA0KLWV4ZWN1dGU9aGlkZXxzYXZlbm9uZXxub2NoYW5nZWRpcnw6RXhlY3V0ZTpFJnhlY3V0ZSwNCi11c2VyMT1oaWRlfDpVc2VyIDE6VXNlciAxLA0KLXVzZXIyPWhpZGV8OlVzZXIgMjpVc2VyIDIsDQotdXNlcnRvb2xfY2xlYW5fZGlyZWN0b3J5PWNvbmN1cnxjYXB0dXJlfGhpZGV8c2F2ZW5vbmV8bm9jaGFuZ2VkaXJ8OkNsZWFuIERpcmVjdG9yeTpDJmxlYW4gRGlyZWN0b3J5LGRtYWtlIGNsZWFuZXhlDQotd29ya2luZ2Rpcj0uDQotaW5jbHVkZWRpcnM9JShTQ0lURUNIKVxpbmNsdWRlOyUoUFJJVkFURSlcaW5jbHVkZQ0KLXJlZmZpbGU9DQotW0ZJTEVTXQ0KLXFueFxfbXRycnFueC5hc20NCi1xbnhcY3B1aW5mby5jDQotcW54XGV2ZW50LmMNCi1xbnhcbXRycnFueC5jDQotcW54XG9zaGRyLmgNCi1xbnhccG0uYw0KLXFueFx2ZmxhdC5jDQotcW54XHp0aW1lci5jDQotW0FTU09DSUFUSU9OXQ0KLVtDT05GSUdVUkFUSU9OU10NCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9wbXZ4ZC52cGogYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9wbXZ4ZC52cGoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmY2Y5MTEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG12eGQudnBqCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotW1NjaVRlY2hdDQotY29tcGlsZXI9YmM1MC0NCi10YXJnZXRvcz12eGQNCi1bQ09NUElMRVJdDQotdmVyc2lvbj01LjBiDQotTUFDUk89ZW5hYmxlX2N1cnJlbnRfY29tcGlsZXJcbg0KLWFjdGl2ZWNvbmZpZz0sd2MxMC1kMzINCi1GSUxURVJOQU1FPVNvdXJjZSBGaWxlc1xuSW5jbHVkZSBGaWxlc1xuQXNzZW1ibGVyIEZpbGVzXG4NCi1GSUxURVJQQVRURVJOPSouYzsqLmNwcDsqLmN4eDsqLnByZzsqLnBhczsqLmRwcjsqLmJhczsqLmphdmE7Ki5zYzsqLmU7Ki5jb2I7Ki5odG1sOyoucmNcbiouaFxuKi5hc21cbg0KLUZJTFRFUkFTU09DSUFURUZJTEVUWVBFUz0wIDAgMCANCi1GSUxURVJBUFBDT01NQU5EPVxuXG5cbg0KLXZjc3Byb2plY3Q9U0NDOlBlcmZvcmNlIFNDTTovL2RlcG90DQotdmNzbG9jYWxwYXRoPVNDQzpQZXJmb3JjZSBTQ006YzpcDQotY29tcGlsZT1jb25jdXJ8Y2FwdHVyZXxub2NoYW5nZWRpcnw6Q29tcGlsZTomQ29tcGlsZSxkbWFrZSAlbi5vYmoNCi1tYWtlPWNvbmN1cnxjYXB0dXJlfGNsZWFyfHNhdmVhbGx8bm9jaGFuZ2VkaXJ8OkJ1aWxkOiZCdWlsZCxkbWFrZSBpbnN0YWxsDQotcmVidWlsZD1jb25jdXJ8Y2FwdHVyZXxjbGVhcnxzYXZlYWxsfG5vY2hhbmdlZGlyfDpSZWJ1aWxkOiZSZWJ1aWxkLGRtYWtlIGNsZWFuZXhlICYgZG1ha2UgaW5zdGFsbCAtdQ0KLWRlYnVnPWNvbmN1cnxjYXB0dXJlfGhpZGV8c2F2ZW5vbmV8bm9jaGFuZ2VkaXJ8OkRlYnVnOiZEZWJ1ZywNCi1leGVjdXRlPWhpZGV8c2F2ZW5vbmV8bm9jaGFuZ2VkaXJ8OkV4ZWN1dGU6RSZ4ZWN1dGUsDQotdXNlcjE9aGlkZXw6VXNlciAxOlVzZXIgMSwNCi11c2VyMj1oaWRlfDpVc2VyIDI6VXNlciAyLA0KLXVzZXJ0b29sX2NsZWFuX2RpcmVjdG9yeT1jb25jdXJ8Y2FwdHVyZXxoaWRlfHNhdmVub25lfG5vY2hhbmdlZGlyfDpDbGVhbiBEaXJlY3Rvcnk6JkNsZWFuIERpcmVjdG9yeSxkbWFrZSBjbGVhbmV4ZQ0KLXdvcmtpbmdkaXI9Lg0KLWluY2x1ZGVkaXJzPSUoU0NJVEVDSClcaW5jbHVkZTslKFBSSVZBVEUpXGluY2x1ZGUNCi1yZWZmaWxlPQ0KLVtGSUxFU10NCi12eGRcX3BtLmFzbQ0KLXZ4ZFxjcHVpbmZvLmMNCi12eGRcZmlsZWlvLmMNCi12eGRcb3NoZHIuaA0KLXZ4ZFxwbS5jDQotdnhkXHZmbGF0LmMNCi12eGRcenRpbWVyLmMNCi1bQVNTT0NJQVRJT05dDQotW0NPTkZJR1VSQVRJT05TXQ0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Btd2luMzIudnBqIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG13aW4zMi52cGoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZTY4MjIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcG13aW4zMi52cGoKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1bU2NpVGVjaF0NCi1jb21waWxlcj12YzYwLSANCi10YXJnZXRvcz1jMzIgDQotW0NPTVBJTEVSXQ0KLXZlcnNpb249NS4wYg0KLU1BQ1JPPWVuYWJsZV9jdXJyZW50X2NvbXBpbGVyXG4NCi1hY3RpdmVjb25maWc9LHdjMTAtZDMyDQotRklMVEVSTkFNRT1Tb3VyY2UgRmlsZXNcbkluY2x1ZGUgRmlsZXNcbkFzc2VtYmxlciBGaWxlc1xuDQotRklMVEVSUEFUVEVSTj0qLmM7Ki5jcHA7Ki5jeHg7Ki5wcmc7Ki5wYXM7Ki5kcHI7Ki5iYXM7Ki5qYXZhOyouc2M7Ki5lOyouY29iOyouaHRtbDsqLnJjXG4qLmhcbiouYXNtXG4NCi1GSUxURVJBU1NPQ0lBVEVGSUxFVFlQRVM9MCAwIDAgDQotRklMVEVSQVBQQ09NTUFORD1cblxuXG4NCi12Y3Nwcm9qZWN0PVNDQzpQZXJmb3JjZSBTQ006Ly9kZXBvdA0KLXZjc2xvY2FscGF0aD1TQ0M6UGVyZm9yY2UgU0NNOmM6XA0KLWNvbXBpbGU9Y29uY3VyfGNhcHR1cmV8OkNvbXBpbGU6JkNvbXBpbGUsZG1ha2UgJW4ub2JqDQotbWFrZT1jb25jdXJ8Y2FwdHVyZXxjbGVhcnxzYXZlYWxsfDpCdWlsZDomQnVpbGQsZG1ha2UgaW5zdGFsbA0KLXJlYnVpbGQ9Y29uY3VyfGNhcHR1cmV8Y2xlYXJ8c2F2ZWFsbHw6UmVidWlsZDomUmVidWlsZCxkbWFrZSBjbGVhbmV4ZSAmIGRtYWtlIGluc3RhbGwgLXUNCi1kZWJ1Zz1jb25jdXJ8Y2FwdHVyZXxoaWRlfHNhdmVub25lfDpEZWJ1ZzomRGVidWcsDQotZXhlY3V0ZT1oaWRlfHNhdmVub25lfG5vY2hhbmdlZGlyfDpFeGVjdXRlOkUmeGVjdXRlLA0KLXVzZXIxPWhpZGV8OlVzZXIgMTpVc2VyIDEsDQotdXNlcjI9aGlkZXw6VXNlciAyOlVzZXIgMiwNCi11c2VydG9vbF9jbGVhbl9kaXJlY3Rvcnk9Y29uY3VyfGNhcHR1cmV8c2F2ZW5vbmV8OkNsZWFuIERpcmVjdG9yeTomQ2xlYW4gRGlyZWN0b3J5LGRtYWtlIGNsZWFuZXhlDQotd29ya2luZ2Rpcj0uDQotaW5jbHVkZWRpcnM9JShTQ0lURUNIKVxpbmNsdWRlOyUoUFJJVkFURSlcaW5jbHVkZQ0KLXJlZmZpbGU9DQotW0ZJTEVTXQ0KLXdpbjMyXF9wbXdpbjMyLmFzbQ0KLXdpbjMyXGNwdWluZm8uYw0KLXdpbjMyXGRkcmF3LmMNCi13aW4zMlxldmVudC5jDQotd2luMzJcb3NoZHIuaA0KLXdpbjMyXHBtLmMNCi13aW4zMlx2ZmxhdC5jDQotd2luMzJcenRpbWVyLmMNCi1bQVNTT0NJQVRJT05dDQotW0NPTkZJR1VSQVRJT05TXQ0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC9fbXRycnFueC5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvX210cnJxbnguYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTNmZTEwLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC9fbXRycnFueC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqCi07KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLTsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci07KgotOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLTsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi07KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLTsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07KgotOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyoKLTsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiBMYW5ndWFnZTogICAgTkFTTQotOyogRW52aXJvbm1lbnQ6IFFOWAotOyoKLTsqIERlc2NyaXB0aW9uOiBBc3NlbWJsZXIgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIE1lbW9yeSBUeXBlIFJhbmdlIFJlZ2lzdGVyCi07KiAgICAgICAgICAgICAgKE1UUlIpIG1vZHVsZSBmb3IgUU5YLgotOyoKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgSURFQUwKLQotaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKLQotaGVhZGVyICAgICAgX210cnJxbnggICAgICAgICAgICAgICAgOyBTZXQgdXAgbWVtb3J5IG1vZGVsCi0KLWJlZ2RhdGFzZWcgIF9tdHJycW54ICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLWlmZGVmICAgVVNFX05BU00KLSVkZWZpbmUgUjBfRkxVU0hfVExCICAgIDAKLSVkZWZpbmUgUjBfU0FWRV9DUjQgICAgIDEKLSVkZWZpbmUgUjBfUkVTVE9SRV9DUjQgIDIKLSVkZWZpbmUgUjBfUkVBRF9NU1IgICAgIDMKLSVkZWZpbmUgUjBfV1JJVEVfTVNSICAgIDQKLWVsc2UKLVIwX0ZMVVNIX1RMQiAgICAgICAgRVFVIDAKLVIwX1NBVkVfQ1I0ICAgICAgICAgRVFVIDEKLVIwX1JFU1RPUkVfQ1I0ICAgICAgRVFVIDIKLVIwX1JFQURfTVNSICAgICAgICAgRVFVIDMKLVIwX1dSSVRFX01TUiAgICAgICAgRVFVIDQKLWVuZGlmCi0KLWNwdWJsaWMgX1BNX1IwCi1fUE1fUjBfc2VydmljZSAgICAgIGRkICAwCi1fUE1fUjBfcmVnICAgICAgICAgIGRkICAwCi1fUE1fUjBfZWF4ICAgICAgICAgIGRkICAwCi1fUE1fUjBfZWR4ICAgICAgICAgIGRkICAwCi0KLWVuZGRhdGFzZWcgIF9tdHJycW54ICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLWJlZ2NvZGVzZWcgIF9tdHJycW54ICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLVA1ODYKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWxvbmcgX01UUlJfZGlzYWJsZUludCh2b2lkKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJldHVybiBwcm9jZXNzb3IgaW50ZXJydXB0IHN0YXR1cyBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9NVFJSX2Rpc2FibGVJbnQKLQotICAgICAgICBwdXNoZmQgICAgICAgICAgICAgICAgICA7IFB1dCBmbGFnIHdvcmQgb24gc3RhY2sKLTsgICAgICAgY2xpICAgICAgICAgICAgICAgICAgICAgOyBEaXNhYmxlIGludGVycnVwdHMhCi0gICAgICAgIHBvcCAgICAgZWF4ICAgICAgICAgICAgIDsgZGVwb3NpdCBmbGFnIHdvcmQgaW4gcmV0dXJuIHJlZ2lzdGVyCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9NVFJSX3Jlc3RvcmVJbnQodWxvbmcgcHMpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVzdG9yZSBwcm9jZXNzb3IgaW50ZXJydXB0IHN0YXR1cy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfTVRSUl9yZXN0b3JlSW50Ci0KLSAgICAgICAgQVJHICAgICBwczpVTE9ORwotCi0gICAgICAgIHB1c2ggICAgZWJwCi0gICAgICAgIG1vdiAgICAgZWJwLGVzcCAgICAgICAgIDsgU2V0IHVwIHN0YWNrIGZyYW1lCi0gICAgICAgIHB1c2ggICAgW1VMT05HIHBzXQotICAgICAgICBwb3BmZCAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgcHJvY2Vzc29yIHN0YXR1cyAoYW5kIGludGVycnVwdHMpCi0gICAgICAgIHBvcCAgICAgZWJwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1Y2hhciBfTVRSUl9nZXRDeDg2KHVjaGFyIHJlZyk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZWFkIGEgQ3lyaXggQ1BVIGluZGV4ZWQgcmVnaXN0ZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfTVRSUl9nZXRDeDg2Ci0KLSAgICAgICAgQVJHICAgICByZWc6VUNIQVIKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIG1vdiAgICAgYWwsW3JlZ10KLSAgICAgICAgb3V0ICAgICAyMmgsYWwKLSAgICAgICAgaW4gICAgICBhbCwyM2gKLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWNoYXIgX01UUlJfc2V0Q3g4Nih1Y2hhciByZWcsdWNoYXIgdmFsKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFdyaXRlIGEgQ3lyaXggQ1BVIGluZGV4ZWQgcmVnaXN0ZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfTVRSUl9zZXRDeDg2Ci0KLSAgICAgICAgQVJHICAgICByZWc6VUNIQVIsIHZhbDpVQ0hBUgotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgbW92ICAgICBhbCxbcmVnXQotICAgICAgICBvdXQgICAgIDIyaCxhbAotICAgICAgICBtb3YgICAgIGFsLFt2YWxdCi0gICAgICAgIG91dCAgICAgMjNoLGFsCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHVsb25nIF9QTV9yaW5nMF9pc3Iodm9pZCk7Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSaW5nIDAgY2xvY2sgaW50ZXJydXB0IGhhbmRsZXIgdGhhdCB3ZSB1c2UgdG8gZXhlY3V0ZSB0aGUgTVRSUiBzdXBwb3J0Ci07IGNvZGUuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NuZWFyICAgX1BNX3JpbmcwX2lzcgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBQTV9mbHVzaFRMQih2b2lkKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBwdXNoYWQKLSAgICAgICAgY21wICAgICBbRFdPUkQgX1BNX1IwX3NlcnZpY2VdLFIwX0ZMVVNIX1RMQgotICAgICAgICBqbmUgICAgIEBAMQotICAgICAgICB3YmludmQgICAgICAgICAgICAgICAgICA7IEZsdXNoIHRoZSBDUFUgY2FjaGUKLSAgICAgICAgbW92ICAgICBlYXgsY3IzICAgICAgICAgCi0gICAgICAgIG1vdiAgICAgY3IzLGVheCAgICAgICAgIDsgRmx1c2ggdGhlIFRMQgotICAgICAgICBqbXAgICAgIEBARXhpdAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWxvbmcgX01UUlJfc2F2ZUNSNCh2b2lkKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQEAxOiAgICBjbXAgICAgIFtEV09SRCBfUE1fUjBfc2VydmljZV0sUjBfU0FWRV9DUjQKLSAgICAgICAgam5lICAgICBAQDIKLQotOyBTYXZlIHZhbHVlIG9mIENSNCBhbmQgY2xlYXIgUGFnZSBHbG9iYWwgRW5hYmxlIChiaXQgNykKLQotICAgICAgICBtb3YgICAgIGVieCxjcjQKLSAgICAgICAgbW92ICAgICBlYXgsZWJ4Ci0gICAgICAgIGFuZCAgICAgYWwsN0ZoCi0gICAgICAgIG1vdiAgICAgY3I0LGVheAotCi07IERpc2FibGUgYW5kIGZsdXNoIGNhY2hlcwotCi0gICAgICAgIG1vdiAgICAgZWF4LGNyMAotICAgICAgICBvciAgICAgIGVheCw0MDAwMDAwMGgKLSAgICAgICAgd2JpbnZkCi0gICAgICAgIG1vdiAgICAgY3IwLGVheAotICAgICAgICB3YmludmQKLQotOyBSZXR1cm4gdmFsdWUgZnJvbSBDUjQKLQotICAgICAgICBtb3YgICAgIFtfUE1fUjBfcmVnXSxlYngKLSAgICAgICAgam1wICAgICBAQEV4aXQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgX01UUlJfcmVzdG9yZUNSNCh1bG9uZyBjcjRWYWwpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUBAMjogICAgY21wICAgICBbRFdPUkQgX1BNX1IwX3NlcnZpY2VdLFIwX1JFU1RPUkVfQ1I0Ci0gICAgICAgIGpuZSAgICAgQEAzCi0KLSAgICAgICAgbW92ICAgICBlYXgsY3IwCi0gICAgICAgIGFuZCAgICAgZWF4LDBCRkZGRkZGRmgKLSAgICAgICAgbW92ICAgICBjcjAsZWF4Ci0gICAgICAgIG1vdiAgICAgZWF4LFtfUE1fUjBfcmVnXQotICAgICAgICBtb3YgICAgIGNyNCxlYXgKLSAgICAgICAgam1wICAgICBAQEV4aXQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgX01UUlJfcmVhZE1TUihpbnQgcmVnLCB1bG9uZyBGQVIgKmVheCwgdWxvbmcgRkFSICplZHgpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AQDM6ICAgIGNtcCAgICAgW0RXT1JEIF9QTV9SMF9zZXJ2aWNlXSxSMF9SRUFEX01TUgotICAgICAgICBqbmUgICAgIEBANAotCi0gICAgICAgIG1vdiAgICAgZWN4LFtfUE1fUjBfcmVnXQotICAgICAgICByZG1zcgotICAgICAgICBtb3YgICAgIFtfUE1fUjBfZWF4XSxlYXgKLSAgICAgICAgbW92ICAgICBbX1BNX1IwX2VkeF0sZWR4Ci0gICAgICAgIGptcCAgICAgQEBFeGl0Ci0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9NVFJSX3dyaXRlTVNSKGludCByZWcsIHVsb25nIGVheCwgdWxvbmcgZWR4KTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQEA0OiAgICBjbXAgICAgIFtEV09SRCBfUE1fUjBfc2VydmljZV0sUjBfV1JJVEVfTVNSCi0gICAgICAgIGpuZSAgICAgQEBFeGl0Ci0KLSAgICAgICAgbW92ICAgICBlY3gsW19QTV9SMF9yZWddCi0gICAgICAgIG1vdiAgICAgZWF4LFtfUE1fUjBfZWF4XQotICAgICAgICBtb3YgICAgIGVkeCxbX1BNX1IwX2VkeF0KLSAgICAgICAgd3Jtc3IKLSAgICAgICAgam1wICAgICBAQEV4aXQKLQotQEBFeGl0OiBtb3YgICAgIFtEV09SRCBfUE1fUjBfc2VydmljZV0sLTEKLSAgICAgICAgcG9wYWQKLSAgICAgICAgbW92ICAgICBlYXgsMAotICAgICAgICByZXRmCi0KLWNwcm9jZW5kCi0KLWVuZGNvZGVzZWcgIF9tdHJycW54Ci0KLSAgICAgICAgRU5EICAgICAgICAgICAgICAgICAgICAgOyBFbmQgb2YgbW9kdWxlCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvY3B1aW5mby5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcW54L2NwdWluZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg3ODI1NC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvY3B1aW5mby5jCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgUU5YCi0qCi0qIERlc2NyaXB0aW9uOiAgUU5YIHNwZWNpZmljIGNvZGUgZm9yIHRoZSBDUFUgZGV0ZWN0aW9uIG1vZHVsZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVE9ETzogV2Ugc2hvdWxkIGltcGxlbWVudCB0aGlzIGZvciBRTlghCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBTZXRNYXhUaHJlYWRQcmlvcml0eSgpICAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVE9ETzogV2Ugc2hvdWxkIGltcGxlbWVudCB0aGlzIGZvciBRTlghCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBSZXN0b3JlVGhyZWFkUHJpb3JpdHkoaSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGZyZXF1ZW5jeSBvZiB0aGUgY291bnRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBHZXRDb3VudGVyRnJlcXVlbmN5KAotICAgIENQVV9sYXJnZUludGVnZXIgKmZyZXEpCi17Ci0gICAgZnJlcS0+bG93ID0gQ0xPQ0tTX1BFUl9TRUMgKiAxMDAwOwotICAgIGZyZXEtPmhpZ2ggPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgY291bnRlciB2YWx1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEdldENvdW50ZXIodCkgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICh0KS0+bG93ID0gY2xvY2soKSAqIDEwMDA7ICBcCi0gICAgKHQpLT5oaWdoID0gMDsgICAgICAgICAgICAgIFwKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC9ldmVudC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcW54L2V2ZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1Y2Q1MTQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcW54L2V2ZW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIFFOWAotKgotKiBEZXNjcmlwdGlvbjogIFFOWCBmdWxsc2NyZWVuIGNvbnNvbGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBTY2lUZWNoCi0qICAgICAgICAgICAgICAgY3Jvc3MgcGxhdGZvcm0gZXZlbnQgbGlicmFyeS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIF9fUU5YTlRPX18KLXN0YXRpYyBzdHJ1Y3QgX21vdXNlX2N0cmwgICAqX1BNX21vdXNlX2N0bDsKLXN0YXRpYyBpbnQgICAgICAgICAgX1BNX2tleWJvYXJkX2ZkID0gLTE7Ci0vKnN0YXRpYyBpbnQgICAgICAgICAgICBfUE1fbW9kaWZpZXJzLCBfUE1fbGVkczsgKi8KLSNlbHNlCi1zdGF0aWMgaW50ICAgICAgICAgIGtiZF9mZCA9IC0xLCBtb3VzZV9mZCA9IC0xOwotI2VuZGlmCi1zdGF0aWMgaW50ICAgICAgICAgIGtpbGxfcGlkID0gMDsKLXN0YXRpYyB1c2hvcnQgICAgICAga2V5VXBNc2dbMjU2XSA9IHswfTsvKiBUYWJsZSBvZiBrZXkgdXAgbWVzc2FnZXMgICAgICovCi1zdGF0aWMgaW50ICAgICAgICAgIHJhbmdlWCxyYW5nZVk7ICAgICAgLyogUmFuZ2Ugb2YgbW91c2UgY29vcmRpbmF0ZXMgICAqLwotCi0jZGVmaW5lIFRJTUVfVE9fTVNFQyhfX3QpICAgKChfX3QpLnR2X25zZWMgLyAxMDAwMDAwICsgKF9fdCkudHZfc2VjICogMTAwMCkKLQotI2RlZmluZSBMRURfTlVNICAgICAgICAgMQotI2RlZmluZSBMRURfQ0FQICAgICAgICAgMgotI2RlZmluZSBMRURfU0NSICAgICAgICAgNAotCi0vKiBTY2FuY29kZSBtYXBwaW5ncyBvbiBRTlggZm9yIHNwZWNpYWwga2V5cyAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50IHNjYW47Ci0gICAgaW50IG1hcDsKLSAgICB9IGtleW1hcDsKLQotLyogVE9ETzogRml4IHRoaXMgYW5kIHNldCBpdCB1cCBzbyB3ZSBjYW4gZG8gYSBiaW5hcnkgc2VhcmNoISAqLwotCi1rZXltYXAga2V5bWFwc1tdID0gewotICAgIHs5NiwgS0JfcGFkRW50ZXJ9LAotICAgIHs3NCwgS0JfcGFkTWludXN9LAotICAgIHs3OCwgS0JfcGFkUGx1c30sCi0gICAgezU1LCBLQl9wYWRUaW1lc30sCi0gICAgezk4LCBLQl9wYWREaXZpZGV9LAotICAgIHs3MSwgS0JfcGFkSG9tZX0sCi0gICAgezcyLCBLQl9wYWRVcH0sCi0gICAgezczLCBLQl9wYWRQYWdlVXB9LAotICAgIHs3NSwgS0JfcGFkTGVmdH0sCi0gICAgezc2LCBLQl9wYWRDZW50ZXJ9LAotICAgIHs3NywgS0JfcGFkUmlnaHR9LAotICAgIHs3OSwgS0JfcGFkRW5kfSwKLSAgICB7ODAsIEtCX3BhZERvd259LAotICAgIHs4MSwgS0JfcGFkUGFnZURvd259LAotICAgIHs4MiwgS0JfcGFkSW5zZXJ0fSwKLSAgICB7ODMsIEtCX3BhZERlbGV0ZX0sCi0gICAgezEwNSxLQl9sZWZ0fSwKLSAgICB7MTA4LEtCX2Rvd259LAotICAgIHsxMDYsS0JfcmlnaHR9LAotICAgIHsxMDMsS0JfdXB9LAotICAgIHsxMTAsS0JfaW5zZXJ0fSwKLSAgICB7MTAyLEtCX2hvbWV9LAotICAgIHsxMDQsS0JfcGFnZVVwfSwKLSAgICB7MTExLEtCX2RlbGV0ZX0sCi0gICAgezEwNyxLQl9lbmR9LAotICAgIHsxMDksS0JfcGFnZURvd259LAotICAgIHsxMjUsS0JfbGVmdFdpbmRvd3N9LAotICAgIHsxMjYsS0JfcmlnaHRXaW5kb3dzfSwKLSAgICB7MTI3LEtCX21lbnV9LAotICAgIHsxMDAsS0JfcmlnaHRBbHR9LAotICAgIHs5NyxLQl9yaWdodEN0cmx9LAotICAgIH07Ci0KLS8qIEFuZCB0aGUga2V5cGFkIHdpdGggbnVtIGxvY2sgdHVybmVkIG9uIChjaGFuZ2VzIHRoZSBBU0NJSSBjb2RlIG9ubHkpICovCi0KLWtleW1hcCBrZXlwYWRbXSA9IHsKLSAgICB7NzEsIEFTQ0lJXzd9LAotICAgIHs3MiwgQVNDSUlfOH0sCi0gICAgezczLCBBU0NJSV85fSwKLSAgICB7NzUsIEFTQ0lJXzR9LAotICAgIHs3NiwgQVNDSUlfNX0sCi0gICAgezc3LCBBU0NJSV82fSwKLSAgICB7NzksIEFTQ0lJXzF9LAotICAgIHs4MCwgQVNDSUlfMn0sCi0gICAgezgxLCBBU0NJSV8zfSwKLSAgICB7ODIsIEFTQ0lJXzB9LAotICAgIHs4MywgQVNDSUlfcGVyaW9kfSwKLSAgICB9OwotCi0jZGVmaW5lIE5CX0tFWU1BUFMgKHNpemVvZihrZXltYXBzKS9zaXplb2Yoa2V5bWFwc1swXSkpCi0jZGVmaW5lIE5CX0tFWVBBRCAoc2l6ZW9mKGtleXBhZCkvc2l6ZW9mKGtleXBhZFswXSkpCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5jbHVkZSBnZW5lcmljIHJhdyBzY2FuY29kZSBrZXlib2FyZCBtb2R1bGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgImNvbW1vbi9rZXlib2FyZC5jIgotCi0vKiBUaGVzZSBhcmUgbm90IHVzZWQgdW5kZXIgUU5YICovCi0jZGVmaW5lIF9FVlRfZGlzYWJsZUludCgpICAgICAgIDEKLSNkZWZpbmUgX0VWVF9yZXN0b3JlSW50KGZsYWdzKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXR1cm4gdGhlIG51bWJlciBvZiB0aWNrcyBzaW5jZSBzeXN0ZW0KLXN0YXJ0dXAgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIHNob3VsZCBiZSB0aGUgc2FtZSB2YWx1ZSB0aGF0IGlzIHBsYWNlZCBpbnRvCi10aGUgdGltZSBzdGFtcCBmaWVsZHMgb2YgZXZlbnRzLCBhbmQgaXMgdXNlZCB0byBpbXBsZW1lbnQgYXV0byBtb3VzZSBkb3duCi1ldmVudHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgX0VWVF9nZXRUaWNrcyh2b2lkKQotewotICAgIHN0cnVjdCB0aW1lc3BlYyB0OwotICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsJnQpOwotICAgIHJldHVybiAodC50dl9uc2VjIC8gMTAwMDAwMCArIHQudHZfc2VjICogMTAwMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29udmVydHMgYSBtaWNrZXkgbW92ZW1lbnQgdmFsdWUgdG8gYSBwaXhlbCBhZGp1c3RtZW50IHZhbHVlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgTWlja2V5VG9QaXhlbCgKLSAgICBpbnQgbWlja2V5KQotewotICAgIC8qIFRPRE86IFdlIGNhbiBhZGQgc29tZSBjb2RlIGluIGhlcmUgdG8gaGFuZGxlICdhY2NlbGVyYXRpb24nIGZvciAqLwotICAgIC8qICAgICAgIHRoZSBtb3VzZSBjdXJzb3IuIEZvciBub3cganVzdCB1c2UgdGhlIG1pY2tleXMuICovCi0gICAgcmV0dXJuIG1pY2tleTsKLX0KLQotI2lmZGVmIF9fUU5YTlRPX18KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0cmlldmVzIGFsbCBldmVudHMgZnJvbSB0aGUgbW91c2Uva2V5Ym9hcmQgZXZlbnQgcXVldWUgYW5kIHN0dWZmcyB0aGVtCi1pbnRvIHRoZSBNR0wgZXZlbnQgcXVldWUgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfRVZUX3B1bXBNZXNzYWdlcyh2b2lkKQotewotICAgIGludCAgICAgICAgIHJjMSwgcmMyOwotICAgIHN0cnVjdCBfa2V5Ym9hcmRfcGFja2V0IGtleTsKLSAgICBzdHJ1Y3QgX21vdXNlX3BhY2tldCAgICBtczsKLSAgICBzdGF0aWMgbG9uZyAgICAgb2xkX2J1dHRvbnMgPSAwOwotICAgIHVpbnQgICAgICAgICAgICBtZXNzYWdlID0gMCwgYnV0X3N0YXQgPSAwLCBtb2RzID0gMDsKLSAgICBldmVudF90ICAgICAgICAgZXZ0OwotCi0gICAgd2hpbGUgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpIHsKLQlyYzEgPSByZWFkKGtiZF9mZCwgKHZvaWQgKikma2V5LCBzaXplb2Yoa2V5KSk7Ci0JaWYgKHJjMSA9PSAtMSkgewotCSAgICBpZiAoZXJybm8gPT0gRUFHQUlOKQotCQlyYzEgPSAwOwotCSAgICBlbHNlIHsKLQkJcGVycm9yKCJnZXRFdmVudHMiKTsKLQkJUE1fZmF0YWxFcnJvcigiS2V5Ym9hcmQgZXJyb3IiKTsKLQkJfQotCSAgICB9Ci0JaWYgKHJjMSA+IDApIHsKLQkgICAgbWVtc2V0KCZldnQsIDAsIHNpemVvZihldnQpKTsKLQkgICAgaWYgKGtleS5kYXRhLm1vZGlmaWVycyAmIEtFWU1PRF9TSElGVCkKLQkJbW9kcyB8PSBFVlRfTEVGVFNISUZUOwotCSAgICBpZiAoa2V5LmRhdGEubW9kaWZpZXJzICYgS0VZTU9EX0NUUkwpCi0JCW1vZHMgfD0gRVZUX0NUUkxTVEFURTsKLQkgICAgaWYgKGtleS5kYXRhLm1vZGlmaWVycyAmIEtFWU1PRF9BTFQpCi0JCW1vZHMgfD0gRVZUX0FMVFNUQVRFOwotCi0JICAgIC8qIE5vdyBzdG9yZSB0aGUga2V5Ym9hcmQgZXZlbnQgZGF0YSAqLwotCSAgICBldnQud2hlbiA9IFRJTUVfVE9fTVNFQyhrZXkudGltZSk7Ci0JICAgIGlmIChrZXkuZGF0YS5mbGFncyAmIEtFWV9TQ0FOX1ZBTElEKQotCQlldnQubWVzc2FnZSB8PSAoa2V5LmRhdGEua2V5X3NjYW4gJiAweDdGKSA8PCA4OwotCSAgICBpZiAoKGtleS5kYXRhLmZsYWdzICYgS0VZX1NZTV9WQUxJRCkgJiYKLQkJKCgoa2V5LmRhdGEua2V5X3N5bSAmIDB4ZmYwMCkgPT0gMHhmMDAwICYmCi0JCShrZXkuZGF0YS5rZXlfc3ltICYgMHhmZikgPCAweDIwKSB8fAotCQlrZXkuZGF0YS5rZXlfc3ltIDwgMHg4MCkpCi0JCWV2dC5tZXNzYWdlIHw9IChrZXkuZGF0YS5rZXlfc3ltICYgMHhGRik7Ci0JICAgIGV2dC5tb2RpZmllcnMgPSBtb2RzOwotCSAgICBpZiAoa2V5LmRhdGEuZmxhZ3MgJiBLRVlfRE9XTikgewotCQlldnQud2hhdCA9IEVWVF9LRVlET1dOOwotCQlrZXlVcE1zZ1tldnQubWVzc2FnZSA+PiA4XSA9ICh1c2hvcnQpZXZ0Lm1lc3NhZ2U7Ci0JCX0KLQkgICAgZWxzZSBpZiAoa2V5LmRhdGEuZmxhZ3MgJiBLRVlfUkVQRUFUKSB7Ci0JCWV2dC5tZXNzYWdlIHw9IDB4MTAwMDA7Ci0JCWV2dC53aGF0ID0gRVZUX0tFWVJFUEVBVDsKLQkJfQotCSAgICBlbHNlIHsKLQkJZXZ0LndoYXQgPSBFVlRfS0VZVVA7Ci0JCWV2dC5tZXNzYWdlID0ga2V5VXBNc2dbZXZ0Lm1lc3NhZ2UgPj4gOF07Ci0JCWlmIChldnQubWVzc2FnZSA9PSAwKQotCQkgICAgY29udGludWU7Ci0JCWtleVVwTXNnW2V2dC5tZXNzYWdlID4+IDhdID0gMDsKLQkJfQotCi0JICAgIC8qIE5vdyBhZGQgdGhlIG5ldyBldmVudCB0byB0aGUgZXZlbnQgcXVldWUgKi8KLQkgICAgYWRkRXZlbnQoJmV2dCk7Ci0JICAgIH0KLQlyYzIgPSByZWFkKG1vdXNlX2ZkLCAodm9pZCAqKSZtcywgc2l6ZW9mIChtcykpOwotCWlmIChyYzIgPT0gLTEpIHsKLQkgICAgaWYgKGVycm5vID09IEVBR0FJTikKLQkJcmMyID0gMDsKLQkgICAgZWxzZSB7Ci0JCXBlcnJvcigiZ2V0RXZlbnRzIik7Ci0JCVBNX2ZhdGFsRXJyb3IoIk1vdXNlIGVycm9yIik7Ci0JCX0KLQkgICAgfQotCWlmIChyYzIgPiAwKSB7Ci0JICAgIG1lbXNldCgmZXZ0LCAwLCBzaXplb2YoZXZ0KSk7Ci0JICAgIG1zLmhkci5idXR0b25zICY9Ci0JCShfUE9JTlRFUl9CVVRUT05fTEVGVCB8IF9QT0lOVEVSX0JVVFRPTl9SSUdIVCk7Ci0JICAgIGlmIChtcy5oZHIuYnV0dG9ucyAmIF9QT0lOVEVSX0JVVFRPTl9MRUZUKQotCQlidXRfc3RhdCA9IEVWVF9MRUZUQlVUOwotCSAgICBpZiAoKG1zLmhkci5idXR0b25zICYgX1BPSU5URVJfQlVUVE9OX0xFRlQpICE9Ci0JCShvbGRfYnV0dG9ucyAmIF9QT0lOVEVSX0JVVFRPTl9MRUZUKSkKLQkJbWVzc2FnZSA9IEVWVF9MRUZUQk1BU0s7Ci0JICAgIGlmIChtcy5oZHIuYnV0dG9ucyAmIF9QT0lOVEVSX0JVVFRPTl9SSUdIVCkKLQkJYnV0X3N0YXQgfD0gRVZUX1JJR0hUQlVUOwotCSAgICBpZiAoKG1zLmhkci5idXR0b25zICYgX1BPSU5URVJfQlVUVE9OX1JJR0hUKSAhPQotCQkob2xkX2J1dHRvbnMgJiBfUE9JTlRFUl9CVVRUT05fUklHSFQpKQotCQltZXNzYWdlIHw9IEVWVF9SSUdIVEJNQVNLOwotCSAgICBpZiAobXMuZHggfHwgbXMuZHkpIHsKLQkJbXMuZHkgPSAtbXMuZHk7Ci0JCUVWVC5teCArPSBNaWNrZXlUb1BpeGVsKG1zLmR4KTsKLQkJRVZULm15ICs9IE1pY2tleVRvUGl4ZWwobXMuZHkpOwotCQlpZiAoRVZULm14IDwgMCkgRVZULm14ID0gMDsKLQkJaWYgKEVWVC5teSA8IDApIEVWVC5teSA9IDA7Ci0JCWlmIChFVlQubXggPiByYW5nZVgpICAgIEVWVC5teCA9IHJhbmdlWDsKLQkJaWYgKEVWVC5teSA+IHJhbmdlWSkgICAgRVZULm15ID0gcmFuZ2VZOwotCQlldnQud2hhdCA9IEVWVF9NT1VTRU1PVkU7Ci0JCWV2dC53aGVuID0gVElNRV9UT19NU0VDKG1zLmhkci50aW1lKTsKLQkJZXZ0LndoZXJlX3ggPSBFVlQubXg7Ci0JCWV2dC53aGVyZV95ID0gRVZULm15OwotCQlldnQucmVsYXRpdmVfeCA9IG1zLmR4OwotCQlldnQucmVsYXRpdmVfeSA9IG1zLmR5OwotCQlldnQubW9kaWZpZXJzID0gYnV0X3N0YXQ7Ci0JCWFkZEV2ZW50KCZldnQpOwotCQl9Ci0JICAgIGV2dC53aGF0ID0gbXMuaGRyLmJ1dHRvbnMgPCBvbGRfYnV0dG9ucyA/Ci0JCUVWVF9NT1VTRVVQIDogRVZUX01PVVNFRE9XTjsKLQkgICAgZXZ0LndoZW4gPSBUSU1FX1RPX01TRUMobXMuaGRyLnRpbWUpOwotCSAgICBldnQud2hlcmVfeCA9IEVWVC5teDsKLQkgICAgZXZ0LndoZXJlX3kgPSBFVlQubXk7Ci0JICAgIGV2dC5yZWxhdGl2ZV94ID0gbXMuZHg7Ci0JICAgIGV2dC5yZWxhdGl2ZV95ID0gbXMuZHk7Ci0JICAgIGV2dC5tb2RpZmllcnMgPSBidXRfc3RhdDsKLQkgICAgZXZ0Lm1lc3NhZ2UgPSBtZXNzYWdlOwotCSAgICBpZiAobXMuaGRyLmJ1dHRvbnMgIT0gb2xkX2J1dHRvbnMpIHsKLQkJYWRkRXZlbnQoJmV2dCk7Ci0JCW9sZF9idXR0b25zID0gbXMuaGRyLmJ1dHRvbnM7Ci0JCX0KLQkgICAgfQotCWlmIChyYzEgKyByYzIgPT0gMCkKLQkgICAgYnJlYWs7Ci0JfQotfQotI2Vsc2UKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0cmlldmVzIGFsbCBldmVudHMgZnJvbSB0aGUgbW91c2Uva2V5Ym9hcmQgZXZlbnQgcXVldWUgYW5kIHN0dWZmcyB0aGVtCi1pbnRvIHRoZSBNR0wgZXZlbnQgcXVldWUgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfRVZUX3B1bXBNZXNzYWdlcyh2b2lkKQotewotICAgIHN0cnVjdCBtb3VzZV9ldmVudCAgICAgIGV2OwotICAgIGludCAgICAgICAgICAgICByYzsKLSAgICBzdGF0aWMgbG9uZyAgICAgICAgIG9sZF9idXR0b25zID0gMDsKLSAgICB1aW50ICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAwLCBidXRfc3RhdCA9IDA7Ci0gICAgZXZlbnRfdCAgICAgICAgICAgICBldnQ7Ci0gICAgY2hhciAgICAgICAgICAgICAgICBidWZbMzJdOwotICAgIGludCAgICAgICAgICAgICBudW1rZXlzLCBpOwotCi0gICAgLyogUG9sbCBrZXlib2FyZCBldmVudHMgKi8KLSAgICB3aGlsZSAoKG51bWtleXMgPSByZWFkKF9QTV9rZXlib2FyZF9mZCwgYnVmLCBzaXplb2YgYnVmKSkgPiAwKSB7Ci0JZm9yIChpID0gMDsgaSA8IG51bWtleXM7IGkrKykgewotCSAgICBwcm9jZXNzUmF3U2NhbkNvZGUoYnVmW2ldKTsKLQkgICAgfQotCX0KLQotICAgIGlmIChfUE1fbW91c2VfY3RsID09IE5VTEwpCi0JcmV0dXJuOwotCi0gICAgLyogR29iYmxlIHBlbmRpbmcgbW91c2UgZXZlbnRzICovCi0gICAgd2hpbGUgKEVWVC5jb3VudCA8IEVWRU5UUVNJWkUpIHsKLQlyYyA9IG1vdXNlX3JlYWQoX1BNX21vdXNlX2N0bCwgJmV2LCAxLCAwLCBOVUxMKTsKLQlpZiAocmMgPT0gLTEpIHsKLQkgICAgcGVycm9yKCJnZXRFdmVudHMiKTsKLQkgICAgUE1fZmF0YWxFcnJvcigiTW91c2UgZXJyb3IgKElucHV0IHRlcm1pbmF0ZWQ/KSIpOwotCSAgICB9Ci0JaWYgKHJjID09IDApCi0JICAgIGJyZWFrOwotCi0JbWVzc2FnZSA9IDAsIGJ1dF9zdGF0ID0gMDsKLQltZW1zZXQoJmV2dCwgMCwgc2l6ZW9mKGV2dCkpOwotCi0JZXYuYnV0dG9ucyAmPSAoX01PVVNFX0xFRlQgfCBfTU9VU0VfUklHSFQpOwotCWlmIChldi5idXR0b25zICYgX01PVVNFX0xFRlQpCi0JICAgIGJ1dF9zdGF0ID0gRVZUX0xFRlRCVVQ7Ci0JaWYgKChldi5idXR0b25zICYgX01PVVNFX0xFRlQpICE9IChvbGRfYnV0dG9ucyAmIF9NT1VTRV9MRUZUKSkKLQkgICAgbWVzc2FnZSA9IEVWVF9MRUZUQk1BU0s7Ci0JaWYgKGV2LmJ1dHRvbnMgJiBfTU9VU0VfUklHSFQpCi0JICAgIGJ1dF9zdGF0IHw9IEVWVF9SSUdIVEJVVDsKLQlpZiAoKGV2LmJ1dHRvbnMgJiBfTU9VU0VfUklHSFQpICE9IChvbGRfYnV0dG9ucyAmIF9NT1VTRV9SSUdIVCkpCi0JICAgIG1lc3NhZ2UgfD0gRVZUX1JJR0hUQk1BU0s7Ci0JaWYgKGV2LmR4IHx8IGV2LmR5KSB7Ci0JICAgIGV2LmR5ID0gLWV2LmR5OwotCSAgICBFVlQubXggKz0gTWlja2V5VG9QaXhlbChldi5keCk7Ci0JICAgIEVWVC5teSArPSBNaWNrZXlUb1BpeGVsKGV2LmR5KTsKLQkgICAgaWYgKEVWVC5teCA8IDApIEVWVC5teCA9IDA7Ci0JICAgIGlmIChFVlQubXkgPCAwKSBFVlQubXkgPSAwOwotCSAgICBpZiAoRVZULm14ID4gcmFuZ2VYKSAgICBFVlQubXggPSByYW5nZVg7Ci0JICAgIGlmIChFVlQubXkgPiByYW5nZVkpICAgIEVWVC5teSA9IHJhbmdlWTsKLQkgICAgZXZ0LndoYXQgPSBFVlRfTU9VU0VNT1ZFOwotCSAgICBldnQud2hlbiA9IGV2LnRpbWVzdGFtcCoxMDA7Ci0JICAgIGV2dC53aGVyZV94ID0gRVZULm14OwotCSAgICBldnQud2hlcmVfeSA9IEVWVC5teTsKLQkgICAgZXZ0LnJlbGF0aXZlX3ggPSBldi5keDsKLQkgICAgZXZ0LnJlbGF0aXZlX3kgPSBldi5keTsKLQkgICAgZXZ0Lm1vZGlmaWVycyA9IGJ1dF9zdGF0OwotCSAgICBhZGRFdmVudCgmZXZ0KTsKLQkgICAgfQotCWV2dC53aGF0ID0gZXYuYnV0dG9ucyA8IG9sZF9idXR0b25zID8gRVZUX01PVVNFVVAgOiBFVlRfTU9VU0VET1dOOwotCWV2dC53aGVuID0gZXYudGltZXN0YW1wKjEwMDsKLQlldnQud2hlcmVfeCA9IEVWVC5teDsKLQlldnQud2hlcmVfeSA9IEVWVC5teTsKLQlldnQucmVsYXRpdmVfeCA9IGV2LmR4OwotCWV2dC5yZWxhdGl2ZV95ID0gZXYuZHk7Ci0JZXZ0Lm1vZGlmaWVycyA9IGJ1dF9zdGF0OwotCWV2dC5tZXNzYWdlID0gbWVzc2FnZTsKLQlpZiAoZXYuYnV0dG9ucyAhPSBvbGRfYnV0dG9ucykgewotCSAgICBhZGRFdmVudCgmZXZ0KTsKLQkgICAgb2xkX2J1dHRvbnMgPSBldi5idXR0b25zOwotCSAgICB9Ci0JfQotfQotI2VuZGlmICAvKiBfX1FOWE5UT19fICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBtYWNyby9mdW5jdGlvbiBpcyB1c2VkIHRvIGNvbnZlcnRzIHRoZSBzY2FuIGNvZGVzIHJlcG9ydGVkIGJ5IHRoZQota2V5Ym9hcmQgdG8gb3VyIGV2ZW50IGxpYnJhcmllcyBub3JtYWxpc2VkIGZvcm1hdC4gV2Ugb25seSBoYXZlIG9uZSBzY2FuCi1jb2RlIGZvciB0aGUgJ0EnIGtleSwgYW5kIHVzZSBzaGlmdCBtb2RpZmllcnMgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEKLUN0cmwtRjEsIEFsdC1GMSBldGMuIFRoZSByYXcgc2NhbiBjb2RlcyBmcm9tIHRoZSBrZXlib2FyZCB3b3JrIHRoaXMgd2F5LAotYnV0IHRoZSBPUyBnaXZlcyB1cyAnY29va2VkJyBzY2FuIGNvZGVzLCB3ZSBoYXZlIHRvIHRyYW5zbGF0ZSB0aGVtIGJhY2sKLXRvIHRoZSByYXcgZm9ybWF0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX0VWVF9tYXNrS2V5Q29kZShldnQpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2FmZWx5IGFib3J0IHRoZSBldmVudCBtb2R1bGUgdXBvbiBjYXRjaGluZyBhIGZhdGFsIGVycm9yLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0VWVF9hYm9ydCgKLSAgICBpbnQgc2lnbm8pCi17Ci0gICAgY2hhciAgICBidWZbODBdOwotCi0gICAgRVZUX2V4aXQoKTsKLSAgICBzcHJpbnRmKGJ1ZiwiVGVybWluYXRpbmcgb24gc2lnbmFsICVkIixzaWdubyk7Ci0gICAgUE1fZmF0YWxFcnJvcihidWYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW1vdXNlTW92ZSAgIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuZXZlIHRoZSBtb3VzZSBuZWVkcyB0byBiZSBtb3ZlZAotCi1SRU1BUktTOgotSW5pdGlsaWFzZSB0aGUgZXZlbnQgaGFuZGxpbmcgbW9kdWxlLiBIZXJlIHdlIGluc3RhbGwgb3VyIG1vdXNlIGhhbmRsaW5nIElTUgotdG8gYmUgY2FsbGVkIHdoZW5ldmVyIGFueSBidXR0b24ncyBhcmUgcHJlc3NlZCBvciByZWxlYXNlZC4gV2UgYWxzbyBidWlsZAotdGhlIGZyZWUgbGlzdCBvZiBldmVudHMgaW4gdGhlIGV2ZW50IHF1ZXVlLgotCi1XZSB1c2UgaGFuZGxlciBudW1iZXIgMiBvZiB0aGUgbW91c2UgbGlicmFyaWVzIGludGVycnVwdCBoYW5kbGVycyBmb3Igb3VyCi1ldmVudCBoYW5kbGluZyByb3V0aW5lcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfaW5pdCgKLSAgICBfRVZUX21vdXNlTW92ZUhhbmRsZXIgbW91c2VNb3ZlKQotewotICAgIGludCAgICAgICAgIGk7Ci0gICAgc3RydWN0IHN0YXQgc3Q7Ci0gICAgY2hhciAgICAgICAgKmlhcmdbMTZdOwotI2lmZGVmIF9fUU5YTlRPX18KLSAgICBjaGFyICAgICAgICBidWZbMTI4XTsKLSAgICBGSUxFICAgICAgICAqcDsKLSAgICBpbnQgICAgICAgICBhcmdubyxsZW47Ci0jZW5kaWYKLQotI2lmZGVmIF9fUU5YTlRPX18KLSAgICBUaHJlYWRDdGwoX05UT19UQ1RMX0lPLCAwKTsgLyogU28gam95c3RpY2sgY29kZSB3b24ndCBibG93IHVwICovCi0jZW5kaWYKLQotICAgIC8qIEluaXRpYWxpc2UgdGhlIGV2ZW50IHF1ZXVlICovCi0gICAgRVZULm1vdXNlTW92ZSA9IG1vdXNlTW92ZTsKLSAgICBpbml0RXZlbnRRdWV1ZSgpOwotICAgIG1lbXNldChrZXlVcE1zZywwLHNpemVvZihrZXlVcE1zZykpOwotCi0jaWZkZWYgX19RTlhOVE9fXwotICAgIC8qCi0gICAgICogVXNlciBtYXkgYWxyZWFkeSBoYXZlIGlucHV0IHJ1bm5pbmcgd2l0aCB0aGUgcmlnaHQgcGFyYW1ldGVycy4KLSAgICAgKiBUaHVzIHRoZXkgY291bGQgc3RhcnQgaW5wdXQgYXQgYm9vdCB0aW1lLCB1c2luZyB0aGUgb3V0cHV0IG9mCi0gICAgICogaW5wdXR0cmFwLCBwYXNzaW5nIHRoZSB0aGUgLXIgZmxhZyB0byBtYWtlIGl0IHJ1biBhcyBhIHJlc291cmNlCi0gICAgICogbWFuYWdlci4KLSAgICAgKi8KLSAgICBpZiAoKG1vdXNlX2ZkID0gb3BlbigiL2Rldi9tb3VzZTAiLCBPX1JET05MWSB8IE9fTk9OQkxPQ0spKSA8IDApIHsKLQkvKiBSdW4gaW5wdXR0cmFwIHRvIGdldCB0aGUgYXJncyBmb3IgaW5wdXQgKi8KLQlpZiAoKHAgPSBwb3BlbigiaW5wdXR0cmFwIiwgInIiKSkgPT0gTlVMTCkKLQkgICAgUE1fZmF0YWxFcnJvcigiRXJyb3IgcnVubmluZyAnaW5wdXR0cmFwJyIpOwotCWZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHApOwotCXBjbG9zZShwKTsKLQotCS8qIEJ1aWxkIHRoZSBhcmd1bWVudCBsaXN0ICovCi0JbGVuID0gc3RybGVuKGJ1Zik7Ci0JaWFyZ1swXSA9IGJ1ZjsKLQlmb3IgKGkgPSAwLCBhcmdubyA9IDA7IGkgPCBsZW4gJiYgYXJnbm8gPCAxNTspIHsKLQkgICAgaWYgKGFyZ25vID09IDEpIHsKLQkJLyoKLQkJICogQWRkIGZsYWdzIHRvIGlucHV0J3MgYXJnIGxpc3QuCi0JCSAqICctcicgbWVhbnMgcnVuIGFzIHJlc291cmNlCi0JCSAqIG1hbmFnZXIsIHByb3ZpZGluZyB0aGUgL2Rldi9tb3VzZQotCQkgKiBhbmQgL2Rldi9rZXlib2FyZCBpbnRlcmZhY2VzLgotCQkgKiAnLVAnIHN1cHJlc3NlcyB0aGUgL2Rldi9waG90b24KLQkJICogbWVjaGFuaXNtLgotCQkgKi8KLQkJaWFyZ1thcmdubysrXSA9ICItUHIiOwotCQljb250aW51ZTsKLQkJfQotCSAgICB3aGlsZSAoYnVmW2ldID09ICcgJykKLQkJaSsrOwotCSAgICBpZiAoYnVmW2ldID09ICdcMCcgfHwgYnVmW2ldID09ICdcbicpCi0JCWJyZWFrOwotCSAgICBpYXJnW2FyZ25vKytdID0gJmJ1ZltpXTsKLQkgICAgd2hpbGUgKGJ1ZltpXSAhPSAnICcKLQkJJiYgYnVmW2ldICE9ICdcMCcgJiYgYnVmW2ldICE9ICdcbicpCi0JCWkrKzsKLQkgICAgYnVmW2krK10gPSAnXDAnOwotCSAgICB9Ci0JaWFyZ1thcmdub10gPSBOVUxMOwotCi0JaWYgKChraWxsX3BpZCA9IHNwYXdudnAoUF9OT1dBSVRPLCBpYXJnWzBdLCBpYXJnKSkgPT0gLTEpIHsKLQkgICAgcGVycm9yKCJzcGF3bmluZyBpbnB1dCByZXNtZ3IiKTsKLQkgICAgUE1fZmF0YWxFcnJvcigiQ291bGQgbm90IHN0YXJ0IGlucHV0IHJlc21nciIpOwotCSAgICB9Ci0JZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkgICAgaWYgKHN0YXQoIi9kZXYvbW91c2UwIiwgJnN0KSA9PSAwKQotCQlicmVhazsKLQkgICAgc2xlZXAoMSk7Ci0JICAgIH0KLQlpZiAoKG1vdXNlX2ZkID0gb3BlbigiL2Rldi9tb3VzZTAiLCBPX1JET05MWXxPX05PTkJMT0NLKSkgPCAwKSB7Ci0JICAgIHBlcnJvcigiL2Rldi9tb3VzZTAiKTsKLQkgICAgUE1fZmF0YWxFcnJvcigiQ291bGQgbm90IG9wZW4gL2Rldi9tb3VzZTAiKTsKLQkgICAgfQotCX0KLSAgICBpZiAoKGtiZF9mZCA9IG9wZW4oIi9kZXYva2V5Ym9hcmQwIiwgT19SRE9OTFl8T19OT05CTE9DSykpIDwgMCkgewotCXBlcnJvcigiL2Rldi9rZXlib2FyZDAiKTsKLQlQTV9mYXRhbEVycm9yKCJDb3VsZCBub3Qgb3BlbiAvZGV2L2tleWJvYXJkMCIpOwotCX0KLSNlbHNlCi0gICAgLyogQ29ubmVjdCB0byBJbnB1dC9Nb3VzZSBmb3IgZXZlbnQgaGFuZGxpbmcgKi8KLSAgICBpZiAoX1BNX21vdXNlX2N0bCA9PSBOVUxMKSB7Ci0JX1BNX21vdXNlX2N0bCA9IG1vdXNlX29wZW4oMCwgIi9kZXYvbW91c2UiLCAwKTsKLQotCS8qICJNb3VzZSIgaXMgbm90IHJ1bm5pbmc7IGF0dGVtcHQgdG8gc3RhcnQgaXQgKi8KLQlpZiAoX1BNX21vdXNlX2N0bCA9PSBOVUxMKSB7Ci0JICAgIGlhcmdbMF0gPSAibW91c2V0cmFwIjsKLQkgICAgaWFyZ1sxXSA9ICJzdGFydCI7Ci0JICAgIGlhcmdbMl0gPSBOVUxMOwotCSAgICBpZiAoKGtpbGxfcGlkID0gc3Bhd252cChQX05PV0FJVE8sIGlhcmdbMF0sICh2b2lkKilpYXJnKSkgPT0gLTEpCi0JCXBlcnJvcigic3Bhd24gKG1vdXNldHJhcCkiKTsKLQkgICAgZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCSAgICBpZiAoc3RhdCgiL2Rldi9tb3VzZSIsICZzdCkgPT0gMCkKLQkJCWJyZWFrOwotCQkgICAgc2xlZXAoMSk7Ci0JCSAgICB9Ci0JCV9QTV9tb3VzZV9jdGwgPSBtb3VzZV9vcGVuKDAsICIvZGV2L21vdXNlIiwgMCk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICBpZiAoX1BNX2tleWJvYXJkX2ZkID09IC0xKQotCV9QTV9rZXlib2FyZF9mZCA9IG9wZW4oIi9kZXYva2JkIiwgT19SRE9OTFl8T19OT05CTE9DSyk7Ci0jZW5kaWYKLQotICAgIC8qIENhdGNoIHByb2dyYW0gdGVybWluYXRpb24gc2lnbmFscyBzbyB3ZSBjYW4gY2xlYW4gdXAgcHJvcGVybHkgKi8KLSAgICBzaWduYWwoU0lHQUJSVCwgX0VWVF9hYm9ydCk7Ci0gICAgc2lnbmFsKFNJR0ZQRSwgX0VWVF9hYm9ydCk7Ci0gICAgc2lnbmFsKFNJR0lOVCwgX0VWVF9hYm9ydCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1DaGFuZ2VzIHRoZSByYW5nZSBvZiBjb29yZGluYXRlcyByZXR1cm5lZCBieSB0aGUgbW91c2UgZnVuY3Rpb25zIHRvIHRoZQotc3BlY2lmaWVkIHJhbmdlIG9mIHZhbHVlcy4gVGhpcyBpcyB1c2VkIHdoZW4gY2hhbmdpbmcgYmV0d2VlbiBncmFwaGljcwotbW9kZXMgc2V0IHRoZSByYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyBmb3IgdGhlIG5ldyBkaXNwbGF5IG1vZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX3NldE1vdXNlUmFuZ2UoCi0gICAgaW50IHhSZXMsCi0gICAgaW50IHlSZXMpCi17Ci0gICAgcmFuZ2VYID0geFJlczsKLSAgICByYW5nZVkgPSB5UmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotTW9kaWZlcyB0aGUgbW91c2UgY29vcmRpbmF0ZXMgYXMgbmVjZXNzYXJ5IGlmIHNjYWxpbmcgdG8gT1MgY29vcmRpbmF0ZXMsCi1hbmQgc2V0cyB0aGUgT1MgbW91c2UgY3Vyc29yIHBvc2l0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX0VWVF9zZXRNb3VzZVBvcyh4LHkpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhaWxpc2VzIHRoZSBpbnRlcm5hbCBldmVudCBoYW5kbGluZyBtb2R1bGVzLiBUaGUgRVZUX3N1c3BlbmQgZnVuY3Rpb24KLWNhbiBiZSBjYWxsZWQgdG8gc3VzcGVuZCBldmVudCBoYW5kbGluZyAoc3VjaCBhcyB3aGVuIHNoZWxsaW5nIG91dCB0byBET1MpLAotYW5kIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcmVzdW1lIGl0IGFnYWluIGxhdGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX3Jlc3VtZSh2b2lkKQotewotICAgIC8qIERvIG5vdGhpbmcgZm9yIFFOWCAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotU3VzcGVuZHMgYWxsIG9mIG91ciBldmVudCBoYW5kbGluZyBvcGVyYXRpb25zLiBUaGlzIGlzIGFsc28gdXNlZCB0bwotZGUtaW5zdGFsbCB0aGUgZXZlbnQgaGFuZGxpbmcgY29kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVF9zdXNwZW5kKHZvaWQpCi17Ci0gICAgLyogRG8gbm90aGluZyBmb3IgUU5YICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1FeGl0cyB0aGUgZXZlbnQgbW9kdWxlIGZvciBwcm9ncmFtIHRlcm1pbmF0YXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfZXhpdCh2b2lkKQotewotI2lmZGVmIF9fUU5YTlRPX18KLSAgICBjaGFyICAgIGM7Ci0gICAgaW50IGZsYWdzOwotCi0gICAgaWYgKGtiZF9mZCAhPSAtMSkgewotCWNsb3NlKGtiZF9mZCk7Ci0Ja2JkX2ZkID0gLTE7Ci0JfQotICAgIGlmIChtb3VzZV9mZCAhPSAtMSkgewotCWNsb3NlKG1vdXNlX2ZkKTsKLQltb3VzZV9mZCA9IC0xOwotCX0KLSNlbmRpZgotCi0gICAgLyogUmVzdG9yZSBzaWduYWwgaGFuZGxlcnMgKi8KLSAgICBzaWduYWwoU0lHQUJSVCwgU0lHX0RGTCk7Ci0gICAgc2lnbmFsKFNJR0ZQRSwgU0lHX0RGTCk7Ci0gICAgc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCk7Ci0KLSNpZm5kZWYgX19RTlhOVE9fXwotICAgIC8qIEtpbGwgdGhlIElucHV0L01vdXNlIGRyaXZlciBpZiB3ZSBoYXZlIHNwYXduZWQgaXQgKi8KLSAgICBpZiAoX1BNX21vdXNlX2N0bCAhPSBOVUxMKSB7Ci0Jc3RydWN0IF9mZF9lbnRyeSAgICBmZGU7Ci0JdWludCAgICAgICAgICAgIHBpZCA9IDA7Ci0KLQkvKiBGaW5kIG91dCB0aGUgcGlkIG9mIHRoZSBtb3VzZSBkcml2ZXIgKi8KLQlpZiAoa2lsbF9waWQgPiAwKSB7Ci0JICAgIGlmIChxbnhfZmRfcXVlcnkoMCwKLQkJMCwgX1BNX21vdXNlX2N0bC0+ZmQsICZmZGUpICE9IC0xKQotCQlwaWQgPSBmZGUucGlkOwotCSAgICB9Ci0JbW91c2VfY2xvc2UoX1BNX21vdXNlX2N0bCk7Ci0JX1BNX21vdXNlX2N0bCA9IE5VTEw7Ci0KLQlpZiAocGlkID4gMCkgewotCSAgICAvKiBGb3Igc29tZSByZWFzb25zIHRoZSBQSUQncyBhcmUgZGlmZmVyZW50IHVuZGVyIFFOWDQsCi0JICAgICAqIHNvIHdlIHVzZSB0aGUgb2xkIG1lY2hhbmlzbSB0byBraWxsIHRoZSBtb3VzZSBzZXJ2ZXIuCi0JICAgICAqLwotCSAgICBraWxsKHBpZCwgU0lHVEVSTSk7Ci0JICAgIGtpbGxfcGlkID0gMDsKLQkgICAgfQotCX0KLSNlbmRpZgotICAgIGlmIChraWxsX3BpZCA+IDApIHsKLQlraWxsKGtpbGxfcGlkLCBTSUdURVJNKTsKLQlraWxsX3BpZCA9IDA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcW54L210cnJxbnguYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC9tdHJycW54LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NjBjNzUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcW54L210cnJxbnguYworKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBRTlgKLSoKLSogRGVzY3JpcHRpb246ICBNVFJSIGhlbHBlciBmdW5jdGlvbnMgbW9kdWxlLiBUbyBtYWtlIGl0IGVhc2llciB0byBpbXBsZW1lbnQKLSogICAgICAgICAgICAgICB0aGUgTVRSUiBzdXBwb3J0IHVuZGVyIFFOWCwgd2Ugc2ltcGx5IHB1dCBvdXIgcmluZyAwIGhlbHBlcgotKiAgICAgICAgICAgICAgIGZ1bmN0aW9ucyBpbnRvIHN0dWJzIHRoYXQgcnVuIHRoZW0gYXQgcmluZyAwIHVzaW5nIHdoYXRldmVyCi0qICAgICAgICAgICAgICAgbWVjaGFuaXNtIGlzIGF2YWlsYWJsZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaWZkZWYgX19RTlhOVE9fXwotI2luY2x1ZGUgPHN5cy9uZXV0cmluby5oPgotI2luY2x1ZGUgPHN5cy9zeXNwYWdlLmg+Ci0jZWxzZQotI2luY2x1ZGUgPGk4Ni5oPgotI2luY2x1ZGUgPHN5cy9pcnFpbmZvLmg+Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBSMF9GTFVTSF9UTEIgICAgMAotI2RlZmluZSBSMF9TQVZFX0NSNCAgICAgMQotI2RlZmluZSBSMF9SRVNUT1JFX0NSNCAgMgotI2RlZmluZSBSMF9SRUFEX01TUiAgICAgMwotI2RlZmluZSBSMF9XUklURV9NU1IgICAgNAotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50ICAgICBzZXJ2aWNlOwotICAgIGludCAgICAgcmVnOwotICAgIHVsb25nICAgZWF4OwotICAgIHVsb25nICAgZWR4OwotICAgIH0gUjBfZGF0YTsKLQotZXh0ZXJuIHZvbGF0aWxlIFIwX2RhdGEgX1BNX1IwOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgX19RTlhOVE9fXwotY29uc3Qgc3RydWN0IHNpZ2V2ZW50ICogX0FTTUFQSSBfUE1fcmluZzBfaXNyKHZvaWQgKmFyZywgaW50IGlkKTsKLSNlbHNlCi1waWRfdCBmYXIgX0FTTUFQSSBfUE1fcmluZzBfaXNyKCk7Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdHJ1ZSBpZiByaW5nIDAgKG9yIGlmIHdlIGNhbiBjYWxsIHRoZSBoZWxwZXJzIGZ1bmN0aW9ucyBhdCByaW5nIDApCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgX0FTTUFQSSBfTVRSUl9pc1JpbmcwKHZvaWQpCi17Ci0jaWZkZWYgX19RTlhOVE9fXwotICAgIHJldHVybiBmYWxzZTsgICAvKiBOb3QgaW1wbGVtZW50ZWQgeWV0ISAqLwotI2Vsc2UKLSAgICByZXR1cm4gdHJ1ZTsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGV4ZWN1dGUgYSBzZXJ2aWNlIGF0IHJpbmcgMC4gVGhpcyBpcyBkb25lIHVzaW5nIHRoZSBjbG9jawotaW50ZXJydXB0IGhhbmRsZXIgc2luY2UgdGhlIGNvZGUgd2UgYXR0YWNoIHRvIGl0IHdpbGwgYWx3YXlzIHJ1biBhdCByaW5nIDAuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgQ2FsbFJpbmcwKHZvaWQpCi17Ci0jaWZkZWYgX19RTlhOVE9fXwotICAgIHVpbnQgICAgY2xvY2tfaW50bm8gPSBTWVNQQUdFX0VOVFJZKHF0aW1lKS0+aW50cjsKLSNlbHNlCi0gICAgdWludCAgICBjbG9ja19pbnRubyA9IDA7ICAgIC8qIGNsb2NrIGlycSAqLwotI2VuZGlmCi0gICAgaW50ICAgICBpbnRyaWQ7Ci0KLSNpZmRlZiBfX1FOWE5UT19fCi0gICAgbWxvY2soKHZvaWQqKSZfUE1fUjAsIHNpemVvZihfUE1fUjApKTsKLSAgICBUaHJlYWRDdGwoX05UT19UQ1RMX0lPLCAwKTsKLSNlbmRpZgotI2lmZGVmIF9fUU5YTlRPX18KLSAgICBpZiAoKGludHJpZCA9IEludGVycnVwdEF0dGFjaChfTlRPX0lOVFJfQ0xBU1NfRVhURVJOQUwgfCBjbG9ja19pbnRubywKLQlfUE1fcmluZzBfaXNyLCAodm9pZCopJl9QTV9SMCwgc2l6ZW9mKF9QTV9SMCksIF9OVE9fSU5UUl9GTEFHU19FTkQpKSA9PSAtMSkgewotI2Vsc2UKLSAgICBpZiAoKGludHJpZCA9IHFueF9oaW50X2F0dGFjaChjbG9ja19pbnRubywgX1BNX3JpbmcwX2lzciwgRlBfU0VHKCZfUE1fUjApKSkgPT0gLTEpIHsKLSNlbmRpZgotCXBlcnJvcigiQXR0YWNoIik7Ci0JZXhpdCgtMSk7Ci0JfQotICAgIHdoaWxlIChfUE1fUjAuc2VydmljZSAhPSAtMSkKLQk7Ci0jaWZkZWYgX19RTlhOVE9fXwotICAgIEludGVycnVwdERldGFjaElkKGludHJpZCk7Ci0jZWxzZQotICAgIHFueF9oaW50X2RldGFjaChpbnRyaWQpOwotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRmx1c2ggdGhlIHRyYW5zbGF0aW9uIGxvb2thc2lkZSBidWZmZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mbHVzaFRMQih2b2lkKQotewotICAgIF9QTV9SMC5zZXJ2aWNlID0gUjBfRkxVU0hfVExCOwotICAgIENhbGxSaW5nMCgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgYW5kIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIENSNCByZWdpc3RlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9BU01BUEkgX01UUlJfc2F2ZUNSNCh2b2lkKQotewotICAgIF9QTV9SMC5zZXJ2aWNlID0gUjBfU0FWRV9DUjQ7Ci0gICAgQ2FsbFJpbmcwKCk7Ci0gICAgcmV0dXJuIF9QTV9SMC5yZWc7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVzdG9yZSB0aGUgdmFsdWUgb2YgdGhlIENSNCByZWdpc3RlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0FTTUFQSSBfTVRSUl9yZXN0b3JlQ1I0KHVsb25nIGNyNFZhbCkKLXsKLSAgICBfUE1fUjAuc2VydmljZSA9IFIwX1JFU1RPUkVfQ1I0OwotICAgIF9QTV9SMC5yZWcgPSBjcjRWYWw7Ci0gICAgQ2FsbFJpbmcwKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCBhIG1hY2hpbmUgc3RhdHVzIHJlZ2lzdGVyIGZvciB0aGUgQ1BVLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0FTTUFQSSBfTVRSUl9yZWFkTVNSKAotICAgIGludCByZWcsCi0gICAgdWxvbmcgKmVheCwKLSAgICB1bG9uZyAqZWR4KQotewotICAgIF9QTV9SMC5zZXJ2aWNlID0gUjBfUkVBRF9NU1I7Ci0gICAgX1BNX1IwLnJlZyA9IHJlZzsKLSAgICBDYWxsUmluZzAoKTsKLSAgICAqZWF4ID0gX1BNX1IwLmVheDsKLSAgICAqZWR4ID0gX1BNX1IwLmVkeDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Xcml0ZSBhIG1hY2hpbmUgc3RhdHVzIHJlZ2lzdGVyIGZvciB0aGUgQ1BVLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0FTTUFQSSBfTVRSUl93cml0ZU1TUigKLSAgICBpbnQgcmVnLAotICAgIHVsb25nIGVheCwKLSAgICB1bG9uZyBlZHgpCi17Ci0gICAgX1BNX1IwLnNlcnZpY2UgPSBSMF9XUklURV9NU1I7Ci0gICAgX1BNX1IwLnJlZyA9IHJlZzsKLSAgICBfUE1fUjAuZWF4ID0gZWF4OwotICAgIF9QTV9SMC5lZHggPSBlZHg7Ci0gICAgQ2FsbFJpbmcwKCk7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvb3NoZHIuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC9vc2hkci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTYxMTkzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC9vc2hkci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBRTlgKLSoKLSogRGVzY3JpcHRpb246ICBJbmNsdWRlIGZpbGUgdG8gaW5jbHVkZSBhbGwgT1Mgc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxwcm9jZXNzLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2lmbmRlZiBfX1FOWE5UT19fCi0jaW5jbHVkZSA8c3lzL21vdXNlLmg+Ci0jaW5jbHVkZSA8c3lzL2tleWJvYXJkLmg+Ci0jaW5jbHVkZSA8c3lzL2ZkLmg+Ci0jaW5jbHVkZSA8Y29uaW8uaD4KLSNlbHNlCi0jaW5jbHVkZSA8c3lzL2RjbWRfaW5wdXQuaD4KLQotLyogVGhpbmdzICdib3Jyb3dlZCcgZnJvbSBwaG90b24va2V5Y29kZXMuaCAqLwotCi0vKgotICogS2V5Ym9hcmQgbW9kaWZpZXJzCi0gKi8KLSNkZWZpbmUgS0VZTU9EQklUX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEtFWU1PREJJVF9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBLRVlNT0RCSVRfQUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgS0VZTU9EQklUX0FMVEdSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIEtFWU1PREJJVF9TSEwzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBLRVlNT0RCSVRfTU9ENiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgS0VZTU9EQklUX01PRDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lIEtFWU1PREJJVF9NT0Q4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNwotCi0jZGVmaW5lIEtFWU1PREJJVF9TSElGVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOAotI2RlZmluZSBLRVlNT0RCSVRfQ1RSTF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkKLSNkZWZpbmUgS0VZTU9EQklUX0FMVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMAotI2RlZmluZSBLRVlNT0RCSVRfQUxUR1JfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExCi0jZGVmaW5lIEtFWU1PREJJVF9TSEwzX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIKLSNkZWZpbmUgS0VZTU9EQklUX01PRDZfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMwotI2RlZmluZSBLRVlNT0RCSVRfTU9EN19MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0Ci0jZGVmaW5lIEtFWU1PREJJVF9NT0Q4X0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUKLQotI2RlZmluZSBLRVlNT0RCSVRfQ0FQU19MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIEtFWU1PREJJVF9OVU1fTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcKLSNkZWZpbmUgS0VZTU9EQklUX1NDUk9MTF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOAotCi0jZGVmaW5lIEtFWU1PRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgS0VZTU9EQklUX1NISUZUKQotI2RlZmluZSBLRVlNT0RfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEtFWU1PREJJVF9DVFJMKQotI2RlZmluZSBLRVlNT0RfQUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEtFWU1PREJJVF9BTFQpCi0jZGVmaW5lIEtFWU1PRF9BTFRHUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgS0VZTU9EQklUX0FMVEdSKQotI2RlZmluZSBLRVlNT0RfU0hMMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEtFWU1PREJJVF9TSEwzKQotI2RlZmluZSBLRVlNT0RfTU9ENiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEtFWU1PREJJVF9NT0Q2KQotI2RlZmluZSBLRVlNT0RfTU9ENyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEtFWU1PREJJVF9NT0Q3KQotI2RlZmluZSBLRVlNT0RfTU9EOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEtFWU1PREJJVF9NT0Q4KQotCi0jZGVmaW5lIEtFWU1PRF9TSElGVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgS0VZTU9EQklUX1NISUZUX0xPQ0spCi0jZGVmaW5lIEtFWU1PRF9DVFJMX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgS0VZTU9EQklUX0NUUkxfTE9DSykKLSNkZWZpbmUgS0VZTU9EX0FMVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBLRVlNT0RCSVRfQUxUX0xPQ0spCi0jZGVmaW5lIEtFWU1PRF9BTFRHUl9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgS0VZTU9EQklUX0FMVEdSX0xPQ0spCi0jZGVmaW5lIEtFWU1PRF9TSEwzX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgS0VZTU9EQklUX1NITDNfTE9DSykKLSNkZWZpbmUgS0VZTU9EX01PRDZfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBLRVlNT0RCSVRfTU9ENl9MT0NLKQotI2RlZmluZSBLRVlNT0RfTU9EN19MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEtFWU1PREJJVF9NT0Q3X0xPQ0spCi0jZGVmaW5lIEtFWU1PRF9NT0Q4X0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgS0VZTU9EQklUX01PRDhfTE9DSykKLQotI2RlZmluZSBLRVlNT0RfQ0FQU19MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEtFWU1PREJJVF9DQVBTX0xPQ0spCi0jZGVmaW5lIEtFWU1PRF9OVU1fTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgS0VZTU9EQklUX05VTV9MT0NLKQotI2RlZmluZSBLRVlNT0RfU0NST0xMX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IEtFWU1PREJJVF9TQ1JPTExfTE9DSykKLQotLyoKLSAqIEtleWJvYXJkIGZsYWdzCi0gKi8KLSNkZWZpbmUgS0VZX0RPV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAgICAgLyogS2V5IHdhcyBwcmVzc2VkIGRvd24gKi8KLSNkZWZpbmUgS0VZX1JFUEVBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyICAgICAgLyogS2V5IHdhcyByZXBlYXRlZCAqLwotI2RlZmluZSBLRVlfU0NBTl9WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAgICAgICAvKiBTY2FuY29kZSBpcyB2YWxpZCAqLwotI2RlZmluZSBLRVlfU1lNX1ZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAgICAgICAvKiBLZXkgc3ltYm9sIGlzIHZhbGlkICovCi0jZGVmaW5lIEtFWV9DQVBfVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MCAgICAgIC8qIEtleSBjYXAgaXMgdmFsaWQgKi8KLSNkZWZpbmUgS0VZX0RFQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwICAgICAgLyogS2V5IHN5bWJvbCBpcyBhIERFQUQga2V5ICovCi0jZGVmaW5lIEtFWV9PRU1fQ0FQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMCAgICAgIC8qIEtleSBjYXAgaXMgYW4gT0VNIHNjYW4gY29kZSBmcm9tIGtleWJvYXJkICovCi0KLSNlbmRpZiAgLyogX19RTlhOVE9fXyAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcW54L3BtLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvcG0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk5M2VlMC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvcG0uYworKysgL2Rldi9udWxsCkBAIC0xLDg5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBRTlgKLSoKLSogRGVzY3JpcHRpb246ICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeSwgd2hpY2gKLSogICAgICAgICAgICAgICBjb250YWlucyBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IE9TIHNwZWNpZmljIHNlcnZpY2VzIGluIGEKLSogICAgICAgICAgICAgICBnZW5lcmljLCBjcm9zcyBwbGF0Zm9ybSBBUEkuIFBvcnRpbmcgdGhlIE9TIFBvcnRhYmlsaXR5Ci0qICAgICAgICAgICAgICAgTWFuYWdlciBsaWJyYXJ5IGlzIHRoZSBmaXJzdCBzdGVwIHRvIHBvcnRpbmcgYW55IFNjaVRlY2gKLSogICAgICAgICAgICAgICBwcm9kdWN0cyB0byBhIG5ldyBwbGF0Zm9ybS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgImRydmxpYi9vcy9vcy5oIgotI2luY2x1ZGUgIm10cnIuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDx0ZXJtaW9zLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxtYWxsb2MuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgInFueC92Ymlvcy5oIgotI2lmbmRlZiBfX1FOWE5UT19fCi0jaW5jbHVkZSA8c3lzL3NlZ2luZm8uaD4KLSNpbmNsdWRlIDxzeXMvY29uc29sZS5oPgotI2luY2x1ZGUgPGNvbmlvLmg+Ci0jaW5jbHVkZSA8aTg2Lmg+Ci0jZWxzZQotI2luY2x1ZGUgPHN5cy9uZXV0cmluby5oPgotI2luY2x1ZGUgPHN5cy9kY21kX2Noci5oPgotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1aW50IFZFU0FCdWZfbGVuID0gMTAyNDsgICAgIC8qIExlbmd0aCBvZiB0aGUgVkVTQUJ1ZiBidWZmZXIgICAgICovCi1zdGF0aWMgdm9pZCAqVkVTQUJ1Zl9wdHIgPSBOVUxMOyAgICAvKiBOZWFyIHBvaW50ZXIgdG8gVkVTQUJ1ZiAgICAgICAgICAqLwotc3RhdGljIHVpbnQgVkVTQUJ1Zl9yc2VnOyAgICAgICAgICAgLyogUmVhbCBtb2RlIHNlZ21lbnQgb2YgVkVTQUJ1ZiAgICAgKi8KLXN0YXRpYyB1aW50IFZFU0FCdWZfcm9mZjsgICAgICAgICAgIC8qIFJlYWwgbW9kZSBvZmZzZXQgb2YgVkVTQUJ1ZiAgICAgICovCi1zdGF0aWMgVkJJT1NyZWdzX3QgICpWUmVncyA9IE5VTEw7ICAvKiBQb2ludGVyIHRvIFZCSU9TIHJlZ2lzdGVycyAgICAgICAqLwotc3RhdGljIGludCByYXdfY291bnQgPSAwOwotc3RhdGljIHN0cnVjdCBfY29uc29sZV9jdHJsICpjYyA9IE5VTEw7Ci1zdGF0aWMgaW50IGNvbnNvbGVfY291bnQgPSAwOwotc3RhdGljIGludCBybWJ1Zl9pbnVzZSA9IDA7Ci0KLXN0YXRpYyB2b2lkIChQTUFQSVAgZmF0YWxFcnJvckNsZWFudXApKHZvaWQpID0gTlVMTDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBQTUFQSSBQTV9pbml0KHZvaWQpCi17Ci0gICAgY2hhciAqZm9yY2U7Ci0KLSAgICBpZiAoVlJlZ3MgPT0gTlVMTCkgewotI2lmZGVmICBfX1FOWE5UT19fCi0JVGhyZWFkQ3RsKF9OVE9fVENUTF9JTywgMCk7IC8qIEdldCBJTyBwcml2aWxpZGdlICovCi0jZW5kaWYKLQlmb3JjZSA9IGdldGVudigiVkJJT1NfTUVUSE9EIik7Ci0JVlJlZ3MgPSBWQklPU2luaXQoZm9yY2UgPyBhdG9pKGZvcmNlKSA6IDApOwotCX0KLSNpZm5kZWYgIF9fUU5YTlRPX18KLSAgICBNVFJSX2luaXQoKTsKLSNlbmRpZgotfQotCi1pYm9vbCBQTUFQSSBQTV9oYXZlQklPU0FjY2Vzcyh2b2lkKQoteyByZXR1cm4gVlJlZ3MgIT0gTlVMTDsgfQotCi1sb25nIFBNQVBJIFBNX2dldE9TVHlwZSh2b2lkKQoteyByZXR1cm4gX09TX1FOWDsgfQotCi1pbnQgUE1BUEkgUE1fZ2V0TW9kZVR5cGUodm9pZCkKLXsgcmV0dXJuIFBNXzM4NjsgfQotCi12b2lkIFBNQVBJIFBNX2JhY2tzbGFzaChjaGFyICpzKQotewotICAgIHVpbnQgcG9zID0gc3RybGVuKHMpOwotICAgIGlmIChzW3Bvcy0xXSAhPSAnLycpIHsKLQlzW3Bvc10gPSAnLyc7Ci0Jc1twb3MrMV0gPSAnXDAnOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRGYXRhbEVycm9yQ2xlYW51cCgKLSAgICB2b2lkIChQTUFQSVAgY2xlYW51cCkodm9pZCkpCi17Ci0gICAgZmF0YWxFcnJvckNsZWFudXAgPSBjbGVhbnVwOwotfQotCi12b2lkIFBNQVBJIFBNX2ZhdGFsRXJyb3IoY29uc3QgY2hhciAqbXNnKQotewotICAgIGlmIChmYXRhbEVycm9yQ2xlYW51cCkKLQlmYXRhbEVycm9yQ2xlYW51cCgpOwotICAgIGZwcmludGYoc3RkZXJyLCIlc1xuIiwgbXNnKTsKLSAgICBleGl0KDEpOwotfQotCi1zdGF0aWMgdm9pZCBFeGl0VkJFQnVmKHZvaWQpCi17Ci0gICAgaWYgKFZFU0FCdWZfcHRyKQotCVBNX2ZyZWVSZWFsU2VnKFZFU0FCdWZfcHRyKTsKLSAgICBWRVNBQnVmX3B0ciA9IDA7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRWRVNBQnVmKHVpbnQgKmxlbix1aW50ICpyc2VnLHVpbnQgKnJvZmYpCi17Ci0gICAgaWYgKCFWRVNBQnVmX3B0cikgewotCS8qIEFsbG9jYXRlIGEgZ2xvYmFsIGJ1ZmZlciBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBWRVNBIFZCRSAqLwotCWlmICgoVkVTQUJ1Zl9wdHIgPSBQTV9hbGxvY1JlYWxTZWcoVkVTQUJ1Zl9sZW4sICZWRVNBQnVmX3JzZWcsICZWRVNBQnVmX3JvZmYpKSA9PSBOVUxMKQotCSAgICByZXR1cm4gTlVMTDsKLQlhdGV4aXQoRXhpdFZCRUJ1Zik7Ci0JfQotICAgICpsZW4gPSBWRVNBQnVmX2xlbjsKLSAgICAqcnNlZyA9IFZFU0FCdWZfcnNlZzsKLSAgICAqcm9mZiA9IFZFU0FCdWZfcm9mZjsKLSAgICByZXR1cm4gVkVTQUJ1Zl9wdHI7Ci19Ci0KLXN0YXRpYyBpbnQgdGVybV9yYXcodm9pZCkKLXsKLSAgICBzdHJ1Y3QgdGVybWlvcyAgdGVybWlvc19wOwotCi0gICAgaWYgKHJhd19jb3VudCsrID4gMCkKLQlyZXR1cm4gMDsKLQotICAgIC8qIEdvIGludG8gInJhdyIgaW5wdXQgbW9kZSAqLwotICAgIGlmICh0Y2dldGF0dHIoU1RESU5fRklMRU5PLCAmdGVybWlvc19wKSkKLQlyZXR1cm4gLTE7Ci0KLSAgICB0ZXJtaW9zX3AuY19jY1tWTUlOXSA9ICAxOwotICAgIHRlcm1pb3NfcC5jX2NjW1ZUSU1FXSA9ICAwOwotICAgIHRlcm1pb3NfcC5jX2xmbGFnICY9IH4oIEVDSE98SUNBTk9OfElTSUd8RUNIT0V8RUNIT0t8RUNIT05MKTsKLSAgICB0Y3NldGF0dHIoU1RESU5fRklMRU5PLCBUQ1NBRFJBSU4sICZ0ZXJtaW9zX3ApOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB0ZXJtX3Jlc3RvcmUodm9pZCkKLXsKLSAgICBzdHJ1Y3QgdGVybWlvcyAgdGVybWlvc19wOwotCi0gICAgaWYgKHJhd19jb3VudC0tICE9IDEpCi0JcmV0dXJuOwotCi0gICAgdGNnZXRhdHRyKFNURElOX0ZJTEVOTywgJnRlcm1pb3NfcCk7Ci0gICAgdGVybWlvc19wLmNfbGZsYWcgfD0gKEVDSE98SUNBTk9OfElTSUd8RUNIT0V8RUNIT0t8RUNIT05MKTsKLSAgICB0ZXJtaW9zX3AuY19vZmxhZyB8PSAoT1BPU1QpOwotICAgIHRjc2V0YXR0cihTVERJTl9GSUxFTk8sIFRDU0FEUkFJTiwgJnRlcm1pb3NfcCk7Ci19Ci0KLWludCBQTUFQSSBQTV9rYmhpdCh2b2lkKQotewotICAgIGludCBibG9ja2luZywgYzsKLQotICAgIGlmICh0ZXJtX3JhdygpID09IC0xKQotCXJldHVybiAwOwotCi0gICAgLyogR28gaW50byBub24gYmxvY2tpbmcgbW9kZSAqLwotICAgIGJsb2NraW5nID0gZmNudGwoU1RESU5fRklMRU5PLCBGX0dFVEZMKSB8IE9fTk9OQkxPQ0s7Ci0gICAgZmNudGwoU1RESU5fRklMRU5PLCBGX1NFVEZMLCBibG9ja2luZyk7Ci0gICAgYyA9IGdldGMoc3RkaW4pOwotCi0gICAgLyogcmVzdG9yZSBibG9ja2luZyBtb2RlICovCi0gICAgZmNudGwoU1RESU5fRklMRU5PLCBGX1NFVEZMLCBibG9ja2luZyAmIH5PX05PTkJMT0NLKTsKLSAgICB0ZXJtX3Jlc3RvcmUoKTsKLSAgICBpZiAoYyAhPSBFT0YpIHsKLQl1bmdldGMoYywgc3RkaW4pOwotCXJldHVybiBjOwotCX0KLSAgICBjbGVhcmVycihzdGRpbik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBQTUFQSSBQTV9nZXRjaCh2b2lkKQotewotICAgIGludCBjOwotCi0gICAgaWYgKHRlcm1fcmF3KCkgPT0gLTEpCi0JcmV0dXJuICgwKTsKLSAgICBjID0gZ2V0YyhzdGRpbik7Ci0jaWYgZGVmaW5lZChfX1FOWF9fKSAmJiAhZGVmaW5lZChfX1FOWE5UT19fKQotICAgIGlmIChjID09IDB4QSkKLQljID0gMHgwRDsKLSAgICBlbHNlIGlmIChjID09IDB4N0YpCi0JYyA9IDB4MDg7Ci0jZW5kaWYKLSAgICB0ZXJtX3Jlc3RvcmUoKTsKLSAgICByZXR1cm4gYzsKLX0KLQotUE1fSFdORCBQTUFQSSBQTV9vcGVuQ29uc29sZSgKLSAgICBQTV9IV05EIGh3bmRVc2VyLAotICAgIGludCBkZXZpY2UsCi0gICAgaW50IHhSZXMsCi0gICAgaW50IHlSZXMsCi0gICAgaW50IGJwcCwKLSAgICBpYm9vbCBmdWxsU2NyZWVuKQotewotI2lmbmRlZiBfX1FOWE5UT19fCi0gICAgaW50IGZkOwotCi0gICAgaWYgKGNvbnNvbGVfY291bnQrKykKLQlyZXR1cm4gMDsKLSAgICBpZiAoKGZkID0gb3BlbigiL2Rldi9jb24xIiwgT19SRFdSKSkgPT0gLTEpCi0JcmV0dXJuIC0xOwotICAgIGNjID0gY29uc29sZV9vcGVuKGZkLCBPX1JEV1IpOwotICAgIGNsb3NlKGZkKTsKLSAgICBpZiAoY2MgPT0gTlVMTCkKLQlyZXR1cm4gLTE7Ci0jZW5kaWYKLSAgICByZXR1cm4gMTsKLX0KLQotaW50IFBNQVBJIFBNX2dldENvbnNvbGVTdGF0ZVNpemUodm9pZCkKLXsKLSAgICByZXR1cm4gUE1fZ2V0VkdBU3RhdGVTaXplKCkgKyBzaXplb2YoaW50KSAqIDM7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2F2ZUNvbnNvbGVTdGF0ZSh2b2lkICpzdGF0ZUJ1ZixpbnQgY29uc29sZV9pZCkKLXsKLSNpZmRlZiBfX1FOWE5UT19fCi0gICAgaW50ICAgICBmZDsKLSAgICBpbnQgICAgIGZsYWdzOwotCi0gICAgaWYgKChmZCA9IG9wZW4oIi9kZXYvY29uMSIsIE9fUkRXUikpID09IC0xKQotCXJldHVybjsKLSAgICBmbGFncyA9IF9DT05DVExfSU5WSVNJQkxFX0NIRyB8IF9DT05DVExfSU5WSVNJQkxFOwotICAgIGRldmN0bChmZCwgRENNRF9DSFJfU0VSQ1RMLCAmZmxhZ3MsIHNpemVvZiBmbGFncywgMCk7Ci0gICAgY2xvc2UoZmQpOwotI2Vsc2UKLSAgICB1Y2hhciAgICpidWYgPSAmKCh1Y2hhciopc3RhdGVCdWYpW1BNX2dldFZHQVN0YXRlU2l6ZSgpXTsKLQotICAgIC8qIFNhdmUgUU5YIDQgY29uc29sZSBzdGF0ZSAqLwotICAgIGNvbnNvbGVfcmVhZChjYywgLTEsIDAsIE5VTEwsIDAsCi0JKGludCAqKWJ1ZisxLCAoaW50ICopYnVmKzIsIE5VTEwpOwotICAgICooaW50ICopYnVmID0gY29uc29sZV9jdHJsKGNjLCAtMSwKLQlDT05TT0xFX05PUkVTSVpFIHwgQ09OU09MRV9OT1NXSVRDSCB8IENPTlNPTEVfSU5WSVNJQkxFLAotCUNPTlNPTEVfTk9SRVNJWkUgfCBDT05TT0xFX05PU1dJVENIIHwgQ09OU09MRV9JTlZJU0lCTEUpOwotCi0gICAgLyogU2F2ZSBzdGF0ZSBvZiBWR0EgcmVnaXN0ZXJzICovCi0gICAgUE1fc2F2ZVZHQVN0YXRlKHN0YXRlQnVmKTsKLSNlbmRpZgotfQotCi12b2lkIFBNQVBJIFBNX3NldFN1c3BlbmRBcHBDYWxsYmFjayhpbnQgKF9BU01BUElQIHNhdmVTdGF0ZSkoaW50IGZsYWdzKSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgc3VwcG9ydCBmb3IgY29uc29sZSBzd2l0Y2hpbmcgaWYgcG9zc2libGUgKi8KLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlQ29uc29sZVN0YXRlKGNvbnN0IHZvaWQgKnN0YXRlQnVmLFBNX0hXTkQgaHduZENvbnNvbGUpCi17Ci0jaWZkZWYgX19RTlhOVE9fXwotICAgIGludCAgICAgZmQ7Ci0gICAgaW50ICAgICBmbGFnczsKLQotICAgIGlmICgoZmQgPSBvcGVuKCIvZGV2L2NvbjEiLCBPX1JEV1IpKSA9PSAtMSkKLQlyZXR1cm47Ci0gICAgZmxhZ3MgPSBfQ09OQ1RMX0lOVklTSUJMRV9DSEc7Ci0gICAgZGV2Y3RsKGZkLCBEQ01EX0NIUl9TRVJDVEwsICZmbGFncywgc2l6ZW9mIGZsYWdzLCAwKTsKLSAgICBjbG9zZShmZCk7Ci0jZWxzZQotICAgIHVjaGFyICAgKmJ1ZiA9ICYoKHVjaGFyKilzdGF0ZUJ1ZilbUE1fZ2V0VkdBU3RhdGVTaXplKCldOwotCi0gICAgLyogUmVzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIFZHQSBjb21wYXRpYmxlIHJlZ2lzdGVycyAqLwotICAgIFBNX3Jlc3RvcmVWR0FTdGF0ZShzdGF0ZUJ1Zik7Ci0KLSAgICAvKiBSZXN0b3JlIFFOWCA0IGNvbnNvbGUgc3RhdGUgKi8KLSAgICBjb25zb2xlX2N0cmwoY2MsIC0xLCAqKGludCAqKWJ1ZiwKLQlDT05TT0xFX05PUkVTSVpFIHwgQ09OU09MRV9OT1NXSVRDSCB8IENPTlNPTEVfSU5WSVNJQkxFKTsKLSAgICBjb25zb2xlX3dyaXRlKGNjLCAtMSwgMCwgTlVMTCwgMCwKLQkoaW50ICopYnVmKzEsIChpbnQgKilidWYrMiwgTlVMTCk7Ci0jZW5kaWYKLX0KLQotdm9pZCBQTUFQSSBQTV9jbG9zZUNvbnNvbGUoUE1fSFdORCBod25kQ29uc29sZSkKLXsKLSNpZm5kZWYgX19RTlhOVE9fXwotICAgIGlmICgtLWNvbnNvbGVfY291bnQgPT0gMCkgewotCWNvbnNvbGVfY2xvc2UoY2MpOwotCWNjID0gTlVMTDsKLQl9Ci0jZW5kaWYKLX0KLQotdm9pZCBQTV9zZXRPU0N1cnNvckxvY2F0aW9uKGludCB4LGludCB5KQotewotICAgIGlmICghY2MpCi0JcmV0dXJuOwotI2lmbmRlZiBfX1FOWE5UT19fCi0gICAgY29uc29sZV93cml0ZShjYywgLTEsIDAsIE5VTEwsIDAsICZ5LCAmeCwgTlVMTCk7Ci0jZW5kaWYKLX0KLQotdm9pZCBQTV9zZXRPU1NjcmVlbldpZHRoKGludCB3aWR0aCxpbnQgaGVpZ2h0KQotewotfQotCi1pYm9vbCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrSGFuZGxlcihQTV9pbnRIYW5kbGVyIGloLCBpbnQgZnJlcXVlbmN5KQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzIGZvciBRTlggKi8KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0ZyZXF1ZW5jeShpbnQgZnJlcXVlbmN5KQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzIGZvciBRTlggKi8KLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlUmVhbFRpbWVDbG9ja0hhbmRsZXIodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyBmb3IgUU5YICovCi19Ci0KLWNoYXIgKiBQTUFQSSBQTV9nZXRDdXJyZW50UGF0aCgKLSAgICBjaGFyICpwYXRoLAotICAgIGludCBtYXhMZW4pCi17Ci0gICAgcmV0dXJuIGdldGN3ZChwYXRoLG1heExlbik7Ci19Ci0KLWNoYXIgUE1BUEkgUE1fZ2V0Qm9vdERyaXZlKHZvaWQpCi17IHJldHVybiAnLyc7IH0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFZCRUFGUGF0aCh2b2lkKQoteyByZXR1cm4gUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgoKTsgfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c1BhdGgodm9pZCkKLXsKLSAgICBjaGFyICplbnYgPSBnZXRlbnYoIk5VQ0xFVVNfUEFUSCIpOwotI2lmZGVmIF9fUU5YTlRPX18KLSNpZmRlZiBfX1g4Nl9fCi0gICAgcmV0dXJuIGVudiA/IGVudiA6ICIvbnRvL3NjaXRlY2gveDg2L2JpbiI7Ci0jZWxpZiBkZWZpbmVkIChfX1BQQ19fKQotICAgIHJldHVybiBlbnYgPyBlbnYgOiAiL250by9zY2l0ZWNoL3BwY2JlL2JpbiI7Ci0jZWxpZiBkZWZpbmVkIChfX01JUFNfXykKLSNpZmRlZiBfX0JJR0VORElBTl9fCi0gICAgcmV0dXJuIGVudiA/IGVudiA6ICIvbnRvL3NjaXRlY2gvbWlwc2JlL2JpbiI7Ci0jZWxzZQotICAgIHJldHVybiBlbnYgPyBlbnYgOiAiL250by9zY2l0ZWNoL21pcHNsZS9iaW4iOwotI2VuZGlmCi0jZWxpZiBkZWZpbmVkIChfX1NIX18pCi0jaWZkZWYgX19CSUdFTkRJQU5fXwotICAgIHJldHVybiBlbnYgPyBlbnYgOiAiL250by9zY2l0ZWNoL3NoYmUvYmluIjsKLSNlbHNlCi0gICAgcmV0dXJuIGVudiA/IGVudiA6ICIvbnRvL3NjaXRlY2gvc2hsZS9iaW4iOwotI2VuZGlmCi0jZWxpZiBkZWZpbmVkIChfX0FSTV9fKQotICAgIHJldHVybiBlbnYgPyBlbnYgOiAiL250by9zY2l0ZWNoL2FybWxlL2JpbiI7Ci0jZW5kaWYKLSNlbHNlICAgLyogUU5YIDQgKi8KLSAgICByZXR1cm4gZW52ID8gZW52IDogIi9xbng0L3NjaXRlY2gvYmluIjsKLSNlbmRpZgotfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBwYXRoWzUxMl07Ci0gICAgY2hhciAgICAgICAgKmVudjsKLSNpZmRlZiBfX1FOWE5UT19fCi0gICAgY2hhciB0ZW1wWzY0XTsKLSAgICBnZXRob3N0bmFtZSh0ZW1wLCBzaXplb2YgKHRlbXApKTsKLSAgICB0ZW1wW3NpemVvZiAodGVtcCkgLSAxXSA9ICdcMCc7ICAgICAvKiBQYXJhbm9pZCAqLwotICAgIHNwcmludGYocGF0aCwiL2V0Yy9jb25maWcvc2NpdGVjaC8lcy9jb25maWciLCB0ZW1wKTsKLSNlbHNlCi0gICAgc3ByaW50ZihwYXRoLCIvZXRjL2NvbmZpZy9zY2l0ZWNoLyVkL2NvbmZpZyIsIGdldG5pZCgpKTsKLSNlbmRpZgotICAgIGlmICgoZW52ID0gZ2V0ZW52KCJOVUNMRVVTX1BBVEgiKSkgIT0gTlVMTCkgewotCXN0cmNweShwYXRoLGVudik7Ci0JUE1fYmFja3NsYXNoKHBhdGgpOwotCXN0cmNhdChwYXRoLCJjb25maWciKTsKLQl9Ci0gICAgcmV0dXJuIHBhdGg7Ci19Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRVbmlxdWVJRCh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIGJ1ZlsxMjhdOwotI2lmZGVmIF9fUU5YTlRPX18KLSAgICBnZXRob3N0bmFtZShidWYsIHNpemVvZiAoYnVmKSk7Ci0jZWxzZQotICAgIHNwcmludGYoYnVmLCJub2RlJWQiLCBnZXRuaWQoKSk7Ci0jZW5kaWYKLSAgICByZXR1cm4gYnVmOwotfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TWFjaGluZU5hbWUodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBidWZbMTI4XTsKLSNpZmRlZiBfX1FOWE5UT19fCi0gICAgZ2V0aG9zdG5hbWUoYnVmLCBzaXplb2YgKGJ1ZikpOwotI2Vsc2UKLSAgICBzcHJpbnRmKGJ1Ziwibm9kZSVkIiwgZ2V0bmlkKCkpOwotI2VuZGlmCi0gICAgcmV0dXJuIGJ1ZjsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2dldEJJT1NQb2ludGVyKHZvaWQpCi17Ci0gICAgcmV0dXJuIFBNX21hcFJlYWxQb2ludGVyKDAsIDB4NDAwKTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2dldEEwMDAwUG9pbnRlcih2b2lkKQotewotICAgIHN0YXRpYyB2b2lkICpwdHIgPSBOVUxMOwotICAgIHZvaWQgKmZyZWVwdHI7Ci0gICAgdW5zaWduZWQgb2Zmc2V0LCBpLCBtYXBsZW47Ci0KLSAgICBpZiAocHRyICE9IE5VTEwpCi0JcmV0dXJuIHB0cjsKLQotICAgIC8qIFNvbWUgdHJpY2tlcnkgaXMgcmVxdWlyZWQgdG8gZ2V0IHRoZSBsaW5lYXIgYWRkcmVzcyA2NEsgYWxpZ25lZCAqLwotICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKLQlwdHIgPSBQTV9tYXBQaHlzaWNhbEFkZHIoMHhBMDAwMCwweEZGRkYsdHJ1ZSk7Ci0Jb2Zmc2V0ID0gMHgxMDAwMCAtICgodW5zaWduZWQpcHRyICUgMHgxMDAwMCk7Ci0JaWYgKCFvZmZzZXQpCi0JICAgIGJyZWFrOwotCW11bm1hcChwdHIsIDB4MTAwMDApOwotCW1hcGxlbiA9IDB4MTAwMDAgKyBvZmZzZXQ7Ci0JZnJlZXB0ciA9IFBNX21hcFBoeXNpY2FsQWRkcigweEEwMDAwLW9mZnNldCwgbWFwbGVuLTEsdHJ1ZSk7Ci0JcHRyID0gKHZvaWQgKikob2Zmc2V0ICsgKHVuc2lnbmVkKWZyZWVwdHIpOwotCWlmICgweDEwMDAwIC0gKCh1bnNpZ25lZClwdHIgJSAweDEwMDAwKSkKLQkgICAgYnJlYWs7Ci0JbXVubWFwKGZyZWVwdHIsIG1hcGxlbik7Ci0JfQotICAgIGlmIChpID09IDUpIHsKLQlwcmludGYoIkNvdWxkIG5vdCBnZXQgYSA2NEsgYWxpZ25lZCBsaW5lYXIgYWRkcmVzcyBmb3IgQTAwMDAgcmVnaW9uXG4iKTsKLQlleGl0KDEpOwotCX0KLSAgICByZXR1cm4gcHRyOwotfQotCi12b2lkICogUE1BUEkgUE1fbWFwUGh5c2ljYWxBZGRyKHVsb25nIGJhc2UsdWxvbmcgbGltaXQsaWJvb2wgaXNDYWNoZWQpCi17Ci0gICAgdWNoYXJfdCAqcDsKLSAgICB1bnNpZ25lZCBvOwotICAgIHVuc2lnbmVkIHByb3QgPSBQUk9UX1JFQUR8UFJPVF9XUklURXwoaXNDYWNoZWQ/MDpQUk9UX05PQ0FDSEUpOwotI2lmZGVmIF9fUEFHRVNJWkUKLSAgICBpbnQgcGFnZXNpemUgPSBfX1BBR0VTSVpFOwotI2Vsc2UKLSAgICBpbnQgcGFnZXNpemUgPSA0MDk2OwotI2VuZGlmCi0gICAgaW50IHJvdW5kZG93biA9IGJhc2UgJSBwYWdlc2l6ZTsKLSNpZm5kZWYgX19RTlhOVE9fXwotICAgIHN0YXRpYyBpbnQgX19WaWRGRCA9IC0xOwotI2VuZGlmCi0KLSAgICBpZiAocm91bmRkb3duKSB7Ci0JaWYgKGJhc2UgPCByb3VuZGRvd24pCi0JICAgIHJldHVybiBOVUxMOwotCWJhc2UgLT0gcm91bmRkb3duOwotCWxpbWl0ICs9IHJvdW5kZG93bjsKLQl9Ci0KLSNpZm5kZWYgX19RTlhOVE9fXwotICAgIGlmIChfX1ZpZEZEIDwgMCkgewotCWlmICgoX19WaWRGRCA9IHNobV9vcGVuKCAiUGh5c2ljYWwiLCBPX1JEV1IsIDA3NzcgKSkgPT0gLTEpIHsKLQkgICAgcGVycm9yKCAiQ2Fubm90IG9wZW4gUGh5c2ljYWwgbWVtb3J5IiApOwotCSAgICBleGl0KDEpOwotCSAgICB9Ci0JfQotICAgIG8gPSBiYXNlICYgMHhGRkY7Ci0gICAgbGltaXQgPSAobGltaXQgKyBvICsgMHhGRkYpICYgfjB4RkZGOwotICAgIGlmICgoaW50KShwID0gbW1hcCggMCwgbGltaXQsIHByb3QsIE1BUF9TSEFSRUQsCi0JICAgIF9fVmlkRkQsIGJhc2UgKSkgPT0gLTEgKSB7Ci0JcmV0dXJuIE5VTEw7Ci0JfQotICAgIHAgKz0gbzsKLSNlbHNlCi0gICAgaWYgKChwID0gbW1hcCgwLCBsaW1pdCwgcHJvdCwgTUFQX1BIWVMgfCBNQVBfU0hBUkVELAotCSAgICBOT0ZELCBiYXNlKSkgPT0gTUFQX0ZBSUxFRCkgewotCXJldHVybiAodm9pZCAqKS0xOwotCX0KLSNlbmRpZgotICAgIHJldHVybiAocCArIHJvdW5kZG93bik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZVBoeXNpY2FsQWRkcih2b2lkICpwdHIsdWxvbmcgbGltaXQpCi17Ci0gICAgbXVubWFwKHB0cixsaW1pdCsxKTsKLX0KLQotdWxvbmcgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyKHZvaWQgKnApCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgZmluZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIGxpbmVhciAqLwotICAgIC8qICAgICAgIGFkZHJlc3MuICovCi0gICAgcmV0dXJuIDB4RkZGRkZGRkZVTDsKLX0KLQotaWJvb2wgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyUmFuZ2UoCi0gICAgdm9pZCAqcCwKLSAgICB1bG9uZyBsZW5ndGgsCi0gICAgdWxvbmcgKnBoeXNBZGRyZXNzKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzISAqLwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zbGVlcCh1bG9uZyBtaWxsaXNlY29uZHMpCi17Ci0gICAgLyogVE9ETzogUHV0IHRoZSBwcm9jZXNzIHRvIHNsZWVwIGZvciBtaWxsaXNlY29uZHMgKi8KLX0KLQotaW50IFBNQVBJIFBNX2dldENPTVBvcnQoaW50IHBvcnQpCi17Ci0gICAgLyogVE9ETzogUmUtY29kZSB0aGlzIHRvIGRldGVybWluZSByZWFsIHZhbHVlcyB1c2luZyB0aGUgUGx1ZyBhbmQgUGxheSAqLwotICAgIC8qICAgICAgIG1hbmFnZXIgZm9yIHRoZSBPUy4gKi8KLSAgICBzd2l0Y2ggKHBvcnQpIHsKLQljYXNlIDA6IHJldHVybiAweDNGODsKLQljYXNlIDE6IHJldHVybiAweDJGODsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBQTUFQSSBQTV9nZXRMUFRQb3J0KGludCBwb3J0KQotewotICAgIC8qIFRPRE86IFJlLWNvZGUgdGhpcyB0byBkZXRlcm1pbmUgcmVhbCB2YWx1ZXMgdXNpbmcgdGhlIFBsdWcgYW5kIFBsYXkgKi8KLSAgICAvKiAgICAgICBtYW5hZ2VyIGZvciB0aGUgT1MuICovCi0gICAgc3dpdGNoIChwb3J0KSB7Ci0JY2FzZSAwOiByZXR1cm4gMHgzQkM7Ci0JY2FzZSAxOiByZXR1cm4gMHgzNzg7Ci0JY2FzZSAyOiByZXR1cm4gMHgyNzg7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi12b2lkICogUE1BUEkgUE1fbWFsbG9jU2hhcmVkKGxvbmcgc2l6ZSkKLXsKLSAgICByZXR1cm4gUE1fbWFsbG9jKHNpemUpOwotfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVTaGFyZWQodm9pZCAqcHRyKQotewotICAgIFBNX2ZyZWUocHRyKTsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX21hcFRvUHJvY2Vzcyh2b2lkICpiYXNlLHVsb25nIGxpbWl0KQoteyByZXR1cm4gKHZvaWQqKWJhc2U7IH0KLQotdm9pZCAqIFBNQVBJIFBNX21hcFJlYWxQb2ludGVyKHVpbnQgcl9zZWcsdWludCByX29mZikKLXsKLSAgICB2b2lkICpwOwotCi0gICAgUE1faW5pdCgpOwotCi0gICAgaWYgKChwID0gVkJJT1NnZXRtZW1wdHIocl9zZWcsIHJfb2ZmLCBWUmVncykpID09ICh2b2lkICopLTEpCi0JcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIHA7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY1JlYWxTZWcodWludCBzaXplLHVpbnQgKnJfc2VnLHVpbnQgKnJfb2ZmKQotewotICAgIGlmIChzaXplID4gMTAyNCkgewotCXByaW50ZigiUE1fYWxsb2NSZWFsU2VnOiBjYW4ndCBoYW5kbGUgJWQgYnl0ZXNcbiIsIHNpemUpOwotCXJldHVybiAwOwotCX0KLSAgICBpZiAocm1idWZfaW51c2UgIT0gMCkgewotCXByaW50ZigiUE1fYWxsb2NSZWFsU2VnOiB0cmFuc2ZlciBhcmVhIGFscmVhZHkgaW4gdXNlXG4iKTsKLQlyZXR1cm4gMDsKLQl9Ci0gICAgUE1faW5pdCgpOwotICAgIHJtYnVmX2ludXNlID0gMTsKLSAgICAqcl9zZWcgPSBWQklPU19UcmFuc0J1ZlZTZWcoVlJlZ3MpOwotICAgICpyX29mZiA9IFZCSU9TX1RyYW5zQnVmVk9mZihWUmVncyk7Ci0gICAgcmV0dXJuICh2b2lkKilWQklPU19UcmFuc0J1ZlB0cihWUmVncyk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZVJlYWxTZWcodm9pZCAqbWVtKQotewotICAgIGlmIChybWJ1Zl9pbnVzZSA9PSAwKSB7Ci0JcHJpbnRmKCJQTV9mcmVlUmVhbFNlZzogbm90aGluZyB3YXMgYWxsb2NhdGVkXG4iKTsKLQlyZXR1cm47Ci0JfQotICAgIHJtYnVmX2ludXNlID0gMDsKLX0KLQotdm9pZCBQTUFQSSBEUE1JX2ludDg2KGludCBpbnRubywgRFBNSV9yZWdzICpyZWdzKQotewotICAgIFBNX2luaXQoKTsKLSAgICBpZiAoVlJlZ3MgPT0gTlVMTCkKLQlyZXR1cm47Ci0KLSAgICBWUmVncy0+bC5lYXggPSByZWdzLT5lYXg7Ci0gICAgVlJlZ3MtPmwuZWJ4ID0gcmVncy0+ZWJ4OwotICAgIFZSZWdzLT5sLmVjeCA9IHJlZ3MtPmVjeDsKLSAgICBWUmVncy0+bC5lZHggPSByZWdzLT5lZHg7Ci0gICAgVlJlZ3MtPmwuZXNpID0gcmVncy0+ZXNpOwotICAgIFZSZWdzLT5sLmVkaSA9IHJlZ3MtPmVkaTsKLQotICAgIFZCSU9TaW50KGludG5vLCBWUmVncywgMTAyNCk7Ci0KLSAgICByZWdzLT5lYXggPSBWUmVncy0+bC5lYXg7Ci0gICAgcmVncy0+ZWJ4ID0gVlJlZ3MtPmwuZWJ4OwotICAgIHJlZ3MtPmVjeCA9IFZSZWdzLT5sLmVjeDsKLSAgICByZWdzLT5lZHggPSBWUmVncy0+bC5lZHg7Ci0gICAgcmVncy0+ZXNpID0gVlJlZ3MtPmwuZXNpOwotICAgIHJlZ3MtPmVkaSA9IFZSZWdzLT5sLmVkaTsKLSAgICByZWdzLT5mbGFncyA9IFZSZWdzLT53LmZsYWdzICYgMHgxOwotfQotCi1pbnQgUE1BUEkgUE1faW50ODYoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCkKLXsKLSAgICBQTV9pbml0KCk7Ci0gICAgaWYgKFZSZWdzID09IE5VTEwpCi0JcmV0dXJuIDA7Ci0KLSAgICBWUmVncy0+bC5lYXggPSBpbi0+ZS5lYXg7Ci0gICAgVlJlZ3MtPmwuZWJ4ID0gaW4tPmUuZWJ4OwotICAgIFZSZWdzLT5sLmVjeCA9IGluLT5lLmVjeDsKLSAgICBWUmVncy0+bC5lZHggPSBpbi0+ZS5lZHg7Ci0gICAgVlJlZ3MtPmwuZXNpID0gaW4tPmUuZXNpOwotICAgIFZSZWdzLT5sLmVkaSA9IGluLT5lLmVkaTsKLQotICAgIFZCSU9TaW50KGludG5vLCBWUmVncywgMTAyNCk7Ci0KLSAgICBvdXQtPmUuZWF4ID0gVlJlZ3MtPmwuZWF4OwotICAgIG91dC0+ZS5lYnggPSBWUmVncy0+bC5lYng7Ci0gICAgb3V0LT5lLmVjeCA9IFZSZWdzLT5sLmVjeDsKLSAgICBvdXQtPmUuZWR4ID0gVlJlZ3MtPmwuZWR4OwotICAgIG91dC0+ZS5lc2kgPSBWUmVncy0+bC5lc2k7Ci0gICAgb3V0LT5lLmVkaSA9IFZSZWdzLT5sLmVkaTsKLSAgICBvdXQtPnguY2ZsYWcgPSBWUmVncy0+dy5mbGFncyAmIDB4MTsKLQotICAgIHJldHVybiBvdXQtPnguYXg7Ci19Ci0KLWludCBQTUFQSSBQTV9pbnQ4NngoaW50IGludG5vLCBSTVJFR1MgKmluLCBSTVJFR1MgKm91dCwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICBQTV9pbml0KCk7Ci0gICAgaWYgKFZSZWdzID09IE5VTEwpCi0JcmV0dXJuIDA7Ci0KLSAgICBpZiAoaW50bm8gPT0gMHgyMSkgewotCXRpbWVfdCB0b2RheSA9IHRpbWUoTlVMTCk7Ci0Jc3RydWN0IHRtICp0OwotCXQgPSBsb2NhbHRpbWUoJnRvZGF5KTsKLQlvdXQtPnguY3ggPSB0LT50bV95ZWFyICsgMTkwMDsKLQlvdXQtPmguZGggPSB0LT50bV9tb24gKyAxOwotCW91dC0+aC5kbCA9IHQtPnRtX21kYXk7Ci0JcmV0dXJuIDA7Ci0JfQotICAgIGVsc2UgewotCVZSZWdzLT5sLmVheCA9IGluLT5lLmVheDsKLQlWUmVncy0+bC5lYnggPSBpbi0+ZS5lYng7Ci0JVlJlZ3MtPmwuZWN4ID0gaW4tPmUuZWN4OwotCVZSZWdzLT5sLmVkeCA9IGluLT5lLmVkeDsKLQlWUmVncy0+bC5lc2kgPSBpbi0+ZS5lc2k7Ci0JVlJlZ3MtPmwuZWRpID0gaW4tPmUuZWRpOwotCVZSZWdzLT53LmVzID0gc3JlZ3MtPmVzOwotCVZSZWdzLT53LmRzID0gc3JlZ3MtPmRzOwotCi0JVkJJT1NpbnQoaW50bm8sIFZSZWdzLCAxMDI0KTsKLQotCW91dC0+ZS5lYXggPSBWUmVncy0+bC5lYXg7Ci0Jb3V0LT5lLmVieCA9IFZSZWdzLT5sLmVieDsKLQlvdXQtPmUuZWN4ID0gVlJlZ3MtPmwuZWN4OwotCW91dC0+ZS5lZHggPSBWUmVncy0+bC5lZHg7Ci0Jb3V0LT5lLmVzaSA9IFZSZWdzLT5sLmVzaTsKLQlvdXQtPmUuZWRpID0gVlJlZ3MtPmwuZWRpOwotCW91dC0+eC5jZmxhZyA9IFZSZWdzLT53LmZsYWdzICYgMHgxOwotCXNyZWdzLT5lcyA9IFZSZWdzLT53LmVzOwotCXNyZWdzLT5kcyA9IFZSZWdzLT53LmRzOwotCi0JcmV0dXJuIG91dC0+eC5heDsKLQl9Ci19Ci0KLXZvaWQgUE1BUEkgUE1fY2FsbFJlYWxNb2RlKHVpbnQgc2VnLHVpbnQgb2ZmLCBSTVJFR1MgKmluLAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIFBNX2luaXQoKTsKLSAgICBpZiAoVlJlZ3MgPT0gTlVMTCkKLQlyZXR1cm47Ci0KLSAgICBWUmVncy0+bC5lYXggPSBpbi0+ZS5lYXg7Ci0gICAgVlJlZ3MtPmwuZWJ4ID0gaW4tPmUuZWJ4OwotICAgIFZSZWdzLT5sLmVjeCA9IGluLT5lLmVjeDsKLSAgICBWUmVncy0+bC5lZHggPSBpbi0+ZS5lZHg7Ci0gICAgVlJlZ3MtPmwuZXNpID0gaW4tPmUuZXNpOwotICAgIFZSZWdzLT5sLmVkaSA9IGluLT5lLmVkaTsKLSAgICBWUmVncy0+dy5lcyA9IHNyZWdzLT5lczsKLSAgICBWUmVncy0+dy5kcyA9IHNyZWdzLT5kczsKLQotICAgIFZCSU9TY2FsbChzZWcsIG9mZiwgVlJlZ3MsIDEwMjQpOwotCi0gICAgaW4tPmUuZWF4ID0gVlJlZ3MtPmwuZWF4OwotICAgIGluLT5lLmVieCA9IFZSZWdzLT5sLmVieDsKLSAgICBpbi0+ZS5lY3ggPSBWUmVncy0+bC5lY3g7Ci0gICAgaW4tPmUuZWR4ID0gVlJlZ3MtPmwuZWR4OwotICAgIGluLT5lLmVzaSA9IFZSZWdzLT5sLmVzaTsKLSAgICBpbi0+ZS5lZGkgPSBWUmVncy0+bC5lZGk7Ci0gICAgaW4tPnguY2ZsYWcgPSBWUmVncy0+dy5mbGFncyAmIDB4MTsKLSAgICBzcmVncy0+ZXMgPSBWUmVncy0+dy5lczsKLSAgICBzcmVncy0+ZHMgPSBWUmVncy0+dy5kczsKLX0KLQotdm9pZCBQTUFQSSBQTV9hdmFpbGFibGVNZW1vcnkodWxvbmcgKnBoeXNpY2FsLHVsb25nICp0b3RhbCkKLXsKLSNpZm5kZWYgX19RTlhOVE9fXwotICAgICpwaHlzaWNhbCA9ICp0b3RhbCA9IF9tZW1hdmwoKTsKLSNlbmRpZgotfQotCi12b2lkICogUE1BUEkgUE1fYWxsb2NMb2NrZWRNZW0oCi0gICAgdWludCBzaXplLAotICAgIHVsb25nICpwaHlzQWRkciwKLSAgICBpYm9vbCBjb250aWd1b3VzLAotICAgIGlib29sIGJlbG93MTZNKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzIG9uIFFOWCAqLwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVMb2NrZWRNZW0oCi0gICAgdm9pZCAqcCwKLSAgICB1aW50IHNpemUsCi0gICAgaWJvb2wgY29udGlndW91cykKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyBvbiBRTlggKi8KLX0KLQotdm9pZCAqIFBNQVBJIFBNX2FsbG9jUGFnZSgKLSAgICBpYm9vbCBsb2NrZWQpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgb24gUU5YICovCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZVBhZ2UoCi0gICAgdm9pZCAqcCkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyBvbiBRTlggKi8KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRCYW5rQShpbnQgYmFuaykKLXsKLSAgICBQTV9pbml0KCk7Ci0gICAgaWYgKFZSZWdzID09IE5VTEwpCi0JcmV0dXJuOwotCi0gICAgVlJlZ3MtPmwuZWF4ID0gMHg0RjA1OwotICAgIFZSZWdzLT5sLmVieCA9IDB4MDAwMDsKLSAgICBWUmVncy0+bC5lZHggPSBiYW5rOwotICAgIFZCSU9TaW50KDB4MTAsIFZSZWdzLCAxMDI0KTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRCYW5rQUIoaW50IGJhbmspCi17Ci0gICAgUE1faW5pdCgpOwotICAgIGlmIChWUmVncyA9PSBOVUxMKQotCXJldHVybjsKLQotICAgIFZSZWdzLT5sLmVheCA9IDB4NEYwNTsKLSAgICBWUmVncy0+bC5lYnggPSAweDAwMDA7Ci0gICAgVlJlZ3MtPmwuZWR4ID0gYmFuazsKLSAgICBWQklPU2ludCgweDEwLCBWUmVncywgMTAyNCk7Ci0KLSAgICBWUmVncy0+bC5lYXggPSAweDRGMDU7Ci0gICAgVlJlZ3MtPmwuZWJ4ID0gMHgwMDAxOwotICAgIFZSZWdzLT5sLmVkeCA9IGJhbms7Ci0gICAgVkJJT1NpbnQoMHgxMCwgVlJlZ3MsIDEwMjQpOwotfQotCi12b2lkIFBNQVBJIFBNX3NldENSVFN0YXJ0KGludCB4LGludCB5LGludCB3YWl0VlJUKQotewotICAgIFBNX2luaXQoKTsKLSAgICBpZiAoVlJlZ3MgPT0gTlVMTCkKLQlyZXR1cm47Ci0KLSAgICBWUmVncy0+bC5lYXggPSAweDRGMDc7Ci0gICAgVlJlZ3MtPmwuZWJ4ID0gd2FpdFZSVDsKLSAgICBWUmVncy0+bC5lY3ggPSB4OwotICAgIFZSZWdzLT5sLmVkeCA9IHk7Ci0gICAgVkJJT1NpbnQoMHgxMCwgVlJlZ3MsIDEwMjQpOwotfQotCi1pYm9vbCBQTUFQSSBQTV9kb0JJT1NQT1NUKAotICAgIHVzaG9ydCBheFZhbCwKLSAgICB1bG9uZyBCSU9TUGh5c0FkZHIsCi0gICAgdm9pZCAqY29weU9mQklPUywKLSAgICB1bG9uZyBCSU9TTGVuKQotewotICAgICh2b2lkKWF4VmFsOwotICAgICh2b2lkKUJJT1NQaHlzQWRkcjsKLSAgICAodm9pZCljb3B5T2ZCSU9TOwotICAgICh2b2lkKUJJT1NMZW47Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1pbnQgUE1BUEkgUE1fbG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIHAgPSBwOyAgbGVuID0gbGVuOwotICAgIHJldHVybiAxOwotfQotCi1pbnQgUE1BUEkgUE1fdW5sb2NrRGF0YVBhZ2VzKHZvaWQgKnAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgcCA9IHA7ICBsZW4gPSBsZW47Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLWludCBQTUFQSSBQTV9sb2NrQ29kZVBhZ2VzKHZvaWQgKCpwKSgpLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIHAgPSBwOyAgbGVuID0gbGVuOwotICAgIHJldHVybiAxOwotfQotCi1pbnQgUE1BUEkgUE1fdW5sb2NrQ29kZVBhZ2VzKHZvaWQgKCpwKSgpLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIHAgPSBwOyAgbGVuID0gbGVuOwotICAgIHJldHVybiAxOwotfQotCi1QTV9NT0RVTEUgUE1BUEkgUE1fbG9hZExpYnJhcnkoCi0gICAgY29uc3QgY2hhciAqc3pETExOYW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzIHRvIGxvYWQgc2hhcmVkIGxpYnJhcmllcyEgKi8KLSAgICAodm9pZClzekRMTE5hbWU7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRQcm9jQWRkcmVzcygKLSAgICBQTV9NT0RVTEUgaE1vZHVsZSwKLSAgICBjb25zdCBjaGFyICpzelByb2NOYW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzISAqLwotICAgICh2b2lkKWhNb2R1bGU7Ci0gICAgKHZvaWQpc3pQcm9jTmFtZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlTGlicmFyeSgKLSAgICBQTV9NT0RVTEUgaE1vZHVsZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyEgKi8KLSAgICAodm9pZCloTW9kdWxlOwotfQotCi1pbnQgUE1BUEkgUE1fc2V0SU9QTCgKLSAgICBpbnQgbGV2ZWwpCi17Ci0gICAgLyogUU5YIGhhbmRsZXMgSU9QTCBzZWxlY3Rpb24gYXQgdGhlIHByb2dyYW0gbGluayBsZXZlbC4gKi8KLSAgICByZXR1cm4gbGV2ZWw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYmFzZSAgICAtIFRoZSBzdGFydGluZyBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgotc2l6ZSAgICAtIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZWdpb24KLXR5cGUgICAgLSBUeXBlIHRvIHBsYWNlIGludG8gdGhlIE1UUlIgcmVnaXN0ZXIKLQotUkVUVVJOUzoKLUVycm9yIGNvZGUgZGVzY3JpYmluZyB0aGUgcmVzdWx0LgotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZW5hYmxlIHdyaXRlIGNvbWJpbmluZyBmb3IgdGhlIHNwZWNpZmllZCByZWdpb24gb2YgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9lbmFibGVXcml0ZUNvbWJpbmUoCi0gICAgdWxvbmcgYmFzZSwKLSAgICB1bG9uZyBzaXplLAotICAgIHVpbnQgdHlwZSkKLXsKLSNpZm5kZWYgIF9fUU5YTlRPX18KLSAgICByZXR1cm4gTVRSUl9lbmFibGVXcml0ZUNvbWJpbmUoYmFzZSxzaXplLHR5cGUpOwotI2Vsc2UKLSAgICByZXR1cm4gUE1fTVRSUl9OT1RfU1VQUE9SVEVEOwotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9xbngvdmZsYXQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC92ZmxhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzllZjJjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC92ZmxhdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgRHVtbXkgbW9kdWxlOyBubyB2aXJ0dWFsIGZyYW1lYnVmZmVyIGZvciB0aGlzIE9TCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLQotaWJvb2wgUE1BUEkgVkZfYXZhaWxhYmxlKHZvaWQpCi17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkICogUE1BUEkgVkZfaW5pdCh1bG9uZyBiYXNlQWRkcixpbnQgYmFua1NpemUsaW50IGNvZGVMZW4sdm9pZCAqYmFua0Z1bmMpCi17Ci0gICAgYmFzZUFkZHIgPSBiYXNlQWRkcjsKLSAgICBiYW5rU2l6ZSA9IGJhbmtTaXplOwotICAgIGNvZGVMZW4gPSBjb2RlTGVuOwotICAgIGJhbmtGdW5jID0gYmFua0Z1bmM7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgUE1BUEkgVkZfZXhpdCh2b2lkKQotewotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcW54L3p0aW1lci5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcW54L3p0aW1lci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjc0MDk3Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3FueC96dGltZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIFFOWAotKgotKiBEZXNjcmlwdGlvbjogIFFOWCBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFplbiBUaW1lciBmdW5jdGlvbnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIFplbiBUaW1lciBtb2R1bGUgaW50ZXJuYWxzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX19aVGltZXJJbml0KHZvaWQpCi17Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVXNlIHRoZSBnZXR0aW1lb2ZkYXkoKSBmdW5jdGlvbiB0byBnZXQgbWljcm9zZWNvbmQgcHJlY2lzaW9uIChwcm9iYWJseSBsZXNzCi10aG91Z2gpCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIF9fVUxaUmVhZFRpbWUodm9pZCkKLXsKLSAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7Ci0gICAgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnRzKTsKLSAgICByZXR1cm4gKHRzLnR2X25zZWMgLyAxMDAwICsgdHMudHZfc2VjICogMTAwMDAwMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU3RhcnQgdGhlIFplbiBUaW1lciBjb3VudGluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9fTFpUaW1lck9uKHRtKSAgICAgdG0tPnN0YXJ0LmxvdyA9IF9fVUxaUmVhZFRpbWUoKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNvbXB1dGUgdGhlIGxhcCB0aW1lIHNpbmNlIHRoZSB0aW1lciB3YXMgc3RhcnRlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9fTFpUaW1lckxhcCh0bSkgICAgICAgIChfX1VMWlJlYWRUaW1lKCkgLSB0bS0+c3RhcnQubG93KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfX0xaVGltZXJPZmYodG0pICAgICAgICB0bS0+ZW5kLmxvdyA9IF9fVUxaUmVhZFRpbWUoKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfX0xaVGltZXJDb3VudCh0bSkgICh0bS0+ZW5kLmxvdyAtIHRtLT5zdGFydC5sb3cpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGVmaW5lIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBsb25nIHBlcmlvZCB0aW1lciBhcyBtaWNyb3NlY29uZHMgcGVyIHRpbWVyIHRpY2suCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBVTFpUSU1FUl9SRVNPTFVUSU9OIDEKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Db21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgZnJvbSB0aGUgQklPUyB0aW1lciB0aWNrLiBOb3RlIHRoYXQgd2UgY2hlY2sgdG8gc2VlCi13aGV0aGVyIGEgbWlkbmlnaHQgYm91bmRhcnkgaGFzIHBhc3NlZCwgYW5kIGlmIHNvIGFkanVzdCB0aGUgZmluaXNoIHRpbWUgdG8KLWFjY291bnQgZm9yIHRoaXMuIFdlIGNhbm5vdCBkZXRlY3QgaWYgbW9yZSB0aGF0IG9uZSBtaWRuaWdodCBib3VuZGFyeSBoYXMKLXBhc3NlZCwgc28gaWYgdGhpcyBoYXBwZW5zIHdlIHdpbGwgYmUgZ2VuZXJhdGluZyBlcnJvbm91cyByZXN1bHRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9fVUxaRWxhcHNlZFRpbWUodWxvbmcgc3RhcnQsdWxvbmcgZmluaXNoKQoteyByZXR1cm4gZmluaXNoIC0gc3RhcnQ7IH0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3J0dGFyZ2V0L2NwdWluZm8uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3J0dGFyZ2V0L2NwdWluZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzMmMzZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9ydHRhcmdldC9jcHVpbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBSVFRhcmdldC0zMgotKgotKiBEZXNjcmlwdGlvbjogIE1vZHVsZSB0byBpbXBsZW1lbnQgT1Mgc3BlY2lmaWMgc2VydmljZXMgdG8gbWVhc3VyZSB0aGUKLSogICAgICAgICAgICAgICBDUFUgZnJlcXVlbmN5LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGlib29sIGhhdmVQZXJmb3JtYW5jZUNvdW50ZXI7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5jcmVhc2UgdGhlIHRocmVhZCBwcmlvcml0eSB0byBtYXhpbXVtLCBpZiBwb3NzaWJsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IFNldE1heFRocmVhZFByaW9yaXR5KHZvaWQpCi17Ci0gICAgaW50ICAgICBvbGRQcmlvcml0eTsKLSAgICBIQU5ETEUgIGhUaHJlYWQgPSBHZXRDdXJyZW50VGhyZWFkKCk7Ci0KLSAgICBvbGRQcmlvcml0eSA9IEdldFRocmVhZFByaW9yaXR5KGhUaHJlYWQpOwotICAgIGlmIChvbGRQcmlvcml0eSAhPSBUSFJFQURfUFJJT1JJVFlfRVJST1JfUkVUVVJOKQotCVNldFRocmVhZFByaW9yaXR5KGhUaHJlYWQsIFRIUkVBRF9QUklPUklUWV9USU1FX0NSSVRJQ0FMKTsKLSAgICByZXR1cm4gb2xkUHJpb3JpdHk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVzdG9yZSB0aGUgb3JpZ2luYWwgdGhyZWFkIHByaW9yaXR5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIFJlc3RvcmVUaHJlYWRQcmlvcml0eSgKLSAgICBpbnQgb2xkUHJpb3JpdHkpCi17Ci0gICAgSEFORExFICBoVGhyZWFkID0gR2V0Q3VycmVudFRocmVhZCgpOwotCi0gICAgaWYgKG9sZFByaW9yaXR5ICE9IFRIUkVBRF9QUklPUklUWV9FUlJPUl9SRVRVUk4pCi0JU2V0VGhyZWFkUHJpb3JpdHkoaFRocmVhZCwgb2xkUHJpb3JpdHkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgZnJlcXVlbmN5IG9mIHRoZSBjb3VudGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEdldENvdW50ZXJGcmVxdWVuY3koCi0gICAgQ1BVX2xhcmdlSW50ZWdlciAqZnJlcSkKLXsKLSAgICBpZiAoIVF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koKExBUkdFX0lOVEVHRVIqKWZyZXEpKSB7Ci0JaGF2ZVBlcmZvcm1hbmNlQ291bnRlciA9IGZhbHNlOwotCWZyZXEtPmxvdyA9IDEwMDAwMDsKLQlmcmVxLT5oaWdoID0gMDsKLQl9Ci0gICAgZWxzZQotCWhhdmVQZXJmb3JtYW5jZUNvdW50ZXIgPSB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgY291bnRlciB2YWx1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEdldENvdW50ZXIodCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGhhdmVQZXJmb3JtYW5jZUNvdW50ZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoKExBUkdFX0lOVEVHRVIqKXQpOyAgICAgICAgIFwKLSAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkodCktPmxvdyA9IHRpbWVHZXRUaW1lKCkgKiAxMDA7ICAgICAgICAgICAgICAgICAgICAgXAotCSh0KS0+aGlnaCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3J0dGFyZ2V0L2V2ZW50LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9ydHRhcmdldC9ldmVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjJhMTRhLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3J0dGFyZ2V0L2V2ZW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIFJUVGFyZ2V0LTMyCi0qCi0qIERlc2NyaXB0aW9uOiAgV2luMzIgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBTY2lUZWNoIGNyb3NzIHBsYXRmb3JtCi0qICAgICAgICAgICAgICAgZXZlbnQgbGlicmFyeS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1c2hvcnQgICBrZXlVcE1zZ1syNTZdID0gezB9OyAgICAvKiBUYWJsZSBvZiBrZXkgdXAgbWVzc2FnZXMgICAgICovCi1zdGF0aWMgaW50ICAgICAgcmFuZ2VYLHJhbmdlWTsgICAgICAgICAgLyogUmFuZ2Ugb2YgbW91c2UgY29vcmRpbmF0ZXMgICAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBUaGVzZSBhcmUgbm90IHVzZWQgdW5kZXIgV2luMzIgKi8KLSNkZWZpbmUgX0VWVF9kaXNhYmxlSW50KCkgICAgICAgMQotI2RlZmluZSBfRVZUX3Jlc3RvcmVJbnQoZmxhZ3MpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc2NhbkNvZGUgICAgLSBTY2FuIGNvZGUgdG8gdGVzdAotCi1SRU1BUktTOgotVGhpcyBtYWNybyBkZXRlcm1pbmVzIGlmIGEgc3BlY2lmaWVkIGtleSBpcyBjdXJyZW50bHkgZG93biBhdCB0aGUKLXRpbWUgdGhhdCB0aGUgY2FsbCBpcyBtYWRlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX0VWVF9pc0tleURvd24oc2NhbkNvZGUpICAgIChrZXlVcE1zZ1tzY2FuQ29kZV0gIT0gMCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBudW1iZXIgb2YgdGlja3Mgc2luY2Ugc3lzdGVtCi1zdGFydHVwIGluIG1pbGxpc2Vjb25kcy4gVGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgdmFsdWUgdGhhdCBpcyBwbGFjZWQgaW50bwotdGhlIHRpbWUgc3RhbXAgZmllbGRzIG9mIGV2ZW50cywgYW5kIGlzIHVzZWQgdG8gaW1wbGVtZW50IGF1dG8gbW91c2UgZG93bgotZXZlbnRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9FVlRfZ2V0VGlja3Modm9pZCkKLXsgcmV0dXJuIHRpbWVHZXRUaW1lKCk7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1QdW1wcyBhbGwgbWVzc2FnZXMgaW4gdGhlIG1lc3NhZ2UgcXVldWUgZnJvbSBXaW4zMiBpbnRvIG91ciBldmVudCBxdWV1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9FVlRfcHVtcE1lc3NhZ2VzKHZvaWQpCi17Ci0gICAgTVNHICAgICBtc2c7Ci0gICAgTVNHICAgICBjaGFyTXNnOwotICAgIGV2ZW50X3QgZXZ0OwotCi0gICAgd2hpbGUgKFBlZWtNZXNzYWdlKCZtc2csTlVMTCwwLDAsUE1fUkVNT1ZFKSkgewotCW1lbXNldCgmZXZ0LDAsc2l6ZW9mKGV2dCkpOwotCXN3aXRjaCAobXNnLm1lc3NhZ2UpIHsKLQkgICAgY2FzZSBXTV9NT1VTRU1PVkU6Ci0JCWV2dC53aGF0ID0gRVZUX01PVVNFTU9WRTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgV01fTEJVVFRPTkRCTENMSzoKLQkJZXZ0LndoYXQgPSBFVlRfTU9VU0VET1dOOwotCQlldnQubWVzc2FnZSA9IEVWVF9MRUZUQk1BU0sgfCBFVlRfREJMQ0xJQ0s7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFdNX0xCVVRUT05ET1dOOgotCQlldnQud2hhdCA9IEVWVF9NT1VTRURPV047Ci0JCWV2dC5tZXNzYWdlID0gRVZUX0xFRlRCTUFTSzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgV01fTEJVVFRPTlVQOgotCQlldnQud2hhdCA9IEVWVF9NT1VTRVVQOwotCQlldnQubWVzc2FnZSA9IEVWVF9MRUZUQk1BU0s7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFdNX1JCVVRUT05EQkxDTEs6Ci0JCWV2dC53aGF0ID0gRVZUX01PVVNFRE9XTiB8IEVWVF9EQkxDTElDSzsKLQkJZXZ0Lm1lc3NhZ2UgPSBFVlRfUklHSFRCTUFTSzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgV01fUkJVVFRPTkRPV046Ci0JCWV2dC53aGF0ID0gRVZUX01PVVNFRE9XTjsKLQkJZXZ0Lm1lc3NhZ2UgPSBFVlRfUklHSFRCTUFTSzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgV01fUkJVVFRPTlVQOgotCQlldnQud2hhdCA9IEVWVF9NT1VTRVVQOwotCQlldnQubWVzc2FnZSA9IEVWVF9SSUdIVEJNQVNLOwotCQlicmVhazsKLQkgICAgY2FzZSBXTV9LRVlET1dOOgotCSAgICBjYXNlIFdNX1NZU0tFWURPV046Ci0JCWlmIChISVdPUkQobXNnLmxQYXJhbSkgJiBLRl9SRVBFQVQpIHsKLQkJICAgIGV2dC53aGF0ID0gRVZUX0tFWVJFUEVBVDsKLQkJICAgIH0KLQkJZWxzZSB7Ci0JCSAgICBldnQud2hhdCA9IEVWVF9LRVlET1dOOwotCQkgICAgfQotCQlicmVhazsKLQkgICAgY2FzZSBXTV9LRVlVUDoKLQkgICAgY2FzZSBXTV9TWVNLRVlVUDoKLQkJZXZ0LndoYXQgPSBFVlRfS0VZVVA7Ci0JCWJyZWFrOwotCSAgICB9Ci0KLQkvKiBDb252ZXJ0IG1vdXNlIGV2ZW50IG1vZGlmaWVyIGZsYWdzICovCi0JaWYgKGV2dC53aGF0ICYgRVZUX01PVVNFRVZUKSB7Ci0JICAgIGV2dC53aGVyZV94ID0gbXNnLnB0Lng7Ci0JICAgIGV2dC53aGVyZV95ID0gbXNnLnB0Lnk7Ci0JICAgIGlmIChldnQud2hhdCA9PSBFVlRfTU9VU0VNT1ZFKSB7Ci0JCWlmIChvbGRNb3ZlICE9IC0xKSB7Ci0JCSAgICBldnRxW29sZE1vdmVdLndoZXJlX3ggPSBldnQud2hlcmVfeDsvKiBNb2RpZnkgZXhpc3Rpbmcgb25lICAqLwotCQkgICAgZXZ0cVtvbGRNb3ZlXS53aGVyZV95ID0gZXZ0LndoZXJlX3k7Ci0JCSAgICBldnQud2hhdCA9IDA7Ci0JCSAgICB9Ci0JCWVsc2UgewotCQkgICAgb2xkTW92ZSA9IGZyZWVIZWFkOyAvKiBTYXZlIGlkIG9mIHRoaXMgbW92ZSBldmVudCAgICovCi0JCSAgICB9Ci0JCX0KLQkgICAgZWxzZQotCQlvbGRNb3ZlID0gLTE7Ci0JICAgIGlmIChtc2cud1BhcmFtICYgTUtfTEJVVFRPTikKLQkJZXZ0Lm1vZGlmaWVycyB8PSBFVlRfTEVGVEJVVDsKLQkgICAgaWYgKG1zZy53UGFyYW0gJiBNS19SQlVUVE9OKQotCQlldnQubW9kaWZpZXJzIHw9IEVWVF9SSUdIVEJVVDsKLQkgICAgaWYgKG1zZy53UGFyYW0gJiBNS19TSElGVCkKLQkJZXZ0Lm1vZGlmaWVycyB8PSBFVlRfU0hJRlRLRVk7Ci0JICAgIGlmIChtc2cud1BhcmFtICYgTUtfQ09OVFJPTCkKLQkJZXZ0Lm1vZGlmaWVycyB8PSBFVlRfQ1RSTFNUQVRFOwotCSAgICB9Ci0KLQkvKiBDb252ZXJ0IGtleWJvYXJkIGNvZGVzICovCi0JVHJhbnNsYXRlTWVzc2FnZSgmbXNnKTsKLQlpZiAoZXZ0LndoYXQgJiBFVlRfS0VZRVZUKSB7Ci0JICAgIGludCBzY2FuQ29kZSA9IChtc2cubFBhcmFtID4+IDE2KSAmIDB4RkY7Ci0JICAgIGlmIChldnQud2hhdCA9PSBFVlRfS0VZVVApIHsKLQkJLyogR2V0IG1lc3NhZ2UgZm9yIGtleXVwIGNvZGUgZnJvbSB0YWJsZSBvZiBjYWNoZWQgZG93biB2YWx1ZXMgKi8KLQkJZXZ0Lm1lc3NhZ2UgPSBrZXlVcE1zZ1tzY2FuQ29kZV07Ci0JCWtleVVwTXNnW3NjYW5Db2RlXSA9IDA7Ci0JCX0KLQkgICAgZWxzZSB7Ci0JCWlmIChQZWVrTWVzc2FnZSgmY2hhck1zZyxOVUxMLFdNX0NIQVIsV01fQ0hBUixQTV9SRU1PVkUpKQotCQkgICAgZXZ0Lm1lc3NhZ2UgPSBjaGFyTXNnLndQYXJhbTsKLQkJaWYgKFBlZWtNZXNzYWdlKCZjaGFyTXNnLE5VTEwsV01fU1lTQ0hBUixXTV9TWVNDSEFSLFBNX1JFTU9WRSkpCi0JCSAgICBldnQubWVzc2FnZSA9IGNoYXJNc2cud1BhcmFtOwotCQlldnQubWVzc2FnZSB8PSAoKG1zZy5sUGFyYW0gPj4gOCkgJiAweEZGMDApOwotCQlrZXlVcE1zZ1tzY2FuQ29kZV0gPSAodXNob3J0KWV2dC5tZXNzYWdlOwotCQl9Ci0JICAgIGlmIChldnQud2hhdCA9PSBFVlRfS0VZUkVQRUFUKQotCQlldnQubWVzc2FnZSB8PSAobXNnLmxQYXJhbSA8PCAxNik7Ci0JICAgIGlmIChISVdPUkQobXNnLmxQYXJhbSkgJiBLRl9BTFRET1dOKQotCQlldnQubW9kaWZpZXJzIHw9IEVWVF9BTFRTVEFURTsKLQkgICAgaWYgKEdldEtleVN0YXRlKFZLX1NISUZUKSAmIDB4ODAwMFUpCi0JCWV2dC5tb2RpZmllcnMgfD0gRVZUX1NISUZUS0VZOwotCSAgICBpZiAoR2V0S2V5U3RhdGUoVktfQ09OVFJPTCkgJiAweDgwMDBVKQotCQlldnQubW9kaWZpZXJzIHw9IEVWVF9DVFJMU1RBVEU7Ci0JICAgIG9sZE1vdmUgPSAtMTsKLQkgICAgfQotCi0JaWYgKGV2dC53aGF0ICE9IDApIHsKLQkgICAgLyogQWRkIHRpbWUgc3RhbXAgYW5kIGFkZCB0aGUgZXZlbnQgdG8gdGhlIHF1ZXVlICovCi0JICAgIGV2dC53aGVuID0gbXNnLnRpbWU7Ci0JICAgIGlmIChjb3VudCA8IEVWRU5UUVNJWkUpIHsKLQkJYWRkRXZlbnQoJmV2dCk7Ci0JCX0KLQkgICAgfQotCURpc3BhdGNoTWVzc2FnZSgmbXNnKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBtYWNyby9mdW5jdGlvbiBpcyB1c2VkIHRvIGNvbnZlcnRzIHRoZSBzY2FuIGNvZGVzIHJlcG9ydGVkIGJ5IHRoZQota2V5Ym9hcmQgdG8gb3VyIGV2ZW50IGxpYnJhcmllcyBub3JtYWxpc2VkIGZvcm1hdC4gV2Ugb25seSBoYXZlIG9uZSBzY2FuCi1jb2RlIGZvciB0aGUgJ0EnIGtleSwgYW5kIHVzZSBzaGlmdCBtb2RpZmllcnMgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEKLUN0cmwtRjEsIEFsdC1GMSBldGMuIFRoZSByYXcgc2NhbiBjb2RlcyBmcm9tIHRoZSBrZXlib2FyZCB3b3JrIHRoaXMgd2F5LAotYnV0IHRoZSBPUyBnaXZlcyB1cyAnY29va2VkJyBzY2FuIGNvZGVzLCB3ZSBoYXZlIHRvIHRyYW5zbGF0ZSB0aGVtIGJhY2sKLXRvIHRoZSByYXcgZm9ybWF0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX0VWVF9tYXNrS2V5Q29kZShldnQpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2FmZWx5IGFib3J0IHRoZSBldmVudCBtb2R1bGUgdXBvbiBjYXRjaGluZyBhIGZhdGFsIGVycm9yLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0VWVF9hYm9ydCgpCi17Ci0gICAgRVZUX2V4aXQoKTsKLSAgICBQTV9mYXRhbEVycm9yKCJVbmhhbmRsZWQgZXhjZXB0aW9uISIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW1vdXNlTW92ZSAgIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuZXZlIHRoZSBtb3VzZSBuZWVkcyB0byBiZSBtb3ZlZAotCi1SRU1BUktTOgotSW5pdGlsaWFzZSB0aGUgZXZlbnQgaGFuZGxpbmcgbW9kdWxlLiBIZXJlIHdlIGluc3RhbGwgb3VyIG1vdXNlIGhhbmRsaW5nIElTUgotdG8gYmUgY2FsbGVkIHdoZW5ldmVyIGFueSBidXR0b24ncyBhcmUgcHJlc3NlZCBvciByZWxlYXNlZC4gV2UgYWxzbyBidWlsZAotdGhlIGZyZWUgbGlzdCBvZiBldmVudHMgaW4gdGhlIGV2ZW50IHF1ZXVlLgotCi1XZSB1c2UgaGFuZGxlciBudW1iZXIgMiBvZiB0aGUgbW91c2UgbGlicmFyaWVzIGludGVycnVwdCBoYW5kbGVycyBmb3Igb3VyCi1ldmVudCBoYW5kbGluZyByb3V0aW5lcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfaW5pdCgKLSAgICBfRVZUX21vdXNlTW92ZUhhbmRsZXIgbW91c2VNb3ZlKQotewotICAgIC8qIEluaXRpYWxpc2UgdGhlIGV2ZW50IHF1ZXVlICovCi0gICAgX21vdXNlTW92ZSA9IG1vdXNlTW92ZTsKLSAgICBpbml0RXZlbnRRdWV1ZSgpOwotICAgIG1lbXNldChrZXlVcE1zZywwLHNpemVvZihrZXlVcE1zZykpOwotCi0gICAgLyogQ2F0Y2ggcHJvZ3JhbSB0ZXJtaW5hdGlvbiBzaWduYWxzIHNvIHdlIGNhbiBjbGVhbiB1cCBwcm9wZXJseSAqLwotICAgIHNpZ25hbChTSUdBQlJULCBfRVZUX2Fib3J0KTsKLSAgICBzaWduYWwoU0lHRlBFLCBfRVZUX2Fib3J0KTsKLSAgICBzaWduYWwoU0lHSU5ULCBfRVZUX2Fib3J0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLUNoYW5nZXMgdGhlIHJhbmdlIG9mIGNvb3JkaW5hdGVzIHJldHVybmVkIGJ5IHRoZSBtb3VzZSBmdW5jdGlvbnMgdG8gdGhlCi1zcGVjaWZpZWQgcmFuZ2Ugb2YgdmFsdWVzLiBUaGlzIGlzIHVzZWQgd2hlbiBjaGFuZ2luZyBiZXR3ZWVuIGdyYXBoaWNzCi1tb2RlcyBzZXQgdGhlIHJhbmdlIG9mIG1vdXNlIGNvb3JkaW5hdGVzIGZvciB0aGUgbmV3IGRpc3BsYXkgbW9kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfc2V0TW91c2VSYW5nZSgKLSAgICBpbnQgeFJlcywKLSAgICBpbnQgeVJlcykKLXsKLSAgICByYW5nZVggPSB4UmVzOwotICAgIHJhbmdlWSA9IHlSZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1Nb2RpZmVzIHRoZSBtb3VzZSBjb29yZGluYXRlcyBhcyBuZWNlc3NhcnkgaWYgc2NhbGluZyB0byBPUyBjb29yZGluYXRlcywKLWFuZCBzZXRzIHRoZSBPUyBtb3VzZSBjdXJzb3IgcG9zaXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfRVZUX3NldE1vdXNlUG9zKAotICAgIGludCAqeCwKLSAgICBpbnQgKnkpCi17Ci0gICAgU2V0Q3Vyc29yUG9zKCp4LCp5KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFpbGlzZXMgdGhlIGludGVybmFsIGV2ZW50IGhhbmRsaW5nIG1vZHVsZXMuIFRoZSBFVlRfc3VzcGVuZCBmdW5jdGlvbgotY2FuIGJlIGNhbGxlZCB0byBzdXNwZW5kIGV2ZW50IGhhbmRsaW5nIChzdWNoIGFzIHdoZW4gc2hlbGxpbmcgb3V0IHRvIERPUyksCi1hbmQgdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgaXQgYWdhaW4gbGF0ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfcmVzdW1lKHZvaWQpCi17Ci0gICAgLyogRG8gbm90aGluZyBmb3IgV2luMzIgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLVN1c3BlbmRzIGFsbCBvZiBvdXIgZXZlbnQgaGFuZGxpbmcgb3BlcmF0aW9ucy4gVGhpcyBpcyBhbHNvIHVzZWQgdG8KLWRlLWluc3RhbGwgdGhlIGV2ZW50IGhhbmRsaW5nIGNvZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfc3VzcGVuZCh2b2lkKQotewotICAgIC8qIERvIG5vdGhpbmcgZm9yIFdpbjMyICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1FeGl0cyB0aGUgZXZlbnQgbW9kdWxlIGZvciBwcm9ncmFtIHRlcm1pbmF0YXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfZXhpdCh2b2lkKQotewotICAgIC8qIFJlc3RvcmUgc2lnbmFsIGhhbmRsZXJzICovCi0gICAgc2lnbmFsKFNJR0FCUlQsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdGUEUsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdJTlQsIFNJR19ERkwpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcnR0YXJnZXQvb3NoZHIuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3J0dGFyZ2V0L29zaGRyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNTJkYWQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vcnR0YXJnZXQvb3NoZHIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIFJUVGFyZ2V0LTMyCi0qCi0qIERlc2NyaXB0aW9uOiAgSW5jbHVkZSBmaWxlIHRvIGluY2x1ZGUgYWxsIE9TIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2RlZmluZSBTVFJJQ1QKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8bW1zeXN0ZW0uaD4KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3J0dGFyZ2V0L3BtLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9ydHRhcmdldC9wbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2Q3ZWQ2Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3J0dGFyZ2V0L3BtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgUlRUYXJnZXQtMzIKLSoKLSogRGVzY3JpcHRpb246ICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeSwgd2hpY2gKLSogICAgICAgICAgICAgICBjb250YWlucyBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IE9TIHNwZWNpZmljIHNlcnZpY2VzIGluIGEKLSogICAgICAgICAgICAgICBnZW5lcmljLCBjcm9zcyBwbGF0Zm9ybSBBUEkuIFBvcnRpbmcgdGhlIE9TIFBvcnRhYmlsaXR5Ci0qICAgICAgICAgICAgICAgTWFuYWdlciBsaWJyYXJ5IGlzIHRoZSBmaXJzdCBzdGVwIHRvIHBvcnRpbmcgYW55IFNjaVRlY2gKLSogICAgICAgICAgICAgICBwcm9kdWN0cyB0byBhIG5ldyBwbGF0Zm9ybS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgImRydmxpYi9vcy9vcy5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSNkZWZpbmUgU1RSSUNUCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgPG1tc3lzdGVtLmg+Ci0jaWZkZWYgIF9fQk9STEFORENfXwotI3ByYWdtYSB3YXJuIC1wYXIKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdm9pZCAgICAgKFBNQVBJUCBmYXRhbEVycm9yQ2xlYW51cCkodm9pZCkgPSBOVUxMOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIE1UUlJfaW5pdCh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBQTSBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1faW5pdCh2b2lkKQotewotICAgIC8qIFRPRE86IGRPIGFueSBzcGVjaWFsIGluaXQgY29kZSBpbiBoZXJlLiAqLwotICAgIE1UUlJfaW5pdCgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0eXBlIGlkZW50aWZpZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotbG9uZyBQTUFQSSBQTV9nZXRPU1R5cGUodm9pZCkKLXsKLSAgICByZXR1cm4gX09TX1JUVEFSR0VUOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgcnVudGltZSB0eXBlIGlkZW50aWZpZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2dldE1vZGVUeXBlKHZvaWQpCi17Ci0gICAgcmV0dXJuIFBNXzM4NjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BZGQgYSBmaWxlIGRpcmVjdG9yeSBzZXBhcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZW5hbWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9iYWNrc2xhc2goCi0gICAgY2hhciAqcykKLXsKLSAgICB1aW50IHBvcyA9IHN0cmxlbihzKTsKLSAgICBpZiAoc1twb3MtMV0gIT0gJ1xcJykgewotCXNbcG9zXSA9ICdcXCc7Ci0Jc1twb3MrMV0gPSAnXDAnOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BZGQgYSB1c2VyIGRlZmluZWQgUE1fZmF0YWxFcnJvciBjbGVhbnVwIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0RmF0YWxFcnJvckNsZWFudXAoCi0gICAgdm9pZCAoUE1BUElQIGNsZWFudXApKHZvaWQpKQotewotICAgIGZhdGFsRXJyb3JDbGVhbnVwID0gY2xlYW51cDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXBvcnQgYSBmYXRhbCBlcnJvciBjb25kaXRpb24gYW5kIGhhbHQgdGhlIHByb2dyYW0uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mYXRhbEVycm9yKAotICAgIGNvbnN0IGNoYXIgKm1zZykKLXsKLSAgICBpZiAoZmF0YWxFcnJvckNsZWFudXApCi0JZmF0YWxFcnJvckNsZWFudXAoKTsKLSAgICAvKiBUT0RPOiBEaXNwbGF5IGEgZmF0YWwgZXJyb3IgbWVzc2FnZSBhbmQgZXhpdCEgKi8KLS8qICBNZXNzYWdlQm94KE5VTEwsbXNnLCJGYXRhbCBFcnJvciEiLCBNQl9JQ09ORVhDTEFNQVRJT04pOyAqLwotICAgIGV4aXQoMSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGUgdGhlIHJlYWwgbW9kZSBWRVNBIHRyYW5zZmVyIGJ1ZmZlciBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBCSU9TLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9nZXRWRVNBQnVmKAotICAgIHVpbnQgKmxlbiwKLSAgICB1aW50ICpyc2VnLAotICAgIHVpbnQgKnJvZmYpCi17Ci0gICAgLyogTm8gQklPUyBhY2Nlc3MgZm9yIHRoZSBSVFRhcmdldCAqLwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNoZWNrIGlmIGEga2V5IGhhcyBiZWVuIHByZXNzZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2tiaGl0KHZvaWQpCi17Ci0gICAgLyogVE9ETzogTmVlZCB0byBjaGVjayBpZiBhIGtleSBpcyB3YWl0aW5nIG9uIHRoZSBrZXlib2FyZCBxdWV1ZSAqLwotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVdhaXQgZm9yIGFuZCByZXR1cm4gdGhlIG5leHQga2V5cHJlc3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2dldGNoKHZvaWQpCi17Ci0gICAgLyogVE9ETzogTmVlZCB0byBvYnRhaW4gdGhlIG5leHQga2V5cHJlc3MsIGFuZCBibG9jayB1bnRpbCBvbmUgaXMgaGl0ICovCi0gICAgcmV0dXJuIDB4RDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBPUyBjb25zb2xlIGN1cnNvci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNX3NldE9TQ3Vyc29yTG9jYXRpb24oCi0gICAgaW50IHgsCi0gICAgaW50IHkpCi17Ci0gICAgLyogTm90aGluZyB0byBkbyBmb3IgUlRUYXJnZXQtMzIgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIHdpZHRoIG9mIHRoZSBPUyBjb25zb2xlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1fc2V0T1NTY3JlZW5XaWR0aCgKLSAgICBpbnQgd2lkdGgsCi0gICAgaW50IGhlaWdodCkKLXsKLSAgICAvKiBOb3RoaW5nIHRvIGRvIGZvciBSVFRhcmdldC0zMiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNldCB0aGUgcmVhbCB0aW1lIGNsb2NrIGhhbmRsZXIgKHVzZWQgZm9yIHNvZnR3YXJlIHN0ZXJlbyBtb2RlcykuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0hhbmRsZXIoCi0gICAgUE1faW50SGFuZGxlciBpaCwKLSAgICBpbnQgZnJlcXVlbmN5KQotewotICAgIC8qIE5vdCBzdXBwb3J0ZWQgZm9yIFJUVGFyZ2V0LTMyICovCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNldCB0aGUgcmVhbCB0aW1lIGNsb2NrIGZyZXF1ZW5jeSAoZm9yIHN0ZXJlbyBtb2RlcykuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KAotICAgIGludCBmcmVxdWVuY3kpCi17Ci0gICAgLyogTm90IHN1cHBvcnRlZCB1bmRlciBSVFRhcmdldC0zMiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlc3RvcmUgdGhlIG9yaWdpbmFsIHJlYWwgdGltZSBjbG9jayBoYW5kbGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZVJlYWxUaW1lQ2xvY2tIYW5kbGVyKHZvaWQpCi17Ci0gICAgLyogTm90IHN1cHBvcnRlZCB1bmRlciBSVFRhcmdldC0zMiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtIHBhdGggb3Igd29ya2luZyBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2hhciAqIFBNQVBJIFBNX2dldEN1cnJlbnRQYXRoKAotICAgIGNoYXIgKnBhdGgsCi0gICAgaW50IG1heExlbikKLXsKLSAgICByZXR1cm4gZ2V0Y3dkKHBhdGgsbWF4TGVuKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIGRyaXZlIGxldHRlciBmb3IgdGhlIGJvb3QgZHJpdmUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2hhciBQTUFQSSBQTV9nZXRCb290RHJpdmUodm9pZCkKLXsKLSAgICByZXR1cm4gJ2MnOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgcGF0aCB0byB0aGUgVkJFL0FGIGRyaXZlciBmaWxlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VkJFQUZQYXRoKHZvaWQpCi17Ci0gICAgcmV0dXJuICJjOlxcIjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIHBhdGggdG8gdGhlIE51Y2xldXMgZHJpdmVyIGZpbGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzUGF0aCh2b2lkKQotewotICAgIC8qIFRPRE86IFBvaW50IHRoaXMgYXQgdGhlIHBhdGggd2hlbiB0aGUgTnVjbGV1cyBkcml2ZXJzIHdpbGwgYmUgZm91bmQgKi8KLSAgICByZXR1cm4gImM6XFxudWNsZXVzIjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIHBhdGggdG8gdGhlIE51Y2xldXMgY29uZmlndXJhdGlvbiBmaWxlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBwYXRoWzI1Nl07Ci0gICAgc3RyY3B5KHBhdGgsUE1fZ2V0TnVjbGV1c1BhdGgoKSk7Ci0gICAgUE1fYmFja3NsYXNoKHBhdGgpOwotICAgIHN0cmNhdChwYXRoLCJjb25maWciKTsKLSAgICByZXR1cm4gcGF0aDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG1hY2hpbmUgaWYgcG9zc2libGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFVuaXF1ZUlEKHZvaWQpCi17Ci0gICAgcmV0dXJuIFBNX2dldE1hY2hpbmVOYW1lKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotR2V0IHRoZSBuYW1lIG9mIHRoZSBtYWNoaW5lIG9uIHRoZSBuZXR3b3JrLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRNYWNoaW5lTmFtZSh2b2lkKQotewotICAgIC8qIE5vdCBuZWNlc3NhcnkgZm9yIFJUVGFyZ2V0LTMyICovCi0gICAgcmV0dXJuICJVbmtub3duIjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gYSBwb2ludGVyIHRvIHRoZSByZWFsIG1vZGUgQklPUyBkYXRhIGFyZWEuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2dldEJJT1NQb2ludGVyKHZvaWQpCi17Ci0gICAgLyogTm90IHVzZWQgZm9yIFJUVGFyZ2V0LTMyICovCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIGEgcG9pbnRlciB0byAweEEwMDAwIHBoeXNpY2FsIFZHQSBncmFwaGljcyBmcmFtZWJ1ZmZlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fZ2V0QTAwMDBQb2ludGVyKHZvaWQpCi17Ci0gICAgc3RhdGljIHZvaWQgKmJhbmtQdHI7Ci0gICAgaWYgKCFiYW5rUHRyKQotCWJhbmtQdHIgPSBQTV9tYXBQaHlzaWNhbEFkZHIoMHhBMDAwMCwweEZGRkYsdHJ1ZSk7Ci0gICAgcmV0dXJuIGJhbmtQdHI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTWFwIGEgcGh5c2ljYWwgYWRkcmVzcyB0byBhIGxpbmVhciBhZGRyZXNzIGluIHRoZSBjYWxsZXJzIHByb2Nlc3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX21hcFBoeXNpY2FsQWRkcigKLSAgICB1bG9uZyBiYXNlLAotICAgIHVsb25nIGxpbWl0LAotICAgIGlib29sIGlzQ2FjaGVkKQotewotICAgIC8qIFRPRE86IE1hcCBhIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzIHRvIGEgbGluZWFyIGFkZHJlc3MgKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgcGh5c2ljYWwgYWRkcmVzcyBtYXBwaW5nIGFsbG9jYXRlZCBieSBQTV9tYXBQaHlzaWNhbEFkZHIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlUGh5c2ljYWxBZGRyKAotICAgIHZvaWQgKnB0ciwKLSAgICB1bG9uZyBsaW1pdCkKLXsKLSAgICAvKiBUT0RPOiBGcmVlIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG1hcHBpbmcgKi8KLX0KLQotdWxvbmcgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyKHZvaWQgKnApCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgZmluZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIGxpbmVhciAqLwotICAgIC8qICAgICAgIGFkZHJlc3MuICovCi0gICAgcmV0dXJuIDB4RkZGRkZGRkZVTDsKLX0KLQotdm9pZCBQTUFQSSBQTV9zbGVlcCh1bG9uZyBtaWxsaXNlY29uZHMpCi17Ci0gICAgU2xlZXAobWlsbGlzZWNvbmRzKTsKLX0KLQotaW50IFBNQVBJIFBNX2dldENPTVBvcnQoaW50IHBvcnQpCi17Ci0gICAgLyogVE9ETzogUmUtY29kZSB0aGlzIHRvIGRldGVybWluZSByZWFsIHZhbHVlcyB1c2luZyB0aGUgUGx1ZyBhbmQgUGxheSAqLwotICAgIC8qICAgICAgIG1hbmFnZXIgZm9yIHRoZSBPUy4gKi8KLSAgICBzd2l0Y2ggKHBvcnQpIHsKLQljYXNlIDA6IHJldHVybiAweDNGODsKLQljYXNlIDE6IHJldHVybiAweDJGODsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBQTUFQSSBQTV9nZXRMUFRQb3J0KGludCBwb3J0KQotewotICAgIC8qIFRPRE86IFJlLWNvZGUgdGhpcyB0byBkZXRlcm1pbmUgcmVhbCB2YWx1ZXMgdXNpbmcgdGhlIFBsdWcgYW5kIFBsYXkgKi8KLSAgICAvKiAgICAgICBtYW5hZ2VyIGZvciB0aGUgT1MuICovCi0gICAgc3dpdGNoIChwb3J0KSB7Ci0JY2FzZSAwOiByZXR1cm4gMHgzQkM7Ci0JY2FzZSAxOiByZXR1cm4gMHgzNzg7Ci0JY2FzZSAyOiByZXR1cm4gMHgyNzg7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlIGEgYmxvY2sgb2YgKHVubmFtZWQpIHNoYXJlZCBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX21hbGxvY1NoYXJlZCgKLSAgICBsb25nIHNpemUpCi17Ci0gICAgcmV0dXJuIFBNX21hbGxvYyhzaXplKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgYmxvY2sgb2Ygc2hhcmVkIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVTaGFyZWQoCi0gICAgdm9pZCAqcHRyKQotewotICAgIFBNX2ZyZWUocHRyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1NYXAgYSBsaW5lYXIgbWVtb3J5IGFkZHJlc3MgdG8gdGhlIGNhbGxpbmcgcHJvY2VzcyBhZGRyZXNzIHNwYWNlLiBUaGUKLWFkZHJlc3Mgd2lsbCBoYXZlIGJlZW4gYWxsb2NhdGVkIGluIGFub3RoZXIgcHJvY2VzcyB1c2luZyB0aGUKLVBNX21hcFBoeXNpY2FsQWRkciBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbWFwVG9Qcm9jZXNzKAotICAgIHZvaWQgKmJhc2UsCi0gICAgdWxvbmcgbGltaXQpCi17Ci0gICAgcmV0dXJuIGJhc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTWFwIGEgcmVhbCBtb2RlIHBvaW50ZXIgdG8gYSBwcm90ZWN0ZWQgbW9kZSBwb2ludGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9tYXBSZWFsUG9pbnRlcigKLSAgICB1aW50IHJfc2VnLAotICAgIHVpbnQgcl9vZmYpCi17Ci0gICAgLyogTm90IHVzZWQgZm9yIFJUVGFyZ2V0LTMyICovCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGUgYSBibG9jayBvZiByZWFsIG1vZGUgbWVtb3J5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2FsbG9jUmVhbFNlZygKLSAgICB1aW50IHNpemUsCi0gICAgdWludCAqcl9zZWcsCi0gICAgdWludCAqcl9vZmYpCi17Ci0gICAgLyogTm90IHVzZWQgZm9yIFJUVGFyZ2V0LTMyICovCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnJlZSBhIGJsb2NrIG9mIHJlYWwgbW9kZSBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlUmVhbFNlZygKLSAgICB2b2lkICptZW0pCi17Ci0gICAgLyogTm90IHVzZWQgZm9yIFJUVGFyZ2V0LTMyICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSXNzdWUgYSByZWFsIG1vZGUgaW50ZXJydXB0IChwYXJhbWV0ZXJzIGluIERQTUkgY29tcGF0aWJsZSBzdHJ1Y3R1cmUpCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBEUE1JX2ludDg2KAotICAgIGludCBpbnRubywKLSAgICBEUE1JX3JlZ3MgKnJlZ3MpCi17Ci0gICAgLyogTm90IHVzZWQgZm9yIFJUVGFyZ2V0LTMyICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSXNzdWUgYSByZWFsIG1vZGUgaW50ZXJydXB0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9pbnQ4NigKLSAgICBpbnQgaW50bm8sCi0gICAgUk1SRUdTICppbiwKLSAgICBSTVJFR1MgKm91dCkKLXsKLSAgICAvKiBOb3QgdXNlZCBmb3IgUlRUYXJnZXQtMzIgKi8KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jc3N1ZSBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2ludDg2eCgKLSAgICBpbnQgaW50bm8sCi0gICAgUk1SRUdTICppbiwKLSAgICBSTVJFR1MgKm91dCwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICAvKiBOb3QgdXNlZCBmb3IgUlRUYXJnZXQtMzIgKi8KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIGEgcmVhbCBtb2RlIGZhciBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2NhbGxSZWFsTW9kZSgKLSAgICB1aW50IHNlZywKLSAgICB1aW50IG9mZiwKLSAgICBSTVJFR1MgKmluLAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIC8qIE5vdCB1c2VkIGZvciBSVFRhcmdldC0zMiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgYW1vdW50IG9mIGF2YWlsYWJsZSBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9hdmFpbGFibGVNZW1vcnkoCi0gICAgdWxvbmcgKnBoeXNpY2FsLAotICAgIHVsb25nICp0b3RhbCkKLXsKLSAgICAvKiBUT0RPOiBGaWd1cmUgb3V0IGhvdyB0byBkZXRlcm1pbmUgdGhlIGF2YWlsYWJsZSBtZW1vcnkuIE5vdCBlbnRpcmVseSAqLwotICAgIC8qICAgICAgIGNyaXRpY2FsIHNvIHJldHVybmluZyAwIGlzIE9LLiAqLwotICAgICpwaHlzaWNhbCA9ICp0b3RhbCA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGUgYSBibG9jayBvZiBsb2NrZWQsIHBoeXNpY2FsIG1lbW9yeSBmb3IgRE1BIG9wZXJhdGlvbnMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2FsbG9jTG9ja2VkTWVtKAotICAgIHVpbnQgc2l6ZSwKLSAgICB1bG9uZyAqcGh5c0FkZHIsCi0gICAgaWJvb2wgY29udGlndW91cywKLSAgICBpYm9vbCBiZWxvdzE2TSkKLXsKLSAgICAvKiBUT0RPOiBBbGxvY2F0ZSBhIGJsb2NrIG9mIGxvY2tlZCwgcGhzeWljYWxseSBjb250aWdvdXMgbWVtb3J5IGZvciBETUEgKi8KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgYmxvY2sgb2YgbG9ja2VkIHBoeXNpY2FsIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVMb2NrZWRNZW0oCi0gICAgdm9pZCAqcCwKLSAgICB1aW50IHNpemUsCi0KLSAgICBpYm9vbCBjb250aWd1b3VzKQotewotICAgIC8qIFRPRE86IEZyZWUgYSBsb2NrZWQgbWVtb3J5IGJ1ZmZlciAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIFZCRS9Db3JlIHNvZnR3YXJlIGludGVycnVwdCB0byBjaGFuZ2UgZGlzcGxheSBiYW5rcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldEJhbmtBKAotICAgIGludCBiYW5rKQotewotICAgIC8qIE5vdCB1c2VkIGZvciBSVFRhcmdldC0zMiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIFZCRS9Db3JlIHNvZnR3YXJlIGludGVycnVwdCB0byBjaGFuZ2UgZGlzcGxheSBiYW5rcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldEJhbmtBQigKLSAgICBpbnQgYmFuaykKLXsKLSAgICAvKiBOb3QgdXNlZCBmb3IgUlRUYXJnZXQtMzIgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBWQkUvQ29yZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgdG8gY2hhbmdlIGRpc3BsYXkgc3RhcnQgYWRkcmVzcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldENSVFN0YXJ0KAotICAgIGludCB4LAotICAgIGludCB5LAotICAgIGludCB3YWl0VlJUKQotewotICAgIC8qIE5vdCB1c2VkIGZvciBSVFRhcmdldC0zMiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUV4ZWN1dGUgdGhlIFBPU1Qgb24gdGhlIHNlY29uZGFyeSBCSU9TIGZvciBhIGNvbnRyb2xsZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZG9CSU9TUE9TVCgKLSAgICB1c2hvcnQgYXhWYWwsCi0gICAgdWxvbmcgQklPU1BoeXNBZGRyLAotICAgIHZvaWQgKm1hcHBlZEJJT1MpCi17Ci0gICAgLyogTm90IHVzZWQgZm9yIFJUVGFyZ2V0LTMyICovCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1QTV9NT0RVTEUgUE1BUEkgUE1fbG9hZExpYnJhcnkoCi0gICAgY29uc3QgY2hhciAqc3pETExOYW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzIHRvIGxvYWQgc2hhcmVkIGxpYnJhcmllcyEgKi8KLSAgICAodm9pZClzekRMTE5hbWU7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRQcm9jQWRkcmVzcygKLSAgICBQTV9NT0RVTEUgaE1vZHVsZSwKLSAgICBjb25zdCBjaGFyICpzelByb2NOYW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzISAqLwotICAgICh2b2lkKWhNb2R1bGU7Ci0gICAgKHZvaWQpc3pQcm9jTmFtZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlTGlicmFyeSgKLSAgICBQTV9NT0RVTEUgaE1vZHVsZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyEgKi8KLSAgICAodm9pZCloTW9kdWxlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGZpbmQgdGhlIGZpcnN0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgUE1BUEkgUE1fZmluZEZpcnN0RmlsZSgKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICBQTV9maW5kRGF0YSAqZmluZERhdGEpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgc3RhcnQgYSBkaXJlY3RvcnkgZW51bWVyYXRpb24gc2VhcmNoICovCi0gICAgLyogICAgICAgZ2l2ZW4gdGhlIGZpbGVuYW1lICh3aXRoIHdpbGRjYXJkcykuIFRoZSBkYXRhIHNob3VsZCBiZSAqLwotICAgIC8qICAgICAgIGNvbnZlcnRlZCBhbmQgcmV0dXJuZWQgaW4gdGhlIGZpbmREYXRhIHN0YW5kYXJkIGZvcm0uICovCi0gICAgKHZvaWQpZmlsZW5hbWU7Ci0gICAgKHZvaWQpZmluZERhdGE7Ci0gICAgcmV0dXJuIFBNX0ZJTEVfSU5WQUxJRDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBmaW5kIHRoZSBuZXh0IGZpbGUgbWF0Y2hpbmcgYSBzZWFyY2ggY3JpdGVyaWEgaW4gYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZmluZE5leHRGaWxlKAotICAgIHVsb25nIGhhbmRsZSwKLSAgICBQTV9maW5kRGF0YSAqZmluZERhdGEpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgZmluZCB0aGUgbmV4dCBmaWxlIGluIGRpcmVjdG9yeSBlbnVtZXJhdGlvbiAqLwotICAgIC8qICAgICAgIHNlYXJjaCBnaXZlbiB0aGUgc2VhcmNoIGNyaXRlcmlhIGRlZmluZWQgaW4gdGhlIGNhbGwgdG8gKi8KLSAgICAvKiAgICAgICBQTV9maW5kRmlyc3RGaWxlLiBUaGUgZGF0YSBzaG91bGQgYmUgY29udmVydGVkIGFuZCByZXR1cm5lZCAqLwotICAgIC8qICAgICAgIGluIHRoZSBmaW5kRGF0YSBzdGFuZGFyZCBmb3JtLiAqLwotICAgICh2b2lkKWhhbmRsZTsKLSAgICAodm9pZClmaW5kRGF0YTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gY2xvc2UgdGhlIGZpbmQgcHJvY2VzcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZmluZENsb3NlKAotICAgIHVsb25nIGhhbmRsZSkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBjbG9zZSB0aGUgZmluZCBwcm9jZXNzLiBUaGlzIG1heSBkbyAqLwotICAgIC8qICAgICAgIG5vdGhpbmcgZm9yIHNvbWUgT1MnZXMuICovCi0gICAgKHZvaWQpaGFuZGxlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIGRyaXZlIGlzIGEgdmFsaWQgZHJpdmUgb3Igbm90LiBVbmRlciBVbml4IHRoaXMKLWZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIGZvciBhbnl0aGluZyBleGNlcHQgYSB2YWx1ZSBvZiAzIChjb25zaWRlcmVkCi10aGUgcm9vdCBkcml2ZSwgYW5kIGVxdWl2YWxlbnQgdG8gQzogZm9yIG5vbi1Vbml4IHN5c3RlbXMpLiBUaGUgZHJpdmUKLW51bWJlcmluZyBpczoKLQotICAgIDEgICAtIERyaXZlIEE6Ci0gICAgMiAgIC0gRHJpdmUgQjoKLSAgICAzICAgLSBEcml2ZSBDOgotICAgIGV0YwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZHJpdmVWYWxpZCgKLSAgICBjaGFyIGRyaXZlKQotewotICAgIGlmIChkcml2ZSA9PSAzKQotCXJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSBzcGVjaWZpZmVkIGRyaXZlLgotVW5kZXIgVW5peCB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSByZWdhcmRsZXNzCi1vZiB3aGF0IHRoZSB2YWx1ZSBvZiAnZHJpdmUnIGlzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZ2V0ZGN3ZCgKLSAgICBpbnQgZHJpdmUsCi0gICAgY2hhciAqZGlyLAotICAgIGludCBsZW4pCi17Ci0gICAgKHZvaWQpZHJpdmU7Ci0gICAgZ2V0Y3dkKGRpcixsZW4pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNoYW5nZSB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRGaWxlQXR0cigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICB1aW50IGF0dHJpYikKLXsKLSAgICAvKiBUT0RPOiBTZXQgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBmaWxlICovCi0gICAgKHZvaWQpZmlsZW5hbWU7Ci0gICAgKHZvaWQpYXR0cmliOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9ta2RpcigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICByZXR1cm4gbWtkaXIoZmlsZW5hbWUpID09IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gcmVtb3ZlIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX3JtZGlyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIHJldHVybiBybWRpcihmaWxlbmFtZSkgPT0gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3J0dGFyZ2V0L3ZmbGF0LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9ydHRhcmdldC92ZmxhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDlkZmU2Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3J0dGFyZ2V0L3ZmbGF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBSVFRhcmdldC0zMgotKgotKiBEZXNjcmlwdGlvbjogIER1bW15IG1vZHVsZTsgbm8gdmlydHVhbCBmcmFtZWJ1ZmZlciBmb3IgdGhpcyBPUwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaWZkZWYgIF9fQk9STEFORENfXwotI3ByYWdtYSB3YXJuIC1wYXIKLSNlbmRpZgotCi1pYm9vbCBQTUFQSSBWRl9hdmFpbGFibGUodm9pZCkKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgKiBQTUFQSSBWRl9pbml0KHVsb25nIGJhc2VBZGRyLGludCBiYW5rU2l6ZSxpbnQgY29kZUxlbix2b2lkICpiYW5rRnVuYykKLXsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBQTUFQSSBWRl9leGl0KHZvaWQpCi17Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9ydHRhcmdldC96dGltZXIuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3J0dGFyZ2V0L3p0aW1lci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGMxODRkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3J0dGFyZ2V0L3p0aW1lci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVsdHJhIExvbmcgUGVyaW9kIFRpbWVyCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIFJUVGFyZ2V0LTMyCi0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBaZW4gVGltZXIgZnVuY3Rpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIENQVV9sYXJnZUludGVnZXIgY291bnRGcmVxOwotc3RhdGljIGlib29sICAgICAgICAgICAgaGF2ZVBlcmZvcm1hbmNlQ291bnRlcjsKLXN0YXRpYyB1bG9uZyAgICAgICAgICAgIHN0YXJ0LGZpbmlzaDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBaZW4gVGltZXIgbW9kdWxlIGludGVybmFscy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9fWlRpbWVySW5pdCh2b2lkKQotewotI2lmZGVmICBOT19BU1NFTUJMRVIKLSAgICBoYXZlUGVyZm9ybWFuY2VDb3VudGVyID0gZmFsc2U7Ci0jZWxzZQotICAgIGhhdmVQZXJmb3JtYW5jZUNvdW50ZXIgPSBRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KChMQVJHRV9JTlRFR0VSKikmY291bnRGcmVxKTsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVN0YXJ0IHRoZSBaZW4gVGltZXIgY291bnRpbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX19MWlRpbWVyT24oCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0gICAgaWYgKGhhdmVQZXJmb3JtYW5jZUNvdW50ZXIpCi0JUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoKExBUkdFX0lOVEVHRVIqKSZ0bS0+c3RhcnQpOwotICAgIGVsc2UKLQl0bS0+c3RhcnQubG93ID0gdGltZUdldFRpbWUoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Db21wdXRlIHRoZSBsYXAgdGltZSBzaW5jZSB0aGUgdGltZXIgd2FzIHN0YXJ0ZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIF9fTFpUaW1lckxhcCgKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSAgICBDUFVfbGFyZ2VJbnRlZ2VyICAgIHRtTGFwLHRtQ291bnQ7Ci0KLSAgICBpZiAoaGF2ZVBlcmZvcm1hbmNlQ291bnRlcikgewotCVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKChMQVJHRV9JTlRFR0VSKikmdG1MYXApOwotCV9DUFVfZGlmZlRpbWU2NCgmdG0tPnN0YXJ0LCZ0bUxhcCwmdG1Db3VudCk7Ci0JcmV0dXJuIF9DUFVfY2FsY01pY3JvU2VjKCZ0bUNvdW50LGNvdW50RnJlcS5sb3cpOwotCX0KLSAgICBlbHNlIHsKLQl0bUxhcC5sb3cgPSB0aW1lR2V0VGltZSgpOwotCXJldHVybiAodG1MYXAubG93IC0gdG0tPnN0YXJ0LmxvdykgKiAxMDAwTDsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU3RvcCB0aGUgWmVuIFRpbWVyIGNvdW50aW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9fTFpUaW1lck9mZigKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSAgICBpZiAoaGF2ZVBlcmZvcm1hbmNlQ291bnRlcikKLQlRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigoTEFSR0VfSU5URUdFUiopJnRtLT5lbmQpOwotICAgIGVsc2UKLQl0bS0+ZW5kLmxvdyA9IHRpbWVHZXRUaW1lKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29tcHV0ZSB0aGUgZWxhcHNlZCB0aW1lIGluIG1pY3Jvc2Vjb25kcyBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQgdGltaW5ncy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX19MWlRpbWVyQ291bnQoCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0gICAgQ1BVX2xhcmdlSW50ZWdlciAgICB0bUNvdW50OwotCi0gICAgaWYgKGhhdmVQZXJmb3JtYW5jZUNvdW50ZXIpIHsKLQlfQ1BVX2RpZmZUaW1lNjQoJnRtLT5zdGFydCwmdG0tPmVuZCwmdG1Db3VudCk7Ci0JcmV0dXJuIF9DUFVfY2FsY01pY3JvU2VjKCZ0bUNvdW50LGNvdW50RnJlcS5sb3cpOwotCX0KLSAgICBlbHNlCi0JcmV0dXJuICh0bS0+ZW5kLmxvdyAtIHRtLT5zdGFydC5sb3cpICogMTAwMEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGVmaW5lIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBsb25nIHBlcmlvZCB0aW1lciBhcyBtaWNyb3NlY29uZHMgcGVyIHRpbWVyIHRpY2suCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBVTFpUSU1FUl9SRVNPTFVUSU9OICAgICAxMDAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCB0aGUgTG9uZyBQZXJpb2QgdGltZXIgZnJvbSB0aGUgT1MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX19VTFpSZWFkVGltZSh2b2lkKQoteyByZXR1cm4gdGltZUdldFRpbWUoKTsgfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNvbXB1dGUgdGhlIGVsYXBzZWQgdGltZSBmcm9tIHRoZSBCSU9TIHRpbWVyIHRpY2suIE5vdGUgdGhhdCB3ZSBjaGVjayB0byBzZWUKLXdoZXRoZXIgYSBtaWRuaWdodCBib3VuZGFyeSBoYXMgcGFzc2VkLCBhbmQgaWYgc28gYWRqdXN0IHRoZSBmaW5pc2ggdGltZSB0bwotYWNjb3VudCBmb3IgdGhpcy4gV2UgY2Fubm90IGRldGVjdCBpZiBtb3JlIHRoYXQgb25lIG1pZG5pZ2h0IGJvdW5kYXJ5IGhhcwotcGFzc2VkLCBzbyBpZiB0aGlzIGhhcHBlbnMgd2Ugd2lsbCBiZSBnZW5lcmF0aW5nIGVycm9ub3VzIHJlc3VsdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgX19VTFpFbGFwc2VkVGltZSh1bG9uZyBzdGFydCx1bG9uZyBmaW5pc2gpCi17IHJldHVybiBmaW5pc2ggLSBzdGFydDsgfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L19ldmVudC5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvX2V2ZW50LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE2MmIxZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvX2V2ZW50LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBNdWx0aS1wbGF0Zm9ybSBHcmFwaGljcyBMaWJyYXJ5Ci07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLTsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci07KgotOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLTsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi07KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLTsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07KgotOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyoKLTsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiBMYW5ndWFnZTogICAgODAzODYgQXNzZW1ibGVyCi07KiBFbnZpcm9ubWVudDogSUJNIFBDIChNUyBET1MpCi07KgotOyogRGVzY3JpcHRpb246IEFzc2VtYmx5IGxhbmd1YWdlIHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBldmVudCBtb2R1bGUuCi07KgotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICBpZGVhbAotCi1pbmNsdWRlICJzY2l0ZWNoLm1hYyIgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcwotCi1pZmRlZiBmbGF0bW9kZWwKLQotaGVhZGVyICBfZXZlbnQgICAgICAgICAgICAgICAgICA7IFNldCB1cCBtZW1vcnkgbW9kZWwKLQotYmVnZGF0YXNlZyAgX2V2ZW50Ci0KLSAgICBjZXh0ZXJuICBfRVZUX2Jpb3NQdHIsRFBUUgotCi0gICAgY3B1YmxpYyBfRVZUX2RhdGFTdGFydAotCi1pZmRlZiAgIFVTRV9OQVNNCi0lZGVmaW5lIEtCX0hFQUQgICAgIFdPUkQgZXNpKzAxQWggICA7IEtleWJvYXJkIGJ1ZmZlciBoZWFkIGluIEJJT1MgZGF0YSBhcmVhCi0lZGVmaW5lIEtCX1RBSUwgICAgIFdPUkQgZXNpKzAxQ2ggICA7IEtleWJvYXJkIGJ1ZmZlciB0YWlsIGluIEJJT1MgZGF0YSBhcmVhCi0lZGVmaW5lIEtCX1NUQVJUICAgIFdPUkQgZXNpKzA4MGggICA7IFN0YXJ0IG9mIGtleWJvYXJkIGJ1ZmZlciBpbiBCSU9TIGRhdGEgYXJlYQotJWRlZmluZSBLQl9FTkQgICAgICBXT1JEIGVzaSswODJoICAgOyBFbmQgb2Yga2V5Ym9hcmQgYnVmZmVyIGluIEJJT1MgZGF0YSBhcmVhCi1lbHNlCi1LQl9IRUFEICAgICBFUVUgV09SRCBlc2krMDFBaCAgICAgICA7IEtleWJvYXJkIGJ1ZmZlciBoZWFkIGluIEJJT1MgZGF0YSBhcmVhCi1LQl9UQUlMICAgICBFUVUgV09SRCBlc2krMDFDaCAgICAgICA7IEtleWJvYXJkIGJ1ZmZlciB0YWlsIGluIEJJT1MgZGF0YSBhcmVhCi1LQl9TVEFSVCAgICBFUVUgV09SRCBlc2krMDgwaCAgICAgICA7IFN0YXJ0IG9mIGtleWJvYXJkIGJ1ZmZlciBpbiBCSU9TIGRhdGEgYXJlYQotS0JfRU5EICAgICAgRVFVIFdPUkQgZXNpKzA4MmggICAgICAgOyBFbmQgb2Yga2V5Ym9hcmQgYnVmZmVyIGluIEJJT1MgZGF0YSBhcmVhCi1lbmRpZgotCi0gICAgY3B1YmxpYyBfRVZUX2RhdGFFbmQKLQotZW5kZGF0YXNlZyAgX2V2ZW50Ci0KLWJlZ2NvZGVzZWcgIF9ldmVudCAgICAgICAgICAgICAgOyBTdGFydCBvZiBjb2RlIHNlZ21lbnQKLQotICAgIGNwdWJsaWMgX0VWVF9jb2RlU3RhcnQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50IF9FVlRfZ2V0S2V5Q29kZSh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmV0dXJucyB0aGUga2V5IGNvZGUgZm9yIHRoZSBuZXh0IGF2YWlsYWJsZSBrZXkgYnkgZXh0cmFjdGluZyBpdCBmcm9tCi07IHRoZSBCSU9TIGtleWJvYXJkIGJ1ZmZlci4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfRVZUX2dldEtleUNvZGUKLQotICAgICAgICBlbnRlcl9jCi0KLSAgICAgICAgbW92ICAgICBlc2ksW19FVlRfYmlvc1B0cl0KLSAgICAgICAgeG9yICAgICBlYngsZWJ4Ci0gICAgICAgIHhvciAgICAgZWF4LGVheAotICAgICAgICBtb3YgICAgIGJ4LFtLQl9IRUFEXQotICAgICAgICBjbXAgICAgIGJ4LFtLQl9UQUlMXQotICAgICAgICBqeiAgICAgIEBARG9uZQotICAgICAgICB4b3IgICAgIGVheCxlYXgKLSAgICAgICAgbW92ICAgICBheCxbZXNpK2VieF0gICAgOyBFQVggOj0gY2hhcmFjdGVyIGZyb20ga2V5Ym9hcmQgYnVmZmVyCi0gICAgICAgIGluYyAgICAgX2J4Ci0gICAgICAgIGluYyAgICAgX2J4Ci0gICAgICAgIGNtcCAgICAgYngsW0tCX0VORF0gICAgIDsgSGl0IHRoZSBlbmQgb2YgdGhlIGtleWJvYXJkIGJ1ZmZlcj8KLSAgICAgICAgamwgICAgICBAQDEKLSAgICAgICAgbW92ICAgICBieCxbS0JfU1RBUlRdCi1AQDE6ICAgIG1vdiAgICAgW0tCX0hFQURdLGJ4ICAgIDsgVXBkYXRlIGtleWJvYXJkIGJ1ZmZlciBoZWFkIHBvaW50ZXIKLQotQEBEb25lOiBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpbnQgX0VWVF9kaXNhYmxlSW50KHZvaWQpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmV0dXJuIHByb2Nlc3NvciBpbnRlcnJ1cHQgc3RhdHVzIGFuZCBkaXNhYmxlIGludGVycnVwdHMuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX0VWVF9kaXNhYmxlSW50Ci0KLSAgICAgICAgcHVzaGYgICAgICAgICAgICAgICAgICAgOyBQdXQgZmxhZyB3b3JkIG9uIHN0YWNrCi0gICAgICAgIGNsaSAgICAgICAgICAgICAgICAgICAgIDsgRGlzYWJsZSBpbnRlcnJ1cHRzIQotICAgICAgICBwb3AgICAgIGVheCAgICAgICAgICAgICA7IGRlcG9zaXQgZmxhZyB3b3JkIGluIHJldHVybiByZWdpc3RlcgotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfRVZUX3Jlc3RvcmVJbnQoaW50IHBzKTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJlc3RvcmUgcHJvY2Vzc29yIGludGVycnVwdCBzdGF0dXMuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX0VWVF9yZXN0b3JlSW50Ci0KLSAgICAgICAgQVJHICAgICBwczpVSU5UCi0KLSAgICAgICAgcHVzaCAgICBlYnAKLSAgICAgICAgbW92ICAgICBlYnAsZXNwICAgICAgICAgOyBTZXQgdXAgc3RhY2sgZnJhbWUKLSAgICAgICAgcHVzaCAgICBbRFdPUkQgcHNdCi0gICAgICAgIHBvcGYgICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBwcm9jZXNzb3Igc3RhdHVzIChhbmQgaW50ZXJydXB0cykKLSAgICAgICAgcG9wICAgICBlYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBFVlRfcmRpbngoaW50IHBvcnQsaW50IGluZGV4KQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVhZHMgYW4gaW5kZXhlZCByZWdpc3RlciB2YWx1ZSBmcm9tIGFuIEkvTyBwb3J0LgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIEVWVF9yZGlueAotCi0gICAgICAgIEFSRyAgICAgcG9ydDpVSU5ULCBpbmRleDpVSU5UCi0KLSAgICAgICAgcHVzaCAgICBlYnAKLSAgICAgICAgbW92ICAgICBlYnAsZXNwCi0gICAgICAgIG1vdiAgICAgZWR4LFtwb3J0XQotICAgICAgICBtb3YgICAgIGFsLFtCWVRFIGluZGV4XQotICAgICAgICBvdXQgICAgIGR4LGFsCi0gICAgICAgIGluYyAgICAgZHgKLSAgICAgICAgaW4gICAgICBhbCxkeAotICAgICAgICBtb3Z6eCAgIGVheCxhbAotICAgICAgICBwb3AgICAgIGVicAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBFVlRfd3JpbngoaW50IHBvcnQsaW50IGluZGV4LGludCB2YWx1ZSkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFdyaXRlcyBhbiBpbmRleGVkIHJlZ2lzdGVyIHZhbHVlIHRvIGFuIEkvTyBwb3J0LgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIEVWVF93cmlueAotCi0gICAgICAgIEFSRyAgICAgcG9ydDpVSU5ULCBpbmRleDpVSU5ULCB2YWx1ZTpVSU5UCi0KLSAgICAgICAgcHVzaCAgICBlYnAKLSAgICAgICAgbW92ICAgICBlYnAsZXNwCi0gICAgICAgIG1vdiAgICAgZWR4LFtwb3J0XQotICAgICAgICBtb3YgICAgIGFsLFtCWVRFIGluZGV4XQotICAgICAgICBtb3YgICAgIGFoLFtCWVRFIHZhbHVlXQotICAgICAgICBvdXQgICAgIGR4LGF4Ci0gICAgICAgIHBvcCAgICAgZWJwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi0gICAgY3B1YmxpYyBfRVZUX2NvZGVFbmQKLQotZW5kY29kZXNlZyAgX2V2ZW50Ci0KLWVuZGlmCi0KLSAgICAgICAgRU5EICAgICAgICAgICAgICAgICAgICAgICAgIDsgRW5kIG9mIG1vZHVsZQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L19senRpbWVyLmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9fbHp0aW1lci5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OGVlYTYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L19senRpbWVyLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KgotOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLTsqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi07KiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLTsqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotOyoKLTsqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi07KiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotOyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi07KiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyoKLTsqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqCi07KiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogTGFuZ3VhZ2U6ICAgIE5BU00gb3IgVEFTTSBBc3NlbWJsZXIKLTsqIEVudmlyb25tZW50OiBzbXggMzIgYml0IGludGVsIENQVQotOyoKLTsqIERlc2NyaXB0aW9uOiBTTVggZG9lcyBub3Qgc3VwcG9ydCA0ODYncywgc28gdGhpcyBtb2R1bGUgaXMgbm90IG5lY2Vzc2FyeS4KLTsqCi07KiAgQWxsIHJlZ2lzdGVycyBhbmQgYWxsIGZsYWdzIGFyZSBwcmVzZXJ2ZWQgYnkgYWxsIHJvdXRpbmVzLCBleGNlcHQKLTsqICBpbnRlcnJ1cHRzIHdoaWNoIGFyZSBhbHdheXMgdHVybmVkIG9uCi07KgotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICBJREVBTAotCi1pbmNsdWRlICJzY2l0ZWNoLm1hYyIKLQotaGVhZGVyICAgICAgX2x6dGltZXIKLQotYmVnZGF0YXNlZyAgX2x6dGltZXIKLQotZW5kZGF0YXNlZyAgX2x6dGltZXIKLQotYmVnY29kZXNlZyAgX2x6dGltZXIgICAgICAgICAgICAgICAgOyBTdGFydCBvZiBjb2RlIHNlZ21lbnQKLQotY3Byb2NzdGFydCAgIExaX2Rpc2FibGUKLSAgICAgICAgY2xpCi0gICAgICAgIHJldAotY3Byb2NlbmQKLQotY3Byb2NzdGFydCAgIExaX2VuYWJsZQotICAgICAgICBzdGkKLSAgICAgICAgcmV0Ci1jcHJvY2VuZAotCi1lbmRjb2Rlc2VnICBfbHp0aW1lcgotCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L19wbS5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvX3BtLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM3Y2IyMS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvX3BtLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyoKLTsqICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi07KiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotOyogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi07KiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLTsqCi07KiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotOyogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLTsqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotOyogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsqCi07KiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KgotOyogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqIExhbmd1YWdlOiAgICA4MDM4NiBBc3NlbWJsZXIsIFRBU00gNC4wIG9yIE5BU00KLTsqIEVudmlyb25tZW50OiAzMi1iaXQgU01YIGVtYmVkZGVkIHN5c3RlbXMgZGV2ZWxvcG1lbnQKLTsqCi07KiBEZXNjcmlwdGlvbjogTG93IGxldmVsIGFzc2VtYmx5IHN1cHBvcnQgZm9yIHRoZSBQTSBsaWJyYXJ5IHNwZWNpZmljIHRvCi07KiAgICAgICAgICAgICAgU01YLgotOyoKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgSURFQUwKLQotaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICAgICAgOyBNZW1vcnkgbW9kZWwgbWFjcm9zCi0KLWhlYWRlciAgICAgIF9wbSAgICAgICAgICAgICAgICAgICAgIDsgU2V0IHVwIG1lbW9yeSBtb2RlbAotCi1iZWdkYXRhc2VnICBfcG0KLQotICAgIGNleHRlcm4gX1BNX3NhdmVkRFMsVVNIT1JUCi0KLWludGVsX2lkICAgICAgICBkYiAgIkdlbnVpbmVJbnRlbCIgIDsgSW50ZWwgdmVuZG9yIElECi0KLWVuZGRhdGFzZWcgIF9wbQotCi1iZWdjb2Rlc2VnICBfcG0gICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fc2VncmVhZChQTVNSRUdTICpzcmVncykKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJlYWQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgYWxsIHNlZ21lbnQgcmVnaXN0ZXJzCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydGRsbDE2IFBNX3NlZ3JlYWQKLQotICAgICAgICBBUkcgICAgIHNyZWdzOkRQVFIKLQotICAgICAgICBlbnRlcl9jCi0KLSAgICAgICAgbW92ICAgICBheCxlcwotICAgICAgICBfbGVzICAgIF9zaSxbc3JlZ3NdCi0gICAgICAgIG1vdiAgICAgW19FUyBfc2ldLGF4Ci0gICAgICAgIG1vdiAgICAgW19FUyBfc2krMl0sY3MKLSAgICAgICAgbW92ICAgICBbX0VTIF9zaSs0XSxzcwotICAgICAgICBtb3YgICAgIFtfRVMgX3NpKzZdLGRzCi0gICAgICAgIG1vdiAgICAgW19FUyBfc2krOF0sZnMKLSAgICAgICAgbW92ICAgICBbX0VTIF9zaSsxMF0sZ3MKLQotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07IENyZWF0ZSBhIHRhYmxlIG9mIHRoZSAyNTYgZGlmZmVyZW50IGludGVycnVwdCBjYWxscyB0aGF0IHdlIGNhbiBqdW1wCi07IGludG8KLQotaWZkZWYgICBVU0VfTkFTTQotCi0lYXNzaWduIGludG5vIDAKLQotaW50VGFibGU6Ci0lcmVwICAgIDI1NgotICAgICAgICBkYiAgICAgIDBDRGgKLSAgICAgICAgZGIgICAgICBpbnRubwotJWFzc2lnbiBpbnRubyAgIGludG5vICsgMQotICAgICAgICByZXQKLSAgICAgICAgbm9wCi0lZW5kcmVwCi0KLWVsc2UKLQotaW50bm8gPSAwCi0KLWludFRhYmxlOgotICAgICAgICBSRVBUICAgIDI1NgotICAgICAgICBkYiAgICAgIDBDRGgKLSAgICAgICAgZGIgICAgICBpbnRubwotaW50bm8gPSBpbnRubyArIDEKLSAgICAgICAgcmV0Ci0gICAgICAgIG5vcAotICAgICAgICBFTkRNCi0KLWVuZGlmCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IF9QTV9nZW5JbnQgICAgLSBHZW5lcmF0ZSB0aGUgYXBwcm9wcmlhdGUgaW50ZXJydXB0Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NuZWFyICAgX1BNX2dlbkludAotCi0gICAgICAgIHB1c2ggICAgX2F4ICAgICAgICAgICAgICAgICAgICAgOyBTYXZlIF9heAotICAgICAgICBwdXNoICAgIF9ieCAgICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBfYngKLSAgICAgICAgbW92ICAgICBlYngsW1VJTlQgZXNwKzEyXSAgICAgICA7IEVCWCA6PSBpbnRlcnJ1cHQgbnVtYmVyCi0gICAgICAgIG1vdiAgICAgX2F4LG9mZnNldCBpbnRUYWJsZSAgICAgOyBQb2ludCB0byBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiB0YWJsZQotICAgICAgICBzaGwgICAgIF9ieCwyICAgICAgICAgICAgICAgICAgIDsgX0JYIDo9IGluZGV4IGludG8gdGFibGUKLSAgICAgICAgYWRkICAgICBfYXgsX2J4ICAgICAgICAgICAgICAgICA7IF9BWCA6PSBwb2ludGVyIHRvIGludGVycnVwdCBjb2RlCi0gICAgICAgIHhjaGcgICAgZWF4LFtlc3ArNF0gICAgICAgICAgICAgOyBSZXN0b3JlIGVheCwgYW5kIHNldCBmb3IgaW50Ci0gICAgICAgIHBvcCAgICAgX2J4ICAgICAgICAgICAgICAgICAgICAgOyByZXN0b3JlIF9ieAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50IFBNX2ludDM4NngoaW50IGludG5vLCBQTVJFR1MgKmluLCBQTVJFR1MgKm91dCxQTVNSRUdTICpzcmVncykKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IElzc3VlcyBhIHNvZnR3YXJlIGludGVycnVwdCBpbiBwcm90ZWN0ZWQgbW9kZS4gVGhpcyByb3V0aW5lIGhhcyBiZWVuCi07IHdyaXR0ZW4gdG8gYWxsb3cgdXNlciBwcm9ncmFtcyB0byBsb2FkIENTIGFuZCBEUyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMKLTsgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ZGxsMTYgUE1faW50Mzg2eAotCi0gICAgICAgIEFSRyAgICAgaW50bm86VUlOVCwgaW5wdHI6RFBUUiwgb3V0cHRyOkRQVFIsIHNyZWdzOkRQVFIKLQotICAgICAgICBMT0NBTCAgIGZsYWdzOlVJTlQsIHN2X2RzOlVJTlQsIHN2X2VzaTpVTE9ORyA9IExvY2FsU2l6ZQotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgcHVzaCAgICBkcwotICAgICAgICBwdXNoICAgIGVzICAgICAgICAgICAgICAgICAgOyBTYXZlIHNlZ21lbnQgcmVnaXN0ZXJzCi0gICAgICAgIHB1c2ggICAgZnMKLSAgICAgICAgcHVzaCAgICBncwotCi0gICAgICAgIF9sZHMgICAgX3NpLFtzcmVnc10gICAgICAgICA7IERTOl9TSSAtPiBMb2FkIHNlZ21lbnQgcmVnaXN0ZXJzCi0gICAgICAgIG1vdiAgICAgZXMsW19zaV0KLSAgICAgICAgbW92ICAgICBieCxbX3NpKzZdCi0gICAgICAgIG1vdiAgICAgW3N2X2RzXSxfYnggICAgICAgICA7IFNhdmUgdmFsdWUgb2YgdXNlciBEUyBvbiBzdGFjawotICAgICAgICBtb3YgICAgIGZzLFtfc2krOF0KLSAgICAgICAgbW92ICAgICBncyxbX3NpKzEwXQotCi0gICAgICAgIF9sZHMgICAgX3NpLFtpbnB0cl0gICAgICAgICA7IExvYWQgQ1BVIHJlZ2lzdGVycwotICAgICAgICBtb3YgICAgIGVheCxbX3NpXQotICAgICAgICBtb3YgICAgIGVieCxbX3NpKzRdCi0gICAgICAgIG1vdiAgICAgZWN4LFtfc2krOF0KLSAgICAgICAgbW92ICAgICBlZHgsW19zaSsxMl0KLSAgICAgICAgbW92ICAgICBlZGksW19zaSsyMF0KLSAgICAgICAgbW92ICAgICBlc2ksW19zaSsxNl0KLQotICAgICAgICBwdXNoICAgIGRzICAgICAgICAgICAgICAgICAgOyBTYXZlIHZhbHVlIG9mIERTCi0gICAgICAgIHB1c2ggICAgX2JwICAgICAgICAgICAgICAgICA7IFNvbWUgaW50ZXJydXB0cyB0cmFzaCB0aGlzIQotICAgICAgICBjbGMgICAgICAgICAgICAgICAgICAgICAgICAgOyBHZW5lcmF0ZSB0aGUgaW50ZXJydXB0Ci0gICAgICAgIHB1c2ggICAgW1VJTlQgaW50bm9dCi0gICAgICAgIG1vdiAgICAgZHMsW1dPUkQgc3ZfZHNdICAgICA7IFNldCB2YWx1ZSBvZiB1c2VyJ3MgRFMgc2VsZWN0b3IKLSAgICAgICAgY2FsbCAgICBfUE1fZ2VuSW50Ci0gICAgICAgIHBvcCAgICAgX2JwICAgICAgICAgICAgICAgICA7IFBvcCBpbnRubyBmcm9tIHN0YWNrIChmbGFncyB1bmNoYW5nZWQpCi0gICAgICAgIHBvcCAgICAgX2JwICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgdmFsdWUgb2Ygc3RhY2sgZnJhbWUgcG9pbnRlcgotICAgICAgICBwb3AgICAgIGRzICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIHZhbHVlIG9mIERTCi0KLSAgICAgICAgcHVzaGYgICAgICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBmbGFncyBmb3IgbGF0ZXIKLSAgICAgICAgcG9wICAgICBbVUlOVCBmbGFnc10KLSAgICAgICAgcHVzaCAgICBlc2kgICAgICAgICAgICAgICAgIDsgU2F2ZSBFU0kgZm9yIGxhdGVyCi0gICAgICAgIHBvcCAgICAgW0RXT1JEIHN2X2VzaV0KLSAgICAgICAgcHVzaCAgICBkcyAgICAgICAgICAgICAgICAgIDsgU2F2ZSBEUyBmb3IgbGF0ZXIKLSAgICAgICAgcG9wICAgICBbVUlOVCBzdl9kc10KLQotICAgICAgICBfbGRzICAgIF9zaSxbb3V0cHRyXSAgICAgICAgOyBTYXZlIENQVSByZWdpc3RlcnMKLSAgICAgICAgbW92ICAgICBbX3NpXSxlYXgKLSAgICAgICAgbW92ICAgICBbX3NpKzRdLGVieAotICAgICAgICBtb3YgICAgIFtfc2krOF0sZWN4Ci0gICAgICAgIG1vdiAgICAgW19zaSsxMl0sZWR4Ci0gICAgICAgIHB1c2ggICAgW0RXT1JEIHN2X2VzaV0KLSAgICAgICAgcG9wICAgICBbRFdPUkQgX3NpKzE2XQotICAgICAgICBtb3YgICAgIFtfc2krMjBdLGVkaQotCi0gICAgICAgIG1vdiAgICAgX2J4LFtmbGFnc10gICAgICAgICA7IFJldHVybiBmbGFncwotICAgICAgICBhbmQgICAgIGVieCwxaCAgICAgICAgICAgICAgOyBJc29sYXRlIGNhcnJ5IGZsYWcKLSAgICAgICAgbW92ICAgICBbX3NpKzI0XSxlYnggICAgICAgIDsgU2F2ZSBjYXJyeSBmbGFnIHN0YXR1cwotCi0gICAgICAgIF9sZHMgICAgX3NpLFtzcmVnc10gICAgICAgICA7IFNhdmUgc2VnbWVudCByZWdpc3RlcnMKLSAgICAgICAgbW92ICAgICBbX3NpXSxlcwotICAgICAgICBtb3YgICAgIF9ieCxbc3ZfZHNdCi0gICAgICAgIG1vdiAgICAgW19zaSs2XSxieCAgICAgICAgICA7IEdldCByZXR1cm5lZCBEUyBmcm9tIHN0YWNrCi0gICAgICAgIG1vdiAgICAgW19zaSs4XSxmcwotICAgICAgICBtb3YgICAgIFtfc2krMTBdLGdzCi0KLSAgICAgICAgcG9wICAgICBncyAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBzZWdtZW50IHJlZ2lzdGVycwotICAgICAgICBwb3AgICAgIGZzCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX3NhdmVEUyh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgU2F2ZSB0aGUgdmFsdWUgb2YgRFMgaW50byBhIHNlY3Rpb24gb2YgdGhlIGNvZGUgc2VnbWVudCwgc28gdGhhdCB3ZSBjYW4KLTsgcXVpY2tseSBsb2FkIHRoaXMgdmFsdWUgYXQgYSBsYXRlciBkYXRlIGluIHRoZSBQTV9sb2FkRFMoKSByb3V0aW5lIGZyb20KLTsgaW5zaWRlIGludGVycnVwdCBoYW5kbGVycyBldGMuIFRoZSBtZXRob2QgdG8gZG8gdGhpcyBpcyBkaWZmZXJlbnQKLTsgZGVwZW5kaW5nIG9uIHRoZSBET1MgZXh0ZW5kZXIgYmVpbmcgdXNlZC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ZGxsMTYgUE1fc2F2ZURTCi0KLSAgICAgICAgbW92ICAgICBbX1BNX3NhdmVkRFNdLGRzICAgIDsgU3RvcmUgYXdheSBpbiBkYXRhIHNlZ21lbnQKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fbG9hZERTKHZvaWQpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSb3V0aW5lIHRvIGxvYWQgdGhlIERTIHJlZ2lzdGVyIHdpdGggdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBjdXJyZW50Ci07IERPUyBleHRlbmRlci4gT25seSB0aGUgRFMgcmVnaXN0ZXIgaXMgbG9hZGVkLCBub3QgdGhlIEVTIHJlZ2lzdGVyLCBzbwotOyBpZiB5b3Ugd2lzaCB0byBjYWxsIEMgY29kZSwgeW91IHdpbGwgbmVlZCB0byBhbHNvIGxvYWQgdGhlIEVTIHJlZ2lzdGVyCi07IGluIDMyIGJpdCBwcm90ZWN0ZWQgbW9kZS4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ZGxsMTYgUE1fbG9hZERTCi0KLSAgICAgICAgbW92ICAgICBkcyxbY3M6X1BNX3NhdmVkRFNdIDsgV2UgY2FuIGFjY2VzcyB0aGUgcHJvcGVyIERTIHRocm91Z2ggQ1MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fc2V0QmFua0EoaW50IGJhbmspCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgICAgIFBNX3NldEJhbmtBCi0KLSAgICAgICAgQVJHICAgICBiYW5rOlVJTlQKLQotICAgICAgICBwdXNoICAgIGVicAotICAgICAgICBtb3YgICAgIGVicCxlc3AKLSAgICAgICAgcHVzaCAgICBlYngKLSAgICAgICAgbW92ICAgICBfYngsMAotICAgICAgICBtb3YgICAgIF9heCw0RjA1aAotICAgICAgICBtb3YgICAgIF9keCxbYmFua10KLSAgICAgICAgaW50ICAgICAxMGgKLSAgICAgICAgcG9wICAgICBlYngKLSAgICAgICAgcG9wICAgICBlYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fc2V0QmFua0FCKGludCBiYW5rKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgICAgICBQTV9zZXRCYW5rQUIKLQotICAgICAgICBBUkcgICAgIGJhbms6VUlOVAotCi0gICAgICAgIHB1c2ggICAgZWJwCi0gICAgICAgIG1vdiAgICAgZWJwLGVzcAotICAgICAgICBwdXNoICAgIGVieAotICAgICAgICBtb3YgICAgIF9ieCwwCi0gICAgICAgIG1vdiAgICAgX2F4LDRGMDVoCi0gICAgICAgIG1vdiAgICAgX2R4LFtiYW5rXQotICAgICAgICBpbnQgICAgIDEwaAotICAgICAgICBtb3YgICAgIF9ieCwxCi0gICAgICAgIG1vdiAgICAgX2F4LDRGMDVoCi0gICAgICAgIG1vdiAgICAgX2R4LFtiYW5rXQotICAgICAgICBpbnQgICAgIDEwaAotICAgICAgICBwb3AgICAgIGVieAotICAgICAgICBwb3AgICAgIGVicAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBQTV9zZXRDUlRTdGFydChpbnQgeCxpbnQgeSxpbnQgd2FpdFZSVCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICAgICAgUE1fc2V0Q1JUU3RhcnQKLQotICAgICAgICBBUkcgICAgIHg6VUlOVCwgeTpVSU5ULCB3YWl0VlJUOlVJTlQKLQotICAgICAgICBwdXNoICAgIGVicAotICAgICAgICBtb3YgICAgIGVicCxlc3AKLSAgICAgICAgcHVzaCAgICBlYngKLSAgICAgICAgbW92ICAgICBfYngsW3dhaXRWUlRdCi0gICAgICAgIG1vdiAgICAgX2N4LFt4XQotICAgICAgICBtb3YgICAgIF9keCxbeV0KLSAgICAgICAgbW92ICAgICBfYXgsNEYwN2gKLSAgICAgICAgaW50ICAgICAxMGgKLSAgICAgICAgcG9wICAgICBlYngKLSAgICAgICAgcG9wICAgICBlYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBfUE1faW5wKGludCBwb3J0KQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVhZHMgYSBieXRlIGZyb20gdGhlIHNwZWNpZmllZCBwb3J0Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX2lucAotCi0gICAgICAgIEFSRyAgICAgcG9ydDpVSU5UCi0KLSAgICAgICAgcHVzaCAgICBfYnAKLSAgICAgICAgbW92ICAgICBfYnAsX3NwCi0gICAgICAgIHhvciAgICAgX2F4LF9heAotICAgICAgICBtb3YgICAgIF9keCxbcG9ydF0KLSAgICAgICAgaW4gICAgICBhbCxkeAotICAgICAgICBwb3AgICAgIF9icAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBfUE1fb3V0cChpbnQgcG9ydCxpbnQgdmFsdWUpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBXcml0ZSBhIGJ5dGUgdG8gdGhlIHNwZWNpZmllZCBwb3J0LgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV9vdXRwCi0KLSAgICAgICAgQVJHICAgICBwb3J0OlVJTlQsIHZhbHVlOlVJTlQKLQotICAgICAgICBwdXNoICAgIF9icAotICAgICAgICBtb3YgICAgIF9icCxfc3AKLSAgICAgICAgbW92ICAgICBfZHgsW3BvcnRdCi0gICAgICAgIG1vdiAgICAgX2F4LFt2YWx1ZV0KLSAgICAgICAgb3V0ICAgICBkeCxhbAotICAgICAgICBwb3AgICAgIF9icAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOyBNYWNybyB0byBkZWxheSBicmllZmx5IHRvIGVuc3VyZSB0aGF0IGVub3VnaCB0aW1lIGhhcyBlbGFwc2VkIGJldHdlZW4KLTsgc3VjY2Vzc2l2ZSBJL08gYWNjZXNzZXMgc28gdGhhdCB0aGUgZGV2aWNlIGJlaW5nIGFjY2Vzc2VkIGNhbiByZXNwb25kCi07IHRvIGJvdGggYWNjZXNzZXMgZXZlbiBvbiBhIHZlcnkgZmFzdCBQQy4KLQotaWZkZWYgICBVU0VfTkFTTQotJW1hY3JvICBERUxBWSAwCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0lZW5kbWFjcm8KLSVtYWNybyAgSU9ERUxBWU4gMQotJXJlcCAgICAlMQotICAgICAgICBERUxBWQotJWVuZHJlcAotJWVuZG1hY3JvCi1lbHNlCi1tYWNybyAgIERFTEFZCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi1lbmRtCi1tYWNybyAgIElPREVMQVlOICAgIE4KLSAgICByZXB0ICAgIE4KLSAgICAgICAgREVMQVkKLSAgICBlbmRtCi1lbmRtCi1lbmRpZgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB1Y2hhciBfUE1fcmVhZENNT1MoaW50IGluZGV4KQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVhZCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBDTU9TIHJlZ2lzdGVyLiBXZSBkbyB0aGlzIHdpdGggYm90aAotOyBub3JtYWwgaW50ZXJydXB0cyBhbmQgTk1JIGRpc2FibGVkLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV9yZWFkQ01PUwotCi0gICAgICAgIEFSRyAgICAgaW5kZXg6VUlOVAotCi0gICAgICAgIHB1c2ggICAgX2JwCi0gICAgICAgIG1vdiAgICAgX2JwLF9zcAotICAgICAgICBwdXNoZmQKLSAgICAgICAgbW92ICAgICBhbCxbQllURSBpbmRleF0KLSAgICAgICAgb3IgICAgICBhbCw4MGggICAgICAgICAgICAgIDsgQWRkIGRpc2FibGUgTk1JIGZsYWcKLSAgICAgICAgY2xpCi0gICAgICAgIG91dCAgICAgNzBoLGFsCi0gICAgICAgIElPREVMQVlOIDUKLSAgICAgICAgaW4gICAgICBhbCw3MWgKLSAgICAgICAgbW92ICAgICBhaCxhbAotICAgICAgICB4b3IgICAgIGFsLGFsCi0gICAgICAgIElPREVMQVlOIDUKLSAgICAgICAgb3V0ICAgICA3MGgsYWwgICAgICAgICAgICAgIDsgUmUtZW5hYmxlIE5NSQotICAgICAgICBzdGkKLSAgICAgICAgbW92ICAgICBhbCxhaCAgICAgICAgICAgICAgIDsgUmV0dXJuIHZhbHVlIGluIEFMCi0gICAgICAgIHBvcGZkCi0gICAgICAgIHBvcCAgICAgX2JwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9QTV93cml0ZUNNT1MoaW50IGluZGV4LHVjaGFyIHZhbHVlKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVhZCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBDTU9TIHJlZ2lzdGVyLiBXZSBkbyB0aGlzIHdpdGggYm90aAotOyBub3JtYWwgaW50ZXJydXB0cyBhbmQgTk1JIGRpc2FibGVkLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV93cml0ZUNNT1MKLQotICAgICAgICBBUkcgICAgIGluZGV4OlVJTlQsIHZhbHVlOlVDSEFSCi0KLSAgICAgICAgcHVzaCAgICBfYnAKLSAgICAgICAgbW92ICAgICBfYnAsX3NwCi0gICAgICAgIHB1c2hmZAotICAgICAgICBtb3YgICAgIGFsLFtCWVRFIGluZGV4XQotICAgICAgICBvciAgICAgIGFsLDgwaCAgICAgICAgICAgICAgOyBBZGQgZGlzYWJsZSBOTUkgZmxhZwotICAgICAgICBjbGkKLSAgICAgICAgb3V0ICAgICA3MGgsYWwKLSAgICAgICAgSU9ERUxBWU4gNQotICAgICAgICBtb3YgICAgIGFsLFt2YWx1ZV0KLSAgICAgICAgb3V0ICAgICA3MWgsYWwKLSAgICAgICAgeG9yICAgICBhbCxhbAotICAgICAgICBJT0RFTEFZTiA1Ci0gICAgICAgIG91dCAgICAgNzBoLGFsICAgICAgICAgICAgICA7IFJlLWVuYWJsZSBOTUkKLSAgICAgICAgc3RpCi0gICAgICAgIHBvcGZkCi0gICAgICAgIHBvcCAgICAgX2JwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBfUE1fZ2V0UERCIC0gUmV0dXJuIHRoZSBQYWdlIFRhYmxlIERpcmVjdG9yeSBCYXNlIGFkZHJlc3MKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fZ2V0UERCCi0KLSAgICAgICAgbW92ICAgICBlYXgsY3IzCi0gICAgICAgIGFuZCAgICAgZWF4LDBGRkZGRjAwMGgKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IF9QTV9mbHVzaFRMQiAtIEZsdXNoIHRoZSBUcmFuc2xhdGlvbiBMb29rYXNpZGUgYnVmZmVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUE1fZmx1c2hUTEIKLQotICAgICAgICB3YmludmQgICAgICAgICAgICAgICAgICA7IEZsdXNoIHRoZSBDUFUgY2FjaGUKLSAgICAgICAgbW92ICAgICBlYXgsY3IzICAgICAgICAgCi0gICAgICAgIG1vdiAgICAgY3IzLGVheCAgICAgICAgIDsgRmx1c2ggdGhlIFRMQgotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotZW5kY29kZXNlZyAgX3BtCi0KLSAgICAgICAgRU5EICAgICAgICAgICAgICAgICAgICAgOyBFbmQgb2YgbW9kdWxlCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvX3Btc214LmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9fcG1zbXguYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzUyY2UzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9fcG1zbXguYXNtCisrKyAvZGV2L251bGwKQEAgLTEsOTMzICswLDAgQEAKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KgotOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLTsqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi07KiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLTsqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotOyoKLTsqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi07KiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotOyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi07KiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyoKLTsqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqCi07KiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogTGFuZ3VhZ2U6ICAgIDgwMzg2IEFzc2VtYmxlciwgVEFTTSA0LjAgb3IgTkFTTQotOyogRW52aXJvbm1lbnQ6IDMyLWJpdCBTTVggZW1iZWRkZWQgc3lzdGVtcyBkZXZlbG9wbWVudAotOyoKLTsqIERlc2NyaXB0aW9uOiBMb3cgbGV2ZWwgYXNzZW1ibHkgc3VwcG9ydCBmb3IgdGhlIFBNIGxpYnJhcnkgc3BlY2lmaWMgdG8KLTsqICAgICAgICAgICAgICBTTVggaW50ZXJydXB0IGhhbmRsaW5nLgotOyoKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgSURFQUwKLQotaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKLQotaGVhZGVyICAgICAgX3Btc214ICAgICAgICAgICAgICA7IFNldCB1cCBtZW1vcnkgbW9kZWwKLQotOyBEZWZpbmUgdGhlIHNpemUgb2Ygb3VyIGxvY2FsIHN0YWNrcy4gRm9yIHJlYWwgbW9kZSBjb2RlIHRoZXkgY2FudCBiZQotOyB0aGF0IGJpZywgYnV0IGZvciAzMiBiaXQgcHJvdGVjdGVkIG1vZGUgY29kZSB3ZSBjYW4gbWFrZSB0aGVtIG5pY2UgYW5kCi07IGxhcmdlIHNvIHRoYXQgY29tcGxleCBDIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZC4KLQotTU9VU0VfU1RBQ0sgRVFVIDQwOTYKLVRJTUVSX1NUQUNLIEVRVSA0MDk2Ci1LRVlfU1RBQ0sgICBFUVUgMTAyNAotSU5UMTBfU1RBQ0sgRVFVIDEwMjQKLQotaWZkZWYgICBVU0VfTkFTTQotCi07IE1hY3JvIHRvIGxvYWQgRFMgYW5kIEVTIHJlZ2lzdGVycyB3aXRoIGNvcnJlY3QgdmFsdWUuCi0KLSVpbWFjcm8gICBMT0FEX0RTIDAKLSAgICAgICAgbW92ICAgICBkcyxbY3M6X1BNX3NhdmVkRFNdCi0gICAgICAgIG1vdiAgICAgZXMsW2NzOl9QTV9zYXZlZERTXQotJWVuZG1hY3JvCi0KLTsgTm90ZSB0aGF0IGludGVycnVwdHMgd2UgZGlzYWJsZSBpbnRlcnJ1cHRzIGR1cmluZyB0aGUgZm9sbG93aW5nIHN0YWNrCi07ICVpbWFjcm8gZm9yIGNvcnJlY3Qgb3BlcmF0aW9uLCBidXQgd2UgZG8gbm90IGVuYWJsZSB0aGVtIGFnYWluLiBOb3JtYWxseQotOyB0aGVzZSAlaW1hY3JvcyBhcmUgdXNlZCB3aXRoaW4gaW50ZXJydXB0IGhhbmRsZXJzIHNvIGludGVycnVwdHMgc2hvdWxkCi07IGFscmVhZHkgYmUgb2ZmLiBXZSB0dXJuIHRoZW0gYmFjayBvbiBleHBsaWNpdGx5IGxhdGVyIGlmIHRoZSB1c2VyIGNvZGUKLTsgbmVlZHMgdGhlbSB0byBiZSBiYWNrIG9uLgotCi07IE1hY3JvIHRvIHN3aXRjaCB0byBhIG5ldyBsb2NhbCBzdGFjay4KLQotJWltYWNybyBORVdTVEsgIDEKLSAgICAgICAgY2xpCi0gICAgICAgIG1vdiAgICAgW3NlZ18lMV0sc3MKLSAgICAgICAgbW92ICAgICBbcHRyXyUxXSxfc3AKLSAgICAgICAgbW92ICAgICBbVGVtcFNlZ10sZHMKLSAgICAgICAgbW92ICAgICBzcyxbVGVtcFNlZ10KLSAgICAgICAgbW92ICAgICBfc3Asb2Zmc2V0ICUxCi0lZW5kbWFjcm8KLQotOyAlaW1hY3JvIHRvIHN3aXRjaCBiYWNrIHRvIHRoZSBvbGQgc3RhY2suCi0KLSVpbWFjcm8gICBSRVNUU1RLICAgMQotICAgICAgICBjbGkKLSAgICAgICAgbW92ICAgICBzcyxbc2VnXyUxXQotICAgICAgICBtb3YgICAgIF9zcCxbcHRyXyUxXQotJWVuZG1hY3JvCi0KLTsgJWltYWNybyB0byBzd2FwIHRoZSBjdXJyZW50IHN0YWNrIHdpdGggdGhlIG9uZSBzYXZlZCBhd2F5LgotCi0laW1hY3JvIFNXQVBTVEsgMQotICAgICAgICBjbGkKLSAgICAgICAgbW92ICAgICBheCxzcwotICAgICAgICB4Y2hnICAgIGF4LFtzZWdfJTFdCi0gICAgICAgIG1vdiAgICAgc3MsYXgKLSAgICAgICAgeGNoZyAgICBfc3AsW3B0cl8lMV0KLSVlbmRtYWNybwotCi1lbHNlCi0KLTsgTWFjcm8gdG8gbG9hZCBEUyBhbmQgRVMgcmVnaXN0ZXJzIHdpdGggY29ycmVjdCB2YWx1ZS4KLQotTUFDUk8gICBMT0FEX0RTCi0gICAgICAgIG1vdiAgICAgZHMsW2NzOl9QTV9zYXZlZERTXQotICAgICAgICBtb3YgICAgIGVzLFtjczpfUE1fc2F2ZWREU10KLUVORE0KLQotOyBOb3RlIHRoYXQgaW50ZXJydXB0cyB3ZSBkaXNhYmxlIGludGVycnVwdHMgZHVyaW5nIHRoZSBmb2xsb3dpbmcgc3RhY2sKLTsgbWFjcm8gZm9yIGNvcnJlY3Qgb3BlcmF0aW9uLCBidXQgd2UgZG8gbm90IGVuYWJsZSB0aGVtIGFnYWluLiBOb3JtYWxseQotOyB0aGVzZSBtYWNyb3MgYXJlIHVzZWQgd2l0aGluIGludGVycnVwdCBoYW5kbGVycyBzbyBpbnRlcnJ1cHRzIHNob3VsZAotOyBhbHJlYWR5IGJlIG9mZi4gV2UgdHVybiB0aGVtIGJhY2sgb24gZXhwbGljaXRseSBsYXRlciBpZiB0aGUgdXNlciBjb2RlCi07IG5lZWRzIHRoZW0gdG8gYmUgYmFjayBvbi4KLQotOyBNYWNybyB0byBzd2l0Y2ggdG8gYSBuZXcgbG9jYWwgc3RhY2suCi0KLU1BQ1JPICAgTkVXU1RLICBzdGtuYW1lCi0gICAgICAgIGNsaQotICAgICAgICBtb3YgICAgIFtzZWdfJnN0a25hbWUmXSxzcwotICAgICAgICBtb3YgICAgIFtwdHJfJnN0a25hbWUmXSxfc3AKLSAgICAgICAgbW92ICAgICBbVGVtcFNlZ10sZHMKLSAgICAgICAgbW92ICAgICBzcyxbVGVtcFNlZ10KLSAgICAgICAgbW92ICAgICBfc3Asb2Zmc2V0IHN0a25hbWUKLUVORE0KLQotOyBNYWNybyB0byBzd2l0Y2ggYmFjayB0byB0aGUgb2xkIHN0YWNrLgotCi1NQUNSTyAgIFJFU1RTVEsgc3RrbmFtZQotICAgICAgICBjbGkKLSAgICAgICAgbW92ICAgICBzcyxbc2VnXyZzdGtuYW1lJl0KLSAgICAgICAgbW92ICAgICBfc3AsW3B0cl8mc3RrbmFtZSZdCi1FTkRNCi0KLTsgTWFjcm8gdG8gc3dhcCB0aGUgY3VycmVudCBzdGFjayB3aXRoIHRoZSBvbmUgc2F2ZWQgYXdheS4KLQotTUFDUk8gICBTV0FQU1RLIHN0a25hbWUKLSAgICAgICAgY2xpCi0gICAgICAgIG1vdiAgICAgYXgsc3MKLSAgICAgICAgeGNoZyAgICBheCxbc2VnXyZzdGtuYW1lJl0KLSAgICAgICAgbW92ICAgICBzcyxheAotICAgICAgICB4Y2hnICAgIF9zcCxbcHRyXyZzdGtuYW1lJl0KLUVORE0KLQotZW5kaWYKLQotYmVnZGF0YXNlZyAgX3Btc214Ci0KLSAgICBjZXh0ZXJuIF9QTV9zYXZlZERTLFVTSE9SVAotICAgIGNleHRlcm4gX1BNX2NyaXRIYW5kbGVyLENQVFIKLSAgICBjZXh0ZXJuIF9QTV9icmVha0hhbmRsZXIsQ1BUUgotICAgIGNleHRlcm4gX1BNX3RpbWVySGFuZGxlcixDUFRSCi0gICAgY2V4dGVybiBfUE1fcnRjSGFuZGxlcixDUFRSCi0gICAgY2V4dGVybiBfUE1fa2V5SGFuZGxlcixDUFRSCi0gICAgY2V4dGVybiBfUE1fa2V5MTVIYW5kbGVyLENQVFIKLSAgICBjZXh0ZXJuIF9QTV9tb3VzZUhhbmRsZXIsQ1BUUgotICAgIGNleHRlcm4gX1BNX2ludDEwSGFuZGxlcixDUFRSCi0KLSAgICBjZXh0ZXJuIF9QTV9jdHJsQ1B0cixEUFRSCi0gICAgY2V4dGVybiBfUE1fY3RybEJQdHIsRFBUUgotICAgIGNleHRlcm4gX1BNX2NyaXRQdHIsRFBUUgotCi0gICAgY2V4dGVybiBfUE1fcHJldlRpbWVyLEZDUFRSCi0gICAgY2V4dGVybiBfUE1fcHJldlJUQyxGQ1BUUgotICAgIGNleHRlcm4gX1BNX3ByZXZLZXksRkNQVFIKLSAgICBjZXh0ZXJuIF9QTV9wcmV2S2V5MTUsRkNQVFIKLSAgICBjZXh0ZXJuIF9QTV9wcmV2QnJlYWssRkNQVFIKLSAgICBjZXh0ZXJuIF9QTV9wcmV2Q3RybEMsRkNQVFIKLSAgICBjZXh0ZXJuIF9QTV9wcmV2Q3JpdGljYWwsRkNQVFIKLSAgICBjZXh0ZXJuIF9QTV9wcmV2UmVhbFRpbWVyLFVMT05HCi0gICAgY2V4dGVybiBfUE1fcHJldlJlYWxSVEMsVUxPTkcKLSAgICBjZXh0ZXJuIF9QTV9wcmV2UmVhbEtleSxVTE9ORwotICAgIGNleHRlcm4gX1BNX3ByZXZSZWFsS2V5MTUsVUxPTkcKLSAgICBjZXh0ZXJuIF9QTV9wcmV2UmVhbEludDEwLFVMT05HCi0KLWNwdWJsaWMgX1BNX3Btc214RGF0YVN0YXJ0Ci0KLTsgQWxsb2NhdGUgc3BhY2UgZm9yIGFsbCBvZiB0aGUgbG9jYWwgc3RhY2tzIHRoYXQgd2UgbmVlZC4gVGhlc2Ugc3RhY2tzCi07IGFyZSBub3QgdmVyeSBsYXJnZSwgYnV0IHNob3VsZCBiZSBsYXJnZSBlbm91Z2ggZm9yIG1vc3QgcHVycG9zZXMKLTsgKGdlbmVyYWxseSB5b3Ugd2FudCB0byBoYW5kbGUgdGhlc2UgaW50ZXJydXB0cyBxdWlja2x5LCBzaW1wbHkgc3RvcmluZwotOyB0aGUgaW5mb3JtYXRpb24gZm9yIGxhdGVyIGFuZCB0aGVuIHJldHVybmluZykuIElmIHlvdSBuZWVkIGJpZ2dlcgotOyBzdGFja3MgdGhlbiBjaGFuZ2UgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGluIGhlcmUuCi0KLSAgICAgICAgICAgIEFMSUdOICAgNAotICAgICAgICAgICAgZGNsYiBNT1VTRV9TVEFDSyAgICA7IFNwYWNlIGZvciBsb2NhbCBzdGFjayAoc21hbGwpCi1Nc1N0YWNrOiAgICAgICAgICAgICAgICAgICAgICAgIDsgU3RhY2sgc3RhcnRzIGF0IGVuZCEKLXB0cl9Nc1N0YWNrIERVSU5UICAgMCAgICAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgb2Zmc2V0Ci1zZWdfTXNTdGFjayBkdyAgICAgIDAgICAgICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIHNlZ21lbnQKLQotICAgICAgICAgICAgQUxJR04gICA0Ci0gICAgICAgICAgICBkY2xiIElOVDEwX1NUQUNLICAgIDsgU3BhY2UgZm9yIGxvY2FsIHN0YWNrIChzbWFsbCkKLUludDEwU3RhY2s6ICAgICAgICAgICAgICAgICAgICAgOyBTdGFjayBzdGFydHMgYXQgZW5kIQotcHRyX0ludDEwU3RhY2sgIERVSU5UICAgMCAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBvZmZzZXQKLXNlZ19JbnQxMFN0YWNrICBkdyAgICAgIDAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgc2VnbWVudAotCi0gICAgICAgICAgICBBTElHTiAgIDQKLSAgICAgICAgICAgIGRjbGIgVElNRVJfU1RBQ0sgICAgOyBTcGFjZSBmb3IgbG9jYWwgc3RhY2sgKHNtYWxsKQotVG1TdGFjazogICAgICAgICAgICAgICAgICAgICAgICA7IFN0YWNrIHN0YXJ0cyBhdCBlbmQhCi1wdHJfVG1TdGFjayBEVUlOVCAgIDAgICAgICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIG9mZnNldAotc2VnX1RtU3RhY2sgZHcgICAgICAwICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBzZWdtZW50Ci0KLSAgICAgICAgICAgIEFMSUdOICAgNAotICAgICAgICAgICAgZGNsYiBUSU1FUl9TVEFDSyAgICA7IFNwYWNlIGZvciBsb2NhbCBzdGFjayAoc21hbGwpCi1SdGNTdGFjazogICAgICAgICAgICAgICAgICAgICAgIDsgU3RhY2sgc3RhcnRzIGF0IGVuZCEKLXB0cl9SdGNTdGFjayBEVUlOVCAgMCAgICAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgb2Zmc2V0Ci1zZWdfUnRjU3RhY2sgZHcgICAgIDAgICAgICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIHNlZ21lbnQKLVJ0Y0luc2lkZSAgIGR3ICAgICAgMCAgICAgICAgICAgOyBBcmUgd2Ugc3RpbGwgaGFuZGxpbmcgY3VycmVudCBpbnRlcnJ1cHQKLQotICAgICAgICAgICAgQUxJR04gICA0Ci0gICAgICAgICAgICBkY2xiIEtFWV9TVEFDSyAgICAgIDsgU3BhY2UgZm9yIGxvY2FsIHN0YWNrIChzbWFsbCkKLUt5U3RhY2s6ICAgICAgICAgICAgICAgICAgICAgICAgOyBTdGFjayBzdGFydHMgYXQgZW5kIQotcHRyX0t5U3RhY2sgRFVJTlQgICAwICAgICAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBvZmZzZXQKLXNlZ19LeVN0YWNrIGR3ICAgICAgMCAgICAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBvbGQgc3RhY2sgc2VnbWVudAotS3lJbnNpZGUgICAgZHcgICAgICAwICAgICAgICAgICA7IEFyZSB3ZSBzdGlsbCBoYW5kbGluZyBjdXJyZW50IGludGVycnVwdAotCi0gICAgICAgICAgICBBTElHTiAgIDQKLSAgICAgICAgICAgIGRjbGIgS0VZX1NUQUNLICAgICAgOyBTcGFjZSBmb3IgbG9jYWwgc3RhY2sgKHNtYWxsKQotS3kxNVN0YWNrOiAgICAgICAgICAgICAgICAgICAgICA7IFN0YWNrIHN0YXJ0cyBhdCBlbmQhCi1wdHJfS3kxNVN0YWNrICAgRFVJTlQgICAwICAgICAgIDsgUGxhY2UgdG8gc3RvcmUgb2xkIHN0YWNrIG9mZnNldAotc2VnX0t5MTVTdGFjayAgIGR3ICAgICAgMCAgICAgICA7IFBsYWNlIHRvIHN0b3JlIG9sZCBzdGFjayBzZWdtZW50Ci0KLVRlbXBTZWcgICAgIGR3ICAgICAgMCAgICAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBzdGFjayBzZWdtZW50Ci0KLWNwdWJsaWMgX1BNX3Btc214RGF0YUVuZAotCi1lbmRkYXRhc2VnICBfcG1zbXgKLQotYmVnY29kZXNlZyAgX3Btc214ICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGNvZGUgc2VnbWVudAotCi1jcHVibGljIF9QTV9wbXNteENvZGVTdGFydAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQTV9tb3VzZUlTUiAtIE1vdXNlIGludGVycnVwdCBzdWJyb3V0aW5lIGRpc3BhdGNoZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEludGVycnVwdCBzdWJyb3V0aW5lIGNhbGxlZCBieSB0aGUgbW91c2UgZHJpdmVyIHVwb24gaW50ZXJydXB0cywgdG8KLTsgZGlzcGF0Y2ggY29udHJvbCB0byBoaWdoIGxldmVsIEMgYmFzZWQgc3Vicm91dGluZXMuIEludGVycnVwdHMgYXJlIG9uCi07IHdoZW4gd2UgY2FsbCB0aGUgdXNlciBjb2RlLgotOwotOyBJdCBpcyBfZXh0cmVtZWx5XyBpbXBvcnRhbnQgdG8gc2F2ZSB0aGUgc3RhdGUgb2YgdGhlIGV4dGVuZGVkIHJlZ2lzdGVycwotOyBhcyB0aGVzZSBtYXkgd2VsbCBiZSB0cmFzaGVkIGJ5IHRoZSByb3V0aW5lcyBjYWxsZWQgZnJvbSBoZXJlIGFuZCBub3QKLTsgcmVzdG9yZWQgY29ycmVjdGx5IGJ5IHRoZSBtb3VzZSBpbnRlcmZhY2UgbW9kdWxlLgotOwotOyBOT1RFOiBUaGlzIHJvdXRpbmUgc3dpdGNoZXMgdG8gYSBsb2NhbCBzdGFjayBiZWZvcmUgY2FsbGluZyBhbnkgQyBjb2RlLAotOyAgICAgICBhbmQgaGVuY2UgaXMgX25vdF8gcmUtZW50cmFudC4gRm9yIG1vdXNlIGhhbmRsZXJzIHRoaXMgaXMgbm90IGEKLTsgICAgICAgcHJvYmxlbSwgYXMgdGhlIG1vdXNlIGRyaXZlciBhcmJpdHJhdGVzIGNhbGxzIHRvIHRoZSB1c2VyIG1vdXNlCi07ICAgICAgIGhhbmRsZXIgZm9yIHVzLgotOwotOyBFbnRyeTogICAgQVggIC0gQ29uZGl0aW9uIG1hc2sgZ2l2aW5nIHJlYXNvbiBmb3IgY2FsbAotOyAgICAgICAgICAgQlggIC0gTW91c2UgYnV0dG9uIHN0YXRlCi07ICAgICAgICAgICBDWCAgLSBIb3Jpem9udGFsIGN1cnNvciBjb29yZGluYXRlCi07ICAgICAgICAgICBEWCAgLSBWZXJ0aWNhbCBjdXJzb3IgY29vcmRpbmF0ZQotOyAgICAgICAgICAgU0kgIC0gSG9yaXpvbnRhbCBtaWNrZXkgdmFsdWUKLTsgICAgICAgICAgIERJICAtIFZlcnRpY2FsIG1pY2tleSB2YWx1ZQotOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jZmFyICAgIF9QTV9tb3VzZUlTUgotCi0gICAgICAgIHB1c2ggICAgZHMgICAgICAgICAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBEUwotICAgICAgICBwdXNoICAgIGVzCi0gICAgICAgIHB1c2hhZCAgICAgICAgICAgICAgICAgIDsgU2F2ZSBfYWxsXyBleHRlbmRlZCByZWdpc3RlcnMKLSAgICAgICAgY2xkICAgICAgICAgICAgICAgICAgICAgOyBDbGVhciBkaXJlY3Rpb24gZmxhZwotCi0gICAgICAgIExPQURfRFMgICAgICAgICAgICAgICAgIDsgTG9hZCBEUyByZWdpc3RlcgotICAgICAgICBORVdTVEsgIE1zU3RhY2sgICAgICAgICA7IFN3aXRjaCB0byBsb2NhbCBzdGFjawotCi07IENhbGwgdGhlIGluc3RhbGxlZCBoaWdoIGxldmVsIEMgY29kZSByb3V0aW5lCi0KLSAgICAgICAgY2xyaGkgICBkeCAgICAgICAgICAgICAgOyBDbGVhciBvdXQgaGlnaCBvcmRlciB2YWx1ZXMKLSAgICAgICAgY2xyaGkgICBjeAotICAgICAgICBjbHJoaSAgIGJ4Ci0gICAgICAgIGNscmhpICAgYXgKLSAgICAgICAgc2duaGkgICBzaQotICAgICAgICBzZ25oaSAgIGRpCi0KLSAgICAgICAgcHVzaCAgICBfZGkKLSAgICAgICAgcHVzaCAgICBfc2kKLSAgICAgICAgcHVzaCAgICBfZHgKLSAgICAgICAgcHVzaCAgICBfY3gKLSAgICAgICAgcHVzaCAgICBfYngKLSAgICAgICAgcHVzaCAgICBfYXgKLSAgICAgICAgc3RpICAgICAgICAgICAgICAgICAgICAgOyBFbmFibGUgaW50ZXJydXB0cwotICAgICAgICBjYWxsICAgIFtDUFRSIF9QTV9tb3VzZUhhbmRsZXJdCi0gICAgICAgIF9hZGQgICAgc3AsMTIsMjQKLQotICAgICAgICBSRVNUU1RLIE1zU3RhY2sgICAgICAgICA7IFJlc3RvcmUgcHJldmlvdXMgc3RhY2sKLQotICAgICAgICBwb3BhZCAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgYWxsIGV4dGVuZGVkIHJlZ2lzdGVycwotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgcmV0ICAgICAgICAgICAgICAgICAgICAgOyBXZSBhcmUgZG9uZSEhCi0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFBNX3RpbWVySVNSIC0gVGltZXIgaW50ZXJydXB0IHN1YnJvdXRpbmUgZGlzcGF0Y2hlcgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSB0aW1lciBpbnRlcnJ1cHQsIHRvIGRpc3BhdGNoIGNvbnRyb2wKLTsgdG8gaGlnaCBsZXZlbCBDIGJhc2VkIHN1YnJvdXRpbmVzLiBXZSBzYXZlIHRoZSBzdGF0ZSBvZiBhbGwgcmVnaXN0ZXJzCi07IGluIHRoaXMgcm91dGluZSwgYW5kIHN3aXRjaCB0byBhIGxvY2FsIHN0YWNrLiBJbnRlcnJ1cHRzIGFyZSAqb2ZmKgotOyB3aGVuIHdlIGNhbGwgdGhlIHVzZXIgY29kZS4KLTsKLTsgTk9URTogVGhpcyByb3V0aW5lIHN3aXRjaGVzIHRvIGEgbG9jYWwgc3RhY2sgYmVmb3JlIGNhbGxpbmcgYW55IEMgY29kZSwKLTsgICAgICAgYW5kIGhlbmNlIGlzIF9ub3RfIHJlLWVudHJhbnQuIE1ha2Ugc3VyZSB5b3VyIEMgY29kZSBleGVjdXRlcyBhcwotOyAgICAgICBxdWlja2x5IGFzIHBvc3NpYmxlLCBzaW5jZSBhIHRpbWVyIG92ZXJydW4gd2lsbCBzaW1wbHkgaGFuZyB0aGUKLTsgICAgICAgc3lzdGVtLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jZmFyICAgIF9QTV90aW1lcklTUgotCi0gICAgICAgIHB1c2ggICAgZHMgICAgICAgICAgICAgIDsgU2F2ZSB2YWx1ZSBvZiBEUwotICAgICAgICBwdXNoICAgIGVzCi0gICAgICAgIHB1c2hhZCAgICAgICAgICAgICAgICAgIDsgU2F2ZSBfYWxsXyBleHRlbmRlZCByZWdpc3RlcnMKLSAgICAgICAgY2xkICAgICAgICAgICAgICAgICAgICAgOyBDbGVhciBkaXJlY3Rpb24gZmxhZwotCi0gICAgICAgIExPQURfRFMgICAgICAgICAgICAgICAgIDsgTG9hZCBEUyByZWdpc3RlcgotCi0gICAgICAgIE5FV1NUSyAgVG1TdGFjayAgICAgICAgIDsgU3dpdGNoIHRvIGxvY2FsIHN0YWNrCi0gICAgICAgIGNhbGwgICAgW0NQVFIgX1BNX3RpbWVySGFuZGxlcl0KLSAgICAgICAgUkVTVFNUSyBUbVN0YWNrICAgICAgICAgOyBSZXN0b3JlIHByZXZpb3VzIHN0YWNrCi0KLSAgICAgICAgcG9wYWQgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIGFsbCBleHRlbmRlZCByZWdpc3RlcnMKLSAgICAgICAgcG9wICAgICBlcwotICAgICAgICBwb3AgICAgIGRzCi0gICAgICAgIGlyZXQgICAgICAgICAgICAgICAgICAgIDsgUmV0dXJuIGZyb20gaW50ZXJydXB0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFBNX2NoYWluUHJldlRpbWVyIC0gQ2hhaW4gdG8gcHJldmlvdXMgdGltZXIgaW50ZXJydXB0IGFuZCByZXR1cm4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENoYWlucyB0byB0aGUgcHJldmlvdXMgdGltZXIgaW50ZXJydXB0IHJvdXRpbmUgYW5kIHJldHVybnMgY29udHJvbAotOyBiYWNrIHRvIHRoZSBoaWdoIGxldmVsIGludGVycnVwdCBoYW5kbGVyLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX2NoYWluUHJldlRpbWVyCi0KLWlmZGVmICAgVE5UCi0gICAgICAgIHB1c2ggICAgZWF4Ci0gICAgICAgIHB1c2ggICAgZWJ4Ci0gICAgICAgIHB1c2ggICAgZWN4Ci0gICAgICAgIHB1c2hmZCAgICAgICAgICAgICAgICAgIDsgUHVzaCBmbGFncyBvbiBzdGFjayB0byBzaW11bGF0ZSBpbnRlcnJ1cHQKLSAgICAgICAgbW92ICAgICBheCwyNTBFaCAgICAgICAgOyBDYWxsIHJlYWwgbW9kZSBwcm9jZWR1cmUgZnVuY3Rpb24KLSAgICAgICAgbW92ICAgICBlYngsW19QTV9wcmV2UmVhbFRpbWVyXQotICAgICAgICBtb3YgICAgIGVjeCwxICAgICAgICAgICA7IENvcHkgcmVhbCBtb2RlIGZsYWdzIHRvIHJlYWwgbW9kZSBzdGFjawotICAgICAgICBpbnQgICAgIDIxaCAgICAgICAgICAgICA7IENhbGwgdGhlIHJlYWwgbW9kZSBjb2RlCi0gICAgICAgIHBvcGZkCi0gICAgICAgIHBvcCAgICAgZWN4Ci0gICAgICAgIHBvcCAgICAgZWJ4Ci0gICAgICAgIHBvcCAgICAgZWF4Ci0gICAgICAgIHJldAotZWxzZQotICAgICAgICBTV0FQU1RLIFRtU3RhY2sgICAgICAgICA7IFN3YXAgYmFjayB0byBwcmV2aW91cyBzdGFjawotICAgICAgICBwdXNoZiAgICAgICAgICAgICAgICAgICA7IFNhdmUgc3RhdGUgb2YgaW50ZXJydXB0IGZsYWcKLSAgICAgICAgcHVzaGYgICAgICAgICAgICAgICAgICAgOyBQdXNoIGZsYWdzIG9uIHN0YWNrIHRvIHNpbXVsYXRlIGludGVycnVwdAotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBjYWxsIGZhciBkd29yZCBbX1BNX3ByZXZUaW1lcl0KLWVsc2UKLSAgICAgICAgY2FsbCAgICBbX1BNX3ByZXZUaW1lcl0KLWVuZGlmCi0gICAgICAgIHBvcGYgICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBzdGF0ZSBvZiBpbnRlcnJ1cHQgZmxhZwotICAgICAgICBTV0FQU1RLIFRtU3RhY2sgICAgICAgICA7IFN3YXAgYmFjayB0byBDIHN0YWNrIGFnYWluCi0gICAgICAgIHJldAotZW5kaWYKLQotY3Byb2NlbmQKLQotOyBNYWNybyB0byBkZWxheSBicmllZmx5IHRvIGVuc3VyZSB0aGF0IGVub3VnaCB0aW1lIGhhcyBlbGFwc2VkIGJldHdlZW4KLTsgc3VjY2Vzc2l2ZSBJL08gYWNjZXNzZXMgc28gdGhhdCB0aGUgZGV2aWNlIGJlaW5nIGFjY2Vzc2VkIGNhbiByZXNwb25kCi07IHRvIGJvdGggYWNjZXNzZXMgZXZlbiBvbiBhIHZlcnkgZmFzdCBQQy4KLQotaWZkZWYgICBVU0VfTkFTTQotJW1hY3JvICBERUxBWSAwCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0lZW5kbWFjcm8KLSVtYWNybyAgSU9ERUxBWU4gMQotJXJlcCAgICAlMQotICAgICAgICBERUxBWQotJWVuZHJlcAotJWVuZG1hY3JvCi1lbHNlCi1tYWNybyAgIERFTEFZCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi0gICAgICAgIGptcCAgICAgc2hvcnQgJCsyCi1lbmRtCi1tYWNybyAgIElPREVMQVlOICAgIE4KLSAgICByZXB0ICAgIE4KLSAgICAgICAgREVMQVkKLSAgICBlbmRtCi1lbmRtCi1lbmRpZgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQTV9ydGNJU1IgLSBSZWFsIHRpbWUgY2xvY2sgaW50ZXJydXB0IHN1YnJvdXRpbmUgZGlzcGF0Y2hlcgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSB0aW1lciBpbnRlcnJ1cHQsIHRvIGRpc3BhdGNoIGNvbnRyb2wKLTsgdG8gaGlnaCBsZXZlbCBDIGJhc2VkIHN1YnJvdXRpbmVzLiBXZSBzYXZlIHRoZSBzdGF0ZSBvZiBhbGwgcmVnaXN0ZXJzCi07IGluIHRoaXMgcm91dGluZSwgYW5kIHN3aXRjaCB0byBhIGxvY2FsIHN0YWNrLiBJbnRlcnJ1cHRzIGFyZSAqb2ZmKgotOyB3aGVuIHdlIGNhbGwgdGhlIHVzZXIgY29kZS4KLTsKLTsgTk9URTogVGhpcyByb3V0aW5lIHN3aXRjaGVzIHRvIGEgbG9jYWwgc3RhY2sgYmVmb3JlIGNhbGxpbmcgYW55IEMgY29kZSwKLTsgICAgICAgYW5kIGhlbmNlIGlzIF9ub3RfIHJlLWVudHJhbnQuIE1ha2Ugc3VyZSB5b3VyIEMgY29kZSBleGVjdXRlcyBhcwotOyAgICAgICBxdWlja2x5IGFzIHBvc3NpYmxlLCBzaW5jZSBhIHRpbWVyIG92ZXJydW4gd2lsbCBzaW1wbHkgaGFuZyB0aGUKLTsgICAgICAgc3lzdGVtLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jZmFyICAgIF9QTV9ydGNJU1IKLQotICAgICAgICBwdXNoICAgIGRzICAgICAgICAgICAgICAgICAgOyBTYXZlIHZhbHVlIG9mIERTCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgcHVzaGFkICAgICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBfYWxsXyBleHRlbmRlZCByZWdpc3RlcnMKLSAgICAgICAgY2xkICAgICAgICAgICAgICAgICAgICAgICAgIDsgQ2xlYXIgZGlyZWN0aW9uIGZsYWcKLQotOyBDbGVhciBwcmlvcml0eSBpbnRlcnJ1cHQgY29udHJvbGxlciBhbmQgcmUtZW5hYmxlIGludGVycnVwdHMgc28gd2UKLTsgZG9udCBsb2NrIHRoaW5ncyB1cCBmb3IgbG9uZy4KLQotICAgICAgICBtb3YgICAgIGFsLDIwaAotICAgICAgICBvdXQgICAgIDBBMGgsYWwKLSAgICAgICAgb3V0ICAgICAwMjBoLGFsCi0KLTsgQ2xlYXIgcmVhbC10aW1lIGNsb2NrIHRpbWVvdXQKLQotICAgICAgICBpbiAgICAgIGFsLDcwaCAgICAgICAgICAgICAgOyBSZWFkIENNT1MgaW5kZXggcmVnaXN0ZXIKLSAgICAgICAgcHVzaCAgICBfYXggICAgICAgICAgICAgICAgIDsgIGFuZCBzYXZlIGZvciBsYXRlcgotICAgICAgICBJT0RFTEFZTiAzCi0gICAgICAgIG1vdiAgICAgYWwsMENoCi0gICAgICAgIG91dCAgICAgNzBoLGFsCi0gICAgICAgIElPREVMQVlOIDUKLSAgICAgICAgaW4gICAgICBhbCw3MWgKLQotOyBDYWxsIHRoZSBDIGludGVycnVwdCBoYW5kbGVyIGZ1bmN0aW9uCi0KLSAgICAgICAgTE9BRF9EUyAgICAgICAgICAgICAgICAgICAgIDsgTG9hZCBEUyByZWdpc3RlcgotICAgICAgICBjbXAgICAgIFtCWVRFIFJ0Y0luc2lkZV0sMSAgOyBDaGVjayBmb3IgbXV0dWFsIGV4Y2x1c2lvbgotICAgICAgICBqZSAgICAgIEBARXhpdAotICAgICAgICBtb3YgICAgIFtCWVRFIFJ0Y0luc2lkZV0sMQotICAgICAgICBzdGkgICAgICAgICAgICAgICAgICAgICAgICAgOyBSZS1lbmFibGUgaW50ZXJydXB0cwotICAgICAgICBORVdTVEsgIFJ0Y1N0YWNrICAgICAgICAgICAgOyBTd2l0Y2ggdG8gbG9jYWwgc3RhY2sKLSAgICAgICAgY2FsbCAgICBbQ1BUUiBfUE1fcnRjSGFuZGxlcl0KLSAgICAgICAgUkVTVFNUSyBSdGNTdGFjayAgICAgICAgICAgIDsgUmVzdG9yZSBwcmV2aW91cyBzdGFjawotICAgICAgICBtb3YgICAgIFtCWVRFIFJ0Y0luc2lkZV0sMAotCi1AQEV4aXQ6IHBvcCAgICAgX2F4Ci0gICAgICAgIG91dCAgICAgNzBoLGFsICAgICAgICAgICAgICA7IFJlc3RvcmUgQ01PUyBpbmRleCByZWdpc3RlcgotICAgICAgICBwb3BhZCAgICAgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIGFsbCBleHRlbmRlZCByZWdpc3RlcnMKLSAgICAgICAgcG9wICAgICBlcwotICAgICAgICBwb3AgICAgIGRzCi0gICAgICAgIGlyZXQgICAgICAgICAgICAgICAgICAgICAgICA7IFJldHVybiBmcm9tIGludGVycnVwdAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQTV9rZXlJU1IgLSBrZXlib2FyZCBpbnRlcnJ1cHQgc3Vicm91dGluZSBkaXNwYXRjaGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBIYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIGtleWJvYXJkIGludGVycnVwdCwgdG8gZGlzcGF0Y2ggY29udHJvbAotOyB0byBoaWdoIGxldmVsIEMgYmFzZWQgc3Vicm91dGluZXMuIFdlIHNhdmUgdGhlIHN0YXRlIG9mIGFsbCByZWdpc3RlcnMKLTsgaW4gdGhpcyByb3V0aW5lLCBhbmQgc3dpdGNoIHRvIGEgbG9jYWwgc3RhY2suIEludGVycnVwdHMgYXJlICpvZmYqCi07IHdoZW4gd2UgY2FsbCB0aGUgdXNlciBjb2RlLgotOwotOyBOT1RFOiBUaGlzIHJvdXRpbmUgc3dpdGNoZXMgdG8gYSBsb2NhbCBzdGFjayBiZWZvcmUgY2FsbGluZyBhbnkgQyBjb2RlLAotOyAgICAgICBhbmQgaGVuY2UgaXMgX25vdF8gcmUtZW50cmFudC4gSG93ZXZlciB3ZSBlbnN1cmUgd2l0aGluIHRoaXMgcm91dGluZQotOyAgICAgICBtdXR1YWwgZXhjbHVzaW9uIHRvIHRoZSBrZXlib2FyZCBoYW5kbGluZyByb3V0aW5lLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jZmFyICAgIF9QTV9rZXlJU1IKLQotICAgICAgICBwdXNoICAgIGRzICAgICAgICAgICAgICA7IFNhdmUgdmFsdWUgb2YgRFMKLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBwdXNoYWQgICAgICAgICAgICAgICAgICA7IFNhdmUgX2FsbF8gZXh0ZW5kZWQgcmVnaXN0ZXJzCi0gICAgICAgIGNsZCAgICAgICAgICAgICAgICAgICAgIDsgQ2xlYXIgZGlyZWN0aW9uIGZsYWcKLQotICAgICAgICBMT0FEX0RTICAgICAgICAgICAgICAgICA7IExvYWQgRFMgcmVnaXN0ZXIKLQotICAgICAgICBjbXAgICAgIFtCWVRFIEt5SW5zaWRlXSwxICAgOyBDaGVjayBmb3IgbXV0dWFsIGV4Y2x1c2lvbgotICAgICAgICBqZSAgICAgIEBAUmVpc3N1ZWQKLQotICAgICAgICBtb3YgICAgIFtCWVRFIEt5SW5zaWRlXSwxCi0gICAgICAgIE5FV1NUSyAgS3lTdGFjayAgICAgICAgIDsgU3dpdGNoIHRvIGxvY2FsIHN0YWNrCi0gICAgICAgIGNhbGwgICAgW0NQVFIgX1BNX2tleUhhbmRsZXJdICAgOyBDYWxsIEMgY29kZQotICAgICAgICBSRVNUU1RLIEt5U3RhY2sgICAgICAgICA7IFJlc3RvcmUgcHJldmlvdXMgc3RhY2sKLSAgICAgICAgbW92ICAgICBbQllURSBLeUluc2lkZV0sMAotCi1AQEV4aXQ6IHBvcGFkICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBhbGwgZXh0ZW5kZWQgcmVnaXN0ZXJzCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBpcmV0ICAgICAgICAgICAgICAgICAgICA7IFJldHVybiBmcm9tIGludGVycnVwdAotCi07IFdoZW4gdGhlIEJJT1Mga2V5Ym9hcmQgaGFuZGxlciBuZWVkcyB0byBjaGFuZ2UgdGhlIFNISUZUIHN0YXR1cyBsaWdodHMKLTsgb24gdGhlIGtleWJvYXJkLCBpbiB0aGUgcHJvY2VzcyBvZiBkb2luZyB0aGlzIHRoZSBrZXlib2FyZCBjb250cm9sbGVyCi07IHJlLWlzc3VlcyBhbm90aGVyIGludGVycnVwdCwgd2hpbGUgdGhlIGN1cnJlbnQgaGFuZGxlciBpcyBzdGlsbCBleGVjdXRpbmcuCi07IElmIHdlIHJlY2lldmUgYW5vdGhlciBpbnRlcnJ1cHQgd2hpbGUgc3RpbGwgaGFuZGxpbmcgdGhlIGN1cnJlbnQgb25lLAotOyB0aGVuIHNpbXBseSBjaGFpbiBkaXJlY3RseSB0byB0aGUgcHJldmlvdXMgaGFuZGxlci4KLTsKLTsgTm90ZSB0aGF0IGZvciBtb3N0IERPUyBleHRlbmRlcnMsIHRoZSByZWFsIG1vZGUgaW50ZXJydXB0IGhhbmRsZXIgdGhhdCB3ZQotOyBpbnN0YWxsIHRha2VzIGNhcmUgb2YgdGhpcyBmb3IgdXMuCi0KLUBAUmVpc3N1ZWQ6Ci1pZmRlZiAgIFROVAotICAgICAgICBwdXNoICAgIGVheAotICAgICAgICBwdXNoICAgIGVieAotICAgICAgICBwdXNoICAgIGVjeAotICAgICAgICBwdXNoZmQgICAgICAgICAgICAgICAgICA7IFB1c2ggZmxhZ3Mgb24gc3RhY2sgdG8gc2ltdWxhdGUgaW50ZXJydXB0Ci0gICAgICAgIG1vdiAgICAgYXgsMjUwRWggICAgICAgIDsgQ2FsbCByZWFsIG1vZGUgcHJvY2VkdXJlIGZ1bmN0aW9uCi0gICAgICAgIG1vdiAgICAgZWJ4LFtfUE1fcHJldlJlYWxLZXldCi0gICAgICAgIG1vdiAgICAgZWN4LDEgICAgICAgICAgIDsgQ29weSByZWFsIG1vZGUgZmxhZ3MgdG8gcmVhbCBtb2RlIHN0YWNrCi0gICAgICAgIGludCAgICAgMjFoICAgICAgICAgICAgIDsgQ2FsbCB0aGUgcmVhbCBtb2RlIGNvZGUKLSAgICAgICAgcG9wZmQKLSAgICAgICAgcG9wICAgICBlY3gKLSAgICAgICAgcG9wICAgICBlYngKLSAgICAgICAgcG9wICAgICBlYXgKLWVsc2UKLSAgICAgICAgcHVzaGYKLWlmZGVmICAgVVNFX05BU00KLSAgICAgICAgY2FsbCBmYXIgZHdvcmQgW19QTV9wcmV2S2V5XQotZWxzZQotICAgICAgICBjYWxsICAgIFtfUE1fcHJldktleV0KLWVuZGlmCi1lbmRpZgotICAgICAgICBqbXAgICAgIEBARXhpdAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQTV9jaGFpblByZXZrZXkgLSBDaGFpbiB0byBwcmV2aW91cyBrZXkgaW50ZXJydXB0IGFuZCByZXR1cm4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENoYWlucyB0byB0aGUgcHJldmlvdXMga2V5IGludGVycnVwdCByb3V0aW5lIGFuZCByZXR1cm5zIGNvbnRyb2wKLTsgYmFjayB0byB0aGUgaGlnaCBsZXZlbCBpbnRlcnJ1cHQgaGFuZGxlci4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9jaGFpblByZXZLZXkKLQotaWZkZWYgICBUTlQKLSAgICAgICAgcHVzaCAgICBlYXgKLSAgICAgICAgcHVzaCAgICBlYngKLSAgICAgICAgcHVzaCAgICBlY3gKLSAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgOyBQdXNoIGZsYWdzIG9uIHN0YWNrIHRvIHNpbXVsYXRlIGludGVycnVwdAotICAgICAgICBtb3YgICAgIGF4LDI1MEVoICAgICAgICA7IENhbGwgcmVhbCBtb2RlIHByb2NlZHVyZSBmdW5jdGlvbgotICAgICAgICBtb3YgICAgIGVieCxbX1BNX3ByZXZSZWFsS2V5XQotICAgICAgICBtb3YgICAgIGVjeCwxICAgICAgICAgICA7IENvcHkgcmVhbCBtb2RlIGZsYWdzIHRvIHJlYWwgbW9kZSBzdGFjawotICAgICAgICBpbnQgICAgIDIxaCAgICAgICAgICAgICA7IENhbGwgdGhlIHJlYWwgbW9kZSBjb2RlCi0gICAgICAgIHBvcGZkCi0gICAgICAgIHBvcCAgICAgZWN4Ci0gICAgICAgIHBvcCAgICAgZWJ4Ci0gICAgICAgIHBvcCAgICAgZWF4Ci0gICAgICAgIHJldAotZWxzZQotCi07IFlJS0VTISBGb3Igc29tZSBzdHJhbmdlIHJlYXNvbiwgd2hlbiBleGVjdXRpb24gcmV0dXJucyBmcm9tIHRoZQotOyBwcmV2aW91cyBrZXlib2FyZCBoYW5kbGVyLCBpbnRlcnJ1cHRzIGFyZSByZS1lbmFibGVkISEgU2luY2Ugd2UgZXhwZWN0Ci07IGludGVycnVwdHMgdG8gcmVtYWluIG9mZiBkdXJpbmcgdGhlIGR1cmF0aW9uIG9mIG91ciBoYW5kbGVyLCB0aGlzIGNhbgotOyBjYXVzZSBoYXZvYy4gSG93ZXZlciBvdXIgc3RhY2sgbWFjcm9zIGFsd2F5cyB0dXJuIG9mZiBpbnRlcnJ1cHRzLCBzbyB0aGV5Ci07IHdpbGwgYmUgb2ZmIHdoZW4gd2UgZXhpdCB0aGlzIHJvdXRpbmUuIE9idmlvdXNseSB0aGVyZSBpcyBhIHRpbnkgd2VlbnkKLTsgd2luZG93IHdoZW4gaW50ZXJydXB0cyB3aWxsIGJlIGVuYWJsZWQsIGJ1dCB0aGVyZSBpcyBub3RoaW5nIHdlIGNhbgotOyBkbyBhYm91dCB0aGlzLgotCi0gICAgICAgIFNXQVBTVEsgS3lTdGFjayAgICAgICAgIDsgU3dhcCBiYWNrIHRvIHByZXZpb3VzIHN0YWNrCi0gICAgICAgIHB1c2hmICAgICAgICAgICAgICAgICAgIDsgUHVzaCBmbGFncyBvbiBzdGFjayB0byBzaW11bGF0ZSBpbnRlcnJ1cHQKLWlmZGVmICAgVVNFX05BU00KLSAgICAgICAgY2FsbCBmYXIgZHdvcmQgW19QTV9wcmV2S2V5XQotZWxzZQotICAgICAgICBjYWxsICAgIFtfUE1fcHJldktleV0KLWVuZGlmCi0gICAgICAgIFNXQVBTVEsgS3lTdGFjayAgICAgICAgIDsgU3dhcCBiYWNrIHRvIEMgc3RhY2sgYWdhaW4KLSAgICAgICAgcmV0Ci1lbmRpZgotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQTV9rZXkxNUlTUiAtIEludCAxNWgga2V5Ym9hcmQgaW50ZXJydXB0IHN1YnJvdXRpbmUgZGlzcGF0Y2hlcgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgVGhpcyByb3V0aW5lIGdldHMgY2FsbGVkIGlmIHdlIGhhdmUgYmVlbiBjYWxsZWQgdG8gaGFuZGxlIHRoZSBJbnQgMTVoCi07IGtleWJvYXJkIGludGVycnVwdCBjYWxsb3V0IGZyb20gcmVhbCBtb2RlLgotOwotOyAgIEVudHJ5OiAgQVggIC0gSGFyZHdhcmUgc2NhbiBjb2RlIHRvIHByb2Nlc3MKLTsgICBFeGl0OiAgIEFYICAtIEhhcmR3YXJlIHNjYW4gY29kZSB0byBwcm9jZXNzICgwIHRvIGlnbm9yZSkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY2ZhciAgICBfUE1fa2V5MTVJU1IKLQotICAgICAgICBwdXNoICAgIGRzCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgTE9BRF9EUwotICAgICAgICBjbXAgICAgIGFoLDRGaAotICAgICAgICBqbnogICAgIEBATm90T3VycyAgICAgICA7IFF1aXQgaWYgbm90IGtleWJvYXJkIGNhbGxvdXQKLQotICAgICAgICBwdXNoYWQKLSAgICAgICAgY2xkICAgICAgICAgICAgICAgICAgICAgOyBDbGVhciBkaXJlY3Rpb24gZmxhZwotICAgICAgICB4b3IgICAgIGFoLGFoICAgICAgICAgICA7IEFYIDo9IHNjYW4gY29kZQotICAgICAgICBORVdTVEsgIEt5MTVTdGFjayAgICAgICA7IFN3aXRjaCB0byBsb2NhbCBzdGFjawotICAgICAgICBwdXNoICAgIF9heAotICAgICAgICBjYWxsICAgIFtDUFRSIF9QTV9rZXkxNUhhbmRsZXJdIDsgQ2FsbCBDIGNvZGUKLSAgICAgICAgX2FkZCAgICBzcCwyLDQKLSAgICAgICAgUkVTVFNUSyBLeTE1U3RhY2sgICAgICAgOyBSZXN0b3JlIHByZXZpb3VzIHN0YWNrCi0gICAgICAgIHRlc3QgICAgYXgsYXgKLSAgICAgICAganogICAgICBAQDEKLSAgICAgICAgc3RjICAgICAgICAgICAgICAgICAgICAgOyBTZXQgY2FycnkgdG8gcHJvY2VzcyBhcyBub3JtYWwKLSAgICAgICAgam1wICAgICBAQDIKLUBAMTogICAgY2xjICAgICAgICAgICAgICAgICAgICAgOyBDbGVhciBjYXJyeSB0byBpZ25vcmUgc2NhbiBjb2RlCi1AQDI6ICAgIHBvcGFkCi0gICAgICAgIGptcCAgICAgQEBFeGl0ICAgICAgICAgIDsgV2UgYXJlIGRvbmUKLQotQEBOb3RPdXJzOgotaWZkZWYgICBUTlQKLSAgICAgICAgcHVzaCAgICBlYXgKLSAgICAgICAgcHVzaCAgICBlYngKLSAgICAgICAgcHVzaCAgICBlY3gKLSAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgOyBQdXNoIGZsYWdzIG9uIHN0YWNrIHRvIHNpbXVsYXRlIGludGVycnVwdAotICAgICAgICBtb3YgICAgIGF4LDI1MEVoICAgICAgICA7IENhbGwgcmVhbCBtb2RlIHByb2NlZHVyZSBmdW5jdGlvbgotICAgICAgICBtb3YgICAgIGVieCxbX1BNX3ByZXZSZWFsS2V5MTVdCi0gICAgICAgIG1vdiAgICAgZWN4LDEgICAgICAgICAgIDsgQ29weSByZWFsIG1vZGUgZmxhZ3MgdG8gcmVhbCBtb2RlIHN0YWNrCi0gICAgICAgIGludCAgICAgMjFoICAgICAgICAgICAgIDsgQ2FsbCB0aGUgcmVhbCBtb2RlIGNvZGUKLSAgICAgICAgcG9wZmQKLSAgICAgICAgcG9wICAgICBlY3gKLSAgICAgICAgcG9wICAgICBlYngKLSAgICAgICAgcG9wICAgICBlYXgKLWVsc2UKLSAgICAgICAgcHVzaGYKLWlmZGVmICAgVVNFX05BU00KLSAgICAgICAgY2FsbCBmYXIgZHdvcmQgW19QTV9wcmV2S2V5MTVdCi1lbHNlCi0gICAgICAgIGNhbGwgICAgW19QTV9wcmV2S2V5MTVdCi1lbmRpZgotZW5kaWYKLUBARXhpdDogcG9wICAgICBlcwotICAgICAgICBwb3AgICAgIGRzCi0gICAgICAgIHJldGYgICAgNAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQTV9icmVha0lTUiAtIENvbnRyb2wgQnJlYWsgaW50ZXJydXB0IHN1YnJvdXRpbmUgZGlzcGF0Y2hlcgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBDdHJsLUJyZWFrIGludGVycnVwdC4gV2Ugc2ltcGx5IHNldAotOyB0aGUgQ3RybC1CcmVhayBmbGFnIHRvIGEgMSBhbmQgbGVhdmUgKG5vdGUgdGhhdCB0aGlzIGlzIGFjY2Vzc2VkIHRocm91Z2gKLTsgYSBmYXIgcG9pbnRlciwgYXMgaXQgbWF5IHdlbGwgYmUgbG9jYXRlZCBpbiBjb252ZW50aW9uYWwgbWVtb3J5KS4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY2ZhciAgICBfUE1fYnJlYWtJU1IKLQotICAgICAgICBzdGkKLSAgICAgICAgcHVzaCAgICBkcyAgICAgICAgICAgICAgOyBTYXZlIHZhbHVlIG9mIERTCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgcHVzaCAgICBfYngKLQotICAgICAgICBMT0FEX0RTICAgICAgICAgICAgICAgICA7IExvYWQgRFMgcmVnaXN0ZXIKLSAgICAgICAgbW92ICAgICBlYngsW19QTV9jdHJsQlB0cl0KLSAgICAgICAgbW92ICAgICBbVUlOVCBfRVMgX2J4XSwxCi0KLTsgUnVuIGFsdGVybmF0ZSBicmVhayBoYW5kbGVyIGNvZGUgaWYgaW5zdGFsbGVkCi0KLSAgICAgICAgY21wICAgICBbQ1BUUiBfUE1fYnJlYWtIYW5kbGVyXSwwCi0gICAgICAgIGplICAgICAgQEBFeGl0Ci0KLSAgICAgICAgcHVzaGFkCi0gICAgICAgIG1vdiAgICAgX2F4LDEKLSAgICAgICAgcHVzaCAgICBfYXgKLSAgICAgICAgY2FsbCAgICBbQ1BUUiBfUE1fYnJlYWtIYW5kbGVyXSA7IENhbGwgQyBjb2RlCi0gICAgICAgIHBvcCAgICAgX2F4Ci0gICAgICAgIHBvcGFkCi0KLUBARXhpdDogcG9wICAgICBfYngKLSAgICAgICAgcG9wICAgICBlcwotICAgICAgICBwb3AgICAgIGRzCi0gICAgICAgIGlyZXQgICAgICAgICAgICAgICAgICAgIDsgUmV0dXJuIGZyb20gaW50ZXJydXB0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBQTV9jdHJsQnJlYWtIaXQoaW50IGNsZWFyRmxhZykKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIEN0cmwtQnJlYWsgZmxhZyBhbmQgcG9zc2libHkgY2xlYXJzIGl0LgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX2N0cmxCcmVha0hpdAotCi0gICAgICAgIEFSRyAgICAgY2xlYXJGbGFnOlVJTlQKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIHB1c2hmICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBpbnRlcnJ1cHQgc3RhdHVzCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgbW92ICAgICBlYngsW19QTV9jdHJsQlB0cl0KLSAgICAgICAgY2xpICAgICAgICAgICAgICAgICAgICAgOyBObyBpbnRlcnJ1cHRzIHRoYW5rcyEKLSAgICAgICAgbW92ICAgICBfYXgsW19FUyBfYnhdCi0gICAgICAgIHRlc3QgICAgW0JZVEUgY2xlYXJGbGFnXSwxCi0gICAgICAgIGp6ICAgICAgQEBEb25lCi0gICAgICAgIG1vdiAgICAgW1VJTlQgX0VTIF9ieF0sMAotCi1AQERvbmU6IHBvcCAgICAgZXMKLSAgICAgICAgcG9wZiAgICAgICAgICAgICAgICAgICAgOyBSZXN0b3JlIGludGVycnVwdCBzdGF0dXMKLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUE1fY3RybENJU1IgLSBDb250cm9sIEJyZWFrIGludGVycnVwdCBzdWJyb3V0aW5lIGRpc3BhdGNoZXIKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgQ3RybC1DIGludGVycnVwdC4gV2Ugc2ltcGx5IHNldAotOyB0aGUgQ3RybC1DIGZsYWcgdG8gYSAxIGFuZCBsZWF2ZSAobm90ZSB0aGF0IHRoaXMgaXMgYWNjZXNzZWQgdGhyb3VnaAotOyBhIGZhciBwb2ludGVyLCBhcyBpdCBtYXkgd2VsbCBiZSBsb2NhdGVkIGluIGNvbnZlbnRpb25hbCBtZW1vcnkpLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jZmFyICAgIF9QTV9jdHJsQ0lTUgotCi0gICAgICAgIHN0aQotICAgICAgICBwdXNoICAgIGRzICAgICAgICAgICAgICA7IFNhdmUgdmFsdWUgb2YgRFMKLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBwdXNoICAgIF9ieAotCi0gICAgICAgIExPQURfRFMgICAgICAgICAgICAgICAgIDsgTG9hZCBEUyByZWdpc3RlcgotICAgICAgICBtb3YgICAgIGVieCxbX1BNX2N0cmxDUHRyXQotICAgICAgICBtb3YgICAgIFtVSU5UIF9FUyBfYnhdLDEKLQotOyBSdW4gYWx0ZXJuYXRlIGJyZWFrIGhhbmRsZXIgY29kZSBpZiBpbnN0YWxsZWQKLQotICAgICAgICBjbXAgICAgIFtDUFRSIF9QTV9icmVha0hhbmRsZXJdLDAKLSAgICAgICAgamUgICAgICBAQEV4aXQKLQotICAgICAgICBwdXNoYWQKLSAgICAgICAgbW92ICAgICBfYXgsMAotICAgICAgICBwdXNoICAgIF9heAotICAgICAgICBjYWxsICAgIFtDUFRSIF9QTV9icmVha0hhbmRsZXJdIDsgQ2FsbCBDIGNvZGUKLSAgICAgICAgcG9wICAgICBfYXgKLSAgICAgICAgcG9wYWQKLQotQEBFeGl0OiBwb3AgICAgIF9ieAotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gZnJvbSBpbnRlcnJ1cHQKLSAgICAgICAgaXJldGQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50IFBNX2N0cmxDSGl0KGludCBjbGVhckZsYWcpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBDdHJsLUMgZmxhZyBhbmQgcG9zc2libHkgY2xlYXJzIGl0LgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX2N0cmxDSGl0Ci0KLSAgICAgICAgQVJHICAgICBjbGVhckZsYWc6VUlOVAotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgcHVzaGYgICAgICAgICAgICAgICAgICAgOyBTYXZlIGludGVycnVwdCBzdGF0dXMKLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBtb3YgICAgIGVieCxbX1BNX2N0cmxDUHRyXQotICAgICAgICBjbGkgICAgICAgICAgICAgICAgICAgICA7IE5vIGludGVycnVwdHMgdGhhbmtzIQotICAgICAgICBtb3YgICAgIF9heCxbX0VTIF9ieF0KLSAgICAgICAgdGVzdCAgICBbQllURSBjbGVhckZsYWddLDEKLSAgICAgICAganogICAgICBAQERvbmUKLSAgICAgICAgbW92ICAgICBbVUlOVCBfRVMgX2J4XSwwCi0KLUBARG9uZToKLSAgICAgICAgcG9wICAgICBlcwotICAgICAgICBwb3BmICAgICAgICAgICAgICAgICAgICA7IFJlc3RvcmUgaW50ZXJydXB0IHN0YXR1cwotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBQTV9jcml0aWNhbElTUiAtIENvbnRyb2wgRXJyb3IgaGFuZGxlciBpbnRlcnJ1cHQgc3Vicm91dGluZSBkaXNwYXRjaGVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIE1TRE9TIENyaXRpY2FsIEVycm9yIGludGVycnVwdCwgdG8gZGlzcGF0Y2gKLTsgY29udHJvbCB0byBoaWdoIGxldmVsIEMgYmFzZWQgc3Vicm91dGluZXMuIFdlIHNhdmUgdGhlIHN0YXRlIG9mIGFsbAotOyByZWdpc3RlcnMgaW4gdGhpcyByb3V0aW5lLCBhbmQgc3dpdGNoIHRvIGEgbG9jYWwgc3RhY2suIFdlIGFsc28gcGFzcwotOyB0aGUgdmFsdWVzIG9mIHRoZSBBWCBhbmQgREkgcmVnaXN0ZXJzIHRvIHRoZSBhcyBwb2ludGVycywgc28gdGhhdCB0aGUKLTsgdmFsdWVzIGNhbiBiZSBtb2RpZmllZCBiZWZvcmUgcmV0dXJuaW5nIHRvIE1TRE9TLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jZmFyICAgIF9QTV9jcml0aWNhbElTUgotCi0gICAgICAgIHN0aQotICAgICAgICBwdXNoICAgIGRzICAgICAgICAgICAgICA7IFNhdmUgdmFsdWUgb2YgRFMKLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBwdXNoICAgIF9ieCAgICAgICAgICAgICA7IFNhdmUgcmVnaXN0ZXIgdmFsdWVzIGNoYW5nZWQKLSAgICAgICAgY2xkICAgICAgICAgICAgICAgICAgICAgOyBDbGVhciBkaXJlY3Rpb24gZmxhZwotCi0gICAgICAgIExPQURfRFMgICAgICAgICAgICAgICAgIDsgTG9hZCBEUyByZWdpc3RlcgotICAgICAgICBtb3YgICAgIGVieCxbX1BNX2NyaXRQdHJdCi0gICAgICAgIG1vdiAgICAgW19FUyBfYnhdLGF4Ci0gICAgICAgIG1vdiAgICAgW19FUyBfYngrMl0sZGkKLQotOyBSdW4gYWx0ZXJuYXRlIGNyaXRpY2FsIGhhbmRsZXIgY29kZSBpZiBpbnN0YWxsZWQKLQotICAgICAgICBjbXAgICAgIFtDUFRSIF9QTV9jcml0SGFuZGxlcl0sMAotICAgICAgICBqZSAgICAgIEBATm9BbHRIYW5kbGVyCi0KLSAgICAgICAgcHVzaGFkCi0gICAgICAgIHB1c2ggICAgX2RpCi0gICAgICAgIHB1c2ggICAgX2F4Ci0gICAgICAgIGNhbGwgICAgW0NQVFIgX1BNX2NyaXRIYW5kbGVyXSAgOyBDYWxsIEMgY29kZQotICAgICAgICBfYWRkICAgIHNwLDQsOAotICAgICAgICBwb3BhZAotCi0gICAgICAgIHBvcCAgICAgX2J4Ci0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgcG9wICAgICBkcwotICAgICAgICBpcmV0ICAgICAgICAgICAgICAgICAgICA7IFJldHVybiBmcm9tIGludGVycnVwdAotCi1AQE5vQWx0SGFuZGxlcjoKLSAgICAgICAgbW92ICAgICBheCwzICAgICAgICAgICAgOyBUZWxsIE1TRE9TIHRvIGZhaWwgdGhlIG9wZXJhdGlvbgotICAgICAgICBwb3AgICAgIF9ieAotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgOyBSZXR1cm4gZnJvbSBpbnRlcnJ1cHQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50IFBNX2NyaXRpY2FsRXJyb3IoaW50ICpheFZhbCxpbnQgKmRpVmFsLGludCBjbGVhckZsYWcpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjcml0aWNhbCBlcnJvciBmbGFncywgYW5kIHRoZSB2YWx1ZXMgdGhhdAotOyBNU0RPUyBwYXNzZWQgaW4gdGhlIEFYIGFuZCBESSByZWdpc3RlcnMgdG8gb3VyIGhhbmRsZXIuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUE1fY3JpdGljYWxFcnJvcgotCi0gICAgICAgIEFSRyAgICAgYXhWYWw6RFBUUiwgZGlWYWw6RFBUUiwgY2xlYXJGbGFnOlVJTlQKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIHB1c2hmICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBpbnRlcnJ1cHQgc3RhdHVzCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgbW92ICAgICBlYngsW19QTV9jcml0UHRyXQotICAgICAgICBjbGkgICAgICAgICAgICAgICAgICAgICA7IE5vIGludGVycnVwdHMgdGhhbmtzIQotICAgICAgICB4b3IgICAgIF9heCxfYXgKLSAgICAgICAgeG9yICAgICBfZGksX2RpCi0gICAgICAgIG1vdiAgICAgYXgsW19FUyBfYnhdCi0gICAgICAgIG1vdiAgICAgZGksW19FUyBfYngrMl0KLSAgICAgICAgdGVzdCAgICBbQllURSBjbGVhckZsYWddLDEKLSAgICAgICAganogICAgICBAQE5vQ2xlYXIKLSAgICAgICAgbW92ICAgICBbVUxPTkcgX0VTIF9ieF0sMAotQEBOb0NsZWFyOgotICAgICAgICBfbGVzICAgIF9ieCxbYXhWYWxdCi0gICAgICAgIG1vdiAgICAgW19FUyBfYnhdLF9heAotICAgICAgICBfbGVzICAgIF9ieCxbZGlWYWxdCi0gICAgICAgIG1vdiAgICAgW19FUyBfYnhdLF9kaQotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcGYgICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSBpbnRlcnJ1cHQgc3RhdHVzCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fc2V0TW91c2VIYW5kbGVyKGludCBtYXNrLCBQTV9tb3VzZUhhbmRsZXIgbWgpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgX1BNX3NldE1vdXNlSGFuZGxlcgotCi0gICAgICAgIEFSRyAgICAgbW91c2VNYXNrOlVJTlQKLQotICAgICAgICBlbnRlcl9jCi0gICAgICAgIHB1c2ggICAgZXMKLQotICAgICAgICBtb3YgICAgIGF4LDBDaCAgICAgICAgICA7IEFYIDo9IEZ1bmN0aW9uIDEyIC0gaW5zdGFsbCBpbnRlcnJ1cHQgc3ViCi0gICAgICAgIG1vdiAgICAgX2N4LFttb3VzZU1hc2tdIDsgQ1ggOj0gbW91c2UgbWFzawotICAgICAgICBtb3YgICAgIF9keCxvZmZzZXQgX1BNX21vdXNlSVNSCi0gICAgICAgIHB1c2ggICAgY3MKLSAgICAgICAgcG9wICAgICBlcyAgICAgICAgICAgICAgOyBFUzpfRFggLT4gbW91c2UgaGFuZGxlcgotICAgICAgICBpbnQgICAgIDMzaCAgICAgICAgICAgICA7IENhbGwgbW91c2UgZHJpdmVyCi0KLSAgICAgICAgcG9wICAgICBlcwotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX21vdXNlUE1DQih2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTW91c2UgcmVhbG1vZGUgY2FsbGJhY2sgcm91dGluZS4gVXBvbiBlbnRyeSB0byB0aGlzIHJvdXRpbmUsIHdlIHJlY2lldmUKLTsgdGhlIGZvbGxvd2luZyBmcm9tIHRoZSBEUE1JIHNlcnZlcjoKLTsKLTsgICBFbnRyeTogIERTOl9TSSAgLT4gUmVhbCBtb2RlIHN0YWNrIGF0IHRpbWUgb2YgY2FsbAotOyAgICAgICAgICAgRVM6X0RJICAtPiBSZWFsIG1vZGUgcmVnaXN0ZXIgZGF0YSBzdHJ1Y3R1cmUKLTsgICAgICAgICAgIFNTOl9TUCAgLT4gTG9ja2VkIHByb3RlY3RlZCBtb2RlIHN0YWNrIHRvIHVzZQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jZmFyICAgIF9QTV9tb3VzZVBNQ0IKLQotICAgICAgICBwdXNoYWQKLSAgICAgICAgbW92ICAgICBlYXgsW2VzOl9kaSsxQ2hdICAgIDsgTG9hZCByZWdpc3RlciB2YWx1ZXMgZnJvbSByZWFsIG1vZGUKLSAgICAgICAgbW92ICAgICBlYngsW2VzOl9kaSsxMGhdCi0gICAgICAgIG1vdiAgICAgZWN4LFtlczpfZGkrMThoXQotICAgICAgICBtb3YgICAgIGVkeCxbZXM6X2RpKzE0aF0KLSAgICAgICAgbW92ICAgICBlc2ksW2VzOl9kaSswNGhdCi0gICAgICAgIG1vdiAgICAgZWRpLFtlczpfZGldCi0gICAgICAgIGNhbGwgICAgX1BNX21vdXNlSVNSICAgICAgICA7IENhbGwgdGhlIG1vdXNlIGhhbmRsZXIKLSAgICAgICAgcG9wYWQKLQotICAgICAgICBtb3YgICAgIGF4LFtkczpfc2ldCi0gICAgICAgIG1vdiAgICAgW2VzOl9kaSsyQWhdLGF4ICAgICA7IFBsdWcgaW4gcmV0dXJuIElQIGFkZHJlc3MKLSAgICAgICAgbW92ICAgICBheCxbZHM6X3NpKzJdCi0gICAgICAgIG1vdiAgICAgW2VzOl9kaSsyQ2hdLGF4ICAgICA7IFBsdWcgaW4gcmV0dXJuIENTIHZhbHVlCi0gICAgICAgIGFkZCAgICAgW1dPUkQgZXM6X2RpKzJFaF0sNCA7IFJlbW92ZSByZXR1cm4gYWRkcmVzcyBmcm9tIHN0YWNrCi0gICAgICAgIGlyZXQgICAgICAgICAgICAgICAgICAgICAgICA7IEdvIGJhY2sgdG8gcmVhbCBtb2RlIQotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX2ludDEwUE1DQih2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgaW50MTAgcmVhbG1vZGUgY2FsbGJhY2sgcm91dGluZS4gVXBvbiBlbnRyeSB0byB0aGlzIHJvdXRpbmUsIHdlIHJlY2lldmUKLTsgdGhlIGZvbGxvd2luZyBmcm9tIHRoZSBEUE1JIHNlcnZlcjoKLTsKLTsgICBFbnRyeTogIERTOkVTSSAgLT4gUmVhbCBtb2RlIHN0YWNrIGF0IHRpbWUgb2YgY2FsbAotOyAgICAgICAgICAgRVM6RURJICAtPiBSZWFsIG1vZGUgcmVnaXN0ZXIgZGF0YSBzdHJ1Y3R1cmUKLTsgICAgICAgICAgIFNTOkVTUCAgLT4gTG9ja2VkIHByb3RlY3RlZCBtb2RlIHN0YWNrIHRvIHVzZQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jZmFyICAgICAgICBfUE1faW50MTBQTUNCCi0KLSAgICAgICAgcHVzaGFkCi0gICAgICAgIHB1c2ggICAgZHMKLSAgICAgICAgcHVzaCAgICBlcwotICAgICAgICBwdXNoICAgIGZzCi0KLSAgICAgICAgcHVzaGZkCi0gICAgICAgIHBvcCAgICAgZWF4Ci0gICAgICAgIG1vdiAgICAgW2VzOmVkaSsyMGhdLGF4ICAgICA7IFNhdmUgcmV0dXJuIGZsYWcgc3RhdHVzCi0gICAgICAgIG1vdiAgICAgYXgsW2RzOmVzaV0KLSAgICAgICAgbW92ICAgICBbZXM6ZWRpKzJBaF0sYXggICAgIDsgUGx1ZyBpbiByZXR1cm4gSVAgYWRkcmVzcwotICAgICAgICBtb3YgICAgIGF4LFtkczplc2krMl0KLSAgICAgICAgbW92ICAgICBbZXM6ZWRpKzJDaF0sYXggICAgIDsgUGx1ZyBpbiByZXR1cm4gQ1MgdmFsdWUKLSAgICAgICAgYWRkICAgICBbV09SRCBlczplZGkrMkVoXSw0IDsgUmVtb3ZlIHJldHVybiBhZGRyZXNzIGZyb20gc3RhY2sKLQotOyBDYWxsIHRoZSBpbnN0YWxsIGludDEwIGhhbmRsZXIgaW4gcHJvdGVjdGVkIG1vZGUuIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQKLTsgd2l0aCBEUyBzZXQgdG8gdGhlIGN1cnJlbnQgZGF0YSBzZWxlY3RvciwgYW5kIEVTOkVESSBwb2ludGluZyB0aGUgdGhlCi07IHJlYWwgbW9kZSBEUE1JIHJlZ2lzdGVyIHN0cnVjdHVyZSBhdCB0aGUgdGltZSBvZiB0aGUgaW50ZXJydXB0LiBUaGUKLTsgaGFuZGxlIG11c3QgYmUgd3JpdHRlbiBpbiBhc3NlbWJsZXIgdG8gYmUgYWJsZSB0byBleHRyYWN0IHRoZSByZWFsIG1vZGUKLTsgcmVnaXN0ZXIgdmFsdWVzIGZyb20gdGhlIHN0cnVjdHVyZQotCi0gICAgICAgIHB1c2ggICAgZXMKLSAgICAgICAgcG9wICAgICBmcyAgICAgICAgICAgICAgICAgIDsgRlM6RURJIC0+IHJlYWwgbW9kZSByZWdpc3RlcnMKLSAgICAgICAgTE9BRF9EUwotICAgICAgICBORVdTVEsgIEludDEwU3RhY2sgICAgICAgICAgOyBTd2l0Y2ggdG8gbG9jYWwgc3RhY2sKLQotICAgICAgICBjYWxsICAgIFtfUE1faW50MTBIYW5kbGVyXQotCi0gICAgICAgIFJFU1RTVEsgSW50MTBTdGFjayAgICAgICAgICA7IFJlc3RvcmUgcHJldmlvdXMgc3RhY2sKLSAgICAgICAgcG9wICAgICBmcwotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgcG9wYWQKLSAgICAgICAgaXJldCAgICAgICAgICAgICAgICAgICAgICAgIDsgR28gYmFjayB0byByZWFsIG1vZGUhCi0KLWNwcm9jZW5kCi0KLWNwdWJsaWMgX1BNX3Btc214Q29kZUVuZAotCi1lbmRjb2Rlc2VnICBfcG1zbXgKLQotICAgICAgICBFTkQgICAgICAgICAgICAgICAgICAgICA7IEVuZCBvZiBtb2R1bGUKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9fdmZsYXQuYXNtIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L192ZmxhdC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OTg1YTkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L192ZmxhdC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw2NTIgKzAsMCBAQAotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqCi07KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLTsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci07KgotOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLTsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi07KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLTsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07KgotOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyoKLTsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiAgICAgICAgICAgIEJhc2VkIG9uIG9yaWdpbmFsIGNvZGUgQ29weXJpZ2h0IDE5OTQgT3R0byBDaHJvbnMKLTsqCi07KiBMYW5ndWFnZTogICAgODAzODYgQXNzZW1ibGVyLCBUQVNNIDQuMCBvciBsYXRlcgotOyogRW52aXJvbm1lbnQ6IElCTSBQQyAzMiBiaXQgcHJvdGVjdGVkIG1vZGUKLTsqCi07KiBEZXNjcmlwdGlvbjogTG93IGxldmVsIHBhZ2UgZmF1bHQgaGFuZGxlciBmb3IgdmlydHVhbCBsaW5lYXIgZnJhbWVidWZmZXJzLgotOyoKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgSURFQUwKLSAgICAgICAgSlVNUFMKLQotaW5jbHVkZSAic2NpdGVjaC5tYWMiICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKLQotaGVhZGVyICAgICAgX3ZmbGF0ICAgICAgICAgICAgICA7IFNldCB1cCBtZW1vcnkgbW9kZWwKLQotVkZMQVRfU1RBUlQgICAgIEVRVSAwRjAwMDAwMDBoCi1WRkxBVF9FTkQgICAgICAgRVFVIDBGMDNGRkZGRmgKLVBBR0VfUFJFU0VOVCAgICBFUVUgMQotUEFHRV9OT1RQUkVTRU5UIEVRVSAwCi1QQUdFX1JFQUQgICAgICAgRVFVIDAKLVBBR0VfV1JJVEUgICAgICBFUVUgMgotCi1pZmRlZiAgIERPUzRHVwotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBET1M0Ry9XIGZsYXQgbGluZWFyIGZyYW1lYnVmZmVyIGVtdWxhdGlvbi4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWJlZ2RhdGFzZWcgIF92ZmxhdAotCi07IE5lYXIgcG9pbnRlcnMgdG8gdGhlIHBhZ2UgZGlyZWN0b3J5IGJhc2UgYW5kIG91ciBwYWdlIHRhYmxlcy4gQWxsIG9mCi07IHRoaXMgbWVtb3J5IGlzIGFsd2F5cyBsb2NhdGVkIGluIHRoZSBmaXJzdCBNYiBvZiBET1MgbWVtb3J5LgotCi1QREJSICAgICAgICAgICAgZGQgIDAgICAgICAgICAgICAgICA7IFBhZ2UgZGlyZWN0b3J5IGJhc2UgcmVnaXN0ZXIgKENSMykKLWFjY2Vzc1BhZ2VBZGRyICBkZCAgMAotYWNjZXNzUGFnZVRhYmxlIGRkICAwCi0KLTsgQ2F1c2VXYXkgcGFnZSBkaXJlY3RvcnkgJiAxc3QgcGFnZSB0YWJsZSBsaW5lYXIgYWRkcmVzc2VzLgotCi1DYXVzZVdheURJUkxpbmVhciBkZCAwCi1DYXVzZVdheTFzdExpbmVhciBkZCAwCi0KLTsgUGxhY2UgdG8gc3RvcmUgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBQYWdlIFRhYmxlIERpcmVjdG9yeSBiZWZvcmUgd2UKLTsgaW50aWFsaXNlZCBvdXIgdmlydHVhbCBidWZmZXIgY29kZS4KLQotcGFnZURpcmVjdG9yeTogIHJlc2QgMTAyNCAgICAgICAgICAgOyBTYXZlZCBwYWdlIHRhYmxlIGRpcmVjdG9yeQotCi1WYWxpZENTICAgICAgICAgZHcgIDAgICAgICAgICAgICAgICA7IFZhbGlkIENTIGZvciBwYWdlIGZhdWx0cwotUmluZzBDUyAgICAgICAgIGR3ICAwICAgICAgICAgICAgICAgOyBPdXIgcmluZyAwIGNvZGUgc2VsZWN0b3IKLUxhc3RQYWdlICAgICAgICBkZCAgMCAgICAgICAgICAgICAgIDsgTGFzdCBwYWdlIHdlIG1hcHBlZCBpbgotQmFua0Z1bmNCdWY6ICAgIHJlc2IgMTAxICAgICAgICAgICAgOyBQbGFjZSB0byBzdG9yZSBiYW5rIHN3aXRjaCBjb2RlCi1CYW5rRnVuY1B0ciAgICAgZGQgIG9mZnNldCBCYW5rRnVuY0J1ZgotCi1JTlQxNEdhdGU6Ci1JTlQxNE9mZnNldCAgICAgZGQgICAgICAwICAgICAgICAgICA7IGVpcCBvZiBvcmlnaW5hbCB2ZWN0b3IKLUlOVDE0U2VsZWN0b3IgICBkdyAgICAgIDAgICAgICAgICAgIDsgY3Mgb2Ygb3JpZ2luYWwgdmVjdG9yCi0KLSAgICAgICAgY2V4dGVybiBfUE1fc2F2ZWREUyxVU0hPUlQKLSAgICAgICAgY2V4dGVybiBWRl9oYXZlQ2F1c2VXYXksQk9PTAotCi1lbmRkYXRhc2VnICBfdmZsYXQKLQotYmVnY29kZXNlZyAgX3ZmbGF0ICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGNvZGUgc2VnbWVudAotCi0gICAgICAgIGNleHRlcm4gVkZfbWFsbG9jLEZQVFIKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUEZfaGFuZGxlcjY0ayAtIFBhZ2UgZmF1bHQgaGFuZGxlciBmb3IgNjRrIGJhbmtzCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBUaGUgaGFuZGxlciBiZWxvdyBpcyBhIDMyIGJpdCByaW5nIDAgcGFnZSBmYXVsdCBoYW5kbGVyLiAgSXQgcmVjZWl2ZXMKLTsgY29udHJvbCBpbW1lZGlhdGVseSBhZnRlciBhbnkgcGFnZSBmYXVsdCBvciBhZnRlciBhbiBJUlE2IChoYXJkd2FyZQotOyBpbnRlcnJ1cHQpLiBUaGlzIHByb3ZpZGVzIHRoZSBmYXN0ZXN0IHBvc3NpYmxlIGhhbmRsaW5nIG9mIHBhZ2UgZmF1bHRzCi07IHNpbmNlIGl0IGp1bXAgZGlyZWN0bHkgaGVyZS4gIElmIHRoaXMgaXMgYSBwYWdlIGZhdWx0LCB0aGUgbnVtYmVyCi07IGltbWVkaWF0ZWx5IG9uIHRoZSBzdGFjayB3aWxsIGJlIGFuIGVycm9yIGNvZGUsIGF0IG9mZnNldCA0IHdpbGwgYmUKLTsgdGhlIGVpcCBvZiB0aGUgZmF1bHRpbmcgaW5zdHJ1Y3Rpb24sIGF0IG9mZnNldCA4IHdpbGwgYmUgdGhlIGNzIG9mIHRoZQotOyBmYXVsdGluZyBpbnN0cnVjdGlvbi4gIElmIGl0IGlzIGEgaGFyZHdhcmUgaW50ZXJydXB0LCBpdCB3aWxsIG5vdCBoYXZlCi07IHRoZSBlcnJvciBjb2RlIGFuZCB0aGUgZWZsYWdzIHdpbGwgYmUgYXQgb2Zmc2V0IDguCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NmYXIgICAgUEZfaGFuZGxlcjY0awotCi07IENoZWNrIGlmIHRoaXMgaXMgYSBwcm9jZXNzb3IgZXhlY2VwdGlvbiBvciBhIHBhZ2UgZmF1bHQKLQotICAgICAgICBwdXNoICAgIGVheAotICAgICAgICBtb3YgICAgIGF4LFtjczpWYWxpZENTXSAgICAgOyBVc2UgQ1Mgb3ZlcnJpZGUgdG8gYWNjZXNzIGRhdGEKLSAgICAgICAgY21wICAgICBbc3M6ZXNwKzEyXSxheCAgICAgIDsgSXMgdGhpcyBhIHBhZ2UgZmF1bHQ/Ci0gICAgICAgIGpuZSAgICAgQEBUb09sZEhhbmRsZXIgICAgICA7IE5vcGUsIGp1bXAgdG8gdGhlIHByZXZpb3VzIGhhbmRsZXIKLQotOyBHZXQgYWRkcmVzcyBvZiBwYWdlIGZhdWx0IGFuZCBjaGVjayBpZiB3aXRoaW4gb3VyIGhhbmRsZXJzIHJhbmdlCi0KLSAgICAgICAgbW92ICAgICBlYXgsY3IyICAgICAgICAgICAgIDsgRUJYIGhhcyBwYWdlIGZhdWx0IGxpbmVhciBhZGRyZXNzCi0gICAgICAgIGNtcCAgICAgZWF4LFZGTEFUX1NUQVJUICAgICA7IElzIHRoZSBmYXVsdCBsZXNzIHRoYW4gb3Vycz8KLSAgICAgICAgamIgICAgICBAQFRvT2xkSGFuZGxlciAgICAgIDsgWWVwLCBnbyB0byBwcmV2aW91cyBoYW5kbGVyCi0gICAgICAgIGNtcCAgICAgZWF4LFZGTEFUX0VORCAgICAgICA7IElzIHRoZSBmYXVsdCBtb3JlIHRoYW4gb3Vycz8KLSAgICAgICAgamFlICAgICBAQFRvT2xkSGFuZGxlciAgICAgIDsgWWVwLCBnbyB0byBwcmV2aW91cyBoYW5kbGVyCi0KLTsgVGhpcyBpcyBvdXIgcGFnZSBmYXVsdCwgc28gd2UgbmVlZCB0byBoYW5kbGUgaXQKLQotICAgICAgICBwdXNoYWQKLSAgICAgICAgcHVzaCAgICBkcwotICAgICAgICBwdXNoICAgIGVzCi0gICAgICAgIG1vdiAgICAgZWJ4LGVheCAgICAgICAgICAgICA7IEVCWCA6PSBwYWdlIGZhdWx0IGFkZHJlc3MKLSAgICAgICAgYW5kICAgICBlYngsaW52ZXJ0IDBGRkZGaCAgIDsgTWFzayB0byA2NGsgYmFuayBib3VuZGFyeQotICAgICAgICBtb3YgICAgIGRzLFtjczpfUE1fc2F2ZWREU107IExvYWQgc2VnbWVudCByZWdpc3RlcnMKLSAgICAgICAgbW92ICAgICBlcyxbY3M6X1BNX3NhdmVkRFNdCi0KLTsgTWFwIGluIHRoZSBwYWdlIHRhYmxlIGZvciBvdXIgdmlydHVhbCBmcmFtZWJ1ZmZlciBhcmVhIGZvciBtb2RpZmljYXRpb24KLQotICAgICAgICBtb3YgICAgIGVkaSxbUERCUl0gICAgICAgICAgOyBFREkgcG9pbnRzIHRvIHBhZ2UgZGlyZWN0b3J5Ci0gICAgICAgIG1vdiAgICAgZWR4LGVieCAgICAgICAgICAgICA7IEVEWCA9IGxpbmVhciBhZGRyZXNzCi0gICAgICAgIHNociAgICAgZWR4LDIyICAgICAgICAgICAgICA7IEVEWCA9IG9mZnNldCB0byBwYWdlIGRpcmVjdG9yeQotICAgICAgICBtb3YgICAgIGVkeCxbZWR4KjQrZWRpXSAgICAgOyBFRFggPSBwaHlzaWNhbCBwYWdlIHRhYmxlIGFkZHJlc3MKLSAgICAgICAgbW92ICAgICBlYXgsZWR4Ci0gICAgICAgIG1vdiAgICAgZWR4LFthY2Nlc3NQYWdlVGFibGVdCi0gICAgICAgIG9yICAgICAgZWF4LDcKLSAgICAgICAgbW92ICAgICBbZWR4XSxlYXgKLSAgICAgICAgbW92ICAgICBlYXgsY3IzCi0gICAgICAgIG1vdiAgICAgY3IzLGVheCAgICAgICAgICAgICA7IFVwZGF0ZSBwYWdlIHRhYmxlIGNhY2hlCi0KLTsgTWFyayBhbGwgcGFnZXMgdmFsaWQgZm9yIHRoZSBuZXcgcGFnZSBmYXVsdCBhcmVhCi0KLSAgICAgICAgbW92ICAgICBlc2ksZWJ4ICAgICAgICAgICAgIDsgRVNJIDo9IGxpbmVhciBhZGRyZXNzIGZvciBwYWdlCi0gICAgICAgIHNociAgICAgZXNpLDEwCi0gICAgICAgIGFuZCAgICAgZXNpLDBGRkZoICAgICAgICAgICA7IE9mZnNldCBpbnRvIHBhZ2UgdGFibGUKLSAgICAgICAgYWRkICAgICBlc2ksW2FjY2Vzc1BhZ2VBZGRyXQotaWZkZWYgICBVU0VfTkFTTQotJWFzc2lnbiBvZmYgMAotJXJlcCAxNgotICAgICAgICBvciAgICAgIFtEV09SRCBlc2krb2ZmXSwwMDAwMDAwMDAxaCA7IEVuYWJsZSBwYWdlcwotJWFzc2lnbiBvZmYgb2ZmKzQKLSVlbmRyZXAKLWVsc2UKLW9mZiA9IDAKLVJFUFQgICAgMTYKLSAgICAgICAgb3IgICAgICBbRFdPUkQgZXNpK29mZl0sMDAwMDAwMDAwMWggOyBFbmFibGUgcGFnZXMKLW9mZiA9IG9mZis0Ci1FTkRNCi1lbmRpZgotCi07IE1hcmsgYWxsIHBhZ2VzIGludmFsaWQgZm9yIHRoZSBwcmV2aW91c2x5IG1hcHBlZCBhcmVhCi0KLSAgICAgICAgeGNoZyAgICBlc2ksW0xhc3RQYWdlXSAgICAgIDsgU2F2ZSBsYXN0IHBhZ2UgZm9yIG5leHQgcGFnZSBmYXVsdAotICAgICAgICB0ZXN0ICAgIGVzaSxlc2kKLSAgICAgICAganogICAgICBAQERvbmVNYXBwaW5nICAgICAgIDsgRG9udCB1cGRhdGUgaWYgZmlyc3QgdGltZSByb3VuZAotaWZkZWYgICBVU0VfTkFTTQotJWFzc2lnbiBvZmYgMAotJXJlcCAxNgotICAgICAgICBvciAgICAgIFtEV09SRCBlc2krb2ZmXSwwRkZGRkZGRkVoICA7IERpc2FibGUgcGFnZXMKLSVhc3NpZ24gb2ZmIG9mZis0Ci0lZW5kcmVwCi1lbHNlCi1vZmYgPSAwCi1SRVBUICAgIDE2Ci0gICAgICAgIGFuZCAgICAgW0RXT1JEIGVzaStvZmZdLDBGRkZGRkZGRWggIDsgRGlzYWJsZSBwYWdlcwotb2ZmID0gb2ZmKzQKLUVORE0KLWVuZGlmCi0KLUBARG9uZU1hcHBpbmc6Ci0gICAgICAgIG1vdiAgICAgZWF4LGNyMwotICAgICAgICBtb3YgICAgIGNyMyxlYXggICAgICAgICAgICAgOyBGbHVzaCB0aGUgVExCCi0KLTsgTm93IHByb2dyYW0gdGhlIG5ldyBTdXBlclZHQSBzdGFydGluZyBiYW5rIGFkZHJlc3MKLQotICAgICAgICBtb3YgICAgIGVheCxlYnggICAgICAgICAgICAgOyBFQVggOj0gcGFnZSBmYXVsdCBhZGRyZXNzCi0gICAgICAgIHNociAgICAgZWF4LDE2Ci0gICAgICAgIGFuZCAgICAgZWF4LDBGRmggICAgICAgICAgICA7IE1hc2sgdG8gMC0yNTUKLSAgICAgICAgY2FsbCAgICBbQmFua0Z1bmNQdHJdICAgICAgIDsgQ2FsbCB0aGUgYmFuayBzd2l0Y2ggZnVuY3Rpb24KLQotICAgICAgICBwb3AgICAgIGVzCi0gICAgICAgIHBvcCAgICAgZHMKLSAgICAgICAgcG9wYWQKLSAgICAgICAgcG9wICAgICBlYXgKLSAgICAgICAgYWRkICAgICBlc3AsNCAgICAgICAgICAgICAgIDsgUG9wIHRoZSBlcnJvciBjb2RlIGZyb20gc3RhY2sKLSAgICAgICAgaXJldGQgICAgICAgICAgICAgICAgICAgICAgIDsgUmV0dXJuIHRvIGZhdWx0aW5nIGluc3RydWN0aW9uCi0KLUBAVG9PbGRIYW5kbGVyOgotICAgICAgICBwb3AgICAgIGVheAotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBqbXAgZmFyIGR3b3JkIFtjczpJTlQxNEdhdGVdOyBDaGFpbiB0byBwcmV2aW91cyBoYW5kbGVyCi1lbHNlCi0gICAgICAgIGptcCAgICAgW0ZXT1JEIGNzOklOVDE0R2F0ZV07IENoYWluIHRvIHByZXZpb3VzIGhhbmRsZXIKLWVuZGlmCi0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFBGX2hhbmRsZXI0ayAgLSBQYWdlIGZhdWx0IGhhbmRsZXIgZm9yIDRrIGJhbmtzCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBUaGUgaGFuZGxlciBiZWxvdyBpcyBhIDMyIGJpdCByaW5nIDAgcGFnZSBmYXVsdCBoYW5kbGVyLiAgSXQgcmVjZWl2ZXMKLTsgY29udHJvbCBpbW1lZGlhdGVseSBhZnRlciBhbnkgcGFnZSBmYXVsdCBvciBhZnRlciBhbiBJUlE2IChoYXJkd2FyZQotOyBpbnRlcnJ1cHQpLiBUaGlzIHByb3ZpZGVzIHRoZSBmYXN0ZXN0IHBvc3NpYmxlIGhhbmRsaW5nIG9mIHBhZ2UgZmF1bHRzCi07IHNpbmNlIGl0IGp1bXAgZGlyZWN0bHkgaGVyZS4gIElmIHRoaXMgaXMgYSBwYWdlIGZhdWx0LCB0aGUgbnVtYmVyCi07IGltbWVkaWF0ZWx5IG9uIHRoZSBzdGFjayB3aWxsIGJlIGFuIGVycm9yIGNvZGUsIGF0IG9mZnNldCA0IHdpbGwgYmUKLTsgdGhlIGVpcCBvZiB0aGUgZmF1bHRpbmcgaW5zdHJ1Y3Rpb24sIGF0IG9mZnNldCA4IHdpbGwgYmUgdGhlIGNzIG9mIHRoZQotOyBmYXVsdGluZyBpbnN0cnVjdGlvbi4gIElmIGl0IGlzIGEgaGFyZHdhcmUgaW50ZXJydXB0LCBpdCB3aWxsIG5vdCBoYXZlCi07IHRoZSBlcnJvciBjb2RlIGFuZCB0aGUgZWZsYWdzIHdpbGwgYmUgYXQgb2Zmc2V0IDguCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NmYXIgICAgUEZfaGFuZGxlcjRrCi0KLTsgRmlsbCBpbiB3aGVuIHdlIGhhdmUgdGVzdGVkIGFsbCB0aGUgNjRLYiBjb2RlCi0KLWlmZGVmICAgVVNFX05BU00KLSAgICAgICAgam1wIGZhciBkd29yZCBbY3M6SU5UMTRHYXRlXTsgQ2hhaW4gdG8gcHJldmlvdXMgaGFuZGxlcgotZWxzZQotICAgICAgICBqbXAgICAgIFtGV09SRCBjczpJTlQxNEdhdGVdOyBDaGFpbiB0byBwcmV2aW91cyBoYW5kbGVyCi1lbmRpZgotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIEluc3RhbGxGYXVsdEhhbmRsZXIodm9pZCAqYmFzZUFkZHIsaW50IGJhbmtTaXplKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSW5zdGFsbGVzIHRoZSBwYWdlIGZhdWx0IGhhbmRsZXIgZGlyZWN0bHkgaW50IHRoZSBpbnRlcnJ1cHQgZGVzY3JpcHRvcgotOyB0YWJsZSBmb3IgbWF4aW11bSBwZXJmb3JtYW5jZS4gVGhpcyBvZiBjb3Vyc2UgcmVxdWlyZXMgcmluZyAwIGFjY2VzcywKLTsgYnV0IG5vbmUgb2YgdGhpcyBzdHVmZiB3aWxsIHJ1biB3aXRob3V0IHJpbmcgMCEKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBJbnN0YWxsRmF1bHRIYW5kbGVyCi0KLSAgICAgICAgQVJHICAgICBiYXNlQWRkcjpVTE9ORywgYmFua1NpemU6VUlOVAotCi0gICAgICAgIGVudGVyX2MKLQotICAgICAgICBtb3YgICAgIFtEV09SRCBMYXN0UGFnZV0sMCAgOyBObyBwYWdlcyBoYXZlIGJlZW4gbWFwcGVkCi0gICAgICAgIG1vdiAgICAgYXgsY3MKLSAgICAgICAgbW92ICAgICBbVmFsaWRDU10sYXggICAgICAgIDsgU2F2ZSBDUyB2YWx1ZSBmb3IgcGFnZSBmYXVsdHMKLQotOyBQdXQgYWRkcmVzcyBvZiBvdXIgcGFnZSBmYXVsdCBoYW5kbGVyIGludG8gdGhlIElEVCBkaXJlY3RseQotCi0gICAgICAgIHN1YiAgICAgZXNwLDYgICAgICAgICAgICAgICA7IEFsbG9jYXRlIHNwYWNlIG9uIHN0YWNrCi1pZmRlZiAgIFVTRV9OQVNNCi0gICAgICAgIHNpZHQgICAgW3NzOmVzcF0gICAgICAgICAgICA7IFN0b3JlIHBvaW50ZXIgdG8gSURUCi1lbHNlCi0gICAgICAgIHNpZHQgICAgW0ZXT1JEIHNzOmVzcF0gICAgICA7IFN0b3JlIHBvaW50ZXIgdG8gSURUCi1lbmRpZgotICAgICAgICBwb3AgICAgIGF4ICAgICAgICAgICAgICAgICAgOyBhZGQgZXNwLDIKLSAgICAgICAgcG9wICAgICBlYXggICAgICAgICAgICAgICAgIDsgQWJzb2x1dGUgYWRkcmVzcyBvZiBJRFQKLSAgICAgICAgYWRkICAgICBlYXgsMTQqOCAgICAgICAgICAgIDsgUG9pbnQgdG8gSW50ICMxNAotCi07IE5vdGUgdGhhdCBJbnRlcnJ1cHQgZ2F0ZXMgZG8gbm90IGhhdmUgdGhlIGhpZ2ggYW5kIGxvdyB3b3JkIG9mIHRoZQotOyBvZmZzZXQgaW4gYWRqYWNlbnQgd29yZHMgaW4gbWVtb3J5LCB0aGVyZSBhcmUgNCBieXRlcyBzZXBhcmF0aW5nIHRoZW0uCi0KLSAgICAgICAgbW92ICAgICBlY3gsW2VheF0gICAgICAgICAgIDsgR2V0IGNzIGFuZCBsb3cgMTYgYml0cyBvZiBvZmZzZXQKLSAgICAgICAgbW92ICAgICBlZHgsW2VheCs2XSAgICAgICAgIDsgR2V0IGhpZ2ggMTYgYml0cyBvZiBvZmZzZXQgaW4gZHgKLSAgICAgICAgc2hsICAgICBlZHgsMTYKLSAgICAgICAgbW92ICAgICBkeCxjeCAgICAgICAgICAgICAgIDsgZWR4IGhhcyBvZmZzZXQKLSAgICAgICAgbW92ICAgICBbSU5UMTRPZmZzZXRdLGVkeCAgIDsgU2F2ZSBvZmZzZXQKLSAgICAgICAgc2hyICAgICBlY3gsMTYKLSAgICAgICAgbW92ICAgICBbSU5UMTRTZWxlY3Rvcl0sY3ggIDsgU2F2ZSBvcmlnaW5hbCBjcwotICAgICAgICBtb3YgICAgIFtlYXgrMl0sY3MgICAgICAgICAgOyBJbnN0YWxsIG5ldyBjcwotICAgICAgICBtb3YgICAgIGVkeCxvZmZzZXQgUEZfaGFuZGxlcjY0awotICAgICAgICBjbXAgICAgIFtVSU5UIGJhbmtTaXplXSw0Ci0gICAgICAgIGpuZSAgICAgQEAxCi0gICAgICAgIG1vdiAgICAgZWR4LG9mZnNldCBQRl9oYW5kbGVyNGsKLUBAMTogICAgbW92ICAgICBbZWF4XSxkeCAgICAgICAgICAgIDsgSW5zdGFsbCBsb3cgd29yZCBvZiBvZmZzZXQKLSAgICAgICAgc2hyICAgICBlZHgsMTYKLSAgICAgICAgbW92ICAgICBbZWF4KzZdLGR4ICAgICAgICAgIDsgSW5zdGFsbCBoaWdoIHdvcmQgb2Ygb2Zmc2V0Ci0KLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBSZW1vdmVGYXVsdEhhbmRsZXIodm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENsb3NlcyBkb3duIHRoZSB2aXJ0dWFsIGZyYW1lYnVmZmVyIHNlcnZpY2VzIGFuZCByZXN0b3JlcyB0aGUgcHJldmlvdXMKLTsgcGFnZSBmYXVsdCBoYW5kbGVyLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFJlbW92ZUZhdWx0SGFuZGxlcgotCi0gICAgICAgIGVudGVyX2MKLQotOyBSZW1vdmUgcGFnZSBmYXVsdCBoYW5kbGVyIGZyb20gSURUCi0KLSAgICAgICAgc3ViICAgICBlc3AsNiAgICAgICAgICAgICAgIDsgQWxsb2NhdGUgc3BhY2Ugb24gc3RhY2sKLWlmZGVmICAgVVNFX05BU00KLSAgICAgICAgc2lkdCAgICBbc3M6ZXNwXSAgICAgICAgICAgIDsgU3RvcmUgcG9pbnRlciB0byBJRFQKLWVsc2UKLSAgICAgICAgc2lkdCAgICBbRldPUkQgc3M6ZXNwXSAgICAgIDsgU3RvcmUgcG9pbnRlciB0byBJRFQKLWVuZGlmCi0KLSAgICAgICAgcG9wICAgICBheCAgICAgICAgICAgICAgICAgIDsgYWRkIGVzcCwyCi0gICAgICAgIHBvcCAgICAgZWF4ICAgICAgICAgICAgICAgICA7IEFic29sdXRlIGFkZHJlc3Mgb2YgSURUCi0gICAgICAgIGFkZCAgICAgZWF4LDE0KjggICAgICAgICAgICA7IFBvaW50IHRvIEludCAjMTQKLSAgICAgICAgbW92ICAgICBjeCxbSU5UMTRTZWxlY3Rvcl0KLSAgICAgICAgbW92ICAgICBbZWF4KzJdLGN4ICAgICAgICAgIDsgUmVzdG9yZSBvcmlnaW5hbCBDUwotICAgICAgICBtb3YgICAgIGVkeCxbSU5UMTRPZmZzZXRdCi0gICAgICAgIG1vdiAgICAgW2VheF0sZHggICAgICAgICAgICA7IEluc3RhbGwgbG93IHdvcmQgb2Ygb2Zmc2V0Ci0gICAgICAgIHNociAgICAgZWR4LDE2Ci0gICAgICAgIG1vdiAgICAgW2VheCs2XSxkeCAgICAgICAgICA7IEluc3RhbGwgaGlnaCB3b3JkIG9mIG9mZnNldAotCi0gICAgICAgIGxlYXZlX2MKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgSW5zdGFsbEJhbmtGdW5jKGludCBjb2RlTGVuLHZvaWQgKmJhbmtGdW5jKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSW5zdGFsbHMgdGhlIGJhbmsgc3dpdGNoIGZ1bmN0aW9uIGJ5IHJlbG9jYXRpbmcgaXQgaW50byBvdXIgZGF0YSBzZWdtZW50Ci07IGFuZCBtYWtpbmcgaXQgaW50byBhIGNhbGxhYmxlIGZ1bmN0aW9uLiBXZSBkbyBpdCB0aGlzIHdheSB0byBtYWtlIHRoZQotOyBjb2RlIGlkZW50aWNhbCB0byB0aGUgd2F5IHRoYXQgdGhlIFZmbGF0RCBkZXZpY2VzIHdvcmsgdW5kZXIgV2luZG93cy4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBJbnN0YWxsQmFua0Z1bmMKLQotICAgICAgICBBUkcgICAgIGNvZGVMZW46VUlOVCwgYmFua0Z1bmM6RFBUUgotCi0gICAgICAgIGVudGVyX2MKLQotICAgICAgICBtb3YgICAgIGVzaSxbYmFua0Z1bmNdICAgICAgOyBDb3B5IHRoZSBjb2RlIGludG8gYnVmZmVyCi0gICAgICAgIG1vdiAgICAgZWRpLG9mZnNldCBCYW5rRnVuY0J1ZgotICAgICAgICBtb3YgICAgIGVjeCxbY29kZUxlbl0KLSAgICByZXAgbW92c2IKLSAgICAgICAgbW92ICAgICBbQllURSBlZGldLDBDM2ggICAgIDsgVGVybWluYXRlIHRoZSBmdW5jdGlvbiB3aXRoIGEgbmVhciByZXQKLQotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpbnQgSW5pdFBhZ2luZyh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSW5pdGlhbGl6ZXMgcGFnaW5nIHN5c3RlbS4gSWYgcGFnaW5nIGlzIG5vdCBlbmFibGVkLCBidWlsZHMgYSBwYWdlIHRhYmxlCi07IGRpcmVjdG9yeSBhbmQgcGFnZSB0YWJsZXMgZm9yIHBoeXNpY2FsIG1lbW9yeQotOwotOyAgIEV4aXQ6ICAgICAgIDAgICAtIFN1Y2Nlc3NmdWwKLTsgICAgICAgICAgICAgICAtMSAgLSBDb3VsZG4ndCBpbml0aWFsaXplIHBhZ2luZyBtZWNoYW5pc20KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBJbml0UGFnaW5nCi0KLSAgICAgICAgcHVzaCAgICBlYngKLSAgICAgICAgcHVzaCAgICBlY3gKLSAgICAgICAgcHVzaCAgICBlZHgKLSAgICAgICAgcHVzaCAgICBlc2kKLSAgICAgICAgcHVzaCAgICBlZGkKLQotOyBBcmUgd2UgcnVubmluZyB1bmRlciBDYXVzZVdheT8KLQotICAgICAgICBtb3YgICAgIGF4LDBGRkY5aAotICAgICAgICBpbnQgICAgIDMxaAotICAgICAgICBqYyAgICAgIEBATm90Q2F1c2V3YXkKLSAgICAgICAgY21wICAgICBlY3gsIkNBVVMiCi0gICAgICAgIGpueiAgICAgQEBOb3RDYXVzZXdheQotICAgICAgICBjbXAgICAgIGVkeCwiRVdBWSIKLSAgICAgICAgam56ICAgICBAQE5vdENhdXNld2F5Ci0KLSAgICAgICAgbW92ICAgICBbQk9PTCBWRl9oYXZlQ2F1c2VXYXldLDEKLSAgICAgICAgbW92ICAgICBbQ2F1c2VXYXlESVJMaW5lYXJdLGVzaQotICAgICAgICBtb3YgICAgIFtDYXVzZVdheTFzdExpbmVhcl0sZWRpCi0KLTsgQ2hlY2sgZm9yIERQTUkKLQotICAgICAgICBtb3YgICAgIGF4LDBmZjAwaAotICAgICAgICBwdXNoICAgIGVzCi0gICAgICAgIGludCAgICAgMzFoCi0gICAgICAgIHBvcCAgICAgZXMKLSAgICAgICAgc2hyICAgICBlZGksMgotICAgICAgICBhbmQgICAgIGVkaSwzCi0gICAgICAgIGNtcCAgICAgZWRpLDIKLSAgICAgICAganogICAgICBAQEVyckV4aXQgICAgICAgICAgICAgICA7IE5vdCBzdXBwb3J0ZWQgdW5kZXIgRFBNSQotCi0gICAgICAgIG1vdiAgICAgZWF4LFtDYXVzZVdheURJUkxpbmVhcl0KLSAgICAgICAgam1wICAgICBAQENvcHlDUjMKLQotQEBOb3RDYXVzZXdheToKLSAgICAgICAgbW92ICAgICBheCxjcwotICAgICAgICB0ZXN0ICAgIGF4LDMgICAgICAgICAgICAgICAgICAgIDsgV2hpY2ggcmluZyBhcmUgd2UgcnVubmluZwotICAgICAgICBqbnogICAgIEBARXJyRXhpdCAgICAgICAgICAgICAgIDsgTmVlZHMgemVybyByaW5nIHRvIGFjY2VzcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcGFnZSB0YWJsZXMgKENSMykKLSAgICAgICAgbW92ICAgICBlYXgsY3IwICAgICAgICAgICAgICAgICA7IExvYWQgQ1IwCi0gICAgICAgIHRlc3QgICAgZWF4LDgwMDAwMDAwaCAgICAgICAgICAgOyBJcyBwYWdpbmcgZW5hYmxlZD8KLSAgICAgICAganogICAgICBAQEVyckV4aXQgICAgICAgICAgICAgICA7IE5vLCB3ZSBtdXN0IGhhdmUgcGFnaW5nIQotCi0gICAgICAgIG1vdiAgICAgZWF4LGNyMyAgICAgICAgICAgICAgICAgOyBMb2FkIGRpcmVjdG9yeSBhZGRyZXNzCi0gICAgICAgIGFuZCAgICAgZWF4LDBGRkZGRjAwMGgKLQotQEBDb3B5Q1IzOgotICAgICAgICBtb3YgICAgIFtQREJSXSxlYXggICAgICAgICAgICAgIDsgU2F2ZSBpdAotICAgICAgICBtb3YgICAgIGVzaSxlYXgKLSAgICAgICAgbW92ICAgICBlZGksb2Zmc2V0IHBhZ2VEaXJlY3RvcnkKLSAgICAgICAgbW92ICAgICBlY3gsMTAyNAotICAgICAgICBjbGQKLSAgICAgICAgcmVwICAgICBtb3ZzZCAgICAgICAgICAgICAgICAgICA7IENvcHkgdGhlIG9yaWdpbmFsIHBhZ2UgdGFibGUgZGlyZWN0b3J5Ci0gICAgICAgIGNtcCAgICAgW0RXT1JEIGFjY2Vzc1BhZ2VBZGRyXSwwOyBDaGVjayBpZiB3ZSBoYXZlIGFsbG9jYXRlZCBwYWdlCi0gICAgICAgIGpuZSAgICAgQEBIYXZlUmVhbE1lbSAgICAgICAgICAgOyB0YWJsZSBhbHJlYWR5ICh3ZSBjYW50IGZyZWUgaXQpCi0KLSAgICAgICAgbW92ICAgICBlYXgsMDEwMGggICAgICAgICAgICAgICA7IERQTUkgRE9TIGFsbG9jYXRlCi0gICAgICAgIG1vdiAgICAgZWJ4LDgxOTIvMTYKLSAgICAgICAgaW50ICAgICAzMWggICAgICAgICAgICAgICAgICAgICA7IEFsbG9jYXRlIDgxOTIgYnl0ZXMKLSAgICAgICAgYW5kICAgICBlYXgsMEZGRkZoCi0gICAgICAgIHNobCAgICAgZWF4LDQgICAgICAgICAgICAgICAgICAgOyBFQVggcG9pbnRzIHRvIG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkKLSAgICAgICAgYWRkICAgICBlYXgsNDA5NQotICAgICAgICBhbmQgICAgIGVheCwwRkZGRkYwMDBoICAgICAgICAgIDsgUGFnZSBhbGlnbgotICAgICAgICBtb3YgICAgIFthY2Nlc3NQYWdlQWRkcl0sZWF4Ci0KLUBASGF2ZVJlYWxNZW06Ci0gICAgICAgIG1vdiAgICAgZWF4LFthY2Nlc3NQYWdlQWRkcl0gICAgOyBFQVggLT4gcGFnZSB0YWJsZSBpbiAxc3QgTWIKLSAgICAgICAgc2hyICAgICBlYXgsMTIKLSAgICAgICAgYW5kICAgICBlYXgsM0ZGaCAgICAgICAgICAgICAgICA7IFBhZ2UgdGFibGUgb2Zmc2V0Ci0gICAgICAgIHNobCAgICAgZWF4LDIKLSAgICAgICAgY21wICAgICBbQk9PTCBWRl9oYXZlQ2F1c2VXYXldLDAKLSAgICAgICAganogICAgICBAQE5vdENXMAotICAgICAgICBtb3YgICAgIGVieCxbQ2F1c2VXYXkxc3RMaW5lYXJdCi0gICAgICAgIGptcCAgICAgQEBQdXQxc3QKLQotQEBOb3RDVzA6Ci0gICAgICAgIG1vdiAgICAgZWJ4LFtQREJSXQotICAgICAgICBtb3YgICAgIGVieCxbZWJ4XQotICAgICAgICBhbmQgICAgIGVieCwwRkZGRkYwMDBoICAgICAgICAgIDsgUGFnZSB0YWJsZSBmb3IgMXN0IG1lZ2FieXRlCi0KLUBAUHV0MXN0OgotICAgICAgICBhZGQgICAgIGVheCxlYngKLSAgICAgICAgbW92ICAgICBbYWNjZXNzUGFnZVRhYmxlXSxlYXgKLSAgICAgICAgc3ViICAgICBlYXgsZWF4ICAgICAgICAgICAgICAgICA7IE5vIGVycm9yCi0gICAgICAgIGptcCAgICAgQEBFeGl0Ci0KLUBARXJyRXhpdDoKLSAgICAgICAgbW92ICAgICBlYXgsLTEKLQotQEBFeGl0OiBwb3AgICAgIGVkaQotICAgICAgICBwb3AgICAgIGVzaQotICAgICAgICBwb3AgICAgIGVkeAotICAgICAgICBwb3AgICAgIGVjeAotICAgICAgICBwb3AgICAgIGVieAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBDbG9zZVBhZ2luZyh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ2xvc2VzIHRoZSBwYWdpbmcgc3lzdGVtCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgQ2xvc2VQYWdpbmcKLQotICAgICAgICBwdXNoICAgIGVheAotICAgICAgICBwdXNoICAgIGVjeAotICAgICAgICBwdXNoICAgIGVkeAotICAgICAgICBwdXNoICAgIGVzaQotICAgICAgICBwdXNoICAgIGVkaQotCi0gICAgICAgIG1vdiAgICAgZWF4LFthY2Nlc3NQYWdlQWRkcl0KLSAgICAgICAgY2FsbCAgICBBY2Nlc3NQYWdlICAgICAgICAgICAgICA7IFJlc3RvcmUgQWNjZXNzUGFnZSBtYXBwaW5nCi0gICAgICAgIG1vdiAgICAgZWRpLFtQREJSXQotICAgICAgICBtb3YgICAgIGVzaSxvZmZzZXQgcGFnZURpcmVjdG9yeQotICAgICAgICBtb3YgICAgIGVjeCwxMDI0Ci0gICAgICAgIGNsZAotICAgICAgICByZXAgICAgIG1vdnNkICAgICAgICAgICAgICAgICAgIDsgUmVzdG9yZSB0aGUgb3JpZ2luYWwgcGFnZSB0YWJsZSBkaXJlY3RvcnkKLQotQEBFeGl0OiBwb3AgICAgIGVkaQotICAgICAgICBwb3AgICAgIGVzaQotICAgICAgICBwb3AgICAgIGVkeAotICAgICAgICBwb3AgICAgIGVjeAotICAgICAgICBwb3AgICAgIGVheAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgbG9uZyBBY2Nlc3NQYWdlKGxvbmcgcGh5cykKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IE1hcHMgYSBrbm93biBwYWdlIHRvIGdpdmVuIHBoeXNpY2FsIG1lbW9yeQotOyAgIEVudHJ5OiAgICAgIEVBWCAtIFBoeXNpY2FsIG1lbW9yeQotOyAgIEV4aXQ6ICAgICAgIEVBWCAtIExpbmVhciBtZW1vcnkgYWRkcmVzcyBvZiBtYXBwZWQgcGh5cyBtZW0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXRpYyAgICAgQWNjZXNzUGFnZQotCi0gICAgICAgIHB1c2ggICAgZWR4Ci0gICAgICAgIG1vdiAgICAgZWR4LFthY2Nlc3NQYWdlVGFibGVdCi0gICAgICAgIG9yICAgICAgZWF4LDcKLSAgICAgICAgbW92ICAgICBbZWR4XSxlYXgKLSAgICAgICAgbW92ICAgICBlYXgsY3IzCi0gICAgICAgIG1vdiAgICAgY3IzLGVheCAgICAgICAgICAgICAgICAgOyBVcGRhdGUgcGFnZSB0YWJsZSBjYWNoZQotICAgICAgICBtb3YgICAgIGVheCxbYWNjZXNzUGFnZUFkZHJdCi0gICAgICAgIHBvcCAgICAgZWR4Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBsb25nIEdldFBoeXNpY2FsQWRkcmVzcyhsb25nIGxpbmVhcikKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJldHVybnMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgbGluZWFyIGFkZHJlc3MKLTsgICBFbnRyeTogICAgICBFQVggLSBMaW5lYXIgYWRkcmVzcyB0byBjb252ZXJ0Ci07ICAgRXhpdDogICAgICAgRUFYIC0gUGh5c2ljYWwgYWRkcmVzcwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhdGljICAgICBHZXRQaHlzaWNhbEFkZHJlc3MKLQotICAgICAgICBwdXNoICAgIGVieAotICAgICAgICBwdXNoICAgIGVkeAotICAgICAgICBtb3YgICAgIGVkeCxlYXgKLSAgICAgICAgc2hyICAgICBlZHgsMjIgICAgICAgICAgICAgICAgICA7IEVEWCBpcyB0aGUgZGlyZWN0b3J5IG9mZnNldAotICAgICAgICBtb3YgICAgIGVieCxbUERCUl0KLSAgICAgICAgbW92ICAgICBlZHgsW2VkeCo0K2VieF0gICAgICAgICA7IExvYWQgcGFnZSB0YWJsZSBhZGRyZXNzCi0gICAgICAgIHB1c2ggICAgZWF4Ci0gICAgICAgIG1vdiAgICAgZWF4LGVkeAotICAgICAgICBjYWxsICAgIEFjY2Vzc1BhZ2UgICAgICAgICAgICAgIDsgQWNjZXNzIHRoZSBwYWdlIHRhYmxlCi0gICAgICAgIG1vdiAgICAgZWR4LGVheAotICAgICAgICBwb3AgICAgIGVheAotICAgICAgICBzaHIgICAgIGVheCwxMgotICAgICAgICBhbmQgICAgIGVheCwwM0ZGaCAgICAgICAgICAgICAgIDsgRUFYIG9mZnNldCBpbnRvIHBhZ2UgdGFibGUKLSAgICAgICAgbW92ICAgICBlYXgsW2VkeCtlYXgqNF0gICAgICAgICA7IExvYWQgcGh5c2ljYWwgYWRkcmVzcwotICAgICAgICBhbmQgICAgIGVheCwwRkZGRkYwMDBoCi0gICAgICAgIHBvcCAgICAgZWR4Ci0gICAgICAgIHBvcCAgICAgZWJ4Ci0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIENyZWF0ZVBhZ2VUYWJsZShsb25nIHBhZ2VERW50cnkpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDcmVhdGVzIGEgcGFnZSB0YWJsZSBmb3Igc3BlY2lmaWMgYWRkcmVzcyAoNE1CKQotOyAgICAgICBFbnRyeTogIEVBWCAtIFBhZ2UgZGlyZWN0b3J5IGVudHJ5ICh0b3AgMTAtYml0cyBvZiBhZGRyZXNzKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhdGljICAgICBDcmVhdGVQYWdlVGFibGUKLQotICAgICAgICBwdXNoICAgIGVieAotICAgICAgICBwdXNoICAgIGVjeAotICAgICAgICBwdXNoICAgIGVkeAotICAgICAgICBwdXNoICAgIGVkaQotICAgICAgICBtb3YgICAgIGVieCxlYXggICAgICAgICAgICAgICAgIDsgU2F2ZSBhZGRyZXNzCi0gICAgICAgIG1vdiAgICAgZWF4LDgxOTIKLSAgICAgICAgcHVzaCAgICBlYXgKLSAgICAgICAgY2FsbCAgICBWRl9tYWxsb2MgICAgICAgICAgICAgIDsgQWxsb2NhdGUgcGFnZSB0YWJsZSBkaXJlY3RvcnkKLSAgICAgICAgYWRkICAgICBlc3AsNAotICAgICAgICBhZGQgICAgIGVheCwwRkZGaAotICAgICAgICBhbmQgICAgIGVheCwwRkZGRkYwMDBoICAgICAgICAgIDsgUGFnZSBhbGlnbiAoNEtCKQotICAgICAgICBtb3YgICAgIGVkaSxlYXggICAgICAgICAgICAgICAgIDsgU2F2ZSBwYWdlIHRhYmxlIGxpbmVhciBhZGRyZXNzCi0gICAgICAgIHN1YiAgICAgZWF4LGVheCAgICAgICAgICAgICAgICAgOyBGaWxsIHdpdGggemVybwotICAgICAgICBtb3YgICAgIGVjeCwxMDI0Ci0gICAgICAgIGNsZAotICAgICAgICByZXAgICAgIHN0b3NkICAgICAgICAgICAgICAgICAgIDsgQ2xlYXIgcGFnZSB0YWJsZQotICAgICAgICBzdWIgICAgIGVkaSw0MDk2Ci0gICAgICAgIG1vdiAgICAgZWF4LGVkaQotICAgICAgICBjYWxsICAgIEdldFBoeXNpY2FsQWRkcmVzcwotICAgICAgICBtb3YgICAgIGVkeCxbUERCUl0KLSAgICAgICAgb3IgICAgICBlYXgsNyAgICAgICAgICAgICAgICAgICA7IFByZXNlbnQvd3JpdGUvdXNlciBiaXQKLSAgICAgICAgbW92ICAgICBbZWR4K2VieCo0XSxlYXggICAgICAgICA7IFNhdmUgcGh5c2ljYWwgYWRkcmVzcyBpbnRvIHBhZ2UgZGlyZWN0b3J5Ci0gICAgICAgIG1vdiAgICAgZWF4LGNyMwotICAgICAgICBtb3YgICAgIGNyMyxlYXggICAgICAgICAgICAgICAgIDsgVXBkYXRlIHBhZ2UgdGFibGUgY2FjaGUKLSAgICAgICAgcG9wICAgICBlZGkKLSAgICAgICAgcG9wICAgICBlZHgKLSAgICAgICAgcG9wICAgICBlY3gKLSAgICAgICAgcG9wICAgICBlYngKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgTWFwUGh5c2ljYWwyTGluZWFyKHVsb25nIHBBZGRyLCB1bG9uZyBsQWRkciwgaW50IHBhZ2VzLCBpbnQgZmxhZ3MpOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTWFwcyBwaHlzaWNhbCBtZW1vcnkgaW50byBsaW5lYXIgbWVtb3J5Ci07ICAgRW50cnk6ICAgICAgcEFkZHIgICAtIFBoeXNpY2FsIGFkZHJlc3MKLTsgICAgICAgICAgICAgICBsQWRkciAgIC0gTGluZWFyIGFkZHJlc3MKLTsgICAgICAgICAgICAgICBwYWdlcyAgIC0gTnVtYmVyIG9mIDRLIHBhZ2VzIHRvIG1hcAotOyAgICAgICAgICAgICAgIGZsYWdzICAgLSBQYWdlIGZsYWdzCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0IDAgICA9ICAgICAgIHByZXNlbnQKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgMSAgID0gICAgICAgUmVhZCgwKS9Xcml0ZSgxKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIE1hcFBoeXNpY2FsMkxpbmVhcgotCi0gICAgICAgIEFSRyAgICAgcEFkZHI6VUxPTkcsIGxBZGRyOlVMT05HLCBwYWdlczpVSU5ULCBwZmxhZ3M6VUlOVAotCi0gICAgICAgIGVudGVyX2MKLQotICAgICAgICBhbmQgICAgIFtVTE9ORyBwQWRkcl0sMEZGRkZGMDAwaDsgUGFnZSBib3VuZGFyeQotICAgICAgICBhbmQgICAgIFtVTE9ORyBsQWRkcl0sMEZGRkZGMDAwaDsgUGFnZSBib3VuZGFyeQotICAgICAgICBtb3YgICAgIGVjeCxbcGZsYWdzXQotICAgICAgICBhbmQgICAgIGVjeCwxMWIgICAgICAgICAgICAgICAgIDsgSnVzdCB0d28gYml0cwotICAgICAgICBvciAgICAgIGVjeCwxMDBiICAgICAgICAgICAgICAgIDsgU3VwZXJ2aXNvciBiaXQKLSAgICAgICAgbW92ICAgICBbcGZsYWdzXSxlY3gKLQotICAgICAgICBtb3YgICAgIGVkeCxbbEFkZHJdCi0gICAgICAgIHNociAgICAgZWR4LDIyICAgICAgICAgICAgICAgICAgOyBFRFggPSBEaXJlY3RvcnkKLSAgICAgICAgbW92ICAgICBlc2ksW1BEQlJdCi0gICAgICAgIG1vdiAgICAgZWRpLFtwYWdlc10gICAgICAgICAgICAgOyBFREkgcGFnZSBjb3VudAotICAgICAgICBtb3YgICAgIGVieCxbbEFkZHJdCi0KLUBAQ3JlYXRlTG9vcDoKLSAgICAgICAgbW92ICAgICBlY3gsW2VzaStlZHgqNF0gICAgICAgICA7IExvYWQgcGFnZSB0YWJsZSBhZGRyZXNzCi0gICAgICAgIHRlc3QgICAgZWN4LDEgICAgICAgICAgICAgICAgICAgOyBJcyBpdCBwcmVzZW50PwotICAgICAgICBqbnogICAgIEBAVGFibGVPSwotICAgICAgICBtb3YgICAgIGVheCxlZHgKLSAgICAgICAgY2FsbCAgICBDcmVhdGVQYWdlVGFibGUgICAgICAgICA7IENyZWF0ZSBhIHBhZ2UgdGFibGUKLUBAVGFibGVPSzoKLSAgICAgICAgbW92ICAgICBlYXgsZWJ4Ci0gICAgICAgIHNociAgICAgZWF4LDEyCi0gICAgICAgIGFuZCAgICAgZWF4LDNGRmgKLSAgICAgICAgc3ViICAgICBlYXgsMTAyNAotICAgICAgICBuZWcgICAgIGVheCAgICAgICAgICAgICAgICAgICAgIDsgRUFYID0gcGFnZSBjb3VudCBpbiB0aGlzIHRhYmxlCi0gICAgICAgIGluYyAgICAgZWR4ICAgICAgICAgICAgICAgICAgICAgOyBOZXh0IHRhYmxlCi0gICAgICAgIG1vdiAgICAgZWJ4LDAgICAgICAgICAgICAgICAgICAgOyBOZXh0IHRpbWUgd2UnbGwgbWFwIDFLIHBhZ2VzCi0gICAgICAgIHN1YiAgICAgZWRpLGVheCAgICAgICAgICAgICAgICAgOyBTdWJ0cmFjdCBtYXBwZWQgcGFnZXMgZnJvbSBwYWdlIGNvdW50Ci0gICAgICAgIGpucyAgICAgQEBDcmVhdGVMb29wICAgICAgICAgICAgOyBDcmVhdGUgbW9yZSB0YWJsZXMgaWYgbmVjZXNzYXJ5Ci0KLSAgICAgICAgbW92ICAgICBlY3gsW3BhZ2VzXSAgICAgICAgICAgICA7IEVDWCA9IFBhZ2UgY291bnQKLSAgICAgICAgbW92ICAgICBlc2ksW2xBZGRyXQotICAgICAgICBzaHIgICAgIGVzaSwxMiAgICAgICAgICAgICAgICAgIDsgT2Zmc2V0IHBhcnQgaXNuJ3QgbmVlZGVkCi0gICAgICAgIG1vdiAgICAgZWRpLFtwQWRkcl0KLUBATWFwcGluZ0xvb3A6Ci0gICAgICAgIG1vdiAgICAgZWF4LGVzaQotICAgICAgICBzaHIgICAgIGVheCwxMCAgICAgICAgICAgICAgICAgIDsgRUFYID0gb2Zmc2V0IHRvIHBhZ2UgZGlyZWN0b3J5Ci0gICAgICAgIG1vdiAgICAgZWJ4LFtQREJSXQotICAgICAgICBtb3YgICAgIGVheCxbZWF4KjQrZWJ4XSAgICAgICAgIDsgRUFYID0gcGFnZSB0YWJsZSBhZGRyZXNzCi0gICAgICAgIGNhbGwgICAgQWNjZXNzUGFnZQotICAgICAgICBtb3YgICAgIGVieCxlc2kKLSAgICAgICAgYW5kICAgICBlYngsM0ZGaCAgICAgICAgICAgICAgICA7IEVCWCA9IG9mZnNldCB0byBwYWdlIHRhYmxlCi0gICAgICAgIG1vdiAgICAgZWR4LGVkaQotICAgICAgICBhZGQgICAgIGVkaSw0MDk2ICAgICAgICAgICAgICAgIDsgTmV4dCBwaHlzaWNhbCBhZGRyZXNzCi0gICAgICAgIGluYyAgICAgZXNpICAgICAgICAgICAgICAgICAgICAgOyBOZXh0IGxpbmVhciBwYWdlCi0gICAgICAgIG9yICAgICAgZWR4LFtwZmxhZ3NdICAgICAgICAgICAgOyBVcGRhdGUgZmxhZ3MuLi4KLSAgICAgICAgbW92ICAgICBbZWF4K2VieCo0XSxlZHggICAgICAgICA7IFN0b3JlIHBhZ2UgdGFibGUgZW50cnkKLSAgICAgICAgbG9vcCAgICBAQE1hcHBpbmdMb29wCi0gICAgICAgIG1vdiAgICAgZWF4LGNyMwotICAgICAgICBtb3YgICAgIGNyMyxlYXggICAgICAgICAgICAgICAgIDsgVXBkYXRlIHBhZ2UgdGFibGUgY2FjaGUKLQotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi1lbmRjb2Rlc2VnICBfdmZsYXQKLQotZW5kaWYKLQotICAgICAgICBFTkQgICAgICAgICAgICAgICAgICAgICA7IEVuZCBvZiBtb2R1bGUKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9jcHVpbmZvLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvY3B1aW5mby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDQ3ZTU3Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9jcHVpbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgU01YIGVtYmVkZGVkIHN5c3RlbXMgZGV2ZWxvcG1lbnQuCi0qCi0qIERlc2NyaXB0aW9uOiAgU01YIHNwZWNpZmljIGNvZGUgZm9yIHRoZSBDUFUgZGV0ZWN0aW9uIG1vZHVsZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEV4dGVybmFsIHRpbWluZyBmdW5jdGlvbiAqLwotCi12b2lkIF9fWlRpbWVySW5pdCh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EbyBub3RoaW5nIGZvciBET1MgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHRocmVhZCBwcmlvcml0aWVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgU2V0TWF4VGhyZWFkUHJpb3JpdHkoKSAgICAgIDAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EbyBub3RoaW5nIGZvciBET1MgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHRocmVhZCBwcmlvcml0aWVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgUmVzdG9yZVRocmVhZFByaW9yaXR5KGkpICAgICh2b2lkKShpKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgZnJlcXVlbmN5IG9mIHRoZSBjb3VudGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEdldENvdW50ZXJGcmVxdWVuY3koCi0gICAgQ1BVX2xhcmdlSW50ZWdlciAqZnJlcSkKLXsKLSAgICB1bG9uZyByZXNvbHV0aW9uOwotCi0gICAgX19aVGltZXJJbml0KCk7Ci0gICAgVUxaVGltZXJSZXNvbHV0aW9uKCZyZXNvbHV0aW9uKTsKLSAgICBmcmVxLT5sb3cgPSAodWxvbmcpKDEwMDAwMDAwMDAwLjAgLyByZXNvbHV0aW9uKTsKLSAgICBmcmVxLT5oaWdoID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGNvdW50ZXIgdmFsdWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBHZXRDb3VudGVyKHQpICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHQpLT5sb3cgPSBVTFpSZWFkVGltZSgpICogMTAwMDBMOyAgXAotICAgICh0KS0+aGlnaCA9IDA7ICAgICAgICAgICAgICAgICAgICAgIFwKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9ldmVudC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L2V2ZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzM2MyNjEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L2V2ZW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IFNNWCBlbWJlZGRlZCBzeXN0ZW1zIGRldmVsb3BtZW50Ci0qCi0qIERlc2NyaXB0aW9uOiAgMzItYml0IFNNWCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFNjaVRlY2ggY3Jvc3MgcGxhdGZvcm0KLSogICAgICAgICAgICAgICBldmVudCBsaWJyYXJ5LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInNteC9wczJtb3VzZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1pYm9vbCBfVkFSQVBJICAgX0VWVF91c2VFdmVudHMgPSB0cnVlOyAgLyogVHJ1ZSB0byB1c2UgZXZlbnQgaGFuZGxpbmcgICAqLwotaWJvb2wgX1ZBUkFQSSAgIF9FVlRfaW5zdGFsbGVkID0gMDsgICAgIC8qIEV2ZW50IGhhbmRlcnMgaW5zdGFsbGVkPyAgICAgKi8KLXVjaGFyIF9WQVJBUEkgICAqX0VWVF9iaW9zUHRyID0gTlVMTDsgICAvKiBQb2ludGVyIHRvIHRoZSBCSU9TIGRhdGEgYXJlYSAqLwotc3RhdGljIGlib29sICAgIGhhdmVNb3VzZSA9IGZhbHNlOyAgICAgIC8qIFRydWUgaWYgd2UgaGF2ZSBhIG1vdXNlICAgICAgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogRXh0ZXJuYWwgYXNzZW1ibGVyIGZ1bmN0aW9ucyAqLwotCi12b2lkICAgIEVWVEFQSSBfRVZUX3BvbGxKb3lzdGljayh2b2lkKTsKLXVpbnQgICAgRVZUQVBJIF9FVlRfZGlzYWJsZUludCh2b2lkKTsKLXVpbnQgICAgRVZUQVBJIF9FVlRfcmVzdG9yZUludCh1aW50IGZsYWdzKTsKLXZvaWQgICAgRVZUQVBJIF9FVlRfY29kZVN0YXJ0KHZvaWQpOwotdm9pZCAgICBFVlRBUEkgX0VWVF9jb2RlRW5kKHZvaWQpOwotdm9pZCAgICBFVlRBUEkgX0VWVF9jQ29kZVN0YXJ0KHZvaWQpOwotdm9pZCAgICBFVlRBUEkgX0VWVF9jQ29kZUVuZCh2b2lkKTsKLWludCAgICAgRVZUQVBJIF9FVlRfZ2V0S2V5Q29kZSh2b2lkKTsKLWludCAgICAgRVZUQVBJIEVWVF9yZGlueChpbnQgcG9ydCxpbnQgaW5kZXgpOwotdm9pZCAgICBFVlRBUEkgRVZUX3dyaW54KGludCBwb3J0LGludCBpbmRleCxpbnQgdmFsdWUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURvIG5vdGhpbmcgZm9yIERPUywgYmVjYXVzZSB3ZSBhcmUgZnVsbHkgaW50ZXJydXB0IGRyaXZlbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9FVlRfcHVtcE1lc3NhZ2VzKCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBudW1iZXIgb2YgdGlja3Mgc2luY2Ugc3lzdGVtCi1zdGFydHVwIGluIG1pbGxpc2Vjb25kcy4gVGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgdmFsdWUgdGhhdCBpcyBwbGFjZWQgaW50bwotdGhlIHRpbWUgc3RhbXAgZmllbGRzIG9mIGV2ZW50cywgYW5kIGlzIHVzZWQgdG8gaW1wbGVtZW50IGF1dG8gbW91c2UgZG93bgotZXZlbnRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9FVlRfZ2V0VGlja3Modm9pZCkKLXsKLSAgICByZXR1cm4gKHVsb25nKVBNX2dldExvbmcoX0VWVF9iaW9zUHRyKzB4NkMpICogNTVVTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbmNsdWRlIGdlbmVyaWMgcmF3IHNjYW5jb2RlIGtleWJvYXJkIG1vZHVsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSAiY29tbW9uL2tleWJvYXJkLmMiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGV0ZXJtaW5lcyBpZiB3ZSBoYXZlIGEgbW91c2UgYXR0YWNoZWQgYW5kIGZ1bmN0aW9uaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpYm9vbCBkZXRlY3RNb3VzZSh2b2lkKQotewotICAgcmV0dXJuKHBzMlF1ZXJ5KCkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXdoYXQgICAgICAgIC0gRXZlbnQgY29kZQotbWVzc2FnZSAgICAgLSBFdmVudCBtZXNzYWdlCi14LHkgICAgICAgICAtIE1vdXNlIHBvc2l0aW9uIGF0IHRpbWUgb2YgZXZlbnQKLWJ1dF9zdGF0ICAgIC0gTW91c2UgYnV0dG9uIHN0YXR1cyBhdCB0aW1lIG9mIGV2ZW50Ci0KLVJFTUFSS1M6Ci1BZGRzIGEgbmV3IG1vdXNlIGV2ZW50IHRvIHRoZSBldmVudCBxdWV1ZS4gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIHdpdGhpbgotdGhlIG1vdXNlIGludGVycnVwdCBzdWJyb3V0aW5lLCBzbyBpdCBtdXN0IGJlIGVmZmljaWVudC4KLQotTk9URTogICBJbnRlcnJ1cHRzIE1VU1QgYmUgT0ZGIHdoaWxlIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gZW5zdXJlIHdlIGhhdmUKLQltdXR1YWxseSBleGNsdXNpdmUgYWNjZXNzIHRvIG91ciBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgZm9yCi0JaW50ZXJydXB0IGRyaXZlbiBzeXN0ZW1zIChsaWtlIHVuZGVyIERPUykuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYWRkTW91c2VFdmVudCgKLSAgICB1aW50IHdoYXQsCi0gICAgdWludCBtZXNzYWdlLAotICAgIGludCB4LAotICAgIGludCB5LAotICAgIGludCBtaWNrZXlYLAotICAgIGludCBtaWNrZXlZLAotICAgIHVpbnQgYnV0X3N0YXQpCi17Ci0gICAgZXZlbnRfdCBldnQ7Ci0KLSAgICBpZiAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkgewotCS8qIFNhdmUgaW5mb3JtYXRpb24gaW4gZXZlbnQgcmVjb3JkLiAqLwotCWV2dC53aGVuID0gX0VWVF9nZXRUaWNrcygpOwotCWV2dC53aGF0ID0gd2hhdDsKLQlldnQubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JZXZ0Lm1vZGlmaWVycyA9IGJ1dF9zdGF0OwotCWV2dC53aGVyZV94ID0geDsgICAgICAgICAgICAgICAgLyogU2F2ZSBtb3VzZSBldmVudCBwb3NpdGlvbiAgICAqLwotCWV2dC53aGVyZV95ID0geTsKLQlldnQucmVsYXRpdmVfeCA9IG1pY2tleVg7Ci0JZXZ0LnJlbGF0aXZlX3kgPSBtaWNrZXlZOwotCWV2dC5tb2RpZmllcnMgfD0gRVZULmtleU1vZGlmaWVyczsKLQlhZGRFdmVudCgmZXZ0KTsgICAgICAgICAgICAgICAgIC8qIEFkZCB0byB0YWlsIG9mIGV2ZW50IHF1ZXVlICAgKi8KLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotbWFzayAgICAgICAgLSBFdmVudCBtYXNrCi1idXRzdGF0ZSAgICAtIEJ1dHRvbiBzdGF0ZQoteCAgICAgICAgICAgLSBNb3VzZSB4IGNvb3JkaW5hdGUKLXkgICAgICAgICAgIC0gTW91c2UgeSBjb29yZGluYXRlCi0KLVJFTUFSS1M6Ci1Nb3VzZSBldmVudCBoYW5kbGluZyByb3V0aW5lLiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gYSBtb3VzZSBldmVudCBvY2N1cnMsCi1hbmQgd2UgY2FsbCB0aGUgYWRkTW91c2VFdmVudCgpIHJvdXRpbmUgdG8gYWRkIHRoZSBhcHByb3ByaWF0ZSBtb3VzZSBldmVudAotdG8gdGhlIGV2ZW50IHF1ZXVlLgotCi1Ob3RlOiBJbnRlcnJ1cHRzIGFyZSBPTiB3aGVuIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIG1vdXNlIGRyaXZlciBjb2RlLgotLypBTTogTk9URTogVGhpcyBmdW5jdGlvbiBoYXMgbm90IGFjdHVhbGx5IGJlZW4gcG9ydGVkIGZyb20gRE9TIHlldCBhbmQgc2hvdWxkIG5vdCAqLwotLypBTTogYmUgaW5zdGFsbGVkIHVudGlsIGl0IGlzLiAqLwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEVWVEFQSSBtb3VzZUlTUigKLSAgICB1aW50IG1hc2ssCi0gICAgdWludCBidXRzdGF0ZSwKLSAgICBpbnQgeCwKLSAgICBpbnQgeSwKLSAgICBpbnQgbWlja2V5WCwKLSAgICBpbnQgbWlja2V5WSkKLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0gICAgdWludCAgICBwczsKLQotICAgIGlmIChtYXNrICYgMSkgewotCS8qIFNhdmUgdGhlIGN1cnJlbnQgbW91c2UgY29vcmRpbmF0ZXMgKi8KLQlFVlQubXggPSB4OyBFVlQubXkgPSB5OwotCi0JLyogSWYgdGhlIGxhc3QgZXZlbnQgd2FzIGEgbW92ZW1lbnQgZXZlbnQsIHRoZW4gbW9kaWZ5IHRoZSBsYXN0Ci0JICogZXZlbnQgcmF0aGVyIHRoYW4gcG9zdCBhIG5ldyBvbmUsIHNvIHRoYXQgdGhlIHF1ZXVlIHdpbGwgbm90Ci0JICogYmVjb21lIHNhdHVyYXRlZC4gQmVmb3JlIHdlIG1vZGlmeSB0aGUgZGF0YSBzdHJ1Y3R1cmVzLCB3ZQotCSAqIE1VU1QgZW5zdXJlIHRoYXQgaW50ZXJydXB0cyBhcmUgb2ZmLgotCSAqLwotCXBzID0gX0VWVF9kaXNhYmxlSW50KCk7Ci0JaWYgKEVWVC5vbGRNb3ZlICE9IC0xKSB7Ci0JICAgIEVWVC5ldnRxW0VWVC5vbGRNb3ZlXS53aGVyZV94ID0geDsgICAgICAgICAgLyogTW9kaWZ5IGV4aXN0aW5nIG9uZSAgKi8KLQkgICAgRVZULmV2dHFbRVZULm9sZE1vdmVdLndoZXJlX3kgPSB5OwotCSAgICBFVlQuZXZ0cVtFVlQub2xkTW92ZV0ucmVsYXRpdmVfeCArPSBtaWNrZXlYOwotCSAgICBFVlQuZXZ0cVtFVlQub2xkTW92ZV0ucmVsYXRpdmVfeSArPSBtaWNrZXlZOwotCSAgICB9Ci0JZWxzZSB7Ci0JICAgIEVWVC5vbGRNb3ZlID0gRVZULmZyZWVIZWFkOyAgICAgICAgIC8qIFNhdmUgaWQgb2YgdGhpcyBtb3ZlIGV2ZW50ICAgKi8KLQkgICAgYWRkTW91c2VFdmVudChFVlRfTU9VU0VNT1ZFLDAseCx5LG1pY2tleVgsbWlja2V5WSxidXRzdGF0ZSk7Ci0JICAgIH0KLQlfRVZUX3Jlc3RvcmVJbnQocHMpOwotCX0KLSAgICBpZiAobWFzayAmIDB4MkEpIHsKLQlwcyA9IF9FVlRfZGlzYWJsZUludCgpOwotCWFkZE1vdXNlRXZlbnQoRVZUX01PVVNFRE9XTixtYXNrID4+IDEseCx5LDAsMCxidXRzdGF0ZSk7Ci0JRVZULm9sZE1vdmUgPSAtMTsKLQlfRVZUX3Jlc3RvcmVJbnQocHMpOwotCX0KLSAgICBpZiAobWFzayAmIDB4NTQpIHsKLQlwcyA9IF9FVlRfZGlzYWJsZUludCgpOwotCWFkZE1vdXNlRXZlbnQoRVZUX01PVVNFVVAsbWFzayA+PiAyLHgseSwwLDAsYnV0c3RhdGUpOwotCUVWVC5vbGRNb3ZlID0gLTE7Ci0JX0VWVF9yZXN0b3JlSW50KHBzKTsKLQl9Ci0gICAgRVZULm9sZEtleSA9IC0xOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUtleWJvYXJkIGludGVycnVwdCBoYW5kbGVyIGZ1bmN0aW9uLgotCi1OT1RFOiAgIEludGVycnVwdHMgYXJlIE9GRiB3aGVuIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIGtleWJvYXJkIElTUiwKLQlhbmQgd2UgbGVhdmUgdGhlbSBPRkYgdGhlIGVudGlyZSB0aW1lLiBUaGlzIGhhcyBiZWVuIG1vZGlmaWVkIHRvIHdvcmsKLSAgICAgIGluIGNvbmp1bmN0aW9uIHdpdGggc214IGtleWJvYXJkIGhhbmRsZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgRVZUQVBJIGtleWJvYXJkSVNSKHZvaWQpCi17Ci0gICBQTV9jaGFpblByZXZLZXkoKTsKLSAgICBwcm9jZXNzUmF3U2NhbkNvZGUoUE1faW5wYigweDYwKSk7Ci0gICAgUE1fb3V0cGIoMHgyMCwweDIwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TYWZlbHkgYWJvcnQgdGhlIGV2ZW50IG1vZHVsZSB1cG9uIGNhdGNoaW5nIGEgZmF0YWwgZXJyb3IuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfRVZUX2Fib3J0KCkKLXsKLSAgICBFVlRfZXhpdCgpOwotICAgIFBNX2ZhdGFsRXJyb3IoIlVuaGFuZGxlZCBleGNlcHRpb24hIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotbW91c2VNb3ZlICAgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW5ldmUgdGhlIG1vdXNlIG5lZWRzIHRvIGJlIG1vdmVkCi0KLVJFTUFSS1M6Ci1Jbml0aWxpYXNlIHRoZSBldmVudCBoYW5kbGluZyBtb2R1bGUuIEhlcmUgd2UgaW5zdGFsbCBvdXIgbW91c2UgaGFuZGxpbmcgSVNSCi10byBiZSBjYWxsZWQgd2hlbmV2ZXIgYW55IGJ1dHRvbidzIGFyZSBwcmVzc2VkIG9yIHJlbGVhc2VkLiBXZSBhbHNvIGJ1aWxkCi10aGUgZnJlZSBsaXN0IG9mIGV2ZW50cyBpbiB0aGUgZXZlbnQgcXVldWUuCi0KLVdlIHVzZSBoYW5kbGVyIG51bWJlciAyIG9mIHRoZSBtb3VzZSBsaWJyYXJpZXMgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBvdXIKLWV2ZW50IGhhbmRsaW5nIHJvdXRpbmVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9pbml0KAotICAgIF9FVlRfbW91c2VNb3ZlSGFuZGxlciBtb3VzZU1vdmUpCi17Ci0gICAgaW50ICAgICBpOwotCi0gICAgRVZULm1vdXNlTW92ZSA9IG1vdXNlTW92ZTsKLSAgICBfRVZUX2Jpb3NQdHIgPSBQTV9nZXRCSU9TUG9pbnRlcigpOwotICAgIEVWVF9yZXN1bWUoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFpbGlzZXMgdGhlIGludGVybmFsIGV2ZW50IGhhbmRsaW5nIG1vZHVsZXMuIFRoZSBFVlRfc3VzcGVuZCBmdW5jdGlvbgotY2FuIGJlIGNhbGxlZCB0byBzdXNwZW5kIGV2ZW50IGhhbmRsaW5nIChzdWNoIGFzIHdoZW4gc2hlbGxpbmcgb3V0IHRvIERPUyksCi1hbmQgdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgaXQgYWdhaW4gbGF0ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX3Jlc3VtZSh2b2lkKQotewotICAgIHN0YXRpYyBpbnQgICAgICBsb2NrZWQgPSAwOwotICAgIGludCAgICAgICAgICAgICBzdGF0OwotICAgIHVjaGFyICAgICAgICAgICBtb2RzOwotICAgIFBNX2xvY2tIYW5kbGUgICBsaDsKLQotICAgIGlmIChfRVZUX3VzZUV2ZW50cykgewotCS8qIEluaXRpYWxpc2UgdGhlIGV2ZW50IHF1ZXVlIGFuZCBlbmFibGUgb3VyIGludGVycnVwdCBoYW5kbGVycyAqLwotCWluaXRFdmVudFF1ZXVlKCk7Ci0JUE1fc2V0S2V5SGFuZGxlcihrZXlib2FyZElTUik7Ci0JaWYgKChoYXZlTW91c2UgPSBkZXRlY3RNb3VzZSgpKSAhPSAwKQotCSAgICBQTV9zZXRNb3VzZUhhbmRsZXIoMHhGRkZGLG1vdXNlSVNSKTsKLQotCS8qIFJlYWQgdGhlIGtleWJvYXJkIG1vZGlmaWVyIGZsYWdzIGZyb20gdGhlIEJJT1MgdG8gZ2V0IHRoZQotCSAqIGNvcnJlY3QgaW5pdGlhbGlzYXRpb24gc3RhdGUuIFRoZSBvbmx5IHN0YXRlIHdlIGNhcmUgYWJvdXQgaXMKLQkgKiB0aGUgY29ycmVjdCB0b2dnbGUgc3RhdGUgZmxhZ3Mgc3VjaCBhcyBTQ1JPTExMT0NLLCBOVU1MT0NLIGFuZAotCSAqIENBUFNMT0NLLgotCSAqLwotCUVWVC5rZXlNb2RpZmllcnMgPSAwOwotCW1vZHMgPSBQTV9nZXRCeXRlKF9FVlRfYmlvc1B0cisweDE3KTsKLQlpZiAobW9kcyAmIDB4MTApCi0JICAgIEVWVC5rZXlNb2RpZmllcnMgfD0gRVZUX1NDUk9MTExPQ0s7Ci0JaWYgKG1vZHMgJiAweDIwKQotCSAgICBFVlQua2V5TW9kaWZpZXJzIHw9IEVWVF9OVU1MT0NLOwotCWlmIChtb2RzICYgMHg0MCkKLQkgICAgRVZULmtleU1vZGlmaWVycyB8PSBFVlRfQ0FQU0xPQ0s7Ci0KLQkvKiBMb2NrIGFsbCBvZiB0aGUgY29kZSBhbmQgZGF0YSB1c2VkIGJ5IG91ciBwcm90ZWN0ZWQgbW9kZSBpbnRlcnJ1cHQKLQkgKiBoYW5kbGluZyByb3V0aW5lcywgc28gdGhhdCBpdCB3aWxsIGNvbnRpbnVlIHRvIHdvcmsgY29ycmVjdGx5Ci0JICogdW5kZXIgcmVhbCBtb2RlLgotCSAqLwotCWlmICghbG9ja2VkKSB7Ci0JICAgIC8qIEl0IGlzIGRpZmZpY3VsdCB0byBlbnN1cmUgdGhhdCB3ZSBsb2NrIG91ciBnbG9iYWwgZGF0YSwgc28gd2UKLQkgICAgICogZG8gdGhpcyBieSB0YWtpbmcgdGhlIGFkZHJlc3Mgb2YgYSB2YXJpYWJsZSBsb2NraW5nIGFsbCBkYXRhCi0JICAgICAqIDJLYiBvbiBlaXRoZXIgc2lkZS4gVGhpcyBzaG91bGQgcHJvcGVybHkgY292ZXIgdGhlIGdsb2JhbCBkYXRhCi0JICAgICAqIHVzZWQgYnkgdGhlIG1vZHVsZSAodGhlIG90aGVyIGFsdGVybmF0aXZlIGlzIHRvIGRlY2xhcmUgdGhlCi0JICAgICAqIHZhcmlhYmxlcyBpbiBhc3NlbWJsZXIsIGluIHdoaWNoIGNhc2Ugd2Uga25vdyBpdCB3aWxsIGJlCi0JICAgICAqIGNvcnJlY3QpLgotCSAgICAgKi8KLQkgICAgc3RhdCAgPSAhUE1fbG9ja0RhdGFQYWdlcygmRVZULHNpemVvZihFVlQpLCZsaCk7Ci0JICAgIHN0YXQgfD0gIVBNX2xvY2tEYXRhUGFnZXMoJl9FVlRfYmlvc1B0cixzaXplb2YoX0VWVF9iaW9zUHRyKSwmbGgpOwotCSAgICBzdGF0IHw9ICFQTV9sb2NrQ29kZVBhZ2VzKChfX2NvZGVQdHIpX0VWVF9jQ29kZVN0YXJ0LChpbnQpX0VWVF9jQ29kZUVuZC0oaW50KV9FVlRfY0NvZGVTdGFydCwmbGgpOwotCSAgICBzdGF0IHw9ICFQTV9sb2NrQ29kZVBhZ2VzKChfX2NvZGVQdHIpX0VWVF9jb2RlU3RhcnQsKGludClfRVZUX2NvZGVFbmQtKGludClfRVZUX2NvZGVTdGFydCwmbGgpOwotCSAgICBpZiAoc3RhdCkgewotCQlQTV9mYXRhbEVycm9yKCJQYWdlIGxvY2tpbmcgc2VydmljZXMgZmFpbGVkIC0gaW50ZXJydXB0IGhhbmRsaW5nIG5vdCBzYWZlISIpOwotCQlleGl0KDEpOwotCQl9Ci0JICAgIGxvY2tlZCA9IDE7Ci0JICAgIH0KLQotCV9FVlRfaW5zdGFsbGVkID0gdHJ1ZTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1DaGFuZ2VzIHRoZSByYW5nZSBvZiBjb29yZGluYXRlcyByZXR1cm5lZCBieSB0aGUgbW91c2UgZnVuY3Rpb25zIHRvIHRoZQotc3BlY2lmaWVkIHJhbmdlIG9mIHZhbHVlcy4gVGhpcyBpcyB1c2VkIHdoZW4gY2hhbmdpbmcgYmV0d2VlbiBncmFwaGljcwotbW9kZXMgc2V0IHRoZSByYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyBmb3IgdGhlIG5ldyBkaXNwbGF5IG1vZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX3NldE1vdXNlUmFuZ2UoCi0gICAgaW50IHhSZXMsCi0gICAgaW50IHlSZXMpCi17Ci0gICAgaWYgKGhhdmVNb3VzZSkgewotCXBzMk1vdXNlU3RvcCgpOwotCXBzMk1vdXNlU3RhcnQoIDAsIHhSZXMsIDAsIHlSZXMsIC0xLCAtMSwgLTEpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLU1vZGlmZXMgdGhlIG1vdXNlIGNvb3JkaW5hdGVzIGFzIG5lY2Vzc2FyeSBpZiBzY2FsaW5nIHRvIE9TIGNvb3JkaW5hdGVzLAotYW5kIHNldHMgdGhlIE9TIG1vdXNlIGN1cnNvciBwb3NpdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9FVlRfc2V0TW91c2VQb3MoCi0gICAgaW50ICp4LAotICAgIGludCAqeSkKLXsKLSAgICBpZiAoaGF2ZU1vdXNlKQotCXBzMk1vdXNlTW92ZSgqeCwgKnkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotU3VzcGVuZHMgYWxsIG9mIG91ciBldmVudCBoYW5kbGluZyBvcGVyYXRpb25zLiBUaGlzIGlzIGFsc28gdXNlZCB0bwotZGUtaW5zdGFsbCB0aGUgZXZlbnQgaGFuZGxpbmcgY29kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfc3VzcGVuZCh2b2lkKQotewotICAgIHVjaGFyICAgbW9kczsKLQotICAgIGlmIChfRVZUX2luc3RhbGxlZCkgewotCVBNX3Jlc3RvcmVLZXlIYW5kbGVyKCk7Ci0gICAgaWYgKGhhdmVNb3VzZSkKLQlQTV9yZXN0b3JlTW91c2VIYW5kbGVyKCk7Ci0KLQkvKiBTZXQgdGhlIGtleWJvYXJkIG1vZGlmaWVyIGZsYWdzIGluIHRoZSBCSU9TIHRvIG91ciB2YWx1ZXMgKi8KLQlFVlRfYWxsb3dMRURTKHRydWUpOwotCW1vZHMgPSBQTV9nZXRCeXRlKF9FVlRfYmlvc1B0cisweDE3KSAmIH4weDcwOwotCWlmIChFVlQua2V5TW9kaWZpZXJzICYgRVZUX1NDUk9MTExPQ0spCi0JICAgIG1vZHMgfD0gMHgxMDsKLQlpZiAoRVZULmtleU1vZGlmaWVycyAmIEVWVF9OVU1MT0NLKQotCSAgICBtb2RzIHw9IDB4MjA7Ci0JaWYgKEVWVC5rZXlNb2RpZmllcnMgJiBFVlRfQ0FQU0xPQ0spCi0JICAgIG1vZHMgfD0gMHg0MDsKLQlQTV9zZXRCeXRlKF9FVlRfYmlvc1B0cisweDE3LG1vZHMpOwotCi0JLyogRmxhZyB0aGF0IHdlIGFyZSBubyBsb25nZXIgaW5zdGFsbGVkICovCi0JX0VWVF9pbnN0YWxsZWQgPSBmYWxzZTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1FeGl0cyB0aGUgZXZlbnQgbW9kdWxlIGZvciBwcm9ncmFtIHRlcm1pbmF0YXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2V4aXQodm9pZCkKLXsKLSAgICBFVlRfc3VzcGVuZCgpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L29zaGRyLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvb3NoZHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZmOGRhYS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvb3NoZHIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBTTVggZW1iZWRkZWQgc3lzdGVtcyBkZXZlbG9wbWVudC4KLSoKLSogRGVzY3JpcHRpb246ICBJbmNsdWRlIGZpbGUgdG8gaW5jbHVkZSBhbGwgT1Mgc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9wbS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L3BtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZWUzZDQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L3BtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyIGJpdCBTTVggZW1iZWRkZWQgc3lzdGVtcyBkZXZlbG9wbWVudC4KLSoKLSogRGVzY3JpcHRpb246ICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeSwgd2hpY2gKLSogICAgICAgICAgICAgICBjb250YWlucyBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IE9TIHNwZWNpZmljIHNlcnZpY2VzIGluIGEKLSogICAgICAgICAgICAgICBnZW5lcmljLCBjcm9zcyBwbGF0Zm9ybSBBUEkuIFBvcnRpbmcgdGhlIE9TIFBvcnRhYmlsaXR5Ci0qICAgICAgICAgICAgICAgTWFuYWdlciBsaWJyYXJ5IGlzIHRoZSBmaXJzdCBzdGVwIHRvIHBvcnRpbmcgYW55IFNjaVRlY2gKLSogICAgICAgICAgICAgICBwcm9kdWN0cyB0byBhIG5ldyBwbGF0Zm9ybS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgImRydmxpYi9vcy9vcy5oIgotI2luY2x1ZGUgInp0aW1lcmMuaCIKLSNpbmNsdWRlICJldmVudC5oIgotI2luY2x1ZGUgIm10cnIuaCIKLSNpbmNsdWRlICJwbV9oZWxwLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxkb3MuaD4KLSNpbmNsdWRlIDxjb25pby5oPgotI2lmZGVmICBfX0dOVUNfXwotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy9uZWFycHRyLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNlbHNlCi0jaW5jbHVkZSA8ZGlyZWN0Lmg+Ci0jZW5kaWYKLSNpZmRlZiAgX19CT1JMQU5EQ19fCi0jcHJhZ21hIHdhcm4gLXBhcgotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgICAgIG9sZE1vZGU7Ci0gICAgaW50ICAgICBvbGQ1MExpbmVzOwotICAgIH0gRE9TX3N0YXRlQnVmOwotCi0jZGVmaW5lIE1BWF9STV9CTE9DS1MgICAxMAotCi1zdGF0aWMgc3RydWN0IHsKLSAgICB2b2lkICAgICpwOwotICAgIHVpbnQgICAgdGFnOwotICAgIH0gcm1CbG9ja3NbTUFYX1JNX0JMT0NLU107Ci0KLXN0YXRpYyB1aW50ICAgICBWRVNBQnVmX2xlbiA9IDEwMjQ7ICAgICAvKiBMZW5ndGggb2YgdGhlIFZFU0FCdWYgYnVmZmVyICAgICAqLwotc3RhdGljIHZvaWQgICAgICpWRVNBQnVmX3B0ciA9IE5VTEw7ICAgIC8qIE5lYXIgcG9pbnRlciB0byBWRVNBQnVmICAgICAgICAgICovCi1zdGF0aWMgdWludCAgICAgVkVTQUJ1Zl9yc2VnOyAgICAgICAgICAgLyogUmVhbCBtb2RlIHNlZ21lbnQgb2YgVkVTQUJ1ZiAgICAgKi8KLXN0YXRpYyB1aW50ICAgICBWRVNBQnVmX3JvZmY7ICAgICAgICAgICAvKiBSZWFsIG1vZGUgb2Zmc2V0IG9mIFZFU0FCdWYgICAgICAqLwotc3RhdGljIHZvaWQgICAgIChQTUFQSVAgZmF0YWxFcnJvckNsZWFudXApKHZvaWQpID0gTlVMTDsKLXVzaG9ydCBfVkFSQVBJICBfUE1fc2F2ZWREUyA9IDA7Ci1zdGF0aWMgdWxvbmcgICAgUERCID0gMCwqcFBEQiA9IE5VTEw7Ci1zdGF0aWMgdWludCAgICAgVlhEX3ZlcnNpb24gPSAtMTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdWxvbmcgICBfQVNNQVBJIF9QTV9nZXRQREIodm9pZCk7Ci12b2lkICAgIF9BU01BUEkgX1BNX1Z4RENhbGwoVlhEX3JlZ3MgKnJlZ3MsdWludCBvZmYsdWludCBzZWwpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUV4dGVybmFsIGZ1bmN0aW9uIHRvIGNhbGwgdGhlIFBNSEVMUCBoZWxwZXIgVnhELgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fVnhEQ2FsbCgKLSAgICBWWERfcmVncyAqcmVncykKLXsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1CQ0QgY29kZWQgdmVyc2lvbiBudW1iZXIgb2YgdGhlIFZ4RCwgb3IgMCBpZiBub3QgbG9hZGVkIChpZTogMHgyMDIgLSAyLjIpCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGdldHMgdGhlIHZlcnNpb24gbnVtYmVyIGZvciB0aGUgVnhEIHRoYXQgd2UgaGF2ZSBjb25uZWN0ZWQgdG8uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludCBQTUFQSSBQTUhFTFBfZ2V0VmVyc2lvbih2b2lkKQotewotICAgIHJldHVybiBWWERfdmVyc2lvbiA9IDA7Ci19Ci0KLXZvaWQgUE1BUEkgUE1faW5pdCh2b2lkKQotewotI2lmbmRlZiBSRUFMTU9ERQotICAgIE1UUlJfaW5pdCgpOwotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYmFzZSAgICAtIFRoZSBzdGFydGluZyBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgotc2l6ZSAgICAtIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZWdpb24KLXR5cGUgICAgLSBUeXBlIHRvIHBsYWNlIGludG8gdGhlIE1UUlIgcmVnaXN0ZXIKLQotUkVUVVJOUzoKLUVycm9yIGNvZGUgZGVzY3JpYmluZyB0aGUgcmVzdWx0LgotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZW5hYmxlIHdyaXRlIGNvbWJpbmluZyBmb3IgdGhlIHNwZWNpZmllZCByZWdpb24gb2YgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9lbmFibGVXcml0ZUNvbWJpbmUoCi0gICAgdWxvbmcgYmFzZSwKLSAgICB1bG9uZyBzaXplLAotICAgIHVpbnQgdHlwZSkKLXsKLSNpZm5kZWYgUkVBTE1PREUKLSAgICByZXR1cm4gTVRSUl9lbmFibGVXcml0ZUNvbWJpbmUoYmFzZSxzaXplLHR5cGUpOwotI2Vsc2UKLSAgICByZXR1cm4gUE1fTVRSUl9OT1RfU1VQUE9SVEVEOwotI2VuZGlmCi19Ci0KLWlib29sIFBNQVBJIFBNX2hhdmVCSU9TQWNjZXNzKHZvaWQpCi17IHJldHVybiBmYWxzZTsgfQotCi1sb25nIFBNQVBJIFBNX2dldE9TVHlwZSh2b2lkKQoteyByZXR1cm4gX09TX1NNWDsgfQotCi1pbnQgUE1BUEkgUE1fZ2V0TW9kZVR5cGUodm9pZCkKLXsgcmV0dXJuIFBNXzM4NjsgfQotCi12b2lkIFBNQVBJIFBNX2JhY2tzbGFzaChjaGFyICpzKQotewotICAgIHVpbnQgcG9zID0gc3RybGVuKHMpOwotICAgIGlmIChzW3Bvcy0xXSAhPSAnXFwnKSB7Ci0Jc1twb3NdID0gJ1xcJzsKLQlzW3BvcysxXSA9ICdcMCc7Ci0JfQotfQotCi12b2lkIFBNQVBJIFBNX3NldEZhdGFsRXJyb3JDbGVhbnVwKAotICAgIHZvaWQgKFBNQVBJUCBjbGVhbnVwKSh2b2lkKSkKLXsKLSAgICBmYXRhbEVycm9yQ2xlYW51cCA9IGNsZWFudXA7Ci19Ci0KLXZvaWQgTUdMT3V0cHV0KGNoYXIgKik7Ci0KLXZvaWQgUE1BUEkgUE1fZmF0YWxFcnJvcihjb25zdCBjaGFyICptc2cpCi17Ci0gICAgaWYgKGZhdGFsRXJyb3JDbGVhbnVwKQotCWZhdGFsRXJyb3JDbGVhbnVwKCk7Ci0gICAgTUdMT3V0cHV0KG1zZyk7Ci0vKiBObyBzdXBwb3J0IGZvciBmcHJpbnRmKCkgdW5kZXIgc214IGN1cnJlbnRseSEgKi8KLS8qICBmcHJpbnRmKHN0ZGVyciwiJXNcbiIsIG1zZyk7ICovCi0gICAgZXhpdCgxKTsKLX0KLQotc3RhdGljIHZvaWQgRXhpdFZCRUJ1Zih2b2lkKQotewotICAgIGlmIChWRVNBQnVmX3B0cikKLQlQTV9mcmVlUmVhbFNlZyhWRVNBQnVmX3B0cik7Ci0gICAgVkVTQUJ1Zl9wdHIgPSAwOwotfQotCi12b2lkICogUE1BUEkgUE1fZ2V0VkVTQUJ1Zih1aW50ICpsZW4sdWludCAqcnNlZyx1aW50ICpyb2ZmKQotewotICAgIGlmICghVkVTQUJ1Zl9wdHIpIHsKLQkvKiBBbGxvY2F0ZSBhIGdsb2JhbCBidWZmZXIgZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgVkVTQSBWQkUgKi8KLQlpZiAoKFZFU0FCdWZfcHRyID0gUE1fYWxsb2NSZWFsU2VnKFZFU0FCdWZfbGVuLCAmVkVTQUJ1Zl9yc2VnLCAmVkVTQUJ1Zl9yb2ZmKSkgPT0gTlVMTCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JYXRleGl0KEV4aXRWQkVCdWYpOwotCX0KLSAgICAqbGVuID0gVkVTQUJ1Zl9sZW47Ci0gICAgKnJzZWcgPSBWRVNBQnVmX3JzZWc7Ci0gICAgKnJvZmYgPSBWRVNBQnVmX3JvZmY7Ci0gICAgcmV0dXJuIFZFU0FCdWZfcHRyOwotfQotCi1pbnQgUE1BUEkgUE1faW50Mzg2KGludCBpbnRubywgUE1SRUdTICppbiwgUE1SRUdTICpvdXQpCi17Ci0gICAgUE1TUkVHUyBzcmVnczsKLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0gICAgcmV0dXJuIFBNX2ludDM4NngoaW50bm8saW4sb3V0LCZzcmVncyk7Ci19Ci0KLS8qIFJvdXRpbmVzIHRvIHNldCBhbmQgZ2V0IHRoZSByZWFsIG1vZGUgaW50ZXJydXB0IHZlY3RvcnMsIGJ5IG1ha2luZwotICogZGlyZWN0IHJlYWwgbW9kZSBjYWxscyB0byBET1MgYW5kIGJ5cGFzc2luZyB0aGUgRE9TIGV4dGVuZGVycyBBUEkuCi0gKiBUaGlzIGlzIHRoZSBzYWZlc3Qgd2F5IHRvIGhhbmRsZSB0aGlzLCBhcyBzb21lIHNlcnZlcnMgdHJ5IHRvIGJlCi0gKiBzbWFydCBhYm91dCBjaGFuZ2luZyByZWFsIG1vZGUgdmVjdG9ycy4KLSAqLwotCi12b2lkIFBNQVBJIF9QTV9nZXRSTXZlY3QoaW50IGludG5vLCBsb25nICpyZWFsaXNyKQotewotICAgIFJNUkVHUyAgcmVnczsKLSAgICBSTVNSRUdTIHNyZWdzOwotCi0gICAgUE1fc2F2ZURTKCk7Ci0gICAgcmVncy5oLmFoID0gMHgzNTsKLSAgICByZWdzLmguYWwgPSBpbnRubzsKLSAgICBQTV9pbnQ4NngoMHgyMSwgJnJlZ3MsICZyZWdzLCAmc3JlZ3MpOwotICAgICpyZWFsaXNyID0gKChsb25nKXNyZWdzLmVzIDw8IDE2KSB8IHJlZ3MueC5ieDsKLX0KLQotdm9pZCBQTUFQSSBfUE1fc2V0Uk12ZWN0KGludCBpbnRubywgbG9uZyByZWFsaXNyKQotewotICAgIFJNUkVHUyAgcmVnczsKLSAgICBSTVNSRUdTIHNyZWdzOwotCi0gICAgUE1fc2F2ZURTKCk7Ci0gICAgcmVncy5oLmFoID0gMHgyNTsKLSAgICByZWdzLmguYWwgPSBpbnRubzsKLSAgICBzcmVncy5kcyA9IChpbnQpKHJlYWxpc3IgPj4gMTYpOwotICAgIHJlZ3MueC5keCA9IChpbnQpKHJlYWxpc3IgJiAweEZGRkYpOwotICAgIFBNX2ludDg2eCgweDIxLCAmcmVncywgJnJlZ3MsICZzcmVncyk7Ci19Ci0KLXZvaWQgUE1BUEkgX1BNX2FkZFJlYWxNb2RlQmxvY2sodm9pZCAqbWVtLHVpbnQgdGFnKQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9STV9CTE9DS1M7IGkrKykgewotCWlmIChybUJsb2Nrc1tpXS5wID09IE5VTEwpIHsKLQkgICAgcm1CbG9ja3NbaV0ucCA9IG1lbTsKLQkgICAgcm1CbG9ja3NbaV0udGFnID0gdGFnOwotCSAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgUE1fZmF0YWxFcnJvcigiVG8gbWFueSByZWFsIG1vZGUgbWVtb3J5IGJsb2NrIGFsbG9jYXRpb25zISIpOwotfQotCi11aW50IFBNQVBJIF9QTV9maW5kUmVhbE1vZGVCbG9jayh2b2lkICptZW0pCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1JNX0JMT0NLUzsgaSsrKSB7Ci0JaWYgKHJtQmxvY2tzW2ldLnAgPT0gbWVtKQotCSAgICByZXR1cm4gcm1CbG9ja3NbaV0udGFnOwotCX0KLSAgICBQTV9mYXRhbEVycm9yKCJDb3VsZCBub3QgZmluZCBwcmlvciByZWFsIG1vZGUgbWVtb3J5IGJsb2NrIGFsbG9jYXRpb24hIik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWNoYXIgKiBQTUFQSSBQTV9nZXRDdXJyZW50UGF0aCgKLSAgICBjaGFyICpwYXRoLAotICAgIGludCBtYXhMZW4pCi17Ci0gICAgcmV0dXJuIGdldGN3ZChwYXRoLG1heExlbik7Ci19Ci0KLWNoYXIgUE1BUEkgUE1fZ2V0Qm9vdERyaXZlKHZvaWQpCi17IHJldHVybiAnQyc7IH0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFZCRUFGUGF0aCh2b2lkKQoteyByZXR1cm4gImM6XFwiOyB9Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzUGF0aCh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIHBhdGhbMjU2XTsKLSAgICBjaGFyICAgICAgICAqZW52OwotCi0gICAgaWYgKChlbnYgPSBnZXRlbnYoIk5VQ0xFVVNfUEFUSCIpKSAhPSBOVUxMKQotCXJldHVybiBlbnY7Ci0gICAgcmV0dXJuICJjOlxcbnVjbGV1cyI7Ci19Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIHBhdGhbMjU2XTsKLSAgICBzdHJjcHkocGF0aCxQTV9nZXROdWNsZXVzUGF0aCgpKTsKLSAgICBQTV9iYWNrc2xhc2gocGF0aCk7Ci0gICAgc3RyY2F0KHBhdGgsImNvbmZpZyIpOwotICAgIHJldHVybiBwYXRoOwotfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VW5pcXVlSUQodm9pZCkKLXsgcmV0dXJuICJTTVgiOyB9Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRNYWNoaW5lTmFtZSh2b2lkKQoteyByZXR1cm4gIlNNWCI7IH0KLQotaW50IFBNQVBJIFBNX2tiaGl0KHZvaWQpCi17Ci0gICAgaW50ICAgICBoaXQ7Ci0gICAgZXZlbnRfdCBldnQ7Ci0KLSAgICBoaXQgPSBFVlRfcGVla05leHQoJmV2dCxFVlRfS0VZRE9XTiB8IEVWVF9LRVlSRVBFQVQpOwotICAgIEVWVF9mbHVzaCh+KEVWVF9LRVlET1dOIHwgRVZUX0tFWVJFUEVBVCkpOwotICAgIHJldHVybiBoaXQ7Ci19Ci0KLWludCBQTUFQSSBQTV9nZXRjaCh2b2lkKQotewotICAgZXZlbnRfdCBldnQ7Ci0KLSAgICBFVlRfaGFsdCgmZXZ0LEVWVF9LRVlET1dOKTsKLSAgIHJldHVybiBFVlRfYXNjaWlDb2RlKGV2dC5tZXNzYWdlKTsKLX0KLQotUE1fSFdORCBQTUFQSSBQTV9vcGVuQ29uc29sZShQTV9IV05EIGh3bmRVc2VyLGludCBkZXZpY2UsaW50IHhSZXMsaW50IHlSZXMsaW50IGJwcCxpYm9vbCBmdWxsU2NyZWVuKQotewotICAgIC8qIE5vdCB1c2VkIGZvciBTTVggKi8KLSAgICAodm9pZClod25kVXNlcjsKLSAgICAodm9pZClkZXZpY2U7Ci0gICAgKHZvaWQpeFJlczsKLSAgICAodm9pZCl5UmVzOwotICAgICh2b2lkKWJwcDsKLSAgICAodm9pZClmdWxsU2NyZWVuOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgUE1BUEkgUE1fZ2V0Q29uc29sZVN0YXRlU2l6ZSh2b2lkKQotewotICAgIHJldHVybiBzaXplb2YoRE9TX3N0YXRlQnVmKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zYXZlQ29uc29sZVN0YXRlKHZvaWQgKnN0YXRlQnVmLFBNX0hXTkQgaHduZENvbnNvbGUpCi17Ci0gICAgUk1SRUdTICAgICAgICAgIHJlZ3M7Ci0gICAgRE9TX3N0YXRlQnVmICAgICpzYiA9IHN0YXRlQnVmOwotCi0gICAgLyogU2F2ZSB0aGUgb2xkIHZpZGVvIG1vZGUgc3RhdGUgKi8KLSAgICByZWdzLmguYWggPSAweDBGOwotICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotICAgIHNiLT5vbGRNb2RlID0gcmVncy5oLmFsICYgMHg3RjsKLSAgICBzYi0+b2xkNTBMaW5lcyA9IGZhbHNlOwotICAgIGlmIChzYi0+b2xkTW9kZSA9PSAweDMpIHsKLQlyZWdzLnguYXggPSAweDExMzA7Ci0JcmVncy54LmJ4ID0gMDsKLQlyZWdzLnguZHggPSAwOwotCVBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotCXNiLT5vbGQ1MExpbmVzID0gKHJlZ3MuaC5kbCA9PSA0MiB8fCByZWdzLmguZGwgPT0gNDkpOwotCX0KLSAgICAodm9pZClod25kQ29uc29sZTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2soaW50IChfQVNNQVBJUCBzYXZlU3RhdGUpKGludCBmbGFncykpCi17Ci0gICAgLyogTm90IHVzZWQgZm9yIFNNWCAqLwotICAgICh2b2lkKXNhdmVTdGF0ZTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlQ29uc29sZVN0YXRlKGNvbnN0IHZvaWQgKnN0YXRlQnVmLFBNX0hXTkQgaHduZENvbnNvbGUpCi17Ci0gICAgUk1SRUdTICAgICAgICAgICAgICByZWdzOwotICAgIGNvbnN0IERPU19zdGF0ZUJ1ZiAgKnNiID0gc3RhdGVCdWY7Ci0KLSAgICAvKiBSZXRvcmUgNTAgbGluZSBtb2RlIGlmIHNldCAqLwotICAgIGlmIChzYi0+b2xkNTBMaW5lcykgewotCXJlZ3MueC5heCA9IDB4MTExMjsKLQlyZWdzLnguYnggPSAwOwotCVBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotCX0KLSAgICAodm9pZClod25kQ29uc29sZTsKLX0KLQotdm9pZCBQTUFQSSBQTV9jbG9zZUNvbnNvbGUoUE1fSFdORCBod25kQ29uc29sZSkKLXsKLSAgICAvKiBOb3QgdXNlZCBmb3IgU01YICovCi0gICAgKHZvaWQpaHduZENvbnNvbGU7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0T1NDdXJzb3JMb2NhdGlvbihpbnQgeCxpbnQgeSkKLXsKLSAgICB1Y2hhciAqX2Jpb3NQdHIgPSBQTV9nZXRCSU9TUG9pbnRlcigpOwotICAgIFBNX3NldEJ5dGUoX2Jpb3NQdHIrMHg1MCx4KTsKLSAgICBQTV9zZXRCeXRlKF9iaW9zUHRyKzB4NTEseSk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0T1NTY3JlZW5XaWR0aChpbnQgd2lkdGgsaW50IGhlaWdodCkKLXsKLSAgICB1Y2hhciAqX2Jpb3NQdHIgPSBQTV9nZXRCSU9TUG9pbnRlcigpOwotICAgIFBNX3NldFdvcmQoX2Jpb3NQdHIrMHg0QSx3aWR0aCk7Ci0gICAgUE1fc2V0V29yZChfYmlvc1B0cisweDRDLHdpZHRoKjIpOwotICAgIFBNX3NldEJ5dGUoX2Jpb3NQdHIrMHg4NCxoZWlnaHQtMSk7Ci0gICAgaWYgKGhlaWdodCA+IDI1KSB7Ci0JUE1fc2V0V29yZChfYmlvc1B0cisweDYwLDB4MDYwNyk7Ci0JUE1fc2V0Qnl0ZShfYmlvc1B0cisweDg1LDB4MDgpOwotCX0KLSAgICBlbHNlIHsKLQlQTV9zZXRXb3JkKF9iaW9zUHRyKzB4NjAsMHgwRDBFKTsKLQlQTV9zZXRCeXRlKF9iaW9zUHRyKzB4ODUsMHgwMTYpOwotCX0KLX0KLQotdm9pZCAqIFBNQVBJIFBNX21hbGxvY1NoYXJlZChsb25nIHNpemUpCi17Ci0gICAgcmV0dXJuIFBNX21hbGxvYyhzaXplKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9mcmVlU2hhcmVkKHZvaWQgKnB0cikKLXsKLSAgICBQTV9mcmVlKHB0cik7Ci19Ci0KLSNkZWZpbmUgR2V0Uk1WZWN0KGludG5vLGlzcikgICAgKihpc3IpID0gKCh1bG9uZyopcm1aZXJvUHRyKVtpbnRub10KLSNkZWZpbmUgU2V0Uk1WZWN0KGludG5vLGlzcikgICAgKCh1bG9uZyopcm1aZXJvUHRyKVtpbnRub10gPSAoaXNyKQotCi1pYm9vbCBQTUFQSSBQTV9kb0JJT1NQT1NUKAotICAgIHVzaG9ydCBheFZhbCwKLSAgICB1bG9uZyBCSU9TUGh5c0FkZHIsCi0gICAgdm9pZCAqbWFwcGVkQklPUywKLSAgICB1bG9uZyBCSU9TTGVuKQotewotICAgIHN0YXRpYyBpbnQgICAgICBmaXJzdFRpbWUgPSB0cnVlOwotICAgIHN0YXRpYyB1Y2hhciAgICAqcm1aZXJvUHRyOwotICAgIGxvbmcgICAgICAgICAgICBDdXJyZW50MTAsQ3VycmVudDZELEN1cnJlbnQ0MjsKLSAgICBSTVJFR1MgICAgICAgICAgcmVnczsKLSAgICBSTVNSRUdTICAgICAgICAgc3JlZ3M7Ci0KLSAgICAvKiBDcmVhdGUgYSB6ZXJvIG1lbW9yeSBtYXBwaW5nIGZvciB1cyB0byB1c2UgKi8KLSAgICBpZiAoZmlyc3RUaW1lKSB7Ci0Jcm1aZXJvUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDAsMHg3RkZGLHRydWUpOwotCWZpcnN0VGltZSA9IGZhbHNlOwotCX0KLQotICAgIC8qIFJlbWFwIHRoZSBzZWNvbmRhcnkgQklPUyB0byAweEMwMDAwIHBoeXNpY2FsICovCi0gICAgaWYgKEJJT1NQaHlzQWRkciAhPSAweEMwMDAwTCB8fCBCSU9TTGVuID4gMzI3NjgpIHsKLQkvKiBTTVggY2Fubm90IHZpcnR1YWxseSByZW1hcCB0aGUgQklPUywgc28gd2UgY2FuIG9ubHkgd29yayBpZiBhbGwKLQkgKiB0aGUgc2Vjb25kYXJ5IGNvbnRyb2xsZXJzIGFyZSBpZGVudGljYWwsIGFuZCB3ZSB0aGVuIHVzZSB0aGUKLQkgKiBCSU9TIG9uIHRoZSBmaXJzdCBjb250cm9sbGVyIGZvciBhbGwgdGhlIHJlbWFpbmluZyBjb250cm9sbGVycy4KLQkgKgotCSAqIEZvciBPUydlcyB0aGF0IGRvIHZpcnR1YWwgbWVtb3J5LCBhbmQgcmVtYXBwaW5nIG9mIDB4QzAwMDAKLQkgKiBwaHlzaWNhbCAocGVyaGFwcyBhIGNvcHkgb24gd3JpdGUgbWFwcGluZykgc2hvdWxkIGJlIGFsbCB0aGF0Ci0JICogaXMgbmVlZGVkLgotCSAqLwotCXJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAvKiBTYXZlIGN1cnJlbnQgaGFuZGxlcnMgb2YgaW50IDEwaCBhbmQgNkRoICovCi0gICAgR2V0Uk1WZWN0KDB4MTAsJkN1cnJlbnQxMCk7Ci0gICAgR2V0Uk1WZWN0KDB4NkQsJkN1cnJlbnQ2RCk7Ci0KLSAgICAvKiBQT1NUIHRoZSBzZWNvbmRhcnkgQklPUyAqLwotICAgIEdldFJNVmVjdCgweDQyLCZDdXJyZW50NDIpOwotICAgIFNldFJNVmVjdCgweDEwLEN1cnJlbnQ0Mik7ICAvKiBSZXN0b3JlIGludCAxMGggdG8gU1RELUJJT1MgKi8KLSAgICByZWdzLnguYXggPSBheFZhbDsKLSAgICBQTV9jYWxsUmVhbE1vZGUoMHhDMDAwLDB4MDAwMywmcmVncywmc3JlZ3MpOwotCi0gICAgLyogUmVzdG9yZSBjdXJyZW50IGhhbmRsZXJzICovCi0gICAgU2V0Uk1WZWN0KDB4MTAsQ3VycmVudDEwKTsKLSAgICBTZXRSTVZlY3QoMHg2RCxDdXJyZW50NkQpOwotCi0gICAgLyogU2Vjb25kIHRoZSBwcmltYXJ5IEJJT1MgbWFwcGluIDE6MSBmb3IgMHhDMDAwMCBwaHlzaWNhbCAqLwotICAgIGlmIChCSU9TUGh5c0FkZHIgIT0gMHhDMDAwMEwpIHsKLQkvKiBTTVggZG9lcyBub3Qgc3VwcG9ydCB0aGlzICovCi0JKHZvaWQpbWFwcGVkQklPUzsKLQl9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2xlZXAodWxvbmcgbWlsbGlzZWNvbmRzKQotewotICAgIHVsb25nICAgICAgICAgICBtaWNyb3NlY29uZHMgPSBtaWxsaXNlY29uZHMgKiAxMDAwTDsKLSAgICBMWlRpbWVyT2JqZWN0ICAgdG07Ci0KLSAgICBMWlRpbWVyT25FeHQoJnRtKTsKLSAgICB3aGlsZSAoTFpUaW1lckxhcEV4dCgmdG0pIDwgbWljcm9zZWNvbmRzKQotCTsKLSAgICBMWlRpbWVyT2ZmRXh0KCZ0bSk7Ci19Ci0KLWludCBQTUFQSSBQTV9nZXRDT01Qb3J0KGludCBwb3J0KQotewotICAgIHN3aXRjaCAocG9ydCkgewotCWNhc2UgMDogcmV0dXJuIDB4M0Y4OwotCWNhc2UgMTogcmV0dXJuIDB4MkY4OwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IFBNQVBJIFBNX2dldExQVFBvcnQoaW50IHBvcnQpCi17Ci0gICAgc3dpdGNoIChwb3J0KSB7Ci0JY2FzZSAwOiByZXR1cm4gMHgzQkM7Ci0JY2FzZSAxOiByZXR1cm4gMHgzNzg7Ci0JY2FzZSAyOiByZXR1cm4gMHgyNzg7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi1QTV9NT0RVTEUgUE1BUEkgUE1fbG9hZExpYnJhcnkoCi0gICAgY29uc3QgY2hhciAqc3pETExOYW1lKQotewotICAgICh2b2lkKXN6RExMTmFtZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCAqIFBNQVBJIFBNX2dldFByb2NBZGRyZXNzKAotICAgIFBNX01PRFVMRSBoTW9kdWxlLAotICAgIGNvbnN0IGNoYXIgKnN6UHJvY05hbWUpCi17Ci0gICAgKHZvaWQpaE1vZHVsZTsKLSAgICAodm9pZClzelByb2NOYW1lOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVMaWJyYXJ5KAotICAgIFBNX01PRFVMRSBoTW9kdWxlKQotewotICAgICh2b2lkKWhNb2R1bGU7Ci19Ci0KLWludCBQTUFQSSBQTV9zZXRJT1BMKAotICAgIGludCBsZXZlbCkKLXsKLSAgICByZXR1cm4gbGV2ZWw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW50ZXJuYWwgZnVuY3Rpb24gdG8gY29udmVydCB0aGUgZmluZCBkYXRhIHRvIHRoZSBnZW5lcmljIGludGVyZmFjZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBjb252ZXJ0RmluZERhdGEoCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhLAotICAgIHN0cnVjdCBmaW5kX3QgKmJsaykKLXsKLSAgICB1bG9uZyAgIGR3U2l6ZSA9IGZpbmREYXRhLT5kd1NpemU7Ci0KLSAgICBtZW1zZXQoZmluZERhdGEsMCxmaW5kRGF0YS0+ZHdTaXplKTsKLSAgICBmaW5kRGF0YS0+ZHdTaXplID0gZHdTaXplOwotICAgIGlmIChibGstPmF0dHJpYiAmIF9BX1JET05MWSkKLQlmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfUkVBRE9OTFk7Ci0gICAgaWYgKGJsay0+YXR0cmliICYgX0FfU1VCRElSKQotCWZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9ESVJFQ1RPUlk7Ci0gICAgaWYgKGJsay0+YXR0cmliICYgX0FfQVJDSCkKLQlmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfQVJDSElWRTsKLSAgICBpZiAoYmxrLT5hdHRyaWIgJiBfQV9ISURERU4pCi0JZmluZERhdGEtPmF0dHJpYiB8PSBQTV9GSUxFX0hJRERFTjsKLSAgICBpZiAoYmxrLT5hdHRyaWIgJiBfQV9TWVNURU0pCi0JZmluZERhdGEtPmF0dHJpYiB8PSBQTV9GSUxFX1NZU1RFTTsKLSAgICBmaW5kRGF0YS0+c2l6ZUxvID0gYmxrLT5zaXplOwotICAgIHN0cm5jcHkoZmluZERhdGEtPm5hbWUsYmxrLT5uYW1lLFBNX01BWF9QQVRIKTsKLSAgICBmaW5kRGF0YS0+bmFtZVtQTV9NQVhfUEFUSC0xXSA9IDA7Ci19Ci0KLSNkZWZpbmUgRklORF9NQVNLICAgKF9BX1JET05MWSB8IF9BX0FSQ0ggfCBfQV9TVUJESVIgfCBfQV9ISURERU4gfCBfQV9TWVNURU0pCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZmluZCB0aGUgZmlyc3QgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fZmluZEZpcnN0RmlsZSgKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICBQTV9maW5kRGF0YSAqZmluZERhdGEpCi17Ci0gICAgc3RydWN0IGZpbmRfdCAqYmxrOwotCi0gICAgaWYgKChibGsgPSBQTV9tYWxsb2Moc2l6ZW9mKCpibGspKSkgPT0gTlVMTCkKLQlyZXR1cm4gUE1fRklMRV9JTlZBTElEOwotICAgIGlmIChfZG9zX2ZpbmRmaXJzdCgoY2hhciopZmlsZW5hbWUsRklORF9NQVNLLGJsaykgPT0gMCkgewotCWNvbnZlcnRGaW5kRGF0YShmaW5kRGF0YSxibGspOwotCXJldHVybiBibGs7Ci0JfQotICAgIHJldHVybiBQTV9GSUxFX0lOVkFMSUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZmluZCB0aGUgbmV4dCBmaWxlIG1hdGNoaW5nIGEgc2VhcmNoIGNyaXRlcmlhIGluIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2ZpbmROZXh0RmlsZSgKLSAgICB2b2lkICpoYW5kbGUsCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhKQotewotICAgIHN0cnVjdCBmaW5kX3QgKmJsayA9IGhhbmRsZTsKLQotICAgIGlmIChfZG9zX2ZpbmRuZXh0KGJsaykgPT0gMCkgewotCWNvbnZlcnRGaW5kRGF0YShmaW5kRGF0YSxibGspOwotCXJldHVybiB0cnVlOwotCX0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gY2xvc2UgdGhlIGZpbmQgcHJvY2VzcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZmluZENsb3NlKAotICAgIHZvaWQgKmhhbmRsZSkKLXsKLSAgICBQTV9mcmVlKGhhbmRsZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIGEgZHJpdmUgaXMgYSB2YWxpZCBkcml2ZSBvciBub3QuIFVuZGVyIFVuaXggdGhpcwotZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UgZm9yIGFueXRoaW5nIGV4Y2VwdCBhIHZhbHVlIG9mIDMgKGNvbnNpZGVyZWQKLXRoZSByb290IGRyaXZlLCBhbmQgZXF1aXZhbGVudCB0byBDOiBmb3Igbm9uLVVuaXggc3lzdGVtcykuIFRoZSBkcml2ZQotbnVtYmVyaW5nIGlzOgotCi0gICAgMSAgIC0gRHJpdmUgQToKLSAgICAyICAgLSBEcml2ZSBCOgotICAgIDMgICAtIERyaXZlIEM6Ci0gICAgZXRjCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9kcml2ZVZhbGlkKAotICAgIGNoYXIgZHJpdmUpCi17Ci0gICAgUk1SRUdTICByZWdzOwotICAgIHJlZ3MuaC5kbCA9ICh1Y2hhcikoZHJpdmUgLSAnQScgKyAxKTsKLSAgICByZWdzLmguYWggPSAweDM2OyAgICAgICAgICAgICAgIC8qIEdldCBkaXNrIGluZm9ybWF0aW9uIHNlcnZpY2UgKi8KLSAgICBQTV9pbnQ4NigweDIxLCZyZWdzLCZyZWdzKTsKLSAgICByZXR1cm4gcmVncy54LmF4ICE9IDB4RkZGRjsgICAgIC8qIEFYID0gMHhGRkZGIGlmIGRpc2sgaXMgaW52YWxpZCAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGdldCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIHNwZWNpZmlmZWQgZHJpdmUuCi1VbmRlciBVbml4IHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHJlZ2FyZGxlc3MKLW9mIHdoYXQgdGhlIHZhbHVlIG9mICdkcml2ZScgaXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9nZXRkY3dkKAotICAgIGludCBkcml2ZSwKLSAgICBjaGFyICpkaXIsCi0gICAgaW50IGxlbikKLXsKLSAgICB1aW50IG9sZERyaXZlLG1heERyaXZlczsKLSAgICBfZG9zX2dldGRyaXZlKCZvbGREcml2ZSk7Ci0gICAgX2Rvc19zZXRkcml2ZShkcml2ZSwmbWF4RHJpdmVzKTsKLSAgICBnZXRjd2QoZGlyLGxlbik7Ci0gICAgX2Rvc19zZXRkcml2ZShvbGREcml2ZSwmbWF4RHJpdmVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjaGFuZ2UgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0RmlsZUF0dHIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgdWludCBhdHRyaWIpCi17Ci0jaWYgZGVmaW5lZChUTlQpICYmIGRlZmluZWQoX01TQ19WRVIpCi0gICAgRFdPUkQgYXR0ciA9IDA7Ci0KLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9SRUFET05MWSkKLQlhdHRyIHw9IEZJTEVfQVRUUklCVVRFX1JFQURPTkxZOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX0FSQ0hJVkUpCi0JYXR0ciB8PSBGSUxFX0FUVFJJQlVURV9BUkNISVZFOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX0hJRERFTikKLQlhdHRyIHw9IEZJTEVfQVRUUklCVVRFX0hJRERFTjsKLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9TWVNURU0pCi0JYXR0ciB8PSBGSUxFX0FUVFJJQlVURV9TWVNURU07Ci0gICAgU2V0RmlsZUF0dHJpYnV0ZXMoKExQU1RSKWZpbGVuYW1lLCBhdHRyKTsKLSNlbHNlCi0gICAgdWludCBhdHRyID0gMDsKLQotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX1JFQURPTkxZKQotCWF0dHIgfD0gX0FfUkRPTkxZOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX0FSQ0hJVkUpCi0JYXR0ciB8PSBfQV9BUkNIOwotICAgIGlmIChhdHRyaWIgJiBQTV9GSUxFX0hJRERFTikKLQlhdHRyIHw9IF9BX0hJRERFTjsKLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9TWVNURU0pCi0JYXR0ciB8PSBfQV9TWVNURU07Ci0gICAgX2Rvc19zZXRmaWxlYXR0cihmaWxlbmFtZSxhdHRyKTsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9ta2RpcigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSNpZmRlZiAgX19HTlVDX18KLSAgICByZXR1cm4gbWtkaXIoZmlsZW5hbWUsU19JUlVTUikgPT0gMDsKLSNlbHNlCi0vKkFNOiAgIHJldHVybiBta2RpcihmaWxlbmFtZSkgPT0gMDsgKi8KLSAgICByZXR1cm4oZmFsc2UpOwotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gcmVtb3ZlIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX3JtZGlyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotLypBTTogICByZXR1cm4gcm1kaXIoZmlsZW5hbWUpID09IDA7ICovCi0gICAgcmV0dXJuKGZhbHNlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZXMgYSBibG9jayBvZiBsb2NrZWQsIHBoeXNpY2FsbHkgY29udGlndW91cyBtZW1vcnkuIFRoZSBtZW1vcnkKLW1heSBiZSByZXF1aXJlZCB0byBiZSBiZWxvdyB0aGUgMTZNZWcgYm91bmRhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2FsbG9jTG9ja2VkTWVtKAotICAgIHVpbnQgc2l6ZSwKLSAgICB1bG9uZyAqcGh5c0FkZHIsCi0gICAgaWJvb2wgY29udGlndW91cywKLSAgICBpYm9vbCBiZWxvdzE2TSkKLXsKLSAgICB2b2lkICAgICAgICAgICAgKnA7Ci0gICAgdWludCAgICAgICAgICAgIHJfc2VnLHJfb2ZmOwotICAgIFBNX2xvY2tIYW5kbGUgICBsaDsKLQotICAgIC8qIFVuZGVyIERPUyB0aGUgb25seSB3YXkgdG8ga25vdyB0aGUgcGh5c2ljYWwgbWVtb3J5IGFkZHJlc3MgaXMgdG8KLSAgICAgKiBhbGxvY2F0ZSB0aGUgbWVtb3J5IGJlbG93IHRoZSAxTWVnIGJvdW5kYXJ5IGFzIHJlYWwgbW9kZSBtZW1vcnkuCi0gICAgICogV2UgYWxzbyBhbGxvY2F0ZSA0MDk1IGJ5dGVzIG1vcmUgbWVtb3J5IHRoYW4gd2UgbmVlZCwgc28gd2UgY2FuCi0gICAgICogcHJvcGVybHkgcGFnZSBhbGlnbiB0aGUgc3RhcnQgb2YgdGhlIG1lbW9yeSBibG9jayBmb3IgRE1BIG9wZXJhdGlvbnMuCi0gICAgICovCi0gICAgaWYgKHNpemUgPiA0MDk2KQotCXJldHVybiBOVUxMOwotICAgIGlmICgocCA9IFBNX2FsbG9jUmVhbFNlZygoc2l6ZSArIDB4RkZGKSAmIH4weEZGRiwmcl9zZWcsJnJfb2ZmKSkgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLSAgICAqcGh5c0FkZHIgPSAoKHJfc2VnIDw8IDQpICsgcl9vZmYgKyAweEZGRikgJiB+MHhGRkY7Ci0gICAgUE1fbG9ja0RhdGFQYWdlcyhwLHNpemUqMiwmbGgpOwotICAgIHJldHVybiBwOwotfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVMb2NrZWRNZW0odm9pZCAqcCx1aW50IHNpemUsaWJvb2wgY29udGlndW91cykKLXsKLSAgICAodm9pZClzaXplOwotICAgIFBNX2ZyZWVSZWFsU2VnKHApOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogR2VuZXJpYyBEUE1JIHJvdXRpbmVzIGNvbW1vbiB0byAxNi8zMiBiaXQgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXVsb25nIFBNQVBJIERQTUlfbWFwUGh5c2ljYWxUb0xpbmVhcih1bG9uZyBwaHlzQWRkcix1bG9uZyBsaW1pdCkKLXsKLSAgICBQTVJFR1MgIHI7Ci0gICAgdWxvbmcgICBwaHlzT2ZzOwotCi0gICAgaWYgKHBoeXNBZGRyIDwgMHgxMDAwMDBMKSB7Ci0JLyogV2UgY2FuJ3QgbWFwIG1lbW9yeSBiZWxvdyAxTWIsIGJ1dCB0aGUgbGluZWFyIGFkZHJlc3MgYXJlIGFscmVhZHkKLQkgKiBtYXBwZWQgMToxIGZvciB0aGlzIG1lbW9yeSBhbnl3YXkgc28gd2UganVzdCByZXR1cm4gdGhlIGJhc2UgYWRkcmVzcy4KLQkgKi8KLQlyZXR1cm4gcGh5c0FkZHI7Ci0JfQotCi0gICAgLyogUm91bmQgdGhlIHBoeXNpY2FsIGFkZHJlc3MgdG8gYSA0S2IgYm91bmRhcnkgYW5kIHRoZSBsaW1pdCB0byBhCi0gICAgICogNEtiLTEgYm91bmRhcnkgYmVmb3JlIHBhc3NpbmcgdGhlIHZhbHVlcyB0byBEUE1JIGFzIHNvbWUgZXh0ZW5kZXJzCi0gICAgICogd2lsbCBmYWlsIHRoZSBjYWxscyB1bmxlc3MgdGhpcyBpcyB0aGUgY2FzZS4gSWYgd2Ugcm91bmQgdGhlCi0gICAgICogcGh5c2ljYWwgYWRkcmVzcywgdGhlbiB3ZSBhbHNvIGFkZCBhbiBleHRyYSBvZmZzZXQgaW50byB0aGUgYWRkcmVzcwotICAgICAqIHRoYXQgd2UgcmV0dXJuLgotICAgICAqLwotICAgIHBoeXNPZnMgPSBwaHlzQWRkciAmIDQwOTU7Ci0gICAgcGh5c0FkZHIgPSBwaHlzQWRkciAmIH40MDk1OwotICAgIGxpbWl0ID0gKChsaW1pdCtwaHlzT2ZzKzErNDA5NSkgJiB+NDA5NSktMTsKLQotICAgIHIueC5heCA9IDB4ODAwOyAgICAgICAgICAgICAgICAgLyogRFBNSSBtYXAgcGh5c2ljYWwgdG8gbGluZWFyICAgICAgKi8KLSAgICByLnguYnggPSBwaHlzQWRkciA+PiAxNjsKLSAgICByLnguY3ggPSBwaHlzQWRkciAmIDB4RkZGRjsKLSAgICByLnguc2kgPSBsaW1pdCA+PiAxNjsKLSAgICByLnguZGkgPSBsaW1pdCAmIDB4RkZGRjsKLSAgICBQTV9pbnQzODYoMHgzMSwgJnIsICZyKTsKLSAgICBpZiAoci54LmNmbGFnKQotCXJldHVybiAweEZGRkZGRkZGVUw7Ci0gICAgcmV0dXJuICgodWxvbmcpci54LmJ4IDw8IDE2KSArIHIueC5jeCArIHBoeXNPZnM7Ci19Ci0KLWludCBQTUFQSSBEUE1JX3NldFNlbGVjdG9yQmFzZSh1c2hvcnQgc2VsLHVsb25nIGxpbkFkZHIpCi17Ci0gICAgUE1SRUdTICByOwotCi0gICAgci54LmF4ID0gNzsgICAgICAgICAgICAgICAgICAgICAvKiBEUE1JIHNldCBzZWxlY3RvciBiYXNlIGFkZHJlc3MgICAqLwotICAgIHIueC5ieCA9IHNlbDsKLSAgICByLnguY3ggPSBsaW5BZGRyID4+IDE2OwotICAgIHIueC5keCA9IGxpbkFkZHIgJiAweEZGRkY7Ci0gICAgUE1faW50Mzg2KDB4MzEsICZyLCAmcik7Ci0gICAgaWYgKHIueC5jZmxhZykKLQlyZXR1cm4gMDsKLSAgICByZXR1cm4gMTsKLX0KLQotdWxvbmcgUE1BUEkgRFBNSV9nZXRTZWxlY3RvckJhc2UodXNob3J0IHNlbCkKLXsKLSAgICBQTVJFR1MgIHI7Ci0KLSAgICByLnguYXggPSA2OyAgICAgICAgICAgICAgICAgICAgIC8qIERQTUkgZ2V0IHNlbGVjdG9yIGJhc2UgYWRkcmVzcyAgICovCi0gICAgci54LmJ4ID0gc2VsOwotICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOwotICAgIHJldHVybiAoKHVsb25nKXIueC5jeCA8PCAxNikgKyByLnguZHg7Ci19Ci0KLWludCBQTUFQSSBEUE1JX3NldFNlbGVjdG9yTGltaXQodXNob3J0IHNlbCx1bG9uZyBsaW1pdCkKLXsKLSAgICBQTVJFR1MgIHI7Ci0KLSAgICByLnguYXggPSA4OyAgICAgICAgICAgICAgICAgICAgIC8qIERQTUkgc2V0IHNlbGVjdG9yIGxpbWl0ICAgICAgICAgICovCi0gICAgci54LmJ4ID0gc2VsOwotICAgIHIueC5jeCA9IGxpbWl0ID4+IDE2OwotICAgIHIueC5keCA9IGxpbWl0ICYgMHhGRkZGOwotICAgIFBNX2ludDM4NigweDMxLCAmciwgJnIpOwotICAgIGlmIChyLnguY2ZsYWcpCi0JcmV0dXJuIDA7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXVpbnQgUE1BUEkgRFBNSV9jcmVhdGVTZWxlY3Rvcih1bG9uZyBiYXNlLHVsb25nIGxpbWl0KQotewotICAgIHVpbnQgICAgc2VsOwotICAgIFBNUkVHUyAgcjsKLQotICAgIC8qIEFsbG9jYXRlIDEgZGVzY3JpcHRvciAqLwotICAgIHIueC5heCA9IDA7Ci0gICAgci54LmN4ID0gMTsKLSAgICBQTV9pbnQzODYoMHgzMSwgJnIsICZyKTsKLSAgICBpZiAoci54LmNmbGFnKSByZXR1cm4gMDsKLSAgICBzZWwgPSByLnguYXg7Ci0KLSAgICAvKiBTZXQgdGhlIGRlc2NyaXB0b3IgYWNjZXNzIHJpZ2h0cyAoZm9yIGEgMzIgYml0IHBhZ2UgZ3JhbnVsYXIKLSAgICAgKiBzZWdtZW50LCByaW5nIDApLgotICAgICAqLwotICAgIHIueC5heCA9IDk7Ci0gICAgci54LmJ4ID0gc2VsOwotICAgIHIueC5jeCA9IDB4NDA5MzsKLSAgICBQTV9pbnQzODYoMHgzMSwgJnIsICZyKTsKLQotICAgIC8qIE1hcCBwaHlzaWNhbCBtZW1vcnkgYW5kIGNyZWF0ZSBzZWxlY3RvciAqLwotICAgIGlmICgoYmFzZSA9IERQTUlfbWFwUGh5c2ljYWxUb0xpbmVhcihiYXNlLGxpbWl0KSkgPT0gMHhGRkZGRkZGRlVMKQotCXJldHVybiAwOwotICAgIGlmICghRFBNSV9zZXRTZWxlY3RvckJhc2Uoc2VsLGJhc2UpKQotCXJldHVybiAwOwotICAgIGlmICghRFBNSV9zZXRTZWxlY3RvckxpbWl0KHNlbCxsaW1pdCkpCi0JcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHNlbDsKLX0KLQotdm9pZCBQTUFQSSBEUE1JX2ZyZWVTZWxlY3Rvcih1aW50IHNlbCkKLXsKLSAgICBQTVJFR1MgIHI7Ci0KLSAgICByLnguYXggPSAxOwotICAgIHIueC5ieCA9IHNlbDsKLSAgICBQTV9pbnQzODYoMHgzMSwgJnIsICZyKTsKLX0KLQotaW50IFBNQVBJIERQTUlfbG9ja0xpbmVhclBhZ2VzKHVsb25nIGxpbmVhcix1bG9uZyBsZW4pCi17Ci0gICAgUE1SRUdTICByOwotCi0gICAgci54LmF4ID0gMHg2MDA7ICAgICAgICAgICAgICAgICAgICAgLyogRFBNSSBMb2NrIExpbmVhciBSZWdpb24gICAgICAqLwotICAgIHIueC5ieCA9IChsaW5lYXIgPj4gMTYpOyAgICAgICAgICAgIC8qIExpbmVhciBhZGRyZXNzIGluIEJYOkNYICAgICAgKi8KLSAgICByLnguY3ggPSAobGluZWFyICYgMHhGRkZGKTsKLSAgICByLnguc2kgPSAobGVuID4+IDE2KTsgICAgICAgICAgICAgICAvKiBMZW5ndGggaW4gU0k6REkgICAgICAgICAgICAgICovCi0gICAgci54LmRpID0gKGxlbiAmIDB4RkZGRik7Ci0gICAgUE1faW50Mzg2KDB4MzEsICZyLCAmcik7Ci0gICAgcmV0dXJuICghci54LmNmbGFnKTsKLX0KLQotaW50IFBNQVBJIERQTUlfdW5sb2NrTGluZWFyUGFnZXModWxvbmcgbGluZWFyLHVsb25nIGxlbikKLXsKLSAgICBQTVJFR1MgIHI7Ci0KLSAgICByLnguYXggPSAweDYwMTsgICAgICAgICAgICAgICAgICAgICAvKiBEUE1JIFVubG9jayBMaW5lYXIgUmVnaW9uICAgICovCi0gICAgci54LmJ4ID0gKGxpbmVhciA+PiAxNik7ICAgICAgICAgICAgLyogTGluZWFyIGFkZHJlc3MgaW4gQlg6Q1ggICAgICAqLwotICAgIHIueC5jeCA9IChsaW5lYXIgJiAweEZGRkYpOwotICAgIHIueC5zaSA9IChsZW4gPj4gMTYpOyAgICAgICAgICAgICAgIC8qIExlbmd0aCBpbiBTSTpESSAgICAgICAgICAgICAgKi8KLSAgICByLnguZGkgPSAobGVuICYgMHhGRkZGKTsKLSAgICBQTV9pbnQzODYoMHgzMSwgJnIsICZyKTsKLSAgICByZXR1cm4gKCFyLnguY2ZsYWcpOwotfQotCi12b2lkICogUE1BUEkgRFBNSV9tYXBQaHlzaWNhbEFkZHIodWxvbmcgYmFzZSx1bG9uZyBsaW1pdCxpYm9vbCBpc0NhY2hlZCkKLXsKLSAgICBQTVNSRUdTIHNyZWdzOwotICAgIHVsb25nICAgbGluQWRkcjsKLSAgICB1bG9uZyAgIERTQmFzZUFkZHI7Ci0KLSAgICAvKiBHZXQgdGhlIGJhc2UgYWRkcmVzcyBmb3IgdGhlIGRlZmF1bHQgRFMgc2VsZWN0b3IgKi8KLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0gICAgRFNCYXNlQWRkciA9IERQTUlfZ2V0U2VsZWN0b3JCYXNlKHNyZWdzLmRzKTsKLSAgICBpZiAoKGJhc2UgPCAweDEwMDAwMCkgJiYgKERTQmFzZUFkZHIgPT0gMCkpIHsKLQkvKiBEUyBpcyB6ZXJvIGJhc2VkLCBzbyB3ZSBjYW4gZGlyZWN0bHkgYWNjZXNzIHRoZSBmaXJzdCAxTWIgb2YKLQkgKiBzeXN0ZW0gbWVtb3J5IChsaWtlIHVuZGVyIERPUzRHVykuCi0JICovCi0JcmV0dXJuICh2b2lkKiliYXNlOwotCX0KLQotICAgIC8qIE1hcCB0aGUgbWVtb3J5IHRvIGEgbGluZWFyIGFkZHJlc3MgdXNpbmcgRFBNSSBmdW5jdGlvbiAweDgwMCAqLwotICAgIGlmICgobGluQWRkciA9IERQTUlfbWFwUGh5c2ljYWxUb0xpbmVhcihiYXNlLGxpbWl0KSkgPT0gMCkgewotCWlmIChiYXNlID49IDB4MTAwMDAwKQotCSAgICByZXR1cm4gTlVMTDsKLQkvKiBJZiB0aGUgbGluZWFyIGFkZHJlc3MgbWFwcGluZyBmYWlscyBidXQgd2UgYXJlIHRyeWluZyB0bwotCSAqIG1hcCBhbiBhcmVhIGluIHRoZSBmaXJzdCAxTWIgb2Ygc3lzdGVtIG1lbW9yeSwgdGhlbiB3ZSBtdXN0Ci0JICogYmUgcnVubmluZyB1bmRlciBhIFdpbmRvd3Mgb3IgT1MvMiBET1MgYm94LiBVbmRlciB0aGVzZQotCSAqIGVudmlyb25tZW50cyB3ZSBjYW4gdXNlIHRoZSBzZWdtZW50IHdyYXAgYXJvdW5kIGFzIGEgZmFsbGJhY2sKLQkgKiBtZWFzdXJlLCBhcyB0aGlzIGRvZXMgd29yayBwcm9wZXJseS4KLQkgKi8KLQlsaW5BZGRyID0gYmFzZTsKLQl9Ci0KLSAgICAvKiBOb3cgZXhwYW5kIHRoZSBkZWZhdWx0IERTIHNlbGVjdG9yIHRvIDRHYiBzbyB3ZSBjYW4gYWNjZXNzIGl0ICovCi0gICAgaWYgKCFEUE1JX3NldFNlbGVjdG9yTGltaXQoc3JlZ3MuZHMsMHhGRkZGRkZGRlVMKSkKLQlyZXR1cm4gTlVMTDsKLQotICAgIC8qIEZpbmFsbHkgZW5hYmxlIGNhY2hpbmcgZm9yIHRoZSBwYWdlIHRhYmxlcyB0aGF0IHdlIGp1c3QgbWFwcGVkIGluLAotICAgICAqIHNpbmNlIERPUzRHVyBhbmQgUE1PREUvVyBjcmVhdGUgdGhlIHBhZ2UgdGFibGUgZW50cmllcyB3aXRob3V0Ci0gICAgICogY2FjaGluZyBlbmFibGVkIHdoaWNoIGh1cnRzIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgbGluZWFyIGZyYW1lYnVmZmVyCi0gICAgICogYXMgaXQgZGlzYWJsZXMgd3JpdGUgY29tYmluaW5nIG9uIFBlbnRpdW0gUHJvIGFuZCBhYm92ZSBwcm9jZXNzb3JzLgotICAgICAqCi0gICAgICogRm9yIHRob3NlIHByb2Nlc3NvcnMgY2FjaGUgZGlzYWJsaW5nIGlzIGJldHRlciBoYW5kbGVkIHRocm91Z2ggdGhlCi0gICAgICogTVRSUiByZWdpc3RlcnMgYW55d2F5ICh3ZSBjYW4gd3JpdGUgY29tYmluZSBhIHJlZ2lvbiBidXQgZGlzYWJsZQotICAgICAqIGNhY2hpbmcpIHNvIHRoYXQgTU1JTyByZWdpc3RlciByZWdpb25zIGRvIG5vdCBzY3JldyB1cC4KLSAgICAgKi8KLSAgICBpZiAoaXNDYWNoZWQpIHsKLQlpZiAoKFBEQiA9IF9QTV9nZXRQREIoKSkgIT0gMCAmJiBEU0Jhc2VBZGRyID09IDApIHsKLQkgICAgaW50ICAgICBzdGFydFBEQixlbmRQREIsaVBEQixzdGFydFBhZ2UsZW5kUGFnZSxzdGFydCxlbmQsaVBhZ2U7Ci0JICAgIHVsb25nICAgcGFnZVRhYmxlLCpwUGFnZVRhYmxlOwotCSAgICBpZiAoIXBQREIpIHsKLQkJaWYgKFBEQiA+PSAweDEwMDAwMCkKLQkJICAgIHBQREIgPSAodWxvbmcqKURQTUlfbWFwUGh5c2ljYWxUb0xpbmVhcihQREIsMHhGRkYpOwotCQllbHNlCi0JCSAgICBwUERCID0gKHVsb25nKilQREI7Ci0JCX0KLQkgICAgaWYgKHBQREIpIHsKLQkJc3RhcnRQREIgPSAobGluQWRkciA+PiAyMikgJiAweDNGRjsKLQkJc3RhcnRQYWdlID0gKGxpbkFkZHIgPj4gMTIpICYgMHgzRkY7Ci0JCWVuZFBEQiA9ICgobGluQWRkcitsaW1pdCkgPj4gMjIpICYgMHgzRkY7Ci0JCWVuZFBhZ2UgPSAoKGxpbkFkZHIrbGltaXQpID4+IDEyKSAmIDB4M0ZGOwotCQlmb3IgKGlQREIgPSBzdGFydFBEQjsgaVBEQiA8PSBlbmRQREI7IGlQREIrKykgewotCQkgICAgcGFnZVRhYmxlID0gcFBEQltpUERCXSAmIH4weEZGRjsKLQkJICAgIGlmIChwYWdlVGFibGUgPj0gMHgxMDAwMDApCi0JCQlwUGFnZVRhYmxlID0gKHVsb25nKilEUE1JX21hcFBoeXNpY2FsVG9MaW5lYXIocGFnZVRhYmxlLDB4RkZGKTsKLQkJICAgIGVsc2UKLQkJCXBQYWdlVGFibGUgPSAodWxvbmcqKXBhZ2VUYWJsZTsKLQkJICAgIHN0YXJ0ID0gKGlQREIgPT0gc3RhcnRQREIpID8gc3RhcnRQYWdlIDogMDsKLQkJICAgIGVuZCA9IChpUERCID09IGVuZFBEQikgPyBlbmRQYWdlIDogMHgzRkY7Ci0JCSAgICBmb3IgKGlQYWdlID0gc3RhcnQ7IGlQYWdlIDw9IGVuZDsgaVBhZ2UrKykKLQkJCXBQYWdlVGFibGVbaVBhZ2VdICY9IH4weDE4OwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAvKiBOb3cgcmV0dXJuIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSBpbnRvIHRoZSBkZWZhdWx0IERTICovCi0gICAgcmV0dXJuICh2b2lkKikobGluQWRkciAtIERTQmFzZUFkZHIpOwotfQotCi0vKiBTb21lIERPUyBleHRlbmRlciBpbXBsZW1lbnRhdGlvbnMgZG8gbm90IGRpcmVjdGx5IHN1cHBvcnQgY2FsbGluZyBhCi0gKiByZWFsIG1vZGUgcHJvY2VkdXJlIGZyb20gcHJvdGVjdGVkIG1vZGUuIEhvd2V2ZXIgd2UgY2FuIHNpbXVsYXRlIHdoYXQKLSAqIHdlIG5lZWQgdGVtcG9yYXJpbHkgaG9va2luZyB0aGUgSU5UIDZBaCB2ZWN0b3Igd2l0aCBhIHNtYWxsIHJlYWwgbW9kZQotICogc3R1YiB0aGF0IHdpbGwgY2FsbCBvdXIgcmVhbCBtb2RlIGNvZGUgZm9yIHVzLgotICovCi0KLXN0YXRpYyB1Y2hhciBpbnQ2QUhhbmRsZXJbXSA9IHsKLSAgICAweDAwLDB4MDAsMHgwMCwweDAwLCAgICAgICAgLyogIF9fUE1PREVfY2FsbFJlYWwgdmFyaWFibGUgICAgICAgICAgICovCi0gICAgMHhGQiwgICAgICAgICAgICAgICAgICAgICAgIC8qICBzdGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIDB4MkUsMHhGRiwweDFFLDB4MDAsMHgwMCwgICAvKiAgY2FsbCAgICBbY3M6X19QTU9ERV9jYWxsUmVhbF0gICAgICAgKi8KLSAgICAweENGLCAgICAgICAgICAgICAgICAgICAgICAgLyogIGlyZXRmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgfTsKLXN0YXRpYyB1Y2hhciAqY3JQdHIgPSBOVUxMOyAvKiBQb2ludGVyIHRvIG9mIGludCA2QSBoYW5kbGVyICAgICAgICAgKi8KLXN0YXRpYyB1aW50IGNyUlNlZyxjclJPZmY7ICAvKiBSZWFsIG1vZGUgc2VnOm9mZnNldCBvZiBoYW5kbGVyICAgICAgKi8KLQotdm9pZCBQTUFQSSBQTV9jYWxsUmVhbE1vZGUodWludCBzZWcsdWludCBvZmYsIFJNUkVHUyAqaW4sCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgdWNoYXIgICAqcDsKLSAgICB1aW50ICAgIG9sZFNlZyxvbGRPZmY7Ci0KLSAgICBpZiAoIWNyUHRyKSB7Ci0JLyogQWxsb2NhdGUgYW5kIGNvcHkgdGhlIG1lbW9yeSBibG9jayBvbmx5IG9uY2UgKi8KLQljclB0ciA9IFBNX2FsbG9jUmVhbFNlZyhzaXplb2YoaW50NkFIYW5kbGVyKSwgJmNyUlNlZywgJmNyUk9mZik7Ci0JbWVtY3B5KGNyUHRyLGludDZBSGFuZGxlcixzaXplb2YoaW50NkFIYW5kbGVyKSk7Ci0JfQotICAgIFBNX3NldFdvcmQoY3JQdHIsb2ZmKTsgICAgICAgICAgICAgIC8qIFBsdWcgaW4gYWRkcmVzcyB0byBjYWxsICAqLwotICAgIFBNX3NldFdvcmQoY3JQdHIrMixzZWcpOwotICAgIHAgPSBQTV9tYXBSZWFsUG9pbnRlcigwLDB4NkEgKiA0KTsKLSAgICBvbGRPZmYgPSBQTV9nZXRXb3JkKHApOyAgICAgICAgICAgICAvKiBTYXZlIG9sZCBoYW5kbGVyIGFkZHJlc3MgKi8KLSAgICBvbGRTZWcgPSBQTV9nZXRXb3JkKHArMik7Ci0gICAgUE1fc2V0V29yZChwLGNyUk9mZis0KTsgICAgICAgICAgICAgLyogSG9vayA2QSBoYW5kbGVyICAgICAgICAgICovCi0gICAgUE1fc2V0V29yZChwKzIsY3JSU2VnKTsKLSAgICBQTV9pbnQ4NngoMHg2QSwgaW4sIGluLCBzcmVncyk7ICAgICAvKiBDYWxsIHJlYWwgbW9kZSBjb2RlICAgICAgKi8KLSAgICBQTV9zZXRXb3JkKHAsb2xkT2ZmKTsgICAgICAgICAgICAgICAvKiBSZXN0b3JlIG9sZCBoYW5kbGVyICAgICAgKi8KLSAgICBQTV9zZXRXb3JkKHArMixvbGRTZWcpOwotfQotCi12b2lkICogUE1BUEkgUE1fZ2V0QklPU1BvaW50ZXIodm9pZCkKLXsgcmV0dXJuIFBNX21hcFBoeXNpY2FsQWRkcigweDQwMCwweEZGRkYsdHJ1ZSk7IH0KLQotdm9pZCAqIFBNQVBJIFBNX2dldEEwMDAwUG9pbnRlcih2b2lkKQoteyByZXR1cm4gUE1fbWFwUGh5c2ljYWxBZGRyKDB4QTAwMDAsMHhGRkZGLHRydWUpOyB9Ci0KLXZvaWQgKiBQTUFQSSBQTV9tYXBQaHlzaWNhbEFkZHIodWxvbmcgYmFzZSx1bG9uZyBsaW1pdCxpYm9vbCBpc0NhY2hlZCkKLXsgcmV0dXJuIERQTUlfbWFwUGh5c2ljYWxBZGRyKGJhc2UsbGltaXQsaXNDYWNoZWQpOyB9Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZVBoeXNpY2FsQWRkcih2b2lkICpwdHIsdWxvbmcgbGltaXQpCi17Ci0gICAgLyogTWFwcGluZyBjYW5ub3QgYmUgZnJlZSAqLwotfQotCi11bG9uZyBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHIodm9pZCAqcCkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBmaW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIGEgbGluZWFyICovCi0gICAgLyogICAgICAgYWRkcmVzcy4gKi8KLSAgICAodm9pZClwOwotICAgIHJldHVybiAweEZGRkZGRkZGVUw7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9tYXBUb1Byb2Nlc3Modm9pZCAqYmFzZSx1bG9uZyBsaW1pdCkKLXsKLSAgICAodm9pZClsaW1pdDsKLSAgICByZXR1cm4gKHZvaWQqKWJhc2U7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9tYXBSZWFsUG9pbnRlcih1aW50IHJfc2VnLHVpbnQgcl9vZmYpCi17Ci0gICAgc3RhdGljIHVjaGFyICp6ZXJvUHRyID0gTlVMTDsKLQotICAgIGlmICghemVyb1B0cikKLQl6ZXJvUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDAsMHhGRkZGRix0cnVlKTsKLSAgICByZXR1cm4gKHZvaWQqKSh6ZXJvUHRyICsgTUtfUEhZUyhyX3NlZyxyX29mZikpOwotfQotCi12b2lkICogUE1BUEkgUE1fYWxsb2NSZWFsU2VnKHVpbnQgc2l6ZSx1aW50ICpyX3NlZyx1aW50ICpyX29mZikKLXsKLSAgICBQTVJFR1MgICAgICByOwotICAgIHZvaWQgICAgICAgICpwOwotCi0gICAgci54LmF4ID0gMHgxMDA7ICAgICAgICAgICAgICAgICAvKiBEUE1JIGFsbG9jYXRlIERPUyBtZW1vcnkgICAgICAgICAqLwotICAgIHIueC5ieCA9IChzaXplICsgMHhGKSA+PiA0OyAgICAgLyogbnVtYmVyIG9mIHBhcmFncmFwaHMgICAgICAgICAgICAgKi8KLSAgICBQTV9pbnQzODYoMHgzMSwgJnIsICZyKTsKLSAgICBpZiAoci54LmNmbGFnKQotCXJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAvKiBEUE1JIGNhbGwgZmFpbGVkICAgICAgICAgICAgICAgICAqLwotICAgICpyX3NlZyA9IHIueC5heDsgICAgICAgICAgICAgICAgLyogUmVhbCBtb2RlIHNlZ21lbnQgICAgICAgICAgICAgICAgKi8KLSAgICAqcl9vZmYgPSAwOwotICAgIHAgPSBQTV9tYXBSZWFsUG9pbnRlcigqcl9zZWcsKnJfb2ZmKTsKLSAgICBfUE1fYWRkUmVhbE1vZGVCbG9jayhwLHIueC5keCk7Ci0gICAgcmV0dXJuIHA7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZVJlYWxTZWcodm9pZCAqbWVtKQotewotICAgIFBNUkVHUyAgcjsKLQotICAgIHIueC5heCA9IDB4MTAxOyAgICAgICAgICAgICAgICAgICAgIC8qIERQTUkgZnJlZSBET1MgbWVtb3J5ICAgICAgICAgKi8KLSAgICByLnguZHggPSBfUE1fZmluZFJlYWxNb2RlQmxvY2sobWVtKTsvKiBEWCA6PSBzZWxlY3RvciBmcm9tIDB4MTAwICAgICovCi0gICAgUE1faW50Mzg2KDB4MzEsICZyLCAmcik7Ci19Ci0KLXN0YXRpYyBEUE1JX2hhbmRsZXJfdCAgIERQTUlfaW50MTAgPSBOVUxMOwotCi12b2lkIFBNQVBJIERQTUlfc2V0SW50MTBIYW5kbGVyKERQTUlfaGFuZGxlcl90IGhhbmRsZXIpCi17Ci0gICAgRFBNSV9pbnQxMCA9IGhhbmRsZXI7Ci19Ci0KLXZvaWQgUE1BUEkgRFBNSV9pbnQ4NihpbnQgaW50bm8sIERQTUlfcmVncyAqcmVncykKLXsKLSAgICBQTVJFR1MgICAgICByOwotICAgIFBNU1JFR1MgICAgIHNyOwotCi0gICAgaWYgKGludG5vID09IDB4MTAgJiYgRFBNSV9pbnQxMCkgewotCWlmIChEUE1JX2ludDEwKHJlZ3MpKQotCSAgICByZXR1cm47Ci0JfQotICAgIFBNX3NlZ3JlYWQoJnNyKTsKLSAgICByLnguYXggPSAweDMwMDsgICAgICAgICAgICAgICAgIC8qIERQTUkgaXNzdWUgcmVhbCBpbnRlcnJ1cHQgICAgKi8KLSAgICByLmguYmwgPSBpbnRubzsKLSAgICByLmguYmggPSAwOwotICAgIHIueC5jeCA9IDA7Ci0gICAgc3IuZXMgPSBzci5kczsKLSAgICByLmUuZWRpID0gKHVpbnQpcmVnczsKLSAgICBQTV9pbnQzODZ4KDB4MzEsICZyLCAmciwgJnNyKTsgIC8qIElzc3VlIHRoZSBpbnRlcnJ1cHQgICAgICAgICAgKi8KLX0KLQotI2RlZmluZSBJTihyZWcpICAgICBybXJlZ3MucmVnID0gaW4tPmUucmVnCi0jZGVmaW5lIE9VVChyZWcpICAgIG91dC0+ZS5yZWcgPSBybXJlZ3MucmVnCi0KLWludCBQTUFQSSBQTV9pbnQ4NihpbnQgaW50bm8sIFJNUkVHUyAqaW4sIFJNUkVHUyAqb3V0KQotewotICAgIERQTUlfcmVncyAgIHJtcmVnczsKLQotICAgIG1lbXNldCgmcm1yZWdzLCAwLCBzaXplb2Yocm1yZWdzKSk7Ci0gICAgSU4oZWF4KTsgSU4oZWJ4KTsgSU4oZWN4KTsgSU4oZWR4KTsgSU4oZXNpKTsgSU4oZWRpKTsKLQotLyogVGhlc2UgcmVhbCBtb2RlIGludHMgbWF5IGNhdXNlIGNyYXNoZXMuICovCi0vKkFNOiAgIERQTUlfaW50ODYoaW50bm8sJnJtcmVncyk7ICAgICAgLyMjIyogRFBNSSBpc3N1ZSByZWFsIGludGVycnVwdCAgICAqLwotCi0gICAgT1VUKGVheCk7IE9VVChlYngpOyBPVVQoZWN4KTsgT1VUKGVkeCk7IE9VVChlc2kpOyBPVVQoZWRpKTsKLSAgICBvdXQtPnguY2ZsYWcgPSBybXJlZ3MuZmxhZ3MgJiAweDE7Ci0gICAgcmV0dXJuIG91dC0+eC5heDsKLX0KLQotaW50IFBNQVBJIFBNX2ludDg2eChpbnQgaW50bm8sIFJNUkVHUyAqaW4sIFJNUkVHUyAqb3V0LAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIERQTUlfcmVncyAgIHJtcmVnczsKLQotICAgIG1lbXNldCgmcm1yZWdzLCAwLCBzaXplb2Yocm1yZWdzKSk7Ci0gICAgSU4oZWF4KTsgSU4oZWJ4KTsgSU4oZWN4KTsgSU4oZWR4KTsgSU4oZXNpKTsgSU4oZWRpKTsKLSAgICBybXJlZ3MuZXMgPSBzcmVncy0+ZXM7Ci0gICAgcm1yZWdzLmRzID0gc3JlZ3MtPmRzOwotCi0vKkFNOiAgIERQTUlfaW50ODYoaW50bm8sJnJtcmVncyk7ICAgICAgLyMjIyogRFBNSSBpc3N1ZSByZWFsIGludGVycnVwdCAgICAqLwotCi0gICAgT1VUKGVheCk7IE9VVChlYngpOyBPVVQoZWN4KTsgT1VUKGVkeCk7IE9VVChlc2kpOyBPVVQoZWRpKTsKLSAgICBzcmVncy0+ZXMgPSBybXJlZ3MuZXM7Ci0gICAgc3JlZ3MtPmNzID0gcm1yZWdzLmNzOwotICAgIHNyZWdzLT5zcyA9IHJtcmVncy5zczsKLSAgICBzcmVncy0+ZHMgPSBybXJlZ3MuZHM7Ci0gICAgb3V0LT54LmNmbGFnID0gcm1yZWdzLmZsYWdzICYgMHgxOwotICAgIHJldHVybiBvdXQtPnguYXg7Ci19Ci0KLSNwcmFnbWEgcGFjaygxKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdWludCAgICBMYXJnZXN0QmxvY2tBdmFpbDsKLQl1aW50ICAgIE1heFVubG9ja2VkUGFnZTsKLQl1aW50ICAgIExhcmdlc3RMb2NrYWJsZVBhZ2U7Ci0JdWludCAgICBMaW5BZGRyU3BhY2U7Ci0JdWludCAgICBOdW1GcmVlUGFnZXNBdmFpbDsKLQl1aW50ICAgIE51bVBoeXNpY2FsUGFnZXNGcmVlOwotCXVpbnQgICAgVG90YWxQaHlzaWNhbFBhZ2VzOwotCXVpbnQgICAgRnJlZUxpbkFkZHJTcGFjZTsKLQl1aW50ICAgIFNpemVPZlBhZ2VGaWxlOwotCXVpbnQgICAgcmVzWzNdOwotCX0gTWVtSW5mbzsKLQotI3ByYWdtYSBwYWNrKCkKLQotdm9pZCBQTUFQSSBQTV9hdmFpbGFibGVNZW1vcnkodWxvbmcgKnBoeXNpY2FsLHVsb25nICp0b3RhbCkKLXsKLSAgICBQTVJFR1MgIHI7Ci0gICAgUE1TUkVHUyBzcjsKLSAgICBNZW1JbmZvIG1lbUluZm87Ci0KLSAgICBQTV9zZWdyZWFkKCZzcik7Ci0gICAgci54LmF4ID0gMHg1MDA7ICAgICAgICAgICAgICAgICAvKiBEUE1JIGdldCBmcmVlIG1lbW9yeSBpbmZvICovCi0gICAgc3IuZXMgPSBzci5kczsKLSAgICByLmUuZWRpID0gKHVpbnQpJm1lbUluZm87Ci0gICAgUE1faW50Mzg2eCgweDMxLCAmciwgJnIsICZzcik7ICAvKiBJc3N1ZSB0aGUgaW50ZXJydXB0ICovCi0gICAgKnBoeXNpY2FsID0gbWVtSW5mby5OdW1QaHlzaWNhbFBhZ2VzRnJlZSAqIDQwOTY7Ci0gICAgKnRvdGFsID0gbWVtSW5mby5MYXJnZXN0QmxvY2tBdmFpbDsKLSAgICBpZiAoKnRvdGFsIDwgKnBoeXNpY2FsKQotCSpwaHlzaWNhbCA9ICp0b3RhbDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVpbnQgUE1BUEkgUE1fZ2V0RmlsZUF0dHIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMhICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZ2V0IHRoZSBmaWxlIHRpbWUgYW5kIGRhdGUgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9nZXRGaWxlVGltZSgKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICBpYm9vbCBnbVRpbWUsCi0gICAgUE1fdGltZSAqdGltZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyEgKi8KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gc2V0IHRoZSBmaWxlIHRpbWUgYW5kIGRhdGUgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9zZXRGaWxlVGltZSgKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICBpYm9vbCBnbVRpbWUsCi0gICAgUE1fdGltZSAqdGltZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyEgKi8KLSAgICByZXR1cm4gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvcG1zbXguYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9wbXNteC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGUzMWJjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC9wbXNteC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBTTVggZW1iZWRkZWQgc3lzdGVtcyBkZXZlbG9wbWVudAotKgotKiBEZXNjcmlwdGlvbjogIEltcGxlbWVudGF0aW9uIGZvciB0aGUgT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5LCB3aGljaAotKiAgICAgICAgICAgICAgIGNvbnRhaW5zIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQgT1Mgc3BlY2lmaWMgc2VydmljZXMgaW4gYQotKiAgICAgICAgICAgICAgIGdlbmVyaWMsIGNyb3NzIHBsYXRmb3JtIEFQSS4gUG9ydGluZyB0aGUgT1MgUG9ydGFiaWxpdHkKLSogICAgICAgICAgICAgICBNYW5hZ2VyIGxpYnJhcnkgaXMgdGhlIGZpcnN0IHN0ZXAgdG8gcG9ydGluZyBhbnkgU2NpVGVjaAotKiAgICAgICAgICAgICAgIHByb2R1Y3RzIHRvIGEgbmV3IHBsYXRmb3JtLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxkb3MuaD4KLSNpbmNsdWRlICJzbXgvcHMybW91c2UuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCAgZ2xvYmFsRGF0YVN0YXJ0OwotCi1QTV9jcml0aWNhbEhhbmRsZXIgIF9WQVJBUEkgX1BNX2NyaXRIYW5kbGVyID0gTlVMTDsKLVBNX2JyZWFrSGFuZGxlciAgICAgX1ZBUkFQSSBfUE1fYnJlYWtIYW5kbGVyID0gTlVMTDsKLVBNX2ludEhhbmRsZXIgICAgICAgX1ZBUkFQSSBfUE1fdGltZXJIYW5kbGVyID0gTlVMTDsKLVBNX2ludEhhbmRsZXIgICAgICAgX1ZBUkFQSSBfUE1fcnRjSGFuZGxlciA9IE5VTEw7Ci1QTV9pbnRIYW5kbGVyICAgICAgIF9WQVJBUEkgX1BNX2tleUhhbmRsZXIgPSBOVUxMOwotUE1fa2V5MTVIYW5kbGVyICAgICBfVkFSQVBJIF9QTV9rZXkxNUhhbmRsZXIgPSBOVUxMOwotUE1fbW91c2VIYW5kbGVyICAgICBfVkFSQVBJIF9QTV9tb3VzZUhhbmRsZXIgPSBOVUxMOwotUE1faW50SGFuZGxlciAgICAgICBfVkFSQVBJIF9QTV9pbnQxMEhhbmRsZXIgPSBOVUxMOwotaW50ICAgICAgICAgICAgICAgICBfVkFSQVBJIF9QTV9tb3VzZU1hc2s7Ci0KLXVjaGFyICogICAgIF9WQVJBUEkgX1BNX2N0cmxDUHRyOyAgICAgICAgICAgICAgIC8qIExvY2F0aW9uIG9mIEN0cmwtQyBmbGFnICAgICAgKi8KLXVjaGFyICogICAgIF9WQVJBUEkgX1BNX2N0cmxCUHRyOyAgICAgICAgICAgICAgIC8qIExvY2F0aW9uIG9mIEN0cmwtQnJlYWsgZmxhZyAgKi8KLXVjaGFyICogICAgIF9WQVJBUEkgX1BNX2NyaXRQdHI7ICAgICAgICAgICAgICAgIC8qIExvY2F0aW9uIG9mIENyaXRpY2FsIGVycm9yIEJmKi8KLVBNRkFSUFRSICAgIF9WQVJBUEkgX1BNX3ByZXZUaW1lciA9IFBNTlVMTDsgICAgIC8qIFByZXZpb3VzIHRpbWVyIGhhbmRsZXIgICAgICAgKi8KLVBNRkFSUFRSICAgIF9WQVJBUEkgX1BNX3ByZXZSVEMgPSBQTU5VTEw7ICAgICAgIC8qIFByZXZpb3VzIFJUQyBoYW5kbGVyICAgICAgICAgKi8KLVBNRkFSUFRSICAgIF9WQVJBUEkgX1BNX3ByZXZLZXkgPSBQTU5VTEw7ICAgICAgIC8qIFByZXZpb3VzIGtleSBoYW5kbGVyICAgICAgICAgKi8KLVBNRkFSUFRSICAgIF9WQVJBUEkgX1BNX3ByZXZLZXkxNSA9IFBNTlVMTDsgICAgIC8qIFByZXZpb3VzIGtleTE1IGhhbmRsZXIgICAgICAgKi8KLVBNRkFSUFRSICAgIF9WQVJBUEkgX1BNX3ByZXZCcmVhayA9IFBNTlVMTDsgICAgIC8qIFByZXZpb3VzIGJyZWFrIGhhbmRsZXIgICAgICAgKi8KLVBNRkFSUFRSICAgIF9WQVJBUEkgX1BNX3ByZXZDdHJsQyA9IFBNTlVMTDsgICAgIC8qIFByZXZpb3VzIEN0cmxDIGhhbmRsZXIgICAgICAgKi8KLVBNRkFSUFRSICAgIF9WQVJBUEkgX1BNX3ByZXZDcml0aWNhbCA9IFBNTlVMTDsgIC8qIFByZXZpb3VzIGNyaXRpY2FsIGhhbmRsZXIgICAgKi8KLWxvbmcgICAgICAgIF9WQVJBUEkgX1BNX3ByZXZSZWFsVGltZXI7ICAgICAgICAgIC8qIFByZXZpb3VzIHJlYWwgbW9kZSB0aW1lciAgICAgKi8KLWxvbmcgICAgICAgIF9WQVJBUEkgX1BNX3ByZXZSZWFsUlRDOyAgICAgICAgICAgIC8qIFByZXZpb3VzIHJlYWwgbW9kZSBSVEMgICAgICAgKi8KLWxvbmcgICAgICAgIF9WQVJBUEkgX1BNX3ByZXZSZWFsS2V5OyAgICAgICAgICAgIC8qIFByZXZpb3VzIHJlYWwgbW9kZSBrZXkgICAgICAgKi8KLWxvbmcgICAgICAgIF9WQVJBUEkgX1BNX3ByZXZSZWFsS2V5MTU7ICAgICAgICAgIC8qIFByZXZpb3VzIHJlYWwgbW9kZSBrZXkxNSAgICAgKi8KLWxvbmcgICAgICAgIF9WQVJBUEkgX1BNX3ByZXZSZWFsSW50MTA7ICAgICAgICAgIC8qIFByZXZpb3VzIHJlYWwgbW9kZSBpbnQgMTBoICAgKi8KLXN0YXRpYyB1Y2hhciAgICAgICAgX1BNX29sZENNT1NSZWdBOyAgICAgICAgICAgIC8qIENNT1MgcmVnaXN0ZXIgQSBjb250ZW50cyAgICAgKi8KLXN0YXRpYyB1Y2hhciAgICAgICAgX1BNX29sZENNT1NSZWdCOyAgICAgICAgICAgIC8qIENNT1MgcmVnaXN0ZXIgQiBjb250ZW50cyAgICAgKi8KLXN0YXRpYyB1Y2hhciAgICAgICAgX1BNX29sZFJUQ1BJQzI7ICAgICAgICAgICAgIC8qIE1hc2sgdmFsdWUgZm9yIFJUQyBJUlE4ICAgICAgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR2xvYmFscyBmb3IgbG9ja2luZyBpbnRlcnJ1cHQgaGFuZGxlcnMgaW4gX3Btc214LmFzbSAqLwotCi1leHRlcm4gaW50ICBfQVNNQVBJIF9QTV9wbXNteERhdGFTdGFydDsKLWV4dGVybiBpbnQgIF9BU01BUEkgX1BNX3Btc214RGF0YUVuZDsKLXZvaWQgX0FTTUFQSSBfUE1fcG1zbXhDb2RlU3RhcnQodm9pZCk7Ci12b2lkIF9BU01BUEkgX1BNX3Btc214Q29kZUVuZCh2b2lkKTsKLQotLyogUHJvdGVjdGVkIG1vZGUgaW50ZXJydXB0IGhhbmRsZXJzLCBhbHNvIGNhbGxlZCBieSBQTSBjYWxsYmFja3MgYmVsb3cgKi8KLQotdm9pZCBfQVNNQVBJIF9QTV90aW1lcklTUih2b2lkKTsKLXZvaWQgX0FTTUFQSSBfUE1fcnRjSVNSKHZvaWQpOwotdm9pZCBfQVNNQVBJIF9QTV9rZXlJU1Iodm9pZCk7Ci12b2lkIF9BU01BUEkgX1BNX2tleTE1SVNSKHZvaWQpOwotdm9pZCBfQVNNQVBJIF9QTV9icmVha0lTUih2b2lkKTsKLXZvaWQgX0FTTUFQSSBfUE1fY3RybENJU1Iodm9pZCk7Ci12b2lkIF9BU01BUEkgX1BNX2NyaXRpY2FsSVNSKHZvaWQpOwotdm9pZCBfQVNNQVBJIF9QTV9tb3VzZUlTUih2b2lkKTsKLXZvaWQgX0FTTUFQSSBfUE1faW50MTBQTUNCKHZvaWQpOwotCi0vKiBQcm90ZWN0ZWQgbW9kZSBEUE1JIGNhbGxiYWNrIGhhbmRsZXJzICovCi0KLXZvaWQgX0FTTUFQSSBfUE1fbW91c2VQTUNCKHZvaWQpOwotCi0vKiBSb3V0aW5lIHRvIGluc3RhbGwgYSBtb3VzZSBoYW5kbGVyIGZ1bmN0aW9uICovCi0KLXZvaWQgX0FTTUFQSSBfUE1fc2V0TW91c2VIYW5kbGVyKGludCBtYXNrKTsKLQotLyogUm91dGluZSB0byBhbGxvY2F0ZSBEUE1JIHJlYWwgbW9kZSBjYWxsYmFjayByb3V0aW5lcyAqLwotCi12b2lkIF9BU01BUEkgX0RQTUlfYWxsb2NhdGVDYWxsYmFjayh2b2lkIChfQVNNQVBJICpwbWNvZGUpKCksdm9pZCAqcm1yZWdzLGxvbmcgKlJNQ0IpOwotdm9pZCBfQVNNQVBJIF9EUE1JX2ZyZWVDYWxsYmFjayhsb25nIFJNQ0IpOwotCi0vKiBEUE1JIGhlbHBlciBmdW5jdGlvbnMgaW4gUE1MSVRFLkMgKi8KLQotdWxvbmcgICBQTUFQSSBEUE1JX21hcFBoeXNpY2FsVG9MaW5lYXIodWxvbmcgcGh5c0FkZHIsdWxvbmcgbGltaXQpOwotaW50ICAgICBQTUFQSSBEUE1JX3NldFNlbGVjdG9yQmFzZSh1c2hvcnQgc2VsLHVsb25nIGxpbkFkZHIpOwotdWxvbmcgICBQTUFQSSBEUE1JX2dldFNlbGVjdG9yQmFzZSh1c2hvcnQgc2VsKTsKLWludCAgICAgUE1BUEkgRFBNSV9zZXRTZWxlY3RvckxpbWl0KHVzaG9ydCBzZWwsdWxvbmcgbGltaXQpOwotdWludCAgICBQTUFQSSBEUE1JX2NyZWF0ZVNlbGVjdG9yKHVsb25nIGJhc2UsdWxvbmcgbGltaXQpOwotdm9pZCAgICBQTUFQSSBEUE1JX2ZyZWVTZWxlY3Rvcih1aW50IHNlbCk7Ci1pbnQgICAgIFBNQVBJIERQTUlfbG9ja0xpbmVhclBhZ2VzKHVsb25nIGxpbmVhcix1bG9uZyBsZW4pOwotaW50ICAgICBQTUFQSSBEUE1JX3VubG9ja0xpbmVhclBhZ2VzKHVsb25nIGxpbmVhcix1bG9uZyBsZW4pOwotCi0vKiBGdW5jdGlvbnMgdG8gcmVhZCBhbmQgd3JpdGUgQ01PUyByZWdpc3RlcnMgKi8KLQotdWNoYXIgICBQTUFQSSBfUE1fcmVhZENNT1MoaW50IGluZGV4KTsKLXZvaWQgICAgUE1BUEkgX1BNX3dyaXRlQ01PUyhpbnQgaW5kZXgsdWNoYXIgdmFsdWUpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogR2VuZXJpYyByb3V0aW5lcyBjb21tb24gdG8gYWxsIGVudmlyb25tZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgUE1BUEkgUE1fcmVzZXRNb3VzZURyaXZlcihpbnQgaGFyZFJlc2V0KQotewotICAgIHBzMk1vdXNlUmVzZXQoKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRSZWFsVGltZUNsb2NrRnJlcXVlbmN5KGludCBmcmVxdWVuY3kpCi17Ci0gICAgc3RhdGljIHNob3J0IGNvbnZlcnRbXSA9IHsKLQk4MTkyLAotCTQwOTYsCi0JMjA0OCwKLQkxMDI0LAotCTUxMiwKLQkyNTYsCi0JMTI4LAotCTY0LAotCTMyLAotCTE2LAotCTgsCi0JNCwKLQkyLAotCS0xLAotCX07Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBGaXJzdCBjbGVhciBhbnkgcGVuZGluZyBSVEMgdGltZW91dCBpZiBub3QgY2xlYXJlZCAqLwotICAgIF9QTV9yZWFkQ01PUygweDBDKTsKLSAgICBpZiAoZnJlcXVlbmN5ID09IDApIHsKLQkvKiBEaXNhYmxlIFJUQyB0aW1vdXQgKi8KLQlfUE1fd3JpdGVDTU9TKDB4MEEsX1BNX29sZENNT1NSZWdBKTsKLQlfUE1fd3JpdGVDTU9TKDB4MEIsX1BNX29sZENNT1NSZWdCICYgMHgwRik7Ci0JfQotICAgIGVsc2UgewotCS8qIENvbnZlcnQgZnJlcXVlbmN5IHZhbHVlIHRvIFJUQyBjbG9jayBpbmRleGVzICovCi0JZm9yIChpID0gMDsgY29udmVydFtpXSAhPSAtMTsgaSsrKSB7Ci0JICAgIGlmIChjb252ZXJ0W2ldID09IGZyZXF1ZW5jeSkKLQkJYnJlYWs7Ci0JICAgIH0KLQotCS8qIFNldCBSVEMgdGltb3V0IHZhbHVlIGFuZCBlbmFibGUgdGltZW91dCAqLwotCV9QTV93cml0ZUNNT1MoMHgwQSwoX1BNX29sZENNT1NSZWdBICYgMHhGMCkgfCAoaSszKSk7Ci0JX1BNX3dyaXRlQ01PUygweDBCLChfUE1fb2xkQ01PU1JlZ0IgJiAweDBGKSB8IDB4NDApOwotCX0KLX0KLQotc3RhdGljIHZvaWQgUE1BUEkgbG9ja1BNSGFuZGxlcnModm9pZCkKLXsKLSAgICBzdGF0aWMgaW50ICAgICAgbG9ja2VkID0gMDsKLSAgICBpbnQgICAgICAgICAgICAgc3RhdCA9IDA7Ci0gICAgUE1fbG9ja0hhbmRsZSAgIGxoOwotCi0gICAgLyogTG9jayBhbGwgb2YgdGhlIGNvZGUgYW5kIGRhdGEgdXNlZCBieSBvdXIgcHJvdGVjdGVkIG1vZGUgaW50ZXJydXB0Ci0gICAgICogaGFuZGxpbmcgcm91dGluZXMsIHNvIHRoYXQgaXQgd2lsbCBjb250aW51ZSB0byB3b3JrIGNvcnJlY3RseQotICAgICAqIHVuZGVyIHJlYWwgbW9kZS4KLSAgICAgKi8KLSAgICBpZiAoIWxvY2tlZCkgewotCVBNX3NhdmVEUygpOwotCXN0YXQgID0gIVBNX2xvY2tEYXRhUGFnZXMoJmdsb2JhbERhdGFTdGFydC0yMDQ4LDQwOTYsJmxoKTsKLQlzdGF0IHw9ICFQTV9sb2NrRGF0YVBhZ2VzKCZfUE1fcG1zbXhEYXRhU3RhcnQsKGludCkmX1BNX3Btc214RGF0YUVuZCAtIChpbnQpJl9QTV9wbXNteERhdGFTdGFydCwmbGgpOwotCXN0YXQgfD0gIVBNX2xvY2tDb2RlUGFnZXMoKF9fY29kZVB0cilfUE1fcG1zbXhDb2RlU3RhcnQsKGludClfUE1fcG1zbXhDb2RlRW5kLShpbnQpX1BNX3Btc214Q29kZVN0YXJ0LCZsaCk7Ci0JaWYgKHN0YXQpIHsKLQkgICAgcHJpbnRmKCJQYWdlIGxvY2tpbmcgc2VydmljZXMgZmFpbGVkIC0gaW50ZXJydXB0IGhhbmRsaW5nIG5vdCBzYWZlIVxuIik7Ci0JICAgIGV4aXQoMSk7Ci0JICAgIH0KLQlsb2NrZWQgPSAxOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9nZXRQTXZlY3QoaW50IGludG5vLCBQTUZBUlBUUiAqaXNyKQotewotICAgIFBNUkVHUyAgcmVnczsKLQotICAgIHJlZ3MueC5heCA9IDB4MjA0OwotICAgIHJlZ3MuaC5ibCA9IGludG5vOwotICAgIFBNX2ludDM4NigweDMxLCZyZWdzLCZyZWdzKTsKLSAgICBpc3ItPnNlbCA9IHJlZ3MueC5jeDsKLSAgICBpc3ItPm9mZiA9IHJlZ3MuZS5lZHg7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fc2V0UE12ZWN0KGludCBpbnRubywgUE1faW50SGFuZGxlciBpc3IpCi17Ci0gICAgUE1TUkVHUyBzcmVnczsKLSAgICBQTVJFR1MgIHJlZ3M7Ci0KLSAgICBQTV9zYXZlRFMoKTsKLSAgICByZWdzLnguYXggPSAweDIwNTsgICAgICAgICAgLyogU2V0IHByb3RlY3RlZCBtb2RlIHZlY3RvciAgICAgICAgKi8KLSAgICByZWdzLmguYmwgPSBpbnRubzsKLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0gICAgcmVncy54LmN4ID0gc3JlZ3MuY3M7Ci0gICAgcmVncy5lLmVkeCA9ICh1aW50KWlzcjsKLSAgICBQTV9pbnQzODYoMHgzMSwmcmVncywmcmVncyk7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZVBNdmVjdChpbnQgaW50bm8sIFBNRkFSUFRSIGlzcikKLXsKLSAgICBQTVJFR1MgIHJlZ3M7Ci0KLSAgICByZWdzLnguYXggPSAweDIwNTsKLSAgICByZWdzLmguYmwgPSBpbnRubzsKLSAgICByZWdzLnguY3ggPSBpc3Iuc2VsOwotICAgIHJlZ3MuZS5lZHggPSBpc3Iub2ZmOwotICAgIFBNX2ludDM4NigweDMxLCZyZWdzLCZyZWdzKTsKLX0KLQotc3RhdGljIGxvbmcgcHJldlJlYWxCcmVhazsgICAgICAvKiBQcmV2aW91cyByZWFsIG1vZGUgYnJlYWsgaGFuZGxlciAgICAgKi8KLXN0YXRpYyBsb25nIHByZXZSZWFsQ3RybEM7ICAgICAgLyogUHJldmlvdXMgcmVhbCBtb2RlIEN0cmxDIGhhbmRsZXIgICAgICovCi1zdGF0aWMgbG9uZyBwcmV2UmVhbENyaXRpY2FsOyAgIC8qIFByZXYgcmVhbCBtb2RlIGNyaXRpY2FsIGhhbmRsZXIgICAgICAqLwotCi1pbnQgUE1BUEkgUE1fc2V0TW91c2VIYW5kbGVyKGludCBtYXNrLCBQTV9tb3VzZUhhbmRsZXIgbWgpCi17Ci0gICAgbG9ja1BNSGFuZGxlcnMoKTsgICAgICAgICAgIC8qIEVuc3VyZSBvdXIgaGFuZGxlcnMgYXJlIGxvY2tlZCAgICovCi0KLSAgICBfUE1fbW91c2VIYW5kbGVyID0gbWg7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZU1vdXNlSGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fbW91c2VIYW5kbGVyKQotCV9QTV9tb3VzZUhhbmRsZXIgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBnZXRJU1IoaW50IGludG5vLCBQTUZBUlBUUiAqcG1pc3IsIGxvbmcgKnJlYWxpc3IpCi17Ci0gICAgUE1fZ2V0UE12ZWN0KGludG5vLHBtaXNyKTsKLX0KLQotc3RhdGljIHZvaWQgcmVzdG9yZUlTUihpbnQgaW50bm8sIFBNRkFSUFRSIHBtaXNyLCBsb25nIHJlYWxpc3IpCi17Ci0gICAgUE1fcmVzdG9yZVBNdmVjdChpbnRubyxwbWlzcik7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldElTUihpbnQgaW50bm8sIHZvaWQgKCogUE1BUEkgcG1pc3IpKCkpCi17Ci0gICAgbG9ja1BNSGFuZGxlcnMoKTsgICAgICAgICAgIC8qIEVuc3VyZSBvdXIgaGFuZGxlcnMgYXJlIGxvY2tlZCAgICovCi0gICAgUE1fc2V0UE12ZWN0KGludG5vLHBtaXNyKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRUaW1lckhhbmRsZXIoUE1faW50SGFuZGxlciB0aCkKLXsKLSAgICBnZXRJU1IoUE1fSVJRMCwgJl9QTV9wcmV2VGltZXIsICZfUE1fcHJldlJlYWxUaW1lcik7Ci0gICAgX1BNX3RpbWVySGFuZGxlciA9IHRoOwotICAgIHNldElTUihQTV9JUlEwLCBfUE1fdGltZXJJU1IpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVUaW1lckhhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX3RpbWVySGFuZGxlcikgewotCXJlc3RvcmVJU1IoUE1fSVJRMCwgX1BNX3ByZXZUaW1lciwgX1BNX3ByZXZSZWFsVGltZXIpOwotCV9QTV90aW1lckhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotaWJvb2wgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0hhbmRsZXIoUE1faW50SGFuZGxlciB0aCxpbnQgZnJlcXVlbmN5KQotewotICAgIC8qIFNhdmUgdGhlIG9sZCBDTU9TIHJlYWwgdGltZSBjbG9jayB2YWx1ZXMgKi8KLSAgICBfUE1fb2xkQ01PU1JlZ0EgPSBfUE1fcmVhZENNT1MoMHgwQSk7Ci0gICAgX1BNX29sZENNT1NSZWdCID0gX1BNX3JlYWRDTU9TKDB4MEIpOwotCi0gICAgLyogU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgaW50ZXJydXB0IGhhbmRsZXIgKi8KLSAgICBnZXRJU1IoMHg3MCwgJl9QTV9wcmV2UlRDLCAmX1BNX3ByZXZSZWFsUlRDKTsKLSAgICBfUE1fcnRjSGFuZGxlciA9IHRoOwotICAgIHNldElTUigweDcwLCBfUE1fcnRjSVNSKTsKLQotICAgIC8qIFByb2dyYW0gdGhlIHJlYWwgdGltZSBjbG9jayBkZWZhdWx0IGZyZXF1ZW5jeSAqLwotICAgIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3koZnJlcXVlbmN5KTsKLQotICAgIC8qIFVubWFzayBJUlE4IGluIHRoZSBQSUMyICovCi0gICAgX1BNX29sZFJUQ1BJQzIgPSBQTV9pbnBiKDB4QTEpOwotICAgIFBNX291dHBiKDB4QTEsX1BNX29sZFJUQ1BJQzIgJiAweEZFKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlUmVhbFRpbWVDbG9ja0hhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX3J0Y0hhbmRsZXIpIHsKLQkvKiBSZXN0b3JlIENNT1MgcmVnaXN0ZXJzIGFuZCBtYXNrIFJUQyBjbG9jayAqLwotCV9QTV93cml0ZUNNT1MoMHgwQSxfUE1fb2xkQ01PU1JlZ0EpOwotCV9QTV93cml0ZUNNT1MoMHgwQixfUE1fb2xkQ01PU1JlZ0IpOwotCVBNX291dHBiKDB4QTEsKFBNX2lucGIoMHhBMSkgJiAweEZFKSB8IChfUE1fb2xkUlRDUElDMiAmIH4weEZFKSk7Ci0KLQkvKiBSZXN0b3JlIHRoZSBpbnRlcnJ1cHQgdmVjdG9yICovCi0JcmVzdG9yZUlTUigweDcwLCBfUE1fcHJldlJUQywgX1BNX3ByZXZSZWFsUlRDKTsKLQlfUE1fcnRjSGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi12b2lkIFBNQVBJIFBNX3NldEtleUhhbmRsZXIoUE1faW50SGFuZGxlciBraCkKLXsKLSAgICBnZXRJU1IoUE1fSVJRMSwgJl9QTV9wcmV2S2V5LCAmX1BNX3ByZXZSZWFsS2V5KTsKLSAgICBfUE1fa2V5SGFuZGxlciA9IGtoOwotICAgIHNldElTUihQTV9JUlExLCBfUE1fa2V5SVNSKTsKLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlS2V5SGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fa2V5SGFuZGxlcikgewotCXJlc3RvcmVJU1IoUE1fSVJRMSwgX1BNX3ByZXZLZXksIF9QTV9wcmV2UmVhbEtleSk7Ci0JX1BNX2tleUhhbmRsZXIgPSBOVUxMOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRLZXkxNUhhbmRsZXIoUE1fa2V5MTVIYW5kbGVyIGtoKQotewotICAgIGdldElTUigweDE1LCAmX1BNX3ByZXZLZXkxNSwgJl9QTV9wcmV2UmVhbEtleTE1KTsKLSAgICBfUE1fa2V5MTVIYW5kbGVyID0ga2g7Ci0gICAgc2V0SVNSKDB4MTUsIF9QTV9rZXkxNUlTUik7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fcmVzdG9yZUtleTE1SGFuZGxlcih2b2lkKQotewotICAgIGlmIChfUE1fa2V5MTVIYW5kbGVyKSB7Ci0JcmVzdG9yZUlTUigweDE1LCBfUE1fcHJldktleTE1LCBfUE1fcHJldlJlYWxLZXkxNSk7Ci0JX1BNX2tleTE1SGFuZGxlciA9IE5VTEw7Ci0JfQotfQotCi0vKiBSZWFsIG1vZGUgQ3RybC1DIGFuZCBDdHJsLUJyZWFrIGhhbmRsZXIuIFRoaXMgaGFuZGxlciBzaW1wbHkgc2V0cyBhCi0gKiBmbGFnIGluIHRoZSByZWFsIG1vZGUgY29kZSBzZWdtZW50IGFuZCBleGl0LiBXZSBzYXZlIHRoZSBsb2NhdGlvbgotICogb2YgdGhpcyBmbGFnIGluIHJlYWwgbW9kZSBtZW1vcnkgc28gdGhhdCBib3RoIHRoZSByZWFsIG1vZGUgYW5kCi0gKiBwcm90ZWN0ZWQgbW9kZSBjb2RlIHdpbGwgYmUgbW9kaWZ5aW5nIHRoZSBzYW1lIGZsYWdzLgotICovCi0KLXN0YXRpYyB1Y2hhciBjdHJsSGFuZGxlcltdID0gewotICAgIDB4MDAsMHgwMCwweDAwLDB4MDAsICAgICAgICAgICAgLyogIGN0cmxCRmxhZyAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAweDY2LDB4MkUsMHhDNywweDA2LDB4MDAsMHgwMCwKLSAgICAweDAxLDB4MDAsMHgwMCwweDAwLCAgICAgICAgICAgIC8qICBtb3YgICAgIFtjczpjdHJsQkZsYWddLDEgICAgICAgICovCi0gICAgMHhDRiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgaXJldGYgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIH07Ci0KLXZvaWQgUE1BUEkgUE1faW5zdGFsbEFsdEJyZWFrSGFuZGxlcihQTV9icmVha0hhbmRsZXIgYmgpCi17Ci0gICAgdWludCAgICByc2VnLHJvZmY7Ci0KLSAgICBnZXRJU1IoMHgxQiwgJl9QTV9wcmV2QnJlYWssICZwcmV2UmVhbEJyZWFrKTsKLSAgICBnZXRJU1IoMHgyMywgJl9QTV9wcmV2Q3RybEMsICZwcmV2UmVhbEN0cmxDKTsKLSAgICBfUE1fYnJlYWtIYW5kbGVyID0gYmg7Ci0gICAgc2V0SVNSKDB4MUIsIF9QTV9icmVha0lTUik7Ci0gICAgc2V0SVNSKDB4MjMsIF9QTV9jdHJsQ0lTUik7Ci0KLSAgICAvKiBIb29rIHRoZSByZWFsIG1vZGUgdmVjdG9ycyBmb3IgdGhlc2UgaGFuZGxlcnMsIGFzIHRoZXNlIGFyZSBub3QKLSAgICAgKiBub3JtYWxseSByZWZsZWN0ZWQgYnkgdGhlIERQTUkgc2VydmVyIHVwIHRvIHByb3RlY3RlZCBtb2RlCi0gICAgICovCi0gICAgX1BNX2N0cmxCUHRyID0gUE1fYWxsb2NSZWFsU2VnKHNpemVvZihjdHJsSGFuZGxlcikqMiwgJnJzZWcsICZyb2ZmKTsKLSAgICBtZW1jcHkoX1BNX2N0cmxCUHRyLGN0cmxIYW5kbGVyLHNpemVvZihjdHJsSGFuZGxlcikpOwotICAgIG1lbWNweShfUE1fY3RybEJQdHIrc2l6ZW9mKGN0cmxIYW5kbGVyKSxjdHJsSGFuZGxlcixzaXplb2YoY3RybEhhbmRsZXIpKTsKLSAgICBfUE1fY3RybENQdHIgPSBfUE1fY3RybEJQdHIgKyBzaXplb2YoY3RybEhhbmRsZXIpOwotICAgIF9QTV9zZXRSTXZlY3QoMHgxQiwoKGxvbmcpcnNlZyA8PCAxNikgfCAocm9mZis0KSk7Ci0gICAgX1BNX3NldFJNdmVjdCgweDIzLCgobG9uZylyc2VnIDw8IDE2KSB8IChyb2ZmK3NpemVvZihjdHJsSGFuZGxlcikrNCkpOwotfQotCi12b2lkIFBNQVBJIFBNX2luc3RhbGxCcmVha0hhbmRsZXIodm9pZCkKLXsKLSAgICBQTV9pbnN0YWxsQWx0QnJlYWtIYW5kbGVyKE5VTEwpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVCcmVha0hhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX3ByZXZCcmVhay5zZWwpIHsKLQlyZXN0b3JlSVNSKDB4MUIsIF9QTV9wcmV2QnJlYWssIHByZXZSZWFsQnJlYWspOwotCXJlc3RvcmVJU1IoMHgyMywgX1BNX3ByZXZDdHJsQywgcHJldlJlYWxDdHJsQyk7Ci0JX1BNX3ByZXZCcmVhay5zZWwgPSAwOwotCV9QTV9icmVha0hhbmRsZXIgPSBOVUxMOwotCVBNX2ZyZWVSZWFsU2VnKF9QTV9jdHJsQlB0cik7Ci0JfQotfQotCi0vKiBSZWFsIG1vZGUgQ3JpdGljYWwgRXJyb3IgaGFuZGxlci4gVGhpcyBoYW5kbGVyIHNpbXBseSBzYXZlcyB0aGUgQVggYW5kCi0gKiBESSB2YWx1ZXMgaW4gdGhlIHJlYWwgbW9kZSBjb2RlIHNlZ21lbnQgYW5kIGV4aXRzLiBXZSBzYXZlIHRoZSBsb2NhdGlvbgotICogb2YgdGhpcyBmbGFnIGluIHJlYWwgbW9kZSBtZW1vcnkgc28gdGhhdCBib3RoIHRoZSByZWFsIG1vZGUgYW5kCi0gKiBwcm90ZWN0ZWQgbW9kZSBjb2RlIHdpbGwgYmUgbW9kaWZ5aW5nIHRoZSBzYW1lIGZsYWdzLgotICovCi0KLXN0YXRpYyB1Y2hhciBjcml0aWNhbEhhbmRsZXJbXSA9IHsKLSAgICAweDAwLDB4MDAsICAgICAgICAgICAgICAgICAgICAgIC8qICBheENvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHgwMCwweDAwLCAgICAgICAgICAgICAgICAgICAgICAvKiAgZGlDb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIDB4MkUsMHhBMywweDAwLDB4MDAsICAgICAgICAgICAgLyogIG1vdiAgICAgW2NzOmF4Q29kZV0sYXggICAgICAgICAgKi8KLSAgICAweDJFLDB4ODksMHgzRSwweDAyLDB4MDAsICAgICAgIC8qICBtb3YgICAgIFtjczpkaUNvZGVdLGRpICAgICAgICAgICovCi0gICAgMHhCOCwweDAzLDB4MDAsICAgICAgICAgICAgICAgICAvKiAgbW92ICAgICBheCwzICAgICAgICAgICAgICAgICAgICAqLwotICAgIDB4Q0YsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGlyZXRmICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB9OwotCi12b2lkIFBNQVBJIFBNX2luc3RhbGxBbHRDcml0aWNhbEhhbmRsZXIoUE1fY3JpdGljYWxIYW5kbGVyIGNoKQotewotICAgIHVpbnQgICAgcnNlZyxyb2ZmOwotCi0gICAgZ2V0SVNSKDB4MjQsICZfUE1fcHJldkNyaXRpY2FsLCAmcHJldlJlYWxDcml0aWNhbCk7Ci0gICAgX1BNX2NyaXRIYW5kbGVyID0gY2g7Ci0gICAgc2V0SVNSKDB4MjQsIF9QTV9jcml0aWNhbElTUik7Ci0KLSAgICAvKiBIb29rIHRoZSByZWFsIG1vZGUgdmVjdG9yLCBhcyB0aGlzIGlzIG5vdCBub3JtYWxseSByZWZsZWN0ZWQgYnkgdGhlCi0gICAgICogRFBNSSBzZXJ2ZXIgdXAgdG8gcHJvdGVjdGVkIG1vZGUuCi0gICAgICovCi0gICAgX1BNX2NyaXRQdHIgPSBQTV9hbGxvY1JlYWxTZWcoc2l6ZW9mKGNyaXRpY2FsSGFuZGxlcikqMiwgJnJzZWcsICZyb2ZmKTsKLSAgICBtZW1jcHkoX1BNX2NyaXRQdHIsY3JpdGljYWxIYW5kbGVyLHNpemVvZihjcml0aWNhbEhhbmRsZXIpKTsKLSAgICBfUE1fc2V0Uk12ZWN0KDB4MjQsKChsb25nKXJzZWcgPDwgMTYpIHwgKHJvZmYrNCkpOwotfQotCi12b2lkIFBNQVBJIFBNX2luc3RhbGxDcml0aWNhbEhhbmRsZXIodm9pZCkKLXsKLSAgICBQTV9pbnN0YWxsQWx0Q3JpdGljYWxIYW5kbGVyKE5VTEwpOwotfQotCi12b2lkIFBNQVBJIFBNX3Jlc3RvcmVDcml0aWNhbEhhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX3ByZXZDcml0aWNhbC5zZWwpIHsKLQlyZXN0b3JlSVNSKDB4MjQsIF9QTV9wcmV2Q3JpdGljYWwsIHByZXZSZWFsQ3JpdGljYWwpOwotCVBNX2ZyZWVSZWFsU2VnKF9QTV9jcml0UHRyKTsKLQlfUE1fcHJldkNyaXRpY2FsLnNlbCA9IDA7Ci0JX1BNX2NyaXRIYW5kbGVyID0gTlVMTDsKLQl9Ci19Ci0KLWludCBQTUFQSSBQTV9sb2NrRGF0YVBhZ2VzKHZvaWQgKnAsdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgUE1TUkVHUyBzcmVnczsKLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0gICAgcmV0dXJuIERQTUlfbG9ja0xpbmVhclBhZ2VzKCh1aW50KXAgKyBEUE1JX2dldFNlbGVjdG9yQmFzZShzcmVncy5kcyksbGVuKTsKLX0KLQotaW50IFBNQVBJIFBNX3VubG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIFBNU1JFR1Mgc3JlZ3M7Ci0gICAgUE1fc2VncmVhZCgmc3JlZ3MpOwotICAgIHJldHVybiBEUE1JX3VubG9ja0xpbmVhclBhZ2VzKCh1aW50KXAgKyBEUE1JX2dldFNlbGVjdG9yQmFzZShzcmVncy5kcyksbGVuKTsKLX0KLQotaW50IFBNQVBJIFBNX2xvY2tDb2RlUGFnZXModm9pZCAoKnApKCksdWludCBsZW4sUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgUE1TUkVHUyBzcmVnczsKLSAgICBQTV9zZWdyZWFkKCZzcmVncyk7Ci0vKkFNOiBjYXVzZXMgbWlub3IgZ2xpdGNoIHdpdGggKi8KLS8qQU06IG9sZGVyIHZlcnNpb25zIHBtRWFzeSB3aGljaCBkb24ndCBhbGxvdyBEUE1JIDA2IG9uICovCi0vKkFNOiBDb2RlIHNlbGVjdG9yIDB4MEMgLS0gYXNzdW1lIGJhc2UgaXMgMCB3aGljaCBpdCBzaG91bGQgYmUuICovCi0gICAgcmV0dXJuIERQTUlfbG9ja0xpbmVhclBhZ2VzKCh1aW50KXAsbGVuKTsKLX0KLQotaW50IFBNQVBJIFBNX3VubG9ja0NvZGVQYWdlcyh2b2lkICgqcCkoKSx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBQTVNSRUdTIHNyZWdzOwotICAgIFBNX3NlZ3JlYWQoJnNyZWdzKTsKLSAgICByZXR1cm4gRFBNSV91bmxvY2tMaW5lYXJQYWdlcygodWludClwLGxlbik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zbXgvdmZsYXQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC92ZmxhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzllZjJjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC92ZmxhdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgRHVtbXkgbW9kdWxlOyBubyB2aXJ0dWFsIGZyYW1lYnVmZmVyIGZvciB0aGlzIE9TCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLQotaWJvb2wgUE1BUEkgVkZfYXZhaWxhYmxlKHZvaWQpCi17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkICogUE1BUEkgVkZfaW5pdCh1bG9uZyBiYXNlQWRkcixpbnQgYmFua1NpemUsaW50IGNvZGVMZW4sdm9pZCAqYmFua0Z1bmMpCi17Ci0gICAgYmFzZUFkZHIgPSBiYXNlQWRkcjsKLSAgICBiYW5rU2l6ZSA9IGJhbmtTaXplOwotICAgIGNvZGVMZW4gPSBjb2RlTGVuOwotICAgIGJhbmtGdW5jID0gYmFua0Z1bmM7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgUE1BUEkgVkZfZXhpdCh2b2lkKQotewotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L3p0aW1lci5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc214L3p0aW1lci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTQxMTkyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3NteC96dGltZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgU01YIGVtYmVkZGVkIHN5c3RlbXMgZGV2ZWxvcG1lbnQKLSoKLSogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFplbiBUaW1lciBmdW5jdGlvbnMuCi0qICAgICBMWlRpbWVyIG5vdCBzdXBwb3J0ZWQgZm9yIHNteCAoYXMgbmVlZGVkIGZvciBpNDg2IHByb2Nlc3NvcnMpLCBvbmx5Ci0qICAgICBVTFpUaW1lciBpcyBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBzbXggdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotZXh0ZXJuIHVsb25nICAgICAgX2NkZWNsIGV0aW1lOyAgICAgLyogZWxhcHNlZCB0aW1lICovCi1leHRlcm4gdWxvbmcgICAgICBfY2RlY2wgeHRpY2tzX3Blcl9zZWNvbmQodm9pZCk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEV4dGVybmFsIGFzc2VtYmxlciBmdW5jdGlvbnMgKi8KLQotdm9pZCAgICBfQVNNQVBJIExaX2Rpc2FibGUodm9pZCk7Ci12b2lkICAgIF9BU01BUEkgTFpfZW5hYmxlKHZvaWQpOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgWmVuIFRpbWVyIG1vZHVsZSBpbnRlcm5hbHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfX1pUaW1lckluaXQodm9pZCkKLXsKLX0KLQotdWxvbmcgcmV0ZXJyKHZvaWQpCi17Ci0gICBQTV9mYXRhbEVycm9yKCJaZW4gVGltZXIgbm90IHN1cHBvcnRlZCBmb3Igc214LiIpOwotICAgcmV0dXJuKDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfX0xaVGltZXJPbih0bSkgICAgIFBNX2ZhdGFsRXJyb3IoIlplbiBUaW1lciBub3Qgc3VwcG9ydGVkIGZvciBzbXguIikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX19MWlRpbWVyTGFwKHRtKSAgICByZXRlcnIoKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfX0xaVGltZXJPZmYodG0pICAgIFBNX2ZhdGFsRXJyb3IoIlplbiBUaW1lciBub3Qgc3VwcG9ydGVkIGZvciBzbXguIikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX19MWlRpbWVyQ291bnQodG0pICByZXRlcnIoKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLURlZmluZSB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgbG9uZyBwZXJpb2QgdGltZXIgYXMgc2Vjb25kcyBwZXIgdGltZXIgdGljay4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFVMWlRJTUVSX1JFU09MVVRJT04gICAgICh1bG9uZykoMTAwMDAwMC94dGlja3NfcGVyX3NlY29uZCgpKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIExvbmcgUGVyaW9kIHRpbWVyIHZhbHVlIGZyb20gdGhlIHNteCB0aW1lciB0aWNrLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfX1VMWlJlYWRUaW1lKHZvaWQpCi17Ci0gICAgdWxvbmcgICB0aWNrczsKLSAgICBMWl9kaXNhYmxlKCk7ICAgICAgICAgICAgLyogVHVybiBvZiBpbnRlcnJ1cHRzICAgICAgICAgICAgICAgKi8KLSAgICB0aWNrcyA9IGV0aW1lOwotICAgIExaX2VuYWJsZSgpOyAgICAgICAgICAgICAvKiBUdXJuIG9uIGludGVycnVwdHMgYWdhaW4gICAgICAgICAqLwotICAgIHJldHVybiB0aWNrczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Db21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgZnJvbSB0aGUgQklPUyB0aW1lciB0aWNrLiBOb3RlIHRoYXQgd2UgY2hlY2sgdG8gc2VlCi13aGV0aGVyIGEgbWlkbmlnaHQgYm91bmRhcnkgaGFzIHBhc3NlZCwgYW5kIGlmIHNvIGFkanVzdCB0aGUgZmluaXNoIHRpbWUgdG8KLWFjY291bnQgZm9yIHRoaXMuIFdlIGNhbm5vdCBkZXRlY3QgaWYgbW9yZSB0aGF0IG9uZSBtaWRuaWdodCBib3VuZGFyeSBoYXMKLXBhc3NlZCwgc28gaWYgdGhpcyBoYXBwZW5zIHdlIHdpbGwgYmUgZ2VuZXJhdGluZyBlcnJvbm91cyByZXN1bHRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9fVUxaRWxhcHNlZFRpbWUodWxvbmcgc3RhcnQsdWxvbmcgZmluaXNoKQotewotICAgIGlmIChmaW5pc2ggPCBzdGFydCkKLQlmaW5pc2ggKz0geHRpY2tzX3Blcl9zZWNvbmQoKSAqIDM2MDAgKjI0OyAgICAgICAvKiBOdW1iZXIgb2YgdGlja3MgaW4gMjQgaG91cnMgICAgICAqLwotICAgIHJldHVybiBmaW5pc2ggLSBzdGFydDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3N0dWIvY3B1aW5mby5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc3R1Yi9jcHVpbmZvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MTVlOTAuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc3R1Yi9jcHVpbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAqKiogVE9ETzogQUREIFlPVVIgT1MgRU5WSVJPTk1FTlQgTkFNRSBIRVJFICoqKgotKgotKiBEZXNjcmlwdGlvbjogIE1vZHVsZSB0byBpbXBsZW1lbnQgT1Mgc3BlY2lmaWMgc2VydmljZXMgdG8gbWVhc3VyZSB0aGUKLSogICAgICAgICAgICAgICBDUFUgZnJlcXVlbmN5LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbmNyZWFzZSB0aGUgdGhyZWFkIHByaW9yaXR5IHRvIG1heGltdW0sIGlmIHBvc3NpYmxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgU2V0TWF4VGhyZWFkUHJpb3JpdHkodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBJZiB5b3UgaGF2ZSB0aHJlYWQgcHJpb3JpdGllcywgaW5jcmVhc2UgaXQgdG8gbWF4aW11bSBmb3IgdGhlICovCi0gICAgLyogICAgICAgdGhyZWFkIGZvciB0aW1pbmcgdGhlIENQVSBmcmVxdWVuY3kuICovCi0gICAgcmV0dXJuIG9sZFByaW9yaXR5OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlc3RvcmUgdGhlIG9yaWdpbmFsIHRocmVhZCBwcmlvcml0eS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBSZXN0b3JlVGhyZWFkUHJpb3JpdHkoCi0gICAgaW50IHByaW9yaXR5KQotewotICAgIC8qIFRPRE86IFJlc3RvcmUgdGhlIG9yaWdpbmFsIHRocmVhZCBwcmlvcml0eSBvbiBleGl0LiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgZnJlcXVlbmN5IG9mIHRoZSBjb3VudGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEdldENvdW50ZXJGcmVxdWVuY3koCi0gICAgQ1BVX2xhcmdlSW50ZWdlciAqZnJlcSkKLXsKLSAgICAvKiBUT0RPOiBSZXR1cm4gdGhlIGZyZXF1ZW5jeSBvZiB0aGUgY291bnRlciBpbiBoZXJlLiBZb3Ugc2hvdWxkIHRyeSB0byAqLwotICAgIC8qICAgICAgIG5vcm1hbGlzZSB0aGlzIHZhbHVlIHRvIGJlIGFyb3VuZCAxMDAsMDAwIHRpY2tzIHBlciBzZWNvbmQuICovCi0gICAgZnJlcS0+bG93ID0gMDsKLSAgICBmcmVxLT5oaWdoID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGNvdW50ZXIgdmFsdWUuCi0KLVRPRE86IEltcGxlbWVudCB0aGlzIHRvIHJlYWQgdGhlIGNvdW50ZXIuIEl0IHNob3VsZCBiZSBkb25lIGFzIGEgbWFjcm8KLSAgICAgIGZvciBhY2N1cmFjeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEdldENvdW50ZXIodCkgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHQpLT5sb3cgPSAwOyAgICAgICAgICAgICAgICAgICBcCi0gICAgKHQpLT5oaWdoID0gMDsgICAgICAgICAgICAgICAgICBcCi19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zdHViL2V2ZW50LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zdHViL2V2ZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNGM0OTIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc3R1Yi9ldmVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogICoqKiBUT0RPOiBBREQgWU9VUiBPUyBFTlZJUk9OTUVOVCBOQU1FIEhFUkUgKioqCi0qCi0qIERlc2NyaXB0aW9uOiAgKioqKiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFNjaVRlY2ggY3Jvc3MgcGxhdGZvcm0KLSogICAgICAgICAgICAgICBldmVudCBsaWJyYXJ5LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHVzaG9ydCAgICAgICBrZXlVcE1zZ1syNTZdID0gezB9Oy8qIFRhYmxlIG9mIGtleSB1cCBtZXNzYWdlcyAgICAgKi8KLXN0YXRpYyBpbnQgICAgICAgICAgcmFuZ2VYLHJhbmdlWTsgICAgICAvKiBSYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyAgICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFRoZXNlIGFyZSBub3QgdXNlZCB1bmRlciBub24tRE9TIHN5c3RlbXMgKi8KLSNkZWZpbmUgX0VWVF9kaXNhYmxlSW50KCkgICAgICAgMQotI2RlZmluZSBfRVZUX3Jlc3RvcmVJbnQoZmxhZ3MpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc2NhbkNvZGUgICAgLSBTY2FuIGNvZGUgdG8gdGVzdAotCi1SRU1BUktTOgotVGhpcyBtYWNybyBkZXRlcm1pbmVzIGlmIGEgc3BlY2lmaWVkIGtleSBpcyBjdXJyZW50bHkgZG93biBhdCB0aGUKLXRpbWUgdGhhdCB0aGUgY2FsbCBpcyBtYWRlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX0VWVF9pc0tleURvd24oc2NhbkNvZGUpICAgIChrZXlVcE1zZ1tzY2FuQ29kZV0gIT0gMCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBudW1iZXIgb2YgdGlja3Mgc2luY2Ugc3lzdGVtCi1zdGFydHVwIGluIG1pbGxpc2Vjb25kcy4gVGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgdmFsdWUgdGhhdCBpcyBwbGFjZWQgaW50bwotdGhlIHRpbWUgc3RhbXAgZmllbGRzIG9mIGV2ZW50cywgYW5kIGlzIHVzZWQgdG8gaW1wbGVtZW50IGF1dG8gbW91c2UgZG93bgotZXZlbnRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9FVlRfZ2V0VGlja3Modm9pZCkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyBmb3IgeW91ciBPUyEgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1QdW1wcyBhbGwgbWVzc2FnZXMgaW4gdGhlIGFwcGxpY2F0aW9uIG1lc3NhZ2UgcXVldWUgaW50byBvdXIgZXZlbnQgcXVldWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX0VWVF9wdW1wTWVzc2FnZXModm9pZCkKLXsKLSAgICAvKiBUT0RPOiBUaGUgcHVycG9zZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIHJlYWQgYWxsIGtleWJvYXJkIGFuZCBtb3VzZSAqLwotICAgIC8qICAgICAgIGV2ZW50cyBmcm9tIHRoZSBPUyBzcGVjaWZpYyBldmVudCBxdWV1ZSwgdHJhbnNsYXRlIHRoZW0gYW5kIHBvc3QgKi8KLSAgICAvKiAgICAgICB0aGVtIGludG8gdGhlIFNjaVRlY2ggZXZlbnQgcXVldWUuICovCi0gICAgLyogKi8KLSAgICAvKiBOT1RFOiBUaGVyZSBhcmUgYSBjb3VwbGUgb2YgaW1wb3J0YW50IHRoaW5ncyB0aGF0IHRoaXMgZnVuY3Rpb24gbXVzdCAqLwotICAgIC8qICAgICAgIHRha2UgY2FyZSBvZjogKi8KLSAgICAvKiAqLwotICAgIC8qICAxLiBTdXBwb3J0IGZvciBLRVlET1dOLCBLRVlSRVBFQVQgYW5kIEtFWVVQIGlzIHJlcXVpcmVkLiAqLwotICAgIC8qICovCi0gICAgLyogIDIuIFN1cHBvcnQgZm9yIHJlYWRpbmcgaGFyZHdhcmUgc2NhbiBjb2RlIGFzIHdlbGwgYXMgQVNDSUkgKi8KLSAgICAvKiAgICAgdHJhbnNsYXRlZCB2YWx1ZXMgaXMgcmVxdWlyZWQuIEdhbWVzIHVzZSB0aGUgc2NhbiBjb2RlcyByYXRoZXIgKi8KLSAgICAvKiAgICAgdGhhbiBBU0NJSSB2YWx1ZXMuIFNjYW4gY29kZXMgZ28gaW50byB0aGUgaGlnaCBvcmRlciBieXRlIG9mIHRoZSAqLwotICAgIC8qICAgICBrZXlib2FyZCBtZXNzYWdlIGZpZWxkLiAqLwotICAgIC8qICovCi0gICAgLyogIDMuIFN1cHBvcnQgZm9yIGF0IGxlYXN0IHJlYWRpbmcgbW91c2UgbW90aW9uIGRhdGEgKG1pY2tleXMpIGZyb20gdGhlICovCi0gICAgLyogICAgIG1vdXNlIGlzIHJlcXVpcmVkLiBVc2luZyB0aGUgbWlja2V5IHZhbHVlcywgd2UgY2FuIHRoZW4gdHJhbnNsYXRlICovCi0gICAgLyogICAgIHRvIG1vdXNlIGN1cnNvciBjb29yZGluYXRlcyBzY2FsZWQgdG8gdGhlIHJhbmdlIG9mIHRoZSBjdXJyZW50ICovCi0gICAgLyogICAgIGdyYXBoaWNzIGRpc3BsYXkgbW9kZS4gTW91c2UgdmFsdWVzIGFyZSBzY2FsZWQgYmFzZWQgb24gdGhlICovCi0gICAgLyogICAgIGdsb2JhbCAncmFuZ2VYJyBhbmQgJ3JhbmdlWScuICovCi0gICAgLyogKi8KLSAgICAvKiAgNC4gU3VwcG9ydCBmb3IgYSB0aW1lc3RhbXAgZm9yIHRoZSBldmVudHMgaXMgcmVxdWlyZWQsIHdoaWNoIGlzICovCi0gICAgLyogICAgIGRlZmluZWQgYXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2Ugc29tZSBldmVudCAodXN1YWxseSAqLwotICAgIC8qICAgICBzeXN0ZW0gc3RhcnR1cCkuIFRoaXMgaXMgdGhlIHRpbWVzdGFtcCB3aGVuIHRoZSBldmVudCBvY2N1cnJlZCAqLwotICAgIC8qICAgICAoaWU6IGF0IGludGVycnVwdCB0aW1lKSBub3Qgd2hlbiBpdCB3YXMgc3R1ZmYgaW50byB0aGUgU2NpVGVjaCAqLwotICAgIC8qICAgICBldmVudCBxdWV1ZS4gKi8KLSAgICAvKiAqLwotICAgIC8qICA1LiBTdXBwb3J0IGZvciBtb3VzZSBkb3VibGUgY2xpY2sgZXZlbnRzLiBJZiB0aGUgT1MgaGFzIGEgbmF0aXZlICovCi0gICAgLyogICAgIG1lY2hhbmlzbSB0byBkZXRlcm1pbmUgdGhpcywgaXQgc2hvdWxkIGJlIHVzZWQuIE90aGVyd2lzZSB0aGUgKi8KLSAgICAvKiAgICAgdGltZSBzdGFtcCBpbmZvcm1hdGlvbiB3aWxsIGJlIHVzZWQgYnkgdGhlIGdlbmVyaWMgZXZlbnQgY29kZSAqLwotICAgIC8qICAgICB0byBnZW5lcmF0ZSBkb3VibGUgY2xpY2sgZXZlbnRzLiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgbWFjcm8vZnVuY3Rpb24gaXMgdXNlZCB0byBjb252ZXJ0cyB0aGUgc2NhbiBjb2RlcyByZXBvcnRlZCBieSB0aGUKLWtleWJvYXJkIHRvIG91ciBldmVudCBsaWJyYXJpZXMgbm9ybWFsaXNlZCBmb3JtYXQuIFdlIG9ubHkgaGF2ZSBvbmUgc2NhbgotY29kZSBmb3IgdGhlICdBJyBrZXksIGFuZCB1c2Ugc2hpZnQgbW9kaWZpZXJzIHRvIGRldGVybWluZSBpZiBpdCBpcyBhCi1DdHJsLUYxLCBBbHQtRjEgZXRjLiBUaGUgcmF3IHNjYW4gY29kZXMgZnJvbSB0aGUga2V5Ym9hcmQgd29yayB0aGlzIHdheSwKLWJ1dCB0aGUgT1MgZ2l2ZXMgdXMgJ2Nvb2tlZCcgc2NhbiBjb2Rlcywgd2UgaGF2ZSB0byB0cmFuc2xhdGUgdGhlbSBiYWNrCi10byB0aGUgcmF3IGZvcm1hdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9FVlRfbWFza0tleUNvZGUoZXZ0KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNhZmVseSBhYm9ydCB0aGUgZXZlbnQgbW9kdWxlIHVwb24gY2F0Y2hpbmcgYSBmYXRhbCBlcnJvci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9FVlRfYWJvcnQoKQotewotICAgIEVWVF9leGl0KCk7Ci0gICAgUE1fZmF0YWxFcnJvcigiVW5oYW5kbGVkIGV4Y2VwdGlvbiEiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1tb3VzZU1vdmUgICAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbmV2ZSB0aGUgbW91c2UgbmVlZHMgdG8gYmUgbW92ZWQKLQotUkVNQVJLUzoKLUluaXRpbGlhc2UgdGhlIGV2ZW50IGhhbmRsaW5nIG1vZHVsZS4gSGVyZSB3ZSBpbnN0YWxsIG91ciBtb3VzZSBoYW5kbGluZyBJU1IKLXRvIGJlIGNhbGxlZCB3aGVuZXZlciBhbnkgYnV0dG9uJ3MgYXJlIHByZXNzZWQgb3IgcmVsZWFzZWQuIFdlIGFsc28gYnVpbGQKLXRoZSBmcmVlIGxpc3Qgb2YgZXZlbnRzIGluIHRoZSBldmVudCBxdWV1ZS4KLQotV2UgdXNlIGhhbmRsZXIgbnVtYmVyIDIgb2YgdGhlIG1vdXNlIGxpYnJhcmllcyBpbnRlcnJ1cHQgaGFuZGxlcnMgZm9yIG91cgotZXZlbnQgaGFuZGxpbmcgcm91dGluZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRBUEkgRVZUX2luaXQoCi0gICAgX0VWVF9tb3VzZU1vdmVIYW5kbGVyIG1vdXNlTW92ZSkKLXsKLSAgICAvKiBJbml0aWFsaXNlIHRoZSBldmVudCBxdWV1ZSAqLwotICAgIF9tb3VzZU1vdmUgPSBtb3VzZU1vdmU7Ci0gICAgaW5pdEV2ZW50UXVldWUoKTsKLSAgICBtZW1zZXQoa2V5VXBNc2csMCxzaXplb2Yoa2V5VXBNc2cpKTsKLQotICAgIC8qIFRPRE86IERvIGFueSBPUyBzcGVjaWZpYyBpbml0aWFsaXNhdGlvbiBoZXJlICovCi0KLSAgICAvKiBDYXRjaCBwcm9ncmFtIHRlcm1pbmF0aW9uIHNpZ25hbHMgc28gd2UgY2FuIGNsZWFuIHVwIHByb3Blcmx5ICovCi0gICAgc2lnbmFsKFNJR0FCUlQsIF9FVlRfYWJvcnQpOwotICAgIHNpZ25hbChTSUdGUEUsIF9FVlRfYWJvcnQpOwotICAgIHNpZ25hbChTSUdJTlQsIF9FVlRfYWJvcnQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotQ2hhbmdlcyB0aGUgcmFuZ2Ugb2YgY29vcmRpbmF0ZXMgcmV0dXJuZWQgYnkgdGhlIG1vdXNlIGZ1bmN0aW9ucyB0byB0aGUKLXNwZWNpZmllZCByYW5nZSBvZiB2YWx1ZXMuIFRoaXMgaXMgdXNlZCB3aGVuIGNoYW5naW5nIGJldHdlZW4gZ3JhcGhpY3MKLW1vZGVzIHNldCB0aGUgcmFuZ2Ugb2YgbW91c2UgY29vcmRpbmF0ZXMgZm9yIHRoZSBuZXcgZGlzcGxheSBtb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9zZXRNb3VzZVJhbmdlKAotICAgIGludCB4UmVzLAotICAgIGludCB5UmVzKQotewotICAgIHJhbmdlWCA9IHhSZXM7Ci0gICAgcmFuZ2VZID0geVJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFpbGlzZXMgdGhlIGludGVybmFsIGV2ZW50IGhhbmRsaW5nIG1vZHVsZXMuIFRoZSBFVlRfc3VzcGVuZCBmdW5jdGlvbgotY2FuIGJlIGNhbGxlZCB0byBzdXNwZW5kIGV2ZW50IGhhbmRsaW5nIChzdWNoIGFzIHdoZW4gc2hlbGxpbmcgb3V0IHRvIERPUyksCi1hbmQgdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgaXQgYWdhaW4gbGF0ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfcmVzdW1lKHZvaWQpCi17Ci0gICAgLyogRG8gbm90aGluZyBmb3Igbm9uIERPUyBzeXN0ZW1zICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1TdXNwZW5kcyBhbGwgb2Ygb3VyIGV2ZW50IGhhbmRsaW5nIG9wZXJhdGlvbnMuIFRoaXMgaXMgYWxzbyB1c2VkIHRvCi1kZS1pbnN0YWxsIHRoZSBldmVudCBoYW5kbGluZyBjb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX3N1c3BlbmQodm9pZCkKLXsKLSAgICAvKiBEbyBub3RoaW5nIGZvciBub24gRE9TIHN5c3RlbXMgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLUV4aXRzIHRoZSBldmVudCBtb2R1bGUgZm9yIHByb2dyYW0gdGVybWluYXRhdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVF9leGl0KHZvaWQpCi17Ci0gICAgLyogUmVzdG9yZSBzaWduYWwgaGFuZGxlcnMgKi8KLSAgICBzaWduYWwoU0lHQUJSVCwgU0lHX0RGTCk7Ci0gICAgc2lnbmFsKFNJR0ZQRSwgU0lHX0RGTCk7Ci0gICAgc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCk7Ci0KLSAgICAvKiBUT0RPOiBEbyBhbnkgT1Mgc3BlY2lmaWMgY2xlYW51cCBpbiBoZXJlICovCi19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zdHViL29zaGRyLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zdHViL29zaGRyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzOTVjYmMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc3R1Yi9vc2hkci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQmVPUwotKgotKiBEZXNjcmlwdGlvbjogIEluY2x1ZGUgZmlsZSB0byBpbmNsdWRlIGFsbCBPUyBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUT0RPOiBUaGlzIGlzIHdoZXJlIHlvdSBpbmNsdWRlIE9TIHNwZWNpZmljIGhlYWRlcnMgZm9yIHRoZSBldmVudCBoYW5kbGluZyAqLwotLyogICAgICAgbGlicmFyeS4gWW91IG1heSBsZWF2ZSB0aGlzIGVtcHR5IGlmIHlvdSBoYXZlIG5vIE9TIHNwZWNpZmljIGhlYWRlcnMgKi8KLS8qICAgICAgIHRvIGluY2x1ZGUuICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zdHViL3BtLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zdHViL3BtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMjc4YzMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc3R1Yi9wbS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogICoqKiBUT0RPOiBBREQgWU9VUiBPUyBFTlZJUk9OTUVOVCBOQU1FIEhFUkUgKioqCi0qCi0qIERlc2NyaXB0aW9uOiAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnksIHdoaWNoCi0qICAgICAgICAgICAgICAgY29udGFpbnMgZnVuY3Rpb25zIHRvIGltcGxlbWVudCBPUyBzcGVjaWZpYyBzZXJ2aWNlcyBpbiBhCi0qICAgICAgICAgICAgICAgZ2VuZXJpYywgY3Jvc3MgcGxhdGZvcm0gQVBJLiBQb3J0aW5nIHRoZSBPUyBQb3J0YWJpbGl0eQotKiAgICAgICAgICAgICAgIE1hbmFnZXIgbGlicmFyeSBpcyB0aGUgZmlyc3Qgc3RlcCB0byBwb3J0aW5nIGFueSBTY2lUZWNoCi0qICAgICAgICAgICAgICAgcHJvZHVjdHMgdG8gYSBuZXcgcGxhdGZvcm0uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJkcnZsaWIvb3Mvb3MuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0vKiBUT0RPOiBJbmNsdWRlIGFueSBPUyBzcGVjaWZpYyBoZWFkZXJzIGhlcmUhICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFRPRE86IElmIHlvdSBzdXBwb3J0IGFjY2VzcyB0byB0aGUgQklPUywgdGhlIGZvbGxvd2luZyBWRVNBQnVmIGdsb2JhbHMgKi8KLS8qICAgICAgIGtlZXAgdHJhY2sgb2YgYSBzaW5nbGUgVkVTQSB0cmFuc2ZlciBidWZmZXIuIElmIHlvdSBkb24ndCBzdXBwb3J0ICovCi0vKiAgICAgICBhY2Nlc3MgdG8gdGhlIEJJT1MsIHJlbW92ZSB0aGVzZSB2YXJpYWJsZXMuICovCi0KLXN0YXRpYyB1aW50IFZFU0FCdWZfbGVuID0gMTAyNDsgICAgIC8qIExlbmd0aCBvZiB0aGUgVkVTQUJ1ZiBidWZmZXIgICAgICovCi1zdGF0aWMgdm9pZCAqVkVTQUJ1Zl9wdHIgPSBOVUxMOyAgICAvKiBOZWFyIHBvaW50ZXIgdG8gVkVTQUJ1ZiAgICAgICAgICAqLwotc3RhdGljIHVpbnQgVkVTQUJ1Zl9yc2VnOyAgICAgICAgICAgLyogUmVhbCBtb2RlIHNlZ21lbnQgb2YgVkVTQUJ1ZiAgICAgKi8KLXN0YXRpYyB1aW50IFZFU0FCdWZfcm9mZjsgICAgICAgICAgIC8qIFJlYWwgbW9kZSBvZmZzZXQgb2YgVkVTQUJ1ZiAgICAgICovCi0KLXN0YXRpYyB2b2lkIChQTUFQSVAgZmF0YWxFcnJvckNsZWFudXApKHZvaWQpID0gTlVMTDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBQTSBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1faW5pdCh2b2lkKQotewotICAgIC8qIFRPRE86IERvIGFueSBpbml0aWFsaXNhdGlvbiBpbiBoZXJlLiBUaGlzIGluY2x1ZGVzIGdldHRpbmcgSU9QTCAqLwotICAgIC8qICAgICAgIGFjY2VzcyBmb3IgdGhlIHByb2Nlc3MgY2FsbGluZyBQTV9pbml0LiBUaGlzIHdpbGwgZ2V0IGNhbGxlZCAqLwotICAgIC8qICAgICAgIG1vcmUgdGhhbiBvbmNlLiAqLwotCi0gICAgLyogVE9ETzogSWYgeW91IHN1cHBvcnQgdGhlIHN1cHBsaWVkIE1UUlIgcmVnaXN0ZXIgc3R1ZmYgKHlvdSBuZWVkIHRvICovCi0gICAgLyogICAgICAgYmUgYXQgcmluZyAwIGZvciB0aGlzISksIHlvdSBzaG91bGQgaW5pdGlhbGlzZSBpdCBpbiBoZXJlLiAqLwotCi0vKiBNVFJSX2luaXQoKTsgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIG9wZXJhdGluZyBzeXN0ZW0gdHlwZSBpZGVudGlmaWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWxvbmcgUE1BUEkgUE1fZ2V0T1NUeXBlKHZvaWQpCi17Ci0gICAgLyogVE9ETzogQ2hhbmdlIHRoaXMgdG8gcmV0dXJuIHRoZSBkZWZpbmUgZm9yIHlvdXIgT1MgZnJvbSBkcnZsaWIvb3MuaCAqLwotICAgIHJldHVybiBfT1NfTVlPUzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIHJ1bnRpbWUgdHlwZSBpZGVudGlmaWVyIChhbHdheXMgUE1fMzg2IGZvciBwcm90ZWN0ZWQgbW9kZSkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZ2V0TW9kZVR5cGUodm9pZCkKLXsgcmV0dXJuIFBNXzM4NjsgfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFkZCBhIGZpbGUgZGlyZWN0b3J5IHNlcGFyYXRvciB0byB0aGUgZW5kIG9mIHRoZSBmaWxlbmFtZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2JhY2tzbGFzaCgKLSAgICBjaGFyICpzKQotewotICAgIHVpbnQgcG9zID0gc3RybGVuKHMpOwotICAgIGlmIChzW3Bvcy0xXSAhPSAnLycpIHsKLQlzW3Bvc10gPSAnLyc7Ci0Jc1twb3MrMV0gPSAnXDAnOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BZGQgYSB1c2VyIGRlZmluZWQgUE1fZmF0YWxFcnJvciBjbGVhbnVwIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0RmF0YWxFcnJvckNsZWFudXAoCi0gICAgdm9pZCAoUE1BUElQIGNsZWFudXApKHZvaWQpKQotewotICAgIGZhdGFsRXJyb3JDbGVhbnVwID0gY2xlYW51cDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXBvcnQgYSBmYXRhbCBlcnJvciBjb25kaXRpb24gYW5kIGhhbHQgdGhlIHByb2dyYW0uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mYXRhbEVycm9yKAotICAgIGNvbnN0IGNoYXIgKm1zZykKLXsKLSAgICAvKiBUT0RPOiBJZiB5b3UgYXJlIHJ1bm5pbmcgaW4gYSBHVUkgZW52aXJvbm1lbnQgd2l0aG91dCBhIGNvbnNvbGUsICovCi0gICAgLyogICAgICAgdGhpcyBuZWVkcyB0byBiZSBjaGFuZ2VkIHRvIGJyaW5nIHVwIGEgZmF0YWwgZXJyb3IgbWVzc2FnZSAqLwotICAgIC8qICAgICAgIGJveCBhbmQgdGVybWluYXRlIHRoZSBwcm9ncmFtLiAqLwotICAgIGlmIChmYXRhbEVycm9yQ2xlYW51cCkKLQlmYXRhbEVycm9yQ2xlYW51cCgpOwotICAgIGZwcmludGYoc3RkZXJyLCIlc1xuIiwgbXNnKTsKLSAgICBleGl0KDEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUV4aXQgaGFuZGxlciB0byBraWxsIHRoZSBWRVNBIHRyYW5zZmVyIGJ1ZmZlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBFeGl0VkJFQnVmKHZvaWQpCi17Ci0gICAgLyogVE9ETzogSWYgeW91IGRvIG5vdCBoYXZlIEJJT1MgYWNjZXNzLCByZW1vdmUgdGhpcyBmdW5jdGlvbi4gKi8KLSAgICBpZiAoVkVTQUJ1Zl9wdHIpCi0JUE1fZnJlZVJlYWxTZWcoVkVTQUJ1Zl9wdHIpOwotICAgIFZFU0FCdWZfcHRyID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZSB0aGUgcmVhbCBtb2RlIFZFU0EgdHJhbnNmZXIgYnVmZmVyIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIEJJT1MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2dldFZFU0FCdWYoCi0gICAgdWludCAqbGVuLAotICAgIHVpbnQgKnJzZWcsCi0gICAgdWludCAqcm9mZikKLXsKLSAgICAvKiBUT0RPOiBJZiB5b3UgZG8gbm90IGhhdmUgQklPUyBhY2Nlc3MsIHNpbXBseSBkZWxldGUgdGhlIGd1dHMgb2YgKi8KLSAgICAvKiAgICAgICB0aGlzIGZ1bmN0aW9uIGFuZCByZXR1cm4gTlVMTC4gKi8KLSAgICBpZiAoIVZFU0FCdWZfcHRyKSB7Ci0JLyogQWxsb2NhdGUgYSBnbG9iYWwgYnVmZmVyIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIFZFU0EgVkJFICovCi0JaWYgKChWRVNBQnVmX3B0ciA9IFBNX2FsbG9jUmVhbFNlZyhWRVNBQnVmX2xlbiwgJlZFU0FCdWZfcnNlZywgJlZFU0FCdWZfcm9mZikpID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotCWF0ZXhpdChFeGl0VkJFQnVmKTsKLQl9Ci0gICAgKmxlbiA9IFZFU0FCdWZfbGVuOwotICAgICpyc2VnID0gVkVTQUJ1Zl9yc2VnOwotICAgICpyb2ZmID0gVkVTQUJ1Zl9yb2ZmOwotICAgIHJldHVybiBWRVNBQnVmX3B0cjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DaGVjayBpZiBhIGtleSBoYXMgYmVlbiBwcmVzc2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9rYmhpdCh2b2lkKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIGEga2V5IGlzIGF2YWlsYWJsZSB0byBiZSByZWFkLiBUaGlzICovCi0gICAgLyogICAgICAgc2hvdWxkIGJlIGltcGxlbWVudGVkLCBidXQgaXMgbW9zdGx5IHVzZWQgYnkgdGhlIHRlc3QgcHJvZ3JhbXMgKi8KLSAgICAvKiAgICAgICB0aGVzZSBkYXlzLiAqLwotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVdhaXQgZm9yIGFuZCByZXR1cm4gdGhlIG5leHQga2V5cHJlc3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2dldGNoKHZvaWQpCi17Ci0gICAgLyogVE9ETzogVGhpcyByZXR1cm5zIHRoZSBBU0NJSSBjb2RlIG9mIHRoZSBrZXkgcHJlc3NlZC4gVGhpcyAqLwotICAgIC8qICAgICAgIHNob3VsZCBiZSBpbXBsZW1lbnRlZCwgYnV0IGlzIG1vc3RseSB1c2VkIGJ5IHRoZSB0ZXN0IHByb2dyYW1zICovCi0gICAgLyogICAgICAgdGhlc2UgZGF5cy4gKi8KLSAgICByZXR1cm4gMHhEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU9wZW4gYSBmdWxsc2NyZWVuIGNvbnNvbGUgbW9kZSBmb3Igb3V0cHV0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9vcGVuQ29uc29sZSh2b2lkKQotewotICAgIC8qIFRPRE86IE9wZW5zIHVwIGEgZnVsbHNjcmVlbiBjb25zb2xlIGZvciBncmFwaGljcyBvdXRwdXQuIElmIHlvdXIgKi8KLSAgICAvKiAgICAgICBjb25zb2xlIGRvZXMgbm90IGhhdmUgZ3JhcGhpY3MvdGV4dCBtb2RlcywgdGhpcyBjYW4gYmUgbGVmdCAqLwotICAgIC8qICAgICAgIGVtcHR5LiBUaGUgbWFpbiBwdXJwb3NlIG9mIHRoaXMgaXMgdG8gZGlzYWJsZSBjb25zb2xlIHN3aXRjaGluZyAqLwotICAgIC8qICAgICAgIHdoZW4gaW4gZ3JhcGhpY3MgbW9kZXMgaWYgeW91IGNhbiBzd2l0Y2ggYXdheSBmcm9tIGZ1bGxzY3JlZW4gKi8KLSAgICAvKiAgICAgICBjb25zb2xlcyAoaWYgeW91IHdhbnQgdG8gYWxsb3cgc3dpdGNoaW5nLCB0aGlzIGNhbiBiZSBkb25lICovCi0gICAgLyogICAgICAgZWxzZXdoZXJlIHdpdGggYSBmdWxsIHNhdmUvcmVzdG9yZSBzdGF0ZSBvZiB0aGUgZ3JhcGhpY3MgbW9kZSkuICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzdGF0ZSBidWZmZXIgdXNlZCB0byBzYXZlIHRoZSBjb25zb2xlIHN0YXRlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9nZXRDb25zb2xlU3RhdGVTaXplKHZvaWQpCi17Ci0gICAgLyogVE9ETzogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgY29uc29sZSBzdGF0ZSBidWZmZXIgdXNlZCB0byBzYXZlIHRoZSAqLwotICAgIC8qICAgICAgIHN0YXRlIG9mIHRoZSBjb25zb2xlIGJlZm9yZSBnb2luZyBpbnRvIGdyYXBoaWNzIG1vZGUuIFRoaXMgaXMgKi8KLSAgICAvKiAgICAgICB1c2VkIHRvIHJlc3RvcmUgdGhlIGNvbnNvbGUgYmFjayB0byBub3JtYWwgd2hlbiB3ZSBhcmUgZG9uZS4gKi8KLSAgICByZXR1cm4gMTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TYXZlIHRoZSBzdGF0ZSBvZiB0aGUgY29uc29sZSBpbnRvIHRoZSBzdGF0ZSBidWZmZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zYXZlQ29uc29sZVN0YXRlKAotICAgIHZvaWQgKnN0YXRlQnVmLAotICAgIGludCBjb25zb2xlX2lkKQotewotICAgIC8qIFRPRE86IFNhdmVzIHRoZSBzdGF0ZSBvZiB0aGUgY29uc29sZSBpbnRvIHRoZSBzdGF0ZSBidWZmZXIuIFRoaXMgaXMgKi8KLSAgICAvKiAgICAgICB1c2VkIHRvIHJlc3RvcmUgdGhlIGNvbnNvbGUgYmFjayB0byBub3JtYWwgd2hlbiB3ZSBhcmUgZG9uZS4gKi8KLSAgICAvKiAgICAgICBXZSB3aWxsIGFsd2F5cyByZXN0b3JlIDgweDI1IHRleHQgbW9kZSBhZnRlciBiZWluZyBpbiBncmFwaGljcyAqLwotICAgIC8qICAgICAgIG1vZGUsIHNvIGlmIHJlc3RvcmluZyB0ZXh0IG1vZGUgaXMgYWxsIHlvdSBuZWVkIHRvIGRvIHRoaXMgY2FuICovCi0gICAgLyogICAgICAgYmUgbGVmdCBlbXB0eS4gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgY29uc29sZSBmcm9tIHRoZSBzdGF0ZSBidWZmZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9yZXN0b3JlQ29uc29sZVN0YXRlKAotICAgIGNvbnN0IHZvaWQgKnN0YXRlQnVmLAotICAgIGludCBjb25zb2xlX2lkKQotewotICAgIC8qIFRPRE86IFJlc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSBjb25zb2xlIGZyb20gdGhlIHN0YXRlIGJ1ZmZlci4gVGhpcyBpcyAqLwotICAgIC8qICAgICAgIHVzZWQgdG8gcmVzdG9yZSB0aGUgY29uc29sZSBiYWNrIHRvIG5vcm1hbCB3aGVuIHdlIGFyZSBkb25lLiAqLwotICAgIC8qICAgICAgIFdlIHdpbGwgYWx3YXlzIHJlc3RvcmUgODB4MjUgdGV4dCBtb2RlIGFmdGVyIGJlaW5nIGluIGdyYXBoaWNzICovCi0gICAgLyogICAgICAgbW9kZSwgc28gaWYgcmVzdG9yaW5nIHRleHQgbW9kZSBpcyBhbGwgeW91IG5lZWQgdG8gZG8gdGhpcyBjYW4gKi8KLSAgICAvKiAgICAgICBiZSBsZWZ0IGVtcHR5LiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNsb3NlIHRoZSBjb25zb2xlIGFuZCByZXR1cm4gdG8gbm9uLWZ1bGxzY3JlZW4gY29uc29sZSBtb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fY2xvc2VDb25zb2xlKAotICAgIGludCBjb25zb2xlX2lkKQotewotICAgIC8qIFRPRE86IENsb3NlIHRoZSBjb25zb2xlIHdoZW4gd2UgYXJlIGRvbmUsIGdvaW5nIGJhY2sgdG8gdGV4dCBtb2RlLiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNldCB0aGUgbG9jYXRpb24gb2YgdGhlIE9TIGNvbnNvbGUgY3Vyc29yLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1fc2V0T1NDdXJzb3JMb2NhdGlvbigKLSAgICBpbnQgeCwKLSAgICBpbnQgeSkKLXsKLSAgICAvKiBUT0RPOiBTZXQgdGhlIE9TIGNvbnNvbGUgY3Vyc29yIGxvY2F0aW9uIHRvIHRoZSBuZXcgdmFsdWUuIFRoaXMgaXMgKi8KLSAgICAvKiAgICAgICBnZW5lcmFsbHkgdXNlZCBmb3IgbmV3IE9TIHBvcnRzICh1c2VkIG1vc3RseSBmb3IgRE9TKS4gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIHdpZHRoIG9mIHRoZSBPUyBjb25zb2xlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1fc2V0T1NTY3JlZW5XaWR0aCgKLSAgICBpbnQgd2lkdGgsCi0gICAgaW50IGhlaWdodCkKLXsKLSAgICAvKiBUT0RPOiBTZXQgdGhlIE9TIGNvbnNvbGUgc2NyZWVuIHdpZHRoLiBUaGlzIGlzIGdlbmVyYWxseSB1bnVzZWQgZm9yICovCi0gICAgLyogICAgICAgbmV3IE9TIHBvcnRzLiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNldCB0aGUgcmVhbCB0aW1lIGNsb2NrIGhhbmRsZXIgKHVzZWQgZm9yIHNvZnR3YXJlIHN0ZXJlbyBtb2RlcykuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0hhbmRsZXIoCi0gICAgUE1faW50SGFuZGxlciBpaCwKLSAgICBpbnQgZnJlcXVlbmN5KQotewotICAgIC8qIFRPRE86IEluc3RhbGwgYSByZWFsIHRpbWUgY2xvY2sgaW50ZXJydXB0IGhhbmRsZXIuIE5vcm1hbGx5IHRoaXMgKi8KLSAgICAvKiAgICAgICB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgZnJvbSBtb3N0IE9TJ2VzIGluIHVzZXIgbGFuZCwgc28gYW4gKi8KLSAgICAvKiAgICAgICBhbHRlcm5hdGl2ZSBtZWNoYW5pc20gaXMgbmVlZGVkIHRvIGVuYWJsZSBzb2Z0d2FyZSBzdGVyZW8uICovCi0gICAgLyogICAgICAgSGVuY2UgbGVhdmUgdGhpcyB1bmltcGxlbWVudGVkIHVubGVzcyB5b3UgaGF2ZSBhIGhpZ2ggcHJpb3JpdHkgKi8KLSAgICAvKiAgICAgICBtZWNoYW5pc20gdG8gY2FsbCB0aGUgMzItYml0IGNhbGxiYWNrIHdoZW4gdGhlIHJlYWwgdGltZSBjbG9jayAqLwotICAgIC8qICAgICAgIGludGVycnVwdCBmaXJlcy4gKi8KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgZnJlcXVlbmN5IChmb3Igc3RlcmVvIG1vZGVzKS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tGcmVxdWVuY3koCi0gICAgaW50IGZyZXF1ZW5jeSkKLXsKLSAgICAvKiBUT0RPOiBTZXQgdGhlIHJlYWwgdGltZSBjbG9jayBpbnRlcnJ1cHQgZnJlcXVlbmN5LiBVc2VkIGZvciBzdGVyZW8gKi8KLSAgICAvKiAgICAgICBMQyBzaHV0dGVyIGdsYXNzZXMgd2hlbiBkb2luZyBzb2Z0d2FyZSBzdGVyZW8uIFVzdWFsbHkgc2V0cyAqLwotICAgIC8qICAgICAgIHRoZSBmcmVxdWVuY3kgdG8gYXJvdW5kIDIwNDggSHouICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVzdG9yZSB0aGUgb3JpZ2luYWwgcmVhbCB0aW1lIGNsb2NrIGhhbmRsZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9yZXN0b3JlUmVhbFRpbWVDbG9ja0hhbmRsZXIodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBSZXN0b3JlcyB0aGUgcmVhbCB0aW1lIGNsb2NrIGhhbmRsZXIuICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBjdXJyZW50IG9wZXJhdGluZyBzeXN0ZW0gcGF0aCBvciB3b3JraW5nIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jaGFyICogUE1BUEkgUE1fZ2V0Q3VycmVudFBhdGgoCi0gICAgY2hhciAqcGF0aCwKLSAgICBpbnQgbWF4TGVuKQotewotICAgIHJldHVybiBnZXRjd2QocGF0aCxtYXhMZW4pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgZHJpdmUgbGV0dGVyIGZvciB0aGUgYm9vdCBkcml2ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jaGFyIFBNQVBJIFBNX2dldEJvb3REcml2ZSh2b2lkKQotewotICAgIC8qIFRPRE86IFJldHVybiB0aGUgYm9vdCBkcml2ZSBsZXR0ZXIgZm9yIHRoZSBPUy4gTm9ybWFsbHkgdGhpcyBpcyAnYycgKi8KLSAgICAvKiAgICAgICBmb3IgRE9TIGJhc2VkIE9TJ2VzIGFuZCAnLycgZm9yIFVuaWNlcy4gKi8KLSAgICByZXR1cm4gJy8nOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgcGF0aCB0byB0aGUgVkJFL0FGIGRyaXZlciBmaWxlcyAobGVnYWN5IGFuZCBub3QgdXNlZCkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFZCRUFGUGF0aCh2b2lkKQotewotICAgIHJldHVybiBQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgcGF0aCB0byB0aGUgTnVjbGV1cyBkcml2ZXIgZmlsZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNQYXRoKHZvaWQpCi17Ci0gICAgLyogVE9ETzogQ2hhbmdlIHRoaXMgdG8gdGhlIGRlZmF1bHQgcGF0aCB0byBOdWNsZXVzIGRyaXZlciBmaWxlcy4gVGhlICovCi0gICAgLyogICAgICAgZm9sbG93aW5nIGlzIHRoZSBkZWZhdWx0IGZvciBVbmljZXMuICovCi0gICAgY2hhciAqZW52ID0gZ2V0ZW52KCJOVUNMRVVTX1BBVEgiKTsKLSAgICByZXR1cm4gZW52ID8gZW52IDogIi91c3IvbGliL251Y2xldXMiOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgcGF0aCB0byB0aGUgTnVjbGV1cyBjb25maWd1cmF0aW9uIGZpbGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIHBhdGhbMjU2XTsKLSAgICBzdHJjcHkocGF0aCxQTV9nZXROdWNsZXVzUGF0aCgpKTsKLSAgICBQTV9iYWNrc2xhc2gocGF0aCk7Ci0gICAgc3RyY2F0KHBhdGgsImNvbmZpZyIpOwotICAgIHJldHVybiBwYXRoOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbWFjaGluZSBpZiBwb3NzaWJsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VW5pcXVlSUQodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBSZXR1cm4gYSB1bmlxdWUgSUQgZm9yIHRoZSBtYWNoaW5lLiBJZiBhIHVuaXF1ZSBJRCBpcyBub3QgKi8KLSAgICAvKiAgICAgICBhdmFpbGFibGUsIHJldHVybiB0aGUgbWFjaGluZSBuYW1lLiAqLwotICAgIHN0YXRpYyBjaGFyIGJ1ZlsxMjhdOwotICAgIGdldGhvc3RuYW1lKGJ1ZiwgMTI4KTsKLSAgICByZXR1cm4gYnVmOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUdldCB0aGUgbmFtZSBvZiB0aGUgbWFjaGluZSBvbiB0aGUgbmV0d29yay4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TWFjaGluZU5hbWUodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBSZXR1cm4gdGhlIG5ldHdvcmsgbWFjaGluZSBuYW1lIGZvciB0aGUgbWFjaGluZS4gKi8KLSAgICBzdGF0aWMgY2hhciBidWZbMTI4XTsKLSAgICBnZXRob3N0bmFtZShidWYsIDEyOCk7Ci0gICAgcmV0dXJuIGJ1ZjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gYSBwb2ludGVyIHRvIHRoZSByZWFsIG1vZGUgQklPUyBkYXRhIGFyZWEuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2dldEJJT1NQb2ludGVyKHZvaWQpCi17Ci0gICAgLyogVE9ETzogVGhpcyByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgcmVhbCBtb2RlIEJJT1MgZGF0YSBhcmVhLiBJZiB5b3UgKi8KLSAgICAvKiAgICAgICBkbyBub3Qgc3VwcG9ydCBCSU9TIGFjY2VzcywgeW91IGNhbiBzaW1wbHkgcmV0dXJuIE5VTEwgaGVyZS4gKi8KLSAgICBpZiAoIXplcm9QdHIpCi0JemVyb1B0ciA9IFBNX21hcFBoeXNpY2FsQWRkcigwLDB4RkZGRkYsdHJ1ZSk7Ci0gICAgcmV0dXJuICh2b2lkKikoemVyb1B0ciArIDB4NDAwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gYSBwb2ludGVyIHRvIDB4QTAwMDAgcGh5c2ljYWwgVkdBIGdyYXBoaWNzIGZyYW1lYnVmZmVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9nZXRBMDAwMFBvaW50ZXIodm9pZCkKLXsKLSAgICBzdGF0aWMgdm9pZCAqYmFua1B0cjsKLSAgICBpZiAoIWJhbmtQdHIpCi0JYmFua1B0ciA9IFBNX21hcFBoeXNpY2FsQWRkcigweEEwMDAwLDB4RkZGRix0cnVlKTsKLSAgICByZXR1cm4gYmFua1B0cjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1NYXAgYSBwaHlzaWNhbCBhZGRyZXNzIHRvIGEgbGluZWFyIGFkZHJlc3MgaW4gdGhlIGNhbGxlcnMgcHJvY2Vzcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbWFwUGh5c2ljYWxBZGRyKAotICAgIHVsb25nIGJhc2UsCi0gICAgdWxvbmcgbGltaXQsCi0gICAgaWJvb2wgaXNDYWNoZWQpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBtYXBzIGEgcGh5c2ljYWwgbWVtb3J5IGFkZHJlc3MgdG8gYSBsaW5lYXIgKi8KLSAgICAvKiAgICAgICBhZGRyZXNzIGluIHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MuICovCi0KLSAgICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uICptdXN0KiBiZSBhYmxlIHRvIGhhbmRsZSBhbnkgcGhzeWljYWwgYmFzZSAqLwotICAgIC8qICAgICAgIGFkZHJlc3MsIGFuZCBoZW5jZSB5b3Ugd2lsbCBoYXZlIHRvIGhhbmRsZSByb3VuZGluZyBvZiAqLwotICAgIC8qICAgICAgIHRoZSBwaHlzaWNhbCBiYXNlIGFkZHJlc3MgdG8gYSBwYWdlIGJvdW5kYXJ5IChpZTogNEtiIG9uICovCi0gICAgLyogICAgICAgeDg2IENQVSdzKSB0byBiZSBhYmxlIHRvIHByb3Blcmx5IG1hcCBpbiB0aGUgbWVtb3J5ICovCi0gICAgLyogICAgICAgcmVnaW9uLiAqLwotCi0gICAgLyogTk9URTogSWYgcG9zc2libGUgdGhlIGlzQ2FjaGVkIGJpdCBzaG91bGQgYmUgdXNlZCB0byBlbnN1cmUgdGhhdCAqLwotICAgIC8qICAgICAgIHRoZSBQQ0QgKFBhZ2UgQ2FjaGUgRGlzYWJsZSkgYW5kIFBXVCAoUGFnZSBXcml0ZSBUaHJvdWdoKSAqLwotICAgIC8qICAgICAgIGJpdHMgYXJlIHNldCB0byBkaXNhYmxlIGNhY2hpbmcgZm9yIGEgbWVtb3J5IG1hcHBpbmcgdXNlZCAqLwotICAgIC8qICAgICAgIGZvciBNTUlPIHJlZ2lzdGVyIGFjY2Vzcy4gV2UgYWxzbyBkaXNhYmxlIGNhY2hpbmcgdXNpbmcgKi8KLSAgICAvKiAgICAgICB0aGUgTVRSUiByZWdpc3RlcnMgZm9yIFBlbnRpdW0gUHJvIGFuZCBsYXRlciBjaGlwc2V0cyBzbyBpZiAqLwotICAgIC8qICAgICAgIE1UUlIgc3VwcG9ydCBpcyBlbmFibGVkIGZvciB5b3VyIE9TIHRoZW4geW91IGNhbiBzYWZlbHkgaWdub3JlICovCi0gICAgLyogICAgICAgdGhlIGlzQ2FjaGVkIGZsYWcgYW5kIGFsd2F5cyBlbmFibGUgY2FjaGluZyBpbiB0aGUgcGFnZSAqLwotICAgIC8qICAgICAgIHRhYmxlcy4gKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgcGh5c2ljYWwgYWRkcmVzcyBtYXBwaW5nIGFsbG9jYXRlZCBieSBQTV9tYXBQaHlzaWNhbEFkZHIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlUGh5c2ljYWxBZGRyKAotICAgIHZvaWQgKnB0ciwKLSAgICB1bG9uZyBsaW1pdCkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHdpbGwgZnJlZSBhIHBoeXNpY2FsIG1lbW9yeSBtYXBwaW5nIHByZXZpb3VzbHkgKi8KLSAgICAvKiAgICAgICBhbGxvY2F0ZWQgd2l0aCBQTV9tYXBQaHlzaWNhbEFkZHIoKSBpZiBhdCBhbGwgcG9zc2libGUuIElmICovCi0gICAgLyogICAgICAgeW91IGNhbid0IGZyZWUgcGh5c2ljYWwgbWVtb3J5IG1hcHBpbmdzLCBzaW1wbHkgZG8gbm90aGluZy4gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GaW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIGEgbGluZWFyIG1lbW9yeSBhZGRyZXNzIGluIGN1cnJlbnQgcHJvY2Vzcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHIodm9pZCAqcCkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBmaW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIGEgbGluZWFyICovCi0gICAgLyogICAgICAgYWRkcmVzcy4gKi8KLSAgICByZXR1cm4gMHhGRkZGRkZGRlVMOwotfQotCi12b2lkIFBNQVBJIFBNX3NsZWVwKHVsb25nIG1pbGxpc2Vjb25kcykKLXsKLSAgICAvKiBUT0RPOiBQdXQgdGhlIHByb2Nlc3MgdG8gc2xlZXAgZm9yIG1pbGxpc2Vjb25kcyAqLwotfQotCi1pbnQgUE1BUEkgUE1fZ2V0Q09NUG9ydChpbnQgcG9ydCkKLXsKLSAgICAvKiBUT0RPOiBSZS1jb2RlIHRoaXMgdG8gZGV0ZXJtaW5lIHJlYWwgdmFsdWVzIHVzaW5nIHRoZSBQbHVnIGFuZCBQbGF5ICovCi0gICAgLyogICAgICAgbWFuYWdlciBmb3IgdGhlIE9TLiAqLwotICAgIHN3aXRjaCAocG9ydCkgewotCWNhc2UgMDogcmV0dXJuIDB4M0Y4OwotCWNhc2UgMTogcmV0dXJuIDB4MkY4OwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IFBNQVBJIFBNX2dldExQVFBvcnQoaW50IHBvcnQpCi17Ci0gICAgLyogVE9ETzogUmUtY29kZSB0aGlzIHRvIGRldGVybWluZSByZWFsIHZhbHVlcyB1c2luZyB0aGUgUGx1ZyBhbmQgUGxheSAqLwotICAgIC8qICAgICAgIG1hbmFnZXIgZm9yIHRoZSBPUy4gKi8KLSAgICBzd2l0Y2ggKHBvcnQpIHsKLQljYXNlIDA6IHJldHVybiAweDNCQzsKLQljYXNlIDE6IHJldHVybiAweDM3ODsKLQljYXNlIDI6IHJldHVybiAweDI3ODsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGUgYSBibG9jayBvZiAodW5uYW1lZCkgc2hhcmVkIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbWFsbG9jU2hhcmVkKAotICAgIGxvbmcgc2l6ZSkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGlzIHVzZWQgdG8gYWxsb2NhdGUgbWVtb3J5IHRoYXQgaXMgc2hhcmVkIGJldHdlZW4gcHJvY2VzcyAqLwotICAgIC8qICAgICAgIHRoYXQgYWxsIGFjY2VzcyB0aGUgY29tbW9uIE51Y2xldXMgZHJpdmVycyB2aWEgYSBjb21tb24gZGlzcGxheSAqLwotICAgIC8qICAgICAgIGRyaXZlciBETEwuIElmIHlvdXIgT1MgZG9lcyBub3Qgc3VwcG9ydCBzaGFyZWQgbWVtb3J5IChvciBpZiAqLwotICAgIC8qICAgICAgIHRoZSBkaXNwbGF5IGRyaXZlciBkb2VzIG5vdCBuZWVkIHRvIGFsbG9jYXRlIHNoYXJlZCBtZW1vcnkgKi8KLSAgICAvKiAgICAgICBmb3IgZWFjaCBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UpLCB0aGlzIHNob3VsZCBqdXN0IGNhbGwgUE1fbWFsbG9jLiAqLwotICAgIHJldHVybiBQTV9tYWxsb2Moc2l6ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnJlZSBhIGJsb2NrIG9mIHNoYXJlZCBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlU2hhcmVkKAotICAgIHZvaWQgKnB0cikKLXsKLSAgICAvKiBUT0RPOiBGcmVlIHRoZSBzaGFyZWQgbWVtb3J5IGJsb2NrLiBUaGlzIHdpbGwgYmUgY2FsbGVkIGluIHRoZSBjb250ZXh0ICovCi0gICAgLyogICAgICAgb2YgdGhlIG9yaWdpbmFsIGNhbGxpbmcgcHJvY2VzcyB0aGF0IGFsbG9jYXRlZCB0aGUgc2hhcmVkICovCi0gICAgLyogICAgICAgbWVtb3J5IHdpdGggUE1fbWFsbG9jU2hhcmVkLiBTaW1wbHkgY2FsbCBQTV9mcmVlIGlmIHlvdSBkbyBub3QgKi8KLSAgICAvKiAgICAgICBuZWVkIHRoaXMuICovCi0gICAgUE1fZnJlZShwdHIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU1hcCBhIGxpbmVhciBtZW1vcnkgYWRkcmVzcyB0byB0aGUgY2FsbGluZyBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UuIFRoZQotYWRkcmVzcyB3aWxsIGhhdmUgYmVlbiBhbGxvY2F0ZWQgaW4gYW5vdGhlciBwcm9jZXNzIHVzaW5nIHRoZQotUE1fbWFwUGh5c2ljYWxBZGRyIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9tYXBUb1Byb2Nlc3MoCi0gICAgdm9pZCAqYmFzZSwKLSAgICB1bG9uZyBsaW1pdCkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbWFwIGEgcGh5c2ljYWwgbWVtb3J5IG1hcHBpbmcgKi8KLSAgICAvKiAgICAgICBwcmV2aW91c2x5IGFsbG9jYXRlZCB3aXRoIFBNX21hcFBoeXNpY2FsQWRkciBpbnRvIHRoZSAqLwotICAgIC8qICAgICAgIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIGNhbGxpbmcgcHJvY2Vzcy4gSWYgdGhlIG1lbW9yeSBtYXBwaW5nICovCi0gICAgLyogICAgICAgYWxsb2NhdGVkIGJ5IFBNX21hcFBoeXNpY2FsQWRkciBpcyBnbG9iYWwgdG8gYWxsIHByb2Nlc3NlcywgKi8KLSAgICAvKiAgICAgICBzaW1wbHkgcmV0dXJuIHRoZSBwb2ludGVyLiAqLwotCi0gICAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBtdXN0IGFsc28gaGFuZGxlIHJvdW5kaW5nIHRvIHBhZ2UgYm91bmRhcmllcywgKi8KLSAgICAvKiAgICAgICBzaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbWFwIGluIHNoYXJlZCBtZW1vcnkgYnVmZmVycyAqLwotICAgIC8qICAgICAgIGFsbG9jYXRlZCB3aXRoIFBNX21hcFBoeXNpY2FsQWRkcigpLiBIZW5jZSBpZiB5b3UgYWxpZ25lZCAqLwotICAgIC8qICAgICAgIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGFib3ZlLCB0aGVuIHlvdSBhbHNvIG5lZWQgdG8gZG8gaXQgaGVyZS4gKi8KLSAgICByZXR1cm4gYmFzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1NYXAgYSByZWFsIG1vZGUgcG9pbnRlciB0byBhIHByb3RlY3RlZCBtb2RlIHBvaW50ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX21hcFJlYWxQb2ludGVyKAotICAgIHVpbnQgcl9zZWcsCi0gICAgdWludCByX29mZikKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIG1hcHMgYSByZWFsIG1vZGUgbWVtb3J5IHBvaW50ZXIgaW50byB0aGUgKi8KLSAgICAvKiAgICAgICBjYWxsaW5nIHByb2Nlc3NlcyBhZGRyZXNzIHNwYWNlIGFzIGEgMzItYml0IG5lYXIgcG9pbnRlci4gSWYgKi8KLSAgICAvKiAgICAgICB5b3UgZG8gbm90IHN1cHBvcnQgQklPUyBhY2Nlc3MsIHNpbXBseSByZXR1cm4gTlVMTCBoZXJlLiAqLwotICAgIGlmICghemVyb1B0cikKLQl6ZXJvUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDAsMHhGRkZGRik7Ci0gICAgcmV0dXJuICh2b2lkKikoemVyb1B0ciArIE1LX1BIWVMocl9zZWcscl9vZmYpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZSBhIGJsb2NrIG9mIHJlYWwgbW9kZSBtZW1vcnkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fYWxsb2NSZWFsU2VnKAotICAgIHVpbnQgc2l6ZSwKLSAgICB1aW50ICpyX3NlZywKLSAgICB1aW50ICpyX29mZikKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIGJsb2NrIG9mIHJlYWwgbW9kZSBtZW1vcnkgZm9yIHRoZSAqLwotICAgIC8qICAgICAgIGNhbGxpbmcgcHJvY2VzcyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggcmVhbCBtb2RlIEJJT1MgKi8KLSAgICAvKiAgICAgICBmdW5jdGlvbnMuIElmIHlvdSBkbyBub3Qgc3VwcG9ydCBCSU9TIGFjY2Vzcywgc2ltcGx5IHJldHVybiAqLwotICAgIC8qICAgICAgIE5VTEwgaGVyZS4gKi8KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgYmxvY2sgb2YgcmVhbCBtb2RlIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVSZWFsU2VnKAotICAgIHZvaWQgKm1lbSkKLXsKLSAgICAvKiBUT0RPOiBGcmVlcyBhIHByZXZpb3VzbHkgYWxsb2NhdGVkIHJlYWwgbW9kZSBtZW1vcnkgYmxvY2suIElmIHlvdSAqLwotICAgIC8qICAgICAgIGRvIG5vdCBzdXBwb3J0IEJJT1MgYWNjZXNzLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBlbXB0eS4gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jc3N1ZSBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQgKHBhcmFtZXRlcnMgaW4gRFBNSSBjb21wYXRpYmxlIHN0cnVjdHVyZSkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIERQTUlfaW50ODYoCi0gICAgaW50IGludG5vLAotICAgIERQTUlfcmVncyAqcmVncykKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIGNhbGxzIHRoZSByZWFsIG1vZGUgQklPUyB1c2luZyB0aGUgcGFzc2VkIGluICovCi0gICAgLyogICAgICAgcmVnaXN0ZXIgc3RydWN0dXJlLiBJZiB5b3UgZG8gbm90IHN1cHBvcnQgcmVhbCBtb2RlIEJJT1MgKi8KLSAgICAvKiAgICAgICBhY2Nlc3MsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGVtcHR5LiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUlzc3VlIGEgcmVhbCBtb2RlIGludGVycnVwdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1faW50ODYoCi0gICAgaW50IGludG5vLAotICAgIFJNUkVHUyAqaW4sCi0gICAgUk1SRUdTICpvdXQpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBjYWxscyB0aGUgcmVhbCBtb2RlIEJJT1MgdXNpbmcgdGhlIHBhc3NlZCBpbiAqLwotICAgIC8qICAgICAgIHJlZ2lzdGVyIHN0cnVjdHVyZS4gSWYgeW91IGRvIG5vdCBzdXBwb3J0IHJlYWwgbW9kZSBCSU9TICovCi0gICAgLyogICAgICAgYWNjZXNzLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gMC4gKi8KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jc3N1ZSBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2ludDg2eCgKLSAgICBpbnQgaW50bm8sCi0gICAgUk1SRUdTICppbiwKLSAgICBSTVJFR1MgKm91dCwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIGNhbGxzIHRoZSByZWFsIG1vZGUgQklPUyB1c2luZyB0aGUgcGFzc2VkIGluICovCi0gICAgLyogICAgICAgcmVnaXN0ZXIgc3RydWN0dXJlLiBJZiB5b3UgZG8gbm90IHN1cHBvcnQgcmVhbCBtb2RlIEJJT1MgKi8KLSAgICAvKiAgICAgICBhY2Nlc3MsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiAwLiAqLwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgYSByZWFsIG1vZGUgZmFyIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fY2FsbFJlYWxNb2RlKAotICAgIHVpbnQgc2VnLAotICAgIHVpbnQgb2ZmLAotICAgIFJNUkVHUyAqaW4sCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBjYWxscyBhIHJlYWwgbW9kZSBmYXIgZnVuY3Rpb24gd2l0aCBhIGZhciBjYWxsLiAqLwotICAgIC8qICAgICAgIElmIHlvdSBkbyBub3Qgc3VwcG9ydCBCSU9TIGFjY2VzcywgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgKi8KLSAgICAvKiAgICAgICBlbXB0eS4gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIGFtb3VudCBvZiBhdmFpbGFibGUgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fYXZhaWxhYmxlTWVtb3J5KAotICAgIHVsb25nICpwaHlzaWNhbCwKLSAgICB1bG9uZyAqdG90YWwpCi17Ci0gICAgLyogVE9ETzogUmVwb3J0IHRoZSBhbW91bnQgb2YgYXZhaWxhYmxlIG1lbW9yeSwgYm90aCB0aGUgYW1vdW50IG9mICovCi0gICAgLyogICAgICAgcGh5c2ljYWwgbWVtb3J5IGxlZnQgYW5kIHRoZSBhbW91bnQgb2YgdmlydHVhbCBtZW1vcnkgbGVmdC4gKi8KLSAgICAvKiAgICAgICBJZiB0aGUgT1MgZG9lcyBub3QgcHJvdmlkZSB0aGVzZSBzZXJ2aWNlcywgcmVwb3J0IDAncy4gKi8KLSAgICAqcGh5c2ljYWwgPSAqdG90YWwgPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlIGEgYmxvY2sgb2YgbG9ja2VkLCBwaHlzaWNhbCBtZW1vcnkgZm9yIERNQSBvcGVyYXRpb25zLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY0xvY2tlZE1lbSgKLSAgICB1aW50IHNpemUsCi0gICAgdWxvbmcgKnBoeXNBZGRyLAotICAgIGlib29sIGNvbnRpZ3VvdXMsCi0gICAgaWJvb2wgYmVsb3cxNk0pCi17Ci0gICAgLyogVE9ETzogQWxsb2NhdGUgYSBibG9jayBvZiBsb2NrZWQsIHBoeXNpY2FsIG1lbW9yeSBvZiB0aGUgc3BlY2lmaWVkICovCi0gICAgLyogICAgICAgc2l6ZS4gVGhpcyBpcyB1c2VkIGZvciBidXMgbWFzdGVyIG9wZXJhdGlvbnMuIElmIHRoaXMgaXMgbm90ICovCi0gICAgLyogICAgICAgc3VwcG9ydGVkIGJ5IHRoZSBPUywgcmV0dXJuIE5VTEwgYW5kIGJ1cyBtYXN0ZXJpbmcgd2lsbCBub3QgKi8KLSAgICAvKiAgICAgICBiZSB1c2VkLiAqLwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZyZWUgYSBibG9jayBvZiBsb2NrZWQgcGh5c2ljYWwgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZUxvY2tlZE1lbSgKLSAgICB2b2lkICpwLAotICAgIHVpbnQgc2l6ZSwKLSAgICBpYm9vbCBjb250aWd1b3VzKQotewotICAgIC8qIFRPRE86IEZyZWUgYSBtZW1vcnkgYmxvY2sgYWxsb2NhdGVkIHdpdGggUE1fYWxsb2NMb2NrZWRNZW0uICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ2FsbCB0aGUgVkJFL0NvcmUgc29mdHdhcmUgaW50ZXJydXB0IHRvIGNoYW5nZSBkaXNwbGF5IGJhbmtzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0QmFua0EoCi0gICAgaW50IGJhbmspCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgLyogVE9ETzogVGhpcyBkb2VzIGEgYmFuayBzd2l0Y2ggZnVuY3Rpb24gYnkgY2FsbGluZyB0aGUgcmVhbCBtb2RlICovCi0gICAgLyogICAgICAgVkVTQSBCSU9TLiBJZiB5b3UgZG8gbm90IHN1cHBvcnQgQklPUyBhY2Nlc3MsIHRoaXMgZnVuY3Rpb24gc2hvdWxkICovCi0gICAgLyogICAgICAgYmUgZW1wdHkuICovCi0gICAgcmVncy54LmF4ID0gMHg0RjA1OwotICAgIHJlZ3MueC5ieCA9IDB4MDAwMDsKLSAgICByZWdzLnguZHggPSBiYW5rOwotICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIFZCRS9Db3JlIHNvZnR3YXJlIGludGVycnVwdCB0byBjaGFuZ2UgZGlzcGxheSBiYW5rcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldEJhbmtBQigKLSAgICBpbnQgYmFuaykKLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0KLSAgICAvKiBUT0RPOiBUaGlzIGRvZXMgYSBiYW5rIHN3aXRjaCBmdW5jdGlvbiBieSBjYWxsaW5nIHRoZSByZWFsIG1vZGUgKi8KLSAgICAvKiAgICAgICBWRVNBIEJJT1MuIElmIHlvdSBkbyBub3Qgc3VwcG9ydCBCSU9TIGFjY2VzcywgdGhpcyBmdW5jdGlvbiBzaG91bGQgKi8KLSAgICAvKiAgICAgICBiZSBlbXB0eS4gKi8KLSAgICByZWdzLnguYXggPSAweDRGMDU7Ci0gICAgcmVncy54LmJ4ID0gMHgwMDAwOwotICAgIHJlZ3MueC5keCA9IGJhbms7Ci0gICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7Ci0gICAgcmVncy54LmF4ID0gMHg0RjA1OwotICAgIHJlZ3MueC5ieCA9IDB4MDAwMTsKLSAgICByZWdzLnguZHggPSBiYW5rOwotICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIFZCRS9Db3JlIHNvZnR3YXJlIGludGVycnVwdCB0byBjaGFuZ2UgZGlzcGxheSBzdGFydCBhZGRyZXNzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0Q1JUU3RhcnQoCi0gICAgaW50IHgsCi0gICAgaW50IHksCi0gICAgaW50IHdhaXRWUlQpCi17Ci0gICAgUk1SRUdTICByZWdzOwotCi0gICAgLyogVE9ETzogVGhpcyBjaGFuZ2VzIHRoZSBkaXNwbGF5IHN0YXJ0IGFkZHJlc3MgYnkgY2FsbGluZyB0aGUgcmVhbCBtb2RlICovCi0gICAgLyogICAgICAgVkVTQSBCSU9TLiBJZiB5b3UgZG8gbm90IHN1cHBvcnQgQklPUyBhY2Nlc3MsIHRoaXMgZnVuY3Rpb24gKi8KLSAgICAvKiAgICAgICBzaG91bGQgYmUgZW1wdHkuICovCi0gICAgcmVncy54LmF4ID0gMHg0RjA3OwotICAgIHJlZ3MueC5ieCA9IHdhaXRWUlQ7Ci0gICAgcmVncy54LmN4ID0geDsKLSAgICByZWdzLnguZHggPSB5OwotICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUVuYWJsZSB3cml0ZSBjb21iaW5pbmcgZm9yIHRoZSBtZW1vcnkgcmVnaW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2VuYWJsZVdyaXRlQ29tYmluZSgKLSAgICB1bG9uZyBiYXNlLAotICAgIHVsb25nIGxlbmd0aCwKLSAgICB1aW50IHR5cGUpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgZW5hYmxlIFBlbnRpdW0gUHJvIGFuZCBQZW50aXVtIElJIE1UUlIgKi8KLSAgICAvKiAgICAgICB3cml0ZSBjb21iaW5pbmcgZm9yIHRoZSBwYXNzZWQgaW4gcGh5c2ljYWwgbWVtb3J5IGJhc2UgYWRkcmVzcyAqLwotICAgIC8qICAgICAgIGFuZCBsZW5ndGguIE5vcm1hbGx5IHRoaXMgaXMgZG9uZSB2aWEgY2FsbHMgdG8gYW4gT1Mgc3BlY2lmaWMgKi8KLSAgICAvKiAgICAgICBkZXZpY2UgZHJpdmVyIGFzIHRoaXMgY2FuIG9ubHkgYmUgZG9uZSBhdCByaW5nIDAuICovCi0gICAgLyogKi8KLSAgICAvKiBOT1RFOiBUaGlzIGlzIGEgKnZlcnkqIGltcG9ydGFudCBmdW5jdGlvbiB0byBpbXBsZW1lbnQhIElmIHlvdSBkbyAqLwotICAgIC8qICAgICAgIG5vdCBpbXBsZW1lbnQsIGdyYXBoaWNzIHBlcmZvcm1hbmNlIG9uIHRoZSBsYXRlc3QgSW50ZWwgY2hpcHMgKi8KLSAgICAvKiAgICAgICB3aWxsIGJlIHNldmVybHkgaW1wYWlyZWQuIEZvciBzYW1wbGUgY29kZSB0aGF0IGNhbiBiZSB1c2VkICovCi0gICAgLyogICAgICAgZGlyZWN0bHkgaW4gYSByaW5nIDAgZGV2aWNlIGRyaXZlciwgc2VlIHRoZSBNU0RPUyBpbXBsZW1lbnRhdGlvbiAqLwotICAgIC8qICAgICAgIHdoaWNoIGluY2x1ZGVzIGFzc2VtYmxlciBjb2RlIHRvIGRvIHRoaXMgZGlyZWN0bHkgKGlmIHRoZSAqLwotICAgIC8qICAgICAgIHByb2dyYW0gaXMgcnVubmluZyBhdCByaW5nIDApLiAqLwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1FeGVjdXRlIHRoZSBQT1NUIG9uIHRoZSBzZWNvbmRhcnkgQklPUyBmb3IgYSBjb250cm9sbGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2RvQklPU1BPU1QoCi0gICAgdXNob3J0IGF4VmFsLAotICAgIHVsb25nIEJJT1NQaHlzQWRkciwKLSAgICB2b2lkICptYXBwZWRCSU9TKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBydW4gdGhlIEJJT1MgUE9TVCBjb2RlIG9uIGEgc2Vjb25kYXJ5ICovCi0gICAgLyogICAgICAgY29udHJvbGxlciB0byBpbml0aWFsaXNlIGl0IGZvciB1c2UuIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSAqLwotICAgIC8qICAgICAgIGZvciBtdWx0aS1jb250cm9sbGVyIG9wZXJhdGlvbiwgYnV0IGl0IHdpbGwgbWFrZSBpdCBhIGxvdCAqLwotICAgIC8qICAgICAgIG1vcmUgY29udmVuaWNlbnQgZm9yIGVuZCB1c2VycyAob3RoZXJ3aXNlIHRoZXkgaGF2ZSB0byBib290ICovCi0gICAgLyogICAgICAgdGhlIHN5c3RlbSBvbmNlIHdpdGggdGhlIHNlY29uZGFyeSBjb250cm9sbGVyIGFzIHByaW1hcnksIGFuZCAqLwotICAgIC8qICAgICAgIHRoZW4gYm9vdCB3aXRoIGJvdGggY29udHJvbGxlcnMgaW5zdGFsbGVkKS4gKi8KLSAgICAvKiAqLwotICAgIC8qICAgICAgIEV2ZW4gaWYgeW91IGRvbid0IHN1cHBvcnQgZnVsbCBCSU9TIGFjY2VzcywgaXQgd291bGQgYmUgKi8KLSAgICAvKiAgICAgICBhZHZpc2VhYmxlIHRvIGJlIGFibGUgdG8gUE9TVCB0aGUgc2Vjb25kYXJ5IGNvbnRyb2xsZXJzIGluIHRoZSAqLwotICAgIC8qICAgICAgIHN5c3RlbSB1c2luZyB0aGlzIGZ1bmN0aW9uIGFzIGEgbWluaW11bSByZXF1aXJlbWVudC4gU29tZSAqLwotICAgIC8qICAgICAgIGdyYXBoaWNzIGhhcmR3YXJlIGhhcyByZWdpc3RlcnMgdGhhdCBjb250YWluIHZhbHVlcyB0aGF0IG9ubHkgKi8KLSAgICAvKiAgICAgICB0aGUgQklPUyBrbm93cyBhYm91dCwgd2hpY2ggbWFrZXMgYnJpbmcgdXAgYSBjYXJkIGZyb20gY29sZCAqLwotICAgIC8qICAgICAgIHJlc2V0IGRpZmZpY3VsdCBpZiB0aGUgQklPUyBoYXMgbm90IFBPU1QnZWQgaXQuICovCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUxvYWQgYW4gT1Mgc3BlY2lmaWMgc2hhcmVkIGxpYnJhcnkgb3IgRExMLiBJZiB0aGUgT1MgZG9lcyBub3Qgc3VwcG9ydAotc2hhcmVkIGxpYnJhcmllcywgc2ltcGx5IHJldHVybiBOVUxMLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVBNX01PRFVMRSBQTUFQSSBQTV9sb2FkTGlicmFyeSgKLSAgICBjb25zdCBjaGFyICpzekRMTE5hbWUpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgbG9hZCBhIG5hdGl2ZSBzaGFyZWQgbGlicmFyeSBmcm9tIGRpc2sgKi8KLSAgICAvKiAgICAgICBnaXZlbiB0aGUgcGF0aCB0byB0aGUgbGlicmFyeS4gKi8KLSAgICAodm9pZClzekRMTE5hbWU7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotR2V0IHRoZSBhZGRyZXNzIG9mIGEgbmFtZWQgcHJvY2VkdXJlIGZyb20gYSBzaGFyZWQgbGlicmFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fZ2V0UHJvY0FkZHJlc3MoCi0gICAgUE1fTU9EVUxFIGhNb2R1bGUsCi0gICAgY29uc3QgY2hhciAqc3pQcm9jTmFtZSkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgYSBuYW1lZCBwcm9jZWR1cmUgKi8KLSAgICAvKiAgICAgICBmcm9tIGEgbmF0aXZlIHNoYXJlZCBsaWJyYXJ5LiAqLwotICAgICh2b2lkKWhNb2R1bGU7Ci0gICAgKHZvaWQpc3pQcm9jTmFtZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1VbmxvYWQgYSBzaGFyZWQgbGlicmFyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVMaWJyYXJ5KAotICAgIFBNX01PRFVMRSBoTW9kdWxlKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gZnJlZSBhIHByZXZpb3VzbHkgbG9hZGVkIG5hdGl2ZSBzaGFyZWQgbGlicmFyeS4gKi8KLSAgICAodm9pZCloTW9kdWxlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUVuYWJsZSByZXF1ZXN0ZWQgSS9PIHByaXZsZWRnZSBsZXZlbCAodXN1YWxseSBvbmx5IHRvIHNldCB0byBhIHZhbHVlIG9mCi0zLCBhbmQgdGhlbiByZXN0b3JlIGl0IGJhY2sgYWdhaW4pLiBJZiB0aGUgT1MgaXMgcHJvdGVjdGVkIHRoaXMgZnVuY3Rpb24KLW11c3QgYmUgaW1wbGVtZW50ZWQgaW4gb3JkZXIgdG8gZW5hYmxlIEkvTyBwb3J0IGFjY2VzcyBmb3IgcmluZyAzCi1hcHBsaWNhdGlvbnMuIFRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBJT1BMIGxldmVsIGFjdGl2ZSBiZWZvcmUKLXRoZSBzd2l0Y2ggb2NjdXJyZWQgc28gaXQgY2FuIGJlIHByb3Blcmx5IHJlc3RvcmVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9zZXRJT1BMKAotICAgIGludCBsZXZlbCkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBlbmFibGUgSU9QTCBmb3IgdGhlIHRhc2sgKGlmIElPUEwgaXMgKi8KLSAgICAvKiAgICAgICBub3QgYWx3YXlzIGVuYWJsZWQgZm9yIHRoZSBhcHAgdGhyb3VnaCBzb21lIG90aGVyIG1lYW5zKS4gKi8KLSAgICByZXR1cm4gbGV2ZWw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZmluZCB0aGUgZmlyc3QgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICpQTUFQSSBQTV9maW5kRmlyc3RGaWxlKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBzdGFydCBhIGRpcmVjdG9yeSBlbnVtZXJhdGlvbiBzZWFyY2ggKi8KLSAgICAvKiAgICAgICBnaXZlbiB0aGUgZmlsZW5hbWUgKHdpdGggd2lsZGNhcmRzKS4gVGhlIGRhdGEgc2hvdWxkIGJlICovCi0gICAgLyogICAgICAgY29udmVydGVkIGFuZCByZXR1cm5lZCBpbiB0aGUgZmluZERhdGEgc3RhbmRhcmQgZm9ybS4gKi8KLSAgICAodm9pZClmaWxlbmFtZTsKLSAgICAodm9pZClmaW5kRGF0YTsKLSAgICByZXR1cm4gUE1fRklMRV9JTlZBTElEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGZpbmQgdGhlIG5leHQgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9maW5kTmV4dEZpbGUoCi0gICAgdm9pZCAqaGFuZGxlLAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBmaW5kIHRoZSBuZXh0IGZpbGUgaW4gZGlyZWN0b3J5IGVudW1lcmF0aW9uICovCi0gICAgLyogICAgICAgc2VhcmNoIGdpdmVuIHRoZSBzZWFyY2ggY3JpdGVyaWEgZGVmaW5lZCBpbiB0aGUgY2FsbCB0byAqLwotICAgIC8qICAgICAgIFBNX2ZpbmRGaXJzdEZpbGUuIFRoZSBkYXRhIHNob3VsZCBiZSBjb252ZXJ0ZWQgYW5kIHJldHVybmVkICovCi0gICAgLyogICAgICAgaW4gdGhlIGZpbmREYXRhIHN0YW5kYXJkIGZvcm0uICovCi0gICAgKHZvaWQpaGFuZGxlOwotICAgICh2b2lkKWZpbmREYXRhOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjbG9zZSB0aGUgZmluZCBwcm9jZXNzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9maW5kQ2xvc2UoCi0gICAgdm9pZCAqaGFuZGxlKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGNsb3NlIHRoZSBmaW5kIHByb2Nlc3MuIFRoaXMgbWF5IGRvICovCi0gICAgLyogICAgICAgbm90aGluZyBmb3Igc29tZSBPUydlcy4gKi8KLSAgICAodm9pZCloYW5kbGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIGEgZHJpdmUgaXMgYSB2YWxpZCBkcml2ZSBvciBub3QuIFVuZGVyIFVuaXggdGhpcwotZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UgZm9yIGFueXRoaW5nIGV4Y2VwdCBhIHZhbHVlIG9mIDMgKGNvbnNpZGVyZWQKLXRoZSByb290IGRyaXZlLCBhbmQgZXF1aXZhbGVudCB0byBDOiBmb3Igbm9uLVVuaXggc3lzdGVtcykuIFRoZSBkcml2ZQotbnVtYmVyaW5nIGlzOgotCi0gICAgMSAgIC0gRHJpdmUgQToKLSAgICAyICAgLSBEcml2ZSBCOgotICAgIDMgICAtIERyaXZlIEM6Ci0gICAgZXRjCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9kcml2ZVZhbGlkKAotICAgIGNoYXIgZHJpdmUpCi17Ci0gICAgaWYgKGRyaXZlID09IDMpCi0JcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGdldCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIHNwZWNpZmlmZWQgZHJpdmUuCi1VbmRlciBVbml4IHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHJlZ2FyZGxlc3MKLW9mIHdoYXQgdGhlIHZhbHVlIG9mICdkcml2ZScgaXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9nZXRkY3dkKAotICAgIGludCBkcml2ZSwKLSAgICBjaGFyICpkaXIsCi0gICAgaW50IGxlbikKLXsKLSAgICAodm9pZClkcml2ZTsKLSAgICBnZXRjd2QoZGlyLGxlbik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gY2hhbmdlIHRoZSBmaWxlIGF0dHJpYnV0ZXMgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldEZpbGVBdHRyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIHVpbnQgYXR0cmliKQotewotICAgIC8qIFRPRE86IFNldCB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIGZpbGUgKi8KLSAgICAodm9pZClmaWxlbmFtZTsKLSAgICAodm9pZClhdHRyaWI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gY3JlYXRlIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX21rZGlyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIHJldHVybiBta2RpcihmaWxlbmFtZSkgPT0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byByZW1vdmUgYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fcm1kaXIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgcmV0dXJuIHJtZGlyKGZpbGVuYW1lKSA9PSAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc3R1Yi92ZmxhdC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vc3R1Yi92ZmxhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzllZjJjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3N0dWIvdmZsYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIER1bW15IG1vZHVsZTsgbm8gdmlydHVhbCBmcmFtZWJ1ZmZlciBmb3IgdGhpcyBPUwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0KLWlib29sIFBNQVBJIFZGX2F2YWlsYWJsZSh2b2lkKQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCAqIFBNQVBJIFZGX2luaXQodWxvbmcgYmFzZUFkZHIsaW50IGJhbmtTaXplLGludCBjb2RlTGVuLHZvaWQgKmJhbmtGdW5jKQotewotICAgIGJhc2VBZGRyID0gYmFzZUFkZHI7Ci0gICAgYmFua1NpemUgPSBiYW5rU2l6ZTsKLSAgICBjb2RlTGVuID0gY29kZUxlbjsKLSAgICBiYW5rRnVuYyA9IGJhbmtGdW5jOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFZGX2V4aXQodm9pZCkKLXsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3N0dWIvenRpbWVyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS9zdHViL3p0aW1lci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjBlMjkyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3N0dWIvenRpbWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgKioqIFRPRE86IEFERCBZT1VSIE9TIEVOVklST05NRU5UIE5BTUUgSEVSRSAqKioKLSoKLSogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFplbiBUaW1lciBmdW5jdGlvbnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIFplbiBUaW1lciBtb2R1bGUgaW50ZXJuYWxzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX19aVGltZXJJbml0KHZvaWQpCi17Ci0gICAgLyogVE9ETzogRG8gYW55IHNwZWNpZmljIGludGVybmFsIGluaXRpYWxpc2F0aW9uIGluIGhlcmUgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TdGFydCB0aGUgWmVuIFRpbWVyIGNvdW50aW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9fTFpUaW1lck9uKAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotICAgIC8qIFRPRE86IFN0YXJ0IHRoZSBaZW4gVGltZXIgY291bnRpbmcuIFRoaXMgc2hvdWxkIGJlIGEgbWFjcm8gaWYgKi8KLSAgICAvKiAgICAgICBwb3NzaWJsZS4gKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Db21wdXRlIHRoZSBsYXAgdGltZSBzaW5jZSB0aGUgdGltZXIgd2FzIHN0YXJ0ZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIF9fTFpUaW1lckxhcCgKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSAgICAvKiBUT0RPOiBDb21wdXRlIHRoZSBsYXAgdGltZSBiZXR3ZWVuIHRoZSBjdXJyZW50IHRpbWUgYW5kIHdoZW4gdGhlICovCi0gICAgLyogICAgICAgdGltZXIgd2FzIHN0YXJ0ZWQuICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU3RvcCB0aGUgWmVuIFRpbWVyIGNvdW50aW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9fTFpUaW1lck9mZigKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSAgICAvKiBUT0RPOiBTdG9wIHRoZSB0aW1lciBjb3VudGluZy4gU2hvdWxkIGJlIGEgbWFjcm8gaWYgcG9zc2libGUuICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29tcHV0ZSB0aGUgZWxhcHNlZCB0aW1lIGluIG1pY3Jvc2Vjb25kcyBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQgdGltaW5ncy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX19MWlRpbWVyQ291bnQoCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0gICAgLyogVE9ETzogQ29tcHV0ZSB0aGUgZWxhcHNlZCB0aW1lIGFuZCByZXR1cm4gaXQuIEFsd2F5cyBtaWNyb3NlY29uZHMuICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGVmaW5lIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBsb25nIHBlcmlvZCB0aW1lciBhcyBtaWNyb3NlY29uZHMgcGVyIHRpbWVyIHRpY2suCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBVTFpUSU1FUl9SRVNPTFVUSU9OICAgICAxCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCB0aGUgTG9uZyBQZXJpb2QgdGltZXIgZnJvbSB0aGUgT1MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX19VTFpSZWFkVGltZSh2b2lkKQotewotICAgIC8qIFRPRE86IFJlYWQgdGhlIGxvbmcgcGVyaW9kIHRpbWVyIGZyb20gdGhlIE9TLiBUaGUgcmVzb2x1dGlvbiBvZiB0aGlzICovCi0gICAgLyogICAgICAgdGltZXIgc2hvdWxkIGJlIGFyb3VuZCAxLzIwIG9mIGEgc2Vjb25kIGZvciB0aW1pbmcgbG9uZyAqLwotICAgIC8qICAgICAgIHBlcmlvZHMgaWYgcG9zc2libGUuICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29tcHV0ZSB0aGUgZWxhcHNlZCB0aW1lIGZyb20gdGhlIEJJT1MgdGltZXIgdGljay4gTm90ZSB0aGF0IHdlIGNoZWNrIHRvIHNlZQotd2hldGhlciBhIG1pZG5pZ2h0IGJvdW5kYXJ5IGhhcyBwYXNzZWQsIGFuZCBpZiBzbyBhZGp1c3QgdGhlIGZpbmlzaCB0aW1lIHRvCi1hY2NvdW50IGZvciB0aGlzLiBXZSBjYW5ub3QgZGV0ZWN0IGlmIG1vcmUgdGhhdCBvbmUgbWlkbmlnaHQgYm91bmRhcnkgaGFzCi1wYXNzZWQsIHNvIGlmIHRoaXMgaGFwcGVucyB3ZSB3aWxsIGJlIGdlbmVyYXRpbmcgZXJyb25vdXMgcmVzdWx0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfX1VMWkVsYXBzZWRUaW1lKHVsb25nIHN0YXJ0LHVsb25nIGZpbmlzaCkKLXsgcmV0dXJuIGZpbmlzaCAtIHN0YXJ0OyB9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9hbHRicmsuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2FsdGJyay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTkwMjYyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2FsdGJyay5jCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgYW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGVzdCBwcm9ncmFtIHRvIGNoZWNrIHRoZSBhYmlsaXR5IHRvIGluc3RhbGwgYSBDIGJhc2VkCi0qICAgICAgICAgICAgICAgY29udHJvbCBDL2JyZWFrIGludGVycnVwdCBoYW5kbGVyLiBOb3RlIHRoYXQgdGhpcwotKiAgICAgICAgICAgICAgIGFsdGVybmF0ZSB2ZXJzaW9uIGRvZXMgbm90IHdvcmsgd2l0aCBhbGwgZXh0ZW5kZXJzLgotKgotKiAgICAgICAgICAgICAgIEZ1bmN0aW9ucyB0ZXN0ZWQ6ICAgUE1faW5zdGFsbEFsdEJyZWFrSGFuZGxlcigpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9yZXN0b3JlQnJlYWtIYW5kbGVyKCkKLSoKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInBtYXBpLmgiCi0KLXZvbGF0aWxlIGludCBicmVha0hpdCA9IGZhbHNlOwotdm9sYXRpbGUgaW50IGN0cmxDSGl0ID0gZmFsc2U7Ci0KLSNwcmFnbWEgb2ZmIChjaGVja19zdGFjaykgICAgICAgICAgIC8qIE5vIHN0YWNrIGNoZWNraW5nIHVuZGVyIFdhdGNvbSAgICovCi0KLXZvaWQgUE1BUEkgYnJlYWtIYW5kbGVyKHVpbnQgYkhpdCkKLXsKLSAgICBpZiAoYkhpdCkKLQlicmVha0hpdCA9IHRydWU7Ci0gICAgZWxzZQotCWN0cmxDSGl0ID0gdHJ1ZTsKLX0KLQotaW50IG1haW4odm9pZCkKLXsKLSAgICBwcmludGYoIlByb2dyYW0gcnVubmluZyBpbiAiKTsKLSAgICBzd2l0Y2ggKFBNX2dldE1vZGVUeXBlKCkpIHsKLQljYXNlIFBNX3JlYWxNb2RlOgotCSAgICBwcmludGYoInJlYWwgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMjg2OgotCSAgICBwcmludGYoIjE2IGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMzg2OgotCSAgICBwcmludGYoIjMyIGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCX0KLQotICAgIFBNX2luc3RhbGxBbHRCcmVha0hhbmRsZXIoYnJlYWtIYW5kbGVyKTsKLSAgICBwcmludGYoIkNvbnRyb2wgQy9CcmVhayBpbnRlcnJ1cHQgaGFuZGxlciBpbnN0YWxsZWRcbiIpOwotICAgIHdoaWxlICgxKSB7Ci0JaWYgKGN0cmxDSGl0KSB7Ci0JICAgIHByaW50ZigiQ29kZSB0ZXJtaW1hdGVkIHdpdGggQ3RybC1DLlxuIik7Ci0JICAgIGJyZWFrOwotCSAgICB9Ci0JaWYgKGJyZWFrSGl0KSB7Ci0JICAgIHByaW50ZigiQ29kZSB0ZXJtaW1hdGVkIHdpdGggQ3RybC1CcmVhay5cbiIpOwotCSAgICBicmVhazsKLQkgICAgfQotCWlmIChQTV9rYmhpdCgpICYmIFBNX2dldGNoKCkgPT0gMHgxQikgewotCSAgICBwcmludGYoIk5vIGJyZWFrIGNvZGUgZGV0ZWN0ZWQhXG4iKTsKLQkgICAgYnJlYWs7Ci0JICAgIH0KLQlwcmludGYoIkhpdCBDdHJsLUMgb3IgQ3RybC1CcmVhayB0byBleGl0IVxuIik7Ci0JfQotCi0gICAgUE1fcmVzdG9yZUJyZWFrSGFuZGxlcigpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvYWx0Y3JpdC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvYWx0Y3JpdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTM3MzA3Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2FsdGNyaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIGFueQotKgotKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSB0byBjaGVjayB0aGUgYWJpbGl0eSB0byBpbnN0YWxsIGEgQyBiYXNlZAotKiAgICAgICAgICAgICAgIGNyaXRpY2FsIGVycm9yIGhhbmRsZXIuCi0qCi0qICAgICAgICAgICAgICAgRnVuY3Rpb25zIHRlc3RlZDogICBQTV9pbnN0YWxsQ3JpdGljYWxIYW5kbGVyKCkKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX2NyaXRpY2FsRXJyb3IoKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fcmVzdG9yZUNyaXRpY2FsSGFuZGxlcigpCi0qCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJwbWFwaS5oIgotCi12b2xhdGlsZSB1aW50IGNyaXRpY2FsRXJyb3IgPSBmYWxzZTsKLXZvbGF0aWxlIHVpbnQgYXhWYWx1ZTsKLXZvbGF0aWxlIHVpbnQgZGlWYWx1ZTsKLQotI3ByYWdtYSBvZmYgKGNoZWNrX3N0YWNrKSAgICAgICAgICAgLyogTm8gc3RhY2sgY2hlY2tpbmcgdW5kZXIgV2F0Y29tICAgKi8KLQotdWludCBQTUFQSSBjcml0aWNhbEhhbmRsZXIodWludCBheFZhbCx1aW50IGRpVmFsKQotewotICAgIGNyaXRpY2FsRXJyb3IgPSB0cnVlOwotICAgIGF4VmFsdWUgPSBheFZhbDsKLSAgICBkaVZhbHVlID0gZGlWYWw7Ci0gICAgcmV0dXJuIDM7ICAgICAgIC8qIFRlbGwgTVMtRE9TIHRvIGZhaWwgdGhlIG9wZXJhdGlvbiAqLwotfQotCi1pbnQgbWFpbih2b2lkKQotewotICAgIEZJTEUgICAgKmY7Ci0KLSAgICBwcmludGYoIlByb2dyYW0gcnVubmluZyBpbiAiKTsKLSAgICBzd2l0Y2ggKFBNX2dldE1vZGVUeXBlKCkpIHsKLQljYXNlIFBNX3JlYWxNb2RlOgotCSAgICBwcmludGYoInJlYWwgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMjg2OgotCSAgICBwcmludGYoIjE2IGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMzg2OgotCSAgICBwcmludGYoIjMyIGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCX0KLQotICAgIFBNX2luc3RhbGxBbHRDcml0aWNhbEhhbmRsZXIoY3JpdGljYWxIYW5kbGVyKTsKLSAgICBwcmludGYoIkNyaXRpY2FsIEVycm9yIGhhbmRsZXIgaW5zdGFsbGVkIC0gdHJ5aW5nIHRvIHJlYWQgZnJvbSBBOiBkcml2ZS4uLlxuIik7Ci0gICAgZiA9IGZvcGVuKCJhOlxib2cuYm9nIiwicmIiKTsKLSAgICBpZiAoZikgZmNsb3NlKGYpOwotICAgIGlmIChjcml0aWNhbEVycm9yKSB7Ci0JcHJpbnRmKCJDcml0aWNhbCBlcnJvciBvY2N1cmVkIG9uIElOVCAyMWggZnVuY3Rpb24gJTAyWCFcbiIsCi0JICAgIGF4VmFsdWUgPj4gOCk7Ci0JfQotICAgIGVsc2UKLQlwcmludGYoIkNyaXRpY2FsIGVycm9yIHdhcyBub3QgY2F1Z2h0IVxuIik7Ci0gICAgUE1fcmVzdG9yZUNyaXRpY2FsSGFuZGxlcigpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvYmlvc3B0ci5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvYmlvc3B0ci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmEzMzgyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2Jpb3NwdHIuYworKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIGFueQotKgotKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSB0byBjaGVjayB0aGUgYWJpbGl0eSB0byBtYW5pcHVsYXRlIHRoZQotKiAgICAgICAgICAgICAgIEJJT1MgZGF0YSBhcmVhIGZyb20gcHJvdGVjdGVkIG1vZGUgdXNpbmcgdGhlIFBNCi0qICAgICAgICAgICAgICAgbGlicmFyeS4gQ29tcGlsZSBhbmQgbGluayB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjb21tYW5kCi0qICAgICAgICAgICAgICAgbGluZSBmb3IgeW91ciBET1MgZXh0ZW5kZXIuCi0qCi0qICAgICAgICAgICAgICAgRnVuY3Rpb25zIHRlc3RlZDogICBQTV9nZXRCSU9TU2VsZWN0b3IoKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fZ2V0TG9uZygpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9nZXRCeXRlKCkKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX2dldFdvcmQoKQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAicG1hcGkuaCIKLQotLyogTWFjcm9zIHRvIG9idGFpbiB2YWx1ZXMgZnJvbSB0aGUgQklPUyBkYXRhIGFyZWEgKi8KLQotI2RlZmluZSBUSUNLUygpICAgICBQTV9nZXRMb25nKGJpb3MrMHg2QykKLSNkZWZpbmUgS0JfU1RBVCAgICAgUE1fZ2V0Qnl0ZShiaW9zKzB4MTcpCi0jZGVmaW5lIEtCX0hFQUQgICAgIFBNX2dldFdvcmQoYmlvcysweDFBKQotI2RlZmluZSBLQl9UQUlMICAgICBQTV9nZXRXb3JkKGJpb3MrMHgxQykKLQotLyogTWFjcm9zIGZvciB3b3JraW5nIHdpdGggdGhlIGtleWJvYXJkIGJ1ZmZlciAqLwotCi0jZGVmaW5lIEtCX0hJVCgpICAgIChLQl9IRUFEICE9IEtCX1RBSUwpCi0jZGVmaW5lIENUUkwoKSAgICAgIChLQl9TVEFUICYgNCkKLSNkZWZpbmUgU0hJRlQoKSAgICAgKEtCX1NUQVQgJiAyKQotI2RlZmluZSBFU0MgICAgICAgICAweDFCCi0KLS8qIFNlbGVjdG9yIGZvciBCSU9TIGRhdGEgYXJlYSAqLwotCi11Y2hhciAqYmlvczsKLQotaW50IG1haW4odm9pZCkKLXsKLSAgICBpbnQgYyxkb25lID0gMDsKLQotICAgIHByaW50ZigiUHJvZ3JhbSBydW5uaW5nIGluICIpOwotICAgIHN3aXRjaCAoUE1fZ2V0TW9kZVR5cGUoKSkgewotCWNhc2UgUE1fcmVhbE1vZGU6Ci0JICAgIHByaW50ZigicmVhbCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8yODY6Ci0JICAgIHByaW50ZigiMTYgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8zODY6Ci0JICAgIHByaW50ZigiMzIgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgYmlvcyA9IFBNX2dldEJJT1NQb2ludGVyKCk7Ci0gICAgcHJpbnRmKCJIaXQgYW55IGtleSB0byB0ZXN0LCBDdHJsLVNoaWZ0LUVzYyB0byBxdWl0XG4iKTsKLSAgICB3aGlsZSAoIWRvbmUpIHsKLQlpZiAoS0JfSElUKCkpIHsKLQkgICAgYyA9IFBNX2dldGNoKCk7Ci0JICAgIGlmIChjID09IDApIFBNX2dldGNoKCk7Ci0JICAgIHByaW50ZigiVElNRT0lLThsWCBTVD0lMDJYIENIQVI9JTAyWCAiLCBUSUNLUygpLCBLQl9TVEFULCBjKTsKLQkgICAgcHJpbnRmKCJcbiIpOwotCSAgICBpZiAoKGMgPT0gRVNDKSAmJiBTSElGVCgpICYmIENUUkwoKSkvKiBDdHJsLVNoaWZ0LUVzYyAqLwotCQlicmVhazsKLQkgICAgfQotCX0KLQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvYmxvY2suYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2Jsb2NrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZDUwM2MuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvYmxvY2suYworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSBmb3IgdGhlIFBNX2Jsb2NrVW50aWxUaW1lb3V0IGZ1bmN0aW9uLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAicG1hcGkuaCIKLQotI2RlZmluZSBERUxBWV9NU0VDUyAxMTAwCi0jZGVmaW5lIExPT1BTICAgICAgIDUKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogVGhlIGZvbGxvd2luZyByb3V0aW5lIHRha2VzIGEgbG9uZyBjb3VudCBpbiBtaWNyb3NlY29uZHMgYW5kIG91dHB1dHMKLSAqIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY291bnQgaW4gc2Vjb25kcy4gSXQgY291bGQgYmUgbW9kaWZpZWQgdG8KLSAqIHJldHVybiBhIHBvaW50ZXIgdG8gYSBzdGF0aWMgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY291bnQgcmF0aGVyCi0gKiB0aGFuIHByaW50aW5nIGl0IG91dC4KLSAqLwotCi12b2lkIFJlcG9ydFRpbWUodWxvbmcgY291bnQpCi17Ci0gICAgdWxvbmcgICBzZWNzOwotCi0gICAgc2VjcyA9IGNvdW50IC8gMTAwMDAwMEw7Ci0gICAgY291bnQgPSBjb3VudCAtIHNlY3MgKiAxMDAwMDAwTDsKLSAgICBwcmludGYoIlRpbWUgdGFrZW46ICVsdS4lMDZsdSBzZWNvbmRzXG4iLHNlY3MsY291bnQpOwotfQotCi1pbnQgbWFpbih2b2lkKQotewotICAgIGludCBpOwotCi0gICAgcHJpbnRmKCJEZXRlY3RpbmcgcHJvY2Vzc29yIGluZm9ybWF0aW9uIC4uLiIpOwotICAgIGZmbHVzaChzdGRvdXQpOwotICAgIHByaW50ZigiXG5cbiVzXG4iLCBDUFVfZ2V0UHJvY2Vzc29yTmFtZSgpKTsKLSAgICBaVGltZXJJbml0KCk7Ci0gICAgTFpUaW1lck9uKCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IExPT1BTOyBpKyspIHsKLQlQTV9ibG9ja1VudGlsVGltZW91dChERUxBWV9NU0VDUyk7Ci0JUmVwb3J0VGltZShMWlRpbWVyTGFwKCkpOwotCX0KLSAgICBMWlRpbWVyT2ZmKCk7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9icmsuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2Jyay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGI2NDQ2Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2Jyay5jCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgYW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGVzdCBwcm9ncmFtIHRvIGNoZWNrIHRoZSBhYmlsaXR5IHRvIGluc3RhbGwgYSBDIGJhc2VkCi0qICAgICAgICAgICAgICAgY29udHJvbCBDL2JyZWFrIGludGVycnVwdCBoYW5kbGVyLgotKgotKiAgICAgICAgICAgICAgIEZ1bmN0aW9ucyB0ZXN0ZWQ6ICAgUE1faW5zdGFsbEJyZWFrSGFuZGxlcigpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9jdHJsQ0hpdCgpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9jdHJsQnJlYWtIaXQoKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fcmVzdG9yZUJyZWFrSGFuZGxlcigpCi0qCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJwbWFwaS5oIgotCi1pbnQgbWFpbih2b2lkKQotewotICAgIHByaW50ZigiUHJvZ3JhbSBydW5uaW5nIGluICIpOwotICAgIHN3aXRjaCAoUE1fZ2V0TW9kZVR5cGUoKSkgewotCWNhc2UgUE1fcmVhbE1vZGU6Ci0JICAgIHByaW50ZigicmVhbCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8yODY6Ci0JICAgIHByaW50ZigiMTYgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8zODY6Ci0JICAgIHByaW50ZigiMzIgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgUE1faW5zdGFsbEJyZWFrSGFuZGxlcigpOwotICAgIHByaW50ZigiQ29udHJvbCBDL0JyZWFrIGludGVycnVwdCBoYW5kbGVyIGluc3RhbGxlZFxuIik7Ci0gICAgd2hpbGUgKDEpIHsKLQlpZiAoUE1fY3RybENIaXQoMSkpIHsKLQkgICAgcHJpbnRmKCJDb2RlIHRlcm1pbWF0ZWQgd2l0aCBDdHJsLUMuXG4iKTsKLQkgICAgYnJlYWs7Ci0JICAgIH0KLQlpZiAoUE1fY3RybEJyZWFrSGl0KDEpKSB7Ci0JICAgIHByaW50ZigiQ29kZSB0ZXJtaW1hdGVkIHdpdGggQ3RybC1CcmVhay5cbiIpOwotCSAgICBicmVhazsKLQkgICAgfQotCWlmIChQTV9rYmhpdCgpICYmIFBNX2dldGNoKCkgPT0gMHgxQikgewotCSAgICBwcmludGYoIk5vIGJyZWFrIGNvZGUgZGV0ZWN0ZWQhXG4iKTsKLQkgICAgYnJlYWs7Ci0JICAgIH0KLQlwcmludGYoIkhpdCBDdHJsLUMgb3IgQ3RybC1CcmVhayB0byBleGl0IVxuIik7Ci0JfQotCi0gICAgUE1fcmVzdG9yZUJyZWFrSGFuZGxlcigpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvY2FsbHJlYWwuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2NhbGxyZWFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMzdjYWIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvY2FsbHJlYWwuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBhbnkKLSoKLSogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gdG8gY2hlY2sgdGhlIGFiaWxpdHkgdG8gY2FsbCBhIHJlYWwgbW9kZQotKiAgICAgICAgICAgICAgIHByb2NlZHVyZS4gV2Ugc2ltcGx5IGNvcHkgYSB0ZXJyaWJseSBzaW1wbGUgYXNzZW1ibHkKLSogICAgICAgICAgICAgICBsYW5ndWFnZSByb3V0aW5lIGludG8gYSByZWFsIG1vZGUgYmxvY2sgdGhhdCB3ZSBhbGxvY2F0ZSwKLSogICAgICAgICAgICAgICBhbmQgdGhlbiBhdHRlbXB0IHRvIGNhbGwgdGhlIHJvdXRpbmUgYW5kIHZlcmlmeSB0aGF0IGl0Ci0qICAgICAgICAgICAgICAgd2FzIHN1Y2Nlc3NmdWwuCi0qCi0qICAgICAgICAgICAgICAgRnVuY3Rpb25zIHRlc3RlZDogICBQTV9hbGxvY1JlYWxTZWcoKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fZnJlZVJlYWxTZWcoKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fY2FsbFJlYWxNb2RlKCkKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgInBtYXBpLmgiCi0KLS8qIEJsb2NrIG9mIHJlYWwgbW9kZSBjb2RlIHdlIHdpbGwgZXZlbnR1YWxseSBjYWxsICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHJlYWxNb2RlQ29kZVtdID0gewotICAgIDB4OTMsICAgICAgICAgICAvKiAgeGNoZyAgICBheCxieCAgICovCi0gICAgMHg4NywgMHhDQSwgICAgIC8qICB4Y2hnICAgIGN4LGR4ICAgKi8KLSAgICAweENCICAgICAgICAgICAgLyogIHJldGYgICAgICAgICAgICAqLwotICAgIH07Ci0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgUk1SRUdTICAgICAgICAgIHJlZ3M7Ci0gICAgUk1TUkVHUyAgICAgICAgIHNyZWdzOwotICAgIHVjaGFyICAgICAgICAgICAqcDsKLSAgICB1bnNpZ25lZCAgICAgICAgcl9zZWcscl9vZmY7Ci0KLSAgICBwcmludGYoIlByb2dyYW0gcnVubmluZyBpbiAiKTsKLSAgICBzd2l0Y2ggKFBNX2dldE1vZGVUeXBlKCkpIHsKLQljYXNlIFBNX3JlYWxNb2RlOgotCSAgICBwcmludGYoInJlYWwgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMjg2OgotCSAgICBwcmludGYoIjE2IGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMzg2OgotCSAgICBwcmludGYoIjMyIGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCX0KLQotICAgIC8qIEFsbG9jYXRlIGEgdGhlIGJsb2NrIG9mIHJlYWwgbW9kZSBtZW1vcnkgKi8KLSAgICBpZiAoKHAgPSBQTV9hbGxvY1JlYWxTZWcoc2l6ZW9mKHJlYWxNb2RlQ29kZSksICZyX3NlZywgJnJfb2ZmKSkgPT0gTlVMTCkgewotCXByaW50ZigiVW5hYmxlIHRvIGFsbG9jYXRlIHJlYWwgbW9kZSBtZW1vcnkhXG4iKTsKLQlleGl0KDEpOwotCX0KLQotICAgIC8qIENvcHkgdGhlIHJlYWwgbW9kZSBjb2RlICovCi0gICAgbWVtY3B5KHAscmVhbE1vZGVDb2RlLHNpemVvZihyZWFsTW9kZUNvZGUpKTsKLQotICAgIC8qIE5vdyBjYWxsIHRoZSByZWFsIG1vZGUgY29kZSAqLwotICAgIHJlZ3MueC5heCA9IDE7Ci0gICAgcmVncy54LmJ4ID0gMjsKLSAgICByZWdzLnguY3ggPSAzOwotICAgIHJlZ3MueC5keCA9IDQ7Ci0gICAgcmVncy54LnNpID0gNTsKLSAgICByZWdzLnguZGkgPSA2OwotICAgIHNyZWdzLmVzID0gNzsKLSAgICBzcmVncy5kcyA9IDg7Ci0gICAgUE1fY2FsbFJlYWxNb2RlKHJfc2VnLHJfb2ZmLCZyZWdzLCZzcmVncyk7Ci0gICAgaWYgKHJlZ3MueC5heCAhPSAyIHx8IHJlZ3MueC5ieCAhPSAxIHx8IHJlZ3MueC5jeCAhPSA0IHx8IHJlZ3MueC5keCAhPSAzCi0JICAgIHx8IHJlZ3MueC5zaSAhPSA1IHx8IHJlZ3MueC5kaSAhPSA2IHx8IHNyZWdzLmVzICE9IDcKLQkgICAgfHwgc3JlZ3MuZHMgIT0gOCkgewotCXByaW50ZigiUmVhbCBtb2RlIGNhbGwgZmFpbGVkIVxuIik7Ci0JcHJpbnRmKCJcbiIpOwotCXByaW50ZigiYXggPSAlMDRYLCBieCA9ICUwNFgsIGN4ID0gJTA0WCwgZHggPSAlMDRYXG4iLAotCSAgICByZWdzLnguYXgscmVncy54LmJ4LHJlZ3MueC5jeCxyZWdzLnguZHgpOwotCXByaW50Zigic2kgPSAlMDRYLCBkaSA9ICUwNFgsIGVzID0gJTA0WCwgZHMgPSAlMDRYXG4iLAotCSAgICByZWdzLnguc2kscmVncy54LmRpLHNyZWdzLmVzLHNyZWdzLmRzKTsKLQl9Ci0gICAgZWxzZQotCXByaW50ZigiUmVhbCBtb2RlIGNhbGwgc3VjY2VlZGVkIVxuIik7Ci0KLSAgICAvKiBGcmVlIHRoZSBtZW1vcnkgd2UgYWxsb2NhdGVkICovCi0gICAgUE1fZnJlZVJlYWxTZWcocCk7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9jaGVja3MuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2NoZWNrcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTMzYWM5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2NoZWNrcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIE1haW4gbW9kdWxlIGZvciBidWlsZGluZyBjaGVja2VkIGJ1aWxkcyBvZiBwcm9kdWN0cyB3aXRoCi0qICAgICAgICAgICAgICAgYXNzZXJ0aW9ucyBhbmQgdHJhY2UgY29kZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJzY2l0ZWNoLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpZmRlZiAgX19XSU5ET1dTX18KLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2RlZmluZSBTVFJJQ1QKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZW5kaWYKLQotI2lmZGVmICBDSEVDS0VECi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgTE9HRklMRSAiXFxzY2l0ZWNoLmxvZyIKLQotdm9pZCAoKl9DSEtfZmFpbCkoaW50IGZhdGFsLGNvbnN0IGNoYXIgKm1zZyxjb25zdCBjaGFyICpjb25kLGNvbnN0IGNoYXIgKmZpbGUsaW50IGxpbmUpID0gX0NIS19kZWZhdWx0RmFpbDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotSGFuZGxlcyBmYXRhbCBlcnJvciBhbmQgd2FybmluZyBjb25kaXRpb25zIGZvciBjaGVja2VkIGJ1aWxkcy4KLQotSEVBREVSOgotc2NpdGVjaC5oCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciBhbiBpbmxpbmUgY2hlY2sgb3Igd2FybmluZyBmYWlscyBpbiBhbnkKLW9mIHRoZSBTY2lUZWNoIHJ1bnRpbWUgbGlicmFyaWVzLiBXYXJuaW5nIGNvbmRpdGlvbnMgc2ltcGx5IGNhdXNlIHRoZQotY29uZGl0aW9uIHRvIGJlIGxvZ2dlZCB0byB0aGUgbG9nIGZpbGUgYW5kIHNlbmQgdG8gdGhlIHN5c3RlbSBkZWJ1Z2dlcgotdW5kZXIgV2luZG93LiBGYXRhbCBlcnJvciBjb25kaXRpb25zIGRvIGFsbCBvZiB0aGUgYWJvdmUsIGFuZCB0aGVuCi10ZXJtaW5hdGUgdGhlIHByb2dyYW0gd2l0aCBhIGZhdGFsIGVycm9yIGNvbmRpdGlvbnMuCi0KLVRoaXMgaGFuZGxlciBtYXkgYmUgb3ZlcnJpZGVuIGJ5IHRoZSB1c2VyIGNvZGUgaWYgbmVjZXNzYXJ5IHRvIHJlcGxhY2UgaXQKLXdpdGggYSBkaWZmZXJlbnQgaGFuZGxlciAodGhlIE1HTCBmb3IgaW5zdGFuY2Ugb3ZlcnJpZGVzIHRoaXMgYW5kIHJlcGxhY2VzCi1pdCB3aXRoIGEgaGFuZGxlciB0aGF0IGRvZXMgYW4gTUdMX2V4aXQoKSBiZWZvcmUgdGVybWluYXRpbmcgdGhlIGFwcGxpY2F0aW9uCi1zbyB0aGF0IGl0IHdpbGwgY2xlYW4gdXAgY29ycmVjdGx5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0NIS19kZWZhdWx0RmFpbCgKLSAgICBpbnQgZmF0YWwsCi0gICAgY29uc3QgY2hhciAqbXNnLAotICAgIGNvbnN0IGNoYXIgKmNvbmQsCi0gICAgY29uc3QgY2hhciAqZmlsZSwKLSAgICBpbnQgbGluZSkKLXsKLSAgICBjaGFyICAgIGJ1ZlsyNTZdOwotICAgIEZJTEUgICAgKmxvZyA9IGZvcGVuKExPR0ZJTEUsICJhdCsiKTsKLQotICAgIHNwcmludGYoYnVmLG1zZyxjb25kLGZpbGUsbGluZSk7Ci0gICAgaWYgKGxvZykgewotCWZwdXRzKGJ1Zixsb2cpOwotCWZmbHVzaChsb2cpOwotCWZjbG9zZShsb2cpOwotI2lmZGVmICBfX1dJTkRPV1NfXwotCU91dHB1dERlYnVnU3RyKGJ1Zik7Ci0jZW5kaWYKLQl9Ci0gICAgaWYgKGZhdGFsKSB7Ci0jaWZkZWYgIF9fV0lORE9XU19fCi0JTWVzc2FnZUJveChOVUxMLCBidWYsIkZhdGFsIEVycm9yISIsTUJfSUNPTkVYQ0xBTUFUSU9OKTsKLSNlbHNlCi0JZnB1dHMoYnVmLHN0ZGVycik7Ci0jZW5kaWYKLQlleGl0KC0xKTsKLQl9Ci19Ci0KLSNlbmRpZiAgLyogQ0hFQ0tFRCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvY3B1LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9jcHUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBlNWRkMy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9jcHUuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSBmb3IgdGhlIENQVSBkZXRlY3Rpb24gY29kZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJ6dGltZXIuaCIKLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgcHJpbnRmKCJEZXRlY3RpbmcgcHJvY2Vzc29yIGluZm9ybWF0aW9uIC4uLiIpOwotICAgIGZmbHVzaChzdGRvdXQpOwotICAgIHByaW50ZigiXG5cbiVzXG4iLCBDUFVfZ2V0UHJvY2Vzc29yTmFtZSgpKTsKLSAgICBpZiAoQ1BVX2hhdmVSRFRTQygpKQotCXByaW50ZigiXG5Qcm9jZXNzb3Igc3VwcG9ydHMgUmVhZCBUaW1lIFN0YW1wIENvdW50ZXIgcGVyZm9ybWFuY2UgdGltZXIuXG4iKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2NyaXRpY2FsLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9jcml0aWNhbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGYxMjUxLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2NyaXRpY2FsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBhbnkKLSoKLSogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gdG8gY2hlY2sgdGhlIGFiaWxpdHkgdG8gaW5zdGFsbCBhIEMgYmFzZWQKLSogICAgICAgICAgICAgICBjcml0aWNhbCBlcnJvciBoYW5kbGVyLgotKgotKiAgICAgICAgICAgICAgIEZ1bmN0aW9ucyB0ZXN0ZWQ6ICAgUE1faW5zdGFsbEFsdENyaXRpY2FsSGFuZGxlcigpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9yZXN0b3JlQ3JpdGljYWxIYW5kbGVyKCkKLSoKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInBtYXBpLmgiCi0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgRklMRSAgICAqZjsKLSAgICBpbnQgICAgIGF4Y29kZSxkaWNvZGU7Ci0KLSAgICBwcmludGYoIlByb2dyYW0gcnVubmluZyBpbiAiKTsKLSAgICBzd2l0Y2ggKFBNX2dldE1vZGVUeXBlKCkpIHsKLQljYXNlIFBNX3JlYWxNb2RlOgotCSAgICBwcmludGYoInJlYWwgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMjg2OgotCSAgICBwcmludGYoIjE2IGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMzg2OgotCSAgICBwcmludGYoIjMyIGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCX0KLQotICAgIFBNX2luc3RhbGxDcml0aWNhbEhhbmRsZXIoKTsKLSAgICBwcmludGYoIkNyaXRpY2FsIEVycm9yIGhhbmRsZXIgaW5zdGFsbGVkIC0gdHJ5aW5nIHRvIHJlYWQgZnJvbSBBOiBkcml2ZS4uLlxuIik7Ci0gICAgZiA9IGZvcGVuKCJhOlxib2cuYm9nIiwicmIiKTsKLSAgICBpZiAoZikgZmNsb3NlKGYpOwotICAgIGlmIChQTV9jcml0aWNhbEVycm9yKCZheGNvZGUsJmRpY29kZSwxKSkgewotCXByaW50ZigiQ3JpdGljYWwgZXJyb3Igb2NjdXJlZCBvbiBJTlQgMjFoIGZ1bmN0aW9uICUwMlghXG4iLAotCSAgICBheGNvZGUgPj4gOCk7Ci0JfQotICAgIGVsc2UgcHJpbnRmKCJDcml0aWNhbCBlcnJvciB3YXMgbm90IGNhdWdodCFcbiIpOwotICAgIFBNX3Jlc3RvcmVDcml0aWNhbEhhbmRsZXIoKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2dldGNoLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9nZXRjaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmMyMTgwLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2dldGNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGVzdCBwcm9ncmFtIHRvIHRlc3Qgb3V0IHRoZSBjcm9zcyBwbGF0Zm9ybSBldmVudCBoYW5kbGluZwotKiAgICAgICAgICAgICAgIGxpYnJhcnkuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAiZXZlbnQuaCIKLQotLyogVHJhbnNsYXRpb24gdGFibGUgZm9yIGtleSBjb2RlcyAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50ICAgICBjb2RlOwotICAgIGNoYXIgICAgKm5hbWU7Ci0gICAgfSBLZXlFbnRyeTsKLQotS2V5RW50cnkgQVNDSUlDb2Rlc1tdID0gewotICAgIHtBU0NJSV9jdHJsQSAgICAgICAgICAgICwiQVNDSUlfY3RybEEifSwKLSAgICB7QVNDSUlfY3RybEIgICAgICAgICAgICAsIkFTQ0lJX2N0cmxCIn0sCi0gICAge0FTQ0lJX2N0cmxDICAgICAgICAgICAgLCJBU0NJSV9jdHJsQyJ9LAotICAgIHtBU0NJSV9jdHJsRCAgICAgICAgICAgICwiQVNDSUlfY3RybEQifSwKLSAgICB7QVNDSUlfY3RybEUgICAgICAgICAgICAsIkFTQ0lJX2N0cmxFIn0sCi0gICAge0FTQ0lJX2N0cmxGICAgICAgICAgICAgLCJBU0NJSV9jdHJsRiJ9LAotICAgIHtBU0NJSV9jdHJsRyAgICAgICAgICAgICwiQVNDSUlfY3RybEcifSwKLSAgICB7QVNDSUlfYmFja3NwYWNlICAgICAgICAsIkFTQ0lJX2JhY2tzcGFjZSJ9LAotICAgIHtBU0NJSV9jdHJsSCAgICAgICAgICAgICwiQVNDSUlfY3RybEgifSwKLSAgICB7QVNDSUlfdGFiICAgICAgICAgICAgICAsIkFTQ0lJX3RhYiJ9LAotICAgIHtBU0NJSV9jdHJsSSAgICAgICAgICAgICwiQVNDSUlfY3RybEkifSwKLSAgICB7QVNDSUlfY3RybEogICAgICAgICAgICAsIkFTQ0lJX2N0cmxKIn0sCi0gICAge0FTQ0lJX2N0cmxLICAgICAgICAgICAgLCJBU0NJSV9jdHJsSyJ9LAotICAgIHtBU0NJSV9jdHJsTCAgICAgICAgICAgICwiQVNDSUlfY3RybEwifSwKLSAgICB7QVNDSUlfZW50ZXIgICAgICAgICAgICAsIkFTQ0lJX2VudGVyIn0sCi0gICAge0FTQ0lJX2N0cmxNICAgICAgICAgICAgLCJBU0NJSV9jdHJsTSJ9LAotICAgIHtBU0NJSV9jdHJsTiAgICAgICAgICAgICwiQVNDSUlfY3RybE4ifSwKLSAgICB7QVNDSUlfY3RybE8gICAgICAgICAgICAsIkFTQ0lJX2N0cmxPIn0sCi0gICAge0FTQ0lJX2N0cmxQICAgICAgICAgICAgLCJBU0NJSV9jdHJsUCJ9LAotICAgIHtBU0NJSV9jdHJsUSAgICAgICAgICAgICwiQVNDSUlfY3RybFEifSwKLSAgICB7QVNDSUlfY3RybFIgICAgICAgICAgICAsIkFTQ0lJX2N0cmxSIn0sCi0gICAge0FTQ0lJX2N0cmxTICAgICAgICAgICAgLCJBU0NJSV9jdHJsUyJ9LAotICAgIHtBU0NJSV9jdHJsVCAgICAgICAgICAgICwiQVNDSUlfY3RybFQifSwKLSAgICB7QVNDSUlfY3RybFUgICAgICAgICAgICAsIkFTQ0lJX2N0cmxVIn0sCi0gICAge0FTQ0lJX2N0cmxWICAgICAgICAgICAgLCJBU0NJSV9jdHJsViJ9LAotICAgIHtBU0NJSV9jdHJsVyAgICAgICAgICAgICwiQVNDSUlfY3RybFcifSwKLSAgICB7QVNDSUlfY3RybFggICAgICAgICAgICAsIkFTQ0lJX2N0cmxYIn0sCi0gICAge0FTQ0lJX2N0cmxZICAgICAgICAgICAgLCJBU0NJSV9jdHJsWSJ9LAotICAgIHtBU0NJSV9jdHJsWiAgICAgICAgICAgICwiQVNDSUlfY3RybFoifSwKLSAgICB7QVNDSUlfZXNjICAgICAgICAgICAgICAsIkFTQ0lJX2VzYyJ9LAotICAgIHtBU0NJSV9zcGFjZSAgICAgICAgICAgICwiQVNDSUlfc3BhY2UifSwKLSAgICB7QVNDSUlfZXhjbGFtYXRpb24gICAgICAsIkFTQ0lJX2V4Y2xhbWF0aW9uIn0sCi0gICAge0FTQ0lJX3F1b3RlICAgICAgICAgICAgLCJBU0NJSV9xdW90ZSJ9LAotICAgIHtBU0NJSV9wb3VuZCAgICAgICAgICAgICwiQVNDSUlfcG91bmQifSwKLSAgICB7QVNDSUlfZG9sbGFyICAgICAgICAgICAsIkFTQ0lJX2RvbGxhciJ9LAotICAgIHtBU0NJSV9wZXJjZW50ICAgICAgICAgICwiQVNDSUlfcGVyY2VudCJ9LAotICAgIHtBU0NJSV9hbXBlcnNhbmQgICAgICAgICwiQVNDSUlfYW1wZXJzYW5kIn0sCi0gICAge0FTQ0lJX2Fwb3N0cm9waGUgICAgICAgLCJBU0NJSV9hcG9zdHJvcGhlIn0sCi0gICAge0FTQ0lJX2xlZnRCcmFjZSAgICAgICAgLCJBU0NJSV9sZWZ0QnJhY2UifSwKLSAgICB7QVNDSUlfcmlnaHRCcmFjZSAgICAgICAsIkFTQ0lJX3JpZ2h0QnJhY2UifSwKLSAgICB7QVNDSUlfdGltZXMgICAgICAgICAgICAsIkFTQ0lJX3RpbWVzIn0sCi0gICAge0FTQ0lJX3BsdXMgICAgICAgICAgICAgLCJBU0NJSV9wbHVzIn0sCi0gICAge0FTQ0lJX2NvbW1hICAgICAgICAgICAgLCJBU0NJSV9jb21tYSJ9LAotICAgIHtBU0NJSV9taW51cyAgICAgICAgICAgICwiQVNDSUlfbWludXMifSwKLSAgICB7QVNDSUlfcGVyaW9kICAgICAgICAgICAsIkFTQ0lJX3BlcmlvZCJ9LAotICAgIHtBU0NJSV9kaXZpZGUgICAgICAgICAgICwiQVNDSUlfZGl2aWRlIn0sCi0gICAge0FTQ0lJXzAgICAgICAgICAgICAgICAgLCJBU0NJSV8wIn0sCi0gICAge0FTQ0lJXzEgICAgICAgICAgICAgICAgLCJBU0NJSV8xIn0sCi0gICAge0FTQ0lJXzIgICAgICAgICAgICAgICAgLCJBU0NJSV8yIn0sCi0gICAge0FTQ0lJXzMgICAgICAgICAgICAgICAgLCJBU0NJSV8zIn0sCi0gICAge0FTQ0lJXzQgICAgICAgICAgICAgICAgLCJBU0NJSV80In0sCi0gICAge0FTQ0lJXzUgICAgICAgICAgICAgICAgLCJBU0NJSV81In0sCi0gICAge0FTQ0lJXzYgICAgICAgICAgICAgICAgLCJBU0NJSV82In0sCi0gICAge0FTQ0lJXzcgICAgICAgICAgICAgICAgLCJBU0NJSV83In0sCi0gICAge0FTQ0lJXzggICAgICAgICAgICAgICAgLCJBU0NJSV84In0sCi0gICAge0FTQ0lJXzkgICAgICAgICAgICAgICAgLCJBU0NJSV85In0sCi0gICAge0FTQ0lJX2NvbG9uICAgICAgICAgICAgLCJBU0NJSV9jb2xvbiJ9LAotICAgIHtBU0NJSV9zZW1pY29sb24gICAgICAgICwiQVNDSUlfc2VtaWNvbG9uIn0sCi0gICAge0FTQ0lJX2xlc3NUaGFuICAgICAgICAgLCJBU0NJSV9sZXNzVGhhbiJ9LAotICAgIHtBU0NJSV9lcXVhbHMgICAgICAgICAgICwiQVNDSUlfZXF1YWxzIn0sCi0gICAge0FTQ0lJX2dyZWF0ZXJUaGFuICAgICAgLCJBU0NJSV9ncmVhdGVyVGhhbiJ9LAotICAgIHtBU0NJSV9xdWVzdGlvbiAgICAgICAgICwiQVNDSUlfcXVlc3Rpb24ifSwKLSAgICB7QVNDSUlfYXQgICAgICAgICAgICAgICAsIkFTQ0lJX2F0In0sCi0gICAge0FTQ0lJX0EgICAgICAgICAgICAgICAgLCJBU0NJSV9BIn0sCi0gICAge0FTQ0lJX0IgICAgICAgICAgICAgICAgLCJBU0NJSV9CIn0sCi0gICAge0FTQ0lJX0MgICAgICAgICAgICAgICAgLCJBU0NJSV9DIn0sCi0gICAge0FTQ0lJX0QgICAgICAgICAgICAgICAgLCJBU0NJSV9EIn0sCi0gICAge0FTQ0lJX0UgICAgICAgICAgICAgICAgLCJBU0NJSV9FIn0sCi0gICAge0FTQ0lJX0YgICAgICAgICAgICAgICAgLCJBU0NJSV9GIn0sCi0gICAge0FTQ0lJX0cgICAgICAgICAgICAgICAgLCJBU0NJSV9HIn0sCi0gICAge0FTQ0lJX0ggICAgICAgICAgICAgICAgLCJBU0NJSV9IIn0sCi0gICAge0FTQ0lJX0kgICAgICAgICAgICAgICAgLCJBU0NJSV9JIn0sCi0gICAge0FTQ0lJX0ogICAgICAgICAgICAgICAgLCJBU0NJSV9KIn0sCi0gICAge0FTQ0lJX0sgICAgICAgICAgICAgICAgLCJBU0NJSV9LIn0sCi0gICAge0FTQ0lJX0wgICAgICAgICAgICAgICAgLCJBU0NJSV9MIn0sCi0gICAge0FTQ0lJX00gICAgICAgICAgICAgICAgLCJBU0NJSV9NIn0sCi0gICAge0FTQ0lJX04gICAgICAgICAgICAgICAgLCJBU0NJSV9OIn0sCi0gICAge0FTQ0lJX08gICAgICAgICAgICAgICAgLCJBU0NJSV9PIn0sCi0gICAge0FTQ0lJX1AgICAgICAgICAgICAgICAgLCJBU0NJSV9QIn0sCi0gICAge0FTQ0lJX1EgICAgICAgICAgICAgICAgLCJBU0NJSV9RIn0sCi0gICAge0FTQ0lJX1IgICAgICAgICAgICAgICAgLCJBU0NJSV9SIn0sCi0gICAge0FTQ0lJX1MgICAgICAgICAgICAgICAgLCJBU0NJSV9TIn0sCi0gICAge0FTQ0lJX1QgICAgICAgICAgICAgICAgLCJBU0NJSV9UIn0sCi0gICAge0FTQ0lJX1UgICAgICAgICAgICAgICAgLCJBU0NJSV9VIn0sCi0gICAge0FTQ0lJX1YgICAgICAgICAgICAgICAgLCJBU0NJSV9WIn0sCi0gICAge0FTQ0lJX1cgICAgICAgICAgICAgICAgLCJBU0NJSV9XIn0sCi0gICAge0FTQ0lJX1ggICAgICAgICAgICAgICAgLCJBU0NJSV9YIn0sCi0gICAge0FTQ0lJX1kgICAgICAgICAgICAgICAgLCJBU0NJSV9ZIn0sCi0gICAge0FTQ0lJX1ogICAgICAgICAgICAgICAgLCJBU0NJSV9aIn0sCi0gICAge0FTQ0lJX2xlZnRTcXVhcmVCcmFjZSAgLCJBU0NJSV9sZWZ0U3F1YXJlQnJhY2UifSwKLSAgICB7QVNDSUlfYmFja1NsYXNoICAgICAgICAsIkFTQ0lJX2JhY2tTbGFzaCJ9LAotICAgIHtBU0NJSV9yaWdodFNxdWFyZUJyYWNlICwiQVNDSUlfcmlnaHRTcXVhcmVCcmFjZSJ9LAotICAgIHtBU0NJSV9jYXJldCAgICAgICAgICAgICwiQVNDSUlfY2FyZXQifSwKLSAgICB7QVNDSUlfdW5kZXJzY29yZSAgICAgICAsIkFTQ0lJX3VuZGVyc2NvcmUifSwKLSAgICB7QVNDSUlfbGVmdEFwb3N0cm9waGUgICAsIkFTQ0lJX2xlZnRBcG9zdHJvcGhlIn0sCi0gICAge0FTQ0lJX2EgICAgICAgICAgICAgICAgLCJBU0NJSV9hIn0sCi0gICAge0FTQ0lJX2IgICAgICAgICAgICAgICAgLCJBU0NJSV9iIn0sCi0gICAge0FTQ0lJX2MgICAgICAgICAgICAgICAgLCJBU0NJSV9jIn0sCi0gICAge0FTQ0lJX2QgICAgICAgICAgICAgICAgLCJBU0NJSV9kIn0sCi0gICAge0FTQ0lJX2UgICAgICAgICAgICAgICAgLCJBU0NJSV9lIn0sCi0gICAge0FTQ0lJX2YgICAgICAgICAgICAgICAgLCJBU0NJSV9mIn0sCi0gICAge0FTQ0lJX2cgICAgICAgICAgICAgICAgLCJBU0NJSV9nIn0sCi0gICAge0FTQ0lJX2ggICAgICAgICAgICAgICAgLCJBU0NJSV9oIn0sCi0gICAge0FTQ0lJX2kgICAgICAgICAgICAgICAgLCJBU0NJSV9pIn0sCi0gICAge0FTQ0lJX2ogICAgICAgICAgICAgICAgLCJBU0NJSV9qIn0sCi0gICAge0FTQ0lJX2sgICAgICAgICAgICAgICAgLCJBU0NJSV9rIn0sCi0gICAge0FTQ0lJX2wgICAgICAgICAgICAgICAgLCJBU0NJSV9sIn0sCi0gICAge0FTQ0lJX20gICAgICAgICAgICAgICAgLCJBU0NJSV9tIn0sCi0gICAge0FTQ0lJX24gICAgICAgICAgICAgICAgLCJBU0NJSV9uIn0sCi0gICAge0FTQ0lJX28gICAgICAgICAgICAgICAgLCJBU0NJSV9vIn0sCi0gICAge0FTQ0lJX3AgICAgICAgICAgICAgICAgLCJBU0NJSV9wIn0sCi0gICAge0FTQ0lJX3EgICAgICAgICAgICAgICAgLCJBU0NJSV9xIn0sCi0gICAge0FTQ0lJX3IgICAgICAgICAgICAgICAgLCJBU0NJSV9yIn0sCi0gICAge0FTQ0lJX3MgICAgICAgICAgICAgICAgLCJBU0NJSV9zIn0sCi0gICAge0FTQ0lJX3QgICAgICAgICAgICAgICAgLCJBU0NJSV90In0sCi0gICAge0FTQ0lJX3UgICAgICAgICAgICAgICAgLCJBU0NJSV91In0sCi0gICAge0FTQ0lJX3YgICAgICAgICAgICAgICAgLCJBU0NJSV92In0sCi0gICAge0FTQ0lJX3cgICAgICAgICAgICAgICAgLCJBU0NJSV93In0sCi0gICAge0FTQ0lJX3ggICAgICAgICAgICAgICAgLCJBU0NJSV94In0sCi0gICAge0FTQ0lJX3kgICAgICAgICAgICAgICAgLCJBU0NJSV95In0sCi0gICAge0FTQ0lJX3ogICAgICAgICAgICAgICAgLCJBU0NJSV96In0sCi0gICAge0FTQ0lJX2xlZnRDdXJseUJyYWNlICAgLCJBU0NJSV9sZWZ0Q3VybHlCcmFjZSJ9LAotICAgIHtBU0NJSV92ZXJ0aWNhbEJhciAgICAgICwiQVNDSUlfdmVydGljYWxCYXIifSwKLSAgICB7QVNDSUlfcmlnaHRDdXJseUJyYWNlICAsIkFTQ0lJX3JpZ2h0Q3VybHlCcmFjZSJ9LAotICAgIHtBU0NJSV90aWxkZSAgICAgICAgICAgICwiQVNDSUlfdGlsZGUifSwKLSAgICB7MCAgICAgICAgICAgICAgICAgICAgICAsIkFTQ0lJX3Vua25vd24ifSwKLSAgICB9OwotCi1LZXlFbnRyeSBTY2FuQ29kZXNbXSA9IHsKLSAgICB7S0JfcGFkRW50ZXIgICAgICAgICAgICAsIktCX3BhZEVudGVyIn0sCi0gICAge0tCX3BhZE1pbnVzICAgICAgICAgICAgLCJLQl9wYWRNaW51cyJ9LAotICAgIHtLQl9wYWRQbHVzICAgICAgICAgICAgICwiS0JfcGFkUGx1cyJ9LAotICAgIHtLQl9wYWRUaW1lcyAgICAgICAgICAgICwiS0JfcGFkVGltZXMifSwKLSAgICB7S0JfcGFkRGl2aWRlICAgICAgICAgICAsIktCX3BhZERpdmlkZSJ9LAotICAgIHtLQl9wYWRMZWZ0ICAgICAgICAgICAgICwiS0JfcGFkTGVmdCJ9LAotICAgIHtLQl9wYWRSaWdodCAgICAgICAgICAgICwiS0JfcGFkUmlnaHQifSwKLSAgICB7S0JfcGFkVXAgICAgICAgICAgICAgICAsIktCX3BhZFVwIn0sCi0gICAge0tCX3BhZERvd24gICAgICAgICAgICAgLCJLQl9wYWREb3duIn0sCi0gICAge0tCX3BhZEluc2VydCAgICAgICAgICAgLCJLQl9wYWRJbnNlcnQifSwKLSAgICB7S0JfcGFkRGVsZXRlICAgICAgICAgICAsIktCX3BhZERlbGV0ZSJ9LAotICAgIHtLQl9wYWRIb21lICAgICAgICAgICAgICwiS0JfcGFkSG9tZSJ9LAotICAgIHtLQl9wYWRFbmQgICAgICAgICAgICAgICwiS0JfcGFkRW5kIn0sCi0gICAge0tCX3BhZFBhZ2VVcCAgICAgICAgICAgLCJLQl9wYWRQYWdlVXAifSwKLSAgICB7S0JfcGFkUGFnZURvd24gICAgICAgICAsIktCX3BhZFBhZ2VEb3duIn0sCi0gICAge0tCX3BhZENlbnRlciAgICAgICAgICAgLCJLQl9wYWRDZW50ZXIifSwKLSAgICB7S0JfRjEgICAgICAgICAgICAgICAgICAsIktCX0YxIn0sCi0gICAge0tCX0YyICAgICAgICAgICAgICAgICAgLCJLQl9GMiJ9LAotICAgIHtLQl9GMyAgICAgICAgICAgICAgICAgICwiS0JfRjMifSwKLSAgICB7S0JfRjQgICAgICAgICAgICAgICAgICAsIktCX0Y0In0sCi0gICAge0tCX0Y1ICAgICAgICAgICAgICAgICAgLCJLQl9GNSJ9LAotICAgIHtLQl9GNiAgICAgICAgICAgICAgICAgICwiS0JfRjYifSwKLSAgICB7S0JfRjcgICAgICAgICAgICAgICAgICAsIktCX0Y3In0sCi0gICAge0tCX0Y4ICAgICAgICAgICAgICAgICAgLCJLQl9GOCJ9LAotICAgIHtLQl9GOSAgICAgICAgICAgICAgICAgICwiS0JfRjkifSwKLSAgICB7S0JfRjEwICAgICAgICAgICAgICAgICAsIktCX0YxMCJ9LAotICAgIHtLQl9GMTEgICAgICAgICAgICAgICAgICwiS0JfRjExIn0sCi0gICAge0tCX0YxMiAgICAgICAgICAgICAgICAgLCJLQl9GMTIifSwKLSAgICB7S0JfbGVmdCAgICAgICAgICAgICAgICAsIktCX2xlZnQifSwKLSAgICB7S0JfcmlnaHQgICAgICAgICAgICAgICAsIktCX3JpZ2h0In0sCi0gICAge0tCX3VwICAgICAgICAgICAgICAgICAgLCJLQl91cCJ9LAotICAgIHtLQl9kb3duICAgICAgICAgICAgICAgICwiS0JfZG93biJ9LAotICAgIHtLQl9pbnNlcnQgICAgICAgICAgICAgICwiS0JfaW5zZXJ0In0sCi0gICAge0tCX2RlbGV0ZSAgICAgICAgICAgICAgLCJLQl9kZWxldGUifSwKLSAgICB7S0JfaG9tZSAgICAgICAgICAgICAgICAsIktCX2hvbWUifSwKLSAgICB7S0JfZW5kICAgICAgICAgICAgICAgICAsIktCX2VuZCJ9LAotICAgIHtLQl9wYWdlVXAgICAgICAgICAgICAgICwiS0JfcGFnZVVwIn0sCi0gICAge0tCX3BhZ2VEb3duICAgICAgICAgICAgLCJLQl9wYWdlRG93biJ9LAotICAgIHtLQl9jYXBzTG9jayAgICAgICAgICAgICwiS0JfY2Fwc0xvY2sifSwKLSAgICB7S0JfbnVtTG9jayAgICAgICAgICAgICAsIktCX251bUxvY2sifSwKLSAgICB7S0Jfc2Nyb2xsTG9jayAgICAgICAgICAsIktCX3Njcm9sbExvY2sifSwKLSAgICB7S0JfbGVmdFNoaWZ0ICAgICAgICAgICAsIktCX2xlZnRTaGlmdCJ9LAotICAgIHtLQl9yaWdodFNoaWZ0ICAgICAgICAgICwiS0JfcmlnaHRTaGlmdCJ9LAotICAgIHtLQl9sZWZ0Q3RybCAgICAgICAgICAgICwiS0JfbGVmdEN0cmwifSwKLSAgICB7S0JfcmlnaHRDdHJsICAgICAgICAgICAsIktCX3JpZ2h0Q3RybCJ9LAotICAgIHtLQl9sZWZ0QWx0ICAgICAgICAgICAgICwiS0JfbGVmdEFsdCJ9LAotICAgIHtLQl9yaWdodEFsdCAgICAgICAgICAgICwiS0JfcmlnaHRBbHQifSwKLSAgICB7S0JfbGVmdFdpbmRvd3MgICAgICAgICAsIktCX2xlZnRXaW5kb3dzIn0sCi0gICAge0tCX3JpZ2h0V2luZG93cyAgICAgICAgLCJLQl9yaWdodFdpbmRvd3MifSwKLSAgICB7S0JfbWVudSAgICAgICAgICAgICAgICAsIktCX21lbnUifSwKLSAgICB7S0Jfc3lzUmVxICAgICAgICAgICAgICAsIktCX3N5c1JlcSJ9LAotICAgIHtLQl9lc2MgICAgICAgICAgICAgICAgICwiS0JfZXNjIn0sCi0gICAge0tCXzEgICAgICAgICAgICAgICAgICAgLCJLQl8xIn0sCi0gICAge0tCXzIgICAgICAgICAgICAgICAgICAgLCJLQl8yIn0sCi0gICAge0tCXzMgICAgICAgICAgICAgICAgICAgLCJLQl8zIn0sCi0gICAge0tCXzQgICAgICAgICAgICAgICAgICAgLCJLQl80In0sCi0gICAge0tCXzUgICAgICAgICAgICAgICAgICAgLCJLQl81In0sCi0gICAge0tCXzYgICAgICAgICAgICAgICAgICAgLCJLQl82In0sCi0gICAge0tCXzcgICAgICAgICAgICAgICAgICAgLCJLQl83In0sCi0gICAge0tCXzggICAgICAgICAgICAgICAgICAgLCJLQl84In0sCi0gICAge0tCXzkgICAgICAgICAgICAgICAgICAgLCJLQl85In0sCi0gICAge0tCXzAgICAgICAgICAgICAgICAgICAgLCJLQl8wIn0sCi0gICAge0tCX21pbnVzICAgICAgICAgICAgICAgLCJLQl9taW51cyJ9LAotICAgIHtLQl9lcXVhbHMgICAgICAgICAgICAgICwiS0JfZXF1YWxzIn0sCi0gICAge0tCX2JhY2tTbGFzaCAgICAgICAgICAgLCJLQl9iYWNrU2xhc2gifSwKLSAgICB7S0JfYmFja3NwYWNlICAgICAgICAgICAsIktCX2JhY2tzcGFjZSJ9LAotICAgIHtLQl90YWIgICAgICAgICAgICAgICAgICwiS0JfdGFiIn0sCi0gICAge0tCX1EgICAgICAgICAgICAgICAgICAgLCJLQl9RIn0sCi0gICAge0tCX1cgICAgICAgICAgICAgICAgICAgLCJLQl9XIn0sCi0gICAge0tCX0UgICAgICAgICAgICAgICAgICAgLCJLQl9FIn0sCi0gICAge0tCX1IgICAgICAgICAgICAgICAgICAgLCJLQl9SIn0sCi0gICAge0tCX1QgICAgICAgICAgICAgICAgICAgLCJLQl9UIn0sCi0gICAge0tCX1kgICAgICAgICAgICAgICAgICAgLCJLQl9ZIn0sCi0gICAge0tCX1UgICAgICAgICAgICAgICAgICAgLCJLQl9VIn0sCi0gICAge0tCX0kgICAgICAgICAgICAgICAgICAgLCJLQl9JIn0sCi0gICAge0tCX08gICAgICAgICAgICAgICAgICAgLCJLQl9PIn0sCi0gICAge0tCX1AgICAgICAgICAgICAgICAgICAgLCJLQl9QIn0sCi0gICAge0tCX2xlZnRTcXVhcmVCcmFjZSAgICAgLCJLQl9sZWZ0U3F1YXJlQnJhY2UifSwKLSAgICB7S0JfcmlnaHRTcXVhcmVCcmFjZSAgICAsIktCX3JpZ2h0U3F1YXJlQnJhY2UifSwKLSAgICB7S0JfZW50ZXIgICAgICAgICAgICAgICAsIktCX2VudGVyIn0sCi0gICAge0tCX0EgICAgICAgICAgICAgICAgICAgLCJLQl9BIn0sCi0gICAge0tCX1MgICAgICAgICAgICAgICAgICAgLCJLQl9TIn0sCi0gICAge0tCX0QgICAgICAgICAgICAgICAgICAgLCJLQl9EIn0sCi0gICAge0tCX0YgICAgICAgICAgICAgICAgICAgLCJLQl9GIn0sCi0gICAge0tCX0cgICAgICAgICAgICAgICAgICAgLCJLQl9HIn0sCi0gICAge0tCX0ggICAgICAgICAgICAgICAgICAgLCJLQl9IIn0sCi0gICAge0tCX0ogICAgICAgICAgICAgICAgICAgLCJLQl9KIn0sCi0gICAge0tCX0sgICAgICAgICAgICAgICAgICAgLCJLQl9LIn0sCi0gICAge0tCX0wgICAgICAgICAgICAgICAgICAgLCJLQl9MIn0sCi0gICAge0tCX3NlbWljb2xvbiAgICAgICAgICAgLCJLQl9zZW1pY29sb24ifSwKLSAgICB7S0JfYXBvc3Ryb3BoZSAgICAgICAgICAsIktCX2Fwb3N0cm9waGUifSwKLSAgICB7S0JfWiAgICAgICAgICAgICAgICAgICAsIktCX1oifSwKLSAgICB7S0JfWCAgICAgICAgICAgICAgICAgICAsIktCX1gifSwKLSAgICB7S0JfQyAgICAgICAgICAgICAgICAgICAsIktCX0MifSwKLSAgICB7S0JfViAgICAgICAgICAgICAgICAgICAsIktCX1YifSwKLSAgICB7S0JfQiAgICAgICAgICAgICAgICAgICAsIktCX0IifSwKLSAgICB7S0JfTiAgICAgICAgICAgICAgICAgICAsIktCX04ifSwKLSAgICB7S0JfTSAgICAgICAgICAgICAgICAgICAsIktCX00ifSwKLSAgICB7S0JfY29tbWEgICAgICAgICAgICAgICAsIktCX2NvbW1hIn0sCi0gICAge0tCX3BlcmlvZCAgICAgICAgICAgICAgLCJLQl9wZXJpb2QifSwKLSAgICB7S0JfZGl2aWRlICAgICAgICAgICAgICAsIktCX2RpdmlkZSJ9LAotICAgIHtLQl9zcGFjZSAgICAgICAgICAgICAgICwiS0Jfc3BhY2UifSwKLSAgICB7S0JfdGlsZGUgICAgICAgICAgICAgICAsIktCX3RpbGRlIn0sCi0gICAgezAgICAgICAgICAgICAgICAgICAgICAgLCJLQl91bmtub3duIn0sCi0gICAgfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci14ICAgLSBYIGNvb3JkaW5hdGUgb2YgdGhlIG1vdXNlIGN1cnNvciBwb3NpdGlvbiAoc2NyZWVuIGNvb3JkaW5hdGVzKQoteSAgIC0gWSBjb29yZGluYXRlIG9mIHRoZSBtb3VzZSBjdXJzb3IgcG9zaXRpb24gKHNjcmVlbiBjb29yZGluYXRlcykKLQotUkVNQVJLUzoKLVRoaXMgZ2V0cyBjYWxsZWQgcGVyaW9kaWNhbGx5IHRvIG1vdmUgdGhlIG1vdXNlLiBJdCB3aWxsIGdldCBjYWxsZWQgd2hlbgotdGhlIG1vdXNlIG1heSBub3QgaGF2ZSBhY3R1YWxseSBtb3ZlZCwgc28gY2hlY2sgaWYgaXQgaGFzIGJlZm9yZSByZWRyYXdpbmcKLWl0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIG1vdmVNb3VzZSgKLSAgICBpbnQgeCwKLSAgICBpbnQgeSkKLXsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1jb2RlICAgIC0gQ29kZSB0byB0cmFuc2xhdGUKLWtleXMgICAgLSBUYWJsZSBvZiB0cmFuc2xhdGlvbiBrZXkgdmFsdWVzIHRvIGxvb2sgdXAKLQotUkVNQVJLUzoKLVNpbXBsZSBmdW5jdGlvbiB0byBsb29rIHVwIHRoZSBwcmludGFibGUgbmFtZSBmb3IgdGhlIGtleWJvYXJkIGNvZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotS2V5RW50cnkgKkZpbmRLZXkoCi0gICAgaW50IGNvZGUsCi0gICAgS2V5RW50cnkgKmtleXMpCi17Ci0gICAgS2V5RW50cnkgICAgKmtleTsKLQotICAgIGZvciAoa2V5ID0ga2V5czsga2V5LT5jb2RlICE9IDA7IGtleSsrKSB7Ci0JaWYgKGtleS0+Y29kZSA9PSBjb2RlKQotCSAgICBicmVhazsKLQl9Ci0gICAgcmV0dXJuIGtleTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1ldnQgLSBFdmVudCB0byBkaXNwbGF5IG1vZGlmaWVycyBmb3IKLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGRpc3BsYXkgc2hpZnQgbW9kaWZpZXJzIGZsYWdzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBEaXNwbGF5TW9kaWZpZXJzKAotICAgIGV2ZW50X3QgKmV2dCkKLXsKLSAgICBpZiAoZXZ0LT5tb2RpZmllcnMgJiBFVlRfTEVGVEJVVCkKLQlwcmludGYoIiwgTEJVVCIpOwotICAgIGlmIChldnQtPm1vZGlmaWVycyAmIEVWVF9SSUdIVEJVVCkKLQlwcmludGYoIiwgUkJVVCIpOwotICAgIGlmIChldnQtPm1vZGlmaWVycyAmIEVWVF9NSURETEVCVVQpCi0JcHJpbnRmKCIsIE1CVVQiKTsKLSAgICBpZiAoZXZ0LT5tb2RpZmllcnMgJiBFVlRfU0hJRlRLRVkpIHsKLQlpZiAoZXZ0LT5tb2RpZmllcnMgJiBFVlRfTEVGVFNISUZUKQotCSAgICBwcmludGYoIiwgTFNISUZUIik7Ci0JaWYgKGV2dC0+bW9kaWZpZXJzICYgRVZUX1JJR0hUU0hJRlQpCi0JICAgIHByaW50ZigiLCBSU0hJRlQiKTsKLQl9Ci0gICAgaWYgKGV2dC0+bW9kaWZpZXJzICYgRVZUX0NUUkxTVEFURSkgewotCWlmIChldnQtPm1vZGlmaWVycyAmIEVWVF9MRUZUQ1RSTCkKLQkgICAgcHJpbnRmKCIsIExDVFJMIik7Ci0JaWYgKGV2dC0+bW9kaWZpZXJzICYgRVZUX1JJR0hUQ1RSTCkKLQkgICAgcHJpbnRmKCIsIFJDVFJMIik7Ci0JfQotICAgIGlmIChldnQtPm1vZGlmaWVycyAmIEVWVF9BTFRTVEFURSkgewotCWlmIChldnQtPm1vZGlmaWVycyAmIEVWVF9MRUZUQUxUKQotCSAgICBwcmludGYoIiwgTEFMVCIpOwotCWlmIChldnQtPm1vZGlmaWVycyAmIEVWVF9SSUdIVEFMVCkKLQkgICAgcHJpbnRmKCIsIFJBTFQiKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotbXNnIC0gTWVzc2FnZSB0byBkaXNwbGF5IGZvciB0eXBlIG9mIGV2ZW50Ci1ldnQgLSBFdmVudCB0byBkaXNwbGF5Ci0KLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBkaXNwbGF5IHRoZSBzdGF0dXMgb2YgdGhlIGtleWJvYXJkIGV2ZW50IHRvIHRoZSBzY3JlZW4uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBEaXNwbGF5S2V5KAotICAgIGNoYXIgKm1zZywKLSAgICBldmVudF90ICpldnQpCi17Ci0gICAgS2V5RW50cnkgICAgKmFzY2lpLCpzY2FuOwotICAgIGNoYXIgICAgICAgIGNoID0gRVZUX2FzY2lpQ29kZShldnQtPm1lc3NhZ2UpOwotCi0gICAgYXNjaWkgPSBGaW5kS2V5KGNoLEFTQ0lJQ29kZXMpOwotICAgIHNjYW4gPSBGaW5kS2V5KEVWVF9zY2FuQ29kZShldnQtPm1lc3NhZ2UpLFNjYW5Db2Rlcyk7Ci0gICAgcHJpbnRmKCIlczogMHglMDRYIC0+ICVzLCAlcywgJyVjJyIsCi0JbXNnLCAoaW50KWV2dC0+bWVzc2FnZSAmIDB4RkZGRiwgc2Nhbi0+bmFtZSwgYXNjaWktPm5hbWUsIGlzcHJpbnQoY2gpID8gY2ggOiAnICcpOwotICAgIERpc3BsYXlNb2RpZmllcnMoZXZ0KTsKLSAgICBwcmludGYoIlxuIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotbXNnIC0gTWVzc2FnZSB0byBkaXNwbGF5IGZvciB0eXBlIG9mIGV2ZW50Ci1ldnQgLSBFdmVudCB0byBkaXNwbGF5Ci0KLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBkaXNwbGF5IHRoZSBzdGF0dXMgb2YgdGhlIG1vdXNlIGV2ZW50IHRvIHRoZSBzY3JlZW4uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBEaXNwbGF5TW91c2UoCi0gICAgY2hhciAqbXNnLAotICAgIGV2ZW50X3QgKmV2dCkKLXsKLSAgICBwcmludGYoIiVzOiAiLCBtc2cpOwotICAgIGlmIChldnQtPm1lc3NhZ2UgJiBFVlRfTEVGVEJNQVNLKQotCXByaW50ZigiTEVGVCAiKTsKLSAgICBpZiAoZXZ0LT5tZXNzYWdlICYgRVZUX1JJR0hUQk1BU0spCi0JcHJpbnRmKCJSSUdIVCAiKTsKLSAgICBpZiAoZXZ0LT5tZXNzYWdlICYgRVZUX01JRERMRUJNQVNLKQotCXByaW50ZigiTUlERExFICIpOwotICAgIHByaW50ZigiYWJzKCVkLCVkKSwgcmVsKCVkLCVkKSIsIGV2dC0+d2hlcmVfeCwgZXZ0LT53aGVyZV95LCBldnQtPnJlbGF0aXZlX3gsIGV2dC0+cmVsYXRpdmVfeSk7Ci0gICAgRGlzcGxheU1vZGlmaWVycyhldnQpOwotICAgIGlmIChldnQtPm1lc3NhZ2UgJiBFVlRfREJMQ0xJQ0spCi0JcHJpbnRmKCIsIERCTENMSUNLIik7Ci0gICAgcHJpbnRmKCJcbiIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW1zZyAtIE1lc3NhZ2UgdG8gZGlzcGxheSBmb3IgdHlwZSBvZiBldmVudAotZXZ0IC0gRXZlbnQgdG8gZGlzcGxheQotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZGlzcGxheSB0aGUgc3RhdHVzIG9mIHRoZSBqb3lzdGljayBldmVudCB0byB0aGUgc2NyZWVuLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRGlzcGxheUpveSgKLSAgICBjaGFyICptc2csCi0gICAgZXZlbnRfdCAqZXZ0KQotewotICAgIHByaW50ZigiJXM6IEpveTEoJTRkLCU0ZCwlYyVjKSwgSm95MiglNGQsJTRkLCVjJWMpXG4iLCBtc2csCi0JZXZ0LT53aGVyZV94LGV2dC0+d2hlcmVfeSwKLQkoZXZ0LT5tZXNzYWdlICYgRVZUX0pPWTFfQlVUVE9OQSkgPyAnQScgOiAnYScsCi0JKGV2dC0+bWVzc2FnZSAmIEVWVF9KT1kxX0JVVFRPTkIpID8gJ0InIDogJ2InLAotCWV2dC0+cmVsYXRpdmVfeCxldnQtPnJlbGF0aXZlX3ksCi0JKGV2dC0+bWVzc2FnZSAmIEVWVF9KT1kyX0JVVFRPTkEpID8gJ0EnIDogJ2EnLAotCShldnQtPm1lc3NhZ2UgJiBFVlRfSk9ZMl9CVVRUT05CKSA/ICdCJyA6ICdiJyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSm95c3RpY2sgY2FsaWJyYXRpb24gcm91dGluZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQ2FsaWJyYXRlSm95KHZvaWQpCi17Ci0gIGV2ZW50X3QgZXZ0OwotICBpZihFVlRfam95SXNQcmVzZW50KCkpewotICAgIHByaW50ZigiSm95c3RpY2sgQ2FsaWJyYXRpb25cbk1vdmUgdGhlIGpveXN0aWNrIHRvIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBhbmQgcHJlc3MgYW55IGJ1dHRvbi5cbiIpOwotICAgIEVWVF9oYWx0KCZldnQsIEVWVF9KT1lDTElDSyk7Ci0gICAgRVZUX2hhbHQoJmV2dCwgRVZUX0pPWUNMSUNLKTsKLSAgICBFVlRfam95U2V0VXBwZXJMZWZ0KCk7Ci0gICAgcHJpbnRmKCJNb3ZlIHRoZSBqb3lzdGljayB0byB0aGUgbG93ZXIgcmlnaHQgY29ybmVyIGFuZCBwcmVzcyBhbnkgYnV0dG9uLlxuIik7Ci0gICAgRVZUX2hhbHQoJmV2dCwgRVZUX0pPWUNMSUNLKTsKLSAgICBFVlRfaGFsdCgmZXZ0LCBFVlRfSk9ZQ0xJQ0spOwotICAgIEVWVF9qb3lTZXRMb3dlclJpZ2h0KCk7Ci0gICAgcHJpbnRmKCJNb3ZlIHRoZSBqb3lzdGljayB0byBjZW50ZXIgcG9zaXRpb24gYW5kIHByZXNzIGFueSBidXR0b24uXG4iKTsKLSAgICBFVlRfaGFsdCgmZXZ0LCBFVlRfSk9ZQ0xJQ0spOwotICAgIEVWVF9oYWx0KCZldnQsIEVWVF9KT1lDTElDSyk7Ci0gICAgRVZUX2pveVNldENlbnRlcigpOwotICAgIHByaW50ZigiSm95c3RpY2sgY2FsaWJyYXRlZFxuIik7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1NYWluIHByb2dyYW0gZW50cnkgcG9pbnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgbWFpbih2b2lkKQotewotICAgIGV2ZW50X3QgICAgIGV2dDsKLSAgICBpYm9vbCAgICAgICBkb25lID0gZmFsc2U7Ci0gICAgUE1fSFdORCAgICAgaHduZENvbnNvbGU7Ci0KLSAgICBod25kQ29uc29sZSA9IFBNX29wZW5Db25zb2xlKDAsMCwwLDAsMCx0cnVlKTsKLSAgICBFVlRfaW5pdCgmbW92ZU1vdXNlKTsKLSAgICBFVlRfc2V0TW91c2VSYW5nZSgxMDI0LDc2OCk7Ci0gICAgQ2FsaWJyYXRlSm95KCk7Ci0gICAgZG8gewotCUVWVF9wb2xsSm95c3RpY2soKTsKLQlpZiAoRVZUX2dldE5leHQoJmV2dCxFVlRfRVZFUllFVlQpKSB7Ci0JICAgIHN3aXRjaCAoZXZ0LndoYXQpIHsKLQkJY2FzZSBFVlRfS0VZRE9XTjoKLQkJICAgIERpc3BsYXlLZXkoIkVWVF9LRVlET1dOICAiLCAmZXZ0KTsKLQkJICAgIGlmIChFVlRfc2NhbkNvZGUoZXZ0Lm1lc3NhZ2UpID09IEtCX2VzYykKLQkJCWRvbmUgPSB0cnVlOwotCQkgICAgYnJlYWs7Ci0JCWNhc2UgRVZUX0tFWVJFUEVBVDoKLQkJICAgIERpc3BsYXlLZXkoIkVWVF9LRVlSRVBFQVQiLCAmZXZ0KTsKLQkJICAgIGJyZWFrOwotCQljYXNlIEVWVF9LRVlVUDoKLQkJICAgIERpc3BsYXlLZXkoIkVWVF9LRVlVUCAgICAiLCAmZXZ0KTsKLQkJICAgIGJyZWFrOwotCQljYXNlIEVWVF9NT1VTRURPV046Ci0JCSAgICBEaXNwbGF5TW91c2UoIkVWVF9NT1VTRURPV04iLCAmZXZ0KTsKLQkJICAgIGJyZWFrOwotCQljYXNlIEVWVF9NT1VTRUFVVE86Ci0JCSAgICBEaXNwbGF5TW91c2UoIkVWVF9NT1VTRUFVVE8iLCAmZXZ0KTsKLQkJICAgIGJyZWFrOwotCQljYXNlIEVWVF9NT1VTRVVQOgotCQkgICAgRGlzcGxheU1vdXNlKCJFVlRfTU9VU0VVUCAgIiwgJmV2dCk7Ci0JCSAgICBicmVhazsKLQkJY2FzZSBFVlRfTU9VU0VNT1ZFOgotCQkgICAgRGlzcGxheU1vdXNlKCJFVlRfTU9VU0VNT1ZFIiwgJmV2dCk7Ci0JCSAgICBicmVhazsKLQkJY2FzZSBFVlRfSk9ZQ0xJQ0s6Ci0JCSAgICBEaXNwbGF5Sm95KCJFVlRfSk9ZQ0xJQ0sgIiwgJmV2dCk7Ci0JCSAgICBicmVhazsKLQkJY2FzZSBFVlRfSk9ZTU9WRToKLQkJICAgIERpc3BsYXlKb3koIkVWVF9KT1lNT1ZFICAiLCAmZXZ0KTsKLQkJICAgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9IHdoaWxlICghZG9uZSk7Ci0gICAgRVZUX2V4aXQoKTsKLSAgICBQTV9jbG9zZUNvbnNvbGUoaHduZENvbnNvbGUpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvaXN2ZXNhLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9pc3Zlc2EuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdhZDI0NS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9pc3Zlc2EuYworKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBhbnkKLSoKLSogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gdG8gY2hlY2sgdGhlIGFiaWxpdHkgdG8gYWxsb2NhdGUgcmVhbCBtb2RlCi0qICAgICAgICAgICAgICAgbWVtb3J5IGFuZCB0byBjYWxsIHJlYWwgbW9kZSBpbnRlcnJ1cHQgaGFuZGxlcnMgc3VjaCBhcwotKiAgICAgICAgICAgICAgIHRoZSBWRVNBIFZCRSBCSU9TIGZyb20gcHJvdGVjdGVkIG1vZGUuIENvbXBpbGUgYW5kIGxpbmsKLSogICAgICAgICAgICAgICB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjb21tYW5kIGxpbmUgZm9yIHlvdXIgRE9TIGV4dGVuZGVyLgotKgotKiAgICAgICAgICAgICAgIEZ1bmN0aW9ucyB0ZXN0ZWQ6ICAgUE1fZ2V0VkVTQUJ1ZigpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9tYXBSZWFsUG9pbnRlcigpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9pbnQ4NngoKQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAicG1hcGkuaCIKLQotLyogU3VwZXJWR0EgaW5mb3JtYXRpb24gYmxvY2sgKi8KLQotI3ByYWdtYSBwYWNrKDEpCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjaGFyICAgIFZFU0FTaWduYXR1cmVbNF07ICAgICAgIC8qICdWRVNBJyA0IGJ5dGUgc2lnbmF0dXJlICAgICAgICAgICovCi0gICAgc2hvcnQgICBWRVNBVmVyc2lvbjsgICAgICAgICAgICAvKiBWQkUgdmVyc2lvbiBudW1iZXIgICAgICAgICAgICAgICAqLwotICAgIHVsb25nICAgT0VNU3RyaW5nUHRyOyAgICAgICAgICAgLyogRmFyIHBvaW50ZXIgdG8gT0VNIHN0cmluZyAgICAgICAgKi8KLSAgICB1bG9uZyAgIENhcGFiaWxpdGllczsgICAgICAgICAgIC8qIENhcGFiaWxpdGllcyBvZiB2aWRlbyBjYXJkICAgICAgICovCi0gICAgdWxvbmcgICBWaWRlb01vZGVQdHI7ICAgICAgICAgICAvKiBGYXIgcG9pbnRlciB0byBzdXBwb3J0ZWQgbW9kZXMgICAqLwotICAgIHNob3J0ICAgVG90YWxNZW1vcnk7ICAgICAgICAgICAgLyogTnVtYmVyIG9mIDY0a2IgbWVtb3J5IGJsb2NrcyAgICAgKi8KLSAgICBjaGFyICAgIHJlc2VydmVkWzIzNl07ICAgICAgICAgIC8qIFBhZCB0byAyNTYgYnl0ZSBibG9jayBzaXplICAgICAgICovCi0gICAgfSBWZ2FJbmZvQmxvY2s7Ci0KLSNwcmFnbWEgcGFjaygpCi0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgUk1SRUdTICAgICAgICAgIHJlZ3M7Ci0gICAgUk1TUkVHUyAgICAgICAgIHNyZWdzOwotICAgIFZnYUluZm9CbG9jayAgICB2Z2FJbmZvOwotICAgIHVzaG9ydCAgICAgICAgICAqbW9kZTsKLSAgICB1aW50ICAgICAgICAgICAgdmdMZW47Ci0gICAgdWNoYXIgICAgICAgICAgICp2Z1B0cjsKLSAgICB1bnNpZ25lZCAgICAgICAgcl92Z3NlZyxyX3Znb2ZmOwotCi0gICAgcHJpbnRmKCJQcm9ncmFtIHJ1bm5pbmcgaW4gIik7Ci0gICAgc3dpdGNoIChQTV9nZXRNb2RlVHlwZSgpKSB7Ci0JY2FzZSBQTV9yZWFsTW9kZToKLQkgICAgcHJpbnRmKCJyZWFsIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzI4NjoKLQkgICAgcHJpbnRmKCIxNiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzM4NjoKLQkgICAgcHJpbnRmKCIzMiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQl9Ci0KLSAgICAvKiBBbGxvY2F0ZSBhIDI1NiBieXRlIGJsb2NrIG9mIHJlYWwgbWVtb3J5IGZvciBjb21tdW5pY2F0aW5nIHdpdGgKLSAgICAgKiB0aGUgVkVTQSBCSU9TLgotICAgICAqLwotICAgIGlmICgodmdQdHIgPSBQTV9nZXRWRVNBQnVmKCZ2Z0xlbiwmcl92Z3NlZywmcl92Z29mZikpID09IE5VTEwpIHsKLQlwcmludGYoIlVuYWJsZSB0byBhbGxvY2F0ZSBWRVNBIG1lbW9yeSBidWZmZXIhXG4iKTsKLQlleGl0KDEpOwotCX0KLQotICAgIC8qIENhbGwgdGhlIFZFU0EgVkJFIHRvIHNlZSBpZiBpdCBpcyBvdXQgdGhlcmUgKi8KLSAgICByZWdzLnguYXggPSAweDRGMDA7Ci0gICAgcmVncy54LmRpID0gcl92Z29mZjsKLSAgICBzcmVncy5lcyA9IHJfdmdzZWc7Ci0gICAgbWVtY3B5KHZnUHRyLCJWQkUyIiw0KTsKLSAgICBQTV9pbnQ4NngoMHgxMCwgJnJlZ3MsICZyZWdzLCAmc3JlZ3MpOwotICAgIG1lbWNweSgmdmdhSW5mbyx2Z1B0cixzaXplb2YoVmdhSW5mb0Jsb2NrKSk7Ci0gICAgaWYgKHJlZ3MueC5heCA9PSAweDRGICYmIHN0cm5jbXAodmdhSW5mby5WRVNBU2lnbmF0dXJlLCJWRVNBIiw0KSA9PSAwKSB7Ci0JcHJpbnRmKCJWRVNBIFZCRSB2ZXJzaW9uICVkLiVkIEJJT1MgZGV0ZWN0ZWRcblxuIiwKLQkgICAgdmdhSW5mby5WRVNBVmVyc2lvbiA+PiA4LCB2Z2FJbmZvLlZFU0FWZXJzaW9uICYgMHhGKTsKLQlwcmludGYoIkF2YWlsYWJsZSB2aWRlbyBtb2RlczpcbiIpOwotCW1vZGUgPSBQTV9tYXBSZWFsUG9pbnRlcih2Z2FJbmZvLlZpZGVvTW9kZVB0ciA+PiAxNiwgdmdhSW5mby5WaWRlb01vZGVQdHIgJiAweEZGRkYpOwotCXdoaWxlICgqbW9kZSAhPSAweEZGRkYpIHsKLQkgICAgcHJpbnRmKCIgICAgJTA0aFhoICglMDhYKVxuIiwgKm1vZGUsIChpbnQpbW9kZSk7Ci0JICAgIG1vZGUrKzsKLQkgICAgfQotCX0KLSAgICBlbHNlCi0JcHJpbnRmKCJWRVNBIFZCRSBub3QgZm91bmRcbiIpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMva2V5LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9rZXkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJhODg4NS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9rZXkuYworKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIGFueQotKgotKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSB0byBjaGVjayB0aGUgYWJpbGl0eSB0byBpbnN0YWxsIGEgQyBiYXNlZAotKiAgICAgICAgICAgICAgIGtleWJvYXJkIGludGVycnVwdCBoYW5kbGVyLgotKgotKiAgICAgICAgICAgICAgIEZ1bmN0aW9ucyB0ZXN0ZWQ6ICAgUE1fc2V0S2V5SGFuZGxlcigpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9jaGFpblByZXZLZXkoKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fcmVzdG9yZUtleUhhbmRsZXIoKQotKgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAicG1hcGkuaCIKLQotdm9sYXRpbGUgbG9uZyBjb3VudCA9IDA7Ci0KLSNwcmFnbWEgb2ZmIChjaGVja19zdGFjaykgICAgICAgICAgIC8qIE5vIHN0YWNrIGNoZWNraW5nIHVuZGVyIFdhdGNvbSAgICovCi0KLXZvaWQgUE1BUEkga2V5SGFuZGxlcih2b2lkKQotewotICAgIGNvdW50Kys7Ci0gICAgUE1fY2hhaW5QcmV2S2V5KCk7ICAvKiBDaGFpbiB0byBwcmV2aW91cyBoYW5kbGVyICAgICovCi19Ci0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgaW50ICAgICAgICAgICAgIGNoOwotICAgIFBNX2xvY2tIYW5kbGUgICBsaDsKLQotICAgIHByaW50ZigiUHJvZ3JhbSBydW5uaW5nIGluICIpOwotICAgIHN3aXRjaCAoUE1fZ2V0TW9kZVR5cGUoKSkgewotCWNhc2UgUE1fcmVhbE1vZGU6Ci0JICAgIHByaW50ZigicmVhbCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8yODY6Ci0JICAgIHByaW50ZigiMTYgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8zODY6Ci0JICAgIHByaW50ZigiMzIgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgLyogSW5zdGFsbCBvdXIgdGltZXIgaGFuZGxlciBhbmQgbG9jayBoYW5kbGVyIHBhZ2VzIGluIG1lbW9yeS4gSXQgaXMKLSAgICAgKiBkaWZmaWN1bHQgdG8gZ2V0IHRoZSBzaXplIG9mIGEgZnVuY3Rpb24gaW4gQywgYnV0IHdlIGtub3cgb3VyCi0gICAgICogZnVuY3Rpb24gaXMgd2VsbCBsZXNzIHRoYW4gMTAwIGJ5dGVzIChhbmQgYW4gZW50aXJlIDRrIHBhZ2Ugd2lsbAotICAgICAqIG5lZWQgdG8gYmUgbG9ja2VkIGJ5IHRoZSBzZXJ2ZXIgYW55d2F5KS4KLSAgICAgKi8KLSAgICBQTV9sb2NrQ29kZVBhZ2VzKChfX2NvZGVQdHIpa2V5SGFuZGxlciwxMDAsJmxoKTsKLSAgICBQTV9sb2NrRGF0YVBhZ2VzKCh2b2lkKikmY291bnQsc2l6ZW9mKGNvdW50KSwmbGgpOwotICAgIFBNX2luc3RhbGxCcmVha0hhbmRsZXIoKTsgICAgICAgICAgIC8qIFdlICpET05UKiB3YW50IEN0cmwtQnJlYWtzISAqLwotICAgIFBNX3NldEtleUhhbmRsZXIoa2V5SGFuZGxlcik7Ci0gICAgcHJpbnRmKCJLZXlib2FyZCBpbnRlcnJ1cHQgaGFuZGxlciBpbnN0YWxsZWQgLSBUeXBlIHNvbWUgY2hhcmFjdGVycyBhbmRcbiIpOwotICAgIHByaW50ZigiaGl0IEVTQyB0byBleGl0XG4iKTsKLSAgICB3aGlsZSAoKGNoID0gUE1fZ2V0Y2goKSkgIT0gMHgxQikgewotCXByaW50ZigiJWMiLCBjaCk7Ci0JZmZsdXNoKHN0ZG91dCk7Ci0JfQotCi0gICAgUE1fcmVzdG9yZUtleUhhbmRsZXIoKTsKLSAgICBQTV9yZXN0b3JlQnJlYWtIYW5kbGVyKCk7Ci0gICAgUE1fdW5sb2NrRGF0YVBhZ2VzKCh2b2lkKikmY291bnQsc2l6ZW9mKGNvdW50KSwmbGgpOwotICAgIFBNX3VubG9ja0NvZGVQYWdlcygoX19jb2RlUHRyKWtleUhhbmRsZXIsMTAwLCZsaCk7Ci0gICAgcHJpbnRmKCJcblxuS2V5Ym9hcmQgaGFuZGxlciB3YXMgY2FsbGVkICVsZCB0aW1lc1xuIiwgY291bnQpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMva2V5MTUuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL2tleTE1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYjk0YmUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMva2V5MTUuYworKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIGFueQotKgotKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSB0byBjaGVjayB0aGUgYWJpbGl0eSB0byBpbnN0YWxsIGEgQyBiYXNlZAotKiAgICAgICAgICAgICAgIGtleWJvYXJkIEludCAxNWggaW50ZXJydXB0IGhhbmRsZXIuIFRoaXMgaXMgYW4gYWx0ZXJuYXRlCi0qICAgICAgICAgICAgICAgd2F5IHRvIGludGVyY2VwdCBzY2FuY29kZXMgZnJvbSB0aGUga2V5Ym9hcmQgYnkgaG9va2luZwotKiAgICAgICAgICAgICAgIHRoZSBJbnQgMTVoIGtleWJvYXJkIGludGVyY2VwdCBjYWxsb3V0LgotKgotKiAgICAgICAgICAgICAgIEZ1bmN0aW9ucyB0ZXN0ZWQ6ICAgUE1fc2V0S2V5MTVIYW5kbGVyKCkKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX3Jlc3RvcmVLZXkxNUhhbmRsZXIoKQotKgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAicG1hcGkuaCIKLQotdm9sYXRpbGUgbG9uZyBjb3VudCA9IDA7Ci12b2xhdGlsZSBzaG9ydCBsYXN0U2NhbkNvZGUgPSAwOwotCi0jcHJhZ21hIG9mZiAoY2hlY2tfc3RhY2spICAgICAgICAgICAvKiBObyBzdGFjayBjaGVja2luZyB1bmRlciBXYXRjb20gICAqLwotCi1zaG9ydCBQTUFQSSBrZXlIYW5kbGVyKHNob3J0IHNjYW5Db2RlKQotewotICAgIGNvdW50Kys7Ci0gICAgbGFzdFNjYW5Db2RlID0gc2NhbkNvZGU7Ci0gICAgcmV0dXJuIHNjYW5Db2RlOyAgICAgICAgICAgIC8qIExldCBCSU9TIHByb2Nlc3MgYXMgbm9ybWFsICovCi19Ci0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgaW50ICAgICAgICAgICAgIGNoOwotICAgIFBNX2xvY2tIYW5kbGUgICBsaDsKLQotICAgIHByaW50ZigiUHJvZ3JhbSBydW5uaW5nIGluICIpOwotICAgIHN3aXRjaCAoUE1fZ2V0TW9kZVR5cGUoKSkgewotCWNhc2UgUE1fcmVhbE1vZGU6Ci0JICAgIHByaW50ZigicmVhbCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8yODY6Ci0JICAgIHByaW50ZigiMTYgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8zODY6Ci0JICAgIHByaW50ZigiMzIgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgLyogSW5zdGFsbCBvdXIgdGltZXIgaGFuZGxlciBhbmQgbG9jayBoYW5kbGVyIHBhZ2VzIGluIG1lbW9yeS4gSXQgaXMKLSAgICAgKiBkaWZmaWN1bHQgdG8gZ2V0IHRoZSBzaXplIG9mIGEgZnVuY3Rpb24gaW4gQywgYnV0IHdlIGtub3cgb3VyCi0gICAgICogZnVuY3Rpb24gaXMgd2VsbCBsZXNzIHRoYW4gMTAwIGJ5dGVzIChhbmQgYW4gZW50aXJlIDRrIHBhZ2Ugd2lsbAotICAgICAqIG5lZWQgdG8gYmUgbG9ja2VkIGJ5IHRoZSBzZXJ2ZXIgYW55d2F5KS4KLSAgICAgKi8KLSAgICBQTV9sb2NrQ29kZVBhZ2VzKChfX2NvZGVQdHIpa2V5SGFuZGxlciwxMDAsJmxoKTsKLSAgICBQTV9sb2NrRGF0YVBhZ2VzKCh2b2lkKikmY291bnQsc2l6ZW9mKGNvdW50KSwmbGgpOwotICAgIFBNX2luc3RhbGxCcmVha0hhbmRsZXIoKTsgICAgICAgLyogV2UgKkRPTlQqIHdhbnQgQ3RybC1CcmVhaydzISAqLwotICAgIFBNX3NldEtleTE1SGFuZGxlcihrZXlIYW5kbGVyKTsKLSAgICBwcmludGYoIktleWJvYXJkIGludGVycnVwdCBoYW5kbGVyIGluc3RhbGxlZCAtIFR5cGUgc29tZSBjaGFyYWN0ZXJzIGFuZFxuIik7Ci0gICAgcHJpbnRmKCJoaXQgRVNDIHRvIGV4aXRcbiIpOwotICAgIHdoaWxlICgoY2ggPSBQTV9nZXRjaCgpKSAhPSAweDFCKSB7Ci0JcHJpbnRmKCIlYyIsIGNoKTsKLQlmZmx1c2goc3Rkb3V0KTsKLQl9Ci0KLSAgICBQTV9yZXN0b3JlS2V5MTVIYW5kbGVyKCk7Ci0gICAgUE1fcmVzdG9yZUJyZWFrSGFuZGxlcigpOwotICAgIFBNX3VubG9ja0RhdGFQYWdlcygodm9pZCopJmNvdW50LHNpemVvZihjb3VudCksJmxoKTsKLSAgICBQTV91bmxvY2tDb2RlUGFnZXMoKF9fY29kZVB0cilrZXlIYW5kbGVyLDEwMCwmbGgpOwotICAgIHByaW50ZigiXG5cbktleWJvYXJkIGhhbmRsZXIgd2FzIGNhbGxlZCAlbGQgdGltZXNcbiIsIGNvdW50KTsKLSAgICBwcmludGYoIkxhc3Qgc2NhbiBjb2RlICUwNFhcbiIsIGxhc3RTY2FuQ29kZSk7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9tZW10ZXN0LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9tZW10ZXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYzY1NWIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvbWVtdGVzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIGFueQotKgotKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSB0byBkZXRlcm1pbmUganVzdCBob3cgbXVjaCBtZW1vcnkgY2FuIGJlCi0qICAgICAgICAgICAgICAgYWxsb2NhdGVkIHdpdGggdGhlIGNvbXBpbGVyIGluIHVzZS4gQ29tcGlsZSBhbmQgbGluawotKiAgICAgICAgICAgICAgIHdpdGggdGhlIGFwcHJvcHJpYXRlIGNvbW1hbmQgbGluZSBmb3IgeW91ciBET1MgZXh0ZW5kZXIuCi0qCi0qICAgICAgICAgICAgICAgRnVuY3Rpb25zIHRlc3RlZDogICBQTV9tYWxsb2MoKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fYXZhaWxhYmxlTWVtb3J5KCkKLSoKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlICJwbWFwaS5oIgotCi0jaWZkZWYgIF9fMTZCSVRfXwotI2RlZmluZSBNQVhBTExPQyAgICA2NAotI2Vsc2UKLSNkZWZpbmUgTUFYQUxMT0MgICAgMjAwMAotI2VuZGlmCi0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgaW50ICAgICBpOwotICAgIHVsb25nICAgYWxsb2NzOwotICAgIHVsb25nICAgcGh5c2ljYWwsdG90YWw7Ci0gICAgY2hhciAgICAqcCwqcGFbTUFYQUxMT0NdOwotCi0gICAgcHJpbnRmKCJQcm9ncmFtIHJ1bm5pbmcgaW4gIik7Ci0gICAgc3dpdGNoIChQTV9nZXRNb2RlVHlwZSgpKSB7Ci0JY2FzZSBQTV9yZWFsTW9kZToKLQkgICAgcHJpbnRmKCJyZWFsIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzI4NjoKLQkgICAgcHJpbnRmKCIxNiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzM4NjoKLQkgICAgcHJpbnRmKCIzMiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQl9Ci0KLSAgICBwcmludGYoIk1lbW9yeSBhdmFpbGFibGUgYXQgc3RhcnQ6XG4iKTsKLSAgICBQTV9hdmFpbGFibGVNZW1vcnkoJnBoeXNpY2FsLCZ0b3RhbCk7Ci0gICAgcHJpbnRmKCIgICBQaHlzaWNhbCBtZW1vcnk6ICAgICAgICAgICAlbGQgS2JcbiIsIHBoeXNpY2FsIC8gMTAyNCk7Ci0gICAgcHJpbnRmKCIgICBUb3RhbCAoaW5jbHVkaW5nIHZpcnR1YWwpOiAlbGQgS2JcbiIsIHRvdGFsIC8gMTAyNCk7Ci0gICAgcHJpbnRmKCJcbiIpOwotICAgIGZvciAoYWxsb2NzID0gaSA9IDA7IGkgPCBNQVhBTExPQzsgaSsrKSB7Ci0JaWYgKChwYVtpXSA9IFBNX21hbGxvYygxMCoxMDI0KSkgIT0gMCkgeyAgICAvKiBpbiAxMGsgYmxvY2tzICAgICovCi0JICAgIHAgPSBwYVthbGxvY3NdOwotCSAgICBtZW1zZXQocCwgMCwgMTAqMTAyNCk7IC8qIHRvdWNoIGV2ZXJ5IGJ5dGUgICAgICAgICAgICAgICovCi0JICAgICpwID0gJ3gnOyAgICAgICAgICAgLyogZG8gc29tZXRoaW5nLCBhbnl0aGluZyB3aXRoICAgICAgKi8KLQkgICAgcFsxMDIzXSA9ICd5JzsgICAgICAvKiB0aGUgYWxsb2NhdGVkIG1lbW9yeSAgICAgICAgICAgICAqLwotCSAgICBhbGxvY3MrKzsKLQkgICAgcHJpbnRmKCJBbGxvY2F0ZWQgJWx1IGJ5dGVzXHIiLCAxMCooYWxsb2NzIDw8IDEwKSk7Ci0JICAgIH0KLQllbHNlIGJyZWFrOwotCWlmIChQTV9rYmhpdCgpICYmIChQTV9nZXRjaCgpID09IDB4MUIpKQotCSAgICBicmVhazsKLQl9Ci0KLSAgICBwcmludGYoIlxuXG5BbGxvY2F0ZWQgdG90YWwgb2YgJWx1IGJ5dGVzXG4iLCAxMCAqIChhbGxvY3MgPDwgMTApKTsKLQotICAgIHByaW50ZigiXG5NZW1vcnkgYXZhaWxhYmxlIGF0IGVuZDpcbiIpOwotICAgIFBNX2F2YWlsYWJsZU1lbW9yeSgmcGh5c2ljYWwsJnRvdGFsKTsKLSAgICBwcmludGYoIiAgIFBoeXNpY2FsIG1lbW9yeTogICAgICAgICAgICVsZCBLYlxuIiwgcGh5c2ljYWwgLyAxMDI0KTsKLSAgICBwcmludGYoIiAgIFRvdGFsIChpbmNsdWRpbmcgdmlydHVhbCk6ICVsZCBLYlxuIiwgdG90YWwgLyAxMDI0KTsKLQotICAgIGZvciAoaSA9IGFsbG9jcy0xOyBpID49IDA7IGktLSkKLQlQTV9mcmVlKHBhW2ldKTsKLQotICAgIHByaW50ZigiXG5NZW1vcnkgYXZhaWxhYmxlIGFmdGVyIGZyZWVpbmcgYWxsIGJsb2NrcyAobm90ZSB0aGF0IHVuZGVyIHByb3RlY3RlZCBtb2RlXG4iKTsKLSAgICBwcmludGYoInRoaXMgd2lsbCBtb3N0IGxpa2VseSBub3QgYmUgY29ycmVjdCBhZnRlciBmcmVlaW5nIGJsb2Nrcyk6XG5cbiIpOwotICAgIFBNX2F2YWlsYWJsZU1lbW9yeSgmcGh5c2ljYWwsJnRvdGFsKTsKLSAgICBwcmludGYoIiAgIFBoeXNpY2FsIG1lbW9yeTogICAgICAgICAgICVsZCBLYlxuIiwgcGh5c2ljYWwgLyAxMDI0KTsKLSAgICBwcmludGYoIiAgIFRvdGFsIChpbmNsdWRpbmcgdmlydHVhbCk6ICVsZCBLYlxuIiwgdG90YWwgLyAxMDI0KTsKLQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvbW91c2UuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL21vdXNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NjVhMGQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvbW91c2UuYworKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBhbnkKLSoKLSogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gdG8gY2hlY2sgdGhlIGFiaWxpdHkgdG8gaW5zdGFsbCBhbiBhc3NlbWJseQotKiAgICAgICAgICAgICAgIGxhbmd1YWdlIG1vdXNlIGludGVycnVwdCBoYW5kbGVyLiBXZSB1c2UgYXNzZW1ibHkgbGFuZ3VhZ2UKLSogICAgICAgICAgICAgICBhcyBpdCBtdXN0IGJlIGEgZmFyIGZ1bmN0aW9uIGFuZCBzaG91bGQgc3dhcCB0byBhIGxvY2FsCi0qICAgICAgICAgICAgICAgMzIgYml0IHN0YWNrIGlmIGl0IGlzIGdvaW5nIHRvIGNhbGwgYW55IEMgYmFzZWQgY29kZSAod2hpY2gKLSogICAgICAgICAgICAgICB3ZSBkbyBpbiB0aGlzIGV4YW1wbGUpLgotKgotKiAgICAgICAgICAgICAgIEZ1bmN0aW9ucyB0ZXN0ZWQ6ICAgUE1faW5zdGFsbE1vdXNlSGFuZGxlcigpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9pbnQ4NigpCi0qCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJwbWFwaS5oIgotCi12b2xhdGlsZSBsb25nIGNvdW50ID0gMDsKLQotI3ByYWdtYSBvZmYgKGNoZWNrX3N0YWNrKSAgICAgICAgICAgLyogTm8gc3RhY2sgY2hlY2tpbmcgdW5kZXIgV2F0Y29tICAgKi8KLQotdm9pZCBQTUFQSSBtb3VzZUhhbmRsZXIoCi0gICAgdWludCBtYXNrLAotICAgIHVpbnQgYnV0c3RhdGUsCi0gICAgaW50IHgsCi0gICAgaW50IHksCi0gICAgaW50IG1pY2tleVgsCi0gICAgaW50IG1pY2tleVkpCi17Ci0gICAgbWFzayA9IG1hc2s7ICAgICAgICAgICAgICAgIC8qIFdlIGRvbnQgdXNlIGFueSBvZiB0aGUgcGFyYW1ldGVycyAgICAqLwotICAgIGJ1dHN0YXRlID0gYnV0c3RhdGU7Ci0gICAgeCA9IHg7Ci0gICAgeSA9IHk7Ci0gICAgbWlja2V5WCA9IG1pY2tleVg7Ci0gICAgbWlja2V5WSA9IG1pY2tleVk7Ci0gICAgY291bnQrKzsKLX0KLQotaW50IG1haW4odm9pZCkKLXsKLSAgICBSTVJFR1MgICAgICAgICAgcmVnczsKLSAgICBQTV9sb2NrSGFuZGxlICAgbGg7Ci0KLSAgICBwcmludGYoIlByb2dyYW0gcnVubmluZyBpbiAiKTsKLSAgICBzd2l0Y2ggKFBNX2dldE1vZGVUeXBlKCkpIHsKLQljYXNlIFBNX3JlYWxNb2RlOgotCSAgICBwcmludGYoInJlYWwgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMjg2OgotCSAgICBwcmludGYoIjE2IGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMzg2OgotCSAgICBwcmludGYoIjMyIGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCX0KLQotICAgIHJlZ3MueC5heCA9IDMzOyAgICAgLyogTW91c2UgZnVuY3Rpb24gMzMgLSBTb2Z0d2FyZSByZXNldCAgICAgICAqLwotICAgIFBNX2ludDg2KDB4MzMsJnJlZ3MsJnJlZ3MpOwotICAgIGlmIChyZWdzLnguYnggPT0gMCkgewotCXByaW50ZigiTm8gbW91c2UgaW5zdGFsbGVkLlxuIik7Ci0JZXhpdCgxKTsKLQl9Ci0KLSAgICAvKiBJbnN0YWxsIG91ciBtb3VzZSBoYW5kbGVyIGFuZCBsb2NrIGhhbmRsZXIgcGFnZXMgaW4gbWVtb3J5LiBJdCBpcwotICAgICAqIGRpZmZpY3VsdCB0byBnZXQgdGhlIHNpemUgb2YgYSBmdW5jdGlvbiBpbiBDLCBidXQgd2Uga25vdyBvdXIKLSAgICAgKiBmdW5jdGlvbiBpcyB3ZWxsIGxlc3MgdGhhbiAxMDAgYnl0ZXMgKGFuZCBhbiBlbnRpcmUgNGsgcGFnZSB3aWxsCi0gICAgICogbmVlZCB0byBiZSBsb2NrZWQgYnkgdGhlIHNlcnZlciBhbnl3YXkpLgotICAgICAqLwotICAgIFBNX2xvY2tDb2RlUGFnZXMoKF9fY29kZVB0ciltb3VzZUhhbmRsZXIsMTAwLCZsaCk7Ci0gICAgUE1fbG9ja0RhdGFQYWdlcygodm9pZCopJmNvdW50LHNpemVvZihjb3VudCksJmxoKTsKLSAgICBpZiAoIVBNX3NldE1vdXNlSGFuZGxlcigweEZGRkYsIG1vdXNlSGFuZGxlcikpIHsKLQlwcmludGYoIlVuYWJsZSB0byBpbnN0YWxsIG1vdXNlIGhhbmRsZXIhXG4iKTsKLQlleGl0KDEpOwotCX0KLSAgICBwcmludGYoIk1vdXNlIGhhbmRsZXIgaW5zdGFsbGVkIC0gSGl0IGFueSBrZXkgdG8gZXhpdFxuIik7Ci0gICAgUE1fZ2V0Y2goKTsKLQotICAgIFBNX3Jlc3RvcmVNb3VzZUhhbmRsZXIoKTsKLSAgICBQTV91bmxvY2tEYXRhUGFnZXMoKHZvaWQqKSZjb3VudCxzaXplb2YoY291bnQpLCZsaCk7Ci0gICAgUE1fdW5sb2NrQ29kZVBhZ2VzKChfX2NvZGVQdHIpbW91c2VIYW5kbGVyLDEwMCwmbGgpOwotICAgIHByaW50ZigiTW91c2UgaGFuZGxlciB3YXMgY2FsbGVkICVsZCB0aW1lc1xuIiwgY291bnQpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvcmVzdG9yZS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvcmVzdG9yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDBiZTc1Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3Jlc3RvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIExpbnV4L1FOWAotKgotKiBEZXNjcmlwdGlvbjogIFByb2dyYW0gdG8gcmVzdG9yZSB0aGUgY29uc29sZSBzdGF0ZSBzdGF0ZSBmcm9tIGEgcHJldmlvdXNseQotKiAgICAgICAgICAgICAgIHNhdmVkIHN0YXRlIGlmIHRoZSBwcm9ncmFtIGNyYXNoZWQgd2hpbGUgdGhlIGNvbnNvbGUKLSogICAgICAgICAgICAgICB3YXMgaW4gZ3JhcGhpY3MgbW9kZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInBtYXBpLmgiCi0KLXZvaWQgc2V0VmlkZW9Nb2RlKGludCBtb2RlKQotewotICAgIFJNUkVHUyByOwotCi0gICAgci54LmF4ID0gbW9kZTsKLSAgICBQTV9pbnQ4NigweDEwLCAmciwgJnIpOwotfQotCi1pbnQgbWFpbih2b2lkKQotewotICAgIFBNX0hXTkQgaHduZENvbnNvbGU7Ci0gICAgdWxvbmcgICBzdGF0ZVNpemU7Ci0gICAgdm9pZCAgICAqc3RhdGVCdWY7Ci0gICAgRklMRSAgICAqZjsKLQotICAgIC8qIFdyaXRlIHRoZSBzYXZlZCBjb25zb2xlIHN0YXRlIGJ1ZmZlciB0byBkaXNrICovCi0gICAgaWYgKChmID0gZm9wZW4oIi9ldGMvcG1zYXZlLmRhdCIsInJiIikpID09IE5VTEwpIHsKLQlwcmludGYoIlVuYWJsZSB0byBvcGVuIC9ldGMvcG1zYXZlLmRhdCBmb3IgcmVhZGluZyFcbiIpOwotCXJldHVybiAtMTsKLQl9Ci0gICAgZnJlYWQoJnN0YXRlU2l6ZSwxLHNpemVvZihzdGF0ZVNpemUpLGYpOwotICAgIGlmIChzdGF0ZVNpemUgIT0gUE1fZ2V0Q29uc29sZVN0YXRlU2l6ZSgpKSB7Ci0JcHJpbnRmKCJTaXplIG1pc21hdGNoIGluIC9ldGMvcG1zYXZlLmRhdCFcbiIpOwotCXJldHVybiAtMTsKLQl9Ci0gICAgaWYgKChzdGF0ZUJ1ZiA9IFBNX21hbGxvYyhzdGF0ZVNpemUpKSA9PSBOVUxMKSB7Ci0JcHJpbnRmKCJVbmFibGUgdG8gYWxsb2NhdGUgY29uc29sZSBzdGF0ZSBidWZmZXIhXG4iKTsKLQlyZXR1cm4gLTE7Ci0JfQotICAgIGZyZWFkKHN0YXRlQnVmLDEsc3RhdGVTaXplLGYpOwotICAgIGZjbG9zZShmKTsKLQotICAgIC8qIE9wZW4gdGhlIGNvbnNvbGUgKi8KLSAgICBod25kQ29uc29sZSA9IFBNX29wZW5Db25zb2xlKDAsMCwwLDAsMCx0cnVlKTsKLQotICAgIC8qIEZvcmNpYmx5IHNldCA4MHgyNSB0ZXh0IG1vZGUgdXNpbmcgdGhlIEJJT1MgKi8KLSAgICBzZXRWaWRlb01vZGUoMHgzKTsKLQotICAgIC8qIFJlc3RvcmUgdGhlIHByZXZpb3VzIGNvbnNvbGUgc3RhdGUgKi8KLSAgICBQTV9yZXN0b3JlQ29uc29sZVN0YXRlKHN0YXRlQnVmLDApOwotICAgIFBNX2Nsb3NlQ29uc29sZShod25kQ29uc29sZSk7Ci0gICAgUE1fZnJlZShzdGF0ZUJ1Zik7Ci0gICAgcHJpbnRmKCJDb25zb2xlIHN0YXRlIHN1Y2Nlc3NmdWxseSByZXN0b3JlZCBmcm9tIC9ldGMvcG1zYXZlLmRhdFxuIik7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy9ydGMuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3J0Yy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2VmOTIyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3J0Yy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgYW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGVzdCBwcm9ncmFtIHRvIGNoZWNrIHRoZSBhYmlsaXR5IHRvIGluc3RhbGwgYSBDIGJhc2VkCi0qICAgICAgICAgICAgICAgUmVhbCBUaW1lIENsb2NrIGludGVycnVwdCBoYW5kbGVyLgotKgotKiAgICAgICAgICAgICAgIEZ1bmN0aW9ucyB0ZXN0ZWQ6ICAgUE1fc2V0UmVhbFRpbWVDbG9ja0hhbmRsZXIoKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fcmVzdG9yZVJlYWxUaW1lQ2xvY2tIYW5kbGVyKCkKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInBtYXBpLmgiCi0KLXZvbGF0aWxlIGxvbmcgY291bnQgPSAwOwotCi0jcHJhZ21hIG9mZiAoY2hlY2tfc3RhY2spICAgICAgICAgICAvKiBObyBzdGFjayBjaGVja2luZyB1bmRlciBXYXRjb20gICAqLwotCi12b2lkIFBNQVBJIFJUQ0hhbmRsZXIodm9pZCkKLXsKLSAgICBjb3VudCsrOwotfQotCi1pbnQgbWFpbih2b2lkKQotewotICAgIGxvbmcgICAgICAgICAgICBvbGRDb3VudDsKLSAgICBQTV9sb2NrSGFuZGxlICAgbGg7Ci0KLSAgICBwcmludGYoIlByb2dyYW0gcnVubmluZyBpbiAiKTsKLSAgICBzd2l0Y2ggKFBNX2dldE1vZGVUeXBlKCkpIHsKLQljYXNlIFBNX3JlYWxNb2RlOgotCSAgICBwcmludGYoInJlYWwgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMjg2OgotCSAgICBwcmludGYoIjE2IGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMzg2OgotCSAgICBwcmludGYoIjMyIGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCX0KLQotICAgIC8qIEluc3RhbGwgb3VyIHRpbWVyIGhhbmRsZXIgYW5kIGxvY2sgaGFuZGxlciBwYWdlcyBpbiBtZW1vcnkuIEl0IGlzCi0gICAgICogZGlmZmljdWx0IHRvIGdldCB0aGUgc2l6ZSBvZiBhIGZ1bmN0aW9uIGluIEMsIGJ1dCB3ZSBrbm93IG91cgotICAgICAqIGZ1bmN0aW9uIGlzIHdlbGwgbGVzcyB0aGFuIDEwMCBieXRlcyAoYW5kIGFuIGVudGlyZSA0ayBwYWdlIHdpbGwKLSAgICAgKiBuZWVkIHRvIGJlIGxvY2tlZCBieSB0aGUgc2VydmVyIGFueXdheSkuCi0gICAgICovCi0gICAgUE1fbG9ja0NvZGVQYWdlcygoX19jb2RlUHRyKVJUQ0hhbmRsZXIsMTAwLCZsaCk7Ci0gICAgUE1fbG9ja0RhdGFQYWdlcygodm9pZCopJmNvdW50LHNpemVvZihjb3VudCksJmxoKTsKLSAgICBQTV9pbnN0YWxsQnJlYWtIYW5kbGVyKCk7ICAgICAgICAgICAvKiBXZSAqRE9OVCogd2FudCBDdHJsLUJyZWFrcyEgKi8KLSAgICBQTV9zZXRSZWFsVGltZUNsb2NrSGFuZGxlcihSVENIYW5kbGVyLDEyOCk7Ci0gICAgcHJpbnRmKCJSZWFsVGltZUNsb2NrIGludGVycnVwdCBoYW5kbGVyIGluc3RhbGxlZCAtIEhpdCBFU0MgdG8gZXhpdFxuIik7Ci0gICAgb2xkQ291bnQgPSBjb3VudDsKLSAgICB3aGlsZSAoMSkgewotCWlmIChQTV9rYmhpdCgpICYmIChQTV9nZXRjaCgpID09IDB4MUIpKQotCSAgICBicmVhazsKLQlpZiAoY291bnQgIT0gb2xkQ291bnQpIHsKLQkgICAgcHJpbnRmKCJUaWNrLCBUb2NrOiAlbGRcbiIsIGNvdW50KTsKLQkgICAgb2xkQ291bnQgPSBjb3VudDsKLQkgICAgfQotCX0KLQotICAgIFBNX3Jlc3RvcmVSZWFsVGltZUNsb2NrSGFuZGxlcigpOwotICAgIFBNX3Jlc3RvcmVCcmVha0hhbmRsZXIoKTsKLSAgICBQTV91bmxvY2tEYXRhUGFnZXMoKHZvaWQqKSZjb3VudCxzaXplb2YoY291bnQpLCZsaCk7Ci0gICAgUE1fdW5sb2NrQ29kZVBhZ2VzKChfX2NvZGVQdHIpUlRDSGFuZGxlciwxMDAsJmxoKTsKLSAgICBwcmludGYoIlJlYWxUaW1lQ2xvY2sgaGFuZGxlciB3YXMgY2FsbGVkICVsZCB0aW1lc1xuIiwgY291bnQpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvc2F2ZS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvc2F2ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzMyNDU2Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3NhdmUuYworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIExpbnV4L1FOWAotKgotKiBEZXNjcmlwdGlvbjogIFByb2dyYW0gdG8gc2F2ZSB0aGUgY29uc29sZSBzdGF0ZSBzdGF0ZSBzbyB0aGF0IGl0IGNhbgotKiAgICAgICAgICAgICAgIGJlIGxhdGVyIHJlc3RvcmVkIGlmIHRoZSBwcm9ncmFtIGNyYXNoZWQgd2hpbGUgdGhlIGNvbnNvbGUKLSogICAgICAgICAgICAgICB3YXMgaW4gZ3JhcGhpY3MgbW9kZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInBtYXBpLmgiCi0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgUE1fSFdORCBod25kQ29uc29sZTsKLSAgICB1bG9uZyAgIHN0YXRlU2l6ZTsKLSAgICB2b2lkICAgICpzdGF0ZUJ1ZjsKLSAgICBGSUxFICAgICpmOwotCi0gICAgLyogQWxsb2NhdGUgYSBidWZmZXIgdG8gc2F2ZSBjb25zb2xlIHN0YXRlIGFuZCBzYXZlIHRoZSBzdGF0ZSAqLwotICAgIGh3bmRDb25zb2xlID0gUE1fb3BlbkNvbnNvbGUoMCwwLDAsMCwwLHRydWUpOwotICAgIHN0YXRlU2l6ZSA9IFBNX2dldENvbnNvbGVTdGF0ZVNpemUoKTsKLSAgICBpZiAoKHN0YXRlQnVmID0gUE1fbWFsbG9jKHN0YXRlU2l6ZSkpID09IE5VTEwpIHsKLQlQTV9jbG9zZUNvbnNvbGUoaHduZENvbnNvbGUpOwotCXByaW50ZigiVW5hYmxlIHRvIGFsbG9jYXRlIGNvbnNvbGUgc3RhdGUgYnVmZmVyIVxuIik7Ci0JcmV0dXJuIC0xOwotCX0KLSAgICBQTV9zYXZlQ29uc29sZVN0YXRlKHN0YXRlQnVmLDApOwotCi0gICAgLyogUmVzdG9yZSB0aGUgY29uc29sZSBzdGF0ZSBvbiBleGl0ICovCi0gICAgUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZShzdGF0ZUJ1ZiwwKTsKLSAgICBQTV9jbG9zZUNvbnNvbGUoaHduZENvbnNvbGUpOwotCi0gICAgLyogV3JpdGUgdGhlIHNhdmVkIGNvbnNvbGUgc3RhdGUgYnVmZmVyIHRvIGRpc2sgKi8KLSAgICBpZiAoKGYgPSBmb3BlbigiL2V0Yy9wbXNhdmUuZGF0Iiwid2IiKSkgPT0gTlVMTCkKLQlwcmludGYoIlVuYWJsZSB0byBvcGVuIC9ldGMvcG1zYXZlL2RhdCBmb3Igd3JpdGluZyFcbiIpOwotICAgIGVsc2UgewotCWZ3cml0ZSgmc3RhdGVTaXplLDEsc2l6ZW9mKHN0YXRlU2l6ZSksZik7Ci0JZndyaXRlKHN0YXRlQnVmLDEsc3RhdGVTaXplLGYpOwotCWZjbG9zZShmKTsKLQlwcmludGYoIkNvbnNvbGUgc3RhdGUgc3VjY2Vzc2Z1bGx5IHNhdmVkIHRvIC9ldGMvcG1zYXZlLmRhdFxuIik7Ci0JfQotICAgIFBNX2ZyZWUoc3RhdGVCdWYpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvc2hvd3BjaS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvc2hvd3BjaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTI3NWUxLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3Nob3dwY2kuYworKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBhbnkKLSoKLSogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gdG8gdGVzdCB0aGUgUENJIGxpYnJhcnkgZnVuY3Rpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAicGNpbGliLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludCAgICAgICAgICAgICAgTnVtUENJID0gLTE7Ci1zdGF0aWMgUENJRGV2aWNlSW5mbyAgICAqUENJOwotc3RhdGljIGludCAgICAgICAgICAgICAgKkJyaWRnZUluZGV4Owotc3RhdGljIGludCAgICAgICAgICAgICAgKkRldmljZUluZGV4Owotc3RhdGljIGludCAgICAgICAgICAgICAgTnVtQnJpZGdlczsKLXN0YXRpYyBQQ0lEZXZpY2VJbmZvICAgICpBR1BCcmlkZ2UgPSBOVUxMOwotc3RhdGljIGludCAgICAgICAgICAgICAgTnVtRGV2aWNlczsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1FbnVtZXJhdGVzIHRoZSBQQ0kgYnVzIGFuZCBkdW1wcyB0aGUgUENJIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gdG8gdGhlCi1sb2cgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBFbnVtZXJhdGVQQ0kodm9pZCkKLXsKLSAgICBpbnQgICAgICAgICAgICAgaSxpbmRleDsKLSAgICBQQ0lEZXZpY2VJbmZvICAgKmluZm87Ci0KLSAgICBwcmludGYoIkRpc3BsYXlpbmcgZW51bWVyYXRpb24gb2YgUENJIGJ1cyAoJWQgZGV2aWNlcywgJWQgZGlzcGxheSBkZXZpY2VzKVxuIiwKLQlOdW1QQ0ksIE51bURldmljZXMpOwotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IE51bURldmljZXM7IGluZGV4KyspCi0JcHJpbnRmKCIgIERpc3BsYXkgZGV2aWNlICVkIGlzIFBDSSBkZXZpY2UgJWRcbiIsaW5kZXgsRGV2aWNlSW5kZXhbaW5kZXhdKTsKLSAgICBwcmludGYoIlxuIik7Ci0gICAgcHJpbnRmKCJCdXMgU2xvdCBGbmMgRGV2aWNlSUQgIFN1YlN5c3RlbSBSZXYgQ2xhc3MgSVJRIEludCBDbWRcbiIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBOdW1QQ0k7IGkrKykgewotCXByaW50ZigiJTJkICAgJTJkICAlMmQgICUwNFg6JTA0WCAlMDRYOiUwNFggJTAyWCAgJTAyWDolMDJYICUwMlggICUwMlggICUwNFggICAiLAotCSAgICBQQ0lbaV0uc2xvdC5wLkJ1cywKLQkgICAgUENJW2ldLnNsb3QucC5EZXZpY2UsCi0JICAgIFBDSVtpXS5zbG90LnAuRnVuY3Rpb24sCi0JICAgIFBDSVtpXS5WZW5kb3JJRCwKLQkgICAgUENJW2ldLkRldmljZUlELAotCSAgICBQQ0lbaV0udS50eXBlMC5TdWJTeXN0ZW1WZW5kb3JJRCwKLQkgICAgUENJW2ldLnUudHlwZTAuU3ViU3lzdGVtSUQsCi0JICAgIFBDSVtpXS5SZXZJRCwKLQkgICAgUENJW2ldLkJhc2VDbGFzcywKLQkgICAgUENJW2ldLlN1YkNsYXNzLAotCSAgICBQQ0lbaV0udS50eXBlMC5JbnRlcnJ1cHRMaW5lLAotCSAgICBQQ0lbaV0udS50eXBlMC5JbnRlcnJ1cHRQaW4sCi0JICAgIFBDSVtpXS5Db21tYW5kKTsKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOdW1EZXZpY2VzOyBpbmRleCsrKSB7Ci0JICAgIGlmIChEZXZpY2VJbmRleFtpbmRleF0gPT0gaSkKLQkJYnJlYWs7Ci0JICAgIH0KLQlpZiAoaW5kZXggPCBOdW1EZXZpY2VzKQotCSAgICBwcmludGYoIjwtICVkXG4iLCBpbmRleCk7Ci0JZWxzZQotCSAgICBwcmludGYoIlxuIik7Ci0JfQotICAgIHByaW50ZigiXG4iKTsKLSAgICBwcmludGYoIkRldmljZUlEICBTdGF0IElmYyBDY2ggTGF0IEhkciBCSVNUXG4iKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTnVtUENJOyBpKyspIHsKLQlwcmludGYoIiUwNFg6JTA0WCAlMDRYICAlMDJYICAlMDJYICAlMDJYICAlMDJYICAlMDJYICAgIiwKLQkgICAgUENJW2ldLlZlbmRvcklELAotCSAgICBQQ0lbaV0uRGV2aWNlSUQsCi0JICAgIFBDSVtpXS5TdGF0dXMsCi0JICAgIFBDSVtpXS5JbnRlcmZhY2UsCi0JICAgIFBDSVtpXS5DYWNoZUxpbmVTaXplLAotCSAgICBQQ0lbaV0uTGF0ZW5jeVRpbWVyLAotCSAgICBQQ0lbaV0uSGVhZGVyVHlwZSwKLQkgICAgUENJW2ldLkJJU1QpOwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE51bURldmljZXM7IGluZGV4KyspIHsKLQkgICAgaWYgKERldmljZUluZGV4W2luZGV4XSA9PSBpKQotCQlicmVhazsKLQkgICAgfQotCWlmIChpbmRleCA8IE51bURldmljZXMpCi0JICAgIHByaW50ZigiPC0gJWRcbiIsIGluZGV4KTsKLQllbHNlCi0JICAgIHByaW50ZigiXG4iKTsKLQl9Ci0gICAgcHJpbnRmKCJcbiIpOwotICAgIHByaW50ZigiRGV2aWNlSUQgIEJhc2UxMGggIEJhc2UxNGggIEJhc2UxOGggIEJhc2UxQ2ggIEJhc2UyMGggIEJhc2UyNGggIFJPTUJhc2VcbiIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBOdW1QQ0k7IGkrKykgewotCXByaW50ZigiJTA0WDolMDRYICUwOGxYICUwOGxYICUwOGxYICUwOGxYICUwOGxYICUwOGxYICUwOGxYICIsCi0JICAgIFBDSVtpXS5WZW5kb3JJRCwKLQkgICAgUENJW2ldLkRldmljZUlELAotCSAgICBQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczEwLAotCSAgICBQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczE0LAotCSAgICBQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczE4LAotCSAgICBQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczFDLAotCSAgICBQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczIwLAotCSAgICBQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczI0LAotCSAgICBQQ0lbaV0udS50eXBlMC5ST01CYXNlQWRkcmVzcyk7Ci0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTnVtRGV2aWNlczsgaW5kZXgrKykgewotCSAgICBpZiAoRGV2aWNlSW5kZXhbaW5kZXhdID09IGkpCi0JCWJyZWFrOwotCSAgICB9Ci0JaWYgKGluZGV4IDwgTnVtRGV2aWNlcykKLQkgICAgcHJpbnRmKCI8LSAlZFxuIiwgaW5kZXgpOwotCWVsc2UKLQkgICAgcHJpbnRmKCJcbiIpOwotCX0KLSAgICBwcmludGYoIlxuIik7Ci0gICAgcHJpbnRmKCJEZXZpY2VJRCAgQkFSMTBMZW4gQkFSMTRMZW4gQkFSMThMZW4gQkFSMUNMZW4gQkFSMjBMZW4gQkFSMjRMZW4gUk9NTGVuXG4iKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTnVtUENJOyBpKyspIHsKLQlwcmludGYoIiUwNFg6JTA0WCAlMDhsWCAlMDhsWCAlMDhsWCAlMDhsWCAlMDhsWCAlMDhsWCAlMDhsWCAiLAotCSAgICBQQ0lbaV0uVmVuZG9ySUQsCi0JICAgIFBDSVtpXS5EZXZpY2VJRCwKLQkgICAgUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxMExlbiwKLQkgICAgUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxNExlbiwKLQkgICAgUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxOExlbiwKLQkgICAgUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxQ0xlbiwKLQkgICAgUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MyMExlbiwKLQkgICAgUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MyNExlbiwKLQkgICAgUENJW2ldLnUudHlwZTAuUk9NQmFzZUFkZHJlc3NMZW4pOwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE51bURldmljZXM7IGluZGV4KyspIHsKLQkgICAgaWYgKERldmljZUluZGV4W2luZGV4XSA9PSBpKQotCQlicmVhazsKLQkgICAgfQotCWlmIChpbmRleCA8IE51bURldmljZXMpCi0JICAgIHByaW50ZigiPC0gJWRcbiIsIGluZGV4KTsKLQllbHNlCi0JICAgIHByaW50ZigiXG4iKTsKLQl9Ci0gICAgcHJpbnRmKCJcbiIpOwotICAgIHByaW50ZigiRGlzcGxheWluZyBlbnVtZXJhdGlvbiBvZiAlZCBicmlkZ2UgZGV2aWNlc1xuIixOdW1CcmlkZ2VzKTsKLSAgICBwcmludGYoIlxuIik7Ci0gICAgcHJpbnRmKCJEZXZpY2VJRCAgUCMgUyMgQiMgSU9CICBJT0wgIE1lbUJhc2UgIE1lbUxpbWl0IFByZUJhc2UgIFByZUxpbWl0IEN0cmxcbiIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBOdW1CcmlkZ2VzOyBpKyspIHsKLQlpbmZvID0gKFBDSURldmljZUluZm8qKSZQQ0lbQnJpZGdlSW5kZXhbaV1dOwotCXByaW50ZigiJTA0WDolMDRYICUwMlggJTAyWCAlMDJYICUwNFggJTA0WCAlMDhYICUwOFggJTA4WCAlMDhYICUwNFhcbiIsCi0JICAgIGluZm8tPlZlbmRvcklELAotCSAgICBpbmZvLT5EZXZpY2VJRCwKLQkgICAgaW5mby0+dS50eXBlMS5QcmltYXJ5QnVzTnVtYmVyLAotCSAgICBpbmZvLT51LnR5cGUxLlNlY29uZGF5QnVzTnVtYmVyLAotCSAgICBpbmZvLT51LnR5cGUxLlN1Ym9yZGluYXRlQnVzTnVtYmVyLAotCSAgICAoKHUxNilpbmZvLT51LnR5cGUxLklPQmFzZSA8PCA4KSAmIDB4RjAwMCwKLQkgICAgaW5mby0+dS50eXBlMS5JT0xpbWl0ID8KLQkJKCh1MTYpaW5mby0+dS50eXBlMS5JT0xpbWl0IDw8IDgpIHwgMHhGRkYgOiAwLAotCSAgICAoKHUzMilpbmZvLT51LnR5cGUxLk1lbW9yeUJhc2UgPDwgMTYpICYgMHhGRkYwMDAwMCwKLQkgICAgaW5mby0+dS50eXBlMS5NZW1vcnlMaW1pdCA/Ci0JCSgodTMyKWluZm8tPnUudHlwZTEuTWVtb3J5TGltaXQgPDwgMTYpIHwgMHhGRkZGRiA6IDAsCi0JICAgICgodTMyKWluZm8tPnUudHlwZTEuUHJlZmV0Y2hhYmxlTWVtb3J5QmFzZSA8PCAxNikgJiAweEZGRjAwMDAwLAotCSAgICBpbmZvLT51LnR5cGUxLlByZWZldGNoYWJsZU1lbW9yeUxpbWl0ID8KLQkJKCh1MzIpaW5mby0+dS50eXBlMS5QcmVmZXRjaGFibGVNZW1vcnlMaW1pdCA8PCAxNikgfCAweEZGRkZGIDogMCwKLQkgICAgaW5mby0+dS50eXBlMS5CcmlkZ2VDb250cm9sKTsKLQl9Ci0gICAgcHJpbnRmKCJcbiIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVUVVJOUzoKLU51bWJlciBvZiBkaXNwbGF5IGRldmljZXMgZm91bmQuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGVudW1lcmF0ZXMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgZGlzcGxheSBkZXZpY2VzIG9uIHRoZQotUENJIGJ1cywgYW5kIHJldHVybnMgdGhlIG51bWJlciBmb3VuZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IFBDSV9lbnVtZXJhdGVEZXZpY2VzKHZvaWQpCi17Ci0gICAgaW50ICAgICAgICAgICAgIGksajsKLSAgICBQQ0lEZXZpY2VJbmZvICAgKmluZm87Ci0KLSAgICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgYmVlbiBjYWxsZWQsIGVudW1lcmF0ZSBhbGwgKi8KLSAgICAvKiBkZXZpY2VzIG9uIHRoZSBQQ0kgYnVzLiAqLwotICAgIGlmIChOdW1QQ0kgPT0gLTEpIHsKLQlpZiAoKE51bVBDSSA9IFBDSV9nZXROdW1EZXZpY2VzKCkpID09IDApCi0JICAgIHJldHVybiAtMTsKLQlQQ0kgPSBtYWxsb2MoTnVtUENJICogc2l6ZW9mKFBDSVswXSkpOwotCUJyaWRnZUluZGV4ID0gbWFsbG9jKE51bVBDSSAqIHNpemVvZihCcmlkZ2VJbmRleFswXSkpOwotCURldmljZUluZGV4ID0gbWFsbG9jKE51bVBDSSAqIHNpemVvZihEZXZpY2VJbmRleFswXSkpOwotCWlmICghUENJIHx8ICFCcmlkZ2VJbmRleCB8fCAhRGV2aWNlSW5kZXgpCi0JICAgIHJldHVybiAtMTsKLQlmb3IgKGkgPSAwOyBpIDwgTnVtUENJOyBpKyspCi0JICAgIFBDSVtpXS5kd1NpemUgPSBzaXplb2YoUENJW2ldKTsKLQlpZiAoUENJX2VudW1lcmF0ZShQQ0kpID09IDApCi0JICAgIHJldHVybiAtMTsKLQotCS8qIEJ1aWxkIGEgbGlzdCBvZiBhbGwgUENJIGJyaWRnZSBkZXZpY2VzICovCi0JZm9yIChpID0gMCxOdW1CcmlkZ2VzID0gMCxCcmlkZ2VJbmRleFswXSA9IC0xOyBpIDwgTnVtUENJOyBpKyspIHsKLQkgICAgaWYgKFBDSVtpXS5CYXNlQ2xhc3MgPT0gUENJX0JSSURHRV9DTEFTUykKLQkJQnJpZGdlSW5kZXhbTnVtQnJpZGdlcysrXSA9IGk7Ci0JICAgIH0KLQotCS8qIE5vdyBidWlsZCBhIGxpc3Qgb2YgYWxsIGRpc3BsYXkgY2xhc3MgZGV2aWNlcyAqLwotCWZvciAoaSA9IDAsTnVtRGV2aWNlcyA9IDEsRGV2aWNlSW5kZXhbMF0gPSAtMTsgaSA8IE51bVBDSTsgaSsrKSB7Ci0JICAgIGlmIChQQ0lfSVNfRElTUExBWV9DTEFTUygmUENJW2ldKSkgewotCQlpZiAoKFBDSVtpXS5Db21tYW5kICYgMHgzKSA9PSAweDMpCi0JCSAgICBEZXZpY2VJbmRleFswXSA9IGk7Ci0JCWVsc2UKLQkJICAgIERldmljZUluZGV4W051bURldmljZXMrK10gPSBpOwotCQlpZiAoUENJW2ldLnNsb3QucC5CdXMgIT0gMCkgewotCQkgICAgLyogVGhpcyBkZXZpY2UgaXMgb24gYSBkaWZmZXJlbnQgYnVzIHRoYW4gdGhlIHByaW1hcnkgKi8KLQkJICAgIC8qIFBDSSBidXMsIHNvIGl0IGlzIHByb2JhYmx5IGFuIEFHUCBkZXZpY2UuIEZpbmQgdGhlICovCi0JCSAgICAvKiBBR1AgYnVzIGRldmljZSB0aGF0IGNvbnRyb2xzIHRoYXQgYnVzIHNvIHdlIGNhbiAqLwotCQkgICAgLyogY29udHJvbCBpdC4gKi8KLQkJICAgIGZvciAoaiA9IDA7IGogPCBOdW1CcmlkZ2VzOyBqKyspIHsKLQkJCWluZm8gPSAoUENJRGV2aWNlSW5mbyopJlBDSVtCcmlkZ2VJbmRleFtqXV07Ci0JCQlpZiAoaW5mby0+dS50eXBlMS5TZWNvbmRheUJ1c051bWJlciA9PSBQQ0lbaV0uc2xvdC5wLkJ1cykgewotCQkJICAgIEFHUEJyaWRnZSA9IGluZm87Ci0JCQkgICAgYnJlYWs7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCS8qIEVudW1lcmF0ZSBhbGwgUENJIGFuZCBicmlkZ2UgZGV2aWNlcyB0byBzdGFuZGFyZCBvdXRwdXQgKi8KLQlFbnVtZXJhdGVQQ0koKTsKLQl9Ci0gICAgcmV0dXJuIE51bURldmljZXM7Ci19Ci0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgLyogRW51bWVyYXRlIGFsbCBQQ0kgZGV2aWNlcyAqLwotICAgIFBNX2luaXQoKTsKLSAgICBpZiAoUENJX2VudW1lcmF0ZURldmljZXMoKSA8IDEpIHsKLQlwcmludGYoIk5vIFBDSSBkaXNwbGF5IGRldmljZXMgZm91bmQhXG4iKTsKLQlyZXR1cm4gLTE7Ci0JfQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvdGljay5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvdGljay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzg3MjVlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3RpY2suYworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIGFueQotKgotKiBEZXNjcmlwdGlvbjogIFRlc3QgcHJvZ3JhbSB0byBjaGVjayB0aGUgYWJpbGl0eSB0byBpbnN0YWxsIGEgQyBiYXNlZAotKiAgICAgICAgICAgICAgIHRpbWVyIGludGVycnVwdCBoYW5kbGVyLgotKgotKiAgICAgICAgICAgICAgIEZ1bmN0aW9ucyB0ZXN0ZWQ6ICAgUE1fc2V0VGltZXJIYW5kbGVyKCkKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX2NoYWluUHJldlRpbWVyKCk7Ci0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9yZXN0b3JlVGltZXJIYW5kbGVyKCkKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInBtYXBpLmgiCi0KLXZvbGF0aWxlIGxvbmcgY291bnQgPSAwOwotCi0jcHJhZ21hIG9mZiAoY2hlY2tfc3RhY2spICAgICAgICAgICAvKiBObyBzdGFjayBjaGVja2luZyB1bmRlciBXYXRjb20gICAqLwotCi12b2lkIFBNQVBJIHRpbWVySGFuZGxlcih2b2lkKQotewotICAgIFBNX2NoYWluUHJldlRpbWVyKCk7ICAgICAgICAvKiBDaGFpbiB0byBwcmV2aW91cyBoYW5kbGVyICovCi0gICAgY291bnQrKzsKLX0KLQotaW50IG1haW4odm9pZCkKLXsKLSAgICBsb25nICAgICAgICAgICAgb2xkQ291bnQ7Ci0gICAgUE1fbG9ja0hhbmRsZSAgIGxoOwotCi0gICAgcHJpbnRmKCJQcm9ncmFtIHJ1bm5pbmcgaW4gIik7Ci0gICAgc3dpdGNoIChQTV9nZXRNb2RlVHlwZSgpKSB7Ci0JY2FzZSBQTV9yZWFsTW9kZToKLQkgICAgcHJpbnRmKCJyZWFsIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzI4NjoKLQkgICAgcHJpbnRmKCIxNiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNXzM4NjoKLQkgICAgcHJpbnRmKCIzMiBiaXQgcHJvdGVjdGVkIG1vZGUuXG5cbiIpOwotCSAgICBicmVhazsKLQl9Ci0KLSAgICAvKiBJbnN0YWxsIG91ciB0aW1lciBoYW5kbGVyIGFuZCBsb2NrIGhhbmRsZXIgcGFnZXMgaW4gbWVtb3J5LiBJdCBpcwotICAgICAqIGRpZmZpY3VsdCB0byBnZXQgdGhlIHNpemUgb2YgYSBmdW5jdGlvbiBpbiBDLCBidXQgd2Uga25vdyBvdXIKLSAgICAgKiBmdW5jdGlvbiBpcyB3ZWxsIGxlc3MgdGhhbiAxMDAgYnl0ZXMgKGFuZCBhbiBlbnRpcmUgNGsgcGFnZSB3aWxsCi0gICAgICogbmVlZCB0byBiZSBsb2NrZWQgYnkgdGhlIHNlcnZlciBhbnl3YXkpLgotICAgICAqLwotICAgIFBNX2xvY2tDb2RlUGFnZXMoKF9fY29kZVB0cil0aW1lckhhbmRsZXIsMTAwLCZsaCk7Ci0gICAgUE1fbG9ja0RhdGFQYWdlcygodm9pZCopJmNvdW50LHNpemVvZihjb3VudCksJmxoKTsKLSAgICBQTV9pbnN0YWxsQnJlYWtIYW5kbGVyKCk7ICAgICAgICAgICAvKiBXZSAqRE9OVCogd2FudCBDdHJsLUJyZWFrcyEgKi8KLSAgICBQTV9zZXRUaW1lckhhbmRsZXIodGltZXJIYW5kbGVyKTsKLSAgICBwcmludGYoIlRpbWVyIGludGVycnVwdCBoYW5kbGVyIGluc3RhbGxlZCAtIEhpdCBFU0MgdG8gZXhpdFxuIik7Ci0gICAgb2xkQ291bnQgPSBjb3VudDsKLSAgICB3aGlsZSAoMSkgewotCWlmIChQTV9rYmhpdCgpICYmIChQTV9nZXRjaCgpID09IDB4MUIpKQotCSAgICBicmVhazsKLQlpZiAoY291bnQgIT0gb2xkQ291bnQpIHsKLQkgICAgcHJpbnRmKCJUaWNrLCBUb2NrOiAlbGRcbiIsIGNvdW50KTsKLQkgICAgb2xkQ291bnQgPSBjb3VudDsKLQkgICAgfQotCX0KLQotICAgIFBNX3Jlc3RvcmVUaW1lckhhbmRsZXIoKTsKLSAgICBQTV9yZXN0b3JlQnJlYWtIYW5kbGVyKCk7Ci0gICAgUE1fdW5sb2NrRGF0YVBhZ2VzKCh2b2lkKikmY291bnQsc2l6ZW9mKGNvdW50KSwmbGgpOwotICAgIFBNX3VubG9ja0NvZGVQYWdlcygoX19jb2RlUHRyKXRpbWVySGFuZGxlciwxMDAsJmxoKTsKLSAgICBwcmludGYoIlRpbWVyIGhhbmRsZXIgd2FzIGNhbGxlZCAlbGQgdGltZXNcbiIsIGNvdW50KTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3RpbWVyYy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvdGltZXJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYTc3YjcuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvdGltZXJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gZm9yIHRoZSBaZW4gVGltZXIgTGlicmFyeS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAienRpbWVyLmgiCi0KLSNkZWZpbmUgREVMQVlfU0VDUyAgMTAKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogVGhlIGZvbGxvd2luZyByb3V0aW5lIHRha2VzIGEgbG9uZyBjb3VudCBpbiBtaWNyb3NlY29uZHMgYW5kIG91dHB1dHMKLSAqIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY291bnQgaW4gc2Vjb25kcy4gSXQgY291bGQgYmUgbW9kaWZpZWQgdG8KLSAqIHJldHVybiBhIHBvaW50ZXIgdG8gYSBzdGF0aWMgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY291bnQgcmF0aGVyCi0gKiB0aGFuIHByaW50aW5nIGl0IG91dC4KLSAqLwotCi12b2lkIFJlcG9ydFRpbWUodWxvbmcgY291bnQpCi17Ci0gICAgdWxvbmcgICBzZWNzOwotCi0gICAgc2VjcyA9IGNvdW50IC8gMTAwMDAwMEw7Ci0gICAgY291bnQgPSBjb3VudCAtIHNlY3MgKiAxMDAwMDAwTDsKLSAgICBwcmludGYoIlRpbWUgdGFrZW46ICVsdS4lMDZsdSBzZWNvbmRzXG4iLHNlY3MsY291bnQpOwotfQotCi1pbnQgICAgIGksajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5PTiByZWdpc3RlciB2YXJpYWJsZXMhICovCi0KLWludCBtYWluKHZvaWQpCi17Ci0jaWZkZWYgIExPTkdfVEVTVAotICAgIHVsb25nICAgc3RhcnQsZmluaXNoOwotI2VuZGlmCi0KLSAgICBwcmludGYoIlByb2Nlc3NvciB0eXBlOiAlZCAlbGQgTUh6XG4iLCBDUFVfZ2V0UHJvY2Vzc29yVHlwZSgpLCBDUFVfZ2V0UHJvY2Vzc29yU3BlZWQodHJ1ZSkpOwotCi0gICAgWlRpbWVySW5pdCgpOwotCi0gICAgLyogVGVzdCB0aGUgbG9uZyBwZXJpb2QgWmVuIFRpbWVyICh3ZSBkb24ndCBjaGVjayBmb3Igb3ZlcmZsb3cgY296Ci0gICAgICogaXQgd291bGQgdGFrZSB0b29vb28gbG9uZyEpCi0gICAgICovCi0KLSAgICBMWlRpbWVyT24oKTsKLSAgICBmb3IgKGogPSAwOyBqIDwgMTA7IGorKykKLQlmb3IgKGkgPSAwOyBpIDwgMjAwMDA7IGkrKykKLQkgICAgaSA9IGk7Ci0gICAgTFpUaW1lck9mZigpOwotICAgIFJlcG9ydFRpbWUoTFpUaW1lckNvdW50KCkpOwotCi0gICAgLyogVGVzdCB0aGUgdWx0cmEgbG9uZyBwZXJpb2QgWmVuIFRpbWVyICovCi0jaWZkZWYgTE9OR19URVNUCi0gICAgc3RhcnQgPSBVTFpSZWFkVGltZSgpOwotICAgIGRlbGF5KERFTEFZX1NFQ1MgKiAxMDAwKTsKLSAgICBmaW5pc2ggPSBVTFpSZWFkVGltZSgpOwotICAgIHByaW50ZigiRGVsYXkgb2YgJWQgc2VjcyB0b29rICVkIDEvMTB0aHMgb2YgYSBzZWNvbmRcbiIsCi0JREVMQVlfU0VDUyxVTFpFbGFwc2VkVGltZShzdGFydCxmaW5pc2gpKTsKLSNlbmRpZgotCi0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy90aW1lcmNwcC5jcHAgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy90aW1lcmNwcC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNThhNGIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdGVzdHMvdGltZXJjcHAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEMrKyAzLjAKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gZm9yIHRoZSBaZW4gVGltZXIgTGlicmFyeSBDKysgaW50ZXJmYWNlLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGlvc3RyZWFtLmg+Ci0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJ6dGltZXIuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotaW50ICAgICBpLGosazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOT04gcmVnaXN0ZXIgdmFyaWFibGVzISAqLwotCi12b2lkIGR1bW15KCkge30KLQotaW50IG1haW4odm9pZCkKLXsKLSAgICBMWlRpbWVyICAgICBsdGltZXI7Ci0gICAgVUxaVGltZXIgICAgdWx0aW1lcjsKLQotICAgIFpUaW1lckluaXQoKTsKLQotICAgIC8qIFRlc3QgdGhlIGxvbmcgcGVyaW9kIFplbiBUaW1lciAod2UgZG9uJ3QgY2hlY2sgZm9yIG92ZXJmbG93IGNvegotICAgICAqIGl0IHdvdWxkIHRha2UgdG9vb29vIGxvbmchKQotICAgICAqLwotCi0gICAgY291dCA8PCBlbmRsOwotICAgIHVsdGltZXIucmVzdGFydCgpOwotICAgIGx0aW1lci5zdGFydCgpOwotICAgIGZvciAoaiA9IDA7IGogPCAxMDsgaisrKQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjAwMDA7IGkrKykKLSAgICAgICAgICAgIGR1bW15KCk7Ci0gICAgbHRpbWVyLnN0b3AoKTsKLSAgICB1bHRpbWVyLnN0b3AoKTsKLSAgICBjb3V0IDw8ICJMQ291bnQ6ICAiIDw8IGx0aW1lci5jb3VudCgpIDw8IGVuZGw7Ci0gICAgY291dCA8PCAiVGltZTogICAgIiA8PCBsdGltZXIgPDwgIiBzZWNzXG4iOwotICAgIGNvdXQgPDwgIlVMQ291bnQ6ICIgPDwgdWx0aW1lci5jb3VudCgpIDw8IGVuZGw7Ci0gICAgY291dCA8PCAiVUxUaW1lOiAgIiA8PCB1bHRpbWVyIDw8ICIgc2Vjc1xuIjsKLQotICAgIGNvdXQgPDwgZW5kbCA8PCAiVGltaW5nIC4uLiBcbiI7Ci0gICAgdWx0aW1lci5yZXN0YXJ0KCk7Ci0gICAgbHRpbWVyLnJlc3RhcnQoKTsKLSAgICBmb3IgKGogPSAwOyBqIDwgMjAwOyBqKyspCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAyMDAwMDsgaSsrKQotICAgICAgICAgICAgZHVtbXkoKTsKLSAgICBsdGltZXIuc3RvcCgpOwotICAgIHVsdGltZXIuc3RvcCgpOwotICAgIGNvdXQgPDwgIkxDb3VudDogICIgPDwgbHRpbWVyLmNvdW50KCkgPDwgZW5kbDsKLSAgICBjb3V0IDw8ICJUaW1lOiAgICAiIDw8IGx0aW1lciA8PCAiIHNlY3NcbiI7Ci0gICAgY291dCA8PCAiVUxDb3VudDogIiA8PCB1bHRpbWVyLmNvdW50KCkgPDwgZW5kbDsKLSAgICBjb3V0IDw8ICJVTFRpbWU6ICAiIDw8IHVsdGltZXIgPDwgIiBzZWNzXG4iOwotCi0gICAgLyogVGVzdCB0aGUgbGFwIGZ1bmN0aW9uIG9mIHRoZSBsb25nIHBlcmlvZCBaZW4gVGltZXIgKi8KLQotICAgIGNvdXQgPDwgZW5kbCA8PCAiVGltaW5nIC4uLiBcbiI7Ci0gICAgdWx0aW1lci5yZXN0YXJ0KCk7Ci0gICAgbHRpbWVyLnJlc3RhcnQoKTsKLSAgICBmb3IgKGogPSAwOyBqIDwgMjA7IGorKykgewotICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMTA7IGsrKykKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyMDAwMDsgaSsrKQotICAgICAgICAgICAgICAgIGR1bW15KCk7Ci0gICAgICAgIGNvdXQgPDwgImxhcDogIiA8PCBsdGltZXIubGFwKCkgPDwgZW5kbDsKLSAgICAgICAgfQotICAgIGx0aW1lci5zdG9wKCk7Ci0gICAgdWx0aW1lci5zdG9wKCk7Ci0gICAgY291dCA8PCAiTENvdW50OiAgIiA8PCBsdGltZXIuY291bnQoKSA8PCBlbmRsOwotICAgIGNvdXQgPDwgIlRpbWU6ICAgICIgPDwgbHRpbWVyIDw8ICIgc2Vjc1xuIjsKLSAgICBjb3V0IDw8ICJVTENvdW50OiAiIDw8IHVsdGltZXIuY291bnQoKSA8PCBlbmRsOwotICAgIGNvdXQgPDwgIlVMVGltZTogICIgPDwgdWx0aW1lciA8PCAiIHNlY3NcbiI7Ci0KLSNpZmRlZiAgTE9OR19URVNUCi0gICAgLyogVGVzdCB0aGUgdWx0cmEgbG9uZyBwZXJpb2QgWmVuIFRpbWVyICovCi0KLSAgICB1bHRpbWVyLnN0YXJ0KCk7Ci0gICAgZGVsYXkoREVMQVlfU0VDUyAqIDEwMDApOwotICAgIHVsdGltZXIuc3RvcCgpOwotICAgIGNvdXQgPDwgIkRlbGF5IG9mICIgPDwgREVMQVlfU0VDUyA8PCAiIHNlY3MgdG9vayAiIDw8IHVsdGltZXIuY291bnQoKQotICAgICAgICAgPDwgIiAxLzEwdGhzIG9mIGEgc2Vjb25kXG4iOwotICAgIGNvdXQgPDwgIlRpbWU6ICIgPDwgdWx0aW1lciA8PCAiIHNlY3NcbiI7Ci0jZW5kaWYKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3Vzd2MuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3Vzd2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBjN2JkNi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy91c3djLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgYW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgU2ltcGxlIHRlc3QgcHJvZ3JhbSB0byB0ZXN0IHRoZSB3cml0ZSBjb21iaW5lIGZ1bmN0aW9ucy4KLSoKLSogICAgICAgICAgICAgICBOb3RlIHRoYXQgdGhpcyBwcm9ncmFtIHNob3VsZCBuZXZlciBiZSB1c2VkIGluIGEgcHJvZHVjdGlvbgotKiAgICAgICAgICAgICAgIGVudmlyb25tZW50LCBiZWNhdXNlIHdyaXRlIGNvbWJpbmluZyBuZWVkcyB0byBiZSBoYW5kbGVkCi0qICAgICAgICAgICAgICAgd2l0aCBtb3JlIGludGltYXRlIGtub3dsZWRnZSBvZiB0aGUgZGlzcGxheSBoYXJkd2FyZSB0aGFuCi0qICAgICAgICAgICAgICAgeW91IGNhbiBvYnRhaW4gYnkgc2ltcGx5IGV4YW1pbmluZyB0aGUgUENJIGNvbmZpZ3VyYXRpb24KLSogICAgICAgICAgICAgICBzcGFjZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgInBjaWxpYi5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQgICAgICAgICAgICAgIE51bVBDSSA9IC0xOwotc3RhdGljIFBDSURldmljZUluZm8gICAgKlBDSTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICpCcmlkZ2VJbmRleDsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICpEZXZpY2VJbmRleDsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgIE51bUJyaWRnZXM7Ci1zdGF0aWMgUENJRGV2aWNlSW5mbyAgICAqQUdQQnJpZGdlID0gTlVMTDsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgIE51bURldmljZXM7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVRVUk5TOgotTnVtYmVyIG9mIGRpc3BsYXkgZGV2aWNlcyBmb3VuZC4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gZW51bWVyYXRlcyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBkaXNwbGF5IGRldmljZXMgb24gdGhlCi1QQ0kgYnVzLCBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIGZvdW5kLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgUENJX2VudW1lcmF0ZURldmljZXModm9pZCkKLXsKLSAgICBpbnQgICAgICAgICAgICAgaSxqOwotICAgIFBDSURldmljZUluZm8gICAqaW5mbzsKLQotICAgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSBiZWVuIGNhbGxlZCwgZW51bWVyYXRlIGFsbCAqLwotICAgIC8qIGRldmljZXMgb24gdGhlIFBDSSBidXMuICovCi0gICAgaWYgKE51bVBDSSA9PSAtMSkgewotCWlmICgoTnVtUENJID0gUENJX2dldE51bURldmljZXMoKSkgPT0gMCkKLQkgICAgcmV0dXJuIC0xOwotCVBDSSA9IG1hbGxvYyhOdW1QQ0kgKiBzaXplb2YoUENJWzBdKSk7Ci0JQnJpZGdlSW5kZXggPSBtYWxsb2MoTnVtUENJICogc2l6ZW9mKEJyaWRnZUluZGV4WzBdKSk7Ci0JRGV2aWNlSW5kZXggPSBtYWxsb2MoTnVtUENJICogc2l6ZW9mKERldmljZUluZGV4WzBdKSk7Ci0JaWYgKCFQQ0kgfHwgIUJyaWRnZUluZGV4IHx8ICFEZXZpY2VJbmRleCkKLQkgICAgcmV0dXJuIC0xOwotCWZvciAoaSA9IDA7IGkgPCBOdW1QQ0k7IGkrKykKLQkgICAgUENJW2ldLmR3U2l6ZSA9IHNpemVvZihQQ0lbaV0pOwotCWlmIChQQ0lfZW51bWVyYXRlKFBDSSkgPT0gMCkKLQkgICAgcmV0dXJuIC0xOwotCi0JLyogQnVpbGQgYSBsaXN0IG9mIGFsbCBQQ0kgYnJpZGdlIGRldmljZXMgKi8KLQlmb3IgKGkgPSAwLE51bUJyaWRnZXMgPSAwLEJyaWRnZUluZGV4WzBdID0gLTE7IGkgPCBOdW1QQ0k7IGkrKykgewotCSAgICBpZiAoUENJW2ldLkJhc2VDbGFzcyA9PSBQQ0lfQlJJREdFX0NMQVNTKQotCQlCcmlkZ2VJbmRleFtOdW1CcmlkZ2VzKytdID0gaTsKLQkgICAgfQotCi0JLyogTm93IGJ1aWxkIGEgbGlzdCBvZiBhbGwgZGlzcGxheSBjbGFzcyBkZXZpY2VzICovCi0JZm9yIChpID0gMCxOdW1EZXZpY2VzID0gMSxEZXZpY2VJbmRleFswXSA9IC0xOyBpIDwgTnVtUENJOyBpKyspIHsKLQkgICAgaWYgKFBDSV9JU19ESVNQTEFZX0NMQVNTKCZQQ0lbaV0pKSB7Ci0JCWlmICgoUENJW2ldLkNvbW1hbmQgJiAweDMpID09IDB4MykKLQkJICAgIERldmljZUluZGV4WzBdID0gaTsKLQkJZWxzZQotCQkgICAgRGV2aWNlSW5kZXhbTnVtRGV2aWNlcysrXSA9IGk7Ci0JCWlmIChQQ0lbaV0uc2xvdC5wLkJ1cyAhPSAwKSB7Ci0JCSAgICAvKiBUaGlzIGRldmljZSBpcyBvbiBhIGRpZmZlcmVudCBidXMgdGhhbiB0aGUgcHJpbWFyeSAqLwotCQkgICAgLyogUENJIGJ1cywgc28gaXQgaXMgcHJvYmFibHkgYW4gQUdQIGRldmljZS4gRmluZCB0aGUgKi8KLQkJICAgIC8qIEFHUCBidXMgZGV2aWNlIHRoYXQgY29udHJvbHMgdGhhdCBidXMgc28gd2UgY2FuICovCi0JCSAgICAvKiBjb250cm9sIGl0LiAqLwotCQkgICAgZm9yIChqID0gMDsgaiA8IE51bUJyaWRnZXM7IGorKykgewotCQkJaW5mbyA9IChQQ0lEZXZpY2VJbmZvKikmUENJW0JyaWRnZUluZGV4W2pdXTsKLQkJCWlmIChpbmZvLT51LnR5cGUxLlNlY29uZGF5QnVzTnVtYmVyID09IFBDSVtpXS5zbG90LnAuQnVzKSB7Ci0JCQkgICAgQUdQQnJpZGdlID0gaW5mbzsKLQkJCSAgICBicmVhazsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLSAgICByZXR1cm4gTnVtRGV2aWNlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1FbnVtZXJhdGVzIHVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCBhdHRhY2hlZCBkaXNwbGF5IGRldmljZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgU2hvd0Rpc3BsYXlEZXZpY2VzKHZvaWQpCi17Ci0gICAgaW50IGksaW5kZXg7Ci0KLSAgICBwcmludGYoIkRpc3BsYXlpbmcgZW51bWVyYXRpb24gb2YgJWQgUENJIGRpc3BsYXkgZGV2aWNlc1xuIiwgTnVtRGV2aWNlcyk7Ci0gICAgcHJpbnRmKCJcbiIpOwotICAgIHByaW50ZigiRGV2aWNlSUQgIFN1YlN5c3RlbSAgQmFzZTEwaCAgKGxlbmd0aCAgKSAgQmFzZTE0aCAgKGxlbmd0aCAgKVxuIik7Ci0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTnVtRGV2aWNlczsgaW5kZXgrKykgewotCWkgPSBEZXZpY2VJbmRleFtpbmRleF07Ci0JcHJpbnRmKCIlMDRYOiUwNFggJTA0WDolMDRYICAlMDhsWCAoJTZsZCBLQikgJTA4bFggKCU2bGQgS0IpXG4iLAotCSAgICBQQ0lbaV0uVmVuZG9ySUQsCi0JICAgIFBDSVtpXS5EZXZpY2VJRCwKLQkgICAgUENJW2ldLnUudHlwZTAuU3ViU3lzdGVtVmVuZG9ySUQsCi0JICAgIFBDSVtpXS51LnR5cGUwLlN1YlN5c3RlbUlELAotCSAgICBQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczEwLAotCSAgICBQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczEwTGVuIC8gMTAyNCwKLQkgICAgUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxNCwKLQkgICAgUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxNExlbiAvIDEwMjQpOwotCX0KLSAgICBwcmludGYoIlxuIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRHVtcHMgdGhlIHZhbHVlIGZvciBhIHdyaXRlIGNvbWJpbmUgcmVnaW9uIHRvIHRoZSBkaXNwbGF5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBjaGFyICpEZWNvZGVXQ1R5cGUoCi0gICAgdWludCB0eXBlKQotewotICAgIHN0YXRpYyBjaGFyICpuYW1lc1tdID0gewotCSJVTkNBQ0hBQkxFIiwKLQkiV1JDT01CIiwKLQkiVU5LTk9XTiIsCi0JIlVOS05PV04iLAotCSJXUlRIUk9VR0giLAotCSJXUlBST1QiLAotCSJXUkJBQ0siLAotCX07Ci0gICAgaWYgKHR5cGUgPD0gUE1fTVRSUl9NQVgpCi0JcmV0dXJuIG5hbWVzW3R5cGVdOwotICAgIHJldHVybiAiVU5LTk9XTiI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRHVtcHMgdGhlIHZhbHVlIGZvciBhIHdyaXRlIGNvbWJpbmUgcmVnaW9uIHRvIHRoZSBkaXNwbGF5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIFBNQVBJIEVudW1Xcml0ZUNvbWJpbmUoCi0gICAgdWxvbmcgYmFzZSwKLSAgICB1bG9uZyBsZW5ndGgsCi0gICAgdWludCB0eXBlKQotewotICAgIHByaW50ZigiJTA4bFggJS0xMGxkICVzXG4iLCBiYXNlLCBsZW5ndGggLyAxMDI0LCBEZWNvZGVXQ1R5cGUodHlwZSkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWVyciAtIEVycm9yIHRvIGxvZwotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gbG9nIGFuIGVycm9yIG1lc3NhZ2UgaWYgdGhlIE1UUlIgd3JpdGUgY29tYmluaW5nIGF0dGVtcHQgZmFpbGVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIExvZ01UUlJFcnJvcigKLSAgICBpbnQgZXJyKQotewotICAgIGlmIChlcnIgPT0gUE1fTVRSUl9FUlJfT0spCi0JcmV0dXJuOwotICAgIHN3aXRjaCAoZXJyKSB7Ci0JY2FzZSBQTV9NVFJSX05PVF9TVVBQT1JURUQ6Ci0JICAgIHByaW50ZigiRmFpbGVkOiBNVFJSIGlzIG5vdCBzdXBwb3J0ZWQgYnkgaG9zdCBDUFVcbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNX01UUlJfRVJSX1BBUkFNUzoKLQkgICAgcHJpbnRmKCJGYWlsZWQ6IEludmFsaWQgcGFyYW1ldGVycyBwYXNzZWQgdG8gUE1fZW5hYmxlV3JpdGVDb21iaW5lZCFcbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNX01UUlJfRVJSX05PVF80S0JfQUxJR05FRDoKLQkgICAgcHJpbnRmKCJGYWlsZWQ6IEFkZHJlc3MgaXMgbm90IDRLYiBhbGlnbmVkIVxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fTVRSUl9FUlJfQkVMT1dfMU1COgotCSAgICBwcmludGYoIkZhaWxlZDogQWRkcmVzc2VzIGJlbG93IDFNYiBjYW5ub3QgYmUgd3JpdGUgY29tYmluZWQhXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV9NVFJSX0VSUl9OT1RfQUxJR05FRDoKLQkgICAgcHJpbnRmKCJGYWlsZWQ6IEFkZHJlc3MgaXMgbm90IGNvcnJlY3RseSBhbGlnbmVkIGZvciBwcm9jZXNzb3IhXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV9NVFJSX0VSUl9PVkVSTEFQOgotCSAgICBwcmludGYoIkZhaWxlZDogQWRkcmVzcyBvdmVybGFwcyBhbiBleGlzdGluZyByZWdpb24hXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV9NVFJSX0VSUl9UWVBFX01JU01BVENIOgotCSAgICBwcmludGYoIkZhaWxlZDogQWRyZXNzIGlzIGNvbnRhaW5lZCB3aXRoIGV4aXN0aW5nIHJlZ2lvbiwgYnV0IHR5cGUgaXMgZGlmZmVyZW50IVxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fTVRSUl9FUlJfTk9ORV9GUkVFOgotCSAgICBwcmludGYoIkZhaWxlZDogT3V0IG9mIE1UUlIgcmVnaXN0ZXJzIVxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fTVRSUl9FUlJfTk9XUkNPTUI6Ci0JICAgIHByaW50ZigiRmFpbGVkOiBUaGlzIHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IHdyaXRlIGNvbWJpbmluZyFcbiIpOwotCSAgICBicmVhazsKLQljYXNlIFBNX01UUlJfRVJSX05PX09TX1NVUFBPUlQ6Ci0JICAgIHByaW50ZigiRmFpbGVkOiBNVFJSIGlzIG5vdCBzdXBwb3J0ZWQgYnkgaG9zdCBPU1xuIik7Ci0JICAgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAgIHByaW50ZigiRmFpbGVkOiBVTktOT1dOIEVSUk9SIVxuIik7Ci0JICAgIGJyZWFrOwotCX0KLSAgICBleGl0KC0xKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TaG93cyBhbGwgd3JpdGUgY29tYmluZSByZWdpb25zLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIFNob3dXcml0ZUNvbWJpbmUodm9pZCkKLXsKLSAgICBwcmludGYoIkJhc2UgICAgIExlbmd0aChLQikgVHlwZVxuIik7Ci0gICAgTG9nTVRSUkVycm9yKFBNX2VudW1Xcml0ZUNvbWJpbmUoRW51bVdyaXRlQ29tYmluZSkpOwotICAgIHByaW50ZigiXG4iKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EdW1wcyB0aGUgdmFsdWUgZm9yIGEgd3JpdGUgY29tYmluZSByZWdpb24gdG8gdGhlIGRpc3BsYXkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgRW5hYmxlV3JpdGVDb21iaW5lKHZvaWQpCi17Ci0gICAgaW50IGksaW5kZXg7Ci0KLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOdW1EZXZpY2VzOyBpbmRleCsrKSB7Ci0JaSA9IERldmljZUluZGV4W2luZGV4XTsKLQlpZiAoUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxMCAmIDB4OCkgewotCSAgICBMb2dNVFJSRXJyb3IoUE1fZW5hYmxlV3JpdGVDb21iaW5lKAotCQlQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczEwICYgMHhGRkZGRkZGMCwKLQkJUENJW2ldLnUudHlwZTAuQmFzZUFkZHJlc3MxMExlbiwKLQkJUE1fTVRSUl9XUkNPTUIpKTsKLQkgICAgfQotCWlmIChQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczE0ICYgMHg4KSB7Ci0JICAgIExvZ01UUlJFcnJvcihQTV9lbmFibGVXcml0ZUNvbWJpbmUoCi0JCVBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTQgJiAweEZGRkZGRkYwLAotCQlQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczE0TGVuLAotCQlQTV9NVFJSX1dSQ09NQikpOwotCSAgICB9Ci0JfQotICAgIHByaW50ZigiXG4iKTsKLSAgICBTaG93RGlzcGxheURldmljZXMoKTsKLSAgICBTaG93V3JpdGVDb21iaW5lKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRHVtcHMgdGhlIHZhbHVlIGZvciBhIHdyaXRlIGNvbWJpbmUgcmVnaW9uIHRvIHRoZSBkaXNwbGF5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIERpc2FibGVXcml0ZUNvbWJpbmUodm9pZCkKLXsKLSAgICBpbnQgaSxpbmRleDsKLQotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IE51bURldmljZXM7IGluZGV4KyspIHsKLQlpID0gRGV2aWNlSW5kZXhbaW5kZXhdOwotCWlmIChQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczEwICYgMHg4KSB7Ci0JICAgIExvZ01UUlJFcnJvcihQTV9lbmFibGVXcml0ZUNvbWJpbmUoCi0JCVBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTAgJiAweEZGRkZGRkYwLAotCQlQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczEwTGVuLAotCQlQTV9NVFJSX1VOQ0FDSEFCTEUpKTsKLQkgICAgfQotCWlmIChQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczE0ICYgMHg4KSB7Ci0JICAgIExvZ01UUlJFcnJvcihQTV9lbmFibGVXcml0ZUNvbWJpbmUoCi0JCVBDSVtpXS51LnR5cGUwLkJhc2VBZGRyZXNzMTQgJiAweEZGRkZGRkYwLAotCQlQQ0lbaV0udS50eXBlMC5CYXNlQWRkcmVzczE0TGVuLAotCQlQTV9NVFJSX1VOQ0FDSEFCTEUpKTsKLQkgICAgfQotCX0KLSAgICBwcmludGYoIlxuIik7Ci0gICAgU2hvd0Rpc3BsYXlEZXZpY2VzKCk7Ci0gICAgU2hvd1dyaXRlQ29tYmluZSgpOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10pCi17Ci0gICAgUE1faW5pdCgpOwotICAgIGlmIChQQ0lfZW51bWVyYXRlRGV2aWNlcygpIDwgMSkgewotCXByaW50ZigiTm8gUENJIGRpc3BsYXkgZGV2aWNlcyBmb3VuZCFcbiIpOwotCXJldHVybiAtMTsKLQl9Ci0gICAgaWYgKGFyZ2MgPCAyKSB7Ci0JcHJpbnRmKCJ1c2FnZTogdXN3YyBbLXNob3cgLW9uIC1vZmZdXG5cbiIpOwotCVNob3dEaXNwbGF5RGV2aWNlcygpOwotCXJldHVybiAtMTsKLQl9Ci0gICAgaWYgKHN0cmljbXAoYXJndlsxXSwiLXNob3ciKSA9PSAwKQotCVNob3dXcml0ZUNvbWJpbmUoKTsKLSAgICBlbHNlIGlmIChzdHJpY21wKGFyZ3ZbMV0sIi1vbiIpID09IDApCi0JRW5hYmxlV3JpdGVDb21iaW5lKCk7Ci0gICAgZWxzZSBpZiAoc3RyaWNtcChhcmd2WzFdLCItb2ZmIikgPT0gMCkKLQlEaXNhYmxlV3JpdGVDb21iaW5lKCk7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy92ZnRlc3QuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3ZmdGVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2UzYmI3Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3ZmdGVzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIEZpbGVuYW1lOiAgICAgJFdvcmtmaWxlJAotKiBWZXJzaW9uOiAgICAgICRSZXZpc2lvbjogMS4xICQKLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBhbnkKLSoKLSogRGVzY3JpcHRpb246ICBUZXN0IHByb2dyYW0gdG8gdGVzdCB0aGUgVkZsYXQgdmlydHVhbCBmcmFtZWJ1ZmZlciBmdW5jdGlvbnMuCi0qCi0qICAgICAgICAgICAgICAgRnVuY3Rpb25zIHRlc3RlZDogICBWRl9hdmFpbGFibGUoKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkZfaW5pdCgpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRl9leGl0KCkKLSoKLSogJERhdGU6IDIwMDIvMTAvMDIgMTU6MzU6MjEgJCAkQXV0aG9yOiBoZnJpZWRlbiAkCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJwbWFwaS5oIgotCi11Y2hhciBjb2RlW10gPSB7Ci0gICAgMHhDMywgICAgICAgICAgICAgICAgICAgLyogcmV0ICAgICAgICAgICovCi0gICAgfTsKLQotaW50IG1haW4odm9pZCkKLXsKLSAgICB2b2lkICAgICp2ZkJ1ZmZlcjsKLQotICAgIHByaW50ZigiUHJvZ3JhbSBydW5uaW5nIGluICIpOwotICAgIHN3aXRjaCAoUE1fZ2V0TW9kZVR5cGUoKSkgewotCWNhc2UgUE1fcmVhbE1vZGU6Ci0JICAgIHByaW50ZigicmVhbCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8yODY6Ci0JICAgIHByaW50ZigiMTYgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBQTV8zODY6Ci0JICAgIHByaW50ZigiMzIgYml0IHByb3RlY3RlZCBtb2RlLlxuXG4iKTsKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgaWYgKCFWRl9hdmFpbGFibGUoKSkgewotCXByaW50ZigiVmlydHVhbCBMaW5lYXIgRnJhbWVidWZmZXIgbm90IGF2YWlsYWJsZS5cbiIpOwotCWV4aXQoMSk7Ci0JfQotCi0gICAgdmZCdWZmZXIgPSBWRl9pbml0KDB4QTAwMDAsNjQsc2l6ZW9mKGNvZGUpLGNvZGUpOwotICAgIGlmICghdmZCdWZmZXIpIHsKLQlwcmludGYoIkZhaWx1cmUgdG8gaW5pdGlhbGlzZSBWaXJ0dWFsIExpbmVhciBGcmFtZWJ1ZmZlciFcbiIpOwotCWV4aXQoMSk7Ci0JfQotICAgIFZGX2V4aXQoKTsKLSAgICBwcmludGYoIlZpcnR1YWwgTGluZWFyIEZyYW1lYnVmZmVyIHNldCB1cCBzdWNjZXNzZnVsbHkhXG4iKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3ZpZGVvLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS90ZXN0cy92aWRlby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmFkY2RkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Rlc3RzL3ZpZGVvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgYW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGVzdCBwcm9ncmFtIHRvIGNoZWNrIHRoZSBhYmlsaXR5IHRvIGdlbmVyYXRlIHJlYWwgbW9kZQotKiAgICAgICAgICAgICAgIGludGVycnVwdHMgYW5kIHRvIGJlIGFibGUgdG8gb2J0YWluIGRpcmVjdCBhY2Nlc3MgdG8gdGhlCi0qICAgICAgICAgICAgICAgdmlkZW8gbWVtb3J5IGZyb20gcHJvdGVjdGVkIG1vZGUuIENvbXBpbGUgYW5kIGxpbmsgd2l0aAotKiAgICAgICAgICAgICAgIHRoZSBhcHByb3ByaWF0ZSBjb21tYW5kIGxpbmUgZm9yIHlvdXIgRE9TIGV4dGVuZGVyLgotKgotKiAgICAgICAgICAgICAgIEZ1bmN0aW9ucyB0ZXN0ZWQ6ICAgUE1fZ2V0QklPU1NlbGVjdG9yKCkKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX21hcFBoeXNpY2FsQWRkcigpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9pbnQ4NigpCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJwbWFwaS5oIgotCi11Y2hhciAgICpiaW9zOyAgICAgICAgICAvKiBQb2ludGVyIHRvIEJJT1MgZGF0YSBhcmVhICAgICAgICAqLwotdWNoYXIgICAqdmlkZW9QdHI7ICAgICAgLyogUG9pbnRlciB0byBWR0EgZnJhbWVidWZmZXIgICAgICAgKi8KLXZvaWQgICAgKnN0YXRlQnVmOyAgICAgIC8qIENvbnNvbGUgc3RhdGUgc2F2ZSBidWZmZXIgICAgICAgICovCi0KLS8qIFJvdXRpbmUgdG8gcmV0dXJuIHRoZSBjdXJyZW50IHZpZGVvIG1vZGUgbnVtYmVyICovCi0KLWludCBnZXRWaWRlb01vZGUodm9pZCkKLXsKLSAgICByZXR1cm4gUE1fZ2V0Qnl0ZShiaW9zKzB4NDkpOwotfQotCi0vKiBSb3V0aW5lIHRvIHNldCBhIHNwZWNpZmllZCB2aWRlbyBtb2RlICovCi0KLXZvaWQgc2V0VmlkZW9Nb2RlKGludCBtb2RlKQotewotICAgIFJNUkVHUyByOwotCi0gICAgci54LmF4ID0gbW9kZTsKLSAgICBQTV9pbnQ4NigweDEwLCAmciwgJnIpOwotfQotCi0vKiBSb3V0aW5lIHRvIGNsZWFyIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIG9uIHRoZSBkaXNwbGF5IGJ5IGNhbGxpbmcgdGhlCi0gKiB2aWRlbyBCSU9TLgotICovCi0KLXZvaWQgY2xlYXJTY3JlZW4oaW50IHN0YXJ0eCwgaW50IHN0YXJ0eSwgaW50IGVuZHgsIGludCBlbmR5LCB1bnNpZ25lZCBjaGFyIGF0dHIpCi17Ci0gICAgUk1SRUdTIHI7Ci0KLSAgICByLnguYXggPSAweDA2MDA7Ci0gICAgci5oLmJoID0gYXR0cjsKLSAgICByLmguY2wgPSBzdGFydHg7Ci0gICAgci5oLmNoID0gc3RhcnR5OwotICAgIHIuaC5kbCA9IGVuZHg7Ci0gICAgci5oLmRoID0gZW5keTsKLSAgICBQTV9pbnQ4NigweDEwLCAmciwgJnIpOwotfQotCi0vKiBSb3V0aW5lIHRvIGZpbGwgYSByZWN0YW5ndWxhciByZWdpb24gb24gdGhlIGRpc3BsYXkgdXNpbmcgZGlyZWN0Ci0gKiB2aWRlbyB3cml0ZXMuCi0gKi8KLQotI2RlZmluZSBTQ1JFRU4oeCx5KSAodmlkZW9QdHIgKyAoKHkpICogMTYwKSArICgoeCkgPDwgMSkpCi0KLXZvaWQgZmlsbChpbnQgc3RhcnR4LCBpbnQgc3RhcnR5LCBpbnQgZW5keCwgaW50IGVuZHksIHVuc2lnbmVkIGNoYXIgYywKLSAgICB1bnNpZ25lZCBjaGFyIGF0dHIpCi17Ci0gICAgdW5zaWduZWQgY2hhciAgICp2OwotICAgIGludCAgICAgICAgICAgICB4LHk7Ci0KLSAgICBmb3IgKHkgPSBzdGFydHk7IHkgPD0gZW5keTsgeSsrKSB7Ci0JdiA9IFNDUkVFTihzdGFydHgseSk7Ci0JZm9yICh4ID0gc3RhcnR4OyB4IDw9IGVuZHg7IHgrKykgewotCSAgICAqdisrID0gYzsKLQkgICAgKnYrKyA9IGF0dHI7Ci0JICAgIH0KLQl9Ci19Ci0KLS8qIFJvdXRpbmUgdG8gZGlzcGxheSBhIHNpbmdsZSBjaGFyYWN0ZXIgdXNpbmcgZGlyZWN0IHZpZGVvIHdyaXRlcyAqLwotCi12b2lkIHdyaXRlQ2hhcihpbnQgeCwgaW50IHksIHVuc2lnbmVkIGNoYXIgYywgdW5zaWduZWQgY2hhciBhdHRyKQotewotICAgIHVuc2lnbmVkIGNoYXIgKnYgPSBTQ1JFRU4oeCx5KTsKLSAgICAqdisrID0gYzsKLSAgICAqdiA9IGF0dHI7Ci19Ci0KLS8qIFJvdXRpbmUgdG8gZHJhdyBhIGJvcmRlciBhcm91bmQgYSByZWN0YW5ndWxhciBhcmVhIHVzaW5nIGRpcmVjdCB2aWRlbwotICogd3JpdGVzLgotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGJvcmRlcl9jaGFyc1tdID0gewotICAgIDE4NiwgMjA1LCAyMDEsIDE4NywgMjAwLCAxODggICAgICAgIC8qIGRvdWJsZSBib3ggY2hhcnMgKi8KLSAgICB9OwotCi12b2lkIGJvcmRlcihpbnQgc3RhcnR4LCBpbnQgc3RhcnR5LCBpbnQgZW5keCwgaW50IGVuZHksIHVuc2lnbmVkIGNoYXIgYXR0cikKLXsKLSAgICB1bnNpZ25lZCBjaGFyICAgKnY7Ci0gICAgdW5zaWduZWQgY2hhciAgICpiOwotICAgIGludCAgICAgICAgICAgICBpOwotCi0gICAgYiA9IGJvcmRlcl9jaGFyczsKLQotICAgIGZvciAoaSA9IHN0YXJ0eSsxOyBpIDwgZW5keTsgaSsrKSB7Ci0Jd3JpdGVDaGFyKHN0YXJ0eCwgaSwgKmIsIGF0dHIpOwotCXdyaXRlQ2hhcihlbmR4LCBpLCAqYiwgYXR0cik7Ci0JfQotICAgIGIrKzsKLSAgICBmb3IgKGkgPSBzdGFydHgrMSwgdiA9IFNDUkVFTihzdGFydHgrMSwgc3RhcnR5KTsgaSA8IGVuZHg7IGkrKykgewotCSp2KysgPSAqYjsKLQkqdisrID0gYXR0cjsKLQl9Ci0gICAgZm9yIChpID0gc3RhcnR4KzEsIHYgPSBTQ1JFRU4oc3RhcnR4KzEsIGVuZHkpOyBpIDwgZW5keDsgaSsrKSB7Ci0JKnYrKyA9ICpiOwotCSp2KysgPSBhdHRyOwotCX0KLSAgICBiKys7Ci0gICAgd3JpdGVDaGFyKHN0YXJ0eCwgc3RhcnR5LCAqYisrLCBhdHRyKTsKLSAgICB3cml0ZUNoYXIoZW5keCwgc3RhcnR5LCAqYisrLCBhdHRyKTsKLSAgICB3cml0ZUNoYXIoc3RhcnR4LCBlbmR5LCAqYisrLCBhdHRyKTsKLSAgICB3cml0ZUNoYXIoZW5keCwgZW5keSwgKmIrKywgYXR0cik7Ci19Ci0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgaW50ICAgICBvcmdNb2RlOwotICAgIFBNX0hXTkQgaHduZENvbnNvbGU7Ci0KLSAgICBwcmludGYoIlByb2dyYW0gcnVubmluZyBpbiAiKTsKLSAgICBzd2l0Y2ggKFBNX2dldE1vZGVUeXBlKCkpIHsKLQljYXNlIFBNX3JlYWxNb2RlOgotCSAgICBwcmludGYoInJlYWwgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMjg2OgotCSAgICBwcmludGYoIjE2IGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUE1fMzg2OgotCSAgICBwcmludGYoIjMyIGJpdCBwcm90ZWN0ZWQgbW9kZS5cblxuIik7Ci0JICAgIGJyZWFrOwotCX0KLQotICAgIGh3bmRDb25zb2xlID0gUE1fb3BlbkNvbnNvbGUoMCwwLDAsMCwwLHRydWUpOwotICAgIHByaW50ZigiSGl0IGFueSBrZXkgdG8gc3RhcnQgODB4MjUgdGV4dCBtb2RlIGFuZCBwZXJmb3JtIHNvbWUgZGlyZWN0IHZpZGVvIG91dHB1dC5cbiIpOwotICAgIFBNX2dldGNoKCk7Ci0KLSAgICAvKiBBbGxvY2F0ZSBhIGJ1ZmZlciB0byBzYXZlIGNvbnNvbGUgc3RhdGUgYW5kIHNhdmUgdGhlIHN0YXRlICovCi0gICAgaWYgKChzdGF0ZUJ1ZiA9IFBNX21hbGxvYyhQTV9nZXRDb25zb2xlU3RhdGVTaXplKCkpKSA9PSBOVUxMKSB7Ci0JcHJpbnRmKCJVbmFibGUgdG8gYWxsb2NhdGUgY29uc29sZSBzdGF0ZSBidWZmZXIhXG4iKTsKLQlleGl0KDEpOwotCX0KLSAgICBQTV9zYXZlQ29uc29sZVN0YXRlKHN0YXRlQnVmLDApOwotICAgIGJpb3MgPSBQTV9nZXRCSU9TUG9pbnRlcigpOwotICAgIG9yZ01vZGUgPSBnZXRWaWRlb01vZGUoKTsKLSAgICBzZXRWaWRlb01vZGUoMHgzKTsKLSAgICBpZiAoKHZpZGVvUHRyID0gUE1fbWFwUGh5c2ljYWxBZGRyKDB4QjgwMDAsMHhGRkZGLHRydWUpKSA9PSBOVUxMKSB7Ci0JcHJpbnRmKCJVbmFibGUgdG8gb2J0YWluIHBvaW50ZXIgdG8gZnJhbWVidWZmZXIhXG4iKTsKLQlleGl0KDEpOwotCX0KLQotICAgIC8qIERyYXcgc29tZSB0ZXh0IG9uIHRoZSBzY3JlZW4gKi8KLSAgICBmaWxsKDAsIDAsIDc5LCAyNCwgMTc2LCAweDFFKTsKLSAgICBib3JkZXIoMCwgMCwgNzksIDI0LCAweDFGKTsKLSAgICBQTV9nZXRjaCgpOwotICAgIGNsZWFyU2NyZWVuKDAsIDAsIDc5LCAyNCwgMHg3KTsKLQotICAgIC8qIFJlc3RvcmUgdGhlIGNvbnNvbGUgc3RhdGUgb24gZXhpdCAqLwotICAgIFBNX3Jlc3RvcmVDb25zb2xlU3RhdGUoc3RhdGVCdWYsMCk7Ci0gICAgUE1fZnJlZShzdGF0ZUJ1Zik7Ci0gICAgUE1fY2xvc2VDb25zb2xlKGh3bmRDb25zb2xlKTsKLQotICAgIC8qIERpc3BsYXkgdXNlZnVsIHN0YXR1cyBpbmZvcm1hdGlvbiAqLwotICAgIHByaW50ZigiXG4iKTsKLSAgICBwcmludGYoIk9yaWdpbmFsIFZpZGVvIE1vZGUgPSAlMDJYXG4iLCBvcmdNb2RlKTsKLSAgICBwcmludGYoIkJJT1MgUG9pbnRlciA9ICUwOFhcbiIsIChpbnQpYmlvcyk7Ci0gICAgcHJpbnRmKCJWaWRlbyBNZW1vcnkgPSAlMDhYXG4iLCAoaW50KXZpZGVvUHRyKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3ZkZC9jcHVpbmZvLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92ZGQvY3B1aW5mby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDYwYjcyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3ZkZC9jcHVpbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICAgICAgICBVbHRyYSBMb25nIFBlcmlvZCBUaW1lcgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgT1MvMiBWREQKLSoKLSogRGVzY3JpcHRpb246ICBWREQgc3BlY2lmaWMgY29kZSBmb3IgdGhlIENQVSBkZXRlY3Rpb24gbW9kdWxlLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EbyBub3RoaW5nIGZvciBWREQncwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgU2V0TWF4VGhyZWFkUHJpb3JpdHkoKSAgICAgIDAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EbyBub3RoaW5nIGZvciBWREQncwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgUmVzdG9yZVRocmVhZFByaW9yaXR5KGkpICAgICh2b2lkKShpKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgZnJlcXVlbmN5IG9mIHRoZSBjb3VudGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIEdldENvdW50ZXJGcmVxdWVuY3koCi0gICAgQ1BVX2xhcmdlSW50ZWdlciAqZnJlcSkKLXsKLSAgICBmcmVxLT5sb3cgID0gMTAwMDAwOwotICAgIGZyZXEtPmhpZ2ggPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIGNvdW50ZXIgYW5kIHJldHVybiB0aGUgY291bnRlciB2YWx1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEdldENvdW50ZXIodCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVUxPTkcgICBjb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY291bnQgPSBWREhRdWVyeVN5c1ZhbHVlKDAsIFZESEdTVl9NU0VDU0JPT1QpOyBcCi0gICAgKHQpLT5sb3cgID0gY291bnQgKiAxMDA7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHQpLT5oaWdoID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92ZGQvZmlsZWlvLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92ZGQvZmlsZWlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNzQyZGUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdmRkL2ZpbGVpby5jCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBPUy8yIFZERAotKgotKiBEZXNjcmlwdGlvbjogIEMgbGlicmFyeSBjb21wYXRpYmxlIEkvTyBmdW5jdGlvbnMgZm9yIHVzZSB3aXRoaW4gYSBWREQuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAicG1hcGkuaCIKLSNpbmNsdWRlICJ2ZGRmaWxlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1haW4gQ29kZSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgRU9GIC0xCi0KLS8qIE5COiBub25lIG9mIHRoZSBmaWxlIFZESHMgYXJlIGF2YWlsYWJsZSBkdXJpbmcgdGhlIERPUyBzZXNzaW9uICAgICAgICAgICovCi0vKiBpbml0aWFsemF0aW9uIGNvbnRleHQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0vKiBNYWNyb3MgZm9yIE9wZW4vQ2xvc2UgQVBJcyB0byBhbGxvdyB1c2luZyB0aGlzIG1vZHVsZSBpbiBib3RoIFZERHMgYW5kICAqLwotLyogbm9ybWFsIE9TLzIgYXBwbGljYXRpb25zLiBVbmZvcnR1bmF0ZWx5IFZESFJlYWQvV3JpdGUvU2VlayBkb24ndCBtYXAgdG8gKi8KLS8qIHRoZWlyIERvcyogY291bnRlcnBhcnRzIHNvIGNsZWFubHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZkZWYgX19PUzJfVkREX18KLSNkZWZpbmUgX09TMk9wZW4gICAgVkRIT3BlbgotI2RlZmluZSBfT1MyQ2xvc2UgICBWREhDbG9zZQotI2Vsc2UKLSNkZWZpbmUgX09TMk9wZW4gICAgRG9zT3BlbgotI2RlZmluZSBfT1MyQ2xvc2UgICBEb3NDbG9zZQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVkREIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZm9wZW4gZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotRklMRSAqIGZvcGVuKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIGNvbnN0IGNoYXIgKm1vZGUpCi17Ci0gICAgRklMRSAgICAqZiA9IFBNX21hbGxvYyhzaXplb2YoRklMRSkpOwotICAgIGxvbmcgICAgb2xkcG9zOwotICAgIFVMT05HICAgcmMsIHVsQWN0aW9uOwotICAgIFVMT05HICAgb21vZGUsIG9mbGFnczsKLQotICAgIGlmIChmICE9IE5VTEwpIHsKLQlmLT5vZmZzZXQgPSAwOwotCWYtPnRleHQgPSAobW9kZVsxXSA9PSAndCcgfHwgbW9kZVsyXSA9PSAndCcpOwotCWYtPndyaXRlbW9kZSA9IChtb2RlWzBdID09ICd3JykgfHwgKG1vZGVbMF0gPT0gJ2EnKTsKLQlmLT51bnB1dGMgPSBFT0Y7Ci0JZi0+ZW5kcCA9IGYtPmJ1ZiArIHNpemVvZihmLT5idWYpOwotCWYtPmN1cnAgPSBmLT5zdGFydHAgPSBmLT5idWY7Ci0KLQlpZiAobW9kZVswXSA9PSAncicpIHsKLQkgICAgI2lmZGVmIF9fT1MyX1ZERF9fCi0JICAgIG9tb2RlICA9IFZESE9QRU5fQUNDRVNTX1JFQURPTkxZIHwgVkRIT1BFTl9TSEFSRV9ERU5ZTk9ORTsKLQkgICAgb2ZsYWdzID0gVkRIT1BFTl9BQ1RJT05fT1BFTl9JRl9FWElTVFMgfCBWREhPUEVOX0FDVElPTl9GQUlMX0lGX05FVzsKLQkgICAgI2Vsc2UKLQkgICAgb21vZGUgID0gT1BFTl9BQ0NFU1NfUkVBRE9OTFkgfCBPUEVOX1NIQVJFX0RFTllOT05FOwotCSAgICBvZmxhZ3MgPSBPUEVOX0FDVElPTl9PUEVOX0lGX0VYSVNUUyB8IE9QRU5fQUNUSU9OX0ZBSUxfSUZfTkVXOwotCSAgICAjZW5kaWYKLQkgICAgfQotCWVsc2UgaWYgKG1vZGVbMF0gPT0gJ3cnKSB7Ci0JICAgICNpZmRlZiBfX09TMl9WRERfXwotCSAgICBvbW9kZSAgPSBWREhPUEVOX0FDQ0VTU19XUklURU9OTFkgfCBWREhPUEVOX1NIQVJFX0RFTllXUklURTsKLQkgICAgb2ZsYWdzID0gVkRIT1BFTl9BQ1RJT05fUkVQTEFDRV9JRl9FWElTVFMgfCBWREhPUEVOX0FDVElPTl9DUkVBVEVfSUZfTkVXOwotCSAgICAjZWxzZQotCSAgICBvbW9kZSAgPSBPUEVOX0FDQ0VTU19XUklURU9OTFkgfCBPUEVOX1NIQVJFX0RFTllXUklURTsKLQkgICAgb2ZsYWdzID0gT1BFTl9BQ1RJT05fUkVQTEFDRV9JRl9FWElTVFMgfCBPUEVOX0FDVElPTl9DUkVBVEVfSUZfTkVXOwotCSAgICAjZW5kaWYKLQkgICAgfQotCWVsc2UgewotCSAgICAjaWZkZWYgX19PUzJfVkREX18KLQkgICAgb21vZGUgID0gVkRIT1BFTl9BQ0NFU1NfUkVBRFdSSVRFIHwgVkRIT1BFTl9TSEFSRV9ERU5ZV1JJVEU7Ci0JICAgIG9mbGFncyA9IFZESE9QRU5fQUNUSU9OX09QRU5fSUZfRVhJU1RTIHwgVkRIT1BFTl9BQ1RJT05fQ1JFQVRFX0lGX05FVzsKLQkgICAgI2Vsc2UKLQkgICAgb21vZGUgID0gT1BFTl9BQ0NFU1NfUkVBRFdSSVRFIHwgT1BFTl9TSEFSRV9ERU5ZV1JJVEU7Ci0JICAgIG9mbGFncyA9IE9QRU5fQUNUSU9OX09QRU5fSUZfRVhJU1RTIHwgT1BFTl9BQ1RJT05fQ1JFQVRFX0lGX05FVzsKLQkgICAgI2VuZGlmCi0JICAgIH0KLQlyYyA9IF9PUzJPcGVuKChQU1opZmlsZW5hbWUsIChQSEZJTEUpJmYtPmhhbmRsZSwgJnVsQWN0aW9uLCAwLCBWREhPUEVOX0ZJTEVfTk9STUFMLCBvZmxhZ3MsIG9tb2RlLCBOVUxMKTsKLQlpZiAocmMgIT0gMCkgewotCSAgICBQTV9mcmVlKGYpOwotCSAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCi0JI2lmZGVmIF9fT1MyX1ZERF9fCi0JZi0+ZmlsZXNpemUgPSBWREhTZWVrKChIRklMRSlmLT5oYW5kbGUsIDAsIFZESFNLX0VORF9PRl9GSUxFKTsKLQkjZWxzZQotCXJjID0gRG9zU2V0RmlsZVB0cigoSEZJTEUpZi0+aGFuZGxlLCAwLCBGSUxFX0VORCwgJmYtPmZpbGVzaXplKTsKLQkjZW5kaWYKLQotCWlmIChtb2RlWzBdID09ICdhJykKLQkgICAgZnNlZWsoZiwwLDIpOwotICAgIH0KLSAgICByZXR1cm4gZjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1WREQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmcmVhZCBmdW5jdGlvbi4gTm90ZSB0aGF0IHVubGlrZSBXaW5kb3dzIFZ4RHMsCi1PUy8yIFZERHMgYXJlIG5vdCBsaW1pdGVkIHRvIDY0SyByZWFkcyBvciB3cml0ZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc2l6ZV90IGZyZWFkKAotICAgIHZvaWQgKnB0ciwKLSAgICBzaXplX3Qgc2l6ZSwKLSAgICBzaXplX3QgbiwKLSAgICBGSUxFICpmKQotewotICAgIGNoYXIgICAgKmJ1ZiA9IHB0cjsKLSAgICBpbnQgICAgIGJ5dGVzLHJlYWRieXRlcyx0b3RhbGJ5dGVzID0gMDsKLQotICAgIC8qIEZpcnN0IGNvcHkgYW55IGRhdGEgYWxyZWFkeSByZWFkIGludG8gb3VyIGJ1ZmZlciAqLwotICAgIGlmICgoYnl0ZXMgPSAoZi0+Y3VycCAtIGYtPnN0YXJ0cCkpID4gMCkgewotCW1lbWNweShidWYsZi0+Y3VycCxieXRlcyk7Ci0JZi0+c3RhcnRwID0gZi0+Y3VycCA9IGYtPmJ1ZjsKLQlidWYgKz0gYnl0ZXM7Ci0JdG90YWxieXRlcyArPSBieXRlczsKLQlieXRlcyA9IChzaXplICogbikgLSBieXRlczsKLQl9Ci0gICAgZWxzZQotCWJ5dGVzID0gc2l6ZSAqIG47Ci0gICAgaWYgKGJ5dGVzKSB7Ci0JI2lmZGVmIF9fT1MyX1ZERF9fCi0JcmVhZGJ5dGVzID0gVkRIUmVhZCgoSEZJTEUpZi0+aGFuZGxlLCBidWYsIGJ5dGVzKTsKLQkjZWxzZQotCURvc1JlYWQoKEhGSUxFKWYtPmhhbmRsZSwgYnVmLCBieXRlcywgJnJlYWRieXRlcyk7Ci0JI2VuZGlmCi0JdG90YWxieXRlcyArPSByZWFkYnl0ZXM7Ci0JZi0+b2Zmc2V0ICs9IHJlYWRieXRlczsKLQl9Ci0gICAgcmV0dXJuIHRvdGFsYnl0ZXMgLyBzaXplOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVZERCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZ3cml0ZSBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zaXplX3QgZndyaXRlKAotICAgIHZvaWQgKnB0ciwKLSAgICBzaXplX3Qgc2l6ZSwKLSAgICBzaXplX3QgbiwKLSAgICBGSUxFICpmKQotewotICAgIGNoYXIgICAgICAgICpidWYgPSBwdHI7Ci0gICAgaW50ICAgICAgICAgYnl0ZXMsd3JpdHRlbmJ5dGVzLHRvdGFsYnl0ZXMgPSAwOwotCi0gICAgLyogRmx1c2ggYW55dGhpbmcgYWxyZWFkeSBpbiB0aGUgYnVmZmVyICovCi0gICAgaWYgKCFmLT53cml0ZW1vZGUpCi0JcmV0dXJuIDA7Ci0gICAgZmZsdXNoKGYpOwotICAgIGJ5dGVzID0gc2l6ZSAqIG47Ci0gICAgI2lmZGVmIF9fT1MyX1ZERF9fCi0gICAgd3JpdHRlbmJ5dGVzID0gVkRIV3JpdGUoKEhGSUxFKWYtPmhhbmRsZSwgYnVmLCBieXRlcyk7Ci0gICAgI2Vsc2UKLSAgICBEb3NXcml0ZSgoSEZJTEUpZi0+aGFuZGxlLCBidWYsIGJ5dGVzLCAmd3JpdHRlbmJ5dGVzKTsKLSAgICAjZW5kaWYKLSAgICB0b3RhbGJ5dGVzICs9IHdyaXR0ZW5ieXRlczsKLSAgICBmLT5vZmZzZXQgKz0gd3JpdHRlbmJ5dGVzOwotICAgIGlmIChmLT5vZmZzZXQgPiBmLT5maWxlc2l6ZSkKLQlmLT5maWxlc2l6ZSA9IGYtPm9mZnNldDsKLSAgICByZXR1cm4gdG90YWxieXRlcyAvIHNpemU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVnhEIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZmZsdXNoIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBmZmx1c2goCi0gICAgRklMRSAqZikKLXsKLSAgICBVTE9ORyAgICAgYnl0ZXM7Ci0KLSAgICAvKiBGaXJzdCBjb3B5IGFueSBkYXRhIGFscmVhZHkgd3JpdHRlbiBpbnRvIG91ciBidWZmZXIgKi8KLSAgICBpZiAoZi0+d3JpdGVtb2RlICYmIChieXRlcyA9IChmLT5jdXJwIC0gZi0+c3RhcnRwKSkgPiAwKSB7Ci0JI2lmZGVmIF9fT1MyX1ZERF9fCi0JYnl0ZXMgPSBWREhXcml0ZSgoSEZJTEUpZi0+aGFuZGxlLCBmLT5zdGFydHAsIGJ5dGVzKTsKLQkjZWxzZQotCURvc1dyaXRlKChIRklMRSlmLT5oYW5kbGUsIGYtPnN0YXJ0cCwgYnl0ZXMsICZieXRlcyk7Ci0JI2VuZGlmCi0JZi0+b2Zmc2V0ICs9IGJ5dGVzOwotCWlmIChmLT5vZmZzZXQgPiBmLT5maWxlc2l6ZSkKLQkgICAgZi0+ZmlsZXNpemUgPSBmLT5vZmZzZXQ7Ci0JZi0+c3RhcnRwID0gZi0+Y3VycCA9IGYtPmJ1ZjsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVkREIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZnNlZWsgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGZzZWVrKAotICAgIEZJTEUgKmYsCi0gICAgbG9uZyBpbnQgb2Zmc2V0LAotICAgIGludCB3aGVuY2UpCi17Ci0gICAgZmZsdXNoKGYpOwotCi0gICAgaWYgKHdoZW5jZSA9PSAwKQotCWYtPm9mZnNldCA9IG9mZnNldDsKLSAgICBlbHNlIGlmICh3aGVuY2UgPT0gMSkKLQlmLT5vZmZzZXQgKz0gb2Zmc2V0OwotICAgIGVsc2UgaWYgKHdoZW5jZSA9PSAyKQotCWYtPm9mZnNldCA9IGYtPmZpbGVzaXplICsgb2Zmc2V0OwotCi0gICAgI2lmZGVmIF9fT1MyX1ZERF9fCi0gICAgVkRIU2VlaygoSEZJTEUpZi0+aGFuZGxlLCBmLT5vZmZzZXQsIFZESFNLX0FCU09MVVRFKTsKLSAgICAjZWxzZQotICAgIERvc1NldEZpbGVQdHIoKEhGSUxFKWYtPmhhbmRsZSwgZi0+b2Zmc2V0LCBGSUxFX0JFR0lOLCBOVUxMKTsKLSAgICAjZW5kaWYKLQotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVZERCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZ0ZWxsIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWxvbmcgZnRlbGwoCi0gICAgRklMRSAqZikKLXsKLSAgICBsb25nICAgIG9mZnNldDsKLQotICAgIG9mZnNldCA9IChmLT5jdXJwIC0gZi0+c3RhcnRwKTsKLSAgICBvZmZzZXQgKz0gZi0+b2Zmc2V0OwotICAgIHJldHVybiBvZmZzZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVkREIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZmVvZiBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgZmVvZigKLSAgICBGSUxFICpmKQotewotICAgIHJldHVybiAoZi0+b2Zmc2V0ID09IGYtPmZpbGVzaXplKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIHRoZSBpbnB1dCBmaWxlIGJ1ZmZlciwgaW5jbHVkaW5nIHRyYW5zbGF0aW9uCi1vZiB0aGUgY2hhcmFjdGVyIGluIHRleHQgdHJhbnNhdGlvbiBtb2Rlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IF9fZ2V0YygKLSAgICBGSUxFICpmKQotewotICAgIGludCBjOwotCi0gICAgaWYgKGYtPnVucHV0YyAhPSBFT0YpIHsKLQljID0gZi0+dW5wdXRjOwotCWYtPnVucHV0YyA9IEVPRjsKLQl9Ci0gICAgZWxzZSB7Ci0JaWYgKGYtPnN0YXJ0cCA9PSBmLT5jdXJwKSB7Ci0JICAgIGludCBieXRlcyA9IGZyZWFkKGYtPmJ1ZiwxLHNpemVvZihmLT5idWYpLGYpOwotCSAgICBpZiAoYnl0ZXMgPT0gMCkKLQkJcmV0dXJuIEVPRjsKLQkgICAgZi0+Y3VycCA9IGYtPnN0YXJ0cCArIGJ5dGVzOwotCSAgICB9Ci0JYyA9ICpmLT5zdGFydHArKzsKLQlpZiAoZi0+dGV4dCAmJiBjID09ICdccicpIHsKLQkgICAgaW50IG5jID0gX19nZXRjKGYpOwotCSAgICBpZiAobmMgIT0gJ1xuJykKLQkJZi0+dW5wdXRjID0gbmM7Ci0JICAgIH0KLQl9Ci0gICAgcmV0dXJuIGM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotV3JpdGUgYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gdG8gaW5wdXQgYnVmZmVyLCBpbmNsdWRpbmcgdHJhbnNsYXRpb24gb2YgdGhlCi1jaGFyYWN0ZXIgaW4gdGV4dCB0cmFuc2F0aW9uIG1vZGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgX19wdXRjKGludCBjLEZJTEUgKmYpCi17Ci0gICAgaW50IGNvdW50ID0gMTsKLSAgICBpZiAoZi0+dGV4dCAmJiBjID09ICdcbicpIHsKLQlfX3B1dGMoJ1xyJyxmKTsKLQljb3VudCA9IDI7Ci0JfQotICAgIGlmIChmLT5jdXJwID09IGYtPmVuZHApCi0JZmZsdXNoKGYpOwotICAgICpmLT5jdXJwKysgPSBjOwotICAgIHJldHVybiBjb3VudDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1WeEQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmZ2V0cyBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jaGFyICpmZ2V0cygKLSAgICBjaGFyICpzLAotICAgIGludCBuLAotICAgIEZJTEUgKmYpCi17Ci0gICAgaW50IGMgPSAwOwotICAgIGNoYXIgKmNzOwotCi0gICAgY3MgPSBzOwotICAgIHdoaWxlICgtLW4gPiAwICYmIChjID0gX19nZXRjKGYpKSAhPSBFT0YpIHsKLQkqY3MrKyA9IGM7Ci0JaWYgKGMgPT0gJ1xuJykKLQkgICAgYnJlYWs7Ci0JfQotICAgIGlmIChjID09IEVPRiAmJiBjcyA9PSBzKQotCXJldHVybiBOVUxMOwotICAgICpjcyA9ICdcMCc7Ci0gICAgcmV0dXJuIHM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVnhEIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZnB1dHMgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGZwdXRzKAotICAgIGNvbnN0IGNoYXIgKnMsCi0gICAgRklMRSAqZikKLXsKLSAgICBpbnQgciA9IDA7Ci0gICAgaW50IGM7Ci0KLSAgICB3aGlsZSAoKGMgPSAqcysrKSAhPSAwKQotCXIgPSBfX3B1dGMoYywgZik7Ci0gICAgcmV0dXJuIHI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVnhEIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZmNsb3NlIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBmY2xvc2UoCi0gICAgRklMRSAqZikKLXsKLSAgICBmZmx1c2goZik7Ci0gICAgX09TMkNsb3NlKChIRklMRSlmLT5oYW5kbGUpOwotICAgIFBNX2ZyZWUoZik7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92ZGQvb3NoZHIuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3ZkZC9vc2hkci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzI4NmJkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3ZkZC9vc2hkci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IE9TLzIgVkRECi0qCi0qIERlc2NyaXB0aW9uOiAgSW5jbHVkZSBmaWxlIHRvIGluY2x1ZGUgYWxsIE9TIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92ZGQvcG0uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3ZkZC9wbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Njg4YmFiLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3ZkZC9wbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgT1MvMiBWREQKLSoKLSogRGVzY3JpcHRpb246ICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeSwgd2hpY2gKLSogICAgICAgICAgICAgICBjb250YWlucyBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IE9TIHNwZWNpZmljIHNlcnZpY2VzIGluIGEKLSogICAgICAgICAgICAgICBnZW5lcmljLCBjcm9zcyBwbGF0Zm9ybSBBUEkuIFBvcnRpbmcgdGhlIE9TIFBvcnRhYmlsaXR5Ci0qICAgICAgICAgICAgICAgTWFuYWdlciBsaWJyYXJ5IGlzIHRoZSBmaXJzdCBzdGVwIHRvIHBvcnRpbmcgYW55IFNjaVRlY2gKLSogICAgICAgICAgICAgICBwcm9kdWN0cyB0byBhIG5ldyBwbGF0Zm9ybS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgImRydmxpYi9vcy9vcy5oIgotI2luY2x1ZGUgInNkZC9zZGRoZWxwLmgiCi0jaW5jbHVkZSAibXRyci5oIgotCi0jZGVmaW5lIFRSQUNFKGEpCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgTUFYX01FTU9SWV9TSEFSRUQgICAgICAgICAgIDEwMAotI2RlZmluZSBNQVhfTUVNT1JZX01BUFBJTkdTICAgICAgICAgMTAwCi0KLS8qIFRPRE86IEkgdGhpbmsgdGhlIGdsb2JhbCBhbmQgbGluZWFyIG1lbWJlcnMgd2lsbCBiZSB0aGUgc2FtZSwgYnV0IG5vdCBzdXJlIHlldC4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB2b2lkICAgICpsaW5lYXI7Ci0gICAgdWxvbmcgICBnbG9iYWw7Ci0gICAgdWxvbmcgICBsZW5ndGg7Ci0gICAgaW50ICAgICBucGFnZXM7Ci0gICAgfSBtZW1zaGFyZWQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bG9uZyAgIHBoeXNpY2FsOwotICAgIHVsb25nICAgbGluZWFyOwotICAgIHVsb25nICAgbGVuZ3RoOwotICAgIGludCAgICAgbnBhZ2VzOwotICAgIGlib29sICAgaXNDYWNoZWQ7Ci0gICAgfSBtbWFwcGluZzsKLQotc3RhdGljIGludCAgICAgICAgICBudW1NYXBwaW5ncyA9IDA7Ci1zdGF0aWMgbWVtc2hhcmVkICAgIHNoYXJlZFtNQVhfTUVNT1JZX01BUFBJTkdTXSA9IHswfTsKLXN0YXRpYyBtbWFwcGluZyAgICAgbWFwc1tNQVhfTUVNT1JZX01BUFBJTkdTXTsKLWlib29sICAgICAgICAgICAgICAgX1BNX2hhdmVCSU9TID0gVFJVRTsKLWNoYXIgICAgICAgICAgICAgICAgX1BNX2NudFBhdGhbUE1fTUFYX1BBVEhdID0gIiI7ICAgICAvKiB0aGVyZSBqdXN0IGlzbid0IGFueSAqLwotdWNoYXIgICAgICAgICAgICAgICAqX1BNX3JtQnVmQWRkciA9IE5VTEw7Ci11c2hvcnQgX1ZBUkFQSSAgICAgIFBNX3NhdmVkRFMgPSAwOyAgIC8qIHdoeSBjYW4ndCBJIHVzZSB0aGUgdW5kZXJzY29yZSBwcmVmaXg/ICovCi0KLUhWREhTRU0gICAgICAgICAgICAgaGV2RmFyQ2FsbFJldCA9IE5VTEw7Ci1IVkRIU0VNICAgICAgICAgICAgIGhldklSZXQgICAgICAgPSBOVUxMOwotSEhPT0sgICAgICAgICAgICAgICBoaG9va1VzZXJSZXR1cm5Ib29rID0gTlVMTDsKLUhIT09LICAgICAgICAgICAgICAgaGhvb2tVc2VySVJldEhvb2sgICA9IE5VTEw7Ci0KLXN0YXRpYyB2b2lkIChQTUFQSVAgZmF0YWxFcnJvckNsZWFudXApKHZvaWQpID0gTlVMTDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogRnVuY3Rpb25zIHRvIHJlYWQgYW5kIHdyaXRlIENNT1MgcmVnaXN0ZXJzICovCi0KLXVsb25nICAgUE1BUEkgX1BNX2dldFBEQih2b2lkKTsKLXVjaGFyICAgUE1BUEkgX1BNX3JlYWRDTU9TKGludCBpbmRleCk7Ci12b2lkICAgIFBNQVBJIF9QTV93cml0ZUNNT1MoaW50IGluZGV4LHVjaGFyIHZhbHVlKTsKLQotVk9JRCBIT09LRU5UUlkgVXNlclJldHVybkhvb2soUFZPSUQgcFJlZkRhdGEsIFBDUkYgcGNyZik7Ci1WT0lEIEhPT0tFTlRSWSBVc2VySVJldEhvb2soUFZPSUQgcFJlZkRhdGEsIFBDUkYgcGNyZik7Ci0KLXZvaWQgUE1BUEkgUE1faW5pdCh2b2lkKQotewotICAgIE1UUlJfaW5pdCgpOwotCi0gICAgLyogSW5pdGlhbGl6ZSBWREQtc3BlY2lmaWMgZGF0YSAqLwotICAgIC8qIE5vdGU6IFBNX2luaXQgbXVzdCBiZSAob2J2aW91c2x5KSBjYWxsZWQgaW4gVkRNIHRhc2sgY29udGV4dCEgKi8KLSAgICBWREhDcmVhdGVTZW0oJmhldkZhckNhbGxSZXQsIFZESF9FVkVOVFNFTSk7Ci0gICAgVkRIQ3JlYXRlU2VtKCZoZXZJUmV0LCBWREhfRVZFTlRTRU0pOwotICAgIGhob29rVXNlclJldHVybkhvb2sgPSBWREhBbGxvY0hvb2soVkRIX1JFVFVSTl9IT09LLCAoUEZOQVJNKVVzZXJSZXR1cm5Ib29rLCAwKTsKLSAgICBoaG9va1VzZXJJUmV0SG9vayAgID0gVkRIQWxsb2NIb29rKFZESF9SRVRVUk5fSE9PSywgKFBGTkFSTSlVc2VySVJldEhvb2ssIDApOwotCi0gICAgaWYgKChoZXZJUmV0ID09IE5VTEwpIHx8IChoZXZGYXJDYWxsUmV0ID09IE5VTEwpIHx8Ci0JKGhob29rVXNlclJldHVybkhvb2sgPT0gTlVMTCkgfHwgKGhob29rVXNlcklSZXRIb29rID09IE5VTEwpKSB7Ci0JLyogc29tZXRoaW5nIGZhaWxlZCwgd2UgY2FuJ3QgZ28gb24gKi8KLQkvKiBUT0RPOiB0YWtlIHNvbWUgYWN0aW9uIGhlcmUhICovCi0JfQotfQotCi0vKiBEbyBzb21lIGNsZWFuaW5nIHVwICovCi12b2lkIFBNQVBJIFBNX2V4aXQodm9pZCkKLXsKLSAgICAvKiBOb3RlOiBIb29rcyBhbGxvY2F0ZWQgZHVyaW5nIG9yIGFmdGVyIFZETSBjcmVhdGlvbiBhcmUgZGVhbGxvY2F0ZWQgYXV0b21hdGljYWxseSAqLwotICAgIGlmIChoZXZJUmV0ICE9IE5VTEwpCi0JVkRIRGVzdHJveVNlbShoZXZJUmV0KTsKLQotICAgIGlmIChoZXZGYXJDYWxsUmV0ICE9IE5VTEwpCi0JVkRIRGVzdHJveVNlbShoZXZGYXJDYWxsUmV0KTsKLX0KLQotaWJvb2wgUE1BUEkgUE1faGF2ZUJJT1NBY2Nlc3Modm9pZCkKLXsgcmV0dXJuIF9QTV9oYXZlQklPUzsgfQotCi1sb25nIFBNQVBJIFBNX2dldE9TVHlwZSh2b2lkKQoteyByZXR1cm4gLypfT1NfT1MyVkREKi8gX09TX09TMjsgfSAgLypGSVghISAqLwotCi1pbnQgUE1BUEkgUE1fZ2V0TW9kZVR5cGUodm9pZCkKLXsgcmV0dXJuIFBNXzM4NjsgfQotCi12b2lkIFBNQVBJIFBNX2JhY2tzbGFzaChjaGFyICpzKQotewotICAgIHVpbnQgcG9zID0gc3RybGVuKHMpOwotICAgIGlmIChzW3Bvcy0xXSAhPSAnXFwnKSB7Ci0Jc1twb3NdID0gJ1xcJzsKLQlzW3BvcysxXSA9ICdcMCc7Ci0JfQotfQotCi12b2lkIFBNQVBJIFBNX3NldEZhdGFsRXJyb3JDbGVhbnVwKAotICAgIHZvaWQgKFBNQVBJUCBjbGVhbnVwKSh2b2lkKSkKLXsKLSAgICBmYXRhbEVycm9yQ2xlYW51cCA9IGNsZWFudXA7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZmF0YWxFcnJvcihjb25zdCBjaGFyICptc2cpCi17Ci0gICAgaWYgKGZhdGFsRXJyb3JDbGVhbnVwKQotCWZhdGFsRXJyb3JDbGVhbnVwKCk7Ci0vKiAgICBGYXRhbF9FcnJvcl9IYW5kbGVyKG1zZywwKTsgIFRPRE86IGltcGxlbWVudCBzb21laG93ISAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWxlbiAgICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIKLXJzZWcgICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgcmVhbCBtb2RlIHNlZ21lbnQgb2YgdGhlIGJ1ZmZlcgotcm9mZiAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSByZWFsIG1vZGUgb2Zmc2V0IG9mIHRoZSBidWZmZXIKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSBnbG9iYWwgVkVTQSB0cmFuc2ZlcgotYnVmZmVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9nZXRWRVNBQnVmKAotICAgIHVpbnQgKmxlbiwKLSAgICB1aW50ICpyc2VnLAotICAgIHVpbnQgKnJvZmYpCi17Ci0gICAgaWYgKF9QTV9ybUJ1ZkFkZHIpIHsKLQkqbGVuID0gMDsgLypWRVNBX0JVRl9TSVpFOyAqLwotCSpyc2VnID0gKHVsb25nKShfUE1fcm1CdWZBZGRyKSA+PiA0OwotCSpyb2ZmID0gKHVsb25nKShfUE1fcm1CdWZBZGRyKSAmIDB4RjsKLQlyZXR1cm4gX1BNX3JtQnVmQWRkcjsKLQl9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLWludCBQTUFQSSBQTV9pbnQzODYoaW50IGludG5vLCBQTVJFR1MgKmluLCBQTVJFR1MgKm91dCkKLXsKLSAgICAvKiBVbnVzZWQgaW4gVkREcyAqLwotICAgIHJldHVybiAwOwotfQotCi1jaGFyICogUE1BUEkgUE1fZ2V0Q3VycmVudFBhdGgoY2hhciAqcGF0aCxpbnQgbWF4TGVuKQotewotICAgIHN0cm5jcHkocGF0aCwgX1BNX2NudFBhdGgsIG1heExlbik7Ci0gICAgcGF0aFttYXhMZW4gLSAxXSA9IDA7Ci0gICAgcmV0dXJuIHBhdGg7Ci19Ci0KLWNoYXIgUE1BUEkgUE1fZ2V0Qm9vdERyaXZlKHZvaWQpCi17Ci0gICAgdWxvbmcgICBib290ID0gMzsKLSAgICBib290ID0gVkRIUXVlcnlTeXNWYWx1ZSgwLCBWREhHU1ZfQk9PVERSVik7Ci0gICAgcmV0dXJuIChjaGFyKSgnYScgKyBib290IC0gMSk7Ci19Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRWQkVBRlBhdGgodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBwYXRoW0NDSE1BWFBBVEhdOwotICAgIHN0cmNweShwYXRoLCJ4OlxcIik7Ci0gICAgcGF0aFswXSA9IFBNX2dldEJvb3REcml2ZSgpOwotICAgIHJldHVybiBwYXRoOwotfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c1BhdGgodm9pZCkKLXsKLQlzdGF0aWMgY2hhciBwYXRoW0NDSE1BWFBBVEhdOwotCXN0cmNweShwYXRoLCJ4Olxcb3MyXFxkcml2ZXJzIik7Ci0JcGF0aFswXSA9IFBNX2dldEJvb3REcml2ZSgpOwotCVBNX2JhY2tzbGFzaChwYXRoKTsKLQlzdHJjYXQocGF0aCwibnVjbGV1cyIpOwotCXJldHVybiBwYXRoOwotfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c0NvbmZpZ1BhdGgodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBwYXRoWzI1Nl07Ci0gICAgc3RyY3B5KHBhdGgsUE1fZ2V0TnVjbGV1c1BhdGgoKSk7Ci0gICAgUE1fYmFja3NsYXNoKHBhdGgpOwotICAgIHN0cmNhdChwYXRoLCJjb25maWciKTsKLSAgICByZXR1cm4gcGF0aDsKLX0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFVuaXF1ZUlEKHZvaWQpCi17IHJldHVybiBQTV9nZXRNYWNoaW5lTmFtZSgpOyB9Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRNYWNoaW5lTmFtZSh2b2lkKQotewotICAgIHJldHVybiAiVW5rbm93biI7Ci19Ci0KLWludCBQTUFQSSBQTV9rYmhpdCh2b2lkKQoteyByZXR1cm4gMTsgfQotCi1pbnQgUE1BUEkgUE1fZ2V0Y2godm9pZCkKLXsgcmV0dXJuIDA7IH0KLQotUE1fSFdORCBQTUFQSSBQTV9vcGVuQ29uc29sZShQTV9IV05EIGh3bmRVc2VyLGludCBkZXZpY2UsaW50IHhSZXMsaW50IHlSZXMsaW50IGJwcCxpYm9vbCBmdWxsU2NyZWVuKQotewotICAgIC8qIFVudXNlZCBpbiBWRERzICovCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLWludCBQTUFQSSBQTV9nZXRDb25zb2xlU3RhdGVTaXplKHZvaWQpCi17Ci0gICAgLyogVW51c2VkIGluIFZERHMgKi8KLSAgICByZXR1cm4gMTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zYXZlQ29uc29sZVN0YXRlKHZvaWQgKnN0YXRlQnVmLFBNX0hXTkQgaHduZENvbnNvbGUpCi17Ci0gICAgLyogVW51c2VkIGluIFZERHMgKi8KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2soaW50IChfQVNNQVBJUCBzYXZlU3RhdGUpKGludCBmbGFncykpCi17Ci0gICAgLyogVW51c2VkIGluIFZERHMgKi8KLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlQ29uc29sZVN0YXRlKGNvbnN0IHZvaWQgKnN0YXRlQnVmLFBNX0hXTkQgaHduZENvbnNvbGUpCi17Ci0gICAgLyogVW51c2VkIGluIFZERHMgKi8KLX0KLQotdm9pZCBQTUFQSSBQTV9jbG9zZUNvbnNvbGUoUE1fSFdORCBod25kQ29uc29sZSkKLXsKLSAgICAvKiBVbnVzZWQgaW4gVkREcyAqLwotfQotCi12b2lkIFBNQVBJIFBNX3NldE9TQ3Vyc29yTG9jYXRpb24oaW50IHgsaW50IHkpCi17Ci0gICAgdWNoYXIgKl9iaW9zUHRyID0gUE1fZ2V0QklPU1BvaW50ZXIoKTsKLSAgICBQTV9zZXRCeXRlKF9iaW9zUHRyKzB4NTAseCk7Ci0gICAgUE1fc2V0Qnl0ZShfYmlvc1B0cisweDUxLHkpOwotfQotCi12b2lkIFBNQVBJIFBNX3NldE9TU2NyZWVuV2lkdGgoaW50IHdpZHRoLGludCBoZWlnaHQpCi17Ci0gICAgdWNoYXIgKl9iaW9zUHRyID0gUE1fZ2V0QklPU1BvaW50ZXIoKTsKLSAgICBQTV9zZXRCeXRlKF9iaW9zUHRyKzB4NEEsd2lkdGgpOwotICAgIFBNX3NldEJ5dGUoX2Jpb3NQdHIrMHg4NCxoZWlnaHQtMSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGUgYSBibG9jayBvZiBzaGFyZWQgbWVtb3J5LiBGb3IgT1MvMiBWREQgd2UgYWxsb2NhdGUgc2hhcmVkIG1lbW9yeQotYXMgbG9ja2VkLCBnbG9iYWwgbWVtb3J5IHRoYXQgaXMgYWNjZXNzaWJsZSBmcm9tIGFueSBtZW1vcnkgY29udGV4dAotKGluY2x1ZGluZyBpbnRlcnJ1cHQgdGltZSBjb250ZXh0KSwgd2hpY2ggYWxsb3dzIHVzIHRvIGxvYWQgb3VyIGltcG9ydGFudAotZGF0YSBzdHJ1Y3R1cmUgYW5kIGNvZGUgc3VjaCB0aGF0IHdlIGNhbiBhY2Nlc3MgaXQgZGlyZWN0bHkgZnJvbSBhIHJpbmcKLTAgaW50ZXJydXB0IGNvbnRleHQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX21hbGxvY1NoYXJlZChsb25nIHNpemUpCi17Ci0gICAgVUxPTkcgICAgICAgblBhZ2VzID0gKHNpemUgKyAweEZGRikgPj4gMTI7Ci0gICAgaW50ICAgICAgICAgaTsKLQotICAgIC8qIEZpcnN0IGZpbmQgYSBmcmVlIHNsb3QgaW4gb3VyIHNoYXJlZCBtZW1vcnkgdGFibGUgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01FTU9SWV9TSEFSRUQ7IGkrKykgewotCWlmIChzaGFyZWRbaV0ubGluZWFyID09IDApCi0JICAgIGJyZWFrOwotCX0KLSAgICBpZiAoaSA8IE1BWF9NRU1PUllfU0hBUkVEKSB7Ci0Jc2hhcmVkW2ldLmxpbmVhciA9IFZESEFsbG9jUGFnZXMoTlVMTCwgblBhZ2VzLCBWREhBUF9TWVNURU0gfCBWREhBUF9GSVhFRCk7Ci0Jc2hhcmVkW2ldLm5wYWdlcyA9IG5QYWdlczsKLQlzaGFyZWRbaV0uZ2xvYmFsID0gKFVMT05HKXNoYXJlZFtpXS5saW5lYXI7Ci0JcmV0dXJuICh2b2lkKilzaGFyZWRbaV0uZ2xvYmFsOwotCX0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgYmxvY2sgb2Ygc2hhcmVkIG1lbW9yeQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZVNoYXJlZCh2b2lkICpwKQotewotICAgIGludCBpOwotCi0gICAgLyogRmluZCBhIHNoYXJlZCBtZW1vcnkgYmxvY2sgaW4gb3VyIHRhYmxlIGFuZCBmcmVlIGl0ICovCi0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9NRU1PUllfU0hBUkVEOyBpKyspIHsKLQlpZiAoc2hhcmVkW2ldLmdsb2JhbCA9PSAodWxvbmcpcCkgewotCSAgICBWREhGcmVlUGFnZXMoc2hhcmVkW2ldLmxpbmVhcik7Ci0JICAgIHNoYXJlZFtpXS5saW5lYXIgPSAwOwotCSAgICBicmVhazsKLQkgICAgfQotCX0KLX0KLQotdm9pZCAqIFBNQVBJIFBNX21hcFRvUHJvY2Vzcyh2b2lkICpiYXNlLHVsb25nIGxpbWl0KQoteyByZXR1cm4gKHZvaWQqKWJhc2U7IH0KLQotaWJvb2wgUE1BUEkgUE1fZG9CSU9TUE9TVCgKLSAgICB1c2hvcnQgYXhWYWwsCi0gICAgdWxvbmcgQklPU1BoeXNBZGRyLAotICAgIHZvaWQgKm1hcHBlZEJJT1MsCi0gICAgdWxvbmcgQklPU0xlbikKLXsKLSAgICAvKiBUT0RPOiBGaWd1cmUgb3V0IGhvdyB0byBkbyB0aGlzICovCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkICogUE1BUEkgUE1fZ2V0QklPU1BvaW50ZXIodm9pZCkKLXsgcmV0dXJuICh2b2lkKikweDQwMDsgfQotCi12b2lkICogUE1BUEkgUE1fZ2V0QTAwMDBQb2ludGVyKHZvaWQpCi17IHJldHVybiBQTV9tYXBQaHlzaWNhbEFkZHIoMHhBMDAwMCwweEZGRkYsdHJ1ZSk7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1iYXNlICAgICAgICAtIFBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IHRvIG1hcHMgaW4KLWxpbWl0ICAgICAgIC0gTGltaXQgb2YgcGh5c2ljYWwgbWVtb3J5IHRvIHJlZ2lvbiB0byBtYXBzIGluCi0KLVJFVFVSTlM6Ci1MaW5lYXIgYWRkcmVzcyBvZiB0aGUgbmV3bHkgbWFwcGVkIG1lbW9yeS4KLQotUkVNQVJLUzoKLU1hcHMgYSBwaHlzaWNhbCBtZW1vcnkgcmFuZ2UgdG8gYSBsaW5lYXIgbWVtb3J5IHJhbmdlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIE1hcFBoeXNpY2FsVG9MaW5lYXIoCi0gICAgdWxvbmcgYmFzZSwKLSAgICB1bG9uZyBsaW1pdCwKLSAgICBpbnQgKm5wYWdlcykKLXsKLSAgICB1bG9uZyAgIGxpbmVhcixsZW5ndGggPSBsaW1pdCsxOwotICAgIGludCAgICAgaSxwcGFnZSxmbGFnczsKLSNpZiAwCi0gICAgcHBhZ2UgPSBiYXNlID4+IDEyOwotICAgICpucGFnZXMgPSAobGVuZ3RoICsgKGJhc2UgJiAweEZGRikgKyA0MDk1KSA+PiAxMjsKLSAgICBmbGFncyA9IFBSX0ZJWEVEIHwgUFJfU1RBVElDOwotICAgIGlmIChiYXNlID09IDB4QTAwMDApIHsKLQkvKiBXZSByZXF1aXJlIHRoZSBsaW5lYXIgYWRkcmVzcyB0byBiZSBhbGlnbmVkIHRvIGEgNjRLYiBib3VuZGFyeQotCSAqIGZvciBtYXBwaW5nIHRoZSBiYW5rZWQgZnJhbWVidWZmZXIgKHNvIHdlIGNhbiBkbyBlZmZpY2llbnQKLQkgKiBjYXJyeSBjaGVja2luZyBmb3IgYmFuayBjaGFuZ2VzIGluIHRoZSBhc3NlbWJsZXIgY29kZSkuIFRoZSBvbmx5Ci0JICogd2F5IHRvIGVuc3VyZSB0aGlzIGlzIHRvIGZvcmNlIHRoZSBsaW5lYXIgYWRkcmVzcyB0byBiZSBhbGlnbmVkCi0JICogdG8gYSA0TWIgYm91bmRhcnkuCi0JICovCi0JZmxhZ3MgfD0gUFJfNE1FRzsKLQl9Ci0gICAgaWYgKChsaW5lYXIgPSAodWxvbmcpUGFnZVJlc2VydmUoUFJfU1lTVEVNLCpucGFnZXMsZmxhZ3MpKSA9PSAodWxvbmcpLTEpCi0JcmV0dXJuIDA7Ci0gICAgaWYgKCFQYWdlQ29tbWl0UGh5cyhsaW5lYXIgPj4gMTIsKm5wYWdlcyxwcGFnZSxQQ19JTkNSIHwgUENfVVNFUiB8IFBDX1dSSVRFQUJMRSkpCi0JcmV0dXJuIDA7Ci0jZW5kaWYKLSAgICByZXR1cm4gbGluZWFyICsgKGJhc2UgJiAweEZGRik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYmFzZSAgICAgICAgLSBQaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSB0byBtYXAgaW4KLWxpbWl0ICAgICAgIC0gTGltaXQgb2YgcGh5c2ljYWwgbWVtb3J5IHRvIHJlZ2lvbiB0byBtYXAgaW4KLWlzQ2FjaGVkICAgIC0gVHJ1ZSBpZiB0aGUgbWVtb3J5IHNob3VsZCBiZSBjYWNoZWQsIGZhbHNlIGlmIG5vdAotCi1SRVRVUk5TOgotTGluZWFyIGFkZHJlc3Mgb2YgdGhlIG5ld2x5IG1hcHBlZCBtZW1vcnkuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIG1hcHMgcGh5c2ljYWwgbWVtb3J5IHRvIGxpbmVhciBtZW1vcnksIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQKLXRvIGNyZWF0ZSBhIHNlbGVjdG9yIG9yIHVzZWQgZGlyZWN0bHkgZnJvbSAzMi1iaXQgcHJvdGVjdGVkIG1vZGUgcHJvZ3JhbXMuCi1UaGlzIGlzIGJldHRlciB0aGFuIERQTUkgMHg4MDAsIHNpbmNlIGl0IGFsbG93cyB5b3UgdG8gbWFwcyBwaHlzaWNhbAotbWVtb3J5IGJlbG93IDFNYiwgd2hpY2ggZ2V0cyB0aGlzIG1lbW9yeSBvdXQgb2YgdGhlIHdheSBvZiB0aGUgV2luZG93cyBWeEQncwotc3RpY2t5IHBhd3MuCi0KLU5PVEU6ICAgSWYgdGhlIG1lbW9yeSBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgY2FjaGVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwKLQlkaXJlY3RseSByZS1wcm9ncmFtIHRoZSBQQ0QgKFBhZ2UgQ2FjaGUgRGlzYWJsZSkgYml0IGluIHRoZQotCXBhZ2UgdGFibGVzLiBUaGVyZSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYSBtZWNoYW5pc20gaW4gdGhlIFZNTQotCXRvIGNvbnRyb2wgdGhpcyBiaXQgdmlhIHRoZSByZWd1bGFyIGludGVyZmFjZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbWFwUGh5c2ljYWxBZGRyKAotICAgIHVsb25nIGJhc2UsCi0gICAgdWxvbmcgbGltaXQsCi0gICAgaWJvb2wgaXNDYWNoZWQpCi17Ci0gICAgdWxvbmcgICBsaW5lYXIsbGVuZ3RoID0gbGltaXQrMTsKLSAgICBpbnQgICAgIGksbnBhZ2VzOwotICAgIHVsb25nICAgUERCLCpwUERCOwotCi0gICAgLyogU2VhcmNoIHRhYmxlIG9mIGV4aXN0aW5nIG1hcHBpbmdzIHRvIHNlZSBpZiB3ZSBoYXZlIGFscmVhZHkgbWFwcGVkCi0gICAgICogYSByZWdpb24gb2YgbWVtb3J5IHRoYXQgd2lsbCBzZXJ2ZSB0aGlzIHB1cnBvc2UuCi0gICAgICovCi0gICAgZm9yIChpID0gMDsgaSA8IG51bU1hcHBpbmdzOyBpKyspIHsKLQlpZiAobWFwc1tpXS5waHlzaWNhbCA9PSBiYXNlICYmIG1hcHNbaV0ubGVuZ3RoID09IGxlbmd0aCAmJiBtYXBzW2ldLmlzQ2FjaGVkID09IGlzQ2FjaGVkKQotCSAgICByZXR1cm4gKHZvaWQqKW1hcHNbaV0ubGluZWFyOwotCX0KLSAgICBpZiAobnVtTWFwcGluZ3MgPT0gTUFYX01FTU9SWV9NQVBQSU5HUykKLQlyZXR1cm4gTlVMTDsKLQotICAgIC8qIFdlIGRpZCBub3QgZmluZCBhbnkgcHJldmlvdXNseSBtYXBwZWQgbWVtb3J5IHJlZ2lvbiwgc28gbWFwIGl0IGluLgotICAgICAqIE5vdGUgdGhhdCB3ZSBkbyBub3QgdXNlIE1hcFBoeXNUb0xpbmVhciwgc2luY2UgdGhpcyBmdW5jdGlvbiBhcHBlYXJzCi0gICAgICogdG8gaGF2ZSBwcm9ibGVtcyBtYXBwaW5nIG1lbW9yeSBpbiB0aGUgMU1iIHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UuCi0gICAgICogSGVuY2Ugd2UgdXNlIFBhZ2VSZXNlcnZlIGFuZCBQYWdlQ29tbWl0UGh5cy4KLSAgICAgKi8KLSAgICBpZiAoKGxpbmVhciA9IE1hcFBoeXNpY2FsVG9MaW5lYXIoYmFzZSxsaW1pdCwmbnBhZ2VzKSkgPT0gMCkKLQlyZXR1cm4gTlVMTDsKLSAgICBtYXBzW251bU1hcHBpbmdzXS5waHlzaWNhbCA9IGJhc2U7Ci0gICAgbWFwc1tudW1NYXBwaW5nc10ubGVuZ3RoID0gbGVuZ3RoOwotICAgIG1hcHNbbnVtTWFwcGluZ3NdLmxpbmVhciA9IGxpbmVhcjsKLSAgICBtYXBzW251bU1hcHBpbmdzXS5ucGFnZXMgPSBucGFnZXM7Ci0gICAgbWFwc1tudW1NYXBwaW5nc10uaXNDYWNoZWQgPSBpc0NhY2hlZDsKLSAgICBudW1NYXBwaW5ncysrOwotCi0jaWYgMAotICAgIC8qIEZpbmFsbHkgZGlzYWJsZSBjYWNoaW5nIHdoZXJlIG5lY2Vzc2FyeSAqLwotICAgIGlmICghaXNDYWNoZWQgJiYgKFBEQiA9IF9QTV9nZXRQREIoKSkgIT0gMCkgewotCWludCAgICAgc3RhcnRQREIsZW5kUERCLGlQREIsc3RhcnRQYWdlLGVuZFBhZ2Usc3RhcnQsZW5kLGlQYWdlOwotCXVsb25nICAgcGFnZVRhYmxlLCpwUGFnZVRhYmxlOwotCi0JaWYgKFBEQiA+PSAweDEwMDAwMCkKLQkgICAgcFBEQiA9ICh1bG9uZyopTWFwUGh5c2ljYWxUb0xpbmVhcihQREIsMHhGRkYsJm5wYWdlcyk7Ci0JZWxzZQotCSAgICBwUERCID0gKHVsb25nKilQREI7Ci0JaWYgKHBQREIpIHsKLQkgICAgc3RhcnRQREIgPSAobGluZWFyID4+IDIyKSAmIDB4M0ZGOwotCSAgICBzdGFydFBhZ2UgPSAobGluZWFyID4+IDEyKSAmIDB4M0ZGOwotCSAgICBlbmRQREIgPSAoKGxpbmVhcitsaW1pdCkgPj4gMjIpICYgMHgzRkY7Ci0JICAgIGVuZFBhZ2UgPSAoKGxpbmVhcitsaW1pdCkgPj4gMTIpICYgMHgzRkY7Ci0JICAgIGZvciAoaVBEQiA9IHN0YXJ0UERCOyBpUERCIDw9IGVuZFBEQjsgaVBEQisrKSB7Ci0JCXBhZ2VUYWJsZSA9IHBQREJbaVBEQl0gJiB+MHhGRkY7Ci0JCWlmIChwYWdlVGFibGUgPj0gMHgxMDAwMDApCi0JCSAgICBwUGFnZVRhYmxlID0gKHVsb25nKilNYXBQaHlzaWNhbFRvTGluZWFyKHBhZ2VUYWJsZSwweEZGRiwmbnBhZ2VzKTsKLQkJZWxzZQotCQkgICAgcFBhZ2VUYWJsZSA9ICh1bG9uZyopcGFnZVRhYmxlOwotCQlzdGFydCA9IChpUERCID09IHN0YXJ0UERCKSA/IHN0YXJ0UGFnZSA6IDA7Ci0JCWVuZCA9IChpUERCID09IGVuZFBEQikgPyBlbmRQYWdlIDogMHgzRkY7Ci0JCWZvciAoaVBhZ2UgPSBzdGFydDsgaVBhZ2UgPD0gZW5kOyBpUGFnZSsrKQotCQkgICAgcFBhZ2VUYWJsZVtpUGFnZV0gfD0gMHgxMDsKLQkJUGFnZUZyZWUoKHVsb25nKXBQYWdlVGFibGUsUFJfU1RBVElDKTsKLQkJfQotCSAgICBQYWdlRnJlZSgodWxvbmcpcFBEQixQUl9TVEFUSUMpOwotCSAgICB9Ci0JfQotI2VuZGlmCi0gICAgcmV0dXJuICh2b2lkKilsaW5lYXI7Ci19Ci0KLXZvaWQgUE1BUEkgUE1fZnJlZVBoeXNpY2FsQWRkcih2b2lkICpwdHIsdWxvbmcgbGltaXQpCi17Ci0gICAgLyogV2UgbmV2ZXIgZnJlZSB0aGUgbWFwcGluZ3MgKi8KLX0KLQotdm9pZCBQTUFQSSBQTV9zbGVlcCh1bG9uZyBtaWxsaXNlY29uZHMpCi17Ci0gICAgLyogV2UgbmV2ZXIgc2xlZXAgaW4gYSBWREQgKi8KLX0KLQotaW50IFBNQVBJIFBNX2dldENPTVBvcnQoaW50IHBvcnQpCi17Ci0gICAgLyogVE9ETzogUmUtY29kZSB0aGlzIHRvIGRldGVybWluZSByZWFsIHZhbHVlcyB1c2luZyB0aGUgUGx1ZyBhbmQgUGxheSAqLwotICAgIC8qICAgICAgIG1hbmFnZXIgZm9yIHRoZSBPUy4gKi8KLSAgICBzd2l0Y2ggKHBvcnQpIHsKLQljYXNlIDA6IHJldHVybiAweDNGODsKLQljYXNlIDE6IHJldHVybiAweDJGODsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBQTUFQSSBQTV9nZXRMUFRQb3J0KGludCBwb3J0KQotewotICAgIC8qIFRPRE86IFJlLWNvZGUgdGhpcyB0byBkZXRlcm1pbmUgcmVhbCB2YWx1ZXMgdXNpbmcgdGhlIFBsdWcgYW5kIFBsYXkgKi8KLSAgICAvKiAgICAgICBtYW5hZ2VyIGZvciB0aGUgT1MuICovCi0gICAgc3dpdGNoIChwb3J0KSB7Ci0JY2FzZSAwOiByZXR1cm4gMHgzQkM7Ci0JY2FzZSAxOiByZXR1cm4gMHgzNzg7Ci0JY2FzZSAyOiByZXR1cm4gMHgyNzg7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi11bG9uZyBQTUFQSSBQTV9nZXRQaHlzaWNhbEFkZHIodm9pZCAqcCkKLXsKLQkvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBmaW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIGEgbGluZWFyICovCi0JLyogICAgICAgICAgICAgICBhZGRyZXNzLiAqLwotCXJldHVybiAweEZGRkZGRkZGVUw7Ci19Ci0KLXZvaWQgUE1BUEkgX1BNX2ZyZWVNZW1vcnlNYXBwaW5ncyh2b2lkKQotewotICAgIGludCBpOwotLyogICAgZm9yIChpID0gMDsgaSA8IG51bU1hcHBpbmdzOyBpKyspICovCi0vKiAgICAgICAgUGFnZUZyZWUobWFwc1tpXS5saW5lYXIsUFJfU1RBVElDKTsgKi8KLX0KLQotdm9pZCAqIFBNQVBJIFBNX21hcFJlYWxQb2ludGVyKHVpbnQgcl9zZWcsdWludCByX29mZikKLXsgcmV0dXJuICh2b2lkKilNS19QSFlTKHJfc2VnLHJfb2ZmKTsgfQotCi12b2lkICogUE1BUEkgUE1fYWxsb2NSZWFsU2VnKHVpbnQgc2l6ZSx1aW50ICpyX3NlZyx1aW50ICpyX29mZikKLXsgcmV0dXJuIE5VTEw7IH0KLQotdm9pZCBQTUFQSSBQTV9mcmVlUmVhbFNlZyh2b2lkICptZW0pCi17IH0KLQotdm9pZCBQTUFQSSBEUE1JX2ludDg2KGludCBpbnRubywgRFBNSV9yZWdzICpyZWdzKQotewotICAgIC8qIFVuc2VkIGluIFZERHMgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Mb2FkIHRoZSBWODYgcmVnaXN0ZXJzIGluIHRoZSBjbGllbnQgc3RhdGUsIGFuZCBzYXZlIHRoZSBvcmlnaW5hbCBzdGF0ZQotYmVmb3JlIGxvYWRpbmcgdGhlIHJlZ2lzdGVycy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBMb2FkVjg2UmVnaXN0ZXJzKAotICAgIFBDUkYgc2F2ZVJlZ3MsCi0gICAgUk1SRUdTICppbiwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICBQQ1JGICAgICAgICAgICAgcGNyZjsgICAgIC8qIGN1cnJlbnQgY2xpZW50IHJlZ2lzdGVyIGZyYW1lICovCi0KLSAgICAvKiBnZXQgcG9pbnRlciB0byByZWdpc3RlcnMgKi8KLSAgICBwY3JmID0gKFBDUkYpVkRIUXVlcnlTeXNWYWx1ZShDVVJSRU5UX1ZETSwgVkRITFNWX1BDUkYpOwotCi0gICAgLyogTm90ZTogV2UgY291bGQgZG8gVkRIUHVzaFJlZ3MgaW5zdGVhZCBidXQgdGhpcyBzaG91bGQgYmUgc2FmZXIgYXMgaXQgKi8KLSAgICAvKiBkb2Vzbid0IHJlbHkgb24gdGhlIFZETSBzZXNzaW9uIGhhdmluZyBlbm91Z2ggZnJlZSBzdGFjayBzcGFjZS4gKi8KLSAgICAqc2F2ZVJlZ3MgPSAqcGNyZjsgICAgICAgIC8qIHNhdmUgYWxsIHJlZ2lzdGVycyAqLwotCi0gICAgcGNyZi0+Y3JmX2VheCA9IGluLT5lLmVheDsgICAgLyogbG9hZCBuZXcgdmFsdWVzICovCi0gICAgcGNyZi0+Y3JmX2VieCA9IGluLT5lLmVieDsKLSAgICBwY3JmLT5jcmZfZWN4ID0gaW4tPmUuZWN4OwotICAgIHBjcmYtPmNyZl9lZHggPSBpbi0+ZS5lZHg7Ci0gICAgcGNyZi0+Y3JmX2VzaSA9IGluLT5lLmVzaTsKLSAgICBwY3JmLT5jcmZfZWRpID0gaW4tPmUuZWRpOwotICAgIHBjcmYtPmNyZl9lcyAgPSBzcmVncy0+ZXM7Ci0gICAgcGNyZi0+Y3JmX2RzICA9IHNyZWdzLT5kczsKLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWQgdGhlIFY4NiByZWdpc3RlcnMgZnJvbSB0aGUgY2xpZW50IHN0YXRlIGFuZCByZXN0b3JlIHRoZSBvcmlnaW5hbCBzdGF0ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBSZWFkVjg2UmVnaXN0ZXJzKAotICAgIFBDUkYgc2F2ZVJlZ3MsCi0gICAgUk1SRUdTICpvdXQsCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgUENSRiAgICAgICAgICAgIHBjcmY7ICAgICAvKiBjdXJyZW50IGNsaWVudCByZWdpc3RlciBmcmFtZSAqLwotCi0gICAgLyogZ2V0IHBvaW50ZXIgdG8gcmVnaXN0ZXJzICovCi0gICAgcGNyZiA9IChQQ1JGKVZESFF1ZXJ5U3lzVmFsdWUoQ1VSUkVOVF9WRE0sIFZESExTVl9QQ1JGKTsKLQotICAgIC8qIHJlYWQgbmV3IHJlZ2lzdGVyIHZhbHVlcyAqLwotICAgIG91dC0+ZS5lYXggPSBwY3JmLT5jcmZfZWF4OwotICAgIG91dC0+ZS5lYnggPSBwY3JmLT5jcmZfZWJ4OwotICAgIG91dC0+ZS5lY3ggPSBwY3JmLT5jcmZfZWN4OwotICAgIG91dC0+ZS5lZHggPSBwY3JmLT5jcmZfZWR4OwotICAgIG91dC0+ZS5lc2kgPSBwY3JmLT5jcmZfZXNpOwotICAgIG91dC0+ZS5lZGkgPSBwY3JmLT5jcmZfZWRpOwotICAgIHNyZWdzLT5lcyAgPSBwY3JmLT5jcmZfZXM7Ci0gICAgc3JlZ3MtPmRzICA9IHBjcmYtPmNyZl9kczsKLQotICAgIC8qIHJlc3RvcmUgb3JpZ2luYWwgY2xpZW50IHJlZ2lzdGVycyAqLwotICAgICpwY3JmID0gKnNhdmVSZWdzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzogVXNlZCBmb3IgZmFyIGNhbGxzIGludG8gVjg2IGNvZGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1WT0lEIEhPT0tFTlRSWSBVc2VyUmV0dXJuSG9vaygKLSAgUFZPSUQgcFJlZkRhdGEsCi0gIFBDUkYgcGNyZiApCi17Ci0gICAgVkRIUG9zdEV2ZW50U2VtKGhldkZhckNhbGxSZXQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzogVXNlZCBmb3IgY2FsbGluZyBCSU9TIGludGVycnVwdHMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1WT0lEIEhPT0tFTlRSWSBVc2VySVJldEhvb2soCi0gIFBWT0lEIHBSZWZEYXRhLAotICBQQ1JGIHBjcmYgKQotewotICAgIFZESFBvc3RFdmVudFNlbShoZXZJUmV0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIGEgVjg2IHJlYWwgbW9kZSBmdW5jdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgdmFsdWVzCi1sb2FkZWQgYmVmb3JlIHRoZSBjYWxsLiBUaGUgY2FsbCByZXR1cm5zIHdpdGggYSBmYXIgcmV0LgotTXVzdCBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gYSBET1Mgc2Vzc2lvbiBjb250ZXh0IQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fY2FsbFJlYWxNb2RlKAotICAgIHVpbnQgc2VnLAotICAgIHVpbnQgb2ZmLAotICAgIFJNUkVHUyAqcmVncywKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICBDUkYgICBzYXZlUmVnczsKLSAgICBGUEZOICBmbkFkZHJlc3M7Ci0gICAgVUxPTkcgcmM7Ci0KLSAgICBUUkFDRSgiU0RESEVMUDogRW50ZXJpbmcgUE1fY2FsbFJlYWxNb2RlKClcbiIpOwotICAgIExvYWRWODZSZWdpc3RlcnMoU1NUb0RTKCZzYXZlUmVncykscmVncyxzcmVncyk7Ci0KLSAgICAvKiBzZXQgdXAgcmV0dXJuIGhvb2sgZm9yIGNhbGwgKi8KLSAgICByYyA9IFZESEFybVJldHVybkhvb2soaGhvb2tVc2VyUmV0dXJuSG9vaywgVkRIQVJIX0NTRUlQX0hPT0spOwotCi0gICAgVkRIUmVzZXRFdmVudFNlbShoZXZGYXJDYWxsUmV0KTsKLQotICAgIC8qIHRoZSBhZGRyZXNzIGlzIGEgMTY6MzIgcG9pbnRlciAqLwotICAgIE9GRlNFVE9GMzIoZm5BZGRyZXNzKSAgPSBvZmY7Ci0gICAgU0VHTUVOVE9GMzIoZm5BZGRyZXNzKSA9IHNlZzsKLSAgICByYyA9IFZESFB1c2hGYXJDYWxsKGZuQWRkcmVzcyk7Ci0gICAgVkRIWWllbGQoMCk7Ci0KLSAgICAvKiB3YWl0IHVudGlsIHRoZSBWODYgY2FsbCByZXR1cm5zIC0gb3VyIHJldHVybiBob29rIHBvc3RzIHRoZSBzZW1hcGhvcmUgKi8KLSAgICByYyA9IFZESFdhaXRFdmVudFNlbShoZXZGYXJDYWxsUmV0LCBTRU1fSU5ERUZJTklURV9XQUlUKTsKLQotICAgIFJlYWRWODZSZWdpc3RlcnMoU1NUb0RTKCZzYXZlUmVncykscmVncyxzcmVncyk7Ci0gICAgVFJBQ0UoIlNEREhFTFA6IEV4aXRpbmcgUE1fY2FsbFJlYWxNb2RlKClcbiIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUlzc3VlIGEgVjg2IHJlYWwgbW9kZSBpbnRlcnJ1cHQgd2l0aCB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIHZhbHVlcwotbG9hZGVkIGJlZm9yZSB0aGUgaW50ZXJydXB0LgotTXVzdCBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gYSBET1Mgc2Vzc2lvbiBjb250ZXh0IQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9pbnQ4NigKLSAgICBpbnQgaW50bm8sCi0gICAgUk1SRUdTICppbiwKLSAgICBSTVJFR1MgKm91dCkKLXsKLSAgICBSTVNSRUdTICAgIHNyZWdzID0gezB9OwotICAgIENSRiAgICAgICAgc2F2ZVJlZ3M7Ci0gICAgdXNob3J0ICAgICBvbGREaXNhYmxlOwotICAgIFVMT05HICAgICAgcmM7Ci0KLSAgICBtZW1zZXQoU1NUb0RTKCZzcmVncyksIDAsIHNpemVvZihzcmVncykpOwotCi0jaWYgMCAgIC8qIGRvIHdlIG5lZWQgdGhpcz8/ICovCi0gICAgLyogRGlzYWJsZSBwYXNzLXVwIHRvIG91ciBWREQgaGFuZGxlciBzbyB3ZSBkaXJlY3RseSBjYWxsIEJJT1MgKi8KLSAgICBUUkFDRSgiU0RESEVMUDogRW50ZXJpbmcgUE1faW50ODYoKVxuIik7Ci0gICAgaWYgKGRpc2FibGVUU1JGbGFnKSB7Ci0Jb2xkRGlzYWJsZSA9ICpkaXNhYmxlVFNSRmxhZzsKLQkqZGlzYWJsZVRTUkZsYWcgPSAwOwotCX0KLSNlbmRpZgotCi0gICAgTG9hZFY4NlJlZ2lzdGVycyhTU1RvRFMoJnNhdmVSZWdzKSwgaW4sIFNTVG9EUygmc3JlZ3MpKTsKLQotICAgIFZESFJlc2V0RXZlbnRTZW0oaGV2SVJldCk7Ci0gICAgcmMgPSBWREhQdXNoSW50KGludG5vKTsKLQotICAgIC8qIHNldCB1cCByZXR1cm4gaG9vayBmb3IgaW50ZXJydXB0ICovCi0gICAgcmMgPSBWREhBcm1SZXR1cm5Ib29rKGhob29rVXNlcklSZXRIb29rLCBWREhBUkhfTk9STUFMX0lSRVQpOwotCi0gICAgVkRIWWllbGQoMCk7Ci0KLSAgICAvKiB3YWl0IHVudGlsIHRoZSBWODYgSVJFVHMgLSBvdXIgcmV0dXJuIGhvb2sgcG9zdHMgdGhlIHNlbWFwaG9yZSAqLwotICAgIHJjID0gVkRIV2FpdEV2ZW50U2VtKGhldklSZXQsIDUwMDApOyAvKlNFTV9JTkRFRklOSVRFX1dBSVQpOyAqLwotCi0gICAgUmVhZFY4NlJlZ2lzdGVycyhTU1RvRFMoJnNhdmVSZWdzKSwgb3V0LCBTU1RvRFMoJnNyZWdzKSk7Ci0KLSNpZiAwCi0gICAgLyogUmUtZW5hYmxlIHBhc3MtdXAgdG8gb3VyIFZERCBoYW5kbGVyIGlmIHByZXZpb3VzbHkgZW5hYmxlZCAqLwotICAgIGlmIChkaXNhYmxlVFNSRmxhZykKLQkqZGlzYWJsZVRTUkZsYWcgPSBvbGREaXNhYmxlOwotI2VuZGlmCi0KLSAgICBUUkFDRSgiU0RESEVMUDogRXhpdGluZyBQTV9pbnQ4NigpXG4iKTsKLSAgICByZXR1cm4gb3V0LT54LmF4OwotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSXNzdWUgYSBWODYgcmVhbCBtb2RlIGludGVycnVwdCB3aXRoIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgdmFsdWVzCi1sb2FkZWQgYmVmb3JlIHRoZSBpbnRlcnJ1cHQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2ludDg2eCgKLSAgICBpbnQgaW50bm8sCi0gICAgUk1SRUdTICppbiwKLSAgICBSTVJFR1MgKm91dCwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICBDUkYgICAgICAgICAgICAgc2F2ZVJlZ3M7Ci0gICAgdXNob3J0ICAgICAgICAgIG9sZERpc2FibGU7Ci0gICAgVUxPTkcgICAgICAgcmM7Ci0KLSNpZiAwCi0gICAgLyogRGlzYWJsZSBwYXNzLXVwIHRvIG91ciBWeEQgaGFuZGxlciBzbyB3ZSBkaXJlY3RseSBjYWxsIEJJT1MgKi8KLSAgICBUUkFDRSgiU0RESEVMUDogRW50ZXJpbmcgUE1faW50ODZ4KClcbiIpOwotICAgIGlmIChkaXNhYmxlVFNSRmxhZykgewotCW9sZERpc2FibGUgPSAqZGlzYWJsZVRTUkZsYWc7Ci0JKmRpc2FibGVUU1JGbGFnID0gMDsKLQl9Ci0jZW5kaWYKLSAgICBMb2FkVjg2UmVnaXN0ZXJzKFNTVG9EUygmc2F2ZVJlZ3MpLCBpbiwgc3JlZ3MpOwotCi0gICAgVkRIUmVzZXRFdmVudFNlbShoZXZJUmV0KTsKLSAgICByYyA9IFZESFB1c2hJbnQoaW50bm8pOwotCi0gICAgLyogc2V0IHVwIHJldHVybiBob29rIGZvciBpbnRlcnJ1cHQgKi8KLSAgICByYyA9IFZESEFybVJldHVybkhvb2soaGhvb2tVc2VySVJldEhvb2ssIFZESEFSSF9OT1JNQUxfSVJFVCk7Ci0KLSAgICBWREhZaWVsZCgwKTsKLQotICAgIC8qIHdhaXQgdW50aWwgdGhlIFY4NiBJUkVUcyAtIG91ciByZXR1cm4gaG9vayBwb3N0cyB0aGUgc2VtYXBob3JlICovCi0gICAgcmMgPSBWREhXYWl0RXZlbnRTZW0oaGV2SVJldCwgNTAwMCk7IC8qU0VNX0lOREVGSU5JVEVfV0FJVCk7ICovCi0KLSAgICBSZWFkVjg2UmVnaXN0ZXJzKFNTVG9EUygmc2F2ZVJlZ3MpLCBvdXQsIHNyZWdzKTsKLQotI2lmIDAKLSAgICAvKiBSZS1lbmFibGUgcGFzcy11cCB0byBvdXIgVnhEIGhhbmRsZXIgaWYgcHJldmlvdXNseSBlbmFibGVkICovCi0gICAgaWYgKGRpc2FibGVUU1JGbGFnKQotCSpkaXNhYmxlVFNSRmxhZyA9IG9sZERpc2FibGU7Ci0jZW5kaWYKLQotICAgIFRSQUNFKCJTRERIRUxQOiBFeGl0aW5nIFBNX2ludDg2eCgpXG4iKTsKLSAgICByZXR1cm4gb3V0LT54LmF4OwotfQotCi12b2lkIFBNQVBJIFBNX2F2YWlsYWJsZU1lbW9yeSh1bG9uZyAqcGh5c2ljYWwsdWxvbmcgKnRvdGFsKQoteyAqcGh5c2ljYWwgPSAqdG90YWwgPSAwOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGVzIGEgYmxvY2sgb2YgbG9ja2VkIHBoeXNpY2FsIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fYWxsb2NMb2NrZWRNZW0oCi0gICAgdWludCBzaXplLAotICAgIHVsb25nICpwaHlzQWRkciwKLSAgICBpYm9vbCBjb250aWd1b3VzLAotICAgIGlib29sIGJlbG93MTZNKQotewotICAgIFVMT05HICAgICAgIGZsYWdzID0gVkRIQVBfU1lTVEVNOwotICAgIFVMT05HICAgICAgIG5QYWdlcyA9IChzaXplICsgMHhGRkYpID4+IDEyOwotCi0gICAgZmxhZ3MgfD0gKHBoeXNBZGRyICE9IE5VTEwpID8gVkRIQVBfUEhZU0lDQUwgOiBWREhBUF9GSVhFRDsKLQotICAgIHJldHVybiBWREhBbGxvY1BhZ2VzKHBoeXNBZGRyLCBuUGFnZXMsIFZESEFQX1NZU1RFTSB8IFZESEFQX1BIWVNJQ0FMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlcyBhIGJsb2NrIG9mIGxvY2tlZCBwaHlzaWNhbCBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlTG9ja2VkTWVtKAotICAgIHZvaWQgKnAsCi0gICAgdWludCBzaXplLAotICAgIGlib29sIGNvbnRpZ3VvdXMpCi17Ci0gICAgaWYgKHApCi0JVkRIRnJlZVBhZ2VzKChQVk9JRClwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Mb2NrIGxpbmVhciBtZW1vcnkgc28gaXQgd29uJ3QgYmUgcGFnZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2xvY2tEYXRhUGFnZXModm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBVTE9ORyAgbG9ja0hhbmRsZTsKLQotICAgIC8qIFRPRE86IHRoZSBsb2NrIGhhbmRsZSBpcyBlc3NlbnRpYWwgZm9yIHRoZSB1bmxvY2sgb3BlcmF0aW9uISEgKi8KLSAgICBsb2NrSGFuZGxlID0gVkRITG9ja01lbShwLCBsZW4sIDAsIChQVk9JRClWREhMTV9OT19BRERSLCBOVUxMKTsKLQotICAgIGlmIChsb2NrSGFuZGxlICE9IE5VTEwpCi0gICAgICAgcmV0dXJuIDA7Ci0gICAgZWxzZQotICAgICAgIHJldHVybiAxOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVVubG9jayBsaW5lYXIgbWVtb3J5IHNvIGl0IHdvbid0IGJlIHBhZ2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV91bmxvY2tEYXRhUGFnZXModm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICAvKiBUT0RPOiBpbXBsZW1lbnQgLSB1c2UgYSB0YWJsZSBvZiBsb2NrIGhhbmRsZXM/ICovCi0gICAgLyogVkRIVW5sb2NrUGFnZXMobG9ja0hhbmRsZSk7ICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTG9jayBsaW5lYXIgbWVtb3J5IHNvIGl0IHdvbid0IGJlIHBhZ2VkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9sb2NrQ29kZVBhZ2VzKHZvaWQgKCpwKSgpLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIHJldHVybiBQTV9sb2NrRGF0YVBhZ2VzKCh2b2lkKilwLGxlbixsaCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVW5sb2NrIGxpbmVhciBtZW1vcnkgc28gaXQgd29uJ3QgYmUgcGFnZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX3VubG9ja0NvZGVQYWdlcyh2b2lkICgqcCkoKSx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICByZXR1cm4gUE1fdW5sb2NrRGF0YVBhZ2VzKCh2b2lkKilwLGxlbixsaCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotT1Mgc3BlY2lmaWMgc2hhcmVkIGxpYnJhcmllcyBub3Qgc3VwcG9ydGVkIGluc2lkZSBhIFZERAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVBNX01PRFVMRSBQTUFQSSBQTV9sb2FkTGlicmFyeSgKLSAgICBjb25zdCBjaGFyICpzekRMTE5hbWUpCi17Ci0gICAgKHZvaWQpc3pETExOYW1lOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU9TIHNwZWNpZmljIHNoYXJlZCBsaWJyYXJpZXMgbm90IHN1cHBvcnRlZCBpbnNpZGUgYSBWREQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fZ2V0UHJvY0FkZHJlc3MoCi0gICAgUE1fTU9EVUxFIGhNb2R1bGUsCi0gICAgY29uc3QgY2hhciAqc3pQcm9jTmFtZSkKLXsKLSAgICAodm9pZCloTW9kdWxlOwotICAgICh2b2lkKXN6UHJvY05hbWU7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotT1Mgc3BlY2lmaWMgc2hhcmVkIGxpYnJhcmllcyBub3Qgc3VwcG9ydGVkIGluc2lkZSBhIFZERAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZUxpYnJhcnkoCi0gICAgUE1fTU9EVUxFIGhNb2R1bGUpCi17Ci0gICAgKHZvaWQpaE1vZHVsZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBmaW5kIHRoZSBmaXJzdCBmaWxlIG1hdGNoaW5nIGEgc2VhcmNoIGNyaXRlcmlhIGluIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKlBNQVBJIFBNX2ZpbmRGaXJzdEZpbGUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIHN0YXJ0IGEgZGlyZWN0b3J5IGVudW1lcmF0aW9uIHNlYXJjaCAqLwotICAgIC8qICAgICAgIGdpdmVuIHRoZSBmaWxlbmFtZSAod2l0aCB3aWxkY2FyZHMpLiBUaGUgZGF0YSBzaG91bGQgYmUgKi8KLSAgICAvKiAgICAgICBjb252ZXJ0ZWQgYW5kIHJldHVybmVkIGluIHRoZSBmaW5kRGF0YSBzdGFuZGFyZCBmb3JtLiAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgICh2b2lkKWZpbmREYXRhOwotICAgIHJldHVybiBQTV9GSUxFX0lOVkFMSUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZmluZCB0aGUgbmV4dCBmaWxlIG1hdGNoaW5nIGEgc2VhcmNoIGNyaXRlcmlhIGluIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2ZpbmROZXh0RmlsZSgKLSAgICB2b2lkICpoYW5kbGUsCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGZpbmQgdGhlIG5leHQgZmlsZSBpbiBkaXJlY3RvcnkgZW51bWVyYXRpb24gKi8KLSAgICAvKiAgICAgICBzZWFyY2ggZ2l2ZW4gdGhlIHNlYXJjaCBjcml0ZXJpYSBkZWZpbmVkIGluIHRoZSBjYWxsIHRvICovCi0gICAgLyogICAgICAgUE1fZmluZEZpcnN0RmlsZS4gVGhlIGRhdGEgc2hvdWxkIGJlIGNvbnZlcnRlZCBhbmQgcmV0dXJuZWQgKi8KLSAgICAvKiAgICAgICBpbiB0aGUgZmluZERhdGEgc3RhbmRhcmQgZm9ybS4gKi8KLSAgICAodm9pZCloYW5kbGU7Ci0gICAgKHZvaWQpZmluZERhdGE7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNsb3NlIHRoZSBmaW5kIHByb2Nlc3MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZpbmRDbG9zZSgKLSAgICB2b2lkICpoYW5kbGUpCi17Ci0gICAgLyogVE9ETzogVGhpcyBmdW5jdGlvbiBzaG91bGQgY2xvc2UgdGhlIGZpbmQgcHJvY2Vzcy4gVGhpcyBtYXkgZG8gKi8KLSAgICAvKiAgICAgICBub3RoaW5nIGZvciBzb21lIE9TJ2VzLiAqLwotICAgICh2b2lkKWhhbmRsZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSBkcml2ZSBpcyBhIHZhbGlkIGRyaXZlIG9yIG5vdC4gVW5kZXIgVW5peCB0aGlzCi1mdW5jdGlvbiB3aWxsIHJldHVybiBmYWxzZSBmb3IgYW55dGhpbmcgZXhjZXB0IGEgdmFsdWUgb2YgMyAoY29uc2lkZXJlZAotdGhlIHJvb3QgZHJpdmUsIGFuZCBlcXVpdmFsZW50IHRvIEM6IGZvciBub24tVW5peCBzeXN0ZW1zKS4gVGhlIGRyaXZlCi1udW1iZXJpbmcgaXM6Ci0KLSAgICAxICAgLSBEcml2ZSBBOgotICAgIDIgICAtIERyaXZlIEI6Ci0gICAgMyAgIC0gRHJpdmUgQzoKLSAgICBldGMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2RyaXZlVmFsaWQoCi0gICAgY2hhciBkcml2ZSkKLXsKLSAgICAvKiBOb3QgYXBwbGljYWJsZSBpbiBhIFZERCAqLwotICAgICh2b2lkKWRyaXZlOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSBzcGVjaWZpZmVkIGRyaXZlLgotVW5kZXIgVW5peCB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSByZWdhcmRsZXNzCi1vZiB3aGF0IHRoZSB2YWx1ZSBvZiAnZHJpdmUnIGlzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZ2V0ZGN3ZCgKLSAgICBpbnQgZHJpdmUsCi0gICAgY2hhciAqZGlyLAotICAgIGludCBsZW4pCi17Ci0gICAgLyogTm90IGFwcGxpY2FibGUgaW4gYSBWREQgKi8KLSAgICAodm9pZClkcml2ZTsKLSAgICAodm9pZClkaXI7Ci0gICAgKHZvaWQpbGVuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWJhc2UgICAgLSBUaGUgc3RhcnRpbmcgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSByZWdpb24KLXNpemUgICAgLSBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVnaW9uCi10eXBlICAgIC0gVHlwZSB0byBwbGFjZSBpbnRvIHRoZSBNVFJSIHJlZ2lzdGVyCi0KLVJFVFVSTlM6Ci1FcnJvciBjb2RlIGRlc2NyaWJpbmcgdGhlIHJlc3VsdC4KLQotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGVuYWJsZSB3cml0ZSBjb21iaW5pbmcgZm9yIHRoZSBzcGVjaWZpZWQgcmVnaW9uIG9mIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZW5hYmxlV3JpdGVDb21iaW5lKAotICAgIHVsb25nIGJhc2UsCi0gICAgdWxvbmcgc2l6ZSwKLSAgICB1aW50IHR5cGUpCi17Ci0gICAgcmV0dXJuIE1UUlJfZW5hYmxlV3JpdGVDb21iaW5lKGJhc2Usc2l6ZSx0eXBlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjaGFuZ2UgdGhlIGZpbGUgYXR0cmlidXRlcyBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0RmlsZUF0dHIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgdWludCBhdHRyaWIpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgPyAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgICh2b2lkKWF0dHJpYjsKLSAgICBQTV9mYXRhbEVycm9yKCJQTV9zZXRGaWxlQXR0ciBub3QgaW1wbGVtZW50ZWQhIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZ2V0IHRoZSBmaWxlIGF0dHJpYnV0ZXMgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50IFBNQVBJIFBNX2dldEZpbGVBdHRyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzID8gKi8KLSAgICAodm9pZClmaWxlbmFtZTsKLSAgICBQTV9mYXRhbEVycm9yKCJQTV9nZXRGaWxlQXR0ciBub3QgaW1wbGVtZW50ZWQhIik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gY3JlYXRlIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX21rZGlyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzID8gKi8KLSAgICAodm9pZClmaWxlbmFtZTsKLSAgICBQTV9mYXRhbEVycm9yKCJQTV9ta2RpciBub3QgaW1wbGVtZW50ZWQhIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIHJlbW92ZSBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9ybWRpcigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyA/ICovCi0gICAgKHZvaWQpZmlsZW5hbWU7Ci0gICAgUE1fZmF0YWxFcnJvcigiUE1fcm1kaXIgbm90IGltcGxlbWVudGVkISIpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGZpbGUgdGltZSBhbmQgZGF0ZSBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2dldEZpbGVUaW1lKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIGlib29sIGdtVGltZSwKLSAgICBQTV90aW1lICp0aW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzID8gKi8KLSAgICAodm9pZClmaWxlbmFtZTsKLSAgICAodm9pZClnbVRpbWU7Ci0gICAgKHZvaWQpdGltZTsKLSAgICBQTV9mYXRhbEVycm9yKCJQTV9nZXRGaWxlVGltZSBub3QgaW1wbGVtZW50ZWQhIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIHNldCB0aGUgZmlsZSB0aW1lIGFuZCBkYXRlIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fc2V0RmlsZVRpbWUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgaWJvb2wgZ21UaW1lLAotICAgIFBNX3RpbWUgKnRpbWUpCi17Ci0gICAgLyogVE9ETzogSW1wbGVtZW50IHRoaXMgPyAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgICh2b2lkKWdtVGltZTsKLSAgICAodm9pZCl0aW1lOwotICAgIFBNX2ZhdGFsRXJyb3IoIlBNX3NldEZpbGVUaW1lIG5vdCBpbXBsZW1lbnRlZCEiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92ZGQvdmZsYXQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3ZkZC92ZmxhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTYzOTI4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3ZkZC92ZmxhdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICAgICAgICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIER1bW15IG1vZHVsZTsgbm8gdmlydHVhbCBmcmFtZWJ1ZmZlciBmb3IgdGhpcyBPUwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0KLWlib29sIFBNQVBJIFZGX2F2YWlsYWJsZSh2b2lkKQotewotCXJldHVybiBmYWxzZTsKLX0KLQotdm9pZCAqIFBNQVBJIFZGX2luaXQodWxvbmcgYmFzZUFkZHIsaW50IGJhbmtTaXplLGludCBjb2RlTGVuLHZvaWQgKmJhbmtGdW5jKQotewotCXJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFZGX2V4aXQodm9pZCkKLXsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3ZkZC96dGltZXIuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3ZkZC96dGltZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMxZjY1NS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92ZGQvenRpbWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IE9TLzIgVkRECi0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBaZW4gVGltZXIgZnVuY3Rpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHVsb25nICAgIGZyZXF1ZW5jeSA9IDExOTMxODA7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgWmVuIFRpbWVyIG1vZHVsZSBpbnRlcm5hbHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfX1pUaW1lckluaXQoKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfX0xaVGltZXJPbih0bSkgICAgIFZURF9HZXRfUmVhbF9UaW1lKCZ0bS0+c3RhcnQuaGlnaCwmdG0tPnN0YXJ0LmxvdykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfX0xaVGltZXJMYXAoCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0gICAgQ1BVX2xhcmdlSW50ZWdlciAgICBsYXAsY291bnQ7Ci0gICAgVlREX0dldF9SZWFsX1RpbWUoJmxhcC5oaWdoLCZsYXAubG93KTsKLSAgICBfQ1BVX2RpZmZUaW1lNjQoJnRtLT5zdGFydCwmbGFwLCZjb3VudCk7Ci0gICAgcmV0dXJuIF9DUFVfY2FsY01pY3JvU2VjKCZjb3VudCxmcmVxdWVuY3kpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfX0xaVGltZXJPZmYodG0pICAgIFZURF9HZXRfUmVhbF9UaW1lKCZ0bS0+ZW5kLmhpZ2gsJnRtLT5lbmQubG93KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIF9fTFpUaW1lckNvdW50KAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotICAgIENQVV9sYXJnZUludGVnZXIgdG1Db3VudDsKLSAgICBfQ1BVX2RpZmZUaW1lNjQoJnRtLT5zdGFydCwmdG0tPmVuZCwmdG1Db3VudCk7Ci0gICAgcmV0dXJuIF9DUFVfY2FsY01pY3JvU2VjKCZ0bUNvdW50LGZyZXF1ZW5jeSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGVmaW5lIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBsb25nIHBlcmlvZCB0aW1lciBhcyBtaWNyb3NlY29uZHMgcGVyIHRpbWVyIHRpY2suCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBVTFpUSU1FUl9SRVNPTFVUSU9OICAgICAxMDAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCB0aGUgTG9uZyBQZXJpb2QgdGltZXIgdmFsdWUgZnJvbSB0aGUgQklPUyB0aW1lciB0aWNrLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfX1VMWlJlYWRUaW1lKHZvaWQpCi17Ci0gICAgcmV0dXJuIFZESFF1ZXJ5U3lzVmFsdWUoMCwgVkRIR1NWX01TRUNTQk9PVCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29tcHV0ZSB0aGUgZWxhcHNlZCB0aW1lIGZyb20gdGhlIEJJT1MgdGltZXIgdGljay4gTm90ZSB0aGF0IHdlIGNoZWNrIHRvIHNlZQotd2hldGhlciBhIG1pZG5pZ2h0IGJvdW5kYXJ5IGhhcyBwYXNzZWQsIGFuZCBpZiBzbyBhZGp1c3QgdGhlIGZpbmlzaCB0aW1lIHRvCi1hY2NvdW50IGZvciB0aGlzLiBXZSBjYW5ub3QgZGV0ZWN0IGlmIG1vcmUgdGhhdCBvbmUgbWlkbmlnaHQgYm91bmRhcnkgaGFzCi1wYXNzZWQsIHNvIGlmIHRoaXMgaGFwcGVucyB3ZSB3aWxsIGJlIGdlbmVyYXRpbmcgZXJyb25vdXMgcmVzdWx0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfX1VMWkVsYXBzZWRUaW1lKHVsb25nIHN0YXJ0LHVsb25nIGZpbmlzaCkKLXsgcmV0dXJuIGZpbmlzaCAtIHN0YXJ0OyB9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92eGQvX3BtLmFzbSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Z4ZC9fcG0uYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGE3Y2VjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Z4ZC9fcG0uYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KgotOyogICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLTsqICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi07KiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLTsqICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotOyoKLTsqICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi07KiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotOyogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi07KiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyoKLTsqICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLTsqCi07KiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLTsqCi07KiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07KgotOyogTGFuZ3VhZ2U6ICAgIDgwMzg2IEFzc2VtYmxlciwgVEFTTSA0LjAgb3IgTkFTTQotOyogRW52aXJvbm1lbnQ6IDMyLWJpdCBXaW5kb3dzIFZ4RAotOyoKLTsqIERlc2NyaXB0aW9uOiBMb3cgbGV2ZWwgYXNzZW1ibHkgc3VwcG9ydCBmb3IgdGhlIFBNIGxpYnJhcnkgc3BlY2lmaWMgdG8KLTsqICAgICAgICAgICAgICBXaW5kb3dzIFZ4RHMuCi07KgotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICBJREVBTAotCi1pbmNsdWRlICJzY2l0ZWNoLm1hYyIgICAgICAgICAgICAgICA7IE1lbW9yeSBtb2RlbCBtYWNyb3MKLQotaGVhZGVyICAgICAgX3BtICAgICAgICAgICAgICAgICAgICAgOyBTZXQgdXAgbWVtb3J5IG1vZGVsCi0KLWJlZ2RhdGFzZWcgIF9wbQotCi0gICAgY2V4dGVybiBfUE1fc2F2ZWREUyxVU0hPUlQKLQotZW5kZGF0YXNlZyAgX3BtCi0KLVA1ODYKLQotYmVnY29kZXNlZyAgX3BtICAgICAgICAgICAgICAgICA7IFN0YXJ0IG9mIGNvZGUgc2VnbWVudAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX3NlZ3JlYWQoUE1TUkVHUyAqc3JlZ3MpCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSZWFkIHRoZSBjdXJyZW50IHZhbHVlIG9mIGFsbCBzZWdtZW50IHJlZ2lzdGVycwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX3NlZ3JlYWQKLQotICAgICAgICBBUkcgICAgIHNyZWdzOkRQVFIKLQotICAgICAgICBlbnRlcl9jCi0KLSAgICAgICAgbW92ICAgICBheCxlcwotICAgICAgICBfbGVzICAgIF9zaSxbc3JlZ3NdCi0gICAgICAgIG1vdiAgICAgW19FUyBfc2ldLGF4Ci0gICAgICAgIG1vdiAgICAgW19FUyBfc2krMl0sY3MKLSAgICAgICAgbW92ICAgICBbX0VTIF9zaSs0XSxzcwotICAgICAgICBtb3YgICAgIFtfRVMgX3NpKzZdLGRzCi0gICAgICAgIG1vdiAgICAgW19FUyBfc2krOF0sZnMKLSAgICAgICAgbW92ICAgICBbX0VTIF9zaSsxMF0sZ3MKLQotICAgICAgICBsZWF2ZV9jCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBpbnQgUE1faW50Mzg2eChpbnQgaW50bm8sIFBNUkVHUyAqaW4sIFBNUkVHUyAqb3V0LFBNU1JFR1MgKnNyZWdzKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSXNzdWVzIGEgc29mdHdhcmUgaW50ZXJydXB0IGluIHByb3RlY3RlZCBtb2RlLiBUaGlzIHJvdXRpbmUgaGFzIGJlZW4KLTsgd3JpdHRlbiB0byBhbGxvdyB1c2VyIHByb2dyYW1zIHRvIGxvYWQgQ1MgYW5kIERTIHdpdGggZGlmZmVyZW50IHZhbHVlcwotOyBvdGhlciB0aGFuIHRoZSBkZWZhdWx0LgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX2ludDM4NngKLQotOyBOb3QgdXNlZCBmb3IgVnhEcwotCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX3NhdmVEUyh2b2lkKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgU2F2ZSB0aGUgdmFsdWUgb2YgRFMgaW50byBhIHNlY3Rpb24gb2YgdGhlIGNvZGUgc2VnbWVudCwgc28gdGhhdCB3ZSBjYW4KLTsgcXVpY2tseSBsb2FkIHRoaXMgdmFsdWUgYXQgYSBsYXRlciBkYXRlIGluIHRoZSBQTV9sb2FkRFMoKSByb3V0aW5lIGZyb20KLTsgaW5zaWRlIGludGVycnVwdCBoYW5kbGVycyBldGMuIFRoZSBtZXRob2QgdG8gZG8gdGhpcyBpcyBkaWZmZXJlbnQKLTsgZGVwZW5kaW5nIG9uIHRoZSBET1MgZXh0ZW5kZXIgYmVpbmcgdXNlZC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBQTV9zYXZlRFMKLQotICAgICAgICBtb3YgICAgIFtfUE1fc2F2ZWREU10sZHMgICAgOyBTdG9yZSBhd2F5IGluIGRhdGEgc2VnbWVudAotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBQTV9sb2FkRFModm9pZCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJvdXRpbmUgdG8gbG9hZCB0aGUgRFMgcmVnaXN0ZXIgd2l0aCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQKLTsgRE9TIGV4dGVuZGVyLiBPbmx5IHRoZSBEUyByZWdpc3RlciBpcyBsb2FkZWQsIG5vdCB0aGUgRVMgcmVnaXN0ZXIsIHNvCi07IGlmIHlvdSB3aXNoIHRvIGNhbGwgQyBjb2RlLCB5b3Ugd2lsbCBuZWVkIHRvIGFsc28gbG9hZCB0aGUgRVMgcmVnaXN0ZXIKLTsgaW4gMzIgYml0IHByb3RlY3RlZCBtb2RlLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIFBNX2xvYWREUwotCi0gICAgICAgIG1vdiAgICAgZHMsW2NzOl9QTV9zYXZlZERTXSA7IFdlIGNhbiBhY2Nlc3MgdGhlIHByb3BlciBEUyB0aHJvdWdoIENTCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX3NldEJhbmtBKGludCBiYW5rKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgICAgICBQTV9zZXRCYW5rQQotCi07IE5vdCB1c2VkIGZvciBWeERzCi0KLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgUE1fc2V0QmFua0FCKGludCBiYW5rKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgICAgICBQTV9zZXRCYW5rQUIKLQotOyBOb3QgdXNlZCBmb3IgVnhEcwotCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIFBNX3NldENSVFN0YXJ0KGludCB4LGludCB5LGludCB3YWl0VlJUKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgICAgICBQTV9zZXRDUlRTdGFydAotCi07IE5vdCB1c2VkIGZvciBWeERzCi0KLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTsgTWFjcm8gdG8gZGVsYXkgYnJpZWZseSB0byBlbnN1cmUgdGhhdCBlbm91Z2ggdGltZSBoYXMgZWxhcHNlZCBiZXR3ZWVuCi07IHN1Y2Nlc3NpdmUgSS9PIGFjY2Vzc2VzIHNvIHRoYXQgdGhlIGRldmljZSBiZWluZyBhY2Nlc3NlZCBjYW4gcmVzcG9uZAotOyB0byBib3RoIGFjY2Vzc2VzIGV2ZW4gb24gYSB2ZXJ5IGZhc3QgUEMuCi0KLWlmZGVmICAgVVNFX05BU00KLSVtYWNybyAgREVMQVkgMAotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotJWVuZG1hY3JvCi0lbWFjcm8gIElPREVMQVlOIDEKLSVyZXAgICAgJTEKLSAgICAgICAgREVMQVkKLSVlbmRyZXAKLSVlbmRtYWNybwotZWxzZQotbWFjcm8gICBERUxBWQotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotICAgICAgICBqbXAgICAgIHNob3J0ICQrMgotZW5kbQotbWFjcm8gICBJT0RFTEFZTiAgICBOCi0gICAgcmVwdCAgICBOCi0gICAgICAgIERFTEFZCi0gICAgZW5kbQotZW5kbQotZW5kaWYKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdWNoYXIgX1BNX3JlYWRDTU9TKGludCBpbmRleCkKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJlYWQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgQ01PUyByZWdpc3Rlci4gV2UgZG8gdGhpcyB3aXRoIGJvdGgKLTsgbm9ybWFsIGludGVycnVwdHMgYW5kIE5NSSBkaXNhYmxlZC4KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fcmVhZENNT1MKLQotICAgICAgICBBUkcgICAgIGluZGV4OlVJTlQKLQotICAgICAgICBwdXNoICAgIF9icAotICAgICAgICBtb3YgICAgIF9icCxfc3AKLSAgICAgICAgcHVzaGZkCi0gICAgICAgIG1vdiAgICAgYWwsW0JZVEUgaW5kZXhdCi0gICAgICAgIG9yICAgICAgYWwsODBoICAgICAgICAgICAgICA7IEFkZCBkaXNhYmxlIE5NSSBmbGFnCi0gICAgICAgIGNsaQotICAgICAgICBvdXQgICAgIDcwaCxhbAotICAgICAgICBJT0RFTEFZTiA1Ci0gICAgICAgIGluICAgICAgYWwsNzFoCi0gICAgICAgIG1vdiAgICAgYWgsYWwKLSAgICAgICAgeG9yICAgICBhbCxhbAotICAgICAgICBJT0RFTEFZTiA1Ci0gICAgICAgIG91dCAgICAgNzBoLGFsICAgICAgICAgICAgICA7IFJlLWVuYWJsZSBOTUkKLSAgICAgICAgbW92ICAgICBhbCxhaCAgICAgICAgICAgICAgIDsgUmV0dXJuIHZhbHVlIGluIEFMCi0gICAgICAgIHBvcGZkCi0gICAgICAgIHBvcCAgICAgX2JwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIF9QTV93cml0ZUNNT1MoaW50IGluZGV4LHVjaGFyIHZhbHVlKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUmVhZCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBDTU9TIHJlZ2lzdGVyLiBXZSBkbyB0aGlzIHdpdGggYm90aAotOyBub3JtYWwgaW50ZXJydXB0cyBhbmQgTk1JIGRpc2FibGVkLgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV93cml0ZUNNT1MKLQotICAgICAgICBBUkcgICAgIGluZGV4OlVJTlQsIHZhbHVlOlVDSEFSCi0KLSAgICAgICAgcHVzaCAgICBfYnAKLSAgICAgICAgbW92ICAgICBfYnAsX3NwCi0gICAgICAgIHB1c2hmZAotICAgICAgICBtb3YgICAgIGFsLFtCWVRFIGluZGV4XQotICAgICAgICBvciAgICAgIGFsLDgwaCAgICAgICAgICAgICAgOyBBZGQgZGlzYWJsZSBOTUkgZmxhZwotICAgICAgICBjbGkKLSAgICAgICAgb3V0ICAgICA3MGgsYWwKLSAgICAgICAgSU9ERUxBWU4gNQotICAgICAgICBtb3YgICAgIGFsLFt2YWx1ZV0KLSAgICAgICAgb3V0ICAgICA3MWgsYWwKLSAgICAgICAgeG9yICAgICBhbCxhbAotICAgICAgICBJT0RFTEFZTiA1Ci0gICAgICAgIG91dCAgICAgNzBoLGFsICAgICAgICAgICAgICA7IFJlLWVuYWJsZSBOTUkKLSAgICAgICAgcG9wZmQKLSAgICAgICAgcG9wICAgICBfYnAKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGRvdWJsZSBfZnRvbChkb3VibGUgZikKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENhbGxzIHRvIF9fZnRvbCBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBCb3JsYW5kIEMrKyBjb21waWxlciBmb3IgY29kZQotOyB0aGF0IG5lZWRzIHRvIGNvbnZlcnQgYSBmbG9hdGluZyBwb2ludCB0eXBlIHRvIGFuIGludGVncmFsIHR5cGUuCi07Ci07IElucHV0OiBmbG9hdGluZyBwb2ludCBudW1iZXIgb24gdGhlIHRvcCBvZiB0aGUgJzg3LgotOwotOyBPdXRwdXQ6IGEgKHNpZ25lZCBvciB1bnNpZ25lZCkgbG9uZyBpbiBFQVgKLTsgQWxsIG90aGVyIHJlZ2lzdGVycyBwcmVzZXJ2ZWQuCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9mdG9sCi0KLSAgICAgICAgTE9DQUwgICB0ZW1wMTpXT1JELCB0ZW1wMjpRV09SRCA9IExvY2FsU2l6ZQotCi0gICAgICAgIHB1c2ggICAgZWJwCi0gICAgICAgIG1vdiAgICAgZWJwLGVzcAotICAgICAgICBzdWIgICAgIGVzcCxMb2NhbFNpemUKLQotICAgICAgICBmc3RjdyAgIFt0ZW1wMV0gICAgICAgICAgICAgICAgIDsgc2F2ZSB0aGUgY29udHJvbCB3b3JkCi0gICAgICAgIGZ3YWl0Ci0gICAgICAgIG1vdiAgICAgYWwsW0JZVEUgdGVtcDErMV0KLSAgICAgICAgb3IgICAgICBbQllURSB0ZW1wMSsxXSwwQ2ggICAgICA7IHNldCByb3VuZGluZyBjb250cm9sIHRvIGNob3AKLSAgICAgICAgZmxkY3cgICBbdGVtcDFdCi0gICAgICAgIGZpc3RwICAgW3RlbXAyXSAgICAgICAgICAgICAgICAgOyBjb252ZXJ0IHRvIDY0LWJpdCBpbnRlZ2VyCi0gICAgICAgIG1vdiAgICAgW0JZVEUgdGVtcDErMV0sYWwKLSAgICAgICAgZmxkY3cgICBbdGVtcDFdICAgICAgICAgICAgICAgICA7IHJlc3RvcmUgdGhlIGNvbnRyb2wgd29yZAotICAgICAgICBtb3YgICAgIGVheCxbRFdPUkQgdGVtcDJdICAgICAgIDsgcmV0dXJuIExTIDMyIGJpdHMKLSAgICAgICAgbW92ICAgICBlZHgsW0RXT1JEIHRlbXAyKzRdICAgICA7ICAgICAgICBNUyAzMiBiaXRzCi0KLSAgICAgICAgbW92ICAgICBlc3AsZWJwCi0gICAgICAgIHBvcCAgICAgZWJwCi0gICAgICAgIHJldAotCi1jcHJvY2VuZAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBfUE1fZ2V0UERCIC0gUmV0dXJuIHRoZSBQYWdlIFRhYmxlIERpcmVjdG9yeSBCYXNlIGFkZHJlc3MKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jcHJvY3N0YXJ0ICBfUE1fZ2V0UERCCi0KLSAgICAgICAgbW92ICAgICBlYXgsY3IzCi0gICAgICAgIGFuZCAgICAgZWF4LDBGRkZGRjAwMGgKLSAgICAgICAgcmV0Ci0KLWNwcm9jZW5kCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEZsdXNoIHRoZSBUcmFuc2xhdGlvbiBMb29rYXNpZGUgYnVmZmVyCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY3Byb2NzdGFydCAgUE1fZmx1c2hUTEIKLQotICAgICAgICB3YmludmQgICAgICAgICAgICAgICAgICA7IEZsdXNoIHRoZSBDUFUgY2FjaGUKLSAgICAgICAgbW92ICAgICBlYXgsY3IzCi0gICAgICAgIG1vdiAgICAgY3IzLGVheCAgICAgICAgIDsgRmx1c2ggdGhlIFRMQgotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotZW5kY29kZXNlZyAgX3BtCi0KLSAgICAgICAgRU5EICAgICAgICAgICAgICAgICAgICAgOyBFbmQgb2YgbW9kdWxlCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92eGQvY3B1aW5mby5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL2NwdWluZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3ZWFhZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92eGQvY3B1aW5mby5jCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IFdpbmRvd3MgVnhECi0qCi0qIERlc2NyaXB0aW9uOiAgVnhEIHNwZWNpZmljIGNvZGUgZm9yIHRoZSBDUFUgZGV0ZWN0aW9uIG1vZHVsZS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRG8gbm90aGluZyBmb3IgVnhEJ3MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFNldE1heFRocmVhZFByaW9yaXR5KCkgICAgICAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRG8gbm90aGluZyBmb3IgVnhEJ3MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFJlc3RvcmVUaHJlYWRQcmlvcml0eShpKSAgICAodm9pZCkoaSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGZyZXF1ZW5jeSBvZiB0aGUgY291bnRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBHZXRDb3VudGVyRnJlcXVlbmN5KAotICAgIENQVV9sYXJnZUludGVnZXIgKmZyZXEpCi17Ci0gICAgZnJlcS0+bG93ID0gMTE5MzE4MDsKLSAgICBmcmVxLT5oaWdoID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGNvdW50ZXIgdmFsdWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBHZXRDb3VudGVyKHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENQVV9sYXJnZUludGVnZXIgY291bnQ7ICAgICAgICAgICAgICAgICAgICAgXAotICAgIFZURF9HZXRfUmVhbF9UaW1lKCZjb3VudC5oaWdoLCZjb3VudC5sb3cpOyAgXAotICAgICh0KS0+bG93ID0gY291bnQubG93OyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICh0KS0+aGlnaCA9IGNvdW50LmhpZ2g7ICAgICAgICAgICAgICAgICAgICAgXAotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL2ZpbGVpby5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL2ZpbGVpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzZjZTk5Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Z4ZC9maWxlaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgV2luZG93cyBWeEQKLSoKLSogRGVzY3JpcHRpb246ICBDIGxpYnJhcnkgY29tcGF0aWJsZSBJL08gZnVuY3Rpb25zIGZvciB1c2Ugd2l0aGluIGEgVnhELgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAidnhkZmlsZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWluIENvZGUgSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIEVPRiAtMQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVZ4RCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZvcGVuIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUZJTEUgKiBmb3BlbigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICBjb25zdCBjaGFyICptb2RlKQotewotICAgIEZJTEUgICAgKmYgPSBQTV9tYWxsb2Moc2l6ZW9mKEZJTEUpKTsKLSAgICBsb25nICAgIG9sZHBvczsKLQotICAgIGlmIChmKSB7Ci0JZi0+b2Zmc2V0ID0gMDsKLQlmLT50ZXh0ID0gKG1vZGVbMV0gPT0gJ3QnIHx8IG1vZGVbMl0gPT0gJ3QnKTsKLQlmLT53cml0ZW1vZGUgPSAobW9kZVswXSA9PSAndycpIHx8IChtb2RlWzBdID09ICdhJyk7Ci0JaWYgKGluaXRDb21wbGV0ZSkgewotCSAgICBXT1JEICAgIG9tb2RlLGVycm9yOwotCSAgICBCWVRFICAgIGFjdGlvbjsKLQotCSAgICBpZiAobW9kZVswXSA9PSAncicpIHsKLQkJb21vZGUgPSBPUEVOX0FDQ0VTU19SRUFET05MWSB8IE9QRU5fU0hBUkVfQ09NUEFUSUJMRTsKLQkJYWN0aW9uID0gQUNUSU9OX0lGRVhJU1RTX09QRU4gfCBBQ1RJT05fSUZOT1RFWElTVFNfRkFJTDsKLQkJfQotCSAgICBlbHNlIGlmIChtb2RlWzBdID09ICd3JykgewotCQlvbW9kZSA9IE9QRU5fQUNDRVNTX1dSSVRFT05MWSB8IE9QRU5fU0hBUkVfQ09NUEFUSUJMRTsKLQkJYWN0aW9uID0gQUNUSU9OX0lGRVhJU1RTX1RSVU5DQVRFIHwgQUNUSU9OX0lGTk9URVhJU1RTX0NSRUFURTsKLQkJfQotCSAgICBlbHNlIHsKLQkJb21vZGUgPSBPUEVOX0FDQ0VTU19SRUFEV1JJVEUgfCBPUEVOX1NIQVJFX0NPTVBBVElCTEU7Ci0JCWFjdGlvbiA9IEFDVElPTl9JRkVYSVNUU19PUEVOIHwgQUNUSU9OX0lGTk9URVhJU1RTX0NSRUFURTsKLQkJfQotCSAgICBmLT5oYW5kbGUgPSAoaW50KVIwX09wZW5DcmVhdGVGaWxlKGZhbHNlLChjaGFyKilmaWxlbmFtZSxvbW9kZSxBVFRSX05PUk1BTCxhY3Rpb24sMCwmZXJyb3IsJmFjdGlvbik7Ci0JICAgIGlmIChmLT5oYW5kbGUgPT0gMCkgewotCQlQTV9mcmVlKGYpOwotCQlyZXR1cm4gTlVMTDsKLQkJfQotCSAgICBmLT5maWxlc2l6ZSA9IFIwX0dldEZpbGVTaXplKChIQU5ETEUpZi0+aGFuZGxlLCZlcnJvcik7Ci0JICAgIGlmIChtb2RlWzBdID09ICdhJykKLQkJZnNlZWsoZiwwLDIpOwotCSAgICB9Ci0JZWxzZSB7Ci0JICAgIGludCBvZmxhZyxwbW9kZTsKLQotCSAgICBpZiAobW9kZVswXSA9PSAncicpIHsKLQkJcG1vZGUgPSBfU19JUkVBRDsKLQkJb2ZsYWcgPSBfT19SRE9OTFk7Ci0JCX0KLQkgICAgZWxzZSBpZiAobW9kZVswXSA9PSAndycpIHsKLQkJcG1vZGUgPSBfU19JV1JJVEU7Ci0JCW9mbGFnID0gX09fV1JPTkxZIHwgX09fQ1JFQVQgfCBfT19UUlVOQzsKLQkJfQotCSAgICBlbHNlIHsKLQkJcG1vZGUgPSBfU19JV1JJVEU7Ci0JCW9mbGFnID0gX09fUkRXUiB8IF9PX0NSRUFUIHwgX09fQVBQRU5EOwotCQl9Ci0JICAgIGlmIChmLT50ZXh0KQotCQlvZmxhZyB8PSBfT19URVhUOwotCSAgICBlbHNlCi0JCW9mbGFnIHw9IF9PX0JJTkFSWTsKLQkgICAgaWYgKChmLT5oYW5kbGUgPSBpX29wZW4oZmlsZW5hbWUsb2ZsYWcscG1vZGUpKSA9PSAtMSkgewotCQlQTV9mcmVlKGYpOwotCQlyZXR1cm4gTlVMTDsKLQkJfQotCSAgICBvbGRwb3MgPSBpX2xzZWVrKGYtPmhhbmRsZSwwLDEpOwotCSAgICBmLT5maWxlc2l6ZSA9IGlfbHNlZWsoZi0+aGFuZGxlLDAsMik7Ci0JICAgIGlfbHNlZWsoZi0+aGFuZGxlLG9sZHBvcywwKTsKLQkgICAgfQotCX0KLSAgICByZXR1cm4gZjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1WeEQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmcmVhZCBmdW5jdGlvbi4gTm90ZSB0aGF0IHRoZSBWeEQgZmlsZSBJL08KLWZ1bmN0aW9ucyBhcmUgbGF5ZXJlZCBvbiBET1MsIHNvIGNhbiBvbmx5IHJlYWQgdXAgdG8gNjRLIGF0IGEgdGltZS4gU2luY2UKLXdlIGFyZSBleHBlY3RlZCB0byBoYW5kbGUgbXVjaCBsYXJnZXIgY2h1bmtzIHRoYW4gdGhpcywgd2UgaGFuZGxlIGxhcmdlcgotYmxvY2tzIGF1dG9tYXRpY2FsbHkgaW4gaGVyZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zaXplX3QgZnJlYWQoCi0gICAgdm9pZCAqcHRyLAotICAgIHNpemVfdCBzaXplLAotICAgIHNpemVfdCBuLAotICAgIEZJTEUgKmYpCi17Ci0gICAgY2hhciAgICAqYnVmID0gcHRyOwotICAgIFdPUkQgICAgZXJyb3I7Ci0gICAgaW50ICAgICBieXRlcyA9IHNpemUgKiBuOwotICAgIGludCAgICAgcmVhZGJ5dGVzLHRvdGFsYnl0ZXMgPSAwOwotCi0gICAgd2hpbGUgKGJ5dGVzID4gMHgxMDAwMCkgewotCWlmIChpbml0Q29tcGxldGUpIHsKLQkgICAgcmVhZGJ5dGVzICA9IFIwX1JlYWRGaWxlKGZhbHNlLChIQU5ETEUpZi0+aGFuZGxlLGJ1ZiwweDgwMDAsZi0+b2Zmc2V0LCZlcnJvcik7Ci0JICAgIHJlYWRieXRlcyArPSBSMF9SZWFkRmlsZShmYWxzZSwoSEFORExFKWYtPmhhbmRsZSxidWYrMHg4MDAwLDB4ODAwMCxmLT5vZmZzZXQrMHg4MDAwLCZlcnJvcik7Ci0JICAgIH0KLQllbHNlIHsKLQkgICAgcmVhZGJ5dGVzICA9IGlfcmVhZChmLT5oYW5kbGUsYnVmLDB4ODAwMCk7Ci0JICAgIHJlYWRieXRlcyArPSBpX3JlYWQoZi0+aGFuZGxlLGJ1ZisweDgwMDAsMHg4MDAwKTsKLQkgICAgfQotCXRvdGFsYnl0ZXMgKz0gcmVhZGJ5dGVzOwotCWYtPm9mZnNldCArPSByZWFkYnl0ZXM7Ci0JYnVmICs9IDB4MTAwMDA7Ci0JYnl0ZXMgLT0gMHgxMDAwMDsKLQl9Ci0gICAgaWYgKGJ5dGVzKSB7Ci0JaWYgKGluaXRDb21wbGV0ZSkKLQkgICAgcmVhZGJ5dGVzID0gUjBfUmVhZEZpbGUoZmFsc2UsKEhBTkRMRSlmLT5oYW5kbGUsYnVmLGJ5dGVzLGYtPm9mZnNldCwmZXJyb3IpOwotCWVsc2UKLQkgICAgcmVhZGJ5dGVzID0gaV9yZWFkKGYtPmhhbmRsZSxidWYsYnl0ZXMpOwotCXRvdGFsYnl0ZXMgKz0gcmVhZGJ5dGVzOwotCWYtPm9mZnNldCArPSByZWFkYnl0ZXM7Ci0JfQotICAgIHJldHVybiB0b3RhbGJ5dGVzIC8gc2l6ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1WeEQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmd3JpdGUgZnVuY3Rpb24uIE5vdGUgdGhhdCB0aGUgVnhEIGZpbGUgSS9PCi1mdW5jdGlvbnMgYXJlIGxheWVyZWQgb24gRE9TLCBzbyBjYW4gb25seSByZWFkIHVwIHRvIDY0SyBhdCBhIHRpbWUuIFNpbmNlCi13ZSBhcmUgZXhwZWN0ZWQgdG8gaGFuZGxlIG11Y2ggbGFyZ2VyIGNodW5rcyB0aGFuIHRoaXMsIHdlIGhhbmRsZSBsYXJnZXIKLWJsb2NrcyBhdXRvbWF0aWNhbGx5IGluIGhlcmUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc2l6ZV90IGZ3cml0ZSgKLSAgICBjb25zdCB2b2lkICpwdHIsCi0gICAgc2l6ZV90IHNpemUsCi0gICAgc2l6ZV90IG4sCi0gICAgRklMRSAqZikKLXsKLSAgICBjb25zdCBjaGFyICAqYnVmID0gcHRyOwotICAgIFdPUkQgICAgICAgIGVycm9yOwotICAgIGludCAgICAgICAgIGJ5dGVzID0gc2l6ZSAqIG47Ci0gICAgaW50ICAgICAgICAgd3JpdHRlbmJ5dGVzLHRvdGFsYnl0ZXMgPSAwOwotCi0gICAgaWYgKCFmLT53cml0ZW1vZGUpCi0JcmV0dXJuIDA7Ci0gICAgd2hpbGUgKGJ5dGVzID4gMHgxMDAwMCkgewotCWlmIChpbml0Q29tcGxldGUpIHsKLQkgICAgd3JpdHRlbmJ5dGVzICA9IFIwX1dyaXRlRmlsZShmYWxzZSwoSEFORExFKWYtPmhhbmRsZSxidWYsMHg4MDAwLGYtPm9mZnNldCwmZXJyb3IpOwotCSAgICB3cml0dGVuYnl0ZXMgKz0gUjBfV3JpdGVGaWxlKGZhbHNlLChIQU5ETEUpZi0+aGFuZGxlLGJ1ZisweDgwMDAsMHg4MDAwLGYtPm9mZnNldCsweDgwMDAsJmVycm9yKTsKLQkgICAgfQotCWVsc2UgewotCSAgICB3cml0dGVuYnl0ZXMgID0gaV93cml0ZShmLT5oYW5kbGUsYnVmLDB4ODAwMCk7Ci0JICAgIHdyaXR0ZW5ieXRlcyArPSBpX3dyaXRlKGYtPmhhbmRsZSxidWYrMHg4MDAwLDB4ODAwMCk7Ci0JICAgIH0KLQl0b3RhbGJ5dGVzICs9IHdyaXR0ZW5ieXRlczsKLQlmLT5vZmZzZXQgKz0gd3JpdHRlbmJ5dGVzOwotCWJ1ZiArPSAweDEwMDAwOwotCWJ5dGVzIC09IDB4MTAwMDA7Ci0JfQotICAgIGlmIChpbml0Q29tcGxldGUpCi0Jd3JpdHRlbmJ5dGVzID0gUjBfV3JpdGVGaWxlKGZhbHNlLChIQU5ETEUpZi0+aGFuZGxlLGJ1ZixieXRlcyxmLT5vZmZzZXQsJmVycm9yKTsKLSAgICBlbHNlCi0Jd3JpdHRlbmJ5dGVzID0gaV93cml0ZShmLT5oYW5kbGUsYnVmLGJ5dGVzKTsKLSAgICB0b3RhbGJ5dGVzICs9IHdyaXR0ZW5ieXRlczsKLSAgICBmLT5vZmZzZXQgKz0gd3JpdHRlbmJ5dGVzOwotICAgIGlmIChmLT5vZmZzZXQgPiBmLT5maWxlc2l6ZSkKLQlmLT5maWxlc2l6ZSA9IGYtPm9mZnNldDsKLSAgICByZXR1cm4gdG90YWxieXRlcyAvIHNpemU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVnhEIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZmZsdXNoIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBmZmx1c2goCi0gICAgRklMRSAqZikKLXsKLSAgICAvKiBOb3RoaW5nIHRvIGRvIHNpbmNlIHdlIGFyZSBub3QgZG9pbmcgYnVmZmVyZWQgZmlsZSBJL08gKi8KLSAgICAodm9pZClmOwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVZ4RCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQU5TSSBDIGZzZWVrIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBmc2VlaygKLSAgICBGSUxFICpmLAotICAgIGxvbmcgaW50IG9mZnNldCwKLSAgICBpbnQgd2hlbmNlKQotewotICAgIGlmICh3aGVuY2UgPT0gMCkKLQlmLT5vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgZWxzZSBpZiAod2hlbmNlID09IDEpCi0JZi0+b2Zmc2V0ICs9IG9mZnNldDsKLSAgICBlbHNlIGlmICh3aGVuY2UgPT0gMikKLQlmLT5vZmZzZXQgPSBmLT5maWxlc2l6ZSArIG9mZnNldDsKLSAgICBpZiAoIWluaXRDb21wbGV0ZSkKLQlpX2xzZWVrKGYtPmhhbmRsZSxmLT5vZmZzZXQsMCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVnhEIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZnRlbGwgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotbG9uZyBmdGVsbCgKLSAgICBGSUxFICpmKQotewotICAgIHJldHVybiBmLT5vZmZzZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVnhEIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBTlNJIEMgZmVvZiBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgZmVvZigKLSAgICBGSUxFICpmKQotewotICAgIHJldHVybiAoZi0+b2Zmc2V0ID09IGYtPmZpbGVzaXplKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1OVCBkcml2ZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmZ2V0cyBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jaGFyICpmZ2V0cygKLSAgICBjaGFyICpzLAotICAgIGludCBuLAotICAgIEZJTEUgKmYpCi17Ci0gICAgaW50ICAgICBsZW47Ci0gICAgY2hhciAgICAqY3M7Ci0KLSAgICAvKiBSZWFkIHRoZSBlbnRpcmUgYnVmZmVyIGludG8gbWVtb3J5IChvdXIgZnVuY3Rpb25zIGFyZSB1bmJ1ZmZlcmVkISkgKi8KLSAgICBpZiAoKGxlbiA9IGZyZWFkKHMsMSxuLGYpKSA9PSAwKQotCXJldHVybiBOVUxMOwotCi0gICAgLyogU2VhcmNoIGZvciAnXG4nIG9yIGVuZCBvZiBzdHJpbmcgKi8KLSAgICBpZiAobiA+IGxlbikKLQluID0gbGVuOwotICAgIGNzID0gczsKLSAgICB3aGlsZSAoLS1uID4gMCkgewotCWlmICgqY3MgPT0gJ1xuJykKLQkgICAgYnJlYWs7Ci0JY3MrKzsKLQl9Ci0gICAgKmNzID0gJ1wwJzsKLSAgICByZXR1cm4gczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1OVCBkcml2ZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmcHV0cyBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgZnB1dHMoCi0gICAgY29uc3QgY2hhciAqcywKLSAgICBGSUxFICpmKQotewotICAgIHJldHVybiBmd3JpdGUocywxLHN0cmxlbihzKSxmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1WeEQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFOU0kgQyBmY2xvc2UgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IGZjbG9zZSgKLSAgICBGSUxFICpmKQotewotICAgIFdPUkQgZXJyb3I7Ci0KLSAgICBpZiAoaW5pdENvbXBsZXRlKQotCVIwX0Nsb3NlRmlsZSgoSEFORExFKWYtPmhhbmRsZSwmZXJyb3IpOwotICAgIGVsc2UKLQlpX2Nsb3NlKGYtPmhhbmRsZSk7Ci0gICAgUE1fZnJlZShmKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Z4ZC9vc2hkci5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL29zaGRyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZmMwZjkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL29zaGRyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICAzMi1iaXQgV2luZG93cyBWeEQKLSoKLSogRGVzY3JpcHRpb246ICBJbmNsdWRlIGZpbGUgdG8gaW5jbHVkZSBhbGwgT1Mgc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Z4ZC9wbS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL3BtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYjdmMTkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL3BtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBXaW5kb3dzIFZ4RAotKgotKiBEZXNjcmlwdGlvbjogIEltcGxlbWVudGF0aW9uIGZvciB0aGUgT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5LCB3aGljaAotKiAgICAgICAgICAgICAgIGNvbnRhaW5zIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQgT1Mgc3BlY2lmaWMgc2VydmljZXMgaW4gYQotKiAgICAgICAgICAgICAgIGdlbmVyaWMsIGNyb3NzIHBsYXRmb3JtIEFQSS4gUG9ydGluZyB0aGUgT1MgUG9ydGFiaWxpdHkKLSogICAgICAgICAgICAgICBNYW5hZ2VyIGxpYnJhcnkgaXMgdGhlIGZpcnN0IHN0ZXAgdG8gcG9ydGluZyBhbnkgU2NpVGVjaAotKiAgICAgICAgICAgICAgIHByb2R1Y3RzIHRvIGEgbmV3IHBsYXRmb3JtLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAiZHJ2bGliL29zL29zLmgiCi0jaW5jbHVkZSAic2RkL3NkZGhlbHAuaCIKLSNpbmNsdWRlICJtdHJyLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgTUFYX01FTU9SWV9TSEFSRUQgICAgICAgICAgIDEwMAotI2RlZmluZSBNQVhfTUVNT1JZX01BUFBJTkdTICAgICAgICAgMTAwCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB2b2lkICAgICpsaW5lYXI7Ci0gICAgdWxvbmcgICBnbG9iYWw7Ci0gICAgdWxvbmcgICBsZW5ndGg7Ci0gICAgaW50ICAgICBucGFnZXM7Ci0gICAgfSBtZW1zaGFyZWQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bG9uZyAgIHBoeXNpY2FsOwotICAgIHVsb25nICAgbGluZWFyOwotICAgIHVsb25nICAgbGVuZ3RoOwotICAgIGludCAgICAgbnBhZ2VzOwotICAgIGlib29sICAgaXNDYWNoZWQ7Ci0gICAgfSBtbWFwcGluZzsKLQotc3RhdGljIGludCAgICAgICAgICBudW1NYXBwaW5ncyA9IDA7Ci1zdGF0aWMgbWVtc2hhcmVkICAgIHNoYXJlZFtNQVhfTUVNT1JZX01BUFBJTkdTXSA9IHswfTsKLXN0YXRpYyBtbWFwcGluZyAgICAgbWFwc1tNQVhfTUVNT1JZX01BUFBJTkdTXTsKLWV4dGVybiBpYm9vbCAgICAgICAgX1BNX2hhdmVCSU9TOwotY2hhciAgICAgICAgICAgICAgICBfUE1fY250UGF0aFtQTV9NQVhfUEFUSF0gPSAiIjsKLWNoYXIgICAgICAgICAgICAgICAgX1BNX251Y2xldXNQYXRoW1BNX01BWF9QQVRIXSA9ICIiOwotdWNoYXIgICAgICAgICAgICAgICAqX1BNX3JtQnVmQWRkciA9IE5VTEw7Ci11c2hvcnQgX1ZBUkFQSSAgICAgIF9QTV9zYXZlZERTID0gMDsKLXN0YXRpYyB1Y2hhciAgICAgICAgX1BNX29sZENNT1NSZWdBOwotc3RhdGljIHVjaGFyICAgICAgICBfUE1fb2xkQ01PU1JlZ0I7Ci1QTV9pbnRIYW5kbGVyICAgICAgIF9QTV9ydGNIYW5kbGVyID0gTlVMTDsKLUlSUUhBTkRMRSAgICAgICAgICAgUlRDSVJRSGFuZGxlID0gMDsKLVZQSUNEX0hXSW50X1RIVU5LICAgUlRDSW50X1RodW5rOwotCi1zdGF0aWMgY2hhciAqc3pXaW5kb3dzS2V5ICAgICAgID0gIlNvZnR3YXJlXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uIjsKLXN0YXRpYyBjaGFyICpzelN5c3RlbVJvb3QgICAgICAgPSAiU3lzdGVtUm9vdCI7Ci1zdGF0aWMgY2hhciAqc3pNYWNoaW5lTmFtZUtleSAgID0gIlN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXENvbXB1dGVyTmFtZVxcQ29tcHV0ZXJOYW1lIjsKLXN0YXRpYyBjaGFyICpzek1hY2hpbmVOYW1lICAgICAgPSAiQ29tcHV0ZXJOYW1lIjsKLXN0YXRpYyB2b2lkIChQTUFQSVAgZmF0YWxFcnJvckNsZWFudXApKHZvaWQpID0gTlVMTDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogRnVuY3Rpb25zIHRvIHJlYWQgYW5kIHdyaXRlIENNT1MgcmVnaXN0ZXJzICovCi0KLXVsb25nICAgUE1BUEkgX1BNX2dldFBEQih2b2lkKTsKLXVjaGFyICAgUE1BUEkgX1BNX3JlYWRDTU9TKGludCBpbmRleCk7Ci12b2lkICAgIFBNQVBJIF9QTV93cml0ZUNNT1MoaW50IGluZGV4LHVjaGFyIHZhbHVlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1QTV9tYWxsb2Mgb3ZlcnJpZGUgZnVuY3Rpb24gZm9yIE51Y2xldXMgZHJpdmVycyBsb2FkZWQgaW4gVnhEJ3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFZYRF9tYWxsb2MoCi0gICAgc2l6ZV90IHNpemUpCi17Ci0gICAgcmV0dXJuIFBNX21hbGxvY1NoYXJlZChzaXplKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1QTV9jYWxsb2Mgb3ZlcnJpZGUgZnVuY3Rpb24gZm9yIE51Y2xldXMgZHJpdmVycyBsb2FkZWQgaW4gVnhEJ3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFZYRF9jYWxsb2MoCi0gICAgc2l6ZV90IG5lbGVtLAotICAgIHNpemVfdCBzaXplKQotewotICAgIHZvaWQgKnAgPSBQTV9tYWxsb2NTaGFyZWQobmVsZW0gKiBzaXplKTsKLSAgICBpZiAocCkKLQltZW1zZXQocCwwLG5lbGVtICogc2l6ZSk7Ci0gICAgcmV0dXJuIHA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUE1fcmVhbGxvYyBvdmVycmlkZSBmdW5jdGlvbiBmb3IgTnVjbGV1cyBkcml2ZXJzIGxvYWRlZCBpbiBWeEQncy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogVlhEX3JlYWxsb2MoCi0gICAgdm9pZCAqcHRyLAotICAgIHNpemVfdCBzaXplKQotewotICAgIHZvaWQgKnAgPSBQTV9tYWxsb2NTaGFyZWQoc2l6ZSk7Ci0gICAgaWYgKHApIHsKLQltZW1jcHkocCxwdHIsc2l6ZSk7Ci0JUE1fZnJlZVNoYXJlZChwdHIpOwotCX0KLSAgICByZXR1cm4gcDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1QTV9mcmVlIG92ZXJyaWRlIGZ1bmN0aW9uIGZvciBOdWNsZXVzIGRyaXZlcnMgbG9hZGVkIGluIFZ4RCdzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgVlhEX2ZyZWUoCi0gICAgdm9pZCAqcCkKLXsKLSAgICBQTV9mcmVlU2hhcmVkKHApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIFBNIGxpYnJhcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9pbml0KHZvaWQpCi17Ci0gICAgLyogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgbWVtb3J5IGFsbG9jYXRvcnMgZm9yIGFsbCBOdWNsZXVzIGRyaXZlcnMKLSAgICAgKiBsb2FkZWQgaW4gU0RESEVMUC9QTUhFTFAuIFdlIGRvIHRoaXMgc28gdGhhdCB3ZSBjYW4gZW5zdXJlIGFsbCBtZW1vcnkKLSAgICAgKiBkeW5hbWljYWxseSBhbGxvY2F0ZWQgYnkgTnVjbGV1cyBkcml2ZXJzIGFuZCBpbnRlcm5hbCBDIHJ1bnRpbWUKLSAgICAgKiBsaWJyYXJ5IGZ1bmN0aW9ucyBhcmUgc2hhcmVkIG1lbW9yeSBibG9ja3MgdGhhdCBhbGwgcHJvY2Vzc2VzCi0gICAgICogY29ubmVjdGluZyB0byBTRERIRUxQIGNhbiBzZWUuCi0gICAgICovCi0gICAgUE1fdXNlTG9jYWxNYWxsb2MoVlhEX21hbGxvYyxWWERfY2FsbG9jLFZYRF9yZWFsbG9jLFZYRF9mcmVlKTsKLQotICAgIC8qIEluaXRpYWxpYXNlIHRoZSBNVFJSIG1vZHVsZSAqLwotICAgIE1UUlJfaW5pdCgpOwotfQotCi1pYm9vbCBQTUFQSSBQTV9oYXZlQklPU0FjY2Vzcyh2b2lkKQoteyByZXR1cm4gX1BNX2hhdmVCSU9TOyB9Ci0KLWxvbmcgUE1BUEkgUE1fZ2V0T1NUeXBlKHZvaWQpCi17IHJldHVybiBfT1NfV0lOMzJWWEQ7IH0KLQotaW50IFBNQVBJIFBNX2dldE1vZGVUeXBlKHZvaWQpCi17IHJldHVybiBQTV8zODY7IH0KLQotdm9pZCBQTUFQSSBQTV9iYWNrc2xhc2goY2hhciAqcykKLXsKLSAgICB1aW50IHBvcyA9IHN0cmxlbihzKTsKLSAgICBpZiAoc1twb3MtMV0gIT0gJ1xcJykgewotCXNbcG9zXSA9ICdcXCc7Ci0Jc1twb3MrMV0gPSAnXDAnOwotCX0KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRGYXRhbEVycm9yQ2xlYW51cCgKLSAgICB2b2lkIChQTUFQSVAgY2xlYW51cCkodm9pZCkpCi17Ci0gICAgZmF0YWxFcnJvckNsZWFudXAgPSBjbGVhbnVwOwotfQotCi12b2lkIFBNQVBJIFBNX2ZhdGFsRXJyb3IoY29uc3QgY2hhciAqbXNnKQotewotICAgIGlmIChmYXRhbEVycm9yQ2xlYW51cCkKLQlmYXRhbEVycm9yQ2xlYW51cCgpOwotICAgIEZhdGFsX0Vycm9yX0hhbmRsZXIobXNnLDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWxlbiAgICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIKLXJzZWcgICAgLSBQbGFjZSB0byBzdG9yZSB0aGUgcmVhbCBtb2RlIHNlZ21lbnQgb2YgdGhlIGJ1ZmZlcgotcm9mZiAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSByZWFsIG1vZGUgb2Zmc2V0IG9mIHRoZSBidWZmZXIKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSBnbG9iYWwgVkVTQSB0cmFuc2ZlcgotYnVmZmVyIHRoYXQgaXMgdXNlZCBmb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBWRVNBIEJJT1MgZnVuY3Rpb25zIGZyb20KLVdpbjE2IGFuZCBXaW4zMiBwcm9ncmFtcyB1bmRlciBXaW5kb3dzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9nZXRWRVNBQnVmKAotICAgIHVpbnQgKmxlbiwKLSAgICB1aW50ICpyc2VnLAotICAgIHVpbnQgKnJvZmYpCi17Ci0gICAgLyogSWYgdGhlIFZ4RCBpcyBkeW5hbWljYWxseSBsb2FkZWQgd2Ugd2lsbCBub3QgaGF2ZSBhIHJlYWwgbW9kZQotICAgICAqIHRyYW5zZmVyIGJ1ZmZlciB0byByZXR1cm4sIHNvIHdlIGZhaWwgdGhlIGNhbGwuCi0gICAgICovCi0gICAgaWYgKF9QTV9ybUJ1ZkFkZHIpIHsKLQkqbGVuID0gVkVTQV9CVUZfU0laRTsKLQkqcnNlZyA9ICh1bG9uZykoX1BNX3JtQnVmQWRkcikgPj4gNDsKLQkqcm9mZiA9ICh1bG9uZykoX1BNX3JtQnVmQWRkcikgJiAweEY7Ci0JcmV0dXJuIF9QTV9ybUJ1ZkFkZHI7Ci0JfQotICAgIHJldHVybiBOVUxMOwotfQotCi1pbnQgUE1BUEkgUE1faW50Mzg2KAotICAgIGludCBpbnRubywKLSAgICBQTVJFR1MgKmluLAotICAgIFBNUkVHUyAqb3V0KQotewotICAgIC8qIFVudXNlZCBpbiBWeERzICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgUE1BUEkgX1BNX2dldFJNdmVjdCgKLSAgICBpbnQgaW50bm8sCi0gICAgbG9uZyAqcmVhbGlzcikKLXsKLSAgICBXT1JEICAgIHNlZzsKLSAgICBEV09SRCAgIG9mZjsKLQotICAgIEdldF9WODZfSW50X1ZlY3RvcihpbnRubywmc2VnLCZvZmYpOwotICAgICpyZWFsaXNyID0gKChsb25nKXNlZyA8PCAxNikgfCAob2ZmICYgMHhGRkZGKTsKLX0KLQotdm9pZCBQTUFQSSBfUE1fc2V0Uk12ZWN0KAotICAgIGludCBpbnRubywKLSAgICBsb25nIHJlYWxpc3IpCi17Ci0gICAgU2V0X1Y4Nl9JbnRfVmVjdG9yKGludG5vLHJlYWxpc3IgPj4gMTYscmVhbGlzciAmIDB4RkZGRik7Ci19Ci0KLWNoYXIgKiBQTUFQSSBQTV9nZXRDdXJyZW50UGF0aCgKLSAgICBjaGFyICpwYXRoLAotICAgIGludCBtYXhMZW4pCi17Ci0gICAgc3RybmNweShwYXRoLF9QTV9jbnRQYXRoLG1heExlbik7Ci0gICAgcGF0aFttYXhMZW4tMV0gPSAwOwotICAgIHJldHVybiBwYXRoOwotfQotCi1jaGFyIFBNQVBJIFBNX2dldEJvb3REcml2ZSh2b2lkKQoteyByZXR1cm4gJ2MnOyB9Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRWQkVBRlBhdGgodm9pZCkKLXsgcmV0dXJuICJjOlxcIjsgfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXN6S2V5ICAgICAgIC0gS2V5IHRvIHF1ZXJ5IChjYW4gY29udGFpbiB2ZXJzaW9uIG51bWJlciBmb3JtYXR0aW5nKQotc3pWYWx1ZSAgICAgLSBWYWx1ZSB0byBnZXQgaW5mb3JtYXRpb24gZm9yCi12YWx1ZSAgICAgICAtIFBsYWNlIHRvIHN0b3JlIHRoZSByZWdpc3RyeSBrZXkgZGF0YSByZWFkCi1zaXplICAgICAgICAtIFNpemUgb2YgdGhlIHN0cmluZyBidWZmZXIgdG8gcmVhZCBpbnRvCi0KLVJFVFVSTlM6Ci10cnVlIGlmIHRoZSBrZXkgd2FzIGZvdW5kLCBmYWxzZSBpZiBub3QuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGlib29sIFJFR19xdWVyeVN0cmluZygKLSAgICBjaGFyICpzektleSwKLSAgICBjaGFyICpzelZhbHVlLAotICAgIGNoYXIgKnZhbHVlLAotICAgIHVsb25nIHNpemUpCi17Ci0gICAgSEtFWSAgICBoS2V5OwotICAgIHVsb25nICAgdHlwZTsKLSAgICBpYm9vbCAgIHN0YXR1cyA9IGZhbHNlOwotCi0gICAgbWVtc2V0KHZhbHVlLDAsc2l6ZW9mKHZhbHVlKSk7Ci0gICAgaWYgKFJlZ09wZW5LZXkoSEtFWV9MT0NBTF9NQUNISU5FLHN6S2V5LCZoS2V5KSA9PSBFUlJPUl9TVUNDRVNTKSB7Ci0JaWYgKFJlZ1F1ZXJ5VmFsdWVFeChoS2V5LChQQ0hBUilzelZhbHVlLCh1bG9uZyopTlVMTCwodWxvbmcqKSZ0eXBlLHZhbHVlLCh1bG9uZyopJnNpemUpID09IEVSUk9SX1NVQ0NFU1MpCi0JICAgIHN0YXR1cyA9IHRydWU7Ci0JUmVnQ2xvc2VLZXkoaEtleSk7Ci0JfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzUGF0aCh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIHBhdGhbMjU2XTsKLQotICAgIGlmIChzdHJsZW4oX1BNX251Y2xldXNQYXRoKSA+IDApIHsKLQlzdHJjcHkocGF0aCxfUE1fbnVjbGV1c1BhdGgpOwotCVBNX2JhY2tzbGFzaChwYXRoKTsKLQlyZXR1cm4gcGF0aDsKLQl9Ci0gICAgaWYgKCFSRUdfcXVlcnlTdHJpbmcoc3pXaW5kb3dzS2V5LHN6U3lzdGVtUm9vdCxwYXRoLHNpemVvZihwYXRoKSkpCi0Jc3RyY3B5KHBhdGgsImM6XFx3aW5kb3dzIik7Ci0gICAgUE1fYmFja3NsYXNoKHBhdGgpOwotICAgIHN0cmNhdChwYXRoLCJzeXN0ZW1cXG51Y2xldXMiKTsKLSAgICByZXR1cm4gcGF0aDsKLX0KLQotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE51Y2xldXNDb25maWdQYXRoKHZvaWQpCi17Ci0gICAgc3RhdGljIGNoYXIgcGF0aFsyNTZdOwotICAgIHN0cmNweShwYXRoLFBNX2dldE51Y2xldXNQYXRoKCkpOwotICAgIFBNX2JhY2tzbGFzaChwYXRoKTsKLSAgICBzdHJjYXQocGF0aCwiY29uZmlnIik7Ci0gICAgcmV0dXJuIHBhdGg7Ci19Ci0KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXRVbmlxdWVJRCh2b2lkKQoteyByZXR1cm4gUE1fZ2V0TWFjaGluZU5hbWUoKTsgfQotCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TWFjaGluZU5hbWUodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBuYW1lWzI1Nl07Ci0gICAgaWYgKFJFR19xdWVyeVN0cmluZyhzek1hY2hpbmVOYW1lS2V5LHN6TWFjaGluZU5hbWUsbmFtZSxzaXplb2YobmFtZSkpKQotCXJldHVybiBuYW1lOwotICAgIHJldHVybiAiVW5rbm93biI7Ci19Ci0KLWludCBQTUFQSSBQTV9rYmhpdCh2b2lkKQoteyByZXR1cm4gMTsgfQotCi1pbnQgUE1BUEkgUE1fZ2V0Y2godm9pZCkKLXsgcmV0dXJuIDA7IH0KLQotUE1fSFdORCBQTUFQSSBQTV9vcGVuQ29uc29sZSgKLSAgICBQTV9IV05EIGh3bmRVc2VyLAotICAgIGludCBkZXZpY2UsCi0gICAgaW50IHhSZXMsCi0gICAgaW50IHlSZXMsCi0gICAgaW50IGJwcCwKLSAgICBpYm9vbCBmdWxsU2NyZWVuKQotewotICAgIC8qIFVudXNlZCBpbiBWeERzICovCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLWludCBQTUFQSSBQTV9nZXRDb25zb2xlU3RhdGVTaXplKHZvaWQpCi17Ci0gICAgLyogVW51c2VkIGluIFZ4RHMgKi8KLSAgICByZXR1cm4gMTsKLX0KLQotdm9pZCBQTUFQSSBQTV9zYXZlQ29uc29sZVN0YXRlKAotICAgIHZvaWQgKnN0YXRlQnVmLAotICAgIFBNX0hXTkQgaHduZENvbnNvbGUpCi17Ci0gICAgLyogVW51c2VkIGluIFZ4RHMgKi8KLX0KLQotdm9pZCBQTUFQSSBQTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2soCi0gICAgaW50IChfQVNNQVBJUCBzYXZlU3RhdGUpKAotCWludCBmbGFncykpCi17Ci0gICAgLyogVW51c2VkIGluIFZ4RHMgKi8KLX0KLQotdm9pZCBQTUFQSSBQTV9yZXN0b3JlQ29uc29sZVN0YXRlKAotICAgIGNvbnN0IHZvaWQgKnN0YXRlQnVmLAotICAgIFBNX0hXTkQgaHduZENvbnNvbGUpCi17Ci0gICAgLyogVW51c2VkIGluIFZ4RHMgKi8KLX0KLQotdm9pZCBQTUFQSSBQTV9jbG9zZUNvbnNvbGUoCi0gICAgUE1fSFdORCBod25kQ29uc29sZSkKLXsKLSAgICAvKiBVbnVzZWQgaW4gVnhEcyAqLwotfQotCi12b2lkIFBNX3NldE9TQ3Vyc29yTG9jYXRpb24oCi0gICAgaW50IHgsCi0gICAgaW50IHkpCi17Ci0gICAgdWNoYXIgKl9iaW9zUHRyID0gUE1fZ2V0QklPU1BvaW50ZXIoKTsKLSAgICBQTV9zZXRCeXRlKF9iaW9zUHRyKzB4NTAseCk7Ci0gICAgUE1fc2V0Qnl0ZShfYmlvc1B0cisweDUxLHkpOwotfQotCi12b2lkIFBNX3NldE9TU2NyZWVuV2lkdGgoCi0gICAgaW50IHdpZHRoLAotICAgIGludCBoZWlnaHQpCi17Ci0gICAgdWNoYXIgKl9iaW9zUHRyID0gUE1fZ2V0QklPU1BvaW50ZXIoKTsKLSAgICBQTV9zZXRCeXRlKF9iaW9zUHRyKzB4NEEsd2lkdGgpOwotICAgIFBNX3NldEJ5dGUoX2Jpb3NQdHIrMHg4NCxoZWlnaHQtMSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGUgYSBibG9jayBvZiBzaGFyZWQgbWVtb3J5LiBGb3IgV2luOXggd2UgYWxsb2NhdGUgc2hhcmVkIG1lbW9yeQotYXMgbG9ja2VkLCBnbG9iYWwgbWVtb3J5IHRoYXQgaXMgYWNjZXNzaWJsZSBmcm9tIGFueSBtZW1vcnkgY29udGV4dAotKGluY2x1ZGluZyBpbnRlcnJ1cHQgdGltZSBjb250ZXh0KSwgd2hpY2ggYWxsb3dzIHVzIHRvIGxvYWQgb3VyIGltcG9ydGFudAotZGF0YSBzdHJ1Y3R1cmUgYW5kIGNvZGUgc3VjaCB0aGF0IHdlIGNhbiBhY2Nlc3MgaXQgZGlyZWN0bHkgZnJvbSBhIHJpbmcKLTAgaW50ZXJydXB0IGNvbnRleHQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX21hbGxvY1NoYXJlZCgKLSAgICBsb25nIHNpemUpCi17Ci0gICAgTUVNSEFORExFICAgaE1lbTsKLSAgICBEV09SRCAgICAgICBwZ051bSxuUGFnZXMgPSAoc2l6ZSArIDB4RkZGKSA+PiAxMjsKLSAgICBpbnQgICAgICAgICBpOwotCi0gICAgLyogRmlyc3QgZmluZCBhIGZyZWUgc2xvdCBpbiBvdXIgc2hhcmVkIG1lbW9yeSB0YWJsZSAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTUVNT1JZX1NIQVJFRDsgaSsrKSB7Ci0JaWYgKHNoYXJlZFtpXS5saW5lYXIgPT0gMCkKLQkgICAgYnJlYWs7Ci0JfQotICAgIGlmIChpIDwgTUFYX01FTU9SWV9TSEFSRUQpIHsKLQlQYWdlQWxsb2NhdGUoblBhZ2VzLFBHX1NZUywwLDAsMCwwLE5VTEwsMCwmaE1lbSwmc2hhcmVkW2ldLmxpbmVhcik7Ci0Jc2hhcmVkW2ldLm5wYWdlcyA9IG5QYWdlczsKLQlwZ051bSA9ICh1bG9uZylzaGFyZWRbaV0ubGluZWFyID4+IDEyOwotCXNoYXJlZFtpXS5nbG9iYWwgPSBMaW5QYWdlTG9jayhwZ051bSxuUGFnZXMsUEFHRU1BUEdMT0JBTCk7Ci0JcmV0dXJuICh2b2lkKilzaGFyZWRbaV0uZ2xvYmFsOwotCX0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgYmxvY2sgb2Ygc2hhcmVkIG1lbW9yeQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZVNoYXJlZCh2b2lkICpwKQotewotICAgIGludCBpOwotCi0gICAgLyogRmluZCBhIHNoYXJlZCBtZW1vcnkgYmxvY2sgaW4gb3VyIHRhYmxlIGFuZCBmcmVlIGl0ICovCi0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9NRU1PUllfU0hBUkVEOyBpKyspIHsKLQlpZiAoc2hhcmVkW2ldLmdsb2JhbCA9PSAodWxvbmcpcCkgewotCSAgICBMaW5QYWdlVW5Mb2NrKHNoYXJlZFtpXS5nbG9iYWwgPj4gMTIsc2hhcmVkW2ldLm5wYWdlcyxQQUdFTUFQR0xPQkFMKTsKLQkgICAgUGFnZUZyZWUoKHVsb25nKXNoYXJlZFtpXS5saW5lYXIsMCk7Ci0JICAgIHNoYXJlZFtpXS5saW5lYXIgPSAwOwotCSAgICBicmVhazsKLQkgICAgfQotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1NYXBzIGEgc2hhcmVkIG1lbW9yeSBibG9jayBpbnRvIHByb2Nlc3MgYWRkcmVzcyBzcGFjZS4gRG9lcyBub3RoaW5nIHNpbmNlCi10aGUgbWVtb3J5IGJsb2NrcyBhcmUgYWxyZWFkeSBnbG9iYWxseTcgbWFwcGVkIGludG8gYWxsIHByb2Nlc3Nlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbWFwVG9Qcm9jZXNzKAotICAgIHZvaWQgKmJhc2UsCi0gICAgdWxvbmcgbGltaXQpCi17Ci0gICAgcmV0dXJuICh2b2lkKiliYXNlOwotfQotCi1pYm9vbCBQTUFQSSBQTV9kb0JJT1NQT1NUKAotICAgIHVzaG9ydCBheFZhbCwKLSAgICB1bG9uZyBCSU9TUGh5c0FkZHIsCi0gICAgdm9pZCAqbWFwcGVkQklPUywKLSAgICB1bG9uZyBCSU9TTGVuKQotewotICAgIC8qIFRPRE86IEZpZ3VyZSBvdXQgaG93IHRvIGRvIHRoaXMgKi8KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRCSU9TUG9pbnRlcih2b2lkKQoteyByZXR1cm4gKHZvaWQqKTB4NDAwOyB9Ci0KLXZvaWQgKiBQTUFQSSBQTV9nZXRBMDAwMFBvaW50ZXIodm9pZCkKLXsgcmV0dXJuIFBNX21hcFBoeXNpY2FsQWRkcigweEEwMDAwLDB4RkZGRix0cnVlKTsgfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWJhc2UgICAgICAgIC0gUGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgdG8gbWFwcyBpbgotbGltaXQgICAgICAgLSBMaW1pdCBvZiBwaHlzaWNhbCBtZW1vcnkgdG8gcmVnaW9uIHRvIG1hcHMgaW4KLQotUkVUVVJOUzoKLUxpbmVhciBhZGRyZXNzIG9mIHRoZSBuZXdseSBtYXBwZWQgbWVtb3J5LgotCi1SRU1BUktTOgotTWFwcyBhIHBoeXNpY2FsIG1lbW9yeSByYW5nZSB0byBhIGxpbmVhciBtZW1vcnkgcmFuZ2UuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgX1BNX21hcFBoeXNpY2FsVG9MaW5lYXIoCi0gICAgdWxvbmcgYmFzZSwKLSAgICB1bG9uZyBsaW1pdCwKLSAgICBpbnQgKm5wYWdlcykKLXsKLSAgICB1bG9uZyAgIGxpbmVhcixsZW5ndGggPSBsaW1pdCsxOwotICAgIGludCAgICAgaSxwcGFnZSxmbGFnczsKLQotICAgIGlmIChiYXNlIDwgMHgxMDAwMDApIHsKLQkvKiBXaW5kb3dzIDl4IGlzIHplcm8gYmFzZWQgZm9yIHRoZSBmaXJzdCBtZWcgb2YgbWVtb3J5ICovCi0JcmV0dXJuIGJhc2U7Ci0JfQotICAgIHBwYWdlID0gYmFzZSA+PiAxMjsKLSAgICAqbnBhZ2VzID0gKGxlbmd0aCArIChiYXNlICYgMHhGRkYpICsgNDA5NSkgPj4gMTI7Ci0gICAgZmxhZ3MgPSBQUl9GSVhFRCB8IFBSX1NUQVRJQzsKLSAgICBpZiAoYmFzZSA9PSAweEEwMDAwKSB7Ci0JLyogV2UgcmVxdWlyZSB0aGUgbGluZWFyIGFkZHJlc3MgdG8gYmUgYWxpZ25lZCB0byBhIDY0S2IgYm91bmRhcnkKLQkgKiBmb3IgbWFwcGluZyB0aGUgYmFua2VkIGZyYW1lYnVmZmVyIChzbyB3ZSBjYW4gZG8gZWZmaWNpZW50Ci0JICogY2FycnkgY2hlY2tpbmcgZm9yIGJhbmsgY2hhbmdlcyBpbiB0aGUgYXNzZW1ibGVyIGNvZGUpLiBUaGUgb25seQotCSAqIHdheSB0byBlbnN1cmUgdGhpcyBpcyB0byBmb3JjZSB0aGUgbGluZWFyIGFkZHJlc3MgdG8gYmUgYWxpZ25lZAotCSAqIHRvIGEgNE1iIGJvdW5kYXJ5LgotCSAqLwotCWZsYWdzIHw9IFBSXzRNRUc7Ci0JfQotICAgIGlmICgobGluZWFyID0gKHVsb25nKVBhZ2VSZXNlcnZlKFBSX1NZU1RFTSwqbnBhZ2VzLGZsYWdzKSkgPT0gKHVsb25nKS0xKQotCXJldHVybiAweEZGRkZGRkZGOwotICAgIGlmICghUGFnZUNvbW1pdFBoeXMobGluZWFyID4+IDEyLCpucGFnZXMscHBhZ2UsUENfSU5DUiB8IFBDX1VTRVIgfCBQQ19XUklURUFCTEUpKQotCXJldHVybiAweEZGRkZGRkZGOwotICAgIHJldHVybiBsaW5lYXIgKyAoYmFzZSAmIDB4RkZGKTsKLX0KLQotLyogUGFnZSB0YWJsZSBmbGFncyAqLwotCi0jZGVmaW5lIFBBR0VfRkxBR1NfUFJFU0VOVAkJCTB4MDAwMDAwMDEKLSNkZWZpbmUgUEFHRV9GTEFHU19XUklURUFCTEUJCTB4MDAwMDAwMDIKLSNkZWZpbmUgUEFHRV9GTEFHU19VU0VSCQkJCTB4MDAwMDAwMDQKLSNkZWZpbmUgUEFHRV9GTEFHU19XUklURV9USFJPVUdICTB4MDAwMDAwMDgKLSNkZWZpbmUgUEFHRV9GTEFHU19DQUNIRV9ESVNBQkxFCTB4MDAwMDAwMTAKLSNkZWZpbmUgUEFHRV9GTEFHU19BQ0NFU1NFRAkJCTB4MDAwMDAwMjAKLSNkZWZpbmUgUEFHRV9GTEFHU19ESVJUWQkJCTB4MDAwMDAwNDAKLSNkZWZpbmUgUEFHRV9GTEFHU180TUIJICAgICAgICAgICAgMHgwMDAwMDA4MAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWJhc2UgICAgICAgIC0gUGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgdG8gbWFwcyBpbgotbGltaXQgICAgICAgLSBMaW1pdCBvZiBwaHlzaWNhbCBtZW1vcnkgdG8gcmVnaW9uIHRvIG1hcHMgaW4KLWlzQ2FjaGVkICAgIC0gVHJ1ZSBpZiB0aGUgbWVtb3J5IHNob3VsZCBiZSBjYWNoZWQsIGZhbHNlIGlmIG5vdAotCi1SRVRVUk5TOgotTGluZWFyIGFkZHJlc3Mgb2YgdGhlIG5ld2x5IG1hcHBlZCBtZW1vcnkuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIG1hcHMgcGh5c2ljYWwgbWVtb3J5IHRvIGxpbmVhciBtZW1vcnksIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQKLXRvIGNyZWF0ZSBhIHNlbGVjdG9yIG9yIHVzZWQgZGlyZWN0bHkgZnJvbSAzMi1iaXQgcHJvdGVjdGVkIG1vZGUgcHJvZ3JhbXMuCi1UaGlzIGlzIGJldHRlciB0aGFuIERQTUkgMHg4MDAsIHNpbmNlIGl0IGFsbG93cyB5b3UgdG8gbWFwcyBwaHlzaWNhbAotbWVtb3J5IGJlbG93IDFNYiwgd2hpY2ggZ2V0cyB0aGlzIG1lbW9yeSBvdXQgb2YgdGhlIHdheSBvZiB0aGUgV2luZG93cyBWREQncwotc3RpY2t5IHBhd3MuCi0KLU5PVEU6ICAgSWYgdGhlIG1lbW9yeSBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgY2FjaGVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwKLQlkaXJlY3RseSByZS1wcm9ncmFtIHRoZSBQQ0QgKFBhZ2UgQ2FjaGUgRGlzYWJsZSkgYml0IGluIHRoZQotCXBhZ2UgdGFibGVzLiBUaGVyZSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYSBtZWNoYW5pc20gaW4gdGhlIFZNTQotCXRvIGNvbnRyb2wgdGhpcyBiaXQgdmlhIHRoZSByZWd1bGFyIGludGVyZmFjZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbWFwUGh5c2ljYWxBZGRyKAotICAgIHVsb25nIGJhc2UsCi0gICAgdWxvbmcgbGltaXQsCi0gICAgaWJvb2wgaXNDYWNoZWQpCi17Ci0gICAgdWxvbmcgICBsaW5lYXIsbGVuZ3RoID0gbGltaXQrMTsKLSAgICBpbnQgICAgIGksbnBhZ2VzOwotICAgIHVsb25nICAgUERCLCpwUERCOwotCi0gICAgLyogU2VhcmNoIHRhYmxlIG9mIGV4aXN0aW5nIG1hcHBpbmdzIHRvIHNlZSBpZiB3ZSBoYXZlIGFscmVhZHkgbWFwcGVkCi0gICAgICogYSByZWdpb24gb2YgbWVtb3J5IHRoYXQgd2lsbCBzZXJ2ZSB0aGlzIHB1cnBvc2UuCi0gICAgICovCi0gICAgZm9yIChpID0gMDsgaSA8IG51bU1hcHBpbmdzOyBpKyspIHsKLQlpZiAobWFwc1tpXS5waHlzaWNhbCA9PSBiYXNlICYmIG1hcHNbaV0ubGVuZ3RoID09IGxlbmd0aCAmJiBtYXBzW2ldLmlzQ2FjaGVkID09IGlzQ2FjaGVkKQotCSAgICByZXR1cm4gKHZvaWQqKW1hcHNbaV0ubGluZWFyOwotCX0KLSAgICBpZiAobnVtTWFwcGluZ3MgPT0gTUFYX01FTU9SWV9NQVBQSU5HUykKLQlyZXR1cm4gTlVMTDsKLQotICAgIC8qIFdlIGRpZCBub3QgZmluZCBhbnkgcHJldmlvdXNseSBtYXBwZWQgbWVtb3J5IHJlZ2lvbiwgc28gbWFwcyBpdCBpbi4KLSAgICAgKiBOb3RlIHRoYXQgd2UgZG8gbm90IHVzZSBNYXBQaHlzVG9MaW5lYXIsIHNpbmNlIHRoaXMgZnVuY3Rpb24gYXBwZWFycwotICAgICAqIHRvIGhhdmUgcHJvYmxlbXMgbWFwcGluZyBtZW1vcnkgaW4gdGhlIDFNYiBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlLgotICAgICAqIEhlbmNlIHdlIHVzZSBQYWdlUmVzZXJ2ZSBhbmQgUGFnZUNvbW1pdFBoeXMuCi0gICAgICovCi0gICAgaWYgKChsaW5lYXIgPSBfUE1fbWFwUGh5c2ljYWxUb0xpbmVhcihiYXNlLGxpbWl0LCZucGFnZXMpKSA9PSAweEZGRkZGRkZGKQotCXJldHVybiBOVUxMOwotICAgIG1hcHNbbnVtTWFwcGluZ3NdLnBoeXNpY2FsID0gYmFzZTsKLSAgICBtYXBzW251bU1hcHBpbmdzXS5sZW5ndGggPSBsZW5ndGg7Ci0gICAgbWFwc1tudW1NYXBwaW5nc10ubGluZWFyID0gbGluZWFyOwotICAgIG1hcHNbbnVtTWFwcGluZ3NdLm5wYWdlcyA9IG5wYWdlczsKLSAgICBtYXBzW251bU1hcHBpbmdzXS5pc0NhY2hlZCA9IGlzQ2FjaGVkOwotICAgIG51bU1hcHBpbmdzKys7Ci0KLSAgICAvKiBGaW5hbGx5IGRpc2FibGUgY2FjaGluZyB3aGVyZSBuZWNlc3NhcnkgKi8KLSAgICBpZiAoIWlzQ2FjaGVkICYmIChQREIgPSBfUE1fZ2V0UERCKCkpICE9IDApIHsKLQlpbnQgICAgIHN0YXJ0UERCLGVuZFBEQixpUERCLHN0YXJ0UGFnZSxlbmRQYWdlLHN0YXJ0LGVuZCxpUGFnZTsKLQl1bG9uZyAgIHBhZ2VUYWJsZSwqcFBhZ2VUYWJsZTsKLQlwUERCID0gKHVsb25nKilfUE1fbWFwUGh5c2ljYWxUb0xpbmVhcihQREIsMHhGRkYsJm5wYWdlcyk7Ci0JaWYgKHBQREIpIHsKLQkgICAgc3RhcnRQREIgPSAobGluZWFyID4+IDIyKSAmIDB4M0ZGOwotCSAgICBzdGFydFBhZ2UgPSAobGluZWFyID4+IDEyKSAmIDB4M0ZGOwotCSAgICBlbmRQREIgPSAoKGxpbmVhcitsaW1pdCkgPj4gMjIpICYgMHgzRkY7Ci0JICAgIGVuZFBhZ2UgPSAoKGxpbmVhcitsaW1pdCkgPj4gMTIpICYgMHgzRkY7Ci0JICAgIGZvciAoaVBEQiA9IHN0YXJ0UERCOyBpUERCIDw9IGVuZFBEQjsgaVBEQisrKSB7Ci0JCS8qIFNldCB0aGUgYml0cyBpbiB0aGUgcGFnZSBkaXJlY3RvcnkgZW50cnkgLSByZXF1aXJlZCBhcyBwZXIgKi8KLQkJLyogUGVudGl1bSA0IG1hbnVhbC4gVGhpcyBhbHNvIHRha2VzIGNhcmUgb2YgdGhlIDRNQiBwYWdlIGVudHJpZXMgKi8KLQkJcFBEQltpUERCXSA9IHBQREJbaVBEQl0gfD0gKFBBR0VfRkxBR1NfV1JJVEVfVEhST1VHSCB8IFBBR0VfRkxBR1NfQ0FDSEVfRElTQUJMRSk7Ci0JCWlmICghKHBQREJbaVBEQl0gJiBQQUdFX0ZMQUdTXzRNQikpIHsKLQkJICAgIC8qIElmIHdlIGFyZSBkZWFsaW5nIHdpdGggNEtCIHBhZ2VzIHRoZW4gd2UgbmVlZCB0byBpdGVyYXRlICovCi0JCSAgICAvKiB0aHJvdWdoIGVhY2ggb2YgdGhlIHBhZ2UgdGFibGUgZW50cmllcyAqLwotCQkgICAgcGFnZVRhYmxlID0gcFBEQltpUERCXSAmIH4weEZGRjsKLQkJICAgIHBQYWdlVGFibGUgPSAodWxvbmcqKV9QTV9tYXBQaHlzaWNhbFRvTGluZWFyKHBhZ2VUYWJsZSwweEZGRiwmbnBhZ2VzKTsKLQkJICAgIHN0YXJ0ID0gKGlQREIgPT0gc3RhcnRQREIpID8gc3RhcnRQYWdlIDogMDsKLQkJICAgIGVuZCA9IChpUERCID09IGVuZFBEQikgPyBlbmRQYWdlIDogMHgzRkY7Ci0JCSAgICBmb3IgKGlQYWdlID0gc3RhcnQ7IGlQYWdlIDw9IGVuZDsgaVBhZ2UrKykKLQkJCXBQYWdlVGFibGVbaVBhZ2VdIHw9IChQQUdFX0ZMQUdTX1dSSVRFX1RIUk9VR0ggfCBQQUdFX0ZMQUdTX0NBQ0hFX0RJU0FCTEUpOwotCQkgICAgUGFnZUZyZWUoKHVsb25nKXBQYWdlVGFibGUsUFJfU1RBVElDKTsKLQkJICAgIH0KLQkJfQotCSAgICBQYWdlRnJlZSgodWxvbmcpcFBEQixQUl9TVEFUSUMpOwotCSAgICBQTV9mbHVzaFRMQigpOwotCSAgICB9Ci0JfQotICAgIHJldHVybiAodm9pZCopbGluZWFyOwotfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVQaHlzaWNhbEFkZHIoCi0gICAgdm9pZCAqcHRyLAotICAgIHVsb25nIGxpbWl0KQotewotICAgIC8qIFdlIG5ldmVyIGZyZWUgdGhlIG1hcHBpbmdzICovCi19Ci0KLXZvaWQgUE1BUEkgUE1fc2xlZXAodWxvbmcgbWlsbGlzZWNvbmRzKQotewotICAgIC8qIFdlIG5ldmVyIHNsZWVwIGluIGEgVnhEICovCi19Ci0KLWludCBQTUFQSSBQTV9nZXRDT01Qb3J0KGludCBwb3J0KQotewotICAgIC8qIFRPRE86IFJlLWNvZGUgdGhpcyB0byBkZXRlcm1pbmUgcmVhbCB2YWx1ZXMgdXNpbmcgdGhlIFBsdWcgYW5kIFBsYXkgKi8KLSAgICAvKiAgICAgICBtYW5hZ2VyIGZvciB0aGUgT1MuICovCi0gICAgc3dpdGNoIChwb3J0KSB7Ci0JY2FzZSAwOiByZXR1cm4gMHgzRjg7Ci0JY2FzZSAxOiByZXR1cm4gMHgyRjg7Ci0JY2FzZSAyOiByZXR1cm4gMHgzRTg7Ci0JY2FzZSAzOiByZXR1cm4gMHgyRTg7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi1pbnQgUE1BUEkgUE1fZ2V0TFBUUG9ydChpbnQgcG9ydCkKLXsKLSAgICAvKiBUT0RPOiBSZS1jb2RlIHRoaXMgdG8gZGV0ZXJtaW5lIHJlYWwgdmFsdWVzIHVzaW5nIHRoZSBQbHVnIGFuZCBQbGF5ICovCi0gICAgLyogICAgICAgbWFuYWdlciBmb3IgdGhlIE9TLiAqLwotICAgIHN3aXRjaCAocG9ydCkgewotCWNhc2UgMDogcmV0dXJuIDB4M0JDOwotCWNhc2UgMTogcmV0dXJuIDB4Mzc4OwotCWNhc2UgMjogcmV0dXJuIDB4Mjc4OwotCX0KLSAgICByZXR1cm4gMDsKLX0KLQotdWxvbmcgUE1BUEkgUE1fZ2V0UGh5c2ljYWxBZGRyKAotICAgIHZvaWQgKnApCi17Ci0gICAgRFdPUkQgICBwdGU7Ci0KLSAgICAvKiBUb3VjaCB0aGUgbWVtb3J5IGJlZm9yZSBjYWxsaW5nIENvcHlQYWdlVGFibGUuIEZvciBzb21lIHJlYXNvbiAqLwotICAgIC8qIHdlIG5lZWQgdG8gZG8gdGhpcyBvbiBXaW5kb3dzIDl4LCBvdGhlcndpc2UgdGhlIG1lbW9yeSBtYXkgbm90ICovCi0gICAgLyogYmUgcGFnZWQgaW4gY29ycmVjdGx5LiBPZiBjb3Vyc2UgaWYgdGhlIHBhc3NlZCBpbiBwb2ludGVyIGlzICovCi0gICAgLyogaW52YWxpZCwgdGhpcyBmdW5jdGlvbiB3aWxsIGZhdWx0LCBidXQgd2Ugc2hvdWxkbid0IGJlIHBhc3NlZCBib2d1cyAqLwotICAgIC8qIHBvaW50ZXJzIGFueXdheSA7LSkgKi8KLSAgICBwdGUgPSAqKCh1bG9uZyopcCk7Ci0KLSAgICAvKiBSZXR1cm4gYXNzZW1ibGVkIGFkZHJlc3MgdmFsdWUgb25seSBpZiBWTU0gc2VydmljZSBzdWNjZWVkcyAqLwotICAgIGlmIChDb3B5UGFnZVRhYmxlKCgoRFdPUkQpcCkgPj4gMTIsIDEsIChQVk9JRCopJnB0ZSwgMCkpCi0JcmV0dXJuIChwdGUgJiB+MHhGRkYpIHwgKCgoRFdPUkQpcCkgJiAweEZGRik7Ci0KLSAgICAvKiBSZXR1cm4gZmFpbHVyZSB0byB0aGUgY2FsbGVyISAqLwotICAgIHJldHVybiAweEZGRkZGRkZGVUw7Ci19Ci0KLWlib29sIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkclJhbmdlKAotICAgIHZvaWQgKnAsCi0gICAgdWxvbmcgbGVuZ3RoLAotICAgIHVsb25nICpwaHlzQWRkcmVzcykKLXsKLSAgICBpbnQgICAgIGk7Ci0gICAgdWxvbmcgICBsaW5lYXIgPSAodWxvbmcpcCAmIH4weEZGRjsKLQotICAgIGZvciAoaSA9IChsZW5ndGggKyAweEZGRikgPj4gMTI7IGkgPiAwOyBpLS0pIHsKLQlpZiAoKCpwaHlzQWRkcmVzcysrID0gUE1fZ2V0UGh5c2ljYWxBZGRyKCh2b2lkKilsaW5lYXIpKSA9PSAweEZGRkZGRkZGKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JbGluZWFyICs9IDQwOTY7Ci0JfQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFBNQVBJIF9QTV9mcmVlTWVtb3J5TWFwcGluZ3Modm9pZCkKLXsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTWFwcGluZ3M7IGkrKykKLQlQYWdlRnJlZShtYXBzW2ldLmxpbmVhcixQUl9TVEFUSUMpOwotfQotCi12b2lkICogUE1BUEkgUE1fbWFwUmVhbFBvaW50ZXIoCi0gICAgdWludCByX3NlZywKLSAgICB1aW50IHJfb2ZmKQotewotICAgIHJldHVybiAodm9pZCopTUtfUEhZUyhyX3NlZyxyX29mZik7Ci19Ci0KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY1JlYWxTZWcoCi0gICAgdWludCBzaXplLAotICAgIHVpbnQgKnJfc2VnLAotICAgIHVpbnQgKnJfb2ZmKQotewotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFBNX2ZyZWVSZWFsU2VnKAotICAgIHZvaWQgKm1lbSkKLXsKLX0KLQotdm9pZCBQTUFQSSBEUE1JX2ludDg2KAotICAgIGludCBpbnRubywKLSAgICBEUE1JX3JlZ3MgKnJlZ3MpCi17Ci0gICAgLyogVW5zZWQgaW4gVnhEJ3MgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Mb2FkIHRoZSBWODYgcmVnaXN0ZXJzIGluIHRoZSBjbGllbnQgc3RhdGUsIGFuZCBzYXZlIHRoZSBvcmlnaW5hbCBzdGF0ZQotYmVmb3JlIGxvYWRpbmcgdGhlIHJlZ2lzdGVycy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBMb2FkVjg2UmVnaXN0ZXJzKAotICAgIENMSUVOVF9TVFJVQ1QgKnNhdmVSZWdzLAotICAgIFJNUkVHUyAqaW4sCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgQ0xJRU5UX1NUUlVDVCAgIG5ld1JlZ3M7Ci0KLSAgICBTYXZlX0NsaWVudF9TdGF0ZShzYXZlUmVncyk7Ci0gICAgbmV3UmVncyA9ICpzYXZlUmVnczsKLSAgICBuZXdSZWdzLkNSUy5DbGllbnRfRUFYID0gaW4tPmUuZWF4OwotICAgIG5ld1JlZ3MuQ1JTLkNsaWVudF9FQlggPSBpbi0+ZS5lYng7Ci0gICAgbmV3UmVncy5DUlMuQ2xpZW50X0VDWCA9IGluLT5lLmVjeDsKLSAgICBuZXdSZWdzLkNSUy5DbGllbnRfRURYID0gaW4tPmUuZWR4OwotICAgIG5ld1JlZ3MuQ1JTLkNsaWVudF9FU0kgPSBpbi0+ZS5lc2k7Ci0gICAgbmV3UmVncy5DUlMuQ2xpZW50X0VESSA9IGluLT5lLmVkaTsKLSAgICBuZXdSZWdzLkNSUy5DbGllbnRfRVMgPSBzcmVncy0+ZXM7Ci0gICAgbmV3UmVncy5DUlMuQ2xpZW50X0RTID0gc3JlZ3MtPmRzOwotICAgIFJlc3RvcmVfQ2xpZW50X1N0YXRlKCZuZXdSZWdzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIHRoZSBWODYgcmVnaXN0ZXJzIGZyb20gdGhlIGNsaWVudCBzdGF0ZSBhbmQgcmVzdG9yZSB0aGUgb3JpZ2luYWwgc3RhdGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgUmVhZFY4NlJlZ2lzdGVycygKLSAgICBDTElFTlRfU1RSVUNUICpzYXZlUmVncywKLSAgICBSTVJFR1MgKm91dCwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICBDTElFTlRfU1RSVUNUICAgbmV3UmVnczsKLQotICAgIFNhdmVfQ2xpZW50X1N0YXRlKCZuZXdSZWdzKTsKLSAgICBvdXQtPmUuZWF4ID0gbmV3UmVncy5DUlMuQ2xpZW50X0VBWDsKLSAgICBvdXQtPmUuZWJ4ID0gbmV3UmVncy5DUlMuQ2xpZW50X0VCWDsKLSAgICBvdXQtPmUuZWN4ID0gbmV3UmVncy5DUlMuQ2xpZW50X0VDWDsKLSAgICBvdXQtPmUuZWR4ID0gbmV3UmVncy5DUlMuQ2xpZW50X0VEWDsKLSAgICBvdXQtPmUuZXNpID0gbmV3UmVncy5DUlMuQ2xpZW50X0VTSTsKLSAgICBvdXQtPmUuZWRpID0gbmV3UmVncy5DUlMuQ2xpZW50X0VESTsKLSAgICBzcmVncy0+ZXMgPSBuZXdSZWdzLkNSUy5DbGllbnRfRVM7Ci0gICAgc3JlZ3MtPmRzID0gbmV3UmVncy5DUlMuQ2xpZW50X0RTOwotICAgIFJlc3RvcmVfQ2xpZW50X1N0YXRlKHNhdmVSZWdzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIGEgVjg2IHJlYWwgbW9kZSBmdW5jdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgdmFsdWVzCi1sb2FkZWQgYmVmb3JlIHRoZSBjYWxsLiBUaGUgY2FsbCByZXR1cm5zIHdpdGggYSBmYXIgcmV0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fY2FsbFJlYWxNb2RlKAotICAgIHVpbnQgc2VnLAotICAgIHVpbnQgb2ZmLAotICAgIFJNUkVHUyAqcmVncywKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICBDTElFTlRfU1RSVUNUIHNhdmVSZWdzOwotCi0gICAgLyogQmFpbCBpZiB3ZSBkbyBub3QgaGF2ZSBCSU9TIGFjY2VzcyAoaWU6IHRoZSBWeEQgd2FzIGR5bmFtaWNhbGx5Ci0gICAgICogbG9hZGVkLCBhbmQgbm90IHN0YXRpY2FsbHkgbG9hZGVkLgotICAgICAqLwotICAgIGlmICghX1BNX2hhdmVCSU9TKQotCXJldHVybjsKLQotICAgIF9UUkFDRSgiU0RESEVMUDogRW50ZXJpbmcgUE1fY2FsbFJlYWxNb2RlKClcbiIpOwotICAgIEJlZ2luX05lc3RfVjg2X0V4ZWMoKTsKLSAgICBMb2FkVjg2UmVnaXN0ZXJzKCZzYXZlUmVncyxyZWdzLHNyZWdzKTsKLSAgICBTaW11bGF0ZV9GYXJfQ2FsbChzZWcsIG9mZik7Ci0gICAgUmVzdW1lX0V4ZWMoKTsKLSAgICBSZWFkVjg2UmVnaXN0ZXJzKCZzYXZlUmVncyxyZWdzLHNyZWdzKTsKLSAgICBFbmRfTmVzdF9FeGVjKCk7Ci0gICAgX1RSQUNFKCJTRERIRUxQOiBFeGl0aW5nIFBNX2NhbGxSZWFsTW9kZSgpXG4iKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jc3N1ZSBhIFY4NiByZWFsIG1vZGUgaW50ZXJydXB0IHdpdGggdGhlIHNwZWNpZmllZCByZWdpc3RlciB2YWx1ZXMKLWxvYWRlZCBiZWZvcmUgdGhlIGludGVycnVwdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1faW50ODYoCi0gICAgaW50IGludG5vLAotICAgIFJNUkVHUyAqaW4sCi0gICAgUk1SRUdTICpvdXQpCi17Ci0gICAgUk1TUkVHUyAgICAgICAgIHNyZWdzID0gezB9OwotICAgIENMSUVOVF9TVFJVQ1QgICBzYXZlUmVnczsKLSAgICB1c2hvcnQgICAgICAgICAgb2xkRGlzYWJsZTsKLQotICAgIC8qIEJhaWwgaWYgd2UgZG8gbm90IGhhdmUgQklPUyBhY2Nlc3MgKGllOiB0aGUgVnhEIHdhcyBkeW5hbWljYWxseQotICAgICAqIGxvYWRlZCwgYW5kIG5vdCBzdGF0aWNhbGx5IGxvYWRlZC4KLSAgICAgKi8KLSAgICBpZiAoIV9QTV9oYXZlQklPUykgewotCSpvdXQgPSAqaW47Ci0JcmV0dXJuIG91dC0+eC5heDsKLQl9Ci0KLSAgICAvKiBEaXNhYmxlIHBhc3MtdXAgdG8gb3VyIFZ4RCBoYW5kbGVyIHNvIHdlIGRpcmVjdGx5IGNhbGwgQklPUyAqLwotICAgIF9UUkFDRSgiU0RESEVMUDogRW50ZXJpbmcgUE1faW50ODYoKVxuIik7Ci0gICAgaWYgKGRpc2FibGVUU1JGbGFnKSB7Ci0Jb2xkRGlzYWJsZSA9ICpkaXNhYmxlVFNSRmxhZzsKLQkqZGlzYWJsZVRTUkZsYWcgPSAwOwotCX0KLSAgICBCZWdpbl9OZXN0X1Y4Nl9FeGVjKCk7Ci0gICAgTG9hZFY4NlJlZ2lzdGVycygmc2F2ZVJlZ3MsaW4sJnNyZWdzKTsKLSAgICBFeGVjX0ludChpbnRubyk7Ci0gICAgUmVhZFY4NlJlZ2lzdGVycygmc2F2ZVJlZ3Msb3V0LCZzcmVncyk7Ci0gICAgRW5kX05lc3RfRXhlYygpOwotCi0gICAgLyogUmUtZW5hYmxlIHBhc3MtdXAgdG8gb3VyIFZ4RCBoYW5kbGVyIGlmIHByZXZpb3VzbHkgZW5hYmxlZCAqLwotICAgIGlmIChkaXNhYmxlVFNSRmxhZykKLQkqZGlzYWJsZVRTUkZsYWcgPSBvbGREaXNhYmxlOwotCi0gICAgX1RSQUNFKCJTRERIRUxQOiBFeGl0aW5nIFBNX2ludDg2KClcbiIpOwotICAgIHJldHVybiBvdXQtPnguYXg7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSXNzdWUgYSBWODYgcmVhbCBtb2RlIGludGVycnVwdCB3aXRoIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgdmFsdWVzCi1sb2FkZWQgYmVmb3JlIHRoZSBpbnRlcnJ1cHQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2ludDg2eCgKLSAgICBpbnQgaW50bm8sCi0gICAgUk1SRUdTICppbiwKLSAgICBSTVJFR1MgKm91dCwKLSAgICBSTVNSRUdTICpzcmVncykKLXsKLSAgICBDTElFTlRfU1RSVUNUICAgc2F2ZVJlZ3M7Ci0gICAgdXNob3J0ICAgICAgICAgIG9sZERpc2FibGU7Ci0KLSAgICAvKiBCYWlsIGlmIHdlIGRvIG5vdCBoYXZlIEJJT1MgYWNjZXNzIChpZTogdGhlIFZ4RCB3YXMgZHluYW1pY2FsbHkKLSAgICAgKiBsb2FkZWQsIGFuZCBub3Qgc3RhdGljYWxseSBsb2FkZWQuCi0gICAgICovCi0gICAgaWYgKCFfUE1faGF2ZUJJT1MpIHsKLQkqb3V0ID0gKmluOwotCXJldHVybiBvdXQtPnguYXg7Ci0JfQotCi0gICAgLyogRGlzYWJsZSBwYXNzLXVwIHRvIG91ciBWeEQgaGFuZGxlciBzbyB3ZSBkaXJlY3RseSBjYWxsIEJJT1MgKi8KLSAgICBfVFJBQ0UoIlNEREhFTFA6IEVudGVyaW5nIFBNX2ludDg2eCgpXG4iKTsKLSAgICBpZiAoZGlzYWJsZVRTUkZsYWcpIHsKLQlvbGREaXNhYmxlID0gKmRpc2FibGVUU1JGbGFnOwotCSpkaXNhYmxlVFNSRmxhZyA9IDA7Ci0JfQotICAgIEJlZ2luX05lc3RfVjg2X0V4ZWMoKTsKLSAgICBMb2FkVjg2UmVnaXN0ZXJzKCZzYXZlUmVncyxpbixzcmVncyk7Ci0gICAgRXhlY19JbnQoaW50bm8pOwotICAgIFJlYWRWODZSZWdpc3RlcnMoJnNhdmVSZWdzLG91dCxzcmVncyk7Ci0gICAgRW5kX05lc3RfRXhlYygpOwotCi0gICAgLyogUmUtZW5hYmxlIHBhc3MtdXAgdG8gb3VyIFZ4RCBoYW5kbGVyIGlmIHByZXZpb3VzbHkgZW5hYmxlZCAqLwotICAgIGlmIChkaXNhYmxlVFNSRmxhZykKLQkqZGlzYWJsZVRTUkZsYWcgPSBvbGREaXNhYmxlOwotCi0gICAgX1RSQUNFKCJTRERIRUxQOiBFeGl0aW5nIFBNX2ludDg2eCgpXG4iKTsKLSAgICByZXR1cm4gb3V0LT54LmF4OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybnMgYXZhaWxhYmxlIG1lbW9yeS4gTm90IHBvc3NpYmxlIHVuZGVyIFdpbmRvd3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9hdmFpbGFibGVNZW1vcnkoCi0gICAgdWxvbmcgKnBoeXNpY2FsLAotICAgIHVsb25nICp0b3RhbCkKLXsKLSAgICAqcGh5c2ljYWwgPSAqdG90YWwgPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlcyBhIGJsb2NrIG9mIGxvY2tlZCBwaHlzaWNhbCBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2FsbG9jTG9ja2VkTWVtKAotICAgIHVpbnQgc2l6ZSwKLSAgICB1bG9uZyAqcGh5c0FkZHIsCi0gICAgaWJvb2wgY29udGlndW91cywKLSAgICBpYm9vbCBiZWxvdzE2TSkKLXsKLSAgICBNRU1IQU5ETEUgICBoTWVtOwotICAgIERXT1JEICAgICAgIG5QYWdlcyA9IChzaXplICsgMHhGRkYpID4+IDEyOwotICAgIERXT1JEICAgICAgIGZsYWdzID0gUEFHRUZJWEVEIHwgUEFHRVVTRUFMSUdOIHwgKGNvbnRpZ3VvdXMgPyBQQUdFQ09OVElHIDogMCk7Ci0gICAgRFdPUkQgICAgICAgbWF4UGh5cyA9IGJlbG93MTZNID8gMHgwMEZGRkZGRiA6IDB4RkZGRkZGRkY7Ci0gICAgdm9pZCAgICAgICAgKnA7Ci0KLSAgICAvKiBUT0RPOiBUaGlzIG1heSBuZWVkIHRvIGJlIG1vZGlmaWVkIGlmIHRoZSBtZW1vcnkgbmVlZHMgdG8gYmUgZ2xvYmFsbHkgKi8KLSAgICAvKiAgICAgICBhY2Nlc3NpYmxlLiBDaGVjayBob3cgd2UgaW1wbGVtZW50ZWQgUE1fbWFsbG9jU2hhcmVkKCkgYXMgd2UgKi8KLSAgICAvKiAgICAgICBtYXkgbmVlZCB0byBkbyBzb21ldGhpbmcgc2ltaWxhciBpbiBoZXJlLiAqLwotICAgIFBhZ2VBbGxvY2F0ZShuUGFnZXMsUEdfU1lTLDAsMCwwLG1heFBoeXMscGh5c0FkZHIsZmxhZ3MsJmhNZW0sJnApOwotCi0gICAgLyogVE9ETzogV2UgbWF5IG5lZWQgdG8gbW9kaWZ5IHRoZSBtZW1vcnkgYmxvY2tzIHRvIGRpc2FibGUgY2FjaGluZyB2aWEgKi8KLSAgICAvKiAgICAgICB0aGUgcGFnZSB0YWJsZXMgKFBDRHxQV1QpIHNpbmNlIERNQSBtZW1vcnkgYmxvY2tzICpjYW5ub3QqIGJlICovCi0gICAgLyogICAgICAgY2FjaGVkISAqLwotICAgIHJldHVybiBwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZyZWVzIGEgYmxvY2sgb2YgbG9ja2VkIHBoeXNpY2FsIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVMb2NrZWRNZW0oCi0gICAgdm9pZCAqcCwKLSAgICB1aW50IHNpemUsCi0gICAgaWJvb2wgY29udGlndW91cykKLXsKLSAgICBpZiAocCkKLQlQYWdlRnJlZSgodWxvbmcpcCwwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZXMgYSBwYWdlIGFsaWduZWQgYW5kIHBhZ2Ugc2l6ZWQgYmxvY2sgb2YgbWVtb3J5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2FsbG9jUGFnZSgKLSAgICBpYm9vbCBsb2NrZWQpCi17Ci0gICAgTUVNSEFORExFICAgaE1lbTsKLSAgICB2b2lkICAgICAgICAqcDsKLQotICAgIC8qIFRPRE86IFRoaXMgd2lsbCBuZWVkIHRvIGJlIG1vZGlmaWVkIGlmIHRoZSBtZW1vcnkgbmVlZHMgdG8gYmUgZ2xvYmFsbHkgKi8KLSAgICAvKiAgICAgICBhY2Nlc3NpYmxlLiBDaGVjayBob3cgd2UgaW1wbGVtZW50ZWQgUE1fbWFsbG9jU2hhcmVkKCkgYXMgd2UgKi8KLSAgICAvKiAgICAgICBtYXkgbmVlZCB0byBkbyBzb21ldGhpbmcgc2ltaWxhciBpbiBoZXJlLiAqLwotICAgIFBhZ2VBbGxvY2F0ZSgxLFBHX1NZUywwLDAsMCwwLDAsUEFHRUZJWEVELCZoTWVtLCZwKTsKLSAgICByZXR1cm4gcDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GcmVlIGEgcGFnZSBhbGlnbmVkIGFuZCBwYWdlIHNpemVkIGJsb2NrIG9mIG1lbW9yeQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZVBhZ2UoCi0gICAgdm9pZCAqcCkKLXsKLSAgICBpZiAocCkKLQlQYWdlRnJlZSgodWxvbmcpcCwwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Mb2NrIGxpbmVhciBtZW1vcnkgc28gaXQgd29uJ3QgYmUgcGFnZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2xvY2tEYXRhUGFnZXMoCi0gICAgdm9pZCAqcCwKLSAgICB1aW50IGxlbiwKLSAgICBQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBEV09SRCBwZ051bSA9ICh1bG9uZylwID4+IDEyOwotICAgIERXT1JEIG5QYWdlcyA9IChsZW4gKyAodWxvbmcpcCAtIChwZ051bSA8PCAxMikgKyAweEZGRikgPj4gMTI7Ci0gICAgcmV0dXJuIExpblBhZ2VMb2NrKHBnTnVtLG5QYWdlcywwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1VbmxvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fdW5sb2NrRGF0YVBhZ2VzKAotICAgIHZvaWQgKnAsCi0gICAgdWludCBsZW4sCi0gICAgUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgRFdPUkQgcGdOdW0gPSAodWxvbmcpcCA+PiAxMjsKLSAgICBEV09SRCBuUGFnZXMgPSAobGVuICsgKHVsb25nKXAgLSAocGdOdW0gPDwgMTIpICsgMHhGRkYpID4+IDEyOwotICAgIHJldHVybiBMaW5QYWdlVW5Mb2NrKHBnTnVtLG5QYWdlcywwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Mb2NrIGxpbmVhciBtZW1vcnkgc28gaXQgd29uJ3QgYmUgcGFnZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2xvY2tDb2RlUGFnZXMoCi0gICAgdm9pZCAoKnApKCksCi0gICAgdWludCBsZW4sCi0gICAgUE1fbG9ja0hhbmRsZSAqbGgpCi17Ci0gICAgcmV0dXJuIFBNX2xvY2tEYXRhUGFnZXMoKHZvaWQqKXAsbGVuLGxoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1VbmxvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fdW5sb2NrQ29kZVBhZ2VzKAotICAgIHZvaWQgKCpwKSgpLAotICAgIHVpbnQgbGVuLAotICAgIFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIHJldHVybiBQTV91bmxvY2tEYXRhUGFnZXMoKHZvaWQqKXAsbGVuLGxoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIHJlYWwgdGltZSBjbG9jayBmcmVxdWVuY3kgKGZvciBzdGVyZW8gbW9kZXMpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0ZyZXF1ZW5jeSgKLSAgICBpbnQgZnJlcXVlbmN5KQotewotICAgIHN0YXRpYyBzaG9ydCBjb252ZXJ0W10gPSB7Ci0JODE5MiwKLQk0MDk2LAotCTIwNDgsCi0JMTAyNCwKLQk1MTIsCi0JMjU2LAotCTEyOCwKLQk2NCwKLQkzMiwKLQkxNiwKLQk4LAotCTQsCi0JMiwKLQktMSwKLQl9OwotICAgIGludCBpOwotCi0gICAgLyogRmlyc3QgY2xlYXIgYW55IHBlbmRpbmcgUlRDIHRpbWVvdXQgaWYgbm90IGNsZWFyZWQgKi8KLSAgICBfUE1fcmVhZENNT1MoMHgwQyk7Ci0gICAgaWYgKGZyZXF1ZW5jeSA9PSAwKSB7Ci0JLyogRGlzYWJsZSBSVEMgdGltb3V0ICovCi0JX1BNX3dyaXRlQ01PUygweDBBLF9QTV9vbGRDTU9TUmVnQSk7Ci0JX1BNX3dyaXRlQ01PUygweDBCLF9QTV9vbGRDTU9TUmVnQiAmIDB4MEYpOwotCX0KLSAgICBlbHNlIHsKLQkvKiBDb252ZXJ0IGZyZXF1ZW5jeSB2YWx1ZSB0byBSVEMgY2xvY2sgaW5kZXhlcyAqLwotCWZvciAoaSA9IDA7IGNvbnZlcnRbaV0gIT0gLTE7IGkrKykgewotCSAgICBpZiAoY29udmVydFtpXSA9PSBmcmVxdWVuY3kpCi0JCWJyZWFrOwotCSAgICB9Ci0KLQkvKiBTZXQgUlRDIHRpbW91dCB2YWx1ZSBhbmQgZW5hYmxlIHRpbWVvdXQgKi8KLQlfUE1fd3JpdGVDTU9TKDB4MEEsMHgyMCB8IChpKzMpKTsKLQlfUE1fd3JpdGVDTU9TKDB4MEIsKF9QTV9vbGRDTU9TUmVnQiAmIDB4MEYpIHwgMHg0MCk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWwgdGltZSBjbG9jayBpbnRlcnJ1cHQgaGFuZGxlciwgd2hpY2ggY2FsbHMgdGhlIHVzZXIgcmVnaXN0ZXJlZCBDIGNvZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIEJPT0wgX19zdGRjYWxsIFJUQ0ludF9IYW5kbGVyKAotICAgIFZNSEFORExFIGhWTSwKLSAgICBJUlFIQU5ETEUgaElSUSkKLXsKLSAgICBzdGF0aWMgY2hhciBpbnNpZGUgPSAwOwotCi0gICAgLyogQ2xlYXIgcHJpb3JpdHkgaW50ZXJydXB0IGNvbnRyb2xsZXIgYW5kIHJlLWVuYWJsZSBpbnRlcnJ1cHRzIHNvIHdlCi0gICAgICogZG9udCBsb2NrIHRoaW5ncyB1cCBmb3IgbG9uZy4KLSAgICAgKi8KLSAgICBWUElDRF9QaHlzX0VPSShoSVJRKTsKLQotICAgIC8qIENsZWFyIHJlYWwtdGltZSBjbG9jayB0aW1lb3V0ICovCi0gICAgX1BNX3JlYWRDTU9TKDB4MEMpOwotCi0gICAgLyogTm93IGNhbGwgdGhlIEMgYmFzZWQgaW50ZXJydXB0IGhhbmRsZXIgKGJ1dCBjaGVjayBmb3IgbXV0dWFsCi0gICAgICogZXhjbHVzaW9uIHNpbmNlIHdlIG1heSBzdGlsbCBiZSBzZXJ2aWNpbmcgYW4gb2xkIGludGVycnVwdCB3aGVuIGEKLSAgICAgKiBuZXcgb25lIGNvbWVzIGFsb25nOyBpZiB0aGF0IGhhcHBlbnMgd2UgaWdub3JlIHRoZSBvbGQgb25lKS4KLSAgICAgKi8KLSAgICBpZiAoIWluc2lkZSkgewotCWluc2lkZSA9IDE7Ci0JZW5hYmxlKCk7Ci0JX1BNX3J0Y0hhbmRsZXIoKTsKLQlpbnNpZGUgPSAwOwotCX0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIHJlYWwgdGltZSBjbG9jayBoYW5kbGVyICh1c2VkIGZvciBzb2Z0d2FyZSBzdGVyZW8gbW9kZXMpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tIYW5kbGVyKAotICAgIFBNX2ludEhhbmRsZXIgaWgsCi0gICAgaW50IGZyZXF1ZW5jeSkKLXsKLSAgICBzdHJ1Y3QgVlBJQ0RfSVJRX0Rlc2NyaXB0b3IgSVJRZGVzYzsKLQotICAgIC8qIFNhdmUgdGhlIG9sZCBDTU9TIHJlYWwgdGltZSBjbG9jayB2YWx1ZXMgKi8KLSAgICBfUE1fb2xkQ01PU1JlZ0EgPSBfUE1fcmVhZENNT1MoMHgwQSk7Ci0gICAgX1BNX29sZENNT1NSZWdCID0gX1BNX3JlYWRDTU9TKDB4MEIpOwotCi0gICAgLyogU2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgaW50ZXJydXB0IGhhbmRsZXIgKi8KLSAgICBDSEVDSyhpaCAhPSBOVUxMKTsKLSAgICBfUE1fcnRjSGFuZGxlciA9IGloOwotICAgIElSUWRlc2MuVklEX0lSUV9OdW1iZXIgICAgICA9IDB4ODsKLSAgICBJUlFkZXNjLlZJRF9PcHRpb25zICAgICAgICAgPSAwOwotICAgIElSUWRlc2MuVklEX0h3X0ludF9Qcm9jICAgICA9IChEV09SRClWUElDRF9UaHVua19IV0ludChSVENJbnRfSGFuZGxlciwgJlJUQ0ludF9UaHVuayk7Ci0gICAgSVJRZGVzYy5WSURfRU9JX1Byb2MgICAgICAgID0gMDsKLSAgICBJUlFkZXNjLlZJRF9WaXJ0X0ludF9Qcm9jICAgPSAwOwotICAgIElSUWRlc2MuVklEX01hc2tfQ2hhbmdlX1Byb2M9IDA7Ci0gICAgSVJRZGVzYy5WSURfSVJFVF9Qcm9jICAgICAgID0gMDsKLSAgICBJUlFkZXNjLlZJRF9JUkVUX1RpbWVfT3V0ICAgPSA1MDA7Ci0gICAgaWYgKChSVENJUlFIYW5kbGUgPSBWUElDRF9WaXJ0dWFsaXplX0lSUSgmSVJRZGVzYykpID09IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgLyogUHJvZ3JhbSB0aGUgcmVhbCB0aW1lIGNsb2NrIGRlZmF1bHQgZnJlcXVlbmN5ICovCi0gICAgUE1fc2V0UmVhbFRpbWVDbG9ja0ZyZXF1ZW5jeShmcmVxdWVuY3kpOwotCi0gICAgLyogVW5tYXNrIElSUTggaW4gdGhlIFBJQyAqLwotICAgIFZQSUNEX1BoeXNpY2FsbHlfVW5tYXNrKFJUQ0lSUUhhbmRsZSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVzdG9yZSB0aGUgb3JpZ2luYWwgcmVhbCB0aW1lIGNsb2NrIGhhbmRsZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9yZXN0b3JlUmVhbFRpbWVDbG9ja0hhbmRsZXIodm9pZCkKLXsKLSAgICBpZiAoUlRDSVJRSGFuZGxlKSB7Ci0JLyogUmVzdG9yZSBDTU9TIHJlZ2lzdGVycyBhbmQgbWFzayBSVEMgY2xvY2sgKi8KLQlfUE1fd3JpdGVDTU9TKDB4MEEsX1BNX29sZENNT1NSZWdBKTsKLQlfUE1fd3JpdGVDTU9TKDB4MEIsX1BNX29sZENNT1NSZWdCKTsKLQotCS8qIFJlc3RvcmUgdGhlIGludGVycnVwdCB2ZWN0b3IgKi8KLQlWUElDRF9TZXRfQXV0b19NYXNraW5nKFJUQ0lSUUhhbmRsZSk7Ci0JVlBJQ0RfRm9yY2VfRGVmYXVsdF9CZWhhdmlvcihSVENJUlFIYW5kbGUpOwotCVJUQ0lSUUhhbmRsZSA9IDA7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU9TIHNwZWNpZmljIHNoYXJlZCBsaWJyYXJpZXMgbm90IHN1cHBvcnRlZCBpbnNpZGUgYSBWeEQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1QTV9NT0RVTEUgUE1BUEkgUE1fbG9hZExpYnJhcnkoCi0gICAgY29uc3QgY2hhciAqc3pETExOYW1lKQotewotICAgICh2b2lkKXN6RExMTmFtZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1PUyBzcGVjaWZpYyBzaGFyZWQgbGlicmFyaWVzIG5vdCBzdXBwb3J0ZWQgaW5zaWRlIGEgVnhECi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2dldFByb2NBZGRyZXNzKAotICAgIFBNX01PRFVMRSBoTW9kdWxlLAotICAgIGNvbnN0IGNoYXIgKnN6UHJvY05hbWUpCi17Ci0gICAgKHZvaWQpaE1vZHVsZTsKLSAgICAodm9pZClzelByb2NOYW1lOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLU9TIHNwZWNpZmljIHNoYXJlZCBsaWJyYXJpZXMgbm90IHN1cHBvcnRlZCBpbnNpZGUgYSBWeEQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZyZWVMaWJyYXJ5KAotICAgIFBNX01PRFVMRSBoTW9kdWxlKQotewotICAgICh2b2lkKWhNb2R1bGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZmluZCB0aGUgZmlyc3QgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICpQTUFQSSBQTV9maW5kRmlyc3RGaWxlKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBzdGFydCBhIGRpcmVjdG9yeSBlbnVtZXJhdGlvbiBzZWFyY2ggKi8KLSAgICAvKiAgICAgICBnaXZlbiB0aGUgZmlsZW5hbWUgKHdpdGggd2lsZGNhcmRzKS4gVGhlIGRhdGEgc2hvdWxkIGJlICovCi0gICAgLyogICAgICAgY29udmVydGVkIGFuZCByZXR1cm5lZCBpbiB0aGUgZmluZERhdGEgc3RhbmRhcmQgZm9ybS4gKi8KLSAgICAodm9pZClmaWxlbmFtZTsKLSAgICAodm9pZClmaW5kRGF0YTsKLSAgICByZXR1cm4gUE1fRklMRV9JTlZBTElEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGZpbmQgdGhlIG5leHQgZmlsZSBtYXRjaGluZyBhIHNlYXJjaCBjcml0ZXJpYSBpbiBhIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9maW5kTmV4dEZpbGUoCi0gICAgdm9pZCAqaGFuZGxlLAotICAgIFBNX2ZpbmREYXRhICpmaW5kRGF0YSkKLXsKLSAgICAvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBmaW5kIHRoZSBuZXh0IGZpbGUgaW4gZGlyZWN0b3J5IGVudW1lcmF0aW9uICovCi0gICAgLyogICAgICAgc2VhcmNoIGdpdmVuIHRoZSBzZWFyY2ggY3JpdGVyaWEgZGVmaW5lZCBpbiB0aGUgY2FsbCB0byAqLwotICAgIC8qICAgICAgIFBNX2ZpbmRGaXJzdEZpbGUuIFRoZSBkYXRhIHNob3VsZCBiZSBjb252ZXJ0ZWQgYW5kIHJldHVybmVkICovCi0gICAgLyogICAgICAgaW4gdGhlIGZpbmREYXRhIHN0YW5kYXJkIGZvcm0uICovCi0gICAgKHZvaWQpaGFuZGxlOwotICAgICh2b2lkKWZpbmREYXRhOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjbG9zZSB0aGUgZmluZCBwcm9jZXNzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9maW5kQ2xvc2UoCi0gICAgdm9pZCAqaGFuZGxlKQotewotICAgIC8qIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGNsb3NlIHRoZSBmaW5kIHByb2Nlc3MuIFRoaXMgbWF5IGRvICovCi0gICAgLyogICAgICAgbm90aGluZyBmb3Igc29tZSBPUydlcy4gKi8KLSAgICAodm9pZCloYW5kbGU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIGEgZHJpdmUgaXMgYSB2YWxpZCBkcml2ZSBvciBub3QuIFVuZGVyIFVuaXggdGhpcwotZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UgZm9yIGFueXRoaW5nIGV4Y2VwdCBhIHZhbHVlIG9mIDMgKGNvbnNpZGVyZWQKLXRoZSByb290IGRyaXZlLCBhbmQgZXF1aXZhbGVudCB0byBDOiBmb3Igbm9uLVVuaXggc3lzdGVtcykuIFRoZSBkcml2ZQotbnVtYmVyaW5nIGlzOgotCi0gICAgMSAgIC0gRHJpdmUgQToKLSAgICAyICAgLSBEcml2ZSBCOgotICAgIDMgICAtIERyaXZlIEM6Ci0gICAgZXRjCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9kcml2ZVZhbGlkKAotICAgIGNoYXIgZHJpdmUpCi17Ci0gICAgLyogTm90IHN1cHBvcnRlZCBpbiBhIFZ4RCAqLwotICAgICh2b2lkKWRyaXZlOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSBzcGVjaWZpZmVkIGRyaXZlLgotVW5kZXIgVW5peCB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSByZWdhcmRsZXNzCi1vZiB3aGF0IHRoZSB2YWx1ZSBvZiAnZHJpdmUnIGlzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZ2V0ZGN3ZCgKLSAgICBpbnQgZHJpdmUsCi0gICAgY2hhciAqZGlyLAotICAgIGludCBsZW4pCi17Ci0gICAgLyogTm90IHN1cHBvcnRlZCBpbiBhIFZ4RCAqLwotICAgICh2b2lkKWRyaXZlOwotICAgICh2b2lkKWRpcjsKLSAgICAodm9pZClsZW47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYmFzZSAgICAtIFRoZSBzdGFydGluZyBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgotc2l6ZSAgICAtIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZWdpb24KLXR5cGUgICAgLSBUeXBlIHRvIHBsYWNlIGludG8gdGhlIE1UUlIgcmVnaXN0ZXIKLQotUkVUVVJOUzoKLUVycm9yIGNvZGUgZGVzY3JpYmluZyB0aGUgcmVzdWx0LgotCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZW5hYmxlIHdyaXRlIGNvbWJpbmluZyBmb3IgdGhlIHNwZWNpZmllZCByZWdpb24gb2YgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9lbmFibGVXcml0ZUNvbWJpbmUoCi0gICAgdWxvbmcgYmFzZSwKLSAgICB1bG9uZyBzaXplLAotICAgIHVpbnQgdHlwZSkKLXsKLSAgICByZXR1cm4gTVRSUl9lbmFibGVXcml0ZUNvbWJpbmUoYmFzZSxzaXplLHR5cGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGNoYW5nZSB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRGaWxlQXR0cigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICB1aW50IGF0dHJpYikKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgICh2b2lkKWF0dHJpYjsKLSAgICBQTV9mYXRhbEVycm9yKCJQTV9zZXRGaWxlQXR0ciBub3QgaW1wbGVtZW50ZWQgeWV0ISIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGdldCB0aGUgZmlsZSBhdHRyaWJ1dGVzIGZvciBhIHNwZWNpZmljIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWludCBQTUFQSSBQTV9nZXRGaWxlQXR0cigKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgIFBNX2ZhdGFsRXJyb3IoIlBNX2dldEZpbGVBdHRyIG5vdCBpbXBsZW1lbnRlZCB5ZXQhIik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gY3JlYXRlIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX21rZGlyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzICovCi0gICAgKHZvaWQpZmlsZW5hbWU7Ci0gICAgUE1fZmF0YWxFcnJvcigiUE1fbWtkaXIgbm90IGltcGxlbWVudGVkIHlldCEiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gcmVtb3ZlIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX3JtZGlyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzICovCi0gICAgKHZvaWQpZmlsZW5hbWU7Ci0gICAgUE1fZmF0YWxFcnJvcigiUE1fcm1kaXIgbm90IGltcGxlbWVudGVkIHlldCEiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZ2V0IHRoZSBmaWxlIHRpbWUgYW5kIGRhdGUgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9nZXRGaWxlVGltZSgKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICBpYm9vbCBnbVRpbWUsCi0gICAgUE1fdGltZSAqdGltZSkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgdGhpcyEgKi8KLSAgICAodm9pZClmaWxlbmFtZTsKLSAgICAodm9pZClnbVRpbWU7Ci0gICAgKHZvaWQpdGltZTsKLSAgICBQTV9mYXRhbEVycm9yKCJQTV9nZXRGaWxlVGltZSBub3QgaW1wbGVtZW50ZWQgeWV0ISIpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBzZXQgdGhlIGZpbGUgdGltZSBhbmQgZGF0ZSBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX3NldEZpbGVUaW1lKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIGlib29sIGdtVGltZSwKLSAgICBQTV90aW1lICp0aW1lKQotewotICAgIC8qIFRPRE86IEltcGxlbWVudCB0aGlzISAqLwotICAgICh2b2lkKWZpbGVuYW1lOwotICAgICh2b2lkKWdtVGltZTsKLSAgICAodm9pZCl0aW1lOwotICAgIFBNX2ZhdGFsRXJyb3IoIlBNX3NldEZpbGVUaW1lIG5vdCBpbXBsZW1lbnRlZCB5ZXQhIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vdnhkL3ZmbGF0LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92eGQvdmZsYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAxY2UxYy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92eGQvdmZsYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIEFueQotKgotKiBEZXNjcmlwdGlvbjogIER1bW15IG1vZHVsZTsgbm8gdmlydHVhbCBmcmFtZWJ1ZmZlciBmb3IgdGhpcyBPUwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInBtYXBpLmgiCi0KLWlib29sIFBNQVBJIFZGX2F2YWlsYWJsZSh2b2lkKQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCAqIFBNQVBJIFZGX2luaXQodWxvbmcgYmFzZUFkZHIsaW50IGJhbmtTaXplLGludCBjb2RlTGVuLHZvaWQgKmJhbmtGdW5jKQotewotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFZGX2V4aXQodm9pZCkKLXsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Z4ZC96dGltZXIuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3Z4ZC96dGltZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZkZjQ4Yy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS92eGQvenRpbWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgMzItYml0IFdpbmRvd3MgVnhECi0qCi0qIERlc2NyaXB0aW9uOiAgT1Mgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBaZW4gVGltZXIgZnVuY3Rpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHVsb25nICAgIGZyZXF1ZW5jeSA9IDExOTMxODA7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW5pdGlhbGlzZSB0aGUgWmVuIFRpbWVyIG1vZHVsZSBpbnRlcm5hbHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfX1pUaW1lckluaXQoKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfX0xaVGltZXJPbih0bSkgICAgIFZURF9HZXRfUmVhbF9UaW1lKCZ0bS0+c3RhcnQuaGlnaCwmdG0tPnN0YXJ0LmxvdykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBhc3NlbWJsZXIgWmVuIFRpbWVyIGZ1bmN0aW9ucyB0byBkbyB0aGUgdGltaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfX0xaVGltZXJMYXAoCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0gICAgQ1BVX2xhcmdlSW50ZWdlciAgICBsYXAsY291bnQ7Ci0gICAgVlREX0dldF9SZWFsX1RpbWUoJmxhcC5oaWdoLCZsYXAubG93KTsKLSAgICBfQ1BVX2RpZmZUaW1lNjQoJnRtLT5zdGFydCwmbGFwLCZjb3VudCk7Ci0gICAgcmV0dXJuIF9DUFVfY2FsY01pY3JvU2VjKCZjb3VudCxmcmVxdWVuY3kpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfX0xaVGltZXJPZmYodG0pICAgIFZURF9HZXRfUmVhbF9UaW1lKCZ0bS0+ZW5kLmhpZ2gsJnRtLT5lbmQubG93KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIGFzc2VtYmxlciBaZW4gVGltZXIgZnVuY3Rpb25zIHRvIGRvIHRoZSB0aW1pbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVsb25nIF9fTFpUaW1lckNvdW50KAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotICAgIENQVV9sYXJnZUludGVnZXIgdG1Db3VudDsKLSAgICBfQ1BVX2RpZmZUaW1lNjQoJnRtLT5zdGFydCwmdG0tPmVuZCwmdG1Db3VudCk7Ci0gICAgcmV0dXJuIF9DUFVfY2FsY01pY3JvU2VjKCZ0bUNvdW50LGZyZXF1ZW5jeSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRGVmaW5lIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBsb25nIHBlcmlvZCB0aW1lciBhcyBtaWNyb3NlY29uZHMgcGVyIHRpbWVyIHRpY2suCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBVTFpUSU1FUl9SRVNPTFVUSU9OICAgICAxMDAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVhZCB0aGUgTG9uZyBQZXJpb2QgdGltZXIgdmFsdWUgZnJvbSB0aGUgQklPUyB0aW1lciB0aWNrLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfX1VMWlJlYWRUaW1lKHZvaWQpCi17Ci0gICAgQ1BVX2xhcmdlSW50ZWdlciBjb3VudDsKLSAgICBWVERfR2V0X1JlYWxfVGltZSgmY291bnQuaGlnaCwmY291bnQubG93KTsKLSAgICByZXR1cm4gKGNvdW50LmxvdyAqIDEwMDAuMCAvIGZyZXF1ZW5jeSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29tcHV0ZSB0aGUgZWxhcHNlZCB0aW1lIGZyb20gdGhlIEJJT1MgdGltZXIgdGljay4gTm90ZSB0aGF0IHdlIGNoZWNrIHRvIHNlZQotd2hldGhlciBhIG1pZG5pZ2h0IGJvdW5kYXJ5IGhhcyBwYXNzZWQsIGFuZCBpZiBzbyBhZGp1c3QgdGhlIGZpbmlzaCB0aW1lIHRvCi1hY2NvdW50IGZvciB0aGlzLiBXZSBjYW5ub3QgZGV0ZWN0IGlmIG1vcmUgdGhhdCBvbmUgbWlkbmlnaHQgYm91bmRhcnkgaGFzCi1wYXNzZWQsIHNvIGlmIHRoaXMgaGFwcGVucyB3ZSB3aWxsIGJlIGdlbmVyYXRpbmcgZXJyb25vdXMgcmVzdWx0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfX1VMWkVsYXBzZWRUaW1lKHVsb25nIHN0YXJ0LHVsb25nIGZpbmlzaCkKLXsgcmV0dXJuIGZpbmlzaCAtIHN0YXJ0OyB9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi9fcG13aW4zMi5hc20gYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi9fcG13aW4zMi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMjQyYjUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvX3Btd2luMzIuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqCi07KiAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci07KgotOyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOyoKLTsqICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotOyogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLTsqICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotOyogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci07KgotOyogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLTsqICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi07KiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLTsqICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07KgotOyogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotOyoKLTsqICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi07KiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotOyoKLTsqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsqCi07KiBMYW5ndWFnZTogICAgODAzODYgQXNzZW1ibGVyLCBUQVNNIDQuMCBvciBOQVNNCi07KiBFbnZpcm9ubWVudDogV2luMzIKLTsqCi07KiBEZXNjcmlwdGlvbjogTG93IGxldmVsIGFzc2VtYmx5IHN1cHBvcnQgZm9yIHRoZSBQTSBsaWJyYXJ5IHNwZWNpZmljCi07KiAgICAgICAgICAgICAgdG8gV2luZG93cy4KLTsqCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIElERUFMCi0KLWluY2x1ZGUgInNjaXRlY2gubWFjIiAgICAgICAgICAgICAgIDsgTWVtb3J5IG1vZGVsIG1hY3JvcwotCi1oZWFkZXIgICAgICBfcG13aW4zMiAgICAgICAgICAgICAgICAgICAgOyBTZXQgdXAgbWVtb3J5IG1vZGVsCi0KLWJlZ2RhdGFzZWcgIF9wbXdpbjMyCi0KLSAgICAgICAgY2dsb2JhbCBfUE1faW9lbnRyeQotICAgICAgICBjZ2xvYmFsIF9QTV9nZHQKLV9QTV9pb2VudHJ5ICAgICBkZCAgMCAgICAgICAgICAgICAgIDsgT2Zmc2V0IHRvIGNhbGwgZ2F0ZQotX1BNX2dkdCAgICAgICAgIGR3ICAwICAgICAgICAgICAgICAgOyBTZWxlY3RvciB0byBjYWxsIGdhdGUKLQotZW5kZGF0YXNlZyAgX3Btd2luMzIKLQotYmVnY29kZXNlZyAgX3Btd2luMzIgICAgICAgICAgICAgICAgICAgIDsgU3RhcnQgb2YgY29kZSBzZWdtZW50Ci0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IGludCBQTV9zZXRJT1BMKGludCBpb3BsKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ2hhbmdlIHRoZSBJT1BMIGxldmVsIGZvciB0aGUgMzItYml0IHRhc2suIFJldHVybnMgdGhlIHByZXZpb3VzIGxldmVsCi07IHNvIGl0IGNhbiBiZSByZXN0b3JlZCBmb3IgdGhlIHRhc2sgY29ycmVjdGx5LgotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNwcm9jc3RhcnQgIF9QTV9zZXRJT1BMVmlhQ2FsbEdhdGUKLQotICAgICAgICBBUkcgICAgIGlvcGw6VUlOVAotCi0gICAgICAgIGVudGVyX2MKLSAgICAgICAgcHVzaGZkICAgICAgICAgICAgICAgICAgICAgIDsgU2F2ZSB0aGUgb2xkIEVGTEFHUyBmb3IgbGF0ZXIKLSAgICAgICAgbW92ICAgICBlY3gsW2lvcGxdICAgICAgICAgIDsgRUNYIDo9IElPUEwgbGV2ZWwKLSAgICAgICAgeG9yICAgICBlYngsZWJ4ICAgICAgICAgICAgIDsgQ2hhbmdlIElPUEwgbGV2ZWwgZnVuY3Rpb24gY29kZQotaWZkZWYgICBVU0VfTkFTTQotICAgICAgICBjYWxsIGZhciBkd29yZCBbX1BNX2lvZW50cnldCi1lbHNlCi0gICAgICAgIGNhbGwgICAgW0ZXT1JEIF9QTV9pb2VudHJ5XQotZW5kaWYKLSAgICAgICAgcG9wICAgICBlYXgKLSAgICAgICAgYW5kICAgICBlYXgsMDAxMTAwMDAwMDAwMDAwMGIKLSAgICAgICAgc2hyICAgICBlYXgsMTIKLSAgICAgICAgbGVhdmVfYwotICAgICAgICByZXQKLQotY3Byb2NlbmQKLQotZW5kY29kZXNlZyAgX3Btd2luMzIKLQotICAgICAgICBFTkQgICAgICAgICAgICAgICAgICAgICAgICAgOyBFbmQgb2YgbW9kdWxlCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi9jcHVpbmZvLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi9jcHVpbmZvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYTk3NTIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvY3B1aW5mby5jCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgV2luMzIKLSoKLSogRGVzY3JpcHRpb246ICBNb2R1bGUgdG8gaW1wbGVtZW50IE9TIHNwZWNpZmljIHNlcnZpY2VzIHRvIG1lYXN1cmUgdGhlCi0qICAgICAgICAgICAgICAgQ1BVIGZyZXF1ZW5jeS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpYm9vbCBoYXZlUGVyZm9ybWFuY2VDb3VudGVyOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluY3JlYXNlIHRoZSB0aHJlYWQgcHJpb3JpdHkgdG8gbWF4aW11bSwgaWYgcG9zc2libGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBTZXRNYXhUaHJlYWRQcmlvcml0eSh2b2lkKQotewotICAgIGludCAgICAgb2xkUHJpb3JpdHk7Ci0gICAgSEFORExFICBoVGhyZWFkID0gR2V0Q3VycmVudFRocmVhZCgpOwotCi0gICAgb2xkUHJpb3JpdHkgPSBHZXRUaHJlYWRQcmlvcml0eShoVGhyZWFkKTsKLSAgICBpZiAob2xkUHJpb3JpdHkgIT0gVEhSRUFEX1BSSU9SSVRZX0VSUk9SX1JFVFVSTikKLQlTZXRUaHJlYWRQcmlvcml0eShoVGhyZWFkLCBUSFJFQURfUFJJT1JJVFlfVElNRV9DUklUSUNBTCk7Ci0gICAgcmV0dXJuIG9sZFByaW9yaXR5OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlc3RvcmUgdGhlIG9yaWdpbmFsIHRocmVhZCBwcmlvcml0eS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBSZXN0b3JlVGhyZWFkUHJpb3JpdHkoCi0gICAgaW50IG9sZFByaW9yaXR5KQotewotICAgIEhBTkRMRSAgaFRocmVhZCA9IEdldEN1cnJlbnRUaHJlYWQoKTsKLQotICAgIGlmIChvbGRQcmlvcml0eSAhPSBUSFJFQURfUFJJT1JJVFlfRVJST1JfUkVUVVJOKQotCVNldFRocmVhZFByaW9yaXR5KGhUaHJlYWQsIG9sZFByaW9yaXR5KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFsaXNlIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGZyZXF1ZW5jeSBvZiB0aGUgY291bnRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBHZXRDb3VudGVyRnJlcXVlbmN5KAotICAgIENQVV9sYXJnZUludGVnZXIgKmZyZXEpCi17Ci0gICAgaWYgKCFRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KChMQVJHRV9JTlRFR0VSKilmcmVxKSkgewotCWhhdmVQZXJmb3JtYW5jZUNvdW50ZXIgPSBmYWxzZTsKLQlmcmVxLT5sb3cgPSAxMDAwMDA7Ci0JZnJlcS0+aGlnaCA9IDA7Ci0JfQotICAgIGVsc2UKLQloYXZlUGVyZm9ybWFuY2VDb3VudGVyID0gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIHRoZSBjb3VudGVyIGFuZCByZXR1cm4gdGhlIGNvdW50ZXIgdmFsdWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBHZXRDb3VudGVyKHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChoYXZlUGVyZm9ybWFuY2VDb3VudGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKChMQVJHRV9JTlRFR0VSKil0KTsgICAgICAgICBcCi0gICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JKHQpLT5sb3cgPSB0aW1lR2V0VGltZSgpICogMTAwOyAgICAgICAgICAgICAgICAgICAgIFwKLQkodCktPmhpZ2ggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi9kZHJhdy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvZGRyYXcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZjM2Y2MC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi9kZHJhdy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggTXVsdGktcGxhdGZvcm0gR3JhcGhpY3MgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBXaW4zMgotKgotKiBEZXNjcmlwdGlvbjogIFdpbjMyIGltcGxlbWVudGF0aW9uIGZvciB0aGUgU2NpVGVjaCBjcm9zcyBwbGF0Zm9ybQotKiAgICAgICAgICAgICAgIGV2ZW50IGxpYnJhcnkuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiZXZlbnQuaCIKLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgIndpbjMyL29zaGRyLmgiCi0jaW5jbHVkZSAibnVjbGV1cy9ncmFwaGljcy5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBQdWJsaWNseSBhY2Nlc3NpYmxlIHZhcmlhYmxlcyAqLwotCi1pbnQgICAgICAgICAgICAgICAgIF9QTV9kZXNrWCxfUE1fZGVza1k7LyogRGVza3RvcCBkaW1lbnRpb25zICAgICAgICAgICAqLwotSFdORCAgICAgICAgICAgICAgICBfUE1faHduZENvbnNvbGU7ICAgIC8qIFdpbmRvdyBoYW5kbGUgZm9yIGNvbnNvbGUgICAgKi8KLSNpZmRlZiAgX19JTlRFTF9fCi11aW50ICAgICAgICAgICAgICAgIF9QTV9jd19kZWZhdWx0OyAgICAgLyogRGVmYXVsdCBGUFUgY29udHJvbCB3b3JkICAgICAqLwotI2VuZGlmCi0KLS8qIFByaXZhdGUgaW50ZXJuYWwgdmFyaWFibGVzICovCi0KLXN0YXRpYyBISU5TVEFOQ0UgICAgaEluc3RBcHAgPSBOVUxMOy8qIEFwcGxpY2F0aW9uIGluc3RhbmNlIGhhbmRsZSAgICAgICovCi1zdGF0aWMgSFdORCAgICAgICAgIGh3bmRVc2VyID0gTlVMTDsvKiBVc2VyIHdpbmRvdyBoYW5kbGUgICAgICAgICAgICAgICAqLwotc3RhdGljIEhJTlNUQU5DRSAgICBoSW5zdEREID0gTlVMTDsgLyogSGFuZGxlIHRvIERpcmVjdERyYXcgRExMICAgICAgICAgKi8KLXN0YXRpYyBMUERJUkVDVERSQVcgbHBERCA9IE5VTEw7ICAgIC8qIERpcmVjdERyYXcgb2JqZWN0ICAgICAgICAgICAgICAgICovCi1zdGF0aWMgTE9ORyAgICAgICAgIG9sZFduZFN0eWxlOyAgICAvKiBJbmZvIGFib3V0IG9sZCB1c2VyIHdpbmRvdyAgICAgICAqLwotc3RhdGljIExPTkcgICAgICAgICBvbGRFeFduZFN0eWxlOyAgLyogSW5mbyBhYm91dCBvbGQgdXNlciB3aW5kb3cgICAgICAgKi8KLXN0YXRpYyBpbnQgICAgICAgICAgb2xkV2luUG9zWDsgICAgIC8qIE9sZCB3aW5kb3cgcG9zaXRpb24gWCBjb29yZGluYXRlICovCi1zdGF0aWMgaW50ICAgICAgICAgIG9sZFdpblBvc1k7ICAgICAvKiBPbGQgd2luZG93IHBpc2l0aW9uIFkgY29vcmRpbmF0ZSAqLwotc3RhdGljIGludCAgICAgICAgICBvbGRXaW5TaXplWDsgICAgLyogT2xkIHdpbmRvdyBzaXplIFggICAgICAgICAgICAgICAgKi8KLXN0YXRpYyBpbnQgICAgICAgICAgb2xkV2luU2l6ZVk7ICAgIC8qIE9sZCB3aW5kb3cgc2l6ZSBZICAgICAgICAgICAgICAgICovCi1zdGF0aWMgV05EUFJPQyAgICAgIG9sZFdpblByb2MgPSBOVUxMOwotc3RhdGljIFBNX3NhdmVTdGF0ZV9jYiBzdXNwZW5kQXBwID0gTlVMTDsKLXN0YXRpYyBpYm9vbCAgICAgICAgd2FpdEFjdGl2ZSA9IGZhbHNlOwotc3RhdGljIGlib29sICAgICAgICBpc0Z1bGxTY3JlZW4gPSBmYWxzZTsKLXN0YXRpYyBpYm9vbCAgICAgICAgYmFja0luR0RJID0gZmFsc2U7Ci0KLS8qIEludGVybmFsIHN0cmluZ3MgKi8KLQotc3RhdGljIGNoYXIgKnN6V2luQ2xhc3NOYW1lICAgICA9ICJTY2lUZWNoRGlyZWN0RHJhd1dpbmRvdyI7Ci1zdGF0aWMgY2hhciAqc3pBdXRvUGxheUtleSAgICAgID0gIlNvZnR3YXJlXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxQb2xpY2llc1xcRXhwbG9yZXIiOwotc3RhdGljIGNoYXIgKnN6QXV0b1BsYXlWYWx1ZSAgICA9ICJOb0RyaXZlVHlwZUF1dG9SdW4iOwotCi0vKiBEeW5hbGlua3MgdG8gRGlyZWN0RHJhdyBmdW5jdGlvbnMgKi8KLQotc3RhdGljIEhSRVNVTFQgKFdJTkFQSSAqcERpcmVjdERyYXdDcmVhdGUpKEdVSUQgRkFSICpscEdVSUQsIExQRElSRUNURFJBVyBGQVIgKmxwbHBERCwgSVVua25vd24gRkFSICpwVW5rT3V0ZXIpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRlbXBvcmFyaWx5IGRpc2FibGVzIEF1dG9QbGF5IG9wZXJhdGlvbiB3aGlsZSB3ZSBhcmUgcnVubmluZyBpbiBmdWxsc2NyZWVuCi1ncmFwaGljcyBtb2Rlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBEaXNhYmxlQXV0b1BsYXkodm9pZCkKLXsKLSAgICBEV09SRCAgIGR3QXV0b1BsYXksZHdTaXplID0gc2l6ZW9mKGR3QXV0b1BsYXkpOwotICAgIEhLRVkgICAgaEtleTsKLQotICAgIGlmIChSZWdPcGVuS2V5RXgoSEtFWV9DVVJSRU5UX1VTRVIsc3pBdXRvUGxheUtleSwwLEtFWV9FWEVDVVRFIHwgS0VZX1dSSVRFLCZoS2V5KSA9PSBFUlJPUl9TVUNDRVNTKSB7Ci0JUmVnUXVlcnlWYWx1ZUV4KGhLZXksc3pBdXRvUGxheVZhbHVlLE5VTEwsTlVMTCwodm9pZCopJmR3QXV0b1BsYXksJmR3U2l6ZSk7Ci0JZHdBdXRvUGxheSB8PSBBVVRPUExBWV9EUklWRV9DRFJPTTsKLQlSZWdTZXRWYWx1ZUV4KGhLZXksc3pBdXRvUGxheVZhbHVlLDAsUkVHX0RXT1JELCh2b2lkKikmZHdBdXRvUGxheSxkd1NpemUpOwotCVJlZ0Nsb3NlS2V5KGhLZXkpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZS1lbmFibGVzIEF1dG9QbGF5IG9wZXJhdGlvbiB3aGVuIHdlIHJldHVybiB0byByZWd1bGFyIEdESSBtb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIFJlc3RvcmVBdXRvUGxheSh2b2lkKQotewotICAgIERXT1JEICAgZHdBdXRvUGxheSxkd1NpemUgPSBzaXplb2YoZHdBdXRvUGxheSk7Ci0gICAgSEtFWSAgICBoS2V5OwotCi0gICAgaWYgKFJlZ09wZW5LZXlFeChIS0VZX0NVUlJFTlRfVVNFUixzekF1dG9QbGF5S2V5LDAsS0VZX0VYRUNVVEUgfCBLRVlfV1JJVEUsJmhLZXkpID09IEVSUk9SX1NVQ0NFU1MpIHsKLQlSZWdRdWVyeVZhbHVlRXgoaEtleSxzekF1dG9QbGF5VmFsdWUsTlVMTCxOVUxMLCh2b2lkKikmZHdBdXRvUGxheSwmZHdTaXplKTsKLQlkd0F1dG9QbGF5ICY9IH5BVVRPUExBWV9EUklWRV9DRFJPTTsKLQlSZWdTZXRWYWx1ZUV4KGhLZXksc3pBdXRvUGxheVZhbHVlLDAsUkVHX0RXT1JELCh2b2lkKikmZHdBdXRvUGxheSxkd1NpemUpOwotCVJlZ0Nsb3NlS2V5KGhLZXkpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TdXNwZW5kcyB0aGUgYXBwbGljYXRpb24gYnkgc3dpdGNoaW5nIGJhY2sgdG8gdGhlIEdESSBkZXNrdG9wLCBhbGxvd2luZwotbm9ybWFsIGFwcGxpY2F0aW9uIGNvZGUgdG8gYmUgcHJvY2Vzc2VkLCBhbmQgdGhlbiB3YWl0aW5nIGZvciB0aGUKLWFwcGxpY2F0aW9uIGFjdGl2YXRlIGNvbW1hbmQgdG8gYnJpbmcgdXMgYmFjayB0byBmdWxsc2NyZWVuIG1vZGUgd2l0aCBvdXIKLXdpbmRvdyBtaW5pbWlzZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgTGVhdmVGdWxsU2NyZWVuKHZvaWQpCi17Ci0gICAgaW50IHJldENvZGUgPSBQTV9TVVNQRU5EX0FQUDsKLQotICAgIGlmIChiYWNrSW5HREkpCi0JcmV0dXJuOwotICAgIGlmIChzdXNwZW5kQXBwKQotCXJldENvZGUgPSBzdXNwZW5kQXBwKFBNX0RFQUNUSVZBVEUpOwotICAgIFJlc3RvcmVBdXRvUGxheSgpOwotICAgIGJhY2tJbkdESSA9IHRydWU7Ci0KLSAgICAvKiBOb3cgcHJvY2VzcyBtZXNzYWdlcyBub3JtYWxseSB1bnRpbCB3ZSBhcmUgcmUtYWN0aXZhdGVkICovCi0gICAgd2FpdEFjdGl2ZSA9IHRydWU7Ci0gICAgaWYgKHJldENvZGUgIT0gUE1fTk9fU1VTUEVORF9BUFApIHsKLQl3aGlsZSAod2FpdEFjdGl2ZSkgewotCSAgICBfRVZUX3B1bXBNZXNzYWdlcygpOwotCSAgICBTbGVlcCgyMDApOwotCSAgICB9Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlYWN0aXZhdGUgYWxsIHRoZSBzdXJmYWNlcyBmb3IgRGlyZWN0RHJhdyBhbmQgc2V0IHRoZSBzeXN0ZW0gYmFjayB1cCBmb3IKLWZ1bGxzY3JlZW4gcmVuZGVyaW5nLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIFJlc3RvcmVGdWxsU2NyZWVuKHZvaWQpCi17Ci0gICAgc3RhdGljIGlib29sICAgIGZpcnN0VGltZSA9IHRydWU7Ci0KLSAgICBpZiAoZmlyc3RUaW1lKSB7Ci0JLyogQ2xlYXIgdGhlIG1lc3NhZ2UgcXVldWUgd2hpbGUgd2FpdGluZyBmb3IgdGhlIHN1cmZhY2VzIHRvIGJlCi0JICogcmVzdG9yZWQuCi0JICovCi0JZmlyc3RUaW1lID0gZmFsc2U7Ci0Jd2hpbGUgKDEpIHsKLQkgICAgLyogQ29udGludWUgbG9vcGluZyB1bnRpbCBvdXQgYXBwbGljYXRpb24gaGFzIGJlZW4gcmVzdG9yZWQKLQkgICAgICogYW5kIHdlIGhhdmUgcmVzZXQgdGhlIGRpc3BsYXkgbW9kZS4KLQkgICAgICovCi0JICAgIF9FVlRfcHVtcE1lc3NhZ2VzKCk7Ci0JICAgIGlmIChHZXRBY3RpdmVXaW5kb3coKSA9PSBfUE1faHduZENvbnNvbGUpIHsKLQkJaWYgKHN1c3BlbmRBcHApCi0JCSAgICBzdXNwZW5kQXBwKFBNX1JFQUNUSVZBVEUpOwotCQlEaXNhYmxlQXV0b1BsYXkoKTsKLQkJYmFja0luR0RJID0gZmFsc2U7Ci0JCXdhaXRBY3RpdmUgPSBmYWxzZTsKLQkJZmlyc3RUaW1lID0gdHJ1ZTsKLQkJcmV0dXJuOwotCQl9Ci0JICAgIFNsZWVwKDIwMCk7Ci0JICAgIH0KLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBzdXNwZW5kcyB0aGUgYXBwbGljYXRpb24gYnkgc3dpdGNoaW5nIGJhY2sgdG8gdGhlIEdESSBkZXNrdG9wLAotYWxsb3dpbmcgbm9ybWFsIGFwcGxpY2F0aW9uIGNvZGUgdG8gYmUgcHJvY2Vzc2VkIGFuZCB0aGVuIHdhaXRpbmcgZm9yIHRoZQotYXBwbGljYXRpb24gYWN0aXZhdGUgY29tbWFuZCB0byBicmluZyB1cyBiYWNrIHRvIGZ1bGxzY3JlZW4gbW9kZSB3aXRoIG91cgotd2luZG93IG1pbmltaXNlZC4KLQotVGhpcyB2ZXJzaW9uIG9ubHkgZ2V0cyBjYWxsZWQgaWYgd2UgaGF2ZSBub3QgY2FwdHVyZWQgdGhlIHNjcmVlbiBzd2l0Y2ggaW4KLW91ciBhY3RpdmF0ZSBtZXNzYWdlIGxvb3BzIGFuZCB3aWxsIG9jY3VyIGlmIHRoZSBEaXJlY3REcmF3IGRyaXZlcnMgbG9zZSBhCi1zdXJmYWNlIGZvciBzb21lIHJlYXNvbiB3aGlsZSByZW5kZXJpbmcuIFRoaXMgc2hvdWxkIG5vdCBub3JtYWxseSBoYXBwZW4sCi1idXQgaXQgaXMgaW5jbHVkZWQganVzdCB0byBiZSBzdXJlIChpdCBjYW4gaGFwcGVuIG9uIFdpbk5ULzIwMDAgaWYgdGhlIHVzZXIKLWhpdHMgdGhlIEN0cmwtQWx0LURlbCBrZXkgY29tYmluYXRpb24pLiBOb3RlIHRoYXQgdGhpcyBjb2RlIHdpbGwgYWx3YXlzCi1zcGluIGxvb3AsIGFuZCB3ZSBjYW5ub3QgZGlzYWJsZSB0aGUgc3BpbiBsb29waW5nIGZyb20gdGhpcyB2ZXJzaW9uIChpZToKLWlmIHRoZSB1c2VyIGhpdHMgQ3RybC1BbHQtRGVsIHVuZGVyIFdpbk5ULzIwMDAgdGhlIGFwcGxpY2F0aW9uIG1haW4gbG9vcAotd2lsbCBjZWFzZSB0byBiZSBleGVjdXRlZCB1bnRpbCB0aGUgdXNlciBzd2l0Y2hlcyBiYWNrIHRvIHRoZSBhcHBsaWNhdGlvbikuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9kb1N1c3BlbmRBcHAodm9pZCkKLXsKLSAgICBzdGF0aWMgIGlib29sIGZpcnN0VGltZSA9IHRydWU7Ci0KLSAgICAvKiBDYWxsIHN5c3RlbSBETEwgdmVyc2lvbiBpZiBmb3VuZCAqLwotICAgIGlmIChfUE1faW1wb3J0cy5QTV9kb1N1c3BlbmRBcHAgIT0gUE1fZG9TdXNwZW5kQXBwKSB7Ci0JX1BNX2ltcG9ydHMuUE1fZG9TdXNwZW5kQXBwKCk7Ci0JcmV0dXJuOwotCX0KLQotICAgIGlmIChmaXJzdFRpbWUpIHsKLQlpZiAoc3VzcGVuZEFwcCkKLQkgICAgc3VzcGVuZEFwcChQTV9ERUFDVElWQVRFKTsKLQlSZXN0b3JlQXV0b1BsYXkoKTsKLQlmaXJzdFRpbWUgPSBmYWxzZTsKLQliYWNrSW5HREkgPSB0cnVlOwotCX0KLSAgICBSZXN0b3JlRnVsbFNjcmVlbigpOwotICAgIGZpcnN0VGltZSA9IHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTWFpbiBXaW5kb3cgcHJvYyBmb3IgdGhlIGZ1bGwgc2NyZWVuIERpcmVjdERyYXcgV2luZG93IHRoYXQgd2UgY3JlYXRlIHdoaWxlCi1ydW5uaW5nIGluIGZ1bGwgc2NyZWVuIG1vZGUuIEhlcmUgd2UgY2FwdHVyZSBhbGwgbW91c2UgYW5kIGtleWJvYXJkIGV2ZW50cwotZm9yIHRoZSB3aW5kb3cgYW5kIHBsdWcgdGhlbSBpbnRvIG91ciBldmVudCBxdWV1ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgTE9ORyBDQUxMQkFDSyBQTV93aW5Qcm9jKAotICAgIEhXTkQgaHduZCwKLSAgICBVSU5UIG1zZywKLSAgICBXUEFSQU0gd1BhcmFtLAotICAgIExPTkcgbFBhcmFtKQotewotICAgIHN3aXRjaCAobXNnKSB7Ci0JY2FzZSBXTV9TWVNDSEFSOgotCSAgICAvKiBTdG9wIEFsdC1TcGFjZSBmcm9tIHBhdXNpbmcgb3VyIGFwcGxpY2F0aW9uICovCi0JICAgIHJldHVybiAwOwotCWNhc2UgV01fS0VZRE9XTjoKLQljYXNlIFdNX1NZU0tFWURPV046Ci0JICAgIGlmIChISVdPUkQobFBhcmFtKSAmIEtGX1JFUEVBVCkgewotCQlpZiAobXNnID09IFdNX1NZU0tFWURPV04pCi0JCSAgICByZXR1cm4gMDsKLQkJYnJlYWs7Ci0JCX0KLQkgICAgLyogRmFsbCB0aHJvdWdoIGZvciBrZXlkb3duIGV2ZW50cyAqLwotCWNhc2UgV01fS0VZVVA6Ci0JY2FzZSBXTV9TWVNLRVlVUDoKLQkgICAgaWYgKG1zZyA9PSBXTV9TWVNLRVlET1dOIHx8IG1zZyA9PSBXTV9TWVNLRVlVUCkgewotCQlpZiAoKEhJV09SRChsUGFyYW0pICYgS0ZfQUxURE9XTikgJiYgd1BhcmFtID09IFZLX1JFVFVSTikKLQkJICAgIGJyZWFrOwotCQkvKiBXZSBpZ25vcmUgdGhlIHJlbWFpbmRlciBvZiB0aGUgc3lzdGVtIGtleXMgdG8gc3RvcCB0aGUKLQkJICogc3lzdGVtIG1lbnUgZnJvbSBiZWluZyBhY3RpdmF0ZWQgZnJvbSB0aGUga2V5Ym9hcmQgYW5kIHBhdXNpbmcKLQkJICogb3VyIGFwcCB3aGlsZSBmdWxsc2NyZWVuIChpZTogcHJlc3NpbmcgdGhlIEFsdCBrZXkpLgotCQkgKi8KLQkJcmV0dXJuIDA7Ci0JCX0KLQkgICAgYnJlYWs7Ci0JY2FzZSBXTV9TWVNDT01NQU5EOgotCSAgICBzd2l0Y2ggKHdQYXJhbSAmIH4weDBGKSB7Ci0JCWNhc2UgU0NfU0NSRUVOU0FWRToKLQkJY2FzZSBTQ19NT05JVE9SUE9XRVI6Ci0JCSAgICAvKiBJZ25vcmUgc2NyZWVuc2F2ZXIgcmVxdWVzdHMgaW4gZnVsbHNjcmVlbiBtb2RlcyAqLwotCQkgICAgcmV0dXJuIDA7Ci0JCX0KLQkgICAgYnJlYWs7Ci0JY2FzZSBXTV9TSVpFOgotCSAgICBpZiAod2FpdEFjdGl2ZSAmJiBiYWNrSW5HREkgJiYgKHdQYXJhbSAhPSBTSVpFX01JTklNSVpFRCkpIHsKLQkJLyogU3RhcnQgdGhlIHJlLWFjdGl2YXRpb24gcHJvY2VzcyAqLwotCQlQb3N0TWVzc2FnZShod25kLFdNX0RPX1NVU1BFTkRfQVBQLFdNX1BNX1JFU1RPUkVfRlVMTFNDUkVFTiwwKTsKLQkJfQotCSAgICBlbHNlIGlmICghd2FpdEFjdGl2ZSAmJiBpc0Z1bGxTY3JlZW4gJiYgIWJhY2tJbkdESSAmJiAod1BhcmFtID09IFNJWkVfTUlOSU1JWkVEKSkgewotCQkvKiBTdGFydCB0aGUgZGUtYWN0aXZhdGlvbiBwcm9jZXNzICovCi0JCVBvc3RNZXNzYWdlKGh3bmQsV01fRE9fU1VTUEVORF9BUFAsV01fUE1fTEVBVkVfRlVMTFNDUkVFTiwwKTsKLQkJfQotCSAgICBicmVhazsKLQljYXNlIFdNX0RPX1NVU1BFTkRfQVBQOgotCSAgICBzd2l0Y2ggKHdQYXJhbSkgewotCQkJCWNhc2UgV01fUE1fUkVTVE9SRV9GVUxMU0NSRUVOOgotCQkJCQlSZXN0b3JlRnVsbFNjcmVlbigpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFdNX1BNX0xFQVZFX0ZVTExTQ1JFRU46Ci0JCQkJCUxlYXZlRnVsbFNjcmVlbigpOwotCQkJCQlicmVhazsKLQkJfQotCSAgICByZXR1cm4gMDsKLQl9Ci0gICAgaWYgKG9sZFdpblByb2MpCi0JcmV0dXJuIG9sZFdpblByb2MoaHduZCxtc2csd1BhcmFtLGxQYXJhbSk7Ci0gICAgcmV0dXJuIERlZldpbmRvd1Byb2MoaHduZCxtc2csd1BhcmFtLGxQYXJhbSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotaHduZCAgICAtIFVzZXIgd2luZG93IHRvIGNvbnZlcnQKLXdpZHRoICAgLSBXaW5kb3cgb2YgdGhlIGZ1bGxzY3JlZW4gd2luZG93Ci1oZWlnaHQgIC0gSGVpZ2h0IG9mIHRoZSBmdWxsc2NyZWVuIHdpbmRvdwotCi1SRVRVUk5TOgotSGFuZGxlIHRvIGNvbnZlcnRlZCBmdWxsc2NyZWVuIFdpbmRvdy4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIG9yaWdpbmFsIHVzZXIgd2luZG93IGhhbmRsZSBhbmQgbW9kaWZpZXMgdGhlIHNpemUsCi1wb3NpdGlvbiBhbmQgYXR0cmlidXRlcyBmb3IgdGhlIHdpbmRvdyB0byBjb252ZXJ0IGl0IGludG8gYSBmdWxsc2NyZWVuCi13aW5kb3cgdGhhdCB3ZSBjYW4gdXNlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBQTV9IV05EIF9QTV9jb252ZXJ0VXNlcldpbmRvdygKLSAgICBIV05EIGh3bmQsCi0gICAgaW50IHdpZHRoLAotICAgIGludCBoZWlnaHQpCi17Ci0gICAgUkVDVCAgICB3aW5kb3c7Ci0KLSAgICBHZXRXaW5kb3dSZWN0KGh3bmQsJndpbmRvdyk7Ci0gICAgb2xkV2luUG9zWCA9IHdpbmRvdy5sZWZ0OwotICAgIG9sZFdpblBvc1kgPSB3aW5kb3cudG9wOwotICAgIG9sZFdpblNpemVYID0gd2luZG93LnJpZ2h0IC0gd2luZG93LmxlZnQ7Ci0gICAgb2xkV2luU2l6ZVkgPSB3aW5kb3cuYm90dG9tIC0gd2luZG93LnRvcDsKLSAgICBvbGRXbmRTdHlsZSA9IFNldFdpbmRvd0xvbmcoaHduZCxHV0xfU1RZTEUsV1NfUE9QVVAgfCBXU19TWVNNRU5VKTsKLSAgICBvbGRFeFduZFN0eWxlID0gU2V0V2luZG93TG9uZyhod25kLEdXTF9FWFNUWUxFLFdTX0VYX0FQUFdJTkRPVyk7Ci0gICAgU2hvd1dpbmRvdyhod25kLFNXX1NIT1cpOwotICAgIE1vdmVXaW5kb3coaHduZCwwLDAsd2lkdGgsaGVpZ2h0LFRSVUUpOwotICAgIFNldFdpbmRvd1Bvcyhod25kLEhXTkRfVE9QTU9TVCwwLDAsMCwwLFNXUF9OT01PVkUgfCBTV1BfTk9TSVpFKTsKLSAgICBvbGRXaW5Qcm9jID0gKFdORFBST0MpU2V0V2luZG93TG9uZyhod25kLEdXTF9XTkRQUk9DLCAoTFBBUkFNKVBNX3dpblByb2MpOwotICAgIHJldHVybiBod25kOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWh3bmQgICAgLSBVc2VyIHdpbmRvdyB0byByZXN0b3JlCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJlc3RvcmVzIHRoZSBvcmlnaW5hbCBhdHRyaWJ1dGVzIG9mIHRoZSB1c2VyIHdpbmRvdyBhbmQgcHV0J3MKLWl0IGJhY2sgaW50byBpdCdzIG9yaWdpbmFsIHN0YXRlIGJlZm9yZSBpdCB3YXMgY29udmVydGVkIHRvIGEgZnVsbHNjcmVlbgotd2luZG93LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIF9QTV9yZXN0b3JlVXNlcldpbmRvdygKLSAgICBIV05EIGh3bmQpCi17Ci0gICAgU2V0V2luZG93TG9uZyhod25kLEdXTF9XTkRQUk9DLCAoTFBBUkFNKW9sZFdpblByb2MpOwotICAgIFNldFdpbmRvd0xvbmcoaHduZCxHV0xfRVhTVFlMRSxvbGRFeFduZFN0eWxlKTsKLSAgICBTZXRXaW5kb3dMb25nKGh3bmQsR1dMX1NUWUxFLG9sZFduZFN0eWxlKTsKLSAgICBTZXRXaW5kb3dQb3MoaHduZCxIV05EX05PVE9QTU9TVCwwLDAsMCwwLFNXUF9OT01PVkUgfCBTV1BfTk9TSVpFKTsKLSAgICBTaG93V2luZG93KGh3bmQsU1dfU0hPVyk7Ci0gICAgTW92ZVdpbmRvdyhod25kLG9sZFdpblBvc1gsb2xkV2luUG9zWSxvbGRXaW5TaXplWCxvbGRXaW5TaXplWSxUUlVFKTsKLSAgICBvbGRXaW5Qcm9jID0gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1kZXZpY2UgIC0gSW5kZXggb2YgdGhlIGRldmljZSB0byBsb2FkIERpcmVjdERyYXcgZm9yICgwIGZvciBwcmltYXJ5KQotCi1SRU1BUktTOgotQXR0ZW1wdHMgdG8gZHluYW1pY2FsbHkgbG9hZCB0aGUgRGlyZWN0RHJhdyBETEwncyBhbmQgY3JlYXRlIHRoZSBEaXJlY3REcmF3Ci1vYmplY3RzIHRoYXQgd2UgbmVlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbG9hZERpcmVjdERyYXcoCi0gICAgaW50IGRldmljZSkKLXsKLSAgICBIREMgICAgICAgICBoZGM7Ci0gICAgaW50ICAgICAgICAgYml0czsKLQotICAgIC8qIENhbGwgc3lzdGVtIERMTCB2ZXJzaW9uIGlmIGZvdW5kICovCi0gICAgaWYgKF9QTV9pbXBvcnRzLlBNX2xvYWREaXJlY3REcmF3ICE9IFBNX2xvYWREaXJlY3REcmF3KQotCXJldHVybiBfUE1faW1wb3J0cy5QTV9sb2FkRGlyZWN0RHJhdyhkZXZpY2UpOwotCi0gICAgLyogVE9ETzogSGFuZGxlIG11bHRpLW1vbml0b3IhISAqLwotICAgIGlmIChkZXZpY2UgIT0gMCkKLQlyZXR1cm4gTlVMTDsKLQotICAgIC8qIExvYWQgdGhlIERpcmVjdERyYXcgRExMIGlmIG5vdCBwcmVzZW50bHkgbG9hZGVkICovCi0gICAgR0VUX0RFRkFVTFRfQ1coKTsKLSAgICBpZiAoIWhJbnN0REQpIHsKLQloZGMgPSBHZXREQyhOVUxMKTsKLQliaXRzID0gR2V0RGV2aWNlQ2FwcyhoZGMsQklUU1BJWEVMKTsKLQlSZWxlYXNlREMoTlVMTCxoZGMpOwotCWlmIChiaXRzIDwgOCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JaWYgKChoSW5zdEREID0gTG9hZExpYnJhcnkoImRkcmF3LmRsbCIpKSA9PSBOVUxMKQotCSAgICByZXR1cm4gTlVMTDsKLQlwRGlyZWN0RHJhd0NyZWF0ZSA9ICh2b2lkKilHZXRQcm9jQWRkcmVzcyhoSW5zdERELCJEaXJlY3REcmF3Q3JlYXRlIik7Ci0JaWYgKCFwRGlyZWN0RHJhd0NyZWF0ZSkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQotCi0gICAgLyogQ3JlYXRlIHRoZSBEaXJlY3REcmF3IG9iamVjdCAqLwotICAgIGlmICghbHBERCAmJiBwRGlyZWN0RHJhd0NyZWF0ZShOVUxMLCAmbHBERCwgTlVMTCkgIT0gRERfT0spIHsKLQlscEREID0gTlVMTDsKLQlyZXR1cm4gTlVMTDsKLQl9Ci0gICAgUkVTRVRfREVGQVVMVF9DVygpOwotICAgIHJldHVybiBscEREOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWRldmljZSAgLSBJbmRleCBvZiB0aGUgZGV2aWNlIHRvIHVubG9hZCBEaXJlY3REcmF3IGZvciAoMCBmb3IgcHJpbWFyeSkKLQotUkVNQVJLUzoKLUZyZWVzIGFueSBEaXJlY3REcmF3IG9iamVjdHMgZm9yIHRoZSBkZXZpY2UuIFdlIG5ldmVyIGFjdHVhbGx5IGV4cGxpY2l0bHkKLXVubG9hZCB0aGUgZGRyYXcuZGxsIGxpYnJhcnksIHNpbmNlIHVubG9hZGluZyBhbmQgcmVsb2FkaW5nIGl0IGlzCi11bm5lY2Vzc2FyeSBzaW5jZSB3ZSBvbmx5IHdhbnQgdG8gdW5sb2FkIGl0IHdoZW4gdGhlIGFwcGxpY2F0aW9uIGV4aXRzIGFuZAotdGhhdCBoYXBwZW5zIGF1dG9tYXRpY2FsbHkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV91bmxvYWREaXJlY3REcmF3KAotICAgIGludCBkZXZpY2UpCi17Ci0gICAgLyogQ2FsbCBzeXN0ZW0gRExMIHZlcnNpb24gaWYgZm91bmQgKi8KLSAgICBpZiAoX1BNX2ltcG9ydHMuUE1fdW5sb2FkRGlyZWN0RHJhdyAhPSBQTV91bmxvYWREaXJlY3REcmF3KSB7Ci0JX1BNX2ltcG9ydHMuUE1fdW5sb2FkRGlyZWN0RHJhdyhkZXZpY2UpOwotCXJldHVybjsKLQl9Ci0gICAgaWYgKGxwREQpIHsKLQlJRGlyZWN0RHJhd19SZWxlYXNlKGxwREQpOwotCWxwREQgPSBOVUxMOwotCX0KLSAgICAodm9pZClkZXZpY2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotT3BlbiBhIGNvbnNvbGUgZm9yIG91dHB1dCB0byB0aGUgc2NyZWVuLCBjcmVhdGluZyB0aGUgbWFpbiBldmVudCBoYW5kbGluZwotd2luZG93IGlmIG5lY2Vzc2FyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1QTV9IV05EIFBNQVBJIFBNX29wZW5Db25zb2xlKAotICAgIFBNX0hXTkQgaFduZFVzZXIsCi0gICAgaW50IGRldmljZSwKLSAgICBpbnQgeFJlcywKLSAgICBpbnQgeVJlcywKLSAgICBpbnQgYnBwLAotICAgIGlib29sIGZ1bGxTY3JlZW4pCi17Ci0gICAgV05EQ0xBU1MgICAgICAgIGNsczsKLSAgICBzdGF0aWMgaWJvb2wgICAgY2xhc3NSZWdpc3RlcmVkID0gZmFsc2U7Ci0KLSAgICAvKiBDYWxsIHN5c3RlbSBETEwgdmVyc2lvbiBpZiBmb3VuZCAqLwotICAgIEdBX2dldFN5c3RlbVBNSW1wb3J0cygpOwotICAgIGlmIChfUE1faW1wb3J0cy5QTV9vcGVuQ29uc29sZSAhPSBQTV9vcGVuQ29uc29sZSkgewotCWlmIChmdWxsU2NyZWVuKSB7Ci0JICAgIF9QTV9kZXNrWCA9IHhSZXM7Ci0JICAgIF9QTV9kZXNrWSA9IHlSZXM7Ci0JICAgIH0KLQlyZXR1cm4gX1BNX2ltcG9ydHMuUE1fb3BlbkNvbnNvbGUoaFduZFVzZXIsZGV2aWNlLHhSZXMseVJlcyxicHAsZnVsbFNjcmVlbik7Ci0JfQotCi0gICAgLyogQ3JlYXRlIHRoZSBmdWxsc2NyZWVuIHdpbmRvdyBpZiBuZWNlc3NhcnkgKi8KLSAgICBod25kVXNlciA9IGhXbmRVc2VyOwotICAgIGlmIChmdWxsU2NyZWVuKSB7Ci0JaWYgKCFjbGFzc1JlZ2lzdGVyZWQpIHsKLQkgICAgLyogQ3JlYXRlIGEgV2luZG93IGNsYXNzIGZvciB0aGUgZnVsbHNjcmVlbiB3aW5kb3cgaW4gaGVyZSwgc2luY2UKLQkgICAgICogd2UgbmVlZCB0byByZWdpc3RlciBvbmUgdGhhdCB3aWxsIGRvIGFsbCBvdXIgZXZlbnQgaGFuZGxpbmcgZm9yCi0JICAgICAqIHVzLgotCSAgICAgKi8KLQkgICAgaEluc3RBcHAgICAgICAgICAgICA9IEdldE1vZHVsZUhhbmRsZShOVUxMKTsKLQkgICAgY2xzLmhDdXJzb3IgICAgICAgICA9IExvYWRDdXJzb3IoTlVMTCxJRENfQVJST1cpOwotCSAgICBjbHMuaEljb24gICAgICAgICAgID0gTG9hZEljb24oaEluc3RBcHAsTUFLRUlOVFJFU09VUkNFKDEpKTsKLQkgICAgY2xzLmxwc3pNZW51TmFtZSAgICA9IE5VTEw7Ci0JICAgIGNscy5scHN6Q2xhc3NOYW1lICAgPSBzeldpbkNsYXNzTmFtZTsKLQkgICAgY2xzLmhickJhY2tncm91bmQgICA9IEdldFN0b2NrT2JqZWN0KEJMQUNLX0JSVVNIKTsKLQkgICAgY2xzLmhJbnN0YW5jZSAgICAgICA9IGhJbnN0QXBwOwotCSAgICBjbHMuc3R5bGUgICAgICAgICAgID0gQ1NfREJMQ0xLUzsKLQkgICAgY2xzLmxwZm5XbmRQcm9jICAgICA9IFBNX3dpblByb2M7Ci0JICAgIGNscy5jYlduZEV4dHJhICAgICAgPSAwOwotCSAgICBjbHMuY2JDbHNFeHRyYSAgICAgID0gMDsKLQkgICAgaWYgKCFSZWdpc3RlckNsYXNzKCZjbHMpKQotCQlyZXR1cm4gTlVMTDsKLQkgICAgY2xhc3NSZWdpc3RlcmVkID0gdHJ1ZTsKLQkgICAgfQotCV9QTV9kZXNrWCA9IHhSZXM7Ci0JX1BNX2Rlc2tZID0geVJlczsKLQlpZiAoIWh3bmRVc2VyKSB7Ci0JICAgIGNoYXIgd2luZG93VGl0bGVbODBdOwotCSAgICBpZiAoTG9hZFN0cmluZyhoSW5zdEFwcCwxLHdpbmRvd1RpdGxlLHNpemVvZih3aW5kb3dUaXRsZSkpID09IDApCi0JCXN0cmNweSh3aW5kb3dUaXRsZSwiTUdMIEZ1bGxzY3JlZW4gQXBwbGljYXRpb24iKTsKLQkgICAgX1BNX2h3bmRDb25zb2xlID0gQ3JlYXRlV2luZG93RXgoV1NfRVhfQVBQV0lORE9XLHN6V2luQ2xhc3NOYW1lLAotCQl3aW5kb3dUaXRsZSxXU19QT1BVUCB8IFdTX1NZU01FTlUsMCwwLHhSZXMseVJlcywKLQkJTlVMTCxOVUxMLGhJbnN0QXBwLE5VTEwpOwotCSAgICB9Ci0JZWxzZSB7Ci0JICAgIF9QTV9od25kQ29uc29sZSA9IF9QTV9jb252ZXJ0VXNlcldpbmRvdyhod25kVXNlcix4UmVzLHlSZXMpOwotCSAgICB9Ci0JU2hvd0N1cnNvcihmYWxzZSk7Ci0JaXNGdWxsU2NyZWVuID0gdHJ1ZTsKLQl9Ci0gICAgZWxzZSB7Ci0JX1BNX2h3bmRDb25zb2xlID0gaHduZFVzZXI7Ci0JaXNGdWxsU2NyZWVuID0gZmFsc2U7Ci0JfQotICAgIFNldEZvY3VzKF9QTV9od25kQ29uc29sZSk7Ci0gICAgU2V0Rm9yZWdyb3VuZFdpbmRvdyhfUE1faHduZENvbnNvbGUpOwotICAgIERpc2FibGVBdXRvUGxheSgpOwotICAgICh2b2lkKWJwcDsKLSAgICByZXR1cm4gX1BNX2h3bmRDb25zb2xlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZpbmQgdGhlIHNpemUgb2YgdGhlIGNvbnNvbGUgc3RhdGUgYnVmZmVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9nZXRDb25zb2xlU3RhdGVTaXplKHZvaWQpCi17Ci0gICAgLyogQ2FsbCBzeXN0ZW0gRExMIHZlcnNpb24gaWYgZm91bmQgKi8KLSAgICBpZiAoX1BNX2ltcG9ydHMuUE1fZ2V0Q29uc29sZVN0YXRlU2l6ZSAhPSBQTV9nZXRDb25zb2xlU3RhdGVTaXplKQotCXJldHVybiBfUE1faW1wb3J0cy5QTV9nZXRDb25zb2xlU3RhdGVTaXplKCk7Ci0KLSAgICAvKiBOb3QgdXNlZCBpbiBXaW5kb3dzICovCi0gICAgcmV0dXJuIDE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2F2ZSB0aGUgc3RhdGUgb2YgdGhlIGNvbnNvbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zYXZlQ29uc29sZVN0YXRlKAotICAgIHZvaWQgKnN0YXRlQnVmLAotICAgIFBNX0hXTkQgaHduZENvbnNvbGUpCi17Ci0gICAgLyogQ2FsbCBzeXN0ZW0gRExMIHZlcnNpb24gaWYgZm91bmQgKi8KLSAgICBpZiAoX1BNX2ltcG9ydHMuUE1fc2F2ZUNvbnNvbGVTdGF0ZSAhPSBQTV9zYXZlQ29uc29sZVN0YXRlKSB7Ci0JX1BNX2ltcG9ydHMuUE1fc2F2ZUNvbnNvbGVTdGF0ZShzdGF0ZUJ1Zixod25kQ29uc29sZSk7Ci0JcmV0dXJuOwotCX0KLQotICAgIC8qIE5vdCB1c2VkIGluIFdpbmRvd3MgKi8KLSAgICAodm9pZClzdGF0ZUJ1ZjsKLSAgICAodm9pZClod25kQ29uc29sZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIHN1c3BlbmQgYXBwbGljYXRpb24gY2FsbGJhY2sgZm9yIHRoZSBmdWxsc2NyZWVuIGNvbnNvbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2soCi0gICAgUE1fc2F2ZVN0YXRlX2NiIHNhdmVTdGF0ZSkKLXsKLSAgICAvKiBDYWxsIHN5c3RlbSBETEwgdmVyc2lvbiBpZiBmb3VuZCAqLwotICAgIGlmIChfUE1faW1wb3J0cy5QTV9zZXRTdXNwZW5kQXBwQ2FsbGJhY2sgIT0gUE1fc2V0U3VzcGVuZEFwcENhbGxiYWNrKSB7Ci0JX1BNX2ltcG9ydHMuUE1fc2V0U3VzcGVuZEFwcENhbGxiYWNrKHNhdmVTdGF0ZSk7Ci0JcmV0dXJuOwotCX0KLSAgICBzdXNwZW5kQXBwID0gc2F2ZVN0YXRlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlc3RvcmUgdGhlIGNvbnNvbGUgc3RhdGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9yZXN0b3JlQ29uc29sZVN0YXRlKAotICAgIGNvbnN0IHZvaWQgKnN0YXRlQnVmLAotICAgIFBNX0hXTkQgaHduZENvbnNvbGUpCi17Ci0gICAgLyogQ2FsbCBzeXN0ZW0gRExMIHZlcnNpb24gaWYgZm91bmQgKi8KLSAgICBpZiAoX1BNX2ltcG9ydHMuUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZSAhPSBQTV9yZXN0b3JlQ29uc29sZVN0YXRlKSB7Ci0JX1BNX2ltcG9ydHMuUE1fcmVzdG9yZUNvbnNvbGVTdGF0ZShzdGF0ZUJ1Zixod25kQ29uc29sZSk7Ci0JcmV0dXJuOwotCX0KLQotICAgIC8qIE5vdCB1c2VkIGluIFdpbmRvd3MgKi8KLSAgICAodm9pZClzdGF0ZUJ1ZjsKLSAgICAodm9pZClod25kQ29uc29sZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DbG9zZSB0aGUgZnVsbHNjcmVlbiBjb25zb2xlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fY2xvc2VDb25zb2xlKAotICAgIFBNX0hXTkQgaHduZENvbnNvbGUpCi17Ci0gICAgLyogQ2FsbCBzeXN0ZW0gRExMIHZlcnNpb24gaWYgZm91bmQgKi8KLSAgICBpZiAoX1BNX2ltcG9ydHMuUE1fY2xvc2VDb25zb2xlICE9IFBNX2Nsb3NlQ29uc29sZSkgewotCV9QTV9pbXBvcnRzLlBNX2Nsb3NlQ29uc29sZShod25kQ29uc29sZSk7Ci0JcmV0dXJuOwotCX0KLSAgICBTaG93Q3Vyc29yKHRydWUpOwotICAgIFJlc3RvcmVBdXRvUGxheSgpOwotICAgIGlmIChod25kVXNlcikKLQlfUE1fcmVzdG9yZVVzZXJXaW5kb3coaHduZENvbnNvbGUpOwotICAgIGVsc2UKLQlEZXN0cm95V2luZG93KGh3bmRDb25zb2xlKTsKLSAgICBod25kVXNlciA9IE5VTEw7Ci0gICAgX1BNX2h3bmRDb25zb2xlID0gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIERpcmVjdERyYXcgd2luZG93IGhhbmRsZSB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1QTV9IV05EIFBNQVBJIFBNX2dldERpcmVjdERyYXdXaW5kb3codm9pZCkKLXsKLSAgICAvKiBDYWxsIHN5c3RlbSBETEwgdmVyc2lvbiBpZiBmb3VuZCAqLwotICAgIGlmIChfUE1faW1wb3J0cy5QTV9nZXREaXJlY3REcmF3V2luZG93ICE9IFBNX2dldERpcmVjdERyYXdXaW5kb3cpCi0JcmV0dXJuIF9QTV9pbXBvcnRzLlBNX2dldERpcmVjdERyYXdXaW5kb3coKTsKLSAgICByZXR1cm4gX1BNX2h3bmRDb25zb2xlOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvZXZlbnQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL2V2ZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzODgwNTIuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvZXZlbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE11bHRpLXBsYXRmb3JtIEdyYXBoaWNzIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgV2luMzIKLSoKLSogRGVzY3JpcHRpb246ICBXaW4zMiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFNjaVRlY2ggY3Jvc3MgcGxhdGZvcm0KLSogICAgICAgICAgICAgICBldmVudCBsaWJyYXJ5LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHVzaG9ydCAgIGtleVVwTXNnWzI1Nl0gPSB7MH07ICAgIC8qIFRhYmxlIG9mIGtleSB1cCBtZXNzYWdlcyAgICAgKi8KLXN0YXRpYyBpbnQgICAgICByYW5nZVgscmFuZ2VZOyAgICAgICAgICAvKiBSYW5nZSBvZiBtb3VzZSBjb29yZGluYXRlcyAgICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFRoZXNlIGFyZSBub3QgdXNlZCB1bmRlciBXaW4zMiAqLwotI2RlZmluZSBfRVZUX2Rpc2FibGVJbnQoKSAgICAgICAxCi0jZGVmaW5lIF9FVlRfcmVzdG9yZUludChmbGFncykgICh2b2lkKShmbGFncykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zY2FuQ29kZSAgICAtIFNjYW4gY29kZSB0byB0ZXN0Ci0KLVJFTUFSS1M6Ci1UaGlzIG1hY3JvIGRldGVybWluZXMgaWYgYSBzcGVjaWZpZWQga2V5IGlzIGN1cnJlbnRseSBkb3duIGF0IHRoZQotdGltZSB0aGF0IHRoZSBjYWxsIGlzIG1hZGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfRVZUX2lzS2V5RG93bihzY2FuQ29kZSkgICAgKGtleVVwTXNnW3NjYW5Db2RlXSAhPSAwKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXR1cm4gdGhlIG51bWJlciBvZiB0aWNrcyBzaW5jZSBzeXN0ZW0KLXN0YXJ0dXAgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIHNob3VsZCBiZSB0aGUgc2FtZSB2YWx1ZSB0aGF0IGlzIHBsYWNlZCBpbnRvCi10aGUgdGltZSBzdGFtcCBmaWVsZHMgb2YgZXZlbnRzLCBhbmQgaXMgdXNlZCB0byBpbXBsZW1lbnQgYXV0byBtb3VzZSBkb3duCi1ldmVudHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgX0VWVF9nZXRUaWNrcyh2b2lkKQoteyByZXR1cm4gdGltZUdldFRpbWUoKTsgfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVB1bXBzIGFsbCBtZXNzYWdlcyBpbiB0aGUgbWVzc2FnZSBxdWV1ZSBmcm9tIFdpbjMyIGludG8gb3VyIGV2ZW50IHF1ZXVlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX0VWVF9wdW1wTWVzc2FnZXModm9pZCkKLXsKLSAgICBNU0cgICAgIG1zZzsKLSAgICBNU0cgICAgIGNoYXJNc2c7Ci0gICAgZXZlbnRfdCBldnQ7Ci0KLSAgICAvKiBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgRGlyZWN0SW5wdXQhIFdlIGNhbid0IHN1cHBvcnQgcmVsYXRpdmUgbW91c2UgKi8KLSAgICAvKiAgICAgICBtb3ZlbWVudCBtb3Rpb24gY291bnRlcnMgd2l0aG91dCBEaXJlY3RJbnB1dCA7LSguICovCi0gICAgd2hpbGUgKFBlZWtNZXNzYWdlKCZtc2csTlVMTCwwLDAsUE1fUkVNT1ZFKSkgewotCW1lbXNldCgmZXZ0LDAsc2l6ZW9mKGV2dCkpOwotCXN3aXRjaCAobXNnLm1lc3NhZ2UpIHsKLQkgICAgY2FzZSBXTV9NT1VTRU1PVkU6Ci0JCWV2dC53aGF0ID0gRVZUX01PVVNFTU9WRTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgV01fTEJVVFRPTkRCTENMSzoKLQkJZXZ0LndoYXQgPSBFVlRfTU9VU0VET1dOOwotCQlldnQubWVzc2FnZSA9IEVWVF9MRUZUQk1BU0sgfCBFVlRfREJMQ0xJQ0s7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFdNX0xCVVRUT05ET1dOOgotCQlldnQud2hhdCA9IEVWVF9NT1VTRURPV047Ci0JCWV2dC5tZXNzYWdlID0gRVZUX0xFRlRCTUFTSzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgV01fTEJVVFRPTlVQOgotCQlldnQud2hhdCA9IEVWVF9NT1VTRVVQOwotCQlldnQubWVzc2FnZSA9IEVWVF9MRUZUQk1BU0s7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFdNX1JCVVRUT05EQkxDTEs6Ci0JCWV2dC53aGF0ID0gRVZUX01PVVNFRE9XTiB8IEVWVF9EQkxDTElDSzsKLQkJZXZ0Lm1lc3NhZ2UgPSBFVlRfUklHSFRCTUFTSzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgV01fUkJVVFRPTkRPV046Ci0JCWV2dC53aGF0ID0gRVZUX01PVVNFRE9XTjsKLQkJZXZ0Lm1lc3NhZ2UgPSBFVlRfUklHSFRCTUFTSzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgV01fUkJVVFRPTlVQOgotCQlldnQud2hhdCA9IEVWVF9NT1VTRVVQOwotCQlldnQubWVzc2FnZSA9IEVWVF9SSUdIVEJNQVNLOwotCQlicmVhazsKLQkgICAgY2FzZSBXTV9NQlVUVE9OREJMQ0xLOgotCQlldnQud2hhdCA9IEVWVF9NT1VTRURPV04gfCBFVlRfREJMQ0xJQ0s7Ci0JCWV2dC5tZXNzYWdlID0gRVZUX01JRERMRUJNQVNLOwotCQlicmVhazsKLQkgICAgY2FzZSBXTV9NQlVUVE9ORE9XTjoKLQkJZXZ0LndoYXQgPSBFVlRfTU9VU0VET1dOOwotCQlldnQubWVzc2FnZSA9IEVWVF9NSURETEVCTUFTSzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgV01fTUJVVFRPTlVQOgotCQlldnQud2hhdCA9IEVWVF9NT1VTRVVQOwotCQlldnQubWVzc2FnZSA9IEVWVF9NSURETEVCTUFTSzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgV01fS0VZRE9XTjoKLQkgICAgY2FzZSBXTV9TWVNLRVlET1dOOgotCQlpZiAoSElXT1JEKG1zZy5sUGFyYW0pICYgS0ZfUkVQRUFUKSB7Ci0JCSAgICBldnQud2hhdCA9IEVWVF9LRVlSRVBFQVQ7Ci0JCSAgICB9Ci0JCWVsc2UgewotCQkgICAgZXZ0LndoYXQgPSBFVlRfS0VZRE9XTjsKLQkJICAgIH0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgV01fS0VZVVA6Ci0JICAgIGNhc2UgV01fU1lTS0VZVVA6Ci0JCWV2dC53aGF0ID0gRVZUX0tFWVVQOwotCQlicmVhazsKLQkgICAgfQotCi0JLyogQ29udmVydCBtb3VzZSBldmVudCBtb2RpZmllciBmbGFncyAqLwotCWlmIChldnQud2hhdCAmIEVWVF9NT1VTRUVWVCkgewotCSAgICBpZiAoX1BNX2Rlc2tYKSB7Ci0JCWV2dC53aGVyZV94ID0gKChsb25nKW1zZy5wdC54ICogcmFuZ2VYKSAvIF9QTV9kZXNrWDsKLQkJZXZ0LndoZXJlX3kgPSAoKGxvbmcpbXNnLnB0LnkgKiByYW5nZVkpIC8gX1BNX2Rlc2tZOwotCQl9Ci0JICAgIGVsc2UgewotCQlTY3JlZW5Ub0NsaWVudChfUE1faHduZENvbnNvbGUsICZtc2cucHQpOwotCQlldnQud2hlcmVfeCA9IG1zZy5wdC54OwotCQlldnQud2hlcmVfeSA9IG1zZy5wdC55OwotCQl9Ci0JICAgIGlmIChldnQud2hhdCA9PSBFVlRfTU9VU0VNT1ZFKSB7Ci0JCS8qIFNhdmUgdGhlIGN1cnJlbnQgbW91c2UgcG9zaXRpb24gKi8KLQkJRVZULm14ID0gZXZ0LndoZXJlX3g7Ci0JCUVWVC5teSA9IGV2dC53aGVyZV95OwotCQlpZiAoRVZULm9sZE1vdmUgIT0gLTEpIHsKLQkJICAgIEVWVC5ldnRxW0VWVC5vbGRNb3ZlXS53aGVyZV94ID0gZXZ0LndoZXJlX3g7LyogTW9kaWZ5IGV4aXN0aW5nIG9uZSAgKi8KLQkJICAgIEVWVC5ldnRxW0VWVC5vbGRNb3ZlXS53aGVyZV95ID0gZXZ0LndoZXJlX3k7Ci0vKiAgICAgICAgICAgICAgICAgIEVWVC5ldnRxW0VWVC5vbGRNb3ZlXS5yZWxhdGl2ZV94ICs9IG1pY2tleVg7ICAgIC8gLyBUT0RPISAqLwotLyogICAgICAgICAgICAgICAgICBFVlQuZXZ0cVtFVlQub2xkTW92ZV0ucmVsYXRpdmVfeSArPSBtaWNrZXlZOyAgICAvIC8gVE9ETyEgKi8KLQkJICAgIGV2dC53aGF0ID0gMDsKLQkJICAgIH0KLQkJZWxzZSB7Ci0JCSAgICBFVlQub2xkTW92ZSA9IEVWVC5mcmVlSGVhZDsgLyogU2F2ZSBpZCBvZiB0aGlzIG1vdmUgZXZlbnQgICAqLwotLyogICAgICAgICAgICAgICAgICBldnQucmVsYXRpdmVfeCA9IG1pY2tleVg7ICAgIC8gLyBUT0RPISAqLwotLyogICAgICAgICAgICAgICAgICBldnQucmVsYXRpdmVfeSA9IG1pY2tleVk7ICAgIC8gLyBUT0RPISAqLwotCQkgICAgfQotCQl9Ci0JICAgIGVsc2UKLQkJRVZULm9sZE1vdmUgPSAtMTsKLQkgICAgaWYgKG1zZy53UGFyYW0gJiBNS19MQlVUVE9OKQotCQlldnQubW9kaWZpZXJzIHw9IEVWVF9MRUZUQlVUOwotCSAgICBpZiAobXNnLndQYXJhbSAmIE1LX1JCVVRUT04pCi0JCWV2dC5tb2RpZmllcnMgfD0gRVZUX1JJR0hUQlVUOwotCSAgICBpZiAobXNnLndQYXJhbSAmIE1LX01CVVRUT04pCi0JCWV2dC5tb2RpZmllcnMgfD0gRVZUX01JRERMRUJVVDsKLQkgICAgaWYgKG1zZy53UGFyYW0gJiBNS19TSElGVCkKLQkJZXZ0Lm1vZGlmaWVycyB8PSBFVlRfU0hJRlRLRVk7Ci0JICAgIGlmIChtc2cud1BhcmFtICYgTUtfQ09OVFJPTCkKLQkJZXZ0Lm1vZGlmaWVycyB8PSBFVlRfQ1RSTFNUQVRFOwotCSAgICB9Ci0KLQkvKiBDb252ZXJ0IGtleWJvYXJkIGNvZGVzICovCi0JVHJhbnNsYXRlTWVzc2FnZSgmbXNnKTsKLQlpZiAoZXZ0LndoYXQgJiBFVlRfS0VZRVZUKSB7Ci0JICAgIGludCBzY2FuQ29kZSA9IChtc2cubFBhcmFtID4+IDE2KSAmIDB4RkY7Ci0JICAgIGlmIChldnQud2hhdCA9PSBFVlRfS0VZVVApIHsKLQkJLyogR2V0IG1lc3NhZ2UgZm9yIGtleXVwIGNvZGUgZnJvbSB0YWJsZSBvZiBjYWNoZWQgZG93biB2YWx1ZXMgKi8KLQkJZXZ0Lm1lc3NhZ2UgPSBrZXlVcE1zZ1tzY2FuQ29kZV07Ci0JCWtleVVwTXNnW3NjYW5Db2RlXSA9IDA7Ci0JCX0KLQkgICAgZWxzZSB7Ci0JCWlmIChQZWVrTWVzc2FnZSgmY2hhck1zZyxOVUxMLFdNX0NIQVIsV01fQ0hBUixQTV9SRU1PVkUpKQotCQkgICAgZXZ0Lm1lc3NhZ2UgPSBjaGFyTXNnLndQYXJhbTsKLQkJaWYgKFBlZWtNZXNzYWdlKCZjaGFyTXNnLE5VTEwsV01fU1lTQ0hBUixXTV9TWVNDSEFSLFBNX1JFTU9WRSkpCi0JCSAgICBldnQubWVzc2FnZSA9IGNoYXJNc2cud1BhcmFtOwotCQlldnQubWVzc2FnZSB8PSAoKG1zZy5sUGFyYW0gPj4gOCkgJiAweEZGMDApOwotCQlrZXlVcE1zZ1tzY2FuQ29kZV0gPSAodXNob3J0KWV2dC5tZXNzYWdlOwotCQl9Ci0JICAgIGlmIChldnQud2hhdCA9PSBFVlRfS0VZUkVQRUFUKQotCQlldnQubWVzc2FnZSB8PSAobXNnLmxQYXJhbSA8PCAxNik7Ci0JICAgIGlmIChISVdPUkQobXNnLmxQYXJhbSkgJiBLRl9BTFRET1dOKQotCQlldnQubW9kaWZpZXJzIHw9IEVWVF9BTFRTVEFURTsKLQkgICAgaWYgKEdldEtleVN0YXRlKFZLX1NISUZUKSAmIDB4ODAwMFUpCi0JCWV2dC5tb2RpZmllcnMgfD0gRVZUX1NISUZUS0VZOwotCSAgICBpZiAoR2V0S2V5U3RhdGUoVktfQ09OVFJPTCkgJiAweDgwMDBVKQotCQlldnQubW9kaWZpZXJzIHw9IEVWVF9DVFJMU1RBVEU7Ci0JICAgIEVWVC5vbGRNb3ZlID0gLTE7Ci0JICAgIH0KLQotCWlmIChldnQud2hhdCAhPSAwKSB7Ci0JICAgIC8qIEFkZCB0aW1lIHN0YW1wIGFuZCBhZGQgdGhlIGV2ZW50IHRvIHRoZSBxdWV1ZSAqLwotCSAgICBldnQud2hlbiA9IG1zZy50aW1lOwotCSAgICBpZiAoRVZULmNvdW50IDwgRVZFTlRRU0laRSkKLQkJYWRkRXZlbnQoJmV2dCk7Ci0JICAgIH0KLQlEaXNwYXRjaE1lc3NhZ2UoJm1zZyk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgbWFjcm8vZnVuY3Rpb24gaXMgdXNlZCB0byBjb252ZXJ0cyB0aGUgc2NhbiBjb2RlcyByZXBvcnRlZCBieSB0aGUKLWtleWJvYXJkIHRvIG91ciBldmVudCBsaWJyYXJpZXMgbm9ybWFsaXNlZCBmb3JtYXQuIFdlIG9ubHkgaGF2ZSBvbmUgc2NhbgotY29kZSBmb3IgdGhlICdBJyBrZXksIGFuZCB1c2Ugc2hpZnQgbW9kaWZpZXJzIHRvIGRldGVybWluZSBpZiBpdCBpcyBhCi1DdHJsLUYxLCBBbHQtRjEgZXRjLiBUaGUgcmF3IHNjYW4gY29kZXMgZnJvbSB0aGUga2V5Ym9hcmQgd29yayB0aGlzIHdheSwKLWJ1dCB0aGUgT1MgZ2l2ZXMgdXMgJ2Nvb2tlZCcgc2NhbiBjb2Rlcywgd2UgaGF2ZSB0byB0cmFuc2xhdGUgdGhlbSBiYWNrCi10byB0aGUgcmF3IGZvcm1hdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9FVlRfbWFza0tleUNvZGUoZXZ0KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNhZmVseSBhYm9ydCB0aGUgZXZlbnQgbW9kdWxlIHVwb24gY2F0Y2hpbmcgYSBmYXRhbCBlcnJvci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9FVlRfYWJvcnQoCi0gICAgaW50IHNpZ25hbCkKLXsKLSAgICAodm9pZClzaWduYWw7Ci0gICAgRVZUX2V4aXQoKTsKLSAgICBQTV9mYXRhbEVycm9yKCJVbmhhbmRsZWQgZXhjZXB0aW9uISIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW1vdXNlTW92ZSAgIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuZXZlIHRoZSBtb3VzZSBuZWVkcyB0byBiZSBtb3ZlZAotCi1SRU1BUktTOgotSW5pdGlsaWFzZSB0aGUgZXZlbnQgaGFuZGxpbmcgbW9kdWxlLiBIZXJlIHdlIGluc3RhbGwgb3VyIG1vdXNlIGhhbmRsaW5nIElTUgotdG8gYmUgY2FsbGVkIHdoZW5ldmVyIGFueSBidXR0b24ncyBhcmUgcHJlc3NlZCBvciByZWxlYXNlZC4gV2UgYWxzbyBidWlsZAotdGhlIGZyZWUgbGlzdCBvZiBldmVudHMgaW4gdGhlIGV2ZW50IHF1ZXVlLgotCi1XZSB1c2UgaGFuZGxlciBudW1iZXIgMiBvZiB0aGUgbW91c2UgbGlicmFyaWVzIGludGVycnVwdCBoYW5kbGVycyBmb3Igb3VyCi1ldmVudCBoYW5kbGluZyByb3V0aW5lcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfaW5pdCgKLSAgICBfRVZUX21vdXNlTW92ZUhhbmRsZXIgbW91c2VNb3ZlKQotewotICAgIC8qIEluaXRpYWxpc2UgdGhlIGV2ZW50IHF1ZXVlICovCi0gICAgRVZULm1vdXNlTW92ZSA9IG1vdXNlTW92ZTsKLSAgICBpbml0RXZlbnRRdWV1ZSgpOwotICAgIG1lbXNldChrZXlVcE1zZywwLHNpemVvZihrZXlVcE1zZykpOwotCi0gICAgLyogQ2F0Y2ggcHJvZ3JhbSB0ZXJtaW5hdGlvbiBzaWduYWxzIHNvIHdlIGNhbiBjbGVhbiB1cCBwcm9wZXJseSAqLwotICAgIHNpZ25hbChTSUdBQlJULCBfRVZUX2Fib3J0KTsKLSAgICBzaWduYWwoU0lHRlBFLCBfRVZUX2Fib3J0KTsKLSAgICBzaWduYWwoU0lHSU5ULCBfRVZUX2Fib3J0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLUNoYW5nZXMgdGhlIHJhbmdlIG9mIGNvb3JkaW5hdGVzIHJldHVybmVkIGJ5IHRoZSBtb3VzZSBmdW5jdGlvbnMgdG8gdGhlCi1zcGVjaWZpZWQgcmFuZ2Ugb2YgdmFsdWVzLiBUaGlzIGlzIHVzZWQgd2hlbiBjaGFuZ2luZyBiZXR3ZWVuIGdyYXBoaWNzCi1tb2RlcyBzZXQgdGhlIHJhbmdlIG9mIG1vdXNlIGNvb3JkaW5hdGVzIGZvciB0aGUgbmV3IGRpc3BsYXkgbW9kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfc2V0TW91c2VSYW5nZSgKLSAgICBpbnQgeFJlcywKLSAgICBpbnQgeVJlcykKLXsKLSAgICByYW5nZVggPSB4UmVzOwotICAgIHJhbmdlWSA9IHlSZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1Nb2RpZmVzIHRoZSBtb3VzZSBjb29yZGluYXRlcyBhcyBuZWNlc3NhcnkgaWYgc2NhbGluZyB0byBPUyBjb29yZGluYXRlcywKLWFuZCBzZXRzIHRoZSBPUyBtb3VzZSBjdXJzb3IgcG9zaXRpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfRVZUX3NldE1vdXNlUG9zKAotICAgIGludCAqeCwKLSAgICBpbnQgKnkpCi17Ci0gICAgLyogU2NhbGUgY29vcmRpbmF0ZXMgdXAgdG8gZGVza3RvcCBjb29yZGluYXRlcyBmaXJzdCAqLwotICAgIGludCBzY2FsZWRYID0gKCp4ICogX1BNX2Rlc2tYKSAvIHJhbmdlWDsKLSAgICBpbnQgc2NhbGVkWSA9ICgqeSAqIF9QTV9kZXNrWSkgLyByYW5nZVk7Ci0KLSAgICAvKiBTY2FsZSBjb29yZGluYXRlcyBiYWNrIHRvIHNjcmVlbiBjb29yZGluYXRlcyBhZ2FpbiAqLwotICAgICp4ID0gKHNjYWxlZFggKiByYW5nZVgpIC8gX1BNX2Rlc2tYOwotICAgICp5ID0gKHNjYWxlZFkgKiByYW5nZVkpIC8gX1BNX2Rlc2tZOwotICAgIFNldEN1cnNvclBvcyhzY2FsZWRYLHNjYWxlZFkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWlsaXNlcyB0aGUgaW50ZXJuYWwgZXZlbnQgaGFuZGxpbmcgbW9kdWxlcy4gVGhlIEVWVF9zdXNwZW5kIGZ1bmN0aW9uCi1jYW4gYmUgY2FsbGVkIHRvIHN1c3BlbmQgZXZlbnQgaGFuZGxpbmcgKHN1Y2ggYXMgd2hlbiBzaGVsbGluZyBvdXQgdG8gRE9TKSwKLWFuZCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlc3VtZSBpdCBhZ2FpbiBsYXRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVF9yZXN1bWUodm9pZCkKLXsKLSAgICAvKiBEbyBub3RoaW5nIGZvciBXaW4zMiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotU3VzcGVuZHMgYWxsIG9mIG91ciBldmVudCBoYW5kbGluZyBvcGVyYXRpb25zLiBUaGlzIGlzIGFsc28gdXNlZCB0bwotZGUtaW5zdGFsbCB0aGUgZXZlbnQgaGFuZGxpbmcgY29kZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVF9zdXNwZW5kKHZvaWQpCi17Ci0gICAgLyogRG8gbm90aGluZyBmb3IgV2luMzIgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLUV4aXRzIHRoZSBldmVudCBtb2R1bGUgZm9yIHByb2dyYW0gdGVybWluYXRhdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVF9leGl0KHZvaWQpCi17Ci0gICAgLyogUmVzdG9yZSBzaWduYWwgaGFuZGxlcnMgKi8KLSAgICBzaWduYWwoU0lHQUJSVCwgU0lHX0RGTCk7Ci0gICAgc2lnbmFsKFNJR0ZQRSwgU0lHX0RGTCk7Ci0gICAgc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVJldHVybnMgdGhlIG1hc2sgaW5kaWNhdGluZyB3aGF0IGpveXN0aWNrIGF4ZXMgYXJlIGF0dGFjaGVkLgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZGV0ZWN0IHRoZSBhdHRhY2hlZCBqb3lzdGlja3MsIGFuZCBkZXRlcm1pbmUKLXdoYXQgYXhlcyBhcmUgcHJlc2VudCBhbmQgZnVuY3Rpb25pbmcuIFRoaXMgZnVuY3Rpb24gd2lsbCByZS1kZXRlY3QgYW55Ci1hdHRhY2hlZCBqb3lzdGlja3Mgd2hlbiBpdCBpcyBjYWxsZWQsIHNvIGlmIHRoZSB1c2VyIGZvcmdvdCB0byBhdHRhY2gKLXRoZSBqb3lzdGljayB3aGVuIHRoZSBhcHBsaWNhdGlvbiBzdGFydGVkLCB5b3UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiB0bwotcmUtZGV0ZWN0IGFueSBuZXdseSBhdHRhY2hlZCBqb3lzdGlja3MuCi0KLVNFRSBBTFNPOgotRVZUX2pveVNldExvd2VyUmlnaHQsIEVWVF9qb3lTZXRDZW50ZXIsIEVWVF9qb3lJc1ByZXNlbnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgRVZUQVBJIEVWVF9qb3lJc1ByZXNlbnQodm9pZCkKLXsKLSAgICAvKiBUT0RPOiBJbXBsZW1lbnQgam95c3RpY2sgY29kZSBiYXNlZCBvbiBEaXJlY3RYISAqLwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1Qb2xscyB0aGUgam95c3RpY2sgZm9yIHBvc2l0aW9uIGFuZCBidXR0b24gaW5mb3JtYXRpb24uCi0KLUhFQURFUjoKLWV2ZW50LmgKLQotUkVNQVJLUzoKLVRoaXMgcm91dGluZSBpcyB1c2VkIHRvIHBvbGwgYW5hbG9ndWUgam95c3RpY2tzIGZvciBidXR0b24gYW5kIHBvc2l0aW9uCi1pbmZvcm1hdGlvbi4gSXQgc2hvdWxkIGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIG1haW4gbG9vcCBvZiB0aGUgdXNlcgotYXBwbGljYXRpb24sIGp1c3QgYmVmb3JlIHByb2Nlc3NpbmcgYWxsIHBlbmRpbmcgZXZlbnRzIHZpYSBFVlRfZ2V0TmV4dC4KLUFsbCBpbmZvcm1hdGlvbiBwb2xsZWQgZnJvbSB0aGUgam95c3RpY2sgd2lsbCBiZSBwb3N0ZWQgdG8gdGhlIGV2ZW50Ci1xdWV1ZSBmb3IgbGF0ZXIgcmV0cmlldmFsLgotCi1Ob3RlOiAgIE1vc3QgYW5hbG9ndWUgam95c3RpY2tzIHdpbGwgcHJvdmlkZSByZWFkaW5ncyB0aGF0IGNoYW5nZSBldmVuCi0JdGhvdWdoIHRoZSBqb3lzdGljayBoYXMgbm90IG1vdmVkLiBIZW5jZSBpZiB5b3UgY2FsbCB0aGlzIHJvdXRpbmUKLQl5b3Ugd2lsbCBsaWtlbHkgZ2V0IGFuIEVWVF9KT1lNT1ZFIGV2ZW50IGV2ZXJ5IHRpbWUgdGhyb3VnaCB5b3VyCi0JZXZlbnQgbG9vcC4KLQotU0VFIEFMU086Ci1FVlRfZ2V0TmV4dCwgRVZUX3BlZWtOZXh0LCBFVlRfam95U2V0VXBwZXJMZWZ0LCBFVlRfam95U2V0TG93ZXJSaWdodCwKLUVWVF9qb3lTZXRDZW50ZXIsIEVWVF9qb3lJc1ByZXNlbnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfcG9sbEpveXN0aWNrKHZvaWQpCi17Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUNhbGlicmF0ZXMgdGhlIGpveXN0aWNrIHVwcGVyIGxlZnQgcG9zaXRpb24KLQotSEVBREVSOgotZXZlbnQuaAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byB6ZXJvIGluIG9uIGJldHRlciBqb3lzdGljayBjYWxpYnJhdGlvbiBmYWN0b3JzLAotd2hpY2ggbWF5IHdvcmsgYmV0dGVyIHRoYW4gdGhlIGRlZmF1bHQgc2ltcGxpc3RpYyBjYWxpYnJhdGlvbiAod2hpY2ggYXNzdW1lcwotdGhlIGpveXN0aWNrIGlzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgaXMgaW5pdGlhbGlzZWQpLgotVG8gdXNlIHRoaXMgZnVuY3Rpb24sIGFzayB0aGUgdXNlciB0byBob2xkIHRoZSBzdGljayBpbiB0aGUgdXBwZXIgbGVmdAotcG9zaXRpb24gYW5kIHRoZW4gaGF2ZSB0aGVtIHByZXNzIGEga2V5IG9yIGJ1dHRvbi4gYW5kIHRoZW4gY2FsbCB0aGlzCi1mdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiB3aWxsIHRoZW4gcmVhZCB0aGUgam95c3RpY2sgYW5kIHVwZGF0ZSB0aGUKLWNhbGlicmF0aW9uIGZhY3RvcnMuCi0KLVVzdWFsbHksIGFzc3VtaW5nIHRoYXQgdGhlIHN0aWNrIHdhcyBjZW50ZXJlZCB3aGVuIHRoZSBldmVudCBsaWJyYXJ5IHdhcwotaW5pdGlhbGl6ZWQsIHlvdSByZWFsbHkgb25seSBuZWVkIHRvIGNhbGwgRVZUX2pveVNldExvd2VyUmlnaHQgc2luY2UgdGhlCi11cHBlciBsZWZ0IHBvc2l0aW9uIGlzIHVzdWFsbHkgYWx3YXlzIDAsMCBvbiBtb3N0IGpveXN0aWNrcy4gSG93ZXZlciwgdGhlCi1zYWZlc3QgcHJvY2VkdXJlIGlzIHRvIGNhbGwgYWxsIHRocmVlIGNhbGlicmF0aW9uIGZ1bmN0aW9ucy4KLQotU0VFIEFMU086Ci1FVlRfam95U2V0VXBwZXJMZWZ0LCBFVlRfam95U2V0TG93ZXJSaWdodCwgRVZUX2pveUlzUHJlc2VudAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9qb3lTZXRVcHBlckxlZnQodm9pZCkKLXsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotQ2FsaWJyYXRlcyB0aGUgam95c3RpY2sgbG93ZXIgcmlnaHQgcG9zaXRpb24KLQotSEVBREVSOgotZXZlbnQuaAotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byB6ZXJvIGluIG9uIGJldHRlciBqb3lzdGljayBjYWxpYnJhdGlvbiBmYWN0b3JzLAotd2hpY2ggbWF5IHdvcmsgYmV0dGVyIHRoYW4gdGhlIGRlZmF1bHQgc2ltcGxpc3RpYyBjYWxpYnJhdGlvbiAod2hpY2ggYXNzdW1lcwotdGhlIGpveXN0aWNrIGlzIGNlbnRlcmVkIHdoZW4gdGhlIGV2ZW50IGxpYnJhcnkgaXMgaW5pdGlhbGlzZWQpLgotVG8gdXNlIHRoaXMgZnVuY3Rpb24sIGFzayB0aGUgdXNlciB0byBob2xkIHRoZSBzdGljayBpbiB0aGUgbG93ZXIgcmlnaHQKLXBvc2l0aW9uIGFuZCB0aGVuIGhhdmUgdGhlbSBwcmVzcyBhIGtleSBvciBidXR0b24uIGFuZCB0aGVuIGNhbGwgdGhpcwotZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gd2lsbCB0aGVuIHJlYWQgdGhlIGpveXN0aWNrIGFuZCB1cGRhdGUgdGhlCi1jYWxpYnJhdGlvbiBmYWN0b3JzLgotCi1Vc3VhbGx5LCBhc3N1bWluZyB0aGF0IHRoZSBzdGljayB3YXMgY2VudGVyZWQgd2hlbiB0aGUgZXZlbnQgbGlicmFyeSB3YXMKLWluaXRpYWxpemVkLCB5b3UgcmVhbGx5IG9ubHkgbmVlZCB0byBjYWxsIEVWVF9qb3lTZXRMb3dlclJpZ2h0IHNpbmNlIHRoZQotdXBwZXIgbGVmdCBwb3NpdGlvbiBpcyB1c3VhbGx5IGFsd2F5cyAwLDAgb24gbW9zdCBqb3lzdGlja3MuIEhvd2V2ZXIsIHRoZQotc2FmZXN0IHByb2NlZHVyZSBpcyB0byBjYWxsIGFsbCB0aHJlZSBjYWxpYnJhdGlvbiBmdW5jdGlvbnMuCi0KLVNFRSBBTFNPOgotRVZUX2pveVNldFVwcGVyTGVmdCwgRVZUX2pveVNldENlbnRlciwgRVZUX2pveUlzUHJlc2VudAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9qb3lTZXRMb3dlclJpZ2h0KHZvaWQpCi17Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUNhbGlicmF0ZXMgdGhlIGpveXN0aWNrIGNlbnRlciBwb3NpdGlvbgotCi1IRUFERVI6Ci1ldmVudC5oCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHplcm8gaW4gb24gYmV0dGVyIGpveXN0aWNrIGNhbGlicmF0aW9uIGZhY3RvcnMsCi13aGljaCBtYXkgd29yayBiZXR0ZXIgdGhhbiB0aGUgZGVmYXVsdCBzaW1wbGlzdGljIGNhbGlicmF0aW9uICh3aGljaCBhc3N1bWVzCi10aGUgam95c3RpY2sgaXMgY2VudGVyZWQgd2hlbiB0aGUgZXZlbnQgbGlicmFyeSBpcyBpbml0aWFsaXNlZCkuCi1UbyB1c2UgdGhpcyBmdW5jdGlvbiwgYXNrIHRoZSB1c2VyIHRvIGhvbGQgdGhlIHN0aWNrIGluIHRoZSBjZW50ZXIKLXBvc2l0aW9uIGFuZCB0aGVuIGhhdmUgdGhlbSBwcmVzcyBhIGtleSBvciBidXR0b24uIGFuZCB0aGVuIGNhbGwgdGhpcwotZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gd2lsbCB0aGVuIHJlYWQgdGhlIGpveXN0aWNrIGFuZCB1cGRhdGUgdGhlCi1jYWxpYnJhdGlvbiBmYWN0b3JzLgotCi1Vc3VhbGx5LCBhc3N1bWluZyB0aGF0IHRoZSBzdGljayB3YXMgY2VudGVyZWQgd2hlbiB0aGUgZXZlbnQgbGlicmFyeSB3YXMKLWluaXRpYWxpemVkLCB5b3UgcmVhbGx5IG9ubHkgbmVlZCB0byBjYWxsIEVWVF9qb3lTZXRMb3dlclJpZ2h0IHNpbmNlIHRoZQotdXBwZXIgbGVmdCBwb3NpdGlvbiBpcyB1c3VhbGx5IGFsd2F5cyAwLDAgb24gbW9zdCBqb3lzdGlja3MuIEhvd2V2ZXIsIHRoZQotc2FmZXN0IHByb2NlZHVyZSBpcyB0byBjYWxsIGFsbCB0aHJlZSBjYWxpYnJhdGlvbiBmdW5jdGlvbnMuCi0KLVNFRSBBTFNPOgotRVZUX2pveVNldFVwcGVyTGVmdCwgRVZUX2pveVNldExvd2VyUmlnaHQsIEVWVF9qb3lTZXRDZW50ZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVEFQSSBFVlRfam95U2V0Q2VudGVyKHZvaWQpCi17Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi9udHNlcnZjLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi9udHNlcnZjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZDlhYTAuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvbnRzZXJ2Yy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggRGlzcGxheSBEb2N0b3IKLSoKLSogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMjAwMSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8VGhpcyBjb3B5cmlnaHRlZCBjb21wdXRlciBjb2RlIGlzIGEgcHJvcHJpZXRhcnkgdHJhZGUgc2VjcmV0IG9mICAgICB8Ci0qICB8U2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiwgbG9jYXRlZCBhdCA1MDUgV2FsbCBTdHJlZXQsIENoaWNvLCBDQSA5NTkyOCB8Ci0qICB8VVNBICh3d3cuc2NpdGVjaHNvZnQuY29tKS4gIEFOWSBVTkFVVEhPUklaRUQgUE9TU0VTU0lPTiwgVVNFLCAgICAgICB8Ci0qICB8VklFV0lORywgQ09QWUlORywgTU9ESUZJQ0FUSU9OIE9SIERJU1NFTUlOQVRJT04gT0YgVEhJUyBDT0RFIElTICAgICB8Ci0qICB8U1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVcuICBVbmxlc3MgeW91IGhhdmUgY3VycmVudCwgZXhwcmVzcyAgICAgICB8Ci0qICB8d3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gU2NpVGVjaCB0byBwb3NzZXNzIG9yIHVzZSB0aGlzIGNvZGUsIHlvdSB8Ci0qICB8bWF5IGJlIHN1YmplY3QgdG8gY2l2aWwgYW5kL29yIGNyaW1pbmFsIHBlbmFsdGllcy4gICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8SWYgeW91IHJlY2VpdmVkIHRoaXMgY29kZSBpbiBlcnJvciBvciB5b3Ugd291bGQgbGlrZSB0byByZXBvcnQgICAgICB8Ci0qICB8aW1wcm9wZXIgdXNlLCBwbGVhc2UgaW1tZWRpYXRlbHkgY29udGFjdCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuIGF0ICB8Ci0qICB8NTMwLTg5NC04NDAwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qICB8UkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhJUyBIRUFERVIgSVMgU1RSSUNUTFkgUFJPSElCSVRFRCBCWSBMQVd8Ci0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgV2luZG93cyBOVCwgV2luZG93cyAySyBvciBXaW5kb3dzIFhQLgotKgotKiBEZXNjcmlwdGlvbjogIE1haW4gbW9kdWxlIHRvIGRvIHRoZSBpbnN0YWxsYXRpb24gb2YgdGhlIFNERCBhbmQgR0xEaXJlY3QKLSogICAgICAgICAgICAgICBkZXZpY2UgZHJpdmVyIGNvbXBvbmVudHMgdW5kZXIgV2luZG93cyBOVC8ySy9YUC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgIndpbjMyL29zaGRyLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc3pEcml2ZXJOYW1lICAgIC0gQWN0dWFsIG5hbWUgb2YgdGhlIGRyaXZlciB0byBpbnN0YWxsIGluIHRoZSBzeXN0ZW0KLXN6U2VydmljZU5hbWUgICAtIE5hbWUgb2YgdGhlIHNlcnZpY2UgdG8gY3JlYXRlCi1zekxvYWRHcm91cCAgICAgLSBMb2FkIGdyb3VwIGZvciB0aGUgZHJpdmVyIChOVUxMIGZvciBub3JtYWwgZHJpdmVycykKLWR3U2VydmljZVR5cGUgICAtIFNlcnZpY2UgdHlwZSB0byBjcmVhdGUKLQotUkVUVVJOUzoKLVRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZS4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gZG9lcyBhbGwgdGhlIHdvcmsgdG8gaW5zdGFsbCB0aGUgZHJpdmVyIGludG8gdGhlIHN5c3RlbS4KLVRoZSBkcml2ZXIgaXMgbm90IGhvd2V2ZXIgYWN0aXZhdGVkOyBmb3IgdGhhdCB5b3UgbXVzdCB1c2UgdGhlIFN0YXJ0X1NkZEZpbHQKLWZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIFBNQVBJIFBNX2luc3RhbGxTZXJ2aWNlKAotICAgIGNvbnN0IGNoYXIgKnN6RHJpdmVyTmFtZSwKLSAgICBjb25zdCBjaGFyICpzelNlcnZpY2VOYW1lLAotICAgIGNvbnN0IGNoYXIgKnN6TG9hZEdyb3VwLAotICAgIHVsb25nIGR3U2VydmljZVR5cGUpCi17Ci0gICAgU0NfSEFORExFICAgc2NtSGFuZGxlOwotICAgIFNDX0hBTkRMRSAgIGRyaXZlckhhbmRsZTsKLSAgICBjaGFyICAgICAgICBzekRyaXZlclBhdGhbTUFYX1BBVEhdOwotICAgIEhLRVkgICAgICAgIGtleTsKLSAgICBjaGFyICAgICAgICBrZXlQYXRoW01BWF9QQVRIXTsKLSAgICB1bG9uZyAgICAgICBzdGF0dXM7Ci0KLSAgICAvKiBPYnRhaW4gYSBoYW5kbGUgdG8gdGhlIHNlcnZpY2UgY29udHJvbCBtYW5hZ2VyIHJlcXVlc3RpbmcgYWxsIGFjY2VzcyAqLwotICAgIGlmICgoc2NtSGFuZGxlID0gT3BlblNDTWFuYWdlcihOVUxMLCBOVUxMLCBTQ19NQU5BR0VSX0FMTF9BQ0NFU1MpKSA9PSBOVUxMKQotCXJldHVybiBHZXRMYXN0RXJyb3IoKTsKLQotICAgIC8qIEZpbmQgdGhlIHBhdGggdG8gdGhlIGRyaXZlciBpbiBzeXN0ZW0gZGlyZWN0b3J5ICovCi0gICAgR2V0U3lzdGVtRGlyZWN0b3J5KHN6RHJpdmVyUGF0aCwgc2l6ZW9mKHN6RHJpdmVyUGF0aCkpOwotICAgIHN0cmNhdChzekRyaXZlclBhdGgsICJcXGRyaXZlcnNcXCIpOwotICAgIHN0cmNhdChzekRyaXZlclBhdGgsIHN6RHJpdmVyTmFtZSk7Ci0KLSAgICAvKiBDcmVhdGUgdGhlIHNlcnZpY2Ugd2l0aCB0aGUgU2VydmljZSBDb250cm9sIE1hbmFnZXIuICovCi0gICAgZHJpdmVySGFuZGxlID0gQ3JlYXRlU2VydmljZShzY21IYW5kbGUsCi0JCQkJIHN6U2VydmljZU5hbWUsCi0JCQkJIHN6U2VydmljZU5hbWUsCi0JCQkJIFNFUlZJQ0VfQUxMX0FDQ0VTUywKLQkJCQkgZHdTZXJ2aWNlVHlwZSwKLQkJCQkgU0VSVklDRV9CT09UX1NUQVJULAotCQkJCSBTRVJWSUNFX0VSUk9SX05PUk1BTCwKLQkJCQkgc3pEcml2ZXJQYXRoLAotCQkJCSBzekxvYWRHcm91cCwKLQkJCQkgTlVMTCwKLQkJCQkgTlVMTCwKLQkJCQkgTlVMTCwKLQkJCQkgTlVMTCk7Ci0KLSAgICAvKiBDaGVjayB0byBzZWUgaWYgdGhlIGRyaXZlciBjb3VsZCBhY3R1YWxseSBiZSBpbnN0YWxsZWQuICovCi0gICAgaWYgKCFkcml2ZXJIYW5kbGUpIHsKLQlzdGF0dXMgPSBHZXRMYXN0RXJyb3IoKTsKLQlDbG9zZVNlcnZpY2VIYW5kbGUoc2NtSGFuZGxlKTsKLQlyZXR1cm4gc3RhdHVzOwotCX0KLQotICAgIC8qIEdldCBhIGhhbmRsZSB0byB0aGUga2V5IGZvciBkcml2ZXIgc28gdGhhdCBpdCBjYW4gYmUgYWx0ZXJlZCBpbiB0aGUgKi8KLSAgICAvKiBuZXh0IHN0ZXAuICovCi0gICAgc3RyY3B5KGtleVBhdGgsICJTWVNURU1cXEN1cnJlbnRDb250cm9sU2V0XFxTZXJ2aWNlc1xcIik7Ci0gICAgc3RyY2F0KGtleVBhdGgsIHN6U2VydmljZU5hbWUpOwotICAgIGlmICgoc3RhdHVzID0gUmVnT3BlbktleUV4KEhLRVlfTE9DQUxfTUFDSElORSxrZXlQYXRoLDAsS0VZX0FMTF9BQ0NFU1MsJmtleSkpICE9IEVSUk9SX1NVQ0NFU1MpIHsKLQkvKiBBIHByb2JsZW0gaGFzIG9jY3VyZWQuIERlbGV0ZSB0aGUgc2VydmljZSBzbyB0aGF0IGl0IGlzIG5vdCBpbnN0YWxsZWQuICovCi0Jc3RhdHVzID0gR2V0TGFzdEVycm9yKCk7Ci0JRGVsZXRlU2VydmljZShkcml2ZXJIYW5kbGUpOwotCUNsb3NlU2VydmljZUhhbmRsZShkcml2ZXJIYW5kbGUpOwotCUNsb3NlU2VydmljZUhhbmRsZShzY21IYW5kbGUpOwotCXJldHVybiBzdGF0dXM7Ci0JfQotCi0gICAgLyogRGVsZXRlIHRoZSBJbWFnZVBhdGggdmFsdWUgaW4gdGhlIG5ld2x5IGNyZWF0ZWQga2V5IHNvIHRoYXQgdGhlICovCi0gICAgLyogc3lzdGVtIGxvb2tzIGZvciB0aGUgZHJpdmVyIGluIHRoZSBub3JtYWwgbG9jYXRpb24uICovCi0gICAgaWYgKChzdGF0dXMgPSBSZWdEZWxldGVWYWx1ZShrZXksICJJbWFnZVBhdGgiKSkgIT0gRVJST1JfU1VDQ0VTUykgewotCS8qIEEgcHJvYmxlbSBoYXMgb2NjdXJyZWQuIERlbGV0ZSB0aGUgc2VydmljZSBzbyB0aGF0IGl0IGlzIG5vdCAqLwotCS8qIGluc3RhbGxlZCBhbmQgd2lsbCBub3QgdHJ5IHRvIHN0YXJ0LiAqLwotCVJlZ0Nsb3NlS2V5KGtleSk7Ci0JRGVsZXRlU2VydmljZShkcml2ZXJIYW5kbGUpOwotCUNsb3NlU2VydmljZUhhbmRsZShkcml2ZXJIYW5kbGUpOwotCUNsb3NlU2VydmljZUhhbmRsZShzY21IYW5kbGUpOwotCXJldHVybiBzdGF0dXM7Ci0JfQotCi0gICAgLyogQ2xlYW4gdXAgYW5kIGV4aXQgKi8KLSAgICBSZWdDbG9zZUtleShrZXkpOwotICAgIENsb3NlU2VydmljZUhhbmRsZShkcml2ZXJIYW5kbGUpOwotICAgIENsb3NlU2VydmljZUhhbmRsZShzY21IYW5kbGUpOwotICAgIHJldHVybiBFUlJPUl9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXN6U2VydmljZU5hbWUgICAtIE5hbWUgb2YgdGhlIHNlcnZpY2UgdG8gc3RhcnQKLQotUkVUVVJOUzoKLVRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZS4KLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzdGFydCB0aGUgc3BlY2lmaWVkIHNlcnZpY2UgYW5kIG1ha2UgaXQgYWN0aXZlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIFBNQVBJIFBNX3N0YXJ0U2VydmljZSgKLSAgICBjb25zdCBjaGFyICpzelNlcnZpY2VOYW1lKQotewotICAgIFNDX0hBTkRMRSAgICAgICBzY21IYW5kbGU7Ci0gICAgU0NfSEFORExFICAgICAgIGRyaXZlckhhbmRsZTsKLSAgICBTRVJWSUNFX1NUQVRVUwlzZXJ2aWNlU3RhdHVzOwotICAgIHVsb25nICAgICAgICAgICBzdGF0dXM7Ci0KLSAgICAvKiBPYnRhaW4gYSBoYW5kbGUgdG8gdGhlIHNlcnZpY2UgY29udHJvbCBtYW5hZ2VyIHJlcXVlc3RpbmcgYWxsIGFjY2VzcyAqLwotICAgIGlmICgoc2NtSGFuZGxlID0gT3BlblNDTWFuYWdlcihOVUxMLCBOVUxMLCBTQ19NQU5BR0VSX0FMTF9BQ0NFU1MpKSA9PSBOVUxMKQotCXJldHVybiBHZXRMYXN0RXJyb3IoKTsKLQotICAgIC8qIE9wZW4gdGhlIHNlcnZpY2Ugd2l0aCB0aGUgU2VydmljZSBDb250cm9sIE1hbmFnZXIuICovCi0gICAgaWYgKChkcml2ZXJIYW5kbGUgPSBPcGVuU2VydmljZShzY21IYW5kbGUsc3pTZXJ2aWNlTmFtZSxTRVJWSUNFX0FMTF9BQ0NFU1MpKSA9PSBOVUxMKSB7Ci0Jc3RhdHVzID0gR2V0TGFzdEVycm9yKCk7Ci0JQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbUhhbmRsZSk7Ci0JcmV0dXJuIHN0YXR1czsKLQl9Ci0KLSAgICAvKiBTdGFydCB0aGUgc2VydmljZSAqLwotICAgIGlmICghU3RhcnRTZXJ2aWNlKGRyaXZlckhhbmRsZSwwLE5VTEwpKSB7Ci0Jc3RhdHVzID0gR2V0TGFzdEVycm9yKCk7Ci0JQ2xvc2VTZXJ2aWNlSGFuZGxlKGRyaXZlckhhbmRsZSk7Ci0JQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbUhhbmRsZSk7Ci0JcmV0dXJuIHN0YXR1czsKLQl9Ci0KLSAgICAvKiBRdWVyeSB0aGUgc2VydmljZSB0byBtYWtlIHN1cmUgaXQgaXMgdGhlcmUgKi8KLSAgICBpZiAoIVF1ZXJ5U2VydmljZVN0YXR1cyhkcml2ZXJIYW5kbGUsJnNlcnZpY2VTdGF0dXMpKSB7Ci0Jc3RhdHVzID0gR2V0TGFzdEVycm9yKCk7Ci0JQ2xvc2VTZXJ2aWNlSGFuZGxlKGRyaXZlckhhbmRsZSk7Ci0JQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbUhhbmRsZSk7Ci0JcmV0dXJuIHN0YXR1czsKLQl9Ci0gICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKGRyaXZlckhhbmRsZSk7Ci0gICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbUhhbmRsZSk7Ci0gICAgcmV0dXJuIEVSUk9SX1NVQ0NFU1M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc3pTZXJ2aWNlTmFtZSAgIC0gTmFtZSBvZiB0aGUgc2VydmljZSB0byBzdG9wCi0KLVJFVFVSTlM6Ci1UcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc3RvcCB0aGUgc3BlY2lmaWVkIHNlcnZpY2UgYW5kIGRpc2FibGUgaXQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgUE1BUEkgUE1fc3RvcFNlcnZpY2UoCi0gICAgY29uc3QgY2hhciAqc3pTZXJ2aWNlTmFtZSkKLXsKLSAgICBTQ19IQU5ETEUgICAgICAgc2NtSGFuZGxlOwotICAgIFNDX0hBTkRMRSAgICAgICBkcml2ZXJIYW5kbGU7Ci0gICAgU0VSVklDRV9TVEFUVVMJc2VydmljZVN0YXR1czsKLSAgICB1bG9uZyAgICAgICAgICAgc3RhdHVzOwotCi0gICAgLyogT2J0YWluIGEgaGFuZGxlIHRvIHRoZSBzZXJ2aWNlIGNvbnRyb2wgbWFuYWdlciByZXF1ZXN0aW5nIGFsbCBhY2Nlc3MgKi8KLSAgICBpZiAoKHNjbUhhbmRsZSA9IE9wZW5TQ01hbmFnZXIoTlVMTCwgTlVMTCwgU0NfTUFOQUdFUl9BTExfQUNDRVNTKSkgPT0gTlVMTCkKLQlyZXR1cm4gR2V0TGFzdEVycm9yKCk7Ci0KLSAgICAvKiBPcGVuIHRoZSBzZXJ2aWNlIHdpdGggdGhlIFNlcnZpY2UgQ29udHJvbCBNYW5hZ2VyLiAqLwotICAgIGlmICgoZHJpdmVySGFuZGxlID0gT3BlblNlcnZpY2Uoc2NtSGFuZGxlLHN6U2VydmljZU5hbWUsU0VSVklDRV9BTExfQUNDRVNTKSkgPT0gTlVMTCkgewotCXN0YXR1cyA9IEdldExhc3RFcnJvcigpOwotCUNsb3NlU2VydmljZUhhbmRsZShzY21IYW5kbGUpOwotCXJldHVybiBzdGF0dXM7Ci0JfQotCi0gICAgLyogU3RvcCB0aGUgc2VydmljZSBmcm9tIHJ1bm5pbmcgKi8KLSAgICBpZiAoIUNvbnRyb2xTZXJ2aWNlKGRyaXZlckhhbmRsZSwgU0VSVklDRV9DT05UUk9MX1NUT1AsICZzZXJ2aWNlU3RhdHVzKSkgewotCXN0YXR1cyA9IEdldExhc3RFcnJvcigpOwotCUNsb3NlU2VydmljZUhhbmRsZShkcml2ZXJIYW5kbGUpOwotCUNsb3NlU2VydmljZUhhbmRsZShzY21IYW5kbGUpOwotCXJldHVybiBzdGF0dXM7Ci0JfQotICAgIENsb3NlU2VydmljZUhhbmRsZShkcml2ZXJIYW5kbGUpOwotICAgIENsb3NlU2VydmljZUhhbmRsZShzY21IYW5kbGUpOwotICAgIHJldHVybiBFUlJPUl9TVUNDRVNTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXN6U2VydmljZU5hbWUgICAtIE5hbWUgb2YgdGhlIHNlcnZpY2UgdG8gcmVtb3ZlCi0KLVJFVFVSTlM6Ci1UcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUuCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVtb3ZlIGEgc2VydmljZSBjb21wbGV0ZWx5IGZyb20gdGhlIHN5c3RlbS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBQTUFQSSBQTV9yZW1vdmVTZXJ2aWNlKAotICAgIGNvbnN0IGNoYXIgKnN6U2VydmljZU5hbWUpCi17Ci0gICAgU0NfSEFORExFICAgc2NtSGFuZGxlOwotICAgIFNDX0hBTkRMRSAgIGRyaXZlckhhbmRsZTsKLSAgICB1bG9uZyAgICAgICBzdGF0dXM7Ci0KLSAgICAvKiBPYnRhaW4gYSBoYW5kbGUgdG8gdGhlIHNlcnZpY2UgY29udHJvbCBtYW5hZ2VyIHJlcXVlc3RpbmcgYWxsIGFjY2VzcyAqLwotICAgIGlmICgoc2NtSGFuZGxlID0gT3BlblNDTWFuYWdlcihOVUxMLCBOVUxMLCBTQ19NQU5BR0VSX0FMTF9BQ0NFU1MpKSA9PSBOVUxMKQotCXJldHVybiBHZXRMYXN0RXJyb3IoKTsKLQotICAgIC8qIE9wZW4gdGhlIHNlcnZpY2Ugd2l0aCB0aGUgU2VydmljZSBDb250cm9sIE1hbmFnZXIuICovCi0gICAgaWYgKChkcml2ZXJIYW5kbGUgPSBPcGVuU2VydmljZShzY21IYW5kbGUsc3pTZXJ2aWNlTmFtZSxTRVJWSUNFX0FMTF9BQ0NFU1MpKSA9PSBOVUxMKSB7Ci0Jc3RhdHVzID0gR2V0TGFzdEVycm9yKCk7Ci0JQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjbUhhbmRsZSk7Ci0JcmV0dXJuIHN0YXR1czsKLQl9Ci0KLSAgICAvKiBSZW1vdmUgdGhlIHNlcnZpY2UgKi8KLSAgICBpZiAoIURlbGV0ZVNlcnZpY2UoZHJpdmVySGFuZGxlKSkgewotCXN0YXR1cyA9IEdldExhc3RFcnJvcigpOwotCUNsb3NlU2VydmljZUhhbmRsZShkcml2ZXJIYW5kbGUpOwotCUNsb3NlU2VydmljZUhhbmRsZShzY21IYW5kbGUpOwotCXJldHVybiBzdGF0dXM7Ci0JfQotICAgIENsb3NlU2VydmljZUhhbmRsZShkcml2ZXJIYW5kbGUpOwotICAgIENsb3NlU2VydmljZUhhbmRsZShzY21IYW5kbGUpOwotICAgIHJldHVybiBFUlJPUl9TVUNDRVNTOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvb3NoZHIuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL29zaGRyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNTllOTAuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvb3NoZHIuaAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIFdpbjMyCi0qCi0qIERlc2NyaXB0aW9uOiAgSW5jbHVkZSBmaWxlIHRvIGluY2x1ZGUgYWxsIE9TIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2RlZmluZSBTVFJJQ1QKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8bW1zeXN0ZW0uaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotI2RlZmluZSBOT05BTUVMRVNTVU5JT04KLSNpbmNsdWRlICJwbS9kZHJhdy5oIgotCi0vKiBNYWNyb3MgdG8gc2F2ZSBhbmQgcmVzdG9yZSB0aGUgZGVmYXVsdCBjb250cm9sIHdvcmQuIFdpbmRvd3MgOXggaGFzCi0gKiBzb21lIGJ1Z3MgaW4gaXQgc3VjaCB0aGF0IGNhbGxzIHRvIGxvYWQgYW55IERMTCdzIHdoaWNoIGxvYWQgMTYtYml0Ci0gKiBETEwncyBjYXVzZSB0aGUgZmxvYXRpbmcgcG9pbnQgY29udHJvbCB3b3JkIHRvIGdldCB0cmFzaGVkLiBXZSBmaXgKLSAqIHRoaXMgYnkgc2F2aW5nIGFuZCByZXN0b3JpbmcgdGhlIGNvbnRyb2wgd29yZCBhY3Jvc3MgcHJvYmxlbWF0aWMKLSAqIGNhbGxzLgotICovCi0KLSNpZiBkZWZpbmVkKF9fSU5URUxfXykKLSNkZWZpbmUgR0VUX0RFRkFVTFRfQ1coKSAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKF9QTV9jd19kZWZhdWx0ID09IDApICAgICAgICAgICAgICAgIFwKLQlfUE1fY3dfZGVmYXVsdCA9IF9jb250cm9sODcoMCwwKTsgICBcCi19Ci0jZGVmaW5lIFJFU0VUX0RFRkFVTFRfQ1coKSAgICAgICAgICAgICAgICAgIFwKLSAgICBfY29udHJvbDg3KF9QTV9jd19kZWZhdWx0LDB4RkZGRkZGRkYpCi0jZWxzZQotI2RlZmluZSBHRVRfREVGQVVMVF9DVygpCi0jZGVmaW5lIFJFU0VUX0RFRkFVTFRfQ1coKQotI2VuZGlmCi0KLS8qIEN1c3RvbSB3aW5kb3cgbWVzc2FnZXMgKi8KLQotI2RlZmluZQlXTV9ET19TVVNQRU5EX0FQUAkJCVdNX1VTRVIKLSNkZWZpbmUJV01fUE1fTEVBVkVfRlVMTFNDUkVFTgkgICAgMAotI2RlZmluZQlXTV9QTV9SRVNUT1JFX0ZVTExTQ1JFRU4JMQotCi0vKiBNYWNybyBmb3IgZGlzYWJsaW5nIEF1dG9QbGF5IG9uIGEgdXNlIHN5c3RlbSAqLwotCi0jZGVmaW5lIEFVVE9QTEFZX0RSSVZFX0NEUk9NICAgIDB4MjAKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmICBfX0lOVEVMX18KLWV4dGVybiB1aW50ICAgICBfUE1fY3dfZGVmYXVsdDsgICAgICAgICAvKiBEZWZhdWx0IEZQVSBjb250cm9sIHdvcmQgICAgICovCi0jZW5kaWYKLWV4dGVybiBpbnQgICAgICBfUE1fZGVza1gsX1BNX2Rlc2tZOyAgICAvKiBEZXNrdG9wIGRpbWVuc2lvbnMgICAgICAgICAgICovCi1leHRlcm4gSFdORCAgICAgX1BNX2h3bmRDb25zb2xlOyAgICAgICAgLyogV2luZG93IGhhbmRsZSBmb3IgY29uc29sZSAgICAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEludGVybmFsIEZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIF9FVlRfcHVtcE1lc3NhZ2VzKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvcG0uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL3BtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZmRiY2MuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvcG0uYworKysgL2Rldi9udWxsCkBAIC0xLDE0NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgV2luMzIKLSoKLSogRGVzY3JpcHRpb246ICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeSwgd2hpY2gKLSogICAgICAgICAgICAgICBjb250YWlucyBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IE9TIHNwZWNpZmljIHNlcnZpY2VzIGluIGEKLSogICAgICAgICAgICAgICBnZW5lcmljLCBjcm9zcyBwbGF0Zm9ybSBBUEkuIFBvcnRpbmcgdGhlIE9TIFBvcnRhYmlsaXR5Ci0qICAgICAgICAgICAgICAgTWFuYWdlciBsaWJyYXJ5IGlzIHRoZSBmaXJzdCBzdGVwIHRvIHBvcnRpbmcgYW55IFNjaVRlY2gKLSogICAgICAgICAgICAgICBwcm9kdWN0cyB0byBhIG5ldyBwbGF0Zm9ybS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2RlZmluZSBTVFJJQ1QKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8bW1zeXN0ZW0uaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGRpcmVjdC5oPgotI2luY2x1ZGUgInBtYXBpLmgiCi0jaW5jbHVkZSAiZHJ2bGliL29zL29zLmgiCi0jaW5jbHVkZSAicG1faGVscC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1pYm9vbCAgICAgICAgICAgX1BNX2hhdmVXaW5OVDsgICAgICAvKiBUcnVlIGlmIHdlIGFyZSBydW5uaW5nIG9uIE5UICAgICAqLwotc3RhdGljIHVpbnQgICAgIFZFU0FCdWZfbGVuID0gMTAyNDsgLyogTGVuZ3RoIG9mIHRoZSBWRVNBQnVmIGJ1ZmZlciAgICAgKi8KLXN0YXRpYyB2b2lkICAgICAqVkVTQUJ1Zl9wdHIgPSBOVUxMOy8qIE5lYXIgcG9pbnRlciB0byBWRVNBQnVmICAgICAgICAgICovCi1zdGF0aWMgdWludCAgICAgVkVTQUJ1Zl9yc2VnOyAgICAgICAvKiBSZWFsIG1vZGUgc2VnbWVudCBvZiBWRVNBQnVmICAgICAqLwotc3RhdGljIHVpbnQgICAgIFZFU0FCdWZfcm9mZjsgICAgICAgLyogUmVhbCBtb2RlIG9mZnNldCBvZiBWRVNBQnVmICAgICAgKi8KLUhBTkRMRSAgICAgICAgICBfUE1faERldmljZSA9IE5VTEw7IC8qIEhhbmRsZSB0byBXaW4zMiBWeEQgICAgICAgICAgICAgICovCi1zdGF0aWMgaWJvb2wgICAgaW5pdGVkID0gZmFsc2U7ICAgICAvKiBGbGFncyBpZiB3ZSBhcmUgaW5pdGlhbGlzZWQgICAgICAqLwotc3RhdGljIHZvaWQgICAgIChQTUFQSVAgZmF0YWxFcnJvckNsZWFudXApKHZvaWQpID0gTlVMTDsKLQotc3RhdGljIGNoYXIgKnN6TWFjaGluZU5hbWVLZXkgICA9ICJTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxDb21wdXRlck5hbWVcXENvbXB1dGVyTmFtZSI7Ci1zdGF0aWMgY2hhciAqc3pNYWNoaW5lTmFtZUtleU5UID0gIlN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXENvbXB1dGVyTmFtZVxcQWN0aXZlQ29tcHV0ZXJOYW1lIjsKLXN0YXRpYyBjaGFyICpzek1hY2hpbmVOYW1lICAgICAgPSAiQ29tcHV0ZXJOYW1lIjsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogTWFjcm8gdG8gY2hlY2sgZm9yIGEgdmFsaWQsIGxvYWRlZCB2ZXJzaW9uIG9mIFBNSEVMUC4gV2UgY2hlY2sgdGhpcwotICogb24gZGVtYW5kIHdoZW4gd2UgbmVlZCB0aGVzZSBzZXJ2aWNlcyByYXRoZXIgdGhhbiB3aGVuIFBNX2luaXQoKSBpcwotICogY2FsbGVkIGJlY2F1c2UgaWYgd2UgYXJlIHJ1bm5pbmcgb24gRGlyZWN0RHJhdyB3ZSBkb24ndCBuZWVkIFBNSEVMUC5WWEQuCi0gKi8KLQotI2RlZmluZSBDSEVDS19GT1JfUE1IRUxQKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKF9QTV9oRGV2aWNlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWlmIChfUE1faGF2ZVdpbk5UKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gY29ubmVjdCB0byBQTUhFTFAuU1lTIG9yIFNEREhFTFAuU1lTISIpOyBcCi0JZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgUE1fZmF0YWxFcnJvcigiVW5hYmxlIHRvIGNvbm5lY3QgdG8gUE1IRUxQLlZYRCBvciBTRERIRUxQLlZYRCEiKTsgXAotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIFBNIGxpYnJhcnkgYW5kIGNvbm5lY3QgdG8gb3VyIGhlbHBlciBkZXZpY2UgZHJpdmVyLiBJZiB3ZQotY2Fubm90IGNvbm5lY3QgdG8gb3VyIGhlbHBlciBkZXZpY2UgZHJpdmVyLCB3ZSBiYWlsIG91dCB3aXRoIGFuIGVycm9yCi1tZXNzYWdlLiBPdXIgV2luZG93cyA5eCBWeEQgaXMgZHluYW1pY2FsbHkgbG9hZGFibGUsIHNvIGl0IGNhbiBiZSBsb2FkZWQKLWFmdGVyIHRoZSBzeXN0ZW0gaGFzIHN0YXJ0ZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9pbml0KHZvaWQpCi17Ci0gICAgRFdPUkQgICBpbkJ1ZlsxXTsgICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLwotICAgIERXT1JEICAgb3V0QnVmWzFdOyAgLyogQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIFZ4RCAgKi8KLSAgICBEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCi0gICAgY2hhciAgICBjbnRQYXRoW1BNX01BWF9QQVRIXTsKLSAgICBjaGFyICAgICplbnY7Ci0KLSAgICAvKiBDcmVhdGUgYSBmaWxlIGhhbmRsZSBmb3IgdGhlIHN0YXRpYyBWeEQgaWYgcG9zc2libGUsIG90aGVyd2lzZQotICAgICAqIGR5bmFtaWNhbGx5IGxvYWQgdGhlIFBNSEVMUCBoZWxwZXIgVnhELiBOb3RlIHRoYXQgaWYgYW4gb2xkIHZlcnNpb24KLSAgICAgKiBvZiBTREQgaXMgbG9hZGVkLCB3ZSB1c2UgdGhlIFBNSEVMUCBWeEQgaW5zdGVhZC4KLSAgICAgKi8KLSAgICBpZiAoIWluaXRlZCkgewotCS8qIERldGVybWluZSBpZiB3ZSBhcmUgcnVubmluZyB1bmRlciBXaW5kb3dzIE5UIG9yIG5vdCBhbmQKLQkgKiBzZXQgdGhlIGdsb2JhbCBPUyB0eXBlIHZhcmlhYmxlLgotCSAqLwotCV9QTV9oYXZlV2luTlQgPSBmYWxzZTsKLQlpZiAoKEdldFZlcnNpb24oKSAmIDB4ODAwMDAwMDBVTCkgPT0gMCkKLQkgICAgX1BNX2hhdmVXaW5OVCA9IHRydWU7Ci0JX19fZHJ2X29zX3R5cGUgPSAoX1BNX2hhdmVXaW5OVCkgPyBfT1NfV0lOTlQgOiBfT1NfV0lOOTU7Ci0KLQkvKiBOb3cgdHJ5IHRvIGNvbm5lY3QgdG8gU0RESEVMUC5WWEQgb3IgU0RESEVMUC5TWVMgKi8KLQlfUE1faERldmljZSA9IENyZWF0ZUZpbGUoU0RESEVMUF9NT0RVTEVfUEFUSCwgMCwwLDAsIENSRUFURV9ORVcsIEZJTEVfRkxBR19ERUxFVEVfT05fQ0xPU0UsIDApOwotCWlmIChfUE1faERldmljZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotCSAgICBpZiAoIURldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0dFVFZFUjMyLCBOVUxMLCAwLAotCQkgICAgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSB8fCBvdXRCdWZbMF0gPCBQTUhFTFBfVkVSU0lPTikgewotCQkvKiBPbGQgdmVyc2lvbiBvZiBTRERIRUxQIGxvYWRlZCwgc28gdXNlIFBNSEVMUCBpbnN0ZWFkICovCi0JCUNsb3NlSGFuZGxlKF9QTV9oRGV2aWNlKTsKLQkJX1BNX2hEZXZpY2UgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKLQkJfQotCSAgICB9Ci0JaWYgKF9QTV9oRGV2aWNlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0JICAgIC8qIEZpcnN0IHRyeSB0byBzZWUgaWYgdGhlcmUgaXMgYSBjdXJyZW50bHkgbG9hZGVkIFBNSEVMUCBkcml2ZXIuCi0JICAgICAqIFRoaXMgaXMgdXN1YWxseSB0aGUgY2FzZSB3aGVuIHdlIGFyZSBydW5uaW5nIHVuZGVyIFdpbmRvd3MgTlQvMksuCi0JICAgICAqLwotCSAgICBfUE1faERldmljZSA9IENyZWF0ZUZpbGUoUE1IRUxQX01PRFVMRV9QQVRILCAwLDAsMCwgQ1JFQVRFX05FVywgRklMRV9GTEFHX0RFTEVURV9PTl9DTE9TRSwgMCk7Ci0JICAgIGlmIChfUE1faERldmljZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotCQkvKiBUaGUgZHJpdmVyIHdhcyBub3Qgc3RhdGljbHkgbG9hZGVkLCBzbyB0cnkgY3JlYXRpbmcgYSBmaWxlIGhhbmRsZQotCQkgKiB0byBhIGR5bmFtaWMgdmVyc2lvbiBvZiB0aGUgVnhEIGlmIHBvc3NpYmxlLiBOb3RlIHRoYXQgb24gV2luTlQvMksgd2UKLQkJICogY2Fubm90IHN1cHBvcnQgZHluYW1pY2FsbHkgbG9hZGluZyB0aGUgZHJpdmVycy4KLQkJICovCi0JCV9QTV9oRGV2aWNlID0gQ3JlYXRlRmlsZShQTUhFTFBfVlhEX1BBVEgsIDAsMCwwLCBDUkVBVEVfTkVXLCBGSUxFX0ZMQUdfREVMRVRFX09OX0NMT1NFLCAwKTsKLQkJfQotCSAgICB9Ci0JaWYgKF9QTV9oRGV2aWNlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0JICAgIC8qIENhbGwgdGhlIGRyaXZlciB0byBkZXRlcm1pbmUgdGhlIHZlcnNpb24gbnVtYmVyICovCi0JICAgIGlmICghRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfR0VUVkVSMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAotCQkgICAgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSB8fCBvdXRCdWZbMF0gPCBQTUhFTFBfVkVSU0lPTikgewotCQlpZiAoX1BNX2hhdmVXaW5OVCkKLQkJICAgIFBNX2ZhdGFsRXJyb3IoIk9sZGVyIHZlcnNpb24gb2YgUE1IRUxQLlNZUyBmb3VuZCEiKTsKLQkJZWxzZQotCQkgICAgUE1fZmF0YWxFcnJvcigiT2xkZXIgdmVyc2lvbiBvZiBQTUhFTFAuVlhEIGZvdW5kISIpOwotCQl9Ci0KLQkgICAgLyogTm93IHNldCB0aGUgY3VycmVudCBwYXRoIGluc2lkZSB0aGUgVnhEIHNvIGl0IGtub3dzIHdoYXQgdGhlCi0JICAgICAqIGN1cnJlbnQgZGlyZWN0b3J5IGlzIGZvciBsb2FkaW5nIE51Y2xldXMgZHJpdmVycy4KLQkgICAgICovCi0JICAgIGluQnVmWzBdID0gKHVsb25nKVBNX2dldEN1cnJlbnRQYXRoKGNudFBhdGgsc2l6ZW9mKGNudFBhdGgpKTsKLQkgICAgaWYgKCFEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9TRVRDTlRQQVRIMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLCBvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpKQotCQlQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gc2V0IFZ4RCBjdXJyZW50IHBhdGghIik7Ci0KLQkgICAgLyogTm93IHBhc3MgZG93biB0aGUgTlVDTEVVU19QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSBkZXZpY2UKLQkgICAgICogZHJpdmVyIHNvIGl0IGNhbiB1c2UgdGhpcyB2YWx1ZSBpZiBpdCBpcyBmb3VuZC4KLQkgICAgICovCi0JICAgIGlmICgoZW52ID0gZ2V0ZW52KCJOVUNMRVVTX1BBVEgiKSkgIT0gTlVMTCkgewotCQlpbkJ1ZlswXSA9ICh1bG9uZyllbnY7Ci0JCWlmICghRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfU0VUTlVDTEVVU1BBVEgzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkpCi0JCSAgICBQTV9mYXRhbEVycm9yKCJVbmFibGUgdG8gc2V0IFZ4RCBOdWNsZXVzIHBhdGghIik7Ci0JCX0KLQotCSAgICAvKiBFbmFibGUgSU9QTCBmb3IgcmluZy0zIGNvZGUgYnkgZGVmYXVsdCBpZiBkcml2ZXIgaXMgcHJlc2VudCAqLwotCSAgICBpZiAoX1BNX2hhdmVXaW5OVCkKLQkJUE1fc2V0SU9QTCgzKTsKLQkgICAgfQotCi0JLyogSW5kaWNhdGUgdGhhdCB3ZSBoYXZlIGJlZW4gaW5pdGlhbGlzZWQgKi8KLQlpbml0ZWQgPSB0cnVlOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1XZSBkbyBoYXZlIEJJT1MgYWNjZXNzIHVuZGVyIFdpbmRvd3MgOXgsIGJ1dCBub3QgdW5kZXIgV2luZG93cyBOVC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fc2V0SU9QTCgKLSAgICBpbnQgaW9wbCkKLXsKLSAgICBEV09SRCAgICAgICBpbkJ1ZlsxXTsgICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLwotICAgIERXT1JEICAgICAgIG91dEJ1ZlsxXTsgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCi0gICAgRFdPUkQgICAgICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KLSAgICBzdGF0aWMgaW50ICBjbnRJT1BMID0gMDsKLSAgICBpbnQgICAgICAgICBvbGRJT1BMID0gY250SU9QTDsKLQotICAgIC8qIEVuYWJsZSBJL08gYnkgYWRqdXN0aW5nIHRoZSBJL08gcGVybWlzc2lvbnMgbWFwIG9uIFdpbmRvd3MgTlQgKi8KLSAgICBpZiAoX1BNX2hhdmVXaW5OVCkgewotCUNIRUNLX0ZPUl9QTUhFTFAoKTsKLQlpZiAoaW9wbCA9PSAzKQotCSAgICBEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9FTkFCTEVSSU5HM0lPUEwsIGluQnVmLCBzaXplb2YoaW5CdWYpLG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCk7Ci0JZWxzZQotCSAgICBEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9ESVNBQkxFUklORzNJT1BMLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSxvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpOwotCWNudElPUEwgPSBpb3BsOwotCXJldHVybiBvbGRJT1BMOwotCX0KLQotICAgIC8qIFdlIGFsd2F5cyBoYXZlIElPUEwgb24gV2luZG93cyA5eCAqLwotICAgIHJldHVybiAzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVdlIGRvIGhhdmUgQklPUyBhY2Nlc3MgdW5kZXIgV2luZG93cyA5eCwgYnV0IG5vdCB1bmRlciBXaW5kb3dzIE5ULgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2hhdmVCSU9TQWNjZXNzKHZvaWQpCi17Ci0gICAgaWYgKFBNX2dldE9TVHlwZSgpID09IF9PU19XSU5OVCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgZWxzZQotCXJldHVybiBfUE1faERldmljZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIG9wZXJhdGluZyBzeXN0ZW0gdHlwZSBpZGVudGlmaWVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWxvbmcgUE1BUEkgUE1fZ2V0T1NUeXBlKHZvaWQpCi17Ci0gICAgaWYgKChHZXRWZXJzaW9uKCkgJiAweDgwMDAwMDAwVUwpID09IDApCi0JcmV0dXJuIF9fX2Rydl9vc190eXBlID0gX09TX1dJTk5UOwotICAgIGVsc2UKLQlyZXR1cm4gX19fZHJ2X29zX3R5cGUgPSBfT1NfV0lOOTU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBydW50aW1lIHR5cGUgaWRlbnRpZmllci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fZ2V0TW9kZVR5cGUodm9pZCkKLXsKLSAgICByZXR1cm4gUE1fMzg2OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFkZCBhIGZpbGUgZGlyZWN0b3J5IHNlcGFyYXRvciB0byB0aGUgZW5kIG9mIHRoZSBmaWxlbmFtZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2JhY2tzbGFzaCgKLSAgICBjaGFyICpzKQotewotICAgIHVpbnQgcG9zID0gc3RybGVuKHMpOwotICAgIGlmIChzW3Bvcy0xXSAhPSAnXFwnKSB7Ci0Jc1twb3NdID0gJ1xcJzsKLQlzW3BvcysxXSA9ICdcMCc7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFkZCBhIHVzZXIgZGVmaW5lZCBQTV9mYXRhbEVycm9yIGNsZWFudXAgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRGYXRhbEVycm9yQ2xlYW51cCgKLSAgICB2b2lkIChQTUFQSVAgY2xlYW51cCkodm9pZCkpCi17Ci0gICAgZmF0YWxFcnJvckNsZWFudXAgPSBjbGVhbnVwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJlcG9ydCBhIGZhdGFsIGVycm9yIGNvbmRpdGlvbiBhbmQgaGFsdCB0aGUgcHJvZ3JhbS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZhdGFsRXJyb3IoCi0gICAgY29uc3QgY2hhciAqbXNnKQotewotICAgIGlmIChmYXRhbEVycm9yQ2xlYW51cCkKLQlmYXRhbEVycm9yQ2xlYW51cCgpOwotICAgIE1lc3NhZ2VCb3goTlVMTCxtc2csIkZhdGFsIEVycm9yISIsIE1CX0lDT05FWENMQU1BVElPTik7Ci0gICAgZXhpdCgxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1BbGxvY2F0ZSB0aGUgcmVhbCBtb2RlIFZFU0EgdHJhbnNmZXIgYnVmZmVyIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIEJJT1MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2dldFZFU0FCdWYoCi0gICAgdWludCAqbGVuLAotICAgIHVpbnQgKnJzZWcsCi0gICAgdWludCAqcm9mZikKLXsKLSAgICBEV09SRCAgIG91dEJ1Zls0XTsgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCi0gICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLwotCi0gICAgLyogV2UgcmVxdWlyZSB0aGUgaGVscGVyIFZ4RCB0byBiZSBsb2FkZWQgc3RhdGljbHkgaW4gb3JkZXIgdG8gc3VwcG9ydAotICAgICAqIHRoZSBWRVNBIHRyYW5zZmVyIGJ1ZmZlci4gV2UgZG8gbm90IHN1cHBvcnQgZHluYW1pY2FsbHkgYWxsb2NhdGluZwotICAgICAqIHJlYWwgbW9kZSBtZW1vcnkgYnVmZmVycyBmcm9tIFdpbjMyIHByb2dyYW1zICh3ZSBuZWVkIGEgMTYtYml0IERMTAotICAgICAqIGZvciB0aGlzLCBhbmQgV2luZG93cyA5eCBiZWNvbWVzIHZlcnkgdW5zdGFibGUgaWYgeW91IGZyZWUgdGhlCi0gICAgICogbWVtb3J5IGJsb2NrcyBvdXQgb2Ygb3JkZXIpLgotICAgICAqLwotICAgIGlmICghaW5pdGVkKQotCVBNX2luaXQoKTsKLSAgICBpZiAoIVZFU0FCdWZfcHRyKSB7Ci0JQ0hFQ0tfRk9SX1BNSEVMUCgpOwotCWlmIChEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9HRVRWRVNBQlVGMzIsIE5VTEwsIDAsCi0JCW91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkpIHsKLQkgICAgaWYgKCFvdXRCdWZbMF0pCi0JCXJldHVybiBOVUxMOwotCSAgICBWRVNBQnVmX3B0ciA9ICh2b2lkKilvdXRCdWZbMF07Ci0JICAgIFZFU0FCdWZfbGVuID0gb3V0QnVmWzFdOwotCSAgICBWRVNBQnVmX3JzZWcgPSBvdXRCdWZbMl07Ci0JICAgIFZFU0FCdWZfcm9mZiA9IG91dEJ1ZlszXTsKLQkgICAgfQotCX0KLSAgICAqbGVuID0gVkVTQUJ1Zl9sZW47Ci0gICAgKnJzZWcgPSBWRVNBQnVmX3JzZWc7Ci0gICAgKnJvZmYgPSBWRVNBQnVmX3JvZmY7Ci0gICAgcmV0dXJuIFZFU0FCdWZfcHRyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNoZWNrIGlmIGEga2V5IGhhcyBiZWVuIHByZXNzZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2tiaGl0KHZvaWQpCi17Ci0gICAgLyogTm90IHVzZWQgaW4gV2luZG93cyAqLwotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVdhaXQgZm9yIGFuZCByZXR1cm4gdGhlIG5leHQga2V5cHJlc3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2dldGNoKHZvaWQpCi17Ci0gICAgLyogTm90IHVzZWQgaW4gV2luZG93cyAqLwotICAgIHJldHVybiAweEQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgT1MgY29uc29sZSBjdXJzb3IuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTV9zZXRPU0N1cnNvckxvY2F0aW9uKAotICAgIGludCB4LAotICAgIGludCB5KQotewotICAgIC8qIE5vdGhpbmcgdG8gZG8gZm9yIFdpbmRvd3MgKi8KLSAgICAodm9pZCl4OwotICAgICh2b2lkKXk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU2V0IHRoZSB3aWR0aCBvZiB0aGUgT1MgY29uc29sZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNX3NldE9TU2NyZWVuV2lkdGgoCi0gICAgaW50IHdpZHRoLAotICAgIGludCBoZWlnaHQpCi17Ci0gICAgLyogTm90aGluZyB0byBkbyBmb3IgV2luZG93cyAqLwotICAgICh2b2lkKXdpZHRoOwotICAgICh2b2lkKWhlaWdodDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIHJlYWwgdGltZSBjbG9jayBoYW5kbGVyICh1c2VkIGZvciBzb2Z0d2FyZSBzdGVyZW8gbW9kZXMpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX3NldFJlYWxUaW1lQ2xvY2tIYW5kbGVyKAotICAgIFBNX2ludEhhbmRsZXIgaWgsCi0gICAgaW50IGZyZXF1ZW5jeSkKLXsKLSAgICAvKiBXZSBkbyBub3Qgc3VwcG9ydCB0aGlzIGZyb20gV2luMzIgcHJvZ3JhbXMuIFJhdGhlciB0aGUgVnhEIGhhbmRsZXMKLSAgICAgKiB0aGlzIHN0dWZmIGl0IHdpbGwgdGFrZSBjYXJlIG9mIGhvb2tpbmcgdGhlIHN0ZXJlbyBmbGlwIGZ1bmN0aW9ucyBhdAotICAgICAqIHRoZSBWeEQgbGV2ZWwuCi0gICAgICovCi0gICAgKHZvaWQpaWg7Ci0gICAgKHZvaWQpZnJlcXVlbmN5OwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TZXQgdGhlIHJlYWwgdGltZSBjbG9jayBmcmVxdWVuY3kgKGZvciBzdGVyZW8gbW9kZXMpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fc2V0UmVhbFRpbWVDbG9ja0ZyZXF1ZW5jeSgKLSAgICBpbnQgZnJlcXVlbmN5KQotewotICAgIC8qIE5vdCBzdXBwb3J0ZWQgdW5kZXIgV2luMzIgKi8KLSAgICAodm9pZClmcmVxdWVuY3k7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmVzdG9yZSB0aGUgb3JpZ2luYWwgcmVhbCB0aW1lIGNsb2NrIGhhbmRsZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9yZXN0b3JlUmVhbFRpbWVDbG9ja0hhbmRsZXIodm9pZCkKLXsKLSAgICAvKiBOb3Qgc3VwcG9ydGVkIHVuZGVyIFdpbjMyICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBjdXJyZW50IG9wZXJhdGluZyBzeXN0ZW0gcGF0aCBvciB3b3JraW5nIGRpcmVjdG9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jaGFyICogUE1BUEkgUE1fZ2V0Q3VycmVudFBhdGgoCi0gICAgY2hhciAqcGF0aCwKLSAgICBpbnQgbWF4TGVuKQotewotICAgIHJldHVybiBnZXRjd2QocGF0aCxtYXhMZW4pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVF1ZXJ5IGEgc3RyaW5nIGZyb20gdGhlIHJlZ2lzdHJ5IChleHRlbmRlZCB2ZXJzaW9uKS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaWJvb2wgUkVHX3F1ZXJ5U3RyaW5nRXgoCi0gICAgSEtFWSBoS2V5LAotICAgIGNvbnN0IGNoYXIgKnN6VmFsdWUsCi0gICAgY2hhciAqdmFsdWUsCi0gICAgdWxvbmcgc2l6ZSkKLXsKLSAgICBEV09SRCAgIHR5cGU7Ci0KLSAgICBpZiAoUmVnUXVlcnlWYWx1ZUV4KGhLZXksKFBDSEFSKXN6VmFsdWUsKFBEV09SRClOVUxMLChQRFdPUkQpJnR5cGUsKExQQllURSl2YWx1ZSwoUERXT1JEKSZzaXplKSA9PSBFUlJPUl9TVUNDRVNTKQotCXJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1RdWVyeSBhIHN0cmluZyBmcm9tIHRoZSByZWdpc3RyeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaWJvb2wgUkVHX3F1ZXJ5U3RyaW5nKAotICAgIGNvbnN0IGNoYXIgKnN6S2V5LAotICAgIGNvbnN0IGNoYXIgKnN6VmFsdWUsCi0gICAgY2hhciAqdmFsdWUsCi0gICAgRFdPUkQgc2l6ZSkKLXsKLSAgICBIS0VZICAgIGhLZXk7Ci0gICAgaWJvb2wgICBzdGF0dXMgPSBmYWxzZTsKLQotICAgIG1lbXNldCh2YWx1ZSwwLHNpemVvZih2YWx1ZSkpOwotICAgIGlmIChSZWdPcGVuS2V5KEhLRVlfTE9DQUxfTUFDSElORSxzektleSwmaEtleSkgPT0gRVJST1JfU1VDQ0VTUykgewotCXN0YXR1cyA9IFJFR19xdWVyeVN0cmluZ0V4KGhLZXksc3pWYWx1ZSx2YWx1ZSxzaXplKTsKLQlSZWdDbG9zZUtleShoS2V5KTsKLQl9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIGRyaXZlIGxldHRlciBmb3IgdGhlIGJvb3QgZHJpdmUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2hhciBQTUFQSSBQTV9nZXRCb290RHJpdmUodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBwYXRoWzI1Nl07Ci0gICAgR2V0U3lzdGVtRGlyZWN0b3J5KHBhdGgsc2l6ZW9mKHBhdGgpKTsKLSAgICByZXR1cm4gcGF0aFswXTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIHBhdGggdG8gdGhlIFZCRS9BRiBkcml2ZXIgZmlsZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldFZCRUFGUGF0aCh2b2lkKQotewotICAgIHJldHVybiAiYzpcXCI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBOdWNsZXVzIGRyaXZlciBmaWxlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0TnVjbGV1c1BhdGgodm9pZCkKLXsKLSAgICBzdGF0aWMgY2hhciBwYXRoWzI1Nl07Ci0gICAgY2hhciAgICAgICAgKmVudjsKLQotICAgIGlmICgoZW52ID0gZ2V0ZW52KCJOVUNMRVVTX1BBVEgiKSkgIT0gTlVMTCkKLQlyZXR1cm4gZW52OwotICAgIEdldFN5c3RlbURpcmVjdG9yeShwYXRoLHNpemVvZihwYXRoKSk7Ci0gICAgc3RyY2F0KHBhdGgsIlxcbnVjbGV1cyIpOwotICAgIHJldHVybiBwYXRoOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgcGF0aCB0byB0aGUgTnVjbGV1cyBjb25maWd1cmF0aW9uIGZpbGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKiBQTUFQSSBQTV9nZXROdWNsZXVzQ29uZmlnUGF0aCh2b2lkKQotewotICAgIHN0YXRpYyBjaGFyIHBhdGhbMjU2XTsKLSAgICBzdHJjcHkocGF0aCxQTV9nZXROdWNsZXVzUGF0aCgpKTsKLSAgICBQTV9iYWNrc2xhc2gocGF0aCk7Ci0gICAgc3RyY2F0KHBhdGgsImNvbmZpZyIpOwotICAgIHJldHVybiBwYXRoOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbWFjaGluZSBpZiBwb3NzaWJsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBjaGFyICogUE1BUEkgUE1fZ2V0VW5pcXVlSUQodm9pZCkKLXsKLSAgICByZXR1cm4gUE1fZ2V0TWFjaGluZU5hbWUoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1HZXQgdGhlIG5hbWUgb2YgdGhlIG1hY2hpbmUgb24gdGhlIG5ldHdvcmsuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciAqIFBNQVBJIFBNX2dldE1hY2hpbmVOYW1lKHZvaWQpCi17Ci0gICAgc3RhdGljIGNoYXIgbmFtZVsyNTZdOwotCi0gICAgaWYgKFJFR19xdWVyeVN0cmluZyhzek1hY2hpbmVOYW1lS2V5LHN6TWFjaGluZU5hbWUsbmFtZSxzaXplb2YobmFtZSkpKQotCXJldHVybiBuYW1lOwotICAgIGlmIChSRUdfcXVlcnlTdHJpbmcoc3pNYWNoaW5lTmFtZUtleU5ULHN6TWFjaGluZU5hbWUsbmFtZSxzaXplb2YobmFtZSkpKQotCXJldHVybiBuYW1lOwotICAgIHJldHVybiAiVW5rbm93biI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgcmVhbCBtb2RlIEJJT1MgZGF0YSBhcmVhLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9nZXRCSU9TUG9pbnRlcih2b2lkKQotewotICAgIGlmIChfUE1faGF2ZVdpbk5UKSB7Ci0JLyogT24gV2luZG93cyBOVCB3ZSBoYXZlIHRvIG1hcCBpdCBwaHlzaWNhbGx5IGRpcmVjdGx5ICovCi0JICAgIHJldHVybiBQTV9tYXBQaHlzaWNhbEFkZHIoMHg0MDAsIDB4MTAwMCwgdHJ1ZSk7Ci0JfQotICAgIGVsc2UgewotCS8qIEZvciBXaW5kb3dzIDl4IHdlIGNhbiBhY2Nlc3MgdGhpcyBtZW1vcnkgZGlyZWN0bHkgKi8KLQlyZXR1cm4gKHZvaWQqKTB4NDAwOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gYSBwb2ludGVyIHRvIDB4QTAwMDAgcGh5c2ljYWwgVkdBIGdyYXBoaWNzIGZyYW1lYnVmZmVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9nZXRBMDAwMFBvaW50ZXIodm9pZCkKLXsKLSAgICBpZiAoX1BNX2hhdmVXaW5OVCkgewotCS8qIE9uIFdpbmRvd3MgTlQgd2UgaGF2ZSB0byBtYXAgaXQgcGh5c2ljYWxseSBkaXJlY3RseSAqLwotCSAgICByZXR1cm4gUE1fbWFwUGh5c2ljYWxBZGRyKDB4QTAwMDAsIDB4MEZGRkYsIGZhbHNlKTsKLQl9Ci0gICAgZWxzZSB7Ci0JLyogQWx3YXlzIHVzZSB0aGUgMHhBMDAwMCBsaW5lYXIgYWRkcmVzcyBzbyB0aGF0IHdlIHdpbGwgdXNlCi0JICogd2hhdGV2ZXIgcGFnZSB0YWJsZSBtYXBwaW5ncyBhcmUgc2V0IHVwIGZvciB1cyAoaWU6IGZvciB2aXJ0dWFsCi0JICogYmFuayBzd2l0Y2hpbmcuCi0JICovCi0JcmV0dXJuICh2b2lkKikweEEwMDAwOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1NYXAgYSBwaHlzaWNhbCBhZGRyZXNzIHRvIGEgbGluZWFyIGFkZHJlc3MgaW4gdGhlIGNhbGxlcnMgcHJvY2Vzcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbWFwUGh5c2ljYWxBZGRyKAotICAgIHVsb25nIGJhc2UsCi0gICAgdWxvbmcgbGltaXQsCi0gICAgaWJvb2wgaXNDYWNoZWQpCi17Ci0gICAgRFdPUkQgICBpbkJ1ZlszXTsgICAvKiBCdWZmZXIgdG8gc2VuZCBkYXRhIHRvIFZ4RCAgICAgICAqLwotICAgIERXT1JEICAgb3V0QnVmWzFdOyAgLyogQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIFZ4RCAgKi8KLSAgICBEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCi0KLSAgICBpZiAoIWluaXRlZCkKLQlQTV9pbml0KCk7Ci0gICAgaW5CdWZbMF0gPSBiYXNlOwotICAgIGluQnVmWzFdID0gbGltaXQ7Ci0gICAgaW5CdWZbMl0gPSBpc0NhY2hlZDsKLSAgICBDSEVDS19GT1JfUE1IRUxQKCk7Ci0gICAgaWYgKERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX01BUFBIWVMzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksCi0JICAgIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkpCi0JcmV0dXJuICh2b2lkKilvdXRCdWZbMF07Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnJlZSBhIHBoeXNpY2FsIGFkZHJlc3MgbWFwcGluZyBhbGxvY2F0ZWQgYnkgUE1fbWFwUGh5c2ljYWxBZGRyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZVBoeXNpY2FsQWRkcigKLSAgICB2b2lkICpwdHIsCi0gICAgdWxvbmcgbGltaXQpCi17Ci0gICAgLyogV2UgbmV2ZXIgZnJlZSB0aGUgbWFwcGluZ3MgdW5kZXIgV2luMzIgKHRoZSBWeEQgdHJhY2tzIHRoZW0gYW5kCi0gICAgICogcmVpc3N1ZXMgdGhlIHNhbWUgbWFwcGluZ3MgdW50aWwgdGhlIHN5c3RlbSBpcyByZWJvb3RlZCkuCi0gICAgICovCi0gICAgKHZvaWQpcHRyOwotICAgICh2b2lkKWxpbWl0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZpbmQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBsaW5lYXIgbWVtb3J5IGFkZHJlc3MgaW4gY3VycmVudCBwcm9jZXNzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkcigKLSAgICB2b2lkICpwKQotewotICAgIERXT1JEICAgaW5CdWZbMV07ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KLSAgICBEV09SRCAgIG91dEJ1ZlsxXTsgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCi0gICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLwotCi0gICAgaWYgKCFpbml0ZWQpCi0JUE1faW5pdCgpOwotICAgIGluQnVmWzBdID0gKHVsb25nKXA7Ci0gICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOwotICAgIGlmIChEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9HRVRQSFlTSUNBTEFERFIzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksCi0JICAgIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkpCi0JcmV0dXJuIG91dEJ1ZlswXTsKLSAgICByZXR1cm4gMHhGRkZGRkZGRlVMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZpbmQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBsaW5lYXIgbWVtb3J5IGFkZHJlc3MgaW4gY3VycmVudCBwcm9jZXNzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2dldFBoeXNpY2FsQWRkclJhbmdlKAotICAgIHZvaWQgKnAsCi0gICAgdWxvbmcgbGVuZ3RoLAotICAgIHVsb25nICpwaHlzQWRkcmVzcykKLXsKLSAgICBEV09SRCAgIGluQnVmWzNdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCi0gICAgRFdPUkQgICBvdXRCdWZbMV07ICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLwotICAgIERXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KLQotICAgIGlmICghaW5pdGVkKQotCVBNX2luaXQoKTsKLSAgICBpbkJ1ZlswXSA9ICh1bG9uZylwOwotICAgIGluQnVmWzFdID0gKHVsb25nKWxlbmd0aDsKLSAgICBpbkJ1ZlsyXSA9ICh1bG9uZylwaHlzQWRkcmVzczsKLSAgICBDSEVDS19GT1JfUE1IRUxQKCk7Ci0gICAgaWYgKERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0dFVFBIWVNJQ0FMQUREUlJBTkdFMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAotCSAgICBvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpKQotCXJldHVybiBvdXRCdWZbMF07Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNsZWVwIGZvciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zbGVlcCgKLSAgICB1bG9uZyBtaWxsaXNlY29uZHMpCi17Ci0gICAgU2xlZXAobWlsbGlzZWNvbmRzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIGJhc2UgSS9PIHBvcnQgZm9yIHRoZSBzcGVjaWZpZWQgQ09NIHBvcnQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2dldENPTVBvcnQoaW50IHBvcnQpCi17Ci0gICAgLyogVE9ETzogUmUtY29kZSB0aGlzIHRvIGRldGVybWluZSByZWFsIHZhbHVlcyB1c2luZyB0aGUgUGx1ZyBhbmQgUGxheSAqLwotICAgIC8qICAgICAgIG1hbmFnZXIgZm9yIHRoZSBPUy4gKi8KLSAgICBzd2l0Y2ggKHBvcnQpIHsKLQljYXNlIDA6IHJldHVybiAweDNGODsKLQljYXNlIDE6IHJldHVybiAweDJGODsKLQljYXNlIDI6IHJldHVybiAweDNFODsKLQljYXNlIDM6IHJldHVybiAweDJFODsKLQl9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUmV0dXJuIHRoZSBiYXNlIEkvTyBwb3J0IGZvciB0aGUgc3BlY2lmaWVkIExQVCBwb3J0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9nZXRMUFRQb3J0KGludCBwb3J0KQotewotICAgIC8qIFRPRE86IFJlLWNvZGUgdGhpcyB0byBkZXRlcm1pbmUgcmVhbCB2YWx1ZXMgdXNpbmcgdGhlIFBsdWcgYW5kIFBsYXkgKi8KLSAgICAvKiAgICAgICBtYW5hZ2VyIGZvciB0aGUgT1MuICovCi0gICAgc3dpdGNoIChwb3J0KSB7Ci0JY2FzZSAwOiByZXR1cm4gMHgzQkM7Ci0JY2FzZSAxOiByZXR1cm4gMHgzNzg7Ci0JY2FzZSAyOiByZXR1cm4gMHgyNzg7Ci0JfQotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUFsbG9jYXRlIGEgYmxvY2sgb2Ygc2hhcmVkIG1lbW9yeS4gRm9yIFdpbjl4IHdlIGFsbG9jYXRlIHNoYXJlZCBtZW1vcnkKLWFzIGxvY2tlZCwgZ2xvYmFsIG1lbW9yeSB0aGF0IGlzIGFjY2Vzc2libGUgZnJvbSBhbnkgbWVtb3J5IGNvbnRleHQKLShpbmNsdWRpbmcgaW50ZXJydXB0IHRpbWUgY29udGV4dCksIHdoaWNoIGFsbG93cyB1cyB0byBsb2FkIG91ciBpbXBvcnRhbnQKLWRhdGEgc3RydWN0dXJlIGFuZCBjb2RlIHN1Y2ggdGhhdCB3ZSBjYW4gYWNjZXNzIGl0IGRpcmVjdGx5IGZyb20gYSByaW5nCi0wIGludGVycnVwdCBjb250ZXh0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9tYWxsb2NTaGFyZWQoCi0gICAgbG9uZyBzaXplKQotewotICAgIERXT1JEICAgaW5CdWZbMV07ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KLSAgICBEV09SRCAgIG91dEJ1ZlsxXTsgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCi0gICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLwotCi0gICAgaW5CdWZbMF0gPSBzaXplOwotICAgIENIRUNLX0ZPUl9QTUhFTFAoKTsKLSAgICBpZiAoRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfTUFMTE9DU0hBUkVEMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAotCSAgICBvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpKQotCXJldHVybiAodm9pZCopb3V0QnVmWzBdOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZyZWUgYSBibG9jayBvZiBzaGFyZWQgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZVNoYXJlZCgKLSAgICB2b2lkICpwdHIpCi17Ci0gICAgRFdPUkQgICBpbkJ1ZlsxXTsgICAvKiBCdWZmZXIgdG8gc2VuZCBkYXRhIHRvIFZ4RCAgICAgICAqLwotCi0gICAgaW5CdWZbMF0gPSAodWxvbmcpcHRyOwotICAgIENIRUNLX0ZPUl9QTUhFTFAoKTsKLSAgICBEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9GUkVFU0hBUkVEMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1NYXAgYSBsaW5lYXIgbWVtb3J5IGFkZHJlc3MgdG8gdGhlIGNhbGxpbmcgcHJvY2VzcyBhZGRyZXNzIHNwYWNlLiBUaGUKLWFkZHJlc3Mgd2lsbCBoYXZlIGJlZW4gYWxsb2NhdGVkIGluIGFub3RoZXIgcHJvY2VzcyB1c2luZyB0aGUKLVBNX21hcFBoeXNpY2FsQWRkciBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICogUE1BUEkgUE1fbWFwVG9Qcm9jZXNzKAotICAgIHZvaWQgKmJhc2UsCi0gICAgdWxvbmcgbGltaXQpCi17Ci0gICAgKHZvaWQpYmFzZTsKLSAgICAodm9pZClsaW1pdDsKLSAgICByZXR1cm4gYmFzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1NYXAgYSByZWFsIG1vZGUgcG9pbnRlciB0byBhIHByb3RlY3RlZCBtb2RlIHBvaW50ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX21hcFJlYWxQb2ludGVyKAotICAgIHVpbnQgcl9zZWcsCi0gICAgdWludCByX29mZikKLXsKLSAgICByZXR1cm4gKHZvaWQqKShNS19QSFlTKHJfc2VnLHJfb2ZmKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGUgYSBibG9jayBvZiByZWFsIG1vZGUgbWVtb3J5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2FsbG9jUmVhbFNlZygKLSAgICB1aW50IHNpemUsCi0gICAgdWludCAqcl9zZWcsCi0gICAgdWludCAqcl9vZmYpCi17Ci0gICAgLyogV2UgZG8gbm90IHN1cHBvcnQgZHluYW1pY2FsbHkgYWxsb2NhdGluZyByZWFsIG1vZGUgbWVtb3J5IGJ1ZmZlcnMKLSAgICAgKiBmcm9tIFdpbjMyIHByb2dyYW1zICh3ZSBuZWVkIGEgMTYtYml0IERMTCBmb3IgdGhpcywgYW5kIFdpbmRvd3MKLSAgICAgKiA5eCBiZWNvbWVzIHZlcnkgdW5zdGFibGUgaWYgeW91IGZyZWUgdGhlIG1lbW9yeSBibG9ja3Mgb3V0IG9mIG9yZGVyKS4KLSAgICAgKi8KLSAgICAodm9pZClzaXplOwotICAgICh2b2lkKXJfc2VnOwotICAgICh2b2lkKXJfb2ZmOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZyZWUgYSBibG9jayBvZiByZWFsIG1vZGUgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZVJlYWxTZWcoCi0gICAgdm9pZCAqbWVtKQotewotICAgIC8qIE5vdCBzdXBwb3J0ZWQgaW4gV2luZG93cyAqLwotICAgICh2b2lkKW1lbTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jc3N1ZSBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQgKHBhcmFtZXRlcnMgaW4gRFBNSSBjb21wYXRpYmxlIHN0cnVjdHVyZSkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIERQTUlfaW50ODYoCi0gICAgaW50IGludG5vLAotICAgIERQTUlfcmVncyAqcmVncykKLXsKLSAgICBEV09SRCAgIGluQnVmWzJdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCi0gICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLwotCi0gICAgaWYgKCFpbml0ZWQpCi0JUE1faW5pdCgpOwotICAgIGluQnVmWzBdID0gaW50bm87Ci0gICAgaW5CdWZbMV0gPSAodWxvbmcpcmVnczsKLSAgICBDSEVDS19GT1JfUE1IRUxQKCk7Ci0gICAgRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfRFBNSUlOVDg2MzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAotCU5VTEwsIDAsICZjb3VudCwgTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSXNzdWUgYSByZWFsIG1vZGUgaW50ZXJydXB0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9pbnQ4NigKLSAgICBpbnQgaW50bm8sCi0gICAgUk1SRUdTICppbiwKLSAgICBSTVJFR1MgKm91dCkKLXsKLSAgICBEV09SRCAgIGluQnVmWzNdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCi0gICAgRFdPUkQgICBvdXRCdWZbMV07ICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLwotICAgIERXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KLQotICAgIGlmICghaW5pdGVkKQotCVBNX2luaXQoKTsKLSAgICBpbkJ1ZlswXSA9IGludG5vOwotICAgIGluQnVmWzFdID0gKHVsb25nKWluOwotICAgIGluQnVmWzJdID0gKHVsb25nKW91dDsKLSAgICBDSEVDS19GT1JfUE1IRUxQKCk7Ci0gICAgaWYgKERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0lOVDg2MzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAotCSAgICBvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpKQotCXJldHVybiBvdXRCdWZbMF07Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSXNzdWUgYSByZWFsIG1vZGUgaW50ZXJydXB0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBQTUFQSSBQTV9pbnQ4NngoCi0gICAgaW50IGludG5vLAotICAgIFJNUkVHUyAqaW4sCi0gICAgUk1SRUdTICpvdXQsCi0gICAgUk1TUkVHUyAqc3JlZ3MpCi17Ci0gICAgRFdPUkQgICBpbkJ1Zls0XTsgICAvKiBCdWZmZXIgdG8gc2VuZCBkYXRhIHRvIFZ4RCAgICAgICAqLwotICAgIERXT1JEICAgb3V0QnVmWzFdOyAgLyogQnVmZmVyIHRvIHJlY2VpdmUgZGF0YSBmcm9tIFZ4RCAgKi8KLSAgICBEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCi0KLSAgICBpZiAoIWluaXRlZCkKLQlQTV9pbml0KCk7Ci0gICAgaW5CdWZbMF0gPSBpbnRubzsKLSAgICBpbkJ1ZlsxXSA9ICh1bG9uZylpbjsKLSAgICBpbkJ1ZlsyXSA9ICh1bG9uZylvdXQ7Ci0gICAgaW5CdWZbM10gPSAodWxvbmcpc3JlZ3M7Ci0gICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOwotICAgIGlmIChEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9JTlQ4NlgzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksCi0JICAgIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkpCi0JcmV0dXJuIG91dEJ1ZlswXTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIGEgcmVhbCBtb2RlIGZhciBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2NhbGxSZWFsTW9kZSgKLSAgICB1aW50IHNlZywKLSAgICB1aW50IG9mZiwKLSAgICBSTVJFR1MgKmluLAotICAgIFJNU1JFR1MgKnNyZWdzKQotewotICAgIERXT1JEICAgaW5CdWZbNF07ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KLSAgICBEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCi0KLSAgICBpZiAoIWluaXRlZCkKLQlQTV9pbml0KCk7Ci0gICAgaW5CdWZbMF0gPSBzZWc7Ci0gICAgaW5CdWZbMV0gPSBvZmY7Ci0gICAgaW5CdWZbMl0gPSAodWxvbmcpaW47Ci0gICAgaW5CdWZbM10gPSAodWxvbmcpc3JlZ3M7Ci0gICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOwotICAgIERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0NBTExSRUFMTU9ERTMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwKLQlOVUxMLCAwLCAmY291bnQsIE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVJldHVybiB0aGUgYW1vdW50IG9mIGF2YWlsYWJsZSBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9hdmFpbGFibGVNZW1vcnkoCi0gICAgdWxvbmcgKnBoeXNpY2FsLAotICAgIHVsb25nICp0b3RhbCkKLXsKLSAgICAvKiBXZSBkb24ndCBzdXBwb3J0IHRoaXMgdW5kZXIgV2luMzIgYXQgdGhlIG1vbWVudCAqLwotICAgICpwaHlzaWNhbCA9ICp0b3RhbCA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGUgYSBibG9jayBvZiBsb2NrZWQsIHBoeXNpY2FsIG1lbW9yeSBmb3IgRE1BIG9wZXJhdGlvbnMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqIFBNQVBJIFBNX2FsbG9jTG9ja2VkTWVtKAotICAgIHVpbnQgc2l6ZSwKLSAgICB1bG9uZyAqcGh5c0FkZHIsCi0gICAgaWJvb2wgY29udGlndW91cywKLSAgICBpYm9vbCBiZWxvdzE2TSkKLXsKLSAgICBEV09SRCAgIGluQnVmWzRdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCi0gICAgRFdPUkQgICBvdXRCdWZbMV07ICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLwotICAgIERXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KLQotICAgIGlmICghaW5pdGVkKQotCVBNX2luaXQoKTsKLSAgICBpbkJ1ZlswXSA9IHNpemU7Ci0gICAgaW5CdWZbMV0gPSAodWxvbmcpcGh5c0FkZHI7Ci0gICAgaW5CdWZbMl0gPSAodWxvbmcpY29udGlndW91czsKLSAgICBpbkJ1ZlszXSA9ICh1bG9uZyliZWxvdzE2TTsKLSAgICBDSEVDS19GT1JfUE1IRUxQKCk7Ci0gICAgaWYgKERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0FMTE9DTE9DS0VEMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAotCSAgICBvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpKQotCXJldHVybiAodm9pZCopb3V0QnVmWzBdOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZyZWUgYSBibG9jayBvZiBsb2NrZWQgcGh5c2ljYWwgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZUxvY2tlZE1lbSgKLSAgICB2b2lkICpwLAotICAgIHVpbnQgc2l6ZSwKLSAgICBpYm9vbCBjb250aWd1b3VzKQotewotICAgIERXT1JEICAgaW5CdWZbM107ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KLSAgICBEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCi0KLSAgICBpZiAoIWluaXRlZCkKLQlQTV9pbml0KCk7Ci0gICAgaW5CdWZbMF0gPSAodWxvbmcpcDsKLSAgICBpbkJ1ZlsxXSA9IHNpemU7Ci0gICAgaW5CdWZbMl0gPSBjb250aWd1b3VzOwotICAgIENIRUNLX0ZPUl9QTUhFTFAoKTsKLSAgICBEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9GUkVFTE9DS0VEMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAotCU5VTEwsIDAsICZjb3VudCwgTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQWxsb2NhdGVzIGEgcGFnZSBhbGlnbmVkIGFuZCBwYWdlIHNpemVkIGJsb2NrIG9mIG1lbW9yeQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9hbGxvY1BhZ2UoCi0gICAgaWJvb2wgbG9ja2VkKQotewotICAgIERXT1JEICAgaW5CdWZbMl07ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KLSAgICBEV09SRCAgIG91dEJ1ZlsxXTsgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCi0gICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLwotCi0gICAgaWYgKCFpbml0ZWQpCi0JUE1faW5pdCgpOwotICAgIGluQnVmWzBdID0gbG9ja2VkOwotICAgIENIRUNLX0ZPUl9QTUhFTFAoKTsKLSAgICBpZiAoRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfQUxMT0NQQUdFMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAotCSAgICBvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpKQotCXJldHVybiAodm9pZCopb3V0QnVmWzBdOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZyZWUgYSBwYWdlIGFsaWduZWQgYW5kIHBhZ2Ugc2l6ZWQgYmxvY2sgb2YgbWVtb3J5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9mcmVlUGFnZSgKLSAgICB2b2lkICpwKQotewotICAgIERXT1JEICAgaW5CdWZbMV07ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KLSAgICBEV09SRCAgIGNvdW50OyAgICAgIC8qIENvdW50IG9mIGJ5dGVzIHJldHVybmVkIGZyb20gVnhEICovCi0KLSAgICBpZiAoIWluaXRlZCkKLQlQTV9pbml0KCk7Ci0gICAgaW5CdWZbMF0gPSAodWxvbmcpcDsKLSAgICBDSEVDS19GT1JfUE1IRUxQKCk7Ci0gICAgRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfRlJFRVBBR0UzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksCi0JTlVMTCwgMCwgJmNvdW50LCBOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Mb2NrIGxpbmVhciBtZW1vcnkgc28gaXQgd29uJ3QgYmUgcGFnZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX2xvY2tEYXRhUGFnZXModm9pZCAqcCx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBEV09SRCAgIGluQnVmWzJdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCi0gICAgRFdPUkQgICBvdXRCdWZbMV07ICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLwotICAgIERXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KLQotICAgIGluQnVmWzBdID0gKHVsb25nKXA7Ci0gICAgaW5CdWZbMV0gPSBsZW47Ci0gICAgaW5CdWZbMl0gPSAodWxvbmcpbGg7Ci0gICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOwotICAgIGlmIChEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9MT0NLREFUQVBBR0VTMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAotCSAgICBvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpKQotCXJldHVybiBvdXRCdWZbMF07Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVW5sb2NrIGxpbmVhciBtZW1vcnkgc28gaXQgd29uJ3QgYmUgcGFnZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX3VubG9ja0RhdGFQYWdlcyh2b2lkICpwLHVpbnQgbGVuLFBNX2xvY2tIYW5kbGUgKmxoKQotewotICAgIERXT1JEICAgaW5CdWZbMl07ICAgLyogQnVmZmVyIHRvIHNlbmQgZGF0YSB0byBWeEQgICAgICAgKi8KLSAgICBEV09SRCAgIG91dEJ1ZlsxXTsgIC8qIEJ1ZmZlciB0byByZWNlaXZlIGRhdGEgZnJvbSBWeEQgICovCi0gICAgRFdPUkQgICBjb3VudDsgICAgICAvKiBDb3VudCBvZiBieXRlcyByZXR1cm5lZCBmcm9tIFZ4RCAqLwotCi0gICAgaW5CdWZbMF0gPSAodWxvbmcpcDsKLSAgICBpbkJ1ZlsxXSA9IGxlbjsKLSAgICBpbkJ1ZlsyXSA9ICh1bG9uZylsaDsKLSAgICBDSEVDS19GT1JfUE1IRUxQKCk7Ci0gICAgaWYgKERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX1VOTE9DS0RBVEFQQUdFUzMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwKLQkgICAgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSkKLQlyZXR1cm4gb3V0QnVmWzBdOwotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUxvY2sgbGluZWFyIG1lbW9yeSBzbyBpdCB3b24ndCBiZSBwYWdlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgUE1BUEkgUE1fbG9ja0NvZGVQYWdlcyh2b2lkICgqcCkoKSx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBEV09SRCAgIGluQnVmWzJdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCi0gICAgRFdPUkQgICBvdXRCdWZbMV07ICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLwotICAgIERXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KLQotICAgIGluQnVmWzBdID0gKHVsb25nKXA7Ci0gICAgaW5CdWZbMV0gPSBsZW47Ci0gICAgaW5CdWZbMl0gPSAodWxvbmcpbGg7Ci0gICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOwotICAgIGlmIChEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9MT0NLQ09ERVBBR0VTMzIsIGluQnVmLCBzaXplb2YoaW5CdWYpLAotCSAgICBvdXRCdWYsIHNpemVvZihvdXRCdWYpLCAmY291bnQsIE5VTEwpKQotCXJldHVybiBvdXRCdWZbMF07Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotVW5sb2NrIGxpbmVhciBtZW1vcnkgc28gaXQgd29uJ3QgYmUgcGFnZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IFBNQVBJIFBNX3VubG9ja0NvZGVQYWdlcyh2b2lkICgqcCkoKSx1aW50IGxlbixQTV9sb2NrSGFuZGxlICpsaCkKLXsKLSAgICBEV09SRCAgIGluQnVmWzJdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCi0gICAgRFdPUkQgICBvdXRCdWZbMV07ICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLwotICAgIERXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KLQotICAgIGluQnVmWzBdID0gKHVsb25nKXA7Ci0gICAgaW5CdWZbMV0gPSBsZW47Ci0gICAgaW5CdWZbMl0gPSAodWxvbmcpbGg7Ci0gICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOwotICAgIGlmIChEZXZpY2VJb0NvbnRyb2woX1BNX2hEZXZpY2UsIFBNSEVMUF9VTkxPQ0tDT0RFUEFHRVMzMiwgaW5CdWYsIHNpemVvZihpbkJ1ZiksCi0JICAgIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkpCi0JcmV0dXJuIG91dEJ1ZlswXTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBWQkUvQ29yZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgdG8gY2hhbmdlIGRpc3BsYXkgYmFua3MuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQTUFQSSBQTV9zZXRCYW5rQSgKLSAgICBpbnQgYmFuaykKLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0gICAgcmVncy54LmF4ID0gMHg0RjA1OwotICAgIHJlZ3MueC5ieCA9IDB4MDAwMDsKLSAgICByZWdzLnguZHggPSBiYW5rOwotICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNhbGwgdGhlIFZCRS9Db3JlIHNvZnR3YXJlIGludGVycnVwdCB0byBjaGFuZ2UgZGlzcGxheSBiYW5rcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldEJhbmtBQigKLSAgICBpbnQgYmFuaykKLXsKLSAgICBSTVJFR1MgIHJlZ3M7Ci0gICAgcmVncy54LmF4ID0gMHg0RjA1OwotICAgIHJlZ3MueC5ieCA9IDB4MDAwMDsKLSAgICByZWdzLnguZHggPSBiYW5rOwotICAgIFBNX2ludDg2KDB4MTAsJnJlZ3MsJnJlZ3MpOwotICAgIHJlZ3MueC5heCA9IDB4NEYwNTsKLSAgICByZWdzLnguYnggPSAweDAwMDE7Ci0gICAgcmVncy54LmR4ID0gYmFuazsKLSAgICBQTV9pbnQ4NigweDEwLCZyZWdzLCZyZWdzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1DYWxsIHRoZSBWQkUvQ29yZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgdG8gY2hhbmdlIGRpc3BsYXkgc3RhcnQgYWRkcmVzcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldENSVFN0YXJ0KAotICAgIGludCB4LAotICAgIGludCB5LAotICAgIGludCB3YWl0VlJUKQotewotICAgIFJNUkVHUyAgcmVnczsKLSAgICByZWdzLnguYXggPSAweDRGMDc7Ci0gICAgcmVncy54LmJ4ID0gd2FpdFZSVDsKLSAgICByZWdzLnguY3ggPSB4OwotICAgIHJlZ3MueC5keCA9IHk7Ci0gICAgUE1faW50ODYoMHgxMCwmcmVncywmcmVncyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRW5hYmxlIHdyaXRlIGNvbWJpbmluZyBmb3IgdGhlIG1lbW9yeSByZWdpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZW5hYmxlV3JpdGVDb21iaW5lKAotICAgIHVsb25nIGJhc2UsCi0gICAgdWxvbmcgbGVuZ3RoLAotICAgIHVpbnQgdHlwZSkKLXsKLSAgICBEV09SRCAgIGluQnVmWzNdOyAgIC8qIEJ1ZmZlciB0byBzZW5kIGRhdGEgdG8gVnhEICAgICAgICovCi0gICAgRFdPUkQgICBvdXRCdWZbMV07ICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLwotICAgIERXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KLQotICAgIGlmICghaW5pdGVkKQotCVBNX2luaXQoKTsKLSAgICBpbkJ1ZlswXSA9IGJhc2U7Ci0gICAgaW5CdWZbMV0gPSBsZW5ndGg7Ci0gICAgaW5CdWZbMl0gPSB0eXBlOwotICAgIENIRUNLX0ZPUl9QTUhFTFAoKTsKLSAgICBpZiAoRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfRU5BQkxFTEZCQ09NQjMyLCBpbkJ1Ziwgc2l6ZW9mKGluQnVmKSwKLQkgICAgb3V0QnVmLCBzaXplb2Yob3V0QnVmKSwgJmNvdW50LCBOVUxMKSkKLQlyZXR1cm4gb3V0QnVmWzBdOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1HZXQgdGhlIHBhZ2UgZGlyZWN0b3J5IGJhc2UgcmVnaXN0ZXIgdmFsdWUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBQTUFQSSBfUE1fZ2V0UERCKHZvaWQpCi17Ci0gICAgRFdPUkQgICBvdXRCdWZbMV07ICAvKiBCdWZmZXIgdG8gcmVjZWl2ZSBkYXRhIGZyb20gVnhEICAqLwotICAgIERXT1JEICAgY291bnQ7ICAgICAgLyogQ291bnQgb2YgYnl0ZXMgcmV0dXJuZWQgZnJvbSBWeEQgKi8KLQotICAgIENIRUNLX0ZPUl9QTUhFTFAoKTsKLSAgICBpZiAoRGV2aWNlSW9Db250cm9sKF9QTV9oRGV2aWNlLCBQTUhFTFBfR0VUUERCMzIsIE5VTEwsIDAsCi0JICAgIG91dEJ1Ziwgc2l6ZW9mKG91dEJ1ZiksICZjb3VudCwgTlVMTCkpCi0JcmV0dXJuIG91dEJ1ZlswXTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GbHVzaCB0aGUgdHJhbnNsYXRpb24gbG9va2FzaWRlIGJ1ZmZlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX2ZsdXNoVExCKHZvaWQpCi17Ci0gICAgQ0hFQ0tfRk9SX1BNSEVMUCgpOwotICAgIERldmljZUlvQ29udHJvbChfUE1faERldmljZSwgUE1IRUxQX0ZMVVNIVExCMzIsIE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIE5VTEwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUV4ZWN1dGUgdGhlIFBPU1Qgb24gdGhlIHNlY29uZGFyeSBCSU9TIGZvciBhIGNvbnRyb2xsZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZG9CSU9TUE9TVCgKLSAgICB1c2hvcnQgYXhWYWwsCi0gICAgdWxvbmcgQklPU1BoeXNBZGRyLAotICAgIHZvaWQgKm1hcHBlZEJJT1MsCi0gICAgdWxvbmcgQklPU0xlbikKLXsKLSAgICAvKiBUaGlzIGlzIG5ldmVyIGRvbmUgYnkgV2luMzIgcHJvZ3JhbXMsIGJ1dCByYXRoZXIgZG9uZSBieSB0aGUgVnhECi0gICAgICogd2hlbiB0aGUgc3lzdGVtIGJvb3RzLgotICAgICAqLwotICAgICh2b2lkKWF4VmFsOwotICAgICh2b2lkKUJJT1NQaHlzQWRkcjsKLSAgICAodm9pZCltYXBwZWRCSU9TOwotICAgICh2b2lkKUJJT1NMZW47Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUxvYWQgYW4gT1Mgc3BlY2lmaWMgc2hhcmVkIGxpYnJhcnkgb3IgRExMLiBJZiB0aGUgT1MgZG9lcyBub3Qgc3VwcG9ydAotc2hhcmVkIGxpYnJhcmllcywgc2ltcGx5IHJldHVybiBOVUxMLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVBNX01PRFVMRSBQTUFQSSBQTV9sb2FkTGlicmFyeSgKLSAgICBjb25zdCBjaGFyICpzekRMTE5hbWUpCi17Ci0gICAgcmV0dXJuIChQTV9NT0RVTEUpTG9hZExpYnJhcnkoc3pETExOYW1lKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1HZXQgdGhlIGFkZHJlc3Mgb2YgYSBuYW1lZCBwcm9jZWR1cmUgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKiBQTUFQSSBQTV9nZXRQcm9jQWRkcmVzcygKLSAgICBQTV9NT0RVTEUgaE1vZHVsZSwKLSAgICBjb25zdCBjaGFyICpzelByb2NOYW1lKQotewotICAgIHJldHVybiAodm9pZCopR2V0UHJvY0FkZHJlc3MoKEhJTlNUQU5DRSloTW9kdWxlLHN6UHJvY05hbWUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVVubG9hZCBhIHNoYXJlZCBsaWJyYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZnJlZUxpYnJhcnkoCi0gICAgUE1fTU9EVUxFIGhNb2R1bGUpCi17Ci0gICAgRnJlZUxpYnJhcnkoKEhJTlNUQU5DRSloTW9kdWxlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbnRlcm5hbCBmdW5jdGlvbiB0byBjb252ZXJ0IHRoZSBmaW5kIGRhdGEgdG8gdGhlIGdlbmVyaWMgaW50ZXJmYWNlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGNvbnZlcnRGaW5kRGF0YSgKLSAgICBQTV9maW5kRGF0YSAqZmluZERhdGEsCi0gICAgV0lOMzJfRklORF9EQVRBICpibGspCi17Ci0gICAgdWxvbmcgICBkd1NpemUgPSBmaW5kRGF0YS0+ZHdTaXplOwotCi0gICAgbWVtc2V0KGZpbmREYXRhLDAsZmluZERhdGEtPmR3U2l6ZSk7Ci0gICAgZmluZERhdGEtPmR3U2l6ZSA9IGR3U2l6ZTsKLSAgICBpZiAoYmxrLT5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfUkVBRE9OTFkpCi0JZmluZERhdGEtPmF0dHJpYiB8PSBQTV9GSUxFX1JFQURPTkxZOwotICAgIGlmIChibGstPmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpCi0JZmluZERhdGEtPmF0dHJpYiB8PSBQTV9GSUxFX0RJUkVDVE9SWTsKLSAgICBpZiAoYmxrLT5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfQVJDSElWRSkKLQlmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfQVJDSElWRTsKLSAgICBpZiAoYmxrLT5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfSElEREVOKQotCWZpbmREYXRhLT5hdHRyaWIgfD0gUE1fRklMRV9ISURERU47Ci0gICAgaWYgKGJsay0+ZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX1NZU1RFTSkKLQlmaW5kRGF0YS0+YXR0cmliIHw9IFBNX0ZJTEVfU1lTVEVNOwotICAgIGZpbmREYXRhLT5zaXplTG8gPSBibGstPm5GaWxlU2l6ZUxvdzsKLSAgICBmaW5kRGF0YS0+c2l6ZUhpID0gYmxrLT5uRmlsZVNpemVIaWdoOwotICAgIHN0cm5jcHkoZmluZERhdGEtPm5hbWUsYmxrLT5jRmlsZU5hbWUsUE1fTUFYX1BBVEgpOwotICAgIGZpbmREYXRhLT5uYW1lW1BNX01BWF9QQVRILTFdID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBmaW5kIHRoZSBmaXJzdCBmaWxlIG1hdGNoaW5nIGEgc2VhcmNoIGNyaXRlcmlhIGluIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKlBNQVBJIFBNX2ZpbmRGaXJzdEZpbGUoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhKQotewotICAgIFdJTjMyX0ZJTkRfREFUQSBibGs7Ci0gICAgSEFORExFICAgICAgICAgIGhmaWxlOwotCi0gICAgaWYgKChoZmlsZSA9IEZpbmRGaXJzdEZpbGUoZmlsZW5hbWUsJmJsaykpICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0JY29udmVydEZpbmREYXRhKGZpbmREYXRhLCZibGspOwotCXJldHVybiAodm9pZCopaGZpbGU7Ci0JfQotICAgIHJldHVybiBQTV9GSUxFX0lOVkFMSUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZmluZCB0aGUgbmV4dCBmaWxlIG1hdGNoaW5nIGEgc2VhcmNoIGNyaXRlcmlhIGluIGEgZGlyZWN0b3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX2ZpbmROZXh0RmlsZSgKLSAgICB2b2lkICpoYW5kbGUsCi0gICAgUE1fZmluZERhdGEgKmZpbmREYXRhKQotewotICAgIFdJTjMyX0ZJTkRfREFUQSBibGs7Ci0KLSAgICBpZiAoRmluZE5leHRGaWxlKChIQU5ETEUpaGFuZGxlLCZibGspKSB7Ci0JY29udmVydEZpbmREYXRhKGZpbmREYXRhLCZibGspOwotCXJldHVybiB0cnVlOwotCX0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gY2xvc2UgdGhlIGZpbmQgcHJvY2VzcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZmluZENsb3NlKAotICAgIHZvaWQgKmhhbmRsZSkKLXsKLSAgICBGaW5kQ2xvc2UoKEhBTkRMRSloYW5kbGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBhIGRyaXZlIGlzIGEgdmFsaWQgZHJpdmUgb3Igbm90LiBVbmRlciBVbml4IHRoaXMKLWZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIGZvciBhbnl0aGluZyBleGNlcHQgYSB2YWx1ZSBvZiAzIChjb25zaWRlcmVkCi10aGUgcm9vdCBkcml2ZSwgYW5kIGVxdWl2YWxlbnQgdG8gQzogZm9yIG5vbi1Vbml4IHN5c3RlbXMpLiBUaGUgZHJpdmUKLW51bWJlcmluZyBpczoKLQotICAgIDEgICAtIERyaXZlIEE6Ci0gICAgMiAgIC0gRHJpdmUgQjoKLSAgICAzICAgLSBEcml2ZSBDOgotICAgIGV0YwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fZHJpdmVWYWxpZCgKLSAgICBjaGFyIGRyaXZlKQotewotICAgIGNoYXIgICAgYnVmWzVdOwotICAgIGludCAgICAgdHlwZTsKLQotICAgIHNwcmludGYoYnVmLCIlYzpcXCIsIGRyaXZlKTsKLSAgICByZXR1cm4gKCh0eXBlID0gR2V0RHJpdmVUeXBlKGJ1ZikpICE9IDAgJiYgdHlwZSAhPSAxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSBzcGVjaWZpZmVkIGRyaXZlLgotVW5kZXIgVW5peCB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSByZWdhcmRsZXNzCi1vZiB3aGF0IHRoZSB2YWx1ZSBvZiAnZHJpdmUnIGlzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUE1BUEkgUE1fZ2V0ZGN3ZCgKLSAgICBpbnQgZHJpdmUsCi0gICAgY2hhciAqZGlyLAotICAgIGludCBsZW4pCi17Ci0gICAgLyogTlQgc3RvcmVzIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBmb3IgZHJpdmUgTiBpbiB0aGUgbWFnaWMgZW52aXJvbm1lbnQgKi8KLSAgICAvKiB2YXJpYWJsZSA9Tjogc28gd2Ugc2ltcGx5IGxvb2sgZm9yIHRoYXQgZW52aXJvbm1lbnQgdmFyaWFibGUuICovCi0gICAgY2hhciBlbnZuYW1lWzRdOwotCi0gICAgZW52bmFtZVswXSA9ICc9JzsKLSAgICBlbnZuYW1lWzFdID0gZHJpdmUgLSAxICsgJ0EnOwotICAgIGVudm5hbWVbMl0gPSAnOic7Ci0gICAgZW52bmFtZVszXSA9ICdcMCc7Ci0gICAgaWYgKEdldEVudmlyb25tZW50VmFyaWFibGUoZW52bmFtZSxkaXIsbGVuKSA9PSAwKSB7Ci0JLyogVGhlIGN1cnJlbnQgZGlyZWN0b3J5IG9yIHRoZSBkcml2ZSBoYXMgbm90IGJlZW4gc2V0IHlldCwgc28gKi8KLQkvKiBzaW1wbHkgc2V0IGl0IHRvIHRoZSByb290LiAqLwotCWRpclswXSA9IGVudm5hbWVbMV07Ci0JZGlyWzFdID0gJzonOwotCWRpclsyXSA9ICdcXCc7Ci0JZGlyWzNdID0gJ1wwJzsKLQlTZXRFbnZpcm9ubWVudFZhcmlhYmxlKGVudm5hbWUsZGlyKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gY2hhbmdlIHRoZSBmaWxlIGF0dHJpYnV0ZXMgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFBNQVBJIFBNX3NldEZpbGVBdHRyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIHVpbnQgYXR0cmliKQotewotICAgIERXT1JEIGF0dHIgPSAwOwotCi0gICAgaWYgKGF0dHJpYiAmIFBNX0ZJTEVfUkVBRE9OTFkpCi0JYXR0ciB8PSBGSUxFX0FUVFJJQlVURV9SRUFET05MWTsKLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9BUkNISVZFKQotCWF0dHIgfD0gRklMRV9BVFRSSUJVVEVfQVJDSElWRTsKLSAgICBpZiAoYXR0cmliICYgUE1fRklMRV9ISURERU4pCi0JYXR0ciB8PSBGSUxFX0FUVFJJQlVURV9ISURERU47Ci0gICAgaWYgKGF0dHJpYiAmIFBNX0ZJTEVfU1lTVEVNKQotCWF0dHIgfD0gRklMRV9BVFRSSUJVVEVfU1lTVEVNOwotICAgIFNldEZpbGVBdHRyaWJ1dGVzKChMUFNUUilmaWxlbmFtZSwgYXR0cik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZ2V0IHRoZSBmaWxlIGF0dHJpYnV0ZXMgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11aW50IFBNQVBJIFBNX2dldEZpbGVBdHRyKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIERXT1JEICAgYXR0ciA9IEdldEZpbGVBdHRyaWJ1dGVzKGZpbGVuYW1lKTsKLSAgICB1aW50ICAgIGF0dHJpYiA9IDA7Ci0KLSAgICBpZiAoYXR0ciAmIEZJTEVfQVRUUklCVVRFX1JFQURPTkxZKQotCWF0dHJpYiB8PSBQTV9GSUxFX1JFQURPTkxZOwotICAgIGlmIChhdHRyICYgRklMRV9BVFRSSUJVVEVfQVJDSElWRSkKLQlhdHRyaWIgfD0gUE1fRklMRV9BUkNISVZFOwotICAgIGlmIChhdHRyICYgRklMRV9BVFRSSUJVVEVfSElEREVOKQotCWF0dHJpYiB8PSBQTV9GSUxFX0hJRERFTjsKLSAgICBpZiAoYXR0ciAmIEZJTEVfQVRUUklCVVRFX1NZU1RFTSkKLQlhdHRyaWIgfD0gUE1fRklMRV9TWVNURU07Ci0gICAgcmV0dXJuIGF0dHJpYjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBjcmVhdGUgYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fbWtkaXIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgcmV0dXJuIENyZWF0ZURpcmVjdG9yeShmaWxlbmFtZSxOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byByZW1vdmUgYSBkaXJlY3RvcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaWJvb2wgUE1BUEkgUE1fcm1kaXIoCi0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgcmV0dXJuIFJlbW92ZURpcmVjdG9yeShmaWxlbmFtZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotRnVuY3Rpb24gdG8gZ2V0IHRoZSBmaWxlIHRpbWUgYW5kIGRhdGUgZm9yIGEgc3BlY2lmaWMgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pYm9vbCBQTUFQSSBQTV9nZXRGaWxlVGltZSgKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKLSAgICBpYm9vbCBnbVRpbWUsCi0gICAgUE1fdGltZSAqdGltZSkKLXsKLSAgICBIRklMRSAgICAgICBmOwotICAgIE9GU1RSVUNUICAgIG9mOwotICAgIEZJTEVUSU1FICAgIHV0Y1RpbWUsbG9jYWxUaW1lOwotICAgIFNZU1RFTVRJTUUgIHN5c1RpbWU7Ci0gICAgaWJvb2wgICAgICAgc3RhdHVzID0gZmFsc2U7Ci0KLSAgICBvZi5jQnl0ZXMgPSBzaXplb2Yob2YpOwotICAgIGlmICgoZiA9IE9wZW5GaWxlKGZpbGVuYW1lLCZvZixPRl9SRUFEKSkgPT0gSEZJTEVfRVJST1IpCi0JcmV0dXJuIGZhbHNlOwotICAgIGlmICghR2V0RmlsZVRpbWUoKEhBTkRMRSlmLE5VTEwsTlVMTCwmdXRjVGltZSkpCi0JZ290byBFeGl0OwotICAgIGlmICghZ21UaW1lKSB7Ci0JaWYgKCFGaWxlVGltZVRvTG9jYWxGaWxlVGltZSgmdXRjVGltZSwmbG9jYWxUaW1lKSkKLQkgICAgZ290byBFeGl0OwotCX0KLSAgICBlbHNlCi0JbG9jYWxUaW1lID0gdXRjVGltZTsKLSAgICBpZiAoIUZpbGVUaW1lVG9TeXN0ZW1UaW1lKCZsb2NhbFRpbWUsJnN5c1RpbWUpKQotCWdvdG8gRXhpdDsKLSAgICB0aW1lLT55ZWFyID0gc3lzVGltZS53WWVhcjsKLSAgICB0aW1lLT5tb24gPSBzeXNUaW1lLndNb250aC0xOwotICAgIHRpbWUtPmRheSA9IHN5c1RpbWUud1llYXI7Ci0gICAgdGltZS0+aG91ciA9IHN5c1RpbWUud0hvdXI7Ci0gICAgdGltZS0+bWluID0gc3lzVGltZS53TWludXRlOwotICAgIHRpbWUtPnNlYyA9IHN5c1RpbWUud1NlY29uZDsKLSAgICBzdGF0dXMgPSB0cnVlOwotCi1FeGl0OgotICAgIENsb3NlSGFuZGxlKChIQU5ETEUpZik7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1GdW5jdGlvbiB0byBzZXQgdGhlIGZpbGUgdGltZSBhbmQgZGF0ZSBmb3IgYSBzcGVjaWZpYyBmaWxlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWlib29sIFBNQVBJIFBNX3NldEZpbGVUaW1lKAotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgIGlib29sIGdtVGltZSwKLSAgICBQTV90aW1lICp0aW1lKQotewotICAgIEhGSUxFICAgICAgIGY7Ci0gICAgT0ZTVFJVQ1QgICAgb2Y7Ci0gICAgRklMRVRJTUUgICAgdXRjVGltZSxsb2NhbFRpbWU7Ci0gICAgU1lTVEVNVElNRSAgc3lzVGltZTsKLSAgICBpYm9vbCAgICAgICBzdGF0dXMgPSBmYWxzZTsKLQotICAgIG9mLmNCeXRlcyA9IHNpemVvZihvZik7Ci0gICAgaWYgKChmID0gT3BlbkZpbGUoZmlsZW5hbWUsJm9mLE9GX1dSSVRFKSkgPT0gSEZJTEVfRVJST1IpCi0JcmV0dXJuIGZhbHNlOwotICAgIHN5c1RpbWUud1llYXIgPSB0aW1lLT55ZWFyOwotICAgIHN5c1RpbWUud01vbnRoID0gdGltZS0+bW9uKzE7Ci0gICAgc3lzVGltZS53WWVhciA9IHRpbWUtPmRheTsKLSAgICBzeXNUaW1lLndIb3VyID0gdGltZS0+aG91cjsKLSAgICBzeXNUaW1lLndNaW51dGUgPSB0aW1lLT5taW47Ci0gICAgc3lzVGltZS53U2Vjb25kID0gdGltZS0+c2VjOwotICAgIGlmICghU3lzdGVtVGltZVRvRmlsZVRpbWUoJnN5c1RpbWUsJmxvY2FsVGltZSkpCi0JZ290byBFeGl0OwotICAgIGlmICghZ21UaW1lKSB7Ci0JaWYgKCFMb2NhbEZpbGVUaW1lVG9GaWxlVGltZSgmbG9jYWxUaW1lLCZ1dGNUaW1lKSkKLQkgICAgZ290byBFeGl0OwotCX0KLSAgICBlbHNlCi0JdXRjVGltZSA9IGxvY2FsVGltZTsKLSAgICBpZiAoIVNldEZpbGVUaW1lKChIQU5ETEUpZixOVUxMLE5VTEwsJnV0Y1RpbWUpKQotCWdvdG8gRXhpdDsKLSAgICBzdGF0dXMgPSB0cnVlOwotCi1FeGl0OgotICAgIENsb3NlSGFuZGxlKChIQU5ETEUpZik7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL3ZmbGF0LmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS93aW4zMi92ZmxhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDQ5MWNkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL3ZmbGF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBBbnkKLSoKLSogRGVzY3JpcHRpb246ICBEdW1teSBtb2R1bGU7IG5vIHZpcnR1YWwgZnJhbWVidWZmZXIgZm9yIHRoaXMgT1MKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJwbWFwaS5oIgotCi1pYm9vbCBQTUFQSSBWRl9hdmFpbGFibGUodm9pZCkKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgKiBQTUFQSSBWRl9pbml0KAotICAgIHVsb25nIGJhc2VBZGRyLAotICAgIGludCBiYW5rU2l6ZSwKLSAgICBpbnQgY29kZUxlbiwKLSAgICB2b2lkICpiYW5rRnVuYykKLXsKLSAgICAodm9pZCliYXNlQWRkcjsKLSAgICAodm9pZCliYW5rU2l6ZTsKLSAgICAodm9pZCljb2RlTGVuOwotICAgICh2b2lkKWJhbmtGdW5jOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIFBNQVBJIFZGX2V4aXQodm9pZCkKLXsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3dpbjMyL3p0aW1lci5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvenRpbWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOTAxYTQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vd2luMzIvenRpbWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgICAgICAgVWx0cmEgTG9uZyBQZXJpb2QgVGltZXIKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgV2luMzIKLSoKLSogRGVzY3JpcHRpb246ICBPUyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFplbiBUaW1lciBmdW5jdGlvbnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgQ1BVX2xhcmdlSW50ZWdlciBjb3VudEZyZXE7Ci1zdGF0aWMgaWJvb2wgICAgICAgICAgICBoYXZlUGVyZm9ybWFuY2VDb3VudGVyOwotc3RhdGljIHVsb25nICAgICAgICAgICAgc3RhcnQsZmluaXNoOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUluaXRpYWxpc2UgdGhlIFplbiBUaW1lciBtb2R1bGUgaW50ZXJuYWxzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgX19aVGltZXJJbml0KHZvaWQpCi17Ci0jaWZkZWYgIE5PX0FTU0VNQkxFUgotICAgIGhhdmVQZXJmb3JtYW5jZUNvdW50ZXIgPSBmYWxzZTsKLSNlbHNlCi0gICAgaGF2ZVBlcmZvcm1hbmNlQ291bnRlciA9IFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koKExBUkdFX0lOVEVHRVIqKSZjb3VudEZyZXEpOwotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotU3RhcnQgdGhlIFplbiBUaW1lciBjb3VudGluZy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfX0xaVGltZXJPbigKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSAgICBpZiAoaGF2ZVBlcmZvcm1hbmNlQ291bnRlcikKLQlRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigoTEFSR0VfSU5URUdFUiopJnRtLT5zdGFydCk7Ci0gICAgZWxzZQotCXRtLT5zdGFydC5sb3cgPSB0aW1lR2V0VGltZSgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUNvbXB1dGUgdGhlIGxhcCB0aW1lIHNpbmNlIHRoZSB0aW1lciB3YXMgc3RhcnRlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdWxvbmcgX19MWlRpbWVyTGFwKAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotICAgIENQVV9sYXJnZUludGVnZXIgICAgdG1MYXAsdG1Db3VudDsKLQotICAgIGlmIChoYXZlUGVyZm9ybWFuY2VDb3VudGVyKSB7Ci0JUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoKExBUkdFX0lOVEVHRVIqKSZ0bUxhcCk7Ci0JX0NQVV9kaWZmVGltZTY0KCZ0bS0+c3RhcnQsJnRtTGFwLCZ0bUNvdW50KTsKLQlyZXR1cm4gX0NQVV9jYWxjTWljcm9TZWMoJnRtQ291bnQsY291bnRGcmVxLmxvdyk7Ci0JfQotICAgIGVsc2UgewotCXRtTGFwLmxvdyA9IHRpbWVHZXRUaW1lKCk7Ci0JcmV0dXJuICh0bUxhcC5sb3cgLSB0bS0+c3RhcnQubG93KSAqIDEwMDBMOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1TdG9wIHRoZSBaZW4gVGltZXIgY291bnRpbmcuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgX19MWlRpbWVyT2ZmKAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotICAgIGlmIChoYXZlUGVyZm9ybWFuY2VDb3VudGVyKQotCVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKChMQVJHRV9JTlRFR0VSKikmdG0tPmVuZCk7Ci0gICAgZWxzZQotCXRtLT5lbmQubG93ID0gdGltZUdldFRpbWUoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Db21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgaW4gbWljcm9zZWNvbmRzIGJldHdlZW4gc3RhcnQgYW5kIGVuZCB0aW1pbmdzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfX0xaVGltZXJDb3VudCgKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSAgICBDUFVfbGFyZ2VJbnRlZ2VyICAgIHRtQ291bnQ7Ci0KLSAgICBpZiAoaGF2ZVBlcmZvcm1hbmNlQ291bnRlcikgewotCV9DUFVfZGlmZlRpbWU2NCgmdG0tPnN0YXJ0LCZ0bS0+ZW5kLCZ0bUNvdW50KTsKLQlyZXR1cm4gX0NQVV9jYWxjTWljcm9TZWMoJnRtQ291bnQsY291bnRGcmVxLmxvdyk7Ci0JfQotICAgIGVsc2UKLQlyZXR1cm4gKHRtLT5lbmQubG93IC0gdG0tPnN0YXJ0LmxvdykgKiAxMDAwTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1EZWZpbmUgdGhlIHJlc29sdXRpb24gb2YgdGhlIGxvbmcgcGVyaW9kIHRpbWVyIGFzIG1pY3Jvc2Vjb25kcyBwZXIgdGltZXIgdGljay4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFVMWlRJTUVSX1JFU09MVVRJT04gICAgIDEwMDAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1SZWFkIHRoZSBMb25nIFBlcmlvZCB0aW1lciBmcm9tIHRoZSBPUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1bG9uZyBfX1VMWlJlYWRUaW1lKHZvaWQpCi17IHJldHVybiB0aW1lR2V0VGltZSgpOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotQ29tcHV0ZSB0aGUgZWxhcHNlZCB0aW1lIGZyb20gdGhlIEJJT1MgdGltZXIgdGljay4gTm90ZSB0aGF0IHdlIGNoZWNrIHRvIHNlZQotd2hldGhlciBhIG1pZG5pZ2h0IGJvdW5kYXJ5IGhhcyBwYXNzZWQsIGFuZCBpZiBzbyBhZGp1c3QgdGhlIGZpbmlzaCB0aW1lIHRvCi1hY2NvdW50IGZvciB0aGlzLiBXZSBjYW5ub3QgZGV0ZWN0IGlmIG1vcmUgdGhhdCBvbmUgbWlkbmlnaHQgYm91bmRhcnkgaGFzCi1wYXNzZWQsIHNvIGlmIHRoaXMgaGFwcGVucyB3ZSB3aWxsIGJlIGdlbmVyYXRpbmcgZXJyb25vdXMgcmVzdWx0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBfX1VMWkVsYXBzZWRUaW1lKHVsb25nIHN0YXJ0LHVsb25nIGZpbmlzaCkKLXsgcmV0dXJuIGZpbmlzaCAtIHN0YXJ0OyB9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy9wbS94MTEvZXZlbnQuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3gxMS9ldmVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzRiZmFjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3gxMS9ldmVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICAgICAgICAgICAgIFNjaVRlY2ggT1MgUG9ydGFiaWxpdHkgTWFuYWdlciBMaWJyYXJ5Ci0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgU2NpVGVjaCBNR0wgUHVibGljCi0qICAgIExpY2Vuc2UgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9tZ2wtbGljZW5zZS50eHQKLSoKLSogICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogICAgIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoQykgMTk5MS0xOTk4IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSoKLSogICAgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZTogICAgIEFOU0kgQwotKiBFbnZpcm9ubWVudDogIFVuaXggLyBYMTEKLSoKLSogRGVzY3JpcHRpb246ICBYMTEgZXZlbnQgcXVldWUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBNR0wuCi0qICAgICAgICAgICAgICAgVGhpcyBjYW4gYmUgdXNlZCBib3RoIGZvciB3aW5kb3dlZCBhbmQgZnVsbHNjcmVlbiAoREdBKSBtb2Rlcy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1c2hvcnQgICAgICAga2V5VXBNc2dbMjU2XSA9IHswfTsvKiBUYWJsZSBvZiBrZXkgdXAgbWVzc2FnZXMgICAgICovCi1zdGF0aWMgaW50ICAgICAgICAgIHJhbmdlWCxyYW5nZVk7ICAgICAgLyogUmFuZ2Ugb2YgbW91c2UgY29vcmRpbmF0ZXMgICAqLwotCi1zdGF0aWMgRGlzcGxheSAgKl9FVlRfZHB5Owotc3RhdGljIFdpbmRvdyAgICBfRVZUX3dpbjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBpbnQga2V5Y29kZTsKLSAgaW50IHNjYW5jb2RlOwotfSB4a2V5bWFwOwotCi14a2V5bWFwIHhrZXltYXBzW10gPSB7Ci0gIHsgOSwgS0JfZXNjfSwKLSAgezI0LCBLQl9RfSwKLSAgezI1LCBLQl9XfSwKLSAgezI2LCBLQl9FfSwKLSAgezI3LCBLQl9SfSwKLSAgezI4LCBLQl9UfSwKLSAgezI5LCBLQl9ZfSwKLSAgezMwLCBLQl9VfSwKLSAgezMxLCBLQl9JfSwKLSAgezMyLCBLQl9PfSwKLSAgezMzLCBLQl9QfSwKLX07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFRoZXNlIGFyZSBub3QgdXNlZCB1bmRlciBub24tRE9TIHN5c3RlbXMgKi8KLSNkZWZpbmUgX0VWVF9kaXNhYmxlSW50KCkgICAgICAgMQotI2RlZmluZSBfRVZUX3Jlc3RvcmVJbnQoZmxhZ3MpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc2NhbkNvZGUgICAgLSBTY2FuIGNvZGUgdG8gdGVzdAotCi1SRU1BUktTOgotVGhpcyBtYWNybyBkZXRlcm1pbmVzIGlmIGEgc3BlY2lmaWVkIGtleSBpcyBjdXJyZW50bHkgZG93biBhdCB0aGUKLXRpbWUgdGhhdCB0aGUgY2FsbCBpcyBtYWRlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX0VWVF9pc0tleURvd24oc2NhbkNvZGUpICAgIChrZXlVcE1zZ1tzY2FuQ29kZV0gIT0gMCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBudW1iZXIgb2YgdGlja3Mgc2luY2Ugc3lzdGVtCi1zdGFydHVwIGluIG1pbGxpc2Vjb25kcy4gVGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgdmFsdWUgdGhhdCBpcyBwbGFjZWQgaW50bwotdGhlIHRpbWUgc3RhbXAgZmllbGRzIG9mIGV2ZW50cywgYW5kIGlzIHVzZWQgdG8gaW1wbGVtZW50IGF1dG8gbW91c2UgZG93bgotZXZlbnRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIF9FVlRfZ2V0VGlja3Modm9pZCkKLXsKLSAgc3RhdGljIHVuc2lnbmVkIHN0YXJ0dGltZSA9IDA7Ci0gIHN0cnVjdCB0aW1ldmFsIHQ7Ci0KLSAgZ2V0dGltZW9mZGF5KCZ0LCBOVUxMKTsKLSAgaWYgKHN0YXJ0dGltZSA9PSAwKQotICAgIHN0YXJ0dGltZSA9IHQudHZfc2VjICogMTAwMCArICh0LnR2X3VzZWMvMTAwMCk7Ci0gIHJldHVybiAoKHQudHZfc2VjICogMTAwMCArICh0LnR2X3VzZWMvMTAwMCkpIC0gc3RhcnR0aW1lKTsKLX0KLQotc3RhdGljIGludCBnZXRTY2FuY29kZShpbnQga2V5Y29kZSkKLXsKLSAgcmV0dXJuIGtleWNvZGUtODsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1QdW1wcyBhbGwgbWVzc2FnZXMgaW4gdGhlIGFwcGxpY2F0aW9uIG1lc3NhZ2UgcXVldWUgaW50byBvdXIgZXZlbnQgcXVldWUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIFgxMV9DT1JFCi1zdGF0aWMgdm9pZCBfRVZUX3B1bXBYMTFNZXNzYWdlcyh2b2lkKQotI2Vsc2UKLXN0YXRpYyB2b2lkIF9FVlRfcHVtcE1lc3NhZ2VzKHZvaWQpCi0jZW5kaWYKLXsKLSAgLyogVE9ETzogVGhlIHB1cnBvc2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyB0byByZWFkIGFsbCBrZXlib2FyZCBhbmQgbW91c2UgKi8KLSAgLyogICAgICAgICBldmVudHMgZnJvbSB0aGUgT1Mgc3BlY2lmaWMgZXZlbnQgcXVldWUsIHRyYW5zbGF0ZSB0aGVtIGFuZCBwb3N0ICovCi0gIC8qICAgICAgICAgdGhlbSBpbnRvIHRoZSBTY2lUZWNoIGV2ZW50IHF1ZXVlLiAqLwotICBldmVudF90IGV2dDsKLSAgWEV2ZW50ICBldjsKLSAgc3RhdGljIGludCBvbGRfbXggPSAwLCBvbGRfbXkgPSAwLCBidXRzID0gMCwgYzsKLSAgY2hhciBidWZbMl07Ci0KLSAgd2hpbGUgKFhQZW5kaW5nKF9FVlRfZHB5KSAmJiBYTmV4dEV2ZW50KF9FVlRfZHB5LCZldikpIHsKLSAgICBldnQud2hlbiA9IF9NR0xfZ2V0VGlja3MoKTsKLQotICAgIHN3aXRjaChldi50eXBlKXsKLSAgICBjYXNlIEtleVByZXNzOgotICAgICAgYyA9IGdldFNjYW5jb2RlKGV2LnhrZXkua2V5Y29kZSk7Ci0gICAgICBldnQud2hhdCA9IEVWVF9LRVlET1dOOwotICAgICAgZXZ0Lm1lc3NhZ2UgPSBjIDw8IDg7Ci0gICAgICBYTG9va3VwU3RyaW5nKCZldi54a2V5LCBidWYsIDIsIE5VTEwsIE5VTEwpOwotICAgICAgZXZ0Lm1lc3NhZ2UgfD0gYnVmWzBdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLZXlSZWxlYXNlOgotICAgICAgYyA9IGdldFNjYW5jb2RlKGV2LnhrZXkua2V5Y29kZSk7Ci0gICAgICBldnQud2hhdCA9IEVWVF9LRVlVUDsKLSAgICAgIGV2dC5tZXNzYWdlID0ga2V5VXBNc2dbY107Ci0gICAgICBpZihjb3VudCA8IEVWRU5UUVNJWkUpCi0JYWRkRXZlbnQoJmV2dCk7Ci0gICAgICBrZXlVcE1zZ1tjXSA9IDA7Ci0gICAgICByZXBlYXRLZXlbY10gPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCdXR0b25QcmVzczoKLSAgICAgIGV2dC53aGF0ID0gRVZUX01PVVNFRE9XTjsKLSAgICAgIGlmKGV2LnhidXR0b24uYnV0dG9uID09IDEpewotCWJ1dHMgfD0gRVZUX0xFRlRCVVQ7Ci0JZXZ0Lm1lc3NhZ2UgPSBFVlRfTEVGVEJNQVNLOwotICAgICAgfWVsc2UgaWYoZXYueGJ1dHRvbi5idXR0b24gPT0gMil7Ci0JYnV0cyB8PSBFVlRfTUlERExFQlVUOwotCWV2dC5tZXNzYWdlID0gRVZUX01JRERMRUJNQVNLOwotICAgICAgfWVsc2UgaWYoZXYueGJ1dHRvbi5idXR0b24gPT0gMyl7Ci0JYnV0cyB8PSBFVlRfUklHSFRCVVQ7Ci0JZXZ0Lm1lc3NhZ2UgPSBFVlRfUklHSFRCTUFTSzsKLSAgICAgIH0KLSAgICAgIGV2dC5tb2RpZmllcnMgPSBtb2RpZmllcnMgfCBidXRzOwotCi0gICAgICBicmVhazsKLSAgICBjYXNlIEJ1dHRvblJlbGVhc2U6Ci0gICAgICBldnQud2hhdCA9IEVWVF9NT1VTRVVQOwotICAgICAgaWYoZXYueGJ1dHRvbi5idXR0b24gPT0gMSl7Ci0JYnV0cyAmPSB+RVZUX0xFRlRCVVQ7Ci0JZXZ0Lm1lc3NhZ2UgPSBFVlRfTEVGVEJNQVNLOwotICAgICAgfWVsc2UgaWYoZXYueGJ1dHRvbi5idXR0b24gPT0gMil7Ci0JYnV0cyAmPSB+RVZUX01JRERMRUJVVDsKLQlldnQubWVzc2FnZSA9IEVWVF9NSURETEVCTUFTSzsKLSAgICAgIH1lbHNlIGlmKGV2LnhidXR0b24uYnV0dG9uID09IDMpewotCWJ1dHMgJj0gfkVWVF9SSUdIVEJVVDsKLQlldnQubWVzc2FnZSA9IEVWVF9SSUdIVEJNQVNLOwotICAgICAgfQotICAgICAgZXZ0Lm1vZGlmaWVycyA9IG1vZGlmaWVycyB8IGJ1dHM7Ci0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTW90aW9uTm90aWZ5OgotICAgICAgZXZ0LndoYXQgPSBFVlRfTU9VU0VNT1ZFOwotICAgICAgZXZ0LndoZXJlX3ggPSBldi54bW90aW9uLng7Ci0gICAgICBldnQud2hlcmVfeSA9IGV2Lnhtb3Rpb24ueTsKLSAgICAgIGV2dC5yZWxhdGl2ZV94ID0gZXZ0LndoZXJlX3ggLSBvbGRfbXg7Ci0gICAgICBldnQucmVsYXRpdmVfeSA9IGV2dC53aGVyZV95IC0gb2xkX215OwotICAgICAgb2xkX214ID0gZXZ0LndoZXJlX3g7Ci0gICAgICBvbGRfbXkgPSBldnQud2hlcmVfeTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoY291bnQgPCBFVkVOVFFTSVpFKQotICAgICAgYWRkRXZlbnQoJmV2dCk7Ci0gIH0KLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVRoaXMgbWFjcm8vZnVuY3Rpb24gaXMgdXNlZCB0byBjb252ZXJ0cyB0aGUgc2NhbiBjb2RlcyByZXBvcnRlZCBieSB0aGUKLWtleWJvYXJkIHRvIG91ciBldmVudCBsaWJyYXJpZXMgbm9ybWFsaXNlZCBmb3JtYXQuIFdlIG9ubHkgaGF2ZSBvbmUgc2NhbgotY29kZSBmb3IgdGhlICdBJyBrZXksIGFuZCB1c2Ugc2hpZnQgbW9kaWZpZXJzIHRvIGRldGVybWluZSBpZiBpdCBpcyBhCi1DdHJsLUYxLCBBbHQtRjEgZXRjLiBUaGUgcmF3IHNjYW4gY29kZXMgZnJvbSB0aGUga2V5Ym9hcmQgd29yayB0aGlzIHdheSwKLWJ1dCB0aGUgT1MgZ2l2ZXMgdXMgJ2Nvb2tlZCcgc2NhbiBjb2Rlcywgd2UgaGF2ZSB0byB0cmFuc2xhdGUgdGhlbSBiYWNrCi10byB0aGUgcmF3IGZvcm1hdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9FVlRfbWFza0tleUNvZGUoZXZ0KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVNhZmVseSBhYm9ydCB0aGUgZXZlbnQgbW9kdWxlIHVwb24gY2F0Y2hpbmcgYSBmYXRhbCBlcnJvci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9FVlRfYWJvcnQoKQotewotICAgIEVWVF9leGl0KCk7Ci0gICAgUE1fZmF0YWxFcnJvcigiVW5oYW5kbGVkIGV4Y2VwdGlvbiEiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1tb3VzZU1vdmUgICAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbmV2ZSB0aGUgbW91c2UgbmVlZHMgdG8gYmUgbW92ZWQKLQotUkVNQVJLUzoKLUluaXRpbGlhc2UgdGhlIGV2ZW50IGhhbmRsaW5nIG1vZHVsZS4gSGVyZSB3ZSBpbnN0YWxsIG91ciBtb3VzZSBoYW5kbGluZyBJU1IKLXRvIGJlIGNhbGxlZCB3aGVuZXZlciBhbnkgYnV0dG9uJ3MgYXJlIHByZXNzZWQgb3IgcmVsZWFzZWQuIFdlIGFsc28gYnVpbGQKLXRoZSBmcmVlIGxpc3Qgb2YgZXZlbnRzIGluIHRoZSBldmVudCBxdWV1ZS4KLQotV2UgdXNlIGhhbmRsZXIgbnVtYmVyIDIgb2YgdGhlIG1vdXNlIGxpYnJhcmllcyBpbnRlcnJ1cHQgaGFuZGxlcnMgZm9yIG91cgotZXZlbnQgaGFuZGxpbmcgcm91dGluZXMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIFgxMV9DT1JFCi12b2lkIEVWVEFQSSBFVlRfaW5pdFgxMSgKLSNlbHNlCi12b2lkIEVWVEFQSSBFVlRfaW5pdCgKLSNlbmRpZgotICAgIF9FVlRfbW91c2VNb3ZlSGFuZGxlciBtb3VzZU1vdmUpCi17Ci0gIGludCByZXN1bHQsIGksaixrOwotICBYRGV2aWNlSW5mb1B0ciAgICBsaXN0LHNsaXN0OwotCi0gIC8qIEluaXRpYWxpc2UgdGhlIGV2ZW50IHF1ZXVlICovCi0gIF9tb3VzZU1vdmUgPSBtb3VzZU1vdmU7Ci0gIGluaXRFdmVudFF1ZXVlKCk7Ci0gIG1lbXNldChrZXlVcE1zZywwLHNpemVvZihrZXlVcE1zZykpOwotCi0KLSAgLyogcXVlcnkgc2VydmVyIGZvciBpbnB1dCBleHRlbnNpb25zICovCi0gIHJlc3VsdCA9WFF1ZXJ5RXh0ZW5zaW9uKF9FVlRfZHB5LCJYSW5wdXRFeHRlbnNpb24iLCZpLCZqLCZrKTsKLSAgaWYoIXJlc3VsdCkgewotICAgIGZwcmludGYoc3RkZXJyLCJZb3VyIHNlcnZlciBkb2Vzbid0IHN1cHBvcnQgWElucHV0IEV4dGVuc2lvbnNcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCJYMTEgSm95c3RpY2sgZGlzYWJsZWRcbiIpOwotICB9Ci0gIGxpc3QgPSBYTGlzdElucHV0RGV2aWNlcyhfRVZUX2RweSwmcmVzdWx0KTsKLSAgaWYgKCFsaXN0KSB7Ci0gICAgZnByaW50ZihzdGRlcnIsIk5vIGV4dGVuZGVkIGlucHV0IGRldmljZXMgZm91bmQgISFcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCJYMTEgSm95c3RpY2sgZGlzYWJsZWRcbiIpOwotICB9Ci0KLQotICAvKiBDYXRjaCBwcm9ncmFtIHRlcm1pbmF0aW9uIHNpZ25hbHMgc28gd2UgY2FuIGNsZWFuIHVwIHByb3Blcmx5ICovCi0gIHNpZ25hbChTSUdBQlJULCBfRVZUX2Fib3J0KTsKLSAgc2lnbmFsKFNJR0ZQRSwgX0VWVF9hYm9ydCk7Ci0gIHNpZ25hbChTSUdJTlQsIF9FVlRfYWJvcnQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUwotQ2hhbmdlcyB0aGUgcmFuZ2Ugb2YgY29vcmRpbmF0ZXMgcmV0dXJuZWQgYnkgdGhlIG1vdXNlIGZ1bmN0aW9ucyB0byB0aGUKLXNwZWNpZmllZCByYW5nZSBvZiB2YWx1ZXMuIFRoaXMgaXMgdXNlZCB3aGVuIGNoYW5naW5nIGJldHdlZW4gZ3JhcGhpY3MKLW1vZGVzIHNldCB0aGUgcmFuZ2Ugb2YgbW91c2UgY29vcmRpbmF0ZXMgZm9yIHRoZSBuZXcgZGlzcGxheSBtb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUQVBJIEVWVF9zZXRNb3VzZVJhbmdlKAotICAgIGludCB4UmVzLAotICAgIGludCB5UmVzKQotewotICAgIHJhbmdlWCA9IHhSZXM7Ci0gICAgcmFuZ2VZID0geVJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1Jbml0aWFpbGlzZXMgdGhlIGludGVybmFsIGV2ZW50IGhhbmRsaW5nIG1vZHVsZXMuIFRoZSBFVlRfc3VzcGVuZCBmdW5jdGlvbgotY2FuIGJlIGNhbGxlZCB0byBzdXNwZW5kIGV2ZW50IGhhbmRsaW5nIChzdWNoIGFzIHdoZW4gc2hlbGxpbmcgb3V0IHRvIERPUyksCi1hbmQgdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXN1bWUgaXQgYWdhaW4gbGF0ZXIuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfcmVzdW1lKHZvaWQpCi17Ci0gICAgLyogRG8gbm90aGluZyBmb3Igbm9uIERPUyBzeXN0ZW1zICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1TdXNwZW5kcyBhbGwgb2Ygb3VyIGV2ZW50IGhhbmRsaW5nIG9wZXJhdGlvbnMuIFRoaXMgaXMgYWxzbyB1c2VkIHRvCi1kZS1pbnN0YWxsIHRoZSBldmVudCBoYW5kbGluZyBjb2RlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRVZUX3N1c3BlbmQodm9pZCkKLXsKLSAgICAvKiBEbyBub3RoaW5nIGZvciBub24gRE9TIHN5c3RlbXMgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1MKLUV4aXRzIHRoZSBldmVudCBtb2R1bGUgZm9yIHByb2dyYW0gdGVybWluYXRhdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEVWVF9leGl0KHZvaWQpCi17Ci0gICAgLyogUmVzdG9yZSBzaWduYWwgaGFuZGxlcnMgKi8KLSAgICBzaWduYWwoU0lHQUJSVCwgU0lHX0RGTCk7Ci0gICAgc2lnbmFsKFNJR0ZQRSwgU0lHX0RGTCk7Ci0gICAgc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCk7Ci0KLSAgICAvKiBUT0RPOiBEbyBhbnkgT1Mgc3BlY2lmaWMgY2xlYW51cCBpbiBoZXJlICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTCi1TZXRzIHRoZSBjdXJyZW50IFgxMSBkaXNwbGF5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBFVlRfc2V0WDExRGlzcGxheShEaXNwbGF5ICpkcHksIFdpbmRvdyB3aW4pCi17Ci0gIF9FVlRfZHB5ID0gZHB5OwotICBfRVZUX3dpbiA9IHdpbjsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3gxMS9vc2hkci5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0veDExL29zaGRyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZDc0NTEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0veDExL29zaGRyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICAgICAgICAgICAgICBTY2lUZWNoIE9TIFBvcnRhYmlsaXR5IE1hbmFnZXIgTGlicmFyeQotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIFNjaVRlY2ggTUdMIFB1YmxpYwotKiAgICBMaWNlbnNlIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5zY2l0ZWNoc29mdC5jb20vbWdsLWxpY2Vuc2UudHh0Ci0qCi0qICAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICAgICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgICBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qCi0qICAgIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKLSogRW52aXJvbm1lbnQ6ICBCZU9TCi0qCi0qIERlc2NyaXB0aW9uOiAgSW5jbHVkZSBmaWxlIHRvIGluY2x1ZGUgYWxsIE9TIHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgotI2luY2x1ZGUgPFgxMS9rZXlzeW0uaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaWZkZWYgVVNFX09TX0pPWVNUSUNLCi0jaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvWEkuaD4KLSNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YSW5wdXQuaD4KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vel9zYW1wbGVzLnZwaiBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3pfc2FtcGxlcy52cGoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNmM4MGYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0vel9zYW1wbGVzLnZwagorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLVtTY2lUZWNoXQ0KLWNvbXBpbGVyPXdjMTAtIA0KLXRhcmdldG9zPWQzMiANCi1bQ09NUElMRVJdDQotdmVyc2lvbj01LjBiDQotTUFDUk89ZW5hYmxlX2N1cnJlbnRfY29tcGlsZXJcbg0KLWFjdGl2ZWNvbmZpZz0sZ2V0Y2guZXhlDQotRklMVEVSTkFNRT1Tb3VyY2UgRmlsZXNcbg0KLUZJTFRFUlBBVFRFUk49Ki5jOyouY3BwOyouY3h4OyoucHJnOyoucGFzOyouZHByOyouYmFzOyouamF2YTsqLnNjOyouZTsqLmNvYjsqLmh0bWw7Ki5yY1xuDQotRklMVEVSQVNTT0NJQVRFRklMRVRZUEVTPTAgDQotRklMVEVSQVBQQ09NTUFORD1cbg0KLXZjc3Byb2plY3Q9U0NDOlBlcmZvcmNlIFNDTTovL2RlcG90DQotdmNzbG9jYWxwYXRoPVNDQzpQZXJmb3JjZSBTQ006YzpcDQotY29tcGlsZT1jb25jdXJ8Y2FwdHVyZXw6Q29tcGlsZTomQ29tcGlsZSxkbWFrZSAlbi5vYmoNCi1tYWtlPWNvbmN1cnxjYXB0dXJlfGNsZWFyfHNhdmVhbGx8OkJ1aWxkOiZCdWlsZCxkbWFrZSAlYg0KLXJlYnVpbGQ9Y29uY3VyfGNhcHR1cmV8Y2xlYXJ8c2F2ZWFsbHw6UmVidWlsZDomUmVidWlsZCxkbWFrZSAtdSAlYg0KLWRlYnVnPWNvbmN1cnxjYXB0dXJlfHNhdmVub25lfG5vY2hhbmdlZGlyfDpEZWJ1ZzomRGVidWcsd2RuICViDQotZXhlY3V0ZT1oaWRlfHNhdmVub25lfG5vY2hhbmdlZGlyfDpFeGVjdXRlOkUmeGVjdXRlLA0KLXVzZXIxPWhpZGV8bm9jaGFuZ2VkaXJ8OlVzZXIgMTpVc2VyIDEsDQotdXNlcjI9aGlkZXxub2NoYW5nZWRpcnw6VXNlciAyOlVzZXIgMiwNCi11c2VydG9vbF9idWlsZF9hbGw9Y29uY3VyfGNhcHR1cmV8Y2xlYXJ8c2F2ZW5vbmV8OkJ1aWxkIEFsbDpCdWlsZCBBbGwsZG1ha2UgYWxsDQotdXNlcnRvb2xfcmVidWlsZF9hbGw9Y29uY3VyfGNhcHR1cmV8Y2xlYXJ8c2F2ZW5vbmV8OlJlYnVpbGQgQWxsOlJlYnVpbGQgQWxsLGRtYWtlIC11IGFsbA0KLXVzZXJ0b29sX2NsZWFuX2RpcmVjdG9yeT1jb25jdXJ8Y2FwdHVyZXxzYXZlbm9uZXw6Q2xlYW4gRGlyZWN0b3J5OiZDbGVhbiBEaXJlY3RvcnksZG1ha2UgY2xlYW5leGUNCi13b3JraW5nZGlyPS4NCi1pbmNsdWRlZGlycz0lKFNDSVRFQ0gpXGluY2x1ZGU7JShQUklWQVRFKVxpbmNsdWRlDQotcmVmZmlsZT0NCi1bRklMRVNdDQotdGVzdHNcYWx0YnJrLmMNCi10ZXN0c1xhbHRjcml0LmMNCi10ZXN0c1xiaW9zcHRyLmMNCi10ZXN0c1xibG9jay5jDQotdGVzdHNcYnJrLmMNCi10ZXN0c1xjYWxscmVhbC5jDQotdGVzdHNcY2hlY2tzLmMNCi10ZXN0c1xjcHUuYw0KLXRlc3RzXGNyaXRpY2FsLmMNCi10ZXN0c1xnZXRjaC5jDQotdGVzdHNcaXN2ZXNhLmMNCi10ZXN0c1xrZXkuYw0KLXRlc3RzXGtleTE1LmMNCi10ZXN0c1xtZW10ZXN0LmMNCi10ZXN0c1xtb3VzZS5jDQotdGVzdHNccnRjLmMNCi10ZXN0c1xzaG93cGNpLmMNCi10ZXN0c1x0aWNrLmMNCi10ZXN0c1x0aW1lcmMuYw0KLXRlc3RzXHRpbWVyY3BwLmNwcA0KLXRlc3RzXHVzd2MuYw0KLXRlc3RzXHZmdGVzdC5jDQotdGVzdHNcdmlkZW8uYw0KLVtBU1NPQ0lBVElPTl0NCi1bQ09ORklHVVJBVElPTlNdDQotY29uZmlnPSxhbHRicmsuZXhlDQotY29uZmlnPSxhbHRjcml0LmV4ZQ0KLWNvbmZpZz0sYmlvc3B0ci5leGUNCi1jb25maWc9LGJsb2NrLmV4ZQ0KLWNvbmZpZz0sYnJrLmV4ZQ0KLWNvbmZpZz0sY2FsbHJlYWwuZXhlDQotY29uZmlnPSxjcHUuZXhlDQotY29uZmlnPSxjcml0aWNhbC5leGUNCi1jb25maWc9LGdldGNoLmV4ZQ0KLWNvbmZpZz0saXN2ZXNhLmV4ZQ0KLWNvbmZpZz0sa2V5LmV4ZQ0KLWNvbmZpZz0sa2V5MTUuZXhlDQotY29uZmlnPSxtZW10ZXN0LmV4ZQ0KLWNvbmZpZz0sbW91c2UuZXhlDQotY29uZmlnPSxydGMuZXhlDQotY29uZmlnPSxzaG93cGNpLmV4ZQ0KLWNvbmZpZz0sdGljay5leGUNCi1jb25maWc9LHRpbWVyYy5leGUNCi1jb25maWc9LHRpbWVyY3BwLmV4ZQ0KLWNvbmZpZz0sdXN3Yy5leGUNCi1jb25maWc9LHZmdGVzdC5leGUNCi1jb25maWc9LHZpZGVvLmV4ZQ0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3BtL3p0aW1lci5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0venRpbWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhY2Y3YjEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvcG0venRpbWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAgICAgICAgICAgICAgU2NpVGVjaCBPUyBQb3J0YWJpbGl0eSBNYW5hZ2VyIExpYnJhcnkKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBTY2lUZWNoIE1HTCBQdWJsaWMKLSogICAgTGljZW5zZSBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuc2NpdGVjaHNvZnQuY29tL21nbC1saWNlbnNlLnR4dAotKgotKiAgICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAgICAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICAgVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKgotKiAgICBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgQU5TSSBDCi0qIEVudmlyb25tZW50OiAgQW55Ci0qCi0qIERlc2NyaXB0aW9uOiAgTW9kdWxlIHRvIGltcGxlbWVudCBoaWdoIHByZWNpc2lvbiB0aW1pbmcgb24gZWFjaCBPUy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJ6dGltZXIuaCIKLSNpbmNsdWRlICJwbWFwaS5oIgotI2luY2x1ZGUgIm9zaGRyLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBMWlRpbWVyT2JqZWN0ICAgIExaVGltZXI7Ci1zdGF0aWMgdWxvbmcgICAgICAgICAgICBzdGFydCxmaW5pc2g7Ci0jaWZkZWYgIF9fSU5URUxfXwotc3RhdGljIGxvbmcgICAgICAgICAgICAgY3B1U3BlZWQgPSAtMTsKLXN0YXRpYyBpYm9vbCAgICAgICAgICAgIGhhdmVSRFRTQyA9IGZhbHNlOwotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEV4dGVybmFsIEludGVsIGFzc2VtYmxlciBmdW5jdGlvbnMgKi8KLSNpZmRlZiAgX19JTlRFTF9fCi0vKiB7c2VjcmV0fSAqLwotdm9pZCAgX0FTTUFQSSBfQ1BVX3JlYWRUaW1lU3RhbXAoQ1BVX2xhcmdlSW50ZWdlciAqdGltZSk7Ci0vKiB7c2VjcmV0fSAqLwotdWxvbmcgX0FTTUFQSSBfQ1BVX2RpZmZUaW1lNjQoQ1BVX2xhcmdlSW50ZWdlciAqdDEsQ1BVX2xhcmdlSW50ZWdlciAqdDIsQ1BVX2xhcmdlSW50ZWdlciAqdCk7Ci0vKiB7c2VjcmV0fSAqLwotdWxvbmcgX0FTTUFQSSBfQ1BVX2NhbGNNaWNyb1NlYyhDUFVfbGFyZ2VJbnRlZ2VyICpjb3VudCx1bG9uZyBmcmVxKTsKLSNlbmRpZgotCi0jaWYgICAgIGRlZmluZWQoX19TTVgzMl9fKQotI2luY2x1ZGUgInNteC96dGltZXIuYyIKLSNlbGlmICAgZGVmaW5lZChfX1JUVEFSR0VUX18pCi0jaW5jbHVkZSAicnR0YXJnZXQvenRpbWVyLmMiCi0jZWxpZiAgIGRlZmluZWQoX19SRUFMRE9TX18pCi0jaW5jbHVkZSAiZG9zL3p0aW1lci5jIgotI2VsaWYgICBkZWZpbmVkKF9fTlRfRFJJVkVSX18pCi0jaW5jbHVkZSAibnRkcnYvenRpbWVyLmMiCi0jZWxpZiAgIGRlZmluZWQoX19XSU4zMl9WWERfXykKLSNpbmNsdWRlICJ2eGQvenRpbWVyLmMiCi0jZWxpZiAgIGRlZmluZWQoX19XSU5ET1dTMzJfXykKLSNpbmNsdWRlICJ3aW4zMi96dGltZXIuYyIKLSNlbGlmICAgZGVmaW5lZChfX09TMl9WRERfXykKLSNpbmNsdWRlICJ2ZGQvenRpbWVyLmMiCi0jZWxpZiAgIGRlZmluZWQoX19PUzJfXykKLSNpbmNsdWRlICJvczIvenRpbWVyLmMiCi0jZWxpZiAgIGRlZmluZWQoX19MSU5VWF9fKQotI2luY2x1ZGUgImxpbnV4L3p0aW1lci5jIgotI2VsaWYgICBkZWZpbmVkKF9fUU5YX18pCi0jaW5jbHVkZSAicW54L3p0aW1lci5jIgotI2VsaWYgICBkZWZpbmVkKF9fQkVPU19fKQotI2luY2x1ZGUgImJlb3MvenRpbWVyLmMiCi0jZWxzZQotI2Vycm9yICBUaW1lciBsaWJyYXJ5IG5vdCBwb3J0ZWQgdG8gdGhpcyBwbGF0Zm9ybSB5ZXQhCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIGludGVyZmFjZSByb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotSW5pdGlhbGl6ZXMgdGhlIFplbiBUaW1lciBsaWJyYXJ5IChleHRlbmRlZCkKLQotUEFSQU1FVEVSUzoKLWFjY3VyYXRlICAgIC0gVHJ1ZSBvZiB0aGUgc3BlZWQgc2hvdWxkIGJlIG1lYXN1cmVkIGFjY3VyYXRlbHkKLQotSEVBREVSOgotenRpbWVyLmgKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIFplbiBUaW1lciBsaWJyYXJ5LCBhbmQgL211c3QvIGJlIGNhbGxlZCBiZWZvcmUKLWFueSBvZiB0aGUgcmVtYWluaW5nIFplbiBUaW1lciBsaWJyYXJ5IGZ1bmN0aW9ucyBhcmUgY2FsbGVkLiBUaGUgYWNjdXJhdGUKLXBhcmFtZXRlciBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIGhpZ2hseSBhY2N1cmF0ZSB0aW1pbmcgc2hvdWxkIGJlCi11c2VkIG9yIG5vdC4gSWYgaGlnaCBhY2N1cmFjeSBpcyBuZWVkZWQsIG1vcmUgdGltZSBpcyBzcGVudCBwcm9maWxpbmcgdGhlCi1hY3R1YWwgc3BlZWQgb2YgdGhlIENQVSBzbyB0aGF0IHdlIGNhbiBvYnRhaW4gaGlnaGx5IGFjY3VyYXRlIHRpbWluZwotcmVzdWx0cywgYnV0IHRoZSB0aW1lIHNwZW50IGluIHRoZSBpbml0aWFsaXNhdGlvbiByb3V0aW5lIHdpbGwgYmUKLXNpZ25pZmljYW50bHkgbG9uZ2VyIChvbiB0aGUgb3JkZXIgb2YgNSBzZWNvbmRzKS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFpBUEkgWlRpbWVySW5pdEV4dCgKLSAgICBpYm9vbCBhY2N1cmF0ZSkKLXsKLSAgICBpZiAoY3B1U3BlZWQgPT0gLTEpIHsKLQlfX1pUaW1lckluaXQoKTsKLSNpZmRlZiAgX19JTlRFTF9fCi0JY3B1U3BlZWQgPSBDUFVfZ2V0UHJvY2Vzc29yU3BlZWRJbkhaKGFjY3VyYXRlKTsKLQloYXZlUkRUU0MgPSBDUFVfaGF2ZVJEVFNDKCkgJiYgKGNwdVNwZWVkID4gMCk7Ci0jZW5kaWYKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLUluaXRpYWxpemVzIHRoZSBaZW4gVGltZXIgbGlicmFyeS4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIFplbiBUaW1lciBsaWJyYXJ5LCBhbmQgL211c3QvIGJlIGNhbGxlZCBiZWZvcmUKLWFueSBvZiB0aGUgcmVtYWluaW5nIFplbiBUaW1lciBsaWJyYXJ5IGZ1bmN0aW9ucyBhcmUgY2FsbGVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgWkFQSSBaVGltZXJJbml0KHZvaWQpCi17Ci0gICAgWlRpbWVySW5pdEV4dChmYWxzZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVN0YXJ0cyB0aGUgTG9uZyBQZXJpb2QgWmVuIFRpbWVyIGNvdW50aW5nLgotCi1IRUFERVI6Ci16dGltZXIuaAotCi1QQVJBTUVURVJTOgotdG0gIC0gVGltZXIgb2JqZWN0IHRvIHN0YXJ0IHRpbWluZyB3aXRoCi0KLVJFTUFSS1M6Ci1TdGFydHMgdGhlIExvbmcgUGVyaW9kIFplbiBUaW1lciBjb3VudGluZy4gT25jZSB5b3UgaGF2ZSBzdGFydGVkIHRoZSB0aW1lciwKLXlvdSBjYW4gc3RvcCBpdCB3aXRoIExaVGltZXJPZmYgb3IgeW91IGNhbiBsYXRjaCB0aGUgY3VycmVudCBjb3VudCB3aXRoCi1MWlRpbWVyTGFwLgotCi1UaGUgTG9uZyBQZXJpb2QgWmVuIFRpbWVyIHVzZXMgYSBudW1iZXIgb2YgZGlmZmVyZW50IGhpZ2ggcHJlY2lzaW9uIHRpbWluZwotbWVjaGFuaXNtcyB0byBvYnRhaW4gbWljcm9zZWNvbmQgYWNjdXJhdGUgdGltaW5ncyByZXN1bHRzIHdoZW5ldmVyIHBvc3NpYmxlLgotVGhlIGZvbGxvd2luZyBkaWZmZXJlbnQgdGVjaG5pcXVlcyBhcmUgdXNlZCBkZXBlbmRpbmcgb24gdGhlIG9wZXJhdGluZwotc3lzdGVtLCBydW50aW1lIGVudmlyb25tZW50IGFuZCBDUFUgb24gdGhlIHRhcmdldCBtYWNoaW5lLiBJZiB0aGUgdGFyZ2V0Ci1zeXN0ZW0gaGFzIGEgUGVudGl1bSBDUFUgaW5zdGFsbGVkIHdoaWNoIHN1cHBvcnRzIHRoZSBSZWFkIFRpbWUgU3RhbXAKLUNvdW50ZXIgaW5zdHJ1Y3Rpb24gKFJEVFNDKSwgdGhlIFplbiBUaW1lciBsaWJyYXJ5IHdpbGwgdXNlIHRoaXMgdG8KLW9idGFpbiB0aGUgbWF4aW11bSB0aW1pbmcgcHJlY2lzaW9uIGF2YWlsYWJsZS4KLQotVW5kZXIgMzItYml0IFdpbmRvd3MsIGlmIHRoZSBQZW50aXVtIFJEVFNDIGluc3RydWN0aW9uIGlzIG5vdCBhdmFpbGFibGUsIHdlCi1maXJzdCB0cnkgdG8gdXNlIHRoZSBXaW4zMiBRdWVyeVBlcmZvcm1hbmNlQ291bnRlciBBUEksIGFuZCBpZiB0aGF0IGlzIG5vdAotYXZhaWxhYmxlIHdlIGZhbGwgYmFjayBvbiB0aGUgdGltZUdldFRpbWUgQVBJIHdoaWNoIGlzIGFsd2F5cyBzdXBwb3J0ZWQuCi0KLVVuZGVyIDMyLWJpdCBET1MsIGlmIHRoZSBQZW50aXVtIFJEVFNDIGluc3RydWN0aW9uIGlzIG5vdCBhdmFpbGFibGUsIHdlCi10aGVuIGRvIGFsbCB0aW1pbmcgdXNpbmcgdGhlIG9sZCBzdHlsZSA4MjUzIHRpbWVyIGNoaXAuIFRoZSA4MjUzIHRpbWVyCi1yb3V0aW5lcyBwcm92aWRlIGhpZ2hseSBhY2N1cmF0ZSB0aW1pbmdzIHJlc3VsdHMgaW4gcHVyZSBET1MgbW9kZSwgaG93ZXZlcgotaW4gYSBET1MgYm94IHVuZGVyIFdpbmRvd3Mgb3Igb3RoZXIgT3BlcmF0aW5nIFN5c3RlbXMgdGhlIHZpcnR1YWxpemF0aW9uCi1vZiB0aGUgdGltZXIgY2FuIHByb2R1Y2UgaW5hY2N1cmF0ZSByZXN1bHRzLgotCi1Ob3RlOiBCZWNhdXNlIHRoZSBMb25nIFBlcmlvZCBaZW4gVGltZXIgc3RvcmVzIHRoZSByZXN1bHRzIGluIGEgMzItYml0Ci0gICAgICB1bnNpZ25lZCBpbnRlZ2VyLCB5b3UgY2FuIG9ubHkgdGltZSBwZXJpb2RzIG9mIHVwIHRvIDJeMzIgbWljcm9zZWNvbmRzLAotICAgICAgb3IgYWJvdXQgMWhyIDIwbWlucy4gRm9yIHRpbWluZyBsb25nZXIgcGVyaW9kcyB1c2UgdGhlIFVsdHJhIExvbmcKLSAgICAgIFBlcmlvZCBaZW4gVGltZXIuCi0KLVNFRSBBTFNPOgotTFpUaW1lck9mZiwgTFpUaW1lckxhcCwgTFpUaW1lckNvdW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBaQVBJIExaVGltZXJPbkV4dCgKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSNpZmRlZiAgX19JTlRFTF9fCi0gICAgaWYgKGhhdmVSRFRTQykgewotCV9DUFVfcmVhZFRpbWVTdGFtcCgmdG0tPnN0YXJ0KTsKLQl9Ci0gICAgZWxzZQotI2VuZGlmCi0JX19MWlRpbWVyT24odG0pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1SZXR1cm5zIHRoZSBjdXJyZW50IGNvdW50IGZvciB0aGUgTG9uZyBQZXJpb2QgWmVuIFRpbWVyIGFuZCBrZWVwcyBpdAotcnVubmluZy4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUEFSQU1FVEVSUzoKLXRtICAtIFRpbWVyIG9iamVjdCB0byBkbyBsYXAgdGltaW5nIHdpdGgKLQotUkVUVVJOUzoKLUNvdW50IHRoYXQgaGFzIGVsYXBzZWQgaW4gbWljcm9zZWNvbmRzLgotCi1SRU1BUktTOgotUmV0dXJucyB0aGUgY3VycmVudCBjb3VudCB0aGF0IGhhcyBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8KLUxaVGltZXJPbiBpbiBtaWNyb3NlY29uZHMuIFRoZSB0aW1lIGNvbnRpbnVlcyB0byBydW4gYWZ0ZXIgdGhpcyBmdW5jdGlvbiBpcwotY2FsbGVkIHNvIHlvdSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIHJlcGVhdGVkbHkuCi0KLVNFRSBBTFNPOgotTFpUaW1lck9uLCBMWlRpbWVyT2ZmLCBMWlRpbWVyQ291bnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBaQVBJIExaVGltZXJMYXBFeHQoCi0gICAgTFpUaW1lck9iamVjdCAqdG0pCi17Ci0jaWZkZWYgIF9fSU5URUxfXwotICAgIENQVV9sYXJnZUludGVnZXIgICAgdG1MYXAsdG1Db3VudDsKLQotICAgIGlmIChoYXZlUkRUU0MpIHsKLQlfQ1BVX3JlYWRUaW1lU3RhbXAoJnRtTGFwKTsKLQlfQ1BVX2RpZmZUaW1lNjQoJnRtLT5zdGFydCwmdG1MYXAsJnRtQ291bnQpOwotCXJldHVybiBfQ1BVX2NhbGNNaWNyb1NlYygmdG1Db3VudCxjcHVTcGVlZCk7Ci0JfQotICAgIGVsc2UKLSNlbmRpZgotCXJldHVybiBfX0xaVGltZXJMYXAodG0pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1TdG9wcyB0aGUgTG9uZyBQZXJpb2QgWmVuIFRpbWVyIGNvdW50aW5nLgotCi1IRUFERVI6Ci16dGltZXIuaAotCi1QQVJBTUVURVJTOgotdG0gIC0gVGltZXIgb2JqZWN0IHRvIHN0b3AgdGltaW5nIHdpdGgKLQotUkVNQVJLUzoKLVN0b3BzIHRoZSBMb25nIFBlcmlvZCBaZW4gVGltZXIgY291bnRpbmcgYW5kIGxhdGNoZXMgdGhlIGNvdW50LiBPbmNlIHlvdQotaGF2ZSBzdG9wcGVkIHRoZSB0aW1lciB5b3UgY2FuIHJlYWQgdGhlIGNvdW50IHdpdGggTFpUaW1lckNvdW50LiBJZiB5b3UgbmVlZAotaGlnaGx5IGFjY3VyYXRlIHRpbWluZywgeW91IHNob3VsZCB1c2UgdGhlIG9uIGFuZCBvZmYgZnVuY3Rpb25zIHJhdGhlciB0aGFuCi10aGUgbGFwIGZ1bmN0aW9uIHNpbmNlIHRoZSBsYXAgZnVuY3Rpb24gZG9lcyBub3Qgc3VidHJhY3QgdGhlIG92ZXJoZWFkIG9mCi10aGUgZnVuY3Rpb24gY2FsbHMgZnJvbSB0aGUgdGltZWQgY291bnQuCi0KLVNFRSBBTFNPOgotTFpUaW1lck9uLCBMWlRpbWVyTGFwLCBMWlRpbWVyQ291bnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFpBUEkgTFpUaW1lck9mZkV4dCgKLSAgICBMWlRpbWVyT2JqZWN0ICp0bSkKLXsKLSNpZmRlZiAgX19JTlRFTF9fCi0gICAgaWYgKGhhdmVSRFRTQykgewotCV9DUFVfcmVhZFRpbWVTdGFtcCgmdG0tPmVuZCk7Ci0JfQotICAgIGVsc2UKLSNlbmRpZgotCV9fTFpUaW1lck9mZih0bSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVJldHVybnMgdGhlIGN1cnJlbnQgY291bnQgZm9yIHRoZSBMb25nIFBlcmlvZCBaZW4gVGltZXIuCi0KLUhFQURFUjoKLXp0aW1lci5oCi0KLVBBUkFNRVRFUlM6Ci10bSAgLSBUaW1lciBvYmplY3QgdG8gY29tcHV0ZSB0aGUgZWxhcHNlZCB0aW1lIHdpdGguCi0KLVJFVFVSTlM6Ci1Db3VudCB0aGF0IGhhcyBlbGFwc2VkIGluIG1pY3Jvc2Vjb25kcy4KLQotUkVNQVJLUzoKLVJldHVybnMgdGhlIGN1cnJlbnQgY291bnQgdGhhdCBoYXMgZWxhcHNlZCBiZXR3ZWVuIGNhbGxzIHRvCi1MWlRpbWVyT24gYW5kIExaVGltZXJPZmYgaW4gbWljcm9zZWNvbmRzLgotCi1TRUUgQUxTTzoKLUxaVGltZXJPbiwgTFpUaW1lck9mZiwgTFpUaW1lckxhcAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIFpBUEkgTFpUaW1lckNvdW50RXh0KAotICAgIExaVGltZXJPYmplY3QgKnRtKQotewotI2lmZGVmICBfX0lOVEVMX18KLSAgICBDUFVfbGFyZ2VJbnRlZ2VyICAgIHRtQ291bnQ7Ci0KLSAgICBpZiAoaGF2ZVJEVFNDKSB7Ci0JX0NQVV9kaWZmVGltZTY0KCZ0bS0+c3RhcnQsJnRtLT5lbmQsJnRtQ291bnQpOwotCXJldHVybiBfQ1BVX2NhbGNNaWNyb1NlYygmdG1Db3VudCxjcHVTcGVlZCk7Ci0JfQotICAgIGVsc2UKLSNlbmRpZgotCXJldHVybiBfX0xaVGltZXJDb3VudCh0bSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVN0YXJ0cyB0aGUgTG9uZyBQZXJpb2QgWmVuIFRpbWVyIGNvdW50aW5nLgotCi1IRUFERVI6Ci16dGltZXIuaAotCi1SRU1BUktTOgotT2Jzb2xldGUgZnVuY3Rpb24uIFlvdSBzaG91bGQgdXNlIHRoZSBMWlRpbWVyT25FeHQgZnVuY3Rpb24gaW5zdGVhZAotd2hpY2ggYWxsb3dzIGZvciBtdWx0aXBsZSB0aW1lcnMgcnVubmluZyBhdCB0aGUgc2FtZSB0aW1lLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgWkFQSSBMWlRpbWVyT24odm9pZCkKLXsgTFpUaW1lck9uRXh0KCZMWlRpbWVyKTsgfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1SZXR1cm5zIHRoZSBjdXJyZW50IGNvdW50IGZvciB0aGUgTG9uZyBQZXJpb2QgWmVuIFRpbWVyIGFuZCBrZWVwcyBpdAotcnVubmluZy4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUkVUVVJOUzoKLUNvdW50IHRoYXQgaGFzIGVsYXBzZWQgaW4gbWljcm9zZWNvbmRzLgotCi1SRU1BUktTOgotT2Jzb2xldGUgZnVuY3Rpb24uIFlvdSBzaG91bGQgdXNlIHRoZSBMWlRpbWVyTGFwRXh0IGZ1bmN0aW9uIGluc3RlYWQKLXdoaWNoIGFsbG93cyBmb3IgbXVsdGlwbGUgdGltZXJzIHJ1bm5pbmcgYXQgdGhlIHNhbWUgdGltZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBaQVBJIExaVGltZXJMYXAodm9pZCkKLXsgcmV0dXJuIExaVGltZXJMYXBFeHQoJkxaVGltZXIpOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVN0b3BzIHRoZSBMb25nIFBlcmlvZCBaZW4gVGltZXIgY291bnRpbmcuCi0KLUhFQURFUjoKLXp0aW1lci5oCi0KLVJFTUFSS1M6Ci1PYnNvbGV0ZSBmdW5jdGlvbi4gWW91IHNob3VsZCB1c2UgdGhlIExaVGltZXJPZmZFeHQgZnVuY3Rpb24gaW5zdGVhZAotd2hpY2ggYWxsb3dzIGZvciBtdWx0aXBsZSB0aW1lcnMgcnVubmluZyBhdCB0aGUgc2FtZSB0aW1lLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgWkFQSSBMWlRpbWVyT2ZmKHZvaWQpCi17IExaVGltZXJPZmZFeHQoJkxaVGltZXIpOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVJldHVybnMgdGhlIGN1cnJlbnQgY291bnQgZm9yIHRoZSBMb25nIFBlcmlvZCBaZW4gVGltZXIuCi0KLUhFQURFUjoKLXp0aW1lci5oCi0KLVJFVFVSTlM6Ci1Db3VudCB0aGF0IGhhcyBlbGFwc2VkIGluIG1pY3Jvc2Vjb25kcy4KLQotUkVNQVJLUzoKLU9ic29sZXRlIGZ1bmN0aW9uLiBZb3Ugc2hvdWxkIHVzZSB0aGUgTFpUaW1lckNvdW50RXh0IGZ1bmN0aW9uIGluc3RlYWQKLXdoaWNoIGFsbG93cyBmb3IgbXVsdGlwbGUgdGltZXJzIHJ1bm5pbmcgYXQgdGhlIHNhbWUgdGltZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bG9uZyBaQVBJIExaVGltZXJDb3VudCh2b2lkKQoteyByZXR1cm4gTFpUaW1lckNvdW50RXh0KCZMWlRpbWVyKTsgfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1TdGFydHMgdGhlIFVsdHJhIExvbmcgUGVyaW9kIFplbiBUaW1lciBjb3VudGluZy4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUkVNQVJLUzoKLVN0YXJ0cyB0aGUgVWx0cmEgTG9uZyBQZXJpb2QgWmVuIFRpbWVyIGNvdW50aW5nLiBPbmNlIHlvdSBoYXZlIHN0YXJ0ZWQgdGhlCi10aW1lciwgeW91IGNhbiBzdG9wIGl0IHdpdGggVUxaVGltZXJPZmYgb3IgeW91IGNhbiBsYXRjaCB0aGUgY3VycmVudCBjb3VudAotd2l0aCBVTFpUaW1lckxhcC4KLQotVGhlIFVsdHJhIExvbmcgUGVyaW9kIFplbiBUaW1lciB1c2VzIHRoZSBhdmFpbGFibGUgb3BlcmF0aW5nIHN5c3RlbSBzZXJ2aWNlcwotdG8gb2J0YWluIGFjY3VyYXRlIHRpbWluZ3MgcmVzdWx0cyB3aXRoIGFzIG11Y2ggcHJlY2lzaW9uIGFzIHRoZSBvcGVyYXRpbmcKLXN5c3RlbSBwcm92aWRlcywgYnV0IHdpdGggZW5vdWdoIGdyYW51bGFyaXR5IHRvIHRpbWUgbG9uZ2VyIHBlcmlvZHMgb2YKLXRpbWUgdGhhbiB0aGUgTG9uZyBQZXJpb2QgWmVuIFRpbWVyLiBOb3RlIHRoYXQgdGhlIHJlc29sdXRpb24gb2YgdGhlIHRpbWVyCi10aWNrcyBpcyBub3QgY29uc3RhbnQgYmV0d2VlbiBkaWZmZXJlbnQgcGxhdGZvcm1zLCBhbmQgeW91IHNob3VsZCB1c2UgdGhlCi1VTFpUaW1lclJlc29sdXRpb24gZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBpbiBhIHNpbmdsZQotdGljayBvZiB0aGUgdGltZXIsIGFuZCB1c2UgdGhpcyB0byBjb252ZXJ0IHRoZSB0aW1lciBjb3VudHMgdG8gc2Vjb25kcy4KLQotVW5kZXIgMzItYml0IFdpbmRvd3MsIHdlIHVzZSB0aGUgdGltZUdldFRpbWUgZnVuY3Rpb24gd2hpY2ggcHJvdmlkZXMgYQotcmVzb2x1dGlvbiBvZiAxIG1pbGxpc2Vjb25kICgwLjAwMSBvZiBhIHNlY29uZCkuIEdpdmVuIHRoYXQgdGhlIHRpbWVyCi1jb3VudCBpcyByZXR1cm5lZCBhcyBhbiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciwgdGhpcyB3ZSBjYW4gdGltZSBpbnRlcnZhbHMKLXRoYXQgYXJlIGEgbWF4aW11bSBvZiAyXjMyIG1pbGxpc2Vjb25kcyBpbiBsZW5ndGggKG9yIGFib3V0IDEsMjAwIGhvdXJzIG9yCi01MCBkYXlzISkuCi0KLVVuZGVyIDMyLWJpdCBET1MsIHdlIHVzZSB0aGUgc3lzdGVtIHRpbWVyIHRpY2sgd2hpY2ggcnVucyBhdCAxOC4yIHRpbWVzIHBlcgotc2Vjb25kLiBHaXZlbiB0aGF0IHRoZSB0aW1lciBjb3VudCBpcyByZXR1cm5lZCBhcyBhbiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciwKLXRoaXMgd2UgY2FuIHRpbWUgaW50ZXJ2YWxzIHRoYXQgYXJlIGEgbWF4aW11bSBvZiAyXjMyICogKDEvMTguMikgaW4gbGVuZ3RoCi0ob3IgYWJvdXQgNjUsNTUwIGhvdXJzIG9yIDI3MzEgZGF5cyEpLgotCi1TRUUgQUxTTzoKLVVMWlRpbWVyT2ZmLCBVTFpUaW1lckxhcCwgVUxaVGltZXJDb3VudCwgVUxaRWxhcHNlZFRpbWUsIFVMWlJlYWRUaW1lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBaQVBJIFVMWlRpbWVyT24odm9pZCkKLXsgc3RhcnQgPSBfX1VMWlJlYWRUaW1lKCk7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFU0NSSVBUSU9OOgotUmV0dXJucyB0aGUgY3VycmVudCBjb3VudCBmb3IgdGhlIFVsdHJhIExvbmcgUGVyaW9kIFplbiBUaW1lciBhbmQga2VlcHMgaXQKLXJ1bm5pbmcuCi0KLUhFQURFUjoKLXp0aW1lci5oCi0KLVJFVFVSTlM6Ci1Db3VudCB0aGF0IGhhcyBlbGFwc2VkIGluIHJlc29sdXRpb24gY291bnRzLgotCi1SRU1BUktTOgotUmV0dXJucyB0aGUgY3VycmVudCBjb3VudCB0aGF0IGhhcyBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8KLVVMWlRpbWVyT24gaW4gbWljcm9zZWNvbmRzLiBUaGUgdGltZSBjb250aW51ZXMgdG8gcnVuIGFmdGVyIHRoaXMgZnVuY3Rpb24gaXMKLWNhbGxlZCBzbyB5b3UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiByZXBlYXRlZGx5LgotCi1TRUUgQUxTTzoKLVVMWlRpbWVyT24sIFVMWlRpbWVyT2ZmLCBVTFpUaW1lckNvdW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdWxvbmcgWkFQSSBVTFpUaW1lckxhcCh2b2lkKQoteyByZXR1cm4gKF9fVUxaUmVhZFRpbWUoKSAtIHN0YXJ0KTsgfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1TdG9wcyB0aGUgTG9uZyBQZXJpb2QgWmVuIFRpbWVyIGNvdW50aW5nLgotCi1IRUFERVI6Ci16dGltZXIuaAotCi1SRU1BUktTOgotU3RvcHMgdGhlIFVsdHJhIExvbmcgUGVyaW9kIFplbiBUaW1lciBjb3VudGluZyBhbmQgbGF0Y2hlcyB0aGUgY291bnQuIE9uY2UKLXlvdSBoYXZlIHN0b3BwZWQgdGhlIHRpbWVyIHlvdSBjYW4gcmVhZCB0aGUgY291bnQgd2l0aCBVTFpUaW1lckNvdW50LgotCi1TRUUgQUxTTzoKLVVMWlRpbWVyT24sIFVMWlRpbWVyTGFwLCBVTFpUaW1lckNvdW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBaQVBJIFVMWlRpbWVyT2ZmKHZvaWQpCi17IGZpbmlzaCA9IF9fVUxaUmVhZFRpbWUoKTsgfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1SZXR1cm5zIHRoZSBjdXJyZW50IGNvdW50IGZvciB0aGUgVWx0cmEgTG9uZyBQZXJpb2QgWmVuIFRpbWVyLgotCi1IRUFERVI6Ci16dGltZXIuaAotCi1SRVRVUk5TOgotQ291bnQgdGhhdCBoYXMgZWxhcHNlZCBpbiByZXNvbHV0aW9uIGNvdW50cy4KLQotUkVNQVJLUzoKLVJldHVybnMgdGhlIGN1cnJlbnQgY291bnQgdGhhdCBoYXMgZWxhcHNlZCBiZXR3ZWVuIGNhbGxzIHRvCi1VTFpUaW1lck9uIGFuZCBVTFpUaW1lck9mZiBpbiByZXNvbHV0aW9uIGNvdW50cy4KLQotU0VFIEFMU086Ci1VTFpUaW1lck9uLCBVTFpUaW1lck9mZiwgVUxaVGltZXJMYXAsIFVMWlRpbWVyUmVzb2x1dGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIFpBUEkgVUxaVGltZXJDb3VudCh2b2lkKQoteyByZXR1cm4gKGZpbmlzaCAtIHN0YXJ0KTsgfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1SZWFkcyB0aGUgY3VycmVudCB0aW1lIGZyb20gdGhlIFVsdHJhIExvbmcgUGVyaW9kIFplbiBUaW1lci4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUkVUVVJOUzoKLUN1cnJlbnQgdGltZXIgdmFsdWUgaW4gcmVzb2x1dGlvbiBjb3VudHMuCi0KLVJFTUFSS1M6Ci1SZWFkcyB0aGUgY3VycmVudCBVbHRyYSBMb25nIFBlcmlvZCBaZW4gVGltZXIgYW5kIHJldHVybnMgaXSScyBjdXJyZW50Ci1jb3VudC4gWW91IGNhbiB1c2UgdGhlIFVMWkVsYXBzZWRUaW1lIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGVsYXBzZWQgdGltZQotYmV0d2VlbiB0d28gdGltZXIgY291bnQgcmVhZGluZ3MuCi0KLVNFRSBBTFNPOgotVUxaRWxhcHNlZFRpbWUsIFVMWlRpbWVyUmVzb2x1dGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIFpBUEkgVUxaUmVhZFRpbWUodm9pZCkKLXsgcmV0dXJuIF9fVUxaUmVhZFRpbWUoKTsgfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotREVTQ1JJUFRJT046Ci1Db21wdXRlIHRoZSBlbGFwc2VkIHRpbWUgYmV0d2VlbiB0d28gdGltZXIgY291bnRzLgotCi1IRUFERVI6Ci16dGltZXIuaAotCi1QQVJBTUVURVJTOgotc3RhcnQgICAtIFN0YXJ0aW5nIHRpbWUgZm9yIGVsYXBzZWQgY291bnQKLWZpbmlzaCAgLSBFbmRpbmcgdGltZSBmb3IgZWxhcHNlZCBjb3VudAotCi1SRVRVUk5TOgotRWxhcHNlZCB0aW1lciBpbiByZXNvbHV0aW9uIGNvdW50cy4KLQotUkVNQVJLUzoKLVJldHVybnMgdGhlIGVsYXBzZWQgdGltZSBmb3IgdGhlIFVsdHJhIExvbmcgUGVyaW9kIFplbiBUaW1lciBpbiB1bml0cyBvZiB0aGUKLXRpbWVycyByZXNvbHV0aW9uICgxLzE4dGggb2YgYSBzZWNvbmQgdW5kZXIgRE9TKS4gVGhpcyBmdW5jdGlvbiBjb3JyZWN0bHkKLWNvbXB1dGVzIHRoZSBkaWZmZXJlbmNlIGV2ZW4gaWYgYSBtaWRuaWdodCBib3VuZGFyeSBoYXMgYmVlbiBjcm9zc2VkCi1kdXJpbmcgdGhlIHRpbWluZyBwZXJpb2QuCi0KLVNFRSBBTFNPOgotVUxaUmVhZFRpbWUsIFVMWlRpbWVyUmVzb2x1dGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVsb25nIFpBUEkgVUxaRWxhcHNlZFRpbWUoCi0gICAgdWxvbmcgc3RhcnQsCi0gICAgdWxvbmcgZmluaXNoKQoteyByZXR1cm4gX19VTFpFbGFwc2VkVGltZShzdGFydCxmaW5pc2gpOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ERVNDUklQVElPTjoKLVJldHVybnMgdGhlIHJlc29sdXRpb24gb2YgdGhlIFVsdHJhIExvbmcgUGVyaW9kIFplbiBUaW1lci4KLQotSEVBREVSOgotenRpbWVyLmgKLQotUEFSQU1FVEVSUzoKLXJlc29sdXRpb24gICAtIFBsYWNlIHRvIHN0b3JlIHRoZSB0aW1lciBpbiBtaWNyb3NlY29uZHMgcGVyIHRpbWVyIGNvdW50LgotCi1SRU1BUktTOgotUmV0dXJucyB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgVWx0cmEgTG9uZyBQZXJpb2QgWmVuIFRpbWVyIGFzIGEgMzItYml0Ci1pbnRlZ2VyIHZhbHVlIG1lYXN1cmVkIGluIG1pY3Jvc2Vjb25kcyBwZXIgdGltZXIgY291bnQuCi0KLVNFRSBBTFNPOgotVUxaUmVhZFRpbWUsIFVMWkVsYXBzZWRUaW1lLCBVTFpUaW1lckNvdW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBaQVBJIFVMWlRpbWVyUmVzb2x1dGlvbigKLQl1bG9uZyAqcmVzb2x1dGlvbikKLXsgKnJlc29sdXRpb24gPSBVTFpUSU1FUl9SRVNPTFVUSU9OOyB9CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL0FzbU1hY3Jvcy5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9Bc21NYWNyb3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdjNTQ1YS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL0FzbU1hY3Jvcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUwICswLDAgQEAKLS8qICRYQ29uc29ydGl1bTogQXNtTWFjcm9zLmggL21haW4vMTMgMTk5Ni8xMC8yNSAxMTozMzoxMiBrYWxlYiAkICovCi0vKgotICogKGMpIENvcHlyaWdodCAxOTkzLDE5OTQgYnkgRGF2aWQgV2V4ZWxibGF0IDxkd2V4QHhmcmVlODYub3JnPgotICoKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi0gKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAotICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgotICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCi0gKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKLSAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKgotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLSAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi0gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAotICogREFWSUQgV0VYRUxCTEFUIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YKLSAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKLSAqIFNPRlRXQVJFLgotICoKLSAqIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIERhdmlkIFdleGVsYmxhdCBzaGFsbCBub3QgYmUKLSAqIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncwotICogaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIERhdmlkIFdleGVsYmxhdC4KLSAqCi0gKi8KLS8qCi0gKiBDb3B5cmlnaHQgMTk5NwotICogRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB1bmRlciBsaWNlbnNlIGFuZCBtYXkgYmUgdXNlZCBhbmQgY29waWVkIG9ubHkgaW4KLSAqIGFjY29yZGFuY2Ugd2l0aCB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgU3ViamVjdCB0byB0aGVzZQotICogY29uZGl0aW9ucywgeW91IG1heSBkb3dubG9hZCwgY29weSwgaW5zdGFsbCwgdXNlLCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUKLSAqIHRoaXMgc29mdHdhcmUgaW4gc291cmNlIGFuZC9vciBiaW5hcnkgZm9ybS4gTm8gdGl0bGUgb3Igb3duZXJzaGlwIGlzCi0gKiB0cmFuc2ZlcnJlZCBoZXJlYnkuCi0gKgotICogMSkgQW55IHNvdXJjZSBjb2RlIHVzZWQsIG1vZGlmaWVkIG9yIGRpc3RyaWJ1dGVkIG11c3QgcmVwcm9kdWNlIGFuZCByZXRhaW4KLSAqICAgIHRoaXMgY29weXJpZ2h0IG5vdGljZSBhbmQgbGlzdCBvZiBjb25kaXRpb25zIGFzIHRoZXkgYXBwZWFyIGluIHRoZSBzb3VyY2UKLSAqICAgIGZpbGUuCi0gKgotICogMikgTm8gcmlnaHQgaXMgZ3JhbnRlZCB0byB1c2UgYW55IHRyYWRlIG5hbWUsIHRyYWRlbWFyaywgb3IgbG9nbyBvZiBEaWdpdGFsCi0gKiAgICBFcXVpcG1lbnQgQ29ycG9yYXRpb24uIE5laXRoZXIgdGhlICJEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiIgbmFtZQotICogICAgbm9yIGFueSB0cmFkZW1hcmsgb3IgbG9nbyBvZiBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiBtYXkgYmUgdXNlZAotICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgdGhlCi0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24uCi0gKgotICogMykgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiQVMtSVMiIGFuZCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsCi0gKiAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvLCBhbnkgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSwKLSAqICAgIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLCBvciBub24taW5mcmluZ2VtZW50IGFyZSBkaXNjbGFpbWVkLiBJbgotICogICAgbm8gZXZlbnQgc2hhbGwgRElHSVRBTCBiZSBsaWFibGUgZm9yIGFueSBkYW1hZ2VzIHdoYXRzb2V2ZXIsIGFuZCBpbgotICogICAgcGFydGljdWxhciwgRElHSVRBTCBzaGFsbCBub3QgYmUgbGlhYmxlIGZvciBzcGVjaWFsLCBpbmRpcmVjdCwKLSAqICAgIGNvbnNlcXVlbnRpYWwsIG9yIGluY2lkZW50YWwgZGFtYWdlcyBvciBkYW1hZ2VzIGZvcgotICogICAgbG9zdCBwcm9maXRzLCBsb3NzIG9mIHJldmVudWUgb3IgbG9zcyBvZiB1c2UsIHdoZXRoZXIgc3VjaCBkYW1hZ2VzIGFyaXNlCi0gKiAgICBpbiBjb250cmFjdCwKLSAqICAgIG5lZ2xpZ2VuY2UsIHRvcnQsIHVuZGVyIHN0YXR1dGUsIGluIGVxdWl0eSwgYXQgbGF3IG9yIG90aGVyd2lzZSwgZXZlbiBpZgotICogICAgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0gKgotICovCi0KLS8qICRYRnJlZTg2OiB4Yy9wcm9ncmFtcy9Yc2VydmVyL2h3L3hmcmVlODYvU3VwZXJQcm9iZS9Bc21NYWNyb3MuaCx2IDMuMTQgMTk5OS8wOS8yNSAxNDozNjo1OCBkYXdlcyBFeHAgJCAqLwotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykKLSNpZiBkZWZpbmVkKGxpbnV4KSAmJiAoZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19pYTY0X18pKQotI3VuZGVmIGluYgotI2RlZmluZSBpbmIgX2luYgotI3VuZGVmIGludwotI2RlZmluZSBpbncgX2ludwotI3VuZGVmIGlubAotI2RlZmluZSBpbmwgX2lubAotI3VuZGVmIG91dGIKLSNkZWZpbmUgb3V0YihwLHYpIF9vdXRiKCh2KSwocCkpCi0jdW5kZWYgb3V0dwotI2RlZmluZSBvdXR3KHAsdikgX291dHcoKHYpLChwKSkKLSN1bmRlZiBvdXRsCi0jZGVmaW5lIG91dGwocCx2KSBfb3V0bCgodiksKHApKQotI2Vsc2UKLSNpZiBkZWZpbmVkKF9fc3BhcmNfXykKLSNpZm5kZWYgQVNJX1BMCi0jZGVmaW5lIEFTSV9QTCAweDg4Ci0jZW5kaWYKLQotc3RhdGljIF9faW5saW5lX18gdm9pZAotb3V0Yihwb3J0LCB2YWwpCi11bnNpZ25lZCBsb25nIHBvcnQ7Ci1jaGFyIHZhbDsKLXsKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18oInN0YmEgJTAsIFslMV0gJTIiIDogOiAiciIgKHZhbCksICJyIiAocG9ydCksICJpIiAoQVNJX1BMKSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQKLW91dHcocG9ydCwgdmFsKQotdW5zaWduZWQgbG9uZyBwb3J0OwotY2hhciB2YWw7Ci17Ci0gIF9fYXNtX18gX192b2xhdGlsZV9fKCJzdGhhICUwLCBbJTFdICUyIiA6IDogInIiICh2YWwpLCAiciIgKHBvcnQpLCAiaSIgKEFTSV9QTCkpOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkCi1vdXRsKHBvcnQsIHZhbCkKLXVuc2lnbmVkIGxvbmcgcG9ydDsKLWNoYXIgdmFsOwotewotICBfX2FzbV9fIF9fdm9sYXRpbGVfXygic3RhICUwLCBbJTFdICUyIiA6IDogInIiICh2YWwpLCAiciIgKHBvcnQpLCAiaSIgKEFTSV9QTCkpOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQKLWluYihwb3J0KQotdW5zaWduZWQgbG9uZyBwb3J0OwotewotICAgdW5zaWduZWQgY2hhciByZXQ7Ci0gICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibGR1YmEgWyUxXSAlMiwgJTAiIDogIj1yIiAocmV0KSA6ICJyIiAocG9ydCksICJpIiAoQVNJX1BMKSk7Ci0gICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQKLWludyhwb3J0KQotdW5zaWduZWQgbG9uZyBwb3J0OwotewotICAgdW5zaWduZWQgY2hhciByZXQ7Ci0gICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibGR1aGEgWyUxXSAlMiwgJTAiIDogIj1yIiAocmV0KSA6ICJyIiAocG9ydCksICJpIiAoQVNJX1BMKSk7Ci0gICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQKLWlubChwb3J0KQotdW5zaWduZWQgbG9uZyBwb3J0OwotewotICAgdW5zaWduZWQgY2hhciByZXQ7Ci0gICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibGRhIFslMV0gJTIsICUwIiA6ICI9ciIgKHJldCkgOiAiciIgKHBvcnQpLCAiaSIgKEFTSV9QTCkpOwotICAgcmV0dXJuIHJldDsKLX0KLSNlbHNlCi0jaWZkZWYgX19hcm0zMl9fCi11bnNpZ25lZCBpbnQgSU9Qb3J0QmFzZTsgIC8qIE1lbW9yeSBtYXBwZWQgSS9PIHBvcnQgYXJlYSAqLwotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkCi1vdXRiKHBvcnQsIHZhbCkKLSAgICAgc2hvcnQgcG9ydDsKLSAgICAgY2hhciB2YWw7Ci17Ci0gICAgIGlmICgodW5zaWduZWQgc2hvcnQpcG9ydCA+PSAweDQwMCkgcmV0dXJuOwotCi0gICAgKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKikoKCh1bnNpZ25lZCBzaG9ydCkocG9ydCkpK0lPUG9ydEJhc2UpID0gdmFsOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkCi1vdXR3KHBvcnQsIHZhbCkKLSAgICAgc2hvcnQgcG9ydDsKLSAgICAgc2hvcnQgdmFsOwotewotICAgICBpZiAoKHVuc2lnbmVkIHNob3J0KXBvcnQgPj0gMHg0MDApIHJldHVybjsKLQotICAgICoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQqKSgoKHVuc2lnbmVkIHNob3J0KShwb3J0KSkrSU9Qb3J0QmFzZSkgPSB2YWw7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQKLW91dGwocG9ydCwgdmFsKQotICAgICBzaG9ydCBwb3J0OwotICAgICBpbnQgdmFsOwotewotICAgICBpZiAoKHVuc2lnbmVkIHNob3J0KXBvcnQgPj0gMHg0MDApIHJldHVybjsKLQotICAgICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyopKCgodW5zaWduZWQgc2hvcnQpKHBvcnQpKStJT1BvcnRCYXNlKSA9IHZhbDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50Ci1pbmIocG9ydCkKLSAgICAgc2hvcnQgcG9ydDsKLXsKLSAgICAgaWYgKCh1bnNpZ25lZCBzaG9ydClwb3J0ID49IDB4NDAwKSByZXR1cm4oKHVuc2lnbmVkIGludCktMSk7Ci0KLSAgICByZXR1cm4oKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKikoKCh1bnNpZ25lZCBzaG9ydCkocG9ydCkpK0lPUG9ydEJhc2UpKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50Ci1pbncocG9ydCkKLSAgICAgc2hvcnQgcG9ydDsKLXsKLSAgICAgaWYgKCh1bnNpZ25lZCBzaG9ydClwb3J0ID49IDB4NDAwKSByZXR1cm4oKHVuc2lnbmVkIGludCktMSk7Ci0KLSAgICByZXR1cm4oKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCopKCgodW5zaWduZWQgc2hvcnQpKHBvcnQpKStJT1BvcnRCYXNlKSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludAotaW5sKHBvcnQpCi0gICAgIHNob3J0IHBvcnQ7Ci17Ci0gICAgIGlmICgodW5zaWduZWQgc2hvcnQpcG9ydCA+PSAweDQwMCkgcmV0dXJuKCh1bnNpZ25lZCBpbnQpLTEpOwotCi0gICAgcmV0dXJuKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyopKCgodW5zaWduZWQgc2hvcnQpKHBvcnQpKStJT1BvcnRCYXNlKSk7Ci19Ci0jZWxzZSAvKiBfX2FybTMyX18gKi8KLSNpZiBkZWZpbmVkKEx5bngpICYmIGRlZmluZWQoX19wb3dlcnBjX18pCi1leHRlcm4gdW5zaWduZWQgY2hhciAqaW9CYXNlOwotCi1zdGF0aWMgdm9sYXRpbGUgdm9pZAotZWllaW8oKQotewotICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgiZWllaW8iKTsKLX0KLQotc3RhdGljIHZvaWQKLW91dGIocG9ydCwgdmFsdWUpCi1zaG9ydCBwb3J0OwotdW5zaWduZWQgY2hhciB2YWx1ZTsKLXsKLSAgICAqKHVjaGFyICopKGlvQmFzZSArIHBvcnQpID0gdmFsdWU7IGVpZWlvKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vdXR3KHBvcnQsIHZhbHVlKQotc2hvcnQgcG9ydDsKLXVuc2lnbmVkIHNob3J0IHZhbHVlOwotewotICAgICoodW5zaWduZWQgc2hvcnQgKikoaW9CYXNlICsgcG9ydCkgPSB2YWx1ZTsgZWllaW8oKTsKLX0KLQotc3RhdGljIHZvaWQKLW91dGwocG9ydCwgdmFsdWUpCi1zaG9ydCBwb3J0OwotdW5zaWduZWQgbG9uZyB2YWx1ZTsKLXsKLSAgICAqKHVuc2lnbmVkIGxvbmcgKikoaW9CYXNlICsgcG9ydCkgPSB2YWx1ZTsgZWllaW8oKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIKLWluYihwb3J0KQotc2hvcnQgcG9ydDsKLXsKLSAgICB1bnNpZ25lZCBjaGFyIHZhbDsKLQotICAgIHZhbCA9ICooKHVuc2lnbmVkIGNoYXIgKikoaW9CYXNlICsgcG9ydCkpOyBlaWVpbygpOwotICAgIHJldHVybih2YWwpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQKLWludyhwb3J0KQotc2hvcnQgcG9ydDsKLXsKLSAgICB1bnNpZ25lZCBzaG9ydCB2YWw7Ci0KLSAgICB2YWwgPSAqKCh1bnNpZ25lZCBzaG9ydCAqKShpb0Jhc2UgKyBwb3J0KSk7IGVpZWlvKCk7Ci0gICAgcmV0dXJuKHZhbCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbmwocG9ydCkKLXNob3J0IHBvcnQ7Ci17Ci0gICAgdW5zaWduZWQgbG9uZyB2YWw7Ci0KLSAgICB2YWwgPSAqKCh1bnNpZ25lZCBsb25nICopKGlvQmFzZSArIHBvcnQpKTsgZWllaW8oKTsKLSAgICByZXR1cm4odmFsKTsKLX0KLQotI2Vsc2UKLSNpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSAmJiBkZWZpbmVkKF9fYWxwaGFfXykKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi1leHRlcm4gdm9pZCBvdXRiKHVfaW50MzJfdCBwb3J0LCB1X2ludDhfdCB2YWwpOwotZXh0ZXJuIHZvaWQgb3V0dyh1X2ludDMyX3QgcG9ydCwgdV9pbnQxNl90IHZhbCk7Ci1leHRlcm4gdm9pZCBvdXRsKHVfaW50MzJfdCBwb3J0LCB1X2ludDMyX3QgdmFsKTsKLWV4dGVybiB1X2ludDhfdCBpbmIodV9pbnQzMl90IHBvcnQpOwotZXh0ZXJuIHVfaW50MTZfdCBpbncodV9pbnQzMl90IHBvcnQpOwotZXh0ZXJuIHVfaW50MzJfdCBpbmwodV9pbnQzMl90IHBvcnQpOwotCi0jZWxzZQotI2lmZGVmIEdDQ1VTRVNHQVMKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQKLW91dGIocG9ydCwgdmFsKQotc2hvcnQgcG9ydDsKLWNoYXIgdmFsOwotewotICAgX19hc21fXyBfX3ZvbGF0aWxlX18oIm91dGIgJTAsJTEiIDogOiJhIiAodmFsKSwgImQiIChwb3J0KSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQKLW91dHcocG9ydCwgdmFsKQotc2hvcnQgcG9ydDsKLXNob3J0IHZhbDsKLXsKLSAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJvdXR3ICUwLCUxIiA6IDoiYSIgKHZhbCksICJkIiAocG9ydCkpOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkCi1vdXRsKHBvcnQsIHZhbCkKLXNob3J0IHBvcnQ7Ci11bnNpZ25lZCBpbnQgdmFsOwotewotICAgX19hc21fXyBfX3ZvbGF0aWxlX18oIm91dGwgJTAsJTEiIDogOiJhIiAodmFsKSwgImQiIChwb3J0KSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludAotaW5iKHBvcnQpCi1zaG9ydCBwb3J0OwotewotICAgdW5zaWduZWQgY2hhciByZXQ7Ci0gICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiaW5iICUxLCUwIiA6Ci0gICAgICAgIj1hIiAocmV0KSA6Ci0gICAgICAgImQiIChwb3J0KSk7Ci0gICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQKLWludyhwb3J0KQotc2hvcnQgcG9ydDsKLXsKLSAgIHVuc2lnbmVkIHNob3J0IHJldDsKLSAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJpbncgJTEsJTAiIDoKLSAgICAgICAiPWEiIChyZXQpIDoKLSAgICAgICAiZCIgKHBvcnQpKTsKLSAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludAotaW5sKHBvcnQpCi1zaG9ydCBwb3J0OwotewotICAgdW5zaWduZWQgaW50IHJldDsKLSAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJpbmwgJTEsJTAiIDoKLSAgICAgICAiPWEiIChyZXQpIDoKLSAgICAgICAiZCIgKHBvcnQpKTsKLSAgIHJldHVybiByZXQ7Ci19Ci0KLSNlbHNlIC8qIEdDQ1VTRVNHQVMgKi8KLQotc3RhdGljIF9faW5saW5lX18gdm9pZAotb3V0Yihwb3J0LCB2YWwpCi0gICAgIHNob3J0IHBvcnQ7Ci0gICAgIGNoYXIgdmFsOwotewotICBfX2FzbV9fIF9fdm9sYXRpbGVfXygib3V0JUIwICglMSkiIDogOiJhIiAodmFsKSwgImQiIChwb3J0KSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQKLW91dHcocG9ydCwgdmFsKQotICAgICBzaG9ydCBwb3J0OwotICAgICBzaG9ydCB2YWw7Ci17Ci0gIF9fYXNtX18gX192b2xhdGlsZV9fKCJvdXQlVzAgKCUxKSIgOiA6ImEiICh2YWwpLCAiZCIgKHBvcnQpKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZAotb3V0bChwb3J0LCB2YWwpCi0gICAgIHNob3J0IHBvcnQ7Ci0gICAgIHVuc2lnbmVkIGludCB2YWw7Ci17Ci0gIF9fYXNtX18gX192b2xhdGlsZV9fKCJvdXQlTDAgKCUxKSIgOiA6ImEiICh2YWwpLCAiZCIgKHBvcnQpKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50Ci1pbmIocG9ydCkKLSAgICAgc2hvcnQgcG9ydDsKLXsKLSAgdW5zaWduZWQgaW50IHJldDsKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18oImluJUIwICglMSkiIDoKLQkJICAgIj1hIiAocmV0KSA6Ci0JCSAgICJkIiAocG9ydCkpOwotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQKLWludyhwb3J0KQotICAgICBzaG9ydCBwb3J0OwotewotICB1bnNpZ25lZCBpbnQgcmV0OwotICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiaW4lVzAgKCUxKSIgOgotCQkgICAiPWEiIChyZXQpIDoKLQkJICAgImQiIChwb3J0KSk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludAotaW5sKHBvcnQpCi0gICAgIHNob3J0IHBvcnQ7Ci17Ci0gIHVuc2lnbmVkIGludCByZXQ7Ci0gIF9fYXNtX18gX192b2xhdGlsZV9fKCJpbiVMMCAoJTEpIiA6Ci0JCSAgICI9YSIgKHJldCkgOgotCQkgICAiZCIgKHBvcnQpKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotI2VuZGlmIC8qIEdDQ1VTRVNHQVMgKi8KLSNlbmRpZiAvKiBMeW54ICYmIF9fcG93ZXJwY19fICovCi0jZW5kaWYgLyogYXJtMzIgKi8KLSNlbmRpZiAvKiBsaW51eCAmJiBfX3NwYXJjX18gKi8KLSNlbmRpZiAvKiBsaW51eCAmJiBfX2FscGhhX18gKi8KLSNlbmRpZiAvKiBfX0ZyZWVCU0RfXyAmJiBfX2FscGhhX18gKi8KLQotI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19hcm0zMl9fKSB8fCAoZGVmaW5lZChMeW54KSAmJiBkZWZpbmVkKF9fcG93ZXJwY19fKSkKLQotI2RlZmluZSBpbnRyX2Rpc2FibGUoKQotI2RlZmluZSBpbnRyX2VuYWJsZSgpCi0KLSNlbHNlCi0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQKLWludHJfZGlzYWJsZSgpCi17Ci0gIF9fYXNtX18gX192b2xhdGlsZV9fKCJjbGkiKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZAotaW50cl9lbmFibGUoKQotewotICBfX2FzbV9fIF9fdm9sYXRpbGVfXygic3RpIik7Ci19Ci0KLSNlbmRpZiAvKiBlbHNlICFsaW51eCAmJiAhX19hcm0zMl9fICovCi0KLSNlbHNlIC8qIF9fR05VQ19fICovCi0KLSNpZiBkZWZpbmVkKF9NSU5JWCkgJiYgZGVmaW5lZChfQUNLKQotCi0vKiBpbmIsIG91dGIsIGludyBhbmQgb3V0dyBhcmUgZGVmaW5lZCBpbiB0aGUgbGlicmFyeSAqLwotLyogLi4uIGJ1dCBJJ3ZlIG5vIGlkZWEgaWYgdGhlIHNhbWUgaXMgdHJ1ZSBmb3IgaW5sICYgb3V0bCAqLwotCi11OF90IGluYihVMTZfdCk7Ci12b2lkIG91dGIoVTE2X3QsIFU4X3QpOwotdTE2X3QgaW53KFUxNl90KTsKLXZvaWQgb3V0dyhVMTZfdCwgVTE2X3QpOwotdTMyX3QgaW5sKFUxNl90KTsKLXZvaWQgb3V0bChVMTZfdCwgVTMyX3QpOwotCi0jZWxzZSAvKiBub3QgX01JTklYIGFuZCBfQUNLICovCi0KLSMgaWYgZGVmaW5lZChfX1NURENfXykgJiYgKF9fU1REQ19fID09IDEpCi0jICBpZm5kZWYgTkNSCi0jICBkZWZpbmUgYXNtIF9fYXNtCi0jICBlbmRpZgotIyBlbmRpZgotIyBpZmRlZiBTVlI0Ci0jICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSMgIGlmbmRlZiBfX1VTTENfXwotIyAgIGRlZmluZSBfX1VTTENfXwotIyAgZW5kaWYKLSMgZW5kaWYKLSNpZm5kZWYgU0NPMzI1Ci0jIGluY2x1ZGUgPHN5cy9pbmxpbmUuaD4KLSNlbHNlCi0jIGluY2x1ZGUgIi4uL2NvbW1vbi9zY29hc20uaCIKLSNlbmRpZgotI2RlZmluZSBpbnRyX2Rpc2FibGUoKSBhc20oImNsaSIpCi0jZGVmaW5lIGludHJfZW5hYmxlKCkgIGFzbSgic3RpIikKLQotI2VuZGlmIC8qIF9NSU5JWCBhbmQgX0FDSyAqLwotI2VuZGlmIC8qIF9fR05VQ19fICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL1JFQURNRSBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjY1Njc0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotCi1UaGlzIGlzIGEgcHJlbGltaW5hcnkgdmVyc2lvbiBvZiBhIFZHQSBzb2Z0Ym9vdGVyIGZvciBMSU5VWC4KLQotSXQgbWFrZXMgdXNlIG9mIHRoZSBvZiB0aGUgdm04NigpIGNhbGwgYW5kIGlzIHRoZXJlZm9yZSBvbmx5Ci11c2FibGUgb24gaXg4NiBzeXN0ZW1zLgotVGhlcmUgYXJlIHBsYW5zIHRvIHBvcnQgdGhpcyBwcm9ncmFtIHRvIHVzZSBhIHg4NiBlbXVsYXRvcgotbGlrZSB4ODZlbXUuIEFsc28gaXQgbWF5IGJlIHBvcnRlZCB0byBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcy4KLQotU28gZmFyIGl0IGhhcyBiZWVuIHRlc3RlZCBvbiBhIHNtYWxsIG51bWJlciBvZiBjYXJkcy4gSXQgbWlnaHQKLXdlbGwgYmUgdGhhdCBpdCB3aWxsIGZhaWwgb24geW91ciBjYXJkLgotCi1JZiB5b3UgbmVlZCB0byBtYWtlIG1vZGlmaWNhdGlvbnMgdG8gdGhlIHByb2dyYW1zIHRvIGJlIGFibGUKLXRvIGJvb3QgeW91ciBjYXJkIHBsZWFzZSBsZXQgdGhlIGF1dGhvciBrbm93LgotCi1TbyBmYXIgdGhlcmUgaXMgbm8gY29tbWFuZCBsaW5lIGludGVyZmFjZS4gQWxsIG9wdGlvbnMgbmVlZAotdG8gYmUgaGFyZGNvZGVkLiBZb3UgY2FuIGRvIHRoaXMgYnkgZWRpdGluZyBkZWJ1Zy5oLiBZb3UgY2FuCi10dXJuIG9uIGEgYnVuY2ggb2YgZGVidWcgb3V0cHV0LiBPdGhlciBvcHRpb25zIGFsbG93IHlvdSB0bwotYm9vdCB0aGUgcHJpbWFyeSBjYXJkIChDT05GSUdfQUNUSVZFX0RFVklDRSksIHNhdmUgdGhlIGJpb3MKLXRvIGEgZmlsZSAoU0FWRV9CSU9TKSwgYW5kIG1hcCB0aGUgb3JpZ2luYWwgc3lzdGVtIGJpb3MKLShNQVBfU1lTX0JJT1MpLgotCi1UaGUgYXV0aG9yIHdhbnRzIHRvIHRoYW5rCi0gSGFucyBMZXJtZW4gICAoZG9zZW11KQotIGFuZAotIEtlbmRhbGwgQmVubmV0dCAoeDg2ZW11KQotZm9yIHRoZWlyIHN1cHBvcnQuCi0KLVBhcnRzIG9mIHRoZSBjb2RlIC0gZXNwZWNpYWxseSBpbiB2ODYuYyBhbmQgaW8uYyAtIGFyZSBiYXNlZCBvbiBjb2RlCi10YWtlbiBmcm9tIGRvc2VtdS4gUGFydHMgb2YgdGhlIGNvZGUgaW4gaW50LmMgYXJlIGJhc2VkIG9uIGNvZGUgdGFrZW4KLWZyb20geDg2ZW11Ci0KLUVnYmVydCBFaWNoLiAgPEVnYmVydC5FaWNoQFBoeXNpay5UVS1EYXJtc3RhZHQuREU+CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2F3ay5zY3IgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2F3ay5zY3IKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMmE4MGQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9hd2suc2NyCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLy4qXCgweDNkYS4qL3x8Ly4qXCgweDNiYS4qLyB7IAotICAgICAgICBpZiAodl8zZGEgIT0gMSkgcHJpbnQgIl92X3JldHJhY2VfIjsKLSAgICAgICAgdl8zZGEgPSAxOwotICAgICAgICBuZXh0OyAgICAgICAgCi0gICAgICAgIH0KLS8uKlwoMHg0Mi4qL3x8Ly4qXCgweDQzLiovIHsKLSAgICAgICAgaWYgKHZfNHggIT0gMSkgcHJpbnQgIl90aW1lcl8iOwotICAgICAgICB2XzR4ID0gMTsKLSAgICAgICAgbmV4dDsKLX0KLXsKLSAgICBwcmludDsKLSAgICB2XzNkYSA9IDA7Ci0gICAgdl80eCA9IDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2NiaW9zLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2NiaW9zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMTJkZmYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9jYmlvcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDE1ICswLDAgQEAKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGdldG9wdC5oPgotI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkIChfX2lhNjRfXykKLSNpbmNsdWRlIDxzeXMvaW8uaD4KLSNlbGlmIGRlZmluZWQoSEFWRV9TWVNfUEVSTSkKLSNpbmNsdWRlIDxzeXMvcGVybS5oPgotI2VuZGlmCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJ2ODZiaW9zLmgiCi0jaW5jbHVkZSAicGNpLmgiCi0jaW5jbHVkZSAiQXNtTWFjcm9zLmgiCi0KLSNkZWZpbmUgU0laRSAweDEwMDAwMAotI2RlZmluZSBWUkFNX1NUQVJUIDB4QTAwMDAKLSNkZWZpbmUgVlJBTV9TSVpFIDB4MUZGRkYKLSNkZWZpbmUgVl9CSU9TX1NJWkUgMHgxRkZGRgotI2RlZmluZSBCSU9TX1NUQVJUIDB4N0MwMCAgICAgICAgICAgIC8qIGRlZmF1bHQgQklPUyBlbnRyeSAqLwotI2RlZmluZSBCSU9TX01FTSAweDYwMAotCi1DQVJEOCBjb2RlW10gPSB7IDB4Y2QsIDB4MTAsIDB4ZjQgfTsKLXN0cnVjdCBjb25maWcgQ29uZmlnOwotCi1zdGF0aWMgaW50IG1hcCh2b2lkKTsKLXN0YXRpYyB2b2lkIHVubWFwKHZvaWQpOwotc3RhdGljIHZvaWQgcnVuQklPUyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOwotc3RhdGljIGludCBtYXBfdnJhbSh2b2lkKTsKLXN0YXRpYyB2b2lkIHVubWFwX3ZyYW0odm9pZCk7Ci1zdGF0aWMgaW50IGNvcHlfdmJpb3MobWVtVHlwZSBiYXNlKTsKLXN0YXRpYyBpbnQgY29weV9zeXNfYmlvcyh2b2lkKTsKLXN0YXRpYyBDQVJEMzIgc2V0dXBfaW50X3ZlY3Qodm9pZCk7Ci1zdGF0aWMgdm9pZCB1cGRhdGVfYmlvc192YXJzKHZvaWQpOwotc3RhdGljIGludCBjaGtzdW0oQ0FSRDggKnN0YXJ0KTsKLXN0YXRpYyB2b2lkIHNldHVwX2Jpb3NfcmVncyhpODZiaW9zUmVnc1B0ciByZWdzLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpOwotc3RhdGljIHZvaWQgcHJpbnRfcmVncyhpODZiaW9zUmVnc1B0ciByZWdzKTsKLXZvaWQgZHByaW50KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci0KLXZvaWQgbG9hZENvZGVUb01lbSh1bnNpZ25lZCBjaGFyICpwdHIsIENBUkQ4ICpjb2RlKTsKLQotc3RhdGljIGludCB2cmFtX21hcHBlZCA9IDA7Ci1zdGF0aWMgY2hhciogYmlvc192YXI7Ci0KLQotaW50Ci1tYWluKGludCBhcmdjLGNoYXIgKiphcmd2KQotewotICAgIENBUkQzMiB2Ymlvc19iYXNlOwotCi0gICAgQ29uZmlnLlByaW50UG9ydCA9IFBSSU5UX1BPUlQ7Ci0gICAgQ29uZmlnLklvU3RhdGlzdGljcyA9IElPX1NUQVRJU1RJQ1M7Ci0gICAgQ29uZmlnLlByaW50SXJxID0gUFJJTlRfSVJROwotICAgIENvbmZpZy5QcmludFBjaSA9IFBSSU5UX1BDSTsKLSAgICBDb25maWcuU2hvd0FsbERldiA9IFNIT1dfQUxMX0RFVjsKLSAgICBDb25maWcuUHJpbnRJcCA9IFBSSU5UX0lQOwotICAgIENvbmZpZy5TYXZlQmlvcyA9IFNBVkVfQklPUzsKLSAgICBDb25maWcuVHJhY2UgPSBUUkFDRTsKLSAgICBDb25maWcuQ29uZmlnQWN0aXZlT25seSA9IENPTkZJR19BQ1RJVkVfT05MWTsKLSAgICBDb25maWcuQ29uZmlnQWN0aXZlRGV2aWNlID0gQ09ORklHX0FDVElWRV9ERVZJQ0U7Ci0gICAgQ29uZmlnLk1hcFN5c0Jpb3MgPSBNQVBfU1lTX0JJT1M7Ci0gICAgQ29uZmlnLlJlc29ydCA9IFJFU09SVDsKLSAgICBDb25maWcuRml4Um9tID0gRklYX1JPTTsKLSAgICBDb25maWcuTm9Db25zb2xlID0gTk9fQ09OU09MRTsKLSAgICBDb25maWcuVmVyYm9zZSA9IFZFUkJPU0U7Ci0KLSAgICBpZiAoIW1hcCgpKQotICAgIGV4aXQoMSk7Ci0gICAgaWYgKCFjb3B5X3N5c19iaW9zKCkpCi0gICAgZXhpdCgxKTsKLSAgICBpZiAoISh2Ymlvc19iYXNlID0gc2V0dXBfaW50X3ZlY3QoKSkpCi0gICAgZXhpdCgxKTsKLSAgICBpZiAoIW1hcF92cmFtKCkpCi0gICAgZXhpdCgxKTsKLSAgICBpZiAoIWNvcHlfdmJpb3ModmJpb3NfYmFzZSkpCi0gICAgZXhpdCgxKTsKLQotICAgIGlvcGwoMyk7Ci0gICAgc2V0dXBfaW8oKTsKLSAgICBydW5CSU9TKGFyZ2MsYXJndik7Ci0gICAgdXBkYXRlX2Jpb3NfdmFycygpOwotICAgIHVubWFwX3ZyYW0oKTsKLSAgICBpb3BsKDApOwotICAgIHVubWFwKCk7Ci0gICAgcHJpbnRmKCJkb25lICFcbiIpOwotICAgIGV4aXQgKDEpOwotfQotCi1pbnQKLW1hcCh2b2lkKQotewotICAgIHZvaWQqIG1lbTsKLQotICAgIG1lbSA9IG1tYXAoMCwgKHNpemVfdClTSVpFLAotCSAgICAgICBQUk9UX0VYRUMgfCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCSAgICAgICBNQVBfRklYRUQgfCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OLAotCSAgICAgICAtMSwgMCApOwotICAgIGlmIChtZW0gIT0gMCkgewotCXBlcnJvcigiYW5vbnltb3VzIG1hcCIpOwotCXJldHVybiAoMCk7Ci0gICAgfQotICAgIG1lbXNldChtZW0sMCxTSVpFKTsKLQotICAgIGxvYWRDb2RlVG9NZW0oKHVuc2lnbmVkIGNoYXIgKikgQklPU19TVEFSVCwgY29kZSk7Ci0gICAgcmV0dXJuICgxKTsKLX0KLQotc3RhdGljIGludAotY29weV9zeXNfYmlvcyh2b2lkKQotewotI2RlZmluZSBTWVNfQklPUyAweEYwMDAwCi0gICAgaW50IG1lbV9mZDsKLQotICAgIGlmICgobWVtX2ZkID0gb3BlbihNRU1fRklMRSxPX1JET05MWSkpPDApIHsKLQlwZXJyb3IoIm9wZW5pbmcgbWVtb3J5Iik7Ci0JcmV0dXJuICgwKTsKLSAgICB9Ci0KLSAgICBpZiAobHNlZWsobWVtX2ZkLChvZmZfdCkgU1lTX0JJT1MsU0VFS19TRVQpICE9IChvZmZfdCkgU1lTX0JJT1MpCi0JZ290byBFcnJvcjsKLSAgICBpZiAocmVhZChtZW1fZmQsIChjaGFyICopU1lTX0JJT1MsIChzaXplX3QpIDB4RkZGRikgIT0gKHNpemVfdCkgMHhGRkZGKQotCWdvdG8gRXJyb3I7Ci0KLSAgICBjbG9zZShtZW1fZmQpOwotICAgIHJldHVybiAoMSk7Ci0KLUVycm9yOgotICAgIHBlcnJvcigic3lzX2Jpb3MiKTsKLSAgICBjbG9zZShtZW1fZmQpOwotICAgIHJldHVybiAoMCk7Ci19Ci0KLXN0YXRpYyBpbnQKLW1hcF92cmFtKHZvaWQpCi17Ci0gICAgaW50IG1lbV9mZDsKLQotI2lmZGVmIF9faWE2NF9fCi0gICAgaWYgKChtZW1fZmQgPSBvcGVuKE1FTV9GSUxFLE9fUkRXUiB8IE9fU1lOQykpPDApCi0jZWxzZQotICAgIGlmICgobWVtX2ZkID0gb3BlbihNRU1fRklMRSxPX1JEV1IpKTwwKQotI2VuZGlmCi0gICAgICB7Ci0JcGVycm9yKCJvcGVuaW5nIG1lbW9yeSIpOwotCXJldHVybiAwOwotICAgIH0KLQotI2lmbmRlZiBfX2FscGhhX18KLSAgICBpZiAobW1hcCgodm9pZCAqKSBWUkFNX1NUQVJULCAoc2l6ZV90KSBWUkFNX1NJWkUsCi0JCSAgICAgUFJPVF9FWEVDIHwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCB8IE1BUF9GSVhFRCwKLQkJICAgICBtZW1fZmQsIFZSQU1fU1RBUlQpID09ICh2b2lkICopIC0xKQotI2Vsc2UKLQkgaWYgKCFfYnVzX2Jhc2UoKSkgc3BhcnNlX3NoaWZ0ID0gNzsgLyogVWgsIG9oLCBKRU5TRU4uLi4gKi8KLQkgaWYgKCFfYnVzX2Jhc2Vfc3BhcnNlKCkpIHNwYXJzZV9zaGlmdCA9IDA7Ci0JIGlmICgodnJhbV9tYXAgPSBtbWFwKDAsKHNpemVfdCkgKFZSQU1fU0laRSA8PCBzcGFyc2Vfc2hpZnQpLAotCQkJCQkJIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JCQkJCQkgTUFQX1NIQVJFRCwKLQkJCQkJCSBtZW1fZmQsIChWUkFNX1NUQVJUIDw8IHNwYXJzZV9zaGlmdCkKLQkJCQkJCSB8IF9idXNfYmFzZV9zcGFyc2UoKSkpID09ICh2b2lkICopIC0xKQotI2VuZGlmCi0gICAgICB7Ci0JcGVycm9yKCJtbWFwIGVycm9yIGluIG1hcF9oYXJkd2FyZV9yYW0iKTsKLQkgICAgY2xvc2UobWVtX2ZkKTsKLQkgICAgcmV0dXJuICgwKTsKLQl9Ci0gICAgdnJhbV9tYXBwZWQgPSAxOwotICAgIGNsb3NlKG1lbV9mZCk7Ci0gICAgcmV0dXJuICgxKTsKLX0KLQotc3RhdGljIGludAotY29weV92YmlvcyhtZW1UeXBlIHZfYmFzZSkKLXsKLSAgICBpbnQgbWVtX2ZkOwotICAgIHVuc2lnbmVkIGNoYXIgKnRtcDsKLSAgICBpbnQgc2l6ZTsKLQotICAgIGlmICgobWVtX2ZkID0gb3BlbihNRU1fRklMRSxPX1JET05MWSkpPDApIHsKLQlwZXJyb3IoIm9wZW5pbmcgbWVtb3J5Iik7Ci0JcmV0dXJuICgwKTsKLSAgICB9Ci0KLSAgICBpZiAobHNlZWsobWVtX2ZkLChvZmZfdCkgdl9iYXNlLCBTRUVLX1NFVCkgIT0gKG9mZl90KSB2X2Jhc2UpIHsKLQkgIGZwcmludGYoc3RkZXJyLCJDYW5ub3QgbHNlZWtcbiIpOwotCSAgZ290byBFcnJvcjsKLSAgICAgIH0KLSAgICB0bXAgPSAodW5zaWduZWQgY2hhciAqKW1hbGxvYygzKTsKLSAgICBpZiAocmVhZChtZW1fZmQsIChjaGFyICopdG1wLCAoc2l6ZV90KSAzKSAhPSAoc2l6ZV90KSAzKSB7Ci0JICAgIGZwcmludGYoc3RkZXJyLCJDYW5ub3QgcmVhZFxuIik7Ci0JZ290byBFcnJvcjsKLSAgICB9Ci0gICAgaWYgKGxzZWVrKG1lbV9mZCwob2ZmX3QpIHZfYmFzZSxTRUVLX1NFVCkgIT0gKG9mZl90KSB2X2Jhc2UpCi0JZ290byBFcnJvcjsKLQotICAgIGlmICgqdG1wICE9IDB4NTUgfHwgKih0bXArMSkgIT0gMHhBQSApIHsKLQlmcHJpbnRmKHN0ZGVyciwiTm8gYmlvcyBmb3VuZCBhdDogMHglbHhcbiIsdl9iYXNlKTsKLQlnb3RvIEVycm9yOwotICAgIH0KLSNpZmRlZiBERUJVRwotCWRwcmludCgodW5zaWduZWQgbG9uZyl0bXAsMHgxMDApOwotI2VuZGlmCi0gICAgc2l6ZSA9ICoodG1wKzIpICogNTEyOwotCi0gICAgaWYgKHJlYWQobWVtX2ZkLCAoY2hhciAqKXZfYmFzZSwgKHNpemVfdCkgc2l6ZSkgIT0gKHNpemVfdCkgc2l6ZSkgewotCSAgICBmcHJpbnRmKHN0ZGVyciwiQ2Fubm90IHJlYWRcbiIpOwotCWdvdG8gRXJyb3I7Ci0gICAgfQotICAgIGZyZWUodG1wKTsKLSAgICBjbG9zZShtZW1fZmQpOwotICAgIGlmICghY2hrc3VtKChDQVJEOCopdl9iYXNlKSkKLQlyZXR1cm4gKDApOwotCi0gICAgcmV0dXJuICgxKTsKLQotRXJyb3I6Ci0gICAgcGVycm9yKCJ2X2Jpb3MiKTsKLSAgICBjbG9zZShtZW1fZmQpOwotICAgIHJldHVybiAoMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi11bm1hcCh2b2lkKQotewotICAgIG11bm1hcCgwLFNJWkUpOwotfQotCi1zdGF0aWMgdm9pZAotdW5tYXBfdnJhbSh2b2lkKQotewotICAgIGlmICghdnJhbV9tYXBwZWQpIHJldHVybjsKLQotICAgIG11bm1hcCgodm9pZCopVlJBTV9TVEFSVCxWUkFNX1NJWkUpOwotICAgIHZyYW1fbWFwcGVkID0gMDsKLX0KLQotc3RhdGljIHZvaWQKLXJ1bkJJT1MoaW50IGFyZ2MsIGNoYXIgKiogYXJndikKLXsKLSAgICBpODZiaW9zUmVncyBiUmVnczsKLSNpZmRlZiBWODZCSU9TX0RFQlVHCi0gICAgcHJpbnRmKCJzdGFydGluZyBCSU9TXG4iKTsKLSNlbmRpZgotICAgIHNldHVwX2Jpb3NfcmVncygmYlJlZ3MsIGFyZ2MsIGFyZ3YpOwotICAgIGRvX3g4NihCSU9TX1NUQVJULCZiUmVncyk7Ci0gICAgcHJpbnRfcmVncygmYlJlZ3MpOwotI2lmZGVmIFY4NkJJT1NfREVCVUcKLSAgICBwcmludGYoImRvbmVcbiIpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBDQVJEMzIKLXNldHVwX2ludF92ZWN0KHZvaWQpCi17Ci0gICAgaW50IG1lbV9mZDsKLSAgICBDQVJEMzIgdmJhc2U7Ci0gICAgdm9pZCAqbWFwOwotCi0gICAgaWYgKChtZW1fZmQgPSBvcGVuKE1FTV9GSUxFLE9fUkRPTkxZKSk8MCkgewotICAgIHBlcnJvcigib3BlbmluZyBtZW1vcnkiKTsKLSAgICByZXR1cm4gKDApOwotICAgIH0KLQotICAgIGlmICgobWFwID0gbW1hcCgodm9pZCAqKSAwLCAoc2l6ZV90KSAweDIwMDAsCi0JIFBST1RfRVhFQyB8IFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsCi0JIG1lbV9mZCwgMCkpID09ICh2b2lkICopLTEpICAgewotICAgIHBlcnJvcigibW1hcCBlcnJvciBpbiBtYXBfaGFyZHdhcmVfcmFtIik7Ci0gICAgY2xvc2UobWVtX2ZkKTsKLSAgICByZXR1cm4gKDApOwotICAgIH0KLQotICAgIGNsb3NlKG1lbV9mZCk7Ci0gICAgbWVtY3B5KDAsbWFwLEJJT1NfTUVNKTsKLSAgICBtdW5tYXAobWFwLDB4MjAwMCk7Ci0gICAgLyoKLSAgICAgKiBjcmVhdGUgYSBiYWNrdXAgY29weSBvZiB0aGUgYmlvcyB2YXJpYWJsZXMgdG8gd3JpdGUgYmFjayB0aGUKLSAgICAgKiBtb2RpZmllZCB2YWx1ZXMKLSAgICAgKi8KLSAgICBiaW9zX3ZhciA9IChjaGFyICopbWFsbG9jKEJJT1NfTUVNKTsKLSAgICBtZW1jcHkoYmlvc192YXIsMCxCSU9TX01FTSk7Ci0KLSAgICB2YmFzZSA9ICgqKChDQVJEMTYqKSgweDEwIDw8IDIpICsgMSkpIDw8IDQ7Ci0gICAgZnByaW50ZihzdGRlcnIsInZiYXNlOiAweCV4XG4iLHZiYXNlKTsKLSAgICByZXR1cm4gdmJhc2U7Ci19Ci0KLXN0YXRpYyB2b2lkCi11cGRhdGVfYmlvc192YXJzKHZvaWQpCi17Ci0gICAgaW50IG1lbV9mZDsKLSAgICB2b2lkICptYXA7Ci0gICAgbWVtVHlwZSBpOwotCi0jaWZkZWYgX19pYTY0X18KLSAgICBpZiAoKG1lbV9mZCA9IG9wZW4oTUVNX0ZJTEUsT19SRFdSIHwgT19TWU5DKSk8MCkKLSNlbHNlCi0gICAgaWYgKChtZW1fZmQgPSBvcGVuKE1FTV9GSUxFLE9fUkRXUikpPDApCi0jZW5kaWYKLSAgICAgIHsKLQlwZXJyb3IoIm9wZW5pbmcgbWVtb3J5Iik7Ci0JcmV0dXJuOwotICAgICAgfQotCi0gICAgaWYgKChtYXAgPSBtbWFwKCh2b2lkICopIDAsIChzaXplX3QpIDB4MjAwMCwKLQkgUFJPVF9FWEVDIHwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwKLQkgbWVtX2ZkLCAwKSkgPT0gKHZvaWQgKiktMSkgICB7Ci0gICAgcGVycm9yKCJtbWFwIGVycm9yIGluIG1hcF9oYXJkd2FyZV9yYW0iKTsKLSAgICBjbG9zZShtZW1fZmQpOwotICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgQklPU19NRU07IGkrKykgewotICAgIGlmIChiaW9zX3ZhcltpXSAhPSAqKENBUkQ4KilpKQotCSooKENBUkQ4KiltYXAgKyBpKSA9ICooQ0FSRDgqKWk7Ci0gICAgfQotCi0gICAgbXVubWFwKG1hcCwweDIwMDApOwotICAgIGNsb3NlKG1lbV9mZCk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXNldHVwX2Jpb3NfcmVncyhpODZiaW9zUmVnc1B0ciByZWdzLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgaW50IGM7Ci0KLSAgICByZWdzLT5heCA9IDA7Ci0gICAgcmVncy0+YnggPSAwOwotICAgIHJlZ3MtPmN4ID0gMDsKLSAgICByZWdzLT5keCA9IDA7Ci0gICAgcmVncy0+ZXMgPSAwOwotICAgIHJlZ3MtPmRpID0gMDsKLSAgICBvcHRlcnIgPSAwOwotICAgIHdoaWxlICgoYyA9IGdldG9wdChhcmdjLGFyZ3YsImE6YjpjOmQ6ZTppOiIpKSAhPSBFT0YpIHsKLSAgICBzd2l0Y2ggKGMpIHsKLSAgICBjYXNlICdhJzoKLQlyZWdzLT5heCA9IHN0cnRvbChvcHRhcmcsTlVMTCwwKTsKLQlicmVhazsKLSAgICBjYXNlICdiJzoKLQlyZWdzLT5ieCA9IHN0cnRvbChvcHRhcmcsTlVMTCwwKTsKLQlicmVhazsKLSAgICBjYXNlICdjJzoKLQlyZWdzLT5jeCA9IHN0cnRvbChvcHRhcmcsTlVMTCwwKTsKLQlicmVhazsKLSAgICBjYXNlICdkJzoKLQlyZWdzLT5keCA9IHN0cnRvbChvcHRhcmcsTlVMTCwwKTsKLQlicmVhazsKLSAgICBjYXNlICdlJzoKLQlyZWdzLT5lcyA9IHN0cnRvbChvcHRhcmcsTlVMTCwwKTsKLQlicmVhazsKLSAgICBjYXNlICdpJzoKLQlyZWdzLT5kaSA9IHN0cnRvbChvcHRhcmcsTlVMTCwwKTsKLQlicmVhazsKLSAgICB9Ci0gICAgfQotfQotCi0KLXN0YXRpYyBpbnQKLWNoa3N1bShDQVJEOCAqc3RhcnQpCi17Ci0gIENBUkQxNiBzaXplOwotICBDQVJEOCB2YWwgPSAwOwotICBpbnQgaTsKLQotICBzaXplID0gKihzdGFydCsyKSAqIDUxMjsKLSAgZm9yIChpID0gMDsgaTxzaXplOyBpKyspCi0gICAgdmFsICs9ICooc3RhcnQgKyBpKTsKLQotICBpZiAoIXZhbCkKLSAgICByZXR1cm4gMTsKLQotICAgIGZwcmludGYoc3RkZXJyLCJCSU9TIGNrc3VtIHdyb25nIVxuIik7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfcmVncyhpODZiaW9zUmVnc1B0ciByZWdzKQotewotICAgIHByaW50ZigiYXg9JXggYng9JXggY3g9JXggZHg9JXggZXM9JXggZGk9JXhcbiIsKENBUkQxNilyZWdzLT5heCwKLSAgICAgICAoQ0FSRDE2KXJlZ3MtPmJ4LChDQVJEMTYpcmVncy0+Y3gsKENBUkQxNilyZWdzLT5keCwKLSAgICAgICAoQ0FSRDE2KXJlZ3MtPmVzLChDQVJEMTYpcmVncy0+ZGkpOwotfQotCi12b2lkCi1sb2FkQ29kZVRvTWVtKHVuc2lnbmVkIGNoYXIgKnB0ciwgQ0FSRDggY29kZVtdKQotewotICAgIGludCBpOwotICAgIENBUkQ4IHZhbDsKLQotICAgIGZvciAoIGk9MDs7aSsrKSB7Ci0JdmFsID0gY29kZVtpXTsKLQkqcHRyKysgPSB2YWw7Ci0JaWYgKHZhbCA9PSAweGY0KSBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi12b2lkCi1kcHJpbnQodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKQotewotICAgIGludCBpLGo7Ci0gICAgY2hhciAqYyA9IChjaGFyICopc3RhcnQ7Ci0KLSAgICBmb3IgKGogPSAwOyBqIDwgKHNpemUgPj4gNCk7IGorKykgewotCXByaW50ZiAoIlxuMHglbHg6ICAiLCh1bnNpZ25lZCBsb25nKWMpOwotCWZvciAoaSA9IDA7IGk8MTY7IGkrKykKLQkgICAgcHJpbnRmKCIleCAiLCh1bnNpZ25lZCBjaGFyKSAoKihjKyspKSk7Ci0gICAgfQotICAgIHByaW50ZigiXG4iKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvY29tbWFuZC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9jb21tYW5kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYmNlNmQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9jb21tYW5kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxyZWFkbGluZS9yZWFkbGluZS5oPgotI2luY2x1ZGUgPHJlYWRsaW5lL2hpc3RvcnkuaD4KLSNpbmNsdWRlIDxtYWxsb2MuaD4KLQotI2RlZmluZSBQUk9NUFQgIj4iCi0KLQotdm9pZAotZ2V0bGluZShjaGFyICpidWYsaW50ICpudW0saW50IG1heF9udW0pCi17Ci0gICAgc3RhdGljIGludCBsaW5lX2xlbiA9IDA7Ci0gICAgc3RhdGljIGNoYXIgKmxpbmUgPSBOVUxMOwotICAgIHN0YXRpYyBjaGFyICpsaW5lX3BvaW50ZXIgPSBOVUxMOwotICAgIHN0YXRpYyBpbnQgbGVuID0gMDsKLSAgICBpbnQgdG1wX2xlbjsKLSAgICBjaGFyICpidWZmOwotCi0gICAgaWYgKGxlbiA8PSAwKSB7Ci0gICAgYnVmZiA9IHJlYWRsaW5lKFBST01QVCk7Ci0gICAgYWRkX2hpc3RvcnkoYnVmZik7Ci0KLSAgICBpZiAoKHRtcF9sZW4gPSBzdHJsZW4oYnVmZikpID4gbGluZV9sZW4pIHsKLQlmcmVlKGxpbmUpOwotCWxpbmUgPSBtYWxsb2ModG1wX2xlbik7Ci0JbGluZV9sZW4gPSB0bXBfbGVuOwotICAgIH0KLSAgICBzcHJpbnRmKGxpbmUsIiVzXG4iLGJ1ZmYpOwotICAgIGZyZWUoYnVmZik7Ci0gICAgbGluZV9wb2ludGVyID0gbGluZTsKLSAgICBsZW4gPSBzdHJsZW4obGluZSk7Ci0gICAgfQotCi0gICAgKm51bSA9IG1heF9udW0gPiBsZW4/IGxlbiA6IG1heF9udW07Ci0gICAgc3RybmNweShidWYsbGluZV9wb2ludGVyLCpudW0pOwotICAgIGxpbmVfcG9pbnRlciA9IGxpbmVfcG9pbnRlciArICpudW07Ci0gICAgbGVuID0gbGVuIC0gKm51bTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvY29uc29sZS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9jb25zb2xlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlOWM5MjQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9jb25zb2xlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDE5OTkgRWdiZXJ0IEVpY2gKLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Ci0gKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKLSAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkIGluCi0gKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKLSAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMKLSAqIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkCi0gKiAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotICoKLSAqIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotICogRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAotICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgotICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPHN5cy92dC5oPgotI2luY2x1ZGUgPHN5cy9rZC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgInY4NmJpb3MuaCIKLQotY29uc29sZQotb3Blbl9jb25zb2xlKHZvaWQpCi17Ci0gICAgaW50IGZkOwotICAgIGludCBWVG5vOwotICAgIGNoYXIgVlRuYW1lWzExXTsKLSAgICBjb25zb2xlIENvbiA9IHstMSwtMX07Ci0gICAgc3RydWN0IHZ0X3N0YXQgdnRzOwotCi0gICAgaWYgKE5PX0NPTlNPTEUpCi0JICAgIHJldHVybiBDb247Ci0KLSAgICBpZiAoKGZkID0gb3BlbigiL2Rldi90dHkwIixPX1dST05MWSwwKSkgPCAwKQotCXJldHVybiBDb247Ci0KLSAgICBpZiAoKGlvY3RsKGZkLCBWVF9PUEVOUVJZLCAmVlRubykgPCAwKSB8fCAoVlRubyA9PSAtMSkpIHsKLQlmcHJpbnRmKHN0ZGVyciwiY2Fubm90IGdldCBhIHZ0XG4iKTsKLQlyZXR1cm4gQ29uOwotICAgIH0KLQotICAgIGNsb3NlKGZkKTsKLSAgICBzcHJpbnRmKFZUbmFtZSwiL2Rldi90dHklaSIsVlRubyk7Ci0KLSAgICBpZiAoKGZkID0gb3BlbihWVG5hbWUsIE9fUkRXUnxPX05ERUxBWSwgMCkpIDwgMCkgewotCWZwcmludGYoc3RkZXJyLCJjYW5ub3Qgb3BlbiBjb25zb2xlXG4iKTsKLQlyZXR1cm4gQ29uOwotICAgIH0KLQotICAgIGlmIChpb2N0bChmZCwgVlRfR0VUU1RBVEUsICZ2dHMpID09IDApCi0JQ29uLnZ0ID0gdnRzLnZfYWN0aXZlOwotCi0gICAgaWYgKGlvY3RsKGZkLCBWVF9BQ1RJVkFURSwgVlRubykgIT0gMCkgewotCWZwcmludGYoc3RkZXJyLCJjYW5ub3QgYWN0aXZhdGUgY29uc29sZVxuIik7Ci0JY2xvc2UoZmQpOwotCXJldHVybiBDb247Ci0gICAgfQotICAgIGlmIChpb2N0bChmZCwgVlRfV0FJVEFDVElWRSwgVlRubykgIT0gMCkgewotCWZwcmludGYoc3RkZXJyLCJ3YWl0IGZvciBhY3RpdmUgY29uc29sZSBmYWlsZWRcbiIpOwotCWNsb3NlKGZkKTsKLQlyZXR1cm4gQ29uOwotICAgIH0KLSNpZiAwCi0gICAgaWYgKGlvY3RsKGZkLCBLRFNFVE1PREUsIEtEX0dSQVBISUNTKSA8IDApIHsKLQljbG9zZShmZCk7Ci0JcmV0dXJuIENvbjsKLSAgICB9Ci0jZW5kaWYKLSAgICBDb24uZmQgPSBmZDsKLSAgICByZXR1cm4gQ29uOwotfQotCi12b2lkCi1jbG9zZV9jb25zb2xlKGNvbnNvbGUgQ29uKQotewotICAgIGlmIChDb24uZmQgPT0gLTEpCi0JcmV0dXJuOwotCi0jaWYgMAotICAgIGlvY3RsKENvbi5mZCwgS0RTRVRNT0RFLCBLRF9URVhUKTsKLSNlbmRpZgotICAgIGlmIChDb24udnQgPj0wKQotCWlvY3RsKENvbi5mZCwgVlRfQUNUSVZBVEUsIENvbi52dCk7Ci0KLSAgICBjbG9zZShDb24uZmQpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9kZWJ1Zy5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9kZWJ1Zy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWM5MDZiLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvZGVidWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMTk5OSBFZ2JlcnQgRWljaAotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKLSAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwotICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQgaW4KLSAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAotICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucwotICogYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQKLSAqICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0gKgotICogVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0gKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0gKiBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCi0gKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCi0gKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0gKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0vKiNkZWZpbmUgVjg2QklPU19ERUJVRyAqLwotCi0vKgotICogdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgaWYgbmVlZGVkCi0gKiBzaG91bGQgYmUgY29tbWFuZCBsaW5lIG9wdGlvbnMKLSAqLwotCi0jZGVmaW5lIFBSSU5UX1BPUlQgMAotI2RlZmluZSBJT19TVEFUSVNUSUNTIDAKLSNkZWZpbmUgUFJJTlRfSVJRIDAKLSNkZWZpbmUgUFJJTlRfUENJIDEKLSNkZWZpbmUgUFJJTlRfSVAgMCAgICAvKiBwcmludCBJUCBhZGRyZXNzIHdpdGggUElPIGluZm9ybWF0aW9uICovCi0jZGVmaW5lIFRSQUNFIDAgICAgICAgLyogdHVybiBvbiBkZWJ1Z2dlciBpbiB4ODZlbXUgICAgICAgICAgICAqLwotCQkgICAgICAvKiByZXF1aXJlcyB4ODZlbXUgY29tcGlsZWQgd2l0aCAtRERFQlVHICovCi0KLS8qCi0gKiB0aGVzZSBzaG91bGQgbm90IGJlIGhlcmUuCi0gKiBTaG91bGQgYmUgY29udmVydGVkIHRvIGNvbW1hbmQgbGluZSBvcHRpb25zLgotICovCi0jZGVmaW5lIENPTkZJR19BQ1RJVkVfT05MWSAwCi0jZGVmaW5lIENPTkZJR19BQ1RJVkVfREVWSUNFIDEKLSNkZWZpbmUgU0FWRV9CSU9TIDAKLSNkZWZpbmUgTUFQX1NZU19CSU9TIDEKLSNkZWZpbmUgUkVTT1JUIDEKLSNkZWZpbmUgRklYX1JPTSAwCi0jZGVmaW5lIE5PX0NPTlNPTEUgMAotI2RlZmluZSBTSE9XX0FMTF9ERVYgMAotI2RlZmluZSBWRVJCT1NFIDAKLQotLyojZGVmaW5lIFZfQklPUyAweGUwMDAwICovCi0vKiNkZWZpbmUgVl9CSU9TIDB4ZTQwMDAgKi8KLQotCi0jaWYgKFBSSU5UX0lPID09IDEpICYmIChQUklOVF9QT1JUID09IDApCi0jIGRlZmluZSBQUklOVF9JTyAwCi0jZW5kaWYKLSNpZiAoSU9fU1RBVElTVElDUyA9PSAxKSAmJiAoUFJJTlRfUE9SVCA9PSAwKQotIyBkZWZpbmUgSU9fU1RBVElTVElDUyAwCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvaGFwcHlfY2FyZHMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2hhcHB5X2NhcmRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDNkNDRlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvaGFwcHlfY2FyZHMKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi1XaGF0IEkgaGFkIHRvIGRvIHRvIG1ha2UgY2FyZHMgaGFwcHk6Ci0KLTEuIFRzZW5nIEVUNDAwMCBXMzJQCi1UaGlzIGNhcmQgd2FudHMgdG8gY2FsbCB0aGUgb3JpZ2luYWwgc3lzdGVtIEJJT1MgdmlkZW8gcm91dGluZXMuCi1JdCBzZXRzIHRoZSBpbnQgMHg0MiB2ZWN0b3IgdG8gRjAwMDpGMDY1LCB0aGUgZW50cnkgcG9pbnQgdG8gdGhlCi1zeXN0ZW0gYmlvcyB2aWRlbyByb3V0aW5lcy4gCi1DQVZFOiBkb24ndCBjYXRjaCBpbnQgMHg0MiBhbmQgdXNlIHRoZSB2YmlvcyBpbnQgMHgxMCByb3V0aW5lcy4gCi1BdCBlYXJseSBzdGFnZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24gdGhleSBjYWxsIGludCAweDQyLiBUaGlzIAotY2F1c2VzIGFuIGluZmluaXRlIGxvb3AuCi0KLTIuIEFUaSBNYWNoNjQgUmFnZSBJSWMgQUdQCi1UaGlzIGNhcmQgZG9lcyBzaW1pbGFyIHRoaW5ncyBsaWtlIHRoZSBUc2VuZyBFVDQwMDAgVzMyUC4KLUhvd2V2ZXIgaXQgZG9lc24ndCBoYXZlIHRoZSBwcm9ibGVtIHdpdGggdGhlIGluaW5pdGUgbG9vcC4KLQotMy4gRWxzYSBWaWN0b3J5IElJLUExNiBBR1AgQmFuc2hlZQotVGhpcyBjYXJkIGlzIHZlcnkgY2xldmVyOiBJdCBrbm93cyBpdCBpcyBhbiBBR1AgY2FyZC4gVGhlcmVmb3JlCi1pdCBrbm93cyBpdCBpcyBiZWhpbmQgYSBQQ0ktUENJIGJyaWRnZS4gSXQgYWxzbyBrbm93cyB0aGF0IG5vb25lCi1lbHNlIGlzIGJlaGluZCB0aGlzIGJyaWRnZS4gVGhlcmVmb3JlIGl0IHN0YXJ0IHJlcHJvZ3JhbW1pbmcgdGhlCi1icmlkZ2UhIEZvciB0aGlzIGl0IGFzc3VtZXMgdGhlIEFHUCBicmlkZ2UgaXMgb24gYnVzIDEuCi0KLTQuIEVsc2EgR2xvcmlhIFN5bmVyZ3kgOCBWaVZvIEFHUCBQTTIKLVRoaXMgY2FyZCBsaWtlcyB0byBzZWUgYSBjb21wbGV0ZSBpbnRlcnJ1cHQgdmVjdG9yIHRhYmxlLiBJZgotd2UgZmlsbCB0aGlzIHRhYmxlIHdpdGggMCB0aGUgVkJJT1MgZGV0ZWN0cyB0aGlzIGFuZCBxdWl0cyAKLWluaXRpYWxpemF0aW9uLgotCi01LiBEaW1vbmQgVmlwZXIgMzMwIEFHUCBOVklESUEgUml2YSAxMjguCi1UaGlzIGNhcmQgaGFzIGEgc2ltaWxhciBwcm9ibGVtIGxpa2UgdGhlIEVsc2EgR2xvcmlhLiBJdCB3YW50cwotdG8gcmVhZCB0aGUgc3lzdGVtIEJJT1MgZGF0ZSBhdCAweGZmZmZkLgotCi02LiBNYXRyb3ggTXlzdGlxdWUgUENJIAotVGhpcyBjYXJkIHJlYWRzIHRoZSBJTyBwb3J0IDB4NjIuIElmIGl0IGRvZXNuJ3QgbGlrZSB3aGF0IGl0IHNlZXMKLWl0IGxvb3BzIGZvcmV2ZXIuIFRvIGtlZXAgdGhlIGNhcmQgaGFwcHkgcHV0IDB4ZmMgaW50byAweGZmZmZlLgotVGhpcyBsb2NhdGlvbiBob2xkcyB0aGUgc3lzdGVtIG1vZGVsIGlkLiAweGZjIG1lYW5zIElCTS1BVC4KLSBPbmUgY2FuIG1ha2UgYW4gaW50ZXJlc3Rpbmcgb2JzZXJ2YXRpb246IHRoaXMgY2FyZCBsaWtlcyB0byBrbm93IAotd2l0aCB3aG9tIGl0IGhhcyB0byBzaGFyZSB0aGUgc3lzdGVtLiBUaGVyZWZvcmUgaXQgYWNjZXNzZXMgUENJIAotY29uZmlnIHNwYWNlIG9mIGFsbCB0aGUgb3RoZXIgY2FyZHMuIEl0IGRvZXMgdGhpcyBieXBhc3NpbmcgdGhlIAotUENJIEJJT1MgYnkgcmVhZGluZyB0aGUgUENJIGFjY2VzcyBwb3J0cyBkaXJlY3RseS4KLQotNy4gTWF0cm94IEcxMDAgQUdQCi1UaGlzIGNhcmQgaGFzIHRoZSBzYW1lIHByb2JsZW0gYXMgdGhlIE15c3RpcXVlLiAKLQotQXBwZXJhbnRseSB0aGlzIHdvcmtzIG5vdy4gSG93ZXZlciBub3QgYWxsIGNvbWJpbmF0aW9ucyBvZiBjYXJkcyBhcmUKLWNoZWNrZWQsIHlldC4KLQotRnVydGhlciBub3RlczoKLXRoZSBJTyByZWdpc3RlciAweDQyLTB4NDMgYXMgd2VsbCBhcyAweDYxLTB4NjMgYXJlIG9mIHNwZWNpYWwgaW50ZXJlc3QKLWZvciBtYW55IGdyYXBoaWMgY2FyZHMuIFRoZXkgc2hvdWxkIGJlIGVtdWxhdGVkLgotVGhlIHNvIGNhbGxlZCAiSW5kdXN0cnkgU3RhbmRhcmQgQklPUyBFbnRyeSBQb2ludHMiIHRvIGludCAweDQyICgweEZGMDY1KQotYW5kIHRvIGludCAweDFhICgweEZGRTZFKSBzaG91bGQgYmUgZmlsbGVkIHdpdGggdXNlZnVsIGNvZGUuIFRoaXMgY29kZQotbmVlZHMgdG8gcmV0dXJuIGFzIGlmIGl0IHdhcyBjYWxsZWQgYXMgaW50LgotVGhlIHN1YnZlbmRvciBJRCBQQ0kgcmVnaXN0ZXJzIG1pZ2h0IGNhdXNlIHByb2JsZW1zLiBPbiBzb21lIGNoaXBzZXRzCi10aGV5IGFyZSBwcm9ncmFtbWVkIGluIGEgbm9uLW9iaXZvdXMgbm9uLVBDSSBjb25mb3JtYW50IHdheS4KLVZfQmlvc2VzIGFyZSBzZWVuIHRvIG1vZGlmeSB0aGUgZm9sbG93aW5nIGludDoKLTB4MTAgKGRlZmF1bHQgdmlkZW8pLCAweDFmKGZvbnQgdGFibGUpLCAweDQyKGNvcHkgb2YgZGVmYXVsdCB2aWRlbyksIAotMHg0MyAoPz8pLCAweDZkIChjb3B5IG9mIGRlZmF1bHQgdmlkZW8gLSBzYW1lIGFzIDB4MTA/KQotCi1UT0RPOgotSW50IDB4NmQgbmVlZHMgdG8gYmUgZG9uZS4KLUFsbCBpbnRlcnJ1cHRzIHdoZXJlIHRoZXJlIGlzIG5vIGRlZmF1bHQgaW5kdXN0cnkgc3RhbmRhcmQgZW50cnkgcG9pbnQKLXNob3VsZCBwb2ludCB0byBhbiB1bnVzZWQgbG9jYXRpb24gaW4gdGhlIDB4RjAwMCBzZWdtYW50IChwb3NzaWJseSAKLTB4RjAwMDApLiBUaGlzIHdheSB0aGV5IGNvdWxkIGJlIHRyYXBwZWQuIEEgdHJhcCBoYW5kbGVyIGZvcgotYS4gaW50IDB4NDIgYW5kIGludCAweDFhIG5lZWRzIHRvIGJlIGltcGxlbWVudGVkLgotVGhlIGRlZmF1bHQgImluZHVzdHJ5IGVudHJ5IHBvaW50IiBmb3IgdmlkZW8gYW5kIFBDSSAoMHhGRkU2RSkgc2hvdWxkCi1hbHNvIGJlIGltcGxlbWVudGVkLiAoYW55IG90aGVycz8pIFRoZXkgc2hvdWxkIGVpdGhlciBiZSByb3V0ZWQgdG8KLWludCAweDQyKDB4NmQ/KSAodmlkZW8pIGFuZCAweDFBIChQQ0kpIG9yIHNvbWUgb3RoZXIgaW50ZXJydXB0cyB0bwotdHJhcCB0aGVtLiBNYXBwaW5nIG9mIHN5c3RlbSBiaW9zIG1pZ2h0IG5vdCBiZSBhIGdvb2QgaWRlYS4gTWF5YmUKLXRoZSBzeXN0ZW0gYmlvcyBhcmVhIHNob3VsZCBqdXN0IGJlIGZpbGxlZCB3aXRoICJobHQiIHRvIHRyYXAgYW55Ci1hY2Nlc3MgdGhlcmUuCi1IYW5kbGluZyBvZiB0aW1lciBJTyByZWdpc3RlcnMgMHg0MiwgMHg0MyBhbmQgSU8gcmVnaXN0ZXJzIDB4NjEsIDB4NjIuCi0KLUZpbmQgZG9jdW1lbnRhdGlvbjoKLS0gb24gaW50ZXJydXB0IHZlY3RvciB0YWJsZQotLSBvbiBpbmR1c3RyeSBzdGFuZGFyZCBlbnRyeSBwb2ludHMgdG8gdGhlIHN5c3RlbSBiaW9zCi0tIG9uIElPIHJlZ2lzdGVycyAweDYxIGFuZCAweDYyCi0KLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9oZXhkdW1wIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9oZXhkdW1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjM1OWU1Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvaGV4ZHVtcAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIiUwNi42X2F4ICAiICAxNi8xICIlMDJ4ICIgCi0iICAiIDE2LzEgIiVfcCIgCi0iXG4iCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2ludC5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9pbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUwNGM2Yy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2ludC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMTk5OSBFZ2JlcnQgRWljaAotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKLSAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwotICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQgaW4KLSAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAotICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucwotICogYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQKLSAqICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0gKgotICogVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0gKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0gKiBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCi0gKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCi0gKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0gKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZCAoX19pYTY0X18pCi0jaW5jbHVkZSA8c3lzL2lvLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgInY4NmJpb3MuaCIKLSNpbmNsdWRlICJBc21NYWNyb3MuaCIKLSNpbmNsdWRlICJwY2kuaCIKLQotc3RhdGljIGludCBpbnQxQV9oYW5kbGVyKHN0cnVjdCByZWdzODYgKnJlZ3MpOwotc3RhdGljIGludCBpbnQ0Ml9oYW5kbGVyKGludCBudW0sIHN0cnVjdCByZWdzODYgKnJlZ3MpOwotCi1pbnQKLWludF9oYW5kbGVyKGludCBudW0sIHN0cnVjdCByZWdzODYgKnJlZ3MpCi17Ci0gICAgc3dpdGNoIChudW0pIHsKLSAgICBjYXNlIDB4MTA6Ci0gICAgY2FzZSAweDQyOgotCXJldHVybiAoaW50NDJfaGFuZGxlcihudW0scmVncykpOwotICAgIGNhc2UgMHgxQToKLQlyZXR1cm4gKGludDFBX2hhbmRsZXIocmVncykpOwotICAgIGRlZmF1bHQ6Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1pbnQ0Ml9oYW5kbGVyKGludCBudW0sc3RydWN0IHJlZ3M4NiAqcmVncykKLXsKLSAgICB1bnNpZ25lZCBjaGFyIGM7Ci0gICAgQ0FSRDMyIHZhbDsKLQotICAgIGlfcHJpbnRmKCJpbnQgMHgleDogYXg6MHglbHggYng6MHglbHggY3g6MHglbHggZHg6MHglbHhcbiIsbnVtLAotCSAgIHJlZ3MtPmVheCxyZWdzLT5lYngsIHJlZ3MtPmVjeCwgcmVncy0+ZWR4KTsKLQotICAgIC8qCi0gICAgICogdmlkZW8gYmlvcyBoYXMgbW9kaWZpZWQgdGhlc2UgLQotICAgICAqIGxlYXZlIGl0IHRvIHRoZSB2aWRlbyBiaW9zIHRvIGRvIHRoaXMKLSAgICAgKi8KLQotICAgIHZhbCA9IGdldEludFZlY3QobnVtKTsKLSAgICBpZiAodmFsICE9IDB4RjAwMEYwNjUpCi0gICAgICByZXR1cm4gMDsKLQotICAgIGlmICgocmVncy0+ZWJ4ICYgMHhmZikgPT0gMHgzMikgewotCXN3aXRjaCAocmVncy0+ZWF4ICYgMHhGRkZGKSB7Ci0JY2FzZSAweDEyMDA6Ci0JICAgIGlfcHJpbnRmKCJlbmFibGluZyB2aWRlb1xuIik7Ci0JICAgIGMgPSBpbmIoMHgzY2MpOwotCSAgICBjIHw9IDB4MDI7Ci0JICAgIG91dGIoMHgzYzIsYyk7Ci0JICAgIHJldHVybiAxOwotCWNhc2UgMHgxMjAxOgotCSAgICBpX3ByaW50ZigiZGlzYWJsaW5nIHZpZGVvXG4iKTsKLQkgICAgYyA9IGluYigweDNjYyk7Ci0JICAgIGMgJj0gfjB4MDI7Ci0JICAgIG91dGIoMHgzYzIsYyk7Ci0JICAgIHJldHVybiAxOwotCWRlZmF1bHQ6Ci0JfQotICAgIH0KLSAgICBpZiAobnVtID09IDB4NDIpCi0JcmV0dXJuIDE7Ci0gICAgZWxzZQotCXJldHVybiAwOwotfQotCi0jZGVmaW5lIFNVQ0NFU1NGVUwgICAgICAgICAgICAgIDB4MDAKLSNkZWZpbmUgREVWSUNFX05PVF9GT1VORCAgICAgICAgMHg4NgotI2RlZmluZSBCQURfUkVHSVNURVJfTlVNQkVSICAgICAweDg3Ci0KLXN0YXRpYyBpbnQKLWludDFBX2hhbmRsZXIoc3RydWN0IHJlZ3M4NiAqcmVncykKLXsKLSAgICBDQVJEMzIgU2xvdDsKLSAgICBQY2lTdHJ1Y3RQdHIgcFBjaTsKLQotICAgIGlmICghIEN1cnJlbnRQY2kpIHJldHVybiAwOyAvKiBvb3BzICovCi0KLSAgICBpX3ByaW50ZigiaW50IDB4MWE6IGF4PTB4JWx4IGJ4PTB4JWx4IGN4PTB4JWx4IGR4PTB4JWx4IGRpPTB4JWx4IgotCSAiIHNpPTB4JWx4XG4iLCByZWdzLT5lYXgscmVncy0+ZWJ4LHJlZ3MtPmVjeCxyZWdzLT5lZHgsCi0JIHJlZ3MtPmVkaSxyZWdzLT5lc2kpOwotICAgIHN3aXRjaCAocmVncy0+ZWF4ICYgMHhGRkZGKSB7Ci0gICAgY2FzZSAweGIxMDE6Ci0JcmVncy0+ZWF4ICAmPSAweEZGMDA7ICAgLyogbm8gY29uZmlnIHNwYWNlL3NwZWNpYWwgY3ljbGUgc3VwcG9ydCAqLwotCXJlZ3MtPmVkeCA9IDB4MjA0OTQzNTA7IC8qICIgSUNQIiAqLwotCXJlZ3MtPmVieCAgPSAweDAyMTA7ICAgIC8qIFZlcnNpb24gMi4xMCAqLwotCXJlZ3MtPmVjeCAgJj0gMHhGRjAwOwotCXJlZ3MtPmVjeCB8PSAocGNpTWF4QnVzICYgMHhGRik7ICAgLyogTWF4IGJ1cyBudW1iZXIgaW4gc3lzdGVtICovCi0JcmVncy0+ZWZsYWdzICY9IH4oKHVuc2lnbmVkIGxvbmcpMHgwMSk7IC8qIGNsZWFyIGNhcnJ5IGZsYWcgKi8KLQlpX3ByaW50ZigiYXg9MHglbHggZHg9MHglbHggYng9MHglbHggY3g9MHglbHggZmxhZ3M9MHglbHhcbiIsCi0JCSByZWdzLT5lYXgscmVncy0+ZWR4LHJlZ3MtPmVieCxyZWdzLT5lY3gscmVncy0+ZWZsYWdzKTsKLQlyZXR1cm4gMTsKLSAgICBjYXNlIDB4YjEwMjoKLQlpZiAoKChyZWdzLT5lZHggJiAweEZGRkYpID09IEN1cnJlbnRQY2ktPlZlbmRvcklEKSAmJgotCSAgICAoKHJlZ3MtPmVjeCAmIDB4RkZGRikgPT0gQ3VycmVudFBjaS0+RGV2aWNlSUQpICYmCi0JICAgIChyZWdzLT5lc2kgPT0gMCkpIHsKLQkgICAgcmVncy0+ZWF4ID0gKHJlZ3MtPmVheCAmIDB4MDBGRikgfCAoU1VDQ0VTU0ZVTCA8PCA4KTsKLQkgICAgcmVncy0+ZWZsYWdzICY9IH4oKHVuc2lnbmVkIGxvbmcpMHgwMSk7IC8qIGNsZWFyIGNhcnJ5IGZsYWcgKi8KLQkgICAgcmVncy0+ZWJ4ID0gcGNpU2xvdEJYKEN1cnJlbnRQY2kpOwotCX0KLQllbHNlIGlmIChDb25maWcuU2hvd0FsbERldiAmJgotCSAgICAgKHBQY2kgPSBmaW5kUGNpRGV2aWNlKHJlZ3MtPmVkeCxyZWdzLT5lY3gscmVncy0+ZXNpKSkgIT0gTlVMTCkgewotCSAgICByZWdzLT5lYXggPSAocmVncy0+ZWF4ICYgMHgwMEZGKSB8IChTVUNDRVNTRlVMIDw8IDgpOwotCSAgICByZWdzLT5lZmxhZ3MgJj0gfigodW5zaWduZWQgbG9uZykweDAxKTsgLyogY2xlYXIgY2FycnkgZmxhZyAqLwotCSAgICByZWdzLT5lYnggPSBwY2lTbG90QlgocFBjaSk7Ci0JfSBlbHNlICB7Ci0JICAgIHJlZ3MtPmVheCA9IChyZWdzLT5lYXggJiAweDAwRkYpIHwgKERFVklDRV9OT1RfRk9VTkQgPDwgOCk7Ci0JICAgIHJlZ3MtPmVmbGFncyB8PSAoKHVuc2lnbmVkIGxvbmcpMHgwMSk7IC8qIHNldCBjYXJyeSBmbGFnICovCi0JfQotCWlfcHJpbnRmKCJheD0weCVseCBieD0weCVseCBmbGFncz0weCVseFxuIiwKLQkJIHJlZ3MtPmVheCxyZWdzLT5lYngscmVncy0+ZWZsYWdzKTsKLQlyZXR1cm4gMTsKLSAgICBjYXNlIDB4YjEwMzoKLQlpZiAoKChyZWdzLT5lY3ggJiAweEZGKSA9PSBDdXJyZW50UGNpLT5JbnRlcmZhY2UpICYmCi0JICAgICgoKHJlZ3MtPmVjeCAmIDB4RkYwMCkgPj4gOCkgPT0gQ3VycmVudFBjaS0+U3ViQ2xhc3MpICYmCi0JICAgICgoKHJlZ3MtPmVjeCAmIDB4RkZGRjAwMDApID4+IDE2KSA9PSBDdXJyZW50UGNpLT5CYXNlQ2xhc3MpICYmCi0JICAgICgocmVncy0+ZXNpICYgMHhmZikgPT0gMCkpIHsKLQkgICAgcmVncy0+ZWF4ID0gKHJlZ3MtPmVheCAmIDB4MDBGRikgfCAoU1VDQ0VTU0ZVTCA8PCA4KTsKLQkgICAgcmVncy0+ZWJ4ID0gcGNpU2xvdEJYKEN1cnJlbnRQY2kpOwotCSAgICByZWdzLT5lZmxhZ3MgJj0gfigodW5zaWduZWQgbG9uZykweDAxKTsgLyogY2xlYXIgY2FycnkgZmxhZyAqLwotCX0KLQllbHNlIGlmIChDb25maWcuU2hvd0FsbERldgotCSAgICAgJiYgKHBQY2kgPSBmaW5kUGNpQ2xhc3MocmVncy0+ZWN4ICYgMHhGRiwgKHJlZ3MtPmVjeCAmIDB4ZmYwMCkgPj4gOCwKLQkJCSAocmVncy0+ZWN4ICYgMHhmZmZmMDAwMCkgPj4gMTYsIHJlZ3MtPmVzaSkpICE9IE5VTEwpIHsKLQkgICAgcmVncy0+ZWF4ID0gKHJlZ3MtPmVheCAmIDB4MDBGRikgfCAoU1VDQ0VTU0ZVTCA8PCA4KTsKLQkgICAgcmVncy0+ZWJ4ID0gcGNpU2xvdEJYKHBQY2kpOwotCSAgICByZWdzLT5lZmxhZ3MgJj0gfigodW5zaWduZWQgbG9uZykweDAxKTsgLyogY2xlYXIgY2FycnkgZmxhZyAqLwotCX0gZWxzZSB7Ci0JICAgIHJlZ3MtPmVheCA9IChyZWdzLT5lYXggJiAweDAwRkYpIHwgKERFVklDRV9OT1RfRk9VTkQgPDwgOCk7Ci0JICAgIHJlZ3MtPmVmbGFncyB8PSAoKHVuc2lnbmVkIGxvbmcpMHgwMSk7IC8qIHNldCBjYXJyeSBmbGFnICovCi0JfQotCWlfcHJpbnRmKCJheD0weCVseCBmbGFncz0weCVseFxuIixyZWdzLT5lYXgscmVncy0+ZWZsYWdzKTsKLQlyZXR1cm4gMTsKLSAgICBjYXNlIDB4YjEwODoKLQlpX3ByaW50ZigiU2xvdD0weCV4XG4iLEN1cnJlbnRQY2ktPlNsb3QubCk7Ci0JaWYgKChTbG90ID0gZmluZFBjaShyZWdzLT5lYngpKSkgewotCSAgICByZWdzLT5lY3ggJj0gMHhGRkZGRkYwMDsKLQkgICAgcmVncy0+ZWN4IHw9IFBjaVJlYWQ4KHJlZ3MtPmVkaSxTbG90KTsKLQkgICAgcmVncy0+ZWF4ID0gKHJlZ3MtPmVheCAmIDB4MDBGRikgfCAoU1VDQ0VTU0ZVTCA8PCA4KTsKLQkgICAgcmVncy0+ZWZsYWdzICY9IH4oKHVuc2lnbmVkIGxvbmcpMHgwMSk7IC8qIGNsZWFyIGNhcnJ5IGZsYWcgKi8KLQl9IGVsc2UgewotCSAgICByZWdzLT5lYXggPSAocmVncy0+ZWF4ICYgMHgwMEZGKSB8IChCQURfUkVHSVNURVJfTlVNQkVSIDw8IDgpOwotCSAgICByZWdzLT5lZmxhZ3MgfD0gKCh1bnNpZ25lZCBsb25nKTB4MDEpOyAvKiBzZXQgY2FycnkgZmxhZyAqLwotCX0KLQlpX3ByaW50ZigiYXg9MHglbHggY3g9MHglbHggZmxhZ3M9MHglbHhcbiIsCi0JCSByZWdzLT5lYXgscmVncy0+ZWN4LHJlZ3MtPmVmbGFncyk7Ci0JcmV0dXJuIDE7Ci0gICAgY2FzZSAweGIxMDk6Ci0JaV9wcmludGYoIlNsb3Q9MHgleFxuIixDdXJyZW50UGNpLT5TbG90LmwpOwotCWlmICgoU2xvdCA9IGZpbmRQY2kocmVncy0+ZWJ4KSkpIHsKLQkgICAgcmVncy0+ZWN4ICY9IDB4RkZGRjAwMDA7Ci0JICAgIHJlZ3MtPmVjeCB8PSBQY2lSZWFkMTYocmVncy0+ZWRpLFNsb3QpOwotCSAgICByZWdzLT5lYXggPSAocmVncy0+ZWF4ICYgMHgwMEZGKSB8IChTVUNDRVNTRlVMIDw8IDgpOwotCSAgICByZWdzLT5lZmxhZ3MgJj0gfigodW5zaWduZWQgbG9uZykweDAxKTsgLyogY2xlYXIgY2FycnkgZmxhZyAqLwotCX0gZWxzZSB7Ci0JICAgIHJlZ3MtPmVheCA9IChyZWdzLT5lYXggJiAweDAwRkYpIHwgKEJBRF9SRUdJU1RFUl9OVU1CRVIgPDwgOCk7Ci0JICAgIHJlZ3MtPmVmbGFncyB8PSAoKHVuc2lnbmVkIGxvbmcpMHgwMSk7IC8qIHNldCBjYXJyeSBmbGFnICovCi0JfQotCWlfcHJpbnRmKCJheD0weCVseCBjeD0weCVseCBmbGFncz0weCVseFxuIiwKLQkJIHJlZ3MtPmVheCxyZWdzLT5lY3gscmVncy0+ZWZsYWdzKTsKLQlyZXR1cm4gMTsKLSAgICBjYXNlIDB4YjEwYToKLQlpX3ByaW50ZigiU2xvdD0weCV4XG4iLEN1cnJlbnRQY2ktPlNsb3QubCk7Ci0JaWYgKChTbG90ID0gZmluZFBjaShyZWdzLT5lYngpKSkgewotCSAgICByZWdzLT5lY3ggJj0gMDsKLQkgICAgcmVncy0+ZWN4IHw9IFBjaVJlYWQzMihyZWdzLT5lZGksU2xvdCk7Ci0JICAgIHJlZ3MtPmVheCA9IChyZWdzLT5lYXggJiAweDAwRkYpIHwgKFNVQ0NFU1NGVUwgPDwgOCk7Ci0JICAgIHJlZ3MtPmVmbGFncyAmPSB+KCh1bnNpZ25lZCBsb25nKTB4MDEpOyAvKiBjbGVhciBjYXJyeSBmbGFnICovCi0JfSBlbHNlIHsKLQkgICAgcmVncy0+ZWF4ID0gKHJlZ3MtPmVheCAmIDB4MDBGRikgfCAoQkFEX1JFR0lTVEVSX05VTUJFUiA8PCA4KTsKLQkgICAgcmVncy0+ZWZsYWdzIHw9ICgodW5zaWduZWQgbG9uZykweDAxKTsgLyogc2V0IGNhcnJ5IGZsYWcgKi8KLQl9Ci0JaV9wcmludGYoImF4PTB4JWx4IGN4PTB4JWx4IGZsYWdzPTB4JWx4XG4iLAotCQkgcmVncy0+ZWF4LHJlZ3MtPmVjeCxyZWdzLT5lZmxhZ3MpOwotCXJldHVybiAxOwotICAgIGNhc2UgMHhiMTBiOgotCWlfcHJpbnRmKCJTbG90PTB4JXhcbiIsQ3VycmVudFBjaS0+U2xvdC5sKTsKLQlpZiAoKFNsb3QgPSBmaW5kUGNpKHJlZ3MtPmVieCkpKSB7Ci0JICAgIFBjaVdyaXRlOChyZWdzLT5lZGksKENBUkQ4KXJlZ3MtPmVjeCxTbG90KTsKLQkgICAgcmVncy0+ZWF4ID0gKHJlZ3MtPmVheCAmIDB4MDBGRikgfCAoU1VDQ0VTU0ZVTCA8PCA4KTsKLQkgICAgcmVncy0+ZWZsYWdzICY9IH4oKHVuc2lnbmVkIGxvbmcpMHgwMSk7IC8qIGNsZWFyIGNhcnJ5IGZsYWcgKi8KLQl9IGVsc2UgewotCSAgICByZWdzLT5lYXggPSAocmVncy0+ZWF4ICYgMHgwMEZGKSB8IChCQURfUkVHSVNURVJfTlVNQkVSIDw8IDgpOwotCSAgICByZWdzLT5lZmxhZ3MgfD0gKCh1bnNpZ25lZCBsb25nKTB4MDEpOyAvKiBzZXQgY2FycnkgZmxhZyAqLwotCX0KLQlpX3ByaW50ZigiYXg9MHglbHggZmxhZ3M9MHglbHhcbiIsIHJlZ3MtPmVheCxyZWdzLT5lZmxhZ3MpOwotCXJldHVybiAxOwotICAgIGNhc2UgMHhiMTBjOgotCWlfcHJpbnRmKCJTbG90PTB4JXhcbiIsQ3VycmVudFBjaS0+U2xvdC5sKTsKLQlpZiAoKFNsb3QgPSBmaW5kUGNpKHJlZ3MtPmVieCkpKSB7Ci0JICAgIFBjaVdyaXRlMTYocmVncy0+ZWRpLChDQVJEMTYpcmVncy0+ZWN4LFNsb3QpOwotCSAgICByZWdzLT5lYXggPSAocmVncy0+ZWF4ICYgMHgwMEZGKSB8IChTVUNDRVNTRlVMIDw8IDgpOwotCSAgICByZWdzLT5lZmxhZ3MgJj0gfigodW5zaWduZWQgbG9uZykweDAxKTsgLyogY2xlYXIgY2FycnkgZmxhZyAqLwotCX0gZWxzZSB7Ci0JICAgIHJlZ3MtPmVheCA9IChyZWdzLT5lYXggJiAweDAwRkYpIHwgKEJBRF9SRUdJU1RFUl9OVU1CRVIgPDwgOCk7Ci0JICAgIHJlZ3MtPmVmbGFncyB8PSAoKHVuc2lnbmVkIGxvbmcpMHgwMSk7IC8qIHNldCBjYXJyeSBmbGFnICovCi0JfQotCWlfcHJpbnRmKCJheD0weCVseCBmbGFncz0weCVseFxuIiwgcmVncy0+ZWF4LHJlZ3MtPmVmbGFncyk7Ci0JcmV0dXJuIDE7Ci0gICAgY2FzZSAweGIxMGQ6Ci0JaV9wcmludGYoIlNsb3Q9MHgleFxuIixDdXJyZW50UGNpLT5TbG90LmwpOwotCWlmICgoU2xvdCA9IGZpbmRQY2kocmVncy0+ZWJ4KSkpIHsKLQkgICAgUGNpV3JpdGUzMihyZWdzLT5lZGksKENBUkQzMilyZWdzLT5lY3gsU2xvdCk7Ci0JICAgIHJlZ3MtPmVheCA9IChyZWdzLT5lYXggJiAweDAwRkYpIHwgKFNVQ0NFU1NGVUwgPDwgOCk7Ci0JICAgIHJlZ3MtPmVmbGFncyAmPSB+KCh1bnNpZ25lZCBsb25nKTB4MDEpOyAvKiBjbGVhciBjYXJyeSBmbGFnICovCi0JfSBlbHNlIHsKLQkgICAgcmVncy0+ZWF4ID0gKHJlZ3MtPmVheCAmIDB4MDBGRikgfCAoQkFEX1JFR0lTVEVSX05VTUJFUiA8PCA4KTsKLQkgICAgcmVncy0+ZWZsYWdzIHw9ICgodW5zaWduZWQgbG9uZykweDAxKTsgLyogc2V0IGNhcnJ5IGZsYWcgKi8KLQl9Ci0JaV9wcmludGYoImF4PTB4JWx4IGZsYWdzPTB4JWx4XG4iLCByZWdzLT5lYXgscmVncy0+ZWZsYWdzKTsKLQlyZXR1cm4gMTsKLSAgICBkZWZhdWx0OgotCXJldHVybiAwOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvaW8uYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM1YjQzZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2lvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAxOTk5IEVnYmVydCBFaWNoCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi0gKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAotICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Ci0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCi0gKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZCBpbgotICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0Ci0gKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zCi0gKiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZAotICogImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSAqCi0gKiBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSAqIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKLSAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKLSAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLSNpbmNsdWRlICJkZWJ1Zy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZCAoX19pYTY0X18pCi0jaW5jbHVkZSA8c3lzL2lvLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJBc21NYWNyb3MuaCIKLSNpbmNsdWRlICJ2ODZiaW9zLmgiCi0jaW5jbHVkZSAicGNpLmgiCi0KLWludCByX2luYiA9IDAsIHJfaW53ID0gMCwgcl9pbmwgPSAwLCByX291dGIgPSAwLCByX291dHcgPSAwLCByX291dGwgPSAwOwotaW50IGluX2IgPSAwLCBpbl93ID0gMCwgaW5fbCA9IDAsIG91dF9iID0gMCwgb3V0X3cgPSAwLCBvdXRfbCA9IDA7Ci0KLQotaW50Ci1wb3J0X3JlcF9pbmIoQ0FSRDE2IHBvcnQsIENBUkQ4ICpiYXNlLCBpbnQgZF9mLCBDQVJEMzIgY291bnQpCi17Ci0gICAgcmVnaXN0ZXIgaW50IGluYyA9IGRfZiA/IC0xIDogMTsKLSAgICBDQVJEOCAqZHN0ID0gYmFzZTsKLQotICAgIHBfcHJpbnRmKCIgcmVwX2luc2IoJSN4KSAlZCBieXRlcyBhdCAlcCAlcyIsCi0JICAgICBwb3J0LCBjb3VudCwgYmFzZSwgZF9mPyJ1cCI6ImRvd24iKTsKLSAgICBpZiAoQ29uZmlnLlByaW50SXApCi0JcF9wcmludGYoIiAleFxuIixnZXRJUCgpKTsKLSAgICBlbHNlIHBfcHJpbnRmKCJcbiIpOwotCi0gICAgcl9pbmIrKzsKLSAgICB3aGlsZSAoY291bnQtLSkgewotCSpkc3QgPSBpbmIocG9ydCk7Ci0JZHN0ICs9IGluYzsKLSAgICB9Ci0gICAgcmV0dXJuIChkc3QtYmFzZSk7Ci19Ci0KLWludAotcG9ydF9yZXBfaW53KENBUkQxNiBwb3J0LCBDQVJEMTYgKmJhc2UsIGludCBkX2YsIENBUkQzMiBjb3VudCkKLXsKLSAgICByZWdpc3RlciBpbnQgaW5jID0gZF9mID8gLTEgOiAxOwotICAgIENBUkQxNiAqZHN0ID0gYmFzZTsKLQotICAgIHBfcHJpbnRmKCIgcmVwX2luc3coJSN4KSAlZCBieXRlcyBhdCAlcCAlcyIsCi0JICAgICBwb3J0LCBjb3VudCwgYmFzZSwgZF9mPyJ1cCI6ImRvd24iKTsKLSAgICBpZiAoQ29uZmlnLlByaW50SXApCi0JcF9wcmludGYoIiAleFxuIixnZXRJUCgpKTsKLSAgICBlbHNlIHBfcHJpbnRmKCJcbiIpOwotCi0gICAgcl9pbncrKzsKLSAgICB3aGlsZSAoY291bnQtLSkgewotCSpkc3QgPSBpbncocG9ydCk7Ci0JZHN0ICs9IGluYzsKLSAgICB9Ci0gICAgcmV0dXJuIChkc3QtYmFzZSk7Ci19Ci0KLWludAotcG9ydF9yZXBfaW5sKENBUkQxNiBwb3J0LCBDQVJEMzIgKmJhc2UsIGludCBkX2YsIENBUkQzMiBjb3VudCkKLXsKLSAgICByZWdpc3RlciBpbnQgaW5jID0gZF9mID8gLTEgOiAxOwotICAgIENBUkQzMiAqZHN0ID0gYmFzZTsKLQotICAgIHBfcHJpbnRmKCIgcmVwX2luc2woJSN4KSAlZCBieXRlcyBhdCAlcCAlcyIsCi0JICAgICBwb3J0LCBjb3VudCwgYmFzZSwgZF9mPyJ1cCI6ImRvd24iKTsKLSAgICBpZiAoQ29uZmlnLlByaW50SXApCi0JcF9wcmludGYoIiAleFxuIixnZXRJUCgpKTsKLSAgICBlbHNlIHBfcHJpbnRmKCJcbiIpOwotCi0gICAgcl9pbmwrKzsKLSAgICB3aGlsZSAoY291bnQtLSkgewotCSpkc3QgPSBpbmwocG9ydCk7Ci0JZHN0ICs9IGluYzsKLSAgICB9Ci0gICAgcmV0dXJuIChkc3QtYmFzZSk7Ci19Ci0KLWludAotcG9ydF9yZXBfb3V0YihDQVJEMTYgcG9ydCwgQ0FSRDggKmJhc2UsIGludCBkX2YsIENBUkQzMiBjb3VudCkKLXsKLSAgICByZWdpc3RlciBpbnQgaW5jID0gZF9mID8gLTEgOiAxOwotICAgIENBUkQ4ICpkc3QgPSBiYXNlOwotCi0gICAgcF9wcmludGYoIiByZXBfb3V0YiglI3gpICVkIGJ5dGVzIGF0ICVwICVzIiwKLQkgICAgIHBvcnQsIGNvdW50LCBiYXNlLCBkX2Y/InVwIjoiZG93biIpOwotICAgIGlmIChDb25maWcuUHJpbnRJcCkKLQlwX3ByaW50ZigiICV4XG4iLGdldElQKCkpOwotICAgIGVsc2UgcF9wcmludGYoIlxuIik7Ci0KLSAgICByX291dGIrKzsKLSAgICB3aGlsZSAoY291bnQtLSkgewotCW91dGIocG9ydCwqZHN0KTsKLQlkc3QgKz0gaW5jOwotICAgIH0KLSAgICByZXR1cm4gKGRzdC1iYXNlKTsKLX0KLQotaW50Ci1wb3J0X3JlcF9vdXR3KENBUkQxNiBwb3J0LCBDQVJEMTYgKmJhc2UsIGludCBkX2YsIENBUkQzMiBjb3VudCkKLXsKLSAgICByZWdpc3RlciBpbnQgaW5jID0gZF9mID8gLTEgOiAxOwotICAgIENBUkQxNiAqZHN0ID0gYmFzZTsKLQotICAgIHBfcHJpbnRmKCIgcmVwX291dHcoJSN4KSAlZCBieXRlcyBhdCAlcCAlcyIsCi0JICAgICBwb3J0LCBjb3VudCwgYmFzZSwgZF9mPyJ1cCI6ImRvd24iKTsKLSAgICBpZiAoQ29uZmlnLlByaW50SXApCi0JcF9wcmludGYoIiAleFxuIixnZXRJUCgpKTsKLSAgICBlbHNlIHBfcHJpbnRmKCJcbiIpOwotCi0gICAgcl9vdXR3Kys7Ci0gICAgd2hpbGUgKGNvdW50LS0pIHsKLQlvdXR3KHBvcnQsKmRzdCk7Ci0JZHN0ICs9IGluYzsKLSAgICB9Ci0gICAgcmV0dXJuIChkc3QtYmFzZSk7Ci19Ci0KLWludAotcG9ydF9yZXBfb3V0bChDQVJEMTYgcG9ydCwgQ0FSRDMyICpiYXNlLCBpbnQgZF9mLCBDQVJEMzIgY291bnQpCi17Ci0gICAgcmVnaXN0ZXIgaW50IGluYyA9IGRfZiA/IC0xIDogMTsKLSAgICBDQVJEMzIgKmRzdCA9IGJhc2U7Ci0KLSAgICBwX3ByaW50ZigiIHJlcF9vdXRsKCUjeCkgJWQgYnl0ZXMgYXQgJXAgJXMiLAotCSAgICAgcG9ydCwgY291bnQsIGJhc2UsIGRfZj8idXAiOiJkb3duIik7Ci0gICAgaWYgKENvbmZpZy5QcmludElwKQotCXBfcHJpbnRmKCIgJXhcbiIsZ2V0SVAoKSk7Ci0gICAgZWxzZSBwX3ByaW50ZigiXG4iKTsKLQotICAgIHJfb3V0bCsrOwotICAgIHdoaWxlIChjb3VudC0tKSB7Ci0Jb3V0bChwb3J0LCpkc3QpOwotCWRzdCArPSBpbmM7Ci0gICAgfQotICAgIHJldHVybiAoZHN0LWJhc2UpOwotfQotCi1DQVJEOAotcF9pbmIoQ0FSRDE2IHBvcnQpCi17Ci0gICAgQ0FSRDggdmFsID0gMDsKLSAgICBpbl9iKys7Ci0gICAgdmFsID0gaW5iKHBvcnQpOwotICAgIHBfcHJpbnRmKCIgaW5iKCUjeCkgPSAlMi4yeCIscG9ydCx2YWwpOwotICAgIGlmIChDb25maWcuUHJpbnRJcCkKLQlwX3ByaW50ZigiICV4XG4iLGdldElQKCkpOwotICAgIGVsc2UgcF9wcmludGYoIlxuIik7Ci0KLSAgICByZXR1cm4gdmFsOwotfQotCi1DQVJEMTYKLXBfaW53KENBUkQxNiBwb3J0KQotewotICAgIENBUkQxNiB2YWwgPSAwOwotICAgIGluX3crKzsKLSAgICB2YWwgPSBpbncocG9ydCk7Ci0gICAgcF9wcmludGYoIiBpbncoJSN4KSA9ICU0LjR4Iixwb3J0LHZhbCk7Ci0gICAgaWYgKENvbmZpZy5QcmludElwKQotCXBfcHJpbnRmKCIgJXhcbiIsZ2V0SVAoKSk7Ci0gICAgZWxzZSBwX3ByaW50ZigiXG4iKTsKLQotICAgIHJldHVybiB2YWw7Ci19Ci0KLUNBUkQzMgotcF9pbmwoQ0FSRDE2IHBvcnQpCi17Ci0gICAgQ0FSRDMyIHZhbCA9IDA7Ci0gICAgaW5fbCsrOwotI2lmZGVmIE5FRURfUENJX0lPCi0gICAgaWYgKGNmZzFpbihwb3J0LCZ2YWwpKQotCXJldHVybiB2YWw7Ci0gICAgZWxzZQotI2VuZGlmCi0gICAgdmFsID0gaW5sKHBvcnQpOwotICAgIHBfcHJpbnRmKCIgaW5sKCUjeCkgPSAlOC44eCIscG9ydCx2YWwpOwotICAgIGlmIChDb25maWcuUHJpbnRJcCkKLQlwX3ByaW50ZigiICV4XG4iLGdldElQKCkpOwotICAgIGVsc2UgcF9wcmludGYoIlxuIik7Ci0KLSAgICByZXR1cm4gdmFsOwotfQotCi12b2lkCi1wX291dGIoQ0FSRDE2IHBvcnQsIENBUkQ4IHZhbCkKLXsKLSAgICBvdXRfYisrOwotICAgIHBfcHJpbnRmKCIgb3V0YiglI3gsICUyLjJ4KSIscG9ydCx2YWwpOwotICAgIGlmIChDb25maWcuUHJpbnRJcCkKLQlwX3ByaW50ZigiICV4XG4iLGdldElQKCkpOwotICAgIGVsc2UgcF9wcmludGYoIlxuIik7Ci0KLSAgICBvdXRiKHBvcnQsdmFsKTsKLX0KLQotdm9pZAotcF9vdXR3KENBUkQxNiBwb3J0LCBDQVJEMTYgdmFsKQotewotICAgIG91dF93Kys7Ci0gICAgcF9wcmludGYoIiBvdXR3KCUjeCwgJTQuNHgpIixwb3J0LHZhbCk7Ci0gICAgaWYgKENvbmZpZy5QcmludElwKQotCXBfcHJpbnRmKCIgJXhcbiIsZ2V0SVAoKSk7Ci0gICAgZWxzZSBwX3ByaW50ZigiXG4iKTsKLQotICAgIG91dHcocG9ydCx2YWwpOwotfQotCi12b2lkCi1wX291dGwoQ0FSRDE2IHBvcnQsIENBUkQzMiB2YWwpCi17Ci0gICAgb3V0X2wrKzsKLSAgICBwX3ByaW50ZigiIG91dGwoJSN4LCAlOC44eCkiLHBvcnQsdmFsKTsKLSAgICBpZiAoQ29uZmlnLlByaW50SXApCi0JcF9wcmludGYoIiAleFxuIixnZXRJUCgpKTsKLSAgICBlbHNlIHBfcHJpbnRmKCJcbiIpOwotCi0jaWZkZWYgTkVFRF9QQ0lfSU8KLSAgICBpZiAoY2ZnMW91dChwb3J0LHZhbCkpCi0JcmV0dXJuOwotI2VuZGlmCi0gICAgb3V0bChwb3J0LHZhbCk7Ci19Ci0KLXZvaWQKLWlvX3N0YXRpc3RpY3Modm9pZCkKLXsKLSAgICBwX3ByaW50ZigicmVwOiBpbmI6ICVpLCBpbnc6ICVpLCBpbmw6ICVpLCBvdXRiOiAlaSwgb3V0dzogJWksIG91dGw6ICVpXG4iLAotCSByX2luYixyX2ludyxyX2lubCxyX291dGIscl9vdXR3LHJfb3V0bCk7Ci0gICAgcF9wcmludGYoImluYjogJWksIGludzogJWksIGlubDogJWksIG91dGI6ICVpLCBvdXR3OiAlaSwgb3V0bDogJWlcbiIsCi0JIGluX2IsaW5fdyxpbl9sLG91dF9iLG91dF93LG91dF9sKTsKLX0KLQotdm9pZAotY2xlYXJfc3RhdCh2b2lkKQotewotICAgIHJfaW5iID0gcl9pbncgPSByX2lubCA9IHJfb3V0YiA9IHJfb3V0dyA9IHJfb3V0bCA9IDA7Ci0gICAgaW5fYiA9IGluX3cgPSBpbl9sID0gb3V0X2IgPSBvdXRfdyA9IG91dF9sID0gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvbGV4LmwgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL2xleC5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTMzOTFjLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvbGV4LmwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0lewotI2luY2x1ZGUgInBhcnNlci5oIgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotIHZvaWQgZ2V0bGluZShjaGFyICpidWYsaW50ICpudW0saW50IG1heF9udW0pOwotICAgIAotI2RlZmluZSBZWV9JTlBVVChidWYscmVzdWx0LG1heF9zaXplKSB7XAotICAgICAgZ2V0bGluZShidWYsJnJlc3VsdCxtYXhfc2l6ZSk7XAotICAgICAgfQotCi0gdm9pZAotIHl5ZXJyb3IgKGNoYXIgKnMpICAKLSB7Ci0gICAgIHByaW50ZiAoIiVzXG4iLCBzKTsKLSB9Ci0KLSV9Ci0KLURJR0lUIFswLTlhLWZBLUZdCi0KLSUlCi0KLSIweCI/e0RJR0lUfSsgeyB5eWx2YWwgPSBzdHJ0b2woeXl0ZXh0LE5VTEwsMCk7IHJldHVybiBUT0tfTlVNOyB9Ci0iYXgiICAgICAgICAgIHsgcmV0dXJuIFRPS19SRUdfQVg7IH0KLSJieCIgICAgICAgICAgeyByZXR1cm4gVE9LX1JFR19CWDsgfQotImN4IiAgICAgICAgICB7IHJldHVybiBUT0tfUkVHX0NYOyB9Ci0iZHgiICAgICAgICAgIHsgcmV0dXJuIFRPS19SRUdfRFg7IH0KLSJkaSIgICAgICAgICAgeyByZXR1cm4gVE9LX1JFR19TSTsgfQotInNpIiAgICAgICAgICB7IHJldHVybiBUT0tfUkVHX0RJOyB9Ci0iZHMiICAgICAgICAgIHsgcmV0dXJuIFRPS19TRUdfRFM7IH0KLSJlcyIgICAgICAgICAgeyByZXR1cm4gVE9LX1NFR19FUzsgfQotIjoiICAgICAgICAgICB7IHJldHVybiBUT0tfU0VQO30KLSIkIntESUdJVH17MSwyfSB7IHl5bHZhbCA9IHN0cnRvbCh5eXRleHQrMSxOVUxMLDApOyByZXR1cm4gVE9LX1ZBUjsgfQotIiRtZW0iICAgICAgICB7IHJldHVybiBUT0tfVkFSX01FTTsgfQotWyBcdF0rCi0iIyIuKltcbl0gICB7IHJldHVybiBUT0tfRU5EOyB9Ci0iYm9vdCIgICAgICAgIHsgcmV0dXJuIFRPS19DT01NQU5EX0JPT1Q7IH0KLSJkbyIgICAgICAgICAgeyByZXR1cm4gVE9LX0NPTU1BTkRfRVhFQzsgfQotIlwiIi4qIlwiIiAgICB7IHl5bHZhbCA9ICh1bnNpZ25lZCBsb25nKSB5eXRleHQ7IHJldHVybiBUT0tfU1RSSU5HOyB9Ci0iYnl0ZSIgICAgICAgIHsgcmV0dXJuIFRPS19CWVRFOyB9Ci0id29yZCIgICAgICAgIHsgcmV0dXJuIFRPS19XT1JEOyB9Ci0ibG9uZyIgICAgICAgIHsgcmV0dXJuIFRPS19MT05HOyB9Ci0ic2V0bWVtIiAgICAgIHsgcmV0dXJuIFRPS19DT01NQU5EX01FTVNFVDsgfQotImR1bXBtZW0iICAgICB7IHJldHVybiBUT0tfQ09NTUFORF9NRU1EVU1QOyB9Ci0icXVpdCIgICAgICAgIHsgcmV0dXJuIFRPS19DT01NQU5EX1FVSVQ7IH0KLSJcbiIgICAgICAgICAgeyByZXR1cm4gVE9LX0VORDsgfQotInNlbGVjdCIgICAgICB7IHJldHVybiBUT0tfU0VMRUNUOyB9Ci0iaXNhIiAgICAgICAgIHsgcmV0dXJuIFRPS19JU0E7IH0KLSJwY2kiICAgICAgICAgeyByZXR1cm4gVE9LX1BDSTsgfQotInBwb3J0IiAgICAgICB7IHJldHVybiBUT0tfUFJJTlRfUE9SVDsgfQotImlvc3RhdCIgICAgICB7IHJldHVybiBUT0tfSU9TVEFUOyB9Ci0icGlycSIgICAgICAgIHsgcmV0dXJuIFRPS19QUklOVF9JUlE7IH0KLSJwcGNpIiAgICAgICAgeyByZXR1cm4gVE9LX1BQQ0k7IH0KLSJwaXAiICAgICAgICAgeyByZXR1cm4gVE9LX1BJUDsgfQotInRyYWNlIiAgICAgICB7IHJldHVybiBUT0tfVFJBQ0U7IH0KLSJvbiIgICAgICAgICAgeyByZXR1cm4gVE9LX09OOyB9Ci0ib2ZmIiAgICAgICAgIHsgcmV0dXJuIFRPS19PRkY7IH0KLSJ2ZXJib3NlIiAgICAgeyByZXR1cm4gVE9LX1ZFUkJPU0U7IH0KLSJsb2ciICAgICAgICAgeyByZXR1cm4gVE9LX0xPRzsgfQotInByaW50IiAgICAgICB7IHJldHVybiBUT0tfU1RET1VUOyB9Ci0iY2xzdGF0IiAgICAgIHsgcmV0dXJuIFRPS19DTFNUQVQ7IH0KLSJobHQiICAgICAgICAgeyByZXR1cm4gVE9LX0hMVDsgfQotImRlbCIgICAgICAgICB7IHJldHVybiBUT0tfREVMOyB9Ci0iaW9wZXJtIiAgICAgIHsgcmV0dXJuIFRPS19JT1BFUk07IH0KLSJscGNpIiAgICAgICAgeyByZXR1cm4gVE9LX0RVTVBfUENJOyB9Ci0iYm9vdGJpb3MiICAgIHsgcmV0dXJuIFRPS19CT09UX0JJT1M7IH0KLSI/IiAgICAgICAgICAgeyByZXR1cm4gJz8nOyB9Ci0uICAgICAgICAgICAgIHsgcmV0dXJuIFRPS19FUlJPUjsgfQotICAgIAotJSUKLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9tYWluLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL21haW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVmOTExNS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL21haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDYxNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDE5OTkgRWdiZXJ0IEVpY2gKLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Ci0gKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKLSAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkIGluCi0gKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKLSAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMKLSAqIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkCi0gKiAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotICoKLSAqIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotICogRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAotICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgotICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotI2RlZmluZSBERUxFVEUKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkIChfX2lhNjRfXykKLSNpbmNsdWRlIDxzeXMvaW8uaD4KLSNlbGlmIGRlZmluZWQoSEFWRV9TWVNfUEVSTSkKLSNpbmNsdWRlIDxzeXMvcGVybS5oPgotI2VuZGlmCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJ2ODZiaW9zLmgiCi0jaW5jbHVkZSAicGNpLmgiCi0jaW5jbHVkZSAiQXNtTWFjcm9zLmgiCi0KLSNkZWZpbmUgU0laRSAweDEwMDAwMAotI2RlZmluZSBWUkFNX1NUQVJUIDB4QTAwMDAKLSNkZWZpbmUgVlJBTV9TSVpFIDB4MUZGRkYKLSNkZWZpbmUgVl9CSU9TX1NJWkUgMHgxRkZGRgotI2RlZmluZSBCSU9TX1NUQVJUIDB4N0MwMCAgICAgICAgICAgIC8qIGRlZmF1bHQgQklPUyBlbnRyeSAqLwotCi0vKkNBUkQ4IGNvZGVbXSA9IHsgMHhiOCAsIDB4ZjAgLCAweGYwLCAweGY0IH07ICovCi0jZGVmaW5lIFZCX1goeCkgKFZfQklPUyA+PiB4KSAmIDB4RkYKLUNBUkQ4IGNvZGVbXSA9IHsgMHg5YSwgMHgwMywgMHgwMCwgMHgwMCwgVkJfWCgxMiksIDB4ZjQgfTsKLS8qQ0FSRDggY29kZVtdID0geyAweDlhLCAweDAzLCAweDAwLCAweDAwLCBWQl9YKDEyKSwgMHhiOCwgMHgwMywgMHgwMCwgKi8KLS8qMHhjZCwgMHgxMCwgMHhmNCB9OyAqLwotLypDQVJEOCBjb2RlW10gPSB7ICAweGI4ICwgMHhmMCAsIDB4ZjAgLDB4ZjQgfTsgKi8KLQotc3RhdGljIHZvaWQgc2lnX2hhbmRsZXIoaW50KTsKLXN0YXRpYyBpbnQgbWFwKHZvaWQpOwotc3RhdGljIHZvaWQgdW5tYXAodm9pZCk7Ci1zdGF0aWMgdm9pZCBib290QklPUyhDQVJEMTYgYXgpOwotc3RhdGljIGludCBtYXBfdnJhbSh2b2lkKTsKLXN0YXRpYyB2b2lkIHVubWFwX3ZyYW0odm9pZCk7Ci1zdGF0aWMgaW50IGNvcHlfdmJpb3Modm9pZCk7Ci1zdGF0aWMgaW50IGNvcHlfc3lzX2Jpb3Modm9pZCk7Ci1zdGF0aWMgdm9pZCBzYXZlX2Jpb3NfdG9fZmlsZSh2b2lkKTsKLXN0YXRpYyBpbnQgc2V0dXBfc3lzdGVtX2Jpb3Modm9pZCk7Ci1zdGF0aWMgdm9pZCBzZXR1cF9pbnRfdmVjdCh2b2lkKTsKLXN0YXRpYyBpbnQgY2hrc3VtKENBUkQ4ICpzdGFydCk7Ci1zdGF0aWMgdm9pZCBzZXR1cF9iaW9zX3JlZ3MoaTg2Ymlvc1JlZ3NQdHIgcmVncywgQ0FSRDMyIGF4KTsKLQotdm9pZCBsb2FkQ29kZVRvTWVtKHVuc2lnbmVkIGNoYXIgKnB0ciwgQ0FSRDggKmNvZGUpOwotdm9pZCBkcHJpbnQodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKTsKLQotc3RhdGljIGludCB2cmFtX21hcHBlZCA9IDA7Ci1zdGF0aWMgQ0FSRDggc2F2ZV9tc3I7Ci1zdGF0aWMgQ0FSRDggc2F2ZV9wb3MxMDI7Ci1zdGF0aWMgQ0FSRDggc2F2ZV92c2U7Ci1zdGF0aWMgQ0FSRDggc2F2ZV80NmU4OwotY29uc29sZSBDb25zb2xlOwotc3RydWN0IGNvbmZpZyBDb25maWc7Ci0KLQotaW50Ci1tYWluKHZvaWQpCi17Ci0gICAgaW50IEFjdGl2ZV9pc19QY2kgPSAwOwotI2lmZGVmIERFTEVURQotICAgIENvbmZpZy5QcmludFBvcnQgPSBQUklOVF9QT1JUOwotICAgIENvbmZpZy5Jb1N0YXRpc3RpY3MgPSBJT19TVEFUSVNUSUNTOwotICAgIENvbmZpZy5QcmludElycSA9IFBSSU5UX0lSUTsKLSAgICBDb25maWcuUHJpbnRQY2kgPSBQUklOVF9QQ0k7Ci0gICAgQ29uZmlnLlNob3dBbGxEZXYgPSBTSE9XX0FMTF9ERVY7Ci0gICAgQ29uZmlnLlByaW50SXAgPSBQUklOVF9JUDsKLSAgICBDb25maWcuU2F2ZUJpb3MgPSBTQVZFX0JJT1M7Ci0gICAgQ29uZmlnLlRyYWNlID0gVFJBQ0U7Ci0gICAgQ29uZmlnLkNvbmZpZ0FjdGl2ZU9ubHkgPSBDT05GSUdfQUNUSVZFX09OTFk7Ci0gICAgQ29uZmlnLkNvbmZpZ0FjdGl2ZURldmljZSA9IENPTkZJR19BQ1RJVkVfREVWSUNFOwotICAgIENvbmZpZy5NYXBTeXNCaW9zID0gTUFQX1NZU19CSU9TOwotICAgIENvbmZpZy5SZXNvcnQgPSBSRVNPUlQ7Ci0gICAgQ29uZmlnLkZpeFJvbSA9IEZJWF9ST007Ci0gICAgQ29uZmlnLk5vQ29uc29sZSA9IE5PX0NPTlNPTEU7Ci0gICAgQ29uZmlnLlZlcmJvc2UgPSBWRVJCT1NFOwotCi0gICAgaWYgKCFtYXAoKSkKLQlleGl0KDEpOwotCi0gICAgaWYgKCFzZXR1cF9zeXN0ZW1fYmlvcygpKQotCWV4aXQoMSk7Ci0KLSAgICBpb3BsKDMpOwotICAgIHNldHVwX2lvKCk7Ci0KLSAgICBzY2FuX3BjaSgpOwotICAgIGlmICghQ3VycmVudFBjaSAmJiAhQ29uZmlnLkNvbmZpZ0FjdGl2ZURldmljZSAmJiAhQ29uZmlnLkNvbmZpZ0FjdGl2ZU9ubHkpCi0JZXhpdCAoMSk7Ci0jZW5kaWYKLSAgICBDb25zb2xlID0gb3Blbl9jb25zb2xlKCk7Ci0KLSAgICBpZiAoQ29uZmlnLkNvbmZpZ0FjdGl2ZU9ubHkpIHsKLQlDQVJEMTYgYXg7Ci0JaW50IGFjdGl2ZVBjaSA9IDA7Ci0JaW50IGVycm9yID0gMDsKLQotCXdoaWxlIChDdXJyZW50UGNpKSB7Ci0JICAgIGlmIChDdXJyZW50UGNpLT5hY3RpdmUpIHsKLQkJYWN0aXZlUGNpID0gMTsKLQkJCSAgICBpZiAoIShtYXBQY2lSb20oTlVMTCkgJiYgY2hrc3VtKChDQVJEOCopVl9CSU9TKSkpCi0JCQkJZXJyb3IgPSAxOwotCQkJICAgIGJyZWFrOwotCSAgICB9Ci0JICAgIEN1cnJlbnRQY2kgPSBDdXJyZW50UGNpLT5uZXh0OwotCX0KLQlheCA9ICgoQ0FSRDE2KShDdXJyZW50UGNpLT5idXMpIDw8IDgpCi0JICAgIHwgKEN1cnJlbnRQY2ktPmRldiA8PCAzKSB8IChDdXJyZW50UGNpLT5mdW5jICYgMHg3KTsKLQlQX3ByaW50ZigiYXg6IDB4JXhcbiIsYXgpOwotCXNldHVwX2ludF92ZWN0KCk7Ci0JaWYgKCFlcnJvciAmJiAoYWN0aXZlUGNpIHx8IGNvcHlfdmJpb3MoKSkpIHsKLQotCSAgICBpZiAoQ29uZmlnLlNhdmVCaW9zKSBzYXZlX2Jpb3NfdG9fZmlsZSgpOwotCSAgICBpZiAgKG1hcF92cmFtKCkpIHsKLQkJcHJpbnRmKCJpbml0aWFsaXppbmcgSVNBXG4iKTsKLQkJCSAgICBib290QklPUygwKTsKLQkgICAgfQotCX0KLQl1bm1hcF92cmFtKCk7Ci0Jc2xlZXAoMSk7Ci0gICAgfSBlbHNlIHsKLQkvKiBkaXNhYmxlIHByaW1hcnkgY2FyZCAqLwotCXNhdmVfbXNyID0gaW5iKDB4M0NDKTsKLQlzYXZlX3ZzZSA9IGluYigweDNDMyk7Ci0Jc2F2ZV80NmU4ID0gaW5iKDB4NDZlOCk7Ci0Jc2F2ZV9wb3MxMDIgPSBpbmIoMHgxMDIpOwotCi0Jc2lnbmFsKDIsc2lnX2hhbmRsZXIpOwotCXNpZ25hbCgxMSxzaWdfaGFuZGxlcik7Ci0KLQlvdXRiKDB4M0MyLH4oQ0FSRDgpMHgwMyAmIHNhdmVfbXNyKTsKLQlvdXRiKDB4M0MzLH4oQ0FSRDgpMHgwMSAmIHNhdmVfdnNlKTsKLQlvdXRiKDB4NDZlOCwgfihDQVJEOCkweDA4ICYgc2F2ZV80NmU4KTsKLQlvdXRiKDB4MTAyLCB+KENBUkQ4KTB4MDEgJiBzYXZlX3BvczEwMik7Ci0KLQlwY2lWaWRlb0Rpc2FibGUoKTsKLQotCXdoaWxlIChDdXJyZW50UGNpKSB7Ci0JICAgIENBUkQxNiBheDsKLQotCSAgICBpZiAoQ3VycmVudFBjaS0+YWN0aXZlKSB7Ci0JCUFjdGl2ZV9pc19QY2kgPSAxOwotCQlpZiAoIUNvbmZpZy5Db25maWdBY3RpdmVEZXZpY2UpIHsKLQkJICAgIEN1cnJlbnRQY2kgPSBDdXJyZW50UGNpLT5uZXh0OwotCQkgICAgY29udGludWU7Ci0JCX0KLQkgICAgfQotCi0JICAgIEVuYWJsZUN1cnJlbnQoKTsKLQotCSAgICBpZiAoQ3VycmVudFBjaS0+YWN0aXZlKSB7Ci0JCW91dGIoMHgxMDIsIHNhdmVfcG9zMTAyKTsKLQkJb3V0YigweDQ2ZTgsIHNhdmVfNDZlOCk7Ci0JCW91dGIoMHgzQzMsIHNhdmVfdnNlKTsKLQkJb3V0YigweDNDMiwgc2F2ZV9tc3IpOwotCSAgICB9Ci0KLQkgICAgLyogY2xlYXIgaW50ZXJydXB0IHZlY3RvcnMgKi8KLQkgICAgc2V0dXBfaW50X3ZlY3QoKTsKLQotCSAgICBheCA9ICgoQ0FSRDE2KShDdXJyZW50UGNpLT5idXMpIDw8IDgpCi0JCXwgKEN1cnJlbnRQY2ktPmRldiA8PCAzKSB8IChDdXJyZW50UGNpLT5mdW5jICYgMHg3KTsKLQkgICAgUF9wcmludGYoImF4OiAweCV4XG4iLGF4KTsKLQotCSAgICBpZiAoISgobWFwUGNpUm9tKE5VTEwpICYmIGNoa3N1bSgoQ0FSRDgqKVZfQklPUykpCi0JCSAgfHwgKEN1cnJlbnRQY2ktPmFjdGl2ZSAmJiBjb3B5X3ZiaW9zKCkpKSkgewotCQlDdXJyZW50UGNpID0gQ3VycmVudFBjaS0+bmV4dDsKLQkJY29udGludWU7Ci0JICAgIH0KLQkgICAgaWYgKCFtYXBfdnJhbSgpKSB7Ci0JCUN1cnJlbnRQY2kgPSBDdXJyZW50UGNpLT5uZXh0OwotCQljb250aW51ZTsKLQkgICAgfQotCSAgICBpZiAoQ29uZmlnLlNhdmVCaW9zKSBzYXZlX2Jpb3NfdG9fZmlsZSgpOwotCSAgICBwcmludGYoImluaXRpYWxpemluZyBQQ0kgYnVzOiAlaSBkZXY6ICVpIGZ1bmM6ICVpXG4iLEN1cnJlbnRQY2ktPmJ1cywKLQkJICAgQ3VycmVudFBjaS0+ZGV2LEN1cnJlbnRQY2ktPmZ1bmMpOwotCSAgICBib290QklPUyhheCk7Ci0JICAgIHVubWFwX3ZyYW0oKTsKLQotCSAgICBDdXJyZW50UGNpID0gQ3VycmVudFBjaS0+bmV4dDsKLQl9Ci0KLQkvKiBXZSBoYXZlIGFuIElTQSBkZXZpY2UgLSBjb25maWd1cmUgaWYgcmVxdWVzdGVkICovCi0JaWYgKCFBY3RpdmVfaXNfUGNpICYmIENvbmZpZy5Db25maWdBY3RpdmVEZXZpY2UpIHsKLQkgICAgcGNpVmlkZW9EaXNhYmxlKCk7Ci0KLQkgICAgb3V0YigweDEwMiwgc2F2ZV9wb3MxMDIpOwotCSAgICBvdXRiKDB4NDZlOCwgc2F2ZV80NmU4KTsKLQkgICAgb3V0YigweDNDMywgc2F2ZV92c2UpOwotCSAgICBvdXRiKDB4M0MyLCBzYXZlX21zcik7Ci0KLQkgICAgc2V0dXBfaW50X3ZlY3QoKTsKLQkgICAgaWYgKGNvcHlfdmJpb3MoKSkgewotCi0JCWlmIChDb25maWcuU2F2ZUJpb3MpIHNhdmVfYmlvc190b19maWxlKCk7Ci0JCWlmICAobWFwX3ZyYW0oKSkgewotCQkgICAgcHJpbnRmKCJpbml0aWFsaXppbmcgSVNBXG4iKTsKLQkJICAgIGJvb3RCSU9TKDApOwotCQl9Ci0JICAgIH0KLQotCSAgICB1bm1hcF92cmFtKCk7Ci0JICAgIHNsZWVwKDEpOwotCX0KLQotCXBjaVZpZGVvUmVzdG9yZSgpOwotCi0Jb3V0YigweDEwMiwgc2F2ZV9wb3MxMDIpOwotCW91dGIoMHg0NmU4LCBzYXZlXzQ2ZTgpOwotCW91dGIoMHgzQzMsIHNhdmVfdnNlKTsKLQlvdXRiKDB4M0MyLCBzYXZlX21zcik7Ci0gICAgfQotCi0gICAgY2xvc2VfY29uc29sZShDb25zb2xlKTsKLSNpZmRlZiBERUxFVEUKLSAgICBpb3BsKDApOwotICAgIHVubWFwKCk7Ci0KLSAgICBwcmludGYoImRvbmUgIVxuIik7Ci0jZW5kaWYKLSAgICBpZiAoQ29uZmlnLklvU3RhdGlzdGljcykKLQlpb19zdGF0aXN0aWNzKCk7Ci0jaWZkZWYgREVMRVRFCi0gICAgZXhpdCgwKTsKLSNlbmRpZgotfQotCi1pbnQKLW1hcCh2b2lkKQotewotICAgIHZvaWQqIG1lbTsKLQotICAgIG1lbSA9IG1tYXAoMCwgKHNpemVfdClTSVpFLAotCSAgICAgICBQUk9UX0VYRUMgfCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCSAgICAgICBNQVBfRklYRUQgfCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OLAotCSAgICAgICAtMSwgMCApOwotICAgIGlmIChtZW0gIT0gMCkgewotCXBlcnJvcigiYW5vbnltb3VzIG1hcCIpOwotCXJldHVybiAoMCk7Ci0gICAgfQotICAgIG1lbXNldChtZW0sMCxTSVpFKTsKLQotICAgIGxvYWRDb2RlVG9NZW0oKHVuc2lnbmVkIGNoYXIgKikgQklPU19TVEFSVCwgY29kZSk7Ci0gICAgcmV0dXJuICgxKTsKLX0KLQotc3RhdGljIHZvaWQKLXVubWFwKHZvaWQpCi17Ci0gICAgbXVubWFwKDAsU0laRSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ib290QklPUyhDQVJEMTYgYXgpCi17Ci0gICAgaTg2Ymlvc1JlZ3MgYlJlZ3M7Ci0jaWZkZWYgVjg2QklPU19ERUJVRwotICAgIHByaW50Zigic3RhcnRpbmcgQklPU1xuIik7Ci0jZW5kaWYKLSAgICBzZXR1cF9iaW9zX3JlZ3MoJmJSZWdzLCBheCk7Ci0gICAgZG9feDg2KEJJT1NfU1RBUlQsJmJSZWdzKTsKLSNpZmRlZiBWODZCSU9TX0RFQlVHCi0gICAgcHJpbnRmKCJkb25lXG4iKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW50Ci1tYXBfdnJhbSh2b2lkKQotewotICAgIGludCBtZW1fZmQ7Ci0KLSNpZmRlZiBfX2lhNjRfXwotICAgIGlmICgobWVtX2ZkID0gb3BlbihNRU1fRklMRSxPX1JEV1IgfCBPX1NZTkMpKTwwKQotI2Vsc2UKLSAgICBpZiAoKG1lbV9mZCA9IG9wZW4oTUVNX0ZJTEUsT19SRFdSKSk8MCkKLSNlbmRpZgotICAgICAgewotCXBlcnJvcigib3BlbmluZyBtZW1vcnkiKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSNpZm5kZWYgX19hbHBoYV9fCi0gICAgaWYgKG1tYXAoKHZvaWQgKikgVlJBTV9TVEFSVCwgKHNpemVfdCkgVlJBTV9TSVpFLAotCQkgICAgIFBST1RfRVhFQyB8IFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQgfCBNQVBfRklYRUQsCi0JCSAgICAgbWVtX2ZkLCBWUkFNX1NUQVJUKSA9PSAodm9pZCAqKSAtMSkKLSNlbHNlCi0JIGlmICghX2J1c19iYXNlKCkpIHNwYXJzZV9zaGlmdCA9IDc7IC8qIFVoLCBvaCwgSkVOU0VOLi4uICovCi0JIGlmICghX2J1c19iYXNlX3NwYXJzZSgpKSBzcGFyc2Vfc2hpZnQgPSAwOwotCSBpZiAoKHZyYW1fbWFwID0gbW1hcCgwLChzaXplX3QpIChWUkFNX1NJWkUgPDwgc3BhcnNlX3NoaWZ0KSwKLQkJCQkJCSBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCQkJCQkJIE1BUF9TSEFSRUQsCi0JCQkJCQkgbWVtX2ZkLCAoVlJBTV9TVEFSVCA8PCBzcGFyc2Vfc2hpZnQpCi0JCQkJCQkgfCBfYnVzX2Jhc2Vfc3BhcnNlKCkpKSA9PSAodm9pZCAqKSAtMSkKLSNlbmRpZgotICAgICAgewotCXBlcnJvcigibW1hcCBlcnJvciBpbiBtYXBfaGFyZHdhcmVfcmFtIik7Ci0JICAgIGNsb3NlKG1lbV9mZCk7Ci0JICAgIHJldHVybiAoMCk7Ci0JfQotICAgIHZyYW1fbWFwcGVkID0gMTsKLSAgICBjbG9zZShtZW1fZmQpOwotICAgIHJldHVybiAoMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi11bm1hcF92cmFtKHZvaWQpCi17Ci0gICAgaWYgKCF2cmFtX21hcHBlZCkgcmV0dXJuOwotCi0gICAgbXVubWFwKCh2b2lkKilWUkFNX1NUQVJULFZSQU1fU0laRSk7Ci0gICAgdnJhbV9tYXBwZWQgPSAwOwotfQotCi1zdGF0aWMgaW50Ci1jb3B5X3ZiaW9zKHZvaWQpCi17Ci0gICAgaW50IG1lbV9mZDsKLSAgICB1bnNpZ25lZCBjaGFyICp0bXA7Ci0gICAgaW50IHNpemU7Ci0KLSAgICBpZiAoKG1lbV9mZCA9IG9wZW4oTUVNX0ZJTEUsT19SRE9OTFkpKTwwKSB7Ci0JcGVycm9yKCJvcGVuaW5nIG1lbW9yeSIpOwotCXJldHVybiAoMCk7Ci0gICAgfQotCi0gICAgaWYgKGxzZWVrKG1lbV9mZCwob2ZmX3QpIFZfQklPUywgU0VFS19TRVQpICE9IChvZmZfdCkgVl9CSU9TKSB7Ci0JICBmcHJpbnRmKHN0ZGVyciwiQ2Fubm90IGxzZWVrXG4iKTsKLQkgIGdvdG8gRXJyb3I7Ci0gICAgICB9Ci0gICAgdG1wID0gKHVuc2lnbmVkIGNoYXIgKiltYWxsb2MoMyk7Ci0gICAgaWYgKHJlYWQobWVtX2ZkLCAoY2hhciAqKXRtcCwgKHNpemVfdCkgMykgIT0gKHNpemVfdCkgMykgewotCSAgICBmcHJpbnRmKHN0ZGVyciwiQ2Fubm90IHJlYWRcbiIpOwotCWdvdG8gRXJyb3I7Ci0gICAgfQotICAgIGlmIChsc2VlayhtZW1fZmQsKG9mZl90KSBWX0JJT1MsU0VFS19TRVQpICE9IChvZmZfdCkgVl9CSU9TKQotCWdvdG8gRXJyb3I7Ci0KLSAgICBpZiAoKnRtcCAhPSAweDU1IHx8ICoodG1wKzEpICE9IDB4QUEgKSB7Ci0jaWZkZWYgREVCVUcKLQlkcHJpbnQoKHVuc2lnbmVkIGxvbmcpdG1wLDB4MTAwKTsKLSNlbmRpZgotCWZwcmludGYoc3RkZXJyLCJObyBiaW9zIGZvdW5kIGF0OiAweCV4XG4iLFZfQklPUyk7Ci0JZ290byBFcnJvcjsKLSAgICB9Ci0gICAgc2l6ZSA9ICoodG1wKzIpICogNTEyOwotCi0gICAgaWYgKHJlYWQobWVtX2ZkLCAoY2hhciAqKVZfQklPUywgKHNpemVfdCkgc2l6ZSkgIT0gKHNpemVfdCkgc2l6ZSkgewotCSAgICBmcHJpbnRmKHN0ZGVyciwiQ2Fubm90IHJlYWRcbiIpOwotCWdvdG8gRXJyb3I7Ci0gICAgfQotICAgIGZyZWUodG1wKTsKLSAgICBjbG9zZShtZW1fZmQpOwotICAgIGlmICghY2hrc3VtKChDQVJEOClWX0JJT1MpKQotCXJldHVybiAoMCk7Ci0KLSAgICByZXR1cm4gKDEpOwotCi1FcnJvcjoKLSAgICBwZXJyb3IoInZfYmlvcyIpOwotICAgIGNsb3NlKG1lbV9mZCk7Ci0gICAgcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIGludAotY29weV9zeXNfYmlvcyh2b2lkKQotewotI2RlZmluZSBTWVNfQklPUyAweEYwMDAwCi0gICAgaW50IG1lbV9mZDsKLQotICAgIGlmICgobWVtX2ZkID0gb3BlbihNRU1fRklMRSxPX1JET05MWSkpPDApIHsKLQlwZXJyb3IoIm9wZW5pbmcgbWVtb3J5Iik7Ci0JcmV0dXJuICgwKTsKLSAgICB9Ci0KLSAgICBpZiAobHNlZWsobWVtX2ZkLChvZmZfdCkgU1lTX0JJT1MsU0VFS19TRVQpICE9IChvZmZfdCkgU1lTX0JJT1MpCi0JZ290byBFcnJvcjsKLSAgICBpZiAocmVhZChtZW1fZmQsIChjaGFyICopU1lTX0JJT1MsIChzaXplX3QpIDB4RkZGRikgIT0gKHNpemVfdCkgMHhGRkZGKQotCWdvdG8gRXJyb3I7Ci0KLSAgICBjbG9zZShtZW1fZmQpOwotICAgIHJldHVybiAoMSk7Ci0KLUVycm9yOgotICAgIHBlcnJvcigic3lzX2Jpb3MiKTsKLSAgICBjbG9zZShtZW1fZmQpOwotICAgIHJldHVybiAoMCk7Ci19Ci0KLXZvaWQKLWxvYWRDb2RlVG9NZW0odW5zaWduZWQgY2hhciAqcHRyLCBDQVJEOCBjb2RlW10pCi17Ci0gICAgaW50IGk7Ci0gICAgQ0FSRDggdmFsOwotCi0gICAgZm9yICggaT0wOztpKyspIHsKLQl2YWwgPSBjb2RlW2ldOwotCSpwdHIrKyA9IHZhbDsKLQlpZiAodmFsID09IDB4ZjQpIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLXZvaWQKLWRwcmludCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0gICAgaW50IGksajsKLSAgICBjaGFyICpjID0gKGNoYXIgKilzdGFydDsKLQotICAgIGZvciAoaiA9IDA7IGogPCAoc2l6ZSA+PiA0KTsgaisrKSB7Ci0gICAgY2hhciAqZCA9IGM7Ci0gICAgcHJpbnRmKCJcbjB4JWx4OiAgIiwodW5zaWduZWQgbG9uZyljKTsKLSAgICBmb3IgKGkgPSAwOyBpPDE2OyBpKyspCi0JcHJpbnRmKCIlMi4yeCAiLCh1bnNpZ25lZCBjaGFyKSAoKihjKyspKSk7Ci0gICAgYyA9IGQ7Ci0gICAgZm9yIChpID0gMDsgaTwxNjsgaSsrKSB7Ci0JcHJpbnRmKCIlYyIsKCgoKENBUkQ4KSgqYykpID4gMzIpICYmICgoKENBUkQ4KSgqYykpIDwgMTI4KSkgPwotCSAgICh1bnNpZ25lZCBjaGFyKSAoKihjKSk6ICcuJyk7Ci0JYysrOwotICAgIH0KLSAgICB9Ci0gICAgcHJpbnRmKCJcbiIpOwotfQotCi1zdGF0aWMgdm9pZAotc2F2ZV9iaW9zX3RvX2ZpbGUodm9pZCkKLXsKLSAgICBzdGF0aWMgaW50IG51bSA9IDA7Ci0gICAgaW50IHNpemUsIGNvdW50OwotICAgIGNoYXIgZmlsZV9uYW1lWzI1Nl07Ci0gICAgaW50IGZkOwotCi0gICAgc3ByaW50ZihmaWxlX25hbWUsImJpb3NfJWkuZmlsIixudW0pOwotICAgIGlmICgoZmQgPSAgb3BlbihmaWxlX25hbWUsT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywwMDY0NCkpID09IC0xKQotCXJldHVybjsKLSAgICBzaXplID0gKCoodW5zaWduZWQgY2hhciopKFZfQklPUyArIDIpKSAqIDUxMjsKLSNpZmRlZiBWODZCSU9TX0RFQlVHCi0gICAgZHByaW50KFZfQklPUywyMCk7Ci0jZW5kaWYKLSAgICBpZiAoKGNvdW50ID0gd3JpdGUoZmQsKHZvaWQgKikoVl9CSU9TKSxzaXplKSkgIT0gc2l6ZSkKLQlmcHJpbnRmKHN0ZGVyciwib25seSBzYXZlZCAlaSBvZiAlaSBieXRlc1xuIixzaXplLGNvdW50KTsKLSAgICBudW0rKzsKLX0KLQotc3RhdGljIHZvaWQKLXNpZ19oYW5kbGVyKGludCB1bnVzZWQpCi17Ci0gICAgZmZsdXNoKHN0ZG91dCk7Ci0gICAgZmZsdXNoKHN0ZGVycik7Ci0KLSAgICAvKiBwdXQgc3lzdGVtIGJhY2sgaW4gYSBzYXZlIHN0YXRlICovCi0gICAgdW5tYXBfdnJhbSgpOwotICAgIHBjaVZpZGVvUmVzdG9yZSgpOwotICAgIG91dGIoMHgxMDIsIHNhdmVfcG9zMTAyKTsKLSAgICBvdXRiKDB4NDZlOCwgc2F2ZV80NmU4KTsKLSAgICBvdXRiKDB4M0MzLCBzYXZlX3ZzZSk7Ci0gICAgb3V0YigweDNDMiwgc2F2ZV9tc3IpOwotCi0gICAgY2xvc2VfY29uc29sZShDb25zb2xlKTsKLSAgICBpb3BsKDApOwotICAgIHVubWFwKCk7Ci0KLSAgICBleGl0KDEpOwotfQotCi0vKgotICogRm9yIGluaXRpYWxpemF0aW9uIHdlIGp1c3QgcGFzcyBheCB0byB0aGUgQklPUy4KLSAqIFBDSSBCSU9TZXMgbmVlZCB0aGlzLiBBbGwgb3RoZXIgcmVnaXN0ZXIgYXJlIHNldCAwLgotICovCi1zdGF0aWMgdm9pZCBzZXR1cF9iaW9zX3JlZ3MoaTg2Ymlvc1JlZ3NQdHIgcmVncywgQ0FSRDMyIGF4KQotewotICAgIHJlZ3MtPmF4ID0gYXg7Ci0gICAgcmVncy0+YnggPSAwOwotICAgIHJlZ3MtPmN4ID0gMDsKLSAgICByZWdzLT5keCA9IDA7Ci0gICAgcmVncy0+ZXMgPSAwOwotICAgIHJlZ3MtPmRpID0gMDsKLX0KLQotLyoKLSAqIGhlcmUgd2UgYXJlIHJlYWxseSBwYXJhbm9pZCBhYm91dCBmYWtpbmcgYSAicmVhbCIKLSAqIEJJT1MuIE1vc3Qgb2YgdGhpcyBpbmZvcm1hdGlvbiB3YXMgcHVsbGVkIGZyb20KLSAqIGRvc2VtLgotICovCi1zdGF0aWMgdm9pZAotc2V0dXBfaW50X3ZlY3Qodm9pZCkKLXsKLSAgICBjb25zdCBDQVJEMTYgY3MgPSAweDAwMDA7Ci0gICAgY29uc3QgQ0FSRDE2IGlwID0gMHgwOwotICAgIGludCBpOwotCi0gICAgLyogbGV0IHRoZSBpbnQgdmVjdHMgcG9pbnQgdG8gdGhlIFNZU19CSU9TIHNlZyAqLwotICAgIGZvciAoaT0wOyBpPDB4ODA7IGkrKykgewotCSgoQ0FSRDE2KikwKVtpPDwxXSA9IGlwOwotCSgoQ0FSRDE2KikwKVsoaTw8MSkrMV0gPSBjczsKLSAgICB9Ci0gICAgLyogdmlkZW8gaW50ZXJydXB0cyBkZWZhdWx0IGxvY2F0aW9uICovCi0gICAgKChDQVJEMTYqKTApWygweDQyPDwxKSsxXSA9IDB4ZjAwMDsKLSAgICAoKENBUkQxNiopMClbMHg0Mjw8MV0gPSAweGYwNjU7Ci0gICAgKChDQVJEMTYqKTApWygweDEwPDwxKSsxXSA9IDB4ZjAwMDsKLSAgICAoKENBUkQxNiopMClbMHgxMDw8MV0gPSAweGYwNjU7Ci0gICAgLyogdmlkZW8gcGFyYW0gdGFibGUgZGVmYXVsdCBsb2NhdGlvbiAoaW50IDFkKSAqLwotICAgICgoQ0FSRDE2KikwKVsoMHgxZDw8MSkrMV0gPSAweGYwMDA7Ci0gICAgKChDQVJEMTYqKTApWzB4MWQ8PDFdID0gMHhmMEE0OwotICAgIC8qIGZvbnQgdGFibGVzIGRlZmF1bHQgbG9jYXRpb24gKGludCAxRikgKi8KLSAgICAoKENBUkQxNiopMClbKDB4MWY8PDEpKzFdID0gMHhmMDAwOwotICAgICgoQ0FSRDE2KikwKVsweDFmPDwxXSA9IDB4ZmE2ZTsKLQotICAgIC8qIGludCAxMSBkZWZhdWx0IGxvY2F0aW9uICovCi0gICAgKChDQVJEMTYqKTApWygweDExPDEpKzFdID0gMHhmMDAwOwotICAgICgoQ0FSRDE2KikwKVsweDExPDwxXSA9IDB4Zjg0ZDsKLSAgICAvKiBpbnQgMTIgZGVmYXVsdCBsb2NhdGlvbiAqLwotICAgICgoQ0FSRDE2KikwKVsoMHgxMjw8MSkrMV0gPSAweGYwMDA7Ci0gICAgKChDQVJEMTYqKTApWzB4MTI8PDFdID0gMHhmODQxOwotICAgIC8qIGludCAxNSBkZWZhdWx0IGxvY2F0aW9uICovCi0gICAgKChDQVJEMTYqKTApWygweDE1PDwxKSsxXSA9IDB4ZjAwMDsKLSAgICAoKENBUkQxNiopMClbMHgxNTw8MV0gPSAweGY4NTk7Ci0gICAgLyogaW50IDFBIGRlZmF1bHQgbG9jYXRpb24gKi8KLSAgICAoKENBUkQxNiopMClbKDB4MWE8PDEpKzFdID0gMHhmMDAwOwotICAgICgoQ0FSRDE2KikwKVsweDFhPDwxXSA9IDB4ZmY2ZTsKLSAgICAvKiBpbnQgMDUgZGVmYXVsdCBsb2NhdGlvbiAqLwotICAgICgoQ0FSRDE2KikwKVsoMHgwNTw8MSkrMV0gPSAweGYwMDA7Ci0gICAgKChDQVJEMTYqKTApWzB4MDU8PDFdID0gMHhmZjU0OwotICAgIC8qIGludCAwOCBkZWZhdWx0IGxvY2F0aW9uICovCi0gICAgKChDQVJEMTYqKTApWygweDg8PDEpKzFdID0gMHhmMDAwOwotICAgICgoQ0FSRDE2KikwKVsweDg8PDFdID0gMHhmZWE1OwotICAgIC8qIGludCAxMyBkZWZhdWx0IGxvY2F0aW9uIChmZGQpICovCi0gICAgKChDQVJEMTYqKTApWygweDEzPDwxKSsxXSA9IDB4ZjAwMDsKLSAgICAoKENBUkQxNiopMClbMHgxMzw8MV0gPSAweGVjNTk7Ci0gICAgLyogaW50IDBFIGRlZmF1bHQgbG9jYXRpb24gKi8KLSAgICAoKENBUkQxNiopMClbKDB4ZTw8MSkrMV0gPSAweGYwMDA7Ci0gICAgKChDQVJEMTYqKTApWzB4ZTw8MV0gPSAweGVmNTc7Ci0gICAgLyogaW50IDE3IGRlZmF1bHQgbG9jYXRpb24gKi8KLSAgICAoKENBUkQxNiopMClbKDB4MTc8PDEpKzFdID0gMHhmMDAwOwotICAgICgoQ0FSRDE2KikwKVsweDE3PDwxXSA9IDB4ZWZkMjsKLSAgICAvKiBmZGQgdGFibGUgZGVmYXVsdCBsb2NhdGlvbiAoaW50IDFlKSAqLwotICAgICgoQ0FSRDE2KikwKVsoMHgxZTw8MSkrMV0gPSAweGYwMDA7Ci0gICAgKChDQVJEMTYqKTApWzB4MWU8PDFdID0gMHhlZmM3OwotfQotCi1zdGF0aWMgaW50Ci1zZXR1cF9zeXN0ZW1fYmlvcyh2b2lkKQotewotICAgIGNoYXIgKmRhdGUgPSAiMDYvMDEvOTkiOwotICAgIGNoYXIgKmVpc2FfaWRlbnQgPSAiUENJL0lTQSI7Ci0KLSNpZiBNQVBfU1lTX0JJT1MKLSAgICBpZiAoIWNvcHlfc3lzX2Jpb3MoKSkgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIDE7Ci0jZW5kaWYKLS8qICAgIG1lbXNldCgodm9pZCAqKTB4RjAwMDAsMHhmNCwweGZmZjcpOyAqLwotCi0gICAgLyoKLSAgICAgKiB3ZSB0cmFwIHRoZSAiaW5kdXN0cnkgc3RhbmRhcmQgZW50cnkgcG9pbnRzIiB0byB0aGUgQklPUwotICAgICAqIGFuZCBhbGwgb3RoZXIgbG9jYXRpb25zIGJ5IGZpbGxpbmcgdGhlbSB3aXRoICJobHQiCi0gICAgICogVE9ETzogaW1wbGVtZW50IGhsdC1oYW5kbGVyIGZvciB0aGVzZQotICAgICAqLwotICAgIG1lbXNldCgodm9pZCAqKTB4RjAwMDAsMHhmNCwweDEwMDAwKTsKLQotICAgIC8qCi0gICAgICogVE9ETzogd2Ugc2hvdWxkIGNvcHkgdGhlIGZkZCB0YWJsZSAoMHhmZWM1OS0weGZlYzViKQotICAgICAqIHRoZSB2aWRlbyBwYXJhbWV0ZXIgdGFibGUgKDB4ZjBhYy0weGYwZmIpCi0gICAgICogYW5kIHRoZSBmb250IHRhYmxlcyAoMHhmYTZlLTB4ZmU2ZCkKLSAgICAgKiBmcm9tIHRoZSBvcmlnaW5hbCBiaW9zIGhlcmUKLSAgICAgKi8KLQotICAgIC8qIHNldCBiaW9zIGRhdGUgKi8KLSAgICBzdHJjcHkoKGNoYXIgKikweEZGRkY1LGRhdGUpOwotICAgIC8qIHNldCB1cCBlaXNhIGlkZW50IHN0cmluZyAqLwotICAgIHN0cmNweSgoY2hhciAqKTB4RkZGRDksZWlzYV9pZGVudCk7Ci0gICAgLyogd3JpdGUgc3lzdGVtIG1vZGVsIGlkIGZvciBJQk0tQVQgKi8KLSAgICAoKGNoYXIgKikwKVsweEZGRkZFXSA9IDB4ZmM7Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotY2hrc3VtKENBUkQ4ICpzdGFydCkKLXsKLSAgQ0FSRDE2IHNpemU7Ci0gIENBUkQ4IHZhbCA9IDA7Ci0gIGludCBpOwotCi0gIHNpemUgPSAqKHN0YXJ0KzIpICogNTEyOwotICBmb3IgKGkgPSAwOyBpPHNpemU7IGkrKykKLSAgICB2YWwgKz0gKihzdGFydCArIGkpOwotCi0gIGlmICghdmFsKQotICAgIHJldHVybiAxOwotCi0gICAgZnByaW50ZihzdGRlcnIsIkJJT1MgY2tzdW0gd3JvbmchXG4iKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL21ha2VmaWxlLmxpbnV4IGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9tYWtlZmlsZS5saW51eApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRmZTMwNi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL21ha2VmaWxlLmxpbnV4CisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotQ0ZMQUdTPS1nIC1JL3Vzci9pbmNsdWRlIC1JLi4vLi4vaW5jbHVkZS8gLU8wIC1XYWxsCi1DQz1nY2MKLQotLnkuYzoKLSAgICBiaXNvbiAtZCAtbyAkQCAkPAotLmwuYzoKLSAgICBmbGV4IC1vJEAgJDwgCi0KLVNSQ1MgPSBtYWluLmMgaW8uYyB4ODZlbXUuYyBpbnQuYyBwY2kuYwotT0JKUyA9IG1haW4ubyBpby5vIHg4NmVtdS5vIGludC5vIHBjaS5vCi0KLWFsbCA6IHZiaW9zLnZtODYgdjg2Ymlvcy52bTg2IGNiaW9zLnZtODYgY2Jpb3MueDg2ZW11IHZiaW9zLng4NmVtdSB2ODZiaW9zLng4NmVtdSAKLSNhbGwgOiAgY2Jpb3MueDg2ZW11IHZiaW9zLng4NmVtdSB2ODZiaW9zLng4NmVtdSAKLQotcGFyc2VyLmMgOiBwYXJzZXIueQotbGV4LmMgOiBsZXgubAotY2Jpb3MubyA6IGNiaW9zLmMgdjg2Ymlvcy5oIGRlYnVnLmgKLW1haW4ubyA6IG1haW4uYyB2ODZiaW9zLmggcGNpLmggZGVidWcuaAotaW8ubyA6IHY4NmJpb3MuaCBBc21NYWNyb3MuaCBkZWJ1Zy5oCi1tZW0ubyA6IG1lbS5jIGRlYnVnLmggdjg2Ymlvcy5oCi1pbnQubyA6IGludC5jIHY4NmJpb3MuaCBkZWJ1Zy5oCi1wY2kubyA6IHBjaS5jIHBjaS5oIGRlYnVnLmgKLWNvbnNvbGUubyA6IGNvbnNvbGUuYyB2ODZiaW9zLmggZGVidWcuaAotdjg2Lm8gOiB2ODYuYyBkZWJ1Zy5oCi1wYXJzZXIubyA6IHBhcnNlci5jCi1sZXgubyA6IGxleC5jCi12ODZiaW9zLm86IHY4NmJpb3MuYyB2ODZiaW9zLmggcGNpLmggZGVidWcuaAotbG9nZ2luZy5vOiBsb2dnaW5nLmMgdjg2Ymlvcy5oCi14ODZlbXUubyA6IHg4NmVtdS5jIHY4NmJpb3MuaCBkZWJ1Zy5oCi0gICAgJChDQykgLWMgLURYODZFTVUgJChDRkxBR1MpICQqLmMKLQotdmJpb3MueDg2ZW11IDogbWFpbi5vIHg4NmVtdS5vIGlvLm8gaW50Lm8gcGNpLm8gY29uc29sZS5vIG1lbS5vIGxvZ2dpbmcubwotICAgIGdjYyAtV2wsLWRlZnN5bSAtV2wscHJpbnRrPWxwcmludGYgLW8gdmJpb3MueDg2ZW11IG1haW4ubyBcCi0gICAgeDg2ZW11Lm8gaW8ubyBpbnQubyBwY2kubyBjb25zb2xlLm8gbWVtLm8gbG9nZ2luZy5vIFwKLSAgICAtTC4uL3g4NmVtdSAtbHg4NmVtdWQgLWxjIAotdmJpb3Mudm04NiA6IG1haW4ubyB2ODYubyBpby5vIGludC5vIHBjaS5vIGNvbnNvbGUubyBsb2dnaW5nLm8KLSAgICBnY2MgLW8gdmJpb3Mudm04NiBtYWluLm8gdjg2Lm8gaW8ubyBpbnQubyBwY2kubyBjb25zb2xlLm8gXAotICAgIGxvZ2dpbmcubyAtbGMgCi1jYmlvcy54ODZlbXUgOiBjYmlvcy5vIHg4NmVtdS5vIGlvLm8gaW50Lm8gcGNpLm8gY29uc29sZS5vIG1lbS5vIGxvZ2dpbmcubwotICAgIGdjYyAtV2wsLWRlZnN5bSAtV2wscHJpbnRrPWxwcmludGYgLW8gY2Jpb3MueDg2ZW11IGNiaW9zLm8gXAotICAgIHg4NmVtdS5vIGlvLm8gaW50Lm8gcGNpLm8gY29uc29sZS5vIG1lbS5vIGxvZ2dpbmcubyBcCi0gICAgLUwuLi94ODZlbXUgLWx4ODZlbXVkIC1sYyAKLWNiaW9zLnZtODYgOiBjYmlvcy5vIHY4Ni5vIGlvLm8gaW50Lm8gcGNpLm8gY29uc29sZS5vIGxvZ2dpbmcubwotICAgIGdjYyAtbyBjYmlvcy52bTg2IGNiaW9zLm8gdjg2Lm8gaW8ubyBpbnQubyBwY2kubyBjb25zb2xlLm8gXAotICAgIGxvZ2dpbmcubyAtbGMgCi12ODZiaW9zLnZtODY6IGNvbW1hbmQubyBwYXJzZXIubyBsZXgubyB2ODZiaW9zLm8gdjg2Lm8gaW8ubyBpbnQubyBwY2kubyBjb25zb2xlLm8gbG9nZ2luZy5vCi0gICAgIGdjYyAtbyB2ODZiaW9zLnZtODYgY29tbWFuZC5vIHBhcnNlci5vIGxleC5vIHY4NmJpb3MubyB2ODYubyBpby5vIFwKLSAgICAgaW50Lm8gcGNpLm8gY29uc29sZS5vIGxvZ2dpbmcubyAtTC91c3IvbGliL2N1cnNlcyAtbGZsIFwKLSAgICAgLWxyZWFkbGluZSAtbGMgLWxuY3Vyc2VzIC91c3IvbGliL2xpYmMuYQotdjg2Ymlvcy54ODZlbXU6IGNvbW1hbmQubyBwYXJzZXIubyBsZXgubyB2ODZiaW9zLm8geDg2ZW11Lm8gaW8ubyBpbnQubyBwY2kubyBjb25zb2xlLm8gbG9nZ2luZy5vCi0gICAgZ2NjIC1XbCwtZGVmc3ltIC1XbCxwcmludGs9bHByaW50ZiAtbyB2ODZiaW9zLng4NmVtdSBcCi0gICAgY29tbWFuZC5vIHBhcnNlci5vIGxleC5vIHY4NmJpb3MubyB4ODZlbXUubyBpby5vIFwKLSAgICBpbnQubyBwY2kubyBjb25zb2xlLm8gbG9nZ2luZy5vIC1ML3Vzci9saWIvY3Vyc2VzIC1sZmwgXAotICAgIC1scmVhZGxpbmUgLWxjIC1sbmN1cnNlcyAgL3Vzci9saWIvbGliYy5hIC1MLi4veDg2ZW11IC1seDg2ZW11ZAotCi1jbGVhbjoKLSAgICBybSAtZiAqLm8gdmJpb3MueDg2ZW11IHZiaW9zLnZtODYgY2Jpb3MueDg2ZW11IGNiaW9zLnZtODYgcGFyc2VyLmMgXAotICAgIGxleC5jIHBhcnNlci5oIHY4NmJpb3MueDg2ZW11IHY4NmJpb3Mudm04NgotCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL21lbS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9tZW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRjMWFlZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL21lbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMTk5OSBFZ2JlcnQgRWljaAotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKLSAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwotICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQgaW4KLSAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAotICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucwotICogYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQKLSAqICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0gKgotICogVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0gKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0gKiBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCi0gKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCi0gKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0gKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJ2ODZiaW9zLmgiCi0jaW5jbHVkZSAieDg2ZW11LmgiCi0KLSNpZmRlZiBfX2FscGhhX18KLQotdm9pZCogdnJhbV9tYXAgPSAwOwotaW50IHNwYXJzZV9zaGlmdCA9IDU7Ci0KLSNkZWZpbmUgbWVtX2JhcnJpZXIoKSAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oIm1iIiAgOiA6IDogIm1lbW9yeSIpCi0KLSNkZWZpbmUgdnVpcCAgICB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKgotCi1DQVJEOAotbWVtX3JiKENBUkQzMiBhZGRyKQotewotICB1bnNpZ25lZCBsb25nIHJlc3VsdCwgc2hpZnQ7Ci0jaWYgMQotICBpZiAoYWRkciA+PSAweEEwMDAwICYmIGFkZHIgPD0gMHhCRkZGRikgewotICAgIGFkZHIgLT0gMHhBMDAwMDsKLSAgICBzaGlmdCA9IChhZGRyICYgMHgzKSAqIDg7Ci0gICAgcmVzdWx0ID0gKih2dWlwKSAoKHVuc2lnbmVkIGxvbmcpdnJhbV9tYXAgKyAoYWRkciA8PCBzcGFyc2Vfc2hpZnQpKTsKLSAgICByZXN1bHQgPj49IHNoaWZ0OwotICAgIHJldHVybiAweGZmVUwgJiByZXN1bHQ7Ci0gIH0gZWxzZQotI2VuZGlmCi0gICAgcmV0dXJuIHJkYihhZGRyKTsKLX0KLQotQ0FSRDE2Ci1tZW1fcncoQ0FSRDMyIGFkZHIpCi17Ci0gIHVuc2lnbmVkIGxvbmcgcmVzdWx0LCBzaGlmdDsKLSNpZiAxCi0gIGlmIChhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEJGRkZGKSB7Ci0gICAgYWRkciAtPSAweEEwMDAwOwotICAgIHNoaWZ0ID0gKGFkZHIgJiAweDIpICogODsKLSAgICByZXN1bHQgPSAqKHZ1aXApKCh1bnNpZ25lZCBsb25nKXZyYW1fbWFwKyhhZGRyPDxzcGFyc2Vfc2hpZnQpCi0JICAgICArKDE8PChzcGFyc2Vfc2hpZnQtMikpKTsKLSAgICByZXN1bHQgPj49IHNoaWZ0OwotICAgIHJldHVybiAweGZmZmZVTCAmIHJlc3VsdDsKLSAgfSBlbHNlCi0jZW5kaWYKLSAgICByZXR1cm4gcmR3KGFkZHIpOwotfQotCi1DQVJEMzIKLW1lbV9ybChDQVJEMzIgYWRkcikKLXsKLSAgdW5zaWduZWQgbG9uZyByZXN1bHQ7Ci0jaWYgMQotICBpZiAoYWRkciA+PSAweEEwMDAwICYmIGFkZHIgPD0gMHhCRkZGRikgewotICAgIGFkZHIgLT0gMHhBMDAwMDsKLSAgICByZXN1bHQgPSAqKHZ1aXApKCh1bnNpZ25lZCBsb25nKXZyYW1fbWFwKyhhZGRyPDxzcGFyc2Vfc2hpZnQpKygzPDwoc3BhcnNlX3NoaWZ0LTIpKSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSBlbHNlCi0jZW5kaWYKLSAgICByZXR1cm4gcmRsKGFkZHIpOwotfQotCi12b2lkCi1tZW1fd2IoQ0FSRDMyIGFkZHIsIENBUkQ4IHZhbCkKLXsKLSAgICB1bnNpZ25lZCBpbnQgYiA9IHZhbCAmIDB4ZmZVOwotI2lmIDEKLSAgaWYgKGFkZHIgPj0gMHhBMDAwMCAmJiBhZGRyIDw9IDB4QkZGRkYpIHsKLSAgICBhZGRyIC09IDB4QTAwMDA7Ci0gICAgKih2dWlwKSAoKHVuc2lnbmVkIGxvbmcpdnJhbV9tYXAgKyAoYWRkciA8PCBzcGFyc2Vfc2hpZnQpKSA9IGIgKiAweDAxMDEwMTAxOwotICAgIG1lbV9iYXJyaWVyKCk7Ci0gIH0gZWxzZQotI2VuZGlmCi0gICAgd3JiKGFkZHIsdmFsKTsKLX0KLQotdm9pZAotbWVtX3d3KENBUkQzMiBhZGRyLCBDQVJEMTYgdmFsKQotewotICB1bnNpZ25lZCBpbnQgdyA9IHZhbCAmIDB4ZmZmZlU7Ci0jaWYgMQotICBpZiAoYWRkciA+PSAweEEwMDAwICYmIGFkZHIgPD0gMHhCRkZGRikgewotICAgIGFkZHIgLT0gMHhBMDAwMDsKLSAgICAqKHZ1aXApKCh1bnNpZ25lZCBsb25nKXZyYW1fbWFwKyhhZGRyPDxzcGFyc2Vfc2hpZnQpCi0JKygxPDwoc3BhcnNlX3NoaWZ0LTIpKSkgPSB3ICogMHgwMDAxMDAwMTsKLSAgICBtZW1fYmFycmllcigpOwotICB9IGVsc2UKLSNlbmRpZgotICAgIHdydyhhZGRyLHZhbCk7Ci19Ci0KLXZvaWQKLW1lbV93bChDQVJEMzIgYWRkciwgQ0FSRDMyIHZhbCkKLXsKLSNpZiAxCi0gIGlmIChhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEJGRkZGKSB7Ci0gICAgYWRkciAtPSAweEEwMDAwOwotICAgICoodnVpcCkoKHVuc2lnbmVkIGxvbmcpdnJhbV9tYXArKGFkZHI8PHNwYXJzZV9zaGlmdCkKLQkrKDM8PChzcGFyc2Vfc2hpZnQtMikpKSA9IHZhbDsKLSAgICBtZW1fYmFycmllcigpOwotICB9IGVsc2UKLSNlbmRpZgotICAgIHdybChhZGRyLHZhbCk7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvcGFyc2VyLnkgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3BhcnNlci55CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWM0MDIzLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvcGFyc2VyLnkKKysrIC9kZXYvbnVsbApAQCAtMSw0OTggKzAsMCBAQAotJXsKLSNpbmNsdWRlIDxtYWxsb2MuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJ2ODZiaW9zLmgiCi0jaW5jbHVkZSAicGNpLmgiCi0gICAgCi0jZGVmaW5lIFlZU1RZUEUgdW5zaWduZWQgbG9uZwotICAgIAotI2RlZmluZSBNQVhfVkFSIDB4MjAKLQotICAgIENBUkQzMiB2YXJbTUFYX1ZBUl07Ci0gICAgQ0FSRDMyIHZhcl9tZW07Ci0KLQotaTg2Ymlvc1JlZ3MgcmVncyA9IHsgMDAgfTsKLQotZW51bSBtZW1fdHlwZSB7IEJZVEUsIFdPUkQsIExPTkcsIFNUUklORyB9OwotdW5pb24gbWVtX3ZhbCB7Ci0gICBDQVJEMzIgaW50ZWdlcjsKLSAgIGNoYXIgKnB0cjsKLX0gcmVjOwotCi1zdHJ1Y3QgbWVtIHsKLSAgICBlbnVtIG1lbV90eXBlIHR5cGU7Ci0gICAgICAgIHVuaW9uIG1lbV92YWwgdmFsOwotICAgIHN0cnVjdCBtZW0gKm5leHQ7Ci19OyAKLQotIAotc3RydWN0IGRldmljZSBEZXZpY2UgPSB7RkFMU0UsTk9ORSx7MH19OwotCi1leHRlcm4gdm9pZCB5eWVycm9yKGNoYXIgKnMpOwotZXh0ZXJuIGludCB5eWxleCggdm9pZCAgKTsKLSAKLXN0YXRpYyB2b2lkIGJvb3Qodm9pZCk7Ci1zdGF0aWMgdm9pZCBkdW1wX21lbShDQVJEMzIgYWRkciwgaW50IGxlbik7Ci1zdGF0aWMgdm9pZCBleGVjX2ludChpbnQgbnVtKTsKLXN0YXRpYyB2b2lkICphZGRfdG9fbGlzdChlbnVtIG1lbV90eXBlIHR5cGUsIHVuaW9uIG1lbV92YWwgKnJlYywgdm9pZCAqbmV4dCk7Ci1zdGF0aWMgdm9pZCBkb19saXN0KHN0cnVjdCBtZW0gKmxpc3QsIG1lbVR5cGUgYWRkcik7Ci1zdGF0aWMgY2hhciAqIG5vcm1hbGl6ZV9zdHJpbmcoY2hhciAqcHRyKTsKLSV9Ci0KLSV0b2tlbiBUT0tfTlVNCi0ldG9rZW4gVE9LX1JFR19BWAotJXRva2VuIFRPS19SRUdfQlgKLSV0b2tlbiBUT0tfUkVHX0NYCi0ldG9rZW4gVE9LX1JFR19EWAotJXRva2VuIFRPS19SRUdfREkKLSV0b2tlbiBUT0tfUkVHX1NJCi0ldG9rZW4gVE9LX1NFR19EUwotJXRva2VuIFRPS19TRUdfRVMKLSV0b2tlbiBUT0tfU0VQCi0ldG9rZW4gVE9LX1ZBUgotJXRva2VuIFRPS19WQVJfTUVNCi0ldG9rZW4gVE9LX0NPTU1BTkRfQk9PVAotJXRva2VuIFRPS19DT01NQU5EX0VYRUMKLSV0b2tlbiBUT0tfU0VMRUNUCi0ldG9rZW4gVE9LX1NUUklORwotJXRva2VuIFRPS19NT0RJRklFUl9CWVRFCi0ldG9rZW4gVE9LX01PRElGSUVSX1dPUkQKLSV0b2tlbiBUT0tfTU9ESUZJRVJfTE9ORwotJXRva2VuIFRPS19NT0RJRklFUl9NRU1TRVQKLSV0b2tlbiBUT0tfQ09NTUFORF9NRU1TRVQKLSV0b2tlbiBUT0tfQ09NTUFORF9NRU1EVU1QCi0ldG9rZW4gVE9LX0NPTU1BTkRfUVVJVAotJXRva2VuIFRPS19FUlJPUgotJXRva2VuIFRPS19FTkQKLSV0b2tlbiBUT0tfSVNBCi0ldG9rZW4gVE9LX1BDSQotJXRva2VuIFRPS19CWVRFCi0ldG9rZW4gVE9LX1dPUkQKLSV0b2tlbiBUT0tfTE9ORwotJXRva2VuIFRPS19QUklOVF9QT1JUCi0ldG9rZW4gVE9LX0lPU1RBVAotJXRva2VuIFRPS19QUklOVF9JUlEKLSV0b2tlbiBUT0tfUFBDSQotJXRva2VuIFRPS19QSVAKLSV0b2tlbiBUT0tfVFJBQ0UKLSV0b2tlbiBUT0tfT04KLSV0b2tlbiBUT0tfT0ZGCi0ldG9rZW4gVE9LX1ZFUkJPU0UKLSV0b2tlbiBUT0tfTE9HCi0ldG9rZW4gVE9LX0xPR09GRgotJXRva2VuIFRPS19DTFNUQVQKLSV0b2tlbiBUT0tfU1RET1VUCi0ldG9rZW4gVE9LX0hMVAotJXRva2VuIFRPS19ERUwKLSV0b2tlbiBUT0tfSU9QRVJNCi0ldG9rZW4gVE9LX0RVTVBfUENJCi0ldG9rZW4gVE9LX0JPT1RfQklPUwotJSUKLWlucHV0OiAgICAgICAgfCBpbnB1dCBsaW5lICAKLWxpbmU6ICAgICAgICAgIGVuZCB8ICBjb21fcmVnIHwgY29tX3ZhciB8IGNvbV9zZWxlY3QKLSAgICAgICAgICAgICAgfCBjb21fYm9vdCB8IGNvbV9tZW1zZXQgfCBjb21fbWVtZHVtcCAgfCBjb21fcXVpdCAKLSAgICAgICAgICAgICAgfCBjb21fZXhlYyB8IGhscCB8IGNvbmZpZyB8IHZlcmJvc2UgfCBsb2dnaW5nIHwgcHJpbnQgfCBjbHN0YXQgCi0gICAgICAgICAgICAgIHwgY29tX2hsdCB8IGlvcGVybSB8IGxpc3RfcGNpIHwgYm9vdF9iaW9zIAotICAgICAgICAgICAgICB8IGVycm9yIGVuZCAgeyBwcmludGYoInVua25vd24gY29tbWFuZFxuIik7IH0KLTsKLWVuZDogICAgICAgICAgIFRPS19FTkQKLTsKLWNvbV9yZWc6ICAgICAgICByZWdfb2ZmIHZhbCBlbmQgeyAqKENBUkQxNiopJDEgPSAkMiAmIDB4ZmZmZjsgfQotICAgICAgICAgICAgICB8IHJlZ19zZWcgVE9LX1NFUCByZWdfb2ZmIHZhbCBlbmQgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooQ0FSRDE2KikkMSA9ICgkNCAmIDB4ZjAwMDApID4+IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKENBUkQxNiopJDMgPSAoJDQgJiAweDBmZmZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIHwgIHJlZ19vZmYgJz8nIGVuZCB7IHByaW50ZigiMHgleFxuIiwqKENBUkQxNiopJDEpO30KLSAgICAgICAgICAgICAgfCAgcmVnX3NlZyBUT0tfU0VQIHJlZ19vZmYgJz8nIGVuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCIweCV4OjB4JXhcbiIsKihDQVJEMTYqKSQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAqKENBUkQxNiopJDMpOyB9Ci07Ci1yZWdpc3Rlcl9yZWFkOiAgcmVnX3NlZyBUT0tfU0VQIHJlZ19vZmYgeyAkJCA9ICgoKCooQ0FSRDE2KikkMSkgPDwgNCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgoKihDQVJEMTYqKSQzKSAmIDB4ZmZmZikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfCByZWdfb2ZmICAgICAgICAgIHsgJCQgPSAoKCooQ0FSRDE2KikkMSkgJiAweGZmZmYpOyB9Ci07Ci1yZWdfb2ZmOiAgICAgICAgVE9LX1JFR19BWCAgeyAkJCA9ICh1bnNpZ25lZCBsb25nKSYocmVncy5heCk7IH0KLSAgICAgICAgICAgICAgfCBUT0tfUkVHX0JYICB7ICQkID0gKHVuc2lnbmVkIGxvbmcpJihyZWdzLmJ4KTsgfQotICAgICAgICAgICAgICB8IFRPS19SRUdfQ1ggIHsgJCQgPSAodW5zaWduZWQgbG9uZykmKHJlZ3MuY3gpOyB9Ci0gICAgICAgICAgICAgIHwgVE9LX1JFR19EWCAgeyAkJCA9ICh1bnNpZ25lZCBsb25nKSYocmVncy5keCk7IH0KLSAgICAgICAgICAgICAgfCBUT0tfUkVHX0RJICB7ICQkID0gKHVuc2lnbmVkIGxvbmcpJihyZWdzLmRpKTsgfQotICAgICAgICAgICAgICB8IFRPS19SRUdfU0kgIHsgJCQgPSAodW5zaWduZWQgbG9uZykmKHJlZ3Muc2kpOyB9Ci07Ci1yZWdfc2VnOiAgICAgICAgVE9LX1NFR19EUyAgeyAkJCA9ICh1bnNpZ25lZCBsb25nKSYocmVncy5kcyk7IH0KLSAgICAgICAgICAgICAgfCBUT0tfU0VHX0VTICB7ICQkID0gKHVuc2lnbmVkIGxvbmcpJihyZWdzLmVzKTsgfQotOwotY29tX3ZhcjogICAgICAgIFRPS19WQVJfTUVNICc/JyBlbmQgeyBwcmludGYoInZhciBtZW06IDB4JXhcbiIsdmFyX21lbSk7IH0KLSAgICAgICAgICB8IFRPS19WQVIgJz8nIGVuZCB7IGlmICgkMSA8IE1BWF9WQVIpCi0gICAgICAgICAgcHJpbnRmKCJ2YXJbJWldOiAweCV4XG4iLChpbnQpJDEsdmFyWyQxXSk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHByaW50ZigidmFyIGluZGV4ICVpIG91dCBvZiByYW5nZVxuIiwoaW50KSQxKTsgfQotICAgICAgICAgIHwgVE9LX1ZBUl9NRU0gdmFsIGVuZCB7IHZhcl9tZW0gPSAkMjsgfSAgICAKLSAgICAgICAgICAgICAgfCBUT0tfVkFSIHZhbCBlbmQgICAgeyBpZiAoJDEgPD0gTUFYX1ZBUikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhclskMV0gPSAkMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJ2YXIgaW5kZXggJWkgb3V0IG9mIHJhbmdlXG4iLChpbnQpJDEpOyB9Ci0gICAgICAgICAgICAgIHwgVE9LX1ZBUiBlcnJvciAgZW5kIHsgcHJpbnRmKCIkaSB2YWxcbiIpOyB9Ci0gICAgICAgICAgICAgIHwgVE9LX1ZBUl9NRU0gZXJyb3IgIGVuZCB7IHByaW50ZigiJGkgdmFsXG4iKTsgfQotOwotY29tX2Jvb3Q6ICAgICAgIFRPS19DT01NQU5EX0JPT1QgIGVuZCB7IGJvb3QoKTsgfQotICAgICAgICAgICAgICAgIFRPS19DT01NQU5EX0JPT1QgZXJyb3IgZW5kIHsgYm9vdCgpOyB9Ci07Ci1jb21fc2VsZWN0OiAgICAgVE9LX1NFTEVDVCBUT0tfSVNBIGVuZCB7IERldmljZS5ib290ZWQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlLnR5cGUgPSBJU0E7Ci0gICAgICAgICAgICAgICAgICAgICBDdXJyZW50UGNpID0gTlVMTDsgfSAgIAotICAgICAgICAgICAgICB8IFRPS19TRUxFQ1QgVE9LX1BDSSB2YWwgVE9LX1NFUCB2YWwgVE9LX1NFUCB2YWwgZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IERldmljZS5ib290ZWQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICBEZXZpY2UudHlwZSA9IFBDSTsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZS5sb2MucGNpLmJ1cyA9ICQzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2UubG9jLnBjaS5kZXYgPSAkNTsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZS5sb2MucGNpLmZ1bmMgPSAkNzsgfQotICAgICAgICAgICAgICB8IFRPS19TRUxFQ1QgJz8nIGVuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHN3aXRjaCAoRGV2aWNlLnR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElTQToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiaXNhXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUENJOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoInBjaTogJXg6JXg6JXhcbiIsRGV2aWNlLmxvYy5wY2kuYnVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZS5sb2MucGNpLmRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlLmxvYy5wY2kuZnVuYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJubyBkZXZpY2Ugc2VsZWN0ZWRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIHwgVE9LX1NFTEVDVCBlcnJvciBlbmQgeyBwcmludGYoInNlbGVjdCA/IHwgaXNhICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInwgcGNpOmJ1czpkZXY6ZnVuY1xuIik7IH0KLTsKLWNvbV9xdWl0OiAgICAgICBUT0tfQ09NTUFORF9RVUlUIGVuZCB7IHJldHVybiAwOyB9Ci0gICAgICAgICAgICAgIHwgVE9LX0NPTU1BTkRfUVVJVCBlcnJvciBlbmQgeyBsb2dvZmYoKTsgcmV0dXJuIDA7IH0KLTsKLWNvbV9leGVjOiAgICAgICBUT0tfQ09NTUFORF9FWEVDIGVuZCB7IGV4ZWNfaW50KDB4MTApOyB9Ci0gICAgICAgICAgfCBUT0tfQ09NTUFORF9FWEVDIHZhbCBlbmQgeyBleGVjX2ludCgkMik7IH0KLSAgICAgICAgICB8IFRPS19DT01NQU5EX0VYRUMgZXJyb3IgZW5kIHsgZXhlY19pbnQoMHgxMCk7IH0KLTsKLWNvbV9tZW1kdW1wOiAgICBUT0tfQ09NTUFORF9NRU1EVU1QIHZhbCB2YWwgZW5kIHsgZHVtcF9tZW0oJDIsJDMpOyB9Ci0gICAgICAgICAgICAgIHwgVE9LX0NPTU1BTkRfTUVNRFVNUCAgZXJyb3IgIGVuZCB7IHByaW50ZigibWVtZHVtcCBzdGFydCBsZW5cbiIpOyB9Ci0KLSAgICAKLTsKLWNvbV9tZW1zZXQ6ICAgICBUT0tfQ09NTUFORF9NRU1TRVQgdmFsIGxpc3QgZW5kIHsgZG9fbGlzdCgoc3RydWN0IG1lbSopJDMsJDIpO30KLSAgICAgICAgICAgICAgfCBUT0tfQ09NTUFORF9NRU1TRVQgZXJyb3IgZW5kIHsgcHJpbnRmKCJzZXRtZW0gYWRkciBbYnl0ZSB2YWxdICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbd29yZCB2YWxdIFtsb25nIHZhbF0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltcInN0cmluZ1wiXVxuIik7IH0KLTsKLWxpc3Q6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAkJCA9IDA7IH0gCi0gICAgICAgICAgICAgIHwgVE9LX0JZVEUgdmFsIGxpc3QgeyByZWMuaW50ZWdlciA9ICQyOwotICAgICAgICAgICQkID0gKHVuc2lnbmVkIGxvbmcpYWRkX3RvX2xpc3QoQllURSwmcmVjLCh2b2lkKikkMyk7IH0KLSAgICAgICAgICAgICAgfCBUT0tfV09SRCB2YWwgbGlzdCB7IHJlYy5pbnRlZ2VyID0gJDI7IAotICAgICAgICAgICQkID0gKHVuc2lnbmVkIGxvbmcpIGFkZF90b19saXN0KFdPUkQsJnJlYywodm9pZCopJDMpOyB9Ci0gICAgICAgICAgICAgIHwgVE9LX0xPTkcgdmFsIGxpc3QgeyByZWMuaW50ZWdlciA9ICQyOyAKLSAgICAgICAgICAkJCA9ICh1bnNpZ25lZCBsb25nKSBhZGRfdG9fbGlzdChMT05HLCZyZWMsKHZvaWQqKSQzKTsgfQotICAgICAgICAgICAgICB8IFRPS19TVFJJTkcgbGlzdCB7IHJlYy5wdHIgPSAodm9pZCopJDE7IAotICAgICAgICAgICQkID0gKHVuc2lnbmVkIGxvbmcpIGFkZF90b19saXN0KFNUUklORywmcmVjLCh2b2lkKikkMik7IH0KLTsKLXZhbDogICAgICAgICAgICBUT0tfVkFSICB7ICBpZiAoJDEgPiBNQVhfVkFSKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigidmFyaWFibGUgaW5kZXggb3V0IG9mIHJhbmdlXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCQ9MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICQkID0gdmFyWyQxXTsgfSAKLSAgICAgICAgICAgICAgfCBUT0tfTlVNICB7ICAkJCA9ICQxOyB9Ci0gICAgICAgICAgICAgIHwgcmVnaXN0ZXJfcmVhZAotOyAKLWJvb2w6ICAgICAgICAgICBUT0tfT04gICB7ICAkJCA9IDE7IH0KLSAgICAgICAgICAgICAgfCBUT0tfT0ZGICB7ICAkJCA9IDA7IH0KLTsKLWNvbmZpZzogICAgICAgICBUT0tfUFJJTlRfUE9SVCBib29sIGVuZCB7IENvbmZpZy5QcmludFBvcnQgPSAkMjsgfSAKLSAgICAgICAgICAgICAgfCBUT0tfUFJJTlRfUE9SVCAnPycgZW5kICB7IHByaW50ZigicHJpbnQgcG9ydCAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnLlByaW50UG9ydD8ib24iOiJvZmYiKTsgfQotICAgICAgICAgIHwgVE9LX1BSSU5UX1BPUlQgZXJyb3IgZW5kIHsgcHJpbnRmKCJwcG9ydCBvbiB8IG9mZiB8ID9cbiIpIH0gCi0gICAgICAgICAgICAgIHwgVE9LX1BSSU5UX0lSUSBib29sIGVuZCAgeyBDb25maWcuUHJpbnRJcnEgPSAkMjsgfSAKLSAgICAgICAgICAgICAgfCBUT0tfUFJJTlRfSVJRICc/JyBlbmQgICB7IHByaW50ZigicHJpbnQgaXJxICVzXG4iLCAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWcuUHJpbnRJcnE/Im9uIjoib2ZmIik7IH0gCi0gICAgICAgICAgfCBUT0tfUFJJTlRfSVJRIGVycm9yIGVuZCB7IHByaW50ZigicGlycSBvbiB8IG9mZiB8ID9cbiIpIH0gCi0gICAgICAgICAgICAgIHwgVE9LX1BQQ0kgYm9vbCBlbmQgICAgICAgeyBDb25maWcuUHJpbnRQY2kgPSAkMjsgfSAKLSAgICAgICAgICAgICAgfCBUT0tfUFBDSSAnPycgZW5kICAgICAgICB7IHByaW50ZigicHJpbnQgUENJICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnLlByaW50UGNpPyJvbiI6Im9mZiIpOyB9IAotICAgICAgICAgIHwgVE9LX1BQQ0kgZXJyb3IgZW5kICAgICAgeyBwcmludGYoInBwY2kgb24gfCBvZmYgfCA/XG4iKSB9IAotICAgICAgICAgICAgICB8IFRPS19QSVAgYm9vbCBlbmQgICAgICAgIHsgQ29uZmlnLlByaW50SXAgPSAkMjsgfSAKLSAgICAgICAgICAgICAgfCBUT0tfUElQICc/JyBlbmQgICAgICAgICB7IHByaW50ZigicHJpbnRpcCAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnLlByaW50SXA/Im9uIjoib2ZmIik7IH0gCi0gICAgICAgICAgfCBUT0tfUElQIGVycm9yIGVuZCAgICAgICB7IHByaW50ZigicGlwIG9uIHwgb2ZmIHwgP1xuIikgfSAKLSAgICAgICAgICAgICAgfCBUT0tfSU9TVEFUIGJvb2wgZW5kICAgICB7IENvbmZpZy5Jb1N0YXRpc3RpY3MgPSAkMjsgfSAKLSAgICAgICAgICAgICAgfCBUT0tfSU9TVEFUICc/JyBlbmQgICAgICB7IHByaW50ZigiaW8gc3RhdGlzdGljcyAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnLklvU3RhdGlzdGljcz8ib24iOiJvZmYiKTsgfSAKLSAgICAgICAgICB8IFRPS19JT1NUQVQgZXJyb3IgZW5kICAgIHsgcHJpbnRmKCJpb3N0YXQgb24gfCBvZmYgfCA/XG4iKSB9IAotICAgICAgICAgICAgICB8IFRPS19UUkFDRSBib29sIGVuZCAgICAgIHsgQ29uZmlnLlRyYWNlID0gJDI7IH0gCi0gICAgICAgICAgICAgIHwgVE9LX1RSQUNFICc/JyBlbmQgICAgICAgeyBwcmludGYoInRyYWNlICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWcuVHJhY2UgPyJvbiI6Im9mZiIpOyB9IAotICAgICAgICAgIHwgVE9LX1RSQUNFIGVycm9yIGVuZCB7IHByaW50ZigidHJhY2Ugb24gfCBvZmYgfCA/XG4iKSB9IAotOwotdmVyYm9zZTogICAgICAgIFRPS19WRVJCT1NFIHZhbCBlbmQgICAgIHsgQ29uZmlnLlZlcmJvc2UgPSAkMjsgfQotICAgICAgICAgIHwgVE9LX1ZFUkJPU0UgJz8nIGVuZCAgICAgeyBwcmludGYoInZlcmJvc2U6ICVpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZy5WZXJib3NlKTsgfQotICAgICAgICAgIHwgVE9LX1ZFUkJPU0UgZXJyb3IgZW5kICAgeyBwcmludGYoInZlcmJvc2UgdmFsIHwgP1xuIik7IH0KLTsKLWxvZ2dpbmc6ICAgICAgICBUT0tfTE9HIFRPS19TVFJJTkcgZW5kICB7IGxvZ29uKG5vcm1hbGl6ZV9zdHJpbmcoKGNoYXIqKSQyKSk7IH0KLSAgICAgICAgICB8IFRPS19MT0cgJz8nIGVuZCAgICAgICAgIHsgaWYgKGxvZ2dpbmcpIHByaW50ZigibG9nZmlsZTogJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgZWxzZSBwcmludGYoIm5vIGxvZ2dpbmdcbj8iKTsgfQotICAgICAgICAgIHwgVE9LX0xPRyBUT0tfT0ZGIGVuZCAgICAgICAgICB7IGxvZ29mZigpOyB9Ci0gICAgICAgICAgfCBUT0tfTE9HIGVycm9yIGVuZCAgICAgICB7IHByaW50ZigibG9nIFwiPGZpbGVuYW1lPlwiIHwgPyB8IgotICAgICAgICAgICAgICAgICAgICAgICAgICIgb2ZmXG4iKTsgfQotOwotY2xzdGF0OiAgICAgICAgIFRPS19DTFNUQVQgZW5kICAgICAgICAgIHsgY2xlYXJfc3RhdCgpOyB9Ci0gICAgICAgICAgfCBUT0tfQ0xTVEFUIGVycm9yIGVuZCAgICB7IHByaW50ZigiY2xzdGF0XG4iKTsgfSAKLTsKLXByaW50OiAgICAgICAgICBUT0tfU1RET1VUIGJvb2wgZW5kICAgICB7IG5vc3Rkb3V0ID0gISQyOyB9Ci0gICAgICAgICAgICAgICAgICB8IFRPS19TVERPVVQgJz8nIGVuZCAgICAgIHsgcHJpbnRmKCJwcmludCAlc1xuIixub3N0ZG91dCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAibm8iOiJ5ZXMiKTsgfQotICAgICAgICAgIHwgVE9LX1NURE9VVCBlcnJvciBlbmQgICAgeyBwcmludGYoInByaW50IG9uIHwgb2ZmXG4iKTsgfQotOwotY29tX2hsdDogICAgICAgICAgICBUT0tfSExUIHZhbCBlbmQgICAgICAgICB7IGFkZF9obHQoJDIpOyB9ICAgIAotICAgICAgICAgIHwgVE9LX0hMVCBUT0tfREVMIHZhbCBlbmQgeyBkZWxfaGx0KCQzKTsgfQotICAgICAgICAgIHwgVE9LX0hMVCBUT0tfREVMIGVuZCAgICAgeyBkZWxfaGx0KDIxKTsgfQotICAgICAgICAgICAgICB8IFRPS19ITFQgJz8nIGVuZCAgICAgICAgIHsgbGlzdF9obHQoKTsgfQotICAgICAgICAgIHwgVE9LX0hMVCBlcnJvciBlbmQgICAgICAgeyBwcmludGYoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJobHQgdmFsIHwgZGVsIFt2YWxdIHwgP1xuIik7IH0KLTsKLWlvcGVybTogICAgICAgICBUT0tfSU9QRVJNIHZhbCB2YWwgdmFsIGVuZCB7IGludCBpLG1heDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkMiA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXggPSAkMiArICQzIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1heCA+IElPUEVSTV9CSVRTKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4ID0gSU9QRVJNX0JJVFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAkMjtpIDw9IG1heDsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3Blcm1fbGlzdFtpXSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICQ0PjAgPyAxIDogMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICB8IFRPS19JT1BFUk0gJz8nIGVuZCB7IGludCBpLHN0YXJ0OwotICAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPD0gSU9QRVJNX0JJVFM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaW9wZXJtX2xpc3RbaV0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBpOwotICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgaSA8PSBJT1BFUk1fQklUUzsgaSsrKSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW9wZXJtX2xpc3RbaV0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImlvcGVybSBvbiBpbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIjB4JXgrMHgleFxuIiwgc3RhcnQsaS1zdGFydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICB8IFRPS19JT1BFUk0gZXJyb3IgZW5kIHsgcHJpbnRmKCJpb3Blcm0gc3RhcnQgbGVuIHZhbFxuIik7IH0KLTsKLWxpc3RfcGNpOiAgICAgIFRPS19EVU1QX1BDSSBlbmQgICAgICAgeyBsaXN0X3BjaSgpOyB9Ci0gICAgICAgICAgICAgfCBUT0tfRFVNUF9QQ0kgZXJyb3IgZW5kIHsgbGlzdF9wY2koKTsgfQotOwotYm9vdF9iaW9zOiAgICAgVE9LX0JPT1RfQklPUyAnPycgZW5kIHsgaWYgKCFCb290QmlvcykgcHJpbnRmKCJObyBCb290IEJJT1NcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHByaW50ZigiQm9vdEJJT1MgZnJvbTogJWk6JWk6JWlcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBCb290Qmlvcy0+YnVzLCBCb290Qmlvcy0+ZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vdEJpb3MtPmZ1bmMpOyB9Ci0gICAgICAgICAgICAgfCBUT0tfQk9PVF9CSU9TIGVycm9yIGVuZCB7IHByaW50ZiAoImJvb3RiaW9zIGJ1czpkZXY6bnVtXG4iKTsgfQotOwotaGxwOiAgICAgICAgICc/JyAgeyBwcmludGYoIkNvbW1hbmQgbGlzdDpcbiIpOwotICAgICAgICAgICAgICAgICAgICBwcmludGYoIiBzZWxlY3QgaXNhIHwgcGNpIGJ1czpkZXY6ZnVuY1xuIik7Ci0gICAgICAgICAgICBwcmludGYoIiBib290XG4iKTsKLSAgICAgICAgICAgIHByaW50ZigiIHNlZzpyZWcgdmFsIHwgcmVnIHZhbCBcbiIpOwotICAgICAgICAgICAgcHJpbnRmKCIgJHggdmFsIHwgJG1lbSB2YWxcbiIpOwotICAgICAgICAgICAgcHJpbnRmKCIgc2V0bWVtIGFkZHIgbGlzdDsgYWRkciA6PSB2YWxcbiIpOwotICAgICAgICAgICAgcHJpbnRmKCIgZHVtcG1lbSBhZGRyIGxlbjsgYWRkcixsZW4gOj0gdmFsXG4iKTsKLSAgICAgICAgICAgIHByaW50ZigiIGRvIFt2YWxdXG4iKTsKLSAgICAgICAgICAgIHByaW50ZigiIHF1aXRcbiIpOwotICAgICAgICAgICAgcHJpbnRmKCIgP1xuIik7Ci0gICAgICAgICAgICBwcmludGYoIiBzZWcgOj0gZHMgfCBlczsiCi0gICAgICAgICAgICAgICAiIHJlZyA6PSBheCB8IGJ4IHwgY3ggfCBkeCB8IHNpIFxuIik7Ci0gICAgICAgICAgICBwcmludGYoIiB2YWwgOj0gdmFyIHwgPGhleC1udW1iZXI+IHwgc2VnOnJlZyB8IHNlZ1xuIik7Ci0gICAgICAgICAgICBwcmludGYoIiB2YXIgOj0gJHggfCAkbWVtOyB4IDo9IDAuLjIwXG4iKTsKLSAgICAgICAgICAgIHByaW50ZigiIGxpc3QgOj0gYnl0ZSB2YWwgfCB3b3JkIHZhbCB8IGxvbmcgdmFsICIKLSAgICAgICAgICAgICAgICJ8IFwic3RyaW5nXCJcbiIpOwotICAgICAgICAgICAgICAgIHByaW50ZigiIHBwb3J0IG9uIHwgb2ZmIHwgP1xuIik7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIgcHBjaSBvbiB8IG9mZiB8ID9cbiIpOwotICAgICAgICAgICAgICAgIHByaW50ZigiIHBpcnEgb24gfCBvZmYgfCA/XG4iKTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiBwaXAgb24gfCBvZmYgfCA/XG4iKTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiB0cmFjZSBvbiB8IG9mZiB8ID9cbiIpOwotICAgICAgICAgICAgICAgIHByaW50ZigiIGlvc3RhdCBvbiB8IG9mZiB8ID9cbiIpOwotICAgICAgICAgICAgcHJpbnRmKCIgdmVyYm9zZSB2YWxcbiIpOwotICAgICAgICAgICAgcHJpbnRmKCIgbG9nIFwiPGZpbGVuYW1lPlwiIHwgb2ZmIHwgP1xuIik7Ci0gICAgICAgICAgICBwcmludGYoIiBwcmludCBvbiB8IG9mZlxuIik7Ci0gICAgICAgICAgICBwcmludGYoIiBobHQgdmFsIHwgZGVsIFt2YWxdIHwgP1xuIik7Ci0gICAgICAgICAgICBwcmludGYoIiBjbHN0YXRcbiIpOwotICAgICAgICAgICAgcHJpbnRmKCIgbHBjaVxuIik7Ci0gICAgICAgICAgICBwcmludGYgKCJib290YmlvcyA/XG4iKTsKLX0KLTsKLQotJSUKLQotc3RhdGljIHZvaWQKLWR1bXBfbWVtKENBUkQzMiBhZGRyLCBpbnQgbGVuKQotewotICAgIGRwcmludChhZGRyLGxlbik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1leGVjX2ludChpbnQgbnVtKQotewotICAgIGlmIChudW0gPT0gMHgxMCkgeyAgLyogdmlkZW8gaW50ZXJydXB0ICovCi0gICAgaWYgKERldmljZS50eXBlID09IE5PTkUpIHsKLSAgICAgICAgQ3VycmVudFBjaSA9IFBjaUxpc3Q7Ci0gICAgICAgIHdoaWxlIChDdXJyZW50UGNpKSB7Ci0gICAgICAgIGlmIChDdXJyZW50UGNpLT5hY3RpdmUpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgQ3VycmVudFBjaSA9IEN1cnJlbnRQY2ktPm5leHQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFDdXJyZW50UGNpKQotICAgICAgICBEZXZpY2UudHlwZSA9IElTQTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgIERldmljZS50eXBlID0gUENJOwotICAgICAgICBEZXZpY2UubG9jLnBjaS5kZXYgPSBDdXJyZW50UGNpLT5kZXY7Ci0gICAgICAgIERldmljZS5sb2MucGNpLmJ1cyA9IEN1cnJlbnRQY2ktPmJ1czsKLSAgICAgICAgRGV2aWNlLmxvYy5wY2kuZnVuYyA9IEN1cnJlbnRQY2ktPmZ1bmM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgIGlmIChEZXZpY2UudHlwZSAhPSBJU0EpIHsKLSAgICAgICBpZiAoIURldmljZS5ib290ZWQpIHsKLSAgICAgICAgICAgICAgaWYgKCFDdXJyZW50UGNpIHx8IChEZXZpY2UudHlwZSA9PSBQQ0kKLSAgICAgICAgICAgICAgICYmICghQ3VycmVudFBjaS0+YWN0aXZlCi0gICAgICAgICAgICAgICAgICAgJiYgKERldmljZS5sb2MucGNpLmRldiAhPSBDdXJyZW50UGNpLT5kZXYKLSAgICAgICAgICAgICAgICAgfHwgRGV2aWNlLmxvYy5wY2kuYnVzICE9IEN1cnJlbnRQY2ktPmJ1cwotICAgICAgICAgICAgICAgICB8fCBEZXZpY2UubG9jLnBjaS5mdW5jICE9IEN1cnJlbnRQY2ktPmZ1bmMpKSkpIHsKLSAgICAgICAgICAgICAgICBwcmludGYoImJvb3QgdGhlIGRldmljZSBmaXN0XG4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICB9IGVsc2UKLSAgICAgICBDdXJyZW50UGNpID0gTlVMTDsKLSAgICB9IGVsc2UgewotICAgIERldmljZS5ib290ZWQgPSBGQUxTRTsgLyogd2UgbmVlZCB0aGlzIGZvciBzYW5pdHkhICovCi0gICAgfQotICAgIAotICAgIHJ1bklOVChudW0sJnJlZ3MpOwotfQotCi1zdGF0aWMgdm9pZAotYm9vdCh2b2lkKQotewotICAgIGlmIChEZXZpY2UudHlwZSA9PSBOT05FKSB7Ci0gICAgcHJpbnRmKCJzZWxlY3QgYSBkZXZpY2UgZmlzdFxuIik7Ci0gICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBjYWxsX2Jvb3QoJkRldmljZSk7Ci19Ci0KLXN0YXRpYyB2b2lkICoKLWFkZF90b19saXN0KGVudW0gbWVtX3R5cGUgdHlwZSwgdW5pb24gbWVtX3ZhbCAqcmVjLCB2b2lkICpuZXh0KQotewotICAgIHN0cnVjdCBtZW0gKm1lbV9yZWMgPSAoc3RydWN0IG1lbSAqKSBtYWxsb2Moc2l6ZW9mKG1lbV9yZWMpKTsKLQotICAgIG1lbV9yZWMtPnR5cGUgPSB0eXBlOwotICAgIG1lbV9yZWMtPm5leHQgPSBuZXh0OwotICAgIAotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgQllURToKLSAgICBjYXNlIFdPUkQ6Ci0gICAgY2FzZSBMT05HOgotICAgIG1lbV9yZWMtPnZhbC5pbnRlZ2VyID0gcmVjLT5pbnRlZ2VyOwotICAgICAgIGJyZWFrOwotICAgIGNhc2UgU1RSSU5HOgotICAgIG1lbV9yZWMtPnZhbC5wdHIgPSBub3JtYWxpemVfc3RyaW5nKHJlYy0+cHRyKTsKLSAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIG1lbV9yZWM7Ci19Ci0KLXN0YXRpYyBpbnQKLXZhbGlkUmFuZ2UoaW50IGFkZHIsaW50IGxlbikKLXsKLSAgICBpbnQgZW5kID0gYWRkciArIGxlbjsKLQotICAgIGlmIChhZGRyIDwgMHgxMDAwIHx8IGVuZCA+IDB4YzAwMDApCi0gICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19saXN0KHN0cnVjdCBtZW0gKmxpc3QsIG1lbVR5cGUgYWRkcikKLXsKLSAgIHN0cnVjdCBtZW0gKnByZXY7Ci0gICBpbnQgbGVuOwotICAgCi0gICB3aGlsZSAobGlzdCkgewotICAgIHN3aXRjaCAobGlzdC0+dHlwZSkgewotICAgICAgICAgY2FzZSBCWVRFOgotICAgICAgICAgaWYgKCF2YWxpZFJhbmdlKGFkZHIsMSkpIGdvdG8gZXJyb3I7Ci0gICAgICAgICAqKENBUkQ4KilhZGRyID0gbGlzdC0+dmFsLmludGVnZXI7Ci0gICAgICAgICBhZGRyID0rIDE7Ci0gICAgICAgICAgICAgYnJlYWs7ICAgICAKLSAgICAgICAgIGNhc2UgV09SRDoKLSAgICAgICAgIGlmICghdmFsaWRSYW5nZShhZGRyLDIpKSBnb3RvIGVycm9yOwotICAgICAgICAgKihDQVJEMTYqKWFkZHIgPSBsaXN0LT52YWwuaW50ZWdlcjsKLSAgICAgICAgIGFkZHIgPSsgMjsKLSAgICAgICAgICAgICBicmVhazsgICAgIAotICAgICAgICAgY2FzZSBMT05HOgotICAgICAgICAgaWYgKCF2YWxpZFJhbmdlKGFkZHIsNCkpIGdvdG8gZXJyb3I7Ci0gICAgICAgICAqKENBUkQzMiopYWRkciA9IGxpc3QtPnZhbC5pbnRlZ2VyOwotICAgICAgICAgYWRkciA9KyA0OwotICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgY2FzZSBTVFJJTkc6Ci0gICAgICAgICBsZW4gPSBzdHJsZW4oKGNoYXIqKWxpc3QtPnZhbC5wdHIpOwotICAgICAgICAgaWYgKCF2YWxpZFJhbmdlKGFkZHIsbGVuKSkgZ290byBlcnJvcjsKLSAgICAgICAgIG1lbWNweSgoQ0FSRDgqKWFkZHIsKHZvaWQqKWxpc3QtPnZhbC5wdHIsbGVuKTsKLSAgICAgICAgIGFkZHIgPSsgbGVuOwotICAgICAgICAgICAgIGZyZWUobGlzdC0+dmFsLnB0cik7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgfSAgICAgCi0gICAgICAgcHJldiA9IGxpc3Q7Ci0gICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7Ci0gICAgICAgZnJlZShwcmV2KTsKLSAgICAgICBjb250aW51ZTsKLSAgIGVycm9yOgotICAgICAgIHByaW50ZigiYWRkcmVzcyBvdXQgb2YgcmFuZ2VcbiIpOwotICAgICAgIHdoaWxlIChsaXN0KSB7Ci0gICAgICAgcHJldiA9IGxpc3Q7Ci0gICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7Ci0gICAgICAgZnJlZShwcmV2KTsKLSAgICAgICB9Ci0gICAgICAgYnJlYWs7Ci0gICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLW5vcm1hbGl6ZV9zdHJpbmcoY2hhciAqcHRyKQotewotICAgIGludCBpID0gMCwgaiA9IDAsIGMgPSAwLCBlc2M9IDA7Ci0gICAgaW50IHNpemU7Ci0gICAgY2hhciAqbWVtX3B0cjsKLSAgICAKLSAgICBzaXplID0gc3RybGVuKHB0cik7Ci0gICAgbWVtX3B0ciA9IG1hbGxvYyhzaXplKTsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBzd2l0Y2ggKCoocHRyICsgaSkpIHsKLSAgICAgICAgY2FzZSAnXFwnOgotICAgICAgICAgICAgaWYgKGVzYykgewotICAgICAgICAgICAgICAgICoobWVtX3B0ciArIGorKykgPSAqKHB0ciArIGkpOwotICAgICAgICAgICAgICAgIGVzYyA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgCi0gICAgICAgICAgICAgICAgZXNjID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdcIic6Ci0gICAgICAgICAgICBpZiAoZXNjKSB7Ci0gICAgICAgICAgICAgICAgKihtZW1fcHRyICsgaisrKSA9ICoocHRyICsgaSk7Ci0gICAgICAgICAgICAgICAgZXNjID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSAKLSAgICAgICAgICAgICAgICBjKys7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICoobWVtX3B0ciArIGorKykgPSAqKHB0ciArIGkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGMgPiAxKSB7Ci0gICAgICAgICAgICAqKG1lbV9wdHIgKyBqKSA9ICdcMCc7ICAgICAKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGkrKzsKLSAgICB9Ci0gICAgcmV0dXJuIG1lbV9wdHI7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3BjaS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy9wY2kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU4YTU3MS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3BjaS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMTk5OSBFZ2JlcnQgRWljaAotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKLSAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwotICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQgaW4KLSAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAotICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucwotICogYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQKLSAqICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0gKgotICogVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0gKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0gKiBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCi0gKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCi0gKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0gKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPG1hbGxvYy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2lmIGRlZmluZWQgKF9fYWxwaGFfXykgfHwgZGVmaW5lZCAoX19pYTY0X18pCi0jaW5jbHVkZSA8c3lzL2lvLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJBc21NYWNyb3MuaCIKLQotI2luY2x1ZGUgInBjaS5oIgotCi0vKgotICogSSdtIHJhdGhlciBzaW1wbGUgbWluZGVuZCAtIHRoZXJlZm9yZSBJIGRvIGEgcG9vciBtYW4ncwotICogcGNpIHNjYW4gd2l0aG91dCBhbGwgdGhlIGZhbmN5IHN0dWZmIHRoYXQgaXMgZG9uZSBpbgotICogc2NhbnBjaS4gSG93ZXZlciB0aGF0J3MgYWxsIHdlIG5lZWQuCi0gKi8KLQotUGNpU3RydWN0UHRyIFBjaVN0cnVjdCA9IE5VTEw7Ci1QY2lCdXNQdHIgUGNpQnVzZXMgPSBOVUxMOwotUGNpU3RydWN0UHRyIEN1cnJlbnRQY2kgPSBOVUxMOwotUGNpU3RydWN0UHRyIFBjaUxpc3QgPSBOVUxMOwotUGNpU3RydWN0UHRyIEJvb3RCaW9zID0gTlVMTDsKLWludCBwY2lNYXhCdXMgPSAwOwotCi1zdGF0aWMgQ0FSRDMyIFBjaUNmZzFBZGRyOwotCi1zdGF0aWMgdm9pZCByZWFkQ29uZmlnU3BhY2VDZmcxKENBUkQzMiBidXMsIENBUkQzMiBkZXYsIENBUkQzMiBmdW5jLAotCQlDQVJEMzIgKnJlZyk7Ci1zdGF0aWMgaW50IGNoZWNrU2xvdENmZzEoQ0FSRDMyIGJ1cywgQ0FSRDMyIGRldiwgQ0FSRDMyIGZ1bmMpOwotc3RhdGljIGludCBjaGVja1Nsb3RDZmcyKENBUkQzMiBidXMsIGludCBkZXYpOwotc3RhdGljIHZvaWQgcmVhZENvbmZpZ1NwYWNlQ2ZnMihDQVJEMzIgYnVzLCBpbnQgZGV2LCBDQVJEMzIgKnJlZyk7Ci1zdGF0aWMgQ0FSRDggaW50ZXJwcmV0Q29uZmlnU3BhY2UoQ0FSRDMyICpyZWcsIGludCBidXNpZHgsCi0JCSAgQ0FSRDggZGV2LCBDQVJEOCBmdW5jKTsKLXN0YXRpYyBDQVJEMzIgZmluZEJJT1NNYXAoUGNpU3RydWN0UHRyIHBjaVAsIENBUkQzMiAqYmlvc1NpemUpOwotc3RhdGljIHZvaWQgcmVzdG9yZU1lbShQY2lTdHJ1Y3RQdHIgcGNpUCk7Ci0KLQotI2lmZGVmIF9fYWxwaGFfXwotI2RlZmluZSBQQ0lfQlVTX0ZST01fVEFHKHRhZykgICgoKHRhZykgJiAweDAwZmYwMDAwKSA+PiAxNikKLSNkZWZpbmUgUENJX0RGTl9GUk9NX1RBRyh0YWcpICgoKHRhZykgJiAweDAwMDBmZjAwKSA+PiA4KQotCi0jaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgotCi1DQVJEMzIKLWF4cFBjaUNmZ1JlYWQoQ0FSRDMyIHRhZykKLXsKLSAgICBpbnQgYnVzLCBkZm47Ci0gICAgQ0FSRDMyIHZhbCA9IDB4ZmZmZmZmZmY7Ci0KLSAgICBidXMgPSBQQ0lfQlVTX0ZST01fVEFHKHRhZyk7Ci0gICAgZGZuID0gUENJX0RGTl9GUk9NX1RBRyh0YWcpOwotCi0gICAgc3lzY2FsbChfX05SX3BjaWNvbmZpZ19yZWFkLCBidXMsIGRmbiwgdGFnICYgMHhmZiwgNCwgJnZhbCk7Ci0gICAgcmV0dXJuKHZhbCk7Ci19Ci0KLXZvaWQKLWF4cFBjaUNmZ1dyaXRlKENBUkQzMiB0YWcsIENBUkQzMiB2YWwpCi17Ci0gICAgaW50IGJ1cywgZGZuOwotCi0gICAgYnVzID0gUENJX0JVU19GUk9NX1RBRyh0YWcpOwotICAgIGRmbiA9IFBDSV9ERk5fRlJPTV9UQUcodGFnKTsKLQotICAgIHN5c2NhbGwoX19OUl9wY2ljb25maWdfd3JpdGUsIGJ1cywgZGZuLCB0YWcgJiAweGZmLCA0LCAmdmFsKTsKLX0KLQotc3RhdGljIENBUkQzMiAoKnJlYWRQY2kpKENBUkQzMiByZWcpID0gYXhwUGNpQ2ZnUmVhZDsKLXN0YXRpYyB2b2lkICgqd3JpdGVQY2kpKENBUkQzMiByZWcsIENBUkQzMiB2YWwpID0gYXhwUGNpQ2ZnV3JpdGU7Ci0jZWxzZQotc3RhdGljIENBUkQzMiByZWFkUGNpQ2ZnMShDQVJEMzIgcmVnKTsKLXN0YXRpYyB2b2lkIHdyaXRlUGNpQ2ZnMShDQVJEMzIgcmVnLCBDQVJEMzIgdmFsKTsKLXN0YXRpYyBDQVJEMzIgcmVhZFBjaUNmZzIoQ0FSRDMyIHJlZyk7Ci1zdGF0aWMgdm9pZCB3cml0ZVBjaUNmZzIoQ0FSRDMyIHJlZywgQ0FSRDMyIHZhbCk7Ci0KLXN0YXRpYyBDQVJEMzIgKCpyZWFkUGNpKShDQVJEMzIgcmVnKSA9IHJlYWRQY2lDZmcxOwotc3RhdGljIHZvaWQgKCp3cml0ZVBjaSkoQ0FSRDMyIHJlZywgQ0FSRDMyIHZhbCkgPSB3cml0ZVBjaUNmZzE7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9fc3BhcmNfXykKLSNkZWZpbmUgUENJX0VOIDB4MDAwMDAwMDAKLSNlbHNlCi0jZGVmaW5lIFBDSV9FTiAweDgwMDAwMDAwCi0jZW5kaWYKLQotCi1zdGF0aWMgaW50IG51bWJ1czsKLXN0YXRpYyBpbnQgaG9zdGJyaWRnZXMgPSAxOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgcGNpTWluTWVtUmVnID0gfjA7Ci0KLQotdm9pZAotc2Nhbl9wY2kodm9pZCkKLXsKLSAgICB1bnNpZ25lZCBzaG9ydCBjb25maWd0eXBlOwotCi0gICAgQ0FSRDMyIHJlZ1s2NF07Ci0gICAgaW50IGJ1c2lkeDsKLSAgICBDQVJEOCBjYXJkbnVtOwotICAgIENBUkQ4IGZ1bmM7Ci0gICAgaW50IGlkeDsKLQotICAgIGludCBpOwotICAgIFBjaVN0cnVjdFB0ciBwY2kxOwotICAgIFBjaUJ1c1B0ciBwY2lfYjEscGNpX2IyOwotCi0jaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19wb3dlcnBjX18pIHx8IGRlZmluZWQoX19zcGFyY19fKSB8fCBkZWZpbmVkKF9faWE2NF9fKQotICAgIGNvbmZpZ3R5cGUgPSAxOwotI2Vsc2UKLSAgICBDQVJEOCB0bXAxLCB0bXAyOwotICAgIENBUkQzMiB0bXAzMl8xLCB0bXAzMl8yOwotICAgIG91dGIoUENJX01PREUyX0VOQUJMRV9SRUcsIDB4MDApOwotICAgIG91dGIoUENJX01PREUyX0ZPUldBUkRfUkVHLCAweDAwKTsKLSAgICB0bXAxID0gaW5iKFBDSV9NT0RFMl9FTkFCTEVfUkVHKTsKLSAgICB0bXAyID0gaW5iKFBDSV9NT0RFMl9GT1JXQVJEX1JFRyk7Ci0gICAgaWYgKCh0bXAxID09IDB4MDApICYmICh0bXAyID09IDB4MDApKSB7Ci0JY29uZmlndHlwZSA9IDI7Ci0JcmVhZFBjaSA9IHJlYWRQY2lDZmcyOwotCXdyaXRlUGNpID0gd3JpdGVQY2lDZmcyOwotCVBfcHJpbnRmKCJQQ0kgc2F5cyBjb25maWd1cmF0aW9uIHR5cGUgMlxuIik7Ci0gICAgfSBlbHNlIHsKLQl0bXAzMl8xID0gaW5sKFBDSV9NT0RFMV9BRERSRVNTX1JFRyk7Ci0Jb3V0bChQQ0lfTU9ERTFfQUREUkVTU19SRUcsIFBDSV9FTik7Ci0JdG1wMzJfMiA9IGlubChQQ0lfTU9ERTFfQUREUkVTU19SRUcpOwotCW91dGwoUENJX01PREUxX0FERFJFU1NfUkVHLCB0bXAzMl8xKTsKLQlpZiAodG1wMzJfMiA9PSBQQ0lfRU4pIHsKLQkgICAgY29uZmlndHlwZSA9IDE7Ci0JICAgIFBfcHJpbnRmKCJQQ0kgc2F5cyBjb25maWd1cmF0aW9uIHR5cGUgMVxuIik7Ci0JfSBlbHNlIHsKLQkgICAgUF9wcmludGYoIk5vIFBDSSAhXG4iKTsKLQkgICAgcmV0dXJuOwotCX0KLSAgICB9Ci0jZW5kaWYKLQotICAgIGlmIChjb25maWd0eXBlID09IDEpIHsKLQlQX3ByaW50ZigiUENJIHByb2JpbmcgY29uZmlndXJhdGlvbiB0eXBlIDFcbiIpOwotCWJ1c2lkeCA9IDA7Ci0JbnVtYnVzID0gMTsKLQlpZHggPSAwOwotCWRvIHsKLQkgICAgUF9wcmludGYoIlxuUHJvYmluZyBmb3IgZGV2aWNlcyBvbiBQQ0kgYnVzICVkOlxuIiwgYnVzaWR4KTsKLQkgICAgZm9yIChjYXJkbnVtID0gMDsgY2FyZG51bSA8IE1BWF9ERVZfUEVSX1ZFTkRPUl9DRkcxOyBjYXJkbnVtKyspIHsKLQkJZnVuYyA9IDA7Ci0JCWRvIHsKLQkJICAgIC8qIGxvb3Agb3ZlciB0aGUgZGlmZmVyZW50IGZ1bmN0aW9ucywgaWYgcHJlc2VudCAqLwotCQkgICAgaWYgKCFjaGVja1Nsb3RDZmcxKGJ1c2lkeCxjYXJkbnVtLGZ1bmMpKQotCQkJYnJlYWs7Ci0JCSAgICByZWFkQ29uZmlnU3BhY2VDZmcxKGJ1c2lkeCxjYXJkbnVtLGZ1bmMscmVnKTsKLQotCQkgICAgZnVuYyA9IGludGVycHJldENvbmZpZ1NwYWNlKHJlZyxidXNpZHgsCi0JCQkJCQljYXJkbnVtLGZ1bmMpOwotCi0JCSAgICBpZiAoaWR4KysgPiBNQVhfUENJX0RFVklDRVMpCi0JCQljb250aW51ZTsKLQkJfSB3aGlsZSAoZnVuYyA8IDgpOwotCSAgICB9Ci0JfSB3aGlsZSAoKytidXNpZHggPCBQQ0lfTUFYQlVTKTsKLSNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX3Bvd2VycGNfXykgfHwgZGVmaW5lZChfX3NwYXJjX18pIHx8IGRlZmluZWQoX19pYTY0X18pCi0JLyogZG9uJ3QgdXNlIG91dGwoKSAgOy0pICovCi0jZWxzZQotCW91dGwoUENJX01PREUxX0FERFJFU1NfUkVHLCAwKTsKLSNlbmRpZgotICAgIH0gZWxzZSB7Ci0JaW50IHNsb3Q7Ci0KLQlQX3ByaW50ZigiUENJIHByb2JpbmcgY29uZmlndXJhdGlvbiB0eXBlIDJcbiIpOwotCWJ1c2lkeCA9IDA7Ci0JbnVtYnVzID0gMTsKLQlpZHggPSAwOwotCWRvIHsKLQkgICAgZm9yIChzbG90PTB4YzA7IHNsb3Q8MHhkMDsgaSsrKSB7Ci0JCWlmICghY2hlY2tTbG90Q2ZnMihidXNpZHgsc2xvdCkpCi0JCSAgICBicmVhazsKLQkJcmVhZENvbmZpZ1NwYWNlQ2ZnMihidXNpZHgsc2xvdCxyZWcpOwotCi0JCWludGVycHJldENvbmZpZ1NwYWNlKHJlZyxidXNpZHgsCi0JCQkJICAgICBzbG90LDApOwotCQlpZiAoaWR4KysgPiBNQVhfUENJX0RFVklDRVMpCi0JCSAgICBjb250aW51ZTsKLQkgICAgfQotCX0gIHdoaWxlICgrK2J1c2lkeCA8IFBDSV9NQVhCVVMpOwotICAgIH0KLQotCi0gICAgcGNpTWF4QnVzID0gbnVtYnVzIC0gMTsKLSAgICBQX3ByaW50ZigiTnVtYmVyIG9mIGJ1c2VzIGluIHN5c3RlbTogJWlcbiIscGNpTWF4QnVzICsgMSk7Ci0gICAgUF9wcmludGYoIk1pbiBQQ0kgbWVtIGFkZHJlc3M6IDB4JWx4XG4iLHBjaU1pbk1lbVJlZyk7Ci0KLSAgICAvKiBsaW5rIGJ1c2VzICovCi0gICAgcGNpX2IxID0gUGNpQnVzZXM7Ci0gICAgd2hpbGUgKHBjaV9iMSkgewotCXBjaV9iMiA9IFBjaUJ1c2VzOwotCXBjaV9iMS0+cEJ1cyA9IE5VTEw7Ci0Jd2hpbGUgKHBjaV9iMikgewotCSAgICBpZiAocGNpX2IxLT5wcmltYXJ5ID09IHBjaV9iMi0+c2Vjb25kYXJ5KQotCQlwY2lfYjEtPnBCdXMgPSBwY2lfYjI7Ci0JICAgIHBjaV9iMiA9IHBjaV9iMi0+bmV4dDsKLQl9Ci0JcGNpX2IxID0gcGNpX2IxLT5uZXh0OwotICAgIH0KLSAgICBwY2kxID0gUGNpU3RydWN0OwotICAgIHdoaWxlIChwY2kxKSB7Ci0JcGNpX2IyID0gUGNpQnVzZXM7Ci0JcGNpMS0+cEJ1cyA9IE5VTEw7Ci0Jd2hpbGUgKHBjaV9iMikgewotCSAgICBpZiAocGNpMS0+YnVzID09IHBjaV9iMi0+c2Vjb25kYXJ5KQotCQlwY2kxLT5wQnVzID0gcGNpX2IyOwotCSAgICBwY2lfYjIgPSBwY2lfYjItPm5leHQ7Ci0JfQotCXBjaTEgPSBwY2kxLT5uZXh0OwotICAgIH0KLSAgICBpZiAoUkVTT1JUKSB7Ci0JUGNpU3RydWN0UHRyIHRtcCA9IFBjaVN0cnVjdCwgdG1wMTsKLQlQY2lTdHJ1Y3QgPSBOVUxMOwotCXdoaWxlICh0bXApIHsKLQkgICAgdG1wMSA9IHRtcC0+bmV4dDsKLQkgICAgdG1wLT5uZXh0ID0gUGNpU3RydWN0OwotCSAgICBQY2lTdHJ1Y3QgPSB0bXA7Ci0JICAgIHRtcCA9IHRtcDE7Ci0JfQotICAgIH0KLSAgICBQY2lMaXN0ID0gQ3VycmVudFBjaSA9IFBjaVN0cnVjdDsKLX0KLQotI2lmbmRlZiBfX2FscGhhX18KLXN0YXRpYyBDQVJEMzIKLXJlYWRQY2lDZmcxKENBUkQzMiByZWcpCi17Ci0gICAgQ0FSRDMyIHZhbDsKLQotICAgIG91dGwoUENJX01PREUxX0FERFJFU1NfUkVHLCByZWcpOwotICAgIHZhbCA9IGlubChQQ0lfTU9ERTFfREFUQV9SRUcpOwotICAgIG91dGwoUENJX01PREUxX0FERFJFU1NfUkVHLCAwKTsKLSAgICBQX3ByaW50ZigicmVhZGluZzogMHgleCBmcm9tIDB4JXhcbiIsdmFsLHJlZyk7Ci0gICAgcmV0dXJuIHZhbDsKLX0KLQotc3RhdGljIHZvaWQKLXdyaXRlUGNpQ2ZnMShDQVJEMzIgcmVnLCBDQVJEMzIgdmFsKQotewotICAgIFBfcHJpbnRmKCJ3cml0aW5nOiAweCV4IHRvIDB4JXhcbiIsdmFsLHJlZyk7Ci0gICAgb3V0bChQQ0lfTU9ERTFfQUREUkVTU19SRUcsIHJlZyk7Ci0gICAgb3V0bChQQ0lfTU9ERTFfREFUQV9SRUcsdmFsKTsKLSAgICBvdXRsKFBDSV9NT0RFMV9BRERSRVNTX1JFRywgMCk7Ci19Ci0KLXN0YXRpYyBDQVJEMzIKLXJlYWRQY2lDZmcyKENBUkQzMiByZWcpCi17Ci0gICAgQ0FSRDMyIHZhbDsKLSAgICBDQVJEOCBidXMgPSAocmVnID4+IDE2KSAmIDB4ZmY7Ci0gICAgQ0FSRDggZGV2ID0gKHJlZyA+PiAxMSkgJiAweDFmOwotICAgIENBUkQ4IG51bSA9IHJlZyAmIDB4ZmY7Ci0KLSAgICBvdXRiKFBDSV9NT0RFMl9FTkFCTEVfUkVHLCAweEYxKTsKLSAgICBvdXRiKFBDSV9NT0RFMl9GT1JXQVJEX1JFRywgYnVzKTsKLSAgICB2YWwgPSBpbmwoKGRldiA8PCA4KSArIG51bSk7Ci0gICAgb3V0YihQQ0lfTU9ERTJfRU5BQkxFX1JFRywgMHgwMCk7Ci0gICAgUF9wcmludGYoInJlYWRpbmc6IDB4JXggZnJvbSAweCV4XG4iLHZhbCxyZWcpOwotICAgIHJldHVybiB2YWw7Ci19Ci0KLXN0YXRpYyB2b2lkCi13cml0ZVBjaUNmZzIoQ0FSRDMyIHJlZywgQ0FSRDMyIHZhbCkKLXsKLSAgICBDQVJEOCBidXMgPSAocmVnID4+IDE2KSAmIDB4ZmY7Ci0gICAgQ0FSRDggZGV2ID0gKHJlZyA+PiAxMSkgJiAweDFmOwotICAgIENBUkQ4IG51bSA9IHJlZyAmIDB4ZmY7Ci0KLSAgICBQX3ByaW50Zigid3JpdGluZzogMHgleCB0byAweCV4XG4iLHZhbCxyZWcpOwotICAgIG91dGIoUENJX01PREUyX0VOQUJMRV9SRUcsIDB4RjEpOwotICAgIG91dGIoUENJX01PREUyX0ZPUldBUkRfUkVHLCBidXMpOwotICAgIG91dGwoKGRldiA8PCA4KSArIG51bSx2YWwpOwotICAgIG91dGIoUENJX01PREUyX0VOQUJMRV9SRUcsIDB4MDApOwotfQotI2VuZGlmCi0KLXZvaWQKLXBjaVZpZGVvRGlzYWJsZSh2b2lkKQotewotICAgIC8qIGRpc2FibGUgVkdBIHJvdXRpbmcgb24gYnJpZGdlcyAqLwotICAgIFBjaUJ1c1B0ciBwYnAgPSBQY2lCdXNlczsKLSAgICBQY2lTdHJ1Y3RQdHIgcGNwID0gUGNpU3RydWN0OwotCi0gICAgd2hpbGUgKHBicCkgewotCXdyaXRlUGNpKHBicC0+U2xvdC5sIHwgMHgzYywgcGJwLT5iY3RsICYgfihDQVJEMzIpKDg8PDE2KSk7Ci0JcGJwID0gcGJwLT5uZXh0OwotICAgIH0KLSAgICAvKiBkaXNhYmxlIGRpc3BsYXkgZGV2aWNlcyAqLwotICAgIHdoaWxlIChwY3ApIHsKLQl3cml0ZVBjaShwY3AtPlNsb3QubCB8IDB4MDQsIHBjcC0+Y21kX3N0ICYgfihDQVJEMzIpMyk7Ci0Jd3JpdGVQY2kocGNwLT5TbG90LmwgfCAweDMwLCBwY3AtPlJvbUJhc2UgJiB+KENBUkQzMikxKTsKLQlwY3AgPSBwY3AtPm5leHQ7Ci0gICAgfQotfQotCi12b2lkCi1wY2lWaWRlb1Jlc3RvcmUodm9pZCkKLXsKLSAgICAvKiBkaXNhYmxlIFZHQSByb3V0aW5nIG9uIGJyaWRnZXMgKi8KLSAgICBQY2lCdXNQdHIgcGJwID0gUGNpQnVzZXM7Ci0gICAgUGNpU3RydWN0UHRyIHBjcCA9IFBjaVN0cnVjdDsKLQotICAgIHdoaWxlIChwYnApIHsKLQl3cml0ZVBjaShwYnAtPlNsb3QubCB8IDB4M2MsIHBicC0+YmN0bCk7Ci0JcGJwID0gcGJwLT5uZXh0OwotICAgIH0KLSAgICAvKiBkaXNhYmxlIGRpc3BsYXkgZGV2aWNlcyAqLwotICAgIHdoaWxlIChwY3ApIHsKLQl3cml0ZVBjaShwY3AtPlNsb3QubCB8IDB4MDQsIHBjcC0+Y21kX3N0KTsKLQl3cml0ZVBjaShwY3AtPlNsb3QubCB8IDB4MzAsIHBjcC0+Um9tQmFzZSk7Ci0JcGNwID0gcGNwLT5uZXh0OwotICAgIH0KLX0KLQotdm9pZAotRW5hYmxlQ3VycmVudCgpCi17Ci0gICAgUGNpQnVzUHRyIHBicDsKLSAgICBQY2lTdHJ1Y3RQdHIgcGNwID0gQ3VycmVudFBjaTsKLQotICAgIHBjaVZpZGVvRGlzYWJsZSgpOwotCi0gICAgcGJwID0gcGNwLT5wQnVzOwotICAgIHdoaWxlIChwYnApIHsgLyogZW5hYmxlIGJyaWRnZXMgKi8KLQl3cml0ZVBjaShwYnAtPlNsb3QubCB8IDB4M2MsIHBicC0+YmN0bCB8IChDQVJEMzIpKDg8PDE2KSk7Ci0JcGJwID0gcGJwLT5wQnVzOwotICAgIH0KLSAgICB3cml0ZVBjaShwY3AtPlNsb3QubCB8IDB4MDQsIHBjcC0+Y21kX3N0IHwgKENBUkQzMikzKTsKLSAgICB3cml0ZVBjaShwY3AtPlNsb3QubCB8IDB4MzAsIHBjcC0+Um9tQmFzZSB8IChDQVJEMzIpMSk7Ci19Ci0KLUNBUkQ4Ci1QY2lSZWFkOChpbnQgb2Zmc2V0LCBDQVJEMzIgU2xvdCkKLXsKLSAgICBpbnQgc2hpZnQgPSBvZmZzZXQgJiAweDM7Ci0gICAgb2Zmc2V0ID0gb2Zmc2V0ICYgMHhGQzsKLSAgICByZXR1cm4gKChyZWFkUGNpKFNsb3QgfCBvZmZzZXQpID4+IChzaGlmdCA8PCAzKSkgJiAweGZmKTsKLX0KLQotQ0FSRDE2Ci1QY2lSZWFkMTYoaW50IG9mZnNldCwgQ0FSRDMyIFNsb3QpCi17Ci0gICAgaW50IHNoaWZ0ID0gb2Zmc2V0ICYgMHgyOwotICAgIG9mZnNldCA9IG9mZnNldCAmIDB4RkM7Ci0gICAgcmV0dXJuICgocmVhZFBjaShTbG90IHwgb2Zmc2V0KSA+PiAoc2hpZnQgPDwgMykpICYgMHhmZmZmKTsKLX0KLQotQ0FSRDMyCi1QY2lSZWFkMzIoaW50IG9mZnNldCwgQ0FSRDMyIFNsb3QpCi17Ci0gICAgb2Zmc2V0ID0gb2Zmc2V0ICYgMHhGQzsKLSAgICByZXR1cm4gKHJlYWRQY2koU2xvdCB8IG9mZnNldCkpOwotfQotCi12b2lkCi1QY2lXcml0ZTgoaW50IG9mZnNldCwgQ0FSRDggYnl0ZSwgQ0FSRDMyIFNsb3QpCi17Ci0gICAgQ0FSRDMyIHZhbDsKLSAgICBpbnQgc2hpZnQgPSBvZmZzZXQgJiAweDM7Ci0gICAgb2Zmc2V0ID0gb2Zmc2V0ICYgMHhGQzsKLSAgICB2YWwgPSByZWFkUGNpKFNsb3QgfCBvZmZzZXQpOwotICAgIHZhbCAmPSB+KENBUkQzMikoMHhmZiA8PCAoc2hpZnQgPDwgMykpOwotICAgIHZhbCB8PSBieXRlIDw8IChzaGlmdCA8PCAzKTsKLSAgICB3cml0ZVBjaShTbG90IHwgb2Zmc2V0LCB2YWwpOwotfQotCi12b2lkCi1QY2lXcml0ZTE2KGludCBvZmZzZXQsIENBUkQxNiB3b3JkLCBDQVJEMzIgU2xvdCkKLXsKLSAgICBDQVJEMzIgdmFsOwotICAgIGludCBzaGlmdCA9IG9mZnNldCAmIDB4MjsKLSAgICBvZmZzZXQgPSBvZmZzZXQgJiAweEZDOwotICAgIHZhbCA9IHJlYWRQY2koU2xvdCB8IG9mZnNldCk7Ci0gICAgdmFsICY9IH4oQ0FSRDMyKSgweGZmZmYgPDwgKHNoaWZ0IDw8IDMpKTsKLSAgICB2YWwgfD0gd29yZCA8PCAoc2hpZnQgPDwgMyk7Ci0gICAgd3JpdGVQY2koU2xvdCB8IG9mZnNldCwgdmFsKTsKLX0KLQotdm9pZAotUGNpV3JpdGUzMihpbnQgb2Zmc2V0LCBDQVJEMzIgbGcsIENBUkQzMiBTbG90KQotewotICAgIG9mZnNldCA9IG9mZnNldCAmIDB4RkM7Ci0gICAgd3JpdGVQY2koU2xvdCB8IG9mZnNldCwgbGcpOwotfQotCi1pbnQKLW1hcFBjaVJvbShQY2lTdHJ1Y3RQdHIgcGNpUCkKLXsKLSAgICB1bnNpZ25lZCBsb25nIFJvbUJhc2UgPSAwOwotICAgIGludCBtZW1fZmQ7Ci0gICAgdW5zaWduZWQgY2hhciAqbWVtLCAqcHRyOwotICAgIHVuc2lnbmVkIGNoYXIgKnNjcmF0Y2ggPSBOVUxMOwotICAgIGludCBsZW5ndGggPSAwOwotICAgIENBUkQzMiBiaW9zU2l6ZSA9IDB4MTAwMDAwMDsKLSAgICBDQVJEMzIgZW5hYmxlUGNpOwotCi0gICAgaWYgKCFwY2lQKQotICAgICAgcGNpUCA9IEN1cnJlbnRQY2k7Ci0KLSAgICBpZiAoRklYX1JPTSkgewotCVJvbUJhc2UgPSBmaW5kQklPU01hcChwY2lQLCAmYmlvc1NpemUpOwotCWlmICghUm9tQmFzZSkgewotCSAgICBmcHJpbnRmKHN0ZGVyciwiQ2Fubm90IHJlbWFwIEJJT1Mgb2YgJWk6JWk6JWkgIgotCQkgICAgIi0gdHJ5aW5nIHByZXNldCBhZGRyZXNzXG4iLHBjaVAtPmJ1cyxwY2lQLT5kZXYsCi0JCSAgICBwY2lQLT5mdW5jKTsKLQkgICAgUm9tQmFzZSA9IHBjaVAtPlJvbUJhc2UgJiB+KENBUkQzMikweEZGOwotCX0KLSAgICB9ICBlbHNlIHsKLQlSb21CYXNlID0gcGNpUC0+Um9tQmFzZSAmIH4oQ0FSRDMyKTB4RkY7Ci0JaWYgKH5Sb21CYXNlICsgMSA8IGJpb3NTaXplIHx8ICFSb21CYXNlKQotCSAgICBSb21CYXNlID0gZmluZEJJT1NNYXAocGNpUCwgJmJpb3NTaXplKTsKLSAgICB9Ci0KLSAgICBQX3ByaW50ZigiUm9tQmFzZTogMHglbHhcbiIsUm9tQmFzZSk7Ci0KLSAgICBpZiAoKG1lbV9mZCA9IG9wZW4oTUVNX0ZJTEUsT19SRE9OTFkpKTwwKSB7Ci0JcGVycm9yKCJvcGVuaW5nIG1lbW9yeSIpOwotCXJlc3RvcmVNZW0ocGNpUCk7Ci0JcmV0dXJuICgwKTsKLSAgICB9Ci0KLSAgICBQY2lXcml0ZTMyKDB4MzAsUm9tQmFzZSB8IDEscGNpUC0+U2xvdC5sKTsKLQotI2lmZGVmIF9fYWxwaGFfXwotICAgIG1lbSA9IHB0ciA9ICh1bnNpZ25lZCBjaGFyICopbW1hcCgwLCBiaW9zU2l6ZSwgUFJPVF9SRUFELAotCQkJCSAgICAgIE1BUF9TSEFSRUQsIG1lbV9mZCwgUm9tQmFzZSB8IF9idXNfYmFzZSgpKTsKLSNlbHNlCi0gICAgbWVtID0gcHRyID0gKHVuc2lnbmVkIGNoYXIgKiltbWFwKDAsIGJpb3NTaXplLCBQUk9UX1JFQUQsCi0JCQkJICAgICAgTUFQX1NIQVJFRCwgbWVtX2ZkLCBSb21CYXNlKTsKLSNlbmRpZgotICAgIGlmIChwY2lQICE9IEN1cnJlbnRQY2kpIHsKLSAgICAgIGVuYWJsZVBjaSA9IFBjaVJlYWQzMigweDQscGNpUC0+U2xvdC5sKTsKLSAgICAgIFBjaVdyaXRlMzIoMHg0LGVuYWJsZVBjaSB8IDB4MixwY2lQLT5TbG90LmwpOwotICAgIH0KLQotI2lmZGVmIFBSSU5UX1BDSQotICAgIGRwcmludCgodW5zaWduZWQgbG9uZylwdHIsMHgzMCk7Ci0jZW5kaWYKLSAgICB3aGlsZSAoICpwdHIgPT0gMHg1NSAmJiAqKHB0cisxKSA9PSAweEFBKSB7Ci0JdW5zaWduZWQgc2hvcnQgZGF0YV9vZmYgPSAqKHB0cisweDE4KSB8ICgqKHB0cisweDE5KTw8IDgpOwotCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSBwdHIgKyBkYXRhX29mZjsKLQl1bnNpZ25lZCBjaGFyIHR5cGU7Ci0JaW50IGk7Ci0KLQlpZiAoKmRhdGEhPSdQJyB8fCAqKGRhdGErMSkhPSdDJyB8fCAqKGRhdGErMikhPSdJJyB8fCAqKGRhdGErMykhPSdSJykgewotCSAgICBicmVhazsKLQl9Ci0JdHlwZSA9ICooZGF0YSArIDB4MTQpOwotCVBfcHJpbnRmKCJkYXRhIHNlZ21lbnQgaW4gQklPUzogMHgleCwgdHlwZTogMHgleCAiLGRhdGFfb2ZmLHR5cGUpOwotCi0JaWYgKHR5cGUgIT0gMCkgIHsgLyogbm90IFBDLUFUIGltYWdlOiBmaW5kIG5leHQgb25lICovCi0JICAgIHVuc2lnbmVkIGludCBpbWFnZV9sZW5ndGg7Ci0JICAgIHVuc2lnbmVkIGNoYXIgaW5kaWNhdG9yID0gKihkYXRhICsgMHgxNSk7Ci0JICAgIGlmIChpbmRpY2F0b3IgJiAweDgwKSAvKiBsYXN0IGltYWdlICovCi0JCWJyZWFrOwotCSAgICBpbWFnZV9sZW5ndGggPSAoKihkYXRhICsgMHgxMCkKLQkJCSAgICB8ICgqKGRhdGEgKyAweDExKSA8PCA4KSkgPDwgOTsKLQkgICAgUF9wcmludGYoImRhdGEgaW1hZ2UgbGVuZ3RoOiAweCV4LCBpbmQ6IDB4JXhcbiIsCi0JCSAgICAgaW1hZ2VfbGVuZ3RoLGluZGljYXRvcik7Ci0JICAgIHB0ciA9IHB0ciArIGltYWdlX2xlbmd0aDsKLQkgICAgY29udGludWU7Ci0JfQotCS8qIE9LLCB3ZSBoYXZlIGEgUEMgSW1hZ2UgKi8KLQlsZW5ndGggPSAoKihwdHIgKyAyKSA8PCA5KTsKLQlQX3ByaW50ZigiQklPUyBsZW5ndGg6IDB4JXhcbiIsbGVuZ3RoKTsKLQlzY3JhdGNoID0gKHVuc2lnbmVkIGNoYXIgKiltYWxsb2MobGVuZ3RoKTsKLQkvKiBkb24ndCB1c2UgbWVtY3B5KCkgaGVyZTogUmVhZGluZyBmcm9tIGJ1cyEgKi8KLQlmb3IgKGk9MDtpPGxlbmd0aDtpKyspCi0JICAgICooc2NyYXRjaCArIGkpPSoocHRyICsgaSk7Ci0JYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKHBjaVAgIT0gQ3VycmVudFBjaSkKLSAgICAgIFBjaVdyaXRlMzIoMHg0LGVuYWJsZVBjaSxwY2lQLT5TbG90LmwpOwotCi0gICAgLyogdW5tYXAvY2xvc2UvZGlzYWJsZSBQQ0kgYmlvcyBtZW0gKi8KLSAgICBtdW5tYXAobWVtLCBiaW9zU2l6ZSk7Ci0gICAgY2xvc2UobWVtX2ZkKTsKLSAgICAvKiBkaXNhYmxlIGFuZCByZXN0b3JlIG1hcHBpbmcgKi8KLSAgICB3cml0ZVBjaShwY2lQLT5TbG90LmwgfCAweDMwLCBwY2lQLT5Sb21CYXNlICYgfihDQVJEMzIpMSk7Ci0KLSAgICBpZiAoc2NyYXRjaCAmJiBsZW5ndGgpIHsKLQltZW1jcHkoKHVuc2lnbmVkIGNoYXIgKilWX0JJT1MsIHNjcmF0Y2gsIGxlbmd0aCk7Ci0JZnJlZShzY3JhdGNoKTsKLSAgICB9Ci0KLSAgICByZXN0b3JlTWVtKHBjaVApOwotICAgIHJldHVybiBsZW5ndGg7Ci19Ci0KLUNBUkQzMgotZmluZFBjaShDQVJEMTYgc2xvdEJYKQotewotICAgIENBUkQzMiBzbG90ID0gc2xvdEJYIDw8IDg7Ci0KLSAgICBpZiAoc2xvdCA9PSAoQ3VycmVudFBjaS0+U2xvdC5sICYgflBDSV9FTikpCi0JcmV0dXJuIChDdXJyZW50UGNpLT5TbG90LmwgfCBQQ0lfRU4pOwotICAgIGVsc2UgewotI2lmICFTSE9XX0FMTF9ERVYKLQlQY2lCdXNQdHIgcEJ1cyA9IEN1cnJlbnRQY2ktPnBCdXM7Ci0Jd2hpbGUgKHBCdXMpIHsKLQkgIC8qICAgICAgZnByaW50ZihzdGRlcnIsInNsb3Q6IDB4JXggIGJyaWRnZTogMHgleFxuIixzbG90LCBwQnVzLT5TbG90LmwpOyAqLwotCSAgICBpZiAoc2xvdCA9PSAocEJ1cy0+U2xvdC5sICYgflBDSV9FTikpCi0JCXJldHVybiBwQnVzLT5TbG90LmwgfCBQQ0lfRU47Ci0JICAgIHBCdXMgPSBwQnVzLT5uZXh0OwotCX0KLSNlbHNlCi0JUGNpU3RydWN0UHRyIHBQY2kgPSBQY2lTdHJ1Y3Q7Ci0Jd2hpbGUgKHBQY2kpIHsKLQkgIC8qZnByaW50ZihzdGRlcnIsInNsb3Q6IDB4JXggIGJyaWRnZTogMHgleFxuIixzbG90LCBwUGNpLT5TbG90LmwpOyAqLwotCSAgICBpZiAoc2xvdCA9PSAocFBjaS0+U2xvdC5sICYgflBDSV9FTikpCi0JCXJldHVybiBwUGNpLT5TbG90LmwgfCBQQ0lfRU47Ci0JICAgIHBQY2kgPSBwUGNpLT5uZXh0OwotCX0KLSNlbmRpZgotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotQ0FSRDE2Ci1wY2lTbG90QlgoUGNpU3RydWN0UHRyIHBQY2kpCi17Ci0gICAgcmV0dXJuIChDQVJEMTYpKChwUGNpLT5TbG90LmwgPj4gOCkgJiAweEZGRkYpOwotfQotCi1QY2lTdHJ1Y3RQdHIKLWZpbmRQY2lEZXZpY2UoQ0FSRDE2IHZlbmRvcklELCBDQVJEMTYgZGV2aWNlSUQsIGNoYXIgbikKLXsKLSAgICBQY2lTdHJ1Y3RQdHIgcFBjaSA9IEN1cnJlbnRQY2k7Ci0gICAgbisrOwotCi0gICAgd2hpbGUgKHBQY2kpICB7Ci0JaWYgKChwUGNpLT5WZW5kb3JJRCA9PSB2ZW5kb3JJRCkgJiYgKHBQY2ktPkRldmljZUlEID09IGRldmljZUlEKSkgewotCWlmICghKC0tbikpIGJyZWFrOwotCX0KLSAgICBwUGNpID0gcFBjaS0+bmV4dDsKLSAgICB9Ci0gICAgcmV0dXJuIHBQY2k7Ci19Ci0KLVBjaVN0cnVjdFB0cgotZmluZFBjaUNsYXNzKENBUkQ4IGludGYsIENBUkQ4IHN1YkNsYXNzLCBDQVJEMTYgY2xhc3MsIGNoYXIgbikKLXsKLSAgICBQY2lTdHJ1Y3RQdHIgcFBjaSA9IEN1cnJlbnRQY2k7Ci0gICAgbisrOwotCi0gICAgd2hpbGUgKHBQY2kpICB7Ci0JaWYgKChwUGNpLT5JbnRlcmZhY2UgPT0gaW50ZikgJiYgKHBQY2ktPlN1YkNsYXNzID09IHN1YkNsYXNzKQotCSAmJiAocFBjaS0+QmFzZUNsYXNzID09IGNsYXNzKSkgewotCWlmICghKC0tbikpIGJyZWFrOwotCX0KLSAgICBwUGNpID0gcFBjaS0+bmV4dDsKLSAgICB9Ci0gICAgcmV0dXJuIHBQY2k7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZWFkQ29uZmlnU3BhY2VDZmcxKENBUkQzMiBidXMsIENBUkQzMiBkZXYsIENBUkQzMiBmdW5jLCBDQVJEMzIgKnJlZykKLXsKLSAgICBDQVJEMzIgICBjb25maWdfY21kID0gUENJX0VOIHwgKGJ1czw8MTYpIHwKLSAgICAgIChkZXY8PDExKSB8IChmdW5jPDw4KTsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGk8NjQ7aSs9NCkgewotI2lmZGVmIF9fYWxwaGFfXwotCXJlZ1tpXSA9IGF4cFBjaUNmZ1JlYWQoY29uZmlnX2NtZCB8IGkpOwotI2Vsc2UKLQlvdXRsKFBDSV9NT0RFMV9BRERSRVNTX1JFRywgY29uZmlnX2NtZCB8IGkpOwotCXJlZ1tpXSA9IGlubChQQ0lfTU9ERTFfREFUQV9SRUcpOwotI2VuZGlmCi0KLSNpZmRlZiBWODZCSU9TX0RFQlVHCi0JUF9wcmludGYoIjB4JWx4XG4iLHJlZ1tpXSk7Ci0jZW5kaWYKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQKLWNoZWNrU2xvdENmZzEoQ0FSRDMyIGJ1cywgQ0FSRDMyIGRldiwgQ0FSRDMyIGZ1bmMpCi17Ci0gICAgQ0FSRDMyICAgIGNvbmZpZ19jbWQgPSBQQ0lfRU4gfCAoYnVzPDwxNikgfAotICAgICAgKGRldjw8MTEpIHwgKGZ1bmM8PDgpOwotICAgIENBUkQzMiByZWc7Ci0jaWZkZWYgX19hbHBoYV9fCi0JcmVnID0gYXhwUGNpQ2ZnUmVhZChjb25maWdfY21kKTsKLSNlbHNlCi0Jb3V0bChQQ0lfTU9ERTFfQUREUkVTU19SRUcsIGNvbmZpZ19jbWQpOwotCXJlZyA9IGlubChQQ0lfTU9ERTFfREFUQV9SRUcpOwotI2VuZGlmCi0gICAgaWYgKHJlZyAhPSAweEZGRkZGRkZGKQotCXJldHVybiAxOwotICAgIGVsc2UKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotY2hlY2tTbG90Q2ZnMihDQVJEMzIgYnVzLCBpbnQgZGV2KQotewotICAgIENBUkQzMiB2YWw7Ci0KLSAgICBvdXRiKFBDSV9NT0RFMl9FTkFCTEVfUkVHLCAweEYxKTsKLSAgICBvdXRiKFBDSV9NT0RFMl9GT1JXQVJEX1JFRywgYnVzKTsKLSAgICB2YWwgPSBpbmwoZGV2IDw8IDgpOwotICAgIG91dGIoUENJX01PREUyX0ZPUldBUkRfUkVHLCAweDAwKTsKLSAgICBvdXRiKFBDSV9NT0RFMl9FTkFCTEVfUkVHLCAweDAwKTsKLSAgICBpZiAodmFsID09IDB4RkZGRkZGRkYpCi0JcmV0dXJuIDA7Ci0gICAgaWYgKHZhbCA9PSAweEYwRjBGMEYwKQotCXJldHVybiAwOwotICAgIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotcmVhZENvbmZpZ1NwYWNlQ2ZnMihDQVJEMzIgYnVzLCBpbnQgZGV2LCBDQVJEMzIgKnJlZykKLXsKLSAgICBpbnQgaTsKLQotICAgIG91dGIoUENJX01PREUyX0VOQUJMRV9SRUcsIDB4RjEpOwotICAgIG91dGIoUENJX01PREUyX0ZPUldBUkRfUkVHLCBidXMpOwotICAgIGZvciAoaSA9IDA7IGk8NjQ7aSs9NCkgewotCXJlZ1tpXSA9IGlubCgoZGV2IDw8IDgpICsgaSk7Ci0jaWZkZWYgVjg2QklPU19ERUJVRwotCVBfcHJpbnRmKCIweCVseFxuIixyZWdbaV0pOwotI2VuZGlmCi0gICAgfQotICAgIG91dGIoUENJX01PREUyX0VOQUJMRV9SRUcsIDB4MDApOwotfQotCi1zdGF0aWMgQ0FSRDgKLWludGVycHJldENvbmZpZ1NwYWNlKENBUkQzMiAqcmVnLCBpbnQgYnVzaWR4LCBDQVJEOCBkZXYsIENBUkQ4IGZ1bmMpCi17Ci0gICAgQ0FSRDMyIGNvbmZpZ19jbWQ7Ci0gICAgQ0FSRDE2IHZlbmRvciwgZGV2aWNlOwotICAgIENBUkQ4IGJhc2VjbGFzcywgc3ViY2xhc3M7Ci0gICAgQ0FSRDggcHJpbWFyeSwgc2Vjb25kYXJ5OwotICAgIENBUkQ4IGhlYWRlciwgaW50ZXJmYWNlOwotICAgIGludCBpOwotCi0gICAgY29uZmlnX2NtZCA9IFBDSV9FTiB8IGJ1c2lkeDw8MTYgfAotCShkZXY8PDExKSB8IChmdW5jPDw4KTsKLQotICAgIGZvciAoaSA9IDB4MTA7IGkgPCAweDI4OyBpKz00KSB7Ci0JaWYgKElTX01FTTMyKHJlZ1tpXSkpCi0JICAgIGlmICgocmVnW2ldICYgMHhGRkZGRkZGMCkgPCBwY2lNaW5NZW1SZWcpCi0JCXBjaU1pbk1lbVJlZyA9IChyZWdbaV0gJiAweEZGRkZGRkYwKTsKLSNpZmRlZiBfX2FscGhhX18KLQlpZiAoSVNfTUVNNjQocmVnW2ldKSkgewotCQl1bnNpZ25lZCBsb25nIGFkZHIgPSByZWdbaV0gfAotCSAgICAgICh1bnNpZ25lZCBsb25nKShyZWdbaSs0XSkgPDwgMzI7Ci0JICAgIGlmICgoYWRkciAmIH4weGZMKSA8IHBjaU1pbk1lbVJlZykKLQkJcGNpTWluTWVtUmVnID0gKGFkZHIgJiB+MHhmTCk7Ci0JICAgIGkrPTQ7Ci0JfQotI2VuZGlmCi0gICAgfQotICAgIHZlbmRvciA9IHJlZ1swXSAmIDB4RkZGRjsKLSAgICBkZXZpY2UgPSByZWdbMF0gPj4gMTY7Ci0gICAgUF9wcmludGYoImJ1czogJWkgY2FyZDogJWkgZnVuYyAlaSByZWcwOiAweCV4ICIsIGJ1c2lkeCxkZXYsZnVuYyxyZWdbMF0pOwotICAgIGJhc2VjbGFzcyA9IHJlZ1s4XSA+PiAyNDsKLSAgICBzdWJjbGFzcyA9IChyZWdbOF0gPj4gMTYpICYgMHhGRjsKLSAgICBpbnRlcmZhY2UgPSAocmVnWzhdID4+IDgpICYgMHhGRjsKLQotICAgIGhlYWRlciA9IChyZWdbMHgwY10gPj4gMTYpICYgMHhmZjsKLSAgICBQX3ByaW50ZigiYmMgMHgleCwgc3ViIDB4JXgsIGlmIDB4JXgsIGhkciAweCV4XG4iLAotCSAgICAgYmFzZWNsYXNzLHN1YmNsYXNzLGludGVyZmFjZSxoZWFkZXIpOwotICAgIGlmIChCUklER0VfQ0xBU1MoYmFzZWNsYXNzKSkgewotCWlmIChCUklER0VfUENJX0NMQVNTKHN1YmNsYXNzKSkgewotCSAgICBQY2lCdXNQdHIgcGJwID0gbWFsbG9jKHNpemVvZihQY2lCdXNSZWMpKTsKLQkgICAgUF9wcmludGYoIlBjaS1QY2kgQnJpZGdlIGZvdW5kOyAiKTsKLQkgICAgcHJpbWFyeSA9IHJlZ1sweDE4XSAmIDB4RkY7Ci0JICAgIHNlY29uZGFyeSA9IChyZWdbMHgxOF0gPj4gOCkgJiAweEZGOwotCSAgICBQX3ByaW50ZigicHJpbWFyeTogMHgleCBzZWNvbmRhcnk6IDB4JXhcbiIsCi0JCSAgICAgcHJpbWFyeSxzZWNvbmRhcnkpOwotCSAgICBwYnAtPmJjdGwgPSByZWdbMHgzY107Ci0JICAgIHBicC0+cHJpbWFyeSA9IHByaW1hcnk7Ci0JICAgIHBicC0+c2Vjb25kYXJ5ID0gc2Vjb25kYXJ5OwotCSAgICBwYnAtPlNsb3QubCA9IGNvbmZpZ19jbWQ7Ci0JICAgIHBicC0+bmV4dCA9IFBjaUJ1c2VzOwotCSAgICBQY2lCdXNlcyA9IHBicDsKLQkgICAgbnVtYnVzKys7Ci0JfSBlbHNlIGlmIChCUklER0VfSE9TVF9DTEFTUyhzdWJjbGFzcykKLQkJICAgJiYgKGhvc3RicmlkZ2VzKysgPiAxKSkgewotCSAgICBudW1idXMrKzsKLQl9Ci0gICAgfSBlbHNlIGlmIChWSURFT19DTEFTUyhiYXNlY2xhc3Msc3ViY2xhc3MpKSB7Ci0JUGNpU3RydWN0UHRyIHBjcCA9IG1hbGxvYyhzaXplb2YoUGNpU3RydWN0UmVjKSk7Ci0JUF9wcmludGYoIkRpc3BsYXkgYWRhcHRlciBmb3VuZFxuIik7Ci0JcGNwLT5Sb21CYXNlID0gcmVnWzB4MzBdOwotCXBjcC0+Y21kX3N0ID0gcmVnWzRdOwotCXBjcC0+YWN0aXZlID0gKHJlZ1s0XSAmIDB4MDMpID09IDMgPyAxIDogMDsKLQlwY3AtPlZlbmRvcklEID0gdmVuZG9yOwotCXBjcC0+RGV2aWNlSUQgPSBkZXZpY2U7Ci0JcGNwLT5JbnRlcmZhY2UgPSBpbnRlcmZhY2U7Ci0JcGNwLT5CYXNlQ2xhc3MgPSBiYXNlY2xhc3M7Ci0JcGNwLT5TdWJDbGFzcyA9IHN1YmNsYXNzOwotCXBjcC0+U2xvdC5sID0gY29uZmlnX2NtZDsKLQlwY3AtPmJ1cyA9IGJ1c2lkeDsKLQlwY3AtPmRldiA9IGRldjsKLQlwY3AtPmZ1bmMgPSBmdW5jOwotCXBjcC0+bmV4dCA9IFBjaVN0cnVjdDsKLQlQY2lTdHJ1Y3QgPSBwY3A7Ci0gICAgfQotICAgIGlmICgoZnVuYyA9PSAwKQotCSYmICgoaGVhZGVyICYgUENJX01VTFRJRlVOQ19ERVYpID09IDApKQotCWZ1bmMgPSA4OwotICAgIGVsc2UKLQlmdW5jKys7Ci0gICAgcmV0dXJuIGZ1bmM7Ci19Ci0KLXN0YXRpYyBDQVJEMzIgcmVtYXBNRU1fdmFsOwotc3RhdGljIGludCByZW1hcE1FTV9udW07Ci0KLXN0YXRpYyBpbnQgLyogbWFwIGl0IG9uIHNvbWUgb3RoZXIgdmlkZW8gZGV2aWNlICovCi1yZW1hcE1lbShQY2lTdHJ1Y3RQdHIgcGNpUCwgaW50IG51bSwgQ0FSRDMyIHNpemUpCi17Ci0gICAgUGNpU3RydWN0UHRyIHBjaVB0ciA9IFBjaVN0cnVjdDsKLSAgICBpbnQgaTsKLSAgICBDQVJEMzIgb3JnOwotICAgIENBUkQzMiB2YWw7Ci0gICAgQ0FSRDMyIHNpemVfbjsKLQotICAgIG9yZyA9IFBjaVJlYWQzMihudW0gKyAweDEwLHBjaVAtPlNsb3QubCk7Ci0KLSAgICB3aGlsZSAocGNpUHRyKSB7Ci0JZm9yIChpID0gMDsgaSA8IDIwOyBpPWkrNCkgewotCi0JICAgIHZhbCA9IFBjaVJlYWQzMihpICsgMHgxMCxwY2lQdHItPlNsb3QubCk7Ci0JICAgIC8qIGRvbid0IG1hcCBpdCBvbiBpdHNlbGYgKi8KLQkgICAgaWYgKChvcmcgJiAweGZmZmZmZmYwKSA9PSAodmFsICYgMHhmZmZmZmZmMCkpCi0JCWNvbnRpbnVlOwotCSAgICBpZiAodmFsICYmICEodmFsICYgMSkpCi0JCVBjaVdyaXRlMzIoaSArIDB4MTAsMHhmZmZmZmZmZixwY2lQdHItPlNsb3QubCk7Ci0JICAgIGVsc2UKLQkJY29udGludWU7Ci0JICAgIHNpemVfbiA9IFBjaVJlYWQzMihpICsgMHgxMCxwY2lQdHItPlNsb3QubCk7Ci0JICAgIFBjaVdyaXRlMzIoaSArIDB4MTAsdmFsLHBjaVB0ci0+U2xvdC5sKTsKLQkgICAgc2l6ZV9uID0gfihDQVJEMzIpKHNpemVfbiAgJiAweGZmZmZmZmYwKSArIDE7Ci0KLQkgICAgaWYgKHNpemVfbiA+PSBzaXplKSB7Ci0JCVBjaVdyaXRlMzIobnVtICsgMHgxMCx2YWwscGNpUC0+U2xvdC5sKTsKLQkJcmV0dXJuIDE7Ci0JICAgIH0KLQl9Ci0JcGNpUHRyID0gcGNpUHRyLT5uZXh0OwotICAgIH0KLSAgICAvKiBsYXN0IHJlc29ydDogdHJ5IHRvIGdvIGJlbG93IGxvd2VzdCBQQ0kgbWVtIGFkZHJlc3MgKi8KLSAgICB2YWwgPSAoKHBjaU1pbk1lbVJlZyAmIH4oQ0FSRDMyKShzaXplIC0gMSkpIC0gc2l6ZSk7Ci0gICAgaWYgKHZhbCA+IDB4N2ZmZmZmZmYpIHsKLQlQY2lXcml0ZTMyKG51bSArIDB4MTAsdmFsLCBwY2lQLT5TbG90LmwpOwotCXJldHVybiAxOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotcmVzdG9yZU1lbShQY2lTdHJ1Y3RQdHIgcGNpUCkKLXsKLSAgICBpZiAocmVtYXBNRU1fdmFsID09IDApIHJldHVybjsKLSAgICBQY2lXcml0ZTMyKHJlbWFwTUVNX251bSArIDB4MTAscmVtYXBNRU1fdmFsLHBjaVAtPlNsb3QubCk7Ci0gICAgcmV0dXJuOwotfQotCi1zdGF0aWMgQ0FSRDMyCi1maW5kQklPU01hcChQY2lTdHJ1Y3RQdHIgcGNpUCwgQ0FSRDMyICpiaW9zU2l6ZSkKLXsKLSAgICBQY2lTdHJ1Y3RQdHIgcGNpUHRyID0gUGNpU3RydWN0OwotICAgIGludCBpOwotICAgIENBUkQzMiB2YWw7Ci0gICAgQ0FSRDMyIHNpemU7Ci0KLSAgICBQY2lXcml0ZTMyKDB4MzAsMHhmZmZmZmZmZixwY2lQLT5TbG90LmwpOwotICAgICpiaW9zU2l6ZSA9IFBjaVJlYWQzMigweDMwLHBjaVAtPlNsb3QubCk7Ci0gICAgUF9wcmludGYoImJpb3Mgc2l6ZTogMHgleFxuIiwqYmlvc1NpemUpOwotICAgIFBjaVdyaXRlMzIoMHgzMCxwY2lQLT5Sb21CYXNlLHBjaVAtPlNsb3QubCk7Ci0gICAgKmJpb3NTaXplID0gfigqYmlvc1NpemUgJiAweEZGRkZGRjAwKSArIDE7Ci0gICAgUF9wcmludGYoImJpb3Mgc2l6ZSBtYXNrZWQ6IDB4JXhcbiIsKmJpb3NTaXplKTsKLSAgICBpZiAoKmJpb3NTaXplID4gKDEwMjQgKiAxMDI0ICogMTYpKSB7Ci0gICAgICAqYmlvc1NpemUgPSAxMDI0ICogMTAyNCAqIDE2OwotICAgICAgUF9wcmludGYoImZpeGluZyBicm9rZW4gQklPUyBzaXplOiAweCV4XG4iLCpiaW9zU2l6ZSk7Ci0gICAgfQotICAgIHdoaWxlIChwY2lQdHIpIHsKLQlpZiAocGNpUHRyLT5idXMgIT0gcGNpUC0+YnVzKSB7Ci0JICAgIHBjaVB0ciA9IHBjaVB0ci0+bmV4dDsKLQkgICAgY29udGludWU7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCAyMDsgaT1pKzQpIHsKLQotCSAgICB2YWwgPSBQY2lSZWFkMzIoaSArIDB4MTAscGNpUHRyLT5TbG90LmwpOwotCSAgICBpZiAoISh2YWwgJiAxKSkKLQotCSAgICBQY2lXcml0ZTMyKGkgKyAweDEwLDB4ZmZmZmZmZmYscGNpUHRyLT5TbG90LmwpOwotCSAgICBlbHNlCi0JCWNvbnRpbnVlOwotCSAgICBzaXplID0gUGNpUmVhZDMyKGkgKyAweDEwLHBjaVB0ci0+U2xvdC5sKTsKLQkgICAgUGNpV3JpdGUzMihpICsgMHgxMCx2YWwscGNpUHRyLT5TbG90LmwpOwotCSAgICBzaXplID0gfihDQVJEMzIpKHNpemUgJiAweEZGRkZGRkYwKSArIDE7Ci0jaWZkZWYgVjg2X0JJT1NfREVCVUcKLQkgICAgUF9wcmludGYoInNpemU6IDB4JXhcbiIsc2l6ZSk7Ci0jZW5kaWYKLQkgICAgaWYgKHNpemUgPj0gKmJpb3NTaXplKSB7Ci0JCWlmIChwY2lQID09IHBjaVB0cikgeyAvKiBpZiBzYW1lIGRldmljZSByZW1hcCByYW0qLwotCQkgICAgaWYgKCEocmVtYXBNZW0ocGNpUCxpLHNpemUpKSkKLQkJCWNvbnRpbnVlOwotCQkgICAgcmVtYXBNRU1fdmFsID0gdmFsOwotCQkgICAgcmVtYXBNRU1fbnVtID0gaTsKLQkJfSBlbHNlIHsKLQkJICAgIHJlbWFwTUVNX3ZhbCA9IDA7Ci0JCX0KLQkJcmV0dXJuIHZhbCAmIDB4RkZGRkZGMDA7Ci0JICAgIH0KLQl9Ci0JcGNpUHRyID0gcGNpUHRyLT5uZXh0OwotICAgIH0KLSAgICByZW1hcE1FTV92YWwgPSAwOwotICAgIC8qIHZlcnkgbGFzdCByZXNvcnQgKi8KLSAgICBpZiAocGNpUC0+YnVzID09IDAgJiYgKHBjaU1pbk1lbVJlZyA+ICpiaW9zU2l6ZSkpCi0gICAgICByZXR1cm4gKHBjaU1pbk1lbVJlZyAtIHNpemUpICYgfihzaXplIC0gMSk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50Ci1jZmcxb3V0KENBUkQxNiBhZGRyLCBDQVJEMzIgdmFsKQotewotICBpZiAoYWRkciA9PSAweENGOCkgewotICAgIFBjaUNmZzFBZGRyID0gdmFsOwotICAgIHJldHVybiAxOwotICB9IGVsc2UgaWYgKGFkZHIgPT0gMHhDRkMpIHsKLSAgICB3cml0ZVBjaShQY2lDZmcxQWRkciwgdmFsKTsKLSAgICByZXR1cm4gMTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotaW50Ci1jZmcxaW4oQ0FSRDE2IGFkZHIsIENBUkQzMiAqdmFsKQotewotICBpZiAoYWRkciA9PSAweENGOCkgewotICAgICp2YWwgPSBQY2lDZmcxQWRkcjsKLSAgICByZXR1cm4gMTsKLSAgfSBlbHNlIGlmIChhZGRyID09IDB4Q0ZDKSB7Ci0gICAgKnZhbCA9IHJlYWRQY2koUGNpQ2ZnMUFkZHIpOwotICAgIHJldHVybiAxOwotICB9Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1saXN0X3BjaSh2b2lkKQotewotICAgIFBjaVN0cnVjdFB0ciBwY2kgPSBQY2lMaXN0OwotCi0gICAgd2hpbGUgKHBjaSkgewotICAgIHByaW50ZigiWzB4JXg6MHgleDoweCV4XSB2ZW5kb3I6IDB4JTQuNHggZGV2OiAweCU0LjR4IGNsYXNzOiAweCU0LjR4IgotCSAgICIgc3ViY2xhc3M6IDB4JTQuNHhcbiIscGNpLT5idXMscGNpLT5kZXYscGNpLT5mdW5jLAotCSAgIHBjaS0+VmVuZG9ySUQscGNpLT5EZXZpY2VJRCxwY2ktPkJhc2VDbGFzcyxwY2ktPlN1YkNsYXNzKTsKLSAgICBwY2kgPSBwY2ktPm5leHQ7Ci0gICAgfQotfQotCi1QY2lTdHJ1Y3RQdHIKLWZpbmRQY2lCeUlEcyhpbnQgYnVzLCBpbnQgZGV2LCBpbnQgZnVuYykKLXsKLSAgUGNpU3RydWN0UHRyIHBjaVAgPSBQY2lMaXN0OwotCi0gIHdoaWxlIChwY2lQKSB7Ci0gICAgaWYgKHBjaVAtPmJ1cyA9PSBidXMgJiYgcGNpUC0+ZGV2ID09IGRldiAmJiBwY2lQLT5mdW5jID09IGZ1bmMpCi0gICAgICByZXR1cm4gcGNpUDsKLSAgICBwY2lQID0gcGNpUC0+bmV4dDsKLSAgfQotICByZXR1cm4gTlVMTDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvcGNpLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3BjaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGFkNTIyLi4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3MvcGNpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAxOTk5IEVnYmVydCBFaWNoCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi0gKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAotICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Ci0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCi0gKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZCBpbgotICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0Ci0gKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zCi0gKiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZAotICogImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSAqCi0gKiBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSAqIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKLSAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKLSAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLSNpbmNsdWRlICJ2ODZiaW9zLmgiCi0KLSNpZm5kZWYgVjg2X1BDSV9ICi0jZGVmaW5lIFY4Nl9QQ0lfSAotCi10eXBlZGVmIHVuaW9uIHsKLSAgICBzdHJ1Y3QgewotCXVuc2lnbmVkIGludCAgICB6ZXJvOjI7Ci0JdW5zaWduZWQgaW50ICAgIHJlZzo2OwotCXVuc2lnbmVkIGludCAgICBmdW5jOjM7Ci0JdW5zaWduZWQgaW50ICAgIGRldjo1OwotCXVuc2lnbmVkIGludCAgICBidXM6ODsKLQl1bnNpZ25lZCBpbnQgICAgcmVzZXJ2ZWQ6NzsKLQl1bnNpZ25lZCBpbnQgICAgZW5hYmxlOjE7Ci0gICAgfSBwY2k7Ci0gICAgQ0FSRDMyIGw7Ci19IFBjaVNsb3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHBjaUJ1c1JlYyB7Ci0gICAgQ0FSRDggcHJpbWFyeTsKLSAgICBDQVJEOCBzZWNvbmRhcnk7Ci0gICAgQ0FSRDMyIGJjdGw7Ci0gICAgUGNpU2xvdCBTbG90OwotICAgIHN0cnVjdCBwY2lCdXNSZWMgKm5leHQ7Ci0gICAgc3RydWN0IHBjaUJ1c1JlYyAqcEJ1czsKLX0gUGNpQnVzUmVjLCAqUGNpQnVzUHRyOwotCi10eXBlZGVmIHN0cnVjdCBwY2lTdHJ1Y3RSZWMgewotICAgIENBUkQxNiBWZW5kb3JJRDsKLSAgICBDQVJEMTYgRGV2aWNlSUQ7Ci0gICAgQ0FSRDggSW50ZXJmYWNlOwotICAgIENBUkQ4IEJhc2VDbGFzczsKLSAgICBDQVJEOCBTdWJDbGFzczsKLSAgICBDQVJEMzIgUm9tQmFzZTsKLSAgICBDQVJEMzIgYnVzOwotICAgIENBUkQ4IGRldjsKLSAgICBDQVJEOCBmdW5jOwotICAgIENBUkQzMiBjbWRfc3Q7Ci0gICAgaW50IGFjdGl2ZTsKLSAgICBQY2lTbG90IFNsb3Q7Ci0gICAgc3RydWN0IHBjaVN0cnVjdFJlYyAqbmV4dDsKLSAgICBQY2lCdXNQdHIgcEJ1czsKLX0gUGNpU3RydWN0UmVjICwgKlBjaVN0cnVjdFB0cjsKLQotCi1leHRlcm4gUGNpU3RydWN0UHRyIEN1cnJlbnRQY2k7Ci1leHRlcm4gUGNpU3RydWN0UHRyIFBjaUxpc3Q7Ci1leHRlcm4gUGNpU3RydWN0UHRyIEJvb3RCaW9zOwotZXh0ZXJuIGludCBwY2lNYXhCdXM7Ci0KLWV4dGVybiBDQVJEMzIgZmluZFBjaShDQVJEMTYgc2xvdEJYKTsKLWV4dGVybiBDQVJEMTYgcGNpU2xvdEJYKFBjaVN0cnVjdFB0cik7Ci1QY2lTdHJ1Y3RQdHIgZmluZFBjaURldmljZShDQVJEMTYgdmVuZG9ySUQsIENBUkQxNiBkZXZpY2VJRCwgY2hhciBuKTsKLVBjaVN0cnVjdFB0ciBmaW5kUGNpQ2xhc3MoQ0FSRDggaW50ZiwgQ0FSRDggc3ViQ2xhc3MsIENBUkQxNiBjbGFzcywgY2hhciBuKTsKLQotZXh0ZXJuIENBUkQ4IFBjaVJlYWQ4KGludCBvZmZzZXQsIENBUkQzMiBzbG90KTsKLWV4dGVybiBDQVJEMTYgUGNpUmVhZDE2KGludCBvZmZzZXQsIENBUkQzMiBzbG90KTsKLWV4dGVybiBDQVJEMzIgUGNpUmVhZDMyKGludCBvZmZzZXQsIENBUkQzMiBzbG90KTsKLQotZXh0ZXJuIHZvaWQgUGNpV3JpdGU4KGludCBvZmZzZXQsQ0FSRDggYnl0ZSwgQ0FSRDMyIHNsb3QpOwotZXh0ZXJuIHZvaWQgUGNpV3JpdGUxNihpbnQgb2Zmc2V0LENBUkQxNiB3b3JkLCBDQVJEMzIgc2xvdCk7Ci1leHRlcm4gdm9pZCBQY2lXcml0ZTMyKGludCBvZmZzZXQsQ0FSRDMyIGxnLCBDQVJEMzIgc2xvdCk7Ci0KLWV4dGVybiB2b2lkIHNjYW5fcGNpKHZvaWQpOwotZXh0ZXJuIHZvaWQgcGNpVmlkZW9EaXNhYmxlKHZvaWQpOwotZXh0ZXJuIHZvaWQgcGNpVmlkZW9SZXN0b3JlKHZvaWQpOwotZXh0ZXJuIHZvaWQgRW5hYmxlQ3VycmVudCh2b2lkKTsKLWV4dGVybiBpbnQgbWFwUGNpUm9tKFBjaVN0cnVjdFB0ciBwY2lQKTsKLWV4dGVybiBpbnQgY2ZnMW91dChDQVJEMTYgYWRkciwgQ0FSRDMyIHZhbCk7Ci1leHRlcm4gaW50IGNmZzFpbihDQVJEMTYgYWRkciwgQ0FSRDMyICp2YWwpOwotZXh0ZXJuIHZvaWQgbGlzdF9wY2kodm9pZCk7Ci1leHRlcm4gUGNpU3RydWN0UHRyIGZpbmRQY2lCeUlEcyhpbnQgYnVzLCBpbnQgZGV2LCBpbnQgZnVuYyk7Ci0KLSNkZWZpbmUgUENJX01PREUyX0VOQUJMRV9SRUcgIDB4Q0Y4Ci0jZGVmaW5lIFBDSV9NT0RFMl9GT1JXQVJEX1JFRyAgMHhDRkEKLSNkZWZpbmUgUENJX01PREUxX0FERFJFU1NfUkVHICAweENGOAotI2RlZmluZSBQQ0lfTU9ERTFfREFUQV9SRUcgIDB4Q0ZDCi0jaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19zcGFyY19fKQotI2RlZmluZSBQQ0lfRU4gMHgwMDAwMDAwMAotI2Vsc2UKLSNkZWZpbmUgUENJX0VOIDB4ODAwMDAwMDAKLSNlbmRpZgotI2RlZmluZSBNQVhfREVWX1BFUl9WRU5ET1JfQ0ZHMSAgMzIKLSNkZWZpbmUgQlJJREdFX0NMQVNTKHgpICh4ID09IDB4MDYpCi0jZGVmaW5lIEJSSURHRV9QQ0lfQ0xBU1MoeCkgKHggPT0gMHgwNCkKLSNkZWZpbmUgQlJJREdFX0hPU1RfQ0xBU1MoeCkgKHggPT0gMHgwMCkKLSNkZWZpbmUgUENJX0NMQVNTX1BSRUhJU1RPUklDIDB4MDAKLSNkZWZpbmUgUENJX1NVQkNMQVNTX1BSRUhJU1RPUklDX1ZHQSAweDAxCi0jZGVmaW5lIFBDSV9DTEFTU19ESVNQTEFZIDB4MDMKLSNkZWZpbmUgUENJX1NVQkNMQVNTX0RJU1BMQVlfVkdBIDB4MDAKLSNkZWZpbmUgUENJX1NVQkNMQVNTX0RJU1BMQVlfWEdBIDB4MDEKLSNkZWZpbmUgUENJX1NVQkNMQVNTX0RJU1BMQVlfTUlTQyAweDgwCi0jZGVmaW5lIFZJREVPX0NMQVNTKGIscykgXAotICAgICgoKGIpID09IFBDSV9DTEFTU19QUkVISVNUT1JJQyAmJiAocykgPT0gUENJX1NVQkNMQVNTX1BSRUhJU1RPUklDX1ZHQSkgfHwgXAotICAgICAoKGIpID09IFBDSV9DTEFTU19ESVNQTEFZICYmIChzKSA9PSBQQ0lfU1VCQ0xBU1NfRElTUExBWV9WR0EpIHx8XAotICAgICAoKGIpID09IFBDSV9DTEFTU19ESVNQTEFZICYmIChzKSA9PSBQQ0lfU1VCQ0xBU1NfRElTUExBWV9YR0EpIHx8XAotICAgICAoKGIpID09IFBDSV9DTEFTU19ESVNQTEFZICYmIChzKSA9PSBQQ0lfU1VCQ0xBU1NfRElTUExBWV9NSVNDKSkKLSNkZWZpbmUgUENJX01VTFRJRlVOQ19ERVYgIDB4ODAKLSNkZWZpbmUgTUFYX1BDSV9ERVZJQ0VTICAgNjQKLSNkZWZpbmUgUENJX01BWEJVUyAxNgotI2RlZmluZSBQQ0lfSVNfTUVNIDB4MDAwMDAwMDEKLSNkZWZpbmUgTUFYX1BDSV9ST01fU0laRSAoMTAyNCAqIDEwMjQgKiAxNikKLQotI2RlZmluZSBJU19NRU0zMih4KSAoKHggJiAweDcpID09IDAgJiYgeCAhPSAwKQotI2RlZmluZSBJU19NRU02NCh4KSAoKHggJiAweDcpID09IDB4NCkKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy92ODYuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3Mvdjg2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZWVkMDQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy92ODYuYworKysgL2Rldi9udWxsCkBAIC0xLDU2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDE5OTkgRWdiZXJ0IEVpY2gKLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Ci0gKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKLSAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkIGluCi0gKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKLSAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMKLSAqIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkCi0gKiAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotICoKLSAqIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotICogRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAotICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgotICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlIDxzeXMvdm04Ni5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c2V0am1wLmg+Ci0jaW5jbHVkZSAidjg2Ymlvcy5oIgotI2luY2x1ZGUgIkFzbU1hY3Jvcy5oIgotCi1zdHJ1Y3Qgdm04Nl9zdHJ1Y3Qgdm04NnM7Ci0KLXN0YXRpYyBpbnQgdm04Nl9HUF9mYXVsdCh2b2lkKTsKLXN0YXRpYyBpbnQgdm04Nl9kb19pbnQoaW50IG51bSk7Ci1zdGF0aWMgdm9pZCBkdW1wX2NvZGUodm9pZCk7Ci1zdGF0aWMgdm9pZCBkdW1wX3JlZ2lzdGVycyh2b2lkKTsKLXN0YXRpYyB2b2lkIHN0YWNrX3RyYWNlKHZvaWQpOwotc3RhdGljIGludCB2bTg2X3JlcChzdHJ1Y3Qgdm04Nl9zdHJ1Y3QgKnB0cik7Ci0KLSNkZWZpbmUgQ1BVX1JFRyh4KSAodm04NnMucmVncy4jI3gpCi0jZGVmaW5lIENQVV9SRUdfTFcocmVnKSAgICAgICgqKChDQVJEMTYgKikmQ1BVX1JFRyhyZWcpKSkKLSNkZWZpbmUgQ1BVX1JFR19IVyhyZWcpICAgICAgKCooKENBUkQxNiAqKSZDUFVfUkVHKHJlZykgKyAxKSkKLSNkZWZpbmUgQ1BVX1JFR19MQihyZWcpICAgICAgKCooQ0FSRDggKikmQ1BVX1JFRyhlIyNyZWcpKQotI2RlZmluZSBTRUdfQURSKHR5cGUsIHNlZywgcmVnKSAgdHlwZSgoQ1BVX1JFR19MVyhzZWcpIDw8IDQpIFwKLQkJCQkgICAgICArIENQVV9SRUdfTFcoZSMjcmVnKSkKLSNkZWZpbmUgREYgKDEgPDwgMTApCi0KLXN0cnVjdCBwaW8gUDsKLQotCi12b2lkCi1zZXR1cF9pbyh2b2lkKQotewotICAgIGlmICghQ29uZmlnLlByaW50UG9ydCAmJiAhQ29uZmlnLklvU3RhdGlzdGljcykgewotICAgIFAuaW5iID0gKENBUkQ4KCopKENBUkQxNikpaW5iOwotICAgIFAuaW53ID0gKENBUkQxNigqKShDQVJEMTYpKWludzsKLSAgICBQLmlubCA9IChDQVJEMzIoKikoQ0FSRDE2KSlpbmw7Ci0gICAgUC5vdXRiID0gKHZvaWQoKikoQ0FSRDE2LENBUkQ4KSlvdXRiOwotICAgIFAub3V0dyA9ICh2b2lkKCopKENBUkQxNixDQVJEMTYpKW91dHc7Ci0gICAgUC5vdXRsID0gKHZvaWQoKikoQ0FSRDE2LENBUkQzMikpb3V0bDsKLSAgICB9IGVsc2UgewotICAgIFAuaW5iID0gcF9pbmI7Ci0gICAgUC5pbncgPSBwX2ludzsKLSAgICBQLmlubCA9IHBfaW5sOwotICAgIFAub3V0YiA9IHBfb3V0YjsKLSAgICBQLm91dHcgPSBwX291dHc7Ci0gICAgUC5vdXRsID0gcF9vdXRsOwotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotc2V0dXBfdm04Nih1bnNpZ25lZCBsb25nIGJpb3Nfc3RhcnQsIGk4NmJpb3NSZWdzUHRyIHJlZ3MpCi17Ci0gICAgQ0FSRDMyIGVpcDsKLSAgICBDQVJEMTYgY3M7Ci0KLSAgICB2bTg2cy5mbGFncyA9IFZNODZfU0NSRUVOX0JJVE1BUDsKLSAgICB2bTg2cy5mbGFncyA9IDA7Ci0gICAgdm04NnMuc2NyZWVuX2JpdG1hcCA9IDA7Ci0gICAgdm04NnMuY3B1X3R5cGUgPSBDUFVfNTg2OwotICAgIG1lbXNldCgmdm04NnMuaW50X3JldmVjdG9yZWQsIDB4ZmYsc2l6ZW9mKHZtODZzLmludF9yZXZlY3RvcmVkKSkgOwotICAgIG1lbXNldCgmdm04NnMuaW50MjFfcmV2ZWN0b3JlZCwgMHhmZixzaXplb2Yodm04NnMuaW50MjFfcmV2ZWN0b3JlZCkpIDsKLQotICAgIGVpcCA9IGJpb3Nfc3RhcnQgJiAweEZGRkY7Ci0gICAgY3MgPSAoYmlvc19zdGFydCAmIDB4RkYwMDAwKSA+PiA0OwotCi0gICAgQ1BVX1JFRyhlYXgpID0gcmVncy0+YXg7Ci0gICAgQ1BVX1JFRyhlYngpID0gcmVncy0+Yng7Ci0gICAgQ1BVX1JFRyhlY3gpID0gcmVncy0+Y3g7Ci0gICAgQ1BVX1JFRyhlZHgpID0gcmVncy0+ZHg7Ci0gICAgQ1BVX1JFRyhlc2kpID0gMDsKLSAgICBDUFVfUkVHKGVkaSkgPSByZWdzLT5kaTsKLSAgICBDUFVfUkVHKGVicCkgPSAwOwotICAgIENQVV9SRUcoZWlwKSA9IGVpcDsKLSAgICBDUFVfUkVHKGNzKSA9IGNzOwotICAgIENQVV9SRUcoZXNwKSA9IDB4MTAwOwotICAgIENQVV9SRUcoc3MpID0gMHgzMDsgICAgICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSBzdGFuZGFyZCBwYyBiaW9zIHN0YWNrICovCi0gICAgQ1BVX1JFRyhlcykgPSByZWdzLT5lczsKLSAgICBDUFVfUkVHKGRzKSA9IDB4NDA7ICAgICAgICAgICAgICAgLyogc3RhbmRhcmQgcGMgZHMgKi8KLSAgICBDUFVfUkVHKGZzKSA9IDA7Ci0gICAgQ1BVX1JFRyhncykgPSAwOwotICAgIENQVV9SRUcoZWZsYWdzKSB8PSAoVklGX01BU0sgfCBWSVBfTUFTSyk7Ci19Ci0KLXZvaWQKLWNvbGxlY3RfYmlvc19yZWdzKGk4NmJpb3NSZWdzUHRyIHJlZ3MpCi17Ci0gICAgcmVncy0+YXggPSBDUFVfUkVHKGVheCk7Ci0gICAgcmVncy0+YnggPSBDUFVfUkVHKGVieCk7Ci0gICAgcmVncy0+Y3ggPSBDUFVfUkVHKGVjeCk7Ci0gICAgcmVncy0+ZHggPSBDUFVfUkVHKGVkeCk7Ci0gICAgcmVncy0+ZXMgPSBDUFVfUkVHKGVzKTsKLSAgICByZWdzLT5kcyA9IENQVV9SRUcoZHMpOwotICAgIHJlZ3MtPmRpID0gQ1BVX1JFRyhlZGkpOwotICAgIHJlZ3MtPnNpID0gQ1BVX1JFRyhlc2kpOwotfQotCi1zdGF0aWMgaW50Ci1kb192bTg2KHZvaWQpCi17Ci0gICAgaW50IHJldHZhbDsKLQotI2lmZGVmIFY4NkJJT1NfREVCVUcKLSAgICBkdW1wX3JlZ2lzdGVycygpOwotI2VuZGlmCi0vKiAgICByZXR2YWwgPSBTWVNfdm04Nm9sZCgmdm04NnMpOyAqLwotLyogICAgcmV0dmFsID0gc3lzY2FsbChTWVNfdm04Nm9sZCwmdm04NnMpOyAqLwotCi0gICAgcmV0dmFsID0gdm04Nl9yZXAoJnZtODZzKTsKLQotICAgIHN3aXRjaCAoVk04Nl9UWVBFKHJldHZhbCkpIHsKLSAgICBjYXNlIFZNODZfVU5LTk9XTjoKLQlpZiAoIXZtODZfR1BfZmF1bHQoKSkgcmV0dXJuIDA7Ci0JYnJlYWs7Ci0gICAgY2FzZSBWTTg2X1NUSToKLQlmcHJpbnRmKHN0ZGVyciwidm04Nl9zdGkgOi0oKFxuIik7Ci0Jc3RhY2tfdHJhY2UoKTsKLQlkdW1wX2NvZGUoKTsKLQlyZXR1cm4gMDsKLSAgICBjYXNlIFZNODZfSU5UeDoKLQlpZiAoIXZtODZfZG9faW50KFZNODZfQVJHKHJldHZhbCkpKSB7Ci0JICAgIGZwcmludGYoc3RkZXJyLCJcblVua25vd24gdm04Nl9pbnQ6ICVYXG5cbiIsVk04Nl9BUkcocmV0dmFsKSk7Ci0JICAgIGR1bXBfcmVnaXN0ZXJzKCk7Ci0JICAgIHJldHVybiAwOwotCX0KLQkvKiBJJ20gbm90IHN1cmUgeWV0IHdoYXQgdG8gZG8gaWYgd2UgY2FuIGhhbmRsZSBpbnRzICovCi0JYnJlYWs7Ci0gICAgY2FzZSBWTTg2X1NJR05BTDoKLQlmcHJpbnRmKHN0ZGVyciwicmVjZWl2ZWQgc2lnbmFsXG4iKTsKLQlyZXR1cm4gMDsKLSAgICBkZWZhdWx0OgotCWZwcmludGYoc3RkZXJyLCJ1bmtub3duIHR5cGUoMHgleCk9MHgleFxuIiwKLQkJVk04Nl9BUkcocmV0dmFsKSxWTTg2X1RZUEUocmV0dmFsKSk7Ci0JZHVtcF9yZWdpc3RlcnMoKTsKLQlkdW1wX2NvZGUoKTsKLQlzdGFja190cmFjZSgpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiAxOwotfQotCi1zdGF0aWMgam1wX2J1ZiB4ODZfZXNjOwotc3RhdGljIHZvaWQKLXZtZXhpdChpbnQgdW51c2VkKQotewotICAgIGxvbmdqbXAoeDg2X2VzYywxKTsKLX0KLQotdm9pZAotZG9feDg2KHVuc2lnbmVkIGxvbmcgYmlvc19zdGFydCwgaTg2Ymlvc1JlZ3NQdHIgcmVncykKLXsKLSAgICBzdGF0aWMgdm9pZCAoKm9yZ19oYW5kbGVyKShpbnQpOwotCi0gICAgc2V0dXBfdm04NihiaW9zX3N0YXJ0LCByZWdzKTsKLSAgICBpZiAoc2V0am1wKHg4Nl9lc2MpID09IDApIHsKLQlvcmdfaGFuZGxlciA9IHNpZ25hbCgyLHZtZXhpdCk7Ci0Jd2hpbGUoZG9fdm04NigpKSB7fTsKLQlzaWduYWwoMixvcmdfaGFuZGxlcik7Ci0JY29sbGVjdF9iaW9zX3JlZ3MocmVncyk7Ci0gICAgfSBlbHNlIHsKLQlzaWduYWwoMixvcmdfaGFuZGxlcik7Ci0JcHJpbnRmKCJpbnRlcnJ1cHRlZCBhdCAweCV4XG4iLCgoQ0FSRDE2KUNQVV9SRUcoY3MpKSA8PCA0Ci0JICAgfCAoQ0FSRDE2KUNQVV9SRUcoZWlwKSk7Ci0gICAgfQotfQotCi0vKiBnZXQgdGhlIGxpbmVhciBhZGRyZXNzICovCi0jZGVmaW5lIExJTl9QUkVGX1NJICAoKHByZWZfc2VnIDw8IDQpICsgQ1BVX1JFR19MVyhlc2kpKQotCi0jZGVmaW5lIExXRUNYICAgICAgIChwcmVmaXg2NiBeIHByZWZpeDY3ID8gQ1BVX1JFRyhlY3gpIDogQ1BVX1JFR19MVyhlY3gpKQotCi1zdGF0aWMgaW50Ci12bTg2X0dQX2ZhdWx0KHZvaWQpCi17Ci0gICAgdW5zaWduZWQgY2hhciAqY3NwLCAqbGluYTsKLSAgICBDQVJEMzIgb3JnX2VpcDsKLSAgICBpbnQgcHJlZl9zZWc7Ci0gICAgaW50IGRvbmUsaXNfcmVwLHByZWZpeDY2LHByZWZpeDY3OwotCi0KLSAgICBjc3AgPSBsaW5hID0gU0VHX0FEUigodW5zaWduZWQgY2hhciAqKSwgY3MsIGlwKTsKLSNpZmRlZiBWODZCSU9TX0RFQlVHCi0gICAgcHJpbnRmKCJleGNlcHRpb246IFxuIik7Ci0gICAgZHVtcF9jb2RlKCk7Ci0jZW5kaWYKLQotICAgIGlzX3JlcCA9IDA7Ci0gICAgcHJlZml4NjYgPSBwcmVmaXg2NyA9IDA7Ci0gICAgcHJlZl9zZWcgPSAtMTsKLQotICAgIC8qIGVhdCB1cCBwcmVmaXhlcyAqLwotICAgIGRvbmUgPSAwOwotICAgIGRvIHsKLQlzd2l0Y2ggKCooY3NwKyspKSB7Ci0JY2FzZSAweDY2OiAgICAgIC8qIG9wZXJhbmQgcHJlZml4ICovICBwcmVmaXg2Nj0xOyBicmVhazsKLQljYXNlIDB4Njc6ICAgICAgLyogYWRkcmVzcyBwcmVmaXggKi8gIHByZWZpeDY3PTE7IGJyZWFrOwotCWNhc2UgMHgyZTogICAgICAvKiBDUyAqLyAgICAgICAgICAgICAgcHJlZl9zZWc9Q1BVX1JFRyhjcyk7IGJyZWFrOwotCWNhc2UgMHgzZTogICAgICAvKiBEUyAqLyAgICAgICAgICAgICAgcHJlZl9zZWc9Q1BVX1JFRyhkcyk7IGJyZWFrOwotCWNhc2UgMHgyNjogICAgICAvKiBFUyAqLyAgICAgICAgICAgICAgcHJlZl9zZWc9Q1BVX1JFRyhlcyk7IGJyZWFrOwotCWNhc2UgMHgzNjogICAgICAvKiBTUyAqLyAgICAgICAgICAgICAgcHJlZl9zZWc9Q1BVX1JFRyhzcyk7IGJyZWFrOwotCWNhc2UgMHg2NTogICAgICAvKiBHUyAqLyAgICAgICAgICAgICAgcHJlZl9zZWc9Q1BVX1JFRyhncyk7IGJyZWFrOwotCWNhc2UgMHg2NDogICAgICAvKiBGUyAqLyAgICAgICAgICAgICAgcHJlZl9zZWc9Q1BVX1JFRyhmcyk7IGJyZWFrOwotCWNhc2UgMHhmMjogICAgICAvKiByZXBueiAqLwotCWNhc2UgMHhmMzogICAgICAvKiByZXAgKi8gICAgICAgICAgICAgaXNfcmVwPTE7IGJyZWFrOwotCWRlZmF1bHQ6IGRvbmU9MTsKLQl9Ci0gICAgfSB3aGlsZSAoIWRvbmUpOwotICAgIGNzcC0tOyAgIC8qIG9vcHMgb25lIHRvbyBtYW55ICovCi0gICAgb3JnX2VpcCA9IENQVV9SRUcoZWlwKTsKLSAgICBDUFVfUkVHX0xXKGVpcCkgKz0gKGNzcCAtIGxpbmEpOwotCi0gICAgc3dpdGNoICgqY3NwKSB7Ci0KLSAgICBjYXNlIDB4NmM6ICAgICAgICAgICAgICAgICAgICAvKiBpbnNiICovCi0JLyogTk9URTogRVMgY2FuJ3QgYmUgb3ZlcndyaXR0ZW47IHByZWZpeGVzIDY2LDY3IHNob3VsZCB1c2UgZXNpLGVkaSxlY3gKLQkgKiBidXQgaXMgYW55b25lIHVzaW5nIGV4dGVuZGVkIHJlZ3MgaW4gcmVhbCBtb2RlPyAqLwotCS8qIFdBUk5JTkc6IG5vIHRlc3QgZm9yIERJIHdyYXBwaW5nISAqLwotCUNQVV9SRUdfTFcoZWRpKSArPSBwb3J0X3JlcF9pbmIoQ1BVX1JFR19MVyhlZHgpLAotCQkJCQlTRUdfQURSKChDQVJEOCAqKSxlcyxkaSksCi0JCQkJCUNQVV9SRUdfTFcoZWZsYWdzKSZERiwKLQkJCQkJKGlzX3JlcD8gTFdFQ1g6MSkpOwotCWlmIChpc19yZXApIExXRUNYID0gMDsKLQlDUFVfUkVHX0xXKGVpcCkrKzsKLQlicmVhazsKLQotICAgIGNhc2UgMHg2ZDogICAgICAgICAgICAgICAgICAvKiAocmVwKSBpbnN3IC8gaW5zZCAqLwotCS8qIE5PVEU6IEVTIGNhbid0IGJlIG92ZXJ3cml0dGVuICovCi0JLyogV0FSTklORzogbm8gdGVzdCBmb3IgX0RJIHdyYXBwaW5nISAqLwotCWlmIChwcmVmaXg2NikgewotCSAgICBDUFVfUkVHX0xXKGVkaSkgKz0gcG9ydF9yZXBfaW5sKENQVV9SRUdfTFcoZWR4KSwKLQkJCQkJICAgIFNFR19BRFIoKENBUkQzMiAqKSxlcyxkaSksCi0JCQkJCSAgICBDUFVfUkVHX0xXKGVmbGFncykmREYsCi0JCQkJCSAgICAoaXNfcmVwPyBMV0VDWDoxKSk7Ci0JfQotCWVsc2UgewotCSAgICBDUFVfUkVHX0xXKGVkaSkgKz0gcG9ydF9yZXBfaW53KENQVV9SRUdfTFcoZWR4KSwKLQkJCQkJICAgIFNFR19BRFIoKENBUkQxNiAqKSxlcyxkaSksCi0JCQkJCSAgICBDUFVfUkVHX0xXKGVmbGFncykmREYsCi0JCQkJCSAgICAoaXNfcmVwPyBMV0VDWDoxKSk7Ci0JfQotCWlmIChpc19yZXApIExXRUNYID0gMDsKLQlDUFVfUkVHX0xXKGVpcCkrKzsKLQlicmVhazsKLQotICAgIGNhc2UgMHg2ZTogICAgICAgICAgICAgICAgICAvKiAocmVwKSBvdXRzYiAqLwotCWlmIChwcmVmX3NlZyA8IDApIHByZWZfc2VnID0gQ1BVX1JFR19MVyhkcyk7Ci0JLyogV0FSTklORzogbm8gdGVzdCBmb3IgX1NJIHdyYXBwaW5nISAqLwotCUNQVV9SRUdfTFcoZXNpKSArPSBwb3J0X3JlcF9vdXRiKENQVV9SRUdfTFcoZWR4KSwoQ0FSRDgqKUxJTl9QUkVGX1NJLAotCQkJCQkgQ1BVX1JFR19MVyhlZmxhZ3MpJkRGLAotCQkJCQkgKGlzX3JlcD8gTFdFQ1g6MSkpOwotCWlmIChpc19yZXApIExXRUNYID0gMDsKLQlDUFVfUkVHX0xXKGVpcCkrKzsKLQlicmVhazsKLQotICAgIGNhc2UgMHg2ZjogICAgICAgICAgICAgICAgICAvKiAocmVwKSBvdXRzdyAvIG91dHNkICovCi0JaWYgKHByZWZfc2VnIDwgMCkgcHJlZl9zZWcgPSBDUFVfUkVHX0xXKGRzKTsKLQkvKiBXQVJOSU5HOiBubyB0ZXN0IGZvciBfU0kgd3JhcHBpbmchICovCi0JaWYgKHByZWZpeDY2KSB7Ci0JICAgIENQVV9SRUdfTFcoZXNpKSArPSBwb3J0X3JlcF9vdXRsKENQVV9SRUdfTFcoZWR4KSwKLQkJCQkJICAgICAoQ0FSRDMyICopTElOX1BSRUZfU0ksCi0JCQkJCSAgICAgQ1BVX1JFR19MVyhlZmxhZ3MpJkRGLAotCQkJCQkgICAgIChpc19yZXA/IExXRUNYOjEpKTsKLQl9Ci0JZWxzZSB7Ci0JICAgIENQVV9SRUdfTFcoZXNpKSArPSBwb3J0X3JlcF9vdXR3KENQVV9SRUdfTFcoZWR4KSwKLQkJCQkJICAgICAoQ0FSRDE2ICopTElOX1BSRUZfU0ksCi0JCQkJCSAgICAgQ1BVX1JFR19MVyhlZmxhZ3MpJkRGLAotCQkJCQkgICAgIChpc19yZXA/IExXRUNYOjEpKTsKLQl9Ci0JaWYgKGlzX3JlcCkgTFdFQ1ggPSAwOwotCUNQVV9SRUdfTFcoZWlwKSsrOwotCWJyZWFrOwotCi0gICAgY2FzZSAweGU1OiAgICAgICAgICAgICAgICAgIC8qIGludyB4eCwgaW5sIHh4ICovCi0JaWYgKHByZWZpeDY2KSBDUFVfUkVHKGVheCkgPSBQLmlubCgoaW50KSBjc3BbMV0pOwotCWVsc2UgQ1BVX1JFR19MVyhlYXgpID0gUC5pbncoKGludCkgY3NwWzFdKTsKLQlDUFVfUkVHX0xXKGVpcCkgKz0gMjsKLQlicmVhazsKLSAgICBjYXNlIDB4ZTQ6ICAgICAgICAgICAgICAgICAgLyogaW5iIHh4ICovCi0JQ1BVX1JFR19MVyhlYXgpICY9IH4oQ0FSRDMyKTB4ZmY7Ci0JQ1BVX1JFR19MQihheCkgfD0gUC5pbmIoKGludCkgY3NwWzFdKTsKLQlDUFVfUkVHX0xXKGVpcCkgKz0gMjsKLQlicmVhazsKLSAgICBjYXNlIDB4ZWQ6ICAgICAgICAgICAgICAgICAgLyogaW53IGR4LCBpbmwgZHggKi8KLQlpZiAocHJlZml4NjYpIENQVV9SRUcoZWF4KSA9IFAuaW5sKENQVV9SRUdfTFcoZWR4KSk7Ci0JZWxzZSBDUFVfUkVHX0xXKGVheCkgPSBQLmludyhDUFVfUkVHX0xXKGVkeCkpOwotCUNQVV9SRUdfTFcoZWlwKSArPSAxOwotCWJyZWFrOwotICAgIGNhc2UgMHhlYzogICAgICAgICAgICAgICAgICAvKiBpbmIgZHggKi8KLQlDUFVfUkVHX0xXKGVheCkgJj0gfihDQVJEMzIpMHhmZjsKLQlDUFVfUkVHX0xCKGF4KSB8PSBQLmluYihDUFVfUkVHX0xXKGVkeCkpOwotCUNQVV9SRUdfTFcoZWlwKSArPSAxOwotCWJyZWFrOwotCi0gICAgY2FzZSAweGU3OiAgICAgICAgICAgICAgICAgIC8qIG91dHcgeHggKi8KLQlpZiAocHJlZml4NjYpIFAub3V0bCgoaW50KWNzcFsxXSwgQ1BVX1JFRyhlYXgpKTsKLQllbHNlIFAub3V0dygoaW50KWNzcFsxXSwgQ1BVX1JFR19MVyhlYXgpKTsKLQlDUFVfUkVHX0xXKGVpcCkgKz0gMjsKLQlicmVhazsKLSAgICBjYXNlIDB4ZTY6ICAgICAgICAgICAgICAgICAgLyogb3V0YiB4eCAqLwotCVAub3V0YigoaW50KSBjc3BbMV0sIENQVV9SRUdfTEIoYXgpKTsKLQlDUFVfUkVHX0xXKGVpcCkgKz0gMjsKLQlicmVhazsKLSAgICBjYXNlIDB4ZWY6ICAgICAgICAgICAgICAgICAgLyogb3V0dyBkeCAqLwotCWlmIChwcmVmaXg2NikgUC5vdXRsKENQVV9SRUdfTFcoZWR4KSwgQ1BVX1JFRyhlYXgpKTsKLQllbHNlIFAub3V0dyhDUFVfUkVHX0xXKGVkeCksIENQVV9SRUdfTFcoZWF4KSk7Ci0JQ1BVX1JFR19MVyhlaXApICs9IDE7Ci0JYnJlYWs7Ci0gICAgY2FzZSAweGVlOiAgICAgICAgICAgICAgICAgIC8qIG91dGIgZHggKi8KLQlQLm91dGIoQ1BVX1JFR19MVyhlZHgpLCBDUFVfUkVHX0xCKGF4KSk7Ci0JQ1BVX1JFR19MVyhlaXApICs9IDE7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIDB4ZjQ6Ci0jaWZkZWYgVjg2QklPU19ERUJVRwotCXByaW50ZigiaGx0IGF0ICVwXG4iLCBsaW5hKTsKLSNlbmRpZgotCXJldHVybiAwOwotCi0gICAgY2FzZSAweDBmOgotCWZwcmludGYoc3RkZXJyLCJDUFUgMHgwZiBUcmFwIGF0IGVpcD0weCVseFxuIixDUFVfUkVHKGVpcCkpOwotCWdvdG8gb3AwZmVycjsKLQlicmVhazsKLQotICAgIGNhc2UgMHhmMDogICAgICAgICAgICAgICAgICAvKiBsb2NrICovCi0gICAgZGVmYXVsdDoKLQlmcHJpbnRmKHN0ZGVyciwidW5rbm93biByZWFzb24gZm9yIGV4Y2VwdGlvblxuIik7Ci0JZHVtcF9yZWdpc3RlcnMoKTsKLQlzdGFja190cmFjZSgpOwotICAgIG9wMGZlcnI6Ci0JZHVtcF9jb2RlKCk7Ci0JZnByaW50ZihzdGRlcnIsImNhbm5vdCBjb250aW51ZVxuIik7Ci0JcmV0dXJuIDA7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBzd2l0Y2goKSAqLwotICAgIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci12bTg2X2RvX2ludChpbnQgbnVtKQotewotICAgIGludCB2YWw7Ci0gICAgc3RydWN0IHJlZ3M4NiByZWdzOwotCi0gICAgaV9wcmludGYoImludCAweCV4IHJlY2VpdmVkOiBheDoweCVseCIsbnVtLENQVV9SRUcoZWF4KSk7Ci0gICAgaWYgKENvbmZpZy5QcmludElwKQotCWlfcHJpbnRmKCIgYXQ6IDB4JXhcbiIsZ2V0SVAoKSk7Ci0gICAgZWxzZQotCWlfcHJpbnRmKCJcbiIpOwotCi0gICAgLyogdHJ5IHRvIHJ1biBiaW9zIGludGVycnVwdCAqLwotCi0gICAgLyogaWYgbm90IGluc3RhbGxlZCBmYWxsIGJhY2sgKi8KLSNkZWZpbmUgQ09QWSh4KSByZWdzLiMjeCA9IENQVV9SRUcoeCkKLSNkZWZpbmUgQ09QWV9SKHgpIENQVV9SRUcoeCkgPSByZWdzLiMjeAotCi0gICAgQ09QWShlYXgpOwotICAgIENPUFkoZWJ4KTsKLSAgICBDT1BZKGVjeCk7Ci0gICAgQ09QWShlZHgpOwotICAgIENPUFkoZXNpKTsKLSAgICBDT1BZKGVkaSk7Ci0gICAgQ09QWShlYnApOwotICAgIENPUFkoZWlwKTsKLSAgICBDT1BZKGVzcCk7Ci0gICAgQ09QWShjcyk7Ci0gICAgQ09QWShzcyk7Ci0gICAgQ09QWShkcyk7Ci0gICAgQ09QWShlcyk7Ci0gICAgQ09QWShmcyk7Ci0gICAgQ09QWShncyk7Ci0gICAgQ09QWShlZmxhZ3MpOwotCi0gICAgaWYgKCEodmFsID0gaW50X2hhbmRsZXIobnVtLCZyZWdzKSkpCi0JaWYgKCEodmFsID0gcnVuX2Jpb3NfaW50KG51bSwmcmVncykpKQotCSAgICByZXR1cm4gdmFsOwotCi0gICAgQ09QWV9SKGVheCk7Ci0gICAgQ09QWV9SKGVieCk7Ci0gICAgQ09QWV9SKGVjeCk7Ci0gICAgQ09QWV9SKGVkeCk7Ci0gICAgQ09QWV9SKGVzaSk7Ci0gICAgQ09QWV9SKGVkaSk7Ci0gICAgQ09QWV9SKGVicCk7Ci0gICAgQ09QWV9SKGVpcCk7Ci0gICAgQ09QWV9SKGVzcCk7Ci0gICAgQ09QWV9SKGNzKTsKLSAgICBDT1BZX1Ioc3MpOwotICAgIENPUFlfUihkcyk7Ci0gICAgQ09QWV9SKGVzKTsKLSAgICBDT1BZX1IoZnMpOwotICAgIENPUFlfUihncyk7Ci0gICAgQ09QWV9SKGVmbGFncyk7Ci0KLSAgICByZXR1cm4gdmFsOwotI3VuZGVmIENPUFkKLSN1bmRlZiBDT1BZX1IKLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfY29kZSh2b2lkKQotewotICAgIGludCBpOwotICAgIHVuc2lnbmVkIGNoYXIgKmxpbmEgPSBTRUdfQURSKCh1bnNpZ25lZCBjaGFyICopLCBjcywgaXApOwotCi0gICAgZnByaW50ZihzdGRlcnIsImNvZGUgYXQgMHglOC44eDogIiwoQ0FSRDMyKWxpbmEpOwotICAgIGZvciAoaT0wOyBpPDB4MTA7IGkrKykKLQlmcHJpbnRmKHN0ZGVyciwiJTIuMnggIiwqKGxpbmEgKyBpKSk7Ci0gICAgZnByaW50ZihzdGRlcnIsIlxuICAgICAgICAgICAgICAgICAgICAiKTsKLSAgICBmb3IgKDsgaTwweDIwOyBpKyspCi0JZnByaW50ZihzdGRlcnIsIiUyLjJ4ICIsKihsaW5hICsgaSkpOwotICAgIGZwcmludGYoc3RkZXJyLCJcbiIpOwotfQotCi0jZGVmaW5lIFBSSU5UKHgpIGZwcmludGYoc3RkZXJyLCN4IjolNC40eCAiLENQVV9SRUdfTFcoeCkpCi0jZGVmaW5lIFBSSU5UX0ZMQUdTKHgpIGZwcmludGYoc3RkZXJyLCN4IjolOC44eCAiLENQVV9SRUdfTFcoeCkpCi1zdGF0aWMgdm9pZAotZHVtcF9yZWdpc3RlcnModm9pZCkKLXsKLSAgICBQUklOVChlaXApOwotICAgIFBSSU5UKGVheCk7Ci0gICAgUFJJTlQoZWJ4KTsKLSAgICBQUklOVChlY3gpOwotICAgIFBSSU5UKGVkeCk7Ci0gICAgUFJJTlQoZXNpKTsKLSAgICBQUklOVChlZGkpOwotICAgIFBSSU5UKGVicCk7Ci0gICAgZnByaW50ZihzdGRlcnIsIlxuIik7Ci0gICAgUFJJTlQoZXNwKTsKLSAgICBQUklOVChjcyk7Ci0gICAgUFJJTlQoc3MpOwotICAgIFBSSU5UKGVzKTsKLSAgICBQUklOVChkcyk7Ci0gICAgUFJJTlQoZnMpOwotICAgIFBSSU5UKGdzKTsKLSAgICBQUklOVF9GTEFHUyhlZmxhZ3MpOwotICAgIGZwcmludGYoc3RkZXJyLCJcbiIpOwotfQotCi1zdGF0aWMgdm9pZAotc3RhY2tfdHJhY2Uodm9pZCkKLXsKLSAgICBpbnQgaTsKLSAgICB1bnNpZ25lZCBjaGFyICpzdGFjayA9IFNFR19BRFIoKHVuc2lnbmVkIGNoYXIgKiksIHNzLCBzcCk7Ci0KLSAgICBmcHJpbnRmKHN0ZGVyciwic3RhY2sgYXQgMHglOC44bHg6XG4iLCh1bnNpZ25lZCBsb25nKXN0YWNrKTsKLSAgICBmb3IgKGk9MDsgaSA8IDB4MTA7IGkrKykKLQlmcHJpbnRmKHN0ZGVyciwiJTIuMnggIiwqKHN0YWNrICsgaSkpOwotICAgIGZwcmludGYoc3RkZXJyLCJcbiIpOwotCi19Ci0KLXN0YXRpYyBpbnQKLXZtODZfcmVwKHN0cnVjdCB2bTg2X3N0cnVjdCAqcHRyKQotewotCi0gICAgaW50IF9fcmVzOwotCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18oImludCAkMHg4MFxuIgotCQkJIDoiPWEiIChfX3Jlcyk6ImEiICgoaW50KTExMyksCi0JCQkgImIiICgoc3RydWN0IHZtODZfc3RydWN0ICopcHRyKSk7Ci0KLQkgICAgaWYgKChfX3JlcykgPCAwKSB7Ci0JCWVycm5vID0gLV9fcmVzOwotCQlfX3Jlcz0tMTsKLQkgICAgfQotCSAgICBlbHNlIGVycm5vID0gMDsKLQkgICAgcmV0dXJuIF9fcmVzOwotfQotCi0jZGVmaW5lIHB1c2h3KGJhc2UsIHB0ciwgdmFsKSBcCi1fX2FzbV9fIF9fdm9sYXRpbGVfXyggXAotCSJkZWN3ICV3MFxuXHQiIFwKLQkibW92YiAlaDIsKCUxLCUwKVxuXHQiIFwKLQkiZGVjdyAldzBcblx0IiBcCi0JIm1vdmIgJWIyLCglMSwlMCkiIFwKLQk6ICI9ciIgKHB0cikgXAotCTogInIiIChiYXNlKSwgInEiICh2YWwpLCAiMCIgKHB0cikpCi0KLWludAotcnVuX2Jpb3NfaW50KGludCBudW0sIHN0cnVjdCByZWdzODYgKnJlZ3MpCi17Ci0gICAgQ0FSRDE2ICpzc3A7Ci0gICAgQ0FSRDMyIHNwOwotICAgIENBUkQzMiBlZmxhZ3M7Ci0KLSNpZmRlZiBWODZCSU9TX0RFQlVHCi0gICAgc3RhdGljIGludCBmaXJzdHRpbWUgPSAxOwotI2VuZGlmCi0gICAgLyogY2hlY2sgaWYgYmlvcyB2ZWN0b3IgaXMgaW5pdGlhbGl6ZWQgKi8KLSAgICBpZiAoKChDQVJEMTYqKTApWyhudW08PDEpKzFdID09IDB4MDAwMCkgeyAvKiBTWVNfQklPU19TRUcgPyovCi0jaWZkZWYgVjg2QklPU19ERUJVRwotCWlfcHJpbnRmKCJjYXJkIEJJT1Mgbm90IGxvYWRlZFxuIik7Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSNpZmRlZiBWODZCSU9TX0RFQlVHCi0gICAgaWYgKGZpcnN0dGltZSkgewotCWRwcmludCgwLDB4M0QwKTsKLQlmaXJzdHRpbWUgPSAwOwotICAgIH0KLSNlbmRpZgotCi0gICAgaV9wcmludGYoImNhbGxpbmcgY2FyZCBCSU9TIGF0OiAiKTsKLSAgICBzc3AgPSAoQ0FSRDE2KikoQ1BVX1JFRyhzcyk8PDQpOwotICAgIHNwID0gKENBUkQzMikgQ1BVX1JFR19MVyhlc3ApOwotCi0gICAgZWZsYWdzID0gcmVncy0+ZWZsYWdzOwotICAgIGVmbGFncyA9ICgoZWZsYWdzICYgVklGX01BU0spICE9IDApCi0JPyAoZWZsYWdzIHwgSUZfTUFTSykgOiAoZWZsYWdzICYgfihDQVJEMzIpIElGX01BU0spOwotICAgIHB1c2h3KHNzcCwgc3AsIGVmbGFncyk7Ci0gICAgcHVzaHcoc3NwLCBzcCwgcmVncy0+Y3MpOwotICAgIHB1c2h3KHNzcCwgc3AsIChDQVJEMTYpcmVncy0+ZWlwKTsKLSAgICByZWdzLT5lc3AgLT0gNjsKLSAgICByZWdzLT5jcyA9ICgoQ0FSRDE2ICopIDApWyhudW0gPDwgMSkgKyAxXTsKLSAgICByZWdzLT5laXAgPSAocmVncy0+ZWlwICYgMHhGRkZGMDAwMCkgfCAoKENBUkQxNiAqKSAwKVtudW0gPDwgMV07Ci0gICAgaV9wcmludGYoIjB4JXg6JWx4XG4iLHJlZ3MtPmNzLHJlZ3MtPmVpcCk7Ci0jaWZkZWYgVjg2QklPU19ERUJVRwotICAgIGR1bXBfY29kZSgpOwotI2VuZGlmCi0gICAgcmVncy0+ZWZsYWdzID0gcmVncy0+ZWZsYWdzCi0JCSAgICAgICAmIH4oVklGX01BU0sgfCBURl9NQVNLIHwgSUZfTUFTSyB8IE5UX01BU0spOwotICAgIHJldHVybiAxOwotfQotCi1DQVJEMzIKLWdldEludFZlY3QoaW50IG51bSkKLXsKLSAgICByZXR1cm4gKChDQVJEMzIqKTApW251bV07Ci19Ci0KLUNBUkQzMgotZ2V0SVAodm9pZCkKLXsKLSAgICByZXR1cm4gKENQVV9SRUcoY3MpIDw8IDQpICsgQ1BVX1JFRyhlaXApOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy92ODZiaW9zLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3Y4NmJpb3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAxYzFmMi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3Y4NmJpb3MuYworKysgL2Rldi9udWxsCkBAIC0xLDkzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDE5OTkgRWdiZXJ0IEVpY2gKLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Ci0gKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKLSAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkIGluCi0gKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKLSAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMKLSAqIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkCi0gKiAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotICoKLSAqIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotICogRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAotICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgotICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotI2RlZmluZSBERUxFVEUKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHJlYWRsaW5lL3JlYWRsaW5lLmg+Ci0jaW5jbHVkZSA8cmVhZGxpbmUvaGlzdG9yeS5oPgotI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkIChfX2lhNjRfXykKLSNpbmNsdWRlIDxzeXMvaW8uaD4KLSNlbGlmIGRlZmluZWQoSEFWRV9TWVNfUEVSTSkKLSNpbmNsdWRlIDxzeXMvcGVybS5oPgotI2VuZGlmCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJ2ODZiaW9zLmgiCi0jaW5jbHVkZSAicGNpLmgiCi0jaW5jbHVkZSAiQXNtTWFjcm9zLmgiCi0KLSNkZWZpbmUgU0laRSAweDEwMDAwMAotI2RlZmluZSBWUkFNX1NUQVJUIDB4QTAwMDAKLSNkZWZpbmUgVlJBTV9TSVpFIDB4MUZGRkYKLSNkZWZpbmUgVl9CSU9TX1NJWkUgMHgxRkZGRgotI2RlZmluZSBCSU9TX1NUQVJUIDB4N0MwMCAgICAgICAgICAgIC8qIGRlZmF1bHQgQklPUyBlbnRyeSAqLwotI2RlZmluZSBCSU9TX01FTSAweDYwMAotCi0vKkNBUkQ4IGNvZGVbXSA9IHsgMHhiOCAsIDB4ZjAgLCAweGYwLCAweGY0IH07ICovCi0jZGVmaW5lIFZCX1goeCkgKFZfQklPUyA+PiB4KSAmIDB4RkYKLUNBUkQ4IGNvZGVbXSA9IHsgNiwgMHg5YSwgMHgwMywgMHgwMCwgMHgwMCwgVkJfWCgxMiksIDB4ZjQgfTsKLS8qQ0FSRDggY29kZVtdID0geyAweDlhLCAweDAzLCAweDAwLCAweDAwLCBWQl9YKDEyKSwgMHhiOCwgMHgwMywgMHgwMCwgKi8KLS8qMHhjZCwgMHgxMCwgMHhmNCB9OyAqLwotLypDQVJEOCBjb2RlW10gPSB7ICAweGI4ICwgMHhmMCAsIDB4ZjAgLDB4ZjQgfTsgKi8KLQotaW50IGlvcGVybV9saXN0W0lPUEVSTV9CSVRTXSA9IHswLH07Ci0KLXN0YXRpYyB2b2lkIHNpZ19oYW5kbGVyKGludCk7Ci1zdGF0aWMgaW50IG1hcCh2b2lkKTsKLXN0YXRpYyB2b2lkIHVubWFwKHZvaWQpOwotc3RhdGljIHZvaWQgYm9vdEJJT1MoQ0FSRDE2IGF4KTsKLXN0YXRpYyBpbnQgbWFwX3ZyYW0odm9pZCk7Ci1zdGF0aWMgdm9pZCB1bm1hcF92cmFtKHZvaWQpOwotc3RhdGljIGludCBjb3B5X3ZiaW9zKG1lbVR5cGUgdl9iYXNlKTsKLXN0YXRpYyBpbnQgY29weV9zeXNfYmlvcyh2b2lkKTsKLXN0YXRpYyB2b2lkIHNhdmVfYmlvc190b19maWxlKHZvaWQpOwotc3RhdGljIGludCBzZXR1cF9zeXN0ZW1fYmlvcyh2b2lkKTsKLXN0YXRpYyBDQVJEMzIgc2V0dXBfaW50X3ZlY3Qodm9pZCk7Ci0jaWZkZWYgX19pYTMyX18KLXN0YXRpYyBDQVJEMzIgc2V0dXBfcHJpbWFyeV9pbnRfdmVjdCh2b2lkKTsKLSNlbmRpZgotc3RhdGljIGludCBjaGtzdW0oQ0FSRDggKnN0YXJ0KTsKLXN0YXRpYyB2b2lkIHNldHVwX2Jpb3NfcmVncyhpODZiaW9zUmVnc1B0ciByZWdzLCBDQVJEMzIgYXgpOwotc3RhdGljIHZvaWQgcHJpbnRfcmVncyhpODZiaW9zUmVnc1B0ciByZWdzKTsKLXN0YXRpYyB2b2lkIHByaW50X3VzYWdlKHZvaWQpOwotc3RhdGljIHZvaWQgc2V0X2hsdChCb29sIHNldCk7Ci1zdGF0aWMgdm9pZCBzZXRfaW9wZXJtKHZvaWQpOwotCi1leHRlcm4gdm9pZCB5eXBhcnNlKCk7Ci0KLXZvaWQgbG9hZENvZGVUb01lbSh1bnNpZ25lZCBjaGFyICpwdHIsIENBUkQ4ICpjb2RlKTsKLXZvaWQgZHByaW50KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci0KLXN0YXRpYyBpbnQgdnJhbV9tYXBwZWQgPSAwOwotc3RhdGljIGNoYXIqIGJpb3NfdmFyID0gTlVMTDsKLXN0YXRpYyBDQVJEOCBzYXZlX21zcjsKLXN0YXRpYyBDQVJEOCBzYXZlX3BvczEwMjsKLXN0YXRpYyBDQVJEOCBzYXZlX3ZzZTsKLXN0YXRpYyBDQVJEOCBzYXZlXzQ2ZTg7Ci1zdGF0aWMgaGFsdHBvaW50cyBobHRwWzIwXSA9IHsgezAsIDB9LCB9OwotCi1jb25zb2xlIENvbnNvbGUgPSB7LTEsLTF9Owotc3RydWN0IGNvbmZpZyBDb25maWc7Ci0KLWludCBtYWluKGludCBhcmdjLGNoYXIgKiphcmd2KQotewotICAgIGludCBjOwotCi0gICAgQ29uZmlnLlByaW50UG9ydCA9IFBSSU5UX1BPUlQ7Ci0gICAgQ29uZmlnLklvU3RhdGlzdGljcyA9IElPX1NUQVRJU1RJQ1M7Ci0gICAgQ29uZmlnLlByaW50SXJxID0gUFJJTlRfSVJROwotICAgIENvbmZpZy5QcmludFBjaSA9IFBSSU5UX1BDSTsKLSAgICBDb25maWcuU2hvd0FsbERldiA9IFNIT1dfQUxMX0RFVjsKLSAgICBDb25maWcuUHJpbnRJcCA9IFBSSU5UX0lQOwotICAgIENvbmZpZy5TYXZlQmlvcyA9IFNBVkVfQklPUzsKLSAgICBDb25maWcuVHJhY2UgPSBUUkFDRTsKLSAgICBDb25maWcuQ29uZmlnQWN0aXZlT25seSA9IENPTkZJR19BQ1RJVkVfT05MWTsgIC8qIGJvb3QgKi8KLSAgICBDb25maWcuQ29uZmlnQWN0aXZlRGV2aWNlID0gQ09ORklHX0FDVElWRV9ERVZJQ0U7IC8qIGJvb3QgKi8KLSAgICBDb25maWcuTWFwU3lzQmlvcyA9IE1BUF9TWVNfQklPUzsKLSAgICBDb25maWcuUmVzb3J0ID0gUkVTT1JUOyAgLyogYm9vdCAqLwotICAgIENvbmZpZy5GaXhSb20gPSBGSVhfUk9NOwotICAgIENvbmZpZy5Ob0NvbnNvbGUgPSBOT19DT05TT0xFOwotICAgIENvbmZpZy5Cb290T25seSA9IEZBTFNFOwotICAgIENvbmZpZy5WZXJib3NlID0gVkVSQk9TRTsKLQotICAgIG9wdGVyciA9IDA7Ci0gICAgd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsYXJndiwicHNpY2FQU3RBZGJyZm52Oj8iKSkgIT0gRU9GKSB7Ci0gICAgc3dpdGNoKGMpIHsKLSAgICBjYXNlICdwJzoKLQlDb25maWcuUHJpbnRQb3J0ID0gVFJVRTsKLQlicmVhazsKLSAgICBjYXNlICdzJzoKLQlDb25maWcuSW9TdGF0aXN0aWNzID0gVFJVRTsKLQlicmVhazsKLSAgICBjYXNlICdpJzoKLQlDb25maWcuUHJpbnRJcnEgPSBUUlVFOwotCWJyZWFrOwotICAgIGNhc2UgJ2MnOgotCUNvbmZpZy5QcmludFBjaSA9IFRSVUU7Ci0JYnJlYWs7Ci0gICAgY2FzZSAnYSc6Ci0JQ29uZmlnLlNob3dBbGxEZXYgPSBUUlVFOwotCWJyZWFrOwotICAgIGNhc2UgJ1AnOgotCUNvbmZpZy5QcmludElwID0gVFJVRTsKLQlicmVhazsKLSAgICBjYXNlICdTJzoKLQlDb25maWcuU2F2ZUJpb3MgPSBUUlVFOwotCWJyZWFrOwotICAgIGNhc2UgJ3QnOgotCUNvbmZpZy5UcmFjZSA9IFRSVUU7Ci0JYnJlYWs7Ci0gICAgY2FzZSAnQSc6Ci0JQ29uZmlnLkNvbmZpZ0FjdGl2ZU9ubHkgPSBUUlVFOwotCWJyZWFrOwotICAgIGNhc2UgJ2QnOgotCUNvbmZpZy5Db25maWdBY3RpdmVEZXZpY2UgPSBUUlVFOwotCWJyZWFrOwotICAgIGNhc2UgJ2InOgotCUNvbmZpZy5NYXBTeXNCaW9zID0gVFJVRTsKLQlicmVhazsKLSAgICBjYXNlICdyJzoKLQlDb25maWcuUmVzb3J0ID0gVFJVRTsKLQlicmVhazsKLSAgICBjYXNlICdmJzoKLQlDb25maWcuRml4Um9tID0gVFJVRTsKLQlicmVhazsKLSAgICBjYXNlICduJzoKLQlDb25maWcuTm9Db25zb2xlID0gVFJVRTsKLQlicmVhazsKLSAgICBjYXNlICd2JzoKLQlDb25maWcuVmVyYm9zZSA9IHN0cnRvbChvcHRhcmcsTlVMTCwwKTsKLQlicmVhazsKLSAgICBjYXNlICc/JzoKLQlwcmludF91c2FnZSgpOwotCWJyZWFrOwotICAgIGRlZmF1bHQ6Ci0JYnJlYWs7Ci0gICAgfQotICAgIH0KLQotCi0gICAgaWYgKCFtYXAoKSkKLSAgICBleGl0KDEpOwotCi0gICAgaWYgKCFzZXR1cF9zeXN0ZW1fYmlvcygpKQotICAgIGV4aXQoMSk7Ci0KLSAgICBpb3BsKDMpOwotCi0gICAgc2Nhbl9wY2koKTsKLQotICAgIHNhdmVfbXNyID0gaW5iKDB4M0NDKTsKLSAgICBzYXZlX3ZzZSA9IGluYigweDNDMyk7Ci0gICAgc2F2ZV80NmU4ID0gaW5iKDB4NDZlOCk7Ci0gICAgc2F2ZV9wb3MxMDIgPSBpbmIoMHgxMDIpOwotCi0gICAgaWYgKENvbmZpZy5Cb290T25seSkgewotCi0gICAgaWYgKCFDdXJyZW50UGNpICYmICFDb25maWcuQ29uZmlnQWN0aXZlRGV2aWNlCi0JJiYgIUNvbmZpZy5Db25maWdBY3RpdmVPbmx5KSB7Ci0JaW9wbCgwKTsKLQl1bm1hcCgpOwotCWV4aXQgKDEpOwotICAgIH0KLSAgICBjYWxsX2Jvb3QoTlVMTCk7Ci0gICAgfSBlbHNlIHsKLSAgICB1c2luZ19oaXN0b3J5KCk7Ci0gICAgeXlwYXJzZSgpOwotICAgIH0KLQotICAgIHVubWFwKCk7Ci0KLSAgICBwY2lWaWRlb1Jlc3RvcmUoKTsKLQotICAgIG91dGIoMHgxMDIsIHNhdmVfcG9zMTAyKTsKLSAgICBvdXRiKDB4NDZlOCwgc2F2ZV80NmU4KTsKLSAgICBvdXRiKDB4M0MzLCBzYXZlX3ZzZSk7Ci0gICAgb3V0YigweDNDMiwgc2F2ZV9tc3IpOwotCi0gICAgaW9wbCgwKTsKLQotICAgIGNsb3NlX2NvbnNvbGUoQ29uc29sZSk7Ci0KLSAgICBleGl0KDApOwotfQotCi0KLXZvaWQKLWNhbGxfYm9vdChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0gICAgaW50IEFjdGl2ZV9pc19QY2kgPSAwOwotICAgIENBUkQzMiB2Ymlvc19iYXNlOwotCi0gICAgQ3VycmVudFBjaSA9IFBjaUxpc3Q7Ci0gICAgQ29uc29sZSA9IG9wZW5fY29uc29sZSgpOwotCi0gICAgc2V0X2lvcGVybSgpOwotCi0KLSAgICBzaWduYWwoMixzaWdfaGFuZGxlcik7Ci0gICAgc2lnbmFsKDExLHNpZ19oYW5kbGVyKTsKLQotICAgIC8qIGRpc2FibGUgcHJpbWFyeSBjYXJkICovCi0gICAgcGNpVmlkZW9SZXN0b3JlKCk7IC8qIHJlc2V0IFBDSSBzdGF0ZSB0byBzZWUgcHJpbWFyeSBjYXJkICovCi0gICAgb3V0YigweDNDMix+KENBUkQ4KTB4MDMgJiBzYXZlX21zcik7Ci0gICAgb3V0YigweDNDMyx+KENBUkQ4KTB4MDEgJiBzYXZlX3ZzZSk7Ci0gICAgb3V0YigweDQ2ZTgsIH4oQ0FSRDgpMHgwOCAmIHNhdmVfNDZlOCk7Ci0gICAgb3V0YigweDEwMiwgfihDQVJEOCkweDAxICYgc2F2ZV9wb3MxMDIpOwotCi0gICAgcGNpVmlkZW9EaXNhYmxlKCk7Ci0KLSAgICB3aGlsZSAoQ3VycmVudFBjaSkgewotICAgIENBUkQxNiBheDsKLQotICAgIGlmIChDdXJyZW50UGNpLT5hY3RpdmUpIHsKLQlBY3RpdmVfaXNfUGNpID0gMTsKLQlpZiAoIUNvbmZpZy5Db25maWdBY3RpdmVEZXZpY2UgJiYgIWRldikgewotCUN1cnJlbnRQY2kgPSBDdXJyZW50UGNpLT5uZXh0OwotCWNvbnRpbnVlOwotCX0KLSAgICB9IGVsc2UgaWYgKENvbmZpZy5Db25maWdBY3RpdmVPbmx5ICYmICFkZXYpIHsKLQlDdXJyZW50UGNpID0gQ3VycmVudFBjaS0+bmV4dDsKLQljb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKGRldiAmJiAoKGRldi0+dHlwZSAhPSBQQ0kpCi0JICAgIHx8IChkZXYtPnR5cGUgPT0gUENJCi0JICAgICYmIChkZXYtPmxvYy5wY2kuZGV2ICE9IEN1cnJlbnRQY2ktPmRldgotCQl8fCBkZXYtPmxvYy5wY2kuYnVzICE9IEN1cnJlbnRQY2ktPmJ1cwotCQl8fCBkZXYtPmxvYy5wY2kuZnVuYyAhPSBDdXJyZW50UGNpLT5mdW5jKSkpKSB7Ci0JQ3VycmVudFBjaSA9IEN1cnJlbnRQY2ktPm5leHQ7Ci0JY29udGludWU7Ci0gICAgfQotCi0gICAgRW5hYmxlQ3VycmVudCgpOwotCi0gICAgaWYgKEN1cnJlbnRQY2ktPmFjdGl2ZSkgewotCW91dGIoMHgxMDIsIHNhdmVfcG9zMTAyKTsKLQlvdXRiKDB4NDZlOCwgc2F2ZV80NmU4KTsKLQlvdXRiKDB4M0MzLCBzYXZlX3ZzZSk7Ci0Jb3V0YigweDNDMiwgc2F2ZV9tc3IpOwotICAgIH0KLQotICAgIC8qIGNsZWFyIGludGVycnVwdCB2ZWN0b3JzICovCi0jaWZkZWYgX19pYTMyX18KLSAgICB2Ymlvc19iYXNlID0gQ3VycmVudFBjaS0+YWN0aXZlID8gc2V0dXBfcHJpbWFyeV9pbnRfdmVjdCgpCi0JOiBzZXR1cF9pbnRfdmVjdCgpOwotI2Vsc2UKLSAgICB2Ymlvc19iYXNlID0gc2V0dXBfaW50X3ZlY3QoKTsKLSNlbmRpZgotICAgIGF4ID0gKChDQVJEMTYpKEN1cnJlbnRQY2ktPmJ1cykgPDwgOCkKLQl8IChDdXJyZW50UGNpLT5kZXYgPDwgMykgfCAoQ3VycmVudFBjaS0+ZnVuYyAmIDB4Nyk7Ci0gICAgaWYgKENvbmZpZy5WZXJib3NlID4gMSkgUF9wcmludGYoImF4OiAweCV4XG4iLGF4KTsKLQotICAgIEJvb3RCaW9zID0gZmluZFBjaUJ5SURzKEN1cnJlbnRQY2ktPmJ1cyxDdXJyZW50UGNpLT5kZXYsCi0JCSAgIEN1cnJlbnRQY2ktPmZ1bmMpOwotICAgIGlmICghKChtYXBQY2lSb20oQm9vdEJpb3MpICYmIGNoa3N1bSgoQ0FSRDgqKVZfQklPUykpCi0JICB8fCAoQ3VycmVudFBjaS0+YWN0aXZlICYmIGNvcHlfdmJpb3ModmJpb3NfYmFzZSkpKSkgewotCUN1cnJlbnRQY2kgPSBDdXJyZW50UGNpLT5uZXh0OwotCWNvbnRpbnVlOwotICAgIH0KLSAgICBpZiAoIW1hcF92cmFtKCkpIHsKLQlDdXJyZW50UGNpID0gQ3VycmVudFBjaS0+bmV4dDsKLQljb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKENvbmZpZy5TYXZlQmlvcykgc2F2ZV9iaW9zX3RvX2ZpbGUoKTsKLSAgICBwcmludGYoImluaXRpYWxpemluZyBQQ0kgYnVzOiAlaSBkZXY6ICVpIGZ1bmM6ICVpXG4iLEN1cnJlbnRQY2ktPmJ1cywKLQkgICBDdXJyZW50UGNpLT5kZXYsQ3VycmVudFBjaS0+ZnVuYyk7Ci0gICAgYm9vdEJJT1MoYXgpOwotICAgIHVubWFwX3ZyYW0oKTsKLQotICAgIGlmIChDdXJyZW50UGNpLT5hY3RpdmUpCi0JY2xvc2VfY29uc29sZShDb25zb2xlKTsKLQotICAgIGlmIChkZXYpIHJldHVybjsKLQotICAgIEN1cnJlbnRQY2kgPSBDdXJyZW50UGNpLT5uZXh0OwotICAgIH0KLQotICAgIC8qIFdlIGhhdmUgYW4gSVNBIGRldmljZSAtIGNvbmZpZ3VyZSBpZiByZXF1ZXN0ZWQgKi8KLSAgICBpZiAoIUFjdGl2ZV9pc19QY2kgLyogbm8gaXNhIGNhcmQgaW4gc3lzdGVtISAqLwotICAgICYmICgoIWRldiAmJiAoQ29uZmlnLkNvbmZpZ0FjdGl2ZURldmljZSB8fCBDb25maWcuQ29uZmlnQWN0aXZlT25seSkpCi0JfHwgKGRldiAmJiBkZXYtPnR5cGUgPT0gSVNBKSkpIHsKLQotICAgIHBjaVZpZGVvRGlzYWJsZSgpOwotCi0gICAgaWYgKCFkZXYgfHwgZGV2LT50eXBlID09IElTQSkgewotCW91dGIoMHgxMDIsIHNhdmVfcG9zMTAyKTsKLQlvdXRiKDB4NDZlOCwgc2F2ZV80NmU4KTsKLQlvdXRiKDB4M0MzLCBzYXZlX3ZzZSk7Ci0Jb3V0YigweDNDMiwgc2F2ZV9tc3IpOwotCi0jaWZkZWYgX19pYTMyX18KLQl2Ymlvc19iYXNlID0gc2V0dXBfcHJpbWFyeV9pbnRfdmVjdCgpOwotI2Vsc2UKLQl2Ymlvc19iYXNlID0gc2V0dXBfaW50X3ZlY3QoKTsKLSNlbmRpZgotCWlmIChjb3B5X3ZiaW9zKHZiaW9zX2Jhc2UpKSB7Ci0KLQlpZiAoQ29uZmlnLlNhdmVCaW9zKSBzYXZlX2Jpb3NfdG9fZmlsZSgpOwotCWlmICAobWFwX3ZyYW0oKSkgewotCSAgICBwcmludGYoImluaXRpYWxpemluZyBJU0EgYnVzXG4iKTsKLQkgICAgYm9vdEJJT1MoMCk7Ci0JfQotCX0KLQotCXVubWFwX3ZyYW0oKTsKLQlzbGVlcCgxKTsKLQljbG9zZV9jb25zb2xlKENvbnNvbGUpOwotICAgIH0KLSAgICB9Ci0KLQotfQotCi1pbnQKLW1hcCh2b2lkKQotewotICAgIHZvaWQqIG1lbTsKLSAgICBtZW0gPSBtbWFwKDAsIChzaXplX3QpU0laRSwKLQkgICAgICAgUFJPVF9FWEVDIHwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkgICAgICAgTUFQX0ZJWEVEIHwgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTiwKLQkgICAgICAgLTEsIDAgKTsKLSAgICBpZiAobWVtICE9IDApIHsKLQlwZXJyb3IoImFub255bW91cyBtYXAiKTsKLQlyZXR1cm4gKDApOwotICAgIH0KLSAgICBtZW1zZXQobWVtLDAsU0laRSk7Ci0KLSAgICByZXR1cm4gKDEpOwotfQotCi1zdGF0aWMgdm9pZAotdW5tYXAodm9pZCkKLXsKLSAgICBtdW5tYXAoMCxTSVpFKTsKLX0KLQotc3RhdGljIHZvaWQKLWJvb3RCSU9TKENBUkQxNiBheCkKLXsKLSAgICBpODZiaW9zUmVncyBiUmVnczsKLSNpZmRlZiBWODZCSU9TX0RFQlVHCi0gICAgcHJpbnRmKCJzdGFydGluZyBCSU9TXG4iKTsKLSNlbmRpZgotICAgIHNldHVwX2lvKCk7Ci0gICAgc2V0dXBfYmlvc19yZWdzKCZiUmVncywgYXgpOwotICAgIGxvYWRDb2RlVG9NZW0oKHVuc2lnbmVkIGNoYXIgKikgQklPU19TVEFSVCwgY29kZSk7Ci0gICAgZG9feDg2KEJJT1NfU1RBUlQsJmJSZWdzKTsKLSNpZmRlZiBWODZCSU9TX0RFQlVHCi0gICAgcHJpbnRmKCJkb25lXG4iKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW50Ci1tYXBfdnJhbSh2b2lkKQotewotICAgIGludCBtZW1fZmQ7Ci0KLSNpZmRlZiBfX2lhNjRfXwotICAgIGlmICgobWVtX2ZkID0gb3BlbihNRU1fRklMRSxPX1JEV1IgfCBPX1NZTkMpKTwwKQotI2Vsc2UKLSAgICBpZiAoKG1lbV9mZCA9IG9wZW4oTUVNX0ZJTEUsT19SRFdSKSk8MCkKLSNlbmRpZgotCXsKLQlwZXJyb3IoIm9wZW5pbmcgbWVtb3J5Iik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0jaWZkZWYgX19hbHBoYV9fCi0gICAgICAgaWYgKCFfYnVzX2Jhc2UoKSkgc3BhcnNlX3NoaWZ0ID0gNzsgLyogVWgsIG9oLCBKRU5TRU4uLi4gKi8KLQkgaWYgKCFfYnVzX2Jhc2Vfc3BhcnNlKCkpIHNwYXJzZV9zaGlmdCA9IDA7Ci0JIGlmICgodnJhbV9tYXAgPSBtbWFwKDAsKHNpemVfdCkgKFZSQU1fU0laRSA8PCBzcGFyc2Vfc2hpZnQpLAotCQkJCQkJIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JCQkJCQkgTUFQX1NIQVJFRCwKLQkJCQkJCSBtZW1fZmQsIChWUkFNX1NUQVJUIDw8IHNwYXJzZV9zaGlmdCkKLQkJCQkJCSB8IF9idXNfYmFzZV9zcGFyc2UoKSkpID09ICh2b2lkICopIC0xKQotI2Vsc2UKLSAgICAgIGlmIChtbWFwKCh2b2lkICopIFZSQU1fU1RBUlQsIChzaXplX3QpIFZSQU1fU0laRSwKLQkJCSBQUk9UX0VYRUMgfCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVEIHwgTUFQX0ZJWEVELAotCQkJIG1lbV9mZCwgVlJBTV9TVEFSVCkgPT0gKHZvaWQgKikgLTEpCi0jZW5kaWYKLSAgICAgIHsKLQlwZXJyb3IoIm1tYXAgZXJyb3IgaW4gbWFwX2hhcmR3YXJlX3JhbSAoMSkiKTsKLQkgICAgY2xvc2UobWVtX2ZkKTsKLQkgICAgcmV0dXJuICgwKTsKLQl9Ci0gICAgdnJhbV9tYXBwZWQgPSAxOwotICAgIGNsb3NlKG1lbV9mZCk7Ci0gICAgcmV0dXJuICgxKTsKLX0KLQotc3RhdGljIHZvaWQKLXVubWFwX3ZyYW0odm9pZCkKLXsKLSAgICBpZiAoIXZyYW1fbWFwcGVkKSByZXR1cm47Ci0KLSAgICBtdW5tYXAoKHZvaWQqKVZSQU1fU1RBUlQsVlJBTV9TSVpFKTsKLSAgICB2cmFtX21hcHBlZCA9IDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWNvcHlfdmJpb3MobWVtVHlwZSB2X2Jhc2UpCi17Ci0gICAgaW50IG1lbV9mZDsKLSAgICB1bnNpZ25lZCBjaGFyICp0bXA7Ci0gICAgaW50IHNpemU7Ci0KLSAgICBpZiAoKG1lbV9mZCA9IG9wZW4oTUVNX0ZJTEUsT19SRE9OTFkpKTwwKSB7Ci0JcGVycm9yKCJvcGVuaW5nIG1lbW9yeSIpOwotCXJldHVybiAoMCk7Ci0gICAgfQotCi0gICAgaWYgKGxzZWVrKG1lbV9mZCwob2ZmX3QpIHZfYmFzZSwgU0VFS19TRVQpICE9IChvZmZfdCkgdl9iYXNlKSB7Ci0JICBmcHJpbnRmKHN0ZGVyciwiQ2Fubm90IGxzZWVrXG4iKTsKLQkgIGdvdG8gRXJyb3I7Ci0gICAgICB9Ci0gICAgdG1wID0gKHVuc2lnbmVkIGNoYXIgKiltYWxsb2MoMyk7Ci0gICAgaWYgKHJlYWQobWVtX2ZkLCAoY2hhciAqKXRtcCwgKHNpemVfdCkgMykgIT0gKHNpemVfdCkgMykgewotCSAgICBmcHJpbnRmKHN0ZGVyciwiQ2Fubm90IHJlYWRcbiIpOwotCWdvdG8gRXJyb3I7Ci0gICAgfQotICAgIGlmIChsc2VlayhtZW1fZmQsKG9mZl90KSB2X2Jhc2UsU0VFS19TRVQpICE9IChvZmZfdCkgdl9iYXNlKQotCWdvdG8gRXJyb3I7Ci0KLSAgICBpZiAoKnRtcCAhPSAweDU1IHx8ICoodG1wKzEpICE9IDB4QUEgKSB7Ci0JZnByaW50ZihzdGRlcnIsIk5vIGJpb3MgZm91bmQgYXQ6IDB4JWx4XG4iLHZfYmFzZSk7Ci0JZ290byBFcnJvcjsKLSAgICB9Ci0jaWZkZWYgREVCVUcKLQlkcHJpbnQoKHVuc2lnbmVkIGxvbmcpdG1wLDB4MTAwKTsKLSNlbmRpZgotICAgIHNpemUgPSAqKHRtcCsyKSAqIDUxMjsKLQotICAgIGlmIChyZWFkKG1lbV9mZCwgKGNoYXIgKil2X2Jhc2UsIChzaXplX3QpIHNpemUpICE9IChzaXplX3QpIHNpemUpIHsKLQkgICAgZnByaW50ZihzdGRlcnIsIkNhbm5vdCByZWFkXG4iKTsKLQlnb3RvIEVycm9yOwotICAgIH0KLSAgICBmcmVlKHRtcCk7Ci0gICAgY2xvc2UobWVtX2ZkKTsKLSAgICBpZiAoIWNoa3N1bSgoQ0FSRDgqKXZfYmFzZSkpCi0JcmV0dXJuICgwKTsKLQotICAgIHJldHVybiAoMSk7Ci0KLUVycm9yOgotICAgIHBlcnJvcigidl9iaW9zIik7Ci0gICAgY2xvc2UobWVtX2ZkKTsKLSAgICByZXR1cm4gKDApOwotfQotCi1zdGF0aWMgaW50Ci1jb3B5X3N5c19iaW9zKHZvaWQpCi17Ci0jZGVmaW5lIFNZU19CSU9TIDB4RjAwMDAKLSAgICBpbnQgbWVtX2ZkOwotCi0gICAgaWYgKChtZW1fZmQgPSBvcGVuKE1FTV9GSUxFLE9fUkRPTkxZKSk8MCkgewotCXBlcnJvcigib3BlbmluZyBtZW1vcnkiKTsKLQlyZXR1cm4gKDApOwotICAgIH0KLQotICAgIGlmIChsc2VlayhtZW1fZmQsKG9mZl90KSBTWVNfQklPUyxTRUVLX1NFVCkgIT0gKG9mZl90KSBTWVNfQklPUykKLQlnb3RvIEVycm9yOwotICAgIGlmIChyZWFkKG1lbV9mZCwgKGNoYXIgKilTWVNfQklPUywgKHNpemVfdCkgMHhGRkZGKSAhPSAoc2l6ZV90KSAweEZGRkYpCi0JZ290byBFcnJvcjsKLQotICAgIGNsb3NlKG1lbV9mZCk7Ci0gICAgcmV0dXJuICgxKTsKLQotRXJyb3I6Ci0gICAgcGVycm9yKCJzeXNfYmlvcyIpOwotICAgIGNsb3NlKG1lbV9mZCk7Ci0gICAgcmV0dXJuICgwKTsKLX0KLQotdm9pZAotbG9hZENvZGVUb01lbSh1bnNpZ25lZCBjaGFyICpwdHIsIENBUkQ4IGNvZGVbXSkKLXsKLSAgICBpbnQgaTsKLSAgICBDQVJEOCB2YWw7Ci0gICAgaW50IHNpemUgPSBjb2RlWzBdOwotCi0gICAgZm9yICggaT0xO2k8PXNpemU7aSsrKSB7Ci0JdmFsID0gY29kZVtpXTsKLQkqcHRyKysgPSB2YWw7Ci0gICAgfQotICAgIHJldHVybjsKLX0KLQotdm9pZAotZHByaW50KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLSAgICBpbnQgaSxqOwotICAgIGNoYXIgKmMgPSAoY2hhciAqKXN0YXJ0OwotCi0gICAgZm9yIChqID0gMDsgaiA8IChzaXplID4+IDQpOyBqKyspIHsKLSAgICBjaGFyICpkID0gYzsKLSAgICBwcmludGYoIlxuMHglbHg6ICAiLCh1bnNpZ25lZCBsb25nKWMpOwotICAgIGZvciAoaSA9IDA7IGk8MTY7IGkrKykKLQlwcmludGYoIiUyLjJ4ICIsKHVuc2lnbmVkIGNoYXIpICgqKGMrKykpKTsKLSAgICBjID0gZDsKLSAgICBmb3IgKGkgPSAwOyBpPDE2OyBpKyspIHsKLQlwcmludGYoIiVjIiwoKCgoQ0FSRDgpKCpjKSkgPiAzMikgJiYgKCgoQ0FSRDgpKCpjKSkgPCAxMjgpKSA/Ci0JICAgKHVuc2lnbmVkIGNoYXIpICgqKGMpKTogJy4nKTsKLQljKys7Ci0gICAgfQotICAgIH0KLSAgICBwcmludGYoIlxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zYXZlX2Jpb3NfdG9fZmlsZSh2b2lkKQotewotICAgIHN0YXRpYyBpbnQgbnVtID0gMDsKLSAgICBpbnQgc2l6ZSwgY291bnQ7Ci0gICAgY2hhciBmaWxlX25hbWVbMjU2XTsKLSAgICBpbnQgZmQ7Ci0KLSAgICBzcHJpbnRmKGZpbGVfbmFtZSwiYmlvc18laS5maWwiLG51bSk7Ci0gICAgaWYgKChmZCA9ICBvcGVuKGZpbGVfbmFtZSxPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLDAwNjQ0KSkgPT0gLTEpCi0JcmV0dXJuOwotICAgIHNpemUgPSAoKih1bnNpZ25lZCBjaGFyKikoVl9CSU9TICsgMikpICogNTEyOwotI2lmZGVmIFY4NkJJT1NfREVCVUcKLSAgICBkcHJpbnQoVl9CSU9TLDIwKTsKLSNlbmRpZgotICAgIGlmICgoY291bnQgPSB3cml0ZShmZCwodm9pZCAqKShWX0JJT1MpLHNpemUpKSAhPSBzaXplKQotCWZwcmludGYoc3RkZXJyLCJvbmx5IHNhdmVkICVpIG9mICVpIGJ5dGVzXG4iLHNpemUsY291bnQpOwotICAgIG51bSsrOwotfQotCi1zdGF0aWMgdm9pZAotc2lnX2hhbmRsZXIoaW50IHVudXNlZCkKLXsKLSAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICBmZmx1c2goc3RkZXJyKTsKLQotICAgIC8qIHB1dCBzeXN0ZW0gYmFjayBpbiBhIHNhdmUgc3RhdGUgKi8KLSAgICB1bm1hcF92cmFtKCk7Ci0gICAgcGNpVmlkZW9SZXN0b3JlKCk7Ci0gICAgb3V0YigweDEwMiwgc2F2ZV9wb3MxMDIpOwotICAgIG91dGIoMHg0NmU4LCBzYXZlXzQ2ZTgpOwotICAgIG91dGIoMHgzQzMsIHNhdmVfdnNlKTsKLSAgICBvdXRiKDB4M0MyLCBzYXZlX21zcik7Ci0KLSAgICBjbG9zZV9jb25zb2xlKENvbnNvbGUpOwotICAgIGlvcGwoMCk7Ci0gICAgdW5tYXAoKTsKLQotICAgIGV4aXQoMSk7Ci19Ci0KLS8qCi0gKiBGb3IgaW5pdGlhbGl6YXRpb24gd2UganVzdCBwYXNzIGF4IHRvIHRoZSBCSU9TLgotICogUENJIEJJT1NlcyBuZWVkIHRoaXMuIEFsbCBvdGhlciByZWdpc3RlciBhcmUgc2V0IDAuCi0gKi8KLXN0YXRpYyB2b2lkIHNldHVwX2Jpb3NfcmVncyhpODZiaW9zUmVnc1B0ciByZWdzLCBDQVJEMzIgYXgpCi17Ci0gICAgcmVncy0+YXggPSBheDsKLSAgICByZWdzLT5ieCA9IDA7Ci0gICAgcmVncy0+Y3ggPSAwOwotICAgIHJlZ3MtPmR4ID0gMDsKLSAgICByZWdzLT5lcyA9IDA7Ci0gICAgcmVncy0+ZHMgPSAweDQwOyAgICAgICAgICAgICAgIC8qIHN0YW5kYXJkIHBjIGRzICovCi0gICAgcmVncy0+c2kgPSAwOwotICAgIHJlZ3MtPmRpID0gMDsKLX0KLQotLyoKLSAqIGhlcmUgd2UgYXJlIHJlYWxseSBwYXJhbm9pZCBhYm91dCBmYWtpbmcgYSAicmVhbCIKLSAqIEJJT1MuIE1vc3Qgb2YgdGhpcyBpbmZvcm1hdGlvbiB3YXMgcHVsbGVkIGZyb20KLSAqIGRvc2VtLgotICovCi0KLSNpZmRlZiBfX2lhMzJfXwotc3RhdGljIENBUkQzMgotc2V0dXBfcHJpbWFyeV9pbnRfdmVjdCh2b2lkKQotewotICAgIGludCBtZW1fZmQ7Ci0gICAgQ0FSRDMyIHZiYXNlOwotICAgIHZvaWQgKm1hcDsKLQotICAgIGlmICgobWVtX2ZkID0gb3BlbihNRU1fRklMRSxPX1JEV1IpKTwwKQotCSAgICB7Ci0gICAgcGVycm9yKCJvcGVuaW5nIG1lbW9yeSIpOwotICAgIHJldHVybiAoMCk7Ci0gICAgfQotCi0gICAgaWYgKChtYXAgPSBtbWFwKCh2b2lkICopIDAsIChzaXplX3QpIDB4MjAwMCwKLQkgUFJPVF9FWEVDIHwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwKLQkgbWVtX2ZkLCAwKSkgPT0gKHZvaWQgKiktMSkgICB7Ci0gICAgcGVycm9yKCJtbWFwIGVycm9yIGluIG1hcF9oYXJkd2FyZV9yYW0gKDIpIik7Ci0gICAgY2xvc2UobWVtX2ZkKTsKLSAgICByZXR1cm4gKDApOwotICAgIH0KLQotICAgIGNsb3NlKG1lbV9mZCk7Ci0gICAgbWVtY3B5KDAsbWFwLEJJT1NfTUVNKTsKLSAgICBtdW5tYXAobWFwLDB4MjAwMCk7Ci0gICAgLyoKLSAgICAgKiBjcmVhdGUgYSBiYWNrdXAgY29weSBvZiB0aGUgYmlvcyB2YXJpYWJsZXMgdG8gd3JpdGUgYmFjayB0aGUKLSAgICAgKiBtb2RpZmllZCB2YWx1ZXMKLSAgICAgKi8KLSAgICBpZiAoIWJpb3NfdmFyKQotICAgIGJpb3NfdmFyID0gKGNoYXIgKiltYWxsb2MoQklPU19NRU0pOwotICAgIG1lbWNweShiaW9zX3ZhciwwLEJJT1NfTUVNKTsKLQotICAgIHZiYXNlID0gKCooKENBUkQxNiopKDB4MTAgPDwgMikgKyAxKSkgPDwgNDsKLSAgICBpZiAoQ29uZmlnLlZlcmJvc2UgPiAwKSBwcmludGYoInZiYXNlOiAweCV4XG4iLHZiYXNlKTsKLSAgICByZXR1cm4gdmJhc2U7Ci19Ci0jZW5kaWYKLQotc3RhdGljIENBUkQzMgotc2V0dXBfaW50X3ZlY3Qodm9pZCkKLXsKLSAgICBjb25zdCBDQVJEMTYgY3MgPSAweDA7Ci0gICAgY29uc3QgQ0FSRDE2IGlwID0gMHgwOwotICAgIGludCBpOwotCi0gICAgLyogbGV0IHRoZSBpbnQgdmVjdHMgcG9pbnQgdG8gdGhlIFNZU19CSU9TIHNlZyAqLwotICAgIGZvciAoaT0wOyBpPDB4ODA7IGkrKykgewotCSgoQ0FSRDE2KikwKVtpPDwxXSA9IGlwOwotCSgoQ0FSRDE2KikwKVsoaTw8MSkrMV0gPSBjczsKLSAgICB9Ci0gICAgLyogdmlkZW8gaW50ZXJydXB0cyBkZWZhdWx0IGxvY2F0aW9uICovCi0gICAgKChDQVJEMTYqKTApWygweDQyPDwxKSsxXSA9IDB4ZjAwMDsKLSAgICAoKENBUkQxNiopMClbMHg0Mjw8MV0gPSAweGYwNjU7Ci0gICAgKChDQVJEMTYqKTApWygweDEwPDwxKSsxXSA9IDB4ZjAwMDsKLSAgICAoKENBUkQxNiopMClbMHgxMDw8MV0gPSAweGYwNjU7Ci0gICAgLyogdmlkZW8gcGFyYW0gdGFibGUgZGVmYXVsdCBsb2NhdGlvbiAoaW50IDFkKSAqLwotICAgICgoQ0FSRDE2KikwKVsoMHgxZDw8MSkrMV0gPSAweGYwMDA7Ci0gICAgKChDQVJEMTYqKTApWzB4MWQ8PDFdID0gMHhmMEE0OwotICAgIC8qIGZvbnQgdGFibGVzIGRlZmF1bHQgbG9jYXRpb24gKGludCAxRikgKi8KLSAgICAoKENBUkQxNiopMClbKDB4MWY8PDEpKzFdID0gMHhmMDAwOwotICAgICgoQ0FSRDE2KikwKVsweDFmPDwxXSA9IDB4ZmE2ZTsKLQotICAgIC8qIGludCAxMSBkZWZhdWx0IGxvY2F0aW9uICovCi0gICAgKChDQVJEMTYqKTApWygweDExPDwxKSsxXSA9IDB4ZjAwMDsKLSAgICAoKENBUkQxNiopMClbMHgxMTw8MV0gPSAweGY4NGQ7Ci0gICAgLyogaW50IDEyIGRlZmF1bHQgbG9jYXRpb24gKi8KLSAgICAoKENBUkQxNiopMClbKDB4MTI8PDEpKzFdID0gMHhmMDAwOwotICAgICgoQ0FSRDE2KikwKVsweDEyPDwxXSA9IDB4Zjg0MTsKLSAgICAvKiBpbnQgMTUgZGVmYXVsdCBsb2NhdGlvbiAqLwotICAgICgoQ0FSRDE2KikwKVsoMHgxNTw8MSkrMV0gPSAweGYwMDA7Ci0gICAgKChDQVJEMTYqKTApWzB4MTU8PDFdID0gMHhmODU5OwotICAgIC8qIGludCAxQSBkZWZhdWx0IGxvY2F0aW9uICovCi0gICAgKChDQVJEMTYqKTApWygweDFhPDwxKSsxXSA9IDB4ZjAwMDsKLSAgICAoKENBUkQxNiopMClbMHgxYTw8MV0gPSAweGZmNmU7Ci0gICAgLyogaW50IDA1IGRlZmF1bHQgbG9jYXRpb24gKi8KLSAgICAoKENBUkQxNiopMClbKDB4MDU8PDEpKzFdID0gMHhmMDAwOwotICAgICgoQ0FSRDE2KikwKVsweDA1PDwxXSA9IDB4ZmY1NDsKLSAgICAvKiBpbnQgMDggZGVmYXVsdCBsb2NhdGlvbiAqLwotICAgICgoQ0FSRDE2KikwKVsoMHg4PDwxKSsxXSA9IDB4ZjAwMDsKLSAgICAoKENBUkQxNiopMClbMHg4PDwxXSA9IDB4ZmVhNTsKLSAgICAvKiBpbnQgMTMgZGVmYXVsdCBsb2NhdGlvbiAoZmRkKSAqLwotICAgICgoQ0FSRDE2KikwKVsoMHgxMzw8MSkrMV0gPSAweGYwMDA7Ci0gICAgKChDQVJEMTYqKTApWzB4MTM8PDFdID0gMHhlYzU5OwotICAgIC8qIGludCAwRSBkZWZhdWx0IGxvY2F0aW9uICovCi0gICAgKChDQVJEMTYqKTApWygweGU8PDEpKzFdID0gMHhmMDAwOwotICAgICgoQ0FSRDE2KikwKVsweGU8PDFdID0gMHhlZjU3OwotICAgIC8qIGludCAxNyBkZWZhdWx0IGxvY2F0aW9uICovCi0gICAgKChDQVJEMTYqKTApWygweDE3PDwxKSsxXSA9IDB4ZjAwMDsKLSAgICAoKENBUkQxNiopMClbMHgxNzw8MV0gPSAweGVmZDI7Ci0gICAgLyogZmRkIHRhYmxlIGRlZmF1bHQgbG9jYXRpb24gKGludCAxZSkgKi8KLSAgICAoKENBUkQxNiopMClbKDB4MWU8PDEpKzFdID0gMHhmMDAwOwotICAgICgoQ0FSRDE2KikwKVsweDFlPDwxXSA9IDB4ZWZjNzsKLSAgICByZXR1cm4gVl9CSU9TOwotfQotCi1zdGF0aWMgaW50Ci1zZXR1cF9zeXN0ZW1fYmlvcyh2b2lkKQotewotICAgIGNoYXIgKmRhdGUgPSAiMDYvMDEvOTkiOwotICAgIGNoYXIgKmVpc2FfaWRlbnQgPSAiUENJL0lTQSI7Ci0KLSAgICBpZiAoQ29uZmlnLk1hcFN5c0Jpb3MpIHsKLQotCWlmICghY29weV9zeXNfYmlvcygpKSByZXR1cm4gMDsKLQlyZXR1cm4gMTsKLQotICAgIH0gZWxzZSB7Ci0KLS8qICAgIG1lbXNldCgodm9pZCAqKTB4RjAwMDAsMHhmNCwweGZmZjcpOyAqLwotCi0JLyoKLQkgKiB3ZSB0cmFwIHRoZSAiaW5kdXN0cnkgc3RhbmRhcmQgZW50cnkgcG9pbnRzIiB0byB0aGUgQklPUwotCSAqIGFuZCBhbGwgb3RoZXIgbG9jYXRpb25zIGJ5IGZpbGxpbmcgdGhlbSB3aXRoICJobHQiCi0JICogVE9ETzogaW1wbGVtZW50IGhsdC1oYW5kbGVyIGZvciB0aGVzZQotCSAqLwotCW1lbXNldCgodm9pZCAqKTB4RjAwMDAsMHhmNCwweDEwMDAwKTsKLQotCS8qCi0JICogVE9ETzogd2Ugc2hvdWxkIGNvcHkgdGhlIGZkZCB0YWJsZSAoMHhmZWM1OS0weGZlYzViKQotCSAqIHRoZSB2aWRlbyBwYXJhbWV0ZXIgdGFibGUgKDB4ZjBhYy0weGYwZmIpCi0JICogYW5kIHRoZSBmb250IHRhYmxlcyAoMHhmYTZlLTB4ZmU2ZCkKLQkgKiBmcm9tIHRoZSBvcmlnaW5hbCBiaW9zIGhlcmUKLQkgKi8KLQotCS8qIHNldCBiaW9zIGRhdGUgKi8KLQlzdHJjcHkoKGNoYXIgKikweEZGRkY1LGRhdGUpOwotCS8qIHNldCB1cCBlaXNhIGlkZW50IHN0cmluZyAqLwotCXN0cmNweSgoY2hhciAqKTB4RkZGRDksZWlzYV9pZGVudCk7Ci0JLyogd3JpdGUgc3lzdGVtIG1vZGVsIGlkIGZvciBJQk0tQVQgKi8KLQkoKGNoYXIgKikwKVsweEZGRkZFXSA9IDB4ZmM7Ci0KLQlyZXR1cm4gMTsKLSAgICB9Ci0KLX0KLQotc3RhdGljIHZvaWQKLXVwZGF0ZV9iaW9zX3ZhcnModm9pZCkKLXsKLSAgICBpbnQgbWVtX2ZkOwotICAgIHZvaWQgKm1hcDsKLSAgICBtZW1UeXBlIGk7Ci0KLSNpZmRlZiBfX2lhNjRfXwotICAgIGlmICgobWVtX2ZkID0gb3BlbihNRU1fRklMRSxPX1JEV1IgfCBPX1NZTkMpKTwwKQotI2Vsc2UKLSAgICBpZiAoKG1lbV9mZCA9IG9wZW4oTUVNX0ZJTEUsT19SRFdSKSk8MCkKLSNlbmRpZgotCSAgICB7Ci0gICAgcGVycm9yKCJvcGVuaW5nIG1lbW9yeSIpOwotICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoKG1hcCA9IG1tYXAoKHZvaWQgKikgMCwgKHNpemVfdCkgMHgyMDAwLAotCSBQUk9UX0VYRUMgfCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELAotCSBtZW1fZmQsIDApKSA9PSAodm9pZCAqKS0xKSAgIHsKLSAgICBwZXJyb3IoIm1tYXAgZXJyb3IgaW4gbWFwX2hhcmR3YXJlX3JhbSAoMykiKTsKLSAgICBjbG9zZShtZW1fZmQpOwotICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgQklPU19NRU07IGkrKykgewotICAgIGlmIChiaW9zX3ZhcltpXSAhPSAqKENBUkQ4KilpKQotCSooKENBUkQ4KiltYXAgKyBpKSA9ICooQ0FSRDgqKWk7Ci0gICAgfQotCi0gICAgbXVubWFwKG1hcCwweDIwMDApOwotICAgIGNsb3NlKG1lbV9mZCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoa3N1bShDQVJEOCAqc3RhcnQpCi17Ci0gIENBUkQxNiBzaXplOwotICBDQVJEOCB2YWwgPSAwOwotICBpbnQgaTsKLQotICBzaXplID0gKihzdGFydCsyKSAqIDUxMjsKLSAgZm9yIChpID0gMDsgaTxzaXplOyBpKyspCi0gICAgdmFsICs9ICooc3RhcnQgKyBpKTsKLQotICBpZiAoIXZhbCkKLSAgICByZXR1cm4gMTsKLQotICAgIGZwcmludGYoc3RkZXJyLCJCSU9TIGNrc3VtIHdyb25nIVxuIik7Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1ydW5JTlQoaW50IG51bSwgaTg2Ymlvc1JlZ3NQdHIgUmVncykKLXsKLSAgICBCb29sIGlzVmlkZW8gPSBGQUxTRTsKLSAgICBDQVJEOCBjb2RlX2ludFtdID0geyAzLCAweGNkLCAweDAwLCAweGY0IH07Ci0KLSAgICBjb2RlX2ludFsyXSA9IChDQVJEOCkgbnVtOwotCi0gICAgaWYgKG51bSA9PSAweDEwKQotICAgIGlzVmlkZW8gPSBUUlVFOwotCi0gICAgaWYgKCFzZXR1cF9zeXN0ZW1fYmlvcygpKQotICAgIHJldHVybjsKLQotICAgIGlmICgoaXNWaWRlbyAmJiAoIUN1cnJlbnRQY2kgfHwgQ3VycmVudFBjaS0+YWN0aXZlKSkgfHwgIWlzVmlkZW8pIHsKLSAgICBDQVJEMzIgdmJpb3NfYmFzZTsKLQotI2lmZGVmIF9faWEzMl9fCi0gICAgaWYgKCEodmJpb3NfYmFzZSA9IHNldHVwX3ByaW1hcnlfaW50X3ZlY3QoKSkpCi0jZWxzZQotICAgIGlmICghKHZiaW9zX2Jhc2UgPSBzZXR1cF9pbnRfdmVjdCgpKSkKLSNlbmRpZgotCXJldHVybjsKLSAgICBpZiAoIWNvcHlfdmJpb3ModmJpb3NfYmFzZSkpCi0JcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghbWFwX3ZyYW0oKSkKLSAgICByZXR1cm47Ci0KLSNpZmRlZiBWODZCSU9TX0RFQlVHCi0JcHJpbnRmKCJzdGFydGluZyBCSU9TXG4iKTsKLSNlbmRpZgotICAgIGxvYWRDb2RlVG9NZW0oKHVuc2lnbmVkIGNoYXIgKikgQklPU19TVEFSVCwgY29kZV9pbnQpOwotICAgIHNldHVwX2lvKCk7Ci0gICAgcHJpbnRfcmVncyhSZWdzKTsKLSAgICBzZXRfaW9wZXJtKCk7Ci0gICAgc2V0X2hsdChUUlVFKTsKLSAgICBkb194ODYoQklPU19TVEFSVCxSZWdzKTsKLSAgICBzZXRfaGx0KEZBTFNFKTsKLSAgICBwcmludF9yZWdzKFJlZ3MpOwotCi0jaWZkZWYgVjg2QklPU19ERUJVRwotICAgIHByaW50ZigiZG9uZVxuIik7Ci0jZW5kaWYKLQotICAgIGlmICgoaXNWaWRlbyAmJiAoIUN1cnJlbnRQY2kgfHwgQ3VycmVudFBjaS0+YWN0aXZlKSkgfHwgIWlzVmlkZW8pCi0gICAgdXBkYXRlX2Jpb3NfdmFycygpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfcmVncyhpODZiaW9zUmVnc1B0ciByZWdzKQotewotICAgIHByaW50ZigiYXg9JXggYng9JXggY3g9JXggZHg9JXggZHM9JXggZXM9JXggZGk9JXggc2k9JXhcbiIsCi0gICAgICAgKENBUkQxNilyZWdzLT5heCwoQ0FSRDE2KXJlZ3MtPmJ4LChDQVJEMTYpcmVncy0+Y3gsKENBUkQxNilyZWdzLT5keCwKLSAgICAgICAoQ0FSRDE2KXJlZ3MtPmRzLChDQVJEMTYpcmVncy0+ZXMsKENBUkQxNilyZWdzLT5kaSwKLSAgICAgICAoQ0FSRDE2KXJlZ3MtPnNpKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X3VzYWdlKHZvaWQpCi17Ci19Ci0KLXZvaWQKLWFkZF9obHQodW5zaWduZWQgbG9uZyB2YWwpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAodmFsIDwgQklPU19NRU0gfHwgKHZhbCA+IFZSQU1fU1RBUlQgJiYgdmFsIDwgKFZSQU1fU1RBUlQgKyBWUkFNX1NJWkUpKQotICAgIHx8IHZhbCA+PSBTSVpFKSB7Ci0gICAgcHJpbnRmKCJhZGRyZXNzIG91dCBvZiByYW5nZVxuIik7Ci0gICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvciAoaT0wOyBpPDIwOyBpKyspIHsKLSAgICBpZiAoaGx0cFtpXS5hZGRyZXNzID09IDApIHsKLQlobHRwW2ldLmFkZHJlc3MgPSAodm9pZCopdmFsOwotCWJyZWFrOwotICAgIH0KLSAgICB9Ci0gICAgaWYgKGkgPT0gMjApIHByaW50Zigibm8gbW9yZSBobHRwb2ludHMgYXZhaWxhYmxlXG4iKTsKLX0KLQotdm9pZAotZGVsX2hsdChpbnQgdmFsKQotewotICAgIGlmICh2YWwgPT0gMjEpIHsgLyogZGVsZXRlIGFsbCAqLwotICAgIGludCBpOwotICAgIHByaW50ZigiY2xlYXJpbmcgYWxsIGhsdHBvaW50c1xuIik7Ci0gICAgZm9yIChpPTA7IGkgPDIwOyBpKyspCi0JaGx0cFtpXS5hZGRyZXNzID0gTlVMTDsKLSAgICB9IGVsc2UgaWYgKHZhbCA+PSAwICYmICB2YWwgPDIwKQotICAgIGhsdHBbdmFsXS5hZGRyZXNzID0gTlVMTDsKLSAgICBlbHNlIHByaW50ZigiaGx0cG9pbnQgJWkgb3V0IG9mIHJhbmdlOiB2YWxpZCByYW5nZSAwLTE5XG4iLHZhbCk7Ci19Ci0KLXZvaWQKLWxpc3RfaGx0KCkKLXsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGk9MDsgaTwyMDsgaSsrKQotICAgIGlmIChobHRwW2ldLmFkZHJlc3MpCi0JcHJpbnRmKCJobHRwb2ludFslaV06IDB4JWx4XG4iLGksKHVuc2lnbmVkIGxvbmcpaGx0cFtpXS5hZGRyZXNzKTsKLX0KLQotc3RhdGljIHZvaWQKLXNldF9obHQoQm9vbCBzZXQpCi17Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpPTA7IGk8MjA7IGkrKykKLSAgICBpZiAoaGx0cFtpXS5hZGRyZXNzKSB7Ci0JaWYgKHNldCkgewotCWhsdHBbaV0ub3JndmFsID0gKihDQVJEOCopaGx0cFtpXS5hZGRyZXNzOwotCSooQ0FSRDgqKWhsdHBbaV0uYWRkcmVzcyA9IDB4ZjQ7Ci0JfSBlbHNlCi0JKihDQVJEOCopaGx0cFtpXS5hZGRyZXNzID0gaGx0cFtpXS5vcmd2YWw7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotc2V0X2lvcGVybSh2b2lkKQotewotICAgIGludCBpLCBzdGFydDsKLQotICAgIGlvcGVybSgwLElPUEVSTV9CSVRTLDApOwotCi0gICAgZm9yIChpID0gMDsgaSA8IElPUEVSTV9CSVRTO2krKykKLSAgICBpZiAoaW9wZXJtX2xpc3RbaV0pIHsKLQlzdGFydCA9IGk7Ci0JZm9yICg7aSA8IElPUEVSTV9CSVRTOyBpKyspIHsKLQlpZiAoIWlvcGVybV9saXN0W2ldKSB7Ci0JICAgIGlvcGVybShzdGFydCxpIC0gc3RhcnQsIDEpOwotCSAgICBicmVhazsKLQl9Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3Mvdjg2Ymlvcy5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy92ODZiaW9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZjNmOGUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy92ODZiaW9zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAxOTk5IEVnYmVydCBFaWNoCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi0gKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAotICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Ci0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCi0gKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZCBpbgotICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0Ci0gKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zCi0gKiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZAotICogImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSAqCi0gKiBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSAqIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKLSAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKLSAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLSNpZm5kZWYgVjg2X0JJT1NfSAotI2RlZmluZSBWODZfQklPU19ICi0KLSNpZiBkZWZpbmVkIChfX2kzODZfXykgfHwgZGVmaW5lZCAoX19pNDg2X18pIHx8IGRlZmluZWQgKF9faTU4Nl9fKSB8fCBkZWZpbmVkIChfX2k2ODZfXykgfHwgZGVmaW5lZCAoX19rNl9fKQotIyBpZm5kZWYgX19pYTMyX18KLSMgIGRlZmluZSBfX2lhMzJfXwotIyBlbmRpZgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jZGVmaW5lIHBfcHJpbnRmKGYsYS4uLikgZG8ge2lmIChDb25maWcuUHJpbnRQb3J0KSBscHJpbnRmKGYsIyNhKTt9IFwKLQkJCSB3aGlsZSgwKQotI2RlZmluZSBpX3ByaW50ZihmLGEuLi4pIGRvICB7aWYgKENvbmZpZy5QcmludElycSkgbHByaW50ZihmLCMjYSk7fSBcCi0JCQkgIHdoaWxlKDApCi0jZGVmaW5lIFBfcHJpbnRmKGYsYS4uLikgZG8ge2lmIChDb25maWcuUHJpbnRQY2kpIGxwcmludGYoZiwjI2EpO30gXAotCQkJICB3aGlsZSgwKQotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgQ0FSRDg7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IENBUkQxNjsKLXR5cGVkZWYgdW5zaWduZWQgaW50IENBUkQzMjsKLSNpZiBkZWZpbmVkIChfX2FscGhhX18pIHx8IGRlZmluZWQgKF9faWE2NF9fKQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIG1lbVR5cGU7Ci0jZWxzZQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgbWVtVHlwZTsKLSNlbmRpZgotCi10eXBlZGVmIGludCBCb29sOwotCi0jZGVmaW5lIEZBTFNFIDAKLSNkZWZpbmUgVFJVRSAxCi0KLXN0cnVjdCBjb25maWcgewotICAgIEJvb2wgUHJpbnRQb3J0OwotICAgIEJvb2wgSW9TdGF0aXN0aWNzOwotICAgIEJvb2wgUHJpbnRJcnE7Ci0gICAgQm9vbCBQcmludFBjaTsKLSAgICBCb29sIFNob3dBbGxEZXY7Ci0gICAgQm9vbCBQcmludElwOwotICAgIEJvb2wgU2F2ZUJpb3M7Ci0gICAgQm9vbCBUcmFjZTsKLSAgICBCb29sIENvbmZpZ0FjdGl2ZU9ubHk7Ci0gICAgQm9vbCBDb25maWdBY3RpdmVEZXZpY2U7Ci0gICAgQm9vbCBNYXBTeXNCaW9zOwotICAgIEJvb2wgUmVzb3J0OwotICAgIEJvb2wgRml4Um9tOwotICAgIEJvb2wgTm9Db25zb2xlOwotICAgIEJvb2wgQm9vdE9ubHk7Ci0gICAgaW50ICBWZXJib3NlOwotfTsKLQotc3RydWN0IHBpbyB7Ci0gICAgQ0FSRDggKCppbmIpKENBUkQxNik7Ci0gICAgQ0FSRDE2ICgqaW53KShDQVJEMTYpOwotICAgIENBUkQzMiAoKmlubCkoQ0FSRDE2KTsKLSAgICB2b2lkICgqb3V0YikoQ0FSRDE2LENBUkQ4KTsKLSAgICB2b2lkICgqb3V0dykoQ0FSRDE2LENBUkQxNik7Ci0gICAgdm9pZCAoKm91dGwpKENBUkQxNixDQVJEMzIpOwotfTsKLQotc3RydWN0IHJlZ3M4NiB7Ci0JbG9uZyBlYng7Ci0JbG9uZyBlY3g7Ci0JbG9uZyBlZHg7Ci0JbG9uZyBlc2k7Ci0JbG9uZyBlZGk7Ci0JbG9uZyBlYnA7Ci0JbG9uZyBlYXg7Ci0JbG9uZyBlaXA7Ci0JbG9uZyBlc3A7Ci0JdW5zaWduZWQgc2hvcnQgY3M7Ci0JdW5zaWduZWQgc2hvcnQgc3M7Ci0JdW5zaWduZWQgc2hvcnQgZXM7Ci0JdW5zaWduZWQgc2hvcnQgZHM7Ci0JdW5zaWduZWQgc2hvcnQgZnM7Ci0JdW5zaWduZWQgc2hvcnQgZ3M7Ci0gICAgbG9uZyBlZmxhZ3M7Ci19OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgQ0FSRDMyIGF4OwotICAgIENBUkQzMiBieDsKLSAgICBDQVJEMzIgY3g7Ci0gICAgQ0FSRDMyIGR4OwotICAgIENBUkQzMiBjczsKLSAgICBDQVJEMzIgZXM7Ci0gICAgQ0FSRDMyIGRzOwotICAgIENBUkQzMiBzaTsKLSAgICBDQVJEMzIgZGk7Ci19IGk4NmJpb3NSZWdzLCAqaTg2Ymlvc1JlZ3NQdHI7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgZmQ7Ci0gICAgaW50IHZ0OwotfSBjb25zb2xlOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdm9pZCogYWRkcmVzczsKLSAgICBDQVJEOCBvcmd2YWw7Ci19IGhhbHRwb2ludHM7Ci0KLWVudW0gZGV2X3R5cGUgeyAgTk9ORSwgSVNBLCBQQ0kgfTsKLXN0cnVjdCBkZXZpY2UgewotICAgIEJvb2wgYm9vdGVkOwotICAgIGVudW0gZGV2X3R5cGUgdHlwZTsKLSAgICB1bmlvbiB7Ci0gICAgICBpbnQgbm9uZTsKLSAgICAgIHN0cnVjdCBwY2kgewotCWludCBidXM7Ci0JaW50IGRldjsKLQlpbnQgZnVuYzsKLSAgICAgIH0gcGNpOwotICAgIH0gbG9jOwotfTsKLQotZXh0ZXJuIHN0cnVjdCBkZXZpY2UgRGV2aWNlOwotCi0jaWZkZWYgX19hbHBoYV9fCi11bnNpZ25lZCBsb25nIF9idXNfYmFzZSh2b2lkKTsKLWV4dGVybiB2b2lkKiB2cmFtX21hcDsKLWV4dGVybiBpbnQgc3BhcnNlX3NoaWZ0OwotI2VuZGlmCi0KLWV4dGVybiBzdHJ1Y3QgcGlvIFA7Ci1leHRlcm4gc3RydWN0IGNvbmZpZyBDb25maWc7Ci0jZGVmaW5lIElPUEVSTV9CSVRTIDEwMjQKLWV4dGVybiBpbnQgaW9wZXJtX2xpc3RbSU9QRVJNX0JJVFNdOwotCi1leHRlcm4gdm9pZCBzZXR1cF9pbyh2b2lkKTsKLWV4dGVybiB2b2lkIGRvX3g4Nih1bnNpZ25lZCBsb25nIGJpb3Nfc3RhcnQsaTg2Ymlvc1JlZ3NQdHIgcmVncyk7Ci1leHRlcm4gaW50IHJ1bl9iaW9zX2ludChpbnQgbnVtLCBzdHJ1Y3QgcmVnczg2ICpyZWdzKTsKLWV4dGVybiBDQVJEMzIgZ2V0SW50VmVjdChpbnQgbnVtKTsKLUNBUkQzMiBnZXRJUCh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgY2FsbF9ib290KHN0cnVjdCBkZXZpY2UgKmRldik7Ci1leHRlcm4gdm9pZCBydW5JTlQoaW50IG51bSxpODZiaW9zUmVnc1B0ciBSZWdzKTsKLWV4dGVybiB2b2lkIGFkZF9obHQodW5zaWduZWQgbG9uZyBhZGRyKTsKLWV4dGVybiB2b2lkIGRlbF9obHQoaW50IGFkZHIpOwotZXh0ZXJuIHZvaWQgbGlzdF9obHQoKTsKLQotZXh0ZXJuIGludCBwb3J0X3JlcF9pbmIoQ0FSRDE2IHBvcnQsIENBUkQ4ICpiYXNlLCBpbnQgZF9mLCBDQVJEMzIgY291bnQpOwotZXh0ZXJuIGludCBwb3J0X3JlcF9pbncoQ0FSRDE2IHBvcnQsIENBUkQxNiAqYmFzZSwgaW50IGRfZiwgQ0FSRDMyIGNvdW50KTsKLWV4dGVybiBpbnQgcG9ydF9yZXBfaW5sKENBUkQxNiBwb3J0LCBDQVJEMzIgKmJhc2UsIGludCBkX2YsIENBUkQzMiBjb3VudCk7Ci1leHRlcm4gaW50IHBvcnRfcmVwX291dGIoQ0FSRDE2IHBvcnQsIENBUkQ4ICpiYXNlLCBpbnQgZF9mLCBDQVJEMzIgY291bnQpOwotZXh0ZXJuIGludCBwb3J0X3JlcF9vdXR3KENBUkQxNiBwb3J0LCBDQVJEMTYgKmJhc2UsIGludCBkX2YsIENBUkQzMiBjb3VudCk7Ci1leHRlcm4gaW50IHBvcnRfcmVwX291dGwoQ0FSRDE2IHBvcnQsIENBUkQzMiAqYmFzZSwgaW50IGRfZiwgQ0FSRDMyIGNvdW50KTsKLWV4dGVybiBDQVJEOCBwX2luYihDQVJEMTYgcG9ydCk7Ci1leHRlcm4gQ0FSRDE2IHBfaW53KENBUkQxNiBwb3J0KTsKLWV4dGVybiBDQVJEMzIgcF9pbmwoQ0FSRDE2IHBvcnQpOwotZXh0ZXJuIHZvaWQgcF9vdXRiKENBUkQxNiBwb3J0LCBDQVJEOCB2YWwpOwotZXh0ZXJuIHZvaWQgcF9vdXR3KENBUkQxNiBwb3J0LCBDQVJEMTYgdmFsKTsKLWV4dGVybiB2b2lkIHBfb3V0bChDQVJEMTYgcG9ydCwgQ0FSRDMyIHZhbCk7Ci0jaWZkZWYgX19hbHBoYV9fCi1leHRlcm4gQ0FSRDggYV9pbmIoQ0FSRDE2IHBvcnQpOwotZXh0ZXJuIENBUkQxNiBhX2ludyhDQVJEMTYgcG9ydCk7Ci1leHRlcm4gdm9pZCBhX291dGIoQ0FSRDE2IHBvcnQsIENBUkQ4IHZhbCk7Ci1leHRlcm4gdm9pZCBhX291dHcoQ0FSRDE2IHBvcnQsIENBUkQxNiB2YWwpOwotI2VuZGlmCi0jaWZkZWYgX19hbHBoYV9fCi1DQVJEOCBtZW1fcmIoQ0FSRDMyIGFkZHIpOwotQ0FSRDE2IG1lbV9ydyhDQVJEMzIgYWRkcik7Ci1DQVJEMzIgbWVtX3JsKENBUkQzMiBhZGRyKTsKLXZvaWQgbWVtX3diKENBUkQzMiBhZGRyLCBDQVJEOCB2YWwpOwotdm9pZCBtZW1fd3coQ0FSRDMyIGFkZHIsIENBUkQxNiB2YWwpOwotdm9pZCBtZW1fd2woQ0FSRDMyIGFkZHIsIENBUkQzMiB2YWwpOwotI2VuZGlmCi1leHRlcm4gdm9pZCBpb19zdGF0aXN0aWNzKHZvaWQpOwotZXh0ZXJuIHZvaWQgY2xlYXJfc3RhdCh2b2lkKTsKLWV4dGVybiBpbnQgaW50X2hhbmRsZXIoaW50IG51bSwgc3RydWN0IHJlZ3M4NiAqcmVncyk7Ci0KLWV4dGVybiBjb25zb2xlIG9wZW5fY29uc29sZSh2b2lkKTsKLWV4dGVybiB2b2lkIGNsb3NlX2NvbnNvbGUoY29uc29sZSk7Ci0KLWV4dGVybiB2b2lkIGRwcmludCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpOwotCi1leHRlcm4gQm9vbCBsb2dnaW5nOwotZXh0ZXJuIEJvb2wgbm9zdGRvdXQ7Ci1leHRlcm4gY2hhciogbG9nZmlsZTsKLWV4dGVybiB2b2lkIGxvZ29uKHZvaWQqIHB0cik7Ci1leHRlcm4gdm9pZCBsb2dvZmYoKTsKLWV4dGVybiB2b2lkIGxwcmludGYoY29uc3QgY2hhciAqZiwgLi4uKTsKLQotI2RlZmluZSBNRU1fRklMRSAiL2Rldi9tZW0iCi0jZGVmaW5lIERFRkFVTFRfVl9CSU9TIDB4YzAwMDAKLSNpZm5kZWYgVl9CSU9TCi0jZGVmaW5lIFZfQklPUyBERUZBVUxUX1ZfQklPUwotI2VuZGlmCi0KLSNpZmRlZiBfX2FscGhhX18KLSNkZWZpbmUgTkVFRF9QQ0lfSU8KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3Mvd29ya2luZ19jYXJkcyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3Y4NmJpb3Mvd29ya2luZ19jYXJkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc1M2YyNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3dvcmtpbmdfY2FyZHMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLURhdmlkIE1vbnJvOiAgICAgICAgICAgICAgICAgICAgVHJpZGVudCBUR1VJIDk0NDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlyZ2UvVlggKERpYW1vbmQgU3RlYWx0aCAzRCAzNDAwKSAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSaXZhIFROVCAoRGlhbW9uZCBWaXBlciBWNTUwKSAgIG5vIHZiaW9zPwotSmFybm8gUGFhbmFuZW4gPGpwYWFuYUBzMi5vcmc+OiBHdWlsbGVtb3QgTWF4aWdhbWVyIFhlbnRvciAzMiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5WSURJQSBUTlQyIFVsdHJhKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGl2ZSBHcmFwaGljcyBCbGFzdGVyIEV4eHRyZW1lIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUGVybWVkaWEgMikgCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3g4NmVtdS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMvdjg2Ymlvcy94ODZlbXUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVjOTlkNy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy92ODZiaW9zL3g4NmVtdS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMTk5OSBFZ2JlcnQgRWljaAotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKLSAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwotICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQgaW4KLSAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAotICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucwotICogYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQKLSAqICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0gKgotICogVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0gKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0gKiBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCi0gKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCi0gKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0gKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0jaW5jbHVkZSAiZGVidWcuaCIKLQotI2RlZmluZSBJRl9NQVNLICAgICAweDAwMDAwMjAwCi0jZGVmaW5lIFZJRl9NQVNLICAgIDB4MDAwODAwMDAgIC8qIHZpcnR1YWwgaW50ZXJydXB0IGZsYWcgKi8KLSNkZWZpbmUgVklQX01BU0sgICAgMHgwMDEwMDAwMCAgLyogdmlydHVhbCBpbnRlcnJ1cHQgcGVuZGluZyAqLwotCi0jaW5jbHVkZSA8L3Vzci9pbmNsdWRlL3VuaXN0ZC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgotLyojaW5jbHVkZSA8c3lzY2FsbC1saXN0Lmg+ICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpZmRlZiBfX2FscGhhX18KLSNpbmNsdWRlIDxzeXMvaW8uaD4KLSNlbmRpZgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHNldGptcC5oPgotI2luY2x1ZGUgIkFzbU1hY3Jvcy5oIgotI2luY2x1ZGUgInY4NmJpb3MuaCIKLSMgZGVmaW5lIERFQlVHCi0jaW5jbHVkZSAieDg2ZW11LmgiCi0jdW5kZWYgREVCVUcKLQotI2RlZmluZSBNICAgICAgICAgICAgX1g4NkVNVV9lbnYKLSNkZWZpbmUgQ1BVX1JFRyhyZWcpIE0ueDg2LlJfIyNyZWcKLQotc3RydWN0IHBpbyBQOwotCi12b2lkCi1zZXR1cF9pbyh2b2lkKQotewotICAgIGlmICghQ29uZmlnLlByaW50UG9ydCAmJiAhQ29uZmlnLklvU3RhdGlzdGljcykgewotCi0jaWYgZGVmaW5lZCAoX19pMzg2X18pCi0gICAgUC5pbmIgPSAodTgoKikodTE2KSlpbmI7Ci0gICAgUC5pbncgPSAodTE2KCopKHUxNikpaW53OwotICAgIFAub3V0YiA9ICh2b2lkKCopKHUxNix1OCkpb3V0YjsKLSAgICBQLm91dHcgPSAodm9pZCgqKSh1MTYsdTE2KSlvdXR3OwotI2Vsc2UKLSAgICBQLmluYiA9IHBfaW5iOwotICAgIFAuaW53ID0gcF9pbnc7Ci0gICAgUC5vdXRiID0gcF9vdXRiOwotICAgIFAub3V0dyA9IHBfb3V0dzsKLSNlbmRpZgotI2lmIGRlZmluZWQgKF9faTM4Nl9fKSAmJiAhIGRlZmluZWQoTkVFRF9QQ0lfSU8pCi0gICAgUC5pbmwgPSAodTMyKCopKHUxNikpaW5sOwotICAgIFAub3V0bCA9ICh2b2lkKCopKHUxNix1MzIpKW91dGw7Ci0jZWxzZQotICAgIFAuaW5sID0gcF9pbmw7Ci0gICAgUC5vdXRsID0gcF9vdXRsOwotI2VuZGlmCi0gICAgfSBlbHNlIHsKLSAgICBQLmluYiA9IHBfaW5iOwotICAgIFAuaW53ID0gcF9pbnc7Ci0gICAgUC5pbmwgPSBwX2lubDsKLSAgICBQLm91dGIgPSBwX291dGI7Ci0gICAgUC5vdXR3ID0gcF9vdXR3OwotICAgIFAub3V0bCA9IHBfb3V0bDsKLSAgICB9Ci19Ci0KLXZvaWQKLXg4NmVtdV9kb19pbnQoaW50IG51bSkKLXsKLSAgICBzdHJ1Y3QgcmVnczg2IHJlZ3M7Ci0KLSAgICBpX3ByaW50ZigiaW50IDB4JXggcmVjZWl2ZWQ6IGF4OjB4JXgiLG51bSxDUFVfUkVHKEFYKSk7Ci0gICAgaWYgKENvbmZpZy5QcmludElwKQotCWlfcHJpbnRmKCIgYXQ6IDB4JXhcbiIsZ2V0SVAoKSk7Ci0gICAgZWxzZQotCWlfcHJpbnRmKCJcbiIpOwotCi0gICAgLyogdHJ5IHRvIHJ1biBiaW9zIGludGVycnVwdCAqLwotCi0gICAgLyogaWYgbm90IGluc3RhbGxlZCBmYWxsIGJhY2sgKi8KLSNkZWZpbmUgQ09QWSh4LHkpIHJlZ3MueSA9IE0ueDg2LngKLSNkZWZpbmUgQ09QWV9SKHgseSkgTS54ODYueCA9IHJlZ3MueQotCi0gICAgQ09QWShSX0VBWCxlYXgpOwotICAgIENPUFkoUl9FQlgsZWJ4KTsKLSAgICBDT1BZKFJfRUNYLGVjeCk7Ci0gICAgQ09QWShSX0VEWCxlZHgpOwotICAgIENPUFkoUl9FU0ksZXNpKTsKLSAgICBDT1BZKFJfRURJLGVkaSk7Ci0gICAgQ09QWShSX0VCUCxlYnApOwotICAgIENPUFkoUl9FSVAsZWlwKTsKLSAgICBDT1BZKFJfRVNQLGVzcCk7Ci0gICAgQ09QWShSX0NTLGNzKTsKLSAgICBDT1BZKFJfU1Msc3MpOwotICAgIENPUFkoUl9EUyxkcyk7Ci0gICAgQ09QWShSX0VTLGVzKTsKLSAgICBDT1BZKFJfRlMsZnMpOwotICAgIENPUFkoUl9HUyxncyk7Ci0gICAgQ09QWShSX0VGTEcsZWZsYWdzKTsKLQotICAgIGlmICghKGludF9oYW5kbGVyKG51bSwmcmVncykpKSB7Ci0JaWYgKCFydW5fYmlvc19pbnQobnVtLCZyZWdzKSkKLQkgICAgZ290byB1bmtub3duX2ludDsKLQllbHNlCi0JICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBDT1BZX1IoUl9FQVgsZWF4KTsKLSAgICBDT1BZX1IoUl9FQlgsZWJ4KTsKLSAgICBDT1BZX1IoUl9FQ1gsZWN4KTsKLSAgICBDT1BZX1IoUl9FRFgsZWR4KTsKLSAgICBDT1BZX1IoUl9FU0ksZXNpKTsKLSAgICBDT1BZX1IoUl9FREksZWRpKTsKLSAgICBDT1BZX1IoUl9FQlAsZWJwKTsKLSAgICBDT1BZX1IoUl9FSVAsZWlwKTsKLSAgICBDT1BZX1IoUl9FU1AsZXNwKTsKLSAgICBDT1BZX1IoUl9DUyxjcyk7Ci0gICAgQ09QWV9SKFJfU1Msc3MpOwotICAgIENPUFlfUihSX0RTLGRzKTsKLSAgICBDT1BZX1IoUl9FUyxlcyk7Ci0gICAgQ09QWV9SKFJfRlMsZnMpOwotICAgIENPUFlfUihSX0dTLGdzKTsKLSAgICBDT1BZX1IoUl9FRkxHLGVmbGFncyk7Ci0gICAgcmV0dXJuOwotCi0gdW5rbm93bl9pbnQ6Ci0gICAgZnByaW50ZihzdGRlcnIsIlxuVW5rbm93biB2bTg2X2ludDogJVhcblxuIixudW0pOwotICAgIFg4NkVNVV9oYWx0X3N5cygpOwotICAgIHJldHVybjsKLQotI3VuZGVmIENPUFkKLSN1bmRlZiBDT1BZX1IKLX0KLQotdm9pZAotc2V0dXBfeDg2ZW11KHVuc2lnbmVkIGxvbmcgYmlvc19zdGFydCwgaTg2Ymlvc1JlZ3NQdHIgcmVncykKLXsKLSAgICBpbnQgaTsKLSAgICBDQVJEMzIgZWlwOwotICAgIENBUkQxNiBjczsKLSAgICBYODZFTVVfaW50ckZ1bmNzIGludEZ1bmNzWzI1Nl07Ci0KLSAgICBYODZFTVVfcGlvRnVuY3MgcGlvRnVuY3MgPSB7Ci0JKHU4KCopKHUxNikpUC5pbmIsCi0JKHUxNigqKSh1MTYpKVAuaW53LAotCSh1MzIoKikodTE2KSlQLmlubCwKLQkodm9pZCgqKSh1MTYsdTgpKVAub3V0YiwKLQkodm9pZCgqKSh1MTYsdTE2KSlQLm91dHcsCi0JKHZvaWQoKikodTE2LHUzMikpUC5vdXRsCi0gICAgfTsKLSNpZmRlZiBfX2FscGhhX18KLSAgICBYODZFTVVfbWVtRnVuY3MgbWVtRnVuY3MgPSB7Ci0gICAgICAodTgoKikodTMyKSltZW1fcmIsCi0gICAgICAodTE2KCopKHUzMikpbWVtX3J3LAotICAgICAgKHUzMigqKSh1MzIpKW1lbV9ybCwKLSAgICAgICh2b2lkKCopKHUzMix1OCkpbWVtX3diLAotICAgICAgKHZvaWQoKikodTMyLHUxNikpbWVtX3d3LAotICAgICAgKHZvaWQoKikodTMyLHUzMikpbWVtX3dsCi0gICAgfTsKLSNlbmRpZgotICAgIE0ubWVtX2Jhc2UgPSAwOwotICAgIE0ubWVtX3NpemUgPSAxMDI0KjEwMjQgKyAxMDI0OwotICAgIC8qICBNLng4Ni5kZWJ1ZyA9IERFQlVHX0RJU0FTU0VNQkxFX0YgfCBERUJVR19UUkFDRV9GIHwgREVCVUdfREVDT0RFX0Y7ICovCi0gICAgLyogIE0ueDg2LmRlYnVnIHw9IERFQlVHX0RFQ09ERV9GIHwgIERFQlVHX1RSQUNFX0Y7ICovCi0vKgotICogRm9yIHNpbmdsZSBzdGVwIHRyYWNpbmcgY29tcGlsZSB4ODZlbXUgd2l0aCBvcHRpb24gLURERUJVRwotICovCi0gICAgTS54ODYuZGVidWcgPSAwOwotICAgIGlmIChDb25maWcuUHJpbnRJcCkKLQlNLng4Ni5kZWJ1ZyA9IERFQlVHX1NBVkVfQ1NfSVA7Ci0KLSAgICBpZiAoQ29uZmlnLlRyYWNlKQotCVg4NkVNVV90cmFjZV9vbigpOwotCi0gICAgWDg2RU1VX3NldHVwUGlvRnVuY3MoJnBpb0Z1bmNzKTsKLSNpZmRlZiBfX2FscGhhX18KLSAgICBYODZFTVVfc2V0dXBNZW1GdW5jcygmbWVtRnVuY3MpOwotI2VuZGlmCi0gICAgZm9yIChpPTA7aTwyNTY7aSsrKQotCWludEZ1bmNzW2ldID0geDg2ZW11X2RvX2ludDsKLSAgICBYODZFTVVfc2V0dXBJbnRyRnVuY3MoaW50RnVuY3MpOwotCi0gICAgZWlwID0gYmlvc19zdGFydCAmIDB4RkZGRjsKLSAgICBjcyA9IChiaW9zX3N0YXJ0ICYgMHhGRjAwMDApID4+IDQ7Ci0KLSAgICBDUFVfUkVHKEVBWCkgPSByZWdzLT5heDsKLSAgICBDUFVfUkVHKEVCWCkgPSByZWdzLT5ieDsKLSAgICBDUFVfUkVHKEVDWCkgPSByZWdzLT5jeDsKLSAgICBDUFVfUkVHKEVEWCkgPSByZWdzLT5keDsKLSAgICBDUFVfUkVHKEVTSSkgPSByZWdzLT5zaTsKLSAgICBDUFVfUkVHKEVESSkgPSByZWdzLT5kaTsKLSAgICBDUFVfUkVHKEVCUCkgPSAwOwotICAgIENQVV9SRUcoRUlQKSA9IGVpcDsKLSAgICBDUFVfUkVHKENTKSA9IGNzOwotICAgIENQVV9SRUcoU1ApID0gMHgxMDA7Ci0gICAgQ1BVX1JFRyhTUykgPSAweDMwOyAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgdGhlIHN0YW5kYXJkIHBjIGJpb3Mgc3RhY2sgKi8KLSAgICBDUFVfUkVHKEVTKSA9IHJlZ3MtPmVzOwotICAgIENQVV9SRUcoRFMpID0gcmVncy0+ZHM7Ci0gICAgQ1BVX1JFRyhGUykgPSAwOwotICAgIENQVV9SRUcoR1MpID0gMDsKLSAgICBDUFVfUkVHKEVGTEcpIHw9IChWSUZfTUFTSyB8IFZJUF9NQVNLIHwgSUZfTUFTSyB8IDB4Mik7Ci19Ci0KLXZvaWQKLWNvbGxlY3RfYmlvc19yZWdzKGk4NmJpb3NSZWdzUHRyIHJlZ3MpCi17Ci0gICAgcmVncy0+YXggPSBDUFVfUkVHKEVBWCk7Ci0gICAgcmVncy0+YnggPSBDUFVfUkVHKEVCWCk7Ci0gICAgcmVncy0+Y3ggPSBDUFVfUkVHKEVDWCk7Ci0gICAgcmVncy0+ZHggPSBDUFVfUkVHKEVEWCk7Ci0gICAgcmVncy0+ZXMgPSBDUFVfUkVHKEVTKTsKLSAgICByZWdzLT5kcyA9IENQVV9SRUcoRFMpOwotICAgIHJlZ3MtPmRpID0gQ1BVX1JFRyhFREkpOwotICAgIHJlZ3MtPnNpID0gQ1BVX1JFRyhFU0kpOwotfQotCi1zdGF0aWMgdm9pZAotZG9feDg2ZW11KHZvaWQpCi17Ci0gICAgWDg2RU1VX2V4ZWMoKTsKLX0KLQotc3RhdGljIGptcF9idWYgeDg2X2VzYzsKLXN0YXRpYyB2b2lkCi12bWV4aXQoaW50IHVudXNlZCkKLXsKLSAgICBsb25nam1wKHg4Nl9lc2MsMSk7Ci19Ci0KLXZvaWQKLWRvX3g4Nih1bnNpZ25lZCBsb25nIGJpb3Nfc3RhcnQsIGk4NmJpb3NSZWdzUHRyIHJlZ3MpCi17Ci0gICAgc3RhdGljIHZvaWQgKCpvcmdfaGFuZGxlcikoaW50KTsKLQotICAgIHNldHVwX3g4NmVtdShiaW9zX3N0YXJ0LHJlZ3MpOwotICAgIGlmIChzZXRqbXAoeDg2X2VzYykgPT0gMCkgewotCW9yZ19oYW5kbGVyID0gc2lnbmFsKDIsdm1leGl0KTsKLQlkb194ODZlbXUoKTsKLQlzaWduYWwoMixvcmdfaGFuZGxlcik7Ci0JY29sbGVjdF9iaW9zX3JlZ3MocmVncyk7Ci0gICAgfSBlbHNlIHsKLQlzaWduYWwoMixvcmdfaGFuZGxlcik7Ci0JcHJpbnRmKCJpbnRlcnJ1cHRlZCBhdCAweCV4XG4iLCgoQ0FSRDE2KUNQVV9SRUcoQ1MpKSA8PCA0Ci0JICAgICAgIHwgKENBUkQxNilDUFVfUkVHKEVJUCkpOwotICAgIH0KLX0KLQotaW50Ci1ydW5fYmlvc19pbnQoaW50IG51bSwgc3RydWN0IHJlZ3M4NiAqcmVncykKLXsKLSNpZmRlZiBWODZCSU9TX0RFQlVHCi0gICAgc3RhdGljIGludCBmaXJzdHRpbWUgPSAxOwotI2VuZGlmCi0gICAgLyogY2hlY2sgaWYgYmlvcyB2ZWN0b3IgaXMgaW5pdGlhbGl6ZWQgKi8KLSAgICBpZiAoKChDQVJEMTYqKTApWyhudW08PDEpKzFdID09IDB4MDAwMCkgeyAvKiBTWVNfQklPU19TRUcgPyovCi0jaWZkZWYgVjg2QklPU19ERUJVRwotCWlfcHJpbnRmKCJjYXJkIEJJT1Mgbm90IGxvYWRlZFxuIik7Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSNpZmRlZiBWODZCSU9TX0RFQlVHCi0gICAgaWYgKGZpcnN0dGltZSkgewotCWRwcmludCgwLDB4M0QwKTsKLQlmaXJzdHRpbWUgPSAwOwotICAgIH0KLSNlbmRpZgotCi0gICAgaV9wcmludGYoImNhbGxpbmcgY2FyZCBCSU9TIGF0OiAiKTsKLSAgICBpX3ByaW50ZigiMHgleDoleFxuIiwoKENBUkQxNiAqKSAwKVsobnVtIDw8IDEpICsgMV0sCi0JICAgICAoQ0FSRDMyKSgoQ0FSRDE2ICopIDApW251bSA8PCAxXSk7Ci0gICAgWDg2RU1VX3ByZXBhcmVGb3JJbnQobnVtKTsKLQotICAgIHJldHVybiAxOwotfQotCi1DQVJEMzIKLWdldEludFZlY3QoaW50IG51bSkKLXsKLSAgcmV0dXJuICgoQ0FSRDMyKikwKVtudW1dOwotfQotI2lmIDAKLXZvaWQKLXByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLSAgICB2YV9saXN0IGFyZ3B0cjsKLSAgICB2YV9zdGFydChhcmdwdHIsIGZtdCk7Ci0gICAgdmZwcmludGYoc3Rkb3V0LCBmbXQsIGFyZ3B0cik7Ci0gICAgZmZsdXNoKHN0ZG91dCk7Ci0gICAgdmFfZW5kKGFyZ3B0cik7Ci19Ci0jZW5kaWYKLQotQ0FSRDMyCi1nZXRJUCh2b2lkKQotewotICAgIHJldHVybiAoTS54ODYuc2F2ZWRfY3MgPDwgNCkgKyBNLng4Ni5zYXZlZF9pcDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9MSUNFTlNFIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L0xJQ0VOU0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZWRlNGEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L0xJQ0VOU0UKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgTGljZW5zZSBpbmZvcm1hdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIHg4NmVtdSBsaWJyYXJ5IGlzIHVuZGVyIGEgQlNEIHN0eWxlIGxpY2Vuc2UsIGNvbWFwdGlibGUKLXdpdGggdGhlIFhGcmVlODYgYW5kIFggbGljZW5zZXMgdXNlZCBieSBYRnJlZTg2LiBUaGUKLW9yaWdpbmFsIHg4NmVtdSBsaWJyYXJpZXMgd2VyZSB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlLiBEdWUgdG8gbGljZW5zZSBpbmNvbXBhdGliaWxpdGllcyBiZXR3ZWVuIHRoZSBHUEwKLWFuZCB0aGUgWEZyZWU4NiBsaWNlbnNlLCB0aGUgb3JpZ2luYWwgYXV0aG9ycyBvZiB0aGUgY29kZQotZGVjaWRlZCB0byBhbGxvdyBhIGxpY2Vuc2UgY2hhbmdlLiBJZiB5b3UgaGF2ZSBzdWJtaXR0ZWQKLWNvZGUgdG8gdGhlIG9yaWdpbmFsIHg4NmVtdSBwcm9qZWN0LCBhbmQgeW91IGRvbid0IGFncmVlCi13aXRoIHRoZSBsaWNlbnNlIGNoYW5nZSwgcGxlYXNlIGNvbnRhY3QgdXMgYW5kIGxldCB5b3UKLWtub3cuIFlvdXIgY29kZSB3aWxsIGJlIHJlbW92ZWQgdG8gY29tcGx5IHdpdGggeW91ciB3aXNoZXMuCi0KLUlmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMgYWJvdXQgdGhpcywgcGxlYXNlIHNlbmQgZW1haWwgdG8KLXg4NmVtdUBsaW51eGxhYnMuY29tIG9yIEtlbmRhbGxCQHNjaXRlY2hzb2Z0LmNvbSBmb3IKLWNsYXJpZmljYXRpb24uCi0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9kZWJ1Zy5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L2RlYnVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNWU2YWMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L2RlYnVnLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSoJCQkJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotKgotKiAgICAgICAgICAgIAlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qIAkJCQkgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKLSogCQkJCQkgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOgkJQU5TSSBDCi0qIEVudmlyb25tZW50OglBbnkKLSogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKLSoKLSogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvZGUgdG8gaGFuZGxlIGRlYnVnZ2luZyBvZiB0aGUKLSoJCQkJZW11bGF0b3IuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAieDg2ZW11L3g4NmVtdWkuaCIKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmIERFQlVHCi0KLXN0YXRpYyB2b2lkICAgICBwcmludF9lbmNvZGVkX2J5dGVzICh1MTYgcywgdTE2IG8pOwotc3RhdGljIHZvaWQgICAgIHByaW50X2RlY29kZWRfaW5zdHJ1Y3Rpb24gKHZvaWQpOwotc3RhdGljIGludCAgICAgIHBhcnNlX2xpbmUgKGNoYXIgKnMsIGludCAqcHMsIGludCAqbik7Ci0KLS8qIHNob3VsZCBsb29rIHNvbWV0aGluZyBsaWtlIGRlYnVnJ3Mgb3V0cHV0LiAqLwotdm9pZCBYODZFTVVfdHJhY2VfcmVncyAodm9pZCkKLXsKLQlpZiAoREVCVUdfVFJBQ0UoKSkgewotCQl4ODZlbXVfZHVtcF9yZWdzKCk7Ci0gICAgfQotCWlmIChERUJVR19ERUNPREUoKSAmJiAhIERFQlVHX0RFQ09ERV9OT1BSSU5UKCkpIHsKLQkJcHJpbnRrKCIlMDR4OiUwNHggIixNLng4Ni5zYXZlZF9jcywgTS54ODYuc2F2ZWRfaXApOwotCQlwcmludF9lbmNvZGVkX2J5dGVzKCBNLng4Ni5zYXZlZF9jcywgTS54ODYuc2F2ZWRfaXApOwotCQlwcmludF9kZWNvZGVkX2luc3RydWN0aW9uKCk7Ci0gICAgfQotfQotCi12b2lkIFg4NkVNVV90cmFjZV94cmVncyAodm9pZCkKLXsKLQlpZiAoREVCVUdfVFJBQ0UoKSkgewotCQl4ODZlbXVfZHVtcF94cmVncygpOwotICAgIH0KLX0KLQotdm9pZCB4ODZlbXVfanVzdF9kaXNhc3NlbWJsZSAodm9pZCkKLXsKLSAgICAvKgotICAgICAqIFRoaXMgcm91dGluZSBjYWxsZWQgaWYgdGhlIGZsYWcgREVCVUdfRElTQVNTRU1CTEUgaXMgc2V0IGtpbmQKLSAgICAgKiBvZiBhIGhhY2shCi0gICAgICovCi0JcHJpbnRrKCIlMDR4OiUwNHggIixNLng4Ni5zYXZlZF9jcywgTS54ODYuc2F2ZWRfaXApOwotCXByaW50X2VuY29kZWRfYnl0ZXMoIE0ueDg2LnNhdmVkX2NzLCBNLng4Ni5zYXZlZF9pcCk7Ci0JcHJpbnRfZGVjb2RlZF9pbnN0cnVjdGlvbigpOwotfQotCi1zdGF0aWMgdm9pZCBkaXNhc3NlbWJsZV9mb3J3YXJkICh1MTYgc2VnLCB1MTYgb2ZmLCBpbnQgbikKLXsKLQlYODZFTVVfc3lzRW52IHRyZWdzOwotCWludCBpOwotCXU4IG9wMTsKLSAgICAvKgotICAgICAqIGhhY2ssIGhhY2ssIGhhY2suICBXaGF0IHdlIGRvIGlzIHVzZSB0aGUgZXhhY3QgbWFjaGluZXJ5IHNldCB1cAotICAgICAqIGZvciBleGVjdXRpb24sIGV4Y2VwdCB0aGF0IG5vdyB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHN0YXRlCi0gICAgICogZmxhZyBhc3NvY2lhdGVkIHdpdGggdGhlICJleGVjdXRpb24iLCBhbmQgd2UgYXJlIHVzaW5nIGEgY29weQotICAgICAqIG9mIHRoZSByZWdpc3RlciBzdHJ1Y3QuICBBbGwgdGhlIG1ham9yIG9wY29kZXMsIG9uY2UgZnVsbHkKLSAgICAgKiBkZWNvZGVkLCBoYXZlIHRoZSBmb2xsb3dpbmcgdHdvIHN0ZXBzOiBUUkFDRV9SRUdTKHIsbSk7Ci0gICAgICogU0lOR0xFX1NURVAocixtKTsgd2hpY2ggZGlzYXBwZWFyIGlmIERFQlVHIGlzIG5vdCBkZWZpbmVkIHRvCi0gICAgICogdGhlIHByZXByb2Nlc3Nvci4gIFRoZSBUUkFDRV9SRUdTIG1hY3JvIGV4cGFuZHMgdG86Ci0gICAgICoKLSAgICAgKiBpZiAoZGVidWcmREVCVUdfRElTQVNTRU1CTEUpCi0gICAgICogICAgIHtqdXN0X2Rpc2Fzc2VtYmxlKCk7IGdvdG8gRW5kT2ZJbnN0cnVjdGlvbjt9Ci0gICAgICogICAgIGlmIChkZWJ1ZyZERUJVR19UUkFDRSkgdHJhY2VfcmVncyhyLG0pOwotICAgICAqCi0gICAgICogLi4uLi4uICBhbmQgYXQgdGhlIGxhc3QgbGluZSBvZiB0aGUgcm91dGluZS4KLSAgICAgKgotICAgICAqIEVuZE9mSW5zdHJ1Y3Rpb246IGVuZF9pbnN0cigpOwotICAgICAqCi0gICAgICogVXAgdG8gdGhlIHBvaW50IHdoZXJlIFRSQUNFX1JFRyBpcyBleHBhbmRlZCwgTk8gbW9kaWZpY2F0aW9ucwotICAgICAqIGFyZSBkb25lIHRvIGFueSByZWdpc3RlciBFWENFUFQgdGhlIElQIHJlZ2lzdGVyLCBmb3IgZmV0Y2ggYW5kCi0gICAgICogZGVjb2RpbmcgcHVycG9zZXMuCi0gICAgICoKLSAgICAgKiBUaGlzIHdhcyBkb25lIGZvciBhbiBlbnRpcmVseSBkaWZmZXJlbnQgcmVhc29uLCBidXQgbWFrZXMgYQotICAgICAqIG5pY2Ugd2F5IHRvIGdldCB0aGUgc3lzdGVtIHRvIGhlbHAgZGVidWcgY29kZXMuCi0gICAgICovCi0JdHJlZ3MgPSBNOwotICAgIHRyZWdzLng4Ni5SX0lQID0gb2ZmOwotICAgIHRyZWdzLng4Ni5SX0NTID0gc2VnOwotCi0gICAgLyogcmVzZXQgdGhlIGRlY29kaW5nIGJ1ZmZlcnMgKi8KLSAgICB0cmVncy54ODYuZW5jX3N0cl9wb3MgPSAwOwotICAgIHRyZWdzLng4Ni5lbmNfcG9zID0gMDsKLQotICAgIC8qIHR1cm4gb24gdGhlICJkaXNhc3NlbWJsZSBvbmx5LCBubyBleGVjdXRlIiBmbGFnICovCi0gICAgdHJlZ3MueDg2LmRlYnVnIHw9IERFQlVHX0RJU0FTU0VNQkxFX0Y7Ci0KLSAgICAvKiBEVU1QIE5FWFQgbiBpbnN0cnVjdGlvbnMgdG8gc2NyZWVuIGluIHN0cmFpZ2h0X2xpbmUgZmFzaGlvbiAqLwotICAgIC8qCi0gICAgICogVGhpcyBsb29rcyBsaWtlIHRoZSByZWd1bGFyIGluc3RydWN0aW9uIGZldGNoIHN0cmVhbSwgZXhjZXB0Ci0gICAgICogdGhhdCB3aGVuIHRoaXMgb2NjdXJzLCBlYWNoIGZldGNoZWQgb3Bjb2RlLCB1cG9uIHNlZWluZyB0aGUKLSAgICAgKiBERUJVR19ESVNBU1NFTUJMRSBmbGFnIHNldCwgZXhpdHMgaW1tZWRpYXRlbHkgYWZ0ZXIgZGVjb2RpbmcKLSAgICAgKiB0aGUgaW5zdHJ1Y3Rpb24uICBYWFggLS0tIENIRUNLIFRIQVQgTUVNIElTIE5PVCBBRkZFQ1RFRCEhIQotICAgICAqIE5vdGUgdGhlIHVzZSBvZiBhIGNvcHkgb2YgdGhlIHJlZ2lzdGVyIHN0cnVjdHVyZS4uLgotICAgICAqLwotICAgIGZvciAoaT0wOyBpPG47IGkrKykgewotCQlvcDEgPSAoKnN5c19yZGIpKCgodTMyKU0ueDg2LlJfQ1M8PDQpICsgKE0ueDg2LlJfSVArKykpOwotCQkoeDg2ZW11X29wdGFiW29wMV0pKG9wMSk7Ci0gICAgfQotICAgIC8qIGVuZCBtYWpvciBoYWNrIG1vZGUuICovCi19Ci0KLXZvaWQgeDg2ZW11X2NoZWNrX2lwX2FjY2VzcyAodm9pZCkKLXsKLSAgICAvKiBOVUxMIGFzIG9mIG5vdyAqLwotfQotCi12b2lkIHg4NmVtdV9jaGVja19zcF9hY2Nlc3MgKHZvaWQpCi17Ci19Ci0KLXZvaWQgeDg2ZW11X2NoZWNrX21lbV9hY2Nlc3MgKHUzMiBkdW1teSkKLXsKLQkvKiAgY2hlY2sgYm91bmRzLCBldGMgKi8KLX0KLQotdm9pZCB4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3MgKHVpbnQgZHVtbXkxLCB1aW50IGR1bW15MikKLXsKLQkvKiAgY2hlY2sgYm91bmRzLCBldGMgKi8KLX0KLQotdm9pZCB4ODZlbXVfaW5jX2RlY29kZWRfaW5zdF9sZW4gKGludCB4KQotewotCU0ueDg2LmVuY19wb3MgKz0geDsKLX0KLQotdm9pZCB4ODZlbXVfZGVjb2RlX3ByaW50ZiAoY2hhciAqeCkKLXsKLQlzcHJpbnRmKE0ueDg2LmRlY29kZWRfYnVmK00ueDg2LmVuY19zdHJfcG9zLCIlcyIseCk7Ci0JTS54ODYuZW5jX3N0cl9wb3MgKz0gc3RybGVuKHgpOwotfQotCi12b2lkIHg4NmVtdV9kZWNvZGVfcHJpbnRmMiAoY2hhciAqeCwgaW50IHkpCi17Ci0JY2hhciB0ZW1wWzEwMF07Ci0Jc3ByaW50Zih0ZW1wLHgseSk7Ci0Jc3ByaW50ZihNLng4Ni5kZWNvZGVkX2J1ZitNLng4Ni5lbmNfc3RyX3BvcywiJXMiLHRlbXApOwotCU0ueDg2LmVuY19zdHJfcG9zICs9IHN0cmxlbih0ZW1wKTsKLX0KLQotdm9pZCB4ODZlbXVfZW5kX2luc3RyICh2b2lkKQotewotCU0ueDg2LmVuY19zdHJfcG9zID0gMDsKLQlNLng4Ni5lbmNfcG9zID0gMDsKLX0KLQotc3RhdGljIHZvaWQgcHJpbnRfZW5jb2RlZF9ieXRlcyAodTE2IHMsIHUxNiBvKQotewotICAgIGludCBpOwotICAgIGNoYXIgYnVmMVs2NF07Ci0JZm9yIChpPTA7IGk8IE0ueDg2LmVuY19wb3M7IGkrKykgewotCQlzcHJpbnRmKGJ1ZjErMippLCIlMDJ4IiwgZmV0Y2hfZGF0YV9ieXRlX2FicyhzLG8raSkpOwotICAgIH0KLQlwcmludGsoIiUtMjBzIixidWYxKTsKLX0KLQotc3RhdGljIHZvaWQgcHJpbnRfZGVjb2RlZF9pbnN0cnVjdGlvbiAodm9pZCkKLXsKLQlwcmludGsoIiVzIiwgTS54ODYuZGVjb2RlZF9idWYpOwotfQotCi12b2lkIHg4NmVtdV9wcmludF9pbnRfdmVjdCAodTE2IGl2KQotewotCXUxNiBzZWcsb2ZmOwotCi0JaWYgKGl2ID4gMjU2KSByZXR1cm47Ci0Jc2VnICAgPSBmZXRjaF9kYXRhX3dvcmRfYWJzKDAsaXYqNCk7Ci0Jb2ZmICAgPSBmZXRjaF9kYXRhX3dvcmRfYWJzKDAsaXYqNCsyKTsKLQlwcmludGsoIiUwNHg6JTA0eCAiLCBzZWcsIG9mZik7Ci19Ci0KLXZvaWQgWDg2RU1VX2R1bXBfbWVtb3J5ICh1MTYgc2VnLCB1MTYgb2ZmLCB1MzIgYW10KQotewotICAgIHUzMiBzdGFydCA9IG9mZiAmIDB4ZmZmZmZmZjA7Ci0gICAgdTMyIGVuZCAgPSAob2ZmKzE2KSAmIDB4ZmZmZmZmZjA7Ci0gICAgdTMyIGk7Ci0gICAgdTMyIGN1cnJlbnQ7Ci0KLSAgICBjdXJyZW50ID0gc3RhcnQ7Ci0gICAgd2hpbGUgKGVuZCA8PSBvZmYgKyBhbXQpIHsKLQlwcmludGsoIiUwNHg6JTA0eCAiLCBzZWcsIHN0YXJ0KTsKLQlmb3IgKGk9c3RhcnQ7IGk8IG9mZjsgaSsrKQotCSAgICBwcmludGsoIiAgICIpOwotCWZvciAoICAgICAgIDsgaTwgZW5kOyBpKyspCi0JICAgIHByaW50aygiJTAyeCAiLCBmZXRjaF9kYXRhX2J5dGVfYWJzKHNlZyxpKSk7Ci0JcHJpbnRrKCJcbiIpOwotCXN0YXJ0ID0gZW5kOwotCWVuZCA9IHN0YXJ0ICsgMTY7Ci0gICAgfQotfQotCi12b2lkIHg4NmVtdV9zaW5nbGVfc3RlcCAodm9pZCkKLXsKLSAgICBjaGFyIHNbMTAyNF07Ci0gICAgaW50IHBzWzEwXTsKLSAgICBpbnQgbnRvazsKLSAgICBpbnQgY21kOwotICAgIGludCBkb25lOwotCQlpbnQgc2VnbWVudDsKLSAgICBpbnQgb2Zmc2V0OwotICAgIHN0YXRpYyBpbnQgYnJlYWtwb2ludDsKLSAgICBzdGF0aWMgaW50IG5vRGVjb2RlID0gMTsKLQotICAgIGNoYXIgKnA7Ci0KLSAgICBpZiAoREVCVUdfQlJFQUsoKSkgewotCWlmIChNLng4Ni5zYXZlZF9pcCAhPSBicmVha3BvaW50KSB7Ci0JICAgIHJldHVybjsKLQl9IGVsc2UgewotCSAgICBNLng4Ni5kZWJ1ZyAmPSB+REVCVUdfREVDT0RFX05PUFJJTlRfRjsKLQkgICAgTS54ODYuZGVidWcgfD0gREVCVUdfVFJBQ0VfRjsKLQkgICAgTS54ODYuZGVidWcgJj0gfkRFQlVHX0JSRUFLX0Y7Ci0JICAgIHByaW50X2RlY29kZWRfaW5zdHJ1Y3Rpb24gKCk7Ci0JICAgIFg4NkVNVV90cmFjZV9yZWdzKCk7Ci0JfQotICAgIH0KLQotICAgIGRvbmU9MDsKLSAgICBvZmZzZXQgPSBNLng4Ni5zYXZlZF9pcDsKLSAgICB3aGlsZSAoIWRvbmUpIHsKLQlwcmludGsoIi0iKTsKLQkvKnAgPSBmZ2V0cyhzLCAxMDIzLCBzdGRpbik7ICovCi0JY29uc19nZXRzKHMpOwotCWNtZCA9IHBhcnNlX2xpbmUocywgcHMsICZudG9rKTsKLQlzd2l0Y2goY21kKSB7Ci0JY2FzZSAndSc6Ci0JICAgIGRpc2Fzc2VtYmxlX2ZvcndhcmQoTS54ODYuc2F2ZWRfY3MsKHUxNilvZmZzZXQsMTApOwotCSAgICBicmVhazsKLQljYXNlICdkJzoKLQkgICAgaWYgKG50b2sgPT0gMikgewotCQlzZWdtZW50ID0gTS54ODYuc2F2ZWRfY3M7Ci0JCW9mZnNldCA9IHBzWzFdOwotCQlYODZFTVVfZHVtcF9tZW1vcnkoc2VnbWVudCwodTE2KW9mZnNldCwxNik7Ci0JCW9mZnNldCArPSAxNjsKLQkgICAgfSBlbHNlIGlmIChudG9rID09IDMpIHsKLQkJc2VnbWVudCA9IHBzWzFdOwotCQlvZmZzZXQgPSBwc1syXTsKLQkJWDg2RU1VX2R1bXBfbWVtb3J5KHNlZ21lbnQsKHUxNilvZmZzZXQsMTYpOwotCQlvZmZzZXQgKz0gMTY7Ci0JICAgIH0gZWxzZSB7Ci0JCXNlZ21lbnQgPSBNLng4Ni5zYXZlZF9jczsKLQkJWDg2RU1VX2R1bXBfbWVtb3J5KHNlZ21lbnQsKHUxNilvZmZzZXQsMTYpOwotCQlvZmZzZXQgKz0gMTY7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSAnYyc6Ci0JICAgIE0ueDg2LmRlYnVnIF49IERFQlVHX1RSQUNFQ0FMTF9GOwotCSAgICBicmVhazsKLQljYXNlICdzJzoKLQkgICAgTS54ODYuZGVidWcgXj0gREVCVUdfU1ZDX0YgfCBERUJVR19TWVNfRiB8IERFQlVHX1NZU0lOVF9GOwotCSAgICBicmVhazsKLQljYXNlICdyJzoKLQkgICAgWDg2RU1VX3RyYWNlX3JlZ3MoKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAneCc6Ci0JICAgIFg4NkVNVV90cmFjZV94cmVncygpOwotCSAgICBicmVhazsKLQljYXNlICdnJzoKLQkgICAgaWYgKG50b2sgPT0gMikgewotCQlicmVha3BvaW50ID0gcHNbMV07Ci0JCXByaW50aygiYnJlYWtwb2ludCBzZXQgdG8gMHglWFxuIiwgYnJlYWtwb2ludCk7Ci0JCWlmIChub0RlY29kZSkgewotCQkgICAgTS54ODYuZGVidWcgfD0gREVCVUdfREVDT0RFX05PUFJJTlRfRjsKLQkJfSBlbHNlIHsKLQkJICAgIE0ueDg2LmRlYnVnICY9IH5ERUJVR19ERUNPREVfTk9QUklOVF9GOwotCQl9Ci0JCU0ueDg2LmRlYnVnICY9IH5ERUJVR19UUkFDRV9GOwotCQlNLng4Ni5kZWJ1ZyB8PSBERUJVR19CUkVBS19GOwotCQlkb25lID0gMTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlICdxJzoKLQkgICAgTS54ODYuZGVidWcgfD0gREVCVUdfRVhJVDsKLQkgICAgcmV0dXJuOwotCWNhc2UgJ1AnOgotCSAgICBub0RlY29kZSA9IChub0RlY29kZSk/MDoxOwotCSAgICBwcmludGsoIlRvZ2dsZWQgZGVjb2RpbmcgdG8gJXNcbiIsKG5vRGVjb2RlKT8iRkFMU0UiOiJUUlVFIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ3QnOgotCWNhc2UgMDoKLQkgICAgZG9uZSA9IDE7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLWludCBYODZFTVVfdHJhY2Vfb24odm9pZCkKLXsKLQlyZXR1cm4gTS54ODYuZGVidWcgfD0gREVCVUdfU1RFUF9GIHwgREVCVUdfREVDT0RFX0YgfCBERUJVR19UUkFDRV9GOwotfQotCi1pbnQgWDg2RU1VX3RyYWNlX29mZih2b2lkKQotewotCXJldHVybiBNLng4Ni5kZWJ1ZyAmPSB+KERFQlVHX1NURVBfRiB8IERFQlVHX0RFQ09ERV9GIHwgREVCVUdfVFJBQ0VfRik7Ci19Ci0KLXN0YXRpYyBpbnQgcGFyc2VfbGluZSAoY2hhciAqcywgaW50ICpwcywgaW50ICpuKQotewotICAgIGludCBjbWQ7Ci0KLSAgICAqbiA9IDA7Ci0gICAgd2hpbGUoKnMgPT0gJyAnIHx8ICpzID09ICdcdCcpIHMrKzsKLSAgICBwc1sqbl0gPSAqczsKLSAgICBzd2l0Y2ggKCpzKSB7Ci0gICAgICBjYXNlICdcbic6Ci0JKm4gKz0gMTsKLQlyZXR1cm4gMDsKLSAgICAgIGRlZmF1bHQ6Ci0JY21kID0gKnM7Ci0JKm4gKz0gMTsKLSAgICB9Ci0KLQl3aGlsZSAoMSkgewotCQl3aGlsZSAoKnMgIT0gJyAnICYmICpzICE9ICdcdCcgJiYgKnMgIT0gJ1xuJykgIHMrKzsKLQotCQlpZiAoKnMgPT0gJ1xuJykKLQkJCXJldHVybiBjbWQ7Ci0KLQkJd2hpbGUoKnMgPT0gJyAnIHx8ICpzID09ICdcdCcpIHMrKzsKLQotCQlwc1sqbl09YXRvaShzKTsKLQkJLypzc2NhbmYocywiJXgiLCZwc1sqbl0pOyAqLwotCQkqbiArPSAxOwotCX0KLX0KLQotI2VuZGlmIC8qIERFQlVHICovCi0KLXZvaWQgeDg2ZW11X2R1bXBfc3RhY2sodm9pZCkKLXsKLSAgICBpbnQgaTsKLSAgICBwcmludGsoIlN0YWNrOiAiKTsKLSAgICBmb3IgKGkgPSAwOyBpPDE2OyBpKyspCi0gICAgewotCXU4IHggPSBmZXRjaF9kYXRhX2J5dGVfYWJzKE0ueDg2LlJfU1MsIE0ueDg2LlJfU1AgKyBpKTsKLQlwcmludGsoIiUwMnggIiwgKGludCl4KTsKLSAgICB9Ci0gICAgcHJpbnRrKCJcbiIpOwotfQotCi12b2lkIHg4NmVtdV9kdW1wX3JlZ3MgKHZvaWQpCi17Ci0JcHJpbnRrKCJcdEFYPSUwNHggICIsIE0ueDg2LlJfQVggKTsKLQlwcmludGsoIkJYPSUwNHggICIsIE0ueDg2LlJfQlggKTsKLQlwcmludGsoIkNYPSUwNHggICIsIE0ueDg2LlJfQ1ggKTsKLQlwcmludGsoIkRYPSUwNHggICIsIE0ueDg2LlJfRFggKTsKLQlwcmludGsoIlNQPSUwNHggICIsIE0ueDg2LlJfU1AgKTsKLQlwcmludGsoIkJQPSUwNHggICIsIE0ueDg2LlJfQlAgKTsKLQlwcmludGsoIlNJPSUwNHggICIsIE0ueDg2LlJfU0kgKTsKLQlwcmludGsoIkRJPSUwNHhcbiIsIE0ueDg2LlJfREkgKTsKLQlwcmludGsoIlx0RFM9JTA0eCAgIiwgTS54ODYuUl9EUyApOwotCXByaW50aygiRVM9JTA0eCAgIiwgTS54ODYuUl9FUyApOwotCXByaW50aygiU1M9JTA0eCAgIiwgTS54ODYuUl9TUyApOwotCXByaW50aygiQ1M9JTA0eCAgIiwgTS54ODYuUl9DUyApOwotCXByaW50aygiSVA9JTA0eCAgICIsIE0ueDg2LlJfSVAgKTsKLQlpZiAoQUNDRVNTX0ZMQUcoRl9PRikpICAgIHByaW50aygiT1YgIik7ICAgICAvKiBDSEVDS0VELi4uICovCi0JZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiTlYgIik7Ci0JaWYgKEFDQ0VTU19GTEFHKEZfREYpKSAgICBwcmludGsoIkROICIpOwotCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIlVQICIpOwotCWlmIChBQ0NFU1NfRkxBRyhGX0lGKSkgICAgcHJpbnRrKCJFSSAiKTsKLQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJESSAiKTsKLQlpZiAoQUNDRVNTX0ZMQUcoRl9TRikpICAgIHByaW50aygiTkcgIik7Ci0JZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiUEwgIik7Ci0JaWYgKEFDQ0VTU19GTEFHKEZfWkYpKSAgICBwcmludGsoIlpSICIpOwotCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIk5aICIpOwotCWlmIChBQ0NFU1NfRkxBRyhGX0FGKSkgICAgcHJpbnRrKCJBQyAiKTsKLQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJOQSAiKTsKLQlpZiAoQUNDRVNTX0ZMQUcoRl9QRikpICAgIHByaW50aygiUEUgIik7Ci0JZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiUE8gIik7Ci0JaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKSAgICBwcmludGsoIkNZICIpOwotCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIk5DICIpOwotCXByaW50aygiXG4iKTsKLQkvKng4NmVtdV9kdW1wX3N0YWNrKCk7ICovCi19Ci0KLXZvaWQgeDg2ZW11X2R1bXBfeHJlZ3MgKHZvaWQpCi17Ci0JcHJpbnRrKCJcdEVBWD0lMDh4ICAiLCBNLng4Ni5SX0VBWCApOwotCXByaW50aygiRUJYPSUwOHggICIsIE0ueDg2LlJfRUJYICk7Ci0JcHJpbnRrKCJFQ1g9JTA4eCAgIiwgTS54ODYuUl9FQ1ggKTsKLQlwcmludGsoIkVEWD0lMDh4ICBcbiIsIE0ueDg2LlJfRURYICk7Ci0JcHJpbnRrKCJcdEVTUD0lMDh4ICAiLCBNLng4Ni5SX0VTUCApOwotCXByaW50aygiRUJQPSUwOHggICIsIE0ueDg2LlJfRUJQICk7Ci0JcHJpbnRrKCJFU0k9JTA4eCAgIiwgTS54ODYuUl9FU0kgKTsKLQlwcmludGsoIkVEST0lMDh4XG4iLCBNLng4Ni5SX0VESSApOwotCXByaW50aygiXHREUz0lMDR4ICAiLCBNLng4Ni5SX0RTICk7Ci0JcHJpbnRrKCJFUz0lMDR4ICAiLCBNLng4Ni5SX0VTICk7Ci0JcHJpbnRrKCJTUz0lMDR4ICAiLCBNLng4Ni5SX1NTICk7Ci0JcHJpbnRrKCJDUz0lMDR4ICAiLCBNLng4Ni5SX0NTICk7Ci0JcHJpbnRrKCJFSVA9JTA4eFxuXHQiLCBNLng4Ni5SX0VJUCApOwotCWlmIChBQ0NFU1NfRkxBRyhGX09GKSkgICAgcHJpbnRrKCJPViAiKTsgICAgIC8qIENIRUNLRUQuLi4gKi8KLQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJOViAiKTsKLQlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpICAgIHByaW50aygiRE4gIik7Ci0JZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiVVAgIik7Ci0JaWYgKEFDQ0VTU19GTEFHKEZfSUYpKSAgICBwcmludGsoIkVJICIpOwotCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIkRJICIpOwotCWlmIChBQ0NFU1NfRkxBRyhGX1NGKSkgICAgcHJpbnRrKCJORyAiKTsKLQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJQTCAiKTsKLQlpZiAoQUNDRVNTX0ZMQUcoRl9aRikpICAgIHByaW50aygiWlIgIik7Ci0JZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiTlogIik7Ci0JaWYgKEFDQ0VTU19GTEFHKEZfQUYpKSAgICBwcmludGsoIkFDICIpOwotCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIk5BICIpOwotCWlmIChBQ0NFU1NfRkxBRyhGX1BGKSkgICAgcHJpbnRrKCJQRSAiKTsKLQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJQTyAiKTsKLQlpZiAoQUNDRVNTX0ZMQUcoRl9DRikpICAgIHByaW50aygiQ1kgIik7Ci0JZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiTkMgIik7Ci0JcHJpbnRrKCJcbiIpOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L2RlY29kZS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L2RlY29kZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzJiMWY1Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9kZWNvZGUuYworKysgL2Rldi9udWxsCkBAIC0xLDk3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKgkJCQkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0qCi0qICAgICAgICAgICAgCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogCQkJCSAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZwotKiAJCQkJCSAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAotKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0qICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCi0qICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCi0qICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubwotKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KLSogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0qCi0qICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0qICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi0qICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLSogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6CQlBTlNJIEMKLSogRW52aXJvbm1lbnQ6CUFueQotKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAotKgotKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBpbmNsdWRlcyBzdWJyb3V0aW5lcyB3aGljaCBhcmUgcmVsYXRlZCB0bwotKgkJCQlpbnN0cnVjdGlvbiBkZWNvZGluZyBhbmQgYWNjZXNzZXNzIG9mIGltbWVkaWF0ZSBkYXRhIHZpYSBJUC4gIGV0Yy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJ4ODZlbXUveDg2ZW11aS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgYW55IHBlbmRpbmcgYXN5Y2hyb25vdXMgaW50ZXJydXB0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCB4ODZlbXVfaW50cl9oYW5kbGUodm9pZCkKLXsKLQl1OAlpbnRubzsKLQotCWlmIChNLng4Ni5pbnRyICYgSU5UUl9TWU5DSCkgewotCQlpbnRubyA9IE0ueDg2LmludG5vOwotCQlpZiAoX1g4NkVNVV9pbnRyVGFiW2ludG5vXSkgewotCQkJKCpfWDg2RU1VX2ludHJUYWJbaW50bm9dKShpbnRubyk7Ci0JCX0gZWxzZSB7Ci0JCQlwdXNoX3dvcmQoKHUxNilNLng4Ni5SX0ZMRyk7Ci0JCQlDTEVBUl9GTEFHKEZfSUYpOwotCQkJQ0xFQVJfRkxBRyhGX1RGKTsKLQkJCXB1c2hfd29yZChNLng4Ni5SX0NTKTsKLQkJCU0ueDg2LlJfQ1MgPSBtZW1fYWNjZXNzX3dvcmQoaW50bm8gKiA0ICsgMik7Ci0JCQlwdXNoX3dvcmQoTS54ODYuUl9JUCk7Ci0JCQlNLng4Ni5SX0lQID0gbWVtX2FjY2Vzc193b3JkKGludG5vICogNCk7Ci0JCQlNLng4Ni5pbnRyID0gMDsKLQkJfQotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1pbnRybnVtIC0gSW50ZXJydXB0IG51bWJlciB0byByYWlzZQotCi1SRU1BUktTOgotUmFpc2UgdGhlIHNwZWNpZmllZCBpbnRlcnJ1cHQgdG8gYmUgaGFuZGxlZCBiZWZvcmUgdGhlIGV4ZWN1dGlvbiBvZiB0aGUKLW5leHQgaW5zdHJ1Y3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVfaW50cl9yYWlzZSgKLQl1OCBpbnRybnVtKQotewotCU0ueDg2LmludG5vID0gaW50cm51bTsKLQlNLng4Ni5pbnRyIHw9IElOVFJfU1lOQ0g7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotTWFpbiBleGVjdXRpb24gbG9vcCBmb3IgdGhlIGVtdWxhdG9yLiBXZSByZXR1cm4gZnJvbSBoZXJlIHdoZW4gdGhlIHN5c3RlbQotaGFsdHMsIHdoaWNoIGlzIG5vcm1hbGx5IGNhdXNlZCBieSBhIHN0YWNrIGZhdWx0IHdoZW4gd2UgcmV0dXJuIGZyb20gdGhlCi1vcmlnaW5hbCByZWFsIG1vZGUgY2FsbC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFg4NkVNVV9leGVjKHZvaWQpCi17Ci0gICAgdTggb3AxOwotCi0gICAgTS54ODYuaW50ciA9IDA7Ci0gICAgREIoeDg2ZW11X2VuZF9pbnN0cigpOykKLQotICAgIGZvciAoOzspIHsKLQlEQihpZiAoQ0hFQ0tfSVBfRkVUQ0goKSkgeDg2ZW11X2NoZWNrX2lwX2FjY2VzcygpOykKLQkvKiBJZiBkZWJ1Z2dpbmcsIHNhdmUgdGhlIElQIGFuZCBDUyB2YWx1ZXMuICovCi0JU0FWRV9JUF9DUyhNLng4Ni5SX0NTLCBNLng4Ni5SX0lQKTsKLQlJTkNfREVDT0RFRF9JTlNUX0xFTigxKTsKLQlpZiAoTS54ODYuaW50cikgewotCSAgICBpZiAoTS54ODYuaW50ciAmIElOVFJfSEFMVEVEKSB7Ci0JCURCKAlwcmludGsoImhhbHRlZFxuIik7IFg4NkVNVV90cmFjZV9yZWdzKCk7KQotCQkgICAgcmV0dXJuOwotCSAgICB9Ci0JICAgIGlmICgoKE0ueDg2LmludHIgJiBJTlRSX1NZTkNIKSAmJiAoTS54ODYuaW50bm8gPT0gMCB8fCBNLng4Ni5pbnRubyA9PSAyKSkgfHwKLQkJIUFDQ0VTU19GTEFHKEZfSUYpKSB7Ci0JCXg4NmVtdV9pbnRyX2hhbmRsZSgpOwotCSAgICB9Ci0JfQotCW9wMSA9ICgqc3lzX3JkYikoKCh1MzIpTS54ODYuUl9DUyA8PCA0KSArIChNLng4Ni5SX0lQKyspKTsKLQkoKng4NmVtdV9vcHRhYltvcDFdKShvcDEpOwotCWlmIChNLng4Ni5kZWJ1ZyAmIERFQlVHX0VYSVQpIHsKLQkgICAgTS54ODYuZGVidWcgJj0gfkRFQlVHX0VYSVQ7Ci0JICAgIHJldHVybjsKLQl9Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbHRzIHRoZSBzeXN0ZW0gYnkgc2V0dGluZyB0aGUgaGFsdGVkIHN5c3RlbSBmbGFnLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgWDg2RU1VX2hhbHRfc3lzKHZvaWQpCi17Ci0JTS54ODYuaW50ciB8PSBJTlRSX0hBTFRFRDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1tb2QJCS0gTW9kIHZhbHVlIGZyb20gZGVjb2RlZCBieXRlCi1yZWdoCS0gUmVnIGggdmFsdWUgZnJvbSBkZWNvZGVkIGJ5dGUKLXJlZ2wJLSBSZWcgbCB2YWx1ZSBmcm9tIGRlY29kZWQgYnl0ZQotCi1SRU1BUktTOgotUmFpc2UgdGhlIHNwZWNpZmllZCBpbnRlcnJ1cHQgdG8gYmUgaGFuZGxlZCBiZWZvcmUgdGhlIGV4ZWN1dGlvbiBvZiB0aGUKLW5leHQgaW5zdHJ1Y3Rpb24uCi0KLU5PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiwgYXMgKCpzeXNfcmRiKSBpcyBhbHJlYWR5IGlubGluZSEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGZldGNoX2RlY29kZV9tb2RybSgKLQlpbnQgKm1vZCwKLQlpbnQgKnJlZ2gsCi0JaW50ICpyZWdsKQotewotCWludCBmZXRjaGVkOwotCi1EQigJaWYgKENIRUNLX0lQX0ZFVENIKCkpCi0JICB4ODZlbXVfY2hlY2tfaXBfYWNjZXNzKCk7KQotCWZldGNoZWQgPSAoKnN5c19yZGIpKCgodTMyKU0ueDg2LlJfQ1MgPDwgNCkgKyAoTS54ODYuUl9JUCsrKSk7Ci0JSU5DX0RFQ09ERURfSU5TVF9MRU4oMSk7Ci0JKm1vZCAgPSAoZmV0Y2hlZCA+PiA2KSAmIDB4MDM7Ci0JKnJlZ2ggPSAoZmV0Y2hlZCA+PiAzKSAmIDB4MDc7Ci0gICAgKnJlZ2wgPSAoZmV0Y2hlZCA+PiAwKSAmIDB4MDc7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVRVUk5TOgotSW1tZWRpYXRlIGJ5dGUgdmFsdWUgcmVhZCBmcm9tIGluc3RydWN0aW9uIHF1ZXVlCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGltbWVkaWF0ZSBieXRlIGZyb20gdGhlIGluc3RydWN0aW9uIHF1ZXVlLCBhbmQKLW1vdmVzIHRoZSBpbnN0cnVjdGlvbiBwb2ludGVyIHRvIHRoZSBuZXh0IHZhbHVlLgotCi1OT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24sIGFzICgqc3lzX3JkYikgaXMgYWxyZWFkeSBpbmxpbmUhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggZmV0Y2hfYnl0ZV9pbW0odm9pZCkKLXsKLQl1OCBmZXRjaGVkOwotCi1EQigJaWYgKENIRUNLX0lQX0ZFVENIKCkpCi0JCXg4NmVtdV9jaGVja19pcF9hY2Nlc3MoKTspCi0JZmV0Y2hlZCA9ICgqc3lzX3JkYikoKCh1MzIpTS54ODYuUl9DUyA8PCA0KSArIChNLng4Ni5SX0lQKyspKTsKLQlJTkNfREVDT0RFRF9JTlNUX0xFTigxKTsKLQlyZXR1cm4gZmV0Y2hlZDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1JbW1lZGlhdGUgd29yZCB2YWx1ZSByZWFkIGZyb20gaW5zdHJ1Y3Rpb24gcXVldWUKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgaW1tZWRpYXRlIGJ5dGUgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gcXVldWUsIGFuZAotbW92ZXMgdGhlIGluc3RydWN0aW9uIHBvaW50ZXIgdG8gdGhlIG5leHQgdmFsdWUuCi0KLU5PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiwgYXMgKCpzeXNfcmR3KSBpcyBhbHJlYWR5IGlubGluZSEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgZmV0Y2hfd29yZF9pbW0odm9pZCkKLXsKLQl1MTYJZmV0Y2hlZDsKLQotREIoCWlmIChDSEVDS19JUF9GRVRDSCgpKQotCQl4ODZlbXVfY2hlY2tfaXBfYWNjZXNzKCk7KQotCWZldGNoZWQgPSAoKnN5c19yZHcpKCgodTMyKU0ueDg2LlJfQ1MgPDwgNCkgKyAoTS54ODYuUl9JUCkpOwotCU0ueDg2LlJfSVAgKz0gMjsKLQlJTkNfREVDT0RFRF9JTlNUX0xFTigyKTsKLQlyZXR1cm4gZmV0Y2hlZDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFVFVSTlM6Ci1JbW1lZGlhdGUgbG9uZSB2YWx1ZSByZWFkIGZyb20gaW5zdHJ1Y3Rpb24gcXVldWUKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgaW1tZWRpYXRlIGJ5dGUgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gcXVldWUsIGFuZAotbW92ZXMgdGhlIGluc3RydWN0aW9uIHBvaW50ZXIgdG8gdGhlIG5leHQgdmFsdWUuCi0KLU5PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiwgYXMgKCpzeXNfcmR3KSBpcyBhbHJlYWR5IGlubGluZSEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgZmV0Y2hfbG9uZ19pbW0odm9pZCkKLXsKLQl1MzIgZmV0Y2hlZDsKLQotREIoCWlmIChDSEVDS19JUF9GRVRDSCgpKQotCSAgeDg2ZW11X2NoZWNrX2lwX2FjY2VzcygpOykKLQlmZXRjaGVkID0gKCpzeXNfcmRsKSgoKHUzMilNLng4Ni5SX0NTIDw8IDQpICsgKE0ueDg2LlJfSVApKTsKLQlNLng4Ni5SX0lQICs9IDQ7Ci0JSU5DX0RFQ09ERURfSU5TVF9MRU4oNCk7Ci0JcmV0dXJuIGZldGNoZWQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRVRVUk5TOgotVmFsdWUgb2YgdGhlIGRlZmF1bHQgZGF0YSBzZWdtZW50Ci0KLVJFTUFSS1M6Ci1JbmxpbmUgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBkZWZhdWx0IGRhdGEgc2VnbWVudCBmb3IgdGhlIGN1cnJlbnQKLWluc3RydWN0aW9uLgotCi1PbiB0aGUgeDg2IHByb2Nlc3NvciwgdGhlIGRlZmF1bHQgc2VnbWVudCBpcyBub3QgYWx3YXlzIERTIGlmIHRoZXJlIGlzCi1ubyBzZWdtZW50IG92ZXJyaWRlLiBBZGRyZXNzIG1vZGVzIHN1Y2ggYXMgLTNbQlBdIG9yIDEwW0JQK1NJXSBhbGwgcmVmZXIgdG8KLWFkZHJlc3NlcyByZWxhdGl2ZSB0byBTUyAoaWU6IG9uIHRoZSBzdGFjaykuIFNvLCBhdCB0aGUgbWluaW11bSwgYWxsCi1kZWNvZGluZ3Mgb2YgYWRkcmVzc2luZyBtb2RlcyB3b3VsZCBoYXZlIHRvIHNldC9jbGVhciBhIGJpdCBkZXNjcmliaW5nCi13aGV0aGVyIHRoZSBhY2Nlc3MgaXMgcmVsYXRpdmUgdG8gRFMgb3IgU1MuICBUaGF0IGlzIHRoZSBmdW5jdGlvbiBvZiB0aGUKLWNwdS1zdGF0ZS12YXJpYmxlIE0ueDg2Lm1vZGUuIFRoZXJlIGFyZSBzZXZlcmFsIHBvdGVudGlhbCBzdGF0ZXM6Ci0KLQlyZXBlIHByZWZpeCBzZWVuICAoaGFuZGxlZCBlbHNld2hlcmUpCi0JcmVwbmUgcHJlZml4IHNlZW4gIChkaXR0bykKLQotCWNzIHNlZ21lbnQgb3ZlcnJpZGUKLQlkcyBzZWdtZW50IG92ZXJyaWRlCi0JZXMgc2VnbWVudCBvdmVycmlkZQotCWZzIHNlZ21lbnQgb3ZlcnJpZGUKLQlncyBzZWdtZW50IG92ZXJyaWRlCi0Jc3Mgc2VnbWVudCBvdmVycmlkZQotCi0JZHMvc3Mgc2VsZWN0IChpbiBhYnNlbnNlIG9mIG92ZXJyaWRlKQotCi1FYWNoIG9mIHRoZSBhYm92ZSA3IGl0ZW1zIGFyZSBoYW5kbGVkIHdpdGggYSBiaXQgaW4gdGhlIG1vZGUgZmllbGQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotX0lOTElORSB1MzIgZ2V0X2RhdGFfc2VnbWVudCh2b2lkKQotewotI2RlZmluZQlHRVRfU0VHTUVOVChzZWdtZW50KQotCXN3aXRjaCAoTS54ODYubW9kZSAmIFNZU01PREVfU0VHTUFTSykgewotCSAgY2FzZSAwOgkJCQkJLyogZGVmYXVsdCBjYXNlOiB1c2UgZHMgcmVnaXN0ZXIgKi8KLQkgIGNhc2UgU1lTTU9ERV9TRUdPVlJfRFM6Ci0JICBjYXNlIFNZU01PREVfU0VHT1ZSX0RTIHwgU1lTTU9ERV9TRUdfRFNfU1M6Ci0JCXJldHVybiAgTS54ODYuUl9EUzsKLQkgIGNhc2UgU1lTTU9ERV9TRUdfRFNfU1M6CS8qIG5vbi1vdmVycmlkZGVuLCB1c2Ugc3MgcmVnaXN0ZXIgKi8KLQkJcmV0dXJuICBNLng4Ni5SX1NTOwotCSAgY2FzZSBTWVNNT0RFX1NFR09WUl9DUzoKLQkgIGNhc2UgU1lTTU9ERV9TRUdPVlJfQ1MgfCBTWVNNT0RFX1NFR19EU19TUzoKLQkJcmV0dXJuICBNLng4Ni5SX0NTOwotCSAgY2FzZSBTWVNNT0RFX1NFR09WUl9FUzoKLQkgIGNhc2UgU1lTTU9ERV9TRUdPVlJfRVMgfCBTWVNNT0RFX1NFR19EU19TUzoKLQkJcmV0dXJuICBNLng4Ni5SX0VTOwotCSAgY2FzZSBTWVNNT0RFX1NFR09WUl9GUzoKLQkgIGNhc2UgU1lTTU9ERV9TRUdPVlJfRlMgfCBTWVNNT0RFX1NFR19EU19TUzoKLQkJcmV0dXJuICBNLng4Ni5SX0ZTOwotCSAgY2FzZSBTWVNNT0RFX1NFR09WUl9HUzoKLQkgIGNhc2UgU1lTTU9ERV9TRUdPVlJfR1MgfCBTWVNNT0RFX1NFR19EU19TUzoKLQkJcmV0dXJuICBNLng4Ni5SX0dTOwotCSAgY2FzZSBTWVNNT0RFX1NFR09WUl9TUzoKLQkgIGNhc2UgU1lTTU9ERV9TRUdPVlJfU1MgfCBTWVNNT0RFX1NFR19EU19TUzoKLQkJcmV0dXJuICBNLng4Ni5SX1NTOwotCSAgZGVmYXVsdDoKLSNpZmRlZglERUJVRwotCQlwcmludGsoImVycm9yOiBzaG91bGQgbm90IGhhcHBlbjogIG11bHRpcGxlIG92ZXJyaWRlcy5cbiIpOwotI2VuZGlmCi0JCUhBTFRfU1lTKCk7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1vZmZzZXQJLSBPZmZzZXQgdG8gbG9hZCBkYXRhIGZyb20KLQotUkVUVVJOUzoKLUJ5dGUgdmFsdWUgcmVhZCBmcm9tIHRoZSBhYnNvbHV0ZSBtZW1vcnkgbG9jYXRpb24uCi0KLU5PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiBhcyAoKnN5c19yZFgpIGlzIGFscmVhZHkgaW5saW5lIQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IGZldGNoX2RhdGFfYnl0ZSgKLQl1aW50IG9mZnNldCkKLXsKLSNpZmRlZiBERUJVRwotCWlmIChDSEVDS19EQVRBX0FDQ0VTUygpKQotCQl4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3MoKHUxNilnZXRfZGF0YV9zZWdtZW50KCksIG9mZnNldCk7Ci0jZW5kaWYKLQlyZXR1cm4gKCpzeXNfcmRiKSgoZ2V0X2RhdGFfc2VnbWVudCgpIDw8IDQpICsgb2Zmc2V0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1vZmZzZXQJLSBPZmZzZXQgdG8gbG9hZCBkYXRhIGZyb20KLQotUkVUVVJOUzoKLVdvcmQgdmFsdWUgcmVhZCBmcm9tIHRoZSBhYnNvbHV0ZSBtZW1vcnkgbG9jYXRpb24uCi0KLU5PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiBhcyAoKnN5c19yZFgpIGlzIGFscmVhZHkgaW5saW5lIQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiBmZXRjaF9kYXRhX3dvcmQoCi0JdWludCBvZmZzZXQpCi17Ci0jaWZkZWYgREVCVUcKLQlpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKLQkJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKCh1MTYpZ2V0X2RhdGFfc2VnbWVudCgpLCBvZmZzZXQpOwotI2VuZGlmCi0JcmV0dXJuICgqc3lzX3JkdykoKGdldF9kYXRhX3NlZ21lbnQoKSA8PCA0KSArIG9mZnNldCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotb2Zmc2V0CS0gT2Zmc2V0IHRvIGxvYWQgZGF0YSBmcm9tCi0KLVJFVFVSTlM6Ci1Mb25nIHZhbHVlIHJlYWQgZnJvbSB0aGUgYWJzb2x1dGUgbWVtb3J5IGxvY2F0aW9uLgotCi1OT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfcmRYKSBpcyBhbHJlYWR5IGlubGluZSEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgZmV0Y2hfZGF0YV9sb25nKAotCXVpbnQgb2Zmc2V0KQotewotI2lmZGVmIERFQlVHCi0JaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCi0JCXg4NmVtdV9jaGVja19kYXRhX2FjY2VzcygodTE2KWdldF9kYXRhX3NlZ21lbnQoKSwgb2Zmc2V0KTsKLSNlbmRpZgotCXJldHVybiAoKnN5c19yZGwpKChnZXRfZGF0YV9zZWdtZW50KCkgPDwgNCkgKyBvZmZzZXQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXNlZ21lbnQJLSBTZWdtZW50IHRvIGxvYWQgZGF0YSBmcm9tCi1vZmZzZXQJLSBPZmZzZXQgdG8gbG9hZCBkYXRhIGZyb20KLQotUkVUVVJOUzoKLUJ5dGUgdmFsdWUgcmVhZCBmcm9tIHRoZSBhYnNvbHV0ZSBtZW1vcnkgbG9jYXRpb24uCi0KLU5PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiBhcyAoKnN5c19yZFgpIGlzIGFscmVhZHkgaW5saW5lIQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IGZldGNoX2RhdGFfYnl0ZV9hYnMoCi0JdWludCBzZWdtZW50LAotCXVpbnQgb2Zmc2V0KQotewotI2lmZGVmIERFQlVHCi0JaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCi0JCXg4NmVtdV9jaGVja19kYXRhX2FjY2VzcyhzZWdtZW50LCBvZmZzZXQpOwotI2VuZGlmCi0JcmV0dXJuICgqc3lzX3JkYikoKCh1MzIpc2VnbWVudCA8PCA0KSArIG9mZnNldCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc2VnbWVudAktIFNlZ21lbnQgdG8gbG9hZCBkYXRhIGZyb20KLW9mZnNldAktIE9mZnNldCB0byBsb2FkIGRhdGEgZnJvbQotCi1SRVRVUk5TOgotV29yZCB2YWx1ZSByZWFkIGZyb20gdGhlIGFic29sdXRlIG1lbW9yeSBsb2NhdGlvbi4KLQotTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3JkWCkgaXMgYWxyZWFkeSBpbmxpbmUhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IGZldGNoX2RhdGFfd29yZF9hYnMoCi0JdWludCBzZWdtZW50LAotCXVpbnQgb2Zmc2V0KQotewotI2lmZGVmIERFQlVHCi0JaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCi0JCXg4NmVtdV9jaGVja19kYXRhX2FjY2VzcyhzZWdtZW50LCBvZmZzZXQpOwotI2VuZGlmCi0JcmV0dXJuICgqc3lzX3JkdykoKCh1MzIpc2VnbWVudCA8PCA0KSArIG9mZnNldCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc2VnbWVudAktIFNlZ21lbnQgdG8gbG9hZCBkYXRhIGZyb20KLW9mZnNldAktIE9mZnNldCB0byBsb2FkIGRhdGEgZnJvbQotCi1SRVRVUk5TOgotTG9uZyB2YWx1ZSByZWFkIGZyb20gdGhlIGFic29sdXRlIG1lbW9yeSBsb2NhdGlvbi4KLQotTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3JkWCkgaXMgYWxyZWFkeSBpbmxpbmUhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIGZldGNoX2RhdGFfbG9uZ19hYnMoCi0JdWludCBzZWdtZW50LAotCXVpbnQgb2Zmc2V0KQotewotI2lmZGVmIERFQlVHCi0JaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCi0JCXg4NmVtdV9jaGVja19kYXRhX2FjY2VzcyhzZWdtZW50LCBvZmZzZXQpOwotI2VuZGlmCi0JcmV0dXJuICgqc3lzX3JkbCkoKCh1MzIpc2VnbWVudCA8PCA0KSArIG9mZnNldCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotb2Zmc2V0CS0gT2Zmc2V0IHRvIHN0b3JlIGRhdGEgYXQKLXZhbAkJLSBWYWx1ZSB0byBzdG9yZQotCi1SRU1BUktTOgotV3JpdGVzIGEgd29yZCB2YWx1ZSB0byBhbiBzZWdtZW50ZWQgbWVtb3J5IGxvY2F0aW9uLiBUaGUgc2VnbWVudCB1c2VkIGlzCi10aGUgY3VycmVudCAnZGVmYXVsdCcgc2VnbWVudCwgd2hpY2ggbWF5IGhhdmUgYmVlbiBvdmVycmlkZGVuLgotCi1OT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfd3JYKSBpcyBhbHJlYWR5IGlubGluZSEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHN0b3JlX2RhdGFfYnl0ZSgKLQl1aW50IG9mZnNldCwKLQl1OCB2YWwpCi17Ci0jaWZkZWYgREVCVUcKLQlpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKLQkJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKCh1MTYpZ2V0X2RhdGFfc2VnbWVudCgpLCBvZmZzZXQpOwotI2VuZGlmCi0JKCpzeXNfd3JiKSgoZ2V0X2RhdGFfc2VnbWVudCgpIDw8IDQpICsgb2Zmc2V0LCB2YWwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW9mZnNldAktIE9mZnNldCB0byBzdG9yZSBkYXRhIGF0Ci12YWwJCS0gVmFsdWUgdG8gc3RvcmUKLQotUkVNQVJLUzoKLVdyaXRlcyBhIHdvcmQgdmFsdWUgdG8gYW4gc2VnbWVudGVkIG1lbW9yeSBsb2NhdGlvbi4gVGhlIHNlZ21lbnQgdXNlZCBpcwotdGhlIGN1cnJlbnQgJ2RlZmF1bHQnIHNlZ21lbnQsIHdoaWNoIG1heSBoYXZlIGJlZW4gb3ZlcnJpZGRlbi4KLQotTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3dyWCkgaXMgYWxyZWFkeSBpbmxpbmUhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzdG9yZV9kYXRhX3dvcmQoCi0JdWludCBvZmZzZXQsCi0JdTE2IHZhbCkKLXsKLSNpZmRlZiBERUJVRwotCWlmIChDSEVDS19EQVRBX0FDQ0VTUygpKQotCQl4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3MoKHUxNilnZXRfZGF0YV9zZWdtZW50KCksIG9mZnNldCk7Ci0jZW5kaWYKLQkoKnN5c193cncpKChnZXRfZGF0YV9zZWdtZW50KCkgPDwgNCkgKyBvZmZzZXQsIHZhbCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotb2Zmc2V0CS0gT2Zmc2V0IHRvIHN0b3JlIGRhdGEgYXQKLXZhbAkJLSBWYWx1ZSB0byBzdG9yZQotCi1SRU1BUktTOgotV3JpdGVzIGEgbG9uZyB2YWx1ZSB0byBhbiBzZWdtZW50ZWQgbWVtb3J5IGxvY2F0aW9uLiBUaGUgc2VnbWVudCB1c2VkIGlzCi10aGUgY3VycmVudCAnZGVmYXVsdCcgc2VnbWVudCwgd2hpY2ggbWF5IGhhdmUgYmVlbiBvdmVycmlkZGVuLgotCi1OT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfd3JYKSBpcyBhbHJlYWR5IGlubGluZSEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHN0b3JlX2RhdGFfbG9uZygKLQl1aW50IG9mZnNldCwKLQl1MzIgdmFsKQotewotI2lmZGVmIERFQlVHCi0JaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCi0JCXg4NmVtdV9jaGVja19kYXRhX2FjY2VzcygodTE2KWdldF9kYXRhX3NlZ21lbnQoKSwgb2Zmc2V0KTsKLSNlbmRpZgotCSgqc3lzX3dybCkoKGdldF9kYXRhX3NlZ21lbnQoKSA8PCA0KSArIG9mZnNldCwgdmFsKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zZWdtZW50CS0gU2VnbWVudCB0byBzdG9yZSBkYXRhIGF0Ci1vZmZzZXQJLSBPZmZzZXQgdG8gc3RvcmUgZGF0YSBhdAotdmFsCQktIFZhbHVlIHRvIHN0b3JlCi0KLVJFTUFSS1M6Ci1Xcml0ZXMgYSBieXRlIHZhbHVlIHRvIGFuIGFic29sdXRlIG1lbW9yeSBsb2NhdGlvbi4KLQotTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3dyWCkgaXMgYWxyZWFkeSBpbmxpbmUhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzdG9yZV9kYXRhX2J5dGVfYWJzKAotCXVpbnQgc2VnbWVudCwKLQl1aW50IG9mZnNldCwKLQl1OCB2YWwpCi17Ci0jaWZkZWYgREVCVUcKLQlpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKLQkJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKHNlZ21lbnQsIG9mZnNldCk7Ci0jZW5kaWYKLQkoKnN5c193cmIpKCgodTMyKXNlZ21lbnQgPDwgNCkgKyBvZmZzZXQsIHZhbCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotc2VnbWVudAktIFNlZ21lbnQgdG8gc3RvcmUgZGF0YSBhdAotb2Zmc2V0CS0gT2Zmc2V0IHRvIHN0b3JlIGRhdGEgYXQKLXZhbAkJLSBWYWx1ZSB0byBzdG9yZQotCi1SRU1BUktTOgotV3JpdGVzIGEgd29yZCB2YWx1ZSB0byBhbiBhYnNvbHV0ZSBtZW1vcnkgbG9jYXRpb24uCi0KLU5PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiBhcyAoKnN5c193clgpIGlzIGFscmVhZHkgaW5saW5lIQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgc3RvcmVfZGF0YV93b3JkX2FicygKLQl1aW50IHNlZ21lbnQsCi0JdWludCBvZmZzZXQsCi0JdTE2IHZhbCkKLXsKLSNpZmRlZiBERUJVRwotCWlmIChDSEVDS19EQVRBX0FDQ0VTUygpKQotCQl4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3Moc2VnbWVudCwgb2Zmc2V0KTsKLSNlbmRpZgotCSgqc3lzX3dydykoKCh1MzIpc2VnbWVudCA8PCA0KSArIG9mZnNldCwgdmFsKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1zZWdtZW50CS0gU2VnbWVudCB0byBzdG9yZSBkYXRhIGF0Ci1vZmZzZXQJLSBPZmZzZXQgdG8gc3RvcmUgZGF0YSBhdAotdmFsCQktIFZhbHVlIHRvIHN0b3JlCi0KLVJFTUFSS1M6Ci1Xcml0ZXMgYSBsb25nIHZhbHVlIHRvIGFuIGFic29sdXRlIG1lbW9yeSBsb2NhdGlvbi4KLQotTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3dyWCkgaXMgYWxyZWFkeSBpbmxpbmUhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBzdG9yZV9kYXRhX2xvbmdfYWJzKAotCXVpbnQgc2VnbWVudCwKLQl1aW50IG9mZnNldCwKLQl1MzIgdmFsKQotewotI2lmZGVmIERFQlVHCi0JaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCi0JCXg4NmVtdV9jaGVja19kYXRhX2FjY2VzcyhzZWdtZW50LCBvZmZzZXQpOwotI2VuZGlmCi0JKCpzeXNfd3JsKSgoKHUzMilzZWdtZW50IDw8IDQpICsgb2Zmc2V0LCB2YWwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXJlZwktIFJlZ2lzdGVyIHRvIGRlY29kZQotCi1SRVRVUk5TOgotUG9pbnRlciB0byB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIKLQotUkVNQVJLUzoKLVJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHJlZ2lzdGVyIGdpdmVuIGJ5IHRoZSBSL1JNIGZpZWxkIG9mIHRoZQotbW9kcm0gYnl0ZSwgZm9yIGJ5dGUgb3BlcmFuZHMuIEFsc28gZW5hYmxlcyB0aGUgZGVjb2Rpbmcgb2YgaW5zdHJ1Y3Rpb25zLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4KiBkZWNvZGVfcm1fYnl0ZV9yZWdpc3RlcigKLQlpbnQgcmVnKQotewotCXN3aXRjaCAocmVnKSB7Ci0gICAgICBjYXNlIDA6Ci0JCURFQ09ERV9QUklOVEYoIkFMIik7Ci0JCXJldHVybiAmTS54ODYuUl9BTDsKLQkgIGNhc2UgMToKLQkJREVDT0RFX1BSSU5URigiQ0wiKTsKLQkJcmV0dXJuICZNLng4Ni5SX0NMOwotCSAgY2FzZSAyOgotCQlERUNPREVfUFJJTlRGKCJETCIpOwotCQlyZXR1cm4gJk0ueDg2LlJfREw7Ci0JICBjYXNlIDM6Ci0JCURFQ09ERV9QUklOVEYoIkJMIik7Ci0JCXJldHVybiAmTS54ODYuUl9CTDsKLQkgIGNhc2UgNDoKLQkJREVDT0RFX1BSSU5URigiQUgiKTsKLQkJcmV0dXJuICZNLng4Ni5SX0FIOwotCSAgY2FzZSA1OgotCQlERUNPREVfUFJJTlRGKCJDSCIpOwotCQlyZXR1cm4gJk0ueDg2LlJfQ0g7Ci0JICBjYXNlIDY6Ci0JCURFQ09ERV9QUklOVEYoIkRIIik7Ci0JCXJldHVybiAmTS54ODYuUl9ESDsKLQkgIGNhc2UgNzoKLQkJREVDT0RFX1BSSU5URigiQkgiKTsKLQkJcmV0dXJuICZNLng4Ni5SX0JIOwotCX0KLQlIQUxUX1NZUygpOwotCXJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAvKiBOT1QgUkVBQ0hFRCBPUiBSRUFDSEVEIE9OIEVSUk9SICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcmVnCS0gUmVnaXN0ZXIgdG8gZGVjb2RlCi0KLVJFVFVSTlM6Ci1Qb2ludGVyIHRvIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlcgotCi1SRU1BUktTOgotUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgcmVnaXN0ZXIgZ2l2ZW4gYnkgdGhlIFIvUk0gZmllbGQgb2YgdGhlCi1tb2RybSBieXRlLCBmb3Igd29yZCBvcGVyYW5kcy4gIEFsc28gZW5hYmxlcyB0aGUgZGVjb2Rpbmcgb2YgaW5zdHJ1Y3Rpb25zLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiogZGVjb2RlX3JtX3dvcmRfcmVnaXN0ZXIoCi0JaW50IHJlZykKLXsKLQlzd2l0Y2ggKHJlZykgewotCSAgY2FzZSAwOgotCQlERUNPREVfUFJJTlRGKCJBWCIpOwotCQlyZXR1cm4gJk0ueDg2LlJfQVg7Ci0JICBjYXNlIDE6Ci0JCURFQ09ERV9QUklOVEYoIkNYIik7Ci0JCXJldHVybiAmTS54ODYuUl9DWDsKLQkgIGNhc2UgMjoKLQkJREVDT0RFX1BSSU5URigiRFgiKTsKLQkJcmV0dXJuICZNLng4Ni5SX0RYOwotCSAgY2FzZSAzOgotCQlERUNPREVfUFJJTlRGKCJCWCIpOwotCQlyZXR1cm4gJk0ueDg2LlJfQlg7Ci0JICBjYXNlIDQ6Ci0JCURFQ09ERV9QUklOVEYoIlNQIik7Ci0JCXJldHVybiAmTS54ODYuUl9TUDsKLQkgIGNhc2UgNToKLQkJREVDT0RFX1BSSU5URigiQlAiKTsKLQkJcmV0dXJuICZNLng4Ni5SX0JQOwotCSAgY2FzZSA2OgotCQlERUNPREVfUFJJTlRGKCJTSSIpOwotCQlyZXR1cm4gJk0ueDg2LlJfU0k7Ci0JICBjYXNlIDc6Ci0JCURFQ09ERV9QUklOVEYoIkRJIik7Ci0JCXJldHVybiAmTS54ODYuUl9ESTsKLQl9Ci0JSEFMVF9TWVMoKTsKLSAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgLyogTk9UUkVBQ0hFRCBPUiBSRUFDSEVEIE9OIEVSUk9SICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcmVnCS0gUmVnaXN0ZXIgdG8gZGVjb2RlCi0KLVJFVFVSTlM6Ci1Qb2ludGVyIHRvIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlcgotCi1SRU1BUktTOgotUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgcmVnaXN0ZXIgZ2l2ZW4gYnkgdGhlIFIvUk0gZmllbGQgb2YgdGhlCi1tb2RybSBieXRlLCBmb3IgZHdvcmQgb3BlcmFuZHMuICBBbHNvIGVuYWJsZXMgdGhlIGRlY29kaW5nIG9mIGluc3RydWN0aW9ucy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIqIGRlY29kZV9ybV9sb25nX3JlZ2lzdGVyKAotCWludCByZWcpCi17Ci0gICAgc3dpdGNoIChyZWcpIHsKLSAgICAgIGNhc2UgMDoKLQkJREVDT0RFX1BSSU5URigiRUFYIik7Ci0JCXJldHVybiAmTS54ODYuUl9FQVg7Ci0JICBjYXNlIDE6Ci0JCURFQ09ERV9QUklOVEYoIkVDWCIpOwotCQlyZXR1cm4gJk0ueDg2LlJfRUNYOwotCSAgY2FzZSAyOgotCQlERUNPREVfUFJJTlRGKCJFRFgiKTsKLQkJcmV0dXJuICZNLng4Ni5SX0VEWDsKLQkgIGNhc2UgMzoKLQkJREVDT0RFX1BSSU5URigiRUJYIik7Ci0JCXJldHVybiAmTS54ODYuUl9FQlg7Ci0JICBjYXNlIDQ6Ci0JCURFQ09ERV9QUklOVEYoIkVTUCIpOwotCQlyZXR1cm4gJk0ueDg2LlJfRVNQOwotCSAgY2FzZSA1OgotCQlERUNPREVfUFJJTlRGKCJFQlAiKTsKLQkJcmV0dXJuICZNLng4Ni5SX0VCUDsKLQkgIGNhc2UgNjoKLQkJREVDT0RFX1BSSU5URigiRVNJIik7Ci0JCXJldHVybiAmTS54ODYuUl9FU0k7Ci0JICBjYXNlIDc6Ci0JCURFQ09ERV9QUklOVEYoIkVESSIpOwotCQlyZXR1cm4gJk0ueDg2LlJfRURJOwotCX0KLQlIQUxUX1NZUygpOwotICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAvKiBOT1RSRUFDSEVEIE9SIFJFQUNIRUQgT04gRVJST1IgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1yZWcJLSBSZWdpc3RlciB0byBkZWNvZGUKLQotUkVUVVJOUzoKLVBvaW50ZXIgdG8gdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyCi0KLVJFTUFSS1M6Ci1SZXR1cm4gYSBwb2ludGVyIHRvIHRoZSByZWdpc3RlciBnaXZlbiBieSB0aGUgUi9STSBmaWVsZCBvZiB0aGUKLW1vZHJtIGJ5dGUsIGZvciB3b3JkIG9wZXJhbmRzLCBtb2RpZmllZCBmcm9tIGFib3ZlIGZvciB0aGUgd2VpcmRvCi1zcGVjaWFsIGNhc2Ugb2Ygc2VncmVnIG9wZXJhbmRzLiAgQWxzbyBlbmFibGVzIHRoZSBkZWNvZGluZyBvZiBpbnN0cnVjdGlvbnMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2KiBkZWNvZGVfcm1fc2VnX3JlZ2lzdGVyKAotCWludCByZWcpCi17Ci0Jc3dpdGNoIChyZWcpIHsKLQkgIGNhc2UgMDoKLQkJREVDT0RFX1BSSU5URigiRVMiKTsKLQkJcmV0dXJuICZNLng4Ni5SX0VTOwotCSAgY2FzZSAxOgotCQlERUNPREVfUFJJTlRGKCJDUyIpOwotCQlyZXR1cm4gJk0ueDg2LlJfQ1M7Ci0JICBjYXNlIDI6Ci0JCURFQ09ERV9QUklOVEYoIlNTIik7Ci0JCXJldHVybiAmTS54ODYuUl9TUzsKLQkgIGNhc2UgMzoKLQkJREVDT0RFX1BSSU5URigiRFMiKTsKLQkJcmV0dXJuICZNLng4Ni5SX0RTOwotCSAgY2FzZSA0OgotCSAgY2FzZSA1OgotCSAgY2FzZSA2OgotCSAgY2FzZSA3OgotCQlERUNPREVfUFJJTlRGKCJJTExFR0FMIFNFR1JFRyIpOwotCQlicmVhazsKLQl9Ci0JSEFMVF9TWVMoKTsKLQlyZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgLyogTk9UIFJFQUNIRUQgT1IgUkVBQ0hFRCBPTiBFUlJPUiAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLXJtCS0gUk0gdmFsdWUgdG8gZGVjb2RlCi0KLVJFVFVSTlM6Ci1PZmZzZXQgaW4gbWVtb3J5IGZvciB0aGUgYWRkcmVzcyBkZWNvZGluZwotCi1SRU1BUktTOgotUmV0dXJuIHRoZSBvZmZzZXQgZ2l2ZW4gYnkgbW9kPTAwIGFkZHJlc3NpbmcuICBBbHNvIGVuYWJsZXMgdGhlCi1kZWNvZGluZyBvZiBpbnN0cnVjdGlvbnMuCi0KLU5PVEU6IAlUaGUgY29kZSB3aGljaCBzcGVjaWZpZXMgdGhlIGNvcnJlc3BvbmRpbmcgc2VnbWVudCAoZHMgdnMgc3MpCi0JCWJlbG93IGluIHRoZSBjYXNlIG9mIFtCUCsuLl0uICBUaGUgYXNzdW1wdGlvbiBoZXJlIGlzIHRoYXQgYXQgdGhlCi0JCXBvaW50IHRoYXQgdGhpcyBzdWJyb3V0aW5lIGlzIGNhbGxlZCwgdGhlIGJpdCBjb3JyZXNwb25kaW5nIHRvCi0JCVNZU01PREVfU0VHX0RTX1NTIHdpbGwgYmUgemVyby4gIEFmdGVyIGV2ZXJ5IGluc3RydWN0aW9uCi0JCWV4Y2VwdCB0aGUgc2VnbWVudCBvdmVycmlkZSBpbnN0cnVjdGlvbnMsIHRoaXMgYml0IChhcyB3ZWxsCi0JCWFzIGFueSBiaXRzIGluZGljYXRpbmcgc2VnbWVudCBvdmVycmlkZXMpIHdpbGwgYmUgY2xlYXIuICBTbwotCQlpZiBhIFNTIGFjY2VzcyBpcyBuZWVkZWQsIHNldCB0aGlzIGJpdC4gIE90aGVyd2lzZSwgRFMgYWNjZXNzCi0JCW9jY3VycyAodW5sZXNzIGFueSBvZiB0aGUgc2VnbWVudCBvdmVycmlkZSBiaXRzIGFyZSBzZXQpLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVuc2lnbmVkIGRlY29kZV9ybTAwX2FkZHJlc3MoCi0JaW50IHJtKQotewotCXVuc2lnbmVkIG9mZnNldDsKLQotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfQUREUikKLQl7Ci0JICAgIHN3aXRjaCAocm0pIHsKLQkgICAgY2FzZSAwOgotCQlERUNPREVfUFJJTlRGKCJbRUFYXSIpOwotCQlyZXR1cm4gTS54ODYuUl9FQVg7Ci0JICAgIGNhc2UgMToKLQkJREVDT0RFX1BSSU5URigiW0VDWF0iKTsKLQkJcmV0dXJuIE0ueDg2LlJfRUNYOwotCSAgICBjYXNlIDI6Ci0JCURFQ09ERV9QUklOVEYoIltFRFhdIik7Ci0vKgkJTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR19EU19TUzsgKi8KLQkJcmV0dXJuIE0ueDg2LlJfRURYOwotCSAgICBjYXNlIDM6Ci0JCURFQ09ERV9QUklOVEYoIltFQlhdIik7Ci0vKgkJTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR19EU19TUzsgKi8KLQkJcmV0dXJuIE0ueDg2LlJfRUJYOwotCSAgICBjYXNlIDQ6Ci0JCXByaW50aygiVW5zdXBwb3J0ZWQgU0lCIGVuY29kaW5nXG4iKTsKLQkJSEFMVF9TWVMoKTsKLQkJcmV0dXJuIDA7Ci0JICAgIGNhc2UgNToKLQkJb2Zmc2V0ID0gZmV0Y2hfbG9uZ19pbW0oKTsKLQkJREVDT0RFX1BSSU5URjIoIlslMDh4XSIsIG9mZnNldCk7Ci0JCXJldHVybiBvZmZzZXQ7Ci0JICAgIGNhc2UgNjoKLQkJREVDT0RFX1BSSU5URigiW0VTSV0iKTsKLQkJcmV0dXJuIE0ueDg2LlJfRVNJOwotCSAgICBjYXNlIDc6Ci0JCURFQ09ERV9QUklOVEYoIltFREldIik7Ci0JCXJldHVybiBNLng4Ni5SX0VESTsKLQkgICAgfQotCX0KLQllbHNlCi0JewotCSAgICBzd2l0Y2ggKHJtKSB7Ci0JICAgIGNhc2UgMDoKLQkJREVDT0RFX1BSSU5URigiW0JYK1NJXSIpOwotCQlyZXR1cm4gTS54ODYuUl9CWCArIE0ueDg2LlJfU0k7Ci0JICAgIGNhc2UgMToKLQkJREVDT0RFX1BSSU5URigiW0JYK0RJXSIpOwotCQlyZXR1cm4gTS54ODYuUl9CWCArIE0ueDg2LlJfREk7Ci0JICAgIGNhc2UgMjoKLQkJREVDT0RFX1BSSU5URigiW0JQK1NJXSIpOwotCQlNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHX0RTX1NTOwotCQlyZXR1cm4gTS54ODYuUl9CUCArIE0ueDg2LlJfU0k7Ci0JICAgIGNhc2UgMzoKLQkJREVDT0RFX1BSSU5URigiW0JQK0RJXSIpOwotCQlNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHX0RTX1NTOwotCQlyZXR1cm4gTS54ODYuUl9CUCArIE0ueDg2LlJfREk7Ci0JICAgIGNhc2UgNDoKLQkJREVDT0RFX1BSSU5URigiW1NJXSIpOwotCQlyZXR1cm4gTS54ODYuUl9TSTsKLQkgICAgY2FzZSA1OgotCQlERUNPREVfUFJJTlRGKCJbREldIik7Ci0JCXJldHVybiBNLng4Ni5SX0RJOwotCSAgICBjYXNlIDY6Ci0JCW9mZnNldCA9IGZldGNoX3dvcmRfaW1tKCk7Ci0JCURFQ09ERV9QUklOVEYyKCJbJTA0eF0iLCBvZmZzZXQpOwotCQlyZXR1cm4gb2Zmc2V0OwotCSAgICBjYXNlIDc6Ci0JCURFQ09ERV9QUklOVEYoIltCWF0iKTsKLQkJcmV0dXJuIE0ueDg2LlJfQlg7Ci0JICAgIH0KLQl9Ci0JSEFMVF9TWVMoKTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1ybQktIFJNIHZhbHVlIHRvIGRlY29kZQotCi1SRVRVUk5TOgotT2Zmc2V0IGluIG1lbW9yeSBmb3IgdGhlIGFkZHJlc3MgZGVjb2RpbmcKLQotUkVNQVJLUzoKLVJldHVybiB0aGUgb2Zmc2V0IGdpdmVuIGJ5IG1vZD0wMSBhZGRyZXNzaW5nLiAgQWxzbyBlbmFibGVzIHRoZQotZGVjb2Rpbmcgb2YgaW5zdHJ1Y3Rpb25zLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVuc2lnbmVkIGRlY29kZV9ybTAxX2FkZHJlc3MoCi0JaW50IHJtKQotewotICAgIGludCBkaXNwbGFjZW1lbnQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0FERFIpCi0gICAgewotCXN3aXRjaCAocm0pCi0JewotCWNhc2UgMDoKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VBWH0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICByZXR1cm4gTS54ODYuUl9FQVggKyBkaXNwbGFjZW1lbnQ7Ci0JY2FzZSAxOgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbRUNYXSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIHJldHVybiBNLng4Ni5SX0VDWCArIGRpc3BsYWNlbWVudDsKLQljYXNlIDI6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtFRFhdIiwgZGlzcGxhY2VtZW50KTsKLQkgICAgcmV0dXJuIE0ueDg2LlJfRURYICsgZGlzcGxhY2VtZW50OwotCWNhc2UgMzoKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VCWF0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICByZXR1cm4gTS54ODYuUl9FQlggKyBkaXNwbGFjZW1lbnQ7Ci0JY2FzZSA0OgotCSAgICBwcmludGsoIlVuc3VwcG9ydGVkIFNJQiBhZGRyZXNzaW5nIG1vZGVcbiIpOwotCSAgICBIQUxUX1NZUygpOwotCSAgICByZXR1cm4gMDsKLQljYXNlIDU6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtFQlBdIiwgZGlzcGxhY2VtZW50KTsKLQkgICAgcmV0dXJuIE0ueDg2LlJfRUJQICsgZGlzcGxhY2VtZW50OwotCWNhc2UgNjoKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VTSV0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICByZXR1cm4gTS54ODYuUl9FU0kgKyBkaXNwbGFjZW1lbnQ7Ci0JY2FzZSA3OgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbRURJXSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIHJldHVybiBNLng4Ni5SX0VESSArIGRpc3BsYWNlbWVudDsKLQl9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0Jc3dpdGNoIChybSkgewotCWNhc2UgMDoKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW0JYK1NJXSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIHJldHVybiBNLng4Ni5SX0JYICsgTS54ODYuUl9TSSArIGRpc3BsYWNlbWVudDsKLQljYXNlIDE6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtCWCtESV0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICByZXR1cm4gTS54ODYuUl9CWCArIE0ueDg2LlJfREkgKyBkaXNwbGFjZW1lbnQ7Ci0JY2FzZSAyOgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbQlArU0ldIiwgZGlzcGxhY2VtZW50KTsKLQkgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR19EU19TUzsKLQkgICAgcmV0dXJuIE0ueDg2LlJfQlAgKyBNLng4Ni5SX1NJICsgZGlzcGxhY2VtZW50OwotCWNhc2UgMzoKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW0JQK0RJXSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdfRFNfU1M7Ci0JICAgIHJldHVybiBNLng4Ni5SX0JQICsgTS54ODYuUl9ESSArIGRpc3BsYWNlbWVudDsKLQljYXNlIDQ6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtTSV0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICByZXR1cm4gTS54ODYuUl9TSSArIGRpc3BsYWNlbWVudDsKLQljYXNlIDU6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtESV0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICByZXR1cm4gTS54ODYuUl9ESSArIGRpc3BsYWNlbWVudDsKLQljYXNlIDY6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtCUF0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHX0RTX1NTOwotCSAgICByZXR1cm4gTS54ODYuUl9CUCArIGRpc3BsYWNlbWVudDsKLQljYXNlIDc6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtCWF0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICByZXR1cm4gTS54ODYuUl9CWCArIGRpc3BsYWNlbWVudDsKLQl9Ci0JSEFMVF9TWVMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgIC8qIFNIT1VMRCBOT1QgSEFQUEVOICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotcm0JLSBSTSB2YWx1ZSB0byBkZWNvZGUKLQotUkVUVVJOUzoKLU9mZnNldCBpbiBtZW1vcnkgZm9yIHRoZSBhZGRyZXNzIGRlY29kaW5nCi0KLVJFTUFSS1M6Ci1SZXR1cm4gdGhlIG9mZnNldCBnaXZlbiBieSBtb2Q9MTAgYWRkcmVzc2luZy4gIEFsc28gZW5hYmxlcyB0aGUKLWRlY29kaW5nIG9mIGluc3RydWN0aW9ucy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bnNpZ25lZCBkZWNvZGVfcm0xMF9hZGRyZXNzKAotCWludCBybSkKLXsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0FERFIpCi0gICAgewotCWludCBkaXNwbGFjZW1lbnQgPSAoczMyKWZldGNoX2xvbmdfaW1tKCk7Ci0Jc3dpdGNoIChybSkKLQl7Ci0JY2FzZSAwOgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbRUFYfSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIHJldHVybiBNLng4Ni5SX0VBWCArIGRpc3BsYWNlbWVudDsKLQljYXNlIDE6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtFQ1hdIiwgZGlzcGxhY2VtZW50KTsKLQkgICAgcmV0dXJuIE0ueDg2LlJfRUNYICsgZGlzcGxhY2VtZW50OwotCWNhc2UgMjoKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VEWF0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICByZXR1cm4gTS54ODYuUl9FRFggKyBkaXNwbGFjZW1lbnQ7Ci0JY2FzZSAzOgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbRUJYXSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIHJldHVybiBNLng4Ni5SX0VCWCArIGRpc3BsYWNlbWVudDsKLQljYXNlIDQ6Ci0JICAgIHByaW50aygiVW5zdXBwb3J0ZWQgU0lCIGFkZHJlc3NpbmcgbW9kZVxuIik7Ci0JICAgIEhBTFRfU1lTKCk7Ci0JICAgIHJldHVybiAwOwotCWNhc2UgNToKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VCUF0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICByZXR1cm4gTS54ODYuUl9FQlAgKyBkaXNwbGFjZW1lbnQ7Ci0JY2FzZSA2OgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbRVNJXSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIHJldHVybiBNLng4Ni5SX0VTSSArIGRpc3BsYWNlbWVudDsKLQljYXNlIDc6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtFREldIiwgZGlzcGxhY2VtZW50KTsKLQkgICAgcmV0dXJuIE0ueDg2LlJfRURJICsgZGlzcGxhY2VtZW50OwotCX0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlpbnQgZGlzcGxhY2VtZW50ID0gKHMxNilmZXRjaF93b3JkX2ltbSgpOwotCXN3aXRjaCAocm0pIHsKLQljYXNlIDA6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtCWCtTSV0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICByZXR1cm4gKE0ueDg2LlJfQlggKyBNLng4Ni5SX1NJICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKLQljYXNlIDE6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtCWCtESV0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICByZXR1cm4gKE0ueDg2LlJfQlggKyBNLng4Ni5SX0RJICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKLQljYXNlIDI6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtCUCtTSV0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHX0RTX1NTOwotCSAgICByZXR1cm4gKE0ueDg2LlJfQlAgKyBNLng4Ni5SX1NJICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKLQljYXNlIDM6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtCUCtESV0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHX0RTX1NTOwotCSAgICByZXR1cm4gKE0ueDg2LlJfQlAgKyBNLng4Ni5SX0RJICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKLQljYXNlIDQ6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtTSV0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICByZXR1cm4gKE0ueDg2LlJfU0kgKyBkaXNwbGFjZW1lbnQpICYgMHhmZmZmOwotCWNhc2UgNToKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkW0RJXSIsIGRpc3BsYWNlbWVudCk7Ci0JICAgIHJldHVybiAoTS54ODYuUl9ESSArIGRpc3BsYWNlbWVudCkgJiAweGZmZmY7Ci0JY2FzZSA2OgotCSAgICBERUNPREVfUFJJTlRGMigiJWRbQlBdIiwgZGlzcGxhY2VtZW50KTsKLQkgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR19EU19TUzsKLQkgICAgcmV0dXJuIChNLng4Ni5SX0JQICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKLQljYXNlIDc6Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFtCWF0iLCBkaXNwbGFjZW1lbnQpOwotCSAgICByZXR1cm4gKE0ueDg2LlJfQlggKyBkaXNwbGFjZW1lbnQpICYgMHhmZmZmOwotCX0KLSAgICB9Ci0gICAgSEFMVF9TWVMoKTsKLSAgICByZXR1cm4gMDsKLSAgICAvKk5PVFJFQUNIRUQgKi8KLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9mcHUuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9mcHUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y3YzM0NS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvZnB1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSoJCQkJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotKgotKiAgICAgICAgICAgIAlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qIAkJCQkgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKLSogCQkJCQkgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOgkJQU5TSSBDCi0qIEVudmlyb25tZW50OglBbnkKLSogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKLSoKLSogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvZGUgdG8gaW1wbGVtZW50IHRoZSBkZWNvZGluZyBhbmQKLSogICAgICAgICAgICAgICBlbXVsYXRpb24gb2YgdGhlIEZQVSBpbnN0cnVjdGlvbnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAieDg2ZW11L3g4NmVtdWkuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogb3Bjb2RlPTB4ZDggKi8KLXZvaWQgeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kOCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJFU0MgRDhcbiIpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFJfTk9fVFJBQ0UoKTsKLX0KLQotI2lmZGVmIERFQlVHCi0KLXN0YXRpYyBjaGFyICp4ODZlbXVfZnB1X29wX2Q5X3RhYltdID0gewotICAgICJGTERcdERXT1JEIFBUUiAiLCAiRVNDX0Q5XHQiLCAiRlNUXHREV09SRCBQVFIgIiwgIkZTVFBcdERXT1JEIFBUUiAiLAotICAgICJGTERFTlZcdCIsICJGTERDV1x0IiwgIkZTVEVOVlx0IiwgIkZTVENXXHQiLAotCi0gICAgIkZMRFx0RFdPUkQgUFRSICIsICJFU0NfRDlcdCIsICJGU1RcdERXT1JEIFBUUiAiLCAiRlNUUFx0RFdPUkQgUFRSICIsCi0gICAgIkZMREVOVlx0IiwgIkZMRENXXHQiLCAiRlNURU5WXHQiLCAiRlNUQ1dcdCIsCi0KLSAgICAiRkxEXHREV09SRCBQVFIgIiwgIkVTQ19EOVx0IiwgIkZTVFx0RFdPUkQgUFRSICIsICJGU1RQXHREV09SRCBQVFIgIiwKLSAgICAiRkxERU5WXHQiLCAiRkxEQ1dcdCIsICJGU1RFTlZcdCIsICJGU1RDV1x0IiwKLX07Ci0KLXN0YXRpYyBjaGFyICp4ODZlbXVfZnB1X29wX2Q5X3RhYjFbXSA9IHsKLSAgICAiRkxEXHQiLCAiRkxEXHQiLCAiRkxEXHQiLCAiRkxEXHQiLAotICAgICJGTERcdCIsICJGTERcdCIsICJGTERcdCIsICJGTERcdCIsCi0KLSAgICAiRlhDSFx0IiwgIkZYQ0hcdCIsICJGWENIXHQiLCAiRlhDSFx0IiwKLSAgICAiRlhDSFx0IiwgIkZYQ0hcdCIsICJGWENIXHQiLCAiRlhDSFx0IiwKLQotICAgICJGTk9QIiwgIkVTQ19EOSIsICJFU0NfRDkiLCAiRVNDX0Q5IiwKLSAgICAiRVNDX0Q5IiwgIkVTQ19EOSIsICJFU0NfRDkiLCAiRVNDX0Q5IiwKLQotICAgICJGU1RQXHQiLCAiRlNUUFx0IiwgIkZTVFBcdCIsICJGU1RQXHQiLAotICAgICJGU1RQXHQiLCAiRlNUUFx0IiwgIkZTVFBcdCIsICJGU1RQXHQiLAotCi0gICAgIkZDSFMiLCAiRkFCUyIsICJFU0NfRDkiLCAiRVNDX0Q5IiwKLSAgICAiRlRTVCIsICJGWEFNIiwgIkVTQ19EOSIsICJFU0NfRDkiLAotCi0gICAgIkZMRDEiLCAiRkxETDJUIiwgIkZMREwyRSIsICJGTERQSSIsCi0gICAgIkZMRExHMiIsICJGTERMTjIiLCAiRkxEWiIsICJFU0NfRDkiLAotCi0gICAgIkYyWE0xIiwgIkZZTDJYIiwgIkZQVEFOIiwgIkZQQVRBTiIsCi0gICAgIkZYVFJBQ1QiLCAiRVNDX0Q5IiwgIkZERUNTVFAiLCAiRklOQ1NUUCIsCi0KLSAgICAiRlBSRU0iLCAiRllMMlhQMSIsICJGU1FSVCIsICJFU0NfRDkiLAotICAgICJGUk5ESU5UIiwgIkZTQ0FMRSIsICJFU0NfRDkiLCAiRVNDX0Q5IiwKLX07Ci0KLSNlbmRpZiAvKiBERUJVRyAqLwotCi0vKiBvcGNvZGU9MHhkOSAqLwotdm9pZCB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2Q5KHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0JdWludCBkZXN0b2Zmc2V0OwotICAgIHU4IHN0a2VsZW07Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0jaWZkZWYgREVCVUcKLSAgICBpZiAobW9kICE9IDMpIHsKLQlERUNPREVfUFJJTlRJTlNUUjMyKHg4NmVtdV9mcHVfb3BfZDlfdGFiLCBtb2QsIHJoLCBybCk7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKHg4NmVtdV9mcHVfb3BfZDlfdGFiMVsocmggPDwgMykgKyBybF0pOwotICAgIH0KLSNlbmRpZgotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgICBjYXNlIDA6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDE6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDI6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JCXN0a2VsZW0gPSAodTgpcmw7Ci0JCWlmIChyaCA8IDQpIHsKLQkJCQlERUNPREVfUFJJTlRGMigiU1QoJWQpXG4iLCBzdGtlbGVtKTsKLQkJfSBlbHNlIHsKLQkJCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQl9Ci0JYnJlYWs7Ci0gICAgfQotI2lmZGVmIFg4NkVNVV9GUFVfUFJFU0VOVAotICAgIC8qIGV4ZWN1dGUgKi8KLSAgICBzd2l0Y2ggKG1vZCkgewotICAgICAgY2FzZSAzOgotCXN3aXRjaCAocmgpIHsKLQkgIGNhc2UgMDoKLQkgICAgeDg2ZW11X2ZwdV9SX2ZsZChYODZFTVVfRlBVX1NUS1RPUCwgc3RrZWxlbSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAxOgotCSAgICB4ODZlbXVfZnB1X1JfZnhjaChYODZFTVVfRlBVX1NUS1RPUCwgc3RrZWxlbSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAyOgotCSAgICBzd2l0Y2ggKHJsKSB7Ci0JICAgICAgY2FzZSAwOgotCQl4ODZlbXVfZnB1X1Jfbm9wKCk7Ci0JCWJyZWFrOwotCSAgICAgIGRlZmF1bHQ6Ci0JCXg4NmVtdV9mcHVfaWxsZWdhbCgpOwotCQlicmVhazsKLQkgICAgfQotCSAgY2FzZSAzOgotCSAgICB4ODZlbXVfZnB1X1JfZnN0cChYODZFTVVfRlBVX1NUS1RPUCwgc3RrZWxlbSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA0OgotCSAgICBzd2l0Y2ggKHJsKSB7Ci0JICAgIGNhc2UgMDoKLQkJeDg2ZW11X2ZwdV9SX2ZjaHMoWDg2RU1VX0ZQVV9TVEtUT1ApOwotCQlicmVhazsKLQkgICAgY2FzZSAxOgotCQl4ODZlbXVfZnB1X1JfZmFicyhYODZFTVVfRlBVX1NUS1RPUCk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDQ6Ci0JCXg4NmVtdV9mcHVfUl9mdHN0KFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgNToKLQkJeDg2ZW11X2ZwdV9SX2Z4YW0oWDg2RU1VX0ZQVV9TVEtUT1ApOwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJLyogMiwzLDYsNyAqLwotCQl4ODZlbXVfZnB1X2lsbGVnYWwoKTsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgNToKLQkgICAgc3dpdGNoIChybCkgewotCSAgICAgIGNhc2UgMDoKLQkJeDg2ZW11X2ZwdV9SX2ZsZDEoWDg2RU1VX0ZQVV9TVEtUT1ApOwotCQlicmVhazsKLQkgICAgICBjYXNlIDE6Ci0JCXg4NmVtdV9mcHVfUl9mbGRsMnQoWDg2RU1VX0ZQVV9TVEtUT1ApOwotCQlicmVhazsKLQkgICAgICBjYXNlIDI6Ci0JCXg4NmVtdV9mcHVfUl9mbGRsMmUoWDg2RU1VX0ZQVV9TVEtUT1ApOwotCQlicmVhazsKLQkgICAgICBjYXNlIDM6Ci0JCXg4NmVtdV9mcHVfUl9mbGRwaShYODZFTVVfRlBVX1NUS1RPUCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgNDoKLQkJeDg2ZW11X2ZwdV9SX2ZsZGxnMihYODZFTVVfRlBVX1NUS1RPUCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgNToKLQkJeDg2ZW11X2ZwdV9SX2ZsZGxuMihYODZFTVVfRlBVX1NUS1RPUCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgNjoKLQkJeDg2ZW11X2ZwdV9SX2ZsZHooWDg2RU1VX0ZQVV9TVEtUT1ApOwotCQlicmVhazsKLQkgICAgICBkZWZhdWx0OgotCQkvKiA3ICovCi0JCXg4NmVtdV9mcHVfaWxsZWdhbCgpOwotCQlicmVhazsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgY2FzZSA2OgotCSAgICBzd2l0Y2ggKHJsKSB7Ci0JICAgICAgY2FzZSAwOgotCQl4ODZlbXVfZnB1X1JfZjJ4bTEoWDg2RU1VX0ZQVV9TVEtUT1ApOwotCQlicmVhazsKLQkgICAgICBjYXNlIDE6Ci0JCXg4NmVtdV9mcHVfUl9meWwyeChYODZFTVVfRlBVX1NUS1RPUCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMjoKLQkJeDg2ZW11X2ZwdV9SX2ZwdGFuKFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAzOgotCQl4ODZlbXVfZnB1X1JfZnBhdGFuKFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSA0OgotCQl4ODZlbXVfZnB1X1JfZnh0cmFjdChYODZFTVVfRlBVX1NUS1RPUCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgNToKLQkJeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgNjoKLQkJeDg2ZW11X2ZwdV9SX2RlY3N0cCgpOwotCQlicmVhazsKLQkgICAgICBjYXNlIDc6Ci0JCXg4NmVtdV9mcHVfUl9pbmNzdHAoKTsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgNzoKLQkgICAgc3dpdGNoIChybCkgewotCSAgICAgIGNhc2UgMDoKLQkJeDg2ZW11X2ZwdV9SX2ZwcmVtKFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAxOgotCQl4ODZlbXVfZnB1X1JfZnlsMnhwMShYODZFTVVfRlBVX1NUS1RPUCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMjoKLQkJeDg2ZW11X2ZwdV9SX2ZzcXJ0KFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAzOgotCQl4ODZlbXVfZnB1X2lsbGVnYWwoKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSA0OgotCQl4ODZlbXVfZnB1X1JfZnJuZGludChYODZFTVVfRlBVX1NUS1RPUCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgNToKLQkJeDg2ZW11X2ZwdV9SX2ZzY2FsZShYODZFTVVfRlBVX1NUS1RPUCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgNjoKLQkgICAgICBjYXNlIDc6Ci0JICAgICAgZGVmYXVsdDoKLQkJeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICBkZWZhdWx0OgotCSAgICBzd2l0Y2ggKHJoKSB7Ci0JICAgICAgY2FzZSAwOgotCQl4ODZlbXVfZnB1X01fZmxkKFg4NkVNVV9GUFVfRkxPQVQsIGRlc3RvZmZzZXQpOwotCQlicmVhazsKLQkgICAgICBjYXNlIDE6Ci0JCXg4NmVtdV9mcHVfaWxsZWdhbCgpOwotCQlicmVhazsKLQkgICAgICBjYXNlIDI6Ci0JCXg4NmVtdV9mcHVfTV9mc3QoWDg2RU1VX0ZQVV9GTE9BVCwgZGVzdG9mZnNldCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMzoKLQkJeDg2ZW11X2ZwdV9NX2ZzdHAoWDg2RU1VX0ZQVV9GTE9BVCwgZGVzdG9mZnNldCk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgNDoKLQkJeDg2ZW11X2ZwdV9NX2ZsZGVudihYODZFTVVfRlBVX1dPUkQsIGRlc3RvZmZzZXQpOwotCQlicmVhazsKLQkgICAgICBjYXNlIDU6Ci0JCXg4NmVtdV9mcHVfTV9mbGRjdyhYODZFTVVfRlBVX1dPUkQsIGRlc3RvZmZzZXQpOwotCQlicmVhazsKLQkgICAgICBjYXNlIDY6Ci0JCXg4NmVtdV9mcHVfTV9mc3RlbnYoWDg2RU1VX0ZQVV9XT1JELCBkZXN0b2Zmc2V0KTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSA3OgotCQl4ODZlbXVfZnB1X01fZnN0Y3coWDg2RU1VX0ZQVV9XT1JELCBkZXN0b2Zmc2V0KTsKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotI2VuZGlmIC8qIFg4NkVNVV9GUFVfUFJFU0VOVCAqLwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFJfTk9fVFJBQ0UoKTsKLX0KLQotI2lmZGVmIERFQlVHCi0KLWNoYXIgKng4NmVtdV9mcHVfb3BfZGFfdGFiW10gPSB7Ci0gICAgIkZJQUREXHREV09SRCBQVFIgIiwgIkZJTVVMXHREV09SRCBQVFIgIiwgIkZJQ09NXHREV09SRCBQVFIgIiwKLSAgICAiRklDT01QXHREV09SRCBQVFIgIiwKLSAgICAiRklTVUJcdERXT1JEIFBUUiAiLCAiRklTVUJSXHREV09SRCBQVFIgIiwgIkZJRElWXHREV09SRCBQVFIgIiwKLSAgICAiRklESVZSXHREV09SRCBQVFIgIiwKLQotICAgICJGSUFERFx0RFdPUkQgUFRSICIsICJGSU1VTFx0RFdPUkQgUFRSICIsICJGSUNPTVx0RFdPUkQgUFRSICIsCi0gICAgIkZJQ09NUFx0RFdPUkQgUFRSICIsCi0gICAgIkZJU1VCXHREV09SRCBQVFIgIiwgIkZJU1VCUlx0RFdPUkQgUFRSICIsICJGSURJVlx0RFdPUkQgUFRSICIsCi0gICAgIkZJRElWUlx0RFdPUkQgUFRSICIsCi0KLSAgICAiRklBRERcdERXT1JEIFBUUiAiLCAiRklNVUxcdERXT1JEIFBUUiAiLCAiRklDT01cdERXT1JEIFBUUiAiLAotICAgICJGSUNPTVBcdERXT1JEIFBUUiAiLAotICAgICJGSVNVQlx0RFdPUkQgUFRSICIsICJGSVNVQlJcdERXT1JEIFBUUiAiLCAiRklESVZcdERXT1JEIFBUUiAiLAotICAgICJGSURJVlJcdERXT1JEIFBUUiAiLAotCi0gICAgIkVTQ19EQSAiLCAiRVNDX0RBICIsICJFU0NfREEgIiwgIkVTQ19EQSAiLAotICAgICJFU0NfREEgICAgICIsICJFU0NfREEgIiwgIkVTQ19EQSAgICIsICJFU0NfREEgIiwKLX07Ci0KLSNlbmRpZiAvKiBERUJVRyAqLwotCi0vKiBvcGNvZGU9MHhkYSAqLwotdm9pZCB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RhKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0JdWludCBkZXN0b2Zmc2V0OwotICAgIHU4IHN0a2VsZW07Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgREVDT0RFX1BSSU5USU5TVFIzMih4ODZlbXVfZnB1X29wX2RhX3RhYiwgbW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgICBjYXNlIDA6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDE6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDI6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDM6ICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCQlzdGtlbGVtID0gKHU4KXJsOwotCURFQ09ERV9QUklOVEYyKCJcdFNUKCVkKSxTVFxuIiwgc3RrZWxlbSk7Ci0JYnJlYWs7Ci0gICAgfQotI2lmZGVmIFg4NkVNVV9GUFVfUFJFU0VOVAotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgICBjYXNlIDM6Ci0JeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCXN3aXRjaCAocmgpIHsKLQkgIGNhc2UgMDoKLQkgICAgeDg2ZW11X2ZwdV9NX2lhZGQoWDg2RU1VX0ZQVV9TSE9SVCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAxOgotCSAgICB4ODZlbXVfZnB1X01faW11bChYODZFTVVfRlBVX1NIT1JULCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDI6Ci0JICAgIHg4NmVtdV9mcHVfTV9pY29tKFg4NkVNVV9GUFVfU0hPUlQsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMzoKLQkgICAgeDg2ZW11X2ZwdV9NX2ljb21wKFg4NkVNVV9GUFVfU0hPUlQsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgNDoKLQkgICAgeDg2ZW11X2ZwdV9NX2lzdWIoWDg2RU1VX0ZQVV9TSE9SVCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA1OgotCSAgICB4ODZlbXVfZnB1X01faXN1YnIoWDg2RU1VX0ZQVV9TSE9SVCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA2OgotCSAgICB4ODZlbXVfZnB1X01faWRpdihYODZFTVVfRlBVX1NIT1JULCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDc6Ci0JICAgIHg4NmVtdV9mcHVfTV9pZGl2cihYODZFTVVfRlBVX1NIT1JULCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLSNlbmRpZgotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFJfTk9fVFJBQ0UoKTsKLX0KLQotI2lmZGVmIERFQlVHCi0KLWNoYXIgKng4NmVtdV9mcHVfb3BfZGJfdGFiW10gPSB7Ci0gICAgIkZJTERcdERXT1JEIFBUUiAiLCAiRVNDX0RCXHQxOSIsICJGSVNUXHREV09SRCBQVFIgIiwgIkZJU1RQXHREV09SRCBQVFIgIiwKLSAgICAiRVNDX0RCXHQxQyIsICJGTERcdFRCWVRFIFBUUiAiLCAiRVNDX0RCXHQxRSIsICJGU1RQXHRUQllURSBQVFIgIiwKLQotICAgICJGSUxEXHREV09SRCBQVFIgIiwgIkVTQ19EQlx0MTkiLCAiRklTVFx0RFdPUkQgUFRSICIsICJGSVNUUFx0RFdPUkQgUFRSICIsCi0gICAgIkVTQ19EQlx0MUMiLCAiRkxEXHRUQllURSBQVFIgIiwgIkVTQ19EQlx0MUUiLCAiRlNUUFx0VEJZVEUgUFRSICIsCi0KLSAgICAiRklMRFx0RFdPUkQgUFRSICIsICJFU0NfREJcdDE5IiwgIkZJU1RcdERXT1JEIFBUUiAiLCAiRklTVFBcdERXT1JEIFBUUiAiLAotICAgICJFU0NfREJcdDFDIiwgIkZMRFx0VEJZVEUgUFRSICIsICJFU0NfREJcdDFFIiwgIkZTVFBcdFRCWVRFIFBUUiAiLAotfTsKLQotI2VuZGlmIC8qIERFQlVHICovCi0KLS8qIG9wY29kZT0weGRiICovCi12b2lkIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZGIodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLQl1aW50IGRlc3RvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0jaWZkZWYgREVCVUcKLSAgICBpZiAobW9kICE9IDMpIHsKLQlERUNPREVfUFJJTlRJTlNUUjMyKHg4NmVtdV9mcHVfb3BfZGJfdGFiLCBtb2QsIHJoLCBybCk7Ci0gICAgfSBlbHNlIGlmIChyaCA9PSA0KSB7ICAgICAgIC8qID09PSAxMSAxMCAwIG5ubiAqLwotCXN3aXRjaCAocmwpIHsKLQkgIGNhc2UgMDoKLQkgICAgREVDT0RFX1BSSU5URigiRkVOSVxuIik7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAxOgotCSAgICBERUNPREVfUFJJTlRGKCJGRElTSVxuIik7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAyOgotCSAgICBERUNPREVfUFJJTlRGKCJGQ0xFWFxuIik7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAzOgotCSAgICBERUNPREVfUFJJTlRGKCJGSU5JVFxuIik7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYyKCJFU0NfREIgJTB4XG4iLCAobW9kIDw8IDYpICsgKHJoIDw8IDMpICsgKHJsKSk7Ci0gICAgfQotI2VuZGlmIC8qIERFQlVHICovCi0gICAgc3dpdGNoIChtb2QpIHsKLSAgICAgIGNhc2UgMDoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDE6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCWJyZWFrOwotICAgICAgY2FzZSAyOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlicmVhazsKLSAgICB9Ci0jaWZkZWYgWDg2RU1VX0ZQVV9QUkVTRU5UCi0gICAgLyogZXhlY3V0ZSAqLwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgICBjYXNlIDM6Ci0Jc3dpdGNoIChyaCkgewotCSAgY2FzZSA0OgotCSAgICBzd2l0Y2ggKHJsKSB7Ci0JICAgICAgY2FzZSAwOgotCQl4ODZlbXVfZnB1X1JfZmVuaSgpOwotCQlicmVhazsKLQkgICAgICBjYXNlIDE6Ci0JCXg4NmVtdV9mcHVfUl9mZGlzaSgpOwotCQlicmVhazsKLQkgICAgICBjYXNlIDI6Ci0JCXg4NmVtdV9mcHVfUl9mY2xleCgpOwotCQlicmVhazsKLQkgICAgICBjYXNlIDM6Ci0JCXg4NmVtdV9mcHVfUl9maW5pdCgpOwotCQlicmVhazsKLQkgICAgICBkZWZhdWx0OgotCQl4ODZlbXVfZnB1X2lsbGVnYWwoKTsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICB4ODZlbXVfZnB1X2lsbGVnYWwoKTsKLQkgICAgYnJlYWs7Ci0JfQotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlzd2l0Y2ggKHJoKSB7Ci0JICBjYXNlIDA6Ci0JICAgIHg4NmVtdV9mcHVfTV9maWxkKFg4NkVNVV9GUFVfU0hPUlQsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMToKLQkgICAgeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAyOgotCSAgICB4ODZlbXVfZnB1X01fZmlzdChYODZFTVVfRlBVX1NIT1JULCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDM6Ci0JICAgIHg4NmVtdV9mcHVfTV9maXN0cChYODZFTVVfRlBVX1NIT1JULCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDQ6Ci0JICAgIHg4NmVtdV9mcHVfaWxsZWdhbCgpOwotCSAgICBicmVhazsKLQkgIGNhc2UgNToKLQkgICAgeDg2ZW11X2ZwdV9NX2ZsZChYODZFTVVfRlBVX0xEQkwsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkJICAgICAgY2FzZSA2OgotCSAgICB4ODZlbXVfZnB1X2lsbGVnYWwoKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDc6Ci0JICAgIHg4NmVtdV9mcHVfTV9mc3RwKFg4NkVNVV9GUFVfTERCTCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0jZW5kaWYKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSX05PX1RSQUNFKCk7Ci19Ci0KLSNpZmRlZiBERUJVRwotY2hhciAqeDg2ZW11X2ZwdV9vcF9kY190YWJbXSA9IHsKLSAgICAiRkFERFx0UVdPUkQgUFRSICIsICJGTVVMXHRRV09SRCBQVFIgIiwgIkZDT01cdFFXT1JEIFBUUiAiLAotICAgICJGQ09NUFx0UVdPUkQgUFRSICIsCi0gICAgIkZTVUJcdFFXT1JEIFBUUiAiLCAiRlNVQlJcdFFXT1JEIFBUUiAiLCAiRkRJVlx0UVdPUkQgUFRSICIsCi0gICAgIkZESVZSXHRRV09SRCBQVFIgIiwKLQotICAgICJGQUREXHRRV09SRCBQVFIgIiwgIkZNVUxcdFFXT1JEIFBUUiAiLCAiRkNPTVx0UVdPUkQgUFRSICIsCi0gICAgIkZDT01QXHRRV09SRCBQVFIgIiwKLSAgICAiRlNVQlx0UVdPUkQgUFRSICIsICJGU1VCUlx0UVdPUkQgUFRSICIsICJGRElWXHRRV09SRCBQVFIgIiwKLSAgICAiRkRJVlJcdFFXT1JEIFBUUiAiLAotCi0gICAgIkZBRERcdFFXT1JEIFBUUiAiLCAiRk1VTFx0UVdPUkQgUFRSICIsICJGQ09NXHRRV09SRCBQVFIgIiwKLSAgICAiRkNPTVBcdFFXT1JEIFBUUiAiLAotICAgICJGU1VCXHRRV09SRCBQVFIgIiwgIkZTVUJSXHRRV09SRCBQVFIgIiwgIkZESVZcdFFXT1JEIFBUUiAiLAotICAgICJGRElWUlx0UVdPUkQgUFRSICIsCi0KLSAgICAiRkFERFx0IiwgIkZNVUxcdCIsICJGQ09NXHQiLCAiRkNPTVBcdCIsCi0gICAgIkZTVUJSXHQiLCAiRlNVQlx0IiwgIkZESVZSXHQiLCAiRkRJVlx0IiwKLX07Ci0jZW5kaWYgLyogREVCVUcgKi8KLQotLyogb3Bjb2RlPTB4ZGMgKi8KLXZvaWQgeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kYyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotCXVpbnQgZGVzdG9mZnNldDsKLSAgICB1OCBzdGtlbGVtOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIERFQ09ERV9QUklOVElOU1RSMzIoeDg2ZW11X2ZwdV9vcF9kY190YWIsIG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgICAgY2FzZSAwOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCWJyZWFrOwotICAgICAgY2FzZSAxOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCWJyZWFrOwotICAgICAgY2FzZSAyOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCWJyZWFrOwotICAgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCQlzdGtlbGVtID0gKHU4KXJsOwotCURFQ09ERV9QUklOVEYyKCJcdFNUKCVkKSxTVFxuIiwgc3RrZWxlbSk7Ci0JYnJlYWs7Ci0gICAgfQotI2lmZGVmIFg4NkVNVV9GUFVfUFJFU0VOVAotICAgIC8qIGV4ZWN1dGUgKi8KLSAgICBzd2l0Y2ggKG1vZCkgewotICAgICAgY2FzZSAzOgotCXN3aXRjaCAocmgpIHsKLQkgIGNhc2UgMDoKLQkgICAgeDg2ZW11X2ZwdV9SX2ZhZGQoc3RrZWxlbSwgWDg2RU1VX0ZQVV9TVEtUT1ApOwotCSAgICBicmVhazsKLQkgIGNhc2UgMToKLQkgICAgeDg2ZW11X2ZwdV9SX2ZtdWwoc3RrZWxlbSwgWDg2RU1VX0ZQVV9TVEtUT1ApOwotCSAgICBicmVhazsKLQkgIGNhc2UgMjoKLQkgICAgeDg2ZW11X2ZwdV9SX2Zjb20oc3RrZWxlbSwgWDg2RU1VX0ZQVV9TVEtUT1ApOwotCSAgICBicmVhazsKLQkgIGNhc2UgMzoKLQkgICAgeDg2ZW11X2ZwdV9SX2Zjb21wKHN0a2VsZW0sIFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDQ6Ci0JICAgIHg4NmVtdV9mcHVfUl9mc3VicihzdGtlbGVtLCBYODZFTVVfRlBVX1NUS1RPUCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA1OgotCSAgICB4ODZlbXVfZnB1X1JfZnN1YihzdGtlbGVtLCBYODZFTVVfRlBVX1NUS1RPUCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA2OgotCSAgICB4ODZlbXVfZnB1X1JfZmRpdnIoc3RrZWxlbSwgWDg2RU1VX0ZQVV9TVEtUT1ApOwotCSAgICBicmVhazsKLQkgIGNhc2UgNzoKLQkgICAgeDg2ZW11X2ZwdV9SX2ZkaXYoc3RrZWxlbSwgWDg2RU1VX0ZQVV9TVEtUT1ApOwotCSAgICBicmVhazsKLQl9Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCXN3aXRjaCAocmgpIHsKLQkgIGNhc2UgMDoKLQkgICAgeDg2ZW11X2ZwdV9NX2ZhZGQoWDg2RU1VX0ZQVV9ET1VCTEUsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMToKLQkgICAgeDg2ZW11X2ZwdV9NX2ZtdWwoWDg2RU1VX0ZQVV9ET1VCTEUsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMjoKLQkgICAgeDg2ZW11X2ZwdV9NX2Zjb20oWDg2RU1VX0ZQVV9ET1VCTEUsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMzoKLQkgICAgeDg2ZW11X2ZwdV9NX2Zjb21wKFg4NkVNVV9GUFVfRE9VQkxFLCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDQ6Ci0JICAgIHg4NmVtdV9mcHVfTV9mc3ViKFg4NkVNVV9GUFVfRE9VQkxFLCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDU6Ci0JICAgIHg4NmVtdV9mcHVfTV9mc3VicihYODZFTVVfRlBVX0RPVUJMRSwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA2OgotCSAgICB4ODZlbXVfZnB1X01fZmRpdihYODZFTVVfRlBVX0RPVUJMRSwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA3OgotCSAgICB4ODZlbXVfZnB1X01fZmRpdnIoWDg2RU1VX0ZQVV9ET1VCTEUsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotI2VuZGlmCi0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUl9OT19UUkFDRSgpOwotfQotCi0jaWZkZWYgREVCVUcKLQotc3RhdGljIGNoYXIgKng4NmVtdV9mcHVfb3BfZGRfdGFiW10gPSB7Ci0gICAgIkZMRFx0UVdPUkQgUFRSICIsICJFU0NfRERcdDI5LCIsICJGU1RcdFFXT1JEIFBUUiAiLCAiRlNUUFx0UVdPUkQgUFRSICIsCi0gICAgIkZSU1RPUlx0IiwgIkVTQ19ERFx0MkQsIiwgIkZTQVZFXHQiLCAiRlNUU1dcdCIsCi0KLSAgICAiRkxEXHRRV09SRCBQVFIgIiwgIkVTQ19ERFx0MjksIiwgIkZTVFx0UVdPUkQgUFRSICIsICJGU1RQXHRRV09SRCBQVFIgIiwKLSAgICAiRlJTVE9SXHQiLCAiRVNDX0REXHQyRCwiLCAiRlNBVkVcdCIsICJGU1RTV1x0IiwKLQotICAgICJGTERcdFFXT1JEIFBUUiAiLCAiRVNDX0REXHQyOSwiLCAiRlNUXHRRV09SRCBQVFIgIiwgIkZTVFBcdFFXT1JEIFBUUiAiLAotICAgICJGUlNUT1JcdCIsICJFU0NfRERcdDJELCIsICJGU0FWRVx0IiwgIkZTVFNXXHQiLAotCi0gICAgIkZGUkVFXHQiLCAiRlhDSFx0IiwgIkZTVFx0IiwgIkZTVFBcdCIsCi0gICAgIkVTQ19ERFx0MkMsIiwgIkVTQ19ERFx0MkQsIiwgIkVTQ19ERFx0MkUsIiwgIkVTQ19ERFx0MkYsIiwKLX07Ci0KLSNlbmRpZiAvKiBERUJVRyAqLwotCi0vKiBvcGNvZGU9MHhkZCAqLwotdm9pZCB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0JdWludCBkZXN0b2Zmc2V0OwotICAgIHU4IHN0a2VsZW07Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgREVDT0RFX1BSSU5USU5TVFIzMih4ODZlbXVfZnB1X29wX2RkX3RhYiwgbW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgICBjYXNlIDA6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDE6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDI6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JCXN0a2VsZW0gPSAodTgpcmw7Ci0JREVDT0RFX1BSSU5URjIoIlx0U1QoJWQpLFNUXG4iLCBzdGtlbGVtKTsKLQlicmVhazsKLSAgICB9Ci0jaWZkZWYgWDg2RU1VX0ZQVV9QUkVTRU5UCi0gICAgc3dpdGNoIChtb2QpIHsKLSAgICAgIGNhc2UgMzoKLQlzd2l0Y2ggKHJoKSB7Ci0JICBjYXNlIDA6Ci0JICAgIHg4NmVtdV9mcHVfUl9mZnJlZShzdGtlbGVtKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDE6Ci0JICAgIHg4NmVtdV9mcHVfUl9meGNoKHN0a2VsZW0pOwotCSAgICBicmVhazsKLQkgIGNhc2UgMjoKLQkgICAgeDg2ZW11X2ZwdV9SX2ZzdChzdGtlbGVtKTsgIC8qIHJlZ2lzdGVyIHZlcnNpb24gKi8KLQkgICAgYnJlYWs7Ci0JICBjYXNlIDM6Ci0JICAgIHg4NmVtdV9mcHVfUl9mc3RwKHN0a2VsZW0pOyAvKiByZWdpc3RlciB2ZXJzaW9uICovCi0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgeDg2ZW11X2ZwdV9pbGxlZ2FsKCk7Ci0JICAgIGJyZWFrOwotCX0KLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0Jc3dpdGNoIChyaCkgewotCSAgY2FzZSAwOgotCSAgICB4ODZlbXVfZnB1X01fZmxkKFg4NkVNVV9GUFVfRE9VQkxFLCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDE6Ci0JICAgIHg4NmVtdV9mcHVfaWxsZWdhbCgpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMjoKLQkgICAgeDg2ZW11X2ZwdV9NX2ZzdChYODZFTVVfRlBVX0RPVUJMRSwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAzOgotCSAgICB4ODZlbXVfZnB1X01fZnN0cChYODZFTVVfRlBVX0RPVUJMRSwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA0OgotCSAgICB4ODZlbXVfZnB1X01fZnJzdG9yKFg4NkVNVV9GUFVfV09SRCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA1OgotCSAgICB4ODZlbXVfZnB1X2lsbGVnYWwoKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDY6Ci0JICAgIHg4NmVtdV9mcHVfTV9mc2F2ZShYODZFTVVfRlBVX1dPUkQsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgNzoKLQkgICAgeDg2ZW11X2ZwdV9NX2ZzdHN3KFg4NkVNVV9GUFVfV09SRCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0jZW5kaWYKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSX05PX1RSQUNFKCk7Ci19Ci0KLSNpZmRlZiBERUJVRwotCi1zdGF0aWMgY2hhciAqeDg2ZW11X2ZwdV9vcF9kZV90YWJbXSA9Ci17Ci0gICAgIkZJQUREXHRXT1JEIFBUUiAiLCAiRklNVUxcdFdPUkQgUFRSICIsICJGSUNPTVx0V09SRCBQVFIgIiwKLSAgICAiRklDT01QXHRXT1JEIFBUUiAiLAotICAgICJGSVNVQlx0V09SRCBQVFIgIiwgIkZJU1VCUlx0V09SRCBQVFIgIiwgIkZJRElWXHRXT1JEIFBUUiAiLAotICAgICJGSURJVlJcdFdPUkQgUFRSICIsCi0KLSAgICAiRklBRERcdFdPUkQgUFRSICIsICJGSU1VTFx0V09SRCBQVFIgIiwgIkZJQ09NXHRXT1JEIFBUUiAiLAotICAgICJGSUNPTVBcdFdPUkQgUFRSICIsCi0gICAgIkZJU1VCXHRXT1JEIFBUUiAiLCAiRklTVUJSXHRXT1JEIFBUUiAiLCAiRklESVZcdFdPUkQgUFRSICIsCi0gICAgIkZJRElWUlx0V09SRCBQVFIgIiwKLQotICAgICJGSUFERFx0V09SRCBQVFIgIiwgIkZJTVVMXHRXT1JEIFBUUiAiLCAiRklDT01cdFdPUkQgUFRSICIsCi0gICAgIkZJQ09NUFx0V09SRCBQVFIgIiwKLSAgICAiRklTVUJcdFdPUkQgUFRSICIsICJGSVNVQlJcdFdPUkQgUFRSICIsICJGSURJVlx0V09SRCBQVFIgIiwKLSAgICAiRklESVZSXHRXT1JEIFBUUiAiLAotCi0gICAgIkZBRERQXHQiLCAiRk1VTFBcdCIsICJGQ09NUFx0IiwgIkZDT01QUFx0IiwKLSAgICAiRlNVQlJQXHQiLCAiRlNVQlBcdCIsICJGRElWUlBcdCIsICJGRElWUFx0IiwKLX07Ci0KLSNlbmRpZiAvKiBERUJVRyAqLwotCi0vKiBvcGNvZGU9MHhkZSAqLwotdm9pZCB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RlKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0JdWludCBkZXN0b2Zmc2V0OwotICAgIHU4IHN0a2VsZW07Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgREVDT0RFX1BSSU5USU5TVFIzMih4ODZlbXVfZnB1X29wX2RlX3RhYiwgbW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgICBjYXNlIDA6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDE6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDI6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JCXN0a2VsZW0gPSAodTgpcmw7Ci0JREVDT0RFX1BSSU5URjIoIlx0U1QoJWQpLFNUXG4iLCBzdGtlbGVtKTsKLQlicmVhazsKLSAgICB9Ci0jaWZkZWYgWDg2RU1VX0ZQVV9QUkVTRU5UCi0gICAgc3dpdGNoIChtb2QpIHsKLSAgICAgIGNhc2UgMzoKLQlzd2l0Y2ggKHJoKSB7Ci0JICBjYXNlIDA6Ci0JICAgIHg4NmVtdV9mcHVfUl9mYWRkcChzdGtlbGVtLCBYODZFTVVfRlBVX1NUS1RPUCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAxOgotCSAgICB4ODZlbXVfZnB1X1JfZm11bHAoc3RrZWxlbSwgWDg2RU1VX0ZQVV9TVEtUT1ApOwotCSAgICBicmVhazsKLQkgIGNhc2UgMjoKLQkgICAgeDg2ZW11X2ZwdV9SX2Zjb21wKHN0a2VsZW0sIFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDM6Ci0JICAgIGlmIChzdGtlbGVtID09IDEpCi0JICAgICAgeDg2ZW11X2ZwdV9SX2Zjb21wcChzdGtlbGVtLCBYODZFTVVfRlBVX1NUS1RPUCk7Ci0JICAgIGVsc2UKLQkgICAgICB4ODZlbXVfZnB1X2lsbGVnYWwoKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDQ6Ci0JICAgIHg4NmVtdV9mcHVfUl9mc3VicnAoc3RrZWxlbSwgWDg2RU1VX0ZQVV9TVEtUT1ApOwotCSAgICBicmVhazsKLQkgIGNhc2UgNToKLQkgICAgeDg2ZW11X2ZwdV9SX2ZzdWJwKHN0a2VsZW0sIFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDY6Ci0JICAgIHg4NmVtdV9mcHVfUl9mZGl2cnAoc3RrZWxlbSwgWDg2RU1VX0ZQVV9TVEtUT1ApOwotCSAgICBicmVhazsKLQkgIGNhc2UgNzoKLQkgICAgeDg2ZW11X2ZwdV9SX2ZkaXZwKHN0a2VsZW0sIFg4NkVNVV9GUFVfU1RLVE9QKTsKLQkgICAgYnJlYWs7Ci0JfQotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlzd2l0Y2ggKHJoKSB7Ci0JICBjYXNlIDA6Ci0JICAgIHg4NmVtdV9mcHVfTV9maWFkZChYODZFTVVfRlBVX1dPUkQsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMToKLQkgICAgeDg2ZW11X2ZwdV9NX2ZpbXVsKFg4NkVNVV9GUFVfV09SRCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAyOgotCSAgICB4ODZlbXVfZnB1X01fZmljb20oWDg2RU1VX0ZQVV9XT1JELCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDM6Ci0JICAgIHg4NmVtdV9mcHVfTV9maWNvbXAoWDg2RU1VX0ZQVV9XT1JELCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDQ6Ci0JICAgIHg4NmVtdV9mcHVfTV9maXN1YihYODZFTVVfRlBVX1dPUkQsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgNToKLQkgICAgeDg2ZW11X2ZwdV9NX2Zpc3VicihYODZFTVVfRlBVX1dPUkQsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgNjoKLQkgICAgeDg2ZW11X2ZwdV9NX2ZpZGl2KFg4NkVNVV9GUFVfV09SRCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA3OgotCSAgICB4ODZlbXVfZnB1X01fZmlkaXZyKFg4NkVNVV9GUFVfV09SRCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0jZW5kaWYKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSX05PX1RSQUNFKCk7Ci19Ci0KLSNpZmRlZiBERUJVRwotCi1zdGF0aWMgY2hhciAqeDg2ZW11X2ZwdV9vcF9kZl90YWJbXSA9IHsKLSAgICAvKiBtb2QgPT0gMDAgKi8KLSAgICAiRklMRFx0V09SRCBQVFIgIiwgIkVTQ19ERlx0MzlcbiIsICJGSVNUXHRXT1JEIFBUUiAiLCAiRklTVFBcdFdPUkQgUFRSICIsCi0gICAgIkZCTERcdFRCWVRFIFBUUiAiLCAiRklMRFx0UVdPUkQgUFRSICIsICJGQlNUUFx0VEJZVEUgUFRSICIsCi0gICAgIkZJU1RQXHRRV09SRCBQVFIgIiwKLQotICAgIC8qIG1vZCA9PSAwMSAqLwotICAgICJGSUxEXHRXT1JEIFBUUiAiLCAiRVNDX0RGXHQzOSAiLCAiRklTVFx0V09SRCBQVFIgIiwgIkZJU1RQXHRXT1JEIFBUUiAiLAotICAgICJGQkxEXHRUQllURSBQVFIgIiwgIkZJTERcdFFXT1JEIFBUUiAiLCAiRkJTVFBcdFRCWVRFIFBUUiAiLAotICAgICJGSVNUUFx0UVdPUkQgUFRSICIsCi0KLSAgICAvKiBtb2QgPT0gMTAgKi8KLSAgICAiRklMRFx0V09SRCBQVFIgIiwgIkVTQ19ERlx0MzkgIiwgIkZJU1RcdFdPUkQgUFRSICIsICJGSVNUUFx0V09SRCBQVFIgIiwKLSAgICAiRkJMRFx0VEJZVEUgUFRSICIsICJGSUxEXHRRV09SRCBQVFIgIiwgIkZCU1RQXHRUQllURSBQVFIgIiwKLSAgICAiRklTVFBcdFFXT1JEIFBUUiAiLAotCi0gICAgLyogbW9kID09IDExICovCi0gICAgIkZGUkVFXHQiLCAiRlhDSFx0IiwgIkZTVFx0IiwgIkZTVFBcdCIsCi0gICAgIkVTQ19ERlx0M0MsIiwgIkVTQ19ERlx0M0QsIiwgIkVTQ19ERlx0M0UsIiwgIkVTQ19ERlx0M0YsIgotfTsKLQotI2VuZGlmIC8qIERFQlVHICovCi0KLS8qIG9wY29kZT0weGRmICovCi12b2lkIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZGYodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLQl1aW50IGRlc3RvZmZzZXQ7Ci0gICAgdTggc3RrZWxlbTsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBERUNPREVfUFJJTlRJTlNUUjMyKHg4NmVtdV9mcHVfb3BfZGZfdGFiLCBtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICAgIGNhc2UgMDoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMToKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMjoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQkJc3RrZWxlbSA9ICh1OClybDsKLQlERUNPREVfUFJJTlRGMigiXHRTVCglZClcbiIsIHN0a2VsZW0pOwotCWJyZWFrOwotICAgIH0KLSNpZmRlZiBYODZFTVVfRlBVX1BSRVNFTlQKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgICAgY2FzZSAzOgotCXN3aXRjaCAocmgpIHsKLQkgIGNhc2UgMDoKLQkgICAgeDg2ZW11X2ZwdV9SX2ZmcmVlKHN0a2VsZW0pOwotCSAgICBicmVhazsKLQkgIGNhc2UgMToKLQkgICAgeDg2ZW11X2ZwdV9SX2Z4Y2goc3RrZWxlbSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAyOgotCSAgICB4ODZlbXVfZnB1X1JfZnN0KHN0a2VsZW0pOyAgLyogcmVnaXN0ZXIgdmVyc2lvbiAqLwotCSAgICBicmVhazsKLQkgIGNhc2UgMzoKLQkgICAgeDg2ZW11X2ZwdV9SX2ZzdHAoc3RrZWxlbSk7IC8qIHJlZ2lzdGVyIHZlcnNpb24gKi8KLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICB4ODZlbXVfZnB1X2lsbGVnYWwoKTsKLQkgICAgYnJlYWs7Ci0JfQotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlzd2l0Y2ggKHJoKSB7Ci0JICBjYXNlIDA6Ci0JICAgIHg4NmVtdV9mcHVfTV9maWxkKFg4NkVNVV9GUFVfV09SRCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAxOgotCSAgICB4ODZlbXVfZnB1X2lsbGVnYWwoKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDI6Ci0JICAgIHg4NmVtdV9mcHVfTV9maXN0KFg4NkVNVV9GUFVfV09SRCwgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAzOgotCSAgICB4ODZlbXVfZnB1X01fZmlzdHAoWDg2RU1VX0ZQVV9XT1JELCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDQ6Ci0JICAgIHg4NmVtdV9mcHVfTV9mYmxkKFg4NkVNVV9GUFVfQlNELCBkZXN0b2Zmc2V0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDU6Ci0JICAgIHg4NmVtdV9mcHVfTV9maWxkKFg4NkVNVV9GUFVfTE9ORywgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA2OgotCSAgICB4ODZlbXVfZnB1X01fZmJzdHAoWDg2RU1VX0ZQVV9CU0QsIGRlc3RvZmZzZXQpOwotCSAgICBicmVhazsKLQkgIGNhc2UgNzoKLQkgICAgeDg2ZW11X2ZwdV9NX2Zpc3RwKFg4NkVNVV9GUFVfTE9ORywgZGVzdG9mZnNldCk7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0jZW5kaWYKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSX05PX1RSQUNFKCk7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvbWFrZWZpbGUgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvbWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZTJlOWUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L21ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotIwotIyAgICAgICAgICAgIAlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCi0jICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0jICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci0jICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSMgIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKLSMgIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKLSMgIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCi0jICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgotIyAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSMKLSMgIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotIyAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotIyAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSMgIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKLSMgIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgotIyAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotIyAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIEdlbmVyaWMgbWFrZWZpbGUgZm9yIHRoZSB4ODZlbXUgbGlicmFyeS4gUmVxdWlyZXMKLSMgICAgICAgICAgICAgICB0aGUgU2NpVGVjaCBTb2Z0d2FyZSBtYWtlZmlsZSBkZWZpbml0aW9ucyBwYWNrYWdlIHRvIGJlCi0jICAgICAgICAgICAgICAgaW5zdGFsbGVkLCB3aGljaCB1c2VzIHRoZSBETUFLRSBtYWtlIHByb2dyYW0uCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0uSU1QT1JUIC5JR05PUkU6IERFQlVHCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIERlZmluZSB0aGUgbGlzdHMgb2Ygb2JqZWN0IGZpbGVzCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1PQkpFQ1RTCQkJPSBzeXMkTyBkZWNvZGUkTyBvcHMkTyBvcHMyJE8gcHJpbV9vcHMkTyBmcHUkTyBkZWJ1ZyRPCi1DRkxBR1MgICAgICAJKz0gLURTQ0lURUNICi0uSUYgJChERUJVRykKLUNGTEFHUwkJCSs9IC1EREVCVUcKLS5FTkRJRgotTElCQ0xFQU4gIAkJPSAqLmRsbCAqLmxpYiAqLmEKLUxJQkZJTEUgCQk9ICQoTFApeDg2ZW11JEwKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgU2FtcGxlIHRlc3QgcHJvZ3JhbXMKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWFsbDogJChMSUJGSUxFKQotCi12YWxpZGF0ZSRFOiB2YWxpZGF0ZSRPICQoTElCRklMRSkKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRGVmaW5lIHRoZSBsaXN0IG9mIG9iamVjdCBmaWxlcyB0byBjcmVhdGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBmb3IKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLURFUEVORF9PQkogICAgICA9ICB2YWxpZGF0ZSRPICQoT0JKRUNUUykKLQotLklOQ0xVREU6ICIkKFNDSVRFQ0gpL21ha2VkZWZzL2NvbW1vbi5tayIKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9tYWtlZmlsZS5jcm9zcyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9tYWtlZmlsZS5jcm9zcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJjZTlhOS4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvbWFrZWZpbGUuY3Jvc3MKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwkJCQkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0jCi0jICAgICAgICAgICAgCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSMgIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSMgIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSMgIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotIyAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotIyAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotIyAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSMgIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0jICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotIwotIyAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0jICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0jICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotIyAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotIyAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0jICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0jICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotIwotIyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIERlc2NyaXB0b246ICAgTGludXggc3BlY2lmaWMgbWFrZWZpbGUgZm9yIHRoZSB4ODZlbXUgbGlicmFyeS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUNDID0gJChDUk9TU19DT01QSUxFKWdjYwotQVIgPSAkKENST1NTX0NPTVBJTEUpYXIKLQotVEFSR0VUTElCID0gbGlieDg2ZW11LmEKLVRBUkdFVERFQlVHTElCID1saWJ4ODZlbXVkLmEKLQotT0JKUz1cCi1kZWNvZGUubyBcCi1mcHUubyBcCi1vcHMubyBcCi1vcHMyLm8gXAotcHJpbV9vcHMubyBcCi1zeXMubwotCi1ERUJVR09CSlM9ZGVidWcuZCBcCi0gICAgICAgICAgZGVjb2RlLmQgXAotCSAgZnB1LmQgXAotCSAgb3BzLmQgXAotCSAgb3BzMi5kIFwKLQkgIHByaW1fb3BzLmQgXAotCSAgc3lzLmQKLQotLlNVRkZJWEVTOiAuZAotCi1hbGw6ICQoVEFSR0VUTElCKSAkKFRBUkdFVERFQlVHTElCKQotCi0kKFRBUkdFVExJQik6ICQoT0JKUykKLQkkKEFSKSBydiAkKFRBUkdFVExJQikgJChPQkpTKQotCi0kKFRBUkdFVERFQlVHTElCKTogJChERUJVR09CSlMpCi0JJChBUikgcnYgJChUQVJHRVRERUJVR0xJQikgJChERUJVR09CSlMpCi0KLUlOQ1MgICA9IC1JLiAtSXg4NmVtdSAtSS4uLy4uL2luY2x1ZGUKLUNGTEFHUyA9IC1EX19EUklWRVJfXyAtREZPUkNFX1BPU1QgLURfQ0VYUE9SVD0gLUROT19MT05HX0xPTkcgLURwcmludGs9cHJpbnRmIC1mc2lnbmVkLWNoYXIgIC1mb21pdC1mcmFtZS1wb2ludGVyIC1mUElDIC1mZml4ZWQtcjE0IC1tZWFiaQotQ0RFQlVHRkxBR1MgPSAtRERFQlVHCi0KLS5jLm86Ci0JJChDQykgLWcgLU8yIC1XYWxsIC1jICQoQ0ZMQUdTKSAkKElOQ1MpICQqLmMKLQotLmMuZDoKLQkkKENDKSAtZyAtTzIgLVdhbGwgLWMgLW8kKi5kICQoQ0ZMQUdTKSAkKENERUJVR0ZMQUdTKSAkKElOQ1MpICQqLmMKLQotLmNwcC5vOgotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKElOQ1MpICQqLmNwcAotCi1jbGVhbjoKLQlybSAtZiAqLmEgKi5vICouZAotCi12YWxpZGF0ZToJdmFsaWRhdGUubyBsaWJ4ODZlbXUuYQotCSQoQ0MpIC1vIHZhbGlkYXRlIHZhbGlkYXRlLm8gLWx4ODZlbXUgLUwuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvbWFrZWZpbGUubGludXggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvbWFrZWZpbGUubGludXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NGI4OGQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L21ha2VmaWxlLmxpbnV4CisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotIwotIyAgICAgICAgICAgIAlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCi0jICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0jICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci0jICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSMgIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKLSMgIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKLSMgIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCi0jICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgotIyAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSMKLSMgIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotIyAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotIyAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSMgIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKLSMgIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgotIyAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotIyAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIExpbnV4IHNwZWNpZmljIG1ha2VmaWxlIGZvciB0aGUgeDg2ZW11IGxpYnJhcnkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1UQVJHRVRMSUIgPSBsaWJ4ODZlbXUuYQotVEFSR0VUREVCVUdMSUIgPWxpYng4NmVtdWQuYQotCi1PQkpTPVwKLWRlY29kZS5vIFwKLWZwdS5vIFwKLW9wcy5vIFwKLW9wczIubyBcCi1wcmltX29wcy5vIFwKLXByZWdzLm8gXAotc3lzLm8KLQotREVCVUdPQkpTPWRlYnVnLmQgXAotICAgICAgICAgIGRlY29kZS5kIFwKLQkgIGZwdS5kIFwKLQkgIG9wcy5kIFwKLQkgIG9wczIuZCBcCi0JICBwcmltX29wcy5kIFwKLQkgIHByZWdzLmQgXAotCSAgc3lzLmQKLQotLlNVRkZJWEVTOiAuZAotCi1hbGw6ICQoVEFSR0VUTElCKSAkKFRBUkdFVERFQlVHTElCKQotCi0kKFRBUkdFVExJQik6ICQoT0JKUykKLQlhciBydiAkKFRBUkdFVExJQikgJChPQkpTKQotCi0kKFRBUkdFVERFQlVHTElCKTogJChERUJVR09CSlMpCi0JYXIgcnYgJChUQVJHRVRERUJVR0xJQikgJChERUJVR09CSlMpCi0KLUlOQ1MgICA9IC1JLiAtSXg4NmVtdSAtSS4uLy4uL2luY2x1ZGUKLUNGTEFHUyA9IC1EX19EUklWRVJfXyAtREZPUkNFX1BPU1QgLURfQ0VYUE9SVD0gLUROT19MT05HX0xPTkcKLUNERUJVR0ZMQUdTID0gLURERUJVRwotCi0uYy5vOgotCWdjYyAtZyAtTyAtV2FsbCAtYyAkKENGTEFHUykgJChJTkNTKSAkKi5jCi0KLS5jLmQ6Ci0JZ2NjIC1nIC1PIC1XYWxsIC1jIC1vJCouZCAkKENGTEFHUykgJChDREVCVUdGTEFHUykgJChJTkNTKSAkKi5jCi0KLS5jcHAubzoKLQlnY2MgLWMgJChDRkxBR1MpICQoSU5DUykgJCouY3BwCi0KLWNsZWFuOgotCXJtIC1mICouYSAqLm8gKi5kCi0KLXZhbGlkYXRlOgl2YWxpZGF0ZS5vIGxpYng4NmVtdS5hCi0JZ2NjIC1vIHZhbGlkYXRlIHZhbGlkYXRlLm8gLWx4ODZlbXUgLUwuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvbWFrZWZpbGUudWJvb3QgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvbWFrZWZpbGUudWJvb3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmOWFlMWYuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L21ha2VmaWxlLnVib290CisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMJCQkJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotIwotIyAgICAgICAgICAgIAlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0jCi0jICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCi0jICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0jICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci0jICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSMgIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKLSMgIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKLSMgIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCi0jICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgotIyAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSMKLSMgIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotIyAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotIyAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSMgIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKLSMgIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgotIyAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotIyAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSMKLSMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBEZXNjcmlwdG9uOiAgIExpbnV4IHNwZWNpZmljIG1ha2VmaWxlIGZvciB0aGUgeDg2ZW11IGxpYnJhcnkuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQ0MgPSAkKENST1NTX0NPTVBJTEUpZ2NjCi1BUiA9ICQoQ1JPU1NfQ09NUElMRSlhcgotVEFSR0VUTElCID0gbGlieDg2ZW11LmEKLVRBUkdFVERFQlVHTElCID1saWJ4ODZlbXVkLmEKLQotT0JKUz1cCi1kZWNvZGUubyBcCi1mcHUubyBcCi1vcHMubyBcCi1vcHMyLm8gXAotcHJpbV9vcHMubyBcCi1zeXMubwotCi1ERUJVR09CSlM9ZGVidWcuZCBcCi0gICAgICAgICAgZGVjb2RlLmQgXAotCSAgZnB1LmQgXAotCSAgb3BzLmQgXAotCSAgb3BzMi5kIFwKLQkgIHByaW1fb3BzLmQgXAotCSAgc3lzLmQKLQotLlNVRkZJWEVTOiAuZAotCi1hbGw6ICQoVEFSR0VUTElCKSAkKFRBUkdFVERFQlVHTElCKQotCi0kKFRBUkdFVExJQik6ICQoT0JKUykKLQkkKEFSKSBydiAkKFRBUkdFVExJQikgJChPQkpTKQotCi0kKFRBUkdFVERFQlVHTElCKTogJChERUJVR09CSlMpCi0JJChBUikgcnYgJChUQVJHRVRERUJVR0xJQikgJChERUJVR09CSlMpCi0KLUlOQ1MgICA9IC1JLiAtSXg4NmVtdSAtSS4uLy4uL2luY2x1ZGUKLUNGTEFHUyA9IC1EX19EUklWRVJfXyAtREZPUkNFX1BPU1QgLURfQ0VYUE9SVD0gLUROT19MT05HX0xPTkcgLURwcmludGs9cHJpbnRmIC1mc2lnbmVkLWNoYXIgIC1mb21pdC1mcmFtZS1wb2ludGVyIC1mUElDIC1mZml4ZWQtcjE0IC1tZWFiaQotQ0RFQlVHRkxBR1MgPSAtRERFQlVHCi0KLS5jLm86Ci0JJChDQykgLWcgLU8yIC1XYWxsIC1jICQoQ0ZMQUdTKSAkKElOQ1MpICQqLmMKLQotLmMuZDoKLQkkKENDKSAtZyAtTzIgLVdhbGwgLWMgLW8kKi5kICQoQ0ZMQUdTKSAkKENERUJVR0ZMQUdTKSAkKElOQ1MpICQqLmMKLQotLmNwcC5vOgotCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKElOQ1MpICQqLmNwcAotCi1jbGVhbjoKLQlybSAtZiAqLmEgKi5vICouZAotCi12YWxpZGF0ZToJdmFsaWRhdGUubyBsaWJ4ODZlbXUuYQotCSQoQ0MpIC1vIHZhbGlkYXRlIHZhbGlkYXRlLm8gLWx4ODZlbXUgLUwuCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvb3BzLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvb3BzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNGY5M2UuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L29wcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE3MDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSoJCQkJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotKgotKiAgICAgICAgICAgIAlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qIAkJCQkgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKLSogCQkJCQkgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOgkJQU5TSSBDCi0qIEVudmlyb25tZW50OglBbnkKLSogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKLSoKLSogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgaW5jbHVkZXMgc3Vicm91dGluZXMgdG8gaW1wbGVtZW50IHRoZSBkZWNvZGluZwotKiAgICAgICAgICAgICAgIGFuZCBlbXVsYXRpb24gb2YgYWxsIHRoZSB4ODYgcHJvY2Vzc29yIGluc3RydWN0aW9ucy4KLSoKLSogVGhlcmUgYXJlIGFwcHJveGltYXRlbHkgMjUwIHN1YnJvdXRpbmVzIGluIGhlcmUsIHdoaWNoIGNvcnJlc3BvbmQKLSogdG8gdGhlIDI1NiBieXRlLSJvcGNvZGVzIiBmb3VuZCBvbiB0aGUgODA4Ni4gIFRoZSB0YWJsZSB3aGljaAotKiBkaXNwYXRjaGVzIHRoaXMgaXMgZm91bmQgaW4gdGhlIGZpbGVzIG9wdGFiLltjaF0uCi0qCi0qIEVhY2ggb3Bjb2RlIHByb2MgaGFzIGEgY29tbWVudCBwcmVjZWVkaW5nIGl0IHdoaWNoIGdpdmVzIGl0J3MgdGFibGUKLSogYWRkcmVzcy4gIFNldmVyYWwgb3Bjb2RlcyBhcmUgbWlzc2luZyAodW5kZWZpbmVkKSBpbiB0aGUgdGFibGUuCi0qCi0qIEVhY2ggcHJvYyBpbmNsdWRlcyBpbmZvcm1hdGlvbiBmb3IgZGVjb2RpbmcgKERFQ09ERV9QUklOVEYgYW5kCi0qIERFQ09ERV9QUklOVEYyKSwgZGVidWdnaW5nIChUUkFDRV9SRUdTLCBTSU5HTEVfU1RFUCksIGFuZCBtaXNjCi0qIGZ1bmN0aW9ucyAoU1RBUlRfT0ZfSU5TVFIsIEVORF9PRl9JTlNUUikuCi0qCi0qIE1hbnkgb2YgdGhlIHByb2NlZHVyZXMgYXJlICpWRVJZKiBzaW1pbGFyIGluIGNvZGluZy4gIFRoaXMgaGFzCi0qIGFsbG93ZWQgZm9yIGEgdmVyeSBsYXJnZSBhbW91bnQgb2YgY29kZSB0byBiZSBnZW5lcmF0ZWQgaW4gYSBmYWlybHkKLSogc2hvcnQgYW1vdW50IG9mIHRpbWUgKGkuZS4gY3V0LCBwYXN0ZSwgYW5kIG1vZGlmeSkuICBUaGUgcmVzdWx0IGlzCi0qIHRoYXQgbXVjaCBvZiB0aGUgY29kZSBiZWxvdyBjb3VsZCBoYXZlIGJlZW4gZm9sZGVkIGludG8gc3Vicm91dGluZXMKLSogZm9yIGEgbGFyZ2UgcmVkdWN0aW9uIGluIHNpemUgb2YgdGhpcyBmaWxlLiAgVGhlIGRvd25zaWRlIHdvdWxkIGJlCi0qIHRoYXQgdGhlcmUgd291bGQgYmUgYSBwZW5hbHR5IGluIGV4ZWN1dGlvbiBzcGVlZC4gIFRoZSBmaWxlIGNvdWxkCi0qIGFsc28gaGF2ZSBiZWVuICpNVUNIKiBsYXJnZXIgYnkgaW5saW5pbmcgY2VydGFpbiBmdW5jdGlvbnMgd2hpY2gKLSogd2VyZSBjYWxsZWQuICBUaGlzIGNvdWxkIGhhdmUgcmVzdWx0ZWQgZXZlbiBmYXN0ZXIgZXhlY3V0aW9uLiAgVGhlCi0qIHByaW1lIGRpcmVjdGl2ZSBJIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdG8gaW5saW5lIHRoZSBjb2RlIG9yIHRvCi0qIG1vZHVsYXJpemUgaXQsIHdhcyBiYXNpY2FsbHk6IDEpIG5vIHVubmVjZXNzYXJ5IHN1YnJvdXRpbmUgY2FsbHMsCi0qIDIpIG5vIHJvdXRpbmVzIG1vcmUgdGhhbiBhYm91dCAyMDAgbGluZXMgaW4gc2l6ZSwgYW5kIDMpIG1vZHVsYXJpemUKLSogYW55IGNvZGUgdGhhdCBJIG1pZ2h0IG5vdCBnZXQgcmlnaHQgdGhlIGZpcnN0IHRpbWUuICBUaGUgZmV0Y2hfKgotKiBzdWJyb3V0aW5lcyBmYWxsIGludG8gdGhlIGxhdHRlciBjYXRlZ29yeS4gIFRoZSBUaGUgZGVjb2RlXyogZmFsbAotKiBpbnRvIHRoZSBzZWNvbmQgY2F0ZWdvcnkuICBUaGUgY29kaW5nIG9mIHRoZSAic3dpdGNoKG1vZCl7IC4uLi4gfSIKLSogaW4gbWFueSBvZiB0aGUgc3Vicm91dGluZXMgYmVsb3cgZmFsbHMgaW50byB0aGUgZmlyc3QgY2F0ZWdvcnkuCi0qIEVzcGVjaWFsbHksIHRoZSBjb2Rpbmcgb2Yge2FkZCxhbmQsb3Isc3ViLC4uLn1fe2J5dGUsd29yZH0KLSogc3Vicm91dGluZXMgYXJlIGFuIGVzcGVjaWFsbHkgZ2xhcmluZyBjYXNlIG9mIHRoZSB0aGlyZCBndWlkZWxpbmUuCi0qIFNpbmNlIHNvIG11Y2ggb2YgdGhlIGNvZGUgaXMgY2xvbmVkIGZyb20gb3RoZXIgbW9kdWxlcyAoY29tcGFyZQotKiBvcGNvZGUgIzAwIHRvIG9wY29kZSAjMDEpLCBtYWtpbmcgdGhlIGJhc2ljIG9wZXJhdGlvbnMgc3Vicm91dGluZQotKiBjYWxscyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudDsgb3RoZXJ3aXNlIG1pc3Rha2VzIGluIGNvZGluZyBhbgotKiAiYWRkIiB3b3VsZCByZXByZXNlbnQgYSBuaWdodG1hcmUgaW4gbWFpbnRlbmFuY2UuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAieDg2ZW11L3g4NmVtdWkuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1vcDEgLSBJbnN0cnVjdGlvbiBvcCBjb2RlCi0KLVJFTUFSS1M6Ci1IYW5kbGVzIGlsbGVnYWwgb3Bjb2Rlcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2lsbGVnYWxfb3AoCi0gICAgdTggb3AxKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSUxMRUdBTCBYODYgT1BDT0RFXG4iKTsKLSAgICBUUkFDRV9SRUdTKCk7Ci0gICAgcHJpbnRrKCIlMDR4OiUwNHg6ICUwMlggSUxMRUdBTCBYODYgT1BDT0RFIVxuIiwKLQlNLng4Ni5SX0NTLCBNLng4Ni5SX0lQLTEsb3AxKTsKLSAgICBIQUxUX1NZUygpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MDAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2FkZF9ieXRlX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0gICAgdTggKmRlc3RyZWcsICpzcmNyZWc7Ci0gICAgdTggZGVzdHZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQUREXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSBhZGRfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSBhZGRfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSBhZGRfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IGFkZF9ieXRlKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MDEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2FkZF93b3JkX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkFERFx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBhZGRfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gYWRkX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGFkZF9sb25nKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBhZGRfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gYWRkX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGFkZF93b3JkKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhZGRfbG9uZygqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYWRkX3dvcmQoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MDIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2FkZF9ieXRlX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKLSAgICB1aW50IHNyY29mZnNldDsKLSAgICB1OCBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkFERFx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBhZGRfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gYWRkX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IGFkZF9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBhZGRfYnl0ZSgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDAzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9hZGRfd29yZF9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkFERFx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFkZF9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhZGRfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYWRkX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFkZF93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhZGRfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYWRkX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhZGRfbG9uZygqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYWRkX3dvcmQoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MDQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2FkZF9ieXRlX0FMX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTggc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJBRERcdEFMLCIpOwotICAgIHNyY3ZhbCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9BTCA9IGFkZF9ieXRlKE0ueDg2LlJfQUwsIHNyY3ZhbCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MDUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2FkZF93b3JkX0FYX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTMyIHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiQUREXHRFQVgsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIkFERFx0QVgsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKLSAgICB9Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FQVggPSBhZGRfbG9uZyhNLng4Ni5SX0VBWCwgc3JjdmFsKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfQVggPSBhZGRfd29yZChNLng4Ni5SX0FYLCAodTE2KXNyY3ZhbCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDA2Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wdXNoX0VTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlBVU0hcdEVTXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIHB1c2hfd29yZChNLng4Ni5SX0VTKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwNwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcG9wX0VTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlBPUFx0RVNcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9FUyA9IHBvcF93b3JkKCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MDgKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX29yX2J5dGVfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLSAgICB1OCBkZXN0dmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJPUlx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gb3JfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSBvcl9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9IG9yX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBvcl9ieXRlKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MDkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX29yX3dvcmRfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiT1JcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gb3JfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gb3Jfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gb3JfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gb3Jfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gb3JfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gb3Jfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gb3JfbG9uZygqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gb3Jfd29yZCgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwYQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfb3JfYnl0ZV9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdTggKmRlc3RyZWcsICpzcmNyZWc7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0gICAgdTggc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJPUlx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBvcl9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBvcl9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBvcl9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBvcl9ieXRlKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX29yX3dvcmRfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJPUlx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IG9yX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IG9yX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IG9yX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IG9yX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IG9yX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IG9yX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBvcl9sb25nKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBvcl93b3JkKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBjCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9vcl9ieXRlX0FMX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTggc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJPUlx0QUwsIik7Ci0gICAgc3JjdmFsID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0FMID0gb3JfYnl0ZShNLng4Ni5SX0FMLCBzcmN2YWwpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9vcl93b3JkX0FYX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTMyIHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiT1JcdEVBWCwiKTsKLQlzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiT1JcdEFYLCIpOwotCXNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7Ci0gICAgfQotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRUFYID0gb3JfbG9uZyhNLng4Ni5SX0VBWCwgc3JjdmFsKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfQVggPSBvcl93b3JkKE0ueDg2LlJfQVgsICh1MTYpc3JjdmFsKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3B1c2hfQ1ModTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiUFVTSFx0Q1NcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgcHVzaF93b3JkKE0ueDg2LlJfQ1MpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBmLiBFc2NhcGUgZm9yIHR3by1ieXRlIG9wY29kZSAoMjg2IG9yIGJldHRlcikKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3R3b19ieXRlKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1OCBvcDIgPSAoKnN5c19yZGIpKCgodTMyKU0ueDg2LlJfQ1MgPDwgNCkgKyAoTS54ODYuUl9JUCsrKSk7Ci0gICAgSU5DX0RFQ09ERURfSU5TVF9MRU4oMSk7Ci0gICAgKCp4ODZlbXVfb3B0YWIyW29wMl0pKG9wMik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgxMAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfYWRjX2J5dGVfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLSAgICB1OCBkZXN0dmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJBRENcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9IGFkY19ieXRlKGRlc3R2YWwsICpzcmNyZWcpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9IGFkY19ieXRlKGRlc3R2YWwsICpzcmNyZWcpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9IGFkY19ieXRlKGRlc3R2YWwsICpzcmNyZWcpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gYWRjX2J5dGUoKmRlc3RyZWcsICpzcmNyZWcpOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgxMQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfYWRjX3dvcmRfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQURDXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGFkY19sb25nKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBhZGNfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gYWRjX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGFkY193b3JkKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBhZGNfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gYWRjX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFkY19sb25nKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhZGNfd29yZCgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgxMgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfYWRjX2J5dGVfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotICAgIHU4IHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQURDXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IGFkY19ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBhZGNfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gYWRjX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IGFkY19ieXRlKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MTMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2FkY193b3JkX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IHNyY29mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQURDXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYWRjX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFkY193b3JkKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhZGNfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYWRjX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFkY19sb25nKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhZGNfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFkY19sb25nKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhZGNfd29yZCgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgxNAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfYWRjX2J5dGVfQUxfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1OCBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkFEQ1x0QUwsIik7Ci0gICAgc3JjdmFsID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0FMID0gYWRjX2J5dGUoTS54ODYuUl9BTCwgc3JjdmFsKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgxNQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfYWRjX3dvcmRfQVhfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MzIgc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJBRENcdEVBWCwiKTsKLQlzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiQURDXHRBWCwiKTsKLQlzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOwotICAgIH0KLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VBWCA9IGFkY19sb25nKE0ueDg2LlJfRUFYLCBzcmN2YWwpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9BWCA9IGFkY193b3JkKE0ueDg2LlJfQVgsICh1MTYpc3JjdmFsKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MTYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3B1c2hfU1ModTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiUFVTSFx0U1NcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgcHVzaF93b3JkKE0ueDg2LlJfU1MpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDE3Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wb3BfU1ModTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiUE9QXHRTU1xuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX1NTID0gcG9wX3dvcmQoKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgxOAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfc2JiX2J5dGVfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLSAgICB1OCBkZXN0dmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJTQkJcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9IHNiYl9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9IHNiYl9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9IHNiYl9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gc2JiX2J5dGUoKmRlc3RyZWcsICpzcmNyZWcpOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgxOQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfc2JiX3dvcmRfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiU0JCXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IHNiYl9sb25nKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBzYmJfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gc2JiX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IHNiYl93b3JkKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBzYmJfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gc2JiX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNiYl9sb25nKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzYmJfd29yZCgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgxYQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfc2JiX2J5dGVfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotICAgIHU4IHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiU0JCXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IHNiYl9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBzYmJfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gc2JiX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IHNiYl9ieXRlKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MWIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3NiYl93b3JkX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IHNyY29mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiU0JCXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc2JiX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNiYl93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzYmJfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc2JiX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNiYl9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzYmJfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNiYl9sb25nKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzYmJfd29yZCgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgxYwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfc2JiX2J5dGVfQUxfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1OCBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlNCQlx0QUwsIik7Ci0gICAgc3JjdmFsID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0FMID0gc2JiX2J5dGUoTS54ODYuUl9BTCwgc3JjdmFsKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgxZAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfc2JiX3dvcmRfQVhfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MzIgc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJTQkJcdEVBWCwiKTsKLQlzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiU0JCXHRBWCwiKTsKLQlzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOwotICAgIH0KLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VBWCA9IHNiYl9sb25nKE0ueDg2LlJfRUFYLCBzcmN2YWwpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9BWCA9IHNiYl93b3JkKE0ueDg2LlJfQVgsICh1MTYpc3JjdmFsKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MWUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3B1c2hfRFModTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiUFVTSFx0RFNcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgcHVzaF93b3JkKE0ueDg2LlJfRFMpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDFmCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wb3BfRFModTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiUE9QXHREU1xuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0RTID0gcG9wX3dvcmQoKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgyMAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfYW5kX2J5dGVfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLSAgICB1OCBkZXN0dmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJBTkRcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0KLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gYW5kX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotCi0gICAgY2FzZSAxOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSBhbmRfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIDI6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9IGFuZF9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLQotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBhbmRfYnl0ZSgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDIxCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9hbmRfd29yZF9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJBTkRcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gYW5kX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGFuZF93b3JkKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBhbmRfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gYW5kX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGFuZF9sb25nKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBhbmRfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYW5kX2xvbmcoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFuZF93b3JkKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDIyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9hbmRfYnl0ZV9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdTggKmRlc3RyZWcsICpzcmNyZWc7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0gICAgdTggc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJBTkRcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gYW5kX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IGFuZF9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBhbmRfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gYW5kX2J5dGUoKmRlc3RyZWcsICpzcmNyZWcpOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgyMwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfYW5kX3dvcmRfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJBTkRcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhbmRfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYW5kX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IGFuZF9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOwotCSAgICBicmVhazsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYW5kX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JICAgIGJyZWFrOwotCX0KLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhbmRfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYW5kX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBhbmRfbG9uZygqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gYW5kX3dvcmQoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MjQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2FuZF9ieXRlX0FMX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTggc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJBTkRcdEFMLCIpOwotICAgIHNyY3ZhbCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9BTCA9IGFuZF9ieXRlKE0ueDg2LlJfQUwsIHNyY3ZhbCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MjUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2FuZF93b3JkX0FYX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTMyIHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiQU5EXHRFQVgsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIkFORFx0QVgsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKLSAgICB9Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FQVggPSBhbmRfbG9uZyhNLng4Ni5SX0VBWCwgc3JjdmFsKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfQVggPSBhbmRfd29yZChNLng4Ni5SX0FYLCAodTE2KXNyY3ZhbCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDI2Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9zZWdvdnJfRVModTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiRVM6XG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdPVlJfRVM7Ci0gICAgLyoKLSAgICAgKiBub3RlIHRoZSBsYWNrIG9mIERFQ09ERV9DTEVBUl9TRUdPVlIocikgc2luY2UsIGhlcmUgaXMgb25lIG9mIDQKLSAgICAgKiBvcGNvZGUgc3Vicm91dGluZXMgd2UgZG8gbm90IHdhbnQgdG8gZG8gdGhpcy4KLSAgICAgKi8KLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDI3Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9kYWEodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiREFBXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfQUwgPSBkYWFfYnl0ZShNLng4Ni5SX0FMKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgyOAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfc3ViX2J5dGVfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLSAgICB1OCBkZXN0dmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJTVUJcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9IHN1Yl9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9IHN1Yl9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9IHN1Yl9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gc3ViX2J5dGUoKmRlc3RyZWcsICpzcmNyZWcpOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgyOQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfc3ViX3dvcmRfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiU1VCXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IHN1Yl9sb25nKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBzdWJfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gc3ViX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IHN1Yl93b3JkKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBzdWJfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gc3ViX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHN1Yl9sb25nKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzdWJfd29yZCgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgyYQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfc3ViX2J5dGVfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotICAgIHU4IHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiU1VCXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IHN1Yl9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBzdWJfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gc3ViX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IHN1Yl9ieXRlKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MmIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3N1Yl93b3JkX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IHNyY29mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiU1VCXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc3ViX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHN1Yl93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzdWJfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc3ViX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHN1Yl9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzdWJfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHN1Yl9sb25nKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzdWJfd29yZCgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgyYwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfc3ViX2J5dGVfQUxfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1OCBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlNVQlx0QUwsIik7Ci0gICAgc3JjdmFsID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0FMID0gc3ViX2J5dGUoTS54ODYuUl9BTCwgc3JjdmFsKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgyZAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfc3ViX3dvcmRfQVhfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MzIgc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJTVUJcdEVBWCwiKTsKLQlzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiU1VCXHRBWCwiKTsKLQlzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOwotICAgIH0KLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VBWCA9IHN1Yl9sb25nKE0ueDg2LlJfRUFYLCBzcmN2YWwpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9BWCA9IHN1Yl93b3JkKE0ueDg2LlJfQVgsICh1MTYpc3JjdmFsKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MmUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3NlZ292cl9DUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJDUzpcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR09WUl9DUzsKLSAgICAvKiBub3RlIG5vIERFQ09ERV9DTEVBUl9TRUdPVlIgaGVyZS4gKi8KLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDJmCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9kYXModTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiREFTXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfQUwgPSBkYXNfYnl0ZShNLng4Ni5SX0FMKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgzMAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfeG9yX2J5dGVfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLSAgICB1OCBkZXN0dmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJYT1JcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9IHhvcl9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9IHhvcl9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9IHhvcl9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0geG9yX2J5dGUoKmRlc3RyZWcsICpzcmNyZWcpOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgzMQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfeG9yX3dvcmRfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiWE9SXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IHhvcl9sb25nKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSB4b3Jfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0geG9yX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IHhvcl93b3JkKGRlc3R2YWwsICpzcmNyZWcpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSB4b3JfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0geG9yX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHhvcl9sb25nKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSB4b3Jfd29yZCgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgzMgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfeG9yX2J5dGVfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotICAgIHU4IHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiWE9SXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IHhvcl9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSB4b3JfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0geG9yX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IHhvcl9ieXRlKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MzMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3hvcl93b3JkX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IHNyY29mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiWE9SXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0geG9yX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHhvcl93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSB4b3JfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0geG9yX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHhvcl9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSB4b3Jfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHhvcl9sb25nKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSB4b3Jfd29yZCgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgzNAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfeG9yX2J5dGVfQUxfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1OCBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlhPUlx0QUwsIik7Ci0gICAgc3JjdmFsID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0FMID0geG9yX2J5dGUoTS54ODYuUl9BTCwgc3JjdmFsKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgzNQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfeG9yX3dvcmRfQVhfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MzIgc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJYT1JcdEVBWCwiKTsKLQlzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiWE9SXHRBWCwiKTsKLQlzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOwotICAgIH0KLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VBWCA9IHhvcl9sb25nKE0ueDg2LlJfRUFYLCBzcmN2YWwpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9BWCA9IHhvcl93b3JkKE0ueDg2LlJfQVgsICh1MTYpc3JjdmFsKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MzYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3NlZ292cl9TUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJTUzpcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR09WUl9TUzsKLSAgICAvKiBubyBERUNPREVfQ0xFQVJfU0VHT1ZSICEgKi8KLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDM3Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9hYWEodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQUFBXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfQVggPSBhYWFfd29yZChNLng4Ni5SX0FYKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgzOAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfY21wX2J5dGVfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLSAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKLSAgICB1OCBkZXN0dmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJDTVBcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JY21wX2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWNtcF9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQljbXBfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWNtcF9ieXRlKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MzkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2NtcF93b3JkX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkNNUFx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGNtcF9sb25nKGRlc3R2YWwsICpzcmNyZWcpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBjbXBfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgY21wX2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGNtcF93b3JkKGRlc3R2YWwsICpzcmNyZWcpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBjbXBfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgY21wX3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgY21wX2xvbmcoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBjbXBfd29yZCgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgzYQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfY21wX2J5dGVfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotICAgIHU4IHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQ01QXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQljbXBfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWNtcF9ieXRlKCpkZXN0cmVnLCBzcmN2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JY21wX2J5dGUoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQljbXBfYnl0ZSgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDNiCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9jbXBfd29yZF9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkNNUFx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBjbXBfbG9uZygqZGVzdHJlZywgc3JjdmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGNtcF93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgY21wX2xvbmcoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBjbXBfd29yZCgqZGVzdHJlZywgc3JjdmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGNtcF9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgY21wX3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgY21wX2xvbmcoKmRlc3RyZWcsICpzcmNyZWcpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBjbXBfd29yZCgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgzYwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfY21wX2J5dGVfQUxfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1OCBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkNNUFx0QUwsIik7Ci0gICAgc3JjdmFsID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBjbXBfYnl0ZShNLng4Ni5SX0FMLCBzcmN2YWwpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDNkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9jbXBfd29yZF9BWF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUzMiBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIkNNUFx0RUFYLCIpOwotCXNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJDTVBcdEFYLCIpOwotCXNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7Ci0gICAgfQotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCWNtcF9sb25nKE0ueDg2LlJfRUFYLCBzcmN2YWwpOwotICAgIH0gZWxzZSB7Ci0JY21wX3dvcmQoTS54ODYuUl9BWCwgKHUxNilzcmN2YWwpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgzZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfc2Vnb3ZyX0RTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkRTOlxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHT1ZSX0RTOwotICAgIC8qIE5PIERFQ09ERV9DTEVBUl9TRUdPVlIhICovCi0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgzZgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfYWFzKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkFBU1xuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0FYID0gYWFzX3dvcmQoTS54ODYuUl9BWCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NDAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2luY19BWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJJTkNcdEVBWFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJJTkNcdEFYXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VBWCA9IGluY19sb25nKE0ueDg2LlJfRUFYKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfQVggPSBpbmNfd29yZChNLng4Ni5SX0FYKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NDEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2luY19DWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJJTkNcdEVDWFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJJTkNcdENYXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VDWCA9IGluY19sb25nKE0ueDg2LlJfRUNYKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfQ1ggPSBpbmNfd29yZChNLng4Ni5SX0NYKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NDIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2luY19EWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJJTkNcdEVEWFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJJTkNcdERYXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VEWCA9IGluY19sb25nKE0ueDg2LlJfRURYKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfRFggPSBpbmNfd29yZChNLng4Ni5SX0RYKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NDMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2luY19CWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJJTkNcdEVCWFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJJTkNcdEJYXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VCWCA9IGluY19sb25nKE0ueDg2LlJfRUJYKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfQlggPSBpbmNfd29yZChNLng4Ni5SX0JYKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NDQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2luY19TUCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJJTkNcdEVTUFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJJTkNcdFNQXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VTUCA9IGluY19sb25nKE0ueDg2LlJfRVNQKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfU1AgPSBpbmNfd29yZChNLng4Ni5SX1NQKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NDUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2luY19CUCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJJTkNcdEVCUFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJJTkNcdEJQXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VCUCA9IGluY19sb25nKE0ueDg2LlJfRUJQKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfQlAgPSBpbmNfd29yZChNLng4Ni5SX0JQKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NDYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2luY19TSSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJJTkNcdEVTSVxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJJTkNcdFNJXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VTSSA9IGluY19sb25nKE0ueDg2LlJfRVNJKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfU0kgPSBpbmNfd29yZChNLng4Ni5SX1NJKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NDcKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2luY19ESSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJJTkNcdEVESVxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJJTkNcdERJXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VESSA9IGluY19sb25nKE0ueDg2LlJfRURJKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfREkgPSBpbmNfd29yZChNLng4Ni5SX0RJKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NDgKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2RlY19BWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJERUNcdEVBWFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJERUNcdEFYXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VBWCA9IGRlY19sb25nKE0ueDg2LlJfRUFYKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfQVggPSBkZWNfd29yZChNLng4Ni5SX0FYKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NDkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2RlY19DWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJERUNcdEVDWFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJERUNcdENYXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VDWCA9IGRlY19sb25nKE0ueDg2LlJfRUNYKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfQ1ggPSBkZWNfd29yZChNLng4Ni5SX0NYKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NGEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2RlY19EWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJERUNcdEVEWFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJERUNcdERYXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VEWCA9IGRlY19sb25nKE0ueDg2LlJfRURYKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfRFggPSBkZWNfd29yZChNLng4Ni5SX0RYKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NGIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2RlY19CWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJERUNcdEVCWFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJERUNcdEJYXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VCWCA9IGRlY19sb25nKE0ueDg2LlJfRUJYKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfQlggPSBkZWNfd29yZChNLng4Ni5SX0JYKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NGMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2RlY19TUCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJERUNcdEVTUFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJERUNcdFNQXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VTUCA9IGRlY19sb25nKE0ueDg2LlJfRVNQKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfU1AgPSBkZWNfd29yZChNLng4Ni5SX1NQKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NGQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2RlY19CUCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJERUNcdEVCUFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJERUNcdEJQXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VCUCA9IGRlY19sb25nKE0ueDg2LlJfRUJQKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfQlAgPSBkZWNfd29yZChNLng4Ni5SX0JQKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2RlY19TSSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJERUNcdEVTSVxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJERUNcdFNJXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VTSSA9IGRlY19sb25nKE0ueDg2LlJfRVNJKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfU0kgPSBkZWNfd29yZChNLng4Ni5SX1NJKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NGYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2RlY19ESSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJERUNcdEVESVxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJERUNcdERJXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VESSA9IGRlY19sb25nKE0ueDg2LlJfRURJKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfREkgPSBkZWNfd29yZChNLng4Ni5SX0RJKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NTAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3B1c2hfQVgodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiUFVTSFx0RUFYXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlBVU0hcdEFYXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlwdXNoX2xvbmcoTS54ODYuUl9FQVgpOwotICAgIH0gZWxzZSB7Ci0JcHVzaF93b3JkKE0ueDg2LlJfQVgpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg1MQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcHVzaF9DWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJQVVNIXHRFQ1hcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiUFVTSFx0Q1hcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCXB1c2hfbG9uZyhNLng4Ni5SX0VDWCk7Ci0gICAgfSBlbHNlIHsKLQlwdXNoX3dvcmQoTS54ODYuUl9DWCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDUyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wdXNoX0RYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlBVU0hcdEVEWFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJQVVNIXHREWFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JcHVzaF9sb25nKE0ueDg2LlJfRURYKTsKLSAgICB9IGVsc2UgewotCXB1c2hfd29yZChNLng4Ni5SX0RYKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NTMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3B1c2hfQlgodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiUFVTSFx0RUJYXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlBVU0hcdEJYXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlwdXNoX2xvbmcoTS54ODYuUl9FQlgpOwotICAgIH0gZWxzZSB7Ci0JcHVzaF93b3JkKE0ueDg2LlJfQlgpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg1NAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcHVzaF9TUCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJQVVNIXHRFU1BcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiUFVTSFx0U1BcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCS8qIEFsd2F5cyBwdXNoIChFKVNQLCBzaW5jZSB3ZSBhcmUgZW11bGF0aW5nIGFuIGkzODYgYW5kIGFib3ZlCi0JICogcHJvY2Vzc29yLiBUaGlzIGlzIG5lY2Vzc2FyeSBhcyBzb21lIEJJT1MnZXMgdXNlIHRoaXMgdG8gY2hlY2sKLQkgKiB3aGF0IHR5cGUgb2YgcHJvY2Vzc29yIGlzIGluIHRoZSBzeXN0ZW0uCi0JICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXB1c2hfbG9uZyhNLng4Ni5SX0VTUCk7Ci0JfSBlbHNlIHsKLQkJcHVzaF93b3JkKCh1MTYpKE0ueDg2LlJfU1ApKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NTUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3B1c2hfQlAodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiUFVTSFx0RUJQXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlBVU0hcdEJQXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlwdXNoX2xvbmcoTS54ODYuUl9FQlApOwotICAgIH0gZWxzZSB7Ci0JcHVzaF93b3JkKE0ueDg2LlJfQlApOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg1NgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcHVzaF9TSSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJQVVNIXHRFU0lcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiUFVTSFx0U0lcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCXB1c2hfbG9uZyhNLng4Ni5SX0VTSSk7Ci0gICAgfSBlbHNlIHsKLQlwdXNoX3dvcmQoTS54ODYuUl9TSSk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDU3Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wdXNoX0RJKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlBVU0hcdEVESVxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJQVVNIXHRESVxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JcHVzaF9sb25nKE0ueDg2LlJfRURJKTsKLSAgICB9IGVsc2UgewotCXB1c2hfd29yZChNLng4Ni5SX0RJKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NTgKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3BvcF9BWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJQT1BcdEVBWFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJQT1BcdEFYXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VBWCA9IHBvcF9sb25nKCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0FYID0gcG9wX3dvcmQoKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NTkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3BvcF9DWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJQT1BcdEVDWFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJQT1BcdENYXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VDWCA9IHBvcF9sb25nKCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0NYID0gcG9wX3dvcmQoKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NWEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3BvcF9EWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJQT1BcdEVEWFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJQT1BcdERYXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VEWCA9IHBvcF9sb25nKCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0RYID0gcG9wX3dvcmQoKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NWIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3BvcF9CWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJQT1BcdEVCWFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJQT1BcdEJYXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VCWCA9IHBvcF9sb25nKCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0JYID0gcG9wX3dvcmQoKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NWMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3BvcF9TUCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJQT1BcdEVTUFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJQT1BcdFNQXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VTUCA9IHBvcF9sb25nKCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX1NQID0gcG9wX3dvcmQoKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NWQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3BvcF9CUCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJQT1BcdEVCUFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJQT1BcdEJQXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VCUCA9IHBvcF9sb25nKCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0JQID0gcG9wX3dvcmQoKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NWUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3BvcF9TSSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJQT1BcdEVTSVxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJQT1BcdFNJXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VTSSA9IHBvcF9sb25nKCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX1NJID0gcG9wX3dvcmQoKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NWYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3BvcF9ESSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJQT1BcdEVESVxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJQT1BcdERJXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VESSA9IHBvcF9sb25nKCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0RJID0gcG9wX3dvcmQoKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NjAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3B1c2hfYWxsKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlBVU0hBRFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJQVVNIQVxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JdTMyIG9sZF9zcCA9IE0ueDg2LlJfRVNQOwotCi0JcHVzaF9sb25nKE0ueDg2LlJfRUFYKTsKLQlwdXNoX2xvbmcoTS54ODYuUl9FQ1gpOwotCXB1c2hfbG9uZyhNLng4Ni5SX0VEWCk7Ci0JcHVzaF9sb25nKE0ueDg2LlJfRUJYKTsKLQlwdXNoX2xvbmcob2xkX3NwKTsKLQlwdXNoX2xvbmcoTS54ODYuUl9FQlApOwotCXB1c2hfbG9uZyhNLng4Ni5SX0VTSSk7Ci0JcHVzaF9sb25nKE0ueDg2LlJfRURJKTsKLSAgICB9IGVsc2UgewotCXUxNiBvbGRfc3AgPSBNLng4Ni5SX1NQOwotCi0JcHVzaF93b3JkKE0ueDg2LlJfQVgpOwotCXB1c2hfd29yZChNLng4Ni5SX0NYKTsKLQlwdXNoX3dvcmQoTS54ODYuUl9EWCk7Ci0JcHVzaF93b3JkKE0ueDg2LlJfQlgpOwotCXB1c2hfd29yZChvbGRfc3ApOwotCXB1c2hfd29yZChNLng4Ni5SX0JQKTsKLQlwdXNoX3dvcmQoTS54ODYuUl9TSSk7Ci0JcHVzaF93b3JkKE0ueDg2LlJfREkpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg2MQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcG9wX2FsbCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJQT1BBRFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJQT1BBXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VESSA9IHBvcF9sb25nKCk7Ci0JTS54ODYuUl9FU0kgPSBwb3BfbG9uZygpOwotCU0ueDg2LlJfRUJQID0gcG9wX2xvbmcoKTsKLQlNLng4Ni5SX0VTUCArPSA0OyAgICAgICAgICAgICAgLyogc2tpcCBFU1AgKi8KLQlNLng4Ni5SX0VCWCA9IHBvcF9sb25nKCk7Ci0JTS54ODYuUl9FRFggPSBwb3BfbG9uZygpOwotCU0ueDg2LlJfRUNYID0gcG9wX2xvbmcoKTsKLQlNLng4Ni5SX0VBWCA9IHBvcF9sb25nKCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0RJID0gcG9wX3dvcmQoKTsKLQlNLng4Ni5SX1NJID0gcG9wX3dvcmQoKTsKLQlNLng4Ni5SX0JQID0gcG9wX3dvcmQoKTsKLQlNLng4Ni5SX1NQICs9IDI7ICAgICAgICAgICAgICAgLyogc2tpcCBTUCAqLwotCU0ueDg2LlJfQlggPSBwb3Bfd29yZCgpOwotCU0ueDg2LlJfRFggPSBwb3Bfd29yZCgpOwotCU0ueDg2LlJfQ1ggPSBwb3Bfd29yZCgpOwotCU0ueDg2LlJfQVggPSBwb3Bfd29yZCgpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qb3Bjb2RlIDB4NjIgICBJTExFR0FMIE9QLCBjYWxscyB4ODZlbXVPcF9pbGxlZ2FsX29wKCkgKi8KLS8qb3Bjb2RlIDB4NjMgICBJTExFR0FMIE9QLCBjYWxscyB4ODZlbXVPcF9pbGxlZ2FsX29wKCkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDY0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9zZWdvdnJfRlModTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiRlM6XG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdPVlJfRlM7Ci0gICAgLyoKLSAgICAgKiBub3RlIHRoZSBsYWNrIG9mIERFQ09ERV9DTEVBUl9TRUdPVlIocikgc2luY2UsIGhlcmUgaXMgb25lIG9mIDQKLSAgICAgKiBvcGNvZGUgc3Vicm91dGluZXMgd2UgZG8gbm90IHdhbnQgdG8gZG8gdGhpcy4KLSAgICAgKi8KLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDY1Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9zZWdvdnJfR1ModTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiR1M6XG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdPVlJfR1M7Ci0gICAgLyoKLSAgICAgKiBub3RlIHRoZSBsYWNrIG9mIERFQ09ERV9DTEVBUl9TRUdPVlIocikgc2luY2UsIGhlcmUgaXMgb25lIG9mIDQKLSAgICAgKiBvcGNvZGUgc3Vicm91dGluZXMgd2UgZG8gbm90IHdhbnQgdG8gZG8gdGhpcy4KLSAgICAgKi8KLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDY2IC0gcHJlZml4IGZvciAzMi1iaXQgcmVnaXN0ZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3ByZWZpeF9kYXRhKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkRBVEE6XG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9QUkVGSVhfREFUQTsKLSAgICAvKiBub3RlIG5vIERFQ09ERV9DTEVBUl9TRUdPVlIgaGVyZS4gKi8KLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDY3IC0gcHJlZml4IGZvciAzMi1iaXQgYWRkcmVzcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcHJlZml4X2FkZHIodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQUREUjpcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1BSRUZJWF9BRERSOwotICAgIC8qIG5vdGUgbm8gREVDT0RFX0NMRUFSX1NFR09WUiBoZXJlLiAqLwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NjgKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3B1c2hfd29yZF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUzMiBpbW07Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCWltbSA9IGZldGNoX2xvbmdfaW1tKCk7Ci0gICAgfSBlbHNlIHsKLQlpbW0gPSBmZXRjaF93b3JkX2ltbSgpOwotICAgIH0KLSAgICBERUNPREVfUFJJTlRGMigiUFVTSFx0JXhcbiIsIGltbSk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlwdXNoX2xvbmcoaW1tKTsKLSAgICB9IGVsc2UgewotCXB1c2hfd29yZCgodTE2KWltbSk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDY5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9pbXVsX3dvcmRfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIklNVUxcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQkgICAgdTMyIHJlc19sbyxyZXNfaGk7Ci0JICAgIHMzMiBpbW07Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIGltbSA9IGZldGNoX2xvbmdfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgaW11bF9sb25nX2RpcmVjdCgmcmVzX2xvLCZyZXNfaGksKHMzMilzcmN2YWwsKHMzMilpbW0pOwotCSAgICBpZiAocmVzX2hpICE9IDApIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotCSAgICB9IGVsc2UgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCSAgICB9Ci0JICAgICpkZXN0cmVnID0gKHUzMilyZXNfbG87Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCSAgICB1MzIgcmVzOwotCSAgICBzMTYgaW1tOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBpbW0gPSBmZXRjaF93b3JkX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCVkXG4iLCAoczMyKWltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHJlcyA9IChzMTYpc3JjdmFsICogKHMxNilpbW07Ci0JICAgIGlmIChyZXMgPiAweEZGRkYpIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotCSAgICB9IGVsc2UgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCSAgICB9Ci0JICAgICpkZXN0cmVnID0gKHUxNilyZXM7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCSAgICB1MzIgcmVzX2xvLHJlc19oaTsKLQkgICAgczMyIGltbTsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgaW1tID0gZmV0Y2hfbG9uZ19pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgKHMzMilpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBpbXVsX2xvbmdfZGlyZWN0KCZyZXNfbG8sJnJlc19oaSwoczMyKXNyY3ZhbCwoczMyKWltbSk7Ci0JICAgIGlmIChyZXNfaGkgIT0gMCkgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0JICAgIH0gZWxzZSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JICAgIH0KLQkgICAgKmRlc3RyZWcgPSAodTMyKXJlc19sbzsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0JICAgIHUzMiByZXM7Ci0JICAgIHMxNiBpbW07Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgcmVzID0gKHMxNilzcmN2YWwgKiAoczE2KWltbTsKLQkgICAgaWYgKHJlcyA+IDB4RkZGRikgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0JICAgIH0gZWxzZSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JICAgIH0KLQkgICAgKmRlc3RyZWcgPSAodTE2KXJlczsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0JICAgIHUzMiByZXNfbG8scmVzX2hpOwotCSAgICBzMzIgaW1tOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBpbW0gPSBmZXRjaF9sb25nX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCVkXG4iLCAoczMyKWltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGltdWxfbG9uZ19kaXJlY3QoJnJlc19sbywmcmVzX2hpLChzMzIpc3JjdmFsLChzMzIpaW1tKTsKLQkgICAgaWYgKHJlc19oaSAhPSAwKSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLQkgICAgfSBlbHNlIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkgICAgfQotCSAgICAqZGVzdHJlZyA9ICh1MzIpcmVzX2xvOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQkgICAgdTMyIHJlczsKLQkgICAgczE2IGltbTsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgaW1tID0gZmV0Y2hfd29yZF9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgKHMzMilpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICByZXMgPSAoczE2KXNyY3ZhbCAqIChzMTYpaW1tOwotCSAgICBpZiAocmVzID4gMHhGRkZGKSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLQkgICAgfSBlbHNlIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkgICAgfQotCSAgICAqZGVzdHJlZyA9ICh1MTYpcmVzOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7Ci0JICAgIHUzMiByZXNfbG8scmVzX2hpOwotCSAgICBzMzIgaW1tOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBpbW0gPSBmZXRjaF9sb25nX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCVkXG4iLCAoczMyKWltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGltdWxfbG9uZ19kaXJlY3QoJnJlc19sbywmcmVzX2hpLChzMzIpKnNyY3JlZywoczMyKWltbSk7Ci0JICAgIGlmIChyZXNfaGkgIT0gMCkgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0JICAgIH0gZWxzZSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JICAgIH0KLQkgICAgKmRlc3RyZWcgPSAodTMyKXJlc19sbzsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKLQkgICAgdTMyIHJlczsKLQkgICAgczE2IGltbTsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgaW1tID0gZmV0Y2hfd29yZF9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgKHMzMilpbW0pOwotCSAgICByZXMgPSAoczE2KSpzcmNyZWcgKiAoczE2KWltbTsKLQkgICAgaWYgKHJlcyA+IDB4RkZGRikgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0JICAgIH0gZWxzZSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JICAgIH0KLQkgICAgKmRlc3RyZWcgPSAodTE2KXJlczsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDZhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wdXNoX2J5dGVfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBzMTYgaW1tOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpbW0gPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBERUNPREVfUFJJTlRGMigiUFVTSFx0JWRcbiIsIGltbSk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBwdXNoX3dvcmQoaW1tKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg2YgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfaW11bF9ieXRlX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotICAgIHM4ICBpbW07Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIklNVUxcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQkgICAgdTMyIHJlc19sbyxyZXNfaGk7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgaW11bF9sb25nX2RpcmVjdCgmcmVzX2xvLCZyZXNfaGksKHMzMilzcmN2YWwsKHMzMilpbW0pOwotCSAgICBpZiAocmVzX2hpICE9IDApIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotCSAgICB9IGVsc2UgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCSAgICB9Ci0JICAgICpkZXN0cmVnID0gKHUzMilyZXNfbG87Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCSAgICB1MzIgcmVzOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCVkXG4iLCAoczMyKWltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHJlcyA9IChzMTYpc3JjdmFsICogKHMxNilpbW07Ci0JICAgIGlmIChyZXMgPiAweEZGRkYpIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotCSAgICB9IGVsc2UgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCSAgICB9Ci0JICAgICpkZXN0cmVnID0gKHUxNilyZXM7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCSAgICB1MzIgcmVzX2xvLHJlc19oaTsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgKHMzMilpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBpbXVsX2xvbmdfZGlyZWN0KCZyZXNfbG8sJnJlc19oaSwoczMyKXNyY3ZhbCwoczMyKWltbSk7Ci0JICAgIGlmIChyZXNfaGkgIT0gMCkgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0JICAgIH0gZWxzZSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JICAgIH0KLQkgICAgKmRlc3RyZWcgPSAodTMyKXJlc19sbzsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0JICAgIHUzMiByZXM7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgcmVzID0gKHMxNilzcmN2YWwgKiAoczE2KWltbTsKLQkgICAgaWYgKHJlcyA+IDB4RkZGRikgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0JICAgIH0gZWxzZSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JICAgIH0KLQkgICAgKmRlc3RyZWcgPSAodTE2KXJlczsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0JICAgIHUzMiByZXNfbG8scmVzX2hpOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCVkXG4iLCAoczMyKWltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGltdWxfbG9uZ19kaXJlY3QoJnJlc19sbywmcmVzX2hpLChzMzIpc3JjdmFsLChzMzIpaW1tKTsKLQkgICAgaWYgKHJlc19oaSAhPSAwKSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLQkgICAgfSBlbHNlIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkgICAgfQotCSAgICAqZGVzdHJlZyA9ICh1MzIpcmVzX2xvOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQkgICAgdTMyIHJlczsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgKHMzMilpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICByZXMgPSAoczE2KXNyY3ZhbCAqIChzMTYpaW1tOwotCSAgICBpZiAocmVzID4gMHhGRkZGKSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLQkgICAgfSBlbHNlIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkgICAgfQotCSAgICAqZGVzdHJlZyA9ICh1MTYpcmVzOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7Ci0JICAgIHUzMiByZXNfbG8scmVzX2hpOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCVkXG4iLCAoczMyKWltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGltdWxfbG9uZ19kaXJlY3QoJnJlc19sbywmcmVzX2hpLChzMzIpKnNyY3JlZywoczMyKWltbSk7Ci0JICAgIGlmIChyZXNfaGkgIT0gMCkgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0JICAgIH0gZWxzZSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JICAgIH0KLQkgICAgKmRlc3RyZWcgPSAodTMyKXJlc19sbzsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKLQkgICAgdTMyIHJlczsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgKHMzMilpbW0pOwotCSAgICByZXMgPSAoczE2KSpzcmNyZWcgKiAoczE2KWltbTsKLQkgICAgaWYgKHJlcyA+IDB4RkZGRikgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0JICAgIH0gZWxzZSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JICAgIH0KLQkgICAgKmRlc3RyZWcgPSAodTE2KXJlczsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDZjCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9pbnNfYnl0ZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJJTlNCXG4iKTsKLSAgICBpbnMoMSk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg2ZAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfaW5zX3dvcmQodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiSU5TRFxuIik7Ci0JaW5zKDQpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiSU5TV1xuIik7Ci0JaW5zKDIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDZlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9vdXRzX2J5dGUodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiT1VUU0JcbiIpOwotICAgIG91dHMoMSk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg2ZgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfb3V0c193b3JkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIk9VVFNEXG4iKTsKLQlvdXRzKDQpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiT1VUU1dcbiIpOwotCW91dHMoMik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NzAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2p1bXBfbmVhcl9PKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBzOCBvZmZzZXQ7Ci0gICAgdTE2IHRhcmdldDsKLQotICAgIC8qIGp1bXAgdG8gYnl0ZSBvZmZzZXQgaWYgb3ZlcmZsb3cgZmxhZyBpcyBzZXQgKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkpPXHQiKTsKLSAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgKHMxNilvZmZzZXQpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChBQ0NFU1NfRkxBRyhGX09GKSkKLQlNLng4Ni5SX0lQID0gdGFyZ2V0OwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDcxCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9qdW1wX25lYXJfTk8odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHM4IG9mZnNldDsKLSAgICB1MTYgdGFyZ2V0OwotCi0gICAgLyoganVtcCB0byBieXRlIG9mZnNldCBpZiBvdmVyZmxvdyBpcyBub3Qgc2V0ICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJKTk9cdCIpOwotICAgIG9mZnNldCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOwotICAgIHRhcmdldCA9ICh1MTYpKE0ueDg2LlJfSVAgKyAoczE2KW9mZnNldCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCB0YXJnZXQpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKCFBQ0NFU1NfRkxBRyhGX09GKSkKLQlNLng4Ni5SX0lQID0gdGFyZ2V0OwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDcyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9qdW1wX25lYXJfQih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgczggb2Zmc2V0OwotICAgIHUxNiB0YXJnZXQ7Ci0KLSAgICAvKiBqdW1wIHRvIGJ5dGUgb2Zmc2V0IGlmIGNhcnJ5IGZsYWcgaXMgc2V0LiAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSkJcdCIpOwotICAgIG9mZnNldCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOwotICAgIHRhcmdldCA9ICh1MTYpKE0ueDg2LlJfSVAgKyAoczE2KW9mZnNldCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCB0YXJnZXQpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKQotCU0ueDg2LlJfSVAgPSB0YXJnZXQ7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4NzMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2p1bXBfbmVhcl9OQih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgczggb2Zmc2V0OwotICAgIHUxNiB0YXJnZXQ7Ci0KLSAgICAvKiBqdW1wIHRvIGJ5dGUgb2Zmc2V0IGlmIGNhcnJ5IGZsYWcgaXMgY2xlYXIuICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJKTkJcdCIpOwotICAgIG9mZnNldCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOwotICAgIHRhcmdldCA9ICh1MTYpKE0ueDg2LlJfSVAgKyAoczE2KW9mZnNldCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCB0YXJnZXQpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKCFBQ0NFU1NfRkxBRyhGX0NGKSkKLQlNLng4Ni5SX0lQID0gdGFyZ2V0OwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDc0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9qdW1wX25lYXJfWih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgczggb2Zmc2V0OwotICAgIHUxNiB0YXJnZXQ7Ci0KLSAgICAvKiBqdW1wIHRvIGJ5dGUgb2Zmc2V0IGlmIHplcm8gZmxhZyBpcyBzZXQuICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJKWlx0Iik7Ci0gICAgb2Zmc2V0ID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7Ci0gICAgdGFyZ2V0ID0gKHUxNikoTS54ODYuUl9JUCArIChzMTYpb2Zmc2V0KTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHRhcmdldCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoQUNDRVNTX0ZMQUcoRl9aRikpCi0JTS54ODYuUl9JUCA9IHRhcmdldDsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg3NQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfanVtcF9uZWFyX05aKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBzOCBvZmZzZXQ7Ci0gICAgdTE2IHRhcmdldDsKLQotICAgIC8qIGp1bXAgdG8gYnl0ZSBvZmZzZXQgaWYgemVybyBmbGFnIGlzIGNsZWFyLiAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSk5aXHQiKTsKLSAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgKHMxNilvZmZzZXQpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmICghQUNDRVNTX0ZMQUcoRl9aRikpCi0JTS54ODYuUl9JUCA9IHRhcmdldDsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg3NgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfanVtcF9uZWFyX0JFKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBzOCBvZmZzZXQ7Ci0gICAgdTE2IHRhcmdldDsKLQotICAgIC8qIGp1bXAgdG8gYnl0ZSBvZmZzZXQgaWYgY2FycnkgZmxhZyBpcyBzZXQgb3IgaWYgdGhlIHplcm8KLSAgICAgICBmbGFnIGlzIHNldC4gKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkpCRVx0Iik7Ci0gICAgb2Zmc2V0ID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7Ci0gICAgdGFyZ2V0ID0gKHUxNikoTS54ODYuUl9JUCArIChzMTYpb2Zmc2V0KTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHRhcmdldCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoQUNDRVNTX0ZMQUcoRl9DRikgfHwgQUNDRVNTX0ZMQUcoRl9aRikpCi0JTS54ODYuUl9JUCA9IHRhcmdldDsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg3NwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfanVtcF9uZWFyX05CRSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgczggb2Zmc2V0OwotICAgIHUxNiB0YXJnZXQ7Ci0KLSAgICAvKiBqdW1wIHRvIGJ5dGUgb2Zmc2V0IGlmIGNhcnJ5IGZsYWcgaXMgY2xlYXIgYW5kIGlmIHRoZSB6ZXJvCi0gICAgICAgZmxhZyBpcyBjbGVhciAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSk5CRVx0Iik7Ci0gICAgb2Zmc2V0ID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7Ci0gICAgdGFyZ2V0ID0gKHUxNikoTS54ODYuUl9JUCArIChzMTYpb2Zmc2V0KTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHRhcmdldCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoIShBQ0NFU1NfRkxBRyhGX0NGKSB8fCBBQ0NFU1NfRkxBRyhGX1pGKSkpCi0JTS54ODYuUl9JUCA9IHRhcmdldDsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg3OAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfanVtcF9uZWFyX1ModTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHM4IG9mZnNldDsKLSAgICB1MTYgdGFyZ2V0OwotCi0gICAgLyoganVtcCB0byBieXRlIG9mZnNldCBpZiBzaWduIGZsYWcgaXMgc2V0ICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJKU1x0Iik7Ci0gICAgb2Zmc2V0ID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7Ci0gICAgdGFyZ2V0ID0gKHUxNikoTS54ODYuUl9JUCArIChzMTYpb2Zmc2V0KTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHRhcmdldCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoQUNDRVNTX0ZMQUcoRl9TRikpCi0JTS54ODYuUl9JUCA9IHRhcmdldDsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg3OQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfanVtcF9uZWFyX05TKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBzOCBvZmZzZXQ7Ci0gICAgdTE2IHRhcmdldDsKLQotICAgIC8qIGp1bXAgdG8gYnl0ZSBvZmZzZXQgaWYgc2lnbiBmbGFnIGlzIGNsZWFyICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJKTlNcdCIpOwotICAgIG9mZnNldCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOwotICAgIHRhcmdldCA9ICh1MTYpKE0ueDg2LlJfSVAgKyAoczE2KW9mZnNldCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCB0YXJnZXQpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKCFBQ0NFU1NfRkxBRyhGX1NGKSkKLQlNLng4Ni5SX0lQID0gdGFyZ2V0OwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDdhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9qdW1wX25lYXJfUCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgczggb2Zmc2V0OwotICAgIHUxNiB0YXJnZXQ7Ci0KLSAgICAvKiBqdW1wIHRvIGJ5dGUgb2Zmc2V0IGlmIHBhcml0eSBmbGFnIGlzIHNldCAoZXZlbiBwYXJpdHkpICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJKUFx0Iik7Ci0gICAgb2Zmc2V0ID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7Ci0gICAgdGFyZ2V0ID0gKHUxNikoTS54ODYuUl9JUCArIChzMTYpb2Zmc2V0KTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHRhcmdldCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoQUNDRVNTX0ZMQUcoRl9QRikpCi0JTS54ODYuUl9JUCA9IHRhcmdldDsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg3YgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfanVtcF9uZWFyX05QKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBzOCBvZmZzZXQ7Ci0gICAgdTE2IHRhcmdldDsKLQotICAgIC8qIGp1bXAgdG8gYnl0ZSBvZmZzZXQgaWYgcGFyaXR5IGZsYWcgaXMgY2xlYXIgKG9kZCBwYXJpdHkpICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJKTlBcdCIpOwotICAgIG9mZnNldCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOwotICAgIHRhcmdldCA9ICh1MTYpKE0ueDg2LlJfSVAgKyAoczE2KW9mZnNldCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCB0YXJnZXQpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKCFBQ0NFU1NfRkxBRyhGX1BGKSkKLQlNLng4Ni5SX0lQID0gdGFyZ2V0OwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDdjCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9qdW1wX25lYXJfTCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgczggb2Zmc2V0OwotICAgIHUxNiB0YXJnZXQ7Ci0gICAgaW50IHNmLCBvZjsKLQotICAgIC8qIGp1bXAgdG8gYnl0ZSBvZmZzZXQgaWYgc2lnbiBmbGFnIG5vdCBlcXVhbCB0byBvdmVyZmxvdyBmbGFnLiAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSkxcdCIpOwotICAgIG9mZnNldCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOwotICAgIHRhcmdldCA9ICh1MTYpKE0ueDg2LlJfSVAgKyAoczE2KW9mZnNldCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCB0YXJnZXQpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgc2YgPSBBQ0NFU1NfRkxBRyhGX1NGKSAhPSAwOwotICAgIG9mID0gQUNDRVNTX0ZMQUcoRl9PRikgIT0gMDsKLSAgICBpZiAoc2YgXiBvZikKLQlNLng4Ni5SX0lQID0gdGFyZ2V0OwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDdkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9qdW1wX25lYXJfTkwodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHM4IG9mZnNldDsKLSAgICB1MTYgdGFyZ2V0OwotICAgIGludCBzZiwgb2Y7Ci0KLSAgICAvKiBqdW1wIHRvIGJ5dGUgb2Zmc2V0IGlmIHNpZ24gZmxhZyBub3QgZXF1YWwgdG8gb3ZlcmZsb3cgZmxhZy4gKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkpOTFx0Iik7Ci0gICAgb2Zmc2V0ID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7Ci0gICAgdGFyZ2V0ID0gKHUxNikoTS54ODYuUl9JUCArIChzMTYpb2Zmc2V0KTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHRhcmdldCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBzZiA9IEFDQ0VTU19GTEFHKEZfU0YpICE9IDA7Ci0gICAgb2YgPSBBQ0NFU1NfRkxBRyhGX09GKSAhPSAwOwotICAgIC8qIG5vdGU6IGludmVyc2Ugb2YgYWJvdmUsIGJ1dCB1c2luZyA9PSBpbnN0ZWFkIG9mIHhvci4gKi8KLSAgICBpZiAoc2YgPT0gb2YpCi0JTS54ODYuUl9JUCA9IHRhcmdldDsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg3ZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfanVtcF9uZWFyX0xFKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBzOCBvZmZzZXQ7Ci0gICAgdTE2IHRhcmdldDsKLSAgICBpbnQgc2YsIG9mOwotCi0gICAgLyoganVtcCB0byBieXRlIG9mZnNldCBpZiBzaWduIGZsYWcgbm90IGVxdWFsIHRvIG92ZXJmbG93IGZsYWcKLSAgICAgICBvciB0aGUgemVybyBmbGFnIGlzIHNldCAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSkxFXHQiKTsKLSAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgKHMxNilvZmZzZXQpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIHNmID0gQUNDRVNTX0ZMQUcoRl9TRikgIT0gMDsKLSAgICBvZiA9IEFDQ0VTU19GTEFHKEZfT0YpICE9IDA7Ci0gICAgaWYgKChzZiBeIG9mKSB8fCBBQ0NFU1NfRkxBRyhGX1pGKSkKLQlNLng4Ni5SX0lQID0gdGFyZ2V0OwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDdmCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9qdW1wX25lYXJfTkxFKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBzOCBvZmZzZXQ7Ci0gICAgdTE2IHRhcmdldDsKLSAgICBpbnQgc2YsIG9mOwotCi0gICAgLyoganVtcCB0byBieXRlIG9mZnNldCBpZiBzaWduIGZsYWcgZXF1YWwgdG8gb3ZlcmZsb3cgZmxhZy4KLSAgICAgICBhbmQgdGhlIHplcm8gZmxhZyBpcyBjbGVhciAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSk5MRVx0Iik7Ci0gICAgb2Zmc2V0ID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7Ci0gICAgdGFyZ2V0ID0gKHUxNikoTS54ODYuUl9JUCArIChzMTYpb2Zmc2V0KTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHRhcmdldCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBzZiA9IEFDQ0VTU19GTEFHKEZfU0YpICE9IDA7Ci0gICAgb2YgPSBBQ0NFU1NfRkxBRyhGX09GKSAhPSAwOwotICAgIGlmICgoc2YgPT0gb2YpICYmICFBQ0NFU1NfRkxBRyhGX1pGKSkKLQlNLng4Ni5SX0lQID0gdGFyZ2V0OwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotc3RhdGljIHU4ICgqb3BjODBfYnl0ZV9vcGVyYXRpb25bXSkodTggZCwgdTggcykgPQotewotICAgIGFkZF9ieXRlLCAgICAgICAgICAgLyogMDAgKi8KLSAgICBvcl9ieXRlLCAgICAgICAgICAgIC8qIDAxICovCi0gICAgYWRjX2J5dGUsICAgICAgICAgICAvKiAwMiAqLwotICAgIHNiYl9ieXRlLCAgICAgICAgICAgLyogMDMgKi8KLSAgICBhbmRfYnl0ZSwgICAgICAgICAgIC8qIDA0ICovCi0gICAgc3ViX2J5dGUsICAgICAgICAgICAvKiAwNSAqLwotICAgIHhvcl9ieXRlLCAgICAgICAgICAgLyogMDYgKi8KLSAgICBjbXBfYnl0ZSwgICAgICAgICAgIC8qIDA3ICovCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ODAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX29wYzgwX2J5dGVfUk1fSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdTggKmRlc3RyZWc7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotICAgIHU4IGltbTsKLSAgICB1OCBkZXN0dmFsOwotCi0gICAgLyoKLSAgICAgKiBXZWlyZG8gc3BlY2lhbCBjYXNlIGluc3RydWN0aW9uIGZvcm1hdC4gIFBhcnQgb2YgdGhlIG9wY29kZQotICAgICAqIGhlbGQgYmVsb3cgaW4gIlJIIi4gIERvdWJseSBuZXN0ZWQgY2FzZSB3b3VsZCByZXN1bHQsIGV4Y2VwdAotICAgICAqIHRoYXQgdGhlIGRlY29kZWQgaW5zdHJ1Y3Rpb24KLSAgICAgKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0jaWZkZWYgREVCVUcKLSAgICBpZiAoREVCVUdfREVDT0RFKCkpIHsKLQkvKiBYWFggREVDT0RFX1BSSU5URiBtYXkgYmUgY2hhbmdlZCB0byBzb21ldGhpbmcgbW9yZQotCSAgIGdlbmVyYWwsIHNvIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRvIGxlYXZlIHRoZSBzdHJpbmdzCi0JICAgaW4gdGhlIHNhbWUgZm9ybWF0LCBldmVuIHRob3VnaCB0aGUgcmVzdWx0IGlzIHRoYXQgdGhlCi0JICAgYWJvdmUgdGVzdCBpcyBkb25lIHR3aWNlLiAqLwotCi0Jc3dpdGNoIChyaCkgewotCWNhc2UgMDoKLQkgICAgREVDT0RFX1BSSU5URigiQUREXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgICBERUNPREVfUFJJTlRGKCJPUlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMjoKLQkgICAgREVDT0RFX1BSSU5URigiQURDXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAzOgotCSAgICBERUNPREVfUFJJTlRGKCJTQkJcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDQ6Ci0JICAgIERFQ09ERV9QUklOVEYoIkFORFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNToKLQkgICAgREVDT0RFX1BSSU5URigiU1VCXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA2OgotCSAgICBERUNPREVfUFJJTlRGKCJYT1JcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDc6Ci0JICAgIERFQ09ERV9QUklOVEYoIkNNUFx0Iik7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0jZW5kaWYKLSAgICAvKiBrbm93IG9wZXJhdGlvbiwgZGVjb2RlIHRoZSBtb2QgYnl0ZSB0byBmaW5kIHRoZSBhZGRyZXNzaW5nCi0gICAgICAgbW9kZS4gKi8KLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQlERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gKCpvcGM4MF9ieXRlX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOwotCWlmIChyaCAhPSA3KQotCSAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOwotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotCURFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSAoKm9wYzgwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGltbSk7Ci0JaWYgKHJoICE9IDcpCi0JICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCWltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9ICgqb3BjODBfYnl0ZV9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgaW1tKTsKLQlpZiAocmggIT0gNykKLQkgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9ICgqb3BjODBfYnl0ZV9vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIGltbSk7Ci0JaWYgKHJoICE9IDcpCi0JICAgICpkZXN0cmVnID0gZGVzdHZhbDsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi1zdGF0aWMgdTE2ICgqb3BjODFfd29yZF9vcGVyYXRpb25bXSkodTE2IGQsIHUxNiBzKSA9Ci17Ci0gICAgYWRkX3dvcmQsICAgICAgICAgICAvKjAwICovCi0gICAgb3Jfd29yZCwgICAgICAgICAgICAvKjAxICovCi0gICAgYWRjX3dvcmQsICAgICAgICAgICAvKjAyICovCi0gICAgc2JiX3dvcmQsICAgICAgICAgICAvKjAzICovCi0gICAgYW5kX3dvcmQsICAgICAgICAgICAvKjA0ICovCi0gICAgc3ViX3dvcmQsICAgICAgICAgICAvKjA1ICovCi0gICAgeG9yX3dvcmQsICAgICAgICAgICAvKjA2ICovCi0gICAgY21wX3dvcmQsICAgICAgICAgICAvKjA3ICovCi19OwotCi1zdGF0aWMgdTMyICgqb3BjODFfbG9uZ19vcGVyYXRpb25bXSkodTMyIGQsIHUzMiBzKSA9Ci17Ci0gICAgYWRkX2xvbmcsICAgICAgICAgICAvKjAwICovCi0gICAgb3JfbG9uZywgICAgICAgICAgICAvKjAxICovCi0gICAgYWRjX2xvbmcsICAgICAgICAgICAvKjAyICovCi0gICAgc2JiX2xvbmcsICAgICAgICAgICAvKjAzICovCi0gICAgYW5kX2xvbmcsICAgICAgICAgICAvKjA0ICovCi0gICAgc3ViX2xvbmcsICAgICAgICAgICAvKjA1ICovCi0gICAgeG9yX2xvbmcsICAgICAgICAgICAvKjA2ICovCi0gICAgY21wX2xvbmcsICAgICAgICAgICAvKjA3ICovCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ODEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX29wYzgxX3dvcmRfUk1fSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotCi0gICAgLyoKLSAgICAgKiBXZWlyZG8gc3BlY2lhbCBjYXNlIGluc3RydWN0aW9uIGZvcm1hdC4gIFBhcnQgb2YgdGhlIG9wY29kZQotICAgICAqIGhlbGQgYmVsb3cgaW4gIlJIIi4gIERvdWJseSBuZXN0ZWQgY2FzZSB3b3VsZCByZXN1bHQsIGV4Y2VwdAotICAgICAqIHRoYXQgdGhlIGRlY29kZWQgaW5zdHJ1Y3Rpb24KLSAgICAgKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0jaWZkZWYgREVCVUcKLSAgICBpZiAoREVCVUdfREVDT0RFKCkpIHsKLQkvKiBYWFggREVDT0RFX1BSSU5URiBtYXkgYmUgY2hhbmdlZCB0byBzb21ldGhpbmcgbW9yZQotCSAgIGdlbmVyYWwsIHNvIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRvIGxlYXZlIHRoZSBzdHJpbmdzCi0JICAgaW4gdGhlIHNhbWUgZm9ybWF0LCBldmVuIHRob3VnaCB0aGUgcmVzdWx0IGlzIHRoYXQgdGhlCi0JICAgYWJvdmUgdGVzdCBpcyBkb25lIHR3aWNlLiAqLwotCi0Jc3dpdGNoIChyaCkgewotCWNhc2UgMDoKLQkgICAgREVDT0RFX1BSSU5URigiQUREXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgICBERUNPREVfUFJJTlRGKCJPUlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMjoKLQkgICAgREVDT0RFX1BSSU5URigiQURDXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAzOgotCSAgICBERUNPREVfUFJJTlRGKCJTQkJcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDQ6Ci0JICAgIERFQ09ERV9QUklOVEYoIkFORFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNToKLQkgICAgREVDT0RFX1BSSU5URigiU1VCXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA2OgotCSAgICBERUNPREVfUFJJTlRGKCJYT1JcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDc6Ci0JICAgIERFQ09ERV9QUklOVEYoIkNNUFx0Iik7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0jZW5kaWYKLSAgICAvKgotICAgICAqIEtub3cgb3BlcmF0aW9uLCBkZWNvZGUgdGhlIG1vZCBieXRlIHRvIGZpbmQgdGhlIGFkZHJlc3NpbmcKLSAgICAgKiBtb2RlLgotICAgICAqLwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbCxpbW07Ci0KLQkgICAgREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgaW1tID0gZmV0Y2hfbG9uZ19pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGM4MV9sb25nX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOwotCSAgICBpZiAocmggIT0gNykKLQkJc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsLGltbTsKLQotCSAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjODFfd29yZF9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgaW1tKTsKLQkgICAgaWYgKHJoICE9IDcpCi0JCXN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbCxpbW07Ci0KLQkgICAgREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgaW1tID0gZmV0Y2hfbG9uZ19pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGM4MV9sb25nX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOwotCSAgICBpZiAocmggIT0gNykKLQkJc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsLGltbTsKLQotCSAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjODFfd29yZF9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgaW1tKTsKLQkgICAgaWYgKHJoICE9IDcpCi0JCXN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbCxpbW07Ci0KLQkgICAgREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgaW1tID0gZmV0Y2hfbG9uZ19pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGM4MV9sb25nX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOwotCSAgICBpZiAocmggIT0gNykKLQkJc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsLGltbTsKLQotCSAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjODFfd29yZF9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgaW1tKTsKLQkgICAgaWYgKHJoICE9IDcpCi0JCXN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIGRlc3R2YWwsaW1tOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgaW1tID0gZmV0Y2hfbG9uZ19pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGM4MV9sb25nX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgaW1tKTsKLQkgICAgaWYgKHJoICE9IDcpCi0JCSpkZXN0cmVnID0gZGVzdHZhbDsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBkZXN0dmFsLGltbTsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjODFfd29yZF9vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIGltbSk7Ci0JICAgIGlmIChyaCAhPSA3KQotCQkqZGVzdHJlZyA9IGRlc3R2YWw7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLXN0YXRpYyB1OCAoKm9wYzgyX2J5dGVfb3BlcmF0aW9uW10pKHU4IHMsIHU4IGQpID0KLXsKLSAgICBhZGRfYnl0ZSwgICAgICAgICAgIC8qMDAgKi8KLSAgICBvcl9ieXRlLCAgICAgICAgICAgIC8qMDEgKi8gLypZWVkgVU5VU0VEID8/Pz8gKi8KLSAgICBhZGNfYnl0ZSwgICAgICAgICAgIC8qMDIgKi8KLSAgICBzYmJfYnl0ZSwgICAgICAgICAgIC8qMDMgKi8KLSAgICBhbmRfYnl0ZSwgICAgICAgICAgIC8qMDQgKi8gLypZWVkgVU5VU0VEID8/Pz8gKi8KLSAgICBzdWJfYnl0ZSwgICAgICAgICAgIC8qMDUgKi8KLSAgICB4b3JfYnl0ZSwgICAgICAgICAgIC8qMDYgKi8gLypZWVkgVU5VU0VEID8/Pz8gKi8KLSAgICBjbXBfYnl0ZSwgICAgICAgICAgIC8qMDcgKi8KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg4MgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfb3BjODJfYnl0ZV9STV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1OCAqZGVzdHJlZzsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0gICAgdTggaW1tOwotICAgIHU4IGRlc3R2YWw7Ci0KLSAgICAvKgotICAgICAqIFdlaXJkbyBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgUGFydCBvZiB0aGUgb3Bjb2RlCi0gICAgICogaGVsZCBiZWxvdyBpbiAiUkgiLiAgRG91Ymx5IG5lc3RlZCBjYXNlIHdvdWxkIHJlc3VsdCwgZXhjZXB0Ci0gICAgICogdGhhdCB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbiBTaW1pbGFyIHRvIG9wY29kZSA4MSwgZXhjZXB0IHRoYXQKLSAgICAgKiB0aGUgaW1tZWRpYXRlIGJ5dGUgaXMgc2lnbiBleHRlbmRlZCB0byBhIHdvcmQgbGVuZ3RoLgotICAgICAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSNpZmRlZiBERUJVRwotICAgIGlmIChERUJVR19ERUNPREUoKSkgewotCS8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCi0JICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKLQkgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKLQkgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCi0Jc3dpdGNoIChyaCkgewotCWNhc2UgMDoKLQkgICAgREVDT0RFX1BSSU5URigiQUREXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgICBERUNPREVfUFJJTlRGKCJPUlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMjoKLQkgICAgREVDT0RFX1BSSU5URigiQURDXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAzOgotCSAgICBERUNPREVfUFJJTlRGKCJTQkJcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDQ6Ci0JICAgIERFQ09ERV9QUklOVEYoIkFORFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNToKLQkgICAgREVDT0RFX1BSSU5URigiU1VCXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA2OgotCSAgICBERUNPREVfUFJJTlRGKCJYT1JcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDc6Ci0JICAgIERFQ09ERV9QUklOVEYoIkNNUFx0Iik7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0jZW5kaWYKLSAgICAvKiBrbm93IG9wZXJhdGlvbiwgZGVjb2RlIHRoZSBtb2QgYnl0ZSB0byBmaW5kIHRoZSBhZGRyZXNzaW5nCi0gICAgICAgbW9kZS4gKi8KLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotCURFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gKCpvcGM4Ml9ieXRlX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOwotCWlmIChyaCAhPSA3KQotCSAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOwotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCWltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSAoKm9wYzgyX2J5dGVfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGltbSk7Ci0JaWYgKHJoICE9IDcpCi0JICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQlERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9ICgqb3BjODJfYnl0ZV9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgaW1tKTsKLQlpZiAocmggIT0gNykKLQkgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQlERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9ICgqb3BjODJfYnl0ZV9vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIGltbSk7Ci0JaWYgKHJoICE9IDcpCi0JICAgICpkZXN0cmVnID0gZGVzdHZhbDsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi1zdGF0aWMgdTE2ICgqb3BjODNfd29yZF9vcGVyYXRpb25bXSkodTE2IHMsIHUxNiBkKSA9Ci17Ci0gICAgYWRkX3dvcmQsICAgICAgICAgICAvKjAwICovCi0gICAgb3Jfd29yZCwgICAgICAgICAgICAvKjAxICovIC8qWVlZIFVOVVNFRCA/Pz8/ICovCi0gICAgYWRjX3dvcmQsICAgICAgICAgICAvKjAyICovCi0gICAgc2JiX3dvcmQsICAgICAgICAgICAvKjAzICovCi0gICAgYW5kX3dvcmQsICAgICAgICAgICAvKjA0ICovIC8qWVlZIFVOVVNFRCA/Pz8/ICovCi0gICAgc3ViX3dvcmQsICAgICAgICAgICAvKjA1ICovCi0gICAgeG9yX3dvcmQsICAgICAgICAgICAvKjA2ICovIC8qWVlZIFVOVVNFRCA/Pz8/ICovCi0gICAgY21wX3dvcmQsICAgICAgICAgICAvKjA3ICovCi19OwotCi1zdGF0aWMgdTMyICgqb3BjODNfbG9uZ19vcGVyYXRpb25bXSkodTMyIHMsIHUzMiBkKSA9Ci17Ci0gICAgYWRkX2xvbmcsICAgICAgICAgICAvKjAwICovCi0gICAgb3JfbG9uZywgICAgICAgICAgICAvKjAxICovIC8qWVlZIFVOVVNFRCA/Pz8/ICovCi0gICAgYWRjX2xvbmcsICAgICAgICAgICAvKjAyICovCi0gICAgc2JiX2xvbmcsICAgICAgICAgICAvKjAzICovCi0gICAgYW5kX2xvbmcsICAgICAgICAgICAvKjA0ICovIC8qWVlZIFVOVVNFRCA/Pz8/ICovCi0gICAgc3ViX2xvbmcsICAgICAgICAgICAvKjA1ICovCi0gICAgeG9yX2xvbmcsICAgICAgICAgICAvKjA2ICovIC8qWVlZIFVOVVNFRCA/Pz8/ICovCi0gICAgY21wX2xvbmcsICAgICAgICAgICAvKjA3ICovCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ODMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX29wYzgzX3dvcmRfUk1fSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotCi0gICAgLyoKLSAgICAgKiBXZWlyZG8gc3BlY2lhbCBjYXNlIGluc3RydWN0aW9uIGZvcm1hdC4gIFBhcnQgb2YgdGhlIG9wY29kZQotICAgICAqIGhlbGQgYmVsb3cgaW4gIlJIIi4gIERvdWJseSBuZXN0ZWQgY2FzZSB3b3VsZCByZXN1bHQsIGV4Y2VwdAotICAgICAqIHRoYXQgdGhlIGRlY29kZWQgaW5zdHJ1Y3Rpb24gU2ltaWxhciB0byBvcGNvZGUgODEsIGV4Y2VwdCB0aGF0Ci0gICAgICogdGhlIGltbWVkaWF0ZSBieXRlIGlzIHNpZ24gZXh0ZW5kZWQgdG8gYSB3b3JkIGxlbmd0aC4KLSAgICAgKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0jaWZkZWYgREVCVUcKLSAgICBpZiAoREVCVUdfREVDT0RFKCkpIHsKLQkvKiBYWFggREVDT0RFX1BSSU5URiBtYXkgYmUgY2hhbmdlZCB0byBzb21ldGhpbmcgbW9yZQotCSAgIGdlbmVyYWwsIHNvIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRvIGxlYXZlIHRoZSBzdHJpbmdzCi0JICAgaW4gdGhlIHNhbWUgZm9ybWF0LCBldmVuIHRob3VnaCB0aGUgcmVzdWx0IGlzIHRoYXQgdGhlCi0JICAgYWJvdmUgdGVzdCBpcyBkb25lIHR3aWNlLiAqLwotICAgICAgIHN3aXRjaCAocmgpIHsKLQljYXNlIDA6Ci0JICAgIERFQ09ERV9QUklOVEYoIkFERFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMToKLQkgICAgREVDT0RFX1BSSU5URigiT1JcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDI6Ci0JICAgIERFQ09ERV9QUklOVEYoIkFEQ1x0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMzoKLQkgICAgREVDT0RFX1BSSU5URigiU0JCXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA0OgotCSAgICBERUNPREVfUFJJTlRGKCJBTkRcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDU6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNVQlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNjoKLQkgICAgREVDT0RFX1BSSU5URigiWE9SXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA3OgotCSAgICBERUNPREVfUFJJTlRGKCJDTVBcdCIpOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotI2VuZGlmCi0gICAgLyoga25vdyBvcGVyYXRpb24sIGRlY29kZSB0aGUgbW9kIGJ5dGUgdG8gZmluZCB0aGUgYWRkcmVzc2luZwotICAgICAgIG1vZGUuICovCi0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsLGltbTsKLQotCSAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgaW1tID0gKHM4KSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGM4M19sb25nX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOwotCSAgICBpZiAocmggIT0gNykKLQkJc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsLGltbTsKLQotCSAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBpbW0gPSAoczgpIGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wYzgzX3dvcmRfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGltbSk7Ci0JICAgIGlmIChyaCAhPSA3KQotCQlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWwsaW1tOwotCi0JICAgIERFQ09ERV9QUklOVEYoIkRXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBpbW0gPSAoczgpIGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wYzgzX2xvbmdfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGltbSk7Ci0JICAgIGlmIChyaCAhPSA3KQotCQlzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWwsaW1tOwotCi0JICAgIERFQ09ERV9QUklOVEYoIldPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIGltbSA9IChzOCkgZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjODNfd29yZF9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgaW1tKTsKLQkgICAgaWYgKHJoICE9IDcpCi0JCXN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbCxpbW07Ci0KLQkgICAgREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIGltbSA9IChzOCkgZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjODNfbG9uZ19vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgaW1tKTsKLQkgICAgaWYgKHJoICE9IDcpCi0JCXN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbCxpbW07Ci0KLQkgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgaW1tID0gKHM4KSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGM4M193b3JkX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOwotCSAgICBpZiAocmggIT0gNykKLQkJc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgZGVzdHZhbCxpbW07Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgaW1tID0gKHM4KSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGM4M19sb25nX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgaW1tKTsKLQkgICAgaWYgKHJoICE9IDcpCi0JCSpkZXN0cmVnID0gZGVzdHZhbDsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBkZXN0dmFsLGltbTsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBpbW0gPSAoczgpIGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wYzgzX3dvcmRfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCBpbW0pOwotCSAgICBpZiAocmggIT0gNykKLQkJKmRlc3RyZWcgPSBkZXN0dmFsOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ODQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3Rlc3RfYnl0ZV9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdTggKmRlc3RyZWcsICpzcmNyZWc7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotICAgIHU4IGRlc3R2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlRFU1RcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JdGVzdF9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQl0ZXN0X2J5dGUoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCXRlc3RfYnl0ZShkZXN0dmFsLCAqc3JjcmVnKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCXRlc3RfYnl0ZSgqZGVzdHJlZywgKnNyY3JlZyk7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDg1Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF90ZXN0X3dvcmRfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiVEVTVFx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHRlc3RfbG9uZyhkZXN0dmFsLCAqc3JjcmVnKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgdGVzdF93b3JkKGRlc3R2YWwsICpzcmNyZWcpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICB0ZXN0X2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHRlc3Rfd29yZChkZXN0dmFsLCAqc3JjcmVnKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgdGVzdF9sb25nKGRlc3R2YWwsICpzcmNyZWcpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICB0ZXN0X3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgdGVzdF9sb25nKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgdGVzdF93b3JkKCpkZXN0cmVnLCAqc3JjcmVnKTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDg2Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF94Y2hnX2J5dGVfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLSAgICB1OCBkZXN0dmFsOwotICAgIHU4IHRtcDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiWENIR1x0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQl0bXAgPSAqc3JjcmVnOwotCSpzcmNyZWcgPSBkZXN0dmFsOwotCWRlc3R2YWwgPSB0bXA7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQl0bXAgPSAqc3JjcmVnOwotCSpzcmNyZWcgPSBkZXN0dmFsOwotCWRlc3R2YWwgPSB0bXA7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQl0bXAgPSAqc3JjcmVnOwotCSpzcmNyZWcgPSBkZXN0dmFsOwotCWRlc3R2YWwgPSB0bXA7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JdG1wID0gKnNyY3JlZzsKLQkqc3JjcmVnID0gKmRlc3RyZWc7Ci0JKmRlc3RyZWcgPSB0bXA7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDg3Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF94Y2hnX3dvcmRfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiWENIR1x0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpzcmNyZWc7Ci0JICAgIHUzMiBkZXN0dmFsLHRtcDsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICB0bXAgPSAqc3JjcmVnOwotCSAgICAqc3JjcmVnID0gZGVzdHZhbDsKLQkgICAgZGVzdHZhbCA9IHRtcDsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqc3JjcmVnOwotCSAgICB1MTYgZGVzdHZhbCx0bXA7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgdG1wID0gKnNyY3JlZzsKLQkgICAgKnNyY3JlZyA9IGRlc3R2YWw7Ci0JICAgIGRlc3R2YWwgPSB0bXA7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKnNyY3JlZzsKLQkgICAgdTMyIGRlc3R2YWwsdG1wOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHRtcCA9ICpzcmNyZWc7Ci0JICAgICpzcmNyZWcgPSBkZXN0dmFsOwotCSAgICBkZXN0dmFsID0gdG1wOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpzcmNyZWc7Ci0JICAgIHUxNiBkZXN0dmFsLHRtcDsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICB0bXAgPSAqc3JjcmVnOwotCSAgICAqc3JjcmVnID0gZGVzdHZhbDsKLQkgICAgZGVzdHZhbCA9IHRtcDsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqc3JjcmVnOwotCSAgICB1MzIgZGVzdHZhbCx0bXA7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgdG1wID0gKnNyY3JlZzsKLQkgICAgKnNyY3JlZyA9IGRlc3R2YWw7Ci0JICAgIGRlc3R2YWwgPSB0bXA7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKnNyY3JlZzsKLQkgICAgdTE2IGRlc3R2YWwsdG1wOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHRtcCA9ICpzcmNyZWc7Ci0JICAgICpzcmNyZWcgPSBkZXN0dmFsOwotCSAgICBkZXN0dmFsID0gdG1wOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKLQkgICAgdTMyIHRtcDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgdG1wID0gKnNyY3JlZzsKLQkgICAgKnNyY3JlZyA9ICpkZXN0cmVnOwotCSAgICAqZGVzdHJlZyA9IHRtcDsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKLQkgICAgdTE2IHRtcDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgdG1wID0gKnNyY3JlZzsKLQkgICAgKnNyY3JlZyA9ICpkZXN0cmVnOwotCSAgICAqZGVzdHJlZyA9IHRtcDsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDg4Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3ZfYnl0ZV9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdTggKmRlc3RyZWcsICpzcmNyZWc7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJNT1ZcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCAqc3JjcmVnKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCAqc3JjcmVnKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCAqc3JjcmVnKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gKnNyY3JlZzsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ODkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdl93b3JkX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk1PVlx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsICpzcmNyZWcpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCAqc3JjcmVnKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgKnNyY3JlZyk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpzcmNyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsICpzcmNyZWcpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqc3JjcmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCAqc3JjcmVnKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKnNyY3JlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgKnNyY3JlZyk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSAqc3JjcmVnOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9ICpzcmNyZWc7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg4YQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92X2J5dGVfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotICAgIHU4IHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTU9WXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IHNyY3ZhbDsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gc3JjdmFsOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBzcmN2YWw7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9ICpzcmNyZWc7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDhiCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3Zfd29yZF9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk1PVlx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc3JjdmFsOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzcmN2YWw7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc3JjdmFsOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzcmN2YWw7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWcsICpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gKnNyY3JlZzsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWcsICpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gKnNyY3JlZzsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDhjCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3Zfd29yZF9STV9TUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHUxNiAqZGVzdHJlZywgKnNyY3JlZzsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0gICAgdTE2IGRlc3R2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk1PVlx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IGRlY29kZV9ybV9zZWdfcmVnaXN0ZXIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gKnNyY3JlZzsKLQlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gZGVjb2RlX3JtX3NlZ19yZWdpc3RlcihyaCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSAqc3JjcmVnOwotCXN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBkZWNvZGVfcm1fc2VnX3JlZ2lzdGVyKHJoKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9ICpzcmNyZWc7Ci0Jc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY3JlZyA9IGRlY29kZV9ybV9zZWdfcmVnaXN0ZXIocmgpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9ICpzcmNyZWc7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDhkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9sZWFfd29yZF9SX00odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1MTYgKnNyY3JlZzsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0KLS8qCi0gKiBUT0RPOiBOZWVkIHRvIGhhbmRsZSBhZGRyZXNzIHNpemUgcHJlZml4IQotICoKLSAqIGxlYSAgZWF4LFtlYXgrZWJ4KjJdID8/Ci0gKi8KLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTEVBXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCXNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqc3JjcmVnID0gKHUxNilkZXN0b2Zmc2V0OwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKnNyY3JlZyA9ICh1MTYpZGVzdG9mZnNldDsKLQlicmVhazsKLSAgICBjYXNlIDI6Ci0Jc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpzcmNyZWcgPSAodTE2KWRlc3RvZmZzZXQ7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JLyogdW5kZWZpbmVkLiAgRG8gbm90aGluZy4gKi8KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4OGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdl93b3JkX1NSX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdTE2ICpkZXN0cmVnLCAqc3JjcmVnOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotICAgIHUxNiBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk1PVlx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkZXN0cmVnID0gZGVjb2RlX3JtX3NlZ19yZWdpc3RlcihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IHNyY3ZhbDsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZGVzdHJlZyA9IGRlY29kZV9ybV9zZWdfcmVnaXN0ZXIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBzcmN2YWw7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRlc3RyZWcgPSBkZWNvZGVfcm1fc2VnX3JlZ2lzdGVyKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gc3JjdmFsOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBkZWNvZGVfcm1fc2VnX3JlZ2lzdGVyKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9ICpzcmNyZWc7Ci0JYnJlYWs7Ci0gICAgfQotICAgIC8qCi0gICAgICogQ2xlYW4gdXAsIGFuZCByZXNldCBhbGwgdGhlIFJfeFNQIHBvaW50ZXJzIHRvIHRoZSBjb3JyZWN0Ci0gICAgICogbG9jYXRpb25zLiAgVGhpcyBpcyBhYm91dCAzeCB0b28gbXVjaCBvdmVyaGVhZCAoZG9pbmcgYWxsIHRoZQotICAgICAqIHNlZ3JlZyBwdHJzIHdoZW4gb25seSBvbmUgaXMgbmVlZGVkLCBidXQgdGhpcyBpbnN0cnVjdGlvbgotICAgICAqICpjYW5ub3QqIGJlIHRoYXQgY29tbW9uLCBhbmQgdGhpcyBpc24ndCB0b28gbXVjaCB3b3JrIGFueXdheS4KLSAgICAgKi8KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg4ZgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcG9wX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJQT1BcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgaWYgKHJoICE9IDApIHsKLQlERUNPREVfUFJJTlRGKCJJTExFR0FMIERFQ09ERSBPRiBPUENPREUgOEZcbiIpOwotCUhBTFRfU1lTKCk7Ci0gICAgfQotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBwb3BfbG9uZygpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gcG9wX3dvcmQoKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IHBvcF9sb25nKCk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBwb3Bfd29yZCgpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gcG9wX2xvbmcoKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IHBvcF93b3JkKCk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHBvcF9sb25nKCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gcG9wX3dvcmQoKTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDkwCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9ub3AodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTk9QXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDkxCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfQ1godTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUzMiB0bXA7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlhDSEdcdEVBWCxFQ1hcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiWENIR1x0QVgsQ1hcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCXRtcCA9IE0ueDg2LlJfRUFYOwotCU0ueDg2LlJfRUFYID0gTS54ODYuUl9FQ1g7Ci0JTS54ODYuUl9FQ1ggPSB0bXA7Ci0gICAgfSBlbHNlIHsKLQl0bXAgPSBNLng4Ni5SX0FYOwotCU0ueDg2LlJfQVggPSBNLng4Ni5SX0NYOwotCU0ueDg2LlJfQ1ggPSAodTE2KXRtcDsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4OTIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9EWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTMyIHRtcDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiWENIR1x0RUFYLEVEWFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJYQ0hHXHRBWCxEWFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JdG1wID0gTS54ODYuUl9FQVg7Ci0JTS54ODYuUl9FQVggPSBNLng4Ni5SX0VEWDsKLQlNLng4Ni5SX0VEWCA9IHRtcDsKLSAgICB9IGVsc2UgewotCXRtcCA9IE0ueDg2LlJfQVg7Ci0JTS54ODYuUl9BWCA9IE0ueDg2LlJfRFg7Ci0JTS54ODYuUl9EWCA9ICh1MTYpdG1wOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg5MwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfeGNoZ193b3JkX0FYX0JYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MzIgdG1wOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJYQ0hHXHRFQVgsRUJYXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlhDSEdcdEFYLEJYXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQl0bXAgPSBNLng4Ni5SX0VBWDsKLQlNLng4Ni5SX0VBWCA9IE0ueDg2LlJfRUJYOwotCU0ueDg2LlJfRUJYID0gdG1wOwotICAgIH0gZWxzZSB7Ci0JdG1wID0gTS54ODYuUl9BWDsKLQlNLng4Ni5SX0FYID0gTS54ODYuUl9CWDsKLQlNLng4Ni5SX0JYID0gKHUxNil0bXA7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDk0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfU1AodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUzMiB0bXA7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlhDSEdcdEVBWCxFU1BcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiWENIR1x0QVgsU1BcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCXRtcCA9IE0ueDg2LlJfRUFYOwotCU0ueDg2LlJfRUFYID0gTS54ODYuUl9FU1A7Ci0JTS54ODYuUl9FU1AgPSB0bXA7Ci0gICAgfSBlbHNlIHsKLQl0bXAgPSBNLng4Ni5SX0FYOwotCU0ueDg2LlJfQVggPSBNLng4Ni5SX1NQOwotCU0ueDg2LlJfU1AgPSAodTE2KXRtcDsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4OTUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9CUCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTMyIHRtcDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiWENIR1x0RUFYLEVCUFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJYQ0hHXHRBWCxCUFxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JdG1wID0gTS54ODYuUl9FQVg7Ci0JTS54ODYuUl9FQVggPSBNLng4Ni5SX0VCUDsKLQlNLng4Ni5SX0VCUCA9IHRtcDsKLSAgICB9IGVsc2UgewotCXRtcCA9IE0ueDg2LlJfQVg7Ci0JTS54ODYuUl9BWCA9IE0ueDg2LlJfQlA7Ci0JTS54ODYuUl9CUCA9ICh1MTYpdG1wOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg5NgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfeGNoZ193b3JkX0FYX1NJKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MzIgdG1wOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJYQ0hHXHRFQVgsRVNJXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlhDSEdcdEFYLFNJXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQl0bXAgPSBNLng4Ni5SX0VBWDsKLQlNLng4Ni5SX0VBWCA9IE0ueDg2LlJfRVNJOwotCU0ueDg2LlJfRVNJID0gdG1wOwotICAgIH0gZWxzZSB7Ci0JdG1wID0gTS54ODYuUl9BWDsKLQlNLng4Ni5SX0FYID0gTS54ODYuUl9TSTsKLQlNLng4Ni5SX1NJID0gKHUxNil0bXA7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDk3Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfREkodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUzMiB0bXA7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlhDSEdcdEVBWCxFRElcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiWENIR1x0QVgsRElcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCXRtcCA9IE0ueDg2LlJfRUFYOwotCU0ueDg2LlJfRUFYID0gTS54ODYuUl9FREk7Ci0JTS54ODYuUl9FREkgPSB0bXA7Ci0gICAgfSBlbHNlIHsKLQl0bXAgPSBNLng4Ni5SX0FYOwotCU0ueDg2LlJfQVggPSBNLng4Ni5SX0RJOwotCU0ueDg2LlJfREkgPSAodTE2KXRtcDsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4OTgKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2Nidyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJDV0RFXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIkNCV1xuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JaWYgKE0ueDg2LlJfQVggJiAweDgwMDApIHsKLQkgICAgTS54ODYuUl9FQVggfD0gMHhmZmZmMDAwMDsKLQl9IGVsc2UgewotCSAgICBNLng4Ni5SX0VBWCAmPSAweDAwMDBmZmZmOwotCX0KLSAgICB9IGVsc2UgewotCWlmIChNLng4Ni5SX0FMICYgMHg4MCkgewotCSAgICBNLng4Ni5SX0FIID0gMHhmZjsKLQl9IGVsc2UgewotCSAgICBNLng4Ni5SX0FIID0gMHgwOwotCX0KLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4OTkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2N3ZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJDRFFcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiQ1dEXG4iKTsKLSAgICB9Ci0gICAgREVDT0RFX1BSSU5URigiQ1dEXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCWlmIChNLng4Ni5SX0VBWCAmIDB4ODAwMDAwMDApIHsKLQkgICAgTS54ODYuUl9FRFggPSAweGZmZmZmZmZmOwotCX0gZWxzZSB7Ci0JICAgIE0ueDg2LlJfRURYID0gMHgwOwotCX0KLSAgICB9IGVsc2UgewotCWlmIChNLng4Ni5SX0FYICYgMHg4MDAwKSB7Ci0JICAgIE0ueDg2LlJfRFggPSAweGZmZmY7Ci0JfSBlbHNlIHsKLQkgICAgTS54ODYuUl9EWCA9IDB4MDsKLQl9Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDlhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9jYWxsX2Zhcl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUxNiBmYXJzZWcsIGZhcm9mZjsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0JREVDT0RFX1BSSU5URigiQ0FMTFx0Iik7Ci0JZmFyb2ZmID0gZmV0Y2hfd29yZF9pbW0oKTsKLQlmYXJzZWcgPSBmZXRjaF93b3JkX2ltbSgpOwotCURFQ09ERV9QUklOVEYyKCIlMDR4OiIsIGZhcnNlZyk7Ci0JREVDT0RFX1BSSU5URjIoIiUwNHhcbiIsIGZhcm9mZik7Ci0JQ0FMTF9UUkFDRShNLng4Ni5zYXZlZF9jcywgTS54ODYuc2F2ZWRfaXAsIGZhcnNlZywgZmFyb2ZmLCAiRkFSICIpOwotCi0gICAgLyogWFhYCi0gICAgICoKLSAgICAgKiBIb29rZWQgaW50ZXJydXB0IHZlY3RvcnMgY2FsbGluZyBpbnRvIG91ciAiQklPUyIgd2lsbCBjYXVzZQotICAgICAqIHByb2JsZW1zIHVubGVzcyBhbGwgaW50ZXJzZWdtZW50IHN0dWZmIGlzIGNoZWNrZWQgZm9yIEJJT1MKLSAgICAgKiBhY2Nlc3MuICBDaGVjayBuZWVkZWQgaGVyZS4gIEZvciBtb21lbnQsIGxldCBpdCBhbG9uZS4KLSAgICAgKi8KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIHB1c2hfd29yZChNLng4Ni5SX0NTKTsKLSAgICBNLng4Ni5SX0NTID0gZmFyc2VnOwotICAgIHB1c2hfd29yZChNLng4Ni5SX0lQKTsKLSAgICBNLng4Ni5SX0lQID0gZmFyb2ZmOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDliCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF93YWl0KHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIldBSVQiKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIC8qIE5BREEuICAqLwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDljCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9wdXNoZl93b3JkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MzIgZmxhZ3M7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlBVU0hGRFxuIik7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJQVVNIRlxuIik7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0KLSAgICAvKiBjbGVhciBvdXQgKmFsbCogYml0cyBub3QgcmVwcmVzZW50aW5nIGZsYWdzLCBhbmQgdHVybiBvbiByZWFsIGJpdHMgKi8KLSAgICBmbGFncyA9IChNLng4Ni5SX0VGTEcgJiBGX01TSykgfCBGX0FMV0FZU19PTjsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlwdXNoX2xvbmcoZmxhZ3MpOwotICAgIH0gZWxzZSB7Ci0JcHVzaF93b3JkKCh1MTYpZmxhZ3MpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHg5ZAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcG9wZl93b3JkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlBPUEZEXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlBPUEZcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRUZMRyA9IHBvcF9sb25nKCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0ZMRyA9IHBvcF93b3JkKCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDllCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9zYWhmKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlNBSEZcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgLyogY2xlYXIgdGhlIGxvd2VyIGJpdHMgb2YgdGhlIGZsYWcgcmVnaXN0ZXIgKi8KLSAgICBNLng4Ni5SX0ZMRyAmPSAweGZmZmZmZjAwOwotICAgIC8qIG9yIGluIHRoZSBBSCByZWdpc3RlciBpbnRvIHRoZSBmbGFncyByZWdpc3RlciAqLwotICAgIE0ueDg2LlJfRkxHIHw9IE0ueDg2LlJfQUg7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4OWYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2xhaGYodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTEFIRlxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLQlNLng4Ni5SX0FIID0gKHU4KShNLng4Ni5SX0ZMRyAmIDB4ZmYpOwotICAgIC8qdW5kb2N1bWVudGVkIFRDKysgYmVoYXZpb3I/Pz8gTm9wZS4gIEl0J3MgZG9jdW1lbnRlZCwgYnV0Ci0gICAgICAgeW91IGhhdmUgdG9vIGxvb2sgcmVhbCBoYXJkIHRvIG5vdGljZSBpdC4gKi8KLSAgICBNLng4Ni5SX0FIIHw9IDB4MjsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhhMAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92X0FMX01fSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MTYgb2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJNT1ZcdEFMLCIpOwotICAgIG9mZnNldCA9IGZldGNoX3dvcmRfaW1tKCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIlslMDR4XVxuIiwgb2Zmc2V0KTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfQUwgPSBmZXRjaF9kYXRhX2J5dGUob2Zmc2V0KTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhhMQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92X0FYX01fSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MTYgb2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBvZmZzZXQgPSBmZXRjaF93b3JkX2ltbSgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYyKCJNT1ZcdEVBWCxbJTA0eF1cbiIsIG9mZnNldCk7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGMigiTU9WXHRBWCxbJTA0eF1cbiIsIG9mZnNldCk7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FQVggPSBmZXRjaF9kYXRhX2xvbmcob2Zmc2V0KTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfQVggPSBmZXRjaF9kYXRhX3dvcmQob2Zmc2V0KTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YTIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdl9NX0FMX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTE2IG9mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTU9WXHQiKTsKLSAgICBvZmZzZXQgPSBmZXRjaF93b3JkX2ltbSgpOwotICAgIERFQ09ERV9QUklOVEYyKCJbJTA0eF0sQUxcbiIsIG9mZnNldCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBzdG9yZV9kYXRhX2J5dGUob2Zmc2V0LCBNLng4Ni5SX0FMKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhhMwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92X01fQVhfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MTYgb2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBvZmZzZXQgPSBmZXRjaF93b3JkX2ltbSgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYyKCJNT1ZcdFslMDR4XSxFQVhcbiIsIG9mZnNldCk7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGMigiTU9WXHRbJTA0eF0sQVhcbiIsIG9mZnNldCk7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0Jc3RvcmVfZGF0YV9sb25nKG9mZnNldCwgTS54ODYuUl9FQVgpOwotICAgIH0gZWxzZSB7Ci0Jc3RvcmVfZGF0YV93b3JkKG9mZnNldCwgTS54ODYuUl9BWCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGE0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3ZzX2J5dGUodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHU4ICB2YWw7Ci0gICAgdTMyIGNvdW50OwotICAgIGludCBpbmM7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk1PVlNcdEJZVEVcbiIpOwotICAgIGlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAvKiBkb3duICovCi0JaW5jID0gLTE7Ci0gICAgZWxzZQotCWluYyA9IDE7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBjb3VudCA9IDE7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiAoU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKSkgewotCS8qIGRvbnQgY2FyZSB3aGV0aGVyIFJFUEUgb3IgUkVQTkUgKi8KLQkvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KLQljb3VudCA9IE0ueDg2LlJfQ1g7Ci0JTS54ODYuUl9DWCA9IDA7Ci0JTS54ODYubW9kZSAmPSB+KFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSk7Ci0gICAgfQotICAgIHdoaWxlIChjb3VudC0tKSB7Ci0JdmFsID0gZmV0Y2hfZGF0YV9ieXRlKE0ueDg2LlJfU0kpOwotCXN0b3JlX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwgdmFsKTsKLQlNLng4Ni5SX1NJICs9IGluYzsKLQlNLng4Ni5SX0RJICs9IGluYzsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YTUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdnNfd29yZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTMyIHZhbDsKLSAgICBpbnQgaW5jOwotICAgIHUzMiBjb3VudDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiTU9WU1x0RFdPUkRcbiIpOwotCWlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAgICAvKiBkb3duICovCi0JICAgIGluYyA9IC00OwotCWVsc2UKLQkgICAgaW5jID0gNDsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIk1PVlNcdFdPUkRcbiIpOwotCWlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAgICAvKiBkb3duICovCi0JICAgIGluYyA9IC0yOwotCWVsc2UKLQkgICAgaW5jID0gMjsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBjb3VudCA9IDE7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiAoU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKSkgewotCS8qIGRvbnQgY2FyZSB3aGV0aGVyIFJFUEUgb3IgUkVQTkUgKi8KLQkvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KLQljb3VudCA9IE0ueDg2LlJfQ1g7Ci0JTS54ODYuUl9DWCA9IDA7Ci0JTS54ODYubW9kZSAmPSB+KFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSk7Ci0gICAgfQotICAgIHdoaWxlIChjb3VudC0tKSB7Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHZhbCA9IGZldGNoX2RhdGFfbG9uZyhNLng4Ni5SX1NJKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJLCB2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHZhbCA9IGZldGNoX2RhdGFfd29yZChNLng4Ni5SX1NJKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJLCAodTE2KXZhbCk7Ci0JfQotCU0ueDg2LlJfU0kgKz0gaW5jOwotCU0ueDg2LlJfREkgKz0gaW5jOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhhNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfY21wc19ieXRlKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBzOCB2YWwxLCB2YWwyOwotICAgIGludCBpbmM7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkNNUFNcdEJZVEVcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKEFDQ0VTU19GTEFHKEZfREYpKSAgIC8qIGRvd24gKi8KLQlpbmMgPSAtMTsKLSAgICBlbHNlCi0JaW5jID0gMTsKLQotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfUkVQRSkgewotCS8qIFJFUEUgICovCi0JLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCi0Jd2hpbGUgKE0ueDg2LlJfQ1ggIT0gMCkgewotCSAgICB2YWwxID0gZmV0Y2hfZGF0YV9ieXRlKE0ueDg2LlJfU0kpOwotCSAgICB2YWwyID0gZmV0Y2hfZGF0YV9ieXRlX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKLQkJICAgICBjbXBfYnl0ZSh2YWwxLCB2YWwyKTsKLQkgICAgTS54ODYuUl9DWCAtPSAxOwotCSAgICBNLng4Ni5SX1NJICs9IGluYzsKLQkgICAgTS54ODYuUl9ESSArPSBpbmM7Ci0JICAgIGlmIChBQ0NFU1NfRkxBRyhGX1pGKSA9PSAwKQotCQlicmVhazsKLQl9Ci0JTS54ODYubW9kZSAmPSB+U1lTTU9ERV9QUkVGSVhfUkVQRTsKLSAgICB9IGVsc2UgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9SRVBORSkgewotCS8qIFJFUE5FICAqLwotCS8qIG1vdmUgdGhlbSB1bnRpbCBDWCBpcyBaRVJPLiAqLwotCXdoaWxlIChNLng4Ni5SX0NYICE9IDApIHsKLQkgICAgdmFsMSA9IGZldGNoX2RhdGFfYnl0ZShNLng4Ni5SX1NJKTsKLQkgICAgdmFsMiA9IGZldGNoX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7Ci0JICAgIGNtcF9ieXRlKHZhbDEsIHZhbDIpOwotCSAgICBNLng4Ni5SX0NYIC09IDE7Ci0JICAgIE0ueDg2LlJfU0kgKz0gaW5jOwotCSAgICBNLng4Ni5SX0RJICs9IGluYzsKLQkgICAgaWYgKEFDQ0VTU19GTEFHKEZfWkYpKQotCQlicmVhazsgICAgICAgICAgLyogemVybyBmbGFnIHNldCBtZWFucyBlcXVhbCAqLwotCX0KLQlNLng4Ni5tb2RlICY9IH5TWVNNT0RFX1BSRUZJWF9SRVBORTsKLSAgICB9IGVsc2UgewotCXZhbDEgPSBmZXRjaF9kYXRhX2J5dGUoTS54ODYuUl9TSSk7Ci0JdmFsMiA9IGZldGNoX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7Ci0JY21wX2J5dGUodmFsMSwgdmFsMik7Ci0JTS54ODYuUl9TSSArPSBpbmM7Ci0JTS54ODYuUl9ESSArPSBpbmM7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGE3Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9jbXBzX3dvcmQodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUzMiB2YWwxLHZhbDI7Ci0gICAgaW50IGluYzsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiQ01QU1x0RFdPUkRcbiIpOwotCWlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAvKiBkb3duICovCi0JICAgIGluYyA9IC00OwotCWVsc2UKLQkgICAgaW5jID0gNDsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIkNNUFNcdFdPUkRcbiIpOwotCWlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAvKiBkb3duICovCi0JICAgIGluYyA9IC0yOwotCWVsc2UKLQkgICAgaW5jID0gMjsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX1JFUEUpIHsKLQkvKiBSRVBFICAqLwotCS8qIG1vdmUgdGhlbSB1bnRpbCBDWCBpcyBaRVJPLiAqLwotCXdoaWxlIChNLng4Ni5SX0NYICE9IDApIHsKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXZhbDEgPSBmZXRjaF9kYXRhX2xvbmcoTS54ODYuUl9TSSk7Ci0JCXZhbDIgPSBmZXRjaF9kYXRhX2xvbmdfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOwotCQljbXBfbG9uZyh2YWwxLCB2YWwyKTsKLQkgICAgfSBlbHNlIHsKLQkJdmFsMSA9IGZldGNoX2RhdGFfd29yZChNLng4Ni5SX1NJKTsKLQkJdmFsMiA9IGZldGNoX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7Ci0JCWNtcF93b3JkKCh1MTYpdmFsMSwgKHUxNil2YWwyKTsKLQkgICAgfQotCSAgICBNLng4Ni5SX0NYIC09IDE7Ci0JICAgIE0ueDg2LlJfU0kgKz0gaW5jOwotCSAgICBNLng4Ni5SX0RJICs9IGluYzsKLQkgICAgaWYgKEFDQ0VTU19GTEFHKEZfWkYpID09IDApCi0JCWJyZWFrOwotCX0KLQlNLng4Ni5tb2RlICY9IH5TWVNNT0RFX1BSRUZJWF9SRVBFOwotICAgIH0gZWxzZSBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX1JFUE5FKSB7Ci0JLyogUkVQTkUgICovCi0JLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCi0Jd2hpbGUgKE0ueDg2LlJfQ1ggIT0gMCkgewotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdmFsMSA9IGZldGNoX2RhdGFfbG9uZyhNLng4Ni5SX1NJKTsKLQkJdmFsMiA9IGZldGNoX2RhdGFfbG9uZ19hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7Ci0JCWNtcF9sb25nKHZhbDEsIHZhbDIpOwotCSAgICB9IGVsc2UgewotCQl2YWwxID0gZmV0Y2hfZGF0YV93b3JkKE0ueDg2LlJfU0kpOwotCQl2YWwyID0gZmV0Y2hfZGF0YV93b3JkX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKLQkJY21wX3dvcmQoKHUxNil2YWwxLCAodTE2KXZhbDIpOwotCSAgICB9Ci0JICAgIE0ueDg2LlJfQ1ggLT0gMTsKLQkgICAgTS54ODYuUl9TSSArPSBpbmM7Ci0JICAgIE0ueDg2LlJfREkgKz0gaW5jOwotCSAgICBpZiAoQUNDRVNTX0ZMQUcoRl9aRikpCi0JCWJyZWFrOyAgICAgICAgICAvKiB6ZXJvIGZsYWcgc2V0IG1lYW5zIGVxdWFsICovCi0JfQotCU0ueDg2Lm1vZGUgJj0gflNZU01PREVfUFJFRklYX1JFUE5FOwotICAgIH0gZWxzZSB7Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHZhbDEgPSBmZXRjaF9kYXRhX2xvbmcoTS54ODYuUl9TSSk7Ci0JICAgIHZhbDIgPSBmZXRjaF9kYXRhX2xvbmdfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOwotCSAgICBjbXBfbG9uZyh2YWwxLCB2YWwyKTsKLQl9IGVsc2UgewotCSAgICB2YWwxID0gZmV0Y2hfZGF0YV93b3JkKE0ueDg2LlJfU0kpOwotCSAgICB2YWwyID0gZmV0Y2hfZGF0YV93b3JkX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKLQkgICAgY21wX3dvcmQoKHUxNil2YWwxLCAodTE2KXZhbDIpOwotCX0KLQlNLng4Ni5SX1NJICs9IGluYzsKLQlNLng4Ni5SX0RJICs9IGluYzsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YTgKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3Rlc3RfQUxfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgaW1tOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJURVNUXHRBTCwiKTsKLSAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotICAgIERFQ09ERV9QUklOVEYyKCIlMDR4XG4iLCBpbW0pOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JdGVzdF9ieXRlKE0ueDg2LlJfQUwsICh1OClpbW0pOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGE5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF90ZXN0X0FYX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTMyIHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiVEVTVFx0RUFYLCIpOwotCXNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJURVNUXHRBWCwiKTsKLQlzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOwotICAgIH0KLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQl0ZXN0X2xvbmcoTS54ODYuUl9FQVgsIHNyY3ZhbCk7Ci0gICAgfSBlbHNlIHsKLQl0ZXN0X3dvcmQoTS54ODYuUl9BWCwgKHUxNilzcmN2YWwpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhhYQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfc3Rvc19ieXRlKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgaW5jOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJTVE9TXHRCWVRFXG4iKTsKLSAgICBpZiAoQUNDRVNTX0ZMQUcoRl9ERikpICAgLyogZG93biAqLwotCWluYyA9IC0xOwotICAgIGVsc2UKLQlpbmMgPSAxOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiAoU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKSkgewotCS8qIGRvbnQgY2FyZSB3aGV0aGVyIFJFUEUgb3IgUkVQTkUgKi8KLQkvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KLQl3aGlsZSAoTS54ODYuUl9DWCAhPSAwKSB7Ci0JICAgIHN0b3JlX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwgTS54ODYuUl9BTCk7Ci0JICAgIE0ueDg2LlJfQ1ggLT0gMTsKLQkgICAgTS54ODYuUl9ESSArPSBpbmM7Ci0JfQotCU0ueDg2Lm1vZGUgJj0gfihTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpOwotICAgIH0gZWxzZSB7Ci0Jc3RvcmVfZGF0YV9ieXRlX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJLCBNLng4Ni5SX0FMKTsKLQlNLng4Ni5SX0RJICs9IGluYzsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YWIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3N0b3Nfd29yZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IGluYzsKLSAgICB1MzIgY291bnQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIlNUT1NcdERXT1JEXG4iKTsKLQlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpICAgLyogZG93biAqLwotCSAgICBpbmMgPSAtNDsKLQllbHNlCi0JICAgIGluYyA9IDQ7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJTVE9TXHRXT1JEXG4iKTsKLQlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpICAgLyogZG93biAqLwotCSAgICBpbmMgPSAtMjsKLQllbHNlCi0JICAgIGluYyA9IDI7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgY291bnQgPSAxOwotICAgIGlmIChNLng4Ni5tb2RlICYgKFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSkpIHsKLQkvKiBkb250IGNhcmUgd2hldGhlciBSRVBFIG9yIFJFUE5FICovCi0JLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCi0JY291bnQgPSBNLng4Ni5SX0NYOwotCU0ueDg2LlJfQ1ggPSAwOwotCU0ueDg2Lm1vZGUgJj0gfihTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpOwotICAgIH0KLSAgICB3aGlsZSAoY291bnQtLSkgewotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICBzdG9yZV9kYXRhX2xvbmdfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREksIE0ueDg2LlJfRUFYKTsKLQl9IGVsc2UgewotCSAgICBzdG9yZV9kYXRhX3dvcmRfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREksIE0ueDg2LlJfQVgpOwotCX0KLQlNLng4Ni5SX0RJICs9IGluYzsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YWMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2xvZHNfYnl0ZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IGluYzsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTE9EU1x0QllURVxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoQUNDRVNTX0ZMQUcoRl9ERikpICAgLyogZG93biAqLwotCWluYyA9IC0xOwotICAgIGVsc2UKLQlpbmMgPSAxOwotICAgIGlmIChNLng4Ni5tb2RlICYgKFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSkpIHsKLQkvKiBkb250IGNhcmUgd2hldGhlciBSRVBFIG9yIFJFUE5FICovCi0JLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCi0Jd2hpbGUgKE0ueDg2LlJfQ1ggIT0gMCkgewotCSAgICBNLng4Ni5SX0FMID0gZmV0Y2hfZGF0YV9ieXRlKE0ueDg2LlJfU0kpOwotCSAgICBNLng4Ni5SX0NYIC09IDE7Ci0JICAgIE0ueDg2LlJfU0kgKz0gaW5jOwotCX0KLQlNLng4Ni5tb2RlICY9IH4oU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKTsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfQUwgPSBmZXRjaF9kYXRhX2J5dGUoTS54ODYuUl9TSSk7Ci0JTS54ODYuUl9TSSArPSBpbmM7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGFkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9sb2RzX3dvcmQodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBpbmM7Ci0gICAgdTMyIGNvdW50OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJMT0RTXHREV09SRFxuIik7Ci0JaWYgKEFDQ0VTU19GTEFHKEZfREYpKSAgIC8qIGRvd24gKi8KLQkgICAgaW5jID0gLTQ7Ci0JZWxzZQotCSAgICBpbmMgPSA0OwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiTE9EU1x0V09SRFxuIik7Ci0JaWYgKEFDQ0VTU19GTEFHKEZfREYpKSAgIC8qIGRvd24gKi8KLQkgICAgaW5jID0gLTI7Ci0JZWxzZQotCSAgICBpbmMgPSAyOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGNvdW50ID0gMTsKLSAgICBpZiAoTS54ODYubW9kZSAmIChTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpKSB7Ci0JLyogZG9udCBjYXJlIHdoZXRoZXIgUkVQRSBvciBSRVBORSAqLwotCS8qIG1vdmUgdGhlbSB1bnRpbCBDWCBpcyBaRVJPLiAqLwotCWNvdW50ID0gTS54ODYuUl9DWDsKLQlNLng4Ni5SX0NYID0gMDsKLQlNLng4Ni5tb2RlICY9IH4oU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKTsKLSAgICB9Ci0gICAgd2hpbGUgKGNvdW50LS0pIHsKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgTS54ODYuUl9FQVggPSBmZXRjaF9kYXRhX2xvbmcoTS54ODYuUl9TSSk7Ci0JfSBlbHNlIHsKLQkgICAgTS54ODYuUl9BWCA9IGZldGNoX2RhdGFfd29yZChNLng4Ni5SX1NJKTsKLQl9Ci0JTS54ODYuUl9TSSArPSBpbmM7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGFlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9zY2FzX2J5dGUodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHM4IHZhbDI7Ci0gICAgaW50IGluYzsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiU0NBU1x0QllURVxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoQUNDRVNTX0ZMQUcoRl9ERikpICAgLyogZG93biAqLwotCWluYyA9IC0xOwotICAgIGVsc2UKLQlpbmMgPSAxOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfUkVQRSkgewotCS8qIFJFUEUgICovCi0JLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCi0Jd2hpbGUgKE0ueDg2LlJfQ1ggIT0gMCkgewotCSAgICB2YWwyID0gZmV0Y2hfZGF0YV9ieXRlX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKLQkgICAgY21wX2J5dGUoTS54ODYuUl9BTCwgdmFsMik7Ci0JICAgIE0ueDg2LlJfQ1ggLT0gMTsKLQkgICAgTS54ODYuUl9ESSArPSBpbmM7Ci0JICAgIGlmIChBQ0NFU1NfRkxBRyhGX1pGKSA9PSAwKQotCQlicmVhazsKLQl9Ci0JTS54ODYubW9kZSAmPSB+U1lTTU9ERV9QUkVGSVhfUkVQRTsKLSAgICB9IGVsc2UgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9SRVBORSkgewotCS8qIFJFUE5FICAqLwotCS8qIG1vdmUgdGhlbSB1bnRpbCBDWCBpcyBaRVJPLiAqLwotCXdoaWxlIChNLng4Ni5SX0NYICE9IDApIHsKLQkgICAgdmFsMiA9IGZldGNoX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7Ci0JICAgIGNtcF9ieXRlKE0ueDg2LlJfQUwsIHZhbDIpOwotCSAgICBNLng4Ni5SX0NYIC09IDE7Ci0JICAgIE0ueDg2LlJfREkgKz0gaW5jOwotCSAgICBpZiAoQUNDRVNTX0ZMQUcoRl9aRikpCi0JCWJyZWFrOyAgICAgICAgICAvKiB6ZXJvIGZsYWcgc2V0IG1lYW5zIGVxdWFsICovCi0JfQotCU0ueDg2Lm1vZGUgJj0gflNZU01PREVfUFJFRklYX1JFUE5FOwotICAgIH0gZWxzZSB7Ci0JdmFsMiA9IGZldGNoX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7Ci0JY21wX2J5dGUoTS54ODYuUl9BTCwgdmFsMik7Ci0JTS54ODYuUl9ESSArPSBpbmM7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGFmCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9zY2FzX3dvcmQodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBpbmM7Ci0gICAgdTMyIHZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiU0NBU1x0RFdPUkRcbiIpOwotCWlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAvKiBkb3duICovCi0JICAgIGluYyA9IC00OwotCWVsc2UKLQkgICAgaW5jID0gNDsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIlNDQVNcdFdPUkRcbiIpOwotCWlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAvKiBkb3duICovCi0JICAgIGluYyA9IC0yOwotCWVsc2UKLQkgICAgaW5jID0gMjsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX1JFUEUpIHsKLQkvKiBSRVBFICAqLwotCS8qIG1vdmUgdGhlbSB1bnRpbCBDWCBpcyBaRVJPLiAqLwotCXdoaWxlIChNLng4Ni5SX0NYICE9IDApIHsKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXZhbCA9IGZldGNoX2RhdGFfbG9uZ19hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7Ci0JCWNtcF9sb25nKE0ueDg2LlJfRUFYLCB2YWwpOwotCSAgICB9IGVsc2UgewotCQl2YWwgPSBmZXRjaF9kYXRhX3dvcmRfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOwotCQljbXBfd29yZChNLng4Ni5SX0FYLCAodTE2KXZhbCk7Ci0JICAgIH0KLQkgICAgTS54ODYuUl9DWCAtPSAxOwotCSAgICBNLng4Ni5SX0RJICs9IGluYzsKLQkgICAgaWYgKEFDQ0VTU19GTEFHKEZfWkYpID09IDApCi0JCWJyZWFrOwotCX0KLQlNLng4Ni5tb2RlICY9IH5TWVNNT0RFX1BSRUZJWF9SRVBFOwotICAgIH0gZWxzZSBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX1JFUE5FKSB7Ci0JLyogUkVQTkUgICovCi0JLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCi0Jd2hpbGUgKE0ueDg2LlJfQ1ggIT0gMCkgewotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdmFsID0gZmV0Y2hfZGF0YV9sb25nX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKLQkJY21wX2xvbmcoTS54ODYuUl9FQVgsIHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXZhbCA9IGZldGNoX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7Ci0JCWNtcF93b3JkKE0ueDg2LlJfQVgsICh1MTYpdmFsKTsKLQkgICAgfQotCSAgICBNLng4Ni5SX0NYIC09IDE7Ci0JICAgIE0ueDg2LlJfREkgKz0gaW5jOwotCSAgICBpZiAoQUNDRVNTX0ZMQUcoRl9aRikpCi0JCWJyZWFrOyAgICAgICAgICAvKiB6ZXJvIGZsYWcgc2V0IG1lYW5zIGVxdWFsICovCi0JfQotCU0ueDg2Lm1vZGUgJj0gflNZU01PREVfUFJFRklYX1JFUE5FOwotICAgIH0gZWxzZSB7Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHZhbCA9IGZldGNoX2RhdGFfbG9uZ19hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7Ci0JICAgIGNtcF9sb25nKE0ueDg2LlJfRUFYLCB2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHZhbCA9IGZldGNoX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7Ci0JICAgIGNtcF93b3JkKE0ueDg2LlJfQVgsICh1MTYpdmFsKTsKLQl9Ci0JTS54ODYuUl9ESSArPSBpbmM7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGIwCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3ZfYnl0ZV9BTF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHU4IGltbTsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTU9WXHRBTCwiKTsKLSAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfQUwgPSBpbW07Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YjEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdl9ieXRlX0NMX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTggaW1tOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJNT1ZcdENMLCIpOwotICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9DTCA9IGltbTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhiMgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92X2J5dGVfRExfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1OCBpbW07Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk1PVlx0REwsIik7Ci0gICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0RMID0gaW1tOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGIzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3ZfYnl0ZV9CTF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHU4IGltbTsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTU9WXHRCTCwiKTsKLSAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfQkwgPSBpbW07Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YjQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdl9ieXRlX0FIX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTggaW1tOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJNT1ZcdEFILCIpOwotICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9BSCA9IGltbTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhiNQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92X2J5dGVfQ0hfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1OCBpbW07Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk1PVlx0Q0gsIik7Ci0gICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0NIID0gaW1tOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGI2Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3ZfYnl0ZV9ESF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHU4IGltbTsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTU9WXHRESCwiKTsKLSAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfREggPSBpbW07Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YjcKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdl9ieXRlX0JIX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTggaW1tOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJNT1ZcdEJILCIpOwotICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9CSCA9IGltbTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhiOAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92X3dvcmRfQVhfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MzIgc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJNT1ZcdEVBWCwiKTsKLQlzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiTU9WXHRBWCwiKTsKLQlzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOwotICAgIH0KLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VBWCA9IHNyY3ZhbDsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfQVggPSAodTE2KXNyY3ZhbDsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YjkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdl93b3JkX0NYX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTMyIHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiTU9WXHRFQ1gsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIk1PVlx0Q1gsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKLSAgICB9Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FQ1ggPSBzcmN2YWw7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0NYID0gKHUxNilzcmN2YWw7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGJhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3Zfd29yZF9EWF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUzMiBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIk1PVlx0RURYLCIpOwotCXNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJNT1ZcdERYLCIpOwotCXNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7Ci0gICAgfQotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRURYID0gc3JjdmFsOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9EWCA9ICh1MTYpc3JjdmFsOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhiYgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92X3dvcmRfQlhfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MzIgc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJNT1ZcdEVCWCwiKTsKLQlzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiTU9WXHRCWCwiKTsKLQlzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOwotICAgIH0KLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VCWCA9IHNyY3ZhbDsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfQlggPSAodTE2KXNyY3ZhbDsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YmMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdl93b3JkX1NQX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTMyIHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiTU9WXHRFU1AsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIk1PVlx0U1AsIik7Ci0Jc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKLSAgICB9Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FU1AgPSBzcmN2YWw7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX1NQID0gKHUxNilzcmN2YWw7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGJkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9tb3Zfd29yZF9CUF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUzMiBzcmN2YWw7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIk1PVlx0RUJQLCIpOwotCXNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7Ci0gICAgfSBlbHNlIHsKLQlERUNPREVfUFJJTlRGKCJNT1ZcdEJQLCIpOwotCXNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7Ci0gICAgfQotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCU0ueDg2LlJfRUJQID0gc3JjdmFsOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9CUCA9ICh1MTYpc3JjdmFsOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhiZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92X3dvcmRfU0lfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MzIgc3JjdmFsOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGKCJNT1ZcdEVTSSwiKTsKLQlzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiTU9WXHRTSSwiKTsKLQlzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOwotICAgIH0KLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VTSSA9IHNyY3ZhbDsKLSAgICB9IGVsc2UgewotCU0ueDg2LlJfU0kgPSAodTE2KXNyY3ZhbDsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YmYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX21vdl93b3JkX0RJX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTMyIHNyY3ZhbDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JREVDT0RFX1BSSU5URigiTU9WXHRFREksIik7Ci0Jc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIk1PVlx0REksIik7Ci0Jc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKLSAgICB9Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FREkgPSBzcmN2YWw7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0RJID0gKHUxNilzcmN2YWw7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyogdXNlZCBieSBvcGNvZGVzIGMwLCBkMCwgYW5kIGQyLiAqLwotc3RhdGljIHU4KCpvcGNEMF9ieXRlX29wZXJhdGlvbltdKSh1OCBkLCB1OCBzKSA9Ci17Ci0gICAgcm9sX2J5dGUsCi0gICAgcm9yX2J5dGUsCi0gICAgcmNsX2J5dGUsCi0gICAgcmNyX2J5dGUsCi0gICAgc2hsX2J5dGUsCi0gICAgc2hyX2J5dGUsCi0gICAgc2hsX2J5dGUsICAgICAgICAgICAvKiBzYWxfYnl0ZSA9PT0gc2hsX2J5dGUgIGJ5IGRlZmluaXRpb24gKi8KLSAgICBzYXJfYnl0ZSwKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhjMAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfb3BjQzBfYnl0ZV9STV9NRU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1OCAqZGVzdHJlZzsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0gICAgdTggZGVzdHZhbDsKLSAgICB1OCBhbXQ7Ci0KLSAgICAvKgotICAgICAqIFlldCBhbm90aGVyIHdlaXJkbyBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgUGFydCBvZgotICAgICAqIHRoZSBvcGNvZGUgaGVsZCBiZWxvdyBpbiAiUkgiLiAgRG91Ymx5IG5lc3RlZCBjYXNlIHdvdWxkCi0gICAgICogcmVzdWx0LCBleGNlcHQgdGhhdCB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbgotICAgICAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSNpZmRlZiBERUJVRwotICAgIGlmIChERUJVR19ERUNPREUoKSkgewotCS8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCi0JICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKLQkgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKLQkgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCi0KLQlzd2l0Y2ggKHJoKSB7Ci0JY2FzZSAwOgotCSAgICBERUNPREVfUFJJTlRGKCJST0xcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDE6Ci0JICAgIERFQ09ERV9QUklOVEYoIlJPUlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMjoKLQkgICAgREVDT0RFX1BSSU5URigiUkNMXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAzOgotCSAgICBERUNPREVfUFJJTlRGKCJSQ1JcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDQ6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNITFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNToKLQkgICAgREVDT0RFX1BSSU5URigiU0hSXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA2OgotCSAgICBERUNPREVfUFJJTlRGKCJTQUxcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDc6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNBUlx0Iik7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0jZW5kaWYKLSAgICAvKiBrbm93IG9wZXJhdGlvbiwgZGVjb2RlIHRoZSBtb2QgYnl0ZSB0byBmaW5kIHRoZSBhZGRyZXNzaW5nCi0gICAgICAgbW9kZS4gKi8KLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JYW10ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQlERUNPREVfUFJJTlRGMigiLCV4XG4iLCBhbXQpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gKCpvcGNEMF9ieXRlX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCWFtdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JREVDT0RFX1BSSU5URjIoIiwleFxuIiwgYW10KTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9ICgqb3BjRDBfYnl0ZV9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgYW10KTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOwotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlhbXQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCURFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGFtdCk7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSAoKm9wY0QwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JYW10ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQlERUNPREVfUFJJTlRGMigiLCV4XG4iLCBhbXQpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9ICgqb3BjRDBfYnl0ZV9vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIGFtdCk7Ci0JKmRlc3RyZWcgPSBkZXN0dmFsOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qIHVzZWQgYnkgb3Bjb2RlcyBjMSwgZDEsIGFuZCBkMy4gKi8KLXN0YXRpYyB1MTYoKm9wY0QxX3dvcmRfb3BlcmF0aW9uW10pKHUxNiBzLCB1OCBkKSA9Ci17Ci0gICAgcm9sX3dvcmQsCi0gICAgcm9yX3dvcmQsCi0gICAgcmNsX3dvcmQsCi0gICAgcmNyX3dvcmQsCi0gICAgc2hsX3dvcmQsCi0gICAgc2hyX3dvcmQsCi0gICAgc2hsX3dvcmQsICAgICAgICAgICAvKiBzYWxfYnl0ZSA9PT0gc2hsX2J5dGUgIGJ5IGRlZmluaXRpb24gKi8KLSAgICBzYXJfd29yZCwKLX07Ci0KLS8qIHVzZWQgYnkgb3Bjb2RlcyBjMSwgZDEsIGFuZCBkMy4gKi8KLXN0YXRpYyB1MzIgKCpvcGNEMV9sb25nX29wZXJhdGlvbltdKSh1MzIgcywgdTggZCkgPQotewotICAgIHJvbF9sb25nLAotICAgIHJvcl9sb25nLAotICAgIHJjbF9sb25nLAotICAgIHJjcl9sb25nLAotICAgIHNobF9sb25nLAotICAgIHNocl9sb25nLAotICAgIHNobF9sb25nLCAgICAgICAgICAgLyogc2FsX2J5dGUgPT09IHNobF9ieXRlICBieSBkZWZpbml0aW9uICovCi0gICAgc2FyX2xvbmcsCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YzEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX29wY0MxX3dvcmRfUk1fTUVNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotICAgIHU4IGFtdDsKLQotICAgIC8qCi0gICAgICogWWV0IGFub3RoZXIgd2VpcmRvIHNwZWNpYWwgY2FzZSBpbnN0cnVjdGlvbiBmb3JtYXQuICBQYXJ0IG9mCi0gICAgICogdGhlIG9wY29kZSBoZWxkIGJlbG93IGluICJSSCIuICBEb3VibHkgbmVzdGVkIGNhc2Ugd291bGQKLSAgICAgKiByZXN1bHQsIGV4Y2VwdCB0aGF0IHRoZSBkZWNvZGVkIGluc3RydWN0aW9uCi0gICAgICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotI2lmZGVmIERFQlVHCi0gICAgaWYgKERFQlVHX0RFQ09ERSgpKSB7Ci0JLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKLQkgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncwotCSAgIGluIHRoZSBzYW1lIGZvcm1hdCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBpcyB0aGF0IHRoZQotCSAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KLQotCXN3aXRjaCAocmgpIHsKLQljYXNlIDA6Ci0JICAgIERFQ09ERV9QUklOVEYoIlJPTFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMToKLQkgICAgREVDT0RFX1BSSU5URigiUk9SXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgICBERUNPREVfUFJJTlRGKCJSQ0xcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDM6Ci0JICAgIERFQ09ERV9QUklOVEYoIlJDUlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNDoKLQkgICAgREVDT0RFX1BSSU5URigiU0hMXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA1OgotCSAgICBERUNPREVfUFJJTlRGKCJTSFJcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDY6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNBTFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNzoKLQkgICAgREVDT0RFX1BSSU5URigiU0FSXHQiKTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLSNlbmRpZgotICAgIC8qIGtub3cgb3BlcmF0aW9uLCBkZWNvZGUgdGhlIG1vZCBieXRlIHRvIGZpbmQgdGhlIGFkZHJlc3NpbmcKLSAgICAgICBtb2RlLiAqLwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQotCSAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgYW10ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgYW10KTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjRDFfbG9uZ19vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgYW10KTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCi0JICAgIERFQ09ERV9QUklOVEYoIldPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIGFtdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGFtdCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wY0QxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQotCSAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgYW10ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgYW10KTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjRDFfbG9uZ19vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgYW10KTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCi0JICAgIERFQ09ERV9QUklOVEYoIldPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIGFtdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGFtdCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wY0QxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQotCSAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgYW10ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgYW10KTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjRDFfbG9uZ19vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgYW10KTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCi0JICAgIERFQ09ERV9QUklOVEYoIldPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIGFtdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGFtdCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wY0QxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBhbXQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBhbXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9ICgqb3BjRDFfbG9uZ19vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIGFtdCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIGFtdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGFtdCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gKCpvcGNEMV93b3JkX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgYW10KTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGMyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9yZXRfbmVhcl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUxNiBpbW07Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlJFVFx0Iik7Ci0gICAgaW1tID0gZmV0Y2hfd29yZF9pbW0oKTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7Ci0JUkVUVVJOX1RSQUNFKCJSRVQiLE0ueDg2LnNhdmVkX2NzLE0ueDg2LnNhdmVkX2lwKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfSVAgPSBwb3Bfd29yZCgpOwotICAgIE0ueDg2LlJfU1AgKz0gaW1tOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGMzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9yZXRfbmVhcih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJSRVRcbiIpOwotCVJFVFVSTl9UUkFDRSgiUkVUIixNLng4Ni5zYXZlZF9jcyxNLng4Ni5zYXZlZF9pcCk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0lQID0gcG9wX3dvcmQoKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhjNAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbGVzX1JfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCByaCwgcmw7Ci0gICAgdTE2ICpkc3RyZWc7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkxFU1x0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZHN0cmVnID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JTS54ODYuUl9FUyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQgKyAyKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRzdHJlZyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCU0ueDg2LlJfRVMgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0ICsgMik7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkc3RyZWcgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQlNLng4Ni5SX0VTID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCArIDIpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCS8qIFVOREVGSU5FRCEgKi8KLQlUUkFDRV9BTkRfU1RFUCgpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhjNQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbGRzX1JfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCByaCwgcmw7Ci0gICAgdTE2ICpkc3RyZWc7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkxEU1x0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZHN0cmVnID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JTS54ODYuUl9EUyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQgKyAyKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRzdHJlZyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCU0ueDg2LlJfRFMgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0ICsgMik7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkc3RyZWcgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQlNLng4Ni5SX0RTID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCArIDIpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCS8qIFVOREVGSU5FRCEgKi8KLQlUUkFDRV9BTkRfU1RFUCgpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhjNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92X2J5dGVfUk1fSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdTggKmRlc3RyZWc7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotICAgIHU4IGltbTsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTU9WXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIGlmIChyaCAhPSAwKSB7Ci0JREVDT0RFX1BSSU5URigiSUxMRUdBTCBERUNPREUgT0YgT1BDT0RFIGM2XG4iKTsKLQlIQUxUX1NZUygpOwotICAgIH0KLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQlERUNPREVfUFJJTlRGMigiLCUyeFxuIiwgaW1tKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBpbW0pOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQlERUNPREVfUFJJTlRGMigiLCUyeFxuIiwgaW1tKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBpbW0pOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQlERUNPREVfUFJJTlRGMigiLCUyeFxuIiwgaW1tKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBpbW0pOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQlERUNPREVfUFJJTlRGMigiLCUyeFxuIiwgaW1tKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gaW1tOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhjNwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbW92X3dvcmRfUk1fSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJNT1ZcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgaWYgKHJoICE9IDApIHsKLQlERUNPREVfUFJJTlRGKCJJTExFR0FMIERFQ09ERSBPRiBPUENPREUgOEZcbiIpOwotCUhBTFRfU1lTKCk7Ci0gICAgfQotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgaW1tOwotCi0JICAgIERFQ09ERV9QUklOVEYoIkRXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBpbW0gPSBmZXRjaF9sb25nX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgaW1tKTsKLQl9IGVsc2UgewotCSAgICB1MTYgaW1tOwotCi0JICAgIERFQ09ERV9QUklOVEYoIldPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBpbW0pOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBpbW07Ci0KLQkgICAgREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIGltbSA9IGZldGNoX2xvbmdfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBpbW0pOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBpbW07Ci0KLQkgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgaW1tID0gZmV0Y2hfd29yZF9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGltbSk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGltbTsKLQotCSAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgaW1tID0gZmV0Y2hfbG9uZ19pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGltbSk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGltbTsKLQotCSAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBpbW0gPSBmZXRjaF93b3JkX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgaW1tKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCQl1MzIgKmRlc3RyZWc7Ci0JCQl1MzIgaW1tOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIGltbSA9IGZldGNoX2xvbmdfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gaW1tOwotCX0gZWxzZSB7Ci0JCQl1MTYgKmRlc3RyZWc7Ci0JCQl1MTYgaW1tOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gaW1tOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4YzgKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2VudGVyKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MTYgbG9jYWwsZnJhbWVfcG9pbnRlcjsKLSAgICB1OCAgbmVzdGluZzsKLSAgICBpbnQgaTsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgbG9jYWwgPSBmZXRjaF93b3JkX2ltbSgpOwotICAgIG5lc3RpbmcgPSBmZXRjaF9ieXRlX2ltbSgpOwotICAgIERFQ09ERV9QUklOVEYyKCJFTlRFUiAleFxuIiwgbG9jYWwpOwotICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIG5lc3RpbmcpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgcHVzaF93b3JkKE0ueDg2LlJfQlApOwotICAgIGZyYW1lX3BvaW50ZXIgPSBNLng4Ni5SX1NQOwotICAgIGlmIChuZXN0aW5nID4gMCkgewotCWZvciAoaSA9IDE7IGkgPCBuZXN0aW5nOyBpKyspIHsKLQkgICAgTS54ODYuUl9CUCAtPSAyOwotCSAgICBwdXNoX3dvcmQoZmV0Y2hfZGF0YV93b3JkX2FicyhNLng4Ni5SX1NTLCBNLng4Ni5SX0JQKSk7Ci0JICAgIH0KLQlwdXNoX3dvcmQoZnJhbWVfcG9pbnRlcik7Ci0JfQotICAgIE0ueDg2LlJfQlAgPSBmcmFtZV9wb2ludGVyOwotICAgIE0ueDg2LlJfU1AgPSAodTE2KShNLng4Ni5SX1NQIC0gbG9jYWwpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGM5Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9sZWF2ZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJMRUFWRVxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX1NQID0gTS54ODYuUl9CUDsKLSAgICBNLng4Ni5SX0JQID0gcG9wX3dvcmQoKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhjYQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfcmV0X2Zhcl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUxNiBpbW07Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlJFVEZcdCIpOwotICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOwotCVJFVFVSTl9UUkFDRSgiUkVURiIsTS54ODYuc2F2ZWRfY3MsTS54ODYuc2F2ZWRfaXApOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9JUCA9IHBvcF93b3JkKCk7Ci0gICAgTS54ODYuUl9DUyA9IHBvcF93b3JkKCk7Ci0gICAgTS54ODYuUl9TUCArPSBpbW07Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4Y2IKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3JldF9mYXIodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiUkVURlxuIik7Ci0JUkVUVVJOX1RSQUNFKCJSRVRGIixNLng4Ni5zYXZlZF9jcyxNLng4Ni5zYXZlZF9pcCk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0lQID0gcG9wX3dvcmQoKTsKLSAgICBNLng4Ni5SX0NTID0gcG9wX3dvcmQoKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhjYwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfaW50Myh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTE2IHRtcDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSU5UIDNcbiIpOwotICAgIHRtcCA9ICh1MTYpIG1lbV9hY2Nlc3Nfd29yZCgzICogNCArIDIpOwotICAgIC8qIGFjY2VzcyB0aGUgc2VnbWVudCByZWdpc3RlciAqLwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JaWYgKF9YODZFTVVfaW50clRhYlszXSkgewotCQkoKl9YODZFTVVfaW50clRhYlszXSkoMyk7Ci0gICAgfSBlbHNlIHsKLQlwdXNoX3dvcmQoKHUxNilNLng4Ni5SX0ZMRyk7Ci0JQ0xFQVJfRkxBRyhGX0lGKTsKLQlDTEVBUl9GTEFHKEZfVEYpOwotCXB1c2hfd29yZChNLng4Ni5SX0NTKTsKLQlNLng4Ni5SX0NTID0gbWVtX2FjY2Vzc193b3JkKDMgKiA0ICsgMik7Ci0JcHVzaF93b3JkKE0ueDg2LlJfSVApOwotCU0ueDg2LlJfSVAgPSBtZW1fYWNjZXNzX3dvcmQoMyAqIDQpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhjZAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfaW50X0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTE2IHRtcDsKLSAgICB1OCBpbnRudW07Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIklOVFx0Iik7Ci0gICAgaW50bnVtID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGludG51bSk7Ci0gICAgdG1wID0gbWVtX2FjY2Vzc193b3JkKGludG51bSAqIDQgKyAyKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCWlmIChfWDg2RU1VX2ludHJUYWJbaW50bnVtXSkgewotCQkoKl9YODZFTVVfaW50clRhYltpbnRudW1dKShpbnRudW0pOwotICAgIH0gZWxzZSB7Ci0JcHVzaF93b3JkKCh1MTYpTS54ODYuUl9GTEcpOwotCUNMRUFSX0ZMQUcoRl9JRik7Ci0JQ0xFQVJfRkxBRyhGX1RGKTsKLQlwdXNoX3dvcmQoTS54ODYuUl9DUyk7Ci0JTS54ODYuUl9DUyA9IG1lbV9hY2Nlc3Nfd29yZChpbnRudW0gKiA0ICsgMik7Ci0JcHVzaF93b3JkKE0ueDg2LlJfSVApOwotCU0ueDg2LlJfSVAgPSBtZW1fYWNjZXNzX3dvcmQoaW50bnVtICogNCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGNlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9pbnRvKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MTYgdG1wOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJJTlRPXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChBQ0NFU1NfRkxBRyhGX09GKSkgewotCXRtcCA9IG1lbV9hY2Nlc3Nfd29yZCg0ICogNCArIDIpOwotCQlpZiAoX1g4NkVNVV9pbnRyVGFiWzRdKSB7Ci0JCQkoKl9YODZFTVVfaW50clRhYls0XSkoNCk7Ci0JfSBlbHNlIHsKLQkgICAgcHVzaF93b3JkKCh1MTYpTS54ODYuUl9GTEcpOwotCSAgICBDTEVBUl9GTEFHKEZfSUYpOwotCSAgICBDTEVBUl9GTEFHKEZfVEYpOwotCSAgICBwdXNoX3dvcmQoTS54ODYuUl9DUyk7Ci0JICAgIE0ueDg2LlJfQ1MgPSBtZW1fYWNjZXNzX3dvcmQoNCAqIDQgKyAyKTsKLQkgICAgcHVzaF93b3JkKE0ueDg2LlJfSVApOwotCSAgICBNLng4Ni5SX0lQID0gbWVtX2FjY2Vzc193b3JkKDQgKiA0KTsKLQl9Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGNmCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9pcmV0KHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIklSRVRcbiIpOwotCi0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLQotICAgIE0ueDg2LlJfSVAgPSBwb3Bfd29yZCgpOwotICAgIE0ueDg2LlJfQ1MgPSBwb3Bfd29yZCgpOwotICAgIE0ueDg2LlJfRkxHID0gcG9wX3dvcmQoKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhkMAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfb3BjRDBfYnl0ZV9STV8xKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdTggKmRlc3RyZWc7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotICAgIHU4IGRlc3R2YWw7Ci0KLSAgICAvKgotICAgICAqIFlldCBhbm90aGVyIHdlaXJkbyBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgUGFydCBvZgotICAgICAqIHRoZSBvcGNvZGUgaGVsZCBiZWxvdyBpbiAiUkgiLiAgRG91Ymx5IG5lc3RlZCBjYXNlIHdvdWxkCi0gICAgICogcmVzdWx0LCBleGNlcHQgdGhhdCB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbgotICAgICAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSNpZmRlZiBERUJVRwotICAgIGlmIChERUJVR19ERUNPREUoKSkgewotCS8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCi0JICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKLQkgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKLQkgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCi0Jc3dpdGNoIChyaCkgewotCWNhc2UgMDoKLQkgICAgREVDT0RFX1BSSU5URigiUk9MXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgICBERUNPREVfUFJJTlRGKCJST1JcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDI6Ci0JICAgIERFQ09ERV9QUklOVEYoIlJDTFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMzoKLQkgICAgREVDT0RFX1BSSU5URigiUkNSXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA0OgotCSAgICBERUNPREVfUFJJTlRGKCJTSExcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDU6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNIUlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNjoKLQkgICAgREVDT0RFX1BSSU5URigiU0FMXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA3OgotCSAgICBERUNPREVfUFJJTlRGKCJTQVJcdCIpOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotI2VuZGlmCi0gICAgLyoga25vdyBvcGVyYXRpb24sIGRlY29kZSB0aGUgbW9kIGJ5dGUgdG8gZmluZCB0aGUgYWRkcmVzc2luZwotICAgICAgIG1vZGUuICovCi0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIiwxXG4iKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9ICgqb3BjRDBfYnl0ZV9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgMSk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLDFcbiIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gKCpvcGNEMF9ieXRlX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCAxKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOwotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsMVxuIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSAoKm9wY0QwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIDEpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCURFQ09ERV9QUklOVEYoIiwxXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSAoKm9wY0QwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCAxKTsKLQkqZGVzdHJlZyA9IGRlc3R2YWw7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGQxCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9vcGNEMV93b3JkX1JNXzEodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0KLSAgICAvKgotICAgICAqIFlldCBhbm90aGVyIHdlaXJkbyBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgUGFydCBvZgotICAgICAqIHRoZSBvcGNvZGUgaGVsZCBiZWxvdyBpbiAiUkgiLiAgRG91Ymx5IG5lc3RlZCBjYXNlIHdvdWxkCi0gICAgICogcmVzdWx0LCBleGNlcHQgdGhhdCB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbgotICAgICAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSNpZmRlZiBERUJVRwotICAgIGlmIChERUJVR19ERUNPREUoKSkgewotCS8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCi0JICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKLQkgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKLQkgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCi0Jc3dpdGNoIChyaCkgewotCWNhc2UgMDoKLQkgICAgREVDT0RFX1BSSU5URigiUk9MXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgICBERUNPREVfUFJJTlRGKCJST1JcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDI6Ci0JICAgIERFQ09ERV9QUklOVEYoIlJDTFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMzoKLQkgICAgREVDT0RFX1BSSU5URigiUkNSXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA0OgotCSAgICBERUNPREVfUFJJTlRGKCJTSExcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDU6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNIUlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNjoKLQkgICAgREVDT0RFX1BSSU5URigiU0FMXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA3OgotCSAgICBERUNPREVfUFJJTlRGKCJTQVJcdCIpOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotI2VuZGlmCi0gICAgLyoga25vdyBvcGVyYXRpb24sIGRlY29kZSB0aGUgbW9kIGJ5dGUgdG8gZmluZCB0aGUgYWRkcmVzc2luZwotICAgICAgIG1vZGUuICovCi0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCi0JICAgIERFQ09ERV9QUklOVEYoIkRXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsMVxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wY0QxX2xvbmdfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIDEpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0KLQkgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLDFcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGNEMV93b3JkX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCAxKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCi0JICAgIERFQ09ERV9QUklOVEYoIkRXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsMVxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wY0QxX2xvbmdfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIDEpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0KLQkgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLDFcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGNEMV93b3JkX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCAxKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCi0JICAgIERFQ09ERV9QUklOVEYoIkRXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsMVxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wY0QxX2xvbmdfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIDEpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0KLQkgICAgREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLDFcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGNEMV93b3JkX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCAxKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJCXUzMiBkZXN0dmFsOwotCQkJdTMyICpkZXN0cmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwxXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjRDFfbG9uZ19vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIDEpOwotCSAgICAqZGVzdHJlZyA9IGRlc3R2YWw7Ci0JfSBlbHNlIHsKLQkJCXUxNiBkZXN0dmFsOwotCQkJdTE2ICpkZXN0cmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwxXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9ICgqb3BjRDFfd29yZF9vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIDEpOwotCSAgICAqZGVzdHJlZyA9IGRlc3R2YWw7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhkMgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfb3BjRDJfYnl0ZV9STV9DTCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHU4ICpkZXN0cmVnOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLSAgICB1OCBkZXN0dmFsOwotICAgIHU4IGFtdDsKLQotICAgIC8qCi0gICAgICogWWV0IGFub3RoZXIgd2VpcmRvIHNwZWNpYWwgY2FzZSBpbnN0cnVjdGlvbiBmb3JtYXQuICBQYXJ0IG9mCi0gICAgICogdGhlIG9wY29kZSBoZWxkIGJlbG93IGluICJSSCIuICBEb3VibHkgbmVzdGVkIGNhc2Ugd291bGQKLSAgICAgKiByZXN1bHQsIGV4Y2VwdCB0aGF0IHRoZSBkZWNvZGVkIGluc3RydWN0aW9uCi0gICAgICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotI2lmZGVmIERFQlVHCi0gICAgaWYgKERFQlVHX0RFQ09ERSgpKSB7Ci0JLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKLQkgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncwotCSAgIGluIHRoZSBzYW1lIGZvcm1hdCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBpcyB0aGF0IHRoZQotCSAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KLQlzd2l0Y2ggKHJoKSB7Ci0JY2FzZSAwOgotCSAgICBERUNPREVfUFJJTlRGKCJST0xcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDE6Ci0JICAgIERFQ09ERV9QUklOVEYoIlJPUlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMjoKLQkgICAgREVDT0RFX1BSSU5URigiUkNMXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAzOgotCSAgICBERUNPREVfUFJJTlRGKCJSQ1JcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDQ6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNITFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNToKLQkgICAgREVDT0RFX1BSSU5URigiU0hSXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA2OgotCSAgICBERUNPREVfUFJJTlRGKCJTQUxcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDc6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNBUlx0Iik7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0jZW5kaWYKLSAgICAvKiBrbm93IG9wZXJhdGlvbiwgZGVjb2RlIHRoZSBtb2QgYnl0ZSB0byBmaW5kIHRoZSBhZGRyZXNzaW5nCi0gICAgICAgbW9kZS4gKi8KLSAgICBhbXQgPSBNLng4Ni5SX0NMOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOwotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsQ0xcbiIpOwotCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlkZXN0dmFsID0gKCpvcGNEMF9ieXRlX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIixDTFxuIik7Ci0JZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCWRlc3R2YWwgPSAoKm9wY0QwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiLENMXG4iKTsKLQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9ICgqb3BjRDBfYnl0ZV9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgYW10KTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQlERUNPREVfUFJJTlRGKCIsQ0xcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JZGVzdHZhbCA9ICgqb3BjRDBfYnl0ZV9vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIGFtdCk7Ci0JKmRlc3RyZWcgPSBkZXN0dmFsOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhkMwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfb3BjRDNfd29yZF9STV9DTCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLSAgICB1OCBhbXQ7Ci0KLSAgICAvKgotICAgICAqIFlldCBhbm90aGVyIHdlaXJkbyBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgUGFydCBvZgotICAgICAqIHRoZSBvcGNvZGUgaGVsZCBiZWxvdyBpbiAiUkgiLiAgRG91Ymx5IG5lc3RlZCBjYXNlIHdvdWxkCi0gICAgICogcmVzdWx0LCBleGNlcHQgdGhhdCB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbgotICAgICAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSNpZmRlZiBERUJVRwotICAgIGlmIChERUJVR19ERUNPREUoKSkgewotCS8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCi0JICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKLQkgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKLQkgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCi0Jc3dpdGNoIChyaCkgewotCWNhc2UgMDoKLQkgICAgREVDT0RFX1BSSU5URigiUk9MXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgICBERUNPREVfUFJJTlRGKCJST1JcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDI6Ci0JICAgIERFQ09ERV9QUklOVEYoIlJDTFx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMzoKLQkgICAgREVDT0RFX1BSSU5URigiUkNSXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA0OgotCSAgICBERUNPREVfUFJJTlRGKCJTSExcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDU6Ci0JICAgIERFQ09ERV9QUklOVEYoIlNIUlx0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNjoKLQkgICAgREVDT0RFX1BSSU5URigiU0FMXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA3OgotCSAgICBERUNPREVfUFJJTlRGKCJTQVJcdCIpOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotI2VuZGlmCi0gICAgLyoga25vdyBvcGVyYXRpb24sIGRlY29kZSB0aGUgbW9kIGJ5dGUgdG8gZmluZCB0aGUgYWRkcmVzc2luZwotICAgICAgIG1vZGUuICovCi0gICAgYW10ID0gTS54ODYuUl9DTDsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0KLQkgICAgREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wY0QxX2xvbmdfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQotCSAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGNEMV93b3JkX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0KLQkgICAgREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wY0QxX2xvbmdfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQotCSAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGNEMV93b3JkX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0KLQkgICAgREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSAoKm9wY0QxX2xvbmdfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQotCSAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gKCpvcGNEMV93b3JkX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSAoKm9wY0QxX2xvbmdfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCBhbXQpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9ICgqb3BjRDFfd29yZF9vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIGFtdCk7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhkNAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfYWFtKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1OCBhOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJBQU1cbiIpOwotICAgIGEgPSBmZXRjaF9ieXRlX2ltbSgpOyAgICAgIC8qIHRoaXMgaXMgYSBzdHVwaWQgZW5jb2RpbmcuICovCi0gICAgaWYgKGEgIT0gMTApIHsKLQlERUNPREVfUFJJTlRGKCJFUlJPUiBERUNPRElORyBBQU1cbiIpOwotCVRSQUNFX1JFR1MoKTsKLQlIQUxUX1NZUygpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIC8qIG5vdGUgdGhlIHR5cGUgY2hhbmdlIGhlcmUgLS0tIHJldHVybmluZyBBTCBhbmQgQUggaW4gQVguICovCi0gICAgTS54ODYuUl9BWCA9IGFhbV93b3JkKE0ueDg2LlJfQUwpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGQ1Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9hYWQodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHU4IGE7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkFBRFxuIik7Ci0gICAgYSA9IGZldGNoX2J5dGVfaW1tKCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0FYID0gYWFkX3dvcmQoTS54ODYuUl9BWCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKiBvcGNvZGUgMHhkNiBJTExFR0FMIE9QQ09ERSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZDcKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3hsYXQodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUxNiBhZGRyOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJYTEFUXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCWFkZHIgPSAodTE2KShNLng4Ni5SX0JYICsgKHU4KU0ueDg2LlJfQUwpOwotICAgIE0ueDg2LlJfQUwgPSBmZXRjaF9kYXRhX2J5dGUoYWRkcik7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKiBpbnN0dWN0aW9ucyAgRDggLi4gREYgYXJlIGluIGk4N19vcHMuYyAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZTAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2xvb3BuZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgczE2IGlwOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJMT09QTkVcdCIpOwotICAgIGlwID0gKHM4KSBmZXRjaF9ieXRlX2ltbSgpOwotICAgIGlwICs9IChzMTYpIE0ueDg2LlJfSVA7Ci0gICAgREVDT0RFX1BSSU5URjIoIiUwNHhcbiIsIGlwKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfQ1ggLT0gMTsKLSAgICBpZiAoTS54ODYuUl9DWCAhPSAwICYmICFBQ0NFU1NfRkxBRyhGX1pGKSkgICAgICAvKiBDWCAhPSAwIGFuZCAhWkYgKi8KLQlNLng4Ni5SX0lQID0gaXA7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZTEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2xvb3BlKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBzMTYgaXA7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkxPT1BFXHQiKTsKLSAgICBpcCA9IChzOCkgZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBpcCArPSAoczE2KSBNLng4Ni5SX0lQOwotICAgIERFQ09ERV9QUklOVEYyKCIlMDR4XG4iLCBpcCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5SX0NYIC09IDE7Ci0gICAgaWYgKE0ueDg2LlJfQ1ggIT0gMCAmJiBBQ0NFU1NfRkxBRyhGX1pGKSkgICAgICAgLyogQ1ggIT0gMCBhbmQgWkYgKi8KLQlNLng4Ni5SX0lQID0gaXA7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZTIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2xvb3AodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHMxNiBpcDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTE9PUFx0Iik7Ci0gICAgaXAgPSAoczgpIGZldGNoX2J5dGVfaW1tKCk7Ci0gICAgaXAgKz0gKHMxNikgTS54ODYuUl9JUDsKLSAgICBERUNPREVfUFJJTlRGMigiJTA0eFxuIiwgaXApOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9DWCAtPSAxOwotICAgIGlmIChNLng4Ni5SX0NYICE9IDApCi0JTS54ODYuUl9JUCA9IGlwOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGUzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9qY3h6KHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1MTYgdGFyZ2V0OwotICAgIHM4ICBvZmZzZXQ7Ci0KLSAgICAvKiBqdW1wIHRvIGJ5dGUgb2Zmc2V0IGlmIG92ZXJmbG93IGZsYWcgaXMgc2V0ICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJKQ1haXHQiKTsKLSAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgb2Zmc2V0KTsKLSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHRhcmdldCk7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYuUl9DWCA9PSAwKQotCU0ueDg2LlJfSVAgPSB0YXJnZXQ7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZTQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2luX2J5dGVfQUxfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1OCBwb3J0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJJTlx0Iik7Ci0JcG9ydCA9ICh1OCkgZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBERUNPREVfUFJJTlRGMigiJXgsQUxcbiIsIHBvcnQpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9BTCA9ICgqc3lzX2luYikocG9ydCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZTUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2luX3dvcmRfQVhfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICB1OCBwb3J0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJJTlx0Iik7Ci0JcG9ydCA9ICh1OCkgZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlERUNPREVfUFJJTlRGMigiRUFYLCV4XG4iLCBwb3J0KTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYyKCJBWCwleFxuIiwgcG9ydCk7Ci0gICAgfQotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JTS54ODYuUl9FQVggPSAoKnN5c19pbmwpKHBvcnQpOwotICAgIH0gZWxzZSB7Ci0JTS54ODYuUl9BWCA9ICgqc3lzX2ludykocG9ydCk7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGU2Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9vdXRfYnl0ZV9JTU1fQUwodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHU4IHBvcnQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk9VVFx0Iik7Ci0JcG9ydCA9ICh1OCkgZmV0Y2hfYnl0ZV9pbW0oKTsKLSAgICBERUNPREVfUFJJTlRGMigiJXgsQUxcbiIsIHBvcnQpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgKCpzeXNfb3V0YikocG9ydCwgTS54ODYuUl9BTCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZTcKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX291dF93b3JkX0lNTV9BWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTggcG9ydDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiT1VUXHQiKTsKLQlwb3J0ID0gKHU4KSBmZXRjaF9ieXRlX2ltbSgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYyKCIleCxFQVhcbiIsIHBvcnQpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URjIoIiV4LEFYXG4iLCBwb3J0KTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkoKnN5c19vdXRsKShwb3J0LCBNLng4Ni5SX0VBWCk7Ci0gICAgfSBlbHNlIHsKLQkoKnN5c19vdXR3KShwb3J0LCBNLng4Ni5SX0FYKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZTgKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2NhbGxfbmVhcl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHMxNiBpcDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0JREVDT0RFX1BSSU5URigiQ0FMTFx0Iik7Ci0JaXAgPSAoczE2KSBmZXRjaF93b3JkX2ltbSgpOwotCWlwICs9IChzMTYpIE0ueDg2LlJfSVA7ICAgIC8qIENIRUNLIFNJR04gKi8KLQlERUNPREVfUFJJTlRGMigiJTA0eFxuIiwgaXApOwotCUNBTExfVFJBQ0UoTS54ODYuc2F2ZWRfY3MsIE0ueDg2LnNhdmVkX2lwLCBNLng4Ni5SX0NTLCBpcCwgIiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgcHVzaF93b3JkKE0ueDg2LlJfSVApOwotICAgIE0ueDg2LlJfSVAgPSBpcDsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhlOQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfanVtcF9uZWFyX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IGlwOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJKTVBcdCIpOwotICAgIGlwID0gKHMxNilmZXRjaF93b3JkX2ltbSgpOwotICAgIGlwICs9IChzMTYpTS54ODYuUl9JUDsKLSAgICBERUNPREVfUFJJTlRGMigiJTA0eFxuIiwgaXApOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9JUCA9ICh1MTYpaXA7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZWEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2p1bXBfZmFyX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgdTE2IGNzLCBpcDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSk1QXHRGQVIgIik7Ci0gICAgaXAgPSBmZXRjaF93b3JkX2ltbSgpOwotICAgIGNzID0gZmV0Y2hfd29yZF9pbW0oKTsKLSAgICBERUNPREVfUFJJTlRGMigiJTA0eDoiLCBjcyk7Ci0gICAgREVDT0RFX1BSSU5URjIoIiUwNHhcbiIsIGlwKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfSVAgPSBpcDsKLSAgICBNLng4Ni5SX0NTID0gY3M7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZWIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2p1bXBfYnl0ZV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIHUxNiB0YXJnZXQ7Ci0gICAgczggb2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJKTVBcdCIpOwotICAgIG9mZnNldCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOwotICAgIHRhcmdldCA9ICh1MTYpKE0ueDg2LlJfSVAgKyBvZmZzZXQpOwotICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfSVAgPSB0YXJnZXQ7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZWMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2luX2J5dGVfQUxfRFgodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSU5cdEFMLERYXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfQUwgPSAoKnN5c19pbmIpKE0ueDg2LlJfRFgpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGVkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9pbl93b3JkX0FYX0RYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIklOXHRFQVgsRFhcbiIpOwotICAgIH0gZWxzZSB7Ci0JREVDT0RFX1BSSU5URigiSU5cdEFYLERYXG4iKTsKLSAgICB9Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQlNLng4Ni5SX0VBWCA9ICgqc3lzX2lubCkoTS54ODYuUl9EWCk7Ci0gICAgfSBlbHNlIHsKLQlNLng4Ni5SX0FYID0gKCpzeXNfaW53KShNLng4Ni5SX0RYKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZWUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX291dF9ieXRlX0RYX0FMKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk9VVFx0RFgsQUxcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgKCpzeXNfb3V0YikoTS54ODYuUl9EWCwgTS54ODYuUl9BTCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZWYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX291dF93b3JkX0RYX0FYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCURFQ09ERV9QUklOVEYoIk9VVFx0RFgsRUFYXG4iKTsKLSAgICB9IGVsc2UgewotCURFQ09ERV9QUklOVEYoIk9VVFx0RFgsQVhcbiIpOwotICAgIH0KLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSgqc3lzX291dGwpKE0ueDg2LlJfRFgsIE0ueDg2LlJfRUFYKTsKLSAgICB9IGVsc2UgewotCSgqc3lzX291dHcpKE0ueDg2LlJfRFgsIE0ueDg2LlJfQVgpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhmMAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfbG9jayh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJMT0NLOlxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qb3Bjb2RlIDB4ZjEgSUxMRUdBTCBPUEVSQVRJT04gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGYyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9yZXBuZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJSRVBORVxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfUFJFRklYX1JFUE5FOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGYzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9yZXBlKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlJFUEVcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1BSRUZJWF9SRVBFOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGY0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9oYWx0KHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkhBTFRcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgSEFMVF9TWVMoKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhmNQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfY21jKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICAvKiBjb21wbGVtZW50IHRoZSBjYXJyeSBmbGFnLiAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQ01DXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIFRPR0dMRV9GTEFHKEZfQ0YpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGY2Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9vcGNGNl9ieXRlX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdTggKmRlc3RyZWc7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotICAgIHU4IGRlc3R2YWwsIHNyY3ZhbDsKLQotICAgIC8qIGxvbmcsIGRyYXduIG91dCBjb2RlIGZvbGxvd3MuICBEb3VibGUgc3dpdGNoIGZvciBhIHRvdGFsCi0gICAgICAgb2YgMzIgY2FzZXMuICAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAvKiBtb2Q9MDAgKi8KLQlzd2l0Y2ggKHJoKSB7Ci0JY2FzZSAwOiAgICAgICAgIC8qIHRlc3QgYnl0ZSBpbW0gKi8KLQkgICAgREVDT0RFX1BSSU5URigiVEVTVFx0QllURSBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiJTAyeFxuIiwgc3JjdmFsKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgdGVzdF9ieXRlKGRlc3R2YWwsIHNyY3ZhbCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgMToKLQkgICAgREVDT0RFX1BSSU5URigiSUxMRUdBTCBPUCBNT0Q9MDAgUkg9MDEgT1A9RjZcbiIpOwotCSAgICBIQUxUX1NZUygpOwotCSAgICBicmVhazsKLQljYXNlIDI6Ci0JICAgIERFQ09ERV9QUklOVEYoIk5PVFx0QllURSBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IG5vdF9ieXRlKGRlc3R2YWwpOwotCSAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgMzoKLQkgICAgREVDT0RFX1BSSU5URigiTkVHXHRCWVRFIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gbmVnX2J5dGUoZGVzdHZhbCk7Ci0JICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA0OgotCSAgICBERUNPREVfUFJJTlRGKCJNVUxcdEJZVEUgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIG11bF9ieXRlKGRlc3R2YWwpOwotCSAgICBicmVhazsKLQljYXNlIDU6Ci0JICAgIERFQ09ERV9QUklOVEYoIklNVUxcdEJZVEUgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGltdWxfYnl0ZShkZXN0dmFsKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA2OgotCSAgICBERUNPREVfUFJJTlRGKCJESVZcdEJZVEUgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRpdl9ieXRlKGRlc3R2YWwpOwotCSAgICBicmVhazsKLQljYXNlIDc6Ci0JICAgIERFQ09ERV9QUklOVEYoIklESVZcdEJZVEUgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGlkaXZfYnl0ZShkZXN0dmFsKTsKLQkgICAgYnJlYWs7Ci0JfQotCWJyZWFrOyAgICAgICAgICAgICAgICAgIC8qIGVuZCBtb2Q9PTAwICovCi0gICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgIC8qIG1vZD0wMSAqLwotCXN3aXRjaCAocmgpIHsKLQljYXNlIDA6ICAgICAgICAgLyogdGVzdCBieXRlIGltbSAqLwotCSAgICBERUNPREVfUFJJTlRGKCJURVNUXHRCWVRFIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlMDJ4XG4iLCBzcmN2YWwpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICB0ZXN0X2J5dGUoZGVzdHZhbCwgc3JjdmFsKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgICBERUNPREVfUFJJTlRGKCJJTExFR0FMIE9QIE1PRD0wMSBSSD0wMSBPUD1GNlxuIik7Ci0JICAgIEhBTFRfU1lTKCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgMjoKLQkgICAgREVDT0RFX1BSSU5URigiTk9UXHRCWVRFIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gbm90X2J5dGUoZGVzdHZhbCk7Ci0JICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAzOgotCSAgICBERUNPREVfUFJJTlRGKCJORUdcdEJZVEUgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBuZWdfYnl0ZShkZXN0dmFsKTsKLQkgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICBicmVhazsKLQljYXNlIDQ6Ci0JICAgIERFQ09ERV9QUklOVEYoIk1VTFx0QllURSBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgbXVsX2J5dGUoZGVzdHZhbCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgNToKLQkgICAgREVDT0RFX1BSSU5URigiSU1VTFx0QllURSBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgaW11bF9ieXRlKGRlc3R2YWwpOwotCSAgICBicmVhazsKLQljYXNlIDY6Ci0JICAgIERFQ09ERV9QUklOVEYoIkRJVlx0QllURSBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGl2X2J5dGUoZGVzdHZhbCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgNzoKLQkgICAgREVDT0RFX1BSSU5URigiSURJVlx0QllURSBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgaWRpdl9ieXRlKGRlc3R2YWwpOwotCSAgICBicmVhazsKLQl9Ci0JYnJlYWs7ICAgICAgICAgICAgICAgICAgLyogZW5kIG1vZD09MDEgKi8KLSAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgLyogbW9kPTEwICovCi0Jc3dpdGNoIChyaCkgewotCWNhc2UgMDogICAgICAgICAvKiB0ZXN0IGJ5dGUgaW1tICovCi0JICAgIERFQ09ERV9QUklOVEYoIlRFU1RcdEJZVEUgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiUwMnhcbiIsIHNyY3ZhbCk7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHRlc3RfYnl0ZShkZXN0dmFsLCBzcmN2YWwpOwotCSAgICBicmVhazsKLQljYXNlIDE6Ci0JICAgIERFQ09ERV9QUklOVEYoIklMTEVHQUwgT1AgTU9EPTEwIFJIPTAxIE9QPUY2XG4iKTsKLQkgICAgSEFMVF9TWVMoKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgICBERUNPREVfUFJJTlRGKCJOT1RcdEJZVEUgUFRSICIpOwotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRlc3R2YWwgPSBub3RfYnl0ZShkZXN0dmFsKTsKLQkgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICBicmVhazsKLQljYXNlIDM6Ci0JICAgIERFQ09ERV9QUklOVEYoIk5FR1x0QllURSBQVFIgIik7Ci0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IG5lZ19ieXRlKGRlc3R2YWwpOwotCSAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgNDoKLQkgICAgREVDT0RFX1BSSU5URigiTVVMXHRCWVRFIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBtdWxfYnl0ZShkZXN0dmFsKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA1OgotCSAgICBERUNPREVfUFJJTlRGKCJJTVVMXHRCWVRFIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBpbXVsX2J5dGUoZGVzdHZhbCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgNjoKLQkgICAgREVDT0RFX1BSSU5URigiRElWXHRCWVRFIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkaXZfYnl0ZShkZXN0dmFsKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA3OgotCSAgICBERUNPREVfUFJJTlRGKCJJRElWXHRCWVRFIFBUUiAiKTsKLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBpZGl2X2J5dGUoZGVzdHZhbCk7Ci0JICAgIGJyZWFrOwotCX0KLQlicmVhazsgICAgICAgICAgICAgICAgICAvKiBlbmQgbW9kPT0xMCAqLwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiBtb2Q9MTEgKi8KLQlzd2l0Y2ggKHJoKSB7Ci0JY2FzZSAwOiAgICAgICAgIC8qIHRlc3QgYnl0ZSBpbW0gKi8KLQkgICAgREVDT0RFX1BSSU5URigiVEVTVFx0Iik7Ci0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiUwMnhcbiIsIHNyY3ZhbCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHRlc3RfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgICBERUNPREVfUFJJTlRGKCJJTExFR0FMIE9QIE1PRD0wMCBSSD0wMSBPUD1GNlxuIik7Ci0JICAgIEhBTFRfU1lTKCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgMjoKLQkgICAgREVDT0RFX1BSSU5URigiTk9UXHQiKTsKLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBub3RfYnl0ZSgqZGVzdHJlZyk7Ci0JICAgIGJyZWFrOwotCWNhc2UgMzoKLQkgICAgREVDT0RFX1BSSU5URigiTkVHXHQiKTsKLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBuZWdfYnl0ZSgqZGVzdHJlZyk7Ci0JICAgIGJyZWFrOwotCWNhc2UgNDoKLQkgICAgREVDT0RFX1BSSU5URigiTVVMXHQiKTsKLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgbXVsX2J5dGUoKmRlc3RyZWcpOyAgICAgIC8qISEhICAqLwotCSAgICBicmVhazsKLQljYXNlIDU6Ci0JICAgIERFQ09ERV9QUklOVEYoIklNVUxcdCIpOwotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBpbXVsX2J5dGUoKmRlc3RyZWcpOwotCSAgICBicmVhazsKLQljYXNlIDY6Ci0JICAgIERFQ09ERV9QUklOVEYoIkRJVlx0Iik7Ci0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGRpdl9ieXRlKCpkZXN0cmVnKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA3OgotCSAgICBERUNPREVfUFJJTlRGKCJJRElWXHQiKTsKLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgaWRpdl9ieXRlKCpkZXN0cmVnKTsKLQkgICAgYnJlYWs7Ci0JfQotCWJyZWFrOyAgICAgICAgICAgICAgICAgIC8qIGVuZCBtb2Q9PTExICovCi0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGY3Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9vcGNGN193b3JkX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotCi0gICAgLyogbG9uZywgZHJhd24gb3V0IGNvZGUgZm9sbG93cy4gIERvdWJsZSBzd2l0Y2ggZm9yIGEgdG90YWwKLSAgICAgICBvZiAzMiBjYXNlcy4gICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgIC8qIG1vZD0wMCAqLwotCXN3aXRjaCAocmgpIHsKLQljYXNlIDA6ICAgICAgICAgLyogdGVzdCB3b3JkIGltbSAqLwotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWwsc3JjdmFsOwotCi0JCURFQ09ERV9QUklOVEYoIlRFU1RcdERXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCIsIik7Ci0JCXNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7Ci0JCURFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJdGVzdF9sb25nKGRlc3R2YWwsIHNyY3ZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsLHNyY3ZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJURVNUXHRXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCIsIik7Ci0JCXNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7Ci0JCURFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJdGVzdF93b3JkKGRlc3R2YWwsIHNyY3ZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgICBERUNPREVfUFJJTlRGKCJJTExFR0FMIE9QIE1PRD0wMCBSSD0wMSBPUD1GN1xuIik7Ci0JICAgIEhBTFRfU1lTKCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgMjoKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIk5PVFx0RFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRlc3R2YWwgPSBub3RfbG9uZyhkZXN0dmFsKTsKLQkJc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJOT1RcdFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRlc3R2YWwgPSBub3Rfd29yZChkZXN0dmFsKTsKLQkJc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgMzoKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIk5FR1x0RFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRlc3R2YWwgPSBuZWdfbG9uZyhkZXN0dmFsKTsKLQkJc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJORUdcdFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRlc3R2YWwgPSBuZWdfd29yZChkZXN0dmFsKTsKLQkJc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgNDoKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIk1VTFx0RFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCW11bF9sb25nKGRlc3R2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJNVUxcdFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCW11bF93b3JkKGRlc3R2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgNToKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIklNVUxcdERXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlpbXVsX2xvbmcoZGVzdHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIklNVUxcdFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWltdWxfd29yZChkZXN0dmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDY6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJESVZcdERXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkaXZfbG9uZyhkZXN0dmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiRElWXHRXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkaXZfd29yZChkZXN0dmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDc6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJJRElWXHREV09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJaWRpdl9sb25nKGRlc3R2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJJRElWXHRXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlpZGl2X3dvcmQoZGVzdHZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JfQotCWJyZWFrOyAgICAgICAgICAgICAgICAgIC8qIGVuZCBtb2Q9PTAwICovCi0gICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgIC8qIG1vZD0wMSAqLwotCXN3aXRjaCAocmgpIHsKLQljYXNlIDA6ICAgICAgICAgLyogdGVzdCB3b3JkIGltbSAqLwotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWwsc3JjdmFsOwotCi0JCURFQ09ERV9QUklOVEYoIlRFU1RcdERXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCIsIik7Ci0JCXNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7Ci0JCURFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJdGVzdF9sb25nKGRlc3R2YWwsIHNyY3ZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsLHNyY3ZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJURVNUXHRXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCIsIik7Ci0JCXNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7Ci0JCURFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJdGVzdF93b3JkKGRlc3R2YWwsIHNyY3ZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgICBERUNPREVfUFJJTlRGKCJJTExFR0FMIE9QIE1PRD0wMSBSSD0wMSBPUD1GNlxuIik7Ci0JICAgIEhBTFRfU1lTKCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgMjoKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIk5PVFx0RFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRlc3R2YWwgPSBub3RfbG9uZyhkZXN0dmFsKTsKLQkJc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJOT1RcdFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRlc3R2YWwgPSBub3Rfd29yZChkZXN0dmFsKTsKLQkJc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgMzoKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIk5FR1x0RFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRlc3R2YWwgPSBuZWdfbG9uZyhkZXN0dmFsKTsKLQkJc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJORUdcdFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRlc3R2YWwgPSBuZWdfd29yZChkZXN0dmFsKTsKLQkJc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgNDoKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIk1VTFx0RFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCW11bF9sb25nKGRlc3R2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJNVUxcdFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCW11bF93b3JkKGRlc3R2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgNToKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIklNVUxcdERXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlpbXVsX2xvbmcoZGVzdHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIklNVUxcdFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWltdWxfd29yZChkZXN0dmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDY6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJESVZcdERXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkaXZfbG9uZyhkZXN0dmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiRElWXHRXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkaXZfd29yZChkZXN0dmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDc6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJJRElWXHREV09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJaWRpdl9sb25nKGRlc3R2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJJRElWXHRXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlpZGl2X3dvcmQoZGVzdHZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JfQotCWJyZWFrOyAgICAgICAgICAgICAgICAgIC8qIGVuZCBtb2Q9PTAxICovCi0gICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgIC8qIG1vZD0xMCAqLwotCXN3aXRjaCAocmgpIHsKLQljYXNlIDA6ICAgICAgICAgLyogdGVzdCB3b3JkIGltbSAqLwotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWwsc3JjdmFsOwotCi0JCURFQ09ERV9QUklOVEYoIlRFU1RcdERXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCIsIik7Ci0JCXNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7Ci0JCURFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJdGVzdF9sb25nKGRlc3R2YWwsIHNyY3ZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsLHNyY3ZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJURVNUXHRXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCIsIik7Ci0JCXNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7Ci0JCURFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJdGVzdF93b3JkKGRlc3R2YWwsIHNyY3ZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgICBERUNPREVfUFJJTlRGKCJJTExFR0FMIE9QIE1PRD0xMCBSSD0wMSBPUD1GNlxuIik7Ci0JICAgIEhBTFRfU1lTKCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgMjoKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIk5PVFx0RFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRlc3R2YWwgPSBub3RfbG9uZyhkZXN0dmFsKTsKLQkJc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJOT1RcdFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRlc3R2YWwgPSBub3Rfd29yZChkZXN0dmFsKTsKLQkJc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgMzoKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIk5FR1x0RFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRlc3R2YWwgPSBuZWdfbG9uZyhkZXN0dmFsKTsKLQkJc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJORUdcdFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRlc3R2YWwgPSBuZWdfd29yZChkZXN0dmFsKTsKLQkJc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgNDoKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIk1VTFx0RFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCW11bF9sb25nKGRlc3R2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJNVUxcdFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCW11bF93b3JkKGRlc3R2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgNToKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIklNVUxcdERXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlpbXVsX2xvbmcoZGVzdHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsOwotCi0JCURFQ09ERV9QUklOVEYoIklNVUxcdFdPUkQgUFRSICIpOwotCQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWltdWxfd29yZChkZXN0dmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDY6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJESVZcdERXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkaXZfbG9uZyhkZXN0dmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiRElWXHRXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkaXZfd29yZChkZXN0dmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDc6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJJRElWXHREV09SRCBQVFIgIik7Ci0JCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJaWRpdl9sb25nKGRlc3R2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbDsKLQotCQlERUNPREVfUFJJTlRGKCJJRElWXHRXT1JEIFBUUiAiKTsKLQkJZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlpZGl2X3dvcmQoZGVzdHZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JfQotCWJyZWFrOyAgICAgICAgICAgICAgICAgIC8qIGVuZCBtb2Q9PTEwICovCi0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIG1vZD0xMSAqLwotCXN3aXRjaCAocmgpIHsKLQljYXNlIDA6ICAgICAgICAgLyogdGVzdCB3b3JkIGltbSAqLwotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyICpkZXN0cmVnOwotCQl1MzIgc3JjdmFsOwotCi0JCURFQ09ERV9QUklOVEYoIlRFU1RcdCIpOwotCQlkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCQlERUNPREVfUFJJTlRGKCIsIik7Ci0JCXNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7Ci0JCURFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJdGVzdF9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgKmRlc3RyZWc7Ci0JCXUxNiBzcmN2YWw7Ci0KLQkJREVDT0RFX1BSSU5URigiVEVTVFx0Iik7Ci0JCWRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JCURFQ09ERV9QUklOVEYoIiwiKTsKLQkJc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKLQkJREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQl0ZXN0X3dvcmQoKmRlc3RyZWcsIHNyY3ZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgICBERUNPREVfUFJJTlRGKCJJTExFR0FMIE9QIE1PRD0wMCBSSD0wMSBPUD1GNlxuIik7Ci0JICAgIEhBTFRfU1lTKCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgMjoKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiAqZGVzdHJlZzsKLQotCQlERUNPREVfUFJJTlRGKCJOT1RcdCIpOwotCQlkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQkqZGVzdHJlZyA9IG5vdF9sb25nKCpkZXN0cmVnKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2ICpkZXN0cmVnOwotCi0JCURFQ09ERV9QUklOVEYoIk5PVFx0Iik7Ci0JCWRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCSpkZXN0cmVnID0gbm90X3dvcmQoKmRlc3RyZWcpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgMzoKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiAqZGVzdHJlZzsKLQotCQlERUNPREVfUFJJTlRGKCJORUdcdCIpOwotCQlkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQkqZGVzdHJlZyA9IG5lZ19sb25nKCpkZXN0cmVnKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2ICpkZXN0cmVnOwotCi0JCURFQ09ERV9QUklOVEYoIk5FR1x0Iik7Ci0JCWRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCSpkZXN0cmVnID0gbmVnX3dvcmQoKmRlc3RyZWcpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgNDoKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiAqZGVzdHJlZzsKLQotCQlERUNPREVfUFJJTlRGKCJNVUxcdCIpOwotCQlkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQltdWxfbG9uZygqZGVzdHJlZyk7ICAgICAgLyohISEgICovCi0JICAgIH0gZWxzZSB7Ci0JCXUxNiAqZGVzdHJlZzsKLQotCQlERUNPREVfUFJJTlRGKCJNVUxcdCIpOwotCQlkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQltdWxfd29yZCgqZGVzdHJlZyk7ICAgICAgLyohISEgICovCi0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSA1OgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyICpkZXN0cmVnOwotCi0JCURFQ09ERV9QUklOVEYoIklNVUxcdCIpOwotCQlkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlpbXVsX2xvbmcoKmRlc3RyZWcpOwotCSAgICB9IGVsc2UgewotCQl1MTYgKmRlc3RyZWc7Ci0KLQkJREVDT0RFX1BSSU5URigiSU1VTFx0Iik7Ci0JCWRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWltdWxfd29yZCgqZGVzdHJlZyk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSA2OgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyICpkZXN0cmVnOwotCi0JCURFQ09ERV9QUklOVEYoIkRJVlx0Iik7Ci0JCWRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRpdl9sb25nKCpkZXN0cmVnKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2ICpkZXN0cmVnOwotCi0JCURFQ09ERV9QUklOVEYoIkRJVlx0Iik7Ci0JCWRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRpdl93b3JkKCpkZXN0cmVnKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDc6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgKmRlc3RyZWc7Ci0KLQkJREVDT0RFX1BSSU5URigiSURJVlx0Iik7Ci0JCWRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWlkaXZfbG9uZygqZGVzdHJlZyk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiAqZGVzdHJlZzsKLQotCQlERUNPREVfUFJJTlRGKCJJRElWXHQiKTsKLQkJZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJaWRpdl93b3JkKCpkZXN0cmVnKTsKLQkgICAgfQotCSAgICBicmVhazsKLQl9Ci0JYnJlYWs7ICAgICAgICAgICAgICAgICAgLyogZW5kIG1vZD09MTEgKi8KLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZjgKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2NsYyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgLyogY2xlYXIgdGhlIGNhcnJ5IGZsYWcuICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJDTENcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgQ0xFQVJfRkxBRyhGX0NGKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhmOQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfc3RjKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICAvKiBzZXQgdGhlIGNhcnJ5IGZsYWcuICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJTVENcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgU0VUX0ZMQUcoRl9DRik7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZmEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX2NsaSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgLyogY2xlYXIgaW50ZXJydXB0cy4gKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkNMSVxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBDTEVBUl9GTEFHKEZfSUYpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGZiCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9zdGkodTggWDg2RU1VX1VOVVNFRChvcDEpKQotewotICAgIC8qIGVuYWJsZSAgaW50ZXJydXB0cy4gKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlNUSVxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBTRVRfRkxBRyhGX0lGKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhmYwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3BfY2xkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICAvKiBjbGVhciBpbnRlcnJ1cHRzLiAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQ0xEXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIENMRUFSX0ZMQUcoRl9ERik7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4ZmQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wX3N0ZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgLyogY2xlYXIgaW50ZXJydXB0cy4gKi8KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlNURFxuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBTRVRfRkxBRyhGX0RGKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHhmZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3Bfb3BjRkVfYnl0ZV9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCi17Ci0gICAgaW50IG1vZCwgcmgsIHJsOwotICAgIHU4IGRlc3R2YWw7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotICAgIHU4ICpkZXN0cmVnOwotCi0gICAgLyogWWV0IGFub3RoZXIgc3BlY2lhbCBjYXNlIGluc3RydWN0aW9uLiAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSNpZmRlZiBERUJVRwotICAgIGlmIChERUJVR19ERUNPREUoKSkgewotCS8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCi0JICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKLQkgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKLQkgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCi0KLQlzd2l0Y2ggKHJoKSB7Ci0JY2FzZSAwOgotCSAgICBERUNPREVfUFJJTlRGKCJJTkNcdCIpOwotCSAgICBicmVhazsKLQljYXNlIDE6Ci0JICAgIERFQ09ERV9QUklOVEYoIkRFQ1x0Iik7Ci0JICAgIGJyZWFrOwotCWNhc2UgMjoKLQljYXNlIDM6Ci0JY2FzZSA0OgotCWNhc2UgNToKLQljYXNlIDY6Ci0JY2FzZSA3OgotCSAgICBERUNPREVfUFJJTlRGMigiSUxMRUdBTCBPUCBNQUpPUiBPUCAweEZFIE1JTk9SIE9QICV4IFxuIiwgbW9kKTsKLQkgICAgSEFMVF9TWVMoKTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLSNlbmRpZgotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOwotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCXN3aXRjaCAocmgpIHsKLQljYXNlIDA6ICAgICAgICAgLyogaW5jIHdvcmQgcHRyIC4uLiAqLwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gaW5jX2J5dGUoZGVzdHZhbCk7Ci0JICAgIHN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAxOiAgICAgICAgIC8qIGRlYyB3b3JkIHB0ciAuLi4gKi8KLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGRlY19ieXRlKGRlc3R2YWwpOwotCSAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIGJyZWFrOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0Jc3dpdGNoIChyaCkgewotCWNhc2UgMDoKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGluY19ieXRlKGRlc3R2YWwpOwotCSAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgMToKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGRlY19ieXRlKGRlc3R2YWwpOwotCSAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIGJyZWFrOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0Jc3dpdGNoIChyaCkgewotCWNhc2UgMDoKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGluY19ieXRlKGRlc3R2YWwpOwotCSAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgMToKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGRlY19ieXRlKGRlc3R2YWwpOwotCSAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIGJyZWFrOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCXN3aXRjaCAocmgpIHsKLQljYXNlIDA6Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gaW5jX2J5dGUoKmRlc3RyZWcpOwotCSAgICBicmVhazsKLQljYXNlIDE6Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gZGVjX2J5dGUoKmRlc3RyZWcpOwotCSAgICBicmVhazsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweGZmCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcF9vcGNGRl93b3JkX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKLXsKLSAgICBpbnQgbW9kLCByaCwgcmw7Ci0gICAgdWludCBkZXN0b2Zmc2V0ID0gMDsKLQl1MTYgKmRlc3RyZWc7Ci0JdTE2IGRlc3R2YWwsZGVzdHZhbDI7Ci0KLSAgICAvKiBZZXQgYW5vdGhlciBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24uICovCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotI2lmZGVmIERFQlVHCi0gICAgaWYgKERFQlVHX0RFQ09ERSgpKSB7Ci0JLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKLQkgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncwotCSAgIGluIHRoZSBzYW1lIGZvcm1hdCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBpcyB0aGF0IHRoZQotCSAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KLQotCXN3aXRjaCAocmgpIHsKLQljYXNlIDA6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQlERUNPREVfUFJJTlRGKCJJTkNcdERXT1JEIFBUUiAiKTsKLQkgICAgfSBlbHNlIHsKLQkJREVDT0RFX1BSSU5URigiSU5DXHRXT1JEIFBUUiAiKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDE6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQlERUNPREVfUFJJTlRGKCJERUNcdERXT1JEIFBUUiAiKTsKLQkgICAgfSBlbHNlIHsKLQkJREVDT0RFX1BSSU5URigiREVDXHRXT1JEIFBUUiAiKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDI6Ci0JICAgIERFQ09ERV9QUklOVEYoIkNBTExcdCAiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAzOgotCSAgICBERUNPREVfUFJJTlRGKCJDQUxMXHRGQVIgIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgNDoKLQkgICAgREVDT0RFX1BSSU5URigiSk1QXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA1OgotCSAgICBERUNPREVfUFJJTlRGKCJKTVBcdEZBUiAiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA2OgotCSAgICBERUNPREVfUFJJTlRGKCJQVVNIXHQiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSA3OgotCSAgICBERUNPREVfUFJJTlRGKCJJTExFR0FMIERFQ09ESU5HIE9GIE9QQ09ERSBGRlx0Iik7Ci0JICAgIEhBTFRfU1lTKCk7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0jZW5kaWYKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlzd2l0Y2ggKHJoKSB7Ci0JY2FzZSAwOiAgICAgICAgIC8qIGluYyB3b3JkIHB0ciAuLi4gKi8KLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsOwotCi0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRlc3R2YWwgPSBpbmNfbG9uZyhkZXN0dmFsKTsKLQkJc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbDsKLQotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkZXN0dmFsID0gaW5jX3dvcmQoZGVzdHZhbCk7Ci0JCXN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDE6ICAgICAgICAgLyogZGVjIHdvcmQgcHRyIC4uLiAqLwotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWw7Ci0KLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGVzdHZhbCA9IGRlY19sb25nKGRlc3R2YWwpOwotCQlzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsOwotCi0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRlc3R2YWwgPSBkZWNfd29yZChkZXN0dmFsKTsKLQkJc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgMjogICAgICAgICAvKiBjYWxsIHdvcmQgcHRyIC4uLiAqLwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBwdXNoX3dvcmQoTS54ODYuUl9JUCk7Ci0JICAgIE0ueDg2LlJfSVAgPSBkZXN0dmFsOwotCSAgICBicmVhazsKLQljYXNlIDM6ICAgICAgICAgLyogY2FsbCBmYXIgcHRyIC4uLiAqLwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsMiA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0ICsgMik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHB1c2hfd29yZChNLng4Ni5SX0NTKTsKLQkgICAgTS54ODYuUl9DUyA9IGRlc3R2YWwyOwotCSAgICBwdXNoX3dvcmQoTS54ODYuUl9JUCk7Ci0JICAgIE0ueDg2LlJfSVAgPSBkZXN0dmFsOwotCSAgICBicmVhazsKLQljYXNlIDQ6ICAgICAgICAgLyogam1wIHdvcmQgcHRyIC4uLiAqLwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBNLng4Ni5SX0lQID0gZGVzdHZhbDsKLQkgICAgYnJlYWs7Ci0JY2FzZSA1OiAgICAgICAgIC8qIGptcCBmYXIgcHRyIC4uLiAqLwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsMiA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0ICsgMik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIE0ueDg2LlJfSVAgPSBkZXN0dmFsOwotCSAgICBNLng4Ni5SX0NTID0gZGVzdHZhbDI7Ci0JICAgIGJyZWFrOwotCWNhc2UgNjogICAgICAgICAvKiAgcHVzaCB3b3JkIHB0ciAuLi4gKi8KLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsOwotCi0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCXB1c2hfbG9uZyhkZXN0dmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWw7Ci0KLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJcHVzaF93b3JkKGRlc3R2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0Jc3dpdGNoIChyaCkgewotCWNhc2UgMDoKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsOwotCi0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRlc3R2YWwgPSBpbmNfbG9uZyhkZXN0dmFsKTsKLQkJc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbDsKLQotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkZXN0dmFsID0gaW5jX3dvcmQoZGVzdHZhbCk7Ci0JCXN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDE6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbDsKLQotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkZXN0dmFsID0gZGVjX2xvbmcoZGVzdHZhbCk7Ci0JCXN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2IGRlc3R2YWw7Ci0KLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGVzdHZhbCA9IGRlY193b3JkKGRlc3R2YWwpOwotCQlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSAyOiAgICAgICAgIC8qIGNhbGwgd29yZCBwdHIgLi4uICovCi0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHB1c2hfd29yZChNLng4Ni5SX0lQKTsKLQkgICAgTS54ODYuUl9JUCA9IGRlc3R2YWw7Ci0JICAgIGJyZWFrOwotCWNhc2UgMzogICAgICAgICAvKiBjYWxsIGZhciBwdHIgLi4uICovCi0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwyID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQgKyAyKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgcHVzaF93b3JkKE0ueDg2LlJfQ1MpOwotCSAgICBNLng4Ni5SX0NTID0gZGVzdHZhbDI7Ci0JICAgIHB1c2hfd29yZChNLng4Ni5SX0lQKTsKLQkgICAgTS54ODYuUl9JUCA9IGRlc3R2YWw7Ci0JICAgIGJyZWFrOwotCWNhc2UgNDogICAgICAgICAvKiBqbXAgd29yZCBwdHIgLi4uICovCi0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIE0ueDg2LlJfSVAgPSBkZXN0dmFsOwotCSAgICBicmVhazsKLQljYXNlIDU6ICAgICAgICAgLyogam1wIGZhciBwdHIgLi4uICovCi0JICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JICAgIGRlc3R2YWwyID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQgKyAyKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgTS54ODYuUl9JUCA9IGRlc3R2YWw7Ci0JICAgIE0ueDg2LlJfQ1MgPSBkZXN0dmFsMjsKLQkgICAgYnJlYWs7Ci0JY2FzZSA2OiAgICAgICAgIC8qICBwdXNoIHdvcmQgcHRyIC4uLiAqLwotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWw7Ci0KLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJcHVzaF9sb25nKGRlc3R2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbDsKLQotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlwdXNoX3dvcmQoZGVzdHZhbCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlzd2l0Y2ggKHJoKSB7Ci0JY2FzZSAwOgotCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJdTMyIGRlc3R2YWw7Ci0KLQkJZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJZGVzdHZhbCA9IGluY19sb25nKGRlc3R2YWwpOwotCQlzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsOwotCi0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRlc3R2YWwgPSBpbmNfd29yZChkZXN0dmFsKTsKLQkJc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgMToKLQkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCXUzMiBkZXN0dmFsOwotCi0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCWRlc3R2YWwgPSBkZWNfbG9uZyhkZXN0dmFsKTsKLQkJc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCSAgICB9IGVsc2UgewotCQl1MTYgZGVzdHZhbDsKLQotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlkZXN0dmFsID0gZGVjX3dvcmQoZGVzdHZhbCk7Ci0JCXN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDI6ICAgICAgICAgLyogY2FsbCB3b3JkIHB0ciAuLi4gKi8KLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgcHVzaF93b3JkKE0ueDg2LlJfSVApOwotCSAgICBNLng4Ni5SX0lQID0gZGVzdHZhbDsKLQkgICAgYnJlYWs7Ci0JY2FzZSAzOiAgICAgICAgIC8qIGNhbGwgZmFyIHB0ciAuLi4gKi8KLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbDIgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCArIDIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBwdXNoX3dvcmQoTS54ODYuUl9DUyk7Ci0JICAgIE0ueDg2LlJfQ1MgPSBkZXN0dmFsMjsKLQkgICAgcHVzaF93b3JkKE0ueDg2LlJfSVApOwotCSAgICBNLng4Ni5SX0lQID0gZGVzdHZhbDsKLQkgICAgYnJlYWs7Ci0JY2FzZSA0OiAgICAgICAgIC8qIGptcCB3b3JkIHB0ciAuLi4gKi8KLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgTS54ODYuUl9JUCA9IGRlc3R2YWw7Ci0JICAgIGJyZWFrOwotCWNhc2UgNTogICAgICAgICAvKiBqbXAgZmFyIHB0ciAuLi4gKi8KLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbDIgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCArIDIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBNLng4Ni5SX0lQID0gZGVzdHZhbDsKLQkgICAgTS54ODYuUl9DUyA9IGRlc3R2YWwyOwotCSAgICBicmVhazsKLQljYXNlIDY6ICAgICAgICAgLyogIHB1c2ggd29yZCBwdHIgLi4uICovCi0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgZGVzdHZhbDsKLQotCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQlwdXNoX2xvbmcoZGVzdHZhbCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiBkZXN0dmFsOwotCi0JCWRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCXB1c2hfd29yZChkZXN0dmFsKTsKLQkgICAgfQotCSAgICBicmVhazsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOgotCXN3aXRjaCAocmgpIHsKLQljYXNlIDA6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgKmRlc3RyZWc7Ci0KLQkJZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJKmRlc3RyZWcgPSBpbmNfbG9uZygqZGVzdHJlZyk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiAqZGVzdHJlZzsKLQotCQlkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQkqZGVzdHJlZyA9IGluY193b3JkKCpkZXN0cmVnKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDE6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgKmRlc3RyZWc7Ci0KLQkJZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJKmRlc3RyZWcgPSBkZWNfbG9uZygqZGVzdHJlZyk7Ci0JICAgIH0gZWxzZSB7Ci0JCXUxNiAqZGVzdHJlZzsKLQotCQlkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCQlERUNPREVfUFJJTlRGKCJcbiIpOwotCQlUUkFDRV9BTkRfU1RFUCgpOwotCQkqZGVzdHJlZyA9IGRlY193b3JkKCpkZXN0cmVnKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIDI6ICAgICAgICAgLyogY2FsbCB3b3JkIHB0ciAuLi4gKi8KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgcHVzaF93b3JkKE0ueDg2LlJfSVApOwotCSAgICBNLng4Ni5SX0lQID0gKmRlc3RyZWc7Ci0JICAgIGJyZWFrOwotCWNhc2UgMzogICAgICAgICAvKiBqbXAgZmFyIHB0ciAuLi4gKi8KLQkgICAgREVDT0RFX1BSSU5URigiT1BFUkFUSU9OIFVOREVGSU5FRCAwWEZGIFxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIEhBTFRfU1lTKCk7Ci0JICAgIGJyZWFrOwotCi0JY2FzZSA0OiAgICAgICAgIC8qIGptcCAgLi4uICovCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIE0ueDg2LlJfSVAgPSAodTE2KSAoKmRlc3RyZWcpOwotCSAgICBicmVhazsKLQljYXNlIDU6ICAgICAgICAgLyogam1wIGZhciBwdHIgLi4uICovCi0JICAgIERFQ09ERV9QUklOVEYoIk9QRVJBVElPTiBVTkRFRklORUQgMFhGRiBcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBIQUxUX1NZUygpOwotCSAgICBicmVhazsKLQljYXNlIDY6Ci0JICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQl1MzIgKmRlc3RyZWc7Ci0KLQkJZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkJREVDT0RFX1BSSU5URigiXG4iKTsKLQkJVFJBQ0VfQU5EX1NURVAoKTsKLQkJcHVzaF9sb25nKCpkZXN0cmVnKTsKLQkgICAgfSBlbHNlIHsKLQkJdTE2ICpkZXN0cmVnOwotCi0JCWRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JCVRSQUNFX0FORF9TVEVQKCk7Ci0JCXB1c2hfd29yZCgqZGVzdHJlZyk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFNpbmdsZSBieXRlIG9wZXJhdGlvbiBjb2RlIHRhYmxlOgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAoKng4NmVtdV9vcHRhYlsyNTZdKSh1OCkgPQotewotLyogIDB4MDAgKi8geDg2ZW11T3BfYWRkX2J5dGVfUk1fUiwKLS8qICAweDAxICovIHg4NmVtdU9wX2FkZF93b3JkX1JNX1IsCi0vKiAgMHgwMiAqLyB4ODZlbXVPcF9hZGRfYnl0ZV9SX1JNLAotLyogIDB4MDMgKi8geDg2ZW11T3BfYWRkX3dvcmRfUl9STSwKLS8qICAweDA0ICovIHg4NmVtdU9wX2FkZF9ieXRlX0FMX0lNTSwKLS8qICAweDA1ICovIHg4NmVtdU9wX2FkZF93b3JkX0FYX0lNTSwKLS8qICAweDA2ICovIHg4NmVtdU9wX3B1c2hfRVMsCi0vKiAgMHgwNyAqLyB4ODZlbXVPcF9wb3BfRVMsCi0KLS8qICAweDA4ICovIHg4NmVtdU9wX29yX2J5dGVfUk1fUiwKLS8qICAweDA5ICovIHg4NmVtdU9wX29yX3dvcmRfUk1fUiwKLS8qICAweDBhICovIHg4NmVtdU9wX29yX2J5dGVfUl9STSwKLS8qICAweDBiICovIHg4NmVtdU9wX29yX3dvcmRfUl9STSwKLS8qICAweDBjICovIHg4NmVtdU9wX29yX2J5dGVfQUxfSU1NLAotLyogIDB4MGQgKi8geDg2ZW11T3Bfb3Jfd29yZF9BWF9JTU0sCi0vKiAgMHgwZSAqLyB4ODZlbXVPcF9wdXNoX0NTLAotLyogIDB4MGYgKi8geDg2ZW11T3BfdHdvX2J5dGUsCi0KLS8qICAweDEwICovIHg4NmVtdU9wX2FkY19ieXRlX1JNX1IsCi0vKiAgMHgxMSAqLyB4ODZlbXVPcF9hZGNfd29yZF9STV9SLAotLyogIDB4MTIgKi8geDg2ZW11T3BfYWRjX2J5dGVfUl9STSwKLS8qICAweDEzICovIHg4NmVtdU9wX2FkY193b3JkX1JfUk0sCi0vKiAgMHgxNCAqLyB4ODZlbXVPcF9hZGNfYnl0ZV9BTF9JTU0sCi0vKiAgMHgxNSAqLyB4ODZlbXVPcF9hZGNfd29yZF9BWF9JTU0sCi0vKiAgMHgxNiAqLyB4ODZlbXVPcF9wdXNoX1NTLAotLyogIDB4MTcgKi8geDg2ZW11T3BfcG9wX1NTLAotCi0vKiAgMHgxOCAqLyB4ODZlbXVPcF9zYmJfYnl0ZV9STV9SLAotLyogIDB4MTkgKi8geDg2ZW11T3Bfc2JiX3dvcmRfUk1fUiwKLS8qICAweDFhICovIHg4NmVtdU9wX3NiYl9ieXRlX1JfUk0sCi0vKiAgMHgxYiAqLyB4ODZlbXVPcF9zYmJfd29yZF9SX1JNLAotLyogIDB4MWMgKi8geDg2ZW11T3Bfc2JiX2J5dGVfQUxfSU1NLAotLyogIDB4MWQgKi8geDg2ZW11T3Bfc2JiX3dvcmRfQVhfSU1NLAotLyogIDB4MWUgKi8geDg2ZW11T3BfcHVzaF9EUywKLS8qICAweDFmICovIHg4NmVtdU9wX3BvcF9EUywKLQotLyogIDB4MjAgKi8geDg2ZW11T3BfYW5kX2J5dGVfUk1fUiwKLS8qICAweDIxICovIHg4NmVtdU9wX2FuZF93b3JkX1JNX1IsCi0vKiAgMHgyMiAqLyB4ODZlbXVPcF9hbmRfYnl0ZV9SX1JNLAotLyogIDB4MjMgKi8geDg2ZW11T3BfYW5kX3dvcmRfUl9STSwKLS8qICAweDI0ICovIHg4NmVtdU9wX2FuZF9ieXRlX0FMX0lNTSwKLS8qICAweDI1ICovIHg4NmVtdU9wX2FuZF93b3JkX0FYX0lNTSwKLS8qICAweDI2ICovIHg4NmVtdU9wX3NlZ292cl9FUywKLS8qICAweDI3ICovIHg4NmVtdU9wX2RhYSwKLQotLyogIDB4MjggKi8geDg2ZW11T3Bfc3ViX2J5dGVfUk1fUiwKLS8qICAweDI5ICovIHg4NmVtdU9wX3N1Yl93b3JkX1JNX1IsCi0vKiAgMHgyYSAqLyB4ODZlbXVPcF9zdWJfYnl0ZV9SX1JNLAotLyogIDB4MmIgKi8geDg2ZW11T3Bfc3ViX3dvcmRfUl9STSwKLS8qICAweDJjICovIHg4NmVtdU9wX3N1Yl9ieXRlX0FMX0lNTSwKLS8qICAweDJkICovIHg4NmVtdU9wX3N1Yl93b3JkX0FYX0lNTSwKLS8qICAweDJlICovIHg4NmVtdU9wX3NlZ292cl9DUywKLS8qICAweDJmICovIHg4NmVtdU9wX2RhcywKLQotLyogIDB4MzAgKi8geDg2ZW11T3BfeG9yX2J5dGVfUk1fUiwKLS8qICAweDMxICovIHg4NmVtdU9wX3hvcl93b3JkX1JNX1IsCi0vKiAgMHgzMiAqLyB4ODZlbXVPcF94b3JfYnl0ZV9SX1JNLAotLyogIDB4MzMgKi8geDg2ZW11T3BfeG9yX3dvcmRfUl9STSwKLS8qICAweDM0ICovIHg4NmVtdU9wX3hvcl9ieXRlX0FMX0lNTSwKLS8qICAweDM1ICovIHg4NmVtdU9wX3hvcl93b3JkX0FYX0lNTSwKLS8qICAweDM2ICovIHg4NmVtdU9wX3NlZ292cl9TUywKLS8qICAweDM3ICovIHg4NmVtdU9wX2FhYSwKLQotLyogIDB4MzggKi8geDg2ZW11T3BfY21wX2J5dGVfUk1fUiwKLS8qICAweDM5ICovIHg4NmVtdU9wX2NtcF93b3JkX1JNX1IsCi0vKiAgMHgzYSAqLyB4ODZlbXVPcF9jbXBfYnl0ZV9SX1JNLAotLyogIDB4M2IgKi8geDg2ZW11T3BfY21wX3dvcmRfUl9STSwKLS8qICAweDNjICovIHg4NmVtdU9wX2NtcF9ieXRlX0FMX0lNTSwKLS8qICAweDNkICovIHg4NmVtdU9wX2NtcF93b3JkX0FYX0lNTSwKLS8qICAweDNlICovIHg4NmVtdU9wX3NlZ292cl9EUywKLS8qICAweDNmICovIHg4NmVtdU9wX2FhcywKLQotLyogIDB4NDAgKi8geDg2ZW11T3BfaW5jX0FYLAotLyogIDB4NDEgKi8geDg2ZW11T3BfaW5jX0NYLAotLyogIDB4NDIgKi8geDg2ZW11T3BfaW5jX0RYLAotLyogIDB4NDMgKi8geDg2ZW11T3BfaW5jX0JYLAotLyogIDB4NDQgKi8geDg2ZW11T3BfaW5jX1NQLAotLyogIDB4NDUgKi8geDg2ZW11T3BfaW5jX0JQLAotLyogIDB4NDYgKi8geDg2ZW11T3BfaW5jX1NJLAotLyogIDB4NDcgKi8geDg2ZW11T3BfaW5jX0RJLAotCi0vKiAgMHg0OCAqLyB4ODZlbXVPcF9kZWNfQVgsCi0vKiAgMHg0OSAqLyB4ODZlbXVPcF9kZWNfQ1gsCi0vKiAgMHg0YSAqLyB4ODZlbXVPcF9kZWNfRFgsCi0vKiAgMHg0YiAqLyB4ODZlbXVPcF9kZWNfQlgsCi0vKiAgMHg0YyAqLyB4ODZlbXVPcF9kZWNfU1AsCi0vKiAgMHg0ZCAqLyB4ODZlbXVPcF9kZWNfQlAsCi0vKiAgMHg0ZSAqLyB4ODZlbXVPcF9kZWNfU0ksCi0vKiAgMHg0ZiAqLyB4ODZlbXVPcF9kZWNfREksCi0KLS8qICAweDUwICovIHg4NmVtdU9wX3B1c2hfQVgsCi0vKiAgMHg1MSAqLyB4ODZlbXVPcF9wdXNoX0NYLAotLyogIDB4NTIgKi8geDg2ZW11T3BfcHVzaF9EWCwKLS8qICAweDUzICovIHg4NmVtdU9wX3B1c2hfQlgsCi0vKiAgMHg1NCAqLyB4ODZlbXVPcF9wdXNoX1NQLAotLyogIDB4NTUgKi8geDg2ZW11T3BfcHVzaF9CUCwKLS8qICAweDU2ICovIHg4NmVtdU9wX3B1c2hfU0ksCi0vKiAgMHg1NyAqLyB4ODZlbXVPcF9wdXNoX0RJLAotCi0vKiAgMHg1OCAqLyB4ODZlbXVPcF9wb3BfQVgsCi0vKiAgMHg1OSAqLyB4ODZlbXVPcF9wb3BfQ1gsCi0vKiAgMHg1YSAqLyB4ODZlbXVPcF9wb3BfRFgsCi0vKiAgMHg1YiAqLyB4ODZlbXVPcF9wb3BfQlgsCi0vKiAgMHg1YyAqLyB4ODZlbXVPcF9wb3BfU1AsCi0vKiAgMHg1ZCAqLyB4ODZlbXVPcF9wb3BfQlAsCi0vKiAgMHg1ZSAqLyB4ODZlbXVPcF9wb3BfU0ksCi0vKiAgMHg1ZiAqLyB4ODZlbXVPcF9wb3BfREksCi0KLS8qICAweDYwICovIHg4NmVtdU9wX3B1c2hfYWxsLAotLyogIDB4NjEgKi8geDg2ZW11T3BfcG9wX2FsbCwKLS8qICAweDYyICovIHg4NmVtdU9wX2lsbGVnYWxfb3AsICAgLyogYm91bmQgKi8KLS8qICAweDYzICovIHg4NmVtdU9wX2lsbGVnYWxfb3AsICAgLyogYXJwbCAqLwotLyogIDB4NjQgKi8geDg2ZW11T3Bfc2Vnb3ZyX0ZTLAotLyogIDB4NjUgKi8geDg2ZW11T3Bfc2Vnb3ZyX0dTLAotLyogIDB4NjYgKi8geDg2ZW11T3BfcHJlZml4X2RhdGEsCi0vKiAgMHg2NyAqLyB4ODZlbXVPcF9wcmVmaXhfYWRkciwKLQotLyogIDB4NjggKi8geDg2ZW11T3BfcHVzaF93b3JkX0lNTSwKLS8qICAweDY5ICovIHg4NmVtdU9wX2ltdWxfd29yZF9JTU0sCi0vKiAgMHg2YSAqLyB4ODZlbXVPcF9wdXNoX2J5dGVfSU1NLAotLyogIDB4NmIgKi8geDg2ZW11T3BfaW11bF9ieXRlX0lNTSwKLS8qICAweDZjICovIHg4NmVtdU9wX2luc19ieXRlLAotLyogIDB4NmQgKi8geDg2ZW11T3BfaW5zX3dvcmQsCi0vKiAgMHg2ZSAqLyB4ODZlbXVPcF9vdXRzX2J5dGUsCi0vKiAgMHg2ZiAqLyB4ODZlbXVPcF9vdXRzX3dvcmQsCi0KLS8qICAweDcwICovIHg4NmVtdU9wX2p1bXBfbmVhcl9PLAotLyogIDB4NzEgKi8geDg2ZW11T3BfanVtcF9uZWFyX05PLAotLyogIDB4NzIgKi8geDg2ZW11T3BfanVtcF9uZWFyX0IsCi0vKiAgMHg3MyAqLyB4ODZlbXVPcF9qdW1wX25lYXJfTkIsCi0vKiAgMHg3NCAqLyB4ODZlbXVPcF9qdW1wX25lYXJfWiwKLS8qICAweDc1ICovIHg4NmVtdU9wX2p1bXBfbmVhcl9OWiwKLS8qICAweDc2ICovIHg4NmVtdU9wX2p1bXBfbmVhcl9CRSwKLS8qICAweDc3ICovIHg4NmVtdU9wX2p1bXBfbmVhcl9OQkUsCi0KLS8qICAweDc4ICovIHg4NmVtdU9wX2p1bXBfbmVhcl9TLAotLyogIDB4NzkgKi8geDg2ZW11T3BfanVtcF9uZWFyX05TLAotLyogIDB4N2EgKi8geDg2ZW11T3BfanVtcF9uZWFyX1AsCi0vKiAgMHg3YiAqLyB4ODZlbXVPcF9qdW1wX25lYXJfTlAsCi0vKiAgMHg3YyAqLyB4ODZlbXVPcF9qdW1wX25lYXJfTCwKLS8qICAweDdkICovIHg4NmVtdU9wX2p1bXBfbmVhcl9OTCwKLS8qICAweDdlICovIHg4NmVtdU9wX2p1bXBfbmVhcl9MRSwKLS8qICAweDdmICovIHg4NmVtdU9wX2p1bXBfbmVhcl9OTEUsCi0KLS8qICAweDgwICovIHg4NmVtdU9wX29wYzgwX2J5dGVfUk1fSU1NLAotLyogIDB4ODEgKi8geDg2ZW11T3Bfb3BjODFfd29yZF9STV9JTU0sCi0vKiAgMHg4MiAqLyB4ODZlbXVPcF9vcGM4Ml9ieXRlX1JNX0lNTSwKLS8qICAweDgzICovIHg4NmVtdU9wX29wYzgzX3dvcmRfUk1fSU1NLAotLyogIDB4ODQgKi8geDg2ZW11T3BfdGVzdF9ieXRlX1JNX1IsCi0vKiAgMHg4NSAqLyB4ODZlbXVPcF90ZXN0X3dvcmRfUk1fUiwKLS8qICAweDg2ICovIHg4NmVtdU9wX3hjaGdfYnl0ZV9STV9SLAotLyogIDB4ODcgKi8geDg2ZW11T3BfeGNoZ193b3JkX1JNX1IsCi0KLS8qICAweDg4ICovIHg4NmVtdU9wX21vdl9ieXRlX1JNX1IsCi0vKiAgMHg4OSAqLyB4ODZlbXVPcF9tb3Zfd29yZF9STV9SLAotLyogIDB4OGEgKi8geDg2ZW11T3BfbW92X2J5dGVfUl9STSwKLS8qICAweDhiICovIHg4NmVtdU9wX21vdl93b3JkX1JfUk0sCi0vKiAgMHg4YyAqLyB4ODZlbXVPcF9tb3Zfd29yZF9STV9TUiwKLS8qICAweDhkICovIHg4NmVtdU9wX2xlYV93b3JkX1JfTSwKLS8qICAweDhlICovIHg4NmVtdU9wX21vdl93b3JkX1NSX1JNLAotLyogIDB4OGYgKi8geDg2ZW11T3BfcG9wX1JNLAotCi0vKiAgMHg5MCAqLyB4ODZlbXVPcF9ub3AsCi0vKiAgMHg5MSAqLyB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfQ1gsCi0vKiAgMHg5MiAqLyB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfRFgsCi0vKiAgMHg5MyAqLyB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfQlgsCi0vKiAgMHg5NCAqLyB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfU1AsCi0vKiAgMHg5NSAqLyB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfQlAsCi0vKiAgMHg5NiAqLyB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfU0ksCi0vKiAgMHg5NyAqLyB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfREksCi0KLS8qICAweDk4ICovIHg4NmVtdU9wX2NidywKLS8qICAweDk5ICovIHg4NmVtdU9wX2N3ZCwKLS8qICAweDlhICovIHg4NmVtdU9wX2NhbGxfZmFyX0lNTSwKLS8qICAweDliICovIHg4NmVtdU9wX3dhaXQsCi0vKiAgMHg5YyAqLyB4ODZlbXVPcF9wdXNoZl93b3JkLAotLyogIDB4OWQgKi8geDg2ZW11T3BfcG9wZl93b3JkLAotLyogIDB4OWUgKi8geDg2ZW11T3Bfc2FoZiwKLS8qICAweDlmICovIHg4NmVtdU9wX2xhaGYsCi0KLS8qICAweGEwICovIHg4NmVtdU9wX21vdl9BTF9NX0lNTSwKLS8qICAweGExICovIHg4NmVtdU9wX21vdl9BWF9NX0lNTSwKLS8qICAweGEyICovIHg4NmVtdU9wX21vdl9NX0FMX0lNTSwKLS8qICAweGEzICovIHg4NmVtdU9wX21vdl9NX0FYX0lNTSwKLS8qICAweGE0ICovIHg4NmVtdU9wX21vdnNfYnl0ZSwKLS8qICAweGE1ICovIHg4NmVtdU9wX21vdnNfd29yZCwKLS8qICAweGE2ICovIHg4NmVtdU9wX2NtcHNfYnl0ZSwKLS8qICAweGE3ICovIHg4NmVtdU9wX2NtcHNfd29yZCwKLS8qICAweGE4ICovIHg4NmVtdU9wX3Rlc3RfQUxfSU1NLAotLyogIDB4YTkgKi8geDg2ZW11T3BfdGVzdF9BWF9JTU0sCi0vKiAgMHhhYSAqLyB4ODZlbXVPcF9zdG9zX2J5dGUsCi0vKiAgMHhhYiAqLyB4ODZlbXVPcF9zdG9zX3dvcmQsCi0vKiAgMHhhYyAqLyB4ODZlbXVPcF9sb2RzX2J5dGUsCi0vKiAgMHhhZCAqLyB4ODZlbXVPcF9sb2RzX3dvcmQsCi0vKiAgMHhhYyAqLyB4ODZlbXVPcF9zY2FzX2J5dGUsCi0vKiAgMHhhZCAqLyB4ODZlbXVPcF9zY2FzX3dvcmQsCi0KLQotLyogIDB4YjAgKi8geDg2ZW11T3BfbW92X2J5dGVfQUxfSU1NLAotLyogIDB4YjEgKi8geDg2ZW11T3BfbW92X2J5dGVfQ0xfSU1NLAotLyogIDB4YjIgKi8geDg2ZW11T3BfbW92X2J5dGVfRExfSU1NLAotLyogIDB4YjMgKi8geDg2ZW11T3BfbW92X2J5dGVfQkxfSU1NLAotLyogIDB4YjQgKi8geDg2ZW11T3BfbW92X2J5dGVfQUhfSU1NLAotLyogIDB4YjUgKi8geDg2ZW11T3BfbW92X2J5dGVfQ0hfSU1NLAotLyogIDB4YjYgKi8geDg2ZW11T3BfbW92X2J5dGVfREhfSU1NLAotLyogIDB4YjcgKi8geDg2ZW11T3BfbW92X2J5dGVfQkhfSU1NLAotCi0vKiAgMHhiOCAqLyB4ODZlbXVPcF9tb3Zfd29yZF9BWF9JTU0sCi0vKiAgMHhiOSAqLyB4ODZlbXVPcF9tb3Zfd29yZF9DWF9JTU0sCi0vKiAgMHhiYSAqLyB4ODZlbXVPcF9tb3Zfd29yZF9EWF9JTU0sCi0vKiAgMHhiYiAqLyB4ODZlbXVPcF9tb3Zfd29yZF9CWF9JTU0sCi0vKiAgMHhiYyAqLyB4ODZlbXVPcF9tb3Zfd29yZF9TUF9JTU0sCi0vKiAgMHhiZCAqLyB4ODZlbXVPcF9tb3Zfd29yZF9CUF9JTU0sCi0vKiAgMHhiZSAqLyB4ODZlbXVPcF9tb3Zfd29yZF9TSV9JTU0sCi0vKiAgMHhiZiAqLyB4ODZlbXVPcF9tb3Zfd29yZF9ESV9JTU0sCi0KLS8qICAweGMwICovIHg4NmVtdU9wX29wY0MwX2J5dGVfUk1fTUVNLAotLyogIDB4YzEgKi8geDg2ZW11T3Bfb3BjQzFfd29yZF9STV9NRU0sCi0vKiAgMHhjMiAqLyB4ODZlbXVPcF9yZXRfbmVhcl9JTU0sCi0vKiAgMHhjMyAqLyB4ODZlbXVPcF9yZXRfbmVhciwKLS8qICAweGM0ICovIHg4NmVtdU9wX2xlc19SX0lNTSwKLS8qICAweGM1ICovIHg4NmVtdU9wX2xkc19SX0lNTSwKLS8qICAweGM2ICovIHg4NmVtdU9wX21vdl9ieXRlX1JNX0lNTSwKLS8qICAweGM3ICovIHg4NmVtdU9wX21vdl93b3JkX1JNX0lNTSwKLS8qICAweGM4ICovIHg4NmVtdU9wX2VudGVyLAotLyogIDB4YzkgKi8geDg2ZW11T3BfbGVhdmUsCi0vKiAgMHhjYSAqLyB4ODZlbXVPcF9yZXRfZmFyX0lNTSwKLS8qICAweGNiICovIHg4NmVtdU9wX3JldF9mYXIsCi0vKiAgMHhjYyAqLyB4ODZlbXVPcF9pbnQzLAotLyogIDB4Y2QgKi8geDg2ZW11T3BfaW50X0lNTSwKLS8qICAweGNlICovIHg4NmVtdU9wX2ludG8sCi0vKiAgMHhjZiAqLyB4ODZlbXVPcF9pcmV0LAotCi0vKiAgMHhkMCAqLyB4ODZlbXVPcF9vcGNEMF9ieXRlX1JNXzEsCi0vKiAgMHhkMSAqLyB4ODZlbXVPcF9vcGNEMV93b3JkX1JNXzEsCi0vKiAgMHhkMiAqLyB4ODZlbXVPcF9vcGNEMl9ieXRlX1JNX0NMLAotLyogIDB4ZDMgKi8geDg2ZW11T3Bfb3BjRDNfd29yZF9STV9DTCwKLS8qICAweGQ0ICovIHg4NmVtdU9wX2FhbSwKLS8qICAweGQ1ICovIHg4NmVtdU9wX2FhZCwKLS8qICAweGQ2ICovIHg4NmVtdU9wX2lsbGVnYWxfb3AsICAgLyogVW5kb2N1bWVudGVkIFNFVEFMQyBpbnN0cnVjdGlvbiAqLwotLyogIDB4ZDcgKi8geDg2ZW11T3BfeGxhdCwKLS8qICAweGQ4ICovIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZDgsCi0vKiAgMHhkOSAqLyB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2Q5LAotLyogIDB4ZGEgKi8geDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kYSwKLS8qICAweGRiICovIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZGIsCi0vKiAgMHhkYyAqLyB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RjLAotLyogIDB4ZGQgKi8geDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kZCwKLS8qICAweGRlICovIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZGUsCi0vKiAgMHhkZiAqLyB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RmLAotCi0vKiAgMHhlMCAqLyB4ODZlbXVPcF9sb29wbmUsCi0vKiAgMHhlMSAqLyB4ODZlbXVPcF9sb29wZSwKLS8qICAweGUyICovIHg4NmVtdU9wX2xvb3AsCi0vKiAgMHhlMyAqLyB4ODZlbXVPcF9qY3h6LAotLyogIDB4ZTQgKi8geDg2ZW11T3BfaW5fYnl0ZV9BTF9JTU0sCi0vKiAgMHhlNSAqLyB4ODZlbXVPcF9pbl93b3JkX0FYX0lNTSwKLS8qICAweGU2ICovIHg4NmVtdU9wX291dF9ieXRlX0lNTV9BTCwKLS8qICAweGU3ICovIHg4NmVtdU9wX291dF93b3JkX0lNTV9BWCwKLQotLyogIDB4ZTggKi8geDg2ZW11T3BfY2FsbF9uZWFyX0lNTSwKLS8qICAweGU5ICovIHg4NmVtdU9wX2p1bXBfbmVhcl9JTU0sCi0vKiAgMHhlYSAqLyB4ODZlbXVPcF9qdW1wX2Zhcl9JTU0sCi0vKiAgMHhlYiAqLyB4ODZlbXVPcF9qdW1wX2J5dGVfSU1NLAotLyogIDB4ZWMgKi8geDg2ZW11T3BfaW5fYnl0ZV9BTF9EWCwKLS8qICAweGVkICovIHg4NmVtdU9wX2luX3dvcmRfQVhfRFgsCi0vKiAgMHhlZSAqLyB4ODZlbXVPcF9vdXRfYnl0ZV9EWF9BTCwKLS8qICAweGVmICovIHg4NmVtdU9wX291dF93b3JkX0RYX0FYLAotCi0vKiAgMHhmMCAqLyB4ODZlbXVPcF9sb2NrLAotLyogIDB4ZjEgKi8geDg2ZW11T3BfaWxsZWdhbF9vcCwKLS8qICAweGYyICovIHg4NmVtdU9wX3JlcG5lLAotLyogIDB4ZjMgKi8geDg2ZW11T3BfcmVwZSwKLS8qICAweGY0ICovIHg4NmVtdU9wX2hhbHQsCi0vKiAgMHhmNSAqLyB4ODZlbXVPcF9jbWMsCi0vKiAgMHhmNiAqLyB4ODZlbXVPcF9vcGNGNl9ieXRlX1JNLAotLyogIDB4ZjcgKi8geDg2ZW11T3Bfb3BjRjdfd29yZF9STSwKLQotLyogIDB4ZjggKi8geDg2ZW11T3BfY2xjLAotLyogIDB4ZjkgKi8geDg2ZW11T3Bfc3RjLAotLyogIDB4ZmEgKi8geDg2ZW11T3BfY2xpLAotLyogIDB4ZmIgKi8geDg2ZW11T3Bfc3RpLAotLyogIDB4ZmMgKi8geDg2ZW11T3BfY2xkLAotLyogIDB4ZmQgKi8geDg2ZW11T3Bfc3RkLAotLyogIDB4ZmUgKi8geDg2ZW11T3Bfb3BjRkVfYnl0ZV9STSwKLS8qICAweGZmICovIHg4NmVtdU9wX29wY0ZGX3dvcmRfUk0sCi19OwotCi12b2lkIHRhYmxlc19yZWxvY2F0ZSh1bnNpZ25lZCBpbnQgb2Zmc2V0KQotewotICAgIGludCBpOwotICAgIGZvciAoaT0wOyBpPDg7IGkrKykKLSAgICB7Ci0Jb3BjODBfYnl0ZV9vcGVyYXRpb25baV0gLT0gb2Zmc2V0OwotCW9wYzgxX3dvcmRfb3BlcmF0aW9uW2ldIC09IG9mZnNldDsKLQlvcGM4MV9sb25nX29wZXJhdGlvbltpXSAtPSBvZmZzZXQ7Ci0KLQlvcGM4Ml9ieXRlX29wZXJhdGlvbltpXSAtPSBvZmZzZXQ7Ci0Jb3BjODNfd29yZF9vcGVyYXRpb25baV0gLT0gb2Zmc2V0OwotCW9wYzgzX2xvbmdfb3BlcmF0aW9uW2ldIC09IG9mZnNldDsKLQotCW9wY0QwX2J5dGVfb3BlcmF0aW9uW2ldIC09IG9mZnNldDsKLQlvcGNEMV93b3JkX29wZXJhdGlvbltpXSAtPSBvZmZzZXQ7Ci0Jb3BjRDFfbG9uZ19vcGVyYXRpb25baV0gLT0gb2Zmc2V0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9vcHMyLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvb3BzMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzgxMzA3Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9vcHMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qCQkJCQkJUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKLSoKLSogICAgICAgICAgICAJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAJCQkJICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCi0qIAkJCQkJICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCi0qICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0qICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci0qICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKLSogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKLSogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCi0qICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgotKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSoKLSogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKLSogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgotKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZToJCUFOU0kgQwotKiBFbnZpcm9ubWVudDoJQW55Ci0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGluY2x1ZGVzIHN1YnJvdXRpbmVzIHRvIGltcGxlbWVudCB0aGUgZGVjb2RpbmcKLSogICAgICAgICAgICAgICBhbmQgZW11bGF0aW9uIG9mIGFsbCB0aGUgeDg2IGV4dGVuZGVkIHR3by1ieXRlIHByb2Nlc3NvcgotKiAgICAgICAgICAgICAgIGluc3RydWN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJ4ODZlbXUveDg2ZW11aS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLW9wMSAtIEluc3RydWN0aW9uIG9wIGNvZGUKLQotUkVNQVJLUzoKLUhhbmRsZXMgaWxsZWdhbCBvcGNvZGVzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3AyX2lsbGVnYWxfb3AoCi0JdTggb3AyKQotewotCVNUQVJUX09GX0lOU1RSKCk7Ci0JREVDT0RFX1BSSU5URigiSUxMRUdBTCBFWFRFTkRFRCBYODYgT1BDT0RFXG4iKTsKLQlUUkFDRV9SRUdTKCk7Ci0JcHJpbnRrKCIlMDR4OiUwNHg6ICUwMlggSUxMRUdBTCBFWFRFTkRFRCBYODYgT1BDT0RFIVxuIiwKLQkJTS54ODYuUl9DUywgTS54ODYuUl9JUC0yLG9wMik7Ci0gICAgSEFMVF9TWVMoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotI2RlZmluZSB4b3JsKGEsYikgICAoKGEpICYmICEoYikpIHx8ICghKGEpICYmIChiKSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBmLDB4ODAtMHg4RgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3AyX2xvbmdfanVtcCh1OCBvcDIpCi17Ci0gICAgczMyIHRhcmdldDsKLSAgICBjaGFyICpuYW1lID0gMDsKLSAgICBpbnQgY29uZCA9IDA7Ci0KLSAgICAvKiBjb25kaXRpb25hbCBqdW1wIHRvIHdvcmQgb2Zmc2V0LiAqLwotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgc3dpdGNoIChvcDIpIHsKLSAgICAgIGNhc2UgMHg4MDoKLQluYW1lID0gIkpPXHQiOwotCWNvbmQgPSAgQUNDRVNTX0ZMQUcoRl9PRik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4ODE6Ci0JbmFtZSA9ICJKTk9cdCI7Ci0JY29uZCA9ICFBQ0NFU1NfRkxBRyhGX09GKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg4MjoKLQluYW1lID0gIkpCXHQiOwotCWNvbmQgPSBBQ0NFU1NfRkxBRyhGX0NGKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg4MzoKLQluYW1lID0gIkpOQlx0IjsKLQljb25kID0gIUFDQ0VTU19GTEFHKEZfQ0YpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDg0OgotCW5hbWUgPSAiSlpcdCI7Ci0JY29uZCA9IEFDQ0VTU19GTEFHKEZfWkYpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDg1OgotCW5hbWUgPSAiSk5aXHQiOwotCWNvbmQgPSAhQUNDRVNTX0ZMQUcoRl9aRik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4ODY6Ci0JbmFtZSA9ICJKQkVcdCI7Ci0JY29uZCA9IEFDQ0VTU19GTEFHKEZfQ0YpIHx8IEFDQ0VTU19GTEFHKEZfWkYpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDg3OgotCW5hbWUgPSAiSk5CRVx0IjsKLQljb25kID0gIShBQ0NFU1NfRkxBRyhGX0NGKSB8fCBBQ0NFU1NfRkxBRyhGX1pGKSk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4ODg6Ci0JbmFtZSA9ICJKU1x0IjsKLQljb25kID0gQUNDRVNTX0ZMQUcoRl9TRik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4ODk6Ci0JbmFtZSA9ICJKTlNcdCI7Ci0JY29uZCA9ICFBQ0NFU1NfRkxBRyhGX1NGKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg4YToKLQluYW1lID0gIkpQXHQiOwotCWNvbmQgPSBBQ0NFU1NfRkxBRyhGX1BGKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg4YjoKLQluYW1lID0gIkpOUFx0IjsKLQljb25kID0gIUFDQ0VTU19GTEFHKEZfUEYpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDhjOgotCW5hbWUgPSAiSkxcdCI7Ci0JY29uZCA9IHhvcmwoQUNDRVNTX0ZMQUcoRl9TRiksIEFDQ0VTU19GTEFHKEZfT0YpKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg4ZDoKLQluYW1lID0gIkpOTFx0IjsKLQljb25kID0geG9ybChBQ0NFU1NfRkxBRyhGX1NGKSwgQUNDRVNTX0ZMQUcoRl9PRikpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDhlOgotCW5hbWUgPSAiSkxFXHQiOwotCWNvbmQgPSAoeG9ybChBQ0NFU1NfRkxBRyhGX1NGKSwgQUNDRVNTX0ZMQUcoRl9PRikpIHx8Ci0JCUFDQ0VTU19GTEFHKEZfWkYpKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg4ZjoKLQluYW1lID0gIkpOTEVcdCI7Ci0JY29uZCA9ICEoeG9ybChBQ0NFU1NfRkxBRyhGX1NGKSwgQUNDRVNTX0ZMQUcoRl9PRikpIHx8Ci0JCSBBQ0NFU1NfRkxBRyhGX1pGKSk7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9QUklOVEYobmFtZSk7Ci0gICAgdGFyZ2V0ID0gKHMxNikgZmV0Y2hfd29yZF9pbW0oKTsKLSAgICB0YXJnZXQgKz0gKHMxNikgTS54ODYuUl9JUDsKLSAgICBERUNPREVfUFJJTlRGMigiJTA0eFxuIiwgdGFyZ2V0KTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIGlmIChjb25kKQotCU0ueDg2LlJfSVAgPSAodTE2KXRhcmdldDsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwZiwweDkwLTB4OUYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wMl9zZXRfYnl0ZSh1OCBvcDIpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLSAgICB1OCAgKmRlc3RyZWc7Ci0gICAgY2hhciAqbmFtZSA9IDA7Ci0gICAgaW50IGNvbmQgPSAwOwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBzd2l0Y2ggKG9wMikgewotICAgICAgY2FzZSAweDkwOgotCW5hbWUgPSAiU0VUT1x0IjsKLQljb25kID0gIEFDQ0VTU19GTEFHKEZfT0YpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDkxOgotCW5hbWUgPSAiU0VUTk9cdCI7Ci0JY29uZCA9ICFBQ0NFU1NfRkxBRyhGX09GKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg5MjoKLQluYW1lID0gIlNFVEJcdCI7Ci0JY29uZCA9IEFDQ0VTU19GTEFHKEZfQ0YpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDkzOgotCW5hbWUgPSAiU0VUTkJcdCI7Ci0JY29uZCA9ICFBQ0NFU1NfRkxBRyhGX0NGKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg5NDoKLQluYW1lID0gIlNFVFpcdCI7Ci0JY29uZCA9IEFDQ0VTU19GTEFHKEZfWkYpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDk1OgotCW5hbWUgPSAiU0VUTlpcdCI7Ci0JY29uZCA9ICFBQ0NFU1NfRkxBRyhGX1pGKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg5NjoKLQluYW1lID0gIlNFVEJFXHQiOwotCWNvbmQgPSBBQ0NFU1NfRkxBRyhGX0NGKSB8fCBBQ0NFU1NfRkxBRyhGX1pGKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg5NzoKLQluYW1lID0gIlNFVE5CRVx0IjsKLQljb25kID0gIShBQ0NFU1NfRkxBRyhGX0NGKSB8fCBBQ0NFU1NfRkxBRyhGX1pGKSk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4OTg6Ci0JbmFtZSA9ICJTRVRTXHQiOwotCWNvbmQgPSBBQ0NFU1NfRkxBRyhGX1NGKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg5OToKLQluYW1lID0gIlNFVE5TXHQiOwotCWNvbmQgPSAhQUNDRVNTX0ZMQUcoRl9TRik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4OWE6Ci0JbmFtZSA9ICJTRVRQXHQiOwotCWNvbmQgPSBBQ0NFU1NfRkxBRyhGX1BGKTsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg5YjoKLQluYW1lID0gIlNFVE5QXHQiOwotCWNvbmQgPSAhQUNDRVNTX0ZMQUcoRl9QRik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4OWM6Ci0JbmFtZSA9ICJTRVRMXHQiOwotCWNvbmQgPSB4b3JsKEFDQ0VTU19GTEFHKEZfU0YpLCBBQ0NFU1NfRkxBRyhGX09GKSk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4OWQ6Ci0JbmFtZSA9ICJTRVROTFx0IjsKLQljb25kID0geG9ybChBQ0NFU1NfRkxBRyhGX1NGKSwgQUNDRVNTX0ZMQUcoRl9PRikpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDllOgotCW5hbWUgPSAiU0VUTEVcdCI7Ci0JY29uZCA9ICh4b3JsKEFDQ0VTU19GTEFHKEZfU0YpLCBBQ0NFU1NfRkxBRyhGX09GKSkgfHwKLQkJQUNDRVNTX0ZMQUcoRl9aRikpOwotCWJyZWFrOwotICAgICAgY2FzZSAweDlmOgotCW5hbWUgPSAiU0VUTkxFXHQiOwotCWNvbmQgPSAhKHhvcmwoQUNDRVNTX0ZMQUcoRl9TRiksIEFDQ0VTU19GTEFHKEZfT0YpKSB8fAotCQkgQUNDRVNTX0ZMQUcoRl9aRikpOwotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfUFJJTlRGKG5hbWUpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0Jc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGNvbmQgPyAweDAxIDogMHgwMCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBjb25kID8gMHgwMSA6IDB4MDApOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgY29uZCA/IDB4MDEgOiAweDAwKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBjb25kID8gMHgwMSA6IDB4MDA7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBmLDB4YTAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wMl9wdXNoX0ZTKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlBVU0hcdEZTXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIHB1c2hfd29yZChNLng4Ni5SX0ZTKTsKLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwZiwweGExCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcDJfcG9wX0ZTKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKLXsKLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlBPUFx0RlNcbiIpOwotICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0gICAgTS54ODYuUl9GUyA9IHBvcF93b3JkKCk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGYsMHhhMwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3AyX2J0X1IodTggWDg2RU1VX1VOVVNFRChvcDIpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IHNyY29mZnNldDsKLSAgICBpbnQgYml0LGRpc3A7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkJUXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgc3JjdmFsOwotCSAgICB1MzIgKnNoaWZ0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweDFGOwotCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwKTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgKDB4MSA8PCBiaXQpLEZfQ0YpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBzcmN2YWw7Ci0JICAgIHUxNiAqc2hpZnRyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKLQkgICAgZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDQ7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmICgweDEgPDwgYml0KSxGX0NGKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgc3JjdmFsOwotCSAgICB1MzIgKnNoaWZ0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweDFGOwotCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwKTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgKDB4MSA8PCBiaXQpLEZfQ0YpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBzcmN2YWw7Ci0JICAgIHUxNiAqc2hpZnRyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKLQkgICAgZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDQ7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmICgweDEgPDwgYml0KSxGX0NGKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgc3JjdmFsOwotCSAgICB1MzIgKnNoaWZ0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweDFGOwotCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwKTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgKDB4MSA8PCBiaXQpLEZfQ0YpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBzcmN2YWw7Ci0JICAgIHUxNiAqc2hpZnRyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKLQkgICAgZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDQ7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmICgweDEgPDwgYml0KSxGX0NGKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqc3JjcmVnLCpzaGlmdHJlZzsKLQotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4MUY7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKCpzcmNyZWcgJiAoMHgxIDw8IGJpdCksRl9DRik7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpzcmNyZWcsKnNoaWZ0cmVnOwotCi0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHhGOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnICYgKDB4MSA8PCBiaXQpLEZfQ0YpOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGYsMHhhNAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3AyX3NobGRfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBkZXN0b2Zmc2V0OwotCXU4IHNoaWZ0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJTSExEXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzaGlmdHJlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbCA9IHNobGRfbG9uZyhkZXN0dmFsLCpzaGlmdHJlZyxzaGlmdCk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzaGlmdHJlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbCA9IHNobGRfd29yZChkZXN0dmFsLCpzaGlmdHJlZyxzaGlmdCk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzaGlmdHJlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbCA9IHNobGRfbG9uZyhkZXN0dmFsLCpzaGlmdHJlZyxzaGlmdCk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzaGlmdHJlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbCA9IHNobGRfd29yZChkZXN0dmFsLCpzaGlmdHJlZyxzaGlmdCk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgZGVzdHZhbDsKLQkgICAgdTMyICpzaGlmdHJlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbCA9IHNobGRfbG9uZyhkZXN0dmFsLCpzaGlmdHJlZyxzaGlmdCk7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9IGVsc2UgewotCSAgICB1MTYgZGVzdHZhbDsKLQkgICAgdTE2ICpzaGlmdHJlZzsKLQotCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbCA9IHNobGRfd29yZChkZXN0dmFsLCpzaGlmdHJlZyxzaGlmdCk7Ci0JICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZywqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFxuIiwgc2hpZnQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNobGRfbG9uZygqZGVzdHJlZywqc2hpZnRyZWcsc2hpZnQpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZywqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFxuIiwgc2hpZnQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNobGRfd29yZCgqZGVzdHJlZywqc2hpZnRyZWcsc2hpZnQpOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGYsMHhhNQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3AyX3NobGRfQ0wodTggWDg2RU1VX1VOVVNFRChvcDIpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlNITERcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbCA9IHNobGRfbG9uZyhkZXN0dmFsLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbCA9IHNobGRfd29yZChkZXN0dmFsLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbCA9IHNobGRfbG9uZyhkZXN0dmFsLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbCA9IHNobGRfd29yZChkZXN0dmFsLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbCA9IHNobGRfbG9uZyhkZXN0dmFsLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKLQkgICAgZGVzdHZhbCA9IHNobGRfd29yZChkZXN0dmFsLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnLCpzaGlmdHJlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNobGRfbG9uZygqZGVzdHJlZywqc2hpZnRyZWcsTS54ODYuUl9DTCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnLCpzaGlmdHJlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNobGRfd29yZCgqZGVzdHJlZywqc2hpZnRyZWcsTS54ODYuUl9DTCk7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwZiwweGE4Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcDJfcHVzaF9HUyh1OCBYODZFTVVfVU5VU0VEKG9wMikpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJQVVNIXHRHU1xuIik7Ci0gICAgVFJBQ0VfQU5EX1NURVAoKTsKLSAgICBwdXNoX3dvcmQoTS54ODYuUl9HUyk7Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGYsMHhhOQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3AyX3BvcF9HUyh1OCBYODZFTVVfVU5VU0VEKG9wMikpCi17Ci0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJQT1BcdEdTXG4iKTsKLSAgICBUUkFDRV9BTkRfU1RFUCgpOwotICAgIE0ueDg2LlJfR1MgPSBwb3Bfd29yZCgpOwotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBmLDB4YWEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wMl9idHNfUih1OCBYODZFTVVfVU5VU0VEKG9wMikpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotICAgIGludCBiaXQsZGlzcDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQlRTXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgc3JjdmFsLG1hc2s7Ci0JICAgIHUzMiAqc2hpZnRyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4MUY7Ci0JICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA1OwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3ApOwotCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3AsIHNyY3ZhbCB8IG1hc2spOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBzcmN2YWwsbWFzazsKLQkgICAgdTE2ICpzaGlmdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHhGOwotCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNDsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwKTsKLQkJCW1hc2sgPSAodTE2KSgweDEgPDwgYml0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwLCBzcmN2YWwgfCBtYXNrKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgc3JjdmFsLG1hc2s7Ci0JICAgIHUzMiAqc2hpZnRyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4MUY7Ci0JICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA1OwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3ApOwotCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3AsIHNyY3ZhbCB8IG1hc2spOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBzcmN2YWwsbWFzazsKLQkgICAgdTE2ICpzaGlmdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHhGOwotCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNDsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwKTsKLQkJCW1hc2sgPSAodTE2KSgweDEgPDwgYml0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwLCBzcmN2YWwgfCBtYXNrKTsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgc3JjdmFsLG1hc2s7Ci0JICAgIHUzMiAqc2hpZnRyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4MUY7Ci0JICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA1OwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3ApOwotCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3AsIHNyY3ZhbCB8IG1hc2spOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBzcmN2YWwsbWFzazsKLQkgICAgdTE2ICpzaGlmdHJlZzsKLQotCQkJc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JCQlERUNPREVfUFJJTlRGKCIsIik7Ci0JCQlzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkJCVRSQUNFX0FORF9TVEVQKCk7Ci0JCQliaXQgPSAqc2hpZnRyZWcgJiAweEY7Ci0JCQlkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNDsKLQkJCXNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCk7Ci0JCQltYXNrID0gKHUxNikoMHgxIDw8IGJpdCk7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOwotCQkJc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwLCBzcmN2YWwgfCBtYXNrKTsKLQkJfQotCQlicmVhazsKLQljYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQkJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCQl1MzIgKnNyY3JlZywqc2hpZnRyZWc7Ci0JCQl1MzIgbWFzazsKLQotCQkJc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCQkJREVDT0RFX1BSSU5URigiLCIpOwotCQkJc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JCQlUUkFDRV9BTkRfU1RFUCgpOwotCQkJYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKLQkJCW1hc2sgPSAoMHgxIDw8IGJpdCk7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnICYgbWFzayxGX0NGKTsKLQkJCSpzcmNyZWcgfD0gbWFzazsKLQkJfSBlbHNlIHsKLQkJCXUxNiAqc3JjcmVnLCpzaGlmdHJlZzsKLQkJCXUxNiBtYXNrOwotCi0JCQlzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JCQlERUNPREVfUFJJTlRGKCIsIik7Ci0JCQlzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkJCVRSQUNFX0FORF9TVEVQKCk7Ci0JCQliaXQgPSAqc2hpZnRyZWcgJiAweEY7Ci0JCQltYXNrID0gKHUxNikoMHgxIDw8IGJpdCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKCpzcmNyZWcgJiBtYXNrLEZfQ0YpOwotCSAgICAqc3JjcmVnIHw9IG1hc2s7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwZiwweGFjCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcDJfc2hyZF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDIpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IGRlc3RvZmZzZXQ7Ci0JdTggc2hpZnQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIlNITERcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFxuIiwgc2hpZnQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsID0gc2hyZF9sb25nKGRlc3R2YWwsKnNoaWZ0cmVnLHNoaWZ0KTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFxuIiwgc2hpZnQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsID0gc2hyZF93b3JkKGRlc3R2YWwsKnNoaWZ0cmVnLHNoaWZ0KTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFxuIiwgc2hpZnQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsID0gc2hyZF9sb25nKGRlc3R2YWwsKnNoaWZ0cmVnLHNoaWZ0KTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFxuIiwgc2hpZnQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsID0gc2hyZF93b3JkKGRlc3R2YWwsKnNoaWZ0cmVnLHNoaWZ0KTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBkZXN0dmFsOwotCSAgICB1MzIgKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFxuIiwgc2hpZnQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsID0gc2hyZF9sb25nKGRlc3R2YWwsKnNoaWZ0cmVnLHNoaWZ0KTsKLQkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBkZXN0dmFsOwotCSAgICB1MTYgKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIERFQ09ERV9QUklOVEYyKCIlZFxuIiwgc2hpZnQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsID0gc2hyZF93b3JkKGRlc3R2YWwsKnNoaWZ0cmVnLHNoaWZ0KTsKLQkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnLCpzaGlmdHJlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc2hyZF9sb25nKCpkZXN0cmVnLCpzaGlmdHJlZyxzaGlmdCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnLCpzaGlmdHJlZzsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc2hyZF93b3JkKCpkZXN0cmVnLCpzaGlmdHJlZyxzaGlmdCk7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwZiwweGFkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcDJfc2hyZF9DTCh1OCBYODZFTVVfVU5VU0VEKG9wMikpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgZGVzdG9mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiU0hMRFx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsID0gc2hyZF9sb25nKGRlc3R2YWwsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsID0gc2hyZF93b3JkKGRlc3R2YWwsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsID0gc2hyZF9sb25nKGRlc3R2YWwsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsID0gc2hyZF93b3JkKGRlc3R2YWwsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIGRlc3R2YWw7Ci0JICAgIHUzMiAqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsID0gc2hyZF9sb25nKGRlc3R2YWwsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IGRlc3R2YWw7Ci0JICAgIHUxNiAqc2hpZnRyZWc7Ci0KLQkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOwotCSAgICBkZXN0dmFsID0gc2hyZF93b3JkKGRlc3R2YWwsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOwotCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWcsKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc2hyZF9sb25nKCpkZXN0cmVnLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWcsKnNoaWZ0cmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc2hyZF93b3JkKCpkZXN0cmVnLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBmLDB4YWYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wMl9pbXVsX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDIpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IHNyY29mZnNldDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiSU1VTFx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCSAgICB1MzIgcmVzX2xvLHJlc19oaTsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgaW11bF9sb25nX2RpcmVjdCgmcmVzX2xvLCZyZXNfaGksKHMzMikqZGVzdHJlZywoczMyKXNyY3ZhbCk7Ci0JICAgIGlmIChyZXNfaGkgIT0gMCkgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0JICAgIH0gZWxzZSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JICAgIH0KLQkgICAgKmRlc3RyZWcgPSAodTMyKXJlc19sbzsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0JICAgIHUzMiByZXM7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHJlcyA9IChzMTYpKmRlc3RyZWcgKiAoczE2KXNyY3ZhbDsKLQkgICAgaWYgKHJlcyA+IDB4RkZGRikgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0JICAgIH0gZWxzZSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JICAgIH0KLQkgICAgKmRlc3RyZWcgPSAodTE2KXJlczsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0JICAgIHUzMiByZXNfbG8scmVzX2hpOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBpbXVsX2xvbmdfZGlyZWN0KCZyZXNfbG8sJnJlc19oaSwoczMyKSpkZXN0cmVnLChzMzIpc3JjdmFsKTsKLQkgICAgaWYgKHJlc19oaSAhPSAwKSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLQkgICAgfSBlbHNlIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkgICAgfQotCSAgICAqZGVzdHJlZyA9ICh1MzIpcmVzX2xvOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQkgICAgdTMyIHJlczsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgcmVzID0gKHMxNikqZGVzdHJlZyAqIChzMTYpc3JjdmFsOwotCSAgICBpZiAocmVzID4gMHhGRkZGKSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLQkgICAgfSBlbHNlIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkgICAgfQotCSAgICAqZGVzdHJlZyA9ICh1MTYpcmVzOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQkgICAgdTMyIHJlc19sbyxyZXNfaGk7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGltdWxfbG9uZ19kaXJlY3QoJnJlc19sbywmcmVzX2hpLChzMzIpKmRlc3RyZWcsKHMzMilzcmN2YWwpOwotCSAgICBpZiAocmVzX2hpICE9IDApIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotCSAgICB9IGVsc2UgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCSAgICB9Ci0JICAgICpkZXN0cmVnID0gKHUzMilyZXNfbG87Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCSAgICB1MzIgcmVzOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICByZXMgPSAoczE2KSpkZXN0cmVnICogKHMxNilzcmN2YWw7Ci0JICAgIGlmIChyZXMgPiAweEZGRkYpIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotCSAgICB9IGVsc2UgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCSAgICB9Ci0JICAgICpkZXN0cmVnID0gKHUxNilyZXM7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKLQkgICAgdTMyIHJlc19sbyxyZXNfaGk7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGltdWxfbG9uZ19kaXJlY3QoJnJlc19sbywmcmVzX2hpLChzMzIpKmRlc3RyZWcsKHMzMikqc3JjcmVnKTsKLQkgICAgaWYgKHJlc19oaSAhPSAwKSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLQkgICAgfSBlbHNlIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkgICAgfQotCSAgICAqZGVzdHJlZyA9ICh1MzIpcmVzX2xvOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOwotCSAgICB1MzIgcmVzOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCSAgICByZXMgPSAoczE2KSpkZXN0cmVnICogKHMxNikqc3JjcmVnOwotCSAgICBpZiAocmVzID4gMHhGRkZGKSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLQkgICAgfSBlbHNlIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkgICAgfQotCSAgICAqZGVzdHJlZyA9ICh1MTYpcmVzOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiMgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3AyX2xzc19SX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCi17Ci0JaW50IG1vZCwgcmgsIHJsOwotICAgIHUxNiAqZHN0cmVnOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJMU1NcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRzdHJlZyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCU0ueDg2LlJfU1MgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0ICsgMik7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkc3RyZWcgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQlNLng4Ni5SX1NTID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCArIDIpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZHN0cmVnID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JTS54ODYuUl9TUyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQgKyAyKTsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQkvKiBVTkRFRklORUQhICovCi0JVFJBQ0VfQU5EX1NURVAoKTsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiMwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3AyX2J0cl9SKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKLXsKLQlpbnQgbW9kLCBybCwgcmg7Ci0JdWludCBzcmNvZmZzZXQ7Ci0JaW50IGJpdCxkaXNwOwotCi0JU1RBUlRfT0ZfSU5TVFIoKTsKLQlERUNPREVfUFJJTlRGKCJCVFJcdCIpOwotCUZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0Jc3dpdGNoIChtb2QpIHsKLQljYXNlIDA6Ci0JCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQkJdTMyIHNyY3ZhbCxtYXNrOwotCQkJdTMyICpzaGlmdHJlZzsKLQotCQkJc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JCQlERUNPREVfUFJJTlRGKCIsIik7Ci0JCQlzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkJCVRSQUNFX0FORF9TVEVQKCk7Ci0JCQliaXQgPSAqc2hpZnRyZWcgJiAweDFGOwotCQkJZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDU7Ci0JCQlzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3ApOwotCQkJbWFzayA9ICgweDEgPDwgYml0KTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7Ci0JCQlzdG9yZV9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3AsIHNyY3ZhbCAmIH5tYXNrKTsKLQkJfSBlbHNlIHsKLQkJCXUxNiBzcmN2YWwsbWFzazsKLQkJCXUxNiAqc2hpZnRyZWc7Ci0KLQkJCXNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCQkJREVDT0RFX1BSSU5URigiLCIpOwotCQkJc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JCQlUUkFDRV9BTkRfU1RFUCgpOwotCQkJYml0ID0gKnNoaWZ0cmVnICYgMHhGOwotCQkJZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDQ7Ci0JCQlzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3ApOwotCQkJbWFzayA9ICh1MTYpKDB4MSA8PCBiaXQpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKLQkJCXN0b3JlX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCwgKHUxNikoc3JjdmFsICYgfm1hc2spKTsKLQkJfQotCQlicmVhazsKLQljYXNlIDE6Ci0JCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQkJdTMyIHNyY3ZhbCxtYXNrOwotCQkJdTMyICpzaGlmdHJlZzsKLQotCQkJc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JCQlERUNPREVfUFJJTlRGKCIsIik7Ci0JCQlzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkJCVRSQUNFX0FORF9TVEVQKCk7Ci0JCQliaXQgPSAqc2hpZnRyZWcgJiAweDFGOwotCQkJZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDU7Ci0JCQlzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3ApOwotCQkJbWFzayA9ICgweDEgPDwgYml0KTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7Ci0JCQlzdG9yZV9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3AsIHNyY3ZhbCAmIH5tYXNrKTsKLQkJfSBlbHNlIHsKLQkJCXUxNiBzcmN2YWwsbWFzazsKLQkJCXUxNiAqc2hpZnRyZWc7Ci0KLQkJCXNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCQkJREVDT0RFX1BSSU5URigiLCIpOwotCQkJc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JCQlUUkFDRV9BTkRfU1RFUCgpOwotCQkJYml0ID0gKnNoaWZ0cmVnICYgMHhGOwotCQkJZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDQ7Ci0JCQlzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3ApOwotCQkJbWFzayA9ICh1MTYpKDB4MSA8PCBiaXQpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKLQkJCXN0b3JlX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCwgKHUxNikoc3JjdmFsICYgfm1hc2spKTsKLQkJfQotCQlicmVhazsKLQljYXNlIDI6Ci0JCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCQkJdTMyIHNyY3ZhbCxtYXNrOwotCQkJdTMyICpzaGlmdHJlZzsKLQotCQkJc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JCQlERUNPREVfUFJJTlRGKCIsIik7Ci0JCQlzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkJCVRSQUNFX0FORF9TVEVQKCk7Ci0JCQliaXQgPSAqc2hpZnRyZWcgJiAweDFGOwotCQkJZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDU7Ci0JCQlzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3ApOwotCQkJbWFzayA9ICgweDEgPDwgYml0KTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7Ci0JCQlzdG9yZV9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3AsIHNyY3ZhbCAmIH5tYXNrKTsKLQkJfSBlbHNlIHsKLQkJCXUxNiBzcmN2YWwsbWFzazsKLQkJCXUxNiAqc2hpZnRyZWc7Ci0KLQkJCXNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCQkJREVDT0RFX1BSSU5URigiLCIpOwotCQkJc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JCQlUUkFDRV9BTkRfU1RFUCgpOwotCQkJYml0ID0gKnNoaWZ0cmVnICYgMHhGOwotCQkJZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDQ7Ci0JCQlzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3ApOwotCQkJbWFzayA9ICh1MTYpKDB4MSA8PCBiaXQpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKLQkJCXN0b3JlX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCwgKHUxNikoc3JjdmFsICYgfm1hc2spKTsKLQkJfQotCQlicmVhazsKLQljYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQkJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCQl1MzIgKnNyY3JlZywqc2hpZnRyZWc7Ci0JCQl1MzIgbWFzazsKLQotCQkJc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCQkJREVDT0RFX1BSSU5URigiLCIpOwotCQkJc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JCQlUUkFDRV9BTkRfU1RFUCgpOwotCQkJYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKLQkJCW1hc2sgPSAoMHgxIDw8IGJpdCk7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnICYgbWFzayxGX0NGKTsKLQkJCSpzcmNyZWcgJj0gfm1hc2s7Ci0JCX0gZWxzZSB7Ci0JCQl1MTYgKnNyY3JlZywqc2hpZnRyZWc7Ci0JCQl1MTYgbWFzazsKLQotCQkJc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCQkJREVDT0RFX1BSSU5URigiLCIpOwotCQkJc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JCQlUUkFDRV9BTkRfU1RFUCgpOwotCQkJYml0ID0gKnNoaWZ0cmVnICYgMHhGOwotCQkJbWFzayA9ICh1MTYpKDB4MSA8PCBiaXQpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyAmIG1hc2ssRl9DRik7Ci0JCQkqc3JjcmVnICY9IH5tYXNrOwotCQl9Ci0JCWJyZWFrOwotCX0KLQlERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0JRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwZiwweGI0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcDJfbGZzX1JfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKLXsKLQlpbnQgbW9kLCByaCwgcmw7Ci0gICAgdTE2ICpkc3RyZWc7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkxGU1x0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZHN0cmVnID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JTS54ODYuUl9GUyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQgKyAyKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRzdHJlZyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCU0ueDg2LlJfRlMgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0ICsgMik7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkc3RyZWcgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQlNLng4Ni5SX0ZTID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCArIDIpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCS8qIFVOREVGSU5FRCEgKi8KLQlUUkFDRV9BTkRfU1RFUCgpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwZiwweGI1Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcDJfbGdzX1JfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKLXsKLQlpbnQgbW9kLCByaCwgcmw7Ci0gICAgdTE2ICpkc3RyZWc7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIkxHU1x0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZHN0cmVnID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JTS54ODYuUl9HUyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQgKyAyKTsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRzdHJlZyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCU0ueDg2LlJfR1MgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0ICsgMik7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkc3RyZWcgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQlNLng4Ni5SX0dTID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCArIDIpOwotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCS8qIFVOREVGSU5FRCEgKi8KLQlUUkFDRV9BTkRfU1RFUCgpOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwZiwweGI2Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcDJfbW92enhfYnl0ZV9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk1PVlpYXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc3JjdmFsOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzcmN2YWw7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc3JjdmFsOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzcmN2YWw7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTggICpzcmNyZWc7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gKnNyY3JlZzsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHU4ICAqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9ICpzcmNyZWc7Ci0JfQotCWJyZWFrOwotICAgIH0KLSAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7Ci0gICAgRU5EX09GX0lOU1RSKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSGFuZGxlcyBvcGNvZGUgMHgwZiwweGI3Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB4ODZlbXVPcDJfbW92enhfd29yZF9SX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKLXsKLSAgICBpbnQgbW9kLCBybCwgcmg7Ci0gICAgdWludCBzcmNvZmZzZXQ7Ci0gICAgdTMyICpkZXN0cmVnOwotICAgIHUzMiBzcmN2YWw7Ci0gICAgdTE2ICpzcmNyZWc7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIERFQ09ERV9QUklOVEYoIk1PVlpYXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IHNyY3ZhbDsKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gc3JjdmFsOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBzcmN2YWw7Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9ICpzcmNyZWc7Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBmLDB4YmEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wMl9idFhfSSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotICAgIGludCBiaXQ7Ci0KLSAgICBTVEFSVF9PRl9JTlNUUigpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChyaCkgewotICAgIGNhc2UgMzoKLQlERUNPREVfUFJJTlRGKCJCVFx0Iik7Ci0JYnJlYWs7Ci0gICAgY2FzZSA0OgotCURFQ09ERV9QUklOVEYoIkJUU1x0Iik7Ci0JYnJlYWs7Ci0gICAgY2FzZSA1OgotCURFQ09ERV9QUklOVEYoIkJUUlx0Iik7Ci0JYnJlYWs7Ci0gICAgY2FzZSA2OgotCURFQ09ERV9QUklOVEYoIkJUQ1x0Iik7Ci0JYnJlYWs7Ci0gICAgZGVmYXVsdDoKLQlERUNPREVfUFJJTlRGKCJJTExFR0FMIEVYVEVOREVEIFg4NiBPUENPREVcbiIpOwotCVRSQUNFX1JFR1MoKTsKLQlwcmludGsoIiUwNHg6JTA0eDogJTAyWCUwMlggSUxMRUdBTCBFWFRFTkRFRCBYODYgT1BDT0RFIEVYVEVOU0lPTiFcbiIsCi0JCU0ueDg2LlJfQ1MsIE0ueDg2LlJfSVAtMyxvcDIsIChtb2Q8PDYpfChyaDw8Myl8cmwpOwotCUhBTFRfU1lTKCk7Ci0gICAgfQotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgc3JjdmFsLCBtYXNrOwotCSAgICB1OCBzaGlmdDsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGJpdCA9IHNoaWZ0ICYgMHgxRjsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7Ci0JICAgIHN3aXRjaCAocmgpIHsKLQkgICAgY2FzZSA0OgotCQlzdG9yZV9kYXRhX2xvbmcoc3Jjb2Zmc2V0LCBzcmN2YWwgfCBtYXNrKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgNToKLQkJc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCwgc3JjdmFsICYgfm1hc2spOwotCQlicmVhazsKLQkgICAgY2FzZSA2OgotCQlzdG9yZV9kYXRhX2xvbmcoc3Jjb2Zmc2V0LCBzcmN2YWwgXiBtYXNrKTsKLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JCWJyZWFrOwotCSAgICB9Ci0JfSBlbHNlIHsKLQkgICAgdTE2IHNyY3ZhbCwgbWFzazsKLQkgICAgdTggc2hpZnQ7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBiaXQgPSBzaGlmdCAmIDB4RjsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7Ci0JICAgIHN3aXRjaCAocmgpIHsKLQkgICAgY2FzZSA0OgotCQlzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0LCBzcmN2YWwgfCBtYXNrKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgNToKLQkJc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCwgc3JjdmFsICYgfm1hc2spOwotCQlicmVhazsKLQkgICAgY2FzZSA2OgotCQlzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0LCBzcmN2YWwgXiBtYXNrKTsKLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMToKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIHNyY3ZhbCwgbWFzazsKLQkgICAgdTggc2hpZnQ7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBiaXQgPSBzaGlmdCAmIDB4MUY7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOwotCSAgICBzd2l0Y2ggKHJoKSB7Ci0JICAgIGNhc2UgNDoKLQkJc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCwgc3JjdmFsIHwgbWFzayk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDU6Ci0JCXN0b3JlX2RhdGFfbG9uZyhzcmNvZmZzZXQsIHNyY3ZhbCAmIH5tYXNrKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgNjoKLQkJc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCwgc3JjdmFsIF4gbWFzayk7Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQlicmVhazsKLQkgICAgfQotCX0gZWxzZSB7Ci0JICAgIHUxNiBzcmN2YWwsIG1hc2s7Ci0JICAgIHU4IHNoaWZ0OwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgYml0ID0gc2hpZnQgJiAweEY7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOwotCSAgICBzd2l0Y2ggKHJoKSB7Ci0JICAgIGNhc2UgNDoKLQkJc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCwgc3JjdmFsIHwgbWFzayk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDU6Ci0JCXN0b3JlX2RhdGFfd29yZChzcmNvZmZzZXQsIHNyY3ZhbCAmIH5tYXNrKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgNjoKLQkJc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCwgc3JjdmFsIF4gbWFzayk7Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQlicmVhazsKLQkgICAgfQotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBzcmN2YWwsIG1hc2s7Ci0JICAgIHU4IHNoaWZ0OwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgYml0ID0gc2hpZnQgJiAweDFGOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgbWFzayA9ICgweDEgPDwgYml0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKLQkgICAgc3dpdGNoIChyaCkgewotCSAgICBjYXNlIDQ6Ci0JCXN0b3JlX2RhdGFfbG9uZyhzcmNvZmZzZXQsIHNyY3ZhbCB8IG1hc2spOwotCQlicmVhazsKLQkgICAgY2FzZSA1OgotCQlzdG9yZV9kYXRhX2xvbmcoc3Jjb2Zmc2V0LCBzcmN2YWwgJiB+bWFzayk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDY6Ci0JCXN0b3JlX2RhdGFfbG9uZyhzcmNvZmZzZXQsIHNyY3ZhbCBeIG1hc2spOwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJYnJlYWs7Ci0JICAgIH0KLQl9IGVsc2UgewotCSAgICB1MTYgc3JjdmFsLCBtYXNrOwotCSAgICB1OCBzaGlmdDsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGJpdCA9IHNoaWZ0ICYgMHhGOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgbWFzayA9ICgweDEgPDwgYml0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKLQkgICAgc3dpdGNoIChyaCkgewotCSAgICBjYXNlIDQ6Ci0JCXN0b3JlX2RhdGFfd29yZChzcmNvZmZzZXQsIHNyY3ZhbCB8IG1hc2spOwotCQlicmVhazsKLQkgICAgY2FzZSA1OgotCQlzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0LCBzcmN2YWwgJiB+bWFzayk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDY6Ci0JCXN0b3JlX2RhdGFfd29yZChzcmNvZmZzZXQsIHNyY3ZhbCBeIG1hc2spOwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCi0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqc3JjcmVnOwotCSAgICB1MzIgbWFzazsKLQkgICAgdTggc2hpZnQ7Ci0KLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgYml0ID0gc2hpZnQgJiAweDFGOwotCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnICYgbWFzayxGX0NGKTsKLQkgICAgc3dpdGNoIChyaCkgewotCSAgICBjYXNlIDQ6Ci0JCSpzcmNyZWcgfD0gbWFzazsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgNToKLQkJKnNyY3JlZyAmPSB+bWFzazsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgNjoKLQkJKnNyY3JlZyBePSBtYXNrOwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJYnJlYWs7Ci0JICAgIH0KLQl9IGVsc2UgewotCSAgICB1MTYgKnNyY3JlZzsKLQkgICAgdTE2IG1hc2s7Ci0JICAgIHU4IHNoaWZ0OwotCi0JICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGJpdCA9IHNoaWZ0ICYgMHhGOwotCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnICYgbWFzayxGX0NGKTsKLQkgICAgc3dpdGNoIChyaCkgewotCSAgICBjYXNlIDQ6Ci0JCSpzcmNyZWcgfD0gbWFzazsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgNToKLQkJKnNyY3JlZyAmPSB+bWFzazsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgNjoKLQkJKnNyY3JlZyBePSBtYXNrOwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBmLDB4YmIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wMl9idGNfUih1OCBYODZFTVVfVU5VU0VEKG9wMikpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotICAgIGludCBiaXQsZGlzcDsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiQlRDXHQiKTsKLSAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOwotICAgIHN3aXRjaCAobW9kKSB7Ci0gICAgY2FzZSAwOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgc3JjdmFsLG1hc2s7Ci0JICAgIHUzMiAqc2hpZnRyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4MUY7Ci0JICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA1OwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3ApOwotCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOwotCSAgICBzdG9yZV9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3AsIHNyY3ZhbCBeIG1hc2spOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBzcmN2YWwsbWFzazsKLQkgICAgdTE2ICpzaGlmdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHhGOwotCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNDsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwKTsKLQkJCW1hc2sgPSAodTE2KSgweDEgPDwgYml0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKLQkJCXN0b3JlX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCwgKHUxNikoc3JjdmFsIF4gbWFzaykpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBzcmN2YWwsbWFzazsKLQkgICAgdTMyICpzaGlmdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKLQkgICAgZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDU7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQrZGlzcCk7Ci0JICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhzcmNvZmZzZXQrZGlzcCwgc3JjdmFsIF4gbWFzayk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IHNyY3ZhbCxtYXNrOwotCSAgICB1MTYgKnNoaWZ0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAxX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweEY7Ci0JICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA0OwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3ApOwotCQkJbWFzayA9ICh1MTYpKDB4MSA8PCBiaXQpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKLQkJCXN0b3JlX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCwgKHUxNikoc3JjdmFsIF4gbWFzaykpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBzcmN2YWwsbWFzazsKLQkgICAgdTMyICpzaGlmdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKLQkgICAgZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDU7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQrZGlzcCk7Ci0JICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCAmIG1hc2ssRl9DRik7Ci0JICAgIHN0b3JlX2RhdGFfbG9uZyhzcmNvZmZzZXQrZGlzcCwgc3JjdmFsIF4gbWFzayk7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IHNyY3ZhbCxtYXNrOwotCSAgICB1MTYgKnNoaWZ0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweEY7Ci0JICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA0OwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3ApOwotCQkJbWFzayA9ICh1MTYpKDB4MSA8PCBiaXQpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKLQkJCXN0b3JlX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCwgKHUxNikoc3JjdmFsIF4gbWFzaykpOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJCXUzMiAqc3JjcmVnLCpzaGlmdHJlZzsKLQkgICAgdTMyIG1hc2s7Ci0KLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweDFGOwotCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyAmIG1hc2ssRl9DRik7Ci0JCQkqc3JjcmVnIF49IG1hc2s7Ci0JCX0gZWxzZSB7Ci0JCQl1MTYgKnNyY3JlZywqc2hpZnRyZWc7Ci0JCQl1MTYgbWFzazsKLQotCQkJc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOwotCQkJREVDT0RFX1BSSU5URigiLCIpOwotCQkJc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JCQlUUkFDRV9BTkRfU1RFUCgpOwotCQkJYml0ID0gKnNoaWZ0cmVnICYgMHhGOwotCQkJbWFzayA9ICh1MTYpKDB4MSA8PCBiaXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnICYgbWFzayxGX0NGKTsKLQkgICAgKnNyY3JlZyBePSBtYXNrOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiYwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3AyX2JzZih1OCBYODZFTVVfVU5VU0VEKG9wMikpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJCU0ZcbiIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIHNyY3ZhbCwgKmRzdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgPT0gMCwgRl9aRik7Ci0JICAgIGZvcigqZHN0cmVnID0gMDsgKmRzdHJlZyA8IDMyOyAoKmRzdHJlZykrKykKLQkJaWYgKChzcmN2YWwgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKLQl9IGVsc2UgewotCSAgICB1MTYgc3JjdmFsLCAqZHN0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCA9PSAwLCBGX1pGKTsKLQkgICAgZm9yKCpkc3RyZWcgPSAwOyAqZHN0cmVnIDwgMTY7ICgqZHN0cmVnKSsrKQotCQlpZiAoKHNyY3ZhbCA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBzcmN2YWwsICpkc3RyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZHN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsID09IDAsIEZfWkYpOwotCSAgICBmb3IoKmRzdHJlZyA9IDA7ICpkc3RyZWcgPCAzMjsgKCpkc3RyZWcpKyspCi0JCWlmICgoc3JjdmFsID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IHNyY3ZhbCwgKmRzdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgPT0gMCwgRl9aRik7Ci0JICAgIGZvcigqZHN0cmVnID0gMDsgKmRzdHJlZyA8IDE2OyAoKmRzdHJlZykrKykKLQkJaWYgKChzcmN2YWwgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgc3JjdmFsLCAqZHN0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCA9PSAwLCBGX1pGKTsKLQkgICAgZm9yKCpkc3RyZWcgPSAwOyAqZHN0cmVnIDwgMzI7ICgqZHN0cmVnKSsrKQotCQlpZiAoKHNyY3ZhbCA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBzcmN2YWwsICpkc3RyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsID09IDAsIEZfWkYpOwotCSAgICBmb3IoKmRzdHJlZyA9IDA7ICpkc3RyZWcgPCAxNjsgKCpkc3RyZWcpKyspCi0JCWlmICgoc3JjdmFsID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzoJCQkJLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpzcmNyZWcsICpkc3RyZWc7Ci0KLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyA9PSAwLCBGX1pGKTsKLQkgICAgZm9yKCpkc3RyZWcgPSAwOyAqZHN0cmVnIDwgMzI7ICgqZHN0cmVnKSsrKQotCQlpZiAoKCpzcmNyZWcgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKLQl9IGVsc2UgewotCSAgICB1MTYgKnNyY3JlZywgKmRzdHJlZzsKLQotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnID09IDAsIEZfWkYpOwotCSAgICBmb3IoKmRzdHJlZyA9IDA7ICpkc3RyZWcgPCAxNjsgKCpkc3RyZWcpKyspCi0JCWlmICgoKnNyY3JlZyA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiZAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3AyX2Jzcih1OCBYODZFTVVfVU5VU0VEKG9wMikpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJCU0ZcbiIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyIHNyY3ZhbCwgKmRzdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMF9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgPT0gMCwgRl9aRik7Ci0JICAgIGZvcigqZHN0cmVnID0gMzE7ICpkc3RyZWcgPiAwOyAoKmRzdHJlZyktLSkKLQkJaWYgKChzcmN2YWwgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKLQl9IGVsc2UgewotCSAgICB1MTYgc3JjdmFsLCAqZHN0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCA9PSAwLCBGX1pGKTsKLQkgICAgZm9yKCpkc3RyZWcgPSAxNTsgKmRzdHJlZyA+IDA7ICgqZHN0cmVnKS0tKQotCQlpZiAoKHNyY3ZhbCA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiBzcmN2YWwsICpkc3RyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZHN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsID09IDAsIEZfWkYpOwotCSAgICBmb3IoKmRzdHJlZyA9IDMxOyAqZHN0cmVnID4gMDsgKCpkc3RyZWcpLS0pCi0JCWlmICgoc3JjdmFsID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7Ci0JfSBlbHNlIHsKLQkgICAgdTE2IHNyY3ZhbCwgKmRzdHJlZzsKLQotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgPT0gMCwgRl9aRik7Ci0JICAgIGZvcigqZHN0cmVnID0gMTU7ICpkc3RyZWcgPiAwOyAoKmRzdHJlZyktLSkKLQkJaWYgKChzcmN2YWwgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgc3JjdmFsLCAqZHN0cmVnOwotCi0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7Ci0JICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCA9PSAwLCBGX1pGKTsKLQkgICAgZm9yKCpkc3RyZWcgPSAzMTsgKmRzdHJlZyA+IDA7ICgqZHN0cmVnKS0tKQotCQlpZiAoKHNyY3ZhbCA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOwotCX0gZWxzZSB7Ci0JICAgIHUxNiBzcmN2YWwsICpkc3RyZWc7Ci0KLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMTBfYWRkcmVzcyhybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsID09IDAsIEZfWkYpOwotCSAgICBmb3IoKmRzdHJlZyA9IDE1OyAqZHN0cmVnID4gMDsgKCpkc3RyZWcpLS0pCi0JCWlmICgoc3JjdmFsID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzoJCQkJLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpzcmNyZWcsICpkc3RyZWc7Ci0KLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIGRzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyA9PSAwLCBGX1pGKTsKLQkgICAgZm9yKCpkc3RyZWcgPSAzMTsgKmRzdHJlZyA+IDA7ICgqZHN0cmVnKS0tKQotCQlpZiAoKCpzcmNyZWcgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKLQl9IGVsc2UgewotCSAgICB1MTYgKnNyY3JlZywgKmRzdHJlZzsKLQotCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnID09IDAsIEZfWkYpOwotCSAgICBmb3IoKmRzdHJlZyA9IDE1OyAqZHN0cmVnID4gMDsgKCpkc3RyZWcpLS0pCi0JCWlmICgoKnNyY3JlZyA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOwotCX0KLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUhhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgeDg2ZW11T3AyX21vdnN4X2J5dGVfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCi17Ci0gICAgaW50IG1vZCwgcmwsIHJoOwotICAgIHVpbnQgc3Jjb2Zmc2V0OwotCi0gICAgU1RBUlRfT0ZfSU5TVFIoKTsKLSAgICBERUNPREVfUFJJTlRGKCJNT1ZTWFx0Iik7Ci0gICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKLSAgICBzd2l0Y2ggKG1vZCkgewotICAgIGNhc2UgMDoKLQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkgICAgdTMyICpkZXN0cmVnOwotCSAgICB1MzIgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IChzMzIpKChzOClmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KSk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc3JjdmFsOwotCX0gZWxzZSB7Ci0JICAgIHUxNiAqZGVzdHJlZzsKLQkgICAgdTE2IHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTAwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSAoczE2KSgoczgpZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCkpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKLQl9Ci0JYnJlYWs7Ci0gICAgY2FzZSAxOgotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHUzMiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gKHMzMikoKHM4KWZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzcmN2YWw7Ci0JfSBlbHNlIHsKLQkgICAgdTE2ICpkZXN0cmVnOwotCSAgICB1MTYgc3JjdmFsOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDFfYWRkcmVzcyhybCk7Ci0JICAgIHNyY3ZhbCA9IChzMTYpKChzOClmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KSk7Ci0JICAgIERFQ09ERV9QUklOVEYoIlxuIik7Ci0JICAgIFRSQUNFX0FORF9TVEVQKCk7Ci0JICAgICpkZXN0cmVnID0gc3JjdmFsOwotCX0KLQlicmVhazsKLSAgICBjYXNlIDI6Ci0JaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JICAgIHUzMiAqZGVzdHJlZzsKLQkgICAgdTMyIHNyY3ZhbDsKLQotCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCSAgICBERUNPREVfUFJJTlRGKCIsIik7Ci0JICAgIHNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCSAgICBzcmN2YWwgPSAoczMyKSgoczgpZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCkpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHUxNiBzcmN2YWw7Ci0KLQkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKLQkgICAgREVDT0RFX1BSSU5URigiLCIpOwotCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm0xMF9hZGRyZXNzKHJsKTsKLQkgICAgc3JjdmFsID0gKHMxNikoKHM4KWZldGNoX2RhdGFfYnl0ZShzcmNvZmZzZXQpKTsKLQkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKLQkgICAgVFJBQ0VfQU5EX1NURVAoKTsKLQkgICAgKmRlc3RyZWcgPSBzcmN2YWw7Ci0JfQotCWJyZWFrOwotICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLwotCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgewotCSAgICB1MzIgKmRlc3RyZWc7Ci0JICAgIHU4ICAqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IChzMzIpKChzOCkqc3JjcmVnKTsKLQl9IGVsc2UgewotCSAgICB1MTYgKmRlc3RyZWc7Ci0JICAgIHU4ICAqc3JjcmVnOwotCi0JICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7Ci0JICAgIERFQ09ERV9QUklOVEYoIiwiKTsKLQkgICAgc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOwotCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOwotCSAgICBUUkFDRV9BTkRfU1RFUCgpOwotCSAgICAqZGVzdHJlZyA9IChzMTYpKChzOCkqc3JjcmVnKTsKLQl9Ci0JYnJlYWs7Ci0gICAgfQotICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKLSAgICBFTkRfT0ZfSU5TVFIoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1IYW5kbGVzIG9wY29kZSAweDBmLDB4YmYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHg4NmVtdU9wMl9tb3ZzeF93b3JkX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDIpKQotewotICAgIGludCBtb2QsIHJsLCByaDsKLSAgICB1aW50IHNyY29mZnNldDsKLSAgICB1MzIgKmRlc3RyZWc7Ci0gICAgdTMyIHNyY3ZhbDsKLSAgICB1MTYgKnNyY3JlZzsKLQotICAgIFNUQVJUX09GX0lOU1RSKCk7Ci0gICAgREVDT0RFX1BSSU5URigiTU9WU1hcdCIpOwotICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7Ci0gICAgc3dpdGNoIChtb2QpIHsKLSAgICBjYXNlIDA6Ci0JZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKLQlERUNPREVfUFJJTlRGKCIsIik7Ci0Jc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtMDBfYWRkcmVzcyhybCk7Ci0Jc3JjdmFsID0gKHMzMikoKHMxNilmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KSk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gc3JjdmFsOwotCWJyZWFrOwotICAgIGNhc2UgMToKLQlkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNvZmZzZXQgPSBkZWNvZGVfcm0wMV9hZGRyZXNzKHJsKTsKLQlzcmN2YWwgPSAoczMyKSgoczE2KWZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpKTsKLQlERUNPREVfUFJJTlRGKCJcbiIpOwotCVRSQUNFX0FORF9TVEVQKCk7Ci0JKmRlc3RyZWcgPSBzcmN2YWw7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCWRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7Ci0JREVDT0RFX1BSSU5URigiLCIpOwotCXNyY29mZnNldCA9IGRlY29kZV9ybTEwX2FkZHJlc3MocmwpOwotCXNyY3ZhbCA9IChzMzIpKChzMTYpZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCkpOwotCURFQ09ERV9QUklOVEYoIlxuIik7Ci0JVFJBQ0VfQU5EX1NURVAoKTsKLQkqZGVzdHJlZyA9IHNyY3ZhbDsKLQlicmVhazsKLSAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KLQlkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOwotCURFQ09ERV9QUklOVEYoIiwiKTsKLQlzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7Ci0JREVDT0RFX1BSSU5URigiXG4iKTsKLQlUUkFDRV9BTkRfU1RFUCgpOwotCSpkZXN0cmVnID0gKHMzMikoKHMxNikqc3JjcmVnKTsKLQlicmVhazsKLSAgICB9Ci0gICAgREVDT0RFX0NMRUFSX1NFR09WUigpOwotICAgIEVORF9PRl9JTlNUUigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBEb3VibGUgYnl0ZSBvcGVyYXRpb24gY29kZSB0YWJsZToKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgKCp4ODZlbXVfb3B0YWIyWzI1Nl0pKHU4KSA9Ci17Ci0vKiAgMHgwMCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIEdyb3VwIEYgKHJpbmcgMCBQTSkgICAgICAqLwotLyogIDB4MDEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBHcm91cCBHIChyaW5nIDAgUE0pICAgICAgKi8KLS8qICAweDAyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogbGFyIChyaW5nIDAgUE0pICAgICAgICAgICovCi0vKiAgMHgwMyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIGxzbCAocmluZyAwIFBNKSAgICAgICAgICAqLwotLyogIDB4MDQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgwNSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIGxvYWRhbGwgKHVuZG9jdW1lbnRlZCkgICAqLwotLyogIDB4MDYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBjbHRzIChyaW5nIDAgUE0pICAgICAgICAgKi8KLS8qICAweDA3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogbG9hZGFsbCAodW5kb2N1bWVudGVkKSAgICovCi0vKiAgMHgwOCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIGludmQgKHJpbmcgMCBQTSkgICAgICAgICAqLwotLyogIDB4MDkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiB3YmludmQgKHJpbmcgMCBQTSkgICAgICAgKi8KLS8qICAweDBhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MGIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgwYyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDBkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MGUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgwZiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLQotLyogIDB4MTAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgxMSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDEyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MTMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgxNCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDE1ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MTYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgxNyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDE4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MTkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgxYSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDFiICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MWMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgxZCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDFlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MWYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0KLS8qICAweDIwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogbW92IHJlZzMyLGNyZWcgKHJpbmcgMCBQTSkgKi8KLS8qICAweDIxICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogbW92IHJlZzMyLGRyZWcgKHJpbmcgMCBQTSkgKi8KLS8qICAweDIyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogbW92IGNyZWcscmVnMzIgKHJpbmcgMCBQTSkgKi8KLS8qICAweDIzICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogbW92IGRyZWcscmVnMzIgKHJpbmcgMCBQTSkgKi8KLS8qICAweDI0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogbW92IHJlZzMyLHRyZWcgKHJpbmcgMCBQTSkgKi8KLS8qICAweDI1ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MjYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBtb3YgdHJlZyxyZWczMiAocmluZyAwIFBNKSAqLwotLyogIDB4MjcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgyOCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDI5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MmEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgyYiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDJjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MmQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgyZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDJmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotCi0vKiAgMHgzMCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDMxICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MzIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgzMyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDM0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MzUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgzNiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDM3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4MzggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgzOSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDNhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4M2IgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgzYyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDNkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4M2UgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHgzZiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLQotLyogIDB4NDAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg0MSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDQyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NDMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg0NCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDQ1ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NDYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg0NyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDQ4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NDkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg0YSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDRiICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NGMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg0ZCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDRlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NGYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0KLS8qICAweDUwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NTEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg1MiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDUzICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NTQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg1NSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDU2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NTcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg1OCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDU5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NWEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg1YiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDVjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NWQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg1ZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDVmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotCi0vKiAgMHg2MCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDYxICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NjIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg2MyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDY0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NjUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg2NiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDY3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NjggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg2OSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDZhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NmIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg2YyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDZkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NmUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg2ZiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLQotLyogIDB4NzAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg3MSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDcyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NzMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg3NCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDc1ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NzYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg3NyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDc4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4NzkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg3YSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDdiICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4N2MgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHg3ZCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweDdlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4N2YgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0KLS8qICAweDgwICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCi0vKiAgMHg4MSAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAotLyogIDB4ODIgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKLS8qICAweDgzICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCi0vKiAgMHg4NCAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAotLyogIDB4ODUgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKLS8qICAweDg2ICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCi0vKiAgMHg4NyAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAotLyogIDB4ODggKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKLS8qICAweDg5ICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCi0vKiAgMHg4YSAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAotLyogIDB4OGIgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKLS8qICAweDhjICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCi0vKiAgMHg4ZCAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAotLyogIDB4OGUgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKLS8qICAweDhmICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCi0KLS8qICAweDkwICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKLS8qICAweDkxICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKLS8qICAweDkyICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKLS8qICAweDkzICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKLS8qICAweDk0ICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKLS8qICAweDk1ICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKLS8qICAweDk2ICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKLS8qICAweDk3ICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKLS8qICAweDk4ICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKLS8qICAweDk5ICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKLS8qICAweDlhICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKLS8qICAweDliICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKLS8qICAweDljICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKLS8qICAweDlkICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKLS8qICAweDllICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKLS8qICAweDlmICovIHg4NmVtdU9wMl9zZXRfYnl0ZSwKLQotLyogIDB4YTAgKi8geDg2ZW11T3AyX3B1c2hfRlMsCi0vKiAgMHhhMSAqLyB4ODZlbXVPcDJfcG9wX0ZTLAotLyogIDB4YTIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhhMyAqLyB4ODZlbXVPcDJfYnRfUiwKLS8qICAweGE0ICovIHg4NmVtdU9wMl9zaGxkX0lNTSwKLS8qICAweGE1ICovIHg4NmVtdU9wMl9zaGxkX0NMLAotLyogIDB4YTYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhhNyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGE4ICovIHg4NmVtdU9wMl9wdXNoX0dTLAotLyogIDB4YTkgKi8geDg2ZW11T3AyX3BvcF9HUywKLS8qICAweGFhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4YWIgKi8geDg2ZW11T3AyX2J0X1IsCi0vKiAgMHhhYyAqLyB4ODZlbXVPcDJfc2hyZF9JTU0sCi0vKiAgMHhhZCAqLyB4ODZlbXVPcDJfc2hyZF9DTCwKLS8qICAweGFlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4YWYgKi8geDg2ZW11T3AyX2ltdWxfUl9STSwKLQotLyogIDB4YjAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBUT0RPOiBjbXB4Y2hnICovCi0vKiAgMHhiMSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIFRPRE86IGNtcHhjaGcgKi8KLS8qICAweGIyICovIHg4NmVtdU9wMl9sc3NfUl9JTU0sCi0vKiAgMHhiMyAqLyB4ODZlbXVPcDJfYnRyX1IsCi0vKiAgMHhiNCAqLyB4ODZlbXVPcDJfbGZzX1JfSU1NLAotLyogIDB4YjUgKi8geDg2ZW11T3AyX2xnc19SX0lNTSwKLS8qICAweGI2ICovIHg4NmVtdU9wMl9tb3Z6eF9ieXRlX1JfUk0sCi0vKiAgMHhiNyAqLyB4ODZlbXVPcDJfbW92enhfd29yZF9SX1JNLAotLyogIDB4YjggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhiOSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGJhICovIHg4NmVtdU9wMl9idFhfSSwKLS8qICAweGJiICovIHg4NmVtdU9wMl9idGNfUiwKLS8qICAweGJjICovIHg4NmVtdU9wMl9ic2YsCi0vKiAgMHhiZCAqLyB4ODZlbXVPcDJfYnNyLAotLyogIDB4YmUgKi8geDg2ZW11T3AyX21vdnN4X2J5dGVfUl9STSwKLS8qICAweGJmICovIHg4NmVtdU9wMl9tb3ZzeF93b3JkX1JfUk0sCi0KLS8qICAweGMwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogeGFkZCAqLwotLyogIDB4YzEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBUT0RPOiB4YWRkICovCi0vKiAgMHhjMiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGMzICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4YzQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhjNSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGM2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4YzcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhjOCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIFRPRE86IGJzd2FwICovCi0vKiAgMHhjOSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIFRPRE86IGJzd2FwICovCi0vKiAgMHhjYSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIFRPRE86IGJzd2FwICovCi0vKiAgMHhjYiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIFRPRE86IGJzd2FwICovCi0vKiAgMHhjYyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIFRPRE86IGJzd2FwICovCi0vKiAgMHhjZCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIFRPRE86IGJzd2FwICovCi0vKiAgMHhjZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIFRPRE86IGJzd2FwICovCi0vKiAgMHhjZiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIFRPRE86IGJzd2FwICovCi0KLS8qICAweGQwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZDEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhkMiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGQzICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZDQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhkNSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGQ2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZDcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhkOCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGQ5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZGEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhkYiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGRjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZGQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhkZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGRmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotCi0vKiAgMHhlMCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGUxICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZTIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhlMyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGU0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZTUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhlNiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGU3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZTggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhlOSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGVhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZWIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhlYyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGVkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZWUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhlZiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLQotLyogIDB4ZjAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhmMSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGYyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZjMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhmNCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGY1ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZjYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhmNyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGY4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZjkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhmYSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGZiICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZmMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi0vKiAgMHhmZCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKLS8qICAweGZlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAotLyogIDB4ZmYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCi19OwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3ByaW1fb3BzLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvcHJpbV9vcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJiMWJmMi4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvcHJpbV9vcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDI5MTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSoJCQkJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotKgotKiAgICAgICAgICAgIAlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qIAkJCQkgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKLSogCQkJCQkgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOgkJQU5TSSBDCi0qIEVudmlyb25tZW50OglBbnkKLSogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKLSoKLSogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvZGUgdG8gaW1wbGVtZW50IHRoZSBwcmltaXRpdmUKLSoJCQkJbWFjaGluZSBvcGVyYXRpb25zIHVzZWQgYnkgdGhlIGVtdWxhdGlvbiBjb2RlIGluIG9wcy5jCi0qCi0qIENhcnJ5IENoYWluIENhbGN1bGF0aW9uCi0qCi0qIFRoaXMgcmVwcmVzZW50cyBhIHNvbWV3aGF0IGV4cGVuc2l2ZSBjYWxjdWxhdGlvbiB3aGljaCBpcwotKiBhcHBhcmVudGx5IHJlcXVpcmVkIHRvIGVtdWxhdGUgdGhlIHNldHRpbmcgb2YgdGhlIE9GIGFuZCBBRiBmbGFnLgotKiBUaGUgbGF0dGVyIGlzIG5vdCBzbyBpbXBvcnRhbnQsIGJ1dCB0aGUgZm9ybWVyIGlzLiAgVGhlIG92ZXJmbG93Ci0qIGZsYWcgaXMgdGhlIFhPUiBvZiB0aGUgdG9wIHR3byBiaXRzIG9mIHRoZSBjYXJyeSBjaGFpbiBmb3IgYW4KLSogYWRkaXRpb24gKHNpbWlsYXIgZm9yIHN1YnRyYWN0aW9uKS4gIFNpbmNlIHdlIGRvIG5vdCB3YW50IHRvCi0qIHNpbXVsYXRlIHRoZSBhZGRpdGlvbiBpbiBhIGJpdHdpc2UgbWFubmVyLCB3ZSB0cnkgdG8gY2FsY3VsYXRlIHRoZQotKiBjYXJyeSBjaGFpbiBnaXZlbiB0aGUgdHdvIG9wZXJhbmRzIGFuZCB0aGUgcmVzdWx0LgotKgotKiBTbywgZ2l2ZW4gdGhlIGZvbGxvd2luZyB0YWJsZSwgd2hpY2ggcmVwcmVzZW50cyB0aGUgYWRkaXRpb24gb2YgdHdvCi0qIGJpdHMsIHdlIGNhbiBkZXJpdmUgYSBmb3JtdWxhIGZvciB0aGUgY2FycnkgY2hhaW4uCi0qCi0qIGEgICBiICAgY2luICAgciAgICAgY291dAotKiAwICAgMCAgIDAgICAgIDAgICAgIDAKLSogMCAgIDAgICAxICAgICAxICAgICAwCi0qIDAgICAxICAgMCAgICAgMSAgICAgMAotKiAwICAgMSAgIDEgICAgIDAgICAgIDEKLSogMSAgIDAgICAwICAgICAxICAgICAwCi0qIDEgICAwICAgMSAgICAgMCAgICAgMQotKiAxICAgMSAgIDAgICAgIDAgICAgIDEKLSogMSAgIDEgICAxICAgICAxICAgICAxCi0qCi0qIENvbnN0cnVjdGlvbiBvZiB0YWJsZSBmb3IgY291dDoKLSoKLSogYWIKLSogciAgXCAgMDAgICAwMSAgIDExICAxMAotKiB8LS0tLS0tLS0tLS0tLS0tLS0tCi0qIDAgIHwgICAwICAgIDEgICAgMSAgIDEKLSogMSAgfCAgIDAgICAgMCAgICAxICAgMAotKgotKiBCeSBpbnNwZWN0aW9uLCBvbmUgZ2V0czogIGNjID0gYWIgKyAgcicoYSArIGIpCi0qCi0qIFRoYXQgcmVwcmVzZW50cyBhbG90IG9mIG9wZXJhdGlvbnMsIGJ1dCBOTyBDSE9JQ0UuLi4uCi0qCi0qIEJvcnJvdyBDaGFpbiBDYWxjdWxhdGlvbi4KLSoKLSogVGhlIGZvbGxvd2luZyB0YWJsZSByZXByZXNlbnRzIHRoZSBzdWJ0cmFjdGlvbiBvZiB0d28gYml0cywgZnJvbQotKiB3aGljaCB3ZSBjYW4gZGVyaXZlIGEgZm9ybXVsYSBmb3IgdGhlIGJvcnJvdyBjaGFpbi4KLSoKLSogYSAgIGIgICBiaW4gICByICAgICBib3V0Ci0qIDAgICAwICAgMCAgICAgMCAgICAgMAotKiAwICAgMCAgIDEgICAgIDEgICAgIDEKLSogMCAgIDEgICAwICAgICAxICAgICAxCi0qIDAgICAxICAgMSAgICAgMCAgICAgMQotKiAxICAgMCAgIDAgICAgIDEgICAgIDAKLSogMSAgIDAgICAxICAgICAwICAgICAwCi0qIDEgICAxICAgMCAgICAgMCAgICAgMAotKiAxICAgMSAgIDEgICAgIDEgICAgIDEKLSoKLSogQ29uc3RydWN0aW9uIG9mIHRhYmxlIGZvciBjb3V0OgotKgotKiBhYgotKiByICBcICAwMCAgIDAxICAgMTEgIDEwCi0qIHwtLS0tLS0tLS0tLS0tLS0tLS0KLSogMCAgfCAgIDAgICAgMSAgICAwICAgMAotKiAxICB8ICAgMSAgICAxICAgIDEgICAwCi0qCi0qIEJ5IGluc3BlY3Rpb24sIG9uZSBnZXRzOiAgYmMgPSBhJ2IgKyAgcihhJyArIGIpCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lCVBSSU1fT1BTX05PX1JFREVGSU5FX0FTTQotI2luY2x1ZGUgIng4NmVtdS94ODZlbXVpLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYJX19IQVZFX0lOTElORV9BU1NFTUJMRVJfXwotCi1zdGF0aWMgdTMyIHg4NmVtdV9wYXJpdHlfdGFiWzhdID0KLXsKLQkweDk2Njk2OTk2LAotCTB4Njk5Njk2NjksCi0JMHg2OTk2OTY2OSwKLQkweDk2Njk2OTk2LAotCTB4Njk5Njk2NjksCi0JMHg5NjY5Njk5NiwKLQkweDk2Njk2OTk2LAotCTB4Njk5Njk2NjksCi19OwotCi0jZW5kaWYKLQotI2RlZmluZSBQQVJJVFkoeCkgICAoKCh4ODZlbXVfcGFyaXR5X3RhYlsoeCkgLyAzMl0gPj4gKCh4KSAlIDMyKSkgJiAxKSA9PSAwKQotI2RlZmluZSBYT1IyKHgpIAkoKCh4KSBeICgoeCk+PjEpKSAmIDB4MSkKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZglfX0hBVkVfSU5MSU5FX0FTU0VNQkxFUl9fCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgQUFBIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IGFhYV93b3JkKHUxNiBkKQotewotCXUxNglyZXM7Ci0JaWYgKChkICYgMHhmKSA+IDB4OSB8fCBBQ0NFU1NfRkxBRyhGX0FGKSkgewotCQlkICs9IDB4NjsKLQkJZCArPSAweDEwMDsKLQkJU0VUX0ZMQUcoRl9BRik7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCX0gZWxzZSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9BRik7Ci0JfQotCXJlcyA9ICh1MTYpKGQgJiAweEZGMEYpOwotCUNMRUFSX0ZMQUcoRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBBQUEgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgYWFzX3dvcmQodTE2IGQpCi17Ci0JdTE2CXJlczsKLQlpZiAoKGQgJiAweGYpID4gMHg5IHx8IEFDQ0VTU19GTEFHKEZfQUYpKSB7Ci0JCWQgLT0gMHg2OwotCQlkIC09IDB4MTAwOwotCQlTRVRfRkxBRyhGX0FGKTsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JfSBlbHNlIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX0FGKTsKLQl9Ci0JcmVzID0gKHUxNikoZCAmIDB4RkYwRik7Ci0JQ0xFQVJfRkxBRyhGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQlyZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIEFBRCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiBhYWRfd29yZCh1MTYgZCkKLXsKLQl1MTYgbDsKLQl1OCBoYiwgbGI7Ci0KLQloYiA9ICh1OCkoKGQgPj4gOCkgJiAweGZmKTsKLQlsYiA9ICh1OCkoKGQgJiAweGZmKSk7Ci0JbCA9ICh1MTYpKChsYiArIDEwICogaGIpICYgMHhGRik7Ci0KLQlDTEVBUl9GTEFHKEZfQ0YpOwotCUNMRUFSX0ZMQUcoRl9BRik7Ci0JQ0xFQVJfRkxBRyhGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhsICYgMHg4MCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcobCA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkobCAmIDB4ZmYpLCBGX1BGKTsKLQlyZXR1cm4gbDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBBQU0gaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgYWFtX3dvcmQodTggZCkKLXsKLSAgICB1MTYgaCwgbDsKLQotCWggPSAodTE2KShkIC8gMTApOwotCWwgPSAodTE2KShkICUgMTApOwotCWwgfD0gKHUxNikoaCA8PCA4KTsKLQotCUNMRUFSX0ZMQUcoRl9DRik7Ci0JQ0xFQVJfRkxBRyhGX0FGKTsKLQlDTEVBUl9GTEFHKEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGwgJiAweDgwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhsID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShsICYgMHhmZiksIEZfUEYpOwotICAgIHJldHVybiBsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIEFEQyBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IGFkY19ieXRlKHU4IGQsIHU4IHMpCi17Ci0JcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLQlyZWdpc3RlciB1MzIgY2M7Ci0KLQlpZiAoQUNDRVNTX0ZMQUcoRl9DRikpCi0JCXJlcyA9IDEgKyBkICsgczsKLQllbHNlCi0JCXJlcyA9IGQgKyBzOwotCi0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHgxMDAsIEZfQ0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmKSA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCi0JLyogY2FsY3VsYXRlIHRoZSBjYXJyeSBjaGFpbiAgU0VFIE5PVEUgQVQgVE9QLiAqLwotCWNjID0gKHMgJiBkKSB8ICgofnJlcykgJiAocyB8IGQpKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGNjID4+IDYpLCBGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhjYyAmIDB4OCwgRl9BRik7Ci0JcmV0dXJuICh1OClyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgQURDIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IGFkY193b3JkKHUxNiBkLCB1MTYgcykKLXsKLQlyZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotCXJlZ2lzdGVyIHUzMiBjYzsKLQotCWlmIChBQ0NFU1NfRkxBRyhGX0NGKSkKLQkJcmVzID0gMSArIGQgKyBzOwotCWVsc2UKLQkJcmVzID0gZCArIHM7Ci0KLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDEwMDAwLCBGX0NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmKSA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0KLQkvKiBjYWxjdWxhdGUgdGhlIGNhcnJ5IGNoYWluICBTRUUgTk9URSBBVCBUT1AuICovCi0JY2MgPSAocyAmIGQpIHwgKCh+cmVzKSAmIChzIHwgZCkpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoY2MgPj4gMTQpLCBGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhjYyAmIDB4OCwgRl9BRik7Ci0JcmV0dXJuICh1MTYpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIEFEQyBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiBhZGNfbG9uZyh1MzIgZCwgdTMyIHMpCi17Ci0JcmVnaXN0ZXIgdTMyIGxvOwkvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLQlyZWdpc3RlciB1MzIgaGk7Ci0JcmVnaXN0ZXIgdTMyIHJlczsKLQlyZWdpc3RlciB1MzIgY2M7Ci0KLQlpZiAoQUNDRVNTX0ZMQUcoRl9DRikpIHsKLQkJbG8gPSAxICsgKGQgJiAweEZGRkYpICsgKHMgJiAweEZGRkYpOwotCQlyZXMgPSAxICsgZCArIHM7Ci0JCX0KLQllbHNlIHsKLQkJbG8gPSAoZCAmIDB4RkZGRikgKyAocyAmIDB4RkZGRik7Ci0JCXJlcyA9IGQgKyBzOwotCQl9Ci0JaGkgPSAobG8gPj4gMTYpICsgKGQgPj4gMTYpICsgKHMgPj4gMTYpOwotCi0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoaGkgJiAweDEwMDAwLCBGX0NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmZmZmZikgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwMDAwMCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQotCS8qIGNhbGN1bGF0ZSB0aGUgY2FycnkgY2hhaW4gIFNFRSBOT1RFIEFUIFRPUC4gKi8KLQljYyA9IChzICYgZCkgfCAoKH5yZXMpICYgKHMgfCBkKSk7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihjYyA+PiAzMCksIEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNjICYgMHg4LCBGX0FGKTsKLQlyZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIEFERCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IGFkZF9ieXRlKHU4IGQsIHU4IHMpCi17Ci0JcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLQlyZWdpc3RlciB1MzIgY2M7Ci0KLQlyZXMgPSBkICsgczsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDEwMCwgRl9DRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmYpID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0KLQkvKiBjYWxjdWxhdGUgdGhlIGNhcnJ5IGNoYWluICBTRUUgTk9URSBBVCBUT1AuICovCi0JY2MgPSAocyAmIGQpIHwgKCh+cmVzKSAmIChzIHwgZCkpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoY2MgPj4gNiksIEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNjICYgMHg4LCBGX0FGKTsKLQlyZXR1cm4gKHU4KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBBREQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgYWRkX3dvcmQodTE2IGQsIHUxNiBzKQotewotCXJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0JcmVnaXN0ZXIgdTMyIGNjOwotCi0JcmVzID0gZCArIHM7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHgxMDAwMCwgRl9DRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZikgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCi0JLyogY2FsY3VsYXRlIHRoZSBjYXJyeSBjaGFpbiAgU0VFIE5PVEUgQVQgVE9QLiAqLwotCWNjID0gKHMgJiBkKSB8ICgofnJlcykgJiAocyB8IGQpKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGNjID4+IDE0KSwgRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2MgJiAweDgsIEZfQUYpOwotCXJldHVybiAodTE2KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBBREQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgYWRkX2xvbmcodTMyIGQsIHUzMiBzKQotewotCXJlZ2lzdGVyIHUzMiBsbzsJLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0JcmVnaXN0ZXIgdTMyIGhpOwotCXJlZ2lzdGVyIHUzMiByZXM7Ci0JcmVnaXN0ZXIgdTMyIGNjOwotCi0JbG8gPSAoZCAmIDB4RkZGRikgKyAocyAmIDB4RkZGRik7Ci0JcmVzID0gZCArIHM7Ci0JaGkgPSAobG8gPj4gMTYpICsgKGQgPj4gMTYpICsgKHMgPj4gMTYpOwotCi0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoaGkgJiAweDEwMDAwLCBGX0NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmZmZmZikgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwMDAwMCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQotICAgIC8qIGNhbGN1bGF0ZSB0aGUgY2FycnkgY2hhaW4gIFNFRSBOT1RFIEFUIFRPUC4gKi8KLSAgICBjYyA9IChzICYgZCkgfCAoKH5yZXMpICYgKHMgfCBkKSk7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihjYyA+PiAzMCksIEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNjICYgMHg4LCBGX0FGKTsKLQotICAgIHJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgQU5EIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggYW5kX2J5dGUodTggZCwgdTggcykKLXsKLQlyZWdpc3RlciB1OCByZXM7ICAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotCi0JcmVzID0gZCAmIHM7Ci0KLQkvKiBzZXQgdGhlIGZsYWdzICAqLwotCUNMRUFSX0ZMQUcoRl9PRik7Ci0JQ0xFQVJfRkxBRyhGX0NGKTsKLQlDTEVBUl9GTEFHKEZfQUYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzKSwgRl9QRik7Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBBTkQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgYW5kX3dvcmQodTE2IGQsIHUxNiBzKQotewotICAgIHJlZ2lzdGVyIHUxNiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0KLSAgICByZXMgPSBkICYgczsKLQotICAgIC8qIHNldCB0aGUgZmxhZ3MgICovCi0JQ0xFQVJfRkxBRyhGX09GKTsKLQlDTEVBUl9GTEFHKEZfQ0YpOwotCUNMRUFSX0ZMQUcoRl9BRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLSAgICByZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIEFORCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiBhbmRfbG9uZyh1MzIgZCwgdTMyIHMpCi17Ci0JcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLQotCXJlcyA9IGQgJiBzOwotCi0JLyogc2V0IHRoZSBmbGFncyAgKi8KLQlDTEVBUl9GTEFHKEZfT0YpOwotCUNMRUFSX0ZMQUcoRl9DRik7Ci0JQ0xFQVJfRkxBRyhGX0FGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQlyZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIENNUCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IGNtcF9ieXRlKHU4IGQsIHU4IHMpCi17Ci0JcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLQlyZWdpc3RlciB1MzIgYmM7Ci0KLQlyZXMgPSBkIC0gczsKLQlDTEVBUl9GTEFHKEZfQ0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmKSA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCi0JLyogY2FsY3VsYXRlIHRoZSBib3Jyb3cgY2hhaW4uICBTZWUgbm90ZSBhdCB0b3AgKi8KLQliYyA9IChyZXMgJiAofmQgfCBzKSkgfCAofmQgJiBzKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4ODAsIEZfQ0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoYmMgPj4gNiksIEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4LCBGX0FGKTsKLQlyZXR1cm4gZDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBDTVAgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgY21wX3dvcmQodTE2IGQsIHUxNiBzKQotewotCXJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0JcmVnaXN0ZXIgdTMyIGJjOwotCi0JcmVzID0gZCAtIHM7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmKSA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCi0JLyogY2FsY3VsYXRlIHRoZSBib3Jyb3cgY2hhaW4uICBTZWUgbm90ZSBhdCB0b3AgKi8KLSAgICBiYyA9IChyZXMgJiAofmQgfCBzKSkgfCAofmQgJiBzKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4ODAwMCwgRl9DRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiAxNCksIEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4LCBGX0FGKTsKLQlyZXR1cm4gZDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBDTVAgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgY21wX2xvbmcodTMyIGQsIHUzMiBzKQotewotCXJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0JcmVnaXN0ZXIgdTMyIGJjOwotCi0JcmVzID0gZCAtIHM7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwMDAwMCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZmZmZmYpID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0KLQkvKiBjYWxjdWxhdGUgdGhlIGJvcnJvdyBjaGFpbi4gIFNlZSBub3RlIGF0IHRvcCAqLwotCWJjID0gKHJlcyAmICh+ZCB8IHMpKSB8ICh+ZCAmIHMpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4MDAwMDAwMCwgRl9DRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiAzMCksIEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4LCBGX0FGKTsKLQlyZXR1cm4gZDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBEQUEgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBkYWFfYnl0ZSh1OCBkKQotewotCXUzMiByZXMgPSBkOwotCWlmICgoZCAmIDB4ZikgPiA5IHx8IEFDQ0VTU19GTEFHKEZfQUYpKSB7Ci0JCXJlcyArPSA2OwotCQlTRVRfRkxBRyhGX0FGKTsKLQl9Ci0JaWYgKHJlcyA+IDB4OUYgfHwgQUNDRVNTX0ZMQUcoRl9DRikpIHsKLQkJcmVzICs9IDB4NjA7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCX0KLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhGRikgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQlyZXR1cm4gKHU4KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBEQVMgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBkYXNfYnl0ZSh1OCBkKQotewotCWlmICgoZCAmIDB4ZikgPiA5IHx8IEFDQ0VTU19GTEFHKEZfQUYpKSB7Ci0JCWQgLT0gNjsKLQkJU0VUX0ZMQUcoRl9BRik7Ci0JfQotCWlmIChkID4gMHg5RiB8fCBBQ0NFU1NfRkxBRyhGX0NGKSkgewotCQlkIC09IDB4NjA7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCX0KLQlDT05ESVRJT05BTF9TRVRfRkxBRyhkICYgMHg4MCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoZCA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkoZCAmIDB4ZmYpLCBGX1BGKTsKLQlyZXR1cm4gZDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBERUMgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBkZWNfYnl0ZSh1OCBkKQotewotICAgIHJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0gICAgcmVnaXN0ZXIgdTMyIGJjOwotCi0gICAgcmVzID0gZCAtIDE7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmYpID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0KLQkvKiBjYWxjdWxhdGUgdGhlIGJvcnJvdyBjaGFpbi4gIFNlZSBub3RlIGF0IHRvcCAqLwotCS8qIGJhc2VkIG9uIHN1Yl9ieXRlLCB1c2VzIHM9PTEuICAqLwotCWJjID0gKHJlcyAmICh+ZCB8IDEpKSB8ICh+ZCAmIDEpOwotCS8qIGNhcnJ5IGZsYWcgdW5jaGFuZ2VkICovCi0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiA2KSwgRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOwotCXJldHVybiAodTgpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIERFQyBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiBkZWNfd29yZCh1MTYgZCkKLXsKLSAgICByZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotICAgIHJlZ2lzdGVyIHUzMiBiYzsKLQotICAgIHJlcyA9IGQgLSAxOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZikgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQotICAgIC8qIGNhbGN1bGF0ZSB0aGUgYm9ycm93IGNoYWluLiAgU2VlIG5vdGUgYXQgdG9wICovCi0gICAgLyogYmFzZWQgb24gdGhlIHN1Yl9ieXRlIHJvdXRpbmUsIHdpdGggcz09MSAqLwotICAgIGJjID0gKHJlcyAmICh+ZCB8IDEpKSB8ICh+ZCAmIDEpOwotICAgIC8qIGNhcnJ5IGZsYWcgdW5jaGFuZ2VkICovCi0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiAxNCksIEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4LCBGX0FGKTsKLQlyZXR1cm4gKHUxNilyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgREVDIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIGRlY19sb25nKHUzMiBkKQotewotICAgIHJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0gICAgcmVnaXN0ZXIgdTMyIGJjOwotCi0gICAgcmVzID0gZCAtIDE7Ci0KLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmZmZmZikgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQotICAgIC8qIGNhbGN1bGF0ZSB0aGUgYm9ycm93IGNoYWluLiAgU2VlIG5vdGUgYXQgdG9wICovCi0JYmMgPSAocmVzICYgKH5kIHwgMSkpIHwgKH5kICYgMSk7Ci0JLyogY2FycnkgZmxhZyB1bmNoYW5nZWQgKi8KLQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGJjID4+IDMwKSwgRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOwotCXJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgSU5DIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggaW5jX2J5dGUodTggZCkKLXsKLQlyZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotCXJlZ2lzdGVyIHUzMiBjYzsKLQotCXJlcyA9IGQgKyAxOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmKSA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCi0JLyogY2FsY3VsYXRlIHRoZSBjYXJyeSBjaGFpbiAgU0VFIE5PVEUgQVQgVE9QLiAqLwotCWNjID0gKCgxICYgZCkgfCAofnJlcykpICYgKDEgfCBkKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGNjID4+IDYpLCBGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhjYyAmIDB4OCwgRl9BRik7Ci0JcmV0dXJuICh1OClyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgSU5DIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IGluY193b3JkKHUxNiBkKQotewotCXJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0JcmVnaXN0ZXIgdTMyIGNjOwotCi0JcmVzID0gZCArIDE7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZikgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCi0JLyogY2FsY3VsYXRlIHRoZSBjYXJyeSBjaGFpbiAgU0VFIE5PVEUgQVQgVE9QLiAqLwotCWNjID0gKDEgJiBkKSB8ICgofnJlcykgJiAoMSB8IGQpKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGNjID4+IDE0KSwgRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2MgJiAweDgsIEZfQUYpOwotCXJldHVybiAodTE2KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBJTkMgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgaW5jX2xvbmcodTMyIGQpCi17Ci0JcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLQlyZWdpc3RlciB1MzIgY2M7Ci0KLQlyZXMgPSBkICsgMTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmZmZmZikgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwMDAwMCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQotCS8qIGNhbGN1bGF0ZSB0aGUgY2FycnkgY2hhaW4gIFNFRSBOT1RFIEFUIFRPUC4gKi8KLQljYyA9ICgxICYgZCkgfCAoKH5yZXMpICYgKDEgfCBkKSk7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihjYyA+PiAzMCksIEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNjICYgMHg4LCBGX0FGKTsKLQlyZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIE9SIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggb3JfYnl0ZSh1OCBkLCB1OCBzKQotewotCXJlZ2lzdGVyIHU4IHJlczsgICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0KLQlyZXMgPSBkIHwgczsKLQlDTEVBUl9GTEFHKEZfT0YpOwotCUNMRUFSX0ZMQUcoRl9DRik7Ci0JQ0xFQVJfRkxBRyhGX0FGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyksIEZfUEYpOwotCXJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgT1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgb3Jfd29yZCh1MTYgZCwgdTE2IHMpCi17Ci0JcmVnaXN0ZXIgdTE2IHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLQotCXJlcyA9IGQgfCBzOwotCS8qIHNldCB0aGUgY2FycnkgZmxhZyB0byBiZSBiaXQgOCAqLwotCUNMRUFSX0ZMQUcoRl9PRik7Ci0JQ0xFQVJfRkxBRyhGX0NGKTsKLQlDTEVBUl9GTEFHKEZfQUYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiBvcl9sb25nKHUzMiBkLCB1MzIgcykKLXsKLQlyZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotCi0JcmVzID0gZCB8IHM7Ci0KLQkvKiBzZXQgdGhlIGNhcnJ5IGZsYWcgdG8gYmUgYml0IDggKi8KLQlDTEVBUl9GTEFHKEZfT0YpOwotCUNMRUFSX0ZMQUcoRl9DRik7Ci0JQ0xFQVJfRkxBRyhGX0FGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQlyZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIE9SIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggbmVnX2J5dGUodTggcykKLXsKLSAgICByZWdpc3RlciB1OCByZXM7Ci0gICAgcmVnaXN0ZXIgdTggYmM7Ci0KLQlDT05ESVRJT05BTF9TRVRfRkxBRyhzICE9IDAsIEZfQ0YpOwotCXJlcyA9ICh1OCktczsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZikgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyksIEZfUEYpOwotCS8qIGNhbGN1bGF0ZSB0aGUgYm9ycm93IGNoYWluIC0tLSBtb2RpZmllZCBzdWNoIHRoYXQgZD0wLgotCSAgIHN1YnN0aXR1dGlpbmcgZD0wIGludG8gICAgIGJjPSByZXMmKH5kfHMpfCh+ZCZzKTsKLQkgICAodGhlIG9uZSB1c2VkIGZvciBzdWIpIGFuZCBzaW1wbGlmeWluZywgc2luY2UgfmQ9MHhmZi4uLiwKLQkgICB+ZHxzID09IDB4ZmZmZi4uLiwgYW5kIHJlcyYweGZmZi4uLiA9PSByZXMuICBTaW1pbGFybHkKLQkgICB+ZCZzID09IHMuICBTbyB0aGUgc2ltcGxpZmllZCByZXN1bHQgaXM6ICovCi0JYmMgPSByZXMgfCBzOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoYmMgPj4gNiksIEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4LCBGX0FGKTsKLQlyZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIE9SIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IG5lZ193b3JkKHUxNiBzKQotewotCXJlZ2lzdGVyIHUxNiByZXM7Ci0JcmVnaXN0ZXIgdTE2IGJjOwotCi0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocyAhPSAwLCBGX0NGKTsKLQlyZXMgPSAodTE2KS1zOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmYpID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQotCS8qIGNhbGN1bGF0ZSB0aGUgYm9ycm93IGNoYWluIC0tLSBtb2RpZmllZCBzdWNoIHRoYXQgZD0wLgotCSAgIHN1YnN0aXR1dGlpbmcgZD0wIGludG8gICAgIGJjPSByZXMmKH5kfHMpfCh+ZCZzKTsKLQkgICAodGhlIG9uZSB1c2VkIGZvciBzdWIpIGFuZCBzaW1wbGlmeWluZywgc2luY2UgfmQ9MHhmZi4uLiwKLQkgICB+ZHxzID09IDB4ZmZmZi4uLiwgYW5kIHJlcyYweGZmZi4uLiA9PSByZXMuICBTaW1pbGFybHkKLQkgICB+ZCZzID09IHMuICBTbyB0aGUgc2ltcGxpZmllZCByZXN1bHQgaXM6ICovCi0JYmMgPSByZXMgfCBzOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoYmMgPj4gMTQpLCBGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4OCwgRl9BRik7Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiBuZWdfbG9uZyh1MzIgcykKLXsKLQlyZWdpc3RlciB1MzIgcmVzOwotCXJlZ2lzdGVyIHUzMiBiYzsKLQotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHMgIT0gMCwgRl9DRik7Ci0JcmVzID0gKHUzMiktczsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmZmZmZikgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwMDAwMCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQotCS8qIGNhbGN1bGF0ZSB0aGUgYm9ycm93IGNoYWluIC0tLSBtb2RpZmllZCBzdWNoIHRoYXQgZD0wLgotCSAgIHN1YnN0aXR1dGlpbmcgZD0wIGludG8gICAgIGJjPSByZXMmKH5kfHMpfCh+ZCZzKTsKLQkgICAodGhlIG9uZSB1c2VkIGZvciBzdWIpIGFuZCBzaW1wbGlmeWluZywgc2luY2UgfmQ9MHhmZi4uLiwKLQkgICB+ZHxzID09IDB4ZmZmZi4uLiwgYW5kIHJlcyYweGZmZi4uLiA9PSByZXMuICBTaW1pbGFybHkKLQkgICB+ZCZzID09IHMuICBTbyB0aGUgc2ltcGxpZmllZCByZXN1bHQgaXM6ICovCi0JYmMgPSByZXMgfCBzOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoYmMgPj4gMzApLCBGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4OCwgRl9BRik7Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBOT1QgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBub3RfYnl0ZSh1OCBzKQotewotCXJldHVybiB+czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBOT1QgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgbm90X3dvcmQodTE2IHMpCi17Ci0JcmV0dXJuIH5zOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIE5PVCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiBub3RfbG9uZyh1MzIgcykKLXsKLQlyZXR1cm4gfnM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgUkNMIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggcmNsX2J5dGUodTggZCwgdTggcykKLXsKLSAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgcmVzLCBjbnQsIG1hc2ssIGNmOwotCi0gICAgLyogcyBpcyB0aGUgcm90YXRlIGRpc3RhbmNlLiAgSXQgdmFyaWVzIGZyb20gMCAtIDguICovCi0JLyogaGF2ZQotCi0gICAgICAgQ0YgIEJfNyBCXzYgQl81IEJfNCBCXzMgQl8yIEJfMSBCXzAKLQotICAgICAgIHdhbnQgdG8gcm90YXRlIHRocm91Z2ggdGhlIGNhcnJ5IGJ5ICJzIiBiaXRzLiAgV2UgY291bGQKLSAgICAgICBsb29wLCBidXQgdGhhdCdzIGluZWZmaWNpZW50LiAgU28gdGhlIHdpZHRoIGlzIDksCi0gICAgICAgYW5kIHdlIHNwbGl0IGludG8gdGhyZWUgcGFydHM6Ci0KLSAgICAgICBUaGUgbmV3IGNhcnJ5IGZsYWcgICAod2FzIEJfbikKLSAgICAgICB0aGUgc3R1ZmYgaW4gQl9uLTEgLi4gQl8wCi0gICAgICAgdGhlIHN0dWZmIGluIEJfNyAuLiBCX24rMQotCi0gICAgICAgVGhlIG5ldyByb3RhdGUgaXMgZG9uZSBtb2QgOSwgYW5kIGdpdmVuIHRoaXMsCi0gICAgICAgZm9yIGEgcm90YXRpb24gb2YgbiBiaXRzIChtb2QgOSkgdGhlIG5ldyBjYXJyeSBmbGFnIGlzCi0gICAgICAgdGhlbiBsb2NhdGVkIG4gYml0cyBmcm9tIHRoZSBNU0IuICBUaGUgbG93IHBhcnQgaXMKLSAgICAgICB0aGVuIHNoaWZ0ZWQgdXAgY250IGJpdHMsIGFuZCB0aGUgaGlnaCBwYXJ0IGlzIG9yJ2QKLSAgICAgICBpbi4gIFVzaW5nIENBUFMgZm9yIG5ldyB2YWx1ZXMsIGFuZCBsb3dlcmNhc2UgZm9yIHRoZQotICAgICAgIG9yaWdpbmFsIHZhbHVlcywgdGhpcyBjYW4gYmUgZXhwcmVzc2VkIGFzOgotCi0gICAgICAgSUYgbiA+IDAKLSAgICAgICAxKSBDRiA8LSAgYl8oOC1uKQotICAgICAgIDIpIEJfKDcpIC4uIEJfKG4pICA8LSAgYl8oOC0obisxKSkgLi4gYl8wCi0gICAgICAgMykgQl8obi0xKSA8LSBjZgotICAgICAgIDQpIEJfKG4tMikgLi4gQl8wIDwtICBiXzcgLi4gYl8oOC0obi0xKSkKLQkgKi8KLQlyZXMgPSBkOwotCWlmICgoY250ID0gcyAlIDkpICE9IDApIHsKLQkvKiBleHRyYWN0IHRoZSBuZXcgQ0FSUlkgRkxBRy4gKi8KLQkvKiBDRiA8LSAgYl8oOC1uKSAgICAgICAgICAgICAqLwotCWNmID0gKGQgPj4gKDggLSBjbnQpKSAmIDB4MTsKLQotCS8qIGdldCB0aGUgbG93IHN0dWZmIHdoaWNoIHJvdGF0ZWQKLQkgICBpbnRvIHRoZSByYW5nZSBCXzcgLi4gQl9jbnQgKi8KLQkvKiBCXyg3KSAuLiBCXyhuKSAgPC0gIGJfKDgtKG4rMSkpIC4uIGJfMCAgKi8KLQkvKiBub3RlIHRoYXQgdGhlIHJpZ2h0IGhhbmQgc2lkZSBkb25lIGJ5IHRoZSBtYXNrICovCi0JCXJlcyA9IChkIDw8IGNudCkgJiAweGZmOwotCi0JLyogbm93IHRoZSBoaWdoIHN0dWZmIHdoaWNoIHJvdGF0ZWQgYXJvdW5kCi0JICAgaW50byB0aGUgcG9zaXRpb25zIEJfY250LTIgLi4gQl8wICovCi0JLyogQl8obi0yKSAuLiBCXzAgPC0gIGJfNyAuLiBiXyg4LShuLTEpKSAqLwotCS8qIHNoaWZ0IGl0IGRvd253YXJkLCA3LShuLTIpID0gOS1uIHBvc2l0aW9ucy4KLQkgICBhbmQgbWFzayBvZmYgdGhlIHJlc3VsdCBiZWZvcmUgb3InaW5nIGluLgotCSAqLwotCW1hc2sgPSAoMSA8PCAoY250IC0gMSkpIC0gMTsKLQlyZXMgfD0gKGQgPj4gKDkgLSBjbnQpKSAmIG1hc2s7Ci0KLQkvKiBpZiB0aGUgY2FycnkgZmxhZyB3YXMgc2V0LCBvciBpdCBpbi4gICovCi0JCWlmIChBQ0NFU1NfRkxBRyhGX0NGKSkgeyAgICAgLyogY2FycnkgZmxhZyBpcyBzZXQgKi8KLQkgICAgLyogIEJfKG4tMSkgPC0gY2YgKi8KLQkgICAgcmVzIHw9IDEgPDwgKGNudCAtIDEpOwotCX0KLQkvKiBzZXQgdGhlIG5ldyBjYXJyeSBmbGFnLCBiYXNlZCBvbiB0aGUgdmFyaWFibGUgImNmIiAqLwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7Ci0JLyogT1ZFUkZMT1cgaXMgc2V0ICpJRkYqIGNudD09MSwgdGhlbiBpdCBpcyB0aGUKLQkgICB4b3Igb2YgQ0YgYW5kIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdC4gIEJsZWNjay4gKi8KLQkvKiBwYXJlbnRoZXNpemVkIHRoaXMgZXhwcmVzc2lvbiBzaW5jZSBpdCBhcHBlYXJzIHRvCi0JICAgYmUgY2F1c2luZyBPRiB0byBiZSBtaXNzZXQgKi8KLQlDT05ESVRJT05BTF9TRVRfRkxBRyhjbnQgPT0gMSAmJiBYT1IyKGNmICsgKChyZXMgPj4gNikgJiAweDIpKSwKLQkJCQkJCQkgRl9PRik7Ci0KLSAgICB9Ci0JcmV0dXJuICh1OClyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgUkNMIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IHJjbF93b3JkKHUxNiBkLCB1OCBzKQotewotCXJlZ2lzdGVyIHVuc2lnbmVkIGludCByZXMsIGNudCwgbWFzaywgY2Y7Ci0KLQlyZXMgPSBkOwotCWlmICgoY250ID0gcyAlIDE3KSAhPSAwKSB7Ci0JCWNmID0gKGQgPj4gKDE2IC0gY250KSkgJiAweDE7Ci0JCXJlcyA9IChkIDw8IGNudCkgJiAweGZmZmY7Ci0JCW1hc2sgPSAoMSA8PCAoY250IC0gMSkpIC0gMTsKLQkJcmVzIHw9IChkID4+ICgxNyAtIGNudCkpICYgbWFzazsKLQkJaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKSB7Ci0JCQlyZXMgfD0gMSA8PCAoY250IC0gMSk7Ci0JCX0KLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhjbnQgPT0gMSAmJiBYT1IyKGNmICsgKChyZXMgPj4gMTQpICYgMHgyKSksCi0JCQkJCQkJIEZfT0YpOwotCX0KLQlyZXR1cm4gKHUxNilyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgUkNMIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIHJjbF9sb25nKHUzMiBkLCB1OCBzKQotewotCXJlZ2lzdGVyIHUzMiByZXMsIGNudCwgbWFzaywgY2Y7Ci0KLQlyZXMgPSBkOwotCWlmICgoY250ID0gcyAlIDMzKSAhPSAwKSB7Ci0JCWNmID0gKGQgPj4gKDMyIC0gY250KSkgJiAweDE7Ci0JCXJlcyA9IChkIDw8IGNudCkgJiAweGZmZmZmZmZmOwotCQltYXNrID0gKDEgPDwgKGNudCAtIDEpKSAtIDE7Ci0JCXJlcyB8PSAoZCA+PiAoMzMgLSBjbnQpKSAmIG1hc2s7Ci0JCWlmIChBQ0NFU1NfRkxBRyhGX0NGKSkgeyAgICAgLyogY2FycnkgZmxhZyBpcyBzZXQgKi8KLQkJCXJlcyB8PSAxIDw8IChjbnQgLSAxKTsKLQkJfQotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNudCA9PSAxICYmIFhPUjIoY2YgKyAoKHJlcyA+PiAzMCkgJiAweDIpKSwKLQkJCQkJCQkgRl9PRik7Ci0JfQotCXJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgUkNSIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggcmNyX2J5dGUodTggZCwgdTggcykKLXsKLQl1MzIJcmVzLCBjbnQ7Ci0JdTMyCW1hc2ssIGNmLCBvY2YgPSAwOwotCi0JLyogcm90YXRlIHJpZ2h0IHRocm91Z2ggY2FycnkgKi8KLSAgICAvKgotICAgICAgIHMgaXMgdGhlIHJvdGF0ZSBkaXN0YW5jZS4gIEl0IHZhcmllcyBmcm9tIDAgLSA4LgotICAgICAgIGQgaXMgdGhlIGJ5dGUgb2JqZWN0IHJvdGF0ZWQuCi0KLSAgICAgICBoYXZlCi0KLSAgICAgICBDRiAgQl83IEJfNiBCXzUgQl80IEJfMyBCXzIgQl8xIEJfMAotCi0gICAgICAgVGhlIG5ldyByb3RhdGUgaXMgZG9uZSBtb2QgOSwgYW5kIGdpdmVuIHRoaXMsCi0gICAgICAgZm9yIGEgcm90YXRpb24gb2YgbiBiaXRzIChtb2QgOSkgdGhlIG5ldyBjYXJyeSBmbGFnIGlzCi0gICAgICAgdGhlbiBsb2NhdGVkIG4gYml0cyBmcm9tIHRoZSBMU0IuICBUaGUgbG93IHBhcnQgaXMKLSAgICAgICB0aGVuIHNoaWZ0ZWQgdXAgY250IGJpdHMsIGFuZCB0aGUgaGlnaCBwYXJ0IGlzIG9yJ2QKLSAgICAgICBpbi4gIFVzaW5nIENBUFMgZm9yIG5ldyB2YWx1ZXMsIGFuZCBsb3dlcmNhc2UgZm9yIHRoZQotICAgICAgIG9yaWdpbmFsIHZhbHVlcywgdGhpcyBjYW4gYmUgZXhwcmVzc2VkIGFzOgotCi0gICAgICAgSUYgbiA+IDAKLSAgICAgICAxKSBDRiA8LSAgYl8obi0xKQotICAgICAgIDIpIEJfKDgtKG4rMSkpIC4uIEJfKDApICA8LSAgYl8oNykgLi4gYl8obikKLSAgICAgICAzKSBCXyg4LW4pIDwtIGNmCi0gICAgICAgNCkgQl8oNykgLi4gQl8oOC0obi0xKSkgPC0gIGJfKG4tMikgLi4gYl8oMCkKLQkgKi8KLQlyZXMgPSBkOwotCWlmICgoY250ID0gcyAlIDkpICE9IDApIHsKLQkvKiBleHRyYWN0IHRoZSBuZXcgQ0FSUlkgRkxBRy4gKi8KLQkvKiBDRiA8LSAgYl8obi0xKSAgICAgICAgICAgICAgKi8KLQlpZiAoY250ID09IDEpIHsKLQkgICAgY2YgPSBkICYgMHgxOwotCSAgICAvKiBub3RlIGhhY2tlcnkgaGVyZS4gIEFjY2Vzc19mbGFnKC4uKSBldmFsdWF0ZXMgdG8gZWl0aGVyCi0JICAgICAgIDAgaWYgZmxhZyBub3Qgc2V0Ci0JICAgICAgIG5vbi16ZXJvIGlmIGZsYWcgaXMgc2V0LgotCSAgICAgICBkb2luZyBhY2Nlc3NfZmxhZyguLikgIT0gMCBjYXN0cyB0aGF0IGludG8gZWl0aGVyCi0JCQkgICAwLi4xIGluIGFueSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmxhZ3MgcmVnaXN0ZXIKLQkgICAgICAgKGkuZS4gcGFja2VkIGJpdCBhcnJheSBvciB1bnBhY2tlZC4pCi0JICAgICAqLwotCQkJb2NmID0gQUNDRVNTX0ZMQUcoRl9DRikgIT0gMDsKLQl9IGVsc2UKLQkgICAgY2YgPSAoZCA+PiAoY250IC0gMSkpICYgMHgxOwotCi0JLyogQl8oOC0obisxKSkgLi4gQl8oMCkgIDwtICBiXyg3KSAuLiBiX24gICovCi0JLyogbm90ZSB0aGF0IHRoZSByaWdodCBoYW5kIHNpZGUgZG9uZSBieSB0aGUgbWFzawotCSAgIFRoaXMgaXMgZWZmZWN0aXZlbHkgZG9uZSBieSBzaGlmdGluZyB0aGUKLQkgICBvYmplY3QgdG8gdGhlIHJpZ2h0LiAgVGhlIHJlc3VsdCBtdXN0IGJlIG1hc2tlZCwKLQkgICBpbiBjYXNlIHRoZSBvYmplY3QgY2FtZSBpbiBhbmQgd2FzIHRyZWF0ZWQKLQkgICBhcyBhIG5lZ2F0aXZlIG51bWJlci4gIE5lZWRlZD8/PyAqLwotCi0JbWFzayA9ICgxIDw8ICg4IC0gY250KSkgLSAxOwotCXJlcyA9IChkID4+IGNudCkgJiBtYXNrOwotCi0JLyogbm93IHRoZSBoaWdoIHN0dWZmIHdoaWNoIHJvdGF0ZWQgYXJvdW5kCi0JICAgaW50byB0aGUgcG9zaXRpb25zIEJfY250LTIgLi4gQl8wICovCi0JLyogQl8oNykgLi4gQl8oOC0obi0xKSkgPC0gIGJfKG4tMikgLi4gYl8oMCkgKi8KLQkvKiBzaGlmdCBpdCBkb3dud2FyZCwgNy0obi0yKSA9IDktbiBwb3NpdGlvbnMuCi0JICAgYW5kIG1hc2sgb2ZmIHRoZSByZXN1bHQgYmVmb3JlIG9yJ2luZyBpbi4KLQkgKi8KLQlyZXMgfD0gKGQgPDwgKDkgLSBjbnQpKTsKLQotCS8qIGlmIHRoZSBjYXJyeSBmbGFnIHdhcyBzZXQsIG9yIGl0IGluLiAgKi8KLQkJaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKSB7ICAgICAvKiBjYXJyeSBmbGFnIGlzIHNldCAqLwotCSAgICAvKiAgQl8oOC1uKSA8LSBjZiAqLwotCSAgICByZXMgfD0gMSA8PCAoOCAtIGNudCk7Ci0JfQotCS8qIHNldCB0aGUgbmV3IGNhcnJ5IGZsYWcsIGJhc2VkIG9uIHRoZSB2YXJpYWJsZSAiY2YiICovCi0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKLQkvKiBPVkVSRkxPVyBpcyBzZXQgKklGRiogY250PT0xLCB0aGVuIGl0IGlzIHRoZQotCSAgIHhvciBvZiBDRiBhbmQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0LiAgQmxlY2NrLiAqLwotCS8qIHBhcmVudGhlc2l6ZWQuLi4gKi8KLQkJaWYgKGNudCA9PSAxKSB7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKG9jZiArICgoZCA+PiA2KSAmIDB4MikpLAotCQkJCQkJCQkgRl9PRik7Ci0JCX0KLQl9Ci0JcmV0dXJuICh1OClyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgUkNSIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IHJjcl93b3JkKHUxNiBkLCB1OCBzKQotewotCXUzMiByZXMsIGNudDsKLQl1MzIJbWFzaywgY2YsIG9jZiA9IDA7Ci0KLQkvKiByb3RhdGUgcmlnaHQgdGhyb3VnaCBjYXJyeSAqLwotCXJlcyA9IGQ7Ci0JaWYgKChjbnQgPSBzICUgMTcpICE9IDApIHsKLQkJaWYgKGNudCA9PSAxKSB7Ci0JCQljZiA9IGQgJiAweDE7Ci0JCQlvY2YgPSBBQ0NFU1NfRkxBRyhGX0NGKSAhPSAwOwotCQl9IGVsc2UKLQkJCWNmID0gKGQgPj4gKGNudCAtIDEpKSAmIDB4MTsKLQkJbWFzayA9ICgxIDw8ICgxNiAtIGNudCkpIC0gMTsKLQkJcmVzID0gKGQgPj4gY250KSAmIG1hc2s7Ci0JCXJlcyB8PSAoZCA8PCAoMTcgLSBjbnQpKTsKLQkJaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKSB7Ci0JCQlyZXMgfD0gMSA8PCAoMTYgLSBjbnQpOwotCQl9Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKLQkJaWYgKGNudCA9PSAxKSB7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKG9jZiArICgoZCA+PiAxNCkgJiAweDIpKSwKLQkJCQkJCQkJIEZfT0YpOwotCQl9Ci0JfQotCXJldHVybiAodTE2KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBSQ1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgcmNyX2xvbmcodTMyIGQsIHU4IHMpCi17Ci0JdTMyIHJlcywgY250OwotCXUzMiBtYXNrLCBjZiwgb2NmID0gMDsKLQotCS8qIHJvdGF0ZSByaWdodCB0aHJvdWdoIGNhcnJ5ICovCi0JcmVzID0gZDsKLQlpZiAoKGNudCA9IHMgJSAzMykgIT0gMCkgewotCQlpZiAoY250ID09IDEpIHsKLQkJCWNmID0gZCAmIDB4MTsKLQkJCW9jZiA9IEFDQ0VTU19GTEFHKEZfQ0YpICE9IDA7Ci0JCX0gZWxzZQotCQkJY2YgPSAoZCA+PiAoY250IC0gMSkpICYgMHgxOwotCQltYXNrID0gKDEgPDwgKDMyIC0gY250KSkgLSAxOwotCQlyZXMgPSAoZCA+PiBjbnQpICYgbWFzazsKLQkJaWYgKGNudCAhPSAxKQotCQkJcmVzIHw9IChkIDw8ICgzMyAtIGNudCkpOwotCQlpZiAoQUNDRVNTX0ZMQUcoRl9DRikpIHsgICAgIC8qIGNhcnJ5IGZsYWcgaXMgc2V0ICovCi0JCQlyZXMgfD0gMSA8PCAoMzIgLSBjbnQpOwotCQl9Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKLQkJaWYgKGNudCA9PSAxKSB7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKG9jZiArICgoZCA+PiAzMCkgJiAweDIpKSwKLQkJCQkJCQkJIEZfT0YpOwotCQl9Ci0JfQotCXJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgUk9MIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggcm9sX2J5dGUodTggZCwgdTggcykKLXsKLSAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgcmVzLCBjbnQsIG1hc2s7Ci0KLSAgICAvKiByb3RhdGUgbGVmdCAqLwotICAgIC8qCi0gICAgICAgcyBpcyB0aGUgcm90YXRlIGRpc3RhbmNlLiAgSXQgdmFyaWVzIGZyb20gMCAtIDguCi0gICAgICAgZCBpcyB0aGUgYnl0ZSBvYmplY3Qgcm90YXRlZC4KLQotICAgICAgIGhhdmUKLQotICAgICAgIENGICBCXzcgLi4uIEJfMAotCi0gICAgICAgVGhlIG5ldyByb3RhdGUgaXMgZG9uZSBtb2QgOC4KLSAgICAgICBNdWNoIHNpbXBsZXIgdGhhbiB0aGUgInJjbCIgb3IgInJjciIgb3BlcmF0aW9ucy4KLQotICAgICAgIElGIG4gPiAwCi0gICAgICAgMSkgQl8oNykgLi4gQl8obikgIDwtICBiXyg4LShuKzEpKSAuLiBiXygwKQotICAgICAgIDIpIEJfKG4tMSkgLi4gQl8oMCkgPC0gIGJfKDcpIC4uIGJfKDgtbikKLQkgKi8KLSAgICByZXMgPSBkOwotCWlmICgoY250ID0gcyAlIDgpICE9IDApIHsKLQkJLyogQl8oNykgLi4gQl8obikgIDwtICBiXyg4LShuKzEpKSAuLiBiXygwKSAqLwotCQlyZXMgPSAoZCA8PCBjbnQpOwotCi0JCS8qIEJfKG4tMSkgLi4gQl8oMCkgPC0gIGJfKDcpIC4uIGJfKDgtbikgKi8KLQkJbWFzayA9ICgxIDw8IGNudCkgLSAxOwotCQlyZXMgfD0gKGQgPj4gKDggLSBjbnQpKSAmIG1hc2s7Ci0KLQkJLyogc2V0IHRoZSBuZXcgY2FycnkgZmxhZywgTm90ZSB0aGF0IGl0IGlzIHRoZSBsb3cgb3JkZXIKLQkJICAgYml0IG9mIHRoZSByZXN1bHQhISEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHgxLCBGX0NGKTsKLQkJLyogT1ZFUkZMT1cgaXMgc2V0ICpJRkYqIHM9PTEsIHRoZW4gaXQgaXMgdGhlCi0JCSAgIHhvciBvZiBDRiBhbmQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0LiAgQmxlY2NrLiAqLwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhzID09IDEgJiYKLQkJCQkJCQkgWE9SMigocmVzICYgMHgxKSArICgocmVzID4+IDYpICYgMHgyKSksCi0JCQkJCQkJIEZfT0YpOwotCX0gaWYgKHMgIT0gMCkgewotCQkvKiBzZXQgdGhlIG5ldyBjYXJyeSBmbGFnLCBOb3RlIHRoYXQgaXQgaXMgdGhlIGxvdyBvcmRlcgotCQkgICBiaXQgb2YgdGhlIHJlc3VsdCEhISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDEsIEZfQ0YpOwotCX0KLQlyZXR1cm4gKHU4KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBST0wgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgcm9sX3dvcmQodTE2IGQsIHU4IHMpCi17Ci0gICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IHJlcywgY250LCBtYXNrOwotCi0JcmVzID0gZDsKLQlpZiAoKGNudCA9IHMgJSAxNikgIT0gMCkgewotCQlyZXMgPSAoZCA8PCBjbnQpOwotCQltYXNrID0gKDEgPDwgY250KSAtIDE7Ci0JCXJlcyB8PSAoZCA+PiAoMTYgLSBjbnQpKSAmIG1hc2s7Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4MSwgRl9DRik7Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKHMgPT0gMSAmJgotCQkJCQkJCSBYT1IyKChyZXMgJiAweDEpICsgKChyZXMgPj4gMTQpICYgMHgyKSksCi0JCQkJCQkJIEZfT0YpOwotCX0gaWYgKHMgIT0gMCkgewotCQkvKiBzZXQgdGhlIG5ldyBjYXJyeSBmbGFnLCBOb3RlIHRoYXQgaXQgaXMgdGhlIGxvdyBvcmRlcgotCQkgICBiaXQgb2YgdGhlIHJlc3VsdCEhISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDEsIEZfQ0YpOwotCX0KLQlyZXR1cm4gKHUxNilyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgUk9MIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIHJvbF9sb25nKHUzMiBkLCB1OCBzKQotewotICAgIHJlZ2lzdGVyIHUzMiByZXMsIGNudCwgbWFzazsKLQotCXJlcyA9IGQ7Ci0JaWYgKChjbnQgPSBzICUgMzIpICE9IDApIHsKLQkJcmVzID0gKGQgPDwgY250KTsKLQkJbWFzayA9ICgxIDw8IGNudCkgLSAxOwotCQlyZXMgfD0gKGQgPj4gKDMyIC0gY250KSkgJiBtYXNrOwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDEsIEZfQ0YpOwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhzID09IDEgJiYKLQkJCQkJCQkgWE9SMigocmVzICYgMHgxKSArICgocmVzID4+IDMwKSAmIDB4MikpLAotCQkJCQkJCSBGX09GKTsKLQl9IGlmIChzICE9IDApIHsKLQkJLyogc2V0IHRoZSBuZXcgY2FycnkgZmxhZywgTm90ZSB0aGF0IGl0IGlzIHRoZSBsb3cgb3JkZXIKLQkJICAgYml0IG9mIHRoZSByZXN1bHQhISEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHgxLCBGX0NGKTsKLQl9Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBST1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCByb3JfYnl0ZSh1OCBkLCB1OCBzKQotewotICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCByZXMsIGNudCwgbWFzazsKLQotICAgIC8qIHJvdGF0ZSByaWdodCAqLwotICAgIC8qCi0gICAgICAgcyBpcyB0aGUgcm90YXRlIGRpc3RhbmNlLiAgSXQgdmFyaWVzIGZyb20gMCAtIDguCi0gICAgICAgZCBpcyB0aGUgYnl0ZSBvYmplY3Qgcm90YXRlZC4KLQotICAgICAgIGhhdmUKLQotICAgICAgIEJfNyAuLi4gQl8wCi0KLSAgICAgICBUaGUgcm90YXRlIGlzIGRvbmUgbW9kIDguCi0KLSAgICAgICBJRiBuID4gMAotICAgICAgIDEpIEJfKDgtKG4rMSkpIC4uIEJfKDApICA8LSAgYl8oNykgLi4gYl8obikKLSAgICAgICAyKSBCXyg3KSAuLiBCXyg4LW4pIDwtICBiXyhuLTEpIC4uIGJfKDApCi0JICovCi0JcmVzID0gZDsKLQlpZiAoKGNudCA9IHMgJSA4KSAhPSAwKSB7ICAgICAgICAgICAvKiBub3QgYSB0eXBvLCBkbyBuYWRhIGlmIGNudD09MCAqLwotCS8qIEJfKDcpIC4uIEJfKDgtbikgPC0gIGJfKG4tMSkgLi4gYl8oMCkgKi8KLQlyZXMgPSAoZCA8PCAoOCAtIGNudCkpOwotCi0JLyogQl8oOC0obisxKSkgLi4gQl8oMCkgIDwtICBiXyg3KSAuLiBiXyhuKSAqLwotCW1hc2sgPSAoMSA8PCAoOCAtIGNudCkpIC0gMTsKLQlyZXMgfD0gKGQgPj4gKGNudCkpICYgbWFzazsKLQotCS8qIHNldCB0aGUgbmV3IGNhcnJ5IGZsYWcsIE5vdGUgdGhhdCBpdCBpcyB0aGUgbG93IG9yZGVyCi0JICAgYml0IG9mIHRoZSByZXN1bHQhISEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MCwgRl9DRik7Ci0JCS8qIE9WRVJGTE9XIGlzIHNldCAqSUZGKiBzPT0xLCB0aGVuIGl0IGlzIHRoZQotCSAgIHhvciBvZiB0aGUgdHdvIG1vc3Qgc2lnbmlmaWNhbnQgYml0cy4gIEJsZWNjay4gKi8KLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocyA9PSAxICYmIFhPUjIocmVzID4+IDYpLCBGX09GKTsKLQl9IGVsc2UgaWYgKHMgIT0gMCkgewotCQkvKiBzZXQgdGhlIG5ldyBjYXJyeSBmbGFnLCBOb3RlIHRoYXQgaXQgaXMgdGhlIGxvdyBvcmRlcgotCQkgICBiaXQgb2YgdGhlIHJlc3VsdCEhISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwLCBGX0NGKTsKLQl9Ci0JcmV0dXJuICh1OClyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgUk9SIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IHJvcl93b3JkKHUxNiBkLCB1OCBzKQotewotICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCByZXMsIGNudCwgbWFzazsKLQotCXJlcyA9IGQ7Ci0JaWYgKChjbnQgPSBzICUgMTYpICE9IDApIHsKLQkJcmVzID0gKGQgPDwgKDE2IC0gY250KSk7Ci0JCW1hc2sgPSAoMSA8PCAoMTYgLSBjbnQpKSAtIDE7Ci0JCXJlcyB8PSAoZCA+PiAoY250KSkgJiBtYXNrOwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfQ0YpOwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhzID09IDEgJiYgWE9SMihyZXMgPj4gMTQpLCBGX09GKTsKLQl9IGVsc2UgaWYgKHMgIT0gMCkgewotCQkvKiBzZXQgdGhlIG5ldyBjYXJyeSBmbGFnLCBOb3RlIHRoYXQgaXQgaXMgdGhlIGxvdyBvcmRlcgotCQkgICBiaXQgb2YgdGhlIHJlc3VsdCEhISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfQ0YpOwotCX0KLQlyZXR1cm4gKHUxNilyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgUk9SIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIHJvcl9sb25nKHUzMiBkLCB1OCBzKQotewotCXJlZ2lzdGVyIHUzMiByZXMsIGNudCwgbWFzazsKLQotCXJlcyA9IGQ7Ci0JaWYgKChjbnQgPSBzICUgMzIpICE9IDApIHsKLQkJcmVzID0gKGQgPDwgKDMyIC0gY250KSk7Ci0JCW1hc2sgPSAoMSA8PCAoMzIgLSBjbnQpKSAtIDE7Ci0JCXJlcyB8PSAoZCA+PiAoY250KSkgJiBtYXNrOwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX0NGKTsKLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocyA9PSAxICYmIFhPUjIocmVzID4+IDMwKSwgRl9PRik7Ci0JfSBlbHNlIGlmIChzICE9IDApIHsKLQkJLyogc2V0IHRoZSBuZXcgY2FycnkgZmxhZywgTm90ZSB0aGF0IGl0IGlzIHRoZSBsb3cgb3JkZXIKLQkJICAgYml0IG9mIHRoZSByZXN1bHQhISEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwMDAwMCwgRl9DRik7Ci0JfQotCXJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgU0hMIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggc2hsX2J5dGUodTggZCwgdTggcykKLXsKLQl1bnNpZ25lZCBpbnQgY250LCByZXMsIGNmOwotCi0JaWYgKHMgPCA4KSB7Ci0JCWNudCA9IHMgJSA4OwotCi0JCS8qIGxhc3QgYml0IHNoaWZ0ZWQgb3V0IGdvZXMgaW50byBjYXJyeSBmbGFnICovCi0JCWlmIChjbnQgPiAwKSB7Ci0JCQlyZXMgPSBkIDw8IGNudDsKLQkJCWNmID0gZCAmICgxIDw8ICg4IC0gY250KSk7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZikgPT0gMCwgRl9aRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwLCBGX1NGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0JCX0gZWxzZSB7Ci0JCQlyZXMgPSAodTgpIGQ7Ci0JCX0KLQotCQlpZiAoY250ID09IDEpIHsKLQkJCS8qIE5lZWRzIHNpbXBsaWZpY2F0aW9uLiAqLwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoCi0JCQkJCQkJCQkoKChyZXMgJiAweDgwKSA9PSAweDgwKSBeCi0JCQkJCQkJCQkgKEFDQ0VTU19GTEFHKEZfQ0YpICE9IDApKSwKLQkJCS8qIHdhcyAoTS54ODYuUl9GTEcmRl9DRik9PUZfQ0YpKSwgKi8KLQkJCQkJCQkJCUZfT0YpOwotCQl9IGVsc2UgewotCQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXJlcyA9IDA7Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKChkIDw8IChzLTEpKSAmIDB4ODAsIEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCQlDTEVBUl9GTEFHKEZfU0YpOwotCQlTRVRfRkxBRyhGX1BGKTsKLQkJU0VUX0ZMQUcoRl9aRik7Ci0gICAgfQotCXJldHVybiAodTgpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFNITCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUxNiBzaGxfd29yZCh1MTYgZCwgdTggcykKLXsKLSAgICB1bnNpZ25lZCBpbnQgY250LCByZXMsIGNmOwotCi0JaWYgKHMgPCAxNikgewotCQljbnQgPSBzICUgMTY7Ci0JCWlmIChjbnQgPiAwKSB7Ci0JCQlyZXMgPSBkIDw8IGNudDsKLQkJCWNmID0gZCAmICgxIDw8ICgxNiAtIGNudCkpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZikgPT0gMCwgRl9aRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfU0YpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQkJfSBlbHNlIHsKLQkJCXJlcyA9ICh1MTYpIGQ7Ci0JCX0KLQotCQlpZiAoY250ID09IDEpIHsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKAotCQkJCQkJCQkJKCgocmVzICYgMHg4MDAwKSA9PSAweDgwMDApIF4KLQkJCQkJCQkJCSAoQUNDRVNTX0ZMQUcoRl9DRikgIT0gMCkpLAotCQkJCQkJCQkJRl9PRik7Ci0JfSBlbHNlIHsKLQkJCUNMRUFSX0ZMQUcoRl9PRik7Ci0JfQotICAgIH0gZWxzZSB7Ci0JCXJlcyA9IDA7Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKChkIDw8IChzLTEpKSAmIDB4ODAwMCwgRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JCUNMRUFSX0ZMQUcoRl9TRik7Ci0JCVNFVF9GTEFHKEZfUEYpOwotCQlTRVRfRkxBRyhGX1pGKTsKLQl9Ci0JcmV0dXJuICh1MTYpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFNITCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiBzaGxfbG9uZyh1MzIgZCwgdTggcykKLXsKLQl1bnNpZ25lZCBpbnQgY250LCByZXMsIGNmOwotCi0JaWYgKHMgPCAzMikgewotCQljbnQgPSBzICUgMzI7Ci0JCWlmIChjbnQgPiAwKSB7Ci0JCQlyZXMgPSBkIDw8IGNudDsKLQkJCWNmID0gZCAmICgxIDw8ICgzMiAtIGNudCkpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZmZmZmYpID09IDAsIEZfWkYpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwMDAwMCwgRl9TRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCQl9IGVsc2UgewotCQkJcmVzID0gZDsKLQkJfQotCQlpZiAoY250ID09IDEpIHsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKCgoKHJlcyAmIDB4ODAwMDAwMDApID09IDB4ODAwMDAwMDApIF4KLQkJCQkJCQkJICAoQUNDRVNTX0ZMQUcoRl9DRikgIT0gMCkpLCBGX09GKTsKLQkJfSBlbHNlIHsKLQkJCUNMRUFSX0ZMQUcoRl9PRik7Ci0JCX0KLQl9IGVsc2UgewotCQlyZXMgPSAwOwotCQlDT05ESVRJT05BTF9TRVRfRkxBRygoZCA8PCAocy0xKSkgJiAweDgwMDAwMDAwLCBGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkJQ0xFQVJfRkxBRyhGX1NGKTsKLQkJU0VUX0ZMQUcoRl9QRik7Ci0JCVNFVF9GTEFHKEZfWkYpOwotCX0KLQlyZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFNIUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IHNocl9ieXRlKHU4IGQsIHU4IHMpCi17Ci0JdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZjsKLQotCWlmIChzIDwgOCkgewotCQljbnQgPSBzICUgODsKLQkJaWYgKGNudCA+IDApIHsKLQkJCWNmID0gZCAmICgxIDw8IChjbnQgLSAxKSk7Ci0JCQlyZXMgPSBkID4+IGNudDsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmKSA9PSAwLCBGX1pGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfU0YpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQkJfSBlbHNlIHsKLQkJCXJlcyA9ICh1OCkgZDsKLQkJfQotCi0JCWlmIChjbnQgPT0gMSkgewotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihyZXMgPj4gNiksIEZfT0YpOwotCQl9IGVsc2UgewotCQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXJlcyA9IDA7Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKChkID4+IChzLTEpKSAmIDB4MSwgRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JCUNMRUFSX0ZMQUcoRl9TRik7Ci0JCVNFVF9GTEFHKEZfUEYpOwotCQlTRVRfRkxBRyhGX1pGKTsKLQl9Ci0JcmV0dXJuICh1OClyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgU0hSIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IHNocl93b3JkKHUxNiBkLCB1OCBzKQotewotCXVuc2lnbmVkIGludCBjbnQsIHJlcywgY2Y7Ci0KLQlpZiAocyA8IDE2KSB7Ci0JCWNudCA9IHMgJSAxNjsKLQkJaWYgKGNudCA+IDApIHsKLQkJCWNmID0gZCAmICgxIDw8IChjbnQgLSAxKSk7Ci0JCQlyZXMgPSBkID4+IGNudDsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmYpID09IDAsIEZfWkYpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwLCBGX1NGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0JCX0gZWxzZSB7Ci0JCQlyZXMgPSBkOwotCQl9Ci0KLQkJaWYgKGNudCA9PSAxKSB7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKHJlcyA+PiAxNCksIEZfT0YpOwotCX0gZWxzZSB7Ci0JCQlDTEVBUl9GTEFHKEZfT0YpOwotCX0KLQl9IGVsc2UgewotCQlyZXMgPSAwOwotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCQlTRVRfRkxBRyhGX1pGKTsKLQkJQ0xFQVJfRkxBRyhGX1NGKTsKLQkJQ0xFQVJfRkxBRyhGX1BGKTsKLSAgICB9Ci0JcmV0dXJuICh1MTYpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFNIUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiBzaHJfbG9uZyh1MzIgZCwgdTggcykKLXsKLQl1bnNpZ25lZCBpbnQgY250LCByZXMsIGNmOwotCi0JaWYgKHMgPCAzMikgewotCQljbnQgPSBzICUgMzI7Ci0JCWlmIChjbnQgPiAwKSB7Ci0JCQljZiA9IGQgJiAoMSA8PCAoY250IC0gMSkpOwotCQkJcmVzID0gZCA+PiBjbnQ7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmZmZmZikgPT0gMCwgRl9aRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX1NGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0JfSBlbHNlIHsKLQkgICAgcmVzID0gZDsKLQl9Ci0JaWYgKGNudCA9PSAxKSB7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKHJlcyA+PiAzMCksIEZfT0YpOwotCX0gZWxzZSB7Ci0JCQlDTEVBUl9GTEFHKEZfT0YpOwotCX0KLSAgICB9IGVsc2UgewotCXJlcyA9IDA7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JCVNFVF9GTEFHKEZfWkYpOwotCQlDTEVBUl9GTEFHKEZfU0YpOwotCQlDTEVBUl9GTEFHKEZfUEYpOwotICAgIH0KLSAgICByZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFNBUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IHNhcl9ieXRlKHU4IGQsIHU4IHMpCi17Ci0JdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZiwgbWFzaywgc2Y7Ci0KLQlyZXMgPSBkOwotCXNmID0gZCAmIDB4ODA7Ci0gICAgY250ID0gcyAlIDg7Ci0JaWYgKGNudCA+IDAgJiYgY250IDwgOCkgewotCQltYXNrID0gKDEgPDwgKDggLSBjbnQpKSAtIDE7Ci0JCWNmID0gZCAmICgxIDw8IChjbnQgLSAxKSk7Ci0JCXJlcyA9IChkID4+IGNudCkgJiBtYXNrOwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7Ci0JCWlmIChzZikgewotCQkJcmVzIHw9IH5tYXNrOwotCQl9Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmKSA9PSAwLCBGX1pGKTsKLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MCwgRl9TRik7Ci0gICAgfSBlbHNlIGlmIChjbnQgPj0gOCkgewotCWlmIChzZikgewotCSAgICByZXMgPSAweGZmOwotCQkJU0VUX0ZMQUcoRl9DRik7Ci0JCQlDTEVBUl9GTEFHKEZfWkYpOwotCQkJU0VUX0ZMQUcoRl9TRik7Ci0JCQlTRVRfRkxBRyhGX1BGKTsKLQkJfSBlbHNlIHsKLQkJCXJlcyA9IDA7Ci0JCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQkJU0VUX0ZMQUcoRl9aRik7Ci0JCQlDTEVBUl9GTEFHKEZfU0YpOwotCQkJQ0xFQVJfRkxBRyhGX1BGKTsKLQkJfQotCX0KLQlyZXR1cm4gKHU4KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBTQVIgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgc2FyX3dvcmQodTE2IGQsIHU4IHMpCi17Ci0gICAgdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZiwgbWFzaywgc2Y7Ci0KLSAgICBzZiA9IGQgJiAweDgwMDA7Ci0gICAgY250ID0gcyAlIDE2OwotCXJlcyA9IGQ7Ci0JaWYgKGNudCA+IDAgJiYgY250IDwgMTYpIHsKLQltYXNrID0gKDEgPDwgKDE2IC0gY250KSkgLSAxOwotCWNmID0gZCAmICgxIDw8IChjbnQgLSAxKSk7Ci0JcmVzID0gKGQgPj4gY250KSAmIG1hc2s7Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKLQlpZiAoc2YpIHsKLQkgICAgcmVzIHw9IH5tYXNrOwotCX0KLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZikgPT0gMCwgRl9aRik7Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMCwgRl9TRik7Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0gICAgfSBlbHNlIGlmIChjbnQgPj0gMTYpIHsKLQlpZiAoc2YpIHsKLQkgICAgcmVzID0gMHhmZmZmOwotCQkJU0VUX0ZMQUcoRl9DRik7Ci0JCQlDTEVBUl9GTEFHKEZfWkYpOwotCQkJU0VUX0ZMQUcoRl9TRik7Ci0JCQlTRVRfRkxBRyhGX1BGKTsKLQl9IGVsc2UgewotCSAgICByZXMgPSAwOwotCQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJCVNFVF9GTEFHKEZfWkYpOwotCQkJQ0xFQVJfRkxBRyhGX1NGKTsKLQkJCUNMRUFSX0ZMQUcoRl9QRik7Ci0JfQotICAgIH0KLQlyZXR1cm4gKHUxNilyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgU0FSIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIHNhcl9sb25nKHUzMiBkLCB1OCBzKQotewotICAgIHUzMiBjbnQsIHJlcywgY2YsIG1hc2ssIHNmOwotCi0gICAgc2YgPSBkICYgMHg4MDAwMDAwMDsKLSAgICBjbnQgPSBzICUgMzI7Ci0JcmVzID0gZDsKLQlpZiAoY250ID4gMCAmJiBjbnQgPCAzMikgewotCW1hc2sgPSAoMSA8PCAoMzIgLSBjbnQpKSAtIDE7Ci0JCWNmID0gZCAmICgxIDw8IChjbnQgLSAxKSk7Ci0JcmVzID0gKGQgPj4gY250KSAmIG1hc2s7Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKLQlpZiAoc2YpIHsKLQkgICAgcmVzIHw9IH5tYXNrOwotCX0KLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZmZmZmYpID09IDAsIEZfWkYpOwotCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX1NGKTsKLQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLSAgICB9IGVsc2UgaWYgKGNudCA+PSAzMikgewotCWlmIChzZikgewotCSAgICByZXMgPSAweGZmZmZmZmZmOwotCQkJU0VUX0ZMQUcoRl9DRik7Ci0JCQlDTEVBUl9GTEFHKEZfWkYpOwotCQkJU0VUX0ZMQUcoRl9TRik7Ci0JCQlTRVRfRkxBRyhGX1BGKTsKLQkJfSBlbHNlIHsKLQkJCXJlcyA9IDA7Ci0JCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQkJU0VUX0ZMQUcoRl9aRik7Ci0JCQlDTEVBUl9GTEFHKEZfU0YpOwotCQkJQ0xFQVJfRkxBRyhGX1BGKTsKLQkJfQotCX0KLQlyZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFNITEQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgc2hsZF93b3JkICh1MTYgZCwgdTE2IGZpbGwsIHU4IHMpCi17Ci0JdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZjsKLQotCWlmIChzIDwgMTYpIHsKLQkJY250ID0gcyAlIDE2OwotCQlpZiAoY250ID4gMCkgewotCQkJcmVzID0gKGQgPDwgY250KSB8IChmaWxsID4+ICgxNi1jbnQpKTsKLQkJCWNmID0gZCAmICgxIDw8ICgxNiAtIGNudCkpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZikgPT0gMCwgRl9aRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfU0YpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQkJfSBlbHNlIHsKLQkJCXJlcyA9IGQ7Ci0JCX0KLQkJaWYgKGNudCA9PSAxKSB7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRygoKChyZXMgJiAweDgwMDApID09IDB4ODAwMCkgXgotCQkJCQkJCQkgIChBQ0NFU1NfRkxBRyhGX0NGKSAhPSAwKSksIEZfT0YpOwotCQl9IGVsc2UgewotCQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXJlcyA9IDA7Ci0JCUNPTkRJVElPTkFMX1NFVF9GTEFHKChkIDw8IChzLTEpKSAmIDB4ODAwMCwgRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JCUNMRUFSX0ZMQUcoRl9TRik7Ci0JCVNFVF9GTEFHKEZfUEYpOwotCQlTRVRfRkxBRyhGX1pGKTsKLQl9Ci0JcmV0dXJuICh1MTYpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFNITEQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgc2hsZF9sb25nICh1MzIgZCwgdTMyIGZpbGwsIHU4IHMpCi17Ci0JdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZjsKLQotCWlmIChzIDwgMzIpIHsKLQkJY250ID0gcyAlIDMyOwotCQlpZiAoY250ID4gMCkgewotCQkJcmVzID0gKGQgPDwgY250KSB8IChmaWxsID4+ICgzMi1jbnQpKTsKLQkJCWNmID0gZCAmICgxIDw8ICgzMiAtIGNudCkpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZmZmZmYpID09IDAsIEZfWkYpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwMDAwMCwgRl9TRik7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCQl9IGVsc2UgewotCQkJcmVzID0gZDsKLQkJfQotCQlpZiAoY250ID09IDEpIHsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKCgoKHJlcyAmIDB4ODAwMDAwMDApID09IDB4ODAwMDAwMDApIF4KLQkJCQkJCQkJICAoQUNDRVNTX0ZMQUcoRl9DRikgIT0gMCkpLCBGX09GKTsKLQkJfSBlbHNlIHsKLQkJCUNMRUFSX0ZMQUcoRl9PRik7Ci0JCX0KLQl9IGVsc2UgewotCQlyZXMgPSAwOwotCQlDT05ESVRJT05BTF9TRVRfRkxBRygoZCA8PCAocy0xKSkgJiAweDgwMDAwMDAwLCBGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQkJQ0xFQVJfRkxBRyhGX1NGKTsKLQkJU0VUX0ZMQUcoRl9QRik7Ci0JCVNFVF9GTEFHKEZfWkYpOwotCX0KLQlyZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFNIUkQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgc2hyZF93b3JkICh1MTYgZCwgdTE2IGZpbGwsIHU4IHMpCi17Ci0JdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZjsKLQotCWlmIChzIDwgMTYpIHsKLQkJY250ID0gcyAlIDE2OwotCQlpZiAoY250ID4gMCkgewotCQkJY2YgPSBkICYgKDEgPDwgKGNudCAtIDEpKTsKLQkJCXJlcyA9IChkID4+IGNudCkgfCAoZmlsbCA8PCAoMTYgLSBjbnQpKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmYpID09IDAsIEZfWkYpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwLCBGX1NGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0JCX0gZWxzZSB7Ci0JCQlyZXMgPSBkOwotCQl9Ci0KLQkJaWYgKGNudCA9PSAxKSB7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKHJlcyA+PiAxNCksIEZfT0YpOwotCX0gZWxzZSB7Ci0JCQlDTEVBUl9GTEFHKEZfT0YpOwotCX0KLQl9IGVsc2UgewotCQlyZXMgPSAwOwotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCQlTRVRfRkxBRyhGX1pGKTsKLQkJQ0xFQVJfRkxBRyhGX1NGKTsKLQkJQ0xFQVJfRkxBRyhGX1BGKTsKLSAgICB9Ci0JcmV0dXJuICh1MTYpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFNIUkQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgc2hyZF9sb25nICh1MzIgZCwgdTMyIGZpbGwsIHU4IHMpCi17Ci0JdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZjsKLQotCWlmIChzIDwgMzIpIHsKLQkJY250ID0gcyAlIDMyOwotCQlpZiAoY250ID4gMCkgewotCQkJY2YgPSBkICYgKDEgPDwgKGNudCAtIDEpKTsKLQkJCXJlcyA9IChkID4+IGNudCkgfCAoZmlsbCA8PCAoMzIgLSBjbnQpKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmZmZmZmKSA9PSAwLCBGX1pGKTsKLQkJCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMDAwMDAsIEZfU0YpOwotCQkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQkJfSBlbHNlIHsKLQkJCXJlcyA9IGQ7Ci0JCX0KLQkJaWYgKGNudCA9PSAxKSB7Ci0JCQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKHJlcyA+PiAzMCksIEZfT0YpOwotCX0gZWxzZSB7Ci0JCQlDTEVBUl9GTEFHKEZfT0YpOwotCX0KLQl9IGVsc2UgewotCQlyZXMgPSAwOwotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCQlTRVRfRkxBRyhGX1pGKTsKLQkJQ0xFQVJfRkxBRyhGX1NGKTsKLQkJQ0xFQVJfRkxBRyhGX1BGKTsKLSAgICB9Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBTQkIgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBzYmJfYnl0ZSh1OCBkLCB1OCBzKQotewotICAgIHJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0gICAgcmVnaXN0ZXIgdTMyIGJjOwotCi0JaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKQotCQlyZXMgPSBkIC0gcyAtIDE7Ci0JZWxzZQotCQlyZXMgPSBkIC0gczsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZikgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQotCS8qIGNhbGN1bGF0ZSB0aGUgYm9ycm93IGNoYWluLiAgU2VlIG5vdGUgYXQgdG9wICovCi0JYmMgPSAocmVzICYgKH5kIHwgcykpIHwgKH5kICYgcyk7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgwLCBGX0NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGJjID4+IDYpLCBGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4OCwgRl9BRik7Ci0JcmV0dXJuICh1OClyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgU0JCIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IHNiYl93b3JkKHUxNiBkLCB1MTYgcykKLXsKLSAgICByZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotICAgIHJlZ2lzdGVyIHUzMiBiYzsKLQotCWlmIChBQ0NFU1NfRkxBRyhGX0NGKSkKLQlyZXMgPSBkIC0gcyAtIDE7Ci0gICAgZWxzZQotCXJlcyA9IGQgLSBzOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoKHJlcyAmIDB4ZmZmZikgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQotCS8qIGNhbGN1bGF0ZSB0aGUgYm9ycm93IGNoYWluLiAgU2VlIG5vdGUgYXQgdG9wICovCi0JYmMgPSAocmVzICYgKH5kIHwgcykpIHwgKH5kICYgcyk7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgwMDAsIEZfQ0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoYmMgPj4gMTQpLCBGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4OCwgRl9BRik7Ci0JcmV0dXJuICh1MTYpcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFNCQiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiBzYmJfbG9uZyh1MzIgZCwgdTMyIHMpCi17Ci0JcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLQlyZWdpc3RlciB1MzIgYmM7Ci0KLQlpZiAoQUNDRVNTX0ZMQUcoRl9DRikpCi0JcmVzID0gZCAtIHMgLSAxOwotICAgIGVsc2UKLQlyZXMgPSBkIC0gczsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmZmZmZikgPT0gMCwgRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKHJlcyAmIDB4ZmYpLCBGX1BGKTsKLQotCS8qIGNhbGN1bGF0ZSB0aGUgYm9ycm93IGNoYWluLiAgU2VlIG5vdGUgYXQgdG9wICovCi0JYmMgPSAocmVzICYgKH5kIHwgcykpIHwgKH5kICYgcyk7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgwMDAwMDAwLCBGX0NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGJjID4+IDMwKSwgRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOwotCXJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgU1VCIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggc3ViX2J5dGUodTggZCwgdTggcykKLXsKLQlyZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotCXJlZ2lzdGVyIHUzMiBiYzsKLQotCXJlcyA9IGQgLSBzOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmKSA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCi0JLyogY2FsY3VsYXRlIHRoZSBib3Jyb3cgY2hhaW4uICBTZWUgbm90ZSBhdCB0b3AgKi8KLQliYyA9IChyZXMgJiAofmQgfCBzKSkgfCAofmQgJiBzKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4ODAsIEZfQ0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoYmMgPj4gNiksIEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4LCBGX0FGKTsKLQlyZXR1cm4gKHU4KXJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBTVUIgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgc3ViX3dvcmQodTE2IGQsIHUxNiBzKQotewotICAgIHJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0gICAgcmVnaXN0ZXIgdTMyIGJjOwotCi0gICAgcmVzID0gZCAtIHM7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwLCBGX1NGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRygocmVzICYgMHhmZmZmKSA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCi0JLyogY2FsY3VsYXRlIHRoZSBib3Jyb3cgY2hhaW4uICBTZWUgbm90ZSBhdCB0b3AgKi8KLQliYyA9IChyZXMgJiAofmQgfCBzKSkgfCAofmQgJiBzKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4ODAwMCwgRl9DRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiAxNCksIEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4LCBGX0FGKTsKLQlyZXR1cm4gKHUxNilyZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgU1VCIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIHN1Yl9sb25nKHUzMiBkLCB1MzIgcykKLXsKLQlyZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotCXJlZ2lzdGVyIHUzMiBiYzsKLQotCXJlcyA9IGQgLSBzOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMDAwMDAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKChyZXMgJiAweGZmZmZmZmZmKSA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCi0JLyogY2FsY3VsYXRlIHRoZSBib3Jyb3cgY2hhaW4uICBTZWUgbm90ZSBhdCB0b3AgKi8KLQliYyA9IChyZXMgJiAofmQgfCBzKSkgfCAofmQgJiBzKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4ODAwMDAwMDAsIEZfQ0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoYmMgPj4gMzApLCBGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4OCwgRl9BRik7Ci0JcmV0dXJuIHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBURVNUIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB0ZXN0X2J5dGUodTggZCwgdTggcykKLXsKLSAgICByZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotCi0gICAgcmVzID0gZCAmIHM7Ci0KLQlDTEVBUl9GTEFHKEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotICAgIC8qIEFGID09IGRvbnQgY2FyZSAqLwotCUNMRUFSX0ZMQUcoRl9DRik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgVEVTVCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgdGVzdF93b3JkKHUxNiBkLCB1MTYgcykKLXsKLQlyZWdpc3RlciB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotCi0JcmVzID0gZCAmIHM7Ci0KLQlDTEVBUl9GTEFHKEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0JLyogQUYgPT0gZG9udCBjYXJlICovCi0JQ0xFQVJfRkxBRyhGX0NGKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBURVNUIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB0ZXN0X2xvbmcodTMyIGQsIHUzMiBzKQotewotCXJlZ2lzdGVyIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0KLQlyZXMgPSBkICYgczsKLQotCUNMRUFSX0ZMQUcoRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwMDAwMCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0JLyogQUYgPT0gZG9udCBjYXJlICovCi0JQ0xFQVJfRkxBRyhGX0NGKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBYT1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCB4b3JfYnl0ZSh1OCBkLCB1OCBzKQotewotCXJlZ2lzdGVyIHU4IHJlczsgICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCi0KLQlyZXMgPSBkIF4gczsKLQlDTEVBUl9GTEFHKEZfT0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzKSwgRl9QRik7Ci0JQ0xFQVJfRkxBRyhGX0NGKTsKLQlDTEVBUl9GTEFHKEZfQUYpOwotCXJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgWE9SIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IHhvcl93b3JkKHUxNiBkLCB1MTYgcykKLXsKLQlyZWdpc3RlciB1MTYgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLwotCi0JcmVzID0gZCBeIHM7Ci0JQ0xFQVJfRkxBRyhGX09GKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAsIEZfU0YpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyA9PSAwLCBGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhmZiksIEZfUEYpOwotCUNMRUFSX0ZMQUcoRl9DRik7Ci0JQ0xFQVJfRkxBRyhGX0FGKTsKLQlyZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIFhPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiB4b3JfbG9uZyh1MzIgZCwgdTMyIHMpCi17Ci0JcmVnaXN0ZXIgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KLQotCXJlcyA9IGQgXiBzOwotCUNMRUFSX0ZMQUcoRl9PRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwMDAwMCwgRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShyZXMgJiAweGZmKSwgRl9QRik7Ci0JQ0xFQVJfRkxBRyhGX0NGKTsKLQlDTEVBUl9GTEFHKEZfQUYpOwotCXJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgSU1VTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgaW11bF9ieXRlKHU4IHMpCi17Ci0JczE2IHJlcyA9IChzMTYpKChzOClNLng4Ni5SX0FMICogKHM4KXMpOwotCi0JTS54ODYuUl9BWCA9IHJlczsKLQlpZiAoKChNLng4Ni5SX0FMICYgMHg4MCkgPT0gMCAmJiBNLng4Ni5SX0FIID09IDB4MDApIHx8Ci0JCSgoTS54ODYuUl9BTCAmIDB4ODApICE9IDAgJiYgTS54ODYuUl9BSCA9PSAweEZGKSkgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCX0gZWxzZSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgSU1VTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgaW11bF93b3JkKHUxNiBzKQotewotCXMzMiByZXMgPSAoczE2KU0ueDg2LlJfQVggKiAoczE2KXM7Ci0KLQlNLng4Ni5SX0FYID0gKHUxNilyZXM7Ci0JTS54ODYuUl9EWCA9ICh1MTYpKHJlcyA+PiAxNik7Ci0JaWYgKCgoTS54ODYuUl9BWCAmIDB4ODAwMCkgPT0gMCAmJiBNLng4Ni5SX0RYID09IDB4MDApIHx8Ci0JCSgoTS54ODYuUl9BWCAmIDB4ODAwMCkgIT0gMCAmJiBNLng4Ni5SX0RYID09IDB4RkYpKSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JfSBlbHNlIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBJTVVMIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBpbXVsX2xvbmdfZGlyZWN0KHUzMiAqcmVzX2xvLCB1MzIqIHJlc19oaSx1MzIgZCwgdTMyIHMpCi17Ci0jaWZkZWYJX19IQVNfTE9OR19MT05HX18KLQlzNjQgcmVzID0gKHMzMilkICogKHMzMilzOwotCi0JKnJlc19sbyA9ICh1MzIpcmVzOwotCSpyZXNfaGkgPSAodTMyKShyZXMgPj4gMzIpOwotI2Vsc2UKLQl1MzIJZF9sbyxkX2hpLGRfc2lnbjsKLQl1MzIJc19sbyxzX2hpLHNfc2lnbjsKLQl1MzIJcmxvX2xvLHJsb19oaSxyaGlfbG87Ci0KLQlpZiAoKGRfc2lnbiA9IGQgJiAweDgwMDAwMDAwKSAhPSAwKQotCQlkID0gLWQ7Ci0JZF9sbyA9IGQgJiAweEZGRkY7Ci0JZF9oaSA9IGQgPj4gMTY7Ci0JaWYgKChzX3NpZ24gPSBzICYgMHg4MDAwMDAwMCkgIT0gMCkKLQkJcyA9IC1zOwotCXNfbG8gPSBzICYgMHhGRkZGOwotCXNfaGkgPSBzID4+IDE2OwotCXJsb19sbyA9IGRfbG8gKiBzX2xvOwotCXJsb19oaSA9IChkX2hpICogc19sbyArIGRfbG8gKiBzX2hpKSArIChybG9fbG8gPj4gMTYpOwotCXJoaV9sbyA9IGRfaGkgKiBzX2hpICsgKHJsb19oaSA+PiAxNik7Ci0JKnJlc19sbyA9IChybG9faGkgPDwgMTYpIHwgKHJsb19sbyAmIDB4RkZGRik7Ci0JKnJlc19oaSA9IHJoaV9sbzsKLQlpZiAoZF9zaWduICE9IHNfc2lnbikgewotCQlkID0gfipyZXNfbG87Ci0JCXMgPSAoKChkICYgMHhGRkZGKSArIDEpID4+IDE2KSArIChkID4+IDE2KTsKLQkJKnJlc19sbyA9IH4qcmVzX2xvKzE7Ci0JCSpyZXNfaGkgPSB+KnJlc19oaSsocyA+PiAxNik7Ci0JCX0KLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIElNVUwgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGltdWxfbG9uZyh1MzIgcykKLXsKLQlpbXVsX2xvbmdfZGlyZWN0KCZNLng4Ni5SX0VBWCwmTS54ODYuUl9FRFgsTS54ODYuUl9FQVgscyk7Ci0JaWYgKCgoTS54ODYuUl9FQVggJiAweDgwMDAwMDAwKSA9PSAwICYmIE0ueDg2LlJfRURYID09IDB4MDApIHx8Ci0JCSgoTS54ODYuUl9FQVggJiAweDgwMDAwMDAwKSAhPSAwICYmIE0ueDg2LlJfRURYID09IDB4RkYpKSB7Ci0JCUNMRUFSX0ZMQUcoRl9DRik7Ci0JCUNMRUFSX0ZMQUcoRl9PRik7Ci0JfSBlbHNlIHsKLQkJU0VUX0ZMQUcoRl9DRik7Ci0JCVNFVF9GTEFHKEZfT0YpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBNVUwgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIG11bF9ieXRlKHU4IHMpCi17Ci0JdTE2IHJlcyA9ICh1MTYpKE0ueDg2LlJfQUwgKiBzKTsKLQotCU0ueDg2LlJfQVggPSByZXM7Ci0JaWYgKE0ueDg2LlJfQUggPT0gMCkgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotCX0gZWxzZSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgTVVMIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBtdWxfd29yZCh1MTYgcykKLXsKLQl1MzIgcmVzID0gTS54ODYuUl9BWCAqIHM7Ci0KLQlNLng4Ni5SX0FYID0gKHUxNilyZXM7Ci0JTS54ODYuUl9EWCA9ICh1MTYpKHJlcyA+PiAxNik7Ci0JaWYgKE0ueDg2LlJfRFggPT0gMCkgewotCQlDTEVBUl9GTEFHKEZfQ0YpOwotCQlDTEVBUl9GTEFHKEZfT0YpOwotICAgIH0gZWxzZSB7Ci0JCVNFVF9GTEFHKEZfQ0YpOwotCQlTRVRfRkxBRyhGX09GKTsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgTVVMIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBtdWxfbG9uZyh1MzIgcykKLXsKLSNpZmRlZglfX0hBU19MT05HX0xPTkdfXwotCXU2NCByZXMgPSAodTMyKU0ueDg2LlJfRUFYICogKHUzMilzOwotCi0JTS54ODYuUl9FQVggPSAodTMyKXJlczsKLQlNLng4Ni5SX0VEWCA9ICh1MzIpKHJlcyA+PiAzMik7Ci0jZWxzZQotCXUzMglhLGFfbG8sYV9oaTsKLQl1MzIJc19sbyxzX2hpOwotCXUzMglybG9fbG8scmxvX2hpLHJoaV9sbzsKLQotCWEgPSBNLng4Ni5SX0VBWDsKLQlhX2xvID0gYSAmIDB4RkZGRjsKLQlhX2hpID0gYSA+PiAxNjsKLQlzX2xvID0gcyAmIDB4RkZGRjsKLQlzX2hpID0gcyA+PiAxNjsKLQlybG9fbG8gPSBhX2xvICogc19sbzsKLQlybG9faGkgPSAoYV9oaSAqIHNfbG8gKyBhX2xvICogc19oaSkgKyAocmxvX2xvID4+IDE2KTsKLQlyaGlfbG8gPSBhX2hpICogc19oaSArIChybG9faGkgPj4gMTYpOwotCU0ueDg2LlJfRUFYID0gKHJsb19oaSA8PCAxNikgfCAocmxvX2xvICYgMHhGRkZGKTsKLQlNLng4Ni5SX0VEWCA9IHJoaV9sbzsKLSNlbmRpZgotCi0JaWYgKE0ueDg2LlJfRURYID09IDApIHsKLQkJQ0xFQVJfRkxBRyhGX0NGKTsKLQkJQ0xFQVJfRkxBRyhGX09GKTsKLQl9IGVsc2UgewotCQlTRVRfRkxBRyhGX0NGKTsKLQkJU0VUX0ZMQUcoRl9PRik7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIElESVYgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGlkaXZfYnl0ZSh1OCBzKQotewotICAgIHMzMiBkdmQsIGRpdiwgbW9kOwotCi0JZHZkID0gKHMxNilNLng4Ni5SX0FYOwotCWlmIChzID09IDApIHsKLQkJeDg2ZW11X2ludHJfcmFpc2UoMCk7Ci0JcmV0dXJuOwotCX0KLQlkaXYgPSBkdmQgLyAoczgpczsKLQltb2QgPSBkdmQgJSAoczgpczsKLQlpZiAoYWJzKGRpdikgPiAweDdmKSB7Ci0JCXg4NmVtdV9pbnRyX3JhaXNlKDApOwotCQlyZXR1cm47Ci0JfQotCU0ueDg2LlJfQUwgPSAoczgpIGRpdjsKLQlNLng4Ni5SX0FIID0gKHM4KSBtb2Q7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgSURJViBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgaWRpdl93b3JkKHUxNiBzKQotewotCXMzMiBkdmQsIGRpdiwgbW9kOwotCi0JZHZkID0gKCgoczMyKU0ueDg2LlJfRFgpIDw8IDE2KSB8IE0ueDg2LlJfQVg7Ci0JaWYgKHMgPT0gMCkgewotCQl4ODZlbXVfaW50cl9yYWlzZSgwKTsKLQkJcmV0dXJuOwotCX0KLQlkaXYgPSBkdmQgLyAoczE2KXM7Ci0JbW9kID0gZHZkICUgKHMxNilzOwotCWlmIChhYnMoZGl2KSA+IDB4N2ZmZikgewotCQl4ODZlbXVfaW50cl9yYWlzZSgwKTsKLQkJcmV0dXJuOwotCX0KLQlDTEVBUl9GTEFHKEZfQ0YpOwotCUNMRUFSX0ZMQUcoRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoZGl2ID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShtb2QgJiAweGZmKSwgRl9QRik7Ci0KLQlNLng4Ni5SX0FYID0gKHUxNilkaXY7Ci0JTS54ODYuUl9EWCA9ICh1MTYpbW9kOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIElESVYgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGlkaXZfbG9uZyh1MzIgcykKLXsKLSNpZmRlZglfX0hBU19MT05HX0xPTkdfXwotCXM2NCBkdmQsIGRpdiwgbW9kOwotCi0JZHZkID0gKCgoczY0KU0ueDg2LlJfRURYKSA8PCAzMikgfCBNLng4Ni5SX0VBWDsKLQlpZiAocyA9PSAwKSB7Ci0JCXg4NmVtdV9pbnRyX3JhaXNlKDApOwotCQlyZXR1cm47Ci0JfQotCWRpdiA9IGR2ZCAvIChzMzIpczsKLQltb2QgPSBkdmQgJSAoczMyKXM7Ci0JaWYgKGFicyhkaXYpID4gMHg3ZmZmZmZmZikgewotCQl4ODZlbXVfaW50cl9yYWlzZSgwKTsKLQkJcmV0dXJuOwotCX0KLSNlbHNlCi0JczMyIGRpdiA9IDAsIG1vZDsKLQlzMzIgaF9kdmQgPSBNLng4Ni5SX0VEWDsKLQl1MzIgbF9kdmQgPSBNLng4Ni5SX0VBWDsKLQl1MzIgYWJzX3MgPSBzICYgMHg3RkZGRkZGRjsKLQl1MzIgYWJzX2hfZHZkID0gaF9kdmQgJiAweDdGRkZGRkZGOwotCXUzMiBoX3MgPSBhYnNfcyA+PiAxOwotCXUzMiBsX3MgPSBhYnNfcyA8PCAzMTsKLQlpbnQgY291bnRlciA9IDMxOwotCWludCBjYXJyeTsKLQotCWlmIChzID09IDApIHsKLQkJeDg2ZW11X2ludHJfcmFpc2UoMCk7Ci0JCXJldHVybjsKLQl9Ci0JZG8gewotCQlkaXYgPDw9IDE7Ci0JCWNhcnJ5ID0gKGxfZHZkID49IGxfcykgPyAwIDogMTsKLQotCQlpZiAoYWJzX2hfZHZkIDwgKGhfcyArIGNhcnJ5KSkgewotCQkJaF9zID4+PSAxOwotCQkJbF9zID0gYWJzX3MgPDwgKC0tY291bnRlcik7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIHsKLQkJCWFic19oX2R2ZCAtPSAoaF9zICsgY2FycnkpOwotCQkJbF9kdmQgPSBjYXJyeSA/ICgoMHhGRkZGRkZGRiAtIGxfcykgKyBsX2R2ZCArIDEpCi0JCQkJOiAobF9kdmQgLSBsX3MpOwotCQkJaF9zID4+PSAxOwotCQkJbF9zID0gYWJzX3MgPDwgKC0tY291bnRlcik7Ci0JCQlkaXYgfD0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQl9IHdoaWxlIChjb3VudGVyID4gLTEpOwotCS8qIG92ZXJmbG93ICovCi0JaWYgKGFic19oX2R2ZCB8fCAobF9kdmQgPiBhYnNfcykpIHsKLQkJeDg2ZW11X2ludHJfcmFpc2UoMCk7Ci0JCXJldHVybjsKLQl9Ci0JLyogc2lnbiAqLwotCWRpdiB8PSAoKGhfZHZkICYgMHgxMDAwMDAwMCkgXiAocyAmIDB4MTAwMDAwMDApKTsKLQltb2QgPSBsX2R2ZDsKLQotI2VuZGlmCi0JQ0xFQVJfRkxBRyhGX0NGKTsKLQlDTEVBUl9GTEFHKEZfQUYpOwotCUNMRUFSX0ZMQUcoRl9TRik7Ci0JU0VUX0ZMQUcoRl9aRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoUEFSSVRZKG1vZCAmIDB4ZmYpLCBGX1BGKTsKLQotCU0ueDg2LlJfRUFYID0gKHUzMilkaXY7Ci0JTS54ODYuUl9FRFggPSAodTMyKW1vZDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1JbXBsZW1lbnRzIHRoZSBESVYgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGRpdl9ieXRlKHU4IHMpCi17Ci0JdTMyIGR2ZCwgZGl2LCBtb2Q7Ci0KLQlkdmQgPSBNLng4Ni5SX0FYOwotICAgIGlmIChzID09IDApIHsKLQkJeDg2ZW11X2ludHJfcmFpc2UoMCk7Ci0JcmV0dXJuOwotICAgIH0KLQlkaXYgPSBkdmQgLyAodTgpczsKLQltb2QgPSBkdmQgJSAodTgpczsKLQlpZiAoYWJzKGRpdikgPiAweGZmKSB7Ci0JCXg4NmVtdV9pbnRyX3JhaXNlKDApOwotCXJldHVybjsKLQl9Ci0JTS54ODYuUl9BTCA9ICh1OClkaXY7Ci0JTS54ODYuUl9BSCA9ICh1OCltb2Q7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgRElWIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBkaXZfd29yZCh1MTYgcykKLXsKLQl1MzIgZHZkLCBkaXYsIG1vZDsKLQotCWR2ZCA9ICgoKHUzMilNLng4Ni5SX0RYKSA8PCAxNikgfCBNLng4Ni5SX0FYOwotCWlmIChzID09IDApIHsKLQkJeDg2ZW11X2ludHJfcmFpc2UoMCk7Ci0JcmV0dXJuOwotICAgIH0KLQlkaXYgPSBkdmQgLyAodTE2KXM7Ci0JbW9kID0gZHZkICUgKHUxNilzOwotCWlmIChhYnMoZGl2KSA+IDB4ZmZmZikgewotCQl4ODZlbXVfaW50cl9yYWlzZSgwKTsKLQkJcmV0dXJuOwotCX0KLQlDTEVBUl9GTEFHKEZfQ0YpOwotCUNMRUFSX0ZMQUcoRl9TRik7Ci0JQ09ORElUSU9OQUxfU0VUX0ZMQUcoZGl2ID09IDAsIEZfWkYpOwotCUNPTkRJVElPTkFMX1NFVF9GTEFHKFBBUklUWShtb2QgJiAweGZmKSwgRl9QRik7Ci0KLQlNLng4Ni5SX0FYID0gKHUxNilkaXY7Ci0JTS54ODYuUl9EWCA9ICh1MTYpbW9kOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIERJViBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgZGl2X2xvbmcodTMyIHMpCi17Ci0jaWZkZWYJX19IQVNfTE9OR19MT05HX18KLQl1NjQgZHZkLCBkaXYsIG1vZDsKLQotCWR2ZCA9ICgoKHU2NClNLng4Ni5SX0VEWCkgPDwgMzIpIHwgTS54ODYuUl9FQVg7Ci0JaWYgKHMgPT0gMCkgewotCQl4ODZlbXVfaW50cl9yYWlzZSgwKTsKLQkJcmV0dXJuOwotCX0KLQlkaXYgPSBkdmQgLyAodTMyKXM7Ci0JbW9kID0gZHZkICUgKHUzMilzOwotCWlmIChhYnMoZGl2KSA+IDB4ZmZmZmZmZmYpIHsKLQkJeDg2ZW11X2ludHJfcmFpc2UoMCk7Ci0JCXJldHVybjsKLQl9Ci0jZWxzZQotCXMzMiBkaXYgPSAwLCBtb2Q7Ci0JczMyIGhfZHZkID0gTS54ODYuUl9FRFg7Ci0JdTMyIGxfZHZkID0gTS54ODYuUl9FQVg7Ci0KLQl1MzIgaF9zID0gczsKLQl1MzIgbF9zID0gMDsKLQlpbnQgY291bnRlciA9IDMyOwotCWludCBjYXJyeTsKLQotCWlmIChzID09IDApIHsKLQkJeDg2ZW11X2ludHJfcmFpc2UoMCk7Ci0JCXJldHVybjsKLQl9Ci0JZG8gewotCQlkaXYgPDw9IDE7Ci0JCWNhcnJ5ID0gKGxfZHZkID49IGxfcykgPyAwIDogMTsKLQotCQlpZiAoaF9kdmQgPCAoaF9zICsgY2FycnkpKSB7Ci0JCQloX3MgPj49IDE7Ci0JCQlsX3MgPSBzIDw8ICgtLWNvdW50ZXIpOwotCQkJY29udGludWU7Ci0JCX0gZWxzZSB7Ci0JCQloX2R2ZCAtPSAoaF9zICsgY2FycnkpOwotCQkJbF9kdmQgPSBjYXJyeSA/ICgoMHhGRkZGRkZGRiAtIGxfcykgKyBsX2R2ZCArIDEpCi0JCQkJOiAobF9kdmQgLSBsX3MpOwotCQkJaF9zID4+PSAxOwotCQkJbF9zID0gcyA8PCAoLS1jb3VudGVyKTsKLQkJCWRpdiB8PSAxOwotCQkJY29udGludWU7Ci0JCX0KLQotCX0gd2hpbGUgKGNvdW50ZXIgPiAtMSk7Ci0JLyogb3ZlcmZsb3cgKi8KLQlpZiAoaF9kdmQgfHwgKGxfZHZkID4gcykpIHsKLQkJeDg2ZW11X2ludHJfcmFpc2UoMCk7Ci0JCXJldHVybjsKLQl9Ci0JbW9kID0gbF9kdmQ7Ci0jZW5kaWYKLQlDTEVBUl9GTEFHKEZfQ0YpOwotCUNMRUFSX0ZMQUcoRl9BRik7Ci0JQ0xFQVJfRkxBRyhGX1NGKTsKLQlTRVRfRkxBRyhGX1pGKTsKLQlDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkobW9kICYgMHhmZiksIEZfUEYpOwotCi0JTS54ODYuUl9FQVggPSAodTMyKWRpdjsKLQlNLng4Ni5SX0VEWCA9ICh1MzIpbW9kOwotfQotCi0jZW5kaWYJLyogX19IQVZFX0lOTElORV9BU1NFTUJMRVJfXyAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLUltcGxlbWVudHMgdGhlIElOIHN0cmluZyBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgaW5zKGludCBzaXplKQotewotCWludCBpbmMgPSBzaXplOwotCi0JaWYgKEFDQ0VTU19GTEFHKEZfREYpKSB7Ci0JCWluYyA9IC1zaXplOwotCX0KLQlpZiAoTS54ODYubW9kZSAmIChTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpKSB7Ci0JLyogZG9udCBjYXJlIHdoZXRoZXIgUkVQRSBvciBSRVBORSAqLwotCS8qIGluIHVudGlsIENYIGlzIFpFUk8uICovCi0JCXUzMiBjb3VudCA9ICgoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpID8KLQkJCQkJIE0ueDg2LlJfRUNYIDogTS54ODYuUl9DWCk7Ci0Jc3dpdGNoIChzaXplKSB7Ci0JICBjYXNlIDE6Ci0JICAgIHdoaWxlIChjb3VudC0tKSB7Ci0JCQkJc3RvcmVfZGF0YV9ieXRlX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJLAotCQkJCQkJCQkJKCpzeXNfaW5iKShNLng4Ni5SX0RYKSk7Ci0JCQkJTS54ODYuUl9ESSArPSBpbmM7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMjoKLQkgICAgd2hpbGUgKGNvdW50LS0pIHsKLQkJCQlzdG9yZV9kYXRhX3dvcmRfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREksCi0JCQkJCQkJCQkoKnN5c19pbncpKE0ueDg2LlJfRFgpKTsKLQkJCQlNLng4Ni5SX0RJICs9IGluYzsKLQkgICAgfQotCSAgICBicmVhazsKLQkgIGNhc2UgNDoKLQkgICAgd2hpbGUgKGNvdW50LS0pIHsKLQkJCQlzdG9yZV9kYXRhX2xvbmdfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREksCi0JCQkJCQkJCQkoKnN5c19pbmwpKE0ueDg2LlJfRFgpKTsKLQkJCQlNLng4Ni5SX0RJICs9IGluYzsKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0JCU0ueDg2LlJfQ1ggPSAwOwotCQlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKLQkJCU0ueDg2LlJfRUNYID0gMDsKLQl9Ci0JCU0ueDg2Lm1vZGUgJj0gfihTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpOwotICAgIH0gZWxzZSB7Ci0Jc3dpdGNoIChzaXplKSB7Ci0JICBjYXNlIDE6Ci0JCQlzdG9yZV9kYXRhX2J5dGVfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREksCi0JCQkJCQkJCSgqc3lzX2luYikoTS54ODYuUl9EWCkpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMjoKLQkJCXN0b3JlX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwKLQkJCQkJCQkJKCpzeXNfaW53KShNLng4Ni5SX0RYKSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA0OgotCQkJc3RvcmVfZGF0YV9sb25nX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJLAotCQkJCQkJCQkoKnN5c19pbmwpKE0ueDg2LlJfRFgpKTsKLQkgICAgYnJlYWs7Ci0JfQotCQlNLng4Ni5SX0RJICs9IGluYzsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotSW1wbGVtZW50cyB0aGUgT1VUIHN0cmluZyBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgb3V0cyhpbnQgc2l6ZSkKLXsKLSAgICBpbnQgaW5jID0gc2l6ZTsKLQotCWlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgewotCWluYyA9IC1zaXplOwotICAgIH0KLQlpZiAoTS54ODYubW9kZSAmIChTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpKSB7Ci0JLyogZG9udCBjYXJlIHdoZXRoZXIgUkVQRSBvciBSRVBORSAqLwotCS8qIG91dCB1bnRpbCBDWCBpcyBaRVJPLiAqLwotCQl1MzIgY291bnQgPSAoKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSA/Ci0JCQkJCSBNLng4Ni5SX0VDWCA6IE0ueDg2LlJfQ1gpOwotCXN3aXRjaCAoc2l6ZSkgewotCSAgY2FzZSAxOgotCSAgICB3aGlsZSAoY291bnQtLSkgewotCQkJCSgqc3lzX291dGIpKE0ueDg2LlJfRFgsCi0JCQkJCQkgZmV0Y2hfZGF0YV9ieXRlX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX1NJKSk7Ci0JCQkJTS54ODYuUl9TSSArPSBpbmM7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMjoKLQkgICAgd2hpbGUgKGNvdW50LS0pIHsKLQkJCQkoKnN5c19vdXR3KShNLng4Ni5SX0RYLAotCQkJCQkJIGZldGNoX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9TSSkpOwotCQkJCU0ueDg2LlJfU0kgKz0gaW5jOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA0OgotCSAgICB3aGlsZSAoY291bnQtLSkgewotCQkJCSgqc3lzX291dGwpKE0ueDg2LlJfRFgsCi0JCQkJCQkgZmV0Y2hfZGF0YV9sb25nX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX1NJKSk7Ci0JCQkJTS54ODYuUl9TSSArPSBpbmM7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotCQlNLng4Ni5SX0NYID0gMDsKLQkJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7Ci0JCQlNLng4Ni5SX0VDWCA9IDA7Ci0JfQotCQlNLng4Ni5tb2RlICY9IH4oU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKTsKLSAgICB9IGVsc2UgewotCXN3aXRjaCAoc2l6ZSkgewotCSAgY2FzZSAxOgotCQkJKCpzeXNfb3V0YikoTS54ODYuUl9EWCwKLQkJCQkJIGZldGNoX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9TSSkpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMjoKLQkJCSgqc3lzX291dHcpKE0ueDg2LlJfRFgsCi0JCQkJCSBmZXRjaF9kYXRhX3dvcmRfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfU0kpKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDQ6Ci0JCQkoKnN5c19vdXRsKShNLng4Ni5SX0RYLAotCQkJCQkgZmV0Y2hfZGF0YV9sb25nX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX1NJKSk7Ci0JICAgIGJyZWFrOwotCX0KLQkJTS54ODYuUl9TSSArPSBpbmM7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWFkZHIJLSBBZGRyZXNzIHRvIGZldGNoIHdvcmQgZnJvbQotCi1SRU1BUktTOgotRmV0Y2hlcyBhIHdvcmQgZnJvbSBlbXVsYXRvciBtZW1vcnkgdXNpbmcgYW4gYWJzb2x1dGUgYWRkcmVzcy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgbWVtX2FjY2Vzc193b3JkKGludCBhZGRyKQotewotREIoCWlmIChDSEVDS19NRU1fQUNDRVNTKCkpCi0JICB4ODZlbXVfY2hlY2tfbWVtX2FjY2VzcyhhZGRyKTspCi0JcmV0dXJuICgqc3lzX3JkdykoYWRkcik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1SRU1BUktTOgotUHVzaGVzIGEgd29yZCBvbnRvIHRoZSBzdGFjay4KLQotTk9URTogRG8gbm90IGlubGluZSB0aGlzLCBhcyAoKnN5c193clgpIGlzIGFscmVhZHkgaW5saW5lIQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcHVzaF93b3JkKHUxNiB3KQotewotREIoCWlmIChDSEVDS19TUF9BQ0NFU1MoKSkKLQkgIHg4NmVtdV9jaGVja19zcF9hY2Nlc3MoKTspCi0JTS54ODYuUl9TUCAtPSAyOwotCSgqc3lzX3dydykoKCh1MzIpTS54ODYuUl9TUyA8PCA0KSAgKyBNLng4Ni5SX1NQLCB3KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVJFTUFSS1M6Ci1QdXNoZXMgYSBsb25nIG9udG8gdGhlIHN0YWNrLgotCi1OT1RFOiBEbyBub3QgaW5saW5lIHRoaXMsIGFzICgqc3lzX3dyWCkgaXMgYWxyZWFkeSBpbmxpbmUhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBwdXNoX2xvbmcodTMyIHcpCi17Ci1EQigJaWYgKENIRUNLX1NQX0FDQ0VTUygpKQotCSAgeDg2ZW11X2NoZWNrX3NwX2FjY2VzcygpOykKLQlNLng4Ni5SX1NQIC09IDQ7Ci0JKCpzeXNfd3JsKSgoKHUzMilNLng4Ni5SX1NTIDw8IDQpICArIE0ueDg2LlJfU1AsIHcpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVBvcHMgYSB3b3JkIGZyb20gdGhlIHN0YWNrLgotCi1OT1RFOiBEbyBub3QgaW5saW5lIHRoaXMsIGFzICgqc3lzX3JkWCkgaXMgYWxyZWFkeSBpbmxpbmUhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2IHBvcF93b3JkKHZvaWQpCi17Ci0JcmVnaXN0ZXIgdTE2IHJlczsKLQotREIoCWlmIChDSEVDS19TUF9BQ0NFU1MoKSkKLQkgIHg4NmVtdV9jaGVja19zcF9hY2Nlc3MoKTspCi0JcmVzID0gKCpzeXNfcmR3KSgoKHUzMilNLng4Ni5SX1NTIDw8IDQpICArIE0ueDg2LlJfU1ApOwotCU0ueDg2LlJfU1AgKz0gMjsKLQlyZXR1cm4gcmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNQVJLUzoKLVBvcHMgYSBsb25nIGZyb20gdGhlIHN0YWNrLgotCi1OT1RFOiBEbyBub3QgaW5saW5lIHRoaXMsIGFzICgqc3lzX3JkWCkgaXMgYWxyZWFkeSBpbmxpbmUhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIHBvcF9sb25nKHZvaWQpCi17Ci0gICAgcmVnaXN0ZXIgdTMyIHJlczsKLQotREIoCWlmIChDSEVDS19TUF9BQ0NFU1MoKSkKLQkgIHg4NmVtdV9jaGVja19zcF9hY2Nlc3MoKTspCi0JcmVzID0gKCpzeXNfcmRsKSgoKHUzMilNLng4Ni5SX1NTIDw8IDQpICArIE0ueDg2LlJfU1ApOwotCU0ueDg2LlJfU1AgKz0gNDsKLSAgICByZXR1cm4gcmVzOwotfQotCi0jaWZkZWYJX19IQVZFX0lOTElORV9BU1NFTUJMRVJfXwotCi11MTYgYWFhX3dvcmQgKHUxNiBkKQoteyByZXR1cm4gYWFhX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCk7IH0KLQotdTE2IGFhc193b3JkICh1MTYgZCkKLXsgcmV0dXJuIGFhc193b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQpOyB9Ci0KLXUxNiBhYWRfd29yZCAodTE2IGQpCi17IHJldHVybiBhYWRfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkKTsgfQotCi11MTYgYWFtX3dvcmQgKHU4IGQpCi17IHJldHVybiBhYW1fd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkKTsgfQotCi11OCBhZGNfYnl0ZSAodTggZCwgdTggcykKLXsgcmV0dXJuIGFkY19ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTE2IGFkY193b3JkICh1MTYgZCwgdTE2IHMpCi17IHJldHVybiBhZGNfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUzMiBhZGNfbG9uZyAodTMyIGQsIHUzMiBzKQoteyByZXR1cm4gYWRjX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11OCBhZGRfYnl0ZSAodTggZCwgdTggcykKLXsgcmV0dXJuIGFkZF9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTE2IGFkZF93b3JkICh1MTYgZCwgdTE2IHMpCi17IHJldHVybiBhZGRfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUzMiBhZGRfbG9uZyAodTMyIGQsIHUzMiBzKQoteyByZXR1cm4gYWRkX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11OCBhbmRfYnl0ZSAodTggZCwgdTggcykKLXsgcmV0dXJuIGFuZF9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTE2IGFuZF93b3JkICh1MTYgZCwgdTE2IHMpCi17IHJldHVybiBhbmRfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUzMiBhbmRfbG9uZyAodTMyIGQsIHUzMiBzKQoteyByZXR1cm4gYW5kX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11OCBjbXBfYnl0ZSAodTggZCwgdTggcykKLXsgcmV0dXJuIGNtcF9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTE2IGNtcF93b3JkICh1MTYgZCwgdTE2IHMpCi17IHJldHVybiBjbXBfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUzMiBjbXBfbG9uZyAodTMyIGQsIHUzMiBzKQoteyByZXR1cm4gY21wX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11OCBkYWFfYnl0ZSAodTggZCkKLXsgcmV0dXJuIGRhYV9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQpOyB9Ci0KLXU4IGRhc19ieXRlICh1OCBkKQoteyByZXR1cm4gZGFzX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCk7IH0KLQotdTggZGVjX2J5dGUgKHU4IGQpCi17IHJldHVybiBkZWNfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkKTsgfQotCi11MTYgZGVjX3dvcmQgKHUxNiBkKQoteyByZXR1cm4gZGVjX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCk7IH0KLQotdTMyIGRlY19sb25nICh1MzIgZCkKLXsgcmV0dXJuIGRlY19sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQpOyB9Ci0KLXU4IGluY19ieXRlICh1OCBkKQoteyByZXR1cm4gaW5jX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCk7IH0KLQotdTE2IGluY193b3JkICh1MTYgZCkKLXsgcmV0dXJuIGluY193b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQpOyB9Ci0KLXUzMiBpbmNfbG9uZyAodTMyIGQpCi17IHJldHVybiBpbmNfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkKTsgfQotCi11OCBvcl9ieXRlICh1OCBkLCB1OCBzKQoteyByZXR1cm4gb3JfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUxNiBvcl93b3JkICh1MTYgZCwgdTE2IHMpCi17IHJldHVybiBvcl93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTMyIG9yX2xvbmcgKHUzMiBkLCB1MzIgcykKLXsgcmV0dXJuIG9yX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11OCBuZWdfYnl0ZSAodTggcykKLXsgcmV0dXJuIG5lZ19ieXRlX2FzbSgmTS54ODYuUl9FRkxHLHMpOyB9Ci0KLXUxNiBuZWdfd29yZCAodTE2IHMpCi17IHJldHVybiBuZWdfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxzKTsgfQotCi11MzIgbmVnX2xvbmcgKHUzMiBzKQoteyByZXR1cm4gbmVnX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcscyk7IH0KLQotdTggbm90X2J5dGUgKHU4IHMpCi17IHJldHVybiBub3RfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxzKTsgfQotCi11MTYgbm90X3dvcmQgKHUxNiBzKQoteyByZXR1cm4gbm90X3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcscyk7IH0KLQotdTMyIG5vdF9sb25nICh1MzIgcykKLXsgcmV0dXJuIG5vdF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLHMpOyB9Ci0KLXU4IHJjbF9ieXRlICh1OCBkLCB1OCBzKQoteyByZXR1cm4gcmNsX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MTYgcmNsX3dvcmQgKHUxNiBkLCB1OCBzKQoteyByZXR1cm4gcmNsX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MzIgcmNsX2xvbmcgKHUzMiBkLCB1OCBzKQoteyByZXR1cm4gcmNsX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11OCByY3JfYnl0ZSAodTggZCwgdTggcykKLXsgcmV0dXJuIHJjcl9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTE2IHJjcl93b3JkICh1MTYgZCwgdTggcykKLXsgcmV0dXJuIHJjcl93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTMyIHJjcl9sb25nICh1MzIgZCwgdTggcykKLXsgcmV0dXJuIHJjcl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTggcm9sX2J5dGUgKHU4IGQsIHU4IHMpCi17IHJldHVybiByb2xfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUxNiByb2xfd29yZCAodTE2IGQsIHU4IHMpCi17IHJldHVybiByb2xfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUzMiByb2xfbG9uZyAodTMyIGQsIHU4IHMpCi17IHJldHVybiByb2xfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXU4IHJvcl9ieXRlICh1OCBkLCB1OCBzKQoteyByZXR1cm4gcm9yX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MTYgcm9yX3dvcmQgKHUxNiBkLCB1OCBzKQoteyByZXR1cm4gcm9yX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MzIgcm9yX2xvbmcgKHUzMiBkLCB1OCBzKQoteyByZXR1cm4gcm9yX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11OCBzaGxfYnl0ZSAodTggZCwgdTggcykKLXsgcmV0dXJuIHNobF9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTE2IHNobF93b3JkICh1MTYgZCwgdTggcykKLXsgcmV0dXJuIHNobF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTMyIHNobF9sb25nICh1MzIgZCwgdTggcykKLXsgcmV0dXJuIHNobF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTggc2hyX2J5dGUgKHU4IGQsIHU4IHMpCi17IHJldHVybiBzaHJfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUxNiBzaHJfd29yZCAodTE2IGQsIHU4IHMpCi17IHJldHVybiBzaHJfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUzMiBzaHJfbG9uZyAodTMyIGQsIHU4IHMpCi17IHJldHVybiBzaHJfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXU4IHNhcl9ieXRlICh1OCBkLCB1OCBzKQoteyByZXR1cm4gc2FyX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MTYgc2FyX3dvcmQgKHUxNiBkLCB1OCBzKQoteyByZXR1cm4gc2FyX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MzIgc2FyX2xvbmcgKHUzMiBkLCB1OCBzKQoteyByZXR1cm4gc2FyX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MTYgc2hsZF93b3JkICh1MTYgZCwgdTE2IGZpbGwsIHU4IHMpCi17IHJldHVybiBzaGxkX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxmaWxsLHMpOyB9Ci0KLXUzMiBzaGxkX2xvbmcgKHUzMiBkLCB1MzIgZmlsbCwgdTggcykKLXsgcmV0dXJuIHNobGRfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLGZpbGwscyk7IH0KLQotdTE2IHNocmRfd29yZCAodTE2IGQsIHUxNiBmaWxsLCB1OCBzKQoteyByZXR1cm4gc2hyZF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQsZmlsbCxzKTsgfQotCi11MzIgc2hyZF9sb25nICh1MzIgZCwgdTMyIGZpbGwsIHU4IHMpCi17IHJldHVybiBzaHJkX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxmaWxsLHMpOyB9Ci0KLXU4IHNiYl9ieXRlICh1OCBkLCB1OCBzKQoteyByZXR1cm4gc2JiX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MTYgc2JiX3dvcmQgKHUxNiBkLCB1MTYgcykKLXsgcmV0dXJuIHNiYl93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTMyIHNiYl9sb25nICh1MzIgZCwgdTMyIHMpCi17IHJldHVybiBzYmJfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXU4IHN1Yl9ieXRlICh1OCBkLCB1OCBzKQoteyByZXR1cm4gc3ViX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11MTYgc3ViX3dvcmQgKHUxNiBkLCB1MTYgcykKLXsgcmV0dXJuIHN1Yl93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTMyIHN1Yl9sb25nICh1MzIgZCwgdTMyIHMpCi17IHJldHVybiBzdWJfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXZvaWQgdGVzdF9ieXRlICh1OCBkLCB1OCBzKQoteyB0ZXN0X2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi12b2lkIHRlc3Rfd29yZCAodTE2IGQsIHUxNiBzKQoteyB0ZXN0X3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi12b2lkIHRlc3RfbG9uZyAodTMyIGQsIHUzMiBzKQoteyB0ZXN0X2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi11OCB4b3JfYnl0ZSAodTggZCwgdTggcykKLXsgcmV0dXJuIHhvcl9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscyk7IH0KLQotdTE2IHhvcl93b3JkICh1MTYgZCwgdTE2IHMpCi17IHJldHVybiB4b3Jfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpOyB9Ci0KLXUzMiB4b3JfbG9uZyAodTMyIGQsIHUzMiBzKQoteyByZXR1cm4geG9yX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKTsgfQotCi12b2lkIGltdWxfYnl0ZSAodTggcykKLXsgaW11bF9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0FYLE0ueDg2LlJfQUwscyk7IH0KLQotdm9pZCBpbXVsX3dvcmQgKHUxNiBzKQoteyBpbXVsX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfQVgsJk0ueDg2LlJfRFgsTS54ODYuUl9BWCxzKTsgfQotCi12b2lkIGltdWxfbG9uZyAodTMyIHMpCi17IGltdWxfbG9uZ19hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9FQVgsJk0ueDg2LlJfRURYLE0ueDg2LlJfRUFYLHMpOyB9Ci0KLXZvaWQgaW11bF9sb25nX2RpcmVjdCh1MzIgKnJlc19sbywgdTMyKiByZXNfaGksdTMyIGQsIHUzMiBzKQoteyBpbXVsX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcscmVzX2xvLHJlc19oaSxkLHMpOyB9Ci0KLXZvaWQgbXVsX2J5dGUgKHU4IHMpCi17IG11bF9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0FYLE0ueDg2LlJfQUwscyk7IH0KLQotdm9pZCBtdWxfd29yZCAodTE2IHMpCi17IG11bF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0FYLCZNLng4Ni5SX0RYLE0ueDg2LlJfQVgscyk7IH0KLQotdm9pZCBtdWxfbG9uZyAodTMyIHMpCi17IG11bF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0VBWCwmTS54ODYuUl9FRFgsTS54ODYuUl9FQVgscyk7IH0KLQotdm9pZCBpZGl2X2J5dGUgKHU4IHMpCi17IGlkaXZfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9BTCwmTS54ODYuUl9BSCxNLng4Ni5SX0FYLHMpOyB9Ci0KLXZvaWQgaWRpdl93b3JkICh1MTYgcykKLXsgaWRpdl93b3JkX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0FYLCZNLng4Ni5SX0RYLE0ueDg2LlJfQVgsTS54ODYuUl9EWCxzKTsgfQotCi12b2lkIGlkaXZfbG9uZyAodTMyIHMpCi17IGlkaXZfbG9uZ19hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9FQVgsJk0ueDg2LlJfRURYLE0ueDg2LlJfRUFYLE0ueDg2LlJfRURYLHMpOyB9Ci0KLXZvaWQgZGl2X2J5dGUgKHU4IHMpCi17IGRpdl9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0FMLCZNLng4Ni5SX0FILE0ueDg2LlJfQVgscyk7IH0KLQotdm9pZCBkaXZfd29yZCAodTE2IHMpCi17IGRpdl93b3JkX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0FYLCZNLng4Ni5SX0RYLE0ueDg2LlJfQVgsTS54ODYuUl9EWCxzKTsgfQotCi12b2lkIGRpdl9sb25nICh1MzIgcykKLXsgZGl2X2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfRUFYLCZNLng4Ni5SX0VEWCxNLng4Ni5SX0VBWCxNLng4Ni5SX0VEWCxzKTsgfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9zeXMuYyBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS9zeXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZlNThmOC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUvc3lzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSoJCQkJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotKgotKiAgICAgICAgICAgIAlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qIAkJCQkgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKLSogCQkJCQkgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOgkJQU5TSSBDCi0qIEVudmlyb25tZW50OglBbnkKLSogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKLSoKLSogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgaW5jbHVkZXMgc3Vicm91dGluZXMgd2hpY2ggYXJlIHJlbGF0ZWQgdG8KLSoJCQkJcHJvZ3JhbW1lZCBJL08gYW5kIG1lbW9yeSBhY2Nlc3MuIEluY2x1ZGVkIGluIHRoaXMgbW9kdWxlCi0qCQkJCWFyZSBkZWZhdWx0IGZ1bmN0aW9ucyB3aXRoIGxpbWl0ZWQgdXNlZnVsbmVzcy4gRm9yIHJlYWwKLSoJCQkJdXNlcyB0aGVzZSBmdW5jdGlvbnMgd2lsbCBtb3N0IGxpa2VseSBiZSBvdmVycmlkZW4gYnkgdGhlCi0qCQkJCXVzZXIgbGlicmFyeS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJ4ODZlbXUuaCIKLSNpbmNsdWRlICJ4ODZlbXUvcmVncy5oIgotI2luY2x1ZGUgIng4NmVtdS9kZWJ1Zy5oIgotI2luY2x1ZGUgIng4NmVtdS9wcmltX29wcy5oIgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1YODZFTVVfc3lzRW52CQlfWDg2RU1VX2VudjsJCS8qIEdsb2JhbCBlbXVsYXRvciBtYWNoaW5lIHN0YXRlICovCi1YODZFTVVfaW50ckZ1bmNzCV9YODZFTVVfaW50clRhYlsyNTZdOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmZGVmIF9fYWxwaGFfXwotLyogdG8gY29wZSB3aXRoIGJyb2tlbiBlZ2NzLTEuMS4yIDotKCgoKCAqLwotCi0vKgotICogaW5saW5lIGZ1bmN0aW9ucyB0byBkbyB1bmFsaWduZWQgYWNjZXNzZXMKLSAqIGZyb20gbGludXgvaW5jbHVkZS9hc20tYWxwaGEvdW5hbGlnbmVkLmgKLSAqLwotCi0vKgotICogRUdDUyAxLjEga25vd3MgYWJvdXQgYXJiaXRyYXJ5IHVuYWxpZ25lZCBsb2Fkcy4gIERlZmluZSBzb21lCi0gKiBwYWNrZWQgc3RydWN0dXJlcyB0byB0YWxrIGFib3V0IHN1Y2ggdGhpbmdzIHdpdGguCi0gKi8KLQotI2lmIF9fR05VQ19fID4gMiB8fCBfX0dOVUNfTUlOT1JfXyA+PSA5MQotc3RydWN0IF9fdW5hX3U2NCB7IHVuc2lnbmVkIGxvbmcgIHggX19hdHRyaWJ1dGVfXygocGFja2VkKSk7IH07Ci1zdHJ1Y3QgX191bmFfdTMyIHsgdW5zaWduZWQgaW50ICAgeCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsgfTsKLXN0cnVjdCBfX3VuYV91MTYgeyB1bnNpZ25lZCBzaG9ydCB4IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOyB9OwotI2VuZGlmCi0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgbGRxX3UodW5zaWduZWQgbG9uZyAqIHIxMSkKLXsKLSNpZiBfX0dOVUNfXyA+IDIgfHwgX19HTlVDX01JTk9SX18gPj0gOTEKLQljb25zdCBzdHJ1Y3QgX191bmFfdTY0ICpwdHIgPSAoY29uc3Qgc3RydWN0IF9fdW5hX3U2NCAqKSByMTE7Ci0JcmV0dXJuIHB0ci0+eDsKLSNlbHNlCi0JdW5zaWduZWQgbG9uZyByMSxyMjsKLQlfX2FzbV9fKCJsZHFfdSAlMCwlM1xuXHQiCi0JCSJsZHFfdSAlMSwlNFxuXHQiCi0JCSJleHRxbCAlMCwlMiwlMFxuXHQiCi0JCSJleHRxaCAlMSwlMiwlMSIKLQkJOiI9JnIiIChyMSksICI9JnIiIChyMikKLQkJOiJyIiAocjExKSwKLQkJICJtIiAoKnIxMSksCi0JCSAibSIgKCooY29uc3QgdW5zaWduZWQgbG9uZyAqKSg3KyhjaGFyICopIHIxMSkpKTsKLQlyZXR1cm4gcjEgfCByMjsKLSNlbmRpZgotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIGxkbF91KHVuc2lnbmVkIGludCAqIHIxMSkKLXsKLSNpZiBfX0dOVUNfXyA+IDIgfHwgX19HTlVDX01JTk9SX18gPj0gOTEKLQljb25zdCBzdHJ1Y3QgX191bmFfdTMyICpwdHIgPSAoY29uc3Qgc3RydWN0IF9fdW5hX3UzMiAqKSByMTE7Ci0JcmV0dXJuIHB0ci0+eDsKLSNlbHNlCi0JdW5zaWduZWQgbG9uZyByMSxyMjsKLQlfX2FzbV9fKCJsZHFfdSAlMCwlM1xuXHQiCi0JCSJsZHFfdSAlMSwlNFxuXHQiCi0JCSJleHRsbCAlMCwlMiwlMFxuXHQiCi0JCSJleHRsaCAlMSwlMiwlMSIKLQkJOiI9JnIiIChyMSksICI9JnIiIChyMikKLQkJOiJyIiAocjExKSwKLQkJICJtIiAoKnIxMSksCi0JCSAibSIgKCooY29uc3QgdW5zaWduZWQgbG9uZyAqKSgzKyhjaGFyICopIHIxMSkpKTsKLQlyZXR1cm4gcjEgfCByMjsKLSNlbmRpZgotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIGxkd191KHVuc2lnbmVkIHNob3J0ICogcjExKQotewotI2lmIF9fR05VQ19fID4gMiB8fCBfX0dOVUNfTUlOT1JfXyA+PSA5MQotCWNvbnN0IHN0cnVjdCBfX3VuYV91MTYgKnB0ciA9IChjb25zdCBzdHJ1Y3QgX191bmFfdTE2ICopIHIxMTsKLQlyZXR1cm4gcHRyLT54OwotI2Vsc2UKLQl1bnNpZ25lZCBsb25nIHIxLHIyOwotCV9fYXNtX18oImxkcV91ICUwLCUzXG5cdCIKLQkJImxkcV91ICUxLCU0XG5cdCIKLQkJImV4dHdsICUwLCUyLCUwXG5cdCIKLQkJImV4dHdoICUxLCUyLCUxIgotCQk6Ij0mciIgKHIxKSwgIj0mciIgKHIyKQotCQk6InIiIChyMTEpLAotCQkgIm0iICgqcjExKSwKLQkJICJtIiAoKihjb25zdCB1bnNpZ25lZCBsb25nICopKDErKGNoYXIgKikgcjExKSkpOwotCXJldHVybiByMSB8IHIyOwotI2VuZGlmCi19Ci0KLS8qCi0gKiBFbGVtZW50YWwgdW5hbGlnbmVkIHN0b3JlcwotICovCi0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgc3RxX3UodW5zaWduZWQgbG9uZyByNSwgdW5zaWduZWQgbG9uZyAqIHIxMSkKLXsKLSNpZiBfX0dOVUNfXyA+IDIgfHwgX19HTlVDX01JTk9SX18gPj0gOTEKLQlzdHJ1Y3QgX191bmFfdTY0ICpwdHIgPSAoc3RydWN0IF9fdW5hX3U2NCAqKSByMTE7Ci0JcHRyLT54ID0gcjU7Ci0jZWxzZQotCXVuc2lnbmVkIGxvbmcgcjEscjIscjMscjQ7Ci0KLQlfX2FzbV9fKCJsZHFfdSAlMywlMVxuXHQiCi0JCSJsZHFfdSAlMiwlMFxuXHQiCi0JCSJpbnNxaCAlNiwlNywlNVxuXHQiCi0JCSJpbnNxbCAlNiwlNywlNFxuXHQiCi0JCSJtc2txaCAlMywlNywlM1xuXHQiCi0JCSJtc2txbCAlMiwlNywlMlxuXHQiCi0JCSJiaXMgJTMsJTUsJTNcblx0IgotCQkiYmlzICUyLCU0LCUyXG5cdCIKLQkJInN0cV91ICUzLCUxXG5cdCIKLQkJInN0cV91ICUyLCUwIgotCQk6Ij1tIiAoKnIxMSksCi0JCSAiPW0iICgqKHVuc2lnbmVkIGxvbmcgKikoNysoY2hhciAqKSByMTEpKSwKLQkJICI9JnIiIChyMSksICI9JnIiIChyMiksICI9JnIiIChyMyksICI9JnIiIChyNCkKLQkJOiJyIiAocjUpLCAiciIgKHIxMSkpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgc3RsX3UodW5zaWduZWQgbG9uZyByNSwgdW5zaWduZWQgaW50ICogcjExKQotewotI2lmIF9fR05VQ19fID4gMiB8fCBfX0dOVUNfTUlOT1JfXyA+PSA5MQotCXN0cnVjdCBfX3VuYV91MzIgKnB0ciA9IChzdHJ1Y3QgX191bmFfdTMyICopIHIxMTsKLQlwdHItPnggPSByNTsKLSNlbHNlCi0JdW5zaWduZWQgbG9uZyByMSxyMixyMyxyNDsKLQotCV9fYXNtX18oImxkcV91ICUzLCUxXG5cdCIKLQkJImxkcV91ICUyLCUwXG5cdCIKLQkJImluc2xoICU2LCU3LCU1XG5cdCIKLQkJImluc2xsICU2LCU3LCU0XG5cdCIKLQkJIm1za2xoICUzLCU3LCUzXG5cdCIKLQkJIm1za2xsICUyLCU3LCUyXG5cdCIKLQkJImJpcyAlMywlNSwlM1xuXHQiCi0JCSJiaXMgJTIsJTQsJTJcblx0IgotCQkic3RxX3UgJTMsJTFcblx0IgotCQkic3RxX3UgJTIsJTAiCi0JCToiPW0iICgqcjExKSwKLQkJICI9bSIgKCoodW5zaWduZWQgbG9uZyAqKSgzKyhjaGFyICopIHIxMSkpLAotCQkgIj0mciIgKHIxKSwgIj0mciIgKHIyKSwgIj0mciIgKHIzKSwgIj0mciIgKHI0KQotCQk6InIiIChyNSksICJyIiAocjExKSk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBzdHdfdSh1bnNpZ25lZCBsb25nIHI1LCB1bnNpZ25lZCBzaG9ydCAqIHIxMSkKLXsKLSNpZiBfX0dOVUNfXyA+IDIgfHwgX19HTlVDX01JTk9SX18gPj0gOTEKLQlzdHJ1Y3QgX191bmFfdTE2ICpwdHIgPSAoc3RydWN0IF9fdW5hX3UxNiAqKSByMTE7Ci0JcHRyLT54ID0gcjU7Ci0jZWxzZQotCXVuc2lnbmVkIGxvbmcgcjEscjIscjMscjQ7Ci0KLQlfX2FzbV9fKCJsZHFfdSAlMywlMVxuXHQiCi0JCSJsZHFfdSAlMiwlMFxuXHQiCi0JCSJpbnN3aCAlNiwlNywlNVxuXHQiCi0JCSJpbnN3bCAlNiwlNywlNFxuXHQiCi0JCSJtc2t3aCAlMywlNywlM1xuXHQiCi0JCSJtc2t3bCAlMiwlNywlMlxuXHQiCi0JCSJiaXMgJTMsJTUsJTNcblx0IgotCQkiYmlzICUyLCU0LCUyXG5cdCIKLQkJInN0cV91ICUzLCUxXG5cdCIKLQkJInN0cV91ICUyLCUwIgotCQk6Ij1tIiAoKnIxMSksCi0JCSAiPW0iICgqKHVuc2lnbmVkIGxvbmcgKikoMSsoY2hhciAqKSByMTEpKSwKLQkJICI9JnIiIChyMSksICI9JnIiIChyMiksICI9JnIiIChyMyksICI9JnIiIChyNCkKLQkJOiJyIiAocjUpLCAiciIgKHIxMSkpOwotI2VuZGlmCi19Ci0KLSNlbGlmIGRlZmluZWQgKF9faWE2NF9fKQotLyoKLSAqIEVHQ1MgMS4xIGtub3dzIGFib3V0IGFyYml0cmFyeSB1bmFsaWduZWQgbG9hZHMuICBEZWZpbmUgc29tZQotICogcGFja2VkIHN0cnVjdHVyZXMgdG8gdGFsayBhYm91dCBzdWNoIHRoaW5ncyB3aXRoLgotICovCi1zdHJ1Y3QgX191bmFfdTY0IHsgdW5zaWduZWQgbG9uZyAgeCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsgfTsKLXN0cnVjdCBfX3VuYV91MzIgeyB1bnNpZ25lZCBpbnQgICB4IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOyB9Owotc3RydWN0IF9fdW5hX3UxNiB7IHVuc2lnbmVkIHNob3J0IHggX19hdHRyaWJ1dGVfXygocGFja2VkKSk7IH07Ci0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcKLV9fdWxkcSAoY29uc3QgdW5zaWduZWQgbG9uZyAqIHIxMSkKLXsKLQljb25zdCBzdHJ1Y3QgX191bmFfdTY0ICpwdHIgPSAoY29uc3Qgc3RydWN0IF9fdW5hX3U2NCAqKSByMTE7Ci0JcmV0dXJuIHB0ci0+eDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZwotdWxkbCAoY29uc3QgdW5zaWduZWQgaW50ICogcjExKQotewotCWNvbnN0IHN0cnVjdCBfX3VuYV91MzIgKnB0ciA9IChjb25zdCBzdHJ1Y3QgX191bmFfdTMyICopIHIxMTsKLQlyZXR1cm4gcHRyLT54OwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nCi11bGR3IChjb25zdCB1bnNpZ25lZCBzaG9ydCAqIHIxMSkKLXsKLQljb25zdCBzdHJ1Y3QgX191bmFfdTE2ICpwdHIgPSAoY29uc3Qgc3RydWN0IF9fdW5hX3UxNiAqKSByMTE7Ci0JcmV0dXJuIHB0ci0+eDsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZAotdXN0cSAodW5zaWduZWQgbG9uZyByNSwgdW5zaWduZWQgbG9uZyAqIHIxMSkKLXsKLQlzdHJ1Y3QgX191bmFfdTY0ICpwdHIgPSAoc3RydWN0IF9fdW5hX3U2NCAqKSByMTE7Ci0JcHRyLT54ID0gcjU7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQKLXVzdGwgKHVuc2lnbmVkIGxvbmcgcjUsIHVuc2lnbmVkIGludCAqIHIxMSkKLXsKLQlzdHJ1Y3QgX191bmFfdTMyICpwdHIgPSAoc3RydWN0IF9fdW5hX3UzMiAqKSByMTE7Ci0JcHRyLT54ID0gcjU7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQKLXVzdHcgKHVuc2lnbmVkIGxvbmcgcjUsIHVuc2lnbmVkIHNob3J0ICogcjExKQotewotCXN0cnVjdCBfX3VuYV91MTYgKnB0ciA9IChzdHJ1Y3QgX191bmFfdTE2ICopIHIxMTsKLQlwdHItPnggPSByNTsKLX0KLQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYWRkcgktIEVtdWxhdG9yIG1lbW9yeSBhZGRyZXNzIHRvIHJlYWQKLQotUkVUVVJOUzoKLUJ5dGUgdmFsdWUgcmVhZCBmcm9tIGVtdWxhdG9yIG1lbW9yeS4KLQotUkVNQVJLUzoKLVJlYWRzIGEgYnl0ZSB2YWx1ZSBmcm9tIHRoZSBlbXVsYXRvciBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggWDg2QVBJIHJkYigKLSAgICB1MzIgYWRkcikKLXsKLQl1OCB2YWw7Ci0KLQlpZiAoYWRkciA+IE0ubWVtX3NpemUgLSAxKSB7Ci0JCURCKHByaW50aygibWVtX3JlYWQ6IGFkZHJlc3MgJSNseCBvdXQgb2YgcmFuZ2UhXG4iLCBhZGRyKTspCi0JCUhBTFRfU1lTKCk7Ci0JCX0KLQl2YWwgPSAqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIpOwotREIoCWlmIChERUJVR19NRU1fVFJBQ0UoKSkKLQkJcHJpbnRrKCIlIzA4eCAxIC0+ICUjeFxuIiwgYWRkciwgdmFsKTspCi0JcmV0dXJuIHZhbDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1hZGRyCS0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAotCi1SRVRVUk5TOgotV29yZCB2YWx1ZSByZWFkIGZyb20gZW11bGF0b3IgbWVtb3J5LgotCi1SRU1BUktTOgotUmVhZHMgYSB3b3JkIHZhbHVlIGZyb20gdGhlIGVtdWxhdG9yIG1lbW9yeS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MTYgWDg2QVBJIHJkdygKLQl1MzIgYWRkcikKLXsKLQl1MTYgdmFsID0gMDsKLQotCWlmIChhZGRyID4gTS5tZW1fc2l6ZSAtIDIpIHsKLQkJREIocHJpbnRrKCJtZW1fcmVhZDogYWRkcmVzcyAlI2x4IG91dCBvZiByYW5nZSFcbiIsIGFkZHIpOykKLQkJSEFMVF9TWVMoKTsKLQkJfQotI2lmZGVmIF9fQklHX0VORElBTl9fCi0JaWYgKGFkZHIgJiAweDEpIHsKLQkJdmFsID0gKCoodTgqKShNLm1lbV9iYXNlICsgYWRkcikgfAotCQkJICAoKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMSkgPDwgOCkpOwotCQl9Ci0JZWxzZQotI2VuZGlmCi0jaWZkZWYgX19hbHBoYV9fCi0JCXZhbCA9IGxkd191KCh1MTYqKShNLm1lbV9iYXNlICsgYWRkcikpOwotI2VsaWYgZGVmaW5lZCAoX19pYTY0X18pCi0JICB2YWwgPSB1bGR3KCh1MTYqKShNLm1lbV9iYXNlICsgYWRkcikpOwotI2Vsc2UKLQkJdmFsID0gKih1MTYqKShNLm1lbV9iYXNlICsgYWRkcik7Ci0jZW5kaWYKLQkJREIoCWlmIChERUJVR19NRU1fVFJBQ0UoKSkKLQkJcHJpbnRrKCIlIzA4eCAyIC0+ICUjeFxuIiwgYWRkciwgdmFsKTspCi0gICAgcmV0dXJuIHZhbDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1hZGRyCS0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAotCi1SRVRVUk5TOgotTG9uZyB2YWx1ZSByZWFkIGZyb20gZW11bGF0b3IgbWVtb3J5LgotUkVNQVJLUzoKLVJlYWRzIGEgbG9uZyB2YWx1ZSBmcm9tIHRoZSBlbXVsYXRvciBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTMyIFg4NkFQSSByZGwoCi0JdTMyIGFkZHIpCi17Ci0JdTMyIHZhbCA9IDA7Ci0KLQlpZiAoYWRkciA+IE0ubWVtX3NpemUgLSA0KSB7Ci0JCURCKHByaW50aygibWVtX3JlYWQ6IGFkZHJlc3MgJSNseCBvdXQgb2YgcmFuZ2UhXG4iLCBhZGRyKTspCi0JCUhBTFRfU1lTKCk7Ci0JCX0KLSNpZmRlZiBfX0JJR19FTkRJQU5fXwotCWlmIChhZGRyICYgMHgzKSB7Ci0JCXZhbCA9ICgqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAwKSB8Ci0JCQkgICgqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAxKSA8PCA4KSB8Ci0JCQkgICgqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAyKSA8PCAxNikgfAotCQkJICAoKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMykgPDwgMjQpKTsKLQkJfQotCWVsc2UKLSNlbmRpZgotI2lmZGVmIF9fYWxwaGFfXwotCQl2YWwgPSBsZGxfdSgodTMyKikoTS5tZW1fYmFzZSArIGFkZHIpKTsKLSNlbGlmIGRlZmluZWQgKF9faWE2NF9fKQotCQl2YWwgPSB1bGRsKCh1MzIqKShNLm1lbV9iYXNlICsgYWRkcikpOwotI2Vsc2UKLQkJdmFsID0gKih1MzIqKShNLm1lbV9iYXNlICsgYWRkcik7Ci0jZW5kaWYKLURCKAlpZiAoREVCVUdfTUVNX1RSQUNFKCkpCi0JCXByaW50aygiJSMwOHggNCAtPiAlI3hcbiIsIGFkZHIsIHZhbCk7KQotCXJldHVybiB2YWw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYWRkcgktIEVtdWxhdG9yIG1lbW9yeSBhZGRyZXNzIHRvIHJlYWQKLXZhbAkJLSBWYWx1ZSB0byBzdG9yZQotCi1SRU1BUktTOgotV3JpdGVzIGEgYnl0ZSB2YWx1ZSB0byBlbXVsYXRvciBtZW1vcnkuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBYODZBUEkgd3JiKAotCXUzMiBhZGRyLAotCXU4IHZhbCkKLXsKLURCKAlpZiAoREVCVUdfTUVNX1RSQUNFKCkpCi0JCXByaW50aygiJSMwOHggMSA8LSAlI3hcbiIsIGFkZHIsIHZhbCk7KQotICAgIGlmIChhZGRyID4gTS5tZW1fc2l6ZSAtIDEpIHsKLQkJREIocHJpbnRrKCJtZW1fd3JpdGU6IGFkZHJlc3MgJSNseCBvdXQgb2YgcmFuZ2UhXG4iLCBhZGRyKTspCi0JCUhBTFRfU1lTKCk7Ci0JCX0KLQkqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIpID0gdmFsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWFkZHIJLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCi12YWwJCS0gVmFsdWUgdG8gc3RvcmUKLQotUkVNQVJLUzoKLVdyaXRlcyBhIHdvcmQgdmFsdWUgdG8gZW11bGF0b3IgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgWDg2QVBJIHdydygKLQl1MzIgYWRkciwKLQl1MTYgdmFsKQotewotREIoCWlmIChERUJVR19NRU1fVFJBQ0UoKSkKLQkJcHJpbnRrKCIlIzA4eCAyIDwtICUjeFxuIiwgYWRkciwgdmFsKTspCi0JaWYgKGFkZHIgPiBNLm1lbV9zaXplIC0gMikgewotCQlEQihwcmludGsoIm1lbV93cml0ZTogYWRkcmVzcyAlI2x4IG91dCBvZiByYW5nZSFcbiIsIGFkZHIpOykKLQkJSEFMVF9TWVMoKTsKLQkJfQotI2lmZGVmIF9fQklHX0VORElBTl9fCi0JaWYgKGFkZHIgJiAweDEpIHsKLQkJKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMCkgPSAodmFsID4+IDApICYgMHhmZjsKLQkJKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMSkgPSAodmFsID4+IDgpICYgMHhmZjsKLQkJfQotCWVsc2UKLSNlbmRpZgotI2lmZGVmIF9fYWxwaGFfXwotCSBzdHdfdSh2YWwsKHUxNiopKE0ubWVtX2Jhc2UgKyBhZGRyKSk7Ci0jZWxpZiBkZWZpbmVkIChfX2lhNjRfXykKLQkgdXN0dyh2YWwsKHUxNiopKE0ubWVtX2Jhc2UgKyBhZGRyKSk7Ci0jZWxzZQotCSAqKHUxNiopKE0ubWVtX2Jhc2UgKyBhZGRyKSA9IHZhbDsKLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWFkZHIJLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCi12YWwJCS0gVmFsdWUgdG8gc3RvcmUKLQotUkVNQVJLUzoKLVdyaXRlcyBhIGxvbmcgdmFsdWUgdG8gZW11bGF0b3IgbWVtb3J5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgWDg2QVBJIHdybCgKLQl1MzIgYWRkciwKLQl1MzIgdmFsKQotewotREIoCWlmIChERUJVR19NRU1fVFJBQ0UoKSkKLQkJcHJpbnRrKCIlIzA4eCA0IDwtICUjeFxuIiwgYWRkciwgdmFsKTspCi0JaWYgKGFkZHIgPiBNLm1lbV9zaXplIC0gNCkgewotCQlEQihwcmludGsoIm1lbV93cml0ZTogYWRkcmVzcyAlI2x4IG91dCBvZiByYW5nZSFcbiIsIGFkZHIpOykKLQkJSEFMVF9TWVMoKTsKLQkJfQotI2lmZGVmIF9fQklHX0VORElBTl9fCi0JaWYgKGFkZHIgJiAweDEpIHsKLQkJKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMCkgPSAodmFsID4+ICAwKSAmIDB4ZmY7Ci0JCSoodTgqKShNLm1lbV9iYXNlICsgYWRkciArIDEpID0gKHZhbCA+PiAgOCkgJiAweGZmOwotCQkqKHU4KikoTS5tZW1fYmFzZSArIGFkZHIgKyAyKSA9ICh2YWwgPj4gMTYpICYgMHhmZjsKLQkJKih1OCopKE0ubWVtX2Jhc2UgKyBhZGRyICsgMykgPSAodmFsID4+IDI0KSAmIDB4ZmY7Ci0JCX0KLQllbHNlCi0jZW5kaWYKLSNpZmRlZiBfX2FscGhhX18KLQkgc3RsX3UodmFsLCh1MzIqKShNLm1lbV9iYXNlICsgYWRkcikpOwotI2VsaWYgZGVmaW5lZCAoX19pYTY0X18pCi0JIHVzdGwodmFsLCh1MzIqKShNLm1lbV9iYXNlICsgYWRkcikpOwotI2Vsc2UKLQkgKih1MzIqKShNLm1lbV9iYXNlICsgYWRkcikgPSB2YWw7Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1hZGRyCS0gUElPIGFkZHJlc3MgdG8gcmVhZAotUkVUVVJOOgotMAotUkVNQVJLUzoKLURlZmF1bHQgUElPIGJ5dGUgcmVhZCBmdW5jdGlvbi4gRG9lc24ndCBwZXJmb3JtIHJlYWwgaW5iLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1OCBYODZBUEkgcF9pbmIoCi0JWDg2RU1VX3Bpb0FkZHIgYWRkcikKLXsKLURCKAlpZiAoREVCVUdfSU9fVFJBQ0UoKSkKLQkJcHJpbnRrKCJpbmIgJSMwNHggXG4iLCBhZGRyKTspCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYWRkcgktIFBJTyBhZGRyZXNzIHRvIHJlYWQKLVJFVFVSTjoKLTAKLVJFTUFSS1M6Ci1EZWZhdWx0IFBJTyB3b3JkIHJlYWQgZnVuY3Rpb24uIERvZXNuJ3QgcGVyZm9ybSByZWFsIGludy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdTE2IFg4NkFQSSBwX2ludygKLQlYODZFTVVfcGlvQWRkciBhZGRyKQotewotREIoCWlmIChERUJVR19JT19UUkFDRSgpKQotCQlwcmludGsoImludyAlIzA0eCBcbiIsIGFkZHIpOykKLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1hZGRyCS0gUElPIGFkZHJlc3MgdG8gcmVhZAotUkVUVVJOOgotMAotUkVNQVJLUzoKLURlZmF1bHQgUElPIGxvbmcgcmVhZCBmdW5jdGlvbi4gRG9lc24ndCBwZXJmb3JtIHJlYWwgaW5sLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1MzIgWDg2QVBJIHBfaW5sKAotCVg4NkVNVV9waW9BZGRyIGFkZHIpCi17Ci1EQigJaWYgKERFQlVHX0lPX1RSQUNFKCkpCi0JCXByaW50aygiaW5sICUjMDR4IFxuIiwgYWRkcik7KQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUEFSQU1FVEVSUzoKLWFkZHIJLSBQSU8gYWRkcmVzcyB0byB3cml0ZQotdmFsICAgICAtIFZhbHVlIHRvIHN0b3JlCi1SRU1BUktTOgotRGVmYXVsdCBQSU8gYnl0ZSB3cml0ZSBmdW5jdGlvbi4gRG9lc24ndCBwZXJmb3JtIHJlYWwgb3V0Yi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBYODZBUEkgcF9vdXRiKAotCVg4NkVNVV9waW9BZGRyIGFkZHIsCi0JdTggdmFsKQotewotREIoCWlmIChERUJVR19JT19UUkFDRSgpKQotCQlwcmludGsoIm91dGIgJSMwMnggLT4gJSMwNHggXG4iLCB2YWwsIGFkZHIpOykKLSAgICByZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYWRkcgktIFBJTyBhZGRyZXNzIHRvIHdyaXRlCi12YWwgICAgIC0gVmFsdWUgdG8gc3RvcmUKLVJFTUFSS1M6Ci1EZWZhdWx0IFBJTyB3b3JkIHdyaXRlIGZ1bmN0aW9uLiBEb2Vzbid0IHBlcmZvcm0gcmVhbCBvdXR3LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIFg4NkFQSSBwX291dHcoCi0JWDg2RU1VX3Bpb0FkZHIgYWRkciwKLQl1MTYgdmFsKQotewotREIoCWlmIChERUJVR19JT19UUkFDRSgpKQotCQlwcmludGsoIm91dHcgJSMwNHggLT4gJSMwNHggXG4iLCB2YWwsIGFkZHIpOykKLQlyZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotYWRkcgktIFBJTyBhZGRyZXNzIHRvIHdyaXRlCi12YWwgICAgIC0gVmFsdWUgdG8gc3RvcmUKLVJFTUFSS1M6Ci1EZWZhdWx0IFBJTyA7b25nIHdyaXRlIGZ1bmN0aW9uLiBEb2Vzbid0IHBlcmZvcm0gcmVhbCBvdXRsLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIFg4NkFQSSBwX291dGwoCi0JWDg2RU1VX3Bpb0FkZHIgYWRkciwKLQl1MzIgdmFsKQotewotREIoCWlmIChERUJVR19JT19UUkFDRSgpKQotCQlwcmludGsoIm91dGwgJSMwOHggLT4gJSMwNHggXG4iLCB2YWwsIGFkZHIpOykKLSAgICByZXR1cm47Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXU4ICAJKFg4NkFQSVAgc3lzX3JkYikodTMyIGFkZHIpIAkJCSAgICAgICAgICAgID0gcmRiOwotdTE2IAkoWDg2QVBJUCBzeXNfcmR3KSh1MzIgYWRkcikgCQkJICAgICAgICAgICAgPSByZHc7Ci11MzIgCShYODZBUElQIHN5c19yZGwpKHUzMiBhZGRyKSAJCQkgICAgICAgICAgICA9IHJkbDsKLXZvaWQgCShYODZBUElQIHN5c193cmIpKHUzMiBhZGRyLHU4IHZhbCkgCQkgICAgICAgICAgICA9IHdyYjsKLXZvaWQgCShYODZBUElQIHN5c193cncpKHUzMiBhZGRyLHUxNiB2YWwpIAkgICAgICAgICAgICA9IHdydzsKLXZvaWQgCShYODZBUElQIHN5c193cmwpKHUzMiBhZGRyLHUzMiB2YWwpIAkgICAgICAgICAgICA9IHdybDsKLXU4ICAJKFg4NkFQSVAgc3lzX2luYikoWDg2RU1VX3Bpb0FkZHIgYWRkcikJICAgICAgICAgICAgPSBwX2luYjsKLXUxNiAJKFg4NkFQSVAgc3lzX2ludykoWDg2RU1VX3Bpb0FkZHIgYWRkcikJICAgICAgICAgICAgPSBwX2ludzsKLXUzMiAJKFg4NkFQSVAgc3lzX2lubCkoWDg2RU1VX3Bpb0FkZHIgYWRkcikgICAgICAgICAgICAgID0gcF9pbmw7Ci12b2lkIAkoWDg2QVBJUCBzeXNfb3V0YikoWDg2RU1VX3Bpb0FkZHIgYWRkciwgdTggdmFsKSAJPSBwX291dGI7Ci12b2lkIAkoWDg2QVBJUCBzeXNfb3V0dykoWDg2RU1VX3Bpb0FkZHIgYWRkciwgdTE2IHZhbCkJPSBwX291dHc7Ci12b2lkIAkoWDg2QVBJUCBzeXNfb3V0bCkoWDg2RU1VX3Bpb0FkZHIgYWRkciwgdTMyIHZhbCkJPSBwX291dGw7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2V0dXAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZnVuY3MJLSBOZXcgbWVtb3J5IGZ1bmN0aW9uIHBvaW50ZXJzIHRvIG1ha2UgYWN0aXZlCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IHRoZSBwb2ludGVycyB0byBmdW5jdGlvbnMgd2hpY2ggYWNjZXNzCi1tZW1vcnkgc3BhY2UsIGFsbG93aW5nIHRoZSB1c2VyIGFwcGxpY2F0aW9uIHRvIG92ZXJyaWRlIHRoZXNlIGZ1bmN0aW9ucwotYW5kIGhvb2sgdGhlbSBvdXQgYXMgbmVjZXNzYXJ5IGZvciB0aGVpciBhcHBsaWNhdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFg4NkVNVV9zZXR1cE1lbUZ1bmNzKAotCVg4NkVNVV9tZW1GdW5jcyAqZnVuY3MpCi17Ci0Jc3lzX3JkYiA9IGZ1bmNzLT5yZGI7Ci0gICAgc3lzX3JkdyA9IGZ1bmNzLT5yZHc7Ci0gICAgc3lzX3JkbCA9IGZ1bmNzLT5yZGw7Ci0gICAgc3lzX3dyYiA9IGZ1bmNzLT53cmI7Ci0gICAgc3lzX3dydyA9IGZ1bmNzLT53cnc7Ci0gICAgc3lzX3dybCA9IGZ1bmNzLT53cmw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotZnVuY3MJLSBOZXcgcHJvZ3JhbW1lZCBJL08gZnVuY3Rpb24gcG9pbnRlcnMgdG8gbWFrZSBhY3RpdmUKLQotUkVNQVJLUzoKLVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdGhlIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyB3aGljaCBhY2Nlc3MKLUkvTyBzcGFjZSwgYWxsb3dpbmcgdGhlIHVzZXIgYXBwbGljYXRpb24gdG8gb3ZlcnJpZGUgdGhlc2UgZnVuY3Rpb25zCi1hbmQgaG9vayB0aGVtIG91dCBhcyBuZWNlc3NhcnkgZm9yIHRoZWlyIGFwcGxpY2F0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgWDg2RU1VX3NldHVwUGlvRnVuY3MoCi0JWDg2RU1VX3Bpb0Z1bmNzICpmdW5jcykKLXsKLSAgICBzeXNfaW5iID0gZnVuY3MtPmluYjsKLSAgICBzeXNfaW53ID0gZnVuY3MtPmludzsKLSAgICBzeXNfaW5sID0gZnVuY3MtPmlubDsKLSAgICBzeXNfb3V0YiA9IGZ1bmNzLT5vdXRiOwotICAgIHN5c19vdXR3ID0gZnVuY3MtPm91dHc7Ci0gICAgc3lzX291dGwgPSBmdW5jcy0+b3V0bDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBBUkFNRVRFUlM6Ci1mdW5jcwktIE5ldyBpbnRlcnJ1cHQgdmVjdG9yIHRhYmxlIHRvIG1ha2UgYWN0aXZlCi0KLVJFTUFSS1M6Ci1UaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IHRoZSBwb2ludGVycyB0byBmdW5jdGlvbnMgd2hpY2ggaGFuZGxlCi1pbnRlcnJ1cHQgcHJvY2Vzc2luZyBpbiB0aGUgZW11bGF0b3IsIGFsbG93aW5nIHRoZSB1c2VyIGFwcGxpY2F0aW9uIHRvCi1ob29rIGludGVycnVwdHMgYXMgbmVjZXNzYXJ5IGZvciB0aGVpciBhcHBsaWNhdGlvbi4gQW55IGludGVycnVwdHMgdGhhdAotYXJlIG5vdCBob29rZWQgYnkgdGhlIHVzZXIgYXBwbGljYXRpb24sIGFuZCByZWZsZWN0ZWQgYW5kIGhhbmRsZWQgaW50ZXJuYWxseQotaW4gdGhlIGVtdWxhdG9yIHZpYSB0aGUgaW50ZXJydXB0IHZlY3RvciB0YWJsZS4gVGhpcyBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uCi10byBnZXQgY29udHJvbCB3aGVuIHRoZSBjb2RlIGJlaW5nIGVtdWxhdGVkIGV4ZWN1dGVzIHNwZWNpZmljIHNvZnR3YXJlCi1pbnRlcnJ1cHRzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgWDg2RU1VX3NldHVwSW50ckZ1bmNzKAotCVg4NkVNVV9pbnRyRnVuY3MgZnVuY3NbXSkKLXsKLSAgICBpbnQgaTsKLQotCWZvciAoaT0wOyBpIDwgMjU2OyBpKyspCi0JCV9YODZFTVVfaW50clRhYltpXSA9IE5VTEw7Ci0JaWYgKGZ1bmNzKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLQkJCV9YODZFTVVfaW50clRhYltpXSA9IGZ1bmNzW2ldOwotCQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1QQVJBTUVURVJTOgotaW50CS0gTmV3IHNvZnR3YXJlIGludGVycnVwdCB0byBwcmVwYXJlIGZvcgotCi1SRU1BUktTOgotVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCB1cCB0aGUgZW11bGF0b3Igc3RhdGUgdG8gZXhjZXV0ZSBhIHNvZnR3YXJlCi1pbnRlcnJ1cHQuIFRoaXMgY2FuIGJlIHVzZWQgYnkgdGhlIHVzZXIgYXBwbGljYXRpb24gY29kZSB0byBhbGxvdyBhbgotaW50ZXJydXB0IHRvIGJlIGhvb2tlZCwgZXhhbWluZWQgYW5kIHRoZW4gcmVmbGVjdGVkIGJhY2sgdG8gdGhlIGVtdWxhdG9yCi1zbyB0aGF0IHRoZSBjb2RlIGluIHRoZSBlbXVsYXRvciB3aWxsIGNvbnRpbnVlIHByb2Nlc3NpbmcgdGhlIHNvZnR3YXJlCi1pbnRlcnJ1cHQgYXMgcGVyIG5vcm1hbC4gVGhpcyBlc3NlbnRpYWxseSBhbGxvd3Mgc3lzdGVtIGNvZGUgdG8gYWN0aXZlbHkKLWhvb2sgYW5kIGhhbmRsZSBjZXJ0YWluIHNvZnR3YXJlIGludGVycnVwdHMgYXMgbmVjZXNzYXJ5LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgWDg2RU1VX3ByZXBhcmVGb3JJbnQoCi0JaW50IG51bSkKLXsKLSAgICBwdXNoX3dvcmQoKHUxNilNLng4Ni5SX0ZMRyk7Ci0gICAgQ0xFQVJfRkxBRyhGX0lGKTsKLSAgICBDTEVBUl9GTEFHKEZfVEYpOwotICAgIHB1c2hfd29yZChNLng4Ni5SX0NTKTsKLSAgICBNLng4Ni5SX0NTID0gbWVtX2FjY2Vzc193b3JkKG51bSAqIDQgKyAyKTsKLSAgICBwdXNoX3dvcmQoTS54ODYuUl9JUCk7Ci0gICAgTS54ODYuUl9JUCA9IG1lbV9hY2Nlc3Nfd29yZChudW0gKiA0KTsKLQlNLng4Ni5pbnRyID0gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS92YWxpZGF0ZS5jIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3ZhbGlkYXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NTEzMDEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3ZhbGlkYXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSoJCQkJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotKgotKiAgICAgICAgICAgIAlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qIAkJCQkgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKLSogCQkJCQkgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOiAgICAgV2F0Y29tIEMgMTAuNiBvciBsYXRlcgotKiBFbnZpcm9ubWVudDogIDMyLWJpdCBET1MKLSogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKLSoKLSogRGVzY3JpcHRpb246ICBQcm9ncmFtIHRvIHZhbGlkYXRlIHRoZSB4ODYgZW11bGF0b3IgbGlicmFyeSBmb3IKLSogICAgICAgICAgICAgICBjb3JyZWN0bmVzcy4gV2UgcnVuIHRoZSBlbXVsYXRvciBwcmltaXRpdmUgb3BlcmF0aW9ucwotKiAgICAgICAgICAgICAgIGZ1bmN0aW9ucyBhZ2FpbnN0IHRoZSByZWFsIHg4NiBDUFUsIGFuZCBjb21wYXJlIHRoZSByZXN1bHQKLSogICAgICAgICAgICAgICBhbmQgZmxhZ3MgdG8gZW5zdXJlIGNvcnJlY3RuZXNzLgotKgotKiAgICAgICAgICAgICAgIFdlIHVzZSBpbmxpbmUgYXNzZW1ibGVyIHRvIGNvbXBpbGUgYW5kIGJ1aWxkIHRoaXMgcHJvZ3JhbS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgIng4NmVtdS5oIgotI2luY2x1ZGUgIng4NmVtdS9wcmltX2FzbS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIHRydWUgMQotI2RlZmluZSBmYWxzZSAwCi0KLSNkZWZpbmUgQUxMX0ZMQUdTICAgKEZfQ0YgfCBGX1BGIHwgRl9BRiB8IEZfWkYgfCBGX1NGIHwgRl9PRikKLQotI2RlZmluZSBWQUxfU1RBUlRfQklOQVJZKHBhcm1fdHlwZSxyZXNfdHlwZSxkbWF4LHNtYXgsZGluY3Isc2luY3IpICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwYXJtX3R5cGUgICBkLHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJlc190eXBlICAgIHIscl9hc207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JdWxvbmcgICAgIAlmbGFncyxpbmZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWludCAgICAgICAgIGYsZmFpbGVkID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2hhciAgICAgICAgYnVmMVs4MF0sYnVmMls4MF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKGQgPSAwOyBkIDwgZG1heDsgZCArPSBkaW5jcikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWZvciAocyA9IDA7IHMgPCBzbWF4OyBzICs9IHNpbmNyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgTS54ODYuUl9FRkxHID0gaW5mbGFncyA9IGZsYWdzID0gZGVmX2ZsYWdzOyAgICAgICAgICAgICBcCi0JICAgIGZvciAoZiA9IDA7IGYgPCAyOyBmKyspIHsKLQotI2RlZmluZSBWQUxfVEVTVF9CSU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlyX2FzbSA9IG5hbWUjI19hc20oJmZsYWdzLGQscyk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJciA9IG5hbWUoZCxzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlpZiAociAhPSByX2FzbSB8fCBNLng4Ni5SX0VGTEcgIT0gZmxhZ3MpICAgICAgICAgICAgICAgIFwKLQkJICAgIGZhaWxlZCA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWlmIChmYWlsZWQgfHwgdHJhY2UpIHsKLQotI2RlZmluZSBWQUxfVEVTVF9CSU5BUllfVk9JRChuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQluYW1lIyNfYXNtKCZmbGFncyxkLHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJbmFtZShkLHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlyID0gcl9hc20gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJaWYgKE0ueDg2LlJfRUZMRyAhPSBmbGFncykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBmYWlsZWQgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlpZiAoZmFpbGVkIHx8IHRyYWNlKSB7Ci0KLSNkZWZpbmUgVkFMX0ZBSUxfQllURV9CWVRFX0JJTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcHJpbnRrKCJmYWlsXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBwcmludGsoIjB4JTAyWCA9ICUtMTVzKDB4JTAyWCwweCUwMlgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlyLCAjbmFtZSwgZCwgcywgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixNLng4Ni5SX0VGTEcpKTsgICAgIFwKLQkJICAgIHByaW50aygiMHglMDJYID0gJS0xNXMoMHglMDJYLDB4JTAyWCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXJfYXNtLCAjbmFtZSJfYXNtIiwgZCwgcywgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixmbGFncykpOwotCi0jZGVmaW5lIFZBTF9GQUlMX1dPUkRfV09SRF9CSU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXByaW50aygiZmFpbFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgcHJpbnRrKCIweCUwNFggPSAlLTE1cygweCUwNFgsMHglMDRYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJciwgI25hbWUsIGQsIHMsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsTS54ODYuUl9FRkxHKSk7ICAgXAotCQkgICAgcHJpbnRrKCIweCUwNFggPSAlLTE1cygweCUwNFgsMHglMDRYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcl9hc20sICNuYW1lIl9hc20iLCBkLCBzLCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLGZsYWdzKSk7Ci0KLSNkZWZpbmUgVkFMX0ZBSUxfTE9OR19MT05HX0JJTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcHJpbnRrKCJmYWlsXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBwcmludGsoIjB4JTA4WCA9ICUtMTVzKDB4JTA4WCwweCUwOFgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlyLCAjbmFtZSwgZCwgcywgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixNLng4Ni5SX0VGTEcpKTsgXAotCQkgICAgcHJpbnRrKCIweCUwOFggPSAlLTE1cygweCUwOFgsMHglMDhYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcl9hc20sICNuYW1lIl9hc20iLCBkLCBzLCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLGZsYWdzKSk7Ci0KLSNkZWZpbmUgVkFMX0VORF9CSU5BUlkoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJTS54ODYuUl9FRkxHID0gaW5mbGFncyA9IGZsYWdzID0gZGVmX2ZsYWdzIHwgKEFMTF9GTEFHUyAmIH5GX09GKTsgICBcCi0JCWlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIWZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JcHJpbnRrKCJwYXNzZWRcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgVkFMX0JZVEVfQllURV9CSU5BUlkobmFtZSkgICAgICAgICAgXAotICAgIHByaW50aygiVmFsaWRhdGluZyAlcyAuLi4gIiwgI25hbWUpOyAgICBcCi0gICAgVkFMX1NUQVJUX0JJTkFSWSh1OCx1OCwweEZGLDB4RkYsMSwxKSAgIFwKLSAgICBWQUxfVEVTVF9CSU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgXAotICAgIFZBTF9GQUlMX0JZVEVfQllURV9CSU5BUlkobmFtZSkgICAgICAgICBcCi0gICAgVkFMX0VORF9CSU5BUlkoKQotCi0jZGVmaW5lIFZBTF9XT1JEX1dPUkRfQklOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgICAgICAgICAgICAgXAotICAgIFZBTF9TVEFSVF9CSU5BUlkodTE2LHUxNiwweEZGMDAsMHhGRjAwLDB4MTAwLDB4MTAwKSBcCi0gICAgVkFMX1RFU1RfQklOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfRkFJTF9XT1JEX1dPUkRfQklOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgXAotICAgIFZBTF9FTkRfQklOQVJZKCkKLQotI2RlZmluZSBWQUxfTE9OR19MT05HX0JJTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHByaW50aygiVmFsaWRhdGluZyAlcyAuLi4gIiwgI25hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFZBTF9TVEFSVF9CSU5BUlkodTMyLHUzMiwweEZGMDAwMDAwLDB4RkYwMDAwMDAsMHgxMDAwMDAwLDB4MTAwMDAwMCkgXAotICAgIFZBTF9URVNUX0JJTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFZBTF9GQUlMX0xPTkdfTE9OR19CSU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFZBTF9FTkRfQklOQVJZKCkKLQotI2RlZmluZSBWQUxfVk9JRF9CWVRFX0JJTkFSWShuYW1lKSAgICAgICAgICBcCi0gICAgcHJpbnRrKCJWYWxpZGF0aW5nICVzIC4uLiAiLCAjbmFtZSk7ICAgIFwKLSAgICBWQUxfU1RBUlRfQklOQVJZKHU4LHU4LDB4RkYsMHhGRiwxLDEpICAgXAotICAgIFZBTF9URVNUX0JJTkFSWV9WT0lEKG5hbWUpICAgICAgICAgICAgICBcCi0gICAgVkFMX0ZBSUxfQllURV9CWVRFX0JJTkFSWShuYW1lKSAgICAgICAgIFwKLSAgICBWQUxfRU5EX0JJTkFSWSgpCi0KLSNkZWZpbmUgVkFMX1ZPSURfV09SRF9CSU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHByaW50aygiVmFsaWRhdGluZyAlcyAuLi4gIiwgI25hbWUpOyAgICAgICAgICAgICAgICBcCi0gICAgVkFMX1NUQVJUX0JJTkFSWSh1MTYsdTE2LDB4RkYwMCwweEZGMDAsMHgxMDAsMHgxMDApIFwKLSAgICBWQUxfVEVTVF9CSU5BUllfVk9JRChuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFZBTF9GQUlMX1dPUkRfV09SRF9CSU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVkFMX0VORF9CSU5BUlkoKQotCi0jZGVmaW5lIFZBTF9WT0lEX0xPTkdfQklOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcHJpbnRrKCJWYWxpZGF0aW5nICVzIC4uLiAiLCAjbmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVkFMX1NUQVJUX0JJTkFSWSh1MzIsdTMyLDB4RkYwMDAwMDAsMHhGRjAwMDAwMCwweDEwMDAwMDAsMHgxMDAwMDAwKSBcCi0gICAgVkFMX1RFU1RfQklOQVJZX1ZPSUQobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVkFMX0ZBSUxfTE9OR19MT05HX0JJTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVkFMX0VORF9CSU5BUlkoKQotCi0jZGVmaW5lIFZBTF9CWVRFX1JPVEFURShuYW1lKSAgICAgICAgICAgICAgIFwKLSAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgXAotICAgIFZBTF9TVEFSVF9CSU5BUlkodTgsdTgsMHhGRiw4LDEsMSkgICAgICBcCi0gICAgVkFMX1RFU1RfQklOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfRkFJTF9CWVRFX0JZVEVfQklOQVJZKG5hbWUpICAgICAgICAgXAotICAgIFZBTF9FTkRfQklOQVJZKCkKLQotI2RlZmluZSBWQUxfV09SRF9ST1RBVEUobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcHJpbnRrKCJWYWxpZGF0aW5nICVzIC4uLiAiLCAjbmFtZSk7ICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfU1RBUlRfQklOQVJZKHUxNix1MTYsMHhGRjAwLDE2LDB4MTAwLDEpICAgICAgICAgXAotICAgIFZBTF9URVNUX0JJTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVkFMX0ZBSUxfV09SRF9XT1JEX0JJTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfRU5EX0JJTkFSWSgpCi0KLSNkZWZpbmUgVkFMX0xPTkdfUk9UQVRFKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfU1RBUlRfQklOQVJZKHUzMix1MzIsMHhGRjAwMDAwMCwzMiwweDEwMDAwMDAsMSkgICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfVEVTVF9CSU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfRkFJTF9MT05HX0xPTkdfQklOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfRU5EX0JJTkFSWSgpCi0KLSNkZWZpbmUgVkFMX1NUQVJUX1RFUk5BUlkocGFybV90eXBlLHJlc190eXBlLGRtYXgsc21heCxkaW5jcixzaW5jcixtYXhzaGlmdClcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwYXJtX3R5cGUgICBkLHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJlc190eXBlICAgIHIscl9hc207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdTggICAgICAgICAgc2hpZnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl1MzIgICAgICAgICBmbGFncyxpbmZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCAgICAgICAgIGYsZmFpbGVkID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2hhciAgICAgICAgYnVmMVs4MF0sYnVmMls4MF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKGQgPSAwOyBkIDwgZG1heDsgZCArPSBkaW5jcikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWZvciAocyA9IDA7IHMgPCBzbWF4OyBzICs9IHNpbmNyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgZm9yIChzaGlmdCA9IDA7IHNoaWZ0IDwgbWF4c2hpZnQ7IHNoaWZ0ICs9IDEpIHsgICAgICAgIFwKLQkJTS54ODYuUl9FRkxHID0gaW5mbGFncyA9IGZsYWdzID0gZGVmX2ZsYWdzOyAgICAgICAgIFwKLQkJZm9yIChmID0gMDsgZiA8IDI7IGYrKykgewotCi0jZGVmaW5lIFZBTF9URVNUX1RFUk5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICByX2FzbSA9IG5hbWUjI19hc20oJmZsYWdzLGQscyxzaGlmdCk7ICAgICAgICAgICAgICAgXAotCQkgICAgciA9IG5hbWUoZCxzLHNoaWZ0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBpZiAociAhPSByX2FzbSB8fCBNLng4Ni5SX0VGTEcgIT0gZmxhZ3MpICAgICAgICAgICAgXAotCQkJZmFpbGVkID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgaWYgKGZhaWxlZCB8fCB0cmFjZSkgewotCi0jZGVmaW5lIFZBTF9GQUlMX1dPUkRfV09SRF9URVJOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCWlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCSAgICBwcmludGsoImZhaWxcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXByaW50aygiMHglMDRYID0gJS0xNXMoMHglMDRYLDB4JTA0WCwlZCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCSAgICByLCAjbmFtZSwgZCwgcywgc2hpZnQsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsTS54ODYuUl9FRkxHKSk7ICAgXAotCQkJcHJpbnRrKCIweCUwNFggPSAlLTE1cygweCUwNFgsMHglMDRYLCVkKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgXAotCQkJICAgIHJfYXNtLCAjbmFtZSJfYXNtIiwgZCwgcywgc2hpZnQsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsZmxhZ3MpKTsKLQotI2RlZmluZSBWQUxfRkFJTF9MT05HX0xPTkdfVEVSTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkgICAgcHJpbnRrKCJmYWlsXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlwcmludGsoIjB4JTA4WCA9ICUtMTVzKDB4JTA4WCwweCUwOFgsJWQpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkgICAgciwgI25hbWUsIGQsIHMsIHNoaWZ0LCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLE0ueDg2LlJfRUZMRykpOyAgXAotCQkJcHJpbnRrKCIweCUwOFggPSAlLTE1cygweCUwOFgsMHglMDhYLCVkKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgXAotCQkJICAgIHJfYXNtLCAjbmFtZSJfYXNtIiwgZCwgcywgc2hpZnQsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsZmxhZ3MpKTsKLQotI2RlZmluZSBWQUxfRU5EX1RFUk5BUlkoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgTS54ODYuUl9FRkxHID0gaW5mbGFncyA9IGZsYWdzID0gZGVmX2ZsYWdzIHwgKEFMTF9GTEFHUyAmIH5GX09GKTsgICBcCi0JCSAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlwcmludGsoInBhc3NlZFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBWQUxfV09SRF9ST1RBVEVfREJMKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHByaW50aygiVmFsaWRhdGluZyAlcyAuLi4gIiwgI25hbWUpOyAgICAgICAgICAgICAgICAgICAgXAotICAgIFZBTF9TVEFSVF9URVJOQVJZKHUxNix1MTYsMHhGRjAwLDB4RkYwMCwweDEwMCwweDEwMCwxNikgXAotICAgIFZBTF9URVNUX1RFUk5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFZBTF9GQUlMX1dPUkRfV09SRF9URVJOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFZBTF9FTkRfVEVSTkFSWSgpCi0KLSNkZWZpbmUgVkFMX0xPTkdfUk9UQVRFX0RCTChuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcHJpbnRrKCJWYWxpZGF0aW5nICVzIC4uLiAiLCAjbmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFZBTF9TVEFSVF9URVJOQVJZKHUzMix1MzIsMHhGRjAwMDAwMCwweEZGMDAwMDAwLDB4MTAwMDAwMCwweDEwMDAwMDAsMzIpIFwKLSAgICBWQUxfVEVTVF9URVJOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVkFMX0ZBSUxfTE9OR19MT05HX1RFUk5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFZBTF9FTkRfVEVSTkFSWSgpCi0KLSNkZWZpbmUgVkFMX1NUQVJUX1VOQVJZKHBhcm1fdHlwZSxtYXgsaW5jcikgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwYXJtX3R5cGUgICBkLHIscl9hc207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl1MzIgICAgICAgICBmbGFncyxpbmZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgICAgICAgICBmLGZhaWxlZCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjaGFyICAgICAgICBidWYxWzgwXSxidWYyWzgwXTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKGQgPSAwOyBkIDwgbWF4OyBkICs9IGluY3IpIHsgICAgICAgICAgICAgICAgICAgICAgIFwKLQlNLng4Ni5SX0VGTEcgPSBpbmZsYWdzID0gZmxhZ3MgPSBkZWZfZmxhZ3M7ICAgICAgICAgXAotCWZvciAoZiA9IDA7IGYgPCAyOyBmKyspIHsKLQotI2RlZmluZSBWQUxfVEVTVF9VTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICByX2FzbSA9IG5hbWUjI19hc20oJmZsYWdzLGQpOyAgICAgICAgICAgICAgICAgICBcCi0JICAgIHIgPSBuYW1lKGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBpZiAociAhPSByX2FzbSB8fCBNLng4Ni5SX0VGTEcgIT0gZmxhZ3MpIHsgICAgICBcCi0JCWZhaWxlZCA9IHRydWU7Ci0KLSNkZWZpbmUgVkFMX0ZBSUxfQllURV9VTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJcHJpbnRrKCJmYWlsXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCXByaW50aygiMHglMDJYID0gJS0xNXMoMHglMDJYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgciwgI25hbWUsIGQsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsTS54ODYuUl9FRkxHKSk7ICAgIFwKLQkJcHJpbnRrKCIweCUwMlggPSAlLTE1cygweCUwMlgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICByX2FzbSwgI25hbWUiX2FzbSIsIGQsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsZmxhZ3MpKTsKLQotI2RlZmluZSBWQUxfRkFJTF9XT1JEX1VOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlwcmludGsoImZhaWxcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJcHJpbnRrKCIweCUwNFggPSAlLTE1cygweCUwNFgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICByLCAjbmFtZSwgZCwgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixNLng4Ni5SX0VGTEcpKTsgIFwKLQkJcHJpbnRrKCIweCUwNFggPSAlLTE1cygweCUwNFgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICByX2FzbSwgI25hbWUiX2FzbSIsIGQsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsZmxhZ3MpKTsKLQotI2RlZmluZSBWQUxfRkFJTF9MT05HX1VOQVJZKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlwcmludGsoImZhaWxcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJcHJpbnRrKCIweCUwOFggPSAlLTE1cygweCUwOFgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICByLCAjbmFtZSwgZCwgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixNLng4Ni5SX0VGTEcpKTsgICAgXAotCQlwcmludGsoIjB4JTA4WCA9ICUtMTVzKDB4JTA4WCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIHJfYXNtLCAjbmFtZSJfYXNtIiwgZCwgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixmbGFncykpOwotCi0jZGVmaW5lIFZBTF9FTkRfVU5BUlkoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBNLng4Ni5SX0VGTEcgPSBpbmZsYWdzID0gZmxhZ3MgPSBkZWZfZmxhZ3MgfCBBTExfRkxBR1M7ICAgICBcCi0JICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIWZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlwcmludGsoInBhc3NlZFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIFZBTF9CWVRFX1VOQVJZKG5hbWUpICAgICAgICAgICAgICAgIFwKLSAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgXAotICAgIFZBTF9TVEFSVF9VTkFSWSh1OCwweEZGLDB4MSkgICAgICAgICAgICBcCi0gICAgVkFMX1RFU1RfVU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfRkFJTF9CWVRFX1VOQVJZKG5hbWUpICAgICAgICAgICAgICAgXAotICAgIFZBTF9FTkRfVU5BUlkoKQotCi0jZGVmaW5lIFZBTF9XT1JEX1VOQVJZKG5hbWUpICAgICAgICAgICAgICAgIFwKLSAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgXAotICAgIFZBTF9TVEFSVF9VTkFSWSh1MTYsMHhGRjAwLDB4MTAwKSAgICAgICBcCi0gICAgVkFMX1RFU1RfVU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfRkFJTF9XT1JEX1VOQVJZKG5hbWUpICAgICAgICAgICAgICAgXAotICAgIFZBTF9FTkRfVU5BUlkoKQotCi0jZGVmaW5lIFZBTF9XT1JEX0JZVEVfVU5BUlkobmFtZSkgICAgICAgICAgIFwKLSAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgXAotICAgIFZBTF9TVEFSVF9VTkFSWSh1MTYsMHhGRiwweDEpICAgICAgICAgICBcCi0gICAgVkFMX1RFU1RfVU5BUlkobmFtZSkgICAgICAgICAgICAgICAgICAgIFwKLSAgICBWQUxfRkFJTF9XT1JEX1VOQVJZKG5hbWUpICAgICAgICAgICAgICAgXAotICAgIFZBTF9FTkRfVU5BUlkoKQotCi0jZGVmaW5lIFZBTF9MT05HX1VOQVJZKG5hbWUpICAgICAgICAgICAgICAgIFwKLSAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgXAotICAgIFZBTF9TVEFSVF9VTkFSWSh1MzIsMHhGRjAwMDAwMCwweDEwMDAwMDApIFwKLSAgICBWQUxfVEVTVF9VTkFSWShuYW1lKSAgICAgICAgICAgICAgICAgICAgXAotICAgIFZBTF9GQUlMX0xPTkdfVU5BUlkobmFtZSkgICAgICAgICAgICAgICBcCi0gICAgVkFMX0VORF9VTkFSWSgpCi0KLSNkZWZpbmUgVkFMX0JZVEVfTVVMKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1OCAgICAgICAgICBkLHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1MTYgICAgICAgICByLHJfYXNtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl1MzIgICAgICAgICBmbGFncyxpbmZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgICAgICAgICBmLGZhaWxlZCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjaGFyICAgICAgICBidWYxWzgwXSxidWYyWzgwXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKGQgPSAwOyBkIDwgMHhGRjsgZCArPSAxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlmb3IgKHMgPSAwOyBzIDwgMHhGRjsgcyArPSAxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBNLng4Ni5SX0VGTEcgPSBpbmZsYWdzID0gZmxhZ3MgPSBkZWZfZmxhZ3M7ICAgICAgICAgICAgICAgICBcCi0JICAgIGZvciAoZiA9IDA7IGYgPCAyOyBmKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJbmFtZSMjX2FzbSgmZmxhZ3MsJnJfYXNtLGQscyk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCU0ueDg2LlJfQUwgPSBkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQluYW1lKHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlyID0gTS54ODYuUl9BWDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJaWYgKHIgIT0gcl9hc20gfHwgTS54ODYuUl9FRkxHICE9IGZsYWdzKSAgICAgICAgICAgICAgICBcCi0JCSAgICBmYWlsZWQgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlpZiAoZmFpbGVkIHx8IHRyYWNlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlwcmludGsoImZhaWxcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBwcmludGsoIjB4JTA0WCA9ICUtMTVzKDB4JTAyWCwweCUwMlgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlyLCAjbmFtZSwgZCwgcywgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixNLng4Ni5SX0VGTEcpKTsgICAgIFwKLQkJICAgIHByaW50aygiMHglMDRYID0gJS0xNXMoMHglMDJYLDB4JTAyWCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXJfYXNtLCAjbmFtZSJfYXNtIiwgZCwgcywgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixmbGFncykpOyAgXAotCQkgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCU0ueDg2LlJfRUZMRyA9IGluZmxhZ3MgPSBmbGFncyA9IGRlZl9mbGFncyB8IChBTExfRkxBR1MgJiB+Rl9PRik7ICAgXAotCQlpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCFmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXByaW50aygicGFzc2VkXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIFZBTF9XT1JEX01VTChuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcHJpbnRrKCJWYWxpZGF0aW5nICVzIC4uLiAiLCAjbmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdTE2ICAgICAgICAgZCxzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdTE2ICAgICAgICAgcl9sbyxyX2FzbV9sbzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdTE2ICAgICAgICAgcl9oaSxyX2FzbV9oaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JdTMyICAgICAgICAgZmxhZ3MsaW5mbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50ICAgICAgICAgZixmYWlsZWQgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2hhciAgICAgICAgYnVmMVs4MF0sYnVmMls4MF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yIChkID0gMDsgZCA8IDB4RkYwMDsgZCArPSAweDEwMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JZm9yIChzID0gMDsgcyA8IDB4RkYwMDsgcyArPSAweDEwMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgTS54ODYuUl9FRkxHID0gaW5mbGFncyA9IGZsYWdzID0gZGVmX2ZsYWdzOyAgICAgICAgICAgICAgICAgXAotCSAgICBmb3IgKGYgPSAwOyBmIDwgMjsgZisrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCW5hbWUjI19hc20oJmZsYWdzLCZyX2FzbV9sbywmcl9hc21faGksZCxzKTsgICAgICAgICAgICAgXAotCQlNLng4Ni5SX0FYID0gZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJbmFtZShzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJcl9sbyA9IE0ueDg2LlJfQVg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCXJfaGkgPSBNLng4Ni5SX0RYOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlpZiAocl9sbyAhPSByX2FzbV9sbyB8fCByX2hpICE9IHJfYXNtX2hpIHx8IE0ueDg2LlJfRUZMRyAhPSBmbGFncylcCi0JCSAgICBmYWlsZWQgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlpZiAoZmFpbGVkIHx8IHRyYWNlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlwcmludGsoImZhaWxcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBwcmludGsoIjB4JTA0WDoweCUwNFggPSAlLTE1cygweCUwNFgsMHglMDRYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlyX2hpLHJfbG8sICNuYW1lLCBkLCBzLCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLE0ueDg2LlJfRUZMRykpOyAgICAgICBcCi0JCSAgICBwcmludGsoIjB4JTA0WDoweCUwNFggPSAlLTE1cygweCUwNFgsMHglMDRYKSwgZmxhZ3MgPSAlcyAtPiAlc1xuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlyX2FzbV9oaSxyX2FzbV9sbywgI25hbWUiX2FzbSIsIGQsIHMsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsZmxhZ3MpKTsgIFwKLQkJICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJTS54ODYuUl9FRkxHID0gaW5mbGFncyA9IGZsYWdzID0gZGVmX2ZsYWdzIHwgKEFMTF9GTEFHUyAmIH5GX09GKTsgICBcCi0JCWlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIWZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JcHJpbnRrKCJwYXNzZWRcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgVkFMX0xPTkdfTVVMKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1MzIgICAgICAgICBkLHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1MzIgICAgICAgICByX2xvLHJfYXNtX2xvOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1MzIgICAgICAgICByX2hpLHJfYXNtX2hpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl1MzIgICAgICAgICBmbGFncyxpbmZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgICAgICAgICBmLGZhaWxlZCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjaGFyICAgICAgICBidWYxWzgwXSxidWYyWzgwXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKGQgPSAwOyBkIDwgMHhGRjAwMDAwMDsgZCArPSAweDEwMDAwMDApIHsgICAgICAgICAgICAgICAgICAgICAgIFwKLQlmb3IgKHMgPSAwOyBzIDwgMHhGRjAwMDAwMDsgcyArPSAweDEwMDAwMDApIHsgICAgICAgICAgICAgICAgICAgXAotCSAgICBNLng4Ni5SX0VGTEcgPSBpbmZsYWdzID0gZmxhZ3MgPSBkZWZfZmxhZ3M7ICAgICAgICAgICAgICAgICBcCi0JICAgIGZvciAoZiA9IDA7IGYgPCAyOyBmKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJbmFtZSMjX2FzbSgmZmxhZ3MsJnJfYXNtX2xvLCZyX2FzbV9oaSxkLHMpOyAgICAgICAgICAgICBcCi0JCU0ueDg2LlJfRUFYID0gZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQluYW1lKHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlyX2xvID0gTS54ODYuUl9FQVg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJcl9oaSA9IE0ueDg2LlJfRURYOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWlmIChyX2xvICE9IHJfYXNtX2xvIHx8IHJfaGkgIT0gcl9hc21faGkgfHwgTS54ODYuUl9FRkxHICE9IGZsYWdzKVwKLQkJICAgIGZhaWxlZCA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWlmIChmYWlsZWQgfHwgdHJhY2UpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXByaW50aygiZmFpbFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIHByaW50aygiMHglMDhYOjB4JTA4WCA9ICUtMTVzKDB4JTA4WCwweCUwOFgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXJfaGkscl9sbywgI25hbWUsIGQsIHMsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsTS54ODYuUl9FRkxHKSk7ICAgICAgIFwKLQkJICAgIHByaW50aygiMHglMDhYOjB4JTA4WCA9ICUtMTVzKDB4JTA4WCwweCUwOFgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXJfYXNtX2hpLHJfYXNtX2xvLCAjbmFtZSJfYXNtIiwgZCwgcywgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixmbGFncykpOyAgXAotCQkgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlNLng4Ni5SX0VGTEcgPSBpbmZsYWdzID0gZmxhZ3MgPSBkZWZfZmxhZ3MgfCAoQUxMX0ZMQUdTICYgfkZfT0YpOyAgIFwKLQkJaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlwcmludGsoInBhc3NlZFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBWQUxfQllURV9ESVYobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHByaW50aygiVmFsaWRhdGluZyAlcyAuLi4gIiwgI25hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHUxNiAgICAgICAgIGQsczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHU4ICAgICAgICAgIHJfcXVvdCxyX3JlbSxyX2FzbV9xdW90LHJfYXNtX3JlbTsgICAgICAgICAgICAgICAgICAgICAgXAotCXUzMiAgICAgICAgIGZsYWdzLGluZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCAgICAgICAgIGYsZmFpbGVkID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNoYXIgICAgICAgIGJ1ZjFbODBdLGJ1ZjJbODBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoZCA9IDA7IGQgPCAweEZGMDA7IGQgKz0gMHgxMDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWZvciAocyA9IDE7IHMgPCAweEZGOyBzICs9IDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIE0ueDg2LlJfRUZMRyA9IGluZmxhZ3MgPSBmbGFncyA9IGRlZl9mbGFnczsgICAgICAgICAgICAgICAgIFwKLQkgICAgZm9yIChmID0gMDsgZiA8IDI7IGYrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlNLng4Ni5pbnRyID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJTS54ODYuUl9BWCA9IGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCW5hbWUocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCXJfcXVvdCA9IE0ueDg2LlJfQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlyX3JlbSA9IE0ueDg2LlJfQUg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJaWYgKE0ueDg2LmludHIgJiBJTlRSX1NZTkNIKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQluYW1lIyNfYXNtKCZmbGFncywmcl9hc21fcXVvdCwmcl9hc21fcmVtLGQscyk7ICAgICAgICAgIFwKLQkJaWYgKHJfcXVvdCAhPSByX2FzbV9xdW90IHx8IHJfcmVtICE9IHJfYXNtX3JlbSB8fCBNLng4Ni5SX0VGTEcgIT0gZmxhZ3MpIFwKLQkJICAgIGZhaWxlZCA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWlmIChmYWlsZWQgfHwgdHJhY2UpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXByaW50aygiZmFpbFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIHByaW50aygiMHglMDJYOjB4JTAyWCA9ICUtMTVzKDB4JTA0WCwweCUwMlgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlyX3F1b3QsIHJfcmVtLCAjbmFtZSwgZCwgcywgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixNLng4Ni5SX0VGTEcpKTsgICAgIFwKLQkJICAgIHByaW50aygiMHglMDJYOjB4JTAyWCA9ICUtMTVzKDB4JTA0WCwweCUwMlgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlyX2FzbV9xdW90LCByX2FzbV9yZW0sICNuYW1lIl9hc20iLCBkLCBzLCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLGZsYWdzKSk7ICBcCi0JCSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJTS54ODYuUl9FRkxHID0gaW5mbGFncyA9IGZsYWdzID0gZGVmX2ZsYWdzIHwgKEFMTF9GTEFHUyAmIH5GX09GKTsgICBcCi0JCWlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIWZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JcHJpbnRrKCJwYXNzZWRcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgVkFMX1dPUkRfRElWKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1MzIgICAgICAgICBkLHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1MTYgICAgICAgICByX3F1b3Qscl9yZW0scl9hc21fcXVvdCxyX2FzbV9yZW07ICAgICAgICAgICAgICAgICAgICAgIFwKLQl1MzIgICAgICAgICBmbGFncyxpbmZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgICAgICAgICBmLGZhaWxlZCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjaGFyICAgICAgICBidWYxWzgwXSxidWYyWzgwXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKGQgPSAwOyBkIDwgMHhGRjAwMDAwMDsgZCArPSAweDEwMDAwMDApIHsgICAgICAgICAgICAgICAgICAgICAgIFwKLQlmb3IgKHMgPSAweDEwMDsgcyA8IDB4RkYwMDsgcyArPSAweDEwMCkgeyAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBNLng4Ni5SX0VGTEcgPSBpbmZsYWdzID0gZmxhZ3MgPSBkZWZfZmxhZ3M7ICAgICAgICAgICAgICAgICBcCi0JICAgIGZvciAoZiA9IDA7IGYgPCAyOyBmKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJTS54ODYuaW50ciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCU0ueDg2LlJfQVggPSBkICYgMHhGRkZGOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlNLng4Ni5SX0RYID0gZCA+PiAxNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJbmFtZShzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJcl9xdW90ID0gTS54ODYuUl9BWDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCXJfcmVtID0gTS54ODYuUl9EWDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlpZiAoTS54ODYuaW50ciAmIElOVFJfU1lOQ0gpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCW5hbWUjI19hc20oJmZsYWdzLCZyX2FzbV9xdW90LCZyX2FzbV9yZW0sZCAmIDB4RkZGRixkID4+IDE2LHMpO1wKLQkJaWYgKHJfcXVvdCAhPSByX2FzbV9xdW90IHx8IHJfcmVtICE9IHJfYXNtX3JlbSB8fCBNLng4Ni5SX0VGTEcgIT0gZmxhZ3MpIFwKLQkJICAgIGZhaWxlZCA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWlmIChmYWlsZWQgfHwgdHJhY2UpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXByaW50aygiZmFpbFxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIHByaW50aygiMHglMDRYOjB4JTA0WCA9ICUtMTVzKDB4JTA4WCwweCUwNFgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlyX3F1b3QsIHJfcmVtLCAjbmFtZSwgZCwgcywgcHJpbnRfZmxhZ3MoYnVmMSxpbmZsYWdzKSwgcHJpbnRfZmxhZ3MoYnVmMixNLng4Ni5SX0VGTEcpKTsgICAgIFwKLQkJICAgIHByaW50aygiMHglMDRYOjB4JTA0WCA9ICUtMTVzKDB4JTA4WCwweCUwNFgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlyX2FzbV9xdW90LCByX2FzbV9yZW0sICNuYW1lIl9hc20iLCBkLCBzLCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLGZsYWdzKSk7ICBcCi0JCSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJTS54ODYuUl9FRkxHID0gaW5mbGFncyA9IGZsYWdzID0gZGVmX2ZsYWdzIHwgKEFMTF9GTEFHUyAmIH5GX09GKTsgICBcCi0JCWlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIGlmIChmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIWZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JcHJpbnRrKCJwYXNzZWRcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgVkFMX0xPTkdfRElWKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwcmludGsoIlZhbGlkYXRpbmcgJXMgLi4uICIsICNuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1MzIgICAgICAgICBkLHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1MzIgICAgICAgICByX3F1b3Qscl9yZW0scl9hc21fcXVvdCxyX2FzbV9yZW07ICAgICAgICAgICAgICAgICAgICAgIFwKLQl1MzIgICAgICAgICBmbGFncyxpbmZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgICAgICAgICBmLGZhaWxlZCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjaGFyICAgICAgICBidWYxWzgwXSxidWYyWzgwXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKGQgPSAwOyBkIDwgMHhGRjAwMDAwMDsgZCArPSAweDEwMDAwMDApIHsgICAgICAgICAgICAgICAgICAgICAgIFwKLQlmb3IgKHMgPSAweDEwMDsgcyA8IDB4RkYwMDsgcyArPSAweDEwMCkgeyAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBNLng4Ni5SX0VGTEcgPSBpbmZsYWdzID0gZmxhZ3MgPSBkZWZfZmxhZ3M7ICAgICAgICAgICAgICAgICBcCi0JICAgIGZvciAoZiA9IDA7IGYgPCAyOyBmKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJTS54ODYuaW50ciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCU0ueDg2LlJfRUFYID0gZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlNLng4Ni5SX0VEWCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJbmFtZShzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJcl9xdW90ID0gTS54ODYuUl9FQVg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCXJfcmVtID0gTS54ODYuUl9FRFg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlpZiAoTS54ODYuaW50ciAmIElOVFJfU1lOQ0gpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCW5hbWUjI19hc20oJmZsYWdzLCZyX2FzbV9xdW90LCZyX2FzbV9yZW0sZCwwLHMpOyAgICAgICAgXAotCQlpZiAocl9xdW90ICE9IHJfYXNtX3F1b3QgfHwgcl9yZW0gIT0gcl9hc21fcmVtIHx8IE0ueDg2LlJfRUZMRyAhPSBmbGFncykgXAotCQkgICAgZmFpbGVkID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJaWYgKGZhaWxlZCB8fCB0cmFjZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcHJpbnRrKCJmYWlsXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgcHJpbnRrKCIweCUwOFg6MHglMDhYID0gJS0xNXMoMHglMDhYOjB4JTA4WCwweCUwOFgpLCBmbGFncyA9ICVzIC0+ICVzXG4iLCAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJcl9xdW90LCByX3JlbSwgI25hbWUsIDAsIGQsIHMsIHByaW50X2ZsYWdzKGJ1ZjEsaW5mbGFncyksIHByaW50X2ZsYWdzKGJ1ZjIsTS54ODYuUl9FRkxHKSk7ICBcCi0JCSAgICBwcmludGsoIjB4JTA4WDoweCUwOFggPSAlLTE1cygweCUwOFg6MHglMDhYLDB4JTA4WCksIGZsYWdzID0gJXMgLT4gJXNcbiIsICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlyX2FzbV9xdW90LCByX2FzbV9yZW0sICNuYW1lIl9hc20iLCAwLCBkLCBzLCBwcmludF9mbGFncyhidWYxLGluZmxhZ3MpLCBwcmludF9mbGFncyhidWYyLGZsYWdzKSk7ICAgXAotCQkgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCU0ueDg2LlJfRUZMRyA9IGluZmxhZ3MgPSBmbGFncyA9IGRlZl9mbGFncyB8IChBTExfRkxBR1MgJiB+Rl9PRik7ICAgXAotCQlpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICBpZiAoZmFpbGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JaWYgKGZhaWxlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCFmYWlsZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXByaW50aygicGFzc2VkXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi12b2lkIHByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLSAgICB2YV9saXN0IGFyZ3B0cjsKLSAgICB2YV9zdGFydChhcmdwdHIsIGZtdCk7Ci0gICAgdmZwcmludGYoc3Rkb3V0LCBmbXQsIGFyZ3B0cik7Ci0gICAgZmZsdXNoKHN0ZG91dCk7Ci0gICAgdmFfZW5kKGFyZ3B0cik7Ci19Ci0KLWNoYXIgKiBwcmludF9mbGFncyhjaGFyICpidWYsdWxvbmcgZmxhZ3MpCi17Ci0gICAgY2hhciAqc2VwYXJhdG9yID0gIiI7Ci0KLSAgICBidWZbMF0gPSAwOwotICAgIGlmIChmbGFncyAmIEZfQ0YpIHsKLQlzdHJjYXQoYnVmLHNlcGFyYXRvcik7Ci0Jc3RyY2F0KGJ1ZiwiQ0YiKTsKLQlzZXBhcmF0b3IgPSAiLCI7Ci0JfQotICAgIGlmIChmbGFncyAmIEZfUEYpIHsKLQlzdHJjYXQoYnVmLHNlcGFyYXRvcik7Ci0Jc3RyY2F0KGJ1ZiwiUEYiKTsKLQlzZXBhcmF0b3IgPSAiLCI7Ci0JfQotICAgIGlmIChmbGFncyAmIEZfQUYpIHsKLQlzdHJjYXQoYnVmLHNlcGFyYXRvcik7Ci0Jc3RyY2F0KGJ1ZiwiQUYiKTsKLQlzZXBhcmF0b3IgPSAiLCI7Ci0JfQotICAgIGlmIChmbGFncyAmIEZfWkYpIHsKLQlzdHJjYXQoYnVmLHNlcGFyYXRvcik7Ci0Jc3RyY2F0KGJ1ZiwiWkYiKTsKLQlzZXBhcmF0b3IgPSAiLCI7Ci0JfQotICAgIGlmIChmbGFncyAmIEZfU0YpIHsKLQlzdHJjYXQoYnVmLHNlcGFyYXRvcik7Ci0Jc3RyY2F0KGJ1ZiwiU0YiKTsKLQlzZXBhcmF0b3IgPSAiLCI7Ci0JfQotICAgIGlmIChmbGFncyAmIEZfT0YpIHsKLQlzdHJjYXQoYnVmLHNlcGFyYXRvcik7Ci0Jc3RyY2F0KGJ1ZiwiT0YiKTsKLQlzZXBhcmF0b3IgPSAiLCI7Ci0JfQotICAgIGlmIChzZXBhcmF0b3JbMF0gPT0gMCkKLQlzdHJjcHkoYnVmLCJOb25lIik7Ci0gICAgcmV0dXJuIGJ1ZjsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MpCi17Ci0gICAgdWxvbmcgICBkZWZfZmxhZ3M7Ci0gICAgaW50IHRyYWNlID0gZmFsc2U7Ci0KLSAgICBpZiAoYXJnYyA+IDEpCi0JdHJhY2UgPSB0cnVlOwotICAgIG1lbXNldCgmTSwgMCwgc2l6ZW9mKE0pKTsKLSAgICBkZWZfZmxhZ3MgPSBnZXRfZmxhZ3NfYXNtKCkgJiB+QUxMX0ZMQUdTOwotCi0gICAgVkFMX1dPUkRfVU5BUlkoYWFhX3dvcmQpOwotICAgIFZBTF9XT1JEX1VOQVJZKGFhc193b3JkKTsKLQotICAgIFZBTF9XT1JEX1VOQVJZKGFhZF93b3JkKTsKLSAgICBWQUxfV09SRF9VTkFSWShhYW1fd29yZCk7Ci0KLSAgICBWQUxfQllURV9CWVRFX0JJTkFSWShhZGNfYnl0ZSk7Ci0gICAgVkFMX1dPUkRfV09SRF9CSU5BUlkoYWRjX3dvcmQpOwotICAgIFZBTF9MT05HX0xPTkdfQklOQVJZKGFkY19sb25nKTsKLQotICAgIFZBTF9CWVRFX0JZVEVfQklOQVJZKGFkZF9ieXRlKTsKLSAgICBWQUxfV09SRF9XT1JEX0JJTkFSWShhZGRfd29yZCk7Ci0gICAgVkFMX0xPTkdfTE9OR19CSU5BUlkoYWRkX2xvbmcpOwotCi0gICAgVkFMX0JZVEVfQllURV9CSU5BUlkoYW5kX2J5dGUpOwotICAgIFZBTF9XT1JEX1dPUkRfQklOQVJZKGFuZF93b3JkKTsKLSAgICBWQUxfTE9OR19MT05HX0JJTkFSWShhbmRfbG9uZyk7Ci0KLSAgICBWQUxfQllURV9CWVRFX0JJTkFSWShjbXBfYnl0ZSk7Ci0gICAgVkFMX1dPUkRfV09SRF9CSU5BUlkoY21wX3dvcmQpOwotICAgIFZBTF9MT05HX0xPTkdfQklOQVJZKGNtcF9sb25nKTsKLQotICAgIFZBTF9CWVRFX1VOQVJZKGRhYV9ieXRlKTsKLSAgICBWQUxfQllURV9VTkFSWShkYXNfYnl0ZSk7ICAgLyogRmFpbHMgZm9yIDB4OUEgKG91dCBvZiByYW5nZSBhbnl3YXkpICovCi0KLSAgICBWQUxfQllURV9VTkFSWShkZWNfYnl0ZSk7Ci0gICAgVkFMX1dPUkRfVU5BUlkoZGVjX3dvcmQpOwotICAgIFZBTF9MT05HX1VOQVJZKGRlY19sb25nKTsKLQotICAgIFZBTF9CWVRFX1VOQVJZKGluY19ieXRlKTsKLSAgICBWQUxfV09SRF9VTkFSWShpbmNfd29yZCk7Ci0gICAgVkFMX0xPTkdfVU5BUlkoaW5jX2xvbmcpOwotCi0gICAgVkFMX0JZVEVfQllURV9CSU5BUlkob3JfYnl0ZSk7Ci0gICAgVkFMX1dPUkRfV09SRF9CSU5BUlkob3Jfd29yZCk7Ci0gICAgVkFMX0xPTkdfTE9OR19CSU5BUlkob3JfbG9uZyk7Ci0KLSAgICBWQUxfQllURV9VTkFSWShuZWdfYnl0ZSk7Ci0gICAgVkFMX1dPUkRfVU5BUlkobmVnX3dvcmQpOwotICAgIFZBTF9MT05HX1VOQVJZKG5lZ19sb25nKTsKLQotICAgIFZBTF9CWVRFX1VOQVJZKG5vdF9ieXRlKTsKLSAgICBWQUxfV09SRF9VTkFSWShub3Rfd29yZCk7Ci0gICAgVkFMX0xPTkdfVU5BUlkobm90X2xvbmcpOwotCi0gICAgVkFMX0JZVEVfUk9UQVRFKHJjbF9ieXRlKTsKLSAgICBWQUxfV09SRF9ST1RBVEUocmNsX3dvcmQpOwotICAgIFZBTF9MT05HX1JPVEFURShyY2xfbG9uZyk7Ci0KLSAgICBWQUxfQllURV9ST1RBVEUocmNyX2J5dGUpOwotICAgIFZBTF9XT1JEX1JPVEFURShyY3Jfd29yZCk7Ci0gICAgVkFMX0xPTkdfUk9UQVRFKHJjcl9sb25nKTsKLQotICAgIFZBTF9CWVRFX1JPVEFURShyb2xfYnl0ZSk7Ci0gICAgVkFMX1dPUkRfUk9UQVRFKHJvbF93b3JkKTsKLSAgICBWQUxfTE9OR19ST1RBVEUocm9sX2xvbmcpOwotCi0gICAgVkFMX0JZVEVfUk9UQVRFKHJvcl9ieXRlKTsKLSAgICBWQUxfV09SRF9ST1RBVEUocm9yX3dvcmQpOwotICAgIFZBTF9MT05HX1JPVEFURShyb3JfbG9uZyk7Ci0KLSAgICBWQUxfQllURV9ST1RBVEUoc2hsX2J5dGUpOwotICAgIFZBTF9XT1JEX1JPVEFURShzaGxfd29yZCk7Ci0gICAgVkFMX0xPTkdfUk9UQVRFKHNobF9sb25nKTsKLQotICAgIFZBTF9CWVRFX1JPVEFURShzaHJfYnl0ZSk7Ci0gICAgVkFMX1dPUkRfUk9UQVRFKHNocl93b3JkKTsKLSAgICBWQUxfTE9OR19ST1RBVEUoc2hyX2xvbmcpOwotCi0gICAgVkFMX0JZVEVfUk9UQVRFKHNhcl9ieXRlKTsKLSAgICBWQUxfV09SRF9ST1RBVEUoc2FyX3dvcmQpOwotICAgIFZBTF9MT05HX1JPVEFURShzYXJfbG9uZyk7Ci0KLSAgICBWQUxfV09SRF9ST1RBVEVfREJMKHNobGRfd29yZCk7Ci0gICAgVkFMX0xPTkdfUk9UQVRFX0RCTChzaGxkX2xvbmcpOwotCi0gICAgVkFMX1dPUkRfUk9UQVRFX0RCTChzaHJkX3dvcmQpOwotICAgIFZBTF9MT05HX1JPVEFURV9EQkwoc2hyZF9sb25nKTsKLQotICAgIFZBTF9CWVRFX0JZVEVfQklOQVJZKHNiYl9ieXRlKTsKLSAgICBWQUxfV09SRF9XT1JEX0JJTkFSWShzYmJfd29yZCk7Ci0gICAgVkFMX0xPTkdfTE9OR19CSU5BUlkoc2JiX2xvbmcpOwotCi0gICAgVkFMX0JZVEVfQllURV9CSU5BUlkoc3ViX2J5dGUpOwotICAgIFZBTF9XT1JEX1dPUkRfQklOQVJZKHN1Yl93b3JkKTsKLSAgICBWQUxfTE9OR19MT05HX0JJTkFSWShzdWJfbG9uZyk7Ci0KLSAgICBWQUxfQllURV9CWVRFX0JJTkFSWSh4b3JfYnl0ZSk7Ci0gICAgVkFMX1dPUkRfV09SRF9CSU5BUlkoeG9yX3dvcmQpOwotICAgIFZBTF9MT05HX0xPTkdfQklOQVJZKHhvcl9sb25nKTsKLQotICAgIFZBTF9WT0lEX0JZVEVfQklOQVJZKHRlc3RfYnl0ZSk7Ci0gICAgVkFMX1ZPSURfV09SRF9CSU5BUlkodGVzdF93b3JkKTsKLSAgICBWQUxfVk9JRF9MT05HX0JJTkFSWSh0ZXN0X2xvbmcpOwotCi0gICAgVkFMX0JZVEVfTVVMKGltdWxfYnl0ZSk7Ci0gICAgVkFMX1dPUkRfTVVMKGltdWxfd29yZCk7Ci0gICAgVkFMX0xPTkdfTVVMKGltdWxfbG9uZyk7Ci0KLSAgICBWQUxfQllURV9NVUwobXVsX2J5dGUpOwotICAgIFZBTF9XT1JEX01VTChtdWxfd29yZCk7Ci0gICAgVkFMX0xPTkdfTVVMKG11bF9sb25nKTsKLQotICAgIFZBTF9CWVRFX0RJVihpZGl2X2J5dGUpOwotICAgIFZBTF9XT1JEX0RJVihpZGl2X3dvcmQpOwotICAgIFZBTF9MT05HX0RJVihpZGl2X2xvbmcpOwotCi0gICAgVkFMX0JZVEVfRElWKGRpdl9ieXRlKTsKLSAgICBWQUxfV09SRF9ESVYoZGl2X3dvcmQpOwotICAgIFZBTF9MT05HX0RJVihkaXZfbG9uZyk7Ci0KLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS94ODZlbXUvZGVidWcuaCBiL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS94ODZlbXUvZGVidWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE0YTA5Ni4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L2RlYnVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSoJCQkJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotKgotKiAgICAgICAgICAgIAlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qIAkJCQkgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKLSogCQkJCQkgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOgkJQU5TSSBDCi0qIEVudmlyb25tZW50OglBbnkKLSogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKLSoKLSogRGVzY3JpcHRpb246ICBIZWFkZXIgZmlsZSBmb3IgZGVidWcgZGVmaW5pdGlvbnMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fWDg2RU1VX0RFQlVHX0gKLSNkZWZpbmUgX19YODZFTVVfREVCVUdfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFjcm9zIGFuZCB0eXBlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBjaGVja3MgdG8gYmUgZW5hYmxlZCBmb3IgInJ1bnRpbWUiICovCi0KLSNkZWZpbmUgQ0hFQ0tfSVBfRkVUQ0hfRiAgICAgICAgICAgICAgICAweDEKLSNkZWZpbmUgQ0hFQ0tfU1BfQUNDRVNTX0YgICAgICAgICAgICAgICAweDIKLSNkZWZpbmUgQ0hFQ0tfTUVNX0FDQ0VTU19GICAgICAgICAgICAgICAweDQgLyp1c2luZyByZWd1bGFyIGxpbmVhciBwb2ludGVyICovCi0jZGVmaW5lIENIRUNLX0RBVEFfQUNDRVNTX0YgICAgICAgICAgICAgMHg4IC8qdXNpbmcgc2VnbWVudDpvZmZzZXQqLwotCi0jaWZkZWYgREVCVUcKLSMgZGVmaW5lIENIRUNLX0lQX0ZFVENIKCkgICAgICAgICAgICAgIAkoTS54ODYuY2hlY2sgJiBDSEVDS19JUF9GRVRDSF9GKQotIyBkZWZpbmUgQ0hFQ0tfU1BfQUNDRVNTKCkgICAgICAgICAgICAgCShNLng4Ni5jaGVjayAmIENIRUNLX1NQX0FDQ0VTU19GKQotIyBkZWZpbmUgQ0hFQ0tfTUVNX0FDQ0VTUygpICAgICAgICAgICAgCShNLng4Ni5jaGVjayAmIENIRUNLX01FTV9BQ0NFU1NfRikKLSMgZGVmaW5lIENIRUNLX0RBVEFfQUNDRVNTKCkgICAgICAgICAgIAkoTS54ODYuY2hlY2sgJiBDSEVDS19EQVRBX0FDQ0VTU19GKQotI2Vsc2UKLSMgZGVmaW5lIENIRUNLX0lQX0ZFVENIKCkKLSMgZGVmaW5lIENIRUNLX1NQX0FDQ0VTUygpCi0jIGRlZmluZSBDSEVDS19NRU1fQUNDRVNTKCkKLSMgZGVmaW5lIENIRUNLX0RBVEFfQUNDRVNTKCkKLSNlbmRpZgotCi0jaWZkZWYgREVCVUcKLSMgZGVmaW5lIERFQlVHX0lOU1RSVU1FTlQoKSAgICAJKE0ueDg2LmRlYnVnICYgREVCVUdfSU5TVFJVTUVOVF9GKQotIyBkZWZpbmUgREVCVUdfREVDT0RFKCkgICAgICAgIAkoTS54ODYuZGVidWcgJiBERUJVR19ERUNPREVfRikKLSMgZGVmaW5lIERFQlVHX1RSQUNFKCkgICAgICAgICAJKE0ueDg2LmRlYnVnICYgREVCVUdfVFJBQ0VfRikKLSMgZGVmaW5lIERFQlVHX1NURVAoKSAgICAgICAgICAJKE0ueDg2LmRlYnVnICYgREVCVUdfU1RFUF9GKQotIyBkZWZpbmUgREVCVUdfRElTQVNTRU1CTEUoKSAgIAkoTS54ODYuZGVidWcgJiBERUJVR19ESVNBU1NFTUJMRV9GKQotIyBkZWZpbmUgREVCVUdfQlJFQUsoKSAgICAgICAgIAkoTS54ODYuZGVidWcgJiBERUJVR19CUkVBS19GKQotIyBkZWZpbmUgREVCVUdfU1ZDKCkgICAgICAgICAgIAkoTS54ODYuZGVidWcgJiBERUJVR19TVkNfRikKLSMgZGVmaW5lIERFQlVHX1NBVkVfSVBfQ1MoKSAgICAgKE0ueDg2LmRlYnVnICYgREVCVUdfU0FWRV9DU19JUCkKLQotIyBkZWZpbmUgREVCVUdfRlMoKSAgICAgICAgICAgIAkoTS54ODYuZGVidWcgJiBERUJVR19GU19GKQotIyBkZWZpbmUgREVCVUdfUFJPQygpICAgICAgICAgIAkoTS54ODYuZGVidWcgJiBERUJVR19QUk9DX0YpCi0jIGRlZmluZSBERUJVR19TWVNJTlQoKSAgICAgICAgCShNLng4Ni5kZWJ1ZyAmIERFQlVHX1NZU0lOVF9GKQotIyBkZWZpbmUgREVCVUdfVFJBQ0VDQUxMKCkgICAgIAkoTS54ODYuZGVidWcgJiBERUJVR19UUkFDRUNBTExfRikKLSMgZGVmaW5lIERFQlVHX1RSQUNFQ0FMTFJFR1MoKSAJKE0ueDg2LmRlYnVnICYgREVCVUdfVFJBQ0VDQUxMX1JFR1NfRikKLSMgZGVmaW5lIERFQlVHX1NZUygpICAgICAgICAgICAJKE0ueDg2LmRlYnVnICYgREVCVUdfU1lTX0YpCi0jIGRlZmluZSBERUJVR19NRU1fVFJBQ0UoKSAgICAgCShNLng4Ni5kZWJ1ZyAmIERFQlVHX01FTV9UUkFDRV9GKQotIyBkZWZpbmUgREVCVUdfSU9fVFJBQ0UoKSAgICAgIAkoTS54ODYuZGVidWcgJiBERUJVR19JT19UUkFDRV9GKQotIyBkZWZpbmUgREVCVUdfREVDT0RFX05PUFJJTlQoKSAoTS54ODYuZGVidWcgJiBERUJVR19ERUNPREVfTk9QUklOVF9GKQotI2Vsc2UKLSMgZGVmaW5lIERFQlVHX0lOU1RSVU1FTlQoKSAgICAJMAotIyBkZWZpbmUgREVCVUdfREVDT0RFKCkgICAgICAgIAkwCi0jIGRlZmluZSBERUJVR19UUkFDRSgpICAgICAgICAgCTAKLSMgZGVmaW5lIERFQlVHX1NURVAoKSAgICAgICAgICAJMAotIyBkZWZpbmUgREVCVUdfRElTQVNTRU1CTEUoKSAgIAkwCi0jIGRlZmluZSBERUJVR19CUkVBSygpICAgICAgICAgCTAKLSMgZGVmaW5lIERFQlVHX1NWQygpICAgICAgICAgICAJMAotIyBkZWZpbmUgREVCVUdfU0FWRV9JUF9DUygpICAgICAwCi0jIGRlZmluZSBERUJVR19GUygpICAgICAgICAgICAgCTAKLSMgZGVmaW5lIERFQlVHX1BST0MoKSAgICAgICAgICAJMAotIyBkZWZpbmUgREVCVUdfU1lTSU5UKCkgICAgICAgIAkwCi0jIGRlZmluZSBERUJVR19UUkFDRUNBTEwoKSAgICAgCTAKLSMgZGVmaW5lIERFQlVHX1RSQUNFQ0FMTFJFR1MoKSAJMAotIyBkZWZpbmUgREVCVUdfU1lTKCkgICAgICAgICAgIAkwCi0jIGRlZmluZSBERUJVR19NRU1fVFJBQ0UoKSAgICAgCTAKLSMgZGVmaW5lIERFQlVHX0lPX1RSQUNFKCkgICAgICAJMAotIyBkZWZpbmUgREVCVUdfREVDT0RFX05PUFJJTlQoKSAwCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHCi0KLSMgZGVmaW5lIERFQ09ERV9QUklOVEYoeCkgICAgIAlpZiAoREVCVUdfREVDT0RFKCkpIFwKLQkJCQkJCQkJCXg4NmVtdV9kZWNvZGVfcHJpbnRmKHgpCi0jIGRlZmluZSBERUNPREVfUFJJTlRGMih4LHkpICAJaWYgKERFQlVHX0RFQ09ERSgpKSBcCi0JCQkJCQkJCQl4ODZlbXVfZGVjb2RlX3ByaW50ZjIoeCx5KQotCi0vKgotICogVGhlIGZvbGxvd2luZyBhbGxvdyB1cyB0byBsb29rIGF0IHRoZSBieXRlcyBvZiBhbiBpbnN0cnVjdGlvbi4gIFRoZQotICogZmlyc3QgSU5DUl9JTlNUUk5fTEVOLCBpcyBjYWxsZWQgZXZlcnl0aW1lIGJ5dGVzIGFyZSBjb25zdW1lZCBpbgotICogdGhlIGRlY29kaW5nIHByb2Nlc3MuICBUaGUgU0FWRV9JUF9DUyBpcyBjYWxsZWQgaW5pdGlhbGx5IHdoZW4gdGhlCi0gKiBtYWpvciBvcGNvZGUgb2YgdGhlIGluc3RydWN0aW9uIGlzIGFjY2Vzc2VkLgotICovCi0jZGVmaW5lIElOQ19ERUNPREVEX0lOU1RfTEVOKHgpICAgICAgICAgICAgICAgICAgICAJXAotCWlmIChERUJVR19ERUNPREUoKSkgIAkgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JCXg4NmVtdV9pbmNfZGVjb2RlZF9pbnN0X2xlbih4KQotCi0jZGVmaW5lIFNBVkVfSVBfQ1MoeCx5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQlcCi0JaWYgKERFQlVHX0RFQ09ERSgpIHwgREVCVUdfVFJBQ0VDQUxMKCkgfCBERUJVR19CUkVBSygpIFwKLQkgICAgICB8IERFQlVHX0lPX1RSQUNFKCkgfCBERUJVR19TQVZFX0lQX0NTKCkpIHsgXAotCQlNLng4Ni5zYXZlZF9jcyA9IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAJCQlcCi0JCU0ueDg2LnNhdmVkX2lwID0geTsgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCVwKLQl9Ci0jZWxzZQotIyBkZWZpbmUgSU5DX0RFQ09ERURfSU5TVF9MRU4oeCkKLSMgZGVmaW5lIERFQ09ERV9QUklOVEYoeCkKLSMgZGVmaW5lIERFQ09ERV9QUklOVEYyKHgseSkKLSMgZGVmaW5lIFNBVkVfSVBfQ1MoeCx5KQotI2VuZGlmCi0KLSNpZmRlZiBERUJVRwotI2RlZmluZSBUUkFDRV9SRUdTKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJXAotCWlmIChERUJVR19ESVNBU1NFTUJMRSgpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIAkJXAotCQl4ODZlbXVfanVzdF9kaXNhc3NlbWJsZSgpOyAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JCWdvdG8gRW5kT2ZUaGVJbnN0cnVjdGlvblByb2NlZHVyZTsgICAgICAgICAgICAgCQlcCi0JfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JaWYgKERFQlVHX1RSQUNFKCkgfHwgREVCVUdfREVDT0RFKCkpIFg4NkVNVV90cmFjZV9yZWdzKCkKLSNlbHNlCi0jIGRlZmluZSBUUkFDRV9SRUdTKCkKLSNlbmRpZgotCi0jaWZkZWYgREVCVUcKLSMgZGVmaW5lIFNJTkdMRV9TVEVQKCkJCWlmIChERUJVR19TVEVQKCkpIHg4NmVtdV9zaW5nbGVfc3RlcCgpCi0jZWxzZQotIyBkZWZpbmUgU0lOR0xFX1NURVAoKQotI2VuZGlmCi0KLSNkZWZpbmUgVFJBQ0VfQU5EX1NURVAoKQlcCi0JVFJBQ0VfUkVHUygpOwkJCVwKLQlTSU5HTEVfU1RFUCgpCi0KLSNpZmRlZiBERUJVRwotIyBkZWZpbmUgU1RBUlRfT0ZfSU5TVFIoKQotIyBkZWZpbmUgRU5EX09GX0lOU1RSKCkJCUVuZE9mVGhlSW5zdHJ1Y3Rpb25Qcm9jZWR1cmU6IHg4NmVtdV9lbmRfaW5zdHIoKTsKLSMgZGVmaW5lIEVORF9PRl9JTlNUUl9OT19UUkFDRSgpCXg4NmVtdV9lbmRfaW5zdHIoKTsKLSNlbHNlCi0jIGRlZmluZSBTVEFSVF9PRl9JTlNUUigpCi0jIGRlZmluZSBFTkRfT0ZfSU5TVFIoKQotIyBkZWZpbmUgRU5EX09GX0lOU1RSX05PX1RSQUNFKCkKLSNlbmRpZgotCi0jaWZkZWYgREVCVUcKLSMgZGVmaW5lICBDQUxMX1RSQUNFKHUsdix3LHgscykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JaWYgKERFQlVHX1RSQUNFQ0FMTFJFR1MoKSkJCQkJCQkJCQlcCi0JCXg4NmVtdV9kdW1wX3JlZ3MoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWlmIChERUJVR19UUkFDRUNBTEwoKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkJcHJpbnRrKCIlMDR4OiUwNHg6IENBTEwgJXMlMDR4OiUwNHhcbiIsIHUgLCB2LCBzLCB3LCB4KTsKLSMgZGVmaW5lIFJFVFVSTl9UUkFDRShuLHUsdikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JaWYgKERFQlVHX1RSQUNFQ0FMTFJFR1MoKSkJCQkJCQkJCQlcCi0JCXg4NmVtdV9kdW1wX3JlZ3MoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWlmIChERUJVR19UUkFDRUNBTEwoKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkJcHJpbnRrKCIlMDR4OiUwNHg6ICVzXG4iLHUsdixuKTsKLSNlbHNlCi0jIGRlZmluZSBDQUxMX1RSQUNFKHUsdix3LHgscykKLSMgZGVmaW5lIFJFVFVSTl9UUkFDRShuLHUsdikKLSNlbmRpZgotCi0jaWZkZWYgREVCVUcKLSNkZWZpbmUJREIoeCkJeAotI2Vsc2UKLSNkZWZpbmUJREIoeCkKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9uIFByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgICAgICAgICAgICAJCQkvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLwotI2VuZGlmCi0KLWV4dGVybiB2b2lkIHg4NmVtdV9pbmNfZGVjb2RlZF9pbnN0X2xlbiAoaW50IHgpOwotZXh0ZXJuIHZvaWQgeDg2ZW11X2RlY29kZV9wcmludGYgKGNoYXIgKngpOwotZXh0ZXJuIHZvaWQgeDg2ZW11X2RlY29kZV9wcmludGYyIChjaGFyICp4LCBpbnQgeSk7Ci1leHRlcm4gdm9pZCB4ODZlbXVfanVzdF9kaXNhc3NlbWJsZSAodm9pZCk7Ci1leHRlcm4gdm9pZCB4ODZlbXVfc2luZ2xlX3N0ZXAgKHZvaWQpOwotZXh0ZXJuIHZvaWQgeDg2ZW11X2VuZF9pbnN0ciAodm9pZCk7Ci1leHRlcm4gdm9pZCB4ODZlbXVfZHVtcF9yZWdzICh2b2lkKTsKLWV4dGVybiB2b2lkIHg4NmVtdV9kdW1wX3hyZWdzICh2b2lkKTsKLWV4dGVybiB2b2lkIHg4NmVtdV9wcmludF9pbnRfdmVjdCAodTE2IGl2KTsKLWV4dGVybiB2b2lkIHg4NmVtdV9pbnN0cnVtZW50X2luc3RydWN0aW9uICh2b2lkKTsKLWV4dGVybiB2b2lkIHg4NmVtdV9jaGVja19pcF9hY2Nlc3MgKHZvaWQpOwotZXh0ZXJuIHZvaWQgeDg2ZW11X2NoZWNrX3NwX2FjY2VzcyAodm9pZCk7Ci1leHRlcm4gdm9pZCB4ODZlbXVfY2hlY2tfbWVtX2FjY2VzcyAodTMyIHApOwotZXh0ZXJuIHZvaWQgeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzICh1aW50IHMsIHVpbnQgbyk7Ci0KLSNpZmRlZiAgX19jcGx1c3BsdXMKLX0gICAgICAgICAgICAgICAgICAgICAgIAkJCS8qIEVuZCBvZiAiQyIgbGlua2FnZSBmb3IgQysrICAgCSovCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fWDg2RU1VX0RFQlVHX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS94ODZlbXUvZGVjb2RlLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L2RlY29kZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjFhMzQ1Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS94ODZlbXUvZGVjb2RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKgkJCQkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0qCi0qICAgICAgICAgICAgCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogCQkJCSAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZwotKiAJCQkJCSAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAotKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0qICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCi0qICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCi0qICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubwotKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KLSogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0qCi0qICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0qICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi0qICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLSogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6CQlBTlNJIEMKLSogRW52aXJvbm1lbnQ6CUFueQotKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAotKgotKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIGZvciBpbnN0cnVjdGlvbiBkZWNvZGluZyBsb2dpYy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19YODZFTVVfREVDT0RFX0gKLSNkZWZpbmUgX19YODZFTVVfREVDT0RFX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hY3JvcyBhbmQgdHlwZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogSW5zdHJ1Y3Rpb24gRGVjb2RpbmcgU3R1ZmYgKi8KLQotI2RlZmluZSBGRVRDSF9ERUNPREVfTU9EUk0obW9kLHJoLHJsKSAJZmV0Y2hfZGVjb2RlX21vZHJtKCZtb2QsJnJoLCZybCkKLSNkZWZpbmUgREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocikgICAgCWRlY29kZV9ybV9ieXRlX3JlZ2lzdGVyKHIpCi0jZGVmaW5lIERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHIpICAgIAlkZWNvZGVfcm1fd29yZF9yZWdpc3RlcihyKQotI2RlZmluZSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyKSAgICAJZGVjb2RlX3JtX2xvbmdfcmVnaXN0ZXIocikKLSNkZWZpbmUgREVDT0RFX0NMRUFSX1NFR09WUigpICAgICAgICAgCU0ueDg2Lm1vZGUgJj0gflNZU01PREVfQ0xSTUFTSwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9uIFByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgICAgICAgICAgICAJCQkvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLwotI2VuZGlmCi0KLXZvaWQgCXg4NmVtdV9pbnRyX3JhaXNlICh1OCB0eXBlKTsKLXZvaWQgICAgZmV0Y2hfZGVjb2RlX21vZHJtIChpbnQgKm1vZCxpbnQgKnJlZ2gsaW50ICpyZWdsKTsKLXU4ICAgICAgZmV0Y2hfYnl0ZV9pbW0gKHZvaWQpOwotdTE2ICAgICBmZXRjaF93b3JkX2ltbSAodm9pZCk7Ci11MzIgICAgIGZldGNoX2xvbmdfaW1tICh2b2lkKTsKLXU4ICAgICAgZmV0Y2hfZGF0YV9ieXRlICh1aW50IG9mZnNldCk7Ci11OCAgICAgIGZldGNoX2RhdGFfYnl0ZV9hYnMgKHVpbnQgc2VnbWVudCwgdWludCBvZmZzZXQpOwotdTE2ICAgICBmZXRjaF9kYXRhX3dvcmQgKHVpbnQgb2Zmc2V0KTsKLXUxNiAgICAgZmV0Y2hfZGF0YV93b3JkX2FicyAodWludCBzZWdtZW50LCB1aW50IG9mZnNldCk7Ci11MzIgICAgIGZldGNoX2RhdGFfbG9uZyAodWludCBvZmZzZXQpOwotdTMyICAgICBmZXRjaF9kYXRhX2xvbmdfYWJzICh1aW50IHNlZ21lbnQsIHVpbnQgb2Zmc2V0KTsKLXZvaWQgICAgc3RvcmVfZGF0YV9ieXRlICh1aW50IG9mZnNldCwgdTggdmFsKTsKLXZvaWQgICAgc3RvcmVfZGF0YV9ieXRlX2FicyAodWludCBzZWdtZW50LCB1aW50IG9mZnNldCwgdTggdmFsKTsKLXZvaWQgICAgc3RvcmVfZGF0YV93b3JkICh1aW50IG9mZnNldCwgdTE2IHZhbCk7Ci12b2lkICAgIHN0b3JlX2RhdGFfd29yZF9hYnMgKHVpbnQgc2VnbWVudCwgdWludCBvZmZzZXQsIHUxNiB2YWwpOwotdm9pZCAgICBzdG9yZV9kYXRhX2xvbmcgKHVpbnQgb2Zmc2V0LCB1MzIgdmFsKTsKLXZvaWQgICAgc3RvcmVfZGF0YV9sb25nX2FicyAodWludCBzZWdtZW50LCB1aW50IG9mZnNldCwgdTMyIHZhbCk7Ci11OCogCWRlY29kZV9ybV9ieXRlX3JlZ2lzdGVyKGludCByZWcpOwotdTE2KiAJZGVjb2RlX3JtX3dvcmRfcmVnaXN0ZXIoaW50IHJlZyk7Ci11MzIqIAlkZWNvZGVfcm1fbG9uZ19yZWdpc3RlcihpbnQgcmVnKTsKLXUxNiogCWRlY29kZV9ybV9zZWdfcmVnaXN0ZXIoaW50IHJlZyk7Ci11bnNpZ25lZCBkZWNvZGVfcm0wMF9hZGRyZXNzKGludCBybSk7Ci11bnNpZ25lZCBkZWNvZGVfcm0wMV9hZGRyZXNzKGludCBybSk7Ci11bnNpZ25lZCBkZWNvZGVfcm0xMF9hZGRyZXNzKGludCBybSk7Ci0KLSNpZmRlZiAgX19jcGx1c3BsdXMKLX0gICAgICAgICAgICAgICAgICAgICAgIAkJCS8qIEVuZCBvZiAiQyIgbGlua2FnZSBmb3IgQysrICAgCSovCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fWDg2RU1VX0RFQ09ERV9IICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L2ZwdS5oIGIvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3g4NmVtdS9mcHUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZiMjcxNC4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L2ZwdS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSoJCQkJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQotKgotKiAgICAgICAgICAgIAlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCi0qIAkJCQkgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKLSogCQkJCQkgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKLSogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKLSogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLSogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgotKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAotKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KLSogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCi0qICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotKgotKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi0qICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi0qICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgotKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgotKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCi0qICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCi0qICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qIExhbmd1YWdlOgkJQU5TSSBDCi0qIEVudmlyb25tZW50OglBbnkKLSogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKLSoKLSogRGVzY3JpcHRpb246ICBIZWFkZXIgZmlsZSBmb3IgRlBVIGluc3RydWN0aW9uIGRlY29kaW5nLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX1g4NkVNVV9GUFVfSAotI2RlZmluZSBfX1g4NkVNVV9GUFVfSAotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgICAgICAgICAgICAJCQkvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLwotI2VuZGlmCi0KLS8qIHRoZXNlIGhhdmUgdG8gYmUgZGVmaW5lZCwgd2hldGhlciA4MDg3IHN1cHBvcnQgY29tcGlsZWQgaW4gb3Igbm90LiAqLwotCi1leHRlcm4gdm9pZCB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2Q4ICh1OCBvcDEpOwotZXh0ZXJuIHZvaWQgeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kOSAodTggb3AxKTsKLWV4dGVybiB2b2lkIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZGEgKHU4IG9wMSk7Ci1leHRlcm4gdm9pZCB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RiICh1OCBvcDEpOwotZXh0ZXJuIHZvaWQgeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kYyAodTggb3AxKTsKLWV4dGVybiB2b2lkIHg4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZGQgKHU4IG9wMSk7Ci1leHRlcm4gdm9pZCB4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RlICh1OCBvcDEpOwotZXh0ZXJuIHZvaWQgeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kZiAodTggb3AxKTsKLQotI2lmZGVmICBfX2NwbHVzcGx1cwotfSAgICAgICAgICAgICAgICAgICAgICAgCQkJLyogRW5kIG9mICJDIiBsaW5rYWdlIGZvciBDKysgICAJKi8KLSNlbmRpZgotCi0jZW5kaWYgLyogX19YODZFTVVfRlBVX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS94ODZlbXUvb3BzLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L29wcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWVhNjc2Li4wMDAwMDAwCi0tLSBhL2JvYXJkL01BSS9iaW9zX2VtdWxhdG9yL3NjaXRlY2gvc3JjL3g4NmVtdS94ODZlbXUvb3BzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKgkJCQkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5Ci0qCi0qICAgICAgICAgICAgCUNvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KLSogCQkJCSAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZwotKiAJCQkJCSAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAotKgotKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qCi0qICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAotKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAotKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi0qICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCi0qICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCi0qICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubwotKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KLSogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0qCi0qICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLSogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLSogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi0qICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCi0qICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKLSogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLSogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogTGFuZ3VhZ2U6CQlBTlNJIEMKLSogRW52aXJvbm1lbnQ6CUFueQotKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAotKgotKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIGZvciBvcGVyYW5kIGRlY29kaW5nIGZ1bmN0aW9ucy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19YODZFTVVfT1BTX0gKLSNkZWZpbmUgX19YODZFTVVfT1BTX0gKLQotZXh0ZXJuIHZvaWQgKCp4ODZlbXVfb3B0YWJbMHgxMDBdKSh1OCBvcDEpOwotZXh0ZXJuIHZvaWQgKCp4ODZlbXVfb3B0YWIyWzB4MTAwXSkodTggb3AyKTsKLQotI2VuZGlmIC8qIF9fWDg2RU1VX09QU19IICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L3ByaW1fYXNtLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L3ByaW1fYXNtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMjNjZjguLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3g4NmVtdS9wcmltX2FzbS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qCQkJCQkJUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKLSoKLSogICAgICAgICAgICAJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAJCQkJICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCi0qIAkJCQkJICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCi0qICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0qICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci0qICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKLSogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKLSogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCi0qICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgotKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSoKLSogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKLSogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgotKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZToJCVdhdGNvbSBDKysgMTAuNiBvciBsYXRlcgotKiBFbnZpcm9ubWVudDoJQW55Ci0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgSW5saW5lIGFzc2VtYmxlciB2ZXJzaW9ucyBvZiB0aGUgcHJpbWl0aXZlIG9wZXJhbmQKLSoJCQkJZnVuY3Rpb25zIGZvciBmYXN0ZXIgcGVyZm9ybWFuY2UuIEF0IHRoZSBtb21lbnQgdGhpcyBpcwotKgkJCQl4ODYgaW5saW5lIGFzc2VtYmxlciwgYnV0IHRoZXNlIGZ1bmN0aW9ucyBjb3VsZCBiZSByZXBsYWNlZAotKgkJCQl3aXRoIG5hdGl2ZSBpbmxpbmUgYXNzZW1ibGVyIGZvciBlYWNoIHN1cHBvcnRlZCBwcm9jZXNzb3IKLSoJCQkJcGxhdGZvcm0uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmCV9fWDg2RU1VX1BSSU1fQVNNX0gKLSNkZWZpbmUJX19YODZFTVVfUFJJTV9BU01fSAotCi0jaWZkZWYJX19XQVRDT01DX18KLQotI2lmbmRlZglWQUxJREFURQotI2RlZmluZQlfX0hBVkVfSU5MSU5FX0FTU0VNQkxFUl9fCi0jZW5kaWYKLQotdTMyCQlnZXRfZmxhZ3NfYXNtKHZvaWQpOwotI3ByYWdtYSBhdXggZ2V0X2ZsYWdzX2FzbSA9CQkJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJZWF4IiAgICAgICAgICAgICAgICAgIAlcCi0JdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtlYXhdOwotCi11MTYgICAgIGFhYV93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkKTsKLSNwcmFnbWEgYXV4IGFhYV93b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJhYWEiICAgICAgICAgICAgICAgICAgCQkJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYXhdIAkJCQlcCi0JdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtheF07Ci0KLXUxNiAgICAgYWFzX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQpOwotI3ByYWdtYSBhdXggYWFzX3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImFhcyIgICAgICAgICAgICAgICAgICAJCQlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtheF0gCQkJCVwKLQl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2F4XTsKLQotdTE2ICAgICBhYWRfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCk7Ci0jcHJhZ21hIGF1eCBhYWRfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiYWFkIiAgICAgICAgICAgICAgICAgIAkJCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2F4XSAJCQkJXAotCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYXhdOwotCi11MTYgICAgIGFhbV93b3JkX2FzbSh1MzIgKmZsYWdzLHU4IGQpOwotI3ByYWdtYSBhdXggYWFtX3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImFhbSIgICAgICAgICAgICAgICAgICAJCQlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFthbF0gCQkJCVwKLQl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2F4XTsKLQotdTggICAgICBhZGNfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IGFkY19ieXRlX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJhZGMJYWwsYmwiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYWxdIFtibF0gICAgICAgICAgICBcCi0JdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFthbCBibF07Ci0KLXUxNiAgICAgYWRjX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHUxNiBzKTsKLSNwcmFnbWEgYXV4IGFkY193b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJhZGMJYXgsYngiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYXhdIFtieF0gICAgICAgICAgICBcCi0JdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtheCBieF07Ci0KLXUzMiAgICAgYWRjX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQsIHUzMiBzKTsKLSNwcmFnbWEgYXV4IGFkY19sb25nX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJhZGMJZWF4LGVieCIgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbZWF4XSBbZWJ4XSAgICAgICAgICBcCi0JdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtlYXggZWJ4XTsKLQotdTggICAgICBhZGRfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IGFkZF9ieXRlX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJhZGQJYWwsYmwiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYWxdIFtibF0gICAgICAgICAgICBcCi0JdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFthbCBibF07Ci0KLXUxNiAgICAgYWRkX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHUxNiBzKTsKLSNwcmFnbWEgYXV4IGFkZF93b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJhZGQJYXgsYngiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYXhdIFtieF0gICAgICAgICAgICBcCi0JdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtheCBieF07Ci0KLXUzMiAgICAgYWRkX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQsIHUzMiBzKTsKLSNwcmFnbWEgYXV4IGFkZF9sb25nX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJhZGQJZWF4LGVieCIgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbZWF4XSBbZWJ4XSAgICAgICAgICBcCi0JdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtlYXggZWJ4XTsKLQotdTggICAgICBhbmRfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IGFuZF9ieXRlX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJhbmQJYWwsYmwiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYWxdIFtibF0gICAgICAgICAgICBcCi0JdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFthbCBibF07Ci0KLXUxNiAgICAgYW5kX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHUxNiBzKTsKLSNwcmFnbWEgYXV4IGFuZF93b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJhbmQJYXgsYngiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYXhdIFtieF0gICAgICAgICAgICBcCi0JdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtheCBieF07Ci0KLXUzMiAgICAgYW5kX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQsIHUzMiBzKTsKLSNwcmFnbWEgYXV4IGFuZF9sb25nX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJhbmQJZWF4LGVieCIgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbZWF4XSBbZWJ4XSAgICAgICAgICBcCi0JdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtlYXggZWJ4XTsKLQotdTggICAgICBjbXBfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IGNtcF9ieXRlX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJjbXAJYWwsYmwiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYWxdIFtibF0gICAgICAgICAgICBcCi0JdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFthbCBibF07Ci0KLXUxNiAgICAgY21wX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHUxNiBzKTsKLSNwcmFnbWEgYXV4IGNtcF93b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJjbXAJYXgsYngiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYXhdIFtieF0gICAgICAgICAgICBcCi0JdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtheCBieF07Ci0KLXUzMiAgICAgY21wX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQsIHUzMiBzKTsKLSNwcmFnbWEgYXV4IGNtcF9sb25nX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJjbXAJZWF4LGVieCIgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbZWF4XSBbZWJ4XSAgICAgICAgICBcCi0JdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtlYXggZWJ4XTsKLQotdTggICAgICBkYWFfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkKTsKLSNwcmFnbWEgYXV4IGRhYV9ieXRlX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJkYWEiICAgICAgICAgICAgICAgICAgCQkJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYWxdICAgICAgICAgICAgCQlcCi0JdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFthbF07Ci0KLXU4ICAgICAgZGFzX2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggZCk7Ci0jcHJhZ21hIGF1eCBkYXNfYnl0ZV9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiZGFzIiAgICAgICAgICAgICAgICAgIAkJCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2FsXSAgICAgICAgICAgIAkJXAotCXZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYWxdOwotCi11OCAgICAgIGRlY19ieXRlX2FzbSh1MzIgKmZsYWdzLHU4IGQpOwotI3ByYWdtYSBhdXggZGVjX2J5dGVfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImRlYwlhbCIgICAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYWxdICAgICAgICAgICAgCQlcCi0JdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFthbF07Ci0KLXUxNiAgICAgZGVjX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQpOwotI3ByYWdtYSBhdXggZGVjX3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImRlYwlheCIgICAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYXhdICAgICAgICAgICAgCQlcCi0JdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtheF07Ci0KLXUzMiAgICAgZGVjX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQpOwotI3ByYWdtYSBhdXggZGVjX2xvbmdfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImRlYwllYXgiICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtlYXhdICAgICAgICAgIAkJXAotCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbZWF4XTsKLQotdTggICAgICBpbmNfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkKTsKLSNwcmFnbWEgYXV4IGluY19ieXRlX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJpbmMJYWwiICAgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2FsXSAgICAgICAgICAgIAkJXAotCXZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYWxdOwotCi11MTYgICAgIGluY193b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkKTsKLSNwcmFnbWEgYXV4IGluY193b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJpbmMJYXgiICAgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2F4XSAgICAgICAgICAgIAkJXAotCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYXhdOwotCi11MzIgICAgIGluY19sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiBkKTsKLSNwcmFnbWEgYXV4IGluY19sb25nX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJpbmMJZWF4IiAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbZWF4XSAgICAgICAgICAJCVwKLQl2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2VheF07Ci0KLXU4ICAgICAgb3JfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IG9yX2J5dGVfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JIm9yCWFsLGJsIiAgICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFthbF0gW2JsXSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2FsIGJsXTsKLQotdTE2ICAgICBvcl93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkLCB1MTYgcyk7Ci0jcHJhZ21hIGF1eCBvcl93b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJvcglheCxieCIgICAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYXhdIFtieF0gICAgICAgICAgICBcCi0JdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtheCBieF07Ci0KLXUzMiAgICAgb3JfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCwgdTMyIHMpOwotI3ByYWdtYSBhdXggb3JfbG9uZ19hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkib3IJZWF4LGVieCIgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2VheF0gW2VieF0gICAgICAgICAgXAotCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbZWF4IGVieF07Ci0KLXU4ICAgICAgbmVnX2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggZCk7Ci0jcHJhZ21hIGF1eCBuZWdfYnl0ZV9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkibmVnCWFsIiAgICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFthbF0gICAgICAgICAgICAJCVwKLQl2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2FsXTsKLQotdTE2ICAgICBuZWdfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCk7Ci0jcHJhZ21hIGF1eCBuZWdfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkibmVnCWF4IiAgICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtheF0gICAgICAgICAgICAJCVwKLQl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2F4XTsKLQotdTMyICAgICBuZWdfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCk7Ci0jcHJhZ21hIGF1eCBuZWdfbG9uZ19hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkibmVnCWVheCIgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2VheF0gICAgICAgICAgCQlcCi0JdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtlYXhdOwotCi11OCAgICAgIG5vdF9ieXRlX2FzbSh1MzIgKmZsYWdzLHU4IGQpOwotI3ByYWdtYSBhdXggbm90X2J5dGVfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JIm5vdAlhbCIgICAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYWxdICAgICAgICAgICAgCQlcCi0JdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFthbF07Ci0KLXUxNiAgICAgbm90X3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQpOwotI3ByYWdtYSBhdXggbm90X3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JIm5vdAlheCIgICAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYXhdICAgICAgICAgICAgCQlcCi0JdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtheF07Ci0KLXUzMiAgICAgbm90X2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQpOwotI3ByYWdtYSBhdXggbm90X2xvbmdfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JIm5vdAllYXgiICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtlYXhdICAgICAgICAgIAkJXAotCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbZWF4XTsKLQotdTggICAgICByY2xfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHJjbF9ieXRlX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJyY2wJYWwsY2wiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYWxdIFtjbF0gICAgICAgICAgICBcCi0JdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFthbCBjbF07Ci0KLXUxNiAgICAgcmNsX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHU4IHMpOwotI3ByYWdtYSBhdXggcmNsX3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInJjbAlheCxjbCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtheF0gW2NsXSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2F4IGNsXTsKLQotdTMyICAgICByY2xfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCByY2xfbG9uZ19hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkicmNsCWVheCxjbCIgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2VheF0gW2NsXSAgICAgICAgICAJXAotCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbZWF4IGNsXTsKLQotdTggICAgICByY3JfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHJjcl9ieXRlX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJyY3IJYWwsY2wiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYWxdIFtjbF0gICAgICAgICAgICBcCi0JdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFthbCBjbF07Ci0KLXUxNiAgICAgcmNyX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHU4IHMpOwotI3ByYWdtYSBhdXggcmNyX3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInJjcglheCxjbCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtheF0gW2NsXSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2F4IGNsXTsKLQotdTMyICAgICByY3JfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCByY3JfbG9uZ19hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkicmNyCWVheCxjbCIgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2VheF0gW2NsXSAgICAgICAgICAJXAotCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbZWF4IGNsXTsKLQotdTggICAgICByb2xfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHJvbF9ieXRlX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJyb2wJYWwsY2wiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYWxdIFtjbF0gICAgICAgICAgICBcCi0JdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFthbCBjbF07Ci0KLXUxNiAgICAgcm9sX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHU4IHMpOwotI3ByYWdtYSBhdXggcm9sX3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInJvbAlheCxjbCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtheF0gW2NsXSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2F4IGNsXTsKLQotdTMyICAgICByb2xfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCByb2xfbG9uZ19hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkicm9sCWVheCxjbCIgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2VheF0gW2NsXSAgICAgICAgICAJXAotCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbZWF4IGNsXTsKLQotdTggICAgICByb3JfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHJvcl9ieXRlX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJyb3IJYWwsY2wiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYWxdIFtjbF0gICAgICAgICAgICBcCi0JdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFthbCBjbF07Ci0KLXUxNiAgICAgcm9yX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHU4IHMpOwotI3ByYWdtYSBhdXggcm9yX3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInJvcglheCxjbCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtheF0gW2NsXSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2F4IGNsXTsKLQotdTMyICAgICByb3JfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCByb3JfbG9uZ19hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkicm9yCWVheCxjbCIgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2VheF0gW2NsXSAgICAgICAgICAJXAotCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbZWF4IGNsXTsKLQotdTggICAgICBzaGxfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHNobF9ieXRlX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJzaGwJYWwsY2wiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYWxdIFtjbF0gICAgICAgICAgICBcCi0JdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFthbCBjbF07Ci0KLXUxNiAgICAgc2hsX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHU4IHMpOwotI3ByYWdtYSBhdXggc2hsX3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInNobAlheCxjbCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtheF0gW2NsXSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2F4IGNsXTsKLQotdTMyICAgICBzaGxfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCBzaGxfbG9uZ19hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkic2hsCWVheCxjbCIgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2VheF0gW2NsXSAgICAgICAgICAJXAotCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbZWF4IGNsXTsKLQotdTggICAgICBzaHJfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHNocl9ieXRlX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJzaHIJYWwsY2wiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYWxdIFtjbF0gICAgICAgICAgICBcCi0JdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFthbCBjbF07Ci0KLXUxNiAgICAgc2hyX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHU4IHMpOwotI3ByYWdtYSBhdXggc2hyX3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInNocglheCxjbCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtheF0gW2NsXSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2F4IGNsXTsKLQotdTMyICAgICBzaHJfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCBzaHJfbG9uZ19hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkic2hyCWVheCxjbCIgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2VheF0gW2NsXSAgICAgICAgICAJXAotCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbZWF4IGNsXTsKLQotdTggICAgICBzYXJfYnl0ZV9hc20odTMyICpmbGFncyx1OCBkLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHNhcl9ieXRlX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJzYXIJYWwsY2wiICAgICAgICAgICAgICAgICAgXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JcGFybSBbZWRpXSBbYWxdIFtjbF0gICAgICAgICAgICBcCi0JdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCi0JbW9kaWZ5IGV4YWN0IFthbCBjbF07Ci0KLXUxNiAgICAgc2FyX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHU4IHMpOwotI3ByYWdtYSBhdXggc2FyX3dvcmRfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JInNhcglheCxjbCIgICAgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtheF0gW2NsXSAgICAgICAgICAgIFwKLQl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2F4IGNsXTsKLQotdTMyICAgICBzYXJfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCBzYXJfbG9uZ19hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkic2FyCWVheCxjbCIgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2VheF0gW2NsXSAgICAgICAgICAJXAotCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbZWF4IGNsXTsKLQotdTE2CQlzaGxkX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2IGQsIHUxNiBmaWxsLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHNobGRfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkic2hsZAlheCxkeCxjbCIgICAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtheF0gW2R4XSBbY2xdICAgICAgIFwKLQl2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2F4IGR4IGNsXTsKLQotdTMyICAgICBzaGxkX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyIGQsIHUzMiBmaWxsLCB1OCBzKTsKLSNwcmFnbWEgYXV4IHNobGRfbG9uZ19hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkic2hsZAllYXgsZWR4LGNsIiAgICAgICAgICAgICBcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQlwYXJtIFtlZGldIFtlYXhdIFtlZHhdIFtjbF0gICAgIFwKLQl2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKLQltb2RpZnkgZXhhY3QgW2VheCBlZHggY2xdOwotCi11MTYJCXNocmRfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCwgdTE2IGZpbGwsIHU4IHMpOwotI3ByYWdtYSBhdXggc2hyZF93b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJzaHJkCWF4LGR4LGNsIiAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2F4XSBbZHhdIFtjbF0gICAgICAgXAotCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYXggZHggY2xdOwotCi11MzIgICAgIHNocmRfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCwgdTMyIGZpbGwsIHU4IHMpOwotI3ByYWdtYSBhdXggc2hyZF9sb25nX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJzaHJkCWVheCxlZHgsY2wiICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2VheF0gW2VkeF0gW2NsXSAgICAgXAotCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbZWF4IGVkeCBjbF07Ci0KLXU4ICAgICAgc2JiX2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCBzYmJfYnl0ZV9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkic2JiCWFsLGJsIiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2FsXSBbYmxdICAgICAgICAgICAgXAotCXZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYWwgYmxdOwotCi11MTYgICAgIHNiYl93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkLCB1MTYgcyk7Ci0jcHJhZ21hIGF1eCBzYmJfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkic2JiCWF4LGJ4IiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2F4XSBbYnhdICAgICAgICAgICAgXAotCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYXggYnhdOwotCi11MzIgICAgIHNiYl9sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiBkLCB1MzIgcyk7Ci0jcHJhZ21hIGF1eCBzYmJfbG9uZ19hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkic2JiCWVheCxlYngiICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2VheF0gW2VieF0gICAgICAgICAgXAotCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbZWF4IGVieF07Ci0KLXU4ICAgICAgc3ViX2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCBzdWJfYnl0ZV9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkic3ViCWFsLGJsIiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2FsXSBbYmxdICAgICAgICAgICAgXAotCXZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYWwgYmxdOwotCi11MTYgICAgIHN1Yl93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkLCB1MTYgcyk7Ci0jcHJhZ21hIGF1eCBzdWJfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkic3ViCWF4LGJ4IiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2F4XSBbYnhdICAgICAgICAgICAgXAotCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYXggYnhdOwotCi11MzIgICAgIHN1Yl9sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiBkLCB1MzIgcyk7Ci0jcHJhZ21hIGF1eCBzdWJfbG9uZ19hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkic3ViCWVheCxlYngiICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2VheF0gW2VieF0gICAgICAgICAgXAotCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbZWF4IGVieF07Ci0KLXZvaWQJdGVzdF9ieXRlX2FzbSh1MzIgKmZsYWdzLHU4IGQsIHU4IHMpOwotI3ByYWdtYSBhdXggdGVzdF9ieXRlX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJ0ZXN0CWFsLGJsIiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2FsXSBbYmxdICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYWwgYmxdOwotCi12b2lkCXRlc3Rfd29yZF9hc20odTMyICpmbGFncyx1MTYgZCwgdTE2IHMpOwotI3ByYWdtYSBhdXggdGVzdF93b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJ0ZXN0CWF4LGJ4IiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2F4XSBbYnhdICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYXggYnhdOwotCi12b2lkCXRlc3RfbG9uZ19hc20odTMyICpmbGFncyx1MzIgZCwgdTMyIHMpOwotI3ByYWdtYSBhdXggdGVzdF9sb25nX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJ0ZXN0CWVheCxlYngiICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2VheF0gW2VieF0gICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbZWF4IGVieF07Ci0KLXU4ICAgICAgeG9yX2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggZCwgdTggcyk7Ci0jcHJhZ21hIGF1eCB4b3JfYnl0ZV9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkieG9yCWFsLGJsIiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2FsXSBbYmxdICAgICAgICAgICAgXAotCXZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYWwgYmxdOwotCi11MTYgICAgIHhvcl93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiBkLCB1MTYgcyk7Ci0jcHJhZ21hIGF1eCB4b3Jfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkieG9yCWF4LGJ4IiAgICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2F4XSBbYnhdICAgICAgICAgICAgXAotCXZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbYXggYnhdOwotCi11MzIgICAgIHhvcl9sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiBkLCB1MzIgcyk7Ci0jcHJhZ21hIGF1eCB4b3JfbG9uZ19hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkieG9yCWVheCxlYngiICAgICAgICAgICAgICAgIFwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCXBhcm0gW2VkaV0gW2VheF0gW2VieF0gICAgICAgICAgXAotCXZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAotCW1vZGlmeSBleGFjdCBbZWF4IGVieF07Ci0KLXZvaWQgICAgaW11bF9ieXRlX2FzbSh1MzIgKmZsYWdzLHUxNiAqYXgsdTggZCx1OCBzKTsKLSNwcmFnbWEgYXV4IGltdWxfYnl0ZV9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiaW11bAlibCIgICAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JIm1vdglbZXNpXSxheCIJCQkJXAotCXBhcm0gW2VkaV0gW2VzaV0gW2FsXSBbYmxdICAgICAgXAotCW1vZGlmeSBleGFjdCBbZXNpIGF4IGJsXTsKLQotdm9pZCAgICBpbXVsX3dvcmRfYXNtKHUzMiAqZmxhZ3MsdTE2ICpheCx1MTYgKmR4LHUxNiBkLHUxNiBzKTsKLSNwcmFnbWEgYXV4IGltdWxfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiaW11bAlieCIgICAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JIm1vdglbZXNpXSxheCIJCQkJXAotCSJtb3YJW2VjeF0sZHgiCQkJCVwKLQlwYXJtIFtlZGldIFtlc2ldIFtlY3hdIFtheF0gW2J4XVwKLQltb2RpZnkgZXhhY3QgW2VzaSBlZGkgYXggYnggZHhdOwotCi12b2lkICAgIGltdWxfbG9uZ19hc20odTMyICpmbGFncyx1MzIgKmVheCx1MzIgKmVkeCx1MzIgZCx1MzIgcyk7Ci0jcHJhZ21hIGF1eCBpbXVsX2xvbmdfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JImltdWwJZWJ4IiAgICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkibW92CVtlc2ldLGVheCIJCQkJXAotCSJtb3YJW2VjeF0sZWR4IgkJCQlcCi0JcGFybSBbZWRpXSBbZXNpXSBbZWN4XSBbZWF4XSBbZWJ4XSBcCi0JbW9kaWZ5IGV4YWN0IFtlc2kgZWRpIGVheCBlYnggZWR4XTsKLQotdm9pZCAgICBtdWxfYnl0ZV9hc20odTMyICpmbGFncyx1MTYgKmF4LHU4IGQsdTggcyk7Ci0jcHJhZ21hIGF1eCBtdWxfYnl0ZV9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkibXVsCWJsIiAgICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkibW92CVtlc2ldLGF4IgkJCQlcCi0JcGFybSBbZWRpXSBbZXNpXSBbYWxdIFtibF0gICAgICBcCi0JbW9kaWZ5IGV4YWN0IFtlc2kgYXggYmxdOwotCi12b2lkICAgIG11bF93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiAqYXgsdTE2ICpkeCx1MTYgZCx1MTYgcyk7Ci0jcHJhZ21hIGF1eCBtdWxfd29yZF9hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkibXVsCWJ4IiAgICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkibW92CVtlc2ldLGF4IgkJCQlcCi0JIm1vdglbZWN4XSxkeCIJCQkJXAotCXBhcm0gW2VkaV0gW2VzaV0gW2VjeF0gW2F4XSBbYnhdXAotCW1vZGlmeSBleGFjdCBbZXNpIGVkaSBheCBieCBkeF07Ci0KLXZvaWQgICAgbXVsX2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyICplYXgsdTMyICplZHgsdTMyIGQsdTMyIHMpOwotI3ByYWdtYSBhdXggbXVsX2xvbmdfYXNtID0JCQlcCi0JInB1c2gJW2VkaV0iICAgICAgICAgICAgCQlcCi0JInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0JIm11bAllYngiICAgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJtb3YJW2VzaV0sZWF4IgkJCQlcCi0JIm1vdglbZWN4XSxlZHgiCQkJCVwKLQlwYXJtIFtlZGldIFtlc2ldIFtlY3hdIFtlYXhdIFtlYnhdIFwKLQltb2RpZnkgZXhhY3QgW2VzaSBlZGkgZWF4IGVieCBlZHhdOwotCi12b2lkCWlkaXZfYnl0ZV9hc20odTMyICpmbGFncyx1OCAqYWwsdTggKmFoLHUxNiBkLHU4IHMpOwotI3ByYWdtYSBhdXggaWRpdl9ieXRlX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJpZGl2CWJsIiAgICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkibW92CVtlc2ldLGFsIgkJCQlcCi0JIm1vdglbZWN4XSxhaCIJCQkJXAotCXBhcm0gW2VkaV0gW2VzaV0gW2VjeF0gW2F4XSBbYmxdXAotCW1vZGlmeSBleGFjdCBbZXNpIGVkaSBheCBibF07Ci0KLXZvaWQJaWRpdl93b3JkX2FzbSh1MzIgKmZsYWdzLHUxNiAqYXgsdTE2ICpkeCx1MTYgZGxvLHUxNiBkaGksdTE2IHMpOwotI3ByYWdtYSBhdXggaWRpdl93b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJpZGl2CWJ4IiAgICAgICAgICAgICAgICAgIAlcCi0JInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JInBvcAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkibW92CVtlc2ldLGF4IgkJCQlcCi0JIm1vdglbZWN4XSxkeCIJCQkJXAotCXBhcm0gW2VkaV0gW2VzaV0gW2VjeF0gW2F4XSBbZHhdIFtieF1cCi0JbW9kaWZ5IGV4YWN0IFtlc2kgZWRpIGF4IGR4IGJ4XTsKLQotdm9pZAlpZGl2X2xvbmdfYXNtKHUzMiAqZmxhZ3MsdTMyICplYXgsdTMyICplZHgsdTMyIGRsbyx1MzIgZGhpLHUzMiBzKTsKLSNwcmFnbWEgYXV4IGlkaXZfbG9uZ19hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiaWRpdgllYngiICAgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJtb3YJW2VzaV0sZWF4IgkJCQlcCi0JIm1vdglbZWN4XSxlZHgiCQkJCVwKLQlwYXJtIFtlZGldIFtlc2ldIFtlY3hdIFtlYXhdIFtlZHhdIFtlYnhdXAotCW1vZGlmeSBleGFjdCBbZXNpIGVkaSBlYXggZWR4IGVieF07Ci0KLXZvaWQJZGl2X2J5dGVfYXNtKHUzMiAqZmxhZ3MsdTggKmFsLHU4ICphaCx1MTYgZCx1OCBzKTsKLSNwcmFnbWEgYXV4IGRpdl9ieXRlX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJkaXYJYmwiICAgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJtb3YJW2VzaV0sYWwiCQkJCVwKLQkibW92CVtlY3hdLGFoIgkJCQlcCi0JcGFybSBbZWRpXSBbZXNpXSBbZWN4XSBbYXhdIFtibF1cCi0JbW9kaWZ5IGV4YWN0IFtlc2kgZWRpIGF4IGJsXTsKLQotdm9pZAlkaXZfd29yZF9hc20odTMyICpmbGFncyx1MTYgKmF4LHUxNiAqZHgsdTE2IGRsbyx1MTYgZGhpLHUxNiBzKTsKLSNwcmFnbWEgYXV4IGRpdl93b3JkX2FzbSA9CQkJXAotCSJwdXNoCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAJXAotCSJkaXYJYngiICAgICAgICAgICAgICAgICAgCVwKLQkicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkicG9wCVtlZGldIiAgICAgICAgICAgIAkJXAotCSJtb3YJW2VzaV0sYXgiCQkJCVwKLQkibW92CVtlY3hdLGR4IgkJCQlcCi0JcGFybSBbZWRpXSBbZXNpXSBbZWN4XSBbYXhdIFtkeF0gW2J4XVwKLQltb2RpZnkgZXhhY3QgW2VzaSBlZGkgYXggZHggYnhdOwotCi12b2lkCWRpdl9sb25nX2FzbSh1MzIgKmZsYWdzLHUzMiAqZWF4LHUzMiAqZWR4LHUzMiBkbG8sdTMyIGRoaSx1MzIgcyk7Ci0jcHJhZ21hIGF1eCBkaXZfbG9uZ19hc20gPQkJCVwKLQkicHVzaAlbZWRpXSIgICAgICAgICAgICAJCVwKLQkicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLQkiZGl2CWVieCIgICAgICAgICAgICAgICAgICAJXAotCSJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSJwb3AJW2VkaV0iICAgICAgICAgICAgCQlcCi0JIm1vdglbZXNpXSxlYXgiCQkJCVwKLQkibW92CVtlY3hdLGVkeCIJCQkJXAotCXBhcm0gW2VkaV0gW2VzaV0gW2VjeF0gW2VheF0gW2VkeF0gW2VieF1cCi0JbW9kaWZ5IGV4YWN0IFtlc2kgZWRpIGVheCBlZHggZWJ4XTsKLQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX1g4NkVNVV9QUklNX0FTTV9IICovCmRpZmYgLS1naXQgYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L3ByaW1fb3BzLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L3ByaW1fb3BzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MzNmZTEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3g4NmVtdS9wcmltX29wcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qCQkJCQkJUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKLSoKLSogICAgICAgICAgICAJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAJCQkJICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCi0qIAkJCQkJICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCi0qICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0qICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci0qICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKLSogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKLSogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCi0qICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgotKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSoKLSogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKLSogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgotKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZToJCUFOU0kgQwotKiBFbnZpcm9ubWVudDoJQW55Ci0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIHByaW1pdGl2ZSBvcGVyYXRpb24gZnVuY3Rpb25zLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX1g4NkVNVV9QUklNX09QU19ICi0jZGVmaW5lIF9fWDg2RU1VX1BSSU1fT1BTX0gKLQotI2luY2x1ZGUgIng4NmVtdS9wcmltX2FzbS5oIgotCi0jaWZkZWYgIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgICAgICAgICAgICAJCQkvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLwotI2VuZGlmCi0KLXUxNiAgICAgYWFhX3dvcmQgKHUxNiBkKTsKLXUxNiAgICAgYWFzX3dvcmQgKHUxNiBkKTsKLXUxNiAgICAgYWFkX3dvcmQgKHUxNiBkKTsKLXUxNiAgICAgYWFtX3dvcmQgKHU4IGQpOwotdTggICAgICBhZGNfYnl0ZSAodTggZCwgdTggcyk7Ci11MTYgICAgIGFkY193b3JkICh1MTYgZCwgdTE2IHMpOwotdTMyICAgICBhZGNfbG9uZyAodTMyIGQsIHUzMiBzKTsKLXU4ICAgICAgYWRkX2J5dGUgKHU4IGQsIHU4IHMpOwotdTE2ICAgICBhZGRfd29yZCAodTE2IGQsIHUxNiBzKTsKLXUzMiAgICAgYWRkX2xvbmcgKHUzMiBkLCB1MzIgcyk7Ci11OCAgICAgIGFuZF9ieXRlICh1OCBkLCB1OCBzKTsKLXUxNiAgICAgYW5kX3dvcmQgKHUxNiBkLCB1MTYgcyk7Ci11MzIgICAgIGFuZF9sb25nICh1MzIgZCwgdTMyIHMpOwotdTggICAgICBjbXBfYnl0ZSAodTggZCwgdTggcyk7Ci11MTYgICAgIGNtcF93b3JkICh1MTYgZCwgdTE2IHMpOwotdTMyICAgICBjbXBfbG9uZyAodTMyIGQsIHUzMiBzKTsKLXU4ICAgICAgZGFhX2J5dGUgKHU4IGQpOwotdTggICAgICBkYXNfYnl0ZSAodTggZCk7Ci11OCAgICAgIGRlY19ieXRlICh1OCBkKTsKLXUxNiAgICAgZGVjX3dvcmQgKHUxNiBkKTsKLXUzMiAgICAgZGVjX2xvbmcgKHUzMiBkKTsKLXU4ICAgICAgaW5jX2J5dGUgKHU4IGQpOwotdTE2ICAgICBpbmNfd29yZCAodTE2IGQpOwotdTMyICAgICBpbmNfbG9uZyAodTMyIGQpOwotdTggICAgICBvcl9ieXRlICh1OCBkLCB1OCBzKTsKLXUxNiAgICAgb3Jfd29yZCAodTE2IGQsIHUxNiBzKTsKLXUzMiAgICAgb3JfbG9uZyAodTMyIGQsIHUzMiBzKTsKLXU4ICAgICAgbmVnX2J5dGUgKHU4IHMpOwotdTE2ICAgICBuZWdfd29yZCAodTE2IHMpOwotdTMyICAgICBuZWdfbG9uZyAodTMyIHMpOwotdTggICAgICBub3RfYnl0ZSAodTggcyk7Ci11MTYgICAgIG5vdF93b3JkICh1MTYgcyk7Ci11MzIgICAgIG5vdF9sb25nICh1MzIgcyk7Ci11OCAgICAgIHJjbF9ieXRlICh1OCBkLCB1OCBzKTsKLXUxNiAgICAgcmNsX3dvcmQgKHUxNiBkLCB1OCBzKTsKLXUzMiAgICAgcmNsX2xvbmcgKHUzMiBkLCB1OCBzKTsKLXU4ICAgICAgcmNyX2J5dGUgKHU4IGQsIHU4IHMpOwotdTE2ICAgICByY3Jfd29yZCAodTE2IGQsIHU4IHMpOwotdTMyICAgICByY3JfbG9uZyAodTMyIGQsIHU4IHMpOwotdTggICAgICByb2xfYnl0ZSAodTggZCwgdTggcyk7Ci11MTYgICAgIHJvbF93b3JkICh1MTYgZCwgdTggcyk7Ci11MzIgICAgIHJvbF9sb25nICh1MzIgZCwgdTggcyk7Ci11OCAgICAgIHJvcl9ieXRlICh1OCBkLCB1OCBzKTsKLXUxNiAgICAgcm9yX3dvcmQgKHUxNiBkLCB1OCBzKTsKLXUzMiAgICAgcm9yX2xvbmcgKHUzMiBkLCB1OCBzKTsKLXU4ICAgICAgc2hsX2J5dGUgKHU4IGQsIHU4IHMpOwotdTE2ICAgICBzaGxfd29yZCAodTE2IGQsIHU4IHMpOwotdTMyICAgICBzaGxfbG9uZyAodTMyIGQsIHU4IHMpOwotdTggICAgICBzaHJfYnl0ZSAodTggZCwgdTggcyk7Ci11MTYgICAgIHNocl93b3JkICh1MTYgZCwgdTggcyk7Ci11MzIgICAgIHNocl9sb25nICh1MzIgZCwgdTggcyk7Ci11OCAgICAgIHNhcl9ieXRlICh1OCBkLCB1OCBzKTsKLXUxNiAgICAgc2FyX3dvcmQgKHUxNiBkLCB1OCBzKTsKLXUzMiAgICAgc2FyX2xvbmcgKHUzMiBkLCB1OCBzKTsKLXUxNiAgICAgc2hsZF93b3JkICh1MTYgZCwgdTE2IGZpbGwsIHU4IHMpOwotdTMyICAgICBzaGxkX2xvbmcgKHUzMiBkLCB1MzIgZmlsbCwgdTggcyk7Ci11MTYgICAgIHNocmRfd29yZCAodTE2IGQsIHUxNiBmaWxsLCB1OCBzKTsKLXUzMiAgICAgc2hyZF9sb25nICh1MzIgZCwgdTMyIGZpbGwsIHU4IHMpOwotdTggICAgICBzYmJfYnl0ZSAodTggZCwgdTggcyk7Ci11MTYgICAgIHNiYl93b3JkICh1MTYgZCwgdTE2IHMpOwotdTMyICAgICBzYmJfbG9uZyAodTMyIGQsIHUzMiBzKTsKLXU4ICAgICAgc3ViX2J5dGUgKHU4IGQsIHU4IHMpOwotdTE2ICAgICBzdWJfd29yZCAodTE2IGQsIHUxNiBzKTsKLXUzMiAgICAgc3ViX2xvbmcgKHUzMiBkLCB1MzIgcyk7Ci12b2lkICAgIHRlc3RfYnl0ZSAodTggZCwgdTggcyk7Ci12b2lkICAgIHRlc3Rfd29yZCAodTE2IGQsIHUxNiBzKTsKLXZvaWQgICAgdGVzdF9sb25nICh1MzIgZCwgdTMyIHMpOwotdTggICAgICB4b3JfYnl0ZSAodTggZCwgdTggcyk7Ci11MTYgICAgIHhvcl93b3JkICh1MTYgZCwgdTE2IHMpOwotdTMyICAgICB4b3JfbG9uZyAodTMyIGQsIHUzMiBzKTsKLXZvaWQgICAgaW11bF9ieXRlICh1OCBzKTsKLXZvaWQgICAgaW11bF93b3JkICh1MTYgcyk7Ci12b2lkICAgIGltdWxfbG9uZyAodTMyIHMpOwotdm9pZCAJaW11bF9sb25nX2RpcmVjdCh1MzIgKnJlc19sbywgdTMyKiByZXNfaGksdTMyIGQsIHUzMiBzKTsKLXZvaWQgICAgbXVsX2J5dGUgKHU4IHMpOwotdm9pZCAgICBtdWxfd29yZCAodTE2IHMpOwotdm9pZCAgICBtdWxfbG9uZyAodTMyIHMpOwotdm9pZCAgICBpZGl2X2J5dGUgKHU4IHMpOwotdm9pZCAgICBpZGl2X3dvcmQgKHUxNiBzKTsKLXZvaWQgICAgaWRpdl9sb25nICh1MzIgcyk7Ci12b2lkICAgIGRpdl9ieXRlICh1OCBzKTsKLXZvaWQgICAgZGl2X3dvcmQgKHUxNiBzKTsKLXZvaWQgICAgZGl2X2xvbmcgKHUzMiBzKTsKLXZvaWQgICAgaW5zIChpbnQgc2l6ZSk7Ci12b2lkICAgIG91dHMgKGludCBzaXplKTsKLXUxNiAgICAgbWVtX2FjY2Vzc193b3JkIChpbnQgYWRkcik7Ci12b2lkICAgIHB1c2hfd29yZCAodTE2IHcpOwotdm9pZCAgICBwdXNoX2xvbmcgKHUzMiB3KTsKLXUxNiAgICAgcG9wX3dvcmQgKHZvaWQpOwotdTMyCQlwb3BfbG9uZyAodm9pZCk7Ci0KLSNpZiAgZGVmaW5lZChfX0hBVkVfSU5MSU5FX0FTU0VNQkxFUl9fKSAmJiAhZGVmaW5lZChQUklNX09QU19OT19SRURFRklORV9BU00pCi0KLSNkZWZpbmUJYWFhX3dvcmQoZCkJCWFhYV93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQpCi0jZGVmaW5lIGFhc193b3JkKGQpCQlhYXNfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkKQotI2RlZmluZSBhYWRfd29yZChkKQkJYWFkX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCkKLSNkZWZpbmUgYWFtX3dvcmQoZCkJCWFhbV93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQpCi0jZGVmaW5lIGFkY19ieXRlKGQscykJYWRjX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBhZGNfd29yZChkLHMpCWFkY193b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgYWRjX2xvbmcoZCxzKQlhZGNfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIGFkZF9ieXRlKGQscykgCWFkZF9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgYWRkX3dvcmQoZCxzKQlhZGRfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIGFkZF9sb25nKGQscykJYWRkX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBhbmRfYnl0ZShkLHMpCWFuZF9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgYW5kX3dvcmQoZCxzKQlhbmRfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIGFuZF9sb25nKGQscykJYW5kX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBjbXBfYnl0ZShkLHMpCWNtcF9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgY21wX3dvcmQoZCxzKQljbXBfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIGNtcF9sb25nKGQscykJY21wX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBkYWFfYnl0ZShkKQkJZGFhX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCkKLSNkZWZpbmUgZGFzX2J5dGUoZCkJCWRhc19ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQpCi0jZGVmaW5lIGRlY19ieXRlKGQpCQlkZWNfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkKQotI2RlZmluZSBkZWNfd29yZChkKQkJZGVjX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCkKLSNkZWZpbmUgZGVjX2xvbmcoZCkJCWRlY19sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQpCi0jZGVmaW5lIGluY19ieXRlKGQpCQlpbmNfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxkKQotI2RlZmluZSBpbmNfd29yZChkKQkJaW5jX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCkKLSNkZWZpbmUgaW5jX2xvbmcoZCkJCWluY19sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQpCi0jZGVmaW5lIG9yX2J5dGUoZCxzKQlvcl9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgb3Jfd29yZChkLHMpCW9yX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBvcl9sb25nKGQscykJb3JfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIG5lZ19ieXRlKHMpCQluZWdfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxzKQotI2RlZmluZSBuZWdfd29yZChzKQkJbmVnX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcscykKLSNkZWZpbmUgbmVnX2xvbmcocykJCW5lZ19sb25nX2FzbSgmTS54ODYuUl9FRkxHLHMpCi0jZGVmaW5lIG5vdF9ieXRlKHMpCQlub3RfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRyxzKQotI2RlZmluZSBub3Rfd29yZChzKQkJbm90X3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcscykKLSNkZWZpbmUgbm90X2xvbmcocykJCW5vdF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLHMpCi0jZGVmaW5lIHJjbF9ieXRlKGQscykJcmNsX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSByY2xfd29yZChkLHMpCXJjbF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgcmNsX2xvbmcoZCxzKQlyY2xfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHJjcl9ieXRlKGQscykJcmNyX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSByY3Jfd29yZChkLHMpCXJjcl93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgcmNyX2xvbmcoZCxzKQlyY3JfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHJvbF9ieXRlKGQscykJcm9sX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSByb2xfd29yZChkLHMpCXJvbF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgcm9sX2xvbmcoZCxzKQlyb2xfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHJvcl9ieXRlKGQscykJcm9yX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSByb3Jfd29yZChkLHMpCXJvcl93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgcm9yX2xvbmcoZCxzKQlyb3JfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHNobF9ieXRlKGQscykJc2hsX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBzaGxfd29yZChkLHMpCXNobF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgc2hsX2xvbmcoZCxzKQlzaGxfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHNocl9ieXRlKGQscykJc2hyX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBzaHJfd29yZChkLHMpCXNocl93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgc2hyX2xvbmcoZCxzKQlzaHJfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHNhcl9ieXRlKGQscykJc2FyX2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBzYXJfd29yZChkLHMpCXNhcl93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgc2FyX2xvbmcoZCxzKQlzYXJfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHNobGRfd29yZChkLGZpbGwscykJc2hsZF93b3JkX2FzbSgmTS54ODYuUl9FRkxHLGQsZmlsbCxzKQotI2RlZmluZSBzaGxkX2xvbmcoZCxmaWxsLHMpCXNobGRfbG9uZ19hc20oJk0ueDg2LlJfRUZMRyxkLGZpbGwscykKLSNkZWZpbmUgc2hyZF93b3JkKGQsZmlsbCxzKQlzaHJkX3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxmaWxsLHMpCi0jZGVmaW5lIHNocmRfbG9uZyhkLGZpbGwscykJc2hyZF9sb25nX2FzbSgmTS54ODYuUl9FRkxHLGQsZmlsbCxzKQotI2RlZmluZSBzYmJfYnl0ZShkLHMpCXNiYl9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgc2JiX3dvcmQoZCxzKQlzYmJfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHNiYl9sb25nKGQscykJc2JiX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBzdWJfYnl0ZShkLHMpCXN1Yl9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgc3ViX3dvcmQoZCxzKQlzdWJfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHN1Yl9sb25nKGQscykJc3ViX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSB0ZXN0X2J5dGUoZCxzKQl0ZXN0X2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSB0ZXN0X3dvcmQoZCxzKQl0ZXN0X3dvcmRfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSB0ZXN0X2xvbmcoZCxzKQl0ZXN0X2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSB4b3JfYnl0ZShkLHMpCXhvcl9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLGQscykKLSNkZWZpbmUgeG9yX3dvcmQoZCxzKQl4b3Jfd29yZF9hc20oJk0ueDg2LlJfRUZMRyxkLHMpCi0jZGVmaW5lIHhvcl9sb25nKGQscykJeG9yX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsZCxzKQotI2RlZmluZSBpbXVsX2J5dGUocykJaW11bF9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0FYLE0ueDg2LlJfQUwscykKLSNkZWZpbmUgaW11bF93b3JkKHMpCWltdWxfd29yZF9hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9BWCwmTS54ODYuUl9EWCxNLng4Ni5SX0FYLHMpCi0jZGVmaW5lIGltdWxfbG9uZyhzKQlpbXVsX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfRUFYLCZNLng4Ni5SX0VEWCxNLng4Ni5SX0VBWCxzKQotI2RlZmluZSBpbXVsX2xvbmdfZGlyZWN0KHJlc19sbyxyZXNfaGksZCxzKQlpbXVsX2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcscmVzX2xvLHJlc19oaSxkLHMpCi0jZGVmaW5lIG11bF9ieXRlKHMpCQltdWxfYnl0ZV9hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9BWCxNLng4Ni5SX0FMLHMpCi0jZGVmaW5lIG11bF93b3JkKHMpCQltdWxfd29yZF9hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9BWCwmTS54ODYuUl9EWCxNLng4Ni5SX0FYLHMpCi0jZGVmaW5lIG11bF9sb25nKHMpCQltdWxfbG9uZ19hc20oJk0ueDg2LlJfRUZMRywmTS54ODYuUl9FQVgsJk0ueDg2LlJfRURYLE0ueDg2LlJfRUFYLHMpCi0jZGVmaW5lIGlkaXZfYnl0ZShzKQlpZGl2X2J5dGVfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfQUwsJk0ueDg2LlJfQUgsTS54ODYuUl9BWCxzKQotI2RlZmluZSBpZGl2X3dvcmQocykJaWRpdl93b3JkX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0FYLCZNLng4Ni5SX0RYLE0ueDg2LlJfQVgsTS54ODYuUl9EWCxzKQotI2RlZmluZSBpZGl2X2xvbmcocykJaWRpdl9sb25nX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0VBWCwmTS54ODYuUl9FRFgsTS54ODYuUl9FQVgsTS54ODYuUl9FRFgscykKLSNkZWZpbmUgZGl2X2J5dGUocykJCWRpdl9ieXRlX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0FMLCZNLng4Ni5SX0FILE0ueDg2LlJfQVgscykKLSNkZWZpbmUgZGl2X3dvcmQocykJCWRpdl93b3JkX2FzbSgmTS54ODYuUl9FRkxHLCZNLng4Ni5SX0FYLCZNLng4Ni5SX0RYLE0ueDg2LlJfQVgsTS54ODYuUl9EWCxzKQotI2RlZmluZSBkaXZfbG9uZyhzKQkJZGl2X2xvbmdfYXNtKCZNLng4Ni5SX0VGTEcsJk0ueDg2LlJfRUFYLCZNLng4Ni5SX0VEWCxNLng4Ni5SX0VBWCxNLng4Ni5SX0VEWCxzKQotCi0jZW5kaWYKLQotI2lmZGVmICBfX2NwbHVzcGx1cwotfSAgICAgICAgICAgICAgICAgICAgICAgCQkJLyogRW5kIG9mICJDIiBsaW5rYWdlIGZvciBDKysgICAJKi8KLSNlbmRpZgotCi0jZW5kaWYgLyogX19YODZFTVVfUFJJTV9PUFNfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3Ivc2NpdGVjaC9zcmMveDg2ZW11L3g4NmVtdS94ODZlbXVpLmggYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L3g4NmVtdWkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZmNDkwMy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci9zY2l0ZWNoL3NyYy94ODZlbXUveDg2ZW11L3g4NmVtdWkuaAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qCQkJCQkJUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKLSoKLSogICAgICAgICAgICAJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgotKiAJCQkJICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCi0qIAkJCQkJICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCi0qCi0qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSoKLSogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCi0qICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCi0qICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci0qICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLSogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKLSogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKLSogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCi0qICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgotKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSoKLSogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAotKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwotKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKLSogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKLSogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgotKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgotKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSoKLSogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKgotKiBMYW5ndWFnZToJCUFOU0kgQwotKiBFbnZpcm9ubWVudDoJQW55Ci0qIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0Ci0qCi0qIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIHN5c3RlbSBzcGVjaWZpYyBmdW5jdGlvbnMuIFRoZXNlIGZ1bmN0aW9ucwotKgkJCQlhcmUgYWx3YXlzIGNvbXBpbGVkIGFuZCBsaW5rZWQgaW4gdGhlIE9TIGRlcGVkZW50IGxpYnJhcmllcywKLSoJCQkJYW5kIG5ldmVyIGluIGEgYmluYXJ5IHBvcnRhYmxlIGRyaXZlci4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19YODZFTVVfWDg2RU1VSV9ICi0jZGVmaW5lIF9fWDg2RU1VX1g4NkVNVUlfSAotCi0vKiBJZiB3ZSBhcmUgY29tcGlsaW5nIGluIEMrKyBtb2RlLCB3ZSBjYW4gY29tcGlsZSBzb21lIGZ1bmN0aW9ucyBhcwotICogaW5saW5lIHRvIGluY3JlYXNlIHBlcmZvcm1hbmNlIChob3dldmVyIHRoZSBjb2RlIHNpemUgaW5jcmVhc2VzIHF1aXRlCi0gKiBkcmFtYXRpY2FsbHkgaW4gdGhpcyBjYXNlKS4KLSAqLwotCi0jaWYJZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQoX05PX0lOTElORSkKLSNkZWZpbmUJX0lOTElORQlpbmxpbmUKLSNlbHNlCi0jZGVmaW5lCV9JTkxJTkUgc3RhdGljCi0jZW5kaWYKLQotLyogR2V0IHJpZCBvZiB1bnVzZWQgcGFyYW1ldGVycyBpbiBDKysgY29tcGlsYXRpb24gbW9kZSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUJWDg2RU1VX1VOVVNFRCh2KQotI2Vsc2UKLSNkZWZpbmUJWDg2RU1VX1VOVVNFRCh2KQl2Ci0jZW5kaWYKLQotI2luY2x1ZGUgIng4NmVtdS5oIgotI2luY2x1ZGUgIng4NmVtdS9yZWdzLmgiCi0jaW5jbHVkZSAieDg2ZW11L2RlYnVnLmgiCi0jaW5jbHVkZSAieDg2ZW11L2RlY29kZS5oIgotI2luY2x1ZGUgIng4NmVtdS9vcHMuaCIKLSNpbmNsdWRlICJ4ODZlbXUvcHJpbV9vcHMuaCIKLSNpbmNsdWRlICJ4ODZlbXUvZnB1LmgiCi0jaW5jbHVkZSAieDg2ZW11L2ZwdV9yZWdzLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5saW5lIEZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmICBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7ICAgICAgICAgICAgCQkJLyogVXNlICJDIiBsaW5rYWdlIHdoZW4gaW4gQysrIG1vZGUgKi8KLSNlbmRpZgotCi1leHRlcm4gdTggIAkoWDg2QVBJUCBzeXNfcmRiKSh1MzIgYWRkcik7Ci1leHRlcm4gdTE2IAkoWDg2QVBJUCBzeXNfcmR3KSh1MzIgYWRkcik7Ci1leHRlcm4gdTMyIAkoWDg2QVBJUCBzeXNfcmRsKSh1MzIgYWRkcik7Ci1leHRlcm4gdm9pZCAoWDg2QVBJUCBzeXNfd3JiKSh1MzIgYWRkcix1OCB2YWwpOwotZXh0ZXJuIHZvaWQgKFg4NkFQSVAgc3lzX3dydykodTMyIGFkZHIsdTE2IHZhbCk7Ci1leHRlcm4gdm9pZCAoWDg2QVBJUCBzeXNfd3JsKSh1MzIgYWRkcix1MzIgdmFsKTsKLQotZXh0ZXJuIHU4ICAJKFg4NkFQSVAgc3lzX2luYikoWDg2RU1VX3Bpb0FkZHIgYWRkcik7Ci1leHRlcm4gdTE2IAkoWDg2QVBJUCBzeXNfaW53KShYODZFTVVfcGlvQWRkciBhZGRyKTsKLWV4dGVybiB1MzIgCShYODZBUElQIHN5c19pbmwpKFg4NkVNVV9waW9BZGRyIGFkZHIpOwotZXh0ZXJuIHZvaWQgKFg4NkFQSVAgc3lzX291dGIpKFg4NkVNVV9waW9BZGRyIGFkZHIsdTggdmFsKTsKLWV4dGVybiB2b2lkIChYODZBUElQIHN5c19vdXR3KShYODZFTVVfcGlvQWRkciBhZGRyLHUxNiB2YWwpOwotZXh0ZXJuIHZvaWQJKFg4NkFQSVAgc3lzX291dGwpKFg4NkVNVV9waW9BZGRyIGFkZHIsdTMyIHZhbCk7Ci0KLSNpZmRlZiAgX19jcGx1c3BsdXMKLX0gICAgICAgICAgICAgICAgICAgICAgIAkJCS8qIEVuZCBvZiAiQyIgbGlua2FnZSBmb3IgQysrICAgCSovCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fWDg2RU1VX1g4NkVNVUlfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTUFJL2Jpb3NfZW11bGF0b3IveDg2aW50ZXJmYWNlLmMgYi9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci94ODZpbnRlcmZhY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA5Y2IzYy4uMDAwMDAwMAotLS0gYS9ib2FyZC9NQUkvYmlvc19lbXVsYXRvci94ODZpbnRlcmZhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDgxNCArMCwwIEBACi0jaW5jbHVkZSAieDg2ZW11LmgiCi0jaW5jbHVkZSAiZ2x1ZS5oIgotCi0KLS8qCi0gKiBUaGlzIGlzbid0IG5pY2UsIGJ1dCB0aGVyZSBhcmUgYSBsb3Qgb2YgaW5jb21wYXRpYmlsaXRpZXMgaW4gdGhlIFUtQm9vdCBhbmQgc2NpdGVjaCBpbmNsdWRlCi0gKiBmaWxlcyB0aGF0IHRoaXMgaXMgdGhlIG9ubHkgcmVhbGx5IHdvcmthYmxlIHNvbHV0aW9uLgotICogTWlnaHQgYmUgY2xlYW5lZCBvdXQgbGF0ZXIuCi0gKi8KLQotI2lmZGVmIERFQlVHCi0jdW5kZWYgREVCVUcKLSNlbmRpZgotCi0jdW5kZWYgSU9fTE9HR0lORwotI3VuZGVmIE1FTV9MT0dHSU5HCi0KLSNpZmRlZiBJT19MT0dHSU5HCi0jZGVmaW5lIExPR0lPKHBvcnQsIGZvcm1hdCwgYXJncy4uLikgaWYgKGRvbG9nKHBvcnQpKSBfcHJpbnRmKGZvcm1hdCAsICMjIGFyZ3MpCi0jZWxzZQotI2RlZmluZSBMT0dJTyhwb3J0LCBmb3JtYXQsIGFyZ3MuLi4pCi0jZW5kaWYKLQotI2lmZGVmIE1FTV9MT0dHSU4KLSNkZWZpbmUgTE9HTUVNKGZvcm1hdCwgYXJncy4uLikgX3ByaW50Zihmb3JtYXQgLCAjIyBhcmdzKQotI2Vsc2UKLSNkZWZpbmUgTE9HTUVNKGZvcm1hdCwgYXJncy4uLikKLSNlbmRpZgotCi0jaWZkZWYgREVCVUcKLSNkZWZpbmUgUFJJTlRGKGZvcm1hdCwgYXJncy4uLikgX3ByaW50Zihmb3JtYXQgLCAjIyBhcmdzKQotI2Vsc2UKLSNkZWZpbmUgUFJJTlRGKGZvcm1hdCwgYXJnYy4uLikKLSNlbmRpZgotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgVUJZVEU7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVXT1JEOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIFVMT05HOwotCi10eXBlZGVmIGNoYXIgQllURTsKLXR5cGVkZWYgc2hvcnQgV09SVDsKLXR5cGVkZWYgbG9uZyBMT05HOwotCi0jZGVmaW5lIEVNVUxBVE9SX01FTV9TSVpFICAgICAgICgxMDI0KjEwMjQpCi0jZGVmaW5lIEVNVUxBVE9SX0JJT1NfT0ZGU0VUICAgIDB4QzAwMDAKLSNkZWZpbmUgRU1VTEFUT1JfU1RSQVBfT0ZGU0VUICAgMHgzMDAwMAotI2RlZmluZSBFTVVMQVRPUl9TVEFDS19PRkZTRVQgICAweDIwMDAwCi0jZGVmaW5lIEVNVUxBVE9SX0xPR09fT0ZGU0VUICAgIDB4NDAwMDAgLyogSWYgeW91IGNoYW5nZSB0aGlzLCBjaGFuZ2UgdGhlIHN0cmFwIGNvZGUsIHRvbyAqLwotI2RlZmluZSBWSURFT19CQVNFICh2b2lkICopMHhGRDBCODAwMAotCi1leHRlcm4gY2hhciAqZ2V0ZW52KGNoYXIgKik7Ci1leHRlcm4gaW50IHRzdGModm9pZCk7Ci1leHRlcm4gaW50IGdldGModm9pZCk7Ci1leHRlcm4gdW5zaWduZWQgY2hhciB2aWRlb19nZXRfYXR0cih2b2lkKTsKLQotaW50IGF0b2koY2hhciAqc3RyaW5nKQotewotICAgIGludCByZXMgPSAwOwotICAgIHdoaWxlICgqc3RyaW5nPj0nMCcgJiYgKnN0cmluZyA8PSc5JykKLSAgICB7Ci0JcmVzICo9IDEwOwotCXJlcyArPSAqc3RyaW5nLScwJzsKLQlzdHJpbmcrKzsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi12b2lkIGNvbnNfZ2V0cyhjaGFyICpidWZmZXIpCi17Ci0gICAgaW50IGkgPSAwOwotICAgIGNoYXIgYyA9IDA7Ci0KLSAgICBidWZmZXJbMF0gPSAwOwotICAgIGlmIChnZXRlbnYoIng4Nl9ydW50aHJ1IikpIHJldHVybjsgLypGSVhNRTogKi8KLSAgICB3aGlsZSAoYyAhPSAweDBEICYmIGMgIT0gMHgwQSkKLSAgICB7Ci0Jd2hpbGUgKCF0c3RjKCkpOwotCWMgPSBnZXRjKCk7Ci0JaWYgKGM+PTMyICYmIGMgPCAxMjcpCi0JewotCSAgICBidWZmZXJbaV0gPSBjOwotCSAgICBpKys7Ci0JICAgIGJ1ZmZlcltpXSA9IDA7Ci0JICAgIHB1dGMoYyk7Ci0JfQotCWVsc2UKLQl7Ci0JICAgIGlmIChjID09IDB4MDgpCi0JICAgIHsKLQkJaWYgKGk+MCkgaS0tOwotCQlidWZmZXJbaV0gPSAwOwotCSAgICB9Ci0JfQotICAgIH0KLSAgICBidWZmZXJbaV0gPSAnXG4nOwotICAgIGJ1ZmZlcltpKzFdID0gMDsKLX0KLQotY2hhciAqYmlvc19kYXRlID0gIjA4LzE0LzAyIjsKLVVCWVRFIG1vZGVsID0gMHhGQzsKLVVCWVRFIHN1Ym1vZGVsID0gMHgwMDsKLQotc3RhdGljIGlubGluZSBVQllURSByZWFkX2J5dGUodm9sYXRpbGUgVUJZVEUqIGZyb20pCi17Ci0gICAgaW50IHg7Ci0gICAgYXNtIHZvbGF0aWxlICgibGJ6ICUwLCUxXG4gZWllaW8iIDogIj1yIiAoeCkgOiAibSIgKCpmcm9tKSk7Ci0gICAgcmV0dXJuIChVQllURSl4OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfYnl0ZSh2b2xhdGlsZSBVQllURSAqdG8sIGludCB4KQotewotICAgIGFzbSB2b2xhdGlsZSAoInN0YiAlMSwlMFxuIGVpZWlvIiA6ICI9bSIgKCp0bykgOiAiciIgKHgpKTsKLX0KLQotc3RhdGljIGlubGluZSBVV09SRCByZWFkX3dvcmRfbGl0dGxlKHZvbGF0aWxlIFVXT1JEICpmcm9tKQotewotICAgIGludCB4OwotICAgIGFzbSB2b2xhdGlsZSAoImxoYnJ4ICUwLDAsJTFcbiBlaWVpbyIgOiAiPXIiICh4KSA6ICJyIiAoZnJvbSksICJtIiAoKmZyb20pKTsKLSAgICByZXR1cm4gKFVXT1JEKXg7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgVVdPUkQgcmVhZF93b3JkX2JpZyh2b2xhdGlsZSBVV09SRCAqZnJvbSkKLXsKLSAgICBpbnQgeDsKLSAgICBhc20gdm9sYXRpbGUgKCJsaHogJTAsJTFcbiBlaWVpbyIgOiAiPXIiICh4KSA6ICJtIiAoKmZyb20pKTsKLSAgICByZXR1cm4gKFVXT1JEKXg7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV93b3JkX2xpdHRsZSh2b2xhdGlsZSBVV09SRCAqdG8sIGludCB4KQotewotICAgIGFzbSB2b2xhdGlsZSAoInN0aGJyeCAlMSwwLCUyXG4gZWllaW8iIDogIj1tIiAoKnRvKSA6ICJyIiAoeCksICJyIiAodG8pKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3dvcmRfYmlnKHZvbGF0aWxlIFVXT1JEICp0bywgaW50IHgpCi17Ci0gICAgYXNtIHZvbGF0aWxlICgic3RoICUxLCUwXG4gZWllaW8iIDogIj1tIiAoKnRvKSA6ICJyIiAoeCkpOwotfQotCi1zdGF0aWMgaW5saW5lIFVMT05HIHJlYWRfbG9uZ19saXR0bGUodm9sYXRpbGUgVUxPTkcgKmZyb20pCi17Ci0gICAgdW5zaWduZWQgbG9uZyB4OwotICAgIGFzbSB2b2xhdGlsZSAoImx3YnJ4ICUwLDAsJTFcbiBlaWVpbyIgOiAiPXIiICh4KSA6ICJyIiAoZnJvbSksICJtIigqZnJvbSkpOwotICAgIHJldHVybiAoVUxPTkcpeDsKLX0KLQotc3RhdGljIGlubGluZSBVTE9ORyByZWFkX2xvbmdfYmlnKHZvbGF0aWxlIFVMT05HICpmcm9tKQotewotICAgIHVuc2lnbmVkIGxvbmcgeDsKLSAgICBhc20gdm9sYXRpbGUgKCJsd3ogJTAsJTFcbiBlaWVpbyIgOiAiPXIiICh4KSA6ICJtIiAoKmZyb20pKTsKLSAgICByZXR1cm4gKFVMT05HKXg7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9sb25nX2xpdHRsZSh2b2xhdGlsZSBVTE9ORyAqdG8sIFVMT05HIHgpCi17Ci0gICAgYXNtIHZvbGF0aWxlICgic3R3YnJ4ICUxLDAsJTJcbiBlaWVpbyIgOiAiPW0iICgqdG8pIDogInIiICh4KSwgInIiICh0bykpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfbG9uZ19iaWcodm9sYXRpbGUgVUxPTkcgKnRvLCBVTE9ORyB4KQotewotICAgIGFzbSB2b2xhdGlsZSAoInN0dyAlMSwlMFxuIGVpZWlvIiA6ICI9bSIgKCp0bykgOiAiciIgKHgpKTsKLX0KLQotc3RhdGljIGludCBsb2dfaW5pdCA9IDA7Ci1zdGF0aWMgaW50IGxvZ19kbyA9IDA7Ci1zdGF0aWMgaW50IGxvZ19sb3cgPSAwOwotCi1pbnQgZG9sb2coaW50IHBvcnQpCi17Ci0gICAgaWYgKGxvZ19pbml0ICYmIGxvZ19kbykKLSAgICB7Ci0JaWYgKGxvZ19sb3cgJiYgcG9ydCA+IDB4NDAwKSByZXR1cm4gMDsKLQlyZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBpZiAoIWxvZ19pbml0KQotICAgIHsKLQlsb2dfaW5pdCA9IDE7Ci0JbG9nX2RvID0gKGdldGVudigieDg2X2xvZ2lvIikgIT0gKGNoYXIgKikwKTsKLQlsb2dfbG93ID0gKGdldGVudigieDg2X2xvZ2xvdyIpICE9IChjaGFyICopMCk7Ci0JaWYgKGxvZ19kbykKLQl7Ci0JICAgIGlmIChsb2dfbG93ICYmIHBvcnQgPiAweDQwMCkgcmV0dXJuIDA7Ci0JICAgIHJldHVybiAxOwotCX0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIENvbnZlcnRzIGFuIGVtdWxhdG9yIGFkZHJlc3MgdG8gYSBwaHlzaWNhbCBhZGRyZXNzLiAqLwotLyogSGFuZGxlcyBhbGwgc3BlY2lhbCBjYXNlcyAoYmlvcyBkYXRlLCBtb2RlbCBldGMpLCBhbmQgbWlnaHQgbmVlZCB3b3JrICovCi11MzIgbWVtYWRkcih1MzIgYWRkcikKLXsKLS8qICAgIGlmIChhZGRyID49IDB4RjAwMDAgJiYgYWRkciA8IDB4RkZGRkYpIHByaW50ZigiV0FSTklORzogU2VnbWVudCBGIGFjY2VzcyAoMHgleClcbiIsIGFkZHIpOyAqLwotLyogICAgcHJpbnRmKCJNZW1BZGRyPSVwXG4iLCBhZGRyKTsgKi8KLSAgICBpZiAoYWRkciA+PSAweEEwMDAwICYmIGFkZHIgPCAweEMwMDAwKQotCXJldHVybiAweEZEMDAwMDAwICsgYWRkcjsKLSAgICBlbHNlIGlmIChhZGRyID49IDB4RkZGRjUgJiYgYWRkciA8IDB4RkZGRkUpCi0gICAgewotCXJldHVybiAodTMyKWJpb3NfZGF0ZSthZGRyLTB4RkZGRjU7Ci0gICAgfQotICAgIGVsc2UgaWYgKGFkZHIgPT0gMHhGRkZGRSkKLQlyZXR1cm4gKHUzMikmbW9kZWw7Ci0gICAgZWxzZSBpZiAoYWRkciA9PSAweEZGRkZGKQotCXJldHVybiAodTMyKSZzdWJtb2RlbDsKLSAgICBlbHNlIGlmIChhZGRyID49IDB4ODAwMDAwMDApCi0gICAgewotCS8qcHJpbnRmKCJXYXJuaW5nOiBIaWdoIG1lbW9yeSBhY2Nlc3MgYXQgMHgleFxuIiwgYWRkcik7ICovCi0JcmV0dXJuIGFkZHI7Ci0gICAgfQotICAgIGVsc2UKLQlyZXR1cm4gKHUzMilNLm1lbV9iYXNlK2FkZHI7Ci19Ci0KLXU4IEExX3JkYih1MzIgYWRkcikKLXsKLSAgICB1OCBhID0gcmVhZF9ieXRlKChVQllURSAqKW1lbWFkZHIoYWRkcikpOwotICAgIExPR01FTSgicmRiOiAleCAtPiAleFxuIiwgYWRkciwgYSk7Ci0gICAgcmV0dXJuIGE7Ci19Ci0KLXUxNiBBMV9yZHcodTMyIGFkZHIpCi17Ci0gICAgdTE2IGEgPSByZWFkX3dvcmRfbGl0dGxlKChVV09SRCAqKW1lbWFkZHIoYWRkcikpOwotICAgIExPR01FTSgicmR3OiAleCAtPiAleFxuIiwgYWRkciwgYSk7Ci0gICAgcmV0dXJuIGE7Ci19Ci0KLXUzMiBBMV9yZGwodTMyIGFkZHIpCi17Ci0gICAgdTMyIGEgPSByZWFkX2xvbmdfbGl0dGxlKChVTE9ORyAqKW1lbWFkZHIoYWRkcikpOwotICAgIExPR01FTSgicmRsOiAleCAtPiAleFxuIiwgYWRkciwgYSk7Ci0gICAgcmV0dXJuIGE7Ci19Ci0KLXZvaWQgQTFfd3JiKHUzMiBhZGRyLCB1OCB2YWwpCi17Ci0gICAgTE9HTUVNKCJ3cmI6ICV4IDwtICV4XG4iLCBhZGRyLCB2YWwpOwotICAgIHdyaXRlX2J5dGUoKFVCWVRFICopbWVtYWRkcihhZGRyKSwgdmFsKTsKLX0KLQotdm9pZCBBMV93cncodTMyIGFkZHIsIHUxNiB2YWwpCi17Ci0gICAgTE9HTUVNKCJ3cnc6ICV4IDwtICV4XG4iLCBhZGRyLCB2YWwpOwotICAgIHdyaXRlX3dvcmRfbGl0dGxlKChVV09SRCAqKW1lbWFkZHIoYWRkciksIHZhbCk7Ci19Ci0KLXZvaWQgQTFfd3JsKHUzMiBhZGRyLCB1MzIgdmFsKQotewotICAgIExPR01FTSgid3JsOiAleCA8LSAleFxuIiwgYWRkciwgdmFsKTsKLSAgICB3cml0ZV9sb25nX2xpdHRsZSgoVUxPTkcgKiltZW1hZGRyKGFkZHIpLCB2YWwpOwotfQotCi1YODZFTVVfbWVtRnVuY3MgX0ExX21lbSA9Ci17Ci0gICAgQTFfcmRiLAotICAgIEExX3JkdywKLSAgICBBMV9yZGwsCi0gICAgQTFfd3JiLAotICAgIEExX3dydywKLSAgICBBMV93cmwsCi19OwotCi0jZGVmaW5lIEFSVElDSUFTX1BDSV9DRkdBRERSICAweGZlYzAwY2Y4Ci0jZGVmaW5lIEFSVElDSUFTX1BDSV9DRkdEQVRBICAweGZlZTAwY2ZjCi0jZGVmaW5lIElPQkFTRSAgICAgICAgICAgICAgICAweEZFMDAwMDAwCi0KLSNkZWZpbmUgaW5fYnl0ZShmcm9tKSByZWFkX2J5dGUoIChVQllURSAqKXBvcnRfdG9fbWVtKGZyb20pKQotI2RlZmluZSBpbl93b3JkKGZyb20pIHJlYWRfd29yZF9saXR0bGUoKFVXT1JEICopcG9ydF90b19tZW0oZnJvbSkpCi0jZGVmaW5lIGluX2xvbmcoZnJvbSkgcmVhZF9sb25nX2xpdHRsZSgoVUxPTkcgKilwb3J0X3RvX21lbShmcm9tKSkKLSNkZWZpbmUgb3V0X2J5dGUodG8sIHZhbCkgd3JpdGVfYnl0ZSgoVUJZVEUgKilwb3J0X3RvX21lbSh0byksIHZhbCkKLSNkZWZpbmUgb3V0X3dvcmQodG8sIHZhbCkgd3JpdGVfd29yZF9saXR0bGUoKFVXT1JEICopcG9ydF90b19tZW0odG8pLCB2YWwpCi0jZGVmaW5lIG91dF9sb25nKHRvLCB2YWwpIHdyaXRlX2xvbmdfbGl0dGxlKChVTE9ORyAqKXBvcnRfdG9fbWVtKHRvKSwgdmFsKQotCi11MzIgcG9ydF90b19tZW0oaW50IHBvcnQpCi17Ci0gICAgaWYgKHBvcnQgPj0gMHhDRkMgJiYgcG9ydCA8PSAweENGRikgcmV0dXJuIDB4RkVFMDAwMDArcG9ydDsKLSAgICBlbHNlIGlmIChwb3J0ID49IDB4Q0Y4ICYmIHBvcnQgPD0gMHhDRkIpIHJldHVybiAweEZFQzAwMDAwK3BvcnQ7Ci0gICAgZWxzZSByZXR1cm4gSU9CQVNFICsgcG9ydDsKLX0KLQotdTggQTFfaW5iKGludCBwb3J0KQotewotICAgIHU4IGE7Ci0gICAgLyppZiAocG9ydCA9PSAweDNCQSkgcmV0dXJuIDA7ICovCi0gICAgYSA9IGluX2J5dGUocG9ydCk7Ci0gICAgTE9HSU8ocG9ydCwgImluYjogJVhoIC0+ICVkICglWGgpXG4iLCBwb3J0LCBhLCBhKTsKLSAgICByZXR1cm4gYTsKLX0KLQotdTE2IEExX2ludyhpbnQgcG9ydCkKLXsKLSAgICB1MTYgYSA9IGluX3dvcmQocG9ydCk7Ci0gICAgTE9HSU8ocG9ydCwgImludzogJVhoIC0+ICVkICglWGgpXG4iLCBwb3J0LCBhLCBhKTsKLSAgICByZXR1cm4gYTsKLX0KLQotdTMyIEExX2lubChpbnQgcG9ydCkKLXsKLSAgICB1MzIgYSA9IGluX2xvbmcocG9ydCk7Ci0gICAgTE9HSU8ocG9ydCwgImlubDogJVhoIC0+ICVkICglWGgpXG4iLCBwb3J0LCBhLCBhKTsKLSAgICByZXR1cm4gYTsKLX0KLQotdm9pZCBBMV9vdXRiKGludCBwb3J0LCB1OCB2YWwpCi17Ci0gICAgTE9HSU8ocG9ydCwgIm91dGI6ICVYaCA8LSAlZCAoJVhoKVxuIiwgcG9ydCwgdmFsLCB2YWwpOwotLyogICAgaWYgKHBvcnQgPT0gMHhDRjgpIHBvcnQgPSAweENGQjsKLSAgICBlbHNlIGlmIChwb3J0ID09IDB4Q0Y5KSBwb3J0ID0gMHhDRkE7Ci0gICAgZWxzZSBpZiAocG9ydCA9PSAweENGQSkgcG9ydCA9IDB4Q0Y5OwotICAgIGVsc2UgaWYgKHBvcnQgPT0gMHhDRkIpIHBvcnQgPSAweENGODsqLwotICAgIG91dF9ieXRlKHBvcnQsIHZhbCk7Ci19Ci0KLXZvaWQgQTFfb3V0dyhpbnQgcG9ydCwgdTE2IHZhbCkKLXsKLSAgICBMT0dJTyhwb3J0LCAib3V0dzogJVhoIDwtICVkICglWGgpXG4iLCBwb3J0LCB2YWwsIHZhbCk7Ci0gICAgb3V0X3dvcmQocG9ydCwgdmFsKTsKLX0KLQotdm9pZCBBMV9vdXRsKGludCBwb3J0LCB1MzIgdmFsKQotewotICAgIExPR0lPKHBvcnQsICJvdXRsOiAlWGggPC0gJWQgKCVYaClcbiIsIHBvcnQsIHZhbCwgdmFsKTsKLSAgICBvdXRfbG9uZyhwb3J0LCB2YWwpOwotfQotCi1YODZFTVVfcGlvRnVuY3MgX0ExX3BpbyA9Ci17Ci0gICAgQTFfaW5iLAotICAgIEExX2ludywKLSAgICBBMV9pbmwsCi0gICAgQTFfb3V0YiwKLSAgICBBMV9vdXR3LAotICAgIEExX291dGwsCi19OwotCi1zdGF0aWMgaW50IHJlbG9jZWRfb3BzID0gMDsKLQotdm9pZCByZWxvY19vcHModm9pZCAqcmVsb2NfYWRkcikKLXsKLSAgICBleHRlcm4gdm9pZCAoKng4NmVtdV9vcHRhYlsyNTZdKSh1OCk7Ci0gICAgZXh0ZXJuIHZvaWQgKCp4ODZlbXVfb3B0YWIyWzI1Nl0pKHU4KTsKLSAgICBleHRlcm4gdm9pZCB0YWJsZXNfcmVsb2NhdGUodW5zaWduZWQgaW50IG9mZnNldCk7Ci0gICAgaW50IGk7Ci0gICAgdW5zaWduZWQgbG9uZyBkZWx0YTsKLSAgICBpZiAocmVsb2NlZF9vcHMgPT0gMSkgcmV0dXJuOwotICAgIHJlbG9jZWRfb3BzID0gMTsKLQotICAgIGRlbHRhID0gVEVYVF9CQVNFIC0gKHVuc2lnbmVkIGxvbmcpcmVsb2NfYWRkcjsKLQotICAgIGZvciAoaT0wOyBpPDI1NjsgaSsrKQotICAgIHsKLQl4ODZlbXVfb3B0YWJbaV0gLT0gZGVsdGE7Ci0JeDg2ZW11X29wdGFiMltpXSAtPSBkZWx0YTsKLSAgICB9Ci0KLSAgICBfQTFfbWVtLnJkYiA9IEExX3JkYjsKLSAgICBfQTFfbWVtLnJkdyA9IEExX3JkdzsKLSAgICBfQTFfbWVtLnJkbCA9IEExX3JkbDsKLSAgICBfQTFfbWVtLndyYiA9IEExX3dyYjsKLSAgICBfQTFfbWVtLndydyA9IEExX3dydzsKLSAgICBfQTFfbWVtLndybCA9IEExX3dybDsKLQotICAgIF9BMV9waW8uaW5iID0gQTFfaW5iOwotICAgIF9BMV9waW8uaW53ID0gQTFfaW53OwotICAgIF9BMV9waW8uaW5sID0gQTFfaW5sOwotICAgIF9BMV9waW8ub3V0YiA9IEExX291dGI7Ci0gICAgX0ExX3Bpby5vdXR3ID0gQTFfb3V0dzsKLSAgICBfQTFfcGlvLm91dGwgPSBBMV9vdXRsOwotCi0gICAgdGFibGVzX3JlbG9jYXRlKGRlbHRhKTsKLQotfQotCi0KLSNkZWZpbmUgQU5ZX0tFWSh0ZXh0KQkJCQlcCi0gICAgcHJpbnRmKHRleHQpOwkJCQlcCi0gICAgd2hpbGUgKCF0c3RjKCkpOwotCi0KLXVuc2lnbmVkIGNoYXIgbW9yZV9zdHJhcFtdID0gewotCTB4YjQsIDB4MCwgMHhiMCwgMHgyLCAweGNkLCAweDEwLAotfTsKLSNkZWZpbmUgTU9SRV9TVFJBUF9CWVRFUyA2IC8qIEFkZGl0aW9uYWwgYnl0ZXMgb2Ygc3RyYXAgY29kZSAqLwotCi0KLXVuc2lnbmVkIGNoYXIgKmRvbmVfbXNnPSJWR0EgSW5pdGlhbGl6ZWRcMCI7Ci0KLWludCBleGVjdXRlX2Jpb3MocGNpX2Rldl90IGdyX2Rldiwgdm9pZCAqcmVsb2NfYWRkcikKLXsKLSAgICBleHRlcm4gdm9pZCBiaW9zX2luaXQodm9pZCk7Ci0gICAgZXh0ZXJuIHZvaWQgcmVtb3ZlX2luaXRfZGF0YSh2b2lkKTsKLSAgICBleHRlcm4gaW50IHZpZGVvX3Jvd3Modm9pZCk7Ci0gICAgZXh0ZXJuIGludCB2aWRlb19jb2xzKHZvaWQpOwotICAgIGV4dGVybiBpbnQgdmlkZW9fc2l6ZShpbnQsIGludCk7Ci0gICAgdTggKnN0cmFwOwotICAgIHVuc2lnbmVkIGNoYXIgKmxvZ287Ci0gICAgdTggY2ZnOwotICAgIGludCBpOwotICAgIGNoYXIgYzsKLSAgICBjaGFyICpzOwotI2lmZGVmIEVBU1RFUkVHRwotICAgIGludCBlYXN0ZXJlZ2dfYWN0aXZlID0gMDsKLSNlbmRpZgotICAgIGNoYXIgKnBhbF9yZXNldDsKLSAgICB1OCAqZmI7Ci0gICAgdW5zaWduZWQgY2hhciAqbXNnOwotICAgIHVuc2lnbmVkIGNoYXIgY3VycmVudF9hdHRyOwotCi0gICAgUFJJTlRGKCJUcnlpbmcgdG8gcmVtb3ZlIGluaXQgZGF0YVxuIik7Ci0gICAgcmVtb3ZlX2luaXRfZGF0YSgpOwotICAgIFBSSU5URigiUmVtb3ZlZCBpbml0IGRhdGEgZnJvbSBjYWNoZSwgbm93IGluIFJBTVxuIik7Ci0KLSAgICByZWxvY19vcHMocmVsb2NfYWRkcik7Ci0gICAgUFJJTlRGKCJBdHRlbXB0aW5nIHRvIHJ1biBlbXVsYXRvciBvbiAlMDJ4OiUwMng6JTAyeFxuIiwKLQkgICBQQ0lfQlVTKGdyX2RldiksIFBDSV9ERVYoZ3JfZGV2KSwgUENJX0ZVTkMoZ3JfZGV2KSk7Ci0KLSAgICAvKiBFbmFibGUgY29tcGF0aWJpbGl0eSBob2xlIGZvciBlbXVsYXRvciBhY2Nlc3MgdG8gZnJhbWUgYnVmZmVyICovCi0gICAgUFJJTlRGKCJFbmFibGluZyBjb21wYXRpYmlsaXR5IGhvbGVcbiIpOwotICAgIGVuYWJsZV9jb21wYXRpYmlsaXR5X2hvbGUoKTsKLQotICAgIC8qIEFsbG9jYXRlIG1lbW9yeSAqLwotICAgIC8qIEZJWE1FOiBXZSBzaG91bGRuJ3QgdXNlIHRoaXMgbXVjaCBtZW1vcnkgcmVhbGx5LiAqLwotICAgIG1lbXNldCgmTSwgMCwgc2l6ZW9mKFg4NkVNVV9zeXNFbnYpKTsKLSAgICBNLm1lbV9iYXNlID0gbWFsbG9jKEVNVUxBVE9SX01FTV9TSVpFKTsKLSAgICBNLm1lbV9zaXplID0gRU1VTEFUT1JfTUVNX1NJWkU7Ci0KLSAgICBpZiAoIU0ubWVtX2Jhc2UpCi0gICAgewotCVBSSU5URigiVW5hYmxlIHRvIGFsbG9jYXRlIG9uZSBtZWdhYnl0ZSBmb3IgZW11bGF0b3JcbiIpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIGlmIChhdHRlbXB0X21hcF9yb20oZ3JfZGV2LCBNLm1lbV9iYXNlICsgRU1VTEFUT1JfQklPU19PRkZTRVQpID09IDApCi0gICAgewotCVBSSU5URigiRXJyb3IgbWFwcGluZyByb20uIEVtdWxhdGlvbiB0ZXJtaW5hdGVkXG4iKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSNpZiAxIC8qZGVmIERFQlVHKi8KLSAgICBzID0gZ2V0ZW52KCJ4ODZfYXNrX3N0YXJ0Iik7Ci0gICAgaWYgKHMpCi0gICAgewotCXByaW50ZigiUHJlc3MgJ3EnIHRvIHNraXAgaW5pdGlhbGl6YXRpb24sICdkJyBmb3IgZHJ5IGluaXRcbidpJyBmb3IgaS9vIHNlc3Npb24iKTsKLQl3aGlsZSAoIXRzdGMoKSk7Ci0JYyA9IGdldGMoKTsKLQlpZiAoYyA9PSAncScpIHJldHVybiAwOwotCWlmIChjID09ICdkJykKLQl7Ci0JICAgIGV4dGVybiB2b2lkIGJpb3Nfc2V0X21vZGUoaW50IG1vZGUpOwotCSAgICBiaW9zX3NldF9tb2RlKDB4MDMpOwotCSAgICByZXR1cm4gMDsKLQl9Ci0JaWYgKGMgPT0gJ2knKSBkb19pbm91dCgpOwotICAgIH0KLQotCi0jZW5kaWYKLQotI2lmZGVmIEVBU1RFUkVHRwotLyogICAgaWYgKHRzdGMoKSkKLSAgICB7Ci0JaWYgKGdldGMoKSA9PSAnYycpCi0JewotCSAgICBlYXN0ZXJlZ2dfYWN0aXZlID0gMTsKLQl9Ci0gICAgfQotKi8KLSAgICBpZiAoZ2V0ZW52KCJlYXN0ZXJlZ2ciKSkKLSAgICB7Ci0JZWFzdGVyZWdnX2FjdGl2ZSA9IDE7Ci0gICAgfQotCi0gICAgaWYgKGVhc3RlcmVnZ19hY3RpdmUpCi0gICAgewotCS8qIFlheSEgKi8KLQlzZXRlbnYoIng4Nl9tb2RlIiwgIjEiKTsKLQlzZXRlbnYoInZnYV9mZ19jb2xvciIsICIxMSIpOwotCXNldGVudigidmdhX2JnX2NvbG9yIiwgIjEiKTsKLQllYXN0ZXJlZ2dfYWN0aXZlID0gMTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHN0cmFwID0gKHU4KilNLm1lbV9iYXNlICsgRU1VTEFUT1JfU1RSQVBfT0ZGU0VUOwotCi0gICAgewotCWNoYXIgKm0gPSBnZXRlbnYoIng4Nl9tb2RlIik7Ci0JaWYgKG0pCi0JewotCSAgICBtb3JlX3N0cmFwWzNdID0gYXRvaShtKTsKLQkgICAgaWYgKG1vcmVfc3RyYXBbM10gPT0gMSkgdmlkZW9fc2l6ZSg0MCwgMjUpOwotCSAgICBlbHNlICAgICAgICAgICAgICAgICAgICB2aWRlb19zaXplKDgwLCAyNSk7Ci0JfQotICAgIH0KLQotICAgIC8qCi0gICAgICogUG9rZSB0aGUgc3RyYXAgcm91dGluZS4gVGhpcyBtaWdodCBuZWVkIGEgYml0IG9mIGV4dGVuZGluZwotICAgICAqIGlmIHRoZXJlIGlzIGEgbW9kZSBzd2l0Y2ggaW52b2x2ZWQsIGkuZS4gd2Ugd2FudCB0byBpbnQxMAotICAgICAqIGFmdGVyd2FyZHMgdG8gc2V0IGEgZGlmZmVyZW50IGdyYXBoaWNzIG1vZGUsIG9yIGFsdGVybmF0aXZlbHkKLSAgICAgKiB0aGVyZSBtaWdodCBiZSBhIGRpZmZlcmVudCBzdGFydCBhZGRyZXNzIHJlcXVpcmVtZW50IGlmIHRoZQotICAgICAqIFJPTSBkb2Vzbid0IGhhdmUgYW4geDg2IGltYWdlIGluIGl0cyBmaXJzdCBpbWFnZS4KLSAgICAgKi8KLQotICAgIFBSSU5URigiUG9raW5nIHN0cmFwLi4uXG4iKTsKLQotICAgIC8qIEZBUiBDQUxMIGMwMDA6MDAwMyAqLwotICAgICpzdHJhcCsrID0gMHg5QTsgKnN0cmFwKysgPSAweDAzOyAqc3RyYXArKyA9IDB4MDA7Ci0gICAgKnN0cmFwKysgPSAweDAwOyAqc3RyYXArKyA9IDB4QzA7Ci0KLSNpZiAxCi0gICAgLyogaW5zZXJ0IGFkZGl0aW9uYWwgc3RyYXAgY29kZSAqLwotICAgIGZvciAoaT0wOyBpIDwgTU9SRV9TVFJBUF9CWVRFUzsgaSsrKQotICAgIHsKLQkqc3RyYXArKyA9IG1vcmVfc3RyYXBbaV07Ci0gICAgfQotI2VuZGlmCi0gICAgLyogSEFMVCAqLwotICAgICpzdHJhcCsrID0gMHhGNDsKLQotICAgIFBSSU5URigiU2V0dGluZyB1cCBsb2dvIGRhdGFcbiIpOwotICAgIGxvZ28gPSAodW5zaWduZWQgY2hhciAqKU0ubWVtX2Jhc2UgKyBFTVVMQVRPUl9MT0dPX09GRlNFVDsKLSAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQotICAgIHsKLQkqbG9nbysrID0gMHhGRjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNldHVwIHRoZSBpbml0IHBhcmFtZXRlcnMuCi0gICAgICogUGVyIFBDSSBzcGVjcywgQUggbXVzdCBjb250YWluIHRoZSBidXMgYW5kIEFMCi0gICAgICogbXVzdCBjb250YWluIHRoZSBkZXZmbiwgZW5jb2RlZCBhcyAoZGV2PDwzKXxmbgotICAgICAqLwotCi0gICAgLyogRXhlY3V0aW9uIHN0YXJ0cyBoZXJlICovCi0gICAgTS54ODYuUl9DUyA9IFNFRyhFTVVMQVRPUl9TVFJBUF9PRkZTRVQpOwotICAgIE0ueDg2LlJfSVAgPSBPRkYoRU1VTEFUT1JfU1RSQVBfT0ZGU0VUKTsKLQotICAgIC8qIFN0YWNrIGF0IHRvcCBvZiByYW0gKi8KLSAgICBNLng4Ni5SX1NTID0gU0VHKEVNVUxBVE9SX1NUQUNLX09GRlNFVCk7Ci0gICAgTS54ODYuUl9TUCA9IE9GRihFTVVMQVRPUl9TVEFDS19PRkZTRVQpOwotCi0gICAgLyogSW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE0ueDg2LlJfQUggPSBQQ0lfQlVTKGdyX2Rldik7Ci0gICAgTS54ODYuUl9BTCA9IChQQ0lfREVWKGdyX2Rldik8PDMpIHwgUENJX0ZVTkMoZ3JfZGV2KTsKLQotICAgIC8qIFNldCB0aGUgSS9PIGFuZCBtZW1vcnkgYWNjZXNzIGZ1bmN0aW9ucyAqLwotICAgIFg4NkVNVV9zZXR1cE1lbUZ1bmNzKCZfQTFfbWVtKTsKLSAgICBYODZFTVVfc2V0dXBQaW9GdW5jcygmX0ExX3Bpbyk7Ci0KLSAgICAvKiBFbmFibGUgdGltZXIgMiAqLwotICAgIGNmZyA9IGluX2J5dGUoMHg2MSk7IC8qIEdldCBNaXNjIGNvbnRyb2wgKi8KLSAgICBjZmcgfD0gMHgwMTsgICAgICAgICAvKiBFbmFibGUgdGltZXIgMiAqLwotICAgIG91dF9ieXRlKDB4NjEsIGNmZyk7IC8qIG91dHB1dCBhZ2FpbiAqLwotCi0gICAgLyogU2V0IHVwIHRoZSB0aW1lcnMgKi8KLSAgICBvdXRfYnl0ZSgweDQzLCAweDU0KTsKLSAgICBvdXRfYnl0ZSgweDQxLCAweDE4KTsKLQotICAgIG91dF9ieXRlKDB4NDMsIDB4MzYpOwotICAgIG91dF9ieXRlKDB4NDAsIDB4MDApOwotICAgIG91dF9ieXRlKDB4NDAsIDB4MDApOwotCi0gICAgb3V0X2J5dGUoMHg0MywgMHhiNik7Ci0gICAgb3V0X2J5dGUoMHg0MiwgMHgzMSk7Ci0gICAgb3V0X2J5dGUoMHg0MiwgMHgxMyk7Ci0KLSAgICAvKiBJbml0IHRoZSAiQklPUyIuICovCi0gICAgYmlvc19pbml0KCk7Ci0KLSAgICAvKiBWaWRlbyBDYXJkIFJlc2V0ICovCi0gICAgb3V0X2J5dGUoMHgzRDgsIDApOwotICAgIG91dF9ieXRlKDB4M0I4LCAxKTsKLSAgICAodm9pZClpbl9ieXRlKDB4M0JBKTsKLSAgICAodm9pZClpbl9ieXRlKDB4M0RBKTsKLSAgICBvdXRfYnl0ZSgweDNDMCwgMCk7Ci0gICAgb3V0X2J5dGUoMHg2MSwgMHhGQyk7Ci0KLSNpZmRlZiBERUJVRwotICAgIHMgPSBfZ2V0ZW52KCJ4ODZfc2luZ2xlc3RlcCIpOwotICAgIGlmIChzICYmIHN0cmNtcChzLCAib24iKT09MCkKLSAgICB7Ci0JUFJJTlRGKCJFbmFibGluZyBzaW5nbGUgc3RlcHBpbmcgZm9yIGRlYnVnXG4iKTsKLQlYODZFTVVfdHJhY2Vfb24oKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8qIFJlYWR5IHNldCBnby4uLiAqLwotICAgIFBSSU5URigiUnVubmluZyBlbXVsYXRvclxuIik7Ci0gICAgWDg2RU1VX2V4ZWMoKTsKLSAgICBQUklOVEYoIkRvbmUgcnVubmluZyBlbXVsYXRvclxuIik7Ci0KLS8qIEZJWE1FOiBSZW1vdmUgbWUgKi8KLSAgICBwYWxfcmVzZXQgPSBnZXRlbnYoIng4Nl9wYWxldHRlX3Jlc2V0Iik7Ci0gICAgaWYgKHBhbF9yZXNldCAmJiBzdHJjbXAocGFsX3Jlc2V0LCAib24iKSA9PSAwKQotICAgIHsKLQlQUklOVEYoIlBhbGV0dGUgcmVzZXRcbiIpOwotCS8qKHZvaWQpaW5fYnl0ZSgweDNkYSk7ICovCi0JLypvdXRfYnl0ZSgweDNjMCwgMCk7ICovCi0KLQlvdXRfYnl0ZSgweDNDOCwgMCk7Ci0Jb3V0X2J5dGUoMHgzQzksIDApOwotCW91dF9ieXRlKDB4M0M5LCAwKTsKLQlvdXRfYnl0ZSgweDNDOSwgMCk7Ci0JZm9yIChpPTA7IGk8MjU0OyBpKyspCi0JewotCSAgICBvdXRfYnl0ZSgweDNDOSwgNjMpOwotCSAgICBvdXRfYnl0ZSgweDNDOSwgNjMpOwotCSAgICBvdXRfYnl0ZSgweDNDOSwgNjMpOwotCX0KLQotCW91dF9ieXRlKDB4M2MwLCAweDIwKTsKLSAgICB9Ci0vKiBGSVhNRTogcmVtb3ZlIG1lICovCi0jaWZkZWYgRUFTVEVSRUdHCi0gICAgaWYgKGVhc3RlcmVnZ19hY3RpdmUpCi0gICAgewotCWV4dGVybiB2b2lkIHZpZGVvX2Vhc3RlcmVnZyh2b2lkKTsKLQl2aWRlb19lYXN0ZXJlZ2coKTsKLSAgICB9Ci0jZW5kaWYKLS8qCi0gICAgY3VycmVudF9hdHRyID0gdmlkZW9fZ2V0X2F0dHIoKTsKLSAgICBmYiA9ICh1OCAqKVZJREVPX0JBU0U7Ci0gICAgZm9yIChpPTA7IGk8dmlkZW9fcm93cygpKnZpZGVvX2NvbHMoKSoyOyBpKz0yKQotICAgIHsKLQkqKGZiK2kpID0gJyAnOwotCSooZmIraSsxKSA9IGN1cnJlbnRfYXR0cjsKLSAgICB9Ci0KLSAgICBmYiA9ICh1OCAqKVZJREVPX0JBU0UgKyAodmlkZW9fcm93cygpKS0xKih2aWRlb19jb2xzKCkqMik7Ci0gICAgZm9yIChpPTA7IGk8dmlkZW9fY29scygpOyBpKyspCi0gICAgewotCSooZmIgKyAyKmkpICAgICA9IDMyOwotCSooZmIgKyAyKmkgKyAxKSA9IDB4MTc7Ci0gICAgfQotCi0gICAgbXNnID0gZG9uZV9tc2c7Ci0gICAgd2hpbGUgKCptc2cpCi0gICAgewotCSpmYiA9ICptc2c7Ci0JZmIgICs9IDI7Ci0JbXNnICsrOwotICAgIH0KLSovCi0jaWZkZWYgREVCVUcKLSAgICBpZiAoZ2V0ZW52KCJ4ODZfZG9faW5vdXQiKSkgZG9faW5vdXQoKTsKLSNlbmRpZgotCi0vKkZJWE1FOiAgICBkY2FjaGVfZGlzYWJsZSgpOyAqLwotICAgIHJldHVybiAxOwotfQotCi0vKiBDbGVhbiB1cCB0aGUgeDg2IG1lc3MgKi8KLXZvaWQgc2h1dGRvd25fYmlvcyh2b2lkKQotewotLyogICAgZGlzYWJsZV9jb21wYXRpYmlsaXR5X2hvbGUoKTsgKi8KLSAgICAvKiBGcmVlIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCAqLwotICAgIGZyZWUoTS5tZW1fYmFzZSk7Ci0KLX0KLQotaW50IHRvX2ludChjaGFyICpidWZmZXIpCi17Ci0gICAgaW50IGJhc2UgPSAwOwotICAgIGludCByZXMgID0gMDsKLQotICAgIGlmICgqYnVmZmVyID09ICckJykKLSAgICB7Ci0JYmFzZSA9IDE2OwotCWJ1ZmZlcisrOwotICAgIH0KLSAgICBlbHNlIGJhc2UgPSAxMDsKLQotICAgIGZvciAoOzspCi0gICAgewotCXN3aXRjaCgqYnVmZmVyKQotCXsKLQljYXNlICcwJyAuLi4gJzknOgotCSAgICByZXMgKj0gYmFzZTsKLQkgICAgcmVzICs9ICpidWZmZXIgLSAnMCc7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ0EnOgotCWNhc2UgJ2EnOgotCSAgICByZXMgKj0gYmFzZTsKLQkgICAgcmVzICs9IDEwOwotCSAgICBicmVhazsKLQljYXNlICdCJzoKLQljYXNlICdiJzoKLQkgICAgcmVzICo9IGJhc2U7Ci0JICAgIHJlcyArPSAxMTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAnQyc6Ci0JY2FzZSAnYyc6Ci0JICAgIHJlcyAqPSBiYXNlOwotCSAgICByZXMgKz0gMTI7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ0QnOgotCWNhc2UgJ2QnOgotCSAgICByZXMgKj0gYmFzZTsKLQkgICAgcmVzICs9IDEzOwotCSAgICBicmVhazsKLQljYXNlICdFJzoKLQljYXNlICdlJzoKLQkgICAgcmVzICo9IGJhc2U7Ci0JICAgIHJlcyArPSAxNDsKLQkgICAgYnJlYWs7Ci0JY2FzZSAnRic6Ci0JY2FzZSAnZic6Ci0JICAgIHJlcyAqPSBiYXNlOwotCSAgICByZXMgKz0gMTU7Ci0JICAgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAgIHJldHVybiByZXM7Ci0JfQotCWJ1ZmZlcisrOwotICAgIH0KLSAgICByZXR1cm4gcmVzOwotfQotCi12b2lkIG9uZV9hcmcoY2hhciAqYnVmZmVyLCBpbnQgKmEpCi17Ci0gICAgd2hpbGUgKCpidWZmZXIgJiYgKmJ1ZmZlciAhPSAnXG4nKQotICAgIHsKLQlpZiAoKmJ1ZmZlciA9PSAnICcpIGJ1ZmZlcisrOwotCWVsc2UgYnJlYWs7Ci0gICAgfQotCi0gICAgKmEgPSB0b19pbnQoYnVmZmVyKTsKLX0KLQotdm9pZCB0d29fYXJncyhjaGFyICpidWZmZXIsIGludCAqYSwgaW50ICpiKQotewotICAgIHdoaWxlICgqYnVmZmVyICYmICpidWZmZXIgIT0gJ1xuJykKLSAgICB7Ci0JaWYgKCpidWZmZXIgPT0gJyAnKSBidWZmZXIrKzsKLQllbHNlIGJyZWFrOwotICAgIH0KLQotICAgICphID0gdG9faW50KGJ1ZmZlcik7Ci0KLSAgICB3aGlsZSAoKmJ1ZmZlciAmJiAqYnVmZmVyICE9ICdcbicpCi0gICAgewotCWlmICgqYnVmZmVyICE9ICcgJykgYnVmZmVyKys7Ci0JZWxzZSBicmVhazsKLSAgICB9Ci0KLSAgICB3aGlsZSAoKmJ1ZmZlciAmJiAqYnVmZmVyICE9ICdcbicpCi0gICAgewotCWlmICgqYnVmZmVyID09ICcgJykgYnVmZmVyKys7Ci0JZWxzZSBicmVhazsKLSAgICB9Ci0KLSAgICAqYiA9IHRvX2ludChidWZmZXIpOwotfQotCi12b2lkIGRvX2lub3V0KHZvaWQpCi17Ci0gICAgY2hhciBidWZmZXJbMjU2XTsKLSAgICBjaGFyICphcmcxLCAqYXJnMjsKLSAgICBpbnQgYSxiOwotCi0gICAgcHJpbnRmKCJJbi9PdXQgU2Vzc2lvblxuVXNlICdpW2J3bF0nIGZvciBpbiwgJ29bYndsXScgZm9yIG91dCBhbmQgJ3EnIHRvIHF1aXRcbiIpOwotCi0gICAgZG8KLSAgICB7Ci0JY29uc19nZXRzKGJ1ZmZlcik7Ci0JcHJpbnRmKCJcbiIpOwotCi0JKmFyZzEgPSBidWZmZXI7Ci0Jd2hpbGUgKCphcmcxICE9ICcgJyApIGFyZzErKzsKLQl3aGlsZSAoKmFyZzEgPT0gJyAnKSBhcmcxKys7Ci0KLQlpZiAoYnVmZmVyWzBdID09ICdpJykKLQl7Ci0JICAgIG9uZV9hcmcoYnVmZmVyKzIsICZhKTsKLQkgICAgc3dpdGNoIChidWZmZXJbMV0pCi0JICAgIHsKLQkgICAgY2FzZSAnYic6Ci0JCXByaW50ZigiaW5fYnl0ZSgleGgpID0gJXhoXG4iLCBhLCBBMV9pbmIoYSkpOwotCQlicmVhazsKLQkgICAgY2FzZSAndyc6Ci0JCXByaW50ZigiaW5fd29yZCgleGgpID0gJXhoXG4iLCBhLCBBMV9pbncoYSkpOwotCQlicmVhazsKLQkgICAgY2FzZSAnbCc6Ci0JCXByaW50ZigiaW5fZHdvcmQoJXhoKSA9ICV4aFxuIiwgYSwgQTFfaW5sKGEpKTsKLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JCXByaW50ZigiSW52YWxpZCBsZW5ndGggJyVjJ1xuIiwgYnVmZmVyWzFdKTsKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0JZWxzZSBpZiAoYnVmZmVyWzBdID09ICdvJykKLQl7Ci0JICAgIHR3b19hcmdzKGJ1ZmZlcisyLCAmYSwgJmIpOwotCSAgICBzd2l0Y2ggKGJ1ZmZlclsxXSkKLQkgICAgewotCSAgICBjYXNlICdiJzoKLQkJcHJpbnRmKCJvdXRfYnl0ZSglZCwgJWQpXG4iLCBhLCBiKTsKLQkJQTFfb3V0YihhLGIpOwotCQlicmVhazsKLQkgICAgY2FzZSAndyc6Ci0JCXByaW50Zigib3V0X3dvcmQoJWQsICVkKVxuIiwgYSwgYik7Ci0JCUExX291dHcoYSwgYik7Ci0JCWJyZWFrOwotCSAgICBjYXNlICdsJzoKLQkJcHJpbnRmKCJvdXRfbG9uZyglZCwgJWQpXG4iLCBhLCBiKTsKLQkJQTFfb3V0bChhLCBiKTsKLQkJYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JCXByaW50ZigiSW52YWxpZCBsZW5ndGggJyVjJ1xuIiwgYnVmZmVyWzFdKTsKLQkJYnJlYWs7Ci0JICAgIH0KLQl9IGVsc2UgaWYgKGJ1ZmZlclswXSA9PSAncScpIHJldHVybjsKLSAgICB9IHdoaWxlICgxKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL01BSS9tZW51L2NtZF9tZW51LmMgYi9ib2FyZC9NQUkvbWVudS9jbWRfbWVudS5jCmluZGV4IGE1MTViZDguLjA3OWYxZmYgMTAwNjQ0Ci0tLSBhL2JvYXJkL01BSS9tZW51L2NtZF9tZW51LmMKKysrIGIvYm9hcmQvTUFJL21lbnUvY21kX21lbnUuYwpAQCAtNyw3ICs3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX0FNSUdBT05FRzNTRSkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQlNQKQorI2lmIGRlZmluZWQoQ09ORklHX0FNSUdBT05FRzNTRSkgJiYgZGVmaW5lZChDT05GSUdfQ01EX0JTUCkKIFVfQk9PVF9DTUQoCiAJbWVudSwgICAxLCAgICAgIDEsICAgICAgZG9fbWVudSwKIAkibWVudSAgICAtIGRpc3BsYXkgQklPUyBzZXR1cCBtZW51XG4iLApkaWZmIC0tZ2l0IGEvYm9hcmQvTWFydmVsbC9jb21tb24vc2VyaWFsLmMgYi9ib2FyZC9NYXJ2ZWxsL2NvbW1vbi9zZXJpYWwuYwppbmRleCA2YTFkNGQ3Li4wMWVmYmVhIDEwMDY0NAotLS0gYS9ib2FyZC9NYXJ2ZWxsL2NvbW1vbi9zZXJpYWwuYworKysgYi9ib2FyZC9NYXJ2ZWxsL2NvbW1vbi9zZXJpYWwuYwpAQCAtMTQ1LDcgKzE0NSw3IEBACiAJfQogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIHZvaWQga2dkYl9zZXJpYWxfaW5pdCAodm9pZCkKIHsKIH0KQEAgLTE2OSw0ICsxNjksNCBAQAogewogCXJldHVybjsKIH0KLSNlbmRpZiAvKiBDRkdfQ01EX0tHREIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvYTMwMDAvdS1ib290LmxkcyBiL2JvYXJkL2EzMDAwL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYjlmZmQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvYTMwMDAvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNHgvc3RhcnQubwkJKC50ZXh0KQotICAgIGxpYl9wcGMvYm9hcmQubwkJKC50ZXh0KQotICAgIGxpYl9wcGMvcHBjc3RyaW5nLm8JCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy92c3ByaW50Zi5vCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy9jcmMzMi5vCQkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvemxpYi5vCQkoLnRleHQpCi0KLQkuID0gREVGSU5FRChlbnZfb2Zmc2V0KSA/IGVudl9vZmZzZXQgOiAuOwotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vICgudGV4dCkKLQotCSooLnRleHQpCi0KLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvYWRzNTEyMS9NYWtlZmlsZSBiL2JvYXJkL2FkczUxMjEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q4MTQ4YwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FkczUxMjEvTWFrZWZpbGUKQEAgLTAsMCArMSw1MCBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDcKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQk9BUkQpLmEKKworQ09CSlMJOj0gJChCT0FSRCkubworCitTUkNTCTo9ICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKK1NPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSkKKworJChMSUIpOgkkKG9iaikuZGVwZW5kICQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46CWNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYm9hcmQvYWRzNTEyMS9hZHM1MTIxLmMgYi9ib2FyZC9hZHM1MTIxL2FkczUxMjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjc1Y2U3Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYWRzNTEyMS9hZHM1MTIxLmMKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDcgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZworICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjNTEyeC5oPgorI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisKKy8qIENsb2NrcyBpbiB1c2UgKi8KKyNkZWZpbmUgU0NDUjFfQ0xPQ0tTX0VOCShDTE9DS19TQ0NSMV9DRkdfRU4gfAkJCQlcCisJCQkgQ0xPQ0tfU0NDUjFfTFBDX0VOIHwJCQkJXAorCQkJIENMT0NLX1NDQ1IxX1BTQ19FTihDT05GSUdfUFNDX0NPTlNPTEUpIHwJXAorCQkJIENMT0NLX1NDQ1IxX1BTQ0ZJRk9fRU4gfAkJCVwKKwkJCSBDTE9DS19TQ0NSMV9ERFJfRU4gfAkJCQlcCisJCQkgQ0xPQ0tfU0NDUjFfRkVDX0VOKQorCisjZGVmaW5lIFNDQ1IyX0NMT0NLU19FTgkoQ0xPQ0tfU0NDUjJfTUVNX0VOIHwJCVwKKwkJCSBDTE9DS19TQ0NSMl9TUERJRl9FTiB8CQlcCisJCQkgQ0xPQ0tfU0NDUjJfSTJDX0VOKQorCisjZGVmaW5lIENTQVdfU1RBUlQoc3RhcnQpCSgoc3RhcnQpICYgMHhGRkZGMDAwMCkKKyNkZWZpbmUgQ1NBV19TVE9QKHN0YXJ0LCBzaXplKQkoKChzdGFydCkgKyAoc2l6ZSkgLSAxKSA+PiAxNikKKworbG9uZyBpbnQgZml4ZWRfc2RyYW0odm9pZCk7CisKK2ludCBib2FyZF9lYXJseV9pbml0X2YgKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW0gPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKwl1MzIgbHBjYXc7CisKKwkvKgorCSAqIEluaXRpYWxpemUgTG9jYWwgV2luZG93IGZvciB0aGUgQ1BMRCByZWdpc3RlcnMgYWNjZXNzIChDUzIgc2VsZWN0cworCSAqIHRoZSBDUExEIGNoaXApCisJICovCisJaW0tPnN5c2NvbmYubHBjczJhdyA9IENTQVdfU1RBUlQoQ0ZHX0NQTERfQkFTRSkgfAorCQkJICAgICAgQ1NBV19TVE9QKENGR19DUExEX0JBU0UsIENGR19DUExEX1NJWkUpOworCWltLT5scGMuY3NfY2ZnWzJdID0gQ0ZHX0NTMl9DRkc7CisKKwkvKgorCSAqIEFjY29yZGluZyB0byBNUEM1MTIxZSBSTSwgY29uZmlndXJpbmcgbG9jYWwgYWNjZXNzIHdpbmRvd3Mgc2hvdWxkCisJICogYmUgZm9sbG93ZWQgYnkgYSBkdW1teSByZWFkIG9mIHRoZSBjb25maWcgcmVnaXN0ZXIgdGhhdCB3YXMKKwkgKiBtb2RpZmllZCBsYXN0IGFuZCBhbiBpc3luYworCSAqLworCWxwY2F3ID0gaW0tPnN5c2NvbmYubHBjczJhdzsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImlzeW5jIik7CisKKwkvKgorCSAqIERpc2FibGUgQm9vdCBOT1IgRkxBU0ggd3JpdGUgcHJvdGVjdCAtIENQTEQgUmVnIDggTk9SIEZMQVNIIENvbnRyb2wKKwkgKgorCSAqIFdpdGhvdXQgdGhpcyB0aGUgZmxhc2ggaWRlbnRpZmljYXRpb24gcm91dGluZSBmYWlscywgYXMgaXQgbmVlZHMgdG8gaXNzdWUKKwkgKiB3cml0ZSBjb21tYW5kcyBpbiBvcmRlciB0byBlc3RhYmxpc2ggdGhlIGRldmljZSBJRC4KKwkgKi8KKwkqKCh2b2xhdGlsZSB1OCAqKShDRkdfQ1BMRF9CQVNFICsgMHgwOCkpID0gMHhDMTsKKworCS8qCisJICogRW5hYmxlIGNsb2NrcworCSAqLworCWltLT5jbGsuc2NjclswXSA9IFNDQ1IxX0NMT0NLU19FTjsKKwlpbS0+Y2xrLnNjY3JbMV0gPSBTQ0NSMl9DTE9DS1NfRU47CisKKwlyZXR1cm4gMDsKK30KKworbG9uZyBpbnQgaW5pdGRyYW0gKGludCBib2FyZF90eXBlKQoreworCXUzMiBtc2l6ZSA9IDA7CisKKwltc2l6ZSA9IGZpeGVkX3NkcmFtICgpOworCisJcmV0dXJuIG1zaXplOworfQorCisvKgorICogZml4ZWQgc2RyYW0gaW5pdCAtLSB0aGUgYm9hcmQgZG9lc24ndCB1c2UgbWVtb3J5IG1vZHVsZXMgdGhhdCBoYXZlIHNlcmlhbCBwcmVzZW5jZQorICogZGV0ZWN0IG9yIHNpbWlsYXIgbWVjaGFuaXNtIGZvciBkaXNjb3Zlcnkgb2YgdGhlIERSQU0gc2V0dGluZ3MKKyAqLworbG9uZyBpbnQgZml4ZWRfc2RyYW0gKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW0gPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKwl1MzIgbXNpemUgPSBDRkdfRERSX1NJWkUgKiAxMDI0ICogMTAyNDsKKwl1MzIgbXNpemVfbG9nMiA9IF9faWxvZzIgKG1zaXplKTsKKwl1MzIgaTsKKworCS8qIEluaXRpYWxpemUgSU8gQ29udHJvbCAqLworCWltLT5pb19jdHJsLnJlZ3NbTUVNX0lEWF0gPSBJT0NUUkxfTVVYX0REUjsKKworCS8qIEluaXRpYWxpemUgRERSIExvY2FsIFdpbmRvdyAqLworCWltLT5zeXNjb25mLmRkcmxhdy5iYXIgPSBDRkdfRERSX0JBU0UgJiAweEZGRkZGMDAwOworCWltLT5zeXNjb25mLmRkcmxhdy5hciA9IG1zaXplX2xvZzIgLSAxOworCisJLyoKKwkgKiBBY2NvcmRpbmcgdG8gTVBDNTEyMWUgUk0sIGNvbmZpZ3VyaW5nIGxvY2FsIGFjY2VzcyB3aW5kb3dzIHNob3VsZAorCSAqIGJlIGZvbGxvd2VkIGJ5IGEgZHVtbXkgcmVhZCBvZiB0aGUgY29uZmlnIHJlZ2lzdGVyIHRoYXQgd2FzCisJICogbW9kaWZpZWQgbGFzdCBhbmQgYW4gaXN5bmMKKwkgKi8KKwlpID0gaW0tPnN5c2NvbmYuZGRybGF3LmFyOworCV9fYXNtX18gX192b2xhdGlsZV9fICgiaXN5bmMiKTsKKworCS8qIEVuYWJsZSBERFIgKi8KKwlpbS0+bWRkcmMuZGRyX3N5c19jb25maWcgPSBDRkdfTUREUkNfU1lTX0NGR19FTjsKKworCS8qIEluaXRpYWxpemUgRERSIFByaW9yaXR5IE1hbmFnZXIgKi8KKwlpbS0+bWRkcmMucHJpb21hbl9jb25maWcxID0gQ0ZHX01ERFJDR1JQX1BNX0NGRzE7CisJaW0tPm1kZHJjLnByaW9tYW5fY29uZmlnMiA9IENGR19NRERSQ0dSUF9QTV9DRkcyOworCWltLT5tZGRyYy5oaXByaW9fY29uZmlnID0gQ0ZHX01ERFJDR1JQX0hJUFJJT19DRkc7CisJaW0tPm1kZHJjLmx1dF90YWJsZTBfbWFpbl91cHBlciA9IENGR19NRERSQ0dSUF9MVVQwX01VOworCWltLT5tZGRyYy5sdXRfdGFibGUxX21haW5fdXBwZXIgPSBDRkdfTUREUkNHUlBfTFVUMV9NVTsKKwlpbS0+bWRkcmMubHV0X3RhYmxlMl9tYWluX3VwcGVyID0gQ0ZHX01ERFJDR1JQX0xVVDJfTVU7CisJaW0tPm1kZHJjLmx1dF90YWJsZTNfbWFpbl91cHBlciA9IENGR19NRERSQ0dSUF9MVVQzX01VOworCWltLT5tZGRyYy5sdXRfdGFibGU0X21haW5fdXBwZXIgPSBDRkdfTUREUkNHUlBfTFVUNF9NVTsKKwlpbS0+bWRkcmMubHV0X3RhYmxlMF9tYWluX2xvd2VyID0gQ0ZHX01ERFJDR1JQX0xVVDBfTUw7CisJaW0tPm1kZHJjLmx1dF90YWJsZTFfbWFpbl9sb3dlciA9IENGR19NRERSQ0dSUF9MVVQxX01MOworCWltLT5tZGRyYy5sdXRfdGFibGUyX21haW5fbG93ZXIgPSBDRkdfTUREUkNHUlBfTFVUMl9NTDsKKwlpbS0+bWRkcmMubHV0X3RhYmxlM19tYWluX2xvd2VyID0gQ0ZHX01ERFJDR1JQX0xVVDNfTUw7CisJaW0tPm1kZHJjLmx1dF90YWJsZTRfbWFpbl9sb3dlciA9IENGR19NRERSQ0dSUF9MVVQ0X01MOworCWltLT5tZGRyYy5sdXRfdGFibGUwX2FsdGVybmF0ZV91cHBlciA9IENGR19NRERSQ0dSUF9MVVQwX0FVOworCWltLT5tZGRyYy5sdXRfdGFibGUxX2FsdGVybmF0ZV91cHBlciA9IENGR19NRERSQ0dSUF9MVVQxX0FVOworCWltLT5tZGRyYy5sdXRfdGFibGUyX2FsdGVybmF0ZV91cHBlciA9IENGR19NRERSQ0dSUF9MVVQyX0FVOworCWltLT5tZGRyYy5sdXRfdGFibGUzX2FsdGVybmF0ZV91cHBlciA9IENGR19NRERSQ0dSUF9MVVQzX0FVOworCWltLT5tZGRyYy5sdXRfdGFibGU0X2FsdGVybmF0ZV91cHBlciA9IENGR19NRERSQ0dSUF9MVVQ0X0FVOworCWltLT5tZGRyYy5sdXRfdGFibGUwX2FsdGVybmF0ZV9sb3dlciA9IENGR19NRERSQ0dSUF9MVVQwX0FVOworCWltLT5tZGRyYy5sdXRfdGFibGUxX2FsdGVybmF0ZV9sb3dlciA9IENGR19NRERSQ0dSUF9MVVQxX0FMOworCWltLT5tZGRyYy5sdXRfdGFibGUyX2FsdGVybmF0ZV9sb3dlciA9IENGR19NRERSQ0dSUF9MVVQyX0FMOworCWltLT5tZGRyYy5sdXRfdGFibGUzX2FsdGVybmF0ZV9sb3dlciA9IENGR19NRERSQ0dSUF9MVVQzX0FMOworCWltLT5tZGRyYy5sdXRfdGFibGU0X2FsdGVybmF0ZV9sb3dlciA9IENGR19NRERSQ0dSUF9MVVQ0X0FMOworCisJLyogSW5pdGlhbGl6ZSBNRERSQyAqLworCWltLT5tZGRyYy5kZHJfc3lzX2NvbmZpZyA9IENGR19NRERSQ19TWVNfQ0ZHOworCWltLT5tZGRyYy5kZHJfdGltZV9jb25maWcwID0gQ0ZHX01ERFJDX1RJTUVfQ0ZHMDsKKwlpbS0+bWRkcmMuZGRyX3RpbWVfY29uZmlnMSA9IENGR19NRERSQ19USU1FX0NGRzE7CisJaW0tPm1kZHJjLmRkcl90aW1lX2NvbmZpZzIgPSBDRkdfTUREUkNfVElNRV9DRkcyOworCisJLyogSW5pdGlhbGl6ZSBERFIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKKwkJaW0tPm1kZHJjLmRkcl9jb21tYW5kID0gQ0ZHX01JQ1JPTl9OT1A7CisKKwlpbS0+bWRkcmMuZGRyX2NvbW1hbmQgPSBDRkdfTUlDUk9OX1BDSEdfQUxMOworCWltLT5tZGRyYy5kZHJfY29tbWFuZCA9IENGR19NSUNST05fRU0yOworCWltLT5tZGRyYy5kZHJfY29tbWFuZCA9IENGR19NSUNST05fRU0zOworCWltLT5tZGRyYy5kZHJfY29tbWFuZCA9IENGR19NSUNST05fRU5fRExMOworCWltLT5tZGRyYy5kZHJfY29tbWFuZCA9IENGR19NSUNST05fUlNUX0RMTDsKKwlpbS0+bWRkcmMuZGRyX2NvbW1hbmQgPSBDRkdfTUlDUk9OX1BDSEdfQUxMOworCWltLT5tZGRyYy5kZHJfY29tbWFuZCA9IENGR19NSUNST05fUkZTSDsKKwlpbS0+bWRkcmMuZGRyX2NvbW1hbmQgPSBDRkdfTUlDUk9OX0lOSVRfREVWX09QOworCWltLT5tZGRyYy5kZHJfY29tbWFuZCA9IENGR19NSUNST05fT0NEX0RFRkFVTFQ7CisJaW0tPm1kZHJjLmRkcl9jb21tYW5kID0gQ0ZHX01JQ1JPTl9PQ0RfRVhJVDsKKworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQorCQlpbS0+bWRkcmMuZGRyX2NvbW1hbmQgPSBDRkdfTUlDUk9OX05PUDsKKworCS8qIFN0YXJ0IE1ERFJDICovCisJaW0tPm1kZHJjLmRkcl90aW1lX2NvbmZpZzAgPSBDRkdfTUREUkNfVElNRV9DRkcwX1JVTjsKKwlpbS0+bWRkcmMuZGRyX3N5c19jb25maWcgPSBDRkdfTUREUkNfU1lTX0NGR19SVU47CisKKwlyZXR1cm4gbXNpemU7Cit9CisKK2ludCBjaGVja2JvYXJkICh2b2lkKQoreworCXVzaG9ydCBicmRfcmV2ID0gKih2dV9zaG9ydCAqKSAoQ0ZHX0NQTERfQkFTRSArIDB4MDApOworCXVjaGFyIGNwbGRfcmV2ID0gKih2dV9jaGFyICopIChDRkdfQ1BMRF9CQVNFICsgMHgwMik7CisKKwlwcmludGYgKCJCb2FyZDogQURTNTEyMSByZXYuIDB4JTA0eCAoQ1BMRCByZXYuIDB4JTAyeClcbiIsCisJCWJyZF9yZXYsIGNwbGRfcmV2KTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL2FkczUxMjEvY29uZmlnLm1rIGIvYm9hcmQvYWRzNTEyMS9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ5OThmNAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FkczUxMjEvY29uZmlnLm1rCkBAIC0wLDAgKzEsMjMgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA3IERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcKKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworVEVYVF9CQVNFICA9ICAgMHhGRkYwMDAwMApkaWZmIC0tZ2l0IGEvYm9hcmQvYWRzNTEyMS91LWJvb3QubGRzIGIvYm9hcmQvYWRzNTEyMS91LWJvb3QubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOGQ4NDkKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9hZHM1MTIxL3UtYm9vdC5sZHMKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDcgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZy4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfQVJDSChwb3dlcnBjKQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KKyAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9CisgIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9CisgIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9CisgIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KKyAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KKyAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQorICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQorICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KKyAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQorICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KKyAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQorICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9CisgIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9CisgIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KKyAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KKyAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9CisgIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KKyAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9CisgIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KKyAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KKyAgLnBsdCA6IHsgKigucGx0KSB9CisgIC50ZXh0ICAgICAgOgorICB7CisgICAgY3B1L21wYzUxMngvc3RhcnQubwkoLnRleHQpCisgICAgKigudGV4dCkKKyAgICAqKC5maXh1cCkKKyAgICAqKC5nb3QxKQorICAgIC4gPSBBTElHTigxNik7CisgICAgKigucm9kYXRhKQorICAgICooLnJvZGF0YTEpCisgICAgKigucm9kYXRhLnN0cjEuNCkKKyAgICAqKC5laF9mcmFtZSkKKyAgfQorICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCisgIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KKyAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQorCisgIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLworICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKKyAgX2Vyb3RleHQgPSAuOworICBQUk9WSURFIChlcm90ZXh0ID0gLik7CisgIC5yZWxvYyAgIDoKKyAgeworICAgICooLmdvdCkKKyAgICBfR09UMl9UQUJMRV8gPSAuOworICAgICooLmdvdDIpCisgICAgX0ZJWFVQX1RBQkxFXyA9IC47CisgICAgKiguZml4dXApCisgIH0KKyAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKKyAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOworCisgIC5kYXRhICAgIDoKKyAgeworICAgICooLmRhdGEpCisgICAgKiguZGF0YTEpCisgICAgKiguc2RhdGEpCisgICAgKiguc2RhdGEyKQorICAgICooLmR5bmFtaWMpCisgICAgQ09OU1RSVUNUT1JTCisgIH0KKyAgX2VkYXRhICA9ICAuOworICBQUk9WSURFIChlZGF0YSA9IC4pOworCisgIC4gPSAuOworICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOworICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQorICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKKworCisgIC4gPSAuOworICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOworICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KKyAgX19zdG9wX19fZXhfdGFibGUgPSAuOworCisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19pbml0X2JlZ2luID0gLjsKKyAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9CisgIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQorICAuID0gQUxJR04oNDA5Nik7CisgIF9faW5pdF9lbmQgPSAuOworCisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICA6CisgIHsKKyAgICooLnNic3MpICooLnNjb21tb24pCisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgfQorICBfZW5kID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworfQorRU5UUlkoX3N0YXJ0KQpkaWZmIC0tZ2l0IGEvYm9hcmQvYWxhc2thL2FsYXNrYS5jIGIvYm9hcmQvYWxhc2thL2FsYXNrYS5jCmluZGV4IDkzODc0YjIuLjk1MzE3MDMgMTAwNjQ0Ci0tLSBhL2JvYXJkL2FsYXNrYS9hbGFza2EuYworKysgYi9ib2FyZC9hbGFza2EvYWxhc2thLmMKQEAgLTEzOCw3ICsxMzgsNyBAQAogCXNpemUgPSBkcmFtU2V0dXAgKCk7CiAKIC8qIGlmIGlDYWNoZSBhZCBkQ2FjaGUgaXMgZGVmaW5lZCAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0NBQ0hFKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9DQUNIRSkKIC8qICAgIHNldHVwQmF0KHNpemUpOyovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYm9hcmQvYWxhc2thL3UtYm9vdC5sZHMgYi9ib2FyZC9hbGFza2EvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg5YmM3Ny4uMDAwMDAwMAotLS0gYS9ib2FyZC9hbGFza2EvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAzLTIwMDQKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODIyMC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9hbHRlcmEvZGsxYzIwL2RrMWMyMC5jIGIvYm9hcmQvYWx0ZXJhL2RrMWMyMC9kazFjMjAuYwppbmRleCA5OGVlN2E3Li5kMGViOWVhIDEwMDY0NAotLS0gYS9ib2FyZC9hbHRlcmEvZGsxYzIwL2RrMWMyMC5jCisrKyBiL2JvYXJkL2FsdGVyYS9kazFjMjAvZGsxYzIwLmMKQEAgLTU1LDcgKzU1LDcgQEAKIAlyZXR1cm4gKDApOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpCiBpbnQgaWRlX3ByZWluaXQgKHZvaWQpCiB7CiAJbmlvc19waW9fdCAqcHJlc2VudCA9IChuaW9zX3Bpb190ICopIENGR19DRl9QUkVTRU5UOwpAQCAtNzgsNCArNzgsNCBAQAogCiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYgLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvYW1jYy9hY2FkaWEvTWFrZWZpbGUgYi9ib2FyZC9hbWNjL2FjYWRpYS9NYWtlZmlsZQppbmRleCBhYmNiZjNlLi5jNTZiMjczIDEwMDY0NAotLS0gYS9ib2FyZC9hbWNjL2FjYWRpYS9NYWtlZmlsZQorKysgYi9ib2FyZC9hbWNjL2FjYWRpYS9NYWtlZmlsZQpAQCAtMjUsNyArMjUsNyBAQAogCiBMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCiAKLUNPQkpTCT0gJChCT0FSRCkubyBjcHIubyBtZW1vcnkubworQ09CSlMJPSAkKEJPQVJEKS5vIGNtZF9hY2FkaWEubyBtZW1vcnkubyBwbGwubwogU09CSlMJPQogCiBTUkNTCTo9ICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCmRpZmYgLS1naXQgYS9ib2FyZC9hbWNjL2FjYWRpYS9hY2FkaWEuYyBiL2JvYXJkL2FtY2MvYWNhZGlhL2FjYWRpYS5jCmluZGV4IDNiNjNjOGEuLjhiODJlYTQgMTAwNjQ0Ci0tLSBhL2JvYXJkL2FtY2MvYWNhZGlhL2FjYWRpYS5jCisrKyBiL2JvYXJkL2FtY2MvYWNhZGlhL2FjYWRpYS5jCkBAIC0zMSwxMyArMzEsMTMgQEAKIAkvKgogCSAqIEdQSU8wIHNldHVwIChzZWxlY3QgR1BJTyBvciBhbHRlcm5hdGUgZnVuY3Rpb24pCiAJICovCi0gICAgICAgCW91dDMyKEdQSU8wX09TUkwsIENGR19HUElPMF9PU1JMKTsKLSAgICAgICAJb3V0MzIoR1BJTzBfT1NSSCwgQ0ZHX0dQSU8wX09TUkgpOwkvKiBvdXRwdXQgc2VsZWN0ICovCi0gICAgICAgCW91dDMyKEdQSU8wX0lTUjFMLCBDRkdfR1BJTzBfSVNSMUwpOwotICAgICAgIAlvdXQzMihHUElPMF9JU1IxSCwgQ0ZHX0dQSU8wX0lTUjFIKTsJLyogaW5wdXQgc2VsZWN0ICovCi0gICAgICAgCW91dDMyKEdQSU8wX1RTUkwsIENGR19HUElPMF9UU1JMKTsKLSAgICAgICAJb3V0MzIoR1BJTzBfVFNSSCwgQ0ZHX0dQSU8wX1RTUkgpOwkvKiB0aHJlZS1zdGF0ZSBzZWxlY3QgKi8KLSAgICAgICAJb3V0MzIoR1BJTzBfVENSLCBDRkdfR1BJTzBfVENSKTsgIC8qIGVuYWJsZSBvdXRwdXQgZHJpdmVyIGZvciBvdXRwdXRzICovCisJb3V0MzIoR1BJTzBfT1NSTCwgQ0ZHX0dQSU8wX09TUkwpOworCW91dDMyKEdQSU8wX09TUkgsIENGR19HUElPMF9PU1JIKTsJLyogb3V0cHV0IHNlbGVjdCAqLworCW91dDMyKEdQSU8wX0lTUjFMLCBDRkdfR1BJTzBfSVNSMUwpOworCW91dDMyKEdQSU8wX0lTUjFILCBDRkdfR1BJTzBfSVNSMUgpOwkvKiBpbnB1dCBzZWxlY3QgKi8KKwlvdXQzMihHUElPMF9UU1JMLCBDRkdfR1BJTzBfVFNSTCk7CisJb3V0MzIoR1BJTzBfVFNSSCwgQ0ZHX0dQSU8wX1RTUkgpOwkvKiB0aHJlZS1zdGF0ZSBzZWxlY3QgKi8KKwlvdXQzMihHUElPMF9UQ1IsIENGR19HUElPMF9UQ1IpOyAgLyogZW5hYmxlIG91dHB1dCBkcml2ZXIgZm9yIG91dHB1dHMgKi8KIAogCS8qCiAJICogVWx0cmEgKDQwNUVaKSB3YXMgbmljZSBlbm91Z2ggdG8gYWRkIGFub3RoZXIgR1BJTyBjb250cm9sbGVyCkBAIC01NSwxNiArNTUsMjQgQEAKIHsKIAl1bnNpZ25lZCBpbnQgcmVnOwogCisjaWYgIWRlZmluZWQoQ09ORklHX05BTkRfVV9CT09UKQogCS8qIGRvbid0IHJlaW5pdCBQTEwgd2hlbiBib290aW5nIHZpYSBJMkMgYm9vdHN0cmFwIG9wdGlvbiAqLwogCW1mc2RyKFNEUl9QSU5TVFAsIHJlZyk7CiAJaWYgKHJlZyAhPSAweGYwMDAwMDAwKQogCQlib2FyZF9wbGxfaW5pdF9mKCk7CisjZW5kaWYKIAogCWFjYWRpYV9ncGlvX2luaXQoKTsKIAogCS8qIENvbmZpZ3VyZSA0MDVFWiBmb3IgTkFORCB1c2FnZSAqLwotCW10c2RyKHNkcm5hbmQwLCAweDgwYzAwMDAwKTsKLQltdHNkcihzZHJ1bHRyYTAsIDB4OGQxMTAwMDApOworCW10c2RyKHNkcm5hbmQwLCBTRFJfTkFORDBfTkRFTiB8IFNEUl9OQU5EMF9OREFSRU4gfCBTRFJfTkFORDBfTkRSQkVOKTsKKwltZnNkcihzZHJ1bHRyYTAsIHJlZyk7CisJcmVnICY9IH5TRFJfVUxUUkEwX0NTTl9NQVNLOworCXJlZyB8PSAoU0RSX1VMVFJBMF9DU05TRUwwID4+IENGR19OQU5EX0NTKSB8CisJCVNEUl9VTFRSQTBfTkRHUElPQlAgfAorCQlTRFJfVUxUUkEwX0VCQ1JEWUVOIHwKKwkJU0RSX1VMVFJBMF9ORlNSU1RFTjsKKwltdHNkcihzZHJ1bHRyYTAsIHJlZyk7CiAKIAkvKiBVU0IgSG9zdCBjb3JlIG5lZWRzIHRoaXMgYml0IHNldCAqLwogCW1mc2RyKHNkcnVsdHJhMSwgcmVnKTsKZGlmZiAtLWdpdCBhL2JvYXJkL2FtY2MvYWNhZGlhL2NtZF9hY2FkaWEuYyBiL2JvYXJkL2FtY2MvYWNhZGlhL2NtZF9hY2FkaWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjdlYTM1Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYW1jYy9hY2FkaWEvY21kX2FjYWRpYS5jCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA3CisgKiBTdGVmYW4gUm9lc2UsIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHNyQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8aTJjLmg+CisKK3N0YXRpYyB1OCBib290XzI2N19ub3JbXSA9IHsKKwkweGMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhlLCAweDAwLAorCTB4MTQsIDB4YzAsIDB4MzYsIDB4Y2MsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorfTsKKworc3RhdGljIHU4IGJvb3RfMjY3X25hbmRbXSA9IHsKKwkweGQwLCAweDM4LCAweGMzLCAweDUwLCAweDEzLCAweDg4LCAweDhlLCAweDAwLAorCTB4MTQsIDB4YzAsIDB4MzYsIDB4Y2MsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorfTsKKworc3RhdGljIGludCBkb19ib290c3RyYXAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJdTggY2hpcDsKKwl1OCAqYnVmOworCWludCBjcHVfZnJlcTsKKworCWlmIChhcmdjIDwgMykgeworCQlwcmludGYoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CisJCXJldHVybiAxOworCX0KKworCWNwdV9mcmVxID0gc2ltcGxlX3N0cnRvbChhcmd2WzFdLCBOVUxMLCAxMCk7CisJaWYgKGNwdV9mcmVxICE9IDI2NykgeworCQlwcmludGYoIlVuc3VwcG9ydGVkIGNwdS1mcmVxdWVuY3kgLSBvbmx5IDI2NyBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiB1c2UgMHg1MCBhcyBJMkMgRUVQUk9NIGFkZHJlc3MgZm9yIG5vdyAqLworCWNoaXAgPSAweDUwOworCisJaWYgKChzdHJjbXAoYXJndlsyXSwgIm5vciIpICE9IDApICYmCisJICAgIChzdHJjbXAoYXJndlsyXSwgIm5hbmQiKSAhPSAwKSkgeworCQlwcmludGYoIlVuc3VwcG9ydGVkIGJvb3QtZGV2aWNlIC0gb25seSBub3J8bmFuZCBzdXBwb3J0XG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHN0cmNtcChhcmd2WzJdLCAibmFuZCIpID09IDApIHsKKwkJc3dpdGNoIChjcHVfZnJlcSkgeworCQljYXNlIDI2NzoKKwkJCWJ1ZiA9IGJvb3RfMjY3X25hbmQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChjcHVfZnJlcSkgeworCQljYXNlIDI2NzoKKwkJCWJ1ZiA9IGJvb3RfMjY3X25vcjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaTJjX3dyaXRlKGNoaXAsIDAsIDEsIGJ1ZiwgMTYpICE9IDApCisJCXByaW50ZigiRXJyb3Igd3JpdGluZyB0byBFRVBST00gYXQgYWRkcmVzcyAweCV4XG4iLCBjaGlwKTsKKwl1ZGVsYXkoQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0RFTEFZX01TICogMTAwMCk7CisJaWYgKGkyY193cml0ZShjaGlwLCAweDEwLCAxLCBidWYrMTYsIDQpICE9IDApCisJCXByaW50ZigiRXJyb3IyIHdyaXRpbmcgdG8gRUVQUk9NIGF0IGFkZHJlc3MgMHgleFxuIiwgY2hpcCk7CisKKwlwcmludGYoIkRvbmVcbiIpOworCXByaW50ZigiUGxlYXNlIHBvd2VyLWN5Y2xlIHRoZSBib2FyZCBmb3IgdGhlIGNoYW5nZXMgdG8gdGFrZSBlZmZlY3RcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK1VfQk9PVF9DTUQoCisJYm9vdHN0cmFwLAkzLAkwLAlkb19ib290c3RyYXAsCisJImJvb3RzdHJhcCAtIHByb2dyYW0gdGhlIEkyQyBib290c3RyYXAgRUVQUk9NXG4iLAorCSI8Y3B1LWZyZXE+IDxub3J8bmFuZD4gLSBwcm9ncmFtIHRoZSBJMkMgYm9vdHN0cmFwIEVFUFJPTVxuIgorCSk7CmRpZmYgLS1naXQgYS9ib2FyZC9hbWNjL2FjYWRpYS9jb25maWcubWsgYi9ib2FyZC9hbWNjL2FjYWRpYS9jb25maWcubWsKaW5kZXggYzg1NjZlYy4uYWY1YTQ2YyAxMDA2NDQKLS0tIGEvYm9hcmQvYW1jYy9hY2FkaWEvY29uZmlnLm1rCisrKyBiL2JvYXJkL2FtY2MvYWNhZGlhL2NvbmZpZy5tawpAQCAtMjEsNiArMjEsMTIgQEAKICMgTUEgMDIxMTEtMTMwNyBVU0EKICMKIAorIworIyBBTUNDIDQwNUVaIFJlZmVyZW5jZSBQbGF0Zm9ybSAoQWNhZGlhKSBib2FyZAorIworCitzaW5jbHVkZSAkKE9CSlRSRUUpL2JvYXJkLyQoQk9BUkRESVIpL2NvbmZpZy50bXAKKwogaWZuZGVmIFRFWFRfQkFTRQogVEVYVF9CQVNFID0gMHhGRkZDMDAwMAogZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL2FtY2MvYWNhZGlhL21lbW9yeS5jIGIvYm9hcmQvYW1jYy9hY2FkaWEvbWVtb3J5LmMKaW5kZXggNTM3NWQzNi4uOTM0NmQyYyAxMDA2NDQKLS0tIGEvYm9hcmQvYW1jYy9hY2FkaWEvbWVtb3J5LmMKKysrIGIvYm9hcmQvYW1jYy9hY2FkaWEvbWVtb3J5LmMKQEAgLTMxLDYgKzMxLDggQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vZ3Bpby5oPgogCitleHRlcm4gdm9pZCBib2FyZF9wbGxfaW5pdF9mKHZvaWQpOworCiAvKgogICogc2RyYW1faW5pdCAtIER1bW15IGltcGxlbWVudGF0aW9uIGZvciBzdGFydC5TLCBzcGRfc2RyYW0gdXNlZCBvbiB0aGlzIGJvYXJkIQogICovCkBAIC0zOSw2ICs0MSw3IEBACiAJcmV0dXJuOwogfQogCisjaWYgIWRlZmluZWQoQ09ORklHX05BTkRfVV9CT09UKSB8fCBkZWZpbmVkKENPTkZJR19OQU5EX1NQTCkKIHN0YXRpYyB2b2lkIGNyYW1fYmNyX3dyaXRlKHUzMiB3cl92YWwpCiB7CiAJd3JfdmFsIDw8PSAyOwpAQCAtNjIsOSArNjUsMjEgQEAKIAogCXJldHVybjsKIH0KKyNlbmRpZgogCiBsb25nIGludCBpbml0ZHJhbShpbnQgYm9hcmRfdHlwZSkKIHsKKyNpZiBkZWZpbmVkKENPTkZJR19OQU5EX1NQTCkKKwl1MzIgcmVnOworCisJLyogZG9uJ3QgcmVpbml0IFBMTCB3aGVuIGJvb3RpbmcgdmlhIEkyQyBib290c3RyYXAgb3B0aW9uICovCisJbWZzZHIoU0RSX1BJTlNUUCwgcmVnKTsKKwlpZiAocmVnICE9IDB4ZjAwMDAwMDApCisJCWJvYXJkX3BsbF9pbml0X2YoKTsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoQ09ORklHX05BTkRfVV9CT09UKSB8fCBkZWZpbmVkKENPTkZJR19OQU5EX1NQTCkKKwlpbnQgaTsKIAl1MzIgdmFsOwogCiAJLyogMS4gRUJDIG5lZWQgdG8gcHJvZ3JhbSBSRUFEWSwgQ0xLLCBBRFYgZm9yIEFTeW5jIG1vZGUgKi8KQEAgLTkyLDcgKzEwNywxMiBAQAogCiAJLyogQ29uZmlnIEVCQyB0byB1c2UgUkRZICovCiAJbWZzZHIoc2RydWx0cmEwLCB2YWwpOwotCW10c2RyKHNkcnVsdHJhMCwgdmFsIHwgMHgwNDAwMDAwMCk7CisJbXRzZHIoc2RydWx0cmEwLCB2YWwgfCBTRFJfVUxUUkEwX0VCQ1JEWUVOKTsKKworCS8qIFdhaXQgYSBzaG9ydCB3aGlsZSwgc2luY2UgZm9yIE5BTkQgYm9vdGluZyB0aGlzIGlzIHRvbyBmYXN0ICovCisJZm9yIChpPTA7IGk8MjAwMDAwOyBpKyspCisJCTsKKyNlbmRpZgogCiAJcmV0dXJuIChDRkdfTUJZVEVTX1JBTSA8PCAyMCk7CiB9CmRpZmYgLS1naXQgYS9ib2FyZC9hbWNjL2FjYWRpYS9jcHIuYyBiL2JvYXJkL2FtY2MvYWNhZGlhL3BsbC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBib2FyZC9hbWNjL2FjYWRpYS9jcHIuYwpyZW5hbWUgdG8gYm9hcmQvYW1jYy9hY2FkaWEvcGxsLmMKZGlmZiAtLWdpdCBhL2JvYXJkL2FtY2MvYWNhZGlhL3UtYm9vdC1uYW5kLmxkcyBiL2JvYXJkL2FtY2MvYWNhZGlhL3UtYm9vdC1uYW5kLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWRhZTBlCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYW1jYy9hY2FkaWEvdS1ib290LW5hbmQubGRzCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA3CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9BUkNIKHBvd2VycGMpCitTRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9CisgIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQorICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQorICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQorICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9CisgIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9CisgIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KKyAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KKyAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9CisgIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KKyAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9CisgIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KKyAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQorICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQorICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9CisgIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9CisgIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQorICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9CisgIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQorICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9CisgIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9CisgIC5wbHQgOiB7ICooLnBsdCkgfQorICAudGV4dCAgICAgIDoKKyAgeworICAgIC8qIFdBUk5JTkcgLSB0aGUgZm9sbG93aW5nIGlzIGhhbmQtb3B0aW1pemVkIHRvIGZpdCB3aXRoaW4JKi8KKyAgICAvKiB0aGUgc2VjdG9yIGxheW91dCBvZiBvdXIgZmxhc2ggY2hpcHMhCVhYWCBGSVhNRSBYWFgJKi8KKworICAgIGNwdS9wcGM0eHgvc3RhcnQubwkoLnRleHQpCisKKyAgICAvKiBBbGlnbiB0byBuZXh0IE5BTkQgYmxvY2sgKi8KKyAgICAuID0gQUxJR04oMHg0MDAwKTsKKyAgICBjb21tb24vZW52aXJvbm1lbnQubyAgKC5wcGNlbnYpCisgICAgLyogS2VlcCBzb21lIHNwYWNlIGhlcmUgZm9yIHJlZHVuZGFudCBlbnYgYW5kIHBvdGVudGlhbCBiYWQgZW52IGJsb2NrcyAqLworICAgIC4gPSBBTElHTigweDEwMDAwKTsKKworICAgICooLnRleHQpCisgICAgKiguZml4dXApCisgICAgKiguZ290MSkKKyAgfQorICBfZXRleHQgPSAuOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgIDoKKyAgeworICAgICooLnJvZGF0YSkKKyAgICAqKC5yb2RhdGExKQorICAgICooLnJvZGF0YS5zdHIxLjQpCisgIH0KKyAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAorICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9CisgIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KKworICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KKyAgLiA9ICguICsgMHgwMEZGKSAmIDB4RkZGRkZGMDA7CisgIF9lcm90ZXh0ID0gLjsKKyAgUFJPVklERSAoZXJvdGV4dCA9IC4pOworICAucmVsb2MgICA6CisgIHsKKyAgICAqKC5nb3QpCisgICAgX0dPVDJfVEFCTEVfID0gLjsKKyAgICAqKC5nb3QyKQorICAgIF9GSVhVUF9UQUJMRV8gPSAuOworICAgICooLmZpeHVwKQorICB9CisgIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+MjsKKyAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKT4+MjsKKworICAuZGF0YSAgICA6CisgIHsKKyAgICAqKC5kYXRhKQorICAgICooLmRhdGExKQorICAgICooLnNkYXRhKQorICAgICooLnNkYXRhMikKKyAgICAqKC5keW5hbWljKQorICAgIENPTlNUUlVDVE9SUworICB9CisgIF9lZGF0YSAgPSAgLjsKKyAgUFJPVklERSAoZWRhdGEgPSAuKTsKKworICAuID0gLjsKKyAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKKyAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KKyAgX191X2Jvb3RfY21kX2VuZCA9IC47CisKKworICAuID0gLjsKKyAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKKyAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9CisgIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKKworICAuID0gQUxJR04oMjU2KTsKKyAgX19pbml0X2JlZ2luID0gLjsKKyAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9CisgIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQorICAuID0gQUxJR04oMjU2KTsKKyAgX19pbml0X2VuZCA9IC47CisKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgIDoKKyAgeworICAgKiguc2JzcykgKiguc2NvbW1vbikKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICB9CisKKyAgX2VuZCA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL2FtY2MvYmFtYm9vL2JhbWJvby5jIGIvYm9hcmQvYW1jYy9iYW1ib28vYmFtYm9vLmMKaW5kZXggMmU2NTFkZi4uY2FmNjY5MCAxMDA2NDQKLS0tIGEvYm9hcmQvYW1jYy9iYW1ib28vYmFtYm9vLmMKKysrIGIvYm9hcmQvYW1jYy9iYW1ib28vYmFtYm9vLmMKQEAgLTQxNiw3ICs0MTYsNyBAQAogICoJY2VydGFpbiBwcmUtaW5pdGlhbGl6YXRpb24gYWN0aW9ucy4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmIGRlZmluZWQoQ09ORklHX1BDSSkgJiYgZGVmaW5lZChDRkdfUENJX1BSRV9JTklUKQorI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKIGludCBwY2lfcHJlX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQogewogCXVuc2lnbmVkIGxvbmcgYWRkcjsKQEAgLTQ1Nyw3ICs0NTcsNyBAQAogCiAJcmV0dXJuIDE7CiB9Ci0jZW5kaWYJCQkJLyogZGVmaW5lZChDT05GSUdfUENJKSAmJiBkZWZpbmVkKENGR19QQ0lfUFJFX0lOSVQpICovCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfUENJKSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogIHBjaV90YXJnZXRfaW5pdApkaWZmIC0tZ2l0IGEvYm9hcmQvYW1jYy9lYm9ueS9lYm9ueS5jIGIvYm9hcmQvYW1jYy9lYm9ueS9lYm9ueS5jCmluZGV4IGRjYWZhYzkuLmVkZWRiM2UgMTAwNjQ0Ci0tLSBhL2JvYXJkL2FtY2MvZWJvbnkvZWJvbnkuYworKysgYi9ib2FyZC9hbWNjL2Vib255L2Vib255LmMKQEAgLTIwNywxNCArMjA3LDE0IEBACiAgKgljZXJ0YWluIHByZS1pbml0aWFsaXphdGlvbiBhY3Rpb25zLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgZGVmaW5lZChDT05GSUdfUENJKSAmJiBkZWZpbmVkKENGR19QQ0lfUFJFX0lOSVQpCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQogaW50IHBjaV9wcmVfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCiB7CiAJdW5zaWduZWQgbG9uZyBzdHJhcDsKIAogCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICAgICoJVGhlIGVib255IGJvYXJkIGlzIGFsd2F5cyBjb25maWd1cmVkIGFzIHRoZSBob3N0ICYgcmVxdWlyZXMgdGhlCi0gICAgICoJUENJIGFyYml0ZXIgdG8gYmUgZW5hYmxlZC4KKwkgKiBUaGUgZWJvbnkgYm9hcmQgaXMgYWx3YXlzIGNvbmZpZ3VyZWQgYXMgdGhlIGhvc3QgJiByZXF1aXJlcyB0aGUKKwkgKiBQQ0kgYXJiaXRlciB0byBiZSBlbmFibGVkLgogCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCXN0cmFwID0gbWZkY3IoY3BjMF9zdHJwMSk7CiAJaWYgKChzdHJhcCAmIDB4MDAxMDAwMDApID09IDApIHsKQEAgLTIyNCw3ICsyMjQsNyBAQAogCiAJcmV0dXJuIDE7CiB9Ci0jZW5kaWYJCQkJLyogZGVmaW5lZChDT05GSUdfUENJKSAmJiBkZWZpbmVkKENGR19QQ0lfUFJFX0lOSVQpICovCisjZW5kaWYJLyogZGVmaW5lZChDT05GSUdfUENJKSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogIHBjaV90YXJnZXRfaW5pdApkaWZmIC0tZ2l0IGEvYm9hcmQvYW1jYy9rYXRtYWkva2F0bWFpLmMgYi9ib2FyZC9hbWNjL2thdG1haS9rYXRtYWkuYwppbmRleCAyODZiZGMxLi5iODA0ZDU1IDEwMDY0NAotLS0gYS9ib2FyZC9hbWNjL2thdG1haS9rYXRtYWkuYworKysgYi9ib2FyZC9hbWNjL2thdG1haS9rYXRtYWkuYwpAQCAtMjkyLDcgKzI5Miw3IEBACiAgKgljZXJ0YWluIHByZS1pbml0aWFsaXphdGlvbiBhY3Rpb25zLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgZGVmaW5lZChDT05GSUdfUENJKSAmJiBkZWZpbmVkKENGR19QQ0lfUFJFX0lOSVQpCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQogaW50IHBjaV9wcmVfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKiBob3NlICkKIHsKIAl1bnNpZ25lZCBsb25nIHN0cmFwOwpAQCAtMzA5LDcgKzMwOSw3IEBACiAKIAlyZXR1cm4gMTsKIH0KLSNlbmRpZgkvKiBkZWZpbmVkKENPTkZJR19QQ0kpICYmIGRlZmluZWQoQ0ZHX1BDSV9QUkVfSU5JVCkgKi8KKyNlbmRpZgkvKiBkZWZpbmVkKENPTkZJR19QQ0kpICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgcGNpX3RhcmdldF9pbml0CmRpZmYgLS1naXQgYS9ib2FyZC9hbWNjL2x1YW4vbHVhbi5jIGIvYm9hcmQvYW1jYy9sdWFuL2x1YW4uYwppbmRleCA3NzhhYWZjLi4yZWZmM2IzIDEwMDY0NAotLS0gYS9ib2FyZC9hbWNjL2x1YW4vbHVhbi5jCisrKyBiL2JvYXJkL2FtY2MvbHVhbi9sdWFuLmMKQEAgLTE2MSw3ICsxNjEsNyBAQAogICoJY2VydGFpbiBwcmUtaW5pdGlhbGl6YXRpb24gYWN0aW9ucy4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmIGRlZmluZWQoQ09ORklHX1BDSSkgJiYgZGVmaW5lZChDRkdfUENJX1BSRV9JTklUKQorI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKIGludCBwY2lfcHJlX2luaXQoIHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSApCiB7CiAJdW5zaWduZWQgbG9uZyBzdHJhcDsKQEAgLTE3OSw3ICsxNzksNyBAQAogCiAJcmV0dXJuICAxOwogfQotI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1BDSSkgJiYgZGVmaW5lZChDRkdfUENJX1BSRV9JTklUKSAqLworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1BDSSkgKi8KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvYm9hcmQvYW1jYy9vY290ZWEvb2NvdGVhLmMgYi9ib2FyZC9hbWNjL29jb3RlYS9vY290ZWEuYwppbmRleCAzZjZkMjA0Li4zYmQxYjgxIDEwMDY0NAotLS0gYS9ib2FyZC9hbWNjL29jb3RlYS9vY290ZWEuYworKysgYi9ib2FyZC9hbWNjL29jb3RlYS9vY290ZWEuYwpAQCAtMzA2LDcgKzMwNiw3IEBACiAgKgljZXJ0YWluIHByZS1pbml0aWFsaXphdGlvbiBhY3Rpb25zLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgZGVmaW5lZChDT05GSUdfUENJKSAmJiBkZWZpbmVkKENGR19QQ0lfUFJFX0lOSVQpCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQogaW50IHBjaV9wcmVfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKiBob3NlICkKIHsKIAl1bnNpZ25lZCBsb25nIHN0cmFwOwpAQCAtMzIzLDcgKzMyMyw3IEBACiAKIAlyZXR1cm4gMTsKIH0KLSNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19QQ0kpICYmIGRlZmluZWQoQ0ZHX1BDSV9QUkVfSU5JVCkgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19QQ0kpICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgcGNpX3RhcmdldF9pbml0CmRpZmYgLS1naXQgYS9ib2FyZC9hbWNjL3NlcXVvaWEvTWFrZWZpbGUgYi9ib2FyZC9hbWNjL3NlcXVvaWEvTWFrZWZpbGUKaW5kZXggMDZlZjdmOS4uZTFjOWFkNCAxMDA2NDQKLS0tIGEvYm9hcmQvYW1jYy9zZXF1b2lhL01ha2VmaWxlCisrKyBiL2JvYXJkL2FtY2Mvc2VxdW9pYS9NYWtlZmlsZQpAQCAtMjUsNyArMjUsNyBAQAogCiBMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCiAKLUNPQkpTCT0gJChCT0FSRCkubyBzZHJhbS5vCitDT0JKUwk9ICQoQk9BUkQpLm8gY21kX3NlcXVvaWEubyBzZHJhbS5vCiBTT0JKUwk9IGluaXQubwogCiBTUkNTCTo9ICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCmRpZmYgLS1naXQgYS9ib2FyZC9hbWNjL3NlcXVvaWEvY21kX3NlcXVvaWEuYyBiL2JvYXJkL2FtY2Mvc2VxdW9pYS9jbWRfc2VxdW9pYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYzYwZWEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9hbWNjL3NlcXVvaWEvY21kX3NlcXVvaWEuYwpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNworICogU3RlZmFuIFJvZXNlLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCBzckBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGkyYy5oPgorCitzdGF0aWMgdTggYm9vdF81MzNfbm9yW10gPSB7CisJMHg4NywgMHg3OCwgMHg4MiwgMHg1MiwgMHgwOSwgMHg1NywgMHhhMCwgMHgzMCwKKwkweDQwLCAweDA4LCAweDIzLCAweDUwLCAweDBkLCAweDA1LCAweDAwLCAweDAwCit9OworCitzdGF0aWMgdTggYm9vdF81MzNfbmFuZFtdID0geworCTB4ODcsIDB4NzgsIDB4ODIsIDB4NTIsIDB4MDksIDB4NTcsIDB4ZDAsIDB4MTAsCisJMHhhMCwgMHg2OCwgMHgyMywgMHg1OCwgMHgwZCwgMHgwNSwgMHgwMCwgMHgwMAorfTsKKworc3RhdGljIHU4IGJvb3RfNjY3X25vcltdID0geworCTB4ODcsIDB4NzgsIDB4YTIsIDB4NTIsIDB4MDksIDB4ZDcsIDB4YTAsIDB4MzAsCisJMHg0MCwgMHgwOCwgMHgyMywgMHg1MCwgMHgwZCwgMHgwNSwgMHgwMCwgMHgwMAorfTsKKworc3RhdGljIHU4IGJvb3RfNjY3X25hbmRbXSA9IHsKKwkweDg3LCAweDc4LCAweGEyLCAweDUyLCAweDA5LCAweGQ3LCAweGQwLCAweDEwLAorCTB4YTAsIDB4NjgsIDB4MjMsIDB4NTgsIDB4MGQsIDB4MDUsIDB4MDAsIDB4MDAKK307CisKK3N0YXRpYyBpbnQgZG9fYm9vdHN0cmFwKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXU4IGNoaXA7CisJdTggKmJ1ZjsKKwlpbnQgY3B1X2ZyZXE7CisKKwlpZiAoYXJnYyA8IDMpIHsKKwkJcHJpbnRmKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOworCQlyZXR1cm4gMTsKKwl9CisKKwljcHVfZnJlcSA9IHNpbXBsZV9zdHJ0b2woYXJndlsxXSwgTlVMTCwgMTApOworCWlmICghKChjcHVfZnJlcSA9PSA1MzMpIHx8IChjcHVfZnJlcSA9PSA2NjcpKSkgeworCQlwcmludGYoIlVuc3VwcG9ydGVkIGNwdS1mcmVxdWVuY3kgLSBvbmx5IDUzMyBhbmQgNjY3IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAxOworCX0KKworCS8qIHVzZSAweDUyIGFzIEkyQyBFRVBST00gYWRkcmVzcyBmb3Igbm93ICovCisJY2hpcCA9IDB4NTI7CisKKwlpZiAoKHN0cmNtcChhcmd2WzJdLCAibm9yIikgIT0gMCkgJiYKKwkgICAgKHN0cmNtcChhcmd2WzJdLCAibmFuZCIpICE9IDApKSB7CisJCXByaW50ZigiVW5zdXBwb3J0ZWQgYm9vdC1kZXZpY2UgLSBvbmx5IG5vcnxuYW5kIHN1cHBvcnRcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoc3RyY21wKGFyZ3ZbMl0sICJuYW5kIikgPT0gMCkgeworCQlzd2l0Y2ggKGNwdV9mcmVxKSB7CisJCWRlZmF1bHQ6CisJCWNhc2UgNTMzOgorCQkJYnVmID0gYm9vdF81MzNfbmFuZDsKKwkJCWJyZWFrOworCQljYXNlIDY2NzoKKwkJCWJ1ZiA9IGJvb3RfNjY3X25hbmQ7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAoY3B1X2ZyZXEpIHsKKwkJZGVmYXVsdDoKKwkJY2FzZSA1MzM6CisJCQlidWYgPSBib290XzUzM19ub3I7CisJCQlicmVhazsKKwkJY2FzZSA2Njc6CisJCQlidWYgPSBib290XzY2N19ub3I7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpMmNfd3JpdGUoY2hpcCwgMCwgMSwgYnVmLCAxNikgIT0gMCkKKwkJcHJpbnRmKCJFcnJvciB3cml0aW5nIHRvIEVFUFJPTSBhdCBhZGRyZXNzIDB4JXhcbiIsIGNoaXApOworCXVkZWxheShDRkdfRUVQUk9NX1BBR0VfV1JJVEVfREVMQVlfTVMgKiAxMDAwKTsKKworCXByaW50ZigiRG9uZVxuIik7CisJcHJpbnRmKCJQbGVhc2UgcG93ZXItY3ljbGUgdGhlIGJvYXJkIGZvciB0aGUgY2hhbmdlcyB0byB0YWtlIGVmZmVjdFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworVV9CT09UX0NNRCgKKwlib290c3RyYXAsCTMsCTAsCWRvX2Jvb3RzdHJhcCwKKwkiYm9vdHN0cmFwIC0gcHJvZ3JhbSB0aGUgSTJDIGJvb3RzdHJhcCBFRVBST01cbiIsCisJIjxjcHUtZnJlcT4gPG5vcnxuYW5kPiAtIHByb2dyYW0gdGhlIEkyQyBib290c3RyYXAgRUVQUk9NXG4iCisJKTsKZGlmZiAtLWdpdCBhL2JvYXJkL2FtY2Mvc2VxdW9pYS9zZXF1b2lhLmMgYi9ib2FyZC9hbWNjL3NlcXVvaWEvc2VxdW9pYS5jCmluZGV4IGJhMzY1YWUuLmY4MjMxMTcgMTAwNjQ0Ci0tLSBhL2JvYXJkL2FtY2Mvc2VxdW9pYS9zZXF1b2lhLmMKKysrIGIvYm9hcmQvYW1jYy9zZXF1b2lhL3NlcXVvaWEuYwpAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxwcGM0NDAuaD4KLSNpbmNsdWRlICJzZXF1b2lhLmgiCiAKIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwogCkBAIC0yMjYsNyArMjI1LDcgQEAKIAlpZiAoYWN0ID09IE5VTEwgfHwgc3RyY21wKGFjdCwgImhvc3RkZXYiKSA9PSAwKQl7CiAJCS8qIFNEUiBTZXR0aW5nICovCiAJCW1mc2RyKFNEUjBfUEZDMSwgc2RyMF9wZmMxKTsKLQkJbWZzZHIoU0RSMF9VU0IwLCB1c2IyZDBjcik7CisJCW1mc2RyKFNEUjBfVVNCMkQwQ1IsIHVzYjJkMGNyKTsKIAkJbWZzZHIoU0RSMF9VU0IyUEhZMENSLCB1c2IycGh5MGNyKTsKIAkJbWZzZHIoU0RSMF9VU0IySDBDUiwgdXNiMmgwY3IpOwogCkBAIC0yNTQsNyArMjUzLDcgQEAKIAkJc2RyMF9wZmMxID0gc2RyMF9wZmMxIHwgU0RSMF9QRkMxX1VFU19VU0IyRF9TRUw7CQkvKjAqLwogCiAJCW10c2RyKFNEUjBfUEZDMSwgc2RyMF9wZmMxKTsKLQkJbXRzZHIoU0RSMF9VU0IwLCB1c2IyZDBjcik7CisJCW10c2RyKFNEUjBfVVNCMkQwQ1IsIHVzYjJkMGNyKTsKIAkJbXRzZHIoU0RSMF9VU0IyUEhZMENSLCB1c2IycGh5MGNyKTsKIAkJbXRzZHIoU0RSMF9VU0IySDBDUiwgdXNiMmgwY3IpOwogCkBAIC0yOTgsNyArMjk3LDcgQEAKIAkJLyogU0RSIFNldHRpbmcgKi8KIAkJbWZzZHIoU0RSMF9VU0IyUEhZMENSLCB1c2IycGh5MGNyKTsKIAkJbWZzZHIoU0RSMF9VU0IySDBDUiwgdXNiMmgwY3IpOwotCQltZnNkcihTRFIwX1VTQjAsIHVzYjJkMGNyKTsKKwkJbWZzZHIoU0RSMF9VU0IyRDBDUiwgdXNiMmQwY3IpOwogCQltZnNkcihTRFIwX1BGQzEsIHNkcjBfcGZjMSk7CiAKIAkJdXNiMnBoeTBjciA9IHVzYjJwaHkwY3IgJn5TRFIwX1VTQjJQSFkwQ1JfWE9DTEtfTUFTSzsKQEAgLTMyMyw3ICszMjIsNyBAQAogCiAJCW10c2RyKFNEUjBfVVNCMkgwQ1IsIHVzYjJoMGNyKTsKIAkJbXRzZHIoU0RSMF9VU0IyUEhZMENSLCB1c2IycGh5MGNyKTsKLQkJbXRzZHIoU0RSMF9VU0IwLCB1c2IyZDBjcik7CisJCW10c2RyKFNEUjBfVVNCMkQwQ1IsIHVzYjJkMGNyKTsKIAkJbXRzZHIoU0RSMF9QRkMxLCBzZHIwX3BmYzEpOwogCiAJCS8qY2xlYXIgcmVzZXRzKi8KQEAgLTQyNiwyMyArNDI1LDEwIEBACiAgKgljZXJ0YWluIHByZS1pbml0aWFsaXphdGlvbiBhY3Rpb25zLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgZGVmaW5lZChDT05GSUdfUENJKSAmJiBkZWZpbmVkKENGR19QQ0lfUFJFX0lOSVQpCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQogaW50IHBjaV9wcmVfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyOwotI2lmIDAKLQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCSAqCUNhY3R1cyBpcyBhbHdheXMgY29uZmlndXJlZCBhcyB0aGUgaG9zdCAmIHJlcXVpcmVzIHRoZQotCSAqCVBDSSBhcmJpdGVyIHRvIGJlIGVuYWJsZWQgPz8/Ci0JICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JdW5zaWduZWQgbG9uZyBzdHJhcDsKLQltZnNkcihzZHJfc2RzdHAxLCBzdHJhcCk7Ci0JaWYgKChzdHJhcCAmIFNEUjBfU0RTVFAxX1BBRV9NQVNLKSA9PSAwKSB7Ci0JCXByaW50ZigiUENJOiBTRFIwX1NUUlAxW1BBRV0gbm90IHNldC5cbiIpOwotCQlwcmludGYoIlBDSTogQ29uZmlndXJhdGlvbiBhYm9ydGVkLlxuIik7Ci0JCXJldHVybiAwOwotCX0KLSNlbmRpZgogCiAJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogCSAgfCBTZXQgcHJpb3JpdHkgZm9yIGFsbCBQTEIzIGRldmljZXMgdG8gMC4KQEAgLTQ4MCw3ICs0NjYsNyBAQAogCiAJcmV0dXJuIDE7CiB9Ci0jZW5kaWYJCQkJLyogZGVmaW5lZChDT05GSUdfUENJKSAmJiBkZWZpbmVkKENGR19QQ0lfUFJFX0lOSVQpICovCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfUENJKSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogIHBjaV90YXJnZXRfaW5pdApAQCAtNTg2LDMgKzU3MiwxMyBAQAogCXJldHVybiAoMSk7CiB9CiAjZW5kaWYJCQkJLyogZGVmaW5lZChDT05GSUdfUENJKSAqLworI2lmIGRlZmluZWQoQ09ORklHX1BPU1QpCisvKgorICogUmV0dXJucyAxIGlmIGtleXMgcHJlc3NlZCB0byBzdGFydCB0aGUgcG93ZXItb24gbG9uZy1ydW5uaW5nIHRlc3RzCisgKiBDYWxsZWQgZnJvbSBib2FyZF9pbml0X2YoKS4KKyAqLworaW50IHBvc3RfaG90a2V5c19wcmVzc2VkKHZvaWQpCit7CisJcmV0dXJuIDA7CS8qIE5vIGhvdGtleXMgc3VwcG9ydGVkICovCit9CisjZW5kaWYgLyogQ09ORklHX1BPU1QgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL2FtY2Mvc2VxdW9pYS9zZXF1b2lhLmggYi9ib2FyZC9hbWNjL3NlcXVvaWEvc2VxdW9pYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDQ0YjE2Li4wMDAwMDAwCi0tLSBhL2JvYXJkL2FtY2Mvc2VxdW9pYS9zZXF1b2lhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDA2Ci0gKiBTdGVmYW4gUm9lc2UsIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHNyQGRlbnguZGUuCi0gKgotICogKEMpIENvcHlyaWdodCAyMDA2Ci0gKiBKYWNxdWVsaW5lIFBpcmEtRmVycmlvbCwgQU1DQy9JQk0sIGpwaXJhLWZlcnJpb2xAZnIuaWJtLmNvbQotICogQWxhaW4gU2F1cmVsLCAgICAgICAgICAgIEFNQ0MvSUJNLCBhbGFpbi5zYXVyZWxAZnIuaWJtLmNvbQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICB8IEVCQyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIC0gRUJDMF9DRkcKLSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRXh0ZXJuYWwgQnVzIFRocmVlLVN0YXRlIENvbnRyb2wgKi8KLSNkZWZpbmUgRUJDMF9DRkdfRUJUQ19EUklWRU4JICAgIDB4ODAwMDAwMDAKLS8qIERldmljZS1QYWNlZCBUaW1lLW91dCBEaXNhYmxlICovCi0jZGVmaW5lIEVCQzBfQ0ZHX1BURF9FTkFCTEVECSAgICAweDAwMDAwMDAwCi0vKiBSZWFkeSBUaW1lb3V0IENvdW50ICovCi0jZGVmaW5lIEVCQzBfQ0ZHX1JUQ19NQVNLCSAgICAweDM4MDAwMDAwCi0jZGVmaW5lIEVCQzBfQ0ZHX1JUQ18xNlBFUkNMSwkgICAgMHgwMDAwMDAwMAotI2RlZmluZSBFQkMwX0NGR19SVENfMzJQRVJDTEsJICAgIDB4MDgwMDAwMDAKLSNkZWZpbmUgRUJDMF9DRkdfUlRDXzY0UEVSQ0xLCSAgICAweDEwMDAwMDAwCi0jZGVmaW5lIEVCQzBfQ0ZHX1JUQ18xMjhQRVJDTEsJICAgIDB4MTgwMDAwMDAKLSNkZWZpbmUgRUJDMF9DRkdfUlRDXzI1NlBFUkNMSwkgICAgMHgyMDAwMDAwMAotI2RlZmluZSBFQkMwX0NGR19SVENfNTEyUEVSQ0xLCSAgICAweDI4MDAwMDAwCi0jZGVmaW5lIEVCQzBfQ0ZHX1JUQ18xMDI0UEVSQ0xLCSAgICAweDMwMDAwMDAwCi0jZGVmaW5lIEVCQzBfQ0ZHX1JUQ18yMDQ4UEVSQ0xLCSAgICAweDM4MDAwMDAwCi0vKiBFeHRlcm5hbCBNYXN0ZXIgUHJpb3JpdHkgTG93ICovCi0jZGVmaW5lIEVCQzBfQ0ZHX0VNUExfTE9XCSAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEVCQzBfQ0ZHX0VNUExfTUVESVVNX0xPVyAgICAweDAyMDAwMDAwCi0jZGVmaW5lIEVCQzBfQ0ZHX0VNUExfTUVESVVNX0hJR0ggICAweDA0MDAwMDAwCi0jZGVmaW5lIEVCQzBfQ0ZHX0VNUExfSElHSAkgICAgMHgwNjAwMDAwMAotLyogRXh0ZXJuYWwgTWFzdGVyIFByaW9yaXR5IEhpZ2ggKi8KLSNkZWZpbmUgRUJDMF9DRkdfRU1QSF9MT1cJICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgRUJDMF9DRkdfRU1QSF9NRURJVU1fTE9XICAgIDB4MDA4MDAwMDAKLSNkZWZpbmUgRUJDMF9DRkdfRU1QSF9NRURJVU1fSElHSCAgIDB4MDEwMDAwMDAKLSNkZWZpbmUgRUJDMF9DRkdfRU1QSF9ISUdICSAgICAweDAxODAwMDAwCi0vKiBDaGlwIFNlbGVjdCBUaHJlZS1TdGF0ZSBDb250cm9sICovCi0jZGVmaW5lIEVCQzBfQ0ZHX0NTVENfRFJJVkVOCSAgICAweDAwNDAwMDAwCi0vKiBCdXJzdCBQcmVmZXRjaCAqLwotI2RlZmluZSBFQkMwX0NGR19CUEZfT05FRFcJICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgRUJDMF9DRkdfQlBGX1RXT0RXCSAgICAweDAwMTAwMDAwCi0jZGVmaW5lIEVCQzBfQ0ZHX0JQRl9GT1VSRFcJICAgIDB4MDAyMDAwMDAKLS8qIEV4dGVybmFsIE1hc3RlciBTaXplICovCi0jZGVmaW5lIEVCQzBfQ0ZHX0VNU184QklUCSAgICAweDAwMDAwMDAwCi0vKiBQb3dlciBNYW5hZ2VtZW50IEVuYWJsZSAqLwotI2RlZmluZSBFQkMwX0NGR19QTUVfRElTQUJMRUQJICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgRUJDMF9DRkdfUE1FX0VOQUJMRUQJICAgIDB4MDAwMjAwMDAKLS8qIFBvd2VyIE1hbmFnZW1lbnQgVGltZXIgKi8KLSNkZWZpbmUgRUJDMF9DRkdfUE1UX0VOQ09ERShuKQkJKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDFGKTw8MTIpCi0KLSNkZWZpbmUgU0RSMF9VU0IwICAgICAgICAgICAgICAgICAgICAweDAzMjAgICAgIC8qIFVTQiBDb250cm9sIFJlZ2lzdGVyICovCmRpZmYgLS1naXQgYS9ib2FyZC9hbWNjL3RhaXNoYW4vdGFpc2hhbi5jIGIvYm9hcmQvYW1jYy90YWlzaGFuL3RhaXNoYW4uYwppbmRleCAxYTJlNTNiLi5iYzk3NmM3IDEwMDY0NAotLS0gYS9ib2FyZC9hbWNjL3RhaXNoYW4vdGFpc2hhbi5jCisrKyBiL2JvYXJkL2FtY2MvdGFpc2hhbi90YWlzaGFuLmMKQEAgLTIzNiw3ICsyMzYsNyBAQAogICoJY2VydGFpbiBwcmUtaW5pdGlhbGl6YXRpb24gYWN0aW9ucy4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmIGRlZmluZWQoQ09ORklHX1BDSSkgJiYgZGVmaW5lZChDRkdfUENJX1BSRV9JTklUKQorI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKIGludCBwY2lfcHJlX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICogaG9zZSApCiB7CiAJdW5zaWduZWQgbG9uZyBzdHJhcDsKQEAgLTI1Myw3ICsyNTMsNyBAQAogCiAJcmV0dXJuIDE7CiB9Ci0jZW5kaWYgLyogZGVmaW5lZChDT05GSUdfUENJKSAmJiBkZWZpbmVkKENGR19QQ0lfUFJFX0lOSVQpICovCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfUENJKSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogIHBjaV90YXJnZXRfaW5pdApkaWZmIC0tZ2l0IGEvYm9hcmQvYW1jYy95b3NlbWl0ZS95b3NlbWl0ZS5jIGIvYm9hcmQvYW1jYy95b3NlbWl0ZS95b3NlbWl0ZS5jCmluZGV4IGMyZTEyYmEuLjkxMmYwOWUgMTAwNjQ0Ci0tLSBhL2JvYXJkL2FtY2MveW9zZW1pdGUveW9zZW1pdGUuYworKysgYi9ib2FyZC9hbWNjL3lvc2VtaXRlL3lvc2VtaXRlLmMKQEAgLTM4NSw3ICszODUsNyBAQAogICoJY2VydGFpbiBwcmUtaW5pdGlhbGl6YXRpb24gYWN0aW9ucy4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmIGRlZmluZWQoQ09ORklHX1BDSSkgJiYgZGVmaW5lZChDRkdfUENJX1BSRV9JTklUKQorI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKIGludCBwY2lfcHJlX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQogewogCXVuc2lnbmVkIGxvbmcgYWRkcjsKQEAgLTQyNiw3ICs0MjYsNyBAQAogCiAJcmV0dXJuIDE7CiB9Ci0jZW5kaWYJCQkJLyogZGVmaW5lZChDT05GSUdfUENJKSAmJiBkZWZpbmVkKENGR19QQ0lfUFJFX0lOSVQpICovCisjZW5kaWYJLyogZGVmaW5lZChDT05GSUdfUENJKSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogIHBjaV90YXJnZXRfaW5pdApkaWZmIC0tZ2l0IGEvYm9hcmQvYW1jYy95dWNjYS95dWNjYS5jIGIvYm9hcmQvYW1jYy95dWNjYS95dWNjYS5jCmluZGV4IDkwZWFhYjEuLjczMTZjMzQgMTAwNjQ0Ci0tLSBhL2JvYXJkL2FtY2MveXVjY2EveXVjY2EuYworKysgYi9ib2FyZC9hbWNjL3l1Y2NhL3l1Y2NhLmMKQEAgLTYwNCw3ICs2MDQsNyBAQAogICoJY2VydGFpbiBwcmUtaW5pdGlhbGl6YXRpb24gYWN0aW9ucy4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmIGRlZmluZWQoQ09ORklHX1BDSSkgJiYgZGVmaW5lZChDRkdfUENJX1BSRV9JTklUKQorI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKIGludCBwY2lfcHJlX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICogaG9zZSApCiB7CiAJdW5zaWduZWQgbG9uZyBzdHJhcDsKQEAgLTYyMSw3ICs2MjEsNyBAQAogCiAJcmV0dXJuIDE7CiB9Ci0jZW5kaWYJLyogZGVmaW5lZChDT05GSUdfUENJKSAmJiBkZWZpbmVkKENGR19QQ0lfUFJFX0lOSVQpICovCisjZW5kaWYJLyogZGVmaW5lZChDT05GSUdfUENJKSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogIHBjaV90YXJnZXRfaW5pdApkaWZmIC0tZ2l0IGEvYm9hcmQvYW1pcml4L2FwMTAwMC9zZXJpYWwuYyBiL2JvYXJkL2FtaXJpeC9hcDEwMDAvc2VyaWFsLmMKaW5kZXggYzZlZTc3Mi4uNWU5ZTNhMyAxMDA2NDQKLS0tIGEvYm9hcmQvYW1pcml4L2FwMTAwMC9zZXJpYWwuYworKysgYi9ib2FyZC9hbWlyaXgvYXAxMDAwL3NlcmlhbC5jCkBAIC04NCw3ICs4NCw3IEBACiAJfQogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIHZvaWQga2dkYl9zZXJpYWxfaW5pdCAodm9pZCkKIHsKIH0KQEAgLTEwOCw0ICsxMDgsNCBAQAogewogCXJldHVybjsKIH0KLSNlbmRpZiAvKiBDRkdfQ01EX0tHREIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvYXQ5MXJtOTIwMGRrL2F0OTFybTkyMDBkay5jIGIvYm9hcmQvYXQ5MXJtOTIwMGRrL2F0OTFybTkyMDBkay5jCmluZGV4IDAwMjk4MWEuLmM1NjRmNzMgMTAwNjQ0Ci0tLSBhL2JvYXJkL2F0OTFybTkyMDBkay9hdDkxcm05MjAwZGsuYworKysgYi9ib2FyZC9hdDkxcm05MjAwZGsvYXQ5MXJtOTIwMGRrLmMKQEAgLTYyLDcgKzYyLDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19EUklWRVJfRVRIRVIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAogLyoKICAqIE5hbWU6CkBAIC04MiwxNCArODIsMTQgQEAKIAlwX3BoeW9wcy0+QXV0b05lZ290aWF0ZSA9IGRtOTE2MV9BdXRvTmVnb3RpYXRlOwogfQogCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQgKi8KKyNlbmRpZgogI2VuZGlmCS8qIENPTkZJR19EUklWRVJfRVRIRVIgKi8KIAogLyoKICAqIERpc2sgT24gQ2hpcCAoTkFORCkgTWlsbGVuaXVtIGluaXRpYWxpemF0aW9uLgogICogVGhlIE5BTkQgbGl2ZXMgaW4gdGhlIENTMiogc3BhY2UKICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiBleHRlcm4gdWxvbmcgbmFuZF9wcm9iZSAodWxvbmcgcGh5c2Fkcik7CiAKICNkZWZpbmUgQVQ5MV9TTUFSVE1FRElBX0JBU0UgMHg0MDAwMDAwMAkvKiBwaHlzaWNhbCBhZGRyZXNzIHRvIGFjY2VzcyBtZW1vcnkgb24gTkNTMyAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvYXRjL2F0Yy5jIGIvYm9hcmQvYXRjL2F0Yy5jCmluZGV4IGQyYzZiM2IuLmZlMzIxNTUgMTAwNjQ0Ci0tLSBhL2JvYXJkL2F0Yy9hdGMuYworKysgYi9ib2FyZC9hdGMvYXRjLmMKQEAgLTM3OSw3ICszNzksNyBAQAogCXJldHVybiAocHNpemUpOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRE9DKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ET0MpCiBleHRlcm4gdm9pZCBkb2NfcHJvYmUgKHVsb25nIHBoeXNhZHIpOwogdm9pZCBkb2NfaW5pdCAodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2JvYXJkL2F0Yy90aTExM3guYyBiL2JvYXJkL2F0Yy90aTExM3guYwppbmRleCBkNWU5MzVjLi5lMTEyZWNhIDEwMDY0NAotLS0gYS9ib2FyZC9hdGMvdGkxMTN4LmMKKysrIGIvYm9hcmQvYXRjL3RpMTEzeC5jCkBAIC01OTEsNyArNTkxLDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKIGludCBwY21jaWFfb2ZmICh2b2lkKQogewogCXByaW50ZiAoIkRpc2FibGUgUENNQ0lBICIgUENNQ0lBX1NMT1RfTVNHICJcbiIpOwpkaWZmIC0tZ2l0IGEvYm9hcmQvYXRjL3UtYm9vdC5sZHMgYi9ib2FyZC9hdGMvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVlODNkMC4uMDAwMDAwMAotLS0gYS9ib2FyZC9hdGMvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNjAvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICBjb21tb24vZW52aXJvbm1lbnQubygudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL2F0bWVsL2F0c3RrMTAwMC9ldGguYyBiL2JvYXJkL2F0bWVsL2F0c3RrMTAwMC9ldGguYwppbmRleCAzYTc5MTZlLi5iMmIxYTEyIDEwMDY0NAotLS0gYS9ib2FyZC9hdG1lbC9hdHN0azEwMDAvZXRoLmMKKysrIGIvYm9hcmQvYXRtZWwvYXRzdGsxMDAwL2V0aC5jCkBAIC0yNyw3ICsyNyw3IEBACiAKIGV4dGVybiBpbnQgbWFjYl9ldGhfaW5pdGlhbGl6ZShpbnQgaWQsIHZvaWQgKnJlZ3MsIHVuc2lnbmVkIGludCBwaHlfYWRkcik7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NQUNCKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfTUFDQikgJiYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIHZvaWQgYXRzdGsxMDAwX2V0aF9pbml0aWFsaXplKGJkX3QgKmJpKQogewogCWludCBpZCA9IDA7CmRpZmYgLS1naXQgYS9ib2FyZC9iYXJjby91LWJvb3QubGRzIGIvYm9hcmQvYmFyY28vdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JmODUzMS4uMDAwMDAwMAotLS0gYS9ib2FyZC9iYXJjby91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjR4L3N0YXJ0Lm8JKC50ZXh0KQotICAgIGxpYl9wcGMvYm9hcmQubwkoLnRleHQpCi0gICAgbGliX3BwYy9wcGNzdHJpbmcubwkoLnRleHQpCi0KLQkuID0gREVGSU5FRChlbnZfb2Zmc2V0KSA/IGVudl9vZmZzZXQgOiAuOwotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vICgudGV4dCkKLQotCSooLnRleHQpCi0KLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvYmMzNDUwL2JjMzQ1MC5jIGIvYm9hcmQvYmMzNDUwL2JjMzQ1MC5jCmluZGV4IDA1YmI3MjMuLjU2YTczZmUgMTAwNjQ0Ci0tLSBhL2JvYXJkL2JjMzQ1MC9iYzM0NTAuYworKysgYi9ib2FyZC9iYzM0NTAvYmMzNDUwLmMKQEAgLTI5NCw3ICsyOTQsNyBAQAogfQogI2VuZGlmCiAKLSNpZiBkZWZpbmVkIChDRkdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfUkVTRVQpCiAKIHZvaWQgaW5pdF9pZGVfcmVzZXQgKHZvaWQpCiB7CkBAIC0zMTUsNyArMzE1LDcgQEAKIAkJKih2dV9sb25nICopIE1QQzVYWFhfV1VfR1BJT19EQVRBX08gfD0gIEdQSU9fUFNDMV80OwogCX0KIH0KLSNlbmRpZiAvKiBkZWZpbmVkIChDRkdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkgKi8KKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BPU1QKIC8qCmRpZmYgLS1naXQgYS9ib2FyZC9iYzM0NTAvY21kX2JjMzQ1MC5jIGIvYm9hcmQvYmMzNDUwL2NtZF9iYzM0NTAuYwppbmRleCA2YmJlNGU2Li4xNDU1OTUzIDEwMDY0NAotLS0gYS9ib2FyZC9iYzM0NTAvY21kX2JjMzQ1MC5jCisrKyBiL2JvYXJkL2JjMzQ1MC9jbWRfYmMzNDUwLmMKQEAgLTMwLDcgKzMwLDcgQEAKIC8qCiAgKiBCQzM0NTAgc3BlY2lmaWMgY29tbWFuZHMKICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JTUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQlNQKQogCiAjdW5kZWYgREVCVUcKICNpZmRlZiBERUJVRwpAQCAtODI0LDQgKzgyNCw0IEBACiAJICAgICJ0ZXN0IHVuaXQtb2ZmXG4iCiAJICAgICIgICAgIC0gdHVybnMgb2ZmIHRoZSBCQzM0NTAgdW5pdFxuIgogCSAgICAiICAgICAgIFdBUk5JTkc6IFVuc2F2ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdpbGwgYmUgbG9zdCFcbiIpOwotI2VuZGlmIC8qIENGR19DTURfQlNQICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL2JjMzQ1MC91LWJvb3QubGRzIGIvYm9hcmQvYmMzNDUwL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYjk4YTguLjAwMDAwMDAKLS0tIGEvYm9hcmQvYmMzNDUwL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMy0yMDA0Ci0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzV4eHgvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvYmY1Mzctc3RhbXAvYmY1Mzctc3RhbXAuYyBiL2JvYXJkL2JmNTM3LXN0YW1wL2JmNTM3LXN0YW1wLmMKaW5kZXggNDdmN2M5ZS4uOTE5Y2VmNiAxMDA2NDQKLS0tIGEvYm9hcmQvYmY1Mzctc3RhbXAvYmY1Mzctc3RhbXAuYworKysgYi9ib2FyZC9iZjUzNy1zdGFtcC9iZjUzNy1zdGFtcC5jCkBAIC0xNTksNyArMTU5LDcgQEAKIAl1bnNpZ25lZCBjaGFyICpwTUFDYWRkciA9ICh1bnNpZ25lZCBjaGFyICopMHgyMDNGMDAwMDsKIAl1OCBTcmNBZGRyWzZdID0geyAweDAyLCAweDgwLCAweEFELCAweDIwLCAweDMxLCAweEI4IH07CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAkvKiBUaGUgMHhGRiBjaGVjayBoZXJlIGlzIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCB1c2UgdGhlIGFkZHJlc3MKIAkgKiBpbiBmbGFzaCBpZiBpdCdzIHNpbXBseSBiZWVuIGVyYXNlZCAoYWthIGFsbCAweEZGIHZhbHVlcykgKi8KIAlpZiAoZ2V0ZW52KCJldGhhZGRyIikgPT0gTlVMTCAmJiBpc192YWxpZF9ldGhlcl9hZGRyKHBNQUNhZGRyKSkgewpAQCAtMTcxLDcgKzE3MSw3IEBACiAJaWYgKGdldGVudigiZXRoYWRkciIpKSB7CiAJCVNldHVwTWFjQWRkcihTcmNBZGRyKTsKIAl9Ci0jZW5kaWYJCQkJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQgKi8KKyNlbmRpZgogI2VuZGlmCQkJCS8qIEJGSU5fQk9PVF9NT0RFID09IEJGNTM3X0JZUEFTU19CT09UICovCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX0lERSkKZGlmZiAtLWdpdCBhL2JvYXJkL2JmNTM3LXN0YW1wL2V0aGVyX2JmNTM3LmMgYi9ib2FyZC9iZjUzNy1zdGFtcC9ldGhlcl9iZjUzNy5jCmluZGV4IGYwMDgzN2EuLjM2YzE1MzYgMTAwNjQ0Ci0tLSBhL2JvYXJkL2JmNTM3LXN0YW1wL2V0aGVyX2JmNTM3LmMKKysrIGIvYm9hcmQvYmY1Mzctc3RhbXAvZXRoZXJfYmY1MzcuYwpAQCAtNDIsMTMgKzQyLDEzIEBACiAjZGVmaW5lIERFQlVHRihmbXQsYXJncy4uLikKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAKICNkZWZpbmUgUlhCVUZfQkFTRV9BRERSCQkweEZGOTAwMDAwCiAjZGVmaW5lIFRYQlVGX0JBU0VfQUREUgkJMHhGRjgwMDAwMAogI2RlZmluZSBUWF9CVUZfQ05UCQkxCiAKLSNkZWZpbmUgVE9VVF9MT09QIAkJMTAwMDAwMAorI2RlZmluZSBUT1VUX0xPT1AJCTEwMDAwMDAKIAogQURJX0VUSEVSX0JVRkZFUiAqdHhidWZbVFhfQlVGX0NOVF07CiBBRElfRVRIRVJfQlVGRkVSICpyeGJ1ZltQS1RCVUZTUlhdOwpAQCAtNTQyLDQgKzU0Miw0IEBACiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYKLSNlbmRpZgkJCQkvKiBDRkdfQ01EX05FVCAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9iZjUzNy1zdGFtcC9mbGFzaC1kZWZpbmVzLmggYi9ib2FyZC9iZjUzNy1zdGFtcC9mbGFzaC1kZWZpbmVzLmgKaW5kZXggYWNjMWU4Ni4uMWZhN2ExMCAxMDA2NDQKLS0tIGEvYm9hcmQvYmY1Mzctc3RhbXAvZmxhc2gtZGVmaW5lcy5oCisrKyBiL2JvYXJkL2JmNTM3LXN0YW1wL2ZsYXNoLWRlZmluZXMuaApAQCAtNDQsOSArNDQsOSBAQAogI2RlZmluZSBFUkFTRV9TRUNUCQk2CiAjZGVmaW5lIFJFQUQJCQk3CiAjZGVmaW5lIEdFVF9TRUNUTlVNCQk4Ci0jZGVmaW5lIEZMQVNIX1NUQVJUX0wgCQkweDAwMDAKLSNkZWZpbmUgRkxBU0hfU1RBUlRfSCAJCTB4MjAwMAotI2RlZmluZSBGTEFTSF9NQU5fU1QgCQkyCisjZGVmaW5lIEZMQVNIX1NUQVJUX0wJCTB4MDAwMAorI2RlZmluZSBGTEFTSF9TVEFSVF9ICQkweDIwMDAKKyNkZWZpbmUgRkxBU0hfTUFOX1NUCQkyCiAjZGVmaW5lIFJFU0VUX1ZBTAkJMHhGMAogCiBmbGFzaF9pbmZvX3QgZmxhc2hfaW5mb1tDRkdfTUFYX0ZMQVNIX0JBTktTXTsKZGlmZiAtLWdpdCBhL2JvYXJkL2JmNTM3LXN0YW1wL25hbmQuYyBiL2JvYXJkL2JmNTM3LXN0YW1wL25hbmQuYwppbmRleCA0ZDZlNzc2Li5mOTViNTg0IDEwMDY0NAotLS0gYS9ib2FyZC9iZjUzNy1zdGFtcC9uYW5kLmMKKysrIGIvYm9hcmQvYmY1Mzctc3RhbXAvbmFuZC5jCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogCiAjaW5jbHVkZSA8bmFuZC5oPgogCkBAIC0xMDMsNCArMTAzLDQgQEAKIAluYW5kLT5kZXZfcmVhZHkgPSBiZmluX2RldmljZV9yZWFkeTsKIAluYW5kLT5jaGlwX2RlbGF5ID0gMzA7CiB9Ci0jZW5kaWYJCQkJLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvYmY1Mzctc3RhbXAvc3RtX20yNXA2NC5jIGIvYm9hcmQvYmY1Mzctc3RhbXAvc3RtX20yNXA2NC5jCmluZGV4IDcwNzdlODUuLmQ5YzA4ZWUgMTAwNjQ0Ci0tLSBhL2JvYXJkL2JmNTM3LXN0YW1wL3N0bV9tMjVwNjQuYworKysgYi9ib2FyZC9iZjUzNy1zdGFtcC9zdG1fbTI1cDY0LmMKQEAgLTksNyArOSw3IEBACiAKIC8qIEFwcGxpY2F0aW9uIGRlZmluaXRpb25zICovCiAKLSNkZWZpbmUJTlVNX1NFQ1RPUlMgCTEyOAkvKiBudW1iZXIgb2Ygc2VjdG9ycyAqLworI2RlZmluZQlOVU1fU0VDVE9SUwkxMjgJLyogbnVtYmVyIG9mIHNlY3RvcnMgKi8KICNkZWZpbmUgU0VDVE9SX1NJWkUJMHgxMDAwMAogI2RlZmluZSBOT1BfTlVNCQkxMDAwCiAKZGlmZiAtLWdpdCBhL2JvYXJkL2JmNTM3LXN0YW1wL3UtYm9vdC5sZHMuUyBiL2JvYXJkL2JmNTM3LXN0YW1wL3UtYm9vdC5sZHMuUwppbmRleCAzZmIyZDBjLi44NjMyMDk3IDEwMDY0NAotLS0gYS9ib2FyZC9iZjUzNy1zdGFtcC91LWJvb3QubGRzLlMKKysrIGIvYm9hcmQvYmY1Mzctc3RhbXAvdS1ib290Lmxkcy5TCkBAIC0zMyw3ICszMyw3IEBACiAgICBfX0RZTkFNSUMgPSAwOyAgICAqLwogTUVNT1JZCiAgewotIHJhbSA6IAkgICBPUklHSU4gPSAoQ0ZHX01PTklUT1JfQkFTRSksIExFTkdUSCA9ICgyNTYgKiAxMDI0KQorIHJhbSA6CSAgIE9SSUdJTiA9IChDRkdfTU9OSVRPUl9CQVNFKSwgTEVOR1RIID0gKDI1NiAqIDEwMjQpCiAgbDFfY29kZSA6IE9SSUdJTiA9IDB4RkZBMDAwMDAsIExFTkdUSCA9IDB4QzAwMAogIGwxX2RhdGEgOiBPUklHSU4gPSAweEZGOTAwMDAwLCBMRU5HVEggPSAweDQwMDAKICB9CkBAIC00NywxMSArNDcsMTEgQEAKICAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KICAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KICAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9CisgIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpCX0KICAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9CisgIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpCX0KKyAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpCX0KKyAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKQl9CiAgIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQl9CiAgIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJfQogICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9CkBAIC02OCw3ICs2OCw3IEBACiAgIC50ZXh0ICAgICAgOgogICB7CiAgICAgLyogV0FSTklORyAtIHRoZSBmb2xsb3dpbmcgaXMgaGFuZC1vcHRpbWl6ZWQgdG8gZml0IHdpdGhpbgkqLwotICAgIC8qIHRoZSBzZWN0b3IgYmVmb3JlIHRoZSBlbnZpcm9ubWVudCBzZWN0b3IuIElmIGl0IHRocm93cyAJKi8KKyAgICAvKiB0aGUgc2VjdG9yIGJlZm9yZSB0aGUgZW52aXJvbm1lbnQgc2VjdG9yLiBJZiBpdCB0aHJvd3MJKi8KICAgICAvKiBhbiBlcnJvciBkdXJpbmcgY29tcGlsYXRpb24gcmVtb3ZlIGFuIG9iamVjdCBoZXJlIHRvIGdldAkqLwogICAgIC8qIGl0IGxpbmtlZCBhZnRlciB0aGUgY29uZmlndXJhdGlvbiBzZWN0b3IuCQkqLwogCmRpZmYgLS1naXQgYS9ib2FyZC9ibXcvdS1ib290LmxkcyBiL2JvYXJkL2Jtdy91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWVlM2ZkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL2Jtdy91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjR4L3N0YXJ0Lm8JCSgudGV4dCkKLSAgICBsaWJfcHBjL2JvYXJkLm8JCSgudGV4dCkKLSAgICBsaWJfcHBjL3BwY3N0cmluZy5vCQkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvdnNwcmludGYubwkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvY3JjMzIubwkJKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL3psaWIubwkJKC50ZXh0KQotCi0JLiA9IERFRklORUQoZW52X29mZnNldCkgPyBlbnZfb2Zmc2V0IDogLjsKLSAgICBjb21tb24vZW52aXJvbm1lbnQubyAoLnRleHQpCi0KLQkqKC50ZXh0KQotCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvYzJtb24vcGNtY2lhLmMgYi9ib2FyZC9jMm1vbi9wY21jaWEuYwppbmRleCA1ZTUwYzRkLi5jMzg5YzY3IDEwMDY0NAotLS0gYS9ib2FyZC9jMm1vbi9wY21jaWEuYworKysgYi9ib2FyZC9jMm1vbi9wY21jaWEuYwpAQCAtNCwxMSArNCwxMSBAQAogCiAjdW5kZWYJQ09ORklHX1BDTUNJQQogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmCWRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiAjZGVmaW5lCUNPTkZJR19QQ01DSUEKICNlbmRpZgogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKQEAgLTE2NSw3ICsxNjUsNyBAQAogfQogCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKIGludCBwY21jaWFfaGFyZHdhcmVfZGlzYWJsZShpbnQgc2xvdCkKIHsKIAl2b2xhdGlsZSBpbW1hcF90CSppbW1hcDsKQEAgLTE5Myw3ICsxOTMsNyBAQAogCiAJcmV0dXJuICgwKTsKIH0KLSNlbmRpZgkvKiBDRkdfQ01EX1BDTUNJQSAqLworI2VuZGlmCiAKIAogaW50IHBjbWNpYV92b2x0YWdlX3NldChpbnQgc2xvdCwgaW50IHZjYywgaW50IHZwcCkKZGlmZiAtLWdpdCBhL2JvYXJkL2Nhbm1iL3UtYm9vdC5sZHMgYi9ib2FyZC9jYW5tYi91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGRjMTE4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL2Nhbm1iL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwNQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM1eHh4L3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL2Nkcy9tcGM4NTQ4Y2RzL21wYzg1NDhjZHMuYyBiL2JvYXJkL2Nkcy9tcGM4NTQ4Y2RzL21wYzg1NDhjZHMuYwppbmRleCA5MjlmZjJlLi5iNzIzNjQxIDEwMDY0NAotLS0gYS9ib2FyZC9jZHMvbXBjODU0OGNkcy9tcGM4NTQ4Y2RzLmMKKysrIGIvYm9hcmQvY2RzL21wYzg1NDhjZHMvbXBjODU0OGNkcy5jCkBAIC0zNDUsMjMgKzM0NSwyMyBAQAogCS8qIFRoaXMgaXMgbmVlZGVkIHRvIGdldCB0aGUgUkdNSUkgd29ya2luZyBmb3IgdGhlIDEuMysKIAkgKiBDRFMgY2FyZHMgKi8KIAlpZiAoZ2V0X2JvYXJkX3ZlcnNpb24oKSA9PSAgMHgxMykgewotCQltaWlwaHlfd3JpdGUoQ09ORklHX01QQzg1WFhfVFNFQzFfTkFNRSwKKwkJbWlpcGh5X3dyaXRlKENPTkZJR19UU0VDMV9OQU1FLAogCQkJCVRTRUMxX1BIWV9BRERSLCAyOSwgMTgpOwogCi0JCW1paXBoeV9yZWFkKENPTkZJR19NUEM4NVhYX1RTRUMxX05BTUUsCisJCW1paXBoeV9yZWFkKENPTkZJR19UU0VDMV9OQU1FLAogCQkJCVRTRUMxX1BIWV9BRERSLCAzMCwgJnRlbXApOwogCiAJCXRlbXAgPSAodGVtcCAmIDB4ZjAzZik7CiAJCXRlbXAgfD0gMiA8PCA5OwkJLyogMzYgb2htICovCiAJCXRlbXAgfD0gMiA8PCA2OwkJLyogMzkgb2htICovCiAKLQkJbWlpcGh5X3dyaXRlKENPTkZJR19NUEM4NVhYX1RTRUMxX05BTUUsCisJCW1paXBoeV93cml0ZShDT05GSUdfVFNFQzFfTkFNRSwKIAkJCQlUU0VDMV9QSFlfQUREUiwgMzAsIHRlbXApOwogCi0JCW1paXBoeV93cml0ZShDT05GSUdfTVBDODVYWF9UU0VDMV9OQU1FLAorCQltaWlwaHlfd3JpdGUoQ09ORklHX1RTRUMxX05BTUUsCiAJCQkJVFNFQzFfUEhZX0FERFIsIDI5LCAzKTsKIAotCQltaWlwaHlfd3JpdGUoQ09ORklHX01QQzg1WFhfVFNFQzFfTkFNRSwKKwkJbWlpcGh5X3dyaXRlKENPTkZJR19UU0VDMV9OQU1FLAogCQkJCVRTRUMxX1BIWV9BRERSLCAzMCwgMHg4MDAwKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2JvYXJkL2NtNTIwMC9NYWtlZmlsZSBiL2JvYXJkL2NtNTIwMC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWJkYjFhCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvY201MjAwL01ha2VmaWxlCkBAIC0wLDAgKzEsNTAgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAzLTIwMDcKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQk9BUkQpLmEKKworQ09CSlMJOj0gJChCT0FSRCkubyBjbWRfY201MjAwLm8gZnd1cGRhdGUubworCitTUkNTCTo9ICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKK1NPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSkKKworJChMSUIpOgkkKG9iaikuZGVwZW5kICQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46CWNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYm9hcmQvY201MjAwL2NtNTIwMC5jIGIvYm9hcmQvY201MjAwL2NtNTIwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NGFjMDgKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9jbTUyMDAvY201MjAwLmMKQEAgLTAsMCArMSw0MjUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNworICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIE1hcmsgSm9uYXMsIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBtYXJrLmpvbmFzQG1vdG9yb2xhLmNvbS4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDQtMjAwNQorICogTWFydGluIEtyYXVzZSwgVFEtU3lzdGVtcyBHbWJILCBtYXJ0aW4ua3JhdXNlQHRxcy5kZQorICoKKyAqIEFkYXB0ZWQgdG8gVS1Cb290IDEuMiBieToKKyAqICAgQmFydGxvbWllaiBTaWVrYSA8dHVyQHNlbWloYWxmLmNvbT46CisgKiAgICAgIC0gSFcgSUQgcmVhZG91dCBmcm9tIEVFUFJPTQorICogICAgICAtIG1vZHVsZSBkZXRlY3Rpb24KKyAqICAgR3J6ZWdvcnogQmVybmFja2kgPGdqYkBzZW1paGFsZi5jb20+OgorICogICAgICAtIHJ1bi10aW1lIFNEUkFNIGNvbnRyb2xsZXIgY29uZmlndXJhdGlvbgorICogICAgICAtIExJQkZEVCBzdXBwb3J0CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1wYzV4eHguaD4KKyNpbmNsdWRlIDxwY2kuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8aTJjLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKworI2lmZGVmIENPTkZJR19PRl9MSUJGRFQKKyNpbmNsdWRlIDxsaWJmZHQuaD4KKyNpbmNsdWRlIDxsaWJmZHRfZW52Lmg+CisjaW5jbHVkZSA8ZmR0X3N1cHBvcnQuaD4KKyNlbmRpZiAvKiBDT05GSUdfT0ZfTElCRkRUICovCisKKworI2luY2x1ZGUgImNtNTIwMC5oIgorI2luY2x1ZGUgImZ3dXBkYXRlLmgiCisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCitzdGF0aWMgaHdfaWRfdCBod19pZDsKKworCisjaWZuZGVmIENGR19SQU1CT09UCisvKgorICogSGVscGVyIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgU0RSQU0gY29udHJvbGxlci4KKyAqLworc3RhdGljIHZvaWQgc2RyYW1fc3RhcnQoaW50IGhpX2FkZHIsIG1lbV9jb25mX3QgKm1lbV9jb25mKQoreworCWxvbmcgaGlfYWRkcl9iaXQgPSBoaV9hZGRyID8gMHgwMTAwMDAwMCA6IDA7CisKKwkvKiB1bmxvY2sgbW9kZSByZWdpc3RlciAqLworCSoodnVfbG9uZyAqKU1QQzVYWFhfU0RSQU1fQ1RSTCA9IG1lbV9jb25mLT5jb250cm9sIHwgMHg4MDAwMDAwMCB8CisJCQkJCQloaV9hZGRyX2JpdDsKKworCS8qIHByZWNoYXJnZSBhbGwgYmFua3MgKi8KKwkqKHZ1X2xvbmcgKilNUEM1WFhYX1NEUkFNX0NUUkwgPSBtZW1fY29uZi0+Y29udHJvbCB8IDB4ODAwMDAwMDIgfAorCQkJCQkJaGlfYWRkcl9iaXQ7CisKKwkvKiBhdXRvIHJlZnJlc2ggKi8KKwkqKHZ1X2xvbmcgKilNUEM1WFhYX1NEUkFNX0NUUkwgPSBtZW1fY29uZi0+Y29udHJvbCB8IDB4ODAwMDAwMDQgfAorCQkJCQkJaGlfYWRkcl9iaXQ7CisKKwkvKiBhdXRvIHJlZnJlc2gsIHNlY29uZCB0aW1lICovCisJKih2dV9sb25nICopTVBDNVhYWF9TRFJBTV9DVFJMID0gbWVtX2NvbmYtPmNvbnRyb2wgfCAweDgwMDAwMDA0IHwKKwkJCQkJCWhpX2FkZHJfYml0OworCisJLyogc2V0IG1vZGUgcmVnaXN0ZXIgKi8KKwkqKHZ1X2xvbmcgKilNUEM1WFhYX1NEUkFNX01PREUgPSBtZW1fY29uZi0+bW9kZTsKKworCS8qIG5vcm1hbCBvcGVyYXRpb24gKi8KKwkqKHZ1X2xvbmcgKilNUEM1WFhYX1NEUkFNX0NUUkwgPSBtZW1fY29uZi0+Y29udHJvbCB8IGhpX2FkZHJfYml0OworfQorI2VuZGlmIC8qIENGR19SQU1CT09UICovCisKKworLyoKKyAqIFJldHJpZXZlIG1lbW9yeSBjb25maWd1cmF0aW9uIGZvciBhIGdpdmVuIG1vZHVsZS4gYm9hcmRfdHlwZSBpcyB0aGUgaW5kZXgKKyAqIGluIGh3X2lkX2xpc3RbXSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtb2R1bGUgd2UgYXJlIGV4ZWN1dGluZyBvbjsgd2UgcmV0dXJuCisgKiBTRFJBTSBjb250cm9sbGVyIHNldHRpbmdzIGFwcHJvcHJhdGUgZm9yIHRoaXMgbW9kdWxlLgorICovCitzdGF0aWMgbWVtX2NvbmZfdCogZ2V0X21lbV9jb25maWcoaW50IGJvYXJkX3R5cGUpCit7CisJc3dpdGNoKGJvYXJkX3R5cGUpeworCQljYXNlIENNMV9RQToKKwkJCXJldHVybiBtZW1vcnlfY29uZmlnWzBdOworCQljYXNlIENNMTFfUUE6CisJCWNhc2UgQ01VMV9RQToKKwkJCXJldHVybiBtZW1vcnlfY29uZmlnWzFdOworCQlkZWZhdWx0OgorCQkJcHJpbnRmKCJFUlJPUjogVW5rbm93biBtb2R1bGUsIHVzaW5nIGEgZGVmYXVsdCBTRFJBTSAiCisJCQkJImNvbmZpZ3VyYXRpb24gLSB0aGluZ3MgbWF5IG5vdCB3b3JrISEhLlxuIik7CisJCQlyZXR1cm4gbWVtb3J5X2NvbmZpZ1swXTsKKwl9Cit9CisKKworLyoKKyAqIEluaXRhbGl6ZSBTRFJBTSAtIGNvbmZpZ3VyZSBTRFJBTSBjb250cm9sbGVyLCBkZXRlY3QgbWVtb3J5IHNpemUuCisgKi8KK2xvbmcgaW50IGluaXRkcmFtKGludCBib2FyZF90eXBlKQoreworCXVsb25nIGRyYW1zaXplID0gMDsKKyNpZm5kZWYgQ0ZHX1JBTUJPT1QKKwl1bG9uZyB0ZXN0MSwgdGVzdDI7CisJbWVtX2NvbmZfdCAqbWVtX2NvbmY7CisKKwltZW1fY29uZiA9IGdldF9tZW1fY29uZmlnKGJvYXJkX3R5cGUpOworCisJLyogY29uZmlndXJlIFNEUkFNIHN0YXJ0L2VuZCBmb3IgZGV0ZWN0aW9uICovCisJKih2dV9sb25nICopTVBDNVhYWF9TRFJBTV9DUzBDRkcgPSAweDAwMDAwMDFlOyAvKiAyRyBhdCAweDAgKi8KKworCS8qIHNldHVwIGNvbmZpZyByZWdpc3RlcnMgKi8KKwkqKHZ1X2xvbmcgKilNUEM1WFhYX1NEUkFNX0NPTkZJRzEgPSBtZW1fY29uZi0+Y29uZmlnMTsKKwkqKHZ1X2xvbmcgKilNUEM1WFhYX1NEUkFNX0NPTkZJRzIgPSBtZW1fY29uZi0+Y29uZmlnMjsKKworCXNkcmFtX3N0YXJ0KDAsIG1lbV9jb25mKTsKKwl0ZXN0MSA9IGdldF9yYW1fc2l6ZSgobG9uZyAqKUNGR19TRFJBTV9CQVNFLCAweDgwMDAwMDAwKTsKKwlzZHJhbV9zdGFydCgxLCBtZW1fY29uZik7CisJdGVzdDIgPSBnZXRfcmFtX3NpemUoKGxvbmcgKilDRkdfU0RSQU1fQkFTRSwgMHg4MDAwMDAwMCk7CisJaWYgKHRlc3QxID4gdGVzdDIpIHsKKwkJc2RyYW1fc3RhcnQoMCwgbWVtX2NvbmYpOworCQlkcmFtc2l6ZSA9IHRlc3QxOworCX0gZWxzZQorCQlkcmFtc2l6ZSA9IHRlc3QyOworCisJLyogbWVtb3J5IHNtYWxsZXIgdGhhbiAxTUIgaXMgaW1wb3NzaWJsZSAqLworCWlmIChkcmFtc2l6ZSA8ICgxIDw8IDIwKSkKKwkJZHJhbXNpemUgPSAwOworCisJLyogc2V0IFNEUkFNIENTMCBzaXplIGFjY29yZGluZyB0byB0aGUgYW1vdW50IG9mIFJBTSBmb3VuZCAqLworCWlmIChkcmFtc2l6ZSA+IDApIHsKKwkJKih2dV9sb25nICopTVBDNVhYWF9TRFJBTV9DUzBDRkcgPSAweDEzICsKKwkJCV9fYnVpbHRpbl9mZnMoZHJhbXNpemUgPj4gMjApIC0gMTsKKwl9IGVsc2UKKwkJKih2dV9sb25nICopTVBDNVhYWF9TRFJBTV9DUzBDRkcgPSAwOyAvKiBkaXNhYmxlZCAqLworI2Vsc2UgLyogQ0ZHX1JBTUJPT1QgKi8KKwkvKiByZXRyaWV2ZSBzaXplIG9mIG1lbW9yeSBjb25uZWN0ZWQgdG8gU0RSQU0gQ1MwICovCisJZHJhbXNpemUgPSAqKHZ1X2xvbmcgKilNUEM1WFhYX1NEUkFNX0NTMENGRyAmIDB4RkY7CisJaWYgKGRyYW1zaXplID49IDB4MTMpCisJCWRyYW1zaXplID0gKDEgPDwgKGRyYW1zaXplIC0gMHgxMykpIDw8IDIwOworCWVsc2UKKwkJZHJhbXNpemUgPSAwOworI2VuZGlmIC8qICFDRkdfUkFNQk9PVCAqLworCisJLyoKKwkgKiBPbiBNUEM1MjAwQiB3ZSBuZWVkIHRvIHNldCB0aGUgc3BlY2lhbCBjb25maWd1cmF0aW9uIGRlbGF5IGluIHRoZQorCSAqIEREUiBjb250cm9sbGVyLiAgUmVmZXIgdG8gY2hhcHRlciA4LjcuNSBTRGVsYXktLU1CQVIgKyAweDAxOTAgb2YKKwkgKiB0aGUgTVBDNTIwMEIgVXNlcidzIE1hbnVhbC4KKwkgKi8KKwkqKHZ1X2xvbmcgKilNUEM1WFhYX1NEUkFNX1NERUxBWSA9IDB4MDQ7CisJX19hc21fXyB2b2xhdGlsZSAoInN5bmMiKTsKKworCXJldHVybiBkcmFtc2l6ZTsKK30KKworCisvKgorICogUmVhZCBtb2R1bGUgaGFyZHdhcmUgaWRlbnRpZmljYXRpb24gZGF0YSBmcm9tIHRoZSBJMkMgRUVQUk9NLgorICovCitzdGF0aWMgdm9pZCByZWFkX2h3X2lkKGh3X2lkX3QgaHdfaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IEhXX0lEX0VMRU1fQ09VTlQ7ICsraSkKKwkJaWYgKGkyY19yZWFkKENGR19JMkNfRUVQUk9NLAorCQkJCWh3X2lkX2Zvcm1hdFtpXS5vZmZzZXQsCisJCQkJMiwKKwkJCQkodWNoYXIgKikmaHdfaWRbaV1bMF0sCisJCQkJaHdfaWRfZm9ybWF0W2ldLmxlbmd0aCkgIT0gMCkKKwkJCXByaW50ZigiRVJST1I6IGNhbid0IHJlYWQgSFcgSUQgZnJvbSBFRVBST01cbiIpOworfQorCisKKy8qCisgKiBJZGVudGlmeSBtb2R1bGUgd2UgYXJlIHJ1bm5pbmcgb24sIHNldCBnZC0+Ym9hcmRfdHlwZSB0byB0aGUgaW5kZXggaW4KKyAqIGh3X2lkX2xpc3RbXSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtb2R1bGUgaWRlbnRpZmVkLCBvciB0bworICogQ001MjAwX1VOS05PV05fTU9EVUxFIGlmIHdlIGNhbid0IGlkZW50aWZ5IHRoZSBtb2R1bGUuCisgKi8KK3N0YXRpYyB2b2lkIGlkZW50aWZ5X21vZHVsZShod19pZF90IGh3X2lkKQoreworCWludCBpLCBqLCBlbGVtZW50OworCWNoYXIgbWF0Y2g7CisJZ2QtPmJvYXJkX3R5cGUgPSBDTTUyMDBfVU5LTk9XTl9NT0RVTEU7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZiAoaHdfaWRfbGlzdCkgLyBzaXplb2YgKGNoYXIgKiopOyArK2kpIHsKKwkJbWF0Y2ggPSAxOworCQlmb3IgKGogPSAwOyBqIDwgc2l6ZW9mIChod19pZF9pZGVudGlmeSkgLyBzaXplb2YgKGludCk7ICsraikgeworCQkJZWxlbWVudCA9IGh3X2lkX2lkZW50aWZ5W2pdOworCQkJaWYgKHN0cm5jbXAoaHdfaWRfbGlzdFtpXVtlbGVtZW50XSwKKwkJCQkJJmh3X2lkW2VsZW1lbnRdWzBdLAorCQkJCQlod19pZF9mb3JtYXRbZWxlbWVudF0ubGVuZ3RoKSAhPSAwKSB7CisJCQkJbWF0Y2ggPSAwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChtYXRjaCkgeworCQkJZ2QtPmJvYXJkX3R5cGUgPSBpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKworLyoKKyAqIENvbXBvc2Ugc3RyaW5nIHdpdGggbW9kdWxlIG5hbWUuCisgKiBidWYgaXMgYXNzdW1lZCB0byBoYXZlIGVub3VnaCBzcGFjZSwgYW5kIGJlIG51bGwtdGVybWluYXRlZC4KKyAqLworc3RhdGljIHZvaWQgY29tcG9zZV9tb2R1bGVfbmFtZShod19pZF90IGh3X2lkLCBjaGFyICpidWYpCit7CisJY2hhciB0bXBbTU9EVUxFX05BTUVfTUFYTEVOXTsKKwlzdHJuY2F0KGJ1ZiwgJmh3X2lkW1BDQl9OQU1FXVswXSwgaHdfaWRfZm9ybWF0W1BDQl9OQU1FXS5sZW5ndGgpOworCXN0cm5jYXQoYnVmLCAiLiIsIDEpOworCXN0cm5jYXQoYnVmLCAmaHdfaWRbRk9STV1bMF0sIGh3X2lkX2Zvcm1hdFtGT1JNXS5sZW5ndGgpOworCXN0cm5jYXQoYnVmLCAmaHdfaWRbVkVSU0lPTl1bMF0sIGh3X2lkX2Zvcm1hdFtWRVJTSU9OXS5sZW5ndGgpOworCXN0cm5jYXQoYnVmLCAiICgiLCAyKTsKKwlzdHJuY2F0KGJ1ZiwgJmh3X2lkW0lERU5USUZJQ0FUSU9OX05VTUJFUl1bMF0sCisJCWh3X2lkX2Zvcm1hdFtJREVOVElGSUNBVElPTl9OVU1CRVJdLmxlbmd0aCk7CisJc3ByaW50Zih0bXAsICIgLyAldS4ldSkiLAorCQlod19pZFtNQUpPUl9TV19WRVJTSU9OXVswXSwKKwkJaHdfaWRbTUlOT1JfU1dfVkVSU0lPTl1bMF0pOworCXN0cmNhdChidWYsIHRtcCk7Cit9CisKKworLyoKKyAqIENvbXBvc2Ugc3RyaW5nIHdpdGggaG9zdG5hbWUuCisgKiBidWYgaXMgYXNzdW1lZCB0byBoYXZlIGVub3VnaCBzcGFjZSwgYW5kIGJlIG51bGwtdGVybWluYXRlZC4KKyAqLworc3RhdGljIHZvaWQgY29tcG9zZV9ob3N0bmFtZShod19pZF90IGh3X2lkLCBjaGFyICpidWYpCit7CisJY2hhciAqcDsKKwlzdHJuY2F0KGJ1ZiwgJmh3X2lkW1BDQl9OQU1FXVswXSwgaHdfaWRfZm9ybWF0W1BDQl9OQU1FXS5sZW5ndGgpOworCXN0cm5jYXQoYnVmLCAiXyIsIDEpOworCXN0cm5jYXQoYnVmLCAmaHdfaWRbRk9STV1bMF0sIGh3X2lkX2Zvcm1hdFtGT1JNXS5sZW5ndGgpOworCXN0cm5jYXQoYnVmLCAmaHdfaWRbVkVSU0lPTl1bMF0sIGh3X2lkX2Zvcm1hdFtWRVJTSU9OXS5sZW5ndGgpOworCWZvciAocCA9IGJ1ZjsgKnA7ICsrcCkKKwkJKnAgPSB0b2xvd2VyKCpwKTsKKworfQorCisKKyNpZiBkZWZpbmVkKENPTkZJR19PRl9CT0FSRF9TRVRVUCkgJiYgZGVmaW5lZChDT05GSUdfT0ZfTElCRkRUKQorLyoKKyAqIFVwZGF0ZSAnbW9kZWwnIGFuZCAnbWVtb3J5JyBwcm9wZXJ0aWVzIGluIHRoZSBibG9iIGFjY29yZGluZyB0byB0aGUgbW9kdWxlCisgKiB0aGF0IHdlIGFyZSBydW5uaW5nIG9uLgorICovCitzdGF0aWMgdm9pZCBmdF9ibG9iX3VwZGF0ZSh2b2lkICpibG9iLCBiZF90ICpiZCkKK3sKKwlpbnQgbGVuLCByZXQsIG5vZGVvZmZzZXQgPSAwOworCWNoYXIgbW9kdWxlX25hbWVbTU9EVUxFX05BTUVfTUFYTEVOXSA9IHswfTsKKwl1bG9uZyBtZW1vcnlfZGF0YVsyXSA9IHswfTsKKworCWNvbXBvc2VfbW9kdWxlX25hbWUoaHdfaWQsIG1vZHVsZV9uYW1lKTsKKwlsZW4gPSBzdHJsZW4obW9kdWxlX25hbWUpICsgMTsKKworCXJldCA9IGZkdF9zZXRwcm9wKGJsb2IsIG5vZGVvZmZzZXQsICJtb2RlbCIsIG1vZHVsZV9uYW1lLCBsZW4pOworCWlmIChyZXQgPCAwKQorCXByaW50ZigiZnRfYmxvYl91cGRhdGUoKTogY2Fubm90IHNldCAvbW9kZWwgcHJvcGVydHkgZXJyOiVzXG4iLAorCQlmZHRfc3RyZXJyb3IocmV0KSk7CisKKwltZW1vcnlfZGF0YVswXSA9IGNwdV90b19iZTMyKGJkLT5iaV9tZW1zdGFydCk7CisJbWVtb3J5X2RhdGFbMV0gPSBjcHVfdG9fYmUzMihiZC0+YmlfbWVtc2l6ZSk7CisKKwlub2Rlb2Zmc2V0ID0gZmR0X2ZpbmRfbm9kZV9ieV9wYXRoIChibG9iLCAiL21lbW9yeSIpOworCWlmIChub2Rlb2Zmc2V0ID49IDApIHsKKwkJcmV0ID0gZmR0X3NldHByb3AoYmxvYiwgbm9kZW9mZnNldCwgInJlZyIsIG1lbW9yeV9kYXRhLAorCQkJCQlzaXplb2YobWVtb3J5X2RhdGEpKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJpbnRmKCJmdF9ibG9iX3VwZGF0ZSk6IGNhbm5vdCBzZXQgL21lbW9yeS9yZWcgIgorCQkJInByb3BlcnR5IGVycjolc1xuIiwgZmR0X3N0cmVycm9yKHJldCkpOworCX0KKwllbHNlIHsKKwkJLyogbWVtb3J5IG5vZGUgaXMgcmVxdWlyZWQgaW4gZHRzICovCisJCXByaW50ZigiZnRfYmxvYl91cGRhdGUoKTogY2Fubm90IGZpbmQgL21lbW9yeSBub2RlICIKKwkJImVycjolc1xuIiwgZmR0X3N0cmVycm9yKG5vZGVvZmZzZXQpKTsKKwl9Cit9CisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfT0ZfQk9BUkRfU0VUVVApICYmIGRlZmluZWQoQ09ORklHX09GX0xJQkZEVCkgKi8KKworCisvKgorICogUmVhZCBIVyBJRCBmcm9tIEkyQyBFRVBST00gYW5kIGRldGVjdCB0aGUgbW9kdWUgd2UgYXJlIHJ1bm5pbmcgb24uIE5vdGUKKyAqIHRoYXQgd2UgbmVlZCB0byB1c2UgbG9jYWwgdmFyaWFibGUgZm9yIHJlYWRvdXQsIGJlY2F1c2UgZ2xvYmFsIGRhdGEgaXMgbm90CisgKiB3cml0YWJsZSB5ZXQgKGFuZCB3ZSdsbCBoYXZlIHRvIHJlZG8gdGhlIHJlYWRvdXQgbGF0ZXIgb24pLgorICovCitpbnQgY2hlY2tib2FyZCh2b2lkKQoreworCWh3X2lkX3QgaHdfaWRfdG1wOworCWNoYXIgbW9kdWxlX25hbWVfdG1wW01PRFVMRV9OQU1FX01BWExFTl0gPSAiIjsKKworCS8qCisJICogV2UgbmVlZCBJMkMgdG8gYWNjZXNzIEhXIElEIGRhdGEgZnJvbSBFRVBST00sIHNvIHdlIGNhbGwgaTJjX2luaXQoKQorCSAqIGhlcmUgZGVzcGl0ZSB0aGUgZmFjdCB0aGF0IGl0IHdpbGwgYmUgY2FsbGVkIGFnYWluIGxhdGVyIG9uLiBXZQorCSAqIGFsc28gdXNlIGEgbGl0dGxlIHRyaWNrIHRvIHNpbGVuY2UgSTJDLXJlbGF0ZWQgb3V0cHV0LgorCSAqLworCWdkLT5mbGFncyB8PSBHRF9GTEdfU0lMRU5UOworCWkyY19pbml0IChDRkdfSTJDX1NQRUVELCBDRkdfSTJDX1NMQVZFKTsKKwlnZC0+ZmxhZ3MgJj0gfkdEX0ZMR19TSUxFTlQ7CisKKwlyZWFkX2h3X2lkKGh3X2lkX3RtcCk7CisJaWRlbnRpZnlfbW9kdWxlKGh3X2lkX3RtcCk7CS8qIHRoaXMgc2V0cyBnZC0+Ym9hcmRfdHlwZSAqLworCWNvbXBvc2VfbW9kdWxlX25hbWUoaHdfaWRfdG1wLCBtb2R1bGVfbmFtZV90bXApOworCisJaWYgKGdkLT5ib2FyZF90eXBlICE9IENNNTIwMF9VTktOT1dOX01PRFVMRSkKKwkJcHJpbnRmKCJCb2FyZDogJXNcbiIsIG1vZHVsZV9uYW1lX3RtcCk7CisJZWxzZQorCQlwcmludGYoIkJvYXJkOiB1bnJlY29nbml6ZWQgY201MjAwIG1vZHVsZSAoJXMpXG4iLAorCQkJbW9kdWxlX25hbWVfdG1wKTsKKworCXJldHVybiAwOworfQorCisKK2ludCBib2FyZF9lYXJseV9pbml0X3Iodm9pZCkKK3sKKwkvKgorCSAqIE5vdywgd2hlbiB3ZSBhcmUgaW4gUkFNLCBlbmFibGUgZmxhc2ggd3JpdGUgYWNjZXNzIGZvciBkZXRlY3Rpb24KKwkgKiBwcm9jZXNzLiBOb3RlIHRoYXQgQ1NfQk9PVCBjYW5ub3QgYmUgY2xlYXJlZCB3aGVuIGV4ZWN1dGluZyBpbgorCSAqIGZsYXNoLgorCSAqLworCSoodnVfbG9uZyAqKU1QQzVYWFhfQk9PVENTX0NGRyAmPSB+MHgxOyAvKiBjbGVhciBSTyAqLworCisJLyogTm93IHRoYXQgd2UgY2FuIHdyaXRlIHRvIGdsb2JhbCBkYXRhLCByZWFkIEhXIElEIGFnYWluLiAqLworCXJlYWRfaHdfaWQoaHdfaWQpOworCXJldHVybiAwOworfQorCisKKyNpZmRlZiBDT05GSUdfUE9TVAoraW50IHBvc3RfaG90a2V5c19wcmVzc2VkKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1BPU1QgKi8KKworCisjaWYgZGVmaW5lZChDT05GSUdfUE9TVCkgfHwgZGVmaW5lZChDT05GSUdfTE9HQlVGRkVSKQordm9pZCBwb3N0X3dvcmRfc3RvcmUodWxvbmcgYSkKK3sKKwl2dV9sb25nICpzYXZlX2FkZHIgPSAodnVfbG9uZyAqKShNUEM1WFhYX1NSQU0gKyBNUEM1WFhYX1NSQU1fUE9TVF9TSVpFKTsKKwkqc2F2ZV9hZGRyID0gYTsKK30KKworCit1bG9uZyBwb3N0X3dvcmRfbG9hZCh2b2lkKQoreworCXZ1X2xvbmcgKnNhdmVfYWRkciA9ICh2dV9sb25nICopKE1QQzVYWFhfU1JBTSArIE1QQzVYWFhfU1JBTV9QT1NUX1NJWkUpOworCXJldHVybiAqc2F2ZV9hZGRyOworfQorI2VuZGlmIC8qIENPTkZJR19QT1NUIHx8IENPTkZJR19MT0dCVUZGRVIgKi8KKworCisjaWZkZWYgQ09ORklHX01JU0NfSU5JVF9SCitpbnQgbWlzY19pbml0X3Iodm9pZCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19IQVJEX0kyQykgfHwgZGVmaW5lZChDT05GSUdfU09GVF9JMkMpCisJdWNoYXIgYnVmWzZdOworCWNoYXIgc3RyWzE4XTsKKwljaGFyIGhvc3RuYW1lW01PRFVMRV9OQU1FX01BWExFTl07CisKKwkvKiBSZWFkIGV0aGFkZHIgZnJvbSBFRVBST00gKi8KKwlpZiAoaTJjX3JlYWQoQ0ZHX0kyQ19FRVBST00sIENPTkZJR19NQUNfT0ZGU0VULCAyLCBidWYsIDYpID09IDApIHsKKwkJc3ByaW50ZihzdHIsICIlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCIsCisJCQlidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdLCBidWZbM10sIGJ1Zls0XSwgYnVmWzVdKTsKKwkJLyogQ2hlY2sgaWYgTUFDIGFkZHIgaXMgb3duZWQgYnkgU2NoaW5kbGVyICovCisJCWlmIChzdHJzdHIoc3RyLCAiMDA6MDY6QzMiKSAhPSBzdHIpCisJCQlwcmludGYoTE9HX1BSRUZJWCAiV2FybmluZyAtIElsbGVnYWwgTUFDIGFkZHJlc3MgKCVzKSIKKwkJCQkiIGluIEVFUFJPTS5cbiIsIHN0cik7CisJCWVsc2UgeworCQkJcHJpbnRmKExPR19QUkVGSVggIlVzaW5nIE1BQyAoJXMpIGZyb20gSTJDIEVFUFJPTVxuIiwKKwkJCQlzdHIpOworCQkJc2V0ZW52KCJldGhhZGRyIiwgc3RyKTsKKwkJfQorCX0gZWxzZSB7CisJCXByaW50ZihMT0dfUFJFRklYICJXYXJuaW5nIC0gVW5hYmxlIHRvIHJlYWQgTUFDIGZyb20gSTJDIgorCQkJIiBkZXZpY2UgYXQgYWRkcmVzcyAlMDJYOiUwNFhcbiIsIENGR19JMkNfRUVQUk9NLAorCQkJQ09ORklHX01BQ19PRkZTRVQpOworCX0KKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19IQVJEX0kyQykgfHwgZGVmaW5lZChDT05GSUdfU09GVF9JMkMpICovCisJaWYgKCFnZXRlbnYoImV0aGFkZHIiKSkKKwkJcHJpbnRmKExPR19QUkVGSVggIk1BQyBhZGRyZXNzIG5vdCBzZXQsIG5ldHdvcmtpbmcgaXMgbm90ICIKKwkJCQkJIm9wZXJhdGlvbmFsXG4iKTsKKworCS8qIHNldCB0aGUgaG9zdG5hbWUgYXBwcm9wcmlhdGUgdG8gdGhlIG1vZHVsZSB3ZSdyZSBydW5uaW5nIG9uICovCisJY29tcG9zZV9ob3N0bmFtZShod19pZCwgaG9zdG5hbWUpOworCXNldGVudigiaG9zdG5hbWUiLCBob3N0bmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfTUlTQ19JTklUX1IgKi8KKworCisjaWZkZWYgQ09ORklHX0xBU1RfU1RBR0VfSU5JVAoraW50IGxhc3Rfc3RhZ2VfaW5pdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19VU0JfU1RPUkFHRQorCWNtNTIwMF9md3VwZGF0ZSgpOworI2VuZGlmIC8qIENPTkZJR19VU0JfU1RPUkFHRSAqLworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19MQVNUX1NUQUdFX0lOSVQgKi8KKworCisjaWYgZGVmaW5lZChDT05GSUdfT0ZfTElCRkRUKSAmJiBkZWZpbmVkKENPTkZJR19PRl9CT0FSRF9TRVRVUCkKK3ZvaWQgZnRfYm9hcmRfc2V0dXAodm9pZCAqYmxvYiwgYmRfdCAqYmQpCit7CisJZnRfY3B1X3NldHVwKGJsb2IsIGJkKTsKKwlmdF9ibG9iX3VwZGF0ZShibG9iLCBiZCk7Cit9CisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfT0ZfTElCRkRUKSAmJiBkZWZpbmVkKENPTkZJR19PRl9CT0FSRF9TRVRVUCkgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL2NtNTIwMC9jbTUyMDAuaCBiL2JvYXJkL2NtNTIwMC9jbTUyMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmVhNWNlCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvY201MjAwL2NtNTIwMC5oCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA3IERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcKKyAqCisgKiBBdXRob3I6IEJhcnRsb21pZWogU2lla2EgPHR1ckBzZW1paGFsZi5jb20+CisgKiBBdXRob3I6IEdyemVnb3J6IEJlcm5hY2tpIDxnamJAc2VtaWhhbGYuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX0NNNTIwMF9ICisjZGVmaW5lIF9DTTUyMDBfSAorCisKKy8qCisgKiBEZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIGZvciB0aGUgbW9kdWxlcyBvZiB0aGUgY201MjAwIHBsYXRmb3JtLiBNb3N0bHkKKyAqIHJlbGF0ZWQgdG8gcmVhZGluZyB0aGUgaGFyZHdhcmUgaWRlbnRpZmljYXRpb24gZGF0YSAoSFcgSUQpIGZyb20gdGhlIEkyQworICogRUVQUk9NLCBkZXRlY3Rpb24gb2YgdGhlIHBhcnRpY3VsYXIgbW9kdWxlIHdlIGFyZSBleGVjdXRpbmcgb24sIGFuZAorICogYXBwcm9wcmlhdGUgU0RSQU0gY29udHJvbGxlciBpbml0aWFsaXphdGlvbi4KKyAqLworCisKKyNkZWZpbmUgQ001MjAwX1VOS05PV05fTU9EVUxFCTB4ZmZmZmZmZmYKKworZW51bSB7CisJREVWSUNFX05BTUUsCQkvKiAwICovCisJR0VORVJBVElPTiwJCS8qIDEgKi8KKwlQQ0JfTkFNRSwJCS8qIDIgKi8KKwlGT1JNLAkJCS8qIDMgKi8KKwlWRVJTSU9OLAkJLyogNCAqLworCUlERU5USUZJQ0FUSU9OX05VTUJFUiwJLyogNSAqLworCU1BSk9SX1NXX1ZFUlNJT04sCS8qIDYgKi8KKwlNSU5PUl9TV19WRVJTSU9OLAkvKiA3ICovCisJLyogYWRkIG5ldyBhbGVtZW50cyBhYm92ZSB0aGlzIGxpbmUgKi8KKwlIV19JRF9FTEVNX0NPVU5UCS8qIGNvdW50ICovCit9OworCisvKgorICogU2VjdC4gNC4xICJDTTEuUS9DTVUxLlEgU3VwZXJ2aXNvcnkgTWljcm9jb250cm9sbGVyIEludGVyZmFjZSBEZWZpbml0aW9uIgorICovCisKKyNkZWZpbmUgREVWSUNFX05BTUVfT0ZGU0VUCQkweDAyCisjZGVmaW5lIEdFTkVSQVRJT05fT0ZGU0VUCQkweDBiCisjZGVmaW5lIFBDQl9OQU1FX09GRlNFVAkJCTB4MGMKKyNkZWZpbmUgRk9STV9PRkZTRVQJCQkweDE1CisjZGVmaW5lIFZFUlNJT05fT0ZGU0VUCQkJMHgxNgorI2RlZmluZSBJREVOVElGSUNBVElPTl9OVU1CRVJfT0ZGU0VUCTB4MTkKKyNkZWZpbmUgTUFKT1JfU1dfVkVSU0lPTl9PRkZTRVQJCTB4MDQ4MAorI2RlZmluZSBNSU5PUl9TV19WRVJTSU9OX09GRlNFVAkJMHgwNDgxCisKKworI2RlZmluZSBERVZJQ0VfTkFNRV9MRU4JCQkweDA5CisjZGVmaW5lIEdFTkVSQVRJT05fTEVOCQkJMHgwMQorI2RlZmluZSBQQ0JfTkFNRV9MRU4JCQkweDA5CisjZGVmaW5lIEZPUk1fTEVOCQkJMHgwMQorI2RlZmluZSBWRVJTSU9OX0xFTgkJCTB4MDMKKyNkZWZpbmUgSURFTlRJRklDQVRJT05fTlVNQkVSX0xFTgkweDA5CisjZGVmaW5lIE1BSk9SX1NXX1ZFUlNJT05fTEVOCQkweDAxCisjZGVmaW5lIE1JTk9SX1NXX1ZFUlNJT05fTEVOCQkweDAxCisKKyNkZWZpbmUgSFdfSURfRUxFTV9NQVhMRU4JCTB4MDkJLyogTUFYKFhYWF9MRU4pICovCisKKy8qIGVudGlyZSBIVyBJRCBpbiBFRVBST00gaXMgNjQgYnl0ZXMsIHNvIGxvbmdlciBtb2R1bGUgbmFtZSBpcyB1bmxpa2VseSAqLworI2RlZmluZSBNT0RVTEVfTkFNRV9NQVhMRU4JCTY0CisKKworLyogc3RvcmFnZSBmb3IgSFcgSUQgcmVhZCBmcm9tIEVFUFJPTSAqLwordHlwZWRlZiBjaGFyIGh3X2lkX3RbSFdfSURfRUxFTV9DT1VOVF1bSFdfSURfRUxFTV9NQVhMRU5dOworCisKKy8qIEhXIElEIGxheW91dCBpbiBFRVBST00gKi8KK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJdW5zaWduZWQgaW50IGxlbmd0aDsKK30gaHdfaWRfZm9ybWF0W0hXX0lEX0VMRU1fQ09VTlRdID0geworCXtERVZJQ0VfTkFNRV9PRkZTRVQsCQlERVZJQ0VfTkFNRV9MRU59LAorCXtHRU5FUkFUSU9OX09GRlNFVCwJCUdFTkVSQVRJT05fTEVOfSwKKwl7UENCX05BTUVfT0ZGU0VULAkJUENCX05BTUVfTEVOfSwKKwl7Rk9STV9PRkZTRVQsCQkJRk9STV9MRU59LAorCXtWRVJTSU9OX09GRlNFVCwJCVZFUlNJT05fTEVOfSwKKwl7SURFTlRJRklDQVRJT05fTlVNQkVSX09GRlNFVCwJSURFTlRJRklDQVRJT05fTlVNQkVSX0xFTn0sCisJe01BSk9SX1NXX1ZFUlNJT05fT0ZGU0VULAlNQUpPUl9TV19WRVJTSU9OX0xFTn0sCisJe01JTk9SX1NXX1ZFUlNJT05fT0ZGU0VULAlNSU5PUl9TV19WRVJTSU9OX0xFTn0sCit9OworCisKKy8qIEhXIElEIGRhdGEgZm91bmQgaW4gRUVQUk9NIG9uIHN1cHBvcnRlZCBtb2R1bGVzICovCitzdGF0aWMgY2hhciAqY20xX3FhX2h3X2lkW0hXX0lEX0VMRU1fQ09VTlRdID0geworCSJDTSIsCQkvKiBERVZJQ0VfTkFNRSAqLworCSIxIiwJCS8qIEdFTkVSQVRJT04gKi8KKwkiQ00xIiwJCS8qIFBDQl9OQU1FICovCisJIlEiLAkJLyogRk9STSAqLworCSJBIiwJCS8qIFZFUlNJT04gKi8KKwkiNTkxODgxIiwJLyogSURFTlRJRklDQVRJT05fTlVNQkVSICovCisJIiIsCQkvKiBNQUpPUl9TV19WRVJTSU9OICovCisJIiIsCQkvKiBNSU5PUl9TV19WRVJTSU9OICovCit9OworCitzdGF0aWMgY2hhciAqY20xMV9xYV9od19pZFtIV19JRF9FTEVNX0NPVU5UXSA9IHsKKwkiQ00iLAkJLyogREVWSUNFX05BTUUgKi8KKwkiMSIsCQkvKiBHRU5FUkFUSU9OICovCisJIkNNMTEiLAkJLyogUENCX05BTUUgKi8KKwkiUSIsCQkvKiBGT1JNICovCisJIkEiLAkJLyogVkVSU0lPTiAqLworCSI1OTQyMDAiLAkvKiBJREVOVElGSUNBVElPTl9OVU1CRVIgKi8KKwkiIiwJCS8qIE1BSk9SX1NXX1ZFUlNJT04gKi8KKwkiIiwJCS8qIE1JTk9SX1NXX1ZFUlNJT04gKi8KK307CisKK3N0YXRpYyBjaGFyICpjbXUxX3FhX2h3X2lkW0hXX0lEX0VMRU1fQ09VTlRdID0geworCSJDTVUiLAkJLyogREVWSUNFX05BTUUgKi8KKwkiMSIsCQkvKiBHRU5FUkFUSU9OICovCisJIkNNVTEiLAkJLyogUENCX05BTUUgKi8KKwkiUSIsCQkvKiBGT1JNICovCisJIkEiLAkJLyogVkVSU0lPTiAqLworCSI1OTQxMjgiLAkvKiBJREVOVElGSUNBVElPTl9OVU1CRVIgKi8KKwkiIiwJCS8qIE1BSk9SX1NXX1ZFUlNJT04gKi8KKwkiIiwJCS8qIE1JTk9SX1NXX1ZFUlNJT04gKi8KK307CisKKworLyogbGlzdCBvZiBrbm93biBtb2R1bGVzICovCitzdGF0aWMgY2hhciAqKmh3X2lkX2xpc3RbXSA9IHsKKwljbTFfcWFfaHdfaWQsCisJY20xMV9xYV9od19pZCwKKwljbXUxX3FhX2h3X2lkLAorfTsKKworLyogaW5kaWNlcyB0byB0aGUgYWJvdmUgbGlzdCAtIGtlZXAgaW4gc3luYyAqLworZW51bSB7CisJQ00xX1FBLAorCUNNMTFfUUEsCisJQ01VMV9RQSwKK307CisKKworLyogaWRlbnRpZnkgbW9kdWxlcyBiYXNlZCBvbiB0aGVzZSBodyBpZCBlbGVtZW50cyAqLworc3RhdGljIGludCBod19pZF9pZGVudGlmeVtdID0geworCVBDQl9OQU1FLAorCUZPUk0sCisJVkVSU0lPTiwKK307CisKKworLyogUmVnaXN0ZXJzJyBzZXR0aW5ncyBmb3IgU0RSQU0gY29udHJvbGxlciBpbnRpYWxpemF0aW9uICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWxvbmcgbW9kZTsKKwl1bG9uZyBjb250cm9sOworCXVsb25nIGNvbmZpZzE7CisJdWxvbmcgY29uZmlnMjsKK30gbWVtX2NvbmZfdDsKKworc3RhdGljIG1lbV9jb25mX3QgazRzNTYxNjMyRSA9IHsKKwkweDAwQ0QwMDAwLCAgICAgIC8qIENBU0wgMywgYnVyc3QgbGVuZ3RoIDggKi8KKwkweDUxNEYwMDAwLAorCTB4RTIzMzM5MDAsCisJMHg4RUU3MDAwMAorfTsKKworc3RhdGljIG1lbV9jb25mX3QgbXQ0OGxjMzJtMTZhMiA9IHsKKwkweDAwQ0QwMDAwLCAgICAgIC8qIENBU0wgMywgYnVyc3QgbGVuZ3RoIDggKi8KKwkweDUxNEYwMDAwLAorCTB4RDIzMjI4MDAsCisJMHg4QUQ3MDAwMAorfTsKKworc3RhdGljIG1lbV9jb25mX3QqIG1lbW9yeV9jb25maWdbXSA9IHsKKwkmazRzNTYxNjMyRSwKKwkmbXQ0OGxjMzJtMTZhMgorfTsKKworI2VuZGlmIC8qIF9DTTUyMDBfSCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvY201MjAwL2NtZF9jbTUyMDAuYyBiL2JvYXJkL2NtNTIwMC9jbWRfY201MjAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEzYzM2NQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2NtNTIwMC9jbWRfY201MjAwLmMKQEAgLTAsMCArMSw0NDggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDcgTWFya3VzIEthcHBlbGVyIDxtYXJrdXMua2FwcGVsZXJAb2JqZWN0eHAuY29tPgorICoKKyAqIEFkYXB0ZWQgZm9yIFUtQm9vdCAxLjIgYnkgUGlvdHIgS3J1c3p5bnNraSA8cHBrQHNlbWloYWxmLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGkyYy5oPgorI2luY2x1ZGUgPHVzYi5oPgorCisjaWZkZWYgQ09ORklHX0NNRF9CU0IKKworaW50IGRvX2kyYyhjaGFyICphcmd2W10pCit7CisJdW5zaWduZWQgY2hhciB0ZW1wLCB0ZW1wMTsKKworCXByaW50ZigiU3RhcnRpbmcgSTJDIFRlc3RcbiIKKwkJIlBsZWFzZSBzZXQgSnVtcGVyOlxuSTJDIFNEQSAyLTNcbkkyQyBTQ0wgMi0zXG5cbiIKKwkJIlBsZWFzZSBwcmVzcyBhbnkga2V5IHRvIHN0YXJ0XG5cbiIpOworCWdldGMoKTsKKworCXRlbXAgPSAweGYwOyAvKiBzZXQgaW8gMC00IGFzIG91dHB1dCAqLworCWkyY193cml0ZShDRkdfSTJDX0lPLCAzLCAxLCAodWNoYXIgKikmdGVtcCwgMSk7CisKKwlwcmludGYoIlByZXNzIEkyQzQtNy4gTEVEIEkyQzAtMyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBzdGF0ZVxuXG4iCisJCSJQcmVzcyBhbnkga2V5IHRvIHN0b3BcblxuIik7CisKKwl3aGlsZSAoIXRzdGMoKSkgeworCQlpMmNfcmVhZChDRkdfSTJDX0lPLCAwLCAxLCAodWNoYXIgKikmdGVtcCwgMSk7CisJCXRlbXAxID0gKHRlbXAgPj4gNCkgJiAweDAzOworCQl0ZW1wMSB8PSAodGVtcCA+PiAzKSAmIDB4MDg7IC8qIFMzMDIgLT4gTEVEMzAzICovCisJCXRlbXAxIHw9ICh0ZW1wID4+IDUpICYgMHgwNDsgLyogUzMwMyAtPiBMRUQzMDIgKi8KKwkJdGVtcCA9IHRlbXAxOworCQlpMmNfd3JpdGUoQ0ZHX0kyQ19JTywgMSwgMSwgKHVjaGFyICopJnRlbXAsIDEpOworCX0KKwlnZXRjKCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRvX3VzYnRlc3QoY2hhciAqYXJndltdKQoreworCWludCBpOworCXN0YXRpYyBpbnQgdXNiX3N0b3JfY3Vycl9kZXYgPSAtMTsgLyogY3VycmVudCBkZXZpY2UgKi8KKworCXByaW50ZigiU3RhcnRpbmcgVVNCIFRlc3RcbiIKKwkJIlBsZWFzZSBpbnNlcnQgVVNCIE1lbW1vcnkgU3RpY2tcblxuIgorCQkiUGxlYXNlIHByZXNzIGFueSBrZXkgdG8gc3RhcnRcblxuIik7CisJZ2V0YygpOworCisJdXNiX3N0b3AoKTsKKwlwcmludGYoIihSZSlzdGFydCBVU0IuLi5cbiIpOworCWkgPSB1c2JfaW5pdCgpOworI2lmZGVmIENPTkZJR19VU0JfU1RPUkFHRQorCQkvKiB0cnkgdG8gcmVjb2duaXplIHN0b3JhZ2UgZGV2aWNlcyBpbW1lZGlhdGVseSAqLworCQlpZiAoaSA+PSAwKQorCQkJdXNiX3N0b3JfY3Vycl9kZXYgPSB1c2Jfc3Rvcl9zY2FuKDEpOworI2VuZGlmIC8qIENPTkZJR19VU0JfU1RPUkFHRSAqLworCWlmICh1c2Jfc3Rvcl9jdXJyX2RldiA+PSAwKQorCQlwcmludGYoIkZvdW5kIFVTQiBTdG9yYWdlIERldiBjb250aW51ZSB3aXRoIFRlc3QuLi5cbiIpOworCWVsc2UgeworCQlwcmludGYoIk5vIFVTQiBTdG9yYWdlIERldmljZSBkZXRlY3RlZC4uIFN0b3AgVGVzdFxuIik7CisJCXJldHVybiAxOworCX0KKworCXVzYl9zdG9yX2luZm8oKTsKKworCXByaW50Zigic3RvcHBpbmcgVVNCLi5cbiIpOworCXVzYl9zdG9wKCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRvX2xlZChjaGFyICphcmd2W10pCit7CisJaW50IGkgPSAwOworCXN0cnVjdCBtcGM1eHh4X2dwdF8wXzcgKmdwdCA9IChzdHJ1Y3QgbXBjNXh4eF9ncHRfMF83ICopTVBDNVhYWF9HUFQ7CisKKwlwcmludGYoIlN0YXJ0aW5nIExFRCBUZXN0XG4iCisJCSJQbGVhc2Ugc2V0IFN3aXRjaCBTNTAwIGFsbCBvZmZcblxuIgorCQkiUGxlYXNlIHByZXNzIGFueSBrZXkgdG8gc3RhcnRcblxuIik7CisJZ2V0YygpOworCisJLyogY29uZmlndXJlIHRpbWVyIDItMyBmb3Igc2ltcGxlIEdQSU8gb3V0cHV0IEhpZ2ggKi8KKwlncHQtPmdwdDIuZW1zciB8PSAweDAwMDAwMDM0OworCWdwdC0+Z3B0My5lbXNyIHw9IDB4MDAwMDAwMzQ7CisKKwkoKih2dV9sb25nICopTVBDNVhYWF9XVV9HUElPX0VOQUJMRSkgfD0gMHg4MDAwMDAwMDsKKwkoKih2dV9sb25nICopTVBDNVhYWF9XVV9HUElPX0RJUikgfD0gMHg4MDAwMDAwMDsKKwlwcmludGYoIlBsZWFzZSBwcmVzcyBhbnkga2V5IHRvIHN0b3BcblxuIik7CisJd2hpbGUgKCF0c3RjKCkpIHsKKwkJaWYgKGkgPT0gMSkgeworCQkJKCoodnVfbG9uZyAqKU1QQzVYWFhfV1VfR1BJT19EQVRBX08pIHw9IDB4ODAwMDAwMDA7CisJCQlncHQtPmdwdDIuZW1zciAmPSB+MHgwMDAwMDAxMDsKKwkJCWdwdC0+Z3B0My5lbXNyICY9IH4weDAwMDAwMDEwOworCQl9IGVsc2UgaWYgKGkgPT0gMikgeworCQkJKCoodnVfbG9uZyAqKU1QQzVYWFhfV1VfR1BJT19EQVRBX08pICY9IH4weDgwMDAwMDAwOworCQkJZ3B0LT5ncHQyLmVtc3IgJj0gfjB4MDAwMDAwMTA7CisJCQlncHQtPmdwdDMuZW1zciB8PSAweDAwMDAwMDEwOworCQl9IGVsc2UgaWYgKGkgPj0gMykgeworCQkJKCoodnVfbG9uZyAqKU1QQzVYWFhfV1VfR1BJT19EQVRBX08pICY9IH4weDgwMDAwMDAwOworCQkJZ3B0LT5ncHQzLmVtc3IgJj0gfjB4MDAwMDAwMTA7CisJCQlncHQtPmdwdDIuZW1zciB8PSAweDAwMDAwMDEwOworCQkJaSA9IDA7CisJCX0KKwkJaSsrOworCQl1ZGVsYXkoMjAwMDAwKTsKKwl9CisJZ2V0YygpOworCisJKCoodnVfbG9uZyAqKU1QQzVYWFhfV1VfR1BJT19EQVRBX08pIHw9IDB4ODAwMDAwMDA7CisJZ3B0LT5ncHQyLmVtc3IgfD0gMHgwMDAwMDAxMDsKKwlncHQtPmdwdDMuZW1zciB8PSAweDAwMDAwMDEwOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkb19yczIzMihjaGFyICphcmd2W10pCit7CisJaW50IGVycm9yX3N0YXR1cyA9IDA7CisJc3RydWN0IG1wYzV4eHhfZ3BpbyAqZ3BpbyA9IChzdHJ1Y3QgbXBjNXh4eF9ncGlvICopTVBDNVhYWF9HUElPOworCXN0cnVjdCBtcGM1eHh4X3BzYyAqcHNjMSA9IChzdHJ1Y3QgbXBjNXh4eF9wc2MgKilNUEM1WFhYX1BTQzE7CisKKwkvKiBDb25maWd1cmUgUFNDIDItMy02IGFzIEdQSU8gKi8KKwlncGlvLT5wb3J0X2NvbmZpZyAmPSAweEZGMEZGODBGOworCisJc3dpdGNoIChzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxMCkpIHsKKwljYXNlIDE6CisJCS8qIGNoZWNrIFJUUyA8LT4gQ1RTIGxvb3AgKi8KKwkJLyogc2V0IHJ0cyB0byAwICovCisJCXByaW50ZigiVWFydCAxIHRlc3Q6IFJYIFRYIHRlc3RlZCBieSB1c2luZyBVLUJvb3RcbiIKKwkJCSJQbGVhc2UgY29ubmVjdCBSVFMgd2l0aCBDVFMgb24gVWFydDEgcGx1Z1xuXG4iCisJCQkiUHJlc3MgYW55IGtleSB0byBzdGFydFxuXG4iKTsKKwkJZ2V0YygpOworCisJCXBzYzEtPm9wMSB8PSAweDAxOworCisJCS8qIHdhaXQgc29tZSB0aW1lIGJlZm9yZSByZXF1ZXN0aW5nIHN0YXR1cyAqLworCQl1ZGVsYXkoMTApOworCisJCS8qIGNoZWNrIHN0YXR1cyBhdCBjdHMgKi8KKwkJaWYgKChwc2MxLT5pcCAmIDB4MDEpICE9IDApIHsKKwkJCWVycm9yX3N0YXR1cyA9IDM7CisJCQlwcmludGYoIiVzOiBmYWlsdXJlIGF0IHJzMjMyXzEsIGN0cyBzdGF0dXMgaXMgJWQgIgorCQkJCSIoc2hvdWxkIGJlIDApXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgKHBzYzEtPmlwICYgMHgwMSkpOworCQl9CisKKwkJLyogc2V0IHJ0cyB0byAxICovCisJCXBzYzEtPm9wMCB8PSAweDAxOworCisJCS8qIHdhaXQgc29tZSB0aW1lIGJlZm9yZSByZXF1ZXN0aW5nIHN0YXR1cyAqLworCQl1ZGVsYXkoMTApOworCisJCS8qIGNoZWNrIHN0YXR1cyBhdCBjdHMgKi8KKwkJaWYgKChwc2MxLT5pcCAmIDB4MDEpICE9IDEpIHsKKwkJCWVycm9yX3N0YXR1cyA9IDM7CisJCQlwcmludGYoIiVzOiBmYWlsdXJlIGF0IHJzMjMyXzEsIGN0cyBzdGF0dXMgaXMgJWQgIgorCQkJCSIoc2hvdWxkIGJlIDEpXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgKHBzYzEtPmlwICYgMHgwMSkpOworCQl9CisJCWJyZWFrOworCWNhc2UgMjoKKwkJLyogc2V0IFBTQzJfMCwgUFNDMl8yIGFzIG91dHB1dCBhbmQgUFNDMl8xLCBQU0MyXzMgYXMgaW5wdXQgKi8KKwkJcHJpbnRmKCJVYXJ0IDIgdGVzdDogUGxlYXNlIHVzZSBSUzIzMiBMb29wYmFjayBwbHVnIG9uIFVBUlQyXG4iCisJCQkiXG5QcmVzcyBhbnkga2V5IHRvIHN0YXJ0XG5cbiIpOworCQlnZXRjKCk7CisKKwkJZ3Bpby0+c2ltcGxlX2dwaW9lICY9IH4oMHgwMDAwMDBGMCk7CisJCWdwaW8tPnNpbXBsZV9ncGlvZSB8PSAweDAwMDAwMEYwOworCQlncGlvLT5zaW1wbGVfZGRyICY9IH4oMHgwMDAwMDBGMCk7CisJCWdwaW8tPnNpbXBsZV9kZHIgfD0gMHgwMDAwMDA1MDsKKworCQkvKiBjaGVjayBUWEQgPC0+IFJYRCBsb29wICovCisJCS8qIHNldCBUWEQgdG8gMSAqLworCQlncGlvLT5zaW1wbGVfZHZvIHw9ICgxIDw8IDQpOworCisJCS8qIHdhaXQgc29tZSB0aW1lIGJlZm9yZSByZXF1ZXN0aW5nIHN0YXR1cyAqLworCQl1ZGVsYXkoMTApOworCisJCWlmICgoZ3Bpby0+c2ltcGxlX2l2YWwgJiAweDAwMDAwMDIwKSAhPSAweDAwMDAwMDIwKSB7CisJCQllcnJvcl9zdGF0dXMgPSAyOworCQkJcHJpbnRmKCIlczogZmFpbHVyZSBhdCByczIzMl8yLCByeGQgc3RhdHVzIGlzICVkICIKKwkJCQkiKHNob3VsZCBiZSAxKVxuIiwgX19GVU5DVElPTl9fLAorCQkJCShncGlvLT5zaW1wbGVfaXZhbCAmIDB4MDAwMDAwMjApID4+IDUpOworCQl9CisKKwkJLyogc2V0IFRYRCB0byAwICovCisJCWdwaW8tPnNpbXBsZV9kdm8gJj0gfigxIDw8IDQpOworCisJCS8qIHdhaXQgc29tZSB0aW1lIGJlZm9yZSByZXF1ZXN0aW5nIHN0YXR1cyAqLworCQl1ZGVsYXkoMTApOworCisJCWlmICgoZ3Bpby0+c2ltcGxlX2l2YWwgJiAweDAwMDAwMDIwKSAhPSAweDAwMDAwMDAwKSB7CisJCQllcnJvcl9zdGF0dXMgPSAyOworCQkJcHJpbnRmKCIlczogZmFpbHVyZSBhdCByczIzMl8yLCByeGQgc3RhdHVzIGlzICVkICIKKwkJCQkiKHNob3VsZCBiZSAwKVxuIiwgX19GVU5DVElPTl9fLAorCQkJCShncGlvLT5zaW1wbGVfaXZhbCAmIDB4MDAwMDAwMjApID4+IDUpOworCQl9CisKKwkJLyogY2hlY2sgUlRTIDwtPiBDVFMgbG9vcCAqLworCQkvKiBzZXQgUlRTIHRvIDEgKi8KKwkJZ3Bpby0+c2ltcGxlX2R2byB8PSAoMSA8PCA2KTsKKworCQkvKiB3YWl0IHNvbWUgdGltZSBiZWZvcmUgcmVxdWVzdGluZyBzdGF0dXMgKi8KKwkJdWRlbGF5KDEwKTsKKworCQlpZiAoKGdwaW8tPnNpbXBsZV9pdmFsICYgMHgwMDAwMDA4MCkgIT0gMHgwMDAwMDA4MCkgeworCQkJZXJyb3Jfc3RhdHVzID0gMzsKKwkJCXByaW50ZigiJXM6IGZhaWx1cmUgYXQgcnMyMzJfMiwgY3RzIHN0YXR1cyBpcyAlZCAiCisJCQkJIihzaG91bGQgYmUgMSlcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQkoZ3Bpby0+c2ltcGxlX2l2YWwgJiAweDAwMDAwMDgwKSA+PiA3KTsKKwkJfQorCisJCS8qIHNldCBSVFMgdG8gMCAqLworCQlncGlvLT5zaW1wbGVfZHZvICY9IH4oMSA8PCA2KTsKKworCQkvKiB3YWl0IHNvbWUgdGltZSBiZWZvcmUgcmVxdWVzdGluZyBzdGF0dXMgKi8KKwkJdWRlbGF5KDEwKTsKKworCQlpZiAoKGdwaW8tPnNpbXBsZV9pdmFsICYgMHgwMDAwMDA4MCkgIT0gMHgwMDAwMDAwMCkgeworCQkJZXJyb3Jfc3RhdHVzID0gMzsKKwkJCXByaW50ZigiJXM6IGZhaWx1cmUgYXQgcnMyMzJfMiwgY3RzIHN0YXR1cyBpcyAlZCAiCisJCQkJIihzaG91bGQgYmUgMClcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQkoZ3Bpby0+c2ltcGxlX2l2YWwgJiAweDAwMDAwMDgwKSA+PiA3KTsKKwkJfQorCQlicmVhazsKKwljYXNlIDM6CisJCS8qIHNldCBQU0MzXzAsIFBTQzNfMiBhcyBvdXRwdXQgYW5kIFBTQzNfMSwgUFNDM18zIGFzIGlucHV0ICovCisJCXByaW50ZigiVWFydCAzIHRlc3Q6IFBsZWFzZSB1c2UgUlMyMzIgTG9vcGJhY2sgcGx1ZyBvbiBVQVJUMlxuIgorCQkJIlxuUHJlc3MgYW55IGtleSB0byBzdGFydFxuXG4iKTsKKwkJZ2V0YygpOworCisJCWdwaW8tPnNpbXBsZV9ncGlvZSAmPSB+KDB4MDAwMDBGMDApOworCQlncGlvLT5zaW1wbGVfZ3Bpb2UgfD0gMHgwMDAwMEYwMDsKKworCQlncGlvLT5zaW1wbGVfZGRyICY9IH4oMHgwMDAwMEYwMCk7CisJCWdwaW8tPnNpbXBsZV9kZHIgfD0gMHgwMDAwMDUwMDsKKworCQkvKiBjaGVjayBUWEQgPC0+IFJYRCBsb29wICovCisJCS8qIHNldCBUWEQgdG8gMSAqLworCQlncGlvLT5zaW1wbGVfZHZvIHw9ICgxIDw8IDgpOworCisJCS8qIHdhaXQgc29tZSB0aW1lIGJlZm9yZSByZXF1ZXN0aW5nIHN0YXR1cyAqLworCQl1ZGVsYXkoMTApOworCisJCWlmICgoZ3Bpby0+c2ltcGxlX2l2YWwgJiAweDAwMDAwMjAwKSAhPSAweDAwMDAwMjAwKSB7CisJCQllcnJvcl9zdGF0dXMgPSAyOworCQkJcHJpbnRmKCIlczogZmFpbHVyZSBhdCByczIzMl8zLCByeGQgc3RhdHVzIGlzICVkICIKKwkJCQkiKHNob3VsZCBiZSAxKVxuIiwgX19GVU5DVElPTl9fLAorCQkJCShncGlvLT5zaW1wbGVfaXZhbCAmIDB4MDAwMDAyMDApID4+IDkpOworCQl9CisKKwkJLyogc2V0IFRYRCB0byAwICovCisJCWdwaW8tPnNpbXBsZV9kdm8gJj0gfigxIDw8IDgpOworCisJCS8qIHdhaXQgc29tZSB0aW1lIGJlZm9yZSByZXF1ZXN0aW5nIHN0YXR1cyAqLworCQl1ZGVsYXkoMTApOworCisJCWlmICgoZ3Bpby0+c2ltcGxlX2l2YWwgJiAweDAwMDAwMjAwKSAhPSAweDAwMDAwMDAwKSB7CisJCQllcnJvcl9zdGF0dXMgPSAyOworCQkJcHJpbnRmKCIlczogZmFpbHVyZSBhdCByczIzMl8zLCByeGQgc3RhdHVzIGlzICVkICIKKwkJCQkiKHNob3VsZCBiZSAwKVxuIiwgX19GVU5DVElPTl9fLAorCQkJCShncGlvLT5zaW1wbGVfaXZhbCAmIDB4MDAwMDAyMDApID4+IDkpOworCQl9CisKKwkJLyogY2hlY2sgUlRTIDwtPiBDVFMgbG9vcCAqLworCQkvKiBzZXQgUlRTIHRvIDEgKi8KKwkJZ3Bpby0+c2ltcGxlX2R2byB8PSAoMSA8PCAxMCk7CisKKwkJLyogd2FpdCBzb21lIHRpbWUgYmVmb3JlIHJlcXVlc3Rpbmcgc3RhdHVzICovCisJCXVkZWxheSgxMCk7CisKKwkJaWYgKChncGlvLT5zaW1wbGVfaXZhbCAmIDB4MDAwMDA4MDApICE9IDB4MDAwMDA4MDApIHsKKwkJCWVycm9yX3N0YXR1cyA9IDM7CisJCQlwcmludGYoIiVzOiBmYWlsdXJlIGF0IHJzMjMyXzMsIGN0cyBzdGF0dXMgaXMgJWQgIgorCQkJCSIoc2hvdWxkIGJlIDEpXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJKGdwaW8tPnNpbXBsZV9pdmFsICYgMHgwMDAwMDgwMCkgPj4gMTEpOworCQl9CisKKwkJLyogc2V0IFJUUyB0byAwICovCisJCWdwaW8tPnNpbXBsZV9kdm8gJj0gfigxIDw8IDEwKTsKKworCQkvKiB3YWl0IHNvbWUgdGltZSBiZWZvcmUgcmVxdWVzdGluZyBzdGF0dXMgKi8KKwkJdWRlbGF5KDEwKTsKKworCQlpZiAoKGdwaW8tPnNpbXBsZV9pdmFsICYgMHgwMDAwMDgwMCkgIT0gMHgwMDAwMDAwMCkgeworCQkJZXJyb3Jfc3RhdHVzID0gMzsKKwkJCXByaW50ZigiJXM6IGZhaWx1cmUgYXQgcnMyMzJfMywgY3RzIHN0YXR1cyBpcyAlZCAiCisJCQkJIihzaG91bGQgYmUgMClcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQkoZ3Bpby0+c2ltcGxlX2l2YWwgJiAweDAwMDAwODAwKSA+PiAxMSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSA0OgorCQkvKiBzZXQgUFNDNl8yLCBQU0M2XzMgYXMgb3V0cHV0IGFuZCBQU0M2XzAsIFBTQzZfMSBhcyBpbnB1dCAqLworCQlwcmludGYoIlVhcnQgNCB0ZXN0OiBQbGVhc2UgdXNlIFJTMjMyIExvb3BiYWNrIHBsdWcgb24gVUFSVDJcbiIKKwkJCSJcblByZXNzIGFueSBrZXkgdG8gc3RhcnRcblxuIik7CisJCWdldGMoKTsKKworCQlncGlvLT5zaW1wbGVfZ3Bpb2UgJj0gfigweEYwMDAwMDAwKTsKKwkJZ3Bpby0+c2ltcGxlX2dwaW9lIHw9IDB4MzAwMDAwMDA7CisKKwkJZ3Bpby0+c2ltcGxlX2RkciAmPSB+KDB4ZjAwMDAwMDApOworCQlncGlvLT5zaW1wbGVfZGRyIHw9IDB4MzAwMDAwMDA7CisKKwkJKCoodnVfbG9uZyAqKU1QQzVYWFhfV1VfR1BJT19FTkFCTEUpIHw9IDB4MzAwMDAwMDA7CisJCSgqKHZ1X2xvbmcgKilNUEM1WFhYX1dVX0dQSU9fRElSKSAmPSB+KDB4MzAwMDAwMDApOworCisJCS8qIGNoZWNrIFRYRCA8LT4gUlhEIGxvb3AgKi8KKwkJLyogc2V0IFRYRCB0byAxICovCisJCWdwaW8tPnNpbXBsZV9kdm8gfD0gKDEgPDwgMjgpOworCisJCS8qIHdhaXQgc29tZSB0aW1lIGJlZm9yZSByZXF1ZXN0aW5nIHN0YXR1cyAqLworCQl1ZGVsYXkoMTApOworCisJCWlmICgoKCoodnVfbG9uZyAqKU1QQzVYWFhfV1VfR1BJT19EQVRBX0kpICYgMHgxMDAwMDAwMCkgIT0KKwkJCQkweDEwMDAwMDAwKSB7CisJCQllcnJvcl9zdGF0dXMgPSAyOworCQkJcHJpbnRmKCIlczogZmFpbHVyZSBhdCByczIzMl80LCByeGQgc3RhdHVzIGlzICVkICIKKwkJCQkiKHNob3VsZCBiZSAxKVxuIiwgX19GVU5DVElPTl9fLAorCQkJCSgoKih2dV9sb25nICopTVBDNVhYWF9XVV9HUElPX0RBVEFfSSkgJgorCQkJCQkweDEwMDAwMDAwKSA+PiAyOCk7CisJCX0KKworCQkvKiBzZXQgVFhEIHRvIDAgKi8KKwkJZ3Bpby0+c2ltcGxlX2R2byAmPSB+KDEgPDwgMjgpOworCisJCS8qIHdhaXQgc29tZSB0aW1lIGJlZm9yZSByZXF1ZXN0aW5nIHN0YXR1cyAqLworCQl1ZGVsYXkoMTApOworCisJCWlmICgoKCoodnVfbG9uZyAqKU1QQzVYWFhfV1VfR1BJT19EQVRBX0kpICYgMHgxMDAwMDAwMCkgIT0KKwkJCQkweDAwMDAwMDAwKSB7CisJCQllcnJvcl9zdGF0dXMgPSAyOworCQkJcHJpbnRmKCIlczogZmFpbHVyZSBhdCByczIzMl80LCByeGQgc3RhdHVzIGlzICVkICIKKwkJCQkiKHNob3VsZCBiZSAwKVxuIiwgX19GVU5DVElPTl9fLAorCQkJCSgoKih2dV9sb25nICopTVBDNVhYWF9XVV9HUElPX0RBVEFfSSkgJgorCQkJCQkweDEwMDAwMDAwKSA+PiAyOCk7CisJCX0KKworCQkvKiBjaGVjayBSVFMgPC0+IENUUyBsb29wICovCisJCS8qIHNldCBSVFMgdG8gMSAqLworCQlncGlvLT5zaW1wbGVfZHZvIHw9ICgxIDw8IDI5KTsKKworCQkvKiB3YWl0IHNvbWUgdGltZSBiZWZvcmUgcmVxdWVzdGluZyBzdGF0dXMgKi8KKwkJdWRlbGF5KDEwKTsKKworCQlpZiAoKCgqKHZ1X2xvbmcgKilNUEM1WFhYX1dVX0dQSU9fREFUQV9JKSAmIDB4MjAwMDAwMDApICE9CisJCQkJMHgyMDAwMDAwMCkgeworCQkJZXJyb3Jfc3RhdHVzID0gMzsKKwkJCXByaW50ZigiJXM6IGZhaWx1cmUgYXQgcnMyMzJfNCwgY3RzIHN0YXR1cyBpcyAlZCAiCisJCQkJIihzaG91bGQgYmUgMSlcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQkoKCoodnVfbG9uZyAqKU1QQzVYWFhfV1VfR1BJT19EQVRBX0kpICYKKwkJCQkJMHgyMDAwMDAwMCkgPj4gMjkpOworCQl9CisKKwkJLyogc2V0IFJUUyB0byAwICovCisJCWdwaW8tPnNpbXBsZV9kdm8gJj0gfigxIDw8IDI5KTsKKworCQkvKiB3YWl0IHNvbWUgdGltZSBiZWZvcmUgcmVxdWVzdGluZyBzdGF0dXMgKi8KKwkJdWRlbGF5KDEwKTsKKworCQlpZiAoKCgqKHZ1X2xvbmcgKilNUEM1WFhYX1dVX0dQSU9fREFUQV9JKSAmIDB4MjAwMDAwMDApICE9CisJCQkJMHgwMDAwMDAwMCkgeworCQkJZXJyb3Jfc3RhdHVzID0gMzsKKwkJCXByaW50ZigiJXM6IGZhaWx1cmUgYXQgcnMyMzJfNCwgY3RzIHN0YXR1cyBpcyAlZCAiCisJCQkJIihzaG91bGQgYmUgMClcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQkoKCoodnVfbG9uZyAqKU1QQzVYWFhfV1VfR1BJT19EQVRBX0kpICYKKwkJCQkJMHgyMDAwMDAwMCkgPj4gMjkpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigiJXM6IGludmFsaWQgcnMyMzIgbnVtYmVyICVzXG4iLCBfX0ZVTkNUSU9OX18sIGFyZ3ZbMl0pOworCQllcnJvcl9zdGF0dXMgPSAxOworCQlicmVhazsKKwl9CisJZ3Bpby0+cG9ydF9jb25maWcgfD0gKENGR19HUFNfUE9SVF9DT05GSUcgJiAweEZGMEZGODBGKTsKKworCXJldHVybiBlcnJvcl9zdGF0dXM7Cit9CisKK2ludCBjbWRfZmt0KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCByY29kZSA9IC0xOworCisJc3dpdGNoIChhcmdjKSB7CisJY2FzZSAyOgorCQlpZiAoc3RybmNtcChhcmd2WzFdLCAiaTJjIiwgMykgPT0gMCkKKwkJCXJjb2RlID0gZG9faTJjKGFyZ3YpOworCQllbHNlIGlmIChzdHJuY21wKGFyZ3ZbMV0sICJsZWQiLCAzKSA9PSAwKQorCQkJcmNvZGUgPSBkb19sZWQoYXJndik7CisJCWVsc2UgaWYgKHN0cm5jbXAoYXJndlsxXSwgInVzYiIsIDMpID09IDApCisJCQlyY29kZSA9IGRvX3VzYnRlc3QoYXJndik7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJaWYgKHN0cm5jbXAoYXJndlsxXSwgInJzMjMyIiwgMykgPT0gMCkKKwkJCXJjb2RlID0gZG9fcnMyMzIoYXJndik7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAocmNvZGUpIHsKKwljYXNlIC0xOgorCQlwcmludGYoIlVzYWdlOlxuIgorCQkJImZrdCB7IGkyYyB8IGxlZCB8IHVzYiB9XG4iCisJCQkiZmt0IHJzMjMyIG51bWJlclxuIik7CisJCXJjb2RlID0gMTsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQlwcmludGYoIlRlc3QgcGFzc2VkXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCJUZXN0IGZhaWxlZCB3aXRoIGNvZGU6ICVkXG4iLCByY29kZSk7CisJfQorCisJcmV0dXJuIHJjb2RlOworfQorCitVX0JPT1RfQ01EKAorCWZrdCwJNCwJMSwJY21kX2ZrdCwKKwkiZmt0ICAgICAtIEZ1bmN0aW9uIHRlc3Qgcm91dGluZXNcbiIsCisJImkyY1xuIgorCSIgICAgIC0gVGVzdCBJMkMgY29tbXVuaWNhdGlvblxuIgorCSJma3QgbGVkXG4iCisJIiAgICAgLSBUZXN0IExFRHNcbiIKKwkiZmt0IHJzMjMyIG51bWJlclxuIgorCSIgICAgIC0gVGVzdCBSUzIzMiAobG9vcGJhY2sgcGx1ZyhzKSBmb3IgUlMyMzIgcmVxdWlyZWQpXG4iCisJImZrdCB1c2JcbiIKKwkiICAgICAtIFRlc3QgVVNCIGNvbW11bmljYXRpb25cbiIKKyk7CisjZW5kaWYgLyogQ09ORklHX0NNRF9CU1AgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL2NtNTIwMC9jb25maWcubWsgYi9ib2FyZC9jbTUyMDAvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMDYxMzkKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9jbTUyMDAvY29uZmlnLm1rCkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA3CisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK1RFWFRfQkFTRSA9IDB4ZmMwMDAwMDAKKworUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURURVhUX0JBU0U9JChURVhUX0JBU0UpIC1JJChUT1BESVIpL2JvYXJkCmRpZmYgLS1naXQgYS9ib2FyZC9jbTUyMDAvZnd1cGRhdGUuYyBiL2JvYXJkL2NtNTIwMC9md3VwZGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YWE5NGEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9jbTUyMDAvZnd1cGRhdGUuYwpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNyBTY2hpbmRsZXIgTGlmdCBJbmMuCisgKiAoQykgQ29weXJpZ2h0IDIwMDcgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZworICoKKyAqIEF1dGhvcjogTWljaGVsIE1hcnRpIDxtbWFAb2JqZWN0eHAuY29tPgorICogQWRhcHRlZCBmb3IgVS1Cb290IDEuMiBieSBQaW90ciBLcnVzenluc2tpIDxwcGtAc2VtaWhhbGYuY29tPjoKKyAqICAgLSBjb2RlIGNsZWFuLXVwCisgKiAgIC0gYnVnZml4IGZvciBvdmVyd3JpdGluZyBib290YXJncyBieSB1c2VyCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxpbWFnZS5oPgorI2luY2x1ZGUgPHVzYi5oPgorI2luY2x1ZGUgPGZhdC5oPgorCisjaW5jbHVkZSAiZnd1cGRhdGUuaCIKKworZXh0ZXJuIGludCBkb19ib290bShjbWRfdGJsX3QgKiwgaW50LCBpbnQsIGNoYXIgKltdKTsKK2V4dGVybiBsb25nIGRvX2ZhdF9yZWFkKGNvbnN0IGNoYXIgKiwgdm9pZCAqLCB1bnNpZ25lZCBsb25nLCBpbnQpOworZXh0ZXJuIGludCBkb19mYXRfZnNsb2FkKGNtZF90YmxfdCAqLCBpbnQsIGludCwgY2hhciAqW10pOworCitzdGF0aWMgaW50IGxvYWRfcmVzY3VlX2ltYWdlKHVsb25nKTsKKwordm9pZCBjbTUyMDBfZnd1cGRhdGUodm9pZCkKK3sKKwljbWRfdGJsX3QgKmJjbWQ7CisJY2hhciAqcnNhcmdzOworCWNoYXIgKnRtcCA9IE5VTEw7CisJY2hhciBrYVsxNl07CisJY2hhciAqYXJndlszXSA9IHsgImJvb3RtIiwga2EsIE5VTEwgfTsKKworCS8qIENoZWNrIGlmIHJlc2N1ZSBzeXN0ZW0gaXMgZGlzYWJsZWQuLi4gKi8KKwlpZiAoZ2V0ZW52KCJub3Jlc2N1ZSIpKSB7CisJCXByaW50ZihMT0dfUFJFRklYICJSZXNjdWUgU3lzdGVtIGRpc2FibGVkLlxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBDaGVjayBpZiB3ZSBoYXZlIGEgVVNCIHN0b3JhZ2UgZGV2aWNlIGFuZCBsb2FkIGltYWdlICovCisJaWYgKGxvYWRfcmVzY3VlX2ltYWdlKExPQURfQUREUikpCisJCXJldHVybjsKKworCWJjbWQgPSBmaW5kX2NtZCgiYm9vdG0iKTsKKwlpZiAoIWJjbWQpCisJCXJldHVybjsKKworCXNwcmludGYoa2EsICIlbHgiLCBMT0FEX0FERFIpOworCisJLyogcHJlcGFyZSBvdXIgYm9vdGFyZ3MgKi8KKwlyc2FyZ3MgPSBnZXRlbnYoInJzLWFyZ3MiKTsKKwlpZiAoIXJzYXJncykKKwkJcnNhcmdzID0gUlNfQk9PVEFSR1M7CisJZWxzZSB7CisJCXRtcCA9IG1hbGxvYyhzdHJsZW4ocnNhcmdzKzEpKTsKKwkJaWYgKCF0bXApIHsKKwkJCXByaW50ZihMT0dfUFJFRklYICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQkJcmV0dXJuOworCQl9CisJCXN0cmNweSh0bXAsIHJzYXJncyk7CisJCXJzYXJncyA9IHRtcDsKKwl9CisKKwlzZXRlbnYoImJvb3RhcmdzIiwgcnNhcmdzKTsKKworCWlmIChyc2FyZ3MgPT0gdG1wKQorCQlmcmVlKHJzYXJncyk7CisKKwlwcmludGYoTE9HX1BSRUZJWCAiU3RhcnRpbmcgdXBkYXRlIHN5c3RlbSAoYm9vdGFyZ3M9JXMpLi4uXG4iLCByc2FyZ3MpOworCWRvX2Jvb3RtKGJjbWQsIDAsIDIsIGFyZ3YpOworfQorCitzdGF0aWMgaW50IGxvYWRfcmVzY3VlX2ltYWdlKHVsb25nIGFkZHIpCit7CisJZGlza19wYXJ0aXRpb25fdCBpbmZvOworCWludCBkZXZubzsKKwlpbnQgcGFydG5vOworCWludCBpOworCWNoYXIgZndkaXJbNjRdOworCWNoYXIgbnhyaVsxMjhdOworCWNoYXIgKnRtcDsKKwljaGFyIGRldls3XTsKKwljaGFyIGFkZHJfc3RyWzE2XTsKKwljaGFyICphcmd2WzZdID0geyAiZmF0bG9hZCIsICJ1c2IiLCBkZXYsIGFkZHJfc3RyLCBueHJpLCBOVUxMIH07CisJYmxvY2tfZGV2X2Rlc2NfdCAqc3Rvcl9kZXYgPSBOVUxMOworCWNtZF90YmxfdCAqYmNtZDsKKworCS8qIEdldCBuYW1lIG9mIGZpcm13YXJlIGRpcmVjdG9yeSAqLworCXRtcCA9IGdldGVudigiZnctZGlyIik7CisKKwkvKiBDb3B5IGl0IGludG8gZndkaXIgKi8KKwlzdHJuY3B5KGZ3ZGlyLCB0bXAgPyB0bXAgOiBGV19ESVIsIHNpemVvZihmd2RpcikpOworCWZ3ZGlyW3NpemVvZihmd2RpcikgLSAxXSA9IDA7IC8qIFRlcm1pbmF0ZSBzdHJpbmcgKi8KKworCXByaW50ZihMT0dfUFJFRklYICJDaGVja2luZyBmb3IgZmlybXdhcmUgaW1hZ2UgZGlyZWN0b3J5ICclcycgb24gVVNCIgorCQkiIHN0b3JhZ2UuLi5cbiIsIGZ3ZGlyKTsKKwl1c2Jfc3RvcCgpOworCWlmICh1c2JfaW5pdCgpICE9IDApCisJCXJldHVybiAxOworCisJLyogQ2hlY2sgZm9yIHN0b3JhZ2UgZGV2aWNlICovCisJaWYgKHVzYl9zdG9yX3NjYW4oMSkgIT0gMCkgeworCQl1c2Jfc3RvcCgpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBEZXRlY3Qgc3RvcmFnZSBkZXZpY2UgKi8KKwlmb3IgKGRldm5vID0gMDsgZGV2bm8gPCBVU0JfTUFYX1NUT1JfREVWOyBkZXZubysrKSB7CisJCXN0b3JfZGV2ID0gdXNiX3N0b3JfZ2V0X2RldihkZXZubyk7CisJCWlmIChzdG9yX2Rldi0+dHlwZSAhPSBERVZfVFlQRV9VTktOT1dOKQorCQkJYnJlYWs7CisJfQorCWlmICghc3Rvcl9kZXYgfHwgc3Rvcl9kZXYtPnR5cGUgPT0gREVWX1RZUEVfVU5LTk9XTikgeworCQlwcmludGYoTE9HX1BSRUZJWCAiTm8gdmFsaWQgc3RvcmFnZSBkZXZpY2UgZm91bmQuLi5cbiIpOworCQl1c2Jfc3RvcCgpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBEZXRlY3QgcGFydGl0aW9uICovCisJZm9yIChwYXJ0bm8gPSAtMSwgaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJaWYgKGdldF9wYXJ0aXRpb25faW5mbyhzdG9yX2RldiwgaSwgJmluZm8pID09IDApIHsKKwkJCWlmIChmYXRfcmVnaXN0ZXJfZGV2aWNlKHN0b3JfZGV2LCBpKSA9PSAwKSB7CisJCQkJLyogQ2hlY2sgaWYgcmVzY3VlIGltYWdlIGlzIHByZXNlbnQgKi8KKwkJCQlGV19ERUJVRygiTG9va2luZyBmb3IgZmlybXdhcmUgZGlyZWN0b3J5ICclcyciCisJCQkJCSIgb24gcGFydGl0aW9uICVkXG4iLCBmd2RpciwgaSk7CisJCQkJaWYgKGRvX2ZhdF9yZWFkKGZ3ZGlyLCBOVUxMLCAwLCBMU19OTykgPT0gLTEpIHsKKwkJCQkJRldfREVCVUcoIk5vIE5YIHJlc2N1ZSBpbWFnZSBvbiAiCisJCQkJCQkicGFydGl0aW9uICVkLlxuIiwgaSk7CisJCQkJCXBhcnRubyA9IC0yOworCQkJCX0gZWxzZSB7CisJCQkJCXBhcnRubyA9IGk7CisJCQkJCUZXX0RFQlVHKCJQYXJ0aXRpb24gJWQgY29udGFpbnMgIgorCQkJCQkJImZpcm13YXJlIGRpcmVjdG9yeVxuIiwgcGFydG5vKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYgKHBhcnRubyA8IDApIHsKKwkJc3dpdGNoIChwYXJ0bm8pIHsKKwkJY2FzZSAtMToKKwkJCXByaW50ZihMT0dfUFJFRklYICJFcnJvcjogTm8gdmFsaWQgKEZBVCkgcGFydGl0aW9uICIKKwkJCQkiZGV0ZWN0ZWRcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgLTI6CisJCQlwcmludGYoTE9HX1BSRUZJWCAiRXJyb3I6IE5vIE5YIHJlc2N1ZSBpbWFnZSBvbiBGQVQgIgorCQkJCSJwYXJ0aXRpb25cbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGYoTE9HX1BSRUZJWCAiRXJyb3I6IEZhaWxlZCB3aXRoIGNvZGUgJWRcbiIsCisJCQkJcGFydG5vKTsKKwkJfQorCQl1c2Jfc3RvcCgpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBMb2FkIHRoZSByZXNjdWUgaW1hZ2UgKi8KKwliY21kID0gZmluZF9jbWQoImZhdGxvYWQiKTsKKwlpZiAoIWJjbWQpIHsKKwkJcHJpbnRmKExPR19QUkVGSVggIkVycm9yIC0gJ2ZhdGxvYWQnIGNvbW1hbmQgbm90IHByZXNlbnQuXG4iKTsKKwkJdXNiX3N0b3AoKTsKKwkJcmV0dXJuIDE7CisJfQorCisJdG1wID0gZ2V0ZW52KCJueC1yZXNjdWUtaW1hZ2UiKTsKKwlzcHJpbnRmKG54cmksICIlcy8lcyIsIGZ3ZGlyLCB0bXAgPyB0bXAgOiBSRVNDVUVfSU1BR0UpOworCXNwcmludGYoZGV2LCAiJWQ6JWQiLCBkZXZubywgcGFydG5vKTsKKwlzcHJpbnRmKGFkZHJfc3RyLCAiJWx4IiwgYWRkcik7CisKKwlGV19ERUJVRygiZmF0X2ZzbG9hZCBkZXZpY2U9JyVzJywgYWRkcj0nJXMnLCBmaWxlOiAlc1xuIiwKKwkJZGV2LCBhZGRyX3N0ciwgbnhyaSk7CisKKwlpZiAoZG9fZmF0X2ZzbG9hZChiY21kLCAwLCA1LCBhcmd2KSAhPSAwKSB7CisJCXVzYl9zdG9wKCk7CisJCXJldHVybiAxOworCX0KKworCS8qIFN0b3AgVVNCICovCisJdXNiX3N0b3AoKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL2NtNTIwMC9md3VwZGF0ZS5oIGIvYm9hcmQvY201MjAwL2Z3dXBkYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUzZjFlMQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2NtNTIwMC9md3VwZGF0ZS5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDcgU2NoaW5kbGVyIExpZnQgSW5jLgorICoKKyAqIEF1dGhvcjogTWljaGVsIE1hcnRpIDxtbWFAb2JqZWN0eHAuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19GV19VUERBVEVfSAorI2RlZmluZSBfX0ZXX1VQREFURV9ICisKKy8qIERlZmF1bHQgcHJlZml4IGZvciBvdXRwdXQgbWVzc2FnZXMgKi8KKyNkZWZpbmUgTE9HX1BSRUZJWAkiQ001MjAwOiIKKworLyogRXh0cmEgZGVidWcgbWFjcm8gKi8KKyNpZmRlZiBDT05GSUdfRldVUERBVEVfREVCVUcKKyNkZWZpbmUgRldfREVCVUcoZm10Li4uKSBwcmludGYoTE9HX1BSRUZJWCBmbXQpCisjZWxzZQorI2RlZmluZSBGV19ERUJVRyhmbXQuLi4pCisjZW5kaWYKKworLyogTmFtZSBvZiB0aGUgZGlyZWN0b3J5IGhvbGRpbmcgZmlybXdhcmUgaW1hZ2VzICovCisjZGVmaW5lIEZXX0RJUgkJIm54LWZ3IgorI2RlZmluZSBSRVNDVUVfSU1BR0UJIm54cnMuaW1nIgorI2RlZmluZSBMT0FEX0FERFIJMHg0MDAwMDAKKyNkZWZpbmUgUlNfQk9PVEFSR1MJInJhbWRpc2s9ODE5MksiCisKKy8qIE1haW4gZnVuY3Rpb24gZm9yIGZ3dXBkYXRlICovCit2b2lkIGNtNTIwMF9md3VwZGF0ZSh2b2lkKTsKKworI2VuZGlmIC8qIF9fRldfVVBEQVRFX0ggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL21vdGlvbnByby91LWJvb3QubGRzIGIvYm9hcmQvY201MjAwL3UtYm9vdC5sZHMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJvYXJkL21vdGlvbnByby91LWJvb3QubGRzCnJlbmFtZSB0byBib2FyZC9jbTUyMDAvdS1ib290LmxkcwpkaWZmIC0tZ2l0IGEvYm9hcmQvY21jX3B1Mi9jbWNfcHUyLmMgYi9ib2FyZC9jbWNfcHUyL2NtY19wdTIuYwppbmRleCA5YWUzYzQyLi4zNzRjZDA3IDEwMDY0NAotLS0gYS9ib2FyZC9jbWNfcHUyL2NtY19wdTIuYworKysgYi9ib2FyZC9jbWNfcHUyL2NtY19wdTIuYwpAQCAtMTU1LDcgKzE1NSw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfRFJJVkVSX0VUSEVSCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAKIC8qCiAgKiBOYW1lOgpAQCAtMTc1LDUgKzE3NSw1IEBACiAJcF9waHlvcHMtPkF1dG9OZWdvdGlhdGUgPSBkbTkxNjFfQXV0b05lZ290aWF0ZTsKIH0KIAotI2VuZGlmCS8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUICovCisjZW5kaWYKICNlbmRpZgkvKiBDT05GSUdfRFJJVkVSX0VUSEVSICovCmRpZmYgLS1naXQgYS9ib2FyZC9jbWkvdS1ib290LmxkcyBiL2JvYXJkL2NtaS91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjAzZmVmLi4wMDAwMDAwCi0tLSBhL2JvYXJkL2NtaS91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEJV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZQotICogKEMpIENvcHlyaWdodCAyMDAzCU1hcnRpbiBXaW5pc3RvZXJmZXIsIG1hcnRpbndpbmlzdG9lcmZlckBnbXguY2gKLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIC8qIFdBUk5JTkcgLSB0aGUgZm9sbG93aW5nIGlzIGhhbmQtb3B0aW1pemVkIHRvIGZpdCB3aXRoaW4JKi8KLSAgICAvKiB0aGUgc2VjdG9yIGxheW91dCBvZiBvdXIgZmxhc2ggY2hpcHMhCVhYWCBGSVhNRSBYWFgJKi8KLQotICAgIGNwdS9tcGM1eHgvc3RhcnQubwkoLnRleHQpCi0KLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gIH0KLSAgX2V0ZXh0ID0gLjsKLSAgUFJPVklERSAoZXRleHQgPSAuKTsKLSAgLnJvZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MDBGRikgJiAweEZGRkZGRjAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PjI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXyk+PjI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDI1Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDI1Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotCi0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci0vKiAgIC4gPSBlbnZfc3RhcnQ7Ci0JLnBwY2Vudgk6Ci0JewotCQljb21tb24vZW52aXJvbm1lbnQubyAoLnBwY2VudikKLQl9Ci0qLwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvY29nZW50L2NvbmZpZy5tayBiL2JvYXJkL2NvZ2VudC9jb25maWcubWsKaW5kZXggZWU3NzkzOS4uMzVhNWVkMyAxMDA2NDQKLS0tIGEvYm9hcmQvY29nZW50L2NvbmZpZy5taworKysgYi9ib2FyZC9jb2dlbnQvY29uZmlnLm1rCkBAIC0yOSwzICsyOSw1IEBACiBURVhUX0JBU0UgPSAweGZmZjAwMDAwCiAKIFBMQVRGT1JNX0NQUEZMQUdTICs9IC1EVEVYVF9CQVNFPSQoVEVYVF9CQVNFKSAtSSQoVE9QRElSKQorCitMRFNDUklQVCA6PSAkKFNSQ1RSRUUpL2JvYXJkL2NvZ2VudC91LWJvb3QubGRzCmRpZmYgLS1naXQgYS9ib2FyZC9jb2dlbnQvc2VyaWFsLmMgYi9ib2FyZC9jb2dlbnQvc2VyaWFsLmMKaW5kZXggMmI1OTVhOC4uZDljMjdiZSAxMDA2NDQKLS0tIGEvYm9hcmQvY29nZW50L3NlcmlhbC5jCisrKyBiL2JvYXJkL2NvZ2VudC9zZXJpYWwuYwpAQCAtOTAsNyArOTAsNyBAQAogCiAjZW5kaWYgLyogQ09OU19OT05FICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKSAmJiBcCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpICYmIFwKICAgICBkZWZpbmVkKENPTkZJR19LR0RCX05PTkUpCiAKICNpZiBDT05GSUdfS0dEQl9JTkRFWCA9PSBDT05GSUdfQ09OU19JTkRFWApkaWZmIC0tZ2l0IGEvYm9hcmQvY29nZW50L3UtYm9vdC5sZHMgYi9ib2FyZC9jb2dlbnQvdS1ib290LmxkcwppbmRleCA1Y2UyNjk0Li5kODdhMzliIDEwMDY0NAotLS0gYS9ib2FyZC9jb2dlbnQvdS1ib290LmxkcworKysgYi9ib2FyZC9jb2dlbnQvdS1ib290LmxkcwpAQCAtNTUsNyArNTUsNiBAQAogICB7CiAgICAgKigudGV4dCkKICAgICBjb21tb24vZW52aXJvbm1lbnQubygudGV4dCkKLSAgICAqKC5maXh1cCkKICAgICAqKC5nb3QxKQogICB9CiAgIF9ldGV4dCA9IC47CmRpZmYgLS1naXQgYS9ib2FyZC9jcGM0NS9jcGM0NS5jIGIvYm9hcmQvY3BjNDUvY3BjNDUuYwppbmRleCA1MWIwMDg1Li43OWViNDczIDEwMDY0NAotLS0gYS9ib2FyZC9jcGM0NS9jcGM0NS5jCisrKyBiL2JvYXJkL2NwYzQ1L2NwYzQ1LmMKQEAgLTI0MCw3ICsyNDAsNyBAQAogCXJldHVybiAoMCk7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKIAogI2lmZGVmIENGR19QQ01DSUFfTUVNX0FERFIKIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnBjbWNpYV9tZW0gPSAodW5zaWduZWQgY2hhciopQ0ZHX1BDTUNJQV9NRU1fQUREUjsKQEAgLTI1Nyw3ICsyNTcsNyBAQAogCXJldHVybiByYzsKIH0KIAotI2VuZGlmCS8qIENGR19DTURfUENNQ0lBICovCisjZW5kaWYKIAogIyBpZmRlZiBDT05GSUdfSURFX0xFRAogdm9pZCBpZGVfbGVkICh1Y2hhciBsZWQsIHVjaGFyIHN0YXR1cykKZGlmZiAtLWdpdCBhL2JvYXJkL2NwYzQ1L3BkNjcyOTAuYyBiL2JvYXJkL2NwYzQ1L3BkNjcyOTAuYwppbmRleCA2Y2EzZTdiLi5kOGY0YmU1IDEwMDY0NAotLS0gYS9ib2FyZC9jcGM0NS9wZDY3MjkwLmMKKysrIGIvYm9hcmQvY3BjNDUvcGQ2NzI5MC5jCkBAIC03NzIsNyArNzcyLDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKIGludCBwY21jaWFfb2ZmICh2b2lkKQogewogCXByaW50ZiAoIkRpc2FibGUgUENNQ0lBICIgUENNQ0lBX1NMT1RfTVNHICJcbiIpOwpkaWZmIC0tZ2l0IGEvYm9hcmQvY3BjNDUvdS1ib290LmxkcyBiL2JvYXJkL2NwYzQ1L3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYTI2YWEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvY3BjNDUvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxLTIwMDMKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI0eC9zdGFydC5vCSgudGV4dCkKLSAgICBsaWJfcHBjL2JvYXJkLm8gKC50ZXh0KQotICAgIGxpYl9wcGMvcHBjc3RyaW5nLm8JKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL3ZzcHJpbnRmLm8JKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL2NyYzMyLm8JCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy96bGliLm8JCSgudGV4dCkKLQotCQkuID0gREVGSU5FRChlbnZfb2Zmc2V0KSA/IGVudl9vZmZzZXQgOiAuOwotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vICgudGV4dCkKLQotCQkqKC50ZXh0KQotCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvY3B1ODYvY3B1ODYuYyBiL2JvYXJkL2NwdTg2L2NwdTg2LmMKaW5kZXggM2ViNWIzNS4uMGViOTRlZiAxMDA2NDQKLS0tIGEvYm9hcmQvY3B1ODYvY3B1ODYuYworKysgYi9ib2FyZC9jcHU4Ni9jcHU4Ni5jCkBAIC0zMTIsNyArMzEyLDcgQEAKIAlyZXR1cm4gKHBzaXplKTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RPQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRE9DKQogZXh0ZXJuIHZvaWQgZG9jX3Byb2JlICh1bG9uZyBwaHlzYWRyKTsKIHZvaWQgZG9jX2luaXQgKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9ib2FyZC9jcHU4Ni91LWJvb3QubGRzIGIvYm9hcmQvY3B1ODYvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVmMjljNi4uMDAwMDAwMAotLS0gYS9ib2FyZC9jcHU4Ni91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI2MC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9jcHU4Ny9jcHU4Ny5jIGIvYm9hcmQvY3B1ODcvY3B1ODcuYwppbmRleCA5ZmVjZGQwLi5hMmZkMTkzIDEwMDY0NAotLS0gYS9ib2FyZC9jcHU4Ny9jcHU4Ny5jCisrKyBiL2JvYXJkL2NwdTg3L2NwdTg3LmMKQEAgLTMyMSw3ICszMjEsNyBAQAogCXJldHVybiAocHNpemUpOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRE9DKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ET0MpCiBleHRlcm4gdm9pZCBkb2NfcHJvYmUgKHVsb25nIHBoeXNhZHIpOwogdm9pZCBkb2NfaW5pdCAodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2JvYXJkL2NwdTg3L3UtYm9vdC5sZHMgYi9ib2FyZC9jcHU4Ny91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjdlNjY1Li4wMDAwMDAwCi0tLSBhL2JvYXJkL2NwdTg3L3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMS0yMDA1Ci0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNjAvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICBjb21tb24vZW52aXJvbm1lbnQubygudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvY3NiNjM3L2NzYjYzNy5jIGIvYm9hcmQvY3NiNjM3L2NzYjYzNy5jCmluZGV4IGFlYjFhMTMuLmZiYzNjODcgMTAwNjQ0Ci0tLSBhL2JvYXJkL2NzYjYzNy9jc2I2MzcuYworKysgYi9ib2FyZC9jc2I2MzcvY3NiNjM3LmMKQEAgLTU3LDcgKzU3LDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19EUklWRVJfRVRIRVIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAogLyoKICAqIE5hbWU6CkBAIC03Nyw1ICs3Nyw1IEBACiAJcF9waHlvcHMtPkF1dG9OZWdvdGlhdGUJID0gYmNtNTIyMV9BdXRvTmVnb3RpYXRlOwogfQogCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQgKi8KKyNlbmRpZgogI2VuZGlmCS8qIENPTkZJR19EUklWRVJfRVRIRVIgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL2N1ODI0L3UtYm9vdC5sZHMgYi9ib2FyZC9jdTgyNC91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmU4NWU0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL2N1ODI0L3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjR4L3N0YXJ0Lm8JKC50ZXh0KQotICAgIGxpYl9wcGMvYm9hcmQubyAoLnRleHQpCi0gICAgbGliX3BwYy9wcGNzdHJpbmcubwkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvdnNwcmludGYubwkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvY3JjMzIubwkJKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL3psaWIubwkJKC50ZXh0KQotCi0JCS4gPSBERUZJTkVEKGVudl9vZmZzZXQpID8gZW52X29mZnNldCA6IC47Ci0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8gKC50ZXh0KQotCi0JCSooLnRleHQpCi0KLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotCi0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9kYXZlL1BQQ2hhbWVsZW9uRVZCL25hbmQuYyBiL2JvYXJkL2RhdmUvUFBDaGFtZWxlb25FVkIvbmFuZC5jCmluZGV4IGY1YzNkZDkuLjA5YzBiMDQgMTAwNjQ0Ci0tLSBhL2JvYXJkL2RhdmUvUFBDaGFtZWxlb25FVkIvbmFuZC5jCisrKyBiL2JvYXJkL2RhdmUvUFBDaGFtZWxlb25FVkIvbmFuZC5jCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAKICNpbmNsdWRlIDxuYW5kLmg+CiAKQEAgLTExNSw0ICsxMTUsNCBAQAogCW5hbmQtPm9wdGlvbnMgPSBOQU5EX1NBTVNVTkdfTFBfT1BUSU9OUzsKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9kYXZpbmNpL2R2LWV2bS9NYWtlZmlsZSBiL2JvYXJkL2RhdmluY2kvZHYtZXZtL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDAxMzgKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9kYXZpbmNpL2R2LWV2bS9NYWtlZmlsZQpAQCAtMCwwICsxLDUyIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK0NPQkpTCTo9IGR2X2JvYXJkLm8KK1NPQkpTCTo9IGJvYXJkX2luaXQubworCitTUkNTCTo9ICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKK1NPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSkKKworJChMSUIpOgkkKG9iaikuZGVwZW5kICQoT0JKUykgJChTT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykgJChTT0JKUykKKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46CWNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgKn4gLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRoaXMgaXMgZm9yICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9ib2FyZC9kYXZpbmNpL2R2LWV2bS9ib2FyZF9pbml0LlMgYi9ib2FyZC9kYXZpbmNpL2R2LWV2bS9ib2FyZF9pbml0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkOGFkYwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2RhdmluY2kvZHYtZXZtL2JvYXJkX2luaXQuUwpAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorICoKKyAqIEJvYXJkLXNwZWNpZmljIGxvdyBsZXZlbCBpbml0aWFsaXphdGlvbiBjb2RlLiBDYWxsZWQgYXQgdGhlIHZlcnkgZW5kCisgKiBvZiBjcHUvYXJtOTI2ZWpzL2RhdmluY2kvbG93bGV2ZWxfaW5pdC5TLiBKdXN0IHJldHVybnMgaWYgdGhlcmUgaXMgbm8KKyAqIGluaXRpYWxpemF0aW9uIHJlcXVpcmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworLmdsb2JsCWR2X2JvYXJkX2luaXQKK2R2X2JvYXJkX2luaXQ6CisKKwltb3YJcGMsIGxyCmRpZmYgLS1naXQgYS9ib2FyZC9kYXZpbmNpL2R2LWV2bS9jb25maWcubWsgYi9ib2FyZC9kYXZpbmNpL2R2LWV2bS9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE4OWQwZQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2RhdmluY2kvZHYtZXZtL2NvbmZpZy5tawpAQCAtMCwwICsxLDM5IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMgorIyBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisjIERhdmlkIE11ZWxsZXIsIEVMU09GVCBBRywgPGQubXVlbGxlckBlbHNvZnQuY2g+CisjCisjIChDKSBDb3B5cmlnaHQgMjAwMworIyBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisjIFN3YW1pbmF0aGFuIDxzd2FtaS5peWVyQHRpLmNvbT4KKyMKKyMgRGF2aW5jaSBFVk0gYm9hcmQgKEFSTTkyNUVKUykgY3B1CisjIHNlZSBodHRwOi8vd3d3LnRpLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gVGV4YXMgSW5zdHJ1bWVudHMKKyMKKyMgRGF2aW5jaSBFVk0gaGFzIDEgYmFuayBvZiAyNTYgTUIgRERSIFJBTQorIyBQaHlzaWNhbCBBZGRyZXNzOgorIyA4MDAwJzAwMDAgdG8gOTAwMCcwMDAwCisjCisjIENvcHlyaWdodCAoQykgMjAwNyBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKyMKKyMgVmlzaW9uZWVyaW5nIENvcnAuIFNvbmF0YSBib2FyZCAoQVJNOTI2RUpTKSBjcHUKKyMKKyMgU29uYXRhIGJvYXJkIGhhcyAxIGJhbmsgb2YgMTI4IE1CIEREUiBSQU0KKyMgUGh5c2ljYWwgQWRkcmVzczoKKyMgODAwMCcwMDAwIHRvIDg4MDAnMDAwMAorIworIyBSYXpvcnN0cmVhbSwgTExDLiBTQ0hNT09HSUUgYm9hcmQgKEFSTTkyNkVKUykgY3B1CisjCisjIFNjaG1vb2dpZSBib2FyZCBoYXMgMSBiYW5rIG9mIDEyOCBNQiBERFIgUkFNCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDgwMDAnMDAwMCB0byA4ODAwJzAwMDAKKyMKKyMgTGludXgtS2VybmVsIGlzIGV4cGVjdGVkIHRvIGJlIGF0IDgwMDAnODAwMCwgZW50cnkgODAwMCc4MDAwCisjIChtZW0gYmFzZSArIHJlc2VydmVkKQorIworIyB3ZSBsb2FkIG91cnNlbGYgdG8gODEwOCAnMDAwMAorIworIworCisjUHJvdmlkZSBhdCBsZWFzdCAxNk1CIHNwYWNpbmcgYmV0d2VlbiB1cyBhbmQgdGhlIExpbnV4IEtlcm5lbCBpbWFnZQorVEVYVF9CQVNFID0gMHg4MTA4MDAwMApkaWZmIC0tZ2l0IGEvYm9hcmQvZGF2aW5jaS9kdi1ldm0vZHZfYm9hcmQuYyBiL2JvYXJkL2RhdmluY2kvZHYtZXZtL2R2X2JvYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ5MjVlYwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2RhdmluY2kvZHYtZXZtL2R2X2JvYXJkLmMKQEAgLTAsMCArMSwyMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisgKgorICogUGFydHMgYXJlIHNoYW1lbGVzc2x5IHN0b2xlbiBmcm9tIHZhcmlvdXMgVEkgc291cmNlcywgb3JpZ2luYWwgY29weXJpZ2h0CisgKiBmb2xsb3dzOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGkyYy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvZW1hY19kZWZzLmg+CisKKyNkZWZpbmUgTUFDSF9UWVBFX0RBVklOQ0lfRVZNCQk5MDEKKworZXh0ZXJuIHZvaWQJaTJjX2luaXQoaW50IHNwZWVkLCBpbnQgc2xhdmVhZGRyKTsKK2V4dGVybiB2b2lkCXRpbWVyX2luaXQodm9pZCk7CitleHRlcm4gaW50CWV0aF9od19pbml0KHZvaWQpOworZXh0ZXJuIHBoeV90CXBoeTsKKworCisvKiBXb3JrcyBvbiBBbHdheXMgT24gcG93ZXIgZG9tYWluIG9ubHkgKG5vIFBEIGFyZ3VtZW50KSAqLwordm9pZCBscHNjX29uKHVuc2lnbmVkIGludCBpZCkKK3sKKwlkdl9yZWdfcAltZHN0YXQsIG1kY3RsOworCisJaWYgKGlkID49IERBVklOQ0lfTFBTQ19HRU0pCisJCXJldHVybjsJCQkvKiBEb24ndCB3b3JrIG9uIERTUCBQb3dlciBEb21haW4gKi8KKworCW1kc3RhdCA9IFJFR19QKFBTQ19NRFNUQVRfQkFTRSArIChpZCAqIDQpKTsKKwltZGN0bCA9IFJFR19QKFBTQ19NRENUTF9CQVNFICsgKGlkICogNCkpOworCisJd2hpbGUgKFJFRyhQU0NfUFRTVEFUKSAmIDB4MDEpIHs7fQorCisJaWYgKCgqbWRzdGF0ICYgMHgxZikgPT0gMHgwMykKKwkJcmV0dXJuOwkJCS8qIEFscmVhZHkgb24gYW5kIGVuYWJsZWQgKi8KKworCSptZGN0bCB8PSAweDAzOworCisJLyogU3BlY2lhbCB0cmVhdG1lbnQgZm9yIHNvbWUgbW9kdWxlcyBhcyBmb3Igc3BydWUxNCBwLjcuNC4yICovCisJaWYgKAkoaWQgPT0gREFWSU5DSV9MUFNDX1ZQU1NTTFYpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfRU1BQykgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19FTUFDX1dSQVBQRVIpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfTURJTykgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19VU0IpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfQVRBKSB8fAorCQkoaWQgPT0gREFWSU5DSV9MUFNDX1ZMWU5RKSB8fAorCQkoaWQgPT0gREFWSU5DSV9MUFNDX1VIUEkpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfRERSX0VNSUYpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfQUVNSUYpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfTU1DX1NEKSB8fAorCQkoaWQgPT0gREFWSU5DSV9MUFNDX01FTVNUSUNLKSB8fAorCQkoaWQgPT0gREFWSU5DSV9MUFNDX01jQlNQKSB8fAorCQkoaWQgPT0gREFWSU5DSV9MUFNDX0dQSU8pCisJICAgKQorCSAgIAkqbWRjdGwgfD0gMHgyMDA7CisKKwlSRUcoUFNDX1BUQ01EKSA9IDB4MDE7CisKKwl3aGlsZSAoUkVHKFBTQ19QVFNUQVQpICYgMHgwMykgezt9CisJd2hpbGUgKCgqbWRzdGF0ICYgMHgxZikgIT0gMHgwMykgezt9CS8qIFByb2JhYmx5IGFuIG92ZXJraWxsLi4uICovCit9CisKK3ZvaWQgZHNwX29uKHZvaWQpCit7CisJaW50CWk7CisKKwlpZiAoUkVHKFBTQ19QRFNUQVQxKSAmIDB4MWYpCisJCXJldHVybjsJCQkvKiBBbHJlYWR5IG9uICovCisKKwlSRUcoUFNDX0dCTENUTCkgfD0gMHgwMTsKKwlSRUcoUFNDX1BEQ1RMMSkgfD0gMHgwMTsKKwlSRUcoUFNDX1BEQ1RMMSkgJj0gfjB4MTAwOworCVJFRyhQU0NfTURDVExfQkFTRSArIChEQVZJTkNJX0xQU0NfR0VNICogNCkpIHw9IDB4MDM7CisJUkVHKFBTQ19NRENUTF9CQVNFICsgKERBVklOQ0lfTFBTQ19HRU0gKiA0KSkgJj0gMHhmZmZmZmVmZjsKKwlSRUcoUFNDX01EQ1RMX0JBU0UgKyAoREFWSU5DSV9MUFNDX0lNQ09QICogNCkpIHw9IDB4MDM7CisJUkVHKFBTQ19NRENUTF9CQVNFICsgKERBVklOQ0lfTFBTQ19JTUNPUCAqIDQpKSAmPSAweGZmZmZmZWZmOworCVJFRyhQU0NfUFRDTUQpID0gMHgwMjsKKworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlpZiAoUkVHKFBTQ19FUENQUikgJiAweDAyKQorCQkJYnJlYWs7CisJfQorCisJUkVHKFBTQ19DSFBfU0hSVFNXKSA9IDB4MDE7CisJUkVHKFBTQ19QRENUTDEpIHw9IDB4MTAwOworCVJFRyhQU0NfRVBDQ1IpID0gMHgwMjsKKworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlpZiAoIShSRUcoUFNDX1BUU1RBVCkgJiAweDAyKSkKKwkJCWJyZWFrOworCX0KKworCVJFRyhQU0NfR0JMQ1RMKSAmPSB+MHgxZjsKK30KKworCitpbnQgYm9hcmRfaW5pdCh2b2lkKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisJLyogYXJjaCBudW1iZXIgb2YgdGhlIGJvYXJkICovCisJZ2QtPmJkLT5iaV9hcmNoX251bWJlciA9IE1BQ0hfVFlQRV9EQVZJTkNJX0VWTTsKKworCS8qIGFkZHJlc3Mgb2YgYm9vdCBwYXJhbWV0ZXJzICovCisJZ2QtPmJkLT5iaV9ib290X3BhcmFtcyA9IExJTlVYX0JPT1RfUEFSQU1fQUREUjsKKworCS8qIFdvcmthcm91bmQgZm9yIFRNUzMyMERNNjQ0NiBlcnJhdGEgMS4zLjIyICovCisJUkVHKFBTQ19TSUxWRVJfQlVMTEVUKSA9IDA7CisKKwkvKiBQb3dlciBvbiByZXF1aXJlZCBwZXJpcGhlcmFscyAqLworCWxwc2Nfb24oREFWSU5DSV9MUFNDX0VNQUMpOworCWxwc2Nfb24oREFWSU5DSV9MUFNDX0VNQUNfV1JBUFBFUik7CisJbHBzY19vbihEQVZJTkNJX0xQU0NfTURJTyk7CisJbHBzY19vbihEQVZJTkNJX0xQU0NfSTJDKTsKKwlscHNjX29uKERBVklOQ0lfTFBTQ19VQVJUMCk7CisJbHBzY19vbihEQVZJTkNJX0xQU0NfVElNRVIxKTsKKwlscHNjX29uKERBVklOQ0lfTFBTQ19HUElPKTsKKworCS8qIFBvd2VydXAgdGhlIERTUCAqLworCWRzcF9vbigpOworCisJLyogQnJpbmd1cCBVQVJUMCBvdXQgb2YgcmVzZXQgKi8KKwlSRUcoVUFSVDBfUFdSRU1VX01HTVQpID0gMHgwMDAwZTAwMzsKKworCS8qIEVuYWJsZSBHSU8zLjNWIGNlbGxzIHVzZWQgZm9yIEVNQUMgKi8KKwlSRUcoVkREM1AzVl9QV0ROKSA9IDA7CisKKwkvKiBFbmFibGUgVUFSVDAgTVVYIGxpbmVzICovCisJUkVHKFBJTk1VWDEpIHw9IDE7CisKKwkvKiBFbmFibGUgRU1BQyBhbmQgQUVNSUYgcGlucyAqLworCVJFRyhQSU5NVVgwKSA9IDB4ODAwMDBjMWY7CisKKwkvKiBFbmFibGUgSTJDIHBpbiBNdXggKi8KKwlSRUcoUElOTVVYMSkgfD0gKDEgPDwgNyk7CisKKwkvKiBTZXQgdGhlIEJ1cyBQcmlvcml0eSBSZWdpc3RlciB0byBhcHByb3ByaWF0ZSB2YWx1ZSAqLworCVJFRyhWQlBSKSA9IDB4MjA7CisKKwl0aW1lcl9pbml0KCk7CisKKwlyZXR1cm4oMCk7Cit9CisKK2ludCBtaXNjX2luaXRfciAodm9pZCkKK3sKKwl1X2ludDhfdAl0bXBbMjBdLCBidWZbMTBdOworCWludAkJaSA9IDA7CisJaW50CQljbGsgPSAwOworCisJY2xrID0gKChSRUcoUExMMl9QTExNKSArIDEpICogMjcpIC8gKChSRUcoUExMMl9ESVYyKSAmIDB4MWYpICsgMSk7CisKKwlwcmludGYgKCJBUk0gQ2xvY2sgOiAlZE1IelxuIiwgKChSRUcoUExMMV9QTExNKSArIDEpICogMjcgKSAvIDIpOworCXByaW50ZiAoIkREUiBDbG9jayA6ICVkTUh6XG4iLCAoY2xrIC8gMikpOworCisJLyogU2V0IEV0aGVybmV0IE1BQyBhZGRyZXNzIGZyb20gRUVQUk9NICovCisJaWYgKGkyY19yZWFkKENGR19JMkNfRUVQUk9NX0FERFIsIDB4N2YwMCwgQ0ZHX0kyQ19FRVBST01fQUREUl9MRU4sIGJ1ZiwgNikpIHsKKwkJcHJpbnRmKCJcbkVFUFJPTSBAIDB4JTAyeCByZWFkIEZBSUxFRCEhIVxuIiwgQ0ZHX0kyQ19FRVBST01fQUREUik7CisJfSBlbHNlIHsKKwkJdG1wWzBdID0gMHhmZjsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCXRtcFswXSAmPSBidWZbaV07CisKKwkJaWYgKCh0bXBbMF0gIT0gMHhmZikgJiYgKGdldGVudigiZXRoYWRkciIpID09IE5VTEwpKSB7CisJCQlzcHJpbnRmKChjaGFyICopJnRtcFswXSwgIiUwMmhoeDolMDJoaHg6JTAyaGh4OiUwMmhoeDolMDJoaHg6JTAyaGh4IiwKKwkJCQlidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdLCBidWZbM10sIGJ1Zls0XSwgYnVmWzVdKTsKKwkJCXNldGVudigiZXRoYWRkciIsIChjaGFyICopJnRtcFswXSk7CisJCX0KKwl9CisKKwlpZiAoIWV0aF9od19pbml0KCkpIHsKKwkJcHJpbnRmKCJldGhlcm5ldCBpbml0IGZhaWxlZCFcbiIpOworCX0gZWxzZSB7CisJCXByaW50ZigiRVRIIFBIWSAgIDogJXNcbiIsIHBoeS5uYW1lKTsKKwl9CisKKwlpMmNfcmVhZCAoMHgzOSwgMHgwMCwgMSwgKHVfaW50OF90ICopJmksIDEpOworCisJc2V0ZW52ICgidmlkZW9zdGQiLCAoKGkgICYgMHg4MCkgPyAicGFsIiA6ICJudHNjIikpOworCisJcmV0dXJuKDApOworfQorCitpbnQgZHJhbV9pbml0KHZvaWQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwlnZC0+YmQtPmJpX2RyYW1bMF0uc3RhcnQgPSBQSFlTX1NEUkFNXzE7CisJZ2QtPmJkLT5iaV9kcmFtWzBdLnNpemUgPSBQSFlTX1NEUkFNXzFfU0laRTsKKworCXJldHVybigwKTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL2RhdmluY2kvZHYtZXZtL3UtYm9vdC5sZHMgYi9ib2FyZC9kYXZpbmNpL2R2LWV2bS91LWJvb3QubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMGIyYTIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9kYXZpbmNpL2R2LWV2bS91LWJvb3QubGRzCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfRk9STUFUKCJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIpCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworCS4gPSAweDAwMDAwMDAwOworCS4gPSBBTElHTig0KTsKKwkudGV4dAk6CisJeworCSAgY3B1L2FybTkyNmVqcy9zdGFydC5vCSgudGV4dCkKKwkgICooLnRleHQpCisJfQorCS4gPSBBTElHTig0KTsKKwkucm9kYXRhIDogeyAqKC5yb2RhdGEpIH0KKwkuID0gQUxJR04oNCk7CisJLmRhdGEgOiB7ICooLmRhdGEpIH0KKwkuID0gQUxJR04oNCk7CisJLmdvdCA6IHsgKiguZ290KSB9CisKKwkuID0gLjsKKwlfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOworCS51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9CisJX191X2Jvb3RfY21kX2VuZCA9IC47CisKKwkuID0gQUxJR04oNCk7CisJX19ic3Nfc3RhcnQgPSAuOworCS5ic3MgOiB7ICooLmJzcykgfQorCV9lbmQgPSAuOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvZGF2aW5jaS9zY2htb29naWUvTWFrZWZpbGUgYi9ib2FyZC9kYXZpbmNpL3NjaG1vb2dpZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAwMTM4Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvZGF2aW5jaS9zY2htb29naWUvTWFrZWZpbGUKQEAgLTAsMCArMSw1MiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDEsIDIwMDIKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChCT0FSRCkuYQorCitDT0JKUwk6PSBkdl9ib2FyZC5vCitTT0JKUwk6PSBib2FyZF9pbml0Lm8KKworU1JDUwk6PSAkKFNPQkpTOi5vPS5TKSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChDT0JKUykpCitTT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTT0JKUykpCisKKyQoTElCKToJJChvYmopLmRlcGVuZCAkKE9CSlMpICQoU09CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpICQoU09CSlMpCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOgljbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrICp+IC5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBUaGlzIGlzIGZvciAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYm9hcmQvZGF2aW5jaS9zY2htb29naWUvYm9hcmRfaW5pdC5TIGIvYm9hcmQvZGF2aW5jaS9zY2htb29naWUvYm9hcmRfaW5pdC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZDhhZGMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9kYXZpbmNpL3NjaG1vb2dpZS9ib2FyZF9pbml0LlMKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKyAqCisgKiBCb2FyZC1zcGVjaWZpYyBsb3cgbGV2ZWwgaW5pdGlhbGl6YXRpb24gY29kZS4gQ2FsbGVkIGF0IHRoZSB2ZXJ5IGVuZAorICogb2YgY3B1L2FybTkyNmVqcy9kYXZpbmNpL2xvd2xldmVsX2luaXQuUy4gSnVzdCByZXR1cm5zIGlmIHRoZXJlIGlzIG5vCisgKiBpbml0aWFsaXphdGlvbiByZXF1aXJlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKy5nbG9ibAlkdl9ib2FyZF9pbml0Citkdl9ib2FyZF9pbml0OgorCisJbW92CXBjLCBscgpkaWZmIC0tZ2l0IGEvYm9hcmQvZGF2aW5jaS9zY2htb29naWUvY29uZmlnLm1rIGIvYm9hcmQvZGF2aW5jaS9zY2htb29naWUvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhODlkMGUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9kYXZpbmNpL3NjaG1vb2dpZS9jb25maWcubWsKQEAgLTAsMCArMSwzOSBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDIKKyMgR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorIyBEYXZpZCBNdWVsbGVyLCBFTFNPRlQgQUcsIDxkLm11ZWxsZXJAZWxzb2Z0LmNoPgorIworIyAoQykgQ29weXJpZ2h0IDIwMDMKKyMgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorIyBTd2FtaW5hdGhhbiA8c3dhbWkuaXllckB0aS5jb20+CisjCisjIERhdmluY2kgRVZNIGJvYXJkIChBUk05MjVFSlMpIGNwdQorIyBzZWUgaHR0cDovL3d3dy50aS5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFRleGFzIEluc3RydW1lbnRzCisjCisjIERhdmluY2kgRVZNIGhhcyAxIGJhbmsgb2YgMjU2IE1CIEREUiBSQU0KKyMgUGh5c2ljYWwgQWRkcmVzczoKKyMgODAwMCcwMDAwIHRvIDkwMDAnMDAwMAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisjCisjIFZpc2lvbmVlcmluZyBDb3JwLiBTb25hdGEgYm9hcmQgKEFSTTkyNkVKUykgY3B1CisjCisjIFNvbmF0YSBib2FyZCBoYXMgMSBiYW5rIG9mIDEyOCBNQiBERFIgUkFNCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDgwMDAnMDAwMCB0byA4ODAwJzAwMDAKKyMKKyMgUmF6b3JzdHJlYW0sIExMQy4gU0NITU9PR0lFIGJvYXJkIChBUk05MjZFSlMpIGNwdQorIworIyBTY2htb29naWUgYm9hcmQgaGFzIDEgYmFuayBvZiAxMjggTUIgRERSIFJBTQorIyBQaHlzaWNhbCBBZGRyZXNzOgorIyA4MDAwJzAwMDAgdG8gODgwMCcwMDAwCisjCisjIExpbnV4LUtlcm5lbCBpcyBleHBlY3RlZCB0byBiZSBhdCA4MDAwJzgwMDAsIGVudHJ5IDgwMDAnODAwMAorIyAobWVtIGJhc2UgKyByZXNlcnZlZCkKKyMKKyMgd2UgbG9hZCBvdXJzZWxmIHRvIDgxMDggJzAwMDAKKyMKKyMKKworI1Byb3ZpZGUgYXQgbGVhc3QgMTZNQiBzcGFjaW5nIGJldHdlZW4gdXMgYW5kIHRoZSBMaW51eCBLZXJuZWwgaW1hZ2UKK1RFWFRfQkFTRSA9IDB4ODEwODAwMDAKZGlmZiAtLWdpdCBhL2JvYXJkL2RhdmluY2kvc2NobW9vZ2llL2R2X2JvYXJkLmMgYi9ib2FyZC9kYXZpbmNpL3NjaG1vb2dpZS9kdl9ib2FyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNWM1ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9kYXZpbmNpL3NjaG1vb2dpZS9kdl9ib2FyZC5jCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorICoKKyAqIFBhcnRzIGFyZSBzaGFtZWxlc3NseSBzdG9sZW4gZnJvbSB2YXJpb3VzIFRJIHNvdXJjZXMsIG9yaWdpbmFsIGNvcHlyaWdodAorICogZm9sbG93czoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IFRleGFzIEluc3RydW1lbnRzLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxpMmMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2VtYWNfZGVmcy5oPgorCisjZGVmaW5lIE1BQ0hfVFlQRV9TQ0hNT09HSUUJCTEyNTUKKworZXh0ZXJuIHZvaWQJaTJjX2luaXQoaW50IHNwZWVkLCBpbnQgc2xhdmVhZGRyKTsKK2V4dGVybiB2b2lkCXRpbWVyX2luaXQodm9pZCk7CitleHRlcm4gaW50CWV0aF9od19pbml0KHZvaWQpOworZXh0ZXJuIHBoeV90CXBoeTsKKworCisvKiBXb3JrcyBvbiBBbHdheXMgT24gcG93ZXIgZG9tYWluIG9ubHkgKG5vIFBEIGFyZ3VtZW50KSAqLwordm9pZCBscHNjX29uKHVuc2lnbmVkIGludCBpZCkKK3sKKwlkdl9yZWdfcAltZHN0YXQsIG1kY3RsOworCisJaWYgKGlkID49IERBVklOQ0lfTFBTQ19HRU0pCisJCXJldHVybjsJCQkvKiBEb24ndCB3b3JrIG9uIERTUCBQb3dlciBEb21haW4gKi8KKworCW1kc3RhdCA9IFJFR19QKFBTQ19NRFNUQVRfQkFTRSArIChpZCAqIDQpKTsKKwltZGN0bCA9IFJFR19QKFBTQ19NRENUTF9CQVNFICsgKGlkICogNCkpOworCisJd2hpbGUgKFJFRyhQU0NfUFRTVEFUKSAmIDB4MDEpIHs7fQorCisJaWYgKCgqbWRzdGF0ICYgMHgxZikgPT0gMHgwMykKKwkJcmV0dXJuOwkJCS8qIEFscmVhZHkgb24gYW5kIGVuYWJsZWQgKi8KKworCSptZGN0bCB8PSAweDAzOworCisJLyogU3BlY2lhbCB0cmVhdG1lbnQgZm9yIHNvbWUgbW9kdWxlcyBhcyBmb3Igc3BydWUxNCBwLjcuNC4yICovCisJaWYgKAkoaWQgPT0gREFWSU5DSV9MUFNDX1ZQU1NTTFYpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfRU1BQykgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19FTUFDX1dSQVBQRVIpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfTURJTykgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19VU0IpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfQVRBKSB8fAorCQkoaWQgPT0gREFWSU5DSV9MUFNDX1ZMWU5RKSB8fAorCQkoaWQgPT0gREFWSU5DSV9MUFNDX1VIUEkpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfRERSX0VNSUYpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfQUVNSUYpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfTU1DX1NEKSB8fAorCQkoaWQgPT0gREFWSU5DSV9MUFNDX01FTVNUSUNLKSB8fAorCQkoaWQgPT0gREFWSU5DSV9MUFNDX01jQlNQKSB8fAorCQkoaWQgPT0gREFWSU5DSV9MUFNDX0dQSU8pCisJICAgKQorCSAgIAkqbWRjdGwgfD0gMHgyMDA7CisKKwlSRUcoUFNDX1BUQ01EKSA9IDB4MDE7CisKKwl3aGlsZSAoUkVHKFBTQ19QVFNUQVQpICYgMHgwMykgezt9CisJd2hpbGUgKCgqbWRzdGF0ICYgMHgxZikgIT0gMHgwMykgezt9CS8qIFByb2JhYmx5IGFuIG92ZXJraWxsLi4uICovCit9CisKK3ZvaWQgZHNwX29uKHZvaWQpCit7CisJaW50CWk7CisKKwlpZiAoUkVHKFBTQ19QRFNUQVQxKSAmIDB4MWYpCisJCXJldHVybjsJCQkvKiBBbHJlYWR5IG9uICovCisKKwlSRUcoUFNDX0dCTENUTCkgfD0gMHgwMTsKKwlSRUcoUFNDX1BEQ1RMMSkgfD0gMHgwMTsKKwlSRUcoUFNDX1BEQ1RMMSkgJj0gfjB4MTAwOworCVJFRyhQU0NfTURDVExfQkFTRSArIChEQVZJTkNJX0xQU0NfR0VNICogNCkpIHw9IDB4MDM7CisJUkVHKFBTQ19NRENUTF9CQVNFICsgKERBVklOQ0lfTFBTQ19HRU0gKiA0KSkgJj0gMHhmZmZmZmVmZjsKKwlSRUcoUFNDX01EQ1RMX0JBU0UgKyAoREFWSU5DSV9MUFNDX0lNQ09QICogNCkpIHw9IDB4MDM7CisJUkVHKFBTQ19NRENUTF9CQVNFICsgKERBVklOQ0lfTFBTQ19JTUNPUCAqIDQpKSAmPSAweGZmZmZmZWZmOworCVJFRyhQU0NfUFRDTUQpID0gMHgwMjsKKworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlpZiAoUkVHKFBTQ19FUENQUikgJiAweDAyKQorCQkJYnJlYWs7CisJfQorCisJUkVHKFBTQ19DSFBfU0hSVFNXKSA9IDB4MDE7CisJUkVHKFBTQ19QRENUTDEpIHw9IDB4MTAwOworCVJFRyhQU0NfRVBDQ1IpID0gMHgwMjsKKworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlpZiAoIShSRUcoUFNDX1BUU1RBVCkgJiAweDAyKSkKKwkJCWJyZWFrOworCX0KKworCVJFRyhQU0NfR0JMQ1RMKSAmPSB+MHgxZjsKK30KKworCitpbnQgYm9hcmRfaW5pdCh2b2lkKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisJLyogYXJjaCBudW1iZXIgb2YgdGhlIGJvYXJkICovCisJZ2QtPmJkLT5iaV9hcmNoX251bWJlciA9IE1BQ0hfVFlQRV9TQ0hNT09HSUU7CisKKwkvKiBhZGRyZXNzIG9mIGJvb3QgcGFyYW1ldGVycyAqLworCWdkLT5iZC0+YmlfYm9vdF9wYXJhbXMgPSBMSU5VWF9CT09UX1BBUkFNX0FERFI7CisKKwkvKiBXb3JrYXJvdW5kIGZvciBUTVMzMjBETTY0NDYgZXJyYXRhIDEuMy4yMiAqLworCVJFRyhQU0NfU0lMVkVSX0JVTExFVCkgPSAwOworCisJLyogUG93ZXIgb24gcmVxdWlyZWQgcGVyaXBoZXJhbHMgKi8KKwlscHNjX29uKERBVklOQ0lfTFBTQ19FTUFDKTsKKwlscHNjX29uKERBVklOQ0lfTFBTQ19FTUFDX1dSQVBQRVIpOworCWxwc2Nfb24oREFWSU5DSV9MUFNDX01ESU8pOworCWxwc2Nfb24oREFWSU5DSV9MUFNDX0kyQyk7CisJbHBzY19vbihEQVZJTkNJX0xQU0NfVUFSVDApOworCWxwc2Nfb24oREFWSU5DSV9MUFNDX1RJTUVSMSk7CisJbHBzY19vbihEQVZJTkNJX0xQU0NfR1BJTyk7CisKKwkvKiBQb3dlcnVwIHRoZSBEU1AgKi8KKwlkc3Bfb24oKTsKKworCS8qIEJyaW5ndXAgVUFSVDAgb3V0IG9mIHJlc2V0ICovCisJUkVHKFVBUlQwX1BXUkVNVV9NR01UKSA9IDB4MDAwMGUwMDM7CisKKwkvKiBFbmFibGUgR0lPMy4zViBjZWxscyB1c2VkIGZvciBFTUFDICovCisJUkVHKFZERDNQM1ZfUFdETikgPSAwOworCisJLyogRW5hYmxlIFVBUlQwIE1VWCBsaW5lcyAqLworCVJFRyhQSU5NVVgxKSB8PSAxOworCisJLyogRW5hYmxlIEVNQUMgYW5kIEFFTUlGIHBpbnMgKi8KKwlSRUcoUElOTVVYMCkgPSAweDgwMDAwYzFmOworCisJLyogRW5hYmxlIEkyQyBwaW4gTXV4ICovCisJUkVHKFBJTk1VWDEpIHw9ICgxIDw8IDcpOworCisJLyogU2V0IHRoZSBCdXMgUHJpb3JpdHkgUmVnaXN0ZXIgdG8gYXBwcm9wcmlhdGUgdmFsdWUgKi8KKwlSRUcoVkJQUikgPSAweDIwOworCisJdGltZXJfaW5pdCgpOworCisJcmV0dXJuKDApOworfQorCitpbnQgbWlzY19pbml0X3IgKHZvaWQpCit7CisJdV9pbnQ4X3QJdG1wWzIwXSwgYnVmWzEwXTsKKwlpbnQJCWkgPSAwOworCWludAkJY2xrID0gMDsKKworCS8qIFNldCBzZXJpYWwgbnVtYmVyIGZyb20gVUlEIGNoaXAgKi8KKwl1X2ludDhfdAljcmNfdGJsWzI1Nl0gPSB7CisJCQkweDAwLCAweDVlLCAweGJjLCAweGUyLCAweDYxLCAweDNmLCAweGRkLCAweDgzLAorCQkJMHhjMiwgMHg5YywgMHg3ZSwgMHgyMCwgMHhhMywgMHhmZCwgMHgxZiwgMHg0MSwKKwkJCTB4OWQsIDB4YzMsIDB4MjEsIDB4N2YsIDB4ZmMsIDB4YTIsIDB4NDAsIDB4MWUsCisJCQkweDVmLCAweDAxLCAweGUzLCAweGJkLCAweDNlLCAweDYwLCAweDgyLCAweGRjLAorCQkJMHgyMywgMHg3ZCwgMHg5ZiwgMHhjMSwgMHg0MiwgMHgxYywgMHhmZSwgMHhhMCwKKwkJCTB4ZTEsIDB4YmYsIDB4NWQsIDB4MDMsIDB4ODAsIDB4ZGUsIDB4M2MsIDB4NjIsCisJCQkweGJlLCAweGUwLCAweDAyLCAweDVjLCAweGRmLCAweDgxLCAweDYzLCAweDNkLAorCQkJMHg3YywgMHgyMiwgMHhjMCwgMHg5ZSwgMHgxZCwgMHg0MywgMHhhMSwgMHhmZiwKKwkJCTB4NDYsIDB4MTgsIDB4ZmEsIDB4YTQsIDB4MjcsIDB4NzksIDB4OWIsIDB4YzUsCisJCQkweDg0LCAweGRhLCAweDM4LCAweDY2LCAweGU1LCAweGJiLCAweDU5LCAweDA3LAorCQkJMHhkYiwgMHg4NSwgMHg2NywgMHgzOSwgMHhiYSwgMHhlNCwgMHgwNiwgMHg1OCwKKwkJCTB4MTksIDB4NDcsIDB4YTUsIDB4ZmIsIDB4NzgsIDB4MjYsIDB4YzQsIDB4OWEsCisJCQkweDY1LCAweDNiLCAweGQ5LCAweDg3LCAweDA0LCAweDVhLCAweGI4LCAweGU2LAorCQkJMHhhNywgMHhmOSwgMHgxYiwgMHg0NSwgMHhjNiwgMHg5OCwgMHg3YSwgMHgyNCwKKwkJCTB4ZjgsIDB4YTYsIDB4NDQsIDB4MWEsIDB4OTksIDB4YzcsIDB4MjUsIDB4N2IsCisJCQkweDNhLCAweDY0LCAweDg2LCAweGQ4LCAweDViLCAweDA1LCAweGU3LCAweGI5LAorCQkJMHg4YywgMHhkMiwgMHgzMCwgMHg2ZSwgMHhlZCwgMHhiMywgMHg1MSwgMHgwZiwKKwkJCTB4NGUsIDB4MTAsIDB4ZjIsIDB4YWMsIDB4MmYsIDB4NzEsIDB4OTMsIDB4Y2QsCisJCQkweDExLCAweDRmLCAweGFkLCAweGYzLCAweDcwLCAweDJlLCAweGNjLCAweDkyLAorCQkJMHhkMywgMHg4ZCwgMHg2ZiwgMHgzMSwgMHhiMiwgMHhlYywgMHgwZSwgMHg1MCwKKwkJCTB4YWYsIDB4ZjEsIDB4MTMsIDB4NGQsIDB4Y2UsIDB4OTAsIDB4NzIsIDB4MmMsCisJCQkweDZkLCAweDMzLCAweGQxLCAweDhmLCAweDBjLCAweDUyLCAweGIwLCAweGVlLAorCQkJMHgzMiwgMHg2YywgMHg4ZSwgMHhkMCwgMHg1MywgMHgwZCwgMHhlZiwgMHhiMSwKKwkJCTB4ZjAsIDB4YWUsIDB4NGMsIDB4MTIsIDB4OTEsIDB4Y2YsIDB4MmQsIDB4NzMsCisJCQkweGNhLCAweDk0LCAweDc2LCAweDI4LCAweGFiLCAweGY1LCAweDE3LCAweDQ5LAorCQkJMHgwOCwgMHg1NiwgMHhiNCwgMHhlYSwgMHg2OSwgMHgzNywgMHhkNSwgMHg4YiwKKwkJCTB4NTcsIDB4MDksIDB4ZWIsIDB4YjUsIDB4MzYsIDB4NjgsIDB4OGEsIDB4ZDQsCisJCQkweDk1LCAweGNiLCAweDI5LCAweDc3LCAweGY0LCAweGFhLCAweDQ4LCAweDE2LAorCQkJMHhlOSwgMHhiNywgMHg1NSwgMHgwYiwgMHg4OCwgMHhkNiwgMHgzNCwgMHg2YSwKKwkJCTB4MmIsIDB4NzUsIDB4OTcsIDB4YzksIDB4NGEsIDB4MTQsIDB4ZjYsIDB4YTgsCisJCQkweDc0LCAweDJhLCAweGM4LCAweDk2LCAweDE1LCAweDRiLCAweGE5LCAweGY3LAorCQkJMHhiNiwgMHhlOCwgMHgwYSwgMHg1NCwgMHhkNywgMHg4OSwgMHg2YiwgMHgzNQorCQl9OworCisJY2xrID0gKChSRUcoUExMMl9QTExNKSArIDEpICogMjcpIC8gKChSRUcoUExMMl9ESVYyKSAmIDB4MWYpICsgMSk7CisKKwlwcmludGYgKCJBUk0gQ2xvY2sgOiAlZE1IelxuIiwgKChSRUcoUExMMV9QTExNKSArIDEpICogMjcgKSAvIDIpOworCXByaW50ZiAoIkREUiBDbG9jayA6ICVkTUh6XG4iLCAoY2xrIC8gMikpOworCisJLyogU2V0IHNlcmlhbCBudW1iZXIgZnJvbSBVSUQgY2hpcCAqLworCWlmIChpMmNfcmVhZChDRkdfVUlEX0FERFIsIDAsIDEsIGJ1ZiwgOCkpIHsKKwkJcHJpbnRmKCJcblVJRCBAIDB4JTAyeCByZWFkIEZBSUxFRCEhIVxuIiwgQ0ZHX1VJRF9BRERSKTsKKwkJZm9yY2VlbnYoInNlcmlhbCMiLCAiRkFJTEVEIik7CisJfSBlbHNlIHsKKwkJaWYgKGJ1ZlswXSAhPSAweDcwKSB7CS8qIERldmljZSBGYW1pbHkgQ29kZSAqLworCQkJcHJpbnRmKCJcblVJRCBAIDB4JTAyeCByZWFkIEZBSUxFRCEhIVxuIiwgQ0ZHX1VJRF9BRERSKTsKKwkJCWZvcmNlZW52KCJzZXJpYWwjIiwgIkZBSUxFRCIpOworCQl9CisJfQorCS8qIE5vdyBjaGVjayBDUkMgKi8KKwl0bXBbMF0gPSAwOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCXRtcFswXSA9IGNyY190YmxbdG1wWzBdIF4gYnVmW2ldXTsKKworCWlmICh0bXBbMF0gIT0gMCkgeworCQlwcmludGYoIlxuVUlEIEAgMHglMDJ4IC0gQkFEIENSQyEhIVxuIiwgQ0ZHX1VJRF9BRERSKTsKKwkJZm9yY2VlbnYoInNlcmlhbCMiLCAiRkFJTEVEIik7CisJfSBlbHNlIHsKKwkJLyogQ1JDIE9LLCBzZXQgInNlcmlhbCIgZW52IHZhcmlhYmxlICovCisJCXNwcmludGYoKGNoYXIgKikmdG1wWzBdLCAiJTAyaGh4JTAyaGh4JTAyaGh4JTAyaGh4JTAyaGh4JTAyaGh4IiwKKwkJCWJ1Zls2XSwgYnVmWzVdLCBidWZbNF0sIGJ1ZlszXSwgYnVmWzJdLCBidWZbMV0pOworCQlmb3JjZWVudigic2VyaWFsIyIsIChjaGFyICopJnRtcFswXSk7CisJfQorCisJaWYgKCFldGhfaHdfaW5pdCgpKSB7CisJCXByaW50ZigiZXRoZXJuZXQgaW5pdCBmYWlsZWQhXG4iKTsKKwl9IGVsc2UgeworCQlwcmludGYoIkVUSCBQSFkgICA6ICVzXG4iLCBwaHkubmFtZSk7CisJfQorCisJcmV0dXJuKDApOworfQorCitpbnQgZHJhbV9pbml0KHZvaWQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwlnZC0+YmQtPmJpX2RyYW1bMF0uc3RhcnQgPSBQSFlTX1NEUkFNXzE7CisJZ2QtPmJkLT5iaV9kcmFtWzBdLnNpemUgPSBQSFlTX1NEUkFNXzFfU0laRTsKKworCXJldHVybigwKTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL2RhdmluY2kvc2NobW9vZ2llL3UtYm9vdC5sZHMgYi9ib2FyZC9kYXZpbmNpL3NjaG1vb2dpZS91LWJvb3QubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMGIyYTIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9kYXZpbmNpL3NjaG1vb2dpZS91LWJvb3QubGRzCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfRk9STUFUKCJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIpCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworCS4gPSAweDAwMDAwMDAwOworCS4gPSBBTElHTig0KTsKKwkudGV4dAk6CisJeworCSAgY3B1L2FybTkyNmVqcy9zdGFydC5vCSgudGV4dCkKKwkgICooLnRleHQpCisJfQorCS4gPSBBTElHTig0KTsKKwkucm9kYXRhIDogeyAqKC5yb2RhdGEpIH0KKwkuID0gQUxJR04oNCk7CisJLmRhdGEgOiB7ICooLmRhdGEpIH0KKwkuID0gQUxJR04oNCk7CisJLmdvdCA6IHsgKiguZ290KSB9CisKKwkuID0gLjsKKwlfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOworCS51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9CisJX191X2Jvb3RfY21kX2VuZCA9IC47CisKKwkuID0gQUxJR04oNCk7CisJX19ic3Nfc3RhcnQgPSAuOworCS5ic3MgOiB7ICooLmJzcykgfQorCV9lbmQgPSAuOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvZGF2aW5jaS9zb25hdGEvTWFrZWZpbGUgYi9ib2FyZC9kYXZpbmNpL3NvbmF0YS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAwMTM4Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvZGF2aW5jaS9zb25hdGEvTWFrZWZpbGUKQEAgLTAsMCArMSw1MiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDEsIDIwMDIKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChCT0FSRCkuYQorCitDT0JKUwk6PSBkdl9ib2FyZC5vCitTT0JKUwk6PSBib2FyZF9pbml0Lm8KKworU1JDUwk6PSAkKFNPQkpTOi5vPS5TKSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChDT0JKUykpCitTT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTT0JKUykpCisKKyQoTElCKToJJChvYmopLmRlcGVuZCAkKE9CSlMpICQoU09CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpICQoU09CSlMpCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOgljbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrICp+IC5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBUaGlzIGlzIGZvciAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYm9hcmQvZGF2aW5jaS9zb25hdGEvYm9hcmRfaW5pdC5TIGIvYm9hcmQvZGF2aW5jaS9zb25hdGEvYm9hcmRfaW5pdC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYjllYTcKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9kYXZpbmNpL3NvbmF0YS9ib2FyZF9pbml0LlMKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisgKgorICogQm9hcmQtc3BlY2lmaWMgbG93IGxldmVsIGluaXRpYWxpemF0aW9uIGNvZGUuIENhbGxlZCBhdCB0aGUgdmVyeSBlbmQKKyAqIG9mIGNwdS9hcm05MjZlanMvZGF2aW5jaS9sb3dsZXZlbF9pbml0LlMuIEp1c3QgcmV0dXJucyBpZiB0aGVyZSBpcyBubworICogaW5pdGlhbGl6YXRpb24gcmVxdWlyZWQuCisgKgorICogRm9yIF9PTERFUl8gU29uYXRhIGJvYXJkcyBzZXRzIHVwIEdQSU80IHRvIGNvbnRyb2wgTkFORCBXUCBsaW5lLiBOZXdlcgorICogU29uYXRhIGJvYXJkcywgQUZBSUssIGRvbid0IHVzZSB0aGlzIHNvIGl0J3MganVzdCByZXR1cm4gYnkgZGVmYXVsdC4gQXNrCisgKiBWaXNpb25lZXJpbmcgaWYgdGhleSByZWludmVudGVkIHRoZSB3aGVlbCBvbmNlIGFnYWluIHRvIG1ha2Ugc3VyZSA6KQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworLmdsb2JsCWR2X2JvYXJkX2luaXQKK2R2X2JvYXJkX2luaXQ6CisjaWZkZWYgU09OQVRBX0JPQVJEX0dQSU9XUAorCS8qIFNldCBQSU5NVVgwIHRvIGVuYWJsZSBHUElPNCAqLworCWxkcglyMCwgX1BJTk1VWDAKKwlsZHIJcjEsIEdQSU80X0VOX01BU0sKKwlsZHIJcjIsIFtyMF0KKwlhbmQJcjIsIHIyLCByMQorCXN0cglyMiwgW3IwXQorCisJLyogRW5hYmxlIEdQSU8gTFBTQyBtb2R1bGUgKi8KKwlsZHIJcjAsIFBUU1RBVAorCitncGlvX3B0c3RhdF9sb29wMToKKwlsZHIJcjIsIFtyMF0KKwl0c3QJcjIsICQweDAwMDAwMDAxCisJYm5lCWdwaW9fcHRzdGF0X2xvb3AxCisKKwlsZHIJcjEsIE1EQ1RMX0dQSU8KKwlsZHIJcjIsIFtyMV0KKwlhbmQJcjIsIHIyLCAkMHhmZmZmZmZmOAorCW9ycglyMiwgcjIsICQweDAwMDAwMDAzCisJc3RyCXIyLCBbcjFdCisKKwlvcnIJcjIsIHIyLCAkMHgwMDAwMDIwMAorCXN0cglyMiwgW3IxXQorCisJbGRyCXIxLCBQVENNRAorCW1vdglyMiwgJDB4MDAwMDAwMDEKKwlzdHIJcjIsIFtyMV0KKworZ3Bpb19wdHN0YXRfbG9vcDI6CisJbGRyCXIyLCBbcjBdCisJdHN0CXIyLCAkMHgwMDAwMDAwMQorCWJuZQlncGlvX3B0c3RhdF9sb29wMgorCisJbGRyCXIwLCBNRFNUQVRfR1BJTworZ3Bpb19tZHN0YXRfbG9vcDoKKwlsZHIJcjIsIFtyMF0KKwlhbmQJcjIsIHIyLCAkMHgwMDAwMDAxZgorCXRlcQlyMiwgJDB4MDAwMDAwMDMKKwlibmUJZ3Bpb19tZHN0YXRfbG9vcAorCisJLyogR1BJTzQgLT4gb3V0cHV0ICovCisJbGRyCXIwLCBHUElPX0RJUjAxCisJbW92CXIxLCAkMHgxMAorCWxkcglyMiwgW3IwXQorCWJpYwlyMiwgcjIsIHIwCisJc3RyCXIyLCBbcjBdCisKKwkvKiBTZXQgaXQgdG8gMCAoV3JpdGUgUHJvdGVjdCkgKi8KKwlsZHIJcjAsIEdQSU9fQ0xSX0RBVEEwMQorCXN0cglyMSwgW3IwXQorI2VuZGlmCisKKwltb3YJcGMsIGxyCisKKyNpZmRlZiBTT05BVEFfQk9BUkRfR1BJT1dQCisubHRvcmcKKworR1BJTzRfRU5fTUFTSzoKKwkud29yZAkweGY3N2ZmZmZmCitNRENUTF9HUElPOgorCS53b3JkCTB4MDFjNDFhNjgKK01EU1RBVF9HUElPOgorCS53b3JkCTB4MDFjNDE4NjgKK0dQSU9fRElSMDE6CisJLndvcmQJMHgwMWM2NzAxMAorR1BJT19DTFJfREFUQTAxOgorCS53b3JkCTB4MDFjNjcwMWMKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvZGF2aW5jaS9zb25hdGEvY29uZmlnLm1rIGIvYm9hcmQvZGF2aW5jaS9zb25hdGEvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhODlkMGUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9kYXZpbmNpL3NvbmF0YS9jb25maWcubWsKQEAgLTAsMCArMSwzOSBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDIKKyMgR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorIyBEYXZpZCBNdWVsbGVyLCBFTFNPRlQgQUcsIDxkLm11ZWxsZXJAZWxzb2Z0LmNoPgorIworIyAoQykgQ29weXJpZ2h0IDIwMDMKKyMgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorIyBTd2FtaW5hdGhhbiA8c3dhbWkuaXllckB0aS5jb20+CisjCisjIERhdmluY2kgRVZNIGJvYXJkIChBUk05MjVFSlMpIGNwdQorIyBzZWUgaHR0cDovL3d3dy50aS5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFRleGFzIEluc3RydW1lbnRzCisjCisjIERhdmluY2kgRVZNIGhhcyAxIGJhbmsgb2YgMjU2IE1CIEREUiBSQU0KKyMgUGh5c2ljYWwgQWRkcmVzczoKKyMgODAwMCcwMDAwIHRvIDkwMDAnMDAwMAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisjCisjIFZpc2lvbmVlcmluZyBDb3JwLiBTb25hdGEgYm9hcmQgKEFSTTkyNkVKUykgY3B1CisjCisjIFNvbmF0YSBib2FyZCBoYXMgMSBiYW5rIG9mIDEyOCBNQiBERFIgUkFNCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDgwMDAnMDAwMCB0byA4ODAwJzAwMDAKKyMKKyMgUmF6b3JzdHJlYW0sIExMQy4gU0NITU9PR0lFIGJvYXJkIChBUk05MjZFSlMpIGNwdQorIworIyBTY2htb29naWUgYm9hcmQgaGFzIDEgYmFuayBvZiAxMjggTUIgRERSIFJBTQorIyBQaHlzaWNhbCBBZGRyZXNzOgorIyA4MDAwJzAwMDAgdG8gODgwMCcwMDAwCisjCisjIExpbnV4LUtlcm5lbCBpcyBleHBlY3RlZCB0byBiZSBhdCA4MDAwJzgwMDAsIGVudHJ5IDgwMDAnODAwMAorIyAobWVtIGJhc2UgKyByZXNlcnZlZCkKKyMKKyMgd2UgbG9hZCBvdXJzZWxmIHRvIDgxMDggJzAwMDAKKyMKKyMKKworI1Byb3ZpZGUgYXQgbGVhc3QgMTZNQiBzcGFjaW5nIGJldHdlZW4gdXMgYW5kIHRoZSBMaW51eCBLZXJuZWwgaW1hZ2UKK1RFWFRfQkFTRSA9IDB4ODEwODAwMDAKZGlmZiAtLWdpdCBhL2JvYXJkL2RhdmluY2kvc29uYXRhL2R2X2JvYXJkLmMgYi9ib2FyZC9kYXZpbmNpL3NvbmF0YS9kdl9ib2FyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMGE0NTkKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9kYXZpbmNpL3NvbmF0YS9kdl9ib2FyZC5jCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorICoKKyAqIFBhcnRzIGFyZSBzaGFtZWxlc3NseSBzdG9sZW4gZnJvbSB2YXJpb3VzIFRJIHNvdXJjZXMsIG9yaWdpbmFsIGNvcHlyaWdodAorICogZm9sbG93czoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IFRleGFzIEluc3RydW1lbnRzLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxpMmMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2VtYWNfZGVmcy5oPgorCisjZGVmaW5lIE1BQ0hfVFlQRV9TT05BVEEJCTEyNTQKKworZXh0ZXJuIHZvaWQJaTJjX2luaXQoaW50IHNwZWVkLCBpbnQgc2xhdmVhZGRyKTsKK2V4dGVybiB2b2lkCXRpbWVyX2luaXQodm9pZCk7CitleHRlcm4gaW50CWV0aF9od19pbml0KHZvaWQpOworZXh0ZXJuIHBoeV90CXBoeTsKKworCisvKiBXb3JrcyBvbiBBbHdheXMgT24gcG93ZXIgZG9tYWluIG9ubHkgKG5vIFBEIGFyZ3VtZW50KSAqLwordm9pZCBscHNjX29uKHVuc2lnbmVkIGludCBpZCkKK3sKKwlkdl9yZWdfcAltZHN0YXQsIG1kY3RsOworCisJaWYgKGlkID49IERBVklOQ0lfTFBTQ19HRU0pCisJCXJldHVybjsJCQkvKiBEb24ndCB3b3JrIG9uIERTUCBQb3dlciBEb21haW4gKi8KKworCW1kc3RhdCA9IFJFR19QKFBTQ19NRFNUQVRfQkFTRSArIChpZCAqIDQpKTsKKwltZGN0bCA9IFJFR19QKFBTQ19NRENUTF9CQVNFICsgKGlkICogNCkpOworCisJd2hpbGUgKFJFRyhQU0NfUFRTVEFUKSAmIDB4MDEpIHs7fQorCisJaWYgKCgqbWRzdGF0ICYgMHgxZikgPT0gMHgwMykKKwkJcmV0dXJuOwkJCS8qIEFscmVhZHkgb24gYW5kIGVuYWJsZWQgKi8KKworCSptZGN0bCB8PSAweDAzOworCisJLyogU3BlY2lhbCB0cmVhdG1lbnQgZm9yIHNvbWUgbW9kdWxlcyBhcyBmb3Igc3BydWUxNCBwLjcuNC4yICovCisJaWYgKAkoaWQgPT0gREFWSU5DSV9MUFNDX1ZQU1NTTFYpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfRU1BQykgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19FTUFDX1dSQVBQRVIpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfTURJTykgfHwKKwkJKGlkID09IERBVklOQ0lfTFBTQ19VU0IpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfQVRBKSB8fAorCQkoaWQgPT0gREFWSU5DSV9MUFNDX1ZMWU5RKSB8fAorCQkoaWQgPT0gREFWSU5DSV9MUFNDX1VIUEkpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfRERSX0VNSUYpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfQUVNSUYpIHx8CisJCShpZCA9PSBEQVZJTkNJX0xQU0NfTU1DX1NEKSB8fAorCQkoaWQgPT0gREFWSU5DSV9MUFNDX01FTVNUSUNLKSB8fAorCQkoaWQgPT0gREFWSU5DSV9MUFNDX01jQlNQKSB8fAorCQkoaWQgPT0gREFWSU5DSV9MUFNDX0dQSU8pCisJICAgKQorCSAgIAkqbWRjdGwgfD0gMHgyMDA7CisKKwlSRUcoUFNDX1BUQ01EKSA9IDB4MDE7CisKKwl3aGlsZSAoUkVHKFBTQ19QVFNUQVQpICYgMHgwMykgezt9CisJd2hpbGUgKCgqbWRzdGF0ICYgMHgxZikgIT0gMHgwMykgezt9CS8qIFByb2JhYmx5IGFuIG92ZXJraWxsLi4uICovCit9CisKK3ZvaWQgZHNwX29uKHZvaWQpCit7CisJaW50CWk7CisKKwlpZiAoUkVHKFBTQ19QRFNUQVQxKSAmIDB4MWYpCisJCXJldHVybjsJCQkvKiBBbHJlYWR5IG9uICovCisKKwlSRUcoUFNDX0dCTENUTCkgfD0gMHgwMTsKKwlSRUcoUFNDX1BEQ1RMMSkgfD0gMHgwMTsKKwlSRUcoUFNDX1BEQ1RMMSkgJj0gfjB4MTAwOworCVJFRyhQU0NfTURDVExfQkFTRSArIChEQVZJTkNJX0xQU0NfR0VNICogNCkpIHw9IDB4MDM7CisJUkVHKFBTQ19NRENUTF9CQVNFICsgKERBVklOQ0lfTFBTQ19HRU0gKiA0KSkgJj0gMHhmZmZmZmVmZjsKKwlSRUcoUFNDX01EQ1RMX0JBU0UgKyAoREFWSU5DSV9MUFNDX0lNQ09QICogNCkpIHw9IDB4MDM7CisJUkVHKFBTQ19NRENUTF9CQVNFICsgKERBVklOQ0lfTFBTQ19JTUNPUCAqIDQpKSAmPSAweGZmZmZmZWZmOworCVJFRyhQU0NfUFRDTUQpID0gMHgwMjsKKworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlpZiAoUkVHKFBTQ19FUENQUikgJiAweDAyKQorCQkJYnJlYWs7CisJfQorCisJUkVHKFBTQ19DSFBfU0hSVFNXKSA9IDB4MDE7CisJUkVHKFBTQ19QRENUTDEpIHw9IDB4MTAwOworCVJFRyhQU0NfRVBDQ1IpID0gMHgwMjsKKworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlpZiAoIShSRUcoUFNDX1BUU1RBVCkgJiAweDAyKSkKKwkJCWJyZWFrOworCX0KKworCVJFRyhQU0NfR0JMQ1RMKSAmPSB+MHgxZjsKK30KKworCitpbnQgYm9hcmRfaW5pdCh2b2lkKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisJLyogYXJjaCBudW1iZXIgb2YgdGhlIGJvYXJkICovCisJZ2QtPmJkLT5iaV9hcmNoX251bWJlciA9IE1BQ0hfVFlQRV9TT05BVEE7CisKKwkvKiBhZGRyZXNzIG9mIGJvb3QgcGFyYW1ldGVycyAqLworCWdkLT5iZC0+YmlfYm9vdF9wYXJhbXMgPSBMSU5VWF9CT09UX1BBUkFNX0FERFI7CisKKwkvKiBXb3JrYXJvdW5kIGZvciBUTVMzMjBETTY0NDYgZXJyYXRhIDEuMy4yMiAqLworCVJFRyhQU0NfU0lMVkVSX0JVTExFVCkgPSAwOworCisJLyogUG93ZXIgb24gcmVxdWlyZWQgcGVyaXBoZXJhbHMgKi8KKwlscHNjX29uKERBVklOQ0lfTFBTQ19FTUFDKTsKKwlscHNjX29uKERBVklOQ0lfTFBTQ19FTUFDX1dSQVBQRVIpOworCWxwc2Nfb24oREFWSU5DSV9MUFNDX01ESU8pOworCWxwc2Nfb24oREFWSU5DSV9MUFNDX0kyQyk7CisJbHBzY19vbihEQVZJTkNJX0xQU0NfVUFSVDApOworCWxwc2Nfb24oREFWSU5DSV9MUFNDX1RJTUVSMSk7CisJbHBzY19vbihEQVZJTkNJX0xQU0NfR1BJTyk7CisKKwkvKiBQb3dlcnVwIHRoZSBEU1AgKi8KKwlkc3Bfb24oKTsKKworCS8qIEJyaW5ndXAgVUFSVDAgb3V0IG9mIHJlc2V0ICovCisJUkVHKFVBUlQwX1BXUkVNVV9NR01UKSA9IDB4MDAwMGUwMDM7CisKKwkvKiBFbmFibGUgR0lPMy4zViBjZWxscyB1c2VkIGZvciBFTUFDICovCisJUkVHKFZERDNQM1ZfUFdETikgPSAwOworCisJLyogRW5hYmxlIFVBUlQwIE1VWCBsaW5lcyAqLworCVJFRyhQSU5NVVgxKSB8PSAxOworCisJLyogRW5hYmxlIEVNQUMgYW5kIEFFTUlGIHBpbnMgKi8KKwlSRUcoUElOTVVYMCkgPSAweDgwMDAwYzFmOworCisJLyogRW5hYmxlIEkyQyBwaW4gTXV4ICovCisJUkVHKFBJTk1VWDEpIHw9ICgxIDw8IDcpOworCisJLyogU2V0IHRoZSBCdXMgUHJpb3JpdHkgUmVnaXN0ZXIgdG8gYXBwcm9wcmlhdGUgdmFsdWUgKi8KKwlSRUcoVkJQUikgPSAweDIwOworCisJdGltZXJfaW5pdCgpOworCisJcmV0dXJuKDApOworfQorCitpbnQgbWlzY19pbml0X3IgKHZvaWQpCit7CisJdV9pbnQ4X3QJdG1wWzIwXSwgYnVmWzEwXTsKKwlpbnQJCWkgPSAwOworCWludAkJY2xrID0gMDsKKworCisJY2xrID0gKChSRUcoUExMMl9QTExNKSArIDEpICogMjcpIC8gKChSRUcoUExMMl9ESVYyKSAmIDB4MWYpICsgMSk7CisKKwlwcmludGYgKCJBUk0gQ2xvY2sgOiAlZE1IelxuIiwgKChSRUcoUExMMV9QTExNKSArIDEpICogMjcgKSAvIDIpOworCXByaW50ZiAoIkREUiBDbG9jayA6ICVkTUh6XG4iLCAoY2xrIC8gMikpOworCisJLyogU2V0IEV0aGVybmV0IE1BQyBhZGRyZXNzIGZyb20gRUVQUk9NICovCisJaWYgKGkyY19yZWFkKENGR19JMkNfRUVQUk9NX0FERFIsIDB4N2YwMCwgQ0ZHX0kyQ19FRVBST01fQUREUl9MRU4sIGJ1ZiwgNikpIHsKKwkJcHJpbnRmKCJcbkVFUFJPTSBAIDB4JTAyeCByZWFkIEZBSUxFRCEhIVxuIiwgQ0ZHX0kyQ19FRVBST01fQUREUik7CisJfSBlbHNlIHsKKwkJdG1wWzBdID0gMHhmZjsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCXRtcFswXSAmPSBidWZbaV07CisKKwkJaWYgKCh0bXBbMF0gIT0gMHhmZikgJiYgKGdldGVudigiZXRoYWRkciIpID09IE5VTEwpKSB7CisJCQlzcHJpbnRmKChjaGFyICopJnRtcFswXSwgIiUwMmhoeDolMDJoaHg6JTAyaGh4OiUwMmhoeDolMDJoaHg6JTAyaGh4IiwKKwkJCQlidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdLCBidWZbM10sIGJ1Zls0XSwgYnVmWzVdKTsKKwkJCXNldGVudigiZXRoYWRkciIsIChjaGFyICopJnRtcFswXSk7CisJCX0KKwl9CisKKwlpZiAoIWV0aF9od19pbml0KCkpIHsKKwkJcHJpbnRmKCJldGhlcm5ldCBpbml0IGZhaWxlZCFcbiIpOworCX0gZWxzZSB7CisJCXByaW50ZigiRVRIIFBIWSAgIDogJXNcbiIsIHBoeS5uYW1lKTsKKwl9CisKKwlyZXR1cm4oMCk7Cit9CisKK2ludCBkcmFtX2luaXQodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCWdkLT5iZC0+YmlfZHJhbVswXS5zdGFydCA9IFBIWVNfU0RSQU1fMTsKKwlnZC0+YmQtPmJpX2RyYW1bMF0uc2l6ZSA9IFBIWVNfU0RSQU1fMV9TSVpFOworCisJcmV0dXJuKDApOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvZGF2aW5jaS9zb25hdGEvdS1ib290LmxkcyBiL2JvYXJkL2RhdmluY2kvc29uYXRhL3UtYm9vdC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwYjJhMgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2RhdmluY2kvc29uYXRhL3UtYm9vdC5sZHMKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKK09VVFBVVF9BUkNIKGFybSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisJLiA9IDB4MDAwMDAwMDA7CisJLiA9IEFMSUdOKDQpOworCS50ZXh0CToKKwl7CisJICBjcHUvYXJtOTI2ZWpzL3N0YXJ0Lm8JKC50ZXh0KQorCSAgKigudGV4dCkKKwl9CisJLiA9IEFMSUdOKDQpOworCS5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCS4gPSBBTElHTig0KTsKKwkuZGF0YSA6IHsgKiguZGF0YSkgfQorCS4gPSBBTElHTig0KTsKKwkuZ290IDogeyAqKC5nb3QpIH0KKworCS4gPSAuOworCV9fdV9ib290X2NtZF9zdGFydCA9IC47CisJLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KKwlfX3VfYm9vdF9jbWRfZW5kID0gLjsKKworCS4gPSBBTElHTig0KTsKKwlfX2Jzc19zdGFydCA9IC47CisJLmJzcyA6IHsgKiguYnNzKSB9CisJX2VuZCA9IC47Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9kZWx0YS9kZWx0YS5jIGIvYm9hcmQvZGVsdGEvZGVsdGEuYwppbmRleCBiMTI3YWM4Li42ZTIyNzc0IDEwMDY0NAotLS0gYS9ib2FyZC9kZWx0YS9kZWx0YS5jCisrKyBiL2JvYXJkL2RlbHRhL2RlbHRhLmMKQEAgLTEsMTAgKzEsNiBAQAogLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMgotICogS3lsZSBIYXJyaXMsIE5leHVzIFRlY2hub2xvZ2llcywgSW5jLiBraGFycmlzQG5leHVzLXRlY2gubmV0Ci0gKgotICogKEMpIENvcHlyaWdodCAyMDAyCi0gKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KLSAqIE1hcml1cyBHcm9lZ2VyIDxtZ3JvZWdlckBzeXNnby5kZT4KKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZwogICoKICAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAgKiBwcm9qZWN0LgpAQCAtOTgsNyArOTQsNiBAQAogCXJldHVybiAwOwogfQogCi0KIC8qCiAgKiBNYWdpYyBLZXkgSGFuZGxpbmcsIG1haW5seSBjb3BpZWQgZnJvbSBib2FyZC9sd21vbi9sd21vbi5jCiAgKi8KQEAgLTMyNCw2ICszMTksMTIgQEAKIAkJcmV0dXJuOwogCX0KIAorCXZhbCA9IDB4ODA7CisJaWYoaTJjX3dyaXRlKGFkZHIsIElSUV9NQVNLX0IsIDEsICZ2YWwsIDEpKSB7CisJCXByaW50ZigiRXJyb3IgYWNjZXNzaW5nIERBOTAzMCB2aWEgaTJjLlxuIik7CisJCXJldHVybjsKKwl9CisKIAlpMmNfcmVnX3dyaXRlKGFkZHIsIFJFR19DT05UUk9MXzFfOTcsIDB4ZmQpOyAvKiBkaXNhYmxlIExETzEsIGVuYWJsZSBMRE82ICovCiAJaTJjX3JlZ193cml0ZShhZGRyLCBMRE8yXzMsIDB4ZDEpOwkvKiBMRE8yID0xLDlWLCBMRE8zPTMsMVYgKi8KIAlpMmNfcmVnX3dyaXRlKGFkZHIsIExETzRfNSwgMHhjYyk7CS8qIExETzIgPTEsOVYsIExETzM9MywxViAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvZGVsdGEvbmFuZC5jIGIvYm9hcmQvZGVsdGEvbmFuZC5jCmluZGV4IGQxNzA5MzguLmE2MzVhNjUgMTAwNjQ0Ci0tLSBhL2JvYXJkL2RlbHRhL25hbmQuYworKysgYi9ib2FyZC9kZWx0YS9uYW5kLmMKQEAgLTIyLDcgKzIyLDcgQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKICNpZiAhZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCiAKICNpbmNsdWRlIDxuYW5kLmg+CmRpZmYgLS1naXQgYS9ib2FyZC9lWGFsaW9uL3UtYm9vdC5sZHMgYi9ib2FyZC9lWGFsaW9uL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZWUzZmQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvZVhhbGlvbi91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjR4L3N0YXJ0Lm8JCSgudGV4dCkKLSAgICBsaWJfcHBjL2JvYXJkLm8JCSgudGV4dCkKLSAgICBsaWJfcHBjL3BwY3N0cmluZy5vCQkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvdnNwcmludGYubwkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvY3JjMzIubwkJKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL3psaWIubwkJKC50ZXh0KQotCi0JLiA9IERFRklORUQoZW52X29mZnNldCkgPyBlbnZfb2Zmc2V0IDogLjsKLSAgICBjb21tb24vZW52aXJvbm1lbnQubyAoLnRleHQpCi0KLQkqKC50ZXh0KQotCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvZW1rL3RvcDUyMDAvdG9wNTIwMC5jIGIvYm9hcmQvZW1rL3RvcDUyMDAvdG9wNTIwMC5jCmluZGV4IGQ3NDFlNmIuLmNjYmQ3MmEgMTAwNjQ0Ci0tLSBhL2JvYXJkL2Vtay90b3A1MjAwL3RvcDUyMDAuYworKysgYi9ib2FyZC9lbWsvdG9wNTIwMC90b3A1MjAwLmMKQEAgLTE4NCw3ICsxODQsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBwcm92aWRlIHRoZSBJREUgUmVzZXQgRnVuY3Rpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZiBkZWZpbmVkIChDRkdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfUkVTRVQpCiAKIHZvaWQgaW5pdF9pZGVfcmVzZXQgKHZvaWQpCiB7CkBAIC0yMDUsNCArMjA1LDQgQEAKIAkJKih2dV9sb25nICopIE1QQzVYWFhfV1VfR1BJT19EQVRBX08gfD0gIEdQSU9fUFNDMV80OwogCX0KIH0KLSNlbmRpZiAvKiBkZWZpbmVkIChDRkdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvZW1rL3RvcDUyMDAvdS1ib290LmxkcyBiL2JvYXJkL2Vtay90b3A1MjAwL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMzQzMmUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvZW1rL3RvcDUyMDAvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAzCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzV4eHgvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvZXA4MjQ4L3UtYm9vdC5sZHMgYi9ib2FyZC9lcDgyNDgvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThjNGI0Ni4uMDAwMDAwMAotLS0gYS9ib2FyZC9lcDgyNDgvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIE1vZGlmaWVkIGJ5IFl1bGkgQmFyY29oZW4gPHl1bGlAYXJhYmVsbGFzdy5jb20+Ci0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KLUVOVFJZKF9zdGFydCkKZGlmZiAtLWdpdCBhL2JvYXJkL2VwODI2MC91LWJvb3QubGRzIGIvYm9hcmQvZXA4MjYwL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNTBlODMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvZXA4MjYwL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMSwgMjAwMiwgMjAwMgotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvb3B0L2Nyb3NzL2xpYik7IFNFQVJDSF9ESVIoL29wdC9jcm9zcy9wb3dlcnBjLWxpbnV4L2xpYik7Ci0vKiBTRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsgKi8KLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0vKiAgICBjb21tb24vZW52aXJvbm1lbnQubygudGV4dCkgKi8KLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvZXA4Mnh4bS91LWJvb3QubGRzIGIvYm9hcmQvZXA4Mnh4bS91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGM0YjQ2Li4wMDAwMDAwCi0tLSBhL2JvYXJkL2VwODJ4eG0vdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIE1vZGlmaWVkIGJ5IFl1bGkgQmFyY29oZW4gPHl1bGlAYXJhYmVsbGFzdy5jb20+Ci0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KLUVOVFJZKF9zdGFydCkKZGlmZiAtLWdpdCBhL2JvYXJkL2VzZC9hc2g0MDUvYXNoNDA1LmMgYi9ib2FyZC9lc2QvYXNoNDA1L2FzaDQwNS5jCmluZGV4IDg0ZmMzYTAuLmY0MWViN2IgMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC9hc2g0MDUvYXNoNDA1LmMKKysrIGIvYm9hcmQvZXNkL2FzaDQwNS9hc2g0MDUuYwpAQCAtMjM4LDcgKzIzOCw3IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfbGVnYWN5Lmg+CiBleHRlcm4gc3RydWN0IG5hbmRfY2hpcCBuYW5kX2Rldl9kZXNjW0NGR19NQVhfTkFORF9ERVZJQ0VdOwogCmRpZmYgLS1naXQgYS9ib2FyZC9lc2QvY21zNzAwL2NtczcwMC5jIGIvYm9hcmQvZXNkL2NtczcwMC9jbXM3MDAuYwppbmRleCBjYjA0NzEwLi42MzViYTJmIDEwMDY0NAotLS0gYS9ib2FyZC9lc2QvY21zNzAwL2NtczcwMC5jCisrKyBiL2JvYXJkL2VzZC9jbXM3MDAvY21zNzAwLmMKQEAgLTIzNSw3ICsyMzUsNyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2xlZ2FjeS5oPgogZXh0ZXJuIHN0cnVjdCBuYW5kX2NoaXAgbmFuZF9kZXZfZGVzY1tDRkdfTUFYX05BTkRfREVWSUNFXTsKIApkaWZmIC0tZ2l0IGEvYm9hcmQvZXNkL2NvbW1vbi9hdXRvX3VwZGF0ZS5jIGIvYm9hcmQvZXNkL2NvbW1vbi9hdXRvX3VwZGF0ZS5jCmluZGV4IDAwMWZkNjguLjYyZjZjMjAgMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC9jb21tb24vYXV0b191cGRhdGUuYworKysgYi9ib2FyZC9lc2QvY29tbW9uL2F1dG9fdXBkYXRlLmMKQEAgLTI0LDcgKzI0LDcgQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKSAmJiAhZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCiAjd2FybmluZyBDRkdfTkFORF9MRUdBQ1kgbm90IGRlZmluZWQgaW4gYSBmaWxlIHVzaW5nIHRoZSBsZWdhY3kgTkFORCBzdXBwb3J0IQogI2VuZGlmCiAKQEAgLTM5LDggKzM5LDggQEAKIAogI2lmZGVmIENPTkZJR19BVVRPX1VQREFURQogCi0jaWYgIShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZBVCkKLSNlcnJvciAibXVzdCBkZWZpbmUgQ0ZHX0NNRF9GQVQiCisjaWYgIWRlZmluZWQoQ09ORklHX0NNRF9GQVQpCisjZXJyb3IgIm11c3QgZGVmaW5lIENPTkZJR19DTURfRkFUIgogI2VuZGlmCiAKIGV4dGVybiBhdV9pbWFnZV90IGF1X2ltYWdlW107CkBAIC03Myw3ICs3Myw3IEBACiBleHRlcm4gaW50IGZsYXNoX3NlY3RfcHJvdGVjdCAoaW50LCB1bG9uZywgdWxvbmcpOwogZXh0ZXJuIGludCBmbGFzaF93cml0ZSAoY2hhciAqLCB1bG9uZywgdWxvbmcpOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkgJiYgZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpICYmIGRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKQogLyogcmVmZXJlbmNlcyB0byBuYW1lcyBpbiBjbWRfbmFuZC5jICovCiAjZGVmaW5lIE5BTkRSV19SRUFECTB4MDEKICNkZWZpbmUgTkFORFJXX1dSSVRFCTB4MDAKQEAgLTgzLDcgKzgzLDcgQEAKIGV4dGVybiBpbnQgbmFuZF9sZWdhY3lfcncoc3RydWN0IG5hbmRfY2hpcCogbmFuZCwgaW50IGNtZCwgc2l6ZV90IHN0YXJ0LCBzaXplX3QgbGVuLAogCQkgICBzaXplX3QgKiByZXRsZW4sIHVfY2hhciAqIGJ1Zik7CiBleHRlcm4gaW50IG5hbmRfbGVnYWN5X2VyYXNlKHN0cnVjdCBuYW5kX2NoaXAqIG5hbmQsIHNpemVfdCBvZnMsIHNpemVfdCBsZW4sIGludCBjbGVhbik7Ci0jZW5kaWYgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkgJiYgZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpICovCisjZW5kaWYKIAogZXh0ZXJuIGJsb2NrX2Rldl9kZXNjX3QgaWRlX2Rldl9kZXNjW0NGR19JREVfTUFYREVWSUNFXTsKIApAQCAtMTg3LDcgKzE4Nyw3IEBACiAJaW50IG9mZiwgcmM7CiAJdWludCBuYnl0ZXM7CiAJaW50IGs7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkgJiYgZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpICYmIGRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKQogCWludCB0b3RhbDsKICNlbmRpZgogCkBAIC0yNjEsNyArMjYxLDcgQEAKIAkJCWRlYnVnICgiZmxhc2hfc2VjdF9lcmFzZSglbHgsICVseCk7XG4iLCBzdGFydCwgZW5kKTsKIAkJCWZsYXNoX3NlY3RfZXJhc2Uoc3RhcnQsIGVuZCk7CiAJCX0gZWxzZSB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkgJiYgZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpICYmIGRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKQogCQkJcHJpbnRmKCJVcGRhdGluZyBOQU5EIEZMQVNIIHdpdGggaW1hZ2UgJXNcbiIsIGF1X2ltYWdlW2ldLm5hbWUpOwogCQkJZGVidWcgKCJuYW5kX2xlZ2FjeV9lcmFzZSglbHgsICVseCk7XG4iLCBzdGFydCwgZW5kKTsKIAkJCXJjID0gbmFuZF9sZWdhY3lfZXJhc2UgKG5hbmRfZGV2X2Rlc2MsIHN0YXJ0LCBlbmQgLSBzdGFydCArIDEsIDApOwpAQCAtMjg5LDcgKzI4OSw3IEBACiAJCQlkZWJ1ZyAoImZsYXNoX3dyaXRlKCVwLCAlbHggJXgpXG4iLCBhZGRyLCBzdGFydCwgbmJ5dGVzKTsKIAkJCXJjID0gZmxhc2hfd3JpdGUoKGNoYXIgKilhZGRyLCBzdGFydCwgbmJ5dGVzKTsKIAkJfSBlbHNlIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAmJiBkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkgJiYgZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCiAJCQlkZWJ1ZyAoIm5hbmRfbGVnYWN5X3J3KCVwLCAlbHggJXgpXG4iLCBhZGRyLCBzdGFydCwgbmJ5dGVzKTsKIAkJCXJjID0gbmFuZF9sZWdhY3lfcncobmFuZF9kZXZfZGVzYywgTkFORFJXX1dSSVRFIHwgTkFORFJXX0pGRlMyLAogCQkJCSAgICAgc3RhcnQsIG5ieXRlcywgKHNpemVfdCAqKSZ0b3RhbCwgKHVjaGFyICopYWRkcik7CkBAIC0zMDcsNyArMzA3LDcgQEAKIAkJaWYgKGF1X2ltYWdlW2ldLnR5cGUgIT0gQVVfTkFORCkgewogCQkJcmMgPSBjcmMzMiAoMCwgKHVjaGFyICopKHN0YXJ0ICsgb2ZmKSwgbnRvaGwoaGRyLT5paF9zaXplKSk7CiAJCX0gZWxzZSB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkgJiYgZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpICYmIGRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKQogCQkJcmMgPSBuYW5kX2xlZ2FjeV9ydyhuYW5kX2Rldl9kZXNjLCBOQU5EUldfUkVBRCB8IE5BTkRSV19KRkZTMiB8IE5BTkRSV19KRkZTMl9TS0lQLAogCQkJCSAgICAgc3RhcnQsIG5ieXRlcywgKHNpemVfdCAqKSZ0b3RhbCwgKHVjaGFyICopYWRkcik7CiAJCQlyYyA9IGNyYzMyICgwLCAodWNoYXIgKikoYWRkciArIG9mZiksIG50b2hsKGhkci0+aWhfc2l6ZSkpOwpkaWZmIC0tZ2l0IGEvYm9hcmQvZXNkL2NvbW1vbi9jbWRfbG9hZHBjaS5jIGIvYm9hcmQvZXNkL2NvbW1vbi9jbWRfbG9hZHBjaS5jCmluZGV4IGJmNzk2ZmYuLmQ4OGIzODcgMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC9jb21tb24vY21kX2xvYWRwY2kuYworKysgYi9ib2FyZC9lc2QvY29tbW9uL2NtZF9sb2FkcGNpLmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxjb21tYW5kLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JTUCkKIAogZXh0ZXJuIGludCBkb19ib290bSAoY21kX3RibF90ICosIGludCwgaW50LCBjaGFyICpbXSk7CiBleHRlcm4gaW50IGRvX2F1dG9zY3JpcHQgKGNtZF90YmxfdCAqLCBpbnQsIGludCwgY2hhciAqW10pOwpkaWZmIC0tZ2l0IGEvYm9hcmQvZXNkL2NwY2k0MDUvY3BjaTQwNS5jIGIvYm9hcmQvZXNkL2NwY2k0MDUvY3BjaTQwNS5jCmluZGV4IGY4MDM2MTAuLjY5Y2I4Y2UgMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC9jcGNpNDA1L2NwY2k0MDUuYworKysgYi9ib2FyZC9lc2QvY3BjaTQwNS9jcGNpNDA1LmMKQEAgLTIzLDEzICsyMywxNSBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDxtYWxsb2MuaD4KICNpbmNsdWRlIDxuZXQuaD4KKyNpbmNsdWRlIDxwY2kuaD4KIAogREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CiAKLWV4dGVybiBpbnQgZG9fcmVzZXQgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKTsgICAgICAgLypjbWRfYm9vdC5jKi8KK2V4dGVybiBpbnQgZG9fcmVzZXQgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKTsJLypjbWRfYm9vdC5jKi8KICNpZiAwCiAjZGVmaW5lIEZQR0FfREVCVUcKICNlbmRpZgpAQCAtNTIsOCArNTQsNiBAQAogICogaW5jbHVkZSBjb21tb24gZnBnYSBjb2RlIChmb3IgZXNkIGJvYXJkcykKICAqLwogI2luY2x1ZGUgIi4uL2NvbW1vbi9mcGdhLmMiCi0KLQogI2luY2x1ZGUgIi4uL2NvbW1vbi9hdXRvX3VwZGF0ZS5oIgogCiAjaWZkZWYgQ09ORklHX0NQQ0k0MDVBQgpAQCAtODYsMTMgKzg2LDExIEBACiAKIGludCBOX0FVX0lNQUdFUyA9IChzaXplb2YoYXVfaW1hZ2UpIC8gc2l6ZW9mKGF1X2ltYWdlWzBdKSk7CiAKLQogLyogUHJvdG90eXBlcyAqLwogaW50IGNwY2k0MDVfdmVyc2lvbih2b2lkKTsKIGludCBndW56aXAodm9pZCAqLCBpbnQsIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZyAqKTsKIHZvaWQgbHh0OTcxX25vX3NsZWVwKHZvaWQpOwogCi0KIGludCBib2FyZF9lYXJseV9pbml0X2YgKHZvaWQpCiB7CiAjaWZuZGVmIENPTkZJR19DUENJNDA1X1ZFUjIKQEAgLTExMSwxMCArMTA5LDEwIEBACiAJLyoKIAkgKiBGaXJzdCBwdWxsIGZwZ2EtcHJnIHBpbiBsb3csIHRvIGRpc2FibGUgZnBnYSBsb2dpYyAob24gdmVyc2lvbiAyIGJvYXJkKQogCSAqLwotCW91dDMyKEdQSU8wX09EUiwgMHgwMDAwMDAwMCk7ICAgICAgICAvKiBubyBvcGVuIGRyYWluIHBpbnMgICAgICAqLwotCW91dDMyKEdQSU8wX1RDUiwgQ0ZHX0ZQR0FfUFJHKTsgICAgICAvKiBzZXR1cCBmb3Igb3V0cHV0ICAgICAgICAqLworCW91dDMyKEdQSU8wX09EUiwgMHgwMDAwMDAwMCk7CSAgICAgLyogbm8gb3BlbiBkcmFpbiBwaW5zCSovCisJb3V0MzIoR1BJTzBfVENSLCBDRkdfRlBHQV9QUkcpOyAgICAgIC8qIHNldHVwIGZvciBvdXRwdXQJKi8KIAlvdXQzMihHUElPMF9PUiwgIENGR19GUEdBX1BSRyk7ICAgICAgLyogc2V0IG91dHB1dCBwaW5zIHRvIGhpZ2ggKi8KLQlvdXQzMihHUElPMF9PUiwgMCk7ICAgICAgICAgICAgICAgICAgLyogcHVsbCBwcmcgbG93ICAgICAgICAgICAgKi8KKwlvdXQzMihHUElPMF9PUiwgMCk7CQkgICAgIC8qIHB1bGwgcHJnIGxvdwkJKi8KIAogCS8qCiAJICogQm9vdCBvbmJvYXJkIEZQR0EKQEAgLTE3Niw0NyArMTc0LDQ4IEBACiAJICogSVJRIDMwIChFWFQgSVJRIDUpIFBDSSBTTE9UIDM7IGFjdGl2ZSBsb3c7IGxldmVsIHNlbnNpdGl2ZQogCSAqIElSUSAzMSAoRVhUIElSUSA2KSBDT01QQUNUIEZMQVNIOyBhY3RpdmUgaGlnaDsgbGV2ZWwgc2Vuc2l0aXZlCiAJICovCi0JbXRkY3IodWljc3IsIDB4RkZGRkZGRkYpOyAgICAgICAvKiBjbGVhciBhbGwgaW50cyAqLwotCW10ZGNyKHVpY2VyLCAweDAwMDAwMDAwKTsgICAgICAgLyogZGlzYWJsZSBhbGwgaW50cyAqLwotCW10ZGNyKHVpY2NyLCAweDAwMDAwMDAwKTsgICAgICAgLyogc2V0IGFsbCB0byBiZSBub24tY3JpdGljYWwqLworCW10ZGNyKHVpY3NyLCAweEZGRkZGRkZGKTsJLyogY2xlYXIgYWxsIGludHMgKi8KKwltdGRjcih1aWNlciwgMHgwMDAwMDAwMCk7CS8qIGRpc2FibGUgYWxsIGludHMgKi8KKwltdGRjcih1aWNjciwgMHgwMDAwMDAwMCk7CS8qIHNldCBhbGwgdG8gYmUgbm9uLWNyaXRpY2FsKi8KKyNpZmRlZiBDT05GSUdfQ1BDSTQwNV82VQogCWlmIChjcGNpNDA1X3ZlcnNpb24oKSA9PSAzKSB7Ci0JCW10ZGNyKHVpY3ByLCAweEZGRkZGRjk5KTsgICAgICAgLyogc2V0IGludCBwb2xhcml0aWVzICovCisJCW10ZGNyKHVpY3ByLCAweEZGRkZGRjk5KTsJLyogc2V0IGludCBwb2xhcml0aWVzICovCiAJfSBlbHNlIHsKLQkJbXRkY3IodWljcHIsIDB4RkZGRkZGODEpOyAgICAgICAvKiBzZXQgaW50IHBvbGFyaXRpZXMgKi8KKwkJbXRkY3IodWljcHIsIDB4RkZGRkZGODEpOwkvKiBzZXQgaW50IHBvbGFyaXRpZXMgKi8KIAl9Ci0JbXRkY3IodWljdHIsIDB4MTAwMDAwMDApOyAgICAgICAvKiBzZXQgaW50IHRyaWdnZXIgbGV2ZWxzICovCi0JbXRkY3IodWljdmNyLCAweDAwMDAwMDAxKTsgICAgICAvKiBzZXQgdmVjdCBiYXNlPTAsSU5UMCBoaWdoZXN0IHByaW9yaXR5Ki8KLQltdGRjcih1aWNzciwgMHhGRkZGRkZGRik7ICAgICAgIC8qIGNsZWFyIGFsbCBpbnRzICovCisjZWxzZQorCW10ZGNyKHVpY3ByLCAweEZGRkZGRjgxKTsJLyogc2V0IGludCBwb2xhcml0aWVzICovCisjZW5kaWYKKwltdGRjcih1aWN0ciwgMHgxMDAwMDAwMCk7CS8qIHNldCBpbnQgdHJpZ2dlciBsZXZlbHMgKi8KKwltdGRjcih1aWN2Y3IsIDB4MDAwMDAwMDEpOwkvKiBzZXQgdmVjdCBiYXNlPTAsSU5UMCBoaWdoZXN0IHByaW9yaXR5Ki8KKwltdGRjcih1aWNzciwgMHhGRkZGRkZGRik7CS8qIGNsZWFyIGFsbCBpbnRzICovCiAKIAlyZXR1cm4gMDsKIH0KIAotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIGludCBjdGVybW0yKHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX0NQQ0k0MDVfVkVSMgotCXJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogbm8sIGJvYXJkIGlzIGNwY2k0MDUgKi8KKwlyZXR1cm4gMDsJCQkvKiBubywgYm9hcmQgaXMgY3BjaTQwNSAqLwogI2Vsc2UKIAlpZiAoKCoodW5zaWduZWQgY2hhciAqKTB4ZjAwMDA0MDAgPT0gMHgwMCkgJiYKIAkgICAgKCoodW5zaWduZWQgY2hhciAqKTB4ZjAwMDA0MDEgPT0gMHgwMSkpCi0JCXJldHVybiAwOyAgICAgICAgICAgICAgIC8qIG5vLCBib2FyZCBpcyBjcGNpNDA1ICovCisJCXJldHVybiAwOwkJLyogbm8sIGJvYXJkIGlzIGNwY2k0MDUgKi8KIAllbHNlCi0JCXJldHVybiAtMTsgICAgICAgICAgICAgIC8qIHllcywgYm9hcmQgaXMgY3Rlcm0tbTIgKi8KKwkJcmV0dXJuIC0xOwkJLyogeWVzLCBib2FyZCBpcyBjdGVybS1tMiAqLwogI2VuZGlmCiB9CiAKLQogaW50IGNwY2k0MDVfaG9zdCh2b2lkKQogewogCWlmIChtZmRjcihzdHJhcCkgJiBQU1JfUENJX0FSQklUX0VOKQotCQlyZXR1cm4gLTE7ICAgICAgICAgICAgICAvKiB5ZXMsIGJvYXJkIGlzIGNwY2k0MDUgaG9zdCAqLworCQlyZXR1cm4gLTE7CQkvKiB5ZXMsIGJvYXJkIGlzIGNwY2k0MDUgaG9zdCAqLwogCWVsc2UKLQkJcmV0dXJuIDA7ICAgICAgICAgICAgICAgLyogbm8sIGJvYXJkIGlzIGNwY2k0MDUgYWRhcHRlciAqLworCQlyZXR1cm4gMDsJCS8qIG5vLCBib2FyZCBpcyBjcGNpNDA1IGFkYXB0ZXIgKi8KIH0KIAotCiBpbnQgY3BjaTQwNV92ZXJzaW9uKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBjbnRybDBSZWc7CkBAIC0yMjcsMTAgKzIyNiwxMCBAQAogCSAqLwogCWNudHJsMFJlZyA9IG1mZGNyKGNudHJsMCk7CiAJbXRkY3IoY250cmwwLCBjbnRybDBSZWcgfCAweDAzMDAwMDAwKTsKLQlvdXQzMihHUElPMF9PRFIsIGluMzIoR1BJTzBfT0RSKSAmIH4weDAwMTgwMDAwKTsKLQlvdXQzMihHUElPMF9UQ1IsIGluMzIoR1BJTzBfVENSKSAmIH4weDAwMTgwMDAwKTsKLQl1ZGVsYXkoMTAwMCk7ICAgICAgICAgICAgICAgICAgIC8qIHdhaXQgc29tZSB0aW1lIGJlZm9yZSByZWFkaW5nIGlucHV0ICovCi0JdmFsdWUgPSBpbjMyKEdQSU8wX0lSKSAmIDB4MDAxODAwMDA7ICAgICAgIC8qIGdldCBjb25maWcgYml0cyAqLworCW91dF9iZTMyKCh2b2lkKilHUElPMF9PRFIsIGluX2JlMzIoKHZvaWQqKUdQSU8wX09EUikgJiB+MHgwMDE4MDAwMCk7CisJb3V0X2JlMzIoKHZvaWQqKUdQSU8wX1RDUiwgaW5fYmUzMigodm9pZCopR1BJTzBfVENSKSAmIH4weDAwMTgwMDAwKTsKKwl1ZGVsYXkoMTAwMCk7CQkJLyogd2FpdCBzb21lIHRpbWUgYmVmb3JlIHJlYWRpbmcgaW5wdXQgKi8KKwl2YWx1ZSA9IGluX2JlMzIoKHZvaWQqKUdQSU8wX0lSKSAmIDB4MDAxODAwMDA7CSAgICAgLyogZ2V0IGNvbmZpZyBiaXRzICovCiAKIAkvKgogCSAqIFJlc3RvcmUgR1BJTyBzZXR0aW5ncwpAQCAtMjQ1LDcgKzI0NCw3IEBACiAJCS8qIENTMj09MCAmJiBDUzM9PTEgLT4gdmVyc2lvbiAyICovCiAJCXJldHVybiAyOwogCWNhc2UgMHgwMDEwMDAwMDoKLQkJLyogQ1MyPT0xICYmIENTMz09MCAtPiB2ZXJzaW9uIDMgKi8KKwkJLyogQ1MyPT0xICYmIENTMz09MCAtPiB2ZXJzaW9uIDMgb3IgNlUgYm9hcmQgKi8KIAkJcmV0dXJuIDM7CiAJY2FzZSAweDAwMDAwMDAwOgogCQkvKiBDUzI9PTAgJiYgQ1MzPT0wIC0+IHZlcnNpb24gNCAqLwpAQCAtMjU2LDEzICsyNTUsMTEgQEAKIAl9CiB9CiAKLQogaW50IG1pc2NfaW5pdF9mICh2b2lkKQogewogCXJldHVybiAwOyAgLyogZHVtbXkgaW1wbGVtZW50YXRpb24gKi8KIH0KIAotCiBpbnQgbWlzY19pbml0X3IgKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBjbnRybDBSZWc7CkBAIC0yODMsNyArMjgwLDYgQEAKIAkgKiBPbiBDUENJLTQwNSB2ZXJzaW9uIDIgdGhlIGVudmlyb25tZW50IGlzIHNhdmVkIGluIGVlcHJvbSEKIAkgKiBGUEdBIGNhbiBiZSBnemlwIGNvbXByZXNzZWQgKG1hbGxvYykgYW5kIGJvb3RlZCB0aGlzIGxhdGUuCiAJICovCi0KIAlpZiAoY3BjaTQwNV92ZXJzaW9uKCkgPj0gMikgewogCQkvKgogCQkgKiBTZXR1cCBHUElPIHBpbnMgKENTNitDUzcgYXMgR1BJTykKQEAgLTM1NCw2ICszNTAsNyBAQAogCQlTRVRfRlBHQShGUEdBX1BSRyB8IEZQR0FfQ0xLIHwgRlBHQV9EQVRBKTsKIAkJdWRlbGF5KDEwMDApOyAvKiB3YWl0IDFtcyAqLwogCisjaWZkZWYgQ09ORklHX0NQQ0k0MDVfNlUKIAkJaWYgKGNwY2k0MDVfdmVyc2lvbigpID09IDMpIHsKIAkJCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICpmcGdhX21vZGUgPSAodW5zaWduZWQgc2hvcnQgKilDRkdfRlBHQV9CQVNFX0FERFI7CiAJCQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpsZWRzID0gKHVuc2lnbmVkIGNoYXIgKilDRkdfTEVEX0FERFI7CkBAIC0zNzUsNiArMzcyLDcgQEAKIAkJCXVkZWxheSgxMDApOwogCQkJKmZwZ2FfbW9kZSAmPSB+KENGR19GUEdBX01PREVfRFVBUlRfUkVTRVQpOwogCQl9CisjZW5kaWYKIAl9CiAJZWxzZSB7CiAJCXB1dHMoIlxuKioqIFUtQm9vdCBWZXJzaW9uIGRvZXMgbm90IG1hdGNoIEJvYXJkIFZlcnNpb24hXG4iKTsKQEAgLTQyNSw3ICs0MjMsNiBAQAogCXJldHVybiAoMCk7CiB9CiAKLQogLyoKICAqIENoZWNrIEJvYXJkIElkZW50aXR5OgogICovCkBAIC00ODEsNyArNDc4LDcgQEAKIAl9CiAKICNpZm5kZWYgQ09ORklHX0NQQ0k0MDVfVkVSMgotCXB1dHMgKCJcbkZQR0E6ICAiKTsKKwlwdXRzICgiXG5GUEdBOgkiKTsKIAogCS8qIGRpc3BsYXkgaW5mb3Mgb24gZnBnYWltYWdlICovCiAJaW5kZXggPSAxNTsKQEAgLTQ5MywxMiArNDkwLDYgQEAKICNlbmRpZgogCiAJcHV0YyAoJ1xuJyk7Ci0KLQkvKgotCSAqIERpc2FibGUgc2xlZXAgbW9kZSBpbiBMWFQ5NzEKLQkgKi8KLQlseHQ5NzFfbm9fc2xlZXAoKTsKLQogCXJldHVybiAwOwogfQogCkBAIC01MTEsMjIgKzUwMiwxOCBAQAogCW10ZGNyKG1lbWNmZ2EsIG1lbV9tYjBjZik7CiAJdmFsID0gbWZkY3IobWVtY2ZnZCk7CiAKLSNpZiAwCi0JcHJpbnRmKCJcbm1iMGNmPSV4XG4iLCB2YWwpOyAvKiB0ZXN0LW9ubHkgKi8KLQlwcmludGYoInN0cmFwPSV4XG4iLCBtZmRjcihzdHJhcCkpOyAvKiB0ZXN0LW9ubHkgKi8KLSNlbmRpZgotCiAJcmV0dXJuICg0KjEwMjQqMTAyNCA8PCAoKHZhbCAmIDB4MDAwZTAwMDApID4+IDE3KSk7CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotaW50IHRlc3RkcmFtICh2b2lkKQordm9pZCByZXNldF9waHkodm9pZCkKIHsKLQkvKiBUT0RPOiBYWFggWFhYIFhYWCAqLwotCXByaW50ZiAoInRlc3Q6IDE2IE1CIC0gb2tcbiIpOworI2lmZGVmIENPTkZJR19MWFQ5NzFfTk9fU0xFRVAKIAotCXJldHVybiAoMCk7CisJLyoKKwkgKiBEaXNhYmxlIHNsZWVwIG1vZGUgaW4gTFhUOTcxCisJICovCisJbHh0OTcxX25vX3NsZWVwKCk7CisjZW5kaWYKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNTUxLDE0ICs1MzgsNDcgQEAKICNlbmRpZiAvKiBDT05GSUdfSURFX1JFU0VUICovCiAjZW5kaWYgLyogQ09ORklHX0NQQ0k0MDVfVkVSMiAqLwogCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQordm9pZCBjcGNpNDA1X3BjaV9maXh1cF9pcnEoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBwY2lfZGV2X3QgZGV2KQoreworCXVuc2lnbmVkIGNoYXIgaW50X2xpbmUgPSAweGZmOworCisJLyoKKwkgKiBXcml0ZSBwY2kgaW50ZXJydXB0IGxpbmUgcmVnaXN0ZXIgKGNwY2k0MDUgc3BlY2lmaWMpCisJICovCisJc3dpdGNoIChQQ0lfREVWKGRldikgJiAweDAzKSB7CisJY2FzZSAwOgorCQlpbnRfbGluZSA9IDI3ICsgMjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlpbnRfbGluZSA9IDI3ICsgMzsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlpbnRfbGluZSA9IDI3ICsgMDsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlpbnRfbGluZSA9IDI3ICsgMTsKKwkJYnJlYWs7CisJfQorCisJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIGludF9saW5lKTsKK30KKworaW50IHBjaV9wcmVfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCit7CisJaG9zZS0+Zml4dXBfaXJxID0gY3BjaTQwNV9wY2lfZml4dXBfaXJxOworCXJldHVybiAxOworfQorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1BDSSkgKi8KKwogCiAjaWZkZWYgQ09ORklHX0NQQ0k0MDVBQgogCi0jZGVmaW5lIE9ORV9XSVJFX0NMRUFSICAgKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikoQ0ZHX0ZQR0FfQkFTRV9BRERSICsgQ0ZHX0ZQR0FfTU9ERSkgXAorI2RlZmluZSBPTkVfV0lSRV9DTEVBUgkgKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikoQ0ZHX0ZQR0FfQkFTRV9BRERSICsgQ0ZHX0ZQR0FfTU9ERSkgXAogCQkJICB8PSBDRkdfRlBHQV9NT0RFXzFXSVJFX0RJUikKLSNkZWZpbmUgT05FX1dJUkVfU0VUICAgICAoKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKShDRkdfRlBHQV9CQVNFX0FERFIgKyBDRkdfRlBHQV9NT0RFKSBcCisjZGVmaW5lIE9ORV9XSVJFX1NFVAkgKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikoQ0ZHX0ZQR0FfQkFTRV9BRERSICsgQ0ZHX0ZQR0FfTU9ERSkgXAogCQkJICAmPSB+Q0ZHX0ZQR0FfTU9ERV8xV0lSRV9ESVIpCi0jZGVmaW5lIE9ORV9XSVJFX0dFVCAgICAgKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikoQ0ZHX0ZQR0FfQkFTRV9BRERSICsgQ0ZHX0ZQR0FfU1RBVFVTKSBcCisjZGVmaW5lIE9ORV9XSVJFX0dFVAkgKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikoQ0ZHX0ZQR0FfQkFTRV9BRERSICsgQ0ZHX0ZQR0FfU1RBVFVTKSBcCiAJCQkgICYgQ0ZHX0ZQR0FfTU9ERV8xV0lSRSkKIAogLyoKQEAgLTU4MSw3ICs2MDEsNiBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLQogLyoKICAqIFNlbmQgMSBhIDEtd2lyZSB3cml0ZSBiaXQuCiAgKiBQcm92aWRlIDEwdXMgcmVjb3ZlcnkgdGltZS4KQEAgLTYwNyw3ICs2MjYsNiBAQAogCX0KIH0KIAotCiAvKgogICogUmVhZCBhIGJpdCBmcm9tIHRoZSAxLXdpcmUgYnVzIGFuZCByZXR1cm4gaXQuCiAgKiBQcm92aWRlIDEwdXMgcmVjb3ZlcnkgdGltZS4KQEAgLTYyNyw3ICs2NDUsNiBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLQogdm9pZCBPV1dyaXRlQnl0ZShpbnQgZGF0YSkKIHsKIAlpbnQgbG9vcDsKQEAgLTYzOCw3ICs2NTUsNiBAQAogCX0KIH0KIAotCiBpbnQgT1dSZWFkQnl0ZSh2b2lkKQogewogCWludCBsb29wLCByZXN1bHQgPSAwOwpAQCAtNjUzLDcgKzY2OSw2IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotCiBpbnQgZG9fb25ld2lyZShjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKIAl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCB2YWw7CkBAIC02OTQsNyArNzA5LDYgQEAKIAlOVUxMCiAJKTsKIAotCiAjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFJfMgkweDUxCS8qIEVFUFJPTSBDQVQyOFdDMzIJCSovCiAjZGVmaW5lIENGR19FTlZfU0laRV8yCTB4ODAwCS8qIDIwNDggYnl0ZXMgbWF5IGJlIHVzZWQgZm9yIGVudiB2YXJzKi8KIApkaWZmIC0tZ2l0IGEvYm9hcmQvZXNkL2NwY2k1MjAwL2NwY2k1MjAwLmMgYi9ib2FyZC9lc2QvY3BjaTUyMDAvY3BjaTUyMDAuYwppbmRleCBhOTI1Yjg0Li5hZGI4NTk3IDEwMDY0NAotLS0gYS9ib2FyZC9lc2QvY3BjaTUyMDAvY3BjaTUyMDAuYworKysgYi9ib2FyZC9lc2QvY3BjaTUyMDAvY3BjaTUyMDAuYwpAQCAtMTk2LDcgKzE5Niw3IEBACiB9CiAjZW5kaWYKIAotI2lmIGRlZmluZWQgKENGR19DTURfSURFKSAmJiBkZWZpbmVkIChDT05GSUdfSURFX1JFU0VUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpCiAKIHZvaWQgaW5pdF9pZGVfcmVzZXQodm9pZCkKIHsKQEAgLTIxNyw3ICsyMTcsNyBAQAogCQkqKHZ1X2xvbmcgKikgTVBDNVhYWF9XVV9HUElPX0RBVEFfTyB8PSBHUElPX1BTQzFfNDsKIAl9CiB9Ci0jZW5kaWYJCQkJLyogZGVmaW5lZCAoQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpICovCisjZW5kaWYKIAogI2RlZmluZSBNUEM1WFhYX1NJTVBMRUlPX0dQSU9fRU5BQkxFICAgICAgIChNUEM1WFhYX0dQSU8gKyAweDAwMDQpCiAjZGVmaW5lIE1QQzVYWFhfU0lNUExFSU9fR1BJT19ESVIgICAgICAgICAgKE1QQzVYWFhfR1BJTyArIDB4MDAwQykKZGlmZiAtLWdpdCBhL2JvYXJkL2VzZC9jcGNpNTIwMC91LWJvb3QubGRzIGIvYm9hcmQvZXNkL2NwY2k1MjAwL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMzQzMmUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvZXNkL2NwY2k1MjAwL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMwotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM1eHh4L3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL2VzZC9jcGNpNzUwL2lkZS5jIGIvYm9hcmQvZXNkL2NwY2k3NTAvaWRlLmMKaW5kZXggYmVhOTljZS4uMDFiOTBjNiAxMDA2NDQKLS0tIGEvYm9hcmQvZXNkL2NwY2k3NTAvaWRlLmMKKysrIGIvYm9hcmQvZXNkL2NwY2k3NTAvaWRlLmMKQEAgLTI1LDcgKzI1LDcgQEAKIAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+Ci0jaWZkZWYgQ0ZHX0NNRF9JREUKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKQogI2luY2x1ZGUgPGF0YS5oPgogI2luY2x1ZGUgPGlkZS5oPgogI2luY2x1ZGUgPHBjaS5oPgpkaWZmIC0tZ2l0IGEvYm9hcmQvZXNkL2NwY2k3NTAvc2RyYW1faW5pdC5jIGIvYm9hcmQvZXNkL2NwY2k3NTAvc2RyYW1faW5pdC5jCmluZGV4IGMwOTQ3NTUuLjc4ZDE4ODAgMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC9jcGNpNzUwL3NkcmFtX2luaXQuYworKysgYi9ib2FyZC9lc2QvY3BjaTc1MC9zZHJhbV9pbml0LmMKQEAgLTEyNTIsNyArMTI1Miw3IEBACiAvKiBzZXRzIHVwIHRoZSBHVCBwcm9wZXJseSB3aXRoIGluZm9ybWF0aW9uIHBhc3NlZCBpbiAqLwogaW50IHNldHVwX3NkcmFtIChBVVhfTUVNX0RJTU1fSU5GTyAqIGluZm8pCiB7Ci0JdWxvbmcgdG1wLCBjaGVjazsKKwl1bG9uZyB0bXA7CiAJdWxvbmcgdG1wX3NkcmFtX21vZGUgPSAwOwkvKiAweDE0MWMgKi8KIAl1bG9uZyB0bXBfZHVuaXRfY29udHJvbF9sb3cgPSAwOwkvKiAweDE0MDQgKi8KIAlpbnQgaTsKZGlmZiAtLWdpdCBhL2JvYXJkL2VzZC9jcGNpNzUwL3NlcmlhbC5jIGIvYm9hcmQvZXNkL2NwY2k3NTAvc2VyaWFsLmMKaW5kZXggYmEzMmFjMS4uZTFhZjM3ZSAxMDA2NDQKLS0tIGEvYm9hcmQvZXNkL2NwY2k3NTAvc2VyaWFsLmMKKysrIGIvYm9hcmQvZXNkL2NwY2k3NTAvc2VyaWFsLmMKQEAgLTgwLDcgKzgwLDcgQEAKIAl9CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogdm9pZCBrZ2RiX3NlcmlhbF9pbml0ICh2b2lkKQogewogfQpAQCAtMTA0LDQgKzEwNCw0IEBACiB7CiAJcmV0dXJuOwogfQotI2VuZGlmIC8qIENGR19DTURfS0dEQiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9lc2QvaGg0MDUvaGg0MDUuYyBiL2JvYXJkL2VzZC9oaDQwNS9oaDQwNS5jCmluZGV4IGVhMzQ0YzAuLjllZjU5MDcgMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC9oaDQwNS9oaDQwNS5jCisrKyBiL2JvYXJkL2VzZC9oaDQwNS9oaDQwNS5jCkBAIC02OTAsNyArNjkwLDcgQEAKICNlbmRpZiAvKiBDT05GSUdfSURFX1JFU0VUICovCiAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfbGVnYWN5Lmg+CiBleHRlcm4gc3RydWN0IG5hbmRfY2hpcCBuYW5kX2Rldl9kZXNjW0NGR19NQVhfTkFORF9ERVZJQ0VdOwogCmRpZmYgLS1naXQgYS9ib2FyZC9lc2QvaHViNDA1L2h1YjQwNS5jIGIvYm9hcmQvZXNkL2h1YjQwNS9odWI0MDUuYwppbmRleCAxZTBhY2NiLi5kZDM3MDZlIDEwMDY0NAotLS0gYS9ib2FyZC9lc2QvaHViNDA1L2h1YjQwNS5jCisrKyBiL2JvYXJkL2VzZC9odWI0MDUvaHViNDA1LmMKQEAgLTI2MCw3ICsyNjAsNyBAQAogfQogCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2xlZ2FjeS5oPgogZXh0ZXJuIHN0cnVjdCBuYW5kX2NoaXAgbmFuZF9kZXZfZGVzY1tDRkdfTUFYX05BTkRfREVWSUNFXTsKIApkaWZmIC0tZ2l0IGEvYm9hcmQvZXNkL21lY3A1MjAwL21lY3A1MjAwLmMgYi9ib2FyZC9lc2QvbWVjcDUyMDAvbWVjcDUyMDAuYwppbmRleCBjNGI5MWU5Li5lYTQ5ZjI2IDEwMDY0NAotLS0gYS9ib2FyZC9lc2QvbWVjcDUyMDAvbWVjcDUyMDAuYworKysgYi9ib2FyZC9lc2QvbWVjcDUyMDAvbWVjcDUyMDAuYwpAQCAtMTk2LDcgKzE5Niw3IEBACiB9CiAjZW5kaWYKIAotI2lmIGRlZmluZWQgKENGR19DTURfSURFKSAmJiBkZWZpbmVkIChDT05GSUdfSURFX1JFU0VUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV9SRVNFVCkKIAogI2RlZmluZSBHUElPX1BTQzFfNAkweDAxMDAwMDAwVUwKIApAQCAtMjE4LDcgKzIxOCw3IEBACiAJZWxzZQogCQkqKHZ1X2xvbmcgKikgTVBDNVhYWF9XVV9HUElPX0RBVEFfTyB8PSBHUElPX1BTQzFfNDsKIH0KLSNlbmRpZgkJCQkvKiBkZWZpbmVkIChDRkdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkgKi8KKyNlbmRpZgogCiAjZGVmaW5lIE1QQzVYWFhfU0lNUExFSU9fR1BJT19FTkFCTEUgICAgICAgKE1QQzVYWFhfR1BJTyArIDB4MDAwNCkKICNkZWZpbmUgTVBDNVhYWF9TSU1QTEVJT19HUElPX0RJUiAgICAgICAgICAoTVBDNVhYWF9HUElPICsgMHgwMDBDKQpkaWZmIC0tZ2l0IGEvYm9hcmQvZXNkL21lY3A1MjAwL3UtYm9vdC5sZHMgYi9ib2FyZC9lc2QvbWVjcDUyMDAvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk5OWRkMS4uMDAwMDAwMAotLS0gYS9ib2FyZC9lc2QvbWVjcDUyMDAvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAzCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzV4eHgvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL2VzZC9vY3J0Yy9jbWRfb2NydGMuYyBiL2JvYXJkL2VzZC9vY3J0Yy9jbWRfb2NydGMuYwppbmRleCBmZmJiNGFkLi40MTc3ZjY4IDEwMDY0NAotLS0gYS9ib2FyZC9lc2Qvb2NydGMvY21kX29jcnRjLmMKKysrIGIvYm9hcmQvZXNkL29jcnRjL2NtZF9vY3J0Yy5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8NDA1Z3BfcGNpLmg+CiAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JTUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQlNQKQogCiAvKgogICogU2V0IGRldmljZSBudW1iZXIgb24gcGNpIGJvYXJkCmRpZmYgLS1naXQgYS9ib2FyZC9lc2QvcGNpNDA1L2NtZF9wY2k0MDUuYyBiL2JvYXJkL2VzZC9wY2k0MDUvY21kX3BjaTQwNS5jCmluZGV4IDAzMTVjM2QuLjViNWFkOGMgMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC9wY2k0MDUvY21kX3BjaTQwNS5jCisrKyBiL2JvYXJkL2VzZC9wY2k0MDUvY21kX3BjaTQwNS5jCkBAIC0zMyw3ICszMyw3IEBACiAjaW5jbHVkZSAicGNpNDA1LmgiCiAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JTUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQlNQKQogCiBleHRlcm4gaW50IGRvX2Jvb3RtIChjbWRfdGJsX3QgKiwgaW50LCBpbnQsIGNoYXIgKltdKTsKIGV4dGVybiBpbnQgZG9fYm9vdHZ4IChjbWRfdGJsX3QgKiwgaW50LCBpbnQsIGNoYXIgKltdKTsKZGlmZiAtLWdpdCBhL2JvYXJkL2VzZC9wZjUyMDAvcGY1MjAwLmMgYi9ib2FyZC9lc2QvcGY1MjAwL3BmNTIwMC5jCmluZGV4IDc3ZTE2NGIuLjQ4YjgwYmYgMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC9wZjUyMDAvcGY1MjAwLmMKKysrIGIvYm9hcmQvZXNkL3BmNTIwMC9wZjUyMDAuYwpAQCAtMTk2LDcgKzE5Niw3IEBACiB9CiAjZW5kaWYKIAotI2lmIGRlZmluZWQgKENGR19DTURfSURFKSAmJiBkZWZpbmVkIChDT05GSUdfSURFX1JFU0VUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV9SRVNFVCkKIAogdm9pZCBpbml0X2lkZV9yZXNldCh2b2lkKQogewpAQCAtMjE3LDcgKzIxNyw3IEBACiAJCSoodnVfbG9uZyAqKSBNUEM1WFhYX1dVX0dQSU9fREFUQV9PIHw9IEdQSU9fUFNDMV80OwogCX0KIH0KLSNlbmRpZgkJCQkvKiBkZWZpbmVkIChDRkdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkgKi8KKyNlbmRpZgogCiAjZGVmaW5lIE1QQzVYWFhfU0lNUExFSU9fR1BJT19FTkFCTEUgICAgICAgKE1QQzVYWFhfR1BJTyArIDB4MDAwNCkKICNkZWZpbmUgTVBDNVhYWF9TSU1QTEVJT19HUElPX0RJUiAgICAgICAgICAoTVBDNVhYWF9HUElPICsgMHgwMDBDKQpkaWZmIC0tZ2l0IGEvYm9hcmQvZXNkL3BmNTIwMC91LWJvb3QubGRzIGIvYm9hcmQvZXNkL3BmNTIwMC91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjM0MzJlLi4wMDAwMDAwCi0tLSBhL2JvYXJkL2VzZC9wZjUyMDAvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAzCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzV4eHgvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvZXNkL3BsdTQwNS9wbHU0MDUuYyBiL2JvYXJkL2VzZC9wbHU0MDUvcGx1NDA1LmMKaW5kZXggNTkxNzFmOC4uOTIwZjcxNyAxMDA2NDQKLS0tIGEvYm9hcmQvZXNkL3BsdTQwNS9wbHU0MDUuYworKysgYi9ib2FyZC9lc2QvcGx1NDA1L3BsdTQwNS5jCkBAIC0yNjIsNyArMjYyLDcgQEAKICNlbmRpZiAvKiBDT05GSUdfSURFX1JFU0VUICovCiAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfbGVnYWN5Lmg+CiBleHRlcm4gc3RydWN0IG5hbmRfY2hpcCBuYW5kX2Rldl9kZXNjW0NGR19NQVhfTkFORF9ERVZJQ0VdOwogCmRpZmYgLS1naXQgYS9ib2FyZC9lc2Qvdm9oNDA1L3ZvaDQwNS5jIGIvYm9hcmQvZXNkL3ZvaDQwNS92b2g0MDUuYwppbmRleCAyMjk5NWI1Li4zZTExOGU3IDEwMDY0NAotLS0gYS9ib2FyZC9lc2Qvdm9oNDA1L3ZvaDQwNS5jCisrKyBiL2JvYXJkL2VzZC92b2g0MDUvdm9oNDA1LmMKQEAgLTM0Miw3ICszNDIsNyBAQAogI2VuZGlmIC8qIENPTkZJR19JREVfUkVTRVQgKi8KIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9sZWdhY3kuaD4KIGV4dGVybiBzdHJ1Y3QgbmFuZF9jaGlwIG5hbmRfZGV2X2Rlc2NbQ0ZHX01BWF9OQU5EX0RFVklDRV07CiAKZGlmZiAtLWdpdCBhL2JvYXJkL2VzZC93dWg0MDUvd3VoNDA1LmMgYi9ib2FyZC9lc2Qvd3VoNDA1L3d1aDQwNS5jCmluZGV4IDVhMWEzZjMuLjYxZDFkNmMgMTAwNjQ0Ci0tLSBhL2JvYXJkL2VzZC93dWg0MDUvd3VoNDA1LmMKKysrIGIvYm9hcmQvZXNkL3d1aDQwNS93dWg0MDUuYwpAQCAtMjM4LDcgKzIzOCw3IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfbGVnYWN5Lmg+CiBleHRlcm4gc3RydWN0IG5hbmRfY2hpcCBuYW5kX2Rldl9kZXNjW0NGR19NQVhfTkFORF9ERVZJQ0VdOwogCmRpZmYgLS1naXQgYS9ib2FyZC9ldGluL2RlYnJpcy9waGFudG9tLmMgYi9ib2FyZC9ldGluL2RlYnJpcy9waGFudG9tLmMKaW5kZXggMGI4MWZjMC4uMThhYjUwMCAxMDA2NDQKLS0tIGEvYm9hcmQvZXRpbi9kZWJyaXMvcGhhbnRvbS5jCisrKyBiL2JvYXJkL2V0aW4vZGVicmlzL3BoYW50b20uYwpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDxydGMuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAKICNkZWZpbmUgUlRDX0JBU0UgKENGR19OVlJBTV9CQVNFX0FERFIgKyAweDdmZmY4KQogCmRpZmYgLS1naXQgYS9ib2FyZC9ldGluL2RlYnJpcy91LWJvb3QubGRzIGIvYm9hcmQvZXRpbi9kZWJyaXMvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0MmJjZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9ldGluL2RlYnJpcy91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjR4L3N0YXJ0Lm8JKC50ZXh0KQotICAgIGxpYl9wcGMvYm9hcmQubwkoLnRleHQpCi0gICAgbGliX3BwYy9wcGNzdHJpbmcubwkoLnRleHQpCi0KLQkuID0gREVGSU5FRChlbnZfb2Zmc2V0KSA/IGVudl9vZmZzZXQgOiAuOwotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vICgudGV4dCkKLQotCSooLnRleHQpCi0KLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvZXRpbi9rdm1lMDgwL3UtYm9vdC5sZHMgYi9ib2FyZC9ldGluL2t2bWUwODAvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRhMzY4Ny4uMDAwMDAwMAotLS0gYS9ib2FyZC9ldGluL2t2bWUwODAvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxLTIwMDYKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjR4L3N0YXJ0Lm8JKC50ZXh0KQotICAgIGxpYl9wcGMvYm9hcmQubwkoLnRleHQpCi0gICAgbGliX3BwYy9wcGNzdHJpbmcubwkoLnRleHQpCi0KLQkuID0gREVGSU5FRChlbnZfb2Zmc2V0KSA/IGVudl9vZmZzZXQgOiAuOwotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vICgudGV4dCkKLQotCSooLnRleHQpCi0KLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotCi0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9ldmI2NDI2MC9ldGguYyBiL2JvYXJkL2V2YjY0MjYwL2V0aC5jCmluZGV4IGVhZmE0OGIuLmFkZDJiM2QgMTAwNjQ0Ci0tLSBhL2JvYXJkL2V2YjY0MjYwL2V0aC5jCisrKyBiL2JvYXJkL2V2YjY0MjYwL2V0aC5jCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSAiZXRoLmgiCiAjaW5jbHVkZSAiZXRoX2FkZHJ0YmwuaCIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkKIAogI2RlZmluZSBHVDY0MjZ4X0VUSF9CVUZfU0laRQkxNTM2CiAKQEAgLTc5NywxMSArNzk3LDExIEBACiAKIAogCQlldGhfcmVnaXN0ZXIoZGV2KTsKLSNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCiAJCW1paXBoeV9yZWdpc3RlcihkZXYtPm5hbWUsCiAJCQkJZ3Q2NDI2eF9taWlwaHlfcmVhZCwgZ3Q2NDI2eF9taWlwaHlfd3JpdGUpOwogI2VuZGlmCiAJfQogCiB9Ci0jZW5kaWYgLyogQ0ZHX0NNRF9ORVQgJiYgQ09ORklHX05FVF9NVUxUSSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9ldmI2NDI2MC9zZXJpYWwuYyBiL2JvYXJkL2V2YjY0MjYwL3NlcmlhbC5jCmluZGV4IDE5MTQ0NWMuLmYxYmNhYjMgMTAwNjQ0Ci0tLSBhL2JvYXJkL2V2YjY0MjYwL3NlcmlhbC5jCisrKyBiL2JvYXJkL2V2YjY0MjYwL3NlcmlhbC5jCkBAIC0xNTMsNyArMTUzLDcgQEAKIAl9CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogdm9pZAoga2dkYl9zZXJpYWxfaW5pdCh2b2lkKQogewpAQCAtMTgyLDQgKzE4Miw0IEBACiB7CiAJcmV0dXJuOwogfQotI2VuZGlmCS8qIENGR19DTURfS0dEQgkqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9ldmI2NDI2MC96dW1hX3BiYi5jIGIvYm9hcmQvZXZiNjQyNjAvenVtYV9wYmIuYwppbmRleCBkNjQwMjVhLi4yOTZlNDYxIDEwMDY0NAotLS0gYS9ib2FyZC9ldmI2NDI2MC96dW1hX3BiYi5jCisrKyBiL2JvYXJkL2V2YjY0MjYwL3p1bWFfcGJiLmMKQEAgLTEsNyArMSw3IEBACiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8bWFsbG9jLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JTUCkKICNpbmNsdWRlIDxjb21tYW5kLmg+CiAjZW5kaWYKIApAQCAtMTY2LDcgKzE2Niw3IEBACiAKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JTUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQlNQKQogCiBzdGF0aWMgaW50IGxhc3RfY21kID0gNDsJCS8qIHdyaXRlIGluY3JlbWVudCAqLwogc3RhdGljIGludCBsYXN0X3NpemUgPSA2NDsKQEAgLTIxNyw0ICsyMTcsNCBAQAogCSIgICAgLSBpbml0IHp1bWEgbWJveFxuIgogKTsKIAotI2VuZGlmIC8qIENGR19DTURfQlNQICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL2ZhZHMvZmFkcy5jIGIvYm9hcmQvZmFkcy9mYWRzLmMKaW5kZXggN2IwNGFmNS4uOGY1NzM2YiAxMDA2NDQKLS0tIGEvYm9hcmQvZmFkcy9mYWRzLmMKKysrIGIvYm9hcmQvZmFkcy9mYWRzLmMKQEAgLTc3OCw3ICs3NzgsNyBAQAogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKIAogI2lmZGVmIENGR19QQ01DSUFfTUVNX0FERFIKIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnBjbWNpYV9tZW0gPSAodW5zaWduZWQgY2hhciopQ0ZHX1BDTUNJQV9NRU1fQUREUjsKQEAgLTkyMSw3ICs5MjEsNyBAQAogCXJldHVybiAwOwogfQogCi0jZW5kaWYJLyogQ0ZHX0NNRF9QQ01DSUEgKi8KKyNlbmRpZgogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKZGlmZiAtLWdpdCBhL2JvYXJkL2ZhZHMvZmFkcy5oIGIvYm9hcmQvZmFkcy9mYWRzLmgKaW5kZXggNDFmMThiNS4uYzZmN2NjZCAxMDA2NDQKLS0tIGEvYm9hcmQvZmFkcy9mYWRzLmgKKysrIGIvYm9hcmQvZmFkcy9mYWRzLmgKQEAgLTk1LDIxICs5NSwzMyBAQAogI2RlZmluZSBDRkdfRElTQ09WRVJfUEhZCiAjZW5kaWYKIAotI2lmbmRlZiBDT05GSUdfQ09NTUFORFMKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCAgIFwKLQkJCSB8IENGR19DTURfQVNLRU5WIFwKLQkJCSB8IENGR19DTURfREhDUCAgIFwKLQkJCSB8IENGR19DTURfRUNITyAgIFwKLQkJCSB8IENGR19DTURfSU1NQVAgIFwKLQkJCSB8IENGR19DTURfSkZGUzIgIFwKLQkJCSB8IENGR19DTURfTUlJICAgIFwKLQkJCSB8IENGR19DTURfUENNQ0lBIFwKLQkJCSB8IENGR19DTURfUElORyAgIFwKLQkJCSkKLSNlbmRpZiAvKiAhQ09ORklHX0NPTU1BTkRTICovCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworI2lmICFkZWZpbmVkKEZBRFNfQ09NTUFORFNfQUxSRUFEWV9ERUZJTkVEKQorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUNITworI2RlZmluZSBDT05GSUdfQ01EX0lNTUFQCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ01DSUEKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisKKyNlbmRpZgorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC0xMTgsNyArMTMwLDcgQEAKICNkZWZpbmUgQ0ZHX0hVU0hfUEFSU0VSCiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkJLyogI3VuZGVmIHRvIHNhdmUgbWVtb3J5CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIxNyw3ICsyMjksNyBAQAogCiAjZGVmaW5lCUNGR19ESVJFQ1RfRkxBU0hfVEZUUAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKQogCiAvKgogICogSkZGUzIgcGFydGl0aW9ucwpAQCAtMjM4LDcgKzI1MCw3IEBACiAqLwogCiAjZGVmaW5lIENGR19KRkZTMl9TT1JUX0ZSQUdNRU5UUwotI2VuZGlmIC8qIENGR19DTURfSkZGUzIgKi8KKyNlbmRpZgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCkBAIC0yNDksNyArMjYxLDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEkyQyBjb25maWd1cmF0aW9uCiAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JMkMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0kyQykKICNkZWZpbmUgQ09ORklHX0hBUkRfSTJDCQkxCS8qIEkyQyB3aXRoIGhhcmR3YXJlIHN1cHBvcnQgKi8KICNkZWZpbmUgQ0ZHX0kyQ19TUEVFRAkJNDAwMDAwCS8qIEkyQyBzcGVlZCBhbmQgc2xhdmUgYWRkcmVzcyBkZWZhdWx0cyAqLwogI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCkBAIC00NjcsNyArNDc5LDcgQEAKICNkZWZpbmUgQ09ORklHX0lTT19QQVJUSVRJT04JMQogCiAjdW5kZWYJQ09ORklHX0FUQVBJCi0jaWYgMAkvKiBkb2VzIG5vdCBtYWtlIHNlbnNlIHdoZW4gQ0ZHX0NNRF9JREUgaXMgbm90IGVuYWJsZWQsIHRvbyAqLworI2lmIDAJLyogZG9lcyBub3QgbWFrZSBzZW5zZSB3aGVuIENPTkZJR19DTURfSURFIGlzIG5vdCBlbmFibGVkLCB0b28gKi8KICNkZWZpbmUgQ09ORklHX0lERV84eHhfUENDQVJECTEJLyogVXNlIElERSB3aXRoIFBDIENhcmQgQWRhcHRlciAqLwogI2VuZGlmCiAjdW5kZWYJQ09ORklHX0lERV84eHhfRElSRUNUCQkvKiBEaXJlY3QgSURFCSBub3Qgc3VwcG9ydGVkCSovCmRpZmYgLS1naXQgYS9ib2FyZC9mYWRzL3BjbWNpYS5jIGIvYm9hcmQvZmFkcy9wY21jaWEuYwppbmRleCA5NzhjMTZiLi41N2EyNDU0IDEwMDY0NAotLS0gYS9ib2FyZC9mYWRzL3BjbWNpYS5jCisrKyBiL2JvYXJkL2ZhZHMvcGNtY2lhLmMKQEAgLTQsMTEgKzQsMTEgQEAKIAogI3VuZGVmCUNPTkZJR19QQ01DSUEKIAotI2lmCShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogI2RlZmluZQlDT05GSUdfUENNQ0lBCiAjZW5kaWYKIAotI2lmCShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFXzh4eF9QQ0NBUkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFXzh4eF9QQ0NBUkQpCiAjZGVmaW5lCUNPTkZJR19QQ01DSUEKICNlbmRpZgogCkBAIC03MywxMiArNzMsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogaW50IHBjbWNpYV9oYXJkd2FyZV9kaXNhYmxlKGludCBzbG90KQogewogCSooKHVpbnQgKilCQ1NSMSkgJj0gfkJDU1IxX1BDQ0VOOwogCXJldHVybiAwOwogfQotI2VuZGlmCS8qIENGR19DTURfUENNQ0lBICovCisjZW5kaWYKIAogI2VuZGlmCS8qIENPTkZJR19QQ01DSUEgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL2ZyZWVzY2FsZS9jb21tb24vcGl4aXMuYyBiL2JvYXJkL2ZyZWVzY2FsZS9jb21tb24vcGl4aXMuYwppbmRleCBhZjk4MTU3Li45OWNjMmVlIDEwMDY0NAotLS0gYS9ib2FyZC9mcmVlc2NhbGUvY29tbW9uL3BpeGlzLmMKKysrIGIvYm9hcmQvZnJlZXNjYWxlL2NvbW1vbi9waXhpcy5jCkBAIC0zMjEsMTAgKzMyMSwxMCBAQAogCQltdWxjb25zdCA9IDE7CiAJCWZvciAoaSA9IDA7IGkgPCBkZWNhcnJfbGVuOyBpKyspCiAJCQltdWxjb25zdCAqPSAxMDsKLQkJZGVjdmFsID0gc2ltcGxlX3N0cnRvdWwoZGVjYXJyLCBOVUxMLCAxMCk7CisJCWRlY3ZhbCA9IHNpbXBsZV9zdHJ0b3VsKChjaGFyICopZGVjYXJyLCBOVUxMLCAxMCk7CiAJfQogCi0JaW50dmFsID0gc2ltcGxlX3N0cnRvdWwoaW50YXJyLCBOVUxMLCAxMCk7CisJaW50dmFsID0gc2ltcGxlX3N0cnRvdWwoKGNoYXIgKilpbnRhcnIsIE5VTEwsIDEwKTsKIAlpbnR2YWwgPSBpbnR2YWwgKiBtdWxjb25zdDsKIAogCXJldHZhbCA9IGludHZhbCArIGRlY3ZhbDsKQEAgLTM2Miw3ICszNjIsNyBAQAogCiAJCXZhbCA9IHNldF9weF9zeXNjbGsoc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTApKTsKIAotCQljb3JlcGxsID0gc3RyZnJhY3RvaW50KGFyZ3ZbM10pOworCQljb3JlcGxsID0gc3RyZnJhY3RvaW50KCh1Y2hhciAqKWFyZ3ZbM10pOwogCQl2YWwgPSB2YWwgKyBzZXRfcHhfY29yZXBsbChjb3JlcGxsKTsKIAkJdmFsID0gdmFsICsgc2V0X3B4X21weHBsbChzaW1wbGVfc3RydG91bChhcmd2WzRdLCBOVUxMLCAxMCkpOwogCQlpZiAodmFsID09IDMpIHsKQEAgLTQxMCw3ICs0MTAsNyBAQAogCQkJcmVhZF9mcm9tX3B4X3JlZ3MoMCk7CiAJCQlyZWFkX2Zyb21fcHhfcmVnc19hbHRiYW5rKDApOwogCQkJdmFsID0gc2V0X3B4X3N5c2NsayhzaW1wbGVfc3RydG91bChhcmd2WzNdLCBOVUxMLCAxMCkpOwotCQkJY29yZXBsbCA9IHN0cmZyYWN0b2ludChhcmd2WzRdKTsKKwkJCWNvcmVwbGwgPSBzdHJmcmFjdG9pbnQoKHVjaGFyICopYXJndls0XSk7CiAJCQl2YWwgPSB2YWwgKyBzZXRfcHhfY29yZXBsbChjb3JlcGxsKTsKIAkJCXZhbCA9IHZhbCArIHNldF9weF9tcHhwbGwoc2ltcGxlX3N0cnRvdWwoYXJndls1XSwKIAkJCQkJCQkJIE5VTEwsIDEwKSk7CmRpZmYgLS1naXQgYS9ib2FyZC9mcmVlc2NhbGUvbXBjODMyM2VyZGIvTWFrZWZpbGUgYi9ib2FyZC9mcmVlc2NhbGUvbXBjODMyM2VyZGIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNjOTU0NAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2ZyZWVzY2FsZS9tcGM4MzIzZXJkYi9NYWtlZmlsZQpAQCAtMCwwICsxLDUwIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwNgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChCT0FSRCkuYQorCitDT0JKUwk6PSAkKEJPQVJEKS5vCisKK1NSQ1MJOj0gJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKK09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQorU09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlMpKQorCiskKExJQik6CSQob2JqKS5kZXBlbmQgJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKQorCitjbGVhbjoKKwlybSAtZiAkKFNPQkpTKSAkKE9CSlMpCisKK2Rpc3RjbGVhbjoJY2xlYW4KKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9ib2FyZC9mcmVlc2NhbGUvbXBjODMyM2VyZGIvY29uZmlnLm1rIGIvYm9hcmQvZnJlZXNjYWxlL21wYzgzMjNlcmRiL2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTBkMzdkCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvZnJlZXNjYWxlL21wYzgzMjNlcmRiL2NvbmZpZy5tawpAQCAtMCwwICsxLDI4IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwNgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCisjCisjIE1QQzgzMjNFUkRCCisjCisKK1RFWFRfQkFTRSA9IDB4RkUwMDAwMDAKZGlmZiAtLWdpdCBhL2JvYXJkL2ZyZWVzY2FsZS9tcGM4MzIzZXJkYi9tcGM4MzIzZXJkYi5jIGIvYm9hcmQvZnJlZXNjYWxlL21wYzgzMjNlcmRiL21wYzgzMjNlcmRiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg4NmYxOQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2ZyZWVzY2FsZS9tcGM4MzIzZXJkYi9tcGM4MzIzZXJkYi5jCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogTWljaGFlbCBCYXJrb3dza2kgPG1pY2hhZWwuYmFya293c2tpQGZyZWVzY2FsZS5jb20+CisgKiBCYXNlZCBvbiBtcGM4MzJ4bWRzIGZpbGUgYnkgRGF2ZSBMaXUgPGRhdmVsaXVAZnJlZXNjYWxlLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxpb3BvcnRzLmg+CisjaW5jbHVkZSA8bXBjODN4eC5oPgorI2luY2x1ZGUgPGkyYy5oPgorI2luY2x1ZGUgPHNwZC5oPgorI2luY2x1ZGUgPG1paXBoeS5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxsaWJmZHQuaD4KKyNpbmNsdWRlIDxsaWJmZHRfZW52Lmg+CisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorI2luY2x1ZGUgPHBjaS5oPgorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU1BEX0VFUFJPTSkKKyNpbmNsdWRlIDxzcGRfc2RyYW0uaD4KKyNlbHNlCisjaW5jbHVkZSA8YXNtL21tdS5oPgorI2VuZGlmCisKK2NvbnN0IHFlX2lvcF9jb25mX3QgcWVfaW9wX2NvbmZfdGFiW10gPSB7CisJLyogVUNDMyAqLworCXsxLCAgMCwgMSwgMCwgMX0sIC8qIFR4RDAgKi8KKwl7MSwgIDEsIDEsIDAsIDF9LCAvKiBUeEQxICovCisJezEsICAyLCAxLCAwLCAxfSwgLyogVHhEMiAqLworCXsxLCAgMywgMSwgMCwgMX0sIC8qIFR4RDMgKi8KKwl7MSwgIDksIDEsIDAsIDF9LCAvKiBUeEVSICovCisJezEsIDEyLCAxLCAwLCAxfSwgLyogVHhFTiAqLworCXszLCAyNCwgMiwgMCwgMX0sIC8qIFR4Q0xLLT5DTEsxMCAqLworCisJezEsICA0LCAyLCAwLCAxfSwgLyogUnhEMCAqLworCXsxLCAgNSwgMiwgMCwgMX0sIC8qIFJ4RDEgKi8KKwl7MSwgIDYsIDIsIDAsIDF9LCAvKiBSeEQyICovCisJezEsICA3LCAyLCAwLCAxfSwgLyogUnhEMyAqLworCXsxLCAgOCwgMiwgMCwgMX0sIC8qIFJ4RVIgKi8KKwl7MSwgMTAsIDIsIDAsIDF9LCAvKiBSeERWICovCisJezAsIDEzLCAyLCAwLCAxfSwgLyogUnhDTEstPkNMSzkgKi8KKwl7MSwgMTEsIDIsIDAsIDF9LCAvKiBDT0wgKi8KKwl7MSwgMTMsIDIsIDAsIDF9LCAvKiBDUlMgKi8KKworCS8qIFVDQzIgKi8KKwl7MCwgMTgsIDEsIDAsIDF9LCAvKiBUeEQwICovCisJezAsIDE5LCAxLCAwLCAxfSwgLyogVHhEMSAqLworCXswLCAyMCwgMSwgMCwgMX0sIC8qIFR4RDIgKi8KKwl7MCwgMjEsIDEsIDAsIDF9LCAvKiBUeEQzICovCisJezAsIDI3LCAxLCAwLCAxfSwgLyogVHhFUiAqLworCXswLCAzMCwgMSwgMCwgMX0sIC8qIFR4RU4gKi8KKwl7MywgMjMsIDIsIDAsIDF9LCAvKiBUeENMSy0+Q0xLMyAqLworCisJezAsIDIyLCAyLCAwLCAxfSwgLyogUnhEMCAqLworCXswLCAyMywgMiwgMCwgMX0sIC8qIFJ4RDEgKi8KKwl7MCwgMjQsIDIsIDAsIDF9LCAvKiBSeEQyICovCisJezAsIDI1LCAyLCAwLCAxfSwgLyogUnhEMyAqLworCXswLCAyNiwgMSwgMCwgMX0sIC8qIFJ4RVIgKi8KKwl7MCwgMjgsIDIsIDAsIDF9LCAvKiBSeF9EViAqLworCXszLCAyMSwgMiwgMCwgMX0sIC8qIFJ4Q0xLLT5DTEsxNiAqLworCXswLCAyOSwgMiwgMCwgMX0sIC8qIENPTCAqLworCXswLCAzMSwgMiwgMCwgMX0sIC8qIENSUyAqLworCisJezMsICA0LCAzLCAwLCAyfSwgLyogTURJTyAqLworCXszLCAgNSwgMSwgMCwgMn0sIC8qIE1EQyAqLworCisJezAsICAwLCAwLCAwLCBRRV9JT1BfVEFCX0VORH0sIC8qIEVORCBvZiB0YWJsZSAqLworfTsKKworaW50IGJvYXJkX2Vhcmx5X2luaXRfZih2b2lkKQoreworCXJldHVybiAwOworfQorCitpbnQgZml4ZWRfc2RyYW0odm9pZCk7CisKK2xvbmcgaW50IGluaXRkcmFtKGludCBib2FyZF90eXBlKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CisJdTMyIG1zaXplID0gMDsKKworCWlmICgoaW0tPnN5c2NvbmYuaW1tcmJhciAmIElNTVJCQVJfQkFTRV9BRERSKSAhPSAodTMyKSBpbSkKKwkJcmV0dXJuIC0xOworCisJLyogRERSIFNEUkFNIC0gTWFpbiBTT0RJTU0gKi8KKwlpbS0+c3lzY29uZi5kZHJsYXdbMF0uYmFyID0gQ0ZHX0REUl9CQVNFICYgTEFXQkFSX0JBUjsKKworCW1zaXplID0gZml4ZWRfc2RyYW0oKTsKKworCXB1dHMoIlxuICAgRERSIFJBTTogIik7CisKKwkvKiByZXR1cm4gdG90YWwgYnVzIFNEUkFNIHNpemUoYnl0ZXMpICAtLSBERFIgKi8KKwlyZXR1cm4gKG1zaXplICogMTAyNCAqIDEwMjQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGZpeGVkIHNkcmFtIGluaXQgLS0gZG9lc24ndCB1c2Ugc2VyaWFsIHByZXNlbmNlIGRldGVjdC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZml4ZWRfc2RyYW0odm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbSA9IChpbW1hcF90ICopIENGR19JTU1SOworCXUzMiBtc2l6ZSA9IDA7CisJdTMyIGRkcl9zaXplOworCXUzMiBkZHJfc2l6ZV9sb2cyOworCisJbXNpemUgPSBDRkdfRERSX1NJWkU7CisJZm9yIChkZHJfc2l6ZSA9IG1zaXplIDw8IDIwLCBkZHJfc2l6ZV9sb2cyID0gMDsKKwkgICAgIChkZHJfc2l6ZSA+IDEpOyBkZHJfc2l6ZSA9IGRkcl9zaXplID4+IDEsIGRkcl9zaXplX2xvZzIrKykgeworCQlpZiAoZGRyX3NpemUgJiAxKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJaW0tPnN5c2NvbmYuZGRybGF3WzBdLmFyID0KKwkgICAgTEFXQVJfRU4gfCAoKGRkcl9zaXplX2xvZzIgLSAxKSAmIExBV0FSX1NJWkUpOworCWltLT5kZHIuc2RyYW1fY2xrX2NudGwgPSBDRkdfRERSX0NMS19DTlRMOworCWltLT5kZHIuY3NibmRzWzBdLmNzYm5kcyA9IENGR19ERFJfQ1MwX0JORFM7CisJaW0tPmRkci5jc19jb25maWdbMF0gPSBDRkdfRERSX0NTMF9DT05GSUc7CisJaW0tPmRkci50aW1pbmdfY2ZnXzAgPSBDRkdfRERSX1RJTUlOR18wOworCWltLT5kZHIudGltaW5nX2NmZ18xID0gQ0ZHX0REUl9USU1JTkdfMTsKKwlpbS0+ZGRyLnRpbWluZ19jZmdfMiA9IENGR19ERFJfVElNSU5HXzI7CisJaW0tPmRkci50aW1pbmdfY2ZnXzMgPSBDRkdfRERSX1RJTUlOR18zOworCWltLT5kZHIuc2RyYW1fY2ZnID0gQ0ZHX0REUl9TRFJBTV9DRkc7CisJaW0tPmRkci5zZHJhbV9jZmcyID0gQ0ZHX0REUl9TRFJBTV9DRkcyOworCWltLT5kZHIuc2RyYW1fbW9kZSA9IENGR19ERFJfTU9ERTsKKwlpbS0+ZGRyLnNkcmFtX21vZGUyID0gQ0ZHX0REUl9NT0RFMjsKKwlpbS0+ZGRyLnNkcmFtX2ludGVydmFsID0gQ0ZHX0REUl9JTlRFUlZBTDsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiKTsKKwl1ZGVsYXkoMjAwKTsKKworCWltLT5kZHIuc2RyYW1fY2ZnIHw9IFNEUkFNX0NGR19NRU1fRU47CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIik7CisJcmV0dXJuIG1zaXplOworfQorCitpbnQgY2hlY2tib2FyZCh2b2lkKQoreworCXB1dHMoIkJvYXJkOiBGcmVlc2NhbGUgTVBDODMyM0VSREJcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9yZWdpb24gcGNpX3JlZ2lvbnNbXSA9IHsKKwl7CisJCWJ1c19zdGFydDogQ0ZHX1BDSTFfTUVNX0JBU0UsCisJCXBoeXNfc3RhcnQ6IENGR19QQ0kxX01FTV9QSFlTLAorCQlzaXplOiBDRkdfUENJMV9NRU1fU0laRSwKKwkJZmxhZ3M6IFBDSV9SRUdJT05fTUVNIHwgUENJX1JFR0lPTl9QUkVGRVRDSAorCX0sCisJeworCQlidXNfc3RhcnQ6IENGR19QQ0kxX01NSU9fQkFTRSwKKwkJcGh5c19zdGFydDogQ0ZHX1BDSTFfTU1JT19QSFlTLAorCQlzaXplOiBDRkdfUENJMV9NTUlPX1NJWkUsCisJCWZsYWdzOiBQQ0lfUkVHSU9OX01FTQorCX0sCisJeworCQlidXNfc3RhcnQ6IENGR19QQ0kxX0lPX0JBU0UsCisJCXBoeXNfc3RhcnQ6IENGR19QQ0kxX0lPX1BIWVMsCisJCXNpemU6IENGR19QQ0kxX0lPX1NJWkUsCisJCWZsYWdzOiBQQ0lfUkVHSU9OX0lPCisJfQorfTsKKwordm9pZCBwY2lfaW5pdF9ib2FyZCh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAodm9sYXRpbGUgaW1tYXBfdCAqKUNGR19JTU1SOworCXZvbGF0aWxlIGNsazgzeHhfdCAqY2xrID0gKHZvbGF0aWxlIGNsazgzeHhfdCAqKSZpbW1yLT5jbGs7CisJdm9sYXRpbGUgbGF3ODN4eF90ICpwY2lfbGF3ID0gaW1tci0+c3lzY29uZi5wY2lsYXc7CisJc3RydWN0IHBjaV9yZWdpb24gKnJlZ1tdID0geyBwY2lfcmVnaW9ucyB9OworCisJLyogRW5hYmxlIGFsbCAzIFBDSV9DTEtfT1VUUFVUcy4gKi8KKwljbGstPm9jY3IgfD0gMHhlMDAwMDAwMDsKKworCS8qIENvbmZpZ3VyZSBQQ0kgTG9jYWwgQWNjZXNzIFdpbmRvd3MgKi8KKwlwY2lfbGF3WzBdLmJhciA9IENGR19QQ0kxX01FTV9QSFlTICYgTEFXQkFSX0JBUjsKKwlwY2lfbGF3WzBdLmFyID0gTEJMQVdBUl9FTiB8IExCTEFXQVJfNTEyTUI7CisKKwlwY2lfbGF3WzFdLmJhciA9IENGR19QQ0kxX0lPX1BIWVMgJiBMQVdCQVJfQkFSOworCXBjaV9sYXdbMV0uYXIgPSBMQkxBV0FSX0VOIHwgTEJMQVdBUl8xTUI7CisKKwltcGM4M3h4X3BjaV9pbml0KDEsIHJlZywgMCk7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19PRl9CT0FSRF9TRVRVUCkKKworLyoKKyAqIFByb3RvdHlwZXMgb2YgZnVuY3Rpb25zIHRoYXQgd2UgdXNlLgorICovCit2b2lkIGZ0X2NwdV9zZXR1cCh2b2lkICpibG9iLCBiZF90ICpiZCk7CisKKyNpZmRlZiBDT05GSUdfUENJCit2b2lkIGZ0X3BjaV9zZXR1cCh2b2lkICpibG9iLCBiZF90ICpiZCk7CisjZW5kaWYKKwordm9pZAorZnRfYm9hcmRfc2V0dXAodm9pZCAqYmxvYiwgYmRfdCAqYmQpCit7CisJaW50IG5vZGVvZmZzZXQ7CisJaW50IHRtcFsyXTsKKworCW5vZGVvZmZzZXQgPSBmZHRfZmluZF9ub2RlX2J5X3BhdGgoYmxvYiwgIi9tZW1vcnkiKTsKKwlpZiAobm9kZW9mZnNldCA+PSAwKSB7CisJCXRtcFswXSA9IGNwdV90b19iZTMyKGJkLT5iaV9tZW1zdGFydCk7CisJCXRtcFsxXSA9IGNwdV90b19iZTMyKGJkLT5iaV9tZW1zaXplKTsKKwkJZmR0X3NldHByb3AoYmxvYiwgbm9kZW9mZnNldCwgInJlZyIsIHRtcCwgc2l6ZW9mKHRtcCkpOworCX0KKworCWZ0X2NwdV9zZXR1cChibG9iLCBiZCk7CisKKyNpZmRlZiBDT05GSUdfUENJCisJZnRfcGNpX3NldHVwKGJsb2IsIGJkKTsKKyNlbmRpZgorfQorI2VuZGlmIC8qIENPTkZJR19PRl9CT0FSRF9TRVRVUCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvZnJlZXNjYWxlL21wYzg1NDRkcy9NYWtlZmlsZSBiL2JvYXJkL2ZyZWVzY2FsZS9tcGM4NTQ0ZHMvTWFrZWZpbGUKaW5kZXggYmVjMjE2OC4uMzA4ZjcwNyAxMDA2NDQKLS0tIGEvYm9hcmQvZnJlZXNjYWxlL21wYzg1NDRkcy9NYWtlZmlsZQorKysgYi9ib2FyZC9mcmVlc2NhbGUvbXBjODU0NGRzL01ha2VmaWxlCkBAIC0yNCw5ICsyNCw5IEBACiAKIGluY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5tawogCi0jIGlmbmVxICgkKE9CSlRSRUUpLCQoU1JDVFJFRSkpCi0jICQoc2hlbGwgbWtkaXIgLXAgJChvYmopLi9jb21tb24pCi0jIGVuZGlmCitpZm5lcSAoJChPQkpUUkVFKSwkKFNSQ1RSRUUpKQorJChzaGVsbCBta2RpciAtcCAkKG9iaikuLi9jb21tb24pCitlbmRpZgogCiBMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCiAKZGlmZiAtLWdpdCBhL2JvYXJkL2Z1bmt3ZXJrL3ZvdnBuLWd3L204OGU2MDYwLmMgYi9ib2FyZC9mdW5rd2Vyay92b3Zwbi1ndy9tODhlNjA2MC5jCmluZGV4IDAzYTAzZDAuLjU4YjViNmUgMTAwNjQ0Ci0tLSBhL2JvYXJkL2Z1bmt3ZXJrL3ZvdnBuLWd3L204OGU2MDYwLmMKKysrIGIvYm9hcmQvZnVua3dlcmsvdm92cG4tZ3cvbTg4ZTYwNjAuYwpAQCAtMzEsNyArMzEsNyBAQAogCiAjaW5jbHVkZSAibTg4ZTYwNjAuaCIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogc3RhdGljIGludAkJcHJ0VGFiW004OFhfUFJUX0NOVF0gPSB7IDgsIDksIDEwLCAxMSwgMTIsIDEzIH07CiBzdGF0aWMgaW50CQlwaHlUYWJbTTg4WF9QSFlfQ05UXSA9IHsgMCwgMSwgMiwgMywgNCB9OwogCmRpZmYgLS1naXQgYS9ib2FyZC9mdW5rd2Vyay92b3Zwbi1ndy91LWJvb3QubGRzIGIvYm9hcmQvZnVua3dlcmsvdm92cG4tZ3cvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4MDQ4ZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9mdW5rd2Vyay92b3Zwbi1ndy91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEtMjAwMwotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBNb2RpZmllZCBieSBZdWxpIEJhcmNvaGVuIDx5dWxpQGFyYWJlbGxhc3cuY29tPgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI2MC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19Ci1FTlRSWShfc3RhcnQpCmRpZmYgLS1naXQgYS9ib2FyZC9mdW5rd2Vyay92b3Zwbi1ndy92b3Zwbi1ndy5jIGIvYm9hcmQvZnVua3dlcmsvdm92cG4tZ3cvdm92cG4tZ3cuYwppbmRleCA5N2Y4MWVlLi45YjU0MjlhIDEwMDY0NAotLS0gYS9ib2FyZC9mdW5rd2Vyay92b3Zwbi1ndy92b3Zwbi1ndy5jCisrKyBiL2JvYXJkL2Z1bmt3ZXJrL3ZvdnBuLWd3L3ZvdnBuLWd3LmMKQEAgLTE4NCw3ICsxODQsNyBAQAogdm9pZCByZXNldF9waHkgKHZvaWQpCiB7CiAJdm9sYXRpbGUgaW9wb3J0X3QgKmlvcDsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAlpbnQgaTsKIAl1bnNpZ25lZCBzaG9ydCB2YWw7CiAjZW5kaWYKQEAgLTE5Myw3ICsxOTMsNyBAQAogCiAJLyogUmVzZXQgdGhlIFBIWSAqLwogCWlvcC0+cGRhdCAmPSAweGZmZjdmZmZmOwkvKiBQQTEyID0gfFNXSVRDSF9SRVNFVCAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCXVkZWxheSgyMDAwMCk7CiAJaW9wLT5wZGF0IHw9IDB4MDAwODAwMDA7CiAJZm9yIChpPTA7IGk8MTAwOyBpKyspIHsKZGlmZiAtLWdpdCBhL2JvYXJkL2cyMDAwL2cyMDAwLmMgYi9ib2FyZC9nMjAwMC9nMjAwMC5jCmluZGV4IDM5YjVjNzAuLjJkZmQ4N2MgMTAwNjQ0Ci0tLSBhL2JvYXJkL2cyMDAwL2cyMDAwLmMKKysrIGIvYm9hcmQvZzIwMDAvZzIwMDAuYwpAQCAtNzMsNyArNzMsNyBAQAogCiBpbnQgbWlzY19pbml0X3IgKHZvaWQpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAkvKgogCSAqIFNldCBOQU5ELUZMQVNIIEdQSU8gc2lnbmFscyB0byBkZWZhdWx0CiAJICovCkBAIC0xODQsNyArMTg0LDcgQEAKIH0KIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9sZWdhY3kuaD4KIGV4dGVybiBzdHJ1Y3QgbmFuZF9jaGlwIG5hbmRfZGV2X2Rlc2NbQ0ZHX01BWF9OQU5EX0RFVklDRV07CiAKZGlmZiAtLWdpdCBhL2JvYXJkL2dlbjg2MHQvZ2VuODYwdC5jIGIvYm9hcmQvZ2VuODYwdC9nZW44NjB0LmMKaW5kZXggZWI3MzIyMS4uZDQ0OGY5ZiAxMDA2NDQKLS0tIGEvYm9hcmQvZ2VuODYwdC9nZW44NjB0LmMKKysrIGIvYm9hcmQvZ2VuODYwdC9nZW44NjB0LmMKQEAgLTM2LDcgKzM2LDcgQEAKICNpbmNsdWRlIDxzdGF0dXNfbGVkLmg+CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ0ZHX0NNRF9NSUkpICYmIGRlZmluZWQoQ09ORklHX01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTUlJKSAmJiBkZWZpbmVkKENPTkZJR19NSUkpCiAjaW5jbHVkZSA8bmV0Lmg+CiAjZW5kaWYKIApAQCAtMjIyLDcgKzIyMiw3IEBACiAgKiBEaXNrIE9uIENoaXAgKERPQykgTWlsbGVuaXVtIGluaXRpYWxpemF0aW9uLgogICogVGhlIERPQyBsaXZlcyBpbiB0aGUgQ1MyKiBzcGFjZQogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRE9DKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ET0MpCiBleHRlcm4gdm9pZCBkb2NfcHJvYmUgKHVsb25nIHBoeXNhZHIpOwogCiB2b2lkIGRvY19pbml0ICh2b2lkKQpAQCAtMjUwLDcgKzI1MCw3IEBACiAKIAljb25maWdfbXBjOHh4X2lvcG9ydHMgKGltbXIpOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCiAJbWlpX2luaXQgKCk7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYm9hcmQvZ2VuaWV0di9nZW5pZXR2LmMgYi9ib2FyZC9nZW5pZXR2L2dlbmlldHYuYwppbmRleCA1ZjhjODk5Li5jNzU1MDdmIDEwMDY0NAotLS0gYS9ib2FyZC9nZW5pZXR2L2dlbmlldHYuYworKysgYi9ib2FyZC9nZW5pZXR2L2dlbmlldHYuYwpAQCAtMjY3LDcgKzI2Nyw3IEBACiAJcmV0dXJuIChzaXplKTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogCiAjaWZkZWYJQ0ZHX1BDTUNJQV9NRU1fQUREUgogdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqcGNtY2lhX21lbSA9ICh1bnNpZ25lZCBjaGFyICopIENGR19QQ01DSUFfTUVNX0FERFI7CkBAIC0zNTcsNCArMzU3LDQgQEAKIAogCXJldHVybiAwOwogfQotI2VuZGlmIC8qIENGR19DTURfUENNQ0lBICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL2d0aC9wY21jaWEuYyBiL2JvYXJkL2d0aC9wY21jaWEuYwppbmRleCBmY2U1NDkyLi5jZmZjYmRlIDEwMDY0NAotLS0gYS9ib2FyZC9ndGgvcGNtY2lhLmMKKysrIGIvYm9hcmQvZ3RoL3BjbWNpYS5jCkBAIC00LDExICs0LDExIEBACiAKICN1bmRlZglDT05GSUdfUENNQ0lBCiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQogI2RlZmluZQlDT05GSUdfUENNQ0lBCiAjZW5kaWYKIApAQCAtODMsNyArODMsNyBAQAogCiAJcmV0dXJuIDA7CiB9Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiBpbnQgcGNtY2lhX2hhcmR3YXJlX2Rpc2FibGUoaW50IHNsb3QpCiB7CiAJcmV0dXJuIDA7CS8qIE5vIGhhcmR3YXJlIHRvIGRpc2FibGUgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL2d3ODI2MC91LWJvb3QubGRzIGIvYm9hcmQvZ3c4MjYwL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNjVjYjEuLjAwMDAwMDAKLS0tIGEvYm9hcmQvZ3c4MjYwL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL2hlcm1lcy9oZXJtZXMuYyBiL2JvYXJkL2hlcm1lcy9oZXJtZXMuYwppbmRleCBhNTIzZGIxLi44ZmQwODFmIDEwMDY0NAotLS0gYS9ib2FyZC9oZXJtZXMvaGVybWVzLmMKKysrIGIvYm9hcmQvaGVybWVzL2hlcm1lcy5jCkBAIC01OTcsNiArNTk3LDcgQEAKIHsKIAl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CiAKKwlpZiAoc3RhdHVzIDwgLTMyKSBzdGF0dXMgPSAtMTsJLyogbGV0IHRoaW5ncyBjb21wYXRpYmxlICovCiAJc3RhdHVzIF49IDB4MEY7CiAJc3RhdHVzID0gKHN0YXR1cyAmIDB4MEYpIDw8IDE0OwogCWltbXItPmltX2NwbS5jcF9wYmRhdCA9IChpbW1yLT5pbV9jcG0uY3BfcGJkYXQgJiB+UEJfTEVEX0FMTCkgfCBzdGF0dXM7CmRpZmYgLS1naXQgYS9ib2FyZC9oaWRkZW5fZHJhZ29uL3UtYm9vdC5sZHMgYi9ib2FyZC9oaWRkZW5fZHJhZ29uL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNWNkMmUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvaGlkZGVuX2RyYWdvbi91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjR4L3N0YXJ0Lm8JKC50ZXh0KQotICAgIGxpYl9wcGMvYm9hcmQubwkoLnRleHQpCi0gICAgbGliX3BwYy9wcGNzdHJpbmcubwkoLnRleHQpCi0KLQkuID0gREVGSU5FRChlbnZfb2Zmc2V0KSA/IGVudl9vZmZzZXQgOiAuOwotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vICgudGV4dCkKLQotCSooLnRleHQpCi0KLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotCi0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9obWkxMDAxL2NvbmZpZy5tayBiL2JvYXJkL2htaTEwMDEvY29uZmlnLm1rCmluZGV4IDUxZThlODRjLi40ZmUxODMxIDEwMDY0NAotLS0gYS9ib2FyZC9obWkxMDAxL2NvbmZpZy5taworKysgYi9ib2FyZC9obWkxMDAxL2NvbmZpZy5tawpAQCAtMzksMyArMzksNCBAQAogZW5kaWYKIAogUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURURVhUX0JBU0U9JChURVhUX0JBU0UpIC1JJChUT1BESVIpL2JvYXJkCitMRFNDUklQVCA6PSAkKFNSQ1RSRUUpL2NwdS9tcGM1eHh4L3UtYm9vdC1jdXN0b21sYXlvdXQubGRzCmRpZmYgLS1naXQgYS9ib2FyZC9obWkxMDAxL3UtYm9vdC5sZHMgYi9ib2FyZC9obWkxMDAxL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyM2ExNGMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvaG1pMTAwMS91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNAotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIC8qIFdBUk5JTkcgLSB0aGUgZm9sbG93aW5nIGlzIGhhbmQtb3B0aW1pemVkIHRvIGZpdCB3aXRoaW4gICovCi0gICAgLyogdGhlIHNlY3RvciBsYXlvdXQgb2Ygb3VyIGZsYXNoIGNoaXBzISAgICBYWFggRklYTUUgWFhYICAgKi8KLQotICAgIGNwdS9tcGM1eHh4L3N0YXJ0Lm8gICAgICAgICAgKC50ZXh0KQotICAgIGNwdS9tcGM1eHh4L3RyYXBzLm8gICAgICAgICAgKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL2NyYzMyLm8gICAgICAgICAoLnRleHQpCi0gICAgbGliX3BwYy9jYWNoZS5vICAgICAgICAgICAgICgudGV4dCkKLSAgICBsaWJfcHBjL3RpbWUubyAgICAgICAgICAgICAgKC50ZXh0KQotCi0gICAgLiA9IERFRklORUQoZW52X29mZnNldCkgPyBlbnZfb2Zmc2V0IDogLjsKLSAgICBjb21tb24vZW52aXJvbm1lbnQubyAgICAgICAgKC5wcGNlbnYpCi0KLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9oeW1vZC9ic3AuYyBiL2JvYXJkL2h5bW9kL2JzcC5jCmluZGV4IDY4NjhmMjYuLjEyZjE0MDIgMTAwNjQ0Ci0tLSBhL2JvYXJkL2h5bW9kL2JzcC5jCisrKyBiL2JvYXJkL2h5bW9kL2JzcC5jCkBAIC0zNCw3ICszNCw3IEBACiAgKiBCb2FyZCBTcGVjaWFsIENvbW1hbmRzOiBGUEdBIGxvYWQvc3RvcmUsIEVFUFJPTSBlcmFzZQogICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JTUCkKIAogI2RlZmluZSBMT0FEX1NVQ0NFU1MJCTAKICNkZWZpbmUgTE9BRF9GQUlMX05PQ09ORgkxCkBAIC00MDIsNiArNDAyLDQgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2VuZGlmCS8qIENGR19DTURfQlNQICovCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvaHltb2QvY29uZmlnLm1rIGIvYm9hcmQvaHltb2QvY29uZmlnLm1rCmluZGV4IDBhOTk4NWYuLjJkZjMyMWYgMTAwNjQ0Ci0tLSBhL2JvYXJkL2h5bW9kL2NvbmZpZy5taworKysgYi9ib2FyZC9oeW1vZC9jb25maWcubWsKQEAgLTMwLDMgKzMwLDUgQEAKIFBMQVRGT1JNX0NQUEZMQUdTICs9IC1JJChUT1BESVIpCiAKIE9CSkNGTEFHUyA9IC0tcmVtb3ZlLXNlY3Rpb249LnBwY2VudgorCitMRFNDUklQVCA6PSAkKFNSQ1RSRUUpL2JvYXJkL2h5bW9kL3UtYm9vdC5sZHMKZGlmZiAtLWdpdCBhL2JvYXJkL2h5bW9kL3UtYm9vdC5sZHMgYi9ib2FyZC9oeW1vZC91LWJvb3QubGRzCmluZGV4IDMzN2EzOTUuLjliZjBmMDkgMTAwNjQ0Ci0tLSBhL2JvYXJkL2h5bW9kL3UtYm9vdC5sZHMKKysrIGIvYm9hcmQvaHltb2QvdS1ib290LmxkcwpAQCAtNjksNyArNjksNiBAQAogICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vKC50ZXh0KQogCiAgICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKICAgICAqKC5nb3QxKQogICB9CiAgIF9ldGV4dCA9IC47CmRpZmYgLS1naXQgYS9ib2FyZC9pY2VjdWJlL2ljZWN1YmUuYyBiL2JvYXJkL2ljZWN1YmUvaWNlY3ViZS5jCmluZGV4IDI5NjA5OTguLmMwMjdmNmYgMTAwNjQ0Ci0tLSBhL2JvYXJkL2ljZWN1YmUvaWNlY3ViZS5jCisrKyBiL2JvYXJkL2ljZWN1YmUvaWNlY3ViZS5jCkBAIC0zNTksNyArMzU5LDcgQEAKIH0KICNlbmRpZgogCi0jaWYgZGVmaW5lZCAoQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFX1JFU0VUKQogCiB2b2lkIGluaXRfaWRlX3Jlc2V0ICh2b2lkKQogewpAQCAtMzg0LDcgKzM4NCw3IEBACiAJCSoodnVfbG9uZyAqKSBNUEM1WFhYX1dVX0dQSU9fREFUQV9PIHw9ICBHUElPX1BTQzFfNDsKIAl9CiB9Ci0jZW5kaWYgLyogZGVmaW5lZCAoQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpICovCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX09GX0ZMQVRfVFJFRSkgJiYgZGVmaW5lZChDT05GSUdfT0ZfQk9BUkRfU0VUVVApCiB2b2lkCmRpZmYgLS1naXQgYS9ib2FyZC9pY2VjdWJlL3UtYm9vdC5sZHMgYi9ib2FyZC9pY2VjdWJlL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMzQzMmUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvaWNlY3ViZS91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDMKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjNXh4eC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9pY3U4NjIvcGNtY2lhLmMgYi9ib2FyZC9pY3U4NjIvcGNtY2lhLmMKaW5kZXggMjBmNjUzYi4uMTFkZTE4MyAxMDA2NDQKLS0tIGEvYm9hcmQvaWN1ODYyL3BjbWNpYS5jCisrKyBiL2JvYXJkL2ljdTg2Mi9wY21jaWEuYwpAQCAtNCwxMSArNCwxMSBAQAogCiAjdW5kZWYJQ09ORklHX1BDTUNJQQogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiAjZGVmaW5lCUNPTkZJR19QQ01DSUEKICNlbmRpZgogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKQEAgLTE1NSw3ICsxNTUsNyBAQAogfQogCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKIGludCBwY21jaWFfaGFyZHdhcmVfZGlzYWJsZShpbnQgc2xvdCkKIHsKIAl2b2xhdGlsZSBpbW1hcF90CSppbW1hcDsKQEAgLTE4Myw3ICsxODMsNyBAQAogCiAJcmV0dXJuICgwKTsKIH0KLSNlbmRpZgkvKiBDRkdfQ01EX1BDTUNJQSAqLworI2VuZGlmCiAKIAogaW50IHBjbWNpYV92b2x0YWdlX3NldChpbnQgc2xvdCwgaW50IHZjYywgaW50IHZwcCkKZGlmZiAtLWdpdCBhL2JvYXJkL2lkczgyNDcvaWRzODI0Ny5jIGIvYm9hcmQvaWRzODI0Ny9pZHM4MjQ3LmMKaW5kZXggN2I5YTgzZC4uMTk4MjNhNCAxMDA2NDQKLS0tIGEvYm9hcmQvaWRzODI0Ny9pZHM4MjQ3LmMKKysrIGIvYm9hcmQvaWRzODI0Ny9pZHM4MjQ3LmMKQEAgLTMwMCw3ICszMDAsNyBAQAogCWdkLT5iZC0+YmlfZmxhc2hzdGFydCA9IDB4ZmY4MDAwMDA7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogZXh0ZXJuIHVsb25nCiBuYW5kX3Byb2JlICh1bG9uZyBwaHlzYWRyKTsKIApAQCAtMzE1LDQgKzMxNSw0IEBACiAJcHJpbnRmICgiJTRsdSBNQlxuIiwgdG90bGVuID4+MjApOwogfQogCi0jZW5kaWYJLyogQ0ZHX0NNRF9OQU5EICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL2lkczgyNDcvdS1ib290LmxkcyBiL2JvYXJkL2lkczgyNDcvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg4YWVkMy4uMDAwMDAwMAotLS0gYS9ib2FyZC9pZHM4MjQ3L3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogSGVpa28gU2Nob2NoZXIsIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxoc0BkZW54LmRlPgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNjAvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICBjb21tb24vZW52aXJvbm1lbnQubygudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvaW5rYTR4MC9jb25maWcubWsgYi9ib2FyZC9pbmthNHgwL2NvbmZpZy5tawppbmRleCBjYjE5YTdkLi5mYzcwZWZlIDEwMDY0NAotLS0gYS9ib2FyZC9pbmthNHgwL2NvbmZpZy5taworKysgYi9ib2FyZC9pbmthNHgwL2NvbmZpZy5tawpAQCAtMzksMyArMzksNCBAQAogZW5kaWYKIAogUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURURVhUX0JBU0U9JChURVhUX0JBU0UpIC1JJChUT1BESVIpL2JvYXJkCitMRFNDUklQVCA6PSAkKFNSQ1RSRUUpL2NwdS9tcGM1eHh4L3UtYm9vdC1jdXN0b21sYXlvdXQubGRzCmRpZmYgLS1naXQgYS9ib2FyZC9pbmthNHgwL2lua2E0eDAuYyBiL2JvYXJkL2lua2E0eDAvaW5rYTR4MC5jCmluZGV4IGQ2NzBjYzMuLjQ3OGEzMzEgMTAwNjQ0Ci0tLSBhL2JvYXJkL2lua2E0eDAvaW5rYTR4MC5jCisrKyBiL2JvYXJkL2lua2E0eDAvaW5rYTR4MC5jCkBAIC0yMzYsNyArMjM2LDcgQEAKIH0KICNlbmRpZgogCi0jaWYgZGVmaW5lZCAoQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFX1JFU0VUKQogCiB2b2lkIGluaXRfaWRlX3Jlc2V0ICh2b2lkKQogewpAQCAtMjYxLDQgKzI2MSw0IEBACiAJCSoodnVfbG9uZyAqKSBNUEM1WFhYX1dVX0dQSU9fREFUQV9PIHw9ICBHUElPX1BTQzFfNDsKIAl9CiB9Ci0jZW5kaWYgLyogZGVmaW5lZCAoQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL2lua2E0eDAvdS1ib290LmxkcyBiL2JvYXJkL2lua2E0eDAvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIzYTE0Yy4uMDAwMDAwMAotLS0gYS9ib2FyZC9pbmthNHgwL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMy0yMDA0Ci0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgLyogV0FSTklORyAtIHRoZSBmb2xsb3dpbmcgaXMgaGFuZC1vcHRpbWl6ZWQgdG8gZml0IHdpdGhpbiAgKi8KLSAgICAvKiB0aGUgc2VjdG9yIGxheW91dCBvZiBvdXIgZmxhc2ggY2hpcHMhICAgIFhYWCBGSVhNRSBYWFggICAqLwotCi0gICAgY3B1L21wYzV4eHgvc3RhcnQubyAgICAgICAgICAoLnRleHQpCi0gICAgY3B1L21wYzV4eHgvdHJhcHMubyAgICAgICAgICAoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvY3JjMzIubyAgICAgICAgICgudGV4dCkKLSAgICBsaWJfcHBjL2NhY2hlLm8gICAgICAgICAgICAgKC50ZXh0KQotICAgIGxpYl9wcGMvdGltZS5vICAgICAgICAgICAgICAoLnRleHQpCi0KLSAgICAuID0gREVGSU5FRChlbnZfb2Zmc2V0KSA/IGVudl9vZmZzZXQgOiAuOwotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vICAgICAgICAoLnBwY2VudikKLQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL2lwaGFzZTQ1MzkvdS1ib290LmxkcyBiL2JvYXJkL2lwaGFzZTQ1MzkvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVhMDFlYS4uMDAwMDAwMAotLS0gYS9ib2FyZC9pcGhhc2U0NTM5L3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL2lzcGFuL3UtYm9vdC5sZHMgYi9ib2FyZC9pc3Bhbi91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjgwNDhkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL2lzcGFuL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMS0yMDAzCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIE1vZGlmaWVkIGJ5IFl1bGkgQmFyY29oZW4gPHl1bGlAYXJhYmVsbGFzdy5jb20+Ci0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KLUVOVFJZKF9zdGFydCkKZGlmZiAtLWdpdCBhL2JvYXJkL2l4ZHA0MjUvaXhkcDQyNS5jIGIvYm9hcmQvaXhkcDQyNS9peGRwNDI1LmMKaW5kZXggZWFmN2NkZS4uMmEzM2Q2ZCAxMDA2NDQKLS0tIGEvYm9hcmQvaXhkcDQyNS9peGRwNDI1LmMKKysrIGIvYm9hcmQvaXhkcDQyNS9peGRwNDI1LmMKQEAgLTExMiw3ICsxMTIsNyBAQAogCXJldHVybiAoMCk7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ0kpIHx8IGRlZmluZWQoQ09ORklHX1BDSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENJKSB8fCBkZWZpbmVkKENPTkZJR19QQ0kpCiBleHRlcm4gc3RydWN0IHBjaV9jb250cm9sbGVyIGhvc2U7CiBleHRlcm4gdm9pZCBwY2lfaXhwX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICogaG9zZSk7CiAKZGlmZiAtLWdpdCBhL2JvYXJkL2p1cGl0ZXIvanVwaXRlci5jIGIvYm9hcmQvanVwaXRlci9qdXBpdGVyLmMKaW5kZXggMDRmZGE0YS4uYjIyNzQ4NyAxMDA2NDQKLS0tIGEvYm9hcmQvanVwaXRlci9qdXBpdGVyLmMKKysrIGIvYm9hcmQvanVwaXRlci9qdXBpdGVyLmMKQEAgLTI4MSw3ICsyODEsNyBAQAogfQogI2VuZGlmCiAKLSNpZiBkZWZpbmVkIChDRkdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfUkVTRVQpCiAKIHZvaWQgaW5pdF9pZGVfcmVzZXQgKHZvaWQpCiB7CkBAIC0zMDYsNyArMzA2LDcgQEAKIAkJKih2dV9sb25nICopIE1QQzVYWFhfV1VfR1BJT19EQVRBX08gfD0gIEdQSU9fUFNDMV80OwogCX0KIH0KLSNlbmRpZiAvKiBkZWZpbmVkIChDRkdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkgKi8KKyNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfT0ZfRkxBVF9UUkVFKSAmJiBkZWZpbmVkKENPTkZJR19PRl9CT0FSRF9TRVRVUCkKIHZvaWQKZGlmZiAtLWdpdCBhL2JvYXJkL2p1cGl0ZXIvdS1ib290LmxkcyBiL2JvYXJkL2p1cGl0ZXIvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIzNDMyZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9qdXBpdGVyL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMwotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM1eHh4L3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL2tiOTIwMi9rYjkyMDIuYyBiL2JvYXJkL2tiOTIwMi9rYjkyMDIuYwppbmRleCBlYzUxZGNhLi41OWVkOGZmIDEwMDY0NAotLS0gYS9ib2FyZC9rYjkyMDIva2I5MjAyLmMKKysrIGIvYm9hcmQva2I5MjAyL2tiOTIwMi5jCkBAIC02NSw3ICs2NSw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfRFJJVkVSX0VUSEVSCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAKIHVuc2lnbmVkIGludCBseHQ5NzJfSXNQaHlDb25uZWN0ZWQgKEFUOTFQU19FTUFDIHBfbWFjKTsKIFVDSEFSIGx4dDk3Ml9HZXRMaW5rU3BlZWQgKEFUOTFQU19FTUFDIHBfbWFjKTsKQEAgLTkwLDUgKzkwLDUgQEAKIAlwX3BoeW9wcy0+QXV0b05lZ290aWF0ZSA9IGx4dDk3Ml9BdXRvTmVnb3RpYXRlOwogfQogCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQgKi8KKyNlbmRpZgogI2VuZGlmCS8qIENPTkZJR19EUklWRVJfRVRIRVIgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL2t1cC9jb21tb24vcGNtY2lhLmMgYi9ib2FyZC9rdXAvY29tbW9uL3BjbWNpYS5jCmluZGV4IDFmNjFhMGUuLmRlZjM4ZjEgMTAwNjQ0Ci0tLSBhL2JvYXJkL2t1cC9jb21tb24vcGNtY2lhLmMKKysrIGIvYm9hcmQva3VwL2NvbW1vbi9wY21jaWEuYwpAQCAtNCwxMSArNCwxMSBAQAogCiAjdW5kZWYJQ09ORklHX1BDTUNJQQogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiAjZGVmaW5lCUNPTkZJR19QQ01DSUEKICNlbmRpZgogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKQEAgLTExNSw3ICsxMTUsNyBAQAogfQogCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKIGludCBwY21jaWFfaGFyZHdhcmVfZGlzYWJsZShpbnQgc2xvdCkKIHsKIAl2b2xhdGlsZSBpbW1hcF90CSppbW1hcDsKQEAgLTE0NCw3ICsxNDQsNyBAQAogCiAJcmV0dXJuICgwKTsKIH0KLSNlbmRpZgkvKiBDRkdfQ01EX1BDTUNJQSAqLworI2VuZGlmCiAKIAogaW50IHBjbWNpYV92b2x0YWdlX3NldChpbnQgc2xvdCwgaW50IHZjYywgaW50IHZwcCkKZGlmZiAtLWdpdCBhL2JvYXJkL2xvZ29kbC9sb2dvZGwuYyBiL2JvYXJkL2xvZ29kbC9sb2dvZGwuYwppbmRleCAxNGZkMjhmLi44OTc3ODdiIDEwMDY0NAotLS0gYS9ib2FyZC9sb2dvZGwvbG9nb2RsLmMKKysrIGIvYm9hcmQvbG9nb2RsL2xvZ29kbC5jCkBAIC0xMDcsNiArMTA3LDcgQEAKIAogdm9pZCBzaG93X2Jvb3RfcHJvZ3Jlc3MgKGludCBzdGF0dXMpCiB7CisJaWYgKHN0YXR1cyA8IC0zMikgc3RhdHVzID0gLTE7ICAvKiBsZXQgdGhpbmdzIGNvbXBhdGlibGUgKi8KIAkvKgogCSAgc3dpdGNoKHN0YXR1cykgewogCSAgY2FzZSAgMTogbG9nb2RsX3NldF9sZWQoMCwxKTsgYnJlYWs7CmRpZmYgLS1naXQgYS9ib2FyZC9scGMyMjkyc29kaW1tL01ha2VmaWxlIGIvYm9hcmQvbHBjMjI5MnNvZGltbS9NYWtlZmlsZQppbmRleCA1YTMwMTk4Li4xOGE5NWQ3IDEwMDY0NAotLS0gYS9ib2FyZC9scGMyMjkyc29kaW1tL01ha2VmaWxlCisrKyBiL2JvYXJkL2xwYzIyOTJzb2RpbW0vTWFrZWZpbGUKQEAgLTEsNyArMSw2IEBACiAjCi0jIChDKSBDb3B5cmlnaHQgMjAwMgotIyBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KLSMgTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPgorIyAoQykgQ29weXJpZ2h0IDIwMDcKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KICMKICMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICMgcHJvamVjdC4KQEAgLTI0LDM1ICsyMywyOSBAQAogCiBpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKIAotTElCCT0gbGliJChCT0FSRCkuYQorTElCCT0gJChvYmopbGliJChCT0FSRCkuYQogCi1PQkpTCTo9IGxwYzIyOTJzb2RpbW0ubyBmbGFzaC5vIG1tYy5vIHNwaS5vIG1tY19ody5vIGV0aC5vCi1TT0JKUwk6PSBsb3dsZXZlbF9pbml0Lm8gaWFwX2VudHJ5Lm8KK0NPQkpTCTo9IGZsYXNoLm8gbHBjMjI5MnNvZGltbS5vCitTT0JKVFMJOj0gbG93bGV2ZWxfaW5pdC5vCiAKLSQoTElCKToJJChPQkpTKSAkKFNPQkpTKQorU1JDUwk6PSAkKFNPQkpUUzoubz0uUykgJChDT0JKUzoubz0uYykKK09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQorU09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlRTKSkKKworJChMSUIpOgkkKG9iaikuZGVwZW5kICQoT0JKUykgJChTT0JKUykKIAkkKEFSKSBjcnYgJEAgJChPQkpTKSAkKFNPQkpTKQogCi0jIHRoaXMgTVVTVCBiZSBjb21waWxlZCBhcyB0aHVtYiBjb2RlIQotaWFwX2VudHJ5Lm86Ci0JYXJtLWxpbnV4LWdjYyAgLURfX0FTU0VNQkxZX18gLWcgIC1PcyAgIC1mbm8tc3RyaWN0LWFsaWFzaW5nICBcCi0JLWZuby1jb21tb24gLWZmaXhlZC1yOCAtbXNvZnQtZmxvYXQgIC1EX19LRVJORUxfXyBcCi0JLURURVhUX0JBU0U9MHg4MTUwMDAwMCAgLUkvaG9tZS9nYXJ5ai9wcm9qL0xQQy91LWJvb3QvaW5jbHVkZSBcCi0JLWZuby1idWlsdGluIC1mZnJlZXN0YW5kaW5nIC1ub3N0ZGluYyAtaXN5c3RlbSBcCi0JL29wdC9lbGRrL2FybS91c3IvYmluLy4uL2xpYi9nY2MvYXJtLWxpbnV4LzQuMC4wL2luY2x1ZGUgLXBpcGUgIFwKLQktRENPTkZJR19BUk0gLURfX0FSTV9fIC1tYXJjaD1hcm12NHQgLW10dW5lPWFybTd0ZG1pIC1tYWJpPWFwY3MtZ251IFwKLQktYyAtbyBpYXBfZW50cnkubyBpYXBfZW50cnkuUwotCiBjbGVhbjoKIAlybSAtZiAkKFNPQkpTKSAkKE9CSlMpCiAKIGRpc3RjbGVhbjoJY2xlYW4KLQlybSAtZiAkKExJQikgY29yZSAqLmJhayAuZGVwZW5kCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgJChvYmopLmRlcGVuZAogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLS5kZXBlbmQ6CU1ha2VmaWxlICQoU09CSlM6Lm89LlMpICQoT0JKUzoubz0uYykKLQkJJChDQykgLU0gJChDUFBGTEFHUykgJChTT0JKUzoubz0uUykgJChPQkpTOi5vPS5jKSA+ICRACisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5tawogCi0taW5jbHVkZSAuZGVwZW5kCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2JvYXJkL2xwYzIyOTJzb2RpbW0vZXRoLmMgYi9ib2FyZC9scGMyMjkyc29kaW1tL2V0aC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDlhYjA0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL2xwYzIyOTJzb2RpbW0vZXRoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4ODUgKzAsMCBAQAotLyoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLSNpbmNsdWRlIDxjb25maWcuaD4KLSNpbmNsdWRlIDxjb21tb24uaD4KLSNpbmNsdWRlIDxuZXQuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgInNwaS5oIgotCi0vKgotICogQ29udHJvbCBSZWdpc3RlcnMgaW4gQmFuayAwCi0gKi8KLQotI2RlZmluZSBDVExfUkVHX0VSRFBUTAkgMHgwMAotI2RlZmluZSBDVExfUkVHX0VSRFBUSAkgMHgwMQotI2RlZmluZSBDVExfUkVHX0VXUlBUTAkgMHgwMgotI2RlZmluZSBDVExfUkVHX0VXUlBUSAkgMHgwMwotI2RlZmluZSBDVExfUkVHX0VUWFNUTAkgMHgwNAotI2RlZmluZSBDVExfUkVHX0VUWFNUSAkgMHgwNQotI2RlZmluZSBDVExfUkVHX0VUWE5ETAkgMHgwNgotI2RlZmluZSBDVExfUkVHX0VUWE5ESAkgMHgwNwotI2RlZmluZSBDVExfUkVHX0VSWFNUTAkgMHgwOAotI2RlZmluZSBDVExfUkVHX0VSWFNUSAkgMHgwOQotI2RlZmluZSBDVExfUkVHX0VSWE5ETAkgMHgwQQotI2RlZmluZSBDVExfUkVHX0VSWE5EQQkgMHgwQgotI2RlZmluZSBDVExfUkVHX0VSWFJEUFRMIDB4MEMKLSNkZWZpbmUgQ1RMX1JFR19FUlhSRFBUSCAweDBECi0jZGVmaW5lIENUTF9SRUdfRVJYV1JQVEwgMHgwRQotI2RlZmluZSBDVExfUkVHX0VSWFdSUFRIIDB4MEYKLSNkZWZpbmUgQ1RMX1JFR19FRE1BU1RMICAweDEwCi0jZGVmaW5lIENUTF9SRUdfRURNQVNUSCAgMHgxMQotI2RlZmluZSBDVExfUkVHX0VETUFOREwgIDB4MTIKLSNkZWZpbmUgQ1RMX1JFR19FRE1BTkRIICAweDEzCi0jZGVmaW5lIENUTF9SRUdfRURNQURTVEwgMHgxNAotI2RlZmluZSBDVExfUkVHX0VETUFEU1RIIDB4MTUKLSNkZWZpbmUgQ1RMX1JFR19FRE1BQ1NMICAweDE2Ci0jZGVmaW5lIENUTF9SRUdfRURNQUNTSCAgMHgxNwotLyogdGhlc2UgYXJlIGNvbW1vbiBpbiBhbGwgYmFua3MgKi8KLSNkZWZpbmUgQ1RMX1JFR19FSUUJIDB4MUIKLSNkZWZpbmUgQ1RMX1JFR19FSVIJIDB4MUMKLSNkZWZpbmUgQ1RMX1JFR19FU1RBVAkgMHgxRAotI2RlZmluZSBDVExfUkVHX0VDT04yCSAweDFFCi0jZGVmaW5lIENUTF9SRUdfRUNPTjEJIDB4MUYKLQotLyoKLSAqIENvbnRyb2wgUmVnaXN0ZXJzIGluIEJhbmsgMQotICovCi0KLSNkZWZpbmUgQ1RMX1JFR19FSFQwCTB4MDAKLSNkZWZpbmUgQ1RMX1JFR19FSFQxCTB4MDEKLSNkZWZpbmUgQ1RMX1JFR19FSFQyCTB4MDIKLSNkZWZpbmUgQ1RMX1JFR19FSFQzCTB4MDMKLSNkZWZpbmUgQ1RMX1JFR19FSFQ0CTB4MDQKLSNkZWZpbmUgQ1RMX1JFR19FSFQ1CTB4MDUKLSNkZWZpbmUgQ1RMX1JFR19FSFQ2CTB4MDYKLSNkZWZpbmUgQ1RMX1JFR19FSFQ3CTB4MDcKLSNkZWZpbmUgQ1RMX1JFR19FUE1NMAkweDA4Ci0jZGVmaW5lIENUTF9SRUdfRVBNTTEJMHgwOQotI2RlZmluZSBDVExfUkVHX0VQTU0yCTB4MEEKLSNkZWZpbmUgQ1RMX1JFR19FUE1NMwkweDBCCi0jZGVmaW5lIENUTF9SRUdfRVBNTTQJMHgwQwotI2RlZmluZSBDVExfUkVHX0VQTU01CTB4MEQKLSNkZWZpbmUgQ1RMX1JFR19FUE1NNgkweDBFCi0jZGVmaW5lIENUTF9SRUdfRVBNTTcJMHgwRgotI2RlZmluZSBDVExfUkVHX0VQTUNTTAkweDEwCi0jZGVmaW5lIENUTF9SRUdfRVBNQ1NICTB4MTEKLSNkZWZpbmUgQ1RMX1JFR19FUE1PTAkweDE0Ci0jZGVmaW5lIENUTF9SRUdfRVBNT0gJMHgxNQotI2RlZmluZSBDVExfUkVHX0VXT0xJRQkweDE2Ci0jZGVmaW5lIENUTF9SRUdfRVdPTElSCTB4MTcKLSNkZWZpbmUgQ1RMX1JFR19FUlhGQ09OIDB4MTgKLSNkZWZpbmUgQ1RMX1JFR19FUEtUQ05UIDB4MTkKLQotLyoKLSAqIENvbnRyb2wgUmVnaXN0ZXJzIGluIEJhbmsgMgotICovCi0KLSNkZWZpbmUgQ1RMX1JFR19NQUNPTjEJIDB4MDAKLSNkZWZpbmUgQ1RMX1JFR19NQUNPTjIJIDB4MDEKLSNkZWZpbmUgQ1RMX1JFR19NQUNPTjMJIDB4MDIKLSNkZWZpbmUgQ1RMX1JFR19NQUNPTjQJIDB4MDMKLSNkZWZpbmUgQ1RMX1JFR19NQUJCSVBHICAweDA0Ci0jZGVmaW5lIENUTF9SRUdfTUFJUEdMCSAweDA2Ci0jZGVmaW5lIENUTF9SRUdfTUFJUEdICSAweDA3Ci0jZGVmaW5lIENUTF9SRUdfTUFDTENPTjEgMHgwOAotI2RlZmluZSBDVExfUkVHX01BQ0xDT04yIDB4MDkKLSNkZWZpbmUgQ1RMX1JFR19NQU1YRkxMICAweDBBCi0jZGVmaW5lIENUTF9SRUdfTUFNWEZMSCAgMHgwQgotI2RlZmluZSBDVExfUkVHX01BUEhTVVAgIDB4MEQKLSNkZWZpbmUgQ1RMX1JFR19NSUNPTgkgMHgxMQotI2RlZmluZSBDVExfUkVHX01JQ01ECSAweDEyCi0jZGVmaW5lIENUTF9SRUdfTUlSRUdBRFIgMHgxNAotI2RlZmluZSBDVExfUkVHX01JV1JMCSAweDE2Ci0jZGVmaW5lIENUTF9SRUdfTUlXUkgJIDB4MTcKLSNkZWZpbmUgQ1RMX1JFR19NSVJETAkgMHgxOAotI2RlZmluZSBDVExfUkVHX01JUkRICSAweDE5Ci0KLS8qCi0gKiBDb250cm9sIFJlZ2lzdGVycyBpbiBCYW5rIDMKLSAqLwotCi0jZGVmaW5lIENUTF9SRUdfTUFBRFIxCTB4MDAKLSNkZWZpbmUgQ1RMX1JFR19NQUFEUjAJMHgwMQotI2RlZmluZSBDVExfUkVHX01BQURSMwkweDAyCi0jZGVmaW5lIENUTF9SRUdfTUFBRFIyCTB4MDMKLSNkZWZpbmUgQ1RMX1JFR19NQUFEUjUJMHgwNAotI2RlZmluZSBDVExfUkVHX01BQURSNAkweDA1Ci0jZGVmaW5lIENUTF9SRUdfRUJTVFNECTB4MDYKLSNkZWZpbmUgQ1RMX1JFR19FQlNUQ09OIDB4MDcKLSNkZWZpbmUgQ1RMX1JFR19FQlNUQ1NMIDB4MDgKLSNkZWZpbmUgQ1RMX1JFR19FQlNUQ1NIIDB4MDkKLSNkZWZpbmUgQ1RMX1JFR19NSVNUQVQJMHgwQQotI2RlZmluZSBDVExfUkVHX0VSRVZJRAkweDEyCi0jZGVmaW5lIENUTF9SRUdfRUNPQ09OCTB4MTUKLSNkZWZpbmUgQ1RMX1JFR19FRkxPQ09OIDB4MTcKLSNkZWZpbmUgQ1RMX1JFR19FUEFVU0wJMHgxOAotI2RlZmluZSBDVExfUkVHX0VQQVVTSAkweDE5Ci0KLQotLyoKLSAqIFBIWSBSZWdpc3RlcgotICovCi0KLSNkZWZpbmUgUEhZX1JFR19QSElEMSAweDAyCi0jZGVmaW5lIFBIWV9SRUdfUEhJRDIgMHgwMwotCi0KLS8qCi0gKiBSZWNlaXZlIEZpbHRlciBSZWdpc3RlciAoRVJYRkNPTikgYml0cwotICovCi0KLSNkZWZpbmUgRU5DX1JGUl9VQ0VOICAweDgwCi0jZGVmaW5lIEVOQ19SRlJfQU5ET1IgMHg0MAotI2RlZmluZSBFTkNfUkZSX0NSQ0VOIDB4MjAKLSNkZWZpbmUgRU5DX1JGUl9QTUVOICAweDEwCi0jZGVmaW5lIEVOQ19SRlJfTVBFTiAgMHgwOAotI2RlZmluZSBFTkNfUkZSX0hURU4gIDB4MDQKLSNkZWZpbmUgRU5DX1JGUl9NQ0VOICAweDAyCi0jZGVmaW5lIEVOQ19SRlJfQkNFTiAgMHgwMQotCi0vKgotICogRUNPTjEgUmVnaXN0ZXIgQml0cwotICovCi0KLSNkZWZpbmUgRU5DX0VDT04xX1RYUlNUICAweDgwCi0jZGVmaW5lIEVOQ19FQ09OMV9SWFJTVCAgMHg0MAotI2RlZmluZSBFTkNfRUNPTjFfRE1BU1QgIDB4MjAKLSNkZWZpbmUgRU5DX0VDT04xX0NTVU1FTiAweDEwCi0jZGVmaW5lIEVOQ19FQ09OMV9UWFJUUyAgMHgwOAotI2RlZmluZSBFTkNfRUNPTjFfUlhFTgkgMHgwNAotI2RlZmluZSBFTkNfRUNPTjFfQlNFTDEgIDB4MDIKLSNkZWZpbmUgRU5DX0VDT04xX0JTRUwwICAweDAxCi0KLS8qCi0gKiBFQ09OMiBSZWdpc3RlciBCaXRzCi0gKi8KLSNkZWZpbmUgRU5DX0VDT04yX0FVVE9JTkMgMHg4MAotI2RlZmluZSBFTkNfRUNPTjJfUEtUREVDICAweDQwCi0jZGVmaW5lIEVOQ19FQ09OMl9QV1JTViAgIDB4MjAKLSNkZWZpbmUgRU5DX0VDT04yX1ZSUFMJICAweDA4Ci0KLS8qCi0gKiBFSVIgUmVnaXN0ZXIgQml0cwotICovCi0jZGVmaW5lIEVOQ19FSVJfUEtUSUYgIDB4NDAKLSNkZWZpbmUgRU5DX0VJUl9ETUFJRiAgMHgyMAotI2RlZmluZSBFTkNfRUlSX0xJTktJRiAweDEwCi0jZGVmaW5lIEVOQ19FSVJfVFhJRiAgIDB4MDgKLSNkZWZpbmUgRU5DX0VJUl9XT0xJRiAgMHgwNAotI2RlZmluZSBFTkNfRUlSX1RYRVJJRiAweDAyCi0jZGVmaW5lIEVOQ19FSVJfUlhFUklGIDB4MDEKLQotLyoKLSAqIEVTVEFUIFJlZ2lzdGVyIEJpdHMKLSAqLwotCi0jZGVmaW5lIEVOQ19FU1RBVF9JTlQJICAweDgwCi0jZGVmaW5lIEVOQ19FU1RBVF9MQVRFQ09MIDB4MTAKLSNkZWZpbmUgRU5DX0VTVEFUX1JYQlVTWSAgMHgwNAotI2RlZmluZSBFTkNfRVNUQVRfVFhBQlJUICAweDAyCi0jZGVmaW5lIEVOQ19FU1RBVF9DTEtSRFkgIDB4MDEKLQotLyoKLSAqIEVJRSBSZWdpc3RlciBCaXRzCi0gKi8KLQotI2RlZmluZSBFTkNfRUlFX0lOVElFICAweDgwCi0jZGVmaW5lIEVOQ19FSUVfUEtUSUUgIDB4NDAKLSNkZWZpbmUgRU5DX0VJRV9ETUFJRSAgMHgyMAotI2RlZmluZSBFTkNfRUlFX0xJTktJRSAweDEwCi0jZGVmaW5lIEVOQ19FSUVfVFhJRSAgIDB4MDgKLSNkZWZpbmUgRU5DX0VJRV9XT0xJRSAgMHgwNAotI2RlZmluZSBFTkNfRUlFX1RYRVJJRSAweDAyCi0jZGVmaW5lIEVOQ19FSUVfUlhFUklFIDB4MDEKLQotLyoKLSAqIE1BQ09OMSBSZWdpc3RlciBCaXRzCi0gKi8KLSNkZWZpbmUgRU5DX01BQ09OMV9MT09QQksgIDB4MTAKLSNkZWZpbmUgRU5DX01BQ09OMV9UWFBBVVMgIDB4MDgKLSNkZWZpbmUgRU5DX01BQ09OMV9SWFBBVVMgIDB4MDQKLSNkZWZpbmUgRU5DX01BQ09OMV9QQVNTQUxMIDB4MDIKLSNkZWZpbmUgRU5DX01BQ09OMV9NQVJYRU4gIDB4MDEKLQotCi0vKgotICogTUFDT04yIFJlZ2lzdGVyIEJpdHMKLSAqLwotI2RlZmluZSBFTkNfTUFDT04yX01BUlNUICAgMHg4MAotI2RlZmluZSBFTkNfTUFDT04yX1JORFJTVCAgMHg0MAotI2RlZmluZSBFTkNfTUFDT04yX01BUlhSU1QgMHgwOAotI2RlZmluZSBFTkNfTUFDT04yX1JGVU5SU1QgMHgwNAotI2RlZmluZSBFTkNfTUFDT04yX01BVFhSU1QgMHgwMgotI2RlZmluZSBFTkNfTUFDT04yX1RGVU5SU1QgMHgwMQotCi0vKgotICogTUFDT04zIFJlZ2lzdGVyIEJpdHMKLSAqLwotI2RlZmluZSBFTkNfTUFDT04zX1BBRENGRzIgMHg4MAotI2RlZmluZSBFTkNfTUFDT04zX1BBRENGRzEgMHg0MAotI2RlZmluZSBFTkNfTUFDT04zX1BBRENGRzAgMHgyMAotI2RlZmluZSBFTkNfTUFDT04zX1RYQ1JDRU4gMHgxMAotI2RlZmluZSBFTkNfTUFDT04zX1BIRFJMRU4gMHgwOAotI2RlZmluZSBFTkNfTUFDT04zX0hGUk1FTiAgMHgwNAotI2RlZmluZSBFTkNfTUFDT04zX0ZSTUxORU4gMHgwMgotI2RlZmluZSBFTkNfTUFDT04zX0ZVTERQWCAgMHgwMQotCi0vKgotICogTUlDTUQgUmVnaXN0ZXIgQml0cwotICovCi0jZGVmaW5lIEVOQ19NSUNNRF9NSUlTQ0FOIDB4MDIKLSNkZWZpbmUgRU5DX01JQ01EX01JSVJEICAgMHgwMQotCi0vKgotICogTUlTVEFUIFJlZ2lzdGVyIEJpdHMKLSAqLwotI2RlZmluZSBFTkNfTUlTVEFUX05WQUxJRCAweDA0Ci0jZGVmaW5lIEVOQ19NSVNUQVRfU0NBTiAgIDB4MDIKLSNkZWZpbmUgRU5DX01JU1RBVF9CVVNZICAgMHgwMQotCi0vKgotICogUEhJRDEgYW5kIFBISUQyIHZhbHVlcwotICovCi0jZGVmaW5lIEVOQ19QSElEMV9WQUxVRSAweDAwODMKLSNkZWZpbmUgRU5DX1BISUQyX1ZBTFVFIDB4MTQwMAotI2RlZmluZSBFTkNfUEhJRDJfTUFTSwkweEZDMDAKLQotCi0jZGVmaW5lIEVOQ19TUElfU0xBVkVfQ1MgMHgwMDAxMDAwMAkvKiBwaW4gUDEuMTYgKi8KLSNkZWZpbmUgRU5DX1JFU0VUCSAweDAwMDIwMDAwCS8qIHBpbiBQMS4xNyAqLwotCi0jZGVmaW5lIEZBSUxTQUZFX1ZBTFVFIDUwMDAKLQotLyoKLSAqIENvbnRyb2xsZXIgbWVtb3J5IGxheW91dDoKLSAqCi0gKiAweDAwMDAgLSAweDE3ZmYgIDZrIGJ5dGVzIHJlY2VpdmUgYnVmZmVyCi0gKiAweDE4MDAgLSAweDFmZmYgIDJrIGJ5dGVzIHRyYW5zbWl0IGJ1ZmZlcgotICovCi0vKiBVc2UgdGhlIGxvd2VyIG1lbW9yeSBmb3IgcmVjZWl2ZXIgYnVmZmVyLiBTZWUgZXJyYXRhIHB0LiA1ICovCi0jZGVmaW5lIEVOQ19SWF9CVUZfU1RBUlQgMHgwMDAwCi0jZGVmaW5lIEVOQ19UWF9CVUZfU1RBUlQgMHgxODAwCi0KLS8qIG1heGltdW0gZnJhbWUgbGVuZ3RoICovCi0jZGVmaW5lIEVOQ19NQVhfRlJNX0xFTiAxNTE4Ci0KLSNkZWZpbmUgZW5jX2VuYWJsZSgpIFBVVDMyKElPMUNMUiwgRU5DX1NQSV9TTEFWRV9DUykKLSNkZWZpbmUgZW5jX2Rpc2FibGUoKSBQVVQzMihJTzFTRVQsIEVOQ19TUElfU0xBVkVfQ1MpCi0jZGVmaW5lIGVuY19jZmdfc3BpKCkgc3BpX3NldF9jZmcoMCwgMCwgMCk7IHNwaV9zZXRfY2xvY2soOCk7Ci0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgZW5jUmVhZFJlZyAodW5zaWduZWQgY2hhciByZWdObyk7Ci1zdGF0aWMgdm9pZCBlbmNXcml0ZVJlZyAodW5zaWduZWQgY2hhciByZWdObywgdW5zaWduZWQgY2hhciBkYXRhKTsKLXN0YXRpYyB2b2lkIGVuY1dyaXRlUmVnUmV0cnkgKHVuc2lnbmVkIGNoYXIgcmVnTm8sIHVuc2lnbmVkIGNoYXIgZGF0YSwgaW50IGMpOwotc3RhdGljIHZvaWQgZW5jUmVhZEJ1ZmYgKHVuc2lnbmVkIHNob3J0IGxlbmd0aCwgdW5zaWduZWQgY2hhciAqcEJ1ZmYpOwotc3RhdGljIHZvaWQgZW5jV3JpdGVCdWZmICh1bnNpZ25lZCBzaG9ydCBsZW5ndGgsIHVuc2lnbmVkIGNoYXIgKnBCdWZmKTsKLXN0YXRpYyB2b2lkIGVuY0JpdFNldCAodW5zaWduZWQgY2hhciByZWdObywgdW5zaWduZWQgY2hhciBkYXRhKTsKLXN0YXRpYyB2b2lkIGVuY0JpdENsciAodW5zaWduZWQgY2hhciByZWdObywgdW5zaWduZWQgY2hhciBkYXRhKTsKLXN0YXRpYyB2b2lkIGVuY1Jlc2V0ICh2b2lkKTsKLXN0YXRpYyB2b2lkIGVuY0luaXQgKHVuc2lnbmVkIGNoYXIgKnBFdGhBZGRyKTsKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBwaHlSZWFkICh1bnNpZ25lZCBjaGFyIGFkZHIpOwotc3RhdGljIHZvaWQgZW5jUG9sbCAodm9pZCk7Ci1zdGF0aWMgdm9pZCBlbmNSeCAodm9pZCk7Ci0KLSNkZWZpbmUgbV9uaWNfcmVhZChyZWcpIGVuY1JlYWRSZWcocmVnKQotI2RlZmluZSBtX25pY193cml0ZShyZWcsIGRhdGEpIGVuY1dyaXRlUmVnKHJlZywgZGF0YSkKLSNkZWZpbmUgbV9uaWNfd3JpdGVfcmV0cnkocmVnLCBkYXRhLCBjb3VudCkgZW5jV3JpdGVSZWdSZXRyeShyZWcsIGRhdGEsIGNvdW50KQotI2RlZmluZSBtX25pY19yZWFkX2RhdGEobGVuLCBidWYpIGVuY1JlYWRCdWZmKChsZW4pLCAoYnVmKSkKLSNkZWZpbmUgbV9uaWNfd3JpdGVfZGF0YShsZW4sIGJ1ZikgZW5jV3JpdGVCdWZmKChsZW4pLCAoYnVmKSkKLQotLyogYml0IGZpZWxkIHNldCAqLwotI2RlZmluZSBtX25pY19iZnMocmVnLCBkYXRhKSBlbmNCaXRTZXQocmVnLCBkYXRhKQotCi0vKiBiaXQgZmllbGQgY2xlYXIgKi8KLSNkZWZpbmUgbV9uaWNfYmZjKHJlZywgZGF0YSkgZW5jQml0Q2xyKHJlZywgZGF0YSkKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgYmFuayA9IDA7CS8qIGN1cnJlbnQgYmFuayBpbiBlbmMyOGo2MCAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIgbmV4dF9wb2ludGVyX2xzYjsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIG5leHRfcG9pbnRlcl9tc2I7Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGJ1ZmZlcltFTkNfTUFYX0ZSTV9MRU5dOwotc3RhdGljIGludCByeFJlc2V0Q291bnRlciA9IDA7Ci0KLSNkZWZpbmUgUlhfUkVTRVRfQ09VTlRFUiAxMDAwOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBSZXR1cm5zIDAgd2hlbiBmYWlsZXMgb3RoZXJ3aXplIDEKLSAqLwotaW50IGV0aF9pbml0IChiZF90ICogYmlzKQotewotCS8qIGNvbmZpZ3VyZSBHUElPICovCi0JKCooKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgSU8xRElSKSkgfD0gRU5DX1NQSV9TTEFWRV9DUzsKLQkoKigodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSBJTzFESVIpKSB8PSBFTkNfUkVTRVQ7Ci0KLQkvKiBDUyBhbmQgUkVTRVQgYWN0aXZlIGxvdyAqLwotCVBVVDMyIChJTzFTRVQsIEVOQ19TUElfU0xBVkVfQ1MpOwotCVBVVDMyIChJTzFTRVQsIEVOQ19SRVNFVCk7Ci0KLQlzcGlfaW5pdCAoKTsKLQotCS8qIGluaXRpYWxpemUgY29udHJvbGxlciAqLwotCWVuY1Jlc2V0ICgpOwotCWVuY0luaXQgKGJpcy0+YmlfZW5ldGFkZHIpOwotCi0JbV9uaWNfYmZzIChDVExfUkVHX0VDT04xLCBFTkNfRUNPTjFfUlhFTik7CS8qIGVuYWJsZSByZWNlaXZlICovCi0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGV0aF9zZW5kICh2b2xhdGlsZSB2b2lkICpwYWNrZXQsIGludCBsZW5ndGgpCi17Ci0JLyogY2hlY2sgZnJhbWUgbGVuZ3RoLCBldGMuICovCi0JLyogVE9ETzogKi8KLQotCS8qIHN3aXRjaCB0byBiYW5rIDAgKi8KLQltX25pY19iZmMgKENUTF9SRUdfRUNPTjEsIChFTkNfRUNPTjFfQlNFTDEgfCBFTkNfRUNPTjFfQlNFTDApKTsKLQotCS8qIHNldCBFV1JQVCAqLwotCW1fbmljX3dyaXRlIChDVExfUkVHX0VXUlBUTCwgKEVOQ19UWF9CVUZfU1RBUlQgJiAweGZmKSk7Ci0JbV9uaWNfd3JpdGUgKENUTF9SRUdfRVdSUFRILCAoRU5DX1RYX0JVRl9TVEFSVCA+PiA4KSk7Ci0KLQkvKiBzZXQgRVRYU1QgKi8KLQltX25pY193cml0ZSAoQ1RMX1JFR19FVFhTVEwsIEVOQ19UWF9CVUZfU1RBUlQgJiAweEZGKTsKLQltX25pY193cml0ZSAoQ1RMX1JFR19FVFhTVEgsIEVOQ19UWF9CVUZfU1RBUlQgPj4gOCk7Ci0KLQkvKiB3cml0ZSBwYWNrZXQgKi8KLQltX25pY193cml0ZV9kYXRhIChsZW5ndGgsICh1bnNpZ25lZCBjaGFyICopIHBhY2tldCk7Ci0KLQkvKiBzZXQgRVRYTkQgKi8KLQltX25pY193cml0ZSAoQ1RMX1JFR19FVFhOREwsIChsZW5ndGggKyBFTkNfVFhfQlVGX1NUQVJUKSAmIDB4RkYpOwotCW1fbmljX3dyaXRlIChDVExfUkVHX0VUWE5ESCwgKGxlbmd0aCArIEVOQ19UWF9CVUZfU1RBUlQpID4+IDgpOwotCi0JLyogc2V0IEVDT04xLlRYUlRTICovCi0JbV9uaWNfYmZzIChDVExfUkVHX0VDT04xLCBFTkNfRUNPTjFfVFhSVFMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgcmVjZWl2ZXIgb25seS4gVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGZyb20KLSAqIGludGVycnVwdC1jb250ZXh0LgotICovCi1zdGF0aWMgdm9pZCBlbmNSZWNlaXZlclJlc2V0ICh2b2lkKQotewotCXVuc2lnbmVkIGNoYXIgZWNvbjE7Ci0KLQllY29uMSA9IG1fbmljX3JlYWQgKENUTF9SRUdfRUNPTjEpOwotCWlmICgoZWNvbjEgJiBFTkNfRUNPTjFfUlhSU1QpID09IDApIHsKLQkJbV9uaWNfYmZzIChDVExfUkVHX0VDT04xLCBFTkNfRUNPTjFfUlhSU1QpOwotCQlyeFJlc2V0Q291bnRlciA9IFJYX1JFU0VUX0NPVU5URVI7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHJlY2VpdmVyIHJlc2V0IHRpbWVyCi0gKi8KLXN0YXRpYyB2b2lkIGVuY1JlY2VpdmVyUmVzZXRDYWxsYmFjayAodm9pZCkKLXsKLQltX25pY19iZmMgKENUTF9SRUdfRUNPTjEsIEVOQ19FQ09OMV9SWFJTVCk7Ci0JbV9uaWNfYmZzIChDVExfUkVHX0VDT04xLCBFTkNfRUNPTjFfUlhFTik7CS8qIGVuYWJsZSByZWNlaXZlICovCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENoZWNrIGZvciByZWNlaXZlZCBwYWNrZXRzLiBDYWxsIE5ldFJlY2VpdmUgZm9yIGVhY2ggcGFja2V0LiBUaGUgcmV0dXJuCi0gKiB2YWx1ZSBpcyBpZ25vcmVkIGJ5IHRoZSBjYWxsZXIuCi0gKi8KLWludCBldGhfcnggKHZvaWQpCi17Ci0JaWYgKHJ4UmVzZXRDb3VudGVyID4gMCAmJiAtLXJ4UmVzZXRDb3VudGVyID09IDApIHsKLQkJZW5jUmVjZWl2ZXJSZXNldENhbGxiYWNrICgpOwotCX0KLQotCWVuY1BvbGwgKCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBldGhfaGFsdCAodm9pZCkKLXsKLQltX25pY19iZmMgKENUTF9SRUdfRUNPTjEsIEVOQ19FQ09OMV9SWEVOKTsJLyogZGlzYWJsZSByZWNlaXZlICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgZW5jUG9sbCAodm9pZCkKLXsKLQl1bnNpZ25lZCBjaGFyIGVpcl9yZWc7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciBlc3RhdF9yZWc7Ci0JdW5zaWduZWQgY2hhciBwa3RfY250OwotCi0JLyogY2xlYXIgZ2xvYmFsIGludGVycnVwdCBlbmFibGUgYml0IGluIGVuYzI4ajYwICovCi0JbV9uaWNfYmZjIChDVExfUkVHX0VJRSwgRU5DX0VJRV9JTlRJRSk7Ci0JZXN0YXRfcmVnID0gbV9uaWNfcmVhZCAoQ1RMX1JFR19FU1RBVCk7Ci0KLQllaXJfcmVnID0gbV9uaWNfcmVhZCAoQ1RMX1JFR19FSVIpOwotCi0JaWYgKGVpcl9yZWcgJiBFTkNfRUlSX1RYSUYpIHsKLQkJLyogY2xlYXIgVFhJRiBiaXQgaW4gRUlSICovCi0JCW1fbmljX2JmYyAoQ1RMX1JFR19FSVIsIEVOQ19FSVJfVFhJRik7Ci0JfQotCi0JLyogV2UgaGF2ZSB0byB1c2UgcGt0Y250IGFuZCBub3QgcGt0aWYgYml0LCBzZWUgZXJyYXRhIHB0LiA2ICovCi0KLQkvKiBtb3ZlIHRvIGJhbmsgMSAqLwotCW1fbmljX2JmYyAoQ1RMX1JFR19FQ09OMSwgRU5DX0VDT04xX0JTRUwxKTsKLQltX25pY19iZnMgKENUTF9SRUdfRUNPTjEsIEVOQ19FQ09OMV9CU0VMMCk7Ci0KLQkvKiByZWFkIHBrdGNudCAqLwotCXBrdF9jbnQgPSBtX25pY19yZWFkIChDVExfUkVHX0VQS1RDTlQpOwotCi0JaWYgKHBrdF9jbnQgPiAwKSB7Ci0JCWlmICgoZWlyX3JlZyAmIEVOQ19FSVJfUEtUSUYpID09IDApIHsKLQkJCS8qcHJpbnRmKCJlbmNQb2xsOiBwa3QgY250ID4gMCwgYnV0IHBrdGlmIG5vdCBzZXRcbiIpOyAqLwotCQl9Ci0JCWVuY1J4ICgpOwotCQkvKiBjbGVhciBQS1RJRiBiaXQgaW4gRUlSLCB0aGlzIHNob3VsZCBub3QgbmVlZCB0byBiZSBkb25lIGJ1dCBpdAotCQkgICBzZWVtcyBsaWtlIHdlIGdldCBwcm9ibGVtcyBpZiB3ZSBkbyBub3QgKi8KLQkJbV9uaWNfYmZjIChDVExfUkVHX0VJUiwgRU5DX0VJUl9QS1RJRik7Ci0JfQotCi0JaWYgKGVpcl9yZWcgJiBFTkNfRUlSX1JYRVJJRikgewotCQlwcmludGYgKCJlbmNQb2xsOiByeCBlcnJvclxuIik7Ci0JCW1fbmljX2JmYyAoQ1RMX1JFR19FSVIsIEVOQ19FSVJfUlhFUklGKTsKLQl9Ci0JaWYgKGVpcl9yZWcgJiBFTkNfRUlSX1RYRVJJRikgewotCQlwcmludGYgKCJlbmNQb2xsOiB0eCBlcnJvclxuIik7Ci0JCW1fbmljX2JmYyAoQ1RMX1JFR19FSVIsIEVOQ19FSVJfVFhFUklGKTsKLQl9Ci0KLQkvKiBzZXQgZ2xvYmFsIGludGVycnVwdCBlbmFibGUgYml0IGluIGVuYzI4ajYwICovCi0JbV9uaWNfYmZzIChDVExfUkVHX0VJRSwgRU5DX0VJRV9JTlRJRSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuY1J4ICh2b2lkKQotewotCXVuc2lnbmVkIHNob3J0IHBrdF9sZW47Ci0JdW5zaWduZWQgc2hvcnQgY29weV9sZW47Ci0JdW5zaWduZWQgc2hvcnQgc3RhdHVzOwotCXVuc2lnbmVkIGNoYXIgZWlyX3JlZzsKLQl1bnNpZ25lZCBjaGFyIHBrdF9jbnQgPSAwOwotCi0JLyogc3dpdGNoIHRvIGJhbmsgMCAqLwotCW1fbmljX2JmYyAoQ1RMX1JFR19FQ09OMSwgKEVOQ19FQ09OMV9CU0VMMSB8IEVOQ19FQ09OMV9CU0VMMCkpOwotCi0JbV9uaWNfd3JpdGUgKENUTF9SRUdfRVJEUFRMLCBuZXh0X3BvaW50ZXJfbHNiKTsKLQltX25pY193cml0ZSAoQ1RMX1JFR19FUkRQVEgsIG5leHRfcG9pbnRlcl9tc2IpOwotCi0JZG8gewotCQltX25pY19yZWFkX2RhdGEgKDYsIGJ1ZmZlcik7Ci0JCW5leHRfcG9pbnRlcl9sc2IgPSBidWZmZXJbMF07Ci0JCW5leHRfcG9pbnRlcl9tc2IgPSBidWZmZXJbMV07Ci0JCXBrdF9sZW4gPSBidWZmZXJbMl07Ci0JCXBrdF9sZW4gfD0gKHVuc2lnbmVkIHNob3J0KSBidWZmZXJbM10gPDwgODsKLQkJc3RhdHVzID0gYnVmZmVyWzRdOwotCQlzdGF0dXMgfD0gKHVuc2lnbmVkIHNob3J0KSBidWZmZXJbNV0gPDwgODsKLQotCQlpZiAocGt0X2xlbiA8PSBFTkNfTUFYX0ZSTV9MRU4pIHsKLQkJCWNvcHlfbGVuID0gcGt0X2xlbjsKLQkJfSBlbHNlIHsKLQkJCWNvcHlfbGVuID0gMDsKLQkJCS8qICAgICAgcF9wcml2LT5zdGF0cy5yeF9kcm9wcGVkKys7ICovCi0JCQkvKiB3ZSB3aWxsIGRyb3AgdGhpcyBwYWNrZXQgKi8KLQkJfQotCi0JCWlmICgoc3RhdHVzICYgKDFMIDw8IDcpKSA9PSAwKSB7CS8qIGNoZWNrIFJlY2VpdmVkIE9rIGJpdCAqLwotCQkJY29weV9sZW4gPSAwOwotCQkJLyogICAgICBwX3ByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOyAqLwotCQl9Ci0KLQkJaWYgKGNvcHlfbGVuID4gMCkgewotCQkJbV9uaWNfcmVhZF9kYXRhIChjb3B5X2xlbiwgYnVmZmVyKTsKLQkJfQotCi0JCS8qIGFkdmFuY2UgcmVhZCBwb2ludGVyIHRvIG5leHQgcG9pbnRlciAqLwotCQltX25pY193cml0ZSAoQ1RMX1JFR19FUkRQVEwsIG5leHRfcG9pbnRlcl9sc2IpOwotCQltX25pY193cml0ZSAoQ1RMX1JFR19FUkRQVEgsIG5leHRfcG9pbnRlcl9tc2IpOwotCi0JCS8qIGRlY3JlYXNlIHBhY2tldCBjb3VudGVyICovCi0JCW1fbmljX2JmcyAoQ1RMX1JFR19FQ09OMiwgRU5DX0VDT04yX1BLVERFQyk7Ci0KLQkJLyogbW92ZSB0byBiYW5rIDEgKi8KLQkJbV9uaWNfYmZjIChDVExfUkVHX0VDT04xLCBFTkNfRUNPTjFfQlNFTDEpOwotCQltX25pY19iZnMgKENUTF9SRUdfRUNPTjEsIEVOQ19FQ09OMV9CU0VMMCk7Ci0KLQkJLyogcmVhZCBwa3RjbnQgKi8KLQkJcGt0X2NudCA9IG1fbmljX3JlYWQgKENUTF9SRUdfRVBLVENOVCk7Ci0KLQkJLyogc3dpdGNoIHRvIGJhbmsgMCAqLwotCQltX25pY19iZmMgKENUTF9SRUdfRUNPTjEsCi0JCQkgICAoRU5DX0VDT04xX0JTRUwxIHwgRU5DX0VDT04xX0JTRUwwKSk7Ci0KLQkJaWYgKGNvcHlfbGVuID09IDApIHsKLQkJCWVpcl9yZWcgPSBtX25pY19yZWFkIChDVExfUkVHX0VJUik7Ci0JCQllbmNSZWNlaXZlclJlc2V0ICgpOwotCQkJcHJpbnRmICgiZXRoX3J4OiBjb3B5X2xlbj0wXG4iKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJTmV0UmVjZWl2ZSAoKHVuc2lnbmVkIGNoYXIgKikgYnVmZmVyLCBwa3RfbGVuKTsKLQotCQllaXJfcmVnID0gbV9uaWNfcmVhZCAoQ1RMX1JFR19FSVIpOwotCX0gd2hpbGUgKHBrdF9jbnQpOwkvKiBVc2UgRVBLVENOVCBub3QgRUlSLlBLVElGIGZsYWcsIHNlZSBlcnJhdGEgcHQuIDYgKi8KLQltX25pY193cml0ZSAoQ1RMX1JFR19FUlhSRFBUTCwgbmV4dF9wb2ludGVyX2xzYik7Ci0JbV9uaWNfd3JpdGUgKENUTF9SRUdfRVJYUkRQVEgsIG5leHRfcG9pbnRlcl9tc2IpOwotfQotCi1zdGF0aWMgdm9pZCBlbmNXcml0ZVJlZyAodW5zaWduZWQgY2hhciByZWdObywgdW5zaWduZWQgY2hhciBkYXRhKQotewotCXNwaV9sb2NrICgpOwotCWVuY19jZmdfc3BpICgpOwotCWVuY19lbmFibGUgKCk7Ci0KLQlzcGlfd3JpdGUgKDB4NDAgfCByZWdObyk7CS8qIHdyaXRlIGluIHJlZ05vICovCi0Jc3BpX3dyaXRlIChkYXRhKTsKLQotCWVuY19kaXNhYmxlICgpOwotCWVuY19lbmFibGUgKCk7Ci0KLQlzcGlfd3JpdGUgKDB4MWYpOwkvKiB3cml0ZSByZWcgMHgxZiAqLwotCi0JZW5jX2Rpc2FibGUgKCk7Ci0Jc3BpX3VubG9jayAoKTsKLX0KLQotc3RhdGljIHZvaWQgZW5jV3JpdGVSZWdSZXRyeSAodW5zaWduZWQgY2hhciByZWdObywgdW5zaWduZWQgY2hhciBkYXRhLCBpbnQgYykKLXsKLQl1bnNpZ25lZCBjaGFyIHJlYWRiYWNrOwotCWludCBpOwotCi0Jc3BpX2xvY2sgKCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKSB7Ci0JCWVuY19jZmdfc3BpICgpOwotCQllbmNfZW5hYmxlICgpOwotCi0JCXNwaV93cml0ZSAoMHg0MCB8IHJlZ05vKTsJLyogd3JpdGUgaW4gcmVnTm8gKi8KLQkJc3BpX3dyaXRlIChkYXRhKTsKLQotCQllbmNfZGlzYWJsZSAoKTsKLQkJZW5jX2VuYWJsZSAoKTsKLQotCQlzcGlfd3JpdGUgKDB4MWYpOwkvKiB3cml0ZSByZWcgMHgxZiAqLwotCi0JCWVuY19kaXNhYmxlICgpOwotCi0JCXNwaV91bmxvY2sgKCk7CS8qIHdlIG11c3QgdW5sb2NrIHNwaSBmaXJzdCAqLwotCi0JCXJlYWRiYWNrID0gZW5jUmVhZFJlZyAocmVnTm8pOwotCi0JCXNwaV9sb2NrICgpOwotCi0JCWlmIChyZWFkYmFjayA9PSBkYXRhKQotCQkJYnJlYWs7Ci0JfQotCXNwaV91bmxvY2sgKCk7Ci0KLQlpZiAoaSA9PSBjKSB7Ci0JCXByaW50ZiAoImVuYzI4ajYwOiB3cml0ZSByZWcgJWQgZmFpbGVkXG4iLCByZWdObyk7Ci0JfQotfQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBlbmNSZWFkUmVnICh1bnNpZ25lZCBjaGFyIHJlZ05vKQotewotCXVuc2lnbmVkIGNoYXIgcnhCeXRlOwotCi0Jc3BpX2xvY2sgKCk7Ci0JZW5jX2NmZ19zcGkgKCk7Ci0JZW5jX2VuYWJsZSAoKTsKLQotCXNwaV93cml0ZSAoMHgxZik7CS8qIHJlYWQgcmVnIDB4MWYgKi8KLQotCWJhbmsgPSBzcGlfcmVhZCAoKSAmIDB4MzsKLQotCWVuY19kaXNhYmxlICgpOwotCWVuY19lbmFibGUgKCk7Ci0KLQlzcGlfd3JpdGUgKHJlZ05vKTsKLQlyeEJ5dGUgPSBzcGlfcmVhZCAoKTsKLQotCS8qIGNoZWNrIGlmIE1BQyBvciBNSUkgcmVnaXN0ZXIgKi8KLQlpZiAoKChiYW5rID09IDIpICYmIChyZWdObyA8PSAweDFhKSkgfHwKLQkgICAgKChiYW5rID09IDMpICYmIChyZWdObyA8PSAweDA1IHx8IHJlZ05vID09IDB4MGEpKSkgewotCQkvKiBpZ25vcmUgZmlyc3QgYnl0ZSBhbmQgcmVhZCBhbm90aGVyIGJ5dGUgKi8KLQkJcnhCeXRlID0gc3BpX3JlYWQgKCk7Ci0JfQotCi0JZW5jX2Rpc2FibGUgKCk7Ci0Jc3BpX3VubG9jayAoKTsKLQotCXJldHVybiByeEJ5dGU7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuY1JlYWRCdWZmICh1bnNpZ25lZCBzaG9ydCBsZW5ndGgsIHVuc2lnbmVkIGNoYXIgKnBCdWZmKQotewotCXNwaV9sb2NrICgpOwotCWVuY19jZmdfc3BpICgpOwotCWVuY19lbmFibGUgKCk7Ci0KLQlzcGlfd3JpdGUgKDB4MjAgfCAweDFhKTsJLyogcmVhZCBidWZmZXIgbWVtb3J5ICovCi0KLQl3aGlsZSAobGVuZ3RoLS0pIHsKLQkJaWYgKHBCdWZmICE9IE5VTEwpCi0JCQkqcEJ1ZmYrKyA9IHNwaV9yZWFkICgpOwotCQllbHNlCi0JCQlzcGlfd3JpdGUgKDApOwotCX0KLQotCWVuY19kaXNhYmxlICgpOwotCXNwaV91bmxvY2sgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuY1dyaXRlQnVmZiAodW5zaWduZWQgc2hvcnQgbGVuZ3RoLCB1bnNpZ25lZCBjaGFyICpwQnVmZikKLXsKLQlzcGlfbG9jayAoKTsKLQllbmNfY2ZnX3NwaSAoKTsKLQllbmNfZW5hYmxlICgpOwotCi0Jc3BpX3dyaXRlICgweDYwIHwgMHgxYSk7CS8qIHdyaXRlIGJ1ZmZlciBtZW1vcnkgKi8KLQotCXNwaV93cml0ZSAoMHgwMCk7CS8qIGNvbnRyb2wgYnl0ZSAqLwotCi0Jd2hpbGUgKGxlbmd0aC0tKQotCQlzcGlfd3JpdGUgKCpwQnVmZisrKTsKLQotCWVuY19kaXNhYmxlICgpOwotCXNwaV91bmxvY2sgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuY0JpdFNldCAodW5zaWduZWQgY2hhciByZWdObywgdW5zaWduZWQgY2hhciBkYXRhKQotewotCXNwaV9sb2NrICgpOwotCWVuY19jZmdfc3BpICgpOwotCWVuY19lbmFibGUgKCk7Ci0KLQlzcGlfd3JpdGUgKDB4ODAgfCByZWdObyk7CS8qIGJpdCBmaWVsZCBzZXQgKi8KLQlzcGlfd3JpdGUgKGRhdGEpOwotCi0JZW5jX2Rpc2FibGUgKCk7Ci0Jc3BpX3VubG9jayAoKTsKLX0KLQotc3RhdGljIHZvaWQgZW5jQml0Q2xyICh1bnNpZ25lZCBjaGFyIHJlZ05vLCB1bnNpZ25lZCBjaGFyIGRhdGEpCi17Ci0Jc3BpX2xvY2sgKCk7Ci0JZW5jX2NmZ19zcGkgKCk7Ci0JZW5jX2VuYWJsZSAoKTsKLQotCXNwaV93cml0ZSAoMHhBMCB8IHJlZ05vKTsJLyogYml0IGZpZWxkIGNsZWFyICovCi0Jc3BpX3dyaXRlIChkYXRhKTsKLQotCWVuY19kaXNhYmxlICgpOwotCXNwaV91bmxvY2sgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuY1Jlc2V0ICh2b2lkKQotewotCXNwaV9sb2NrICgpOwotCWVuY19jZmdfc3BpICgpOwotCWVuY19lbmFibGUgKCk7Ci0KLQlzcGlfd3JpdGUgKDB4ZmYpOwkvKiBzb2Z0IHJlc2V0ICovCi0KLQllbmNfZGlzYWJsZSAoKTsKLQlzcGlfdW5sb2NrICgpOwotCi0JLyogc2xlZXAgMSBtcy4gU2VlIGVycmF0YSBwdC4gMiAqLwotCXVkZWxheSAoMTAwMCk7Ci0KLSNpZiAwCi0JKCooKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgSU8xQ0xSKSkgJj0gRU5DX1JFU0VUOwotCW1kZWxheSAoNSk7Ci0JKCooKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgSU8xU0VUKSkgJj0gRU5DX1JFU0VUOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIGVuY0luaXQgKHVuc2lnbmVkIGNoYXIgKnBFdGhBZGRyKQotewotCXVuc2lnbmVkIHNob3J0IHBoaWQxID0gMDsKLQl1bnNpZ25lZCBzaG9ydCBwaGlkMiA9IDA7Ci0KLQkvKiBzd2l0Y2ggdG8gYmFuayAwICovCi0JbV9uaWNfYmZjIChDVExfUkVHX0VDT04xLCAoRU5DX0VDT04xX0JTRUwxIHwgRU5DX0VDT04xX0JTRUwwKSk7Ci0KLQkvKgotCSAqIFNldHVwIHRoZSBidWZmZXIgc3BhY2UuIFRoZSByZXNldCB2YWx1ZXMgYXJlIHZhbGlkIGZvciB0aGUKLQkgKiBvdGhlciBwb2ludGVycy4KLQkgKi8KLSNpZiAwCi0JLyogV2Ugc2hhbGwgbm90IHdyaXRlIHRvIEVSWFNULCBzZWUgZXJyYXRhIHB0LiA1LiBJbnN0ZWFkIHdlCi0JICAgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCBFTkNfUlhfQlVTX1NUQVJUIGlzIDAuICovCi0JbV9uaWNfd3JpdGVfcmV0cnkgKENUTF9SRUdfRVJYU1RMLCAoRU5DX1JYX0JVRl9TVEFSVCAmIDB4RkYpLCAxKTsKLQltX25pY193cml0ZV9yZXRyeSAoQ1RMX1JFR19FUlhTVEgsIChFTkNfUlhfQlVGX1NUQVJUID4+IDgpLCAxKTsKLSNlbmRpZgotCW1fbmljX3dyaXRlX3JldHJ5IChDVExfUkVHX0VSRFBUTCwgKEVOQ19SWF9CVUZfU1RBUlQgJiAweEZGKSwgMSk7Ci0JbV9uaWNfd3JpdGVfcmV0cnkgKENUTF9SRUdfRVJEUFRILCAoRU5DX1JYX0JVRl9TVEFSVCA+PiA4KSwgMSk7Ci0KLQluZXh0X3BvaW50ZXJfbHNiID0gKEVOQ19SWF9CVUZfU1RBUlQgJiAweEZGKTsKLQluZXh0X3BvaW50ZXJfbXNiID0gKEVOQ19SWF9CVUZfU1RBUlQgPj4gOCk7Ci0KLQkvKgotCSAqIEZvciB0cmFja2luZyBwdXJwb3NlcywgdGhlIEVSWFJEUFQgcmVnaXN0ZXJzIHNob3VsZCBiZSBwcm9ncmFtbWVkIHdpdGgKLQkgKiB0aGUgc2FtZSB2YWx1ZS4gVGhpcyBpcyB0aGUgcmVhZCBwb2ludGVyLgotCSAqLwotCW1fbmljX3dyaXRlIChDVExfUkVHX0VSWFJEUFRMLCAoRU5DX1JYX0JVRl9TVEFSVCAmIDB4RkYpKTsKLQltX25pY193cml0ZV9yZXRyeSAoQ1RMX1JFR19FUlhSRFBUSCwgKEVOQ19SWF9CVUZfU1RBUlQgPj4gOCksIDEpOwotCi0JLyogU2V0dXAgcmVjZWl2ZSBmaWx0ZXJzLiAqLwotCi0JLyogbW92ZSB0byBiYW5rIDEgKi8KLQltX25pY19iZmMgKENUTF9SRUdfRUNPTjEsIEVOQ19FQ09OMV9CU0VMMSk7Ci0JbV9uaWNfYmZzIChDVExfUkVHX0VDT04xLCBFTkNfRUNPTjFfQlNFTDApOwotCi0JLyogT1ItZmlsdGVyaW5nLCBVbmljYXN0LCBDUkMtY2hlY2sgYW5kIGJyb2FkY2FzdCAqLwotCW1fbmljX3dyaXRlX3JldHJ5IChDVExfUkVHX0VSWEZDT04sCi0JCQkgICAoRU5DX1JGUl9VQ0VOIHwgRU5DX1JGUl9DUkNFTiB8IEVOQ19SRlJfQkNFTiksIDEpOwotCi0JLyogV2FpdCBmb3IgT3NjaWxsYXRvciBTdGFydC11cCBUaW1lciAoT1NUKS4gKi8KLQl3aGlsZSAoKG1fbmljX3JlYWQgKENUTF9SRUdfRVNUQVQpICYgRU5DX0VTVEFUX0NMS1JEWSkgPT0gMCkgewotCQlzdGF0aWMgaW50IGNudCA9IDA7Ci0KLQkJaWYgKGNudCsrID49IDEwMDApIHsKLQkJCWNudCA9IDA7Ci0JCX0KLQl9Ci0KLQkvKiB2ZXJpZnkgaWRlbnRpZmljYXRpb24gKi8KLQlwaGlkMSA9IHBoeVJlYWQgKFBIWV9SRUdfUEhJRDEpOwotCXBoaWQyID0gcGh5UmVhZCAoUEhZX1JFR19QSElEMik7Ci0KLQlpZiAocGhpZDEgIT0gRU5DX1BISUQxX1ZBTFVFCi0JICAgIHx8IChwaGlkMiAmIEVOQ19QSElEMl9NQVNLKSAhPSBFTkNfUEhJRDJfVkFMVUUpIHsKLQkJcHJpbnRmICgiRVJST1I6IGZhaWxlZCB0byBpZGVudGlmeSBjb250cm9sbGVyXG4iKTsKLQkJcHJpbnRmICgicGhpZDEgPSAleCwgcGhpZDIgPSAleFxuIiwKLQkJCXBoaWQxLCAocGhpZDIgJiBFTkNfUEhJRDJfTUFTSykpOwotCQlwcmludGYgKCJzaG91bGQgYmUgcGhpZDEgPSAleCwgcGhpZDIgPSAleFxuIiwKLQkJCUVOQ19QSElEMV9WQUxVRSwgRU5DX1BISUQyX1ZBTFVFKTsKLQl9Ci0KLQkvKgotCSAqIC0tLSBNQUMgSW5pdGlhbGl6YXRpb24gLS0tCi0JICovCi0KLQkvKiBQdWxsIE1BQyBvdXQgb2YgUmVzZXQgKi8KLQotCS8qIHN3aXRjaCB0byBiYW5rIDIgKi8KLQltX25pY19iZmMgKENUTF9SRUdfRUNPTjEsIEVOQ19FQ09OMV9CU0VMMCk7Ci0JbV9uaWNfYmZzIChDVExfUkVHX0VDT04xLCBFTkNfRUNPTjFfQlNFTDEpOwotCS8qIGNsZWFyIE1BQyByZXNldCBiaXRzICovCi0JbV9uaWNfd3JpdGVfcmV0cnkgKENUTF9SRUdfTUFDT04yLCAwLCAxKTsKLQotCS8qIGVuYWJsZSBNQUMgdG8gcmVjZWl2ZSBmcmFtZXMgKi8KLQltX25pY193cml0ZV9yZXRyeSAoQ1RMX1JFR19NQUNPTjEsIEVOQ19NQUNPTjFfTUFSWEVOLCAxMCk7Ci0KLQkvKiBjb25maWd1cmUgcGFkLCB0eC1jcmMgYW5kIGR1cGxleCAqLwotCS8qIFRPRE8gbWF5YmUgZW5hYmxlIEZSTUxORU4gKi8KLQltX25pY193cml0ZV9yZXRyeSAoQ1RMX1JFR19NQUNPTjMsCi0JCQkgICAoRU5DX01BQ09OM19QQURDRkcwIHwgRU5DX01BQ09OM19UWENSQ0VOKSwgMTApOwotCi0JLyogc2V0IG1heGltdW0gZnJhbWUgbGVuZ3RoICovCi0JbV9uaWNfd3JpdGVfcmV0cnkgKENUTF9SRUdfTUFNWEZMTCwgKEVOQ19NQVhfRlJNX0xFTiAmIDB4ZmYpLCAxMCk7Ci0JbV9uaWNfd3JpdGVfcmV0cnkgKENUTF9SRUdfTUFNWEZMSCwgKEVOQ19NQVhfRlJNX0xFTiA+PiA4KSwgMTApOwotCi0JLyoKLQkgKiBTZXQgTUFDIGJhY2stdG8tYmFjayBpbnRlci1wYWNrZXQgZ2FwLiBSZWNvbW1lbmRlZCAweDEyIGZvciBoYWxmIGR1cGxleAotCSAqIGFuZCAweDE1IGZvciBmdWxsIGR1cGxleC4KLQkgKi8KLQltX25pY193cml0ZV9yZXRyeSAoQ1RMX1JFR19NQUJCSVBHLCAweDEyLCAxMCk7Ci0KLQkvKiBTZXQgKGxvdyBieXRlKSBOb24tQmFjay10b19CYWNrIEludGVyLVBhY2tldCBHYXAuIFJlY29tbWVuZGVkIDB4MTIgKi8KLQltX25pY193cml0ZV9yZXRyeSAoQ1RMX1JFR19NQUlQR0wsIDB4MTIsIDEwKTsKLQotCS8qCi0JICogU2V0IChoaWdoIGJ5dGUpIE5vbi1CYWNrLXRvX0JhY2sgSW50ZXItUGFja2V0IEdhcC4gUmVjb21tZW5kZWQKLQkgKiAweDBjIGZvciBoYWxmLWR1cGxleC4gTm90aGluZyBmb3IgZnVsbC1kdXBsZXgKLQkgKi8KLQltX25pY193cml0ZV9yZXRyeSAoQ1RMX1JFR19NQUlQR0gsIDB4MEMsIDEwKTsKLQotCS8qIHNldCBNQUMgYWRkcmVzcyAqLwotCi0JLyogc3dpdGNoIHRvIGJhbmsgMyAqLwotCW1fbmljX2JmcyAoQ1RMX1JFR19FQ09OMSwgKEVOQ19FQ09OMV9CU0VMMCB8IEVOQ19FQ09OMV9CU0VMMSkpOwotCi0JbV9uaWNfd3JpdGVfcmV0cnkgKENUTF9SRUdfTUFBRFIwLCBwRXRoQWRkcls1XSwgMSk7Ci0JbV9uaWNfd3JpdGVfcmV0cnkgKENUTF9SRUdfTUFBRFIxLCBwRXRoQWRkcls0XSwgMSk7Ci0JbV9uaWNfd3JpdGVfcmV0cnkgKENUTF9SRUdfTUFBRFIyLCBwRXRoQWRkclszXSwgMSk7Ci0JbV9uaWNfd3JpdGVfcmV0cnkgKENUTF9SRUdfTUFBRFIzLCBwRXRoQWRkclsyXSwgMSk7Ci0JbV9uaWNfd3JpdGVfcmV0cnkgKENUTF9SRUdfTUFBRFI0LCBwRXRoQWRkclsxXSwgMSk7Ci0JbV9uaWNfd3JpdGVfcmV0cnkgKENUTF9SRUdfTUFBRFI1LCBwRXRoQWRkclswXSwgMSk7Ci0KLQkvKgotCSAqIFJlY2VpdmUgc2V0dGluZ3MKLQkgKi8KLQotCS8qIGF1dG8taW5jcmVtZW50IFJYLXBvaW50ZXIgd2hlbiByZWFkaW5nIGEgcmVjZWl2ZWQgcGFja2V0ICovCi0JbV9uaWNfYmZzIChDVExfUkVHX0VDT04yLCBFTkNfRUNPTjJfQVVUT0lOQyk7Ci0KLQkvKiBlbmFibGUgaW50ZXJydXB0cyAqLwotCW1fbmljX2JmcyAoQ1RMX1JFR19FSUUsIEVOQ19FSUVfUEtUSUUpOwotCW1fbmljX2JmcyAoQ1RMX1JFR19FSUUsIEVOQ19FSUVfVFhJRSk7Ci0JbV9uaWNfYmZzIChDVExfUkVHX0VJRSwgRU5DX0VJRV9SWEVSSUUpOwotCW1fbmljX2JmcyAoQ1RMX1JFR19FSUUsIEVOQ19FSUVfVFhFUklFKTsKLQltX25pY19iZnMgKENUTF9SRUdfRUlFLCBFTkNfRUlFX0lOVElFKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgICBSZWFkIFBIWSByZWdpc3RlcnMuCi0gKgotICogICAgTk9URSEgVGhpcyBmdW5jdGlvbiB3aWxsIGNoYW5nZSB0byBCYW5rIDIuCi0gKgotICogUGFyYW1zOgotICogICAgW2luXSBhZGRyIGFkZHJlc3Mgb2YgdGhlIHJlZ2lzdGVyIHRvIHJlYWQKLSAqCi0gKiBSZXR1cm5zOgotICogICAgVGhlIHZhbHVlIGluIHRoZSByZWdpc3RlcgotICovCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgcGh5UmVhZCAodW5zaWduZWQgY2hhciBhZGRyKQotewotCXVuc2lnbmVkIHNob3J0IHJldCA9IDA7Ci0KLQkvKiBtb3ZlIHRvIGJhbmsgMiAqLwotCW1fbmljX2JmYyAoQ1RMX1JFR19FQ09OMSwgRU5DX0VDT04xX0JTRUwwKTsKLQltX25pY19iZnMgKENUTF9SRUdfRUNPTjEsIEVOQ19FQ09OMV9CU0VMMSk7Ci0KLQkvKiB3cml0ZSBhZGRyZXNzIHRvIE1JUkVHQURSICovCi0JbV9uaWNfd3JpdGUgKENUTF9SRUdfTUlSRUdBRFIsIGFkZHIpOwotCi0JLyogc2V0IE1JQ01ELk1JSVJEICovCi0JbV9uaWNfd3JpdGUgKENUTF9SRUdfTUlDTUQsIEVOQ19NSUNNRF9NSUlSRCk7Ci0KLQkvKiBwb2xsIE1JU1RBVC5CVVNZIGJpdCB1bnRpbCBvcGVyYXRpb24gaXMgY29tcGxldGUgKi8KLQl3aGlsZSAoKG1fbmljX3JlYWQgKENUTF9SRUdfTUlTVEFUKSAmIEVOQ19NSVNUQVRfQlVTWSkgIT0gMCkgewotCQlzdGF0aWMgaW50IGNudCA9IDA7Ci0KLQkJaWYgKGNudCsrID49IDEwMDApIHsKLQkJCS8qIEdKIC0gdGhpcyBzZWVtcyBleHRyZW1lbHkgZGFuZ2Vyb3VzISAqLwotCQkJLyogcHJpbnRmKCIjIik7ICovCi0JCQljbnQgPSAwOwotCQl9Ci0JfQotCi0JLyogY2xlYXIgTUlDTUQuTUlJUkQgKi8KLQltX25pY193cml0ZSAoQ1RMX1JFR19NSUNNRCwgMCk7Ci0KLQlyZXQgPSAobV9uaWNfcmVhZCAoQ1RMX1JFR19NSVJESCkgPDwgOCk7Ci0JcmV0IHw9IChtX25pY19yZWFkIChDVExfUkVHX01JUkRMKSAmIDB4RkYpOwotCi0JcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL2xwYzIyOTJzb2RpbW0vZmxhc2guYyBiL2JvYXJkL2xwYzIyOTJzb2RpbW0vZmxhc2guYwppbmRleCA1NWFhYWJmLi4wZmIwODQzIDEwMDY0NAotLS0gYS9ib2FyZC9scGMyMjkyc29kaW1tL2ZsYXNoLmMKKysrIGIvYm9hcmQvbHBjMjI5MnNvZGltbS9mbGFzaC5jCkBAIC0xLDYgKzEsOSBAQAogLyoKICAqIChDKSBDb3B5cmlnaHQgMjAwNiBFbWJlZGRlZCBBcnRpc3RzIEFCIDx3d3cuZW1iZWRkZWRhcnRpc3RzLmNvbT4KICAqCisgKiBNb2RpZmllZCB0byB1c2UgdGhlIHJvdXRpbmVzIGluIGNwdS9hcm03MjB0L2xwYzIyOTIvZmxhc2guYyBieQorICogR2FyeSBKZW5uZWpvaG4gPGdhcnlqQGRlbngsZGU+CisgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCkBAIC0yMCw4NCArMjMsMTYgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgogCi0vKiBJQVAgY29tbWFuZHMgdXNlIDMyIGJ5dGVzIGF0IHRoZSB0b3Agb2YgQ1BVIGludGVybmFsIHNyYW0sIHdlCi0gICB1c2UgNTEyIGJ5dGVzIGJlbG93IHRoYXQgKi8KLSNkZWZpbmUgQ09QWV9CVUZGRVJfTE9DQVRJT04gMHg0MDAwM2RlMAotCi0jZGVmaW5lIElBUF9MT0NBVElPTiAweDdmZmZmZmYxCi0jZGVmaW5lIElBUF9DTURfUFJFUEFSRSA1MAotI2RlZmluZSBJQVBfQ01EX0NPUFkgNTEKLSNkZWZpbmUgSUFQX0NNRF9FUkFTRSA1MgotI2RlZmluZSBJQVBfQ01EX0NIRUNLIDUzCi0jZGVmaW5lIElBUF9DTURfSUQgNTQKLSNkZWZpbmUgSUFQX0NNRF9WRVJTSU9OIDU1Ci0jZGVmaW5lIElBUF9DTURfQ09NUEFSRSA1NgotCi0jZGVmaW5lIElBUF9SRVRfQ01EX1NVQ0NFU1MgMAotCiAjZGVmaW5lIFNTVF9CQVNFQUREUiAweDgwMDAwMDAwCiAjZGVmaW5lIFNTVF9BRERSMSAoKHZvbGF0aWxlIHVzaG9ydCopKFNTVF9CQVNFQUREUiArICgweDU1NTUgPDwgMSkpKQogI2RlZmluZSBTU1RfQUREUjIgKCh2b2xhdGlsZSB1c2hvcnQqKShTU1RfQkFTRUFERFIgKyAoMHgyQUFBIDw8IDEpKSkKIAogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjb21tYW5kWzVdOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVzdWx0WzJdOwotCiBmbGFzaF9pbmZvX3QgZmxhc2hfaW5mb1tDRkdfTUFYX0ZMQVNIX0JBTktTXTsKIAotZXh0ZXJuIHZvaWQgaWFwX2VudHJ5KHVuc2lnbmVkIGxvbmcgKiBjb21tYW5kLCB1bnNpZ25lZCBsb25nICogcmVzdWx0KTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqLwotaW50IGdldF9mbGFzaF9zZWN0b3IoZmxhc2hfaW5mb190ICogaW5mbywgdWxvbmcgZmxhc2hfYWRkcikKLXsKLQlpbnQgaTsKLQotCWZvcihpPTE7IGkgPCAoaW5mby0+c2VjdG9yX2NvdW50KTsgaSsrKSB7Ci0JCWlmIChmbGFzaF9hZGRyIDwgKGluZm8tPnN0YXJ0W2ldKSkKLQkJCWJyZWFrOwotCX0KLQotCXJldHVybiAoaS0xKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgZmxhc2hfYWRkciBpcyBhbGlnbmVkIG9uIDUxMiBieXRlcyBib3VuZGFyeQotICogaW4gZmxhc2guIFRoaXMgZnVuY3Rpb24gYWxzbyBhc3N1bWVzIHRoYXQgcHJlcGFyZSBoYXZlIGJlZW4gY2FsbGVkCi0gKiBmb3IgdGhlIHNlY3RvciBpbiBxdWVzdGlvbi4KLSAqLwotaW50IGNvcHlfYnVmZmVyX3RvX2ZsYXNoKGZsYXNoX2luZm9fdCAqIGluZm8sIHVsb25nIGZsYXNoX2FkZHIpCi17Ci0JaW50IGZpcnN0X3NlY3RvcjsKLQlpbnQgbGFzdF9zZWN0b3I7Ci0KLQlmaXJzdF9zZWN0b3IgPSBnZXRfZmxhc2hfc2VjdG9yKGluZm8sIGZsYXNoX2FkZHIpOwotCWxhc3Rfc2VjdG9yID0gZ2V0X2ZsYXNoX3NlY3RvcihpbmZvLCBmbGFzaF9hZGRyICsgNTEyIC0gMSk7Ci0KLQkvKiBwcmVwYXJlIHNlY3RvcnMgZm9yIHdyaXRlICovCi0JY29tbWFuZFswXSA9IElBUF9DTURfUFJFUEFSRTsKLQljb21tYW5kWzFdID0gZmlyc3Rfc2VjdG9yOwotCWNvbW1hbmRbMl0gPSBsYXN0X3NlY3RvcjsKLQlpYXBfZW50cnkoY29tbWFuZCwgcmVzdWx0KTsKLQlpZiAocmVzdWx0WzBdICE9IElBUF9SRVRfQ01EX1NVQ0NFU1MpIHsKLQkJcHJpbnRmKCJJQVAgcHJlcGFyZSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gRVJSX1BST0dfRVJST1I7Ci0JfQotCi0JY29tbWFuZFswXSA9IElBUF9DTURfQ09QWTsKLQljb21tYW5kWzFdID0gZmxhc2hfYWRkcjsKLQljb21tYW5kWzJdID0gQ09QWV9CVUZGRVJfTE9DQVRJT047Ci0JY29tbWFuZFszXSA9IDUxMjsKLQljb21tYW5kWzRdID0gQ0ZHX1NZU19DTEtfRlJFUSA+PiAxMDsKLQlpYXBfZW50cnkoY29tbWFuZCwgcmVzdWx0KTsKLQlpZiAocmVzdWx0WzBdICE9IElBUF9SRVRfQ01EX1NVQ0NFU1MpIHsKLQkJcHJpbnRmKCJJQVAgY29weSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KK2V4dGVybiBpbnQgbHBjMjI5Ml9jb3B5X2J1ZmZlcl90b19mbGFzaChmbGFzaF9pbmZvX3QgKiwgdWxvbmcpOworZXh0ZXJuIGludCBscGMyMjkyX2ZsYXNoX2VyYXNlKGZsYXNoX2luZm9fdCAqLCBpbnQsIGludCk7CitleHRlcm4gaW50IGxwYzIyOTJfd3JpdGVfYnVmZiAoZmxhc2hfaW5mb190ICosIHVjaGFyICosIHVsb25nLCB1bG9uZyk7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqCkBAIC0yMjAsNTYgKzE1NSw2IEBACiAJcHJpbnRmICgiXG4iKTsKIH0KIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLWludCBmbGFzaF9lcmFzZV9waGlsaXBzIChmbGFzaF9pbmZvX3QgKiBpbmZvLCBpbnQgc19maXJzdCwgaW50IHNfbGFzdCkKLXsKLQlpbnQgZmxhZzsKLQlpbnQgcHJvdDsKLQlpbnQgc2VjdDsKLQotCXByb3QgPSAwOwotCWZvciAoc2VjdCA9IHNfZmlyc3Q7IHNlY3QgPD0gc19sYXN0OyArK3NlY3QpIHsKLQkJaWYgKGluZm8tPnByb3RlY3Rbc2VjdF0pIHsKLQkJCXByb3QrKzsKLQkJfQotCX0KLQlpZiAocHJvdCkKLQkJcmV0dXJuIEVSUl9QUk9URUNURUQ7Ci0KLQotCWZsYWcgPSBkaXNhYmxlX2ludGVycnVwdHMoKTsKLQotCXByaW50ZiAoIkVyYXNpbmcgJWQgc2VjdG9ycyBzdGFydGluZyBhdCBzZWN0b3IgJTJkLlxuIgotCSJUaGlzIG1ha2UgdGFrZSBzb21lIHRpbWUgLi4uICIsCi0Jc19sYXN0IC0gc19maXJzdCArIDEsIHNfZmlyc3QpOwotCi0JY29tbWFuZFswXSA9IElBUF9DTURfUFJFUEFSRTsKLQljb21tYW5kWzFdID0gc19maXJzdDsKLQljb21tYW5kWzJdID0gc19sYXN0OwotCWlhcF9lbnRyeShjb21tYW5kLCByZXN1bHQpOwotCWlmIChyZXN1bHRbMF0gIT0gSUFQX1JFVF9DTURfU1VDQ0VTUykgewotCQlwcmludGYoIklBUCBwcmVwYXJlIGZhaWxlZFxuIik7Ci0JCXJldHVybiBFUlJfUFJPVEVDVEVEOwotCX0KLQotCWNvbW1hbmRbMF0gPSBJQVBfQ01EX0VSQVNFOwotCWNvbW1hbmRbMV0gPSBzX2ZpcnN0OwotCWNvbW1hbmRbMl0gPSBzX2xhc3Q7Ci0JY29tbWFuZFszXSA9IENGR19TWVNfQ0xLX0ZSRVEgPj4gMTA7Ci0JaWFwX2VudHJ5KGNvbW1hbmQsIHJlc3VsdCk7Ci0JaWYgKHJlc3VsdFswXSAhPSBJQVBfUkVUX0NNRF9TVUNDRVNTKSB7Ci0JCXByaW50ZigiSUFQIGVyYXNlIGZhaWxlZFxuIik7Ci0JCXJldHVybiBFUlJfUFJPVEVDVEVEOwotCX0KLQotCWlmIChmbGFnKQotCQllbmFibGVfaW50ZXJydXB0cygpOwotCi0JcmV0dXJuIEVSUl9PSzsKLX0KLQogaW50IGZsYXNoX2VyYXNlX3NzdCAoZmxhc2hfaW5mb190ICogaW5mbywgaW50IHNfZmlyc3QsIGludCBzX2xhc3QpCiB7CiAJaW50IGk7CkBAIC0yOTQsNyArMTc5LDcgQEAKIAkJY2FzZSAoU1NUX01BTlVGQUNUICYgRkxBU0hfVkVORE1BU0spOgogCQkJcmV0dXJuIGZsYXNoX2VyYXNlX3NzdChpbmZvLCBzX2ZpcnN0LCBzX2xhc3QpOwogCQljYXNlIChQSElMSVBTX0xQQzIyOTIgJiBGTEFTSF9WRU5ETUFTSyk6Ci0JCQlyZXR1cm4gZmxhc2hfZXJhc2VfcGhpbGlwcyhpbmZvLCBzX2ZpcnN0LCBzX2xhc3QpOworCQkJcmV0dXJuIGxwYzIyOTJfZmxhc2hfZXJhc2UoaW5mbywgc19maXJzdCwgc19sYXN0KTsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiBFUlJfUFJPVEVDVEVEOwogCX0KQEAgLTM1MywxMjIgKzIzOCwxMyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCB3cml0ZV9idWZmX3BoaWxpcHMgKGZsYXNoX2luZm9fdCAqIGluZm8sCi0JCQl1Y2hhciAqIHNyYywKLQkJCXVsb25nIGFkZHIsCi0JCQl1bG9uZyBjbnQpCi17Ci0JaW50IGZpcnN0X2NvcHlfc2l6ZTsKLQlpbnQgbGFzdF9jb3B5X3NpemU7Ci0JaW50IGZpcnN0X2Jsb2NrOwotCWludCBsYXN0X2Jsb2NrOwotCWludCBuYnJfbWlkX2Jsb2NrczsKLQl1Y2hhciBtZW1tYXBfdmFsdWU7Ci0JdWxvbmcgaTsKLQl1Y2hhciogc3JjX29yZzsKLQl1Y2hhciogZHN0X29yZzsKLQlpbnQgcmV0ID0gRVJSX09LOwotCi0Jc3JjX29yZyA9IHNyYzsKLQlkc3Rfb3JnID0gKHVjaGFyKilhZGRyOwotCi0JZmlyc3RfYmxvY2sgPSBhZGRyIC8gNTEyOwotCWxhc3RfYmxvY2sgPSAoYWRkciArIGNudCkgLyA1MTI7Ci0JbmJyX21pZF9ibG9ja3MgPSBsYXN0X2Jsb2NrIC0gZmlyc3RfYmxvY2sgLSAxOwotCi0JZmlyc3RfY29weV9zaXplID0gNTEyIC0gKGFkZHIgJSA1MTIpOwotCWxhc3RfY29weV9zaXplID0gKGFkZHIgKyBjbnQpICUgNTEyOwotCi0jaWYgMAotCXByaW50ZigiXG5jb3B5IGZpcnN0IGJsb2NrOiAoMSkgJWxYIC0+ICVsWCAweDIwMCBieXRlcywgIgotCQkiKDIpICVsWCAtPiAlbFggMHglWCBieXRlcywgKDMpICVsWCAtPiAlbFggMHgyMDAgYnl0ZXNcbiIsCi0JKHVsb25nKShmaXJzdF9ibG9jayAqIDUxMiksCi0JKHVsb25nKUNPUFlfQlVGRkVSX0xPQ0FUSU9OLAotCSh1bG9uZylzcmMsCi0JKHVsb25nKShDT1BZX0JVRkZFUl9MT0NBVElPTiArIDUxMiAtIGZpcnN0X2NvcHlfc2l6ZSksCi0JZmlyc3RfY29weV9zaXplLAotCSh1bG9uZylDT1BZX0JVRkZFUl9MT0NBVElPTiwKLQkodWxvbmcpKGZpcnN0X2Jsb2NrICogNTEyKSk7Ci0jZW5kaWYKLQotCS8qIGNvcHkgZmlyc3QgYmxvY2sgKi8KLQltZW1jcHkoKHZvaWQqKUNPUFlfQlVGRkVSX0xPQ0FUSU9OLAotCQkodm9pZCopKGZpcnN0X2Jsb2NrICogNTEyKSwgNTEyKTsKLQltZW1jcHkoKHZvaWQqKShDT1BZX0JVRkZFUl9MT0NBVElPTiArIDUxMiAtIGZpcnN0X2NvcHlfc2l6ZSksCi0JCXNyYywgZmlyc3RfY29weV9zaXplKTsKLQljb3B5X2J1ZmZlcl90b19mbGFzaChpbmZvLCBmaXJzdF9ibG9jayAqIDUxMik7Ci0Jc3JjICs9IGZpcnN0X2NvcHlfc2l6ZTsKLQlhZGRyICs9IGZpcnN0X2NvcHlfc2l6ZTsKLQotCS8qIGNvcHkgbWlkZGxlIGJsb2NrcyAqLwotCWZvciAoaSA9IDA7IGkgPCBuYnJfbWlkX2Jsb2NrczsgaSsrKSB7Ci0jaWYgMAotCQlwcmludGYoImNvcHkgbWlkZGxlIGJsb2NrOiAlbFggLT4gJWxYIDUxMiBieXRlcywgIgotCQkiJWxYIC0+ICVsWCA1MTIgYnl0ZXNcbiIsCi0JCSh1bG9uZylzcmMsCi0JCSh1bG9uZylDT1BZX0JVRkZFUl9MT0NBVElPTiwKLQkJKHVsb25nKUNPUFlfQlVGRkVSX0xPQ0FUSU9OLAotCQkodWxvbmcpYWRkcik7Ci0jZW5kaWYKLQkJbWVtY3B5KCh2b2lkKilDT1BZX0JVRkZFUl9MT0NBVElPTiwgc3JjLCA1MTIpOwotCQljb3B5X2J1ZmZlcl90b19mbGFzaChpbmZvLCBhZGRyKTsKLQkJc3JjICs9IDUxMjsKLQkJYWRkciArPSA1MTI7Ci0JfQotCi0KLQlpZiAobGFzdF9jb3B5X3NpemUgPiAwKSB7Ci0jaWYgMAotCQlwcmludGYoImNvcHkgbGFzdCBibG9jazogKDEpICVsWCAtPiAlbFggMHgyMDAgYnl0ZXMsICIKLQkJIigyKSAlbFggLT4gJWxYIDB4JVggYnl0ZXMsICgzKSAlbFggLT4gJWxYIHgyMDAgYnl0ZXNcbiIsCi0JCSh1bG9uZykobGFzdF9ibG9jayAqIDUxMiksCi0JCSh1bG9uZylDT1BZX0JVRkZFUl9MT0NBVElPTiwKLQkJKHVsb25nKXNyYywKLQkJKHVsb25nKShDT1BZX0JVRkZFUl9MT0NBVElPTiksCi0JCWxhc3RfY29weV9zaXplLAotCQkodWxvbmcpQ09QWV9CVUZGRVJfTE9DQVRJT04sCi0JCSh1bG9uZylhZGRyKTsKLSNlbmRpZgotCQkvKiBjb3B5IGxhc3QgYmxvY2sgKi8KLQkJbWVtY3B5KCh2b2lkKilDT1BZX0JVRkZFUl9MT0NBVElPTiwKLQkJCSh2b2lkKikobGFzdF9ibG9jayAqIDUxMiksIDUxMik7Ci0JCW1lbWNweSgodm9pZCopQ09QWV9CVUZGRVJfTE9DQVRJT04sCi0JCQlzcmMsIGxhc3RfY29weV9zaXplKTsKLQkJY29weV9idWZmZXJfdG9fZmxhc2goaW5mbywgYWRkcik7Ci0JfQotCi0JLyogdmVyaWZ5IHdyaXRlICovCi0JbWVtbWFwX3ZhbHVlID0gR0VUOChNRU1NQVApOwotCi0JZGlzYWJsZV9pbnRlcnJ1cHRzKCk7Ci0KLQlQVVQ4KE1FTU1BUCwgMDEpOwkJLyogd2UgbXVzdCBtYWtlIHN1cmUgdGhhdCBpbml0aWFsIDY0Ci0JCQkJCQkJICAgYnl0ZXMgYXJlIHRha2VuIGZyb20gZmxhc2ggd2hlbiB3ZQotCQkJCQkJCSAgIGRvIHRoZSBjb21wYXJlICovCi0KLQlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKLQkJaWYgKCpkc3Rfb3JnICE9ICpzcmNfb3JnKXsKLQkJCXByaW50ZigiV3JpdGUgZmFpbGVkLiBCeXRlICVsWCBkaWZmZXJzXG4iLCBpKTsKLQkJCXJldCA9IEVSUl9QUk9HX0VSUk9SOwotCQkJYnJlYWs7Ci0JCX0KLQkJZHN0X29yZysrOwotCQlzcmNfb3JnKys7Ci0JfQotCi0JUFVUOChNRU1NQVAsIG1lbW1hcF92YWx1ZSk7Ci0JZW5hYmxlX2ludGVycnVwdHMoKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KIGludCB3cml0ZV9idWZmIChmbGFzaF9pbmZvX3QgKiBpbmZvLCB1Y2hhciAqIHNyYywgdWxvbmcgYWRkciwgdWxvbmcgY250KQogewogCXN3aXRjaCAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9WRU5ETUFTSykgewogCQljYXNlIChTU1RfTUFOVUZBQ1QgJiBGTEFTSF9WRU5ETUFTSyk6CiAJCQlyZXR1cm4gd3JpdGVfYnVmZl9zc3QoaW5mbywgc3JjLCBhZGRyLCBjbnQpOwogCQljYXNlIChQSElMSVBTX0xQQzIyOTIgJiBGTEFTSF9WRU5ETUFTSyk6Ci0JCQlyZXR1cm4gd3JpdGVfYnVmZl9waGlsaXBzKGluZm8sIHNyYywgYWRkciwgY250KTsKKwkJCXJldHVybiBscGMyMjkyX3dyaXRlX2J1ZmYoaW5mbywgc3JjLCBhZGRyLCBjbnQpOwogCQlkZWZhdWx0OgogCQkJcmV0dXJuIEVSUl9QUk9HX0VSUk9SOwogCX0KZGlmZiAtLWdpdCBhL2JvYXJkL2xwYzIyOTJzb2RpbW0vbW1jLmMgYi9ib2FyZC9scGMyMjkyc29kaW1tL21tYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzA5MjJmLi4wMDAwMDAwCi0tLSBhL2JvYXJkL2xwYzIyOTJzb2RpbW0vbW1jLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLSNpbmNsdWRlIDxjb25maWcuaD4KLSNpbmNsdWRlIDxjb21tb24uaD4KLSNpbmNsdWRlIDxtbWMuaD4KLSNpbmNsdWRlIDxhc20vZXJybm8uaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPHBhcnQuaD4KLSNpbmNsdWRlIDxmYXQuaD4KLSNpbmNsdWRlICJtbWNfaHcuaCIKLSNpbmNsdWRlICJzcGkuaCIKLQotI2lmZGVmIENPTkZJR19NTUMKLQotI3VuZGVmIE1NQ19ERUJVRwotCi1zdGF0aWMgYmxvY2tfZGV2X2Rlc2NfdCBtbWNfZGV2OwotCi0vKiB0aGVzZSBhcmUgZmlsbGVkIG91dCBieSBhIGNhbGwgdG8gbW1jX2h3X2dldF9wYXJhbWV0ZXJzICovCi1zdGF0aWMgaW50IGh3X3NpemU7CQkvKiBpbiBrYnl0ZXMgKi8KLXN0YXRpYyBpbnQgaHdfbnJfc2VjdHM7Ci1zdGF0aWMgaW50IGh3X3NlY3Rfc2l6ZTsJLyogaW4gYnl0ZXMgKi8KLQotYmxvY2tfZGV2X2Rlc2NfdCAqIG1tY19nZXRfZGV2KGludCBkZXYpCi17Ci0JcmV0dXJuIChibG9ja19kZXZfZGVzY190ICopKCZtbWNfZGV2KTsKLX0KLQotdW5zaWduZWQgbG9uZyBtbWNfYmxvY2tfcmVhZChpbnQgZGV2LAotCQkJICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LAotCQkJICAgICBsYmFpbnRfdCBibGtjbnQsCi0JCQkgICAgIHVuc2lnbmVkIGxvbmcgKmJ1ZmZlcikKLXsKLQl1bnNpZ25lZCBsb25nIHJjID0gMDsKLQl1bnNpZ25lZCBjaGFyICpwID0gKHVuc2lnbmVkIGNoYXIgKilidWZmZXI7Ci0JdW5zaWduZWQgbG9uZyBpOwotCXVuc2lnbmVkIGxvbmcgYWRkciA9IHN0YXJ0OwotCi0jaWZkZWYgTU1DX0RFQlVHCi0JcHJpbnRmKCJtbWNfYmxvY2tfcmVhZDogc3RhcnQ9JWx1LCBibGtjbnQ9JWx1XG4iLCBzdGFydCwKLQkJICh1bnNpZ25lZCBsb25nKWJsa2NudCk7Ci0jZW5kaWYKLQotCWZvcihpID0gMDsgaSA8ICh1bnNpZ25lZCBsb25nKWJsa2NudDsgaSsrKSB7Ci0jaWZkZWYgTU1DX0RFQlVHCi0JCXByaW50ZigibW1jX3JlYWRfc2VjdG9yOiBhZGRyPSVsdSwgYnVmZmVyPSVwXG4iLCBhZGRyLCBwKTsKLSNlbmRpZgotCQkodm9pZCltbWNfcmVhZF9zZWN0b3IoYWRkciwgcCk7Ci0JCXJjKys7Ci0JCWFkZHIrKzsKLQkJcCArPSBod19zZWN0X3NpemU7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBSZWFkIGhhcmR3YXJlIHBhcmFtdGVyZXJzIChzZWN0b3Igc2l6ZSwgc2l6ZSwgbnVtYmVyIG9mIHNlY3RvcnMpCi0gKi8KLXN0YXRpYyBpbnQgbW1jX2h3X2dldF9wYXJhbWV0ZXJzKHZvaWQpCi17Ci0JdW5zaWduZWQgY2hhciBjc2RkYXRhWzE2XTsKLQl1bnNpZ25lZCBpbnQgc2l6ZW11bHQ7Ci0JdW5zaWduZWQgaW50IHNpemU7Ci0KLQltbWNfcmVhZF9jc2QoY3NkZGF0YSk7Ci0JaHdfc2VjdF9zaXplID0gMTw8KGNzZGRhdGFbNV0gJiAweDBmKTsKLQlzaXplID0gKChjc2RkYXRhWzZdJjB4MDMpPDwxMCkrKGNzZGRhdGFbN108PDIpKyhjc2RkYXRhWzhdJjB4YzApOwotCXNpemVtdWx0ID0gKChjc2RkYXRhWzEwXSAmIDB4ODApPj43KSsoKGNzZGRhdGFbOV0gJiAweDAzKTw8MSk7Ci0JaHdfbnJfc2VjdHMgPSAoc2l6ZSsxKSooMTw8KHNpemVtdWx0KzIpKTsKLQlod19zaXplID0gaHdfbnJfc2VjdHMqaHdfc2VjdF9zaXplLzEwMjQ7Ci0KLSNpZmRlZiBNTUNfREVCVUcKLQlwcmludGYoIm1tY19od19nZXRfcGFyYW1ldGVyczogaHdfc2VjdF9zaXplPSVkLCBod19ucl9zZWN0cz0lZCwgIgotCQkgImh3X3NpemU9JWRcbiIsIGh3X3NlY3Rfc2l6ZSwgaHdfbnJfc2VjdHMsIGh3X3NpemUpOwotI2VuZGlmCi0KLQlyZXR1cm4gMDsKLX0KLQotaW50IG1tY19pbml0KGludCB2ZXJib3NlKQotewotCWludCByZXQgPSAtRU5PREVWOwotCi0JaWYgKHZlcmJvc2UpCi0JCXByaW50ZigibW1jX2luaXRcbiIpOwotCi0Jc3BpX2luaXQoKTsKLQltbWNfaHdfaW5pdCgpOwotCi0JbW1jX2h3X2dldF9wYXJhbWV0ZXJzKCk7Ci0KLQltbWNfZGV2LmlmX3R5cGUgPSBJRl9UWVBFX01NQzsKLQltbWNfZGV2LnBhcnRfdHlwZSA9IFBBUlRfVFlQRV9ET1M7Ci0JbW1jX2Rldi5kZXYgPSAwOwotCW1tY19kZXYubHVuID0gMDsKLQltbWNfZGV2LnR5cGUgPSAwOwotCW1tY19kZXYuYmxrc3ogPSBod19zZWN0X3NpemU7Ci0JbW1jX2Rldi5sYmEgPSBod19ucl9zZWN0czsKLQlzcHJpbnRmKChjaGFyKiltbWNfZGV2LnZlbmRvciwgIlVua25vd24gdmVuZG9yIik7Ci0Jc3ByaW50ZigoY2hhciopbW1jX2Rldi5wcm9kdWN0LCAiVW5rbm93biBwcm9kdWN0Iik7Ci0Jc3ByaW50ZigoY2hhciopbW1jX2Rldi5yZXZpc2lvbiwgIk4vQSIpOwotCW1tY19kZXYucmVtb3ZhYmxlID0gMDsJLyogc2hvdWxkIGJlIHRydWU/Pz8gKi8KLQltbWNfZGV2LmJsb2NrX3JlYWQgPSBtbWNfYmxvY2tfcmVhZDsKLQotCWZhdF9yZWdpc3Rlcl9kZXZpY2UoJm1tY19kZXYsIDEpOwotCi0JcmV0ID0gMDsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBtbWNfd3JpdGUodWNoYXIgKiBzcmMsIHVsb25nIGRzdCwgaW50IHNpemUpCi17Ci0jaWZkZWYgTU1DX0RFQlVHCi0JcHJpbnRmKCJtbWNfd3JpdGU6IHNyYz0lcCwgZHN0PSVsdSwgc2l6ZT0ldVxuIiwgc3JjLCBkc3QsIHNpemUpOwotI2VuZGlmCi0JLyogU2luY2UgbW1jMmluZm8gYWx3YXlzIHJldHVybnMgMCB0aGlzIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgYmUgY2FsbGVkICovCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBtbWNfcmVhZCh1bG9uZyBzcmMsIHVjaGFyICogZHN0LCBpbnQgc2l6ZSkKLXsKLSNpZmRlZiBNTUNfREVCVUcKLQlwcmludGYoIm1tY19yZWFkOiBzcmM9JWx1LCBkc3Q9JXAsIHNpemU9JXVcbiIsIHNyYywgZHN0LCBzaXplKTsKLSNlbmRpZgotCS8qIFNpbmNlIG1tYzJpbmZvIGFsd2F5cyByZXR1cm5zIDAgdGhpcyBmdW5jdGlvbiB3aWxsIG5ldmVyIGJlIGNhbGxlZCAqLwotCXJldHVybiAwOwotfQotCi1pbnQgbW1jMmluZm8odWxvbmcgYWRkcikKLXsKLQkvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgY21kX2NwIHRvIGRldGVybWluZSBpZiBzb3VyY2Ugb3IgZGVzdGluYXRpb24KLQkgYWRkcmVzcyByZXNpZGVzIG9uIE1NQy1jYXJkIG9yIG5vdC4gV2UgZG8gbm90IHN1cHBvcnQgY29weSB0byBhbmQgZnJvbQotCSBNTUMtY2FyZCBzbyB3ZSBhbHdheXMgcmV0dXJuIDAuICovCi0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfTU1DICovCmRpZmYgLS1naXQgYS9ib2FyZC9scGMyMjkyc29kaW1tL21tY19ody5jIGIvYm9hcmQvbHBjMjI5MnNvZGltbS9tbWNfaHcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFmMmE3OS4uMDAwMDAwMAotLS0gYS9ib2FyZC9scGMyMjkyc29kaW1tL21tY19ody5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qCi0gICAgVGhpcyBjb2RlIHdhcyBvcmlnaW5hbCB3cml0dGVuIGJ5IFVscmljaCBSYWRpZyBhbmQgbW9kaWZpZWQgYnkKLSAgICBFbWJlZGRlZCBBcnRpc3RzIEFCICh3d3cuZW1iZWRkZWRhcnRpc3RzLmNvbSkuCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0qLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaW5jbHVkZSA8Y29tbW9uLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlICJzcGkuaCIKLQotI2RlZmluZSBNTUNfRW5hYmxlKCkgUFVUMzIoSU8xQ0xSLCAxbCA8PCAyMikKLSNkZWZpbmUgTU1DX0Rpc2FibGUoKSBQVVQzMihJTzFTRVQsIDFsIDw8IDIyKQotI2RlZmluZSBtbWNfc3BpX2NmZygpIHNwaV9zZXRfY2xvY2soOCk7IHNwaV9zZXRfY2ZnKDAsIDEsIDApOwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBXcml0ZV9Db21tYW5kX01NQyAodW5zaWduZWQgY2hhciAqQ01EKTsKLXN0YXRpYyB2b2lkIE1NQ19SZWFkX0Jsb2NrKHVuc2lnbmVkIGNoYXIgKkNNRCwgdW5zaWduZWQgY2hhciAqQnVmZmVyLAotCQkgICAgdW5zaWduZWQgc2hvcnQgaW50IEJ5dGVzKTsKLQotLyogaW5pdGlhbGl6ZSB0aGUgaGFyZHdhcmUgKi8KLWludCBtbWNfaHdfaW5pdCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgYTsKLQl1bnNpZ25lZCBzaG9ydCBpbnQgVGltZW91dCA9IDA7Ci0JdW5zaWduZWQgY2hhciBiOwotCXVuc2lnbmVkIGNoYXIgQ01EW10gPSB7MHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NX07Ci0KLQkvKiBzZXQtdXAgR1BJTyBhbmQgU1BJICovCi0JKCooKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKilQSU5TRUwyKSkgJj0gfigxbCA8PCAzKTsgLyogY2xlYXIgYml0IDMgKi8KLQkoKigodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKUlPMURJUikpIHw9ICgxbCA8PCAyMik7IC8qIHNldCBiaXQgMjIgKG91dHB1dCkgKi8KLQotCU1NQ19EaXNhYmxlKCk7Ci0KLQlzcGlfbG9jaygpOwotCXNwaV9zZXRfY2xvY2soMjQ4KTsKLQlzcGlfc2V0X2NmZygwLCAxLCAwKTsKLQlNTUNfRW5hYmxlKCk7Ci0KLQkvKiB3YXN0ZSBzb21lIHRpbWUgKi8KLQlmb3IoYT0wOyBhIDwgMjAwMDA7IGErKykKLQkJYXNtKCJub3AiKTsKLQotCS8qIFB1dCB0aGUgTU1DL1NELWNhcmQgaW50byBTUEktbW9kZSAqLwotCWZvciAoYiA9IDA7IGIgPCAxMDsgYisrKSAvKiBTZW5kcyBtaW4gNzQrIGNsb2NrcyB0byB0aGUgTU1DL1NELWNhcmQgKi8KLQkJc3BpX3dyaXRlKDB4ZmYpOwotCi0JLyogU2VuZHMgY29tbWFuZCBDTUQwIHRvIE1NQy9TRC1jYXJkICovCi0Jd2hpbGUgKFdyaXRlX0NvbW1hbmRfTU1DKENNRCkgIT0gMSkgewotCQlpZiAoVGltZW91dCsrID4gMjAwKSB7Ci0JCQlNTUNfRGlzYWJsZSgpOwotCQkJc3BpX3VubG9jaygpOwotCQkJcmV0dXJuKDEpOyAvKiBBYm9ydCB3aXRoIGNvbW1hbmQgMSAocmV0dXJuIDEpICovCi0JCX0KLQl9Ci0JLyogU2VuZHMgQ29tbWFuZCBDTUQxIGFuIE1NQy9TRC1jYXJkICovCi0JVGltZW91dCA9IDA7Ci0JQ01EWzBdID0gMHg0MTsvKiBDb21tYW5kIDEgKi8KLQlDTURbNV0gPSAweEZGOwotCi0Jd2hpbGUgKFdyaXRlX0NvbW1hbmRfTU1DKENNRCkgIT0gMCkgewotCQlpZiAoVGltZW91dCsrID4gMjAwKSB7Ci0JCQlNTUNfRGlzYWJsZSgpOwotCQkJc3BpX3VubG9jaygpOwotCQkJcmV0dXJuICgyKTsgLyogQWJvcnQgd2l0aCBjb21tYW5kIDIgKHJldHVybiAyKSAqLwotCQl9Ci0JfQotCi0JTU1DX0Rpc2FibGUoKTsKLQlzcGlfdW5sb2NrKCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgU2VuZHMgYSBjb21tYW5kIHRvIHRoZSBNTUMvU0QtY2FyZAotICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIgV3JpdGVfQ29tbWFuZF9NTUMgKHVuc2lnbmVkIGNoYXIgKkNNRCkKLXsKLQl1bnNpZ25lZCBjaGFyIGEsIHRtcCA9IDB4ZmY7Ci0JdW5zaWduZWQgc2hvcnQgaW50IFRpbWVvdXQgPSAwOwotCi0JTU1DX0Rpc2FibGUoKTsKLQlzcGlfd3JpdGUoMHhGRik7Ci0JTU1DX0VuYWJsZSgpOwotCi0JZm9yIChhID0gMDsgYSA8IDB4MDY7IGErKykKLQkJc3BpX3dyaXRlKCpDTUQrKyk7Ci0KLQl3aGlsZSAodG1wID09IDB4ZmYpIHsKLQkJdG1wID0gc3BpX3JlYWQoKTsKLQkJaWYgKFRpbWVvdXQrKyA+IDUwMDApCi0JCSAgYnJlYWs7Ci0JfQotCi0JcmV0dXJuICh0bXApOwotfQotCi0vKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICBSb3V0aW5lIHRvIHJlYWQgdGhlIENJRCByZWdpc3RlciBmcm9tIHRoZSBNTUMvU0QtY2FyZCAoMTYgYnl0ZXMpCi0gICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCi12b2lkIE1NQ19SZWFkX0Jsb2NrKHVuc2lnbmVkIGNoYXIgKkNNRCwgdW5zaWduZWQgY2hhciAqQnVmZmVyLCB1bnNpZ25lZCBzaG9ydAotCWludCBCeXRlcykKLXsKLQl1bnNpZ25lZCBzaG9ydCBpbnQgYTsKLQotCXNwaV9sb2NrKCk7Ci0JbW1jX3NwaV9jZmcoKTsKLQlNTUNfRW5hYmxlKCk7Ci0KLQlpZiAoV3JpdGVfQ29tbWFuZF9NTUMoQ01EKSAhPSAwKSB7Ci0JCU1NQ19EaXNhYmxlKCk7Ci0JCXNwaV91bmxvY2soKTsKLQkJcmV0dXJuOwotCX0KLQotCXdoaWxlIChzcGlfcmVhZCgpICE9IDB4ZmUpIHt9OwotCWZvciAoYSA9IDA7IGEgPCBCeXRlczsgYSsrKQotCQkqQnVmZmVyKysgPSBzcGlfcmVhZCgpOwotCi0JLyogUmVhZCB0aGUgQ1JDLWJ5dGUgKi8KLQlzcGlfcmVhZCgpOyAvKiBDUkMgLSBieXRlIGlzIGRpc2NhcmRlZCAqLwotCXNwaV9yZWFkKCk7IC8qIENSQyAtIGJ5dGUgaXMgZGlzY2FyZGVkICovCi0JLyogc2V0IE1NQ19DaGlwX1NlbGVjdCB0byBoaWdoIChNTUMvU0QtY2FyZCBJbmFrdGl2KSAqLwotCU1NQ19EaXNhYmxlKCk7Ci0Jc3BpX3VubG9jaygpOwotCi0JcmV0dXJuOwotfQotCi0vKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICBSb3V0aW5lIHRvIHJlYWQgYSBibG9jayAoNTEyIGJ5dGVzKSBmcm9tIHRoZSBNTUMvU0QtY2FyZAotICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAqLwotdW5zaWduZWQgY2hhciBtbWNfcmVhZF9zZWN0b3IgKHVuc2lnbmVkIGxvbmcgYWRkcix1bnNpZ25lZCBjaGFyICpCdWZmZXIpCi17Ci0JLyogQ29tbWFuZCAxNiB0byByZWFkIGFCbG9ja3MgZnJvbSB0aGUgTU1DL1NEIC0gY2FlZCAqLwotCXVuc2lnbmVkIGNoYXIgQ01EW10gPSB7MHg1MSwweDAwLDB4MDAsMHgwMCwweDAwLDB4RkZ9OwotCi0JLyogVGhlIGFkZHJlcyBvbiB0aGUgTU1DL1NELWNhcmQgaXMgaW4gYnl0ZXMsCi0JYWRkciBpcyB0cmFuc2Zvcm1lZCBmcm9tIGJsb2NrcyB0byBieXRlcyBhbmQgdGhlIHJlc3VsdCBpcwotCXBsYWNlZCBpbnRvIHRoZSBjb21tYW5kICovCi0KLQlhZGRyID0gYWRkciA8PCA5OyAvKiBhZGRyID0gYWRkciAqIDUxMiAqLwotCi0JQ01EWzFdID0gKChhZGRyICYgMHhGRjAwMDAwMCkgPj4gMjQpOwotCUNNRFsyXSA9ICgoYWRkciAmIDB4MDBGRjAwMDApID4+IDE2KTsKLQlDTURbM10gPSAoKGFkZHIgJiAweDAwMDBGRjAwKSA+PiA4ICk7Ci0KLQlNTUNfUmVhZF9CbG9jayhDTUQsIEJ1ZmZlciwgNTEyKTsKLQotCXJldHVybiAoMCk7Ci19Ci0KLS8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgIFJvdXRpbmUgdG8gd3JpdGUgYSBibG9jayAoNTEyIGJ5dGUpIHRvIHRoZSBNTUMvU0QtY2FyZAotICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAqLwotdW5zaWduZWQgY2hhciBtbWNfd3JpdGVfc2VjdG9yICh1bnNpZ25lZCBsb25nIGFkZHIsdW5zaWduZWQgY2hhciAqQnVmZmVyKQotewotCXVuc2lnbmVkIGNoYXIgdG1wLCBhOwotCXVuc2lnbmVkIHNob3J0IGludCBiOwotCS8qIENvbW1hbmQgMjQgdG8gd3JpdGUgYSBibG9jayB0byB0aGUgTU1DL1NEIC0gY2FyZCAqLwotCXVuc2lnbmVkIGNoYXIgQ01EW10gPSB7MHg1OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRn07Ci0KLQkvKiBUaGUgYWRkcmVzIG9uIHRoZSBNTUMvU0QtY2FyZCBpcyBpbiBieXRlcywKLQlhZGRyIGlzIHRyYW5zZm9ybWVkIGZyb20gYmxvY2tzIHRvIGJ5dGVzIGFuZCB0aGUgcmVzdWx0IGlzCi0JcGxhY2VkIGludG8gdGhlIGNvbW1hbmQgKi8KLQotCWFkZHIgPSBhZGRyIDw8IDk7IC8qIGFkZHIgPSBhZGRyICogNTEyICovCi0KLQlDTURbMV0gPSAoKGFkZHIgJiAweEZGMDAwMDAwKSA+PiAyNCk7Ci0JQ01EWzJdID0gKChhZGRyICYgMHgwMEZGMDAwMCkgPj4gMTYpOwotCUNNRFszXSA9ICgoYWRkciAmIDB4MDAwMEZGMDApID4+IDggKTsKLQotCXNwaV9sb2NrKCk7Ci0JbW1jX3NwaV9jZmcoKTsKLQlNTUNfRW5hYmxlKCk7Ci0KLQkvKiBTZW5kIGNvbW1hbmQgQ01EMjQgdG8gdGhlIE1NQy9TRC1jYXJkIChXcml0ZSAxIEJsb2NrLzUxMiBCeXRlcykgKi8KLQl0bXAgPSBXcml0ZV9Db21tYW5kX01NQyhDTUQpOwotCWlmICh0bXAgIT0gMCkgewotCQlNTUNfRGlzYWJsZSgpOwotCQlzcGlfdW5sb2NrKCk7Ci0JCXJldHVybih0bXApOwotCX0KLQotCS8qIERvIGEgc2hvcnQgZGVsYXkgYW5kIHNlbmQgYSBjbG9jay1wdWxzZSB0byB0aGUgTU1DL1NELWNhcmQgKi8KLQlmb3IgKGEgPSAwOyBhIDwgMTAwOyBhKyspCi0JCXNwaV9yZWFkKCk7Ci0KLQkvKiBTZW5kIGEgc3RhcnQgYnl0ZSB0byB0aGUgTU1DL1NELWNhcmQgKi8KLQlzcGlfd3JpdGUoMHhGRSk7Ci0KLQkvKiBXcml0ZSB0aGUgYmxvY2sgKDUxMiBieXRlcykgdG8gdGhlIE1NQy9TRC1jYXJkICovCi0JZm9yIChiID0gMDsgYiA8IDUxMjsgYisrKQotCQlzcGlfd3JpdGUoKkJ1ZmZlcisrKTsKLQotCS8qIHdyaXRlIHRoZSBDUkMtQnl0ZSAqLwotCXNwaV93cml0ZSgweEZGKTsgLyogd3JpdGUgYSBkdW1teSBDUkMgKi8KLQlzcGlfd3JpdGUoMHhGRik7IC8qIENSQyBjb2RlIGlzIG5vdCB1c2VkICovCi0KLQkvKiBXYWl0IGZvciBNTUMvU0QtY2FyZCBidXN5ICovCi0Jd2hpbGUgKHNwaV9yZWFkKCkgIT0gMHhmZikge307Ci0KLQkvKiBzZXQgTU1DX0NoaXBfU2VsZWN0IHRvIGhpZ2ggKE1NQy9TRC1jYXJkIGluYWN0aXZlKSAqLwotCU1NQ19EaXNhYmxlKCk7Ci0Jc3BpX3VubG9jaygpOwotCXJldHVybiAoMCk7Ci19Ci0KLS8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgIFJvdXRpbmUgdG8gcmVhZCB0aGUgQ1NEIHJlZ2lzdGVyIGZyb20gdGhlIE1NQy9TRC1jYXJkICgxNiBieXRlcykKLSAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KLXVuc2lnbmVkIGNoYXIgbW1jX3JlYWRfY3NkICh1bnNpZ25lZCBjaGFyICpCdWZmZXIpCi17Ci0JLyogQ29tbWFuZCB0byByZWFkIHRoZSBDU0QgcmVnaXN0ZXIgKi8KLQl1bnNpZ25lZCBjaGFyIENNRFtdID0gezB4NDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkZ9OwotCi0JTU1DX1JlYWRfQmxvY2soQ01ELCBCdWZmZXIsIDE2KTsKLQotCXJldHVybiAoMCk7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9scGMyMjkyc29kaW1tL3NwaS5jIGIvYm9hcmQvbHBjMjI5MnNvZGltbS9zcGkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJhMTQ2OC4uMDAwMDAwMAotLS0gYS9ib2FyZC9scGMyMjkyc29kaW1tL3NwaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAgICBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIGFuIGludGVyZmFjZSB0byB0aGUgU1BJIG9uIHRoZSBscGMyMnh4LgotICAgIENvcHlyaWdodCAoQykgMjAwNiAgRW1iZWRkZWQgQXJ0aXN0cyBBQiAod3d3LmVtYmVkZGVkYXJ0aXN0cy5jb20pCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0qLwotCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaW5jbHVkZSA8Y29tbW9uLmg+Ci0jaW5jbHVkZSA8YXNtL2Vycm5vLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlICJzcGkuaCIKLQotdW5zaWduZWQgbG9uZyBzcGlfZmxhZ3M7Ci11bnNpZ25lZCBjaGFyIHNwaV9pZGxlID0gMHgwMDsKLQotaW50IHNwaV9pbml0KHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBwaW5zZWwwX3ZhbHVlOwotCi0JLyogYWN0aXZhdGUgc3BpIHBpbnMgKi8KLQlwaW5zZWwwX3ZhbHVlID0gR0VUMzIoUElOU0VMMCk7Ci0JcGluc2VsMF92YWx1ZSAmPSB+KDB4RkZsIDw8IDgpOwotCXBpbnNlbDBfdmFsdWUgfD0gKDB4NTVsIDw8IDgpOwotCVBVVDMyKFBJTlNFTDAsIHBpbnNlbDBfdmFsdWUpOwotCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9sd21vbi9sd21vbi5jIGIvYm9hcmQvbHdtb24vbHdtb24uYwppbmRleCA5ZThlYTJkLi5jNjg5NzhhIDEwMDY0NAotLS0gYS9ib2FyZC9sd21vbi9sd21vbi5jCisrKyBiL2JvYXJkL2x3bW9uL2x3bW9uLmMKQEAgLTc2MSw3ICs3NjEsNyBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLUJvYXJkIFNwZWNpYWwgQ29tbWFuZHM6IFBJQyByZWFkL3dyaXRlIC0tLS0tLS0tLS0tLS0tLSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JTUCkKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRiogRnVuY3Rpb246ICAgICBpbnQgZG9fcGljIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywKIEYqICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgUCpBKloqCkBAIC05NjAsNyArOTYwLDcgQEAKIAkibHNiICAgICAtIHByaW50IGN1cnJlbnQgc2V0dGluZ1xuIgogKTsKIAotI2VuZGlmIC8qIENGR19DTURfQlNQICovCisjZW5kaWYKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVdGlsaXRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9ib2FyZC9sd21vbi9wY21jaWEuYyBiL2JvYXJkL2x3bW9uL3BjbWNpYS5jCmluZGV4IDIzNDkyODYuLmViY2E3YTIgMTAwNjQ0Ci0tLSBhL2JvYXJkL2x3bW9uL3BjbWNpYS5jCisrKyBiL2JvYXJkL2x3bW9uL3BjbWNpYS5jCkBAIC01LDExICs1LDExIEBACiAKICN1bmRlZglDT05GSUdfUENNQ0lBCiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQogI2RlZmluZQlDT05GSUdfUENNQ0lBCiAjZW5kaWYKIApAQCAtMTI3LDcgKzEyNyw3IEBACiB9CiAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogaW50IHBjbWNpYV9oYXJkd2FyZV9kaXNhYmxlKGludCBzbG90KQogewogCXZvbGF0aWxlIGltbWFwX3QJKmltbWFwOwpAQCAtMTY2LDcgKzE2Niw3IEBACiAKIAlyZXR1cm4gKDApOwogfQotI2VuZGlmCS8qIENGR19DTURfUENNQ0lBICovCisjZW5kaWYKIAogCiBpbnQgcGNtY2lhX3ZvbHRhZ2Vfc2V0KGludCBzbG90LCBpbnQgdmNjLCBpbnQgdnBwKQpkaWZmIC0tZ2l0IGEvYm9hcmQvbHdtb241L01ha2VmaWxlIGIvYm9hcmQvbHdtb241L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZWY3ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9sd21vbjUvTWFrZWZpbGUKQEAgLTAsMCArMSw1MSBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDItMjAwNgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChCT0FSRCkuYQorCitDT0JKUwk9ICQoQk9BUkQpLm8gc2RyYW0ubworU09CSlMJPSBpbml0Lm8KKworU1JDUwk6PSAkKFNPQkpTOi5vPS5TKSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChDT0JKUykpCitTT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTT0JKUykpCisKKyQoTElCKToJJChPQkpTKSAkKFNPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKSAkKFNPQkpTKQorCitjbGVhbjoKKwlybSAtZiAkKFNPQkpTKSAkKE9CSlMpCisKK2Rpc3RjbGVhbjoJY2xlYW4KKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9ib2FyZC9sd21vbjUvY29uZmlnLm1rIGIvYm9hcmQvbHdtb241L2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjJiODc5Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvbHdtb241L2NvbmZpZy5tawpAQCAtMCwwICsxLDM5IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworIworIyBsd21vbjUgKDQ0MEVQeCkKKyMKKworaWZuZGVmIFRFWFRfQkFTRQorVEVYVF9CQVNFID0gMHhGRkY4MDAwMAorZW5kaWYKKworUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURDT05GSUdfNDQwPTEKKworaWZlcSAoJChkZWJ1ZyksMSkKK1BMQVRGT1JNX0NQUEZMQUdTICs9IC1EREVCVUcKK2VuZGlmCisKK2lmZXEgKCQoZGJjciksMSkKK1BMQVRGT1JNX0NQUEZMQUdTICs9IC1EQ0ZHX0lOSVRfREJDUj0weDhjZmYwMDAwCitlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvbHdtb241L2luaXQuUyBiL2JvYXJkL2x3bW9uNS9pbml0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc5OGU4MAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2x3bW9uNS9pbml0LlMKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNworICogU3RlZmFuIFJvZXNlLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCBzckBkZW54LmRlLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgU2NvdHQgTWNOdXR0IDxzbWNudXR0QGFydGVzeW5jcC5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPHBwY19hc20udG1wbD4KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxhc20tcHBjL21tdS5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRMQiBUQUJMRQorICoKKyAqIFRoaXMgdGFibGUgaXMgdXNlZCBieSB0aGUgY3B1IGJvb3QgY29kZSB0byBzZXR1cCB0aGUgaW5pdGlhbCB0bGIKKyAqIGVudHJpZXMuIFJhdGhlciB0aGFuIG1ha2UgYnJvYWQgYXNzdW1wdGlvbnMgaW4gdGhlIGNwdSBzb3VyY2UgdHJlZSwKKyAqIHRoaXMgdGFibGUgbGV0cyBlYWNoIGJvYXJkIHNldCB0aGluZ3MgdXAgaG93ZXZlciB0aGV5IGxpa2UuCisgKgorICogIFBvaW50ZXIgdG8gdGhlIHRhYmxlIGlzIHJldHVybmVkIGluIHIxCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLnNlY3Rpb24gLmJvb3RwZywiYXgiCisJLmdsb2JsIHRsYnRhYgorCit0bGJ0YWI6CisJdGxidGFiX3N0YXJ0CisKKwkvKgorCSAqIEJPT1RfQ1MgKEZMQVNIKSBtdXN0IGJlIGZpcnN0LiBCZWZvcmUgcmVsb2NhdGlvbiBTQV9JIGNhbiBiZSBvZmYgdG8gdXNlIHRoZQorCSAqIHNwZWVkIHVwIGJvb3QgcHJvY2Vzcy4gSXQgaXMgcGF0Y2hlZCBhZnRlciByZWxvY2F0aW9uIHRvIGVuYWJsZSBTQV9JCisJICovCisJdGxiZW50cnkoQ0ZHX0JPT1RfQkFTRV9BRERSLCBTWl8yNTZNLCBDRkdfQk9PVF9CQVNFX0FERFIsIDEsIEFDX1J8QUNfV3xBQ19YfFNBX0cpCisKKwkvKgorCSAqIFRMQiBlbnRyaWVzIGZvciBTRFJBTSBhcmUgbm90IG5lZWRlZCBvbiB0aGlzIHBsYXRmb3JtLgorCSAqIFRoZXkgYXJlIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBpbiB0aGUgU1BEIEREUigyKSBkZXRlY3Rpb24KKwkgKiByb3V0aW5lLgorCSAqLworCisjaWZkZWYgQ0ZHX0lOSVRfUkFNX0RDQUNIRQorCS8qIFRMQi1lbnRyeSBmb3IgaW5pdC1yYW0gaW4gZGNhY2hlIChTQV9JIG11c3QgYmUgdHVybmVkIG9mZiEpICovCisJdGxiZW50cnkoQ0ZHX0lOSVRfUkFNX0FERFIsIFNaXzY0SywgQ0ZHX0lOSVRfUkFNX0FERFIsIDAsIEFDX1J8QUNfV3xBQ19YfFNBX0cpCisjZW5kaWYKKworCS8qIFRMQi1lbnRyeSBmb3IgUENJIE1lbW9yeSAqLworCXRsYmVudHJ5KENGR19QQ0lfTUVNQkFTRSwgU1pfMjU2TSwgQ0ZHX1BDSV9NRU1CQVNFLCAxLCBBQ19SfEFDX1d8U0FfR3xTQV9JKQorCXRsYmVudHJ5KENGR19QQ0lfTUVNQkFTRTEsIFNaXzI1Nk0sIENGR19QQ0lfTUVNQkFTRTEsIDEsIEFDX1J8QUNfV3xTQV9HfFNBX0kpCisJdGxiZW50cnkoQ0ZHX1BDSV9NRU1CQVNFMiwgU1pfMjU2TSwgQ0ZHX1BDSV9NRU1CQVNFMiwgMSwgQUNfUnxBQ19XfFNBX0d8U0FfSSkKKwl0bGJlbnRyeShDRkdfUENJX01FTUJBU0UzLCBTWl8yNTZNLCBDRkdfUENJX01FTUJBU0UzLCAxLCBBQ19SfEFDX1d8U0FfR3xTQV9JKQorCisJLyogVExCLWVudHJ5IGZvciB0aGUgRlBHQSBDaGlwIHNlbGVjdCAyICovCisJdGxiZW50cnkoQ0ZHX0ZQR0FfQkFTRV8wLCBTWl8xTSwgQ0ZHX0ZQR0FfQkFTRV8wLCAxLCBBQ19SfEFDX1d8QUNfWHxTQV9JfFNBX0cpCisKKwkvKiBUTEItZW50cnkgZm9yIHRoZSBGUEdBIENoaXAgc2VsZWN0IDMgKi8KKwl0bGJlbnRyeShDRkdfRlBHQV9CQVNFXzEsIFNaXzFNLCBDRkdfRlBHQV9CQVNFXzEsIDEsQUNfUnxBQ19XfEFDX1h8U0FfSXxTQV9HKQorCisJLyogVExCLWVudHJ5IGZvciB0aGUgTElNRSBDb250cm9sbGVyICovCisJdGxiZW50cnkoQ0ZHX0xJTUVfQkFTRV8wLCBTWl8xNk0sIENGR19MSU1FX0JBU0VfMCwgMSwgQUNfUnxBQ19XfEFDX1h8U0FfSXxTQV9HKQorCXRsYmVudHJ5KENGR19MSU1FX0JBU0VfMSwgU1pfMTZNLCBDRkdfTElNRV9CQVNFXzEsIDEsIEFDX1J8QUNfV3xBQ19YfFNBX0l8U0FfRykKKwl0bGJlbnRyeShDRkdfTElNRV9CQVNFXzIsIFNaXzE2TSwgQ0ZHX0xJTUVfQkFTRV8yLCAxLCBBQ19SfEFDX1d8QUNfWHxTQV9JfFNBX0cpCisJdGxiZW50cnkoQ0ZHX0xJTUVfQkFTRV8zLCBTWl8xNk0sIENGR19MSU1FX0JBU0VfMywgMSwgQUNfUnxBQ19XfEFDX1h8U0FfSXxTQV9HKQorCisJLyogVExCLWVudHJ5IGZvciBJbnRlcm5hbCBSZWdpc3RlcnMgJiBPQ00gKi8KKwl0bGJlbnRyeSgweGUwMDAwMDAwLCBTWl8xNk0sIDB4ZTAwMDAwMDAsIDAsICBBQ19SfEFDX1d8QUNfWHxTQV9JKQorCisJLypUTEItZW50cnkgUENJIHJlZ2lzdGVycyovCisJdGxiZW50cnkoMHhFRUMwMDAwMCwgU1pfMUssIDB4RUVDMDAwMDAsIDEsICBBQ19SfEFDX1d8QUNfWHxTQV9HfFNBX0kpCisKKwkvKiBUTEItZW50cnkgZm9yIHBlcmlwaGVyYWxzICovCisJdGxiZW50cnkoMHhFRjAwMDAwMCwgU1pfMTZNLCAweEVGMDAwMDAwLCAxLCBBQ19SfEFDX1d8QUNfWHxTQV9HfFNBX0kpCisKKwl0bGJ0YWJfZW5kCmRpZmYgLS1naXQgYS9ib2FyZC9sd21vbjUvbHdtb241LmMgYi9ib2FyZC9sd21vbjUvbHdtb241LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkxNjI4NAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2x3bW9uNS9sd21vbjUuYwpAQCAtMCwwICsxLDQ2NSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNworICogU3RlZmFuIFJvZXNlLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCBzckBkZW54LmRlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxwcGM0NDAuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKK2V4dGVybiBmbGFzaF9pbmZvX3QgZmxhc2hfaW5mb1tDRkdfTUFYX0ZMQVNIX0JBTktTXTsgLyogaW5mbyBmb3IgRkxBU0ggY2hpcHMJKi8KKwordWxvbmcgZmxhc2hfZ2V0X3NpemUgKHVsb25nIGJhc2UsIGludCBiYW5rbnVtKTsKKworaW50IGJvYXJkX2Vhcmx5X2luaXRfZih2b2lkKQoreworCXUzMiBzZHIwX3BmYzEsIHNkcjBfcGZjMjsKKwl1MzIgcmVnOworCisJLyogUExCIFdyaXRlIHBpcGVsaW5pbmcgZGlzYWJsZWQuIERlbmFsaSBDb3JlIHdvcmthcm91bmQgKi8KKwltdGRjcihwbGIwX2FjciwgMHhERTAwMDAwMCk7CisJbXRkY3IocGxiMV9hY3IsIDB4REUwMDAwMDApOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIFNldHVwIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciBwb2xhcml0aWVzLCB0cmlnZ2VycywgZXRjLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbXRkY3IodWljMHNyLCAweGZmZmZmZmZmKTsgIC8qIGNsZWFyIGFsbC4gaWYgd3JpdGUgd2l0aCAxIHRoZW4gdGhlIHN0YXR1cyBpcyBjbGVhcmVkICAqLworCW10ZGNyKHVpYzBlciwgMHgwMDAwMDAwMCk7ICAvKiBkaXNhYmxlIGFsbCAqLworCW10ZGNyKHVpYzBjciwgMHgwMDAwMDAwMCk7ICAvKiB3ZSBoYXZlIG5vdCBjcml0aWNhbCBpbnRlcnJ1cHRzIGF0IHRoZSBtb21lbnQgKi8KKwltdGRjcih1aWMwcHIsIDB4ZmZmZmY3ZmYpOyAgLyogQWRqdXN0bWVudCBvZiB0aGUgcG9sYXJpdHkgKi8KKwltdGRjcih1aWMwdHIsIDB4MDAwMDA4MTApOyAgLyogcGVyIHJlZi1ib2FyZCBtYW51YWwgKi8KKwltdGRjcih1aWMwdnIsIDB4MDAwMDAwMDApOyAgLyogaW50MzEgaGlnaGVzdCwgYmFzZT0weDAwMCBpcyB3aXRoaW4gRERSQU0gKi8KKwltdGRjcih1aWMwc3IsIDB4ZmZmZmZmZmYpOyAgLyogY2xlYXIgYWxsICovCisKKwltdGRjcih1aWMxc3IsIDB4ZmZmZmZmZmYpOyAgLyogY2xlYXIgYWxsICovCisJbXRkY3IodWljMWVyLCAweDAwMDAwMDAwKTsgIC8qIGRpc2FibGUgYWxsICovCisJbXRkY3IodWljMWNyLCAweDAwMDAwMDAwKTsgIC8qIGFsbCBub24tY3JpdGljYWwgKi8KKwltdGRjcih1aWMxcHIsIDB4RkZGRkM3QUQpOyAgLyogQWRqdXN0bWVudCBvZiB0aGUgcG9sYXJpdHkgKi8KKwltdGRjcih1aWMxdHIsIDB4MDYwMDM4NEEpOyAgLyogcGVyIHJlZi1ib2FyZCBtYW51YWwgKi8KKwltdGRjcih1aWMxdnIsIDB4MDAwMDAwMDApOyAgLyogaW50MzEgaGlnaGVzdCwgYmFzZT0weDAwMCBpcyB3aXRoaW4gRERSQU0gKi8KKwltdGRjcih1aWMxc3IsIDB4ZmZmZmZmZmYpOyAgLyogY2xlYXIgYWxsICovCisKKwltdGRjcih1aWMyc3IsIDB4ZmZmZmZmZmYpOyAgLyogY2xlYXIgYWxsICovCisJbXRkY3IodWljMmVyLCAweDAwMDAwMDAwKTsgIC8qIGRpc2FibGUgYWxsICovCisJbXRkY3IodWljMmNyLCAweDAwMDAwMDAwKTsgIC8qIGFsbCBub24tY3JpdGljYWwgKi8KKwltdGRjcih1aWMycHIsIDB4MjdDMDAwMDApOyAgLyogQWRqdXN0bWVudCBvZiB0aGUgcG9sYXJpdHkgKi8KKwltdGRjcih1aWMydHIsIDB4REZDMDAwMDApOyAgLyogcGVyIHJlZi1ib2FyZCBtYW51YWwgKi8KKwltdGRjcih1aWMydnIsIDB4MDAwMDAwMDApOyAgLyogaW50MzEgaGlnaGVzdCwgYmFzZT0weDAwMCBpcyB3aXRoaW4gRERSQU0gKi8KKwltdGRjcih1aWMyc3IsIDB4ZmZmZmZmZmYpOyAgLyogY2xlYXIgYWxsLiBXaHkgdGhpcz8/PyAqLworCisJLyogVHJhY2UgUGlucyBhcmUgZGlzYWJsZWQuIFNEUjBfUEZDMCBSZWdpc3RlciAqLworCW10c2RyKFNEUjBfUEZDMCwgMHgwKTsKKworCS8qIHNlbGVjdCBFdGhlcm5ldCBwaW5zICovCisJbWZzZHIoU0RSMF9QRkMxLCBzZHIwX3BmYzEpOworCS8qIFNNSUkgdmlhIFpNSUkgKi8KKwlzZHIwX3BmYzEgPSAoc2RyMF9wZmMxICYgflNEUjBfUEZDMV9TRUxFQ1RfTUFTSykgfAorCQlTRFIwX1BGQzFfU0VMRUNUX0NPTkZJR182OworCW1mc2RyKFNEUjBfUEZDMiwgc2RyMF9wZmMyKTsKKwlzZHIwX3BmYzIgPSAoc2RyMF9wZmMyICYgflNEUjBfUEZDMl9TRUxFQ1RfTUFTSykgfAorCQlTRFIwX1BGQzJfU0VMRUNUX0NPTkZJR182OworCisJLyogZW5hYmxlIFNQSSAoU0NQKSAqLworCXNkcjBfcGZjMSA9IChzZHIwX3BmYzEgJiB+U0RSMF9QRkMxX1NJU19NQVNLKSB8IFNEUjBfUEZDMV9TSVNfU0NQX1NFTDsKKworCW10c2RyKFNEUjBfUEZDMiwgc2RyMF9wZmMyKTsKKwltdHNkcihTRFIwX1BGQzEsIHNkcjBfcGZjMSk7CisKKwltdHNkcihTRFIwX1BGQzQsIDB4ODAwMDAwMDApOworCisJLyogUENJIGFyYml0ZXIgZGlzYWJsZWQgKi8KKwkvKiBQQ0kgSG9zdCBDb25maWd1cmF0aW9uIGRpc2JhbGVkICovCisJbWZzZHIoc2RyX3BjaTAsIHJlZyk7CisJcmVnID0gMDsKKwltdHNkcihzZHJfcGNpMCwgMHgwMDAwMDAwMCB8IHJlZyk7CisKKwlncGlvX3dyaXRlX2JpdChDRkdfR1BJT19GTEFTSF9XUCwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIHwgbWlzY19pbml0X3IuCisgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IG1pc2NfaW5pdF9yKHZvaWQpCit7CisJdTMyIHBiY3I7CisJaW50IHNpemVfdmFsID0gMDsKKwl1MzIgcmVnOworCXVuc2lnbmVkIGxvbmcgdXNiMmQwY3IgPSAwOworCXVuc2lnbmVkIGxvbmcgdXNiMnBoeTBjciwgdXNiMmgwY3IgPSAwOworCXVuc2lnbmVkIGxvbmcgc2RyMF9wZmMxOworCisJLyoKKwkgKiBGTEFTSCBzdHVmZi4uLgorCSAqLworCisJLyogUmUtZG8gc2l6aW5nIHRvIGdldCBmdWxsIGNvcnJlY3QgaW5mbyAqLworCisJLyogYWRqdXN0IGZsYXNoIHN0YXJ0IGFuZCBvZmZzZXQgKi8KKwlnZC0+YmQtPmJpX2ZsYXNoc3RhcnQgPSAwIC0gZ2QtPmJkLT5iaV9mbGFzaHNpemU7CisJZ2QtPmJkLT5iaV9mbGFzaG9mZnNldCA9IDA7CisKKwltZmViYyhwYjBjciwgcGJjcik7CisJc3dpdGNoIChnZC0+YmQtPmJpX2ZsYXNoc2l6ZSkgeworCWNhc2UgMSA8PCAyMDoKKwkJc2l6ZV92YWwgPSAwOworCQlicmVhazsKKwljYXNlIDIgPDwgMjA6CisJCXNpemVfdmFsID0gMTsKKwkJYnJlYWs7CisJY2FzZSA0IDw8IDIwOgorCQlzaXplX3ZhbCA9IDI7CisJCWJyZWFrOworCWNhc2UgOCA8PCAyMDoKKwkJc2l6ZV92YWwgPSAzOworCQlicmVhazsKKwljYXNlIDE2IDw8IDIwOgorCQlzaXplX3ZhbCA9IDQ7CisJCWJyZWFrOworCWNhc2UgMzIgPDwgMjA6CisJCXNpemVfdmFsID0gNTsKKwkJYnJlYWs7CisJY2FzZSA2NCA8PCAyMDoKKwkJc2l6ZV92YWwgPSA2OworCQlicmVhazsKKwljYXNlIDEyOCA8PCAyMDoKKwkJc2l6ZV92YWwgPSA3OworCQlicmVhazsKKwl9CisJcGJjciA9IChwYmNyICYgMHgwMDAxZmZmZikgfCBnZC0+YmQtPmJpX2ZsYXNoc3RhcnQgfCAoc2l6ZV92YWwgPDwgMTcpOworCW10ZWJjKHBiMGNyLCBwYmNyKTsKKworCS8qCisJICogUmUtY2hlY2sgdG8gZ2V0IGNvcnJlY3QgYmFzZSBhZGRyZXNzCisJICovCisJZmxhc2hfZ2V0X3NpemUoZ2QtPmJkLT5iaV9mbGFzaHN0YXJ0LCAwKTsKKworCS8qIE1vbml0b3IgcHJvdGVjdGlvbiBPTiBieSBkZWZhdWx0ICovCisJKHZvaWQpZmxhc2hfcHJvdGVjdChGTEFHX1BST1RFQ1RfU0VULAorCQkJICAgIC1DRkdfTU9OSVRPUl9MRU4sCisJCQkgICAgMHhmZmZmZmZmZiwKKwkJCSAgICAmZmxhc2hfaW5mb1swXSk7CisKKwkvKiBFbnYgcHJvdGVjdGlvbiBPTiBieSBkZWZhdWx0ICovCisJKHZvaWQpZmxhc2hfcHJvdGVjdChGTEFHX1BST1RFQ1RfU0VULAorCQkJICAgIENGR19FTlZfQUREUl9SRURVTkQsCisJCQkgICAgQ0ZHX0VOVl9BRERSX1JFRFVORCArIDIqQ0ZHX0VOVl9TRUNUX1NJWkUgLSAxLAorCQkJICAgICZmbGFzaF9pbmZvWzBdKTsKKworCS8qCisJICogVVNCIHN1ZmYuLi4KKwkgKi8KKwkvKiBTRFIgU2V0dGluZyAqLworCW1mc2RyKFNEUjBfUEZDMSwgc2RyMF9wZmMxKTsKKwltZnNkcihTRFIwX1VTQjAsIHVzYjJkMGNyKTsKKwltZnNkcihTRFIwX1VTQjJQSFkwQ1IsIHVzYjJwaHkwY3IpOworCW1mc2RyKFNEUjBfVVNCMkgwQ1IsIHVzYjJoMGNyKTsKKworCXVzYjJwaHkwY3IgPSB1c2IycGh5MGNyICZ+U0RSMF9VU0IyUEhZMENSX1hPQ0xLX01BU0s7CisJdXNiMnBoeTBjciA9IHVzYjJwaHkwY3IgfCBTRFIwX1VTQjJQSFkwQ1JfWE9DTEtfRVhURVJOQUw7CS8qMCovCisJdXNiMnBoeTBjciA9IHVzYjJwaHkwY3IgJn5TRFIwX1VTQjJQSFkwQ1JfV0RJTlRfTUFTSzsKKwl1c2IycGh5MGNyID0gdXNiMnBoeTBjciB8IFNEUjBfVVNCMlBIWTBDUl9XRElOVF8xNkJJVF8zME1IWjsJLyoxKi8KKwl1c2IycGh5MGNyID0gdXNiMnBoeTBjciAmflNEUjBfVVNCMlBIWTBDUl9EVkJVU19NQVNLOworCXVzYjJwaHkwY3IgPSB1c2IycGh5MGNyIHwgU0RSMF9VU0IyUEhZMENSX0RWQlVTX1BVUkRJUzsJCS8qMCovCisJdXNiMnBoeTBjciA9IHVzYjJwaHkwY3IgJn5TRFIwX1VTQjJQSFkwQ1JfRFdOU1RSX01BU0s7CisJdXNiMnBoeTBjciA9IHVzYjJwaHkwY3IgfCBTRFIwX1VTQjJQSFkwQ1JfRFdOU1RSX0hPU1Q7CQkvKjEqLworCXVzYjJwaHkwY3IgPSB1c2IycGh5MGNyICZ+U0RSMF9VU0IyUEhZMENSX1VUTUlDTl9NQVNLOworCXVzYjJwaHkwY3IgPSB1c2IycGh5MGNyIHwgU0RSMF9VU0IyUEhZMENSX1VUTUlDTl9IT1NUOwkJLyoxKi8KKworCS8qIEFuIDgtYml0LzYwTUh6IGludGVyZmFjZSBpcyB0aGUgb25seSBwb3NzaWJsZSBhbHRlcm5hdGl2ZQorCSAgIHdoZW4gY29ubmVjdGluZyB0aGUgRGV2aWNlIHRvIHRoZSBQSFkgKi8KKwl1c2IyaDBjciAgID0gdXNiMmgwY3IgJn5TRFIwX1VTQjJIMENSX1dESU5UX01BU0s7CisJdXNiMmgwY3IgICA9IHVzYjJoMGNyIHwgU0RSMF9VU0IySDBDUl9XRElOVF8xNkJJVF8zME1IWjsJLyoxKi8KKworCW10c2RyKFNEUjBfUEZDMSwgc2RyMF9wZmMxKTsKKwltdHNkcihTRFIwX1VTQjAsIHVzYjJkMGNyKTsKKwltdHNkcihTRFIwX1VTQjJQSFkwQ1IsIHVzYjJwaHkwY3IpOworCW10c2RyKFNEUjBfVVNCMkgwQ1IsIHVzYjJoMGNyKTsKKworCS8qCisJICogQ2xlYXIgcmVzZXRzCisJICovCisJdWRlbGF5ICgxMDAwKTsKKwltdHNkcihTRFIwX1NSU1QxLCAweDAwMDAwMDAwKTsKKwl1ZGVsYXkgKDEwMDApOworCW10c2RyKFNEUjBfU1JTVDAsIDB4MDAwMDAwMDApOworCisJcHJpbnRmKCJVU0I6ICAgSG9zdChpbnQgcGh5KSBEZXZpY2UoZXh0IHBoeSlcbiIpOworCisJLyoKKwkgKiBDbGVhciBQTEI0QTBfQUNSW1dSUF0KKwkgKiBUaGlzIGZpeCB3aWxsIG1ha2UgdGhlIE1BTCBidXJzdCBkaXNhYmxpbmcgcGF0Y2ggZm9yIHRoZSBMaW51eAorCSAqIEVNQUMgZHJpdmVyIG9ic29sZXRlLgorCSAqLworCXJlZyA9IG1mZGNyKHBsYjRfYWNyKSAmIH5QTEI0X0FDUl9XUlA7CisJbXRkY3IocGxiNF9hY3IsIHJlZyk7CisKKwkvKgorCSAqIFJlc2V0IExpbWUgY29udHJvbGxlcgorCSAqLworCWdwaW9fd3JpdGVfYml0KENGR19HUElPX0xJTUVfUywgMSk7CisJdWRlbGF5KDUwMCk7CisJZ3Bpb193cml0ZV9iaXQoQ0ZHX0dQSU9fTElNRV9SU1QsIDEpOworCisJLyogTGltZSBtZW1vcnkgY2xvY2sgYWRqdXN0ZWQgdG8gMTMzTUh6ICovCisJb3V0X2JlMzIoKHZvaWQgKilDRkdfTElNRV9TRFJBTV9DTE9DSywgQ0ZHX0xJTUVfQ0xPQ0tfMTMzTUhaKTsKKwkvKiBXYWl0IHVudGlsbCB0aW1lIGV4cGlyZWQuIEJlY2F1c2Ugb2YgcmVxdWlyZW1lbnRzIGluIGxpbWUgbWFudWFsICovCisJdWRlbGF5KDMwMCk7CisJLyogV3JpdGUgbGltZSBjb250cm9sbGVyIG1lbW9yeSBwYXJhbWV0ZXJzICovCisJb3V0X2JlMzIoKHZvaWQgKilDRkdfTElNRV9NTVIsIENGR19MSU1FX01NUl9WQUxVRSk7CisKKwkvKgorCSAqIFJlc2V0IFBIWSdzCisJICovCisJZ3Bpb193cml0ZV9iaXQoQ0ZHX0dQSU9fUEhZMF9SU1QsIDApOworCWdwaW9fd3JpdGVfYml0KENGR19HUElPX1BIWTFfUlNULCAwKTsKKwl1ZGVsYXkoMTAwKTsKKwlncGlvX3dyaXRlX2JpdChDRkdfR1BJT19QSFkwX1JTVCwgMSk7CisJZ3Bpb193cml0ZV9iaXQoQ0ZHX0dQSU9fUEhZMV9SU1QsIDEpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjaGVja2JvYXJkKHZvaWQpCit7CisJY2hhciAqcyA9IGdldGVudigic2VyaWFsIyIpOworCisJcHJpbnRmKCJCb2FyZDogbHdtb241Iik7CisKKwlpZiAocyAhPSBOVUxMKSB7CisJCXB1dHMoIiwgc2VyaWFsIyAiKTsKKwkJcHV0cyhzKTsKKwl9CisJcHV0YygnXG4nKTsKKworCXJldHVybiAoMCk7Cit9CisKKyNpZiBkZWZpbmVkKENGR19EUkFNX1RFU1QpCitpbnQgdGVzdGRyYW0odm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nICptZW0gPSAodW5zaWduZWQgbG9uZyAqKTA7CisJY29uc3QgdW5zaWduZWQgbG9uZyBrZW5kID0gKDEwMjQgLyBzaXplb2YodW5zaWduZWQgbG9uZykpOworCXVuc2lnbmVkIGxvbmcgaywgbjsKKworCW10bXNyKDApOworCisJZm9yIChrID0gMDsgayA8IENGR19NQllURVNfU0RSQU07CisJICAgICArK2ssIG1lbSArPSAoMTAyNCAvIHNpemVvZih1bnNpZ25lZCBsb25nKSkpIHsKKwkJaWYgKChrICYgMTAyMykgPT0gMCkgeworCQkJcHJpbnRmKCIlM2QgTUJcciIsIGsgLyAxMDI0KTsKKwkJfQorCisJCW1lbXNldChtZW0sIDB4YWFhYWFhYWEsIDEwMjQpOworCQlmb3IgKG4gPSAwOyBuIDwga2VuZDsgKytuKSB7CisJCQlpZiAobWVtW25dICE9IDB4YWFhYWFhYWEpIHsKKwkJCQlwcmludGYoIlNEUkFNIHRlc3QgZmFpbHMgYXQ6ICUwOHhcbiIsCisJCQkJICAgICAgICh1aW50KSAmIG1lbVtuXSk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKworCQltZW1zZXQobWVtLCAweDU1NTU1NTU1LCAxMDI0KTsKKwkJZm9yIChuID0gMDsgbiA8IGtlbmQ7ICsrbikgeworCQkJaWYgKG1lbVtuXSAhPSAweDU1NTU1NTU1KSB7CisJCQkJcHJpbnRmKCJTRFJBTSB0ZXN0IGZhaWxzIGF0OiAlMDh4XG4iLAorCQkJCSAgICAgICAodWludCkgJiBtZW1bbl0pOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCXByaW50ZigiU0RSQU0gdGVzdCBwYXNzZXNcbiIpOworCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgcGNpX3ByZV9pbml0CisgKgorICogIFRoaXMgcm91dGluZSBpcyBjYWxsZWQganVzdCBwcmlvciB0byByZWdpc3RlcmluZyB0aGUgaG9zZSBhbmQgZ2l2ZXMKKyAqICB0aGUgYm9hcmQgdGhlIG9wcG9ydHVuaXR5IHRvIGNoZWNrIHRoaW5ncy4gUmV0dXJuaW5nIGEgdmFsdWUgb2YgemVybworICogIGluZGljYXRlcyB0aGF0IHRoaW5ncyBhcmUgYmFkICYgUENJIGluaXRpYWxpemF0aW9uIHNob3VsZCBiZSBhYm9ydGVkLgorICoKKyAqCURpZmZlcmVudCBib2FyZHMgbWF5IHdpc2ggdG8gY3VzdG9taXplIHRoZSBwY2kgY29udHJvbGxlciBzdHJ1Y3R1cmUKKyAqCShhZGQgcmVnaW9ucywgb3ZlcnJpZGUgZGVmYXVsdCBhY2Nlc3Mgcm91dGluZXMsIGV0Yykgb3IgcGVyZm9ybQorICoJY2VydGFpbiBwcmUtaW5pdGlhbGl6YXRpb24gYWN0aW9ucy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKK2ludCBwY2lfcHJlX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQoreworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgIHwgU2V0IHByaW9yaXR5IGZvciBhbGwgUExCMyBkZXZpY2VzIHRvIDAuCisJICB8IFNldCBQTEIzIGFyYml0ZXIgdG8gZmFpciBtb2RlLgorCSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCW1mc2RyKHNkcl9hbXAxLCBhZGRyKTsKKwltdHNkcihzZHJfYW1wMSwgKGFkZHIgJiAweDAwMDAwMEZGKSB8IDB4MDAwMEZGMDApOworCWFkZHIgPSBtZmRjcihwbGIzX2Fjcik7CisJbXRkY3IocGxiM19hY3IsIGFkZHIgfCAweDgwMDAwMDAwKTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgIHwgU2V0IHByaW9yaXR5IGZvciBhbGwgUExCNCBkZXZpY2VzIHRvIDAuCisJICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbWZzZHIoc2RyX2FtcDAsIGFkZHIpOworCW10c2RyKHNkcl9hbXAwLCAoYWRkciAmIDB4MDAwMDAwRkYpIHwgMHgwMDAwRkYwMCk7CisJYWRkciA9IG1mZGNyKHBsYjRfYWNyKSB8IDB4YTAwMDAwMDA7CS8qIFdhcyAweDgtLS0tICovCisJbXRkY3IocGxiNF9hY3IsIGFkZHIpOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAgfCBTZXQgTmVidWxhIFBMQjQgYXJiaXRlciB0byBmYWlyIG1vZGUuCisJICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJLyogU2VnbWVudDAgKi8KKwlhZGRyID0gKG1mZGNyKHBsYjBfYWNyKSAmIH5wbGIwX2Fjcl9wcG1fbWFzaykgfCBwbGIwX2Fjcl9wcG1fZmFpcjsKKwlhZGRyID0gKGFkZHIgJiB+cGxiMF9hY3JfaGJ1X21hc2spIHwgcGxiMF9hY3JfaGJ1X2VuYWJsZWQ7CisJYWRkciA9IChhZGRyICYgfnBsYjBfYWNyX3JkcF9tYXNrKSB8IHBsYjBfYWNyX3JkcF80ZGVlcDsKKwlhZGRyID0gKGFkZHIgJiB+cGxiMF9hY3Jfd3JwX21hc2spIHwgcGxiMF9hY3Jfd3JwXzJkZWVwOworCW10ZGNyKHBsYjBfYWNyLCBhZGRyKTsKKworCS8qIFNlZ21lbnQxICovCisJYWRkciA9IChtZmRjcihwbGIxX2FjcikgJiB+cGxiMV9hY3JfcHBtX21hc2spIHwgcGxiMV9hY3JfcHBtX2ZhaXI7CisJYWRkciA9IChhZGRyICYgfnBsYjFfYWNyX2hidV9tYXNrKSB8IHBsYjFfYWNyX2hidV9lbmFibGVkOworCWFkZHIgPSAoYWRkciAmIH5wbGIxX2Fjcl9yZHBfbWFzaykgfCBwbGIxX2Fjcl9yZHBfNGRlZXA7CisJYWRkciA9IChhZGRyICYgfnBsYjFfYWNyX3dycF9tYXNrKSB8IHBsYjFfYWNyX3dycF8yZGVlcDsKKwltdGRjcihwbGIxX2FjciwgYWRkcik7CisKKwlyZXR1cm4gMTsKK30KKyNlbmRpZgkvKiBkZWZpbmVkKENPTkZJR19QQ0kpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgcGNpX3RhcmdldF9pbml0CisgKgorICoJVGhlIGJvb3RzdHJhcCBjb25maWd1cmF0aW9uIHByb3ZpZGVzIGRlZmF1bHQgc2V0dGluZ3MgZm9yIHRoZSBwY2kKKyAqCWluYm91bmQgbWFwIChQSU0pLiBCdXQgdGhlIGJvb3RzdHJhcCBjb25maWcgY2hvaWNlcyBhcmUgbGltaXRlZCBhbmQKKyAqCW1heSBub3QgYmUgc3VmZmljaWVudCBmb3IgYSBnaXZlbiBib2FyZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkgJiYgZGVmaW5lZChDRkdfUENJX1RBUkdFVF9JTklUKQordm9pZCBwY2lfdGFyZ2V0X2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQoreworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICogU2V0IHVwIERpcmVjdCBNTUlPIHJlZ2lzdGVycworCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICB8IFBvd2VyUEM0NDBFUFggUENJIE1hc3RlciBjb25maWd1cmF0aW9uLgorCSAgfCBNYXAgb25lIDFHaWcgcmFuZ2Ugb2YgUExCL3Byb2Nlc3NvciBhZGRyZXNzZXMgdG8gUENJIG1lbW9yeSBzcGFjZS4KKwkgIHwgICBQTEIgYWRkcmVzcyAweEEwMDAwMDAwLTB4REZGRkZGRkYgPT0+IFBDSSBhZGRyZXNzIDB4QTAwMDAwMDAtMHhERkZGRkZGRgorCSAgfCAgIFVzZSBieXRlIHJldmVyc2VkIG91dCByb3V0aW5lcyB0byBoYW5kbGUgZW5kaWFuZXNzLgorCSAgfCBNYWtlIHRoaXMgcmVnaW9uIG5vbi1wcmVmZXRjaGFibGUuCisJICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCW91dDMycihQQ0lYMF9QTU0wTUEsIDB4MDAwMDAwMDApOwkvKiBQTU0wIE1hc2svQXR0cmlidXRlIC0gZGlzYWJsZWQgYjQgc2V0dGluZyAqLworCW91dDMycihQQ0lYMF9QTU0wTEEsIENGR19QQ0lfTUVNQkFTRSk7CS8qIFBNTTAgTG9jYWwgQWRkcmVzcyAqLworCW91dDMycihQQ0lYMF9QTU0wUENJTEEsIENGR19QQ0lfTUVNQkFTRSk7CS8qIFBNTTAgUENJIExvdyBBZGRyZXNzICovCisJb3V0MzJyKFBDSVgwX1BNTTBQQ0lIQSwgMHgwMDAwMDAwMCk7CS8qIFBNTTAgUENJIEhpZ2ggQWRkcmVzcyAqLworCW91dDMycihQQ0lYMF9QTU0wTUEsIDB4RTAwMDAwMDEpOwkvKiA1MTJNICsgTm8gcHJlZmV0Y2hpbmcsIGFuZCBlbmFibGUgcmVnaW9uICovCisKKwlvdXQzMnIoUENJWDBfUE1NMU1BLCAweDAwMDAwMDAwKTsJLyogUE1NMCBNYXNrL0F0dHJpYnV0ZSAtIGRpc2FibGVkIGI0IHNldHRpbmcgKi8KKwlvdXQzMnIoUENJWDBfUE1NMUxBLCBDRkdfUENJX01FTUJBU0UyKTsgLyogUE1NMCBMb2NhbCBBZGRyZXNzICovCisJb3V0MzJyKFBDSVgwX1BNTTFQQ0lMQSwgQ0ZHX1BDSV9NRU1CQVNFMik7CS8qIFBNTTAgUENJIExvdyBBZGRyZXNzICovCisJb3V0MzJyKFBDSVgwX1BNTTFQQ0lIQSwgMHgwMDAwMDAwMCk7CS8qIFBNTTAgUENJIEhpZ2ggQWRkcmVzcyAqLworCW91dDMycihQQ0lYMF9QTU0xTUEsIDB4RTAwMDAwMDEpOwkvKiA1MTJNICsgTm8gcHJlZmV0Y2hpbmcsIGFuZCBlbmFibGUgcmVnaW9uICovCisKKwlvdXQzMnIoUENJWDBfUFRNMU1TLCAweDAwMDAwMDAxKTsJLyogTWVtb3J5IFNpemUvQXR0cmlidXRlICovCisJb3V0MzJyKFBDSVgwX1BUTTFMQSwgMCk7CS8qIExvY2FsIEFkZHIuIFJlZyAqLworCW91dDMycihQQ0lYMF9QVE0yTVMsIDApOwkvKiBNZW1vcnkgU2l6ZS9BdHRyaWJ1dGUgKi8KKwlvdXQzMnIoUENJWDBfUFRNMkxBLCAwKTsJLyogTG9jYWwgQWRkci4gUmVnICovCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAqIFNldCB1cCBDb25maWd1cmF0aW9uIHJlZ2lzdGVycworCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJLyogUHJvZ3JhbSB0aGUgYm9hcmQncyBzdWJzeXN0ZW0gaWQvdmVuZG9yIGlkICovCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKDAsIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELAorCQkJICAgICAgQ0ZHX1BDSV9TVUJTWVNfVkVORE9SSUQpOworCXBjaV93cml0ZV9jb25maWdfd29yZCgwLCBQQ0lfU1VCU1lTVEVNX0lELCBDRkdfUENJX1NVQlNZU19JRCk7CisKKwkvKiBDb25maWd1cmUgY29tbWFuZCByZWdpc3RlciBhcyBidXMgbWFzdGVyICovCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKDAsIFBDSV9DT01NQU5ELCBQQ0lfQ09NTUFORF9NQVNURVIpOworCisJLyogMjQwblMgUENJIGNsb2NrICovCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKDAsIFBDSV9MQVRFTkNZX1RJTUVSLCAxKTsKKworCS8qIE5vIGVycm9yIHJlcG9ydGluZyAqLworCXBjaV93cml0ZV9jb25maWdfd29yZCgwLCBQQ0lfRVJSRU4sIDApOworCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCgwLCBQQ0lfQlJER09QVDIsIDB4MDAwMDAxMDEpOworCit9CisjZW5kaWYJCQkJLyogZGVmaW5lZChDT05GSUdfUENJKSAmJiBkZWZpbmVkKENGR19QQ0lfVEFSR0VUX0lOSVQpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgcGNpX21hc3Rlcl9pbml0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpICYmIGRlZmluZWQoQ0ZHX1BDSV9NQVNURVJfSU5JVCkKK3ZvaWQgcGNpX21hc3Rlcl9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKK3sKKwl1bnNpZ25lZCBzaG9ydCB0ZW1wX3Nob3J0OworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgIHwgV3JpdGUgdGhlIFBvd2VyUEM0NDAgRVAgUENJIENvbmZpZ3VyYXRpb24gcmVncy4KKwkgIHwgICBFbmFibGUgUG93ZXJQQzQ0MCBFUCB0byBiZSBhIG1hc3RlciBvbiB0aGUgUENJIGJ1cyAoUE1NKS4KKwkgIHwgICBFbmFibGUgUG93ZXJQQzQ0MCBFUCB0byBhY3QgYXMgYSBQQ0kgbWVtb3J5IHRhcmdldCAoUFRNKS4KKwkgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoMCwgUENJX0NPTU1BTkQsICZ0ZW1wX3Nob3J0KTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoMCwgUENJX0NPTU1BTkQsCisJCQkgICAgICB0ZW1wX3Nob3J0IHwgUENJX0NPTU1BTkRfTUFTVEVSIHwKKwkJCSAgICAgIFBDSV9DT01NQU5EX01FTU9SWSk7Cit9CisjZW5kaWYJCQkJLyogZGVmaW5lZChDT05GSUdfUENJKSAmJiBkZWZpbmVkKENGR19QQ0lfTUFTVEVSX0lOSVQpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgaXNfcGNpX2hvc3QKKyAqCisgKglUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGRldGVybWluZSBpZiBhIHBjaSBzY2FuIHNob3VsZCBiZQorICoJcGVyZm9ybWVkLiBXaXRoIHZhcmlvdXMgaGFyZHdhcmUgZW52aXJvbm1lbnRzIChlc3BlY2lhbGx5IGNQQ0kgYW5kCisgKglQUE1DKSBpdCdzIGluc3VmZmljaWVudCB0byBkZXBlbmQgb24gdGhlIHN0YXRlIG9mIHRoZSBhcmJpdGVyIGVuYWJsZQorICoJYml0IGluIHRoZSBzdHJhcCByZWdpc3Rlciwgb3IgZ2VuZXJpYyBob3N0L2FkYXB0ZXIgYXNzdW1wdGlvbnMuCisgKgorICoJUmF0aGVyIHRoYW4gaGFyZC1jb2RlIGEgYmFkIGFzc3VtcHRpb24gaW4gdGhlIGdlbmVyYWwgNDQwIGNvZGUsIHRoZQorICoJNDQwIHBjaSBjb2RlIHJlcXVpcmVzIHRoZSBib2FyZCB0byBkZWNpZGUgYXQgcnVudGltZS4KKyAqCisgKglSZXR1cm4gMCBmb3IgYWRhcHRlciBtb2RlLCBub24temVybyBmb3IgaG9zdCAobW9uYXJjaCkgbW9kZS4KKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCitpbnQgaXNfcGNpX2hvc3Qoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQoreworCS8qIENhY3R1cyBpcyBhbHdheXMgY29uZmlndXJlZCBhcyBob3N0LiAqLworCXJldHVybiAoMSk7Cit9CisjZW5kaWYJCQkJLyogZGVmaW5lZChDT05GSUdfUENJKSAqLworCit2b2lkIGh3X3dhdGNoZG9nX3Jlc2V0KHZvaWQpCit7CisJaW50IHZhbDsKKworCS8qCisJICogVG9nZ2xlIHdhdGNoZG9nIG91dHB1dAorCSAqLworCXZhbCA9IGdwaW9fcmVhZF9vdXRfYml0KENGR19HUElPX1dBVENIRE9HKSA9PSAwID8gMSA6IDA7CisJZ3Bpb193cml0ZV9iaXQoQ0ZHX0dQSU9fV0FUQ0hET0csIHZhbCk7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9sd21vbjUvc2RyYW0uYyBiL2JvYXJkL2x3bW9uNS9zZHJhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNGE4ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9sd21vbjUvc2RyYW0uYwpAQCAtMCwwICsxLDY2MiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogU3lsdmllIEdvaGwsCQkgICAgQU1DQy9JQk0sIGdvaGwuc3lsdmllQGZyLmlibS5jb20KKyAqIEphY3F1ZWxpbmUgUGlyYS1GZXJyaW9sLCBBTUNDL0lCTSwganBpcmEtZmVycmlvbEBmci5pYm0uY29tCisgKiBUaGllcnJ5IFJvbWFuLAkgICAgQU1DQy9JQk0sIHRoaWVycnlfcm9tYW5AZnIuaWJtLmNvbQorICogQWxhaW4gU2F1cmVsLAkgICAgQU1DQy9JQk0sIGFsYWluLnNhdXJlbEBmci5pYm0uY29tCisgKiBSb2JlcnQgU255ZGVyLAkgICAgQU1DQy9JQk0sIHJvYi5zbnlkZXJAZnIuaWJtLmNvbQorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNworICogU3RlZmFuIFJvZXNlLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCBzckBkZW54LmRlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qIGRlZmluZSBERUJVRyBmb3IgZGVidWdnaW5nIG91dHB1dCAob2J2aW91c2x5IDstKSkgKi8KKyNpZiAwCisjZGVmaW5lIERFQlVHCisjZW5kaWYKKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vbW11Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8cHBjNDQwLmg+CisKKyNpbmNsdWRlICJzZHJhbS5oIgorCisvKgorICogVGhpcyBERFIyIHNldHVwIGNvZGUgY2FuIGR5bmFtaWNhbGx5IHNldHVwIHRoZSBUTEIgZW50cmllcyBmb3IgdGhlIEREUjIgbWVtb3J5CisgKiByZWdpb24uIFJpZ2h0IG5vdyB0aGUgY2FjaGUgc2hvdWxkIHN0aWxsIGJlIGRpc2FibGVkIGluIFUtQm9vdCBiZWNhdXNlIG9mIHRoZQorICogRU1BQyBkcml2ZXIsIHRoYXQgbmVlZCBpdCdzIGJ1ZmZlciBkZXNjcmlwdG9yIHRvIGJlIGxvY2F0ZWQgaW4gbm9uIGNhY2hlZAorICogbWVtb3J5LgorICoKKyAqIElmIGF0IHNvbWUgdGltZSB0aGlzIHJlc3RyaWN0aW9uIGRvZXNuJ3QgYXBwbHkgYW55bW9yZSwganVzdCBkZWZpbmUKKyAqIENGR19FTkFCTEVfU0RSQU1fQ0FDSEUgaW4gdGhlIGJvYXJkIGNvbmZpZyBmaWxlIGFuZCB0aGlzIGNvZGUgc2hvdWxkIHNldHVwCisgKiBldmVyeXRoaW5nIGNvcnJlY3RseS4KKyAqLworI2lmZGVmIENGR19FTkFCTEVfU0RSQU1fQ0FDSEUKKyNkZWZpbmUgTVlfVExCX1dPUkQyX0lfRU5BQkxFCTAJCQkvKiBlbmFibGUgY2FjaGluZyBvbiBTRFJBTSAqLworI2Vsc2UKKyNkZWZpbmUgTVlfVExCX1dPUkQyX0lfRU5BQkxFCVRMQl9XT1JEMl9JX0VOQUJMRQkvKiBkaXNhYmxlIGNhY2hpbmcgb24gU0RSQU0gKi8KKyNlbmRpZgorCit2b2lkIHByb2dyYW1fdGxiKHUzMiBwaHlzX2FkZHIsIHUzMiB2aXJ0X2FkZHIsIHUzMiBzaXplLCB1MzIgdGxiX3dvcmQyX2lfdmFsdWUpOwordm9pZCBkY2J6X2FyZWEodTMyIHN0YXJ0X2FkZHJlc3MsIHUzMiBudW1fYnl0ZXMpOwordm9pZCBkZmx1c2godm9pZCk7CisKKyNpZmRlZiBDT05GSUdfQUREX1JBTV9JTkZPCitzdGF0aWMgdTMyIGlzX2VjY19lbmFibGVkKHZvaWQpCit7CisJdTMyIHZhbDsKKworCW1mc2RyYW0oRERSMF8yMiwgdmFsKTsKKwl2YWwgJj0gRERSMF8yMl9DVFJMX1JBV19NQVNLOworCWlmICh2YWwpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYm9hcmRfYWRkX3JhbV9pbmZvKGludCB1c2VfZGVmYXVsdCkKK3sKKwlQUEM0NDBfU1lTX0lORk8gYm9hcmRfY2ZnOworCXUzMiB2YWw7CisKKwlpZiAoaXNfZWNjX2VuYWJsZWQoKSkKKwkJcHV0cygiIChFQ0MiKTsKKwllbHNlCisJCXB1dHMoIiAoRUNDIG5vdCIpOworCisJZ2V0X3N5c19pbmZvKCZib2FyZF9jZmcpOworCXByaW50ZigiIGVuYWJsZWQsICVkIE1IeiIsIChib2FyZF9jZmcuZnJlcVBMQiAqIDIpIC8gMTAwMDAwMCk7CisKKwltZnNkcmFtKEREUjBfMDMsIHZhbCk7CisJdmFsID0gRERSMF8wM19DQVNMQVRfREVDT0RFKHZhbCk7CisJcHJpbnRmKCIsIENMJWQpIiwgdmFsKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHdhaXRfZm9yX2RsbGxvY2sodm9pZCkKK3sKKwl1MzIgdmFsOworCWludCB3YWl0ID0gMDsKKworCS8qCisJICogV2FpdCBmb3IgdGhlIERDQyBtYXN0ZXIgZGVsYXkgbGluZSB0byBmaW5pc2ggY2FsaWJyYXRpb24KKwkgKi8KKwltdGRjcihkZHJjZmdhLCBERFIwXzE3KTsKKwl2YWwgPSBERFIwXzE3X0RMTExPQ0tSRUdfVU5MT0NLRUQ7CisKKwl3aGlsZSAod2FpdCAhPSAweGZmZmYpIHsKKwkJdmFsID0gbWZkY3IoZGRyY2ZnZCk7CisJCWlmICgodmFsICYgRERSMF8xN19ETExMT0NLUkVHX01BU0spID09IEREUjBfMTdfRExMTE9DS1JFR19MT0NLRUQpCisJCQkvKiBkbGxsb2NrcmVnIGJpdCBvbiAqLworCQkJcmV0dXJuIDA7CisJCWVsc2UKKwkJCXdhaXQrKzsKKwl9CisJZGVidWcoIjB4JTA0eDogRERSMF8xNyBWYWx1ZSAoZGxsbG9ja3JlZyBiaXQpOiAweCUwOHhcbiIsIHdhaXQsIHZhbCk7CisJZGVidWcoIldhaXRpbmcgZm9yIGRsbGxvY2tyZWcgYml0IHRvIHJhaXNlXG4iKTsKKworCXJldHVybiAtMTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX0REUl9EQVRBX0VZRSkKK2ludCB3YWl0X2Zvcl9kcmFtX2luaXRfY29tcGxldGUodm9pZCkKK3sKKwl1MzIgdmFsOworCWludCB3YWl0ID0gMDsKKworCS8qCisJICogV2FpdCBmb3IgJ0RSQU0gaW5pdGlhbGl6YXRpb24gY29tcGxldGUnIGJpdCBpbiBzdGF0dXMgcmVnaXN0ZXIKKwkgKi8KKwltdGRjcihkZHJjZmdhLCBERFIwXzAwKTsKKworCXdoaWxlICh3YWl0ICE9IDB4ZmZmZikgeworCQl2YWwgPSBtZmRjcihkZHJjZmdkKTsKKwkJaWYgKCh2YWwgJiBERFIwXzAwX0lOVF9TVEFUVVNfQklUNikgPT0gRERSMF8wMF9JTlRfU1RBVFVTX0JJVDYpCisJCQkvKiAnRFJBTSBpbml0aWFsaXphdGlvbiBjb21wbGV0ZScgYml0ICovCisJCQlyZXR1cm4gMDsKKwkJZWxzZQorCQkJd2FpdCsrOworCX0KKworCWRlYnVnKCJEUkFNIGluaXRpYWxpemF0aW9uIGNvbXBsZXRlIGJpdCBpbiBzdGF0dXMgcmVnaXN0ZXIgZGlkIG5vdCByaXNlXG4iKTsKKworCXJldHVybiAtMTsKK30KKworI2RlZmluZSBOVU1fVFJJRVMgNjQKKyNkZWZpbmUgTlVNX1JFQURTIDEwCisKK3ZvaWQgZGVuYWxpX2NvcmVfc2VhcmNoX2RhdGFfZXllKHUzMiBzdGFydF9hZGRyLCB1MzIgbWVtb3J5X3NpemUpCit7CisJaW50IGssIGo7CisJdTMyIHZhbDsKKwl1MzIgd3JfZHFzX3NoaWZ0LCBkcXNfb3V0X3NoaWZ0LCBkbGxfZHFzX2RlbGF5X1g7CisJdTMyIG1heF9wYXNzaW5nX2Nhc2VzID0gMCwgd3JfZHFzX3NoaWZ0X3dpdGhfbWF4X3Bhc3NpbmdfY2FzZXMgPSAwOworCXUzMiBwYXNzaW5nX2Nhc2VzID0gMCwgZGxsX2Rxc19kZWxheV9YX3N3X3ZhbCA9IDA7CisJdTMyIGRsbF9kcXNfZGVsYXlfWF9zdGFydF93aW5kb3cgPSAwLCBkbGxfZHFzX2RlbGF5X1hfZW5kX3dpbmRvdyA9IDA7CisJdm9sYXRpbGUgdTMyICpyYW1fcG9pbnRlcjsKKwl1MzIgdGVzdFtOVU1fVFJJRVNdID0geworCQkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLAorCQkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLAorCQkweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCQkweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCQkweEFBQUFBQUFBLCAweEFBQUFBQUFBLCAweDU1NTU1NTU1LCAweDU1NTU1NTU1LAorCQkweEFBQUFBQUFBLCAweEFBQUFBQUFBLCAweDU1NTU1NTU1LCAweDU1NTU1NTU1LAorCQkweDU1NTU1NTU1LCAweDU1NTU1NTU1LCAweEFBQUFBQUFBLCAweEFBQUFBQUFBLAorCQkweDU1NTU1NTU1LCAweDU1NTU1NTU1LCAweEFBQUFBQUFBLCAweEFBQUFBQUFBLAorCQkweEE1QTVBNUE1LCAweEE1QTVBNUE1LCAweDVBNUE1QTVBLCAweDVBNUE1QTVBLAorCQkweEE1QTVBNUE1LCAweEE1QTVBNUE1LCAweDVBNUE1QTVBLCAweDVBNUE1QTVBLAorCQkweDVBNUE1QTVBLCAweDVBNUE1QTVBLCAweEE1QTVBNUE1LCAweEE1QTVBNUE1LAorCQkweDVBNUE1QTVBLCAweDVBNUE1QTVBLCAweEE1QTVBNUE1LCAweEE1QTVBNUE1LAorCQkweEFBNTVBQTU1LCAweEFBNTVBQTU1LCAweDU1QUE1NUFBLCAweDU1QUE1NUFBLAorCQkweEFBNTVBQTU1LCAweEFBNTVBQTU1LCAweDU1QUE1NUFBLCAweDU1QUE1NUFBLAorCQkweDU1QUE1NUFBLCAweDU1QUE1NUFBLCAweEFBNTVBQTU1LCAweEFBNTVBQTU1LAorCQkweDU1QUE1NUFBLCAweDU1QUE1NUFBLCAweEFBNTVBQTU1LCAweEFBNTVBQTU1IH07CisKKwlyYW1fcG9pbnRlciA9ICh2b2xhdGlsZSB1MzIgKilzdGFydF9hZGRyOworCisJZm9yICh3cl9kcXNfc2hpZnQgPSA2NDsgd3JfZHFzX3NoaWZ0IDwgOTY7IHdyX2Rxc19zaGlmdCsrKSB7CisJCS8qZm9yICh3cl9kcXNfc2hpZnQ9MTsgd3JfZHFzX3NoaWZ0PDk2OyB3cl9kcXNfc2hpZnQrKykgeyovCisKKwkJLyoKKwkJICogRGUtYXNzZXJ0ICdzdGFydCcgcGFyYW1ldGVyLgorCQkgKi8KKwkJbXRkY3IoZGRyY2ZnYSwgRERSMF8wMik7CisJCXZhbCA9IChtZmRjcihkZHJjZmdkKSAmIH5ERFIwXzAyX1NUQVJUX01BU0spIHwgRERSMF8wMl9TVEFSVF9PRkY7CisJCW10ZGNyKGRkcmNmZ2QsIHZhbCk7CisKKwkJLyoKKwkJICogU2V0ICd3cl9kcXNfc2hpZnQnCisJCSAqLworCQltdGRjcihkZHJjZmdhLCBERFIwXzA5KTsKKwkJdmFsID0gKG1mZGNyKGRkcmNmZ2QpICYgfkREUjBfMDlfV1JfRFFTX1NISUZUX01BU0spCisJCQl8IEREUjBfMDlfV1JfRFFTX1NISUZUX0VOQ09ERSh3cl9kcXNfc2hpZnQpOworCQltdGRjcihkZHJjZmdkLCB2YWwpOworCisJCS8qCisJCSAqIFNldCAnZHFzX291dF9zaGlmdCcgPSB3cl9kcXNfc2hpZnQgKyAzMgorCQkgKi8KKwkJZHFzX291dF9zaGlmdCA9IHdyX2Rxc19zaGlmdCArIDMyOworCQltdGRjcihkZHJjZmdhLCBERFIwXzIyKTsKKwkJdmFsID0gKG1mZGNyKGRkcmNmZ2QpICYgfkREUjBfMjJfRFFTX09VVF9TSElGVF9NQVNLKQorCQkJfCBERFIwXzIyX0RRU19PVVRfU0hJRlRfRU5DT0RFKGRxc19vdXRfc2hpZnQpOworCQltdGRjcihkZHJjZmdkLCB2YWwpOworCisJCXBhc3NpbmdfY2FzZXMgPSAwOworCisJCWZvciAoZGxsX2Rxc19kZWxheV9YID0gMTsgZGxsX2Rxc19kZWxheV9YIDwgNjQ7IGRsbF9kcXNfZGVsYXlfWCsrKSB7CisJCQkvKmZvciAoZGxsX2Rxc19kZWxheV9YPTE7IGRsbF9kcXNfZGVsYXlfWDwxMjg7IGRsbF9kcXNfZGVsYXlfWCsrKSB7Ki8KKwkJCS8qCisJCQkgKiBTZXQgJ2RsbF9kcXNfZGVsYXlfWCcuCisJCQkgKi8KKwkJCS8qIGRsbF9kcXNfZGVsYXlfMCAqLworCQkJbXRkY3IoZGRyY2ZnYSwgRERSMF8xNyk7CisJCQl2YWwgPSAobWZkY3IoZGRyY2ZnZCkgJiB+RERSMF8xN19ETExfRFFTX0RFTEFZXzBfTUFTSykKKwkJCQl8IEREUjBfMTdfRExMX0RRU19ERUxBWV8wX0VOQ09ERShkbGxfZHFzX2RlbGF5X1gpOworCQkJbXRkY3IoZGRyY2ZnZCwgdmFsKTsKKwkJCS8qIGRsbF9kcXNfZGVsYXlfMSB0byBkbGxfZHFzX2RlbGF5XzQgKi8KKwkJCW10ZGNyKGRkcmNmZ2EsIEREUjBfMTgpOworCQkJdmFsID0gKG1mZGNyKGRkcmNmZ2QpICYgfkREUjBfMThfRExMX0RRU19ERUxBWV9YX01BU0spCisJCQkJfCBERFIwXzE4X0RMTF9EUVNfREVMQVlfNF9FTkNPREUoZGxsX2Rxc19kZWxheV9YKQorCQkJCXwgRERSMF8xOF9ETExfRFFTX0RFTEFZXzNfRU5DT0RFKGRsbF9kcXNfZGVsYXlfWCkKKwkJCQl8IEREUjBfMThfRExMX0RRU19ERUxBWV8yX0VOQ09ERShkbGxfZHFzX2RlbGF5X1gpCisJCQkJfCBERFIwXzE4X0RMTF9EUVNfREVMQVlfMV9FTkNPREUoZGxsX2Rxc19kZWxheV9YKTsKKwkJCW10ZGNyKGRkcmNmZ2QsIHZhbCk7CisJCQkvKiBkbGxfZHFzX2RlbGF5XzUgdG8gZGxsX2Rxc19kZWxheV84ICovCisJCQltdGRjcihkZHJjZmdhLCBERFIwXzE5KTsKKwkJCXZhbCA9IChtZmRjcihkZHJjZmdkKSAmIH5ERFIwXzE5X0RMTF9EUVNfREVMQVlfWF9NQVNLKQorCQkJCXwgRERSMF8xOV9ETExfRFFTX0RFTEFZXzhfRU5DT0RFKGRsbF9kcXNfZGVsYXlfWCkKKwkJCQl8IEREUjBfMTlfRExMX0RRU19ERUxBWV83X0VOQ09ERShkbGxfZHFzX2RlbGF5X1gpCisJCQkJfCBERFIwXzE5X0RMTF9EUVNfREVMQVlfNl9FTkNPREUoZGxsX2Rxc19kZWxheV9YKQorCQkJCXwgRERSMF8xOV9ETExfRFFTX0RFTEFZXzVfRU5DT0RFKGRsbF9kcXNfZGVsYXlfWCk7CisJCQltdGRjcihkZHJjZmdkLCB2YWwpOworCisJCQlwcGNNc3luYygpOworCQkJcHBjTWJhcigpOworCisJCQkvKgorCQkJICogQXNzZXJ0ICdzdGFydCcgcGFyYW1ldGVyLgorCQkJICovCisJCQltdGRjcihkZHJjZmdhLCBERFIwXzAyKTsKKwkJCXZhbCA9IChtZmRjcihkZHJjZmdkKSAmIH5ERFIwXzAyX1NUQVJUX01BU0spIHwgRERSMF8wMl9TVEFSVF9PTjsKKwkJCW10ZGNyKGRkcmNmZ2QsIHZhbCk7CisKKwkJCXBwY01zeW5jKCk7CisJCQlwcGNNYmFyKCk7CisKKwkJCS8qCisJCQkgKiBXYWl0IGZvciB0aGUgRENDIG1hc3RlciBkZWxheSBsaW5lIHRvIGZpbmlzaCBjYWxpYnJhdGlvbgorCQkJICovCisJCQlpZiAod2FpdF9mb3JfZGxsbG9jaygpICE9IDApIHsKKwkJCQlwcmludGYoImRsbGxvY2sgZGlkIG5vdCBvY2N1ciAhISFcbiIpOworCQkJCXByaW50ZigiZGVuYWxpX2NvcmVfc2VhcmNoX2RhdGFfZXllISEhXG4iKTsKKwkJCQlwcmludGYoIndyX2Rxc19zaGlmdCA9ICVkIC0gZGxsX2Rxc19kZWxheV9YID0gJWRcbiIsCisJCQkJICAgICAgIHdyX2Rxc19zaGlmdCwgZGxsX2Rxc19kZWxheV9YKTsKKwkJCQloYW5nKCk7CisJCQl9CisJCQlwcGNNc3luYygpOworCQkJcHBjTWJhcigpOworCisJCQlpZiAod2FpdF9mb3JfZHJhbV9pbml0X2NvbXBsZXRlKCkgIT0gMCkgeworCQkJCXByaW50ZigiZHJhbSBpbml0IGNvbXBsZXRlIGRpZCBub3Qgb2NjdXIgISEhXG4iKTsKKwkJCQlwcmludGYoImRlbmFsaV9jb3JlX3NlYXJjaF9kYXRhX2V5ZSEhIVxuIik7CisJCQkJcHJpbnRmKCJ3cl9kcXNfc2hpZnQgPSAlZCAtIGRsbF9kcXNfZGVsYXlfWCA9ICVkXG4iLAorCQkJCSAgICAgICB3cl9kcXNfc2hpZnQsIGRsbF9kcXNfZGVsYXlfWCk7CisJCQkJaGFuZygpOworCQkJfQorCQkJdWRlbGF5KDEwMCk7ICAvKiB3YWl0IDEwMHVzIHRvIGVuc3VyZSBpbml0IGlzIHJlYWxseSBjb21wbGV0ZWQgISEhICovCisKKwkJCS8qIHdyaXRlIHZhbHVlcyAqLworCQkJZm9yIChqPTA7IGo8TlVNX1RSSUVTOyBqKyspIHsKKwkJCQlyYW1fcG9pbnRlcltqXSA9IHRlc3Rbal07CisKKwkJCQkvKiBjbGVhciBhbnkgY2FjaGUgYXQgcmFtIGxvY2F0aW9uICovCisJCQkJX19hc21fXygiZGNiZiAwLCUwIjogOiJyIiAoJnJhbV9wb2ludGVyW2pdKSk7CisJCQl9CisKKwkJCS8qIHJlYWQgdmFsdWVzIGJhY2sgKi8KKwkJCWZvciAoaj0wOyBqPE5VTV9UUklFUzsgaisrKSB7CisJCQkJZm9yIChrPTA7IGs8TlVNX1JFQURTOyBrKyspIHsKKwkJCQkJLyogY2xlYXIgYW55IGNhY2hlIGF0IHJhbSBsb2NhdGlvbiAqLworCQkJCQlfX2FzbV9fKCJkY2JmIDAsJTAiOiA6InIiICgmcmFtX3BvaW50ZXJbal0pKTsKKworCQkJCQlpZiAocmFtX3BvaW50ZXJbal0gIT0gdGVzdFtqXSkKKwkJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8qIHJlYWQgZXJyb3IgKi8KKwkJCQlpZiAoayAhPSBOVU1fUkVBRFMpCisJCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBTZWUgaWYgdGhlIGRsbF9kcXNfZGVsYXlfWCB2YWx1ZSBwYXNzZWQuKi8KKwkJCWlmIChqIDwgTlVNX1RSSUVTKSB7CisJCQkJLyogRmFpbGVkICovCisJCQkJcGFzc2luZ19jYXNlcyA9IDA7CisJCQkJLyogYnJlYWs7ICovCisJCQl9IGVsc2UgeworCQkJCS8qIFBhc3NlZCAqLworCQkJCWlmIChwYXNzaW5nX2Nhc2VzID09IDApCisJCQkJCWRsbF9kcXNfZGVsYXlfWF9zd192YWwgPSBkbGxfZHFzX2RlbGF5X1g7CisJCQkJcGFzc2luZ19jYXNlcysrOworCQkJCWlmIChwYXNzaW5nX2Nhc2VzID49IG1heF9wYXNzaW5nX2Nhc2VzKSB7CisJCQkJCW1heF9wYXNzaW5nX2Nhc2VzID0gcGFzc2luZ19jYXNlczsKKwkJCQkJd3JfZHFzX3NoaWZ0X3dpdGhfbWF4X3Bhc3NpbmdfY2FzZXMgPSB3cl9kcXNfc2hpZnQ7CisJCQkJCWRsbF9kcXNfZGVsYXlfWF9zdGFydF93aW5kb3cgPSBkbGxfZHFzX2RlbGF5X1hfc3dfdmFsOworCQkJCQlkbGxfZHFzX2RlbGF5X1hfZW5kX3dpbmRvdyA9IGRsbF9kcXNfZGVsYXlfWDsKKwkJCQl9CisJCQl9CisKKwkJCS8qCisJCQkgKiBEZS1hc3NlcnQgJ3N0YXJ0JyBwYXJhbWV0ZXIuCisJCQkgKi8KKwkJCW10ZGNyKGRkcmNmZ2EsIEREUjBfMDIpOworCQkJdmFsID0gKG1mZGNyKGRkcmNmZ2QpICYgfkREUjBfMDJfU1RBUlRfTUFTSykgfCBERFIwXzAyX1NUQVJUX09GRjsKKwkJCW10ZGNyKGRkcmNmZ2QsIHZhbCk7CisKKwkJfSAvKiBmb3IgKGRsbF9kcXNfZGVsYXlfWD0wOyBkbGxfZHFzX2RlbGF5X1g8MTI4OyBkbGxfZHFzX2RlbGF5X1grKykgKi8KKworCX0gLyogZm9yICh3cl9kcXNfc2hpZnQ9MDsgd3JfZHFzX3NoaWZ0PDk2OyB3cl9kcXNfc2hpZnQrKykgKi8KKworCS8qCisJICogTGFyZ2VzdCBwYXNzaW5nIHdpbmRvdyBpcyBub3cgZGV0ZWN0ZWQuCisJICovCisKKwkvKiBDb21wdXRlIGRsbF9kcXNfZGVsYXlfWCB2YWx1ZSAqLworCWRsbF9kcXNfZGVsYXlfWCA9IChkbGxfZHFzX2RlbGF5X1hfZW5kX3dpbmRvdyArIGRsbF9kcXNfZGVsYXlfWF9zdGFydF93aW5kb3cpIC8gMjsKKwl3cl9kcXNfc2hpZnQgPSB3cl9kcXNfc2hpZnRfd2l0aF9tYXhfcGFzc2luZ19jYXNlczsKKworCWRlYnVnKCJEUVMgY2FsaWJyYXRpb24gLSBXaW5kb3cgZGV0ZWN0ZWQ6XG4iKTsKKwlkZWJ1ZygibWF4X3Bhc3NpbmdfY2FzZXMgPSAlZFxuIiwgbWF4X3Bhc3NpbmdfY2FzZXMpOworCWRlYnVnKCJ3cl9kcXNfc2hpZnQJID0gJWRcbiIsIHdyX2Rxc19zaGlmdCk7CisJZGVidWcoImRsbF9kcXNfZGVsYXlfWAkgPSAlZFxuIiwgZGxsX2Rxc19kZWxheV9YKTsKKwlkZWJ1ZygiZGxsX2Rxc19kZWxheV9YIHdpbmRvdyA9ICVkIC0gJWRcbiIsCisJICAgICAgZGxsX2Rxc19kZWxheV9YX3N0YXJ0X3dpbmRvdywgZGxsX2Rxc19kZWxheV9YX2VuZF93aW5kb3cpOworCisJLyoKKwkgKiBEZS1hc3NlcnQgJ3N0YXJ0JyBwYXJhbWV0ZXIuCisJICovCisJbXRkY3IoZGRyY2ZnYSwgRERSMF8wMik7CisJdmFsID0gKG1mZGNyKGRkcmNmZ2QpICYgfkREUjBfMDJfU1RBUlRfTUFTSykgfCBERFIwXzAyX1NUQVJUX09GRjsKKwltdGRjcihkZHJjZmdkLCB2YWwpOworCisJLyoKKwkgKiBTZXQgJ3dyX2Rxc19zaGlmdCcKKwkgKi8KKwltdGRjcihkZHJjZmdhLCBERFIwXzA5KTsKKwl2YWwgPSAobWZkY3IoZGRyY2ZnZCkgJiB+RERSMF8wOV9XUl9EUVNfU0hJRlRfTUFTSykKKwkJfCBERFIwXzA5X1dSX0RRU19TSElGVF9FTkNPREUod3JfZHFzX3NoaWZ0KTsKKwltdGRjcihkZHJjZmdkLCB2YWwpOworCWRlYnVnKCJERFIwXzA5PTB4JTA4bHhcbiIsIHZhbCk7CisKKwkvKgorCSAqIFNldCAnZHFzX291dF9zaGlmdCcgPSB3cl9kcXNfc2hpZnQgKyAzMgorCSAqLworCWRxc19vdXRfc2hpZnQgPSB3cl9kcXNfc2hpZnQgKyAzMjsKKwltdGRjcihkZHJjZmdhLCBERFIwXzIyKTsKKwl2YWwgPSAobWZkY3IoZGRyY2ZnZCkgJiB+RERSMF8yMl9EUVNfT1VUX1NISUZUX01BU0spCisJCXwgRERSMF8yMl9EUVNfT1VUX1NISUZUX0VOQ09ERShkcXNfb3V0X3NoaWZ0KTsKKwltdGRjcihkZHJjZmdkLCB2YWwpOworCWRlYnVnKCJERFIwXzIyPTB4JTA4bHhcbiIsIHZhbCk7CisKKwkvKgorCSAqIFNldCAnZGxsX2Rxc19kZWxheV9YJy4KKwkgKi8KKwkvKiBkbGxfZHFzX2RlbGF5XzAgKi8KKwltdGRjcihkZHJjZmdhLCBERFIwXzE3KTsKKwl2YWwgPSAobWZkY3IoZGRyY2ZnZCkgJiB+RERSMF8xN19ETExfRFFTX0RFTEFZXzBfTUFTSykKKwkJfCBERFIwXzE3X0RMTF9EUVNfREVMQVlfMF9FTkNPREUoZGxsX2Rxc19kZWxheV9YKTsKKwltdGRjcihkZHJjZmdkLCB2YWwpOworCWRlYnVnKCJERFIwXzE3PTB4JTA4bHhcbiIsIHZhbCk7CisKKwkvKiBkbGxfZHFzX2RlbGF5XzEgdG8gZGxsX2Rxc19kZWxheV80ICovCisJbXRkY3IoZGRyY2ZnYSwgRERSMF8xOCk7CisJdmFsID0gKG1mZGNyKGRkcmNmZ2QpICYgfkREUjBfMThfRExMX0RRU19ERUxBWV9YX01BU0spCisJCXwgRERSMF8xOF9ETExfRFFTX0RFTEFZXzRfRU5DT0RFKGRsbF9kcXNfZGVsYXlfWCkKKwkJfCBERFIwXzE4X0RMTF9EUVNfREVMQVlfM19FTkNPREUoZGxsX2Rxc19kZWxheV9YKQorCQl8IEREUjBfMThfRExMX0RRU19ERUxBWV8yX0VOQ09ERShkbGxfZHFzX2RlbGF5X1gpCisJCXwgRERSMF8xOF9ETExfRFFTX0RFTEFZXzFfRU5DT0RFKGRsbF9kcXNfZGVsYXlfWCk7CisJbXRkY3IoZGRyY2ZnZCwgdmFsKTsKKwlkZWJ1ZygiRERSMF8xOD0weCUwOGx4XG4iLCB2YWwpOworCisJLyogZGxsX2Rxc19kZWxheV81IHRvIGRsbF9kcXNfZGVsYXlfOCAqLworCW10ZGNyKGRkcmNmZ2EsIEREUjBfMTkpOworCXZhbCA9IChtZmRjcihkZHJjZmdkKSAmIH5ERFIwXzE5X0RMTF9EUVNfREVMQVlfWF9NQVNLKQorCQl8IEREUjBfMTlfRExMX0RRU19ERUxBWV84X0VOQ09ERShkbGxfZHFzX2RlbGF5X1gpCisJCXwgRERSMF8xOV9ETExfRFFTX0RFTEFZXzdfRU5DT0RFKGRsbF9kcXNfZGVsYXlfWCkKKwkJfCBERFIwXzE5X0RMTF9EUVNfREVMQVlfNl9FTkNPREUoZGxsX2Rxc19kZWxheV9YKQorCQl8IEREUjBfMTlfRExMX0RRU19ERUxBWV81X0VOQ09ERShkbGxfZHFzX2RlbGF5X1gpOworCW10ZGNyKGRkcmNmZ2QsIHZhbCk7CisJZGVidWcoIkREUjBfMTk9MHglMDhseFxuIiwgdmFsKTsKKworCS8qCisJICogQXNzZXJ0ICdzdGFydCcgcGFyYW1ldGVyLgorCSAqLworCW10ZGNyKGRkcmNmZ2EsIEREUjBfMDIpOworCXZhbCA9IChtZmRjcihkZHJjZmdkKSAmIH5ERFIwXzAyX1NUQVJUX01BU0spIHwgRERSMF8wMl9TVEFSVF9PTjsKKwltdGRjcihkZHJjZmdkLCB2YWwpOworCisJcHBjTXN5bmMoKTsKKwlwcGNNYmFyKCk7CisKKwkvKgorCSAqIFdhaXQgZm9yIHRoZSBEQ0MgbWFzdGVyIGRlbGF5IGxpbmUgdG8gZmluaXNoIGNhbGlicmF0aW9uCisJICovCisJaWYgKHdhaXRfZm9yX2RsbGxvY2soKSAhPSAwKSB7CisJCXByaW50ZigiZGxsbG9jayBkaWQgbm90IG9jY3VyICEhIVxuIik7CisJCWhhbmcoKTsKKwl9CisJcHBjTXN5bmMoKTsKKwlwcGNNYmFyKCk7CisKKwlpZiAod2FpdF9mb3JfZHJhbV9pbml0X2NvbXBsZXRlKCkgIT0gMCkgeworCQlwcmludGYoImRyYW0gaW5pdCBjb21wbGV0ZSBkaWQgbm90IG9jY3VyICEhIVxuIik7CisJCWhhbmcoKTsKKwl9CisJdWRlbGF5KDEwMCk7ICAvKiB3YWl0IDEwMHVzIHRvIGVuc3VyZSBpbml0IGlzIHJlYWxseSBjb21wbGV0ZWQgISEhICovCit9CisjZW5kaWYgLyogQ09ORklHX0REUl9EQVRBX0VZRSAqLworCisjaWZkZWYgQ09ORklHX0REUl9FQ0MKK3N0YXRpYyB2b2lkIHdhaXRfZGRyX2lkbGUodm9pZCkKK3sKKwkvKgorCSAqIENvbnRyb2xsZXIgaWRsZSBzdGF0dXMgY2Fubm90IGJlIGRldGVybWluZWQgZm9yIERlbmFsaQorCSAqIEREUjIgY29kZS4gSnVzdCByZXR1cm4gaGVyZS4KKwkgKi8KK30KKworc3RhdGljIHZvaWQgYmxhbmtfc3RyaW5nKGludCBzaXplKQoreworCWludCBpOworCisJZm9yIChpPTA7IGk8c2l6ZTsgaSsrKQorCQlwdXRjKCdcYicpOworCWZvciAoaT0wOyBpPHNpemU7IGkrKykKKwkJcHV0YygnICcpOworCWZvciAoaT0wOyBpPHNpemU7IGkrKykKKwkJcHV0YygnXGInKTsKK30KKworc3RhdGljIHZvaWQgcHJvZ3JhbV9lY2ModTMyIHN0YXJ0X2FkZHJlc3MsCisJCQl1MzIgbnVtX2J5dGVzLAorCQkJdTMyIHRsYl93b3JkMl9pX3ZhbHVlKQoreworCXUzMiBjdXJyZW50X2FkZHJlc3M7CisJdTMyIGVuZF9hZGRyZXNzOworCXUzMiBhZGRyZXNzX2luY3JlbWVudDsKKwl1MzIgdmFsOworCWNoYXIgc3RyW10gPSAiRUNDIGdlbmVyYXRpb24gLSI7CisJY2hhciBzbGFzaFtdID0gIlxcfC8tXFx8Ly0iOworCWludCBsb29wID0gMDsKKwlpbnQgbG9vcGkgPSAwOworCisJY3VycmVudF9hZGRyZXNzID0gc3RhcnRfYWRkcmVzczsKKworCXN5bmMoKTsKKwllaWVpbygpOworCXdhaXRfZGRyX2lkbGUoKTsKKworCWlmICh0bGJfd29yZDJfaV92YWx1ZSA9PSBUTEJfV09SRDJfSV9FTkFCTEUpIHsKKwkJLyogRUNDIGJpdCBzZXQgbWV0aG9kIGZvciBub24tY2FjaGVkIG1lbW9yeSAqLworCQlhZGRyZXNzX2luY3JlbWVudCA9IDQ7CisJCWVuZF9hZGRyZXNzID0gY3VycmVudF9hZGRyZXNzICsgbnVtX2J5dGVzOworCisJCXB1dHMoc3RyKTsKKworCQl3aGlsZSAoY3VycmVudF9hZGRyZXNzIDwgZW5kX2FkZHJlc3MpIHsKKwkJCSooKHUzMiAqKWN1cnJlbnRfYWRkcmVzcykgPSAweDAwMDAwMDAwOworCQkJY3VycmVudF9hZGRyZXNzICs9IGFkZHJlc3NfaW5jcmVtZW50OworCisJCQlpZiAoKGxvb3ArKyAlICgyIDw8IDIwKSkgPT0gMCkgeworCQkJCXB1dGMoJ1xiJyk7CisJCQkJcHV0YyhzbGFzaFtsb29waSsrICUgOF0pOworCQkJfQorCQl9CisKKwkJYmxhbmtfc3RyaW5nKHN0cmxlbihzdHIpKTsKKwl9IGVsc2UgeworCQkvKiBFQ0MgYml0IHNldCBtZXRob2QgZm9yIGNhY2hlZCBtZW1vcnkgKi8KKyNpZiAxIC8qIHRlc3Qtb25seTogd2lsbCByZW1vdmUgdGhpcyBkZWZpbmUgbGF0ZXIsIHdoZW4gRUNDIHByb2JsZW1zIGFyZSBzb2x2ZWQhICovCisJCS8qCisJCSAqIFNvbWUgYm9hcmRzIChsaWtlIGx3bW9uNSkgbmVlZCB0byBwcmVzZXJ2ZSB0aGUgbWVtb3J5CisJCSAqIGNvbnRlbnQgdXBvbiBFQ0MgZ2VuZXJhdGlvbiAoZm9yIHRoZSBsb2ctYnVmZmVyKS4KKwkJICogVGhlcmVmb3JlIHdlIGRvbid0IGZpbGwgdGhlIG1lbW9yeSB3aXRoIGEgcGF0dGVybiBvcgorCQkgKiBqdXN0IHplcm8gaXQsIGJ1dCB3cml0ZSB0aGUgc2FtZSB2YWx1ZXMgYmFjayB0aGF0IGFyZQorCQkgKiBhbHJlYWR5IGluIHRoZSBtZW1vcnkgY2VsbHMuCisJCSAqLworCQlhZGRyZXNzX2luY3JlbWVudCA9IENGR19DQUNIRUxJTkVfU0laRTsKKwkJZW5kX2FkZHJlc3MgPSBjdXJyZW50X2FkZHJlc3MgKyBudW1fYnl0ZXM7CisKKwkJY3VycmVudF9hZGRyZXNzID0gc3RhcnRfYWRkcmVzczsKKwkJd2hpbGUgKGN1cnJlbnRfYWRkcmVzcyA8IGVuZF9hZGRyZXNzKSB7CisJCQlwcGNEY2JpKGN1cnJlbnRfYWRkcmVzcyk7CisJCQlwcGNEY2JmKGN1cnJlbnRfYWRkcmVzcyk7CisJCQljdXJyZW50X2FkZHJlc3MgKz0gQ0ZHX0NBQ0hFTElORV9TSVpFOworCQl9CisjZWxzZQorCQlkY2J6X2FyZWEoc3RhcnRfYWRkcmVzcywgbnVtX2J5dGVzKTsKKwkJZGZsdXNoKCk7CisjZW5kaWYKKwl9CisKKwlzeW5jKCk7CisJZWllaW8oKTsKKwl3YWl0X2Rkcl9pZGxlKCk7CisKKwkvKiBDbGVhciBlcnJvciBzdGF0dXMgKi8KKwltZnNkcmFtKEREUjBfMDAsIHZhbCk7CisJbXRzZHJhbShERFIwXzAwLCB2YWwgfCBERFIwXzAwX0lOVF9BQ0tfQUxMKTsKKworCS8qIFNldCAnaW50X21hc2snIHBhcmFtZXRlciB0byBmdW5jdGlvbm5hbCB2YWx1ZSAqLworCW1mc2RyYW0oRERSMF8wMSwgdmFsKTsKKwltdHNkcmFtKEREUjBfMDEsICgodmFsICZ+IEREUjBfMDFfSU5UX01BU0tfTUFTSykgfCBERFIwXzAxX0lOVF9NQVNLX0FMTF9PRkYpKTsKKworCXN5bmMoKTsKKwllaWVpbygpOworCXdhaXRfZGRyX2lkbGUoKTsKK30KKyNlbmRpZgorCitzdGF0aWMgX19pbmxpbmVfXyB1MzIgZ2V0X21jc3Iodm9pZCkKK3sKKwl1MzIgdmFsOworCisJYXNtIHZvbGF0aWxlKCJtZnNwciAlMCwgMHgyM2MiIDogIj1yIiAodmFsKSA6KTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNldF9tY3NyKHUzMiB2YWwpCit7CisJYXNtIHZvbGF0aWxlKCJtdHNwciAweDIzYywgJTAiIDogIj1yIiAodmFsKSA6KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBpbml0ZHJhbSAtLSA0NDBFUHgncyBERFIgY29udHJvbGxlciBpcyBhIERFTkFMSSBDb3JlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2xvbmcgaW50IGluaXRkcmFtIChpbnQgYm9hcmRfdHlwZSkKK3sKKwl1MzIgdmFsOworCisjaWYgMCAvKiB0ZXN0LW9ubHk6IHdpbGwgcmVtb3ZlIHRoaXMgZGVmaW5lIGxhdGVyLCB3aGVuIEVDQyBwcm9ibGVtcyBhcmUgc29sdmVkISAqLworCS8qIENMPTMgKi8KKwltdHNkcmFtKEREUjBfMDIsIDB4MDAwMDAwMDApOworCisJbXRzZHJhbShERFIwXzAwLCAweDAwMDAxOTBBKTsKKwltdHNkcmFtKEREUjBfMDEsIDB4MDEwMDAwMDApOworCW10c2RyYW0oRERSMF8wMywgMHgwMjAzMDYwMyk7IC8qIEEgc3VpdGFibGUgYnVyc3QgbGVuZ3RoIHdhcyB0YWtlbi4gQ0FTIGlzIHJpZ2h0IGZvciBvdXIgYm9hcmQgKi8KKworCW10c2RyYW0oRERSMF8wNCwgMHgwQTAzMDMwMCk7CisJbXRzZHJhbShERFIwXzA1LCAweDAyMDIwMzA4KTsKKwltdHNkcmFtKEREUjBfMDYsIDB4MDEwM0M4MTIpOworCW10c2RyYW0oRERSMF8wNywgMHgwMDA5MDEwMCk7CisJbXRzZHJhbShERFIwXzA4LCAweDAyYzgwMDAxKTsKKwltdHNkcmFtKEREUjBfMDksIDB4MDAwMTFENUYpOworCW10c2RyYW0oRERSMF8xMCwgMHgwMDAwMDMwMCk7CisJbXRzZHJhbShERFIwXzExLCAweDAwMENDODAwKTsKKwltdHNkcmFtKEREUjBfMTIsIDB4MDAwMDAwMDMpOworCW10c2RyYW0oRERSMF8xNCwgMHgwMDAwMDAwMCk7CisJbXRzZHJhbShERFIwXzE3LCAweDFlMDAwMDAwKTsKKwltdHNkcmFtKEREUjBfMTgsIDB4MWUxZTFlMWUpOworCW10c2RyYW0oRERSMF8xOSwgMHgxZTFlMWUxZSk7CisJbXRzZHJhbShERFIwXzIwLCAweDBCMEIwQjBCKTsKKwltdHNkcmFtKEREUjBfMjEsIDB4MEIwQjBCMEIpOworI2lmZGVmIENPTkZJR19ERFJfRUNDCisJbXRzZHJhbShERFIwXzIyLCAweDAwMjY3RjBCIHwgRERSMF8yMl9DVFJMX1JBV19FQ0NfRU5BQkxFKTsgLyogZW5hYmxlIEVDQwkqLworI2Vsc2UKKwltdHNkcmFtKEREUjBfMjIsIDB4MDAyNjdGMEIpOworI2VuZGlmCisKKwltdHNkcmFtKEREUjBfMjMsIDB4MDEwMDAwMDApOworCW10c2RyYW0oRERSMF8yNCwgMHgwMTAxMDAwMSk7CisKKwltdHNkcmFtKEREUjBfMjYsIDB4MkQ5MzAyOEEpOworCW10c2RyYW0oRERSMF8yNywgMHgwNzg0NjgyQik7CisKKwltdHNkcmFtKEREUjBfMjgsIDB4MDAwMDAwODApOworCW10c2RyYW0oRERSMF8zMSwgMHgwMDAwMDAwMCk7CisJbXRzZHJhbShERFIwXzQyLCAweDAxMDAwMDA2KTsKKworCW10c2RyYW0oRERSMF80MywgMHgwMzBBMDIwMCk7CisJbXRzZHJhbShERFIwXzQ0LCAweDAwMDAwMDAzKTsKKwltdHNkcmFtKEREUjBfMDIsIDB4MDAwMDAwMDEpOyAvKiBBY3RpdmF0ZSB0aGUgZGVuYWxpIGNvcmUgKi8KKyNlbHNlCisJLyogQ0w9NCAqLworCW10c2RyYW0oRERSMF8wMiwgMHgwMDAwMDAwMCk7CisKKwltdHNkcmFtKEREUjBfMDAsIDB4MDAwMDE5MEEpOworCW10c2RyYW0oRERSMF8wMSwgMHgwMTAwMDAwMCk7CisJbXRzZHJhbShERFIwXzAzLCAweDAyMDQwODAzKTsgLyogQSBzdWl0YWJsZSBidXJzdCBsZW5ndGggd2FzIHRha2VuLiBDQVMgaXMgcmlnaHQgZm9yIG91ciBib2FyZCAqLworCisJbXRzZHJhbShERFIwXzA0LCAweDBCMDMwMzAwKTsKKwltdHNkcmFtKEREUjBfMDUsIDB4MDIwMjAzMDgpOworCW10c2RyYW0oRERSMF8wNiwgMHgwMDAzQzgxMik7CisJbXRzZHJhbShERFIwXzA3LCAweDAwMDkwMTAwKTsKKwltdHNkcmFtKEREUjBfMDgsIDB4MDNjODAwMDEpOworCW10c2RyYW0oRERSMF8wOSwgMHgwMDAxMUQ1Rik7CisJbXRzZHJhbShERFIwXzEwLCAweDAwMDAwMzAwKTsKKwltdHNkcmFtKEREUjBfMTEsIDB4MDAwQ0M4MDApOworCW10c2RyYW0oRERSMF8xMiwgMHgwMDAwMDAwMyk7CisJbXRzZHJhbShERFIwXzE0LCAweDAwMDAwMDAwKTsKKwltdHNkcmFtKEREUjBfMTcsIDB4MWUwMDAwMDApOworCW10c2RyYW0oRERSMF8xOCwgMHgxZTFlMWUxZSk7CisJbXRzZHJhbShERFIwXzE5LCAweDFlMWUxZTFlKTsKKwltdHNkcmFtKEREUjBfMjAsIDB4MEIwQjBCMEIpOworCW10c2RyYW0oRERSMF8yMSwgMHgwQjBCMEIwQik7CisjaWZkZWYgQ09ORklHX0REUl9FQ0MKKwltdHNkcmFtKEREUjBfMjIsIDB4MDAyNjdGMEIgfCBERFIwXzIyX0NUUkxfUkFXX0VDQ19FTkFCTEUpOyAvKiBlbmFibGUgRUNDICAgICAgICovCisjZWxzZQorCW10c2RyYW0oRERSMF8yMiwgMHgwMDI2N0YwQik7CisjZW5kaWYKKworCW10c2RyYW0oRERSMF8yMywgMHgwMTAwMDAwMCk7CisJbXRzZHJhbShERFIwXzI0LCAweDAxMDEwMDAxKTsKKworCW10c2RyYW0oRERSMF8yNiwgMHgyRDkzMDI4QSk7CisJbXRzZHJhbShERFIwXzI3LCAweDA3ODQ2ODJCKTsKKworCW10c2RyYW0oRERSMF8yOCwgMHgwMDAwMDA4MCk7CisJbXRzZHJhbShERFIwXzMxLCAweDAwMDAwMDAwKTsKKwltdHNkcmFtKEREUjBfNDIsIDB4MDEwMDAwMDgpOworCisJbXRzZHJhbShERFIwXzQzLCAweDA1MEEwMjAwKTsKKwltdHNkcmFtKEREUjBfNDQsIDB4MDAwMDAwMDUpOworCW10c2RyYW0oRERSMF8wMiwgMHgwMDAwMDAwMSk7IC8qIEFjdGl2YXRlIHRoZSBkZW5hbGkgY29yZSAqLworI2VuZGlmCisKKwl3YWl0X2Zvcl9kbGxsb2NrKCk7CisKKwkvKgorCSAqIFByb2dyYW0gdGxiIGVudHJpZXMgZm9yIHRoaXMgc2l6ZSAoZHluYW1pYykKKwkgKi8KKwlwcm9ncmFtX3RsYigwLCAwLCBDRkdfTUJZVEVTX1NEUkFNIDw8IDIwLCBNWV9UTEJfV09SRDJfSV9FTkFCTEUpOworCisJLyoKKwkgKiBTZXR1cCAybmQgVExCIHdpdGggc2FtZSBwaHlzaWNhbCBhZGRyZXNzIGJ1dCBkaWZmZXJlbnQgdmlydHVhbCBhZGRyZXNzCisJICogd2l0aCBjYWNoZSBlbmFibGVkLiBUaGlzIGlzIGRvbmUgZm9yIGZhc3QgRUNDIGdlbmVyYXRpb24uCisJICovCisJcHJvZ3JhbV90bGIoMCwgQ0ZHX0REUl9DQUNIRURfQUREUiwgQ0ZHX01CWVRFU19TRFJBTSA8PCAyMCwgMCk7CisKKyNpZmRlZiBDT05GSUdfRERSX0RBVEFfRVlFCisJLyoKKwkgKiBQZXJmb3JtIGRhdGEgZXllIHNlYXJjaCBpZiByZXF1ZXN0ZWQuCisJICovCisJZGVuYWxpX2NvcmVfc2VhcmNoX2RhdGFfZXllKENGR19ERFJfQ0FDSEVEX0FERFIsIENGR19NQllURVNfU0RSQU0gPDwgMjApOworCisJLyoKKwkgKiBDbGVhciBwb3NzaWJsZSBlcnJvcnMgcmVzdWx0aW5nIGZyb20gZGF0YS1leWUtc2VhcmNoLgorCSAqIElmIG5vdCBkb25lLCB0aGVuIHdlIGNvdWxkIGdldCBhbiBpbnRlcnJ1cHQgbGF0ZXIgb24gd2hlbgorCSAqIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQuCisJICovCisJdmFsID0gZ2V0X21jc3IoKTsKKwlzZXRfbWNzcih2YWwpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRERSX0VDQworCS8qCisJICogSWYgRUNDIGlzIGVuYWJsZWQsIGluaXRpYWxpemUgdGhlIHBhcml0eSBiaXRzLgorCSAqLworCXByb2dyYW1fZWNjKENGR19ERFJfQ0FDSEVEX0FERFIsIENGR19NQllURVNfU0RSQU0gPDwgMjAsIDApOworI2VuZGlmCisKKwlyZXR1cm4gKENGR19NQllURVNfU0RSQU0gPDwgMjApOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvbHdtb241L3NkcmFtLmggYi9ib2FyZC9sd21vbjUvc2RyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Zjg0N2FhCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvbHdtb241L3NkcmFtLmgKQEAgLTAsMCArMSw1MDUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYKKyAqIFN5bHZpZSBHb2hsLCAgICAgICAgICAgICBBTUNDL0lCTSwgZ29obC5zeWx2aWVAZnIuaWJtLmNvbQorICogSmFjcXVlbGluZSBQaXJhLUZlcnJpb2wsIEFNQ0MvSUJNLCBqcGlyYS1mZXJyaW9sQGZyLmlibS5jb20KKyAqIFRoaWVycnkgUm9tYW4sICAgICAgICAgICBBTUNDL0lCTSwgdGhpZXJyeV9yb21hbkBmci5pYm0uY29tCisgKiBBbGFpbiBTYXVyZWwsICAgICAgICAgICAgQU1DQy9JQk0sIGFsYWluLnNhdXJlbEBmci5pYm0uY29tCisgKiBSb2JlcnQgU255ZGVyLCAgICAgICAgICAgQU1DQy9JQk0sIHJvYi5zbnlkZXJAZnIuaWJtLmNvbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX1NQRF9TRFJBTV9ERU5BTElfSF8KKyNkZWZpbmUgX1NQRF9TRFJBTV9ERU5BTElfSF8KKworI2RlZmluZSBwcGNNc3luYwlzeW5jCisjZGVmaW5lIHBwY01iYXIJCWVpZWlvCisKKy8qIEdlbmVyYWwgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgTUFYX1NQRF9CWVRFICAgICAgICAxMjggICAgICAgICAvKiBoaWdoZXN0IFNQRCBieXRlICMgdG8gcmVhZCAqLworI2RlZmluZSBERU5BTElfUkVHX05VTUJFUiAgIDQ1ICAgICAgICAgIC8qIDQ1IFJlZ3MgaW4gUFBDNDQwRVB4IERlbmFsaSBDb3JlICovCisjZGVmaW5lIFNVUFBPUlRFRF9ESU1NU19OQiAgNyAgICAgICAgICAgLyogTnVtYmVyIG9mIHN1cHBvcnRlZCBESU1NIG1vZHVsZXMgdHlwZXMgKi8KKyNkZWZpbmUgU0RSQU1fTk9ORSAgICAgICAgICAwICAgICAgICAgICAvKiBObyBESU1NIGRldGVjdGVkIGluIFNsb3QgKi8KKyNkZWZpbmUgTUFYUkFOS1MgICAgICAgICAgICAyICAgICAgICAgICAvKiAyIHJhbmtzIG1heGltdW0gKi8KKworLyogU3VwcG9ydGVkIFBMQiBGcmVxdWVuY2llcyAqLworI2RlZmluZSBQTEJfRlJFUV8xMzNNSFogICAgIDEzMzMzMzMzMworI2RlZmluZSBQTEJfRlJFUV8xNTJNSFogICAgIDE1MjAwMDAwMAorI2RlZmluZSBQTEJfRlJFUV8xNjBNSFogICAgIDE2MDAwMDAwMAorI2RlZmluZSBQTEJfRlJFUV8xNjZNSFogICAgIDE2NjY2NjY2NgorCisvKiBEZW5hbGkgQ29yZSBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgU0RSQU1fRENSX0JBU0UgMHgxMAorCisjZGVmaW5lIEREUl9EQ1JfQkFTRSAweDEwCisjZGVmaW5lIGRkcmNmZ2EgIChERFJfRENSX0JBU0UrMHgwKSAgIC8qIEREUiBjb25maWd1cmF0aW9uIGFkZHJlc3MgcmVnICovCisjZGVmaW5lIGRkcmNmZ2QgIChERFJfRENSX0JBU0UrMHgxKSAgIC8qIEREUiBjb25maWd1cmF0aW9uIGRhdGEgcmVnICAgICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIHwgVmFsdWVzIGZvciBkZHJjZmdhIHJlZ2lzdGVyIC0gaW5kaXJlY3QgYWRkcmVzc2luZyBvZiB0aGVzZSByZWdzCisgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgRERSMF8wMCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEREUjBfMDBfSU5UX0FDS19NQVNLICAgICAgICAgICAgICAweDdGMDAwMDAwIC8qIFdyaXRlIG9ubHkgKi8KKyNkZWZpbmUgRERSMF8wMF9JTlRfQUNLX0FMTCAgICAgICAgICAgICAgIDB4N0YwMDAwMDAKKyNkZWZpbmUgRERSMF8wMF9JTlRfQUNLX0VOQ09ERShuKSAgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDdGKTw8MjQpCisjZGVmaW5lIEREUjBfMDBfSU5UX0FDS19ERUNPREUobikgICAgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjI0KSYweDdGKQorLyogU3RhdHVzICovCisjZGVmaW5lIEREUjBfMDBfSU5UX1NUQVRVU19NQVNLICAgICAgICAgICAweDAwRkYwMDAwIC8qIFJlYWQgb25seSAqLworLyogQml0MC4gQSBzaW5nbGUgYWNjZXNzIG91dHNpZGUgdGhlIGRlZmluZWQgUEhZU0lDQUwgbWVtb3J5IHNwYWNlIGRldGVjdGVkLiAqLworI2RlZmluZSBERFIwXzAwX0lOVF9TVEFUVVNfQklUMCAgICAgICAgICAgMHgwMDAxMDAwMAorLyogQml0MS4gTXVsdGlwbGUgYWNjZXNzZXMgb3V0c2lkZSB0aGUgZGVmaW5lZCBQSFlTSUNBTCBtZW1vcnkgc3BhY2UgZGV0ZWN0ZWQuICovCisjZGVmaW5lIEREUjBfMDBfSU5UX1NUQVRVU19CSVQxICAgICAgICAgICAweDAwMDIwMDAwCisvKiBCaXQyLiBTaW5nbGUgY29ycmVjdGFibGUgRUNDIGV2ZW50IGRldGVjdGVkICovCisjZGVmaW5lIEREUjBfMDBfSU5UX1NUQVRVU19CSVQyICAgICAgICAgICAweDAwMDQwMDAwCisvKiBCaXQzLiBNdWx0aXBsZSBjb3JyZWN0YWJsZSBFQ0MgZXZlbnRzIGRldGVjdGVkLiAqLworI2RlZmluZSBERFIwXzAwX0lOVF9TVEFUVVNfQklUMyAgICAgICAgICAgMHgwMDA4MDAwMAorLyogQml0NC4gU2luZ2xlIHVuY29ycmVjdGFibGUgRUNDIGV2ZW50IGRldGVjdGVkLiAqLworI2RlZmluZSBERFIwXzAwX0lOVF9TVEFUVVNfQklUNCAgICAgICAgICAgMHgwMDEwMDAwMAorLyogQml0NS4gTXVsdGlwbGUgdW5jb3JyZWN0YWJsZSBFQ0MgZXZlbnRzIGRldGVjdGVkLiAqLworI2RlZmluZSBERFIwXzAwX0lOVF9TVEFUVVNfQklUNSAgICAgICAgICAgMHgwMDIwMDAwMAorLyogQml0Ni4gRFJBTSBpbml0aWFsaXphdGlvbiBjb21wbGV0ZS4gKi8KKyNkZWZpbmUgRERSMF8wMF9JTlRfU1RBVFVTX0JJVDYgICAgICAgICAgIDB4MDA0MDAwMDAKKy8qIEJpdDcuIExvZ2ljYWwgT1Igb2YgYWxsIGxvd2VyIGJpdHMuICovCisjZGVmaW5lIEREUjBfMDBfSU5UX1NUQVRVU19CSVQ3ICAgICAgICAgICAweDAwODAwMDAwCisKKyNkZWZpbmUgRERSMF8wMF9JTlRfU1RBVFVTX0VOQ09ERShuKSAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweEZGKTw8MTYpCisjZGVmaW5lIEREUjBfMDBfSU5UX1NUQVRVU19ERUNPREUobikgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjE2KSYweEZGKQorI2RlZmluZSBERFIwXzAwX0RMTF9JTkNSRU1FTlRfTUFTSyAgICAgICAgMHgwMDAwN0YwMAorI2RlZmluZSBERFIwXzAwX0RMTF9JTkNSRU1FTlRfRU5DT0RFKG4pICAgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4N0YpPDw4KQorI2RlZmluZSBERFIwXzAwX0RMTF9JTkNSRU1FTlRfREVDT0RFKG4pICAgICAoKCgodW5zaWduZWQgbG9uZykobikpPj44KSYweDdGKQorI2RlZmluZSBERFIwXzAwX0RMTF9TVEFSVF9QT0lOVF9NQVNLICAgICAgMHgwMDAwMDA3RgorI2RlZmluZSBERFIwXzAwX0RMTF9TVEFSVF9QT0lOVF9FTkNPREUobikgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4N0YpPDwwKQorI2RlZmluZSBERFIwXzAwX0RMTF9TVEFSVF9QT0lOVF9ERUNPREUobikgICAoKCgodW5zaWduZWQgbG9uZykobikpPj4wKSYweDdGKQorCisKKyNkZWZpbmUgRERSMF8wMSAgICAgICAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEREUjBfMDFfUExCMF9EQl9DU19MT1dFUl9NQVNLICAgICAweDFGMDAwMDAwCisjZGVmaW5lIEREUjBfMDFfUExCMF9EQl9DU19MT1dFUl9FTkNPREUobikgICgoKCh1bnNpZ25lZCBsb25nKShuKSkmMHgxRik8PDI0KQorI2RlZmluZSBERFIwXzAxX1BMQjBfREJfQ1NfTE9XRVJfREVDT0RFKG4pICAoKCgodW5zaWduZWQgbG9uZykobikpPj4yNCkmMHgxRikKKyNkZWZpbmUgRERSMF8wMV9QTEIwX0RCX0NTX1VQUEVSX01BU0sgICAgIDB4MDAxRjAwMDAKKyNkZWZpbmUgRERSMF8wMV9QTEIwX0RCX0NTX1VQUEVSX0VOQ09ERShuKSAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDFGKTw8MTYpCisjZGVmaW5lIEREUjBfMDFfUExCMF9EQl9DU19VUFBFUl9ERUNPREUobikgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjE2KSYweDFGKQorI2RlZmluZSBERFIwXzAxX09VVF9PRl9SQU5HRV9UWVBFX01BU0sgICAgMHgwMDAwMDcwMCAvKiBSZWFkIG9ubHkgKi8KKyNkZWZpbmUgRERSMF8wMV9PVVRfT0ZfUkFOR0VfVFlQRV9FTkNPREUobikgICAgICAgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4Nyk8PDgpCisjZGVmaW5lIEREUjBfMDFfT1VUX09GX1JBTkdFX1RZUEVfREVDT0RFKG4pICAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+OCkmMHg3KQorI2RlZmluZSBERFIwXzAxX0lOVF9NQVNLX01BU0sgICAgICAgICAgICAgMHgwMDAwMDBGRgorI2RlZmluZSBERFIwXzAxX0lOVF9NQVNLX0VOQ09ERShuKSAgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4RkYpPDwwKQorI2RlZmluZSBERFIwXzAxX0lOVF9NQVNLX0RFQ09ERShuKSAgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpPj4wKSYweEZGKQorI2RlZmluZSBERFIwXzAxX0lOVF9NQVNLX0FMTF9PTiAgICAgICAgICAgMHgwMDAwMDBGRgorI2RlZmluZSBERFIwXzAxX0lOVF9NQVNLX0FMTF9PRkYgICAgICAgICAgMHgwMDAwMDAwMAorCisjZGVmaW5lIEREUjBfMDIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBERFIwXzAyX01BWF9DU19SRUdfTUFTSyAgICAgICAgICAgMHgwMjAwMDAwMCAvKiBSZWFkIG9ubHkgKi8KKyNkZWZpbmUgRERSMF8wMl9NQVhfQ1NfUkVHX0VOQ09ERShuKSAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDIpPDwyNCkKKyNkZWZpbmUgRERSMF8wMl9NQVhfQ1NfUkVHX0RFQ09ERShuKSAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+MjQpJjB4MikKKyNkZWZpbmUgRERSMF8wMl9NQVhfQ09MX1JFR19NQVNLICAgICAgICAgIDB4MDAwRjAwMDAgLyogUmVhZCBvbmx5ICovCisjZGVmaW5lIEREUjBfMDJfTUFYX0NPTF9SRUdfRU5DT0RFKG4pICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSkmMHhGKTw8MTYpCisjZGVmaW5lIEREUjBfMDJfTUFYX0NPTF9SRUdfREVDT0RFKG4pICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjE2KSYweEYpCisjZGVmaW5lIEREUjBfMDJfTUFYX1JPV19SRUdfTUFTSyAgICAgICAgICAweDAwMDAwRjAwIC8qIFJlYWQgb25seSAqLworI2RlZmluZSBERFIwXzAyX01BWF9ST1dfUkVHX0VOQ09ERShuKSAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4Rik8PDgpCisjZGVmaW5lIEREUjBfMDJfTUFYX1JPV19SRUdfREVDT0RFKG4pICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjgpJjB4RikKKyNkZWZpbmUgRERSMF8wMl9TVEFSVF9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRERSMF8wMl9TVEFSVF9FTkNPREUobikgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDEpPDwwKQorI2RlZmluZSBERFIwXzAyX1NUQVJUX0RFQ09ERShuKSAgICAgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpPj4wKSYweDEpCisjZGVmaW5lIEREUjBfMDJfU1RBUlRfT0ZGICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEREUjBfMDJfU1RBUlRfT04gICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisKKyNkZWZpbmUgRERSMF8wMyAgICAgICAgICAgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIEREUjBfMDNfQlNUTEVOX01BU0sgICAgICAgICAgICAgICAweDA3MDAwMDAwCisjZGVmaW5lIEREUjBfMDNfQlNUTEVOX0VOQ09ERShuKSAgICAgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSkmMHg3KTw8MjQpCisjZGVmaW5lIEREUjBfMDNfQlNUTEVOX0RFQ09ERShuKSAgICAgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjI0KSYweDcpCisjZGVmaW5lIEREUjBfMDNfQ0FTTEFUX01BU0sgICAgICAgICAgICAgICAweDAwMDcwMDAwCisjZGVmaW5lIEREUjBfMDNfQ0FTTEFUX0VOQ09ERShuKSAgICAgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSkmMHg3KTw8MTYpCisjZGVmaW5lIEREUjBfMDNfQ0FTTEFUX0RFQ09ERShuKSAgICAgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjE2KSYweDcpCisjZGVmaW5lIEREUjBfMDNfQ0FTTEFUX0xJTl9NQVNLICAgICAgICAgICAweDAwMDAwRjAwCisjZGVmaW5lIEREUjBfMDNfQ0FTTEFUX0xJTl9FTkNPREUobikgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSkmMHhGKTw8OCkKKyNkZWZpbmUgRERSMF8wM19DQVNMQVRfTElOX0RFQ09ERShuKSAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+OCkmMHhGKQorI2RlZmluZSBERFIwXzAzX0lOSVRBUkVGX01BU0sgICAgICAgICAgICAgMHgwMDAwMDAwRgorI2RlZmluZSBERFIwXzAzX0lOSVRBUkVGX0VOQ09ERShuKSAgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4Rik8PDApCisjZGVmaW5lIEREUjBfMDNfSU5JVEFSRUZfREVDT0RFKG4pICAgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjApJjB4RikKKworI2RlZmluZSBERFIwXzA0ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgRERSMF8wNF9UUkNfTUFTSyAgICAgICAgICAgICAgICAgIDB4MUYwMDAwMDAKKyNkZWZpbmUgRERSMF8wNF9UUkNfRU5DT0RFKG4pICAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDFGKTw8MjQpCisjZGVmaW5lIEREUjBfMDRfVFJDX0RFQ09ERShuKSAgICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjI0KSYweDFGKQorI2RlZmluZSBERFIwXzA0X1RSUkRfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDA3MDAwMAorI2RlZmluZSBERFIwXzA0X1RSUkRfRU5DT0RFKG4pICAgICAgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4Nyk8PDE2KQorI2RlZmluZSBERFIwXzA0X1RSUkRfREVDT0RFKG4pICAgICAgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpPj4xNikmMHg3KQorI2RlZmluZSBERFIwXzA0X1RSVFBfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAwMDcwMAorI2RlZmluZSBERFIwXzA0X1RSVFBfRU5DT0RFKG4pICAgICAgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4Nyk8PDgpCisjZGVmaW5lIEREUjBfMDRfVFJUUF9ERUNPREUobikgICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjgpJjB4NykKKworI2RlZmluZSBERFIwXzA1ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgRERSMF8wNV9UTVJEX01BU0sgICAgICAgICAgICAgICAgIDB4MUYwMDAwMDAKKyNkZWZpbmUgRERSMF8wNV9UTVJEX0VOQ09ERShuKSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDFGKTw8MjQpCisjZGVmaW5lIEREUjBfMDVfVE1SRF9ERUNPREUobikgICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjI0KSYweDFGKQorI2RlZmluZSBERFIwXzA1X1RFTVJTX01BU0sgICAgICAgICAgICAgICAgMHgwMDA3MDAwMAorI2RlZmluZSBERFIwXzA1X1RFTVJTX0VOQ09ERShuKSAgICAgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4Nyk8PDE2KQorI2RlZmluZSBERFIwXzA1X1RFTVJTX0RFQ09ERShuKSAgICAgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpPj4xNikmMHg3KQorI2RlZmluZSBERFIwXzA1X1RSUF9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMEYwMAorI2RlZmluZSBERFIwXzA1X1RSUF9FTkNPREUobikgICAgICAgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4Rik8PDgpCisjZGVmaW5lIEREUjBfMDVfVFJQX0RFQ09ERShuKSAgICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjgpJjB4RikKKyNkZWZpbmUgRERSMF8wNV9UUkFTX01JTl9NQVNLICAgICAgICAgICAgIDB4MDAwMDAwRkYKKyNkZWZpbmUgRERSMF8wNV9UUkFTX01JTl9FTkNPREUobikgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweEZGKTw8MCkKKyNkZWZpbmUgRERSMF8wNV9UUkFTX01JTl9ERUNPREUobikgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+MCkmMHhGRikKKworI2RlZmluZSBERFIwXzA2ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgRERSMF8wNl9XUklURUlOVEVSUF9NQVNLICAgICAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgRERSMF8wNl9XUklURUlOVEVSUF9FTkNPREUobikgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDEpPDwyNCkKKyNkZWZpbmUgRERSMF8wNl9XUklURUlOVEVSUF9ERUNPREUobikgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+MjQpJjB4MSkKKyNkZWZpbmUgRERSMF8wNl9UV1RSX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwNzAwMDAKKyNkZWZpbmUgRERSMF8wNl9UV1RSX0VOQ09ERShuKSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDcpPDwxNikKKyNkZWZpbmUgRERSMF8wNl9UV1RSX0RFQ09ERShuKSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+MTYpJjB4NykKKyNkZWZpbmUgRERSMF8wNl9URExMX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMEZGMDAKKyNkZWZpbmUgRERSMF8wNl9URExMX0VOQ09ERShuKSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweEZGKTw8OCkKKyNkZWZpbmUgRERSMF8wNl9URExMX0RFQ09ERShuKSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+OCkmMHhGRikKKyNkZWZpbmUgRERSMF8wNl9UUkZDX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMDAwN0YKKyNkZWZpbmUgRERSMF8wNl9UUkZDX0VOQ09ERShuKSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDdGKTw8MCkKKyNkZWZpbmUgRERSMF8wNl9UUkZDX0RFQ09ERShuKSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+MCkmMHg3RikKKworI2RlZmluZSBERFIwXzA3ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgRERSMF8wN19OT19DTURfSU5JVF9NQVNLICAgICAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgRERSMF8wN19OT19DTURfSU5JVF9FTkNPREUobikgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDEpPDwyNCkKKyNkZWZpbmUgRERSMF8wN19OT19DTURfSU5JVF9ERUNPREUobikgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+MjQpJjB4MSkKKyNkZWZpbmUgRERSMF8wN19URkFXX01BU0sgICAgICAgICAgICAgICAgIDB4MDAxRjAwMDAKKyNkZWZpbmUgRERSMF8wN19URkFXX0VOQ09ERShuKSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDFGKTw8MTYpCisjZGVmaW5lIEREUjBfMDdfVEZBV19ERUNPREUobikgICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjE2KSYweDFGKQorI2RlZmluZSBERFIwXzA3X0FVVE9fUkVGUkVTSF9NT0RFX01BU0sgICAgMHgwMDAwMDEwMAorI2RlZmluZSBERFIwXzA3X0FVVE9fUkVGUkVTSF9NT0RFX0VOQ09ERShuKSAoKCgodW5zaWduZWQgbG9uZykobikpJjB4MSk8PDgpCisjZGVmaW5lIEREUjBfMDdfQVVUT19SRUZSRVNIX01PREVfREVDT0RFKG4pICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjgpJjB4MSkKKyNkZWZpbmUgRERSMF8wN19BUkVGUkVTSF9NQVNLICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRERSMF8wN19BUkVGUkVTSF9FTkNPREUobikgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDEpPDwwKQorI2RlZmluZSBERFIwXzA3X0FSRUZSRVNIX0RFQ09ERShuKSAgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpPj4wKSYweDEpCisKKyNkZWZpbmUgRERSMF8wOCAgICAgICAgICAgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIEREUjBfMDhfV1JMQVRfTUFTSyAgICAgICAgICAgICAgICAweDA3MDAwMDAwCisjZGVmaW5lIEREUjBfMDhfV1JMQVRfRU5DT0RFKG4pICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSkmMHg3KTw8MjQpCisjZGVmaW5lIEREUjBfMDhfV1JMQVRfREVDT0RFKG4pICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjI0KSYweDcpCisjZGVmaW5lIEREUjBfMDhfVENQRF9NQVNLICAgICAgICAgICAgICAgICAweDAwRkYwMDAwCisjZGVmaW5lIEREUjBfMDhfVENQRF9FTkNPREUobikgICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSkmMHhGRik8PDE2KQorI2RlZmluZSBERFIwXzA4X1RDUERfREVDT0RFKG4pICAgICAgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpPj4xNikmMHhGRikKKyNkZWZpbmUgRERSMF8wOF9EUVNfTl9FTl9NQVNLICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgRERSMF8wOF9EUVNfTl9FTl9FTkNPREUobikgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDEpPDw4KQorI2RlZmluZSBERFIwXzA4X0RRU19OX0VOX0RFQ09ERShuKSAgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpPj44KSYweDEpCisjZGVmaW5lIEREUjBfMDhfRERSSUlfU0RSQU1fTU9ERV9NQVNLICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEREUjBfMDhfRERSSUlfRU5DT0RFKG4pICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSkmMHgxKTw8MCkKKyNkZWZpbmUgRERSMF8wOF9ERFJJSV9ERUNPREUobikgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+MCkmMHgxKQorCisjZGVmaW5lIEREUjBfMDkgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOQorI2RlZmluZSBERFIwXzA5X09DRF9BREpVU1RfUEROX0NTXzBfTUFTSyAgMHgxRjAwMDAwMAorI2RlZmluZSBERFIwXzA5X09DRF9BREpVU1RfUEROX0NTXzBfRU5DT0RFKG4pICgoKCh1bnNpZ25lZCBsb25nKShuKSkmMHgxRik8PDI0KQorI2RlZmluZSBERFIwXzA5X09DRF9BREpVU1RfUEROX0NTXzBfREVDT0RFKG4pICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjI0KSYweDFGKQorI2RlZmluZSBERFIwXzA5X1JUVF8wX01BU0sgICAgICAgICAgICAgICAgMHgwMDAzMDAwMAorI2RlZmluZSBERFIwXzA5X1JUVF8wX0VOQ09ERShuKSAgICAgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4Myk8PDE2KQorI2RlZmluZSBERFIwXzA5X1JUVF8wX0RFQ09ERShuKSAgICAgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpPj4xNikmMHgzKQorI2RlZmluZSBERFIwXzA5X1dSX0RRU19TSElGVF9CWVBBU1NfTUFTSyAgMHgwMDAwN0YwMAorI2RlZmluZSBERFIwXzA5X1dSX0RRU19TSElGVF9CWVBBU1NfRU5DT0RFKG4pICgoKCh1bnNpZ25lZCBsb25nKShuKSkmMHg3Rik8PDgpCisjZGVmaW5lIEREUjBfMDlfV1JfRFFTX1NISUZUX0JZUEFTU19ERUNPREUobikgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+OCkmMHg3RikKKyNkZWZpbmUgRERSMF8wOV9XUl9EUVNfU0hJRlRfTUFTSyAgICAgICAgIDB4MDAwMDAwN0YKKyNkZWZpbmUgRERSMF8wOV9XUl9EUVNfU0hJRlRfRU5DT0RFKG4pICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDdGKTw8MCkKKyNkZWZpbmUgRERSMF8wOV9XUl9EUVNfU0hJRlRfREVDT0RFKG4pICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+MCkmMHg3RikKKworI2RlZmluZSBERFIwXzEwICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEKKyNkZWZpbmUgRERSMF8xMF9XUklURV9NT0RFUkVHX01BU0sgICAgICAgIDB4MDAwMTAwMDAgLyogV3JpdGUgb25seSAqLworI2RlZmluZSBERFIwXzEwX1dSSVRFX01PREVSRUdfRU5DT0RFKG4pICAgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4MSk8PDE2KQorI2RlZmluZSBERFIwXzEwX1dSSVRFX01PREVSRUdfREVDT0RFKG4pICAgICAoKCgodW5zaWduZWQgbG9uZykobikpPj4xNikmMHgxKQorI2RlZmluZSBERFIwXzEwX0NTX01BUF9NQVNLICAgICAgICAgICAgICAgMHgwMDAwMDMwMAorI2RlZmluZSBERFIwXzEwX0NTX01BUF9OT19NRU0gICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBERFIwXzEwX0NTX01BUF9SQU5LMF9JTlNUQUxMRUQgICAgMHgwMDAwMDEwMAorI2RlZmluZSBERFIwXzEwX0NTX01BUF9SQU5LMV9JTlNUQUxMRUQgICAgMHgwMDAwMDIwMAorI2RlZmluZSBERFIwXzEwX0NTX01BUF9FTkNPREUobikgICAgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4Myk8PDgpCisjZGVmaW5lIEREUjBfMTBfQ1NfTUFQX0RFQ09ERShuKSAgICAgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjgpJjB4MykKKyNkZWZpbmUgRERSMF8xMF9PQ0RfQURKVVNUX1BVUF9DU18wX01BU0sgIDB4MDAwMDAwMUYKKyNkZWZpbmUgRERSMF8xMF9PQ0RfQURKVVNUX1BVUF9DU18wX0VOQ09ERShuKSAoKCgodW5zaWduZWQgbG9uZykobikpJjB4MUYpPDwwKQorI2RlZmluZSBERFIwXzEwX09DRF9BREpVU1RfUFVQX0NTXzBfREVDT0RFKG4pICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjApJjB4MUYpCisKKyNkZWZpbmUgRERSMF8xMSAgICAgICAgICAgICAgICAgICAgICAgICAweDBCCisjZGVmaW5lIEREUjBfMTFfU1JFRlJFU0hfTUFTSyAgICAgICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIEREUjBfMTFfU1JFRlJFU0hfRU5DT0RFKG4pICAgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSkmMHgxKTw8MjQpCisjZGVmaW5lIEREUjBfMTFfU1JFRlJFU0hfREVDT0RFKG4pICAgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjI0KSYweDFGKQorI2RlZmluZSBERFIwXzExX1RYU05SX01BU0sgICAgICAgICAgICAgICAgMHgwMEZGMDAwMAorI2RlZmluZSBERFIwXzExX1RYU05SX0VOQ09ERShuKSAgICAgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4RkYpPDwxNikKKyNkZWZpbmUgRERSMF8xMV9UWFNOUl9ERUNPREUobikgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+MTYpJjB4RkYpCisjZGVmaW5lIEREUjBfMTFfVFhTUl9NQVNLICAgICAgICAgICAgICAgICAweDAwMDBGRjAwCisjZGVmaW5lIEREUjBfMTFfVFhTUl9FTkNPREUobikgICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSkmMHhGRik8PDgpCisjZGVmaW5lIEREUjBfMTFfVFhTUl9ERUNPREUobikgICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjgpJjB4RkYpCisKKyNkZWZpbmUgRERSMF8xMiAgICAgICAgICAgICAgICAgICAgICAgICAweDBDCisjZGVmaW5lIEREUjBfMTJfVENLRV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDAwMDcKKyNkZWZpbmUgRERSMF8xMl9UQ0tFX0VOQ09ERShuKSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDcpPDwwKQorI2RlZmluZSBERFIwXzEyX1RDS0VfREVDT0RFKG4pICAgICAgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpPj4wKSYweDcpCisKKyNkZWZpbmUgRERSMF8xMyAgICAgICAgICAgICAgICAgICAgICAgICAweDBECisKKyNkZWZpbmUgRERSMF8xNCAgICAgICAgICAgICAgICAgICAgICAgICAweDBFCisjZGVmaW5lIEREUjBfMTRfRExMX0JZUEFTU19NT0RFX01BU0sgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIEREUjBfMTRfRExMX0JZUEFTU19NT0RFX0VOQ09ERShuKSAgICgoKCh1bnNpZ25lZCBsb25nKShuKSkmMHgxKTw8MjQpCisjZGVmaW5lIEREUjBfMTRfRExMX0JZUEFTU19NT0RFX0RFQ09ERShuKSAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjI0KSYweDEpCisjZGVmaW5lIEREUjBfMTRfUkVEVUNfTUFTSyAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEREUjBfMTRfUkVEVUNfNjRCSVRTICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEREUjBfMTRfUkVEVUNfMzJCSVRTICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEREUjBfMTRfUkVEVUNfRU5DT0RFKG4pICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSkmMHgxKTw8MTYpCisjZGVmaW5lIEREUjBfMTRfUkVEVUNfREVDT0RFKG4pICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjE2KSYweDEpCisjZGVmaW5lIEREUjBfMTRfUkVHX0RJTU1fRU5BQkxFX01BU0sgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEREUjBfMTRfUkVHX0RJTU1fRU5BQkxFX0VOQ09ERShuKSAgICgoKCh1bnNpZ25lZCBsb25nKShuKSkmMHgxKTw8OCkKKyNkZWZpbmUgRERSMF8xNF9SRUdfRElNTV9FTkFCTEVfREVDT0RFKG4pICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+OCkmMHgxKQorCisjZGVmaW5lIEREUjBfMTUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRgorCisjZGVmaW5lIEREUjBfMTYgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMAorCisjZGVmaW5lIEREUjBfMTcgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMQorI2RlZmluZSBERFIwXzE3X0RMTF9EUVNfREVMQVlfMF9NQVNLICAgICAgMHg3RjAwMDAwMAorI2RlZmluZSBERFIwXzE3X0RMTF9EUVNfREVMQVlfMF9FTkNPREUobikgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4N0YpPDwyNCkKKyNkZWZpbmUgRERSMF8xN19ETExfRFFTX0RFTEFZXzBfREVDT0RFKG4pICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+MjQpJjB4N0YpCisjZGVmaW5lIEREUjBfMTdfRExMTE9DS1JFR19NQVNLICAgICAgICAgICAweDAwMDEwMDAwIC8qIFJlYWQgb25seSAqLworI2RlZmluZSBERFIwXzE3X0RMTExPQ0tSRUdfTE9DS0VEICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBERFIwXzE3X0RMTExPQ0tSRUdfVU5MT0NLRUQgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBERFIwXzE3X0RMTExPQ0tSRUdfRU5DT0RFKG4pICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4MSk8PDE2KQorI2RlZmluZSBERFIwXzE3X0RMTExPQ0tSRUdfREVDT0RFKG4pICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpPj4xNikmMHgxKQorI2RlZmluZSBERFIwXzE3X0RMTF9MT0NLX01BU0sgICAgICAgICAgICAgMHgwMDAwN0YwMCAvKiBSZWFkIG9ubHkgKi8KKyNkZWZpbmUgRERSMF8xN19ETExfTE9DS19FTkNPREUobikgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDdGKTw8OCkKKyNkZWZpbmUgRERSMF8xN19ETExfTE9DS19ERUNPREUobikgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+OCkmMHg3RikKKworI2RlZmluZSBERFIwXzE4ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIKKyNkZWZpbmUgRERSMF8xOF9ETExfRFFTX0RFTEFZX1hfTUFTSyAgICAgIDB4N0Y3RjdGN0YKKyNkZWZpbmUgRERSMF8xOF9ETExfRFFTX0RFTEFZXzRfTUFTSyAgICAgIDB4N0YwMDAwMDAKKyNkZWZpbmUgRERSMF8xOF9ETExfRFFTX0RFTEFZXzRfRU5DT0RFKG4pICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDdGKTw8MjQpCisjZGVmaW5lIEREUjBfMThfRExMX0RRU19ERUxBWV80X0RFQ09ERShuKSAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjI0KSYweDdGKQorI2RlZmluZSBERFIwXzE4X0RMTF9EUVNfREVMQVlfM19NQVNLICAgICAgMHgwMDdGMDAwMAorI2RlZmluZSBERFIwXzE4X0RMTF9EUVNfREVMQVlfM19FTkNPREUobikgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4N0YpPDwxNikKKyNkZWZpbmUgRERSMF8xOF9ETExfRFFTX0RFTEFZXzNfREVDT0RFKG4pICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+MTYpJjB4N0YpCisjZGVmaW5lIEREUjBfMThfRExMX0RRU19ERUxBWV8yX01BU0sgICAgICAweDAwMDA3RjAwCisjZGVmaW5lIEREUjBfMThfRExMX0RRU19ERUxBWV8yX0VOQ09ERShuKSAgICgoKCh1bnNpZ25lZCBsb25nKShuKSkmMHg3Rik8PDgpCisjZGVmaW5lIEREUjBfMThfRExMX0RRU19ERUxBWV8yX0RFQ09ERShuKSAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjgpJjB4N0YpCisjZGVmaW5lIEREUjBfMThfRExMX0RRU19ERUxBWV8xX01BU0sgICAgICAweDAwMDAwMDdGCisjZGVmaW5lIEREUjBfMThfRExMX0RRU19ERUxBWV8xX0VOQ09ERShuKSAgICgoKCh1bnNpZ25lZCBsb25nKShuKSkmMHg3Rik8PDApCisjZGVmaW5lIEREUjBfMThfRExMX0RRU19ERUxBWV8xX0RFQ09ERShuKSAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjApJjB4N0YpCisKKyNkZWZpbmUgRERSMF8xOSAgICAgICAgICAgICAgICAgICAgICAgICAweDEzCisjZGVmaW5lIEREUjBfMTlfRExMX0RRU19ERUxBWV9YX01BU0sgICAgICAweDdGN0Y3RjdGCisjZGVmaW5lIEREUjBfMTlfRExMX0RRU19ERUxBWV84X01BU0sgICAgICAweDdGMDAwMDAwCisjZGVmaW5lIEREUjBfMTlfRExMX0RRU19ERUxBWV84X0VOQ09ERShuKSAgICgoKCh1bnNpZ25lZCBsb25nKShuKSkmMHg3Rik8PDI0KQorI2RlZmluZSBERFIwXzE5X0RMTF9EUVNfREVMQVlfOF9ERUNPREUobikgICAoKCgodW5zaWduZWQgbG9uZykobikpPj4yNCkmMHg3RikKKyNkZWZpbmUgRERSMF8xOV9ETExfRFFTX0RFTEFZXzdfTUFTSyAgICAgIDB4MDA3RjAwMDAKKyNkZWZpbmUgRERSMF8xOV9ETExfRFFTX0RFTEFZXzdfRU5DT0RFKG4pICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDdGKTw8MTYpCisjZGVmaW5lIEREUjBfMTlfRExMX0RRU19ERUxBWV83X0RFQ09ERShuKSAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjE2KSYweDdGKQorI2RlZmluZSBERFIwXzE5X0RMTF9EUVNfREVMQVlfNl9NQVNLICAgICAgMHgwMDAwN0YwMAorI2RlZmluZSBERFIwXzE5X0RMTF9EUVNfREVMQVlfNl9FTkNPREUobikgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4N0YpPDw4KQorI2RlZmluZSBERFIwXzE5X0RMTF9EUVNfREVMQVlfNl9ERUNPREUobikgICAoKCgodW5zaWduZWQgbG9uZykobikpPj44KSYweDdGKQorI2RlZmluZSBERFIwXzE5X0RMTF9EUVNfREVMQVlfNV9NQVNLICAgICAgMHgwMDAwMDA3RgorI2RlZmluZSBERFIwXzE5X0RMTF9EUVNfREVMQVlfNV9FTkNPREUobikgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4N0YpPDwwKQorI2RlZmluZSBERFIwXzE5X0RMTF9EUVNfREVMQVlfNV9ERUNPREUobikgICAoKCgodW5zaWduZWQgbG9uZykobikpPj4wKSYweDdGKQorCisjZGVmaW5lIEREUjBfMjAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNAorI2RlZmluZSBERFIwXzIwX0RMTF9EUVNfQllQQVNTXzNfTUFTSyAgICAgIDB4N0YwMDAwMDAKKyNkZWZpbmUgRERSMF8yMF9ETExfRFFTX0JZUEFTU18zX0VOQ09ERShuKSAgICgoKCh1bnNpZ25lZCBsb25nKShuKSkmMHg3Rik8PDI0KQorI2RlZmluZSBERFIwXzIwX0RMTF9EUVNfQllQQVNTXzNfREVDT0RFKG4pICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+MjQpJjB4N0YpCisjZGVmaW5lIEREUjBfMjBfRExMX0RRU19CWVBBU1NfMl9NQVNLICAgICAgMHgwMDdGMDAwMAorI2RlZmluZSBERFIwXzIwX0RMTF9EUVNfQllQQVNTXzJfRU5DT0RFKG4pICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDdGKTw8MTYpCisjZGVmaW5lIEREUjBfMjBfRExMX0RRU19CWVBBU1NfMl9ERUNPREUobikgICAoKCgodW5zaWduZWQgbG9uZykobikpPj4xNikmMHg3RikKKyNkZWZpbmUgRERSMF8yMF9ETExfRFFTX0JZUEFTU18xX01BU0sgICAgICAweDAwMDA3RjAwCisjZGVmaW5lIEREUjBfMjBfRExMX0RRU19CWVBBU1NfMV9FTkNPREUobikgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4N0YpPDw4KQorI2RlZmluZSBERFIwXzIwX0RMTF9EUVNfQllQQVNTXzFfREVDT0RFKG4pICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+OCkmMHg3RikKKyNkZWZpbmUgRERSMF8yMF9ETExfRFFTX0JZUEFTU18wX01BU0sgICAgICAweDAwMDAwMDdGCisjZGVmaW5lIEREUjBfMjBfRExMX0RRU19CWVBBU1NfMF9FTkNPREUobikgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4N0YpPDwwKQorI2RlZmluZSBERFIwXzIwX0RMTF9EUVNfQllQQVNTXzBfREVDT0RFKG4pICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+MCkmMHg3RikKKworI2RlZmluZSBERFIwXzIxICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUKKyNkZWZpbmUgRERSMF8yMV9ETExfRFFTX0JZUEFTU183X01BU0sgICAgICAweDdGMDAwMDAwCisjZGVmaW5lIEREUjBfMjFfRExMX0RRU19CWVBBU1NfN19FTkNPREUobikgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4N0YpPDwyNCkKKyNkZWZpbmUgRERSMF8yMV9ETExfRFFTX0JZUEFTU183X0RFQ09ERShuKSAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjI0KSYweDdGKQorI2RlZmluZSBERFIwXzIxX0RMTF9EUVNfQllQQVNTXzZfTUFTSyAgICAgIDB4MDA3RjAwMDAKKyNkZWZpbmUgRERSMF8yMV9ETExfRFFTX0JZUEFTU182X0VOQ09ERShuKSAgICgoKCh1bnNpZ25lZCBsb25nKShuKSkmMHg3Rik8PDE2KQorI2RlZmluZSBERFIwXzIxX0RMTF9EUVNfQllQQVNTXzZfREVDT0RFKG4pICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+MTYpJjB4N0YpCisjZGVmaW5lIEREUjBfMjFfRExMX0RRU19CWVBBU1NfNV9NQVNLICAgICAgMHgwMDAwN0YwMAorI2RlZmluZSBERFIwXzIxX0RMTF9EUVNfQllQQVNTXzVfRU5DT0RFKG4pICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDdGKTw8OCkKKyNkZWZpbmUgRERSMF8yMV9ETExfRFFTX0JZUEFTU181X0RFQ09ERShuKSAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjgpJjB4N0YpCisjZGVmaW5lIEREUjBfMjFfRExMX0RRU19CWVBBU1NfNF9NQVNLICAgICAgMHgwMDAwMDA3RgorI2RlZmluZSBERFIwXzIxX0RMTF9EUVNfQllQQVNTXzRfRU5DT0RFKG4pICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDdGKTw8MCkKKyNkZWZpbmUgRERSMF8yMV9ETExfRFFTX0JZUEFTU180X0RFQ09ERShuKSAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjApJjB4N0YpCisKKyNkZWZpbmUgRERSMF8yMiAgICAgICAgICAgICAgICAgICAgICAgICAweDE2CisvKiBFQ0MgKi8KKyNkZWZpbmUgRERSMF8yMl9DVFJMX1JBV19NQVNLICAgICAgICAgICAgIDB4MDMwMDAwMDAKKyNkZWZpbmUgRERSMF8yMl9DVFJMX1JBV19FQ0NfRElTQUJMRSAgICAgIDB4MDAwMDAwMDAgLyogRUNDIG5vdCBiZWluZyB1c2VkICovCisjZGVmaW5lIEREUjBfMjJfQ1RSTF9SQVdfRUNDX0NIRUNLX09OTFkgICAweDAxMDAwMDAwIC8qIEVDQyBjaGVja2luZyBpcyBvbiwgYnV0IG5vIGF0dGVtcHRzIHRvIGNvcnJlY3QqLworI2RlZmluZSBERFIwXzIyX0NUUkxfUkFXX05PX0VDQ19SQU0gICAgICAgMHgwMjAwMDAwMCAvKiBObyBFQ0MgUkFNIHN0b3JhZ2UgYXZhaWxhYmxlICovCisjZGVmaW5lIEREUjBfMjJfQ1RSTF9SQVdfRUNDX0VOQUJMRSAgICAgICAweDAzMDAwMDAwIC8qIEVDQyBjaGVja2luZyBhbmQgY29ycmVjdGluZyBvbiAqLworI2RlZmluZSBERFIwXzIyX0NUUkxfUkFXX0VOQ09ERShuKSAgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4Myk8PDI0KQorI2RlZmluZSBERFIwXzIyX0NUUkxfUkFXX0RFQ09ERShuKSAgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpPj4yNCkmMHgzKQorCisjZGVmaW5lIEREUjBfMjJfRFFTX09VVF9TSElGVF9CWVBBU1NfTUFTSyAweDAwN0YwMDAwCisjZGVmaW5lIEREUjBfMjJfRFFTX09VVF9TSElGVF9CWVBBU1NfRU5DT0RFKG4pICgoKCh1bnNpZ25lZCBsb25nKShuKSkmMHg3Rik8PDE2KQorI2RlZmluZSBERFIwXzIyX0RRU19PVVRfU0hJRlRfQllQQVNTX0RFQ09ERShuKSAoKCgodW5zaWduZWQgbG9uZykobikpPj4xNikmMHg3RikKKyNkZWZpbmUgRERSMF8yMl9EUVNfT1VUX1NISUZUX01BU0sgICAgICAgIDB4MDAwMDdGMDAKKyNkZWZpbmUgRERSMF8yMl9EUVNfT1VUX1NISUZUX0VOQ09ERShuKSAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDdGKTw8OCkKKyNkZWZpbmUgRERSMF8yMl9EUVNfT1VUX1NISUZUX0RFQ09ERShuKSAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+OCkmMHg3RikKKyNkZWZpbmUgRERSMF8yMl9ETExfRFFTX0JZUEFTU184X01BU0sgICAgIDB4MDAwMDAwN0YKKyNkZWZpbmUgRERSMF8yMl9ETExfRFFTX0JZUEFTU184X0VOQ09ERShuKSAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDdGKTw8MCkKKyNkZWZpbmUgRERSMF8yMl9ETExfRFFTX0JZUEFTU184X0RFQ09ERShuKSAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+MCkmMHg3RikKKworCisjZGVmaW5lIEREUjBfMjMgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNworI2RlZmluZSBERFIwXzIzX09EVF9SRF9NQVBfQ1MwX01BU0sgICAgICAgMHgwMzAwMDAwMAorI2RlZmluZSBERFIwXzIzX09EVF9SRF9NQVBfQ1MwX0VOQ09ERShuKSAgICgoKCh1bnNpZ25lZCBsb25nKShuKSkmMHgzKTw8MjQpCisjZGVmaW5lIEREUjBfMjNfT0RUX1JEX01BUF9DUzBfREVDT0RFKG4pICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+MjQpJjB4MykKKyNkZWZpbmUgRERSMF8yM19FQ0NfQ19TWU5EX01BU0sgICAgICAgICAgIDB4MDBGRjAwMDAgLyogUmVhZCBvbmx5ICovCisjZGVmaW5lIEREUjBfMjNfRUNDX0NfU1lORF9FTkNPREUobikgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSkmMHhGRik8PDE2KQorI2RlZmluZSBERFIwXzIzX0VDQ19DX1NZTkRfREVDT0RFKG4pICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpPj4xNikmMHhGRikKKyNkZWZpbmUgRERSMF8yM19FQ0NfVV9TWU5EX01BU0sgICAgICAgICAgIDB4MDAwMEZGMDAgLyogUmVhZCBvbmx5ICovCisjZGVmaW5lIEREUjBfMjNfRUNDX1VfU1lORF9FTkNPREUobikgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSkmMHhGRik8PDgpCisjZGVmaW5lIEREUjBfMjNfRUNDX1VfU1lORF9ERUNPREUobikgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjgpJjB4RkYpCisjZGVmaW5lIEREUjBfMjNfRldDX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxIC8qIFdyaXRlIG9ubHkgKi8KKyNkZWZpbmUgRERSMF8yM19GV0NfRU5DT0RFKG4pICAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDEpPDwwKQorI2RlZmluZSBERFIwXzIzX0ZXQ19ERUNPREUobikgICAgICAgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpPj4wKSYweDEpCisKKyNkZWZpbmUgRERSMF8yNCAgICAgICAgICAgICAgICAgICAgICAgICAweDE4CisjZGVmaW5lIEREUjBfMjRfUlRUX1BBRF9URVJNSU5BVElPTl9NQVNLICAweDAzMDAwMDAwCisjZGVmaW5lIEREUjBfMjRfUlRUX1BBRF9URVJNSU5BVElPTl9FTkNPREUobikgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDMpPDwyNCkKKyNkZWZpbmUgRERSMF8yNF9SVFRfUEFEX1RFUk1JTkFUSU9OX0RFQ09ERShuKSAoKCgodW5zaWduZWQgbG9uZykobikpPj4yNCkmMHgzKQorI2RlZmluZSBERFIwXzI0X09EVF9XUl9NQVBfQ1MxX01BU0sgICAgICAgMHgwMDAzMDAwMAorI2RlZmluZSBERFIwXzI0X09EVF9XUl9NQVBfQ1MxX0VOQ09ERShuKSAgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4Myk8PDE2KQorI2RlZmluZSBERFIwXzI0X09EVF9XUl9NQVBfQ1MxX0RFQ09ERShuKSAgICAoKCgodW5zaWduZWQgbG9uZykobikpPj4xNikmMHgzKQorI2RlZmluZSBERFIwXzI0X09EVF9SRF9NQVBfQ1MxX01BU0sgICAgICAgMHgwMDAwMDMwMAorI2RlZmluZSBERFIwXzI0X09EVF9SRF9NQVBfQ1MxX0VOQ09ERShuKSAgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4Myk8PDgpCisjZGVmaW5lIEREUjBfMjRfT0RUX1JEX01BUF9DUzFfREVDT0RFKG4pICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjgpJjB4MykKKyNkZWZpbmUgRERSMF8yNF9PRFRfV1JfTUFQX0NTMF9NQVNLICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgRERSMF8yNF9PRFRfV1JfTUFQX0NTMF9FTkNPREUobikgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDMpPDwwKQorI2RlZmluZSBERFIwXzI0X09EVF9XUl9NQVBfQ1MwX0RFQ09ERShuKSAgICAoKCgodW5zaWduZWQgbG9uZykobikpPj4wKSYweDMpCisKKyNkZWZpbmUgRERSMF8yNSAgICAgICAgICAgICAgICAgICAgICAgICAweDE5CisjZGVmaW5lIEREUjBfMjVfVkVSU0lPTl9NQVNLICAgICAgICAgICAgICAweEZGRkYwMDAwIC8qIFJlYWQgb25seSAqLworI2RlZmluZSBERFIwXzI1X1ZFUlNJT05fRU5DT0RFKG4pICAgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4RkZGRik8PDE2KQorI2RlZmluZSBERFIwXzI1X1ZFUlNJT05fREVDT0RFKG4pICAgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpPj4xNikmMHhGRkZGKQorI2RlZmluZSBERFIwXzI1X09VVF9PRl9SQU5HRV9MRU5HVEhfTUFTSyAgMHgwMDAwMDNGRiAvKiBSZWFkIG9ubHkgKi8KKyNkZWZpbmUgRERSMF8yNV9PVVRfT0ZfUkFOR0VfTEVOR1RIX0VOQ09ERShuKSAoKCgodW5zaWduZWQgbG9uZykobikpJjB4M0ZGKTw8MCkKKyNkZWZpbmUgRERSMF8yNV9PVVRfT0ZfUkFOR0VfTEVOR1RIX0RFQ09ERShuKSAoKCgodW5zaWduZWQgbG9uZykobikpPj4wKSYweDNGRikKKworI2RlZmluZSBERFIwXzI2ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUEKKyNkZWZpbmUgRERSMF8yNl9UUkFTX01BWF9NQVNLICAgICAgICAgICAgIDB4RkZGRjAwMDAKKyNkZWZpbmUgRERSMF8yNl9UUkFTX01BWF9FTkNPREUobikgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweEZGRkYpPDwxNikKKyNkZWZpbmUgRERSMF8yNl9UUkFTX01BWF9ERUNPREUobikgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+MTYpJjB4RkZGRikKKyNkZWZpbmUgRERSMF8yNl9UUkVGX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMDNGRkYKKyNkZWZpbmUgRERSMF8yNl9UUkVGX0VOQ09ERShuKSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDNGRik8PDApCisjZGVmaW5lIEREUjBfMjZfVFJFRl9ERUNPREUobikgICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjApJjB4M0ZGKQorCisjZGVmaW5lIEREUjBfMjcgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQgorI2RlZmluZSBERFIwXzI3X0VNUlNfREFUQV9NQVNLICAgICAgICAgICAgMHgzRkZGMDAwMAorI2RlZmluZSBERFIwXzI3X0VNUlNfREFUQV9FTkNPREUobikgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4M0ZGRik8PDE2KQorI2RlZmluZSBERFIwXzI3X0VNUlNfREFUQV9ERUNPREUobikgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpPj4xNikmMHgzRkZGKQorI2RlZmluZSBERFIwXzI3X1RJTklUX01BU0sgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgorI2RlZmluZSBERFIwXzI3X1RJTklUX0VOQ09ERShuKSAgICAgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4RkZGRik8PDApCisjZGVmaW5lIEREUjBfMjdfVElOSVRfREVDT0RFKG4pICAgICAgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjApJjB4RkZGRikKKworI2RlZmluZSBERFIwXzI4ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUMKKyNkZWZpbmUgRERSMF8yOF9FTVJTM19EQVRBX01BU0sgICAgICAgICAgIDB4M0ZGRjAwMDAKKyNkZWZpbmUgRERSMF8yOF9FTVJTM19EQVRBX0VOQ09ERShuKSAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDNGRkYpPDwxNikKKyNkZWZpbmUgRERSMF8yOF9FTVJTM19EQVRBX0RFQ09ERShuKSAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+MTYpJjB4M0ZGRikKKyNkZWZpbmUgRERSMF8yOF9FTVJTMl9EQVRBX01BU0sgICAgICAgICAgIDB4MDAwMDNGRkYKKyNkZWZpbmUgRERSMF8yOF9FTVJTMl9EQVRBX0VOQ09ERShuKSAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDNGRkYpPDwwKQorI2RlZmluZSBERFIwXzI4X0VNUlMyX0RBVEFfREVDT0RFKG4pICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpPj4wKSYweDNGRkYpCisKKyNkZWZpbmUgRERSMF8yOSAgICAgICAgICAgICAgICAgICAgICAgICAweDFECisKKyNkZWZpbmUgRERSMF8zMCAgICAgICAgICAgICAgICAgICAgICAgICAweDFFCisKKyNkZWZpbmUgRERSMF8zMSAgICAgICAgICAgICAgICAgICAgICAgICAweDFGCisjZGVmaW5lIEREUjBfMzFfWE9SX0NIRUNLX0JJVFNfTUFTSyAgICAgICAweDAwMDBGRkZGCisjZGVmaW5lIEREUjBfMzFfWE9SX0NIRUNLX0JJVFNfRU5DT0RFKG4pICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSkmMHhGRkZGKTw8MCkKKyNkZWZpbmUgRERSMF8zMV9YT1JfQ0hFQ0tfQklUU19ERUNPREUobikgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+MCkmMHhGRkZGKQorCisjZGVmaW5lIEREUjBfMzIgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBERFIwXzMyX09VVF9PRl9SQU5HRV9BRERSX01BU0sgICAgMHhGRkZGRkZGRiAvKiBSZWFkIG9ubHkgKi8KKyNkZWZpbmUgRERSMF8zMl9PVVRfT0ZfUkFOR0VfQUREUl9FTkNPREUobikgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweEZGRkZGRkZGKTw8MCkKKyNkZWZpbmUgRERSMF8zMl9PVVRfT0ZfUkFOR0VfQUREUl9ERUNPREUobikgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+MCkmMHhGRkZGRkZGRikKKworI2RlZmluZSBERFIwXzMzICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjEKKyNkZWZpbmUgRERSMF8zM19PVVRfT0ZfUkFOR0VfQUREUl9NQVNLICAgIDB4MDAwMDAwMDEgLyogUmVhZCBvbmx5ICovCisjZGVmaW5lIEREUjBfMzNfT1VUX09GX1JBTkdFX0FERFJfRU5DT0RFKG4pICgoKCh1bnNpZ25lZCBsb25nKShuKSkmMHgxKTw8MCkKKyNkZWZpbmUgRERSMF8zM19PVVRfT0ZfUkFOR0VfQUREUl9ERUNPREUobikgICAgICAgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpPj4wKSYweDEpCisKKyNkZWZpbmUgRERSMF8zNCAgICAgICAgICAgICAgICAgICAgICAgICAweDIyCisjZGVmaW5lIEREUjBfMzRfRUNDX1VfQUREUl9NQVNLICAgICAgICAgICAweEZGRkZGRkZGIC8qIFJlYWQgb25seSAqLworI2RlZmluZSBERFIwXzM0X0VDQ19VX0FERFJfRU5DT0RFKG4pICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4RkZGRkZGRkYpPDwwKQorI2RlZmluZSBERFIwXzM0X0VDQ19VX0FERFJfREVDT0RFKG4pICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpPj4wKSYweEZGRkZGRkZGKQorCisjZGVmaW5lIEREUjBfMzUgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMworI2RlZmluZSBERFIwXzM1X0VDQ19VX0FERFJfTUFTSyAgICAgICAgICAgMHgwMDAwMDAwMSAvKiBSZWFkIG9ubHkgKi8KKyNkZWZpbmUgRERSMF8zNV9FQ0NfVV9BRERSX0VOQ09ERShuKSAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDEpPDwwKQorI2RlZmluZSBERFIwXzM1X0VDQ19VX0FERFJfREVDT0RFKG4pICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpPj4wKSYweDEpCisKKyNkZWZpbmUgRERSMF8zNiAgICAgICAgICAgICAgICAgICAgICAgICAweDI0CisjZGVmaW5lIEREUjBfMzZfRUNDX1VfREFUQV9NQVNLICAgICAgICAgICAweEZGRkZGRkZGIC8qIFJlYWQgb25seSAqLworI2RlZmluZSBERFIwXzM2X0VDQ19VX0RBVEFfRU5DT0RFKG4pICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4RkZGRkZGRkYpPDwwKQorI2RlZmluZSBERFIwXzM2X0VDQ19VX0RBVEFfREVDT0RFKG4pICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpPj4wKSYweEZGRkZGRkZGKQorCisjZGVmaW5lIEREUjBfMzcgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNQorI2RlZmluZSBERFIwXzM3X0VDQ19VX0RBVEFfTUFTSyAgICAgICAgICAgMHhGRkZGRkZGRiAvKiBSZWFkIG9ubHkgKi8KKyNkZWZpbmUgRERSMF8zN19FQ0NfVV9EQVRBX0VOQ09ERShuKSAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweEZGRkZGRkZGKTw8MCkKKyNkZWZpbmUgRERSMF8zN19FQ0NfVV9EQVRBX0RFQ09ERShuKSAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+MCkmMHhGRkZGRkZGRikKKworI2RlZmluZSBERFIwXzM4ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjYKKyNkZWZpbmUgRERSMF8zOF9FQ0NfQ19BRERSX01BU0sgICAgICAgICAgIDB4RkZGRkZGRkYgLyogUmVhZCBvbmx5ICovCisjZGVmaW5lIEREUjBfMzhfRUNDX0NfQUREUl9FTkNPREUobikgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSkmMHhGRkZGRkZGRik8PDApCisjZGVmaW5lIEREUjBfMzhfRUNDX0NfQUREUl9ERUNPREUobikgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjApJjB4RkZGRkZGRkYpCisKKyNkZWZpbmUgRERSMF8zOSAgICAgICAgICAgICAgICAgICAgICAgICAweDI3CisjZGVmaW5lIEREUjBfMzlfRUNDX0NfQUREUl9NQVNLICAgICAgICAgICAweDAwMDAwMDAxIC8qIFJlYWQgb25seSAqLworI2RlZmluZSBERFIwXzM5X0VDQ19DX0FERFJfRU5DT0RFKG4pICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4MSk8PDApCisjZGVmaW5lIEREUjBfMzlfRUNDX0NfQUREUl9ERUNPREUobikgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjApJjB4MSkKKworI2RlZmluZSBERFIwXzQwICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjgKKyNkZWZpbmUgRERSMF80MF9FQ0NfQ19EQVRBX01BU0sgICAgICAgICAgIDB4RkZGRkZGRkYgLyogUmVhZCBvbmx5ICovCisjZGVmaW5lIEREUjBfNDBfRUNDX0NfREFUQV9FTkNPREUobikgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSkmMHhGRkZGRkZGRik8PDApCisjZGVmaW5lIEREUjBfNDBfRUNDX0NfREFUQV9ERUNPREUobikgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjApJjB4RkZGRkZGRkYpCisKKyNkZWZpbmUgRERSMF80MSAgICAgICAgICAgICAgICAgICAgICAgICAweDI5CisjZGVmaW5lIEREUjBfNDFfRUNDX0NfREFUQV9NQVNLICAgICAgICAgICAweEZGRkZGRkZGIC8qIFJlYWQgb25seSAqLworI2RlZmluZSBERFIwXzQxX0VDQ19DX0RBVEFfRU5DT0RFKG4pICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4RkZGRkZGRkYpPDwwKQorI2RlZmluZSBERFIwXzQxX0VDQ19DX0RBVEFfREVDT0RFKG4pICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpPj4wKSYweEZGRkZGRkZGKQorCisjZGVmaW5lIEREUjBfNDIgICAgICAgICAgICAgICAgICAgICAgICAgMHgyQQorI2RlZmluZSBERFIwXzQyX0FERFJfUElOU19NQVNLICAgICAgICAgICAgMHgwNzAwMDAwMAorI2RlZmluZSBERFIwXzQyX0FERFJfUElOU19FTkNPREUobikgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4Nyk8PDI0KQorI2RlZmluZSBERFIwXzQyX0FERFJfUElOU19ERUNPREUobikgICAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpPj4yNCkmMHg3KQorI2RlZmluZSBERFIwXzQyX0NBU0xBVF9MSU5fR0FURV9NQVNLICAgICAgMHgwMDAwMDAwRgorI2RlZmluZSBERFIwXzQyX0NBU0xBVF9MSU5fR0FURV9FTkNPREUobikgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4Rik8PDApCisjZGVmaW5lIEREUjBfNDJfQ0FTTEFUX0xJTl9HQVRFX0RFQ09ERShuKSAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjApJjB4RikKKworI2RlZmluZSBERFIwXzQzICAgICAgICAgICAgICAgICAgICAgICAgIDB4MkIKKyNkZWZpbmUgRERSMF80M19UV1JfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDcwMDAwMDAKKyNkZWZpbmUgRERSMF80M19UV1JfRU5DT0RFKG4pICAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDcpPDwyNCkKKyNkZWZpbmUgRERSMF80M19UV1JfREVDT0RFKG4pICAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+MjQpJjB4NykKKyNkZWZpbmUgRERSMF80M19BUFJFQklUX01BU0sgICAgICAgICAgICAgIDB4MDAwRjAwMDAKKyNkZWZpbmUgRERSMF80M19BUFJFQklUX0VOQ09ERShuKSAgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweEYpPDwxNikKKyNkZWZpbmUgRERSMF80M19BUFJFQklUX0RFQ09ERShuKSAgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+MTYpJjB4RikKKyNkZWZpbmUgRERSMF80M19DT0xVTU5fU0laRV9NQVNLICAgICAgICAgIDB4MDAwMDA3MDAKKyNkZWZpbmUgRERSMF80M19DT0xVTU5fU0laRV9FTkNPREUobikgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweDcpPDw4KQorI2RlZmluZSBERFIwXzQzX0NPTFVNTl9TSVpFX0RFQ09ERShuKSAgICAgICAoKCgodW5zaWduZWQgbG9uZykobikpPj44KSYweDcpCisjZGVmaW5lIEREUjBfNDNfRUlHSFRfQkFOS19NT0RFX01BU0sgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEREUjBfNDNfRUlHSFRfQkFOS19NT0RFXzhfQkFOS1MgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRERSMF80M19FSUdIVF9CQU5LX01PREVfNF9CQU5LUyAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBERFIwXzQzX0VJR0hUX0JBTktfTU9ERV9FTkNPREUobikgICAoKCgodW5zaWduZWQgbG9uZykobikpJjB4MSk8PDApCisjZGVmaW5lIEREUjBfNDNfRUlHSFRfQkFOS19NT0RFX0RFQ09ERShuKSAgICgoKCh1bnNpZ25lZCBsb25nKShuKSk+PjApJjB4MSkKKworI2RlZmluZSBERFIwXzQ0ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MkMKKyNkZWZpbmUgRERSMF80NF9UUkNEX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkYKKyNkZWZpbmUgRERSMF80NF9UUkNEX0VOQ09ERShuKSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKSYweEZGKTw8MCkKKyNkZWZpbmUgRERSMF80NF9UUkNEX0RFQ09ERShuKSAgICAgICAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+MCkmMHhGRikKKworI2VuZGlmIC8qIF9TUERfU0RSQU1fREVOQUxJX0hfICovCmRpZmYgLS1naXQgYS9ib2FyZC9sd21vbjUvdS1ib290LmxkcyBiL2JvYXJkL2x3bW9uNS91LWJvb3QubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MjNmOTgKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9sd21vbjUvdS1ib290LmxkcwpAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfQVJDSChwb3dlcnBjKQorU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7CisvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPworICAgX19EWU5BTUlDID0gMDsgICAgKi8KK1NFQ1RJT05TCit7CisgIC5yZXNldHZlYyAweEZGRkZGRkZDIDoKKyAgeworICAgICooLnJlc2V0dmVjKQorICB9ID0gMHhmZmZmCisKKyAgLmJvb3RwZyAweEZGRkZGMDAwIDoKKyAgeworICAgIGNwdS9wcGM0eHgvc3RhcnQubwkoLmJvb3RwZykKKyAgfSA9IDB4ZmZmZgorCisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9CisgIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQorICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQorICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQorICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9CisgIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9CisgIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KKyAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KKyAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9CisgIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KKyAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9CisgIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KKyAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQorICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQorICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9CisgIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9CisgIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQorICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9CisgIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQorICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9CisgIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9CisgIC5wbHQgOiB7ICooLnBsdCkgfQorICAudGV4dCAgICAgIDoKKyAgeworICAgIC8qIFdBUk5JTkcgLSB0aGUgZm9sbG93aW5nIGlzIGhhbmQtb3B0aW1pemVkIHRvIGZpdCB3aXRoaW4JKi8KKyAgICAvKiB0aGUgc2VjdG9yIGxheW91dCBvZiBvdXIgZmxhc2ggY2hpcHMhCVhYWCBGSVhNRSBYWFgJKi8KKworICAgIGNwdS9wcGM0eHgvc3RhcnQubwkoLnRleHQpCisKKyAgICAqKC50ZXh0KQorICAgICooLmZpeHVwKQorICAgICooLmdvdDEpCisgIH0KKyAgX2V0ZXh0ID0gLjsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICA6CisgIHsKKyAgICAqKC5yb2RhdGEpCisgICAgKigucm9kYXRhMSkKKyAgICAqKC5yb2RhdGEuc3RyMS40KQorICB9CisgIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKKyAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQorICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9CisKKyAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCisgIC4gPSAoLiArIDB4MDBGRikgJiAweEZGRkZGRjAwOworICBfZXJvdGV4dCA9IC47CisgIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKKyAgLnJlbG9jICAgOgorICB7CisgICAgKiguZ290KQorICAgIF9HT1QyX1RBQkxFXyA9IC47CisgICAgKiguZ290MikKKyAgICBfRklYVVBfVEFCTEVfID0gLjsKKyAgICAqKC5maXh1cCkKKyAgfQorICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PjI7CisgIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXyk+PjI7CisKKyAgLmRhdGEgICAgOgorICB7CisgICAgKiguZGF0YSkKKyAgICAqKC5kYXRhMSkKKyAgICAqKC5zZGF0YSkKKyAgICAqKC5zZGF0YTIpCisgICAgKiguZHluYW1pYykKKyAgICBDT05TVFJVQ1RPUlMKKyAgfQorICBfZWRhdGEgID0gIC47CisgIFBST1ZJREUgKGVkYXRhID0gLik7CisKKyAgLiA9IC47CisgIF9fdV9ib290X2NtZF9zdGFydCA9IC47CisgIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9CisgIF9fdV9ib290X2NtZF9lbmQgPSAuOworCisKKyAgLiA9IC47CisgIF9fc3RhcnRfX19leF90YWJsZSA9IC47CisgIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQorICBfX3N0b3BfX19leF90YWJsZSA9IC47CisKKyAgLiA9IEFMSUdOKDI1Nik7CisgIF9faW5pdF9iZWdpbiA9IC47CisgIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQorICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KKyAgLiA9IEFMSUdOKDI1Nik7CisgIF9faW5pdF9lbmQgPSAuOworCisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICA6CisgIHsKKyAgICooLnNic3MpICooLnNjb21tb24pCisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgfQorCisgIHBwY2Vudl9hc3NlcnQgPSBBU1NFUlQoLiA8IDB4RkZGRjgwMDAsICIuYnNzIHNlY3Rpb24gdG9vIGJpZywgb3ZlcmxhcHMgLnBwY2VudiBzZWN0aW9uLiBQbGVhc2UgdXBkYXRlIHlvdXIgY29uZmd1cmF0aW9uOiBDRkdfTU9OSVRPUl9CQVNFLCBDRkdfTU9OSVRPUl9MRU4gYW5kIFRFWFRfQkFTRSBtYXkgbmVlZCB0byBiZSBtb2RpZmllZC4iKTsKKworICBfZW5kID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvbWJ4OHh4L3BjbWNpYS5jIGIvYm9hcmQvbWJ4OHh4L3BjbWNpYS5jCmluZGV4IDEzMmE2ODguLmEwMmM4NDggMTAwNjQ0Ci0tLSBhL2JvYXJkL21ieDh4eC9wY21jaWEuYworKysgYi9ib2FyZC9tYng4eHgvcGNtY2lhLmMKQEAgLTYsMTEgKzYsMTEgQEAKIAogI3VuZGVmCUNPTkZJR19QQ01DSUEKIAotI2lmCShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogI2RlZmluZQlDT05GSUdfUENNQ0lBCiAjZW5kaWYKIAotI2lmCShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFXzh4eF9QQ0NBUkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFXzh4eF9QQ0NBUkQpCiAjZGVmaW5lCUNPTkZJR19QQ01DSUEKICNlbmRpZgogCkBAIC0xNTYsMTEgKzE1NiwxMSBAQAogCXJldHVybiAoMCk7CiAJfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiBpbnQgcGNtY2lhX2hhcmR3YXJlX2Rpc2FibGUgKGludCBzbG90KQogewogCXJldHVybiAwOwkvKiBObyBoYXJkd2FyZSB0byBkaXNhYmxlICovCiB9Ci0jZW5kaWYgLyogQ0ZHX0NNRF9QQ01DSUEgKi8KKyNlbmRpZgogCiAjZW5kaWYJLyogQ09ORklHX1BDTUNJQSAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvbWNjMjAwL2F1dG9fdXBkYXRlLmMgYi9ib2FyZC9tY2MyMDAvYXV0b191cGRhdGUuYwppbmRleCA5MGQwM2VjLi4yOGU0Yzg3IDEwMDY0NAotLS0gYS9ib2FyZC9tY2MyMDAvYXV0b191cGRhdGUuYworKysgYi9ib2FyZC9tY2MyMDAvYXV0b191cGRhdGUuYwpAQCAtNDQsOCArNDQsOCBAQAogI2Vycm9yICJtdXN0IGRlZmluZSBDRkdfSFVTSF9QQVJTRVIiCiAjZW5kaWYKIAotI2lmICEoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GQVQpCi0jZXJyb3IgIm11c3QgZGVmaW5lIENGR19DTURfRkFUIgorI2lmICFkZWZpbmVkKENPTkZJR19DTURfRkFUKQorI2Vycm9yICJtdXN0IGRlZmluZSBDT05GSUdfQ01EX0ZBVCIKICNlbmRpZgogCiAjdW5kZWYgQVVfREVCVUcKQEAgLTMzMCw2ICszMzAsOCBAQAogCWludCBpLCByZXMgPSAwLCBiaXRtYXBfZmlyc3QsIGNudCwgb2xkX2N0cmxjLCBnb3RfY3RybGM7CiAJY2hhciAqZW52OwogCWxvbmcgc3RhcnQsIGVuZDsKKworI2lmIDAgLyogZGlzYWJsZSBrZXktcHJlc3MgZGV0ZWN0aW9uIHRvIHNwZWVkIHVwIGJvb3QtdXAgdGltZSAqLwogCXVjaGFyIGtleXBhZF9zdGF0dXMxWzJdID0gezAsMH0sIGtleXBhZF9zdGF0dXMyWzJdID0gezAsMH07CiAKIAkvKgpAQCAtMzQ3LDYgKzM0OSw3IEBACiAJCXJldHVybiAwOwogCX0KIAorI2VuZGlmCiAJYXVfdXNiX3N0b3JfY3Vycl9kZXYgPSAtMTsKIAkvKiBzdGFydCBVU0IgKi8KIAlpZiAodXNiX3N0b3AoKSA8IDApIHsKQEAgLTM2NCwxOCArMzY3LDIxIEBACiAJYXVfdXNiX3N0b3JfY3Vycl9kZXYgPSB1c2Jfc3Rvcl9zY2FuKDApOwogCWlmIChhdV91c2Jfc3Rvcl9jdXJyX2RldiA9PSAtMSkgewogCQlkZWJ1ZyAoIk5vIGRldmljZSBmb3VuZC4gTm90IGluaXRpYWxpemVkP1xuIik7Ci0JCXJldHVybiAtMTsKKwkJcmVzID0gLTE7CisJCWdvdG8geGl0OwogCX0KIAkvKiBjaGVjayB3aGV0aGVyIGl0IGhhcyBhIHBhcnRpdGlvbiB0YWJsZSAqLwogCXN0b3JfZGV2ID0gZ2V0X2RldigidXNiIiwgMCk7CiAJaWYgKHN0b3JfZGV2ID09IE5VTEwpIHsKIAkJZGVidWcgKCJ1a25vd24gZGV2aWNlIHR5cGVcbiIpOwotCQlyZXR1cm4gLTE7CisJCXJlcyA9IC0xOworCQlnb3RvIHhpdDsKIAl9CiAJaWYgKGZhdF9yZWdpc3Rlcl9kZXZpY2Uoc3Rvcl9kZXYsIDEpICE9IDApIHsKIAkJZGVidWcgKCJVbmFibGUgdG8gdXNlIFVTQiAlZDolZCBmb3IgZmF0bHNcbiIsCiAJCQlhdV91c2Jfc3Rvcl9jdXJyX2RldiwgMSk7Ci0JCXJldHVybiAtMTsKKwkJcmVzID0gLTE7CisJCWdvdG8geGl0OwogCX0KIAlpZiAoZmlsZV9mYXRfZGV0ZWN0ZnMoKSAhPSAwKSB7CiAJCWRlYnVnICgiZmlsZV9mYXRfZGV0ZWN0ZnMgZmFpbGVkXG4iKTsKQEAgLTUwNCw3ICs1MTAsNyBAQAogCQl9IHdoaWxlIChyZXMgPCAwKTsKICNlbmRpZgogCX0KLQl1c2Jfc3RvcCgpOworCiAJLyogcmVzdG9yZSB0aGUgb2xkIHN0YXRlICovCiAJZGlzYWJsZV9jdHJsYyhvbGRfY3RybGMpOwogI2lmZGVmIENPTkZJR19QUk9HUkVTU0JBUgpAQCAtNTE3LDYgKzUyMyw4IEBACiAJCWxjZF9lbmFibGUoKTsKIAl9CiAjZW5kaWYKLQlyZXR1cm4gMDsKKyB4aXQ6CisJdXNiX3N0b3AoKTsKKwlyZXR1cm4gcmVzOwogfQogI2VuZGlmIC8qIENPTkZJR19BVVRPX1VQREFURSAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvbWNjMjAwL21jYzIwMC5jIGIvYm9hcmQvbWNjMjAwL21jYzIwMC5jCmluZGV4IGFmMDQ3ZTIuLmE0YzQ2NDQgMTAwNjQ0Ci0tLSBhL2JvYXJkL21jYzIwMC9tY2MyMDAuYworKysgYi9ib2FyZC9tY2MyMDAvbWNjMjAwLmMKQEAgLTMwNyw3ICszMDcsNyBAQAogfQogI2VuZGlmCiAKLSNpZiBkZWZpbmVkIChDRkdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfUkVTRVQpCiAKIHZvaWQgaW5pdF9pZGVfcmVzZXQgKHZvaWQpCiB7CkBAIC0zMjAsOSArMzIwLDkgQEAKIAlkZWJ1ZyAoImlkZV9yZXNldCglZClcbiIsIGlkZXJlc2V0KTsKIAogfQotI2VuZGlmIC8qIGRlZmluZWQgKENGR19DTURfSURFKSAmJiBkZWZpbmVkIChDT05GSUdfSURFX1JFU0VUKSAqLworI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ET0MpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RPQykKIGV4dGVybiB2b2lkIGRvY19wcm9iZSAodWxvbmcgcGh5c2Fkcik7CiB2b2lkIGRvY19pbml0ICh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYm9hcmQvbWNjMjAwL3UtYm9vdC5sZHMgYi9ib2FyZC9tY2MyMDAvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZkZWE2Yi4uMDAwMDAwMAotLS0gYS9ib2FyZC9tY2MyMDAvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAzLTIwMDYKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjNXh4eC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9tbDIvc2VyaWFsLmMgYi9ib2FyZC9tbDIvc2VyaWFsLmMKaW5kZXggNzQ2ODdmMS4uNjU5MzE0NSAxMDA2NDQKLS0tIGEvYm9hcmQvbWwyL3NlcmlhbC5jCisrKyBiL2JvYXJkL21sMi9zZXJpYWwuYwpAQCAtODgsNyArODgsNyBAQAogCX0KIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiB2b2lkIGtnZGJfc2VyaWFsX2luaXQgKHZvaWQpCiB7CiB9CkBAIC0xMTIsNCArMTEyLDQgQEAKIHsKIAlyZXR1cm47CiB9Ci0jZW5kaWYgLyogQ0ZHX0NNRF9LR0RCICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL21vdXNzZS9jb25maWcubWsgYi9ib2FyZC9tb3Vzc2UvY29uZmlnLm1rCmluZGV4IDY0Y2ZmYTQuLjkzM2U2YjMgMTAwNjQ0Ci0tLSBhL2JvYXJkL21vdXNzZS9jb25maWcubWsKKysrIGIvYm9hcmQvbW91c3NlL2NvbmZpZy5tawpAQCAtMjYsMyArMjYsNSBAQAogIwogVEVYVF9CQVNFID0gMHhGRkYwMDAwMAogUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURURVhUX0JBU0U9JChURVhUX0JBU0UpCisKK0xEU0NSSVBUIDo9ICQoU1JDVFJFRSkvYm9hcmQvbW91c3NlL3UtYm9vdC5sZHMKZGlmZiAtLWdpdCBhL2JvYXJkL21vdXNzZS91LWJvb3QubGRzIGIvYm9hcmQvbW91c3NlL3UtYm9vdC5sZHMKaW5kZXggNTczNThiOC4uZWI0ZDhlNCAxMDA2NDQKLS0tIGEvYm9hcmQvbW91c3NlL3UtYm9vdC5sZHMKKysrIGIvYm9hcmQvbW91c3NlL3UtYm9vdC5sZHMKQEAgLTYwLDcgKzYwLDYgQEAKICAgICBsaWJfZ2VuZXJpYy9jcmMzMi5vCQkoLnRleHQpCiAgICAgbGliX2dlbmVyaWMvemxpYi5vCQkoLnRleHQpCiAKLSAgICAqKC5maXh1cCkKICAgICAqKC5nb3QxKQogICAgIC4gPSBBTElHTigxNik7CiAgICAgKigucm9kYXRhKQpkaWZmIC0tZ2l0IGEvYm9hcmQvbXAydXNiL21wMnVzYi5jIGIvYm9hcmQvbXAydXNiL21wMnVzYi5jCmluZGV4IDQ4NmQ0NGMuLmRjZGE2OTkgMTAwNjQ0Ci0tLSBhL2JvYXJkL21wMnVzYi9tcDJ1c2IuYworKysgYi9ib2FyZC9tcDJ1c2IvbXAydXNiLmMKQEAgLTYxLDcgKzYxLDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19EUklWRVJfRVRIRVIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAogLyoKICAqIE5hbWU6CkBAIC04MSw1ICs4MSw1IEBACiAJcF9waHlvcHMtPkF1dG9OZWdvdGlhdGUgPSBkbTkxNjFfQXV0b05lZ290aWF0ZTsKIH0KIAotI2VuZGlmCS8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUICovCisjZW5kaWYKICNlbmRpZgkvKiBDT05GSUdfRFJJVkVSX0VUSEVSICovCmRpZmYgLS1naXQgYS9ib2FyZC9tcGM4MjYwYWRzL3UtYm9vdC5sZHMgYi9ib2FyZC9tcGM4MjYwYWRzL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmODA0OGQuLjAwMDAwMDAKLS0tIGEvYm9hcmQvbXBjODI2MGFkcy91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEtMjAwMwotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBNb2RpZmllZCBieSBZdWxpIEJhcmNvaGVuIDx5dWxpQGFyYWJlbGxhc3cuY29tPgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI2MC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19Ci1FTlRSWShfc3RhcnQpCmRpZmYgLS1naXQgYS9ib2FyZC9tcGM4MjY2YWRzL3UtYm9vdC5sZHMgYi9ib2FyZC9tcGM4MjY2YWRzL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMjA3NTguLjAwMDAwMDAKLS0tIGEvYm9hcmQvbXBjODI2NmFkcy91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI2MC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvbXBjODMxM2VyZGIvdS1ib290LmxkcyBiL2JvYXJkL21wYzgzMTNlcmRiL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzN2M4N2EuLjAwMDAwMDAKLS0tIGEvYm9hcmQvbXBjODMxM2VyZGIvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDA2Ci0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODN4eC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19Ci1FTlRSWShfc3RhcnQpCmRpZmYgLS1naXQgYS9ib2FyZC9tcGM4MzJ4ZW1kcy91LWJvb3QubGRzIGIvYm9hcmQvbXBjODMyeGVtZHMvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM3Yzg3YS4uMDAwMDAwMAotLS0gYS9ib2FyZC9tcGM4MzJ4ZW1kcy91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDYKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4M3h4L3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KLUVOVFJZKF9zdGFydCkKZGlmZiAtLWdpdCBhL2JvYXJkL21wYzgzNDllbWRzL21wYzgzNDllbWRzLmMgYi9ib2FyZC9tcGM4MzQ5ZW1kcy9tcGM4MzQ5ZW1kcy5jCmluZGV4IDA3MTU5MWUuLjUyMWQxYmIgMTAwNjQ0Ci0tLSBhL2JvYXJkL21wYzgzNDllbWRzL21wYzgzNDllbWRzLmMKKysrIGIvYm9hcmQvbXBjODM0OWVtZHMvbXBjODM0OWVtZHMuYwpAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgPGkyYy5oPgogI2luY2x1ZGUgPHNwZC5oPgogI2luY2x1ZGUgPG1paXBoeS5oPgotI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpZiBkZWZpbmVkKENPTkZJR19TUERfRUVQUk9NKQogI2luY2x1ZGUgPHNwZF9zZHJhbS5oPgogI2VuZGlmCkBAIC0yNTgsMzMyICsyNTcsNiBAQAogfQogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19ERFJfRUNDKSAmJiBkZWZpbmVkKENPTkZJR19ERFJfRUNDX0NNRCkKLS8qCi0gKiBFQ0MgdXNlciBjb21tYW5kcwotICovCi12b2lkIGVjY19wcmludF9zdGF0dXModm9pZCkKLXsKLQl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopQ0ZHX0lNTVI7Ci0Jdm9sYXRpbGUgZGRyODN4eF90ICpkZHIgPSAmaW1tYXAtPmRkcjsKLQotCXByaW50ZigiXG5FQ0MgbW9kZTogJXNcblxuIiwgKGRkci0+c2RyYW1fY2ZnICYgU0RSQU1fQ0ZHX0VDQ19FTikgPyAiT04iIDogIk9GRiIpOwotCi0JLyogSW50ZXJydXB0cyAqLwotCXByaW50ZigiTWVtb3J5IEVycm9yIEludGVycnVwdCBFbmFibGU6XG4iKTsKLQlwcmludGYoIiAgTXVsdGlwbGUtQml0IEVycm9yIEludGVycnVwdCBFbmFibGU6ICVkXG4iLAotCQkJKGRkci0+ZXJyX2ludF9lbiAmIEVDQ19FUlJfSU5UX0VOX01CRUUpID8gMSA6IDApOwotCXByaW50ZigiICBTaW5nbGUtQml0IEVycm9yIEludGVycnVwdCBFbmFibGU6ICVkXG4iLAotCQkJKGRkci0+ZXJyX2ludF9lbiAmIEVDQ19FUlJfSU5UX0VOX1NCRUUpID8gMSA6IDApOwotCXByaW50ZigiICBNZW1vcnkgU2VsZWN0IEVycm9yIEludGVycnVwdCBFbmFibGU6ICVkXG5cbiIsCi0JCQkoZGRyLT5lcnJfaW50X2VuICYgRUNDX0VSUl9JTlRfRU5fTVNFRSkgPyAxIDogMCk7Ci0KLQkvKiBFcnJvciBkaXNhYmxlICovCi0JcHJpbnRmKCJNZW1vcnkgRXJyb3IgRGlzYWJsZTpcbiIpOwotCXByaW50ZigiICBNdWx0aXBsZS1CaXQgRXJyb3IgRGlzYWJsZTogJWRcbiIsCi0JCQkoZGRyLT5lcnJfZGlzYWJsZSAmIEVDQ19FUlJPUl9ESVNBQkxFX01CRUQpID8gMSA6IDApOwotCXByaW50ZigiICBTaW5sZS1CaXQgRXJyb3IgRGlzYWJsZTogJWRcbiIsCi0JCQkoZGRyLT5lcnJfZGlzYWJsZSAmIEVDQ19FUlJPUl9ESVNBQkxFX1NCRUQpID8gMSA6IDApOwotCXByaW50ZigiICBNZW1vcnkgU2VsZWN0IEVycm9yIERpc2FibGU6ICVkXG5cbiIsCi0JCQkoZGRyLT5lcnJfZGlzYWJsZSAmIEVDQ19FUlJPUl9ESVNBQkxFX01TRUQpID8gMSA6IDApOwotCi0JLyogRXJyb3IgaW5qZWN0aW9uICovCi0JcHJpbnRmKCJNZW1vcnkgRGF0YSBQYXRoIEVycm9yIEluamVjdGlvbiBNYXNrIEhpZ2gvTG93OiAlMDhseCAlMDhseFxuIiwKLQkJCWRkci0+ZGF0YV9lcnJfaW5qZWN0X2hpLCBkZHItPmRhdGFfZXJyX2luamVjdF9sbyk7Ci0KLQlwcmludGYoIk1lbW9yeSBEYXRhIFBhdGggRXJyb3IgSW5qZWN0aW9uIE1hc2sgRUNDOlxuIik7Ci0JcHJpbnRmKCIgIEVDQyBNaXJyb3IgQnl0ZTogJWRcbiIsCi0JCQkoZGRyLT5lY2NfZXJyX2luamVjdCAmIEVDQ19FUlJfSU5KRUNUX0VNQikgPyAxIDogMCk7Ci0JcHJpbnRmKCIgIEVDQyBJbmplY3Rpb24gRW5hYmxlOiAlZFxuIiwKLQkJCShkZHItPmVjY19lcnJfaW5qZWN0ICYgRUNDX0VSUl9JTkpFQ1RfRUlFTikgPyAxIDogMCk7Ci0JcHJpbnRmKCIgIEVDQyBFcnJvciBJbmplY3Rpb24gTWFzazogMHglMDJ4XG5cbiIsCi0JCQlkZHItPmVjY19lcnJfaW5qZWN0ICYgRUNDX0VSUl9JTkpFQ1RfRUVJTSk7Ci0KLQkvKiBTQkUgY291bnRlci90aHJlc2hvbGQgKi8KLQlwcmludGYoIk1lbW9yeSBTaW5nbGUtQml0IEVycm9yIE1hbmFnZW1lbnQgKDAuLjI1NSk6XG4iKTsKLQlwcmludGYoIiAgU2luZ2xlLUJpdCBFcnJvciBUaHJlc2hvbGQ6ICVkXG4iLAotCQkJKGRkci0+ZXJyX3NiZSAmIEVDQ19FUlJPUl9NQU5fU0JFVCkgPj4gRUNDX0VSUk9SX01BTl9TQkVUX1NISUZUKTsKLQlwcmludGYoIiAgU2luZ2xlLUJpdCBFcnJvciBDb3VudGVyOiAlZFxuXG4iLAotCQkJKGRkci0+ZXJyX3NiZSAmIEVDQ19FUlJPUl9NQU5fU0JFQykgPj4gRUNDX0VSUk9SX01BTl9TQkVDX1NISUZUKTsKLQotCS8qIEVycm9yIGRldGVjdCAqLwotCXByaW50ZigiTWVtb3J5IEVycm9yIERldGVjdDpcbiIpOwotCXByaW50ZigiICBNdWx0aXBsZSBNZW1vcnkgRXJyb3JzOiAlZFxuIiwKLQkJCShkZHItPmVycl9kZXRlY3QgJiBFQ0NfRVJST1JfREVURUNUX01NRSkgPyAxIDogMCk7Ci0JcHJpbnRmKCIgIE11bHRpcGxlLUJpdCBFcnJvcjogJWRcbiIsCi0JCQkoZGRyLT5lcnJfZGV0ZWN0ICYgRUNDX0VSUk9SX0RFVEVDVF9NQkUpID8gMSA6IDApOwotCXByaW50ZigiICBTaW5nbGUtQml0IEVycm9yOiAlZFxuIiwKLQkJCShkZHItPmVycl9kZXRlY3QgJiBFQ0NfRVJST1JfREVURUNUX1NCRSkgPyAxIDogMCk7Ci0JcHJpbnRmKCIgIE1lbW9yeSBTZWxlY3QgRXJyb3I6ICVkXG5cbiIsCi0JCQkoZGRyLT5lcnJfZGV0ZWN0ICYgRUNDX0VSUk9SX0RFVEVDVF9NU0UpID8gMSA6IDApOwotCi0JLyogQ2FwdHVyZSBkYXRhICovCi0JcHJpbnRmKCJNZW1vcnkgRXJyb3IgQWRkcmVzcyBDYXB0dXJlOiAweCUwOGx4XG4iLCBkZHItPmNhcHR1cmVfYWRkcmVzcyk7Ci0JcHJpbnRmKCJNZW1vcnkgRGF0YSBQYXRoIFJlYWQgQ2FwdHVyZSBIaWdoL0xvdzogJTA4bHggJTA4bHhcbiIsCi0JCQlkZHItPmNhcHR1cmVfZGF0YV9oaSwgZGRyLT5jYXB0dXJlX2RhdGFfbG8pOwotCXByaW50ZigiTWVtb3J5IERhdGEgUGF0aCBSZWFkIENhcHR1cmUgRUNDOiAweCUwMnhcblxuIiwKLQkJZGRyLT5jYXB0dXJlX2VjYyAmIENBUFRVUkVfRUNDX0VDRSk7Ci0KLQlwcmludGYoIk1lbW9yeSBFcnJvciBBdHRyaWJ1dGVzIENhcHR1cmU6XG4iKTsKLQlwcmludGYoIiAgRGF0YSBCZWF0IE51bWJlcjogJWRcbiIsCi0JCQkoZGRyLT5jYXB0dXJlX2F0dHJpYnV0ZXMgJiBFQ0NfQ0FQVF9BVFRSX0JOVU0pID4+IEVDQ19DQVBUX0FUVFJfQk5VTV9TSElGVCk7Ci0JcHJpbnRmKCIgIFRyYW5zYWN0aW9uIFNpemU6ICVkXG4iLAotCQkJKGRkci0+Y2FwdHVyZV9hdHRyaWJ1dGVzICYgRUNDX0NBUFRfQVRUUl9UU0laKSA+PiBFQ0NfQ0FQVF9BVFRSX1RTSVpfU0hJRlQpOwotCXByaW50ZigiICBUcmFuc2FjdGlvbiBTb3VyY2U6ICVkXG4iLAotCQkJKGRkci0+Y2FwdHVyZV9hdHRyaWJ1dGVzICYgRUNDX0NBUFRfQVRUUl9UU1JDKSA+PiBFQ0NfQ0FQVF9BVFRSX1RTUkNfU0hJRlQpOwotCXByaW50ZigiICBUcmFuc2FjdGlvbiBUeXBlOiAlZFxuIiwKLQkJCShkZHItPmNhcHR1cmVfYXR0cmlidXRlcyAmIEVDQ19DQVBUX0FUVFJfVFRZUCkgPj4gRUNDX0NBUFRfQVRUUl9UVFlQX1NISUZUKTsKLQlwcmludGYoIiAgRXJyb3IgSW5mb3JtYXRpb24gVmFsaWQ6ICVkXG5cbiIsCi0JCQlkZHItPmNhcHR1cmVfYXR0cmlidXRlcyAmIEVDQ19DQVBUX0FUVFJfVkxEKTsKLX0KLQotaW50IGRvX2VjYyAoIGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKilDRkdfSU1NUjsKLQl2b2xhdGlsZSBkZHI4M3h4X3QgKmRkciA9ICZpbW1hcC0+ZGRyOwotCXZvbGF0aWxlIHUzMiB2YWw7Ci0JdTY0ICphZGRyLCBjb3VudCwgdmFsNjQ7Ci0JcmVnaXN0ZXIgdTY0ICppOwotCi0JaWYgKGFyZ2MgPiA0KSB7Ci0JCXByaW50ZiAoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7Ci0JCXJldHVybiAxOwotCX0KLQotCWlmIChhcmdjID09IDIpIHsKLQkJaWYgKHN0cmNtcChhcmd2WzFdLCAic3RhdHVzIikgPT0gMCkgewotCQkJZWNjX3ByaW50X3N0YXR1cygpOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJjYXB0dXJlY2xlYXIiKSA9PSAwKSB7Ci0JCQlkZHItPmNhcHR1cmVfYWRkcmVzcyA9IDA7Ci0JCQlkZHItPmNhcHR1cmVfZGF0YV9oaSA9IDA7Ci0JCQlkZHItPmNhcHR1cmVfZGF0YV9sbyA9IDA7Ci0JCQlkZHItPmNhcHR1cmVfZWNjID0gMDsKLQkJCWRkci0+Y2FwdHVyZV9hdHRyaWJ1dGVzID0gMDsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JaWYgKGFyZ2MgPT0gMykgewotCQlpZiAoc3RyY21wKGFyZ3ZbMV0sICJzYmVjbnQiKSA9PSAwKSB7Ci0JCQl2YWwgPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxMCk7Ci0JCQlpZiAodmFsID4gMjU1KSB7Ci0JCQkJcHJpbnRmKCJJbmNvcnJlY3QgQ291bnRlciB2YWx1ZSwgc2hvdWxkIGJlIDAuLjI1NVxuIik7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0KLQkJCXZhbCA9ICh2YWwgPDwgRUNDX0VSUk9SX01BTl9TQkVDX1NISUZUKTsKLQkJCXZhbCB8PSAoZGRyLT5lcnJfc2JlICYgRUNDX0VSUk9SX01BTl9TQkVUKTsKLQotCQkJZGRyLT5lcnJfc2JlID0gdmFsOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJzYmV0aHIiKSA9PSAwKSB7Ci0JCQl2YWwgPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxMCk7Ci0JCQlpZiAodmFsID4gMjU1KSB7Ci0JCQkJcHJpbnRmKCJJbmNvcnJlY3QgQ291bnRlciB2YWx1ZSwgc2hvdWxkIGJlIDAuLjI1NVxuIik7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0KLQkJCXZhbCA9ICh2YWwgPDwgRUNDX0VSUk9SX01BTl9TQkVUX1NISUZUKTsKLQkJCXZhbCB8PSAoZGRyLT5lcnJfc2JlICYgRUNDX0VSUk9SX01BTl9TQkVDKTsKLQotCQkJZGRyLT5lcnJfc2JlID0gdmFsOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJlcnJkaXNhYmxlIikgPT0gMCkgewotCQkJdmFsID0gZGRyLT5lcnJfZGlzYWJsZTsKLQotCQkJaWYgKHN0cmNtcChhcmd2WzJdLCAiK3NiZSIpID09IDApIHsKLQkJCQl2YWwgfD0gRUNDX0VSUk9SX0RJU0FCTEVfU0JFRDsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICIrbWJlIikgPT0gMCkgewotCQkJCXZhbCB8PSBFQ0NfRVJST1JfRElTQUJMRV9NQkVEOwotCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIittc2UiKSA9PSAwKSB7Ci0JCQkJdmFsIHw9IEVDQ19FUlJPUl9ESVNBQkxFX01TRUQ7Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiK2FsbCIpID09IDApIHsKLQkJCQl2YWwgfD0gKEVDQ19FUlJPUl9ESVNBQkxFX1NCRUQgfAotCQkJCQlFQ0NfRVJST1JfRElTQUJMRV9NQkVEIHwKLQkJCQkJRUNDX0VSUk9SX0RJU0FCTEVfTVNFRCk7Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiLXNiZSIpID09IDApIHsKLQkJCQl2YWwgJj0gfkVDQ19FUlJPUl9ESVNBQkxFX1NCRUQ7Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiLW1iZSIpID09IDApIHsKLQkJCQl2YWwgJj0gfkVDQ19FUlJPUl9ESVNBQkxFX01CRUQ7Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiLW1zZSIpID09IDApIHsKLQkJCQl2YWwgJj0gfkVDQ19FUlJPUl9ESVNBQkxFX01TRUQ7Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiLWFsbCIpID09IDApIHsKLQkJCQl2YWwgJj0gfihFQ0NfRVJST1JfRElTQUJMRV9TQkVEIHwKLQkJCQkJRUNDX0VSUk9SX0RJU0FCTEVfTUJFRCB8Ci0JCQkJCUVDQ19FUlJPUl9ESVNBQkxFX01TRUQpOwotCQkJfSBlbHNlIHsKLQkJCQlwcmludGYoIkluY29ycmVjdCBlcnJfZGlzYWJsZSBmaWVsZFxuIik7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0KLQkJCWRkci0+ZXJyX2Rpc2FibGUgPSB2YWw7Ci0JCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiKTsKLQkJCV9fYXNtX18gX192b2xhdGlsZV9fICgiaXN5bmMiKTsKLQkJCXJldHVybiAwOwotCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiZXJyZGV0ZWN0Y2xyIikgPT0gMCkgewotCQkJdmFsID0gZGRyLT5lcnJfZGV0ZWN0OwotCi0JCQlpZiAoc3RyY21wKGFyZ3ZbMl0sICJtbWUiKSA9PSAwKSB7Ci0JCQkJdmFsIHw9IEVDQ19FUlJPUl9ERVRFQ1RfTU1FOwotCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgInNiZSIpID09IDApIHsKLQkJCQl2YWwgfD0gRUNDX0VSUk9SX0RFVEVDVF9TQkU7Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAibWJlIikgPT0gMCkgewotCQkJCXZhbCB8PSBFQ0NfRVJST1JfREVURUNUX01CRTsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICJtc2UiKSA9PSAwKSB7Ci0JCQkJdmFsIHw9IEVDQ19FUlJPUl9ERVRFQ1RfTVNFOwotCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgImFsbCIpID09IDApIHsKLQkJCQl2YWwgfD0gKEVDQ19FUlJPUl9ERVRFQ1RfTU1FIHwKLQkJCQkJRUNDX0VSUk9SX0RFVEVDVF9NQkUgfAotCQkJCQlFQ0NfRVJST1JfREVURUNUX1NCRSB8Ci0JCQkJCUVDQ19FUlJPUl9ERVRFQ1RfTVNFKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJpbnRmKCJJbmNvcnJlY3QgZXJyX2RldGVjdCBmaWVsZFxuIik7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0KLQkJCWRkci0+ZXJyX2RldGVjdCA9IHZhbDsKLQkJCXJldHVybiAwOwotCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiaW5qZWN0ZGF0YWhpIikgPT0gMCkgewotCQkJdmFsID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTYpOwotCi0JCQlkZHItPmRhdGFfZXJyX2luamVjdF9oaSA9IHZhbDsKLQkJCXJldHVybiAwOwotCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiaW5qZWN0ZGF0YWxvIikgPT0gMCkgewotCQkJdmFsID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTYpOwotCi0JCQlkZHItPmRhdGFfZXJyX2luamVjdF9sbyA9IHZhbDsKLQkJCXJldHVybiAwOwotCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiaW5qZWN0ZWNjIikgPT0gMCkgewotCQkJdmFsID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTYpOwotCQkJaWYgKHZhbCA+IDB4ZmYpIHsKLQkJCQlwcmludGYoIkluY29ycmVjdCBFQ0MgaW5qZWN0IG1hc2ssIHNob3VsZCBiZSAweDAwLi4weGZmXG4iKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCXZhbCB8PSAoZGRyLT5lY2NfZXJyX2luamVjdCAmIH5FQ0NfRVJSX0lOSkVDVF9FRUlNKTsKLQotCQkJZGRyLT5lY2NfZXJyX2luamVjdCA9IHZhbDsKLQkJCXJldHVybiAwOwotCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiaW5qZWN0IikgPT0gMCkgewotCQkJdmFsID0gZGRyLT5lY2NfZXJyX2luamVjdDsKLQotCQkJaWYgKHN0cmNtcChhcmd2WzJdLCAiZW4iKSA9PSAwKQotCQkJCXZhbCB8PSBFQ0NfRVJSX0lOSkVDVF9FSUVOOwotCQkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICJkaXMiKSA9PSAwKQotCQkJCXZhbCAmPSB+RUNDX0VSUl9JTkpFQ1RfRUlFTjsKLQkJCWVsc2UKLQkJCQlwcmludGYoIkluY29ycmVjdCBjb21tYW5kXG4iKTsKLQotCQkJZGRyLT5lY2NfZXJyX2luamVjdCA9IHZhbDsKLQkJCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIpOwotCQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJpc3luYyIpOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJtaXJyb3IiKSA9PSAwKSB7Ci0JCQl2YWwgPSBkZHItPmVjY19lcnJfaW5qZWN0OwotCi0JCQlpZiAoc3RyY21wKGFyZ3ZbMl0sICJlbiIpID09IDApCi0JCQkJdmFsIHw9IEVDQ19FUlJfSU5KRUNUX0VNQjsKLQkJCWVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiZGlzIikgPT0gMCkKLQkJCQl2YWwgJj0gfkVDQ19FUlJfSU5KRUNUX0VNQjsKLQkJCWVsc2UKLQkJCQlwcmludGYoIkluY29ycmVjdCBjb21tYW5kXG4iKTsKLQotCQkJZGRyLT5lY2NfZXJyX2luamVjdCA9IHZhbDsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JaWYgKGFyZ2MgPT0gNCkgewotCQlpZiAoc3RyY21wKGFyZ3ZbMV0sICJ0ZXN0IikgPT0gMCkgewotCQkJYWRkciA9ICh1NjQgKilzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxNik7Ci0JCQljb3VudCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDE2KTsKLQotCQkJaWYgKCh1MzIpYWRkciAlIDgpIHsKLQkJCQlwcmludGYoIkFkZHJlc3Mgbm90IGFsbGlnbmVkIG9uIGRvdWJsZSB3b3JkIGJvdW5kYXJ5XG4iKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQotCQkJZGlzYWJsZV9pbnRlcnJ1cHRzKCk7Ci0JCQlpY2FjaGVfZGlzYWJsZSgpOwotCi0JCQlmb3IgKGkgPSBhZGRyOyBpIDwgYWRkciArIGNvdW50OyBpKyspIHsKLQkJCQkvKiBlbmFibGUgaW5qZWN0cyAqLwotCQkJCWRkci0+ZWNjX2Vycl9pbmplY3QgfD0gRUNDX0VSUl9JTkpFQ1RfRUlFTjsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiKTsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImlzeW5jIik7Ci0KLQkJCQkvKiB3cml0ZSBtZW1vcnkgbG9jYXRpb24gaW5qZWN0aW5nIGVycm9ycyAqLwotCQkJCSppID0gMHgxMTIyMzM0NDU1NjY3Nzg4VUxMOwotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIpOwotCi0JCQkJLyogZGlzYWJsZSBpbmplY3RzICovCi0JCQkJZGRyLT5lY2NfZXJyX2luamVjdCAmPSB+RUNDX0VSUl9JTkpFQ1RfRUlFTjsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiKTsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImlzeW5jIik7Ci0KLQkJCQkvKiByZWFkIGRhdGEsIHRoaXMgZ2VuZXJhdGVzIEVDQyBlcnJvciAqLwotCQkJCXZhbDY0ID0gKmk7Ci0JCQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIik7Ci0KLQkJCQkvKiBkaXNhYmxlIGVycm9ycyBmb3IgRUNDICovCi0JCQkJZGRyLT5lcnJfZGlzYWJsZSB8PSB+RUNDX0VSUk9SX0VOQUJMRTsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiKTsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImlzeW5jIik7Ci0KLQkJCQkvKiByZS1pbml0aWFsaXplIG1lbW9yeSwgd3JpdGUgdGhlIGxvY2F0aW9uIGFnYWluCi0JCQkJICogTk9UIGluamVjdGluZyBlcnJvcnMgdGhpcyB0aW1lICovCi0JCQkJKmkgPSAweGNhZmVjYWZlY2FmZWNhZmVVTEw7Ci0JCQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIik7Ci0KLQkJCQkvKiBlbmFibGUgZXJyb3JzIGZvciBFQ0MgKi8KLQkJCQlkZHItPmVycl9kaXNhYmxlICY9IEVDQ19FUlJPUl9FTkFCTEU7Ci0JCQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIik7Ci0JCQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJpc3luYyIpOwotCQkJfQotCi0JCQlpY2FjaGVfZW5hYmxlKCk7Ci0JCQllbmFibGVfaW50ZXJydXB0cygpOwotCi0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXByaW50ZiAoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7Ci0JcmV0dXJuIDE7Ci19Ci0KLVVfQk9PVF9DTUQoCi0JZWNjLCAgICAgNCwgICAgIDAsICAgICAgZG9fZWNjLAotCSJlY2MgICAgIC0gc3VwcG9ydCBmb3IgRERSIEVDQyBmZWF0dXJlc1xuIiwKLQkic3RhdHVzICAgICAgICAgICAgICAtIHByaW50IG91dCBzdGF0dXMgaW5mb1xuIgotCSJlY2MgY2FwdHVyZWNsZWFyICAgICAgICAtIGNsZWFyIGNhcHR1cmUgcmVncyBkYXRhXG4iCi0JImVjYyBzYmVjbnQgPHZhbD4gICAgICAgIC0gc2V0IFNpbmdsZS1CaXQgRXJyb3IgY291bnRlclxuIgotCSJlY2Mgc2JldGhyIDx2YWw+ICAgICAgICAtIHNldCBTaW5nbGUtQml0IFRocmVzaG9sZFxuIgotCSJlY2MgZXJyZGlzYWJsZSA8ZmxhZz4gICAtIGNsZWFyL3NldCBkaXNhYmxlIE1lbW9yeSBFcnJvciBEaXNhYmxlLCBmbGFnOlxuIgotCSIgIFstfCtdc2JlIC0gU2luZ2xlLUJpdCBFcnJvclxuIgotCSIgIFstfCtdbWJlIC0gTXVsdGlwbGUtQml0IEVycm9yXG4iCi0JIiAgWy18K11tc2UgLSBNZW1vcnkgU2VsZWN0IEVycm9yXG4iCi0JIiAgWy18K11hbGwgLSBhbGwgZXJyb3JzXG4iCi0JImVjYyBlcnJkZXRlY3RjbHIgPGZsYWc+IC0gY2xlYXIgTWVtb3J5IEVycm9yIERldGVjdCwgZmxhZzpcbiIKLQkiICBtbWUgLSBNdWx0aXBsZSBNZW1vcnkgRXJyb3JzXG4iCi0JIiAgc2JlIC0gU2luZ2xlLUJpdCBFcnJvclxuIgotCSIgIG1iZSAtIE11bHRpcGxlLUJpdCBFcnJvclxuIgotCSIgIG1zZSAtIE1lbW9yeSBTZWxlY3QgRXJyb3JcbiIKLQkiICBhbGwgLSBhbGwgZXJyb3JzXG4iCi0JImVjYyBpbmplY3RkYXRhaGkgPGhpPiAgLSBzZXQgTWVtb3J5IERhdGEgUGF0aCBFcnJvciBJbmplY3Rpb24gTWFzayBIaWdoXG4iCi0JImVjYyBpbmplY3RkYXRhbG8gPGxvPiAgLSBzZXQgTWVtb3J5IERhdGEgUGF0aCBFcnJvciBJbmplY3Rpb24gTWFzayBMb3dcbiIKLQkiZWNjIGluamVjdGVjYyA8ZWNjPiAgICAtIHNldCBFQ0MgRXJyb3IgSW5qZWN0aW9uIE1hc2tcbiIKLQkiZWNjIGluamVjdCA8ZW58ZGlzPiAgICAtIGVuYWJsZS9kaXNhYmxlIGVycm9yIGluamVjdGlvblxuIgotCSJlY2MgbWlycm9yIDxlbnxkaXM+ICAgIC0gZW5hYmxlL2Rpc2FibGUgbWlycm9yIGJ5dGVcbiIKLQkiZWNjIHRlc3QgPGFkZHI+IDxjbnQ+ICAtIHRlc3QgbWVtIHJlZ2lvbjpcbiIKLQkiICAtIGVuYWJsZXMgaW5qZWN0c1xuIgotCSIgIC0gd3JpdGVzIHBhdHRlcm4gaW5qZWN0aW5nIGVycm9yc1xuIgotCSIgIC0gZGlzYWJsZXMgaW5qZWN0c1xuIgotCSIgIC0gcmVhZHMgcGF0dGVybiBiYWNrLCBnZW5lcmF0ZXMgZXJyb3JcbiIKLQkiICAtIHJlLWluaXRzIG1lbW9yeSIKLSk7Ci0jZW5kaWYgLyogaWYgZGVmaW5lZChDT05GSUdfRERSX0VDQykgJiYgZGVmaW5lZChDT05GSUdfRERSX0VDQ19DTUQpICovCi0KICNpZiBkZWZpbmVkKENPTkZJR19PRl9GTEFUX1RSRUUpICYmIGRlZmluZWQoQ09ORklHX09GX0JPQVJEX1NFVFVQKQogdm9pZAogZnRfYm9hcmRfc2V0dXAodm9pZCAqYmxvYiwgYmRfdCAqYmQpCmRpZmYgLS1naXQgYS9ib2FyZC9tcGM4MzQ5ZW1kcy91LWJvb3QubGRzIGIvYm9hcmQvbXBjODM0OWVtZHMvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM3Yzg3YS4uMDAwMDAwMAotLS0gYS9ib2FyZC9tcGM4MzQ5ZW1kcy91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDYKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4M3h4L3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KLUVOVFJZKF9zdGFydCkKZGlmZiAtLWdpdCBhL2JvYXJkL21wYzgzNDlpdHgvY29uZmlnLm1rIGIvYm9hcmQvbXBjODM0OWl0eC9jb25maWcubWsKaW5kZXggMTkwMWZkYy4uNzlmMTc2NSAxMDA2NDQKLS0tIGEvYm9hcmQvbXBjODM0OWl0eC9jb25maWcubWsKKysrIGIvYm9hcmQvbXBjODM0OWl0eC9jb25maWcubWsKQEAgLTI5LDkgKzI5LDMgQEAKIGlmbmRlZiBURVhUX0JBU0UKIFRFWFRfQkFTRSAgPSAgIDB4RkVGMDAwMDAKIGVuZGlmCi0KLWlmbmVxICgkKE9CSlRSRUUpLCQoU1JDVFJFRSkpCi0jIFdlIGFyZSBidWlsZGluZyB1LWJvb3QgaW4gYSBzZXBhcmF0ZSBkaXJlY3RvcnksIHVzZSBnZW5lcmF0ZWQKLSMgLmxkcyBzY3JpcHQgZnJvbSBPQkpUUkVFIGRpcmVjdG9yeS4KLUxEU0NSSVBUIDo9ICQoT0JKVFJFRSkvYm9hcmQvJChCT0FSRERJUikvdS1ib290LmxkcwotZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL21wYzgzNDlpdHgvdS1ib290LmxkcyBiL2JvYXJkL21wYzgzNDlpdHgvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA0NGMwZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9tcGM4MzQ5aXR4L3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gMjAwNi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgzeHgvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KLUVOVFJZKF9zdGFydCkKZGlmZiAtLWdpdCBhL2JvYXJkL21wYzgzNjBlbWRzL21wYzgzNjBlbWRzLmMgYi9ib2FyZC9tcGM4MzYwZW1kcy9tcGM4MzYwZW1kcy5jCmluZGV4IDU2MmViOGIuLjNmYTA5M2QgMTAwNjQ0Ci0tLSBhL2JvYXJkL21wYzgzNjBlbWRzL21wYzgzNjBlbWRzLmMKKysrIGIvYm9hcmQvbXBjODM2MGVtZHMvbXBjODM2MGVtZHMuYwpAQCAtMSw4ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KLSAqCiAgKiBEYXZlIExpdSA8ZGF2ZWxpdUBmcmVlc2NhbGUuY29tPgotICogYmFzZWQgb24gYm9hcmQvbXBjODM0OWVtZHMvbXBjODM0OWVtZHMuYwogICoKICAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAgKiBwcm9qZWN0LgpAQCAtMTksNyArMTcsNiBAQAogI2luY2x1ZGUgPGkyYy5oPgogI2luY2x1ZGUgPHNwZC5oPgogI2luY2x1ZGUgPG1paXBoeS5oPgotI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCiAjaW5jbHVkZSA8cGNpLmg+CiAjZW5kaWYKQEAgLTMwLDggKzI3LDcgQEAKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX09GX0ZMQVRfVFJFRSkKICNpbmNsdWRlIDxmdF9idWlsZC5oPgotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfT0ZfTElCRkRUKQorI2VsaWYgZGVmaW5lZChDT05GSUdfT0ZfTElCRkRUKQogI2luY2x1ZGUgPGxpYmZkdC5oPgogI2luY2x1ZGUgPGxpYmZkdF9lbnYuaD4KICNlbmRpZgpAQCAtMTAzLDcgKzk5LDkgQEAKIAogCS8qIERpc2FibGUgRzFUWENMSywgRzJUWENMSyBoL3cgYnVmZmVycyAocmV2LjIgaC93IGJ1ZyB3b3JrYXJvdW5kKSAqLwogCWlmIChpbW1yLT5zeXNjb25mLnNwcmlkciA9PSBTUFJfODM2MF9SRVYyMCB8fAotCSAgICBpbW1yLT5zeXNjb25mLnNwcmlkciA9PSBTUFJfODM2MEVfUkVWMjApCisJICAgIGltbXItPnN5c2NvbmYuc3ByaWRyID09IFNQUl84MzYwRV9SRVYyMCB8fAorCSAgICBpbW1yLT5zeXNjb25mLnNwcmlkciA9PSBTUFJfODM2MF9SRVYyMSB8fAorCSAgICBpbW1yLT5zeXNjb25mLnNwcmlkciA9PSBTUFJfODM2MEVfUkVWMjEpCiAJCWJjc3JbMHhlXSA9IDB4MzA7CiAKIAlyZXR1cm4gMDsKQEAgLTI4NywzODEgKzI4NSw2IEBACiB9CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0REUl9FQ0MpICYmIGRlZmluZWQoQ09ORklHX0REUl9FQ0NfQ01EKQotLyoKLSAqIEVDQyB1c2VyIGNvbW1hbmRzCi0gKi8KLXZvaWQgZWNjX3ByaW50X3N0YXR1cyh2b2lkKQotewotCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7Ci0Jdm9sYXRpbGUgZGRyODN4eF90ICpkZHIgPSAmaW1tYXAtPmRkcjsKLQotCXByaW50ZigiXG5FQ0MgbW9kZTogJXNcblxuIiwKLQkgICAgICAgKGRkci0+c2RyYW1fY2ZnICYgU0RSQU1fQ0ZHX0VDQ19FTikgPyAiT04iIDogIk9GRiIpOwotCi0JLyogSW50ZXJydXB0cyAqLwotCXByaW50ZigiTWVtb3J5IEVycm9yIEludGVycnVwdCBFbmFibGU6XG4iKTsKLQlwcmludGYoIiAgTXVsdGlwbGUtQml0IEVycm9yIEludGVycnVwdCBFbmFibGU6ICVkXG4iLAotCSAgICAgICAoZGRyLT5lcnJfaW50X2VuICYgRUNDX0VSUl9JTlRfRU5fTUJFRSkgPyAxIDogMCk7Ci0JcHJpbnRmKCIgIFNpbmdsZS1CaXQgRXJyb3IgSW50ZXJydXB0IEVuYWJsZTogJWRcbiIsCi0JICAgICAgIChkZHItPmVycl9pbnRfZW4gJiBFQ0NfRVJSX0lOVF9FTl9TQkVFKSA/IDEgOiAwKTsKLQlwcmludGYoIiAgTWVtb3J5IFNlbGVjdCBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlOiAlZFxuXG4iLAotCSAgICAgICAoZGRyLT5lcnJfaW50X2VuICYgRUNDX0VSUl9JTlRfRU5fTVNFRSkgPyAxIDogMCk7Ci0KLQkvKiBFcnJvciBkaXNhYmxlICovCi0JcHJpbnRmKCJNZW1vcnkgRXJyb3IgRGlzYWJsZTpcbiIpOwotCXByaW50ZigiICBNdWx0aXBsZS1CaXQgRXJyb3IgRGlzYWJsZTogJWRcbiIsCi0JICAgICAgIChkZHItPmVycl9kaXNhYmxlICYgRUNDX0VSUk9SX0RJU0FCTEVfTUJFRCkgPyAxIDogMCk7Ci0JcHJpbnRmKCIgIFNpbmxlLUJpdCBFcnJvciBEaXNhYmxlOiAlZFxuIiwKLQkgICAgICAgKGRkci0+ZXJyX2Rpc2FibGUgJiBFQ0NfRVJST1JfRElTQUJMRV9TQkVEKSA/IDEgOiAwKTsKLQlwcmludGYoIiAgTWVtb3J5IFNlbGVjdCBFcnJvciBEaXNhYmxlOiAlZFxuXG4iLAotCSAgICAgICAoZGRyLT5lcnJfZGlzYWJsZSAmIEVDQ19FUlJPUl9ESVNBQkxFX01TRUQpID8gMSA6IDApOwotCi0JLyogRXJyb3IgaW5qZWN0aW9uICovCi0JcHJpbnRmKCJNZW1vcnkgRGF0YSBQYXRoIEVycm9yIEluamVjdGlvbiBNYXNrIEhpZ2gvTG93OiAlMDhseCAlMDhseFxuIiwKLQkgICAgICAgZGRyLT5kYXRhX2Vycl9pbmplY3RfaGksIGRkci0+ZGF0YV9lcnJfaW5qZWN0X2xvKTsKLQotCXByaW50ZigiTWVtb3J5IERhdGEgUGF0aCBFcnJvciBJbmplY3Rpb24gTWFzayBFQ0M6XG4iKTsKLQlwcmludGYoIiAgRUNDIE1pcnJvciBCeXRlOiAlZFxuIiwKLQkgICAgICAgKGRkci0+ZWNjX2Vycl9pbmplY3QgJiBFQ0NfRVJSX0lOSkVDVF9FTUIpID8gMSA6IDApOwotCXByaW50ZigiICBFQ0MgSW5qZWN0aW9uIEVuYWJsZTogJWRcbiIsCi0JICAgICAgIChkZHItPmVjY19lcnJfaW5qZWN0ICYgRUNDX0VSUl9JTkpFQ1RfRUlFTikgPyAxIDogMCk7Ci0JcHJpbnRmKCIgIEVDQyBFcnJvciBJbmplY3Rpb24gTWFzazogMHglMDJ4XG5cbiIsCi0JICAgICAgIGRkci0+ZWNjX2Vycl9pbmplY3QgJiBFQ0NfRVJSX0lOSkVDVF9FRUlNKTsKLQotCS8qIFNCRSBjb3VudGVyL3RocmVzaG9sZCAqLwotCXByaW50ZigiTWVtb3J5IFNpbmdsZS1CaXQgRXJyb3IgTWFuYWdlbWVudCAoMC4uMjU1KTpcbiIpOwotCXByaW50ZigiICBTaW5nbGUtQml0IEVycm9yIFRocmVzaG9sZDogJWRcbiIsCi0JICAgICAgIChkZHItPmVycl9zYmUgJiBFQ0NfRVJST1JfTUFOX1NCRVQpID4+IEVDQ19FUlJPUl9NQU5fU0JFVF9TSElGVCk7Ci0JcHJpbnRmKCIgIFNpbmdsZS1CaXQgRXJyb3IgQ291bnRlcjogJWRcblxuIiwKLQkgICAgICAgKGRkci0+ZXJyX3NiZSAmIEVDQ19FUlJPUl9NQU5fU0JFQykgPj4gRUNDX0VSUk9SX01BTl9TQkVDX1NISUZUKTsKLQotCS8qIEVycm9yIGRldGVjdCAqLwotCXByaW50ZigiTWVtb3J5IEVycm9yIERldGVjdDpcbiIpOwotCXByaW50ZigiICBNdWx0aXBsZSBNZW1vcnkgRXJyb3JzOiAlZFxuIiwKLQkgICAgICAgKGRkci0+ZXJyX2RldGVjdCAmIEVDQ19FUlJPUl9ERVRFQ1RfTU1FKSA/IDEgOiAwKTsKLQlwcmludGYoIiAgTXVsdGlwbGUtQml0IEVycm9yOiAlZFxuIiwKLQkgICAgICAgKGRkci0+ZXJyX2RldGVjdCAmIEVDQ19FUlJPUl9ERVRFQ1RfTUJFKSA/IDEgOiAwKTsKLQlwcmludGYoIiAgU2luZ2xlLUJpdCBFcnJvcjogJWRcbiIsCi0JICAgICAgIChkZHItPmVycl9kZXRlY3QgJiBFQ0NfRVJST1JfREVURUNUX1NCRSkgPyAxIDogMCk7Ci0JcHJpbnRmKCIgIE1lbW9yeSBTZWxlY3QgRXJyb3I6ICVkXG5cbiIsCi0JICAgICAgIChkZHItPmVycl9kZXRlY3QgJiBFQ0NfRVJST1JfREVURUNUX01TRSkgPyAxIDogMCk7Ci0KLQkvKiBDYXB0dXJlIGRhdGEgKi8KLQlwcmludGYoIk1lbW9yeSBFcnJvciBBZGRyZXNzIENhcHR1cmU6IDB4JTA4bHhcbiIsIGRkci0+Y2FwdHVyZV9hZGRyZXNzKTsKLQlwcmludGYoIk1lbW9yeSBEYXRhIFBhdGggUmVhZCBDYXB0dXJlIEhpZ2gvTG93OiAlMDhseCAlMDhseFxuIiwKLQkgICAgICAgZGRyLT5jYXB0dXJlX2RhdGFfaGksIGRkci0+Y2FwdHVyZV9kYXRhX2xvKTsKLQlwcmludGYoIk1lbW9yeSBEYXRhIFBhdGggUmVhZCBDYXB0dXJlIEVDQzogMHglMDJ4XG5cbiIsCi0JICAgICAgIGRkci0+Y2FwdHVyZV9lY2MgJiBDQVBUVVJFX0VDQ19FQ0UpOwotCi0JcHJpbnRmKCJNZW1vcnkgRXJyb3IgQXR0cmlidXRlcyBDYXB0dXJlOlxuIik7Ci0JcHJpbnRmKCIgRGF0YSBCZWF0IE51bWJlcjogJWRcbiIsCi0JICAgICAgIChkZHItPmNhcHR1cmVfYXR0cmlidXRlcyAmIEVDQ19DQVBUX0FUVFJfQk5VTSkgPj4KLQkgICAgICAgRUNDX0NBUFRfQVRUUl9CTlVNX1NISUZUKTsKLQlwcmludGYoIiAgVHJhbnNhY3Rpb24gU2l6ZTogJWRcbiIsCi0JICAgICAgIChkZHItPmNhcHR1cmVfYXR0cmlidXRlcyAmIEVDQ19DQVBUX0FUVFJfVFNJWikgPj4KLQkgICAgICAgRUNDX0NBUFRfQVRUUl9UU0laX1NISUZUKTsKLQlwcmludGYoIiAgVHJhbnNhY3Rpb24gU291cmNlOiAlZFxuIiwKLQkgICAgICAgKGRkci0+Y2FwdHVyZV9hdHRyaWJ1dGVzICYgRUNDX0NBUFRfQVRUUl9UU1JDKSA+PgotCSAgICAgICBFQ0NfQ0FQVF9BVFRSX1RTUkNfU0hJRlQpOwotCXByaW50ZigiICBUcmFuc2FjdGlvbiBUeXBlOiAlZFxuIiwKLQkgICAgICAgKGRkci0+Y2FwdHVyZV9hdHRyaWJ1dGVzICYgRUNDX0NBUFRfQVRUUl9UVFlQKSA+PgotCSAgICAgICBFQ0NfQ0FQVF9BVFRSX1RUWVBfU0hJRlQpOwotCXByaW50ZigiICBFcnJvciBJbmZvcm1hdGlvbiBWYWxpZDogJWRcblxuIiwKLQkgICAgICAgZGRyLT5jYXB0dXJlX2F0dHJpYnV0ZXMgJiBFQ0NfQ0FQVF9BVFRSX1ZMRCk7Ci19Ci0KLWludCBkb19lY2MoY21kX3RibF90ICogY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7Ci0Jdm9sYXRpbGUgZGRyODN4eF90ICpkZHIgPSAmaW1tYXAtPmRkcjsKLQl2b2xhdGlsZSB1MzIgdmFsOwotCXU2NCAqYWRkcjsKLQl1MzIgY291bnQ7Ci0JcmVnaXN0ZXIgdTY0ICppOwotCXUzMiByZXRbMl07Ci0JdTMyIHBhdHRlcm5bMl07Ci0JdTMyIHdyaXRlYmFja1syXTsKLQotCS8qIFRoZSBwYXR0ZXJuIGlzIHdyaXR0ZW4gaW50byBtZW1vcnkgdG8gZ2VuZXJhdGUgZXJyb3IgKi8KLQlwYXR0ZXJuWzBdID0gMHhmZWRjYmE5OFVMOwotCXBhdHRlcm5bMV0gPSAweDc2NTQzMjEwVUw7Ci0KLQkvKiBBZnRlciBpbmplY3RpbmcgZXJyb3IsIHJlLWluaXRpYWxpemUgdGhlIG1lbW9yeSB3aXRoIHRoZSB2YWx1ZSAqLwotCXdyaXRlYmFja1swXSA9IDB4MDEyMzQ1NjdVTDsKLQl3cml0ZWJhY2tbMV0gPSAweDg5YWJjZGVmVUw7Ci0KLQlpZiAoYXJnYyA+IDQpIHsKLQkJcHJpbnRmKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlpZiAoYXJnYyA9PSAyKSB7Ci0JCWlmIChzdHJjbXAoYXJndlsxXSwgInN0YXR1cyIpID09IDApIHsKLQkJCWVjY19wcmludF9zdGF0dXMoKTsKLQkJCXJldHVybiAwOwotCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiY2FwdHVyZWNsZWFyIikgPT0gMCkgewotCQkJZGRyLT5jYXB0dXJlX2FkZHJlc3MgPSAwOwotCQkJZGRyLT5jYXB0dXJlX2RhdGFfaGkgPSAwOwotCQkJZGRyLT5jYXB0dXJlX2RhdGFfbG8gPSAwOwotCQkJZGRyLT5jYXB0dXJlX2VjYyA9IDA7Ci0JCQlkZHItPmNhcHR1cmVfYXR0cmlidXRlcyA9IDA7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlpZiAoYXJnYyA9PSAzKSB7Ci0JCWlmIChzdHJjbXAoYXJndlsxXSwgInNiZWNudCIpID09IDApIHsKLQkJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDEwKTsKLQkJCWlmICh2YWwgPiAyNTUpIHsKLQkJCQlwcmludGYoIkluY29ycmVjdCBDb3VudGVyIHZhbHVlLCAiCi0JCQkJICAgICAgICJzaG91bGQgYmUgMC4uMjU1XG4iKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQotCQkJdmFsID0gKHZhbCA8PCBFQ0NfRVJST1JfTUFOX1NCRUNfU0hJRlQpOwotCQkJdmFsIHw9IChkZHItPmVycl9zYmUgJiBFQ0NfRVJST1JfTUFOX1NCRVQpOwotCi0JCQlkZHItPmVycl9zYmUgPSB2YWw7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgInNiZXRociIpID09IDApIHsKLQkJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDEwKTsKLQkJCWlmICh2YWwgPiAyNTUpIHsKLQkJCQlwcmludGYoIkluY29ycmVjdCBDb3VudGVyIHZhbHVlLCAiCi0JCQkJICAgICAgICJzaG91bGQgYmUgMC4uMjU1XG4iKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQotCQkJdmFsID0gKHZhbCA8PCBFQ0NfRVJST1JfTUFOX1NCRVRfU0hJRlQpOwotCQkJdmFsIHw9IChkZHItPmVycl9zYmUgJiBFQ0NfRVJST1JfTUFOX1NCRUMpOwotCi0JCQlkZHItPmVycl9zYmUgPSB2YWw7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImVycmRpc2FibGUiKSA9PSAwKSB7Ci0JCQl2YWwgPSBkZHItPmVycl9kaXNhYmxlOwotCi0JCQlpZiAoc3RyY21wKGFyZ3ZbMl0sICIrc2JlIikgPT0gMCkgewotCQkJCXZhbCB8PSBFQ0NfRVJST1JfRElTQUJMRV9TQkVEOwotCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIittYmUiKSA9PSAwKSB7Ci0JCQkJdmFsIHw9IEVDQ19FUlJPUl9ESVNBQkxFX01CRUQ7Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiK21zZSIpID09IDApIHsKLQkJCQl2YWwgfD0gRUNDX0VSUk9SX0RJU0FCTEVfTVNFRDsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICIrYWxsIikgPT0gMCkgewotCQkJCXZhbCB8PSAoRUNDX0VSUk9SX0RJU0FCTEVfU0JFRCB8Ci0JCQkJCUVDQ19FUlJPUl9ESVNBQkxFX01CRUQgfAotCQkJCQlFQ0NfRVJST1JfRElTQUJMRV9NU0VEKTsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICItc2JlIikgPT0gMCkgewotCQkJCXZhbCAmPSB+RUNDX0VSUk9SX0RJU0FCTEVfU0JFRDsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICItbWJlIikgPT0gMCkgewotCQkJCXZhbCAmPSB+RUNDX0VSUk9SX0RJU0FCTEVfTUJFRDsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICItbXNlIikgPT0gMCkgewotCQkJCXZhbCAmPSB+RUNDX0VSUk9SX0RJU0FCTEVfTVNFRDsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICItYWxsIikgPT0gMCkgewotCQkJCXZhbCAmPSB+KEVDQ19FUlJPUl9ESVNBQkxFX1NCRUQgfAotCQkJCQkgRUNDX0VSUk9SX0RJU0FCTEVfTUJFRCB8Ci0JCQkJCSBFQ0NfRVJST1JfRElTQUJMRV9NU0VEKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJpbnRmKCJJbmNvcnJlY3QgZXJyX2Rpc2FibGUgZmllbGRcbiIpOwotCQkJCXJldHVybiAxOwotCQkJfQotCi0JCQlkZHItPmVycl9kaXNhYmxlID0gdmFsOwotCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsKLQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJpc3luYyIpOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJlcnJkZXRlY3RjbHIiKSA9PSAwKSB7Ci0JCQl2YWwgPSBkZHItPmVycl9kZXRlY3Q7Ci0KLQkJCWlmIChzdHJjbXAoYXJndlsyXSwgIm1tZSIpID09IDApIHsKLQkJCQl2YWwgfD0gRUNDX0VSUk9SX0RFVEVDVF9NTUU7Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAic2JlIikgPT0gMCkgewotCQkJCXZhbCB8PSBFQ0NfRVJST1JfREVURUNUX1NCRTsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICJtYmUiKSA9PSAwKSB7Ci0JCQkJdmFsIHw9IEVDQ19FUlJPUl9ERVRFQ1RfTUJFOwotCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIm1zZSIpID09IDApIHsKLQkJCQl2YWwgfD0gRUNDX0VSUk9SX0RFVEVDVF9NU0U7Ci0JCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiYWxsIikgPT0gMCkgewotCQkJCXZhbCB8PSAoRUNDX0VSUk9SX0RFVEVDVF9NTUUgfAotCQkJCQlFQ0NfRVJST1JfREVURUNUX01CRSB8Ci0JCQkJCUVDQ19FUlJPUl9ERVRFQ1RfU0JFIHwKLQkJCQkJRUNDX0VSUk9SX0RFVEVDVF9NU0UpOwotCQkJfSBlbHNlIHsKLQkJCQlwcmludGYoIkluY29ycmVjdCBlcnJfZGV0ZWN0IGZpZWxkXG4iKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQotCQkJZGRyLT5lcnJfZGV0ZWN0ID0gdmFsOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJpbmplY3RkYXRhaGkiKSA9PSAwKSB7Ci0JCQl2YWwgPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxNik7Ci0KLQkJCWRkci0+ZGF0YV9lcnJfaW5qZWN0X2hpID0gdmFsOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJpbmplY3RkYXRhbG8iKSA9PSAwKSB7Ci0JCQl2YWwgPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxNik7Ci0KLQkJCWRkci0+ZGF0YV9lcnJfaW5qZWN0X2xvID0gdmFsOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJpbmplY3RlY2MiKSA9PSAwKSB7Ci0JCQl2YWwgPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxNik7Ci0JCQlpZiAodmFsID4gMHhmZikgewotCQkJCXByaW50ZigiSW5jb3JyZWN0IEVDQyBpbmplY3QgbWFzaywgIgotCQkJCSAgICAgICAic2hvdWxkIGJlIDB4MDAuLjB4ZmZcbiIpOwotCQkJCXJldHVybiAxOwotCQkJfQotCQkJdmFsIHw9IChkZHItPmVjY19lcnJfaW5qZWN0ICYgfkVDQ19FUlJfSU5KRUNUX0VFSU0pOwotCi0JCQlkZHItPmVjY19lcnJfaW5qZWN0ID0gdmFsOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJpbmplY3QiKSA9PSAwKSB7Ci0JCQl2YWwgPSBkZHItPmVjY19lcnJfaW5qZWN0OwotCi0JCQlpZiAoc3RyY21wKGFyZ3ZbMl0sICJlbiIpID09IDApCi0JCQkJdmFsIHw9IEVDQ19FUlJfSU5KRUNUX0VJRU47Ci0JCQllbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgImRpcyIpID09IDApCi0JCQkJdmFsICY9IH5FQ0NfRVJSX0lOSkVDVF9FSUVOOwotCQkJZWxzZQotCQkJCXByaW50ZigiSW5jb3JyZWN0IGNvbW1hbmRcbiIpOwotCi0JCQlkZHItPmVjY19lcnJfaW5qZWN0ID0gdmFsOwotCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsKLQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJpc3luYyIpOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJtaXJyb3IiKSA9PSAwKSB7Ci0JCQl2YWwgPSBkZHItPmVjY19lcnJfaW5qZWN0OwotCi0JCQlpZiAoc3RyY21wKGFyZ3ZbMl0sICJlbiIpID09IDApCi0JCQkJdmFsIHw9IEVDQ19FUlJfSU5KRUNUX0VNQjsKLQkJCWVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiZGlzIikgPT0gMCkKLQkJCQl2YWwgJj0gfkVDQ19FUlJfSU5KRUNUX0VNQjsKLQkJCWVsc2UKLQkJCQlwcmludGYoIkluY29ycmVjdCBjb21tYW5kXG4iKTsKLQotCQkJZGRyLT5lY2NfZXJyX2luamVjdCA9IHZhbDsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCWlmIChhcmdjID09IDQpIHsKLQkJaWYgKHN0cmNtcChhcmd2WzFdLCAidGVzdGR3IikgPT0gMCkgewotCQkJYWRkciA9ICh1NjQgKikgc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTYpOwotCQkJY291bnQgPSBzaW1wbGVfc3RydG91bChhcmd2WzNdLCBOVUxMLCAxNik7Ci0KLQkJCWlmICgodTMyKSBhZGRyICUgOCkgewotCQkJCXByaW50ZigiQWRkcmVzcyBub3QgYWxsaWduZWQgb24gIgotCQkJCSAgICAgICAiZG91YmxlIHdvcmQgYm91bmRhcnlcbiIpOwotCQkJCXJldHVybiAxOwotCQkJfQotCQkJZGlzYWJsZV9pbnRlcnJ1cHRzKCk7Ci0KLQkJCWZvciAoaSA9IGFkZHI7IGkgPCBhZGRyICsgY291bnQ7IGkrKykgewotCi0JCQkJLyogZW5hYmxlIGluamVjdHMgKi8KLQkJCQlkZHItPmVjY19lcnJfaW5qZWN0IHw9IEVDQ19FUlJfSU5KRUNUX0VJRU47Ci0JCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiaXN5bmMiKTsKLQotCQkJCS8qIHdyaXRlIG1lbW9yeSBsb2NhdGlvbiBpbmplY3RpbmcgZXJyb3JzICovCi0JCQkJcHBjRFdzdG9yZSgodTMyICopIGksIHBhdHRlcm4pOwotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7Ci0KLQkJCQkvKiBkaXNhYmxlIGluamVjdHMgKi8KLQkJCQlkZHItPmVjY19lcnJfaW5qZWN0ICY9IH5FQ0NfRVJSX0lOSkVDVF9FSUVOOwotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7Ci0JCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImlzeW5jIik7Ci0KLQkJCQkvKiByZWFkIGRhdGEsIHRoaXMgZ2VuZXJhdGVzIEVDQyBlcnJvciAqLwotCQkJCXBwY0RXbG9hZCgodTMyICopIGksIHJldCk7Ci0JCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsKLQotCQkJCS8qIHJlLWluaXRpYWxpemUgbWVtb3J5LCBkb3VibGUgd29yZCB3cml0ZSB0aGUgbG9jYXRpb24gYWdhaW4sCi0JCQkJICogZ2VuZXJhdGVzIG5ldyBFQ0MgY29kZSB0aGlzIHRpbWUgKi8KLQkJCQlwcGNEV3N0b3JlKCh1MzIgKikgaSwgd3JpdGViYWNrKTsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOwotCQkJfQotCQkJZW5hYmxlX2ludGVycnVwdHMoKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWlmIChzdHJjbXAoYXJndlsxXSwgInRlc3R3b3JkIikgPT0gMCkgewotCQkJYWRkciA9ICh1NjQgKikgc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTYpOwotCQkJY291bnQgPSBzaW1wbGVfc3RydG91bChhcmd2WzNdLCBOVUxMLCAxNik7Ci0KLQkJCWlmICgodTMyKSBhZGRyICUgOCkgewotCQkJCXByaW50ZigiQWRkcmVzcyBub3QgYWxsaWduZWQgb24gIgotCQkJCSAgICAgICAiZG91YmxlIHdvcmQgYm91bmRhcnlcbiIpOwotCQkJCXJldHVybiAxOwotCQkJfQotCQkJZGlzYWJsZV9pbnRlcnJ1cHRzKCk7Ci0KLQkJCWZvciAoaSA9IGFkZHI7IGkgPCBhZGRyICsgY291bnQ7IGkrKykgewotCi0JCQkJLyogZW5hYmxlIGluamVjdHMgKi8KLQkJCQlkZHItPmVjY19lcnJfaW5qZWN0IHw9IEVDQ19FUlJfSU5KRUNUX0VJRU47Ci0JCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiaXN5bmMiKTsKLQotCQkJCS8qIHdyaXRlIG1lbW9yeSBsb2NhdGlvbiBpbmplY3RpbmcgZXJyb3JzICovCi0JCQkJKih1MzIgKikgaSA9IDB4ZmVkY2JhOThVTDsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOwotCi0JCQkJLyogc3ViIGRvdWJsZSB3b3JkIHdyaXRlLAotCQkJCSAqIGJ1cyB3aWxsIHJlYWQtbW9kaWZ5LXdyaXRlLAotCQkJCSAqIGdlbmVyYXRlcyBFQ0MgZXJyb3IgKi8KLQkJCQkqKCh1MzIgKikgaSArIDEpID0gMHg3NjU0MzIxMFVMOwotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7Ci0KLQkJCQkvKiBkaXNhYmxlIGluamVjdHMgKi8KLQkJCQlkZHItPmVjY19lcnJfaW5qZWN0ICY9IH5FQ0NfRVJSX0lOSkVDVF9FSUVOOwotCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7Ci0JCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImlzeW5jIik7Ci0KLQkJCQkvKiByZS1pbml0aWFsaXplIG1lbW9yeSwKLQkJCQkgKiBkb3VibGUgd29yZCB3cml0ZSB0aGUgbG9jYXRpb24gYWdhaW4sCi0JCQkJICogZ2VuZXJhdGVzIG5ldyBFQ0MgY29kZSB0aGlzIHRpbWUgKi8KLQkJCQlwcGNEV3N0b3JlKCh1MzIgKikgaSwgd3JpdGViYWNrKTsKLQkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOwotCQkJfQotCQkJZW5hYmxlX2ludGVycnVwdHMoKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCXByaW50ZigiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKLQlyZXR1cm4gMTsKLX0KLQotVV9CT09UX0NNRChlY2MsIDQsIDAsIGRvX2VjYywKLQkgICAiZWNjICAgICAtIHN1cHBvcnQgZm9yIEREUiBFQ0MgZmVhdHVyZXNcbiIsCi0JICAgInN0YXR1cyAgICAgICAgICAgICAgLSBwcmludCBvdXQgc3RhdHVzIGluZm9cbiIKLQkgICAiZWNjIGNhcHR1cmVjbGVhciAgICAgICAgLSBjbGVhciBjYXB0dXJlIHJlZ3MgZGF0YVxuIgotCSAgICJlY2Mgc2JlY250IDx2YWw+ICAgICAgICAtIHNldCBTaW5nbGUtQml0IEVycm9yIGNvdW50ZXJcbiIKLQkgICAiZWNjIHNiZXRociA8dmFsPiAgICAgICAgLSBzZXQgU2luZ2xlLUJpdCBUaHJlc2hvbGRcbiIKLQkgICAiZWNjIGVycmRpc2FibGUgPGZsYWc+ICAgLSBjbGVhci9zZXQgZGlzYWJsZSBNZW1vcnkgRXJyb3IgRGlzYWJsZSwgZmxhZzpcbiIKLQkgICAiICBbLXwrXXNiZSAtIFNpbmdsZS1CaXQgRXJyb3JcbiIKLQkgICAiICBbLXwrXW1iZSAtIE11bHRpcGxlLUJpdCBFcnJvclxuIgotCSAgICIgIFstfCtdbXNlIC0gTWVtb3J5IFNlbGVjdCBFcnJvclxuIgotCSAgICIgIFstfCtdYWxsIC0gYWxsIGVycm9yc1xuIgotCSAgICJlY2MgZXJyZGV0ZWN0Y2xyIDxmbGFnPiAtIGNsZWFyIE1lbW9yeSBFcnJvciBEZXRlY3QsIGZsYWc6XG4iCi0JICAgIiAgbW1lIC0gTXVsdGlwbGUgTWVtb3J5IEVycm9yc1xuIgotCSAgICIgIHNiZSAtIFNpbmdsZS1CaXQgRXJyb3JcbiIKLQkgICAiICBtYmUgLSBNdWx0aXBsZS1CaXQgRXJyb3JcbiIKLQkgICAiICBtc2UgLSBNZW1vcnkgU2VsZWN0IEVycm9yXG4iCi0JICAgIiAgYWxsIC0gYWxsIGVycm9yc1xuIgotCSAgICJlY2MgaW5qZWN0ZGF0YWhpIDxoaT4gIC0gc2V0IE1lbW9yeSBEYXRhIFBhdGggRXJyb3IgSW5qZWN0aW9uIE1hc2sgSGlnaFxuIgotCSAgICJlY2MgaW5qZWN0ZGF0YWxvIDxsbz4gIC0gc2V0IE1lbW9yeSBEYXRhIFBhdGggRXJyb3IgSW5qZWN0aW9uIE1hc2sgTG93XG4iCi0JICAgImVjYyBpbmplY3RlY2MgPGVjYz4gICAgLSBzZXQgRUNDIEVycm9yIEluamVjdGlvbiBNYXNrXG4iCi0JICAgImVjYyBpbmplY3QgPGVufGRpcz4gICAgLSBlbmFibGUvZGlzYWJsZSBlcnJvciBpbmplY3Rpb25cbiIKLQkgICAiZWNjIG1pcnJvciA8ZW58ZGlzPiAgICAtIGVuYWJsZS9kaXNhYmxlIG1pcnJvciBieXRlXG4iCi0JICAgImVjYyB0ZXN0ZHcgPGFkZHI+IDxjbnQ+ICAtIHRlc3QgbWVtIHJlZ2lvbiB3aXRoIGRvdWJsZSB3b3JkIGFjY2VzczpcbiIKLQkgICAiICAtIGVuYWJsZXMgaW5qZWN0c1xuIgotCSAgICIgIC0gd3JpdGVzIHBhdHRlcm4gaW5qZWN0aW5nIGVycm9ycyB3aXRoIGRvdWJsZSB3b3JkIGFjY2Vzc1xuIgotCSAgICIgIC0gZGlzYWJsZXMgaW5qZWN0c1xuIgotCSAgICIgIC0gcmVhZHMgcGF0dGVybiBiYWNrIHdpdGggZG91YmxlIHdvcmQgYWNjZXNzLCBnZW5lcmF0ZXMgZXJyb3JcbiIKLQkgICAiICAtIHJlLWluaXRzIG1lbW9yeVxuIgotCSAgICJlY2MgdGVzdHdvcmQgPGFkZHI+IDxjbnQ+ICAtIHRlc3QgbWVtIHJlZ2lvbiB3aXRoIHdvcmQgYWNjZXNzOlxuIgotCSAgICIgIC0gZW5hYmxlcyBpbmplY3RzXG4iCi0JICAgIiAgLSB3cml0ZXMgcGF0dGVybiBpbmplY3RpbmcgZXJyb3JzIHdpdGggd29yZCBhY2Nlc3NcbiIKLQkgICAiICAtIHdyaXRlcyBwYXR0ZXJuIHdpdGggd29yZCBhY2Nlc3MsIGdlbmVyYXRlcyBlcnJvclxuIgotCSAgICIgIC0gZGlzYWJsZXMgaW5qZWN0c1xuIiAiICAtIHJlLWluaXRzIG1lbW9yeSIpOwotI2VuZGlmCQkJCS8qIGlmIGRlZmluZWQoQ09ORklHX0REUl9FQ0MpICYmIGRlZmluZWQoQ09ORklHX0REUl9FQ0NfQ01EKSAqLwotCiAjaWYgKGRlZmluZWQoQ09ORklHX09GX0ZMQVRfVFJFRSkgfHwgZGVmaW5lZChDT05GSUdfT0ZfTElCRkRUKSkgXAogICAgICAmJiBkZWZpbmVkKENPTkZJR19PRl9CT0FSRF9TRVRVUCkKIApAQCAtNjgxLDExICszMDQsMTEgQEAKIAlpbnQgbm9kZW9mZnNldDsKIAlpbnQgdG1wWzJdOwogCi0Jbm9kZW9mZnNldCA9IGZkdF9wYXRoX29mZnNldCAoZmR0LCAiL21lbW9yeSIpOworCW5vZGVvZmZzZXQgPSBmZHRfZmluZF9ub2RlX2J5X3BhdGgoYmxvYiwgIi9tZW1vcnkiKTsKIAlpZiAobm9kZW9mZnNldCA+PSAwKSB7CiAJCXRtcFswXSA9IGNwdV90b19iZTMyKGJkLT5iaV9tZW1zdGFydCk7CiAJCXRtcFsxXSA9IGNwdV90b19iZTMyKGJkLT5iaV9tZW1zaXplKTsKLQkJZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCAicmVnIiwgdG1wLCBzaXplb2YodG1wKSk7CisJCWZkdF9zZXRwcm9wKGJsb2IsIG5vZGVvZmZzZXQsICJyZWciLCB0bXAsIHNpemVvZih0bXApKTsKIAl9CiAjZWxzZQogCXUzMiAqcDsKZGlmZiAtLWdpdCBhL2JvYXJkL21wYzgzNjBlbWRzL3BjaS5jIGIvYm9hcmQvbXBjODM2MGVtZHMvcGNpLmMKaW5kZXggMTU4ZWZmZS4uOGY5MDQ3MSAxMDA2NDQKLS0tIGEvYm9hcmQvbXBjODM2MGVtZHMvcGNpLmMKKysrIGIvYm9hcmQvbXBjODM2MGVtZHMvcGNpLmMKQEAgLTIwLDggKzIwLDcgQEAKICNpbmNsdWRlIDxpMmMuaD4KICNpZiBkZWZpbmVkKENPTkZJR19PRl9GTEFUX1RSRUUpCiAjaW5jbHVkZSA8ZnRfYnVpbGQuaD4KLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX09GX0xJQkZEVCkKKyNlbGlmIGRlZmluZWQoQ09ORklHX09GX0xJQkZEVCkKICNpbmNsdWRlIDxsaWJmZHQuaD4KICNpbmNsdWRlIDxsaWJmZHRfZW52Lmg+CiAjZW5kaWYKQEAgLTIwNyw3ICsyMDYsNyBAQAogCiAJLyogU3dpdGNoIHRlbXBvcmFyaWx5IHRvIEkyQyBidXMgIzIgKi8KIAlvcmlnX2kyY19idXMgPSBpMmNfZ2V0X2J1c19udW0oKTsKLSAJaTJjX3NldF9idXNfbnVtKDEpOworCWkyY19zZXRfYnVzX251bSgxKTsKIAogCXZhbDggPSAwOwogCWkyY193cml0ZSgweDIzLCAweDYsIDEsICZ2YWw4LCAxKTsKQEAgLTMxMSwyNiArMzEwLDI1IEBACiAJaW50IGVycjsKIAlpbnQgdG1wWzJdOwogCi0Jbm9kZW9mZnNldCA9IGZkdF9wYXRoX29mZnNldCAoZmR0LCAiLyIgT0ZfU09DICIvcGNpQDg1MDAiKTsKKwlub2Rlb2Zmc2V0ID0gZmR0X2ZpbmRfbm9kZV9ieV9wYXRoKGJsb2IsICIvIiBPRl9TT0MgIi9wY2lAODUwMCIpOwogCWlmIChub2Rlb2Zmc2V0ID49IDApIHsKIAkJdG1wWzBdID0gY3B1X3RvX2JlMzIoaG9zZVswXS5maXJzdF9idXNubyk7CiAJCXRtcFsxXSA9IGNwdV90b19iZTMyKGhvc2VbMF0ubGFzdF9idXNubyk7Ci0JCWVyciA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgImJ1cy1yYW5nZSIsIHRtcCwgc2l6ZW9mKHRtcCkpOworCQllcnIgPSBmZHRfc2V0cHJvcChibG9iLCBub2Rlb2Zmc2V0LCAiYnVzLXJhbmdlIiwgdG1wLCBzaXplb2YodG1wKSk7CiAJfQogfQotI2VuZGlmCQkJCS8qIENPTkZJR19PRl9MSUJGRFQgKi8KLSNpZmRlZiBDT05GSUdfT0ZfRkxBVF9UUkVFCisjZWxpZiBkZWZpbmVkKENPTkZJR19PRl9GTEFUX1RSRUUpCiB2b2lkCiBmdF9wY2lfc2V0dXAodm9pZCAqYmxvYiwgYmRfdCAqYmQpCiB7Ci0gICAgICAgCXUzMiAqcDsKLSAgICAgICAJaW50IGxlbjsKKwl1MzIgKnA7CisJaW50IGxlbjsKIAotICAgICAgIAlwID0gKHUzMiAqKWZ0X2dldF9wcm9wKGJsb2IsICIvIiBPRl9TT0MgIi9wY2lAODUwMC9idXMtcmFuZ2UiLCAmbGVuKTsKLSAgICAgICAJaWYgKHAgIT0gTlVMTCkgeworCXAgPSAodTMyICopZnRfZ2V0X3Byb3AoYmxvYiwgIi8iIE9GX1NPQyAiL3BjaUA4NTAwL2J1cy1yYW5nZSIsICZsZW4pOworCWlmIChwICE9IE5VTEwpIHsKIAkJcFswXSA9IGhvc2VbMF0uZmlyc3RfYnVzbm87CiAJCXBbMV0gPSBob3NlWzBdLmxhc3RfYnVzbm87Ci0gICAgICAgCX0KKwl9CiB9CiAjZW5kaWYJCQkJLyogQ09ORklHX09GX0ZMQVRfVFJFRSAqLwogI2VuZGlmCQkJCS8qIENPTkZJR19QQ0kgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL21wYzgzNjBlbWRzL3UtYm9vdC5sZHMgYi9ib2FyZC9tcGM4MzYwZW1kcy91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzdjODdhLi4wMDAwMDAwCi0tLSBhL2JvYXJkL21wYzgzNjBlbWRzL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwNgotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgzeHgvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQotRU5UUlkoX3N0YXJ0KQpkaWZmIC0tZ2l0IGEvYm9hcmQvbXBjODU2MGFkcy9tcGM4NTYwYWRzLmMgYi9ib2FyZC9tcGM4NTYwYWRzL21wYzg1NjBhZHMuYwppbmRleCBkMTliYWQ2Li40MWFjYjk3IDEwMDY0NAotLS0gYS9ib2FyZC9tcGM4NTYwYWRzL21wYzg1NjBhZHMuYworKysgYi9ib2FyZC9tcGM4NTYwYWRzL21wYzg1NjBhZHMuYwpAQCAtNTUwLDggKzU1MCwzNCBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfT0ZfRkxBVF9UUkVFKSAmJiBkZWZpbmVkKENPTkZJR19PRl9CT0FSRF9TRVRVUCkKIHZvaWQKK2Z0X3NvY19zZXR1cCh2b2lkICpibG9iLCBiZF90ICpiZCkKK3sKKwl1MzIgKnA7CisJaW50IGxlbjsKKwl1bG9uZyBkYXRhOworCisJcCA9IGZ0X2dldF9wcm9wKGJsb2IsICIvIiBPRl9TT0MgIi9jcG1AZTAwMDAwMDAvYnJnLWZyZXF1ZW5jeSIsICZsZW4pOworCisJaWYgKHAgIT0gTlVMTCkKKwkJKnAgPSBjcHVfdG9fYmUzMihiZC0+YmlfYnJnZnJlcSk7CisKKwlwID0gZnRfZ2V0X3Byb3AoYmxvYiwKKwkJCSIvIiBPRl9TT0MgIi9jcG1AZTAwMDAwMDAvc2NjQDkxYTAwL2N1cnJlbnQtc3BlZWQiLAorCQkJJmxlbik7CisJaWYgKHAgIT0gTlVMTCkKKwkJKnAgPSBjcHVfdG9fYmUzMihiZC0+YmlfYmF1ZHJhdGUpOworCisJcCA9IGZ0X2dldF9wcm9wKGJsb2IsCisJCQkiLyIgT0ZfU09DICIvY3BtQGUwMDAwMDAwL3NjY0A5MWEyMC9jdXJyZW50LXNwZWVkIiwKKwkJCSZsZW4pOworCWlmIChwICE9IE5VTEwpCisJCSpwID0gY3B1X3RvX2JlMzIoYmQtPmJpX2JhdWRyYXRlKTsKK30KKwordm9pZAogZnRfYm9hcmRfc2V0dXAodm9pZCAqYmxvYiwgYmRfdCAqYmQpCiB7CiAJZnRfY3B1X3NldHVwKGJsb2IsIGJkKTsKKwlmdF9zb2Nfc2V0dXAoYmxvYiwgYmQpOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9tcGM4NjQxaHBjbi9NYWtlZmlsZSBiL2JvYXJkL21wYzg2NDFocGNuL01ha2VmaWxlCmluZGV4IDk2MjUyMTEuLmRmNTZiMzEgMTAwNjQ0Ci0tLSBhL2JvYXJkL21wYzg2NDFocGNuL01ha2VmaWxlCisrKyBiL2JvYXJkL21wYzg2NDFocGNuL01ha2VmaWxlCkBAIC0yMyw2ICsyMywxMCBAQAogCiBpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKIAoraWZuZXEgKCQoT0JKVFJFRSksJChTUkNUUkVFKSkKKyQoc2hlbGwgbWtkaXIgLXAgJChvYmopLi4vZnJlZXNjYWxlL2NvbW1vbikKK2VuZGlmCisKIExJQgk9ICQob2JqKWxpYiQoQk9BUkQpLmEKIAogQ09CSlMJOj0gJChCT0FSRCkubyBzeXNfZWVwcm9tLm8gXApkaWZmIC0tZ2l0IGEvYm9hcmQvbXBjODY0MWhwY24vY29uZmlnLm1rIGIvYm9hcmQvbXBjODY0MWhwY24vY29uZmlnLm1rCmluZGV4IDk4OWE0MGIuLmY3NzhkY2IgMTAwNjQ0Ci0tLSBhL2JvYXJkL21wYzg2NDFocGNuL2NvbmZpZy5taworKysgYi9ib2FyZC9tcGM4NjQxaHBjbi9jb25maWcubWsKQEAgLTI1LDcgKzI1LDcgQEAKICMgZGVmYXVsdCBDQ1NSQkFSIGlzIGF0IDB4ZmY3MDAwMDAKICMgYXNzdW1lIFUtQm9vdCBpcyBsZXNzIHRoYW4gMC41TUIKICMKLVRFWFRfQkFTRSA9IDB4ZmZmMDEwMDAKK1RFWFRfQkFTRSA9IDB4ZmZmMDAwMDAKIAogUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURDT05GSUdfTVBDODZ4eD0xCiBQTEFURk9STV9DUFBGTEFHUyArPSAtRENPTkZJR19NUEM4NjQxPTEgLW1hbHRpdmVjIC1tYWJpPWFsdGl2ZWMgLW1zb2Z0LWZsb2F0CmRpZmYgLS1naXQgYS9ib2FyZC9tcGM4NjQxaHBjbi9tcGM4NjQxaHBjbi5jIGIvYm9hcmQvbXBjODY0MWhwY24vbXBjODY0MWhwY24uYwppbmRleCA3ZDdlMmFmLi4xYmZiZTg4IDEwMDY0NAotLS0gYS9ib2FyZC9tcGM4NjQxaHBjbi9tcGM4NjQxaHBjbi5jCisrKyBiL2JvYXJkL21wYzg2NDFocGNuL21wYzg2NDFocGNuLmMKQEAgLTExLDcgKzExLDcgQEAKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8cGNpLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9pbW1hcF84Nnh4Lmg+CisjaW5jbHVkZSA8YXNtL2ltbWFwX2ZzbF9wY2kuaD4KICNpbmNsdWRlIDxzcGQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIApAQCAtNTUsMzYgKzU2LDYgQEAKIHsKIAlwdXRzKCJCb2FyZDogTVBDODY0MUhQQ05cbiIpOwogCi0jaWZkZWYgQ09ORklHX1BDSQotCi0Jdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDRkdfQ0NTUkJBUjsKLQl2b2xhdGlsZSBjY3NyX2d1cl90ICpndXIgPSAmaW1tYXAtPmltX2d1cjsKLQl2b2xhdGlsZSBjY3NyX3BleF90ICpwZXgxID0gJmltbWFwLT5pbV9wZXgxOwotCi0JdWludCBkZXZkaXNyID0gZ3VyLT5kZXZkaXNyOwotCXVpbnQgaW9fc2VsID0gKGd1ci0+cG9yZGV2c3IgJiBNUEM4Nnh4X1BPUkRFVlNSX0lPX1NFTCkgPj4gMTY7Ci0JdWludCBob3N0MV9hZ2VudCA9IChndXItPnBvcmJtc3IgJiBNUEM4Nnh4X1BPUkJNU1JfSEEpID4+IDE3OwotCXVpbnQgcGV4MV9hZ2VudCA9IChob3N0MV9hZ2VudCA9PSAwKSB8fCAoaG9zdDFfYWdlbnQgPT0gMSk7Ci0KLQlpZiAoKGlvX3NlbCA9PSAyIHx8IGlvX3NlbCA9PSAzIHx8IGlvX3NlbCA9PSA1Ci0JICAgICB8fCBpb19zZWwgPT0gNiB8fCBpb19zZWwgPT0gNyB8fCBpb19zZWwgPT0gMHhGKQotCSAgICAmJiAhKGRldmRpc3IgJiBNUEM4Nnh4X0RFVkRJU1JfUENJRVgxKSkgewotCQlkZWJ1ZygiUENJLUVYUFJFU1MgMTogJXMgXG4iLCBwZXgxX2FnZW50ID8gIkFnZW50IiA6ICJIb3N0Iik7Ci0JCWRlYnVnKCIweCUwOHg9MHglMDh4ICIsICZwZXgxLT5wbWVfbXNnX2RldCwgcGV4MS0+cG1lX21zZ19kZXQpOwotCQlpZiAocGV4MS0+cG1lX21zZ19kZXQpIHsKLQkJCXBleDEtPnBtZV9tc2dfZGV0ID0gMHhmZmZmZmZmZjsKLQkJCWRlYnVnKCIgd2l0aCBlcnJvcnMuICBDbGVhcmluZy4gIE5vdyAweCUwOHgiLAotCQkJICAgICAgcGV4MS0+cG1lX21zZ19kZXQpOwotCQl9Ci0JCWRlYnVnKCJcbiIpOwotCX0gZWxzZSB7Ci0JCXB1dHMoIlBDSS1FWFBSRVNTIDE6IERpc2FibGVkXG4iKTsKLQl9Ci0KLSNlbHNlCi0JcHV0cygiUENJLUVYUFJFU1MxOiBEaXNhYmxlZFxuIik7Ci0jZW5kaWYKLQogCXJldHVybiAwOwogfQogCkBAIC0yMTksMjEgKzE5MCwxMzggQEAKICNlbmRpZgogCiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgaG9zZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgcGNpMV9ob3NlID0gewogI2lmbmRlZiBDT05GSUdfUENJX1BOUAotICAgICAgY29uZmlnX3RhYmxlOnBjaV9tcGM4Nnh4Y3RzX2NvbmZpZ190YWJsZSwKKwljb25maWdfdGFibGU6cGNpX21wYzg2eHhjdHNfY29uZmlnX3RhYmxlCiAjZW5kaWYKIH07Ci0KICNlbmRpZiAvKiBDT05GSUdfUENJICovCiAKKyNpZmRlZiBDT05GSUdfUENJMgorc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBwY2kyX2hvc2U7CisjZW5kaWYJLyogQ09ORklHX1BDSTIgKi8KKworaW50IGZpcnN0X2ZyZWVfYnVzbm8gPSAwOworCisKIHZvaWQgcGNpX2luaXRfYm9hcmQodm9pZCkKIHsKLSNpZmRlZiBDT05GSUdfUENJCi0JZXh0ZXJuIHZvaWQgcGNpX21wYzg2eHhfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpOworCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKikgQ0ZHX0NDU1JCQVI7CisJdm9sYXRpbGUgY2Nzcl9ndXJfdCAqZ3VyID0gJmltbWFwLT5pbV9ndXI7CisJdWludCBkZXZkaXNyID0gZ3VyLT5kZXZkaXNyOworCXVpbnQgaW9fc2VsID0gKGd1ci0+cG9yZGV2c3IgJiBNUEM4Nnh4X1BPUkRFVlNSX0lPX1NFTCkgPj4gMTY7CiAKLQlwY2lfbXBjODZ4eF9pbml0KCZob3NlKTsKLSNlbmRpZiAvKiBDT05GSUdfUENJICovCisjaWZkZWYgQ09ORklHX1BDSTEKK3sKKwl2b2xhdGlsZSBjY3NyX2ZzbF9wY2lfdCAqcGNpID0gKGNjc3JfZnNsX3BjaV90ICopIENGR19QQ0kxX0FERFI7CisJZXh0ZXJuIHZvaWQgZnNsX3BjaV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSk7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gJnBjaTFfaG9zZTsKKyNpZmRlZiBERUJVRworCXVpbnQgaG9zdDFfYWdlbnQgPSAoZ3VyLT5wb3JibXNyICYgTVBDODZ4eF9QT1JCTVNSX0hBKSA+PiAxNzsKKwl1aW50IHBleDFfYWdlbnQgPSAoaG9zdDFfYWdlbnQgPT0gMCkgfHwgKGhvc3QxX2FnZW50ID09IDEpOworI2VuZGlmCisJaWYgKChpb19zZWwgPT0gMiB8fCBpb19zZWwgPT0gMyB8fCBpb19zZWwgPT0gNQorCSAgICAgfHwgaW9fc2VsID09IDYgfHwgaW9fc2VsID09IDcgfHwgaW9fc2VsID09IDB4RikKKwkgICAgJiYgIShkZXZkaXNyICYgTVBDODZ4eF9ERVZESVNSX1BDSUVYMSkpIHsKKwkJZGVidWcoIlBDSS1FWFBSRVNTIDE6ICVzIFxuIiwgcGV4MV9hZ2VudCA/ICJBZ2VudCIgOiAiSG9zdCIpOworCQlkZWJ1ZygiMHglMDh4PTB4JTA4eCAiLCAmcGNpLT5wbWVfbXNnX2RldCwgcGNpLT5wbWVfbXNnX2RldCk7CisJCWlmIChwY2ktPnBtZV9tc2dfZGV0KSB7CisJCQlwY2ktPnBtZV9tc2dfZGV0ID0gMHhmZmZmZmZmZjsKKwkJCWRlYnVnKCIgd2l0aCBlcnJvcnMuICBDbGVhcmluZy4gIE5vdyAweCUwOHgiLAorCQkJICAgICAgcGNpLT5wbWVfbXNnX2RldCk7CisJCX0KKwkJZGVidWcoIlxuIik7CisKKwkJLyogaW5ib3VuZCAqLworCQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMCwKKwkJCSAgICAgICBDRkdfUENJX01FTU9SWV9CVVMsCisJCQkgICAgICAgQ0ZHX1BDSV9NRU1PUllfUEhZUywKKwkJCSAgICAgICBDRkdfUENJX01FTU9SWV9TSVpFLAorCQkJICAgICAgIFBDSV9SRUdJT05fTUVNIHwgUENJX1JFR0lPTl9NRU1PUlkpOworCisJCS8qIG91dGJvdW5kIG1lbW9yeSAqLworCQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMSwKKwkJCSAgICAgICBDRkdfUENJMV9NRU1fQkFTRSwKKwkJCSAgICAgICBDRkdfUENJMV9NRU1fUEhZUywKKwkJCSAgICAgICBDRkdfUENJMV9NRU1fU0laRSwKKwkJCSAgICAgICBQQ0lfUkVHSU9OX01FTSk7CisKKwkJLyogb3V0Ym91bmQgaW8gKi8KKwkJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDIsCisJCQkgICAgICAgQ0ZHX1BDSTFfSU9fQkFTRSwKKwkJCSAgICAgICBDRkdfUENJMV9JT19QSFlTLAorCQkJICAgICAgIENGR19QQ0kxX0lPX1NJWkUsCisJCQkgICAgICAgUENJX1JFR0lPTl9JTyk7CisKKwkJaG9zZS0+cmVnaW9uX2NvdW50ID0gMzsKKworCQlob3NlLT5maXJzdF9idXNubz1maXJzdF9mcmVlX2J1c25vOworCQlwY2lfc2V0dXBfaW5kaXJlY3QoaG9zZSwgKGludCkgJnBjaS0+Y2ZnX2FkZHIsIChpbnQpICZwY2ktPmNmZ19kYXRhKTsKKworCQlmc2xfcGNpX2luaXQoaG9zZSk7CisKKwkJZmlyc3RfZnJlZV9idXNubz1ob3NlLT5sYXN0X2J1c25vKzE7CisJCXByaW50ZiAoIiAgICBQQ0ktRVhQUkVTUyAxIG9uIGJ1cyAlMDJ4IC0gJTAyeFxuIiwKKwkJCWhvc2UtPmZpcnN0X2J1c25vLGhvc2UtPmxhc3RfYnVzbm8pOworCisJCS8qCisJCSAqIEFjdGl2YXRlIFVMSTE1NzUgbGVnYWN5IGNoaXAgYnkgcGVyZm9ybWluZyBhIGZha2UKKwkJICogbWVtb3J5IGFjY2Vzcy4gIE5lZWRlZCB0byBtYWtlIFVMSSBSVEMgd29yay4KKwkJICovCisJCWluX2JlMzIoKHVuc2lnbmVkICopICgoY2hhciAqKShDRkdfUENJMV9NRU1fQkFTRQorCQkJCSAgICAgICArIENGR19QQ0kxX01FTV9TSVpFIC0gMHgxMDAwMDAwKSkpOworCisJfSBlbHNlIHsKKwkJcHV0cygiUENJLUVYUFJFU1MgMTogRGlzYWJsZWRcbiIpOworCX0KK30KKyNlbHNlCisJcHV0cygiUENJLUVYUFJFU1MxOiBEaXNhYmxlZFxuIik7CisjZW5kaWYgLyogQ09ORklHX1BDSTEgKi8KKworI2lmZGVmIENPTkZJR19QQ0kyCit7CisJdm9sYXRpbGUgY2Nzcl9mc2xfcGNpX3QgKnBjaSA9IChjY3NyX2ZzbF9wY2lfdCAqKSBDRkdfUENJMl9BRERSOworCWV4dGVybiB2b2lkIGZzbF9wY2lfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9ICZwY2kyX2hvc2U7CisKKworCS8qIGluYm91bmQgKi8KKwlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMCwKKwkJICAgICAgIENGR19QQ0lfTUVNT1JZX0JVUywKKwkJICAgICAgIENGR19QQ0lfTUVNT1JZX1BIWVMsCisJCSAgICAgICBDRkdfUENJX01FTU9SWV9TSVpFLAorCQkgICAgICAgUENJX1JFR0lPTl9NRU0gfCBQQ0lfUkVHSU9OX01FTU9SWSk7CisKKwkvKiBvdXRib3VuZCBtZW1vcnkgKi8KKwlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMSwKKwkJICAgICAgIENGR19QQ0kyX01FTV9CQVNFLAorCQkgICAgICAgQ0ZHX1BDSTJfTUVNX1BIWVMsCisJCSAgICAgICBDRkdfUENJMl9NRU1fU0laRSwKKwkJICAgICAgIFBDSV9SRUdJT05fTUVNKTsKKworCS8qIG91dGJvdW5kIGlvICovCisJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDIsCisJCSAgICAgICBDRkdfUENJMl9JT19CQVNFLAorCQkgICAgICAgQ0ZHX1BDSTJfSU9fUEhZUywKKwkJICAgICAgIENGR19QQ0kyX0lPX1NJWkUsCisJCSAgICAgICBQQ0lfUkVHSU9OX0lPKTsKKworCWhvc2UtPnJlZ2lvbl9jb3VudCA9IDM7CisKKwlob3NlLT5maXJzdF9idXNubz1maXJzdF9mcmVlX2J1c25vOworCXBjaV9zZXR1cF9pbmRpcmVjdChob3NlLCAoaW50KSAmcGNpLT5jZmdfYWRkciwgKGludCkgJnBjaS0+Y2ZnX2RhdGEpOworCisJZnNsX3BjaV9pbml0KGhvc2UpOworCisJZmlyc3RfZnJlZV9idXNubz1ob3NlLT5sYXN0X2J1c25vKzE7CisJcHJpbnRmICgiICAgIFBDSS1FWFBSRVNTIDIgb24gYnVzICUwMnggLSAlMDJ4XG4iLAorCQlob3NlLT5maXJzdF9idXNubyxob3NlLT5sYXN0X2J1c25vKTsKK30KKyNlbHNlCisJcHV0cygiUENJLUVYUFJFU1MgMjogRGlzYWJsZWRcbiIpOworI2VuZGlmIC8qIENPTkZJR19QQ0kyICovCisKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX09GX0ZMQVRfVFJFRSkgJiYgZGVmaW5lZChDT05GSUdfT0ZfQk9BUkRfU0VUVVApCmRpZmYgLS1naXQgYS9ib2FyZC9tcGM4NjQxaHBjbi9zeXNfZWVwcm9tLmMgYi9ib2FyZC9tcGM4NjQxaHBjbi9zeXNfZWVwcm9tLmMKaW5kZXggNzRlMmEzZC4uN2JjNjYzYiAxMDA2NDQKLS0tIGEvYm9hcmQvbXBjODY0MWhwY24vc3lzX2VlcHJvbS5jCisrKyBiL2JvYXJkL21wYzg2NDFocGNuL3N5c19lZXByb20uYwpAQCAtNjgsNyArNjgsNyBAQAogCSAgICAgICBtYWNfZGF0YS5kYXRlWzVdLAogCSAgICAgICBtYWNfZGF0YS5kYXRlWzZdKTsKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCXNwcmludGYoZXRoYWRkcltpXSwKKwkJc3ByaW50ZigoY2hhciAqKWV0aGFkZHJbaV0sCiAJCQkiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAogCQkJbWFjX2RhdGEubWFjW2ldWzBdLAogCQkJbWFjX2RhdGEubWFjW2ldWzFdLApAQCAtNzksMTAgKzc5LDEwIEBACiAJCXByaW50ZigiTUFDICVkICVzXG4iLCBpLCBldGhhZGRyW2ldKTsKIAl9CiAKLQlzZXRlbnYoImV0aGFkZHIiLCBldGhhZGRyWzBdKTsKLQlzZXRlbnYoImV0aDFhZGRyIiwgZXRoYWRkclsxXSk7Ci0Jc2V0ZW52KCJldGgyYWRkciIsIGV0aGFkZHJbMl0pOwotCXNldGVudigiZXRoM2FkZHIiLCBldGhhZGRyWzNdKTsKKwlzZXRlbnYoImV0aGFkZHIiLCAgKGNoYXIgKilldGhhZGRyWzBdKTsKKwlzZXRlbnYoImV0aDFhZGRyIiwgKGNoYXIgKilldGhhZGRyWzFdKTsKKwlzZXRlbnYoImV0aDJhZGRyIiwgKGNoYXIgKilldGhhZGRyWzJdKTsKKwlzZXRlbnYoImV0aDNhZGRyIiwgKGNoYXIgKilldGhhZGRyWzNdKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjM2LDcgKzIzNiw3IEBACiAJfSBlbHNlIHsKIAkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQkJaWYgKG1lbWNtcCgmbWFjX2RhdGEubWFjW2ldLCAiXDBcMFwwXDBcMFwwIiwgNikpIHsKLQkJCQlzcHJpbnRmKGV0aGFkZHJbaV0sCisJCQkJc3ByaW50ZigoY2hhciAqKWV0aGFkZHJbaV0sCiAJCQkJCSIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCiAJCQkJCW1hY19kYXRhLm1hY1tpXVswXSwKIAkJCQkJbWFjX2RhdGEubWFjW2ldWzFdLApAQCAtMjQ0LDEwICsyNDQsMTAgQEAKIAkJCQkJbWFjX2RhdGEubWFjW2ldWzNdLAogCQkJCQltYWNfZGF0YS5tYWNbaV1bNF0sCiAJCQkJCW1hY19kYXRhLm1hY1tpXVs1XSk7Ci0JCQkJc3ByaW50ZihlbmV0dmFyLAorCQkJCXNwcmludGYoKGNoYXIgKillbmV0dmFyLAogCQkJCQlpID8gImV0aCVkYWRkciIgOiAiZXRoYWRkciIsCiAJCQkJCWkpOwotCQkJCXNldGVudihlbmV0dmFyLCBldGhhZGRyW2ldKTsKKwkJCQlzZXRlbnYoKGNoYXIgKillbmV0dmFyLCAoY2hhciAqKWV0aGFkZHJbaV0pOwogCQkJfQogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvYm9hcmQvbXBjODY0MWhwY24vdS1ib290LmxkcyBiL2JvYXJkL21wYzg2NDFocGNuL3UtYm9vdC5sZHMKaW5kZXggMTNjMWFjZi4uNTg2NDQ2NCAxMDA2NDQKLS0tIGEvYm9hcmQvbXBjODY0MWhwY24vdS1ib290LmxkcworKysgYi9ib2FyZC9tcGM4NjQxaHBjbi91LWJvb3QubGRzCkBAIC0xLDcgKzEsNSBAQAogLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwNCwgRnJlZXNjYWxlLCBJbmMuCi0gKiAoQykgQ29weXJpZ2h0IDIwMDIsMjAwMywgTW90b3JvbGEsSW5jLgotICogSmVmZiBCcm93bgorICogQ29weXJpZ2h0IDIwMDYsIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KICAqCiAgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogICogcHJvamVjdC4KQEAgLTIzLDI0ICsyMSwxMSBAQAogICovCiAKIE9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLworCiBTRUNUSU9OUwogewotICAucmVzZXR2ZWMgMHhGRkYwMDEwMCA6Ci0gIHsKLSAgICAqKC5yZXNldHZlYykKLSAgfSA9IDB4ZmZmZgotCi0gIC5ib290cGcgMHhGRkY3MDAwMCA6Ci0gIHsKLSAgICBjcHUvbXBjODZ4eC9zdGFydC5vCSguYm9vdHBnKQotICAgIGJvYXJkL21wYzg2NDFocGNuL2luaXQubyAoLmJvb3RwZykKLSAgfSA9IDB4ZmZmZgogCiAgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyAxMDI0OwogICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KICAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9CiAgIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9CkBAIC02NiwxNyArNTEsMTcgQEAKICAgLnRleHQgICAgICA6CiAgIHsKICAgICBjcHUvbXBjODZ4eC9zdGFydC5vCSgudGV4dCkKLSAgICBib2FyZC9tcGM4NjQxaHBjbi9pbml0Lm8gKC50ZXh0KQorICAgIGJvYXJkL21wYzg2NDFocGNuL2luaXQubyAoLmJvb3RwZykKICAgICBjcHUvbXBjODZ4eC90cmFwcy5vICgudGV4dCkKICAgICBjcHUvbXBjODZ4eC9pbnRlcnJ1cHRzLm8gKC50ZXh0KQogICAgIGNwdS9tcGM4Nnh4L2NwdV9pbml0Lm8gKC50ZXh0KQogICAgIGNwdS9tcGM4Nnh4L2NwdS5vICgudGV4dCkKICAgICBjcHUvbXBjODZ4eC9zcGVlZC5vICgudGV4dCkKLSAgICBjcHUvbXBjODZ4eC9wY2kubyAoLnRleHQpCiAgICAgY29tbW9uL2RsbWFsbG9jLm8gKC50ZXh0KQogICAgIGxpYl9nZW5lcmljL2NyYzMyLm8gKC50ZXh0KQogICAgIGxpYl9wcGMvZXh0YWJsZS5vICgudGV4dCkKICAgICBsaWJfZ2VuZXJpYy96bGliLm8gKC50ZXh0KQorICAgIGRyaXZlcnMvYmlvc19lbXVsYXRvci9hdGliaW9zLm8gKC50ZXh0KQogICAgICooLnRleHQpCiAgICAgKiguZml4dXApCiAgICAgKiguZ290MSkKQEAgLTg4LDYgKzczLDcgQEAKICAgICAqKC5yb2RhdGEpCiAgICAgKigucm9kYXRhMSkKICAgICAqKC5yb2RhdGEuc3RyMS40KQorICAgICooLmVoX2ZyYW1lKQogICB9CiAgIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKICAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQpkaWZmIC0tZ2l0IGEvYm9hcmQvbXBsL2NvbW1vbi9jb21tb25fdXRpbC5jIGIvYm9hcmQvbXBsL2NvbW1vbi9jb21tb25fdXRpbC5jCmluZGV4IDA2ZDAyMWEuLjI3OGFkNWMgMTAwNjQ0Ci0tLSBhL2JvYXJkL21wbC9jb21tb24vY29tbW9uX3V0aWwuYworKysgYi9ib2FyZC9tcGwvY29tbW9uL2NvbW1vbl91dGlsLmMKQEAgLTQ3MSw3ICs0NzEsNyBAQAogCiAJaWYgKHN0cmNtcChhcmd2WzFdLCAiZmxhc2giKSA9PSAwKQogCXsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GREMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0ZEQykKIAkJaWYgKHN0cmNtcChhcmd2WzJdLCAiZmxvcHB5IikgPT0gMCkgewogIAkJCWNoYXIgKmxvY2FsX2FyZ3NbM107CiAJCQlleHRlcm4gaW50IGRvX2ZkY2Jvb3QgKGNtZF90YmxfdCAqLCBpbnQsIGludCwgY2hhciAqW10pOwpAQCAtNDkxLDcgKzQ5MSw3IEBACiAJCQlyZXN1bHQ9bXBsX3ByZ19pbWFnZSgodWNoYXIgKilsZF9hZGRyKTsKIAkJCXJldHVybiByZXN1bHQ7CiAJCX0KLSNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GREMpICovCisjZW5kaWYKIAkJaWYgKHN0cmNtcChhcmd2WzJdLCAibWVtIikgPT0gMCkgewogCSAgICAJCWlmKGFyZ2M9PTQpIHsKIAkJCQlsZF9hZGRyPXNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDE2KTsKQEAgLTU2NCw3ICs1NjQsNyBAQAogfQogCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ET0MpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RPQykKIGV4dGVybiB2b2lkIGRvY19wcm9iZSh1bG9uZyBwaHlzYWRyKTsKIHZvaWQgZG9jX2luaXQgKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9ib2FyZC9tcGwvY29tbW9uL2NvbW1vbl91dGlsLmggYi9ib2FyZC9tcGwvY29tbW9uL2NvbW1vbl91dGlsLmgKaW5kZXggOGYyZWMwMy4uZDRiMWY2OCAxMDA2NDQKLS0tIGEvYm9hcmQvbXBsL2NvbW1vbi9jb21tb25fdXRpbC5oCisrKyBiL2JvYXJkL21wbC9jb21tb24vY29tbW9uX3V0aWwuaApAQCAtMzksNyArMzksNyBAQAogCiB2b2lkIHNob3dfc3RkaW9fZGV2KHZvaWQpOwogdm9pZCBjaGVja19lbnYodm9pZCk7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRE9DKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ET0MpCiB2b2lkIGRvY19pbml0ICh2b2lkKTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9ib2FyZC9tcGwvcGF0aS91LWJvb3QubGRzIGIvYm9hcmQvbXBsL3BhdGkvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIwM2ZlZi4uMDAwMDAwMAotLS0gYS9ib2FyZC9tcGwvcGF0aS91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEJV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZQotICogKEMpIENvcHlyaWdodCAyMDAzCU1hcnRpbiBXaW5pc3RvZXJmZXIsIG1hcnRpbndpbmlzdG9lcmZlckBnbXguY2gKLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIC8qIFdBUk5JTkcgLSB0aGUgZm9sbG93aW5nIGlzIGhhbmQtb3B0aW1pemVkIHRvIGZpdCB3aXRoaW4JKi8KLSAgICAvKiB0aGUgc2VjdG9yIGxheW91dCBvZiBvdXIgZmxhc2ggY2hpcHMhCVhYWCBGSVhNRSBYWFgJKi8KLQotICAgIGNwdS9tcGM1eHgvc3RhcnQubwkoLnRleHQpCi0KLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gIH0KLSAgX2V0ZXh0ID0gLjsKLSAgUFJPVklERSAoZXRleHQgPSAuKTsKLSAgLnJvZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MDBGRikgJiAweEZGRkZGRjAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PjI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXyk+PjI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDI1Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDI1Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotCi0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci0vKiAgIC4gPSBlbnZfc3RhcnQ7Ci0JLnBwY2Vudgk6Ci0JewotCQljb21tb24vZW52aXJvbm1lbnQubyAoLnBwY2VudikKLQl9Ci0qLwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvbXBsL3ZjbWE5L3ZjbWE5LmMgYi9ib2FyZC9tcGwvdmNtYTkvdmNtYTkuYwppbmRleCAwZDIwMDNkLi40NWFiNjU0IDEwMDY0NAotLS0gYS9ib2FyZC9tcGwvdmNtYTkvdmNtYTkuYworKysgYi9ib2FyZC9tcGwvdmNtYTkvdmNtYTkuYwpAQCAtMTMyLDcgKzEzMiw3IEBACiAvKgogICogTkFORCBmbGFzaCBpbml0aWFsaXphdGlvbi4KICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiBleHRlcm4gdWxvbmcKIG5hbmRfcHJvYmUodWxvbmcgcGh5c2Fkcik7CiAKZGlmZiAtLWdpdCBhL2JvYXJkL21wbC92Y21hOS92Y21hOS5oIGIvYm9hcmQvbXBsL3ZjbWE5L3ZjbWE5LmgKaW5kZXggYzAxNjdkNS4uN2EzMjM0MyAxMDA2NDQKLS0tIGEvYm9hcmQvbXBsL3ZjbWE5L3ZjbWE5LmgKKysrIGIvYm9hcmQvbXBsL3ZjbWE5L3ZjbWE5LmgKQEAgLTMxLDcgKzMxLDcgQEAKIAogdm9pZCBwcmludF92Y21hOV9pbmZvKHZvaWQpOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIHR5cGVkZWYgZW51bSB7CiAJTkZDRV9MT1csCiAJTkZDRV9ISUdICmRpZmYgLS1naXQgYS9ib2FyZC9tdXNlbmtpL3UtYm9vdC5sZHMgYi9ib2FyZC9tdXNlbmtpL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMDUxMDkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvbXVzZW5raS91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI0eC9zdGFydC5vCQkoLnRleHQpCi0gICAgbGliX3BwYy9ib2FyZC5vCQkoLnRleHQpCi0gICAgbGliX3BwYy9wcGNzdHJpbmcubwkJKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL3ZzcHJpbnRmLm8JKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL2NyYzMyLm8JCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy96bGliLm8JCSgudGV4dCkKLQotCS4gPSBERUZJTkVEKGVudl9vZmZzZXQpID8gZW52X29mZnNldCA6IC47Ci0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8gKC50ZXh0KQotCi0JKigudGV4dCkKLQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL212Ymx1ZS91LWJvb3QubGRzIGIvYm9hcmQvbXZibHVlL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMDUxMDkuLjAwMDAwMDAKLS0tIGEvYm9hcmQvbXZibHVlL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjR4L3N0YXJ0Lm8JCSgudGV4dCkKLSAgICBsaWJfcHBjL2JvYXJkLm8JCSgudGV4dCkKLSAgICBsaWJfcHBjL3BwY3N0cmluZy5vCQkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvdnNwcmludGYubwkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvY3JjMzIubwkJKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL3psaWIubwkJKC50ZXh0KQotCi0JLiA9IERFRklORUQoZW52X29mZnNldCkgPyBlbnZfb2Zmc2V0IDogLjsKLSAgICBjb21tb24vZW52aXJvbm1lbnQubyAoLnRleHQpCi0KLQkqKC50ZXh0KQotCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvbmM2NTAvbmFuZC5jIGIvYm9hcmQvbmM2NTAvbmFuZC5jCmluZGV4IDZiYjdjMzEuLjg2MTdmNzQgMTAwNjQ0Ci0tLSBhL2JvYXJkL25jNjUwL25hbmQuYworKysgYi9ib2FyZC9uYzY1MC9uYW5kLmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAogI2luY2x1ZGUgPG5hbmQuaD4KIApAQCAtMTE1LDQgKzExNSw0IEBACiAvKgluYW5kLT5vcHRpb25zID0gTkFORF9TQU1TVU5HX0xQX09QVElPTlM7Ki8KIAlyZXR1cm4gMDsKIH0KLSNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9uZXRwaG9uZS9uZXRwaG9uZS5jIGIvYm9hcmQvbmV0cGhvbmUvbmV0cGhvbmUuYwppbmRleCAyOTdkZTk3Li5jY2M4YjNlIDEwMDY0NAotLS0gYS9ib2FyZC9uZXRwaG9uZS9uZXRwaG9uZS5jCisrKyBiL2JvYXJkL25ldHBob25lL25ldHBob25lLmMKQEAgLTU5Nyw3ICs1OTcsNyBAQAogCXJldHVybiAwOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2xlZ2FjeS5oPgogCmRpZmYgLS1naXQgYS9ib2FyZC9uZXRzdGFyL25hbmQuYyBiL2JvYXJkL25ldHN0YXIvbmFuZC5jCmluZGV4IDc4NTIzNjUuLmQ0N2UxZDggMTAwNjQ0Ci0tLSBhL2JvYXJkL25ldHN0YXIvbmFuZC5jCisrKyBiL2JvYXJkL25ldHN0YXIvbmFuZC5jCkBAIC0yMiw3ICsyMiw3IEBACiAKICNpbmNsdWRlIDxjb21tb24uaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAKICNpbmNsdWRlIDxuYW5kLmg+CiAKZGlmZiAtLWdpdCBhL2JvYXJkL25ldHRhL25ldHRhLmMgYi9ib2FyZC9uZXR0YS9uZXR0YS5jCmluZGV4IDQ5MjNlM2EuLjVhNzVlNTMgMTAwNjQ0Ci0tLSBhL2JvYXJkL25ldHRhL25ldHRhLmMKKysrIGIvYm9hcmQvbmV0dGEvbmV0dGEuYwpAQCAtNTU1LDcgKzU1NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAmJiBkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkgJiYgZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCiAKICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9sZWdhY3kuaD4KIApAQCAtNTcwLDcgKzU3MCw3IEBACiB9CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogCiBpbnQgcGNtY2lhX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2JvYXJkL25ldHRhL3BjbWNpYS5jIGIvYm9hcmQvbmV0dGEvcGNtY2lhLmMKaW5kZXggYTM3MDlmNy4uODZiM2NmYiAxMDA2NDQKLS0tIGEvYm9hcmQvbmV0dGEvcGNtY2lhLmMKKysrIGIvYm9hcmQvbmV0dGEvcGNtY2lhLmMKQEAgLTQsMTEgKzQsMTEgQEAKIAogI3VuZGVmCUNPTkZJR19QQ01DSUEKIAotI2lmCShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogI2RlZmluZQlDT05GSUdfUENNQ0lBCiAjZW5kaWYKIAotI2lmCShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFXzh4eF9QQ0NBUkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFXzh4eF9QQ0NBUkQpCiAjZGVmaW5lCUNPTkZJR19QQ01DSUEKICNlbmRpZgogCkBAIC0yNjQsNyArMjY0LDcgQEAKIH0KIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiBpbnQgcGNtY2lhX2hhcmR3YXJlX2Rpc2FibGUoaW50IHNsb3QpCiB7CiAJdm9sYXRpbGUgaW1tYXBfdAkqaW1tYXA7CkBAIC0yOTEsNyArMjkxLDcgQEAKIAogCXJldHVybiAoMCk7CiB9Ci0jZW5kaWYJLyogQ0ZHX0NNRF9QQ01DSUEgKi8KKyNlbmRpZgogCiAKIGludCBwY21jaWFfdm9sdGFnZV9zZXQoaW50IHNsb3QsIGludCB2Y2MsIGludCB2cHApCmRpZmYgLS1naXQgYS9ib2FyZC9uZXR0YTIvbmV0dGEyLmMgYi9ib2FyZC9uZXR0YTIvbmV0dGEyLmMKaW5kZXggM2NhN2JkMy4uYjIxNmM1YSAxMDA2NDQKLS0tIGEvYm9hcmQvbmV0dGEyL25ldHRhMi5jCisrKyBiL2JvYXJkL25ldHRhMi9uZXR0YTIuYwpAQCAtNTk1LDcgKzU5NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogCiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfbGVnYWN5Lmg+CiAKZGlmZiAtLWdpdCBhL2JvYXJkL25ldHZpYS9uZXR2aWEuYyBiL2JvYXJkL25ldHZpYS9uZXR2aWEuYwppbmRleCAzZTZjNjE2Li44NTZiNzc2IDEwMDY0NAotLS0gYS9ib2FyZC9uZXR2aWEvbmV0dmlhLmMKKysrIGIvYm9hcmQvbmV0dmlhL25ldHZpYS5jCkBAIC00MTYsNyArNDE2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAKICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9sZWdhY3kuaD4KIApkaWZmIC0tZ2l0IGEvYm9hcmQvbzJkbnQvdS1ib290LmxkcyBiL2JvYXJkL28yZG50L3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZGMxMTguLjAwMDAwMDAKLS0tIGEvYm9hcmQvbzJkbnQvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDA1Ci0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzV4eHgvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvb21hcDI0MjBoNC9vbWFwMjQyMGg0LmMgYi9ib2FyZC9vbWFwMjQyMGg0L29tYXAyNDIwaDQuYwppbmRleCBmN2Y3NWUwLi4xYjkxN2IzIDEwMDY0NAotLS0gYS9ib2FyZC9vbWFwMjQyMGg0L29tYXAyNDIwaDQuYworKysgYi9ib2FyZC9vbWFwMjQyMGg0L29tYXAyNDIwaDQuYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgogI2luY2x1ZGUgPGkyYy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9sZWdhY3kuaD4KIGV4dGVybiBzdHJ1Y3QgbmFuZF9jaGlwIG5hbmRfZGV2X2Rlc2NbQ0ZHX01BWF9OQU5EX0RFVklDRV07CiAjZW5kaWYKQEAgLTg0Nyw3ICs4NDcsNyBAQAogCX0KIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiB2b2lkIG5hbmRfaW5pdCh2b2lkKQogewogICAgIGV4dGVybiBmbGFzaF9pbmZvX3QgZmxhc2hfaW5mb1tdOwpkaWZmIC0tZ2l0IGEvYm9hcmQvb3hjL3UtYm9vdC5sZHMgYi9ib2FyZC9veGMvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE1Y2QyZS4uMDAwMDAwMAotLS0gYS9ib2FyZC9veGMvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI0eC9zdGFydC5vCSgudGV4dCkKLSAgICBsaWJfcHBjL2JvYXJkLm8JKC50ZXh0KQotICAgIGxpYl9wcGMvcHBjc3RyaW5nLm8JKC50ZXh0KQotCi0JLiA9IERFRklORUQoZW52X29mZnNldCkgPyBlbnZfb2Zmc2V0IDogLjsKLSAgICBjb21tb24vZW52aXJvbm1lbnQubyAoLnRleHQpCi0KLQkqKC50ZXh0KQotCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvcGNpcHBjMi9wY2lwcGMyLmMgYi9ib2FyZC9wY2lwcGMyL3BjaXBwYzIuYwppbmRleCBhMjE2YzU1Li4xMTQ4YzZhIDEwMDY0NAotLS0gYS9ib2FyZC9wY2lwcGMyL3BjaXBwYzIuYworKysgYi9ib2FyZC9wY2lwcGMyL3BjaXBwYzIuYwpAQCAtMjAyLDcgKzIwMiw3IEBACiAJCWVuYWJsZV9pbnRlcnJ1cHRzICgpOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQlNQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CU1ApCiBpbnQgZG9fd2QgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQogewogCXN3aXRjaCAoYXJnYykgewpAQCAtMjQxLDUgKzI0MSw1IEBACiAJIndkICAgICAgLSBwcmludCBjdXJyZW50IHN0YXR1c1xuIgogKTsKIAotI2VuZGlmCS8qIENGR19DTURfQlNQICovCisjZW5kaWYKICNlbmRpZgkvKiBDT05GSUdfV0FUQ0hET0cgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL3BjczQ0MGVwL2NvbmZpZy5tayBiL2JvYXJkL3BjczQ0MGVwL2NvbmZpZy5tawppbmRleCAzMTljNGZhLi40ZDk0MmViIDEwMDY0NAotLS0gYS9ib2FyZC9wY3M0NDBlcC9jb25maWcubWsKKysrIGIvYm9hcmQvcGNzNDQwZXAvY29uZmlnLm1rCkBAIC0yNSw2ICsyNSw5IEBACiAjIFBDUzQ0MEVQIGJvYXJkCiAjCiAKKyMgQ2hlY2sgdGhlIFUtQm9vdCBJbWFnZSB3aXRoIGEgU0hBMSBjaGVja3N1bQorQUxMICs9ICQob2JqKXUtYm9vdC5zaGExCisKICNURVhUX0JBU0UgPSAweDAwMDAxMDAwCiAKIGlmZXEgKCQocmFtc3ltKSwxKQpkaWZmIC0tZ2l0IGEvYm9hcmQvcGNzNDQwZXAvZmxhc2guYyBiL2JvYXJkL3BjczQ0MGVwL2ZsYXNoLmMKaW5kZXggZWNlNTQ3OC4uYzVhNjJlMiAxMDA2NDQKLS0tIGEvYm9hcmQvcGNzNDQwZXAvZmxhc2guYworKysgYi9ib2FyZC9wY3M0NDBlcC9mbGFzaC5jCkBAIC04Miw3ICs4Miw5IEBACiAJY2FzZSBGTEFTSF9NQU5fQU1EOglwcmludGYgKCJBTUQgIik7CQlicmVhazsKIAljYXNlIEZMQVNIX01BTl9GVUo6CXByaW50ZiAoIkZVSklUU1UgIik7CQlicmVhazsKIAljYXNlIEZMQVNIX01BTl9TU1Q6CXByaW50ZiAoIlNTVCAiKTsJCWJyZWFrOworCWNhc2UgRkxBU0hfTUFOX1NUTToJcHJpbnRmICgiU1QgTWljcm8iKTsJCWJyZWFrOwogCWNhc2UgRkxBU0hfTUFOX0VYQ0VMOglwcmludGYgKCJFeGNlbCBTZW1pY29uZHVjdG9yICIpOyBicmVhazsKKwljYXNlIEZMQVNIX01BTl9NWDoJcHJpbnRmICgiTVhJQyAiKTsgYnJlYWs7CiAJZGVmYXVsdDoJCXByaW50ZiAoIlVua25vd24gVmVuZG9yICIpOwlicmVhazsKIAl9CiAKQEAgLTExNyw2ICsxMTksOCBAQAogCQlicmVhazsKIAljYXNlIEZMQVNIX1NTVDA0MDoJcHJpbnRmICgiU1NUMzlMRi9WRjA0MCAoNCBNYml0LCB1bmlmb3JtIHNlY3RvciBzaXplKVxuIik7CiAJCWJyZWFrOworCWNhc2UgU1RNX0lEX00yOVcwNDBCOglwcmludGYgKCJTVCBNaWNybyBNMjlXMDQwQiAoNCBNYml0LCB1bmlmb3JtIHNlY3RvciBzaXplKVxuIik7CisJCWJyZWFrOwogCWRlZmF1bHQ6CQlwcmludGYgKCJVbmtub3duIENoaXAgVHlwZVxuIik7CiAJCWJyZWFrOwogCX0KQEAgLTE5Miw5ICsxOTYsMTUgQEAKIAljYXNlIChDRkdfRkxBU0hfV09SRF9TSVpFKVNTVF9NQU5VRkFDVDoKIAkJaW5mby0+Zmxhc2hfaWQgPSBGTEFTSF9NQU5fU1NUOwogCQlicmVhazsKKwljYXNlIChDRkdfRkxBU0hfV09SRF9TSVpFKVNUTV9NQU5VRkFDVDoKKwkJaW5mby0+Zmxhc2hfaWQgPSBGTEFTSF9NQU5fU1RNOworCQlicmVhazsKIAljYXNlIChDRkdfRkxBU0hfV09SRF9TSVpFKUVYQ0VMX01BTlVGQUNUOgogCQlpbmZvLT5mbGFzaF9pZCA9IEZMQVNIX01BTl9FWENFTDsKIAkJYnJlYWs7CisJY2FzZSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSlNWF9NQU5VRkFDVDoKKwkJaW5mby0+Zmxhc2hfaWQgPSBGTEFTSF9NQU5fTVg7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfVU5LTk9XTjsKIAkJaW5mby0+c2VjdG9yX2NvdW50ID0gMDsKQEAgLTIyMiw2ICsyMzIsMTEgQEAKIAkJaW5mby0+c2VjdG9yX2NvdW50ID0gODsKIAkJaW5mby0+c2l6ZSA9IDB4MDA4MDAwMDsJCS8qID0+IDAuNSBNQgkqLwogCQlicmVhazsKKwljYXNlIChDRkdfRkxBU0hfV09SRF9TSVpFKVNUTV9JRF9NMjlXMDQwQjoKKwkJaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfQU0wNDA7CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDg7CisJCWluZm8tPnNpemUgPSAweDAwODAwMDA7IC8qID0+IDAsNSBNQiAqLworCQlicmVhazsKIAogCWNhc2UgKENGR19GTEFTSF9XT1JEX1NJWkUpQU1EX0lEX0xWODAwVDoKIAkJaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfQU04MDBUOwpkaWZmIC0tZ2l0IGEvYm9hcmQvcGNzNDQwZXAvaW5pdC5TIGIvYm9hcmQvcGNzNDQwZXAvaW5pdC5TCmluZGV4IDBlZWU0ZDguLjM2YTQwYzkgMTAwNjQ0Ci0tLSBhL2JvYXJkL3BjczQ0MGVwL2luaXQuUworKysgYi9ib2FyZC9wY3M0NDBlcC9pbml0LlMKQEAgLTg3LDI3ICs4NywzMiBAQAogICAgIC5nbG9ibCB0bGJ0YWIKIAogdGxidGFiOgotICAgIHRsYnRhYl9zdGFydAorCXRsYnRhYl9zdGFydAogCi0gICAgLyoKLSAgICAgKiBCT09UX0NTIChGTEFTSCkgbXVzdCBiZSBmaXJzdC4gQmVmb3JlIHJlbG9jYXRpb24gU0FfSSBjYW4gYmUgb2ZmIHRvIHVzZSB0aGUKLSAgICAgKiBzcGVlZCB1cCBib290IHByb2Nlc3MuIEl0IGlzIHBhdGNoZWQgYWZ0ZXIgcmVsb2NhdGlvbiB0byBlbmFibGUgU0FfSQotICAgICAqLwotICAgIHRsYmVudHJ5KCBDRkdfQk9PVF9CQVNFX0FERFIsIFNaXzI1Nk0sIENGR19CT09UX0JBU0VfQUREUiwgMCwgQUNfUnxBQ19XfEFDX1h8U0FfRy8qfFNBX0kqLykKKwkvKgorCSAqIEJPT1RfQ1MgKEZMQVNIKSBtdXN0IGJlIGZpcnN0LiBCZWZvcmUgcmVsb2NhdGlvbiBTQV9JIGNhbiBiZSBvZmYgdG8gdXNlIHRoZQorCSAqIHNwZWVkIHVwIGJvb3QgcHJvY2Vzcy4gSXQgaXMgcGF0Y2hlZCBhZnRlciByZWxvY2F0aW9uIHRvIGVuYWJsZSBTQV9JCisJICovCisJdGxiZW50cnkoIENGR19CT09UX0JBU0VfQUREUiwgU1pfMjU2TSwgQ0ZHX0JPT1RfQkFTRV9BRERSLCAwLCBBQ19SfEFDX1d8QUNfWHxTQV9HLyp8U0FfSSovKQogCi0gICAgLyogVExCLWVudHJ5IGZvciBpbml0LXJhbSBpbiBkY2FjaGUgKFNBX0kgbXVzdCBiZSB0dXJuZWQgb2ZmISkgKi8KLSAgICB0bGJlbnRyeSggQ0ZHX0lOSVRfUkFNX0FERFIsIFNaXzY0SywgQ0ZHX0lOSVRfUkFNX0FERFIsIDAsIEFDX1J8QUNfV3xBQ19YfFNBX0cgKQorCS8qIFRMQi1lbnRyeSBmb3IgaW5pdC1yYW0gaW4gZGNhY2hlIChTQV9JIG11c3QgYmUgdHVybmVkIG9mZiEpICovCisJdGxiZW50cnkoIENGR19JTklUX1JBTV9BRERSLCBTWl82NEssIENGR19JTklUX1JBTV9BRERSLCAwLCBBQ19SfEFDX1d8QUNfWHxTQV9HICkKIAotICAgIHRsYmVudHJ5KCBDRkdfU0RSQU1fQkFTRSwgU1pfMjU2TSwgQ0ZHX1NEUkFNX0JBU0UsIDAsIEFDX1J8QUNfV3xBQ19YfFNBX0d8U0FfSSApCi0gICAgdGxiZW50cnkoIENGR19QQ0lfQkFTRSwgU1pfMjU2TSwgQ0ZHX1BDSV9CQVNFLCAwLCBBQ19SfEFDX1d8U0FfR3xTQV9JICkKKwkvKgorCSAqIFRMQiBlbnRyaWVzIGZvciBTRFJBTSBhcmUgbm90IG5lZWRlZCBvbiB0aGlzIHBsYXRmb3JtLgorCSAqIFRoZXkgYXJlIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBpbiB0aGUgU1BEIEREUiBkZXRlY3Rpb24KKwkgKiByb3V0aW5lLgorCSAqLwogCi0gICAgLyogUENJICovCi0gICAgdGxiZW50cnkoIENGR19QQ0lfTUVNQkFTRSwgU1pfMjU2TSwgQ0ZHX1BDSV9NRU1CQVNFLCAwLCBBQ19SfEFDX1d8U0FfR3xTQV9JICkKLSAgICB0bGJlbnRyeSggQ0ZHX1BDSV9NRU1CQVNFMSwgU1pfMjU2TSwgQ0ZHX1BDSV9NRU1CQVNFMSwgMCwgQUNfUnxBQ19XfFNBX0d8U0FfSSApCi0gICAgdGxiZW50cnkoIENGR19QQ0lfTUVNQkFTRTIsIFNaXzI1Nk0sIENGR19QQ0lfTUVNQkFTRTIsIDAsIEFDX1J8QUNfV3xTQV9HfFNBX0kgKQotICAgIHRsYmVudHJ5KCBDRkdfUENJX01FTUJBU0UzLCBTWl8yNTZNLCBDRkdfUENJX01FTUJBU0UzLCAwLCBBQ19SfEFDX1d8U0FfR3xTQV9JICkKKwl0bGJlbnRyeSggQ0ZHX1BDSV9CQVNFLCBTWl8yNTZNLCBDRkdfUENJX0JBU0UsIDAsIEFDX1J8QUNfV3xTQV9HfFNBX0kgKQogCi0gICAgLyogVVNCIDIuMCBEZXZpY2UgKi8KLSAgICB0bGJlbnRyeSggQ0ZHX1VTQl9ERVZJQ0UsIFNaXzFLLCAweDUwMDAwMDAwLCAwLCBBQ19SfEFDX1d8U0FfR3xTQV9JICkKKwkvKiBQQ0kgKi8KKwl0bGJlbnRyeSggQ0ZHX1BDSV9NRU1CQVNFLCBTWl8yNTZNLCBDRkdfUENJX01FTUJBU0UsIDAsIEFDX1J8QUNfV3xTQV9HfFNBX0kgKQorCXRsYmVudHJ5KCBDRkdfUENJX01FTUJBU0UxLCBTWl8yNTZNLCBDRkdfUENJX01FTUJBU0UxLCAwLCBBQ19SfEFDX1d8U0FfR3xTQV9JICkKKwl0bGJlbnRyeSggQ0ZHX1BDSV9NRU1CQVNFMiwgU1pfMjU2TSwgQ0ZHX1BDSV9NRU1CQVNFMiwgMCwgQUNfUnxBQ19XfFNBX0d8U0FfSSApCisJdGxiZW50cnkoIENGR19QQ0lfTUVNQkFTRTMsIFNaXzI1Nk0sIENGR19QQ0lfTUVNQkFTRTMsIDAsIEFDX1J8QUNfV3xTQV9HfFNBX0kgKQogCi0gICAgdGxidGFiX2VuZAorCS8qIFVTQiAyLjAgRGV2aWNlICovCisJdGxiZW50cnkoIENGR19VU0JfREVWSUNFLCBTWl8xSywgMHg1MDAwMDAwMCwgMCwgQUNfUnxBQ19XfFNBX0d8U0FfSSApCisKKwl0bGJ0YWJfZW5kCmRpZmYgLS1naXQgYS9ib2FyZC9wY3M0NDBlcC9wY3M0NDBlcC5jIGIvYm9hcmQvcGNzNDQwZXAvcGNzNDQwZXAuYwppbmRleCA4ODU4ZjBhLi5lMjQ3ZmVlIDEwMDY0NAotLS0gYS9ib2FyZC9wY3M0NDBlcC9wY3M0NDBlcC5jCisrKyBiL2JvYXJkL3BjczQ0MGVwL3BjczQ0MGVwLmMKQEAgLTIzLDIwICsyMywxMTUgQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPHBwYzR4eC5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxjcmMuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8c3BkX3NkcmFtLmg+CisjaW5jbHVkZSA8c3RhdHVzX2xlZC5oPgorI2luY2x1ZGUgPHNoYTEuaD4KIAogREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CiAKIGV4dGVybiBmbGFzaF9pbmZvX3QgZmxhc2hfaW5mb1tDRkdfTUFYX0ZMQVNIX0JBTktTXTsgLyogaW5mbyBmb3IgRkxBU0ggY2hpcHMJKi8KIAotc3RhdGljIHZvaWQgc2V0X2xlZHMoaW50IHZhbCkKK3Vuc2lnbmVkIGNoYXIJc2hhMV9jaGVja3N1bVtTSEExX1NVTV9MRU5dOworCisvKiBzd2FwIDQgQml0cyAoQml0MCA9IEJpdDMsIEJpdDEgPSBCaXQyLCBCaXQyID0gQml0MSBhbmQgQml0MyA9IEJpdDApICovCit1bnNpZ25lZCBjaGFyIHN3YXBiaXRzWzE2XSA9IHsweDAsIDB4OCwgMHg0LCAweGMsIDB4MiwgMHhhLCAweDYsIDB4ZSwKKwkJCSAgICAgIDB4MSwgMHg5LCAweDUsIDB4ZCwgMHgzLCAweGIsIDB4NywgMHhmfTsKKworc3RhdGljIHZvaWQgc2V0X2xlZHMgKGludCB2YWwpCiB7Ci0JdW5zaWduZWQgY2hhciBsZWRbMTZdID0gezB4MCwgMHg4LCAweDQsIDB4YywgMHgyLCAweGEsIDB4NiwgMHhlLAotCQkJCSAweDEsIDB4OSwgMHg1LCAweGQsIDB4MywgMHhiLCAweDcsIDB4Zn07Ci0Jb3V0MzIoR1BJTzBfT1IsIChpbjMyKEdQSU8wX09SKSAmIH4weDc4MDAwMDAwKSB8IChsZWRbdmFsXSA8PCAyNykpOworCW91dDMyKEdQSU8wX09SLCAoaW4zMiAoR1BJTzBfT1IpICYgfjB4NzgwMDAwMDApIHwgKHZhbCA8PCAyNykpOwogfQogCisjZGVmaW5lIEdFVF9MRURTICgoaW4zMiAoR1BJTzBfT1IpICYgMHg3ODAwMDAwMCkgPj4gMjcpCisKK3ZvaWQgX19sZWRfaW5pdCAobGVkX2lkX3QgbWFzaywgaW50IHN0YXRlKQoreworCWludAl2YWwgPSBHRVRfTEVEUzsKKworCWlmIChzdGF0ZSA9PSBTVEFUVVNfTEVEX09OKQorCQl2YWwgfD0gbWFzazsKKwllbHNlCisJCXZhbCAmPSB+bWFzazsKKwlzZXRfbGVkcyAodmFsKTsKK30KKwordm9pZCBfX2xlZF9zZXQgKGxlZF9pZF90IG1hc2ssIGludCBzdGF0ZSkKK3sKKwlpbnQJdmFsID0gR0VUX0xFRFM7CisKKwlpZiAoc3RhdGUgPT0gU1RBVFVTX0xFRF9PTikKKwkJdmFsIHw9IG1hc2s7CisJZWxzZSBpZiAoc3RhdGUgPT0gU1RBVFVTX0xFRF9PRkYpCisJCXZhbCAmPSB+bWFzazsKKwlzZXRfbGVkcyAodmFsKTsKK30KKwordm9pZCBfX2xlZF90b2dnbGUgKGxlZF9pZF90IG1hc2spCit7CisJaW50CXZhbCA9IEdFVF9MRURTOworCisJdmFsIF49IG1hc2s7CisJc2V0X2xlZHMgKHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0YXR1c19sZWRfYmxpbmsgKHZvaWQpCit7CisJaW50CWk7CisJaW50CXZhbCA9IEdFVF9MRURTOworCisJLyogc2V0IGFsbCBMRUQgd2hpY2ggYXJlIG9uLCB0byBzdGF0ZSBCTElOS0lORyAqLworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJaWYgKHZhbCAmIDB4MDEpIHN0YXR1c19sZWRfc2V0ICgzIC0gaSwgU1RBVFVTX0xFRF9CTElOS0lORyk7CisJCWVsc2Ugc3RhdHVzX2xlZF9zZXQgKDMgLSBpLCBTVEFUVVNfTEVEX09GRik7CisJCXZhbCA9IHZhbCA+PiAxOworCX0KK30KKworI2lmIGRlZmluZWQoQ09ORklHX1NIT1dfQk9PVF9QUk9HUkVTUykKK3ZvaWQgc2hvd19ib290X3Byb2dyZXNzIChpbnQgdmFsKQoreworCS8qIGZpbmQgYWxsIHZhbGlkIENvZGVzIGZvciB2YWwgaW4gUkVBRE1FICovCisJaWYgKHZhbCA9PSAtMzApIHJldHVybjsKKwlpZiAodmFsIDwgMCkgeworCQkvKiBzbXRoaW5nIGdvZXMgd3JvbmcgKi8KKwkJc3RhdHVzX2xlZF9ibGluayAoKTsKKwkJcmV0dXJuOworCX0KKwlzd2l0Y2ggKHZhbCkgeworCQljYXNlIDE6CisJCQkvKiB2YWxpZGF0aW5nIEltYWdlICovCisJCQlzdGF0dXNfbGVkX3NldCAoMCwgU1RBVFVTX0xFRF9PRkYpOworCQkJc3RhdHVzX2xlZF9zZXQgKDEsIFNUQVRVU19MRURfT04pOworCQkJc3RhdHVzX2xlZF9zZXQgKDIsIFNUQVRVU19MRURfT04pOworCQkJYnJlYWs7CisJCWNhc2UgMTU6CisJCQkvKiBib290aW5nICovCisJCQlzdGF0dXNfbGVkX3NldCAoMCwgU1RBVFVTX0xFRF9PTik7CisJCQlzdGF0dXNfbGVkX3NldCAoMSwgU1RBVFVTX0xFRF9PTik7CisJCQlzdGF0dXNfbGVkX3NldCAoMiwgU1RBVFVTX0xFRF9PTik7CisJCQlicmVhazsKKyNpZiAwCisJCWNhc2UgNjQ6CisJCQkvKiBzdGFydGluZyBFdGhlcm5ldCBjb25maWd1cmF0aW9uICovCisJCQlzdGF0dXNfbGVkX3NldCAoMCwgU1RBVFVTX0xFRF9PRkYpOworCQkJc3RhdHVzX2xlZF9zZXQgKDEsIFNUQVRVU19MRURfT0ZGKTsKKwkJCXN0YXR1c19sZWRfc2V0ICgyLCBTVEFUVVNfTEVEX09OKTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgODA6CisJCQkvKiBsb2FkaW5nIEltYWdlICovCisJCQlzdGF0dXNfbGVkX3NldCAoMCwgU1RBVFVTX0xFRF9PTik7CisJCQlzdGF0dXNfbGVkX3NldCAoMSwgU1RBVFVTX0xFRF9PRkYpOworCQkJc3RhdHVzX2xlZF9zZXQgKDIsIFNUQVRVU19MRURfT04pOworCQkJYnJlYWs7CisJfQorfQorI2VuZGlmCisKIGludCBib2FyZF9lYXJseV9pbml0X2Yodm9pZCkKIHsKIAlyZWdpc3RlciB1aW50IHJlZzsKQEAgLTg1LDYgKzE4MCwyNjYgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2RlZmluZSBFRVBST01fTEVOCTI1Ngordm9pZCBsb2FkX3Nlcm51bV9ldGhhZGRyICh2b2lkKQoreworCWludAlyZXQ7CisJY2hhcglidWZbRUVQUk9NX0xFTl07CisJY2hhcgltYWNbMzJdOworCWNoYXIJKnVzZV9lZXByb207CisJdTE2CWNoZWNrc3VtY3JjMTYgPSAwOworCisJLyogcmVhZCB0aGUgTUFDcyBmcm9tIEVFcHJvbSAqLworCXN0YXR1c19sZWRfc2V0ICgwLCBTVEFUVVNfTEVEX09OKTsKKwlzdGF0dXNfbGVkX3NldCAoMSwgU1RBVFVTX0xFRF9PTik7CisJcmV0ID0gZWVwcm9tX3JlYWQgKENGR19JMkNfRUVQUk9NX0FERFIsIDAsICh1Y2hhciAqKWJ1ZiwgRUVQUk9NX0xFTik7CisJaWYgKHJldCA9PSAwKSB7CisJCWNoZWNrc3VtY3JjMTYgPSBjeWdfY3JjMTYgKCh1Y2hhciAqKWJ1ZiwgRUVQUk9NX0xFTiAtIDIpOworCQkvKiBjaGVjaywgaWYgdGhlIEVFcHJvbSBpcyBwcm9ncmFtbWVkOgorCQkgKiAtIFRoZSBQcmVmaXgoQnl0ZSAwLDEsMikgaXMgZXF1YWwgdG8gIkFUUiIKKwkJICogLSBUaGUgY2hlY2tzdW0sIHN0b3JlZCBpbiB0aGUgbGFzdCAyIEJ5dGVzLCBpcyBjb3JyZWN0CisJCSAqLworCQlpZiAoKHN0cm5jbXAgKGJ1ZiwiQVRSIiwzKSAhPSAwKSB8fAorCQkgICAgKChjaGVja3N1bWNyYzE2ID4+IDgpICE9IGJ1ZltFRVBST01fTEVOIC0gMl0pIHx8CisJCSAgICAoKGNoZWNrc3VtY3JjMTYgJiAweGZmKSAhPSBidWZbRUVQUk9NX0xFTiAtIDFdKSkgeworCQkJLyogRUVwcm9tIGlzIG5vdCBwcm9ncmFtbWVkICovCisJCQlwcmludGYoIiVzOiBFRVBST00gQ2hlY2tzdW0gbm90IE9LXG4iLCBfX0ZVTkNUSU9OX18pOworCQl9IGVsc2UgeworCQkJLyogZ2V0IHRoZSBNQUNzICovCisJCQlzcHJpbnRmIChtYWMsICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCisJCQkJYnVmWzNdLAorCQkJCWJ1Zls0XSwKKwkJCQlidWZbNV0sCisJCQkJYnVmWzZdLAorCQkJCWJ1Zls3XSwKKwkJCQlidWZbOF0pOworCQkJc2V0ZW52ICgiZXRoYWRkciIsIChjaGFyICopIG1hYyk7CisJCQlzcHJpbnRmIChtYWMsICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCisJCQkJYnVmWzldLAorCQkJCWJ1ZlsxMF0sCisJCQkJYnVmWzExXSwKKwkJCQlidWZbMTJdLAorCQkJCWJ1ZlsxM10sCisJCQkJYnVmWzE0XSk7CisJCQlzZXRlbnYgKCJldGgxYWRkciIsIChjaGFyICopIG1hYyk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBzb21lIGVycm9yIHJlYWRpbmcgdGhlIEVFcHJvbSAqLworCWlmICgodXNlX2VlcHJvbSA9IGdldGVudiAoInVzZV9lZXByb21fZXRoYWRkciIpKSA9PSBOVUxMKSB7CisJCS8qIGRvbnQgdXNlIGJvb3RjbWQgKi8KKwkJc2V0ZW52KCJib290ZGVsYXkiLCAiLTEiKTsKKwkJcmV0dXJuOworCX0KKwkvKiA9PSBkZWZhdWx0ID8gdXNlIHN0YW5kYXJkICovCisJaWYgKHN0cm5jbXAgKHVzZV9lZXByb20sICJkZWZhdWx0IiwgNykgPT0gMCkgeworCQlyZXR1cm47CisJfQorCS8qIEVudiBkb2VzbnQgZXhpc3QgLT4gaGFuZyAqLworCXN0YXR1c19sZWRfYmxpbmsgKCk7CisJLyogaGVyZSB3ZSBkbyB0aGlzICJoYW5keSIgYmVjYXVzZSB3ZSBoYXZlIG5vIGludGVycnVwdHMKKwkgICBhdCB0aGlzIHRpbWUgKi8KKwlwdXRzICgiIyMjIEVFUFJPTSBFUlJPUiAjIyMgUGxlYXNlIFJFU0VUIHRoZSBib2FyZCAjIyNcbiIpOworCWZvciAoOzspIHsKKwkJX19sZWRfdG9nZ2xlICgxMik7CisJCXVkZWxheSAoMTAwMDAwKTsKKwl9CisJcmV0dXJuOworfQorCisjaWZkZWYgQ09ORklHX1BSRUJPT1QKKworc3RhdGljIHVjaGFyIGtiZF9tYWdpY19wcmVmaXhbXQkJPSAia2V5X21hZ2ljIjsKK3N0YXRpYyB1Y2hhciBrYmRfY29tbWFuZF9wcmVmaXhbXQk9ICJrZXlfY21kIjsKKworc3RydWN0IGtiZF9kYXRhX3QgeworCWNoYXIgczE7CisJY2hhciBzMjsKK307CisKK3N0cnVjdCBrYmRfZGF0YV90KiBnZXRfa2V5cyAoc3RydWN0IGtiZF9kYXRhX3QgKmtiZF9kYXRhKQoreworCWNoYXIgKnZhbDsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCS8qIHVzZSB0aGUgRElQcyBmb3Igc29tZSBib290b3B0aW9ucyAqLworCXZhbCA9IGdldGVudiAoRU5WX05BTUVfRElQKTsKKwl0bXAgPSBzaW1wbGVfc3RydG91bCAodmFsLCBOVUxMLCAxNik7CisKKwlrYmRfZGF0YS0+czIgPSAodG1wICYgMHgwZik7CisJa2JkX2RhdGEtPnMxID0gKHRtcCAmIDB4ZjApID4+IDQ7CisJcmV0dXJuIGtiZF9kYXRhOworfQorCitzdGF0aWMgaW50IGNvbXBhcmVfbWFnaWMgKGNvbnN0IHN0cnVjdCBrYmRfZGF0YV90ICprYmRfZGF0YSwgY2hhciAqc3RyKQoreworCWNoYXIgczEgPSBzdHJbMF07CisKKwlpZiAoczEgPj0gJzAnICYmIHMxIDw9ICc5JykKKwkJczEgLT0gJzAnOworCWVsc2UgaWYgKHMxID49ICdhJyAmJiBzMSA8PSAnZicpCisJCXMxID0gczEgLSAnYScgKyAxMDsKKwllbHNlIGlmIChzMSA+PSAnQScgJiYgczEgPD0gJ0YnKQorCQlzMSA9IHMxIC0gJ0EnICsgMTA7CisJZWxzZQorCQlyZXR1cm4gLTE7CisKKwlpZiAoczEgIT0ga2JkX2RhdGEtPnMxKSByZXR1cm4gLTE7CisKKwlzMSA9IHN0clsxXTsKKwlpZiAoczEgPj0gJzAnICYmIHMxIDw9ICc5JykKKwkJczEgLT0gJzAnOworCWVsc2UgaWYgKHMxID49ICdhJyAmJiBzMSA8PSAnZicpCisJCXMxID0gczEgLSAnYScgKyAxMDsKKwllbHNlIGlmIChzMSA+PSAnQScgJiYgczEgPD0gJ0YnKQorCQlzMSA9IHMxIC0gJ0EnICsgMTA7CisJZWxzZQorCQlyZXR1cm4gLTE7CisKKwlpZiAoczEgIT0ga2JkX2RhdGEtPnMyKSByZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyICprZXlfbWF0Y2ggKGNvbnN0IHN0cnVjdCBrYmRfZGF0YV90ICprYmRfZGF0YSkKK3sKKwljaGFyIG1hZ2ljW3NpemVvZiAoa2JkX21hZ2ljX3ByZWZpeCkgKyAxXTsKKwljaGFyICpzdWZmaXg7CisJY2hhciAqa2JkX21hZ2ljX2tleXM7CisKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgc3RyaW5nIGRlZmluZXMgdGhlIGNoYXJhY3RlcnMgdGhhdCBjYW4gYmUgYXBwZW5kZWQKKwkgKiB0byAia2V5X21hZ2ljIiB0byBmb3JtIHRoZSBuYW1lcyBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdAorCSAqIGhvbGQgIm1hZ2ljIiBrZXkgY29kZXMsIGkuIGUuIHN1Y2gga2V5IGNvZGVzIHRoYXQgY2FuIGNhdXNlCisJICogcHJlLWJvb3QgYWN0aW9ucy4gSWYgdGhlIHN0cmluZyBpcyBlbXB0eSAoIiIpLCB0aGVuIG9ubHkKKwkgKiAia2V5X21hZ2ljIiBpcyBjaGVja2VkIChvbGQgYmVoYXZpb3VyKTsgdGhlIHN0cmluZyAiMTI1IiBjYXVzZXMKKwkgKiBjaGVja3MgZm9yICJrZXlfbWFnaWMxIiwgImtleV9tYWdpYzIiIGFuZCAia2V5X21hZ2ljNSIsIGV0Yy4KKwkgKi8KKwlpZiAoKGtiZF9tYWdpY19rZXlzID0gZ2V0ZW52ICgibWFnaWNfa2V5cyIpKSA9PSBOVUxMKQorCQlrYmRfbWFnaWNfa2V5cyA9ICIiOworCisJLyogbG9vcCBvdmVyIGFsbCBtYWdpYyBrZXlzOworCSAqIHVzZSAnXDAnIHN1ZmZpeCBpbiBjYXNlIG9mIGVtcHR5IHN0cmluZworCSAqLworCWZvciAoc3VmZml4ID0ga2JkX21hZ2ljX2tleXM7ICpzdWZmaXggfHwKKwkJICAgICBzdWZmaXggPT0ga2JkX21hZ2ljX2tleXM7ICsrc3VmZml4KSB7CisJCXNwcmludGYgKG1hZ2ljLCAiJXMlYyIsIGtiZF9tYWdpY19wcmVmaXgsICpzdWZmaXgpOworCQlpZiAoY29tcGFyZV9tYWdpYyAoa2JkX2RhdGEsIGdldGVudiAobWFnaWMpKSA9PSAwKSB7CisJCQljaGFyIGNtZF9uYW1lW3NpemVvZiAoa2JkX2NvbW1hbmRfcHJlZml4KSArIDFdOworCQkJY2hhciAqY21kOworCisJCQlzcHJpbnRmIChjbWRfbmFtZSwgIiVzJWMiLCBrYmRfY29tbWFuZF9wcmVmaXgsICpzdWZmaXgpOworCQkJY21kID0gZ2V0ZW52IChjbWRfbmFtZSk7CisKKwkJCXJldHVybiAoY21kKTsKKwkJfQorCX0KKwlyZXR1cm4gKE5VTEwpOworfQorCisjZW5kaWYgLyogQ09ORklHX1BSRUJPT1QgKi8KKworc3RhdGljIGludCBwY3M0NDBlcF9yZWFkaW5wdXRzICh2b2lkKQoreworCWludAlpOworCWNoYXIJdmFsdWVbMjBdOworCisJLyogcmVhZCB0aGUgaW5wdXRzIGFuZCBzZXQgdGhlIEVudnZhcnMgKi8KKwkvKiBSZXZpc2lvbiBMZXZlbCBCaXQgMjYgLSAyOSAqLworCWkgPSAoKGluMzIgKEdQSU8wX0lSKSAmIDB4MDAwMDAwM2MpID4+IDIpOworCWkgPSBzd2FwYml0c1tpXTsKKwlzcHJpbnRmICh2YWx1ZSwgIiUwMngiLCBpKTsKKwlzZXRlbnYgKEVOVl9OQU1FX1JFVkxFViwgdmFsdWUpOworCS8qIFNvbGRlciBTd2l0Y2ggQml0IDMwIC0gMzMgKi8KKwlpID0gKGluMzIgKEdQSU8wX0lSKSAmIDB4MDAwMDAwMDMpIDw8IDI7CisJaSArPSAoaW4zMiAoR1BJTzFfSVIpICYgMHhjMDAwMDAwMCkgPj4gMzA7CisJaSA9IHN3YXBiaXRzW2ldOworCXNwcmludGYgKHZhbHVlLCAiJTAyeCIsIGkpOworCXNldGVudiAoRU5WX05BTUVfU09MREVSLCB2YWx1ZSk7CisJLyogRElQIFN3aXRjaCBCaXQgNDkgLSA1NiAqLworCWkgPSAoKGluMzIgKEdQSU8xX0lSKSAmIDB4MDAwMDdmODApID4+IDcpOworCWkgPSAoc3dhcGJpdHNbaSAmIDB4MGZdIDw8IDQpICsgc3dhcGJpdHNbKGkgJiAweGYwKSA+PiA0XTsKKwlzcHJpbnRmICh2YWx1ZSwgIiUwMngiLCBpKTsKKwlzZXRlbnYgKEVOVl9OQU1FX0RJUCwgdmFsdWUpOworCXJldHVybiAwOworfQorCisKKyNpZiBkZWZpbmVkKENPTkZJR19TSEExX0NIRUNLX1VCX0lNRykKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjYWxjdWxhdGUgYSBTSEExIHN1bSBmb3IgdGhlIFUtQm9vdCBpbWFnZSBpbiBGbGFzaC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBwY3M0NDBlcF9zaGExIChpbnQgZG9jaGVjaykKK3sKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCXVuc2lnbmVkIGNoYXIgKnB0cm9mZjsKKwl1bnNpZ25lZCBjaGFyIG91dHB1dFsyMF07CisJdW5zaWduZWQgY2hhciBvcmdbMjBdOworCWludAlpLCBsZW4gPSBDT05GSUdfU0hBMV9MRU47CisKKwltZW1jcHkgKChjaGFyICopQ0ZHX0xPQURfQUREUiwgKGNoYXIgKilDT05GSUdfU0hBMV9TVEFSVCwgbGVuKTsKKwlkYXRhID0gKHVuc2lnbmVkIGNoYXIgKilDRkdfTE9BRF9BRERSOworCXB0cm9mZiA9ICZkYXRhW2xlbiArIFNIQTFfU1VNX1BPU107CisKKwlmb3IgKGkgPSAwOyBpIDwgU0hBMV9TVU1fTEVOOyBpKyspIHsKKwkJb3JnW2ldID0gcHRyb2ZmW2ldOworCQlwdHJvZmZbaV0gPSAwOworCX0KKworCXNoYTFfY3N1bSAoKHVuc2lnbmVkIGNoYXIgKikgZGF0YSwgbGVuLCAodW5zaWduZWQgY2hhciAqKW91dHB1dCk7CisKKwlpZiAoZG9jaGVjayA9PSAyKSB7CisJCWZvciAoaSA9IDA7IGkgPCAyMCA7IGkrKykgeworCQkJcHJpbnRmKCIlMDJYICIsIG91dHB1dFtpXSk7CisJCX0KKwkJcHJpbnRmKCJcbiIpOworCX0KKwlpZiAoZG9jaGVjayA9PSAxKSB7CisJCWZvciAoaSA9IDA7IGkgPCAyMCA7IGkrKykgeworCQkJaWYgKG9yZ1tpXSAhPSBvdXRwdXRbaV0pIHJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZG8gc29tZSBjaGVja3MgYWZ0ZXIgdGhlIFNIQTEgY2hlY2tzdW0gZnJvbSB0aGUgVS1Cb290IEltYWdlIHdhcworICogY2FsY3VsYXRlZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcGNzNDQwZXBfY2hlY2tzaGExICh2b2lkKQoreworCWludAlyZXQ7CisJY2hhcgkqY3NfdGVzdDsKKworCXN0YXR1c19sZWRfc2V0ICgwLCBTVEFUVVNfTEVEX09GRik7CisJc3RhdHVzX2xlZF9zZXQgKDEsIFNUQVRVU19MRURfT0ZGKTsKKwlzdGF0dXNfbGVkX3NldCAoMiwgU1RBVFVTX0xFRF9PTik7CisJcmV0ID0gcGNzNDQwZXBfc2hhMSAoMSk7CisJaWYgKHJldCA9PSAwKSByZXR1cm47CisKKwlpZiAoKGNzX3Rlc3QgPSBnZXRlbnYgKCJjc190ZXN0IikpID09IE5VTEwpIHsKKwkJLyogRW52IGRvZXNudCBleGlzdCAtPiBoYW5nICovCisJCXN0YXR1c19sZWRfYmxpbmsgKCk7CisJCS8qIGhlcmUgd2UgZG8gdGhpcyAiaGFuZHkiIGJlY2F1c2Ugd2UgaGF2ZSBubyBpbnRlcnJ1cHRzCisJCSAgIGF0IHRoaXMgdGltZSAqLworCQlwdXRzICgiIyMjIFNIQTEgRVJST1IgIyMjIFBsZWFzZSBSRVNFVCB0aGUgYm9hcmQgIyMjXG4iKTsKKwkJZm9yICg7OykgeworCQkJX19sZWRfdG9nZ2xlICgyKTsKKwkJCXVkZWxheSAoMTAwMDAwKTsKKwkJfQorCX0KKworCWlmIChzdHJuY21wIChjc190ZXN0LCAib2ZmIiwgMykgPT0gMCkgeworCQlwcmludGYgKCJTSEExIFUtQm9vdCBzdW0gTk9UIG9rIVxuIik7CisJCXNldGVudiAoImJvb3RkZWxheSIsICItMSIpOworCX0KK30KKyNlbHNlCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHBjczQ0MGVwX2NoZWNrc2hhMSAodm9pZCkgeyBkbyB7fSB3aGlsZSAoMCk7fQorI2VuZGlmCisKIGludCBtaXNjX2luaXRfciAodm9pZCkKIHsKIAl1aW50IHBiY3I7CkBAIC0xMzksNiArNDk0LDE4IEBACiAJCQkgICAgQ0ZHX0VOVl9BRERSX1JFRFVORCArIDIqQ0ZHX0VOVl9TRUNUX1NJWkUgLSAxLAogCQkJICAgICZmbGFzaF9pbmZvWzFdKTsKIAorCXBjczQ0MGVwX3JlYWRpbnB1dHMgKCk7CisJcGNzNDQwZXBfY2hlY2tzaGExICgpOworI2lmZGVmIENPTkZJR19QUkVCT09UCisJeworCQlzdHJ1Y3Qga2JkX2RhdGFfdCBrYmRfZGF0YTsKKwkJLyogRGVjb2RlIGtleXMgKi8KKwkJY2hhciAqc3RyID0gc3RyZHVwIChrZXlfbWF0Y2ggKGdldF9rZXlzICgma2JkX2RhdGEpKSk7CisJCS8qIFNldCBvciBkZWxldGUgZGVmaW5pdGlvbiAqLworCQlzZXRlbnYgKCJwcmVib290Iiwgc3RyKTsKKwkJZnJlZSAoc3RyKTsKKwl9CisjZW5kaWYgLyogQ09ORklHX1BSRUJPT1QgKi8KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU2LDEzICs1MjMsMzEgQEAKIAlyZXR1cm4gKDApOwogfQogCit2b2lkIHNwZF9kZHJfaW5pdF9oYW5nICh2b2lkKQoreworCXN0YXR1c19sZWRfc2V0ICgwLCBTVEFUVVNfTEVEX09GRik7CisJc3RhdHVzX2xlZF9zZXQgKDEsIFNUQVRVU19MRURfT04pOworCS8qIHdlIGNhbm5vdCB1c2UgaGFuZygpIGJlY2F1c2Ugd2UgYXJlIHN0aWxsIHJ1bm5pbmcgZnJvbQorCSAgIEZsYXNoLCBhbmQgc28gdGhlIHN0YXR1c19sZWQgZHJpdmVyIGlzIG5vdCBpbml0aWFsaXplZCAqLworCXB1dHMgKCIjIyMgU0RSQU0gRVJST1IgIyMjIFBsZWFzZSBSRVNFVCB0aGUgYm9hcmQgIyMjXG4iKTsKKwlmb3IgKDs7KSB7CisJCV9fbGVkX3RvZ2dsZSAoNCk7CisJCXVkZWxheSAoMTAwMDAwKTsKKwl9Cit9CisKIGxvbmcgaW50IGluaXRkcmFtIChpbnQgYm9hcmRfdHlwZSkKIHsKIAlsb25nIGRyYW1fc2l6ZSA9IDA7CiAKLQlzZXRfbGVkcygxKTsJCQkvKiBkaXNwbGF5IGJvb3QgaW5mbyBjb3VudGVyICovCisJc3RhdHVzX2xlZF9zZXQgKDAsIFNUQVRVU19MRURfT04pOworCXN0YXR1c19sZWRfc2V0ICgxLCBTVEFUVVNfTEVEX09GRik7CiAJZHJhbV9zaXplID0gc3BkX3NkcmFtKCk7Ci0Jc2V0X2xlZHMoMik7CQkJLyogZGlzcGxheSBib290IGluZm8gY291bnRlciAqLworCXN0YXR1c19sZWRfc2V0ICgwLCBTVEFUVVNfTEVEX09GRik7CisJc3RhdHVzX2xlZF9zZXQgKDEsIFNUQVRVU19MRURfT04pOworCWlmIChkcmFtX3NpemUgPT0gMCkgeworCQloYW5nKCk7CisJfQogCiAJcmV0dXJuIGRyYW1fc2l6ZTsKIH0KQEAgLTIxNyw3ICs2MDIsNyBAQAogICoJY2VydGFpbiBwcmUtaW5pdGlhbGl6YXRpb24gYWN0aW9ucy4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmIGRlZmluZWQoQ09ORklHX1BDSSkgJiYgZGVmaW5lZChDRkdfUENJX1BSRV9JTklUKQorI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKIGludCBwY2lfcHJlX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQogewogCXVuc2lnbmVkIGxvbmcgYWRkcjsKQEAgLTI1OCw3ICs2NDMsNyBAQAogCiAJcmV0dXJuIDE7CiB9Ci0jZW5kaWYJCQkJLyogZGVmaW5lZChDT05GSUdfUENJKSAmJiBkZWZpbmVkKENGR19QQ0lfUFJFX0lOSVQpICovCisjZW5kaWYJLyogZGVmaW5lZChDT05GSUdfUENJKSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogIHBjaV90YXJnZXRfaW5pdApAQCAtMzc3LDMgKzc2MiwxMzIgQEAKIAogfQogI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAibGVkIiBDb21tYW5kbyBmb3IgdGhlIFUtQm9vdCBzaGVsbAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZG9fbGVkIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQJcmNvZGUgPSAwLCBpOworCXVsb25nCXBhdHRlcm4gPSAwOworCisJcGF0dGVybiA9IHNpbXBsZV9zdHJ0b3VsIChhcmd2WzFdLCBOVUxMLCAxNik7CisJaWYgKHBhdHRlcm4gPiAweDQwMCkgeworCQlpbnQJdmFsID0gR0VUX0xFRFM7CisJCXByaW50ZiAoImxlZDogJXhcbiIsIHZhbCk7CisJCXJldHVybiByY29kZTsKKwl9CisJaWYgKHBhdHRlcm4gPiAweDIwMCkgeworCQlzdGF0dXNfbGVkX2JsaW5rICgpOworCQloYW5nICgpOworCQlyZXR1cm4gcmNvZGU7CisJfQorCWlmIChwYXR0ZXJuID4gMHgxMDApIHsKKwkJc3RhdHVzX2xlZF9ibGluayAoKTsKKwkJcmV0dXJuIHJjb2RlOworCX0KKwlwYXR0ZXJuICY9IDB4MGY7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlpZiAocGF0dGVybiAmIDB4MDEpIHN0YXR1c19sZWRfc2V0IChpLCBTVEFUVVNfTEVEX09OKTsKKwkJZWxzZSBzdGF0dXNfbGVkX3NldCAoaSwgU1RBVFVTX0xFRF9PRkYpOworCQlwYXR0ZXJuID0gcGF0dGVybiA+PiAxOworCX0KKwlyZXR1cm4gcmNvZGU7Cit9CisKK1VfQk9PVF9DTUQoCisgCWxlZCwJMiwJMSwJZG9fbGVkLAorIAkibGVkIFtiaXRtYXNrXSAgIC0gc2V0IHRoZSBESUFHLUxFRFxuIiwKKwkiW2JpdG1hc2tdIDB4MDEgPSBESUFHIDEgb25cbiIKKwkiICAgICAgICAgICAgICAweDAyID0gRElBRyAyIG9uXG4iCisJIiAgICAgICAgICAgICAgMHgwNCA9IERJQUcgMyBvblxuIgorCSIgICAgICAgICAgICAgIDB4MDggPSBESUFHIDQgb25cbiIKKwkiICAgICAgICAgICAgICA+IDB4MTAwIHNldCB0aGUgTEVELCB3aG8gYXJlIG9uLCB0byBzdGF0ZSBibGlua2luZ1xuIgorKTsKKworI2lmIGRlZmluZWQoQ09ORklHX1NIQTFfQ0hFQ0tfVUJfSU1HKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICJzaGExIiBDb21tYW5kbyBmb3IgdGhlIFUtQm9vdCBzaGVsbAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZG9fc2hhMSAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50CXJjb2RlID0gLTE7CisKKwlpZiAoYXJnYyA8IDIpIHsKKyAgdXNhZ2U6CisJCXByaW50ZiAoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CisJCXJldHVybiAxOworCX0KKworCWlmIChhcmdjID49IDMpIHsKKwkJdW5zaWduZWQgY2hhciAqZGF0YTsKKwkJdW5zaWduZWQgY2hhciBvdXRwdXRbMjBdOworCQlpbnQJbGVuOworCQlpbnQJaTsKKworCQlkYXRhID0gKHVuc2lnbmVkIGNoYXIgKilzaW1wbGVfc3RydG91bCAoYXJndlsxXSwgTlVMTCwgMTYpOworCQlsZW4gPSBzaW1wbGVfc3RydG91bCAoYXJndlsyXSwgTlVMTCwgMTYpOworCQlzaGExX2NzdW0gKGRhdGEsIGxlbiwgKHVuc2lnbmVkIGNoYXIgKilvdXRwdXQpOworCQlwcmludGYgKCJVLUJvb3Qgc3VtOlxuIik7CisJCWZvciAoaSA9IDA7IGkgPCAyMCA7IGkrKykgeworCQkJcHJpbnRmICgiJTAyWCAiLCBvdXRwdXRbaV0pOworCQl9CisJCXByaW50ZiAoIlxuIik7CisJCWlmIChhcmdjID09IDQpIHsKKwkJCWRhdGEgPSAodW5zaWduZWQgY2hhciAqKXNpbXBsZV9zdHJ0b3VsIChhcmd2WzNdLCBOVUxMLCAxNik7CisJCQltZW1jcHkgKGRhdGEsIG91dHB1dCwgMjApOworCQl9CisJCXJldHVybiAwOworCX0KKwlpZiAoYXJnYyA9PSAyKSB7CisJCWNoYXIgKnB0ciA9IGFyZ3ZbMV07CisJCWlmICgqcHRyICE9ICctJykgZ290byB1c2FnZTsKKwkJcHRyKys7CisJCWlmICgoKnB0ciA9PSAnYycpIHx8ICgqcHRyID09ICdDJykpIHsKKwkJCXJjb2RlID0gcGNzNDQwZXBfc2hhMSAoMSk7CisJCQlwcmludGYgKCJTSEExIFUtQm9vdCBzdW0gJXNvayFcbiIsIChyY29kZSAhPSAwKSA/ICJub3QgIiA6ICIiKTsKKwkJfSBlbHNlIGlmICgoKnB0ciA9PSAncCcpIHx8ICgqcHRyID09ICdQJykpIHsKKwkJCXJjb2RlID0gcGNzNDQwZXBfc2hhMSAoMik7CisJCX0gZWxzZSB7CisJCQlyY29kZSA9IHBjczQ0MGVwX3NoYTEgKDApOworCQl9CisJCXJldHVybiByY29kZTsKKwl9CisJcmV0dXJuIHJjb2RlOworfQorCitVX0JPT1RfQ01EKAorIAlzaGExLAk0LAkxLAlkb19zaGExLAorIAkic2hhMSAgICAtIGNhbGN1bGF0ZSB0aGUgU0hBMSBTdW1cbiIsCisJImFkZHJlc3MgbGVuIFthZGRyXSAgY2FsY3VsYXRlIHRoZSBTSEExIHN1bSBbc2F2ZSBhdCBhZGRyXVxuIgorCSIgICAgIC1wIGNhbGN1bGF0ZSB0aGUgU0hBMSBzdW0gZnJvbSB0aGUgVS1Cb290IGltYWdlIGluIGZsYXNoIGFuZCBwcmludFxuIgorCSIgICAgIC1jIGNoZWNrIHRoZSBVLUJvb3QgaW1hZ2UgaW4gZmxhc2hcbiIKKyk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19JREVfUFJFSU5JVAoraW50IGlkZV9wcmVpbml0ICh2b2lkKQoreworCS8qIFNldCBUcnVlIElERSBNb2RlICovCisJb3V0MzIgKEdQSU8wX09SLCAoaW4zMiAoR1BJTzBfT1IpIHwgMHgwMDEwMDAwMCkpOworCW91dDMyIChHUElPMF9PUiwgKGluMzIgKEdQSU8wX09SKSB8IDB4MDAyMDAwMDApKTsKKwlvdXQzMiAoR1BJTzFfT1IsIChpbjMyIChHUElPMV9PUikgJiB+MHgwMDAwODA0MCkpOworCXVkZWxheSAoMTAwMDAwKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpCit2b2lkIGlkZV9zZXRfcmVzZXQgKGludCBpZGVyZXNldCkKK3sKKwlkZWJ1ZyAoImlkZV9yZXNldCglZClcbiIsIGlkZXJlc2V0KTsKKwlpZiAoaWRlcmVzZXQgPT0gMCkgeworCQlvdXQzMiAoR1BJTzBfT1IsIChpbjMyIChHUElPMF9PUikgfCAweDAwMjAwMDAwKSk7CisJfSBlbHNlIHsKKwkJb3V0MzIgKEdQSU8wX09SLCAoaW4zMiAoR1BJTzBfT1IpICYgfjB4MDAyMDAwMDApKTsKKwl9CisJdWRlbGF5ICgxMDAwMCk7Cit9CisjZW5kaWYgLyogZGVmaW5lZCAoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpICovCmRpZmYgLS1naXQgYS9ib2FyZC9wY3M0NDBlcC91LWJvb3QubGRzIGIvYm9hcmQvcGNzNDQwZXAvdS1ib290LmxkcwppbmRleCA2YWI0NzZhLi42NTA2Y2NkIDEwMDY0NAotLS0gYS9ib2FyZC9wY3M0NDBlcC91LWJvb3QubGRzCisrKyBiL2JvYXJkL3BjczQ0MGVwL3UtYm9vdC5sZHMKQEAgLTY1LDYgKzY1LDcgQEAKICAgewogICAgIGNwdS9wcGM0eHgvc3RhcnQubwkoLnRleHQpCiAgICAgYm9hcmQvcGNzNDQwZXAvaW5pdC5vCSgudGV4dCkKKyAgICBsaWJfZ2VuZXJpYy9zaGExLm8JCSgudGV4dCkKIAogICAgICooLnRleHQpCiAgICAgKiguZml4dXApCmRpZmYgLS1naXQgYS9ib2FyZC9wbTUyMC9wbTUyMC5jIGIvYm9hcmQvcG01MjAvcG01MjAuYwppbmRleCA2NWM1MjkxLi4xNGMzZjFkIDEwMDY0NAotLS0gYS9ib2FyZC9wbTUyMC9wbTUyMC5jCisrKyBiL2JvYXJkL3BtNTIwL3BtNTIwLmMKQEAgLTI5OSw3ICsyOTksNyBAQAogfQogI2VuZGlmCiAKLSNpZiBkZWZpbmVkIChDRkdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfUkVTRVQpCiAKIHZvaWQgaW5pdF9pZGVfcmVzZXQgKHZvaWQpCiB7CkBAIC0zMTIsOSArMzEyLDkgQEAKIAlkZWJ1ZyAoImlkZV9yZXNldCglZClcbiIsIGlkZXJlc2V0KTsKIAogfQotI2VuZGlmIC8qIGRlZmluZWQgKENGR19DTURfSURFKSAmJiBkZWZpbmVkIChDT05GSUdfSURFX1JFU0VUKSAqLworI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ET0MpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RPQykKIGV4dGVybiB2b2lkIGRvY19wcm9iZSAodWxvbmcgcGh5c2Fkcik7CiB2b2lkIGRvY19pbml0ICh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYm9hcmQvcG01MjAvdS1ib290LmxkcyBiL2JvYXJkL3BtNTIwL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYzI5NjguLjAwMDAwMDAKLS0tIGEvYm9hcmQvcG01MjAvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAzLTIwMDQKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjNXh4eC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9wbTgyNi9wbTgyNi5jIGIvYm9hcmQvcG04MjYvcG04MjYuYwppbmRleCA3NTE0Y2Q3Li4xNDIwZTY0IDEwMDY0NAotLS0gYS9ib2FyZC9wbTgyNi9wbTgyNi5jCisrKyBiL2JvYXJkL3BtODI2L3BtODI2LmMKQEAgLTMxMCw3ICszMTAsNyBAQAogCXJldHVybiAocHNpemUpOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRE9DKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ET0MpCiBleHRlcm4gdm9pZCBkb2NfcHJvYmUgKHVsb25nIHBoeXNhZHIpOwogdm9pZCBkb2NfaW5pdCAodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2JvYXJkL3BtODI2L3UtYm9vdC5sZHMgYi9ib2FyZC9wbTgyNi91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWYyOWM2Li4wMDAwMDAwCi0tLSBhL2JvYXJkL3BtODI2L3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8oLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL3BtODI4L3BtODI4LmMgYi9ib2FyZC9wbTgyOC9wbTgyOC5jCmluZGV4IDMxOTMyNzQuLjk4Y2Q4MGIgMTAwNjQ0Ci0tLSBhL2JvYXJkL3BtODI4L3BtODI4LmMKKysrIGIvYm9hcmQvcG04MjgvcG04MjguYwpAQCAtMzQzLDcgKzM0Myw3IEBACiAJcmV0dXJuIChwc2l6ZSk7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ET0MpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RPQykKIGV4dGVybiB2b2lkIGRvY19wcm9iZSAodWxvbmcgcGh5c2Fkcik7CiB2b2lkIGRvY19pbml0ICh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYm9hcmQvcG04MjgvdS1ib290LmxkcyBiL2JvYXJkL3BtODI4L3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOGMxY2YuLjAwMDAwMDAKLS0tIGEvYm9hcmQvcG04MjgvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxLTIwMDQKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI2MC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9wbjYyL2NtZF9wbjYyLmMgYi9ib2FyZC9wbjYyL2NtZF9wbjYyLmMKaW5kZXggM2VhMDY4ZC4uZmZhMjBjZCAxMDA2NDQKLS0tIGEvYm9hcmQvcG42Mi9jbWRfcG42Mi5jCisrKyBiL2JvYXJkL3BuNjIvY21kX3BuNjIuYwpAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlICJwbjYyLmgiCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JTUCkKIAogZXh0ZXJuIGludCBkb19ib290bSAoY21kX3RibF90ICosIGludCwgaW50LCBjaGFyICpbXSk7CiAKZGlmZiAtLWdpdCBhL2JvYXJkL3BuNjIvdS1ib290LmxkcyBiL2JvYXJkL3BuNjIvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFlZTNmZC4uMDAwMDAwMAotLS0gYS9ib2FyZC9wbjYyL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNHgvc3RhcnQubwkJKC50ZXh0KQotICAgIGxpYl9wcGMvYm9hcmQubwkJKC50ZXh0KQotICAgIGxpYl9wcGMvcHBjc3RyaW5nLm8JCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy92c3ByaW50Zi5vCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy9jcmMzMi5vCQkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvemxpYi5vCQkoLnRleHQpCi0KLQkuID0gREVGSU5FRChlbnZfb2Zmc2V0KSA/IGVudl9vZmZzZXQgOiAuOwotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vICgudGV4dCkKLQotCSooLnRleHQpCi0KLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotCi0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9wcG1jODI2MC91LWJvb3QubGRzIGIvYm9hcmQvcHBtYzgyNjAvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRkNGI3OC4uMDAwMDAwMAotLS0gYS9ib2FyZC9wcG1jODI2MC91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDAKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI2MC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9wcm9kcml2ZS9hbHByL2FscHIuYyBiL2JvYXJkL3Byb2RyaXZlL2FscHIvYWxwci5jCmluZGV4IDVhYmM4N2QuLmI3NjQ0OTkgMTAwNjQ0Ci0tLSBhL2JvYXJkL3Byb2RyaXZlL2FscHIvYWxwci5jCisrKyBiL2JvYXJkL3Byb2RyaXZlL2FscHIvYWxwci5jCkBAIC0xNzIsNyArMTcyLDcgQEAKICAqCWNlcnRhaW4gcHJlLWluaXRpYWxpemF0aW9uIGFjdGlvbnMuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZiBkZWZpbmVkKENPTkZJR19QQ0kpICYmIGRlZmluZWQoQ0ZHX1BDSV9QUkVfSU5JVCkKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCiBpbnQgcGNpX3ByZV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqIGhvc2UgKQogewogCXVuc2lnbmVkIGxvbmcgc3RyYXA7CkBAIC0xOTIsNyArMTkyLDcgQEAKIAogCXJldHVybiAxOwogfQotI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1BDSSkgJiYgZGVmaW5lZChDRkdfUENJX1BSRV9JTklUKSAqLworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1BDSSkgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICBwY2lfdGFyZ2V0X2luaXQKZGlmZiAtLWdpdCBhL2JvYXJkL3Byb2RyaXZlL2FscHIvbmFuZC5jIGIvYm9hcmQvcHJvZHJpdmUvYWxwci9uYW5kLmMKaW5kZXggZDY2YjA4OC4uMDk3ZTE4MyAxMDA2NDQKLS0tIGEvYm9hcmQvcHJvZHJpdmUvYWxwci9uYW5kLmMKKysrIGIvYm9hcmQvcHJvZHJpdmUvYWxwci9uYW5kLmMKQEAgLTI2LDcgKzI2LDcgQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxuYW5kLmg+CmRpZmYgLS1naXQgYS9ib2FyZC9wcm9kcml2ZS9wM214L3NlcmlhbC5jIGIvYm9hcmQvcHJvZHJpdmUvcDNteC9zZXJpYWwuYwppbmRleCBiYTMyYWMxLi5lMWFmMzdlIDEwMDY0NAotLS0gYS9ib2FyZC9wcm9kcml2ZS9wM214L3NlcmlhbC5jCisrKyBiL2JvYXJkL3Byb2RyaXZlL3AzbXgvc2VyaWFsLmMKQEAgLTgwLDcgKzgwLDcgQEAKIAl9CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogdm9pZCBrZ2RiX3NlcmlhbF9pbml0ICh2b2lkKQogewogfQpAQCAtMTA0LDQgKzEwNCw0IEBACiB7CiAJcmV0dXJuOwogfQotI2VuZGlmIC8qIENGR19DTURfS0dEQiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9wcm9kcml2ZS9wM3A0NDAvcDNwNDQwLmMgYi9ib2FyZC9wcm9kcml2ZS9wM3A0NDAvcDNwNDQwLmMKaW5kZXggMmYyOGU5ZC4uMWE4YWFjYiAxMDA2NDQKLS0tIGEvYm9hcmQvcHJvZHJpdmUvcDNwNDQwL3AzcDQ0MC5jCisrKyBiL2JvYXJkL3Byb2RyaXZlL3AzcDQ0MC9wM3A0NDAuYwpAQCAtMTc2LDcgKzE3Niw3IEBACiAgKgljZXJ0YWluIHByZS1pbml0aWFsaXphdGlvbiBhY3Rpb25zLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgZGVmaW5lZChDT05GSUdfUENJKSAmJiBkZWZpbmVkKENGR19QQ0lfUFJFX0lOSVQpCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQogaW50IHBjaV9wcmVfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCiB7CiAJdW5zaWduZWQgbG9uZyBzdHJhcDsKQEAgLTE5Myw3ICsxOTMsNyBAQAogCiAJcmV0dXJuIDE7CiB9Ci0jZW5kaWYJCQkJLyogZGVmaW5lZChDT05GSUdfUENJKSAmJiBkZWZpbmVkKENGR19QQ0lfUFJFX0lOSVQpICovCisjZW5kaWYJLyogZGVmaW5lZChDT05GSUdfUENJKSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogIHBjaV90YXJnZXRfaW5pdApkaWZmIC0tZ2l0IGEvYm9hcmQvcHJvZHJpdmUvcGRuYjMvbmFuZC5jIGIvYm9hcmQvcHJvZHJpdmUvcGRuYjMvbmFuZC5jCmluZGV4IDkyZjljMDEuLmIxZTcwNDEgMTAwNjQ0Ci0tLSBhL2JvYXJkL3Byb2RyaXZlL3BkbmIzL25hbmQuYworKysgYi9ib2FyZC9wcm9kcml2ZS9wZG5iMy9uYW5kLmMKQEAgLTIzLDcgKzIzLDcgQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAogI2luY2x1ZGUgPG5hbmQuaD4KIApkaWZmIC0tZ2l0IGEvYm9hcmQvcHJvZHJpdmUvcGRuYjMvcGRuYjMuYyBiL2JvYXJkL3Byb2RyaXZlL3BkbmIzL3BkbmIzLmMKaW5kZXggZTJmZWQ1ZC4uYTFhMzEwYSAxMDA2NDQKLS0tIGEvYm9hcmQvcHJvZHJpdmUvcGRuYjMvcGRuYjMuYworKysgYi9ib2FyZC9wcm9kcml2ZS9wZG5iMy9wZG5iMy5jCkBAIC0yMzYsNyArMjM2LDcgQEAKIAkiYWRkcmVzcyBzaXplXG4gICAgLSBib290IEZQR0Egd2l0aCBnemlwcGVkIGltYWdlIGF0IDxhZGRyZXNzPlxuIgogKTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDSSkgfHwgZGVmaW5lZChDT05GSUdfUENJKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ0kpIHx8IGRlZmluZWQoQ09ORklHX1BDSSkKIGV4dGVybiBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgaG9zZTsKIGV4dGVybiB2b2lkIHBjaV9peHBfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKiBob3NlKTsKIApkaWZmIC0tZ2l0IGEvYm9hcmQvcjM2MG1waS9wY21jaWEuYyBiL2JvYXJkL3IzNjBtcGkvcGNtY2lhLmMKaW5kZXggN2QzNGFjOC4uYTgzY2E4ZCAxMDA2NDQKLS0tIGEvYm9hcmQvcjM2MG1waS9wY21jaWEuYworKysgYi9ib2FyZC9yMzYwbXBpL3BjbWNpYS5jCkBAIC00LDExICs0LDExIEBACiAKICN1bmRlZglDT05GSUdfUENNQ0lBCiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQogI2RlZmluZQlDT05GSUdfUENNQ0lBCiAjZW5kaWYKIApAQCAtMTIzLDcgKzEyMyw3IEBACiB9CiAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENNQ0lBKQogaW50IHBjbWNpYV9oYXJkd2FyZV9kaXNhYmxlKGludCBzbG90KQogewogCXZvbGF0aWxlIGltbWFwX3QJKmltbWFwOwpAQCAtMTUwLDcgKzE1MCw3IEBACiAKIAlyZXR1cm4gKDApOwogfQotI2VuZGlmCS8qIENGR19DTURfUENNQ0lBICovCisjZW5kaWYKIAogCiBpbnQgcGNtY2lhX3ZvbHRhZ2Vfc2V0KGludCBzbG90LCBpbnQgdmNjLCBpbnQgdnBwKQpkaWZmIC0tZ2l0IGEvYm9hcmQvcmF0dGxlci91LWJvb3QubGRzIGIvYm9hcmQvcmF0dGxlci91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjJlNmRhLi4wMDAwMDAwCi0tLSBhL2JvYXJkL3JhdHRsZXIvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxLTIwMDUKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogTW9kaWZpZWQgYnkgWXVsaSBCYXJjb2hlbiA8eXVsaUBhcmFiZWxsYXN3LmNvbT4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNjAvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQotRU5UUlkoX3N0YXJ0KQpkaWZmIC0tZ2l0IGEvYm9hcmQvcnB4c3VwZXIvdS1ib290LmxkcyBiL2JvYXJkL3JweHN1cGVyL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNjIzZDAuLjAwMDAwMDAKLS0tIGEvYm9hcmQvcnB4c3VwZXIvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAwCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNjAvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvcnNkcHJvdG8vY29uZmlnLm1rIGIvYm9hcmQvcnNkcHJvdG8vY29uZmlnLm1rCmluZGV4IDU4NDRlYzEuLjM1YzNkOGMgMTAwNjQ0Ci0tLSBhL2JvYXJkL3JzZHByb3RvL2NvbmZpZy5taworKysgYi9ib2FyZC9yc2Rwcm90by9jb25maWcubWsKQEAgLTMxLDMgKzMxLDUgQEAKIAogVEVYVF9CQVNFID0gMHhmZjAwMDAwMAogLypURVhUX0JBU0UgID0gMHgwMDIwMDAwMCAqLworCitMRFNDUklQVCA6PSAkKFNSQ1RSRUUpL2JvYXJkL3JzZHByb3RvL3UtYm9vdC5sZHMKZGlmZiAtLWdpdCBhL2JvYXJkL3JzZHByb3RvL3UtYm9vdC5sZHMgYi9ib2FyZC9yc2Rwcm90by91LWJvb3QubGRzCmluZGV4IDcwZmMzYTUuLjliZDYyNDggMTAwNjQ0Ci0tLSBhL2JvYXJkL3JzZHByb3RvL3UtYm9vdC5sZHMKKysrIGIvYm9hcmQvcnNkcHJvdG8vdS1ib290LmxkcwpAQCAtNTUsNyArNTUsNiBAQAogICB7CiAgICAgY3B1L21wYzgyNjAvc3RhcnQubwkoLnRleHQpCiAgICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKICAgICAqKC5nb3QxKQogICAgIC8qLiA9IGVudl9vZmZzZXQ7ICovCiAgIH0KZGlmZiAtLWdpdCBhL2JvYXJkL3NhY3NuZy9zYWNzbmcuYyBiL2JvYXJkL3NhY3NuZy9zYWNzbmcuYwppbmRleCBlNTBiNzQ3Li4yNTIwOWUwIDEwMDY0NAotLS0gYS9ib2FyZC9zYWNzbmcvc2Fjc25nLmMKKysrIGIvYm9hcmQvc2Fjc25nL3NhY3NuZy5jCkBAIC04MzcsNyArODM3LDcgQEAKIC8qCiAgKiBUaGUgZm9sbG93aW5nIGFyZSB1c2VkIHRvIGNvbnRyb2wgdGhlIFNQSSBjaGlwIHNlbGVjdHMgZm9yIHRoZSBTUEkgY29tbWFuZC4KICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NQSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU1BJKQogCiAjZGVmaW5lIFNQSV9BRENfQ1NfTUFTSwkweDAwMDAwODAwCiAjZGVmaW5lIFNQSV9EQUNfQ1NfTUFTSwkweDAwMDAxMDAwCkBAIC04NzMsNyArODczLDcgQEAKIH07CiBpbnQgc3BpX2NoaXBzZWxfY250ID0gc2l6ZW9mKHNwaV9jaGlwc2VsKSAvIHNpemVvZihzcGlfY2hpcHNlbFswXSk7CiAKLSNlbmRpZiAvKiBDRkdfQ01EX1NQSSAqLworI2VuZGlmCiAKICNlbmRpZiAvKiBDT05GSUdfTUlTQ19JTklUX1IgKi8KIApkaWZmIC0tZ2l0IGEvYm9hcmQvc2Fjc25nL3UtYm9vdC5sZHMgYi9ib2FyZC9zYWNzbmcvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU2MjNkMC4uMDAwMDAwMAotLS0gYS9ib2FyZC9zYWNzbmcvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAwCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNjAvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvc2FuZGJ1cnN0L2NvbW1vbi9zYl9jb21tb24uYyBiL2JvYXJkL3NhbmRidXJzdC9jb21tb24vc2JfY29tbW9uLmMKaW5kZXggNzgxNjQ3Mi4uOGE4MzFmYSAxMDA2NDQKLS0tIGEvYm9hcmQvc2FuZGJ1cnN0L2NvbW1vbi9zYl9jb21tb24uYworKysgYi9ib2FyZC9zYW5kYnVyc3QvY29tbW9uL3NiX2NvbW1vbi5jCkBAIC0zMTMsNyArMzEzLDcgQEAKICAqCWNlcnRhaW4gcHJlLWluaXRpYWxpemF0aW9uIGFjdGlvbnMuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZiBkZWZpbmVkKENPTkZJR19QQ0kpICYmIGRlZmluZWQoQ0ZHX1BDSV9QUkVfSU5JVCkKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCiBpbnQgcGNpX3ByZV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqIGhvc2UgKQogewogCXVuc2lnbmVkIGxvbmcgc3RyYXA7CkBAIC0zMzAsNyArMzMwLDcgQEAKIAogCXJldHVybiAxOwogfQotI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1BDSSkgJiYgZGVmaW5lZChDRkdfUENJX1BSRV9JTklUKSAqLworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1BDSSkgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICBwY2lfdGFyZ2V0X2luaXQKZGlmZiAtLWdpdCBhL2JvYXJkL3NhbmRwb2ludC91LWJvb3QubGRzIGIvYm9hcmQvc2FuZHBvaW50L3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNWNkMmUuLjAwMDAwMDAKLS0tIGEvYm9hcmQvc2FuZHBvaW50L3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNHgvc3RhcnQubwkoLnRleHQpCi0gICAgbGliX3BwYy9ib2FyZC5vCSgudGV4dCkKLSAgICBsaWJfcHBjL3BwY3N0cmluZy5vCSgudGV4dCkKLQotCS4gPSBERUZJTkVEKGVudl9vZmZzZXQpID8gZW52X29mZnNldCA6IC47Ci0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8gKC50ZXh0KQotCi0JKigudGV4dCkKLQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL3NiYzI0MTB4L3NiYzI0MTB4LmMgYi9ib2FyZC9zYmMyNDEweC9zYmMyNDEweC5jCmluZGV4IDcwMzA5ODUuLmI0ODY1ZTEgMTAwNjQ0Ci0tLSBhL2JvYXJkL3NiYzI0MTB4L3NiYzI0MTB4LmMKKysrIGIvYm9hcmQvc2JjMjQxMHgvc2JjMjQxMHguYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPHMzYzI0MTAuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KICNlbmRpZgogCkBAIC0xMzYsNyArMTM2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiBleHRlcm4gdWxvbmcgbmFuZF9wcm9iZSh1bG9uZyBwaHlzYWRyKTsKIAogc3RhdGljIGlubGluZSB2b2lkIE5GX1Jlc2V0KHZvaWQpCkBAIC0xODAsNCArMTgwLDQgQEAKICNlbmRpZgogCXByaW50ZiAoIiU0bHUgTUJcbiIsIG5hbmRfcHJvYmUoKHVsb25nKW5hbmQpID4+IDIwKTsKIH0KLSNlbmRpZiAvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvc2JjODI0MC91LWJvb3QubGRzIGIvYm9hcmQvc2JjODI0MC91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmU4NWU0Li4wMDAwMDAwCi0tLSBhL2JvYXJkL3NiYzgyNDAvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyNHgvc3RhcnQubwkoLnRleHQpCi0gICAgbGliX3BwYy9ib2FyZC5vICgudGV4dCkKLSAgICBsaWJfcHBjL3BwY3N0cmluZy5vCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy92c3ByaW50Zi5vCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy9jcmMzMi5vCQkoLnRleHQpCi0gICAgbGliX2dlbmVyaWMvemxpYi5vCQkoLnRleHQpCi0KLQkJLiA9IERFRklORUQoZW52X29mZnNldCkgPyBlbnZfb2Zmc2V0IDogLjsKLSAgICBjb21tb24vZW52aXJvbm1lbnQubyAoLnRleHQpCi0KLQkJKigudGV4dCkKLQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL3NiYzgyNjAvdS1ib290LmxkcyBiL2JvYXJkL3NiYzgyNjAvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU2MjNkMC4uMDAwMDAwMAotLS0gYS9ib2FyZC9zYmM4MjYwL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMAotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL3NiYzgzNDkvdS1ib290LmxkcyBiL2JvYXJkL3NiYzgzNDkvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMyYzA3NS4uMDAwMDAwMAotLS0gYS9ib2FyZC9zYmM4MzQ5L3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNiBXaW5kIFJpdmVyIFN5c3RlbXMsIEluYy4KLSAqIHUtYm9vdC5sZHMgZm9yIFdpbmRSaXZlciBTQkM4MzQ5LgotICoKLSAqIEJhc2VkIG9uIHRoZSBNUEM4MzQ5IHUtYm9vdC5sZHMKLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgzeHgvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQotRU5UUlkoX3N0YXJ0KQpkaWZmIC0tZ2l0IGEvYm9hcmQvc2JjODY0MWQvTWFrZWZpbGUgYi9ib2FyZC9zYmM4NjQxZC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTBiNzI1Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvc2JjODY0MWQvTWFrZWZpbGUKQEAgLTAsMCArMSw1MiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDEKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQk9BUkQpLmEKKworQ09CSlMJOj0gJChCT0FSRCkubworU09CSlMJOj0gaW5pdC5vCisKK1NSQ1MJOj0gJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKK09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQorU09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlMpKQorCiskKExJQik6CSQob2JqKS5kZXBlbmQgJChPQkpTKSAkKFNPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKQorCitjbGVhbjoKKwlybSAtZiAkKE9CSlMpICQoU09CSlMpCisKKy5QSE9OWTogZGlzdGNsZWFuCitkaXN0Y2xlYW46CWNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICgkb2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYm9hcmQvc2JjODY0MWQvY29uZmlnLm1rIGIvYm9hcmQvc2JjODY0MWQvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMTc1NGQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9zYmM4NjQxZC9jb25maWcubWsKQEAgLTAsMCArMSwzMCBAQAorIyBDb3B5cmlnaHQgMjAwNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4KKyMgTW9kaWZpZWQgYnkgSmVmZiBCcm93bgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCisjCisjIHNiYzg2NDEgYm9hcmQKKyMgZGVmYXVsdCBDQ1NSQkFSIGlzIGF0IDB4ZmY3MDAwMDAKKyMKK1RFWFRfQkFTRSA9IDB4ZmZmMDAwMDAKKworUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURDT05GSUdfTVBDODZ4eD0xCitQTEFURk9STV9DUFBGTEFHUyArPSAtRENPTkZJR19NUEM4NjQxPTEgLW1hbHRpdmVjIC1tYWJpPWFsdGl2ZWMgLW1zb2Z0LWZsb2F0CmRpZmYgLS1naXQgYS9ib2FyZC9zYmM4NjQxZC9pbml0LlMgYi9ib2FyZC9zYmM4NjQxZC9pbml0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE1MWQ3ZQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL3NiYzg2NDFkL2luaXQuUwpAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA3IFdpbmQgUml2ZXIgU3lzdGVtZXMsIEluYy4gPHd3dy53aW5kcml2ZXIuY29tPgorICogQ29weXJpZ2h0IDIwMDcgRW1iZWRkZWQgU3BlY2lhbHRpZXMsIEluYy4KKyAqIEpvZSBIYW1tYW4gam9lLmhhbW1hbkBlbWJlZGRlZHNwZWNpYWx0aWVzLmNvbQorICoKKyAqIENvcHlyaWdodCAyMDA0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLgorICogSmVmZiBCcm93bgorICogU3Jpa2FudGggU3Jpbml2YXNhbiAoc3Jpa2FudGguc3Jpbml2YXNhbkBmcmVlc2NhbGUuY29tKQorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxwcGNfYXNtLnRtcGw+CisjaW5jbHVkZSA8cHBjX2RlZnMuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vbW11Lmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8bXBjODZ4eC5oPgorCisvKgorICogTEFXKExvY2FsIEFjY2VzcyBXaW5kb3cpIGNvbmZpZ3VyYXRpb246CisgKgorICogMHgwMDAwXzAwMDAJMHgwZmZmX2ZmZmYJRERSMQkyNTZNCisgKiAweDEwMDBfMDAwMAkweDFmZmZfZmZmZglERFIyCTI1Nk0KKyAqIDB4ZTAwMF8wMDAwCTB4ZmZmZl9mZmZmCUxCQwk1MTJNCisgKgorICogTm90ZXM6CisgKiAgIENDU1JCQVIgZG9lc24ndCBuZWVkIGEgY29uZmlndXJlZCBMb2NhbCBBY2Nlc3MgV2luZG93LgorICogICBJZiBmbGFzaCBpcyA4TSBhdCBkZWZhdWx0IHBvc2l0aW9uIChsYXN0IDhNKSwgbm8gTEFXIG5lZWRlZC4KKyAqLworCisjIEREUiBCYW5rIDEKKyMgI2RlZmluZSBMQVdCQVIxICgoQ0ZHX0REUl9TRFJBTV9CQVNFPj4xMikgJiAweGZmZmZmZikKKyMgI2RlZmluZSBMQVdBUjEgKExBV0FSX0VOIHwgTEFXQVJfVFJHVF9JRl9ERFIxIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzI1Nk0pKQorCisjIEREUiBCYW5rIDIKKyMgI2RlZmluZSBMQVdCQVIyICgoQ0ZHX0REUl9TRFJBTV9CQVNFMj4+MTIpICYgMHhmZmZmZmYpCisjICNkZWZpbmUgTEFXQVIyIChMQVdBUl9FTiB8IExBV0FSX1RSR1RfSUZfRERSMiB8IChMQVdBUl9TSVpFICYgTEFXQVJfU0laRV8yNTZNKSkKKworIyBMQkMKKyMgI2RlZmluZSBMQVdCQVIzICgoMHhlMDAwMDAwMD4+MTIpICYgMHhmZmZmZmYpCisjICNkZWZpbmUgTEFXQVIzIChMQVdBUl9FTiAmIChMQVdBUl9UUkdUX0lGX0xCQyB8IChMQVdBUl9TSVpFICYgTEFXQVJfU0laRV81MTJNKSkpCisKKy8qCisgKiBMQVcgKExvY2FsIEFjY2VzcyBXaW5kb3cpIGNvbmZpZ3VyYXRpb246CisgKgorICogMHgwMDAwXzAwMDAJRERSCQkJMjU2TQorICogMHgxMDAwXzAwMDAJRERSMgkJCTI1Nk0KKyAqIDB4ODAwMF8wMDAwCVBDSTEgTUVNCQk1MTJNCisgKiAweGEwMDBfMDAwMAlQQ0kyIE1FTQkJNTEyTQorICogMHhjMDAwXzAwMDAJUmFwaWRJTwkJCTUxMk0KKyAqIDB4ZTIwMF8wMDAwCVBDSTEgSU8JCQkxNk0KKyAqIDB4ZTMwMF8wMDAwCVBDSTIgSU8JCQkxNk0KKyAqIDB4ZjgwMF8wMDAwCUNDU1JCQVIJCQkyTQorICogMHhmZTAwXzAwMDAJRkxBU0ggKGJvb3QgYmFuaykJMzJNCisgKgorICovCisKKyNkZWZpbmUgTEFXQkFSMSAoKENGR19ERFJfU0RSQU1fQkFTRT4+MTIpICYgMHhmZmZmZmYpCisjZGVmaW5lIExBV0FSMQkoTEFXQVJfRU4gfCBMQVdBUl9UUkdUX0lGX0REUjEgfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfMjU2TSkpCisKKyNkZWZpbmUgTEFXQkFSMiAoKENGR19QQ0kxX01FTV9CQVNFPj4xMikgJiAweGZmZmZmZikKKyNkZWZpbmUgTEFXQVIyCShMQVdBUl9FTiB8IExBV0FSX1RSR1RfSUZfUENJMSB8IChMQVdBUl9TSVpFICYgTEFXQVJfU0laRV81MTJNKSkKKworI2RlZmluZSBMQVdCQVIzICgoQ0ZHX1BDSTJfTUVNX0JBU0U+PjEyKSAmIDB4ZmZmZmZmKQorI2RlZmluZSBMQVdBUjMJKH5MQVdBUl9FTiAmIChMQVdBUl9UUkdUX0lGX1BDSTIgfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfNTEyTSkpKQorCisjZGVmaW5lIExBV0JBUjQgKCgweGY4MDAwMDAwPj4xMikgJiAweGZmZmZmZikKKyNkZWZpbmUgTEFXQVI0CShMQVdBUl9FTiB8IExBV0FSX1RSR1RfSUZfTEJDIHwgKExBV0FSX1NJWkUgJiBMQVdBUl9TSVpFXzJNKSkKKworI2RlZmluZSBMQVdCQVI1ICgoQ0ZHX1BDSTFfSU9fQkFTRT4+MTIpICYgMHhmZmZmZmYpCisjZGVmaW5lIExBV0FSNQkoTEFXQVJfRU4gfCBMQVdBUl9UUkdUX0lGX1BDSTEgfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfMTZNKSkKKworI2RlZmluZSBMQVdCQVI2ICgoQ0ZHX1BDSTJfSU9fQkFTRT4+MTIpICYgMHhmZmZmZmYpCisjZGVmaW5lIExBV0FSNgkofkxBV0FSX0VOICYoIExBV0FSX1RSR1RfSUZfUENJMiB8IChMQVdBUl9TSVpFICYgTEFXQVJfU0laRV8xNk0pKSkKKworI2RlZmluZSBMQVdCQVI3ICgoMHhmZTAwMDAwMCA+PjEyKSAmIDB4ZmZmZmZmKQorI2RlZmluZSBMQVdBUjcJKExBV0FSX0VOIHwgTEFXQVJfVFJHVF9JRl9MQkMgfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfMzJNKSkKKworI2RlZmluZSBMQVdCQVI4ICgoQ0ZHX0REUl9TRFJBTV9CQVNFMj4+MTIpICYgMHhmZmZmZmYpCisjZGVmaW5lIExBV0FSOCAoTEFXQVJfRU4gfCBMQVdBUl9UUkdUX0lGX0REUjIgfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfMjU2TSkpCisKKyNkZWZpbmUgTEFXQkFSOSAoKENGR19SSU9fTUVNX0JBU0U+PjEyKSAmIDB4ZmZmZmYpCisjZGVmaW5lIExBV0FSOSAgKExBV0FSX0VOIHwgTEFXQVJfVFJHVF9JRl9SSU8gfCAoTEFXQVJfU0laRSAmIExBV0FSX1NJWkVfNTEyTSkpCisKKwkuc2VjdGlvbiAuYm9vdHBnLCAiYXgiCisJLmdsb2JsCWxhd19lbnRyeQorbGF3X2VudHJ5OgorCWxpcwlyNyxDRkdfQ0NTUkJBUkBoCisJb3JpCXI3LHI3LENGR19DQ1NSQkFSQGwKKworCWFkZGkgICAgcjQscjcsMAorCWFkZGkgICAgcjUscjcsMAorCisJLyogU2tpcCBMQVdBUjAsIHN0YXJ0IGF0IExBV0FSMSAqLworCWxpcyAgICAgcjYsTEFXQkFSMUBoCisJb3JpICAgICByNixyNixMQVdCQVIxQGwKKwlzdHd1ICAgIHI2LCAweGMyOChyNCkKKworCWxpcyAgICAgcjYsTEFXQVIxQGgKKwlvcmkgICAgIHI2LHI2LExBV0FSMUBsCisJc3R3dSAgICByNiwgMHhjMzAocjUpCisKKwkvKiBMQVdCQVIyLCBMQVdBUjIgKi8KKwlsaXMgICAgIHI2LExBV0JBUjJAaAorCW9yaSAgICAgcjYscjYsTEFXQkFSMkBsCisJc3R3dSAgICByNiwgMHgyMChyNCkKKworCWxpcyAgICAgcjYsTEFXQVIyQGgKKwlvcmkgICAgIHI2LHI2LExBV0FSMkBsCisJc3R3dSAgICByNiwgMHgyMChyNSkKKworCS8qIExBV0JBUjMsIExBV0FSMyAqLworCWxpcyAgICAgcjYsTEFXQkFSM0BoCisJb3JpICAgICByNixyNixMQVdCQVIzQGwKKwlzdHd1ICAgIHI2LCAweDIwKHI0KQorCisJbGlzICAgICByNixMQVdBUjNAaAorCW9yaSAgICAgcjYscjYsTEFXQVIzQGwKKwlzdHd1ICAgIHI2LCAweDIwKHI1KQorCisJLyogTEFXQkFSNCwgTEFXQVI0ICovCisJbGlzICAgICByNixMQVdCQVI0QGgKKwlvcmkgICAgIHI2LHI2LExBV0JBUjRAbAorCXN0d3UgICAgcjYsIDB4MjAocjQpCisKKwlsaXMgICAgIHI2LExBV0FSNEBoCisJb3JpICAgICByNixyNixMQVdBUjRAbAorCXN0d3UgICAgcjYsIDB4MjAocjUpCisKKwkvKiBMQVdCQVI1LCBMQVdBUjUgKi8KKwlsaXMgICAgIHI2LExBV0JBUjVAaAorCW9yaSAgICAgcjYscjYsTEFXQkFSNUBsCisJc3R3dSAgICByNiwgMHgyMChyNCkKKworCWxpcyAgICAgcjYsTEFXQVI1QGgKKwlvcmkgICAgIHI2LHI2LExBV0FSNUBsCisJc3R3dSAgICByNiwgMHgyMChyNSkKKworCS8qIExBV0JBUjYsIExBV0FSNiAqLworCWxpcyAgICAgcjYsTEFXQkFSNkBoCisJb3JpICAgICByNixyNixMQVdCQVI2QGwKKwlzdHd1ICAgIHI2LCAweDIwKHI0KQorCisJbGlzICAgICByNixMQVdBUjZAaAorCW9yaSAgICAgcjYscjYsTEFXQVI2QGwKKwlzdHd1ICAgIHI2LCAweDIwKHI1KQorCisJLyogTEFXQkFSNywgTEFXQVI3ICovCisJbGlzICAgICByNixMQVdCQVI3QGgKKwlvcmkgICAgIHI2LHI2LExBV0JBUjdAbAorCXN0d3UgICAgcjYsIDB4MjAocjQpCisKKwlsaXMgICAgIHI2LExBV0FSN0BoCisJb3JpICAgICByNixyNixMQVdBUjdAbAorCXN0d3UgICAgcjYsIDB4MjAocjUpCisKKwkvKiBMQVdCQVI4LCBMQVdBUjggKi8KKwlsaXMgICAgIHI2LExBV0JBUjhAaAorCW9yaSAgICAgcjYscjYsTEFXQkFSOEBsCisJc3R3dSAgICByNiwgMHgyMChyNCkKKworCWxpcyAgICAgcjYsTEFXQVI4QGgKKwlvcmkgICAgIHI2LHI2LExBV0FSOEBsCisJc3R3dSAgICByNiwgMHgyMChyNSkKKworCS8qIExBV0JBUjksIExBV0FSOSAqLworCWxpcyAgICAgcjYsTEFXQkFSOUBoCisJb3JpICAgICByNixyNixMQVdCQVI5QGwKKwlzdHd1ICAgIHI2LCAweDIwKHI0KQorCisJbGlzICAgICByNixMQVdBUjlAaAorCW9yaSAgICAgcjYscjYsTEFXQVI5QGwKKwlzdHd1ICAgIHI2LCAweDIwKHI1KQorCisJYmxyCmRpZmYgLS1naXQgYS9ib2FyZC9zYmM4NjQxZC9zYmM4NjQxZC5jIGIvYm9hcmQvc2JjODY0MWQvc2JjODY0MWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWRjNDJmCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvc2JjODY0MWQvc2JjODY0MWQuYwpAQCAtMCwwICsxLDQwNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA3IFdpbmQgUml2ZXIgU3lzdGVtZXMsIEluYy4gPHd3dy53aW5kcml2ZXIuY29tPgorICogQ29weXJpZ2h0IDIwMDcgRW1iZWRkZWQgU3BlY2lhbHRpZXMsIEluYy4KKyAqIEpvZSBIYW1tYW4gam9lLmhhbW1hbkBlbWJlZGRlZHNwZWNpYWx0aWVzLmNvbQorICoKKyAqIENvcHlyaWdodCAyMDA0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLgorICogSmVmZiBCcm93bgorICogU3Jpa2FudGggU3Jpbml2YXNhbiAoc3Jpa2FudGguc3Jpbml2YXNhbkBmcmVlc2NhbGUuY29tKQorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMiBTY290dCBNY051dHQgPHNtY251dHRAYXJ0ZXN5bmNwLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPHBjaS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaW1tYXBfODZ4eC5oPgorI2luY2x1ZGUgPGFzbS9pbW1hcF9mc2xfcGNpLmg+CisjaW5jbHVkZSA8c3BkLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19PRl9GTEFUX1RSRUUpCisjaW5jbHVkZSA8ZnRfYnVpbGQuaD4KK2V4dGVybiB2b2lkIGZ0X2NwdV9zZXR1cCAodm9pZCAqYmxvYiwgYmRfdCAqIGJkKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfRERSX0VDQykgJiYgIWRlZmluZWQoQ09ORklHX0VDQ19JTklUX1ZJQV9ERFJDT05UUk9MTEVSKQorZXh0ZXJuIHZvaWQgZGRyX2VuYWJsZV9lY2MgKHVuc2lnbmVkIGludCBkcmFtX3NpemUpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUERfRUVQUk9NKQorI2luY2x1ZGUgInNwZF9zZHJhbS5oIgorI2VuZGlmCisKK3ZvaWQgc2RyYW1faW5pdCAodm9pZCk7Citsb25nIGludCBmaXhlZF9zZHJhbSAodm9pZCk7CisKK2ludCBib2FyZF9lYXJseV9pbml0X2YgKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCBjaGVja2JvYXJkICh2b2lkKQoreworCXB1dHMgKCJCb2FyZDogV2luZCBSaXZlciBTQkM4NjQxRFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworbG9uZyBpbnQgaW5pdGRyYW0gKGludCBib2FyZF90eXBlKQoreworCWxvbmcgZHJhbV9zaXplID0gMDsKKworI2lmIGRlZmluZWQoQ09ORklHX1NQRF9FRVBST00pCisJZHJhbV9zaXplID0gc3BkX3NkcmFtICgpOworI2Vsc2UKKwlkcmFtX3NpemUgPSBmaXhlZF9zZHJhbSAoKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDRkdfUkFNQk9PVCkKKwlwdXRzICgiICAgIEREUjogIik7CisJcmV0dXJuIGRyYW1fc2l6ZTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfRERSX0VDQykgJiYgIWRlZmluZWQoQ09ORklHX0VDQ19JTklUX1ZJQV9ERFJDT05UUk9MTEVSKQorCS8qCisJICogSW5pdGlhbGl6ZSBhbmQgZW5hYmxlIEREUiBFQ0MuCisJICovCisJZGRyX2VuYWJsZV9lY2MgKGRyYW1fc2l6ZSk7CisjZW5kaWYKKworCXB1dHMgKCIgICAgRERSOiAiKTsKKwlyZXR1cm4gZHJhbV9zaXplOworfQorCisjaWYgZGVmaW5lZChDRkdfRFJBTV9URVNUKQoraW50IHRlc3RkcmFtICh2b2lkKQoreworCXVpbnQgKnBzdGFydCA9ICh1aW50ICopIENGR19NRU1URVNUX1NUQVJUOworCXVpbnQgKnBlbmQgPSAodWludCAqKSBDRkdfTUVNVEVTVF9FTkQ7CisJdWludCAqcDsKKworCXB1dHMgKCJTRFJBTSB0ZXN0IHBoYXNlIDE6XG4iKTsKKwlmb3IgKHAgPSBwc3RhcnQ7IHAgPCBwZW5kOyBwKyspCisJCSpwID0gMHhhYWFhYWFhYTsKKworCWZvciAocCA9IHBzdGFydDsgcCA8IHBlbmQ7IHArKykgeworCQlpZiAoKnAgIT0gMHhhYWFhYWFhYSkgeworCQkJcHJpbnRmICgiU0RSQU0gdGVzdCBmYWlscyBhdDogJTA4eFxuIiwgKHVpbnQpIHApOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlwdXRzICgiU0RSQU0gdGVzdCBwaGFzZSAyOlxuIik7CisJZm9yIChwID0gcHN0YXJ0OyBwIDwgcGVuZDsgcCsrKQorCQkqcCA9IDB4NTU1NTU1NTU7CisKKwlmb3IgKHAgPSBwc3RhcnQ7IHAgPCBwZW5kOyBwKyspIHsKKwkJaWYgKCpwICE9IDB4NTU1NTU1NTUpIHsKKwkJCXByaW50ZiAoIlNEUkFNIHRlc3QgZmFpbHMgYXQ6ICUwOHhcbiIsICh1aW50KSBwKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJcHV0cyAoIlNEUkFNIHRlc3QgcGFzc2VkLlxuIik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKENPTkZJR19TUERfRUVQUk9NKQorLyoKKyAqIEZpeGVkIHNkcmFtIGluaXQgLS0gZG9lc24ndCB1c2Ugc2VyaWFsIHByZXNlbmNlIGRldGVjdC4KKyAqLworbG9uZyBpbnQgZml4ZWRfc2RyYW0gKHZvaWQpCit7CisjaWYgIWRlZmluZWQoQ0ZHX1JBTUJPT1QpCisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKwl2b2xhdGlsZSBjY3NyX2Rkcl90ICpkZHIgPSAmaW1tYXAtPmltX2RkcjE7CisKKwlkZHItPmNzMF9ibmRzID0gQ0ZHX0REUl9DUzBfQk5EUzsKKwlkZHItPmNzMV9ibmRzID0gQ0ZHX0REUl9DUzFfQk5EUzsKKwlkZHItPmNzMl9ibmRzID0gQ0ZHX0REUl9DUzJfQk5EUzsKKwlkZHItPmNzM19ibmRzID0gQ0ZHX0REUl9DUzNfQk5EUzsKKwlkZHItPmNzMF9jb25maWcgPSBDRkdfRERSX0NTMF9DT05GSUc7CisJZGRyLT5jczFfY29uZmlnID0gQ0ZHX0REUl9DUzFfQ09ORklHOworCWRkci0+Y3MyX2NvbmZpZyA9IENGR19ERFJfQ1MyX0NPTkZJRzsKKwlkZHItPmNzM19jb25maWcgPSBDRkdfRERSX0NTM19DT05GSUc7CisJZGRyLT5leHRfcmVmcmVjID0gQ0ZHX0REUl9FWFRfUkVGUkVTSDsKKwlkZHItPnRpbWluZ19jZmdfMCA9IENGR19ERFJfVElNSU5HXzA7CisJZGRyLT50aW1pbmdfY2ZnXzEgPSBDRkdfRERSX1RJTUlOR18xOworCWRkci0+dGltaW5nX2NmZ18yID0gQ0ZHX0REUl9USU1JTkdfMjsKKwlkZHItPnNkcmFtX2NmZ18xID0gQ0ZHX0REUl9DRkdfMUE7CisJZGRyLT5zZHJhbV9jZmdfMiA9IENGR19ERFJfQ0ZHXzI7CisJZGRyLT5zZHJhbV9tb2RlXzEgPSBDRkdfRERSX01PREVfMTsKKwlkZHItPnNkcmFtX21vZGVfMiA9IENGR19ERFJfTU9ERV8yOworCWRkci0+c2RyYW1fbW9kZV9jbnRsID0gQ0ZHX0REUl9NT0RFX0NUTDsKKwlkZHItPnNkcmFtX2ludGVydmFsID0gQ0ZHX0REUl9JTlRFUlZBTDsKKwlkZHItPnNkcmFtX2RhdGFfaW5pdCA9IENGR19ERFJfREFUQV9JTklUOworCWRkci0+c2RyYW1fY2xrX2NudGwgPSBDRkdfRERSX0NMS19DVFJMOworCisJYXNtICgic3luYztpc3luYyIpOworCisJdWRlbGF5ICg1MDApOworCisJZGRyLT5zZHJhbV9jZmdfMSA9IENGR19ERFJfQ0ZHXzFCOworCWFzbSAoInN5bmM7IGlzeW5jIik7CisKKwl1ZGVsYXkgKDUwMCk7CisJZGRyID0gJmltbWFwLT5pbV9kZHIyOworCisJZGRyLT5jczBfYm5kcyA9IENGR19ERFIyX0NTMF9CTkRTOworCWRkci0+Y3MxX2JuZHMgPSBDRkdfRERSMl9DUzFfQk5EUzsKKwlkZHItPmNzMl9ibmRzID0gQ0ZHX0REUjJfQ1MyX0JORFM7CisJZGRyLT5jczNfYm5kcyA9IENGR19ERFIyX0NTM19CTkRTOworCWRkci0+Y3MwX2NvbmZpZyA9IENGR19ERFIyX0NTMF9DT05GSUc7CisJZGRyLT5jczFfY29uZmlnID0gQ0ZHX0REUjJfQ1MxX0NPTkZJRzsKKwlkZHItPmNzMl9jb25maWcgPSBDRkdfRERSMl9DUzJfQ09ORklHOworCWRkci0+Y3MzX2NvbmZpZyA9IENGR19ERFIyX0NTM19DT05GSUc7CisJZGRyLT5leHRfcmVmcmVjID0gQ0ZHX0REUjJfRVhUX1JFRlJFU0g7CisJZGRyLT50aW1pbmdfY2ZnXzAgPSBDRkdfRERSMl9USU1JTkdfMDsKKwlkZHItPnRpbWluZ19jZmdfMSA9IENGR19ERFIyX1RJTUlOR18xOworCWRkci0+dGltaW5nX2NmZ18yID0gQ0ZHX0REUjJfVElNSU5HXzI7CisJZGRyLT5zZHJhbV9jZmdfMSA9IENGR19ERFIyX0NGR18xQTsKKwlkZHItPnNkcmFtX2NmZ18yID0gQ0ZHX0REUjJfQ0ZHXzI7CisJZGRyLT5zZHJhbV9tb2RlXzEgPSBDRkdfRERSMl9NT0RFXzE7CisJZGRyLT5zZHJhbV9tb2RlXzIgPSBDRkdfRERSMl9NT0RFXzI7CisJZGRyLT5zZHJhbV9tb2RlX2NudGwgPSBDRkdfRERSMl9NT0RFX0NUTDsKKwlkZHItPnNkcmFtX2ludGVydmFsID0gQ0ZHX0REUjJfSU5URVJWQUw7CisJZGRyLT5zZHJhbV9kYXRhX2luaXQgPSBDRkdfRERSMl9EQVRBX0lOSVQ7CisJZGRyLT5zZHJhbV9jbGtfY250bCA9IENGR19ERFIyX0NMS19DVFJMOworCisJYXNtICgic3luYztpc3luYyIpOworCisJdWRlbGF5ICg1MDApOworCisJZGRyLT5zZHJhbV9jZmdfMSA9IENGR19ERFIyX0NGR18xQjsKKwlhc20gKCJzeW5jOyBpc3luYyIpOworCisJdWRlbGF5ICg1MDApOworI2VuZGlmCisJcmV0dXJuIENGR19TRFJBTV9TSVpFICogMTAyNCAqIDEwMjQ7Cit9CisjZW5kaWYJCQkJLyogIWRlZmluZWQoQ09ORklHX1NQRF9FRVBST00pICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCisvKgorICogSW5pdGlhbGl6ZSBQQ0kgRGV2aWNlcywgcmVwb3J0IGRldmljZXMgZm91bmQuCisgKi8KKworI2lmbmRlZiBDT05GSUdfUENJX1BOUAorc3RhdGljIHN0cnVjdCBwY2lfY29uZmlnX3RhYmxlIHBjaV9mc2w4Nnh4YWRzX2NvbmZpZ190YWJsZVtdID0geworCXtQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAorCSBQQ0lfSURTRUxfTlVNQkVSLCBQQ0lfQU5ZX0lELAorCSBwY2lfY2ZnZnVuY19jb25maWdfZGV2aWNlLCB7UENJX0VORVQwX0lPQUREUiwKKwkJCQkgICAgIFBDSV9FTkVUMF9NRU1BRERSLAorCQkJCSAgICAgUENJX0NPTU1BTkRfTUVNT1JZIHwgUENJX0NPTU1BTkRfTUFTVEVSfX0sCisJe30KK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBwY2kxX2hvc2UgPSB7CisjaWZuZGVmIENPTkZJR19QQ0lfUE5QCisJY29uZmlnX3RhYmxlOnBjaV9tcGM4Nnh4Y3RzX2NvbmZpZ190YWJsZQorI2VuZGlmCit9OworI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKworI2lmZGVmIENPTkZJR19QQ0kyCitzdGF0aWMgc3RydWN0IHBjaV9jb250cm9sbGVyIHBjaTJfaG9zZTsKKyNlbmRpZgkvKiBDT05GSUdfUENJMiAqLworCitpbnQgZmlyc3RfZnJlZV9idXNubyA9IDA7CisKK3ZvaWQgcGNpX2luaXRfYm9hcmQodm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIENGR19DQ1NSQkFSOworCXZvbGF0aWxlIGNjc3JfZ3VyX3QgKmd1ciA9ICZpbW1hcC0+aW1fZ3VyOworCXVpbnQgZGV2ZGlzciA9IGd1ci0+ZGV2ZGlzcjsKKwl1aW50IGlvX3NlbCA9IChndXItPnBvcmRldnNyICYgTVBDODZ4eF9QT1JERVZTUl9JT19TRUwpID4+IDE2OworCisjaWZkZWYgQ09ORklHX1BDSTEKK3sKKwl2b2xhdGlsZSBjY3NyX2ZzbF9wY2lfdCAqcGNpID0gKGNjc3JfZnNsX3BjaV90ICopIENGR19QQ0kxX0FERFI7CisJZXh0ZXJuIHZvaWQgZnNsX3BjaV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSk7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gJnBjaTFfaG9zZTsKKyNpZmRlZiBERUJVRworCXVpbnQgaG9zdDFfYWdlbnQgPSAoZ3VyLT5wb3JibXNyICYgTVBDODZ4eF9QT1JCTVNSX0hBKSA+PiAxNzsKKwl1aW50IHBleDFfYWdlbnQgPSAoaG9zdDFfYWdlbnQgPT0gMCkgfHwgKGhvc3QxX2FnZW50ID09IDEpOworI2VuZGlmCisJaWYgKChpb19zZWwgPT0gMiB8fCBpb19zZWwgPT0gMyB8fCBpb19zZWwgPT0gNQorCSAgICAgfHwgaW9fc2VsID09IDYgfHwgaW9fc2VsID09IDcgfHwgaW9fc2VsID09IDB4RikKKwkgICAgJiYgIShkZXZkaXNyICYgTVBDODZ4eF9ERVZESVNSX1BDSUVYMSkpIHsKKwkJZGVidWcoIlBDSS1FWFBSRVNTIDE6ICVzIFxuIiwgcGV4MV9hZ2VudCA/ICJBZ2VudCIgOiAiSG9zdCIpOworCQlkZWJ1ZygiMHglMDh4PTB4JTA4eCAiLCAmcGNpLT5wbWVfbXNnX2RldCwgcGNpLT5wbWVfbXNnX2RldCk7CisJCWlmIChwY2ktPnBtZV9tc2dfZGV0KSB7CisJCQlwY2ktPnBtZV9tc2dfZGV0ID0gMHhmZmZmZmZmZjsKKwkJCWRlYnVnKCIgd2l0aCBlcnJvcnMuICBDbGVhcmluZy4gIE5vdyAweCUwOHgiLAorCQkJICAgICAgcGNpLT5wbWVfbXNnX2RldCk7CisJCX0KKwkJZGVidWcoIlxuIik7CisKKwkJLyogaW5ib3VuZCAqLworCQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMCwKKwkJCSAgICAgICBDRkdfUENJX01FTU9SWV9CVVMsCisJCQkgICAgICAgQ0ZHX1BDSV9NRU1PUllfUEhZUywKKwkJCSAgICAgICBDRkdfUENJX01FTU9SWV9TSVpFLAorCQkJICAgICAgIFBDSV9SRUdJT05fTUVNIHwgUENJX1JFR0lPTl9NRU1PUlkpOworCisJCS8qIG91dGJvdW5kIG1lbW9yeSAqLworCQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMSwKKwkJCSAgICAgICBDRkdfUENJMV9NRU1fQkFTRSwKKwkJCSAgICAgICBDRkdfUENJMV9NRU1fUEhZUywKKwkJCSAgICAgICBDRkdfUENJMV9NRU1fU0laRSwKKwkJCSAgICAgICBQQ0lfUkVHSU9OX01FTSk7CisKKwkJLyogb3V0Ym91bmQgaW8gKi8KKwkJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDIsCisJCQkgICAgICAgQ0ZHX1BDSTFfSU9fQkFTRSwKKwkJCSAgICAgICBDRkdfUENJMV9JT19QSFlTLAorCQkJICAgICAgIENGR19QQ0kxX0lPX1NJWkUsCisJCQkgICAgICAgUENJX1JFR0lPTl9JTyk7CisKKwkJaG9zZS0+cmVnaW9uX2NvdW50ID0gMzsKKworCQlob3NlLT5maXJzdF9idXNubz1maXJzdF9mcmVlX2J1c25vOworCQlwY2lfc2V0dXBfaW5kaXJlY3QoaG9zZSwgKGludCkgJnBjaS0+Y2ZnX2FkZHIsIChpbnQpICZwY2ktPmNmZ19kYXRhKTsKKworCQlmc2xfcGNpX2luaXQoaG9zZSk7CisKKwkJZmlyc3RfZnJlZV9idXNubz1ob3NlLT5sYXN0X2J1c25vKzE7CisJCXByaW50ZiAoIiAgICBQQ0ktRVhQUkVTUyAxIG9uIGJ1cyAlMDJ4IC0gJTAyeFxuIiwKKwkJCWhvc2UtPmZpcnN0X2J1c25vLGhvc2UtPmxhc3RfYnVzbm8pOworCisJfSBlbHNlIHsKKwkJcHV0cygiUENJLUVYUFJFU1MgMTogRGlzYWJsZWRcbiIpOworCX0KK30KKyNlbHNlCisJcHV0cygiUENJLUVYUFJFU1MxOiBEaXNhYmxlZFxuIik7CisjZW5kaWYgLyogQ09ORklHX1BDSTEgKi8KKworI2lmZGVmIENPTkZJR19QQ0kyCit7CisJdm9sYXRpbGUgY2Nzcl9mc2xfcGNpX3QgKnBjaSA9IChjY3NyX2ZzbF9wY2lfdCAqKSBDRkdfUENJMl9BRERSOworCWV4dGVybiB2b2lkIGZzbF9wY2lfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9ICZwY2kyX2hvc2U7CisKKworCS8qIGluYm91bmQgKi8KKwlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMCwKKwkJICAgICAgIENGR19QQ0lfTUVNT1JZX0JVUywKKwkJICAgICAgIENGR19QQ0lfTUVNT1JZX1BIWVMsCisJCSAgICAgICBDRkdfUENJX01FTU9SWV9TSVpFLAorCQkgICAgICAgUENJX1JFR0lPTl9NRU0gfCBQQ0lfUkVHSU9OX01FTU9SWSk7CisKKwkvKiBvdXRib3VuZCBtZW1vcnkgKi8KKwlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMSwKKwkJICAgICAgIENGR19QQ0kyX01FTV9CQVNFLAorCQkgICAgICAgQ0ZHX1BDSTJfTUVNX1BIWVMsCisJCSAgICAgICBDRkdfUENJMl9NRU1fU0laRSwKKwkJICAgICAgIFBDSV9SRUdJT05fTUVNKTsKKworCS8qIG91dGJvdW5kIGlvICovCisJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDIsCisJCSAgICAgICBDRkdfUENJMl9JT19CQVNFLAorCQkgICAgICAgQ0ZHX1BDSTJfSU9fUEhZUywKKwkJICAgICAgIENGR19QQ0kyX0lPX1NJWkUsCisJCSAgICAgICBQQ0lfUkVHSU9OX0lPKTsKKworCWhvc2UtPnJlZ2lvbl9jb3VudCA9IDM7CisKKwlob3NlLT5maXJzdF9idXNubz1maXJzdF9mcmVlX2J1c25vOworCXBjaV9zZXR1cF9pbmRpcmVjdChob3NlLCAoaW50KSAmcGNpLT5jZmdfYWRkciwgKGludCkgJnBjaS0+Y2ZnX2RhdGEpOworCisJZnNsX3BjaV9pbml0KGhvc2UpOworCisJZmlyc3RfZnJlZV9idXNubz1ob3NlLT5sYXN0X2J1c25vKzE7CisJcHJpbnRmICgiICAgIFBDSS1FWFBSRVNTIDIgb24gYnVzICUwMnggLSAlMDJ4XG4iLAorCQlob3NlLT5maXJzdF9idXNubyxob3NlLT5sYXN0X2J1c25vKTsKK30KKyNlbHNlCisJcHV0cygiUENJLUVYUFJFU1MgMjogRGlzYWJsZWRcbiIpOworI2VuZGlmIC8qIENPTkZJR19QQ0kyICovCisKK30KKworI2lmIGRlZmluZWQoQ09ORklHX09GX0ZMQVRfVFJFRSkgJiYgZGVmaW5lZChDT05GSUdfT0ZfQk9BUkRfU0VUVVApCit2b2lkIGZ0X2JvYXJkX3NldHVwICh2b2lkICpibG9iLCBiZF90ICogYmQpCit7CisJdTMyICpwOworCWludCBsZW47CisKKwlmdF9jcHVfc2V0dXAgKGJsb2IsIGJkKTsKKworCXAgPSBmdF9nZXRfcHJvcCAoYmxvYiwgIi9tZW1vcnkvcmVnIiwgJmxlbik7CisJaWYgKHAgIT0gTlVMTCkgeworCQkqcCsrID0gY3B1X3RvX2JlMzIgKGJkLT5iaV9tZW1zdGFydCk7CisJCSpwID0gY3B1X3RvX2JlMzIgKGJkLT5iaV9tZW1zaXplKTsKKwl9Cit9CisjZW5kaWYKKwordm9pZCBzYmM4NjQxZF9yZXNldF9ib2FyZCAodm9pZCkKK3sKKwlwdXRzICgiUmVzZXR0aW5nIGJvYXJkLi4uLlxuIik7Cit9CisKKy8qCisgKiBnZXRfYm9hcmRfc3lzX2NsaworICogICAgICBDbG9jayBpcyBmaXhlZCBhdCAxR0h6IG9uIHRoaXMgYm9hcmQuIFVzZWQgZm9yIENPTkZJR19TWVNfQ0xLX0ZSRVEKKyAqLworCit1bnNpZ25lZCBsb25nIGdldF9ib2FyZF9zeXNfY2xrICh1bG9uZyBkdW1teSkKK3sKKwlpbnQgaTsKKwl1bG9uZyB2YWwgPSAwOworCisJaSA9IDU7CisJaSAmPSAweDA3OworCisJc3dpdGNoIChpKSB7CisJY2FzZSAwOgorCQl2YWwgPSAzMzAwMDAwMDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQl2YWwgPSA0MDAwMDAwMDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl2YWwgPSA1MDAwMDAwMDsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQl2YWwgPSA2NjAwMDAwMDsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQl2YWwgPSA4MzAwMDAwMDsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQl2YWwgPSAxMDAwMDAwMDA7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJdmFsID0gMTM0MDAwMDAwOworCQlicmVhazsKKwljYXNlIDc6CisJCXZhbCA9IDE2NjAwMDAwMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHZhbDsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL3NiYzg2NDFkL3UtYm9vdC5sZHMgYi9ib2FyZC9zYmM4NjQxZC91LWJvb3QubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMGYzNTAKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9zYmM4NjQxZC91LWJvb3QubGRzCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDYsIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfQVJDSChwb3dlcnBjKQorCitTRUNUSU9OUworeworCisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KKyAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9CisgIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9CisgIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9CisgIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KKyAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KKyAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQorICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQorICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KKyAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQorICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KKyAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQorICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9CisgIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9CisgIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KKyAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KKyAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9CisgIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KKyAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9CisgIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KKyAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KKyAgLnBsdCA6IHsgKigucGx0KSB9CisgIC50ZXh0ICAgICAgOgorICB7CisgICAgY3B1L21wYzg2eHgvc3RhcnQubwkoLnRleHQpCisgICAgYm9hcmQvc2JjODY0MWQvaW5pdC5vICguYm9vdHBnKQorICAgIGNwdS9tcGM4Nnh4L3RyYXBzLm8gKC50ZXh0KQorICAgIGNwdS9tcGM4Nnh4L2ludGVycnVwdHMubyAoLnRleHQpCisgICAgY3B1L21wYzg2eHgvY3B1X2luaXQubyAoLnRleHQpCisgICAgY3B1L21wYzg2eHgvY3B1Lm8gKC50ZXh0KQorICAgIGNwdS9tcGM4Nnh4L3NwZWVkLm8gKC50ZXh0KQorICAgIGNvbW1vbi9kbG1hbGxvYy5vICgudGV4dCkKKyAgICBsaWJfZ2VuZXJpYy9jcmMzMi5vICgudGV4dCkKKyAgICBsaWJfcHBjL2V4dGFibGUubyAoLnRleHQpCisgICAgbGliX2dlbmVyaWMvemxpYi5vICgudGV4dCkKKyAgICAqKC50ZXh0KQorICAgICooLmZpeHVwKQorICAgICooLmdvdDEpCisgICB9CisgICAgX2V0ZXh0ID0gLjsKKyAgICBQUk9WSURFIChldGV4dCA9IC4pOworICAgIC5yb2RhdGEgICAgOgorICAgeworICAgICooLnJvZGF0YSkKKyAgICAqKC5yb2RhdGExKQorICAgICooLnJvZGF0YS5zdHIxLjQpCisgICAgKiguZWhfZnJhbWUpCisgIH0KKyAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAorICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9CisgIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KKworICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KKyAgLiA9ICguICsgMHgwMEZGKSAmIDB4RkZGRkZGMDA7CisgIF9lcm90ZXh0ID0gLjsKKyAgUFJPVklERSAoZXJvdGV4dCA9IC4pOworICAucmVsb2MgICA6CisgIHsKKyAgICAqKC5nb3QpCisgICAgX0dPVDJfVEFCTEVfID0gLjsKKyAgICAqKC5nb3QyKQorICAgIF9GSVhVUF9UQUJMRV8gPSAuOworICAgICooLmZpeHVwKQorICB9CisgIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7CisgIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKKworICAuZGF0YSAgICA6CisgIHsKKyAgICAqKC5kYXRhKQorICAgICooLmRhdGExKQorICAgICooLnNkYXRhKQorICAgICooLnNkYXRhMikKKyAgICAqKC5keW5hbWljKQorICAgIENPTlNUUlVDVE9SUworICB9CisgIF9lZGF0YSAgPSAgLjsKKyAgUFJPVklERSAoZWRhdGEgPSAuKTsKKworICAuID0gLjsKKyAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKKyAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KKyAgX191X2Jvb3RfY21kX2VuZCA9IC47CisKKyAgLiA9IC47CisgIF9fc3RhcnRfX19leF90YWJsZSA9IC47CisgIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQorICBfX3N0b3BfX19leF90YWJsZSA9IC47CisKKyAgLiA9IEFMSUdOKDI1Nik7CisgIF9faW5pdF9iZWdpbiA9IC47CisgIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQorICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KKyAgLiA9IEFMSUdOKDI1Nik7CisgIF9faW5pdF9lbmQgPSAuOworCisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICA6CisgIHsKKyAgICooLnNic3MpICooLnNjb21tb24pCisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgfQorICBfZW5kID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvc2MzL3NjM25hbmQuYyBiL2JvYXJkL3NjMy9zYzNuYW5kLmMKaW5kZXggN2RhYTg3Ny4uMDA5NTY3YiAxMDA2NDQKLS0tIGEvYm9hcmQvc2MzL3NjM25hbmQuYworKysgYi9ib2FyZC9zYzMvc2MzbmFuZC5jCkBAIC0yMyw3ICsyMyw3IEBACiAKICNpbmNsdWRlIDxjb21tb24uaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAKICNpbmNsdWRlIDxuYW5kLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgpkaWZmIC0tZ2l0IGEvYm9hcmQvc2M1MjBfY2RwL3NjNTIwX2NkcC5jIGIvYm9hcmQvc2M1MjBfY2RwL3NjNTIwX2NkcC5jCmluZGV4IGI2YWRkNTkuLmY2ZjBlNzIgMTAwNjQ0Ci0tLSBhL2JvYXJkL3NjNTIwX2NkcC9zYzUyMF9jZHAuYworKysgYi9ib2FyZC9zYzUyMF9jZHAvc2M1MjBfY2RwLmMKQEAgLTUwNyw2ICs1MDcsNyBAQAogCiB2b2lkIHNob3dfYm9vdF9wcm9ncmVzcyhpbnQgdmFsKQogeworCWlmICh2YWwgPCAtMzIpIHZhbCA9IC0xOyAgLyogbGV0IHRoaW5ncyBjb21wYXRpYmxlICovCiAJb3V0Yih2YWwmMHhmZiwgMHg4MCk7CiAJb3V0YigodmFsJjB4ZmYwMCk+PjgsIDB4NjgwKTsKIH0KZGlmZiAtLWdpdCBhL2JvYXJkL3NjNTIwX3NwdW5rL3NjNTIwX3NwdW5rLmMgYi9ib2FyZC9zYzUyMF9zcHVuay9zYzUyMF9zcHVuay5jCmluZGV4IGVkMjI2ZmQuLmQxMTlhN2QgMTAwNjQ0Ci0tLSBhL2JvYXJkL3NjNTIwX3NwdW5rL3NjNTIwX3NwdW5rLmMKKysrIGIvYm9hcmQvc2M1MjBfc3B1bmsvc2M1MjBfc3B1bmsuYwpAQCAtNTA3LDYgKzUwNyw3IEBACiB7CiAJaW50IHZlcnNpb24gPSByZWFkX21tY3JfYnl0ZShTQzUyMF9TWVNJTkZPKTsKIAorCWlmICh2YWwgPCAtMzIpIHZhbCA9IC0xOyAgLyogbGV0IHRoaW5ncyBjb21wYXRpYmxlICovCiAJaWYgKHZlcnNpb24gPT0gMCkgewogCQkvKiBQSU8zMS1QSU8xNiBEYXRhICovCiAJCXdyaXRlX21tY3Jfd29yZChTQzUyMF9QSU9EQVRBMzFfMTYsCmRpZmYgLS1naXQgYS9ib2FyZC9zaWVtZW5zL1NDTS91LWJvb3QubGRzIGIvYm9hcmQvc2llbWVucy9TQ00vdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVmMjljNi4uMDAwMDAwMAotLS0gYS9ib2FyZC9zaWVtZW5zL1NDTS91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI2MC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9zaWVtZW5zL1NNTjQyL01ha2VmaWxlIGIvYm9hcmQvc2llbWVucy9TTU40Mi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzdiNTRiCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvc2llbWVucy9TTU40Mi9NYWtlZmlsZQpAQCAtMCwwICsxLDUxIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwNworIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChCT0FSRCkuYQorCitDT0JKUwk6PSBmbGFzaC5vIHNtbjQyLm8KK1NPQkpUUwk6PSBsb3dsZXZlbF9pbml0Lm8KKworU1JDUwk6PSAkKFNPQkpUUzoubz0uUykgJChDT0JKUzoubz0uYykKK09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQorU09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlRTKSkKKworJChMSUIpOgkkKG9iaikuZGVwZW5kICQoT0JKUykgJChTT0JKUykKKwkkKEFSKSBjcnYgJEAgJChPQkpTKSAkKFNPQkpTKQorCitjbGVhbjoKKwlybSAtZiAkKFNPQkpTKSAkKE9CSlMpCisKK2Rpc3RjbGVhbjoJY2xlYW4KKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9ib2FyZC9zaWVtZW5zL1NNTjQyL2NvbmZpZy5tayBiL2JvYXJkL3NpZW1lbnMvU01ONDIvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyOGY0MTgKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9zaWVtZW5zL1NNTjQyL2NvbmZpZy5tawpAQCAtMCwwICsxLDMwIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMAorIyBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyMgTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPgorIworIyAoQykgQ29weXJpZ2h0IDIwMDAKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworI2FkZHJlc3Mgd2hlcmUgdS1ib290IHdpbGwgYmUgcmVsb2NhdGVkCisjVEVYVF9CQVNFID0gMHgwCitURVhUX0JBU0UgPSAweDgxNTAwMDAwCmRpZmYgLS1naXQgYS9ib2FyZC9zaWVtZW5zL1NNTjQyL2ZsYXNoLmMgYi9ib2FyZC9zaWVtZW5zL1NNTjQyL2ZsYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q0OTc3ZQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL3NpZW1lbnMvU01ONDIvZmxhc2guYwpAQCAtMCwwICsxLDQ3NSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNiBFbWJlZGRlZCBBcnRpc3RzIEFCIDx3d3cuZW1iZWRkZWRhcnRpc3RzLmNvbT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDcgR2FyeSBKZW5uZWpvaG4gZ2FyeWpAZGVueC5kZQorICogTW9kaWZpZWQgdG8gdXNlIHRoZSByb3V0aW5lcyBpbiBjcHUvYXJtNzIwdC9scGMyMjkyL2ZsYXNoLmMuCisgKiBIZWF2aWx5IG1vZGlmaWVkIHRvIHN1cHBvcnQgdGhlIFNNTjQyIGJvYXJkIGZyb20gU2llbWVucworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZmxhc2hfYWRkcl90YWJsZVtDRkdfTUFYX0ZMQVNIX0JBTktTXSA9IENGR19GTEFTSF9CQU5LU19MSVNUOworZmxhc2hfaW5mb190IGZsYXNoX2luZm9bQ0ZHX01BWF9GTEFTSF9CQU5LU107CisKK2V4dGVybiBpbnQgbHBjMjI5Ml9jb3B5X2J1ZmZlcl90b19mbGFzaChmbGFzaF9pbmZvX3QgKiwgdWxvbmcpOworZXh0ZXJuIGludCBscGMyMjkyX2ZsYXNoX2VyYXNlKGZsYXNoX2luZm9fdCAqLCBpbnQsIGludCk7CitleHRlcm4gaW50IGxwYzIyOTJfd3JpdGVfYnVmZiAoZmxhc2hfaW5mb190ICosIHVjaGFyICosIHVsb25nLCB1bG9uZyk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBleHRfZmxhc2hfaW5pdCh2b2lkKTsKK3N0YXRpYyBpbnQgZXh0X2ZsYXNoX2VyYXNlKGZsYXNoX2luZm9fdCAqLCBpbnQsIGludCk7CitzdGF0aWMgaW50IGV4dF93cml0ZV9idWZmKGZsYXNoX2luZm9fdCAqLCB1Y2hhciAqLCB1bG9uZywgdWxvbmcpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKwordWxvbmcgZmxhc2hfaW5pdCAodm9pZCkKK3sKKwlpbnQgaiwgazsKKwl1bG9uZyBzaXplID0gMDsKKwl1bG9uZyBmbGFzaGJhc2UgPSAwOworCisJZmxhc2hfaW5mb1swXS5mbGFzaF9pZCA9IFBISUxJUFNfTFBDMjI5MjsKKwlmbGFzaF9pbmZvWzBdLnNpemUgPSAweDAwM0UwMDA7CS8qIDI1NiAtIDggS0IgKi8KKwlmbGFzaF9pbmZvWzBdLnNlY3Rvcl9jb3VudCA9IDE3OworCW1lbXNldCAoZmxhc2hfaW5mb1swXS5wcm90ZWN0LCAwLCAxNyk7CisJZmxhc2hiYXNlID0gMHgwMDAwMDAwMDsKKwlmb3IgKGogPSAwLCBrID0gMDsgaiA8IDg7IGorKywgaysrKSB7CisJCWZsYXNoX2luZm9bMF0uc3RhcnRba10gPSBmbGFzaGJhc2U7CisJCWZsYXNoYmFzZSArPSAweDAwMDAyMDAwOworCX0KKwlmb3IgKGogPSAwOyBqIDwgMjsgaisrLCBrKyspIHsKKwkJZmxhc2hfaW5mb1swXS5zdGFydFtrXSA9IGZsYXNoYmFzZTsKKwkJZmxhc2hiYXNlICs9IDB4MDAwMTAwMDA7CisJfQorCWZvciAoaiA9IDA7IGogPCA3OyBqKyssIGsrKykgeworCQlmbGFzaF9pbmZvWzBdLnN0YXJ0W2tdID0gZmxhc2hiYXNlOworCQlmbGFzaGJhc2UgKz0gMHgwMDAwMjAwMDsKKwl9CisJc2l6ZSArPSBmbGFzaF9pbmZvWzBdLnNpemU7CisKKwkvKiBQcm90ZWN0IG1vbml0b3IgYW5kIGVudmlyb25tZW50IHNlY3RvcnMgKi8KKwlmbGFzaF9wcm90ZWN0IChGTEFHX1BST1RFQ1RfU0VULAorCQkgMHgwLAorCQkgMHgwICsgbW9uaXRvcl9mbGFzaF9sZW4gLSAxLAorCQkgJmZsYXNoX2luZm9bMF0pOworCisJZmxhc2hfcHJvdGVjdCAoRkxBR19QUk9URUNUX1NFVCwKKwkJIENGR19FTlZfQUREUiwKKwkJIENGR19FTlZfQUREUiArIENGR19FTlZfU0laRSAtIDEsCisJCSAmZmxhc2hfaW5mb1swXSk7CisKKwlzaXplICs9IGV4dF9mbGFzaF9pbml0KCk7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIGZsYXNoX3ByaW50X2luZm8gKGZsYXNoX2luZm9fdCAqIGluZm8pCit7CisJaW50IGk7CisJaW50IGVyYXNlZCA9IDA7CisJdW5zaWduZWQgbG9uZyBqOworCXVuc2lnbmVkIGxvbmcgY291bnQ7CisJdW5zaWduZWQgY2hhciAqcDsKKworCXN3aXRjaCAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9WRU5ETUFTSykgeworCWNhc2UgKFBISUxJUFNfTFBDMjI5MiAmIEZMQVNIX1ZFTkRNQVNLKToKKwkJcHJpbnRmKCJQaGlsaXBzOiAiKTsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9NQU5fQU1EOgorCQlwcmludGYoIkFNRDogIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZiAoIlVua25vd24gVmVuZG9yICIpOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVFlQRU1BU0spIHsKKwljYXNlIChQSElMSVBTX0xQQzIyOTIgJiBGTEFTSF9UWVBFTUFTSyk6CisJCXByaW50ZigiTFBDMjI5MiBpbnRlcm5hbCBmbGFzaFxuIik7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfUzI5R0wxMjhOOgorCQlwcmludGYgKCJTMjlHTDEyOE4gKDEyOCBNYml0LCB1bmlmb3JtIHNlY3RvciBzaXplKVxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigiVW5rbm93biBDaGlwIFR5cGVcbiIpOworCQlyZXR1cm47CisJfQorCisJcHJpbnRmICgiICBTaXplOiAlbGQgS0IgaW4gJWQgU2VjdG9yc1xuIiwKKwkgIGluZm8tPnNpemUgPj4gMTAsIGluZm8tPnNlY3Rvcl9jb3VudCk7CisKKwlwcmludGYgKCIgIFNlY3RvciBTdGFydCBBZGRyZXNzZXM6Iik7CisJZm9yIChpID0gMDsgaSA8IGluZm8tPnNlY3Rvcl9jb3VudDsgaSsrKSB7CisJCWlmICgoaSAlIDUpID09IDApIHsKKwkJCXByaW50ZiAoIlxuICAgIik7CisJCX0KKwkJaWYgKGkgPCAoaW5mby0+c2VjdG9yX2NvdW50IC0gMSkpIHsKKwkJCWNvdW50ID0gaW5mby0+c3RhcnRbaSsxXSAtIGluZm8tPnN0YXJ0W2ldOworCQl9CisJCWVsc2UgeworCQkJY291bnQgPSBpbmZvLT5zdGFydFswXSArIGluZm8tPnNpemUgLSBpbmZvLT5zdGFydFtpXTsKKwkJfQorCQlwID0gKHVuc2lnbmVkIGNoYXIqKShpbmZvLT5zdGFydFtpXSk7CisJCWVyYXNlZCA9IDE7CisJCWZvciAoaiA9IDA7IGogPCBjb3VudDsgaisrKSB7CisJCQlpZiAoKnAgIT0gMHhGRikgeworCQkJCWVyYXNlZCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwKys7CisJCX0KKwkJcHJpbnRmICgiICUwOGxYJXMlcyIsIGluZm8tPnN0YXJ0W2ldLCBpbmZvLT5wcm90ZWN0W2ldID8gIiBSTyIgOiAiICAgIiwKKwkJCWVyYXNlZCA/ICIgRSIgOiAiICAiKTsKKwl9CisJcHJpbnRmICgiXG4iKTsKK30KKworaW50IGZsYXNoX2VyYXNlIChmbGFzaF9pbmZvX3QgKiBpbmZvLCBpbnQgc19maXJzdCwgaW50IHNfbGFzdCkKK3sKKwlzd2l0Y2ggKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVFlQRU1BU0spIHsKKwkJY2FzZSAoUEhJTElQU19MUEMyMjkyICYgRkxBU0hfVFlQRU1BU0spOgorCQkJcmV0dXJuIGxwYzIyOTJfZmxhc2hfZXJhc2UoaW5mbywgc19maXJzdCwgc19sYXN0KTsKKwkJY2FzZSBGTEFTSF9TMjlHTDEyOE46CisJCQlyZXR1cm4gZXh0X2ZsYXNoX2VyYXNlKGluZm8sIHNfZmlyc3QsIHNfbGFzdCk7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gRVJSX1BST1RFQ1RFRDsKKwl9CisJcmV0dXJuIEVSUl9QUk9URUNURUQ7Cit9CisKK2ludCB3cml0ZV9idWZmIChmbGFzaF9pbmZvX3QgKiBpbmZvLCB1Y2hhciAqIHNyYywgdWxvbmcgYWRkciwgdWxvbmcgY250KQoreworCXN3aXRjaCAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykgeworCQljYXNlIChQSElMSVBTX0xQQzIyOTIgJiBGTEFTSF9UWVBFTUFTSyk6CisJCQlyZXR1cm4gbHBjMjI5Ml93cml0ZV9idWZmKGluZm8sIHNyYywgYWRkciwgY250KTsKKwkJY2FzZSBGTEFTSF9TMjlHTDEyOE46CisJCQlyZXR1cm4gZXh0X3dyaXRlX2J1ZmYoaW5mbywgc3JjLCBhZGRyLCBjbnQpOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIEVSUl9QUk9HX0VSUk9SOworCX0KKwlyZXR1cm4gRVJSX1BST0dfRVJST1I7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZyb20gaGVyZSBvbiBpcyBjb2RlIGZvciB0aGUgZXh0ZXJuYWwgUzI5R0wxMjhOIHRha2VuIGZyb20gY2FtNTIwMF9mbGFzaC5jCisgKi8KKworI2RlZmluZSBDRkdfRkxBU0hfV09SRF9TSVpFIHVuc2lnbmVkIHNob3J0CisKK3N0YXRpYyBpbnQgd2FpdF9mb3JfRFE3XzMyKGZsYXNoX2luZm9fdCAqIGluZm8sIGludCBzZWN0KQoreworCXVsb25nIHN0YXJ0LCBub3csIGxhc3Q7CisJdm9sYXRpbGUgQ0ZHX0ZMQVNIX1dPUkRfU0laRSAqYWRkciA9CisJCShDRkdfRkxBU0hfV09SRF9TSVpFICopIChpbmZvLT5zdGFydFtzZWN0XSk7CisKKwlzdGFydCA9IGdldF90aW1lcigwKTsKKwlsYXN0ID0gc3RhcnQ7CisJd2hpbGUgKChhZGRyWzBdICYgKENGR19GTEFTSF9XT1JEX1NJWkUpIDB4MDA4MDAwODApICE9CisJCQkoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgMHgwMDgwMDA4MCkgeworCQlpZiAoKG5vdyA9IGdldF90aW1lcihzdGFydCkpID4gQ0ZHX0ZMQVNIX0VSQVNFX1RPVVQpIHsKKwkJCXByaW50ZigiVGltZW91dFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJLyogc2hvdyB0aGF0IHdlJ3JlIHdhaXRpbmcgKi8KKwkJaWYgKChub3cgLSBsYXN0KSA+IDEwMDApIHsJLyogZXZlcnkgc2Vjb25kICovCisJCQlwdXRjKCcuJyk7CisJCQlsYXN0ID0gbm93OworCQl9CisJfQorCXJldHVybiAwOworfQorCitpbnQgZXh0X2ZsYXNoX2VyYXNlKGZsYXNoX2luZm9fdCAqIGluZm8sIGludCBzX2ZpcnN0LCBpbnQgc19sYXN0KQoreworCXZvbGF0aWxlIENGR19GTEFTSF9XT1JEX1NJWkUgKmFkZHIgPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSAqKSAoaW5mby0+c3RhcnRbMF0pOworCXZvbGF0aWxlIENGR19GTEFTSF9XT1JEX1NJWkUgKmFkZHIyOworCWludCBmbGFnLCBwcm90LCBzZWN0LCBsX3NlY3QsIHJldDsKKworCXJldCA9IDA7CisJaWYgKChzX2ZpcnN0IDwgMCkgfHwgKHNfZmlyc3QgPiBzX2xhc3QpKSB7CisJCWlmIChpbmZvLT5mbGFzaF9pZCA9PSBGTEFTSF9VTktOT1dOKQorCQkJcHJpbnRmKCItIG1pc3NpbmdcbiIpOworCQllbHNlCisJCQlwcmludGYoIi0gbm8gc2VjdG9ycyB0byBlcmFzZVxuIik7CisJCXJldHVybiAxOworCX0KKworCWlmIChpbmZvLT5mbGFzaF9pZCA9PSBGTEFTSF9VTktOT1dOKSB7CisJCXByaW50ZigiQ2FuJ3QgZXJhc2UgdW5rbm93biBmbGFzaCB0eXBlIC0gYWJvcnRlZFxuIik7CisJCXJldHVybiAxOworCX0KKworCXByb3QgPSAwOworCWZvciAoc2VjdCA9IHNfZmlyc3Q7IHNlY3QgPD0gc19sYXN0OyArK3NlY3QpIHsKKwkJaWYgKGluZm8tPnByb3RlY3Rbc2VjdF0pCisJCQlwcm90Kys7CisJfQorCisJaWYgKHByb3QpCisJCXByaW50ZigiLSBXYXJuaW5nOiAlZCBwcm90ZWN0ZWQgc2VjdG9ycyB3aWxsIG5vdCBiZSBlcmFzZWQhIiwgcHJvdCk7CisKKwlwcmludGYoIlxuIik7CisKKwlsX3NlY3QgPSAtMTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyB3aGljaCBtaWdodCBjYXVzZSBhIHRpbWVvdXQgaGVyZSAqLworCWZsYWcgPSBkaXNhYmxlX2ludGVycnVwdHMoKTsKKworCS8qIFN0YXJ0IGVyYXNlIG9uIHVucHJvdGVjdGVkIHNlY3RvcnMgKi8KKwlmb3IgKHNlY3QgPSBzX2ZpcnN0OyBzZWN0IDw9IHNfbGFzdDsgc2VjdCsrKSB7CisJCWlmIChpbmZvLT5wcm90ZWN0W3NlY3RdID09IDApIHsJLyogbm90IHByb3RlY3RlZCAqLworCQkJYWRkcjIgPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSAqKSAoaW5mby0+c3RhcnRbc2VjdF0pOworCisJCQlhZGRyW0NGR19GTEFTSF9BRERSMF0gPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgMHgwMEFBMDBBQTsKKwkJCWFkZHJbQ0ZHX0ZMQVNIX0FERFIxXSA9IChDRkdfRkxBU0hfV09SRF9TSVpFKSAweDAwNTUwMDU1OworCQkJYWRkcltDRkdfRkxBU0hfQUREUjBdID0gKENGR19GTEFTSF9XT1JEX1NJWkUpIDB4MDA4MDAwODA7CisJCQlhZGRyW0NGR19GTEFTSF9BRERSMF0gPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgMHgwMEFBMDBBQTsKKwkJCWFkZHJbQ0ZHX0ZMQVNIX0FERFIxXSA9IChDRkdfRkxBU0hfV09SRF9TSVpFKSAweDAwNTUwMDU1OworCQkJYWRkcjJbMF0gPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgMHgwMDMwMDAzMDsJLyogc2VjdG9yIGVyYXNlICovCisKKwkJCWxfc2VjdCA9IHNlY3Q7CisJCQkvKgorCQkJICogV2FpdCBmb3IgZWFjaCBzZWN0b3IgdG8gY29tcGxldGUsIGl0J3MgbW9yZQorCQkJICogcmVsaWFibGUuICBBY2NvcmRpbmcgdG8gQU1EIFNwZWMsIHlvdSBtdXN0CisJCQkgKiBpc3N1ZSBhbGwgZXJhc2UgY29tbWFuZHMgd2l0aGluIGEgc3BlY2lmaWVkCisJCQkgKiB0aW1lb3V0LiAgVGhpcyBoYXMgYmVlbiBzZWVuIHRvIGZhaWwsIGVzcGVjaWFsbHkKKwkJCSAqIGlmIHByaW50ZigpcyBhcmUgaW5jbHVkZWQgKGZvciBkZWJ1ZykhIQorCQkJICovCisJCQlyZXQgPSB3YWl0X2Zvcl9EUTdfMzIoaW5mbywgc2VjdCk7CisJCQlpZiAocmV0KSB7CisJCQkJcmV0ID0gRVJSX1BST1RFQ1RFRDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qIHJlLWVuYWJsZSBpbnRlcnJ1cHRzIGlmIG5lY2Vzc2FyeSAqLworCWlmIChmbGFnKQorCQllbmFibGVfaW50ZXJydXB0cygpOworCisJLyogd2FpdCBhdCBsZWFzdCA4MHVzIC0gbGV0J3Mgd2FpdCAxIG1zICovCisJdWRlbGF5KDEwMDApOworCisJLyogcmVzZXQgdG8gcmVhZCBtb2RlICovCisJYWRkciA9IChDRkdfRkxBU0hfV09SRF9TSVpFICopIGluZm8tPnN0YXJ0WzBdOworCWFkZHJbMF0gPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgMHgwMEYwMDBGMDsJLyogcmVzZXQgYmFuayAqLworCisJaWYgKHJldCkKKwkJcHJpbnRmKCIgZXJyb3JcbiIpOworCWVsc2UKKwkJcHJpbnRmKCIgZG9uZVxuIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVsb25nIGZsYXNoX2dldF9zaXplKHZ1X2xvbmcgKiBhZGRyLCBmbGFzaF9pbmZvX3QgKiBpbmZvKQoreworCXNob3J0IGk7CisJQ0ZHX0ZMQVNIX1dPUkRfU0laRSB2YWx1ZTsKKwl1bG9uZyBiYXNlID0gKHVsb25nKSBhZGRyOworCXZvbGF0aWxlIENGR19GTEFTSF9XT1JEX1NJWkUgKmFkZHIyID0gKENGR19GTEFTSF9XT1JEX1NJWkUgKikgYWRkcjsKKworCS8qIFdyaXRlIGF1dG8gc2VsZWN0IGNvbW1hbmQ6IHJlYWQgTWFudWZhY3R1cmVyIElEICovCisJYWRkcjJbQ0ZHX0ZMQVNIX0FERFIwXSA9IChDRkdfRkxBU0hfV09SRF9TSVpFKSAweDAwQUEwMEFBOworCWFkZHIyW0NGR19GTEFTSF9BRERSMV0gPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgMHgwMDU1MDA1NTsKKwlhZGRyMltDRkdfRkxBU0hfQUREUjBdID0gKENGR19GTEFTSF9XT1JEX1NJWkUpIDB4MDA5MDAwOTA7CisJdWRlbGF5KDEwMDApOworCisJdmFsdWUgPSBhZGRyMlswXTsKKworCXN3aXRjaCAodmFsdWUpIHsKKwkJY2FzZSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgQU1EX01BTlVGQUNUOgorCQkJaW5mby0+Zmxhc2hfaWQgPSBGTEFTSF9NQU5fQU1EOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpbmZvLT5mbGFzaF9pZCA9IEZMQVNIX1VOS05PV047CisJCQlpbmZvLT5zZWN0b3JfY291bnQgPSAwOworCQkJaW5mby0+c2l6ZSA9IDA7CisJCQlyZXR1cm4gKDApOwkvKiBubyBvciB1bmtub3duIGZsYXNoICAqLworCX0KKworCXZhbHVlID0gYWRkcjJbMV07CS8qIGRldmljZSBJRCAgICAgICAgICAgICovCisKKwlzd2l0Y2ggKHZhbHVlKSB7CisJCWNhc2UgKENGR19GTEFTSF9XT1JEX1NJWkUpQU1EX0lEX01JUlJPUjoKKwkJCXZhbHVlID0gYWRkcjJbMTRdOworCQkJc3dpdGNoKHZhbHVlKSB7CisJCQkJY2FzZSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSlBTURfSURfR0wxMjhOXzI6CisJCQkJCXZhbHVlID0gYWRkcjJbMTVdOworCQkJCQlpZiAodmFsdWUgIT0gKENGR19GTEFTSF9XT1JEX1NJWkUpQU1EX0lEX0dMMTI4Tl8zKSB7CisJCQkJCQlpbmZvLT5mbGFzaF9pZCA9IEZMQVNIX1VOS05PV047CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF9TMjlHTDEyOE47CisJCQkJCQlpbmZvLT5zZWN0b3JfY291bnQgPSAxMjg7CisJCQkJCQlpbmZvLT5zaXplID0gMHgwMTAwMDAwMDsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlpbmZvLT5mbGFzaF9pZCA9IEZMQVNIX1VOS05PV047CisJCQkJCXJldHVybigwKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlpbmZvLT5mbGFzaF9pZCA9IEZMQVNIX1VOS05PV047CisJCQlyZXR1cm4gKDApOwkvKiA9PiBubyBvciB1bmtub3duIGZsYXNoICovCisJfQorCisJLyogc2V0IHVwIHNlY3RvciBzdGFydCBhZGRyZXNzIHRhYmxlICovCisJZm9yIChpID0gMDsgaSA8IGluZm8tPnNlY3Rvcl9jb3VudDsgaSsrKQorCQlpbmZvLT5zdGFydFtpXSA9IGJhc2UgKyAoaSAqIDB4MDAwMjAwMDApOworCisJLyogY2hlY2sgZm9yIHByb3RlY3RlZCBzZWN0b3JzICovCisJZm9yIChpID0gMDsgaSA8IGluZm8tPnNlY3Rvcl9jb3VudDsgaSsrKSB7CisJCS8qIHJlYWQgc2VjdG9yIHByb3RlY3Rpb24gYXQgc2VjdG9yIGFkZHJlc3MsIChBNyAuLiBBMCkgPSAweDAyICovCisJCS8qIEQwID0gMSBpZiBwcm90ZWN0ZWQgKi8KKwkJYWRkcjIgPSAodm9sYXRpbGUgQ0ZHX0ZMQVNIX1dPUkRfU0laRSAqKShpbmZvLT5zdGFydFtpXSk7CisKKwkJaW5mby0+cHJvdGVjdFtpXSA9IGFkZHIyWzJdICYgMTsKKwl9CisKKwkvKiBpc3N1ZSBiYW5rIHJlc2V0IHRvIHJldHVybiB0byByZWFkIG1vZGUgKi8KKwlhZGRyMlswXSA9IChDRkdfRkxBU0hfV09SRF9TSVpFKSAweDAwRjAwMEYwOworCisJcmV0dXJuIChpbmZvLT5zaXplKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZXh0X2ZsYXNoX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRvdGFsX2IgPSAwOworCXVuc2lnbmVkIGxvbmcgc2l6ZV9iW0NGR19NQVhfRkxBU0hfQkFOS1NdOworCWludCBpOworCisJLyogSW5pdDogbm8gRkxBU0hlcyBrbm93biAqLworCWZvciAoaSA9IDE7IGkgPCBDRkdfTUFYX0ZMQVNIX0JBTktTOyArK2kpIHsKKwkJZmxhc2hfaW5mb1tpXS5mbGFzaF9pZCA9IEZMQVNIX1VOS05PV047CisJCWZsYXNoX2luZm9baV0uc2VjdG9yX2NvdW50ID0gLTE7CisJCWZsYXNoX2luZm9baV0uc2l6ZSA9IDA7CisKKwkJLyogY2FsbCBmbGFzaF9nZXRfc2l6ZSgpIHRvIGluaXRpYWxpemUgc2VjdG9yIGFkZHJlc3MgKi8KKwkJc2l6ZV9iW2ldID0gZmxhc2hfZ2V0X3NpemUoKHZ1X2xvbmcgKikgZmxhc2hfYWRkcl90YWJsZVtpXSwKKwkJCQkmZmxhc2hfaW5mb1tpXSk7CisKKwkJZmxhc2hfaW5mb1tpXS5zaXplID0gc2l6ZV9iW2ldOworCisJCWlmIChmbGFzaF9pbmZvW2ldLmZsYXNoX2lkID09IEZMQVNIX1VOS05PV04pIHsKKwkJCXByaW50ZigiIyMgVW5rbm93biBGTEFTSCBvbiBCYW5rICVkIC0gU2l6ZSA9IDB4JTA4bHggPSAlbGQgTUJcbiIsCisJCQkJCWkrMSwgc2l6ZV9iW2ldLCBzaXplX2JbaV0gPDwgMjApOworCQkJZmxhc2hfaW5mb1tpXS5zZWN0b3JfY291bnQgPSAtMTsKKwkJCWZsYXNoX2luZm9baV0uc2l6ZSA9IDA7CisJCX0KKworCQl0b3RhbF9iICs9IGZsYXNoX2luZm9baV0uc2l6ZTsKKwl9CisKKwlyZXR1cm4gdG90YWxfYjsKK30KKworc3RhdGljIGludCB3cml0ZV93b3JkKGZsYXNoX2luZm9fdCAqIGluZm8sIHVsb25nIGRlc3QsIHVzaG9ydCBkYXRhKQoreworCXZvbGF0aWxlIENGR19GTEFTSF9XT1JEX1NJWkUgKmFkZHIyID0gKENGR19GTEFTSF9XT1JEX1NJWkUgKikgKGluZm8tPnN0YXJ0WzBdKTsKKwl2b2xhdGlsZSBDRkdfRkxBU0hfV09SRF9TSVpFICpkZXN0MiA9IChDRkdfRkxBU0hfV09SRF9TSVpFICopIGRlc3Q7CisJdm9sYXRpbGUgQ0ZHX0ZMQVNIX1dPUkRfU0laRSAqZGF0YTIgPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSAqKSAmZGF0YTsKKwl1bG9uZyBzdGFydDsKKwlpbnQgZmxhZzsKKworCS8qIENoZWNrIGlmIEZsYXNoIGlzIChzdWZmaWNpZW50bHkpIGVyYXNlZCAqLworCWlmICgoKmRlc3QyICYgKmRhdGEyKSAhPSAqZGF0YTIpIHsKKwkJcmV0dXJuICgyKTsKKwl9CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgd2hpY2ggbWlnaHQgY2F1c2UgYSB0aW1lb3V0IGhlcmUgKi8KKwlmbGFnID0gZGlzYWJsZV9pbnRlcnJ1cHRzKCk7CisKKwlhZGRyMltDRkdfRkxBU0hfQUREUjBdID0gKENGR19GTEFTSF9XT1JEX1NJWkUpIDB4MDBBQTAwQUE7CisJYWRkcjJbQ0ZHX0ZMQVNIX0FERFIxXSA9IChDRkdfRkxBU0hfV09SRF9TSVpFKSAweDAwNTUwMDU1OworCWFkZHIyW0NGR19GTEFTSF9BRERSMF0gPSAoQ0ZHX0ZMQVNIX1dPUkRfU0laRSkgMHgwMEEwMDBBMDsKKwkqZGVzdDIgPSAqZGF0YTI7CisKKwkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoZmxhZykKKwkJZW5hYmxlX2ludGVycnVwdHMoKTsKKworCS8qIGRhdGEgcG9sbGluZyBmb3IgRDcgKi8KKwlzdGFydCA9IGdldF90aW1lcigwKTsKKwl3aGlsZSAoKCpkZXN0MiAmIChDRkdfRkxBU0hfV09SRF9TSVpFKSAweDAwODAwMDgwKSAhPQorCQkJKCpkYXRhMiAmIChDRkdfRkxBU0hfV09SRF9TSVpFKSAweDAwODAwMDgwKSkgeworCisJCWlmIChnZXRfdGltZXIoc3RhcnQpID4gQ0ZHX0ZMQVNIX1dSSVRFX1RPVVQpIHsKKwkJCXByaW50ZigiV1JJVEVfVE9VVFxuIik7CisJCQlyZXR1cm4gKDEpOworCQl9CisJfQorCXJldHVybiAoMCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoaXMgaXMgdGFrZW4gZnJvbSB0aGUgb3JpZ2luYWwgZmxhc2guYyBmb3IgdGhlIExQQzIyOTIgU09ESU1NIGJvYXJkCisgKiBhbmQgbW9kaWZpZWQgdG8gc3VpdC4KKyAqLworCitpbnQgZXh0X3dyaXRlX2J1ZmYoZmxhc2hfaW5mb190ICogaW5mbywgdWNoYXIgKiBzcmMsIHVsb25nIGFkZHIsIHVsb25nIGNudCkKK3sKKwl1c2hvcnQgdG1wOworCXVsb25nIGk7CisJdWNoYXIqIHNyY19vcmc7CisJdWNoYXIqIGRzdF9vcmc7CisJdWxvbmcgY250X29yZyA9IGNudDsKKwlpbnQgcmV0ID0gRVJSX09LOworCisJc3JjX29yZyA9IHNyYzsKKwlkc3Rfb3JnID0gKHVjaGFyKilhZGRyOworCisJaWYgKGFkZHIgJiAxKSB7CQkvKiBpZiBvZGQgYWRkcmVzcyAqLworCQl0bXAgPSAqKCh1Y2hhciopKGFkZHIgLSAxKSk7IC8qIGxpdHRsZSBlbmRpYW4gKi8KKwkJdG1wIHw9ICgqc3JjIDw8IDgpOworCQlpZiAod3JpdGVfd29yZChpbmZvLCBhZGRyIC0gMSwgdG1wKSkKKwkJCXJldHVybiBFUlJfUFJPR19FUlJPUjsKKwkJYWRkciArPSAxOworCQljbnQgLT0gMTsKKwkJc3JjKys7CisJfQorCXdoaWxlIChjbnQgPiAxKSB7CisJCXRtcCA9ICgoKihzcmMrMSkpIDw8IDgpICsgKCpzcmMpOyAvKiBsaXR0bGUgZW5kaWFuICovCisJCWlmICh3cml0ZV93b3JkKGluZm8sIGFkZHIsIHRtcCkpCisJCQlyZXR1cm4gRVJSX1BST0dfRVJST1I7CisJCWFkZHIgKz0gMjsKKwkJc3JjICs9IDI7CisJCWNudCAtPSAyOworCX0KKwlpZiAoY250ID4gMCkgeworCQl0bXAgPSAoKigodWNoYXIqKShhZGRyICsgMSkpKSA8PCA4OworCQl0bXAgfD0gKnNyYzsKKwkJaWYgKHdyaXRlX3dvcmQoaW5mbywgYWRkciwgdG1wKSkKKwkJCXJldHVybiBFUlJfUFJPR19FUlJPUjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY250X29yZzsgaSsrKSB7CisJCWlmICgqZHN0X29yZyAhPSAqc3JjX29yZykgeworCQkJcHJpbnRmKCJXcml0ZSBmYWlsZWQuIEJ5dGUgJWxYIGRpZmZlcnNcbiIsIGkpOworCQkJcmV0ID0gRVJSX1BST0dfRVJST1I7CisJCQlicmVhazsKKwkJfQorCQlkc3Rfb3JnKys7CisJCXNyY19vcmcrKzsKKwl9CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvc2llbWVucy9TTU40Mi9sb3dsZXZlbF9pbml0LlMgYi9ib2FyZC9zaWVtZW5zL1NNTjQyL2xvd2xldmVsX2luaXQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWFiYjYzCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvc2llbWVucy9TTU40Mi9sb3dsZXZlbF9pbml0LlMKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYgRW1iZWRkZWQgQXJ0aXN0cyBBQiA8d3d3LmVtYmVkZGVkYXJ0aXN0cy5jb20+CisgKgorICogU2xpZ2h0IG1vZGlmaWNhdGlvbnMgbWFkZSB0byBzdXBwb3J0IHRoZSBTTU40MiBib2FyZCBmcm9tIFNpZW1lbnMuCisgKiAyMDA3IEdhcnkgSmVubmVqb2huIGdhcnlqQGRlbnguZGUKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8dmVyc2lvbi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisKKy8qIHNvbWUgcGFyYW1ldGVycyBmb3IgdGhlIGJvYXJkICovCisvKiBzZXR0aW5nIHVwIHRoZSBDUFUtaW50ZXJuYWwgbWVtb3J5ICovCisjZGVmaW5lIAlTUkFNX1NUQVJUIAkweDQwMDAwMDAwCisjZGVmaW5lIAlTUkFNX1NJWkUJMHgwMDAwNDAwMAorI2RlZmluZSAgIEJDRkcwX1ZBTFVFIDB4MTAwMGZmZWYKKyNkZWZpbmUgICBCQ0ZHMV9WQUxVRSAweDEwMDA1RDJGCisjZGVmaW5lICAgQkNGRzJfVkFMVUUgMHgxMDAwNUQyRgorLyoKKyAqIEZvciBQMC4xOCB0byBzZXQgWlogdG8gdGhlIFNSQU1zIHRvIDEuIEFsc28gc2V0IFAwLjIgKFNDTCkgYW5kIFAwLjMgKFNEQSkKKyAqIGZvciB0aGUgYml0LWJhbmdlciBJMkMgZHJpdmVyIGNvcnJlY3RseS4KKyAqLworI2RlZmluZSAgIElPMF9WQUxVRSAgIDB4NDAwMEMKKworX1RFWFRfQkFTRToKKwkud29yZAlURVhUX0JBU0UKK01FTU1BUF9BRFI6CisJLndvcmQJTUVNTUFQCitCQ0ZHMF9BRFI6CisJLndvcmQgQkNGRzAKK19CQ0ZHMF9WQUxVRToKKwkud29yZCBCQ0ZHMF9WQUxVRQorQkNGRzFfQURSOgorCS53b3JkCUJDRkcxCitfQkNGRzFfVkFMVUU6CisJLndvcmQJQkNGRzFfVkFMVUUKK0JDRkcyX0FEUjoKKwkud29yZAlCQ0ZHMgorX0JDRkcyX1ZBTFVFOgorCS53b3JkCUJDRkcyX1ZBTFVFCitJTzBESVJfQURSOgorCS53b3JkCUlPMERJUgorX0lPMERJUl9WQUxVRToKKwkud29yZAlJTzBfVkFMVUUKK0lPMFNFVF9BRFI6CisJLndvcmQJSU8wU0VUCitfSU8wU0VUX1ZBTFVFOgorCS53b3JkCUlPMF9WQUxVRQorUElOU0VMMl9BRFI6CisJLndvcmQJUElOU0VMMgorUElOU0VMMl9NQVNLOgorCS53b3JkCTB4MDAwMDAwMDAKK1BJTlNFTDJfVkFMVUU6CisJLndvcmQJMHgwRjgwNDkxNAorCisuZXh0ZXJuIF9zdGFydAorCisuZ2xvYmwgbG93bGV2ZWxfaW5pdAorbG93bGV2ZWxfaW5pdDoKKwkvKiBzZXQgdXAgbWVtb3J5IGNvbnRyb2wgcmVnaXN0ZXIgZm9yIGJhbmsgMCAqLworCWxkciByMCwgX0JDRkcwX1ZBTFVFCisJbGRyIHIxLCBCQ0ZHMF9BRFIKKwlzdHIgcjAsIFtyMV0KKworCS8qIHNldCB1cCBtZW1vcnkgY29udHJvbCByZWdpc3RlciBmb3IgYmFuayAxICovCisJbGRyCXIwLCBfQkNGRzFfVkFMVUUKKwlsZHIJcjEsIEJDRkcxX0FEUgorCXN0cglyMCwgW3IxXQorCisJLyogc2V0IHVwIG1lbW9yeSBjb250cm9sIHJlZ2lzdGVyIGZvciBiYW5rIDIgKi8KKwlsZHIJcjAsIF9CQ0ZHMl9WQUxVRQorCWxkcglyMSwgQkNGRzJfQURSCisJc3RyCXIwLCBbcjFdCisKKwkvKiBzZXQgSU8wRElSIHRvIG1ha2UgUDAuMiwgUDAuMyAgYW5kIFAwLjE4IG91dHB1dHMgKi8KKwlsZHIJcjAsIF9JTzBESVJfVkFMVUUKKwlsZHIJcjEsIElPMERJUl9BRFIKKwlzdHIJcjAsIFtyMV0KKworCS8qIHNldCBQMC4xOCB0byAxICovCisJbGRyCXIwLCBfSU8wU0VUX1ZBTFVFCisJbGRyCXIxLCBJTzBTRVRfQURSCisJc3RyCXIwLCBbcjFdCisKKwkvKiBzZXQgdXAgUElOU0VMMiBmb3IgYnVzLXBpbnMgKi8KKwlsZHIJcjAsIFBJTlNFTDJfQURSCisJbGRyCXIxLCBbcjBdCisJbGRyCXIyLCBQSU5TRUwyX01BU0sKKwlsZHIJcjMsIFBJTlNFTDJfVkFMVUUKKwlhbmQJcjEsIHIxLCByMgorCW9ycglyMSwgcjEsIHIzCisJc3RyCXIxLCBbcjBdCisKKwkvKiBtb3ZlIHZlY3RvcnMgdG8gYmVnaW5uaW5nIG9mIFNSQU0gKi8KKwltb3YJcjIsICNTUkFNX1NUQVJUCisJbW92CXIwLCAjMCAvKl9zdGFydCovCisJbGRtbmVpYSByMCEsIHtyMy1yMTB9CisJc3RtbmVpYSByMiEsIHtyMy1yMTB9CisJbGRtbmVpYSByMCwge3IzLXI5fQorCXN0bW5laWEgcjIsIHtyMy1yOX0KKworCS8qIFNldC11cCBNRU1NQVAgcmVnaXN0ZXIsIHNvIHZlY3RvcnMgYXJlIHRha2VuIGZyb20gU1JBTSAqLworCWxkcglyMCwgTUVNTUFQX0FEUgorCW1vdglyMSwgIzB4MDIJLyogdmVjdG9ycyByZS1tYXBwZWQgdG8gc3RhdGljIFJBTSAqLworCXN0cglyMSwgW3IwXQorCisJLyogZXZlcnl0aGluZyBpcyBmaW5lIG5vdyAqLworCW1vdglwYywgbHIKZGlmZiAtLWdpdCBhL2JvYXJkL3NpZW1lbnMvU01ONDIvc21uNDIuYyBiL2JvYXJkL3NpZW1lbnMvU01ONDIvc21uNDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmZjNzZjCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvc2llbWVucy9TTU40Mi9zbW40Mi5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNSBSb3dlbCBBdGllbnphIDxyb3dlbEBkaXdhbGFicy5jb20+CisgKiBBcm1hZGlsbG8gYm9hcmQgSFQxMDcwCisgKgorICogKEMpIENvcHlyaWdodCAyMDA3IEdhcnkgSmVubmVqb2huIDxnYXJ5akBkZW54LmRlPgorICogU2llbWVucyBib2FyZCBTTU40MgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjbHBzNzExMS5oPgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgcGxhdGZvcm0gZGVwZW5kZW50IGluaXRpYWxpc2F0aW9ucworICovCisKK2ludCBib2FyZF9pbml0ICh2b2lkKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisJLyogYXJjaCBudW1iZXIgTUFDSF9UWVBFX0FSTUFESUxMTyAtIG5vdCBvZmZpY2lhbCovCisJZ2QtPmJkLT5iaV9hcmNoX251bWJlciA9IDgzOworCisJLyogbG9jYXRpb24gb2YgYm9vdCBwYXJhbWV0ZXJzICovCisJZ2QtPmJkLT5iaV9ib290X3BhcmFtcyA9IFBIWVNfU0RSQU1fMSArIDB4MDAwMDAxMDA7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRyYW1faW5pdCAodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCWdkLT5iZC0+YmlfZHJhbVswXS5zdGFydCA9IFBIWVNfU0RSQU1fMTsKKwlnZC0+YmQtPmJpX2RyYW1bMF0uc2l6ZSA9IFBIWVNfU0RSQU1fMV9TSVpFOworCisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL3NpZW1lbnMvU01ONDIvdS1ib290LmxkcyBiL2JvYXJkL3NpZW1lbnMvU01ONDIvdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGQ5NDZjCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvc2llbWVucy9TTU40Mi91LWJvb3QubGRzCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iKQorT1VUUFVUX0FSQ0goYXJtKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKwkuID0gMHgwMDAwMDAwMDsKKworCS4gPSBBTElHTig0KTsKKwkudGV4dCAgICAgIDoKKwl7CisJICBjcHUvYXJtNzIwdC9zdGFydC5vCSgudGV4dCkKKwkgICooLnRleHQpCisJfQorCisJLiA9IEFMSUdOKDQpOworCS5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5kYXRhIDogeyAqKC5kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmdvdCA6IHsgKiguZ290KSB9CisKKwlfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOworCS51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9CisJX191X2Jvb3RfY21kX2VuZCA9IC47CisKKwkuID0gQUxJR04oNCk7CisJX19ic3Nfc3RhcnQgPSAuOworCS5ic3MgOiB7ICooLmJzcykgfQorCV9lbmQgPSAuOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvc2llbWVucy9jb21tb24vZnBnYS5jIGIvYm9hcmQvc2llbWVucy9jb21tb24vZnBnYS5jCmluZGV4IGU5OTQxY2QuLmYwMjJlZDYgMTAwNjQ0Ci0tLSBhL2JvYXJkL3NpZW1lbnMvY29tbW9uL2ZwZ2EuYworKysgYi9ib2FyZC9zaWVtZW5zL2NvbW1vbi9mcGdhLmMKQEAgLTIxOSw3ICsyMTksNyBAQAogICAgIHJldHVybiAxOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQlNQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CU1ApCiAKIC8qIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gKi8KIApAQCAtMjk5LDcgKzI5OSw3IEBACiAJImZwZ2EgbG9hZCBbbmFtZV0gYWRkciAtIGxvYWQgRlBHQSBjb25maWd1cmF0aW9uIGRhdGFcbiIKICk7CiAKLSNlbmRpZgkvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JTUCAqLworI2VuZGlmCiAKIC8qIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gKi8KIApkaWZmIC0tZ2l0IGEvYm9hcmQvc2llbWVucy9wY3VfZS9wY3VfZS5jIGIvYm9hcmQvc2llbWVucy9wY3VfZS9wY3VfZS5jCmluZGV4IDNmMDVlNGEuLjIzMDkwNjkgMTAwNjQ0Ci0tLSBhL2JvYXJkL3NpZW1lbnMvcGN1X2UvcGN1X2UuYworKysgYi9ib2FyZC9zaWVtZW5zL3BjdV9lL3BjdV9lLmMKQEAgLTM2OCw3ICszNjgsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogQm9hcmQgU3BlY2lhbCBDb21tYW5kczogYWNjZXNzIGZ1bmN0aW9ucyBmb3IgIlBVTUEiIEZQR0EKICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JTUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQlNQKQogCiAjZGVmaW5lCVBVTUFfUkVBRF9NT0RFCTAKICNkZWZpbmUgUFVNQV9MT0FEX01PREUJMQpAQCAtNDA4LDcgKzQwOCw3IEBACiAJICAgICJzdGF0dXMgLSBwcmludCBQVU1BIHN0YXR1c1xuIgogCSAgICAicHVtYSBsb2FkIGFkZHIgbGVuIC0gbG9hZCBQVU1BIGNvbmZpZ3VyYXRpb24gZGF0YVxuIik7CiAKLSNlbmRpZiAvKiBDRkdfQ01EX0JTUCAqLworI2VuZGlmCiAKIC8qIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gKi8KIApkaWZmIC0tZ2l0IGEvYm9hcmQvc2l4bmV0L3NpeG5ldC5jIGIvYm9hcmQvc2l4bmV0L3NpeG5ldC5jCmluZGV4IGE0Y2I0ZGMuLjc5OGUxODUgMTAwNjQ0Ci0tLSBhL2JvYXJkL3NpeG5ldC9zaXhuZXQuYworKysgYi9ib2FyZC9zaXhuZXQvc2l4bmV0LmMKQEAgLTMzLDcgKzMzLDcgQEAKICMgaW5jbHVkZSA8c3RhdHVzX2xlZC5oPgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2xlZ2FjeS5oPgogZXh0ZXJuIHN0cnVjdCBuYW5kX2NoaXAgbmFuZF9kZXZfZGVzY1tDRkdfTUFYX05BTkRfREVWSUNFXTsKICNlbmRpZgpAQCAtNzUsOSArNzUsOSBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKICNlcnJvciAiU1hOSTg1NVQgaGFzIG5vIFBDTUNJQSBwb3J0IgotI2VuZGlmCS8qIENGR19DTURfUENNQ0lBICovCisjZW5kaWYKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC0zMjcsNyArMzI3LDcgQEAKIAlyZXR1cm4gKDApOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIHZvaWQgbmFuZF9pbml0KHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyB0b3RsZW4gPSBuYW5kX3Byb2JlKENGR19ERkxBU0hfQkFTRSk7CmRpZmYgLS1naXQgYS9ib2FyZC9zbDgyNDUvdS1ib290LmxkcyBiL2JvYXJkL3NsODI0NS91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2I5ZmZkLi4wMDAwMDAwCi0tLSBhL2JvYXJkL3NsODI0NS91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDEKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI0eC9zdGFydC5vCQkoLnRleHQpCi0gICAgbGliX3BwYy9ib2FyZC5vCQkoLnRleHQpCi0gICAgbGliX3BwYy9wcGNzdHJpbmcubwkJKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL3ZzcHJpbnRmLm8JKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL2NyYzMyLm8JCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy96bGliLm8JCSgudGV4dCkKLQotCS4gPSBERUZJTkVEKGVudl9vZmZzZXQpID8gZW52X29mZnNldCA6IC47Ci0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8gKC50ZXh0KQotCi0JKigudGV4dCkKLQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotCi0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC9zbWRrMjQwMC9sb3dsZXZlbF9pbml0LlMgYi9ib2FyZC9zbWRrMjQwMC9sb3dsZXZlbF9pbml0LlMKaW5kZXggYTVkZTgwNi4uYTc5NTlmMyAxMDA2NDQKLS0tIGEvYm9hcmQvc21kazI0MDAvbG93bGV2ZWxfaW5pdC5TCisrKyBiL2JvYXJkL3NtZGsyNDAwL2xvd2xldmVsX2luaXQuUwpAQCAtMTE3LDcgKzExNyw3IEBACiAjZGVmaW5lIFRSRUZNRAkweDAJLyogQ0JSKENBUyBiZWZvcmUgUkFTKS9hdXRvIHJlZnJlc2ggKi8KICNkZWZpbmUgVHJwCTB4MAkvKiAyIGNsayAqLwogI2RlZmluZSBUcmMJMHgzCS8qIDcgY2xrICovCi0jZGVmaW5lIFRjaHIJMHgyIAkvKiAzIGNsayAqLworI2RlZmluZSBUY2hyCTB4MgkvKiAzIGNsayAqLwogCiAjZGVmaW5lIFJFRkNOVAkxMTEzCS8qIHBlcmlvZD0xNS42IHVzLCBIQ0xLPTYwTWh6LCAoMjA0OCsxLTE1LjYqNjYpICovCiAKZGlmZiAtLWdpdCBhL2JvYXJkL3NvcmNlcnkvdS1ib290LmxkcyBiL2JvYXJkL3NvcmNlcnkvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg5YmM3Ny4uMDAwMDAwMAotLS0gYS9ib2FyZC9zb3JjZXJ5L3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMy0yMDA0Ci0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzgyMjAvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvc3BjMTkyMC9ocGkuYyBiL2JvYXJkL3NwYzE5MjAvaHBpLmMKaW5kZXggM2MzNmY3OS4uY2Q3Nzk5YiAxMDA2NDQKLS0tIGEvYm9hcmQvc3BjMTkyMC9ocGkuYworKysgYi9ib2FyZC9zcGMxOTIwL2hwaS5jCkBAIC0xMjIsNyArMTIyLDkgQEAKICNkZWZpbmUgVElOWV9BVVRPSU5DX0JBU0VfQUREUiAweDAKIAogc3RhdGljIGludCBocGlfYWN0aXZhdGUodm9pZCk7CisjaWYgMAogc3RhdGljIHZvaWQgaHBpX2luYWN0aXZhdGUodm9pZCk7CisjZW5kaWYKIHN0YXRpYyB2b2lkIGRzcF9yZXNldCh2b2lkKTsKIAogc3RhdGljIGludCBocGlfd3JpdGVfaW5jKHUzMiBhZGRyLCB1MzIgKmRhdGEsIHUzMiBjb3VudCk7CkBAIC0xMzMsNyArMTM1LDkgQEAKIGludCBocGlfdGVzdCh2b2lkKTsKIHN0YXRpYyBpbnQgaHBpX3dyaXRlX2FkZHJfdGVzdCh1MzIgYWRkcik7CiBzdGF0aWMgaW50IGhwaV9yZWFkX3dyaXRlX3Rlc3QodTMyIGFkZHIsIHUzMiBkYXRhKTsKKyNpZmRlZiBET19USU5ZX1RFU1QKIHN0YXRpYyBpbnQgaHBpX3RpbnlfYXV0b2luY190ZXN0KHZvaWQpOworI2VuZGlmIC8qIERPX1RJTllfVEVTVCAqLwogI2VuZGlmIC8qIENPTkZJR19TUEMxOTIwX0hQSV9URVNUICovCiAKIApAQCAtMTg1LDYgKzE4OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZiAwCiAvKiB0dXJuIG9mZiB0aGUgaG9zdCBwb3J0IGludGVyZmFjZSAqLwogc3RhdGljIHZvaWQgaHBpX2luYWN0aXZhdGUodm9pZCkKIHsKQEAgLTIwMCw2ICsyMDUsNyBAQAogCS8qIGN1cnJlbnRseSBhbHdheXMgb24gVEJEICovCiAKIH0KKyNlbmRpZgogCiAvKiByZXNldCB0aGUgRFNQICovCiBzdGF0aWMgdm9pZCBkc3BfcmVzZXQodm9pZCkKQEAgLTU3MCw2ICs1NzYsNyBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgRE9fVElOWV9URVNUCiBzdGF0aWMgaW50IGhwaV90aW55X2F1dG9pbmNfdGVzdCh2b2lkKQogewogCWludCBpOwpAQCAtNTk5LDUgKzYwNiw2IEBACiAJfQogCXJldHVybiAwOwogfQorI2VuZGlmIC8qIERPX1RJTllfVEVTVCAqLwogCiAjZW5kaWYgLyogQ09ORklHX1NQQzE5MjBfSFBJX1RFU1QgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL3Nzdi9hZG5wZXNjMS9hZG5wZXNjMS5jIGIvYm9hcmQvc3N2L2FkbnBlc2MxL2FkbnBlc2MxLmMKaW5kZXggMmY3MDRhMC4uMmVjM2E3MiAxMDA2NDQKLS0tIGEvYm9hcmQvc3N2L2FkbnBlc2MxL2FkbnBlc2MxLmMKKysrIGIvYm9hcmQvc3N2L2FkbnBlc2MxL2FkbnBlc2MxLmMKQEAgLTY1LDcgKzY1LDcgQEAKIC8qCiAgKiBUaGUgZm9sbG93aW5nIGFyZSB1c2VkIHRvIGNvbnRyb2wgdGhlIFNQSSBjaGlwIHNlbGVjdHMgZm9yIHRoZSBTUEkgY29tbWFuZC4KICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NQSSkgJiYgQ09ORklHX05JT1NfU1BJCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NQSSkgJiYgQ09ORklHX05JT1NfU1BJCiAKICNkZWZpbmUJU1BJX1JUQ19DU19NQVNLCTB4MDAwMDAwMDEKIApAQCAtODksNyArODksNyBAQAogfTsKIGludCBzcGlfY2hpcHNlbF9jbnQgPSBzaXplb2Yoc3BpX2NoaXBzZWwpIC8gc2l6ZW9mKHNwaV9jaGlwc2VsWzBdKTsKIAotI2VuZGlmIC8qIENGR19DTURfU1BJICovCisjZW5kaWYKIAogI2lmCWRlZmluZWQoQ09ORklHX1BPU1QpCiAvKgpkaWZmIC0tZ2l0IGEvYm9hcmQvc3N2L2NvbW1vbi9jbWRfc2xlZC5jIGIvYm9hcmQvc3N2L2NvbW1vbi9jbWRfc2xlZC5jCmluZGV4IGQ2MWZhM2UuLjcxM2VkNjUgMTAwNjQ0Ci0tLSBhL2JvYXJkL3Nzdi9jb21tb24vY21kX3NsZWQuYworKysgYi9ib2FyZC9zc3YvY29tbW9uL2NtZF9zbGVkLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIAogZXh0ZXJuIGxlZF9kZXZfdCBsZWRfZGV2W107CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JTUCkKIGludCBkb19zbGVkIChjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAJaW50IGxlZF9pZCA9IDA7CkBAIC0xNTgsNSArMTU4LDUgQEAKIFVfQk9PVF9DTUQgKHNsZWQsIDMsIDAsIGRvX3NsZWQsCiAJICAgICJzbGVkICAgIC0gY2hlY2sgYW5kIHNldCBzdGF0dXMgbGVkXG4iLAogCSAgICAic2xlZCBbbmFtZSBbc3RhdGVdXVxuIiBfX05BTUVfU1RSICIgICAgLSBzdGF0ZTogb258b2ZmfGJsaW5rXG4iKTsKLSNlbmRpZiAvKiBDRkdfQ01EX0JTUCAqLworI2VuZGlmCiAjZW5kaWYJLyogQ09ORklHX1NUQVRVU19MRUQgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL3Nzdi9jb21tb24vd2RfcGlvLmMgYi9ib2FyZC9zc3YvY29tbW9uL3dkX3Bpby5jCmluZGV4IDMyMTVhYzkuLjk5NDVjNTkgMTAwNjQ0Ci0tLSBhL2JvYXJkL3Nzdi9jb21tb24vd2RfcGlvLmMKKysrIGIvYm9hcmQvc3N2L2NvbW1vbi93ZF9waW8uYwpAQCAtMTEyLDcgKzExMiw3IEBACiAJCWVuYWJsZV9pbnRlcnJ1cHRzICgpOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQlNQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CU1ApCiBpbnQgZG9fd2QgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQogewogCW5pb3NfcGlvX3QgKmVuYV9waW9wCSA9IChuaW9zX3Bpb190KilDT05GSUdfSFdfV0RFTkFfQkFTRTsKQEAgLTE1Niw1ICsxNTYsNSBAQAogCSJ3ZCBvZmYgIC0gc3dpdGNoIHdhdGNoZG9nIG9mZlxuIgogCSJ3ZCAgICAgIC0gcHJpbnQgY3VycmVudCBzdGF0dXNcbiIKICk7Ci0jZW5kaWYJLyogQ0ZHX0NNRF9CU1AgKi8KKyNlbmRpZgogI2VuZGlmCS8qIENPTkZJR19IV19XQVRDSERPRyAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvc3R4c3NhL3N0eHNzYS5jIGIvYm9hcmQvc3R4c3NhL3N0eHNzYS5jCmluZGV4IDBmYjIzM2QuLjU4ODIxMjQgMTAwNjQ0Ci0tLSBhL2JvYXJkL3N0eHNzYS9zdHhzc2EuYworKysgYi9ib2FyZC9zdHhzc2Evc3R4c3NhLmMKQEAgLTUyLDE0NyArNTIsMTQ3IEBACiBjb25zdCBpb3BfY29uZl90IGlvcF9jb25mX3RhYls0XVszMl0gPSB7CiAKICAgICAvKiBQb3J0IEEgY29uZmlndXJhdGlvbiAqLwotICAgIHsgICAvKiAgICAgICAgICAgIGNvbmYgcHBhciBwc29yIHBkaXIgcG9kciBwZGF0ICovCi0JLyogUEEzMSAqLyB7ICAgMCwgICAxLCAgIDAsICAgMSwgICAwLCAgIDAgICB9LCAvKiBGQ0MxIFR4RU5CICovCi0JLyogUEEzMCAqLyB7ICAgMCwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAgICB9LCAvKiBGQ0MxIFR4Q2xhdiAgICovCi0JLyogUEEyOSAqLyB7ICAgMCwgICAxLCAgIDAsICAgMSwgICAwLCAgIDAgICB9LCAvKiBGQ0MxIFR4U09DICAqLwotCS8qIFBBMjggKi8geyAgIDAsICAgMSwgICAwLCAgIDEsICAgMCwgICAwICAgfSwgLyogRkNDMSBSeEVOQiAqLwotCS8qIFBBMjcgKi8geyAgIDAsICAgMSwgICAwLCAgIDAsICAgMCwgICAwICAgfSwgLyogRkNDMSBSeFNPQyAqLwotCS8qIFBBMjYgKi8geyAgIDAsICAgMSwgICAwLCAgIDAsICAgMCwgICAwICAgfSwgLyogRkNDMSBSeENsYXYgKi8KLQkvKiBQQTI1ICovIHsgICAwLCAgIDEsICAgMCwgICAxLCAgIDAsICAgMCAgIH0sIC8qIEZDQzEgQVRNVFhEWzBdICovCi0JLyogUEEyNCAqLyB7ICAgMCwgICAxLCAgIDAsICAgMSwgICAwLCAgIDAgICB9LCAvKiBGQ0MxIEFUTVRYRFsxXSAqLwotCS8qIFBBMjMgKi8geyAgIDAsICAgMSwgICAwLCAgIDEsICAgMCwgICAwICAgfSwgLyogRkNDMSBBVE1UWERbMl0gKi8KLQkvKiBQQTIyICovIHsgICAwLCAgIDEsICAgMCwgICAxLCAgIDAsICAgMCAgIH0sIC8qIEZDQzEgQVRNVFhEWzNdICovCi0JLyogUEEyMSAqLyB7ICAgMCwgICAxLCAgIDAsICAgMSwgICAwLCAgIDAgICB9LCAvKiBGQ0MxIEFUTVRYRFs0XSAqLwotCS8qIFBBMjAgKi8geyAgIDAsICAgMSwgICAwLCAgIDEsICAgMCwgICAwICAgfSwgLyogRkNDMSBBVE1UWERbNV0gKi8KLQkvKiBQQTE5ICovIHsgICAwLCAgIDEsICAgMCwgICAxLCAgIDAsICAgMCAgIH0sIC8qIEZDQzEgQVRNVFhEWzZdICovCi0JLyogUEExOCAqLyB7ICAgMCwgICAxLCAgIDAsICAgMSwgICAwLCAgIDAgICB9LCAvKiBGQ0MxIEFUTVRYRFs3XSAqLwotCS8qIFBBMTcgKi8geyAgIDAsICAgMSwgICAwLCAgIDAsICAgMCwgICAwICAgfSwgLyogRkNDMSBBVE1SWERbN10gKi8KLQkvKiBQQTE2ICovIHsgICAwLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCAgIH0sIC8qIEZDQzEgQVRNUlhEWzZdICovCi0JLyogUEExNSAqLyB7ICAgMCwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAgICB9LCAvKiBGQ0MxIEFUTVJYRFs1XSAqLwotCS8qIFBBMTQgKi8geyAgIDAsICAgMSwgICAwLCAgIDAsICAgMCwgICAwICAgfSwgLyogRkNDMSBBVE1SWERbNF0gKi8KLQkvKiBQQTEzICovIHsgICAwLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCAgIH0sIC8qIEZDQzEgQVRNUlhEWzNdICovCi0JLyogUEExMiAqLyB7ICAgMCwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAgICB9LCAvKiBGQ0MxIEFUTVJYRFsyXSAqLwotCS8qIFBBMTEgKi8geyAgIDAsICAgMSwgICAwLCAgIDAsICAgMCwgICAwICAgfSwgLyogRkNDMSBBVE1SWERbMV0gKi8KLQkvKiBQQTEwICovIHsgICAwLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCAgIH0sIC8qIEZDQzEgQVRNUlhEWzBdICovCi0JLyogUEE5ICAqLyB7ICAgMCwgICAxLCAgIDEsICAgMSwgICAwLCAgIDAgICB9LCAvKiBGQ0MxIEwxVFhEICovCi0JLyogUEE4ICAqLyB7ICAgMCwgICAxLCAgIDEsICAgMCwgICAwLCAgIDAgICB9LCAvKiBGQ0MxIEwxUlhEICovCi0JLyogUEE3ICAqLyB7ICAgMCwgICAwLCAgIDAsICAgMSwgICAwLCAgIDAgICB9LCAvKiBQQTcgKi8KLQkvKiBQQTYgICovIHsgICAwLCAgIDEsICAgMSwgICAxLCAgIDAsICAgMCAgIH0sIC8qIFRETSBBMSBMMVJTWU5DICovCi0JLyogUEE1ICAqLyB7ICAgMCwgICAwLCAgIDAsICAgMSwgICAwLCAgIDAgICB9LCAvKiBQQTUgKi8KLQkvKiBQQTQgICovIHsgICAwLCAgIDAsICAgMCwgICAxLCAgIDAsICAgMCAgIH0sIC8qIFBBNCAqLwotCS8qIFBBMyAgKi8geyAgIDAsICAgMCwgICAwLCAgIDEsICAgMCwgICAwICAgfSwgLyogUEEzICovCi0JLyogUEEyICAqLyB7ICAgMCwgICAwLCAgIDAsICAgMSwgICAwLCAgIDAgICB9LCAvKiBQQTIgKi8KLQkvKiBQQTEgICovIHsgICAxLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCAgIH0sIC8qIEZSRUVSVU4gKi8KLQkvKiBQQTAgICovIHsgICAwLCAgIDAsICAgMCwgICAxLCAgIDAsICAgMCAgIH0gIC8qIFBBMCAqLworICAgIHsJLyoJICAgICAgY29uZiBwcGFyIHBzb3IgcGRpciBwb2RyIHBkYXQgKi8KKwkvKiBQQTMxICovIHsgICAwLCAgIDEsCSAwLCAgIDEsICAgMCwJMCAgIH0sIC8qIEZDQzEgVHhFTkIgKi8KKwkvKiBQQTMwICovIHsgICAwLCAgIDEsCSAwLCAgIDAsICAgMCwJMCAgIH0sIC8qIEZDQzEgVHhDbGF2CSovCisJLyogUEEyOSAqLyB7ICAgMCwgICAxLAkgMCwgICAxLCAgIDAsCTAgICB9LCAvKiBGQ0MxIFR4U09DICAqLworCS8qIFBBMjggKi8geyAgIDAsICAgMSwJIDAsICAgMSwgICAwLAkwICAgfSwgLyogRkNDMSBSeEVOQiAqLworCS8qIFBBMjcgKi8geyAgIDAsICAgMSwJIDAsICAgMCwgICAwLAkwICAgfSwgLyogRkNDMSBSeFNPQyAqLworCS8qIFBBMjYgKi8geyAgIDAsICAgMSwJIDAsICAgMCwgICAwLAkwICAgfSwgLyogRkNDMSBSeENsYXYgKi8KKwkvKiBQQTI1ICovIHsgICAwLCAgIDEsCSAwLCAgIDEsICAgMCwJMCAgIH0sIC8qIEZDQzEgQVRNVFhEWzBdICovCisJLyogUEEyNCAqLyB7ICAgMCwgICAxLAkgMCwgICAxLCAgIDAsCTAgICB9LCAvKiBGQ0MxIEFUTVRYRFsxXSAqLworCS8qIFBBMjMgKi8geyAgIDAsICAgMSwJIDAsICAgMSwgICAwLAkwICAgfSwgLyogRkNDMSBBVE1UWERbMl0gKi8KKwkvKiBQQTIyICovIHsgICAwLCAgIDEsCSAwLCAgIDEsICAgMCwJMCAgIH0sIC8qIEZDQzEgQVRNVFhEWzNdICovCisJLyogUEEyMSAqLyB7ICAgMCwgICAxLAkgMCwgICAxLCAgIDAsCTAgICB9LCAvKiBGQ0MxIEFUTVRYRFs0XSAqLworCS8qIFBBMjAgKi8geyAgIDAsICAgMSwJIDAsICAgMSwgICAwLAkwICAgfSwgLyogRkNDMSBBVE1UWERbNV0gKi8KKwkvKiBQQTE5ICovIHsgICAwLCAgIDEsCSAwLCAgIDEsICAgMCwJMCAgIH0sIC8qIEZDQzEgQVRNVFhEWzZdICovCisJLyogUEExOCAqLyB7ICAgMCwgICAxLAkgMCwgICAxLCAgIDAsCTAgICB9LCAvKiBGQ0MxIEFUTVRYRFs3XSAqLworCS8qIFBBMTcgKi8geyAgIDAsICAgMSwJIDAsICAgMCwgICAwLAkwICAgfSwgLyogRkNDMSBBVE1SWERbN10gKi8KKwkvKiBQQTE2ICovIHsgICAwLCAgIDEsCSAwLCAgIDAsICAgMCwJMCAgIH0sIC8qIEZDQzEgQVRNUlhEWzZdICovCisJLyogUEExNSAqLyB7ICAgMCwgICAxLAkgMCwgICAwLCAgIDAsCTAgICB9LCAvKiBGQ0MxIEFUTVJYRFs1XSAqLworCS8qIFBBMTQgKi8geyAgIDAsICAgMSwJIDAsICAgMCwgICAwLAkwICAgfSwgLyogRkNDMSBBVE1SWERbNF0gKi8KKwkvKiBQQTEzICovIHsgICAwLCAgIDEsCSAwLCAgIDAsICAgMCwJMCAgIH0sIC8qIEZDQzEgQVRNUlhEWzNdICovCisJLyogUEExMiAqLyB7ICAgMCwgICAxLAkgMCwgICAwLCAgIDAsCTAgICB9LCAvKiBGQ0MxIEFUTVJYRFsyXSAqLworCS8qIFBBMTEgKi8geyAgIDAsICAgMSwJIDAsICAgMCwgICAwLAkwICAgfSwgLyogRkNDMSBBVE1SWERbMV0gKi8KKwkvKiBQQTEwICovIHsgICAwLCAgIDEsCSAwLCAgIDAsICAgMCwJMCAgIH0sIC8qIEZDQzEgQVRNUlhEWzBdICovCisJLyogUEE5CSovIHsgICAwLCAgIDEsCSAxLCAgIDEsICAgMCwJMCAgIH0sIC8qIEZDQzEgTDFUWEQgKi8KKwkvKiBQQTgJKi8geyAgIDAsICAgMSwJIDEsICAgMCwgICAwLAkwICAgfSwgLyogRkNDMSBMMVJYRCAqLworCS8qIFBBNwkqLyB7ICAgMCwgICAwLAkgMCwgICAxLCAgIDAsCTAgICB9LCAvKiBQQTcgKi8KKwkvKiBQQTYJKi8geyAgIDAsICAgMSwJIDEsICAgMSwgICAwLAkwICAgfSwgLyogVERNIEExIEwxUlNZTkMgKi8KKwkvKiBQQTUJKi8geyAgIDAsICAgMCwJIDAsICAgMSwgICAwLAkwICAgfSwgLyogUEE1ICovCisJLyogUEE0CSovIHsgICAwLCAgIDAsCSAwLCAgIDEsICAgMCwJMCAgIH0sIC8qIFBBNCAqLworCS8qIFBBMwkqLyB7ICAgMCwgICAwLAkgMCwgICAxLCAgIDAsCTAgICB9LCAvKiBQQTMgKi8KKwkvKiBQQTIJKi8geyAgIDAsICAgMCwJIDAsICAgMSwgICAwLAkwICAgfSwgLyogUEEyICovCisJLyogUEExCSovIHsgICAxLCAgIDAsCSAwLCAgIDAsICAgMCwJMCAgIH0sIC8qIEZSRUVSVU4gKi8KKwkvKiBQQTAJKi8geyAgIDAsICAgMCwJIDAsICAgMSwgICAwLAkwICAgfSAgLyogUEEwICovCiAgICAgfSwKIAogICAgIC8qIFBvcnQgQiBjb25maWd1cmF0aW9uICovCi0gICAgeyAgIC8qICAgICAgICAgICAgY29uZiBwcGFyIHBzb3IgcGRpciBwb2RyIHBkYXQgKi8KLQkvKiBQQjMxICovIHsgICAxLCAgIDEsICAgMCwgICAxLCAgIDAsICAgMCAgIH0sIC8qIEZDQzIgTUlJIFRYX0VSICovCi0JLyogUEIzMCAqLyB7ICAgMSwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAgICB9LCAvKiBGQ0MyIE1JSSBSWF9EViAqLwotCS8qIFBCMjkgKi8geyAgIDEsICAgMSwgICAxLCAgIDEsICAgMCwgICAwICAgfSwgLyogRkNDMiBNSUkgVFhfRU4gKi8KLQkvKiBQQjI4ICovIHsgICAxLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCAgIH0sIC8qIEZDQzIgTUlJIFJYX0VSICovCi0JLyogUEIyNyAqLyB7ICAgMSwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAgICB9LCAvKiBGQ0MyIE1JSSBDT0wgKi8KLQkvKiBQQjI2ICovIHsgICAxLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCAgIH0sIC8qIEZDQzIgTUlJIENSUyAqLwotCS8qIFBCMjUgKi8geyAgIDEsICAgMSwgICAwLCAgIDEsICAgMCwgICAwICAgfSwgLyogRkNDMiBNSUkgVHhEWzNdICovCi0JLyogUEIyNCAqLyB7ICAgMSwgICAxLCAgIDAsICAgMSwgICAwLCAgIDAgICB9LCAvKiBGQ0MyIE1JSSBUeERbMl0gKi8KLQkvKiBQQjIzICovIHsgICAxLCAgIDEsICAgMCwgICAxLCAgIDAsICAgMCAgIH0sIC8qIEZDQzIgTUlJIFR4RFsxXSAqLwotCS8qIFBCMjIgKi8geyAgIDEsICAgMSwgICAwLCAgIDEsICAgMCwgICAwICAgfSwgLyogRkNDMiBNSUkgVHhEWzBdICovCi0JLyogUEIyMSAqLyB7ICAgMSwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAgICB9LCAvKiBGQ0MyIE1JSSBSeERbMF0gKi8KLQkvKiBQQjIwICovIHsgICAxLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCAgIH0sIC8qIEZDQzIgTUlJIFJ4RFsxXSAqLwotCS8qIFBCMTkgKi8geyAgIDEsICAgMSwgICAwLCAgIDAsICAgMCwgICAwICAgfSwgLyogRkNDMiBNSUkgUnhEWzJdICovCi0JLyogUEIxOCAqLyB7ICAgMSwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAgICB9LCAvKiBGQ0MyIE1JSSBSeERbM10gKi8KLQkvKiBQQjE3ICovIHsgICAwLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCAgIH0sIC8qIEZDQzM6UlhfRElWICovCi0JLyogUEIxNiAqLyB7ICAgMCwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAgICB9LCAvKiBGQ0MzOlJYX0VSUiAqLwotCS8qIFBCMTUgKi8geyAgIDAsICAgMSwgICAwLCAgIDEsICAgMCwgICAwICAgfSwgLyogRkNDMzpUWF9FUlIgKi8KLQkvKiBQQjE0ICovIHsgICAwLCAgIDEsICAgMCwgICAxLCAgIDAsICAgMCAgIH0sIC8qIEZDQzM6VFhfRU4gKi8KLQkvKiBQQjEzICovIHsgICAwLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCAgIH0sIC8qIEZDQzM6Q09MICovCi0JLyogUEIxMiAqLyB7ICAgMCwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAgICB9LCAvKiBGQ0MzOkNSUyAqLwotCS8qIFBCMTEgKi8geyAgIDAsICAgMSwgICAwLCAgIDAsICAgMCwgICAwICAgfSwgLyogRkNDMzpSWEQgKi8KLQkvKiBQQjEwICovIHsgICAwLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCAgIH0sIC8qIEZDQzM6UlhEICovCi0JLyogUEI5ICAqLyB7ICAgMCwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAgICB9LCAvKiBGQ0MzOlJYRCAqLwotCS8qIFBCOCAgKi8geyAgIDAsICAgMSwgICAwLCAgIDAsICAgMCwgICAwICAgfSwgLyogRkNDMzpSWEQgKi8KLQkvKiBQQjcgICovIHsgICAwLCAgIDEsICAgMCwgICAxLCAgIDAsICAgMCAgIH0sIC8qIEZDQzM6VFhEICovCi0JLyogUEI2ICAqLyB7ICAgMCwgICAxLCAgIDAsICAgMSwgICAwLCAgIDAgICB9LCAvKiBGQ0MzOlRYRCAqLwotCS8qIFBCNSAgKi8geyAgIDAsICAgMSwgICAwLCAgIDEsICAgMCwgICAwICAgfSwgLyogRkNDMzpUWEQgKi8KLQkvKiBQQjQgICovIHsgICAwLCAgIDEsICAgMCwgICAxLCAgIDAsICAgMCAgIH0sIC8qIEZDQzM6VFhEICovCi0JLyogUEIzICAqLyB7ICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAgICB9LCAvKiBwaW4gZG9lc24ndCBleGlzdCAqLwotCS8qIFBCMiAgKi8geyAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwICAgfSwgLyogcGluIGRvZXNuJ3QgZXhpc3QgKi8KLQkvKiBQQjEgICovIHsgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCAgIH0sIC8qIHBpbiBkb2Vzbid0IGV4aXN0ICovCi0JLyogUEIwICAqLyB7ICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAgICB9ICAvKiBwaW4gZG9lc24ndCBleGlzdCAqLworICAgIHsJLyoJICAgICAgY29uZiBwcGFyIHBzb3IgcGRpciBwb2RyIHBkYXQgKi8KKwkvKiBQQjMxICovIHsgICAxLCAgIDEsCSAwLCAgIDEsICAgMCwJMCAgIH0sIC8qIEZDQzIgTUlJIFRYX0VSICovCisJLyogUEIzMCAqLyB7ICAgMSwgICAxLAkgMCwgICAwLCAgIDAsCTAgICB9LCAvKiBGQ0MyIE1JSSBSWF9EViAqLworCS8qIFBCMjkgKi8geyAgIDEsICAgMSwJIDEsICAgMSwgICAwLAkwICAgfSwgLyogRkNDMiBNSUkgVFhfRU4gKi8KKwkvKiBQQjI4ICovIHsgICAxLCAgIDEsCSAwLCAgIDAsICAgMCwJMCAgIH0sIC8qIEZDQzIgTUlJIFJYX0VSICovCisJLyogUEIyNyAqLyB7ICAgMSwgICAxLAkgMCwgICAwLCAgIDAsCTAgICB9LCAvKiBGQ0MyIE1JSSBDT0wgKi8KKwkvKiBQQjI2ICovIHsgICAxLCAgIDEsCSAwLCAgIDAsICAgMCwJMCAgIH0sIC8qIEZDQzIgTUlJIENSUyAqLworCS8qIFBCMjUgKi8geyAgIDEsICAgMSwJIDAsICAgMSwgICAwLAkwICAgfSwgLyogRkNDMiBNSUkgVHhEWzNdICovCisJLyogUEIyNCAqLyB7ICAgMSwgICAxLAkgMCwgICAxLCAgIDAsCTAgICB9LCAvKiBGQ0MyIE1JSSBUeERbMl0gKi8KKwkvKiBQQjIzICovIHsgICAxLCAgIDEsCSAwLCAgIDEsICAgMCwJMCAgIH0sIC8qIEZDQzIgTUlJIFR4RFsxXSAqLworCS8qIFBCMjIgKi8geyAgIDEsICAgMSwJIDAsICAgMSwgICAwLAkwICAgfSwgLyogRkNDMiBNSUkgVHhEWzBdICovCisJLyogUEIyMSAqLyB7ICAgMSwgICAxLAkgMCwgICAwLCAgIDAsCTAgICB9LCAvKiBGQ0MyIE1JSSBSeERbMF0gKi8KKwkvKiBQQjIwICovIHsgICAxLCAgIDEsCSAwLCAgIDAsICAgMCwJMCAgIH0sIC8qIEZDQzIgTUlJIFJ4RFsxXSAqLworCS8qIFBCMTkgKi8geyAgIDEsICAgMSwJIDAsICAgMCwgICAwLAkwICAgfSwgLyogRkNDMiBNSUkgUnhEWzJdICovCisJLyogUEIxOCAqLyB7ICAgMSwgICAxLAkgMCwgICAwLCAgIDAsCTAgICB9LCAvKiBGQ0MyIE1JSSBSeERbM10gKi8KKwkvKiBQQjE3ICovIHsgICAwLCAgIDEsCSAwLCAgIDAsICAgMCwJMCAgIH0sIC8qIEZDQzM6UlhfRElWICovCisJLyogUEIxNiAqLyB7ICAgMCwgICAxLAkgMCwgICAwLCAgIDAsCTAgICB9LCAvKiBGQ0MzOlJYX0VSUiAqLworCS8qIFBCMTUgKi8geyAgIDAsICAgMSwJIDAsICAgMSwgICAwLAkwICAgfSwgLyogRkNDMzpUWF9FUlIgKi8KKwkvKiBQQjE0ICovIHsgICAwLCAgIDEsCSAwLCAgIDEsICAgMCwJMCAgIH0sIC8qIEZDQzM6VFhfRU4gKi8KKwkvKiBQQjEzICovIHsgICAwLCAgIDEsCSAwLCAgIDAsICAgMCwJMCAgIH0sIC8qIEZDQzM6Q09MICovCisJLyogUEIxMiAqLyB7ICAgMCwgICAxLAkgMCwgICAwLCAgIDAsCTAgICB9LCAvKiBGQ0MzOkNSUyAqLworCS8qIFBCMTEgKi8geyAgIDAsICAgMSwJIDAsICAgMCwgICAwLAkwICAgfSwgLyogRkNDMzpSWEQgKi8KKwkvKiBQQjEwICovIHsgICAwLCAgIDEsCSAwLCAgIDAsICAgMCwJMCAgIH0sIC8qIEZDQzM6UlhEICovCisJLyogUEI5CSovIHsgICAwLCAgIDEsCSAwLCAgIDAsICAgMCwJMCAgIH0sIC8qIEZDQzM6UlhEICovCisJLyogUEI4CSovIHsgICAwLCAgIDEsCSAwLCAgIDAsICAgMCwJMCAgIH0sIC8qIEZDQzM6UlhEICovCisJLyogUEI3CSovIHsgICAwLCAgIDEsCSAwLCAgIDEsICAgMCwJMCAgIH0sIC8qIEZDQzM6VFhEICovCisJLyogUEI2CSovIHsgICAwLCAgIDEsCSAwLCAgIDEsICAgMCwJMCAgIH0sIC8qIEZDQzM6VFhEICovCisJLyogUEI1CSovIHsgICAwLCAgIDEsCSAwLCAgIDEsICAgMCwJMCAgIH0sIC8qIEZDQzM6VFhEICovCisJLyogUEI0CSovIHsgICAwLCAgIDEsCSAwLCAgIDEsICAgMCwJMCAgIH0sIC8qIEZDQzM6VFhEICovCisJLyogUEIzCSovIHsgICAwLCAgIDAsCSAwLCAgIDAsICAgMCwJMCAgIH0sIC8qIHBpbiBkb2Vzbid0IGV4aXN0ICovCisJLyogUEIyCSovIHsgICAwLCAgIDAsCSAwLCAgIDAsICAgMCwJMCAgIH0sIC8qIHBpbiBkb2Vzbid0IGV4aXN0ICovCisJLyogUEIxCSovIHsgICAwLCAgIDAsCSAwLCAgIDAsICAgMCwJMCAgIH0sIC8qIHBpbiBkb2Vzbid0IGV4aXN0ICovCisJLyogUEIwCSovIHsgICAwLCAgIDAsCSAwLCAgIDAsICAgMCwJMCAgIH0gIC8qIHBpbiBkb2Vzbid0IGV4aXN0ICovCiAgICAgfSwKIAogICAgIC8qIFBvcnQgQyAqLwotICAgIHsgICAvKiAgICAgICAgICAgIGNvbmYgcHBhciBwc29yIHBkaXIgcG9kciBwZGF0ICovCi0JLyogUEMzMSAqLyB7ICAgMCwgICAwLCAgIDAsICAgMSwgICAwLCAgIDAgICB9LCAvKiBQQzMxICovCi0JLyogUEMzMCAqLyB7ICAgMCwgICAwLCAgIDAsICAgMSwgICAwLCAgIDAgICB9LCAvKiBQQzMwICovCi0JLyogUEMyOSAqLyB7ICAgMCwgICAxLCAgIDEsICAgMCwgICAwLCAgIDAgICB9LCAvKiBTQ0MxIEVOICpDTFNOICovCi0JLyogUEMyOCAqLyB7ICAgMCwgICAwLCAgIDAsICAgMSwgICAwLCAgIDAgICB9LCAvKiBQQzI4ICovCi0JLyogUEMyNyAqLyB7ICAgMCwgICAwLCAgIDAsICAgMSwgICAwLCAgIDAgICB9LCAvKiBVQVJUIENsb2NrIGluICovCi0JLyogUEMyNiAqLyB7ICAgMCwgICAwLCAgIDAsICAgMSwgICAwLCAgIDAgICB9LCAvKiBQQzI2ICovCi0JLyogUEMyNSAqLyB7ICAgMCwgICAwLCAgIDAsICAgMSwgICAwLCAgIDAgICB9LCAvKiBQQzI1ICovCi0JLyogUEMyNCAqLyB7ICAgMCwgICAwLCAgIDAsICAgMSwgICAwLCAgIDAgICB9LCAvKiBQQzI0ICovCi0JLyogUEMyMyAqLyB7ICAgMCwgICAxLCAgIDAsICAgMSwgICAwLCAgIDAgICB9LCAvKiBBVE1URkNMSyAqLwotCS8qIFBDMjIgKi8geyAgIDAsICAgMSwgICAwLCAgIDAsICAgMCwgICAwICAgfSwgLyogQVRNUkZDTEsgKi8KLQkvKiBQQzIxICovIHsgICAwLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCAgIH0sIC8qIFNDQzEgRU4gUlhDTEsgKi8KLQkvKiBQQzIwICovIHsgICAwLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCAgIH0sIC8qIFNDQzEgRU4gVFhDTEsgKi8KLQkvKiBQQzE5ICovIHsgICAxLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCAgIH0sIC8qIEZDQzIgTUlJIFJYX0NMSyBDTEsxMyAqLwotCS8qIFBDMTggKi8geyAgIDEsICAgMSwgICAwLCAgIDAsICAgMCwgICAwICAgfSwgLyogRkNDIFR4IENsb2NrIChDTEsxNCkgKi8KLQkvKiBQQzE3ICovIHsgICAwLCAgIDAsICAgMCwgICAxLCAgIDAsICAgMCAgIH0sIC8qIFBDMTcgKi8KLQkvKiBQQzE2ICovIHsgICAwLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCAgIH0sIC8qIEZDQyBUeCBDbG9jayAoQ0xLMTYpICovCi0JLyogUEMxNSAqLyB7ICAgMCwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAgICB9LCAvKiBQQzE1ICovCi0JLyogUEMxNCAqLyB7ICAgMCwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAgICB9LCAvKiBTQ0MxIEVOICpDRCAqLwotCS8qIFBDMTMgKi8geyAgIDAsICAgMCwgICAwLCAgIDEsICAgMCwgICAwICAgfSwgLyogUEMxMyAqLwotCS8qIFBDMTIgKi8geyAgIDAsICAgMSwgICAwLCAgIDEsICAgMCwgICAwICAgfSwgLyogUEMxMiAqLwotCS8qIFBDMTEgKi8geyAgIDAsICAgMCwgICAwLCAgIDEsICAgMCwgICAwICAgfSwgLyogTFhUOTcxIHRyYW5zbWl0IGNvbnRyb2wgKi8KLQkvKiBQQzEwICovIHsgICAwLCAgIDAsICAgMCwgICAxLCAgIDAsICAgMCAgIH0sIC8qIEZFVEhNREMgKi8KLQkvKiBQQzkgICovIHsgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCAgIH0sIC8qIEZFVEhNRElPICovCi0JLyogUEM4ICAqLyB7ICAgMCwgICAwLCAgIDAsICAgMSwgICAwLCAgIDAgICB9LCAvKiBQQzggKi8KLQkvKiBQQzcgICovIHsgICAwLCAgIDAsICAgMCwgICAxLCAgIDAsICAgMCAgIH0sIC8qIFBDNyAqLwotCS8qIFBDNiAgKi8geyAgIDAsICAgMCwgICAwLCAgIDEsICAgMCwgICAwICAgfSwgLyogUEM2ICovCi0JLyogUEM1ICAqLyB7ICAgMCwgICAwLCAgIDAsICAgMSwgICAwLCAgIDAgICB9LCAvKiBQQzUgKi8KLQkvKiBQQzQgICovIHsgICAwLCAgIDAsICAgMCwgICAxLCAgIDAsICAgMCAgIH0sIC8qIFBDNCAqLwotCS8qIFBDMyAgKi8geyAgIDAsICAgMCwgICAwLCAgIDEsICAgMCwgICAwICAgfSwgLyogUEMzICovCi0JLyogUEMyICAqLyB7ICAgMCwgICAwLCAgIDAsICAgMSwgICAwLCAgIDEgICB9LCAvKiBFTkVUIEZERSAqLwotCS8qIFBDMSAgKi8geyAgIDAsICAgMCwgICAwLCAgIDEsICAgMCwgICAwICAgfSwgLyogRU5FVCBEU1FFICovCi0JLyogUEMwICAqLyB7ICAgMCwgICAwLCAgIDAsICAgMSwgICAwLCAgIDAgICB9LCAvKiBFTkVUIExCSyAqLworICAgIHsJLyoJICAgICAgY29uZiBwcGFyIHBzb3IgcGRpciBwb2RyIHBkYXQgKi8KKwkvKiBQQzMxICovIHsgICAwLCAgIDAsCSAwLCAgIDEsICAgMCwJMCAgIH0sIC8qIFBDMzEgKi8KKwkvKiBQQzMwICovIHsgICAwLCAgIDAsCSAwLCAgIDEsICAgMCwJMCAgIH0sIC8qIFBDMzAgKi8KKwkvKiBQQzI5ICovIHsgICAwLCAgIDEsCSAxLCAgIDAsICAgMCwJMCAgIH0sIC8qIFNDQzEgRU4gKkNMU04gKi8KKwkvKiBQQzI4ICovIHsgICAwLCAgIDAsCSAwLCAgIDEsICAgMCwJMCAgIH0sIC8qIFBDMjggKi8KKwkvKiBQQzI3ICovIHsgICAwLCAgIDAsCSAwLCAgIDEsICAgMCwJMCAgIH0sIC8qIFVBUlQgQ2xvY2sgaW4gKi8KKwkvKiBQQzI2ICovIHsgICAwLCAgIDAsCSAwLCAgIDEsICAgMCwJMCAgIH0sIC8qIFBDMjYgKi8KKwkvKiBQQzI1ICovIHsgICAwLCAgIDAsCSAwLCAgIDEsICAgMCwJMCAgIH0sIC8qIFBDMjUgKi8KKwkvKiBQQzI0ICovIHsgICAwLCAgIDAsCSAwLCAgIDEsICAgMCwJMCAgIH0sIC8qIFBDMjQgKi8KKwkvKiBQQzIzICovIHsgICAwLCAgIDEsCSAwLCAgIDEsICAgMCwJMCAgIH0sIC8qIEFUTVRGQ0xLICovCisJLyogUEMyMiAqLyB7ICAgMCwgICAxLAkgMCwgICAwLCAgIDAsCTAgICB9LCAvKiBBVE1SRkNMSyAqLworCS8qIFBDMjEgKi8geyAgIDAsICAgMSwJIDAsICAgMCwgICAwLAkwICAgfSwgLyogU0NDMSBFTiBSWENMSyAqLworCS8qIFBDMjAgKi8geyAgIDAsICAgMSwJIDAsICAgMCwgICAwLAkwICAgfSwgLyogU0NDMSBFTiBUWENMSyAqLworCS8qIFBDMTkgKi8geyAgIDEsICAgMSwJIDAsICAgMCwgICAwLAkwICAgfSwgLyogRkNDMiBNSUkgUlhfQ0xLIENMSzEzICovCisJLyogUEMxOCAqLyB7ICAgMSwgICAxLAkgMCwgICAwLCAgIDAsCTAgICB9LCAvKiBGQ0MgVHggQ2xvY2sgKENMSzE0KSAqLworCS8qIFBDMTcgKi8geyAgIDAsICAgMCwJIDAsICAgMSwgICAwLAkwICAgfSwgLyogUEMxNyAqLworCS8qIFBDMTYgKi8geyAgIDAsICAgMSwJIDAsICAgMCwgICAwLAkwICAgfSwgLyogRkNDIFR4IENsb2NrIChDTEsxNikgKi8KKwkvKiBQQzE1ICovIHsgICAwLCAgIDEsCSAwLCAgIDAsICAgMCwJMCAgIH0sIC8qIFBDMTUgKi8KKwkvKiBQQzE0ICovIHsgICAwLCAgIDEsCSAwLCAgIDAsICAgMCwJMCAgIH0sIC8qIFNDQzEgRU4gKkNEICovCisJLyogUEMxMyAqLyB7ICAgMCwgICAwLAkgMCwgICAxLCAgIDAsCTAgICB9LCAvKiBQQzEzICovCisJLyogUEMxMiAqLyB7ICAgMCwgICAxLAkgMCwgICAxLCAgIDAsCTAgICB9LCAvKiBQQzEyICovCisJLyogUEMxMSAqLyB7ICAgMCwgICAwLAkgMCwgICAxLCAgIDAsCTAgICB9LCAvKiBMWFQ5NzEgdHJhbnNtaXQgY29udHJvbCAqLworCS8qIFBDMTAgKi8geyAgIDAsICAgMCwJIDAsICAgMSwgICAwLAkwICAgfSwgLyogRkVUSE1EQyAqLworCS8qIFBDOQkqLyB7ICAgMCwgICAwLAkgMCwgICAwLCAgIDAsCTAgICB9LCAvKiBGRVRITURJTyAqLworCS8qIFBDOAkqLyB7ICAgMCwgICAwLAkgMCwgICAxLCAgIDAsCTAgICB9LCAvKiBQQzggKi8KKwkvKiBQQzcJKi8geyAgIDAsICAgMCwJIDAsICAgMSwgICAwLAkwICAgfSwgLyogUEM3ICovCisJLyogUEM2CSovIHsgICAwLCAgIDAsCSAwLCAgIDEsICAgMCwJMCAgIH0sIC8qIFBDNiAqLworCS8qIFBDNQkqLyB7ICAgMCwgICAwLAkgMCwgICAxLCAgIDAsCTAgICB9LCAvKiBQQzUgKi8KKwkvKiBQQzQJKi8geyAgIDAsICAgMCwJIDAsICAgMSwgICAwLAkwICAgfSwgLyogUEM0ICovCisJLyogUEMzCSovIHsgICAwLCAgIDAsCSAwLCAgIDEsICAgMCwJMCAgIH0sIC8qIFBDMyAqLworCS8qIFBDMgkqLyB7ICAgMCwgICAwLAkgMCwgICAxLCAgIDAsCTEgICB9LCAvKiBFTkVUIEZERSAqLworCS8qIFBDMQkqLyB7ICAgMCwgICAwLAkgMCwgICAxLCAgIDAsCTAgICB9LCAvKiBFTkVUIERTUUUgKi8KKwkvKiBQQzAJKi8geyAgIDAsICAgMCwJIDAsICAgMSwgICAwLAkwICAgfSwgLyogRU5FVCBMQksgKi8KICAgICB9LAogCiAgICAgLyogUG9ydCBEICovCi0gICAgeyAgIC8qICAgICAgICAgICAgY29uZiBwcGFyIHBzb3IgcGRpciBwb2RyIHBkYXQgKi8KLQkvKiBQRDMxICovIHsgICAwLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCAgIH0sIC8qIFNDQzEgRU4gUnhEICovCi0JLyogUEQzMCAqLyB7ICAgMCwgICAxLCAgIDEsICAgMSwgICAwLCAgIDAgICB9LCAvKiBTQ0MxIEVOIFR4RCAqLwotCS8qIFBEMjkgKi8geyAgIDAsICAgMSwgICAwLCAgIDEsICAgMCwgICAwICAgfSwgLyogU0NDMSBFTiBURU5BICovCi0JLyogUEQyOCAqLyB7ICAgMSwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAgICB9LCAvKiBTQ0MyIFJ4RCAqLwotCS8qIFBEMjcgKi8geyAgIDEsICAgMSwgICAwLCAgIDEsICAgMCwgICAwICAgfSwgLyogU0NDMiBUeEQgKi8KLQkvKiBQRDI2ICovIHsgICAwLCAgIDAsICAgMCwgICAxLCAgIDAsICAgMCAgIH0sIC8qIFBEMjYgKi8KLQkvKiBQRDI1ICovIHsgICAwLCAgIDAsICAgMCwgICAxLCAgIDAsICAgMCAgIH0sIC8qIFBEMjUgKi8KLQkvKiBQRDI0ICovIHsgICAwLCAgIDAsICAgMCwgICAxLCAgIDAsICAgMCAgIH0sIC8qIFBEMjQgKi8KLQkvKiBQRDIzICovIHsgICAwLCAgIDAsICAgMCwgICAxLCAgIDAsICAgMCAgIH0sIC8qIFBEMjMgKi8KLQkvKiBQRDIyICovIHsgICAwLCAgIDAsICAgMCwgICAxLCAgIDAsICAgMCAgIH0sIC8qIFBEMjIgKi8KLQkvKiBQRDIxICovIHsgICAwLCAgIDAsICAgMCwgICAxLCAgIDAsICAgMCAgIH0sIC8qIFBEMjEgKi8KLQkvKiBQRDIwICovIHsgICAwLCAgIDAsICAgMCwgICAxLCAgIDAsICAgMCAgIH0sIC8qIFBEMjAgKi8KLQkvKiBQRDE5ICovIHsgICAwLCAgIDAsICAgMCwgICAxLCAgIDAsICAgMCAgIH0sIC8qIFBEMTkgKi8KLQkvKiBQRDE4ICovIHsgICAwLCAgIDAsICAgMCwgICAxLCAgIDAsICAgMCAgIH0sIC8qIFBEMTggKi8KLQkvKiBQRDE3ICovIHsgICAwLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCAgIH0sIC8qIEZDQzEgQVRNUlhQUlRZICovCi0JLyogUEQxNiAqLyB7ICAgMCwgICAxLCAgIDAsICAgMSwgICAwLCAgIDAgICB9LCAvKiBGQ0MxIEFUTVRYUFJUWSAqLwotCS8qIFBEMTUgKi8geyAgIDEsICAgMSwgICAxLCAgIDAsICAgMSwgICAwICAgfSwgLyogSTJDIFNEQSAqLwotCS8qIFBEMTQgKi8geyAgIDEsICAgMSwgICAxLCAgIDAsICAgMCwgICAwICAgfSwgLyogSTJDIENMSyAqLwotCS8qIFBEMTMgKi8geyAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwICAgfSwgLyogUEQxMyAqLwotCS8qIFBEMTIgKi8geyAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwICAgfSwgLyogUEQxMiAqLwotCS8qIFBEMTEgKi8geyAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwICAgfSwgLyogUEQxMSAqLwotCS8qIFBEMTAgKi8geyAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwICAgfSwgLyogUEQxMCAqLwotCS8qIFBEOSAgKi8geyAgIDAsICAgMSwgICAwLCAgIDEsICAgMCwgICAwICAgfSwgLyogU01DMSBUWEQgKi8KLQkvKiBQRDggICovIHsgICAwLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCAgIH0sIC8qIFNNQzEgUlhEICovCi0JLyogUEQ3ICAqLyB7ICAgMCwgICAwLCAgIDAsICAgMSwgICAwLCAgIDEgICB9LCAvKiBQRDcgKi8KLQkvKiBQRDYgICovIHsgICAwLCAgIDAsICAgMCwgICAxLCAgIDAsICAgMSAgIH0sIC8qIFBENiAqLwotCS8qIFBENSAgKi8geyAgIDAsICAgMCwgICAwLCAgIDEsICAgMCwgICAxICAgfSwgLyogUEQ1ICovCi0JLyogUEQ0ICAqLyB7ICAgMCwgICAwLCAgIDAsICAgMSwgICAwLCAgIDEgICB9LCAvKiBQRDQgKi8KLQkvKiBQRDMgICovIHsgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCAgIH0sIC8qIHBpbiBkb2Vzbid0IGV4aXN0ICovCi0JLyogUEQyICAqLyB7ICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAgICB9LCAvKiBwaW4gZG9lc24ndCBleGlzdCAqLwotCS8qIFBEMSAgKi8geyAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwICAgfSwgLyogcGluIGRvZXNuJ3QgZXhpc3QgKi8KLQkvKiBQRDAgICovIHsgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCAgIH0gIC8qIHBpbiBkb2Vzbid0IGV4aXN0ICovCisgICAgewkvKgkgICAgICBjb25mIHBwYXIgcHNvciBwZGlyIHBvZHIgcGRhdCAqLworCS8qIFBEMzEgKi8geyAgIDAsICAgMSwJIDAsICAgMCwgICAwLAkwICAgfSwgLyogU0NDMSBFTiBSeEQgKi8KKwkvKiBQRDMwICovIHsgICAwLCAgIDEsCSAxLCAgIDEsICAgMCwJMCAgIH0sIC8qIFNDQzEgRU4gVHhEICovCisJLyogUEQyOSAqLyB7ICAgMCwgICAxLAkgMCwgICAxLCAgIDAsCTAgICB9LCAvKiBTQ0MxIEVOIFRFTkEgKi8KKwkvKiBQRDI4ICovIHsgICAxLCAgIDEsCSAwLCAgIDAsICAgMCwJMCAgIH0sIC8qIFNDQzIgUnhEICovCisJLyogUEQyNyAqLyB7ICAgMSwgICAxLAkgMCwgICAxLCAgIDAsCTAgICB9LCAvKiBTQ0MyIFR4RCAqLworCS8qIFBEMjYgKi8geyAgIDAsICAgMCwJIDAsICAgMSwgICAwLAkwICAgfSwgLyogUEQyNiAqLworCS8qIFBEMjUgKi8geyAgIDAsICAgMCwJIDAsICAgMSwgICAwLAkwICAgfSwgLyogUEQyNSAqLworCS8qIFBEMjQgKi8geyAgIDAsICAgMCwJIDAsICAgMSwgICAwLAkwICAgfSwgLyogUEQyNCAqLworCS8qIFBEMjMgKi8geyAgIDAsICAgMCwJIDAsICAgMSwgICAwLAkwICAgfSwgLyogUEQyMyAqLworCS8qIFBEMjIgKi8geyAgIDAsICAgMCwJIDAsICAgMSwgICAwLAkwICAgfSwgLyogUEQyMiAqLworCS8qIFBEMjEgKi8geyAgIDAsICAgMCwJIDAsICAgMSwgICAwLAkwICAgfSwgLyogUEQyMSAqLworCS8qIFBEMjAgKi8geyAgIDAsICAgMCwJIDAsICAgMSwgICAwLAkwICAgfSwgLyogUEQyMCAqLworCS8qIFBEMTkgKi8geyAgIDAsICAgMCwJIDAsICAgMSwgICAwLAkwICAgfSwgLyogUEQxOSAqLworCS8qIFBEMTggKi8geyAgIDAsICAgMCwJIDAsICAgMSwgICAwLAkwICAgfSwgLyogUEQxOCAqLworCS8qIFBEMTcgKi8geyAgIDAsICAgMSwJIDAsICAgMCwgICAwLAkwICAgfSwgLyogRkNDMSBBVE1SWFBSVFkgKi8KKwkvKiBQRDE2ICovIHsgICAwLCAgIDEsCSAwLCAgIDEsICAgMCwJMCAgIH0sIC8qIEZDQzEgQVRNVFhQUlRZICovCisJLyogUEQxNSAqLyB7ICAgMSwgICAxLAkgMSwgICAwLCAgIDEsCTAgICB9LCAvKiBJMkMgU0RBICovCisJLyogUEQxNCAqLyB7ICAgMSwgICAxLAkgMSwgICAwLCAgIDAsCTAgICB9LCAvKiBJMkMgQ0xLICovCisJLyogUEQxMyAqLyB7ICAgMCwgICAwLAkgMCwgICAwLCAgIDAsCTAgICB9LCAvKiBQRDEzICovCisJLyogUEQxMiAqLyB7ICAgMCwgICAwLAkgMCwgICAwLCAgIDAsCTAgICB9LCAvKiBQRDEyICovCisJLyogUEQxMSAqLyB7ICAgMCwgICAwLAkgMCwgICAwLCAgIDAsCTAgICB9LCAvKiBQRDExICovCisJLyogUEQxMCAqLyB7ICAgMCwgICAwLAkgMCwgICAwLCAgIDAsCTAgICB9LCAvKiBQRDEwICovCisJLyogUEQ5CSovIHsgICAwLCAgIDEsCSAwLCAgIDEsICAgMCwJMCAgIH0sIC8qIFNNQzEgVFhEICovCisJLyogUEQ4CSovIHsgICAwLCAgIDEsCSAwLCAgIDAsICAgMCwJMCAgIH0sIC8qIFNNQzEgUlhEICovCisJLyogUEQ3CSovIHsgICAwLCAgIDAsCSAwLCAgIDEsICAgMCwJMSAgIH0sIC8qIFBENyAqLworCS8qIFBENgkqLyB7ICAgMCwgICAwLAkgMCwgICAxLCAgIDAsCTEgICB9LCAvKiBQRDYgKi8KKwkvKiBQRDUJKi8geyAgIDAsICAgMCwJIDAsICAgMSwgICAwLAkxICAgfSwgLyogUEQ1ICovCisJLyogUEQ0CSovIHsgICAwLCAgIDAsCSAwLCAgIDEsICAgMCwJMSAgIH0sIC8qIFBENCAqLworCS8qIFBEMwkqLyB7ICAgMCwgICAwLAkgMCwgICAwLCAgIDAsCTAgICB9LCAvKiBwaW4gZG9lc24ndCBleGlzdCAqLworCS8qIFBEMgkqLyB7ICAgMCwgICAwLAkgMCwgICAwLCAgIDAsCTAgICB9LCAvKiBwaW4gZG9lc24ndCBleGlzdCAqLworCS8qIFBEMQkqLyB7ICAgMCwgICAwLAkgMCwgICAwLCAgIDAsCTAgICB9LCAvKiBwaW4gZG9lc24ndCBleGlzdCAqLworCS8qIFBEMAkqLyB7ICAgMCwgICAwLAkgMCwgICAwLCAgIDAsCTAgICB9ICAvKiBwaW4gZG9lc24ndCBleGlzdCAqLwogICAgIH0KIH07CiAKQEAgLTIyNywxMiArMjI3LDEyIEBACiAjaWYgKENPTkZJR19FVEhFUl9JTkRFWCA9PSAyKQogCWJjc3ItPmJjc3IyICY9IH5GRVRIMl9SU1Q7CiAJdWRlbGF5KDIpOwotCWJjc3ItPmJjc3IyIHw9ICBGRVRIMl9SU1Q7CisJYmNzci0+YmNzcjIgfD0JRkVUSDJfUlNUOwogCXVkZWxheSgxMDAwKTsKICNlbGlmIChDT05GSUdfRVRIRVJfSU5ERVggPT0gMykKIAliY3NyLT5iY3NyMyAmPSB+RkVUSDNfUlNUOwogCXVkZWxheSgyKTsKLQliY3NyLT5iY3NyMyB8PSAgRkVUSDNfUlNUOworCWJjc3ItPmJjc3IzIHw9CUZFVEgzX1JTVDsKIAl1ZGVsYXkoMTAwMCk7CiAjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19NSUkpICYmIGRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZDQykKQEAgLTI1MiwxMCArMjUyLDEwIEBACiBib2FyZF9lYXJseV9pbml0X2Yodm9pZCkKIHsKICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0gICAgdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopQ0ZHX0lNTVI7Ci0gICAgdm9sYXRpbGUgY2Nzcl9wY2l4X3QgKnBjaSA9ICZpbW1yLT5pbV9wY2l4OworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKUNGR19JTU1SOworCXZvbGF0aWxlIGNjc3JfcGNpeF90ICpwY2kgPSAmaW1tci0+aW1fcGNpeDsKIAotICAgIHBjaS0+cGVlciAmPSAweGZmZmZmZmZkZjsgLyogZGlzYWJsZSBtYXN0ZXIgYWJvcnQgKi8KKwlwY2ktPnBlZXIgJj0gMHhmZmZmZmZkZjsgLyogZGlzYWJsZSBtYXN0ZXIgYWJvcnQgKi8KICNlbmRpZgogCiAJLyogV2h5IGlzIHRoZSBwaHkgcmVzZXQgZG9uZSBfYWZ0ZXJfIHRoZSBldGhlcm5ldApkaWZmIC0tZ2l0IGEvYm9hcmQvc3R4eHRjL3N0eHh0Yy5jIGIvYm9hcmQvc3R4eHRjL3N0eHh0Yy5jCmluZGV4IDdjYWYwNmEuLjg3YTIwMjIgMTAwNjQ0Ci0tLSBhL2JvYXJkL3N0eHh0Yy9zdHh4dGMuYworKysgYi9ib2FyZC9zdHh4dGMvc3R4eHRjLmMKQEAgLTU3NCw3ICs1NzQsNyBAQAogCXJldHVybiAwOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2xlZ2FjeS5oPgogCmRpZmYgLS1naXQgYS9ib2FyZC9zdm1fc2M4eHgvc3ZtX3NjOHh4LmMgYi9ib2FyZC9zdm1fc2M4eHgvc3ZtX3NjOHh4LmMKaW5kZXggOWJiOWZkMC4uYjkwMGU2YiAxMDA2NDQKLS0tIGEvYm9hcmQvc3ZtX3NjOHh4L3N2bV9zYzh4eC5jCisrKyBiL2JvYXJkL3N2bV9zYzh4eC9zdm1fc2M4eHguYwpAQCAtMTUzLDcgKzE1Myw3IEBACiAJcmV0dXJuIChzaXplX2IwICk7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ET0MpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RPQykKIGV4dGVybiB2b2lkIGRvY19wcm9iZSAodWxvbmcgcGh5c2Fkcik7CiB2b2lkIGRvY19pbml0ICh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYm9hcmQvdG90YWw1MjAwL3RvdGFsNTIwMC5jIGIvYm9hcmQvdG90YWw1MjAwL3RvdGFsNTIwMC5jCmluZGV4IDFhMzUxODcuLmYzMmRhZGYgMTAwNjQ0Ci0tLSBhL2JvYXJkL3RvdGFsNTIwMC90b3RhbDUyMDAuYworKysgYi9ib2FyZC90b3RhbDUyMDAvdG90YWw1MjAwLmMKQEAgLTEwOSw3ICsxMDksNyBAQAogfQogI2VuZGlmCiAKLSNpZiBkZWZpbmVkIChDRkdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfUkVTRVQpCiAKIC8qIElSREFfMSBha2EgUFNDNl8zIChwaW4gQzEzKSAqLwogI2RlZmluZSBHUElPX0lSREFfMQkweDIwMDAwMDAwVUwKQEAgLTEzMyw3ICsxMzMsNyBAQAogCQkqKHZ1X2xvbmcgKikgTVBDNVhYWF9HUElPX0RBVEFfTyB8PSAgR1BJT19JUkRBXzE7CiAJfQogfQotI2VuZGlmIC8qIGRlZmluZWQgKENGR19DTURfSURFKSAmJiBkZWZpbmVkIChDT05GSUdfSURFX1JFU0VUKSAqLworI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfVklERU9fU0VEMTM4MDYKICNpbmNsdWRlIDxzZWQxMzgwNi5oPgpkaWZmIC0tZ2l0IGEvYm9hcmQvdG90YWw1MjAwL3UtYm9vdC5sZHMgYi9ib2FyZC90b3RhbDUyMDAvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NjMjk2OC4uMDAwMDAwMAotLS0gYS9ib2FyZC90b3RhbDUyMDAvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAzLTIwMDQKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjNXh4eC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19CmRpZmYgLS1naXQgYS9ib2FyZC90cW01MjAwL2NtZF9zdGs1Mnh4LmMgYi9ib2FyZC90cW01MjAwL2NtZF9zdGs1Mnh4LmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA3YWY2OWYyLi5iNzQ2Njc5Ci0tLSBhL2JvYXJkL3RxbTUyMDAvY21kX3N0azUyeHguYworKysgYi9ib2FyZC90cW01MjAwL2NtZF9zdGs1Mnh4LmMKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxjb21tYW5kLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JTUCkKIAogI2lmIGRlZmluZWQoQ09ORklHX1NUSzUyWFgpIHx8IGRlZmluZWQoQ09ORklHX0ZPMzAwKQogI2RlZmluZSBERUZBVUxUX1ZPTAk0NQpAQCAtMTI0MSw0ICsxMjQxLDQgQEAKIAkiICAgICAtIGxvb3BiYWNrIHBsdWcocykgZm9yIFgyMS9YMjIgcmVxdWlyZWRcbiIKICk7CiAjZW5kaWYKLSNlbmRpZiAvKiBDRkdfQ01EX0JTUCAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC90cW01MjAwL2NtZF90YjUyMDAuYyBiL2JvYXJkL3RxbTUyMDAvY21kX3RiNTIwMC5jCmluZGV4IDg3ODRiMWYuLjIxNGRjYTYgMTAwNjQ0Ci0tLSBhL2JvYXJkL3RxbTUyMDAvY21kX3RiNTIwMC5jCisrKyBiL2JvYXJkL3RxbTUyMDAvY21kX3RiNTIwMC5jCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQlNQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CU1ApCiAjaWYgZGVmaW5lZCAoQ09ORklHX1RCNTIwMCkKIAogI2RlZmluZSBTTTUwMV9QQU5FTF9ESVNQTEFZX0NPTlRST0wJMHgwMDA4MDAwMFVMCkBAIC0xMDEsNCArMTAxLDQgQEAKIAkpOwogCiAjZW5kaWYgLyogQ09ORklHX1NUSzUyWFggKi8KLSNlbmRpZiAvKiBDRkdfQ01EX0JTUCAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC90cW01MjAwL3RxbTUyMDAuYyBiL2JvYXJkL3RxbTUyMDAvdHFtNTIwMC5jCmluZGV4IGE0MzIyYjYuLjUxZjRhZWIgMTAwNjQ0Ci0tLSBhL2JvYXJkL3RxbTUyMDAvdHFtNTIwMC5jCisrKyBiL2JvYXJkL3RxbTUyMDAvdHFtNTIwMC5jCkBAIC0zMiw2ICszMiwxMCBAQAogI2luY2x1ZGUgPHBjaS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KIAorI2lmIGRlZmluZWQoQ09ORklHX09GX0ZMQVRfVFJFRSkKKyNpbmNsdWRlIDxmdF9idWlsZC5oPgorI2VuZGlmCisKICNpZmRlZiBDT05GSUdfVklERU9fU001MDEKICNpbmNsdWRlIDxzbTUwMS5oPgogI2VuZGlmCkBAIC0zMzIsNyArMzM2LDcgQEAKIH0KICNlbmRpZgogCi0jaWYgZGVmaW5lZCAoQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFX1JFU0VUKQogCiAjaWYgZGVmaW5lZCAoQ09ORklHX01JTklGQVApCiAjZGVmaW5lIFNNNTAxX1BPV0VSX01PREUwX0dBVEUJCTB4MDAwMDAwNDBVTApAQCAtMzg1LDcgKzM4OSw3IEBACiAJfQogI2VuZGlmCiB9Ci0jZW5kaWYgLyogZGVmaW5lZCAoQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQgKENPTkZJR19JREVfUkVTRVQpICovCisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QT1NUCiAvKgpAQCAtNzc1LDMgKzc3OSwxMCBAQAogfQogCiAjZW5kaWYgLyogQ09ORklHX1ZJREVPX1NNNTAxICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19PRl9GTEFUX1RSRUUpICYmIGRlZmluZWQoQ09ORklHX09GX0JPQVJEX1NFVFVQKQordm9pZCBmdF9ib2FyZF9zZXR1cCh2b2lkICpibG9iLCBiZF90ICpiZCkKK3sKKwlmdF9jcHVfc2V0dXAoYmxvYiwgYmQpOworfQorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX09GX0ZMQVRfVFJFRSkgJiYgZGVmaW5lZChDT05GSUdfT0ZfQk9BUkRfU0VUVVApICovCmRpZmYgLS1naXQgYS9ib2FyZC90cW01MjAwL3UtYm9vdC5sZHMgYi9ib2FyZC90cW01MjAwL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYzI5NjguLjAwMDAwMDAKLS0tIGEvYm9hcmQvdHFtNTIwMC91LWJvb3QubGRzCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNAotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM1eHh4L3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL3RxbTgyNjAvdS1ib290LmxkcyBiL2JvYXJkL3RxbTgyNjAvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVmMjljNi4uMDAwMDAwMAotLS0gYS9ib2FyZC90cW04MjYwL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8oLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL3RxbTgyNzIvdHFtODI3Mi5jIGIvYm9hcmQvdHFtODI3Mi90cW04MjcyLmMKaW5kZXggNzBkMWJiOC4uN2JkNjQwMSAxMDA2NDQKLS0tIGEvYm9hcmQvdHFtODI3Mi90cW04MjcyLmMKKysrIGIvYm9hcmQvdHFtODI3Mi90cW04MjcyLmMKQEAgLTEwNjUsNyArMTA2NSw3IEBACiB9CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAKICNpbmNsdWRlIDxuYW5kLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgpAQCAtMTIxMiw3ICsxMjEyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2VuZGlmCS8qIENGR19DTURfTkFORCAqLworI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfUENJCiBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgaG9zZTsKZGlmZiAtLWdpdCBhL2JvYXJkL3RxbTgyNzIvdS1ib290LmxkcyBiL2JvYXJkL3RxbTgyNzIvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVmMjljNi4uMDAwMDAwMAotLS0gYS9ib2FyZC90cW04MjcyL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi1PVVRQVVRfQVJDSChwb3dlcnBjKQotU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7Ci0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPwotICAgX19EWU5BTUlDID0gMDsgICAgKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4MjYwL3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8oLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL3RxbTgzNHgvdS1ib290LmxkcyBiL2JvYXJkL3RxbTgzNHgvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIwY2ZhNi4uMDAwMDAwMAotLS0gYS9ib2FyZC90cW04MzR4L3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKLSAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9Ci0gIC5wbHQgOiB7ICooLnBsdCkgfQotICAudGV4dCAgICAgIDoKLSAgewotICAgIGNwdS9tcGM4M3h4L3N0YXJ0Lm8JKC50ZXh0KQotICAgICooLnRleHQpCi0gICAgKiguZml4dXApCi0gICAgKiguZ290MSkKLSAgICAuID0gQUxJR04oMTYpOwotICAgICooLnJvZGF0YSkKLSAgICAqKC5yb2RhdGExKQotICAgICooLnJvZGF0YS5zdHIxLjQpCi0gICAgKiguZWhfZnJhbWUpCi0gIH0KLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAotICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9Ci0gIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KLQotICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KLSAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7Ci0gIF9lcm90ZXh0ID0gLjsKLSAgUFJPVklERSAoZXJvdGV4dCA9IC4pOwotICAucmVsb2MgICA6Ci0gIHsKLSAgICAqKC5nb3QpCi0gICAgX0dPVDJfVEFCTEVfID0gLjsKLSAgICAqKC5nb3QyKQotICAgIF9GSVhVUF9UQUJMRV8gPSAuOwotICAgICooLmZpeHVwKQotICB9Ci0gIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7Ci0gIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKLQotICAuZGF0YSAgICA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICooLmRhdGExKQotICAgICooLnNkYXRhKQotICAgICooLnNkYXRhMikKLSAgICAqKC5keW5hbWljKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gIF9lZGF0YSAgPSAgLjsKLSAgUFJPVklERSAoZWRhdGEgPSAuKTsKLQotICAuID0gLjsKLSAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKLSAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KLSAgX191X2Jvb3RfY21kX2VuZCA9IC47Ci0KLQotICAuID0gLjsKLSAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0gIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9iZWdpbiA9IC47Ci0gIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQotICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfZW5kID0gLjsKLQotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5ic3MgICAgICAgOgotICB7Ci0gICAqKC5zYnNzKSAqKC5zY29tbW9uKQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KLUVOVFJZKF9zdGFydCkKZGlmZiAtLWdpdCBhL2JvYXJkL3RyYWIvTWFrZWZpbGUgYi9ib2FyZC90cmFiL01ha2VmaWxlCmluZGV4IDg2OGNhNDIuLmZiZTFjMzYgMTAwNjQ0Ci0tLSBhL2JvYXJkL3RyYWIvTWFrZWZpbGUKKysrIGIvYm9hcmQvdHJhYi9NYWtlZmlsZQpAQCAtNTAsNyArNTAsNiBAQAogJChvYmopdHJhYl9ma3Quc3JlYzoJJChPQkpTX0ZLVCkgJChMSUIpCiAJJChMRCkgLWcgLVR0ZXh0ICQoTE9BRF9BRERSKSAtbyAkKDw6Lm89KSAtZSB0cmFiX2ZrdCAkXiAkKExJQikgXAogCQktTCQob2JqKS4uLy4uL2V4YW1wbGVzIC1sc3R1YnMgXAotCQktTCQob2JqKS4uLy4uL2xpYl9nZW5lcmljIC1sZ2VuZXJpYyBcCiAJCS1MJChnY2NsaWJkaXIpIC1sZ2NjCiAJJChPQkpDT1BZKSAtTyBzcmVjICQoPDoubz0pICRACiAKZGlmZiAtLWdpdCBhL2JvYXJkL3RyYWIvYXV0b191cGRhdGUuYyBiL2JvYXJkL3RyYWIvYXV0b191cGRhdGUuYwppbmRleCBmNDA3NGFlLi41NGQzNjQ1IDEwMDY0NAotLS0gYS9ib2FyZC90cmFiL2F1dG9fdXBkYXRlLmMKKysrIGIvYm9hcmQvdHJhYi9hdXRvX3VwZGF0ZS5jCkBAIC0zNCw3ICszNCw3IEBACiAKICNpZmRlZiBDT05GSUdfQVVUT19VUERBVEUKIAotI2lmbmRlZiBDT05GSUdfVVNCX09IQ0kKKyNpZm5kZWYgQ09ORklHX1VTQl9PSENJX05FVwogI2Vycm9yICJtdXN0IGRlZmluZSBDT05GSUdfVVNCX09IQ0kiCiAjZW5kaWYKIApAQCAtNDYsOCArNDYsOCBAQAogI2Vycm9yICJtdXN0IGRlZmluZSBDRkdfSFVTSF9QQVJTRVIiCiAjZW5kaWYKIAotI2lmICEoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GQVQpCi0jZXJyb3IgIm11c3QgZGVmaW5lIENGR19DTURfRkFUIgorI2lmICFkZWZpbmVkKENPTkZJR19DTURfRkFUKQorI2Vycm9yICJtdXN0IGRlZmluZSBDT05GSUdfQ01EX0ZBVCIKICNlbmRpZgogCiAvKgpAQCAtNDUwLDcgKzQ1MCw3IEBACiB7CiAJYmxvY2tfZGV2X2Rlc2NfdCAqc3Rvcl9kZXY7CiAJbG9uZyBzejsKLQlpbnQgaSwgcmVzLCBiaXRtYXBfZmlyc3QsIGNudCwgb2xkX2N0cmxjLCBnb3RfY3RybGM7CisJaW50IGksIHJlcyA9IDAsIGJpdG1hcF9maXJzdCwgY250LCBvbGRfY3RybGMsIGdvdF9jdHJsYzsKIAljaGFyICplbnY7CiAJbG9uZyBzdGFydCwgZW5kOwogCkBAIC00NzcsMTggKzQ3NywyMSBAQAogCWF1X3VzYl9zdG9yX2N1cnJfZGV2ID0gdXNiX3N0b3Jfc2NhbigwKTsKIAlpZiAoYXVfdXNiX3N0b3JfY3Vycl9kZXYgPT0gLTEpIHsKIAkJZGVidWcgKCJObyBkZXZpY2UgZm91bmQuIE5vdCBpbml0aWFsaXplZD9cbiIpOwotCQlyZXR1cm4gLTE7CisJCXJlcyA9IC0xOworCQlnb3RvIHhpdDsKIAl9CiAJLyogY2hlY2sgd2hldGhlciBpdCBoYXMgYSBwYXJ0aXRpb24gdGFibGUgKi8KIAlzdG9yX2RldiA9IGdldF9kZXYoInVzYiIsIDApOwogCWlmIChzdG9yX2RldiA9PSBOVUxMKSB7CiAJCWRlYnVnICgidWtub3duIGRldmljZSB0eXBlXG4iKTsKLQkJcmV0dXJuIC0xOworCQlyZXMgPSAtMTsKKwkJZ290byB4aXQ7CiAJfQogCWlmIChmYXRfcmVnaXN0ZXJfZGV2aWNlKHN0b3JfZGV2LCAxKSAhPSAwKSB7CiAJCWRlYnVnICgiVW5hYmxlIHRvIHVzZSBVU0IgJWQ6JWQgZm9yIGZhdGxzXG4iLAogCQkJYXVfdXNiX3N0b3JfY3Vycl9kZXYsIDEpOwotCQlyZXR1cm4gLTE7CisJCXJlcyA9IC0xOworCQlnb3RvIHhpdDsKIAl9CiAJaWYgKGZpbGVfZmF0X2RldGVjdGZzKCkgIT0gMCkgewogCQlkZWJ1ZyAoImZpbGVfZmF0X2RldGVjdGZzIGZhaWxlZFxuIik7CkBAIC02NDgsOSArNjUxLDEwIEBACiAJCQkvKiBlbmFibGUgdGhlIHBvd2VyIHN3aXRjaCAqLwogCQkJKkNQTERfVkZEX0JLICY9IH5QT1dFUl9PRkY7CiAJfQotCXVzYl9zdG9wKCk7CiAJLyogcmVzdG9yZSB0aGUgb2xkIHN0YXRlICovCiAJZGlzYWJsZV9jdHJsYyhvbGRfY3RybGMpOwotCXJldHVybiAwOworeGl0OgorCXVzYl9zdG9wKCk7CisJcmV0dXJuIHJlczsKIH0KICNlbmRpZiAvKiBDT05GSUdfQVVUT19VUERBVEUgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL3RyYWIvY21kX3RyYWIuYyBiL2JvYXJkL3RyYWIvY21kX3RyYWIuYwppbmRleCBiODJjOGVkLi5kYWE2YWVlIDEwMDY0NAotLS0gYS9ib2FyZC90cmFiL2NtZF90cmFiLmMKKysrIGIvYm9hcmQvdHJhYi9jbWRfdHJhYi5jCkBAIC0zMiw3ICszMiw3IEBACiAgKiBUUkFCIGJvYXJkIHNwZWNpZmljIGNvbW1hbmRzLiBFc3BlY2lhbGx5IGNvbW1hbmRzIGZvciBidXJuLWluIGFuZCBmdW5jdGlvbgogICogdGVzdC4KICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JTUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQlNQKQogCiAvKiBsaW1pdHMgZm9yIHZhbGlkIHJhbmdlIG9mIFZDQzVWIGluIG1WICAqLwogI2RlZmluZSBWQ0M1Vl9NSU4gICAgICAgNDUwMApAQCAtODQ2LDcgKzg0Niw3IEBACiB7CiAJaW50IGNvbnRhY3RfdGVtcDsKIAlpbnQgZGVsYXkgPSAwOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAJc3RydWN0IHJ0Y190aW1lIHRtOwogI2VuZGlmCiAKQEAgLTg2Miw3ICs4NjIsNyBAQAogCXNwaV9pbml0ICgpOwogCXdoaWxlICgxKSB7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCQlydGNfZ2V0ICgmdG0pOwogCQlwcmludGYgKCIlNGQtJTAyZC0lMDJkICUyZDolMDJkOiUwMmQgLSAiLAogCQkJdG0udG1feWVhciwgdG0udG1fbW9uLCB0bS50bV9tZGF5LApAQCAtODkzLDQgKzg5Myw0IEBACiAJIiAgICAgIEZvciBlYWNoIG1lYXN1cm1lbnQgYSB0aW1lc3RhbXAgaXMgcHJpbnRldGVkXG4iCiApOwogCi0jZW5kaWYJLyogQ0ZHX0NNRF9CU1AgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvdHJhYi90cmFiX2ZrdC5jIGIvYm9hcmQvdHJhYi90cmFiX2ZrdC5jCmluZGV4IDcxYmU2ZTAuLjcyNzNlZjkgMTAwNjQ0Ci0tLSBhL2JvYXJkL3RyYWIvdHJhYl9ma3QuYworKysgYi9ib2FyZC90cmFiL3RyYWJfZmt0LmMKQEAgLTE0OCwxNCArMTQ4LDE0IEBACiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgdXBkY3JjKHVuc2lnbmVkIHNob3J0IGljcmMsIHVuc2lnbmVkIGNoYXIgKmljcCwKIAkJCSAgICAgdW5zaWduZWQgaW50IGljbnQpOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSTJDKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JMkMpCiBzdGF0aWMgaW50IHRyYWJfZWVwcm9tX3JlYWQgKGNoYXIgKiphcmd2KTsKIHN0YXRpYyBpbnQgdHJhYl9lZXByb21fd3JpdGUgKGNoYXIgKiphcmd2KTsKIGludCBpMmNfd3JpdGVfbXVsdGlwbGUgKHVjaGFyIGNoaXAsIHVpbnQgYWRkciwgaW50IGFsZW4sIHVjaGFyICpidWZmZXIsCiAJCQlpbnQgbGVuKTsKIGludCBpMmNfcmVhZF9tdWx0aXBsZSAoIHVjaGFyIGNoaXAsIHVpbnQgYWRkciwgaW50IGFsZW4sIHVjaGFyICpidWZmZXIsCiAJCQlpbnQgbGVuKTsKLSNlbmRpZiAvKiBDRkdfQ01EX0kyQyAqLworI2VuZGlmCiAKIC8qCiAgKiBUUkFCIGJvYXJkIHNwZWNpZmljIGNvbW1hbmRzLiBFc3BlY2lhbGx5IGNvbW1hbmRzIGZvciBidXJuLWluIGFuZCBmdW5jdGlvbgpAQCAtOTU5LDcgKzk1OSw3IEBACiAKIHN0YXRpYyBpbnQgdG91Y2hfd3JpdGVfY2xpYnJhdGlvbl92YWx1ZXMgKGludCBjYWxpYl9wb2ludCwgaW50IHgsIGludCB5KQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0kyQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSTJDKQogCWludCB4X3ZlcmlmeSA9IDA7CiAJaW50IHlfdmVyaWZ5ID0gMDsKIApAQCAtMTAxOSwxMCArMTAxOSwxMCBAQAogCX0KIAlyZXR1cm4gMTsKICNlbHNlCi0JcHJpbnRmICgiTm8gSTJDIHN1cHBvcnQgZW5hYmxlZCAoQ0ZHX0NNRF9JMkMpLCBjb3VsZCBub3Qgd3JpdGUgIgorCXByaW50ZiAoIk5vIEkyQyBzdXBwb3J0IGVuYWJsZWQgKENPTkZJR19DTURfSTJDKSwgY291bGQgbm90IHdyaXRlICIKIAkJInRvIEVFUFJPTVxuIik7CiAJcmV0dXJuICgxKTsKLSNlbmRpZiAvKiBDRkdfQ01EX0kyQyAqLworI2VuZGlmCiB9CiAKIApAQCAtMTEwNSw3ICsxMTA1LDcgQEAKIAogaW50IGRvX3NlcmlhbF9udW1iZXIgKGNoYXIgKiphcmd2KQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0kyQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSTJDKQogCXVuc2lnbmVkIGludCBzZXJpYWxfbnVtYmVyOwogCiAJaWYgKHN0cmNtcCAoYXJndlsyXSwgInJlYWQiKSA9PSAwKSB7CkBAIC0xMTMwLDE2ICsxMTMwLDE2IEBACiAJcHJpbnRmICgiJXM6IHVua25vd24gY29tbWFuZCAlc1xuIiwgX19GVU5DVElPTl9fLCBhcmd2WzJdKTsKIAlyZXR1cm4gKDEpOyAgICAgICAgICAgICAvKiB1bmtub3duIGNvbW1hbmQsIHJldHVybiBlcnJvciAqLwogI2Vsc2UKLQlwcmludGYgKCJObyBJMkMgc3VwcG9ydCBlbmFibGVkIChDRkdfQ01EX0kyQyksIGNvdWxkIG5vdCB3cml0ZSAiCisJcHJpbnRmICgiTm8gSTJDIHN1cHBvcnQgZW5hYmxlZCAoQ09ORklHX0NNRF9JMkMpLCBjb3VsZCBub3Qgd3JpdGUgIgogCQkidG8gRUVQUk9NXG4iKTsKIAlyZXR1cm4gKDEpOwotI2VuZGlmIC8qIENGR19DTURfSTJDICovCisjZW5kaWYKIH0KIAogCiBpbnQgZG9fY3JjMTYgKHZvaWQpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSTJDKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JMkMpCiAJaW50IGNyYzsKIAl1bnNpZ25lZCBjaGFyIGJ1ZltFRVBST01fTUFYX0NSQ19CVUZdOwogCkBAIC0xMTYwLDEwICsxMTYwLDEwIEBACiAJfQogCXJldHVybiAoMCk7CiAjZWxzZQotCXByaW50ZiAoIk5vIEkyQyBzdXBwb3J0IGVuYWJsZWQgKENGR19DTURfSTJDKSwgY291bGQgbm90IHdyaXRlICIKKwlwcmludGYgKCJObyBJMkMgc3VwcG9ydCBlbmFibGVkIChDT05GSUdfQ01EX0kyQyksIGNvdWxkIG5vdCB3cml0ZSAiCiAJCSJ0byBFRVBST01cbiIpOwogCXJldHVybiAoMSk7Ci0jZW5kaWYgLyogQ0ZHX0NNRF9JMkMgKi8KKyNlbmRpZgogfQogCiAKQEAgLTEyNjAsNyArMTI2MCw3IEBACiAKIGludCBkb19lZXByb20gKGNoYXIgKiphcmd2KQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0kyQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSTJDKQogCWlmIChzdHJjbXAgKGFyZ3ZbMl0sICJyZWFkIikgPT0gMCkgewogCQlyZXR1cm4gKHRyYWJfZWVwcm9tX3JlYWQgKGFyZ3YpKTsKIAl9CkBAIC0xMjcyLDEzICsxMjcyLDEzIEBACiAJcHJpbnRmICgiJXM6IGludmFsaWQgcGFyYW1ldGVyICVzXG4iLCBfX0ZVTkNUSU9OX18sIGFyZ3ZbMl0pOwogCXJldHVybiAoMSk7CiAjZWxzZQotCXByaW50ZiAoIk5vIEkyQyBzdXBwb3J0IGVuYWJsZWQgKENGR19DTURfSTJDKSwgY291bGQgbm90IHdyaXRlICIKKwlwcmludGYgKCJObyBJMkMgc3VwcG9ydCBlbmFibGVkIChDT05GSUdfQ01EX0kyQyksIGNvdWxkIG5vdCB3cml0ZSAiCiAJCSJ0byBFRVBST01cbiIpOwogCXJldHVybiAoMSk7Ci0jZW5kaWYgLyogQ0ZHX0NNRF9JMkMgKi8KKyNlbmRpZgogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSTJDKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JMkMpCiBzdGF0aWMgaW50IHRyYWJfZWVwcm9tX3JlYWQgKGNoYXIgKiphcmd2KQogewogCWludCBpOwpAQCAtMTQwOCw0ICsxNDA4LDQgQEAKIAl9CiAJcmV0dXJuICgwKTsKIH0KLSNlbmRpZiAvKiBDRkdfQ01EX0kyQyAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC91YzEwMC9wY21jaWEuYyBiL2JvYXJkL3VjMTAwL3BjbWNpYS5jCmluZGV4IDZlNGI2ZDYuLjQwN2JkYjcgMTAwNjQ0Ci0tLSBhL2JvYXJkL3VjMTAwL3BjbWNpYS5jCisrKyBiL2JvYXJkL3VjMTAwL3BjbWNpYS5jCkBAIC00LDExICs0LDExIEBACiAKICN1bmRlZglDT05GSUdfUENNQ0lBCiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQorI2lmIChkZWZpbmVkKENPTkZJR19DTURfSURFKSkgJiYgZGVmaW5lZChDT05GSUdfSURFXzh4eF9QQ0NBUkQpCiAjZGVmaW5lCUNPTkZJR19QQ01DSUEKICNlbmRpZgogCkBAIC0xMjMsNyArMTIzLDcgQEAKIH0KIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiBpbnQgcGNtY2lhX2hhcmR3YXJlX2Rpc2FibGUoaW50IHNsb3QpCiB7CiAJdm9sYXRpbGUgaW1tYXBfdAkqaW1tYXA7CkBAIC0xNDksNyArMTQ5LDcgQEAKIAogCXJldHVybiAoMCk7CiB9Ci0jZW5kaWYJLyogQ0ZHX0NNRF9QQ01DSUEgKi8KKyNlbmRpZgogCiAKIGludCBwY21jaWFfdm9sdGFnZV9zZXQoaW50IHNsb3QsIGludCB2Y2MsIGludCB2cHApCmRpZmYgLS1naXQgYS9ib2FyZC91YzEwMS9jb25maWcubWsgYi9ib2FyZC91YzEwMS9jb25maWcubWsKaW5kZXggNTFlOGU4NGMuLjRmZTE4MzEgMTAwNjQ0Ci0tLSBhL2JvYXJkL3VjMTAxL2NvbmZpZy5taworKysgYi9ib2FyZC91YzEwMS9jb25maWcubWsKQEAgLTM5LDMgKzM5LDQgQEAKIGVuZGlmCiAKIFBMQVRGT1JNX0NQUEZMQUdTICs9IC1EVEVYVF9CQVNFPSQoVEVYVF9CQVNFKSAtSSQoVE9QRElSKS9ib2FyZAorTERTQ1JJUFQgOj0gJChTUkNUUkVFKS9jcHUvbXBjNXh4eC91LWJvb3QtY3VzdG9tbGF5b3V0LmxkcwpkaWZmIC0tZ2l0IGEvYm9hcmQvdWMxMDEvdS1ib290LmxkcyBiL2JvYXJkL3VjMTAxL3UtYm9vdC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyM2ExNGMuLjAwMDAwMDAKLS0tIGEvYm9hcmQvdWMxMDEvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAzLTIwMDQKLSAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0gKgotICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKLSAqIHByb2plY3QuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAqIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotT1VUUFVUX0FSQ0gocG93ZXJwYykKLVNFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOwotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICAvKiBXQVJOSU5HIC0gdGhlIGZvbGxvd2luZyBpcyBoYW5kLW9wdGltaXplZCB0byBmaXQgd2l0aGluICAqLwotICAgIC8qIHRoZSBzZWN0b3IgbGF5b3V0IG9mIG91ciBmbGFzaCBjaGlwcyEgICAgWFhYIEZJWE1FIFhYWCAgICovCi0KLSAgICBjcHUvbXBjNXh4eC9zdGFydC5vICAgICAgICAgICgudGV4dCkKLSAgICBjcHUvbXBjNXh4eC90cmFwcy5vICAgICAgICAgICgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy9jcmMzMi5vICAgICAgICAgKC50ZXh0KQotICAgIGxpYl9wcGMvY2FjaGUubyAgICAgICAgICAgICAoLnRleHQpCi0gICAgbGliX3BwYy90aW1lLm8gICAgICAgICAgICAgICgudGV4dCkKLQotICAgIC4gPSBERUZJTkVEKGVudl9vZmZzZXQpID8gZW52X29mZnNldCA6IC47Ci0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8gICAgICAgICgucHBjZW52KQotCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvdXR4ODI0NS91LWJvb3QubGRzIGIvYm9hcmQvdXR4ODI0NS91LWJvb3QubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWYzMDE4Li4wMDAwMDAwCi0tLSBhL2JvYXJkL3V0eDgyNDUvdS1ib290LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKgotICogKEMpIENvcHlyaWdodCAyMDAxCi0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMgotICogR3JlZ29yeSBFLiBBbGxlbiwgZ2FsbGVuQGFybHV0LnV0ZXhhcy5lZHUKLSAqIE1hdHRoZXcgRS4gS2FyZ2VyLCBrYXJnZXJAYXJsdXQudXRleGFzLmVkdQotICogQXBwbGllZCBSZXNlYXJjaCBMYWJvcmF0b3JpZXMsIFRoZSBVbml2ZXJzaXR5IG9mIFRleGFzIGF0IEF1c3RpbgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCX0KLSAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI0eC9zdGFydC5vCQkoLnRleHQpCi0gICAgbGliX3BwYy9ib2FyZC5vCQkoLnRleHQpCi0gICAgbGliX3BwYy9wcGNzdHJpbmcubwkJKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL3ZzcHJpbnRmLm8JKC50ZXh0KQotICAgIGxpYl9nZW5lcmljL2NyYzMyLm8JCSgudGV4dCkKLSAgICBsaWJfZ2VuZXJpYy96bGliLm8JCSgudGV4dCkKLQotCS4gPSBERUZJTkVEKGVudl9vZmZzZXQpID8gZW52X29mZnNldCA6IC47Ci0gICAgY29tbW9uL2Vudmlyb25tZW50Lm8gKC50ZXh0KQotCi0JKigudGV4dCkKLQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0KLSAgX2VuZCA9IC4gOwotICBQUk9WSURFIChlbmQgPSAuKTsKLX0KZGlmZiAtLWdpdCBhL2JvYXJkL3YzOGIvdS1ib290LmxkcyBiL2JvYXJkL3YzOGIvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZkZWE2Yi4uMDAwMDAwMAotLS0gYS9ib2FyZC92MzhiL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMy0yMDA2Ci0gKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKLS8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAgICAqLwotU0VDVElPTlMKLXsKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCi0gIC4gPSArIFNJWkVPRl9IRUFERVJTOwotICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9Ci0gIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9Ci0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9Ci0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KLSAgLnBsdCA6IHsgKigucGx0KSB9Ci0gIC50ZXh0ICAgICAgOgotICB7Ci0gICAgY3B1L21wYzV4eHgvc3RhcnQubwkoLnRleHQpCi0gICAgKigudGV4dCkKLSAgICAqKC5maXh1cCkKLSAgICAqKC5nb3QxKQotICAgIC4gPSBBTElHTigxNik7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YTEpCi0gICAgKigucm9kYXRhLnN0cjEuNCkKLSAgICAqKC5laF9mcmFtZSkKLSAgfQotICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCi0gIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KLSAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQotCi0gIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLwotICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKLSAgX2Vyb3RleHQgPSAuOwotICBQUk9WSURFIChlcm90ZXh0ID0gLik7Ci0gIC5yZWxvYyAgIDoKLSAgewotICAgICooLmdvdCkKLSAgICBfR09UMl9UQUJMRV8gPSAuOwotICAgICooLmdvdDIpCi0gICAgX0ZJWFVQX1RBQkxFXyA9IC47Ci0gICAgKiguZml4dXApCi0gIH0KLSAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKLSAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOwotCi0gIC5kYXRhICAgIDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZGF0YTEpCi0gICAgKiguc2RhdGEpCi0gICAgKiguc2RhdGEyKQotICAgICooLmR5bmFtaWMpCi0gICAgQ09OU1RSVUNUT1JTCi0gIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotCi0gIC4gPSAuOwotICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwotICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQotICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKLQotCi0gIC4gPSAuOwotICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KLSAgX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2JlZ2luID0gLjsKLSAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9Ci0gIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQotICAuID0gQUxJR04oNDA5Nik7Ci0gIF9faW5pdF9lbmQgPSAuOwotCi0gIF9fYnNzX3N0YXJ0ID0gLjsKLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLnNic3MpICooLnNjb21tb24pCi0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgfQotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotfQpkaWZmIC0tZ2l0IGEvYm9hcmQvdjM4Yi92MzhiLmMgYi9ib2FyZC92MzhiL3YzOGIuYwppbmRleCBhY2U0YWEyLi5lYzAzMmVlIDEwMDY0NAotLS0gYS9ib2FyZC92MzhiL3YzOGIuYworKysgYi9ib2FyZC92MzhiL3YzOGIuYwpAQCAtMjI0LDcgKzIyNCw3IEBACiB9CiAKIAotI2lmIGRlZmluZWQgKENGR19DTURfSURFKSAmJiBkZWZpbmVkIChDT05GSUdfSURFX1JFU0VUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV9SRVNFVCkKIHZvaWQgaW5pdF9pZGVfcmVzZXQodm9pZCkKIHsKIAlkZWJ1ZygiaW5pdF9pZGVfcmVzZXRcbiIpOwpAQCAtMjQ4LDcgKzI0OCw3IEBACiAJfSBlbHNlCiAJCSoodnVfbG9uZyAqKSBNUEM1WFhYX1dVX0dQSU9fREFUQV9PIHw9ICBHUElPX1BTQzFfNDsKIH0KLSNlbmRpZiAvKiBkZWZpbmVkIChDRkdfQ01EX0lERSkgJiYgZGVmaW5lZCAoQ09ORklHX0lERV9SRVNFVCkgKi8KKyNlbmRpZgogCiAKICNpZmRlZiBDT05GSUdfSFdfV0FUQ0hET0cKZGlmZiAtLWdpdCBhL2JvYXJkL3c3by9jbWRfdnBkLmMgYi9ib2FyZC93N28vY21kX3ZwZC5jCmluZGV4IDQ0OTA4OWUuLmZkZDZjZWIgMTAwNjQ0Ci0tLSBhL2JvYXJkL3c3by9jbWRfdnBkLmMKKysrIGIvYm9hcmQvdzdvL2NtZF92cGQuYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JTUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQlNQKQogCiAjaW5jbHVkZSAidnBkLmgiCiAKQEAgLTYzLDQgKzYzLDQgQEAKIAkgICIgICAgICAgIC0gUmVhZCBWUEQgRGF0YSBmcm9tIGRlZmF1bHQgYWRkcmVzcywgb3IgZGV2aWNlIGFkZHJlc3MgJ2Rldl9hZGRyJy5cbiIKICk7CiAKLSNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CU1ApICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL3hpbGlueC9tbDMwMC9zZXJpYWwuYyBiL2JvYXJkL3hpbGlueC9tbDMwMC9zZXJpYWwuYwppbmRleCA5YjAzZjg5Li5iYTQxZjg1IDEwMDY0NAotLS0gYS9ib2FyZC94aWxpbngvbWwzMDAvc2VyaWFsLmMKKysrIGIvYm9hcmQveGlsaW54L21sMzAwL3NlcmlhbC5jCkBAIC0xMjIsNyArMTIyLDcgQEAKIAl9CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogdm9pZAoga2dkYl9zZXJpYWxfaW5pdCh2b2lkKQogewpAQCAtMTUxLDQgKzE1MSw0IEBACiB7CiAJcmV0dXJuOwogfQotI2VuZGlmCQkJCS8qIENGR19DTURfS0dEQiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC94aWxpbngvbWw0MDEveHBhcmFtZXRlcnMuaCBiL2JvYXJkL3hpbGlueC9tbDQwMS94cGFyYW1ldGVycy5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL2JvYXJkL3hwZWRpdGUxay94cGVkaXRlMWsuYyBiL2JvYXJkL3hwZWRpdGUxay94cGVkaXRlMWsuYwppbmRleCBhNTY5YjUzLi44NDExY2YwIDEwMDY0NAotLS0gYS9ib2FyZC94cGVkaXRlMWsveHBlZGl0ZTFrLmMKKysrIGIvYm9hcmQveHBlZGl0ZTFrL3hwZWRpdGUxay5jCkBAIC0yMDksNyArMjA5LDcgQEAKICAqCWNlcnRhaW4gcHJlLWluaXRpYWxpemF0aW9uIGFjdGlvbnMuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZiBkZWZpbmVkKENPTkZJR19QQ0kpICYmIGRlZmluZWQoQ0ZHX1BDSV9QUkVfSU5JVCkKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCiBpbnQgcGNpX3ByZV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqIGhvc2UgKQogewogCXVuc2lnbmVkIGxvbmcgc3RyYXA7CkBAIC0yMjcsNyArMjI3LDcgQEAKICNlbmRpZgogCXJldHVybiAxOwogfQotI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1BDSSkgJiYgZGVmaW5lZChDRkdfUENJX1BSRV9JTklUKSAqLworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1BDSSkgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICBwY2lfdGFyZ2V0X2luaXQKZGlmZiAtLWdpdCBhL2JvYXJkL3pwYzE5MDAvdS1ib290LmxkcyBiL2JvYXJkL3pwYzE5MDAvdS1ib290LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThjNGI0Ni4uMDAwMDAwMAotLS0gYS9ib2FyZC96cGMxOTAwL3UtYm9vdC5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMQotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBNb2RpZmllZCBieSBZdWxpIEJhcmNvaGVuIDx5dWxpQGFyYWJlbGxhc3cuY29tPgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLU9VVFBVVF9BUkNIKHBvd2VycGMpCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICsgU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9Ci0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQotICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQotICAucGx0IDogeyAqKC5wbHQpIH0KLSAgLnRleHQgICAgICA6Ci0gIHsKLSAgICBjcHUvbXBjODI2MC9zdGFydC5vCSgudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpeHVwKQotICAgICooLmdvdDEpCi0gICAgLiA9IEFMSUdOKDE2KTsKLSAgICAqKC5yb2RhdGEpCi0gICAgKigucm9kYXRhMSkKLSAgICAqKC5yb2RhdGEuc3RyMS40KQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKLSAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOwotICBfZXJvdGV4dCA9IC47Ci0gIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKLSAgLnJlbG9jICAgOgotICB7Ci0gICAgKiguZ290KQotICAgIF9HT1QyX1RBQkxFXyA9IC47Ci0gICAgKiguZ290MikKLSAgICBfRklYVVBfVEFCTEVfID0gLjsKLSAgICAqKC5maXh1cCkKLSAgfQotICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOwotICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7Ci0KLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMSkKLSAgICAqKC5zZGF0YSkKLSAgICAqKC5zZGF0YTIpCi0gICAgKiguZHluYW1pYykKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICBfZWRhdGEgID0gIC47Ci0gIFBST1ZJREUgKGVkYXRhID0gLik7Ci0KLSAgLiA9IC47Ci0gIF9fdV9ib290X2NtZF9zdGFydCA9IC47Ci0gIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9Ci0gIF9fdV9ib290X2NtZF9lbmQgPSAuOwotCi0KLSAgLiA9IC47Ci0gIF9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0gIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICBfX3N0b3BfX19leF90YWJsZSA9IC47Ci0KLSAgLiA9IEFMSUdOKDQwOTYpOwotICBfX2luaXRfYmVnaW4gPSAuOwotICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KLSAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9Ci0gIC4gPSBBTElHTig0MDk2KTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgX19ic3Nfc3RhcnQgPSAuOwotICAuYnNzICAgICAgIDoKLSAgewotICAgKiguc2JzcykgKiguc2NvbW1vbikKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gIF9lbmQgPSAuIDsKLSAgUFJPVklERSAoZW5kID0gLik7Ci19Ci1FTlRSWShfc3RhcnQpCmRpZmYgLS1naXQgYS9ib2FyZC96eWxvbml0ZS9uYW5kLmMgYi9ib2FyZC96eWxvbml0ZS9uYW5kLmMKaW5kZXggYTQxNzE0My4uYWEzOTMyYSAxMDA2NDQKLS0tIGEvYm9hcmQvenlsb25pdGUvbmFuZC5jCisrKyBiL2JvYXJkL3p5bG9uaXRlL25hbmQuYwpAQCAtMjIsNyArMjIsNyBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogI2lmZGVmIENPTkZJR19ORVdfTkFORF9DT0RFCiAKICNpbmNsdWRlIDxuYW5kLmg+CmRpZmYgLS1naXQgYS9jb21tb24vTWFrZWZpbGUgYi9jb21tb24vTWFrZWZpbGUKaW5kZXggYmMxZjcxNC4uZWY3ZDA5NyAxMDA2NDQKLS0tIGEvY29tbW9uL01ha2VmaWxlCisrKyBiL2NvbW1vbi9NYWtlZmlsZQpAQCAtMzgsOCArMzgsOCBAQAogCSAgY21kX21lbS5vIGNtZF9taWkubyBjbWRfbWlzYy5vIGNtZF9tbWMubyBcCiAJICBjbWRfbmFuZC5vIGNtZF9uZXQubyBjbWRfbnZlZGl0Lm8gXAogCSAgY21kX3BjaS5vIGNtZF9wY21jaWEubyBjbWRfcG9ydGlvLm8gXAotCSAgY21kX3JlZ2luZm8ubyBjbWRfcmVpc2VyLm8gY21kX3Njc2kubyBjbWRfc3BpLm8gY21kX3VuaXZlcnNlLm8gXAotCSAgY21kX3VzYi5vIGNtZF92ZmQubyBcCisJICBjbWRfcmVnaW5mby5vIGNtZF9yZWlzZXIubyBjbWRfc2F0YS5vIGNtZF9zY3NpLm8gY21kX3NwaS5vIFwKKwkgIGNtZF91bml2ZXJzZS5vIGNtZF91c2IubyBjbWRfdmZkLm8gXAogCSAgY29tbWFuZC5vIGNvbnNvbGUubyBjeWNsb24yLm8gZGV2aWNlcy5vIGRsbWFsbG9jLm8gZG9jZWNjLm8gXAogCSAgZW52aXJvbm1lbnQubyBlbnZfY29tbW9uLm8gXAogCSAgZW52X25hbmQubyBlbnZfZGF0YWZsYXNoLm8gZW52X2ZsYXNoLm8gZW52X2VlcHJvbS5vIFwKZGlmZiAtLWdpdCBhL2NvbW1vbi9iZWRidWcuYyBiL2NvbW1vbi9iZWRidWcuYwppbmRleCA2OTY2ZGU3Li4zYmYxZmMzIDEwMDY0NAotLS0gYS9jb21tb24vYmVkYnVnLmMKKysrIGIvY29tbW9uL2JlZGJ1Zy5jCkBAIC0yLDcgKzIsNyBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CRURCVUcpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JFREJVRykKIAogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8YmVkYnVnL2JlZGJ1Zy5oPgpAQCAtMTI1Myw0ICsxMjUzLDQgQEAKICAqIHB1cnBvc2UuCiAgKi8KIAotI2VuZGlmCS8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQkVEQlVHICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfYXV0b3NjcmlwdC5jIGIvY29tbW9uL2NtZF9hdXRvc2NyaXB0LmMKaW5kZXggZTMyNTMwMi4uYTYwMzhhNiAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9hdXRvc2NyaXB0LmMKKysrIGIvY29tbW9uL2NtZF9hdXRvc2NyaXB0LmMKQEAgLTQ3LDggKzQ3LDcgQEAKICNpbmNsdWRlIDxodXNoLmg+CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0FVVE9TQ1JJUFQpIHx8IFwKLQkgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCApCisjaWYgZGVmaW5lZChDT05GSUdfQVVUT1NDUklQVCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0FVVE9TQ1JJUFQpCiAKIGV4dGVybiBpbWFnZV9oZWFkZXJfdCBoZWFkZXI7CQkvKiBmcm9tIGNtZF9ib290bS5jICovCiBpbnQKQEAgLTE1MCw5ICsxNDksMTAgQEAKIAlyZXR1cm4gcmNvZGU7CiB9CiAKLSNlbmRpZgkvKiBDT05GSUdfQVVUT1NDUklQVCB8fCBDRkdfQ01EX0FVVE9TQ1JJUFQgKi8KKyNlbmRpZgorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVVUT1NDUklQVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQVVUT1NDUklQVCkKIGludAogZG9fYXV0b3NjcmlwdCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CkBAIC0xNzAsMTMgKzE3MCwxMyBAQAogCXJldHVybiByY29kZTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0FVVE9TQ1JJUFQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0FVVE9TQ1JJUFQpCiBVX0JPT1RfQ01EKAogCWF1dG9zY3IsIDIsIDAsCWRvX2F1dG9zY3JpcHQsCiAJImF1dG9zY3IgLSBydW4gc2NyaXB0IGZyb20gbWVtb3J5XG4iLAogCSJbYWRkcl0gLSBydW4gc2NyaXB0IHN0YXJ0aW5nIGF0IGFkZHIiCiAJIiAtIEEgdmFsaWQgYXV0b3NjciBoZWFkZXIgbXVzdCBiZSBwcmVzZW50XG4iCiApOwotI2VuZGlmIC8qIENGR19DTURfQVVUT1NDUklQVCAqLworI2VuZGlmCiAKLSNlbmRpZiAvKiBDT05GSUdfQVVUT1NDUklQVCB8fCBDRkdfQ01EX0FVVE9TQ1JJUFQgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9iZGluZm8uYyBiL2NvbW1vbi9jbWRfYmRpbmZvLmMKaW5kZXggZDk3YzA5ZS4uY2NiODI2YiAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9iZGluZm8uYworKysgYi9jb21tb24vY21kX2JkaW5mby5jCkBAIC0zMCw3ICszMCw3IEBACiAKIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQkRJKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CREkpCiBzdGF0aWMgdm9pZCBwcmludF9udW0oY29uc3QgY2hhciAqLCB1bG9uZyk7CiAKICNpZm5kZWYgQ09ORklHX0FSTQkvKiBQb3dlclBDIGFuZCBvdGhlciAqLwpAQCAtMTY3LDcgKzE2Nyw3IEBACiAJcHJpbnRfbnVtICgic3JhbSBzaXplIiwJCSh1bG9uZyliZC0+Ymlfc3JhbXNpemUpOwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAJcHV0cyAoImV0aGFkZHIgICAgID0iKTsKIAlmb3IgKGk9MDsgaTw2OyArK2kpIHsKIAkJcHJpbnRmICgiJWMlMDJYIiwgaSA/ICc6JyA6ICcgJywgYmQtPmJpX2VuZXRhZGRyW2ldKTsKQEAgLTE5NSw3ICsxOTUsNyBAQAogCXByaW50X251bSAoInNyYW0gc3RhcnQgICAgICIsCSh1bG9uZyliZC0+Ymlfc3JhbXN0YXJ0KTsKIAlwcmludF9udW0gKCJzcmFtIHNpemUgICAgICAiLAkodWxvbmcpYmQtPmJpX3NyYW1zaXplKTsKICNlbmRpZgotI2lmIGRlZmluZWQoQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAlwdXRzICgiZXRoYWRkciAgICAgPSIpOwogCWZvciAoaT0wOyBpPDY7ICsraSkgewogCQlwcmludGYgKCIlYyUwMlgiLCBpID8gJzonIDogJyAnLCBiZC0+YmlfZW5ldGFkZHJbaV0pOwpAQCAtMjg1LDQgKzI4NSw0IEBACiAJImJkaW5mbyAgLSBwcmludCBCb2FyZCBJbmZvIHN0cnVjdHVyZVxuIiwKIAlOVUxMCiApOwotI2VuZGlmCS8qIENGR19DTURfQkRJICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfYmVkYnVnLmMgYi9jb21tb24vY21kX2JlZGJ1Zy5jCmluZGV4IDQ4MDg2YTYuLjFjMzU0N2EgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfYmVkYnVnLmMKKysrIGIvY29tbW9uL2NtZF9iZWRidWcuYwpAQCAtMTMsNyArMTMsNyBAQAogCiBERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogCiAjaWZuZGVmIE1BWAogI2RlZmluZSBNQVgoYSxiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQpAQCAtNDEzLDcgKzQxMyw3IEBACiBVX0JPT1RfQ01EIChyZHVtcCwgMSwgMSwgZG9fYmVkYnVnX3JkdW1wLAogCSAgICAicmR1bXAgICAtIFNob3cgcmVnaXN0ZXJzLlxuIiwgIiAtIFNob3cgcmVnaXN0ZXJzLlxuIik7CiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZW5kaWYgLyogQ0ZHX0NNRF9CRURCVUcgKi8KKyNlbmRpZgogCiAKIC8qCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2JtcC5jIGIvY29tbW9uL2NtZF9ibXAuYwppbmRleCBhZDQxMmM4Li4yNDFhYTgzIDEwMDY0NAotLS0gYS9jb21tb24vY21kX2JtcC5jCisrKyBiL2NvbW1vbi9jbWRfYm1wLmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8bWFsbG9jLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CTVApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JNUCkKIAogc3RhdGljIGludCBibXBfaW5mbyAodWxvbmcgYWRkcik7CiBzdGF0aWMgaW50IGJtcF9kaXNwbGF5ICh1bG9uZyBhZGRyLCBpbnQgeCwgaW50IHkpOwpAQCAtMTg4LDQgKzE4OCw0IEBACiAjZW5kaWYKIH0KIAotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JNUCkgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19DTURfQk1QKSAqLwpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9ib290bS5jIGIvY29tbW9uL2NtZF9ib290bS5jCmluZGV4IGE2NDk5ZTguLmUxOWY4M2UgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfYm9vdG0uYworKysgYi9jb21tb24vY21kX2Jvb3RtLmMKQEAgLTQ1LDEwICs0NSwxMCBAQAogCiBERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKIAotIC8qY21kX2Jvb3QuYyovCi0gZXh0ZXJuIGludCBkb19yZXNldCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pOworLypjbWRfYm9vdC5jKi8KK2V4dGVybiBpbnQgZG9fcmVzZXQgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpIHx8IGRlZmluZWQoQ09ORklHX1RJTUVTVEFNUCkKKyNpZiBkZWZpbmVkKENPTkZJR19USU1FU1RBTVApIHx8IGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogI2luY2x1ZGUgPHJ0Yy5oPgogI2VuZGlmCiAKQEAgLTU2LDEzICs1Niw2IEBACiAjaW5jbHVkZSA8aHVzaC5oPgogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfU0hPV19CT09UX1BST0dSRVNTCi0jIGluY2x1ZGUgPHN0YXR1c19sZWQuaD4KLSMgZGVmaW5lIFNIT1dfQk9PVF9QUk9HUkVTUyhhcmcpCXNob3dfYm9vdF9wcm9ncmVzcyhhcmcpCi0jZWxzZQotIyBkZWZpbmUgU0hPV19CT09UX1BST0dSRVNTKGFyZykKLSNlbmRpZgotCiAjaWZkZWYgQ0ZHX0lOSVRfUkFNX0xPQ0sKICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KICNlbmRpZgpAQCAtODksMTEgKzgyLDExIEBACiBzdGF0aWMgdm9pZCAqemFsbG9jKHZvaWQgKiwgdW5zaWduZWQsIHVuc2lnbmVkKTsKIHN0YXRpYyB2b2lkIHpmcmVlKHZvaWQgKiwgdm9pZCAqLCB1bnNpZ25lZCk7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JTUkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lNSSkKIHN0YXRpYyBpbnQgaW1hZ2VfaW5mbyAodW5zaWduZWQgbG9uZyBhZGRyKTsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSU1MUykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSU1MUykKICNpbmNsdWRlIDxmbGFzaC5oPgogZXh0ZXJuIGZsYXNoX2luZm9fdCBmbGFzaF9pbmZvW107IC8qIGluZm8gZm9yIEZMQVNIIGNoaXBzICovCiBzdGF0aWMgaW50IGRvX2ltbHMgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKTsKQEAgLTEzMywxMiArMTI2LDEyIEBACiAjZW5kaWYKIHN0YXRpYyBib290X29zX0ZjbiBkb19ib290bV9uZXRic2Q7CiBzdGF0aWMgYm9vdF9vc19GY24gZG9fYm9vdG1fcnRlbXM7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRUxGKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9FTEYpCiBzdGF0aWMgYm9vdF9vc19GY24gZG9fYm9vdG1fdnh3b3JrczsKIHN0YXRpYyBib290X29zX0ZjbiBkb19ib290bV9xbnhlbGY7CiBpbnQgZG9fYm9vdHZ4ICggY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10gKTsKIGludCBkb19ib290ZWxmIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSApOwotI2VuZGlmIC8qIENGR19DTURfRUxGICovCisjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19BUlRPUykgJiYgZGVmaW5lZChDT05GSUdfUFBDKQogc3RhdGljIGJvb3Rfb3NfRmNuIGRvX2Jvb3RtX2FydG9zOwogI2VuZGlmCkBAIC0xNzYsNyArMTY5LDcgQEAKIAkJYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDE2KTsKIAl9CiAKLQlTSE9XX0JPT1RfUFJPR1JFU1MgKDEpOworCXNob3dfYm9vdF9wcm9ncmVzcyAoMSk7CiAJcHJpbnRmICgiIyMgQm9vdGluZyBpbWFnZSBhdCAlMDhseCAuLi5cbiIsIGFkZHIpOwogCiAJLyogQ29weSBoZWFkZXIgc28gd2UgY2FuIGJsYW5rIENSQyBmaWVsZCBmb3IgcmUtY2FsY3VsYXRpb24gKi8KQEAgLTIwMCwxMSArMTkzLDExIEBACiAjZW5kaWYJLyogX19JMzg2X18gKi8KIAkgICAgewogCQlwdXRzICgiQmFkIE1hZ2ljIE51bWJlclxuIik7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC0xKTsKIAkJcmV0dXJuIDE7CiAJICAgIH0KIAl9Ci0JU0hPV19CT09UX1BST0dSRVNTICgyKTsKKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDIpOwogCiAJZGF0YSA9ICh1bG9uZykmaGVhZGVyOwogCWxlbiAgPSBzaXplb2YoaW1hZ2VfaGVhZGVyX3QpOwpAQCAtMjE0LDEwICsyMDcsMTAgQEAKIAogCWlmIChjcmMzMiAoMCwgKHVjaGFyICopZGF0YSwgbGVuKSAhPSBjaGVja3N1bSkgewogCQlwdXRzICgiQmFkIEhlYWRlciBDaGVja3N1bVxuIik7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTIpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC0yKTsKIAkJcmV0dXJuIDE7CiAJfQotCVNIT1dfQk9PVF9QUk9HUkVTUyAoMyk7CisJc2hvd19ib290X3Byb2dyZXNzICgzKTsKIAogI2lmZGVmIENPTkZJR19IQVNfREFUQUZMQVNICiAJaWYgKGFkZHJfZGF0YWZsYXNoKGFkZHIpKXsKQEAgLTIzOCwxMiArMjMxLDEyIEBACiAJCXB1dHMgKCIgICBWZXJpZnlpbmcgQ2hlY2tzdW0gLi4uICIpOwogCQlpZiAoY3JjMzIgKDAsICh1Y2hhciAqKWRhdGEsIGxlbikgIT0gbnRvaGwoaGRyLT5paF9kY3JjKSkgewogCQkJcHJpbnRmICgiQmFkIERhdGEgQ1JDXG4iKTsKLQkJCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTMpOworCQkJc2hvd19ib290X3Byb2dyZXNzICgtMyk7CiAJCQlyZXR1cm4gMTsKIAkJfQogCQlwdXRzICgiT0tcbiIpOwogCX0KLQlTSE9XX0JPT1RfUFJPR1JFU1MgKDQpOworCXNob3dfYm9vdF9wcm9ncmVzcyAoNCk7CiAKIAlsZW5fcHRyID0gKHVsb25nICopZGF0YTsKIApAQCAtMjcyLDEwICsyNjUsMTAgQEAKICNlbmRpZgogCXsKIAkJcHJpbnRmICgiVW5zdXBwb3J0ZWQgQXJjaGl0ZWN0dXJlIDB4JXhcbiIsIGhkci0+aWhfYXJjaCk7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTQpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC00KTsKIAkJcmV0dXJuIDE7CiAJfQotCVNIT1dfQk9PVF9QUk9HUkVTUyAoNSk7CisJc2hvd19ib290X3Byb2dyZXNzICg1KTsKIAogCXN3aXRjaCAoaGRyLT5paF90eXBlKSB7CiAJY2FzZSBJSF9UWVBFX1NUQU5EQUxPTkU6CkBAIC0yOTcsMTAgKzI5MCwxMCBAQAogCQkJZGF0YSArPSA0OwogCQlicmVhazsKIAlkZWZhdWx0OiBwcmludGYgKCJXcm9uZyBJbWFnZSBUeXBlIGZvciAlcyBjb21tYW5kXG4iLCBjbWR0cC0+bmFtZSk7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTUpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC01KTsKIAkJcmV0dXJuIDE7CiAJfQotCVNIT1dfQk9PVF9QUk9HUkVTUyAoNik7CisJc2hvd19ib290X3Byb2dyZXNzICg2KTsKIAogCS8qCiAJICogV2UgaGF2ZSByZWFjaGVkIHRoZSBwb2ludCBvZiBubyByZXR1cm46IHdlIGFyZSBnb2luZyB0bwpAQCAtMzUxLDcgKzM0NCw3IEBACiAJCWlmIChndW56aXAgKCh2b2lkICopbnRvaGwoaGRyLT5paF9sb2FkKSwgdW5jX2xlbiwKIAkJCSAgICAodWNoYXIgKilkYXRhLCAmbGVuKSAhPSAwKSB7CiAJCQlwdXRzICgiR1VOWklQIEVSUk9SIC0gbXVzdCBSRVNFVCBib2FyZCB0byByZWNvdmVyXG4iKTsKLQkJCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTYpOworCQkJc2hvd19ib290X3Byb2dyZXNzICgtNik7CiAJCQlkb19yZXNldCAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOwogCQl9CiAJCWJyZWFrOwpAQCAtMzY4LDggKzM2MSw3IEBACiAJCQkJCQlDRkdfTUFMTE9DX0xFTiA8ICg0MDk2ICogMTAyNCksIDApOwogCQlpZiAoaSAhPSBCWl9PSykgewogCQkJcHJpbnRmICgiQlVOWklQMiBFUlJPUiAlZCAtIG11c3QgUkVTRVQgYm9hcmQgdG8gcmVjb3ZlclxuIiwgaSk7Ci0JCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC02KTsKLQkJCXVkZWxheSgxMDAwMDApOworCQkJc2hvd19ib290X3Byb2dyZXNzICgtNik7CiAJCQlkb19yZXNldCAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOwogCQl9CiAJCWJyZWFrOwpAQCAtMzc4LDExICszNzAsMTEgQEAKIAkJaWYgKGlmbGFnKQogCQkJZW5hYmxlX2ludGVycnVwdHMoKTsKIAkJcHJpbnRmICgiVW5pbXBsZW1lbnRlZCBjb21wcmVzc2lvbiB0eXBlICVkXG4iLCBoZHItPmloX2NvbXApOwotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC03KTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgtNyk7CiAJCXJldHVybiAxOwogCX0KIAlwdXRzICgiT0tcbiIpOwotCVNIT1dfQk9PVF9QUk9HUkVTUyAoNyk7CisJc2hvd19ib290X3Byb2dyZXNzICg3KTsKIAogCXN3aXRjaCAoaGRyLT5paF90eXBlKSB7CiAJY2FzZSBJSF9UWVBFX1NUQU5EQUxPTkU6CkBAIC00MDksMTAgKzQwMSwxMCBAQAogCQlpZiAoaWZsYWcpCiAJCQllbmFibGVfaW50ZXJydXB0cygpOwogCQlwcmludGYgKCJDYW4ndCBib290IGltYWdlIHR5cGUgJWRcbiIsIGhkci0+aWhfdHlwZSk7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTgpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC04KTsKIAkJcmV0dXJuIDE7CiAJfQotCVNIT1dfQk9PVF9QUk9HUkVTUyAoOCk7CisJc2hvd19ib290X3Byb2dyZXNzICg4KTsKIAogCXN3aXRjaCAoaGRyLT5paF9vcykgewogCWRlZmF1bHQ6CQkJLyogaGFuZGxlZCBieSAob3JpZ2luYWwpIExpbnV4IGNhc2UgKi8KQEAgLTQ0MCw3ICs0MzIsNyBAQAogCQkJICAgICBhZGRyLCBsZW5fcHRyLCB2ZXJpZnkpOwogCSAgICBicmVhazsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0VMRikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRUxGKQogCWNhc2UgSUhfT1NfVlhXT1JLUzoKIAkgICAgZG9fYm9vdG1fdnh3b3JrcyAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YsCiAJCQkgICAgICBhZGRyLCBsZW5fcHRyLCB2ZXJpZnkpOwpAQCAtNDQ5LDcgKzQ0MSw3IEBACiAJICAgIGRvX2Jvb3RtX3FueGVsZiAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YsCiAJCQkgICAgICBhZGRyLCBsZW5fcHRyLCB2ZXJpZnkpOwogCSAgICBicmVhazsKLSNlbmRpZiAvKiBDRkdfQ01EX0VMRiAqLworI2VuZGlmCiAjaWZkZWYgQ09ORklHX0FSVE9TCiAJY2FzZSBJSF9PU19BUlRPUzoKIAkgICAgZG9fYm9vdG1fYXJ0b3MgIChjbWR0cCwgZmxhZywgYXJnYywgYXJndiwKQEAgLTQ1OCw3ICs0NTAsNyBAQAogI2VuZGlmCiAJfQogCi0JU0hPV19CT09UX1BST0dSRVNTICgtOSk7CisJc2hvd19ib290X3Byb2dyZXNzICgtOSk7CiAjaWZkZWYgREVCVUcKIAlwdXRzICgiXG4jIyBDb250cm9sIHJldHVybmVkIHRvIG1vbml0b3IgLSByZXNldHRpbmcuLi5cbiIpOwogCWRvX3Jlc2V0IChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CkBAIC02MzcsNyArNjI5LDcgQEAKICNlbmRpZgogCWlmIChhcmdjID49IDMpIHsKIAkJZGVidWcgKCJOb3Qgc2tpcHBpbmcgaW5pdHJkXG4iKTsKLQkJU0hPV19CT09UX1BST0dSRVNTICg5KTsKKwkJc2hvd19ib290X3Byb2dyZXNzICg5KTsKIAogCQlhZGRyID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTYpOwogCkBAIC02NDgsNyArNjQwLDcgQEAKIAogCQlpZiAobnRvaGwoaGRyLT5paF9tYWdpYykgICE9IElIX01BR0lDKSB7CiAJCQlwdXRzICgiQmFkIE1hZ2ljIE51bWJlclxuIik7Ci0JCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xMCk7CisJCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC0xMCk7CiAJCQlkb19yZXNldCAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOwogCQl9CiAKQEAgLTY2MCwxMSArNjUyLDExIEBACiAKIAkJaWYgKGNyYzMyICgwLCAodWNoYXIgKilkYXRhLCBsZW4pICE9IGNoZWNrc3VtKSB7CiAJCQlwdXRzICgiQmFkIEhlYWRlciBDaGVja3N1bVxuIik7Ci0JCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xMSk7CisJCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC0xMSk7CiAJCQlkb19yZXNldCAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOwogCQl9CiAKLQkJU0hPV19CT09UX1BST0dSRVNTICgxMCk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoMTApOwogCiAJCXByaW50X2ltYWdlX2hkciAoaGRyKTsKIApAQCAtNjk3LDE5ICs2ODksMTkgQEAKIAogCQkJaWYgKGNzdW0gIT0gbnRvaGwoaGRyLT5paF9kY3JjKSkgewogCQkJCXB1dHMgKCJCYWQgRGF0YSBDUkNcbiIpOwotCQkJCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEyKTsKKwkJCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC0xMik7CiAJCQkJZG9fcmVzZXQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKIAkJCX0KIAkJCXB1dHMgKCJPS1xuIik7CiAJCX0KIAotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKDExKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgxMSk7CiAKIAkJaWYgKChoZHItPmloX29zICAgIT0gSUhfT1NfTElOVVgpCXx8CiAJCSAgICAoaGRyLT5paF9hcmNoICE9IElIX0NQVV9QUEMpCXx8CiAJCSAgICAoaGRyLT5paF90eXBlICE9IElIX1RZUEVfUkFNRElTSykJKSB7CiAJCQlwdXRzICgiTm8gTGludXggUFBDIFJhbWRpc2sgSW1hZ2VcbiIpOwotCQkJU0hPV19CT09UX1BST0dSRVNTICgtMTMpOworCQkJc2hvd19ib290X3Byb2dyZXNzICgtMTMpOwogCQkJZG9fcmVzZXQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKIAkJfQogCkBAIC03MjAsNyArNzEyLDcgQEAKIAkJdV9sb25nIHRhaWwgICAgPSBudG9obChsZW5fcHRyWzBdKSAlIDQ7CiAJCWludCBpOwogCi0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoMTMpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDEzKTsKIAogCQkvKiBza2lwIGtlcm5lbCBsZW5ndGggYW5kIHRlcm1pbmF0b3IgKi8KIAkJZGF0YSA9ICh1bG9uZykoJmxlbl9wdHJbMl0pOwpAQCAtNzM5LDcgKzczMSw3IEBACiAJCS8qCiAJCSAqIG5vIGluaXRyZCBpbWFnZQogCQkgKi8KLQkJU0hPV19CT09UX1BST0dSRVNTICgxNCk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoMTQpOwogCiAJCWxlbiA9IGRhdGEgPSAwOwogCX0KQEAgLTc0OCw1OSArNzQwLDY1IEBACiAJaWYoYXJnYyA+IDMpIHsKIAkJb2ZfZmxhdF90cmVlID0gKGNoYXIgKikgc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgTlVMTCwgMTYpOwogCQloZHIgPSAoaW1hZ2VfaGVhZGVyX3QgKilvZl9mbGF0X3RyZWU7Ci0jaWYgZGVmaW5lZChDT05GSUdfT0ZfTElCRkRUKQotCQlpZiAoZmR0X2NoZWNrX2hlYWRlcihvZl9mbGF0X3RyZWUpID09IDApIHsKKyNpZiBkZWZpbmVkKENPTkZJR19PRl9GTEFUX1RSRUUpCisJCWlmICgqKCh1bG9uZyAqKShvZl9mbGF0X3RyZWUgKyBzaXplb2YoaW1hZ2VfaGVhZGVyX3QpKSkgIT0gT0ZfRFRfSEVBREVSKSB7CiAjZWxzZQotCQlpZiAoKih1bG9uZyAqKW9mX2ZsYXRfdHJlZSA9PSBPRl9EVF9IRUFERVIpIHsKKwkJaWYgKGZkdF9jaGVja19oZWFkZXIob2ZfZmxhdF90cmVlICsgc2l6ZW9mKGltYWdlX2hlYWRlcl90KSkgIT0gMCkgewogI2VuZGlmCiAjaWZuZGVmIENGR19OT19GTEFTSAogCQkJaWYgKGFkZHIyaW5mbygodWxvbmcpb2ZfZmxhdF90cmVlKSAhPSBOVUxMKQogCQkJCW9mX2RhdGEgPSAodWxvbmcpb2ZfZmxhdF90cmVlOwogI2VuZGlmCiAJCX0gZWxzZSBpZiAobnRvaGwoaGRyLT5paF9tYWdpYykgPT0gSUhfTUFHSUMpIHsKLQkJCXByaW50ZigiIyMgRmxhdCBEZXZpY2UgVHJlZSBJbWFnZSBhdCAlMDhsWFxuIiwgaGRyKTsKKwkJCXByaW50ZigiIyMgRmxhdCBEZXZpY2UgVHJlZSBhdCAlMDhsWFxuIiwgaGRyKTsKIAkJCXByaW50X2ltYWdlX2hkcihoZHIpOwogCiAJCQlpZiAoKG50b2hsKGhkci0+aWhfbG9hZCkgPCAgKCh1bnNpZ25lZCBsb25nKWhkciArIG50b2hsKGhkci0+aWhfc2l6ZSkgKyBzaXplb2YoaGRyKSkpICYmCiAJCQkgICAoKG50b2hsKGhkci0+aWhfbG9hZCkgKyBudG9obChoZHItPmloX3NpemUpKSA+ICh1bnNpZ25lZCBsb25nKWhkcikpIHsKLQkJCQlwcmludGYgKCJFUlJPUjogTG9hZCBhZGRyZXNzIG92ZXJ3cml0ZXMgRmxhdCBEZXZpY2UgVHJlZSB1SW1hZ2VcbiIpOwotCQkJCXJldHVybjsKKwkJCQlwdXRzICgiRVJST1I6IGZkdCBvdmVyd3JpdHRlbiAtICIKKwkJCQkJIm11c3QgUkVTRVQgdGhlIGJvYXJkIHRvIHJlY292ZXIuXG4iKTsKKwkJCQlkb19yZXNldCAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOwogCQkJfQogCi0JCQlwcmludGYoIiAgIFZlcmlmeWluZyBDaGVja3N1bSAuLi4gIik7CisJCQlwdXRzICgiICAgVmVyaWZ5aW5nIENoZWNrc3VtIC4uLiAiKTsKIAkJCW1lbW1vdmUgKCZoZWFkZXIsIChjaGFyICopaGRyLCBzaXplb2YoaW1hZ2VfaGVhZGVyX3QpKTsKIAkJCWNoZWNrc3VtID0gbnRvaGwoaGVhZGVyLmloX2hjcmMpOwogCQkJaGVhZGVyLmloX2hjcmMgPSAwOwogCiAJCQlpZihjaGVja3N1bSAhPSBjcmMzMigwLCAodWNoYXIgKikmaGVhZGVyLCBzaXplb2YoaW1hZ2VfaGVhZGVyX3QpKSkgewotCQkJCXByaW50ZigiRVJST1I6IEZsYXQgRGV2aWNlIFRyZWUgaGVhZGVyIGNoZWNrc3VtIGlzIGludmFsaWRcbiIpOwotCQkJCXJldHVybjsKKwkJCQlwdXRzICgiRVJST1I6IGZkdCBoZWFkZXIgY2hlY2tzdW0gaW52YWxpZCAtICIKKwkJCQkJIm11c3QgUkVTRVQgdGhlIGJvYXJkIHRvIHJlY292ZXIuXG4iKTsKKwkJCQlkb19yZXNldCAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOwogCQkJfQogCiAJCQljaGVja3N1bSA9IG50b2hsKGhkci0+aWhfZGNyYyk7CiAJCQlhZGRyID0gKHVsb25nKSgodWNoYXIgKikoaGRyKSArIHNpemVvZihpbWFnZV9oZWFkZXJfdCkpOwogCiAJCQlpZihjaGVja3N1bSAhPSBjcmMzMigwLCAodWNoYXIgKilhZGRyLCBudG9obChoZHItPmloX3NpemUpKSkgewotCQkJCXByaW50ZigiRVJST1I6IEZsYXQgRGV2aWNlIFRyZWUgY2hlY2tzdW0gaXMgaW52YWxpZFxuIik7Ci0JCQkJcmV0dXJuOworCQkJCXB1dHMgKCJFUlJPUjogZmR0IGNoZWNrc3VtIGludmFsaWQgLSAiCisJCQkJCSJtdXN0IFJFU0VUIHRoZSBib2FyZCB0byByZWNvdmVyLlxuIik7CisJCQkJZG9fcmVzZXQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKIAkJCX0KLQkJCXByaW50ZigiT0tcbiIpOworCQkJcHV0cyAoIk9LXG4iKTsKIAogCQkJaWYgKG50b2hsKGhkci0+aWhfdHlwZSkgIT0gSUhfVFlQRV9GTEFURFQpIHsKLQkJCQlwcmludGYgKCJFUlJPUjogdUltYWdlIG5vdCBGbGF0IERldmljZSBUcmVlIHR5cGVcbiIpOwotCQkJCXJldHVybjsKKwkJCQlwdXRzICgiRVJST1I6IHVJbWFnZSBpcyBub3QgYSBmZHQgLSAiCisJCQkJCSJtdXN0IFJFU0VUIHRoZSBib2FyZCB0byByZWNvdmVyLlxuIik7CisJCQkJZG9fcmVzZXQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKIAkJCX0KIAkJCWlmIChudG9obChoZHItPmloX2NvbXApICE9IElIX0NPTVBfTk9ORSkgewotCQkJCXByaW50ZigiRVJST1I6IHVJbWFnZSBpcyBub3QgdW5jb21wcmVzc2VkXG4iKTsKLQkJCQlyZXR1cm47CisJCQkJcHV0cyAoIkVSUk9SOiB1SW1hZ2UgaXMgY29tcHJlc3NlZCAtICIKKwkJCQkJIm11c3QgUkVTRVQgdGhlIGJvYXJkIHRvIHJlY292ZXIuXG4iKTsKKwkJCQlkb19yZXNldCAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOwogCQkJfQotI2lmIGRlZmluZWQoQ09ORklHX09GX0xJQkZEVCkKLQkJCWlmIChmZHRfY2hlY2tfaGVhZGVyKG9mX2ZsYXRfdHJlZSArIHNpemVvZihpbWFnZV9oZWFkZXJfdCkpID09IDApIHsKLSNlbHNlCisjaWYgZGVmaW5lZChDT05GSUdfT0ZfRkxBVF9UUkVFKQogCQkJaWYgKCooKHVsb25nICopKG9mX2ZsYXRfdHJlZSArIHNpemVvZihpbWFnZV9oZWFkZXJfdCkpKSAhPSBPRl9EVF9IRUFERVIpIHsKKyNlbHNlCisJCQlpZiAoZmR0X2NoZWNrX2hlYWRlcihvZl9mbGF0X3RyZWUgKyBzaXplb2YoaW1hZ2VfaGVhZGVyX3QpKSAhPSAwKSB7CiAjZW5kaWYKLQkJCQlwcmludGYgKCJFUlJPUjogdUltYWdlIGRhdGEgaXMgbm90IGEgZmxhdCBkZXZpY2UgdHJlZVxuIik7Ci0JCQkJcmV0dXJuOworCQkJCXB1dHMgKCJFUlJPUjogdUltYWdlIGRhdGEgaXMgbm90IGEgZmR0IC0gIgorCQkJCQkibXVzdCBSRVNFVCB0aGUgYm9hcmQgdG8gcmVjb3Zlci5cbiIpOworCQkJCWRvX3Jlc2V0IChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CiAJCQl9CiAKIAkJCW1lbW1vdmUoKHZvaWQgKiludG9obChoZHItPmloX2xvYWQpLApAQCAtODA4LDEwICs4MDYsMTEgQEAKIAkJCQludG9obChoZHItPmloX3NpemUpKTsKIAkJCW9mX2ZsYXRfdHJlZSA9IChjaGFyICopbnRvaGwoaGRyLT5paF9sb2FkKTsKIAkJfSBlbHNlIHsKLQkJCXByaW50ZiAoIkRpZCBub3QgZmluZCBhIGZsYXQgZmxhdCBkZXZpY2UgdHJlZSBhdCBhZGRyZXNzICUwOGxYXG4iLCBvZl9mbGF0X3RyZWUpOwotCQkJcmV0dXJuOworCQkJcHV0cyAoIkRpZCBub3QgZmluZCBhIGZsYXQgRmxhdCBEZXZpY2UgVHJlZS5cbiIKKwkJCQkiTXVzdCBSRVNFVCB0aGUgYm9hcmQgdG8gcmVjb3Zlci5cbiIpOworCQkJZG9fcmVzZXQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKIAkJfQotCQlwcmludGYgKCIgICBCb290aW5nIHVzaW5nIGZsYXQgZGV2aWNlIHRyZWUgYXQgMHgleFxuIiwKKwkJcHJpbnRmICgiICAgQm9vdGluZyB1c2luZyB0aGUgZmR0IGF0IDB4JXhcbiIsCiAJCQkJb2ZfZmxhdF90cmVlKTsKIAl9IGVsc2UgaWYgKChoZHItPmloX3R5cGU9PUlIX1RZUEVfTVVMVEkpICYmIChsZW5fcHRyWzFdKSAmJiAobGVuX3B0clsyXSkpIHsKIAkJdV9sb25nIHRhaWwgICAgPSBudG9obChsZW5fcHRyWzBdKSAlIDQ7CkBAIC04MzUsMjIgKzgzNCwyNCBAQAogCQkJb2ZfZGF0YSArPSA0IC0gdGFpbDsKIAkJfQogCi0jaWYgZGVmaW5lZChDT05GSUdfT0ZfTElCRkRUKQotCQlpZiAoZmR0X2NoZWNrX2hlYWRlcigodm9pZCAqKW9mX2RhdGEpICE9IDApIHsKKyNpZiBkZWZpbmVkKENPTkZJR19PRl9GTEFUX1RSRUUpCisJCWlmICgqKCh1bG9uZyAqKShvZl9mbGF0X3RyZWUgKyBzaXplb2YoaW1hZ2VfaGVhZGVyX3QpKSkgIT0gT0ZfRFRfSEVBREVSKSB7CiAjZWxzZQotCQlpZiAoKChzdHJ1Y3QgYm9vdF9wYXJhbV9oZWFkZXIgKilvZl9kYXRhKS0+bWFnaWMgIT0gT0ZfRFRfSEVBREVSKSB7CisJCWlmIChmZHRfY2hlY2tfaGVhZGVyKG9mX2ZsYXRfdHJlZSArIHNpemVvZihpbWFnZV9oZWFkZXJfdCkpICE9IDApIHsKICNlbmRpZgotCQkJcHJpbnRmICgiRVJST1I6IGltYWdlIGlzIG5vdCBhIGZsYXQgZGV2aWNlIHRyZWVcbiIpOwotCQkJcmV0dXJuOworCQkJcHV0cyAoIkVSUk9SOiBpbWFnZSBpcyBub3QgYSBmZHQgLSAiCisJCQkJIm11c3QgUkVTRVQgdGhlIGJvYXJkIHRvIHJlY292ZXIuXG4iKTsKKwkJCWRvX3Jlc2V0IChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CiAJCX0KIAotI2lmIGRlZmluZWQoQ09ORklHX09GX0xJQkZEVCkKLQkJaWYgKGJlMzJfdG9fY3B1KGZkdF90b3RhbHNpemUob2ZfZGF0YSkpICE9ICBudG9obChsZW5fcHRyWzJdKSkgewotI2Vsc2UKKyNpZiBkZWZpbmVkKENPTkZJR19PRl9GTEFUX1RSRUUpCiAJCWlmICgoKHN0cnVjdCBib290X3BhcmFtX2hlYWRlciAqKW9mX2RhdGEpLT50b3RhbHNpemUgIT0gbnRvaGwobGVuX3B0clsyXSkpIHsKKyNlbHNlCisJCWlmIChiZTMyX3RvX2NwdShmZHRfdG90YWxzaXplKG9mX2RhdGEpKSAhPSAgbnRvaGwobGVuX3B0clsyXSkpIHsKICNlbmRpZgotCQkJcHJpbnRmICgiRVJST1I6IGZsYXQgZGV2aWNlIHRyZWUgc2l6ZSBkb2VzIG5vdCBhZ3JlZSB3aXRoIGltYWdlXG4iKTsKLQkJCXJldHVybjsKKwkJCXB1dHMgKCJFUlJPUjogZmR0IHNpemUgIT0gaW1hZ2Ugc2l6ZSAtICIKKwkJCQkibXVzdCBSRVNFVCB0aGUgYm9hcmQgdG8gcmVjb3Zlci5cbiIpOworCQkJZG9fcmVzZXQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKIAkJfQogCX0KICNlbmRpZgpAQCAtODkwLDcgKzg5MSw3IEBACiAJCQkJaW5pdHJkX3N0YXJ0ID0gbnNwOwogCQl9CiAKLQkJU0hPV19CT09UX1BST0dSRVNTICgxMik7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoMTIpOwogCiAJCWRlYnVnICgiIyMgaW5pdHJkIGF0IDB4JTA4bFggLi4uIDB4JTA4bFggKGxlbj0lbGQ9MHglbFgpXG4iLAogCQkJZGF0YSwgZGF0YSArIGxlbiAtIDEsIGxlbiwgbGVuKTsKQEAgLTkyMywxNSArOTI0LDYgQEAKIAkJaW5pdHJkX2VuZCA9IDA7CiAJfQogCi0JZGVidWcgKCIjIyBUcmFuc2ZlcnJpbmcgY29udHJvbCB0byBMaW51eCAoYXQgYWRkcmVzcyAlMDhseCkgLi4uXG4iLAotCQkodWxvbmcpa2VybmVsKTsKLQotCVNIT1dfQk9PVF9QUk9HUkVTUyAoMTUpOwotCi0jaWYgZGVmaW5lZChDRkdfSU5JVF9SQU1fTE9DSykgJiYgIWRlZmluZWQoQ09ORklHX0U1MDApCi0JdW5sb2NrX3JhbV9pbl9jYWNoZSgpOwotI2VuZGlmCi0KICNpZiBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCiAJLyogbW92ZSBvZl9mbGF0X3RyZWUgaWYgbmVlZGVkICovCiAJaWYgKG9mX2RhdGEpIHsKQEAgLTk1MSwzMiArOTQzLDQxIEBACiAJCW9mX2ZsYXRfdHJlZSA9IChjaGFyICopb2Zfc3RhcnQ7CiAJCXByaW50ZiAoIiAgIExvYWRpbmcgRGV2aWNlIFRyZWUgdG8gJTA4bHgsIGVuZCAlMDhseCAuLi4gIiwKIAkJCW9mX3N0YXJ0LCBvZl9zdGFydCArIG9mX2xlbiAtIDEpOwotCQllcnIgPSBmZHRfb3Blbl9pbnRvKCh2b2lkICopb2Zfc3RhcnQsICh2b2lkICopb2ZfZGF0YSwgb2ZfbGVuKTsKKwkJZXJyID0gZmR0X29wZW5faW50bygodm9pZCAqKW9mX2RhdGEsICh2b2lkICopb2Zfc3RhcnQsIG9mX2xlbik7CiAJCWlmIChlcnIgIT0gMCkgewotCQkJcHJpbnRmICgibGliZmR0OiAlcyAiIF9fRklMRV9fICIgJWRcbiIsIGZkdF9zdHJlcnJvcihlcnIpLCBfX0xJTkVfXyk7CisJCQlwdXRzICgiRVJST1I6IGZkdCBtb3ZlIGZhaWxlZCAtICIKKwkJCQkibXVzdCBSRVNFVCB0aGUgYm9hcmQgdG8gcmVjb3Zlci5cbiIpOworCQkJZG9fcmVzZXQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKIAkJfQotCQkvKgotCQkgKiBBZGQgdGhlIGNob3NlbiBub2RlIGlmIGl0IGRvZXNuJ3QgZXhpc3QsIGFkZCB0aGUgZW52IGFuZCBiZF90Ci0JCSAqIGlmIHRoZSB1c2VyIHdhbnRzIGl0ICh0aGUgbG9naWMgaXMgaW4gdGhlIHN1YnJvdXRpbmVzKS4KLQkJICovCi0JCWlmIChmZHRfY2hvc2VuKG9mX2ZsYXRfdHJlZSwgaW5pdHJkX3N0YXJ0LCBpbml0cmRfZW5kLCAwKSA8IDApIHsKLQkJCQlwcmludGYoIkZhaWxlZCBjcmVhdGluZyB0aGUgL2Nob3NlbiBub2RlICgweCUwOFgpLCBhYm9ydGluZy5cbiIsIG9mX2ZsYXRfdHJlZSk7Ci0JCQkJcmV0dXJuOwotCQl9CisJfQorCS8qCisJICogQWRkIHRoZSBjaG9zZW4gbm9kZSBpZiBpdCBkb2Vzbid0IGV4aXN0LCBhZGQgdGhlIGVudiBhbmQgYmRfdAorCSAqIGlmIHRoZSB1c2VyIHdhbnRzIGl0ICh0aGUgbG9naWMgaXMgaW4gdGhlIHN1YnJvdXRpbmVzKS4KKwkgKi8KKwlpZiAoZmR0X2Nob3NlbihvZl9mbGF0X3RyZWUsIGluaXRyZF9zdGFydCwgaW5pdHJkX2VuZCwgMCkgPCAwKSB7CisJCXB1dHMgKCJFUlJPUjogL2Nob3NlbiBub2RlIGNyZWF0ZSBmYWlsZWQgLSAiCisJCQkibXVzdCBSRVNFVCB0aGUgYm9hcmQgdG8gcmVjb3Zlci5cbiIpOworCQlkb19yZXNldCAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOworCX0KICNpZmRlZiBDT05GSUdfT0ZfSEFTX1VCT09UX0VOVgotCQlpZiAoZmR0X2VudihvZl9mbGF0X3RyZWUpIDwgMCkgewotCQkJCXByaW50ZigiRmFpbGVkIGNyZWF0aW5nIHRoZSAvdS1ib290LWVudiBub2RlLCBhYm9ydGluZy5cbiIpOwotCQkJCXJldHVybjsKLQkJfQotI2VuZGlmCi0jaWZkZWYgQ09ORklHX09GX0hBU19CRF9UCi0JCWlmIChmZHRfYmRfdChvZl9mbGF0X3RyZWUpIDwgMCkgewotCQkJCXByaW50ZigiRmFpbGVkIGNyZWF0aW5nIHRoZSAvYmRfdCBub2RlLCBhYm9ydGluZy5cbiIpOwotCQkJCXJldHVybjsKLQkJfQotI2VuZGlmCisJaWYgKGZkdF9lbnYob2ZfZmxhdF90cmVlKSA8IDApIHsKKwkJcHV0cyAoIkVSUk9SOiAvdS1ib290LWVudiBub2RlIGNyZWF0ZSBmYWlsZWQgLSAiCisJCQkibXVzdCBSRVNFVCB0aGUgYm9hcmQgdG8gcmVjb3Zlci5cbiIpOworCQlkb19yZXNldCAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOwogCX0KICNlbmRpZgorI2lmZGVmIENPTkZJR19PRl9IQVNfQkRfVAorCWlmIChmZHRfYmRfdChvZl9mbGF0X3RyZWUpIDwgMCkgeworCQlwdXRzICgiRVJST1I6IC9iZF90IG5vZGUgY3JlYXRlIGZhaWxlZCAtICIKKwkJCSJtdXN0IFJFU0VUIHRoZSBib2FyZCB0byByZWNvdmVyLlxuIik7CisJCWRvX3Jlc2V0IChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CisJfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX09GX0JPQVJEX1NFVFVQCisJLyogQ2FsbCB0aGUgYm9hcmQtc3BlY2lmaWMgZml4dXAgcm91dGluZSAqLworCWZ0X2JvYXJkX3NldHVwKG9mX2ZsYXRfdHJlZSwgZ2QtPmJkKTsKKyNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19PRl9MSUJGRFQgKi8KICNpZiBkZWZpbmVkKENPTkZJR19PRl9GTEFUX1RSRUUpCiAJLyogbW92ZSBvZl9mbGF0X3RyZWUgaWYgbmVlZGVkICovCiAJaWYgKG9mX2RhdGEpIHsKQEAgLTk5Niw4ICs5OTcsMzYgQEAKIAkJCW9mX3N0YXJ0LCBvZl9zdGFydCArIG9mX2xlbiAtIDEpOwogCQltZW1tb3ZlICgodm9pZCAqKW9mX3N0YXJ0LCAodm9pZCAqKW9mX2RhdGEsIG9mX2xlbik7CiAJfQorCS8qCisJICogQ3JlYXRlIHRoZSAvY2hvc2VuIG5vZGUgYW5kIG1vZGlmeSB0aGUgYmxvYiB3aXRoIGJvYXJkIHNwZWNpZmljCisJICogdmFsdWVzIGFzIG5lZWRlZC4KKwkgKi8KKwlmdF9zZXR1cChvZl9mbGF0X3RyZWUsIGtiZCwgaW5pdHJkX3N0YXJ0LCBpbml0cmRfZW5kKTsKKwkvKiBmdF9kdW1wX2Jsb2Iob2ZfZmxhdF90cmVlKTsgKi8KKyNlbmRpZgorCWRlYnVnICgiIyMgVHJhbnNmZXJyaW5nIGNvbnRyb2wgdG8gTGludXggKGF0IGFkZHJlc3MgJTA4bHgpIC4uLlxuIiwKKwkJKHVsb25nKWtlcm5lbCk7CisKKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDE1KTsKKworI2lmIGRlZmluZWQoQ0ZHX0lOSVRfUkFNX0xPQ0spICYmICFkZWZpbmVkKENPTkZJR19FNTAwKQorCXVubG9ja19yYW1faW5fY2FjaGUoKTsKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfT0ZfRkxBVF9UUkVFKSB8fCBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCisJaWYgKG9mX2ZsYXRfdHJlZSkgewkvKiBkZXZpY2UgdHJlZTsgYm9vdCBuZXcgc3R5bGUgKi8KKwkJLyoKKwkJICogTGludXggS2VybmVsIFBhcmFtZXRlcnMgKHBhc3NpbmcgZGV2aWNlIHRyZWUpOgorCQkgKiAgIHIzOiBwb2ludGVyIHRvIHRoZSBmZHQsIGZvbGxvd2VkIGJ5IHRoZSBib2FyZCBpbmZvIGRhdGEKKwkJICogICByNDogcGh5c2ljYWwgcG9pbnRlciB0byB0aGUga2VybmVsIGl0c2VsZgorCQkgKiAgIHI1OiBOVUxMCisJCSAqICAgcjY6IE5VTEwKKwkJICogICByNzogTlVMTAorCQkgKi8KKwkJKCprZXJuZWwpICgoYmRfdCAqKW9mX2ZsYXRfdHJlZSwgKHVsb25nKWtlcm5lbCwgMCwgMCwgMCk7CisJCS8qIGRvZXMgbm90IHJldHVybiAqLworCX0KKyNlbmRpZgogCS8qCiAJICogTGludXggS2VybmVsIFBhcmFtZXRlcnMgKHBhc3NpbmcgYm9hcmQgaW5mbyBkYXRhKToKIAkgKiAgIHIzOiBwdHIgdG8gYm9hcmQgaW5mbyBkYXRhCkBAIC0xMDA2LDQ2ICsxMDM1LDggQEAKIAkgKiAgIHI2OiBTdGFydCBvZiBjb21tYW5kIGxpbmUgc3RyaW5nCiAJICogICByNzogRW5kICAgb2YgY29tbWFuZCBsaW5lIHN0cmluZwogCSAqLwotI2lmIGRlZmluZWQoQ09ORklHX09GX0ZMQVRfVFJFRSkgfHwgZGVmaW5lZChDT05GSUdfT0ZfTElCRkRUKQotCWlmICghb2ZfZmxhdF90cmVlKQkvKiBubyBkZXZpY2UgdHJlZTsgYm9vdCBvbGQgc3R5bGUgKi8KLSNlbmRpZgotCQkoKmtlcm5lbCkgKGtiZCwgaW5pdHJkX3N0YXJ0LCBpbml0cmRfZW5kLCBjbWRfc3RhcnQsIGNtZF9lbmQpOwotCQkvKiBkb2VzIG5vdCByZXR1cm4gKi8KLQotI2lmIGRlZmluZWQoQ09ORklHX09GX0ZMQVRfVFJFRSkgfHwgZGVmaW5lZChDT05GSUdfT0ZfTElCRkRUKQotCS8qCi0JICogTGludXggS2VybmVsIFBhcmFtZXRlcnMgKHBhc3NpbmcgZGV2aWNlIHRyZWUpOgotCSAqICAgcjM6IHB0ciB0byBPRiBmbGF0IHRyZWUsIGZvbGxvd2VkIGJ5IHRoZSBib2FyZCBpbmZvIGRhdGEKLQkgKiAgIHI0OiBwaHlzaWNhbCBwb2ludGVyIHRvIHRoZSBrZXJuZWwgaXRzZWxmCi0JICogICByNTogTlVMTAotCSAqICAgcjY6IE5VTEwKLQkgKiAgIHI3OiBOVUxMCi0JICovCi0jaWYgZGVmaW5lZChDT05GSUdfT0ZfRkxBVF9UUkVFKQotCWZ0X3NldHVwKG9mX2ZsYXRfdHJlZSwga2JkLCBpbml0cmRfc3RhcnQsIGluaXRyZF9lbmQpOwotCS8qIGZ0X2R1bXBfYmxvYihvZl9mbGF0X3RyZWUpOyAqLwotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfT0ZfTElCRkRUKQotCWlmIChmZHRfY2hvc2VuKG9mX2ZsYXRfdHJlZSwgaW5pdHJkX3N0YXJ0LCBpbml0cmRfZW5kLCAwKSA8IDApIHsKLQkJcHJpbnRmKCJGYWlsZWQgY3JlYXRpbmcgdGhlIC9jaG9zZW4gbm9kZSAoMHglMDhYKSwgYWJvcnRpbmcuXG4iLCBvZl9mbGF0X3RyZWUpOwotCQlyZXR1cm47Ci0JfQotI2lmZGVmIENPTkZJR19PRl9IQVNfVUJPT1RfRU5WCi0JaWYgKGZkdF9lbnYob2ZfZmxhdF90cmVlKSA8IDApIHsKLQkJcHJpbnRmKCJGYWlsZWQgY3JlYXRpbmcgdGhlIC91LWJvb3QtZW52IG5vZGUsIGFib3J0aW5nLlxuIik7Ci0JCXJldHVybjsKLQl9Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfT0ZfSEFTX0JEX1QKLQlpZiAoZmR0X2JkX3Qob2ZfZmxhdF90cmVlKSA8IDApIHsKLQkJcHJpbnRmKCJGYWlsZWQgY3JlYXRpbmcgdGhlIC9iZF90IG5vZGUsIGFib3J0aW5nLlxuIik7Ci0JCXJldHVybjsKLQl9Ci0jZW5kaWYKLSNlbmRpZiAvKiBpZiBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpICovCi0KLQkoKmtlcm5lbCkgKChiZF90ICopb2ZfZmxhdF90cmVlLCAodWxvbmcpa2VybmVsLCAwLCAwLCAwKTsKLSNlbmRpZgorCSgqa2VybmVsKSAoa2JkLCBpbml0cmRfc3RhcnQsIGluaXRyZF9lbmQsIGNtZF9zdGFydCwgY21kX2VuZCk7CisJLyogZG9lcyBub3QgcmV0dXJuICovCiB9CiAjZW5kaWYgLyogQ09ORklHX1BQQyAqLwogCkBAIC0xMTE1LDcgKzExMDYsNyBAQAogCXByaW50ZiAoIiMjIFRyYW5zZmVycmluZyBjb250cm9sIHRvIE5ldEJTRCBzdGFnZS0yIGxvYWRlciAoYXQgYWRkcmVzcyAlMDhseCkgLi4uXG4iLAogCQkodWxvbmcpbG9hZGVyKTsKIAotCVNIT1dfQk9PVF9QUk9HUkVTUyAoMTUpOworCXNob3dfYm9vdF9wcm9ncmVzcyAoMTUpOwogCiAJLyoKIAkgKiBOZXRCU0QgU3RhZ2UtMiBMb2FkZXIgUGFyYW1ldGVyczoKQEAgLTEyMTksNyArMTIxMCw3IEBACiAjZW5kaWYKIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQk9PVEQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JPT1REKQogaW50IGRvX2Jvb3RkIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKIAlpbnQgcmNvZGUgPSAwOwpAQCAtMTI0Nyw3ICsxMjM4LDcgQEAKIAogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JTUkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lNSSkKIGludCBkb19pbWluZm8gKCBjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKIAlpbnQJYXJnOwpAQCAtMTMxNSw5ICsxMzA2LDkgQEAKIAkiICAgICAgaW1hZ2UgY29udGVudHMgKG1hZ2ljIG51bWJlciwgaGVhZGVyIGFuZCBwYXlsb2FkIGNoZWNrc3VtcylcbiIKICk7CiAKLSNlbmRpZgkvKiBDRkdfQ01EX0lNSSAqLworI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JTUxTKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JTUxTKQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogTGlzdCBhbGwgaW1hZ2VzIGZvdW5kIGluIGZsYXNoLgogICovCkBAIC0xMzczLDIzICsxMzY0LDIzIEBACiAJIiAgICAtIFByaW50cyBpbmZvcm1hdGlvbiBhYm91dCBhbGwgaW1hZ2VzIGZvdW5kIGF0IHNlY3RvclxuIgogCSIgICAgICBib3VuZGFyaWVzIGluIGZsYXNoLlxuIgogKTsKLSNlbmRpZgkvKiBDRkdfQ01EX0lNTFMgKi8KKyNlbmRpZgogCiB2b2lkCiBwcmludF9pbWFnZV9oZHIgKGltYWdlX2hlYWRlcl90ICpoZHIpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREFURSkgfHwgZGVmaW5lZChDT05GSUdfVElNRVNUQU1QKQorI2lmIGRlZmluZWQoQ09ORklHX1RJTUVTVEFNUCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAJdGltZV90IHRpbWVzdGFtcCA9ICh0aW1lX3QpbnRvaGwoaGRyLT5paF90aW1lKTsKIAlzdHJ1Y3QgcnRjX3RpbWUgdG07CiAjZW5kaWYKIAogCXByaW50ZiAoIiAgIEltYWdlIE5hbWU6ICAgJS4qc1xuIiwgSUhfTk1MRU4sIGhkci0+aWhfbmFtZSk7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREFURSkgfHwgZGVmaW5lZChDT05GSUdfVElNRVNUQU1QKQorI2lmIGRlZmluZWQoQ09ORklHX1RJTUVTVEFNUCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAJdG9fdG0gKHRpbWVzdGFtcCwgJnRtKTsKIAlwcmludGYgKCIgICBDcmVhdGVkOiAgICAgICU0ZC0lMDJkLSUwMmQgICUyZDolMDJkOiUwMmQgVVRDXG4iLAogCQl0bS50bV95ZWFyLCB0bS50bV9tb24sIHRtLnRtX21kYXksCiAJCXRtLnRtX2hvdXIsIHRtLnRtX21pbiwgdG0udG1fc2VjKTsKLSNlbmRpZgkvKiBDRkdfQ01EX0RBVEUsIENPTkZJR19USU1FU1RBTVAgKi8KKyNlbmRpZgogCXB1dHMgKCIgICBJbWFnZSBUeXBlOiAgICIpOyBwcmludF90eXBlKGhkcik7CiAJcHJpbnRmICgiXG4gICBEYXRhIFNpemU6ICAgICVkIEJ5dGVzID0gIiwgbnRvaGwoaGRyLT5paF9zaXplKSk7CiAJcHJpbnRfc2l6ZSAobnRvaGwoaGRyLT5paF9zaXplKSwgIlxuIik7CkBAIC0xNTc4LDcgKzE1NjksNyBAQAogCXByaW50ZiAoIiMjIFRyYW5zZmVycmluZyBjb250cm9sIHRvIFJURU1TIChhdCBhZGRyZXNzICUwOGx4KSAuLi5cbiIsCiAJCSh1bG9uZyllbnRyeV9wb2ludCk7CiAKLQlTSE9XX0JPT1RfUFJPR1JFU1MgKDE1KTsKKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDE1KTsKIAogCS8qCiAJICogUlRFTVMgUGFyYW1ldGVyczoKQEAgLTE1ODgsNyArMTU3OSw3IEBACiAJKCplbnRyeV9wb2ludCApICggZ2QtPmJkICk7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9FTEYpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0VMRikKIHN0YXRpYyB2b2lkCiBkb19ib290bV92eHdvcmtzIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwKIAkJICB1bG9uZyBhZGRyLCB1bG9uZyAqbGVuX3B0ciwgaW50IHZlcmlmeSkKQEAgLTE2MTQsNyArMTYwNSw3IEBACiAJbG9jYWxfYXJnc1sxXSA9IHN0cjsJLyogYW5kIHByb3ZpZGUgaXQgdmlhIHRoZSBhcmd1bWVudHMgKi8KIAlkb19ib290ZWxmKGNtZHRwLCAwLCAyLCBsb2NhbF9hcmdzKTsKIH0KLSNlbmRpZiAvKiBDRkdfQ01EX0VMRiAqLworI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfTFlOWEtESQogc3RhdGljIHZvaWQKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfY2FjaGUuYyBiL2NvbW1vbi9jbWRfY2FjaGUuYwppbmRleCA2YzI1MGJjLi42NzVkNDNmIDEwMDY0NAotLS0gYS9jb21tb24vY21kX2NhY2hlLmMKKysrIGIvY29tbW9uL2NtZF9jYWNoZS5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQ0FDSEUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0NBQ0hFKQogCiBzdGF0aWMgaW50IG9uX29mZiAoY29uc3QgY2hhciAqKTsKIApAQCAtMTA5LDQgKzEwOSw0IEBACiAJIiAgICAtIGVuYWJsZSBvciBkaXNhYmxlIGRhdGEgKHdyaXRldGhyb3VnaCkgY2FjaGVcbiIKICk7CiAKLSNlbmRpZgkvKiBDRkdfQ01EX0NBQ0hFICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfY29uc29sZS5jIGIvY29tbW9uL2NtZF9jb25zb2xlLmMKaW5kZXggMWJkMzcwOS4uNWUwZjk5MCAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9jb25zb2xlLmMKKysrIGIvY29tbW9uL2NtZF9jb25zb2xlLmMKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxjb21tYW5kLmg+CiAjaW5jbHVkZSA8ZGV2aWNlcy5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQ09OU09MRSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQ09OU09MRSkKIAogZXh0ZXJuIHZvaWQgX2RvX2NvbmluZm8gKHZvaWQpOwogaW50IGRvX2NvbmluZm8gKGNtZF90YmxfdCAqIGNtZCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCkBAIC02OCw0ICs2OCw0IEBACiAJIiIKICk7CiAKLSNlbmRpZiAvKiBDRkdfQ01EX0NPTlNPTEUgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9kYXRlLmMgYi9jb21tb24vY21kX2RhdGUuYwppbmRleCAzM2QyZTU2Li40YTQyNTM0IDEwMDY0NAotLS0gYS9jb21tb24vY21kX2RhdGUuYworKysgYi9jb21tb24vY21kX2RhdGUuYwpAQCAtMzEsNyArMzEsNyBAQAogCiBERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAKIGNvbnN0IGNoYXIgKndlZWtkYXlzW10gPSB7CiAJIlN1biIsICJNb24iLCAiVHVlcyIsICJXZWRuZXMiLCAiVGh1cnMiLCAiRnJpIiwgIlNhdHVyIiwKQEAgLTIxMSw0ICsyMTEsNCBAQAogCSIgIC0gd2l0aCAncmVzZXQnIGFyZ3VtZW50OiByZXNldCB0aGUgUlRDXG4iCiApOwogCi0jZW5kaWYJLyogQ0ZHX0NNRF9EQVRFICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfZGNyLmMgYi9jb21tb24vY21kX2Rjci5jCmluZGV4IDcyMjFhODYuLjEyZmE5ZGIgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfZGNyLmMKKysrIGIvY29tbW9uL2NtZF9kY3IuYwpAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgPGNvbmZpZy5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHXzR4eCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0VUR0VURENSKQorI2lmIGRlZmluZWQoQ09ORklHXzR4eCkgJiYgZGVmaW5lZChDT05GSUdfQ01EX1NFVEdFVERDUikKIAogdW5zaWduZWQgbG9uZyBnZXRfZGNyICh1bnNpZ25lZCBzaG9ydCk7CiB1bnNpZ25lZCBsb25nIHNldF9kY3IgKHVuc2lnbmVkIHNob3J0LCB1bnNpZ25lZCBsb25nKTsKQEAgLTI0Niw0ICsyNDYsNCBAQAogCSJhZHJfZGNyblsuZGF0X2Rjcm5dIG9mZnNldCB2YWx1ZSAtIHdyaXRlIG9mZnNldCB0byBhZHJfZGNybiwgd3JpdGUgdmFsdWUgdG8gZGF0X2Rjcm4uXG4iCiApOwogCi0jZW5kaWYgLyogQ09ORklHXzR4eCAmIENGR19DTURfU0VUR0VURENSICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfZGlhZy5jIGIvY29tbW9uL2NtZF9kaWFnLmMKaW5kZXggNDVjNGIzMS4uY2I5OWI3NyAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9kaWFnLmMKKysrIGIvY29tbW9uL2NtZF9kaWFnLmMKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxjb21tYW5kLmg+CiAjaW5jbHVkZSA8cG9zdC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRElBRykgJiYgZGVmaW5lZChDT05GSUdfUE9TVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRElBRykgJiYgZGVmaW5lZChDT05GSUdfUE9TVCkKIAogaW50IGRvX2RpYWcgKGNtZF90YmxfdCAqIGNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKQEAgLTc3LDQgKzc3LDQgQEAKIAkiICAgICAgICAgLSBydW4gc3BlY2lmaWVkIHRlc3RzXG4iCiApOwogCi0jZW5kaWYgLyogQ0ZHX0NNRF9ESUFHICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfZGlzcGxheS5jIGIvY29tbW9uL2NtZF9kaXNwbGF5LmMKaW5kZXggYWJlZTg0NC4uZDE5ZjQxMiAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9kaXNwbGF5LmMKKysrIGIvY29tbW9uL2NtZF9kaXNwbGF5LmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxjb21tYW5kLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ESVNQTEFZKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ESVNQTEFZKQogCiAjdW5kZWYgREVCVUdfRElTUAogCkBAIC03OSw0ICs3OSw0IEBACiAJIiAgICAtIHdpdGhvdXQgYXJndW1lbnRzOiBjbGVhciBkb3QgbWF0cml4IGRpc3BsYXlcbiIKICk7CiAKLSNlbmRpZgkvKiBDRkdfQ01EX0RJU1BMQVkgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9kb2MuYyBiL2NvbW1vbi9jbWRfZG9jLmMKaW5kZXggYWIzNzUxNi4uZDZkM2FmZiAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9kb2MuYworKysgYi9jb21tb24vY21kX2RvYy5jCkBAIC0xMiwxNCArMTIsNyBAQAogI2luY2x1ZGUgPG1hbGxvYy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCi0jaWZkZWYgQ09ORklHX1NIT1dfQk9PVF9QUk9HUkVTUwotIyBpbmNsdWRlIDxzdGF0dXNfbGVkLmg+Ci0jIGRlZmluZSBTSE9XX0JPT1RfUFJPR1JFU1MoYXJnKQlzaG93X2Jvb3RfcHJvZ3Jlc3MoYXJnKQotI2Vsc2UKLSMgZGVmaW5lIFNIT1dfQk9PVF9QUk9HUkVTUyhhcmcpCi0jZW5kaWYKLQotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RPQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRE9DKQogCiAjaW5jbHVkZSA8bGludXgvbXRkL25mdGwuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvZG9jMjAwMC5oPgpAQCAtMjE2LDYgKzIwOSw3IEBACiAJaW1hZ2VfaGVhZGVyX3QgKmhkcjsKIAlpbnQgcmNvZGUgPSAwOwogCisJc2hvd19ib290X3Byb2dyZXNzICgzNCk7CiAJc3dpdGNoIChhcmdjKSB7CiAJY2FzZSAxOgogCQlhZGRyID0gQ0ZHX0xPQURfQUREUjsKQEAgLTIzNiwyNCArMjMwLDI3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50ZiAoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC0zNSk7CiAJCXJldHVybiAxOwogCX0KIAorCXNob3dfYm9vdF9wcm9ncmVzcyAoMzUpOwogCWlmICghYm9vdF9kZXZpY2UpIHsKIAkJcHV0cyAoIlxuKiogTm8gYm9vdCBkZXZpY2UgKipcbiIpOwotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgtMzYpOwogCQlyZXR1cm4gMTsKIAl9CisJc2hvd19ib290X3Byb2dyZXNzICgzNik7CiAKIAlkZXYgPSBzaW1wbGVfc3RydG91bChib290X2RldmljZSwgJmVwLCAxNik7CiAKIAlpZiAoKGRldiA+PSBDRkdfTUFYX0RPQ19ERVZJQ0UpIHx8CiAJICAgIChkb2NfZGV2X2Rlc2NbZGV2XS5DaGlwSUQgPT0gRE9DX0NoaXBJRF9VTktOT1dOKSkgewogCQlwcmludGYgKCJcbioqIERldmljZSAlZCBub3QgYXZhaWxhYmxlXG4iLCBkZXYpOwotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgtMzcpOwogCQlyZXR1cm4gMTsKIAl9CisJc2hvd19ib290X3Byb2dyZXNzICgzNyk7CiAKIAlwcmludGYgKCJcbkxvYWRpbmcgZnJvbSBkZXZpY2UgJWQ6ICVzIGF0IDB4JWxYIChvZmZzZXQgMHglbFgpXG4iLAogCQlkZXYsIGRvY19kZXZfZGVzY1tkZXZdLm5hbWUsIGRvY19kZXZfZGVzY1tkZXZdLnBoeXNhZHIsCkBAIC0yNjIsOSArMjU5LDEwIEBACiAJaWYgKGRvY19ydyAoZG9jX2Rldl9kZXNjICsgZGV2LCAxLCBvZmZzZXQsCiAJCSAgICBTRUNUT1JTSVpFLCBOVUxMLCAodV9jaGFyICopYWRkcikpIHsKIAkJcHJpbnRmICgiKiogUmVhZCBlcnJvciBvbiAlZFxuIiwgZGV2KTsKLQkJU0hPV19CT09UX1BST0dSRVNTICgtMSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTM4KTsKIAkJcmV0dXJuIDE7CiAJfQorCXNob3dfYm9vdF9wcm9ncmVzcyAoMzgpOwogCiAJaGRyID0gKGltYWdlX2hlYWRlcl90ICopYWRkcjsKIApAQCAtMjc2LDE2ICsyNzQsMTggQEAKIAkJY250IC09IFNFQ1RPUlNJWkU7CiAJfSBlbHNlIHsKIAkJcHV0cyAoIlxuKiogQmFkIE1hZ2ljIE51bWJlciAqKlxuIik7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC0zOSk7CiAJCXJldHVybiAxOwogCX0KKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDM5KTsKIAogCWlmIChkb2NfcncgKGRvY19kZXZfZGVzYyArIGRldiwgMSwgb2Zmc2V0ICsgU0VDVE9SU0laRSwgY250LAogCQkgICAgTlVMTCwgKHVfY2hhciAqKShhZGRyK1NFQ1RPUlNJWkUpKSkgewogCQlwcmludGYgKCIqKiBSZWFkIGVycm9yIG9uICVkXG4iLCBkZXYpOwotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgtNDApOwogCQlyZXR1cm4gMTsKIAl9CisJc2hvd19ib290X3Byb2dyZXNzICg0MCk7CiAKIAkvKiBMb2FkaW5nIG9rLCB1cGRhdGUgZGVmYXVsdCBsb2FkIGFkZHJlc3MgKi8KIApAQCAtMTYwOCw0ICsxNjA4LDQgQEAKIAl9CiB9CiAKLSNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ET0MpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfZHR0LmMgYi9jb21tb24vY21kX2R0dC5jCmluZGV4IDRmN2IwNDkuLjhkYTk1YmYgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfZHR0LmMKKysrIGIvY29tbW9uL2NtZF9kdHQuYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGNvbmZpZy5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RUVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRFRUKQogCiAjaW5jbHVkZSA8ZHR0Lmg+CiAjaW5jbHVkZSA8aTJjLmg+CkBAIC02MSw0ICs2MSw0IEBACiAJICAiICAgICAgICAtIFJlYWQgdGVtcGVyYXR1cmUgZnJvbSBkaWdpdGFsIHRoZXJtb21ldGVyIGFuZCB0aGVybW9zdGF0LlxuIgogKTsKIAotI2VuZGlmIC8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRFRUICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfZWVwcm9tLmMgYi9jb21tb24vY21kX2VlcHJvbS5jCmluZGV4IGQxNWE0MTIuLmU1MDAwZTkgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfZWVwcm9tLmMKKysrIGIvY29tbW9uL2NtZF9lZXByb20uYwpAQCAtNDIsNyArNDIsNyBAQAogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDxpMmMuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0VFUFJPTSkgfHwgZGVmaW5lZChDRkdfRU5WX0lTX0lOX0VFUFJPTSkKKyNpZiBkZWZpbmVkKENGR19FTlZfSVNfSU5fRUVQUk9NKSB8fCBkZWZpbmVkKENPTkZJR19DTURfRUVQUk9NKQogCiBleHRlcm4gdm9pZCBlZXByb21faW5pdCAgKHZvaWQpOwogZXh0ZXJuIGludCAgZWVwcm9tX3JlYWQgICh1bnNpZ25lZCBkZXZfYWRkciwgdW5zaWduZWQgb2Zmc2V0LApAQCAtNjIsNyArNjIsNyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9FRVBST00pCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0VFUFJPTSkKIGludCBkb19lZXByb20gKCBjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAJY29uc3QgY2hhciAqY29uc3QgZm10ID0KQEAgLTExMCw3ICsxMTAsNyBAQAogCXByaW50ZiAoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CiAJcmV0dXJuIDE7CiB9Ci0jZW5kaWYJLyogQ0ZHX0NNRF9FRVBST00gKi8KKyNlbmRpZgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKgpAQCAtMTIxLDcgKzEyMSw3IEBACiAgKiAgIDB4MDAwMDBueHggZm9yIEVFUFJPTSBhZGRyZXNzIHNlbGVjdG9ycyBhbmQgcGFnZSBudW1iZXIgYXQgbi4KICAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRUVQUk9NKSB8fCBkZWZpbmVkKENGR19FTlZfSVNfSU5fRUVQUk9NKQorI2lmIGRlZmluZWQoQ0ZHX0VOVl9JU19JTl9FRVBST00pIHx8IGRlZmluZWQoQ09ORklHX0NNRF9FRVBST00pCiAKICNpZm5kZWYgQ09ORklHX1NQSQogI2lmICFkZWZpbmVkKENGR19JMkNfRUVQUk9NX0FERFJfTEVOKSB8fCBDRkdfSTJDX0VFUFJPTV9BRERSX0xFTiA8IDEgfHwgQ0ZHX0kyQ19FRVBST01fQUREUl9MRU4gPiAyCkBAIC00MjIsMTAgKzQyMiwxMSBAQAogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCi0jZW5kaWYJLyogQ0ZHX0NNRF9FRVBST00gKi8KKyNlbmRpZgorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRUVQUk9NKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9FRVBST00pCiAKICNpZmRlZiBDRkdfSTJDX01VTFRJX0VFUFJPTVMKIFVfQk9PVF9DTUQoCkBAIC00NDUsNCArNDQ2LDQgQEAKICk7CiAjZW5kaWYgLyogQ0ZHX0kyQ19NVUxUSV9FRVBST01TICovCiAKLSNlbmRpZgkvKiBDRkdfQ01EX0VFUFJPTSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2VsZi5jIGIvY29tbW9uL2NtZF9lbGYuYwppbmRleCAwZTNkNTZmLi42M2E1NTkzIDEwMDY0NAotLS0gYS9jb21tb24vY21kX2VsZi5jCisrKyBiL2NvbW1vbi9jbWRfZWxmLmMKQEAgLTIzLDcgKzIzLDcgQEAKIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9FTEYpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0VMRikKIAogI2lmbmRlZiBNQVgKICNkZWZpbmUgTUFYKGEsYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKQEAgLTEwMSw3ICsxMDEsNyBAQAogCWVsc2UKIAkJYWRkciA9IHNpbXBsZV9zdHJ0b3VsIChhcmd2WzFdLCBOVUxMLCAxNik7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAkvKiBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byB0ZnRwIHRoZSBpbWFnZSBvdXJzZWx2ZXMgYmVmb3JlIHN0YXJ0aW5nICovCiAKIAlpZiAoKGFyZ2MgPT0gMikgJiYgKHN0cmNtcCAoYXJndlsxXSwgInRmdHAiKSA9PSAwKSkgewpAQCAtMzI0LDQgKzMyNCw0IEBACiAJIiBbYWRkcmVzc10gLSBsb2FkIGFkZHJlc3Mgb2YgdnhXb3JrcyBFTEYgaW1hZ2UuXG4iCiApOwogCi0jZW5kaWYJLyogQ0ZHX0NNRF9FTEYgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9leHQyLmMgYi9jb21tb24vY21kX2V4dDIuYwppbmRleCA5NGJkOWI2Li44YmQyYjQ3IDEwMDY0NAotLS0gYS9jb21tb24vY21kX2V4dDIuYworKysgYi9jb21tb24vY21kX2V4dDIuYwpAQCAtMzUsMTQgKzM1LDE0IEBACiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8cGFydC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRVhUMikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRVhUMikKICNpbmNsdWRlIDxjb25maWcuaD4KICNpbmNsdWRlIDxjb21tYW5kLmg+CiAjaW5jbHVkZSA8aW1hZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxleHQyZnMuaD4KLSNpZiAoKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfVVNCKSAmJiBkZWZpbmVkKENPTkZJR19VU0JfU1RPUkFHRSkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1VTQikgJiYgZGVmaW5lZChDT05GSUdfVVNCX1NUT1JBR0UpCiAjaW5jbHVkZSA8dXNiLmg+CiAjZW5kaWYKIApAQCAtMjYwLDQgKzI2MCw0IEBACiAJIiAgICAgIHRvIGFkZHJlc3MgJ2FkZHInIGZyb20gZXh0MiBmaWxlc3lzdGVtXG4iCiApOwogCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9FWFQyICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfZmF0LmMgYi9jb21tb24vY21kX2ZhdC5jCmluZGV4IGFmYWYyOTkuLjU0ZjBmOWYgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfZmF0LmMKKysrIGIvY29tbW9uL2NtZF9mYXQuYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGF0YS5oPgogI2luY2x1ZGUgPHBhcnQuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZBVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRkFUKQogCiAjdW5kZWYJREVCVUcKIApAQCAtMzI0LDQgKzMyNCw0IEBACiB9CiAjZW5kaWYJLyogTk9UX0lNUExFTUVOVEVEX1lFVCAqLwogCi0jZW5kaWYJLyogQ0ZHX0NNRF9GQVQgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9mZGMuYyBiL2NvbW1vbi9jbWRfZmRjLmMKaW5kZXggMDNmNGNlNi4uNzM0OTQxMiAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9mZGMuYworKysgYi9jb21tb24vY21kX2ZkYy5jCkBAIC00NywxMSArNDcsMTEgQEAKICNlbmRpZgogCiAKLS8qI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpICovCisvKiNpZiBkZWZpbmVkKENPTkZJR19DTURfREFURSkgKi8KIC8qI2luY2x1ZGUgPHJ0Yy5oPiAqLwogLyojZW5kaWYgKi8KIAotI2lmICgoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GREMpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZET1MpKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9GREMpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9GRE9TKQogCiAKIHR5cGVkZWYgc3RydWN0IHsKQEAgLTcwNyw5ICs3MDcsOSBAQAogCiAJcmV0dXJuIFRSVUU7CiB9Ci0jZW5kaWYgLyogKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZEQyl8fChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZET1MpKSovCisjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZET1MpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0ZET1MpCiAKIC8qIExvdyBsZXZlbCBmdW5jdGlvbnMgZm9yIHRoZSBGbG9wcHktRE9TIGxheWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIApAQCAtNzcyLDkgKzc3Miw5IEBACiAKIAlyZXR1cm4gKGZkY19yZWFkX2RhdGEgKGJ1ZmZlciwgbGVuLCBwQ01ELCBwRkcpKTsKIH0KLSNlbmRpZiAgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRPUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRDKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9GREMpCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogbWFpbiByb3V0aW5lIGRvX2ZkY2Jvb3QKICAqLwpAQCAtODgwLDEzICs4ODAsMTMgQEAKIH0KIAogCi0jZW5kaWYgLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GREMgKi8KKyNlbmRpZgogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZEQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRkRDKQogCiBVX0JPT1RfQ01EKAogCWZkY2Jvb3QsCTMsCTEsCWRvX2ZkY2Jvb3QsCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2Zkb3MuYyBiL2NvbW1vbi9jbWRfZmRvcy5jCmluZGV4IGRjMDJiMzUuLmY5ZGE5OGQgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfZmRvcy5jCisrKyBiL2NvbW1vbi9jbWRfZmRvcy5jCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPGZkYy5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRPUykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRkRPUykKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogZG9fZmRvc2Jvb3QgLS0KQEAgLTE1NCw0ICsxNTQsNCBAQAogCSJbZGlyZWN0b3J5XVxuIgogKTsKIAotI2VuZGlmCS8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRPUyAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2ZkdC5jIGIvY29tbW9uL2NtZF9mZHQuYwppbmRleCAwOGZlMzUxLi41NzFiOGYxIDEwMDY0NAotLS0gYS9jb21tb24vY21kX2ZkdC5jCisrKyBiL2NvbW1vbi9jbWRfZmR0LmMKQEAgLTM3LDQ2ICszNywzMiBAQAogI2luY2x1ZGUgPGZkdF9zdXBwb3J0Lmg+CiAKICNkZWZpbmUgTUFYX0xFVkVMCTMyCQkvKiBob3cgZGVlcGx5IG5lc3RlZCB3ZSB3aWxsIGdvICovCi0jZGVmaW5lIFNDUkFUQ0hQQUQJMTAyNAkvKiBieXRlcyBvZiBzY3JhdGNocGFkIG1lbW9yeSAqLworI2RlZmluZSBTQ1JBVENIUEFECTEwMjQJCS8qIGJ5dGVzIG9mIHNjcmF0Y2hwYWQgbWVtb3J5ICovCiAKIC8qCiAgKiBHbG9iYWwgZGF0YSAoZm9yIHRoZSBnZC0+YmQpCiAgKi8KIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwogCi0vKgotICogU2NyYXRjaHBhZCBtZW1vcnkuCi0gKi8KLXN0YXRpYyBjaGFyIGRhdGFbU0NSQVRDSFBBRF07Ci0KLQotLyoKLSAqIEZ1bmN0aW9uIHByb3RvdHlwZXMvZGVjbGFyYXRpb25zLgotICovCiBzdGF0aWMgaW50IGZkdF92YWxpZCh2b2lkKTsKLXN0YXRpYyB2b2lkIHByaW50X2RhdGEoY29uc3Qgdm9pZCAqZGF0YSwgaW50IGxlbik7Ci0KK3N0YXRpYyBpbnQgZmR0X3BhcnNlX3Byb3AoY2hhciAqcGF0aHAsIGNoYXIgKnByb3AsIGNoYXIgKm5ld3ZhbCwKKwljaGFyICpkYXRhLCBpbnQgKmxlbik7CitzdGF0aWMgaW50IGZkdF9wcmludChjaGFyICpwYXRocCwgY2hhciAqcHJvcCwgaW50IGRlcHRoKTsKIAogLyoKICAqIEZsYXR0ZW5lZCBEZXZpY2UgVHJlZSBjb21tYW5kLCBzZWUgdGhlIGhlbHAgZm9yIHBhcmFtZXRlciBkZWZpbml0aW9ucy4KICAqLwogaW50IGRvX2ZkdCAoY21kX3RibF90ICogY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQogewotCWNoYXIJCW9wOwotCiAJaWYgKGFyZ2MgPCAyKSB7CiAJCXByaW50ZiAoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CiAJCXJldHVybiAxOwogCX0KIAotCS8qCi0JICogRmlndXJlIG91dCB3aGljaCBzdWJjb21tYW5kIHdhcyBnaXZlbgotCSAqLwotCW9wID0gYXJndlsxXVswXTsKIAkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAkgKiBTZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGZkdAogCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlpZiAob3AgPT0gJ2EnKSB7CisJaWYgKGFyZ3ZbMV1bMF0gPT0gJ2EnKSB7CiAJCS8qCiAJCSAqIFNldCB0aGUgYWRkcmVzcyBbYW5kIGxlbmd0aF0gb2YgdGhlIGZkdC4KIAkJICovCkBAIC05NCw3ICs4MCw4IEBACiAJCQkgKi8KIAkJCWxlbiA9ICBzaW1wbGVfc3RydG91bChhcmd2WzNdLCBOVUxMLCAxNik7CiAJCQlpZiAobGVuIDwgZmR0X3RvdGFsc2l6ZShmZHQpKSB7Ci0JCQkJcHJpbnRmICgiTmV3IGxlbmd0aCAlZCA8IGV4aXN0aW5nIGxlbmd0aCAlZCwgaWdub3JpbmcuXG4iLAorCQkJCXByaW50ZiAoIk5ldyBsZW5ndGggJWQgPCBleGlzdGluZyBsZW5ndGggJWQsICIKKwkJCQkJImlnbm9yaW5nLlxuIiwKIAkJCQkJbGVuLCBmZHRfdG90YWxzaXplKGZkdCkpOwogCQkJfSBlbHNlIHsKIAkJCQkvKgpAQCAtMTAyLDcgKzg5LDggQEAKIAkJCQkgKi8KIAkJCQllcnIgPSBmZHRfb3Blbl9pbnRvKGZkdCwgZmR0LCBsZW4pOwogCQkJCWlmIChlcnIgIT0gMCkgewotCQkJCQlwcmludGYgKCJsaWJmZHQ6ICVzXG4iLCBmZHRfc3RyZXJyb3IoZXJyKSk7CisJCQkJCXByaW50ZiAoImxpYmZkdCBmZHRfb3Blbl9pbnRvKCk6ICVzXG4iLAorCQkJCQkJZmR0X3N0cmVycm9yKGVycikpOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMTEwLDEyICs5OCwxMiBAQAogCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCSAqIE1vdmUgdGhlIGZkdAogCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQl9IGVsc2UgaWYgKG9wID09ICdtJykgeworCX0gZWxzZSBpZiAoKGFyZ3ZbMV1bMF0gPT0gJ20nKSAmJiAoYXJndlsxXVsxXSA9PSAnbycpKSB7CiAJCXN0cnVjdCBmZHRfaGVhZGVyICpuZXdhZGRyOwogCQlpbnQgIGxlbjsKIAkJaW50ICBlcnI7CiAKLQkJaWYgKGFyZ2MgIT0gNSkgeworCQlpZiAoYXJnYyA8IDQpIHsKIAkJCXByaW50ZiAoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CiAJCQlyZXR1cm4gMTsKIAkJfQpAQCAtMTI4LDEyICsxMTYsMjIgQEAKIAkJCXJldHVybiAxOwogCQl9CiAKLQkJbmV3YWRkciA9IChzdHJ1Y3QgZmR0X2hlYWRlciAqKXNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDE2KTsKLQkJbGVuICAgICA9ICBzaW1wbGVfc3RydG91bChhcmd2WzRdLCBOVUxMLCAxNik7Ci0JCWlmIChsZW4gPCBmZHRfdG90YWxzaXplKGZkdCkpIHsKLQkJCXByaW50ZiAoIk5ldyBsZW5ndGggJWQgPCBleGlzdGluZyBsZW5ndGggJWQsIGFib3J0aW5nLlxuIiwKLQkJCQlsZW4sIGZkdF90b3RhbHNpemUoZmR0KSk7Ci0JCQlyZXR1cm4gMTsKKwkJbmV3YWRkciA9IChzdHJ1Y3QgZmR0X2hlYWRlciAqKXNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sTlVMTCwxNik7CisKKwkJLyoKKwkJICogSWYgdGhlIHVzZXIgc3BlY2lmaWVzIGEgbGVuZ3RoLCB1c2UgdGhhdC4gIE90aGVyd2lzZSB1c2UgdGhlCisJCSAqIGN1cnJlbnQgbGVuZ3RoLgorCQkgKi8KKwkJaWYgKGFyZ2MgPD0gNCkgeworCQkJbGVuID0gZmR0X3RvdGFsc2l6ZShmZHQpOworCQl9IGVsc2UgeworCQkJbGVuID0gc2ltcGxlX3N0cnRvdWwoYXJndls0XSwgTlVMTCwgMTYpOworCQkJaWYgKGxlbiA8IGZkdF90b3RhbHNpemUoZmR0KSkgeworCQkJCXByaW50ZiAoIk5ldyBsZW5ndGggMHglWCA8IGV4aXN0aW5nIGxlbmd0aCAiCisJCQkJCSIweCVYLCBhYm9ydGluZy5cbiIsCisJCQkJCWxlbiwgZmR0X3RvdGFsc2l6ZShmZHQpKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KIAkJfQogCiAJCS8qCkBAIC0xNDEsMjYgKzEzOSw1OSBAQAogCQkgKi8KIAkJZXJyID0gZmR0X29wZW5faW50byhmZHQsIG5ld2FkZHIsIGxlbik7CiAJCWlmIChlcnIgIT0gMCkgewotCQkJcHJpbnRmICgibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOworCQkJcHJpbnRmICgibGliZmR0IGZkdF9vcGVuX2ludG8oKTogJXNcbiIsCisJCQkJZmR0X3N0cmVycm9yKGVycikpOwogCQkJcmV0dXJuIDE7CiAJCX0KIAkJZmR0ID0gbmV3YWRkcjsKIAogCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgYSBub2RlIGluIHRoZSBmZHQuCisJICogTWFrZSBhIG5ldyBub2RlCiAJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCX0gZWxzZSBpZiAob3AgPT0gJ3MnKSB7CisJfSBlbHNlIGlmICgoYXJndlsxXVswXSA9PSAnbScpICYmIChhcmd2WzFdWzFdID09ICdrJykpIHsKIAkJY2hhciAqcGF0aHA7CQkvKiBwYXRoICovCi0JCWNoYXIgKnByb3A7CQkJLyogcHJvcGVydHkgKi8KLQkJc3RydWN0IGZkdF9wcm9wZXJ0eSAqbm9kZXA7CS8qIG5vZGUgc3RydWN0IHBvaW50ZXIgKi8KLQkJY2hhciAqbmV3dmFsOwkJLyogdmFsdWUgZnJvbSB0aGUgdXNlciAoYXMgYSBzdHJpbmcpICovCi0JCWNoYXIgKnZwOwkJCS8qIHRlbXBvcmFyeSB2YWx1ZSBwb2ludGVyICovCi0JCWNoYXIgKmNwOwkJCS8qIHRlbXBvcmFyeSBjaGFyIHBvaW50ZXIgKi8KKwkJY2hhciAqbm9kZXA7CQkvKiBuZXcgbm9kZSB0byBhZGQgKi8KIAkJaW50ICBub2Rlb2Zmc2V0OwkvKiBub2RlIG9mZnNldCBmcm9tIGxpYmZkdCAqLwotCQlpbnQgIGxlbjsJCQkvKiBuZXcgbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0eSAqLwotCQlpbnQgIG9sZGxlbjsJCS8qIG9yaWdpbmFsIGxlbmd0aCBvZiB0aGUgcHJvcGVydHkgKi8KLQkJdW5zaWduZWQgbG9uZyB0bXA7CS8qIGhvbGRzIGNvbnZlcnRlZCB2YWx1ZXMgKi8KLQkJaW50ICByZXQ7CQkJLyogcmV0dXJuIHZhbHVlICovCisJCWludCAgZXJyOworCisJCS8qCisJCSAqIFBhcmFtZXRlcnM6IE5vZGUgcGF0aCwgbmV3IG5vZGUgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIHBhdGguCisJCSAqLworCQlpZiAoYXJnYyA8IDQpIHsKKwkJCXByaW50ZiAoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCXBhdGhwID0gYXJndlsyXTsKKwkJbm9kZXAgPSBhcmd2WzNdOworCisJCW5vZGVvZmZzZXQgPSBmZHRfZmluZF9ub2RlX2J5X3BhdGggKGZkdCwgcGF0aHApOworCQlpZiAobm9kZW9mZnNldCA8IDApIHsKKwkJCS8qCisJCQkgKiBOb3QgZm91bmQgb3Igc29tZXRoaW5nIGVsc2UgYmFkIGhhcHBlbmVkLgorCQkJICovCisJCQlwcmludGYgKCJsaWJmZHQgZmR0X2ZpbmRfbm9kZV9ieV9wYXRoKCkgcmV0dXJuZWQgJXNcbiIsCisJCQkJZmR0X3N0cmVycm9yKG5vZGVvZmZzZXQpKTsKKwkJCXJldHVybiAxOworCQl9CisJCWVyciA9IGZkdF9hZGRfc3Vibm9kZShmZHQsIG5vZGVvZmZzZXQsIG5vZGVwKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCXByaW50ZiAoImxpYmZkdCBmZHRfYWRkX3N1Ym5vZGUoKTogJXNcbiIsCisJCQkJZmR0X3N0cmVycm9yKGVycikpOworCQkJcmV0dXJuIDE7CisJCX0KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFNldCB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSBpbiB0aGUgZmR0LgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwl9IGVsc2UgaWYgKGFyZ3ZbMV1bMF0gPT0gJ3MnKSB7CisJCWNoYXIgKnBhdGhwOwkJLyogcGF0aCAqLworCQljaGFyICpwcm9wOwkJLyogcHJvcGVydHkgKi8KKwkJY2hhciAqbmV3dmFsOwkJLyogdmFsdWUgZnJvbSB0aGUgdXNlciAoYXMgYSBzdHJpbmcpICovCisJCWludCAgbm9kZW9mZnNldDsJLyogbm9kZSBvZmZzZXQgZnJvbSBsaWJmZHQgKi8KKwkJc3RhdGljIGNoYXIgZGF0YVtTQ1JBVENIUEFEXTsJLyogc3RvcmFnZSBmb3IgdGhlIHByb3BlcnR5ICovCisJCWludCAgbGVuOwkJLyogbmV3IGxlbmd0aCBvZiB0aGUgcHJvcGVydHkgKi8KKwkJaW50ICByZXQ7CQkvKiByZXR1cm4gdmFsdWUgKi8KIAogCQkvKgogCQkgKiBQYXJhbWV0ZXJzOiBOb2RlIHBhdGgsIHByb3BlcnR5LCB2YWx1ZS4KQEAgLTE3NCwxMjEgKzIwNSwzOCBAQAogCQlwcm9wICAgPSBhcmd2WzNdOwogCQluZXd2YWwgPSBhcmd2WzRdOwogCi0JCWlmIChzdHJjbXAocGF0aHAsICIvIikgPT0gMCkgewotCQkJbm9kZW9mZnNldCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlub2Rlb2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0IChmZHQsIHBhdGhwKTsKLQkJCWlmIChub2Rlb2Zmc2V0IDwgMCkgewotCQkJCS8qCi0JCQkgCSAqIE5vdCBmb3VuZCBvciBzb21ldGhpbmcgZWxzZSBiYWQgaGFwcGVuZWQuCi0JCQkgCSAqLwotCQkJCXByaW50ZiAoImxpYmZkdDogJXNcbiIsIGZkdF9zdHJlcnJvcihub2Rlb2Zmc2V0KSk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9CisJCW5vZGVvZmZzZXQgPSBmZHRfZmluZF9ub2RlX2J5X3BhdGggKGZkdCwgcGF0aHApOworCQlpZiAobm9kZW9mZnNldCA8IDApIHsKKwkJCS8qCisJCQkgKiBOb3QgZm91bmQgb3Igc29tZXRoaW5nIGVsc2UgYmFkIGhhcHBlbmVkLgorCQkJICovCisJCQlwcmludGYgKCJsaWJmZHQgZmR0X2ZpbmRfbm9kZV9ieV9wYXRoKCkgcmV0dXJuZWQgJXNcbiIsCisJCQkJZmR0X3N0cmVycm9yKG5vZGVvZmZzZXQpKTsKKwkJCXJldHVybiAxOwogCQl9Ci0JCW5vZGVwID0gZmR0X2dldHByb3AgKGZkdCwgbm9kZW9mZnNldCwgcHJvcCwgJm9sZGxlbik7Ci0JCWlmIChvbGRsZW4gPCAwKSB7Ci0JCQlwcmludGYgKCJsaWJmZHQgJXNcbiIsIGZkdF9zdHJlcnJvcihvbGRsZW4pKTsKLQkJCXJldHVybiAxOwotCQl9IGVsc2UgaWYgKG9sZGxlbiA9PSAwKSB7Ci0JCQkvKgotCQkJICogVGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBoYXMgbm8gdmFsdWUKLQkJCSAqLwotCQkJcHJpbnRmKCIlcyBoYXMgbm8gdmFsdWUsIGNhbm5vdCBzZXQgb25lICh5ZXQpLlxuIiwgcHJvcCk7Ci0JCQlyZXR1cm4gMTsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBDb252ZXJ0IHRoZSBuZXcgcHJvcGVydHkKLQkJCSAqLwotCQkJdnAgPSBkYXRhOwotCQkJaWYgKCpuZXd2YWwgPT0gJzwnKSB7Ci0JCQkJLyoKLQkJCQkgKiBCaWdnZXIgdmFsdWVzIHRoYW4gYnl0ZXMuCi0JCQkJICovCi0JCQkJbGVuID0gMDsKLQkJCQluZXd2YWwrKzsKLQkJCQl3aGlsZSAoKCpuZXd2YWwgIT0gJz4nKSAmJiAoKm5ld3ZhbCAhPSAnXDAnKSkgewotCQkJCQljcCA9IG5ld3ZhbDsKLQkJCQkJdG1wID0gc2ltcGxlX3N0cnRvdWwoY3AsICZuZXd2YWwsIDE2KTsKLQkJCQkJaWYgKChuZXd2YWwgLSBjcCkgPD0gMikgewotCQkJCQkJKnZwID0gdG1wICYgMHhGRjsKLQkJCQkJCXZwICArPSAxOwotCQkJCQkJbGVuICs9IDE7Ci0JCQkJCX0gZWxzZSBpZiAoKG5ld3ZhbCAtIGNwKSA8PSA0KSB7Ci0JCQkJCQkqKHVpbnQxNl90ICopdnAgPSBfX2NwdV90b19iZTE2KHRtcCk7Ci0JCQkJCQl2cCAgKz0gMjsKLQkJCQkJCWxlbiArPSAyOwotCQkJCQl9IGVsc2UgaWYgKChuZXd2YWwgLSBjcCkgPD0gOCkgewotCQkJCQkJKih1aW50MzJfdCAqKXZwID0gX19jcHVfdG9fYmUzMih0bXApOwotCQkJCQkJdnAgICs9IDQ7Ci0JCQkJCQlsZW4gKz0gNDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXByaW50ZigiU29ycnksIEkgY291bGQgbm90IGNvbnZlcnQgXCIlc1wiXG4iLCBjcCk7Ci0JCQkJCQlyZXR1cm4gMTsKLQkJCQkJfQotCQkJCQl3aGlsZSAoKm5ld3ZhbCA9PSAnICcpCi0JCQkJCQluZXd2YWwrKzsKLQkJCQl9Ci0JCQkJaWYgKCpuZXd2YWwgIT0gJz4nKSB7Ci0JCQkJCXByaW50ZigiVW5leHBlY3RlZCBjaGFyYWN0ZXIgJyVjJ1xuIiwgKm5ld3ZhbCk7Ci0JCQkJCXJldHVybiAxOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoKm5ld3ZhbCA9PSAnWycpIHsKLQkJCQkvKgotCQkJCSAqIEJ5dGUgc3RyZWFtLiAgQ29udmVydCB0aGUgdmFsdWVzLgotCQkJCSAqLwotCQkJCWxlbiA9IDA7Ci0JCQkJbmV3dmFsKys7Ci0JCQkJd2hpbGUgKCgqbmV3dmFsICE9ICddJykgJiYgKCpuZXd2YWwgIT0gJ1wwJykpIHsKLQkJCQkJdG1wID0gc2ltcGxlX3N0cnRvdWwobmV3dmFsLCAmbmV3dmFsLCAxNik7Ci0JCQkJCSp2cCsrID0gdG1wICYgMHhGRjsKLQkJCQkJbGVuKys7Ci0JCQkJCXdoaWxlICgqbmV3dmFsID09ICcgJykKLQkJCQkJCW5ld3ZhbCsrOwotCQkJCX0KLQkJCQlpZiAoKm5ld3ZhbCAhPSAnXScpIHsKLQkJCQkJcHJpbnRmKCJVbmV4cGVjdGVkIGNoYXJhY3RlciAnJWMnXG4iLCAqbmV3dmFsKTsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvKgotCQkJCSAqIEFzc3VtZSBpdCBpcyBhIHN0cmluZy4gIENvcHkgaXQgaW50byBvdXIgZGF0YSBhcmVhIGZvcgotCQkJCSAqIGNvbnZlbmllbmNlIChpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nICdcMCcpLgotCQkJCSAqLwotCQkJCWxlbiA9IHN0cmxlbihuZXd2YWwpICsgMTsKLQkJCQlzdHJjcHkoZGF0YSwgbmV3dmFsKTsKLQkJCX0KKwkJcmV0ID0gZmR0X3BhcnNlX3Byb3AocGF0aHAsIHByb3AsIG5ld3ZhbCwgZGF0YSwgJmxlbik7CisJCWlmIChyZXQgIT0gMCkKKwkJCXJldHVybiByZXQ7CiAKLQkJCXJldCA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgcHJvcCwgZGF0YSwgbGVuKTsKLQkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJcHJpbnRmICgibGliZmR0ICVzXG4iLCBmZHRfc3RyZXJyb3IocmV0KSk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9CisJCXJldCA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgcHJvcCwgZGF0YSwgbGVuKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByaW50ZiAoImxpYmZkdCBmZHRfc2V0cHJvcCgpOiAlc1xuIiwgZmR0X3N0cmVycm9yKHJldCkpOworCQkJcmV0dXJuIDE7CiAJCX0KIAogCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCSAqIFByaW50IChyZWN1cnNpdmUpIC8gTGlzdCAoc2luZ2xlIGxldmVsKQogCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQl9IGVsc2UgaWYgKChvcCA9PSAncCcpIHx8IChvcCA9PSAnbCcpKSB7Ci0JCS8qCi0JCSAqIFJlY3Vyc2l2ZWx5IHByaW50IChhIHBvcnRpb24gb2YpIHRoZSBmZHQuCi0JCSAqLwotCQlzdGF0aWMgaW50IG9mZnN0YWNrW01BWF9MRVZFTF07Ci0JCXN0YXRpYyBjaGFyIHRhYnNbTUFYX0xFVkVMKzFdID0gIlx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQiOworCX0gZWxzZSBpZiAoKGFyZ3ZbMV1bMF0gPT0gJ3AnKSB8fCAoYXJndlsxXVswXSA9PSAnbCcpKSB7CiAJCWludCBkZXB0aCA9IE1BWF9MRVZFTDsJLyogaG93IGRlZXAgdG8gcHJpbnQgKi8KIAkJY2hhciAqcGF0aHA7CQkvKiBwYXRoICovCi0JCWNoYXIgKnByb3A7CQkJLyogcHJvcGVydHkgKi8KLQkJdm9pZCAqbm9kZXA7CQkvKiBwcm9wZXJ0eSBub2RlIHBvaW50ZXIgKi8KLQkJaW50ICBub2Rlb2Zmc2V0OwkvKiBub2RlIG9mZnNldCBmcm9tIGxpYmZkdCAqLwotCQlpbnQgIG5leHRvZmZzZXQ7CS8qIG5leHQgbm9kZSBvZmZzZXQgZnJvbSBsaWJmZHQgKi8KLQkJdWludDMyX3QgdGFnOwkJLyogdGFnICovCi0JCWludCAgbGVuOwkJCS8qIGxlbmd0aCBvZiB0aGUgcHJvcGVydHkgKi8KLQkJaW50ICBsZXZlbCA9IDA7CQkvKiBrZWVwIHRyYWNrIG9mIG5lc3RpbmcgbGV2ZWwgKi8KKwkJY2hhciAqcHJvcDsJCS8qIHByb3BlcnR5ICovCisJCWludCAgcmV0OwkJLyogcmV0dXJuIHZhbHVlICovCiAKIAkJLyoKIAkJICogbGlzdCBpcyBhbiBhbGlhcyBmb3IgcHJpbnQsIGJ1dCBsaW1pdGVkIHRvIDEgbGV2ZWwKIAkJICovCi0JCWlmIChvcCA9PSAnbCcpIHsKKwkJaWYgKGFyZ3ZbMV1bMF0gPT0gJ2wnKSB7CiAJCQlkZXB0aCA9IDE7CiAJCX0KIApAQCAtMzAyLDk5ICsyNTAsMTQgQEAKIAkJZWxzZQogCQkJcHJvcCA9IE5VTEw7CiAKLQkJaWYgKHN0cmNtcChwYXRocCwgIi8iKSA9PSAwKSB7Ci0JCQlub2Rlb2Zmc2V0ID0gMDsKLQkJCXByaW50ZigiLyIpOwotCQl9IGVsc2UgewotCQkJbm9kZW9mZnNldCA9IGZkdF9wYXRoX29mZnNldCAoZmR0LCBwYXRocCk7Ci0JCQlpZiAobm9kZW9mZnNldCA8IDApIHsKLQkJCQkvKgotCQkJCSAqIE5vdCBmb3VuZCBvciBzb21ldGhpbmcgZWxzZSBiYWQgaGFwcGVuZWQuCi0JCQkJICovCi0JCQkJcHJpbnRmICgibGliZmR0ICVzXG4iLCBmZHRfc3RyZXJyb3Iobm9kZW9mZnNldCkpOwotCQkJCXJldHVybiAxOwotCQkJfQotCQl9Ci0JCS8qCi0JCSAqIFRoZSB1c2VyIHBhc3NlZCBpbiBhIHByb3BlcnR5IGFzIHdlbGwgYXMgbm9kZSBwYXRoLiAgUHJpbnQgb25seQotCQkgKiB0aGUgZ2l2ZW4gcHJvcGVydHkgYW5kIHRoZW4gcmV0dXJuLgotCQkgKi8KLQkJaWYgKHByb3ApIHsKLQkJCW5vZGVwID0gZmR0X2dldHByb3AgKGZkdCwgbm9kZW9mZnNldCwgcHJvcCwgJmxlbik7Ci0JCQlpZiAobGVuID09IDApIHsKLQkJCQlwcmludGYoIiVzICVzXG4iLCBwYXRocCwgcHJvcCk7CS8qIG5vIHByb3BlcnR5IHZhbHVlICovCi0JCQkJcmV0dXJuIDA7Ci0JCQl9IGVsc2UgaWYgKGxlbiA+IDApIHsKLQkJCQlwcmludGYoIiVzPSIsIHByb3ApOwotCQkJCXByaW50X2RhdGEgKG5vZGVwLCBsZW4pOwotCQkJCXByaW50ZigiXG4iKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJpbnRmICgibGliZmR0ICVzXG4iLCBmZHRfc3RyZXJyb3IobGVuKSk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBUaGUgdXNlciBwYXNzZWQgaW4gYSBub2RlIHBhdGggYW5kIG5vIHByb3BlcnR5LCBwcmludCB0aGUgbm9kZQotCQkgKiBhbmQgYWxsIHN1Ym5vZGVzLgotCQkgKi8KLQkJb2Zmc3RhY2tbMF0gPSBub2Rlb2Zmc2V0OwotCi0JCXdoaWxlKGxldmVsID49IDApIHsKLQkJCXRhZyA9IGZkdF9uZXh0X3RhZyhmZHQsIG5vZGVvZmZzZXQsICZuZXh0b2Zmc2V0LCAmcGF0aHApOwotCQkJc3dpdGNoKHRhZykgewotCQkJY2FzZSBGRFRfQkVHSU5fTk9ERToKLQkJCQlpZihsZXZlbCA8PSBkZXB0aCkKLQkJCQkJcHJpbnRmKCIlcyVzIHtcbiIsICZ0YWJzW01BWF9MRVZFTCAtIGxldmVsXSwgcGF0aHApOwotCQkJCWxldmVsKys7Ci0JCQkJb2Zmc3RhY2tbbGV2ZWxdID0gbm9kZW9mZnNldDsKLQkJCQlpZiAobGV2ZWwgPj0gTUFYX0xFVkVMKSB7Ci0JCQkJCXByaW50ZigiQWFhaWlpIDxzcGxhdD4gbmVzdGVkIHRvbyBkZWVwLlxuIik7Ci0JCQkJCXJldHVybiAxOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRkRUX0VORF9OT0RFOgotCQkJCWxldmVsLS07Ci0JCQkJaWYobGV2ZWwgPD0gZGVwdGgpCi0JCQkJCXByaW50ZigiJXN9O1xuIiwgJnRhYnNbTUFYX0xFVkVMIC0gbGV2ZWxdKTsKLQkJCQlpZiAobGV2ZWwgPT0gMCkgewotCQkJCQlsZXZlbCA9IC0xOwkJLyogZXhpdCB0aGUgbG9vcCAqLwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRkRUX1BST1A6Ci0JCQkJbm9kZXAgPSBmZHRfZ2V0cHJvcCAoZmR0LCBvZmZzdGFja1tsZXZlbF0sIHBhdGhwLCAmbGVuKTsKLQkJCQlpZiAobGVuIDwgMCkgewotCQkJCQlwcmludGYgKCJsaWJmZHQgJXNcbiIsIGZkdF9zdHJlcnJvcihsZW4pKTsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfSBlbHNlIGlmIChsZW4gPT0gMCkgewotCQkJCQkvKiB0aGUgcHJvcGVydHkgaGFzIG5vIHZhbHVlICovCi0JCQkJCWlmKGxldmVsIDw9IGRlcHRoKQotCQkJCQkJcHJpbnRmKCIlcyVzO1xuIiwgJnRhYnNbTUFYX0xFVkVMIC0gbGV2ZWxdLCBwYXRocCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYobGV2ZWwgPD0gZGVwdGgpIHsKLQkJCQkJCXByaW50ZigiJXMlcz0iLCAmdGFic1tNQVhfTEVWRUwgLSBsZXZlbF0sIHBhdGhwKTsKLQkJCQkJCXByaW50X2RhdGEgKG5vZGVwLCBsZW4pOwotCQkJCQkJcHJpbnRmKCI7XG4iKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRkRUX05PUDoKLQkJCQlicmVhazsKLQkJCWNhc2UgRkRUX0VORDoKLQkJCQlyZXR1cm4gMTsKLQkJCWRlZmF1bHQ6Ci0JCQkJaWYobGV2ZWwgPD0gZGVwdGgpCi0JCQkJCXByaW50ZigiVW5rbm93biB0YWcgMHglMDhYXG4iLCB0YWcpOwotCQkJCXJldHVybiAxOwotCQkJfQotCQkJbm9kZW9mZnNldCA9IG5leHRvZmZzZXQ7Ci0JCX0KKwkJcmV0ID0gZmR0X3ByaW50KHBhdGhwLCBwcm9wLCBkZXB0aCk7CisJCWlmIChyZXQgIT0gMCkKKwkJCXJldHVybiByZXQ7CiAKIAkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAkgKiBSZW1vdmUgYSBwcm9wZXJ0eS9ub2RlCiAJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCX0gZWxzZSBpZiAob3AgPT0gJ3InKSB7CisJfSBlbHNlIGlmIChhcmd2WzFdWzBdID09ICdyJykgewogCQlpbnQgIG5vZGVvZmZzZXQ7CS8qIG5vZGUgb2Zmc2V0IGZyb20gbGliZmR0ICovCiAJCWludCAgZXJyOwogCkBAIC00MDIsMTcgKzI2NSwxNCBAQAogCQkgKiBHZXQgdGhlIHBhdGguICBUaGUgcm9vdCBub2RlIGlzIGFuIG9kZGJhbGwsIHRoZSBvZmZzZXQKIAkJICogaXMgemVybyBhbmQgaGFzIG5vIG5hbWUuCiAJCSAqLwotCQlpZiAoc3RyY21wKGFyZ3ZbMl0sICIvIikgPT0gMCkgewotCQkJbm9kZW9mZnNldCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlub2Rlb2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0IChmZHQsIGFyZ3ZbMl0pOwotCQkJaWYgKG5vZGVvZmZzZXQgPCAwKSB7Ci0JCQkJLyoKLQkJCQkgKiBOb3QgZm91bmQgb3Igc29tZXRoaW5nIGVsc2UgYmFkIGhhcHBlbmVkLgotCQkJCSAqLwotCQkJCXByaW50ZiAoImxpYmZkdCAlc1xuIiwgZmR0X3N0cmVycm9yKG5vZGVvZmZzZXQpKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KKwkJbm9kZW9mZnNldCA9IGZkdF9maW5kX25vZGVfYnlfcGF0aCAoZmR0LCBhcmd2WzJdKTsKKwkJaWYgKG5vZGVvZmZzZXQgPCAwKSB7CisJCQkvKgorCQkJICogTm90IGZvdW5kIG9yIHNvbWV0aGluZyBlbHNlIGJhZCBoYXBwZW5lZC4KKwkJCSAqLworCQkJcHJpbnRmICgibGliZmR0IGZkdF9maW5kX25vZGVfYnlfcGF0aCgpIHJldHVybmVkICVzXG4iLAorCQkJCWZkdF9zdHJlcnJvcihub2Rlb2Zmc2V0KSk7CisJCQlyZXR1cm4gMTsKIAkJfQogCQkvKgogCQkgKiBEbyB0aGUgZGVsZXRlLiAgQSBmb3VydGggcGFyYW1ldGVyIG1lYW5zIGRlbGV0ZSBhIHByb3BlcnR5LApAQCAtNDIxLDM5ICsyODEsNDAgQEAKIAkJaWYgKGFyZ2MgPiAzKSB7CiAJCQllcnIgPSBmZHRfZGVscHJvcChmZHQsIG5vZGVvZmZzZXQsIGFyZ3ZbM10pOwogCQkJaWYgKGVyciA8IDApIHsKLQkJCQlwcmludGYoImZkdF9kZWxwcm9wIGxpYmZkdDogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKKwkJCQlwcmludGYoImxpYmZkdCBmZHRfZGVscHJvcCgpOiAgJXNcbiIsCisJCQkJCWZkdF9zdHJlcnJvcihlcnIpKTsKIAkJCQlyZXR1cm4gZXJyOwogCQkJfQogCQl9IGVsc2UgewogCQkJZXJyID0gZmR0X2RlbF9ub2RlKGZkdCwgbm9kZW9mZnNldCk7CiAJCQlpZiAoZXJyIDwgMCkgewotCQkJCXByaW50ZigiZmR0X2RlbF9ub2RlIGxpYmZkdDogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKKwkJCQlwcmludGYoImxpYmZkdCBmZHRfZGVsX25vZGUoKTogICVzXG4iLAorCQkJCQlmZHRfc3RyZXJyb3IoZXJyKSk7CiAJCQkJcmV0dXJuIGVycjsKIAkJCX0KIAkJfQotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogQ3JlYXRlIGEgY2hvc2VuIG5vZGUKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JfSBlbHNlIGlmIChvcCA9PSAnYycpIHsKKwl9CisjaWZkZWYgQ09ORklHX09GX0JPQVJEX1NFVFVQCisJLyogQ2FsbCB0aGUgYm9hcmQtc3BlY2lmaWMgZml4dXAgcm91dGluZSAqLworCWVsc2UgaWYgKGFyZ3ZbMV1bMF0gPT0gJ2InKQorCQlmdF9ib2FyZF9zZXR1cChmZHQsIGdkLT5iZCk7CisjZW5kaWYKKwkvKiBDcmVhdGUgYSBjaG9zZW4gbm9kZSAqLworCWVsc2UgaWYgKGFyZ3ZbMV1bMF0gPT0gJ2MnKQogCQlmZHRfY2hvc2VuKGZkdCwgMCwgMCwgMSk7CiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiBDcmVhdGUgYSB1LWJvb3QtZW52IG5vZGUKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JfSBlbHNlIGlmIChvcCA9PSAnZScpIHsKKyNpZmRlZiBDT05GSUdfT0ZfSEFTX1VCT09UX0VOVgorCS8qIENyZWF0ZSBhIHUtYm9vdC1lbnYgbm9kZSAqLworCWVsc2UgaWYgKGFyZ3ZbMV1bMF0gPT0gJ2UnKQogCQlmZHRfZW52KGZkdCk7Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiBDcmVhdGUgYSBiZF90IG5vZGUKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JfSBlbHNlIGlmIChvcCA9PSAnYicpIHsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19PRl9IQVNfQkRfVAorCS8qIENyZWF0ZSBhIGJkX3Qgbm9kZSAqLworCWVsc2UgaWYgKGFyZ3ZbMV1bMF0gPT0gJ2InKQogCQlmZHRfYmRfdChmZHQpOwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogVW5yZWNvZ25pemVkIGNvbW1hbmQKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JfSBlbHNlIHsKKyNlbmRpZgorCWVsc2UgeworCQkvKiBVbnJlY29nbml6ZWQgY29tbWFuZCAqLwogCQlwcmludGYgKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOwogCQlyZXR1cm4gMTsKIAl9CkBAIC00NjEsNyArMzIyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBpbnQgZmR0X3ZhbGlkKHZvaWQpCiB7CkBAIC00NzcsMTkgKzMzOCwyMSBAQAogCQlyZXR1cm4gMTsJLyogdmFsaWQgKi8KIAogCWlmIChlcnIgPCAwKSB7Ci0JCXByaW50ZigibGliZmR0OiAlcyIsIGZkdF9zdHJlcnJvcihlcnIpKTsKKwkJcHJpbnRmKCJsaWJmZHQgZmR0X2NoZWNrX2hlYWRlcigpOiAlcyIsIGZkdF9zdHJlcnJvcihlcnIpKTsKIAkJLyoKIAkJICogQmUgbW9yZSBpbmZvcm1hdGl2ZSBvbiBiYWQgdmVyc2lvbi4KIAkJICovCiAJCWlmIChlcnIgPT0gLUZEVF9FUlJfQkFEVkVSU0lPTikgewogCQkJaWYgKGZkdF92ZXJzaW9uKGZkdCkgPCBGRFRfRklSU1RfU1VQUE9SVEVEX1ZFUlNJT04pIHsKIAkJCQlwcmludGYgKCIgLSB0b28gb2xkLCBmZHQgJGQgPCAlZCIsCi0JCQkJCWZkdF92ZXJzaW9uKGZkdCksIEZEVF9GSVJTVF9TVVBQT1JURURfVkVSU0lPTik7CisJCQkJCWZkdF92ZXJzaW9uKGZkdCksCisJCQkJCUZEVF9GSVJTVF9TVVBQT1JURURfVkVSU0lPTik7CiAJCQkJZmR0ID0gTlVMTDsKIAkJCX0KIAkJCWlmIChmZHRfbGFzdF9jb21wX3ZlcnNpb24oZmR0KSA+IEZEVF9MQVNUX1NVUFBPUlRFRF9WRVJTSU9OKSB7CiAJCQkJcHJpbnRmICgiIC0gdG9vIG5ldywgZmR0ICRkID4gJWQiLAotCQkJCQlmZHRfdmVyc2lvbihmZHQpLCBGRFRfTEFTVF9TVVBQT1JURURfVkVSU0lPTik7CisJCQkJCWZkdF92ZXJzaW9uKGZkdCksCisJCQkJCUZEVF9MQVNUX1NVUFBPUlRFRF9WRVJTSU9OKTsKIAkJCQlmZHQgPSBOVUxMOwogCQkJfQogCQkJcmV0dXJuIDA7CkBAIC01MDAsMTMgKzM2Myw5MSBAQAogCXJldHVybiAxOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIE9GIGZsYXQgdHJlZSBoYW5kbGluZwotICogV3JpdHRlbiBieTogUGFudGVsaXMgQW50b25pb3UgPHBhbnRlbGlzLmFudG9uaW91QGdtYWlsLmNvbT4KLSAqIFVwZGF0ZWQgYnk6IE1hdHRoZXcgTWNDbGludG9jayA8bXNtQGZyZWVzY2FsZS5jb20+Ci0gKiBDb252ZXJ0ZWQgdG8gbGliZmR0IGJ5OiBHZXJhbGQgVmFuIEJhcmVuIDx2YW5iYXJlbkBjaWRlYXMuY29tPgorICogUGFyc2UgdGhlIHVzZXIncyBpbnB1dCwgcGFydGlhbGx5IGhldXJpc3RpYy4gIFZhbGlkIGZvcm1hdHM6CisgKiA8MDA+CQktIGhleCBieXRlCisgKiA8MDAxMT4JLSBoZXggaGFsZiB3b3JkICgxNiBiaXRzKQorICogPDAwMTEyMjMzPgktIGhleCB3b3JkICgzMiBiaXRzKQorICoJCS0gaGV4IGRvdWJsZSB3b3JkcyAoNjQgYml0cykgYXJlIG5vdCBzdXBwb3J0ZWQsIG11c3QgdXNlCisgKgkJCWEgYnl0ZSBzdHJlYW0gaW5zdGVhZC4KKyAqIFswMCAxMSAyMiAuLiBubl0gLSBieXRlIHN0cmVhbQorICogInN0cmluZyIJLSBJZiB0aGUgdGhlIHZhbHVlIGRvZXNuJ3Qgc3RhcnQgd2l0aCAiPCIgb3IgIlsiLCBpdCBpcworICoJCQl0cmVhdGVkIGFzIGEgc3RyaW5nLiAgTm90ZSB0aGF0IHRoZSBxdW90ZXMgYXJlCisgKgkJCXN0cmlwcGVkIGJ5IHRoZSBwYXJzZXIgYmVmb3JlIHdlIGdldCB0aGUgc3RyaW5nLgorICovCitzdGF0aWMgaW50IGZkdF9wYXJzZV9wcm9wKGNoYXIgKnBhdGhwLCBjaGFyICpwcm9wLCBjaGFyICpuZXd2YWwsCisJY2hhciAqZGF0YSwgaW50ICpsZW4pCit7CisJY2hhciAqY3A7CQkvKiB0ZW1wb3JhcnkgY2hhciBwb2ludGVyICovCisJdW5zaWduZWQgbG9uZyB0bXA7CS8qIGhvbGRzIGNvbnZlcnRlZCB2YWx1ZXMgKi8KKworCWlmICgqbmV3dmFsID09ICc8JykgeworCQkvKgorCQkgKiBCaWdnZXIgdmFsdWVzIHRoYW4gYnl0ZXMuCisJCSAqLworCQkqbGVuID0gMDsKKwkJbmV3dmFsKys7CisJCXdoaWxlICgoKm5ld3ZhbCAhPSAnPicpICYmICgqbmV3dmFsICE9ICdcMCcpKSB7CisJCQljcCA9IG5ld3ZhbDsKKwkJCXRtcCA9IHNpbXBsZV9zdHJ0b3VsKGNwLCAmbmV3dmFsLCAxNik7CisJCQlpZiAoKG5ld3ZhbCAtIGNwKSA8PSAyKSB7CisJCQkJKmRhdGEgPSB0bXAgJiAweEZGOworCQkJCWRhdGEgICs9IDE7CisJCQkJKmxlbiArPSAxOworCQkJfSBlbHNlIGlmICgobmV3dmFsIC0gY3ApIDw9IDQpIHsKKwkJCQkqKHVpbnQxNl90ICopZGF0YSA9IF9fY3B1X3RvX2JlMTYodG1wKTsKKwkJCQlkYXRhICArPSAyOworCQkJCSpsZW4gKz0gMjsKKwkJCX0gZWxzZSBpZiAoKG5ld3ZhbCAtIGNwKSA8PSA4KSB7CisJCQkJKih1aW50MzJfdCAqKWRhdGEgPSBfX2NwdV90b19iZTMyKHRtcCk7CisJCQkJZGF0YSAgKz0gNDsKKwkJCQkqbGVuICs9IDQ7CisJCQl9IGVsc2UgeworCQkJCXByaW50ZigiU29ycnksIEkgY291bGQgbm90IGNvbnZlcnQgXCIlc1wiXG4iLAorCQkJCQljcCk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQl3aGlsZSAoKm5ld3ZhbCA9PSAnICcpCisJCQkJbmV3dmFsKys7CisJCX0KKwkJaWYgKCpuZXd2YWwgIT0gJz4nKSB7CisJCQlwcmludGYoIlVuZXhwZWN0ZWQgY2hhcmFjdGVyICclYydcbiIsICpuZXd2YWwpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9IGVsc2UgaWYgKCpuZXd2YWwgPT0gJ1snKSB7CisJCS8qCisJCSAqIEJ5dGUgc3RyZWFtLiAgQ29udmVydCB0aGUgdmFsdWVzLgorCQkgKi8KKwkJKmxlbiA9IDA7CisJCW5ld3ZhbCsrOworCQl3aGlsZSAoKCpuZXd2YWwgIT0gJ10nKSAmJiAoKm5ld3ZhbCAhPSAnXDAnKSkgeworCQkJdG1wID0gc2ltcGxlX3N0cnRvdWwobmV3dmFsLCAmbmV3dmFsLCAxNik7CisJCQkqZGF0YSsrID0gdG1wICYgMHhGRjsKKwkJCSpsZW4gICAgPSAqbGVuICsgMTsKKwkJCXdoaWxlICgqbmV3dmFsID09ICcgJykKKwkJCQluZXd2YWwrKzsKKwkJfQorCQlpZiAoKm5ld3ZhbCAhPSAnXScpIHsKKwkJCXByaW50ZigiVW5leHBlY3RlZCBjaGFyYWN0ZXIgJyVjJ1xuIiwgKm5ld3ZhbCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIEFzc3VtZSBpdCBpcyBhIHN0cmluZy4gIENvcHkgaXQgaW50byBvdXIgZGF0YSBhcmVhIGZvcgorCQkgKiBjb252ZW5pZW5jZSAoaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyAnXDAnKS4KKwkJICovCisJCSpsZW4gPSBzdHJsZW4obmV3dmFsKSArIDE7CisJCXN0cmNweShkYXRhLCBuZXd2YWwpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBIZXVyaXN0aWMgdG8gZ3Vlc3MgaWYgdGhpcyBpcyBhIHN0cmluZyBvciBjb25jYXRlbmF0ZWQgc3RyaW5ncy4KICAqLwogCiBzdGF0aWMgaW50IGlzX3ByaW50YWJsZV9zdHJpbmcoY29uc3Qgdm9pZCAqZGF0YSwgaW50IGxlbikKQEAgLTU0Niw2ICs0ODcsMTIgQEAKIAlyZXR1cm4gMTsKIH0KIAorCisvKgorICogUHJpbnQgdGhlIHByb3BlcnR5IGluIHRoZSBiZXN0IGZvcm1hdCwgYSBoZXVyaXN0aWMgZ3Vlc3MuICBQcmludCBhcworICogYSBzdHJpbmcsIGNvbmNhdGVuYXRlZCBzdHJpbmdzLCBhIGJ5dGUsIHdvcmQsIGRvdWJsZSB3b3JkLCBvciAoaWYgYWxsCisgKiBlbHNlIGZhaWxzKSBpdCBpcyBwcmludGVkIGFzIGEgc3RyZWFtIG9mIGJ5dGVzLgorICovCiBzdGF0aWMgdm9pZCBwcmludF9kYXRhKGNvbnN0IHZvaWQgKmRhdGEsIGludCBsZW4pCiB7CiAJaW50IGo7CkBAIC02MDEsMzIgKzU0OCwxNDYgQEAKIAl9CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogUmVjdXJzaXZlbHkgcHJpbnQgKGEgcG9ydGlvbiBvZikgdGhlIGZkdC4gIFRoZSBkZXB0aCBwYXJhbWV0ZXIKKyAqIGRldGVybWluZXMgaG93IGRlZXBseSBuZXN0ZWQgdGhlIGZkdCBpcyBwcmludGVkLgorICovCitzdGF0aWMgaW50IGZkdF9wcmludChjaGFyICpwYXRocCwgY2hhciAqcHJvcCwgaW50IGRlcHRoKQoreworCXN0YXRpYyBpbnQgb2Zmc3RhY2tbTUFYX0xFVkVMXTsKKwlzdGF0aWMgY2hhciB0YWJzW01BWF9MRVZFTCsxXSA9CisJCSJcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCIKKwkJIlx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0IjsKKwl2b2lkICpub2RlcDsJCS8qIHByb3BlcnR5IG5vZGUgcG9pbnRlciAqLworCWludCAgbm9kZW9mZnNldDsJLyogbm9kZSBvZmZzZXQgZnJvbSBsaWJmZHQgKi8KKwlpbnQgIG5leHRvZmZzZXQ7CS8qIG5leHQgbm9kZSBvZmZzZXQgZnJvbSBsaWJmZHQgKi8KKwl1aW50MzJfdCB0YWc7CQkvKiB0YWcgKi8KKwlpbnQgIGxlbjsJCS8qIGxlbmd0aCBvZiB0aGUgcHJvcGVydHkgKi8KKwlpbnQgIGxldmVsID0gMDsJCS8qIGtlZXAgdHJhY2sgb2YgbmVzdGluZyBsZXZlbCAqLworCisJbm9kZW9mZnNldCA9IGZkdF9maW5kX25vZGVfYnlfcGF0aCAoZmR0LCBwYXRocCk7CisJaWYgKG5vZGVvZmZzZXQgPCAwKSB7CisJCS8qCisJCSAqIE5vdCBmb3VuZCBvciBzb21ldGhpbmcgZWxzZSBiYWQgaGFwcGVuZWQuCisJCSAqLworCQlwcmludGYgKCJsaWJmZHQgZmR0X2ZpbmRfbm9kZV9ieV9wYXRoKCkgcmV0dXJuZWQgJXNcbiIsCisJCQlmZHRfc3RyZXJyb3Iobm9kZW9mZnNldCkpOworCQlyZXR1cm4gMTsKKwl9CisJLyoKKwkgKiBUaGUgdXNlciBwYXNzZWQgaW4gYSBwcm9wZXJ0eSBhcyB3ZWxsIGFzIG5vZGUgcGF0aC4KKwkgKiBQcmludCBvbmx5IHRoZSBnaXZlbiBwcm9wZXJ0eSBhbmQgdGhlbiByZXR1cm4uCisJICovCisJaWYgKHByb3ApIHsKKwkJbm9kZXAgPSBmZHRfZ2V0cHJvcCAoZmR0LCBub2Rlb2Zmc2V0LCBwcm9wLCAmbGVuKTsKKwkJaWYgKGxlbiA9PSAwKSB7CisJCQkvKiBubyBwcm9wZXJ0eSB2YWx1ZSAqLworCQkJcHJpbnRmKCIlcyAlc1xuIiwgcGF0aHAsIHByb3ApOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAobGVuID4gMCkgeworCQkJcHJpbnRmKCIlcz0iLCBwcm9wKTsKKwkJCXByaW50X2RhdGEgKG5vZGVwLCBsZW4pOworCQkJcHJpbnRmKCJcbiIpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlwcmludGYgKCJsaWJmZHQgZmR0X2dldHByb3AoKTogJXNcbiIsCisJCQkJZmR0X3N0cmVycm9yKGxlbikpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwkvKgorCSAqIFRoZSB1c2VyIHBhc3NlZCBpbiBhIG5vZGUgcGF0aCBhbmQgbm8gcHJvcGVydHksCisJICogcHJpbnQgdGhlIG5vZGUgYW5kIGFsbCBzdWJub2Rlcy4KKwkgKi8KKwlvZmZzdGFja1swXSA9IG5vZGVvZmZzZXQ7CisKKwl3aGlsZShsZXZlbCA+PSAwKSB7CisJCXRhZyA9IGZkdF9uZXh0X3RhZyhmZHQsIG5vZGVvZmZzZXQsICZuZXh0b2Zmc2V0LCAmcGF0aHApOworCQlzd2l0Y2godGFnKSB7CisJCWNhc2UgRkRUX0JFR0lOX05PREU6CisJCQlpZihsZXZlbCA8PSBkZXB0aCkKKwkJCQlwcmludGYoIiVzJXMge1xuIiwKKwkJCQkJJnRhYnNbTUFYX0xFVkVMIC0gbGV2ZWxdLCBwYXRocCk7CisJCQlsZXZlbCsrOworCQkJb2Zmc3RhY2tbbGV2ZWxdID0gbm9kZW9mZnNldDsKKwkJCWlmIChsZXZlbCA+PSBNQVhfTEVWRUwpIHsKKwkJCQlwcmludGYoIkFhYWlpaSA8c3BsYXQ+IG5lc3RlZCB0b28gZGVlcC4gIgorCQkJCQkiQWJvcnRpbmcuXG4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEZEVF9FTkRfTk9ERToKKwkJCWxldmVsLS07CisJCQlpZihsZXZlbCA8PSBkZXB0aCkKKwkJCQlwcmludGYoIiVzfTtcbiIsICZ0YWJzW01BWF9MRVZFTCAtIGxldmVsXSk7CisJCQlpZiAobGV2ZWwgPT0gMCkgeworCQkJCWxldmVsID0gLTE7CQkvKiBleGl0IHRoZSBsb29wICovCisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBGRFRfUFJPUDoKKwkJCW5vZGVwID0gZmR0X2dldHByb3AgKGZkdCwgb2Zmc3RhY2tbbGV2ZWxdLCBwYXRocCwgJmxlbik7CisJCQlpZiAobGVuIDwgMCkgeworCQkJCXByaW50ZiAoImxpYmZkdCBmZHRfZ2V0cHJvcCgpOiAlc1xuIiwKKwkJCQkJZmR0X3N0cmVycm9yKGxlbikpOworCQkJCXJldHVybiAxOworCQkJfSBlbHNlIGlmIChsZW4gPT0gMCkgeworCQkJCS8qIHRoZSBwcm9wZXJ0eSBoYXMgbm8gdmFsdWUgKi8KKwkJCQlpZihsZXZlbCA8PSBkZXB0aCkKKwkJCQkJcHJpbnRmKCIlcyVzO1xuIiwKKwkJCQkJCSZ0YWJzW01BWF9MRVZFTCAtIGxldmVsXSwKKwkJCQkJCXBhdGhwKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYobGV2ZWwgPD0gZGVwdGgpIHsKKwkJCQkJcHJpbnRmKCIlcyVzPSIsCisJCQkJCQkmdGFic1tNQVhfTEVWRUwgLSBsZXZlbF0sCisJCQkJCQlwYXRocCk7CisJCQkJCXByaW50X2RhdGEgKG5vZGVwLCBsZW4pOworCQkJCQlwcmludGYoIjtcbiIpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEZEVF9OT1A6CisJCQlicmVhazsKKwkJY2FzZSBGRFRfRU5EOgorCQkJcmV0dXJuIDE7CisJCWRlZmF1bHQ6CisJCQlpZihsZXZlbCA8PSBkZXB0aCkKKwkJCQlwcmludGYoIlVua25vd24gdGFnIDB4JTA4WFxuIiwgdGFnKTsKKwkJCXJldHVybiAxOworCQl9CisJCW5vZGVvZmZzZXQgPSBuZXh0b2Zmc2V0OworCX0KKwlyZXR1cm4gMDsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBVX0JPT1RfQ01EKAogCWZkdCwJNSwJMCwJZG9fZmR0LAogCSJmZHQgICAgIC0gZmxhdHRlbmVkIGRldmljZSB0cmVlIHV0aWxpdHkgY29tbWFuZHNcbiIsCiAJICAgICJhZGRyICAgPGFkZHI+IFs8bGVuZ3RoPl0gICAgICAgIC0gU2V0IHRoZSBmZHQgbG9jYXRpb24gdG8gPGFkZHI+XG4iCisjaWZkZWYgQ09ORklHX09GX0JPQVJEX1NFVFVQCisJImZkdCBib2FyZHNldHVwICAgICAgICAgICAgICAgICAgICAgIC0gRG8gYm9hcmQtc3BlY2lmaWMgc2V0IHVwXG4iCisjZW5kaWYKIAkiZmR0IG1vdmUgICA8ZmR0PiA8bmV3YWRkcj4gPGxlbmd0aD4gLSBDb3B5IHRoZSBmZHQgdG8gPGFkZHI+XG4iCiAJImZkdCBwcmludCAgPHBhdGg+IFs8cHJvcD5dICAgICAgICAgIC0gUmVjdXJzaXZlIHByaW50IHN0YXJ0aW5nIGF0IDxwYXRoPlxuIgogCSJmZHQgbGlzdCAgIDxwYXRoPiBbPHByb3A+XSAgICAgICAgICAtIFByaW50IG9uZSBsZXZlbCBzdGFydGluZyBhdCA8cGF0aD5cbiIKIAkiZmR0IHNldCAgICA8cGF0aD4gPHByb3A+IFs8dmFsPl0gICAgLSBTZXQgPHByb3BlcnR5PiBbdG8gPHZhbD5dXG4iCiAJImZkdCBta25vZGUgPHBhdGg+IDxub2RlPiAgICAgICAgICAgIC0gQ3JlYXRlIGEgbmV3IG5vZGUgYWZ0ZXIgPHBhdGg+XG4iCiAJImZkdCBybSAgICAgPHBhdGg+IFs8cHJvcD5dICAgICAgICAgIC0gRGVsZXRlIHRoZSBub2RlIG9yIDxwcm9wZXJ0eT5cbiIKLQkiZmR0IGNob3NlbiAtIEFkZC91cGRhdGUgdGhlIFwiL2Nob3NlblwiIGJyYW5jaCBpbiB0aGUgdHJlZVxuIgorCSJmZHQgY2hvc2VuIC0gQWRkL3VwZGF0ZSB0aGUgL2Nob3NlbiBicmFuY2ggaW4gdGhlIHRyZWVcbiIKICNpZmRlZiBDT05GSUdfT0ZfSEFTX1VCT09UX0VOVgotCSJmZHQgZW52ICAgIC0gQWRkL3JlcGxhY2UgdGhlIFwiL3UtYm9vdC1lbnZcIiBicmFuY2ggaW4gdGhlIHRyZWVcbiIKKwkiZmR0IGVudiAgICAtIEFkZC9yZXBsYWNlIHRoZSAvdS1ib290LWVudiBicmFuY2ggaW4gdGhlIHRyZWVcbiIKICNlbmRpZgogI2lmZGVmIENPTkZJR19PRl9IQVNfQkRfVAotCSJmZHQgYmRfdCAgIC0gQWRkL3JlcGxhY2UgdGhlIFwiL2JkX3RcIiBicmFuY2ggaW4gdGhlIHRyZWVcbiIKKwkiZmR0IGJkX3QgICAtIEFkZC9yZXBsYWNlIHRoZSAvYmRfdCBicmFuY2ggaW4gdGhlIHRyZWVcbiIKICNlbmRpZgogCSJIaW50czpcbiIKLQkiICogU2V0IGEgbGFyZ2VyIGxlbmd0aCB3aXRoIHRoZSBmZHQgYWRkciBjb21tYW5kIHRvIGFkZCB0byB0aGUgYmxvYi5cbiIKLQkiICogSWYgdGhlIHByb3BlcnR5IHlvdSBhcmUgc2V0dGluZy9wcmludGluZyBoYXMgYSAnIycgY2hhcmFjdGVyLFxuIgotCSIgICAgIHlvdSBNVVNUIGVzY2FwZSBpdCB3aXRoIGEgXFwgY2hhcmFjdGVyIG9yIHF1b3RlIGl0IHdpdGggXCIgb3JcbiIKLQkiICAgICBpdCB3aWxsIGJlIGlnbm9yZWQgYXMgYSBjb21tZW50LlxuIgotCSIgKiBJZiB0aGUgdmFsdWUgaGFzIHNwYWNlcyBpbiBpdCwgeW91IE1VU1QgZXNjYXBlIHRoZSBzcGFjZXMgd2l0aFxuIgotCSIgICAgIFxcIGNoYXJhY3RlcnMgb3IgcXVvdGUgaXQgd2l0aCBcIlwiXG4iCisJIiBJZiB0aGUgcHJvcGVydHkgeW91IGFyZSBzZXR0aW5nL3ByaW50aW5nIGhhcyBhICcjJyBjaGFyYWN0ZXIgb3Igc3BhY2VzLFxuIgorCSIgICAgIHlvdSBNVVNUIGVzY2FwZSBpdCB3aXRoIGEgXFwgY2hhcmFjdGVyIG9yIHF1b3RlIGl0IHdpdGggXCIuXG4iCiAJIkV4YW1wbGVzOiBmZHQgcHJpbnQgLyAgICAgICAgICAgICAgICMgcHJpbnQgdGhlIHdob2xlIHRyZWVcbiIKIAkiICAgICAgICAgIGZkdCBwcmludCAvY3B1cyBcIiNhZGRyZXNzLWNlbGxzXCJcbiIKIAkiICAgICAgICAgIGZkdCBzZXQgICAvY3B1cyBcIiNhZGRyZXNzLWNlbGxzXCIgXCJbMDAgMDAgMDAgMDFdXCJcbiIKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfZmxhc2guYyBiL2NvbW1vbi9jbWRfZmxhc2guYwppbmRleCBjYjFjNWJiLi4xMWM4ODU3IDEwMDY0NAotLS0gYS9jb21tb24vY21kX2ZsYXNoLmMKKysrIGIvY29tbW9uL2NtZF9mbGFzaC5jCkBAIC0zMSw5ICszMSw5IEBACiAjaW5jbHVkZSA8ZGF0YWZsYXNoLmg+CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZMQVNIKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9GTEFTSCkKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9DTURMSU5FKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfQ01ETElORSkKICNpbmNsdWRlIDxqZmZzMi9qZmZzMi5oPgogCiAvKiBwYXJpdGlvbiBoYW5kbGluZyByb3V0aW5lcyAqLwpAQCAtMzExLDcgKzMxMSw3IEBACiAJZmxhc2hfaW5mb190ICppbmZvOwogCXVsb25nIGJhbmssIGFkZHJfZmlyc3QsIGFkZHJfbGFzdDsKIAlpbnQgbiwgc2VjdF9maXJzdCwgc2VjdF9sYXN0OwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9DTURMSU5FKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfQ01ETElORSkKIAlzdHJ1Y3QgbXRkX2RldmljZSAqZGV2OwogCXN0cnVjdCBwYXJ0X2luZm8gKnBhcnQ7CiAJdTggZGV2X3R5cGUsIGRldl9udW0sIHBudW07CkBAIC0zNDMsNyArMzQzLDcgQEAKIAkJcmV0dXJuIHJjb2RlOwogCX0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9DTURMSU5FKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfQ01ETElORSkKIAkvKiBlcmFzZSA8cGFydC1pZD4gLSBlcmFzZSBwYXJ0aXRpb24gKi8KIAlpZiAoKGFyZ2MgPT0gMikgJiYgKGlkX3BhcnNlKGFyZ3ZbMV0sIE5VTEwsICZkZXZfdHlwZSwgJmRldl9udW0pID09IDApKSB7CiAJCW10ZHBhcnRzX2luaXQoKTsKQEAgLTQ0Nyw3ICs0NDcsNyBAQAogCWZsYXNoX2luZm9fdCAqaW5mbzsKIAl1bG9uZyBiYW5rLCBhZGRyX2ZpcnN0LCBhZGRyX2xhc3Q7CiAJaW50IGksIHAsIG4sIHNlY3RfZmlyc3QsIHNlY3RfbGFzdDsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfQ01ETElORSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0NNRExJTkUpCiAJc3RydWN0IG10ZF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgcGFydF9pbmZvICpwYXJ0OwogCXU4IGRldl90eXBlLCBkZXZfbnVtLCBwbnVtOwpAQCAtNTM5LDcgKzUzOSw3IEBACiAJCXJldHVybiByY29kZTsKIAl9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfQ01ETElORSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0NNRExJTkUpCiAJLyogcHJvdGVjdCBvbi9vZmYgPHBhcnQtaWQ+ICovCiAJaWYgKChhcmdjID09IDMpICYmIChpZF9wYXJzZShhcmd2WzJdLCBOVUxMLCAmZGV2X3R5cGUsICZkZXZfbnVtKSA9PSAwKSkgewogCQltdGRwYXJ0c19pbml0KCk7CkBAIC02NzIsNyArNjcyLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0NNRExJTkUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9DTURMSU5FKQogIyBkZWZpbmUgVE1QX0VSQVNFCSJlcmFzZSA8cGFydC1pZD5cbiAgICAtIGVyYXNlIHBhcnRpdGlvblxuIgogIyBkZWZpbmUgVE1QX1BST1RfT04JInByb3RlY3Qgb24gPHBhcnQtaWQ+XG4gICAgLSBwcm90ZWN0IHBhcnRpdGlvblxuIgogIyBkZWZpbmUgVE1QX1BST1RfT0ZGCSJwcm90ZWN0IG9mZiA8cGFydC1pZD5cbiAgICAtIG1ha2UgcGFydGl0aW9uIHdyaXRhYmxlXG4iCkBAIC02OTAsNyArNjkwLDcgQEAKICk7CiAKIFVfQk9PVF9DTUQoCi0JZXJhc2UsICAgMywgICAxLCAgZG9fZmxlcmFzZSwKKwllcmFzZSwgICAzLCAgIDAsICBkb19mbGVyYXNlLAogCSJlcmFzZSAgIC0gZXJhc2UgRkxBU0ggbWVtb3J5XG4iLAogCSJzdGFydCBlbmRcbiIKIAkiICAgIC0gZXJhc2UgRkxBU0ggZnJvbSBhZGRyICdzdGFydCcgdG8gYWRkciAnZW5kJ1xuIgpAQCAtNzA0LDcgKzcwNCw3IEBACiApOwogCiBVX0JPT1RfQ01EKAotCXByb3RlY3QsICA0LCAgMSwgICBkb19wcm90ZWN0LAorCXByb3RlY3QsICA0LCAgMCwgICBkb19wcm90ZWN0LAogCSJwcm90ZWN0IC0gZW5hYmxlIG9yIGRpc2FibGUgRkxBU0ggd3JpdGUgcHJvdGVjdGlvblxuIiwKIAkib24gIHN0YXJ0IGVuZFxuIgogCSIgICAgLSBwcm90ZWN0IEZMQVNIIGZyb20gYWRkciAnc3RhcnQnIHRvIGFkZHIgJ2VuZCdcbiIKQEAgLTczMiw0ICs3MzIsNCBAQAogI3VuZGVmCVRNUF9QUk9UX09OCiAjdW5kZWYJVE1QX1BST1RfT0ZGCiAKLSNlbmRpZgkvKiBDRkdfQ01EX0ZMQVNIICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfZnBnYS5jIGIvY29tbW9uL2NtZF9mcGdhLmMKaW5kZXggMzQ0NDA5MS4uM2ZjNGZjYSAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9mcGdhLmMKKysrIGIvY29tbW9uL2NtZF9mcGdhLmMKQEAgLTI3LDcgKzI3LDcgQEAKICAqLwogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKICNpbmNsdWRlIDxuZXQuaD4KICNlbmRpZgogI2luY2x1ZGUgPGZwZ2EuaD4KQEAgLTQzLDcgKzQzLDcgQEAKICNkZWZpbmUgUFJJTlRGKGZtdCxhcmdzLi4uKQogI2VuZGlmCiAKLSNpZiBkZWZpbmVkIChDT05GSUdfRlBHQSkgJiYgKCBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZQR0EgKQorI2lmIGRlZmluZWQgKENPTkZJR19GUEdBKSAmJiBkZWZpbmVkKENPTkZJR19DTURfRlBHQSkKIAogLyogTG9jYWwgZnVuY3Rpb25zICovCiBzdGF0aWMgdm9pZCBmcGdhX3VzYWdlIChjbWRfdGJsX3QgKiBjbWR0cCk7CkBAIC0zMjEsNCArMzIxLDQgQEAKIAkgICAgIlx0bG9hZGJcdExvYWQgZGV2aWNlIGZyb20gYml0c3RyZWFtIGJ1ZmZlciAoWGlsaW54IGRldmljZXMgb25seSlcbiIKIAkgICAgIlx0bG9hZG1rXHRMb2FkIGRldmljZSBnZW5lcmF0ZWQgd2l0aCBta2ltYWdlXG4iCiAJICAgICJcdGR1bXBcdExvYWQgZGV2aWNlIHRvIG1lbW9yeSBidWZmZXJcbiIpOwotI2VuZGlmIC8qIENPTkZJR19GUEdBICYmIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRlBHQSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2kyYy5jIGIvY29tbW9uL2NtZF9pMmMuYwppbmRleCA3NTU4MTBkLi5hNjg0YTU4IDEwMDY0NAotLS0gYS9jb21tb24vY21kX2kyYy5jCisrKyBiL2NvbW1vbi9jbWRfaTJjLmMKQEAgLTg2LDcgKzg2LDcgQEAKICNpbmNsdWRlIDxpMmMuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JMkMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0kyQykKIAogCiAvKiBEaXNwbGF5IHZhbHVlcyBmcm9tIGxhc3QgY29tbWFuZC4KQEAgLTY1Nyw3ICs2NTcsNyBAQAogICogVGhlIFNEUkFNIGNvbW1hbmQgaXMgc2VwYXJhdGVseSBjb25maWd1cmVkIGJlY2F1c2UgbWFueQogICogKG1vc3Q/KSBlbWJlZGRlZCBib2FyZHMgZG9uJ3QgdXNlIFNEUkFNIERJTU1zLgogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0RSQU0pCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NEUkFNKQogCiAvKgogICogU3ludGF4OgpAQCAtODc3LDcgKzg3Nyw3IEBACiAKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZgkvKiBDRkdfQ01EX1NEUkFNICovCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0kyQ19DTURfVFJFRSkKICNpZiBkZWZpbmVkKENPTkZJR19JMkNfTVVMVElfQlVTKQpAQCAtOTM4LDEwICs5MzgsMTAgQEAKIAkJcmV0dXJuIGRvX2kyY19wcm9iZShjbWR0cCwgZmxhZywgLS1hcmdjLCArK2FyZ3YpOwogCWlmICghc3RybmNtcChhcmd2WzFdLCAibG8iLCAyKSkKIAkJcmV0dXJuIGRvX2kyY19sb29wKGNtZHRwLCBmbGFnLCAtLWFyZ2MsICsrYXJndik7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0RSQU0pCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NEUkFNKQogCWlmICghc3RybmNtcChhcmd2WzFdLCAic2QiLCAyKSkKIAkJcmV0dXJuIGRvX3NkcmFtKGNtZHRwLCBmbGFnLCAtLWFyZ2MsICsrYXJndik7Ci0jZW5kaWYJLyogQ0ZHX0NNRF9TRFJBTSAqLworI2VuZGlmCiAJZWxzZQogCQlwcmludGYgKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOwogCXJldHVybiAwOwpAQCAtOTY1LDkgKzk2NSw5IEBACiAJImkyYyBjcmMzMiBjaGlwIGFkZHJlc3NbLjAsIC4xLCAuMl0gY291bnQgLSBjb21wdXRlIENSQzMyIGNoZWNrc3VtXG4iCiAJImkyYyBwcm9iZSAtIHNob3cgZGV2aWNlcyBvbiB0aGUgSTJDIGJ1c1xuIgogCSJpMmMgbG9vcCBjaGlwIGFkZHJlc3NbLjAsIC4xLCAuMl0gWyMgb2Ygb2JqZWN0c10gLSBsb29waW5nIHJlYWQgb2YgZGV2aWNlXG4iCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0RSQU0pCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NEUkFNKQogCSJpMmMgc2RyYW0gY2hpcCAtIHByaW50IFNEUkFNIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb25cbiIKLSNlbmRpZiAgLyogQ0ZHX0NNRF9TRFJBTSAqLworI2VuZGlmCiApOwogI2VuZGlmIC8qIENPTkZJR19JMkNfQ01EX1RSRUUgKi8KIFVfQk9PVF9DTUQoCkBAIC0xMDE2LDcgKzEwMTYsNyBAQAogCSIgICAgLSBsb29wLCByZWFkaW5nIGEgc2V0IG9mIGFkZHJlc3Nlc1xuIgogKTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NEUkFNKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9TRFJBTSkKIFVfQk9PVF9DTUQoCiAJaXNkcmFtLAkyLAkxLAlkb19zZHJhbSwKIAkiaXNkcmFtICAtIHByaW50IFNEUkFNIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb25cbiIsCkBAIC0xMDI1LDQgKzEwMjUsNCBAQAogKTsKICNlbmRpZgogCi0jZW5kaWYJLyogQ0ZHX0NNRF9JMkMgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9pZGUuYyBiL2NvbW1vbi9jbWRfaWRlLmMKaW5kZXggY2U5OWE0MS4uODlmZWZlZCAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9pZGUuYworKysgYi9jb21tb24vY21kX2lkZS5jCkBAIC01OSwxMyArNTksNiBAQAogI2VuZGlmCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19TSE9XX0JPT1RfUFJPR1JFU1MKLSMgaW5jbHVkZSA8c3RhdHVzX2xlZC5oPgotIyBkZWZpbmUgU0hPV19CT09UX1BST0dSRVNTKGFyZykJc2hvd19ib290X3Byb2dyZXNzKGFyZykKLSNlbHNlCi0jIGRlZmluZSBTSE9XX0JPT1RfUFJPR1JFU1MoYXJnKQotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfSURFXzh4eF9ESVJFQ1QKIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwogI2VuZGlmCkBAIC03OCw3ICs3MSw3IEBACiAjIGRlZmluZSBTWU5DCQkvKiBub3RoaW5nICovCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKQogCiAjaWZkZWYgQ09ORklHX0lERV84eHhfRElSRUNUCiAvKiBUaW1pbmdzIGZvciBJREUgSW50ZXJmYWNlCkBAIC0xODUsNiArMTc4LDkgQEAKIHN0YXRpYyB2b2lkIG91dHB1dF9kYXRhKGludCBkZXYsIHVsb25nICpzZWN0X2J1ZiwgaW50IHdvcmRzKTsKIHN0YXRpYyB2b2lkIGlkZW50X2NweSAodW5zaWduZWQgY2hhciAqZGVzdCwgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBpbnQgbGVuKTsKIAorI2lmbmRlZiBDRkdfQVRBX1BPUlRfQUREUgorI2RlZmluZSBDRkdfQVRBX1BPUlRfQUREUihwb3J0KSAocG9ydCkKKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FUQVBJCiBzdGF0aWMgdm9pZAlhdGFwaV9pbnF1aXJ5KGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjKTsKQEAgLTM4Miw2ICszNzgsNyBAQAogCWltYWdlX2hlYWRlcl90ICpoZHI7CiAJaW50IHJjb2RlID0gMDsKIAorCXNob3dfYm9vdF9wcm9ncmVzcyAoNDEpOwogCXN3aXRjaCAoYXJnYykgewogCWNhc2UgMToKIAkJYWRkciA9IENGR19MT0FEX0FERFI7CkBAIC0zOTcsNDQgKzM5NCw1MCBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcmludGYgKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOwotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgtNDIpOwogCQlyZXR1cm4gMTsKIAl9CisJc2hvd19ib290X3Byb2dyZXNzICg0Mik7CiAKIAlpZiAoIWJvb3RfZGV2aWNlKSB7CiAJCXB1dHMgKCJcbioqIE5vIGJvb3QgZGV2aWNlICoqXG4iKTsKLQkJU0hPV19CT09UX1BST0dSRVNTICgtMSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTQzKTsKIAkJcmV0dXJuIDE7CiAJfQorCXNob3dfYm9vdF9wcm9ncmVzcyAoNDMpOwogCiAJZGV2ID0gc2ltcGxlX3N0cnRvdWwoYm9vdF9kZXZpY2UsICZlcCwgMTYpOwogCiAJaWYgKGlkZV9kZXZfZGVzY1tkZXZdLnR5cGU9PURFVl9UWVBFX1VOS05PV04pIHsKIAkJcHJpbnRmICgiXG4qKiBEZXZpY2UgJWQgbm90IGF2YWlsYWJsZVxuIiwgZGV2KTsKLQkJU0hPV19CT09UX1BST0dSRVNTICgtMSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTQ0KTsKIAkJcmV0dXJuIDE7CiAJfQorCXNob3dfYm9vdF9wcm9ncmVzcyAoNDQpOwogCiAJaWYgKCplcCkgewogCQlpZiAoKmVwICE9ICc6JykgewogCQkJcHV0cyAoIlxuKiogSW52YWxpZCBib290IGRldmljZSwgdXNlIGBkZXZbOnBhcnRdJyAqKlxuIik7Ci0JCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xKTsKKwkJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTQ1KTsKIAkJCXJldHVybiAxOwogCQl9CiAJCXBhcnQgPSBzaW1wbGVfc3RydG91bCgrK2VwLCBOVUxMLCAxNik7CiAJfQorCXNob3dfYm9vdF9wcm9ncmVzcyAoNDUpOwogCWlmIChnZXRfcGFydGl0aW9uX2luZm8gKCZpZGVfZGV2X2Rlc2NbZGV2XSwgcGFydCwgJmluZm8pKSB7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC00Nik7CiAJCXJldHVybiAxOwogCX0KKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDQ2KTsKIAlpZiAoKHN0cm5jbXAoKGNoYXIgKilpbmZvLnR5cGUsIEJPT1RfUEFSVF9UWVBFLCBzaXplb2YoaW5mby50eXBlKSkgIT0gMCkgJiYKIAkgICAgKHN0cm5jbXAoKGNoYXIgKilpbmZvLnR5cGUsIEJPT1RfUEFSVF9DT01QLCBzaXplb2YoaW5mby50eXBlKSkgIT0gMCkpIHsKIAkJcHJpbnRmICgiXG4qKiBJbnZhbGlkIHBhcnRpdGlvbiB0eXBlIFwiJS4zMnNcIiIKIAkJCSIgKGV4cGVjdCBcIiIgQk9PVF9QQVJUX1RZUEUgIlwiKVxuIiwKIAkJCWluZm8udHlwZSk7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC00Nyk7CiAJCXJldHVybiAxOwogCX0KKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDQ3KTsKIAogCXByaW50ZiAoIlxuTG9hZGluZyBmcm9tIElERSBkZXZpY2UgJWQsIHBhcnRpdGlvbiAlZDogIgogCQkiTmFtZTogJS4zMnMgIFR5cGU6ICUuMzJzXG4iLApAQCAtNDQ1LDI2ICs0NDgsMjkgQEAKIAogCWlmIChpZGVfZGV2X2Rlc2NbZGV2XS5ibG9ja19yZWFkIChkZXYsIGluZm8uc3RhcnQsIDEsICh1bG9uZyAqKWFkZHIpICE9IDEpIHsKIAkJcHJpbnRmICgiKiogUmVhZCBlcnJvciBvbiAlZDolZFxuIiwgZGV2LCBwYXJ0KTsKLQkJU0hPV19CT09UX1BST0dSRVNTICgtMSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTQ4KTsKIAkJcmV0dXJuIDE7CiAJfQorCXNob3dfYm9vdF9wcm9ncmVzcyAoNDgpOwogCiAJaGRyID0gKGltYWdlX2hlYWRlcl90ICopYWRkcjsKIAogCWlmIChudG9obChoZHItPmloX21hZ2ljKSAhPSBJSF9NQUdJQykgewogCQlwcmludGYoIlxuKiogQmFkIE1hZ2ljIE51bWJlciAqKlxuIik7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC00OSk7CiAJCXJldHVybiAxOwogCX0KKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDQ5KTsKIAogCWNoZWNrc3VtID0gbnRvaGwoaGRyLT5paF9oY3JjKTsKIAloZHItPmloX2hjcmMgPSAwOwogCiAJaWYgKGNyYzMyICgwLCAodWNoYXIgKiloZHIsIHNpemVvZihpbWFnZV9oZWFkZXJfdCkpICE9IGNoZWNrc3VtKSB7CiAJCXB1dHMgKCJcbioqIEJhZCBIZWFkZXIgQ2hlY2tzdW0gKipcbiIpOwotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0yKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgtNTApOwogCQlyZXR1cm4gMTsKIAl9CisJc2hvd19ib290X3Byb2dyZXNzICg1MCk7CiAJaGRyLT5paF9oY3JjID0gaHRvbmwoY2hlY2tzdW0pOyAvKiByZXN0b3JlIGNoZWNrc3VtIGZvciBsYXRlciB1c2UgKi8KIAogCXByaW50X2ltYWdlX2hkciAoaGRyKTsKQEAgLTQ3Nyw5ICs0ODMsMTAgQEAKIAlpZiAoaWRlX2Rldl9kZXNjW2Rldl0uYmxvY2tfcmVhZCAoZGV2LCBpbmZvLnN0YXJ0KzEsIGNudCwKIAkJICAgICAgKHVsb25nICopKGFkZHIraW5mby5ibGtzeikpICE9IGNudCkgewogCQlwcmludGYgKCIqKiBSZWFkIGVycm9yIG9uICVkOiVkXG4iLCBkZXYsIHBhcnQpOwotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgtNTEpOwogCQlyZXR1cm4gMTsKIAl9CisJc2hvd19ib290X3Byb2dyZXNzICg1MSk7CiAKIAogCS8qIExvYWRpbmcgb2ssIHVwZGF0ZSBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLwpAQCAtNTE0LDExICs1MjEsMTEgQEAKIAl1bnNpZ25lZCBjaGFyIGM7CiAJaW50IGksIGJ1czsKICNpZiBkZWZpbmVkKENPTkZJR19BTUlHQU9ORUczU0UpIHx8IGRlZmluZWQoQ09ORklHX1NDMykKLQl1bnNpZ25lZCBpbnQgYXRhX3Jlc2V0X3RpbWU7CisJdW5zaWduZWQgaW50IGF0YV9yZXNldF90aW1lID0gQVRBX1JFU0VUX1RJTUU7CisJY2hhciAqczsKICNlbmRpZgogI2lmZGVmIENPTkZJR19BTUlHQU9ORUczU0UKIAl1bnNpZ25lZCBpbnQgbWF4X2J1c19zY2FuOwotCWNoYXIgKnM7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfSURFXzh4eF9QQ0NBUkQKIAlleHRlcm4gaW50IHBjbWNpYV9vbiAodm9pZCk7CkBAIC04MDcsMTMgKzgxNCwxMyBAQAogCiAJLyogRW5zdXJlIEkvTyBvcGVyYXRpb25zIGNvbXBsZXRlICovCiAJRUlFSU87Ci0JKigodWNoYXIgKikoQVRBX0NVUlJfQkFTRShkZXYpK3BvcnQpKSA9IHZhbDsKKwkqKCh1MTYgKikoQVRBX0NVUlJfQkFTRShkZXYpK0NGR19BVEFfUE9SVF9BRERSKHBvcnQpKSkgPSB2YWw7CiB9CiAjZWxzZQkvKiAhIF9fUFBDX18gKi8KIHN0YXRpYyB2b2lkIF9faW5saW5lX18KIGlkZV9vdXRiKGludCBkZXYsIGludCBwb3J0LCB1bnNpZ25lZCBjaGFyIHZhbCkKIHsKLQlvdXRiKHZhbCwgQVRBX0NVUlJfQkFTRShkZXYpK3BvcnQpOworCW91dGIodmFsLCBBVEFfQ1VSUl9CQVNFKGRldikrQ0ZHX0FUQV9QT1JUX0FERFIocG9ydCkpOwogfQogI2VuZGlmCS8qIF9fUFBDX18gKi8KIApAQCAtODI1LDcgKzgzMiw3IEBACiAJdWNoYXIgdmFsOwogCS8qIEVuc3VyZSBJL08gb3BlcmF0aW9ucyBjb21wbGV0ZSAqLwogCUVJRUlPOwotCXZhbCA9ICooKHVjaGFyICopKEFUQV9DVVJSX0JBU0UoZGV2KStwb3J0KSk7CisJdmFsID0gKigodTE2ICopKEFUQV9DVVJSX0JBU0UoZGV2KStDRkdfQVRBX1BPUlRfQUREUihwb3J0KSkpOwogCWRlYnVnICgiaWRlX2luYiAoZGV2PSAlZCwgcG9ydD0gMHgleCkgOiBAIDB4JTA4bHggLT4gMHglMDJ4XG4iLAogCQlkZXYsIHBvcnQsIChBVEFfQ1VSUl9CQVNFKGRldikrcG9ydCksIHZhbCk7CiAJcmV0dXJuICh2YWwpOwpAQCAtODM0LDcgKzg0MSw3IEBACiBzdGF0aWMgdW5zaWduZWQgY2hhciBfX2lubGluZV9fCiBpZGVfaW5iKGludCBkZXYsIGludCBwb3J0KQogewotICByZXR1cm4gaW5iKEFUQV9DVVJSX0JBU0UoZGV2KStwb3J0KTsKKyAgcmV0dXJuIGluYihBVEFfQ1VSUl9CQVNFKGRldikrQ0ZHX0FUQV9QT1JUX0FERFIocG9ydCkpOwogfQogI2VuZGlmCS8qIF9fUFBDX18gKi8KIApAQCAtODkxLDYgKzg5OCw5IEBACiAjaWZkZWYgX19NSVBTX18KIAkJKmRidWYrKyA9IHN3YWIxNnAoKHUxNiopcGJ1Zik7CiAJCSpkYnVmKysgPSBzd2FiMTZwKCh1MTYqKXBidWYpOworI2VsaWYgZGVmaW5lZChDT05GSUdfUENTNDQwRVApCisJCSpkYnVmKysgPSAqcGJ1ZjsKKwkJKmRidWYrKyA9ICpwYnVmOwogI2Vsc2UKIAkJKmRidWYrKyA9IGxkX2xlMTYocGJ1Zik7CiAJCSpkYnVmKysgPSBsZF9sZTE2KHBidWYpOwpAQCAtOTMwLDEwICs5NDAsMTggQEAKIAlwYnVmID0gKHVzaG9ydCAqKShBVEFfQ1VSUl9CQVNFKGRldikrQVRBX0RBVEFfUkVHKTsKIAlkYnVmID0gKHVzaG9ydCAqKXNlY3RfYnVmOwogCXdoaWxlICh3b3Jkcy0tKSB7CisjaWYgZGVmaW5lZChDT05GSUdfUENTNDQwRVApCisJCS8qIG5vdCB0ZXN0ZWQsIGJlY2F1c2UgQ0Ygd2FzIHdyaXRlIHByb3RlY3RlZCAqLworCQlFSUVJTzsKKwkJKnBidWYgPSBsZF9sZTE2KGRidWYrKyk7CisJCUVJRUlPOworCQkqcGJ1ZiA9IGxkX2xlMTYoZGJ1ZisrKTsKKyNlbHNlCiAJCUVJRUlPOwogCQkqcGJ1ZiA9ICpkYnVmKys7CiAJCUVJRUlPOwogCQkqcGJ1ZiA9ICpkYnVmKys7CisjZW5kaWYKIAl9CiAjZW5kaWYKIH0KQEAgLTk4MSwxMCArOTk5LDE3IEBACiAJZGVidWcoImluIGlucHV0IGRhdGEgYmFzZSBmb3IgcmVhZCBpcyAlbHhcbiIsICh1bnNpZ25lZCBsb25nKSBwYnVmKTsKIAogCXdoaWxlICh3b3Jkcy0tKSB7CisjaWYgZGVmaW5lZChDT05GSUdfUENTNDQwRVApCisJCUVJRUlPOworCQkqZGJ1ZisrID0gbGRfbGUxNihwYnVmKTsKKwkJRUlFSU87CisJCSpkYnVmKysgPSBsZF9sZTE2KHBidWYpOworI2Vsc2UKIAkJRUlFSU87CiAJCSpkYnVmKysgPSAqcGJ1ZjsKIAkJRUlFSU87CiAJCSpkYnVmKysgPSAqcGJ1ZjsKKyNlbmRpZgogCX0KICNlbmRpZgogfQpAQCAtMjA4MCw0ICsyMTA1LDQgQEAKIAkibG9hZEFkZHIgZGV2OnBhcnRcbiIKICk7CiAKLSNlbmRpZgkvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2ltbWFwLmMgYi9jb21tb24vY21kX2ltbWFwLmMKaW5kZXggZmE3OWI0NS4uYWU5NTc1OCAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9pbW1hcC5jCisrKyBiL2NvbW1vbi9jbWRfaW1tYXAuYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lNTUFQKSAmJiBcCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lNTUFQKSAmJiBcCiAgICAgKGRlZmluZWQoQ09ORklHXzh4eCkgfHwgZGVmaW5lZChDT05GSUdfODI2MCkpCiAKICNpZiBkZWZpbmVkKENPTkZJR184eHgpCkBAIC03MjAsNCArNzIwLDQgQEAKICk7CiAKIAotI2VuZGlmCS8qIENGR19DTURfSU1NQVAgJiYgKENPTkZJR184eHggfHwgQ09ORklHXzgyNjApICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfaXRlc3QuYyBiL2NvbW1vbi9jbWRfaXRlc3QuYwppbmRleCA4YWQxMzRmLi44ZTIwNTE3IDEwMDY0NAotLS0gYS9jb21tb24vY21kX2l0ZXN0LmMKKysrIGIvY29tbW9uL2NtZF9pdGVzdC5jCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSA8Y29uZmlnLmg+CiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSVRFU1QpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lURVNUKQogCiAjZGVmaW5lIEVRCTAKICNkZWZpbmUgTkUJMQpAQCAtMTk3LDQgKzE5Nyw0IEBACiAJIml0ZXN0XHQtIHJldHVybiB0cnVlL2ZhbHNlIG9uIGludGVnZXIgY29tcGFyZVxuIiwKIAkiWy5iLCAudywgLmwsIC5zXSBbKl12YWx1ZTEgPG9wPiBbKl12YWx1ZTJcbiIKICk7Ci0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JVEVTVCAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2pmZnMyLmMgYi9jb21tb24vY21kX2pmZnMyLmMKaW5kZXggN2ZkMWZhMy4uNTEzYTIyNiAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9qZmZzMi5jCisrKyBiL2NvbW1vbi9jbWRfamZmczIuYwpAQCAtOTQsMTggKzk0LDE4IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSkZGUzIpCiAKICNpbmNsdWRlIDxjcmFtZnMvY3JhbWZzX2ZzLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogI2lmZGVmIENGR19OQU5EX0xFR0FDWQogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2xlZ2FjeS5oPgogI2Vsc2UgLyogIUNGR19OQU5EX0xFR0FDWSAqLwogI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CiAjaW5jbHVkZSA8bmFuZC5oPgogI2VuZGlmIC8qICFDRkdfTkFORF9MRUdBQ1kgKi8KLSNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAqLworI2VuZGlmCiAvKiBlbmFibGUvZGlzYWJsZSBkZWJ1Z2dpbmcgbWVzc2FnZXMgKi8KICNkZWZpbmUJREVCVUdfSkZGUwogI3VuZGVmCURFQlVHX0pGRlMKQEAgLTMyMSw3ICszMjEsNyBAQAogICovCiBzdGF0aWMgaW50IHBhcnRfdmFsaWRhdGVfbm9yKHN0cnVjdCBtdGRpZHMgKmlkLCBzdHJ1Y3QgcGFydF9pbmZvICpwYXJ0KQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZMQVNIKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9GTEFTSCkKIAkvKiBpbmZvIGZvciBGTEFTSCBjaGlwcyAqLwogCWV4dGVybiBmbGFzaF9pbmZvX3QgZmxhc2hfaW5mb1tdOwogCWZsYXNoX2luZm9fdCAqZmxhc2g7CkBAIC0zNzAsNyArMzcwLDcgQEAKICAqLwogc3RhdGljIGludCBwYXJ0X3ZhbGlkYXRlX25hbmQoc3RydWN0IG10ZGlkcyAqaWQsIHN0cnVjdCBwYXJ0X2luZm8gKnBhcnQpCiB7Ci0jaWYgZGVmaW5lZChDT05GSUdfSkZGUzJfTkFORCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19KRkZTMl9OQU5EKSAmJiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAkvKiBpbmZvIGZvciBOQU5EIGNoaXBzICovCiAJbmFuZF9pbmZvX3QgKm5hbmQ7CiAKQEAgLTcxOSw3ICs3MTksNyBAQAogc3RhdGljIGludCBkZXZpY2VfdmFsaWRhdGUodTggdHlwZSwgdTggbnVtLCB1MzIgKnNpemUpCiB7CiAJaWYgKHR5cGUgPT0gTVREX0RFVl9UWVBFX05PUikgewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZMQVNIKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9GTEFTSCkKIAkJaWYgKG51bSA8IENGR19NQVhfRkxBU0hfQkFOS1MpIHsKIAkJCWV4dGVybiBmbGFzaF9pbmZvX3QgZmxhc2hfaW5mb1tdOwogCQkJKnNpemUgPSBmbGFzaF9pbmZvW251bV0uc2l6ZTsKQEAgLTczMyw3ICs3MzMsNyBAQAogCQlwcmludGYoInN1cHBvcnQgZm9yIEZMQVNIIGRldmljZXMgbm90IHByZXNlbnRcbiIpOwogI2VuZGlmCiAJfSBlbHNlIGlmICh0eXBlID09IE1URF9ERVZfVFlQRV9OQU5EKSB7Ci0jaWYgZGVmaW5lZChDT05GSUdfSkZGUzJfTkFORCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19KRkZTMl9OQU5EKSAmJiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKIAkJaWYgKG51bSA8IENGR19NQVhfTkFORF9ERVZJQ0UpIHsKICNpZm5kZWYgQ0ZHX05BTkRfTEVHQUNZCiAJCQkqc2l6ZSA9IG5hbmRfaW5mb1tudW1dLnNpemU7CkBAIC0yMTkyLDQgKzIxOTIsNCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZW5kaWYgLyogQ0ZHX0NNRF9KRkZTMiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX2xvYWQuYyBiL2NvbW1vbi9jbWRfbG9hZC5jCmluZGV4IGY2M2I4ZTguLjIwNGMzZWIgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfbG9hZC5jCisrKyBiL2NvbW1vbi9jbWRfbG9hZC5jCkBAIC0zMywyNCArMzMsMjQgQEAKIAogREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9MT0FEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTE9BREIpCiBzdGF0aWMgdWxvbmcgbG9hZF9zZXJpYWxfeW1vZGVtICh1bG9uZyBvZmZzZXQpOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9MT0FEUykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTE9BRFMpCiBzdGF0aWMgdWxvbmcgbG9hZF9zZXJpYWwgKHVsb25nIG9mZnNldCk7CiBzdGF0aWMgaW50IHJlYWRfcmVjb3JkIChjaGFyICpidWYsIHVsb25nIGxlbik7Ci0jIGlmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NBVkVTKQorIyBpZiBkZWZpbmVkKENPTkZJR19DTURfU0FWRVMpCiBzdGF0aWMgaW50IHNhdmVfc2VyaWFsICh1bG9uZyBvZmZzZXQsIHVsb25nIHNpemUpOwogc3RhdGljIGludCB3cml0ZV9yZWNvcmQgKGNoYXIgKmJ1Zik7Ci0jIGVuZGlmIC8qIENGR19DTURfU0FWRVMgKi8KKyNlbmRpZgogCiBzdGF0aWMgaW50IGRvX2VjaG8gPSAxOwotI2VuZGlmIC8qIENGR19DTURfTE9BRFMgKi8KKyNlbmRpZgogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTE9BRFMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0xPQURTKQogaW50IGRvX2xvYWRfc2VyaWFsIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKIAl1bG9uZyBvZmZzZXQgPSAwOwpAQCAtMjUzLDcgKzI1Myw3IEBACiAJcmV0dXJuIChwIC0gYnVmKTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NBVkVTKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9TQVZFUykKIAogaW50IGRvX3NhdmVfc2VyaWFsIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKQEAgLTM5OSwxMyArMzk5LDE1IEBACiAJfQogCXJldHVybiAoMCk7CiB9Ci0jIGVuZGlmIC8qIENGR19DTURfU0FWRVMgKi8KKyMgZW5kaWYKIAotI2VuZGlmCS8qIENGR19DTURfTE9BRFMgKi8KKyNlbmRpZgogCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9MT0FEQikgIC8qIGxvYWRiIGNvbW1hbmQgKGxvYWQgYmluYXJ5KSBpbmNsdWRlZCAqLwotCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0xPQURCKQorLyoKKyAqIGxvYWRiIGNvbW1hbmQgKGxvYWQgYmluYXJ5KSBpbmNsdWRlZAorICovCiAjZGVmaW5lIFhPTl9DSEFSICAgICAgICAxNwogI2RlZmluZSBYT0ZGX0NIQVIgICAgICAgMTkKICNkZWZpbmUgU1RBUlRfQ0hBUiAgICAgIDB4MDEKQEAgLTEwMzYsMTEgKzEwMzgsMTEgQEAKIAlyZXR1cm4gb2Zmc2V0OwogfQogCi0jZW5kaWYJLyogQ0ZHX0NNRF9MT0FEQiAqLworI2VuZGlmCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9MT0FEUykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTE9BRFMpCiAKICNpZmRlZglDRkdfTE9BRFNfQkFVRF9DSEFOR0UKIFVfQk9PVF9DTUQoCkBAIC0xMDY1LDcgKzEwNjcsNyBAQAogICovCiAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NBVkVTKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9TQVZFUykKICNpZmRlZglDRkdfTE9BRFNfQkFVRF9DSEFOR0UKIFVfQk9PVF9DTUQoCiAJc2F2ZXMsIDQsIDAsCWRvX3NhdmVfc2VyaWFsLApAQCAtMTA4MiwxMSArMTA4NCwxMSBAQAogCSIgICAgLSBzYXZlIFMtUmVjb3JkIGZpbGUgb3ZlciBzZXJpYWwgbGluZSB3aXRoIG9mZnNldCAnb2ZmJyBhbmQgc2l6ZSAnc2l6ZSdcbiIKICk7CiAjZW5kaWYJLyogQ0ZHX0xPQURTX0JBVURfQ0hBTkdFICovCi0jZW5kaWYJLyogQ0ZHX0NNRF9TQVZFUyAqLwotI2VuZGlmCS8qIENGR19DTURfTE9BRFMgKi8KKyNlbmRpZgorI2VuZGlmCiAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0xPQURCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9MT0FEQikKIFVfQk9PVF9DTUQoCiAJbG9hZGIsIDMsIDAsCWRvX2xvYWRfc2VyaWFsX2JpbiwKIAkibG9hZGIgICAtIGxvYWQgYmluYXJ5IGZpbGUgb3ZlciBzZXJpYWwgbGluZSAoa2VybWl0IG1vZGUpXG4iLApAQCAtMTEwMywxMSArMTEwNSwxMSBAQAogCSIgd2l0aCBvZmZzZXQgJ29mZicgYW5kIGJhdWRyYXRlICdiYXVkJ1xuIgogKTsKIAotI2VuZGlmCS8qIENGR19DTURfTE9BREIgKi8KKyNlbmRpZgogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSFdGTE9XKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9IV0ZMT1cpCiBpbnQgZG9faHdmbG93IChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKIAlleHRlcm4gaW50IGh3Zmxvd19vbm9mZihpbnQpOwpAQCAtMTEzMyw0ICsxMTM1LDQgQEAKIAkiW29ufG9mZl1cbiAtIGNoYW5nZSBSVFMvQ1RTIGhhcmR3YXJlIGZsb3cgY29udHJvbCBvdmVyIHNlcmlhbCBsaW5lXG4iCiApOwogCi0jZW5kaWYgLyogQ0ZHX0NNRF9IV0ZMT1cgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9sb2cuYyBiL2NvbW1vbi9jbWRfbG9nLmMKaW5kZXggMDQyYTQwMy4uZmJhOGJkOCAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9sb2cuYworKysgYi9jb21tb24vY21kX2xvZy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogKEMpIENvcHlyaWdodCAyMDAyLTIwMDcKICAqIERldGxldiBadW5kZWwsIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIGR6dUBkZW54LmRlLgogICoKICAqIENvZGUgdXNlZCBmcm9tIGxpbnV4L2tlcm5lbC9wcmludGsuYwpAQCAtNjAsNDUgKzYwLDQwIEBACiAvKiBUaGlzIGNvbWJpbmF0aW9uIHdpbGwgbm90IHByaW50IG1lc3NhZ2VzIHdpdGggdGhlIGRlZmF1bHQgbG9nbGV2ZWwgKi8KIHN0YXRpYyB1bnNpZ25lZCBjb25zb2xlX2xvZ2xldmVsID0gMzsKIHN0YXRpYyB1bnNpZ25lZCBkZWZhdWx0X21lc3NhZ2VfbG9nbGV2ZWwgPSA0Owotc3RhdGljIHVuc2lnbmVkIGNoYXIgKmxvZ19idWYgPSBOVUxMOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgKmV4dF9sb2dfc2l6ZTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nICpleHRfbG9nX3N0YXJ0Owotc3RhdGljIHVuc2lnbmVkIGxvbmcgKmV4dF9sb2dnZWRfY2hhcnM7Ci0jZGVmaW5lIGxvZ19zaXplICgqZXh0X2xvZ19zaXplKQotI2RlZmluZSBsb2dfc3RhcnQgKCpleHRfbG9nX3N0YXJ0KQotI2RlZmluZSBsb2dnZWRfY2hhcnMgKCpleHRfbG9nZ2VkX2NoYXJzKQorc3RhdGljIHVuc2lnbmVkIGxvZ192ZXJzaW9uID0gMTsKK3N0YXRpYyBsb2didWZmX3QgKmxvZzsKIAotLyogRm9yY2VkIGJ5IGNvZGUsIGVoISAqLwotI2RlZmluZSBMT0dCVUZGX01BR0lDIDB4YzBkZTRjZWQKLQotLyogVGhlIG1hcHBpbmcgdXNlZCBoZXJlIGhhcyB0byBiZSB0aGUgc2FtZSBhcyBpbiBzZXR1cF9leHRfbG9nYnVmZiAoKQotICAgaW4gbGludXgva2VybmVsL3ByaW50ayAqLwogdm9pZCBsb2didWZmX2luaXRfcHRycyAodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nICpleHRfdGFnOwotCXVuc2lnbmVkIGxvbmcgcG9zdF93b3JkOworCXVuc2lnbmVkIGxvbmcgdGFnLCBwb3N0X3dvcmQ7CiAJY2hhciAqczsKIAotCWxvZ19idWYgPSAodW5zaWduZWQgY2hhciAqKShnZC0+YmQtPmJpX21lbXNpemUtTE9HQlVGRl9MRU4pOwotCWV4dF90YWcgPSAodW5zaWduZWQgbG9uZyAqKShsb2dfYnVmKS00OwotIAlleHRfbG9nX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcgKikobG9nX2J1ZiktMzsKLQlleHRfbG9nX3NpemUgPSAodW5zaWduZWQgbG9uZyAqKShsb2dfYnVmKS0yOwotCWV4dF9sb2dnZWRfY2hhcnMgPSAodW5zaWduZWQgbG9uZyAqKShsb2dfYnVmKS0xOworCWxvZyA9IChsb2didWZmX3QgKikoZ2QtPmJkLT5iaV9tZW1zaXplLUxPR0JVRkZfTEVOKSAtIDE7CisKKwkvKiBTZXQgdXAgbG9nIHZlcnNpb24gKi8KKwlpZiAoKHMgPSBnZXRlbnYgKCJsb2d2ZXJzaW9uIikpICE9IE5VTEwpCisJCWxvZ192ZXJzaW9uID0gKGludClzaW1wbGVfc3RydG91bCAocywgTlVMTCwgMTApOworCisJaWYgKGxvZ192ZXJzaW9uID09IDIpCisJCXRhZyA9IGxvZy0+djIudGFnOworCWVsc2UKKwkJdGFnID0gbG9nLT52MS50YWc7CiAJcG9zdF93b3JkID0gcG9zdF93b3JkX2xvYWQoKTsKICNpZmRlZiBDT05GSUdfUE9TVAogCS8qIFRoZSBwb3N0IHJvdXRpbmVzIGhhdmUgc2V0dXAgdGhlIHdvcmQgc28gd2UgY2FuIHNpbXBseSB0ZXN0IGl0ICovCi0gCWlmIChwb3N0X3dvcmRfbG9hZCAoKSAmIFBPU1RfQ09MREJPT1QpIHsKLSAJCWxvZ2dlZF9jaGFycyA9IGxvZ19zaXplID0gbG9nX3N0YXJ0ID0gMDsKLQkJKmV4dF90YWcgPSBMT0dCVUZGX01BR0lDOwotIAl9CisJaWYgKHRhZyAhPSBMT0dCVUZGX01BR0lDIHx8IChwb3N0X3dvcmQgJiBQT1NUX0NPTERCT09UKSkgeworCQlsb2didWZmX3Jlc2V0ICgpOworCX0KICNlbHNlCiAJLyogTm8gcG9zdCByb3V0aW5lcywgc28gd2UgZG8gb3VyIG93biBjaGVja2luZyAgICAgICAgICAgICAgICAgICAgKi8KLSAJaWYgKHBvc3Rfd29yZCAhPSBMT0dCVUZGX01BR0lDKSB7Ci0gCQlsb2dnZWRfY2hhcnMgPSBsb2dfc2l6ZSA9IGxvZ19zdGFydCA9IDA7CisJaWYgKHRhZyAhPSBMT0dCVUZGX01BR0lDIHx8IHBvc3Rfd29yZCAhPSBMT0dCVUZGX01BR0lDKSB7CisJCWxvZ2J1ZmZfcmVzZXQgKCk7CiAJCXBvc3Rfd29yZF9zdG9yZSAoTE9HQlVGRl9NQUdJQyk7Ci0JCSpleHRfdGFnID0gTE9HQlVGRl9NQUdJQzsKLSAJfQorCX0KICNlbmRpZgorCWlmIChsb2dfdmVyc2lvbiA9PSAyICYmIChsb25nKWxvZy0+djIuc3RhcnQgPiAobG9uZylsb2ctPnYyLmNvbikKKwkJbG9nLT52Mi5zdGFydCA9IGxvZy0+djIuY29uOworCiAJLyogSW5pdGlhbGl6ZSBkZWZhdWx0IGxvZ2xldmVsIGlmIHByZXNlbnQgKi8KIAlpZiAoKHMgPSBnZXRlbnYgKCJsb2dsZXZlbCIpKSAhPSBOVUxMKQogCQljb25zb2xlX2xvZ2xldmVsID0gKGludClzaW1wbGVfc3RydG91bCAocywgTlVMTCwgMTApOwpAQCAtMTA2LDYgKzEwMSwxNSBAQAogCWdkLT5wb3N0X2xvZ193b3JkIHw9IExPR0JVRkZfSU5JVElBTElaRUQ7CiB9CiAKK3ZvaWQgbG9nYnVmZl9yZXNldCAodm9pZCkKK3sKKwltZW1zZXQgKGxvZywgMCwgc2l6ZW9mIChsb2didWZmX3QpKTsKKwlpZiAobG9nX3ZlcnNpb24gPT0gMikKKwkJbG9nLT52Mi50YWcgPSBMT0dCVUZGX01BR0lDOworCWVsc2UKKwkJbG9nLT52MS50YWcgPSBMT0dCVUZGX01BR0lDOworfQorCiBpbnQgZHJ2X2xvZ2J1ZmZfaW5pdCAodm9pZCkKIHsKIAlkZXZpY2VfdCBsb2dkZXY7CkBAIC0xNjIsNyArMTY2LDcgQEAKIGludCBkb19sb2cgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQogewogCWNoYXIgKnM7Ci0JdW5zaWduZWQgbG9uZyBpOworCXVuc2lnbmVkIGxvbmcgaSwgc3RhcnQsIHNpemU7CiAKIAlpZiAoc3RyY21wKGFyZ3ZbMV0sImFwcGVuZCIpID09IDApIHsKIAkJLyogTG9nIGNvbmNhdGVuYXRpb24gb2YgYWxsIGFyZ3VtZW50cyBzZXBhcmF0ZWQgYnkgc3BhY2VzICovCkBAIC0xNzcsMjEgKzE4MSwzNCBAQAogCiAJY2FzZSAyOgogCQlpZiAoc3RyY21wKGFyZ3ZbMV0sInNob3ciKSA9PSAwKSB7Ci0JCQlmb3IgKGk9MDsgaSA8IChsb2dfc2l6ZSZMT0dCVUZGX01BU0spOyBpKyspIHsKLQkJCQlzID0gKGNoYXIgKilsb2dfYnVmKygobG9nX3N0YXJ0K2kpJkxPR0JVRkZfTUFTSyk7CisJCQlpZiAobG9nX3ZlcnNpb24gPT0gMikgeworCQkJCXN0YXJ0ID0gbG9nLT52Mi5zdGFydDsKKwkJCQlzaXplID0gbG9nLT52Mi5lbmQgLSBsb2ctPnYyLnN0YXJ0OworCQkJfQorCQkJZWxzZSB7CisJCQkJc3RhcnQgPSBsb2ctPnYxLnN0YXJ0OworCQkJCXNpemUgPSBsb2ctPnYxLnNpemU7CisJCQl9CisJCQlmb3IgKGk9MDsgaSA8IChzaXplJkxPR0JVRkZfTUFTSyk7IGkrKykgeworCQkJCXMgPSAoY2hhciAqKWxvZy0+YnVmKygoc3RhcnQraSkmTE9HQlVGRl9NQVNLKTsKIAkJCQlwdXRjICgqcyk7CiAJCQl9CiAJCQlyZXR1cm4gMDsKIAkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwicmVzZXQiKSA9PSAwKSB7Ci0JCQlsb2dfc3RhcnQgICAgPSAwOwotCQkJbG9nX3NpemUgICAgID0gMDsKLQkJCWxvZ2dlZF9jaGFycyA9IDA7CisJCQlsb2didWZmX3Jlc2V0ICgpOwogCQkJcmV0dXJuIDA7CiAJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sImluZm8iKSA9PSAwKSB7Ci0JCQlwcmludGYgKCJMb2didWZmZXIgICBhdCAgJTA4bHhcbiIsICh1bnNpZ25lZCBsb25nKWxvZ19idWYpOwotCQkJcHJpbnRmICgibG9nX3N0YXJ0ICAgID0gICUwOGx4XG4iLCBsb2dfc3RhcnQpOwotCQkJcHJpbnRmICgibG9nX3NpemUgICAgID0gICUwOGx4XG4iLCBsb2dfc2l6ZSk7Ci0JCQlwcmludGYgKCJsb2dnZWRfY2hhcnMgPSAgJTA4bHhcbiIsIGxvZ2dlZF9jaGFycyk7CisJCQlwcmludGYgKCJMb2didWZmZXIgICBhdCAgJTA4bHhcbiIsICh1bnNpZ25lZCBsb25nKWxvZy0+YnVmKTsKKwkJCWlmIChsb2dfdmVyc2lvbiA9PSAyKSB7CisJCQkJcHJpbnRmICgibG9nX3N0YXJ0ICAgID0gICUwOGx4XG4iLCBsb2ctPnYyLnN0YXJ0KTsKKwkJCQlwcmludGYgKCJsb2dfZW5kICAgICAgPSAgJTA4bHhcbiIsIGxvZy0+djIuZW5kKTsKKwkJCQlwcmludGYgKCJsb2dnZWRfY2hhcnMgPSAgJTA4bHhcbiIsIGxvZy0+djIuY2hhcnMpOworCQkJfQorCQkJZWxzZSB7CisJCQkJcHJpbnRmICgibG9nX3N0YXJ0ICAgID0gICUwOGx4XG4iLCBsb2ctPnYxLnN0YXJ0KTsKKwkJCQlwcmludGYgKCJsb2dfc2l6ZSAgICAgPSAgJTA4bHhcbiIsIGxvZy0+djEuc2l6ZSk7CisJCQkJcHJpbnRmICgibG9nZ2VkX2NoYXJzID0gICUwOGx4XG4iLCBsb2ctPnYxLmNoYXJzKTsKKwkJCX0KIAkJCXJldHVybiAwOwogCQl9CiAJCXByaW50ZiAoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CkBAIC0yMDIsNyArMjE5LDcgQEAKIAkJcmV0dXJuIDE7CiAJfQogfQotI2lmIGRlZmluZWQoQ09ORklHX0xPR0JVRkZFUikKKwogVV9CT09UX0NNRCgKIAlsb2csICAgICAyNTUsCTEsCWRvX2xvZywKIAkibG9nICAgICAtIG1hbmlwdWxhdGUgbG9nYnVmZmVyXG4iLApAQCAtMjExLDcgKzIyOCw3IEBACiAJImxvZyBzaG93ICAgLSBzaG93IGNvbnRlbnRzXG4iCiAJImxvZyBhcHBlbmQgPG1zZz4gLSBhcHBlbmQgPG1zZz4gdG8gdGhlIGxvZ2J1ZmZlclxuIgogKTsKLSNlbmRpZgkvKiBDT05GSUdfTE9HQlVGRkVSICovCisKIHN0YXRpYyBpbnQgbG9nYnVmZl9wcmludGsoY29uc3QgY2hhciAqbGluZSkKIHsKIAlpbnQgaTsKQEAgLTI0MSwxMyArMjU4LDIyIEBACiAJCX0KIAkJbGluZV9mZWVkID0gMDsKIAkJZm9yICg7IHAgPCBidWZfZW5kOyBwKyspIHsKLQkJCWxvZ19idWZbKGxvZ19zdGFydCtsb2dfc2l6ZSkgJiBMT0dCVUZGX01BU0tdID0gKnA7Ci0JCQlpZiAobG9nX3NpemUgPCBMT0dCVUZGX0xFTikKLQkJCQlsb2dfc2l6ZSsrOwotCQkJZWxzZQotCQkJCWxvZ19zdGFydCsrOwotCi0JCQlsb2dnZWRfY2hhcnMrKzsKKwkJCWlmIChsb2dfdmVyc2lvbiA9PSAyKSB7CisJCQkJbG9nLT5idWZbbG9nLT52Mi5lbmQgJiBMT0dCVUZGX01BU0tdID0gKnA7CisJCQkJbG9nLT52Mi5lbmQrKzsKKwkJCQlpZiAobG9nLT52Mi5lbmQgLSBsb2ctPnYyLnN0YXJ0ID4gTE9HQlVGRl9MRU4pCisJCQkJCWxvZy0+djIuc3RhcnQrKzsKKwkJCQlsb2ctPnYyLmNoYXJzKys7CisJCQl9CisJCQllbHNlIHsKKwkJCQlsb2ctPmJ1ZlsobG9nLT52MS5zdGFydCArIGxvZy0+djEuc2l6ZSkgJgorCQkJCQkgTE9HQlVGRl9NQVNLXSA9ICpwOworCQkJCWlmIChsb2ctPnYxLnNpemUgPCBMT0dCVUZGX0xFTikKKwkJCQkJbG9nLT52MS5zaXplKys7CisJCQkJZWxzZQorCQkJCQlsb2ctPnYxLnN0YXJ0Kys7CisJCQkJbG9nLT52MS5jaGFycysrOworCQkJfQogCQkJaWYgKCpwID09ICdcbicpIHsKIAkJCQlsaW5lX2ZlZWQgPSAxOwogCQkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9tZW0uYyBiL2NvbW1vbi9jbWRfbWVtLmMKaW5kZXggZmNiYjAyMy4uYTk5NDIxMSAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9tZW0uYworKysgYi9jb21tb24vY21kX21lbS5jCkBAIC0yOSwxOCArMjksMTkgQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NTUMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX01NQykKICNpbmNsdWRlIDxtbWMuaD4KICNlbmRpZgogI2lmZGVmIENPTkZJR19IQVNfREFUQUZMQVNICiAjaW5jbHVkZSA8ZGF0YWZsYXNoLmg+CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiAoQ0ZHX0NNRF9NRU1PUlkJfCBcCi0JCQlDRkdfQ01EX0kyQwl8IFwKLQkJCUNGR19DTURfSVRFU1QJfCBcCi0JCQlDRkdfQ01EX1BDSQl8IFwKLQkJCUNNRF9DTURfUE9SVElPCSkgKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9NRU1PUlkpCQlcCisgICAgfHwgZGVmaW5lZChDT05GSUdfQ01EX0kyQykJCVwKKyAgICB8fCBkZWZpbmVkKENPTkZJR19DTURfSVRFU1QpCVwKKyAgICB8fCBkZWZpbmVkKENPTkZJR19DTURfUENJKQkJXAorICAgIHx8IGRlZmluZWQoQ09ORklHX0NNRF9QT1JUSU8pCisKIGludCBjbWRfZ2V0X2RhdGFfc2l6ZShjaGFyKiBhcmcsIGludCBkZWZhdWx0X3NpemUpCiB7CiAJLyogQ2hlY2sgZm9yIGEgc2l6ZSBzcGVjaWZpY2F0aW9uIC5iLCAudyBvciAubC4KQEAgLTY0LDcgKzY1LDcgQEAKIH0KICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUVNT1JZKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9NRU1PUlkpCiAKICNpZmRlZglDTURfTUVNX0RFQlVHCiAjZGVmaW5lCVBSSU5URihmbXQsYXJncy4uLikJcHJpbnRmIChmbXQgLCMjYXJncykKQEAgLTQwMyw3ICs0MDQsNyBAQAogCX0KICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTU1DKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9NTUMpCiAJaWYgKG1tYzJpbmZvKGRlc3QpKSB7CiAJCWludCByYzsKIApAQCAtMTE0OSw3ICsxMTUwLDcgQEAKICNlbmRpZgkvKiBDT05GSUdfQ1JDMzJfVkVSSUZZICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NRU1PUlkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX01FTU9SWSkKIFVfQk9PVF9DTUQoCiAJbWQsICAgICAzLCAgICAgMSwgICAgICBkb19tZW1fbWQsCiAJIm1kICAgICAgLSBtZW1vcnkgZGlzcGxheVxuIiwKQEAgLTEyNTIsNCArMTI1Myw0IEBACiAjZW5kaWYgLyogQ09ORklHX01YX0NZQ0xJQyAqLwogCiAjZW5kaWYKLSNlbmRpZgkvKiBDRkdfQ01EX01FTU9SWSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX21mc2wuYyBiL2NvbW1vbi9jbWRfbWZzbC5jCmluZGV4IGZmYTI2NjYuLjhkNGMxYTMgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfbWZzbC5jCisrKyBiL2NvbW1vbi9jbWRfbWZzbC5jCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8Y29uZmlnLmg+CiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUZTTCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTUZTTCkKICNpbmNsdWRlIDxhc20vYXNtLmg+CiAKIGludCBkb19mcmQgKGNtZF90YmxfdCAqIGNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKQEAgLTQxNCw0ICs0MTQsNCBAQAogCQkiIDEgLSBFQVIgLSBFeGNlcHRpb24gYWRkcmVzcyByZWdpc3RlclxuIgogCQkiIDIgLSBFU1IgLSBFeGNlcHRpb24gc3RhdHVzIHJlZ2lzdGVyXG4iKTsKIAotI2VuZGlmCQkJCS8qIENPTkZJR19NSUNST0JMQVpFICYgQ0ZHX0NNRF9NRlNMICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfbWlpLmMgYi9jb21tb24vY21kX21paS5jCmluZGV4IGU2NTk1MzYuLmY2Yjk4ZDEgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfbWlpLmMKKysrIGIvY29tbW9uL2NtZF9taWkuYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogI2luY2x1ZGUgPG1paXBoeS5oPgogCiAjaWZkZWYgQ09ORklHX1RFUlNFX01JSQpAQCAtNTk1LDQgKzU5NSw0IEBACiAKICNlbmRpZiAvKiBDT05GSUdfVEVSU0VfTUlJICovCiAKLSNlbmRpZiAvKiBDRkdfQ01EX01JSSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX21pc2MuYyBiL2NvbW1vbi9jbWRfbWlzYy5jCmluZGV4IDY3ZWU5ZTguLmMwYzZiOGYgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfbWlzYy5jCisrKyBiL2NvbW1vbi9jbWRfbWlzYy5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlTQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTUlTQykKIAogaW50IGRvX3NsZWVwIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKQEAgLTUyLDcgKzUyLDcgQEAKIH0KIAogLyogSW1wbGVtZW50ZWQgaW4gJChDUFUpL2ludGVycnVwdHMuYyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lSUSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSVJRKQogaW50IGRvX2lycWluZm8gKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKTsKIAogVV9CT09UX0NNRCgKQEAgLTYwLDEzICs2MCwxMyBAQAogCSJpcnFpbmZvIC0gcHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgSVJRc1xuIiwKIAlOVUxMCiApOwotI2VuZGlmICAvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lSUSAqLworI2VuZGlmCiAKIFVfQk9PVF9DTUQoCi0Jc2xlZXAgLCAgICAyLCAgICAyLCAgICAgZG9fc2xlZXAsCisJc2xlZXAgLCAgICAyLCAgICAxLCAgICAgZG9fc2xlZXAsCiAJInNsZWVwICAgLSBkZWxheSBleGVjdXRpb24gZm9yIHNvbWUgdGltZVxuIiwKIAkiTlxuIgogCSIgICAgLSBkZWxheSBleGVjdXRpb24gZm9yIE4gc2Vjb25kcyAoTiBpcyBfZGVjaW1hbF8gISEhKVxuIgogKTsKIAotI2VuZGlmCS8qIENGR19DTURfTUlTQyAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX21tYy5jIGIvY29tbW9uL2NtZF9tbWMuYwppbmRleCA1NzNlYjk3Li4wNjljNmQwIDEwMDY0NAotLS0gYS9jb21tb24vY21kX21tYy5jCisrKyBiL2NvbW1vbi9jbWRfbW1jLmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxjb21tYW5kLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NTUMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX01NQykKIAogI2luY2x1ZGUgPG1tYy5oPgogCkBAIC00Myw0ICs0Myw0IEBACiAJTlVMTAogKTsKIAotI2VuZGlmCS8qIENGR19DTURfTU1DICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfbmFuZC5jIGIvY29tbW9uL2NtZF9uYW5kLmMKaW5kZXggYjAxMWI1ZS4uYzcyNjEyZCAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9uYW5kLmMKKysrIGIvY29tbW9uL2NtZF9uYW5kLmMKQEAgLTE5LDI0ICsxOSwxNiBAQAogICovCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogCiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPHdhdGNoZG9nLmg+CiAjaW5jbHVkZSA8bWFsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotCi0jaWZkZWYgQ09ORklHX1NIT1dfQk9PVF9QUk9HUkVTUwotIyBpbmNsdWRlIDxzdGF0dXNfbGVkLmg+Ci0jIGRlZmluZSBTSE9XX0JPT1RfUFJPR1JFU1MoYXJnKQlzaG93X2Jvb3RfcHJvZ3Jlc3MoYXJnKQotI2Vsc2UKLSMgZGVmaW5lIFNIT1dfQk9PVF9QUk9HUkVTUyhhcmcpCi0jZW5kaWYKLQogI2luY2x1ZGUgPGpmZnMyL2pmZnMyLmg+CiAjaW5jbHVkZSA8bmFuZC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0NNRExJTkUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9DTURMSU5FKQogCiAvKiBwYXJpdGlvbiBoYW5kbGluZyByb3V0aW5lcyAqLwogaW50IG10ZHBhcnRzX2luaXQodm9pZCk7CkBAIC0xMDQsNyArOTYsNyBAQAogYXJnX29mZl9zaXplKGludCBhcmdjLCBjaGFyICphcmd2W10sIG5hbmRfaW5mb190ICpuYW5kLCB1bG9uZyAqb2ZmLCB1bG9uZyAqc2l6ZSkKIHsKIAlpbnQgaWR4ID0gbmFuZF9jdXJyX2RldmljZTsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfQ01ETElORSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0NNRExJTkUpCiAJc3RydWN0IG10ZF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgcGFydF9pbmZvICpwYXJ0OwogCXU4IHBudW07CkBAIC0xNTIsNyArMTQ0LDcgQEAKIAkJKnNpemUgPSBuYW5kLT5zaXplIC0gKm9mZjsKIAl9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfQ01ETElORSkKKyNpZiAgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9DTURMSU5FKQogb3V0OgogI2VuZGlmCiAJcHJpbnRmKCJkZXZpY2UgJWQgIiwgaWR4KTsKQEAgLTQ4NiwxNyArNDc4LDE5IEBACiAJciA9IG5hbmRfcmVhZChuYW5kLCBvZmZzZXQsICZjbnQsICh1X2NoYXIgKikgYWRkcik7CiAJaWYgKHIpIHsKIAkJcHV0cygiKiogUmVhZCBlcnJvclxuIik7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUygtMSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTU2KTsKIAkJcmV0dXJuIDE7CiAJfQorCXNob3dfYm9vdF9wcm9ncmVzcyAoNTYpOwogCiAJaGRyID0gKGltYWdlX2hlYWRlcl90ICopIGFkZHI7CiAKIAlpZiAobnRvaGwoaGRyLT5paF9tYWdpYykgIT0gSUhfTUFHSUMpIHsKIAkJcHJpbnRmKCJcbioqIEJhZCBNYWdpYyBOdW1iZXIgMHgleCAqKlxuIiwgaGRyLT5paF9tYWdpYyk7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUygtMSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTU3KTsKIAkJcmV0dXJuIDE7CiAJfQorCXNob3dfYm9vdF9wcm9ncmVzcyAoNTcpOwogCiAJcHJpbnRfaW1hZ2VfaGRyKGhkcik7CiAKQEAgLTUwNSw5ICs0OTksMTAgQEAKIAlyID0gbmFuZF9yZWFkKG5hbmQsIG9mZnNldCwgJmNudCwgKHVfY2hhciAqKSBhZGRyKTsKIAlpZiAocikgewogCQlwdXRzKCIqKiBSZWFkIGVycm9yXG4iKTsKLQkJU0hPV19CT09UX1BST0dSRVNTKC0xKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgtNTgpOwogCQlyZXR1cm4gMTsKIAl9CisJc2hvd19ib290X3Byb2dyZXNzICg1OCk7CiAKIAkvKiBMb2FkaW5nIG9rLCB1cGRhdGUgZGVmYXVsdCBsb2FkIGFkZHJlc3MgKi8KIApAQCAtNTM0LDcgKzUyOSw3IEBACiAJY2hhciAqYm9vdF9kZXZpY2UgPSBOVUxMOwogCWludCBpZHg7CiAJdWxvbmcgYWRkciwgb2Zmc2V0ID0gMDsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfQ01ETElORSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0NNRExJTkUpCiAJc3RydWN0IG10ZF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgcGFydF9pbmZvICpwYXJ0OwogCXU4IHBudW07CkBAIC01NTksNiArNTU0LDcgQEAKIAl9CiAjZW5kaWYKIAorCXNob3dfYm9vdF9wcm9ncmVzcyg1Mik7CiAJc3dpdGNoIChhcmdjKSB7CiAJY2FzZSAxOgogCQlhZGRyID0gQ0ZHX0xPQURfQUREUjsKQEAgLTU3OCwyNyArNTc0LDMwIEBACiAJCW9mZnNldCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDE2KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfQ01ETElORSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0NNRExJTkUpCiB1c2FnZToKICNlbmRpZgogCQlwcmludGYoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUygtMSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcygtNTMpOwogCQlyZXR1cm4gMTsKIAl9CiAKKwlzaG93X2Jvb3RfcHJvZ3Jlc3MoNTMpOwogCWlmICghYm9vdF9kZXZpY2UpIHsKIAkJcHV0cygiXG4qKiBObyBib290IGRldmljZSAqKlxuIik7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUygtMSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcygtNTQpOwogCQlyZXR1cm4gMTsKIAl9CisJc2hvd19ib290X3Byb2dyZXNzKDU0KTsKIAogCWlkeCA9IHNpbXBsZV9zdHJ0b3VsKGJvb3RfZGV2aWNlLCBOVUxMLCAxNik7CiAKIAlpZiAoaWR4IDwgMCB8fCBpZHggPj0gQ0ZHX01BWF9OQU5EX0RFVklDRSB8fCAhbmFuZF9pbmZvW2lkeF0ubmFtZSkgewogCQlwcmludGYoIlxuKiogRGV2aWNlICVkIG5vdCBhdmFpbGFibGVcbiIsIGlkeCk7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUygtMSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcygtNTUpOwogCQlyZXR1cm4gMTsKIAl9CisJc2hvd19ib290X3Byb2dyZXNzKDU1KTsKIAogCXJldHVybiBuYW5kX2xvYWRfaW1hZ2UoY21kdHAsICZuYW5kX2luZm9baWR4XSwgb2Zmc2V0LCBhZGRyLCBhcmd2WzBdKTsKIH0KQEAgLTYwNyw3ICs2MDYsNyBAQAogCSJuYm9vdCAgIC0gYm9vdCBmcm9tIE5BTkQgZGV2aWNlXG4iLAogCSJbcGFydGl0aW9uXSB8IFtbW2xvYWRBZGRyXSBkZXZdIG9mZnNldF1cbiIpOwogCi0jZW5kaWYJCQkJLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkgKi8KKyNlbmRpZgogCiAjZWxzZSAvKiBDRkdfTkFORF9MRUdBQ1kgKi8KIC8qCkBAIC02MjAsMTQgKzYxOSwxNCBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPHdhdGNoZG9nLmg+CiAKLSNpZmRlZiBDT05GSUdfU0hPV19CT09UX1BST0dSRVNTCisjaWZkZWYgQ09ORklHX3Nob3dfYm9vdF9wcm9ncmVzcwogIyBpbmNsdWRlIDxzdGF0dXNfbGVkLmg+Ci0jIGRlZmluZSBTSE9XX0JPT1RfUFJPR1JFU1MoYXJnKQlzaG93X2Jvb3RfcHJvZ3Jlc3MoYXJnKQorIyBkZWZpbmUgc2hvd19ib290X3Byb2dyZXNzKGFyZykJc2hvd19ib290X3Byb2dyZXNzKGFyZykKICNlbHNlCi0jIGRlZmluZSBTSE9XX0JPT1RfUFJPR1JFU1MoYXJnKQorIyBkZWZpbmUgc2hvd19ib290X3Byb2dyZXNzKGFyZykKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9sZWdhY3kuaD4KICNpZiAwCiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfaWRzLmg+CkBAIC04ODcsNiArODg2LDcgQEAKIAl1bG9uZyBvZmZzZXQgPSAwOwogCWltYWdlX2hlYWRlcl90ICpoZHI7CiAJaW50IHJjb2RlID0gMDsKKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDUyKTsKIAlzd2l0Y2ggKGFyZ2MpIHsKIAljYXNlIDE6CiAJCWFkZHIgPSBDRkdfTE9BRF9BRERSOwpAQCAtOTA3LDI0ICs5MDcsMjcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKLQkJU0hPV19CT09UX1BST0dSRVNTICgtMSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTUzKTsKIAkJcmV0dXJuIDE7CiAJfQogCisJc2hvd19ib290X3Byb2dyZXNzICg1Myk7CiAJaWYgKCFib290X2RldmljZSkgewogCQlwdXRzICgiXG4qKiBObyBib290IGRldmljZSAqKlxuIik7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC01NCk7CiAJCXJldHVybiAxOwogCX0KKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDU0KTsKIAogCWRldiA9IHNpbXBsZV9zdHJ0b3VsKGJvb3RfZGV2aWNlLCAmZXAsIDE2KTsKIAogCWlmICgoZGV2ID49IENGR19NQVhfTkFORF9ERVZJQ0UpIHx8CiAJICAgIChuYW5kX2Rldl9kZXNjW2Rldl0uQ2hpcElEID09IE5BTkRfQ2hpcElEX1VOS05PV04pKSB7CiAJCXByaW50ZiAoIlxuKiogRGV2aWNlICVkIG5vdCBhdmFpbGFibGVcbiIsIGRldik7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC01NSk7CiAJCXJldHVybiAxOwogCX0KKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDU1KTsKIAogCXByaW50ZiAoIlxuTG9hZGluZyBmcm9tIGRldmljZSAlZDogJXMgYXQgMHglbHggKG9mZnNldCAweCVseClcbiIsCiAJCWRldiwgbmFuZF9kZXZfZGVzY1tkZXZdLm5hbWUsIG5hbmRfZGV2X2Rlc2NbZGV2XS5JT19BRERSLApAQCAtOTMzLDkgKzkzNiwxMCBAQAogCWlmIChuYW5kX2xlZ2FjeV9ydyAobmFuZF9kZXZfZGVzYyArIGRldiwgTkFORFJXX1JFQUQsIG9mZnNldCwKIAkJCVNFQ1RPUlNJWkUsIE5VTEwsICh1X2NoYXIgKilhZGRyKSkgewogCQlwcmludGYgKCIqKiBSZWFkIGVycm9yIG9uICVkXG4iLCBkZXYpOwotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgtNTYpOwogCQlyZXR1cm4gMTsKIAl9CisJc2hvd19ib290X3Byb2dyZXNzICg1Nik7CiAKIAloZHIgPSAoaW1hZ2VfaGVhZGVyX3QgKilhZGRyOwogCkBAIC05NDcsMTcgKzk1MSwxOSBAQAogCQljbnQgLT0gU0VDVE9SU0laRTsKIAl9IGVsc2UgewogCQlwcmludGYgKCJcbioqIEJhZCBNYWdpYyBOdW1iZXIgMHgleCAqKlxuIiwgbnRvaGwoaGRyLT5paF9tYWdpYykpOwotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgtNTcpOwogCQlyZXR1cm4gMTsKIAl9CisJc2hvd19ib290X3Byb2dyZXNzICg1Nyk7CiAKIAlpZiAobmFuZF9sZWdhY3lfcncgKG5hbmRfZGV2X2Rlc2MgKyBkZXYsIE5BTkRSV19SRUFELAogCQkJb2Zmc2V0ICsgU0VDVE9SU0laRSwgY250LCBOVUxMLAogCQkJKHVfY2hhciAqKShhZGRyK1NFQ1RPUlNJWkUpKSkgewogCQlwcmludGYgKCIqKiBSZWFkIGVycm9yIG9uICVkXG4iLCBkZXYpOwotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgtNTgpOwogCQlyZXR1cm4gMTsKIAl9CisJc2hvd19ib290X3Byb2dyZXNzICg1OCk7CiAKIAkvKiBMb2FkaW5nIG9rLCB1cGRhdGUgZGVmYXVsdCBsb2FkIGFkZHJlc3MgKi8KIApAQCAtOTg1LDYgKzk5MSw2IEBACiAJImxvYWRBZGRyIGRldlxuIgogKTsKIAotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpICovCisjZW5kaWYKIAogI2VuZGlmIC8qIENGR19OQU5EX0xFR0FDWSAqLwpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9uZXQuYyBiL2NvbW1vbi9jbWRfbmV0LmMKaW5kZXggMmNiMmM1ZC4uMDcxNWZiYyAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9uZXQuYworKysgYi9jb21tb24vY21kX25ldC5jCkBAIC0yOCw4ICsyOCw3IEBACiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPG5ldC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQotCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAogZXh0ZXJuIGludCBkb19ib290bSAoY21kX3RibF90ICosIGludCwgaW50LCBjaGFyICpbXSk7CiAKQEAgLTY4LDcgKzY3LDcgQEAKIAkiW2xvYWRBZGRyZXNzXSBbYm9vdGZpbGVuYW1lXVxuIgogKTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RIQ1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RIQ1ApCiBpbnQgZG9fZGhjcCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAJcmV0dXJuIG5ldGJvb3RfY29tbW9uKERIQ1AsIGNtZHRwLCBhcmdjLCBhcmd2KTsKQEAgLTc5LDkgKzc4LDkgQEAKIAkiZGhjcFx0LSBpbnZva2UgREhDUCBjbGllbnQgdG8gb2J0YWluIElQL2Jvb3QgcGFyYW1zXG4iLAogCSJcbiIKICk7Ci0jZW5kaWYJLyogQ0ZHX0NNRF9ESENQICovCisjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05GUykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkZTKQogaW50IGRvX25mcyAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAJcmV0dXJuIG5ldGJvb3RfY29tbW9uKE5GUywgY21kdHAsIGFyZ2MsIGFyZ3YpOwpAQCAtOTIsNyArOTEsNyBAQAogCSJuZnNcdC0gYm9vdCBpbWFnZSB2aWEgbmV0d29yayB1c2luZyBORlMgcHJvdG9jb2xcbiIsCiAJIltsb2FkQWRkcmVzc10gW2hvc3QgaXAgYWRkcjpib290ZmlsZW5hbWVdXG4iCiApOwotI2VuZGlmCS8qIENGR19DTURfTkZTICovCisjZW5kaWYKIAogc3RhdGljIHZvaWQgbmV0Ym9vdF91cGRhdGVfZW52ICh2b2lkKQogewpAQCAtMTI4LDcgKzEyNyw3IEBACiAJCWlwX3RvX3N0cmluZyAoTmV0T3VyRE5TSVAsIHRtcCk7CiAJCXNldGVudiAoImRuc2lwIiwgdG1wKTsKIAl9Ci0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX0ROUzIpCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfRE5TMikKIAlpZiAoTmV0T3VyRE5TMklQKSB7CiAJCWlwX3RvX3N0cmluZyAoTmV0T3VyRE5TMklQLCB0bXApOwogCQlzZXRlbnYgKCJkbnNpcDIiLCB0bXApOwpAQCAtMTM3LDEzICsxMzYsMTUgQEAKIAlpZiAoTmV0T3VyTklTRG9tYWluWzBdKQogCQlzZXRlbnYgKCJkb21haW4iLCBOZXRPdXJOSVNEb21haW4pOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU05UUCkgJiYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX1RJTUVPRkZTRVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NOVFApIFwKKyAgICAmJiBkZWZpbmVkKENPTkZJR19CT09UUF9USU1FT0ZGU0VUKQogCWlmIChOZXRUaW1lT2Zmc2V0KSB7CiAJCXNwcmludGYgKHRtcCwgIiVkIiwgTmV0VGltZU9mZnNldCk7CiAJCXNldGVudiAoInRpbWVvZmZzZXQiLCB0bXApOwogCX0KICNlbmRpZgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NOVFApICYmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9OVFBTRVJWRVIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NOVFApIFwKKyAgICAmJiBkZWZpbmVkKENPTkZJR19CT09UUF9OVFBTRVJWRVIpCiAJaWYgKE5ldE50cFNlcnZlcklQKSB7CiAJCWlwX3RvX3N0cmluZyAoTmV0TnRwU2VydmVySVAsIHRtcCk7CiAJCXNldGVudiAoIm50cHNlcnZlcmlwIiwgdG1wKTsKQEAgLTE4NCwxOCArMTg1LDI1IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDogcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgtODApOwogCQlyZXR1cm4gMTsKIAl9CiAKLQlpZiAoKHNpemUgPSBOZXRMb29wKHByb3RvKSkgPCAwKQorCXNob3dfYm9vdF9wcm9ncmVzcyAoODApOworCWlmICgoc2l6ZSA9IE5ldExvb3AocHJvdG8pKSA8IDApIHsKKwkJc2hvd19ib290X3Byb2dyZXNzICgtODEpOwogCQlyZXR1cm4gMTsKKwl9CiAKKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDgxKTsKIAkvKiBOZXRMb29wIG9rLCB1cGRhdGUgZW52aXJvbm1lbnQgKi8KIAluZXRib290X3VwZGF0ZV9lbnYoKTsKIAogCS8qIGRvbmUgaWYgbm8gZmlsZSB3YXMgbG9hZGVkIChubyBlcnJvcnMgdGhvdWdoKSAqLwotCWlmIChzaXplID09IDApCisJaWYgKHNpemUgPT0gMCkgeworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC04Mik7CiAJCXJldHVybiAwOworCX0KIAogCS8qIGZsdXNoIGNhY2hlICovCiAJZmx1c2hfY2FjaGUobG9hZF9hZGRyLCBzaXplKTsKQEAgLTIwOCwxOSArMjE2LDI1IEBACiAKIAkJcHJpbnRmICgiQXV0b21hdGljIGJvb3Qgb2YgaW1hZ2UgYXQgYWRkciAweCUwOGxYIC4uLlxuIiwKIAkJCWxvYWRfYWRkcik7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoODIpOwogCQlyY29kZSA9IGRvX2Jvb3RtIChjbWR0cCwgMCwgMSwgbG9jYWxfYXJncyk7CiAJfQogCiAjaWZkZWYgQ09ORklHX0FVVE9TQ1JJUFQKIAlpZiAoKChzID0gZ2V0ZW52KCJhdXRvc2NyaXB0IikpICE9IE5VTEwpICYmIChzdHJjbXAocywieWVzIikgPT0gMCkpIHsKIAkJcHJpbnRmKCJSdW5uaW5nIGF1dG9zY3JpcHQgYXQgYWRkciAweCUwOGxYIC4uLlxuIiwgbG9hZF9hZGRyKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICg4Myk7CiAJCXJjb2RlID0gYXV0b3NjcmlwdCAobG9hZF9hZGRyKTsKIAl9CiAjZW5kaWYKKwlpZiAocmNvZGUgPCAwKQorCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC04Myk7CisJZWxzZQorCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDg0KTsKIAlyZXR1cm4gcmNvZGU7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QSU5HKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QSU5HKQogaW50IGRvX3BpbmcgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQogewogCWlmIChhcmdjIDwgMikKQEAgLTI0Nyw5ICsyNjEsOSBAQAogCSJwaW5nXHQtIHNlbmQgSUNNUCBFQ0hPX1JFUVVFU1QgdG8gbmV0d29yayBob3N0XG4iLAogCSJwaW5nQWRkcmVzc1xuIgogKTsKLSNlbmRpZgkvKiBDRkdfQ01EX1BJTkcgKi8KKyNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQ0RQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9DRFApCiAKIHN0YXRpYyB2b2lkIGNkcF91cGRhdGVfZW52KHZvaWQpCiB7CkBAIC0yOTAsOSArMzA0LDkgQEAKIAljZHAsCTEsCTEsCWRvX2NkcCwKIAkiY2RwXHQtIFBlcmZvcm0gQ0RQIG5ldHdvcmsgY29uZmlndXJhdGlvblxuIiwKICk7Ci0jZW5kaWYJLyogQ0ZHX0NNRF9DRFAgKi8KKyNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU05UUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU05UUCkKIGludCBkb19zbnRwIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKIAljaGFyICp0b2ZmOwpAQCAtMzI4LDYgKzM0Miw2IEBACiAJInNudHBcdC0gc3luY2hyb25pemUgUlRDIHZpYSBuZXR3b3JrXG4iLAogCSJbTlRQIHNlcnZlciBJUF1cbiIKICk7Ci0jZW5kaWYJLyogQ0ZHX0NNRF9TTlRQICovCisjZW5kaWYKIAotI2VuZGlmCS8qIENGR19DTURfTkVUICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfbnZlZGl0LmMgYi9jb21tb24vY21kX252ZWRpdC5jCmluZGV4IDk3N2VjNWIuLjFkYjBmYzMgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfbnZlZGl0LmMKKysrIGIvY29tbW9uL2NtZF9udmVkaXQuYwpAQCAtNDYsNyArNDYsNyBAQAogI2luY2x1ZGUgPHNlcmlhbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKICNpbmNsdWRlIDxuZXQuaD4KICNlbmRpZgogCkBAIC0xOTMsNyArMTkzLDEyIEBACiAJCSAqIEV0aGVybmV0IEFkZHJlc3MgYW5kIHNlcmlhbCMgY2FuIGJlIHNldCBvbmx5IG9uY2UsCiAJCSAqIHZlciBpcyByZWFkb25seS4KIAkJICovCisjaWZkZWYgQ09ORklHX0hBU19VSUQKKwkJLyogQWxsb3cgc2VyaWFsIyBmb3JjZWQgb3ZlcndyaXRlIHdpdGggMHhkZWFmNGFkZCBmbGFnICovCisJCWlmICggKChzdHJjbXAgKG5hbWUsICJzZXJpYWwjIikgPT0gMCkgJiYgKGZsYWcgIT0gMHhkZWFmNGFkZCkpIHx8CisjZWxzZQogCQlpZiAoIChzdHJjbXAgKG5hbWUsICJzZXJpYWwjIikgPT0gMCkgfHwKKyNlbmRpZgogCQkgICAgKChzdHJjbXAgKG5hbWUsICJldGhhZGRyIikgPT0gMCkKICNpZiBkZWZpbmVkKENPTkZJR19PVkVSV1JJVEVfRVRIQUREUl9PTkNFKSAmJiBkZWZpbmVkKENPTkZJR19FVEhBRERSKQogCQkgICAgICYmIChzdHJjbXAgKChjaGFyICopZW52X2dldF9hZGRyKG9sZHZhbCksTUtfU1RSKENPTkZJR19FVEhBRERSKSkgIT0gMCkKQEAgLTM2NywxMiArMzcyLDEyIEBACiAJCWxvYWRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKIAkJcmV0dXJuIDA7CiAJfQotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCWlmIChzdHJjbXAoYXJndlsxXSwiYm9vdGZpbGUiKSA9PSAwKSB7CiAJCWNvcHlfZmlsZW5hbWUgKEJvb3RGaWxlLCBhcmd2WzJdLCBzaXplb2YoQm9vdEZpbGUpKTsKIAkJcmV0dXJuIDA7CiAJfQotI2VuZGlmCS8qIENGR19DTURfTkVUICovCisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19BTUlHQU9ORUczU0UKIAlpZiAoc3RyY21wKGFyZ3ZbMV0sICJ2Z2FfZmdfY29sb3IiKSA9PSAwIHx8CkBAIC0zOTcsNyArNDAyLDE1IEBACiAJCV9kb19zZXRlbnYgKDAsIDMsIGFyZ3YpOwogfQogCi1pbnQgZG9fc2V0ZW52ICggY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCisjaWZkZWYgQ09ORklHX0hBU19VSUQKK3ZvaWQgZm9yY2VlbnYgKGNoYXIgKnZhcm5hbWUsIGNoYXIgKnZhcnZhbHVlKQoreworCWNoYXIgKmFyZ3ZbNF0gPSB7ICJmb3JjZWVudiIsIHZhcm5hbWUsIHZhcnZhbHVlLCBOVUxMIH07CisJX2RvX3NldGVudiAoMHhkZWFmNGFkZCwgMywgYXJndik7Cit9CisjZW5kaWYKKworaW50IGRvX3NldGVudiAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAJaWYgKGFyZ2MgPCAyKSB7CiAJCXByaW50ZiAoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CkBAIC00MTEsNyArNDI0LDcgQEAKICAqIFByb21wdCBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGUKICAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQVNLRU5WKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9BU0tFTlYpCiBpbnQgZG9fYXNrZW52ICggY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAJZXh0ZXJuIGNoYXIgY29uc29sZV9idWZmZXJbQ0ZHX0NCU0laRV07CkBAIC00ODMsNyArNDk2LDcgQEAKIAkvKiBDb250aW51ZSBjYWxsaW5nIHNldGVudiBjb2RlICovCiAJcmV0dXJuIF9kb19zZXRlbnYgKGZsYWcsIGxlbiwgbG9jYWxfYXJncyk7CiB9Ci0jZW5kaWYJLyogQ0ZHX0NNRF9BU0tFTlYgKi8KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBMb29rIHVwIHZhcmlhYmxlIGZyb20gZW52aXJvbm1lbnQsCkBAIC01MzgsMTEgKzU1MSw5IEBACiAJcmV0dXJuICgtMSk7CiB9CiAKLSNpZiBkZWZpbmVkKENGR19FTlZfSVNfSU5fTlZSQU0pIHx8IGRlZmluZWQoQ0ZHX0VOVl9JU19JTl9FRVBST00pIHx8IFwKLSAgICAoKENPTkZJR19DT01NQU5EUyAmIChDRkdfQ01EX0VOVnxDRkdfQ01EX0ZMQVNIKSkgPT0gXAotICAgICAgKENGR19DTURfRU5WfENGR19DTURfRkxBU0gpKSB8fCBcCi0gICAgKChDT05GSUdfQ09NTUFORFMgJiAoQ0ZHX0NNRF9FTlZ8Q0ZHX0NNRF9OQU5EKSkgPT0gXAotICAgICAgKENGR19DTURfRU5WfENGR19DTURfTkFORCkpCisjaWYgZGVmaW5lZChDRkdfRU5WX0lTX0lOX05WUkFNKSB8fCBkZWZpbmVkKENGR19FTlZfSVNfSU5fRUVQUk9NKSBcCisgICAgfHwgKGRlZmluZWQoQ09ORklHX0NNRF9FTlYpICYmIGRlZmluZWQoQ09ORklHX0NNRF9GTEFTSCkpIFwKKyAgICB8fCAoZGVmaW5lZChDT05GSUdfQ01EX0VOVikgJiYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpKQogaW50IGRvX3NhdmVlbnYgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQogewogCWV4dGVybiBjaGFyICogZW52X25hbWVfc3BlYzsKQEAgLTU1Miw3ICs1NjMsNiBAQAogCXJldHVybiAoc2F2ZWVudigpID8gMSA6IDApOwogfQogCi0KICNlbmRpZgogCiAKQEAgLTU5NiwyMCArNjA2LDE4IEBACiAJIiAgICAtIGRlbGV0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAnbmFtZSdcbiIKICk7CiAKLSNpZiBkZWZpbmVkKENGR19FTlZfSVNfSU5fTlZSQU0pIHx8IGRlZmluZWQoQ0ZHX0VOVl9JU19JTl9FRVBST00pIHx8IFwKLSAgICAoKENPTkZJR19DT01NQU5EUyAmIChDRkdfQ01EX0VOVnxDRkdfQ01EX0ZMQVNIKSkgPT0gXAotICAgICAgKENGR19DTURfRU5WfENGR19DTURfRkxBU0gpKSB8fCBcCi0gICAgKChDT05GSUdfQ09NTUFORFMgJiAoQ0ZHX0NNRF9FTlZ8Q0ZHX0NNRF9OQU5EKSkgPT0gXAotICAgICAgKENGR19DTURfRU5WfENGR19DTURfTkFORCkpCisjaWYgZGVmaW5lZChDRkdfRU5WX0lTX0lOX05WUkFNKSB8fCBkZWZpbmVkKENGR19FTlZfSVNfSU5fRUVQUk9NKSBcCisgICAgfHwgKGRlZmluZWQoQ09ORklHX0NNRF9FTlYpICYmIGRlZmluZWQoQ09ORklHX0NNRF9GTEFTSCkpIFwKKyAgICB8fCAoZGVmaW5lZChDT05GSUdfQ01EX0VOVikgJiYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpKQogVV9CT09UX0NNRCgKIAlzYXZlZW52LCAxLCAwLAlkb19zYXZlZW52LAogCSJzYXZlZW52IC0gc2F2ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gcGVyc2lzdGVudCBzdG9yYWdlXG4iLAogCU5VTEwKICk7CiAKLSNlbmRpZgkvKiBDRkdfQ01EX0VOViAqLworI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9BU0tFTlYpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0FTS0VOVikKIAogVV9CT09UX0NNRCgKIAlhc2tlbnYsCUNGR19NQVhBUkdTLAkxLAlkb19hc2tlbnYsCkBAIC02MjQsOSArNjMyLDkgQEAKIAkiICAgIC0gZGlzcGxheSAnbWVzc2FnZScgc3RyaW5nIGFuZCBnZXQgZW52aXJvbm1lbnQgdmFyaWFibGUgJ25hbWUnIgogCSJmcm9tIHN0ZGluIChtYXggJ3NpemUnIGNoYXJzKVxuIgogKTsKLSNlbmRpZgkvKiBDRkdfQ01EX0FTS0VOViAqLworI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9SVU4pCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1JVTikKIGludCBkb19ydW4gKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKTsKIFVfQk9PVF9DTUQoCiAJcnVuLAlDRkdfTUFYQVJHUywJMSwJZG9fcnVuLApAQCAtNjM0LDQgKzY0Miw0IEBACiAJInZhciBbLi4uXVxuIgogCSIgICAgLSBydW4gdGhlIGNvbW1hbmRzIGluIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZShzKSAndmFyJ1xuIgogKTsKLSNlbmRpZiAgLyogQ0ZHX0NNRF9SVU4gKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9wY2kuYyBiL2NvbW1vbi9jbWRfcGNpLmMKaW5kZXggNDUwODU0Ni4uOGJlNmRhOSAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9wY2kuYworKysgYi9jb21tb24vY21kX3BjaS5jCkBAIC0zOCw3ICszOCw3IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8cGNpLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ0kpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDSSkKIAogZXh0ZXJuIGludCBjbWRfZ2V0X2RhdGFfc2l6ZShjaGFyKiBhcmcsIGludCBkZWZhdWx0X3NpemUpOwogCkBAIC01NjUsNiArNTY1LDYgQEAKIAkiICAgIC0gd3JpdGUgdG8gQ0ZHIGFkZHJlc3NcbiIKICk7CiAKLSNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ0kpICovCisjZW5kaWYKIAogI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfcGNtY2lhLmMgYi9jb21tb24vY21kX3BjbWNpYS5jCmluZGV4IDJlYjViMjYuLmRjZDA3YzAgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfcGNtY2lhLmMKKysrIGIvY29tbW9uL2NtZF9wY21jaWEuYwpAQCAtNjEsNyArNjEsNyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiAKIGV4dGVybiBpbnQgcGNtY2lhX29uICh2b2lkKTsKIGV4dGVybiBpbnQgcGNtY2lhX29mZiAodm9pZCk7CkBAIC04NywxOSArODcsMTkgQEAKIH0KIAogVV9CT09UX0NNRCgKLQlwaW5pdCwJMiwJMSwJZG9fcGluaXQsCisJcGluaXQsCTIsCTAsCWRvX3Bpbml0LAogCSJwaW5pdCAgIC0gUENNQ0lBIHN1Yi1zeXN0ZW1cbiIsCiAJIm9uICAtIHBvd2VyIG9uIFBDTUNJQSBzb2NrZXRcbiIKIAkJCSJwaW5pdCBvZmYgLSBwb3dlciBvZmYgUENNQ0lBIHNvY2tldFxuIgogCSAgKTsKIAotI2VuZGlmCS8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBICovCisjZW5kaWYKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogI3VuZGVmCUNIRUNLX0lERV9ERVZJQ0UKIAotI2lmCShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFXzh4eF9QQ0NBUkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFXzh4eF9QQ0NBUkQpCiAjZGVmaW5lCUNIRUNLX0lERV9ERVZJQ0UKICNlbmRpZgogCmRpZmYgLS1naXQgYS9jb21tb24vY21kX3BvcnRpby5jIGIvY29tbW9uL2NtZF9wb3J0aW8uYwppbmRleCBkMmU0YzRiLi5iZmUzM2UzIDEwMDY0NAotLS0gYS9jb21tb24vY21kX3BvcnRpby5jCisrKyBiL2NvbW1vbi9jbWRfcG9ydGlvLmMKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxjb21tYW5kLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QT1JUSU8pCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BPUlRJTykKIAogZXh0ZXJuIGludCBjbWRfZ2V0X2RhdGFfc2l6ZSAoY2hhciAqYXJnLCBpbnQgZGVmYXVsdF9zaXplKTsKIApAQCAtMTY2LDQgKzE2Niw0IEBACiAJIiAgICAtIHJlYWQgZGF0dW0gZnJvbSBJTyBwb3J0XG4iCiApOwogCi0jZW5kaWYJLyogQ0ZHX0NNRF9QT1JUSU8gKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9yZWdpbmZvLmMgYi9jb21tb24vY21kX3JlZ2luZm8uYwppbmRleCBmNDI4ZjdlLi4xN2U5Y2Q5IDEwMDY0NAotLS0gYS9jb21tb24vY21kX3JlZ2luZm8uYworKysgYi9jb21tb24vY21kX3JlZ2luZm8uYwpAQCAtMzIsNyArMzIsOCBAQAogI2VsaWYgZGVmaW5lZCAoQ09ORklHX01QQzUyMDApCiAjaW5jbHVkZSA8bXBjNXh4eC5oPgogI2VuZGlmCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUkVHSU5GTykKKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9SRUdJTkZPKQogCiBpbnQgZG9fcmVnaW5mbyAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CkBAIC0zMzQsMTQgKzMzNSwxNCBAQAogCXJldHVybiAwOwogfQogCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9SRUdJTkZPICovCisjZW5kaWYKIAogCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWYgKCBkZWZpbmVkKENPTkZJR184eHgpICAgfHwgZGVmaW5lZChDT05GSUdfNDA1R1ApIHx8IFwKICAgICAgIGRlZmluZWQoQ09ORklHXzQwNUVQKSB8fCBkZWZpbmVkKENPTkZJR19NUEM1MjAwKSAgKSAmJiBcCi0gICAgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUkVHSU5GTykKKyAgICBkZWZpbmVkKENPTkZJR19DTURfUkVHSU5GTykKIAogVV9CT09UX0NNRCgKICAJcmVnaW5mbywJMiwJMSwJZG9fcmVnaW5mbywKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfcmVpc2VyLmMgYi9jb21tb24vY21kX3JlaXNlci5jCmluZGV4IDA5Yzg2ZTYuLjFiYTM5MjkgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfcmVpc2VyLmMKKysrIGIvY29tbW9uL2NtZF9yZWlzZXIuYwpAQCAtMjgsNyArMjgsNyBAQAogICovCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9SRUlTRVIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1JFSVNFUikKICNpbmNsdWRlIDxjb25maWcuaD4KICNpbmNsdWRlIDxjb21tYW5kLmg+CiAjaW5jbHVkZSA8aW1hZ2UuaD4KQEAgLTkwLDcgKzkwLDcgQEAKIAl9CiAKIAlpZiAoIXJlaXNlcmZzX21vdW50KHBhcnRfbGVuZ3RoKSkgewotCQlwcmludGYgKCIqKiBCYWQgUmVpc2VmcyBwYXJ0aXRpb24gb3IgZGlzayAtICVzICVkOiVkICoqXG4iLCAgYXJndlsxXSwgZGV2LCBwYXJ0KTsKKwkJcHJpbnRmICgiKiogQmFkIFJlaXNlcmZzIHBhcnRpdGlvbiBvciBkaXNrIC0gJXMgJWQ6JWQgKipcbiIsICBhcmd2WzFdLCBkZXYsIHBhcnQpOwogCQlyZXR1cm4gMTsKIAl9CiAKQEAgLTE4Myw3ICsxODMsNyBAQAogCQkJcmV0dXJuIDE7CiAJCX0KIAotCQlpZiAoc3RybmNtcChpbmZvLnR5cGUsIEJPT1RfUEFSVF9UWVBFLCBzaXplb2YoaW5mby50eXBlKSkgIT0gMCkgeworCQlpZiAoc3RybmNtcCgoY2hhciAqKWluZm8udHlwZSwgQk9PVF9QQVJUX1RZUEUsIHNpemVvZihpbmZvLnR5cGUpKSAhPSAwKSB7CiAJCQlwcmludGYgKCJcbioqIEludmFsaWQgcGFydGl0aW9uIHR5cGUgXCIlLjMyc1wiIgogCQkJCSIgKGV4cGVjdCBcIiIgQk9PVF9QQVJUX1RZUEUgIlwiKVxuIiwKIAkJCQlpbmZvLnR5cGUpOwpAQCAtMjA0LDcgKzIwNCw3IEBACiAJfQogCiAJaWYgKCFyZWlzZXJmc19tb3VudChwYXJ0X2xlbmd0aCkpIHsKLQkJcHJpbnRmICgiKiogQmFkIFJlaXNlZnMgcGFydGl0aW9uIG9yIGRpc2sgLSAlcyAlZDolZCAqKlxuIiwgIGFyZ3ZbMV0sIGRldiwgcGFydCk7CisJCXByaW50ZiAoIioqIEJhZCBSZWlzZXJmcyBwYXJ0aXRpb24gb3IgZGlzayAtICVzICVkOiVkICoqXG4iLCAgYXJndlsxXSwgZGV2LCBwYXJ0KTsKIAkJcmV0dXJuIDE7CiAJfQogCkBAIC0yNDAsNCArMjQwLDQgQEAKIAkiICAgICAgdG8gYWRkcmVzcyAnYWRkcicgZnJvbSBkb3MgZmlsZXN5c3RlbVxuIgogKTsKIAotI2VuZGlmCS8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUkVJU0VSICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfc2F0YS5jIGIvY29tbW9uL2NtZF9zYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ0YzExZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9jbWRfc2F0YS5jCkBAIC0wLDAgKzEsNzEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSBQcm9jc3lzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQXV0aG9yOiBNdXNodGFxIEtoYW4gPG11c2h0YXFfa0Bwcm9jc3lzLmNvbT4KKyAqCQkJPG11c2h0YXFrXzkyMUB5YWhvby5jby5pbj4KKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogd2l0aCB0aGUgcmVmZXJlbmNlIHRvIGxpYmF0YSBpbiBrZXJuZWwgMi40LjMyCisgKgorICovCisKKy8qCisgKiBGaWxlIGNvbnRhaW5zIFNBVEEgcmVhZC13cml0ZSBhbmQgb3RoZXIgdXRpbGl0eSBmdW5jdGlvbnMuCisgKi8KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxwY2kuaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8aWRlLmg+CisjaW5jbHVkZSA8YXRhLmg+CisKKyNpZmRlZiBDRkdfU0FUQV9TVVBQT1JURUQKKy8qRm9yIGRlYnVnIHByaW50cyBzZXQgbWFjcm8gREVCVUdfU0FUQSB0byAxICovCisjZGVmaW5lIERFQlVHX1NBVEEgMAorLypNYWNybyBmb3IgU0FUQSBsaWJyYXJ5IHNwZWNpZmljIGRlY2xhcmF0aW9ucyAqLworI2RlZmluZSBTQVRBX0RFQ0wKKyNpbmNsdWRlIDxzYXRhLmg+CisjdW5kZWYgU0FUQV9ERUNMCisKK3N0YXRpYyB1OCBfX2lubGluZV9fCitzYXRhX2luYiAodW5zaWduZWQgbG9uZyBpb2FkZHIpCit7CisJcmV0dXJuIGluYiAoaW9hZGRyKTsKK30KKworc3RhdGljIHZvaWQgX19pbmxpbmVfXworc2F0YV9vdXRiICh1bnNpZ25lZCBjaGFyIHZhbCwgdW5zaWduZWQgbG9uZyBpb2FkZHIpCit7CisJb3V0YiAodmFsLCBpb2FkZHIpOworfQorCitzdGF0aWMgdm9pZAorb3V0cHV0X2RhdGEgKHN0cnVjdCBzYXRhX2lvcG9ydHMgKmlvYWRkciwgdWxvbmcgKiBzZWN0X2J1ZiwgaW50IHdvcmRzKQoreworCW91dHN3IChpb2FkZHItPmRhdGFfYWRkciwgc2VjdF9idWYsIHdvcmRzIDw8IDEpOworfQorCitzdGF0aWMgaW50CitpbnB1dF9kYXRhIChzdHJ1Y3Qgc2F0YV9pb3BvcnRzICppb2FkZHIsIHVsb25nICogc2VjdF9idWYsIGludCB3b3JkcykKK3sKKwlpbnN3IChpb2FkZHItPmRhdGFfYWRkciwgc2VjdF9idWYsIHdvcmRzIDw8IDEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorc2F0YV9jcHkgKHVuc2lnbmVkIGNoYXIgKmRzdCwgdW5zaWduZWQgY2hhciAqc3JjLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKmVuZCwgKmxhc3Q7CisKKwlsYXN0ID0gZHN0OworCWVuZCA9IHNyYyArIGxlbiAtIDE7CisKKwkvKiByZXNlcnZlIHNwYWNlIGZvciAnXDAnICovCisJaWYgKGxlbiA8IDIpCisJCWdvdG8gT1VUOworCisJLyogc2tpcCBsZWFkaW5nIHdoaXRlIHNwYWNlICovCisJd2hpbGUgKCgqc3JjKSAmJiAoc3JjIDwgZW5kKSAmJiAoKnNyYyA9PSAnICcpKQorCQkrK3NyYzsKKworCS8qIGNvcHkgc3RyaW5nLCBvbWl0dGluZyB0cmFpbGluZyB3aGl0ZSBzcGFjZSAqLworCXdoaWxlICgoKnNyYykgJiYgKHNyYyA8IGVuZCkpIHsKKwkJKmRzdCsrID0gKnNyYzsKKwkJaWYgKCpzcmMrKyAhPSAnICcpCisJCQlsYXN0ID0gZHN0OworCX0KKyAgICAgIE9VVDoKKwkqbGFzdCA9ICdcMCc7Cit9CisKK2ludAorc2F0YV9idXNfc29mdHJlc2V0IChpbnQgbnVtKQoreworCXU4IGRldiA9IDAsIHN0YXR1cyA9IDAsIGk7CisKKwlwb3J0W251bV0uZGV2X21hc2sgPSAwOworCisJZm9yIChpID0gMDsgaSA8IENGR19TQVRBX0RFVlNfUEVSX0JVUzsgaSsrKSB7CisJCWlmICghKHNhdGFfZGV2Y2hrICgmcG9ydFtudW1dLmlvYWRkciwgaSkpKSB7CisJCQlQUklOVEYgKCJkZXZfY2hrIGZhaWxlZCBmb3IgZGV2IyVkXG4iLCBpKTsKKwkJfSBlbHNlIHsKKwkJCXBvcnRbbnVtXS5kZXZfbWFzayB8PSAoMSA8PCBpKTsKKwkJCVBSSU5URiAoImRldl9jaGsgcGFzc2VkIGZvciBkZXYjJWRcbiIsIGkpOworCQl9CisJfQorCisJaWYgKCEocG9ydFtudW1dLmRldl9tYXNrKSkgeworCQlwcmludGYgKCJubyBkZXZpY2VzIG9uIHBvcnQlZFxuIiwgbnVtKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZGV2X3NlbGVjdCAoJnBvcnRbbnVtXS5pb2FkZHIsIGRldik7CisKKwlwb3J0W251bV0uY3RsX3JlZyA9IDB4MDg7CS8qRGVmYXVsdCB2YWx1ZSBvZiBjb250cm9sIHJlZyAqLworCXNhdGFfb3V0YiAocG9ydFtudW1dLmN0bF9yZWcsIHBvcnRbbnVtXS5pb2FkZHIuY3RsX2FkZHIpOworCXVkZWxheSAoMTApOworCXNhdGFfb3V0YiAocG9ydFtudW1dLmN0bF9yZWcgfCBBVEFfU1JTVCwgcG9ydFtudW1dLmlvYWRkci5jdGxfYWRkcik7CisJdWRlbGF5ICgxMCk7CisJc2F0YV9vdXRiIChwb3J0W251bV0uY3RsX3JlZywgcG9ydFtudW1dLmlvYWRkci5jdGxfYWRkcik7CisKKwkvKiBzcGVjIG1hbmRhdGVzICI+PSAybXMiIGJlZm9yZSBjaGVja2luZyBzdGF0dXMuCisJICogV2Ugd2FpdCAxNTBtcywgYmVjYXVzZSB0aGF0IHdhcyB0aGUgbWFnaWMgZGVsYXkgdXNlZCBmb3IKKwkgKiBBVEFQSSBkZXZpY2VzIGluIEhhbGUgTGFuZGlzJ3MgQVRBRFJWUiwgZm9yIHRoZSBwZXJpb2Qgb2YgdGltZQorCSAqIGJldHdlZW4gd2hlbiB0aGUgQVRBIGNvbW1hbmQgcmVnaXN0ZXIgaXMgd3JpdHRlbiwgYW5kIHRoZW4KKwkgKiBzdGF0dXMgaXMgY2hlY2tlZC4gIEJlY2F1c2Ugd2FpdGluZyBmb3IgImEgd2hpbGUiIGJlZm9yZQorCSAqIGNoZWNraW5nIHN0YXR1cyBpcyBmaW5lLCBwb3N0IFNSU1QsIHdlIHBlcmZvcm0gdGhpcyBtYWdpYworCSAqIGRlbGF5IGhlcmUgYXMgd2VsbC4KKwkgKi8KKwltc2xlZXAgKDE1MCk7CisJc3RhdHVzID0gc2F0YV9idXN5X3dhaXQgKCZwb3J0W251bV0uaW9hZGRyLCBBVEFfQlVTWSwgMzAwKTsKKwl3aGlsZSAoKHN0YXR1cyAmIEFUQV9CVVNZKSkgeworCQltc2xlZXAgKDEwMCk7CisJCXN0YXR1cyA9IHNhdGFfYnVzeV93YWl0ICgmcG9ydFtudW1dLmlvYWRkciwgQVRBX0JVU1ksIDMpOworCX0KKworCWlmIChzdGF0dXMgJiBBVEFfQlVTWSkKKwkJcHJpbnRmICgiYXRhJXUgaXMgc2xvdyB0byByZXNwb25kLHBseiBiZSBwYXRpZW50XG4iLCBwb3J0KTsKKworCXdoaWxlICgoc3RhdHVzICYgQVRBX0JVU1kpKSB7CisJCW1zbGVlcCAoMTAwKTsKKwkJc3RhdHVzID0gc2F0YV9jaGtfc3RhdHVzICgmcG9ydFtudW1dLmlvYWRkcik7CisJfQorCisJaWYgKHN0YXR1cyAmIEFUQV9CVVNZKSB7CisJCXByaW50ZiAoImF0YSV1IGZhaWxlZCB0byByZXNwb25kIDogIiwgcG9ydCk7CisJCXByaW50ZiAoImJ1cyByZXNldCBmYWlsZWRcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK3NhdGFfaWRlbnRpZnkgKGludCBudW0sIGludCBkZXYpCit7CisJdTggY21kID0gMCwgc3RhdHVzID0gMCwgZGV2bm8gPSBudW0gKiBDRkdfU0FUQV9ERVZTX1BFUl9CVVMgKyBkZXY7CisJdTE2IGlvYnVmW0FUQV9TRUNUX1NJWkVdOworCXU2NCBuX3NlY3RvcnMgPSAwOworCXU4IG1hc2sgPSAwOworCisJbWVtc2V0IChpb2J1ZiwgMCwgc2l6ZW9mIChpb2J1ZikpOworCWhkX2RyaXZlaWRfdCAqaW9wID0gKGhkX2RyaXZlaWRfdCAqKSBpb2J1ZjsKKworCWlmIChkZXYgPT0gMCkKKwkJbWFzayA9IDB4MDE7CisJZWxzZQorCQltYXNrID0gMHgwMjsKKworCWlmICghKHBvcnRbbnVtXS5kZXZfbWFzayAmIG1hc2spKSB7CisJCXByaW50ZiAoImRldiVkIGlzIG5vdCBwcmVzZW50IG9uIHBvcnQjJWRcbiIsIGRldiwgbnVtKTsKKwkJcmV0dXJuOworCX0KKworCXByaW50ZiAoInBvcnQ9JWQgZGV2PSVkXG4iLCBudW0sIGRldik7CisKKwlkZXZfc2VsZWN0ICgmcG9ydFtudW1dLmlvYWRkciwgZGV2KTsKKworCXN0YXR1cyA9IDA7CisJY21kID0gQVRBX0NNRF9JREVOVDsJLypEZXZpY2UgSWRlbnRpZnkgQ29tbWFuZCAqLworCXNhdGFfb3V0YiAoY21kLCBwb3J0W251bV0uaW9hZGRyLmNvbW1hbmRfYWRkcik7CisJc2F0YV9pbmIgKHBvcnRbbnVtXS5pb2FkZHIuYWx0c3RhdHVzX2FkZHIpOworCXVkZWxheSAoMTApOworCisJc3RhdHVzID0gc2F0YV9idXN5X3dhaXQgKCZwb3J0W251bV0uaW9hZGRyLCBBVEFfQlVTWSwgMTAwMCk7CisJaWYgKHN0YXR1cyAmIEFUQV9FUlIpIHsKKwkJcHJpbnRmICgiXG5kZXZpY2Ugbm90IHJlc3BvbmRpbmdcbiIpOworCQlwb3J0W251bV0uZGV2X21hc2sgJj0gfm1hc2s7CisJCXJldHVybjsKKwl9CisKKwlpbnB1dF9kYXRhICgmcG9ydFtudW1dLmlvYWRkciwgKHVsb25nICopIGlvYnVmLCBBVEFfU0VDVE9SV09SRFMpOworCisJUFJJTlRGICgiXG5hdGEldTogZGV2ICV1IGNmZyA0OTolMDR4IDgyOiUwNHggODM6JTA0eCA4NDolMDR4ODU6JTA0eCIKKwkJIjg2OiUwNHgiICI4NzolMDR4IDg4OiUwNHhcbiIsIG51bSwgZGV2LCBpb2J1Zls0OV0sCisJCWlvYnVmWzgyXSwgaW9idWZbODNdLCBpb2J1Zls4NF0sIGlvYnVmWzg1XSwgaW9idWZbODZdLAorCQlpb2J1Zls4N10sIGlvYnVmWzg4XSk7CisKKwkvKiB3ZSByZXF1aXJlIExCQSBhbmQgRE1BIHN1cHBvcnQgKGJpdHMgOCAmIDkgb2Ygd29yZCA0OSkgKi8KKwlpZiAoIWF0YV9pZF9oYXNfZG1hIChpb2J1ZikgfHwgIWF0YV9pZF9oYXNfbGJhIChpb2J1ZikpIHsKKwkJUFJJTlRGICgiYXRhJXU6IG5vIGRtYS9sYmFcbiIsIG51bSk7CisJfQorCWF0YV9kdW1wX2lkIChpb2J1Zik7CisKKwlpZiAoYXRhX2lkX2hhc19sYmE0OCAoaW9idWYpKSB7CisJCW5fc2VjdG9ycyA9IGF0YV9pZF91NjQgKGlvYnVmLCAxMDApOworCX0gZWxzZSB7CisJCW5fc2VjdG9ycyA9IGF0YV9pZF91MzIgKGlvYnVmLCA2MCk7CisJfQorCVBSSU5URiAoIm5vLiBvZiBzZWN0b3JzICV1XG4iLCBhdGFfaWRfdTY0IChpb2J1ZiwgMTAwKSk7CisJUFJJTlRGICgibm8uIG9mIHNlY3RvcnMgJXVcbiIsIGF0YV9pZF91MzIgKGlvYnVmLCA2MCkpOworCisJaWYgKG5fc2VjdG9ycyA9PSAwKSB7CisJCXBvcnRbbnVtXS5kZXZfbWFzayAmPSB+bWFzazsKKwkJcmV0dXJuOworCX0KKworCXNhdGFfY3B5IChzYXRhX2Rldl9kZXNjW2Rldm5vXS5yZXZpc2lvbiwgaW9wLT5md19yZXYsCisJCSAgc2l6ZW9mIChzYXRhX2Rldl9kZXNjW2Rldm5vXS5yZXZpc2lvbikpOworCXNhdGFfY3B5IChzYXRhX2Rldl9kZXNjW2Rldm5vXS52ZW5kb3IsIGlvcC0+bW9kZWwsCisJCSAgc2l6ZW9mIChzYXRhX2Rldl9kZXNjW2Rldm5vXS52ZW5kb3IpKTsKKwlzYXRhX2NweSAoc2F0YV9kZXZfZGVzY1tkZXZub10ucHJvZHVjdCwgaW9wLT5zZXJpYWxfbm8sCisJCSAgc2l6ZW9mIChzYXRhX2Rldl9kZXNjW2Rldm5vXS5wcm9kdWN0KSk7CisJc3Ryc3dhYiAoc2F0YV9kZXZfZGVzY1tkZXZub10ucmV2aXNpb24pOworCXN0cnN3YWIgKHNhdGFfZGV2X2Rlc2NbZGV2bm9dLnZlbmRvcik7CisKKwlpZiAoKGlvcC0+Y29uZmlnICYgMHgwMDgwKSA9PSAweDAwODApIHsKKwkJc2F0YV9kZXZfZGVzY1tkZXZub10ucmVtb3ZhYmxlID0gMTsKKwl9IGVsc2UgeworCQlzYXRhX2Rldl9kZXNjW2Rldm5vXS5yZW1vdmFibGUgPSAwOworCX0KKworCXNhdGFfZGV2X2Rlc2NbZGV2bm9dLmxiYSA9IGlvcC0+bGJhX2NhcGFjaXR5OworCVBSSU5URiAoImxiYT0weCV4Iiwgc2F0YV9kZXZfZGVzY1tkZXZub10ubGJhKTsKKworI2lmZGVmIENPTkZJR19MQkE0OAorCWlmIChpb3AtPmNvbW1hbmRfc2V0XzIgJiAweDA0MDApIHsKKwkJc2F0YV9kZXZfZGVzY1tkZXZub10ubGJhNDggPSAxOworCQlsYmEgPSAodW5zaWduZWQgbG9uZyBsb25nKSBpb3AtPmxiYTQ4X2NhcGFjaXR5WzBdIHwKKwkJICAgICgodW5zaWduZWQgbG9uZyBsb25nKSBpb3AtPmxiYTQ4X2NhcGFjaXR5WzFdIDw8IDE2KSB8CisJCSAgICAoKHVuc2lnbmVkIGxvbmcgbG9uZykgaW9wLT5sYmE0OF9jYXBhY2l0eVsyXSA8PCAzMikgfAorCQkgICAgKCh1bnNpZ25lZCBsb25nIGxvbmcpIGlvcC0+bGJhNDhfY2FwYWNpdHlbM10gPDwgNDgpOworCX0gZWxzZSB7CisJCXNhdGFfZGV2X2Rlc2NbZGV2bm9dLmxiYTQ4ID0gMDsKKwl9CisjZW5kaWYKKworCS8qIGFzc3VtaW5nIEhEICovCisJc2F0YV9kZXZfZGVzY1tkZXZub10udHlwZSA9IERFVl9UWVBFX0hBUkRESVNLOworCXNhdGFfZGV2X2Rlc2NbZGV2bm9dLmJsa3N6ID0gQVRBX0JMT0NLU0laRTsKKwlzYXRhX2Rldl9kZXNjW2Rldm5vXS5sdW4gPSAwOwkvKiBqdXN0IHRvIGZpbGwgc29tZXRoaW5nIGluLi4uICovCit9CisKK3ZvaWQKK3NldF9GZWF0dXJlX2NtZCAoaW50IG51bSwgaW50IGRldikKK3sKKwl1OCBtYXNrID0gMHgwMCwgc3RhdHVzID0gMDsKKworCWlmIChkZXYgPT0gMCkKKwkJbWFzayA9IDB4MDE7CisJZWxzZQorCQltYXNrID0gMHgwMjsKKworCWlmICghKHBvcnRbbnVtXS5kZXZfbWFzayAmIG1hc2spKSB7CisJCVBSSU5URiAoImRldiVkIGlzIG5vdCBwcmVzZW50IG9uIHBvcnQjJWRcbiIsIGRldiwgbnVtKTsKKwkJcmV0dXJuOworCX0KKworCWRldl9zZWxlY3QgKCZwb3J0W251bV0uaW9hZGRyLCBkZXYpOworCisJc2F0YV9vdXRiIChTRVRGRUFUVVJFU19YRkVSLCBwb3J0W251bV0uaW9hZGRyLmZlYXR1cmVfYWRkcik7CisJc2F0YV9vdXRiIChYRkVSX1BJT180LCBwb3J0W251bV0uaW9hZGRyLm5zZWN0X2FkZHIpOworCXNhdGFfb3V0YiAoMCwgcG9ydFtudW1dLmlvYWRkci5sYmFsX2FkZHIpOworCXNhdGFfb3V0YiAoMCwgcG9ydFtudW1dLmlvYWRkci5sYmFtX2FkZHIpOworCXNhdGFfb3V0YiAoMCwgcG9ydFtudW1dLmlvYWRkci5sYmFoX2FkZHIpOworCisJc2F0YV9vdXRiIChBVEFfREVWSUNFX09CUywgcG9ydFtudW1dLmlvYWRkci5kZXZpY2VfYWRkcik7CisJc2F0YV9vdXRiIChBVEFfQ01EX1NFVEYsIHBvcnRbbnVtXS5pb2FkZHIuY29tbWFuZF9hZGRyKTsKKworCXVkZWxheSAoNTApOworCW1zbGVlcCAoMTUwKTsKKworCXN0YXR1cyA9IHNhdGFfYnVzeV93YWl0ICgmcG9ydFtudW1dLmlvYWRkciwgQVRBX0JVU1ksIDUwMDApOworCWlmICgoc3RhdHVzICYgKEFUQV9TVEFUX0JVU1kgfCBBVEFfU1RBVF9FUlIpKSkgeworCQlwcmludGYgKCJFcnJvciAgOiBzdGF0dXMgMHglMDJ4XG4iLCBzdGF0dXMpOworCQlwb3J0W251bV0uZGV2X21hc2sgJj0gfm1hc2s7CisJfQorfQorCit2b2lkCitzYXRhX3BvcnQgKHN0cnVjdCBzYXRhX2lvcG9ydHMgKmlvcG9ydCkKK3sKKwlpb3BvcnQtPmRhdGFfYWRkciA9IGlvcG9ydC0+Y21kX2FkZHIgKyBBVEFfUkVHX0RBVEE7CisJaW9wb3J0LT5lcnJvcl9hZGRyID0gaW9wb3J0LT5jbWRfYWRkciArIEFUQV9SRUdfRVJSOworCWlvcG9ydC0+ZmVhdHVyZV9hZGRyID0gaW9wb3J0LT5jbWRfYWRkciArIEFUQV9SRUdfRkVBVFVSRTsKKwlpb3BvcnQtPm5zZWN0X2FkZHIgPSBpb3BvcnQtPmNtZF9hZGRyICsgQVRBX1JFR19OU0VDVDsKKwlpb3BvcnQtPmxiYWxfYWRkciA9IGlvcG9ydC0+Y21kX2FkZHIgKyBBVEFfUkVHX0xCQUw7CisJaW9wb3J0LT5sYmFtX2FkZHIgPSBpb3BvcnQtPmNtZF9hZGRyICsgQVRBX1JFR19MQkFNOworCWlvcG9ydC0+bGJhaF9hZGRyID0gaW9wb3J0LT5jbWRfYWRkciArIEFUQV9SRUdfTEJBSDsKKwlpb3BvcnQtPmRldmljZV9hZGRyID0gaW9wb3J0LT5jbWRfYWRkciArIEFUQV9SRUdfREVWSUNFOworCWlvcG9ydC0+c3RhdHVzX2FkZHIgPSBpb3BvcnQtPmNtZF9hZGRyICsgQVRBX1JFR19TVEFUVVM7CisJaW9wb3J0LT5jb21tYW5kX2FkZHIgPSBpb3BvcnQtPmNtZF9hZGRyICsgQVRBX1JFR19DTUQ7Cit9CisKK2ludAorc2F0YV9kZXZjaGsgKHN0cnVjdCBzYXRhX2lvcG9ydHMgKmlvYWRkciwgaW50IGRldikKK3sKKwl1OCBuc2VjdCwgbGJhbDsKKworCWRldl9zZWxlY3QgKGlvYWRkciwgZGV2KTsKKworCXNhdGFfb3V0YiAoMHg1NSwgaW9hZGRyLT5uc2VjdF9hZGRyKTsKKwlzYXRhX291dGIgKDB4YWEsIGlvYWRkci0+bGJhbF9hZGRyKTsKKworCXNhdGFfb3V0YiAoMHhhYSwgaW9hZGRyLT5uc2VjdF9hZGRyKTsKKwlzYXRhX291dGIgKDB4NTUsIGlvYWRkci0+bGJhbF9hZGRyKTsKKworCXNhdGFfb3V0YiAoMHg1NSwgaW9hZGRyLT5uc2VjdF9hZGRyKTsKKwlzYXRhX291dGIgKDB4YWEsIGlvYWRkci0+bGJhbF9hZGRyKTsKKworCW5zZWN0ID0gc2F0YV9pbmIgKGlvYWRkci0+bnNlY3RfYWRkcik7CisJbGJhbCA9IHNhdGFfaW5iIChpb2FkZHItPmxiYWxfYWRkcik7CisKKwlpZiAoKG5zZWN0ID09IDB4NTUpICYmIChsYmFsID09IDB4YWEpKQorCQlyZXR1cm4gMTsJLyogd2UgZm91bmQgYSBkZXZpY2UgKi8KKwllbHNlCisJCXJldHVybiAwOwkvKiBub3RoaW5nIGZvdW5kICovCit9CisKK3ZvaWQKK2Rldl9zZWxlY3QgKHN0cnVjdCBzYXRhX2lvcG9ydHMgKmlvYWRkciwgaW50IGRldikKK3sKKwl1OCB0bXAgPSAwOworCisJaWYgKGRldiA9PSAwKQorCQl0bXAgPSBBVEFfREVWSUNFX09CUzsKKwllbHNlCisJCXRtcCA9IEFUQV9ERVZJQ0VfT0JTIHwgQVRBX0RFVjE7CisKKwlzYXRhX291dGIgKHRtcCwgaW9hZGRyLT5kZXZpY2VfYWRkcik7CisJc2F0YV9pbmIgKGlvYWRkci0+YWx0c3RhdHVzX2FkZHIpOworCXVkZWxheSAoNSk7Cit9CisKK3U4CitzYXRhX2J1c3lfd2FpdCAoc3RydWN0IHNhdGFfaW9wb3J0cyAqaW9hZGRyLCBpbnQgYml0cywgdW5zaWduZWQgaW50IG1heCkKK3sKKwl1OCBzdGF0dXM7CisKKwlkbyB7CisJCXVkZWxheSAoMTAwMCk7CisJCXN0YXR1cyA9IHNhdGFfY2hrX3N0YXR1cyAoaW9hZGRyKTsKKwkJbWF4LS07CisJfSB3aGlsZSAoKHN0YXR1cyAmIGJpdHMpICYmIChtYXggPiAwKSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCit1OAorc2F0YV9jaGtfc3RhdHVzIChzdHJ1Y3Qgc2F0YV9pb3BvcnRzICogaW9hZGRyKQoreworCXJldHVybiBzYXRhX2luYiAoaW9hZGRyLT5zdGF0dXNfYWRkcik7Cit9CisKK3ZvaWQKK21zbGVlcCAoaW50IGNvdW50KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCXVkZWxheSAoMTAwMCk7Cit9CisKK3Vsb25nCitzYXRhX3JlYWQgKGludCBkZXZpY2UsIHVsb25nIGJsa25yLGxiYWludF90IGJsa2NudCwgdm9pZCAqIGJ1ZmYpCit7CisJdWxvbmcgbiA9IDAsICpidWZmZXIgPSAodWxvbmcgKilidWZmOworCXU4IGRldiA9IDAsIG51bSA9IDAsIG1hc2sgPSAwLCBzdGF0dXMgPSAwOworCisjaWZkZWYgQ09ORklHX0xCQTQ4CisJdW5zaWduZWQgY2hhciBsYmE0OCA9IDA7CisKKwlpZiAoYmxrbnIgJiAweDAwMDBmZmZmZjAwMDAwMDApIHsKKwkJaWYgKCFzYXRhX2Rldl9kZXNjW2Rldm5vXS5sYmE0OCkgeworCQkJcHJpbnRmICgiRHJpdmUgZG9lc24ndCBzdXBwb3J0IDQ4LWJpdCBhZGRyZXNzaW5nXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCS8qIG1vcmUgdGhhbiAyOCBiaXRzIHVzZWQsIHVzZSA0OGJpdCBtb2RlICovCisJCWxiYTQ4ID0gMTsKKwl9CisjZW5kaWYKKwkvKlBvcnQgTnVtYmVyICovCisJbnVtID0gZGV2aWNlIC8gQ0ZHX1NBVEFfREVWU19QRVJfQlVTOworCS8qZGV2IG9uIHRoZSBwb3J0ICovCisJaWYgKGRldmljZSA+PSBDRkdfU0FUQV9ERVZTX1BFUl9CVVMpCisJCWRldiA9IGRldmljZSAtIENGR19TQVRBX0RFVlNfUEVSX0JVUzsKKwllbHNlCisJCWRldiA9IGRldmljZTsKKworCWlmIChkZXYgPT0gMCkKKwkJbWFzayA9IDB4MDE7CisJZWxzZQorCQltYXNrID0gMHgwMjsKKworCWlmICghKHBvcnRbbnVtXS5kZXZfbWFzayAmIG1hc2spKSB7CisJCXByaW50ZiAoImRldiVkIGlzIG5vdCBwcmVzZW50IG9uIHBvcnQjJWRcbiIsIGRldiwgbnVtKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogU2VsZWN0IGRldmljZSAqLworCWRldl9zZWxlY3QgKCZwb3J0W251bV0uaW9hZGRyLCBkZXYpOworCisJc3RhdHVzID0gc2F0YV9idXN5X3dhaXQgKCZwb3J0W251bV0uaW9hZGRyLCBBVEFfQlVTWSwgNTAwKTsKKwlpZiAoc3RhdHVzICYgQVRBX0JVU1kpIHsKKwkJcHJpbnRmICgiYXRhJXUgZmFpbGVkIHRvIHJlc3BvbmRcbiIsIHBvcnRbbnVtXS5wb3J0X25vKTsKKwkJcmV0dXJuIG47CisJfQorCXdoaWxlIChibGtjbnQtLSA+IDApIHsKKwkJc3RhdHVzID0gc2F0YV9idXN5X3dhaXQgKCZwb3J0W251bV0uaW9hZGRyLCBBVEFfQlVTWSwgNTAwKTsKKwkJaWYgKHN0YXR1cyAmIEFUQV9CVVNZKSB7CisJCQlwcmludGYgKCJhdGEldSBmYWlsZWQgdG8gcmVzcG9uZFxuIiwgMCk7CisJCQlyZXR1cm4gbjsKKwkJfQorI2lmZGVmIENPTkZJR19MQkE0OAorCQlpZiAobGJhNDgpIHsKKwkJCS8qIHdyaXRlIGhpZ2ggYml0cyAqLworCQkJc2F0YV9vdXRiICgwLCBwb3J0W251bV0uaW9hZGRyLm5zZWN0X2FkZHIpOworCQkJc2F0YV9vdXRiICgoYmxrbnIgPj4gMjQpICYgMHhGRiwKKwkJCQkgICBwb3J0W251bV0uaW9hZGRyLmxiYWxfYWRkcik7CisJCQlzYXRhX291dGIgKChibGtuciA+PiAzMikgJiAweEZGLAorCQkJCSAgIHBvcnRbbnVtXS5pb2FkZHIubGJhbV9hZGRyKTsKKwkJCXNhdGFfb3V0YiAoKGJsa25yID4+IDQwKSAmIDB4RkYsCisJCQkJICAgcG9ydFtudW1dLmlvYWRkci5sYmFoX2FkZHIpOworCQl9CisjZW5kaWYKKwkJc2F0YV9vdXRiICgxLCBwb3J0W251bV0uaW9hZGRyLm5zZWN0X2FkZHIpOworCQlzYXRhX291dGIgKCgoYmxrbnIpID4+IDApICYgMHhGRiwKKwkJCSAgIHBvcnRbbnVtXS5pb2FkZHIubGJhbF9hZGRyKTsKKwkJc2F0YV9vdXRiICgoYmxrbnIgPj4gOCkgJiAweEZGLCBwb3J0W251bV0uaW9hZGRyLmxiYW1fYWRkcik7CisJCXNhdGFfb3V0YiAoKGJsa25yID4+IDE2KSAmIDB4RkYsIHBvcnRbbnVtXS5pb2FkZHIubGJhaF9hZGRyKTsKKworI2lmZGVmIENPTkZJR19MQkE0OAorCQlpZiAobGJhNDgpIHsKKwkJCXNhdGFfb3V0YiAoQVRBX0xCQSwgcG9ydFtudW1dLmlvYWRkci5kZXZpY2VfYWRkcik7CisJCQlzYXRhX291dGIgKEFUQV9DTURfUkVBRF9FWFQsCisJCQkJICAgcG9ydFtudW1dLmlvYWRkci5jb21tYW5kX2FkZHIpOworCQl9IGVsc2UKKyNlbmRpZgorCQl7CisJCQlzYXRhX291dGIgKEFUQV9MQkEgfCAoKGJsa25yID4+IDI0KSAmIDB4RiksCisJCQkJICAgcG9ydFtudW1dLmlvYWRkci5kZXZpY2VfYWRkcik7CisJCQlzYXRhX291dGIgKEFUQV9DTURfUkVBRCwKKwkJCQkgICBwb3J0W251bV0uaW9hZGRyLmNvbW1hbmRfYWRkcik7CisJCX0KKworCQltc2xlZXAgKDUwKTsKKwkJLyptYXkgdGFrZSB1cCB0byA0IHNlYyAqLworCQlzdGF0dXMgPSBzYXRhX2J1c3lfd2FpdCAoJnBvcnRbbnVtXS5pb2FkZHIsIEFUQV9CVVNZLCA0MDAwKTsKKworCQlpZiAoKHN0YXR1cyAmIChBVEFfU1RBVF9EUlEgfCBBVEFfU1RBVF9CVVNZIHwgQVRBX1NUQVRfRVJSKSkKKwkJICAgICE9IEFUQV9TVEFUX0RSUSkgeworCQkJdTggZXJyID0gMDsKKworCQkJcHJpbnRmICgiRXJyb3Igbm8gRFJRIGRldiAlZCBibGsgJWxkOiBzdHMgMHglMDJ4XG4iLAorCQkJCWRldmljZSwgKHVsb25nKSBibGtuciwgc3RhdHVzKTsKKwkJCWVyciA9IHNhdGFfaW5iIChwb3J0W251bV0uaW9hZGRyLmVycm9yX2FkZHIpOworCQkJcHJpbnRmICgiRXJyb3IgcmVnID0gMHgleFxuIiwgZXJyKTsKKwkJCXJldHVybiAobik7CisJCX0KKwkJaW5wdXRfZGF0YSAoJnBvcnRbbnVtXS5pb2FkZHIsIGJ1ZmZlciwgQVRBX1NFQ1RPUldPUkRTKTsKKwkJc2F0YV9pbmIgKHBvcnRbbnVtXS5pb2FkZHIuYWx0c3RhdHVzX2FkZHIpOworCQl1ZGVsYXkgKDUwKTsKKworCQkrK247CisJCSsrYmxrbnI7CisJCWJ1ZmZlciArPSBBVEFfU0VDVE9SV09SRFM7CisJfQorCXJldHVybiBuOworfQorCit1bG9uZworc2F0YV93cml0ZSAoaW50IGRldmljZSwgdWxvbmcgYmxrbnIsbGJhaW50X3QgYmxrY250LCB2b2lkICogYnVmZikKK3sKKwl1bG9uZyBuID0gMCwgKmJ1ZmZlciA9ICh1bG9uZyAqKWJ1ZmY7CisJdW5zaWduZWQgY2hhciBzdGF0dXMgPSAwLCBudW0gPSAwLCBkZXYgPSAwLCBtYXNrID0gMDsKKworI2lmZGVmIENPTkZJR19MQkE0OAorCXVuc2lnbmVkIGNoYXIgbGJhNDggPSAwOworCisJaWYgKGJsa25yICYgMHgwMDAwZmZmZmYwMDAwMDAwKSB7CisJCWlmICghc2F0YV9kZXZfZGVzY1tkZXZub10ubGJhNDgpIHsKKwkJCXByaW50ZiAoIkRyaXZlIGRvZXNuJ3Qgc3VwcG9ydCA0OC1iaXQgYWRkcmVzc2luZ1xuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBtb3JlIHRoYW4gMjggYml0cyB1c2VkLCB1c2UgNDhiaXQgbW9kZSAqLworCQlsYmE0OCA9IDE7CisJfQorI2VuZGlmCisJLypQb3J0IE51bWJlciAqLworCW51bSA9IGRldmljZSAvIENGR19TQVRBX0RFVlNfUEVSX0JVUzsKKwkvKmRldiBvbiB0aGUgUG9ydCAqLworCWlmIChkZXZpY2UgPj0gQ0ZHX1NBVEFfREVWU19QRVJfQlVTKQorCQlkZXYgPSBkZXZpY2UgLSBDRkdfU0FUQV9ERVZTX1BFUl9CVVM7CisJZWxzZQorCQlkZXYgPSBkZXZpY2U7CisKKwlpZiAoZGV2ID09IDApCisJCW1hc2sgPSAweDAxOworCWVsc2UKKwkJbWFzayA9IDB4MDI7CisKKwkvKiBTZWxlY3QgZGV2aWNlICovCisJZGV2X3NlbGVjdCAoJnBvcnRbbnVtXS5pb2FkZHIsIGRldik7CisKKwlzdGF0dXMgPSBzYXRhX2J1c3lfd2FpdCAoJnBvcnRbbnVtXS5pb2FkZHIsIEFUQV9CVVNZLCA1MDApOworCWlmIChzdGF0dXMgJiBBVEFfQlVTWSkgeworCQlwcmludGYgKCJhdGEldSBmYWlsZWQgdG8gcmVzcG9uZFxuIiwgcG9ydFtudW1dLnBvcnRfbm8pOworCQlyZXR1cm4gbjsKKwl9CisKKwl3aGlsZSAoYmxrY250LS0gPiAwKSB7CisJCXN0YXR1cyA9IHNhdGFfYnVzeV93YWl0ICgmcG9ydFtudW1dLmlvYWRkciwgQVRBX0JVU1ksIDUwMCk7CisJCWlmIChzdGF0dXMgJiBBVEFfQlVTWSkgeworCQkJcHJpbnRmICgiYXRhJXUgZmFpbGVkIHRvIHJlc3BvbmRcbiIsCisJCQkJcG9ydFtudW1dLnBvcnRfbm8pOworCQkJcmV0dXJuIG47CisJCX0KKyNpZmRlZiBDT05GSUdfTEJBNDgKKwkJaWYgKGxiYTQ4KSB7CisJCQkvKiB3cml0ZSBoaWdoIGJpdHMgKi8KKwkJCXNhdGFfb3V0YiAoMCwgcG9ydFtudW1dLmlvYWRkci5uc2VjdF9hZGRyKTsKKwkJCXNhdGFfb3V0YiAoKGJsa25yID4+IDI0KSAmIDB4RkYsCisJCQkJICAgcG9ydFtudW1dLmlvYWRkci5sYmFsX2FkZHIpOworCQkJc2F0YV9vdXRiICgoYmxrbnIgPj4gMzIpICYgMHhGRiwKKwkJCQkgICBwb3J0W251bV0uaW9hZGRyLmxiYW1fYWRkcik7CisJCQlzYXRhX291dGIgKChibGtuciA+PiA0MCkgJiAweEZGLAorCQkJCSAgIHBvcnRbbnVtXS5pb2FkZHIubGJhaF9hZGRyKTsKKwkJfQorI2VuZGlmCisJCXNhdGFfb3V0YiAoMSwgcG9ydFtudW1dLmlvYWRkci5uc2VjdF9hZGRyKTsKKwkJc2F0YV9vdXRiICgoYmxrbnIgPj4gMCkgJiAweEZGLCBwb3J0W251bV0uaW9hZGRyLmxiYWxfYWRkcik7CisJCXNhdGFfb3V0YiAoKGJsa25yID4+IDgpICYgMHhGRiwgcG9ydFtudW1dLmlvYWRkci5sYmFtX2FkZHIpOworCQlzYXRhX291dGIgKChibGtuciA+PiAxNikgJiAweEZGLCBwb3J0W251bV0uaW9hZGRyLmxiYWhfYWRkcik7CisjaWZkZWYgQ09ORklHX0xCQTQ4CisJCWlmIChsYmE0OCkgeworCQkJc2F0YV9vdXRiIChBVEFfTEJBLCBwb3J0W251bV0uaW9hZGRyLmRldmljZV9hZGRyKTsKKwkJCXNhdGFfb3V0YiAoQVRBX0NNRF9XUklURV9FWFQsCisJCQkJICAgcG9ydFtudW1dLmlvYWRkci5jb21tYW5kX2FkZHIpOworCQl9IGVsc2UKKyNlbmRpZgorCQl7CisJCQlzYXRhX291dGIgKEFUQV9MQkEgfCAoKGJsa25yID4+IDI0KSAmIDB4RiksCisJCQkJICAgcG9ydFtudW1dLmlvYWRkci5kZXZpY2VfYWRkcik7CisJCQlzYXRhX291dGIgKEFUQV9DTURfV1JJVEUsCisJCQkJICAgcG9ydFtudW1dLmlvYWRkci5jb21tYW5kX2FkZHIpOworCQl9CisKKwkJbXNsZWVwICg1MCk7CisJCS8qbWF5IHRha2UgdXAgdG8gNCBzZWMgKi8KKwkJc3RhdHVzID0gc2F0YV9idXN5X3dhaXQgKCZwb3J0W251bV0uaW9hZGRyLCBBVEFfQlVTWSwgNDAwMCk7CisJCWlmICgoc3RhdHVzICYgKEFUQV9TVEFUX0RSUSB8IEFUQV9TVEFUX0JVU1kgfCBBVEFfU1RBVF9FUlIpKQorCQkgICAgIT0gQVRBX1NUQVRfRFJRKSB7CisJCQlwcmludGYgKCJFcnJvciBubyBEUlEgZGV2ICVkIGJsayAlbGQ6IHN0cyAweCUwMnhcbiIsCisJCQkJZGV2aWNlLCAodWxvbmcpIGJsa25yLCBzdGF0dXMpOworCQkJcmV0dXJuIChuKTsKKwkJfQorCisJCW91dHB1dF9kYXRhICgmcG9ydFtudW1dLmlvYWRkciwgYnVmZmVyLCBBVEFfU0VDVE9SV09SRFMpOworCQlzYXRhX2luYiAocG9ydFtudW1dLmlvYWRkci5hbHRzdGF0dXNfYWRkcik7CisJCXVkZWxheSAoNTApOworCisJCSsrbjsKKwkJKytibGtucjsKKwkJYnVmZmVyICs9IEFUQV9TRUNUT1JXT1JEUzsKKwl9CisJcmV0dXJuIG47Cit9CisKK2Jsb2NrX2Rldl9kZXNjX3QgKnNhdGFfZ2V0X2RldiAoaW50IGRldik7CisKK2Jsb2NrX2Rldl9kZXNjX3QgKgorc2F0YV9nZXRfZGV2IChpbnQgZGV2KQoreworCXJldHVybiAoKGJsb2NrX2Rldl9kZXNjX3QgKikgJiBzYXRhX2Rldl9kZXNjW2Rldl0pOworfQorCitpbnQKK2RvX3NhdGEgKGNtZF90YmxfdCAqIGNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKworCXN3aXRjaCAoYXJnYykgeworCWNhc2UgMDoKKwljYXNlIDE6CisJCXByaW50ZiAoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CisJCXJldHVybiAxOworCWNhc2UgMjoKKwkJaWYgKHN0cm5jbXAgKGFyZ3ZbMV0sICJpbml0IiwgNCkgPT0gMCkgeworCQkJaW50IHJjb2RlID0gMDsKKworCQkJcmNvZGUgPSBpbml0X3NhdGEgKCk7CisJCQlpZiAocmNvZGUpCisJCQkJcHJpbnRmICgiU2F0YSBpbml0aWFsaXphdGlvbiBGYWlsZWRcbiIpOworCQkJcmV0dXJuIHJjb2RlOworCQl9IGVsc2UgaWYgKHN0cm5jbXAgKGFyZ3ZbMV0sICJpbmYiLCAzKSA9PSAwKSB7CisJCQlpbnQgaTsKKworCQkJcHV0YyAoJ1xuJyk7CisJCQlmb3IgKGkgPSAwOyBpIDwgQ0ZHX1NBVEFfTUFYREVWSUNFUzsgKytpKSB7CisJCQkJLypMaXN0IG9ubHkga25vd24gZGV2aWNlcyAqLworCQkJCWlmIChzYXRhX2Rldl9kZXNjW2ldLnR5cGUgPT0KKwkJCQkgICAgREVWX1RZUEVfVU5LTk9XTikKKwkJCQkJY29udGludWU7CisJCQkJcHJpbnRmICgic2F0YSBkZXYgJWQ6ICIsIGkpOworCQkJCWRldl9wcmludCAoJnNhdGFfZGV2X2Rlc2NbaV0pOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKwkJcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKKwkJcmV0dXJuIDE7CisJY2FzZSAzOgorCQlpZiAoc3RyY21wIChhcmd2WzFdLCAiZGV2IikgPT0gMCkgeworCQkJaW50IGRldiA9IChpbnQpIHNpbXBsZV9zdHJ0b3VsIChhcmd2WzJdLCBOVUxMLCAxMCk7CisKKwkJCWlmIChkZXYgPj0gQ0ZHX1NBVEFfTUFYREVWSUNFUykgeworCQkJCXByaW50ZiAoIlxuU2F0YSBkZXYgJWQgbm90IGF2YWlsYWJsZVxuIiwKKwkJCQkJZGV2KTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCXByaW50ZiAoIlxuU0FUQSBkZXYgJWQ6ICIsIGRldik7CisJCQlkZXZfcHJpbnQgKCZzYXRhX2Rldl9kZXNjW2Rldl0pOworCQkJaWYgKHNhdGFfZGV2X2Rlc2NbZGV2XS50eXBlID09IERFVl9UWVBFX1VOS05PV04pCisJCQkJcmV0dXJuIDE7CisJCQljdXJyX2RldiA9IGRldjsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKHN0cmNtcCAoYXJndlsxXSwgInBhcnQiKSA9PSAwKSB7CisJCQlpbnQgZGV2ID0gKGludCkgc2ltcGxlX3N0cnRvdWwgKGFyZ3ZbMl0sIE5VTEwsIDEwKTsKKworCQkJaWYgKGRldiA+PSBDRkdfU0FUQV9NQVhERVZJQ0VTKSB7CisJCQkJcHJpbnRmICgiXG5TYXRhIGRldiAlZCBub3QgYXZhaWxhYmxlXG4iLAorCQkJCQlkZXYpOworCQkJCXJldHVybiAxOworCQkJfQorCQkJUFJJTlRGICgiXG5TQVRBIGRldiAlZDogIiwgZGV2KTsKKwkJCWlmIChzYXRhX2Rldl9kZXNjW2Rldl0ucGFydF90eXBlICE9CisJCQkgICAgUEFSVF9UWVBFX1VOS05PV04pIHsKKwkJCQlwcmludF9wYXJ0ICgmc2F0YV9kZXZfZGVzY1tkZXZdKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRmICgiXG5TYXRhIGRldiAlZCBwYXJ0aXRpb24gdHlwZSAiCisJCQkJCSJ1bmtub3duXG4iLCBkZXYpOworCQkJCXJldHVybiAxOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKwkJcHJpbnRmICgiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKKwkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJaWYgKGFyZ2MgPCA1KSB7CisJCQlwcmludGYgKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKHN0cmNtcCAoYXJndlsxXSwgInJlYWQiKSA9PSAwKSB7CisJCQl1bG9uZyBhZGRyID0gc2ltcGxlX3N0cnRvdWwgKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKKwkJCXVsb25nIGNudCA9IHNpbXBsZV9zdHJ0b3VsIChhcmd2WzRdLCBOVUxMLCAxNik7CisJCQl1bG9uZyBuOworCQkJbGJhaW50X3QgYmxrID0gc2ltcGxlX3N0cnRvdWwgKGFyZ3ZbM10sIE5VTEwsIDE2KTsKKworCQkJbWVtc2V0ICgoaW50ICopIGFkZHIsIDAsIGNudCAqIDUxMik7CisJCQlwcmludGYgKCJcblNBVEEgcmVhZDogZGV2ICVkIGJsayAjICVsZCwiCisJCQkJImNvdW50ICVsZCAuLi4gIiwgY3Vycl9kZXYsIGJsaywgY250KTsKKwkJCW4gPSBzYXRhX3JlYWQgKGN1cnJfZGV2LCBibGssIGNudCwgKHVsb25nICopIGFkZHIpOworCQkJLyogZmx1c2ggY2FjaGUgYWZ0ZXIgcmVhZCAqLworCQkJZmx1c2hfY2FjaGUgKGFkZHIsIGNudCAqIDUxMik7CisJCQlwcmludGYgKCIlbGQgYmxvY2tzIHJlYWQ6ICVzXG4iLCBuLAorCQkJCShuID09IGNudCkgPyAiT0siIDogIkVSUiIpOworCQkJaWYgKG4gPT0gY250KQorCQkJCXJldHVybiAxOworCQkJZWxzZQorCQkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKHN0cmNtcCAoYXJndlsxXSwgIndyaXRlIikgPT0gMCkgeworCQkJdWxvbmcgYWRkciA9IHNpbXBsZV9zdHJ0b3VsIChhcmd2WzJdLCBOVUxMLCAxNik7CisJCQl1bG9uZyBjbnQgPSBzaW1wbGVfc3RydG91bCAoYXJndls0XSwgTlVMTCwgMTYpOworCQkJdWxvbmcgbjsKKwkJCWxiYWludF90IGJsayA9IHNpbXBsZV9zdHJ0b3VsIChhcmd2WzNdLCBOVUxMLCAxNik7CisKKwkJCXByaW50ZiAoIlxuU2F0YSB3cml0ZTogZGV2ICVkIGJsayAjICVsZCwiCisJCQkJImNvdW50ICVsZCAuLi4gIiwgY3Vycl9kZXYsIGJsaywgY250KTsKKwkJCW4gPSBzYXRhX3dyaXRlIChjdXJyX2RldiwgYmxrLCBjbnQsICh1bG9uZyAqKSBhZGRyKTsKKwkJCXByaW50ZiAoIiVsZCBibG9ja3Mgd3JpdHRlbjogJXNcbiIsIG4sCisJCQkJKG4gPT0gY250KSA/ICJPSyIgOiAiRVJSIik7CisJCQlpZiAobiA9PSBjbnQpCisJCQkJcmV0dXJuIDE7CisJCQllbHNlCisJCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlwcmludGYgKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CQkJLypFbmQgT0YgU1dJVENIICovCit9CisKK1VfQk9PVF9DTUQgKHNhdGEsIDUsIDEsIGRvX3NhdGEsCisJICAgICJzYXRhIGluaXRcbiIKKwkgICAgInNhdGEgaW5mb1xuIgorCSAgICAic2F0YSBwYXJ0IGRldmljZVxuIgorCSAgICAic2F0YSBkZXYgZGV2aWNlXG4iCisJICAgICJzYXRhIHJlYWQgIGFkZHIgYmxrIyBjbnRcbiIKKwkgICAgInNhdGEgd3JpdGUgIGFkZHIgYmxrIyBjbnRcbiIsICJjbWQgZm9yIGluaXQscncgYW5kIGRldi1pbmZvXG4iKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vY21kX3Njc2kuYyBiL2NvbW1vbi9jbWRfc2NzaS5jCmluZGV4IDAwYjg0ZmEuLmY1NjM5MzEgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfc2NzaS5jCisrKyBiL2NvbW1vbi9jbWRfc2NzaS5jCkBAIC0zNCw3ICszNCw3IEBACiAjaW5jbHVkZSA8aW1hZ2UuaD4KICNpbmNsdWRlIDxwY2kuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NDU0kpCiAKICNpZmRlZiBDT05GSUdfU0NTSV9TWU01M0M4WFgKICNkZWZpbmUgU0NTSV9WRU5EX0lECTB4MTAwMApAQCAtNjA5LDQgKzYwOSw0IEBACiAJImxvYWRBZGRyIGRldjpwYXJ0XG4iCiApOwogCi0jZW5kaWYgLyogI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfc3BpLmMgYi9jb21tb24vY21kX3NwaS5jCmluZGV4IGE2ZmRmN2YuLjMxMThkMjcgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfc3BpLmMKKysrIGIvY29tbW9uL2NtZF9zcGkuYwpAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDxzcGkuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NQSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU1BJKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBEZWZpbml0aW9ucwpAQCAtMTQwLDQgKzE0MCw0IEBACiAJIjxkb3V0PiAgICAtIEhleGFkZWNpbWFsIHN0cmluZyB0aGF0IGdldHMgc2VudFxuIgogKTsKIAotI2VuZGlmCS8qIENGR19DTURfU1BJICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfdW5pdmVyc2UuYyBiL2NvbW1vbi9jbWRfdW5pdmVyc2UuYwppbmRleCA4ZDdiNmZlLi44YmYwYjFmIDEwMDY0NAotLS0gYS9jb21tb24vY21kX3VuaXZlcnNlLmMKKysrIGIvY29tbW9uL2NtZF91bml2ZXJzZS5jCkBAIC0yOCw3ICsyOCw3IEBACiAKICNpbmNsdWRlIDx1bml2ZXJzZS5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfVU5JVkVSU0UpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1VOSVZFUlNFKQogCiAjZGVmaW5lIFBDSV9WRU5ET1IgUENJX1ZFTkRPUl9JRF9UVU5EUkEKICNkZWZpbmUgUENJX0RFVklDRSBQQ0lfREVWSUNFX0lEX1RVTkRSQV9DQTkxQzA0MgpAQCAtMzg3LDQgKzM4Nyw0IEBACiAJIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDMgLT4gRDMyIERhdGEgV2lkdGhcbiIKICk7CiAKLSNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9VTklWRVJTRSkgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF91c2IuYyBiL2NvbW1vbi9jbWRfdXNiLmMKaW5kZXggOTA0ZGY3MS4uNDVlMDdmMSAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF91c2IuYworKysgYi9jb21tb24vY21kX3VzYi5jCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPHBhcnQuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfVVNCKQogCiAjaW5jbHVkZSA8dXNiLmg+CiAKQEAgLTYwOSwxMCArNjA5LDEwIEBACiB9CiAKIAotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikgKi8KKyNlbmRpZgogCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9VU0IpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1VTQikKIAogI2lmZGVmIENPTkZJR19VU0JfU1RPUkFHRQogVV9CT09UX0NNRCgKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfdmZkLmMgYi9jb21tb24vY21kX3ZmZC5jCmluZGV4IDVlNjIzYTIuLjI5YzM0OWQgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jbWRfdmZkLmMKKysrIGIvY29tbW9uL2NtZF92ZmQuYwpAQCAtMzUsNyArMzUsNyBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1ZGRCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfVkZEKQogCiAjaW5jbHVkZSA8dmZkX2xvZ28uaD4KICNkZWZpbmUgVkZEX1RFU1RfTE9HT19CTVBOUiAwCkBAIC03Myw3ICs3Myw3IEBACiAJInZmZCBBRERSXG4iCiAJIiAgICAtIGxvYWQgYml0bWFwIGF0IGFkZHJlc3MgQUREUlxuIgogKTsKLSNlbmRpZgkvKiBDRkdfQ01EX1ZGRCAqLworI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfVkZECiBpbnQgdHJhYl92ZmQgKHVsb25nIGJpdG1hcCkKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfeGltZy5jIGIvY29tbW9uL2NtZF94aW1nLmMKaW5kZXggODM1OTE1My4uNTJlMDYxNCAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF94aW1nLmMKKysrIGIvY29tbW9uL2NtZF94aW1nLmMKQEAgLTI0LDcgKzI0LDcgQEAKICAqIE1BIDAyMTExLTEzMDcgVVNBCiAgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1hJTUcpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1hJTUcpCiAKIC8qCiAgKiBNdWx0aSBJbWFnZSBleHRyYWN0CkBAIC0xNDEsNCArMTQxLDQgQEAKIAkgICAiYWRkciBwYXJ0IFtkZXN0XVxuIgogCSAgICIgICAgLSBleHRyYWN0IDxwYXJ0PiBmcm9tIGltYWdlIGF0IDxhZGRyPiBhbmQgY29weSB0byA8ZGVzdD5cbiIpOwogCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9YSU1HICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9jb21tYW5kLmMgYi9jb21tb24vY29tbWFuZC5jCmluZGV4IGU5MTc5NzUuLmFmMmY4Y2IgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9jb21tYW5kLmMKKysrIGIvY29tbW9uL2NvbW1hbmQuYwpAQCAtNDIsNyArNDIsNyBAQAogCU5VTEwKICk7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9FQ0hPKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9FQ0hPKQogCiBpbnQKIGRvX2VjaG8gKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQpAQCAtNzYsNyArNzYsNyBAQAogCSIgICAgLSBlY2hvIGFyZ3MgdG8gY29uc29sZTsgXFxjIHN1cHByZXNzZXMgbmV3bGluZVxuIgogKTsKIAotI2VuZGlmCS8qICBDRkdfQ01EX0VDSE8gKi8KKyNlbmRpZgogCiAjaWZkZWYgQ0ZHX0hVU0hfUEFSU0VSCiAKQEAgLTQwOSw3ICs0MDksNyBAQAogewogCWluc3RhbGxfYXV0b19jb21wbGV0ZV9oYW5kbGVyKCJwcmludGVudiIsIHZhcl9jb21wbGV0ZSk7CiAJaW5zdGFsbF9hdXRvX2NvbXBsZXRlX2hhbmRsZXIoInNldGVudiIsIHZhcl9jb21wbGV0ZSk7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUlVOKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9SVU4pCiAJaW5zdGFsbF9hdXRvX2NvbXBsZXRlX2hhbmRsZXIoInJ1biIsIHZhcl9jb21wbGV0ZSk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2NvbW1vbi9kb2NlY2MuYyBiL2NvbW1vbi9kb2NlY2MuYwppbmRleCA3OWFkYjQ4Li41ZGFhNmZjIDEwMDY0NAotLS0gYS9jb21tb24vZG9jZWNjLmMKKysrIGIvY29tbW9uL2RvY2VjYy5jCkBAIC0zMSw3ICszMSw3IEBACiAjdW5kZWYgRUNDX0RFQlVHCiAjdW5kZWYgUFNZQ0hPX0RFQlVHCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ET0MpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RPQykKIAogI2luY2x1ZGUgPGxpbnV4L210ZC9kb2MyMDAwLmg+CiAKQEAgLTUxNCw0ICs1MTQsNCBAQAogICAgIHJldHVybiBuYl9lcnJvcnM7CiB9CiAKLSNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ET0MpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9lbnZfY29tbW9uLmMgYi9jb21tb24vZW52X2NvbW1vbi5jCmluZGV4IGViMzM0MjIuLmE0OTQ4MTIgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9lbnZfY29tbW9uLmMKKysrIGIvY29tbW9uL2Vudl9jb21tb24uYwpAQCAtMzAsMTMgKzMwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxtYWxsb2MuaD4KIAotI2lmZGVmIENPTkZJR19TSE9XX0JPT1RfUFJPR1JFU1MKLSMgaW5jbHVkZSA8c3RhdHVzX2xlZC5oPgotIyBkZWZpbmUgU0hPV19CT09UX1BST0dSRVNTKGFyZykJc2hvd19ib290X3Byb2dyZXNzKGFyZykKLSNlbHNlCi0jIGRlZmluZSBTSE9XX0JPT1RfUFJPR1JFU1MoYXJnKQotI2VuZGlmCi0KIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwogCiAjaWZkZWYgQ09ORklHX0FNSUdBT05FRzNTRQpAQCAtMjMyLDcgKzIyNSw3IEBACiAJCXB1dHMgKCJVc2luZyBkZWZhdWx0IGVudmlyb25tZW50XG5cbiIpOwogI2Vsc2UKIAkJcHV0cyAoIioqKiBXYXJuaW5nIC0gYmFkIENSQywgdXNpbmcgZGVmYXVsdCBlbnZpcm9ubWVudFxuXG4iKTsKLQkJU0hPV19CT09UX1BST0dSRVNTICgtMSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTYwKTsKICNlbmRpZgogCiAJCWlmIChzaXplb2YoZGVmYXVsdF9lbnZpcm9ubWVudCkgPiBFTlZfU0laRSkKZGlmZiAtLWdpdCBhL2NvbW1vbi9lbnZfZmxhc2guYyBiL2NvbW1vbi9lbnZfZmxhc2guYwppbmRleCAxNjc0YjMwLi43YTM3ZTU1IDEwMDY0NAotLS0gYS9jb21tb24vZW52X2ZsYXNoLmMKKysrIGIvY29tbW9uL2Vudl9mbGFzaC5jCkBAIC0zNywxMCArMzcsMTAgQEAKIAogREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CiAKLSNpZiAoKENPTkZJR19DT01NQU5EUyYoQ0ZHX0NNRF9FTlZ8Q0ZHX0NNRF9GTEFTSCkpID09IChDRkdfQ01EX0VOVnxDRkdfQ01EX0ZMQVNIKSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRU5WKSAmJiBkZWZpbmVkKENPTkZJR19DTURfRkxBU0gpCiAjZGVmaW5lIENNRF9TQVZFRU5WCiAjZWxpZiBkZWZpbmVkKENGR19FTlZfQUREUl9SRURVTkQpCi0jZXJyb3IgQ2Fubm90IHVzZSBDRkdfRU5WX0FERFJfUkVEVU5EIHdpdGhvdXQgQ0ZHX0NNRF9FTlYgJiBDRkdfQ01EX0ZMQVNICisjZXJyb3IgQ2Fubm90IHVzZSBDRkdfRU5WX0FERFJfUkVEVU5EIHdpdGhvdXQgQ09ORklHX0NNRF9FTlYgJiBDT05GSUdfQ01EX0ZMQVNICiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ0ZHX0VOVl9TSVpFX1JFRFVORCkgJiYgKENGR19FTlZfU0laRV9SRURVTkQgPCBDRkdfRU5WX1NJWkUpCmRpZmYgLS1naXQgYS9jb21tb24vZW52X25hbmQuYyBiL2NvbW1vbi9lbnZfbmFuZC5jCmluZGV4IDY3YzRhNGUuLjM4YTA3ZjggMTAwNjQ0Ci0tLSBhL2NvbW1vbi9lbnZfbmFuZC5jCisrKyBiL2NvbW1vbi9lbnZfbmFuZC5jCkBAIC0zOSwxMCArMzksMTAgQEAKICNpbmNsdWRlIDxtYWxsb2MuaD4KICNpbmNsdWRlIDxuYW5kLmg+CiAKLSNpZiAoKENPTkZJR19DT01NQU5EUyYoQ0ZHX0NNRF9FTlZ8Q0ZHX0NNRF9OQU5EKSkgPT0gKENGR19DTURfRU5WfENGR19DTURfTkFORCkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0VOVikgJiYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAjZGVmaW5lIENNRF9TQVZFRU5WCiAjZWxpZiBkZWZpbmVkKENGR19FTlZfT0ZGU0VUX1JFRFVORCkKLSNlcnJvciBDYW5ub3QgdXNlIENGR19FTlZfT0ZGU0VUX1JFRFVORCB3aXRob3V0IENGR19DTURfRU5WICYgQ0ZHX0NNRF9OQU5ECisjZXJyb3IgQ2Fubm90IHVzZSBDRkdfRU5WX09GRlNFVF9SRURVTkQgd2l0aG91dCBDT05GSUdfQ01EX0VOViAmIENPTkZJR19DTURfTkFORAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENGR19FTlZfU0laRV9SRURVTkQpICYmIChDRkdfRU5WX1NJWkVfUkVEVU5EICE9IENGR19FTlZfU0laRSkKZGlmZiAtLWdpdCBhL2NvbW1vbi9leHBvcnRzLmMgYi9jb21tb24vZXhwb3J0cy5jCmluZGV4IDBjYjQzOTYuLmVjNDY1NmIgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9leHBvcnRzLmMKKysrIGIvY29tbW9uL2V4cG9ydHMuYwpAQCAtMjgsMTIgKzI4LDE0IEBACiAJZ2QtPmp0W1hGX2dldF90aW1lcl0gPSAodm9pZCAqKSBnZXRfdGltZXI7CiAJZ2QtPmp0W1hGX3NpbXBsZV9zdHJ0b3VsXSA9ICh2b2lkICopIHNpbXBsZV9zdHJ0b3VsOwogCWdkLT5qdFtYRl91ZGVsYXldID0gKHZvaWQgKikgdWRlbGF5OworCWdkLT5qdFtYRl9zaW1wbGVfc3RydG9sXSA9ICh2b2lkICopIHNpbXBsZV9zdHJ0b2w7CisJZ2QtPmp0W1hGX3N0cmNtcF0gPSAodm9pZCAqKSBzdHJjbXA7CiAjaWYgZGVmaW5lZChDT05GSUdfSTM4NikgfHwgZGVmaW5lZChDT05GSUdfUFBDKQogCWdkLT5qdFtYRl9pbnN0YWxsX2hkbHJdID0gKHZvaWQgKikgaXJxX2luc3RhbGxfaGFuZGxlcjsKIAlnZC0+anRbWEZfZnJlZV9oZGxyXSA9ICh2b2lkICopIGlycV9mcmVlX2hhbmRsZXI7CiAjZW5kaWYJLyogSTM4NiB8fCBQUEMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JMkMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0kyQykKIAlnZC0+anRbWEZfaTJjX3dyaXRlXSA9ICh2b2lkICopIGkyY193cml0ZTsKIAlnZC0+anRbWEZfaTJjX3JlYWRdID0gKHZvaWQgKikgaTJjX3JlYWQ7Ci0jZW5kaWYJLyogQ0ZHX0NNRF9JMkMgKi8KKyNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZkdF9zdXBwb3J0LmMgYi9jb21tb24vZmR0X3N1cHBvcnQuYwppbmRleCA2OTA5OWM0Li5jYWFhNjgyIDEwMDY0NAotLS0gYS9jb21tb24vZmR0X3N1cHBvcnQuYworKysgYi9jb21tb24vZmR0X3N1cHBvcnQuYwpAQCAtMzcsNiArMzcsMTAgQEAKICAqLwogREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CiAKKy8qCisgKiBmZHQgcG9pbnRzIHRvIG91ciB3b3JraW5nIGRldmljZSB0cmVlLgorICovCitzdHJ1Y3QgZmR0X2hlYWRlciAqZmR0OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTQ1LDEzICs0OSwxMiBAQAogCWJkX3QgKmJkID0gZ2QtPmJkOwogCWludCAgIG5vZGVvZmZzZXQ7CiAJaW50ICAgZXJyOwotCXUzMiAgIHRtcDsJCQkvKiB1c2VkIHRvIHNldCAzMiBiaXQgaW50ZWdlciBwcm9wZXJ0aWVzICovCi0JY2hhciAgKnN0cjsJCQkvKiB1c2VkIHRvIHNldCBzdHJpbmcgcHJvcGVydGllcyAqLwotCXVsb25nIGNsb2NrOworCXUzMiAgIHRtcDsJCS8qIHVzZWQgdG8gc2V0IDMyIGJpdCBpbnRlZ2VyIHByb3BlcnRpZXMgKi8KKwljaGFyICAqc3RyOwkJLyogdXNlZCB0byBzZXQgc3RyaW5nIHByb3BlcnRpZXMgKi8KIAogCWVyciA9IGZkdF9jaGVja19oZWFkZXIoZmR0KTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGYoImxpYmZkdDogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKKwkJcHJpbnRmKCJmZHRfY2hvc2VuOiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNjMsMTEgKzY2LDEyIEBACiAKIAkJZXJyID0gZmR0X251bV9yZXNlcnZlbWFwKGZkdCwgJnVzZWQsICZ0b3RhbCk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlwcmludGYoImxpYmZkdDogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKKwkJCXByaW50ZigiZmR0X2Nob3NlbjogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAkJaWYgKHVzZWQgPj0gdG90YWwpIHsKLQkJCXByaW50ZigiZmR0X2Nob3Nlbjogbm8gcm9vbSBpbiB0aGUgcmVzZXJ2ZWQgbWFwICglZCBvZiAlZClcbiIsCisJCQlwcmludGYoIldBUk5JTkc6ICIKKwkJCQkibm8gcm9vbSBpbiB0aGUgcmVzZXJ2ZWQgbWFwICglZCBvZiAlZClcbiIsCiAJCQkJdXNlZCwgdG90YWwpOwogCQkJcmV0dXJuIC0xOwogCQl9CkBAIC04NCw3ICs4OCw3IEBACiAJCWVyciA9IGZkdF9yZXBsYWNlX3Jlc2VydmVtYXBfZW50cnkoZmR0LCBqLAogCQkJaW5pdHJkX3N0YXJ0LCBpbml0cmRfZW5kIC0gaW5pdHJkX3N0YXJ0ICsgMSk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlwcmludGYoImxpYmZkdDogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKKwkJCXByaW50ZigiZmR0X2Nob3NlbjogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9CkBAIC05Miw3ICs5Niw3IEBACiAJLyoKIAkgKiBGaW5kIHRoZSAiY2hvc2VuIiBub2RlLgogCSAqLwotCW5vZGVvZmZzZXQgPSBmZHRfcGF0aF9vZmZzZXQgKGZkdCwgIi9jaG9zZW4iKTsKKwlub2Rlb2Zmc2V0ID0gZmR0X2ZpbmRfbm9kZV9ieV9wYXRoIChmZHQsICIvY2hvc2VuIik7CiAKIAkvKgogCSAqIElmIHdlIGhhdmUgYSAiY2hvc2VuIiBub2RlIGFscmVhZHkgdGhlICJmb3JjZSB0aGUgd3JpdGluZyIKQEAgLTExMCw3ICsxMTQsOCBAQAogCQkgKi8KIAkJbm9kZW9mZnNldCA9IGZkdF9hZGRfc3Vibm9kZShmZHQsIDAsICJjaG9zZW4iKTsKIAkJaWYgKG5vZGVvZmZzZXQgPCAwKSB7Ci0JCQlwcmludGYoImxpYmZkdDogJXNcbiIsIGZkdF9zdHJlcnJvcihub2Rlb2Zmc2V0KSk7CisJCQlwcmludGYoIldBUk5JTkc6IGNvdWxkIG5vdCBjcmVhdGUgL2Nob3NlbiAlcy5cbiIsCisJCQkJZmR0X3N0cmVycm9yKG5vZGVvZmZzZXQpKTsKIAkJCXJldHVybiBub2Rlb2Zmc2V0OwogCQl9CiAJfQpAQCAtMTIwLDQyICsxMjUsMzUgQEAKIAkgKi8KIAlzdHIgPSBnZXRlbnYoImJvb3RhcmdzIik7CiAJaWYgKHN0ciAhPSBOVUxMKSB7Ci0JCWVyciA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgImJvb3RhcmdzIiwgc3RyLCBzdHJsZW4oc3RyKSsxKTsKKwkJZXJyID0gZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LAorCQkJImJvb3RhcmdzIiwgc3RyLCBzdHJsZW4oc3RyKSsxKTsKIAkJaWYgKGVyciA8IDApCi0JCQlwcmludGYoImxpYmZkdDogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKKwkJCXByaW50ZigiV0FSTklORzogY291bGQgbm90IHNldCBib290YXJncyAlcy5cbiIsCisJCQkJZmR0X3N0cmVycm9yKGVycikpOwogCX0KIAlpZiAoaW5pdHJkX3N0YXJ0ICYmIGluaXRyZF9lbmQpIHsKIAkJdG1wID0gX19jcHVfdG9fYmUzMihpbml0cmRfc3RhcnQpOwotCQllcnIgPSBmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsICJsaW51eCxpbml0cmQtc3RhcnQiLCAmdG1wLCBzaXplb2YodG1wKSk7CisJCWVyciA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwKKwkJCSAibGludXgsaW5pdHJkLXN0YXJ0IiwgJnRtcCwgc2l6ZW9mKHRtcCkpOwogCQlpZiAoZXJyIDwgMCkKLQkJCXByaW50ZigibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOworCQkJcHJpbnRmKCJXQVJOSU5HOiAiCisJCQkJImNvdWxkIG5vdCBzZXQgbGludXgsaW5pdHJkLXN0YXJ0ICVzLlxuIiwKKwkJCQlmZHRfc3RyZXJyb3IoZXJyKSk7CiAJCXRtcCA9IF9fY3B1X3RvX2JlMzIoaW5pdHJkX2VuZCk7Ci0JCWVyciA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgImxpbnV4LGluaXRyZC1lbmQiLCAmdG1wLCBzaXplb2YodG1wKSk7CisJCWVyciA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwKKwkJCSJsaW51eCxpbml0cmQtZW5kIiwgJnRtcCwgc2l6ZW9mKHRtcCkpOwogCQlpZiAoZXJyIDwgMCkKLQkJCXByaW50ZigibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOworCQkJcHJpbnRmKCJXQVJOSU5HOiBjb3VsZCBub3Qgc2V0IGxpbnV4LGluaXRyZC1lbmQgJXMuXG4iLAorCQkJCWZkdF9zdHJlcnJvcihlcnIpKTsKIAl9CiAjaWZkZWYgT0ZfU1RET1VUX1BBVEgKLQllcnIgPSBmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsICJsaW51eCxzdGRvdXQtcGF0aCIsIE9GX1NURE9VVF9QQVRILCBzdHJsZW4oT0ZfU1RET1VUX1BBVEgpKzEpOworCWVyciA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwKKwkJImxpbnV4LHN0ZG91dC1wYXRoIiwgT0ZfU1RET1VUX1BBVEgsIHN0cmxlbihPRl9TVERPVVRfUEFUSCkrMSk7CiAJaWYgKGVyciA8IDApCi0JCXByaW50ZigibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOworCQlwcmludGYoIldBUk5JTkc6IGNvdWxkIG5vdCBzZXQgbGludXgsc3Rkb3V0LXBhdGggJXMuXG4iLAorCQkJZmR0X3N0cmVycm9yKGVycikpOwogI2VuZGlmCiAKLQlub2Rlb2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0IChmZHQsICIvY3B1cyIpOwotCWlmIChub2Rlb2Zmc2V0ID49IDApIHsKLQkJY2xvY2sgPSBjcHVfdG9fYmUzMihiZC0+YmlfaW50ZnJlcSk7Ci0JCWVyciA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgImNsb2NrLWZyZXF1ZW5jeSIsICZjbG9jaywgNCk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcHJpbnRmKCJsaWJmZHQ6ICVzXG4iLCBmZHRfc3RyZXJyb3IoZXJyKSk7Ci0JfQotI2lmZGVmIE9GX1RCQ0xLCi0Jbm9kZW9mZnNldCA9IGZkdF9wYXRoX29mZnNldCAoZmR0LCAiL2NwdXMvIiBPRl9DUFUgIi90aW1lYmFzZS1mcmVxdWVuY3kiKTsKLQlpZiAobm9kZW9mZnNldCA+PSAwKSB7Ci0JCWNsb2NrID0gY3B1X3RvX2JlMzIoT0ZfVEJDTEspOwotCQllcnIgPSBmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsICJjbG9jay1mcmVxdWVuY3kiLCAmY2xvY2ssIDQpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXByaW50ZigibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOwotCX0KLSNlbmRpZgogCXJldHVybiBlcnI7CiB9CiAKQEAgLTE3Nyw3ICsxNzUsNyBAQAogCiAJZXJyID0gZmR0X2NoZWNrX2hlYWRlcihmZHQpOwogCWlmIChlcnIgPCAwKSB7Ci0JCXByaW50ZigibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOworCQlwcmludGYoImZkdF9lbnY6ICVzXG4iLCBmZHRfc3RyZXJyb3IoZXJyKSk7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0xODUsMTEgKzE4MywxMSBAQAogCSAqIFNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSAidS1ib290LWVudiIgbm9kZSwgZGVsZXRlIGl0IGlmIHNvLgogCSAqIFRoZW4gY3JlYXRlIGEgbmV3IGVtcHR5IG5vZGUuCiAJICovCi0Jbm9kZW9mZnNldCA9IGZkdF9wYXRoX29mZnNldCAoZmR0LCAiL3UtYm9vdC1lbnYiKTsKKwlub2Rlb2Zmc2V0ID0gZmR0X2ZpbmRfbm9kZV9ieV9wYXRoIChmZHQsICIvdS1ib290LWVudiIpOwogCWlmIChub2Rlb2Zmc2V0ID49IDApIHsKIAkJZXJyID0gZmR0X2RlbF9ub2RlKGZkdCwgbm9kZW9mZnNldCk7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlwcmludGYoImxpYmZkdDogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKKwkJCXByaW50ZigiZmR0X2VudjogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9CkBAIC0xOTgsNyArMTk2LDggQEAKIAkgKi8KIAlub2Rlb2Zmc2V0ID0gZmR0X2FkZF9zdWJub2RlKGZkdCwgMCwgInUtYm9vdC1lbnYiKTsKIAlpZiAobm9kZW9mZnNldCA8IDApIHsKLQkJcHJpbnRmKCJsaWJmZHQ6ICVzXG4iLCBmZHRfc3RyZXJyb3Iobm9kZW9mZnNldCkpOworCQlwcmludGYoIldBUk5JTkc6IGNvdWxkIG5vdCBjcmVhdGUgL3UtYm9vdC1lbnYgJXMuXG4iLAorCQkJZmR0X3N0cmVycm9yKG5vZGVvZmZzZXQpKTsKIAkJcmV0dXJuIG5vZGVvZmZzZXQ7CiAJfQogCkBAIC0yMjYsNyArMjI1LDggQEAKIAkJCWNvbnRpbnVlOwogCQllcnIgPSBmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsIGx2YWwsIHJ2YWwsIHN0cmxlbihydmFsKSsxKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCXByaW50ZigibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOworCQkJcHJpbnRmKCJXQVJOSU5HOiBjb3VsZCBub3Qgc2V0ICVzICVzLlxuIiwKKwkJCQlsdmFsLCBmZHRfc3RyZXJyb3IoZXJyKSk7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJfQpAQCAtMjkyLDEyICsyOTIsMTIgQEAKIAliZF90ICpiZCA9IGdkLT5iZDsKIAlpbnQgICBub2Rlb2Zmc2V0OwogCWludCAgIGVycjsKLQl1MzIgICB0bXA7CQkJLyogdXNlZCB0byBzZXQgMzIgYml0IGludGVnZXIgcHJvcGVydGllcyAqLworCXUzMiAgIHRtcDsJCS8qIHVzZWQgdG8gc2V0IDMyIGJpdCBpbnRlZ2VyIHByb3BlcnRpZXMgKi8KIAlpbnQgaTsKIAogCWVyciA9IGZkdF9jaGVja19oZWFkZXIoZmR0KTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGYoImxpYmZkdDogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKKwkJcHJpbnRmKCJmZHRfYmRfdDogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTMwNSwxMSArMzA1LDExIEBACiAJICogU2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBhICJiZF90IiBub2RlLCBkZWxldGUgaXQgaWYgc28uCiAJICogVGhlbiBjcmVhdGUgYSBuZXcgZW1wdHkgbm9kZS4KIAkgKi8KLQlub2Rlb2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0IChmZHQsICIvYmRfdCIpOworCW5vZGVvZmZzZXQgPSBmZHRfZmluZF9ub2RlX2J5X3BhdGggKGZkdCwgIi9iZF90Iik7CiAJaWYgKG5vZGVvZmZzZXQgPj0gMCkgewogCQllcnIgPSBmZHRfZGVsX25vZGUoZmR0LCBub2Rlb2Zmc2V0KTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCXByaW50ZigibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOworCQkJcHJpbnRmKCJmZHRfYmRfdDogJXNcbiIsIGZkdF9zdHJlcnJvcihlcnIpKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9CkBAIC0zMTgsNyArMzE4LDkgQEAKIAkgKi8KIAlub2Rlb2Zmc2V0ID0gZmR0X2FkZF9zdWJub2RlKGZkdCwgMCwgImJkX3QiKTsKIAlpZiAobm9kZW9mZnNldCA8IDApIHsKLQkJcHJpbnRmKCJsaWJmZHQ6ICVzXG4iLCBmZHRfc3RyZXJyb3Iobm9kZW9mZnNldCkpOworCQlwcmludGYoIldBUk5JTkc6IGNvdWxkIG5vdCBjcmVhdGUgL2JkX3QgJXMuXG4iLAorCQkJZmR0X3N0cmVycm9yKG5vZGVvZmZzZXQpKTsKKwkJcHJpbnRmKCJmZHRfYmRfdDogJXNcbiIsIGZkdF9zdHJlcnJvcihub2Rlb2Zmc2V0KSk7CiAJCXJldHVybiBub2Rlb2Zmc2V0OwogCX0KIAkvKgpAQCAtMzI2LDIwICszMjgsMjMgQEAKIAkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGJkX21hcCkvc2l6ZW9mKGJkX21hcFswXSk7IGkrKykgewogCQl0bXAgPSBjcHVfdG9fYmUzMihnZXRlbnYoImJvb3RhcmdzIikpOwotCQllcnIgPSBmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsIGJkX21hcFtpXS5uYW1lLCAmdG1wLCBzaXplb2YodG1wKSk7CisJCWVyciA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwKKwkJCWJkX21hcFtpXS5uYW1lLCAmdG1wLCBzaXplb2YodG1wKSk7CiAJCWlmIChlcnIgPCAwKQotCQkJcHJpbnRmKCJsaWJmZHQ6ICVzXG4iLCBmZHRfc3RyZXJyb3IoZXJyKSk7CisJCQlwcmludGYoIldBUk5JTkc6IGNvdWxkIG5vdCBzZXQgJXMgJXMuXG4iLAorCQkJCWJkX21hcFtpXS5uYW1lLCBmZHRfc3RyZXJyb3IoZXJyKSk7CiAJfQogCS8qCiAJICogQWRkIGEgY291cGxlIG9mIG9kZGJhbGwgZW50cmllcy4uLgogCSAqLwogCWVyciA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgImVuZXRhZGRyIiwgJmJkLT5iaV9lbmV0YWRkciwgNik7CiAJaWYgKGVyciA8IDApCi0JCXByaW50ZigibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOworCQlwcmludGYoIldBUk5JTkc6IGNvdWxkIG5vdCBzZXQgZW5ldGFkZHIgJXMuXG4iLAorCQkJZmR0X3N0cmVycm9yKGVycikpOwogCWVyciA9IGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgImV0aHNwZWVkIiwgJmJkLT5iaV9ldGhzcGVlZCwgNCk7CiAJaWYgKGVyciA8IDApCi0JCXByaW50ZigibGliZmR0OiAlc1xuIiwgZmR0X3N0cmVycm9yKGVycikpOwotCisJCXByaW50ZigiV0FSTklORzogY291bGQgbm90IHNldCBldGhzcGVlZCAlcy5cbiIsCisJCQlmZHRfc3RyZXJyb3IoZXJyKSk7CiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYgLyogaWZkZWYgQ09ORklHX09GX0hBU19CRF9UICovCmRpZmYgLS1naXQgYS9jb21tb24vaHVzaC5jIGIvY29tbW9uL2h1c2guYwppbmRleCBmZWI1NjI3Li41ODI2MzVjIDEwMDY0NAotLS0gYS9jb21tb24vaHVzaC5jCisrKyBiL2NvbW1vbi9odXNoLmMKQEAgLTE2ODIsNyArMTY4Miw3IEBACiAJCQkJcmV0dXJuIC0xOwkvKiBnaXZlIHVwIGFmdGVyIGJhZCBjb21tYW5kICovCiAJCQl9IGVsc2UgewogCQkJCWludCByY29kZTsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CT09URCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQk9PVEQpCiAJICAgIGV4dGVybiBpbnQgZG9fYm9vdGQgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKTsKIAogCQkJCS8qIGF2b2lkICJib290ZCIgcmVjdXJzaW9uICovCkBAIC0xNjk0LDcgKzE2OTQsNyBAQAogCQkJCWVsc2UKIAkJCQkJZmxhZyB8PSBDTURfRkxBR19CT09URDsKIAkJCQl9Ci0jZW5kaWYJLyogQ0ZHX0NNRF9CT09URCAqLworI2VuZGlmCiAJCQkJLyogZm91bmQgLSBjaGVjayBtYXggYXJncyAqLwogCQkJCWlmICgoY2hpbGQtPmFyZ2MgLSBpKSA+IGNtZHRwLT5tYXhhcmdzKSB7CiAJCQkJCXByaW50ZiAoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CmRpZmYgLS1naXQgYS9jb21tb24va2dkYi5jIGIvY29tbW9uL2tnZGIuYwppbmRleCA2ZGU2ZWM5Li4xZDM0NjY5IDEwMDY0NAotLS0gYS9jb21tb24va2dkYi5jCisrKyBiL2NvbW1vbi9rZ2RiLmMKQEAgLTkyLDcgKzkyLDcgQEAKICNpbmNsdWRlIDxrZ2RiLmg+CiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAogI3VuZGVmIEtHREJfREVCVUcKIApAQCAtNTkxLDQgKzU5MSw0IEBACiAKIGludCBrZ2RiX25vdF9jb25maWd1cmVkID0gMTsKIAotI2VuZGlmIC8qIENGR19DTURfS0dEQiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21tb24vbGNkLmMgYi9jb21tb24vbGNkLmMKaW5kZXggZWFlZDJhYi4uOTE0ZGMyZSAxMDA2NDQKLS0tIGEvY29tbW9uL2xjZC5jCisrKyBiL2NvbW1vbi9sY2QuYwpAQCAtNTcxLDcgKzU3MSw3IEBACiAjZW5kaWYgLyogQ09ORklHX0xDRF9MT0dPICovCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQk1QKSB8fCBkZWZpbmVkKENPTkZJR19TUExBU0hfU0NSRUVOKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CTVApIHx8IGRlZmluZWQoQ09ORklHX1NQTEFTSF9TQ1JFRU4pCiAvKgogICogRGlzcGxheSB0aGUgQk1QIGZpbGUgbG9jYXRlZCBhdCBhZGRyZXNzIGJtcF9pbWFnZS4KICAqIE9ubHkgdW5jb21wcmVzc2VkLgpAQCAtNzAwLDcgKzcwMCw3IEBACiAKIAlyZXR1cm4gKDApOwogfQotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JNUCkgfHwgQ09ORklHX1NQTEFTSF9TQ1JFRU4gKi8KKyNlbmRpZgogCiAKIHN0YXRpYyB2b2lkICpsY2RfbG9nbyAodm9pZCkKZGlmZiAtLWdpdCBhL2NvbW1vbi9tYWluLmMgYi9jb21tb24vbWFpbi5jCmluZGV4IDA5ZWU2NGIuLjM3OTY5NWMgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9tYWluLmMKKysrIGIvY29tbW9uL21haW4uYwpAQCAtNDQsNiArNDQsMTIgQEAKIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwogI2VuZGlmCiAKKy8qCisgKiBCb2FyZC1zcGVjaWZpYyBQbGF0Zm9ybSBjb2RlIGNhbiByZWltcGxlbWVudCBzaG93X2Jvb3RfcHJvZ3Jlc3MgKCkgaWYgbmVlZGVkCisgKi8KK3ZvaWQgaW5saW5lIF9fc2hvd19ib290X3Byb2dyZXNzIChpbnQgdmFsKSB7fQordm9pZCBpbmxpbmUgc2hvd19ib290X3Byb2dyZXNzIChpbnQgdmFsKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrLCBhbGlhcygiX19zaG93X2Jvb3RfcHJvZ3Jlc3MiKSkpOworCiAjaWYgZGVmaW5lZChDT05GSUdfQk9PVF9SRVRSWV9USU1FKSAmJiBkZWZpbmVkKENPTkZJR19SRVNFVF9UT19SRVRSWSkKIGV4dGVybiBpbnQgZG9fcmVzZXQgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKTsJCS8qIGZvciBkb19yZXNldCgpIHByb3RvdHlwZSAqLwogI2VuZGlmCkBAIC0xMTMsNyArMTE5LDcgQEAKIAl1X2ludCBpOwogCiAjICBpZmRlZiBDT05GSUdfQVVUT0JPT1RfUFJPTVBUCi0JcHJpbnRmIChDT05GSUdfQVVUT0JPT1RfUFJPTVBULCBib290ZGVsYXkpOworCXByaW50ZihDT05GSUdfQVVUT0JPT1RfUFJPTVBULCBib290ZGVsYXkpOwogIyAgZW5kaWYKIAogIyAgaWZkZWYgQ09ORklHX0FVVE9CT09UX0RFTEFZX1NUUgpAQCAtMTg3LDcgKzE5Myw3IEBACiAJfQogIyAgaWYgREVCVUdfQk9PVEtFWVMKIAlpZiAoIWFib3J0KQotCQlwdXRzICgia2V5IHRpbWVvdXRcbiIpOworCQlwdXRzKCJrZXkgdGltZW91dFxuIik7CiAjICBlbmRpZgogCiAjaWZkZWYgQ09ORklHX1NJTEVOVF9DT05TT0xFCkBAIC0yNDQsMTMgKzI1MCwxMyBAQAogIyBlbmRpZgogCQkJCWJyZWFrOwogCQkJfQotCQkJdWRlbGF5ICgxMDAwMCk7CisJCQl1ZGVsYXkoMTAwMDApOwogCQl9CiAKLQkJcHJpbnRmICgiXGJcYlxiJTJkICIsIGJvb3RkZWxheSk7CisJCXByaW50ZigiXGJcYlxiJTJkICIsIGJvb3RkZWxheSk7CiAJfQogCi0JcHV0YyAoJ1xuJyk7CisJcHV0YygnXG4nKTsKIAogI2lmZGVmIENPTkZJR19TSUxFTlRfQ09OU09MRQogCWlmIChhYm9ydCkKQEAgLTk2Miw3ICs5NjgsNyBAQAogCQkJbiA9IDA7CiAJCQljb250aW51ZTsKIAotCQljYXNlIDB4MTc6CQkJCS8qIF5XIC0gZXJhc2Ugd29yZCAJKi8KKwkJY2FzZSAweDE3OgkJCQkvKiBeVyAtIGVyYXNlIHdvcmQJKi8KIAkJCXA9ZGVsZXRlX2NoYXIoY29uc29sZV9idWZmZXIsIHAsICZjb2wsICZuLCBwbGVuKTsKIAkJCXdoaWxlICgobiA+IDApICYmICgqcCAhPSAnICcpKSB7CiAJCQkJcD1kZWxldGVfY2hhcihjb25zb2xlX2J1ZmZlciwgcCwgJmNvbCwgJm4sIHBsZW4pOwpAQCAtMTMxMSw3ICsxMzE3LDcgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CT09URCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQk9PVEQpCiAJCS8qIGF2b2lkICJib290ZCIgcmVjdXJzaW9uICovCiAJCWlmIChjbWR0cC0+Y21kID09IGRvX2Jvb3RkKSB7CiAjaWZkZWYgREVCVUdfUEFSU0VSCkBAIC0xMzI1LDcgKzEzMzEsNyBAQAogCQkJCWZsYWcgfD0gQ01EX0ZMQUdfQk9PVEQ7CiAJCQl9CiAJCX0KLSNlbmRpZgkvKiBDRkdfQ01EX0JPT1REICovCisjZW5kaWYKIAogCQkvKiBPSyAtIGNhbGwgZnVuY3Rpb24gdG8gZG8gdGhlIGNvbW1hbmQgKi8KIAkJaWYgKChjbWR0cC0+Y21kKSAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpICE9IDApIHsKQEAgLTEzMzYsNyArMTM0Miw3IEBACiAKIAkJLyogRGlkIHRoZSB1c2VyIHN0b3AgdGhpcz8gKi8KIAkJaWYgKGhhZF9jdHJsYyAoKSkKLQkJCXJldHVybiAwOwkvKiBpZiBzdG9wcGVkIHRoZW4gbm90IHJlcGVhdGFibGUgKi8KKwkJCXJldHVybiAtMTsJLyogaWYgc3RvcHBlZCB0aGVuIG5vdCByZXBlYXRhYmxlICovCiAJfQogCiAJcmV0dXJuIHJjID8gcmMgOiByZXBlYXRhYmxlOwpAQCAtMTM0NCw3ICsxMzUwLDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9SVU4pCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1JVTikKIGludCBkb19ydW4gKGNtZF90YmxfdCAqIGNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKIAlpbnQgaTsKQEAgLTEzNzIsNCArMTM3OCw0IEBACiAJfQogCXJldHVybiAwOwogfQotI2VuZGlmCS8qIENGR19DTURfUlVOICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbW1vbi9taWlwaHl1dGlsLmMgYi9jb21tb24vbWlpcGh5dXRpbC5jCmluZGV4IGU0MTFlNTcuLmM2OTUwMWYgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9taWlwaHl1dGlsLmMKKysrIGIvY29tbW9uL21paXBoeXV0aWwuYwpAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPG1paXBoeS5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCisjaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxtYWxsb2MuaD4KQEAgLTQ3MCw0ICs0NzAsNCBAQAogfQogI2VuZGlmCiAKLSNlbmRpZiAvKiBDT05GSUdfTUlJIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkgKi8KKyNlbmRpZiAvKiBDT05GSUdfTUlJICovCmRpZmYgLS1naXQgYS9jb21tb24vc29mdF9pMmMuYyBiL2NvbW1vbi9zb2Z0X2kyYy5jCmluZGV4IGVkYWQ1MWIuLjBmNmUzYTkgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9zb2Z0X2kyYy5jCisrKyBiL2NvbW1vbi9zb2Z0X2kyYy5jCkBAIC0zNiw2ICszNiw5IEBACiAjaWZkZWYJQ09ORklHX0lYUDQyNQkJCS8qIG9ubHkgdmFsaWQgZm9yIElYUDQyNSAqLwogI2luY2x1ZGUgPGFzbS9hcmNoL2l4cDQyNS5oPgogI2VuZGlmCisjaWZkZWYgQ09ORklHX0xQQzIyOTIKKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorI2VuZGlmCiAjaW5jbHVkZSA8aTJjLmg+CiAKICNpZiBkZWZpbmVkKENPTkZJR19TT0ZUX0kyQykKZGlmZiAtLWdpdCBhL2NvbW1vbi91c2IuYyBiL2NvbW1vbi91c2IuYwppbmRleCAwODU3NDk0Li45MzNhZmE5IDEwMDY0NAotLS0gYS9jb21tb24vdXNiLmMKKysrIGIvY29tbW9uL3VzYi5jCkBAIC00OSw3ICs0OSw3IEBACiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9VU0IpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1VTQikKIAogI2luY2x1ZGUgPHVzYi5oPgogI2lmZGVmIENPTkZJR180eHgKQEAgLTEyNDcsNiArMTI0Nyw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikgKi8KKyNlbmRpZgogCiAvKiBFT0YgKi8KZGlmZiAtLWdpdCBhL2NvbW1vbi91c2Jfa2JkLmMgYi9jb21tb24vdXNiX2tiZC5jCmluZGV4IDU2YzIxNjYuLmFlYzU1OGEgMTAwNjQ0Ci0tLSBhL2NvbW1vbi91c2Jfa2JkLmMKKysrIGIvY29tbW9uL3VzYl9rYmQuYwpAQCAtMTI5LDcgKzEyOSwxMSBAQAogc3RhdGljIGludCB1c2Jfa2JkX2dldGModm9pZCkKIHsKIAljaGFyIGM7Ci0Jd2hpbGUodXNiX2luX3BvaW50ZXI9PXVzYl9vdXRfcG9pbnRlcik7CisJd2hpbGUodXNiX2luX3BvaW50ZXI9PXVzYl9vdXRfcG9pbnRlcikgeworI2lmZGVmIENGR19VU0JfRVZFTlRfUE9MTAorCQl1c2JfZXZlbnRfcG9sbCgpOworI2VuZGlmCisJfQogCWlmKCh1c2Jfb3V0X3BvaW50ZXIrMSk9PVVTQl9LQkRfQlVGRkVSX0xFTikKIAkJdXNiX291dF9wb2ludGVyPTA7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3VzYl9zdG9yYWdlLmMgYi9jb21tb24vdXNiX3N0b3JhZ2UuYwppbmRleCAxOTZjZWI3Li4wZjc5ZjM2IDEwMDY0NAotLS0gYS9jb21tb24vdXNiX3N0b3JhZ2UuYworKysgYi9jb21tb24vdXNiX3N0b3JhZ2UuYwpAQCAtNTUsNyArNTUsNyBAQAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KIAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfVVNCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9VU0IpCiAjaW5jbHVkZSA8cGFydC5oPgogI2luY2x1ZGUgPHVzYi5oPgogCkBAIC0xMjQ5LDQgKzEyNDksNCBAQAogfQogCiAjZW5kaWYgLyogQ09ORklHX1VTQl9TVE9SQUdFICovCi0jZW5kaWYgLyogQ0ZHX0NNRF9VU0IgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1Lzc0eHhfN3h4L2tnZGIuUyBiL2NwdS83NHh4Xzd4eC9rZ2RiLlMKaW5kZXggZTgzODUxMy4uNGYyMzEyMiAxMDA2NDQKLS0tIGEvY3B1Lzc0eHhfN3h4L2tnZGIuUworKysgYi9jcHUvNzR4eF83eHgva2dkYi5TCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CiAjaW5jbHVkZSA8YXNtL21tdS5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAogIC8qCiAgKiBjYWNoZSBmbHVzaGluZyByb3V0aW5lcyBmb3Iga2dkYgpAQCAtNzQsNCArNzQsNCBAQAogCVNZTkMKIAlibHIKIAotI2VuZGlmIC8qIENGR19DTURfS0dEQiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jcHUvNzR4eF83eHgvc3RhcnQuUyBiL2NwdS83NHh4Xzd4eC9zdGFydC5TCmluZGV4IDExNDMwMzguLmI1ODM0YjkgMTAwNjQ0Ci0tLSBhL2NwdS83NHh4Xzd4eC9zdGFydC5TCisrKyBiL2NwdS83NHh4Xzd4eC9zdGFydC5TCkBAIC0xMjUsNyArMTI1LDcgQEAKIC8qIEFsaWdubWVudCBleGNlcHRpb24uICovCiAJLiA9IDB4NjAwCiBBbGlnbm1lbnQ6Ci0JRVhDRVBUSU9OX1BST0xPRworCUVYQ0VQVElPTl9QUk9MT0coU1JSMCwgU1JSMSkKIAltZnNwcglyNCxEQVIKIAlzdHcJcjQsX0RBUihyMjEpCiAJbWZzcHIJcjUsRFNJU1IKQEAgLTE0Myw3ICsxNDMsNyBAQAogLyogUHJvZ3JhbSBjaGVjayBleGNlcHRpb24gKi8KIAkuID0gMHg3MDAKIFByb2dyYW1DaGVjazoKLQlFWENFUFRJT05fUFJPTE9HCisJRVhDRVBUSU9OX1BST0xPRyhTUlIwLCBTUlIxKQogCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKIAlsaQlyMjAsTVNSX0tFUk5FTAogCXJsd2ltaQlyMjAscjIzLDAsMTYsMTYJCS8qIGNvcHkgRUUgYml0IGZyb20gc2F2ZWQgTVNSICovCmRpZmYgLS1naXQgYS9jcHUvNzR4eF83eHgvdHJhcHMuYyBiL2NwdS83NHh4Xzd4eC90cmFwcy5jCmluZGV4IDUwYzVlZWIuLmIwNjYyMjcgMTAwNjQ0Ci0tLSBhL2NwdS83NHh4Xzd4eC90cmFwcy5jCisrKyBiL2NwdS83NHh4Xzd4eC90cmFwcy5jCkBAIC00MCw3ICs0MCw3IEBACiBERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIGludCAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShzdHJ1Y3QgcHRfcmVncyAqKSA9IDA7CiAjZW5kaWYKIApAQCAtMTMzLDcgKzEzMyw3IEBACiAJCXJldHVybjsKIAl9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0xNjYsNyArMTY2LDcgQEAKIHZvaWQKIEFsaWdubWVudEV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0xODEsNyArMTgxLDcgQEAKIAl1bnNpZ25lZCBjaGFyICpwID0gcmVncyA/ICh1bnNpZ25lZCBjaGFyICopKHJlZ3MtPm5pcCkgOiBOVUxMOwogCWludCBpLCBqOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMjA0LDcgKzIwNCw3IEBACiB2b2lkCiBTb2Z0RW11RXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTIxNyw3ICsyMTcsNyBAQAogdm9pZAogVW5rbm93bkV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCmRpZmYgLS1naXQgYS9jcHUvYXJtNzIwdC9scGMyMjkyL01ha2VmaWxlIGIvY3B1L2FybTcyMHQvbHBjMjI5Mi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDBmMWUzCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L2FybTcyMHQvbHBjMjI5Mi9NYWtlZmlsZQpAQCAtMCwwICsxLDUwIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA3CisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKFNPQykuYQorCitDT0JKUwk9IGZsYXNoLm8gbW1jLm8gbW1jX2h3Lm8gc3BpLm8KK1NPQkpTCT0gJChvYmopaWFwX2VudHJ5Lm8KKworU1JDUwk6PSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChDT0JKUykpCisKK2FsbDoJJChvYmopLmRlcGVuZCAkKExJQikKKworJChMSUIpOgkkKE9CSlMpICQoU09CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpICQoU09CSlMpCisKKyMgdGhpcyBNVVNUIGJlIGNvbXBpbGVkIGFzIHRodW1iIGNvZGUhCiskKFNPQkpTKToKKwkkKENDKSAkKEFGTEFHUykgLW1hcmNoPWFybXY0dCAtYyAtbyAkKFNPQkpTKSBpYXBfZW50cnkuUworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvY3B1L2FybTcyMHQvbHBjMjI5Mi9mbGFzaC5jIGIvY3B1L2FybTcyMHQvbHBjMjI5Mi9mbGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1Yzg2OTcKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvYXJtNzIwdC9scGMyMjkyL2ZsYXNoLmMKQEAgLTAsMCArMSwyNDkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYgRW1iZWRkZWQgQXJ0aXN0cyBBQiA8d3d3LmVtYmVkZGVkYXJ0aXN0cy5jb20+CisgKgorICogTW9kaWZpZWQgdG8gcmVtb3ZlIGFsbCBidXQgdGhlIElBUC1jb21tYW5kIHJlbGF0ZWQgY29kZSBieQorICogR2FyeSBKZW5uZWpvaG4gPGdhcnlqQGRlbnguZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisKKy8qIElBUCBjb21tYW5kcyB1c2UgMzIgYnl0ZXMgYXQgdGhlIHRvcCBvZiBDUFUgaW50ZXJuYWwgc3JhbSwgd2UKKyAgIHVzZSA1MTIgYnl0ZXMgYmVsb3cgdGhhdCAqLworI2RlZmluZSBDT1BZX0JVRkZFUl9MT0NBVElPTiAweDQwMDAzZGUwCisKKyNkZWZpbmUgSUFQX0xPQ0FUSU9OIDB4N2ZmZmZmZjEKKyNkZWZpbmUgSUFQX0NNRF9QUkVQQVJFIDUwCisjZGVmaW5lIElBUF9DTURfQ09QWSA1MQorI2RlZmluZSBJQVBfQ01EX0VSQVNFIDUyCisjZGVmaW5lIElBUF9DTURfQ0hFQ0sgNTMKKyNkZWZpbmUgSUFQX0NNRF9JRCA1NAorI2RlZmluZSBJQVBfQ01EX1ZFUlNJT04gNTUKKyNkZWZpbmUgSUFQX0NNRF9DT01QQVJFIDU2CisKKyNkZWZpbmUgSUFQX1JFVF9DTURfU1VDQ0VTUyAwCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNvbW1hbmRbNV07CitzdGF0aWMgdW5zaWduZWQgbG9uZyByZXN1bHRbMl07CisKK2V4dGVybiB2b2lkIGlhcF9lbnRyeSh1bnNpZ25lZCBsb25nICogY29tbWFuZCwgdW5zaWduZWQgbG9uZyAqIHJlc3VsdCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2ZsYXNoX3NlY3RvcihmbGFzaF9pbmZvX3QgKiBpbmZvLCB1bG9uZyBmbGFzaF9hZGRyKQoreworCWludCBpOworCisJZm9yKGkgPSAxOyBpIDwgKGluZm8tPnNlY3Rvcl9jb3VudCk7IGkrKykgeworCQlpZiAoZmxhc2hfYWRkciA8IChpbmZvLT5zdGFydFtpXSkpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gKGktMSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGZsYXNoX2FkZHIgaXMgYWxpZ25lZCBvbiA1MTIgYnl0ZXMgYm91bmRhcnkKKyAqIGluIGZsYXNoLiBUaGlzIGZ1bmN0aW9uIGFsc28gYXNzdW1lcyB0aGF0IHByZXBhcmUgaGF2ZSBiZWVuIGNhbGxlZAorICogZm9yIHRoZSBzZWN0b3IgaW4gcXVlc3Rpb24uCisgKi8KK2ludCBscGMyMjkyX2NvcHlfYnVmZmVyX3RvX2ZsYXNoKGZsYXNoX2luZm9fdCAqIGluZm8sIHVsb25nIGZsYXNoX2FkZHIpCit7CisJaW50IGZpcnN0X3NlY3RvcjsKKwlpbnQgbGFzdF9zZWN0b3I7CisKKwlmaXJzdF9zZWN0b3IgPSBnZXRfZmxhc2hfc2VjdG9yKGluZm8sIGZsYXNoX2FkZHIpOworCWxhc3Rfc2VjdG9yID0gZ2V0X2ZsYXNoX3NlY3RvcihpbmZvLCBmbGFzaF9hZGRyICsgNTEyIC0gMSk7CisKKwkvKiBwcmVwYXJlIHNlY3RvcnMgZm9yIHdyaXRlICovCisJY29tbWFuZFswXSA9IElBUF9DTURfUFJFUEFSRTsKKwljb21tYW5kWzFdID0gZmlyc3Rfc2VjdG9yOworCWNvbW1hbmRbMl0gPSBsYXN0X3NlY3RvcjsKKwlpYXBfZW50cnkoY29tbWFuZCwgcmVzdWx0KTsKKwlpZiAocmVzdWx0WzBdICE9IElBUF9SRVRfQ01EX1NVQ0NFU1MpIHsKKwkJcHJpbnRmKCJJQVAgcHJlcGFyZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gRVJSX1BST0dfRVJST1I7CisJfQorCisJY29tbWFuZFswXSA9IElBUF9DTURfQ09QWTsKKwljb21tYW5kWzFdID0gZmxhc2hfYWRkcjsKKwljb21tYW5kWzJdID0gQ09QWV9CVUZGRVJfTE9DQVRJT047CisJY29tbWFuZFszXSA9IDUxMjsKKwljb21tYW5kWzRdID0gQ0ZHX1NZU19DTEtfRlJFUSA+PiAxMDsKKwlpYXBfZW50cnkoY29tbWFuZCwgcmVzdWx0KTsKKwlpZiAocmVzdWx0WzBdICE9IElBUF9SRVRfQ01EX1NVQ0NFU1MpIHsKKwkJcHJpbnRmKCJJQVAgY29weSBmYWlsZWRcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK2ludCBscGMyMjkyX2ZsYXNoX2VyYXNlIChmbGFzaF9pbmZvX3QgKiBpbmZvLCBpbnQgc19maXJzdCwgaW50IHNfbGFzdCkKK3sKKwlpbnQgZmxhZzsKKwlpbnQgcHJvdDsKKwlpbnQgc2VjdDsKKworCXByb3QgPSAwOworCWZvciAoc2VjdCA9IHNfZmlyc3Q7IHNlY3QgPD0gc19sYXN0OyArK3NlY3QpIHsKKwkJaWYgKGluZm8tPnByb3RlY3Rbc2VjdF0pIHsKKwkJCXByb3QrKzsKKwkJfQorCX0KKwlpZiAocHJvdCkKKwkJcmV0dXJuIEVSUl9QUk9URUNURUQ7CisKKworCWZsYWcgPSBkaXNhYmxlX2ludGVycnVwdHMoKTsKKworCXByaW50ZiAoIkVyYXNpbmcgJWQgc2VjdG9ycyBzdGFydGluZyBhdCBzZWN0b3IgJTJkLlxuIgorCSJUaGlzIG1ha2UgdGFrZSBzb21lIHRpbWUgLi4uICIsCisJc19sYXN0IC0gc19maXJzdCArIDEsIHNfZmlyc3QpOworCisJY29tbWFuZFswXSA9IElBUF9DTURfUFJFUEFSRTsKKwljb21tYW5kWzFdID0gc19maXJzdDsKKwljb21tYW5kWzJdID0gc19sYXN0OworCWlhcF9lbnRyeShjb21tYW5kLCByZXN1bHQpOworCWlmIChyZXN1bHRbMF0gIT0gSUFQX1JFVF9DTURfU1VDQ0VTUykgeworCQlwcmludGYoIklBUCBwcmVwYXJlIGZhaWxlZFxuIik7CisJCXJldHVybiBFUlJfUFJPVEVDVEVEOworCX0KKworCWNvbW1hbmRbMF0gPSBJQVBfQ01EX0VSQVNFOworCWNvbW1hbmRbMV0gPSBzX2ZpcnN0OworCWNvbW1hbmRbMl0gPSBzX2xhc3Q7CisJY29tbWFuZFszXSA9IENGR19TWVNfQ0xLX0ZSRVEgPj4gMTA7CisJaWFwX2VudHJ5KGNvbW1hbmQsIHJlc3VsdCk7CisJaWYgKHJlc3VsdFswXSAhPSBJQVBfUkVUX0NNRF9TVUNDRVNTKSB7CisJCXByaW50ZigiSUFQIGVyYXNlIGZhaWxlZFxuIik7CisJCXJldHVybiBFUlJfUFJPVEVDVEVEOworCX0KKworCWlmIChmbGFnKQorCQllbmFibGVfaW50ZXJydXB0cygpOworCisJcmV0dXJuIEVSUl9PSzsKK30KKworaW50IGxwYzIyOTJfd3JpdGVfYnVmZiAoZmxhc2hfaW5mb190ICogaW5mbywgdWNoYXIgKiBzcmMsIHVsb25nIGFkZHIsCisJCQl1bG9uZyBjbnQpCit7CisJaW50IGZpcnN0X2NvcHlfc2l6ZTsKKwlpbnQgbGFzdF9jb3B5X3NpemU7CisJaW50IGZpcnN0X2Jsb2NrOworCWludCBsYXN0X2Jsb2NrOworCWludCBuYnJfbWlkX2Jsb2NrczsKKwl1Y2hhciBtZW1tYXBfdmFsdWU7CisJdWxvbmcgaTsKKwl1Y2hhciogc3JjX29yZzsKKwl1Y2hhciogZHN0X29yZzsKKwlpbnQgcmV0ID0gRVJSX09LOworCisJc3JjX29yZyA9IHNyYzsKKwlkc3Rfb3JnID0gKHVjaGFyKilhZGRyOworCisJZmlyc3RfYmxvY2sgPSBhZGRyIC8gNTEyOworCWxhc3RfYmxvY2sgPSAoYWRkciArIGNudCkgLyA1MTI7CisJbmJyX21pZF9ibG9ja3MgPSBsYXN0X2Jsb2NrIC0gZmlyc3RfYmxvY2sgLSAxOworCisJZmlyc3RfY29weV9zaXplID0gNTEyIC0gKGFkZHIgJSA1MTIpOworCWxhc3RfY29weV9zaXplID0gKGFkZHIgKyBjbnQpICUgNTEyOworCisJZGVidWcoIlxuY29weSBmaXJzdCBibG9jazogKDEpICVsWCAtPiAlbFggMHgyMDAgYnl0ZXMsICIKKwkJIigyKSAlbFggLT4gJWxYIDB4JVggYnl0ZXMsICgzKSAlbFggLT4gJWxYIDB4MjAwIGJ5dGVzXG4iLAorCSh1bG9uZykoZmlyc3RfYmxvY2sgKiA1MTIpLAorCSh1bG9uZylDT1BZX0JVRkZFUl9MT0NBVElPTiwKKwkodWxvbmcpc3JjLAorCSh1bG9uZykoQ09QWV9CVUZGRVJfTE9DQVRJT04gKyA1MTIgLSBmaXJzdF9jb3B5X3NpemUpLAorCWZpcnN0X2NvcHlfc2l6ZSwKKwkodWxvbmcpQ09QWV9CVUZGRVJfTE9DQVRJT04sCisJKHVsb25nKShmaXJzdF9ibG9jayAqIDUxMikpOworCisJLyogY29weSBmaXJzdCBibG9jayAqLworCW1lbWNweSgodm9pZCopQ09QWV9CVUZGRVJfTE9DQVRJT04sCisJCSh2b2lkKikoZmlyc3RfYmxvY2sgKiA1MTIpLCA1MTIpOworCW1lbWNweSgodm9pZCopKENPUFlfQlVGRkVSX0xPQ0FUSU9OICsgNTEyIC0gZmlyc3RfY29weV9zaXplKSwKKwkJc3JjLCBmaXJzdF9jb3B5X3NpemUpOworCWxwYzIyOTJfY29weV9idWZmZXJfdG9fZmxhc2goaW5mbywgZmlyc3RfYmxvY2sgKiA1MTIpOworCXNyYyArPSBmaXJzdF9jb3B5X3NpemU7CisJYWRkciArPSBmaXJzdF9jb3B5X3NpemU7CisKKwkvKiBjb3B5IG1pZGRsZSBibG9ja3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbmJyX21pZF9ibG9ja3M7IGkrKykgeworCQlkZWJ1ZygiY29weSBtaWRkbGUgYmxvY2s6ICVsWCAtPiAlbFggNTEyIGJ5dGVzLCAiCisJCSIlbFggLT4gJWxYIDUxMiBieXRlc1xuIiwKKwkJKHVsb25nKXNyYywKKwkJKHVsb25nKUNPUFlfQlVGRkVSX0xPQ0FUSU9OLAorCQkodWxvbmcpQ09QWV9CVUZGRVJfTE9DQVRJT04sCisJCSh1bG9uZylhZGRyKTsKKworCQltZW1jcHkoKHZvaWQqKUNPUFlfQlVGRkVSX0xPQ0FUSU9OLCBzcmMsIDUxMik7CisJCWxwYzIyOTJfY29weV9idWZmZXJfdG9fZmxhc2goaW5mbywgYWRkcik7CisJCXNyYyArPSA1MTI7CisJCWFkZHIgKz0gNTEyOworCX0KKworCisJaWYgKGxhc3RfY29weV9zaXplID4gMCkgeworCQlkZWJ1ZygiY29weSBsYXN0IGJsb2NrOiAoMSkgJWxYIC0+ICVsWCAweDIwMCBieXRlcywgIgorCQkiKDIpICVsWCAtPiAlbFggMHglWCBieXRlcywgKDMpICVsWCAtPiAlbFggeDIwMCBieXRlc1xuIiwKKwkJKHVsb25nKShsYXN0X2Jsb2NrICogNTEyKSwKKwkJKHVsb25nKUNPUFlfQlVGRkVSX0xPQ0FUSU9OLAorCQkodWxvbmcpc3JjLAorCQkodWxvbmcpKENPUFlfQlVGRkVSX0xPQ0FUSU9OKSwKKwkJbGFzdF9jb3B5X3NpemUsCisJCSh1bG9uZylDT1BZX0JVRkZFUl9MT0NBVElPTiwKKwkJKHVsb25nKWFkZHIpOworCisJCS8qIGNvcHkgbGFzdCBibG9jayAqLworCQltZW1jcHkoKHZvaWQqKUNPUFlfQlVGRkVSX0xPQ0FUSU9OLAorCQkJKHZvaWQqKShsYXN0X2Jsb2NrICogNTEyKSwgNTEyKTsKKwkJbWVtY3B5KCh2b2lkKilDT1BZX0JVRkZFUl9MT0NBVElPTiwKKwkJCXNyYywgbGFzdF9jb3B5X3NpemUpOworCQlscGMyMjkyX2NvcHlfYnVmZmVyX3RvX2ZsYXNoKGluZm8sIGFkZHIpOworCX0KKworCS8qIHZlcmlmeSB3cml0ZSAqLworCW1lbW1hcF92YWx1ZSA9IEdFVDgoTUVNTUFQKTsKKworCWRpc2FibGVfaW50ZXJydXB0cygpOworCisJUFVUOChNRU1NQVAsIDAxKTsJCS8qIHdlIG11c3QgbWFrZSBzdXJlIHRoYXQgaW5pdGlhbCA2NAorCQkJCQkJCSAgIGJ5dGVzIGFyZSB0YWtlbiBmcm9tIGZsYXNoIHdoZW4gd2UKKwkJCQkJCQkgICBkbyB0aGUgY29tcGFyZSAqLworCisJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisJCWlmICgqZHN0X29yZyAhPSAqc3JjX29yZyl7CisJCQlwcmludGYoIldyaXRlIGZhaWxlZC4gQnl0ZSAlbFggZGlmZmVyc1xuIiwgaSk7CisJCQlyZXQgPSBFUlJfUFJPR19FUlJPUjsKKwkJCWJyZWFrOworCQl9CisJCWRzdF9vcmcrKzsKKwkJc3JjX29yZysrOworCX0KKworCVBVVDgoTUVNTUFQLCBtZW1tYXBfdmFsdWUpOworCWVuYWJsZV9pbnRlcnJ1cHRzKCk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvbHBjMjI5MnNvZGltbS9pYXBfZW50cnkuUyBiL2NwdS9hcm03MjB0L2xwYzIyOTIvaWFwX2VudHJ5LlMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJvYXJkL2xwYzIyOTJzb2RpbW0vaWFwX2VudHJ5LlMKcmVuYW1lIHRvIGNwdS9hcm03MjB0L2xwYzIyOTIvaWFwX2VudHJ5LlMKZGlmZiAtLWdpdCBhL2NwdS9hcm03MjB0L2xwYzIyOTIvbW1jLmMgYi9jcHUvYXJtNzIwdC9scGMyMjkyL21tYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkN2YxNDkKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvYXJtNzIwdC9scGMyMjkyL21tYy5jCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1tYy5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8cGFydC5oPgorI2luY2x1ZGUgPGZhdC5oPgorI2luY2x1ZGUgIm1tY19ody5oIgorI2luY2x1ZGUgPGFzbS9hcmNoL3NwaS5oPgorCisjaWZkZWYgQ09ORklHX01NQworCisjdW5kZWYgTU1DX0RFQlVHCisKK3N0YXRpYyBibG9ja19kZXZfZGVzY190IG1tY19kZXY7CisKKy8qIHRoZXNlIGFyZSBmaWxsZWQgb3V0IGJ5IGEgY2FsbCB0byBtbWNfaHdfZ2V0X3BhcmFtZXRlcnMgKi8KK3N0YXRpYyBpbnQgaHdfc2l6ZTsJCS8qIGluIGtieXRlcyAqLworc3RhdGljIGludCBod19ucl9zZWN0czsKK3N0YXRpYyBpbnQgaHdfc2VjdF9zaXplOwkvKiBpbiBieXRlcyAqLworCitibG9ja19kZXZfZGVzY190ICogbW1jX2dldF9kZXYoaW50IGRldikKK3sKKwlyZXR1cm4gKGJsb2NrX2Rldl9kZXNjX3QgKikoJm1tY19kZXYpOworfQorCit1bnNpZ25lZCBsb25nIG1tY19ibG9ja19yZWFkKGludCBkZXYsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsCisJCQkgICAgIGxiYWludF90IGJsa2NudCwKKwkJCSAgICAgdm9pZCAqYnVmZmVyKQoreworCXVuc2lnbmVkIGxvbmcgcmMgPSAwOworCXVuc2lnbmVkIGNoYXIgKnAgPSAodW5zaWduZWQgY2hhciAqKWJ1ZmZlcjsKKwl1bnNpZ25lZCBsb25nIGk7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gc3RhcnQ7CisKKyNpZmRlZiBNTUNfREVCVUcKKwlwcmludGYoIm1tY19ibG9ja19yZWFkOiBzdGFydD0lbHUsIGJsa2NudD0lbHVcbiIsIHN0YXJ0LAorCQkgKHVuc2lnbmVkIGxvbmcpYmxrY250KTsKKyNlbmRpZgorCisJZm9yKGkgPSAwOyBpIDwgKHVuc2lnbmVkIGxvbmcpYmxrY250OyBpKyspIHsKKyNpZmRlZiBNTUNfREVCVUcKKwkJcHJpbnRmKCJtbWNfcmVhZF9zZWN0b3I6IGFkZHI9JWx1LCBidWZmZXI9JXBcbiIsIGFkZHIsIHApOworI2VuZGlmCisJCSh2b2lkKW1tY19yZWFkX3NlY3RvcihhZGRyLCBwKTsKKwkJcmMrKzsKKwkJYWRkcisrOworCQlwICs9IGh3X3NlY3Rfc2l6ZTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlYWQgaGFyZHdhcmUgcGFyYW10ZXJlcnMgKHNlY3RvciBzaXplLCBzaXplLCBudW1iZXIgb2Ygc2VjdG9ycykKKyAqLworc3RhdGljIGludCBtbWNfaHdfZ2V0X3BhcmFtZXRlcnModm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGNzZGRhdGFbMTZdOworCXVuc2lnbmVkIGludCBzaXplbXVsdDsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCW1tY19yZWFkX2NzZChjc2RkYXRhKTsKKwlod19zZWN0X3NpemUgPSAxPDwoY3NkZGF0YVs1XSAmIDB4MGYpOworCXNpemUgPSAoKGNzZGRhdGFbNl0mMHgwMyk8PDEwKSsoY3NkZGF0YVs3XTw8MikrKGNzZGRhdGFbOF0mMHhjMCk7CisJc2l6ZW11bHQgPSAoKGNzZGRhdGFbMTBdICYgMHg4MCk+PjcpKygoY3NkZGF0YVs5XSAmIDB4MDMpPDwxKTsKKwlod19ucl9zZWN0cyA9IChzaXplKzEpKigxPDwoc2l6ZW11bHQrMikpOworCWh3X3NpemUgPSBod19ucl9zZWN0cypod19zZWN0X3NpemUvMTAyNDsKKworI2lmZGVmIE1NQ19ERUJVRworCXByaW50ZigibW1jX2h3X2dldF9wYXJhbWV0ZXJzOiBod19zZWN0X3NpemU9JWQsIGh3X25yX3NlY3RzPSVkLCAiCisJCSAiaHdfc2l6ZT0lZFxuIiwgaHdfc2VjdF9zaXplLCBod19ucl9zZWN0cywgaHdfc2l6ZSk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitpbnQgbW1jX2luaXQoaW50IHZlcmJvc2UpCit7CisJaW50IHJldCA9IC1FTk9ERVY7CisKKwlpZiAodmVyYm9zZSkKKwkJcHJpbnRmKCJtbWNfaW5pdFxuIik7CisKKwlzcGlfaW5pdCgpOworCS8qIHRoaXMgbWVlZHMgdG8gYmUgZG9uZSB0d2ljZSAqLworCW1tY19od19pbml0KCk7CisJdWRlbGF5KDEwMDApOworCW1tY19od19pbml0KCk7CisKKwltbWNfaHdfZ2V0X3BhcmFtZXRlcnMoKTsKKworCW1tY19kZXYuaWZfdHlwZSA9IElGX1RZUEVfTU1DOworCW1tY19kZXYucGFydF90eXBlID0gUEFSVF9UWVBFX0RPUzsKKwltbWNfZGV2LmRldiA9IDA7CisJbW1jX2Rldi5sdW4gPSAwOworCW1tY19kZXYudHlwZSA9IDA7CisJbW1jX2Rldi5ibGtzeiA9IGh3X3NlY3Rfc2l6ZTsKKwltbWNfZGV2LmxiYSA9IGh3X25yX3NlY3RzOworCXNwcmludGYoKGNoYXIqKW1tY19kZXYudmVuZG9yLCAiVW5rbm93biB2ZW5kb3IiKTsKKwlzcHJpbnRmKChjaGFyKiltbWNfZGV2LnByb2R1Y3QsICJVbmtub3duIHByb2R1Y3QiKTsKKwlzcHJpbnRmKChjaGFyKiltbWNfZGV2LnJldmlzaW9uLCAiTi9BIik7CisJbW1jX2Rldi5yZW1vdmFibGUgPSAwOwkvKiBzaG91bGQgYmUgdHJ1ZT8/PyAqLworCW1tY19kZXYuYmxvY2tfcmVhZCA9IG1tY19ibG9ja19yZWFkOworCisJZmF0X3JlZ2lzdGVyX2RldmljZSgmbW1jX2RldiwgMSk7CisKKwlyZXQgPSAwOworCisJcmV0dXJuIHJldDsKK30KKworaW50IG1tY193cml0ZSh1Y2hhciAqIHNyYywgdWxvbmcgZHN0LCBpbnQgc2l6ZSkKK3sKKyNpZmRlZiBNTUNfREVCVUcKKwlwcmludGYoIm1tY193cml0ZTogc3JjPSVwLCBkc3Q9JWx1LCBzaXplPSV1XG4iLCBzcmMsIGRzdCwgc2l6ZSk7CisjZW5kaWYKKwkvKiBTaW5jZSBtbWMyaW5mbyBhbHdheXMgcmV0dXJucyAwIHRoaXMgZnVuY3Rpb24gd2lsbCBuZXZlciBiZSBjYWxsZWQgKi8KKwlyZXR1cm4gMDsKK30KKworaW50IG1tY19yZWFkKHVsb25nIHNyYywgdWNoYXIgKiBkc3QsIGludCBzaXplKQoreworI2lmZGVmIE1NQ19ERUJVRworCXByaW50ZigibW1jX3JlYWQ6IHNyYz0lbHUsIGRzdD0lcCwgc2l6ZT0ldVxuIiwgc3JjLCBkc3QsIHNpemUpOworI2VuZGlmCisJLyogU2luY2UgbW1jMmluZm8gYWx3YXlzIHJldHVybnMgMCB0aGlzIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgYmUgY2FsbGVkICovCisJcmV0dXJuIDA7Cit9CisKK2ludCBtbWMyaW5mbyh1bG9uZyBhZGRyKQoreworCS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBjbWRfY3AgdG8gZGV0ZXJtaW5lIGlmIHNvdXJjZSBvciBkZXN0aW5hdGlvbgorCSBhZGRyZXNzIHJlc2lkZXMgb24gTU1DLWNhcmQgb3Igbm90LiBXZSBkbyBub3Qgc3VwcG9ydCBjb3B5IHRvIGFuZCBmcm9tCisJIE1NQy1jYXJkIHNvIHdlIGFsd2F5cyByZXR1cm4gMC4gKi8KKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19NTUMgKi8KZGlmZiAtLWdpdCBhL2NwdS9hcm03MjB0L2xwYzIyOTIvbW1jX2h3LmMgYi9jcHUvYXJtNzIwdC9scGMyMjkyL21tY19ody5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZGM0YTYKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvYXJtNzIwdC9scGMyMjkyL21tY19ody5jCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICAgIFRoaXMgY29kZSB3YXMgb3JpZ2luYWwgd3JpdHRlbiBieSBVbHJpY2ggUmFkaWcgYW5kIG1vZGlmaWVkIGJ5CisgICAgRW1iZWRkZWQgQXJ0aXN0cyBBQiAod3d3LmVtYmVkZGVkYXJ0aXN0cy5jb20pLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3BpLmg+CisKKyNkZWZpbmUgTU1DX0VuYWJsZSgpIFBVVDMyKElPMUNMUiwgMWwgPDwgMjIpCisjZGVmaW5lIE1NQ19EaXNhYmxlKCkgUFVUMzIoSU8xU0VULCAxbCA8PCAyMikKKyNkZWZpbmUgbW1jX3NwaV9jZmcoKSBzcGlfc2V0X2Nsb2NrKDgpOyBzcGlfc2V0X2NmZygwLCAxLCAwKTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgV3JpdGVfQ29tbWFuZF9NTUMgKHVuc2lnbmVkIGNoYXIgKkNNRCk7CitzdGF0aWMgdm9pZCBNTUNfUmVhZF9CbG9jayh1bnNpZ25lZCBjaGFyICpDTUQsIHVuc2lnbmVkIGNoYXIgKkJ1ZmZlciwKKwkJICAgIHVuc2lnbmVkIHNob3J0IGludCBCeXRlcyk7CisKKy8qIGluaXRpYWxpemUgdGhlIGhhcmR3YXJlICovCitpbnQgbW1jX2h3X2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGE7CisJdW5zaWduZWQgc2hvcnQgaW50IFRpbWVvdXQgPSAwOworCXVuc2lnbmVkIGNoYXIgYjsKKwl1bnNpZ25lZCBjaGFyIENNRFtdID0gezB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTV9OworCisJLyogc2V0LXVwIEdQSU8gYW5kIFNQSSAqLworCSgqKCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopUElOU0VMMikpICY9IH4oMWwgPDwgMyk7IC8qIGNsZWFyIGJpdCAzICovCisJKCooKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKilJTzFESVIpKSB8PSAoMWwgPDwgMjIpOyAvKiBzZXQgYml0IDIyIChvdXRwdXQpICovCisKKwlNTUNfRGlzYWJsZSgpOworCisJc3BpX2xvY2soKTsKKwlzcGlfc2V0X2Nsb2NrKDI0OCk7CisJc3BpX3NldF9jZmcoMCwgMSwgMCk7CisJTU1DX0VuYWJsZSgpOworCisJLyogd2FzdGUgc29tZSB0aW1lICovCisJZm9yKGE9MDsgYSA8IDIwMDAwOyBhKyspCisJCWFzbSgibm9wIik7CisKKwkvKiBQdXQgdGhlIE1NQy9TRC1jYXJkIGludG8gU1BJLW1vZGUgKi8KKwlmb3IgKGIgPSAwOyBiIDwgMTA7IGIrKykgLyogU2VuZHMgbWluIDc0KyBjbG9ja3MgdG8gdGhlIE1NQy9TRC1jYXJkICovCisJCXNwaV93cml0ZSgweGZmKTsKKworCS8qIFNlbmRzIGNvbW1hbmQgQ01EMCB0byBNTUMvU0QtY2FyZCAqLworCXdoaWxlIChXcml0ZV9Db21tYW5kX01NQyhDTUQpICE9IDEpIHsKKwkJaWYgKFRpbWVvdXQrKyA+IDIwMCkgeworCQkJTU1DX0Rpc2FibGUoKTsKKwkJCXNwaV91bmxvY2soKTsKKwkJCXJldHVybigxKTsgLyogQWJvcnQgd2l0aCBjb21tYW5kIDEgKHJldHVybiAxKSAqLworCQl9CisJfQorCS8qIFNlbmRzIENvbW1hbmQgQ01EMSBhbiBNTUMvU0QtY2FyZCAqLworCVRpbWVvdXQgPSAwOworCUNNRFswXSA9IDB4NDE7LyogQ29tbWFuZCAxICovCisJQ01EWzVdID0gMHhGRjsKKworCXdoaWxlIChXcml0ZV9Db21tYW5kX01NQyhDTUQpICE9IDApIHsKKwkJaWYgKFRpbWVvdXQrKyA+IDIwMCkgeworCQkJTU1DX0Rpc2FibGUoKTsKKwkJCXNwaV91bmxvY2soKTsKKwkJCXJldHVybiAoMik7IC8qIEFib3J0IHdpdGggY29tbWFuZCAyIChyZXR1cm4gMikgKi8KKwkJfQorCX0KKworCU1NQ19EaXNhYmxlKCk7CisJc3BpX3VubG9jaygpOworCisJcmV0dXJuIDA7Cit9CisKKy8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgIFNlbmRzIGEgY29tbWFuZCB0byB0aGUgTU1DL1NELWNhcmQKKyAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIFdyaXRlX0NvbW1hbmRfTU1DICh1bnNpZ25lZCBjaGFyICpDTUQpCit7CisJdW5zaWduZWQgY2hhciBhLCB0bXAgPSAweGZmOworCXVuc2lnbmVkIHNob3J0IGludCBUaW1lb3V0ID0gMDsKKworCU1NQ19EaXNhYmxlKCk7CisJc3BpX3dyaXRlKDB4RkYpOworCU1NQ19FbmFibGUoKTsKKworCWZvciAoYSA9IDA7IGEgPCAweDA2OyBhKyspCisJCXNwaV93cml0ZSgqQ01EKyspOworCisJd2hpbGUgKHRtcCA9PSAweGZmKSB7CisJCXRtcCA9IHNwaV9yZWFkKCk7CisJCWlmIChUaW1lb3V0KysgPiA1MDAwKQorCQkgIGJyZWFrOworCX0KKworCXJldHVybiAodG1wKTsKK30KKworLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgUm91dGluZSB0byByZWFkIHRoZSBDSUQgcmVnaXN0ZXIgZnJvbSB0aGUgTU1DL1NELWNhcmQgKDE2IGJ5dGVzKQorICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAqLwordm9pZCBNTUNfUmVhZF9CbG9jayh1bnNpZ25lZCBjaGFyICpDTUQsIHVuc2lnbmVkIGNoYXIgKkJ1ZmZlciwgdW5zaWduZWQgc2hvcnQKKwlpbnQgQnl0ZXMpCit7CisJdW5zaWduZWQgc2hvcnQgaW50IGE7CisKKwlzcGlfbG9jaygpOworCW1tY19zcGlfY2ZnKCk7CisJTU1DX0VuYWJsZSgpOworCisJaWYgKFdyaXRlX0NvbW1hbmRfTU1DKENNRCkgIT0gMCkgeworCQlNTUNfRGlzYWJsZSgpOworCQlzcGlfdW5sb2NrKCk7CisJCXJldHVybjsKKwl9CisKKwl3aGlsZSAoc3BpX3JlYWQoKSAhPSAweGZlKSB7fTsKKwlmb3IgKGEgPSAwOyBhIDwgQnl0ZXM7IGErKykKKwkJKkJ1ZmZlcisrID0gc3BpX3JlYWQoKTsKKworCS8qIFJlYWQgdGhlIENSQy1ieXRlICovCisJc3BpX3JlYWQoKTsgLyogQ1JDIC0gYnl0ZSBpcyBkaXNjYXJkZWQgKi8KKwlzcGlfcmVhZCgpOyAvKiBDUkMgLSBieXRlIGlzIGRpc2NhcmRlZCAqLworCS8qIHNldCBNTUNfQ2hpcF9TZWxlY3QgdG8gaGlnaCAoTU1DL1NELWNhcmQgSW5ha3RpdikgKi8KKwlNTUNfRGlzYWJsZSgpOworCXNwaV91bmxvY2soKTsKKworCXJldHVybjsKK30KKworLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgUm91dGluZSB0byByZWFkIGEgYmxvY2sgKDUxMiBieXRlcykgZnJvbSB0aGUgTU1DL1NELWNhcmQKKyAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KK3Vuc2lnbmVkIGNoYXIgbW1jX3JlYWRfc2VjdG9yICh1bnNpZ25lZCBsb25nIGFkZHIsdW5zaWduZWQgY2hhciAqQnVmZmVyKQoreworCS8qIENvbW1hbmQgMTYgdG8gcmVhZCBhQmxvY2tzIGZyb20gdGhlIE1NQy9TRCAtIGNhZWQgKi8KKwl1bnNpZ25lZCBjaGFyIENNRFtdID0gezB4NTEsMHgwMCwweDAwLDB4MDAsMHgwMCwweEZGfTsKKworCS8qIFRoZSBhZGRyZXMgb24gdGhlIE1NQy9TRC1jYXJkIGlzIGluIGJ5dGVzLAorCWFkZHIgaXMgdHJhbnNmb3JtZWQgZnJvbSBibG9ja3MgdG8gYnl0ZXMgYW5kIHRoZSByZXN1bHQgaXMKKwlwbGFjZWQgaW50byB0aGUgY29tbWFuZCAqLworCisJYWRkciA9IGFkZHIgPDwgOTsgLyogYWRkciA9IGFkZHIgKiA1MTIgKi8KKworCUNNRFsxXSA9ICgoYWRkciAmIDB4RkYwMDAwMDApID4+IDI0KTsKKwlDTURbMl0gPSAoKGFkZHIgJiAweDAwRkYwMDAwKSA+PiAxNik7CisJQ01EWzNdID0gKChhZGRyICYgMHgwMDAwRkYwMCkgPj4gOCApOworCisJTU1DX1JlYWRfQmxvY2soQ01ELCBCdWZmZXIsIDUxMik7CisKKwlyZXR1cm4gKDApOworfQorCisvKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICBSb3V0aW5lIHRvIHdyaXRlIGEgYmxvY2sgKDUxMiBieXRlKSB0byB0aGUgTU1DL1NELWNhcmQKKyAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KK3Vuc2lnbmVkIGNoYXIgbW1jX3dyaXRlX3NlY3RvciAodW5zaWduZWQgbG9uZyBhZGRyLHVuc2lnbmVkIGNoYXIgKkJ1ZmZlcikKK3sKKwl1bnNpZ25lZCBjaGFyIHRtcCwgYTsKKwl1bnNpZ25lZCBzaG9ydCBpbnQgYjsKKwkvKiBDb21tYW5kIDI0IHRvIHdyaXRlIGEgYmxvY2sgdG8gdGhlIE1NQy9TRCAtIGNhcmQgKi8KKwl1bnNpZ25lZCBjaGFyIENNRFtdID0gezB4NTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkZ9OworCisJLyogVGhlIGFkZHJlcyBvbiB0aGUgTU1DL1NELWNhcmQgaXMgaW4gYnl0ZXMsCisJYWRkciBpcyB0cmFuc2Zvcm1lZCBmcm9tIGJsb2NrcyB0byBieXRlcyBhbmQgdGhlIHJlc3VsdCBpcworCXBsYWNlZCBpbnRvIHRoZSBjb21tYW5kICovCisKKwlhZGRyID0gYWRkciA8PCA5OyAvKiBhZGRyID0gYWRkciAqIDUxMiAqLworCisJQ01EWzFdID0gKChhZGRyICYgMHhGRjAwMDAwMCkgPj4gMjQpOworCUNNRFsyXSA9ICgoYWRkciAmIDB4MDBGRjAwMDApID4+IDE2KTsKKwlDTURbM10gPSAoKGFkZHIgJiAweDAwMDBGRjAwKSA+PiA4ICk7CisKKwlzcGlfbG9jaygpOworCW1tY19zcGlfY2ZnKCk7CisJTU1DX0VuYWJsZSgpOworCisJLyogU2VuZCBjb21tYW5kIENNRDI0IHRvIHRoZSBNTUMvU0QtY2FyZCAoV3JpdGUgMSBCbG9jay81MTIgQnl0ZXMpICovCisJdG1wID0gV3JpdGVfQ29tbWFuZF9NTUMoQ01EKTsKKwlpZiAodG1wICE9IDApIHsKKwkJTU1DX0Rpc2FibGUoKTsKKwkJc3BpX3VubG9jaygpOworCQlyZXR1cm4odG1wKTsKKwl9CisKKwkvKiBEbyBhIHNob3J0IGRlbGF5IGFuZCBzZW5kIGEgY2xvY2stcHVsc2UgdG8gdGhlIE1NQy9TRC1jYXJkICovCisJZm9yIChhID0gMDsgYSA8IDEwMDsgYSsrKQorCQlzcGlfcmVhZCgpOworCisJLyogU2VuZCBhIHN0YXJ0IGJ5dGUgdG8gdGhlIE1NQy9TRC1jYXJkICovCisJc3BpX3dyaXRlKDB4RkUpOworCisJLyogV3JpdGUgdGhlIGJsb2NrICg1MTIgYnl0ZXMpIHRvIHRoZSBNTUMvU0QtY2FyZCAqLworCWZvciAoYiA9IDA7IGIgPCA1MTI7IGIrKykKKwkJc3BpX3dyaXRlKCpCdWZmZXIrKyk7CisKKwkvKiB3cml0ZSB0aGUgQ1JDLUJ5dGUgKi8KKwlzcGlfd3JpdGUoMHhGRik7IC8qIHdyaXRlIGEgZHVtbXkgQ1JDICovCisJc3BpX3dyaXRlKDB4RkYpOyAvKiBDUkMgY29kZSBpcyBub3QgdXNlZCAqLworCisJLyogV2FpdCBmb3IgTU1DL1NELWNhcmQgYnVzeSAqLworCXdoaWxlIChzcGlfcmVhZCgpICE9IDB4ZmYpIHt9OworCisJLyogc2V0IE1NQ19DaGlwX1NlbGVjdCB0byBoaWdoIChNTUMvU0QtY2FyZCBpbmFjdGl2ZSkgKi8KKwlNTUNfRGlzYWJsZSgpOworCXNwaV91bmxvY2soKTsKKwlyZXR1cm4gKDApOworfQorCisvKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICBSb3V0aW5lIHRvIHJlYWQgdGhlIENTRCByZWdpc3RlciBmcm9tIHRoZSBNTUMvU0QtY2FyZCAoMTYgYnl0ZXMpCisgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCit1bnNpZ25lZCBjaGFyIG1tY19yZWFkX2NzZCAodW5zaWduZWQgY2hhciAqQnVmZmVyKQoreworCS8qIENvbW1hbmQgdG8gcmVhZCB0aGUgQ1NEIHJlZ2lzdGVyICovCisJdW5zaWduZWQgY2hhciBDTURbXSA9IHsweDQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZGfTsKKworCU1NQ19SZWFkX0Jsb2NrKENNRCwgQnVmZmVyLCAxNik7CisKKwlyZXR1cm4gKDApOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvbHBjMjI5MnNvZGltbS9tbWNfaHcuaCBiL2NwdS9hcm03MjB0L2xwYzIyOTIvbW1jX2h3LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGJvYXJkL2xwYzIyOTJzb2RpbW0vbW1jX2h3LmgKcmVuYW1lIHRvIGNwdS9hcm03MjB0L2xwYzIyOTIvbW1jX2h3LmgKZGlmZiAtLWdpdCBhL2NwdS9hcm03MjB0L2xwYzIyOTIvc3BpLmMgYi9jcHUvYXJtNzIwdC9scGMyMjkyL3NwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOTZiZGEKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvYXJtNzIwdC9scGMyMjkyL3NwaS5jCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgICAgVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBhbiBpbnRlcmZhY2UgdG8gdGhlIFNQSSBvbiB0aGUgbHBjMjJ4eC4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDYgIEVtYmVkZGVkIEFydGlzdHMgQUIgKHd3dy5lbWJlZGRlZGFydGlzdHMuY29tKQorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3BpLmg+CisKK3Vuc2lnbmVkIGxvbmcgc3BpX2ZsYWdzOwordW5zaWduZWQgY2hhciBzcGlfaWRsZSA9IDB4MDA7CisKK2ludCBzcGlfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgcGluc2VsMF92YWx1ZTsKKworCS8qIGFjdGl2YXRlIHNwaSBwaW5zICovCisJcGluc2VsMF92YWx1ZSA9IEdFVDMyKFBJTlNFTDApOworCXBpbnNlbDBfdmFsdWUgJj0gfigweEZGbCA8PCA4KTsKKwlwaW5zZWwwX3ZhbHVlIHw9ICgweDU1bCA8PCA4KTsKKwlQVVQzMihQSU5TRUwwLCBwaW5zZWwwX3ZhbHVlKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC9NYWtlZmlsZSBiL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvTWFrZWZpbGUKaW5kZXggOGQ0ZTQ3OC4uZWFhYmFkMiAxMDA2NDQKLS0tIGEvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC9NYWtlZmlsZQorKysgYi9jcHUvYXJtOTIwdC9hdDkxcm05MjAwL01ha2VmaWxlCkBAIC0yNiw3ICsyNiw3IEBACiBMSUIJPSAkKG9iailsaWIkKFNPQykuYQogCiBDT0JKUwk9IGJjbTUyMjEubyBkbTkxNjEubyBldGhlci5vIGkyYy5vIGludGVycnVwdHMubyBcCi0JICBseHQ5NzIubyBzZXJpYWwubyB1c2Jfb2hjaS5vCisJICBseHQ5NzIubyBzZXJpYWwubyB1c2IubwogU09CSlMJPSBsb3dsZXZlbF9pbml0Lm8KIAogU1JDUwk6PSAkKFNPQkpTOi5vPS5TKSAkKENPQkpTOi5vPS5jKQpkaWZmIC0tZ2l0IGEvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC9iY201MjIxLmMgYi9jcHUvYXJtOTIwdC9hdDkxcm05MjAwL2JjbTUyMjEuYwppbmRleCA2ZGIxNDM1Li5iNTJjNjE1IDEwMDY0NAotLS0gYS9jcHUvYXJtOTIwdC9hdDkxcm05MjAwL2JjbTUyMjEuYworKysgYi9jcHUvYXJtOTIwdC9hdDkxcm05MjAwL2JjbTUyMjEuYwpAQCAtMzIsNyArMzIsNyBAQAogCiAjaWZkZWYgQ09ORklHX0RSSVZFUl9FVEhFUgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAKIC8qCiAgKiBOYW1lOgpAQCAtMjI3LDYgKzIyNyw2IEBACiAJcmV0dXJuIEZBTFNFOwogfQogCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQgKi8KKyNlbmRpZgogCiAjZW5kaWYJLyogQ09ORklHX0RSSVZFUl9FVEhFUiAqLwpkaWZmIC0tZ2l0IGEvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC9kbTkxNjEuYyBiL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvZG05MTYxLmMKaW5kZXggNGIxM2MyMy4uOTY4ZjY1MyAxMDA2NDQKLS0tIGEvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC9kbTkxNjEuYworKysgYi9jcHUvYXJtOTIwdC9hdDkxcm05MjAwL2RtOTE2MS5jCkBAIC0yNyw3ICsyNyw3IEBACiAKICNpZmRlZiBDT05GSUdfRFJJVkVSX0VUSEVSCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAogLyoKICAqIE5hbWU6CkBAIC0yMjAsNiArMjIwLDYgQEAKIAlyZXR1cm4gRkFMU0U7CiB9CiAKLSNlbmRpZgkvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCAqLworI2VuZGlmCiAKICNlbmRpZgkvKiBDT05GSUdfRFJJVkVSX0VUSEVSICovCmRpZmYgLS1naXQgYS9jcHUvYXJtOTIwdC9hdDkxcm05MjAwL2V0aGVyLmMgYi9jcHUvYXJtOTIwdC9hdDkxcm05MjAwL2V0aGVyLmMKaW5kZXggNjcwMDhkMC4uYzhmNTZhYSAxMDA2NDQKLS0tIGEvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC9ldGhlci5jCisrKyBiL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvZXRoZXIuYwpAQCAtNTAsNyArNTAsNyBAQAogCiAjaWZkZWYgQ09ORklHX0RSSVZFUl9FVEhFUgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAKIC8qIGFsaWdubWVudCBhcyBwZXIgRXJyYXRhICMxMSAoNjQgYnl0ZXMpIGlzIGluc3VmZmljaWVudCEgKi8KIHJiZl90IHJiZmR0W1JCRl9GUkFNRU1BWF0gX19hdHRyaWJ1dGUoKGFsaWduZWQoNTEyKSkpOwpAQCAtMjY1LDcgKzI2NSw3IEBACiB7CiB9OwogCi0jaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCisjaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogaW50ICBhdDkxcm05MjAwX21paXBoeV9yZWFkKGNoYXIgKmRldm5hbWUsIHVuc2lnbmVkIGNoYXIgYWRkciwKIAkJdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIHNob3J0ICogdmFsdWUpCiB7CkBAIC0yODQsMTYgKzI4NCwxNiBAQAogCXJldHVybiAwOwogfQogCi0jZW5kaWYJLyogZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpICovCisjZW5kaWYKIAogaW50IGF0OTFybTkyMDBfbWlpcGh5X2luaXRpYWxpemUoYmRfdCAqYmlzKQogewotI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQorI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKIAltaWlwaHlfcmVnaXN0ZXIoImF0OTFybTkyMDBwaHkiLCBhdDkxcm05MjAwX21paXBoeV9yZWFkLCBhdDkxcm05MjAwX21paXBoeV93cml0ZSk7CiAjZW5kaWYKIAlyZXR1cm4gMDsKIH0KIAotI2VuZGlmCS8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUICovCisjZW5kaWYKIAogI2VuZGlmCS8qIENPTkZJR19EUklWRVJfRVRIRVIgKi8KZGlmZiAtLWdpdCBhL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvbHh0OTcyLmMgYi9jcHUvYXJtOTIwdC9hdDkxcm05MjAwL2x4dDk3Mi5jCmluZGV4IGYxMmM1OWMuLjRlZGNjOWEgMTAwNjQ0Ci0tLSBhL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvbHh0OTcyLmMKKysrIGIvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC9seHQ5NzIuYwpAQCAtMzMsNyArMzMsNyBAQAogCiAjaWZkZWYgQ09ORklHX0RSSVZFUl9FVEhFUgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAKIC8qCiAgKiBOYW1lOgpAQCAtMTg2LDYgKzE4Niw2IEBACiAJcmV0dXJuIChseHQ5NzJfR2V0TGlua1NwZWVkIChwX21hYykpOwogfQogCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQgKi8KKyNlbmRpZgogCiAjZW5kaWYJLyogQ09ORklHX0RSSVZFUl9FVEhFUiAqLwpkaWZmIC0tZ2l0IGEvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC91c2IuYyBiL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY2MjYyZQotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvdXNiLmMKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZyA8bWtAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9ORVcpICYmIGRlZmluZWQoQ0ZHX1VTQl9PSENJX0NQVV9JTklUKQorIyBpZmRlZiBDT05GSUdfQVQ5MVJNOTIwMAorCisjaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KKworaW50IHVzYl9jcHVfaW5pdCgpCit7CisJLyogRW5hYmxlIFVTQiBob3N0IGNsb2NrLiAqLworCSpBVDkxQ19QTUNfU0NFUiA9IEFUOTFDX1BNQ19VSFA7CS8qIDQ4TUh6IGNsb2NrIGVuYWJsZWQgZm9yIFVIUCAqLworCSpBVDkxQ19QTUNfUENFUiA9IDEgPDwgQVQ5MUNfSURfVUhQOwkvKiBQZXJpcGhlcmFsIENsb2NrIEVuYWJsZSBSZWdpc3RlciAqLworCXJldHVybiAwOworfQorCitpbnQgdXNiX2NwdV9zdG9wKCkKK3sKKwkvKiBJbml0aWFsaXphdGlvbiBmYWlsZWQgKi8KKwkqQVQ5MUNfUE1DX1BDRFIgPSAxIDw8IEFUOTFDX0lEX1VIUDsJLyogUGVyaXBoZXJhbCBDbG9jayBEaXNhYmxlIFJlZ2lzdGVyICovCisJKkFUOTFDX1BNQ19TQ0RSID0gQVQ5MUNfUE1DX1VIUDsJLyogNDhNSHogY2xvY2sgZGlzYWJsZWQgZm9yIFVIUCAqLworCXJldHVybiAwOworfQorCitpbnQgdXNiX2NwdV9pbml0X2ZhaWwoKQoreworCXVzYl9jcHVfc3RvcCgpOworfQorCisjIGVuZGlmIC8qIENPTkZJR19BVDkxUk05MjAwICovCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfVVNCX09IQ0kpICYmIGRlZmluZWQoQ0ZHX1VTQl9PSENJX0NQVV9JTklUKSAqLwpkaWZmIC0tZ2l0IGEvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC91c2Jfb2hjaS5jIGIvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC91c2Jfb2hjaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjJjNTZjLi4wMDAwMDAwCi0tLSBhL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvdXNiX29oY2kuYworKysgL2Rldi9udWxsCkBAIC0xLDE2MzUgKzAsMCBAQAotLyoKLSAqIFVSQiBPSENJIEhDRCAoSG9zdCBDb250cm9sbGVyIERyaXZlcikgZm9yIFVTQiBvbiB0aGUgQVQ5MVJNOTIwMC4KLSAqCi0gKiAoQykgQ29weXJpZ2h0IDIwMDMKLSAqIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nIDxnakBkZW54LmRlPgotICoKLSAqIE5vdGU6IE11Y2ggb2YgdGhpcyBjb2RlIGhhcyBiZWVuIGRlcml2ZWQgZnJvbSBMaW51eCAyLjQKLSAqIChDKSBDb3B5cmlnaHQgMTk5OSBSb21hbiBXZWlzc2dhZXJiZXIgPHdlaXNzZ0B2aWVubmEuYXQ+Ci0gKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMiBEYXZpZCBCcm93bmVsbAotICoKLSAqIE1vZGlmaWVkIGZvciB0aGUgTVAyVVNCIGJ5IChDKSBDb3B5cmlnaHQgMjAwNSBFcmljIEJlbmFyZAotICogZWJlbmFyZEBldWtyZWEuY29tIC0gYmFzZWQgb24gczNjMjR4MCdzIGRyaXZlcgotICoKLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0gKiBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0gKiBNQSAwMjExMS0xMzA3IFVTQQotICoKLSAqLwotLyoKLSAqIElNUE9SVEFOVCBOT1RFUwotICogMSAtIHlvdSBNVVNUIGRlZmluZSBMSVRUTEVFTkRJQU4gaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlCi0gKiAgICAgYm9hcmQgb3IgdGhpcyBkcml2ZXIgd2lsbCBOT1Qgd29yayEKLSAqIDIgLSB0aGlzIGRyaXZlciBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggVVNCIE1hc3MgU3RvcmFnZSBEZXZpY2VzCi0gKiAgICAgKEJCQikgT05MWS4gVGhlcmUgaXMgTk8gc3VwcG9ydCBmb3IgSW50ZXJydXB0IG9yIElzb2Nocm9ub3VzIHBpcGVzIQotICogMyAtIHdoZW4gcnVubmluZyBvbiBhIFBRRlAyMDggQVQ5MVJNOTIwMCwgZGVmaW5lIENPTkZJR19BVDkxQ19QUUZQX1VIUEJVRwotICogICAgIHRvIGFjdGl2YXRlIHdvcmthcm91bmQgZm9yIGJ1ZyAjNDEgb3IgdGhpcyBkcml2ZXIgd2lsbCBOT1Qgd29yayEKLSAqLwotCi0jaW5jbHVkZSA8Y29tbW9uLmg+Ci0vKiAjaW5jbHVkZSA8cGNpLmg+IG5vIFBDSSBvbiB0aGUgUzNDMjRYMCAqLwotCi0jaWZkZWYgQ09ORklHX1VTQl9PSENJCi0KLSNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgotCi0jaW5jbHVkZSA8bWFsbG9jLmg+Ci0jaW5jbHVkZSA8dXNiLmg+Ci0jaW5jbHVkZSAidXNiX29oY2kuaCIKLQotI2RlZmluZSBPSENJX1VTRV9OUFMJCS8qIGZvcmNlIE5vUG93ZXJTd2l0Y2hpbmcgbW9kZSAqLwotI3VuZGVmIE9IQ0lfVkVSQk9TRV9ERUJVRwkvKiBub3QgYWx3YXlzIGhlbHBmdWwgKi8KLQotLyogRm9yIGluaXRpYWxpemluZyBjb250cm9sbGVyIChtYXNrIGluIGFuIEhDRlMgbW9kZSB0b28pICovCi0jZGVmaW5lIE9IQ0lfQ09OVFJPTF9JTklUIFwKLQkoT0hDSV9DVFJMX0NCU1IgJiAweDMpIHwgT0hDSV9DVFJMX0lFIHwgT0hDSV9DVFJMX1BMRQotCi0jZGVmaW5lIHJlYWRsKGEpICgqKCh2dV9sb25nICopKGEpKSkKLSNkZWZpbmUgd3JpdGVsKGEsIGIpICgqKCh2dV9sb25nICopKGIpKSA9ICgodnVfbG9uZylhKSkKLQotI2RlZmluZSBtaW5fdCh0eXBlLHgseSkgKHsgdHlwZSBfX3ggPSAoeCk7IHR5cGUgX195ID0gKHkpOyBfX3ggPCBfX3kgPyBfX3g6IF9feTsgfSkKLQotI3VuZGVmIERFQlVHCi0jaWZkZWYgREVCVUcKLSNkZWZpbmUgZGJnKGZvcm1hdCwgYXJnLi4uKSBwcmludGYoIkRFQlVHOiAiIGZvcm1hdCAiXG4iLCAjIyBhcmcpCi0jZWxzZQotI2RlZmluZSBkYmcoZm9ybWF0LCBhcmcuLi4pIGRvIHt9IHdoaWxlKDApCi0jZW5kaWYgLyogREVCVUcgKi8KLSNkZWZpbmUgZXJyKGZvcm1hdCwgYXJnLi4uKSBwcmludGYoIkVSUk9SOiAiIGZvcm1hdCAiXG4iLCAjIyBhcmcpCi0jdW5kZWYgU0hPV19JTkZPCi0jaWZkZWYgU0hPV19JTkZPCi0jZGVmaW5lIGluZm8oZm9ybWF0LCBhcmcuLi4pIHByaW50ZigiSU5GTzogIiBmb3JtYXQgIlxuIiwgIyMgYXJnKQotI2Vsc2UKLSNkZWZpbmUgaW5mbyhmb3JtYXQsIGFyZy4uLikgZG8ge30gd2hpbGUoMCkKLSNlbmRpZgotCi0jZGVmaW5lIG0xNl9zd2FwKHgpIHN3YXBfMTYoeCkKLSNkZWZpbmUgbTMyX3N3YXAoeCkgc3dhcF8zMih4KQotCi0vKiBnbG9iYWwgb2hjaV90ICovCi1zdGF0aWMgb2hjaV90IGdvaGNpOwotLyogdGhpcyBtdXN0IGJlIGFsaWduZWQgdG8gYSAyNTYgYnl0ZSBib3VuZGFyeSAqLwotc3RydWN0IG9oY2lfaGNjYSBnaGNjYVsxXTsKLS8qIGEgcG9pbnRlciB0byB0aGUgYWxpZ25lZCBzdG9yYWdlICovCi1zdHJ1Y3Qgb2hjaV9oY2NhICpwaGNjYTsKLS8qIHRoaXMgYWxsb2NhdGVzIEVEcyBmb3IgYWxsIHBvc3NpYmxlIGVuZHBvaW50cyAqLwotc3RydWN0IG9oY2lfZGV2aWNlIG9oY2lfZGV2OwotLyogdXJiX3ByaXYgKi8KLXVyYl9wcml2X3QgdXJiX3ByaXY7Ci0vKiBSSFNDIGZsYWcgKi8KLWludCBnb3RfcmhzYzsKLS8qIGRldmljZSB3aGljaCB3YXMgZGlzY29ubmVjdGVkICovCi1zdHJ1Y3QgdXNiX2RldmljZSAqZGV2Z29uZTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogQU1ELTc1NiAoRDIgcmV2KSByZXBvcnRzIGNvcnJ1cHQgcmVnaXN0ZXIgY29udGVudHMgaW4gc29tZSBjYXNlcy4KLSAqIFRoZSBlcnJhdHVtICgjNCkgZGVzY3JpcHRpb24gaXMgaW5jb3JyZWN0LiAgQU1EJ3Mgd29ya2Fyb3VuZCB3YWl0cwotICogdGlsbCBzb21lIGJpdHMgKG1vc3RseSByZXNlcnZlZCkgYXJlIGNsZWFyOyBvayBmb3IgYWxsIHJldnMuCi0gKi8KLSNkZWZpbmUgT0hDSV9RVUlSS19BTUQ3NTYgMHhhYmNkCi0jZGVmaW5lIHJlYWRfcm9vdGh1YihoYywgcmVnaXN0ZXIsIG1hc2spICh7IFwKLQl1MzIgdGVtcCA9IHJlYWRsICgmaGMtPnJlZ3MtPnJvb3RodWIucmVnaXN0ZXIpOyBcCi0JaWYgKGhjLT5mbGFncyAmIE9IQ0lfUVVJUktfQU1ENzU2KSBcCi0JCXdoaWxlICh0ZW1wICYgbWFzaykgXAotCQkJdGVtcCA9IHJlYWRsICgmaGMtPnJlZ3MtPnJvb3RodWIucmVnaXN0ZXIpOyBcCi0JdGVtcDsgfSkKLQotc3RhdGljIHUzMiByb290aHViX2EgKHN0cnVjdCBvaGNpICpoYykKLQl7IHJldHVybiByZWFkX3Jvb3RodWIgKGhjLCBhLCAweGZjMGZlMDAwKTsgfQotc3RhdGljIGlubGluZSB1MzIgcm9vdGh1Yl9iIChzdHJ1Y3Qgb2hjaSAqaGMpCi0JeyByZXR1cm4gcmVhZGwgKCZoYy0+cmVncy0+cm9vdGh1Yi5iKTsgfQotc3RhdGljIGlubGluZSB1MzIgcm9vdGh1Yl9zdGF0dXMgKHN0cnVjdCBvaGNpICpoYykKLQl7IHJldHVybiByZWFkbCAoJmhjLT5yZWdzLT5yb290aHViLnN0YXR1cyk7IH0KLXN0YXRpYyB1MzIgcm9vdGh1Yl9wb3J0c3RhdHVzIChzdHJ1Y3Qgb2hjaSAqaGMsIGludCBpKQotCXsgcmV0dXJuIHJlYWRfcm9vdGh1YiAoaGMsIHBvcnRzdGF0dXMgW2ldLCAweGZmZTBmY2UwKTsgfQotCi0KLS8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KLXN0YXRpYyBpbnQgaGNfaW50ZXJydXB0ICh2b2lkKTsKLXN0YXRpYyB2b2lkCi10ZF9zdWJtaXRfam9iIChzdHJ1Y3QgdXNiX2RldmljZSAqIGRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICogYnVmZmVyLAotCWludCB0cmFuc2Zlcl9sZW4sIHN0cnVjdCBkZXZyZXF1ZXN0ICogc2V0dXAsIHVyYl9wcml2X3QgKiB1cmIsIGludCBpbnRlcnZhbCk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIFVSQiBzdXBwb3J0IGZ1bmN0aW9ucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogZnJlZSBIQ0QtcHJpdmF0ZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFVSQiAqLwotCi1zdGF0aWMgdm9pZCB1cmJfZnJlZV9wcml2ICh1cmJfcHJpdl90ICogdXJiKQotewotCWludAkJaTsKLQlpbnQJCWxhc3Q7Ci0Jc3RydWN0IHRkCSogdGQ7Ci0KLQlsYXN0ID0gdXJiLT5sZW5ndGggLSAxOwotCWlmIChsYXN0ID49IDApIHsKLQkJZm9yIChpID0gMDsgaSA8PSBsYXN0OyBpKyspIHsKLQkJCXRkID0gdXJiLT50ZFtpXTsKLQkJCWlmICh0ZCkgewotCQkJCXRkLT51c2JfZGV2ID0gTlVMTDsKLQkJCQl1cmItPnRkW2ldID0gTlVMTDsKLQkJCX0KLQkJfQotCX0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmIERFQlVHCi1zdGF0aWMgaW50IHNvaGNpX2dldF9jdXJyZW50X2ZyYW1lX251bWJlciAoc3RydWN0IHVzYl9kZXZpY2UgKiBkZXYpOwotCi0vKiBkZWJ1Z3wgcHJpbnQgdGhlIG1haW4gY29tcG9uZW50cyBvZiBhbiBVUkIKLSAqIHNtYWxsOiAwKSBoZWFkZXIgKyBkYXRhIHBhY2tldHMgMSkganVzdCBoZWFkZXIgKi8KLQotc3RhdGljIHZvaWQgcGt0X3ByaW50IChzdHJ1Y3QgdXNiX2RldmljZSAqIGRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICogYnVmZmVyLAotCWludCB0cmFuc2Zlcl9sZW4sIHN0cnVjdCBkZXZyZXF1ZXN0ICogc2V0dXAsIGNoYXIgKiBzdHIsIGludCBzbWFsbCkKLXsKLQl1cmJfcHJpdl90ICogcHVyYiA9ICZ1cmJfcHJpdjsKLQotCWRiZygiJXMgVVJCOlslNHhdIGRldjolMmQsZXA6JTJkLSVjLHR5cGU6JXMsbGVuOiVkLyVkIHN0YXQ6JSNseCIsCi0JCQlzdHIsCi0JCQlzb2hjaV9nZXRfY3VycmVudF9mcmFtZV9udW1iZXIgKGRldiksCi0JCQl1c2JfcGlwZWRldmljZSAocGlwZSksCi0JCQl1c2JfcGlwZWVuZHBvaW50IChwaXBlKSwKLQkJCXVzYl9waXBlb3V0IChwaXBlKT8gJ08nOiAnSScsCi0JCQl1c2JfcGlwZXR5cGUgKHBpcGUpIDwgMj8gKHVzYl9waXBlaW50IChwaXBlKT8gIklOVFIiOiAiSVNPQyIpOgotCQkJCSh1c2JfcGlwZWNvbnRyb2wgKHBpcGUpPyAiQ1RSTCI6ICJCVUxLIiksCi0JCQlwdXJiLT5hY3R1YWxfbGVuZ3RoLAotCQkJdHJhbnNmZXJfbGVuLCBkZXYtPnN0YXR1cyk7Ci0jaWZkZWYJT0hDSV9WRVJCT1NFX0RFQlVHCi0JaWYgKCFzbWFsbCkgewotCQlpbnQgaSwgbGVuOwotCi0JCWlmICh1c2JfcGlwZWNvbnRyb2wgKHBpcGUpKSB7Ci0JCQlwcmludGYgKF9fRklMRV9fICI6IGNtZCg4KToiKTsKLQkJCWZvciAoaSA9IDA7IGkgPCA4IDsgaSsrKQotCQkJCXByaW50ZiAoIiAlMDJ4IiwgKChfX3U4ICopIHNldHVwKSBbaV0pOwotCQkJcHJpbnRmICgiXG4iKTsKLQkJfQotCQlpZiAodHJhbnNmZXJfbGVuID4gMCAmJiBidWZmZXIpIHsKLQkJCXByaW50ZiAoX19GSUxFX18gIjogZGF0YSglZC8lZCk6IiwKLQkJCQlwdXJiLT5hY3R1YWxfbGVuZ3RoLAotCQkJCXRyYW5zZmVyX2xlbik7Ci0JCQlsZW4gPSB1c2JfcGlwZW91dCAocGlwZSk/Ci0JCQkJCXRyYW5zZmVyX2xlbjogcHVyYi0+YWN0dWFsX2xlbmd0aDsKLQkJCWZvciAoaSA9IDA7IGkgPCAxNiAmJiBpIDwgbGVuOyBpKyspCi0JCQkJcHJpbnRmICgiICUwMngiLCAoKF9fdTggKikgYnVmZmVyKSBbaV0pOwotCQkJcHJpbnRmICgiJXNcbiIsIGkgPCBsZW4/ICIuLi4iOiAiIik7Ci0JCX0KLQl9Ci0jZW5kaWYKLX0KLQotLyoganVzdCBmb3IgZGVidWdnaW5nOyBwcmludHMgbm9uLWVtcHR5IGJyYW5jaGVzIG9mIHRoZSBpbnQgZWQgdHJlZSBpbmNsdXNpdmUgaXNvIGVkcyovCi12b2lkIGVwX3ByaW50X2ludF9lZHMgKG9oY2lfdCAqb2hjaSwgY2hhciAqIHN0cikgewotCWludCBpLCBqOwotCSBfX3UzMiAqIGVkX3A7Ci0JZm9yIChpPSAwOyBpIDwgMzI7IGkrKykgewotCQlqID0gNTsKLQkJZWRfcCA9ICYob2hjaS0+aGNjYS0+aW50X3RhYmxlIFtpXSk7Ci0JCWlmICgqZWRfcCA9PSAwKQotCQkgICAgY29udGludWU7Ci0JCXByaW50ZiAoX19GSUxFX18gIjogJXMgYnJhbmNoIGludCAlMmQoJTJ4KToiLCBzdHIsIGksIGkpOwotCQl3aGlsZSAoKmVkX3AgIT0gMCAmJiBqLS0pIHsKLQkJCWVkX3QgKmVkID0gKGVkX3QgKiltMzJfc3dhcChlZF9wKTsKLQkJCXByaW50ZiAoIiBlZDogJTR4OyIsIGVkLT5od0lORk8pOwotCQkJZWRfcCA9ICZlZC0+aHdOZXh0RUQ7Ci0JCX0KLQkJcHJpbnRmICgiXG4iKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG9oY2lfZHVtcF9pbnRyX21hc2sgKGNoYXIgKmxhYmVsLCBfX3UzMiBtYXNrKQotewotCWRiZyAoIiVzOiAweCUwOHglcyVzJXMlcyVzJXMlcyVzJXMiLAotCQlsYWJlbCwKLQkJbWFzaywKLQkJKG1hc2sgJiBPSENJX0lOVFJfTUlFKSA/ICIgTUlFIiA6ICIiLAotCQkobWFzayAmIE9IQ0lfSU5UUl9PQykgPyAiIE9DIiA6ICIiLAotCQkobWFzayAmIE9IQ0lfSU5UUl9SSFNDKSA/ICIgUkhTQyIgOiAiIiwKLQkJKG1hc2sgJiBPSENJX0lOVFJfRk5PKSA/ICIgRk5PIiA6ICIiLAotCQkobWFzayAmIE9IQ0lfSU5UUl9VRSkgPyAiIFVFIiA6ICIiLAotCQkobWFzayAmIE9IQ0lfSU5UUl9SRCkgPyAiIFJEIiA6ICIiLAotCQkobWFzayAmIE9IQ0lfSU5UUl9TRikgPyAiIFNGIiA6ICIiLAotCQkobWFzayAmIE9IQ0lfSU5UUl9XREgpID8gIiBXREgiIDogIiIsCi0JCShtYXNrICYgT0hDSV9JTlRSX1NPKSA/ICIgU08iIDogIiIKLQkJKTsKLX0KLQotc3RhdGljIHZvaWQgbWF5YmVfcHJpbnRfZWRzIChjaGFyICpsYWJlbCwgX191MzIgdmFsdWUpCi17Ci0JZWRfdCAqZWRwID0gKGVkX3QgKil2YWx1ZTsKLQotCWlmICh2YWx1ZSkgewotCQlkYmcgKCIlcyAlMDh4IiwgbGFiZWwsIHZhbHVlKTsKLQkJZGJnICgiJTA4eCIsIGVkcC0+aHdJTkZPKTsKLQkJZGJnICgiJTA4eCIsIGVkcC0+aHdUYWlsUCk7Ci0JCWRiZyAoIiUwOHgiLCBlZHAtPmh3SGVhZFApOwotCQlkYmcgKCIlMDh4IiwgZWRwLT5od05leHRFRCk7Ci0JfQotfQotCi1zdGF0aWMgY2hhciAqIGhjZnMyc3RyaW5nIChpbnQgc3RhdGUpCi17Ci0Jc3dpdGNoIChzdGF0ZSkgewotCQljYXNlIE9IQ0lfVVNCX1JFU0VUOglyZXR1cm4gInJlc2V0IjsKLQkJY2FzZSBPSENJX1VTQl9SRVNVTUU6CXJldHVybiAicmVzdW1lIjsKLQkJY2FzZSBPSENJX1VTQl9PUEVSOglyZXR1cm4gIm9wZXJhdGlvbmFsIjsKLQkJY2FzZSBPSENJX1VTQl9TVVNQRU5EOglyZXR1cm4gInN1c3BlbmQiOwotCX0KLQlyZXR1cm4gIj8iOwotfQotCi0vKiBkdW1wIGNvbnRyb2wgYW5kIHN0YXR1cyByZWdpc3RlcnMgKi8KLXN0YXRpYyB2b2lkIG9oY2lfZHVtcF9zdGF0dXMgKG9oY2lfdCAqY29udHJvbGxlcikKLXsKLQlzdHJ1Y3Qgb2hjaV9yZWdzCSpyZWdzID0gY29udHJvbGxlci0+cmVnczsKLQlfX3UzMgkJCXRlbXA7Ci0KLQl0ZW1wID0gcmVhZGwgKCZyZWdzLT5yZXZpc2lvbikgJiAweGZmOwotCWlmICh0ZW1wICE9IDB4MTApCi0JCWRiZyAoInNwZWMgJWQuJWQiLCAodGVtcCA+PiA0KSwgKHRlbXAgJiAweDBmKSk7Ci0KLQl0ZW1wID0gcmVhZGwgKCZyZWdzLT5jb250cm9sKTsKLQlkYmcgKCJjb250cm9sOiAweCUwOHglcyVzJXMgSENGUz0lcyVzJXMlcyVzIENCU1I9JWQiLCB0ZW1wLAotCQkodGVtcCAmIE9IQ0lfQ1RSTF9SV0UpID8gIiBSV0UiIDogIiIsCi0JCSh0ZW1wICYgT0hDSV9DVFJMX1JXQykgPyAiIFJXQyIgOiAiIiwKLQkJKHRlbXAgJiBPSENJX0NUUkxfSVIpID8gIiBJUiIgOiAiIiwKLQkJaGNmczJzdHJpbmcgKHRlbXAgJiBPSENJX0NUUkxfSENGUyksCi0JCSh0ZW1wICYgT0hDSV9DVFJMX0JMRSkgPyAiIEJMRSIgOiAiIiwKLQkJKHRlbXAgJiBPSENJX0NUUkxfQ0xFKSA/ICIgQ0xFIiA6ICIiLAotCQkodGVtcCAmIE9IQ0lfQ1RSTF9JRSkgPyAiIElFIiA6ICIiLAotCQkodGVtcCAmIE9IQ0lfQ1RSTF9QTEUpID8gIiBQTEUiIDogIiIsCi0JCXRlbXAgJiBPSENJX0NUUkxfQ0JTUgotCQkpOwotCi0JdGVtcCA9IHJlYWRsICgmcmVncy0+Y21kc3RhdHVzKTsKLQlkYmcgKCJjbWRzdGF0dXM6IDB4JTA4eCBTT0M9JWQlcyVzJXMlcyIsIHRlbXAsCi0JCSh0ZW1wICYgT0hDSV9TT0MpID4+IDE2LAotCQkodGVtcCAmIE9IQ0lfT0NSKSA/ICIgT0NSIiA6ICIiLAotCQkodGVtcCAmIE9IQ0lfQkxGKSA/ICIgQkxGIiA6ICIiLAotCQkodGVtcCAmIE9IQ0lfQ0xGKSA/ICIgQ0xGIiA6ICIiLAotCQkodGVtcCAmIE9IQ0lfSENSKSA/ICIgSENSIiA6ICIiCi0JCSk7Ci0KLQlvaGNpX2R1bXBfaW50cl9tYXNrICgiaW50cnN0YXR1cyIsIHJlYWRsICgmcmVncy0+aW50cnN0YXR1cykpOwotCW9oY2lfZHVtcF9pbnRyX21hc2sgKCJpbnRyZW5hYmxlIiwgcmVhZGwgKCZyZWdzLT5pbnRyZW5hYmxlKSk7Ci0KLQltYXliZV9wcmludF9lZHMgKCJlZF9wZXJpb2RjdXJyZW50IiwgcmVhZGwgKCZyZWdzLT5lZF9wZXJpb2RjdXJyZW50KSk7Ci0KLQltYXliZV9wcmludF9lZHMgKCJlZF9jb250cm9saGVhZCIsIHJlYWRsICgmcmVncy0+ZWRfY29udHJvbGhlYWQpKTsKLQltYXliZV9wcmludF9lZHMgKCJlZF9jb250cm9sY3VycmVudCIsIHJlYWRsICgmcmVncy0+ZWRfY29udHJvbGN1cnJlbnQpKTsKLQotCW1heWJlX3ByaW50X2VkcyAoImVkX2J1bGtoZWFkIiwgcmVhZGwgKCZyZWdzLT5lZF9idWxraGVhZCkpOwotCW1heWJlX3ByaW50X2VkcyAoImVkX2J1bGtjdXJyZW50IiwgcmVhZGwgKCZyZWdzLT5lZF9idWxrY3VycmVudCkpOwotCi0JbWF5YmVfcHJpbnRfZWRzICgiZG9uZWhlYWQiLCByZWFkbCAoJnJlZ3MtPmRvbmVoZWFkKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG9oY2lfZHVtcF9yb290aHViIChvaGNpX3QgKmNvbnRyb2xsZXIsIGludCB2ZXJib3NlKQotewotCV9fdTMyCQkJdGVtcCwgbmRwLCBpOwotCi0JdGVtcCA9IHJvb3RodWJfYSAoY29udHJvbGxlcik7Ci0JbmRwID0gKHRlbXAgJiBSSF9BX05EUCk7Ci0jaWZkZWYgQ09ORklHX0FUOTFDX1BRRlBfVUhQQlVHCi0JbmRwID0gKG5kcCA9PSAyKSA/IDE6MDsKLSNlbmRpZgotCWlmICh2ZXJib3NlKSB7Ci0JCWRiZyAoInJvb3RodWIuYTogJTA4eCBQT1RQR1Q9JWQlcyVzJXMlcyVzIE5EUD0lZCIsIHRlbXAsCi0JCQkoKHRlbXAgJiBSSF9BX1BPVFBHVCkgPj4gMjQpICYgMHhmZiwKLQkJCSh0ZW1wICYgUkhfQV9OT0NQKSA/ICIgTk9DUCIgOiAiIiwKLQkJCSh0ZW1wICYgUkhfQV9PQ1BNKSA/ICIgT0NQTSIgOiAiIiwKLQkJCSh0ZW1wICYgUkhfQV9EVCkgPyAiIERUIiA6ICIiLAotCQkJKHRlbXAgJiBSSF9BX05QUykgPyAiIE5QUyIgOiAiIiwKLQkJCSh0ZW1wICYgUkhfQV9QU00pID8gIiBQU00iIDogIiIsCi0JCQluZHAKLQkJCSk7Ci0JCXRlbXAgPSByb290aHViX2IgKGNvbnRyb2xsZXIpOwotCQlkYmcgKCJyb290aHViLmI6ICUwOHggUFBDTT0lMDR4IERSPSUwNHgiLAotCQkJdGVtcCwKLQkJCSh0ZW1wICYgUkhfQl9QUENNKSA+PiAxNiwKLQkJCSh0ZW1wICYgUkhfQl9EUikKLQkJCSk7Ci0JCXRlbXAgPSByb290aHViX3N0YXR1cyAoY29udHJvbGxlcik7Ci0JCWRiZyAoInJvb3RodWIuc3RhdHVzOiAlMDh4JXMlcyVzJXMlcyVzIiwKLQkJCXRlbXAsCi0JCQkodGVtcCAmIFJIX0hTX0NSV0UpID8gIiBDUldFIiA6ICIiLAotCQkJKHRlbXAgJiBSSF9IU19PQ0lDKSA/ICIgT0NJQyIgOiAiIiwKLQkJCSh0ZW1wICYgUkhfSFNfTFBTQykgPyAiIExQU0MiIDogIiIsCi0JCQkodGVtcCAmIFJIX0hTX0RSV0UpID8gIiBEUldFIiA6ICIiLAotCQkJKHRlbXAgJiBSSF9IU19PQ0kpID8gIiBPQ0kiIDogIiIsCi0JCQkodGVtcCAmIFJIX0hTX0xQUykgPyAiIExQUyIgOiAiIgotCQkJKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbmRwOyBpKyspIHsKLQkJdGVtcCA9IHJvb3RodWJfcG9ydHN0YXR1cyAoY29udHJvbGxlciwgaSk7Ci0JCWRiZyAoInJvb3RodWIucG9ydHN0YXR1cyBbJWRdID0gMHglMDh4JXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzIiwKLQkJCWksCi0JCQl0ZW1wLAotCQkJKHRlbXAgJiBSSF9QU19QUlNDKSA/ICIgUFJTQyIgOiAiIiwKLQkJCSh0ZW1wICYgUkhfUFNfT0NJQykgPyAiIE9DSUMiIDogIiIsCi0JCQkodGVtcCAmIFJIX1BTX1BTU0MpID8gIiBQU1NDIiA6ICIiLAotCQkJKHRlbXAgJiBSSF9QU19QRVNDKSA/ICIgUEVTQyIgOiAiIiwKLQkJCSh0ZW1wICYgUkhfUFNfQ1NDKSA/ICIgQ1NDIiA6ICIiLAotCi0JCQkodGVtcCAmIFJIX1BTX0xTREEpID8gIiBMU0RBIiA6ICIiLAotCQkJKHRlbXAgJiBSSF9QU19QUFMpID8gIiBQUFMiIDogIiIsCi0JCQkodGVtcCAmIFJIX1BTX1BSUykgPyAiIFBSUyIgOiAiIiwKLQkJCSh0ZW1wICYgUkhfUFNfUE9DSSkgPyAiIFBPQ0kiIDogIiIsCi0JCQkodGVtcCAmIFJIX1BTX1BTUykgPyAiIFBTUyIgOiAiIiwKLQotCQkJKHRlbXAgJiBSSF9QU19QRVMpID8gIiBQRVMiIDogIiIsCi0JCQkodGVtcCAmIFJIX1BTX0NDUykgPyAiIENDUyIgOiAiIgotCQkJKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG9oY2lfZHVtcCAob2hjaV90ICpjb250cm9sbGVyLCBpbnQgdmVyYm9zZSkKLXsKLQlkYmcgKCJPSENJIGNvbnRyb2xsZXIgdXNiLSVzIHN0YXRlIiwgY29udHJvbGxlci0+c2xvdF9uYW1lKTsKLQotCS8qIGR1bXBzIHNvbWUgb2YgdGhlIHN0YXRlIHdlIGtub3cgYWJvdXQgKi8KLQlvaGNpX2R1bXBfc3RhdHVzIChjb250cm9sbGVyKTsKLQlpZiAodmVyYm9zZSkKLQkJZXBfcHJpbnRfaW50X2VkcyAoY29udHJvbGxlciwgImhjY2EiKTsKLQlkYmcgKCJoY2NhIGZyYW1lICMlMDR4IiwgY29udHJvbGxlci0+aGNjYS0+ZnJhbWVfbm8pOwotCW9oY2lfZHVtcF9yb290aHViIChjb250cm9sbGVyLCAxKTsKLX0KLQotCi0jZW5kaWYgLyogREVCVUcgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogSW50ZXJmYWNlIGZ1bmN0aW9ucyAoVVJCKQotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogZ2V0IGEgdHJhbnNmZXIgcmVxdWVzdCAqLwotCi1pbnQgc29oY2lfc3VibWl0X2pvYihzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsIHZvaWQgKmJ1ZmZlciwKLQkJaW50IHRyYW5zZmVyX2xlbiwgc3RydWN0IGRldnJlcXVlc3QgKnNldHVwLCBpbnQgaW50ZXJ2YWwpCi17Ci0Jb2hjaV90ICpvaGNpOwotCWVkX3QgKiBlZDsKLQl1cmJfcHJpdl90ICpwdXJiX3ByaXY7Ci0JaW50IGksIHNpemUgPSAwOwotCi0Jb2hjaSA9ICZnb2hjaTsKLQotCS8qIHdoZW4gY29udHJvbGxlcidzIGh1bmcsIHBlcm1pdCBvbmx5IHJvb3RodWIgY2xlYW51cCBhdHRlbXB0cwotCSAqIHN1Y2ggYXMgcG93ZXJpbmcgZG93biBwb3J0cyAqLwotCWlmIChvaGNpLT5kaXNhYmxlZCkgewotCQllcnIoInNvaGNpX3N1Ym1pdF9qb2I6IEVQSVBFIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBldmVyeSBlbmRwb2ludCBoYXMgYSBlZCwgbG9jYXRlIGFuZCBmaWxsIGl0ICovCi0JaWYgKCEoZWQgPSBlcF9hZGRfZWQgKGRldiwgcGlwZSkpKSB7Ci0JCWVycigic29oY2lfc3VibWl0X2pvYjogRU5PTUVNIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBmb3IgdGhlIHByaXZhdGUgcGFydCBvZiB0aGUgVVJCIHdlIG5lZWQgdGhlIG51bWJlciBvZiBURHMgKHNpemUpICovCi0Jc3dpdGNoICh1c2JfcGlwZXR5cGUgKHBpcGUpKSB7Ci0JCWNhc2UgUElQRV9CVUxLOiAvKiBvbmUgVEQgZm9yIGV2ZXJ5IDQwOTYgQnl0ZSAqLwotCQkJc2l6ZSA9ICh0cmFuc2Zlcl9sZW4gLSAxKSAvIDQwOTYgKyAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgUElQRV9DT05UUk9MOiAvKiAxIFREIGZvciBzZXR1cCwgMSBmb3IgQUNLIGFuZCAxIGZvciBldmVyeSA0MDk2IEIgKi8KLQkJCXNpemUgPSAodHJhbnNmZXJfbGVuID09IDApPyAyOgotCQkJCQkJKHRyYW5zZmVyX2xlbiAtIDEpIC8gNDA5NiArIDM7Ci0JCQlicmVhazsKLQl9Ci0KLQlpZiAoc2l6ZSA+PSAoTl9VUkJfVEQgLSAxKSkgewotCQllcnIoIm5lZWQgJWQgVERzLCBvbmx5IGhhdmUgJWQiLCBzaXplLCBOX1VSQl9URCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcHVyYl9wcml2ID0gJnVyYl9wcml2OwotCXB1cmJfcHJpdi0+cGlwZSA9IHBpcGU7Ci0KLQkvKiBmaWxsIHRoZSBwcml2YXRlIHBhcnQgb2YgdGhlIFVSQiAqLwotCXB1cmJfcHJpdi0+bGVuZ3RoID0gc2l6ZTsKLQlwdXJiX3ByaXYtPmVkID0gZWQ7Ci0JcHVyYl9wcml2LT5hY3R1YWxfbGVuZ3RoID0gMDsKLQotCS8qIGFsbG9jYXRlIHRoZSBURHMgKi8KLQkvKiBub3RlIHRoYXQgdGRbMF0gd2FzIGFsbG9jYXRlZCBpbiBlcF9hZGRfZWQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCXB1cmJfcHJpdi0+dGRbaV0gPSB0ZF9hbGxvYyAoZGV2KTsKLQkJaWYgKCFwdXJiX3ByaXYtPnRkW2ldKSB7Ci0JCQlwdXJiX3ByaXYtPmxlbmd0aCA9IGk7Ci0JCQl1cmJfZnJlZV9wcml2IChwdXJiX3ByaXYpOwotCQkJZXJyKCJzb2hjaV9zdWJtaXRfam9iOiBFTk9NRU0iKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCWlmIChlZC0+c3RhdGUgPT0gRURfTkVXIHx8IChlZC0+c3RhdGUgJiBFRF9ERUwpKSB7Ci0JCXVyYl9mcmVlX3ByaXYgKHB1cmJfcHJpdik7Ci0JCWVycigic29oY2lfc3VibWl0X2pvYjogRUlOVkFMIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBsaW5rIHRoZSBlZCBpbnRvIGEgY2hhaW4gaWYgaXMgbm90IGFscmVhZHkgKi8KLQlpZiAoZWQtPnN0YXRlICE9IEVEX09QRVIpCi0JCWVwX2xpbmsgKG9oY2ksIGVkKTsKLQotCS8qIGZpbGwgdGhlIFREcyBhbmQgbGluayBpdCB0byB0aGUgZWQgKi8KLQl0ZF9zdWJtaXRfam9iKGRldiwgcGlwZSwgYnVmZmVyLCB0cmFuc2Zlcl9sZW4sIHNldHVwLCBwdXJiX3ByaXYsIGludGVydmFsKTsKLQotCXJldHVybiAwOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgREVCVUcKLS8qIHRlbGwgdXMgdGhlIGN1cnJlbnQgVVNCIGZyYW1lIG51bWJlciAqLwotCi1zdGF0aWMgaW50IHNvaGNpX2dldF9jdXJyZW50X2ZyYW1lX251bWJlciAoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYpCi17Ci0Jb2hjaV90ICpvaGNpID0gJmdvaGNpOwotCi0JcmV0dXJuIG0xNl9zd2FwIChvaGNpLT5oY2NhLT5mcmFtZV9ubyk7Ci19Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogRUQgaGFuZGxpbmcgZnVuY3Rpb25zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBsaW5rIGFuIGVkIGludG8gb25lIG9mIHRoZSBIQyBjaGFpbnMgKi8KLQotc3RhdGljIGludCBlcF9saW5rIChvaGNpX3QgKm9oY2ksIGVkX3QgKmVkaSkKLXsKLQl2b2xhdGlsZSBlZF90ICplZCA9IGVkaTsKLQotCWVkLT5zdGF0ZSA9IEVEX09QRVI7Ci0KLQlzd2l0Y2ggKGVkLT50eXBlKSB7Ci0JY2FzZSBQSVBFX0NPTlRST0w6Ci0JCWVkLT5od05leHRFRCA9IDA7Ci0JCWlmIChvaGNpLT5lZF9jb250cm9sdGFpbCA9PSBOVUxMKSB7Ci0JCQl3cml0ZWwgKGVkLCAmb2hjaS0+cmVncy0+ZWRfY29udHJvbGhlYWQpOwotCQl9IGVsc2UgewotCQkJb2hjaS0+ZWRfY29udHJvbHRhaWwtPmh3TmV4dEVEID0gbTMyX3N3YXAgKGVkKTsKLQkJfQotCQllZC0+ZWRfcHJldiA9IG9oY2ktPmVkX2NvbnRyb2x0YWlsOwotCQlpZiAoIW9oY2ktPmVkX2NvbnRyb2x0YWlsICYmICFvaGNpLT5lZF9ybV9saXN0WzBdICYmCi0JCQkhb2hjaS0+ZWRfcm1fbGlzdFsxXSAmJiAhb2hjaS0+c2xlZXBpbmcpIHsKLQkJCW9oY2ktPmhjX2NvbnRyb2wgfD0gT0hDSV9DVFJMX0NMRTsKLQkJCXdyaXRlbCAob2hjaS0+aGNfY29udHJvbCwgJm9oY2ktPnJlZ3MtPmNvbnRyb2wpOwotCQl9Ci0JCW9oY2ktPmVkX2NvbnRyb2x0YWlsID0gZWRpOwotCQlicmVhazsKLQotCWNhc2UgUElQRV9CVUxLOgotCQllZC0+aHdOZXh0RUQgPSAwOwotCQlpZiAob2hjaS0+ZWRfYnVsa3RhaWwgPT0gTlVMTCkgewotCQkJd3JpdGVsIChlZCwgJm9oY2ktPnJlZ3MtPmVkX2J1bGtoZWFkKTsKLQkJfSBlbHNlIHsKLQkJCW9oY2ktPmVkX2J1bGt0YWlsLT5od05leHRFRCA9IG0zMl9zd2FwIChlZCk7Ci0JCX0KLQkJZWQtPmVkX3ByZXYgPSBvaGNpLT5lZF9idWxrdGFpbDsKLQkJaWYgKCFvaGNpLT5lZF9idWxrdGFpbCAmJiAhb2hjaS0+ZWRfcm1fbGlzdFswXSAmJgotCQkJIW9oY2ktPmVkX3JtX2xpc3RbMV0gJiYgIW9oY2ktPnNsZWVwaW5nKSB7Ci0JCQlvaGNpLT5oY19jb250cm9sIHw9IE9IQ0lfQ1RSTF9CTEU7Ci0JCQl3cml0ZWwgKG9oY2ktPmhjX2NvbnRyb2wsICZvaGNpLT5yZWdzLT5jb250cm9sKTsKLQkJfQotCQlvaGNpLT5lZF9idWxrdGFpbCA9IGVkaTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiB1bmxpbmsgYW4gZWQgZnJvbSBvbmUgb2YgdGhlIEhDIGNoYWlucy4KLSAqIGp1c3QgdGhlIGxpbmsgdG8gdGhlIGVkIGlzIHVubGlua2VkLgotICogdGhlIGxpbmsgZnJvbSB0aGUgZWQgc3RpbGwgcG9pbnRzIHRvIGFub3RoZXIgb3BlcmF0aW9uYWwgZWQgb3IgMAotICogc28gdGhlIEhDIGNhbiBldmVudHVhbGx5IGZpbmlzaCB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgdW5saW5rZWQgZWQgKi8KLQotc3RhdGljIGludCBlcF91bmxpbmsgKG9oY2lfdCAqb2hjaSwgZWRfdCAqZWQpCi17Ci0JZWQtPmh3SU5GTyB8PSBtMzJfc3dhcCAoT0hDSV9FRF9TS0lQKTsKLQotCXN3aXRjaCAoZWQtPnR5cGUpIHsKLQljYXNlIFBJUEVfQ09OVFJPTDoKLQkJaWYgKGVkLT5lZF9wcmV2ID09IE5VTEwpIHsKLQkJCWlmICghZWQtPmh3TmV4dEVEKSB7Ci0JCQkJb2hjaS0+aGNfY29udHJvbCAmPSB+T0hDSV9DVFJMX0NMRTsKLQkJCQl3cml0ZWwgKG9oY2ktPmhjX2NvbnRyb2wsICZvaGNpLT5yZWdzLT5jb250cm9sKTsKLQkJCX0KLQkJCXdyaXRlbCAobTMyX3N3YXAgKCooKF9fdTMyICopJmVkLT5od05leHRFRCkpLCAmb2hjaS0+cmVncy0+ZWRfY29udHJvbGhlYWQpOwotCQl9IGVsc2UgewotCQkJZWQtPmVkX3ByZXYtPmh3TmV4dEVEID0gZWQtPmh3TmV4dEVEOwotCQl9Ci0JCWlmIChvaGNpLT5lZF9jb250cm9sdGFpbCA9PSBlZCkgewotCQkJb2hjaS0+ZWRfY29udHJvbHRhaWwgPSBlZC0+ZWRfcHJldjsKLQkJfSBlbHNlIHsKLQkJCSgoZWRfdCAqKW0zMl9zd2FwICgqKChfX3UzMiAqKSZlZC0+aHdOZXh0RUQpKSktPmVkX3ByZXYgPSBlZC0+ZWRfcHJldjsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgUElQRV9CVUxLOgotCQlpZiAoZWQtPmVkX3ByZXYgPT0gTlVMTCkgewotCQkJaWYgKCFlZC0+aHdOZXh0RUQpIHsKLQkJCQlvaGNpLT5oY19jb250cm9sICY9IH5PSENJX0NUUkxfQkxFOwotCQkJCXdyaXRlbCAob2hjaS0+aGNfY29udHJvbCwgJm9oY2ktPnJlZ3MtPmNvbnRyb2wpOwotCQkJfQotCQkJd3JpdGVsIChtMzJfc3dhcCAoKigoX191MzIgKikmZWQtPmh3TmV4dEVEKSksICZvaGNpLT5yZWdzLT5lZF9idWxraGVhZCk7Ci0JCX0gZWxzZSB7Ci0JCQllZC0+ZWRfcHJldi0+aHdOZXh0RUQgPSBlZC0+aHdOZXh0RUQ7Ci0JCX0KLQkJaWYgKG9oY2ktPmVkX2J1bGt0YWlsID09IGVkKSB7Ci0JCQlvaGNpLT5lZF9idWxrdGFpbCA9IGVkLT5lZF9wcmV2OwotCQl9IGVsc2UgewotCQkJKChlZF90ICopbTMyX3N3YXAgKCooKF9fdTMyICopJmVkLT5od05leHRFRCkpKS0+ZWRfcHJldiA9IGVkLT5lZF9wcmV2OwotCQl9Ci0JCWJyZWFrOwotCX0KLQllZC0+c3RhdGUgPSBFRF9VTkxJTks7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogYWRkL3JlaW5pdCBhbiBlbmRwb2ludDsgdGhpcyBzaG91bGQgYmUgZG9uZSBvbmNlIGF0IHRoZSB1c2Jfc2V0X2NvbmZpZ3VyYXRpb24gY29tbWFuZCwKLSAqIGJ1dCB0aGUgVVNCIHN0YWNrIGlzIGEgbGl0dGxlIGJpdCBzdGF0ZWxlc3MJc28gd2UgZG8gaXQgYXQgZXZlcnkgdHJhbnNhY3Rpb24KLSAqIGlmIHRoZSBzdGF0ZSBvZiB0aGUgZWQgaXMgRURfTkVXIHRoZW4gYSBkdW1teSB0ZCBpcyBhZGRlZCBhbmQgdGhlIHN0YXRlIGlzIGNoYW5nZWQgdG8gRURfVU5MSU5LCi0gKiBpbiBhbGwgb3RoZXIgY2FzZXMgdGhlIHN0YXRlIGlzIGxlZnQgdW5jaGFuZ2VkCi0gKiB0aGUgZWQgaW5mbyBmaWVsZHMgYXJlIHNldHRlZCBhbnl3YXkgZXZlbiB0aG91Z2ggbW9zdCBvZiB0aGVtIHNob3VsZCBub3QgY2hhbmdlICovCi0KLXN0YXRpYyBlZF90ICogZXBfYWRkX2VkIChzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwgdW5zaWduZWQgbG9uZyBwaXBlKQotewotCXRkX3QgKnRkOwotCWVkX3QgKmVkX3JldDsKLQl2b2xhdGlsZSBlZF90ICplZDsKLQotCWVkID0gZWRfcmV0ID0gJm9oY2lfZGV2LmVkWyh1c2JfcGlwZWVuZHBvaW50IChwaXBlKSA8PCAxKSB8Ci0JCQkodXNiX3BpcGVjb250cm9sIChwaXBlKT8gMDogdXNiX3BpcGVvdXQgKHBpcGUpKV07Ci0KLQlpZiAoKGVkLT5zdGF0ZSAmIEVEX0RFTCkgfHwgKGVkLT5zdGF0ZSAmIEVEX1VSQl9ERUwpKSB7Ci0JCWVycigiZXBfYWRkX2VkOiBwZW5kaW5nIGRlbGV0ZSIpOwotCQkvKiBwZW5kaW5nIGRlbGV0ZSByZXF1ZXN0ICovCi0JCXJldHVybiBOVUxMOwotCX0KLQotCWlmIChlZC0+c3RhdGUgPT0gRURfTkVXKSB7Ci0JCWVkLT5od0lORk8gPSBtMzJfc3dhcCAoT0hDSV9FRF9TS0lQKTsgLyogc2tpcCBlZCAqLwotCQkvKiBkdW1teSB0ZDsgZW5kIG9mIHRkIGxpc3QgZm9yIGVkICovCi0JCXRkID0gdGRfYWxsb2MgKHVzYl9kZXYpOwotCQllZC0+aHdUYWlsUCA9IG0zMl9zd2FwICh0ZCk7Ci0JCWVkLT5od0hlYWRQID0gZWQtPmh3VGFpbFA7Ci0JCWVkLT5zdGF0ZSA9IEVEX1VOTElOSzsKLQkJZWQtPnR5cGUgPSB1c2JfcGlwZXR5cGUgKHBpcGUpOwotCQlvaGNpX2Rldi5lZF9jbnQrKzsKLQl9Ci0KLQllZC0+aHdJTkZPID0gbTMyX3N3YXAgKHVzYl9waXBlZGV2aWNlIChwaXBlKQotCQkJfCB1c2JfcGlwZWVuZHBvaW50IChwaXBlKSA8PCA3Ci0JCQl8ICh1c2JfcGlwZWlzb2MgKHBpcGUpPyAweDgwMDA6IDApCi0JCQl8ICh1c2JfcGlwZWNvbnRyb2wgKHBpcGUpPyAwOiAodXNiX3BpcGVvdXQgKHBpcGUpPyAweDgwMDogMHgxMDAwKSkKLQkJCXwgdXNiX3BpcGVzbG93IChwaXBlKSA8PCAxMwotCQkJfCB1c2JfbWF4cGFja2V0ICh1c2JfZGV2LCBwaXBlKSA8PCAxNik7Ci0KLQlyZXR1cm4gZWRfcmV0OwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBURCBoYW5kbGluZyBmdW5jdGlvbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIGVucXVldWUgbmV4dCBURCBmb3IgdGhpcyBVUkIgKE9IQ0kgc3BlYyA1LjIuOC4yKSAqLwotCi1zdGF0aWMgdm9pZCB0ZF9maWxsIChvaGNpX3QgKm9oY2ksIHVuc2lnbmVkIGludCBpbmZvLAotCXZvaWQgKmRhdGEsIGludCBsZW4sCi0Jc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgaW50IGluZGV4LCB1cmJfcHJpdl90ICp1cmJfcHJpdikKLXsKLQl2b2xhdGlsZSB0ZF90ICAqdGQsICp0ZF9wdDsKLSNpZmRlZiBPSENJX0ZJTExfVFJBQ0UKLQlpbnQgaTsKLSNlbmRpZgotCi0JaWYgKGluZGV4ID4gdXJiX3ByaXYtPmxlbmd0aCkgewotCQllcnIoImluZGV4ID4gbGVuZ3RoIik7Ci0JCXJldHVybjsKLQl9Ci0JLyogdXNlIHRoaXMgdGQgYXMgdGhlIG5leHQgZHVtbXkgKi8KLQl0ZF9wdCA9IHVyYl9wcml2LT50ZCBbaW5kZXhdOwotCXRkX3B0LT5od05leHRURCA9IDA7Ci0KLQkvKiBmaWxsIHRoZSBvbGQgZHVtbXkgVEQgKi8KLQl0ZCA9IHVyYl9wcml2LT50ZCBbaW5kZXhdID0gKHRkX3QgKikobTMyX3N3YXAgKHVyYl9wcml2LT5lZC0+aHdUYWlsUCkgJiB+MHhmKTsKLQotCXRkLT5lZCA9IHVyYl9wcml2LT5lZDsKLQl0ZC0+bmV4dF9kbF90ZCA9IE5VTEw7Ci0JdGQtPmluZGV4ID0gaW5kZXg7Ci0JdGQtPmRhdGEgPSAoX191MzIpZGF0YTsKLSNpZmRlZiBPSENJX0ZJTExfVFJBQ0UKLQlpZiAoKHVzYl9waXBldHlwZSh1cmJfcHJpdi0+cGlwZSkgPT0gUElQRV9CVUxLKSAmJiB1c2JfcGlwZW91dCh1cmJfcHJpdi0+cGlwZSkpIHsKLQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCQlwcmludGYoInRkLT5kYXRhWyVkXSAlIzJ4ICIsaSwgKCh1bnNpZ25lZCBjaGFyICopdGQtPmRhdGEpW2ldKTsKLQkJcHJpbnRmKCJcbiIpOwotCX0KLSNlbmRpZgotCWlmICghbGVuKQotCQlkYXRhID0gMDsKLQotCXRkLT5od0lORk8gPSBtMzJfc3dhcCAoaW5mbyk7Ci0JdGQtPmh3Q0JQID0gbTMyX3N3YXAgKGRhdGEpOwotCWlmIChkYXRhKQotCQl0ZC0+aHdCRSA9IG0zMl9zd2FwIChkYXRhICsgbGVuIC0gMSk7Ci0JZWxzZQotCQl0ZC0+aHdCRSA9IDA7Ci0JdGQtPmh3TmV4dFREID0gbTMyX3N3YXAgKHRkX3B0KTsKLQl0ZC0+aHdQU1cgWzBdID0gbTE2X3N3YXAgKCgoX191MzIpZGF0YSAmIDB4MEZGRikgfCAweEUwMDApOwotCi0JLyogYXBwZW5kIHRvIHF1ZXVlICovCi0JdGQtPmVkLT5od1RhaWxQID0gdGQtPmh3TmV4dFREOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBwcmVwYXJlIGFsbCBURHMgb2YgYSB0cmFuc2ZlciAqLwotCi1zdGF0aWMgdm9pZCB0ZF9zdWJtaXRfam9iIChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsIHZvaWQgKmJ1ZmZlciwKLQlpbnQgdHJhbnNmZXJfbGVuLCBzdHJ1Y3QgZGV2cmVxdWVzdCAqc2V0dXAsIHVyYl9wcml2X3QgKnVyYiwgaW50IGludGVydmFsKQotewotCW9oY2lfdCAqb2hjaSA9ICZnb2hjaTsKLQlpbnQgZGF0YV9sZW4gPSB0cmFuc2Zlcl9sZW47Ci0Jdm9pZCAqZGF0YTsKLQlpbnQgY250ID0gMDsKLQlfX3UzMiBpbmZvID0gMDsKLQl1bnNpZ25lZCBpbnQgdG9nZ2xlID0gMDsKLQotCS8qIE9IQ0kgaGFuZGxlcyB0aGUgREFUQS10b2dnbGVzIGl0c2VsZiwgd2UganVzdCB1c2UgdGhlIFVTQi10b2dnbGUgYml0cyBmb3IgcmVzZXRpbmcgKi8KLQlpZih1c2JfZ2V0dG9nZ2xlKGRldiwgdXNiX3BpcGVlbmRwb2ludChwaXBlKSwgdXNiX3BpcGVvdXQocGlwZSkpKSB7Ci0JCXRvZ2dsZSA9IFREX1RfVE9HR0xFOwotCX0gZWxzZSB7Ci0JCXRvZ2dsZSA9IFREX1RfREFUQTA7Ci0JCXVzYl9zZXR0b2dnbGUoZGV2LCB1c2JfcGlwZWVuZHBvaW50KHBpcGUpLCB1c2JfcGlwZW91dChwaXBlKSwgMSk7Ci0JfQotCXVyYi0+dGRfY250ID0gMDsKLQlpZiAoZGF0YV9sZW4pCi0JCWRhdGEgPSBidWZmZXI7Ci0JZWxzZQotCQlkYXRhID0gMDsKLQotCXN3aXRjaCAodXNiX3BpcGV0eXBlIChwaXBlKSkgewotCWNhc2UgUElQRV9CVUxLOgotCQlpbmZvID0gdXNiX3BpcGVvdXQgKHBpcGUpPwotCQkJVERfQ0MgfCBURF9EUF9PVVQgOiBURF9DQyB8IFREX0RQX0lOIDsKLQkJd2hpbGUoZGF0YV9sZW4gPiA0MDk2KSB7Ci0JCQl0ZF9maWxsIChvaGNpLCBpbmZvIHwgKGNudD8gVERfVF9UT0dHTEU6dG9nZ2xlKSwgZGF0YSwgNDA5NiwgZGV2LCBjbnQsIHVyYik7Ci0JCQlkYXRhICs9IDQwOTY7IGRhdGFfbGVuIC09IDQwOTY7IGNudCsrOwotCQl9Ci0JCWluZm8gPSB1c2JfcGlwZW91dCAocGlwZSk/Ci0JCQlURF9DQyB8IFREX0RQX09VVCA6IFREX0NDIHwgVERfUiB8IFREX0RQX0lOIDsKLQkJdGRfZmlsbCAob2hjaSwgaW5mbyB8IChjbnQ/IFREX1RfVE9HR0xFOnRvZ2dsZSksIGRhdGEsIGRhdGFfbGVuLCBkZXYsIGNudCwgdXJiKTsKLQkJY250Kys7Ci0KLQkJaWYgKCFvaGNpLT5zbGVlcGluZykKLQkJCXdyaXRlbCAoT0hDSV9CTEYsICZvaGNpLT5yZWdzLT5jbWRzdGF0dXMpOyAvKiBzdGFydCBidWxrIGxpc3QgKi8KLQkJYnJlYWs7Ci0KLQljYXNlIFBJUEVfQ09OVFJPTDoKLQkJaW5mbyA9IFREX0NDIHwgVERfRFBfU0VUVVAgfCBURF9UX0RBVEEwOwotCQl0ZF9maWxsIChvaGNpLCBpbmZvLCBzZXR1cCwgOCwgZGV2LCBjbnQrKywgdXJiKTsKLQkJaWYgKGRhdGFfbGVuID4gMCkgewotCQkJaW5mbyA9IHVzYl9waXBlb3V0IChwaXBlKT8KLQkJCQlURF9DQyB8IFREX1IgfCBURF9EUF9PVVQgfCBURF9UX0RBVEExIDogVERfQ0MgfCBURF9SIHwgVERfRFBfSU4gfCBURF9UX0RBVEExOwotCQkJLyogTk9URTogIG1pc2hhbmRsZXMgdHJhbnNmZXJzID44Sywgc29tZSA+NEsgKi8KLQkJCXRkX2ZpbGwgKG9oY2ksIGluZm8sIGRhdGEsIGRhdGFfbGVuLCBkZXYsIGNudCsrLCB1cmIpOwotCQl9Ci0JCWluZm8gPSB1c2JfcGlwZW91dCAocGlwZSk/Ci0JCQlURF9DQyB8IFREX0RQX0lOIHwgVERfVF9EQVRBMTogVERfQ0MgfCBURF9EUF9PVVQgfCBURF9UX0RBVEExOwotCQl0ZF9maWxsIChvaGNpLCBpbmZvLCBkYXRhLCAwLCBkZXYsIGNudCsrLCB1cmIpOwotCQlpZiAoIW9oY2ktPnNsZWVwaW5nKQotCQkJd3JpdGVsIChPSENJX0NMRiwgJm9oY2ktPnJlZ3MtPmNtZHN0YXR1cyk7IC8qIHN0YXJ0IENvbnRyb2wgbGlzdCAqLwotCQlicmVhazsKLQl9Ci0JaWYgKHVyYi0+bGVuZ3RoICE9IGNudCkKLQkJZGJnKCJURCBMRU5HVEggJWQgIT0gQ05UICVkIiwgdXJiLT5sZW5ndGgsIGNudCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIERvbmUgTGlzdCBoYW5kbGluZyBmdW5jdGlvbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyogY2FsY3VsYXRlIHRoZSB0cmFuc2ZlciBsZW5ndGggYW5kIHVwZGF0ZSB0aGUgdXJiICovCi0KLXN0YXRpYyB2b2lkIGRsX3RyYW5zZmVyX2xlbmd0aCh0ZF90ICogdGQpCi17Ci0JX191MzIgdGRJTkZPLCB0ZEJFLCB0ZENCUDsKLQl1cmJfcHJpdl90ICpsdXJiX3ByaXYgPSAmdXJiX3ByaXY7Ci0KLQl0ZElORk8gPSBtMzJfc3dhcCAodGQtPmh3SU5GTyk7Ci0JdGRCRSAgID0gbTMyX3N3YXAgKHRkLT5od0JFKTsKLQl0ZENCUCAgPSBtMzJfc3dhcCAodGQtPmh3Q0JQKTsKLQotCi0JaWYgKCEodXNiX3BpcGV0eXBlIChsdXJiX3ByaXYtPnBpcGUpID09IFBJUEVfQ09OVFJPTCAmJgotCSAgICAoKHRkLT5pbmRleCA9PSAwKSB8fCAodGQtPmluZGV4ID09IGx1cmJfcHJpdi0+bGVuZ3RoIC0gMSkpKSkgewotCQlpZiAodGRCRSAhPSAwKSB7Ci0JCQlpZiAodGQtPmh3Q0JQID09IDApCi0JCQkJbHVyYl9wcml2LT5hY3R1YWxfbGVuZ3RoICs9IHRkQkUgLSB0ZC0+ZGF0YSArIDE7Ci0JCQllbHNlCi0JCQkJbHVyYl9wcml2LT5hY3R1YWxfbGVuZ3RoICs9IHRkQ0JQIC0gdGQtPmRhdGE7Ci0JCX0KLQl9Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIHJlcGxpZXMgdG8gdGhlIHJlcXVlc3QgaGF2ZSB0byBiZSBvbiBhIEZJRk8gYmFzaXMgc28KLSAqIHdlIHJldmVyc2UgdGhlIHJldmVyc2VkIGRvbmUtbGlzdCAqLwotCi1zdGF0aWMgdGRfdCAqIGRsX3JldmVyc2VfZG9uZV9saXN0IChvaGNpX3QgKm9oY2kpCi17Ci0JX191MzIgdGRfbGlzdF9oYzsKLQl0ZF90ICp0ZF9yZXYgPSBOVUxMOwotCXRkX3QgKnRkX2xpc3QgPSBOVUxMOwotCXVyYl9wcml2X3QgKmx1cmJfcHJpdiA9IE5VTEw7Ci0KLQl0ZF9saXN0X2hjID0gbTMyX3N3YXAgKG9oY2ktPmhjY2EtPmRvbmVfaGVhZCkgJiAweGZmZmZmZmYwOwotCW9oY2ktPmhjY2EtPmRvbmVfaGVhZCA9IDA7Ci0KLQl3aGlsZSAodGRfbGlzdF9oYykgewotCQl0ZF9saXN0ID0gKHRkX3QgKil0ZF9saXN0X2hjOwotCi0JCWlmIChURF9DQ19HRVQgKG0zMl9zd2FwICh0ZF9saXN0LT5od0lORk8pKSkgewotCQkJbHVyYl9wcml2ID0gJnVyYl9wcml2OwotCQkJZGJnKCIgVVNCLWVycm9yL3N0YXR1czogJXggOiAlcCIsCi0JCQkJCVREX0NDX0dFVCAobTMyX3N3YXAgKHRkX2xpc3QtPmh3SU5GTykpLCB0ZF9saXN0KTsKLQkJCWlmICh0ZF9saXN0LT5lZC0+aHdIZWFkUCAmIG0zMl9zd2FwICgweDEpKSB7Ci0JCQkJaWYgKGx1cmJfcHJpdiAmJiAoKHRkX2xpc3QtPmluZGV4ICsgMSkgPCBsdXJiX3ByaXYtPmxlbmd0aCkpIHsKLQkJCQkJdGRfbGlzdC0+ZWQtPmh3SGVhZFAgPQotCQkJCQkJKGx1cmJfcHJpdi0+dGRbbHVyYl9wcml2LT5sZW5ndGggLSAxXS0+aHdOZXh0VEQgJiBtMzJfc3dhcCAoMHhmZmZmZmZmMCkpIHwKLQkJCQkJCQkJCSh0ZF9saXN0LT5lZC0+aHdIZWFkUCAmIG0zMl9zd2FwICgweDIpKTsKLQkJCQkJbHVyYl9wcml2LT50ZF9jbnQgKz0gbHVyYl9wcml2LT5sZW5ndGggLSB0ZF9saXN0LT5pbmRleCAtIDE7Ci0JCQkJfSBlbHNlCi0JCQkJCXRkX2xpc3QtPmVkLT5od0hlYWRQICY9IG0zMl9zd2FwICgweGZmZmZmZmYyKTsKLQkJCX0KLQkJfQotCi0JCXRkX2xpc3QtPm5leHRfZGxfdGQgPSB0ZF9yZXY7Ci0JCXRkX3JldiA9IHRkX2xpc3Q7Ci0JCXRkX2xpc3RfaGMgPSBtMzJfc3dhcCAodGRfbGlzdC0+aHdOZXh0VEQpICYgMHhmZmZmZmZmMDsKLQl9Ci0JcmV0dXJuIHRkX2xpc3Q7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIHRkIGRvbmUgbGlzdCAqLwotc3RhdGljIGludCBkbF9kb25lX2xpc3QgKG9oY2lfdCAqb2hjaSwgdGRfdCAqdGRfbGlzdCkKLXsKLQl0ZF90ICp0ZF9saXN0X25leHQgPSBOVUxMOwotCWVkX3QgKmVkOwotCWludCBjYyA9IDA7Ci0JaW50IHN0YXQgPSAwOwotCS8qIHVyYl90ICp1cmI7ICovCi0JdXJiX3ByaXZfdCAqbHVyYl9wcml2OwotCV9fdTMyIHRkSU5GTywgZWRIZWFkUCwgZWRUYWlsUDsKLQotCXdoaWxlICh0ZF9saXN0KSB7Ci0JCXRkX2xpc3RfbmV4dCA9IHRkX2xpc3QtPm5leHRfZGxfdGQ7Ci0KLQkJbHVyYl9wcml2ID0gJnVyYl9wcml2OwotCQl0ZElORk8gPSBtMzJfc3dhcCAodGRfbGlzdC0+aHdJTkZPKTsKLQotCQllZCA9IHRkX2xpc3QtPmVkOwotCi0JCWRsX3RyYW5zZmVyX2xlbmd0aCh0ZF9saXN0KTsKLQotCQkvKiBlcnJvciBjb2RlIG9mIHRyYW5zZmVyICovCi0JCWNjID0gVERfQ0NfR0VUICh0ZElORk8pOwotCQlpZiAoY2MgIT0gMCkgewotCQkJZGJnKCJDb25kaXRpb25Db2RlICUjeCIsIGNjKTsKLQkJCXN0YXQgPSBjY190b19lcnJvcltjY107Ci0JCX0KLQotCQlpZiAoZWQtPnN0YXRlICE9IEVEX05FVykgewotCQkJZWRIZWFkUCA9IG0zMl9zd2FwIChlZC0+aHdIZWFkUCkgJiAweGZmZmZmZmYwOwotCQkJZWRUYWlsUCA9IG0zMl9zd2FwIChlZC0+aHdUYWlsUCk7Ci0KLQkJCS8qIHVubGluayBlZHMgaWYgdGhleSBhcmUgbm90IGJ1c3kgKi8KLQkJCWlmICgoZWRIZWFkUCA9PSBlZFRhaWxQKSAmJiAoZWQtPnN0YXRlID09IEVEX09QRVIpKQotCQkJCWVwX3VubGluayAob2hjaSwgZWQpOwotCQl9Ci0KLQkJdGRfbGlzdCA9IHRkX2xpc3RfbmV4dDsKLQl9Ci0JcmV0dXJuIHN0YXQ7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIFZpcnR1YWwgUm9vdCBIdWIKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIERldmljZSBkZXNjcmlwdG9yICovCi1zdGF0aWMgX191OCByb290X2h1Yl9kZXZfZGVzW10gPQotewotCTB4MTIsCSAgICAvKglfX3U4ICBiTGVuZ3RoOyAqLwotCTB4MDEsCSAgICAvKglfX3U4ICBiRGVzY3JpcHRvclR5cGU7IERldmljZSAqLwotCTB4MTAsCSAgICAvKglfX3UxNiBiY2RVU0I7IHYxLjEgKi8KLQkweDAxLAotCTB4MDksCSAgICAvKglfX3U4ICBiRGV2aWNlQ2xhc3M7IEhVQl9DTEFTU0NPREUgKi8KLQkweDAwLAkgICAgLyoJX191OCAgYkRldmljZVN1YkNsYXNzOyAqLwotCTB4MDAsCSAgICAvKglfX3U4ICBiRGV2aWNlUHJvdG9jb2w7ICovCi0JMHgwOCwJICAgIC8qCV9fdTggIGJNYXhQYWNrZXRTaXplMDsgOCBCeXRlcyAqLwotCTB4MDAsCSAgICAvKglfX3UxNiBpZFZlbmRvcjsgKi8KLQkweDAwLAotCTB4MDAsCSAgICAvKglfX3UxNiBpZFByb2R1Y3Q7ICovCi0JMHgwMCwKLQkweDAwLAkgICAgLyoJX191MTYgYmNkRGV2aWNlOyAqLwotCTB4MDAsCi0JMHgwMCwJICAgIC8qCV9fdTggIGlNYW51ZmFjdHVyZXI7ICovCi0JMHgwMSwJICAgIC8qCV9fdTggIGlQcm9kdWN0OyAqLwotCTB4MDAsCSAgICAvKglfX3U4ICBpU2VyaWFsTnVtYmVyOyAqLwotCTB4MDEJICAgIC8qCV9fdTggIGJOdW1Db25maWd1cmF0aW9uczsgKi8KLX07Ci0KLQotLyogQ29uZmlndXJhdGlvbiBkZXNjcmlwdG9yICovCi1zdGF0aWMgX191OCByb290X2h1Yl9jb25maWdfZGVzW10gPQotewotCTB4MDksCSAgICAvKglfX3U4ICBiTGVuZ3RoOyAqLwotCTB4MDIsCSAgICAvKglfX3U4ICBiRGVzY3JpcHRvclR5cGU7IENvbmZpZ3VyYXRpb24gKi8KLQkweDE5LAkgICAgLyoJX191MTYgd1RvdGFsTGVuZ3RoOyAqLwotCTB4MDAsCi0JMHgwMSwJICAgIC8qCV9fdTggIGJOdW1JbnRlcmZhY2VzOyAqLwotCTB4MDEsCSAgICAvKglfX3U4ICBiQ29uZmlndXJhdGlvblZhbHVlOyAqLwotCTB4MDAsCSAgICAvKglfX3U4ICBpQ29uZmlndXJhdGlvbjsgKi8KLQkweDQwLAkgICAgLyoJX191OCAgYm1BdHRyaWJ1dGVzOwotCQkgQml0IDc6IEJ1cy1wb3dlcmVkLCA2OiBTZWxmLXBvd2VyZWQsIDUgUmVtb3RlLXdha3d1cCwgNC4uMDogcmVzdmQgKi8KLQkweDAwLAkgICAgLyoJX191OCAgTWF4UG93ZXI7ICovCi0KLQkvKiBpbnRlcmZhY2UgKi8KLQkweDA5LAkgICAgLyoJX191OCAgaWZfYkxlbmd0aDsgKi8KLQkweDA0LAkgICAgLyoJX191OCAgaWZfYkRlc2NyaXB0b3JUeXBlOyBJbnRlcmZhY2UgKi8KLQkweDAwLAkgICAgLyoJX191OCAgaWZfYkludGVyZmFjZU51bWJlcjsgKi8KLQkweDAwLAkgICAgLyoJX191OCAgaWZfYkFsdGVybmF0ZVNldHRpbmc7ICovCi0JMHgwMSwJICAgIC8qCV9fdTggIGlmX2JOdW1FbmRwb2ludHM7ICovCi0JMHgwOSwJICAgIC8qCV9fdTggIGlmX2JJbnRlcmZhY2VDbGFzczsgSFVCX0NMQVNTQ09ERSAqLwotCTB4MDAsCSAgICAvKglfX3U4ICBpZl9iSW50ZXJmYWNlU3ViQ2xhc3M7ICovCi0JMHgwMCwJICAgIC8qCV9fdTggIGlmX2JJbnRlcmZhY2VQcm90b2NvbDsgKi8KLQkweDAwLAkgICAgLyoJX191OCAgaWZfaUludGVyZmFjZTsgKi8KLQotCS8qIGVuZHBvaW50ICovCi0JMHgwNywJICAgIC8qCV9fdTggIGVwX2JMZW5ndGg7ICovCi0JMHgwNSwJICAgIC8qCV9fdTggIGVwX2JEZXNjcmlwdG9yVHlwZTsgRW5kcG9pbnQgKi8KLQkweDgxLAkgICAgLyoJX191OCAgZXBfYkVuZHBvaW50QWRkcmVzczsgSU4gRW5kcG9pbnQgMSAqLwotCTB4MDMsCSAgICAvKglfX3U4ICBlcF9ibUF0dHJpYnV0ZXM7IEludGVycnVwdCAqLwotCTB4MDIsCSAgICAvKglfX3UxNiBlcF93TWF4UGFja2V0U2l6ZTsgKChNQVhfUk9PVF9QT1JUUyArIDEpIC8gOCAqLwotCTB4MDAsCi0JMHhmZgkgICAgLyoJX191OCAgZXBfYkludGVydmFsOyAyNTUgbXMgKi8KLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHJvb3RfaHViX3N0cl9pbmRleDBbXSA9Ci17Ci0JMHgwNCwJCQkvKiAgX191OCAgYkxlbmd0aDsgKi8KLQkweDAzLAkJCS8qICBfX3U4ICBiRGVzY3JpcHRvclR5cGU7IFN0cmluZy1kZXNjcmlwdG9yICovCi0JMHgwOSwJCQkvKiAgX191OCAgbGFuZyBJRCAqLwotCTB4MDQsCQkJLyogIF9fdTggIGxhbmcgSUQgKi8KLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHJvb3RfaHViX3N0cl9pbmRleDFbXSA9Ci17Ci0JMjgsCQkJLyogIF9fdTggIGJMZW5ndGg7ICovCi0JMHgwMywJCQkvKiAgX191OCAgYkRlc2NyaXB0b3JUeXBlOyBTdHJpbmctZGVzY3JpcHRvciAqLwotCSdPJywJCQkvKiAgX191OCAgVW5pY29kZSAqLwotCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCi0JJ0gnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCi0JMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KLQknQycsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KLQkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLwotCSdJJywJCQkvKiAgX191OCAgVW5pY29kZSAqLwotCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCi0JJyAnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCi0JMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KLQknUicsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KLQkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLwotCSdvJywJCQkvKiAgX191OCAgVW5pY29kZSAqLwotCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCi0JJ28nLAkJCS8qICBfX3U4ICBVbmljb2RlICovCi0JMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KLQkndCcsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KLQkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLwotCScgJywJCQkvKiAgX191OCAgVW5pY29kZSAqLwotCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCi0JJ0gnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCi0JMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KLQkndScsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KLQkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLwotCSdiJywJCQkvKiAgX191OCAgVW5pY29kZSAqLwotCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCi19OwotCi0vKiBIdWIgY2xhc3Mtc3BlY2lmaWMgZGVzY3JpcHRvciBpcyBjb25zdHJ1Y3RlZCBkeW5hbWljYWxseSAqLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgT0soeCkJCQlsZW4gPSAoeCk7IGJyZWFrCi0jaWZkZWYgREVCVUcKLSNkZWZpbmUgV1JfUkhfU1RBVCh4KQkJe2luZm8oIldSOnN0YXR1cyAlIzh4IiwgKHgpKTt3cml0ZWwoKHgpLCAmZ29oY2kucmVncy0+cm9vdGh1Yi5zdGF0dXMpO30KLSNkZWZpbmUgV1JfUkhfUE9SVFNUQVQoeCkJe2luZm8oIldSOnBvcnRzdGF0dXNbJWRdICUjOHgiLCB3SW5kZXgtMSwgKHgpKTt3cml0ZWwoKHgpLCAmZ29oY2kucmVncy0+cm9vdGh1Yi5wb3J0c3RhdHVzW3dJbmRleC0xXSk7fQotI2Vsc2UKLSNkZWZpbmUgV1JfUkhfU1RBVCh4KQkJd3JpdGVsKCh4KSwgJmdvaGNpLnJlZ3MtPnJvb3RodWIuc3RhdHVzKQotI2RlZmluZSBXUl9SSF9QT1JUU1RBVCh4KQl3cml0ZWwoKHgpLCAmZ29oY2kucmVncy0+cm9vdGh1Yi5wb3J0c3RhdHVzW3dJbmRleC0xXSkKLSNlbmRpZgotI2RlZmluZSBSRF9SSF9TVEFUCQlyb290aHViX3N0YXR1cygmZ29oY2kpCi0jZGVmaW5lIFJEX1JIX1BPUlRTVEFUCQlyb290aHViX3BvcnRzdGF0dXMoJmdvaGNpLHdJbmRleC0xKQotCi0vKiByZXF1ZXN0IHRvIHZpcnR1YWwgcm9vdCBodWIgKi8KLQotaW50IHJoX2NoZWNrX3BvcnRfc3RhdHVzKG9oY2lfdCAqY29udHJvbGxlcikKLXsKLQlfX3UzMiB0ZW1wLCBuZHAsIGk7Ci0JaW50IHJlczsKLQotCXJlcyA9IC0xOwotCXRlbXAgPSByb290aHViX2EgKGNvbnRyb2xsZXIpOwotCW5kcCA9ICh0ZW1wICYgUkhfQV9ORFApOwotI2lmZGVmIENPTkZJR19BVDkxQ19QUUZQX1VIUEJVRwotCW5kcCA9IChuZHAgPT0gMikgPyAxOjA7Ci0jZW5kaWYKLQotCWZvciAoaSA9IDA7IGkgPCBuZHA7IGkrKykgewotCQl0ZW1wID0gcm9vdGh1Yl9wb3J0c3RhdHVzIChjb250cm9sbGVyLCBpKTsKLQkJLyogY2hlY2sgZm9yIGEgZGV2aWNlIGRpc2Nvbm5lY3QgKi8KLQkJaWYgKCgodGVtcCAmIChSSF9QU19QRVNDIHwgUkhfUFNfQ1NDKSkgPT0KLQkJCShSSF9QU19QRVNDIHwgUkhfUFNfQ1NDKSkgJiYKLQkJCSgodGVtcCAmIFJIX1BTX0NDUykgPT0gMCkpIHsKLQkJCXJlcyA9IGk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgaW50IG9oY2lfc3VibWl0X3JoX21zZyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsCi0JCXZvaWQgKmJ1ZmZlciwgaW50IHRyYW5zZmVyX2xlbiwgc3RydWN0IGRldnJlcXVlc3QgKmNtZCkKLXsKLQl2b2lkICogZGF0YSA9IGJ1ZmZlcjsKLQlpbnQgbGVuaSA9IHRyYW5zZmVyX2xlbjsKLQlpbnQgbGVuID0gMDsKLQlpbnQgc3RhdCA9IDA7Ci0JX191MzIgZGF0YWJbNF07Ci0JX191OCAqZGF0YV9idWYgPSAoX191OCAqKWRhdGFiOwotCV9fdTE2IGJtUlR5cGVfYlJlcTsKLQlfX3UxNiB3VmFsdWU7Ci0JX191MTYgd0luZGV4OwotCV9fdTE2IHdMZW5ndGg7Ci0KLSNpZmRlZiBERUJVRwotdXJiX3ByaXYuYWN0dWFsX2xlbmd0aCA9IDA7Ci1wa3RfcHJpbnQoZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwgY21kLCAiU1VCKHJoKSIsIHVzYl9waXBlaW4ocGlwZSkpOwotI2Vsc2UKLQl3YWl0X21zKDEpOwotI2VuZGlmCi0JaWYgKChwaXBlICYgUElQRV9JTlRFUlJVUFQpID09IFBJUEVfSU5URVJSVVBUKSB7Ci0JCWluZm8oIlJvb3QtSHViIHN1Ym1pdCBJUlE6IE5PVCBpbXBsZW1lbnRlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlibVJUeXBlX2JSZXEgID0gY21kLT5yZXF1ZXN0dHlwZSB8IChjbWQtPnJlcXVlc3QgPDwgOCk7Ci0Jd1ZhbHVlCSAgICAgID0gbTE2X3N3YXAgKGNtZC0+dmFsdWUpOwotCXdJbmRleAkgICAgICA9IG0xNl9zd2FwIChjbWQtPmluZGV4KTsKLQl3TGVuZ3RoCSAgICAgID0gbTE2X3N3YXAgKGNtZC0+bGVuZ3RoKTsKLQotCWluZm8oIlJvb3QtSHViOiBhZHI6ICUyeCBjbWQoJTF4KTogJTA4eCAlMDR4ICUwNHggJTA0eCIsCi0JCWRldi0+ZGV2bnVtLCA4LCBibVJUeXBlX2JSZXEsIHdWYWx1ZSwgd0luZGV4LCB3TGVuZ3RoKTsKLQotCXN3aXRjaCAoYm1SVHlwZV9iUmVxKSB7Ci0JLyogUmVxdWVzdCBEZXN0aW5hdGlvbjoKLQkgICB3aXRob3V0IGZsYWdzOiBEZXZpY2UsCi0JICAgUkhfSU5URVJGQUNFOiBpbnRlcmZhY2UsCi0JICAgUkhfRU5EUE9JTlQ6IGVuZHBvaW50LAotCSAgIFJIX0NMQVNTIG1lYW5zIEhVQiBoZXJlLAotCSAgIFJIX09USEVSIHwgUkhfQ0xBU1MJYWxtb3N0IGV2ZXIgbWVhbnMgSFVCX1BPUlQgaGVyZQotCSovCi0KLQljYXNlIFJIX0dFVF9TVEFUVVM6Ci0JCQkqKF9fdTE2ICopIGRhdGFfYnVmID0gbTE2X3N3YXAgKDEpOyBPSyAoMik7Ci0JY2FzZSBSSF9HRVRfU1RBVFVTIHwgUkhfSU5URVJGQUNFOgotCQkJKihfX3UxNiAqKSBkYXRhX2J1ZiA9IG0xNl9zd2FwICgwKTsgT0sgKDIpOwotCWNhc2UgUkhfR0VUX1NUQVRVUyB8IFJIX0VORFBPSU5UOgotCQkJKihfX3UxNiAqKSBkYXRhX2J1ZiA9IG0xNl9zd2FwICgwKTsgT0sgKDIpOwotCWNhc2UgUkhfR0VUX1NUQVRVUyB8IFJIX0NMQVNTOgotCQkJKihfX3UzMiAqKSBkYXRhX2J1ZiA9IG0zMl9zd2FwICgKLQkJCQlSRF9SSF9TVEFUICYgfihSSF9IU19DUldFIHwgUkhfSFNfRFJXRSkpOwotCQkJT0sgKDQpOwotCWNhc2UgUkhfR0VUX1NUQVRVUyB8IFJIX09USEVSIHwgUkhfQ0xBU1M6Ci0JCQkqKF9fdTMyICopIGRhdGFfYnVmID0gbTMyX3N3YXAgKFJEX1JIX1BPUlRTVEFUKTsgT0sgKDQpOwotCi0JY2FzZSBSSF9DTEVBUl9GRUFUVVJFIHwgUkhfRU5EUE9JTlQ6Ci0JCXN3aXRjaCAod1ZhbHVlKSB7Ci0JCQljYXNlIChSSF9FTkRQT0lOVF9TVEFMTCk6IE9LICgwKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgUkhfQ0xFQVJfRkVBVFVSRSB8IFJIX0NMQVNTOgotCQlzd2l0Y2ggKHdWYWx1ZSkgewotCQkJY2FzZSBSSF9DX0hVQl9MT0NBTF9QT1dFUjoKLQkJCQlPSygwKTsKLQkJCWNhc2UgKFJIX0NfSFVCX09WRVJfQ1VSUkVOVCk6Ci0JCQkJCVdSX1JIX1NUQVQoUkhfSFNfT0NJQyk7IE9LICgwKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgUkhfQ0xFQVJfRkVBVFVSRSB8IFJIX09USEVSIHwgUkhfQ0xBU1M6Ci0JCXN3aXRjaCAod1ZhbHVlKSB7Ci0JCQljYXNlIChSSF9QT1JUX0VOQUJMRSk6Ci0JCQkJCVdSX1JIX1BPUlRTVEFUIChSSF9QU19DQ1MgKTsgT0sgKDApOwotCQkJY2FzZSAoUkhfUE9SVF9TVVNQRU5EKToKLQkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX1BPQ0kpOyBPSyAoMCk7Ci0JCQljYXNlIChSSF9QT1JUX1BPV0VSKToKLQkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX0xTREEpOyBPSyAoMCk7Ci0JCQljYXNlIChSSF9DX1BPUlRfQ09OTkVDVElPTik6Ci0JCQkJCVdSX1JIX1BPUlRTVEFUIChSSF9QU19DU0MgKTsgT0sgKDApOwotCQkJY2FzZSAoUkhfQ19QT1JUX0VOQUJMRSk6Ci0JCQkJCVdSX1JIX1BPUlRTVEFUIChSSF9QU19QRVNDKTsgT0sgKDApOwotCQkJY2FzZSAoUkhfQ19QT1JUX1NVU1BFTkQpOgotCQkJCQlXUl9SSF9QT1JUU1RBVCAoUkhfUFNfUFNTQyk7IE9LICgwKTsKLQkJCWNhc2UgKFJIX0NfUE9SVF9PVkVSX0NVUlJFTlQpOgotCQkJCQlXUl9SSF9QT1JUU1RBVCAoUkhfUFNfT0NJQyk7IE9LICgwKTsKLQkJCWNhc2UgKFJIX0NfUE9SVF9SRVNFVCk6Ci0JCQkJCVdSX1JIX1BPUlRTVEFUIChSSF9QU19QUlNDKTsgT0sgKDApOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBSSF9TRVRfRkVBVFVSRSB8IFJIX09USEVSIHwgUkhfQ0xBU1M6Ci0JCXN3aXRjaCAod1ZhbHVlKSB7Ci0JCQljYXNlIChSSF9QT1JUX1NVU1BFTkQpOgotCQkJCQlXUl9SSF9QT1JUU1RBVCAoUkhfUFNfUFNTICk7IE9LICgwKTsKLQkJCWNhc2UgKFJIX1BPUlRfUkVTRVQpOiAvKiBCVUcgSU4gSFVQIENPREUgKioqKioqKioqLwotCQkJCQlpZiAoUkRfUkhfUE9SVFNUQVQgJiBSSF9QU19DQ1MpCi0JCQkJCSAgICBXUl9SSF9QT1JUU1RBVCAoUkhfUFNfUFJTKTsKLQkJCQkJT0sgKDApOwotCQkJY2FzZSAoUkhfUE9SVF9QT1dFUik6Ci0JCQkJCVdSX1JIX1BPUlRTVEFUIChSSF9QU19QUFMgKTsgT0sgKDApOwotCQkJY2FzZSAoUkhfUE9SVF9FTkFCTEUpOiAvKiBCVUcgSU4gSFVQIENPREUgKioqKioqKioqLwotCQkJCQlpZiAoUkRfUkhfUE9SVFNUQVQgJiBSSF9QU19DQ1MpCi0JCQkJCSAgICBXUl9SSF9QT1JUU1RBVCAoUkhfUFNfUEVTICk7Ci0JCQkJCU9LICgwKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgUkhfU0VUX0FERFJFU1M6IGdvaGNpLnJoLmRldm51bSA9IHdWYWx1ZTsgT0soMCk7Ci0KLQljYXNlIFJIX0dFVF9ERVNDUklQVE9SOgotCQlzd2l0Y2ggKCh3VmFsdWUgJiAweGZmMDApID4+IDgpIHsKLQkJCWNhc2UgKDB4MDEpOiAvKiBkZXZpY2UgZGVzY3JpcHRvciAqLwotCQkJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwKLQkJCQkJICBsZW5pLAotCQkJCQkgIG1pbl90KHVuc2lnbmVkIGludCwKLQkJCQkJICAgICAgc2l6ZW9mIChyb290X2h1Yl9kZXZfZGVzKSwKLQkJCQkJICAgICAgd0xlbmd0aCkpOwotCQkJCWRhdGFfYnVmID0gcm9vdF9odWJfZGV2X2RlczsgT0sobGVuKTsKLQkJCWNhc2UgKDB4MDIpOiAvKiBjb25maWd1cmF0aW9uIGRlc2NyaXB0b3IgKi8KLQkJCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsCi0JCQkJCSAgbGVuaSwKLQkJCQkJICBtaW5fdCh1bnNpZ25lZCBpbnQsCi0JCQkJCSAgICAgIHNpemVvZiAocm9vdF9odWJfY29uZmlnX2RlcyksCi0JCQkJCSAgICAgIHdMZW5ndGgpKTsKLQkJCQlkYXRhX2J1ZiA9IHJvb3RfaHViX2NvbmZpZ19kZXM7IE9LKGxlbik7Ci0JCQljYXNlICgweDAzKTogLyogc3RyaW5nIGRlc2NyaXB0b3JzICovCi0JCQkJaWYod1ZhbHVlPT0weDAzMDApIHsKLQkJCQkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LAotCQkJCQkJICBsZW5pLAotCQkJCQkJICBtaW5fdCh1bnNpZ25lZCBpbnQsCi0JCQkJCQkgICAgICBzaXplb2YgKHJvb3RfaHViX3N0cl9pbmRleDApLAotCQkJCQkJICAgICAgd0xlbmd0aCkpOwotCQkJCQlkYXRhX2J1ZiA9IHJvb3RfaHViX3N0cl9pbmRleDA7Ci0JCQkJCU9LKGxlbik7Ci0JCQkJfQotCQkJCWlmKHdWYWx1ZT09MHgwMzAxKSB7Ci0JCQkJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwKLQkJCQkJCSAgbGVuaSwKLQkJCQkJCSAgbWluX3QodW5zaWduZWQgaW50LAotCQkJCQkJICAgICAgc2l6ZW9mIChyb290X2h1Yl9zdHJfaW5kZXgxKSwKLQkJCQkJCSAgICAgIHdMZW5ndGgpKTsKLQkJCQkJZGF0YV9idWYgPSByb290X2h1Yl9zdHJfaW5kZXgxOwotCQkJCQlPSyhsZW4pOwotCQkJfQotCQkJZGVmYXVsdDoKLQkJCQlzdGF0ID0gVVNCX1NUX1NUQUxMRUQ7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFJIX0dFVF9ERVNDUklQVE9SIHwgUkhfQ0xBU1M6Ci0JewotCQlfX3UzMiB0ZW1wID0gcm9vdGh1Yl9hICgmZ29oY2kpOwotCi0JCWRhdGFfYnVmIFswXSA9IDk7CQkvKiBtaW4gbGVuZ3RoOyAqLwotCQlkYXRhX2J1ZiBbMV0gPSAweDI5OwotCQlkYXRhX2J1ZiBbMl0gPSB0ZW1wICYgUkhfQV9ORFA7Ci0jaWZkZWYgQ09ORklHX0FUOTFDX1BRRlBfVUhQQlVHCi0JCWRhdGFfYnVmIFsyXSA9IChkYXRhX2J1ZiBbMl0gPT0gMikgPyAxOjA7Ci0jZW5kaWYKLQkJZGF0YV9idWYgWzNdID0gMDsKLQkJaWYgKHRlbXAgJiBSSF9BX1BTTSkJLyogcGVyLXBvcnQgcG93ZXIgc3dpdGNoaW5nPyAqLwotCQkJZGF0YV9idWYgWzNdIHw9IDB4MTsKLQkJaWYgKHRlbXAgJiBSSF9BX05PQ1ApCS8qIG5vIG92ZXJjdXJyZW50IHJlcG9ydGluZz8gKi8KLQkJCWRhdGFfYnVmIFszXSB8PSAweDEwOwotCQllbHNlIGlmICh0ZW1wICYgUkhfQV9PQ1BNKQkvKiBwZXItcG9ydCBvdmVyY3VycmVudCByZXBvcnRpbmc/ICovCi0JCQlkYXRhX2J1ZiBbM10gfD0gMHg4OwotCi0JCS8qIGNvcnJlc3BvbmRzIHRvIGRhdGFfYnVmWzQtN10gKi8KLQkJZGF0YWIgWzFdID0gMDsKLQkJZGF0YV9idWYgWzVdID0gKHRlbXAgJiBSSF9BX1BPVFBHVCkgPj4gMjQ7Ci0JCXRlbXAgPSByb290aHViX2IgKCZnb2hjaSk7Ci0JCWRhdGFfYnVmIFs3XSA9IHRlbXAgJiBSSF9CX0RSOwotCQlpZiAoZGF0YV9idWYgWzJdIDwgNykgewotCQkJZGF0YV9idWYgWzhdID0gMHhmZjsKLQkJfSBlbHNlIHsKLQkJCWRhdGFfYnVmIFswXSArPSAyOwotCQkJZGF0YV9idWYgWzhdID0gKHRlbXAgJiBSSF9CX0RSKSA+PiA4OwotCQkJZGF0YV9idWYgWzEwXSA9IGRhdGFfYnVmIFs5XSA9IDB4ZmY7Ci0JCX0KLQotCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbmksCi0JCW1pbl90KHVuc2lnbmVkIGludCwgZGF0YV9idWYgWzBdLCB3TGVuZ3RoKSk7Ci0JCU9LIChsZW4pOwotCX0KLQotCWNhc2UgUkhfR0VUX0NPTkZJR1VSQVRJT046CSooX191OCAqKSBkYXRhX2J1ZiA9IDB4MDE7IE9LICgxKTsKLQotCWNhc2UgUkhfU0VUX0NPTkZJR1VSQVRJT046CVdSX1JIX1NUQVQgKDB4MTAwMDApOyBPSyAoMCk7Ci0KLQlkZWZhdWx0OgotCQlkYmcgKCJ1bnN1cHBvcnRlZCByb290IGh1YiBjb21tYW5kIik7Ci0JCXN0YXQgPSBVU0JfU1RfU1RBTExFRDsKLQl9Ci0KLSNpZmRlZglERUJVRwotCW9oY2lfZHVtcF9yb290aHViICgmZ29oY2ksIDEpOwotI2Vsc2UKLQl3YWl0X21zKDEpOwotI2VuZGlmCi0KLQlsZW4gPSBtaW5fdChpbnQsIGxlbiwgbGVuaSk7Ci0JaWYgKGRhdGEgIT0gZGF0YV9idWYpCi0JICAgIG1lbWNweSAoZGF0YSwgZGF0YV9idWYsIGxlbik7Ci0JZGV2LT5hY3RfbGVuID0gbGVuOwotCWRldi0+c3RhdHVzID0gc3RhdDsKLQotI2lmZGVmIERFQlVHCi0JaWYgKHRyYW5zZmVyX2xlbikKLQkJdXJiX3ByaXYuYWN0dWFsX2xlbmd0aCA9IHRyYW5zZmVyX2xlbjsKLQlwa3RfcHJpbnQoZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwgY21kLCAiUkVUKHJoKSIsIDAvKnVzYl9waXBlaW4ocGlwZSkqLyk7Ci0jZWxzZQotCXdhaXRfbXMoMSk7Ci0jZW5kaWYKLQotCXJldHVybiBzdGF0OwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBjb21tb24gY29kZSBmb3IgaGFuZGxpbmcgc3VibWl0IG1lc3NhZ2VzIC0gdXNlZCBmb3IgYWxsIGJ1dCByb290IGh1YiAqLwotLyogYWNjZXNzZXMuICovCi1pbnQgc3VibWl0X2NvbW1vbl9tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICpidWZmZXIsCi0JCWludCB0cmFuc2Zlcl9sZW4sIHN0cnVjdCBkZXZyZXF1ZXN0ICpzZXR1cCwgaW50IGludGVydmFsKQotewotCWludCBzdGF0ID0gMDsKLQlpbnQgbWF4c2l6ZSA9IHVzYl9tYXhwYWNrZXQoZGV2LCBwaXBlKTsKLQlpbnQgdGltZW91dDsKLQotCS8qIGRldmljZSBwdWxsZWQ/IFNob3J0Y3V0IHRoZSBhY3Rpb24uICovCi0JaWYgKGRldmdvbmUgPT0gZGV2KSB7Ci0JCWRldi0+c3RhdHVzID0gVVNCX1NUX0NSQ19FUlI7Ci0JCXJldHVybiAwOwotCX0KLQotI2lmZGVmIERFQlVHCi0JdXJiX3ByaXYuYWN0dWFsX2xlbmd0aCA9IDA7Ci0JcGt0X3ByaW50KGRldiwgcGlwZSwgYnVmZmVyLCB0cmFuc2Zlcl9sZW4sIHNldHVwLCAiU1VCIiwgdXNiX3BpcGVpbihwaXBlKSk7Ci0jZWxzZQotCXdhaXRfbXMoMSk7Ci0jZW5kaWYKLQlpZiAoIW1heHNpemUpIHsKLQkJZXJyKCJzdWJtaXRfY29tbW9uX21lc3NhZ2U6IHBpcGVzaXplIGZvciBwaXBlICVseCBpcyB6ZXJvIiwKLQkJCXBpcGUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKHNvaGNpX3N1Ym1pdF9qb2IoZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwgc2V0dXAsIGludGVydmFsKSA8IDApIHsKLQkJZXJyKCJzb2hjaV9zdWJtaXRfam9iIGZhaWxlZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0Jd2FpdF9tcygxMCk7Ci0JLyogb2hjaV9kdW1wX3N0YXR1cygmZ29oY2kpOyAqLwotCi0JLyogYWxsb3cgbW9yZSB0aW1lIGZvciBhIEJVTEsgZGV2aWNlIHRvIHJlYWN0IC0gc29tZSBhcmUgc2xvdyAqLwotI2RlZmluZSBCVUxLX1RPCSA1MDAwCS8qIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzICovCi0JaWYgKHVzYl9waXBldHlwZSAocGlwZSkgPT0gUElQRV9CVUxLKQotCQl0aW1lb3V0ID0gQlVMS19UTzsKLQllbHNlCi0JCXRpbWVvdXQgPSAxMDA7Ci0KLQkvKiB3YWl0IGZvciBpdCB0byBjb21wbGV0ZSAqLwotCWZvciAoOzspIHsKLQkJLyogY2hlY2sgd2hldGhlciB0aGUgY29udHJvbGxlciBpcyBkb25lICovCi0JCXN0YXQgPSBoY19pbnRlcnJ1cHQoKTsKLQkJaWYgKHN0YXQgPCAwKSB7Ci0JCQlzdGF0ID0gVVNCX1NUX0NSQ19FUlI7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoc3RhdCA+PSAwICYmIHN0YXQgIT0gMHhmZikgewotCQkJLyogMHhmZiBpcyByZXR1cm5lZCBmb3IgYW4gU0YtaW50ZXJydXB0ICovCi0JCQlicmVhazsKLQkJfQotCQlpZiAoLS10aW1lb3V0KSB7Ci0JCQl3YWl0X21zKDEpOwotCQl9IGVsc2UgewotCQkJZXJyKCJDVEw6VElNRU9VVCAiKTsKLQkJCXN0YXQgPSBVU0JfU1RfQ1JDX0VSUjsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCS8qIHdlIGdvdCBhbiBSb290IEh1YiBTdGF0dXMgQ2hhbmdlIGludGVycnVwdCAqLwotCWlmIChnb3RfcmhzYykgewotI2lmZGVmIERFQlVHCi0JCW9oY2lfZHVtcF9yb290aHViICgmZ29oY2ksIDEpOwotI2VuZGlmCi0JCWdvdF9yaHNjID0gMDsKLQkJLyogYWJ1c2UgdGltZW91dCAqLwotCQl0aW1lb3V0ID0gcmhfY2hlY2tfcG9ydF9zdGF0dXMoJmdvaGNpKTsKLQkJaWYgKHRpbWVvdXQgPj0gMCkgewotI2lmIDAgLyogdGhpcyBkb2VzIG5vdGhpbmcgdXNlZnVsLCBidXQgbGVhdmUgaXQgaGVyZSBpbiBjYXNlIHRoYXQgY2hhbmdlcyAqLwotCQkJLyogdGhlIGNhbGxlZCByb3V0aW5lIGFkZHMgMSB0byB0aGUgcGFzc2VkIHZhbHVlICovCi0JCQl1c2JfaHViX3BvcnRfY29ubmVjdF9jaGFuZ2UoZ29oY2kucmguZGV2LCB0aW1lb3V0IC0gMSk7Ci0jZW5kaWYKLQkJCS8qCi0JCQkgKiBYWFgKLQkJCSAqIFRoaXMgaXMgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGJlY2F1c2UgaXQgYXNzdW1lcwotCQkJICogdGhhdCBvbmx5IG9uZSBkZXZpY2UgaXMgZXZlciBwbHVnZ2VkIGluIQotCQkJICovCi0JCQlkZXZnb25lID0gZGV2OwotCQl9Ci0JfQotCi0JZGV2LT5zdGF0dXMgPSBzdGF0OwotCWRldi0+YWN0X2xlbiA9IHRyYW5zZmVyX2xlbjsKLQotI2lmZGVmIERFQlVHCi0JcGt0X3ByaW50KGRldiwgcGlwZSwgYnVmZmVyLCB0cmFuc2Zlcl9sZW4sIHNldHVwLCAiUkVUKGN0bHIpIiwgdXNiX3BpcGVpbihwaXBlKSk7Ci0jZWxzZQotCXdhaXRfbXMoMSk7Ci0jZW5kaWYKLQotCS8qIGZyZWUgVERzIGluIHVyYl9wcml2ICovCi0JdXJiX2ZyZWVfcHJpdiAoJnVyYl9wcml2KTsKLQlyZXR1cm4gMDsKLX0KLQotLyogc3VibWl0IHJvdXRpbmVzIGNhbGxlZCBmcm9tIHVzYi5jICovCi1pbnQgc3VibWl0X2J1bGtfbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqYnVmZmVyLAotCQlpbnQgdHJhbnNmZXJfbGVuKQotewotCWluZm8oInN1Ym1pdF9idWxrX21zZyIpOwotCXJldHVybiBzdWJtaXRfY29tbW9uX21zZyhkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCBOVUxMLCAwKTsKLX0KLQotaW50IHN1Ym1pdF9jb250cm9sX21zZyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsIHZvaWQgKmJ1ZmZlciwKLQkJaW50IHRyYW5zZmVyX2xlbiwgc3RydWN0IGRldnJlcXVlc3QgKnNldHVwKQotewotCWludCBtYXhzaXplID0gdXNiX21heHBhY2tldChkZXYsIHBpcGUpOwotCi0JaW5mbygic3VibWl0X2NvbnRyb2xfbXNnIik7Ci0jaWZkZWYgREVCVUcKLQl1cmJfcHJpdi5hY3R1YWxfbGVuZ3RoID0gMDsKLQlwa3RfcHJpbnQoZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwgc2V0dXAsICJTVUIiLCB1c2JfcGlwZWluKHBpcGUpKTsKLSNlbHNlCi0Jd2FpdF9tcygxKTsKLSNlbmRpZgotCWlmICghbWF4c2l6ZSkgewotCQllcnIoInN1Ym1pdF9jb250cm9sX21lc3NhZ2U6IHBpcGVzaXplIGZvciBwaXBlICVseCBpcyB6ZXJvIiwKLQkJCXBpcGUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICgoKHBpcGUgPj4gOCkgJiAweDdmKSA9PSBnb2hjaS5yaC5kZXZudW0pIHsKLQkJZ29oY2kucmguZGV2ID0gZGV2OwotCQkvKiByb290IGh1YiAtIHJlZGlyZWN0ICovCi0JCXJldHVybiBvaGNpX3N1Ym1pdF9yaF9tc2coZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwKLQkJCXNldHVwKTsKLQl9Ci0KLQlyZXR1cm4gc3VibWl0X2NvbW1vbl9tc2coZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwgc2V0dXAsIDApOwotfQotCi1pbnQgc3VibWl0X2ludF9tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICpidWZmZXIsCi0JCWludCB0cmFuc2Zlcl9sZW4sIGludCBpbnRlcnZhbCkKLXsKLQlpbmZvKCJzdWJtaXRfaW50X21zZyIpOwotCXJldHVybiAtMTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogSEMgZnVuY3Rpb25zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiByZXNldCB0aGUgSEMgYW5kIEJVUyAqLwotCi1zdGF0aWMgaW50IGhjX3Jlc2V0IChvaGNpX3QgKm9oY2kpCi17Ci0JaW50IHRpbWVvdXQgPSAzMDsKLQlpbnQgc21tX3RpbWVvdXQgPSA1MDsgLyogMCw1IHNlYyAqLwotCi0JZGJnKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKLQotCWlmIChyZWFkbCAoJm9oY2ktPnJlZ3MtPmNvbnRyb2wpICYgT0hDSV9DVFJMX0lSKSB7IC8qIFNNTSBvd25zIHRoZSBIQyAqLwotCQl3cml0ZWwgKE9IQ0lfT0NSLCAmb2hjaS0+cmVncy0+Y21kc3RhdHVzKTsgLyogcmVxdWVzdCBvd25lcnNoaXAgKi8KLQkJaW5mbygiVVNCIEhDIFRha2VPdmVyIGZyb20gU01NIik7Ci0JCXdoaWxlIChyZWFkbCAoJm9oY2ktPnJlZ3MtPmNvbnRyb2wpICYgT0hDSV9DVFJMX0lSKSB7Ci0JCQl3YWl0X21zICgxMCk7Ci0JCQlpZiAoLS1zbW1fdGltZW91dCA9PSAwKSB7Ci0JCQkJZXJyKCJVU0IgSEMgVGFrZU92ZXIgZmFpbGVkISIpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIERpc2FibGUgSEMgaW50ZXJydXB0cyAqLwotCXdyaXRlbCAoT0hDSV9JTlRSX01JRSwgJm9oY2ktPnJlZ3MtPmludHJkaXNhYmxlKTsKLQotCWRiZygiVVNCIEhDIHJlc2V0X2hjIHVzYi0lczogY3RybCA9IDB4JVggO1xuIiwKLQkJb2hjaS0+c2xvdF9uYW1lLAotCQlyZWFkbCgmb2hjaS0+cmVncy0+Y29udHJvbCkpOwotCi0JLyogUmVzZXQgVVNCIChuZWVkZWQgYnkgc29tZSBjb250cm9sbGVycykgKi8KLQl3cml0ZWwgKDAsICZvaGNpLT5yZWdzLT5jb250cm9sKTsKLQotCS8qIEhDIFJlc2V0IHJlcXVpcmVzIG1heCAxMCB1cyBkZWxheSAqLwotCXdyaXRlbCAoT0hDSV9IQ1IsICAmb2hjaS0+cmVncy0+Y21kc3RhdHVzKTsKLQl3aGlsZSAoKHJlYWRsICgmb2hjaS0+cmVncy0+Y21kc3RhdHVzKSAmIE9IQ0lfSENSKSAhPSAwKSB7Ci0JCWlmICgtLXRpbWVvdXQgPT0gMCkgewotCQkJZXJyKCJVU0IgSEMgcmVzZXQgdGltZWQgb3V0ISIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXVkZWxheSAoMSk7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBTdGFydCBhbiBPSENJIGNvbnRyb2xsZXIsIHNldCB0aGUgQlVTIG9wZXJhdGlvbmFsCi0gKiBlbmFibGUgaW50ZXJydXB0cwotICogY29ubmVjdCB0aGUgdmlydHVhbCByb290IGh1YiAqLwotCi1zdGF0aWMgaW50IGhjX3N0YXJ0IChvaGNpX3QgKiBvaGNpKQotewotCV9fdTMyIG1hc2s7Ci0JdW5zaWduZWQgaW50IGZtaW50ZXJ2YWw7Ci0KLQlvaGNpLT5kaXNhYmxlZCA9IDE7Ci0KLQkvKiBUZWxsIHRoZSBjb250cm9sbGVyIHdoZXJlIHRoZSBjb250cm9sIGFuZCBidWxrIGxpc3RzIGFyZQotCSAqIFRoZSBsaXN0cyBhcmUgZW1wdHkgbm93LiAqLwotCi0Jd3JpdGVsICgwLCAmb2hjaS0+cmVncy0+ZWRfY29udHJvbGhlYWQpOwotCXdyaXRlbCAoMCwgJm9oY2ktPnJlZ3MtPmVkX2J1bGtoZWFkKTsKLQotCXdyaXRlbCAoKF9fdTMyKW9oY2ktPmhjY2EsICZvaGNpLT5yZWdzLT5oY2NhKTsgLyogYSByZXNldCBjbGVhcnMgdGhpcyAqLwotCi0JZm1pbnRlcnZhbCA9IDB4MmVkZjsKLQl3cml0ZWwgKChmbWludGVydmFsICogOSkgLyAxMCwgJm9oY2ktPnJlZ3MtPnBlcmlvZGljc3RhcnQpOwotCWZtaW50ZXJ2YWwgfD0gKCgoKGZtaW50ZXJ2YWwgLSAyMTApICogNikgLyA3KSA8PCAxNik7Ci0Jd3JpdGVsIChmbWludGVydmFsLCAmb2hjaS0+cmVncy0+Zm1pbnRlcnZhbCk7Ci0Jd3JpdGVsICgweDYyOCwgJm9oY2ktPnJlZ3MtPmxzdGhyZXNoKTsKLQotCS8qIHN0YXJ0IGNvbnRyb2xsZXIgb3BlcmF0aW9ucyAqLwotCW9oY2ktPmhjX2NvbnRyb2wgPSBPSENJX0NPTlRST0xfSU5JVCB8IE9IQ0lfVVNCX09QRVI7Ci0Jb2hjaS0+ZGlzYWJsZWQgPSAwOwotCXdyaXRlbCAob2hjaS0+aGNfY29udHJvbCwgJm9oY2ktPnJlZ3MtPmNvbnRyb2wpOwotCi0JLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLwotCW1hc2sgPSAoT0hDSV9JTlRSX1NPIHwgT0hDSV9JTlRSX1dESCB8IE9IQ0lfSU5UUl9TRiB8IE9IQ0lfSU5UUl9SRCB8Ci0JCQlPSENJX0lOVFJfVUUgfCBPSENJX0lOVFJfRk5PIHwgT0hDSV9JTlRSX1JIU0MgfAotCQkJT0hDSV9JTlRSX09DIHwgT0hDSV9JTlRSX01JRSk7Ci0Jd3JpdGVsIChtYXNrLCAmb2hjaS0+cmVncy0+aW50cmRpc2FibGUpOwotCS8qIGNsZWFyIGFsbCBpbnRlcnJ1cHRzICovCi0JbWFzayAmPSB+T0hDSV9JTlRSX01JRTsKLQl3cml0ZWwgKG1hc2ssICZvaGNpLT5yZWdzLT5pbnRyc3RhdHVzKTsKLQkvKiBDaG9vc2UgdGhlIGludGVycnVwdHMgd2UgY2FyZSBhYm91dCBub3cgIC0gYnV0IHcvbyBNSUUgKi8KLQltYXNrID0gT0hDSV9JTlRSX1JIU0MgfCBPSENJX0lOVFJfVUUgfCBPSENJX0lOVFJfV0RIIHwgT0hDSV9JTlRSX1NPOwotCXdyaXRlbCAobWFzaywgJm9oY2ktPnJlZ3MtPmludHJlbmFibGUpOwotCi0jaWZkZWYJT0hDSV9VU0VfTlBTCi0JLyogcmVxdWlyZWQgZm9yIEFNRC03NTYgYW5kIHNvbWUgTWFjIHBsYXRmb3JtcyAqLwotCXdyaXRlbCAoKHJvb3RodWJfYSAob2hjaSkgfCBSSF9BX05QUykgJiB+UkhfQV9QU00sCi0JCSZvaGNpLT5yZWdzLT5yb290aHViLmEpOwotCXdyaXRlbCAoUkhfSFNfTFBTQywgJm9oY2ktPnJlZ3MtPnJvb3RodWIuc3RhdHVzKTsKLSNlbmRpZgkvKiBPSENJX1VTRV9OUFMgKi8KLQotI2RlZmluZSBtZGVsYXkobikgKHt1bnNpZ25lZCBsb25nIG1zZWM9KG4pOyB3aGlsZSAobXNlYy0tKSB1ZGVsYXkoMTAwMCk7fSkKLQkvKiBQT1RQR1QgZGVsYXkgaXMgYml0cyAyNC0zMSwgaW4gMiBtcyB1bml0cy4gKi8KLQltZGVsYXkgKChyb290aHViX2EgKG9oY2kpID4+IDIzKSAmIDB4MWZlKTsKLQotCS8qIGNvbm5lY3QgdGhlIHZpcnR1YWwgcm9vdCBodWIgKi8KLQlvaGNpLT5yaC5kZXZudW0gPSAwOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIGFuIGludGVycnVwdCBoYXBwZW5zICovCi0KLXN0YXRpYyBpbnQKLWhjX2ludGVycnVwdCAodm9pZCkKLXsKLQlvaGNpX3QgKm9oY2kgPSAmZ29oY2k7Ci0Jc3RydWN0IG9oY2lfcmVncyAqcmVncyA9IG9oY2ktPnJlZ3M7Ci0JaW50IGludHM7Ci0JaW50IHN0YXQgPSAtMTsKLQotCWlmICgob2hjaS0+aGNjYS0+ZG9uZV9oZWFkICE9IDApICYmICEobTMyX3N3YXAgKG9oY2ktPmhjY2EtPmRvbmVfaGVhZCkgJiAweDAxKSkgewotCQlpbnRzID0JT0hDSV9JTlRSX1dESDsKLQl9IGVsc2UgewotCQlpbnRzID0gcmVhZGwgKCZyZWdzLT5pbnRyc3RhdHVzKTsKLQl9Ci0KLQkvKiBkYmcoIkludGVycnVwdDogJXggZnJhbWU6ICV4IiwgaW50cywgbGUxNl90b19jcHUgKG9oY2ktPmhjY2EtPmZyYW1lX25vKSk7ICovCi0KLQlpZiAoaW50cyAmIE9IQ0lfSU5UUl9SSFNDKSB7Ci0JCWdvdF9yaHNjID0gMTsKLQl9Ci0KLQlpZiAoaW50cyAmIE9IQ0lfSU5UUl9VRSkgewotCQlvaGNpLT5kaXNhYmxlZCsrOwotCQllcnIgKCJPSENJIFVucmVjb3ZlcmFibGUgRXJyb3IsIGNvbnRyb2xsZXIgdXNiLSVzIGRpc2FibGVkIiwKLQkJCW9oY2ktPnNsb3RfbmFtZSk7Ci0JCS8qIGUuZy4gZHVlIHRvIFBDSSBNYXN0ZXIvVGFyZ2V0IEFib3J0ICovCi0KLSNpZmRlZglERUJVRwotCQlvaGNpX2R1bXAgKG9oY2ksIDEpOwotI2Vsc2UKLQl3YWl0X21zKDEpOwotI2VuZGlmCi0JCS8qIEZJWE1FOiBiZSBvcHRpbWlzdGljLCBob3BlIHRoYXQgYnVnIHdvbid0IHJlcGVhdCBvZnRlbi4gKi8KLQkJLyogTWFrZSBzb21lIG5vbi1pbnRlcnJ1cHQgY29udGV4dCByZXN0YXJ0IHRoZSBjb250cm9sbGVyLiAqLwotCQkvKiBDb3VudCBhbmQgbGltaXQgdGhlIHJldHJpZXMgdGhvdWdoOyBlaXRoZXIgaGFyZHdhcmUgb3IgKi8KLQkJLyogc29mdHdhcmUgZXJyb3JzIGNhbiBnbyBmb3JldmVyLi4uICovCi0JCWhjX3Jlc2V0IChvaGNpKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmIChpbnRzICYgT0hDSV9JTlRSX1dESCkgewotCQl3YWl0X21zKDEpOwotCQl3cml0ZWwgKE9IQ0lfSU5UUl9XREgsICZyZWdzLT5pbnRyZGlzYWJsZSk7Ci0JCXN0YXQgPSBkbF9kb25lX2xpc3QgKCZnb2hjaSwgZGxfcmV2ZXJzZV9kb25lX2xpc3QgKCZnb2hjaSkpOwotCQl3cml0ZWwgKE9IQ0lfSU5UUl9XREgsICZyZWdzLT5pbnRyZW5hYmxlKTsKLQl9Ci0KLQlpZiAoaW50cyAmIE9IQ0lfSU5UUl9TTykgewotCQlkYmcoIlVTQiBTY2hlZHVsZSBvdmVycnVuXG4iKTsKLQkJd3JpdGVsIChPSENJX0lOVFJfU08sICZyZWdzLT5pbnRyZW5hYmxlKTsKLQkJc3RhdCA9IC0xOwotCX0KLQotCS8qIEZJWE1FOiAgdGhpcyBhc3N1bWVzIFNPRiAoMS9tcykgaW50ZXJydXB0cyBkb24ndCBnZXQgbG9zdC4uLiAqLwotCWlmIChpbnRzICYgT0hDSV9JTlRSX1NGKSB7Ci0JCXVuc2lnbmVkIGludCBmcmFtZSA9IG0xNl9zd2FwIChvaGNpLT5oY2NhLT5mcmFtZV9ubykgJiAxOwotCQl3YWl0X21zKDEpOwotCQl3cml0ZWwgKE9IQ0lfSU5UUl9TRiwgJnJlZ3MtPmludHJkaXNhYmxlKTsKLQkJaWYgKG9oY2ktPmVkX3JtX2xpc3RbZnJhbWVdICE9IE5VTEwpCi0JCQl3cml0ZWwgKE9IQ0lfSU5UUl9TRiwgJnJlZ3MtPmludHJlbmFibGUpOwotCQlzdGF0ID0gMHhmZjsKLQl9Ci0KLQl3cml0ZWwgKGludHMsICZyZWdzLT5pbnRyc3RhdHVzKTsKLQlyZXR1cm4gc3RhdDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogRGUtYWxsb2NhdGUgYWxsIHJlc291cmNlcy4uICovCi0KLXN0YXRpYyB2b2lkIGhjX3JlbGVhc2Vfb2hjaSAob2hjaV90ICpvaGNpKQotewotCWRiZyAoIlVTQiBIQyByZWxlYXNlIG9oY2kgdXNiLSVzIiwgb2hjaS0+c2xvdF9uYW1lKTsKLQotCWlmICghb2hjaS0+ZGlzYWJsZWQpCi0JCWhjX3Jlc2V0IChvaGNpKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSAqIGxvdyBsZXZlbCBpbml0YWxpc2F0aW9uIHJvdXRpbmUsIGNhbGxlZCBmcm9tIHVzYi5jCi0gKi8KLXN0YXRpYyBjaGFyIG9oY2lfaW5pdGVkID0gMDsKLQotaW50IHVzYl9sb3dsZXZlbF9pbml0KHZvaWQpCi17Ci0JLyoKLQkgKiBFbmFibGUgVVNCIGhvc3QgY2xvY2suCi0JICovCi0JKkFUOTFDX1BNQ19TQ0VSID0gQVQ5MUNfUE1DX1VIUDsJLyogNDhNSHogY2xvY2sgZW5hYmxlZCBmb3IgVUhQICovCi0JKkFUOTFDX1BNQ19QQ0VSID0gMSA8PCBBVDkxQ19JRF9VSFA7CS8qIFBlcmlwaGVyYWwgQ2xvY2sgRW5hYmxlIFJlZ2lzdGVyICovCi0KLQltZW1zZXQgKCZnb2hjaSwgMCwgc2l6ZW9mIChvaGNpX3QpKTsKLQltZW1zZXQgKCZ1cmJfcHJpdiwgMCwgc2l6ZW9mICh1cmJfcHJpdl90KSk7Ci0KLQkvKiBhbGlnbiB0aGUgc3RvcmFnZSAqLwotCWlmICgoX191MzIpJmdoY2NhWzBdICYgMHhmZikgewotCQllcnIoIkhDQ0Egbm90IGFsaWduZWQhISIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXBoY2NhID0gJmdoY2NhWzBdOwotCWluZm8oImFsaWduZWQgZ2hjY2EgJXAiLCBwaGNjYSk7Ci0JbWVtc2V0KCZvaGNpX2RldiwgMCwgc2l6ZW9mKHN0cnVjdCBvaGNpX2RldmljZSkpOwotCWlmICgoX191MzIpJm9oY2lfZGV2LmVkWzBdICYgMHg3KSB7Ci0JCWVycigiRURzIG5vdCBhbGlnbmVkISEiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQltZW1zZXQoZ3RkLCAwLCBzaXplb2YodGRfdCkgKiAoTlVNX1REICsgMSkpOwotCWlmICgoX191MzIpZ3RkICYgMHg3KSB7Ci0JCWVycigiVERzIG5vdCBhbGlnbmVkISEiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlwdGQgPSBndGQ7Ci0JZ29oY2kuaGNjYSA9IHBoY2NhOwotCW1lbXNldCAocGhjY2EsIDAsIHNpemVvZiAoc3RydWN0IG9oY2lfaGNjYSkpOwotCi0JZ29oY2kuZGlzYWJsZWQgPSAxOwotCWdvaGNpLnNsZWVwaW5nID0gMDsKLQlnb2hjaS5pcnEgPSAtMTsKLQlnb2hjaS5yZWdzID0gKHN0cnVjdCBvaGNpX3JlZ3MgKilBVDkxX1VTQl9IT1NUX0JBU0U7Ci0KLQlnb2hjaS5mbGFncyA9IDA7Ci0JZ29oY2kuc2xvdF9uYW1lID0gImF0OTFybTkyMDAiOwotCi0JaWYgKGhjX3Jlc2V0ICgmZ29oY2kpIDwgMCkgewotCQloY19yZWxlYXNlX29oY2kgKCZnb2hjaSk7Ci0JCS8qIEluaXRpYWxpemF0aW9uIGZhaWxlZCAqLwotCQkqQVQ5MUNfUE1DX1BDRVIgPSBBVDkxQ19JRF9VSFA7Ci0JCSpBVDkxQ19QTUNfU0NEUiA9IDEgPDwgQVQ5MUNfUE1DX1VIUDsJLyogNDhNSHogY2xvY2sgZGlzYWJsZWQgZm9yIFVIUCAqLwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogRklYTUUgdGhpcyBpcyBhIHNlY29uZCBIQyByZXNldDsgd2h5Pz8gKi8KLS8qCXdyaXRlbCAoZ29oY2kuaGNfY29udHJvbCA9IE9IQ0lfVVNCX1JFU0VULCAmZ29oY2kucmVncy0+Y29udHJvbCk7Ci0Jd2FpdF9tcyAoMTApOyovCi0KLQlpZiAoaGNfc3RhcnQgKCZnb2hjaSkgPCAwKSB7Ci0JCWVyciAoImNhbid0IHN0YXJ0IHVzYi0lcyIsIGdvaGNpLnNsb3RfbmFtZSk7Ci0JCWhjX3JlbGVhc2Vfb2hjaSAoJmdvaGNpKTsKLQkJLyogSW5pdGlhbGl6YXRpb24gZmFpbGVkICovCi0JCSpBVDkxQ19QTUNfUENFUiA9IEFUOTFDX0lEX1VIUDsKLQkJKkFUOTFDX1BNQ19TQ0RSID0gMSA8PCBBVDkxQ19QTUNfVUhQOwkvKiA0OE1IeiBjbG9jayBkaXNhYmxlZCBmb3IgVUhQICovCi0JCXJldHVybiAtMTsKLQl9Ci0KLSNpZmRlZglERUJVRwotCW9oY2lfZHVtcCAoJmdvaGNpLCAxKTsKLSNlbHNlCi0Jd2FpdF9tcygxKTsKLSNlbmRpZgotCW9oY2lfaW5pdGVkID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IHVzYl9sb3dsZXZlbF9zdG9wKHZvaWQpCi17Ci0JLyogdGhpcyBnZXRzIGNhbGxlZCByZWFsbHkgZWFybHkgLSBiZWZvcmUgdGhlIGNvbnRyb2xsZXIgaGFzICovCi0JLyogZXZlbiBiZWVuIGluaXRpYWxpemVkISAqLwotCWlmICghb2hjaV9pbml0ZWQpCi0JCXJldHVybiAwOwotCS8qIFRPRE8gcmVsZWFzZSBhbnkgaW50ZXJydXB0cywgZXRjLiAqLwotCS8qIGNhbGwgaGNfcmVsZWFzZV9vaGNpKCkgaGVyZSA/ICovCi0JaGNfcmVzZXQgKCZnb2hjaSk7Ci0JLyogbWF5IG5vdCB3YW50IHRvIGRvIHRoaXMgKi8KLQkqQVQ5MUNfUE1DX1BDRVIgPSAxIDw8IEFUOTFDX0lEX1VIUDsKLQkqQVQ5MUNfUE1DX1NDRFIgPSAxIDw8IEFUOTFDX1BNQ19VSFA7CS8qIDQ4TUh6IGNsb2NrIGRpc2FibGVkIGZvciBVSFAgKi8KLQlyZXR1cm4gMDsKLX0KLQotI2VuZGlmIC8qIENPTkZJR19VU0JfT0hDSSAqLwpkaWZmIC0tZ2l0IGEvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC91c2Jfb2hjaS5oIGIvY3B1L2FybTkyMHQvYXQ5MXJtOTIwMC91c2Jfb2hjaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2I0ZTkzLi4wMDAwMDAwCi0tLSBhL2NwdS9hcm05MjB0L2F0OTFybTkyMDAvdXNiX29oY2kuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxOSArMCwwIEBACi0vKgotICogVVJCIE9IQ0kgSENEIChIb3N0IENvbnRyb2xsZXIgRHJpdmVyKSBmb3IgVVNCLgotICoKLSAqIChDKSBDb3B5cmlnaHQgMTk5OSBSb21hbiBXZWlzc2dhZXJiZXIgPHdlaXNzZ0B2aWVubmEuYXQ+Ci0gKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMSBEYXZpZCBCcm93bmVsbCA8ZGJyb3duZWxsQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KLSAqCi0gKiB1c2Itb2hjaS5oCi0gKi8KLQotCi1zdGF0aWMgaW50IGNjX3RvX2Vycm9yWzE2XSA9IHsKLQotLyogbWFwcGluZyBvZiB0aGUgT0hDSSBDQyBzdGF0dXMgdG8gZXJyb3IgY29kZXMgKi8KLQkvKiBObyAgRXJyb3IgICovCSAgICAgICAwLAotCS8qIENSQyBFcnJvciAgKi8JICAgICAgIFVTQl9TVF9DUkNfRVJSLAotCS8qIEJpdCBTdHVmZiAgKi8JICAgICAgIFVTQl9TVF9CSVRfRVJSLAotCS8qIERhdGEgVG9nZyAgKi8JICAgICAgIFVTQl9TVF9DUkNfRVJSLAotCS8qIFN0YWxsICAgICAgKi8JICAgICAgIFVTQl9TVF9TVEFMTEVELAotCS8qIERldk5vdFJlc3AgKi8JICAgICAgIC0xLAotCS8qIFBJRENoZWNrICAgKi8JICAgICAgIFVTQl9TVF9CSVRfRVJSLAotCS8qIFVuRXhwUElEICAgKi8JICAgICAgIFVTQl9TVF9CSVRfRVJSLAotCS8qIERhdGFPdmVyICAgKi8JICAgICAgIFVTQl9TVF9CVUZfRVJSLAotCS8qIERhdGFVbmRlciAgKi8JICAgICAgIFVTQl9TVF9CVUZfRVJSLAotCS8qIHJlc2VydmQgICAgKi8JICAgICAgIC0xLAotCS8qIHJlc2VydmQgICAgKi8JICAgICAgIC0xLAotCS8qIEJ1ZmZlck92ZXIgKi8JICAgICAgIFVTQl9TVF9CVUZfRVJSLAotCS8qIEJ1ZmZVbmRlciAgKi8JICAgICAgIFVTQl9TVF9CVUZfRVJSLAotCS8qIE5vdCBBY2Nlc3MgKi8JICAgICAgIC0xLAotCS8qIE5vdCBBY2Nlc3MgKi8JICAgICAgIC0xCi19OwotCi0vKiBFRCBTdGF0ZXMgKi8KLQotI2RlZmluZSBFRF9ORVcJCTB4MDAKLSNkZWZpbmUgRURfVU5MSU5LCTB4MDEKLSNkZWZpbmUgRURfT1BFUgkJMHgwMgotI2RlZmluZSBFRF9ERUwJCTB4MDQKLSNkZWZpbmUgRURfVVJCX0RFTAkweDA4Ci0KLS8qIHVzYl9vaGNpX2VkICovCi1zdHJ1Y3QgZWQgewotCV9fdTMyIGh3SU5GTzsKLQlfX3UzMiBod1RhaWxQOwotCV9fdTMyIGh3SGVhZFA7Ci0JX191MzIgaHdOZXh0RUQ7Ci0KLQlzdHJ1Y3QgZWQgKmVkX3ByZXY7Ci0JX191OCBpbnRfcGVyaW9kOwotCV9fdTggaW50X2JyYW5jaDsKLQlfX3U4IGludF9sb2FkOwotCV9fdTggaW50X2ludGVydmFsOwotCV9fdTggc3RhdGU7Ci0JX191OCB0eXBlOwotCV9fdTE2IGxhc3RfaXNvOwotCXN0cnVjdCBlZCAqZWRfcm1fbGlzdDsKLQotCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2OwotCV9fdTMyIHVudXNlZFszXTsKLX0gX19hdHRyaWJ1dGUoKGFsaWduZWQoMTYpKSk7Ci10eXBlZGVmIHN0cnVjdCBlZCBlZF90OwotCi0KLS8qIFREIGluZm8gZmllbGQgKi8KLSNkZWZpbmUgVERfQ0MJICAgIDB4ZjAwMDAwMDAKLSNkZWZpbmUgVERfQ0NfR0VUKHRkX3ApICgodGRfcCA+PjI4KSAmIDB4MGYpCi0jZGVmaW5lIFREX0NDX1NFVCh0ZF9wLCBjYykgKHRkX3ApID0gKCh0ZF9wKSAmIDB4MGZmZmZmZmYpIHwgKCgoY2MpICYgMHgwZikgPDwgMjgpCi0jZGVmaW5lIFREX0VDCSAgICAweDBDMDAwMDAwCi0jZGVmaW5lIFREX1QJICAgIDB4MDMwMDAwMDAKLSNkZWZpbmUgVERfVF9EQVRBMCAgMHgwMjAwMDAwMAotI2RlZmluZSBURF9UX0RBVEExICAweDAzMDAwMDAwCi0jZGVmaW5lIFREX1RfVE9HR0xFIDB4MDAwMDAwMDAKLSNkZWZpbmUgVERfUgkgICAgMHgwMDA0MDAwMAotI2RlZmluZSBURF9ESQkgICAgMHgwMEUwMDAwMAotI2RlZmluZSBURF9ESV9TRVQoWCkgKCgoWCkgJiAweDA3KTw8IDIxKQotI2RlZmluZSBURF9EUAkgICAgMHgwMDE4MDAwMAotI2RlZmluZSBURF9EUF9TRVRVUCAweDAwMDAwMDAwCi0jZGVmaW5lIFREX0RQX0lOICAgIDB4MDAxMDAwMDAKLSNkZWZpbmUgVERfRFBfT1VUICAgMHgwMDA4MDAwMAotCi0jZGVmaW5lIFREX0lTTwkgICAgMHgwMDAxMDAwMAotI2RlZmluZSBURF9ERUwJICAgIDB4MDAwMjAwMDAKLQotLyogQ0MgQ29kZXMgKi8KLSNkZWZpbmUgVERfQ0NfTk9FUlJPUgkgICAweDAwCi0jZGVmaW5lIFREX0NDX0NSQwkgICAweDAxCi0jZGVmaW5lIFREX0NDX0JJVFNUVUZGSU5HICAweDAyCi0jZGVmaW5lIFREX0NDX0RBVEFUT0dHTEVNICAweDAzCi0jZGVmaW5lIFREX0NDX1NUQUxMCSAgIDB4MDQKLSNkZWZpbmUgVERfREVWTk9UUkVTUAkgICAweDA1Ci0jZGVmaW5lIFREX1BJRENIRUNLRkFJTAkgICAweDA2Ci0jZGVmaW5lIFREX1VORVhQRUNURURQSUQgICAweDA3Ci0jZGVmaW5lIFREX0RBVEFPVkVSUlVOCSAgIDB4MDgKLSNkZWZpbmUgVERfREFUQVVOREVSUlVOCSAgIDB4MDkKLSNkZWZpbmUgVERfQlVGRkVST1ZFUlJVTiAgIDB4MEMKLSNkZWZpbmUgVERfQlVGRkVSVU5ERVJSVU4gIDB4MEQKLSNkZWZpbmUgVERfTk9UQUNDRVNTRUQJICAgMHgwRgotCi0KLSNkZWZpbmUgTUFYUFNXIDEKLQotc3RydWN0IHRkIHsKLQlfX3UzMiBod0lORk87Ci0JX191MzIgaHdDQlA7CQkvKiBDdXJyZW50IEJ1ZmZlciBQb2ludGVyICovCi0JX191MzIgaHdOZXh0VEQ7CQkvKiBOZXh0IFREIFBvaW50ZXIgKi8KLQlfX3UzMiBod0JFOwkJLyogTWVtb3J5IEJ1ZmZlciBFbmQgUG9pbnRlciAqLwotCi0JX191MTYgaHdQU1dbTUFYUFNXXTsKLQlfX3U4IHVudXNlZDsKLQlfX3U4IGluZGV4OwotCXN0cnVjdCBlZCAqZWQ7Ci0Jc3RydWN0IHRkICpuZXh0X2RsX3RkOwotCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2OwotCWludCB0cmFuc2Zlcl9sZW47Ci0JX191MzIgZGF0YTsKLQotCV9fdTMyIHVudXNlZDJbMl07Ci19IF9fYXR0cmlidXRlKChhbGlnbmVkKDMyKSkpOwotdHlwZWRlZiBzdHJ1Y3QgdGQgdGRfdDsKLQotI2RlZmluZSBPSENJX0VEX1NLSVAJKDEgPDwgMTQpCi0KLS8qCi0gKiBUaGUgSENDQSAoSG9zdCBDb250cm9sbGVyIENvbW11bmljYXRpb25zIEFyZWEpIGlzIGEgMjU2IGJ5dGUKLSAqIHN0cnVjdHVyZSBkZWZpbmVkIGluIHRoZSBPSENJIHNwZWMuIHRoYXQgdGhlIGhvc3QgY29udHJvbGxlciBpcwotICogdG9sZCB0aGUgYmFzZSBhZGRyZXNzIG9mLiAgSXQgbXVzdCBiZSAyNTYtYnl0ZSBhbGlnbmVkLgotICovCi0KLSNkZWZpbmUgTlVNX0lOVFMgMzIJLyogcGFydCBvZiB0aGUgT0hDSSBzdGFuZGFyZCAqLwotc3RydWN0IG9oY2lfaGNjYSB7Ci0JX191MzIJaW50X3RhYmxlW05VTV9JTlRTXTsJLyogSW50ZXJydXB0IEVEIHRhYmxlICovCi0JX191MTYJZnJhbWVfbm87CQkvKiBjdXJyZW50IGZyYW1lIG51bWJlciAqLwotCV9fdTE2CXBhZDE7CQkJLyogc2V0IHRvIDAgb24gZWFjaCBmcmFtZV9ubyBjaGFuZ2UgKi8KLQlfX3UzMglkb25lX2hlYWQ7CQkvKiBpbmZvIHJldHVybmVkIGZvciBhbiBpbnRlcnJ1cHQgKi8KLQl1OAkJcmVzZXJ2ZWRfZm9yX2hjWzExNl07Ci19IF9fYXR0cmlidXRlKChhbGlnbmVkKDI1NikpKTsKLQotCi0vKgotICogTWF4aW11bSBudW1iZXIgb2Ygcm9vdCBodWIgcG9ydHMuCi0gKi8KLSNkZWZpbmUgTUFYX1JPT1RfUE9SVFMJMTUJLyogbWF4aW11bSBPSENJIHJvb3QgaHViIHBvcnRzICovCi0KLS8qCi0gKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIE9IQ0kgY29udHJvbGxlcidzIG1lbW9yeSBtYXBwZWQgSS9PCi0gKiByZWdpb24uICBUaGlzIGlzIE1lbW9yeSBNYXBwZWQgSS9PLglZb3UgbXVzdCB1c2UgdGhlIHJlYWRsKCkgYW5kCi0gKiB3cml0ZWwoKSBtYWNyb3MgZGVmaW5lZCBpbiBhc20vaW8uaCB0byBhY2Nlc3MgdGhlc2UhIQotICovCi1zdHJ1Y3Qgb2hjaV9yZWdzIHsKLQkvKiBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXJzICovCi0JX191MzIJcmV2aXNpb247Ci0JX191MzIJY29udHJvbDsKLQlfX3UzMgljbWRzdGF0dXM7Ci0JX191MzIJaW50cnN0YXR1czsKLQlfX3UzMglpbnRyZW5hYmxlOwotCV9fdTMyCWludHJkaXNhYmxlOwotCS8qIG1lbW9yeSBwb2ludGVycyAqLwotCV9fdTMyCWhjY2E7Ci0JX191MzIJZWRfcGVyaW9kY3VycmVudDsKLQlfX3UzMgllZF9jb250cm9saGVhZDsKLQlfX3UzMgllZF9jb250cm9sY3VycmVudDsKLQlfX3UzMgllZF9idWxraGVhZDsKLQlfX3UzMgllZF9idWxrY3VycmVudDsKLQlfX3UzMglkb25laGVhZDsKLQkvKiBmcmFtZSBjb3VudGVycyAqLwotCV9fdTMyCWZtaW50ZXJ2YWw7Ci0JX191MzIJZm1yZW1haW5pbmc7Ci0JX191MzIJZm1udW1iZXI7Ci0JX191MzIJcGVyaW9kaWNzdGFydDsKLQlfX3UzMglsc3RocmVzaDsKLQkvKiBSb290IGh1YiBwb3J0cyAqLwotCXN0cnVjdAlvaGNpX3Jvb3RodWJfcmVncyB7Ci0JCV9fdTMyCWE7Ci0JCV9fdTMyCWI7Ci0JCV9fdTMyCXN0YXR1czsKLQkJX191MzIJcG9ydHN0YXR1c1tNQVhfUk9PVF9QT1JUU107Ci0JfSByb290aHViOwotfSBfX2F0dHJpYnV0ZSgoYWxpZ25lZCgzMikpKTsKLQotCi0vKiBPSENJIENPTlRST0wgQU5EIFNUQVRVUyBSRUdJU1RFUiBNQVNLUyAqLwotCi0vKgotICogSGNDb250cm9sIChjb250cm9sKSByZWdpc3RlciBtYXNrcwotICovCi0jZGVmaW5lIE9IQ0lfQ1RSTF9DQlNSCSgzIDw8IDApCS8qIGNvbnRyb2wvYnVsayBzZXJ2aWNlIHJhdGlvICovCi0jZGVmaW5lIE9IQ0lfQ1RSTF9QTEUJKDEgPDwgMikJLyogcGVyaW9kaWMgbGlzdCBlbmFibGUgKi8KLSNkZWZpbmUgT0hDSV9DVFJMX0lFCSgxIDw8IDMpCS8qIGlzb2Nocm9ub3VzIGVuYWJsZSAqLwotI2RlZmluZSBPSENJX0NUUkxfQ0xFCSgxIDw8IDQpCS8qIGNvbnRyb2wgbGlzdCBlbmFibGUgKi8KLSNkZWZpbmUgT0hDSV9DVFJMX0JMRQkoMSA8PCA1KQkvKiBidWxrIGxpc3QgZW5hYmxlICovCi0jZGVmaW5lIE9IQ0lfQ1RSTF9IQ0ZTCSgzIDw8IDYpCS8qIGhvc3QgY29udHJvbGxlciBmdW5jdGlvbmFsIHN0YXRlICovCi0jZGVmaW5lIE9IQ0lfQ1RSTF9JUgkoMSA8PCA4KQkvKiBpbnRlcnJ1cHQgcm91dGluZyAqLwotI2RlZmluZSBPSENJX0NUUkxfUldDCSgxIDw8IDkpCS8qIHJlbW90ZSB3YWtldXAgY29ubmVjdGVkICovCi0jZGVmaW5lIE9IQ0lfQ1RSTF9SV0UJKDEgPDwgMTApCS8qIHJlbW90ZSB3YWtldXAgZW5hYmxlICovCi0KLS8qIHByZS1zaGlmdGVkIHZhbHVlcyBmb3IgSENGUyAqLwotIwlkZWZpbmUgT0hDSV9VU0JfUkVTRVQJKDAgPDwgNikKLSMJZGVmaW5lIE9IQ0lfVVNCX1JFU1VNRQkoMSA8PCA2KQotIwlkZWZpbmUgT0hDSV9VU0JfT1BFUgkoMiA8PCA2KQotIwlkZWZpbmUgT0hDSV9VU0JfU1VTUEVORCAoMyA8PCA2KQotCi0vKgotICogSGNDb21tYW5kU3RhdHVzIChjbWRzdGF0dXMpIHJlZ2lzdGVyIG1hc2tzCi0gKi8KLSNkZWZpbmUgT0hDSV9IQ1IJKDEgPDwgMCkJLyogaG9zdCBjb250cm9sbGVyIHJlc2V0ICovCi0jZGVmaW5lIE9IQ0lfQ0xGCSgxIDw8IDEpCS8qIGNvbnRyb2wgbGlzdCBmaWxsZWQgKi8KLSNkZWZpbmUgT0hDSV9CTEYJKDEgPDwgMikJLyogYnVsayBsaXN0IGZpbGxlZCAqLwotI2RlZmluZSBPSENJX09DUgkoMSA8PCAzKQkvKiBvd25lcnNoaXAgY2hhbmdlIHJlcXVlc3QgKi8KLSNkZWZpbmUgT0hDSV9TT0MJKDMgPDwgMTYpCS8qIHNjaGVkdWxpbmcgb3ZlcnJ1biBjb3VudCAqLwotCi0vKgotICogbWFza3MgdXNlZCB3aXRoIGludGVycnVwdCByZWdpc3RlcnM6Ci0gKiBIY0ludGVycnVwdFN0YXR1cyAoaW50cnN0YXR1cykKLSAqIEhjSW50ZXJydXB0RW5hYmxlIChpbnRyZW5hYmxlKQotICogSGNJbnRlcnJ1cHREaXNhYmxlIChpbnRyZGlzYWJsZSkKLSAqLwotI2RlZmluZSBPSENJX0lOVFJfU08JKDEgPDwgMCkJLyogc2NoZWR1bGluZyBvdmVycnVuICovCi0jZGVmaW5lIE9IQ0lfSU5UUl9XREgJKDEgPDwgMSkJLyogd3JpdGViYWNrIG9mIGRvbmVfaGVhZCAqLwotI2RlZmluZSBPSENJX0lOVFJfU0YJKDEgPDwgMikJLyogc3RhcnQgZnJhbWUgKi8KLSNkZWZpbmUgT0hDSV9JTlRSX1JECSgxIDw8IDMpCS8qIHJlc3VtZSBkZXRlY3QgKi8KLSNkZWZpbmUgT0hDSV9JTlRSX1VFCSgxIDw8IDQpCS8qIHVucmVjb3ZlcmFibGUgZXJyb3IgKi8KLSNkZWZpbmUgT0hDSV9JTlRSX0ZOTwkoMSA8PCA1KQkvKiBmcmFtZSBudW1iZXIgb3ZlcmZsb3cgKi8KLSNkZWZpbmUgT0hDSV9JTlRSX1JIU0MJKDEgPDwgNikJLyogcm9vdCBodWIgc3RhdHVzIGNoYW5nZSAqLwotI2RlZmluZSBPSENJX0lOVFJfT0MJKDEgPDwgMzApCS8qIG93bmVyc2hpcCBjaGFuZ2UgKi8KLSNkZWZpbmUgT0hDSV9JTlRSX01JRQkoMSA8PCAzMSkJLyogbWFzdGVyIGludGVycnVwdCBlbmFibGUgKi8KLQotCi0vKiBWaXJ0dWFsIFJvb3QgSFVCICovCi1zdHJ1Y3QgdmlydF9yb290X2h1YiB7Ci0JaW50IGRldm51bTsgLyogQWRkcmVzcyBvZiBSb290IEh1YiBlbmRwb2ludCAqLwotCXZvaWQgKmRldjsgIC8qIHdhcyB1cmIgKi8KLQl2b2lkICppbnRfYWRkcjsKLQlpbnQgc2VuZDsKLQlpbnQgaW50ZXJ2YWw7Ci19OwotCi0vKiBVU0IgSFVCIENPTlNUQU5UUyAobm90IE9IQ0ktc3BlY2lmaWM7IHNlZSBodWIuaCkgKi8KLQotLyogZGVzdGluYXRpb24gb2YgcmVxdWVzdCAqLwotI2RlZmluZSBSSF9JTlRFUkZBQ0UJCSAgIDB4MDEKLSNkZWZpbmUgUkhfRU5EUE9JTlQJCSAgIDB4MDIKLSNkZWZpbmUgUkhfT1RIRVIJCSAgIDB4MDMKLQotI2RlZmluZSBSSF9DTEFTUwkJICAgMHgyMAotI2RlZmluZSBSSF9WRU5ET1IJCSAgIDB4NDAKLQotLyogUmVxdWVzdHM6IGJSZXF1ZXN0IDw8IDggfCBibVJlcXVlc3RUeXBlICovCi0jZGVmaW5lIFJIX0dFVF9TVEFUVVMJCTB4MDA4MAotI2RlZmluZSBSSF9DTEVBUl9GRUFUVVJFCTB4MDEwMAotI2RlZmluZSBSSF9TRVRfRkVBVFVSRQkJMHgwMzAwCi0jZGVmaW5lIFJIX1NFVF9BRERSRVNTCQkweDA1MDAKLSNkZWZpbmUgUkhfR0VUX0RFU0NSSVBUT1IJMHgwNjgwCi0jZGVmaW5lIFJIX1NFVF9ERVNDUklQVE9SCTB4MDcwMAotI2RlZmluZSBSSF9HRVRfQ09ORklHVVJBVElPTgkweDA4ODAKLSNkZWZpbmUgUkhfU0VUX0NPTkZJR1VSQVRJT04JMHgwOTAwCi0jZGVmaW5lIFJIX0dFVF9TVEFURQkJMHgwMjgwCi0jZGVmaW5lIFJIX0dFVF9JTlRFUkZBQ0UJMHgwQTgwCi0jZGVmaW5lIFJIX1NFVF9JTlRFUkZBQ0UJMHgwQjAwCi0jZGVmaW5lIFJIX1NZTkNfRlJBTUUJCTB4MEM4MAotLyogT3VyIFZlbmRvciBTcGVjaWZpYyBSZXF1ZXN0ICovCi0jZGVmaW5lIFJIX1NFVF9FUAkJMHgyMDAwCi0KLQotLyogSHViIHBvcnQgZmVhdHVyZXMgKi8KLSNkZWZpbmUgUkhfUE9SVF9DT05ORUNUSU9OCSAgIDB4MDAKLSNkZWZpbmUgUkhfUE9SVF9FTkFCTEUJCSAgIDB4MDEKLSNkZWZpbmUgUkhfUE9SVF9TVVNQRU5ECQkgICAweDAyCi0jZGVmaW5lIFJIX1BPUlRfT1ZFUl9DVVJSRU5UCSAgIDB4MDMKLSNkZWZpbmUgUkhfUE9SVF9SRVNFVAkJICAgMHgwNAotI2RlZmluZSBSSF9QT1JUX1BPV0VSCQkgICAweDA4Ci0jZGVmaW5lIFJIX1BPUlRfTE9XX1NQRUVECSAgIDB4MDkKLQotI2RlZmluZSBSSF9DX1BPUlRfQ09OTkVDVElPTgkgICAweDEwCi0jZGVmaW5lIFJIX0NfUE9SVF9FTkFCTEUJICAgMHgxMQotI2RlZmluZSBSSF9DX1BPUlRfU1VTUEVORAkgICAweDEyCi0jZGVmaW5lIFJIX0NfUE9SVF9PVkVSX0NVUlJFTlQJICAgMHgxMwotI2RlZmluZSBSSF9DX1BPUlRfUkVTRVQJCSAgIDB4MTQKLQotLyogSHViIGZlYXR1cmVzICovCi0jZGVmaW5lIFJIX0NfSFVCX0xPQ0FMX1BPV0VSCSAgIDB4MDAKLSNkZWZpbmUgUkhfQ19IVUJfT1ZFUl9DVVJSRU5UCSAgIDB4MDEKLQotI2RlZmluZSBSSF9ERVZJQ0VfUkVNT1RFX1dBS0VVUAkgICAweDAwCi0jZGVmaW5lIFJIX0VORFBPSU5UX1NUQUxMCSAgIDB4MDEKLQotI2RlZmluZSBSSF9BQ0sJCQkgICAweDAxCi0jZGVmaW5lIFJIX1JFUV9FUlIJCSAgIC0xCi0jZGVmaW5lIFJIX05BQ0sJCQkgICAweDAwCi0KLQotLyogT0hDSSBST09UIEhVQiBSRUdJU1RFUiBNQVNLUyAqLwotCi0vKiByb290aHViLnBvcnRzdGF0dXMgW2ldIGJpdHMgKi8KLSNkZWZpbmUgUkhfUFNfQ0NTCSAgICAgMHgwMDAwMDAwMQkJLyogY3VycmVudCBjb25uZWN0IHN0YXR1cyAqLwotI2RlZmluZSBSSF9QU19QRVMJICAgICAweDAwMDAwMDAyCQkvKiBwb3J0IGVuYWJsZSBzdGF0dXMqLwotI2RlZmluZSBSSF9QU19QU1MJICAgICAweDAwMDAwMDA0CQkvKiBwb3J0IHN1c3BlbmQgc3RhdHVzICovCi0jZGVmaW5lIFJIX1BTX1BPQ0kJICAgICAweDAwMDAwMDA4CQkvKiBwb3J0IG92ZXIgY3VycmVudCBpbmRpY2F0b3IgKi8KLSNkZWZpbmUgUkhfUFNfUFJTCSAgICAgMHgwMDAwMDAxMAkJLyogcG9ydCByZXNldCBzdGF0dXMgKi8KLSNkZWZpbmUgUkhfUFNfUFBTCSAgICAgMHgwMDAwMDEwMAkJLyogcG9ydCBwb3dlciBzdGF0dXMgKi8KLSNkZWZpbmUgUkhfUFNfTFNEQQkgICAgIDB4MDAwMDAyMDAJCS8qIGxvdyBzcGVlZCBkZXZpY2UgYXR0YWNoZWQgKi8KLSNkZWZpbmUgUkhfUFNfQ1NDCSAgICAgMHgwMDAxMDAwMAkJLyogY29ubmVjdCBzdGF0dXMgY2hhbmdlICovCi0jZGVmaW5lIFJIX1BTX1BFU0MJICAgICAweDAwMDIwMDAwCQkvKiBwb3J0IGVuYWJsZSBzdGF0dXMgY2hhbmdlICovCi0jZGVmaW5lIFJIX1BTX1BTU0MJICAgICAweDAwMDQwMDAwCQkvKiBwb3J0IHN1c3BlbmQgc3RhdHVzIGNoYW5nZSAqLwotI2RlZmluZSBSSF9QU19PQ0lDCSAgICAgMHgwMDA4MDAwMAkJLyogb3ZlciBjdXJyZW50IGluZGljYXRvciBjaGFuZ2UgKi8KLSNkZWZpbmUgUkhfUFNfUFJTQwkgICAgIDB4MDAxMDAwMDAJCS8qIHBvcnQgcmVzZXQgc3RhdHVzIGNoYW5nZSAqLwotCi0vKiByb290aHViLnN0YXR1cyBiaXRzICovCi0jZGVmaW5lIFJIX0hTX0xQUwkgICAgIDB4MDAwMDAwMDEJCS8qIGxvY2FsIHBvd2VyIHN0YXR1cyAqLwotI2RlZmluZSBSSF9IU19PQ0kJICAgICAweDAwMDAwMDAyCQkvKiBvdmVyIGN1cnJlbnQgaW5kaWNhdG9yICovCi0jZGVmaW5lIFJIX0hTX0RSV0UJICAgICAweDAwMDA4MDAwCQkvKiBkZXZpY2UgcmVtb3RlIHdha2V1cCBlbmFibGUgKi8KLSNkZWZpbmUgUkhfSFNfTFBTQwkgICAgIDB4MDAwMTAwMDAJCS8qIGxvY2FsIHBvd2VyIHN0YXR1cyBjaGFuZ2UgKi8KLSNkZWZpbmUgUkhfSFNfT0NJQwkgICAgIDB4MDAwMjAwMDAJCS8qIG92ZXIgY3VycmVudCBpbmRpY2F0b3IgY2hhbmdlICovCi0jZGVmaW5lIFJIX0hTX0NSV0UJICAgICAweDgwMDAwMDAwCQkvKiBjbGVhciByZW1vdGUgd2FrZXVwIGVuYWJsZSAqLwotCi0vKiByb290aHViLmIgbWFza3MgKi8KLSNkZWZpbmUgUkhfQl9EUgkJMHgwMDAwZmZmZgkJLyogZGV2aWNlIHJlbW92YWJsZSBmbGFncyAqLwotI2RlZmluZSBSSF9CX1BQQ00JMHhmZmZmMDAwMAkJLyogcG9ydCBwb3dlciBjb250cm9sIG1hc2sgKi8KLQotLyogcm9vdGh1Yi5hIG1hc2tzICovCi0jZGVmaW5lIFJIX0FfTkRQCSgweGZmIDw8IDApCQkvKiBudW1iZXIgb2YgZG93bnN0cmVhbSBwb3J0cyAqLwotI2RlZmluZSBSSF9BX1BTTQkoMSA8PCA4KQkJLyogcG93ZXIgc3dpdGNoaW5nIG1vZGUgKi8KLSNkZWZpbmUgUkhfQV9OUFMJKDEgPDwgOSkJCS8qIG5vIHBvd2VyIHN3aXRjaGluZyAqLwotI2RlZmluZSBSSF9BX0RUCQkoMSA8PCAxMCkJCS8qIGRldmljZSB0eXBlIChtYnopICovCi0jZGVmaW5lIFJIX0FfT0NQTQkoMSA8PCAxMSkJCS8qIG92ZXIgY3VycmVudCBwcm90ZWN0aW9uIG1vZGUgKi8KLSNkZWZpbmUgUkhfQV9OT0NQCSgxIDw8IDEyKQkJLyogbm8gb3ZlciBjdXJyZW50IHByb3RlY3Rpb24gKi8KLSNkZWZpbmUgUkhfQV9QT1RQR1QJKDB4ZmYgPDwgMjQpCQkvKiBwb3dlciBvbiB0byBwb3dlciBnb29kIHRpbWUgKi8KLQotLyogdXJiICovCi0jZGVmaW5lIE5fVVJCX1REIDQ4Ci10eXBlZGVmIHN0cnVjdAotewotCWVkX3QgKmVkOwotCV9fdTE2IGxlbmd0aDsJLyogbnVtYmVyIG9mIHRkcyBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXF1ZXN0ICovCi0JX191MTYgdGRfY250OwkvKiBudW1iZXIgb2YgdGRzIGFscmVhZHkgc2VydmljZWQgKi8KLQlpbnQgICBzdGF0ZTsKLQl1bnNpZ25lZCBsb25nIHBpcGU7Ci0JaW50IGFjdHVhbF9sZW5ndGg7Ci0JdGRfdCAqdGRbTl9VUkJfVERdOwkvKiBsaXN0IHBvaW50ZXIgdG8gYWxsIGNvcnJlc3BvbmRpbmcgVERzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QgKi8KLX0gdXJiX3ByaXZfdDsKLSNkZWZpbmUgVVJCX0RFTCAxCi0KLS8qCi0gKiBUaGlzIGlzIHRoZSBmdWxsIG9oY2kgY29udHJvbGxlciBkZXNjcmlwdGlvbgotICoKLSAqIE5vdGUgaG93IHRoZSAicHJvcGVyIiBVU0IgaW5mb3JtYXRpb24gaXMganVzdAotICogYSBzdWJzZXQgb2Ygd2hhdCB0aGUgZnVsbCBpbXBsZW1lbnRhdGlvbiBuZWVkcy4gKExpbnVzKQotICovCi0KLQotdHlwZWRlZiBzdHJ1Y3Qgb2hjaSB7Ci0Jc3RydWN0IG9oY2lfaGNjYSAqaGNjYTsJCS8qIGhjY2EgKi8KLQkvKmRtYV9hZGRyX3QgaGNjYV9kbWE7Ki8KLQotCWludCBpcnE7Ci0JaW50IGRpc2FibGVkOwkJCS8qIGUuZy4gZ290IGEgVUUsIHdlJ3JlIGh1bmcgKi8KLQlpbnQgc2xlZXBpbmc7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsJCS8qIGZvciBIQyBidWdzICovCi0KLQlzdHJ1Y3Qgb2hjaV9yZWdzICpyZWdzOyAvKiBPSENJIGNvbnRyb2xsZXIncyBtZW1vcnkgKi8KLQotCWVkX3QgKmVkX3JtX2xpc3RbMl07CSAvKiBsaXN0cyBvZiBhbGwgZW5kcG9pbnRzIHRvIGJlIHJlbW92ZWQgKi8KLQllZF90ICplZF9idWxrdGFpbDsJIC8qIGxhc3QgZW5kcG9pbnQgb2YgYnVsayBsaXN0ICovCi0JZWRfdCAqZWRfY29udHJvbHRhaWw7CSAvKiBsYXN0IGVuZHBvaW50IG9mIGNvbnRyb2wgbGlzdCAqLwotCWludCBpbnRyc3RhdHVzOwotCV9fdTMyIGhjX2NvbnRyb2w7CQkvKiBjb3B5IG9mIHRoZSBoYyBjb250cm9sIHJlZyAqLwotCXN0cnVjdCB1c2JfZGV2aWNlICpkZXZbMzJdOwotCXN0cnVjdCB2aXJ0X3Jvb3RfaHViIHJoOwotCi0JY29uc3QgY2hhcgkqc2xvdF9uYW1lOwotfSBvaGNpX3Q7Ci0KLSNkZWZpbmUgTlVNX0VEUyA4CQkvKiBudW0gb2YgcHJlYWxsb2NhdGVkIGVuZHBvaW50IGRlc2NyaXB0b3JzICovCi0KLXN0cnVjdCBvaGNpX2RldmljZSB7Ci0JZWRfdAllZFtOVU1fRURTXTsKLQlpbnQgZWRfY250OwotfTsKLQotLyogaGNkICovCi0vKiBlbmRwb2ludCAqLwotc3RhdGljIGludCBlcF9saW5rKG9oY2lfdCAqIG9oY2ksIGVkX3QgKiBlZCk7Ci1zdGF0aWMgaW50IGVwX3VubGluayhvaGNpX3QgKiBvaGNpLCBlZF90ICogZWQpOwotc3RhdGljIGVkX3QgKiBlcF9hZGRfZWQoc3RydWN0IHVzYl9kZXZpY2UgKiB1c2JfZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiB3ZSBuZWVkIG1vcmUgVERzIHRoYW4gRURzICovCi0jZGVmaW5lIE5VTV9URCA2NAotCi0vKiArMSBzbyB3ZSBjYW4gYWxpZ24gdGhlIHN0b3JhZ2UgKi8KLXRkX3QgZ3RkW05VTV9URCsxXTsKLS8qIHBvaW50ZXJzIHRvIGFsaWduZWQgc3RvcmFnZSAqLwotdGRfdCAqcHRkOwotCi0vKiBURHMgLi4uICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB0ZCAqCi10ZF9hbGxvYyAoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IHRkCSp0ZDsKLQotCXRkID0gTlVMTDsKLQlmb3IgKGkgPSAwOyBpIDwgTlVNX1REOyBpKyspCi0JewotCQlpZiAocHRkW2ldLnVzYl9kZXYgPT0gTlVMTCkKLQkJewotCQkJdGQgPSAmcHRkW2ldOwotCQkJdGQtPnVzYl9kZXYgPSB1c2JfZGV2OwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gdGQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotZWRfZnJlZSAoc3RydWN0IGVkICplZCkKLXsKLQllZC0+dXNiX2RldiA9IE5VTEw7Ci19CmRpZmYgLS1naXQgYS9jcHUvYXJtOTIwdC9zM2MyNHgwL01ha2VmaWxlIGIvY3B1L2FybTkyMHQvczNjMjR4MC9NYWtlZmlsZQppbmRleCAzYTdjNGIzLi4wZmYzNmM1IDEwMDY0NAotLS0gYS9jcHUvYXJtOTIwdC9zM2MyNHgwL01ha2VmaWxlCisrKyBiL2NwdS9hcm05MjB0L3MzYzI0eDAvTWFrZWZpbGUKQEAgLTI2LDcgKzI2LDcgQEAKIExJQgk9ICQob2JqKWxpYiQoU09DKS5hCiAKIENPQkpTCT0gaTJjLm8gaW50ZXJydXB0cy5vIHNlcmlhbC5vIHNwZWVkLm8gXAotCSAgdXNiX29oY2kubworCSAgdXNiLm8KIAogU1JDUwk6PSAkKFNPQkpTOi5vPS5TKSAkKENPQkpTOi5vPS5jKQogT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTT0JKUykgJChDT0JKUykpCmRpZmYgLS1naXQgYS9jcHUvYXJtOTIwdC9zM2MyNHgwL3VzYi5jIGIvY3B1L2FybTkyMHQvczNjMjR4MC91c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjVkNWJmCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L2FybTkyMHQvczNjMjR4MC91c2IuYwpAQCAtMCwwICsxLDcyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA2CisgKiBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nIDxta0BkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmIGRlZmluZWQoQ09ORklHX1VTQl9PSENJX05FVykgJiYgZGVmaW5lZChDRkdfVVNCX09IQ0lfQ1BVX0lOSVQpCisjIGlmIGRlZmluZWQoQ09ORklHX1MzQzI0MDApIHx8IGRlZmluZWQoQ09ORklHX1MzQzI0MTApCisKKyNpZiBkZWZpbmVkKENPTkZJR19TM0MyNDAwKQorIyBpbmNsdWRlIDxzM2MyNDAwLmg+CisjZWxpZiBkZWZpbmVkKENPTkZJR19TM0MyNDEwKQorIyBpbmNsdWRlIDxzM2MyNDEwLmg+CisjZW5kaWYKKworaW50IHVzYl9jcHVfaW5pdCAodm9pZCkKK3sKKworCVMzQzI0WDBfQ0xPQ0tfUE9XRVIgKiBjb25zdCBjbGtfcG93ZXIgPSBTM0MyNFgwX0dldEJhc2VfQ0xPQ0tfUE9XRVIoKTsKKwlTM0MyNFgwX0dQSU8gKiBjb25zdCBncGlvID0gUzNDMjRYMF9HZXRCYXNlX0dQSU8oKTsKKworCS8qCisJICogU2V0IHRoZSA0OCBNSHogVVBMTCBjbG9ja2luZy4gVmFsdWVzIGFyZSB0YWtlbiBmcm9tCisJICogIlBMTCB2YWx1ZSBzZWxlY3Rpb24gZ3VpZGUiLCA2LTIzLCBzM2MyNDAwX1VNLnBkZi4KKwkgKi8KKwljbGtfcG93ZXItPlVQTExDT04gPSAoKDQwIDw8IDEyKSArICgxIDw8IDQpICsgMik7CisJZ3Bpby0+TUlTQ0NSIHw9IDB4ODsgLyogMSA9IHVzZSBwYWRzIHJlbGF0ZWQgVVNCIGZvciBVU0IgaG9zdCAqLworCisJLyoKKwkgKiBFbmFibGUgVVNCIGhvc3QgY2xvY2suCisJICovCisJY2xrX3Bvd2VyLT5DTEtDT04gfD0gKDEgPDwgNCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYl9jcHVfc3RvcCAodm9pZCkKK3sKKwlTM0MyNFgwX0NMT0NLX1BPV0VSICogY29uc3QgY2xrX3Bvd2VyID0gUzNDMjRYMF9HZXRCYXNlX0NMT0NLX1BPV0VSKCk7CisJLyogbWF5IG5vdCB3YW50IHRvIGRvIHRoaXMgKi8KKwljbGtfcG93ZXItPkNMS0NPTiAmPSB+KDEgPDwgNCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JfY3B1X2luaXRfZmFpbCAodm9pZCkKK3sKKwlTM0MyNFgwX0NMT0NLX1BPV0VSICogY29uc3QgY2xrX3Bvd2VyID0gUzNDMjRYMF9HZXRCYXNlX0NMT0NLX1BPV0VSKCk7CisJY2xrX3Bvd2VyLT5DTEtDT04gJj0gfigxIDw8IDQpOworCXJldHVybiAwOworfQorCisjIGVuZGlmIC8qIGRlZmluZWQoQ09ORklHX1MzQzI0MDApIHx8IGRlZmluZWQoQ09ORklHX1MzQzI0MTApICovCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfVVNCX09IQ0kpICYmIGRlZmluZWQoQ0ZHX1VTQl9PSENJX0NQVV9JTklUKSAqLwpkaWZmIC0tZ2l0IGEvY3B1L2FybTkyNmVqcy9kYXZpbmNpL01ha2VmaWxlIGIvY3B1L2FybTkyNmVqcy9kYXZpbmNpL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNzdmNDAKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvYXJtOTI2ZWpzL2RhdmluY2kvTWFrZWZpbGUKQEAgLTAsMCArMSw0OSBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAtMjAwNgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKFNPQykuYQorCitDT0JKUwk9IHRpbWVyLm8gZXRoZXIubyBseHQ5NzIubyBkcDgzODQ4Lm8gaTJjLm8gbmFuZC5vCitTT0JKUwk9IGxvd2xldmVsX2luaXQubyByZXNldC5vCisKK1NSQ1MJOj0gJChTVEFSVDoubz0uUykgJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKK09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpICQoU09CSlMpKQorU1RBUlQJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU1RBUlQpKQorCithbGw6CSQob2JqKS5kZXBlbmQgJChMSUIpCisKKyQoTElCKToJJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvY3B1L2FybTkyNmVqcy9kYXZpbmNpL2RwODM4NDguYyBiL2NwdS9hcm05MjZlanMvZGF2aW5jaS9kcDgzODQ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcxOTg0NQotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9hcm05MjZlanMvZGF2aW5jaS9kcDgzODQ4LmMKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBOYXRpb25hbCBTZW1pY29uZHVjdG9yIERQODM4NDggUEhZIERyaXZlciBmb3IgVEkgRGFWaW5jaQorICogKFRNUzMyMERNNjQ0eCkgYmFzZWQgYm9hcmRzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxuZXQuaD4KKyNpbmNsdWRlIDxkcDgzODQ4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvZW1hY19kZWZzLmg+CisKKyNpZmRlZiBDT05GSUdfRFJJVkVSX1RJX0VNQUMKKworI2lmZGVmIENPTkZJR19DTURfTkVUCisKK2ludCBkcDgzODQ4X2lzX3BoeV9jb25uZWN0ZWQoaW50IHBoeV9hZGRyKQoreworCXVfaW50MTZfdAlpZDEsIGlkMjsKKworCWlmICghZG02NDR4X2V0aF9waHlfcmVhZChwaHlfYWRkciwgRFA4Mzg0OF9QSFlJRDFfUkVHLCAmaWQxKSkKKwkJcmV0dXJuKDApOworCWlmICghZG02NDR4X2V0aF9waHlfcmVhZChwaHlfYWRkciwgRFA4Mzg0OF9QSFlJRDJfUkVHLCAmaWQyKSkKKwkJcmV0dXJuKDApOworCisJaWYgKChpZDEgPT0gRFA4Mzg0OF9QSFlJRDFfT1VJKSAmJiAoaWQyID09IERQODM4NDhfUEhZSUQyX09VSSkpCisJCXJldHVybigxKTsKKworCXJldHVybigwKTsKK30KKworaW50IGRwODM4NDhfZ2V0X2xpbmtfc3BlZWQoaW50IHBoeV9hZGRyKQoreworCXVfaW50MTZfdAkJdG1wOworCXZvbGF0aWxlIGVtYWNfcmVncyoJZW1hYyA9IChlbWFjX3JlZ3MgKilFTUFDX0JBU0VfQUREUjsKKworCWlmICghZG02NDR4X2V0aF9waHlfcmVhZChwaHlfYWRkciwgRFA4Mzg0OF9TVEFUX1JFRywgJnRtcCkpCisJCXJldHVybigwKTsKKworCWlmICghKHRtcCAmIERQODM4NDhfTElOS19TVEFUVVMpKQkvKiBsaW5rIHVwPyAqLworCQlyZXR1cm4oMCk7CisKKwlpZiAoIWRtNjQ0eF9ldGhfcGh5X3JlYWQocGh5X2FkZHIsIERQODM4NDhfUEhZX1NUQVRfUkVHLCAmdG1wKSkKKwkJcmV0dXJuKDApOworCisJLyogU3BlZWQgZG9lc24ndCBtYXR0ZXIsIHRoZXJlIGlzIG5vIHNldHRpbmcgZm9yIGl0IGluIEVNQUMuLi4gKi8KKwlpZiAodG1wICYgRFA4Mzg0OF9TUEVFRCkgeworCQlpZiAodG1wICYgRFA4Mzg0OF9EVVBMRVgpIHsKKwkJCS8qIHNldCBETTY0NHggRU1BQyBmb3IgRnVsbCBEdXBsZXggICovCisJCQllbWFjLT5NQUNDT05UUk9MID0gRU1BQ19NQUNDT05UUk9MX01JSUVOX0VOQUJMRSB8IEVNQUNfTUFDQ09OVFJPTF9GVUxMRFVQTEVYX0VOQUJMRTsKKwkJfSBlbHNlIHsKKwkJCS8qc2V0IERNNjQ0eCBFTUFDIGZvciBIYWxmIER1cGxleCAgKi8KKwkJCWVtYWMtPk1BQ0NPTlRST0wgPSBFTUFDX01BQ0NPTlRST0xfTUlJRU5fRU5BQkxFOworCQl9CisKKwkJcmV0dXJuKDEpOworCX0gZWxzZSB7CisJCWlmICh0bXAgJiBEUDgzODQ4X0RVUExFWCkgeworCQkJLyogc2V0IERNNjQ0eCBFTUFDIGZvciBGdWxsIER1cGxleCAgKi8KKwkJCWVtYWMtPk1BQ0NPTlRST0wgPSBFTUFDX01BQ0NPTlRST0xfTUlJRU5fRU5BQkxFIHwgRU1BQ19NQUNDT05UUk9MX0ZVTExEVVBMRVhfRU5BQkxFOworCQl9IGVsc2UgeworCQkJLypzZXQgRE02NDR4IEVNQUMgZm9yIEhhbGYgRHVwbGV4ICAqLworCQkJZW1hYy0+TUFDQ09OVFJPTCA9IEVNQUNfTUFDQ09OVFJPTF9NSUlFTl9FTkFCTEU7CisJCX0KKworCQlyZXR1cm4oMSk7CisJfQorCisJcmV0dXJuKDApOworfQorCisKK2ludCBkcDgzODQ4X2luaXRfcGh5KGludCBwaHlfYWRkcikKK3sKKwlpbnQJcmV0ID0gMTsKKworCWlmICghZHA4Mzg0OF9nZXRfbGlua19zcGVlZChwaHlfYWRkcikpIHsKKwkJLyogVHJ5IGFub3RoZXIgdGltZSAqLworCQl1ZGVsYXkoMTAwMDAwKTsKKwkJcmV0ID0gZHA4Mzg0OF9nZXRfbGlua19zcGVlZChwaHlfYWRkcik7CisJfQorCisJLyogRGlzYWJsZSBQSFkgSW50ZXJydXB0cyAqLworCWRtNjQ0eF9ldGhfcGh5X3dyaXRlKHBoeV9hZGRyLCBEUDgzODQ4X1BIWV9JTlRSX0NUUkxfUkVHLCAwKTsKKworCXJldHVybihyZXQpOworfQorCisKK2ludCBkcDgzODQ4X2F1dG9fbmVnb3RpYXRlKGludCBwaHlfYWRkcikKK3sKKwl1X2ludDE2X3QJdG1wOworCisKKwlpZiAoIWRtNjQ0eF9ldGhfcGh5X3JlYWQocGh5X2FkZHIsIERQODM4NDhfQ1RMX1JFRywgJnRtcCkpCisJCXJldHVybigwKTsKKworCS8qIFJlc3RhcnQgQXV0b19uZWdvdGlhdGlvbiAgKi8KKwl0bXAgJj0gfkRQODM4NDhfQVVUT05FRzsJLyogcmVtb3ZlIGF1dG9uZWdvdGlhdGlvbiBlbmFibGUgKi8KKwl0bXAgfD0gRFA4Mzg0OF9JU09MQVRFOwkJLyogRWxlY3RyaWNhbGx5IGlzb2xhdGUgUEhZICovCisJZG02NDR4X2V0aF9waHlfd3JpdGUocGh5X2FkZHIsIERQODM4NDhfQ1RMX1JFRywgdG1wKTsKKworCS8qIFNldCB0aGUgQXV0b19uZWdvdGlhdGlvbiBBZHZlcnRpc2VtZW50IFJlZ2lzdGVyCisJICogTUlJIGFkdmVydGlzaW5nIGZvciBOZXh0IHBhZ2UsIDEwMEJhc2VUeEZEIGFuZCBIRCwKKwkgKiAxMEJhc2VURkQgYW5kIEhELCBJRUVFIDgwMi4zCisJICovCisJdG1wID0gRFA4Mzg0OF9OUCB8IERQODM4NDhfVFhfRkRYIHwgRFA4Mzg0OF9UWF9IRFggfAorCSAJRFA4Mzg0OF8xMF9GRFggfCBEUDgzODQ4XzEwX0hEWCB8IERQODM4NDhfQU5fSUVFRV84MDJfMzsKKwlkbTY0NHhfZXRoX3BoeV93cml0ZShwaHlfYWRkciwgRFA4Mzg0OF9BTkFfUkVHLCB0bXApOworCisKKwkvKiBSZWFkIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwlpZiAoIWRtNjQ0eF9ldGhfcGh5X3JlYWQocGh5X2FkZHIsIERQODM4NDhfQ1RMX1JFRywgJnRtcCkpCisJCXJldHVybigwKTsKKworCXRtcCB8PSBEUDgzODQ4X1NQRUVEX1NFTEVDVCB8IERQODM4NDhfQVVUT05FRyB8IERQODM4NDhfRFVQTEVYX01PREU7CisJZG02NDR4X2V0aF9waHlfd3JpdGUocGh5X2FkZHIsIERQODM4NDhfQ1RMX1JFRywgdG1wKTsKKworCS8qIFJlc3RhcnQgQXV0b19uZWdvdGlhdGlvbiAgKi8KKwl0bXAgfD0gRFA4Mzg0OF9SRVNUQVJUX0FVVE9ORUc7CisJZG02NDR4X2V0aF9waHlfd3JpdGUocGh5X2FkZHIsIERQODM4NDhfQ1RMX1JFRywgdG1wKTsKKworCS8qY2hlY2sgQXV0b05lZ290aWF0ZSBjb21wbGV0ZSAqLworCXVkZWxheSgxMDAwMCk7CisJaWYgKCFkbTY0NHhfZXRoX3BoeV9yZWFkKHBoeV9hZGRyLCBEUDgzODQ4X1NUQVRfUkVHLCAmdG1wKSkKKwkJcmV0dXJuKDApOworCisJaWYgKCEodG1wICYgRFA4Mzg0OF9BVVRPTkVHX0NPTVApKQorCQlyZXR1cm4oMCk7CisKKwlyZXR1cm4gKGRwODM4NDhfZ2V0X2xpbmtfc3BlZWQocGh5X2FkZHIpKTsKK30KKworI2VuZGlmCS8qIENPTkZJR19DTURfTkVUICovCisKKyNlbmRpZgkvKiBDT05GSUdfRFJJVkVSX0VUSEVSICovCmRpZmYgLS1naXQgYS9jcHUvYXJtOTI2ZWpzL2RhdmluY2kvZXRoZXIuYyBiL2NwdS9hcm05MjZlanMvZGF2aW5jaS9ldGhlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NmJjN2QKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvYXJtOTI2ZWpzL2RhdmluY2kvZXRoZXIuYwpAQCAtMCwwICsxLDY1MCBAQAorLyoKKyAqIEV0aGVybmV0IGRyaXZlciBmb3IgVEkgVE1TMzIwRE02NDR4IChEYVZpbmNpKSBjaGlwcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisgKgorICogUGFydHMgc2hhbWVsZXNzbHkgc3RvbGVuIGZyb20gVEkncyBkbTY0NHhfZW1hYy5jLiBPcmlnaW5hbCBjb3B5cmlnaHQKKyAqIGZvbGxvd3M6CisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIGRtNjQ0eF9lbWFjLmMKKyAqCisgKiBUSSBEYVZpbmNpIChETTY0NFgpIEVNQUMgcGVyaXBoZXJhbCBkcml2ZXIgc291cmNlIGZvciBEVi1FVk0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGV4YXMgSW5zdHJ1bWVudHMuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKiBNb2RpZmljYXRpb25zOgorICogdmVyLiAxLjA6IFNlcCAyMDA1LCBBbmFudCBHb2xlIC0gQ3JlYXRlZCBFTUFDIHZlcnNpb24gZm9yIHVCb290LgorICogdmVyICAxLjE6IE5vdiAyMDA1LCBBbmFudCBHb2xlIC0gRXh0ZW5kZWQgdGhlIFJYIGxvZ2ljIGZvciBtdWx0aXBsZSBkZXNjcmlwdG9ycworICoKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxuZXQuaD4KKyNpbmNsdWRlIDxtaWlwaHkuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9lbWFjX2RlZnMuaD4KKworI2lmZGVmIENPTkZJR19EUklWRVJfVElfRU1BQworCisjaWZkZWYgQ09ORklHX0NNRF9ORVQKKwordW5zaWduZWQgaW50CWVtYWNfZGJnID0gMDsKKyNkZWZpbmUgZGVidWdfZW1hYyhmbXQsYXJncy4uLikJaWYgKGVtYWNfZGJnKSBwcmludGYoZm10LCMjYXJncykKKworLyogSW50ZXJuYWwgc3RhdGljIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBkbTY0NHhfZXRoX2h3X2luaXQgKHZvaWQpOworc3RhdGljIGludCBkbTY0NHhfZXRoX29wZW4gKHZvaWQpOworc3RhdGljIGludCBkbTY0NHhfZXRoX2Nsb3NlICh2b2lkKTsKK3N0YXRpYyBpbnQgZG02NDR4X2V0aF9zZW5kX3BhY2tldCAodm9sYXRpbGUgdm9pZCAqcGFja2V0LCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyBpbnQgZG02NDR4X2V0aF9yY3ZfcGFja2V0ICh2b2lkKTsKK3N0YXRpYyB2b2lkIGRtNjQ0eF9ldGhfbWRpb19lbmFibGUodm9pZCk7CisKK3N0YXRpYyBpbnQgZ2VuX2luaXRfcGh5KGludCBwaHlfYWRkcik7CitzdGF0aWMgaW50IGdlbl9pc19waHlfY29ubmVjdGVkKGludCBwaHlfYWRkcik7CitzdGF0aWMgaW50IGdlbl9nZXRfbGlua19zcGVlZChpbnQgcGh5X2FkZHIpOworc3RhdGljIGludCBnZW5fYXV0b19uZWdvdGlhdGUoaW50IHBoeV9hZGRyKTsKKworLyogV3JhcHBlcnMgZXhwb3J0ZWQgdG8gdGhlIFUtQm9vdCBwcm9wZXIgKi8KK2ludCBldGhfaHdfaW5pdCh2b2lkKQoreworCXJldHVybihkbTY0NHhfZXRoX2h3X2luaXQoKSk7Cit9CisKK2ludCBldGhfaW5pdChiZF90ICogYmQpCit7CisJcmV0dXJuKGRtNjQ0eF9ldGhfb3BlbigpKTsKK30KKwordm9pZCBldGhfaGFsdCh2b2lkKQoreworCWRtNjQ0eF9ldGhfY2xvc2UoKTsKK30KKworaW50IGV0aF9zZW5kKHZvbGF0aWxlIHZvaWQgKnBhY2tldCwgaW50IGxlbmd0aCkKK3sKKwlyZXR1cm4oZG02NDR4X2V0aF9zZW5kX3BhY2tldChwYWNrZXQsIGxlbmd0aCkpOworfQorCitpbnQgZXRoX3J4KHZvaWQpCit7CisJcmV0dXJuKGRtNjQ0eF9ldGhfcmN2X3BhY2tldCgpKTsKK30KKwordm9pZCBldGhfbWRpb19lbmFibGUodm9pZCkKK3sKKwlkbTY0NHhfZXRoX21kaW9fZW5hYmxlKCk7Cit9CisvKiBFbmQgb2Ygd3JhcHBlcnMgKi8KKworCitzdGF0aWMgdV9pbnQ4X3QgZG02NDR4X2V0aF9tYWNfYWRkcltdID0geyAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmIH07CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBlbWFjX29wZW4oKSBpZiB5b3Ugd2FudCB0byBvdmVycmlkZQorICogdGhlIGRlZmF1bHQgbWFjIGFkZHJlc3MuCisgKi8KK3ZvaWQgZG02NDR4X2V0aF9zZXRfbWFjX2FkZHIoY29uc3QgdV9pbnQ4X3QgKmFkZHIpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChkbTY0NHhfZXRoX21hY19hZGRyKTsgaSsrKSB7CisJCWRtNjQ0eF9ldGhfbWFjX2FkZHJbaV0gPSBhZGRyW2ldOworCX0KK30KKworLyogRU1BQyBBZGRyZXNzZXMgKi8KK3N0YXRpYyB2b2xhdGlsZSBlbWFjX3JlZ3MJKmFkYXBfZW1hYyA9IChlbWFjX3JlZ3MgKilFTUFDX0JBU0VfQUREUjsKK3N0YXRpYyB2b2xhdGlsZSBld3JhcF9yZWdzCSphZGFwX2V3cmFwID0gKGV3cmFwX3JlZ3MgKilFTUFDX1dSQVBQRVJfQkFTRV9BRERSOworc3RhdGljIHZvbGF0aWxlIG1kaW9fcmVncwkqYWRhcF9tZGlvID0gKG1kaW9fcmVncyAqKUVNQUNfTURJT19CQVNFX0FERFI7CisKKy8qIEVNQUMgZGVzY3JpcHRvcnMgKi8KK3N0YXRpYyB2b2xhdGlsZSBlbWFjX2Rlc2MJKmVtYWNfcnhfZGVzYyA9IChlbWFjX2Rlc2MgKikoRU1BQ19XUkFQUEVSX1JBTV9BRERSICsgRU1BQ19SWF9ERVNDX0JBU0UpOworc3RhdGljIHZvbGF0aWxlIGVtYWNfZGVzYwkqZW1hY190eF9kZXNjID0gKGVtYWNfZGVzYyAqKShFTUFDX1dSQVBQRVJfUkFNX0FERFIgKyBFTUFDX1RYX0RFU0NfQkFTRSk7CitzdGF0aWMgdm9sYXRpbGUgZW1hY19kZXNjCSplbWFjX3J4X2FjdGl2ZV9oZWFkID0gMDsKK3N0YXRpYyB2b2xhdGlsZSBlbWFjX2Rlc2MJKmVtYWNfcnhfYWN0aXZlX3RhaWwgPSAwOworc3RhdGljIGludAkJCWVtYWNfcnhfcXVldWVfYWN0aXZlID0gMDsKKworLyogUmVjZWl2ZSBwYWNrZXQgYnVmZmVycyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIJCWVtYWNfcnhfYnVmZmVyc1tFTUFDX01BWF9SWF9CVUZGRVJTICogKEVNQUNfTUFYX0VUSEVSTkVUX1BLVF9TSVpFICsgRU1BQ19QS1RfQUxJR04pXTsKKworLyogUEhZIGFkZHJlc3MgZm9yIGEgZGlzY292ZXJlZCBQSFkgKDB4ZmYgLSBub3QgZm91bmQpICovCitzdGF0aWMgdm9sYXRpbGUgdV9pbnQ4X3QJYWN0aXZlX3BoeV9hZGRyID0gMHhmZjsKKworcGh5X3QJCQkJcGh5OworCitzdGF0aWMgdm9pZCBkbTY0NHhfZXRoX21kaW9fZW5hYmxlKHZvaWQpCit7CisJdV9pbnQzMl90CWNsa2RpdjsKKworCWNsa2RpdiA9IChFTUFDX01ESU9fQlVTX0ZSRVEgLyBFTUFDX01ESU9fQ0xPQ0tfRlJFUSkgLSAxOworCisJYWRhcF9tZGlvLT5DT05UUk9MID0gKGNsa2RpdiAmIDB4ZmYpIHwKKwkJTURJT19DT05UUk9MX0VOQUJMRSB8CisJCU1ESU9fQ09OVFJPTF9GQVVMVCB8CisJCU1ESU9fQ09OVFJPTF9GQVVMVF9FTkFCTEU7CisKKwl3aGlsZSAoYWRhcF9tZGlvLT5DT05UUk9MICYgTURJT19DT05UUk9MX0lETEUpIHs7fQorfQorCisvKgorICogVHJpZXMgdG8gZmluZCBhbiBhY3RpdmUgY29ubmVjdGVkIFBIWS4gUmV0dXJucyAxIGlmIGFkZHJlc3MgaWYgZm91bmQuCisgKiBJZiBubyBhY3RpdmUgUEhZIChvciBtb3JlIHRoYW4gb25lIFBIWSkgZm91bmQgcmV0dXJucyAwLgorICogU2V0cyBhY3RpdmVfcGh5X2FkZHIgdmFyaWFibGUuCisgKi8KK3N0YXRpYyBpbnQgZG02NDR4X2V0aF9waHlfZGV0ZWN0KHZvaWQpCit7CisJdV9pbnQzMl90CXBoeV9hY3Rfc3RhdGU7CisJaW50CQlpOworCisJYWN0aXZlX3BoeV9hZGRyID0gMHhmZjsKKworCWlmICgocGh5X2FjdF9zdGF0ZSA9IGFkYXBfbWRpby0+QUxJVkUpID09IDApCisJCXJldHVybigwKTsJCQkJLyogTm8gYWN0aXZlIFBIWXMgKi8KKworCWRlYnVnX2VtYWMoImRtNjQ0eF9ldGhfcGh5X2RldGVjdCgpLCBBTElWRSA9IDB4JTA4eFxuIiwgcGh5X2FjdF9zdGF0ZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQlpZiAocGh5X2FjdF9zdGF0ZSAmICgxIDw8IGkpKSB7CisJCQlpZiAocGh5X2FjdF9zdGF0ZSAmIH4oMSA8PCBpKSkKKwkJCQlyZXR1cm4oMCk7CQkvKiBNb3JlIHRoYW4gb25lIFBIWSAqLworCQkJZWxzZSB7CisJCQkJYWN0aXZlX3BoeV9hZGRyID0gaTsKKwkJCQlyZXR1cm4oMSk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4oMCk7CS8qIEp1c3QgdG8gbWFrZSBHQ0MgaGFwcHkgKi8KK30KKworCisvKiBSZWFkIGEgUEhZIHJlZ2lzdGVyIHZpYSBNRElPIGludGVmYWNlLiBSZXR1cm5zIDEgb24gc3VjY2VzcywgMCBvdGhlcndpc2UgKi8KK2ludCBkbTY0NHhfZXRoX3BoeV9yZWFkKHVfaW50OF90IHBoeV9hZGRyLCB1X2ludDhfdCByZWdfbnVtLCB1X2ludDE2X3QgKmRhdGEpCit7CisJaW50CXRtcDsKKworCXdoaWxlIChhZGFwX21kaW8tPlVTRVJBQ0NFU1MwICYgTURJT19VU0VSQUNDRVNTMF9HTykgezt9CisKKwlhZGFwX21kaW8tPlVTRVJBQ0NFU1MwID0gTURJT19VU0VSQUNDRVNTMF9HTyB8CisJCQkJTURJT19VU0VSQUNDRVNTMF9XUklURV9SRUFEIHwKKwkJCQkoKHJlZ19udW0gJiAweDFmKSA8PCAyMSkgfAorCQkJCSgocGh5X2FkZHIgJiAweDFmKSA8PCAxNik7CisKKwkvKiBXYWl0IGZvciBjb21tYW5kIHRvIGNvbXBsZXRlICovCisJd2hpbGUgKCh0bXAgPSBhZGFwX21kaW8tPlVTRVJBQ0NFU1MwKSAmIE1ESU9fVVNFUkFDQ0VTUzBfR08pIHs7fQorCisJaWYgKHRtcCAmIE1ESU9fVVNFUkFDQ0VTUzBfQUNLKSB7CisJCSpkYXRhID0gdG1wICYgMHhmZmZmOworCQlyZXR1cm4oMSk7CisJfQorCisJKmRhdGEgPSAtMTsKKwlyZXR1cm4oMCk7Cit9CisKKy8qIFdyaXRlIHRvIGEgUEhZIHJlZ2lzdGVyIHZpYSBNRElPIGludGVmYWNlLiBCbG9ja3MgdW50aWwgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLiAqLworaW50IGRtNjQ0eF9ldGhfcGh5X3dyaXRlKHVfaW50OF90IHBoeV9hZGRyLCB1X2ludDhfdCByZWdfbnVtLCB1X2ludDE2X3QgZGF0YSkKK3sKKworCXdoaWxlIChhZGFwX21kaW8tPlVTRVJBQ0NFU1MwICYgTURJT19VU0VSQUNDRVNTMF9HTykgezt9CisKKwlhZGFwX21kaW8tPlVTRVJBQ0NFU1MwID0gTURJT19VU0VSQUNDRVNTMF9HTyB8CisJCQkJTURJT19VU0VSQUNDRVNTMF9XUklURV9XUklURSB8CisJCQkJKChyZWdfbnVtICYgMHgxZikgPDwgMjEpIHwKKwkJCQkoKHBoeV9hZGRyICYgMHgxZikgPDwgMTYpIHwKKwkJCQkoZGF0YSAmIDB4ZmZmZik7CisKKwkvKiBXYWl0IGZvciBjb21tYW5kIHRvIGNvbXBsZXRlICovCisJd2hpbGUgKGFkYXBfbWRpby0+VVNFUkFDQ0VTUzAgJiBNRElPX1VTRVJBQ0NFU1MwX0dPKSB7O30KKworCXJldHVybigxKTsKK30KKworLyogUEhZIGZ1bmN0aW9ucyBmb3IgYSBnZW5lcmljIFBIWSAqLworc3RhdGljIGludCBnZW5faW5pdF9waHkoaW50IHBoeV9hZGRyKQoreworCWludAlyZXQgPSAxOworCisJaWYgKGdlbl9nZXRfbGlua19zcGVlZChwaHlfYWRkcikpIHsKKwkJLyogVHJ5IGFub3RoZXIgdGltZSAqLworCQlyZXQgPSBnZW5fZ2V0X2xpbmtfc3BlZWQocGh5X2FkZHIpOworCX0KKworCXJldHVybihyZXQpOworfQorCitzdGF0aWMgaW50IGdlbl9pc19waHlfY29ubmVjdGVkKGludCBwaHlfYWRkcikKK3sKKwl1X2ludDE2X3QJZHVtbXk7CisKKwlyZXR1cm4oZG02NDR4X2V0aF9waHlfcmVhZChwaHlfYWRkciwgUEhZX1BIWUlEUjEsICZkdW1teSkpOworfQorCitzdGF0aWMgaW50IGdlbl9nZXRfbGlua19zcGVlZChpbnQgcGh5X2FkZHIpCit7CisJdV9pbnQxNl90CXRtcDsKKworCWlmIChkbTY0NHhfZXRoX3BoeV9yZWFkKHBoeV9hZGRyLCBNSUlfU1RBVFVTX1JFRywgJnRtcCkgJiYgKHRtcCAmIDB4MDQpKQorCQlyZXR1cm4oMSk7CisKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgZ2VuX2F1dG9fbmVnb3RpYXRlKGludCBwaHlfYWRkcikKK3sKKwl1X2ludDE2X3QJdG1wOworCisJaWYgKCFkbTY0NHhfZXRoX3BoeV9yZWFkKHBoeV9hZGRyLCBQSFlfQk1DUiwgJnRtcCkpCisJCXJldHVybigwKTsKKworCS8qIFJlc3RhcnQgQXV0b19uZWdvdGlhdGlvbiAgKi8KKwl0bXAgfD0gUEhZX0JNQ1JfQVVUT047CisJZG02NDR4X2V0aF9waHlfd3JpdGUocGh5X2FkZHIsIFBIWV9CTUNSLCB0bXApOworCisJLypjaGVjayBBdXRvTmVnb3RpYXRlIGNvbXBsZXRlICovCisJdWRlbGF5ICgxMDAwMCk7CisJaWYgKCFkbTY0NHhfZXRoX3BoeV9yZWFkKHBoeV9hZGRyLCBQSFlfQk1TUiwgJnRtcCkpCisJCXJldHVybigwKTsKKworCWlmICghKHRtcCAmIFBIWV9CTVNSX0FVVE5fQ09NUCkpCisJCXJldHVybigwKTsKKworCXJldHVybihnZW5fZ2V0X2xpbmtfc3BlZWQocGh5X2FkZHIpKTsKK30KKy8qIEVuZCBvZiBnZW5lcmljIFBIWSBmdW5jdGlvbnMgKi8KKworCisjaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKQorc3RhdGljIGludCBkbTY0NHhfbWlpX3BoeV9yZWFkKGNoYXIgKmRldm5hbWUsIHVuc2lnbmVkIGNoYXIgYWRkciwgdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIHNob3J0ICp2YWx1ZSkKK3sKKwlyZXR1cm4oZG02NDR4X2V0aF9waHlfcmVhZChhZGRyLCByZWcsIHZhbHVlKSA/IDAgOiAxKTsKK30KKworc3RhdGljIGludCBkbTY0NHhfbWlpX3BoeV93cml0ZShjaGFyICpkZXZuYW1lLCB1bnNpZ25lZCBjaGFyIGFkZHIsIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSkKK3sKKwlyZXR1cm4oZG02NDR4X2V0aF9waHlfd3JpdGUoYWRkciwgcmVnLCB2YWx1ZSkgPyAwIDogMSk7Cit9CisKK2ludCBkbTY0NHhfZXRoX21paXBoeV9pbml0aWFsaXplKGJkX3QgKmJpcykKK3sKKwltaWlwaHlfcmVnaXN0ZXIocGh5Lm5hbWUsIGRtNjQ0eF9taWlfcGh5X3JlYWQsIGRtNjQ0eF9taWlfcGh5X3dyaXRlKTsKKworCXJldHVybigxKTsKK30KKyNlbmRpZgorCisvKgorICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgZW1hYyBoYXJkd2FyZS4gSXQgZG9lcyBOT1QgaW5pdGlhbGl6ZQorICogRU1BQyBtb2R1bGVzIHBvd2VyIG9yIHBpbiBtdWx0aXBsZXhvcnMsIHRoYXQgaXMgZG9uZSBieSBib2FyZF9pbml0KCkKKyAqIG11Y2ggZWFybGllciBpbiBib290dXAgcHJvY2Vzcy4gUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IGRtNjQ0eF9ldGhfaHdfaW5pdCh2b2lkKQoreworCXVfaW50MzJfdAlwaHlfaWQ7CisJdV9pbnQxNl90CXRtcDsKKwlpbnQJCWk7CisKKwlkbTY0NHhfZXRoX21kaW9fZW5hYmxlKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJaWYgKGFkYXBfbWRpby0+QUxJVkUpCisJCQlicmVhazsKKwkJdWRlbGF5KDEwKTsKKwl9CisKKwlpZiAoaSA+PSAyNTYpIHsKKwkJcHJpbnRmKCJObyBFVEggUEhZIGRldGVjdGVkISEhXG4iKTsKKwkJcmV0dXJuKDApOworCX0KKworCS8qIEZpbmQgaWYgYSBQSFkgaXMgY29ubmVjdGVkIGFuZCBnZXQgaXQncyBhZGRyZXNzICovCisJaWYgKCFkbTY0NHhfZXRoX3BoeV9kZXRlY3QoKSkKKwkJcmV0dXJuKDApOworCisJLyogR2V0IFBIWSBJRCBhbmQgaW5pdGlhbGl6ZSBwaHlfb3BzIGZvciBhIGRldGVjdGVkIFBIWSAqLworCWlmICghZG02NDR4X2V0aF9waHlfcmVhZChhY3RpdmVfcGh5X2FkZHIsIFBIWV9QSFlJRFIxLCAmdG1wKSkgeworCQlhY3RpdmVfcGh5X2FkZHIgPSAweGZmOworCQlyZXR1cm4oMCk7CisJfQorCisJcGh5X2lkID0gKHRtcCA8PCAxNikgJiAweGZmZmYwMDAwOworCisJaWYgKCFkbTY0NHhfZXRoX3BoeV9yZWFkKGFjdGl2ZV9waHlfYWRkciwgUEhZX1BIWUlEUjIsICZ0bXApKSB7CisJCWFjdGl2ZV9waHlfYWRkciA9IDB4ZmY7CisJCXJldHVybigwKTsKKwl9CisKKwlwaHlfaWQgfD0gdG1wICYgMHgwMDAwZmZmZjsKKworCXN3aXRjaCAocGh5X2lkKSB7CisJCWNhc2UgUEhZX0xYVDk3MjoKKwkJCXNwcmludGYocGh5Lm5hbWUsICJMWFQ5NzIgQCAweCUwMngiLCBhY3RpdmVfcGh5X2FkZHIpOworCQkJcGh5LmluaXQgPSBseHQ5NzJfaW5pdF9waHk7CisJCQlwaHkuaXNfcGh5X2Nvbm5lY3RlZCA9IGx4dDk3Ml9pc19waHlfY29ubmVjdGVkOworCQkJcGh5LmdldF9saW5rX3NwZWVkID0gbHh0OTcyX2dldF9saW5rX3NwZWVkOworCQkJcGh5LmF1dG9fbmVnb3RpYXRlID0gbHh0OTcyX2F1dG9fbmVnb3RpYXRlOworCQkJYnJlYWs7CisJCWNhc2UgUEhZX0RQODM4NDg6CisJCQlzcHJpbnRmKHBoeS5uYW1lLCAiRFA4Mzg0OCBAIDB4JTAyeCIsIGFjdGl2ZV9waHlfYWRkcik7CisJCQlwaHkuaW5pdCA9IGRwODM4NDhfaW5pdF9waHk7CisJCQlwaHkuaXNfcGh5X2Nvbm5lY3RlZCA9IGRwODM4NDhfaXNfcGh5X2Nvbm5lY3RlZDsKKwkJCXBoeS5nZXRfbGlua19zcGVlZCA9IGRwODM4NDhfZ2V0X2xpbmtfc3BlZWQ7CisJCQlwaHkuYXV0b19uZWdvdGlhdGUgPSBkcDgzODQ4X2F1dG9fbmVnb3RpYXRlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzcHJpbnRmKHBoeS5uYW1lLCAiR0VORVJJQyBAIDB4JTAyeCIsIGFjdGl2ZV9waHlfYWRkcik7CisJCQlwaHkuaW5pdCA9IGdlbl9pbml0X3BoeTsKKwkJCXBoeS5pc19waHlfY29ubmVjdGVkID0gZ2VuX2lzX3BoeV9jb25uZWN0ZWQ7CisJCQlwaHkuZ2V0X2xpbmtfc3BlZWQgPSBnZW5fZ2V0X2xpbmtfc3BlZWQ7CisJCQlwaHkuYXV0b19uZWdvdGlhdGUgPSBnZW5fYXV0b19uZWdvdGlhdGU7CisJfQorCisJcmV0dXJuKDEpOworfQorCisKKy8qIEV0aCBkZXZpY2Ugb3BlbiAqLworc3RhdGljIGludCBkbTY0NHhfZXRoX29wZW4odm9pZCkKK3sKKwlkdl9yZWdfcAkJYWRkcjsKKwl1X2ludDMyX3QJCWNsa2RpdiwgY250OworCXZvbGF0aWxlIGVtYWNfZGVzYwkqcnhfZGVzYzsKKworCWRlYnVnX2VtYWMoIisgZW1hY19vcGVuXG4iKTsKKworCS8qIFJlc2V0IEVNQUMgbW9kdWxlIGFuZCBkaXNhYmxlIGludGVycnVwdHMgaW4gd3JhcHBlciAqLworCWFkYXBfZW1hYy0+U09GVFJFU0VUID0gMTsKKwl3aGlsZSAoYWRhcF9lbWFjLT5TT0ZUUkVTRVQgIT0gMCkgezt9CisJYWRhcF9ld3JhcC0+RVdDVEwgPSAwOworCWZvciAoY250ID0gMDsgY250IDwgNTsgY250KyspIHsKKwkJY2xrZGl2ID0gYWRhcF9ld3JhcC0+RVdDVEw7CisJfQorCisJcnhfZGVzYyA9IGVtYWNfcnhfZGVzYzsKKworCWFkYXBfZW1hYy0+VFhDT05UUk9MID0gMHgwMTsKKwlhZGFwX2VtYWMtPlJYQ09OVFJPTCA9IDB4MDE7CisKKwkvKiBTZXQgTUFDIEFkZHJlc3NlcyAmIEluaXQgbXVsdGljYXN0IEhhc2ggdG8gMCAoZGlzYWJsZSBhbnkgbXVsdGljYXN0IHJlY2VpdmUpICovCisJLyogVXNpbmcgY2hhbm5lbCAwIG9ubHkgLSBvdGhlciBjaGFubmVscyBhcmUgZGlzYWJsZWQgKi8KKwlhZGFwX2VtYWMtPk1BQ0lOREVYID0gMDsKKwlhZGFwX2VtYWMtPk1BQ0FERFJISSA9CisJCShkbTY0NHhfZXRoX21hY19hZGRyWzNdIDw8IDI0KSB8CisJCShkbTY0NHhfZXRoX21hY19hZGRyWzJdIDw8IDE2KSB8CisJCShkbTY0NHhfZXRoX21hY19hZGRyWzFdIDw8IDgpICB8CisJCShkbTY0NHhfZXRoX21hY19hZGRyWzBdKTsKKwlhZGFwX2VtYWMtPk1BQ0FERFJMTyA9CisJCShkbTY0NHhfZXRoX21hY19hZGRyWzVdIDw8IDgpIHwKKwkJKGRtNjQ0eF9ldGhfbWFjX2FkZHJbNF0pOworCisJYWRhcF9lbWFjLT5NQUNIQVNIMSA9IDA7CisJYWRhcF9lbWFjLT5NQUNIQVNIMiA9IDA7CisKKwkvKiBTZXQgc291cmNlIE1BQyBhZGRyZXNzIC0gUkVRVUlSRUQgKi8KKwlhZGFwX2VtYWMtPk1BQ1NSQ0FERFJISSA9CisJCShkbTY0NHhfZXRoX21hY19hZGRyWzNdIDw8IDI0KSB8CisJCShkbTY0NHhfZXRoX21hY19hZGRyWzJdIDw8IDE2KSB8CisJCShkbTY0NHhfZXRoX21hY19hZGRyWzFdIDw8IDgpICB8CisJCShkbTY0NHhfZXRoX21hY19hZGRyWzBdKTsKKwlhZGFwX2VtYWMtPk1BQ1NSQ0FERFJMTyA9CisJCShkbTY0NHhfZXRoX21hY19hZGRyWzRdIDw8IDgpIHwKKwkJKGRtNjQ0eF9ldGhfbWFjX2FkZHJbNV0pOworCisJLyogU2V0IERNQSA4IFRYIC8gOCBSWCBIZWFkIHBvaW50ZXJzIHRvIDAgKi8KKwlhZGRyID0gJmFkYXBfZW1hYy0+VFgwSERQOworCWZvcihjbnQgPSAwOyBjbnQgPCAxNjsgY250KyspCisJCSphZGRyKysgPSAwOworCisJYWRkciA9ICZhZGFwX2VtYWMtPlJYMEhEUDsKKwlmb3IoY250ID0gMDsgY250IDwgMTY7IGNudCsrKQorCQkqYWRkcisrID0gMDsKKworCS8qIENsZWFyIFN0YXRpc3RpY3MgKGRvIHRoaXMgYmVmb3JlIHNldHRpbmcgTWFjQ29udHJvbCByZWdpc3RlcikgKi8KKwlhZGRyID0gJmFkYXBfZW1hYy0+UlhHT09ERlJBTUVTOworCWZvcihjbnQgPSAwOyBjbnQgPCBFTUFDX05VTV9TVEFUUzsgY250KyspCisJCSphZGRyKysgPSAwOworCisJLyogTm8gbXVsdGljYXN0IGFkZHJlc3NpbmcgKi8KKwlhZGFwX2VtYWMtPk1BQ0hBU0gxID0gMDsKKwlhZGFwX2VtYWMtPk1BQ0hBU0gyID0gMDsKKworCS8qIENyZWF0ZSBSWCBxdWV1ZSBhbmQgc2V0IHJlY2VpdmUgcHJvY2VzcyBpbiBwbGFjZSAqLworCWVtYWNfcnhfYWN0aXZlX2hlYWQgPSBlbWFjX3J4X2Rlc2M7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBFTUFDX01BWF9SWF9CVUZGRVJTOyBjbnQrKykgeworCQlyeF9kZXNjLT5uZXh0ID0gKHVfaW50MzJfdCkocnhfZGVzYyArIDEpOworCQlyeF9kZXNjLT5idWZmZXIgPSAmZW1hY19yeF9idWZmZXJzW2NudCAqIChFTUFDX01BWF9FVEhFUk5FVF9QS1RfU0laRSArIEVNQUNfUEtUX0FMSUdOKV07CisJCXJ4X2Rlc2MtPmJ1ZmZfb2ZmX2xlbiA9IEVNQUNfTUFYX0VUSEVSTkVUX1BLVF9TSVpFOworCQlyeF9kZXNjLT5wa3RfZmxhZ19sZW4gPSBFTUFDX0NQUElfT1dORVJTSElQX0JJVDsKKwkJcnhfZGVzYysrOworCX0KKworCS8qIFNldCB0aGUgbGFzdCBkZXNjcmlwdG9yJ3MgIm5leHQiIHBhcmFtZXRlciB0byAwIHRvIGVuZCB0aGUgUlggZGVzYyBsaXN0ICovCisJcnhfZGVzYy0tOworCXJ4X2Rlc2MtPm5leHQgPSAwOworCWVtYWNfcnhfYWN0aXZlX3RhaWwgPSByeF9kZXNjOworCWVtYWNfcnhfcXVldWVfYWN0aXZlID0gMTsKKworCS8qIEVuYWJsZSBUWC9SWCAqLworCWFkYXBfZW1hYy0+UlhNQVhMRU4gPSBFTUFDX01BWF9FVEhFUk5FVF9QS1RfU0laRTsKKwlhZGFwX2VtYWMtPlJYQlVGRkVST0ZGU0VUID0gMDsKKworCS8qIE5vIGZhbmN5IGNvbmZpZ3MgLSBVc2UgdGhpcyBmb3IgcHJvbWlzY291cyBmb3IgZGVidWcgLSBFTUFDX1JYTUJQRU5BQkxFX1JYQ0FGRU5fRU5BQkxFICovCisJYWRhcF9lbWFjLT5SWE1CUEVOQUJMRSA9IEVNQUNfUlhNQlBFTkFCTEVfUlhCUk9BREVOOworCisJLyogRW5hYmxlIGNoIDAgb25seSAqLworCWFkYXBfZW1hYy0+UlhVTklDQVNUU0VUID0gMHgwMTsKKworCS8qIEVuYWJsZSBNSUkgaW50ZXJmYWNlIGFuZCBGdWxsIGR1cGxleCBtb2RlICovCisJYWRhcF9lbWFjLT5NQUNDT05UUk9MID0gKEVNQUNfTUFDQ09OVFJPTF9NSUlFTl9FTkFCTEUgfCBFTUFDX01BQ0NPTlRST0xfRlVMTERVUExFWF9FTkFCTEUpOworCisJLyogSW5pdCBNRElPICYgZ2V0IGxpbmsgc3RhdGUgKi8KKwljbGtkaXYgPSAoRU1BQ19NRElPX0JVU19GUkVRIC8gRU1BQ19NRElPX0NMT0NLX0ZSRVEpIC0gMTsKKwlhZGFwX21kaW8tPkNPTlRST0wgPSAoKGNsa2RpdiAmIDB4ZmYpIHwgTURJT19DT05UUk9MX0VOQUJMRSB8IE1ESU9fQ09OVFJPTF9GQVVMVCk7CisKKwlpZiAoIXBoeS5nZXRfbGlua19zcGVlZChhY3RpdmVfcGh5X2FkZHIpKQorCQlyZXR1cm4oMCk7CisKKwkvKiBTdGFydCByZWNlaXZlIHByb2Nlc3MgKi8KKwlhZGFwX2VtYWMtPlJYMEhEUCA9ICh1X2ludDMyX3QpZW1hY19yeF9kZXNjOworCisJZGVidWdfZW1hYygiLSBlbWFjX29wZW5cbiIpOworCisJcmV0dXJuKDEpOworfQorCisvKiBFTUFDIENoYW5uZWwgVGVhcmRvd24gKi8KK3N0YXRpYyB2b2lkIGRtNjQ0eF9ldGhfY2hfdGVhcmRvd24oaW50IGNoKQoreworCWR2X3JlZwkJZGx5ID0gMHhmZjsKKwlkdl9yZWcJCWNudDsKKworCWRlYnVnX2VtYWMoIisgZW1hY19jaF90ZWFyZG93blxuIik7CisKKwlpZiAoY2ggPT0gRU1BQ19DSF9UWCkgeworCQkvKiBJbml0IFRYIGNoYW5uZWwgdGVhcmRvd24gKi8KKwkJYWRhcF9lbWFjLT5UWFRFQVJET1dOID0gMTsKKwkJZm9yKGNudCA9IDA7IGNudCAhPSAweGZmZmZmZmZjOyBjbnQgPSBhZGFwX2VtYWMtPlRYMENQKSB7CisJCQkvKiBXYWl0IGhlcmUgZm9yIFR4IHRlYXJkb3duIGNvbXBsZXRpb24gaW50ZXJydXB0IHRvIG9jY3VyCisJCQkgKiBOb3RlOiBBIHRhc2sgZGVsYXkgY2FuIGJlIGNhbGxlZCBoZXJlIHRvIHBlbmQgcmF0aGVyIHRoYW4KKwkJCSAqIG9jY3VweWluZyBDUFUgY3ljbGVzIC0gYW55d2F5IGl0IGhhcyBiZWVuIGZvdW5kIHRoYXQgdGVhcmRvd24KKwkJCSAqIHRha2VzIHZlcnkgZmV3IGNwdSBjeWNsZXMgYW5kIGRvZXMgbm90IGFmZmVjdCBmdW5jdGlvbmFsaXR5ICovCisJCQkgZGx5LS07CisJCQkgdWRlbGF5KDEpOworCQkJIGlmIChkbHkgPT0gMCkKKwkJCSAJYnJlYWs7CisJCX0KKwkJYWRhcF9lbWFjLT5UWDBDUCA9IGNudDsKKwkJYWRhcF9lbWFjLT5UWDBIRFAgPSAwOworCX0gZWxzZSB7CisJCS8qIEluaXQgUlggY2hhbm5lbCB0ZWFyZG93biAqLworCQlhZGFwX2VtYWMtPlJYVEVBUkRPV04gPSAxOworCQlmb3IoY250ID0gMDsgY250ICE9IDB4ZmZmZmZmZmM7IGNudCA9IGFkYXBfZW1hYy0+UlgwQ1ApIHsKKwkJCS8qIFdhaXQgaGVyZSBmb3IgUnggdGVhcmRvd24gY29tcGxldGlvbiBpbnRlcnJ1cHQgdG8gb2NjdXIKKwkJCSAqIE5vdGU6IEEgdGFzayBkZWxheSBjYW4gYmUgY2FsbGVkIGhlcmUgdG8gcGVuZCByYXRoZXIgdGhhbgorCQkJICogb2NjdXB5aW5nIENQVSBjeWNsZXMgLSBhbnl3YXkgaXQgaGFzIGJlZW4gZm91bmQgdGhhdCB0ZWFyZG93bgorCQkJICogdGFrZXMgdmVyeSBmZXcgY3B1IGN5Y2xlcyBhbmQgZG9lcyBub3QgYWZmZWN0IGZ1bmN0aW9uYWxpdHkgKi8KKwkJCSBkbHktLTsKKwkJCSB1ZGVsYXkoMSk7CisJCQkgaWYgKGRseSA9PSAwKQorCQkJIAlicmVhazsKKwkJfQorCQlhZGFwX2VtYWMtPlJYMENQID0gY250OworCQlhZGFwX2VtYWMtPlJYMEhEUCA9IDA7CisJfQorCisJZGVidWdfZW1hYygiLSBlbWFjX2NoX3RlYXJkb3duXG4iKTsKK30KKworLyogRXRoIGRldmljZSBjbG9zZSAqLworc3RhdGljIGludCBkbTY0NHhfZXRoX2Nsb3NlKHZvaWQpCit7CisJZGVidWdfZW1hYygiKyBlbWFjX2Nsb3NlXG4iKTsKKworCWRtNjQ0eF9ldGhfY2hfdGVhcmRvd24oRU1BQ19DSF9UWCk7CS8qIFRYIENoYW5uZWwgdGVhcmRvd24gKi8KKwlkbTY0NHhfZXRoX2NoX3RlYXJkb3duKEVNQUNfQ0hfUlgpOwkvKiBSWCBDaGFubmVsIHRlYXJkb3duICovCisKKwkvKiBSZXNldCBFTUFDIG1vZHVsZSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzIGluIHdyYXBwZXIgKi8KKwlhZGFwX2VtYWMtPlNPRlRSRVNFVCA9IDE7CisJYWRhcF9ld3JhcC0+RVdDVEwgPSAwOworCisJZGVidWdfZW1hYygiLSBlbWFjX2Nsb3NlXG4iKTsKKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyBpbnQgdHhfc2VuZF9sb29wID0gMDsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gc2VuZHMgYSBzaW5nbGUgcGFja2V0IG9uIHRoZSBuZXR3b3JrIGFuZCByZXR1cm5zCisgKiBwb3NpdGl2ZSBudW1iZXIgKG51bWJlciBvZiBieXRlcyB0cmFuc21pdHRlZCkgb3IgbmVnYXRpdmUgZm9yIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgZG02NDR4X2V0aF9zZW5kX3BhY2tldCh2b2xhdGlsZSB2b2lkICpwYWNrZXQsIGludCBsZW5ndGgpCit7CisJaW50IHJldF9zdGF0dXMgPSAtMTsKKwl0eF9zZW5kX2xvb3AgPSAwOworCisJLyogUmV0dXJuIGVycm9yIGlmIG5vIGxpbmsgKi8KKwlpZiAoIXBoeS5nZXRfbGlua19zcGVlZChhY3RpdmVfcGh5X2FkZHIpKQorCXsKKwkJcHJpbnRmKCJXQVJOOiBlbWFjX3NlbmRfcGFja2V0OiBObyBsaW5rXG4iKTsKKwkJcmV0dXJuIChyZXRfc3RhdHVzKTsKKwl9CisKKwkvKiBDaGVjayBwYWNrZXQgc2l6ZSBhbmQgaWYgPCBFTUFDX01JTl9FVEhFUk5FVF9QS1RfU0laRSwgcGFkIGl0IHVwICovCisJaWYgKGxlbmd0aCA8IEVNQUNfTUlOX0VUSEVSTkVUX1BLVF9TSVpFKQorCXsKKwkJbGVuZ3RoID0gRU1BQ19NSU5fRVRIRVJORVRfUEtUX1NJWkU7CisJfQorCisJLyogUG9wdWxhdGUgdGhlIFRYIGRlc2NyaXB0b3IgKi8KKwllbWFjX3R4X2Rlc2MtPm5leHQgICAgICAgICA9IDA7CisJZW1hY190eF9kZXNjLT5idWZmZXIgICAgICAgPSAodV9pbnQ4X3QgKilwYWNrZXQ7CisJZW1hY190eF9kZXNjLT5idWZmX29mZl9sZW4gPSAobGVuZ3RoICYgMHhmZmZmKTsKKwllbWFjX3R4X2Rlc2MtPnBrdF9mbGFnX2xlbiA9ICgobGVuZ3RoICYgMHhmZmZmKSB8CisJCQlFTUFDX0NQUElfU09QX0JJVCB8CisJCQlFTUFDX0NQUElfT1dORVJTSElQX0JJVCB8CisJCQlFTUFDX0NQUElfRU9QX0JJVCk7CisJLyogU2VuZCB0aGUgcGFja2V0ICovCisJYWRhcF9lbWFjLT5UWDBIRFAgPSAodW5zaWduZWQgaW50KWVtYWNfdHhfZGVzYzsKKworCS8qIFdhaXQgZm9yIHBhY2tldCB0byBjb21wbGV0ZSBvciBsaW5rIGRvd24gKi8KKwl3aGlsZSAoMSkgeworCSAgICAgICAgaWYgKCFwaHkuZ2V0X2xpbmtfc3BlZWQoYWN0aXZlX3BoeV9hZGRyKSkgeworCSAgICAgICAgCWRtNjQ0eF9ldGhfY2hfdGVhcmRvd24oRU1BQ19DSF9UWCk7CisJICAgICAgICAJcmV0dXJuIChyZXRfc3RhdHVzKTsKKwkgICAgICAgIH0KKwkgICAgICAgIGlmIChhZGFwX2VtYWMtPlRYSU5UU1RBVFJBVyAmIDB4MDEpIHsKKwkgICAgICAgIAlyZXRfc3RhdHVzID0gbGVuZ3RoOworCSAgICAgICAgCWJyZWFrOworCQl9CisJICAgICAgICB0eF9zZW5kX2xvb3ArKzsKKwl9CisKKwlyZXR1cm4ocmV0X3N0YXR1cyk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgcmVjZWlwdCBvZiBhIHBhY2tldCBmcm9tIHRoZSBuZXR3b3JrCisgKi8KK3N0YXRpYyBpbnQgZG02NDR4X2V0aF9yY3ZfcGFja2V0KHZvaWQpCit7CisJdm9sYXRpbGUgZW1hY19kZXNjCSpyeF9jdXJyX2Rlc2M7CisJdm9sYXRpbGUgZW1hY19kZXNjCSpjdXJyX2Rlc2M7CisJdm9sYXRpbGUgZW1hY19kZXNjCSp0YWlsX2Rlc2M7CisJaW50CQkJc3RhdHVzLCByZXQgPSAtMTsKKworCXJ4X2N1cnJfZGVzYyA9IGVtYWNfcnhfYWN0aXZlX2hlYWQ7CisJc3RhdHVzID0gcnhfY3Vycl9kZXNjLT5wa3RfZmxhZ19sZW47CisJaWYgKChyeF9jdXJyX2Rlc2MpICYmICgoc3RhdHVzICYgRU1BQ19DUFBJX09XTkVSU0hJUF9CSVQpID09IDApKSB7CisJICAgICAgICBpZiAoc3RhdHVzICYgRU1BQ19DUFBJX1JYX0VSUk9SX0ZSQU1FKSB7CisJICAgICAgICAJLyogRXJyb3IgaW4gcGFja2V0IC0gZGlzY2FyZCBpdCBhbmQgcmVxdWV1ZSBkZXNjICovCisJICAgICAgICAJcHJpbnRmKCJXQVJOOiBlbWFjX3Jjdl9wa3Q6IEVycm9yIGluIHBhY2tldFxuIik7CisJCX0gZWxzZSB7CisJCQlOZXRSZWNlaXZlKHJ4X2N1cnJfZGVzYy0+YnVmZmVyLCAocnhfY3Vycl9kZXNjLT5idWZmX29mZl9sZW4gJiAweGZmZmYpKTsKKwkJCXJldCA9IHJ4X2N1cnJfZGVzYy0+YnVmZl9vZmZfbGVuICYgMHhmZmZmOworCSAgICAgICAgfQorCisJICAgICAgICAvKiBBY2sgcmVjZWl2ZWQgcGFja2V0IGRlc2NyaXB0b3IgKi8KKwkgICAgICAgIGFkYXBfZW1hYy0+UlgwQ1AgPSAodW5zaWduZWQgaW50KXJ4X2N1cnJfZGVzYzsKKwkgICAgICAgIGN1cnJfZGVzYyA9IHJ4X2N1cnJfZGVzYzsKKwkgICAgICAgIGVtYWNfcnhfYWN0aXZlX2hlYWQgPSAodm9sYXRpbGUgZW1hY19kZXNjICopcnhfY3Vycl9kZXNjLT5uZXh0OworCisJICAgICAgICBpZiAoc3RhdHVzICYgRU1BQ19DUFBJX0VPUV9CSVQpIHsKKwkgICAgICAgIAlpZiAoZW1hY19yeF9hY3RpdmVfaGVhZCkgeworCSAgICAgICAgCQlhZGFwX2VtYWMtPlJYMEhEUCA9ICh1bnNpZ25lZCBpbnQpZW1hY19yeF9hY3RpdmVfaGVhZDsKKwkJCX0gZWxzZSB7CisJCQkJZW1hY19yeF9xdWV1ZV9hY3RpdmUgPSAwOworCQkJCXByaW50ZigiSU5GTzplbWFjX3Jjdl9wYWNrZXQ6IFJYIFF1ZXVlIG5vdCBhY3RpdmVcbiIpOworCQkJfQorCQl9CisKKwkJLyogUmVjeWNsZSBSWCBkZXNjcmlwdG9yICovCisJCXJ4X2N1cnJfZGVzYy0+YnVmZl9vZmZfbGVuID0gRU1BQ19NQVhfRVRIRVJORVRfUEtUX1NJWkU7CisJCXJ4X2N1cnJfZGVzYy0+cGt0X2ZsYWdfbGVuID0gRU1BQ19DUFBJX09XTkVSU0hJUF9CSVQ7CisJCXJ4X2N1cnJfZGVzYy0+bmV4dCA9IDA7CisKKwkJaWYgKGVtYWNfcnhfYWN0aXZlX2hlYWQgPT0gMCkgeworCQkJcHJpbnRmKCJJTkZPOiBlbWFjX3Jjdl9wa3Q6IGFjdGl2ZSBxdWV1ZSBoZWFkID0gMFxuIik7CisJCQllbWFjX3J4X2FjdGl2ZV9oZWFkID0gY3Vycl9kZXNjOworCQkJZW1hY19yeF9hY3RpdmVfdGFpbCA9IGN1cnJfZGVzYzsKKwkJCWlmIChlbWFjX3J4X3F1ZXVlX2FjdGl2ZSAhPSAwKSB7CisJCQkJYWRhcF9lbWFjLT5SWDBIRFAgPSAodW5zaWduZWQgaW50KWVtYWNfcnhfYWN0aXZlX2hlYWQ7CisJCQkJcHJpbnRmKCJJTkZPOiBlbWFjX3Jjdl9wa3Q6IGFjdGl2ZSBxdWV1ZSBoZWFkID0gMCwgSERQIGZpcmVkXG4iKTsKKwkJCQllbWFjX3J4X3F1ZXVlX2FjdGl2ZSA9IDE7CisJCQl9CisJCX0gZWxzZSB7CisJCQl0YWlsX2Rlc2MgPSBlbWFjX3J4X2FjdGl2ZV90YWlsOworCQkJZW1hY19yeF9hY3RpdmVfdGFpbCA9IGN1cnJfZGVzYzsKKwkJCXRhaWxfZGVzYy0+bmV4dCA9ICh1bnNpZ25lZCBpbnQpY3Vycl9kZXNjOworCQkJc3RhdHVzID0gdGFpbF9kZXNjLT5wa3RfZmxhZ19sZW47CisJCQlpZiAoc3RhdHVzICYgRU1BQ19DUFBJX0VPUV9CSVQpIHsKKwkJCQlhZGFwX2VtYWMtPlJYMEhEUCA9ICh1bnNpZ25lZCBpbnQpY3Vycl9kZXNjOworCQkJCXN0YXR1cyAmPSB+RU1BQ19DUFBJX0VPUV9CSVQ7CisJCQkJdGFpbF9kZXNjLT5wa3RfZmxhZ19sZW4gPSBzdGF0dXM7CisJCQl9CisJCX0KKwkJcmV0dXJuKHJldCk7CisJfQorCXJldHVybigwKTsKK30KKworI2VuZGlmIC8qIENPTkZJR19DTURfTkVUICovCisKKyNlbmRpZiAvKiBDT05GSUdfRFJJVkVSX1RJX0VNQUMgKi8KZGlmZiAtLWdpdCBhL2NwdS9hcm05MjZlanMvZGF2aW5jaS9pMmMuYyBiL2NwdS9hcm05MjZlanMvZGF2aW5jaS9pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjlkYzAzCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L2FybTkyNmVqcy9kYXZpbmNpL2kyYy5jCkBAIC0wLDAgKzEsMzUxIEBACisvKgorICogVEkgRGFWaW5jaSAoVE1TMzIwRE02NDR4KSBJMkMgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmZGVmIENPTkZJR19EUklWRVJfREFWSU5DSV9JMkMKKworI2luY2x1ZGUgPGkyYy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaTJjX2RlZnMuaD4KKworI2RlZmluZSBDSEVDS19OQUNLKCkgXAorCWRvIHtcCisJCWlmICh0bXAgJiAoSTJDX1RJTUVPVVQgfCBJMkNfU1RBVF9OQUNLKSkge1wKKwkJCVJFRyhJMkNfQ09OKSA9IDA7XAorCQkJcmV0dXJuKDEpO1wKKwkJfVwKKwl9IHdoaWxlICgwKQorCisKK3N0YXRpYyBpbnQgd2FpdF9mb3JfYnVzKHZvaWQpCit7CisJaW50CXN0YXQsIHRpbWVvdXQ7CisKKwlSRUcoSTJDX1NUQVQpID0gMHhmZmZmOworCisJZm9yICh0aW1lb3V0ID0gMDsgdGltZW91dCA8IDEwOyB0aW1lb3V0KyspIHsKKwkJaWYgKCEoKHN0YXQgPSBSRUcoSTJDX1NUQVQpKSAmIEkyQ19TVEFUX0JCKSkgeworCQkJUkVHKEkyQ19TVEFUKSA9IDB4ZmZmZjsKKwkJCXJldHVybigwKTsKKwkJfQorCisJCVJFRyhJMkNfU1RBVCkgPSBzdGF0OworCQl1ZGVsYXkoNTAwMDApOworCX0KKworCVJFRyhJMkNfU1RBVCkgPSAweGZmZmY7CisJcmV0dXJuKDEpOworfQorCisKK3N0YXRpYyBpbnQgcG9sbF9pMmNfaXJxKGludCBtYXNrKQoreworCWludAlzdGF0LCB0aW1lb3V0OworCisJZm9yICh0aW1lb3V0ID0gMDsgdGltZW91dCA8IDEwOyB0aW1lb3V0KyspIHsKKwkJdWRlbGF5KDEwMDApOworCQlzdGF0ID0gUkVHKEkyQ19TVEFUKTsKKwkJaWYgKHN0YXQgJiBtYXNrKSB7CisJCQlyZXR1cm4oc3RhdCk7CisJCX0KKwl9CisKKwlSRUcoSTJDX1NUQVQpID0gMHhmZmZmOworCXJldHVybihzdGF0IHwgSTJDX1RJTUVPVVQpOworfQorCisKK3ZvaWQgZmx1c2hfcngodm9pZCkKK3sKKwlpbnQJZHVtbXk7CisKKwl3aGlsZSAoMSkgeworCQlpZiAoIShSRUcoSTJDX1NUQVQpICYgSTJDX1NUQVRfUlJEWSkpCisJCQlicmVhazsKKworCQlkdW1teSA9IFJFRyhJMkNfRFJSKTsKKwkJUkVHKEkyQ19TVEFUKSA9IEkyQ19TVEFUX1JSRFk7CisJCXVkZWxheSgxMDAwKTsKKwl9Cit9CisKKwordm9pZCBpMmNfaW5pdChpbnQgc3BlZWQsIGludCBzbGF2ZWFkZCkKK3sKKwl1X2ludDMyX3QJZGl2LCBwc2M7CisKKwlpZiAoUkVHKEkyQ19DT04pICYgSTJDX0NPTl9FTikgeworCQlSRUcoSTJDX0NPTikgPSAwOworCQl1ZGVsYXkgKDUwMDAwKTsKKwl9CisKKwlwc2MgPSAyOworCWRpdiA9IChDRkdfSFpfQ0xPQ0sgLyAoKHBzYyArIDEpICogc3BlZWQpKSAtIDEwOwkvKiBTQ0xMICsgU0NMSCAqLworCVJFRyhJMkNfUFNDKSA9IHBzYzsJCQkvKiAyN01IeiAvICgyICsgMSkgPSA5TUh6ICovCisJUkVHKEkyQ19TQ0xMKSA9IChkaXYgKiA1MCkgLyAxMDA7CS8qIDUwJSBEdXR5ICovCisJUkVHKEkyQ19TQ0xIKSA9IGRpdiAtIFJFRyhJMkNfU0NMTCk7CisKKwlSRUcoSTJDX09BKSA9IHNsYXZlYWRkOworCVJFRyhJMkNfQ05UKSA9IDA7CisKKwkvKiBJbnRlcnJ1cHRzIG11c3QgYmUgZW5hYmxlZCBvciBJMkMgbW9kdWxlIHdvbid0IHdvcmsgKi8KKwlSRUcoSTJDX0lFKSA9IEkyQ19JRV9TQ0RfSUUgfCBJMkNfSUVfWFJEWV9JRSB8CisJCUkyQ19JRV9SUkRZX0lFIHwgSTJDX0lFX0FSRFlfSUUgfCBJMkNfSUVfTkFDS19JRTsKKworCS8qIE5vdyBlbmFibGUgSTJDIGNvbnRyb2xsZXIgKGdldCBpdCBvdXQgb2YgcmVzZXQpICovCisJUkVHKEkyQ19DT04pID0gSTJDX0NPTl9FTjsKKworCXVkZWxheSgxMDAwKTsKK30KKworCitpbnQgaTJjX3Byb2JlKHVfaW50OF90IGNoaXApCit7CisJaW50CXJjID0gMTsKKworCWlmIChjaGlwID09IFJFRyhJMkNfT0EpKSB7CisJCXJldHVybihyYyk7CisJfQorCisJUkVHKEkyQ19DT04pID0gMDsKKwlpZiAod2FpdF9mb3JfYnVzKCkpIHtyZXR1cm4oMSk7fQorCisJLyogdHJ5IHRvIHJlYWQgb25lIGJ5dGUgZnJvbSBjdXJyZW50IChvciBvbmx5KSBhZGRyZXNzICovCisJUkVHKEkyQ19DTlQpID0gMTsKKwlSRUcoSTJDX1NBKSA9IGNoaXA7CisJUkVHKEkyQ19DT04pID0gKEkyQ19DT05fRU4gfCBJMkNfQ09OX01TVCB8IEkyQ19DT05fU1RUIHwgSTJDX0NPTl9TVFApOworCXVkZWxheSAoNTAwMDApOworCisJaWYgKCEoUkVHKEkyQ19TVEFUKSAmIEkyQ19TVEFUX05BQ0spKSB7CisJCXJjID0gMDsKKwkJZmx1c2hfcngoKTsKKwkJUkVHKEkyQ19TVEFUKSA9IDB4ZmZmZjsKKwl9IGVsc2UgeworCQlSRUcoSTJDX1NUQVQpID0gMHhmZmZmOworCQlSRUcoSTJDX0NPTikgfD0gSTJDX0NPTl9TVFA7CisJCXVkZWxheSgyMDAwMCk7CisJCWlmICh3YWl0X2Zvcl9idXMoKSkge3JldHVybigxKTt9CisJfQorCisJZmx1c2hfcngoKTsKKwlSRUcoSTJDX1NUQVQpID0gMHhmZmZmOworCVJFRyhJMkNfQ05UKSA9IDA7CisJcmV0dXJuKHJjKTsKK30KKworCitpbnQgaTJjX3JlYWQodV9pbnQ4X3QgY2hpcCwgdV9pbnQzMl90IGFkZHIsIGludCBhbGVuLCB1X2ludDhfdCAqYnVmLCBpbnQgbGVuKQoreworCXVfaW50MzJfdAl0bXA7CisJaW50CQlpOworCisJaWYgKChhbGVuIDwgMCkgfHwgKGFsZW4gPiAyKSkgeworCQlwcmludGYoIiVzKCk6IGJvZ3VzIGFkZHJlc3MgbGVuZ3RoICV4XG4iLCBfX0ZVTkNUSU9OX18sIGFsZW4pOworCQlyZXR1cm4oMSk7CisJfQorCisJaWYgKHdhaXRfZm9yX2J1cygpKSB7cmV0dXJuKDEpO30KKworCWlmIChhbGVuICE9IDApIHsKKwkJLyogU3RhcnQgYWRkcmVzcyBwaGFzZSAqLworCQl0bXAgPSBJMkNfQ09OX0VOIHwgSTJDX0NPTl9NU1QgfCBJMkNfQ09OX1NUVCB8IEkyQ19DT05fVFJYOworCQlSRUcoSTJDX0NOVCkgPSBhbGVuOworCQlSRUcoSTJDX1NBKSA9IGNoaXA7CisJCVJFRyhJMkNfQ09OKSA9IHRtcDsKKworCQl0bXAgPSBwb2xsX2kyY19pcnEoSTJDX1NUQVRfWFJEWSB8IEkyQ19TVEFUX05BQ0spOworCisJCUNIRUNLX05BQ0soKTsKKworCQlzd2l0Y2ggKGFsZW4pIHsKKwkJCWNhc2UgMjoKKwkJCQkvKiBTZW5kIGFkZHJlc3MgTVNCeXRlICovCisJCQkJaWYgKHRtcCAmIEkyQ19TVEFUX1hSRFkpIHsKKwkJCQkJUkVHKEkyQ19EWFIpID0gKGFkZHIgPj4gOCkgJiAweGZmOworCQkJCX0gZWxzZSB7CisJCQkJCVJFRyhJMkNfQ09OKSA9IDA7CisJCQkJCXJldHVybigxKTsKKwkJCQl9CisKKwkJCQl0bXAgPSBwb2xsX2kyY19pcnEoSTJDX1NUQVRfWFJEWSB8IEkyQ19TVEFUX05BQ0spOworCisJCQkJQ0hFQ0tfTkFDSygpOworCQkJCS8qIE5vIGJyZWFrLCBmYWxsIHRocm91Z2ggKi8KKwkJCWNhc2UgMToKKwkJCQkvKiBTZW5kIGFkZHJlc3MgTFNCeXRlICovCisJCQkJaWYgKHRtcCAmIEkyQ19TVEFUX1hSRFkpIHsKKwkJCQkJUkVHKEkyQ19EWFIpID0gYWRkciAmIDB4ZmY7CisJCQkJfSBlbHNlIHsKKwkJCQkJUkVHKEkyQ19DT04pID0gMDsKKwkJCQkJcmV0dXJuKDEpOworCQkJCX0KKworCQkJCXRtcCA9IHBvbGxfaTJjX2lycShJMkNfU1RBVF9YUkRZIHwgSTJDX1NUQVRfTkFDSyB8IEkyQ19TVEFUX0FSRFkpOworCisJCQkJQ0hFQ0tfTkFDSygpOworCisJCQkJaWYgKCEodG1wICYgSTJDX1NUQVRfQVJEWSkpIHsKKwkJCQkJUkVHKEkyQ19DT04pID0gMDsKKwkJCQkJcmV0dXJuKDEpOworCQkJCX0KKwkJfQorCX0KKworCS8qIEFkZHJlc3MgcGhhc2UgaXMgb3Zlciwgbm93IHJlYWQgJ2xlbicgYnl0ZXMgYW5kIHN0b3AgKi8KKwl0bXAgPSBJMkNfQ09OX0VOIHwgSTJDX0NPTl9NU1QgfCBJMkNfQ09OX1NUVCB8IEkyQ19DT05fU1RQOworCVJFRyhJMkNfQ05UKSA9IGxlbiAmIDB4ZmZmZjsKKwlSRUcoSTJDX1NBKSA9IGNoaXA7CisJUkVHKEkyQ19DT04pID0gdG1wOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCXRtcCA9IHBvbGxfaTJjX2lycShJMkNfU1RBVF9SUkRZIHwgSTJDX1NUQVRfTkFDSyB8IEkyQ19TVEFUX1JPVlIpOworCisJCUNIRUNLX05BQ0soKTsKKworCQlpZiAodG1wICYgSTJDX1NUQVRfUlJEWSkgeworCQkJYnVmW2ldID0gUkVHKEkyQ19EUlIpOworCQl9IGVsc2UgeworCQkJUkVHKEkyQ19DT04pID0gMDsKKwkJCXJldHVybigxKTsKKwkJfQorCX0KKworCXRtcCA9IHBvbGxfaTJjX2lycShJMkNfU1RBVF9TQ0QgfCBJMkNfU1RBVF9OQUNLKTsKKworCUNIRUNLX05BQ0soKTsKKworCWlmICghKHRtcCAmIEkyQ19TVEFUX1NDRCkpIHsKKwkJUkVHKEkyQ19DT04pID0gMDsKKwkJcmV0dXJuKDEpOworCX0KKworCWZsdXNoX3J4KCk7CisJUkVHKEkyQ19TVEFUKSA9IDB4ZmZmZjsKKwlSRUcoSTJDX0NOVCkgPSAwOworCVJFRyhJMkNfQ09OKSA9IDA7CisKKwlyZXR1cm4oMCk7Cit9CisKKworaW50IGkyY193cml0ZSh1X2ludDhfdCBjaGlwLCB1X2ludDMyX3QgYWRkciwgaW50IGFsZW4sIHVfaW50OF90ICpidWYsIGludCBsZW4pCit7CisJdV9pbnQzMl90CXRtcDsKKwlpbnQJCWk7CisKKwlpZiAoKGFsZW4gPCAwKSB8fCAoYWxlbiA+IDIpKSB7CisJCXByaW50ZigiJXMoKTogYm9ndXMgYWRkcmVzcyBsZW5ndGggJXhcbiIsIF9fRlVOQ1RJT05fXywgYWxlbik7CisJCXJldHVybigxKTsKKwl9CisJaWYgKGxlbiA8IDApIHsKKwkJcHJpbnRmKCIlcygpOiBib2d1cyBsZW5ndGggJXhcbiIsIF9fRlVOQ1RJT05fXywgbGVuKTsKKwkJcmV0dXJuKDEpOworCX0KKworCWlmICh3YWl0X2Zvcl9idXMoKSkge3JldHVybigxKTt9CisKKwkvKiBTdGFydCBhZGRyZXNzIHBoYXNlICovCisJdG1wID0gSTJDX0NPTl9FTiB8IEkyQ19DT05fTVNUIHwgSTJDX0NPTl9TVFQgfCBJMkNfQ09OX1RSWCB8IEkyQ19DT05fU1RQOworCVJFRyhJMkNfQ05UKSA9IChhbGVuID09IDApID8gbGVuICYgMHhmZmZmIDogKGxlbiAmIDB4ZmZmZikgKyBhbGVuOworCVJFRyhJMkNfU0EpID0gY2hpcDsKKwlSRUcoSTJDX0NPTikgPSB0bXA7CisKKwlzd2l0Y2ggKGFsZW4pIHsKKwkJY2FzZSAyOgorCQkJLyogU2VuZCBhZGRyZXNzIE1TQnl0ZSAqLworCQkJdG1wID0gcG9sbF9pMmNfaXJxKEkyQ19TVEFUX1hSRFkgfCBJMkNfU1RBVF9OQUNLKTsKKworCQkJQ0hFQ0tfTkFDSygpOworCisJCQlpZiAodG1wICYgSTJDX1NUQVRfWFJEWSkgeworCQkJCVJFRyhJMkNfRFhSKSA9IChhZGRyID4+IDgpICYgMHhmZjsKKwkJCX0gZWxzZSB7CisJCQkJUkVHKEkyQ19DT04pID0gMDsKKwkJCQlyZXR1cm4oMSk7CisJCQl9CisJCQkvKiBObyBicmVhaywgZmFsbCB0aHJvdWdoICovCisJCWNhc2UgMToKKwkJCS8qIFNlbmQgYWRkcmVzcyBMU0J5dGUgKi8KKwkJCXRtcCA9IHBvbGxfaTJjX2lycShJMkNfU1RBVF9YUkRZIHwgSTJDX1NUQVRfTkFDSyk7CisKKwkJCUNIRUNLX05BQ0soKTsKKworCQkJaWYgKHRtcCAmIEkyQ19TVEFUX1hSRFkpIHsKKwkJCQlSRUcoSTJDX0RYUikgPSBhZGRyICYgMHhmZjsKKwkJCX0gZWxzZSB7CisJCQkJUkVHKEkyQ19DT04pID0gMDsKKwkJCQlyZXR1cm4oMSk7CisJCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCXRtcCA9IHBvbGxfaTJjX2lycShJMkNfU1RBVF9YUkRZIHwgSTJDX1NUQVRfTkFDSyk7CisKKwkJQ0hFQ0tfTkFDSygpOworCisJCWlmICh0bXAgJiBJMkNfU1RBVF9YUkRZKSB7CisJCQlSRUcoSTJDX0RYUikgPSBidWZbaV07CisJCX0gZWxzZSB7CisJCQlyZXR1cm4oMSk7CisJCX0KKwl9CisKKwl0bXAgPSBwb2xsX2kyY19pcnEoSTJDX1NUQVRfU0NEIHwgSTJDX1NUQVRfTkFDSyk7CisKKwlDSEVDS19OQUNLKCk7CisKKwlpZiAoISh0bXAgJiBJMkNfU1RBVF9TQ0QpKSB7CisJCVJFRyhJMkNfQ09OKSA9IDA7CisJCXJldHVybigxKTsKKwl9CisKKwlmbHVzaF9yeCgpOworCVJFRyhJMkNfU1RBVCkgPSAweGZmZmY7CisJUkVHKEkyQ19DTlQpID0gMDsKKwlSRUcoSTJDX0NPTikgPSAwOworCisJcmV0dXJuKDApOworfQorCisKK3VfaW50OF90IGkyY19yZWdfcmVhZCh1X2ludDhfdCBjaGlwLCB1X2ludDhfdCByZWcpCit7CisJdV9pbnQ4X3QJdG1wOworCisJaTJjX3JlYWQoY2hpcCwgcmVnLCAxLCAmdG1wLCAxKTsKKwlyZXR1cm4odG1wKTsKK30KKworCit2b2lkIGkyY19yZWdfd3JpdGUodV9pbnQ4X3QgY2hpcCwgdV9pbnQ4X3QgcmVnLCB1X2ludDhfdCB2YWwpCit7CisJdV9pbnQ4X3QJdG1wOworCisJaTJjX3dyaXRlKGNoaXAsIHJlZywgMSwgJnRtcCwgMSk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfRFJJVkVSX0RBVklOQ0lfSTJDICovCmRpZmYgLS1naXQgYS9jcHUvYXJtOTI2ZWpzL2RhdmluY2kvbG93bGV2ZWxfaW5pdC5TIGIvY3B1L2FybTkyNmVqcy9kYXZpbmNpL2xvd2xldmVsX2luaXQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODdjMTEyCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L2FybTkyNmVqcy9kYXZpbmNpL2xvd2xldmVsX2luaXQuUwpAQCAtMCwwICsxLDcwNyBAQAorLyoKKyAqIExvdy1sZXZlbCBib2FyZCBzZXR1cCBjb2RlIGZvciBUSSBEYVZpbmNpIFNvQyBiYXNlZCBib2FyZHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorICoKKyAqIFBhcnRpYWxseSBiYXNlZCBvbiBUSSBzb3VyY2VzLCBvcmlnaW5hbCBjb3B5cmlnaHRzIGZvbGxvdzoKKyAqLworCisvKgorICogQm9hcmQgc3BlY2lmaWMgc2V0dXAgaW5mbworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMworICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogS3NoaXRpaiBHdXB0YSA8S3NoaXRpakB0aS5jb20+CisgKgorICogTW9kaWZpZWQgZm9yIE9NQVAgMTYxMCBIMiBib2FyZCBieSBOaXNoYW50IEthbWF0LCBKYW4gMjAwNAorICoKKyAqIE1vZGlmaWVkIGZvciBPTUFQIDU5MTIgT1NLIGJvYXJkIGJ5IFJpc2hpIEJoYXR0YWNoYXJ5YSwgQXByIDIwMDQKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIE1vZGlmaWVkIGZvciBEVi1FVk0gYm9hcmQgYnkgUmlzaGkgQmhhdHRhY2hhcnlhLCBBcHIgMjAwNQorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogTW9kaWZpZWQgZm9yIERWLUVWTSBib2FyZCBieSBTd2FtaW5hdGhhbiBTLCBOb3YgMjAwNQorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisuZ2xvYmwJbG93bGV2ZWxfaW5pdAorbG93bGV2ZWxfaW5pdDoKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKwkgKiBNYXNrIGFsbCBJUlFzIGJ5IHNldHRpbmcgYWxsIGJpdHMgaW4gdGhlIEVJTlQgZGVmYXVsdCAqCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwltb3YJcjEsICQwCisJbGRyCXIwLCA9RUlOVF9FTkFCTEUwCisJc3RyCXIxLCBbcjBdCisJbGRyCXIwLCA9RUlOVF9FTkFCTEUxCisJc3RyCXIxLCBbcjBdCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKwkgKiBQdXQgdGhlIEdFTSBpbiByZXNldAkJCQkJKgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCS8qIFB1dCB0aGUgR0VNIGluIHJlc2V0ICovCisJbGRyCXI4LCBQU0NfR0VNX0ZMQUdfQ0xFQVIKKwlsZHIJcjYsIE1EQ1RMX0dFTQorCWxkcglyNywgW3I2XQorCWFuZAlyNywgcjcsIHI4CisJc3RyCXI3LCBbcjZdCisKKwkvKiBFbmFibGUgdGhlIFBvd2VyIERvbWFpbiBUcmFuc2l0aW9uIENvbW1hbmQgKi8KKwlsZHIJcjYsIFBUQ01ECisJbGRyCXI3LCBbcjZdCisJb3JyCXI3LCByNywgJDB4MDIKKwlzdHIJcjcsIFtyNl0KKworCS8qIENoZWNrIGZvciBUcmFuc2l0aW9uIENvbXBsZXRlKFBUU1RBVCkgKi8KK2NoZWNrU3RhdENsa1N0b3BHZW06CisJbGRyCXI2LCBQVFNUQVQKKwlsZHIJcjcsIFtyNl0KKwlhbmRzCXI3LCByNywgJDB4MDIKKwlibmUJY2hlY2tTdGF0Q2xrU3RvcEdlbQorCisJLyogQ2hlY2sgZm9yIEdFTSBSZXNldCBDb21wbGV0aW9uICovCitjaGVja0dlbVN0YXRDbGtTdG9wOgorCWxkcglyNiwgTURTVEFUX0dFTQorCWxkcglyNywgW3I2XQorCWFuZHMJcjcsIHI3LCAkMHgxMDAKKwlibmUJY2hlY2tHZW1TdGF0Q2xrU3RvcAorCisJLyogRG8gdGhpcyBmb3IgZW5hYmxpbmcgYSBXRFQgaW5pdGlhdGVkIHJlc2V0IHRoaXMgaXMgYSB3b3JrYXJvdW5kCisJICAgZm9yIGEgY2hpcCBidWcuICBOb3QgcmVxdWlyZWQgdW5kZXIgbm9ybWFsIHNpdHVhdGlvbnMgKi8KKwlsZHIJcjYsIFAxMzk0CisJbW92CXIxMCwgJDAKKwlzdHIJcjEwLCBbcjZdCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKwkgKiBFbmFibGUgTDEgJiBMMiBNZW1vcmllcyBpbiBGYXN0IG1vZGUgICAgICAgICAgICAgICAgICoKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbGRyCXI2LCBERlRfRU5BQkxFCisJbW92CXIxMCwgJDB4MDEKKwlzdHIJcjEwLCBbcjZdCisKKwlsZHIJcjYsIE1NQVJHX0JSRjAKKwlsZHIJcjEwLCBNTUFSR19CUkYwX1ZBTAorCXN0cglyMTAsIFtyNl0KKworCWxkcglyNiwgREZUX0VOQUJMRQorCW1vdglyMTAsICQwCisJc3RyCXIxMCwgW3I2XQorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisJICogRERSMiBQTEwgSW5pdGlhbGl6YXRpb24JCQkgICAgCSoKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkvKiBTZWxlY3QgdGhlIENsb2NrIE1vZGUgRGVwZW5kaW5nIG9uIHRoZSBWYWx1ZSB3cml0dGVuIGluIHRoZSBCb290IFRhYmxlIGJ5IHRoZSBydW4gc2NyaXB0ICovCisJbW92CXIxMCwgJDAKKwlsZHIJcjYsIFBMTDJfQ1RMCisJbGRyCXI3LCBQTExfQ0xLU1JDX01BU0sKKwlsZHIJcjgsIFtyNl0KKwlhbmQJcjgsIHI4LCByNworCW1vdglyOSwgcjEwLCBsc2wgJDgKKwlvcnIJcjgsIHI4LCByOQorCXN0cglyOCwgW3I2XQorCisJLyogU2VsZWN0IHRoZSBQTExFTiBzb3VyY2UgKi8KKwlsZHIJcjcsIFBMTF9FTlNSQ19NQVNLCisJYW5kCXI4LCByOCwgcjcKKwlzdHIJcjgsIFtyNl0KKworCS8qIEJ5cGFzcyB0aGUgUExMICovCisJbGRyCXI3LCBQTExfQllQQVNTX01BU0sKKwlhbmQJcjgsIHI4LCByNworCXN0cglyOCwgW3I2XQorCisJLyogV2FpdCBmb3IgZmV3IGN5Y2xlcyB0byBhbGxvdyBQTExFTiBNdXggc3dpdGNoIHByb3Blcmx5IHRvIGJ5cGFzcyBDbG9jayAqLworCW1vdglyMTAsICQweDIwCitXYWl0UFBMMkxvb3A6CisJc3VicwlyMTAsIHIxMCwgJDEKKwlibmUJV2FpdFBQTDJMb29wCisKKwkvKiBSZXNldCB0aGUgUExMICovCisJbGRyCXI3LCBQTExfUkVTRVRfTUFTSworCWFuZAlyOCwgcjgsIHI3CisJc3RyCXI4LCBbcjZdCisKKwkvKiBQb3dlciB1cCB0aGUgUExMICovCisJbGRyCXI3LCBQTExfUFdSVVBfTUFTSworCWFuZAlyOCwgcjgsIHI3CisJc3RyCXI4LCBbcjZdCisKKwkvKiBFbmFibGUgdGhlIFBMTCBmcm9tIERpc2FibGUgTW9kZSAqLworCWxkcglyNywgUExMX0RJU0FCTEVfRU5BQkxFX01BU0sKKwlhbmQJcjgsIHI4LCByNworCXN0cglyOCwgW3I2XQorCisJLyogUHJvZ3JhbSB0aGUgUExMIE11bHRpcGxpZXIgKi8KKwlsZHIJcjYsIFBMTDJfUExMTQorCW1vdglyMiwgJDB4MTcJLyogMTYyIE1IeiAqLworCXN0cglyMiwgW3I2XQorCisJLyogUHJvZ3JhbSB0aGUgUExMMiBEaXZpc29yIFZhbHVlICovCisJbGRyCXI2LCBQTEwyX0RJVjIKKwltb3YJcjMsICQweDAxCisJc3RyCXIzLCBbcjZdCisKKwkvKiBQcm9ncmFtIHRoZSBQTEwyIERpdmlzb3IgVmFsdWUgKi8KKwlsZHIJcjYsIFBMTDJfRElWMQorCW1vdglyNCwgJDB4MGIJLyogNTQgTUh6ICovCisJc3RyCXI0LCBbcjZdCisKKwkvKiBQTEwyIERJVjIgTU1SICovCisJbGRyCXI4LCBQTEwyX0RJVl9NQVNLCisJbGRyCXI2LCBQTEwyX0RJVjIKKwlsZHIJcjksIFtyNl0KKwlhbmQJcjgsIHI4LCByOQorCW1vdglyOSwgJDB4MDEKKwltb3YJcjksIHI5LCBsc2wgJDE1CisJb3JyCXI4LCByOCwgcjkKKwlzdHIJcjgsIFtyNl0KKworCS8qIFByb2dyYW0gdGhlIEdPU0VUIGJpdCB0byB0YWtlIG5ldyBkaXZpZGVyIHZhbHVlcyAqLworCWxkcglyNiwgUExMMl9QTExDTUQKKwlsZHIJcjcsIFtyNl0KKwlvcnIJcjcsIHI3LCAkMHgwMQorCXN0cglyNywgW3I2XQorCisJLyogV2FpdCBmb3IgRG9uZSAqLworCWxkcglyNiwgUExMMl9QTExTVEFUCitkb25lTG9vcF8wOgorCWxkcglyNywgW3I2XQorCWFuZHMJcjcsIHI3LCAkMHgwMQorCWJuZQlkb25lTG9vcF8wCisKKwkvKiBQTEwyIERJVjEgTU1SICovCisJbGRyCXI4LCBQTEwyX0RJVl9NQVNLCisJbGRyCXI2LCBQTEwyX0RJVjEKKwlsZHIJcjksIFtyNl0KKwlhbmQJcjgsIHI4LCByOQorCW1vdglyOSwgJDB4MDEKKwltb3YJcjksIHI5LCBsc2wgJDE1CisJb3JyCXI4LCByOCwgcjkKKwlzdHIJcjgsIFtyNl0KKworCS8qIFByb2dyYW0gdGhlIEdPU0VUIGJpdCB0byB0YWtlIG5ldyBkaXZpZGVyIHZhbHVlcyAqLworCWxkcglyNiwgUExMMl9QTExDTUQKKwlsZHIJcjcsIFtyNl0KKwlvcnIJcjcsIHI3LCAkMHgwMQorCXN0cglyNywgW3I2XQorCisJLyogV2FpdCBmb3IgRG9uZSAqLworCWxkcglyNiwgUExMMl9QTExTVEFUCitkb25lTG9vcDoKKwlsZHIJcjcsIFtyNl0KKwlhbmRzCXI3LCByNywgJDB4MDEKKwlibmUJZG9uZUxvb3AKKworCS8qIFdhaXQgZm9yIFBMTCB0byBSZXNldCBQcm9wZXJseSAqLworCW1vdglyMTAsICQweDIxOAorUmVzZXRQUEwyTG9vcDoKKwlzdWJzCXIxMCwgcjEwLCAkMQorCWJuZQlSZXNldFBQTDJMb29wCisKKwkvKiBCcmluZyBQTEwgb3V0IG9mIFJlc2V0ICovCisJbGRyCXI2LCBQTEwyX0NUTAorCWxkcglyOCwgW3I2XQorCW9ycglyOCwgcjgsICQweDA4CisJc3RyCXI4LCBbcjZdCisKKwkvKiBXYWl0IGZvciBQTEwgdG8gTG9jayAqLworCWxkcglyMTAsIFBMTF9MT0NLX0NPVU5UCitQTEwyTG9jazoKKwlzdWJzCXIxMCwgcjEwLCAkMQorCWJuZQlQTEwyTG9jaworCisJLyogRW5hYmxlIHRoZSBQTEwgKi8KKwlsZHIJcjYsIFBMTDJfQ1RMCisJbGRyCXI4LCBbcjZdCisJb3JyCXI4LCByOCwgJDB4MDEKKwlzdHIJcjgsIFtyNl0KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorCSAqIElzc3VlIFNvZnQgUmVzZXQgdG8gRERSIE1vZHVsZQkJCSoKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkvKiBTaHV0IGRvd24gdGhlIEREUjIgTFBTQyBNb2R1bGUgKi8KKwlsZHIJcjgsIFBTQ19GTEFHX0NMRUFSCisJbGRyCXI2LCBNRENUTF9ERFIyCisJbGRyCXI3LCBbcjZdCisJYW5kCXI3LCByNywgcjgKKwlvcnIJcjcsIHI3LCAkMHgwMworCXN0cglyNywgW3I2XQorCisJLyogRW5hYmxlIHRoZSBQb3dlciBEb21haW4gVHJhbnNpdGlvbiBDb21tYW5kICovCisJbGRyCXI2LCBQVENNRAorCWxkcglyNywgW3I2XQorCW9ycglyNywgcjcsICQweDAxCisJc3RyCXI3LCBbcjZdCisKKwkvKiBDaGVjayBmb3IgVHJhbnNpdGlvbiBDb21wbGV0ZShQVFNUQVQpICovCitjaGVja1N0YXRDbGtTdG9wOgorCWxkcglyNiwgUFRTVEFUCisJbGRyCXI3LCBbcjZdCisJYW5kcwlyNywgcjcsICQweDAxCisJYm5lCWNoZWNrU3RhdENsa1N0b3AKKworCS8qIENoZWNrIGZvciBERFIyIENvbnRyb2xsZXIgRW5hYmxlIENvbXBsZXRpb24gKi8KK2NoZWNrRERSU3RhdENsa1N0b3A6CisJbGRyCXI2LCBNRFNUQVRfRERSMgorCWxkcglyNywgW3I2XQorCWFuZAlyNywgcjcsICQweDFmCisJY21wCXI3LCAkMHgwMworCWJuZQljaGVja0REUlN0YXRDbGtTdG9wCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKwkgKiBQcm9ncmFtIEREUjIgTU1ScyBmb3IgMTYyTUh6IFNldHRpbmcJCQkqCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJLyogUHJvZ3JhbSBQSFkgQ29udHJvbCBSZWdpc3RlciAqLworCWxkcglyNiwgRERSQ1RMCisJbGRyCXI3LCBERFJDVExfVkFMCisJc3RyCXI3LCBbcjZdCisKKwkvKiBQcm9ncmFtIFNEUkFNIEJhbmsgQ29uZmlnIFJlZ2lzdGVyICovCisJbGRyCXI2LCBTRENGRworCWxkcglyNywgU0RDRkdfVkFMCisJc3RyCXI3LCBbcjZdCisKKwkvKiBQcm9ncmFtIFNEUkFNIFRJTS0wIENvbmZpZyBSZWdpc3RlciAqLworCWxkcglyNiwgU0RUSU0wCisJbGRyCXI3LCBTRFRJTTBfVkFMXzE2Mk1IegorCXN0cglyNywgW3I2XQorCisJLyogUHJvZ3JhbSBTRFJBTSBUSU0tMSBDb25maWcgUmVnaXN0ZXIgKi8KKwlsZHIJcjYsIFNEVElNMQorCWxkcglyNywgU0RUSU0xX1ZBTF8xNjJNSHoKKwlzdHIJcjcsIFtyNl0KKworCS8qIFByb2dyYW0gdGhlIFNEUkFNIEJhbmsgQ29uZmlnIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwlsZHIJcjEwLCBNQVNLX1ZBTAorCWxkcglyOCwgU0RDRkcKKwlsZHIJcjksIFNEQ0ZHX1ZBTAorCWFuZAlyOSwgcjksIHIxMAorCXN0cglyOSwgW3I4XQorCisJLyogUHJvZ3JhbSBTRFJBTSBTRFJFRiBDb25maWcgUmVnaXN0ZXIgKi8KKwlsZHIJcjYsIFNEUkVGCisJbGRyCXI3LCBTRFJFRl9WQUwKKwlzdHIJcjcsIFtyNl0KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorCSAqIElzc3VlIFNvZnQgUmVzZXQgdG8gRERSIE1vZHVsZQkJCSoKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkvKiBJc3N1ZSBhIER1bW15IEREUjIgcmVhZC93cml0ZSAqLworCWxkcglyOCwgRERSMl9TVEFSVF9BRERSCisJbGRyCXI3LCBEVU1NWV9WQUwKKwlzdHIJcjcsIFtyOF0KKwlsZHIJcjcsIFtyOF0KKworCS8qIFNodXQgZG93biB0aGUgRERSMiBMUFNDIE1vZHVsZSAqLworCWxkcglyOCwgUFNDX0ZMQUdfQ0xFQVIKKwlsZHIJcjYsIE1EQ1RMX0REUjIKKwlsZHIJcjcsIFtyNl0KKwlhbmQJcjcsIHI3LCByOAorCW9ycglyNywgcjcsICQweDAxCisJc3RyCXI3LCBbcjZdCisKKwkvKiBFbmFibGUgdGhlIFBvd2VyIERvbWFpbiBUcmFuc2l0aW9uIENvbW1hbmQgKi8KKwlsZHIJcjYsIFBUQ01ECisJbGRyCXI3LCBbcjZdCisJb3JyCXI3LCByNywgJDB4MDEKKwlzdHIJcjcsIFtyNl0KKworCS8qIENoZWNrIGZvciBUcmFuc2l0aW9uIENvbXBsZXRlKFBUU1RBVCkgKi8KK2NoZWNrU3RhdENsa1N0b3AyOgorCWxkcglyNiwgUFRTVEFUCisJbGRyCXI3LCBbcjZdCisJYW5kcwlyNywgcjcsICQweDAxCisJYm5lCWNoZWNrU3RhdENsa1N0b3AyCisKKwkvKiBDaGVjayBmb3IgRERSMiBDb250cm9sbGVyIEVuYWJsZSBDb21wbGV0aW9uICovCitjaGVja0REUlN0YXRDbGtTdG9wMjoKKwlsZHIJcjYsIE1EU1RBVF9ERFIyCisJbGRyCXI3LCBbcjZdCisJYW5kCXI3LCByNywgJDB4MWYKKwljbXAJcjcsICQweDAxCisJYm5lCWNoZWNrRERSU3RhdENsa1N0b3AyCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKwkgKiBUdXJuIEREUjIgQ29udHJvbGxlciBDbG9ja3MgT24JCQkqCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJLyogRW5hYmxlIHRoZSBERFIyIExQU0MgTW9kdWxlICovCisJbGRyCXI2LCBNRENUTF9ERFIyCisJbGRyCXI3LCBbcjZdCisJb3JyCXI3LCByNywgJDB4MDMKKwlzdHIJcjcsIFtyNl0KKworCS8qIEVuYWJsZSB0aGUgUG93ZXIgRG9tYWluIFRyYW5zaXRpb24gQ29tbWFuZCAqLworCWxkcglyNiwgUFRDTUQKKwlsZHIJcjcsIFtyNl0KKwlvcnIJcjcsIHI3LCAkMHgwMQorCXN0cglyNywgW3I2XQorCisJLyogQ2hlY2sgZm9yIFRyYW5zaXRpb24gQ29tcGxldGUoUFRTVEFUKSAqLworY2hlY2tTdGF0Q2xrRW4yOgorCWxkcglyNiwgUFRTVEFUCisJbGRyCXI3LCBbcjZdCisJYW5kcwlyNywgcjcsICQweDAxCisJYm5lCWNoZWNrU3RhdENsa0VuMgorCisJLyogQ2hlY2sgZm9yIEREUjIgQ29udHJvbGxlciBFbmFibGUgQ29tcGxldGlvbiAqLworY2hlY2tERFJTdGF0Q2xrRW4yOgorCWxkcglyNiwgTURTVEFUX0REUjIKKwlsZHIJcjcsIFtyNl0KKwlhbmQJcjcsIHI3LCAkMHgxZgorCWNtcAlyNywgJDB4MDMKKwlibmUJY2hlY2tERFJTdGF0Q2xrRW4yCisKKwkvKiAgRERSIFdyaXRlcyBhbmQgUmVhZHMgKi8KKwlsZHIJcjYsIENGR1RFU1QKKwltb3YJcjMsICQweDAxCisJc3RyCXIzLCBbcjZdCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKwkgKiBTeXN0ZW0gUExMIEluaXRpYWxpemF0aW9uCQkJCSoKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkvKiBTZWxlY3QgdGhlIENsb2NrIE1vZGUgRGVwZW5kaW5nIG9uIHRoZSBWYWx1ZSB3cml0dGVuIGluIHRoZSBCb290IFRhYmxlIGJ5IHRoZSBydW4gc2NyaXB0ICovCisJbW92CXIyLCAkMAorCWxkcglyNiwgUExMMV9DVEwKKwlsZHIJcjcsIFBMTF9DTEtTUkNfTUFTSworCWxkcglyOCwgW3I2XQorCWFuZAlyOCwgcjgsIHI3CisJbW92CXI5LCByMiwgbHNsICQ4CisJb3JyCXI4LCByOCwgcjkKKwlzdHIJcjgsIFtyNl0KKworCS8qIFNlbGVjdCB0aGUgUExMRU4gc291cmNlICovCisJbGRyCXI3LCBQTExfRU5TUkNfTUFTSworCWFuZAlyOCwgcjgsIHI3CisJc3RyCXI4LCBbcjZdCisKKwkvKiBCeXBhc3MgdGhlIFBMTCAqLworCWxkcglyNywgUExMX0JZUEFTU19NQVNLCisJYW5kCXI4LCByOCwgcjcKKwlzdHIJcjgsIFtyNl0KKworCS8qIFdhaXQgZm9yIGZldyBjeWNsZXMgdG8gYWxsb3cgUExMRU4gTXV4IHN3aXRjaCBwcm9wZXJseSB0byBieXBhc3MgQ2xvY2sgKi8KKwltb3YJcjEwLCAkMHgyMAorCitXYWl0TG9vcDoKKwlzdWJzCXIxMCwgcjEwLCAkMQorCWJuZQlXYWl0TG9vcAorCisJLyogUmVzZXQgdGhlIFBMTCAqLworCWxkcglyNywgUExMX1JFU0VUX01BU0sKKwlhbmQJcjgsIHI4LCByNworCXN0cglyOCwgW3I2XQorCisJLyogRGlzYWJsZSB0aGUgUExMICovCisJb3JyCXI4LCByOCwgJDB4MTAKKwlzdHIJcjgsIFtyNl0KKworCS8qIFBvd2VyIHVwIHRoZSBQTEwgKi8KKwlsZHIJcjcsIFBMTF9QV1JVUF9NQVNLCisJYW5kCXI4LCByOCwgcjcKKwlzdHIJcjgsIFtyNl0KKworCS8qIEVuYWJsZSB0aGUgUExMIGZyb20gRGlzYWJsZSBNb2RlICovCisJbGRyCXI3LCBQTExfRElTQUJMRV9FTkFCTEVfTUFTSworCWFuZAlyOCwgcjgsIHI3CisJc3RyCXI4LCBbcjZdCisKKwkvKiBQcm9ncmFtIHRoZSBQTEwgTXVsdGlwbGllciAqLworCWxkcglyNiwgUExMMV9QTExNCisJbW92CXIzLCAkMHgxNQkvKiBGb3IgNTk0TUh6ICovCisJc3RyCXIzLCBbcjZdCisKKwkvKiBXYWl0IGZvciBQTEwgdG8gUmVzZXQgUHJvcGVybHkgKi8KKwltb3YJcjEwLCAkMHhmZgorCitSZXNldExvb3A6CisJc3VicwlyMTAsIHIxMCwgJDEKKwlibmUJUmVzZXRMb29wCisKKwkvKiBCcmluZyBQTEwgb3V0IG9mIFJlc2V0ICovCisJbGRyCXI2LCBQTEwxX0NUTAorCW9ycglyOCwgcjgsICQweDA4CisJc3RyCXI4LCBbcjZdCisKKwkvKiBXYWl0IGZvciBQTEwgdG8gTG9jayAqLworCWxkcglyMTAsIFBMTF9MT0NLX0NPVU5UCisKK1BMTDFMb2NrOgorCXN1YnMJcjEwLCByMTAsICQxCisJYm5lCVBMTDFMb2NrCisKKwkvKiBFbmFibGUgdGhlIFBMTCAqLworCW9ycglyOCwgcjgsICQweDAxCisJc3RyCXI4LCBbcjZdCisKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorCSAqIEFFTUlGIGNvbmZpZ3VyYXRpb24gZm9yIE5PUiBGbGFzaCAoZG91YmxlIGNoZWNrKSAgICAgKgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlsZHIJcjAsIF9QSU5NVVgwCisJbGRyCXIxLCBfREVWX1NFVFRJTkcKKwlzdHIJcjEsIFtyMF0KKworCWxkcglyMCwgV0FJVENGRworCWxkcglyMSwgV0FJVENGR19WQUwKKwlsZHIJcjIsIFtyMF0KKwlvcnIJcjIsIHIyLCByMQorCXN0cglyMiwgW3IwXQorCisJbGRyCXIwLCBBQ0ZHMworCWxkcglyMSwgQUNGRzNfVkFMCisJbGRyCXIyLCBbcjBdCisJYW5kCXIxLCByMiwgcjEKKwlzdHIJcjEsIFtyMF0KKworCWxkcglyMCwgQUNGRzQKKwlsZHIJcjEsIEFDRkc0X1ZBTAorCWxkcglyMiwgW3IwXQorCWFuZAlyMSwgcjIsIHIxCisJc3RyCXIxLCBbcjBdCisKKwlsZHIJcjAsIEFDRkc1CisJbGRyCXIxLCBBQ0ZHNV9WQUwKKwlsZHIJcjIsIFtyMF0KKwlhbmQJcjEsIHIyLCByMQorCXN0cglyMSwgW3IwXQorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKwkgKiBWVFAgbWFudWFsIENhbGlicmF0aW9uICAgICAgICAgICAgICAgKgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWxkcglyMCwgVlRQSU9DUgorCWxkcglyMSwgVlRQX01NUjAKKwlzdHIJcjEsIFtyMF0KKworCWxkcglyMCwgVlRQSU9DUgorCWxkcglyMSwgVlRQX01NUjEKKwlzdHIJcjEsIFtyMF0KKworCS8qIFdhaXQgZm9yIDMzIFZUUCBDTEsgY3ljbGVzLiAgVlJQIG9wZXJhdGVzIGF0IDI3IE1IeiAqLworCWxkcglyMTAsIFZUUF9MT0NLX0NPVU5UCitWVFBMb2NrOgorCXN1YnMJcjEwLCByMTAsICQxCisJYm5lCVZUUExvY2sKKworCWxkcglyNiwgREZUX0VOQUJMRQorCW1vdglyMTAsICQweDAxCisJc3RyCXIxMCwgW3I2XQorCisJbGRyCXI2LCBERFJWVFBSCisJbGRyCXI3LCBbcjZdCisJYW5kCXI3LCByNywgJDB4MWYKKwlhbmQJcjgsIHI3LCAkMHgzZTAKKwlvcnIJcjgsIHI3LCByOAorCWxkcglyNywgVlRQX1JFQ0FMCisJb3JyCXI4LCByNywgcjgKKwlsZHIJcjcsIFZUUF9FTgorCW9ycglyOCwgcjcsIHI4CisJc3RyCXI4LCBbcjBdCisKKworCS8qIFdhaXQgZm9yIDMzIFZUUCBDTEsgY3ljbGVzLiAgVlJQIG9wZXJhdGVzIGF0IDI3IE1IeiAqLworCWxkcglyMTAsIFZUUF9MT0NLX0NPVU5UCitWVFAxTG9jazoKKwlzdWJzCXIxMCwgcjEwLCAkMQorCWJuZQlWVFAxTG9jaworCisJbGRyCXIxLCBbcjBdCisJbGRyCXIyLCBWVFBfTUFTSworCWFuZAlyMiwgcjEsIHIyCisJc3RyCXIyLCBbcjBdCisKKwlsZHIJcjYsIERGVF9FTkFCTEUKKwltb3YJcjEwLCAkMAorCXN0cglyMTAsIFtyNl0KKworCS8qCisJICogQ2FsbCBib2FyZC1zcGVjaWZpYyBsb3dsZXZlbCBpbml0LgorIAkgKiBUaGF0IE1VU1QgYmUgcHJlc2VudCBhbmQgVEhBVCByZXR1cm5zCisJICogYmFjayB0byBhcmNoIGNhbGxpbmcgY29kZSB3aXRoICJtb3YgcGMsIGxyLiIKKwkgKi8KKwliCWR2X2JvYXJkX2luaXQKKworLmx0b3JnCisKK19QSU5NVVgwOgorCS53b3JkCTB4MDFjNDAwMDAJCS8qIERldmljZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVycyAqLworX1BJTk1VWDE6CisJLndvcmQJMHgwMWM0MDAwNAkJLyogRGV2aWNlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXJzICovCisKK19ERVZfU0VUVElORzoKKwkud29yZAkweDAwMDAwYzFmCisKK1dBSVRDRkc6CisJLndvcmQJMHgwMWUwMDAwNAorV0FJVENGR19WQUw6CisJLndvcmQJMAorQUNGRzM6CisJLndvcmQJMHgwMWUwMDAxNAorQUNGRzNfVkFMOgorCS53b3JkCTB4M2ZmZmZmZmQKK0FDRkc0OgorCS53b3JkCTB4MDFlMDAwMTgKK0FDRkc0X1ZBTDoKKwkud29yZAkweDNmZmZmZmZkCitBQ0ZHNToKKwkud29yZAkweDAxZTAwMDFjCitBQ0ZHNV9WQUw6CisJLndvcmQJMHgzZmZmZmZmZAorCitNRENUTF9ERFIyOgorCS53b3JkCTB4MDFjNDFhMzQKK01EU1RBVF9ERFIyOgorCS53b3JkCTB4MDFjNDE4MzQKKworUFRDTUQ6CisJLndvcmQJMHgwMWM0MTEyMAorUFRTVEFUOgorCS53b3JkCTB4MDFjNDExMjgKKworRUlOVF9FTkFCTEUwOgorCS53b3JkCTB4MDFjNDgwMTgKK0VJTlRfRU5BQkxFMToKKwkud29yZAkweDAxYzQ4MDFjCisKK1BTQ19GTEFHX0NMRUFSOgorCS53b3JkCTB4ZmZmZmZmZTAKK1BTQ19HRU1fRkxBR19DTEVBUjoKKwkud29yZAkweGZmZmZmZWZmCisKKy8qIEREUjIgTU1SICYgQ09ORklHVVJBVElPTiBWQUxVRVMsIDE2MiBNSFogY2xvY2sgKi8KK0REUkNUTDoKKwkud29yZAkweDIwMDAwMGU0CitERFJDVExfVkFMOgorCS53b3JkCTB4NTAwMDY0MDUKK1NEUkVGOgorCS53b3JkCTB4MjAwMDAwMGMKK1NEUkVGX1ZBTDoKKwkud29yZAkweDAwMDAwNWMzCitTRENGRzoKKwkud29yZAkweDIwMDAwMDA4CitTRENGR19WQUw6CisjaWZkZWYJRERSXzRCQU5LUworCS53b3JkCTB4MDAxNzg2MjIKKyNlbGlmIGRlZmluZWQgRERSXzhCQU5LUworCS53b3JkCTB4MDAxNzg2MzIKKyNlbHNlCisjZXJyb3IgIlVua25vd24gRERSIGNvbmZpZ3VyYXRpb24hISEiCisjZW5kaWYKK1NEVElNMDoKKwkud29yZAkweDIwMDAwMDEwCitTRFRJTTBfVkFMXzE2Mk1IejoKKwkud29yZAkweDI4OTIzMjExCitTRFRJTTE6CisJLndvcmQJMHgyMDAwMDAxNAorU0RUSU0xX1ZBTF8xNjJNSHo6CisJLndvcmQJMHgwMDE2YzcyMgorVlRQSU9DUjoKKwkud29yZAkweDIwMDAwMGYwCS8qIFZUUCBJTyBDb250cm9sIHJlZ2lzdGVyICovCitERFJWVFBSOgorCS53b3JkCTB4MDFjNDIwMzAJLyogRERSIFZQVFIgTU1SICovCitWVFBfTU1SMDoKKwkud29yZAkweDIwMWYKK1ZUUF9NTVIxOgorCS53b3JkCTB4YTAxZgorREZUX0VOQUJMRToKKwkud29yZAkweDAxYzQwMDRjCitWVFBfTE9DS19DT1VOVDoKKwkud29yZAkweDViMAorVlRQX01BU0s6CisJLndvcmQJMHhmZmZmZGZmZgorVlRQX1JFQ0FMOgorCS53b3JkCTB4NDAwMDAKK1ZUUF9FTjoKKwkud29yZAkweDAyMDAwCitDRkdURVNUOgorCS53b3JkCTB4ODAwMTAwMDAKK01BU0tfVkFMOgorCS53b3JkCTB4MDAwMDBmZmYKKworLyogR0VNIFBvd2VyIFVwICYgTFBTQyBDb250cm9sIFJlZ2lzdGVyICovCitNRENUTF9HRU06CisJLndvcmQJMHgwMWM0MWE5YworTURTVEFUX0dFTToKKwkud29yZAkweDAxYzQxODljCisKKy8qIEZvciBXRFQgcmVzZXQgY2hpcCBidWcgKi8KK1AxMzk0OgorCS53b3JkCTB4MDFjNDFhMjAKKworUExMX0NMS1NSQ19NQVNLOgorCS53b3JkCTB4ZmZmZmZlZmYJLyogTWFzayB0aGUgQ2xvY2sgTW9kZSBiaXQgKi8KK1BMTF9FTlNSQ19NQVNLOgorCS53b3JkCTB4ZmZmZmZmZGYJLyogU2VsZWN0IHRoZSBQTExFTiBzb3VyY2UgKi8KK1BMTF9CWVBBU1NfTUFTSzoKKwkud29yZAkweGZmZmZmZmZlCS8qIFB1dCB0aGUgUExMIGluIEJZUEFTUyAqLworUExMX1JFU0VUX01BU0s6CisJLndvcmQJMHhmZmZmZmZmNwkvKiBQdXQgdGhlIFBMTCBpbiBSZXNldCBNb2RlICovCitQTExfUFdSVVBfTUFTSzoKKwkud29yZAkweGZmZmZmZmZkCS8qIFBMTCBQb3dlciB1cCBNYXNrIEJpdCAgKi8KK1BMTF9ESVNBQkxFX0VOQUJMRV9NQVNLOgorCS53b3JkCTB4ZmZmZmZmZWYJLyogRW5hYmxlIHRoZSBQTEwgZnJvbSBEaXNhYmxlICovCitQTExfTE9DS19DT1VOVDoKKwkud29yZAkweDIwMDAKKworLyogUExMMS1TWVNURU0gUExMIE1NUnMgKi8KK1BMTDFfQ1RMOgorCS53b3JkCTB4MDFjNDA5MDAKK1BMTDFfUExMTToKKwkud29yZAkweDAxYzQwOTEwCisKKy8qIFBMTDItU1lTVEVNIFBMTCBNTVJzICovCitQTEwyX0NUTDoKKwkud29yZAkweDAxYzQwZDAwCitQTEwyX1BMTE06CisJLndvcmQJMHgwMWM0MGQxMAorUExMMl9ESVYxOgorCS53b3JkCTB4MDFjNDBkMTgKK1BMTDJfRElWMjoKKwkud29yZAkweDAxYzQwZDFjCitQTEwyX1BMTENNRDoKKwkud29yZAkweDAxYzQwZDM4CitQTEwyX1BMTFNUQVQ6CisJLndvcmQJMHgwMWM0MGQzYworUExMMl9ESVZfTUFTSzoKKwkud29yZAkweGZmZmY3ZmZmCisKK01NQVJHX0JSRjA6CisJLndvcmQJMHgwMWM0MjAxMAkvKiBCUkYgbWFyZ2luIG1vZGUgMCAoUi9XKSovCitNTUFSR19CUkYwX1ZBTDoKKwkud29yZAkweDAwNDQ0NDAwCisKK0REUjJfU1RBUlRfQUREUjoKKwkud29yZAkweDgwMDAwMDAwCitEVU1NWV9WQUw6CisJLndvcmQJMHhhNTVhYTU1YQpkaWZmIC0tZ2l0IGEvY3B1L2FybTkyNmVqcy9kYXZpbmNpL2x4dDk3Mi5jIGIvY3B1L2FybTkyNmVqcy9kYXZpbmNpL2x4dDk3Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZWI2ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvYXJtOTI2ZWpzL2RhdmluY2kvbHh0OTcyLmMKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBJbnRlbCBMWFQ5NzEvTFhUOTcyIFBIWSBEcml2ZXIgZm9yIFRJIERhVmluY2kKKyAqIChUTVMzMjBETTY0NHgpIGJhc2VkIGJvYXJkcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bmV0Lmg+CisjaW5jbHVkZSA8bHh0OTcxYS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2VtYWNfZGVmcy5oPgorCisjaWZkZWYgQ09ORklHX0RSSVZFUl9USV9FTUFDCisKKyNpZmRlZiBDT05GSUdfQ01EX05FVAorCitpbnQgbHh0OTcyX2lzX3BoeV9jb25uZWN0ZWQoaW50IHBoeV9hZGRyKQoreworCXVfaW50MTZfdAlpZDEsIGlkMjsKKworCWlmICghZG02NDR4X2V0aF9waHlfcmVhZChwaHlfYWRkciwgUEhZX0NPTU1PTl9JRDEsICZpZDEpKQorCQlyZXR1cm4oMCk7CisJaWYgKCFkbTY0NHhfZXRoX3BoeV9yZWFkKHBoeV9hZGRyLCBQSFlfQ09NTU9OX0lEMiwgJmlkMikpCisJCXJldHVybigwKTsKKworCWlmICgoaWQxID09ICgweDAwMTMpKSAmJiAoKGlkMiAgJiAweGZmZjApID09IDB4NzhlMCkpCisJCXJldHVybigxKTsKKworCXJldHVybigwKTsKK30KKworaW50IGx4dDk3Ml9nZXRfbGlua19zcGVlZChpbnQgcGh5X2FkZHIpCit7CisJdV9pbnQxNl90CQlzdGF0MSwgdG1wOworCXZvbGF0aWxlIGVtYWNfcmVncyoJZW1hYyA9IChlbWFjX3JlZ3MgKilFTUFDX0JBU0VfQUREUjsKKworCWlmICghZG02NDR4X2V0aF9waHlfcmVhZChwaHlfYWRkciwgUEhZX0xYVDk3MV9TVEFUMiwgJnN0YXQxKSkKKwkJcmV0dXJuKDApOworCisJaWYgKCEoc3RhdDEgJiBQSFlfTFhUOTcxX1NUQVQyX0xJTkspKQkvKiBsaW5rIHVwPyAqLworCQlyZXR1cm4oMCk7CisKKwlpZiAoIWRtNjQ0eF9ldGhfcGh5X3JlYWQocGh5X2FkZHIsIFBIWV9MWFQ5NzFfRElHX0NGRywgJnRtcCkpCisJCXJldHVybigwKTsKKworCXRtcCB8PSBQSFlfTFhUOTcxX0RJR19DRkdfTUlJX0RSSVZFOworCisJZG02NDR4X2V0aF9waHlfd3JpdGUocGh5X2FkZHIsIFBIWV9MWFQ5NzFfRElHX0NGRywgdG1wKTsKKwkvKiBSZWFkIGJhY2sgKi8KKwlpZiAoIWRtNjQ0eF9ldGhfcGh5X3JlYWQocGh5X2FkZHIsIFBIWV9MWFQ5NzFfRElHX0NGRywgJnRtcCkpCisJCXJldHVybigwKTsKKworCisJLyogU3BlZWQgZG9lc24ndCBtYXR0ZXIsIHRoZXJlIGlzIG5vIHNldHRpbmcgZm9yIGl0IGluIEVNQUMuLi4gKi8KKwlpZiAoc3RhdDEgJiBQSFlfTFhUOTcxX1NUQVQyXzEwMEJUWCkgeworCQlpZiAoc3RhdDEgJiBQSFlfTFhUOTcxX1NUQVQyX0RVUExFWF9NT0RFKSB7CisJCQkvKiBzZXQgRE02NDR4IEVNQUMgZm9yIEZ1bGwgRHVwbGV4ICAqLworCQkJZW1hYy0+TUFDQ09OVFJPTCA9IEVNQUNfTUFDQ09OVFJPTF9NSUlFTl9FTkFCTEUgfCBFTUFDX01BQ0NPTlRST0xfRlVMTERVUExFWF9FTkFCTEU7CisJCX0gZWxzZSB7CisJCQkvKnNldCBETTY0NHggRU1BQyBmb3IgSGFsZiBEdXBsZXggICovCisJCQllbWFjLT5NQUNDT05UUk9MID0gRU1BQ19NQUNDT05UUk9MX01JSUVOX0VOQUJMRTsKKwkJfQorCisJCXJldHVybigxKTsKKwl9IGVsc2UgeworCQlpZiAoc3RhdDEgJiBQSFlfTFhUOTcxX1NUQVQyX0RVUExFWF9NT0RFKSB7CisJCQkvKiBzZXQgRE02NDR4IEVNQUMgZm9yIEZ1bGwgRHVwbGV4ICAqLworCQkJZW1hYy0+TUFDQ09OVFJPTCA9IEVNQUNfTUFDQ09OVFJPTF9NSUlFTl9FTkFCTEUgfCBFTUFDX01BQ0NPTlRST0xfRlVMTERVUExFWF9FTkFCTEU7CisJCX0gZWxzZSB7CisJCQkvKnNldCBETTY0NHggRU1BQyBmb3IgSGFsZiBEdXBsZXggICovCisJCQllbWFjLT5NQUNDT05UUk9MID0gRU1BQ19NQUNDT05UUk9MX01JSUVOX0VOQUJMRTsKKwkJfQorCisJCXJldHVybigxKTsKKwl9CisKKwlyZXR1cm4oMCk7Cit9CisKKworaW50IGx4dDk3Ml9pbml0X3BoeShpbnQgcGh5X2FkZHIpCit7CisJaW50CXJldCA9IDE7CisKKwlpZiAoIWx4dDk3Ml9nZXRfbGlua19zcGVlZChwaHlfYWRkcikpIHsKKwkJLyogVHJ5IGFub3RoZXIgdGltZSAqLworCQlyZXQgPSBseHQ5NzJfZ2V0X2xpbmtfc3BlZWQocGh5X2FkZHIpOworCX0KKworCS8qIERpc2FibGUgUEhZIEludGVycnVwdHMgKi8KKwlkbTY0NHhfZXRoX3BoeV93cml0ZShwaHlfYWRkciwgUEhZX0xYVDk3MV9JTlRfRU5BQkxFLCAwKTsKKworCXJldHVybihyZXQpOworfQorCisKK2ludCBseHQ5NzJfYXV0b19uZWdvdGlhdGUoaW50IHBoeV9hZGRyKQoreworCXVfaW50MTZfdAl0bXA7CisKKworCWlmICghZG02NDR4X2V0aF9waHlfcmVhZChwaHlfYWRkciwgUEhZX0NPTU1PTl9DVFJMLCAmdG1wKSkKKwkJcmV0dXJuKDApOworCisJLyogUmVzdGFydCBBdXRvX25lZ290aWF0aW9uICAqLworCXRtcCB8PSBQSFlfQ09NTU9OX0NUUkxfUkVTX0FVVE87CisJZG02NDR4X2V0aF9waHlfd3JpdGUocGh5X2FkZHIsIFBIWV9DT01NT05fQ1RSTCwgdG1wKTsKKworCS8qY2hlY2sgQXV0b05lZ290aWF0ZSBjb21wbGV0ZSAqLworCXVkZWxheSAoMTAwMDApOworCWlmICghZG02NDR4X2V0aF9waHlfcmVhZChwaHlfYWRkciwgUEhZX0NPTU1PTl9TVEFULCAmdG1wKSkKKwkJcmV0dXJuKDApOworCisJaWYgKCEodG1wICYgUEhZX0NPTU1PTl9TVEFUX0FOX0NPTVApKQorCQlyZXR1cm4oMCk7CisKKwlyZXR1cm4gKGx4dDk3Ml9nZXRfbGlua19zcGVlZChwaHlfYWRkcikpOworfQorCisjZW5kaWYJLyogQ09ORklHX0NNRF9ORVQgKi8KKworI2VuZGlmCS8qIENPTkZJR19EUklWRVJfRVRIRVIgKi8KZGlmZiAtLWdpdCBhL2NwdS9hcm05MjZlanMvZGF2aW5jaS9uYW5kLmMgYi9jcHUvYXJtOTI2ZWpzL2RhdmluY2kvbmFuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyN2JlOWYKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvYXJtOTI2ZWpzL2RhdmluY2kvbmFuZC5jCkBAIC0wLDAgKzEsMzg5IEBACisvKgorICogTkFORCBkcml2ZXIgZm9yIFRJIERhVmluY2kgYmFzZWQgYm9hcmRzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKyAqCisgKiBCYXNlZCBvbiBMaW51eCBEYVZpbmNpIE5BTkQgZHJpdmVyIGJ5IFRJLiBPcmlnaW5hbCBjb3B5cmlnaHQgZm9sbG93czoKKyAqLworCisvKgorICoKKyAqIGxpbnV4L2RyaXZlcnMvbXRkL25hbmQvbmFuZF9kYXZpbmNpLmMKKyAqCisgKiBOQU5EIEZsYXNoIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUZXhhcyBJbnN0cnVtZW50cy4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogIE92ZXJ2aWV3OgorICogICBUaGlzIGlzIGEgZGV2aWNlIGRyaXZlciBmb3IgdGhlIE5BTkQgZmxhc2ggZGV2aWNlIGZvdW5kIG9uIHRoZQorICogICBEYVZpbmNpIGJvYXJkIHdoaWNoIHV0aWxpemVzIHRoZSBTYW1zdW5nIGs5azJnMDggcGFydC4KKyAqCisgTW9kaWZpY2F0aW9uczoKKyB2ZXIuIDEuMDogRmViIDIwMDUsIFZpbm9kL1N1ZGhha2FyCisgLQorICoKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDRkdfVVNFX05BTkQKKyNpZiAhZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCisKKyNpbmNsdWRlIDxuYW5kLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbmFuZF9kZWZzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvZW1pZl9kZWZzLmg+CisKK2V4dGVybiBzdHJ1Y3QgbmFuZF9jaGlwIG5hbmRfZGV2X2Rlc2NbQ0ZHX01BWF9OQU5EX0RFVklDRV07CisKK3N0YXRpYyB2b2lkIG5hbmRfZGF2aW5jaV9od2NvbnRyb2woc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBjbWQpCit7CisJc3RydWN0CQluYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisJdV9pbnQzMl90CUlPX0FERFJfVyA9ICh1X2ludDMyX3QpdGhpcy0+SU9fQUREUl9XOworCisJSU9fQUREUl9XICY9IH4oTUFTS19BTEV8TUFTS19DTEUpOworCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBOQU5EX0NUTF9TRVRDTEU6CisJCQlJT19BRERSX1cgfD0gTUFTS19DTEU7CisJCQlicmVhazsKKwkJY2FzZSBOQU5EX0NUTF9TRVRBTEU6CisJCQlJT19BRERSX1cgfD0gTUFTS19BTEU7CisJCQlicmVhazsKKwl9CisKKwl0aGlzLT5JT19BRERSX1cgPSAodm9pZCAqKUlPX0FERFJfVzsKK30KKworLyogU2V0IFdQIG9uIGRlc2VsZWN0LCB3cml0ZSBlbmFibGUgb24gc2VsZWN0ICovCitzdGF0aWMgdm9pZCBuYW5kX2RhdmluY2lfc2VsZWN0X2NoaXAoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBjaGlwKQoreworI2RlZmluZSBHUElPX1NFVF9EQVRBMDEJMHgwMWM2NzAxOAorI2RlZmluZSBHUElPX0NMUl9EQVRBMDEJMHgwMWM2NzAxYworI2RlZmluZSBHUElPX05BTkRfV1AJKDEgPDwgNCkKKyNpZmRlZiBTT05BVEFfQk9BUkRfR1BJT1dQCisJaWYgKGNoaXAgPCAwKSB7CisJCVJFRyhHUElPX0NMUl9EQVRBMDEpIHw9IEdQSU9fTkFORF9XUDsKKwl9IGVsc2UgeworCQlSRUcoR1BJT19TRVRfREFUQTAxKSB8PSBHUElPX05BTkRfV1A7CisJfQorI2VuZGlmCit9CisKKyNpZmRlZiBDRkdfTkFORF9IV19FQ0MKKyNpZmRlZiBDRkdfTkFORF9MQVJHRVBBR0UKK3N0YXRpYyBzdHJ1Y3QgbmFuZF9vb2JpbmZvIGRhdmluY2lfbmFuZF9vb2JpbmZvID0geworCS51c2VlY2MgPSBNVERfTkFOREVDQ19BVVRPUExBQ0UsCisJLmVjY2J5dGVzID0gMTIsCisJLmVjY3BvcyA9IHs4LCA5LCAxMCwgMjQsIDI1LCAyNiwgNDAsIDQxLCA0MiwgNTYsIDU3LCA1OH0sCisJLm9vYmZyZWUgPSB7IHsyLCA2fSwgezEyLCAxMn0sIHsyOCwgMTJ9LCB7NDQsIDEyfSwgezYwLCA0fSB9Cit9OworI2VsaWYgZGVmaW5lZChDRkdfTkFORF9TTUFMTFBBR0UpCitzdGF0aWMgc3RydWN0IG5hbmRfb29iaW5mbyBkYXZpbmNpX25hbmRfb29iaW5mbyA9IHsKKwkudXNlZWNjID0gTVREX05BTkRFQ0NfQVVUT1BMQUNFLAorCS5lY2NieXRlcyA9IDMsCisJLmVjY3BvcyA9IHswLCAxLCAyfSwKKwkub29iZnJlZSA9IHsgezYsIDJ9LCB7OCwgOH0gfQorfTsKKyNlbHNlCisjZXJyb3IgIkVpdGhlciBDRkdfTkFORF9MQVJHRVBBR0Ugb3IgQ0ZHX05BTkRfU01BTExQQUdFIG11c3QgYmUgZGVmaW5lZCEiCisjZW5kaWYKKworc3RhdGljIHZvaWQgbmFuZF9kYXZpbmNpX2VuYWJsZV9od2VjYyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IG1vZGUpCit7CisJZW1pZnJlZ3MJZW1pZl9hZGRyOworCWludAkJZHVtbXk7CisKKwllbWlmX2FkZHIgPSAoZW1pZnJlZ3MpREFWSU5DSV9BU1lOQ19FTUlGX0NOVFJMX0JBU0U7CisKKwlkdW1teSA9IGVtaWZfYWRkci0+TkFOREYxRUNDOworCWR1bW15ID0gZW1pZl9hZGRyLT5OQU5ERjJFQ0M7CisJZHVtbXkgPSBlbWlmX2FkZHItPk5BTkRGM0VDQzsKKwlkdW1teSA9IGVtaWZfYWRkci0+TkFOREY0RUNDOworCisJZW1pZl9hZGRyLT5OQU5ERkNSIHw9ICgxIDw8IDgpOworfQorCitzdGF0aWMgdV9pbnQzMl90IG5hbmRfZGF2aW5jaV9yZWFkZWNjKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2ludDMyX3QgcmVnaW9uKQoreworCXVfaW50MzJfdAllY2MgPSAwOworCWVtaWZyZWdzCWVtaWZfYmFzZV9hZGRyOworCisJZW1pZl9iYXNlX2FkZHIgPSAoZW1pZnJlZ3MpREFWSU5DSV9BU1lOQ19FTUlGX0NOVFJMX0JBU0U7CisKKwlpZiAocmVnaW9uID09IDEpCisJCWVjYyA9IGVtaWZfYmFzZV9hZGRyLT5OQU5ERjFFQ0M7CisJZWxzZSBpZiAocmVnaW9uID09IDIpCisJCWVjYyA9IGVtaWZfYmFzZV9hZGRyLT5OQU5ERjJFQ0M7CisJZWxzZSBpZiAocmVnaW9uID09IDMpCisJCWVjYyA9IGVtaWZfYmFzZV9hZGRyLT5OQU5ERjNFQ0M7CisJZWxzZSBpZiAocmVnaW9uID09IDQpCisJCWVjYyA9IGVtaWZfYmFzZV9hZGRyLT5OQU5ERjRFQ0M7CisKKwlyZXR1cm4oZWNjKTsKK30KKworc3RhdGljIGludCBuYW5kX2RhdmluY2lfY2FsY3VsYXRlX2VjYyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3QgdV9jaGFyICpkYXQsIHVfY2hhciAqZWNjX2NvZGUpCit7CisJdV9pbnQzMl90CQl0bXA7CisJaW50CQkJcmVnaW9uLCBuOworCXN0cnVjdCBuYW5kX2NoaXAJKnRoaXMgPSBtdGQtPnByaXY7CisKKwluID0gKHRoaXMtPmVjY21vZGUgPT0gTkFORF9FQ0NfSFcxMl8yMDQ4KSA/IDQgOiAxOworCisJcmVnaW9uID0gMTsKKwl3aGlsZSAobi0tKSB7CisJCXRtcCA9IG5hbmRfZGF2aW5jaV9yZWFkZWNjKG10ZCwgcmVnaW9uKTsKKwkJKmVjY19jb2RlKysgPSB0bXA7CisJCSplY2NfY29kZSsrID0gdG1wID4+IDE2OworCQkqZWNjX2NvZGUrKyA9ICgodG1wID4+IDgpICYgMHgwZikgfCAoKHRtcCA+PiAyMCkgJiAweGYwKTsKKwkJcmVnaW9uKys7CisJfQorCXJldHVybigwKTsKK30KKworc3RhdGljIHZvaWQgbmFuZF9kYXZpbmNpX2dlbl90cnVlX2VjYyh1X2ludDhfdCAqZWNjX2J1ZikKK3sKKwl1X2ludDMyX3QJdG1wID0gZWNjX2J1ZlswXSB8IChlY2NfYnVmWzFdIDw8IDE2KSB8ICgoZWNjX2J1ZlsyXSAmIDB4ZjApIDw8IDIwKSB8ICgoZWNjX2J1ZlsyXSAmIDB4MGYpIDw8IDgpOworCisJZWNjX2J1ZlswXSA9IH4oUDY0byh0bXApIHwgUDY0ZSh0bXApIHwgUDMybyh0bXApIHwgUDMyZSh0bXApIHwgUDE2byh0bXApIHwgUDE2ZSh0bXApIHwgUDhvKHRtcCkgfCBQOGUodG1wKSk7CisJZWNjX2J1ZlsxXSA9IH4oUDEwMjRvKHRtcCkgfCBQMTAyNGUodG1wKSB8IFA1MTJvKHRtcCkgfCBQNTEyZSh0bXApIHwgUDI1Nm8odG1wKSB8IFAyNTZlKHRtcCkgfCBQMTI4byh0bXApIHwgUDEyOGUodG1wKSk7CisJZWNjX2J1ZlsyXSA9IH4oIFA0byh0bXApIHwgUDRlKHRtcCkgfCBQMm8odG1wKSB8IFAyZSh0bXApIHwgUDFvKHRtcCkgfCBQMWUodG1wKSB8IFAyMDQ4byh0bXApIHwgUDIwNDhlKHRtcCkpOworfQorCitzdGF0aWMgaW50IG5hbmRfZGF2aW5jaV9jb21wYXJlX2VjYyh1X2ludDhfdCAqZWNjX25hbmQsIHVfaW50OF90ICplY2NfY2FsYywgdV9pbnQ4X3QgKnBhZ2VfZGF0YSkKK3sKKwl1X2ludDMyX3QJaTsKKwl1X2ludDhfdAl0bXAwX2JpdFs4XSwgdG1wMV9iaXRbOF0sIHRtcDJfYml0WzhdOworCXVfaW50OF90CWNvbXAwX2JpdFs4XSwgY29tcDFfYml0WzhdLCBjb21wMl9iaXRbOF07CisJdV9pbnQ4X3QJZWNjX2JpdFsyNF07CisJdV9pbnQ4X3QJZWNjX3N1bSA9IDA7CisJdV9pbnQ4X3QJZmluZF9iaXQgPSAwOworCXVfaW50MzJfdAlmaW5kX2J5dGUgPSAwOworCWludAkJaXNfZWNjX2ZmOworCisJaXNfZWNjX2ZmID0gKCgqZWNjX25hbmQgPT0gMHhmZikgJiYgKCooZWNjX25hbmQgKyAxKSA9PSAweGZmKSAmJiAoKihlY2NfbmFuZCArIDIpID09IDB4ZmYpKTsKKworCW5hbmRfZGF2aW5jaV9nZW5fdHJ1ZV9lY2MoZWNjX25hbmQpOworCW5hbmRfZGF2aW5jaV9nZW5fdHJ1ZV9lY2MoZWNjX2NhbGMpOworCisJZm9yIChpID0gMDsgaSA8PSAyOyBpKyspIHsKKwkJKihlY2NfbmFuZCArIGkpID0gfigqKGVjY19uYW5kICsgaSkpOworCQkqKGVjY19jYWxjICsgaSkgPSB+KCooZWNjX2NhbGMgKyBpKSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQl0bXAwX2JpdFtpXSA9ICplY2NfbmFuZCAlIDI7CisJCSplY2NfbmFuZCA9ICplY2NfbmFuZCAvIDI7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQl0bXAxX2JpdFtpXSA9ICooZWNjX25hbmQgKyAxKSAlIDI7CisJCSooZWNjX25hbmQgKyAxKSA9ICooZWNjX25hbmQgKyAxKSAvIDI7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQl0bXAyX2JpdFtpXSA9ICooZWNjX25hbmQgKyAyKSAlIDI7CisJCSooZWNjX25hbmQgKyAyKSA9ICooZWNjX25hbmQgKyAyKSAvIDI7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQljb21wMF9iaXRbaV0gPSAqZWNjX2NhbGMgJSAyOworCQkqZWNjX2NhbGMgPSAqZWNjX2NhbGMgLyAyOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJY29tcDFfYml0W2ldID0gKihlY2NfY2FsYyArIDEpICUgMjsKKwkJKihlY2NfY2FsYyArIDEpID0gKihlY2NfY2FsYyArIDEpIC8gMjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWNvbXAyX2JpdFtpXSA9ICooZWNjX2NhbGMgKyAyKSAlIDI7CisJCSooZWNjX2NhbGMgKyAyKSA9ICooZWNjX2NhbGMgKyAyKSAvIDI7CisJfQorCisJZm9yIChpID0gMDsgaTwgNjsgaSsrKQorCQllY2NfYml0W2ldID0gdG1wMl9iaXRbaSArIDJdIF4gY29tcDJfYml0W2kgKyAyXTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWVjY19iaXRbaSArIDZdID0gdG1wMF9iaXRbaV0gXiBjb21wMF9iaXRbaV07CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQllY2NfYml0W2kgKyAxNF0gPSB0bXAxX2JpdFtpXSBeIGNvbXAxX2JpdFtpXTsKKworCWVjY19iaXRbMjJdID0gdG1wMl9iaXRbMF0gXiBjb21wMl9iaXRbMF07CisJZWNjX2JpdFsyM10gPSB0bXAyX2JpdFsxXSBeIGNvbXAyX2JpdFsxXTsKKworCWZvciAoaSA9IDA7IGkgPCAyNDsgaSsrKQorCQllY2Nfc3VtICs9IGVjY19iaXRbaV07CisKKwlzd2l0Y2ggKGVjY19zdW0pIHsKKwkJY2FzZSAwOgorCQkJLyogTm90IHJlYWNoZWQgYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBjYWxsZWQgaWYKKwkJCSAgIEVDQyB2YWx1ZXMgYXJlIGVxdWFsICovCisJCQlyZXR1cm4gMDsKKwkJY2FzZSAxOgorCQkJLyogVW5jb3JyZWN0YWJsZSBlcnJvciAqLworCQkJREVCVUcgKE1URF9ERUJVR19MRVZFTDAsICJFQ0MgVU5DT1JSRUNURURfRVJST1IgMVxuIik7CisJCQlyZXR1cm4oLTEpOworCQljYXNlIDEyOgorCQkJLyogQ29ycmVjdGFibGUgZXJyb3IgKi8KKwkJCWZpbmRfYnl0ZSA9IChlY2NfYml0WzIzXSA8PCA4KSArCisJCQkJKGVjY19iaXRbMjFdIDw8IDcpICsKKwkJCQkoZWNjX2JpdFsxOV0gPDwgNikgKworCQkJCShlY2NfYml0WzE3XSA8PCA1KSArCisJCQkJKGVjY19iaXRbMTVdIDw8IDQpICsKKwkJCQkoZWNjX2JpdFsxM10gPDwgMykgKworCQkJCShlY2NfYml0WzExXSA8PCAyKSArCisJCQkJKGVjY19iaXRbOV0gIDw8IDEpICsKKwkJCQllY2NfYml0WzddOworCisJCQlmaW5kX2JpdCA9IChlY2NfYml0WzVdIDw8IDIpICsgKGVjY19iaXRbM10gPDwgMSkgKyBlY2NfYml0WzFdOworCisJCQlERUJVRyAoTVREX0RFQlVHX0xFVkVMMCwgIkNvcnJlY3Rpbmcgc2luZ2xlIGJpdCBFQ0MgZXJyb3IgYXQgb2Zmc2V0OiAlZCwgYml0OiAlZFxuIiwgZmluZF9ieXRlLCBmaW5kX2JpdCk7CisKKwkJCXBhZ2VfZGF0YVtmaW5kX2J5dGVdIF49ICgxIDw8IGZpbmRfYml0KTsKKworCQkJcmV0dXJuKDApOworCQlkZWZhdWx0OgorCQkJaWYgKGlzX2VjY19mZikgeworCQkJCWlmIChlY2NfY2FsY1swXSA9PSAwICYmIGVjY19jYWxjWzFdID09IDAgJiYgZWNjX2NhbGNbMl0gPT0gMCkKKwkJCQkJcmV0dXJuKDApOworCQkJfQorCQkJREVCVUcgKE1URF9ERUJVR19MRVZFTDAsICJVTkNPUlJFQ1RFRF9FUlJPUiBkZWZhdWx0XG4iKTsKKwkJCXJldHVybigtMSk7CisJfQorfQorCitzdGF0aWMgaW50IG5hbmRfZGF2aW5jaV9jb3JyZWN0X2RhdGEoc3RydWN0IG10ZF9pbmZvICptdGQsIHVfY2hhciAqZGF0LCB1X2NoYXIgKnJlYWRfZWNjLCB1X2NoYXIgKmNhbGNfZWNjKQoreworCXN0cnVjdCBuYW5kX2NoaXAJKnRoaXM7CisJaW50CQkJYmxvY2tfY291bnQgPSAwLCBpLCByYzsKKworCXRoaXMgPSBtdGQtPnByaXY7CisJYmxvY2tfY291bnQgPSAodGhpcy0+ZWNjbW9kZSA9PSBOQU5EX0VDQ19IVzEyXzIwNDgpID8gNCA6IDE7CisJZm9yIChpID0gMDsgaSA8IGJsb2NrX2NvdW50OyBpKyspIHsKKwkJaWYgKG1lbWNtcChyZWFkX2VjYywgY2FsY19lY2MsIDMpICE9IDApIHsKKwkJCXJjID0gbmFuZF9kYXZpbmNpX2NvbXBhcmVfZWNjKHJlYWRfZWNjLCBjYWxjX2VjYywgZGF0KTsKKwkJCWlmIChyYyA8IDApIHsKKwkJCQlyZXR1cm4ocmMpOworCQkJfQorCQl9CisJCXJlYWRfZWNjICs9IDM7CisJCWNhbGNfZWNjICs9IDM7CisJCWRhdCArPSA1MTI7CisJfQorCXJldHVybigwKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IG5hbmRfZGF2aW5jaV9kZXZfcmVhZHkoc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJZW1pZnJlZ3MJZW1pZl9hZGRyOworCisJZW1pZl9hZGRyID0gKGVtaWZyZWdzKURBVklOQ0lfQVNZTkNfRU1JRl9DTlRSTF9CQVNFOworCisJcmV0dXJuKGVtaWZfYWRkci0+TkFOREZTUiAmIDB4MSk7Cit9CisKK3N0YXRpYyBpbnQgbmFuZF9kYXZpbmNpX3dhaXRmdW5jKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzLCBpbnQgc3RhdGUpCit7CisJd2hpbGUoIW5hbmRfZGF2aW5jaV9kZXZfcmVhZHkobXRkKSkgezt9CisJKk5BTkRfQ0UwQ0xFID0gTkFORF9TVEFUVVM7CisJcmV0dXJuKCpOQU5EX0NFMERBVEEpOworfQorCitzdGF0aWMgdm9pZCBuYW5kX2ZsYXNoX2luaXQodm9pZCkKK3sKKwl1X2ludDMyX3QJYWNmZzEgPSAweDNmZmZmZmZjOworCXVfaW50MzJfdAlhY2ZnMiA9IDB4M2ZmZmZmZmM7CisJdV9pbnQzMl90CWFjZmczID0gMHgzZmZmZmZmYzsKKwl1X2ludDMyX3QJYWNmZzQgPSAweDNmZmZmZmZjOworCWVtaWZyZWdzCWVtaWZfcmVnczsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorCSAqICBOQU5EIEZMQVNIIENISVAgVElNRU9VVCBAIDQ1OSBNSHogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorCSAqICBBRU1JRi5DTEsgZnJlcSAgID0gUExMMS82ID0gNDU5LzYgPSA3Ni41IE1IeiAgICAgICAgICAgICAgICAgICAgKgorCSAqICBBRU1JRi5DTEsgcGVyaW9kID0gMS83Ni41IE1IeiA9IDEzLjEgbnMgICAgICAgICAgICAgICAgICAgICAgICAgKgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkgYWNmZzEgPSAwCisJIAl8ICgwIDw8IDMxICkJLyogc2VsZWN0U3Ryb2JlICovCisJIAl8ICgwIDw8IDMwICkJLyogZXh0V2FpdCAqLworCSAJfCAoMSA8PCAyNiApCS8qIHdyaXRlU2V0dXAJMTAgbnMgKi8KKwkgCXwgKDMgPDwgMjAgKQkvKiB3cml0ZVN0cm9iZQk0MCBucyAqLworCSAJfCAoMSA8PCAxNyApCS8qIHdyaXRlSG9sZAkxMCBucyAqLworCSAJfCAoMSA8PCAxMyApCS8qIHJlYWRTZXR1cAkxMCBucyAqLworCSAJfCAoNSA8PCA3ICkJLyogcmVhZFN0cm9iZQk2MCBucyAqLworCSAJfCAoMSA8PCA0ICkJLyogcmVhZEhvbGQJMTAgbnMgKi8KKwkgCXwgKDMgPDwgMiApCS8qIHR1cm5Bcm91bmQJPz8gbnMgKi8KKwkgCXwgKDAgPDwgMCApCS8qIGFzeW5jU2l6ZQk4LWJpdCBidXMgKi8KKwkgCTsKKworCWVtaWZfcmVncyA9IChlbWlmcmVncylEQVZJTkNJX0FTWU5DX0VNSUZfQ05UUkxfQkFTRTsKKworCWVtaWZfcmVncy0+QVdDQ1IgfD0gMHgxMDAwMDAwMDsKKwllbWlmX3JlZ3MtPkFCMUNSID0gYWNmZzE7CS8qIDB4MDgyNDQxMjggKi87CisJZW1pZl9yZWdzLT5BQjJDUiA9IGFjZmcyOworCWVtaWZfcmVncy0+QUIzQ1IgPSBhY2ZnMzsKKwllbWlmX3JlZ3MtPkFCNENSID0gYWNmZzQ7CisJZW1pZl9yZWdzLT5OQU5ERkNSID0gMHgwMDAwMDEwMTsKK30KKworaW50IGJvYXJkX25hbmRfaW5pdChzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kKQoreworCW5hbmQtPklPX0FERFJfUiAgID0gKHZvaWQgIF9faW9tZW0gKilOQU5EX0NFMERBVEE7CisJbmFuZC0+SU9fQUREUl9XICAgPSAodm9pZCAgX19pb21lbSAqKU5BTkRfQ0UwREFUQTsKKwluYW5kLT5jaGlwX2RlbGF5ICA9IDA7CisJbmFuZC0+c2VsZWN0X2NoaXAgPSBuYW5kX2RhdmluY2lfc2VsZWN0X2NoaXA7CisjaWZkZWYgQ0ZHX05BTkRfVVNFX0ZMQVNIX0JCVAorCW5hbmQtPm9wdGlvbnMJICA9IE5BTkRfVVNFX0ZMQVNIX0JCVDsKKyNlbmRpZgorI2lmZGVmIENGR19OQU5EX0hXX0VDQworI2lmZGVmIENGR19OQU5EX0xBUkdFUEFHRQorCW5hbmQtPmVjY21vZGUgICAgID0gTkFORF9FQ0NfSFcxMl8yMDQ4OworI2VsaWYgZGVmaW5lZChDRkdfTkFORF9TTUFMTFBBR0UpCisJbmFuZC0+ZWNjbW9kZSAgICAgPSBOQU5EX0VDQ19IVzNfNTEyOworI2Vsc2UKKyNlcnJvciAiRWl0aGVyIENGR19OQU5EX0xBUkdFUEFHRSBvciBDRkdfTkFORF9TTUFMTFBBR0UgbXVzdCBiZSBkZWZpbmVkISIKKyNlbmRpZgorCW5hbmQtPmF1dG9vb2IJICA9ICZkYXZpbmNpX25hbmRfb29iaW5mbzsKKwluYW5kLT5jYWxjdWxhdGVfZWNjID0gbmFuZF9kYXZpbmNpX2NhbGN1bGF0ZV9lY2M7CisJbmFuZC0+Y29ycmVjdF9kYXRhICA9IG5hbmRfZGF2aW5jaV9jb3JyZWN0X2RhdGE7CisJbmFuZC0+ZW5hYmxlX2h3ZWNjICA9IG5hbmRfZGF2aW5jaV9lbmFibGVfaHdlY2M7CisjZWxzZQorCW5hbmQtPmVjY21vZGUgICAgID0gTkFORF9FQ0NfU09GVDsKKyNlbmRpZgorCisJLyogU2V0IGFkZHJlc3Mgb2YgaGFyZHdhcmUgY29udHJvbCBmdW5jdGlvbiAqLworCW5hbmQtPmh3Y29udHJvbCA9IG5hbmRfZGF2aW5jaV9od2NvbnRyb2w7CisKKwluYW5kLT5kZXZfcmVhZHkgPSBuYW5kX2RhdmluY2lfZGV2X3JlYWR5OworCW5hbmQtPndhaXRmdW5jID0gbmFuZF9kYXZpbmNpX3dhaXRmdW5jOworCisJbmFuZF9mbGFzaF9pbml0KCk7CisKKwlyZXR1cm4oMCk7Cit9CisKKyNlbHNlCisjZXJyb3IgIlUtQm9vdCBsZWdhY3kgTkFORCBzdXBwb3J0IG5vdCBhdmFpbGFibGUgZm9yIERhVmluY2kgY2hpcHMiCisjZW5kaWYKKyNlbmRpZgkvKiBDRkdfVVNFX05BTkQgKi8KZGlmZiAtLWdpdCBhL2NwdS9hcm05MjZlanMvZGF2aW5jaS9yZXNldC5TIGIvY3B1L2FybTkyNmVqcy9kYXZpbmNpL3Jlc2V0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY4N2Q0NAotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9hcm05MjZlanMvZGF2aW5jaS9yZXNldC5TCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBQcm9jZXNzb3IgcmVzZXQgdXNpbmcgV0RUIGZvciBUSSBUTVMzMjBETTY0NHggU29DLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy5nbG9ibCByZXNldF9jcHUKK3Jlc2V0X2NwdToKKwlsZHIJcjAsIFdEVF9UR0NSCisJbW92CXIxLCAkMHgwOAorCXN0cglyMSwgW3IwXQorCWxkcglyMSwgW3IwXQorCW9ycglyMSwgcjEsICQweDAzCisJc3RyCXIxLCBbcjBdCisJbW92CXIxLCAkMAorCWxkcglyMCwgV0RUX1RJTTEyCisJc3RyCXIxLCBbcjBdCisJbGRyCXIwLCBXRFRfVElNMzQKKwlzdHIJcjEsIFtyMF0KKwlsZHIJcjAsIFdEVF9QUkQxMgorCXN0cglyMSwgW3IwXQorCWxkcglyMCwgV0RUX1BSRDM0CisJc3RyCXIxLCBbcjBdCisJbGRyCXIwLCBXRFRfVENSCisJbGRyCXIxLCBbcjBdCisJb3JyCXIxLCByMSwgJDB4NDAKKwlzdHIJcjEsIFtyMF0KKwlsZHIJcjAsIFdEVF9XRFRDUgorCWxkcglyMSwgW3IwXQorCW9ycglyMSwgcjEsICQweDQwMDAKKwlzdHIJcjEsIFtyMF0KKwlsZHIJcjEsIFdEVENSX1ZBTDEKKwlzdHIJcjEsIFtyMF0KKwlsZHIJcjEsIFdEVENSX1ZBTDIKKwlzdHIJcjEsIFtyMF0KKwlub3AKKwlub3AKKwlub3AKKwlub3AKK3Jlc2V0X2NwdV9sb29wOgorCWIJcmVzZXRfY3B1X2xvb3AKKworV0RUX1RHQ1I6CisJLndvcmQJMHgwMWMyMWMyNAorV0RUX1RJTTEyOgorCS53b3JkCTB4MDFjMjFjMTAKK1dEVF9USU0zNDoKKwkud29yZAkweDAxYzIxYzE0CitXRFRfUFJEMTI6CisJLndvcmQJMHgwMWMyMWMxOAorV0RUX1BSRDM0OgorCS53b3JkCTB4MDFjMjFjMWMKK1dEVF9UQ1I6CisJLndvcmQJMHgwMWMyMWMyMAorV0RUX1dEVENSOgorCS53b3JkCTB4MDFjMjFjMjgKK1dEVENSX1ZBTDE6CisJLndvcmQJMHhhNWM2NDAwMAorV0RUQ1JfVkFMMjoKKwkud29yZAkweGRhN2U0MDAwCmRpZmYgLS1naXQgYS9jcHUvYXJtOTI2ZWpzL2RhdmluY2kvdGltZXIuYyBiL2NwdS9hcm05MjZlanMvZGF2aW5jaS90aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YjFkZGEKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvYXJtOTI2ZWpzL2RhdmluY2kvdGltZXIuYwpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMworICogVGV4YXMgSW5zdHJ1bWVudHMgPHd3dy50aS5jb20+CisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIE1hcml1cyBHcm9lZ2VyIDxtZ3JvZWdlckBzeXNnby5kZT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogQWxleCBadWVwa2UgPGF6dUBzeXNnby5kZT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDItMjAwNAorICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogUGhpbGlwcGUgUm9iaW4sIEFSTSBMdGQuIDxwaGlsaXBwZS5yb2JpbkBhcm0uY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXJtOTI2ZWpzLmg+CisKK3R5cGVkZWYgdm9sYXRpbGUgc3RydWN0IHsKKwl1X2ludDMyX3QJcGlkMTI7CisJdV9pbnQzMl90CWVtdW1ndF9jbGtzcGVkOworCXVfaW50MzJfdAlncGludF9lbjsKKwl1X2ludDMyX3QJZ3BkaXJfZGF0OworCXVfaW50MzJfdAl0aW0xMjsKKwl1X2ludDMyX3QJdGltMzQ7CisJdV9pbnQzMl90CXByZDEyOworCXVfaW50MzJfdAlwcmQzNDsKKwl1X2ludDMyX3QJdGNyOworCXVfaW50MzJfdAl0Z2NyOworCXVfaW50MzJfdAl3ZHRjcjsKKwl1X2ludDMyX3QJdGxnYzsKKwl1X2ludDMyX3QJdGxtcjsKK30gZGF2aW5jaV90aW1lcjsKKworZGF2aW5jaV90aW1lcgkJKnRpbWVyID0gKGRhdmluY2lfdGltZXIgKilDRkdfVElNRVJCQVNFOworCisjZGVmaW5lIFRJTUVSX0xPQURfVkFMCShDRkdfSFpfQ0xPQ0sgLyBDRkdfSFopCisjZGVmaW5lIFJFQURfVElNRVIJdGltZXItPnRpbTM0CisKK3N0YXRpYyB1bG9uZyB0aW1lc3RhbXA7CitzdGF0aWMgdWxvbmcgbGFzdGluYzsKKworaW50IHRpbWVyX2luaXQodm9pZCkKK3sKKwkvKiBXZSBhcmUgdXNpbmcgdGltZXIzNCBpbiB1bmNoYWluZWQgMzItYml0IG1vZGUsIGZ1bGwgc3BlZWQgKi8KKwl0aW1lci0+dGNyID0gMHgwOworCXRpbWVyLT50Z2NyID0gMHgwOworCXRpbWVyLT50Z2NyID0gMHgwNjsKKwl0aW1lci0+dGltMzQgPSAweDA7CisJdGltZXItPnByZDM0ID0gVElNRVJfTE9BRF9WQUw7CisJbGFzdGluYyA9IDA7CisJdGltZXItPnRjciA9IDB4ODAgPDwgMTY7CisJdGltZXN0YW1wID0gMDsKKworCXJldHVybigwKTsKK30KKwordm9pZCByZXNldF90aW1lcih2b2lkKQoreworCXJlc2V0X3RpbWVyX21hc2tlZCgpOworfQorCit1bG9uZyBnZXRfdGltZXIodWxvbmcgYmFzZSkKK3sKKwlyZXR1cm4oZ2V0X3RpbWVyX21hc2tlZCgpIC0gYmFzZSk7Cit9CisKK3ZvaWQgc2V0X3RpbWVyKHVsb25nIHQpCit7CisJdGltZXN0YW1wID0gdDsKK30KKwordm9pZCB1ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjKQoreworCXVkZWxheV9tYXNrZWQodXNlYyk7Cit9CisKK3ZvaWQgcmVzZXRfdGltZXJfbWFza2VkKHZvaWQpCit7CisJbGFzdGluYyA9IFJFQURfVElNRVI7CisJdGltZXN0YW1wID0gMDsKK30KKwordWxvbmcgZ2V0X3RpbWVyX3Jhdyh2b2lkKQoreworCXVsb25nIG5vdyA9IFJFQURfVElNRVI7CisKKwlpZiAobm93ID49IGxhc3RpbmMpIHsKKwkJLyogbm9ybWFsIG1vZGUgKi8KKwkJdGltZXN0YW1wICs9IG5vdyAtIGxhc3RpbmM7CisJfSBlbHNlIHsKKwkJLyogb3ZlcmZsb3cgLi4uICovCisJCXRpbWVzdGFtcCArPSBub3cgKyBUSU1FUl9MT0FEX1ZBTCAtIGxhc3RpbmM7CisJfQorCWxhc3RpbmMgPSBub3c7CisJcmV0dXJuIHRpbWVzdGFtcDsKK30KKwordWxvbmcgZ2V0X3RpbWVyX21hc2tlZCh2b2lkKQoreworCXJldHVybihnZXRfdGltZXJfcmF3KCkgLyBUSU1FUl9MT0FEX1ZBTCk7Cit9CisKK3ZvaWQgdWRlbGF5X21hc2tlZCh1bnNpZ25lZCBsb25nIHVzZWMpCit7CisJdWxvbmcgdG1vOworCXVsb25nIGVuZHRpbWU7CisJc2lnbmVkIGxvbmcgZGlmZjsKKworCXRtbyA9IENGR19IWl9DTE9DSyAvIDEwMDA7CisJdG1vICo9IHVzZWM7CisJdG1vIC89IDEwMDA7CisKKwllbmR0aW1lID0gZ2V0X3RpbWVyX3JhdygpICsgdG1vOworCisJZG8geworCQl1bG9uZyBub3cgPSBnZXRfdGltZXJfcmF3KCk7CisJCWRpZmYgPSBlbmR0aW1lIC0gbm93OworCX0gd2hpbGUgKGRpZmYgPj0gMCk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGRlcml2ZWQgZnJvbSBQb3dlclBDIGNvZGUgKHJlYWQgdGltZWJhc2UgYXMgbG9uZyBsb25nKS4KKyAqIE9uIEFSTSBpdCBqdXN0IHJldHVybnMgdGhlIHRpbWVyIHZhbHVlLgorICovCit1bnNpZ25lZCBsb25nIGxvbmcgZ2V0X3RpY2tzKHZvaWQpCit7CisJcmV0dXJuKGdldF90aW1lcigwKSk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGRlcml2ZWQgZnJvbSBQb3dlclBDIGNvZGUgKHRpbWViYXNlIGNsb2NrIGZyZXF1ZW5jeSkuCisgKiBPbiBBUk0gaXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHRpbWVyIHRpY2tzIHBlciBzZWNvbmQuCisgKi8KK3Vsb25nIGdldF90YmNsayh2b2lkKQoreworCXVsb25nIHRiY2xrOworCisJdGJjbGsgPSBDRkdfSFo7CisJcmV0dXJuKHRiY2xrKTsKK30KZGlmZiAtLWdpdCBhL2NwdS9hdDMyYXAvYXRtZWxfbWNpLmMgYi9jcHUvYXQzMmFwL2F0bWVsX21jaS5jCmluZGV4IDlmNjJjMGYuLmNmNDhiZTEgMTAwNjQ0Ci0tLSBhL2NwdS9hdDMyYXAvYXRtZWxfbWNpLmMKKysrIGIvY3B1L2F0MzJhcC9hdG1lbF9tY2kuYwpAQCAtNTYsNiArNTYsNyBAQAogI2RlZmluZSBNTUNfREVGQVVMVF9SQ0EJCTEKIAogc3RhdGljIHVuc2lnbmVkIGludCBtbWNfcmNhOworc3RhdGljIGludCBtbWNfY2FyZF9pc19zZDsKIHN0YXRpYyBibG9ja19kZXZfZGVzY190IG1tY19ibGtkZXY7CiAKIGJsb2NrX2Rldl9kZXNjX3QgKm1tY19nZXRfZGV2KGludCBkZXYpCkBAIC04Miw3ICs4Myw5IEBACiAKIAlibGtsZW4gJj0gMHhmZmZjOwogCW1tY2lfd3JpdGVsKE1SLCAoTU1DSV9CRihDTEtESVYsIGNsa2RpdikKLQkJCSB8IE1NQ0lfQkYoQkxLTEVOLCBibGtsZW4pKSk7CisJCQkgfCBNTUNJX0JGKEJMS0xFTiwgYmxrbGVuKQorCQkJIHwgTU1DSV9CSVQoUkRQUk9PRikKKwkJCSB8IE1NQ0lfQklUKFdSUFJPT0YpKSk7CiB9CiAKICNkZWZpbmUgUkVTUF9OT19DUkMJMQpAQCAtMjI1LDcgKzIyOCw3IEBACiAJCQkJKmJ1ZmZlcisrID0gZGF0YTsKIAkJCQl3b3JkY291bnQrKzsKIAkJCX0KLQkJfSB3aGlsZSh3b3JkY291bnQgPCAoNTEyIC8gNCkpOworCQl9IHdoaWxlKHdvcmRjb3VudCA8IChtbWNfYmxrZGV2LmJsa3N6IC8gNCkpOwogCiAJCXByX2RlYnVnKCJtbWM6IHJlYWQgJXUgd29yZHMsIHdhaXRpbmcgZm9yIEJMS0VcbiIsIHdvcmRjb3VudCk7CiAKQEAgLTI0Myw3ICsyNDYsNyBAQAogCiBmYWlsOgogCW1tY19jbWQoTU1DX0NNRF9TRU5EX1NUQVRVUywgbW1jX3JjYSA8PCAxNiwgJmNhcmRfc3RhdHVzLCBSMSB8IE5DUik7Ci0JcHJpbnRmKCJtbWM6IGJyZWFkIGZhaWxlZCwgY2FyZCBzdGF0dXMgPSAiLCBjYXJkX3N0YXR1cyk7CisJcHJpbnRmKCJtbWM6IGJyZWFkIGZhaWxlZCwgY2FyZCBzdGF0dXMgPSAlMDh4XG4iLCBjYXJkX3N0YXR1cyk7CiAJZ290byBvdXQ7CiB9CiAKQEAgLTM3MSw2ICszNzQsNyBAQAogCW1tY19yY2EgPSByZXNwWzBdID4+IDE2OwogCWlmICh2ZXJib3NlKQogCQlwcmludGYoIlNEIENhcmQgZGV0ZWN0ZWQgKFJDQSAldSlcbiIsIG1tY19yY2EpOworCW1tY19jYXJkX2lzX3NkID0gMTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDA1LDEwICs0MDksNjQgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCBtY2lfc2V0X2RhdGFfdGltZW91dChzdHJ1Y3QgbW1jX2NzZCAqY3NkKQoreworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHRvbXVsX3RvX3NoaWZ0W10gPSB7CisJCTAsIDQsIDcsIDgsIDEwLCAxMiwgMTYsIDIwLAorCX07CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0YWFjX2V4cFtdID0geworCQkxLCAxMCwgMTAwLCAxMDAwLCAxMDAwMCwgMTAwMDAwLCAxMDAwMDAwLCAxMDAwMDAwMCwKKwl9OworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdGFhY19tYW50W10gPSB7CisJCTAsICAxMCwgMTIsIDEzLCAxNSwgNjAsIDI1LCAzMCwKKwkJMzUsIDQwLCA0NSwgNTAsIDU1LCA2MCwgNzAsIDgwLAorCX07CisJdW5zaWduZWQgaW50IHRpbWVvdXRfbnMsIHRpbWVvdXRfY2xrczsKKwl1bnNpZ25lZCBpbnQgZSwgbTsKKwl1bnNpZ25lZCBpbnQgZHRvY3ljLCBkdG9tdWw7CisJdW5zaWduZWQgaW50IHNoaWZ0OworCXUzMiBkdG9yOworCisJZSA9IGNzZC0+dGFhYyAmIDB4MDc7CisJbSA9IChjc2QtPnRhYWMgPj4gMykgJiAweDBmOworCisJdGltZW91dF9ucyA9ICh0YWFjX2V4cFtlXSAqIHRhYWNfbWFudFttXSArIDkpIC8gMTA7CisJdGltZW91dF9jbGtzID0gY3NkLT5uc2FjICogMTAwOworCisJdGltZW91dF9jbGtzICs9ICgoKHRpbWVvdXRfbnMgKyA5KSAvIDEwKQorCQkJICogKChDRkdfTU1DX0NMS19QUCArIDk5OTk5KSAvIDEwMDAwMCkgKyA5OTk5KSAvIDEwMDAwOworCWlmICghbW1jX2NhcmRfaXNfc2QpCisJCXRpbWVvdXRfY2xrcyAqPSAxMDsKKwllbHNlCisJCXRpbWVvdXRfY2xrcyAqPSAxMDA7CisKKwlkdG9jeWMgPSB0aW1lb3V0X2Nsa3M7CisJZHRvbXVsID0gMDsKKwl3aGlsZSAoZHRvY3ljID4gMTUgJiYgZHRvbXVsIDwgOCkgeworCQlkdG9tdWwrKzsKKwkJc2hpZnQgPSBkdG9tdWxfdG9fc2hpZnRbZHRvbXVsXTsKKwkJZHRvY3ljID0gKHRpbWVvdXRfY2xrcyArICgxIDw8IHNoaWZ0KSAtIDEpID4+IHNoaWZ0OworCX0KKworCWlmIChkdG9tdWwgPj0gOCkgeworCQlkdG9tdWwgPSA3OworCQlkdG9jeWMgPSAxNTsKKwkJcHV0cygiV2FybmluZzogVXNpbmcgbWF4aW11bSBkYXRhIHRpbWVvdXRcbiIpOworCX0KKworCWR0b3IgPSAoTU1DSV9CRihEVE9NVUwsIGR0b211bCkKKwkJfCBNTUNJX0JGKERUT0NZQywgZHRvY3ljKSk7CisJbW1jaV93cml0ZWwoRFRPUiwgZHRvcik7CisKKwlwcmludGYoIm1tYzogVXNpbmcgJXUgY3ljbGVzIGRhdGEgdGltZW91dCAoRFRPUj0weCV4KVxuIiwKKwkgICAgICAgZHRvY3ljIDw8IHNoaWZ0LCBkdG9yKTsKK30KKwogaW50IG1tY19pbml0KGludCB2ZXJib3NlKQogewogCXN0cnVjdCBtbWNfY2lkIGNpZDsKIAlzdHJ1Y3QgbW1jX2NzZCBjc2Q7CisJdW5zaWduZWQgaW50IG1heF9ibGtzejsKIAlpbnQgcmV0OwogCiAJLyogSW5pdGlhbGl6ZSBjb250cm9sbGVyICovCkBAIC00MTgsNiArNDc2LDggQEAKIAltbWNpX3dyaXRlbChJRFIsIH4wVUwpOwogCW1jaV9zZXRfbW9kZShDRkdfTU1DX0NMS19PRCwgTU1DX0RFRkFVTFRfQkxLTEVOKTsKIAorCW1tY19jYXJkX2lzX3NkID0gMDsKKwogCXJldCA9IHNkX2luaXRfY2FyZCgmY2lkLCB2ZXJib3NlKTsKIAlpZiAocmV0KSB7CiAJCW1tY19yY2EgPSBNTUNfREVGQVVMVF9SQ0E7CkBAIC00MzMsNiArNDkzLDggQEAKIAlpZiAodmVyYm9zZSkKIAkJbW1jX2R1bXBfY3NkKCZjc2QpOwogCisJbWNpX3NldF9kYXRhX3RpbWVvdXQoJmNzZCk7CisKIAkvKiBJbml0aWFsaXplIHRoZSBibG9ja2RldiBzdHJ1Y3R1cmUgKi8KIAltbWNfYmxrZGV2LmlmX3R5cGUgPSBJRl9UWVBFX01NQzsKIAltbWNfYmxrZGV2LnBhcnRfdHlwZSA9IFBBUlRfVFlQRV9ET1M7CkBAIC00NDQsNyArNTA2LDE3IEBACiAJCXNpemVvZihtbWNfYmxrZGV2LnByb2R1Y3QpKTsKIAlzcHJpbnRmKChjaGFyICopbW1jX2Jsa2Rldi5yZXZpc2lvbiwgIiV4ICV4IiwKIAkJY2lkLnBydiA+PiA0LCBjaWQucHJ2ICYgMHgwZik7Ci0JbW1jX2Jsa2Rldi5ibGtzeiA9IDEgPDwgY3NkLnJlYWRfYmxfbGVuOworCisJLyoKKwkgKiBJZiB3ZSBjYW4ndCB1c2UgNTEyIGJ5dGUgYmxvY2tzLCByZWZ1c2UgdG8gZGVhbCB3aXRoIHRoZQorCSAqIGNhcmQuIFRvbnMgb2YgY29kZSBlbHNld2hlcmUgc2VlbXMgdG8gZGVwZW5kIG9uIHRoaXMuCisJICovCisJbWF4X2Jsa3N6ID0gMSA8PCBjc2QucmVhZF9ibF9sZW47CisJaWYgKG1heF9ibGtzeiA8IDUxMiB8fCAobWF4X2Jsa3N6ID4gNTEyICYmICFjc2QucmVhZF9ibF9wYXJ0aWFsKSkgeworCQlwcmludGYoIkNhcmQgZG9lcyBub3Qgc3VwcG9ydCA1MTIgYnl0ZSByZWFkcywgYWJvcnRpbmcuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCW1tY19ibGtkZXYuYmxrc3ogPSA1MTI7CiAJbW1jX2Jsa2Rldi5sYmEgPSAoY3NkLmNfc2l6ZSArIDEpICogKDEgPDwgKGNzZC5jX3NpemVfbXVsdCArIDIpKTsKIAogCW1jaV9zZXRfbW9kZShDRkdfTU1DX0NMS19QUCwgbW1jX2Jsa2Rldi5ibGtzeik7CmRpZmYgLS1naXQgYS9jcHUvYXQzMmFwL2F0bWVsX21jaS5oIGIvY3B1L2F0MzJhcC9hdG1lbF9tY2kuaAppbmRleCAwZmZiYzRmLi41YjRmNWM5IDEwMDY0NAotLS0gYS9jcHUvYXQzMmFwL2F0bWVsX21jaS5oCisrKyBiL2NwdS9hdDMyYXAvYXRtZWxfbWNpLmgKQEAgLTU3LDYgKzU3LDEwIEBACiAjZGVmaW5lIE1NQ0lfQ0xLRElWX1NJWkUJCQk4CiAjZGVmaW5lIE1NQ0lfUFdTRElWX09GRlNFVAkJCTgKICNkZWZpbmUgTU1DSV9QV1NESVZfU0laRQkJCTMKKyNkZWZpbmUgTU1DSV9SRFBST09GX09GRlNFVAkJCTExCisjZGVmaW5lIE1NQ0lfUkRQUk9PRl9TSVpFCQkJMQorI2RlZmluZSBNTUNJX1dSUFJPT0ZfT0ZGU0VUCQkJMTIKKyNkZWZpbmUgTU1DSV9XUlBST09GX1NJWkUJCQkxCiAjZGVmaW5lIE1NQ0lfUERDUEFEVl9PRkZTRVQJCQkxNAogI2RlZmluZSBNTUNJX1BEQ1BBRFZfU0laRQkJCTEKICNkZWZpbmUgTU1DSV9QRENNT0RFX09GRlNFVAkJCTE1CmRpZmYgLS1naXQgYS9jcHUvYXQzMmFwL2ludGVycnVwdHMuYyBiL2NwdS9hdDMyYXAvaW50ZXJydXB0cy5jCmluZGV4IGM5ZTA0OTkuLmJlZjFmMzAgMTAwNjQ0Ci0tLSBhL2NwdS9hdDMyYXAvaW50ZXJydXB0cy5jCisrKyBiL2NwdS9hdDMyYXAvaW50ZXJydXB0cy5jCkBAIC0yMCw4ICsyMCw4IEBACiAgKiBNQSAwMjExMS0xMzA3IFVTQQogICovCiAjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8ZGl2NjQuaD4KIAotI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KZGlmZiAtLWdpdCBhL2NwdS9pMzg2L3NlcmlhbC5jIGIvY3B1L2kzODYvc2VyaWFsLmMKaW5kZXggZTcyOTlhNy4uYmFmMzVlNSAxMDA2NDQKLS0tIGEvY3B1L2kzODYvc2VyaWFsLmMKKysrIGIvY3B1L2kzODYvc2VyaWFsLmMKQEAgLTM5NCw3ICszOTQsNyBAQAogI2VuZGlmCS8qIENPTkZJR19TRVJJQUxfU09GVFdBUkVfRklGTyAqLwogCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogLyoKICAgQVMgSEFSTk9JUyA6IGFjY29yZGluZyB0byBDT05GSUdfS0dEQl9TRVJfSU5ERVgga2dkYiB1c2VzIHNlcmlhbCBwb3J0CiAgIG51bWJlciAwIG9yIG51bWJlciAxCkBAIC01MDAsNCArNTAwLDQgQEAKIAlyZXR1cm47CiB9CiAjZW5kaWYJLyogKENPTkZJR19LR0RCX1NFUl9JTkRFWCAmIDIpICovCi0jZW5kaWYJLyogQ0ZHX0NNRF9LR0RCICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9pMzg2L3N0YXJ0LlMgYi9jcHUvaTM4Ni9zdGFydC5TCmluZGV4IGFmY2JiMjQuLjFhNTRkZDEgMTAwNjQ0Ci0tLSBhL2NwdS9pMzg2L3N0YXJ0LlMKKysrIGIvY3B1L2kzODYvc3RhcnQuUwpAQCAtMTQ5LDcgKzE0OSw3IEBACiAucHJvZ3Jlc3MzOgogCiAJLyogY2xlYXIgYnNzIHNlY3Rpb24gaW4gcmFtLCBzaXplIG11c3QgYmUgNC1ieXRlIGFsaWduZWQgICovCi0JbW92bAkkX2kzODZib290X2Jzc19zdGFydCwgJWVheCAgICAgICAgLyogQlNTIHN0YXJ0ICovCisJbW92bAkkX2kzODZib290X2Jzc19zdGFydCwgJWVkaSAgICAgICAgLyogTUtfQ0hHIEJTUyBzdGFydCAqLwogCW1vdmwJJF9pMzg2Ym9vdF9ic3Nfc2l6ZSwgJWVjeCAgICAgICAgIC8qIEJTUyBzaXplICovCiAJbW92bAklZWN4LCAlZWF4CiAJYW5kbAkkMywgJWVheApkaWZmIC0tZ2l0IGEvY3B1L2l4cC9jcHUuYyBiL2NwdS9peHAvY3B1LmMKaW5kZXggN2Y5ZjMzNC4uMmM3ZDVhMCAxMDA2NDQKLS0tIGEvY3B1L2l4cC9jcHUuYworKysgYi9jcHUvaXhwL2NwdS5jCkBAIC04NSw3ICs4NSw3IEBACiAJRklRX1NUQUNLX1NUQVJUID0gSVJRX1NUQUNLX1NUQVJUIC0gQ09ORklHX1NUQUNLU0laRV9JUlE7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDSSkgfHwgZGVmaW5lZCAoQ09ORklHX1BDSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUENJKSB8fCBkZWZpbmVkIChDT05GSUdfUENJKQogCXBjaV9pbml0KCk7CiAjZW5kaWYKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2NwdS9peHAvbnBlL25wZS5jIGIvY3B1L2l4cC9ucGUvbnBlLmMKaW5kZXggYWI3Y2E4Yi4uN2U0YWY0NCAxMDA2NDQKLS0tIGEvY3B1L2l4cC9ucGUvbnBlLmMKKysrIGIvY3B1L2l4cC9ucGUvbnBlLmMKQEAgLTY4Miw3ICs2ODIsNyBAQAogCiAJCWV0aF9yZWdpc3RlcihkZXYpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCisjaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogCQltaWlwaHlfcmVnaXN0ZXIoZGV2LT5uYW1lLCBucGVfbWlpcGh5X3JlYWQsIG5wZV9taWlwaHlfd3JpdGUpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2NwdS9tY2Y1MngyL2ZlYy5jIGIvY3B1L21jZjUyeDIvZmVjLmMKaW5kZXggYjY1NDBiNS4uZWY5Yzc5OCAxMDA2NDQKLS0tIGEvY3B1L21jZjUyeDIvZmVjLmMKKysrIGIvY3B1L21jZjUyeDIvZmVjLmMKQEAgLTUzLDcgKzUzLDcgQEAKICN1bmRlZglFVF9ERUJVRwogI3VuZGVmCU1JSV9ERUJVRwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBkZWZpbmVkKEZFQ19FTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmIGRlZmluZWQoRkVDX0VORVQpCiAKICNpZmRlZiBDRkdfRElTQ09WRVJfUEhZCiAjaW5jbHVkZSA8bWlpcGh5Lmg+CkBAIC0zNjMsNyArMzYzLDcgQEAKIH0KIAogCi0jaWYgZGVmaW5lZChDRkdfRElTQ09WRVJfUEhZKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCisjaWYgZGVmaW5lZChDRkdfRElTQ09WRVJfUEhZKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogCiBzdGF0aWMgaW50IHBoeWFkZHIgPSAtMTsJLyogZGlkbid0IGZpbmQgYSBQSFkgeWV0ICovCiBzdGF0aWMgdWludCBwaHl0eXBlOwpAQCAtNDE5LDcgKzQxOSw3IEBACiAjZW5kaWYKIAlyZXR1cm4gKG1paV9yZXBseSAmIDB4ZmZmZik7CS8qIGRhdGEgcmVhZCBmcm9tIHBoeSAqLwogfQotI2VuZGlmIC8qIENGR19ESVNDT1ZFUl9QSFkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKSAqLworI2VuZGlmCiAKICNpZiBkZWZpbmVkKENGR19ESVNDT1ZFUl9QSFkpCiBzdGF0aWMgdm9pZCBtaWlfZGlzY292ZXJfcGh5ICh2b2lkKQpAQCAtNDg1LDcgKzQ4NSw3IEBACiB9CiAjZW5kaWYgLyogQ0ZHX0RJU0NPVkVSX1BIWSAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKSAmJiAhZGVmaW5lZChDT05GSUdfQklUQkFOR01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTUlJKSAmJiAhZGVmaW5lZChDT05GSUdfQklUQkFOR01JSSkKIAogc3RhdGljIGludCBtaWlfaW5pdF9kb25lID0gMDsKIApAQCAtNTkxLDEzICs1OTEsMTMgQEAKIAogCXJldHVybiAwOwogfQotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkgJiYgIWRlZmluZWQoQ09ORklHX0JJVEJBTkdNSUkpICovCi0jZW5kaWYgLyogQ0ZHX0NNRF9ORVQsIEZFQ19FTkVUICovCisjZW5kaWYKKyNlbmRpZgogCiBpbnQgbWNmNTJ4Ml9taWlwaHlfaW5pdGlhbGl6ZShiZF90ICpiaXMpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBkZWZpbmVkKEZFQ19FTkVUKQotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkgJiYgIWRlZmluZWQoQ09ORklHX0JJVEJBTkdNSUkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgJiYgZGVmaW5lZChGRUNfRU5FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTUlJKSAmJiAhZGVmaW5lZChDT05GSUdfQklUQkFOR01JSSkKIAltaWlwaHlfcmVnaXN0ZXIoIm1jZjUyeDJwaHkiLCBtY2Y1MngyX21paXBoeV9yZWFkLCBtY2Y1MngyX21paXBoeV93cml0ZSk7CiAjZW5kaWYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L21pY3JvYmxhemUvY2FjaGUuYyBiL2NwdS9taWNyb2JsYXplL2NhY2hlLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA0ZjM2YTg0Li42Y2UwYjU1Ci0tLSBhL2NwdS9taWNyb2JsYXplL2NhY2hlLmMKKysrIGIvY3B1L21pY3JvYmxhemUvY2FjaGUuYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGFzbS9hc20uaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0NBQ0hFKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9DQUNIRSkKIAogaW50IGRjYWNoZV9zdGF0dXMgKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9jcHUvbWljcm9ibGF6ZS9pbnRlcnJ1cHRzLmMgYi9jcHUvbWljcm9ibGF6ZS9pbnRlcnJ1cHRzLmMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBiNjExNTNmLi4zZjA0YjI5Ci0tLSBhL2NwdS9taWNyb2JsYXplL2ludGVycnVwdHMuYworKysgYi9jcHUvbWljcm9ibGF6ZS9pbnRlcnJ1cHRzLmMKQEAgLTE5MCw3ICsxOTAsNyBAQAogfQogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JUlEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lSUSkKICNpZmRlZiBDRkdfSU5UQ18wCiBpbnQgZG9faXJxaW5mbyAoY21kX3RibF90ICogY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQogewpAQCAtMjE3LDQgKzIxNyw0IEBACiAJcHV0cyAoIlVuZGVmaW5lZCBpbnRlcnJ1cHQgY29udHJvbGxlclxuIik7CiB9CiAjZW5kaWYKLSNlbmRpZgkJCQkvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lSUSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jcHUvbWljcm9ibGF6ZS9pcnEuUyBiL2NwdS9taWNyb2JsYXplL2lycS5TCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL2NwdS9taXBzL2F1MXgwMF9ldGguYyBiL2NwdS9taXBzL2F1MXgwMF9ldGguYwppbmRleCAwNzhlODMyLi5iNjk3NDFhIDEwMDY0NAotLS0gYS9jcHUvbWlwcy9hdTF4MDBfZXRoLmMKKysrIGIvY3B1L21pcHMvYXUxeDAwX2V0aC5jCkBAIC02Myw3ICs2Myw3IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2F1MXgwMC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCiAjaW5jbHVkZSA8bWlpcGh5Lmg+CiAjZW5kaWYKIApAQCAtMjQxLDcgKzI0MSw3IEBACiAKIAlldGhfcmVnaXN0ZXIoZGV2KTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogCW1paXBoeV9yZWdpc3RlcihkZXYtPm5hbWUsCiAJCWF1MXgwMF9taWlwaHlfcmVhZCwgYXUxeDAwX21paXBoeV93cml0ZSk7CiAjZW5kaWYKQEAgLTI0OSw3ICsyNDksNyBAQAogCXJldHVybiAxOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCiBpbnQgIGF1MXgwMF9taWlwaHlfcmVhZChjaGFyICpkZXZuYW1lLCB1bnNpZ25lZCBjaGFyIGFkZHIsCiAJCXVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBzaG9ydCAqIHZhbHVlKQogewpAQCAtMzA2LDYgKzMwNiw2IEBACiAJKm1paV9jb250cm9sX3JlZyA9IG1paV9jb250cm9sOwogCXJldHVybiAwOwogfQotI2VuZGlmCS8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJICovCisjZW5kaWYKIAogI2VuZGlmIC8qIENPTkZJR19BVTFYMDAgKi8KZGlmZiAtLWdpdCBhL2NwdS9tcGM1MTJ4L01ha2VmaWxlIGIvY3B1L21wYzUxMngvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJlMzViMgotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9tcGM1MTJ4L01ha2VmaWxlCkBAIC0wLDAgKzEsNDYgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA3IERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcKKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQ1BVKS5hCisKK1NUQVJUCT0gc3RhcnQubworQ09CSlMJPSB0cmFwcy5vIGNwdS5vIGNwdV9pbml0Lm8gc3BlZWQubyBpbnRlcnJ1cHRzLm8gc2VyaWFsLm8gZmVjLm8gaTJjLm8KKworU1JDUwk6PSAkKFNUQVJUOi5vPS5TKSAkKFNPQkpTOi5vPS5TKSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTT0JKUykgJChDT0JKUykpCitTVEFSVAk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTVEFSVCkpCisKK2FsbDoJJChvYmopLmRlcGVuZCAkKFNUQVJUKSAkKExJQikKKworJChMSUIpOgkkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9jcHUvbXBjNTEyeC9jb25maWcubWsgYi9jcHUvbXBjNTEyeC9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEwN2M1YQotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9tcGM1MTJ4L2NvbmZpZy5tawpAQCAtMCwwICsxLDI1IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwNyBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCitQTEFURk9STV9SRUxGTEFHUyArPSAtZlBJQyAtZmZpeGVkLXIxNCAtbWVhYmkKKworUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURDT05GSUdfTVBDNTEyWCAtRENPTkZJR19FMzAwIFwKKwkJCS1mZml4ZWQtcjIgLWZmaXhlZC1yMjkgLW1zb2Z0LWZsb2F0IC1tY3B1PTYwM2UKZGlmZiAtLWdpdCBhL2NwdS9tcGM1MTJ4L2NwdS5jIGIvY3B1L21wYzUxMngvY3B1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNjYWU2ZQotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9tcGM1MTJ4L2NwdS5jCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIChDKSBDb3B5cmlnaHQgMjAwNyBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIENQVSBzcGVjaWZpYyBjb2RlIGZvciB0aGUgTVBDNTEyeCBmYW1pbHkuCisgKgorICogRGVyaXZlZCBmcm9tIHRoZSBNUEM4M3h4IGNvZGUuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxtcGM1MTJ4Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworaW50IGNoZWNrY3B1ICh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKwl1bG9uZyBjbG9jayA9IGdkLT5jcHVfY2xrOworCXUzMiBwdnIgPSBnZXRfcHZyICgpOworCXUzMiBzcHJpZHIgPSBpbW1yLT5zeXNjb25mLnNwcmlkcjsKKwljaGFyIGJ1ZlszMl07CisKKwlwdXRzICgiQ1BVOiAgICIpOworCisJc3dpdGNoIChzcHJpZHIgJiAweGZmZmYwMDAwKSB7CisJY2FzZSBTUFJfNTEyMUU6CisJCXB1dHMgKCJNUEM1MTIxZSAiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmICgiVW5rbm93biBwYXJ0IElEICUwOHggIiwgc3ByaWRyICYgMHhmZmZmMDAwMCk7CisJfQorCXByaW50ZiAoInJldi4gJWQuJWQsIENvcmUgIiwgU1ZSX01KUkVWIChzcHJpZHIpLCBTVlJfTU5SRVYgKHNwcmlkcikpOworCisJc3dpdGNoIChwdnIgJiAweGZmZmYwMDAwKSB7CisJY2FzZSBQVlJfRTMwMEM0OgorCQlwdXRzICgiZTMwMGM0ICIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwdXRzICgidW5rbm93biAiKTsKKwl9CisJcHJpbnRmICgiYXQgJXMgTUh6LCBDU0IgYXQgJTNkIE1IelxuIiwgc3RybWh6KGJ1ZiwgY2xvY2spLAorCQlnZC0+Y3NiX2NsayAvIDEwMDAwMDApOworCXJldHVybiAwOworfQorCisKK2ludAorZG9fcmVzZXQgKGNtZF90YmxfdCAqIGNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwl1bG9uZyBtc3I7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKworCS8qIEludGVycnVwdHMgYW5kIE1NVSBvZmYgKi8KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1mbXNyICAgICUwIjoiPXIiIChtc3IpOik7CisKKwltc3IgJj0gfiggTVNSX0VFIHwgTVNSX0lSIHwgTVNSX0RSKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm10bXNyICAgICUwIjo6InIiIChtc3IpKTsKKworCS8qCisJICogRW5hYmxlIFJlc2V0IENvbnRyb2wgUmVnIC0gIlJTVEUiIGlzIHRoZSBtYWdpYyB3b3JkIHRoYXQgbGV0IHVzIGdvCisJICovCisJaW1tYXAtPnJlc2V0LnJwciA9IDB4NTI1MzU0NDU7CisKKwkvKiBWZXJpZnkgUmVzZXQgQ29udHJvbCBSZWcgaXMgZW5hYmxlZCAqLworCXdoaWxlICghKChpbW1hcC0+cmVzZXQucmNlcikgJiBSQ0VSX0NSRSkpCisJCTsKKworCXByaW50ZiAoIlJlc2V0dGluZyB0aGUgYm9hcmQuXG4iKTsKKwl1ZGVsYXkoMjAwKTsKKworCS8qIFBlcmZvcm0gcmVzZXQgKi8KKwlpbW1hcC0+cmVzZXQucmNyID0gUkNSX1NXSFI7CisKKwkvKiBVbnJlYWNoZWQuLi4gKi8KKwlyZXR1cm4gMTsKK30KKworCisvKgorICogR2V0IHRpbWViYXNlIGNsb2NrIGZyZXF1ZW5jeSAobGlrZSBjcHVfY2xrIGluIEh6KQorICovCit1bnNpZ25lZCBsb25nIGdldF90YmNsayAodm9pZCkKK3sKKwl1bG9uZyB0YmNsazsKKworCXRiY2xrID0gKGdkLT5idXNfY2xrICsgM0wpIC8gNEw7CisKKwlyZXR1cm4gdGJjbGs7Cit9CisKKworI2lmIGRlZmluZWQoQ09ORklHX1dBVENIRE9HKQordm9pZCB3YXRjaGRvZ19yZXNldCAodm9pZCkKK3sKKwlpbnQgcmVfZW5hYmxlID0gZGlzYWJsZV9pbnRlcnJ1cHRzICgpOworCisJLyogUmVzZXQgd2F0Y2hkb2cgKi8KKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CisJaW1tci0+d2R0LnN3c3JyID0gMHg1NTZjOworCWltbXItPndkdC5zd3NyciA9IDB4YWEzOTsKKworCWlmIChyZV9lbmFibGUpCisJCWVuYWJsZV9pbnRlcnJ1cHRzICgpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jcHUvbXBjNTEyeC9jcHVfaW5pdC5jIGIvY3B1L21wYzUxMngvY3B1X2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjk0OWY2Ci0tLSAvZGV2L251bGwKKysrIGIvY3B1L21wYzUxMngvY3B1X2luaXQuYwpAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIChDKSBDb3B5cmlnaHQgMjAwNyBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogRGVyaXZlZCBmcm9tIHRoZSBNUEM4M3h4IGNvZGUuCisgKgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtcGM1MTJ4Lmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisvKgorICogU2V0IHVwIHRoZSBtZW1vcnkgbWFwLCBpbml0aWFsaXplIHJlZ2lzdGVycywKKyAqLwordm9pZCBjcHVfaW5pdF9mICh2b2xhdGlsZSBpbW1hcF90ICogaW0pCit7CisJdTMyIGlwc19kaXY7CisKKwkvKiBQb2ludGVyIGlzIHdyaXRhYmxlIHNpbmNlIHdlIGFsbG9jYXRlZCBhIHJlZ2lzdGVyIGZvciBpdCAqLworCWdkID0gKGdkX3QgKikgKENGR19JTklUX1JBTV9BRERSICsgQ0ZHX0dCTF9EQVRBX09GRlNFVCk7CisKKwkvKiBDbGVhciBpbml0aWFsIGdsb2JhbCBkYXRhICovCisJbWVtc2V0ICgodm9pZCAqKSBnZCwgMCwgc2l6ZW9mIChnZF90KSk7CisKKwkvKiBzeXN0ZW0gcGVyZm9ybWFuY2UgdHdlYWtpbmcgKi8KKworI2lmZGVmIENGR19BQ1JfUElQRV9ERVAKKwkvKiBBcmJpdGVyIHBpcGVsaW5lIGRlcHRoICovCisJaW0tPmFyYml0ZXIuYWNyID0gKGltLT5hcmJpdGVyLmFjciAmIH5BQ1JfUElQRV9ERVApIHwKKwkJCSAgKENGR19BQ1JfUElQRV9ERVAgPDwgQUNSX1BJUEVfREVQX1NISUZUKTsKKyNlbmRpZgorCisjaWZkZWYgQ0ZHX0FDUl9SUFRDTlQKKwkvKiBBcmJpdGVyIHJlcGVhdCBjb3VudCAqLworCWltLT5hcmJpdGVyLmFjciA9ICgoaW0tPmFyYml0ZXIuYWNyICYgfihBQ1JfUlBUQ05UKSkgfAorCQkJICAgKENGR19BQ1JfUlBUQ05UIDw8IEFDUl9SUFRDTlRfU0hJRlQpKTsKKyNlbmRpZgorCisJLyogUlNSIC0gUmVzZXQgU3RhdHVzIFJlZ2lzdGVyIC0gY2xlYXIgYWxsIHN0YXR1cyAqLworCWdkLT5yZXNldF9zdGF0dXMgPSBpbS0+cmVzZXQucnNyOworCWltLT5yZXNldC5yc3IgPSB+KFJTUl9SRVMpOworCisJLyoKKwkgKiBSTVIgLSBSZXNldCBNb2RlIFJlZ2lzdGVyIC0gZW5hYmxlIGNoZWNrc3RvcCByZXNldAorCSAqLworCWltLT5yZXNldC5ybXIgPSAoUk1SX0NTUkUgJiAoMSA8PCBSTVJfQ1NSRV9TSElGVCkpOworCisJLyogU2V0IElQUy1DU0IgZGl2aWRlcjogSVBTID0gMS8yIENTQiAqLworCWlwc19kaXYgPSBpbS0+Y2xrLnNjZnJbMF07CisJaXBzX2RpdiAmPSB+KFNDRlIxX0lQU19ESVZfTUFTSyk7CisJaXBzX2RpdiB8PSBTQ0ZSMV9JUFNfRElWIDw8IFNDRlIxX0lQU19ESVZfU0hJRlQ7CisJaW0tPmNsay5zY2ZyWzBdID0gaXBzX2RpdjsKKworCS8qCisJICogRW5hYmxlIFRpbWUgQmFzZS9EZWNyZW1lbnRlcgorCSAqCisJICogTk9USUNFOiBUQiBuZWVkcyB0byBiZSBlbmFibGVkIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGluIG9yZGVyIHRvCisJICogaGF2ZSB1ZGVsYXkoKSB3b3JraW5nOyBpZiBub3QgZW5hYmxlZCwgdXN1YWxseSBsZWFkcyB0byBhIGhhbmcsIGxpa2UKKwkgKiBkdXJpbmcgRkxBU0ggY2hpcCBpZGVudGlmaWNhdGlvbiBldGMuCisJICovCisJaW0tPnN5c2NvbmYuc3BjciB8PSBTUENSX1RCRU47Cit9CisKK2ludCBjcHVfaW5pdF9yICh2b2lkKQoreworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY3B1L21wYzUxMngvZmVjLmMgYi9jcHUvbXBjNTEyeC9mZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzE0MmE5Ci0tLSAvZGV2L251bGwKKysrIGIvY3B1L21wYzUxMngvZmVjLmMKQEAgLTAsMCArMSw4MDEgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNworICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBEZXJpdmVkIGZyb20gdGhlIE1QQzh4eCBGRUMgZHJpdmVyLgorICogQWRhcHRlZCBmb3IgTVBDNTEyeCBieSBHcnplZ29yeiBCZXJuYWNraSA8Z2piQHNlbWloYWxmLmNvbT4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjNTEyeC5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPG5ldC5oPgorI2luY2x1ZGUgPG1paXBoeS5oPgorI2luY2x1ZGUgImZlYy5oIgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworI2RlZmluZSBERUJVRyAwCisKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIFwKKwlkZWZpbmVkKENPTkZJR19NUEM1MTJ4X0ZFQykKKworI2lmICEoZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKSkKKyNlcnJvciAiQ09ORklHX01JSSBoYXMgdG8gYmUgZGVmaW5lZCEiCisjZW5kaWYKKworI2lmIChERUJVRyAmIDB4NDApCitzdGF0aWMgdWludDMyIGxvY2FsX2NyYzMyKGNoYXIgKnN0cmluZywgdW5zaWduZWQgaW50IGNyY192YWx1ZSwgaW50IGxlbik7CisjZW5kaWYKKworaW50IGZlYzUxMnhfbWlpcGh5X3JlYWQoY2hhciAqZGV2bmFtZSwgdWludDggcGh5QWRkciwgdWludDggcmVnQWRkciwgdWludDE2ICogcmV0VmFsKTsKK2ludCBmZWM1MTJ4X21paXBoeV93cml0ZShjaGFyICpkZXZuYW1lLCB1aW50OCBwaHlBZGRyLCB1aW50OCByZWdBZGRyLCB1aW50MTYgZGF0YSk7CitpbnQgbXBjNTEyeF9mZWNfaW5pdF9waHkoc3RydWN0IGV0aF9kZXZpY2UgKmRldiwgYmRfdCAqIGJpcyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAoREVCVUcgJiAweDIpCitzdGF0aWMgdm9pZCBtcGM1MTJ4X2ZlY19waHlkdW1wIChjaGFyICpkZXZuYW1lKQoreworCXVpbnQxNiBwaHlTdGF0dXMsIGk7CisJdWludDggcGh5QWRkciA9IENPTkZJR19QSFlfQUREUjsKKwl1aW50OCByZWdfbWFza1tdID0geworCQkvKiByZWdzIHRvIHByaW50OiAwLi4uOCwgMjEsMjcsMzEgKi8KKwkJMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAgICAxLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwKKwkJMCwgMCwgMCwgMCwgIDAsIDEsIDAsIDAsICAgICAwLCAwLCAwLCAxLCAgMCwgMCwgMCwgMSwKKwl9OworCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJaWYgKHJlZ19tYXNrW2ldKSB7CisJCQltaWlwaHlfcmVhZCAoZGV2bmFtZSwgcGh5QWRkciwgaSwgJnBoeVN0YXR1cyk7CisJCQlwcmludGYgKCJNaWkgcmVnICVkOiAweCUwNHhcbiIsIGksIHBoeVN0YXR1cyk7CisJCX0KKwl9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBtcGM1MTJ4X2ZlY19iZF9pbml0IChtcGM1MTJ4X2ZlY19wcml2ICpmZWMpCit7CisJaW50IGl4OworCisJLyoKKwkgKiBSZWNlaXZlIEJEcyBpbml0CisJICovCisJZm9yIChpeCA9IDA7IGl4IDwgRkVDX1JCRF9OVU07IGl4KyspIHsKKwkJZmVjLT5iZEJhc2UtPnJiZFtpeF0uZGF0YVBvaW50ZXIgPSAodWludDMyKSZmZWMtPmJkQmFzZS0+cmVjdl9mcmFtZXNbaXhdOworCQlmZWMtPmJkQmFzZS0+cmJkW2l4XS5zdGF0dXMgPSBGRUNfUkJEX0VNUFRZOworCQlmZWMtPmJkQmFzZS0+cmJkW2l4XS5kYXRhTGVuZ3RoID0gMDsKKwl9CisKKwkvKgorCSAqIGhhdmUgdGhlIGxhc3QgUkJEIHRvIGNsb3NlIHRoZSByaW5nCisJICovCisJZmVjLT5iZEJhc2UtPnJiZFtpeCAtIDFdLnN0YXR1cyB8PSBGRUNfUkJEX1dSQVA7CisJZmVjLT5yYmRJbmRleCA9IDA7CisKKwkvKgorCSAqIFRyYXNtaXQgQkRzIGluaXQKKwkgKi8KKwlmb3IgKGl4ID0gMDsgaXggPCBGRUNfVEJEX05VTTsgaXgrKykgeworCQlmZWMtPmJkQmFzZS0+dGJkW2l4XS5zdGF0dXMgPSAwOworCX0KKworCS8qCisJICogSGF2ZSB0aGUgbGFzdCBUQkQgdG8gY2xvc2UgdGhlIHJpbmcKKwkgKi8KKwlmZWMtPmJkQmFzZS0+dGJkW2l4IC0gMV0uc3RhdHVzIHw9IEZFQ19UQkRfV1JBUDsKKworCS8qCisJICogSW5pdGlhbGl6ZSBzb21lIGluZGljZXMKKwkgKi8KKwlmZWMtPnRiZEluZGV4ID0gMDsKKwlmZWMtPnVzZWRUYmRJbmRleCA9IDA7CisJZmVjLT5jbGVhblRiZE51bSA9IEZFQ19UQkRfTlVNOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIG1wYzUxMnhfZmVjX3JiZF9jbGVhbiAobXBjNTEyeF9mZWNfcHJpdiAqZmVjLCB2b2xhdGlsZSBGRUNfUkJEICogcFJiZCkKK3sKKwkvKgorCSAqIFJlc2V0IGJ1ZmZlciBkZXNjcmlwdG9yIGFzIGVtcHR5CisJICovCisJaWYgKChmZWMtPnJiZEluZGV4KSA9PSAoRkVDX1JCRF9OVU0gLSAxKSkKKwkJcFJiZC0+c3RhdHVzID0gKEZFQ19SQkRfV1JBUCB8IEZFQ19SQkRfRU1QVFkpOworCWVsc2UKKwkJcFJiZC0+c3RhdHVzID0gRkVDX1JCRF9FTVBUWTsKKworCXBSYmQtPmRhdGFMZW5ndGggPSAwOworCisJLyoKKwkgKiBJbmNyZW1lbnQgQkQgY291bnQKKwkgKi8KKwlmZWMtPnJiZEluZGV4ID0gKGZlYy0+cmJkSW5kZXggKyAxKSAlIEZFQ19SQkRfTlVNOworCisJLyoKKwkgKiBOb3csIHdlIGhhdmUgYW4gZW1wdHkgUnhCRCwgbm90aWZ5IEZFQworCSAqLworCWZlYy0+ZXRoLT5yX2Rlc19hY3RpdmUgPSAweDAxMDAwMDAwOwkvKiBEZXNjcmlwdG9yIHBvbGxpbmcgYWN0aXZlICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIG1wYzUxMnhfZmVjX3RiZF9zY3J1YiAobXBjNTEyeF9mZWNfcHJpdiAqZmVjKQoreworCXZvbGF0aWxlIEZFQ19UQkQgKnBVc2VkVGJkOworCisjaWYgKERFQlVHICYgMHgxKQorCXByaW50ZiAoInRiZF9zY3J1YjogZmVjLT5jbGVhblRiZE51bSA9ICVkLCBmZWMtPnVzZWRUYmRJbmRleCA9ICVkXG4iLAorCQlmZWMtPmNsZWFuVGJkTnVtLCBmZWMtPnVzZWRUYmRJbmRleCk7CisjZW5kaWYKKworCS8qCisJICogcHJvY2VzcyBhbGwgdGhlIGNvbnN1bWVkIFRCRHMKKwkgKi8KKwl3aGlsZSAoZmVjLT5jbGVhblRiZE51bSA8IEZFQ19UQkRfTlVNKSB7CisJCXBVc2VkVGJkID0gJmZlYy0+YmRCYXNlLT50YmRbZmVjLT51c2VkVGJkSW5kZXhdOworCQlpZiAocFVzZWRUYmQtPnN0YXR1cyAmIEZFQ19UQkRfUkVBRFkpIHsKKyNpZiAoREVCVUcgJiAweDIwKQorCQkJcHJpbnRmICgiQ2Fubm90IGNsZWFuIFRCRCAlZCwgaW4gdXNlXG4iLCBmZWMtPnVzZWRUYmRJbmRleCk7CisjZW5kaWYKKwkJCXJldHVybjsKKwkJfQorCisJCS8qCisJCSAqIGNsZWFuIHRoaXMgYnVmZmVyIGRlc2NyaXB0b3IKKwkJICovCisJCWlmIChmZWMtPnVzZWRUYmRJbmRleCA9PSAoRkVDX1RCRF9OVU0gLSAxKSkKKwkJCXBVc2VkVGJkLT5zdGF0dXMgPSBGRUNfVEJEX1dSQVA7CisJCWVsc2UKKwkJCXBVc2VkVGJkLT5zdGF0dXMgPSAwOworCisJCS8qCisJCSAqIHVwZGF0ZSBzb21lIGluZGVjZXMgZm9yIGEgY29ycmVjdCBoYW5kbGluZyBvZiB0aGUgVEJEIHJpbmcKKwkJICovCisJCWZlYy0+Y2xlYW5UYmROdW0rKzsKKwkJZmVjLT51c2VkVGJkSW5kZXggPSAoZmVjLT51c2VkVGJkSW5kZXggKyAxKSAlIEZFQ19UQkRfTlVNOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgbXBjNTEyeF9mZWNfc2V0X2h3YWRkciAobXBjNTEyeF9mZWNfcHJpdiAqZmVjLCBjaGFyICptYWMpCit7CisJdWludDggY3VyckJ5dGU7CQkJLyogYnl0ZSBmb3Igd2hpY2ggdG8gY29tcHV0ZSB0aGUgQ1JDICovCisJaW50IGJ5dGU7CQkJLyogbG9vcCAtIGNvdW50ZXIgKi8KKwlpbnQgYml0OwkJCS8qIGxvb3AgLSBjb3VudGVyICovCisJdWludDMyIGNyYyA9IDB4ZmZmZmZmZmY7CS8qIGluaXRpYWwgdmFsdWUgKi8KKworCS8qCisJICogVGhlIGFsZ29yaXRobSB1c2VkIGlzIHRoZSBmb2xsb3dpbmc6CisJICogd2UgbG9vcCBvbiBlYWNoIG9mIHRoZSBzaXggYnl0ZXMgb2YgdGhlIHByb3ZpZGVkIGFkZHJlc3MsCisJICogYW5kIHdlIGNvbXB1dGUgdGhlIENSQyBieSBsZWZ0LXNoaWZ0aW5nIHRoZSBwcmV2aW91cworCSAqIHZhbHVlIGJ5IG9uZSBwb3NpdGlvbiwgc28gdGhhdCBlYWNoIGJpdCBpbiB0aGUgY3VycmVudAorCSAqIGJ5dGUgb2YgdGhlIGFkZHJlc3MgbWF5IGNvbnRyaWJ1dGUgdGhlIGNhbGN1bGF0aW9uLiBJZgorCSAqIHRoZSBsYXR0ZXIgYW5kIHRoZSBNU0IgaW4gdGhlIENSQyBhcmUgZGlmZmVyZW50LCB0aGVuCisJICogdGhlIENSQyB2YWx1ZSBzbyBjb21wdXRlZCBpcyBhbHNvIGV4LW9yZWQgd2l0aCB0aGUKKwkgKiAicG9seW5vbWl1bSBnZW5lcmF0b3IiLiBUaGUgY3VycmVudCBieXRlIG9mIHRoZSBhZGRyZXNzCisJICogaXMgYWxzbyBzaGlmdGVkIHJpZ2h0IGJ5IG9uZSBiaXQgYXQgZWFjaCBpdGVyYXRpb24uCisJICogVGhpcyBpcyBiZWNhdXNlIHRoZSBDUkMgZ2VuZXJhdG9yZSBpbiBoYXJkd2FyZSBpcyBpbXBsZW1lbnRlZAorCSAqIGFzIGEgc2hpZnQtcmVnaXN0ZXIgd2l0aCBhcyBtYW55IGV4LW9yZXMgYXMgdGhlIHJhZGl4ZXMKKwkgKiBpbiB0aGUgcG9seW5vbWl1bS4gVGhpcyBzdWdnZXN0cyB0aGF0IHdlIHJlcHJlc2VudCB0aGUKKwkgKiBwb2x5bm9taXVtbSBpdHNlbGYgYXMgYSAzMi1iaXQgY29uc3RhbnQuCisJICovCisJZm9yIChieXRlID0gMDsgYnl0ZSA8IDY7IGJ5dGUrKykgeworCQljdXJyQnl0ZSA9IG1hY1tieXRlXTsKKwkJZm9yIChiaXQgPSAwOyBiaXQgPCA4OyBiaXQrKykgeworCQkJaWYgKChjdXJyQnl0ZSAmIDB4MDEpIF4gKGNyYyAmIDB4MDEpKSB7CisJCQkJY3JjID4+PSAxOworCQkJCWNyYyA9IGNyYyBeIDB4ZWRiODgzMjA7CisJCQl9IGVsc2UgeworCQkJCWNyYyA+Pj0gMTsKKwkJCX0KKwkJCWN1cnJCeXRlID4+PSAxOworCQl9CisJfQorCisJY3JjID0gY3JjID4+IDI2OworCisJLyoKKwkgKiBTZXQgaW5kaXZpZHVhbCBoYXNoIHRhYmxlIHJlZ2lzdGVyCisJICovCisJaWYgKGNyYyA+PSAzMikgeworCQlmZWMtPmV0aC0+aWFkZHIxID0gKDEgPDwgKGNyYyAtIDMyKSk7CisJCWZlYy0+ZXRoLT5pYWRkcjIgPSAwOworCX0gZWxzZSB7CisJCWZlYy0+ZXRoLT5pYWRkcjEgPSAwOworCQlmZWMtPmV0aC0+aWFkZHIyID0gKDEgPDwgY3JjKTsKKwl9CisKKwkvKgorCSAqIFNldCBwaHlzaWNhbCBhZGRyZXNzCisJICovCisJZmVjLT5ldGgtPnBhZGRyMSA9IChtYWNbMF0gPDwgMjQpICsgKG1hY1sxXSA8PCAxNikgKyAobWFjWzJdIDw8IDgpICsgbWFjWzNdOworCWZlYy0+ZXRoLT5wYWRkcjIgPSAobWFjWzRdIDw8IDI0KSArIChtYWNbNV0gPDwgMTYpICsgMHg4ODA4OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IG1wYzUxMnhfZmVjX2luaXQgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYsIGJkX3QgKiBiaXMpCit7CisJbXBjNTEyeF9mZWNfcHJpdiAqZmVjID0gKG1wYzUxMnhfZmVjX3ByaXYgKilkZXYtPnByaXY7CisKKyNpZiAoREVCVUcgJiAweDEpCisJcHJpbnRmICgibXBjNTEyeF9mZWNfaW5pdC4uLiBCZWdpblxuIik7CisjZW5kaWYKKworCS8qIFNldCBpbnRlcnJ1cHQgbWFzayByZWdpc3RlciAqLworCWZlYy0+ZXRoLT5pbWFzayA9IDB4MDAwMDAwMDA7CisKKwkvKiBDbGVhciBGRUMtTGl0ZSBpbnRlcnJ1cHQgZXZlbnQgcmVnaXN0ZXIoSUVWRU5UKSAqLworCWZlYy0+ZXRoLT5pZXZlbnQgPSAweGZmZmZmZmZmOworCisJLyogU2V0IHRyYW5zbWl0IGZpZm8gd2F0ZXJtYXJrIHJlZ2lzdGVyKFhfV01SSyksIGRlZmF1bHQgPSA2NCAqLworCWZlYy0+ZXRoLT54X3dtcmsgPSAweDA7CisKKwkvKiBTZXQgT3Bjb2RlL1BhdXNlIER1cmF0aW9uIFJlZ2lzdGVyICovCisJZmVjLT5ldGgtPm9wX3BhdXNlID0gMHgwMDAxMDAyMDsKKworCS8qIEZyYW1lIGxlbmd0aD0xNTE4OyBNSUkgbW9kZSAqLworCWZlYy0+ZXRoLT5yX2NudHJsID0gMHgwNWVlMDAwYzsKKworCS8qIEhhbGYtZHVwbGV4LCBoZWFydGJlYXQgZGlzYWJsZWQgKi8KKwlmZWMtPmV0aC0+eF9jbnRybCA9IDB4MDAwMDAwMDA7CisKKwkvKiBFbmFibGUgTUlCIGNvdW50ZXJzICovCisJZmVjLT5ldGgtPm1pYl9jb250cm9sID0gMHgwOworCisJLyogU2V0dXAgcmVjdiBmaWZvIHN0YXJ0IGFuZCBidWZmIHNpemUgKi8KKwlmZWMtPmV0aC0+cl9mc3RhcnQgPSAweDUwMDsKKwlmZWMtPmV0aC0+cl9idWZmX3NpemUgPSAweDVlMDsKKworCS8qIFNldHVwIEJEIGJhc2UgYWRkcmVzc2VzICovCisJZmVjLT5ldGgtPnJfZGVzX3N0YXJ0ID0gKHVpbnQzMilmZWMtPmJkQmFzZS0+cmJkOworCWZlYy0+ZXRoLT54X2Rlc19zdGFydCA9ICh1aW50MzIpZmVjLT5iZEJhc2UtPnRiZDsKKworCS8qIERNQSBDb250cm9sICovCisJZmVjLT5ldGgtPmRtYV9jb250cm9sID0gMHhjMDAwMDAwMDsKKworCS8qIEVuYWJsZSBGRUMgKi8KKwlmZWMtPmV0aC0+ZWNudHJsIHw9IDB4MDAwMDAwMDY7CisKKwkvKiBJbml0aWxpemUgYWRkcmVzc2VzIGFuZCBzdGF0dXMgd29yZHMgb2YgQkRzICovCisJbXBjNTEyeF9mZWNfYmRfaW5pdCAoZmVjKTsKKworCSAvKiBEZXNjcmlwdG9yIHBvbGxpbmcgYWN0aXZlICovCisJZmVjLT5ldGgtPnJfZGVzX2FjdGl2ZSA9IDB4MDEwMDAwMDA7CisKKyNpZiAoREVCVUcgJiAweDEpCisJcHJpbnRmKCJtcGM1MTJ4X2ZlY19pbml0Li4uIERvbmUgXG4iKTsKKyNlbmRpZgorCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbXBjNTEyeF9mZWNfaW5pdF9waHkgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYsIGJkX3QgKiBiaXMpCit7CisJbXBjNTEyeF9mZWNfcHJpdiAqZmVjID0gKG1wYzUxMnhfZmVjX3ByaXYgKilkZXYtPnByaXY7CisJY29uc3QgdWludDggcGh5QWRkciA9IENPTkZJR19QSFlfQUREUjsJLyogT25seSBvbmUgUEhZICovCisJaW50IHRpbWVvdXQgPSAxOworCXVpbnQxNiBwaHlTdGF0dXM7CisKKyNpZiAoREVCVUcgJiAweDEpCisJcHJpbnRmICgibXBjNTEyeF9mZWNfaW5pdF9waHkuLi4gQmVnaW5cbiIpOworI2VuZGlmCisKKwkvKgorCSAqIENsZWFyIEZFQy1MaXRlIGludGVycnVwdCBldmVudCByZWdpc3RlcihJRVZFTlQpCisJICovCisJZmVjLT5ldGgtPmlldmVudCA9IDB4ZmZmZmZmZmY7CisKKwkvKgorCSAqIFNldCBpbnRlcnJ1cHQgbWFzayByZWdpc3RlcgorCSAqLworCWZlYy0+ZXRoLT5pbWFzayA9IDB4MDAwMDAwMDA7CisKKwlpZiAoZmVjLT54Y3ZfdHlwZSAhPSBTRVZFTldJUkUpIHsKKwkJLyoKKwkJICogU2V0IE1JSV9TUEVFRCA9ICgxLyhtaWlfc3BlZWQgKiAyKSkgKiBTeXN0ZW0gQ2xvY2sKKwkJICogYW5kIGRvIG5vdCBkcm9wIHRoZSBQcmVhbWJsZS4KKwkJICovCisJCWZlYy0+ZXRoLT5taWlfc3BlZWQgPSAoKChnZC0+aXBiX2NsayAvIDEwMDAwMDApIC8gNSkgKyAxKSA8PCAxOworCisJCS8qCisJCSAqIFJlc2V0IFBIWSwgdGhlbiBkZWxheSAzMDBucworCQkgKi8KKwkJbWlpcGh5X3dyaXRlIChkZXYtPm5hbWUsIHBoeUFkZHIsIDB4MCwgMHg4MDAwKTsKKwkJdWRlbGF5ICgxMDAwKTsKKworCQlpZiAoZmVjLT54Y3ZfdHlwZSA9PSBNSUkxMCkgeworCQkvKgorCQkgKiBGb3JjZSAxMEJhc2UtVCwgRkRYIG9wZXJhdGlvbgorCQkgKi8KKyNpZiAoREVCVUcgJiAweDIpCisJCQlwcmludGYgKCJGb3JjaW5nIDEwIE1icHMgZXRoZXJuZXQgbGluay4uLiAiKTsKKyNlbmRpZgorCQkJbWlpcGh5X3JlYWQgKGRldi0+bmFtZSwgcGh5QWRkciwgMHgxLCAmcGh5U3RhdHVzKTsKKworCQkJbWlpcGh5X3dyaXRlIChkZXYtPm5hbWUsIHBoeUFkZHIsIDB4MCwgMHgwMTgwKTsKKworCQkJdGltZW91dCA9IDIwOworCQkJZG8geyAgICAvKiB3YWl0IGZvciBsaW5rIHN0YXR1cyB0byBnbyBkb3duICovCisJCQkJdWRlbGF5ICgxMDAwMCk7CisJCQkJaWYgKCh0aW1lb3V0LS0pID09IDApIHsKKyNpZiAoREVCVUcgJiAweDIpCisJCQkJCXByaW50ZiAoImhtbW0sIHNob3VsZCBub3QgaGF2ZSB3YWl0ZWQuLi4iKTsKKyNlbmRpZgorCQkJCQlicmVhazsKKwkJCQl9CisJCQkJbWlpcGh5X3JlYWQgKGRldi0+bmFtZSwgcGh5QWRkciwgMHgxLCAmcGh5U3RhdHVzKTsKKyNpZiAoREVCVUcgJiAweDIpCisJCQkJcHJpbnRmICgiPSIpOworI2VuZGlmCisJCQl9IHdoaWxlICgocGh5U3RhdHVzICYgMHgwMDA0KSk7IC8qICFsaW5rIHVwICovCisKKwkJCXRpbWVvdXQgPSAxMDAwOworCQkJZG8geyAgICAvKiB3YWl0IGZvciBsaW5rIHN0YXR1cyB0byBjb21lIGJhY2sgdXAgKi8KKwkJCQl1ZGVsYXkgKDEwMDAwKTsKKwkJCQlpZiAoKHRpbWVvdXQtLSkgPT0gMCkgeworCQkJCQlwcmludGYgKCJmYWlsZWQuIExpbmsgaXMgZG93bi5cbiIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJbWlpcGh5X3JlYWQgKGRldi0+bmFtZSwgcGh5QWRkciwgMHgxLCAmcGh5U3RhdHVzKTsKKyNpZiAoREVCVUcgJiAweDIpCisJCQkJcHJpbnRmICgiKyIpOworI2VuZGlmCisJCQl9IHdoaWxlICghKHBoeVN0YXR1cyAmIDB4MDAwNCkpOyAvKiAhbGluayB1cCAqLworCisjaWYgKERFQlVHICYgMHgyKQorCQkJcHJpbnRmICgiZG9uZS5cbiIpOworI2VuZGlmCisJCX0gZWxzZSB7CS8qIE1JSTEwMCAqLworCQkJLyoKKwkJCSAqIFNldCB0aGUgYXV0by1uZWdvdGlhdGlvbiBhZHZlcnRpc2VtZW50IHJlZ2lzdGVyIGJpdHMKKwkJCSAqLworCQkJbWlpcGh5X3dyaXRlIChkZXYtPm5hbWUsIHBoeUFkZHIsIDB4NCwgMHgwMWUxKTsKKworCQkJLyoKKwkJCSAqIFNldCBNRElPIGJpdCAwLjEyID0gMSgmJiBiaXQgMC45PTE/KSB0byBlbmFibGUgYXV0by1uZWdvdGlhdGlvbgorCQkJICovCisJCQltaWlwaHlfd3JpdGUgKGRldi0+bmFtZSwgcGh5QWRkciwgMHgwLCAweDEyMDApOworCisJCQkvKgorCQkJICogV2FpdCBmb3IgQU4gY29tcGxldGlvbgorCQkJICovCisJCQl0aW1lb3V0ID0gNTAwMDA7CisJCQlkbyB7CisJCQkJdWRlbGF5ICgxMDAwKTsKKworCQkJCWlmICgodGltZW91dC0tKSA9PSAwKSB7CisjaWYgKERFQlVHICYgMHgyKQorCQkJCQlwcmludGYgKCJQSFkgYXV0byBuZWcgMCBmYWlsZWQuLi5cbiIpOworI2VuZGlmCisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisKKwkJCQlpZiAobWlpcGh5X3JlYWQgKGRldi0+bmFtZSwgcGh5QWRkciwgMHgxLCAmcGh5U3RhdHVzKSAhPSAwKSB7CisjaWYgKERFQlVHICYgMHgyKQorCQkJCQlwcmludGYgKCJQSFkgYXV0byBuZWcgMSBmYWlsZWQgMHglMDR4Li4uXG4iLCBwaHlTdGF0dXMpOworI2VuZGlmCisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQl9IHdoaWxlICghKHBoeVN0YXR1cyAmIDB4MDAwNCkpOworCisjaWYgKERFQlVHICYgMHgyKQorCQkJcHJpbnRmICgiUEhZIGF1dG8gbmVnIGNvbXBsZXRlISBcbiIpOworI2VuZGlmCisJCX0KKwl9CisKKyNpZiAoREVCVUcgJiAweDIpCisJaWYgKGZlYy0+eGN2X3R5cGUgIT0gU0VWRU5XSVJFKQorCQltcGM1MTJ4X2ZlY19waHlkdW1wIChkZXYtPm5hbWUpOworI2VuZGlmCisKKyNpZiAoREVCVUcgJiAweDEpCisJcHJpbnRmICgibXBjNTEyeF9mZWNfaW5pdF9waHkuLi4gRG9uZSBcbiIpOworI2VuZGlmCisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIG1wYzUxMnhfZmVjX2hhbHQgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYpCit7CisJbXBjNTEyeF9mZWNfcHJpdiAqZmVjID0gKG1wYzUxMnhfZmVjX3ByaXYgKilkZXYtPnByaXY7CisJaW50IGNvdW50ZXIgPSAweGZmZmY7CisKKyNpZiAoREVCVUcgJiAweDIpCisJaWYgKGZlYy0+eGN2X3R5cGUgIT0gU0VWRU5XSVJFKQorCQltcGM1MTJ4X2ZlY19waHlkdW1wIChkZXYtPm5hbWUpOworI2VuZGlmCisKKwkvKgorCSAqIG1hc2sgRkVDIGNoaXAgaW50ZXJydXB0cworCSAqLworCWZlYy0+ZXRoLT5pbWFzayA9IDA7CisKKwkvKgorCSAqIGlzc3VlIGdyYWNlZnVsIHN0b3AgY29tbWFuZCB0byB0aGUgRkVDIHRyYW5zbWl0dGVyIGlmIG5lY2Vzc2FyeQorCSAqLworCWZlYy0+ZXRoLT54X2NudHJsIHw9IDB4MDAwMDAwMDE7CisKKwkvKgorCSAqIHdhaXQgZm9yIGdyYWNlZnVsIHN0b3AgdG8gcmVnaXN0ZXIKKwkgKi8KKwl3aGlsZSAoKGNvdW50ZXItLSkgJiYgKCEoZmVjLT5ldGgtPmlldmVudCAmIDB4MTAwMDAwMDApKSkgOworCisJLyoKKwkgKiBEaXNhYmxlIHRoZSBFdGhlcm5ldCBDb250cm9sbGVyCisJICovCisJZmVjLT5ldGgtPmVjbnRybCAmPSAweGZmZmZmZmZkOworCisJLyoKKwkgKiBJc3N1ZSBhIHJlc2V0IGNvbW1hbmQgdG8gdGhlIEZFQyBjaGlwCisJICovCisJZmVjLT5ldGgtPmVjbnRybCB8PSAweDE7CisKKwkvKgorCSAqIHdhaXQgYXQgbGVhc3QgMTYgY2xvY2sgY3ljbGVzCisJICovCisJdWRlbGF5ICgxMCk7CisjaWYgKERFQlVHICYgMHgzKQorCXByaW50ZiAoIkV0aGVybmV0IHRhc2sgc3RvcHBlZFxuIik7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IG1wYzUxMnhfZmVjX3NlbmQgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYsIHZvbGF0aWxlIHZvaWQgKmV0aF9kYXRhLAorCQlpbnQgZGF0YV9sZW5ndGgpCit7CisJLyoKKwkgKiBUaGlzIHJvdXRpbmUgdHJhbnNtaXRzIG9uZSBmcmFtZS4gIFRoaXMgcm91dGluZSBvbmx5IGFjY2VwdHMKKwkgKiA2LWJ5dGUgRXRoZXJuZXQgYWRkcmVzc2VzLgorCSAqLworCW1wYzUxMnhfZmVjX3ByaXYgKmZlYyA9IChtcGM1MTJ4X2ZlY19wcml2ICopZGV2LT5wcml2OworCXZvbGF0aWxlIEZFQ19UQkQgKnBUYmQ7CisKKyNpZiAoREVCVUcgJiAweDIwKQorCXByaW50ZigidGJkIHN0YXR1czogMHglMDR4XG4iLCBmZWMtPnRiZEJhc2VbZmVjLT50YmRJbmRleF0uc3RhdHVzKTsKKyNlbmRpZgorCisJLyoKKwkgKiBDbGVhciBUeCBCRCByaW5nIGF0IGZpcnN0CisJICovCisJbXBjNTEyeF9mZWNfdGJkX3NjcnViIChmZWMpOworCisJLyoKKwkgKiBDaGVjayBmb3IgdmFsaWQgbGVuZ3RoIG9mIGRhdGEuCisJICovCisJaWYgKChkYXRhX2xlbmd0aCA+IDE1MDApIHx8IChkYXRhX2xlbmd0aCA8PSAwKSkgeworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBDaGVjayB0aGUgbnVtYmVyIG9mIHZhY2FudCBUeEJEcy4KKwkgKi8KKwlpZiAoZmVjLT5jbGVhblRiZE51bSA8IDEpIHsKKyNpZiAoREVCVUcgJiAweDIwKQorCQlwcmludGYgKCJObyBhdmFpbGFibGUgVHhCRHMgLi4uXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBHZXQgdGhlIGZpcnN0IFR4QkQgdG8gc2VuZCB0aGUgbWFjIGhlYWRlcgorCSAqLworCXBUYmQgPSAmZmVjLT5iZEJhc2UtPnRiZFtmZWMtPnRiZEluZGV4XTsKKwlwVGJkLT5kYXRhTGVuZ3RoID0gZGF0YV9sZW5ndGg7CisJcFRiZC0+ZGF0YVBvaW50ZXIgPSAodWludDMyKWV0aF9kYXRhOworCXBUYmQtPnN0YXR1cyB8PSBGRUNfVEJEX0xBU1QgfCBGRUNfVEJEX1RDIHwgRkVDX1RCRF9SRUFEWTsKKwlmZWMtPnRiZEluZGV4ID0gKGZlYy0+dGJkSW5kZXggKyAxKSAlIEZFQ19UQkRfTlVNOworCisJLyogQWN0aXZhdGUgdHJhbnNtaXQgQnVmZmVyIERlc2NyaXB0b3IgcG9sbGluZyAqLworCWZlYy0+ZXRoLT54X2Rlc19hY3RpdmUgPSAweDAxMDAwMDAwOwkvKiBEZXNjcmlwdG9yIHBvbGxpbmcgYWN0aXZlCSovCisKKyNpZiAoREVCVUcgJiAweDgpCisJcHJpbnRmICggIisiICk7CisjZW5kaWYKKworCWZlYy0+Y2xlYW5UYmROdW0gLT0gMTsKKworCS8qCisJICogd2FpdCB1bnRpbCBmcmFtZSBpcyBzZW50IC4KKwkgKi8KKwl3aGlsZSAocFRiZC0+c3RhdHVzICYgRkVDX1RCRF9SRUFEWSkgeworCQl1ZGVsYXkgKDEwKTsKKyNpZiAoREVCVUcgJiAweDgpCisJCXByaW50ZiAoIlREQiBzdGF0dXMgPSAlMDR4XG4iLCBwVGJkLT5zdGF0dXMpOworI2VuZGlmCisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBtcGM1MTJ4X2ZlY19yZWN2IChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2KQoreworCS8qCisJICogVGhpcyBjb21tYW5kIHB1bGxzIG9uZSBmcmFtZSBmcm9tIHRoZSBjYXJkCisJICovCisJbXBjNTEyeF9mZWNfcHJpdiAqZmVjID0gKG1wYzUxMnhfZmVjX3ByaXYgKilkZXYtPnByaXY7CisJdm9sYXRpbGUgRkVDX1JCRCAqcFJiZCA9ICZmZWMtPmJkQmFzZS0+cmJkW2ZlYy0+cmJkSW5kZXhdOworCXVuc2lnbmVkIGxvbmcgaWV2ZW50OworCWludCBmcmFtZV9sZW5ndGgsIGxlbiA9IDA7CisJdWNoYXIgYnVmZltGRUNfTUFYX1BLVF9TSVpFXTsKKworI2lmIChERUJVRyAmIDB4MSkKKwlwcmludGYgKCJtcGM1MTJ4X2ZlY19yZWN2ICVkIFN0YXJ0Li4uXG4iLCBmZWMtPnJiZEluZGV4KTsKKyNlbmRpZgorI2lmIChERUJVRyAmIDB4OCkKKwlwcmludGYoICItIiApOworI2VuZGlmCisKKwkvKgorCSAqIENoZWNrIGlmIGFueSBjcml0aWNhbCBldmVudHMgaGF2ZSBoYXBwZW5lZAorCSAqLworCWlldmVudCA9IGZlYy0+ZXRoLT5pZXZlbnQ7CisJZmVjLT5ldGgtPmlldmVudCA9IGlldmVudDsKKwlpZiAoaWV2ZW50ICYgMHgyMDA2MDAwMCkgeworCQkvKiBCQUJULCBSeC9UeCBGSUZPIGVycm9ycyAqLworCQltcGM1MTJ4X2ZlY19oYWx0IChkZXYpOworCQltcGM1MTJ4X2ZlY19pbml0IChkZXYsIE5VTEwpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGlldmVudCAmIDB4ODAwMDAwMDApIHsKKwkJLyogSGVhcnRiZWF0IGVycm9yICovCisJCWZlYy0+ZXRoLT54X2NudHJsIHw9IDB4MDAwMDAwMDE7CisJfQorCWlmIChpZXZlbnQgJiAweDEwMDAwMDAwKSB7CisJCS8qIEdyYWNlZnVsIHN0b3AgY29tcGxldGUgKi8KKwkJaWYgKGZlYy0+ZXRoLT54X2NudHJsICYgMHgwMDAwMDAwMSkgeworCQkJbXBjNTEyeF9mZWNfaGFsdCAoZGV2KTsKKwkJCWZlYy0+ZXRoLT54X2NudHJsICY9IH4weDAwMDAwMDAxOworCQkJbXBjNTEyeF9mZWNfaW5pdCAoZGV2LCBOVUxMKTsKKwkJfQorCX0KKworCWlmICghKHBSYmQtPnN0YXR1cyAmIEZFQ19SQkRfRU1QVFkpKSB7CisJCWlmICgocFJiZC0+c3RhdHVzICYgRkVDX1JCRF9MQVNUKSAmJgorCQkJIShwUmJkLT5zdGF0dXMgJiBGRUNfUkJEX0VSUikgJiYKKwkJCSgocFJiZC0+ZGF0YUxlbmd0aCAtIDQpID4gMTQpKSB7CisKKwkJCS8qCisJCQkgKiBHZXQgYnVmZmVyIHNpemUKKwkJCSAqLworCQkJZnJhbWVfbGVuZ3RoID0gcFJiZC0+ZGF0YUxlbmd0aCAtIDQ7CisKKyNpZiAoREVCVUcgJiAweDIwKQorCQkJeworCQkJCWludCBpOworCQkJCXByaW50ZiAoInJlY3YgZGF0YSBoZHI6Iik7CisJCQkJZm9yIChpID0gMDsgaSA8IDE0OyBpKyspCisJCQkJCXByaW50ZiAoIiV4ICIsICooKHVpbnQ4KilwUmJkLT5kYXRhUG9pbnRlciArIGkpKTsKKwkJCQlwcmludGYoIlxuIik7CisJCQl9CisjZW5kaWYKKworCQkJLyoKKwkJCSAqICBGaWxsIHRoZSBidWZmZXIgYW5kIHBhc3MgaXQgdG8gdXBwZXIgbGF5ZXJzCisJCQkgKi8KKwkJCW1lbWNweSAoYnVmZiwgKHZvaWQqKXBSYmQtPmRhdGFQb2ludGVyLCBmcmFtZV9sZW5ndGgpOworCQkJTmV0UmVjZWl2ZSAoKHVjaGFyKilidWZmLCBmcmFtZV9sZW5ndGgpOworCQkJbGVuID0gZnJhbWVfbGVuZ3RoOworCQl9CisKKwkJLyoKKwkJICogUmVzZXQgYnVmZmVyIGRlc2NyaXB0b3IgYXMgZW1wdHkKKwkJICovCisJCW1wYzUxMnhfZmVjX3JiZF9jbGVhbiAoZmVjLCBwUmJkKTsKKwl9CisKKwkvKiBUcnkgdG8gZmlsbCBCdWZmZXIgRGVzY3JpcHRvcnMgKi8KKwlmZWMtPmV0aC0+cl9kZXNfYWN0aXZlID0gMHgwMTAwMDAwMDsJLyogRGVzY3JpcHRvciBwb2xsaW5nIGFjdGl2ZSAqLworCXJldHVybiBsZW47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtcGM1MTJ4X2ZlY19pbml0aWFsaXplIChiZF90ICogYmlzKQoreworCisJaW1tYXBfdCAqaW0gPSAoaW1tYXBfdCopIENGR19JTU1SOworCW1wYzUxMnhfZmVjX3ByaXYgKmZlYzsKKwlzdHJ1Y3QgZXRoX2RldmljZSAqZGV2OworCWludCBpOworCWNoYXIgKnRtcCwgKmVuZCwgZW52X2VuZXRhZGRyWzZdOworCXVpbnQzMiAqcmVnOworCXZvaWQgKiBiZDsKKworCWZlYyA9IChtcGM1MTJ4X2ZlY19wcml2ICopIG1hbGxvYyAoc2l6ZW9mKCpmZWMpKTsKKwlkZXYgPSAoc3RydWN0IGV0aF9kZXZpY2UgKikgbWFsbG9jIChzaXplb2YoKmRldikpOworCW1lbXNldCAoZGV2LCAwLCBzaXplb2YgKmRldik7CisKKwlmZWMtPmV0aCA9IChldGhlcm5ldF9yZWdzICopIE1QQzUxMlhfRkVDOworCisjIGlmbmRlZiBDT05GSUdfRkVDXzEwTUJJVAorCWZlYy0+eGN2X3R5cGUgPSBNSUkxMDA7CisjIGVsc2UKKwlmZWMtPnhjdl90eXBlID0gTUlJMTA7CisjIGVuZGlmCisJZGV2LT5wcml2ID0gKHZvaWQgKilmZWM7CisJZGV2LT5pb2Jhc2UgPSBNUEM1MTJYX0ZFQzsKKwlkZXYtPmluaXQgPSBtcGM1MTJ4X2ZlY19pbml0OworCWRldi0+aGFsdCA9IG1wYzUxMnhfZmVjX2hhbHQ7CisJZGV2LT5zZW5kID0gbXBjNTEyeF9mZWNfc2VuZDsKKwlkZXYtPnJlY3YgPSBtcGM1MTJ4X2ZlY19yZWN2OworCisJc3ByaW50ZiAoZGV2LT5uYW1lLCAiRkVDIEVUSEVSTkVUIik7CisJZXRoX3JlZ2lzdGVyIChkZXYpOworCisjaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKQorCW1paXBoeV9yZWdpc3RlciAoZGV2LT5uYW1lLAorCQkJZmVjNTEyeF9taWlwaHlfcmVhZCwgZmVjNTEyeF9taWlwaHlfd3JpdGUpOworI2VuZGlmCisKKwkvKgorCSAqIEluaXRpYWxpemUgSVxPIHBpbnMKKwkgKi8KKwlyZWcgPSAodWludDMyICopICYoaW0tPmlvX2N0cmwucmVnc1tQU0MwXzBfSURYXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTU7IGkrKykKKwkJcmVnW2ldID0gSU9DVFJMX01VWF9GRUMgfCAweDAwMDAwMDAxOworCisJaW0tPmlvX2N0cmwucmVnc1tTUERJRl9UWENMT0NLX0lEWF0gPSBJT0NUUkxfTVVYX0ZFQyB8IDB4MDAwMDAwMDE7CisJaW0tPmlvX2N0cmwucmVnc1tTUERJRl9UWF9JRFhdID0gSU9DVFJMX01VWF9GRUMgfCAweDAwMDAwMDAxOworCWltLT5pb19jdHJsLnJlZ3NbU1BESUZfUlhfSURYXSA9IElPQ1RSTF9NVVhfRkVDIHwgMHgwMDAwMDAwMTsKKworCS8qIENsZWFuIHVwIHNwYWNlIEZFQydzIE1JQiBhbmQgRklGTyBSQU0gLi4uKi8KKwltZW1zZXQgKCh2b2lkICopIE1QQzUxMlhfRkVDICsgMHgyMDAsIDB4MDAsIDB4NDAwKTsKKworCS8qCisJICogTWFsbG9jIHNwYWNlIGZvciBCRHMgIChtdXN0IGJlIHF1YWQgd29yZC1hbGlnbmVkKQorCSAqIHRoaXMgcG9pbnRlciBpcyBsb3N0LCBzbyBjYW5ub3QgYmUgZnJlZWQKKwkgKi8KKwliZCA9IG1hbGxvYyAoc2l6ZW9mKG1wYzUxMnhfYnVmZl9kZXNjcykgKyAweDFmKTsKKwlmZWMtPmJkQmFzZSA9IChtcGM1MTJ4X2J1ZmZfZGVzY3MqKSgodWludDMyKWJkICYgMHhmZmZmZmZmMCk7CisJbWVtc2V0ICgodm9pZCAqKSBiZCwgMHgwMCwgc2l6ZW9mKG1wYzUxMnhfYnVmZl9kZXNjcykgKyAweDFmKTsKKworCS8qCisJICogU2V0IGludGVycnVwdCBtYXNrIHJlZ2lzdGVyCisJICovCisJZmVjLT5ldGgtPmltYXNrID0gMHgwMDAwMDAwMDsKKworCS8qCisJICogQ2xlYXIgRkVDLUxpdGUgaW50ZXJydXB0IGV2ZW50IHJlZ2lzdGVyKElFVkVOVCkKKwkgKi8KKwlmZWMtPmV0aC0+aWV2ZW50ID0gMHhmZmZmZmZmZjsKKworCS8qCisJICogVHJ5IHRvIHNldCB0aGUgbWFjIGFkZHJlc3Mgbm93LiBUaGUgZmVjIG1hYyBhZGRyZXNzIGlzCisJICogYSBnYXJiYWdlIGFmdGVyIHJlc2V0LiBXaGVuIG5vdCB1c2luZyBmZWMgZm9yIGJvb3RpbmcKKwkgKiB0aGUgTGludXggZmVjIGRyaXZlciB3aWxsIHRyeSB0byB3b3JrIHdpdGggdGhpcyBnYXJiYWdlLgorCSAqLworCXRtcCA9IGdldGVudiAoImV0aGFkZHIiKTsKKwlpZiAodG1wKSB7CisJCWZvciAoaT0wOyBpPDY7IGkrKykgeworCQkJZW52X2VuZXRhZGRyW2ldID0gdG1wID8gc2ltcGxlX3N0cnRvdWwgKHRtcCwgJmVuZCwgMTYpIDogMDsKKwkJCWlmICh0bXApCisJCQkJdG1wID0gKCplbmQpID8gZW5kKzEgOiBlbmQ7CisJCX0KKwkJbXBjNTEyeF9mZWNfc2V0X2h3YWRkciAoZmVjLCBlbnZfZW5ldGFkZHIpOworCQlmZWMtPmV0aC0+Z2FkZHIxID0gMHgwMDAwMDAwMDsKKwkJZmVjLT5ldGgtPmdhZGRyMiA9IDB4MDAwMDAwMDA7CisJfQorCisJbXBjNTEyeF9mZWNfaW5pdF9waHkgKGRldiwgYmlzKTsKKworCXJldHVybiAxOworfQorCisvKiBNSUktaW50ZXJmYWNlIHJlbGF0ZWQgZnVuY3Rpb25zICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZmVjNTEyeF9taWlwaHlfcmVhZCAoY2hhciAqZGV2bmFtZSwgdWludDggcGh5QWRkciwgdWludDggcmVnQWRkciwgdWludDE2ICogcmV0VmFsKQoreworCWV0aGVybmV0X3JlZ3MgKmV0aCA9IChldGhlcm5ldF9yZWdzICopIE1QQzUxMlhfRkVDOworCXVpbnQzMiByZWc7CQkvKiBjb252ZW5pZW50IGhvbGRlciBmb3IgdGhlIFBIWSByZWdpc3RlciAqLworCXVpbnQzMiBwaHk7CQkvKiBjb252ZW5pZW50IGhvbGRlciBmb3IgdGhlIFBIWSAqLworCWludCB0aW1lb3V0ID0gMHhmZmZmOworCisJLyoKKwkgKiByZWFkaW5nIGZyb20gYW55IFBIWSdzIHJlZ2lzdGVyIGlzIGRvbmUgYnkgcHJvcGVybHkKKwkgKiBwcm9ncmFtbWluZyB0aGUgRkVDJ3MgTUlJIGRhdGEgcmVnaXN0ZXIuCisJICovCisJcmVnID0gcmVnQWRkciA8PCBGRUNfTUlJX0RBVEFfUkFfU0hJRlQ7CisJcGh5ID0gcGh5QWRkciA8PCBGRUNfTUlJX0RBVEFfUEFfU0hJRlQ7CisKKwlldGgtPm1paV9kYXRhID0gKEZFQ19NSUlfREFUQV9TVCB8IEZFQ19NSUlfREFUQV9PUF9SRCB8IEZFQ19NSUlfREFUQV9UQSB8IHBoeSB8IHJlZyk7CisKKwkvKgorCSAqIHdhaXQgZm9yIHRoZSByZWxhdGVkIGludGVycnVwdAorCSAqLworCXdoaWxlICgodGltZW91dC0tKSAmJiAoIShldGgtPmlldmVudCAmIDB4MDA4MDAwMDApKSkgOworCisJaWYgKHRpbWVvdXQgPT0gMCkgeworI2lmIChERUJVRyAmIDB4MikKKwkJcHJpbnRmICgiUmVhZCBNRElPIGZhaWxlZC4uLlxuIik7CisjZW5kaWYKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogY2xlYXIgbWlpIGludGVycnVwdCBiaXQKKwkgKi8KKwlldGgtPmlldmVudCA9IDB4MDA4MDAwMDA7CisKKwkvKgorCSAqIGl0J3Mgbm93IHNhZmUgdG8gcmVhZCB0aGUgUEhZJ3MgcmVnaXN0ZXIKKwkgKi8KKwkqcmV0VmFsID0gKHVpbnQxNikgZXRoLT5taWlfZGF0YTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZmVjNTEyeF9taWlwaHlfd3JpdGUgKGNoYXIgKmRldm5hbWUsIHVpbnQ4IHBoeUFkZHIsIHVpbnQ4IHJlZ0FkZHIsIHVpbnQxNiBkYXRhKQoreworCWV0aGVybmV0X3JlZ3MgKmV0aCA9IChldGhlcm5ldF9yZWdzICopIE1QQzUxMlhfRkVDOworCXVpbnQzMiByZWc7CQkvKiBjb252ZW5pZW50IGhvbGRlciBmb3IgdGhlIFBIWSByZWdpc3RlciAqLworCXVpbnQzMiBwaHk7CQkvKiBjb252ZW5pZW50IGhvbGRlciBmb3IgdGhlIFBIWSAqLworCWludCB0aW1lb3V0ID0gMHhmZmZmOworCisJcmVnID0gcmVnQWRkciA8PCBGRUNfTUlJX0RBVEFfUkFfU0hJRlQ7CisJcGh5ID0gcGh5QWRkciA8PCBGRUNfTUlJX0RBVEFfUEFfU0hJRlQ7CisKKwlldGgtPm1paV9kYXRhID0gKEZFQ19NSUlfREFUQV9TVCB8IEZFQ19NSUlfREFUQV9PUF9XUiB8CisJCQlGRUNfTUlJX0RBVEFfVEEgfCBwaHkgfCByZWcgfCBkYXRhKTsKKworCS8qCisJICogd2FpdCBmb3IgdGhlIE1JSSBpbnRlcnJ1cHQKKwkgKi8KKwl3aGlsZSAoKHRpbWVvdXQtLSkgJiYgKCEoZXRoLT5pZXZlbnQgJiAweDAwODAwMDAwKSkpIDsKKworCWlmICh0aW1lb3V0ID09IDApIHsKKyNpZiAoREVCVUcgJiAweDIpCisJCXByaW50ZiAoIldyaXRlIE1ESU8gZmFpbGVkLi4uXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBjbGVhciBNSUkgaW50ZXJydXB0IGJpdAorCSAqLworCWV0aC0+aWV2ZW50ID0gMHgwMDgwMDAwMDsKKworCXJldHVybiAwOworfQorCisjaWYgKERFQlVHICYgMHg0MCkKK3N0YXRpYyB1aW50MzIgbG9jYWxfY3JjMzIgKGNoYXIgKnN0cmluZywgdW5zaWduZWQgaW50IGNyY192YWx1ZSwgaW50IGxlbikKK3sKKwlpbnQgaTsKKwljaGFyIGM7CisJdW5zaWduZWQgaW50IGNyYywgY291bnQ7CisKKwkvKgorCSAqIGNyYzMyIGFsZ29yaXRobQorCSAqLworCS8qCisJICogY3JjID0gMHhmZmZmZmZmZjsgKiBUaGUgaW5pdGlhbGl6ZWQgdmFsdWUgc2hvdWxkIGJlIDB4ZmZmZmZmZmYKKwkgKi8KKwljcmMgPSBjcmNfdmFsdWU7CisKKwlmb3IgKGkgPSBsZW47IC0taSA+PSAwOykgeworCQljID0gKnN0cmluZysrOworCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCA4OyBjb3VudCsrKSB7CisJCQlpZiAoKGMgJiAweDAxKSBeIChjcmMgJiAweDAxKSkgeworCQkJCWNyYyA+Pj0gMTsKKwkJCQljcmMgPSBjcmMgXiAweGVkYjg4MzIwOworCQkJfSBlbHNlIHsKKwkJCQljcmMgPj49IDE7CisJCQl9CisJCQljID4+PSAxOworCQl9CisJfQorCisJLyoKKwkgKiBJbiBiaWcgZW5kaWFuIHN5c3RlbSwgZG8gYnl0ZSBzd2FwaW5nIGZvciBjcmMgdmFsdWUKKwkgKi8KKwkgLyoqLyByZXR1cm4gY3JjOworfQorI2VuZGlmCS8qIERFQlVHICovCisKKyNlbmRpZiAvKiBDT05GSUdfTVBDNTEyeF9GRUMgKi8KZGlmZiAtLWdpdCBhL2NwdS9tcGM1MTJ4L2ZlYy5oIGIvY3B1L21wYzUxMngvZmVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJkODc3YQotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9tcGM1MTJ4L2ZlYy5oCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAzIC0gMjAwNworICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBEZXJpdmVkIGZyb20gdGhlIE1QQzh4eCBkcml2ZXIncyBoZWFkZXIgZmlsZS4KKyAqLworCisjaWZuZGVmIF9fTVBDNTEyWF9GRUNfSAorI2RlZmluZSBfX01QQzUxMlhfRkVDX0gKKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1wYzUxMnguaD4KKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHVpbnQzMjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdWludDE2OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVpbnQ4OworCit0eXBlZGVmIHN0cnVjdCBldGhlcm5ldF9yZWdpc3Rlcl9zZXQgeworCisvKiBbMTA6Ml1hZGRyID0gMDAgKi8KKworLyogIENvbnRyb2wgYW5kIHN0YXR1cyBSZWdpc3RlcnMgKG9mZnNldCAwMDAtMUZGKSAqLworCisJdm9sYXRpbGUgdWludDMyIGZlY19pZDsJCQkvKiBNQkFSX0VUSCArIDB4MDAwICovCisJdm9sYXRpbGUgdWludDMyIGlldmVudDsJCQkvKiBNQkFSX0VUSCArIDB4MDA0ICovCisJdm9sYXRpbGUgdWludDMyIGltYXNrOwkJCS8qIE1CQVJfRVRIICsgMHgwMDggKi8KKworCXZvbGF0aWxlIHVpbnQzMiBSRVMwWzFdOwkJLyogTUJBUl9FVEggKyAweDAwQyAqLworCXZvbGF0aWxlIHVpbnQzMiByX2Rlc19hY3RpdmU7CQkvKiBNQkFSX0VUSCArIDB4MDEwICovCisJdm9sYXRpbGUgdWludDMyIHhfZGVzX2FjdGl2ZTsJCS8qIE1CQVJfRVRIICsgMHgwMTQgKi8KKworCXZvbGF0aWxlIHVpbnQzMiBSRVMxWzNdOwkJLyogTUJBUl9FVEggKyAweDAxOC0wMjAgKi8KKwl2b2xhdGlsZSB1aW50MzIgZWNudHJsOwkJCS8qIE1CQVJfRVRIICsgMHgwMjQgKi8KKworCXZvbGF0aWxlIHVpbnQzMiBSRVMyWzZdOwkJLyogTUJBUl9FVEggKyAweDAyOC0wM0MgKi8KKwl2b2xhdGlsZSB1aW50MzIgbWlpX2RhdGE7CQkvKiBNQkFSX0VUSCArIDB4MDQwICovCisJdm9sYXRpbGUgdWludDMyIG1paV9zcGVlZDsJCS8qIE1CQVJfRVRIICsgMHgwNDQgKi8KKworCXZvbGF0aWxlIHVpbnQzMiBSRVMzWzddOwkJLyogTUJBUl9FVEggKyAweDA0OC0wNjAgKi8KKwl2b2xhdGlsZSB1aW50MzIgbWliX2NvbnRyb2w7CQkvKiBNQkFSX0VUSCArIDB4MDY0ICovCisKKwl2b2xhdGlsZSB1aW50MzIgUkVTNFs3XTsJCS8qIE1CQVJfRVRIICsgMHgwNjgtODAgKi8KKwl2b2xhdGlsZSB1aW50MzIgcl9jbnRybDsJCS8qIE1CQVJfRVRIICsgMHgwODQgKi8KKwl2b2xhdGlsZSB1aW50MzIgcl9oYXNoOwkJCS8qIE1CQVJfRVRIICsgMHgwODggKi8KKworCXZvbGF0aWxlIHVpbnQzMiBSRVM1WzE0XTsJCS8qIE1CQVJfRVRIICsgMHgwOGMtMEMwICovCisJdm9sYXRpbGUgdWludDMyIHhfY250cmw7CQkvKiBNQkFSX0VUSCArIDB4MEM0ICovCisKKwl2b2xhdGlsZSB1aW50MzIgUkVTNls3XTsJCS8qIE1CQVJfRVRIICsgMHgwQzgtMEUwICovCisJdm9sYXRpbGUgdWludDMyIHBhZGRyMTsJCQkvKiBNQkFSX0VUSCArIDB4MEU0ICovCisJdm9sYXRpbGUgdWludDMyIHBhZGRyMjsJCQkvKiBNQkFSX0VUSCArIDB4MEU4ICovCisJdm9sYXRpbGUgdWludDMyIG9wX3BhdXNlOwkJLyogTUJBUl9FVEggKyAweDBFQyAqLworCisJdm9sYXRpbGUgdWludDMyIFJFUzdbMTBdOwkJLyogTUJBUl9FVEggKyAweDBGMC0xMTQgKi8KKwl2b2xhdGlsZSB1aW50MzIgaWFkZHIxOwkJCS8qIE1CQVJfRVRIICsgMHgxMTggKi8KKwl2b2xhdGlsZSB1aW50MzIgaWFkZHIyOwkJCS8qIE1CQVJfRVRIICsgMHgxMUMgKi8KKwl2b2xhdGlsZSB1aW50MzIgZ2FkZHIxOwkJCS8qIE1CQVJfRVRIICsgMHgxMjAgKi8KKwl2b2xhdGlsZSB1aW50MzIgZ2FkZHIyOwkJCS8qIE1CQVJfRVRIICsgMHgxMjQgKi8KKworCXZvbGF0aWxlIHVpbnQzMiBSRVM4WzZdOwkJLyogTUJBUl9FVEggKyAweDEyOC0xM0MgKi8KKwl2b2xhdGlsZSB1aW50MzIgZmlmb19pZDsJCS8qIE1CQVJfRVRIICsgMHgxNDAgKi8KKwl2b2xhdGlsZSB1aW50MzIgeF93bXJrOwkJCS8qIE1CQVJfRVRIICsgMHgxNDQgKi8KKwl2b2xhdGlsZSB1aW50MzIgUkVTOVsxXTsJCS8qIE1CQVJfRVRIICsgMHgxNDggKi8KKwl2b2xhdGlsZSB1aW50MzIgcl9ib3VuZDsJCS8qIE1CQVJfRVRIICsgMHgxNEMgKi8KKwl2b2xhdGlsZSB1aW50MzIgcl9mc3RhcnQ7CQkvKiBNQkFSX0VUSCArIDB4MTUwICovCisKKwl2b2xhdGlsZSB1aW50MzIgUkVTMTBbMTFdOwkJLyogTUJBUl9FVEggKyAweDE1NC0xN0MgKi8KKwl2b2xhdGlsZSB1aW50MzIgcl9kZXNfc3RhcnQ7CQkvKiBNQkFSX0VUSCArIDB4MTgwICovCisJdm9sYXRpbGUgdWludDMyIHhfZGVzX3N0YXJ0OwkJLyogTUJBUl9FVEggKyAweDE4NCAqLworCXZvbGF0aWxlIHVpbnQzMiByX2J1ZmZfc2l6ZTsJCS8qIE1CQVJfRVRIICsgMHgxODggKi8KKwl2b2xhdGlsZSB1aW50MzIgUkVTMTFbMjZdOwkJLyogTUJBUl9FVEggKyAweDE4Qy0xRjAgKi8KKwl2b2xhdGlsZSB1aW50MzIgZG1hX2NvbnRyb2w7CQkvKiBNQkFSX0VUSCArIDB4MUY0ICovCisJdm9sYXRpbGUgdWludDMyIFJFUzEyWzJdOwkJLyogTUJBUl9FVEggKyAweDFGOC0xRkMgKi8KKworLyogIE1JQiBDT1VOVEVSUyAoT2Zmc2V0IDIwMC0yRkYpICovCisKKwl2b2xhdGlsZSB1aW50MzIgcm1vbl90X2Ryb3A7CQkvKiBNQkFSX0VUSCArIDB4MjAwICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fdF9wYWNrZXRzOwkJLyogTUJBUl9FVEggKyAweDIwNCAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3RfYmNfcGt0OwkJLyogTUJBUl9FVEggKyAweDIwOCAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3RfbWNfcGt0OwkJLyogTUJBUl9FVEggKyAweDIwQyAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3RfY3JjX2FsaWduOwkvKiBNQkFSX0VUSCArIDB4MjEwICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fdF91bmRlcnNpemU7CS8qIE1CQVJfRVRIICsgMHgyMTQgKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl90X292ZXJzaXplOwkvKiBNQkFSX0VUSCArIDB4MjE4ICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fdF9mcmFnOwkJLyogTUJBUl9FVEggKyAweDIxQyAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3RfamFiOwkJLyogTUJBUl9FVEggKyAweDIyMCAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3RfY29sOwkJLyogTUJBUl9FVEggKyAweDIyNCAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3RfcDY0OwkJLyogTUJBUl9FVEggKyAweDIyOCAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3RfcDY1dG8xMjc7CS8qIE1CQVJfRVRIICsgMHgyMkMgKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl90X3AxMjh0bzI1NTsJLyogTUJBUl9FVEggKyAweDIzMCAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3RfcDI1NnRvNTExOwkvKiBNQkFSX0VUSCArIDB4MjM0ICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fdF9wNTEydG8xMDIzOwkvKiBNQkFSX0VUSCArIDB4MjM4ICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fdF9wMTAyNHRvMjA0NzsJLyogTUJBUl9FVEggKyAweDIzQyAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3RfcF9ndGUyMDQ4OwkvKiBNQkFSX0VUSCArIDB4MjQwICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fdF9vY3RldHM7CQkvKiBNQkFSX0VUSCArIDB4MjQ0ICovCisJdm9sYXRpbGUgdWludDMyIGllZWVfdF9kcm9wOwkJLyogTUJBUl9FVEggKyAweDI0OCAqLworCXZvbGF0aWxlIHVpbnQzMiBpZWVlX3RfZnJhbWVfb2s7CS8qIE1CQVJfRVRIICsgMHgyNEMgKi8KKwl2b2xhdGlsZSB1aW50MzIgaWVlZV90XzFjb2w7CQkvKiBNQkFSX0VUSCArIDB4MjUwICovCisJdm9sYXRpbGUgdWludDMyIGllZWVfdF9tY29sOwkJLyogTUJBUl9FVEggKyAweDI1NCAqLworCXZvbGF0aWxlIHVpbnQzMiBpZWVlX3RfZGVmOwkJLyogTUJBUl9FVEggKyAweDI1OCAqLworCXZvbGF0aWxlIHVpbnQzMiBpZWVlX3RfbGNvbDsJCS8qIE1CQVJfRVRIICsgMHgyNUMgKi8KKwl2b2xhdGlsZSB1aW50MzIgaWVlZV90X2V4Y29sOwkJLyogTUJBUl9FVEggKyAweDI2MCAqLworCXZvbGF0aWxlIHVpbnQzMiBpZWVlX3RfbWFjZXJyOwkJLyogTUJBUl9FVEggKyAweDI2NCAqLworCXZvbGF0aWxlIHVpbnQzMiBpZWVlX3RfY3NlcnI7CQkvKiBNQkFSX0VUSCArIDB4MjY4ICovCisJdm9sYXRpbGUgdWludDMyIGllZWVfdF9zcWU7CQkvKiBNQkFSX0VUSCArIDB4MjZDICovCisJdm9sYXRpbGUgdWludDMyIHRfZmR4ZmM7CQkvKiBNQkFSX0VUSCArIDB4MjcwICovCisJdm9sYXRpbGUgdWludDMyIGllZWVfdF9vY3RldHNfb2s7CS8qIE1CQVJfRVRIICsgMHgyNzQgKi8KKworCXZvbGF0aWxlIHVpbnQzMiBSRVMxM1syXTsJCS8qIE1CQVJfRVRIICsgMHgyNzgtMjdDICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fcl9kcm9wOwkJLyogTUJBUl9FVEggKyAweDI4MCAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3JfcGFja2V0czsJCS8qIE1CQVJfRVRIICsgMHgyODQgKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl9yX2JjX3BrdDsJCS8qIE1CQVJfRVRIICsgMHgyODggKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl9yX21jX3BrdDsJCS8qIE1CQVJfRVRIICsgMHgyOEMgKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl9yX2NyY19hbGlnbjsJLyogTUJBUl9FVEggKyAweDI5MCAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3JfdW5kZXJzaXplOwkvKiBNQkFSX0VUSCArIDB4Mjk0ICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fcl9vdmVyc2l6ZTsJLyogTUJBUl9FVEggKyAweDI5OCAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3JfZnJhZzsJCS8qIE1CQVJfRVRIICsgMHgyOUMgKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl9yX2phYjsJCS8qIE1CQVJfRVRIICsgMHgyQTAgKi8KKworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3JfcmVzdmRfMDsJCS8qIE1CQVJfRVRIICsgMHgyQTQgKi8KKworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3JfcDY0OwkJLyogTUJBUl9FVEggKyAweDJBOCAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3JfcDY1dG8xMjc7CS8qIE1CQVJfRVRIICsgMHgyQUMgKi8KKwl2b2xhdGlsZSB1aW50MzIgcm1vbl9yX3AxMjh0bzI1NTsJLyogTUJBUl9FVEggKyAweDJCMCAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3JfcDI1NnRvNTExOwkvKiBNQkFSX0VUSCArIDB4MkI0ICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fcl9wNTEydG8xMDIzOwkvKiBNQkFSX0VUSCArIDB4MkI4ICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fcl9wMTAyNHRvMjA0NzsJLyogTUJBUl9FVEggKyAweDJCQyAqLworCXZvbGF0aWxlIHVpbnQzMiBybW9uX3JfcF9ndGUyMDQ4OwkvKiBNQkFSX0VUSCArIDB4MkMwICovCisJdm9sYXRpbGUgdWludDMyIHJtb25fcl9vY3RldHM7CQkvKiBNQkFSX0VUSCArIDB4MkM0ICovCisJdm9sYXRpbGUgdWludDMyIGllZWVfcl9kcm9wOwkJLyogTUJBUl9FVEggKyAweDJDOCAqLworCXZvbGF0aWxlIHVpbnQzMiBpZWVlX3JfZnJhbWVfb2s7CS8qIE1CQVJfRVRIICsgMHgyQ0MgKi8KKwl2b2xhdGlsZSB1aW50MzIgaWVlZV9yX2NyYzsJCS8qIE1CQVJfRVRIICsgMHgyRDAgKi8KKwl2b2xhdGlsZSB1aW50MzIgaWVlZV9yX2FsaWduOwkJLyogTUJBUl9FVEggKyAweDJENCAqLworCXZvbGF0aWxlIHVpbnQzMiByX21hY2VycjsJCS8qIE1CQVJfRVRIICsgMHgyRDggKi8KKwl2b2xhdGlsZSB1aW50MzIgcl9mZHhmYzsJCS8qIE1CQVJfRVRIICsgMHgyREMgKi8KKwl2b2xhdGlsZSB1aW50MzIgaWVlZV9yX29jdGV0c19vazsJLyogTUJBUl9FVEggKyAweDJFMCAqLworCisJdm9sYXRpbGUgdWludDMyIFJFUzE0WzZdOwkJLyogTUJBUl9FVEggKyAweDJFNC0yRkMgKi8KKworCXZvbGF0aWxlIHVpbnQzMiBSRVMxNVs2NF07CQkvKiBNQkFSX0VUSCArIDB4MzAwLTNGRiAqLworfSBldGhlcm5ldF9yZWdzOworCisvKiBSZWNlaXZlICYgVHJhbnNtaXQgQnVmZmVyIERlc2NyaXB0b3IgZGVmaW5pdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0IEJ1ZmZlckRlc2NyaXB0b3IgeworCXVpbnQxNiBzdGF0dXM7CisJdWludDE2IGRhdGFMZW5ndGg7CisJdWludDMyIGRhdGFQb2ludGVyOworfSBGRUNfUkJEOworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2IHN0YXR1czsKKwl1aW50MTYgZGF0YUxlbmd0aDsKKwl1aW50MzIgZGF0YVBvaW50ZXI7Cit9IEZFQ19UQkQ7CisKKy8qIHByaXZhdGUgc3RydWN0dXJlICovCit0eXBlZGVmIGVudW0geworCVNFVkVOV0lSRSwJCQkvKiA3LXdpcmUgICAgICAgKi8KKwlNSUkxMCwJCQkJLyogTUlJIDEwTWJwcyAgICovCisJTUlJMTAwCQkJCS8qIE1JSSAxMDBNYnBzICAqLworfSB4Y2VpdmVyX3R5cGU7CisKKy8qIEJEIE51bWVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIEZFQ19UQkRfTlVNCQk0OAkvKiBUaGUgdXNlciBjYW4gYWRqdXN0IHRoaXMgdmFsdWUgKi8KKyNkZWZpbmUgRkVDX1JCRF9OVU0JCTMyCS8qIFRoZSB1c2VyIGNhbiBhZGp1c3QgdGhpcyB2YWx1ZSAqLworCisvKiBwYWNrZXQgc2l6ZSBsaW1pdCAqLworI2RlZmluZSBGRUNfTUFYX1BLVF9TSVpFCTE1MzYKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4IGZyYW1lW0ZFQ19NQVhfUEtUX1NJWkVdOworfSBtcGM1MTJ4X2ZyYW1lOworCit0eXBlZGVmIHN0cnVjdCB7CisJRkVDX1JCRCByYmRbRkVDX1JCRF9OVU1dOwkJCS8qIFJCRCByaW5nICovCisJRkVDX1RCRCB0YmRbRkVDX1RCRF9OVU1dOwkJCS8qIFRCRCByaW5nICovCisJbXBjNTEyeF9mcmFtZSByZWN2X2ZyYW1lc1tGRUNfUkJEX05VTV07CQkvKiByZWNlaXZlIGJ1ZmYgKi8KK30gbXBjNTEyeF9idWZmX2Rlc2NzOworCit0eXBlZGVmIHN0cnVjdCB7CisJZXRoZXJuZXRfcmVncyAqZXRoOworCXhjZWl2ZXJfdHlwZSB4Y3ZfdHlwZTsJCS8qIHRyYW5zY2VpdmVyIHR5cGUgKi8KKwltcGM1MTJ4X2J1ZmZfZGVzY3MgKmJkQmFzZTsJLyogQkQgcmluZ3MgYW5kIHJlY3YgYnVmZmVyICovCisJdWludDE2IHJiZEluZGV4OwkJLyogbmV4dCByZWNlaXZlIEJEIHRvIHJlYWQgKi8KKwl1aW50MTYgdGJkSW5kZXg7CQkvKiBuZXh0IHRyYW5zbWl0IEJEIHRvIHNlbmQgKi8KKwl1aW50MTYgdXNlZFRiZEluZGV4OwkJLyogbmV4dCB0cmFuc21pdCBCRCB0byBjbGVhbiAqLworCXVpbnQxNiBjbGVhblRiZE51bTsJCS8qIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHRyYW5zbWl0IEJEcyAqLworfSBtcGM1MTJ4X2ZlY19wcml2OworCisvKiBSQkQgYml0cyBkZWZpbml0aW9ucyAqLworI2RlZmluZSBGRUNfUkJEX0VNUFRZCQkweDgwMDAJLyogQnVmZmVyIGlzIGVtcHR5ICovCisjZGVmaW5lIEZFQ19SQkRfV1JBUAkJMHgyMDAwCS8qIExhc3QgQkQgaW4gcmluZyAqLworI2RlZmluZSBGRUNfUkJEX0xBU1QJCTB4MDgwMAkvKiBCdWZmZXIgaXMgbGFzdCBpbiBmcmFtZSh1c2VsZXNzKSAqLworI2RlZmluZSBGRUNfUkJEX01JU1MJCTB4MDEwMAkvKiBNaXNzIGJpdCBmb3IgcHJvbSBtb2RlICovCisjZGVmaW5lIEZFQ19SQkRfQkMJCTB4MDA4MAkvKiBUaGUgcmVjZWl2ZWQgZnJhbWUgaXMgYnJvYWRjYXN0IGZyYW1lICovCisjZGVmaW5lIEZFQ19SQkRfTUMJCTB4MDA0MAkvKiBUaGUgcmVjZWl2ZWQgZnJhbWUgaXMgbXVsdGljYXN0IGZyYW1lICovCisjZGVmaW5lIEZFQ19SQkRfTEcJCTB4MDAyMAkvKiBGcmFtZSBsZW5ndGggdmlvbGF0aW9uICovCisjZGVmaW5lIEZFQ19SQkRfTk8JCTB4MDAxMAkvKiBOb25vY3RldCBhbGlnbiBmcmFtZSAqLworI2RlZmluZSBGRUNfUkJEX1NICQkweDAwMDgJLyogU2hvcnQgZnJhbWUgKi8KKyNkZWZpbmUgRkVDX1JCRF9DUgkJMHgwMDA0CS8qIENSQyBlcnJvciAqLworI2RlZmluZSBGRUNfUkJEX09WCQkweDAwMDIJLyogUmVjZWl2ZSBGSUZPIG92ZXJydW4gKi8KKyNkZWZpbmUgRkVDX1JCRF9UUgkJMHgwMDAxCS8qIEZyYW1lIGlzIHRydW5jYXRlZCAqLworI2RlZmluZSBGRUNfUkJEX0VSUgkJKEZFQ19SQkRfTEcgfCBGRUNfUkJEX05PIHwgRkVDX1JCRF9DUiB8IFwKKwkJCQlGRUNfUkJEX09WIHwgRkVDX1JCRF9UUikKKworLyogVEJEIGJpdHMgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgRkVDX1RCRF9SRUFEWQkJMHg4MDAwCS8qIEJ1ZmZlciBpcyByZWFkeSAqLworI2RlZmluZSBGRUNfVEJEX1dSQVAJCTB4MjAwMAkvKiBMYXN0IEJEIGluIHJpbmcgKi8KKyNkZWZpbmUgRkVDX1RCRF9MQVNUCQkweDA4MDAJLyogQnVmZmVyIGlzIGxhc3QgaW4gZnJhbWUgKi8KKyNkZWZpbmUgRkVDX1RCRF9UQwkJMHgwNDAwCS8qIFRyYW5zbWl0IHRoZSBDUkMgKi8KKyNkZWZpbmUgRkVDX1RCRF9BQkMJCTB4MDIwMAkvKiBBcHBlbmQgYmFkIENSQyAqLworCisvKiBNSUktcmVsYXRlZCBkZWZpbml0aW9zICovCisjZGVmaW5lIEZFQ19NSUlfREFUQV9TVAkJMHg0MDAwMDAwMAkvKiBTdGFydCBvZiBmcmFtZSBkZWxpbWl0ZXIgKi8KKyNkZWZpbmUgRkVDX01JSV9EQVRBX09QX1JECTB4MjAwMDAwMDAJLyogUGVyZm9ybSBhIHJlYWQgb3BlcmF0aW9uICovCisjZGVmaW5lIEZFQ19NSUlfREFUQV9PUF9XUgkweDEwMDAwMDAwCS8qIFBlcmZvcm0gYSB3cml0ZSBvcGVyYXRpb24gKi8KKyNkZWZpbmUgRkVDX01JSV9EQVRBX1BBX01TSwkweDBmODAwMDAwCS8qIFBIWSBBZGRyZXNzIGZpZWxkIG1hc2sgKi8KKyNkZWZpbmUgRkVDX01JSV9EQVRBX1JBX01TSwkweDAwN2MwMDAwCS8qIFBIWSBSZWdpc3RlciBmaWVsZCBtYXNrICovCisjZGVmaW5lIEZFQ19NSUlfREFUQV9UQQkJMHgwMDAyMDAwMAkvKiBUdXJuYXJvdW5kICovCisjZGVmaW5lIEZFQ19NSUlfREFUQV9EQVRBTVNLCTB4MDAwMGZmZmYJLyogUEhZIGRhdGEgZmllbGQgKi8KKworI2RlZmluZSBGRUNfTUlJX0RBVEFfUkFfU0hJRlQJMTgJLyogTUlJIFJlZ2lzdGVyIGFkZHJlc3MgYml0cyAqLworI2RlZmluZSBGRUNfTUlJX0RBVEFfUEFfU0hJRlQJMjMJLyogTUlJIFBIWSBhZGRyZXNzIGJpdHMgKi8KKworI2VuZGlmCS8qIF9fTVBDNTEyWF9GRUNfSCAqLwpkaWZmIC0tZ2l0IGEvY3B1L21wYzUxMngvaTJjLmMgYi9jcHUvbXBjNTEyeC9pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGUyOGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY3B1L21wYzUxMngvaTJjLmMKQEAgLTAsMCArMSw0MzEgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDMgLSAyMDA3CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIEJhc2VkIG9uIHRoZSBNUEM1eHh4IGNvZGUuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworI2lmZGVmIENPTkZJR19IQVJEX0kyQworCisjaW5jbHVkZSA8bXBjNTEyeC5oPgorI2luY2x1ZGUgPGkyYy5oPgorCisjZGVmaW5lIGltbXIgKChpbW1hcF90ICopQ0ZHX0lNTVIpCisKKy8qIGJ5IGRlZmF1bHQgc2V0IEkyQyBidXMgMCBhY3RpdmUgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYnVzX251bSA9IDA7CisKKyNkZWZpbmUgSTJDX1RJTUVPVVQJMTAwCisjZGVmaW5lIEkyQ19SRVRSSUVTCTMKKworc3RydWN0IG1wYzUxMnhfaTJjX3RhcCB7CisJaW50IHNjbDJ0YXA7CisJaW50IHRhcDJ0YXA7Cit9OworCitzdGF0aWMgaW50ICBtcGNfcmVnX2luKHZvbGF0aWxlIHUzMiAqcmVnKTsKK3N0YXRpYyB2b2lkIG1wY19yZWdfb3V0KHZvbGF0aWxlIHUzMiAqcmVnLCBpbnQgdmFsLCBpbnQgbWFzayk7CitzdGF0aWMgaW50ICB3YWl0X2Zvcl9iYih2b2lkKTsKK3N0YXRpYyBpbnQgIHdhaXRfZm9yX3BpbihpbnQgKnN0YXR1cyk7CitzdGF0aWMgaW50ICBkb19hZGRyZXNzKHVjaGFyIGNoaXAsIGNoYXIgcmR3cl9mbGFnKTsKK3N0YXRpYyBpbnQgIHNlbmRfYnl0ZXModWNoYXIgY2hpcCwgY2hhciAqYnVmLCBpbnQgbGVuKTsKK3N0YXRpYyBpbnQgIHJlY2VpdmVfYnl0ZXModWNoYXIgY2hpcCwgY2hhciAqYnVmLCBpbnQgbGVuKTsKK3N0YXRpYyBpbnQgIG1wY19nZXRfZmRyKGludCk7CisKK3N0YXRpYyBpbnQgbXBjX3JlZ19pbiAodm9sYXRpbGUgdTMyICpyZWcpCit7CisJaW50IHJldCA9ICpyZWcgPj4gMjQ7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG1wY19yZWdfb3V0ICh2b2xhdGlsZSB1MzIgKnJlZywgaW50IHZhbCwgaW50IG1hc2spCit7CisJaW50IHRtcDsKKworCWlmICghbWFzaykgeworCQkqcmVnID0gdmFsIDw8IDI0OworCX0gZWxzZSB7CisJCXRtcCA9IG1wY19yZWdfaW4gKHJlZyk7CisJCSpyZWcgPSAoKHRtcCAmIH5tYXNrKSB8ICh2YWwgJiBtYXNrKSkgPDwgMjQ7CisJfQorCV9fYXNtX18gX192b2xhdGlsZV9fICgiZWllaW8iKTsKKworCXJldHVybjsKK30KKworc3RhdGljIGludCB3YWl0X2Zvcl9iYiAodm9pZCkKK3sKKwlpMmM1MTJ4X2Rldl90ICpyZWdzID0gJmltbXItPmkyYy5kZXZbYnVzX251bV07CisJaW50IHRpbWVvdXQgPSBJMkNfVElNRU9VVDsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gbXBjX3JlZ19pbiAoJnJlZ3MtPm1zcik7CisKKwl3aGlsZSAodGltZW91dC0tICYmIChzdGF0dXMgJiBJMkNfQkIpKSB7CisJCXZvbGF0aWxlIGludCB0ZW1wOworCQltcGNfcmVnX291dCAoJnJlZ3MtPm1jciwgSTJDX1NUQSwgSTJDX1NUQSk7CisJCXRlbXAgPSBtcGNfcmVnX2luICgmcmVncy0+bWRyKTsKKwkJbXBjX3JlZ19vdXQgKCZyZWdzLT5tY3IsIDAsIEkyQ19TVEEpOworCQltcGNfcmVnX291dCAoJnJlZ3MtPm1jciwgMCwgMCk7CisJCW1wY19yZWdfb3V0ICgmcmVncy0+bWNyLCBJMkNfRU4sIDApOworCisJCXVkZWxheSAoMTAwMCk7CisJCXN0YXR1cyA9IG1wY19yZWdfaW4gKCZyZWdzLT5tc3IpOworCX0KKworCXJldHVybiAoc3RhdHVzICYgSTJDX0JCKTsKK30KKworc3RhdGljIGludCB3YWl0X2Zvcl9waW4gKGludCAqc3RhdHVzKQoreworCWkyYzUxMnhfZGV2X3QgKnJlZ3MgPSAmaW1tci0+aTJjLmRldltidXNfbnVtXTsKKwlpbnQgdGltZW91dCA9IEkyQ19USU1FT1VUOworCisJKnN0YXR1cyA9IG1wY19yZWdfaW4gKCZyZWdzLT5tc3IpOworCisJd2hpbGUgKHRpbWVvdXQtLSAmJiAhKCpzdGF0dXMgJiBJMkNfSUYpKSB7CisJCXVkZWxheSAoMTAwMCk7CisJCSpzdGF0dXMgPSBtcGNfcmVnX2luICgmcmVncy0+bXNyKTsKKwl9CisKKwlpZiAoISgqc3RhdHVzICYgSTJDX0lGKSkgeworCQlyZXR1cm4gLTE7CisJfQorCisJbXBjX3JlZ19vdXQgKCZyZWdzLT5tc3IsIDAsIEkyQ19JRik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19hZGRyZXNzICh1Y2hhciBjaGlwLCBjaGFyIHJkd3JfZmxhZykKK3sKKwlpMmM1MTJ4X2Rldl90ICpyZWdzID0gJmltbXItPmkyYy5kZXZbYnVzX251bV07CisJaW50IHN0YXR1czsKKworCWNoaXAgPDw9IDE7CisKKwlpZiAocmR3cl9mbGFnKSB7CisJCWNoaXAgfD0gMTsKKwl9CisKKwltcGNfcmVnX291dCAoJnJlZ3MtPm1jciwgSTJDX1RYLCBJMkNfVFgpOworCW1wY19yZWdfb3V0ICgmcmVncy0+bWRyLCBjaGlwLCAwKTsKKworCWlmICh3YWl0X2Zvcl9waW4gKCZzdGF0dXMpKSB7CisJCXJldHVybiAtMjsKKwl9CisKKwlpZiAoc3RhdHVzICYgSTJDX1JYQUspIHsKKwkJcmV0dXJuIC0zOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNlbmRfYnl0ZXMgKHVjaGFyIGNoaXAsIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpMmM1MTJ4X2Rldl90ICpyZWdzID0gJmltbXItPmkyYy5kZXZbYnVzX251bV07CisJaW50IHdyY291bnQ7CisJaW50IHN0YXR1czsKKworCWZvciAod3Jjb3VudCA9IDA7IHdyY291bnQgPCBsZW47ICsrd3Jjb3VudCkgeworCisJCW1wY19yZWdfb3V0ICgmcmVncy0+bWRyLCBidWZbd3Jjb3VudF0sIDApOworCisJCWlmICh3YWl0X2Zvcl9waW4gKCZzdGF0dXMpKSB7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzdGF0dXMgJiBJMkNfUlhBSykgeworCQkJYnJlYWs7CisJCX0KKworCX0KKworCXJldHVybiAhKHdyY291bnQgPT0gbGVuKTsKK30KKworc3RhdGljIGludCByZWNlaXZlX2J5dGVzICh1Y2hhciBjaGlwLCBjaGFyICpidWYsIGludCBsZW4pCit7CisJaTJjNTEyeF9kZXZfdCAqcmVncyA9ICZpbW1yLT5pMmMuZGV2W2J1c19udW1dOworCWludCBkdW1teSAgID0gMTsKKwlpbnQgcmRjb3VudCA9IDA7CisJaW50IHN0YXR1czsKKwlpbnQgaTsKKworCW1wY19yZWdfb3V0ICgmcmVncy0+bWNyLCAwLCBJMkNfVFgpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisJCWJ1ZltyZGNvdW50XSA9IG1wY19yZWdfaW4gKCZyZWdzLT5tZHIpOworCisJCWlmIChkdW1teSkgeworCQkJZHVtbXkgPSAwOworCQl9IGVsc2UgeworCQkJcmRjb3VudCsrOworCQl9CisKKwkJaWYgKHdhaXRfZm9yX3BpbiAoJnN0YXR1cykpIHsKKwkJCXJldHVybiAtNDsKKwkJfQorCX0KKworCW1wY19yZWdfb3V0ICgmcmVncy0+bWNyLCBJMkNfVFhBSywgSTJDX1RYQUspOworCWJ1ZltyZGNvdW50KytdID0gbXBjX3JlZ19pbiAoJnJlZ3MtPm1kcik7CisKKwlpZiAod2FpdF9mb3JfcGluICgmc3RhdHVzKSkgeworCQlyZXR1cm4gLTU7CisJfQorCisJbXBjX3JlZ19vdXQgKCZyZWdzLT5tY3IsIDAsIEkyQ19UWEFLKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKiBJMkMgQVBJICoqKioqKioqKioqKioqKiovCisKK3ZvaWQgaTJjX2luaXQgKGludCBzcGVlZCwgaW50IHNhZGRyKQoreworCWludCBpOworCWZvcihpID0gMDsgaSA8IEkyQ19CVVNfQ05UOyBpKyspeworCQlpMmM1MTJ4X2Rldl90ICpyZWdzID0gJmltbXItPmkyYy5kZXZbaV07CisJCW1wY19yZWdfb3V0ICgmcmVncy0+bWNyLCAwLCAwKTsKKworCQkvKiBTZXQgY2xvY2sgKi8KKwkJbXBjX3JlZ19vdXQgKCZyZWdzLT5tZmRyLCBtcGNfZ2V0X2ZkciAoc3BlZWQpLCAwKTsKKwkJbXBjX3JlZ19vdXQgKCZyZWdzLT5tYWRyLCBzYWRkciA8PCAxLCAwKTsKKworCQkvKiBFbmFibGUgbW9kdWxlICovCisJCW1wY19yZWdfb3V0ICgmcmVncy0+bWNyLCBJMkNfRU4sIEkyQ19JTklUX01BU0spOworCQltcGNfcmVnX291dCAoJnJlZ3MtPm1zciwgMCwgSTJDX0lGKTsKKwl9CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlpbW1yLT5pMmMuaWNyID0gMDsKKwkvKiBUdXJuIG9mZiBmaWx0ZXJzICovCisJaW1tci0+aTJjLm1pZnIgPSAwOworCXJldHVybjsKK30KKworc3RhdGljIGludCBtcGNfZ2V0X2ZkciAoaW50IHNwZWVkKQoreworCXN0YXRpYyBpbnQgZmRyID0gLTE7CisKKwlpZiAoZmRyID09IC0xKSB7CisJCXVsb25nIGJlc3Rfc3BlZWQgPSAwOworCQl1bG9uZyBkaXZpZGVyOworCQl1bG9uZyBpcGIsIHNjbDsKKwkJdWxvbmcgYmVzdG1hdGNoID0gMHhmZmZmZmZmZlVMOworCQlpbnQgYmVzdF9pID0gMCwgYmVzdF9qID0gMCwgaSwgajsKKwkJaW50IFNDTF9UYXBbXSA9IHsgOSwgMTAsIDEyLCAxNSwgNSwgNiwgNywgOH07CisJCXN0cnVjdCBtcGM1MTJ4X2kyY190YXAgc2NsdGFwW10gPSB7CisJCQl7NCwgMX0sCisJCQl7NCwgMn0sCisJCQl7NiwgNH0sCisJCQl7NiwgOH0sCisJCQl7MTQsIDE2fSwKKwkJCXszMCwgMzJ9LAorCQkJezYyLCA2NH0sCisJCQl7MTI2LCAxMjh9CisJCX07CisKKwkJaXBiID0gZ2QtPmlwYl9jbGs7CisJCWZvciAoaSA9IDc7IGkgPj0gMDsgaS0tKSB7CisJCQlmb3IgKGogPSA3OyBqID49IDA7IGotLSkgeworCQkJCXNjbCA9IDIgKiAoc2NsdGFwW2pdLnNjbDJ0YXAgKworCQkJCQkgICAoU0NMX1RhcFtpXSAtIDEpICogc2NsdGFwW2pdLnRhcDJ0YXAKKwkJCQkJICAgKyAyKTsKKwkJCQlpZiAoaXBiIDw9IHNwZWVkKnNjbCkgeworCQkJCQlpZiAoKHNwZWVkKnNjbCAtIGlwYikgPCBiZXN0bWF0Y2gpIHsKKwkJCQkJCWJlc3RtYXRjaCA9IHNwZWVkKnNjbCAtIGlwYjsKKwkJCQkJCWJlc3RfaSA9IGk7CisJCQkJCQliZXN0X2ogPSBqOworCQkJCQkJYmVzdF9zcGVlZCA9IGlwYi9zY2w7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJZGl2aWRlciA9IChiZXN0X2kgJiAzKSB8ICgoYmVzdF9pICYgNCkgPDwgMykgfCAoYmVzdF9qIDw8IDIpOworCQlpZiAoZ2QtPmZsYWdzICYgR0RfRkxHX1JFTE9DKSB7CisJCQlmZHIgPSBkaXZpZGVyOworCQl9IGVsc2UgeworCQkJZGVidWcoIiVsZCBrSHosIFxuIiwgYmVzdF9zcGVlZCAvIDEwMDApOworCQkJcmV0dXJuIGRpdmlkZXI7CisJCX0KKwl9CisKKwlyZXR1cm4gZmRyOworfQorCitpbnQgaTJjX3Byb2JlICh1Y2hhciBjaGlwKQoreworCWkyYzUxMnhfZGV2X3QgKnJlZ3MgPSAmaW1tci0+aTJjLmRldltidXNfbnVtXTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBJMkNfUkVUUklFUzsgaSsrKSB7CisJCW1wY19yZWdfb3V0ICgmcmVncy0+bWNyLCBJMkNfU1RBLCBJMkNfU1RBKTsKKworCQlpZiAoISBkb19hZGRyZXNzIChjaGlwLCAwKSkgeworCQkJbXBjX3JlZ19vdXQgKCZyZWdzLT5tY3IsIDAsIEkyQ19TVEEpOworCQkJdWRlbGF5ICg1MDApOworCQkJYnJlYWs7CisJCX0KKworCQltcGNfcmVnX291dCAoJnJlZ3MtPm1jciwgMCwgSTJDX1NUQSk7CisJCXVkZWxheSAoNTAwKTsKKwl9CisKKwlyZXR1cm4gKGkgPT0gSTJDX1JFVFJJRVMpOworfQorCitpbnQgaTJjX3JlYWQgKHVjaGFyIGNoaXAsIHVpbnQgYWRkciwgaW50IGFsZW4sIHVjaGFyICpidWYsIGludCBsZW4pCit7CisJY2hhciB4YWRkcls0XTsKKwlpMmM1MTJ4X2Rldl90ICpyZWdzID0gJmltbXItPmkyYy5kZXZbYnVzX251bV07CisJaW50IHJldCA9IC0xOworCisJeGFkZHJbMF0gPSAoYWRkciA+PiAyNCkgJiAweEZGOworCXhhZGRyWzFdID0gKGFkZHIgPj4gMTYpICYgMHhGRjsKKwl4YWRkclsyXSA9IChhZGRyID4+ICA4KSAmIDB4RkY7CisJeGFkZHJbM10gPSAgYWRkcgkmIDB4RkY7CisKKwlpZiAod2FpdF9mb3JfYmIgKCkpIHsKKwkJcHJpbnRmICgiaTJjX3JlYWQ6IGJ1cyBpcyBidXN5XG4iKTsKKwkJZ290byBEb25lOworCX0KKworCW1wY19yZWdfb3V0ICgmcmVncy0+bWNyLCBJMkNfU1RBLCBJMkNfU1RBKTsKKwlpZiAoZG9fYWRkcmVzcyAoY2hpcCwgMCkpIHsKKwkJcHJpbnRmICgiaTJjX3JlYWQ6IGZhaWxlZCB0byBhZGRyZXNzIGNoaXBcbiIpOworCQlnb3RvIERvbmU7CisJfQorCisJaWYgKHNlbmRfYnl0ZXMgKGNoaXAsICZ4YWRkcls0LWFsZW5dLCBhbGVuKSkgeworCQlwcmludGYgKCJpMmNfcmVhZDogc2VuZF9ieXRlcyBmYWlsZWRcbiIpOworCQlnb3RvIERvbmU7CisJfQorCisJbXBjX3JlZ19vdXQgKCZyZWdzLT5tY3IsIEkyQ19SU1RBLCBJMkNfUlNUQSk7CisJaWYgKGRvX2FkZHJlc3MgKGNoaXAsIDEpKSB7CisJCXByaW50ZiAoImkyY19yZWFkOiBmYWlsZWQgdG8gYWRkcmVzcyBjaGlwXG4iKTsKKwkJZ290byBEb25lOworCX0KKworCWlmIChyZWNlaXZlX2J5dGVzIChjaGlwLCAoY2hhciAqKWJ1ZiwgbGVuKSkgeworCQlwcmludGYgKCJpMmNfcmVhZDogcmVjZWl2ZV9ieXRlcyBmYWlsZWRcbiIpOworCQlnb3RvIERvbmU7CisJfQorCisJcmV0ID0gMDsKK0RvbmU6CisJbXBjX3JlZ19vdXQgKCZyZWdzLT5tY3IsIDAsIEkyQ19TVEEpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBpMmNfd3JpdGUgKHVjaGFyIGNoaXAsIHVpbnQgYWRkciwgaW50IGFsZW4sIHVjaGFyICpidWYsIGludCBsZW4pCit7CisJY2hhciB4YWRkcls0XTsKKwlpMmM1MTJ4X2Rldl90ICpyZWdzID0gJmltbXItPmkyYy5kZXZbYnVzX251bV07CisJaW50IHJldCA9IC0xOworCisJeGFkZHJbMF0gPSAoYWRkciA+PiAyNCkgJiAweEZGOworCXhhZGRyWzFdID0gKGFkZHIgPj4gMTYpICYgMHhGRjsKKwl4YWRkclsyXSA9IChhZGRyID4+ICA4KSAmIDB4RkY7CisJeGFkZHJbM10gPSAgYWRkcgkmIDB4RkY7CisKKwlpZiAod2FpdF9mb3JfYmIgKCkpIHsKKwkJcHJpbnRmICgiaTJjX3dyaXRlOiBidXMgaXMgYnVzeVxuIik7CisJCWdvdG8gRG9uZTsKKwl9CisKKwltcGNfcmVnX291dCAoJnJlZ3MtPm1jciwgSTJDX1NUQSwgSTJDX1NUQSk7CisJaWYgKGRvX2FkZHJlc3MgKGNoaXAsIDApKSB7CisJCXByaW50ZiAoImkyY193cml0ZTogZmFpbGVkIHRvIGFkZHJlc3MgY2hpcFxuIik7CisJCWdvdG8gRG9uZTsKKwl9CisKKwlpZiAoc2VuZF9ieXRlcyAoY2hpcCwgJnhhZGRyWzQtYWxlbl0sIGFsZW4pKSB7CisJCXByaW50ZiAoImkyY193cml0ZTogc2VuZF9ieXRlcyBmYWlsZWRcbiIpOworCQlnb3RvIERvbmU7CisJfQorCisJaWYgKHNlbmRfYnl0ZXMgKGNoaXAsIChjaGFyICopYnVmLCBsZW4pKSB7CisJCXByaW50ZiAoImkyY193cml0ZTogc2VuZF9ieXRlcyBmYWlsZWRcbiIpOworCQlnb3RvIERvbmU7CisJfQorCisJcmV0ID0gMDsKK0RvbmU6CisJbXBjX3JlZ19vdXQgKCZyZWdzLT5tY3IsIDAsIEkyQ19TVEEpOworCXJldHVybiByZXQ7Cit9CisKK3VjaGFyIGkyY19yZWdfcmVhZCAodWNoYXIgY2hpcCwgdWNoYXIgcmVnKQoreworCXVjaGFyIGJ1ZjsKKworCWkyY19yZWFkIChjaGlwLCByZWcsIDEsICZidWYsIDEpOworCisJcmV0dXJuIGJ1ZjsKK30KKwordm9pZCBpMmNfcmVnX3dyaXRlICh1Y2hhciBjaGlwLCB1Y2hhciByZWcsIHVjaGFyIHZhbCkKK3sKKwlpMmNfd3JpdGUgKGNoaXAsIHJlZywgMSwgJnZhbCwgMSk7CisKKwlyZXR1cm47Cit9CisKKworaW50IGkyY19zZXRfYnVzX251bSAodW5zaWduZWQgaW50IGJ1cykKK3sKKwlpZiAoYnVzID49IEkyQ19CVVNfQ05UKSB7CisJCXJldHVybiAtMTsKKwl9CisJYnVzX251bSA9IGJ1czsKKworCXJldHVybiAwOworfQorCit1bnNpZ25lZCBpbnQgaTJjX2dldF9idXNfbnVtICh2b2lkKQoreworCXJldHVybiBidXNfbnVtOworfQorCisvKiBUT0RPICovCit1bnNpZ25lZCBpbnQgaTJjX2dldF9idXNfc3BlZWQgKHZvaWQpCit7CisJcmV0dXJuIC0xOworfQorCitpbnQgaTJjX3NldF9idXNfc3BlZWQgKHVuc2lnbmVkIGludCBzcGVlZCkKK3sKKwlpZiAoc3BlZWQgIT0gQ0ZHX0kyQ19TUEVFRCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgkvKiBDT05GSUdfSEFSRF9JMkMgKi8KZGlmZiAtLWdpdCBhL2NwdS9tcGM1MTJ4L2ludGVycnVwdHMuYyBiL2NwdS9tcGM1MTJ4L2ludGVycnVwdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2MyNDFjCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L21wYzUxMngvaW50ZXJydXB0cy5jCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwNworICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIERlcml2ZWQgZnJvbSB0aGUgTVBDODN4eCBjb2RlLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKK3N0cnVjdCBpcnFfYWN0aW9uIHsKKwlpbnRlcnJ1cHRfaGFuZGxlcl90ICpoYW5kbGVyOworCXZvaWQgKmFyZzsKKwl1bG9uZyBjb3VudDsKK307CisKK2ludCBpbnRlcnJ1cHRfaW5pdF9jcHUgKHVuc2lnbmVkICpkZWNyZW1lbnRlcl9jb3VudCkKK3sKKwkqZGVjcmVtZW50ZXJfY291bnQgPSBnZXRfdGJjbGsgKCkgLyBDRkdfSFo7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluc3RhbGwgYW5kIGZyZWUgYW4gaW50ZXJydXB0IGhhbmRsZXIuCisgKi8KK3ZvaWQKK2lycV9pbnN0YWxsX2hhbmRsZXIgKGludCBpcnEsIGludGVycnVwdF9oYW5kbGVyX3QgKiBoYW5kbGVyLCB2b2lkICphcmcpCit7Cit9CisKK3ZvaWQgaXJxX2ZyZWVfaGFuZGxlciAoaW50IGlycSkKK3sKK30KKwordm9pZCB0aW1lcl9pbnRlcnJ1cHRfY3B1IChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwkvKiBub3RoaW5nIHRvIGRvIGhlcmUgKi8KKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9jcHUvbXBjNTEyeC9zZXJpYWwuYyBiL2NwdS9tcGM1MTJ4L3NlcmlhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMGZmMmMKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvbXBjNTEyeC9zZXJpYWwuYwpAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMCAtIDIwMDcKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogQmFzZWQgb250IHRoZSBNUEM1MjAwIFBTQyBkcml2ZXIuCisgKiBBZGFwdGVkIGZvciBNUEM1MTJ4IGJ5IEphbiBXcm9iZWwgPHdyckBzZW1paGFsZi5jb20+CisgKi8KKworLyoKKyAqIE1pbmltYWwgc2VyaWFsIGZ1bmN0aW9ucyBuZWVkZWQgdG8gdXNlIG9uZSBvZiB0aGUgUFNDIHBvcnRzCisgKiBhcyBzZXJpYWwgY29uc29sZSBpbnRlcmZhY2UuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworI2lmIGRlZmluZWQoQ09ORklHX1BTQ19DT05TT0xFKQorCitzdGF0aWMgdm9pZCBmaWZvX2luaXQgKHZvbGF0aWxlIHBzYzUxMnhfdCAqcHNjKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CisKKwkvKiByZXNldCBSeCAmIFR4IGZpZm8gc2xpY2UgKi8KKwlwc2MtPnJmY21kID0gUFNDX0ZJRk9fUkVTRVRfU0xJQ0U7CisJcHNjLT50ZmNtZCA9IFBTQ19GSUZPX1JFU0VUX1NMSUNFOworCisJLyogZGlzYWJsZSBUeCAmIFJ4IEZJRk8gaW50ZXJydXB0cyAqLworCXBzYy0+cmZpbnRtYXNrID0gMDsKKwlwc2MtPnRmaW50bWFzayA9IDA7CisKKwlwc2MtPnRmc2l6ZSA9IENPTlNPTEVfRklGT19UWF9TSVpFIHwgKENPTlNPTEVfRklGT19UWF9BRERSIDw8IDE2KTsKKwlwc2MtPnJmc2l6ZSA9IENPTlNPTEVfRklGT19SWF9TSVpFIHwgKENPTlNPTEVfRklGT19SWF9BRERSIDw8IDE2KTsKKworCS8qIGVuYWJsZSBUeCAmIFJ4IEZJRk8gc2xpY2UgKi8KKwlwc2MtPnJmY21kID0gUFNDX0ZJRk9fRU5BQkxFX1NMSUNFOworCXBzYy0+dGZjbWQgPSBQU0NfRklGT19FTkFCTEVfU0xJQ0U7CisKKwlpbS0+Zmlmb2MuZmlmb2NfY21kID0gRklGT0NfRElTQUJMRV9DTE9DS19HQVRFOworCV9fYXNtX18gdm9sYXRpbGUgKCJzeW5jIik7Cit9CisKK2ludCBzZXJpYWxfaW5pdCh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CisJdm9sYXRpbGUgcHNjNTEyeF90ICpwc2MgPSAocHNjNTEyeF90ICopICZpbS0+cHNjW0NPTkZJR19QU0NfQ09OU09MRV07CisJdW5zaWduZWQgbG9uZyBiYXNlY2xrOworCWludCBkaXY7CisKKwlmaWZvX2luaXQgKHBzYyk7CisKKwkvKiBzZXQgTVIgcmVnaXN0ZXIgdG8gcG9pbnQgdG8gTVIxICovCisJcHNjLT5jb21tYW5kID0gUFNDX1NFTF9NT0RFX1JFR18xOworCisJLyogZGlzYWJsZSBUeC9SeCAqLworCXBzYy0+Y29tbWFuZCA9IFBTQ19UWF9ESVNBQkxFIHwgUFNDX1JYX0RJU0FCTEU7CisKKwkvKiBjaG9vc2UgdGhlIHByZXNjYWxlcglieSAxNiBmb3IgdGhlIFR4L1J4IGNsb2NrIGdlbmVyYXRpb24gKi8KKwlwc2MtPnBzY19jbG9ja19zZWxlY3QgPSAgMHhkZDAwOworCisJLyogc3dpdGNoIHRvIFVBUlQgbW9kZSAqLworCXBzYy0+c2ljciA9IDA7CisKKwkvKiBtb2RlIHJlZ2lzdGVyIHBvaW50cyB0byBtcjEgKi8KKwkvKiBjb25maWd1cmUgcGFyaXR5LCBiaXQgbGVuZ3RoIGFuZCBzbyBvbiBpbiBtb2RlIHJlZ2lzdGVyIDEqLworCXBzYy0+bW9kZSA9IFBTQ19NT0RFXzhfQklUUyB8IFBTQ19NT0RFX1BBUk5PTkU7CisJLyogbm93LCBtb2RlIHJlZ2lzdGVyIHBvaW50cyB0byBtcjIgKi8KKwlwc2MtPm1vZGUgPSBQU0NfTU9ERV8xX1NUT1BCSVQ7CisKKwkvKiBjYWxjdWxhdGUgZGl2aWRvciBmb3Igc2V0dGluZyBQU0MgQ1RVUiBhbmQgQ1RMUiByZWdpc3RlcnMgKi8KKwliYXNlY2xrID0gKGdkLT5pcGJfY2xrICsgOCkgLyAxNjsKKwlkaXYgPSAoYmFzZWNsayArIChnZC0+YmF1ZHJhdGUgLyAyKSkgLyBnZC0+YmF1ZHJhdGU7CisKKwlwc2MtPmN0dXIgPSAoZGl2ID4+IDgpICYgMHhmZjsKKwkvKiBzZXQgYmF1ZHJhdGUgKi8KKwlwc2MtPmN0bHIgPSBkaXYgJiAweGZmOworCisJLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCXBzYy0+cHNjX2ltciA9IDA7CisKKwkvKiByZXNldCBhbmQgZW5hYmxlIFJ4L1R4ICovCisJcHNjLT5jb21tYW5kID0gUFNDX1JTVF9SWDsKKwlwc2MtPmNvbW1hbmQgPSBQU0NfUlNUX1RYOworCXBzYy0+Y29tbWFuZCA9IFBTQ19SWF9FTkFCTEUgfCBQU0NfVFhfRU5BQkxFOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2VyaWFsX3B1dGMgKGNvbnN0IGNoYXIgYykKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbSA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisJdm9sYXRpbGUgcHNjNTEyeF90ICpwc2MgPSAocHNjNTEyeF90ICopICZpbS0+cHNjW0NPTkZJR19QU0NfQ09OU09MRV07CisKKwlpZiAoYyA9PSAnXG4nKQorCQlzZXJpYWxfcHV0YyAoJ1xyJyk7CisKKwkvKiBXYWl0IGZvciBsYXN0IGNoYXJhY3RlciB0byBnby4gKi8KKwl3aGlsZSAoIShwc2MtPnBzY19zdGF0dXMgJiBQU0NfU1JfVFhFTVApKQorCQk7CisKKwlwc2MtPnRmZGF0YV84ID0gYzsKK30KKwordm9pZCBzZXJpYWxfcHV0Y19yYXcgKGNvbnN0IGNoYXIgYykKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbSA9IChpbW1hcF90ICopIENGR19JTU1SOworCXZvbGF0aWxlIHBzYzUxMnhfdCAqcHNjID0gKHBzYzUxMnhfdCAqKSAmaW0tPnBzY1tDT05GSUdfUFNDX0NPTlNPTEVdOworCisJLyogV2FpdCBmb3IgbGFzdCBjaGFyYWN0ZXIgdG8gZ28uICovCisJd2hpbGUgKCEocHNjLT5wc2Nfc3RhdHVzICYgUFNDX1NSX1RYRU1QKSkKKwkJOworCisJcHNjLT50ZmRhdGFfOCA9IGM7Cit9CisKKwordm9pZCBzZXJpYWxfcHV0cyAoY29uc3QgY2hhciAqcykKK3sKKwl3aGlsZSAoKnMpIHsKKwkJc2VyaWFsX3B1dGMgKCpzKyspOworCX0KK30KKworaW50IHNlcmlhbF9nZXRjICh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CisJdm9sYXRpbGUgcHNjNTEyeF90ICpwc2MgPSAocHNjNTEyeF90ICopICZpbS0+cHNjW0NPTkZJR19QU0NfQ09OU09MRV07CisKKwkvKiBXYWl0IGZvciBhIGNoYXJhY3RlciB0byBhcnJpdmUuICovCisJd2hpbGUgKHBzYy0+cmZzdGF0ICYgUFNDX0ZJRk9fRU1QVFkpCisJCTsKKworCXJldHVybiBwc2MtPnJmZGF0YV84OworfQorCitpbnQgc2VyaWFsX3RzdGMgKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW0gPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKwl2b2xhdGlsZSBwc2M1MTJ4X3QgKnBzYyA9IChwc2M1MTJ4X3QgKikgJmltLT5wc2NbQ09ORklHX1BTQ19DT05TT0xFXTsKKworCXJldHVybiAhKHBzYy0+cmZzdGF0ICYgUFNDX0ZJRk9fRU1QVFkpOworfQorCit2b2lkIHNlcmlhbF9zZXRicmcgKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW0gPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKwl2b2xhdGlsZSBwc2M1MTJ4X3QgKnBzYyA9IChwc2M1MTJ4X3QgKikgJmltLT5wc2NbQ09ORklHX1BTQ19DT05TT0xFXTsKKwl1bnNpZ25lZCBsb25nIGJhc2VjbGssIGRpdjsKKworCWJhc2VjbGsgPSAoZ2QtPmNzYl9jbGsgKyA4KSAvIDE2OworCWRpdiA9IChiYXNlY2xrICsgKGdkLT5iYXVkcmF0ZSAvIDIpKSAvIGdkLT5iYXVkcmF0ZTsKKworCXBzYy0+Y3R1ciA9IChkaXYgPj4gOCkgJiAweEZGOworCXBzYy0+Y3RsciA9ICBkaXYgJiAweGZmOyAvKiBzZXQgYmF1ZHJhdGUgKi8KK30KKwordm9pZCBzZXJpYWxfc2V0cnRzKGludCBzKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CisJdm9sYXRpbGUgcHNjNTEyeF90ICpwc2MgPSAocHNjNTEyeF90ICopICZpbS0+cHNjW0NPTkZJR19QU0NfQ09OU09MRV07CisKKwlpZiAocykgeworCQkvKiBBc3NlcnQgUlRTIChiZWNvbWUgTE9XKSAqLworCQlwc2MtPm9wMSA9IDB4MTsKKwl9CisJZWxzZSB7CisJCS8qIE5lZ2F0ZSBSVFMgKGJlY29tZSBISUdIKSAqLworCQlwc2MtPm9wMCA9IDB4MTsKKwl9Cit9CisKK2ludCBzZXJpYWxfZ2V0Y3RzKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW0gPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKwl2b2xhdGlsZSBwc2M1MTJ4X3QgKnBzYyA9IChwc2M1MTJ4X3QgKikgJmltLT5wc2NbQ09ORklHX1BTQ19DT05TT0xFXTsKKworCXJldHVybiAocHNjLT5pcCAmIDB4MSkgPyAwIDogMTsKK30KKyNlbmRpZiAvKiBDT05GSUdfUFNDX0NPTlNPTEUgKi8KZGlmZiAtLWdpdCBhL2NwdS9tcGM1MTJ4L3NwZWVkLmMgYi9jcHUvbXBjNTEyeC9zcGVlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MDk4MjcKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvbXBjNTEyeC9zcGVlZC5jCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDcKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBCYXNlZCBvbiB0aGUgTVBDODN4eCBjb2RlLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtcGM1MTJ4Lmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKK3N0YXRpYyBpbnQgc3BtZl9tdWx0W10gPSB7CisJNjgsIDEsIDEyLCAxNiwKKwkyMCwgMjQsIDI4LCAzMiwKKwkzNiwgNDAsIDQ0LCA0OCwKKwk1MiwgNTYsIDYwLCA2NAorfTsKKworc3RhdGljIGludCBjcG1mX211bHRbXVsyXSA9IHsKKwl7MCwgMX0sIHswLCAxfSwgLyogMCBhbmQgMSBhcmUgbm90IHZhbGlkICovCisJezEsIDF9LCB7MywgMn0sCisJezIsIDF9LCB7NSwgMn0sCisJezMsIDF9LCB7NywgMn0sCisJezAsIDF9LCB7MCwgMX0sIC8qIGFuZCBhbGwgYWJvdmUgNyBhcmUgbm90IHZhbGlkIHRvbyAqLworCXswLCAxfSwgezAsIDF9LAorCXswLCAxfSwgezAsIDF9LAorCXswLCAxfSwgezAsIDF9Cit9OworCitzdGF0aWMgaW50IHN5c19kaXZpZG9yc1tdWzJdID0geworCXsyLCAxfSwgezUsIDJ9LCB7MywgMX0sIHs3LCAyfSwgezQsIDF9LAorCXs5LCAyfSwgezUsIDF9LCB7NywgMX0sIHs2LCAxfSwgezgsIDF9LAorCXs5LCAxfSwgezExLCAxfSwgezEwLCAxfSwgezEyLCAxfSwgezEzLCAxfSwKKwl7MTUsIDF9LCB7MTQsIDF9LCB7MTYsIDF9LCB7MTcsIDF9LCB7MTksIDF9LAorCXsxOCwgMX0sIHsyMCwgMX0sIHsyMSwgMX0sIHsyMywgMX0sIHsyMiwgMX0sCisJezI0LCAxfSwgezI1LCAxfSwgezI3LCAxfSwgezI2LCAxfSwgezI4LCAxfSwKKwl7MjksIDF9LCB7MzEsIDF9LCB7MzAsIDF9LCB7MzIsIDF9LCB7MzMsIDF9Cit9OworCitpbnQgZ2V0X2Nsb2NrcyAodm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbSA9IChpbW1hcF90ICopIENGR19JTU1SOworCXU4IHNwbWY7CisJdTggY3BtZjsKKwl1OCBzeXNfZGl2OworCXU4IGlwc19kaXY7CisJdTMyIHJlZl9jbGsgPSBDRkdfTVBDNTEyWF9DTEtJTjsKKwl1MzIgc3BsbDsKKwl1MzIgc3lzX2NsazsKKwl1MzIgY29yZV9jbGs7CisJdTMyIGNzYl9jbGs7CisJdTMyIGlwc19jbGs7CisKKwlpZiAoKGltLT5zeXNjb25mLmltbXJiYXIgJiBJTU1SQkFSX0JBU0VfQUREUikgIT0gKHUzMikgaW0pCisJCXJldHVybiAtMTsKKworCXNwbWYgPSAoaW0tPmNsay5zcG1yICYgU1BNUl9TUE1GKSA+PiBTUE1SX1NQTUZfU0hJRlQ7CisJc3BsbCA9IHJlZl9jbGsgKiBzcG1mX211bHRbc3BtZl07CisKKwlzeXNfZGl2ID0gKGltLT5jbGsuc2NmclsxXSAmIFNDRlIyX1NZU19ESVYpID4+IFNDRlIyX1NZU19ESVZfU0hJRlQ7CisJc3lzX2NsayA9IChzcGxsICogc3lzX2Rpdmlkb3JzW3N5c19kaXZdWzFdKSAvIHN5c19kaXZpZG9yc1tzeXNfZGl2XVswXTsKKworCWNzYl9jbGsgPSBzeXNfY2xrIC8gMjsKKworCWNwbWYgPSAoaW0tPmNsay5zcG1yICYgU1BNUl9DUE1GKSA+PiBTUE1SX0NQTUZfU0hJRlQ7CisJY29yZV9jbGsgPSAoY3NiX2NsayAqIGNwbWZfbXVsdFtjcG1mXVswXSkgLyBjcG1mX211bHRbY3BtZl1bMV07CisKKwlpcHNfZGl2ID0gKGltLT5jbGsuc2NmclswXSAmIFNDRlIxX0lQU19ESVZfTUFTSykgPj4gU0NGUjFfSVBTX0RJVl9TSElGVDsKKwlpZiAoaXBzX2RpdiAhPSAwKSB7CisJCWlwc19jbGsgPSBjc2JfY2xrIC8gaXBzX2RpdjsKKwl9IGVsc2UgeworCQkvKiBpbiBjYXNlIHdlIGNhbm5vdCBnZXQgYSBzYW5lIElQUyBkaXZpc29yLCBmYWlsIGdyYWNlZnVsbHkgKi8KKwkJaXBzX2NsayA9IDA7CisJfQorCisJZ2QtPmlwYl9jbGsgPSBpcHNfY2xrOworCWdkLT5jc2JfY2xrID0gY3NiX2NsazsKKwlnZC0+Y3B1X2NsayA9IGNvcmVfY2xrOworCWdkLT5idXNfY2xrID0gY3NiX2NsazsKKwlyZXR1cm4gMDsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9idXNfZnJlcQorICogcmV0dXJuIHN5c3RlbSBidXMgZnJlcSBpbiBIegorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vsb25nIGdldF9idXNfZnJlcSAodWxvbmcgZHVtbXkpCit7CisJcmV0dXJuIGdkLT5jc2JfY2xrOworfQorCitpbnQgZG9fY2xvY2tzIChjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJcHJpbnRmICgiQ2xvY2sgY29uZmlndXJhdGlvbjpcbiIpOworCXByaW50ZiAoIiAgQ1BVOiAgICAgICAgICAgICAgICAgJTRkIE1IelxuIiwgZ2QtPmNwdV9jbGsgLyAxMDAwMDAwKTsKKwlwcmludGYgKCIgIENvaGVyZW50IFN5c3RlbSBCdXM6ICU0ZCBNSHpcbiIsIGdkLT5jc2JfY2xrIC8gMTAwMDAwMCk7CisJcHJpbnRmICgiICBJUFMgQnVzOiAgICAgICAgICAgICAlNGQgTUh6XG4iLCBnZC0+aXBiX2NsayAvIDEwMDAwMDApOworCXByaW50ZiAoIiAgRERSOiAgICAgICAgICAgICAgICAgJTRkIE1IelxuIiwgMiAqIGdkLT5jc2JfY2xrIC8gMTAwMDAwMCk7CisJcmV0dXJuIDA7Cit9CisKK1VfQk9PVF9DTUQoY2xvY2tzLCAxLCAwLCBkb19jbG9ja3MsCisJImNsb2NrcyAgLSBwcmludCBjbG9jayBjb25maWd1cmF0aW9uXG4iLAorCSIgICAgY2xvY2tzXG4iCispOworCitpbnQgcHJ0X21wYzUxMnhfY2xrcyAodm9pZCkKK3sKKwlkb19jbG9ja3MgKE5VTEwsIDAsIDAsIE5VTEwpOworCXJldHVybiAoMCk7Cit9CmRpZmYgLS1naXQgYS9jcHUvbXBjNTEyeC9zdGFydC5TIGIvY3B1L21wYzUxMngvc3RhcnQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDRjNjliCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L21wYzUxMngvc3RhcnQuUwpAQCAtMCwwICsxLDc4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5OCAgRGFuIE1hbGVrIDxkbWFsZWtAamxjLm5ldD4KKyAqIENvcHlyaWdodCAoQykgMTk5OSAgTWFnbnVzIERhbW0gPGtpZXJheXBjMDEucC55LmtpZS5lcmEuZXJpY3Nzb24uc2U+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDcgV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKyAqIENvcHlyaWdodCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiAyMDA0LCAyMDA2LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIEJhc2VkIG9uIHRoZSBNUEM4M3h4IGNvZGUuCisgKi8KKworLyoKKyAqICBVLUJvb3QgLSBTdGFydHVwIENvZGUgZm9yIE1QQzUxMnggYmFzZWQgRW1iZWRkZWQgQm9hcmRzCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPG1wYzUxMnguaD4KKyNpbmNsdWRlIDx2ZXJzaW9uLmg+CisKKyNkZWZpbmUgQ09ORklHXzUyMVgJMQkJLyogbmVlZGVkIGZvciBMaW51eCBrZXJuZWwgaGVhZGVyIGZpbGVzKi8KKworI2luY2x1ZGUgPHBwY19hc20udG1wbD4KKyNpbmNsdWRlIDxwcGNfZGVmcy5oPgorCisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgorCisjaWZuZGVmICBDT05GSUdfSURFTlRfU1RSSU5HCisjZGVmaW5lICBDT05GSUdfSURFTlRfU1RSSU5HICJNUEM1MTJYIgorI2VuZGlmCisKKy8qCisgKiBGbG9hdGluZyBQb2ludCBlbmFibGUsIE1hY2hpbmUgQ2hlY2sgYW5kIFJlY292ZXJhYmxlIEludGVyci4KKyAqLworI3VuZGVmCU1TUl9LRVJORUwKKyNpZmRlZiBERUJVRworI2RlZmluZSBNU1JfS0VSTkVMIChNU1JfRlB8TVNSX1JJKQorI2Vsc2UKKyNkZWZpbmUgTVNSX0tFUk5FTCAoTVNSX0ZQfE1TUl9NRXxNU1JfUkkpCisjZW5kaWYKKworLyogTWFjcm9zIGZvciBtYW5pcHVsYXRpbmcgQ1N4X1NUQVJUL1NUT1AgKi8KKyNkZWZpbmUgU1RBUlRfUkVHKHN0YXJ0KQkoKHN0YXJ0KSA+PiAxNikKKyNkZWZpbmUgU1RPUF9SRUcoc3RhcnQsIHNpemUpCSgoKHN0YXJ0KSArIChzaXplKSAtIDEpID4+IDE2KQorCisvKgorICogU2V0IHVwIEdPVDogR2xvYmFsIE9mZnNldCBUYWJsZQorICoKKyAqIFVzZSByMTQgdG8gYWNjZXNzIHRoZSBHT1QKKyAqLworCVNUQVJUX0dPVAorCUdPVF9FTlRSWShfR09UMl9UQUJMRV8pCisJR09UX0VOVFJZKF9GSVhVUF9UQUJMRV8pCisKKwlHT1RfRU5UUlkoX3N0YXJ0KQorCUdPVF9FTlRSWShfc3RhcnRfb2ZfdmVjdG9ycykKKwlHT1RfRU5UUlkoX2VuZF9vZl92ZWN0b3JzKQorCUdPVF9FTlRSWSh0cmFuc2Zlcl90b19oYW5kbGVyKQorCisJR09UX0VOVFJZKF9faW5pdF9lbmQpCisJR09UX0VOVFJZKF9lbmQpCisJR09UX0VOVFJZKF9fYnNzX3N0YXJ0KQorCUVORF9HT1QKKworLyoKKyAqIE1hZ2ljIG51bWJlciBhbmQgdmVyc2lvbiBzdHJpbmcKKyAqLworCS5sb25nCTB4MjcwNTE5NTYJCS8qIFUtQm9vdCBNYWdpYyBOdW1iZXIgKi8KKwkuZ2xvYmwJdmVyc2lvbl9zdHJpbmcKK3ZlcnNpb25fc3RyaW5nOgorCS5hc2NpaSBVX0JPT1RfVkVSU0lPTgorCS5hc2NpaSAiICgiLCBfX0RBVEVfXywgIiAtICIsIF9fVElNRV9fLCAiKSIKKwkuYXNjaWkgIiAiLCBDT05GSUdfSURFTlRfU1RSSU5HLCAiXDAiCisKKy8qCisgKiBWZWN0b3IgVGFibGUKKyAqLworCS50ZXh0CisJLiA9IEVYQ19PRkZfU1lTX1JFU0VUCisKKwkuZ2xvYmwJX3N0YXJ0CisJLyogU3RhcnQgZnJvbSBoZXJlIGFmdGVyIHJlc2V0L3Bvd2VyIG9uICovCitfc3RhcnQ6CisJbGkJcjIxLCBCT09URkxBR19DT0xEICAvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLworCWIJYm9vdF9jb2xkCisKKwkuZ2xvYmwJX3N0YXJ0X29mX3ZlY3RvcnMKK19zdGFydF9vZl92ZWN0b3JzOgorCisvKiBNYWNoaW5lIGNoZWNrICovCisJU1REX0VYQ0VQVElPTigweDIwMCwgTWFjaGluZUNoZWNrLCBNYWNoaW5lQ2hlY2tFeGNlcHRpb24pCisKKy8qIERhdGEgU3RvcmFnZSBleGNlcHRpb24uICovCisJU1REX0VYQ0VQVElPTigweDMwMCwgRGF0YVN0b3JhZ2UsIFVua25vd25FeGNlcHRpb24pCisKKy8qIEluc3RydWN0aW9uIFN0b3JhZ2UgZXhjZXB0aW9uLiAqLworCVNURF9FWENFUFRJT04oMHg0MDAsIEluc3RTdG9yYWdlLCBVbmtub3duRXhjZXB0aW9uKQorCisvKiBFeHRlcm5hbCBJbnRlcnJ1cHQgZXhjZXB0aW9uLiAqLworCVNURF9FWENFUFRJT04oMHg1MDAsIEV4dEludGVycnVwdCwgVW5rbm93bkV4Y2VwdGlvbikKKworLyogQWxpZ25tZW50IGV4Y2VwdGlvbi4gKi8KKwkuID0gMHg2MDAKK0FsaWdubWVudDoKKwlFWENFUFRJT05fUFJPTE9HKFNSUjAsIFNSUjEpCisJbWZzcHIJcjQsREFSCisJc3R3CXI0LF9EQVIocjIxKQorCW1mc3ByCXI1LERTSVNSCisJc3R3CXI1LF9EU0lTUihyMjEpCisJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAorCWxpCXIyMCxNU1JfS0VSTkVMCisJcmx3aW1pCXIyMCxyMjMsMCwxNiwxNgkJLyogY29weSBFRSBiaXQgZnJvbSBzYXZlZCBNU1IgKi8KKwlybHdpbWkJcjIwLHIyMywwLDI1LDI1CQkvKiBjb3B5IElQIGJpdCBmcm9tIHNhdmVkIE1TUiAqLworCWx3eglyNixHT1QodHJhbnNmZXJfdG9faGFuZGxlcikKKwltdGxyCXI2CisJYmxybAorLkxfQWxpZ25tZW50OgorCS5sb25nCUFsaWdubWVudEV4Y2VwdGlvbiAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJLmxvbmcJaW50X3JldHVybiAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisKKy8qIFByb2dyYW0gY2hlY2sgZXhjZXB0aW9uICovCisJLiA9IDB4NzAwCitQcm9ncmFtQ2hlY2s6CisJRVhDRVBUSU9OX1BST0xPRyhTUlIwLCBTUlIxKQorCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKKwlsaQlyMjAsTVNSX0tFUk5FTAorCXJsd2ltaQlyMjAscjIzLDAsMTYsMTYJCS8qIGNvcHkgRUUgYml0IGZyb20gc2F2ZWQgTVNSICovCisJcmx3aW1pCXIyMCxyMjMsMCwyNSwyNQkJLyogY29weSBJUCBiaXQgZnJvbSBzYXZlZCBNU1IgKi8KKwlsd3oJcjYsR09UKHRyYW5zZmVyX3RvX2hhbmRsZXIpCisJbXRscglyNgorCWJscmwKKy5MX1Byb2dyYW1DaGVjazoKKwkubG9uZwlQcm9ncmFtQ2hlY2tFeGNlcHRpb24gLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCS5sb25nCWludF9yZXR1cm4gLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCisvKiBGbG9hdGluZyBQb2ludCBVbml0IHVuYXZhaWxhYmxlIGV4Y2VwdGlvbiAqLworCVNURF9FWENFUFRJT04oMHg4MDAsIEZQVW5hdmFpbGFibGUsIFVua25vd25FeGNlcHRpb24pCisKKy8qIERlY3JlbWVudGVyICovCisJU1REX0VYQ0VQVElPTigweDkwMCwgRGVjcmVtZW50ZXIsIHRpbWVyX2ludGVycnVwdCkKKworLyogQ3JpdGljYWwgaW50ZXJydXB0ICovCisJU1REX0VYQ0VQVElPTigweGEwMCwgQ3JpdGljYWwsIFVua25vd25FeGNlcHRpb24pCisKKy8qIFN5c3RlbSBDYWxsICovCisJU1REX0VYQ0VQVElPTigweGMwMCwgU3lzdGVtQ2FsbCwgVW5rbm93bkV4Y2VwdGlvbikKKworLyogVHJhY2UgaW50ZXJydXB0ICovCisJU1REX0VYQ0VQVElPTigweGQwMCwgVHJhY2UsIFVua25vd25FeGNlcHRpb24pCisKKy8qIFBlcmZvcm1hbmNlIE1vbml0b3IgaW50ZXJydXB0ICovCisJU1REX0VYQ0VQVElPTigweGYwMCwgUGVyZk1vbiwgVW5rbm93bkV4Y2VwdGlvbikKKworLyogSW50cnVjdGlvbiBUcmFuc2xhdGlvbiBNaXNzICovCisJU1REX0VYQ0VQVElPTigweDEwMDAsIEluc3RydWN0aW9uVExCTWlzcywgVW5rbm93bkV4Y2VwdGlvbikKKworLyogRGF0YSBMb2FkIFRyYW5zbGF0aW9uIE1pc3MgKi8KKwlTVERfRVhDRVBUSU9OKDB4MTEwMCwgRGF0YUxvYWRUTEJNaXNzLCBVbmtub3duRXhjZXB0aW9uKQorCisvKiBEYXRhIFN0b3JlIFRyYW5zbGF0aW9uIE1pc3MgKi8KKwlTVERfRVhDRVBUSU9OKDB4MTIwMCwgRGF0YVN0b3JlVExCTWlzcywgVW5rbm93bkV4Y2VwdGlvbikKKworLyogSW5zdHJ1Y3Rpb24gQWRkcmVzcyBCcmVha3BvaW50ICovCisJU1REX0VYQ0VQVElPTigweDEzMDAsIEluc3RydWN0aW9uQWRkckJyZWFrcG9pbnQsIERlYnVnRXhjZXB0aW9uKQorCisvKiBTeXN0ZW0gTWFuYWdlbWVudCBpbnRlcnJ1cHQgKi8KKwlTVERfRVhDRVBUSU9OKDB4MTQwMCwgU3lzdGVtTWdtdEludGVycnVwdCwgVW5rbm93bkV4Y2VwdGlvbikKKworCS5nbG9ibAlfZW5kX29mX3ZlY3RvcnMKK19lbmRfb2ZfdmVjdG9yczoKKworCS4gPSAweDMwMDAKK2Jvb3RfY29sZDoKKwkvKiBTYXZlIG1zciBjb250ZW50cyAqLworCW1mbXNyCXI1CisKKwkvKiBTZXQgSU1NUiBhcmVhIHRvIG91ciBwcmVmZXJyZWQgbG9jYXRpb24gKi8KKwlsaXMJcjQsIENPTkZJR19ERUZBVUxUX0lNTVJAaAorCWxpcwlyMywgQ0ZHX0lNTVJAaAorCW9yaQlyMywgcjMsIENGR19JTU1SQGwKKwlzdHcJcjMsIElNTVJCQVIocjQpCisJbXRzcHIJTUJBUiwgcjMJCS8qIElNTVJCQVIgaXMgbWlycm9yZWQgaW50byB0aGUgTUJBUiBTUFIgKDMxMSkgKi8KKworCS8qIEluaXRpYWxpc2UgdGhlIG1hY2hpbmUgKi8KKwlibAljcHVfZWFybHlfaW5pdAorCisJLyoKKwkgKiBTZXQgdXAgTG9jYWwgQWNjZXNzIFdpbmRvd3M6CisJICoKKwkgKiAxKSBCb290L0NTMCAoYm9vdCBGTEFTSCkKKwkgKiAyKSBPbi1jaGlwIFNSQU0gKGluaXRpYWwgc3RhY2sgcHVycG9zZXMpCisJICovCisKKwkvKiBCb290IENTL0NTMCB3aW5kb3cgcmFuZ2UgKi8KKwlsaXMgICAgIHIzLCBDRkdfSU1NUkBoCisJb3JpICAgICByMywgcjMsIENGR19JTU1SQGwKKworCWxpcwlyNCwgU1RBUlRfUkVHKENGR19GTEFTSF9CQVNFKQorCW9yaQlyNCwgcjQsIFNUT1BfUkVHKENGR19GTEFTSF9CQVNFLCBDRkdfRkxBU0hfU0laRSkKKwlzdHcJcjQsIExQQ1MwQVcocjMpCisKKwkvKgorCSAqIFRoZSBTUkFNIHdpbmRvdyBoYXMgYSBmaXhlZCBzaXplICgyNTZLKSwgc28gb25seSB0aGUgc3RhcnQgYWRkcmVzcworCSAqIGlzIG5lY2Vzc2FyeQorCSAqLworCWxpcyAJcjQsIFNUQVJUX1JFRyhDRkdfU1JBTV9CQVNFKSAmIDB4ZmYwMAorCXN0dwlyNCwgU1JBTUJBUihyMykKKworCS8qCisJICogQWNjb3JkaW5nIHRvIE1QQzUxMjFlIFJNLCBjb25maWd1cmluZyBsb2NhbCBhY2Nlc3Mgd2luZG93cyBzaG91bGQKKwkgKiBiZSBmb2xsb3dlZCBieSBhIGR1bW15IHJlYWQgb2YgdGhlIGNvbmZpZyByZWdpc3RlciB0aGF0IHdhcworCSAqIG1vZGlmaWVkIGxhc3QgYW5kIGFuIGlzeW5jCisJICovCisJbHd6CXI0LCBTUkFNQkFSKHIzKQorCWlzeW5jCisKKwkvKgorCSAqIFNldCBjb25maWd1cmF0aW9uIG9mIHRoZSBCb290L0NTMCwgdGhlIFNSQU0gd2luZG93IGRvZXMgbm90IGhhdmUgYQorCSAqIGNvbmZpZyByZWdpc3RlciBzbyBubyBwYXJhbXMgY2FuIGJlIHNldCBmb3IgaXQKKwkgKi8KKwlsaXMgICAgIHIzLCAoQ0ZHX0lNTVIgKyBMUENfT0ZGU0VUKUBoCisJb3JpICAgICByMywgcjMsIChDRkdfSU1NUiArIExQQ19PRkZTRVQpQGwKKworCWxpcyAgICAgcjQsIENGR19DUzBfQ0ZHQGgKKwlvcmkgICAgIHI0LCByNCwgQ0ZHX0NTMF9DRkdAbAorCXN0dyAgICAgcjQsIENTMF9DT05GSUcocjMpCisKKwkvKiBNYXN0ZXIgZW5hYmxlIGFsbCBDUydzICovCisJbGlzCXI0LCBDU19DVFJMX01FQGgKKwlvcmkJcjQsIHI0LCBDU19DVFJMX01FQGwKKwlzdHcJcjQsIENTX0NUUkwocjMpCisKKwlsaXMJcjQsIChDRkdfTU9OSVRPUl9CQVNFKUBoCisJb3JpCXI0LCByNCwgKENGR19NT05JVE9SX0JBU0UpQGwKKwlhZGRpCXI1LCByNCwgaW5fZmxhc2ggLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCW10bHIJcjUKKwlibHIKKworaW5fZmxhc2g6CisJbGlzCXIxLCAoQ0ZHX0lOSVRfUkFNX0FERFIgKyBDRkdfR0JMX0RBVEFfT0ZGU0VUKUBoCisJb3JpCXIxLCByMSwgKENGR19JTklUX1JBTV9BRERSICsgQ0ZHX0dCTF9EQVRBX09GRlNFVClAbAorCisJbGkJcjAsIDAJCS8qIE1ha2Ugcm9vbSBmb3Igc3RhY2sgZnJhbWUgaGVhZGVyIGFuZAkqLworCXN0d3UJcjAsIC00KHIxKQkvKiBjbGVhciBmaW5hbCBzdGFjayBmcmFtZSBzbyB0aGF0CSovCisJc3R3dQlyMCwgLTQocjEpCS8qIHN0YWNrIGJhY2t0cmFjZXMgdGVybWluYXRlIGNsZWFubHkJKi8KKworCS8qIGxldCB0aGUgQy1jb2RlIHNldCB1cCB0aGUgcmVzdAkJCSovCisJLyoJCQkJCQkJKi8KKwkvKiBCZSBjYXJlZnVsIHRvIGtlZXAgY29kZSByZWxvY2F0YWJsZSAmIHN0YWNrIGh1bWJsZQkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCUdFVF9HT1QJCQkvKiBpbml0aWFsaXplIEdPVCBhY2Nlc3MJKi8KKworCS8qIHIzOiBJTU1SICovCisJbGlzCXIzLCBDRkdfSU1NUkBoCisJLyogcnVuIGxvdy1sZXZlbCBDUFUgaW5pdCBjb2RlIChpbiBGbGFzaCkgKi8KKwlibAljcHVfaW5pdF9mCisKKwkvKiByMzogQk9PVEZMQUcgKi8KKwltcglyMywgcjIxCisJLyogcnVuIDFzdCBwYXJ0IG9mIGJvYXJkIGluaXQgY29kZSAoaW4gRmxhc2gpICovCisJYmwJYm9hcmRfaW5pdF9mCisKKwkvKiBOT1RSRUFDSEVEIC0gYm9hcmRfaW5pdF9mKCkgZG9lcyBub3QgcmV0dXJuICovCisKKy8qCisgKiBUaGlzIGNvZGUgZmluaXNoZXMgc2F2aW5nIHRoZSByZWdpc3RlcnMgdG8gdGhlIGV4Y2VwdGlvbiBmcmFtZQorICogYW5kIGp1bXBzIHRvIHRoZSBhcHByb3ByaWF0ZSBoYW5kbGVyIGZvciB0aGUgZXhjZXB0aW9uLgorICogUmVnaXN0ZXIgcjIxIGlzIHBvaW50ZXIgaW50byB0cmFwIGZyYW1lLCByMSBoYXMgbmV3IHN0YWNrIHBvaW50ZXIuCisgKi8KKwkuZ2xvYmwJdHJhbnNmZXJfdG9faGFuZGxlcgordHJhbnNmZXJfdG9faGFuZGxlcjoKKwlzdHcJcjIyLF9OSVAocjIxKQorCWxpcwlyMjIsTVNSX1BPV0BoCisJYW5kYwlyMjMscjIzLHIyMgorCXN0dwlyMjMsX01TUihyMjEpCisJU0FWRV9HUFIoNywgcjIxKQorCVNBVkVfNEdQUlMoOCwgcjIxKQorCVNBVkVfOEdQUlMoMTIsIHIyMSkKKwlTQVZFXzhHUFJTKDI0LCByMjEpCisJbWZscglyMjMKKwlhbmRpLglyMjQscjIzLDB4M2YwMAkJLyogZ2V0IHZlY3RvciBvZmZzZXQgKi8KKwlzdHcJcjI0LFRSQVAocjIxKQorCWxpCXIyMiwwCisJc3R3CXIyMixSRVNVTFQocjIxKQorCWx3eglyMjQsMChyMjMpCQkvKiB2aXJ0dWFsIGFkZHJlc3Mgb2YgaGFuZGxlciAqLworCWx3eglyMjMsNChyMjMpCQkvKiB3aGVyZSB0byBnbyB3aGVuIGRvbmUgKi8KKwltdHNwcglTUlIwLHIyNAorCW10c3ByCVNSUjEscjIwCisJbXRscglyMjMKKwlTWU5DCisJcmZpCQkJCS8qIGp1bXAgdG8gaGFuZGxlciwgZW5hYmxlIE1NVSAqLworCitpbnRfcmV0dXJuOgorCW1mbXNyCXIyOAkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJbGkJcjQsMAorCW9yaQlyNCxyNCxNU1JfRUUKKwlhbmRjCXIyOCxyMjgscjQKKwlTWU5DCQkJLyogU29tZSBjaGlwIHJldnMgbmVlZCB0aGlzLi4uICovCisJbXRtc3IJcjI4CisJU1lOQworCWx3eglyMixfQ1RSKHIxKQorCWx3eglyMCxfTElOSyhyMSkKKwltdGN0cglyMgorCW10bHIJcjAKKwlsd3oJcjIsX1hFUihyMSkKKwlsd3oJcjAsX0NDUihyMSkKKwltdHNwcglYRVIscjIKKwltdGNyZgkweEZGLHIwCisJUkVTVF8xMEdQUlMoMywgcjEpCisJUkVTVF8xMEdQUlMoMTMsIHIxKQorCVJFU1RfOEdQUlMoMjMsIHIxKQorCVJFU1RfR1BSKDMxLCByMSkKKwlsd3oJcjIsX05JUChyMSkJLyogUmVzdG9yZSBlbnZpcm9ubWVudCAqLworCWx3eglyMCxfTVNSKHIxKQorCW10c3ByCVNSUjAscjIKKwltdHNwcglTUlIxLHIwCisJbHd6CXIwLEdQUjAocjEpCisJbHd6CXIyLEdQUjIocjEpCisJbHd6CXIxLEdQUjEocjEpCisJU1lOQworCXJmaQorCisvKgorICogVGhpcyBjb2RlIGluaXRpYWxpc2VzIHRoZSBtYWNoaW5lLCBpdCBleHBlY3RzIG9yaWdpbmFsIE1TUiBjb250ZW50cyB0byBiZSBpbiByNS4KKyAqLworY3B1X2Vhcmx5X2luaXQ6CisJLyogSW5pdGlhbGl6ZSBtYWNoaW5lIHN0YXR1czsgZW5hYmxlIG1hY2hpbmUgY2hlY2sgaW50ZXJydXB0ICovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlsaQlyMywgTVNSX0tFUk5FTAkJCS8qIFNldCBNRSBhbmQgUkkgZmxhZ3MgKi8KKwlybHdpbWkJcjMsIHI1LCAwLCAyNSwgMjUJCS8qIHByZXNlcnZlIElQIGJpdCAqLworI2lmZGVmIERFQlVHCisJcmx3aW1pCXIzLCByNSwgMCwgMjEsIDIyCQkvKiBkZWJ1Z2dlciBtaWdodCBzZXQgU0UsIEJFIGJpdHMgKi8KKyNlbmRpZgorCW10bXNyCXIzCisJU1lOQworCW10c3ByCVNSUjEsIHIzCQkJLyogTWlycm9yIGN1cnJlbnQgTVNSIHN0YXRlIGluIFNSUjEgKi8KKworCWxpcwlyMywgQ0ZHX0lNTVJAaAorCisjaWYgZGVmaW5lZChDT05GSUdfV0FUQ0hET0cpCisJLyogSW5pdGlhbGlzZSB0aGUgd2F0Y2hkb2cgYW5kIHJlc2V0IGl0ICovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbGlzIHI0LCBDRkdfV0FUQ0hET0dfVkFMVUUKKwlvcmkgcjQsIHI0LCAoU1dDUlJfU1dFTiB8IFNXQ1JSX1NXUkkgfCBTV0NSUl9TV1BSKQorCXN0dyByNCwgU1dDUlIocjMpCisKKwkvKiByZXNldCAqLworCWxpCXI0LCAweDU1NkMKKwlzdGgJcjQsIFNXU1JSQGwocjMpCisJbGkJcjQsIDB4MAorCW9yaQlyNCwgcjQsIDB4QUEzOQorCXN0aAlyNCwgU1dTUlJAbChyMykKKyNlbHNlCisJLyogRGlzYWJsZSB0aGUgd2F0Y2hkb2cgKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWx3eiByNCwgU1dDUlIocjMpCisJLyoKKwkgKiBDaGVjayB0byBzZWUgaWYgaXQncyBlbmFibGVkIGZvciBkaXNhYmxpbmc6IG9uY2UgZGlzYWJsZWQgYnkgcy93CisJICogaXQncyBub3QgcG9zc2libGUgdG8gcmUtZW5hYmxlIGl0CisJICovCisJYW5kaS4gcjQsIHI0LCAweDQKKwliZXEgMWYKKwl4b3IgcjQsIHI0LCByNAorCXN0dyByNCwgU1dDUlIocjMpCisxOgorI2VuZGlmIC8qIENPTkZJR19XQVRDSERPRyAqLworCisJLyogSW5pdGlhbGl6ZSB0aGUgSGFyZHdhcmUgSW1wbGVtZW50YXRpb24tZGVwZW5kZW50IFJlZ2lzdGVycyAqLworCS8qIEhJRDAgYWxzbyBjb250YWlucyBjYWNoZSBjb250cm9sCQkJKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbGlzCXIzLCBDRkdfSElEMF9JTklUQGgKKwlvcmkJcjMsIHIzLCBDRkdfSElEMF9JTklUQGwKKwlTWU5DCisJbXRzcHIJSElEMCwgcjMKKworCWxpcwlyMywgQ0ZHX0hJRDBfRklOQUxAaAorCW9yaQlyMywgcjMsIENGR19ISUQwX0ZJTkFMQGwKKwlTWU5DCisJbXRzcHIJSElEMCwgcjMKKworCWxpcwlyMywgQ0ZHX0hJRDJAaAorCW9yaQlyMywgcjMsIENGR19ISUQyQGwKKwlTWU5DCisJbXRzcHIJSElEMiwgcjMKKwlzeW5jCisJYmxyCisKKworLyogQ2FjaGUgZnVuY3Rpb25zLgorICoKKyAqIE5vdGU6IHJlcXVpcmVzIHRoYXQgYWxsIGNhY2hlIGJpdHMgaW4KKyAqIEhJRDAgYXJlIGluIHRoZSBsb3cgaGFsZiB3b3JkLgorICovCisJLmdsb2JsCWljYWNoZV9lbmFibGUKK2ljYWNoZV9lbmFibGU6CisJbWZzcHIJcjMsIEhJRDAKKwlvcmkJcjMsIHIzLCBISUQwX0lDRQorCWxpcwlyNCwgMAorCW9yaQlyNCwgcjQsIEhJRDBfSUxPQ0sKKwlhbmRjCXIzLCByMywgcjQKKwlvcmkJcjQsIHIzLCBISUQwX0lDRkkKKwlpc3luYworCW10c3ByCUhJRDAsIHI0ICAgIC8qIHNldHMgZW5hYmxlIGFuZCBpbnZhbGlkYXRlLCBjbGVhcnMgbG9jayAqLworCWlzeW5jCisJbXRzcHIJSElEMCwgcjMJLyogY2xlYXJzIGludmFsaWRhdGUgKi8KKwlibHIKKworCS5nbG9ibAlpY2FjaGVfZGlzYWJsZQoraWNhY2hlX2Rpc2FibGU6CisJbWZzcHIJcjMsIEhJRDAKKwlsaXMJcjQsIDAKKwlvcmkJcjQsIHI0LCBISUQwX0lDRXxISUQwX0lMT0NLCisJYW5kYwlyMywgcjMsIHI0CisJb3JpCXI0LCByMywgSElEMF9JQ0ZJCisJaXN5bmMKKwltdHNwcglISUQwLCByNCAgICAgLyogc2V0cyBpbnZhbGlkYXRlLCBjbGVhcnMgZW5hYmxlIGFuZCBsb2NrKi8KKwlpc3luYworCW10c3ByCUhJRDAsIHIzCS8qIGNsZWFycyBpbnZhbGlkYXRlICovCisJYmxyCisKKwkuZ2xvYmwJaWNhY2hlX3N0YXR1cworaWNhY2hlX3N0YXR1czoKKwltZnNwcglyMywgSElEMAorCXJsd2lubQlyMywgcjMsICgzMSAtIEhJRDBfSUNFX1NISUZUICsgMSksIDMxLCAzMQorCWJscgorCisJLmdsb2JsCWRjYWNoZV9lbmFibGUKK2RjYWNoZV9lbmFibGU6CisJbWZzcHIJcjMsIEhJRDAKKwlsaQlyNSwgSElEMF9EQ0ZJfEhJRDBfRExPQ0sKKwlhbmRjCXIzLCByMywgcjUKKwltdHNwcglISUQwLCByMwkJLyogbm8gaW52YWxpZGF0ZSwgdW5sb2NrICovCisJb3JpCXIzLCByMywgSElEMF9EQ0UKKwlvcmkJcjUsIHIzLCBISUQwX0RDRkkKKwltdHNwcglISUQwLCByNQkJLyogZW5hYmxlICsgaW52YWxpZGF0ZSAqLworCW10c3ByCUhJRDAsIHIzCQkvKiBlbmFibGUgKi8KKwlzeW5jCisJYmxyCisKKwkuZ2xvYmwJZGNhY2hlX2Rpc2FibGUKK2RjYWNoZV9kaXNhYmxlOgorCW1mc3ByCXIzLCBISUQwCisJbGlzCXI0LCAwCisJb3JpCXI0LCByNCwgSElEMF9EQ0V8SElEMF9ETE9DSworCWFuZGMJcjMsIHIzLCByNAorCW9yaQlyNCwgcjMsIEhJRDBfRENJCisJc3luYworCW10c3ByCUhJRDAsIHI0CS8qIHNldHMgaW52YWxpZGF0ZSwgY2xlYXJzIGVuYWJsZSBhbmQgbG9jayAqLworCXN5bmMKKwltdHNwcglISUQwLCByMwkvKiBjbGVhcnMgaW52YWxpZGF0ZSAqLworCWJscgorCisJLmdsb2JsCWRjYWNoZV9zdGF0dXMKK2RjYWNoZV9zdGF0dXM6CisJbWZzcHIJcjMsIEhJRDAKKwlybHdpbm0JcjMsIHIzLCAoMzEgLSBISUQwX0RDRV9TSElGVCArIDEpLCAzMSwgMzEKKwlibHIKKworCS5nbG9ibCBnZXRfcHZyCitnZXRfcHZyOgorCW1mc3ByCXIzLCBQVlIKKwlibHIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBGdW5jdGlvbjoJIHBwY0RjYmYgKi8KKy8qIERlc2NyaXB0aW9uOgkgRGF0YSBDYWNoZSBibG9jayBmbHVzaCAqLworLyogSW5wdXQ6CSByMyA9IGVmZmVjdGl2ZSBhZGRyZXNzICovCisvKiBPdXRwdXQ6CSBub25lLiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLmdsb2JsCXBwY0RjYmYKK3BwY0RjYmY6CisJZGNiZglyMCxyMworCWJscgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEZ1bmN0aW9uOgkgcHBjRGNiaSAqLworLyogRGVzY3JpcHRpb246CSBEYXRhIENhY2hlIGJsb2NrIEludmFsaWRhdGUgKi8KKy8qIElucHV0OgkgcjMgPSBlZmZlY3RpdmUgYWRkcmVzcyAqLworLyogT3V0cHV0Ogkgbm9uZS4gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS5nbG9ibAlwcGNEY2JpCitwcGNEY2JpOgorCWRjYmkJcjAscjMKKwlibHIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246CSBwcGNEY2J6CisgKiBEZXNjcmlwdGlvbjoJIERhdGEgQ2FjaGUgYmxvY2sgemVyby4KKyAqIElucHV0OgkgcjMgPSBlZmZlY3RpdmUgYWRkcmVzcworICogT3V0cHV0Ogkgbm9uZS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCS5nbG9ibAlwcGNEY2J6CitwcGNEY2J6OgorCWRjYnoJcjAscjMKKwlibHIKKworCS5nbG9ibAlwcGNEV3N0b3JlCitwcGNEV3N0b3JlOgorCWxmZAkxLCAwKHI0KQorCXN0ZmQJMSwgMChyMykKKwlibHIKKworCS5nbG9ibAlwcGNEV2xvYWQKK3BwY0RXbG9hZDoKKwlsZmQJMSwgMChyMykKKwlzdGZkCTEsIDAocjQpCisJYmxyCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiB2b2lkIHJlbG9jYXRlX2NvZGUgKGFkZHJfc3AsIGdkLCBhZGRyX21vbmkpCisgKgorICogVGhpcyAiZnVuY3Rpb24iIGRvZXMgbm90IHJldHVybiwgaW5zdGVhZCBpdCBjb250aW51ZXMgaW4gUkFNCisgKiBhZnRlciByZWxvY2F0aW5nIHRoZSBtb25pdG9yIGNvZGUuCisgKgorICogcjMgPSBkZXN0CisgKiByNCA9IHNyYworICogcjUgPSBsZW5ndGggaW4gYnl0ZXMKKyAqIHI2ID0gY2FjaGVsaW5lc2l6ZQorICovCisJLmdsb2JsCXJlbG9jYXRlX2NvZGUKK3JlbG9jYXRlX2NvZGU6CisJbXIJcjEsICByMwkJLyogU2V0IG5ldyBzdGFjayBwb2ludGVyCSovCisJbXIJcjksICByNAkJLyogU2F2ZSBjb3B5IG9mIEdsb2JhbCBEYXRhIHBvaW50ZXIgKi8KKwltcglyMTAsIHI1CQkvKiBTYXZlIGNvcHkgb2YgRGVzdGluYXRpb24gQWRkcmVzcyAqLworCisJbXIJcjMsICByNQkJCQkvKiBEZXN0aW5hdGlvbiBBZGRyZXNzICovCisJbGlzCXI0LCBDRkdfTU9OSVRPUl9CQVNFQGgJCS8qIFNvdXJjZSAgICAgIEFkZHJlc3MgKi8KKwlvcmkJcjQsIHI0LCBDRkdfTU9OSVRPUl9CQVNFQGwKKwlsd3oJcjUsIEdPVChfX2luaXRfZW5kKQorCXN1YglyNSwgcjUsIHI0CisJbGkJcjYsIENGR19DQUNIRUxJTkVfU0laRQkJLyogQ2FjaGUgTGluZSBTaXplICovCisKKwkvKgorCSAqIEZpeCBHT1QgcG9pbnRlcjoKKwkgKgorCSAqIE5ldyBHT1QtUFRSID0gKG9sZCBHT1QtUFRSIC0gQ0ZHX01PTklUT1JfQkFTRSkKKwkgKgkJKyBEZXN0aW5hdGlvbiBBZGRyZXNzCisJICoKKwkgKiBPZmZzZXQ6CisJICovCisJc3ViCXIxNSwgcjEwLCByNAorCisJLyogRmlyc3Qgb3VyIG93biBHT1QgKi8KKwlhZGQJcjE0LCByMTQsIHIxNQorCS8qIHRoZW4gdGhlIG9uZSB1c2VkIGJ5IHRoZSBDIGNvZGUgKi8KKwlhZGQJcjMwLCByMzAsIHIxNQorCisJLyoKKwkgKiBOb3cgcmVsb2NhdGUgY29kZQorCSAqLworCWNtcGx3CWNyMSxyMyxyNAorCWFkZGkJcjAscjUsMworCXNyd2kuCXIwLHIwLDIKKwliZXEJY3IxLDRmCQkvKiBJbiBwbGFjZSBjb3B5IGlzIG5vdCBuZWNlc3NhcnkgKi8KKwliZXEJN2YJCS8qIFByb3RlY3QgYWdhaW5zdCAwIGNvdW50CSAgKi8KKwltdGN0cglyMAorCWJnZQljcjEsMmYKKwlsYQlyOCwtNChyNCkKKwlsYQlyNywtNChyMykKKworCS8qIGNvcHkgKi8KKzE6CWx3enUJcjAsNChyOCkKKwlzdHd1CXIwLDQocjcpCisJYmRuegkxYgorCisJYWRkaQlyMCxyNSwzCisJc3J3aS4JcjAscjAsMgorCW10Y3RyCXIwCisJbGEJcjgsLTQocjQpCisJbGEJcjcsLTQocjMpCisKKwkvKiBhbmQgY29tcGFyZSAqLworMjA6CWx3enUJcjIwLDQocjgpCisJbHd6dQlyMjEsNChyNykKKwl4b3IuIHIyMiwgcjIwLCByMjEKKwlibmUgIDMwZgorCWJkbnoJMjBiCisJYiA0ZgorCisJLyogY29tcGFyZSBmYWlsZWQgKi8KKzMwOglsaSByMywgMAorCWJscgorCisyOglzbHdpCXIwLHIwLDIgLyogcmUgY29weSBpbiByZXZlcnNlIG9yZGVyIC4uLiB5IGRvIHdlIG5lZWRlZCBpdD8gKi8KKwlhZGQJcjgscjQscjAKKwlhZGQJcjcscjMscjAKKzM6CWx3enUJcjAsLTQocjgpCisJc3R3dQlyMCwtNChyNykKKwliZG56CTNiCisKKy8qCisgKiBOb3cgZmx1c2ggdGhlIGNhY2hlOiBub3RlIHRoYXQgd2UgbXVzdCBzdGFydCBmcm9tIGEgY2FjaGUgYWxpZ25lZAorICogYWRkcmVzcy4gT3RoZXJ3aXNlIHdlIG1pZ2h0IG1pc3Mgb25lIGNhY2hlIGxpbmUuCisgKi8KKzQ6CWNtcHdpCXI2LDAKKwlhZGQJcjUscjMscjUKKwliZXEJN2YJCS8qIEFsd2F5cyBmbHVzaCBwcmVmZXRjaCBxdWV1ZSBpbiBhbnkgY2FzZSAqLworCXN1YmkJcjAscjYsMQorCWFuZGMJcjMscjMscjAKKwltcglyNCxyMworNToJZGNic3QJMCxyNAorCWFkZAlyNCxyNCxyNgorCWNtcGx3CXI0LHI1CisJYmx0CTViCisJc3luYwkJCS8qIFdhaXQgZm9yIGFsbCBkY2JzdCB0byBjb21wbGV0ZSBvbiBidXMgKi8KKwltcglyNCxyMworNjoJaWNiaQkwLHI0CisJYWRkCXI0LHI0LHI2CisJY21wbHcJcjQscjUKKwlibHQJNmIKKzc6CXN5bmMJCQkvKiBXYWl0IGZvciBhbGwgaWNiaSB0byBjb21wbGV0ZSBvbiBidXMJKi8KKwlpc3luYworCisvKgorICogV2UgYXJlIGRvbmUuIERvIG5vdCByZXR1cm4sIGluc3RlYWQgYnJhbmNoIHRvIHNlY29uZCBwYXJ0IG9mIGJvYXJkCisgKiBpbml0aWFsaXphdGlvbiwgbm93IHJ1bm5pbmcgZnJvbSBSQU0uCisgKi8KKwlhZGRpCXIwLCByMTAsIGluX3JhbSAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbXRscglyMAorCWJscgorCitpbl9yYW06CisJLyoKKwkgKiBSZWxvY2F0aW9uIEZ1bmN0aW9uLCByMTQgcG9pbnQgdG8gZ290MisweDgwMDAKKwkgKgorCSAqIEFkanVzdCBnb3QyIHBvaW50ZXJzLCBubyBuZWVkIHRvIGNoZWNrIGZvciAwLCB0aGlzIGNvZGUKKwkgKiBhbHJlYWR5IHB1dHMgYSBmZXcgZW50cmllcyBpbiB0aGUgdGFibGUuCisJICovCisJbGkJcjAsX19nb3QyX2VudHJpZXNAc2VjdG9mZkBsCisJbGEJcjMsR09UKF9HT1QyX1RBQkxFXykKKwlsd3oJcjExLEdPVChfR09UMl9UQUJMRV8pCisJbXRjdHIJcjAKKwlzdWIJcjExLHIzLHIxMQorCWFkZGkJcjMscjMsLTQKKzE6CWx3enUJcjAsNChyMykKKwlhZGQJcjAscjAscjExCisJc3R3CXIwLDAocjMpCisJYmRuegkxYgorCisJLyoKKwkgKiBOb3cgYWRqdXN0IHRoZSBmaXh1cHMgYW5kIHRoZSBwb2ludGVycyB0byB0aGUgZml4dXBzCisJICogaW4gY2FzZSB3ZSBuZWVkIHRvIG1vdmUgb3Vyc2VsdmVzIGFnYWluLgorCSAqLworMjoJbGkJcjAsX19maXh1cF9lbnRyaWVzQHNlY3RvZmZAbAorCWx3eglyMyxHT1QoX0ZJWFVQX1RBQkxFXykKKwljbXB3aQlyMCwwCisJbXRjdHIJcjAKKwlhZGRpCXIzLHIzLC00CisJYmVxCTRmCiszOglsd3p1CXI0LDQocjMpCisJbHd6dXgJcjAscjQscjExCisJYWRkCXIwLHIwLHIxMQorCXN0dwlyMTAsMChyMykKKwlzdHcJcjAsMChyNCkKKwliZG56CTNiCis0OgorY2xlYXJfYnNzOgorCS8qCisJICogTm93IGNsZWFyIEJTUyBzZWdtZW50CisJICovCisJbHd6CXIzLEdPVChfX2Jzc19zdGFydCkKKwlsd3oJcjQsR09UKF9lbmQpCisKKwljbXBsdwkwLCByMywgcjQKKwliZXEJNmYKKworCWxpCXIwLCAwCis1OgorCXN0dwlyMCwgMChyMykKKwlhZGRpCXIzLCByMywgNAorCWNtcGx3CTAsIHIzLCByNAorCWJuZQk1YgorNjoKKwltcglyMywgcjkJCS8qIEdsb2JhbCBEYXRhIHBvaW50ZXIJCSovCisJbXIJcjQsIHIxMAkJLyogRGVzdGluYXRpb24gQWRkcmVzcwkJKi8KKwlibAlib2FyZF9pbml0X3IKKworCS8qCisJICogQ29weSBleGNlcHRpb24gdmVjdG9yIGNvZGUgdG8gbG93IG1lbW9yeQorCSAqCisJICogcjM6IGRlc3RfYWRkcgorCSAqIHI3OiBzb3VyY2UgYWRkcmVzcywgcjg6IGVuZCBhZGRyZXNzLCByOTogdGFyZ2V0IGFkZHJlc3MKKwkgKi8KKwkuZ2xvYmwJdHJhcF9pbml0Cit0cmFwX2luaXQ6CisJbHd6CXI3LCBHT1QoX3N0YXJ0KQorCWx3eglyOCwgR09UKF9lbmRfb2ZfdmVjdG9ycykKKworCWxpCXI5LCAweDEwMAkvKiByZXNldCB2ZWN0b3IgYXQgMHgxMDAgKi8KKworCWNtcGx3CTAsIHI3LCByOAorCWJnZWxyCQkJLyogcmV0dXJuIGlmIHI3Pj1yOCAtIGp1c3QgaW4gY2FzZSAqLworCisJbWZscglyNAkJLyogc2F2ZSBsaW5rIHJlZ2lzdGVyICovCisxOgorCWx3eglyMCwgMChyNykKKwlzdHcJcjAsIDAocjkpCisJYWRkaQlyNywgcjcsIDQKKwlhZGRpCXI5LCByOSwgNAorCWNtcGx3CTAsIHI3LCByOAorCWJuZQkxYgorCisJLyoKKwkgKiByZWxvY2F0ZSBgaGRscicgYW5kIGBpbnRfcmV0dXJuJyBlbnRyaWVzCisJICovCisJbGkJcjcsIC5MX01hY2hpbmVDaGVjayAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbGkJcjgsIEFsaWdubWVudCAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisyOgorCWJsCXRyYXBfcmVsb2MKKwlhZGRpCXI3LCByNywgMHgxMDAJCS8qIG5leHQgZXhjZXB0aW9uIHZlY3RvciAqLworCWNtcGx3CTAsIHI3LCByOAorCWJsdAkyYgorCisJbGkJcjcsIC5MX0FsaWdubWVudCAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJYmwJdHJhcF9yZWxvYworCisJbGkJcjcsIC5MX1Byb2dyYW1DaGVjayAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJYmwJdHJhcF9yZWxvYworCisJbGkJcjcsIC5MX0ZQVW5hdmFpbGFibGUgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWxpCXI4LCBTeXN0ZW1DYWxsIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKzM6CisJYmwJdHJhcF9yZWxvYworCWFkZGkJcjcsIHI3LCAweDEwMAkJLyogbmV4dCBleGNlcHRpb24gdmVjdG9yICovCisJY21wbHcJMCwgcjcsIHI4CisJYmx0CTNiCisKKwlsaQlyNywgLkxfVHJhY2UgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWxpCXI4LCBfZW5kX29mX3ZlY3RvcnMgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorNDoKKwlibAl0cmFwX3JlbG9jCisJYWRkaQlyNywgcjcsIDB4MTAwCQkvKiBuZXh0IGV4Y2VwdGlvbiB2ZWN0b3IgKi8KKwljbXBsdwkwLCByNywgcjgKKwlibHQJNGIKKworCW1mbXNyCXIzCQkJLyogbm93IHRoYXQgdGhlIHZlY3RvcnMgaGF2ZSAqLworCWxpcwlyNywgTVNSX0lQQGgJCS8qIHJlbG9jYXRlZCBpbnRvIGxvdyBtZW1vcnkgKi8KKwlvcmkJcjcsIHI3LCBNU1JfSVBAbAkvKiBNU1JbSVBdIGNhbiBiZSB0dXJuZWQgb2ZmICovCisJYW5kYwlyMywgcjMsIHI3CQkvKiAoaWYgaXQgd2FzIG9uKSAqLworCVNZTkMJCQkJLyogU29tZSBjaGlwIHJldnMgbmVlZCB0aGlzLi4uICovCisJbXRtc3IJcjMKKwlTWU5DCisKKwltdGxyCXI0CQkJLyogcmVzdG9yZSBsaW5rIHJlZ2lzdGVyICAgICovCisJYmxyCisKKwkvKgorCSAqIEZ1bmN0aW9uOiByZWxvY2F0ZSBlbnRyaWVzIGZvciBvbmUgZXhjZXB0aW9uIHZlY3RvcgorCSAqLwordHJhcF9yZWxvYzoKKwlsd3oJcjAsIDAocjcpCQkvKiBoZGxyIC4uLgkJKi8KKwlhZGQJcjAsIHIwLCByMwkJLyogIC4uLiArPSBkZXN0X2FkZHIJKi8KKwlzdHcJcjAsIDAocjcpCisKKwlsd3oJcjAsIDQocjcpCQkvKiBpbnRfcmV0dXJuIC4uLgkqLworCWFkZAlyMCwgcjAsIHIzCQkvKiAgLi4uICs9IGRlc3RfYWRkcgkqLworCXN0dwlyMCwgNChyNykKKworCWJscgpkaWZmIC0tZ2l0IGEvY3B1L21wYzUxMngvdHJhcHMuYyBiL2NwdS9tcGM1MTJ4L3RyYXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ1NWM5MgotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9tcGM1MTJ4L3RyYXBzLmMKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAgLSAyMDA3CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk2ICBHYXJ5IFRob21hcyAoZ2R0QGxpbnV4cHBjLm9yZykKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBEZXJpdmVkIGZyb20gdGhlIE1QQzgzeHggY29kZS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGhhbmRsZXMgdGhlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgcGFydHMgb2YgaGFyZHdhcmUKKyAqIGV4Y2VwdGlvbnMKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2VhcmNoX2V4Y2VwdGlvbl90YWJsZSh1bnNpZ25lZCBsb25nKTsKKworI2RlZmluZSBFTkRfT0ZfTUVNCShnZC0+YmQtPmJpX21lbXN0YXJ0ICsgZ2QtPmJkLT5iaV9tZW1zaXplKQorCisvKgorICogVHJhcCAmIEV4Y2VwdGlvbiBzdXBwb3J0CisgKi8KKwordm9pZAorcHJpbnRfYmFja3RyYWNlICh1bnNpZ25lZCBsb25nICpzcCkKK3sKKwlpbnQgY250ID0gMDsKKwl1bnNpZ25lZCBsb25nIGk7CisKKwlwdXRzICgiQ2FsbCBiYWNrdHJhY2U6ICIpOworCXdoaWxlIChzcCkgeworCQlpZiAoKHVpbnQpc3AgPiBFTkRfT0ZfTUVNKQorCQkJYnJlYWs7CisKKwkJaSA9IHNwWzFdOworCQlpZiAoY250KysgJSA3ID09IDApCisJCQlwdXRjICgnXG4nKTsKKwkJcHJpbnRmICgiJTA4bFggIiwgaSk7CisJCWlmIChjbnQgPiAzMikgYnJlYWs7CisJCXNwID0gKHVuc2lnbmVkIGxvbmcgKikgKnNwOworCX0KKwlwdXRjICgnXG4nKTsKK30KKwordm9pZCBzaG93X3JlZ3MgKHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlpbnQgaTsKKworCXByaW50ZiAoIk5JUDogJTA4bFggWEVSOiAlMDhsWCBMUjogJTA4bFggUkVHUzogJXAgVFJBUDogJTA0bHggREFSOiAlMDhsWFxuIiwKKwkgICAgICAgcmVncy0+bmlwLCByZWdzLT54ZXIsIHJlZ3MtPmxpbmssIHJlZ3MsIHJlZ3MtPnRyYXAsIHJlZ3MtPmRhcik7CisJcHJpbnRmICgiTVNSOiAlMDhseCBFRTogJTAxeCBQUjogJTAxeCBGUDogJTAxeCBNRTogJTAxeCBJUi9EUjogJTAxeCUwMXhcbiIsCisJICAgICAgIHJlZ3MtPm1zciwgcmVncy0+bXNyICYgTVNSX0VFID8gMSA6IDAsIHJlZ3MtPm1zciAmIE1TUl9QUiA/IDEgOiAwLAorCSAgICAgICByZWdzLT5tc3IgJiBNU1JfRlAgPyAxIDogMCxyZWdzLT5tc3IgJiBNU1JfTUUgPyAxIDogMCwKKwkgICAgICAgcmVncy0+bXNyICYgTVNSX0lSID8gMSA6IDAsCisJICAgICAgIHJlZ3MtPm1zciAmIE1TUl9EUiA/IDEgOiAwKTsKKworCXB1dGMgKCdcbicpOworCWZvciAoaSA9IDA7ICBpIDwgMzI7ICBpKyspIHsKKwkJaWYgKChpICUgOCkgPT0gMCkgeworCQkJcHJpbnRmICgiR1BSJTAyZDogIiwgaSk7CisJCX0KKworCQlwcmludGYgKCIlMDhsWCAiLCByZWdzLT5ncHJbaV0pOworCQlpZiAoKGkgJSA4KSA9PSA3KSB7CisJCQlwdXRjICgnXG4nKTsKKwkJfQorCX0KK30KKworCit2b2lkCitfZXhjZXB0aW9uIChpbnQgc2lnbnIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXNob3dfcmVncyAocmVncyk7CisJcHJpbnRfYmFja3RyYWNlICgodW5zaWduZWQgbG9uZyAqKXJlZ3MtPmdwclsxXSk7CisJcGFuaWMgKCJFeGNlcHRpb24gYXQgcGMgJWx4IHNpZ25hbCAlZCIsIHJlZ3MtPm5pcCxzaWducik7Cit9CisKKwordm9pZAorTWFjaGluZUNoZWNrRXhjZXB0aW9uIChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGZpeHVwOworCisJaWYgKChmaXh1cCA9IHNlYXJjaF9leGNlcHRpb25fdGFibGUgKHJlZ3MtPm5pcCkpICE9IDApIHsKKwkJcmVncy0+bmlwID0gZml4dXA7CisJCXJldHVybjsKKwl9CisKKyNpZmRlZiBDT05GSUdfQ01EX0tHREIKKwlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCisJCXJldHVybjsKKyNlbmRpZgorCisJcHV0cyAoIk1hY2hpbmUgY2hlY2suXG5DYXVzZWQgYnkgKGZyb20gbXNyKTogIik7CisJcHJpbnRmICgicmVncyAlcCAiLHJlZ3MpOworCXN3aXRjaCAocmVncy0+bXNyICYgMHgwMEZGMDAwMCkgeworCWNhc2UgKDB4ODAwMDAwMDAgPj4gMTApOgorCQlwdXRzICgiSW5zdHJ1Y3Rpb24gY2FjaGUgcGFyaXR5IHNpZ25hbFxuIik7CisJCWJyZWFrOworCWNhc2UgKDB4ODAwMDAwMDAgPj4gMTEpOgorCQlwdXRzICgiRGF0YSBjYWNoZSBwYXJpdHkgc2lnbmFsXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAoMHg4MDAwMDAwMCA+PiAxMik6CisJCXB1dHMgKCJNYWNoaW5lIGNoZWNrIHNpZ25hbFxuIik7CisJCWJyZWFrOworCWNhc2UgKDB4ODAwMDAwMDAgPj4gMTMpOgorCQlwdXRzICgiVHJhbnNmZXIgZXJyb3IgYWNrIHNpZ25hbFxuIik7CisJCWJyZWFrOworCWNhc2UgKDB4ODAwMDAwMDAgPj4gMTQpOgorCQlwdXRzICgiRGF0YSBwYXJpdHkgc2lnbmFsXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAoMHg4MDAwMDAwMCA+PiAxNSk6CisJCXB1dHMgKCJBZGRyZXNzIHBhcml0eSBzaWduYWxcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwdXRzICgiVW5rbm93biB2YWx1ZXMgaW4gbXNyXG4iKTsKKwl9CisJc2hvd19yZWdzIChyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UgKCh1bnNpZ25lZCBsb25nICopcmVncy0+Z3ByWzFdKTsKKworCXBhbmljICgibWFjaGluZSBjaGVjayIpOworfQorCit2b2lkCitBbGlnbm1lbnRFeGNlcHRpb24gKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworI2lmZGVmIENPTkZJR19DTURfS0dEQgorCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKKwkJcmV0dXJuOworI2VuZGlmCisJc2hvd19yZWdzIChyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UgKCh1bnNpZ25lZCBsb25nICopcmVncy0+Z3ByWzFdKTsKKwlwYW5pYyAoIkFsaWdubWVudCBFeGNlcHRpb24iKTsKK30KKwordm9pZAorUHJvZ3JhbUNoZWNrRXhjZXB0aW9uIChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyNpZmRlZiBDT05GSUdfQ01EX0tHREIKKwlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCisJCXJldHVybjsKKyNlbmRpZgorCXNob3dfcmVncyAocmVncyk7CisJcHJpbnRfYmFja3RyYWNlICgodW5zaWduZWQgbG9uZyAqKXJlZ3MtPmdwclsxXSk7CisJcGFuaWMgKCJQcm9ncmFtIENoZWNrIEV4Y2VwdGlvbiIpOworfQorCit2b2lkCitTb2Z0RW11RXhjZXB0aW9uIChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyNpZmRlZiBDT05GSUdfQ01EX0tHREIKKwlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCisJCXJldHVybjsKKyNlbmRpZgorCXNob3dfcmVncyAocmVncyk7CisJcHJpbnRfYmFja3RyYWNlICgodW5zaWduZWQgbG9uZyAqKXJlZ3MtPmdwclsxXSk7CisJcGFuaWMgKCJTb2Z0d2FyZSBFbXVsYXRpb24gRXhjZXB0aW9uIik7Cit9CisKKwordm9pZAorVW5rbm93bkV4Y2VwdGlvbiAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisjaWZkZWYgQ09ORklHX0NNRF9LR0RCCisJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKwlwcmludGYgKCJCYWQgdHJhcCBhdCBQQzogJWx4LCBTUjogJWx4LCB2ZWN0b3I9JWx4XG4iLAorCSAgICAgICByZWdzLT5uaXAsIHJlZ3MtPm1zciwgcmVncy0+dHJhcCk7CisJX2V4Y2VwdGlvbiAoMCwgcmVncyk7Cit9CisKKyNpZmRlZiBDT05GSUdfQ01EX0JFREJVRworZXh0ZXJuIHZvaWQgZG9fYmVkYnVnX2JyZWFrcG9pbnQgKHN0cnVjdCBwdF9yZWdzICopOworI2VuZGlmCisKK3ZvaWQKK0RlYnVnRXhjZXB0aW9uIChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlwcmludGYgKCJEZWJ1Z2dlciB0cmFwIGF0IEAgJWx4XG4iLCByZWdzLT5uaXAgKTsKKwlzaG93X3JlZ3MgKHJlZ3MpOworI2lmZGVmIENPTkZJR19DTURfQkVEQlVHCisJZG9fYmVkYnVnX2JyZWFrcG9pbnQgKHJlZ3MpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9jcHUvbXBjNXh4L2NvbmZpZy5tayBiL2NwdS9tcGM1eHgvY29uZmlnLm1rCmluZGV4IDViMjZhNzYuLmU5NWI4YTEgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM1eHgvY29uZmlnLm1rCisrKyBiL2NwdS9tcGM1eHgvY29uZmlnLm1rCkBAIC0yOCw2ICsyOCw5IEBACiAjCiAKIAotUExBVEZPUk1fUkVMRkxBR1MgKz0gCS1mUElDIC1mZml4ZWQtcjE0IC1tZWFiaQorUExBVEZPUk1fUkVMRkxBR1MgKz0gCS1mUElDIC1mZml4ZWQtcjE0IC1tZWFiaSAtbXJlbG9jYXRhYmxlCiAKIFBMQVRGT1JNX0NQUEZMQUdTICs9CS1EQ09ORklHXzV4eCAtZmZpeGVkLXIyIC1mZml4ZWQtcjI5IC1tcG93ZXJwYyAtbXNvZnQtZmxvYXQKKworIyBVc2UgZGVmYXVsdCBsaW5rZXIgc2NyaXB0LiAgQm9hcmQgcG9ydCBjYW4gb3ZlcnJpZGUgaW4gYm9hcmQvKi9jb25maWcubWsKK0xEU0NSSVBUIDo9ICQoU1JDVFJFRSkvY3B1L21wYzV4eC91LWJvb3QubGRzCmRpZmYgLS1naXQgYS9jcHUvbXBjNXh4L2ludGVycnVwdHMuYyBiL2NwdS9tcGM1eHgvaW50ZXJydXB0cy5jCmluZGV4IDdmNmUxMzYuLmE0ZjQ3YzcgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM1eHgvaW50ZXJydXB0cy5jCisrKyBiL2NwdS9tcGM1eHgvaW50ZXJydXB0cy5jCkBAIC0xNzgsNyArMTc4LDcgQEAKIAlyZXR1cm47CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JUlEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lSUSkKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogaXJxaW5mbyAtIHByaW50IGluZm9ybWF0aW9uIGFib3V0IElSUXMKQEAgLTIwNCw0ICsyMDQsNCBAQAogfQogCiAKLSNlbmRpZiAgLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JUlEgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L21wYzV4eC9zdGFydC5TIGIvY3B1L21wYzV4eC9zdGFydC5TCmluZGV4IDA4NzQzNWUuLjA2MzcwMDMgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM1eHgvc3RhcnQuUworKysgYi9jcHUvbXBjNXh4L3N0YXJ0LlMKQEAgLTE1NSw3ICsxNTUsNyBAQAogCS8qIEluaXRpYWxpemUgc29tZSBTUFJzIHRoYXQgYXJlIGhhcmQgdG8gYWNjZXNzIGZyb20gQwkJCSovCiAJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotCWxpcyAgICAgcjMsIENGR19JTU1SQGggICAgICAgICAgCS8qIFBhc3MgSU1NUiBhcyBhcmcxIHRvIEMgcm91dGluZSAqLworCWxpcyAgICAgcjMsIENGR19JTU1SQGgJCQkvKiBQYXNzIElNTVIgYXMgYXJnMSB0byBDIHJvdXRpbmUgKi8KIAlsaXMJcjIsIENGR19JTklUX1NQX0FERFJAaAogCW9yaQlyMSwgcjIsIENGR19JTklUX1NQX0FERFJAbAkvKiBTZXQgdXAgdGhlIHN0YWNrIGluIGludGVybmFsIFNSQU0gKi8KIAkvKiBOb3RlOiBSMCBpcyBzdGlsbCAwIGhlcmUgKi8KQEAgLTIxMCw3ICsyMTAsNyBAQAogLyogQWxpZ25tZW50IGV4Y2VwdGlvbi4gKi8KIAkuID0gMHg2MDAKIEFsaWdubWVudDoKLQlFWENFUFRJT05fUFJPTE9HCisJRVhDRVBUSU9OX1BST0xPRyhTUlIwLCBTUlIxKQogCW1mc3ByCXI0LERBUgogCXN0dwlyNCxfREFSKHIyMSkKIAltZnNwcglyNSxEU0lTUgpAQCAtMjI4LDcgKzIyOCw3IEBACiAvKiBQcm9ncmFtIGNoZWNrIGV4Y2VwdGlvbiAqLwogCS4gPSAweDcwMAogUHJvZ3JhbUNoZWNrOgotCUVYQ0VQVElPTl9QUk9MT0cKKwlFWENFUFRJT05fUFJPTE9HKFNSUjAsIFNSUjEpCiAJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAogCWxpCXIyMCxNU1JfS0VSTkVMCiAJcmx3aW1pCXIyMCxyMjMsMCwxNiwxNgkJLyogY29weSBFRSBiaXQgZnJvbSBzYXZlZCBNU1IgKi8KZGlmZiAtLWdpdCBhL2NwdS9tcGM1eHgvdHJhcHMuYyBiL2NwdS9tcGM1eHgvdHJhcHMuYwppbmRleCAxNGZkNTllLi5kMjJiODlhIDEwMDY0NAotLS0gYS9jcHUvbXBjNXh4L3RyYXBzLmMKKysrIGIvY3B1L21wYzV4eC90cmFwcy5jCkBAIC0zNiwxMSArMzYsMTEgQEAKICNpbmNsdWRlIDxjb21tYW5kLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIGludCAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShzdHJ1Y3QgcHRfcmVncyAqKSA9IDA7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogZXh0ZXJuIHZvaWQgZG9fYmVkYnVnX2JyZWFrcG9pbnQoc3RydWN0IHB0X3JlZ3MgKik7CiAjZW5kaWYKIApAQCAtMTMxLDcgKzEzMSw3IEBACiAJCXJldHVybjsKIAl9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0xNjUsNyArMTY1LDcgQEAKICAqLwogdm9pZCBBbGlnbm1lbnRFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMTc5LDcgKzE3OSw3IEBACiAgKi8KIHZvaWQgUHJvZ3JhbUNoZWNrRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTE5Myw3ICsxOTMsNyBAQAogICovCiB2b2lkIFNvZnRFbXVFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMjA4LDcgKzIwOCw3IEBACiAgKi8KIHZvaWQgVW5rbm93bkV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0yMjQsNyArMjI0LDcgQEAKIHsKIAlwcmludGYoIkRlYnVnZ2VyIHRyYXAgYXQgQCAlbHhcbiIsIHJlZ3MtPm5pcCApOwogICAJc2hvd19yZWdzKHJlZ3MpOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogICAJZG9fYmVkYnVnX2JyZWFrcG9pbnQoIHJlZ3MgKTsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvY3B1L21wYzV4eC91LWJvb3QubGRzIGIvY3B1L21wYzV4eC91LWJvb3QubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMDAxYjEKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvbXBjNXh4L3UtYm9vdC5sZHMKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEJV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZQorICogKEMpIENvcHlyaWdodCAyMDAzCU1hcnRpbiBXaW5pc3RvZXJmZXIsIG1hcnRpbndpbmlzdG9lcmZlckBnbXguY2gKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfQVJDSChwb3dlcnBjKQorU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7CisvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPworICAgX19EWU5BTUlDID0gMDsgICAgKi8KK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9CisgIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQorICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQorICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQorICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9CisgIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9CisgIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KKyAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KKyAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9CisgIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KKyAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9CisgIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KKyAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQorICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQorICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9CisgIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9CisgIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQorICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9CisgIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQorICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9CisgIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9CisgIC5wbHQgOiB7ICooLnBsdCkgfQorICAudGV4dCAgICAgIDoKKyAgeworICAgIC8qIFdBUk5JTkcgLSB0aGUgZm9sbG93aW5nIGlzIGhhbmQtb3B0aW1pemVkIHRvIGZpdCB3aXRoaW4JKi8KKyAgICAvKiB0aGUgc2VjdG9yIGxheW91dCBvZiBvdXIgZmxhc2ggY2hpcHMhCVhYWCBGSVhNRSBYWFgJKi8KKworICAgIGNwdS9tcGM1eHgvc3RhcnQubwkoLnRleHQpCisKKyAgICAqKC50ZXh0KQorICAgICooLmdvdDEpCisgIH0KKyAgX2V0ZXh0ID0gLjsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICA6CisgIHsKKyAgICAqKC5yb2RhdGEpCisgICAgKigucm9kYXRhMSkKKyAgICAqKC5yb2RhdGEuc3RyMS40KQorICAgICooLmVoX2ZyYW1lKQorICB9CisgIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKKyAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQorICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9CisKKyAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCisgIC4gPSAoLiArIDB4MDBGRikgJiAweEZGRkZGRjAwOworICBfZXJvdGV4dCA9IC47CisgIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKKyAgLnJlbG9jICAgOgorICB7CisgICAgKiguZ290KQorICAgIF9HT1QyX1RBQkxFXyA9IC47CisgICAgKiguZ290MikKKyAgICBfRklYVVBfVEFCTEVfID0gLjsKKyAgICAqKC5maXh1cCkKKyAgfQorICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PjI7CisgIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXyk+PjI7CisKKyAgLmRhdGEgICAgOgorICB7CisgICAgKiguZGF0YSkKKyAgICAqKC5kYXRhMSkKKyAgICAqKC5zZGF0YSkKKyAgICAqKC5zZGF0YTIpCisgICAgKiguZHluYW1pYykKKyAgICBDT05TVFJVQ1RPUlMKKyAgfQorICBfZWRhdGEgID0gIC47CisgIFBST1ZJREUgKGVkYXRhID0gLik7CisKKyAgLiA9IC47CisgIF9fdV9ib290X2NtZF9zdGFydCA9IC47CisgIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9CisgIF9fdV9ib290X2NtZF9lbmQgPSAuOworCisKKyAgLiA9IC47CisgIF9fc3RhcnRfX19leF90YWJsZSA9IC47CisgIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQorICBfX3N0b3BfX19leF90YWJsZSA9IC47CisKKyAgLiA9IEFMSUdOKDI1Nik7CisgIF9faW5pdF9iZWdpbiA9IC47CisgIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQorICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KKyAgLiA9IEFMSUdOKDI1Nik7CisgIF9faW5pdF9lbmQgPSAuOworCisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICA6CisgIHsKKyAgICooLnNic3MpICooLnNjb21tb24pCisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgfQorCisgIF9lbmQgPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7CisvKiAgIC4gPSBlbnZfc3RhcnQ7CisJLnBwY2Vudgk6CisJeworCQljb21tb24vZW52aXJvbm1lbnQubyAoLnBwY2VudikKKwl9CisqLworfQpkaWZmIC0tZ2l0IGEvY3B1L21wYzV4eHgvTWFrZWZpbGUgYi9jcHUvbXBjNXh4eC9NYWtlZmlsZQppbmRleCAyMzVhZGI3Li4zMTJiMGJmIDEwMDY0NAotLS0gYS9jcHUvbXBjNXh4eC9NYWtlZmlsZQorKysgYi9jcHUvbXBjNXh4eC9NYWtlZmlsZQpAQCAtMjgsNyArMjgsNyBAQAogU1RBUlQJPSBzdGFydC5vCiBTT0JKUwk9IGlvLm8gZmlybXdhcmVfc2NfdGFza19iZXN0Y29tbS5pbXBsLm8gZmlybXdhcmVfc2NfdGFzay5pbXBsLm8KIENPQkpTCT0gaTJjLm8gdHJhcHMubyBjcHUubyBjcHVfaW5pdC5vIGZlYy5vIGlkZS5vIGludGVycnVwdHMubyBcCi0JICBsb2FkdGFzay5vIHBjaV9tcGM1MjAwLm8gc2VyaWFsLm8gc3BlZWQubyB1c2Jfb2hjaS5vCisJICBsb2FkdGFzay5vIHBjaV9tcGM1MjAwLm8gc2VyaWFsLm8gc3BlZWQubyB1c2Jfb2hjaS5vIHVzYi5vCiAKIFNSQ1MJOj0gJChTVEFSVDoubz0uUykgJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKIE9CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlMpICQoQ09CSlMpKQpkaWZmIC0tZ2l0IGEvY3B1L21wYzV4eHgvY29uZmlnLm1rIGIvY3B1L21wYzV4eHgvY29uZmlnLm1rCmluZGV4IGVjZDk0ZTkuLjBlODYxYzQgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM1eHh4L2NvbmZpZy5taworKysgYi9jcHUvbXBjNXh4eC9jb25maWcubWsKQEAgLTIxLDcgKzIxLDEwIEBACiAjIE1BIDAyMTExLTEzMDcgVVNBCiAjCiAKLVBMQVRGT1JNX1JFTEZMQUdTICs9IC1mUElDIC1mZml4ZWQtcjE0IC1tZWFiaQorUExBVEZPUk1fUkVMRkxBR1MgKz0gLWZQSUMgLWZmaXhlZC1yMTQgLW1lYWJpIC1tcmVsb2NhdGFibGUKIAogUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURDT05GSUdfTVBDNXh4eCAtZmZpeGVkLXIyIC1mZml4ZWQtcjI5IFwKIAkJICAgICAtbXN0cmluZyAtbWNwdT02MDNlIC1tbXVsdGlwbGUKKworIyBVc2UgZGVmYXVsdCBsaW5rZXIgc2NyaXB0LiAgQm9hcmQgcG9ydCBjYW4gb3ZlcnJpZGUgaW4gYm9hcmQvKi9jb25maWcubWsKK0xEU0NSSVBUIDo9ICQoU1JDVFJFRSkvY3B1L21wYzV4eHgvdS1ib290LmxkcwpkaWZmIC0tZ2l0IGEvY3B1L21wYzV4eHgvY3B1X2luaXQuYyBiL2NwdS9tcGM1eHh4L2NwdV9pbml0LmMKaW5kZXggZDc0NDAzMC4uYmM2MjAxZSAxMDA2NDQKLS0tIGEvY3B1L21wYzV4eHgvY3B1X2luaXQuYworKysgYi9jcHUvbXBjNXh4eC9jcHVfaW5pdC5jCkBAIC0xOTgsNyArMTk4LDcgQEAKIAkvKiByb3V0ZSBjcml0aWNhbCBpbnRzIHRvIG5vcm1hbCBpbnRzICovCiAJKih2dV9sb25nICopTVBDNVhYWF9JQ1RMX0VYVCB8PSAweDAwMDAwMDAxOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19NUEM1eHh4X0ZFQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19NUEM1eHh4X0ZFQykKIAkvKiBsb2FkIEZFQyBtaWNyb2NvZGUgKi8KIAlsb2FkdGFzaygwLCAyKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L21wYzV4eHgvZmVjLmMgYi9jcHUvbXBjNXh4eC9mZWMuYwppbmRleCA4MTM2MzY2Li4xZDNkYTc3IDEwMDY0NAotLS0gYS9jcHUvbXBjNXh4eC9mZWMuYworKysgYi9jcHUvbXBjNXh4eC9mZWMuYwpAQCAtMTgsMTAgKzE4LDEwIEBACiAKIC8qICNkZWZpbmUgREVCVUcJMHgyOCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIFwKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIFwKIAlkZWZpbmVkKENPTkZJR19NUEM1eHh4X0ZFQykKIAotI2lmICEoZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpKQorI2lmICEoZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKSkKICNlcnJvciAiQ09ORklHX01JSSBoYXMgdG8gYmUgZGVmaW5lZCEiCiAjZW5kaWYKIApAQCAtODg5LDEzICs4ODksMjAgQEAKIAlmZWMtPmV0aCA9IChldGhlcm5ldF9yZWdzICopTVBDNVhYWF9GRUM7CiAJZmVjLT50YmRCYXNlID0gKEZFQ19UQkQgKilGRUNfQkRfQkFTRTsKIAlmZWMtPnJiZEJhc2UgPSAoRkVDX1JCRCAqKShGRUNfQkRfQkFTRSArIEZFQ19UQkRfTlVNICogc2l6ZW9mKEZFQ19UQkQpKTsKLSNpZiBkZWZpbmVkKENPTkZJR19DQU5NQikgICAgfHwgZGVmaW5lZChDT05GSUdfSE1JMTAwMSkJfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0lDRUNVQkUpICB8fCBkZWZpbmVkKENPTkZJR19JTktBNFgwKQl8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfSlVQSVRFUikgIHx8IGRlZmluZWQoQ09ORklHX01DQzIwMCkJfHwgXAotICAgIGRlZmluZWQoQ09ORklHX01PVElPTlBSTyl8fCBkZWZpbmVkKENPTkZJR19PMkROVCkJfHwgXAotICAgIGRlZmluZWQoQ09ORklHX1BNNTIwKSAgICB8fCBkZWZpbmVkKENPTkZJR19UT1A1MjAwKQl8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfVFFNNTIwMCkgIHx8IGRlZmluZWQoQ09ORklHX1VDMTAxKQl8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfVjM4QikKKyNpZiBkZWZpbmVkKENPTkZJR19DQU5NQikJCXx8IFwKKwlkZWZpbmVkKENPTkZJR19DTTUyMDApCQl8fCBcCisJZGVmaW5lZChDT05GSUdfSE1JMTAwMSkJCXx8IFwKKwlkZWZpbmVkKENPTkZJR19JQ0VDVUJFKQkJfHwgXAorCWRlZmluZWQoQ09ORklHX0lOS0E0WDApCQl8fCBcCisJZGVmaW5lZChDT05GSUdfSlVQSVRFUikJCXx8IFwKKwlkZWZpbmVkKENPTkZJR19NQ0MyMDApCQl8fCBcCisJZGVmaW5lZChDT05GSUdfTU9USU9OUFJPKQl8fCBcCisJZGVmaW5lZChDT05GSUdfTzJETlQpCQl8fCBcCisJZGVmaW5lZChDT05GSUdfUE01MjApCQl8fCBcCisJZGVmaW5lZChDT05GSUdfVE9QNTIwMCkJCXx8IFwKKwlkZWZpbmVkKENPTkZJR19UUU01MjAwKQkJfHwgXAorCWRlZmluZWQoQ09ORklHX1VDMTAxKQkJfHwgXAorCWRlZmluZWQoQ09ORklHX1YzOEIpCiAjIGlmbmRlZiBDT05GSUdfRkVDXzEwTUJJVAogCWZlYy0+eGN2X3R5cGUgPSBNSUkxMDA7CiAjIGVsc2UKQEAgLTkxNyw3ICs5MjQsNyBAQAogCXNwcmludGYoZGV2LT5uYW1lLCAiRkVDIEVUSEVSTkVUIik7CiAJZXRoX3JlZ2lzdGVyKGRldik7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCiAJbWlpcGh5X3JlZ2lzdGVyIChkZXYtPm5hbWUsCiAJCQlmZWM1eHh4X21paXBoeV9yZWFkLCBmZWM1eHh4X21paXBoeV93cml0ZSk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9tcGM1eHh4L2lkZS5jIGIvY3B1L21wYzV4eHgvaWRlLmMKaW5kZXggMjliOTlmNi4uMDg3ZGRhYyAxMDA2NDQKLS0tIGEvY3B1L21wYzV4eHgvaWRlLmMKKysrIGIvY3B1L21wYzV4eHgvaWRlLmMKQEAgLTI0LDcgKzI0LDcgQEAKICAqLwogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWZkZWYgQ0ZHX0NNRF9JREUKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKQogI2luY2x1ZGUgPG1wYzV4eHguaD4KIAogREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CkBAIC04NSw0ICs4NSw0IEBACiAKIAlyZXR1cm4gKDApOwogfQotI2VuZGlmIC8qIENGR19DTURfSURFICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9tcGM1eHh4L2ludGVycnVwdHMuYyBiL2NwdS9tcGM1eHh4L2ludGVycnVwdHMuYwppbmRleCBiZWViMjIyLi44ODE2ZGQxIDEwMDY0NAotLS0gYS9jcHUvbXBjNXh4eC9pbnRlcnJ1cHRzLmMKKysrIGIvY3B1L21wYzV4eHgvaW50ZXJydXB0cy5jCkBAIC0zMTAsNyArMzEwLDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JUlEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lSUSkKIHZvaWQgZG9faXJxaW5mbyhjbWRfdGJsX3QgKiBjbWR0cCwgYmRfdCAqIGJkLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKIAlpbnQgaXJxLCByZV9lbmFibGU7CmRpZmYgLS1naXQgYS9jcHUvbXBjNXh4eC9zdGFydC5TIGIvY3B1L21wYzV4eHgvc3RhcnQuUwppbmRleCAzOTM2YjU1Li45YjFiZDQ4IDEwMDY0NAotLS0gYS9jcHUvbXBjNXh4eC9zdGFydC5TCisrKyBiL2NwdS9tcGM1eHh4L3N0YXJ0LlMKQEAgLTIwOCw3ICsyMDgsNyBAQAogLyogQWxpZ25tZW50IGV4Y2VwdGlvbi4gKi8KIAkuID0gMHg2MDAKIEFsaWdubWVudDoKLQlFWENFUFRJT05fUFJPTE9HCisJRVhDRVBUSU9OX1BST0xPRyhTUlIwLCBTUlIxKQogCW1mc3ByCXI0LERBUgogCXN0dwlyNCxfREFSKHIyMSkKIAltZnNwcglyNSxEU0lTUgpAQCAtMjI3LDcgKzIyNyw3IEBACiAvKiBQcm9ncmFtIGNoZWNrIGV4Y2VwdGlvbiAqLwogCS4gPSAweDcwMAogUHJvZ3JhbUNoZWNrOgotCUVYQ0VQVElPTl9QUk9MT0cKKwlFWENFUFRJT05fUFJPTE9HKFNSUjAsIFNSUjEpCiAJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAogCWxpCXIyMCxNU1JfS0VSTkVMCiAJcmx3aW1pCXIyMCxyMjMsMCwxNiwxNgkJLyogY29weSBFRSBiaXQgZnJvbSBzYXZlZCBNU1IgKi8KZGlmZiAtLWdpdCBhL2NwdS9tcGM1eHh4L3RyYXBzLmMgYi9jcHUvbXBjNXh4eC90cmFwcy5jCmluZGV4IDJlZTc4MmIuLmRhYTFlYzYgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM1eHh4L3RyYXBzLmMKKysrIGIvY3B1L21wYzV4eHgvdHJhcHMuYwpAQCAtMzcsNyArMzcsNyBAQAogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogaW50ICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHN0cnVjdCBwdF9yZWdzICopID0gMDsKICNlbmRpZgogCkBAIC0xMjMsNyArMTIzLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTE1OCw3ICsxNTgsNyBAQAogdm9pZAogQWxpZ25tZW50RXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTE3MCw3ICsxNzAsNyBAQAogdm9pZAogUHJvZ3JhbUNoZWNrRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTE4Miw3ICsxODIsNyBAQAogdm9pZAogU29mdEVtdUV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0xOTUsNyArMTk1LDcgQEAKIHZvaWQKIFVua25vd25FeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMjA0LDcgKzIwNCw3IEBACiAJX2V4Y2VwdGlvbigwLCByZWdzKTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogZXh0ZXJuIHZvaWQgZG9fYmVkYnVnX2JyZWFrcG9pbnQoc3RydWN0IHB0X3JlZ3MgKik7CiAjZW5kaWYKIApAQCAtMjE0LDcgKzIxNCw3IEBACiAKICAgcHJpbnRmKCJEZWJ1Z2dlciB0cmFwIGF0IEAgJWx4XG4iLCByZWdzLT5uaXAgKTsKICAgc2hvd19yZWdzKHJlZ3MpOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogICBkb19iZWRidWdfYnJlYWtwb2ludCggcmVncyApOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9jcHUvbXBjNXh4eC91LWJvb3QtY3VzdG9tbGF5b3V0LmxkcyBiL2NwdS9tcGM1eHh4L3UtYm9vdC1jdXN0b21sYXlvdXQubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMDc5NDMKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvbXBjNXh4eC91LWJvb3QtY3VzdG9tbGF5b3V0LmxkcwpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMy0yMDA0CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9BUkNIKHBvd2VycGMpCitTRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKKy8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/CisgICBfX0RZTkFNSUMgPSAwOyAgICAqLworU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KKyAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9CisgIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9CisgIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9CisgIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KKyAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KKyAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQorICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQorICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KKyAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQorICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KKyAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQorICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9CisgIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9CisgIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KKyAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KKyAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9CisgIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KKyAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9CisgIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KKyAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KKyAgLnBsdCA6IHsgKigucGx0KSB9CisgIC50ZXh0ICAgICAgOgorICB7CisgICAgLyogV0FSTklORyAtIHRoZSBmb2xsb3dpbmcgaXMgaGFuZC1vcHRpbWl6ZWQgdG8gZml0IHdpdGhpbiAgKi8KKyAgICAvKiB0aGUgc2VjdG9yIGxheW91dCBvZiBvdXIgZmxhc2ggY2hpcHMhICAgIFhYWCBGSVhNRSBYWFggICAqLworCisgICAgY3B1L21wYzV4eHgvc3RhcnQubyAgICAgICAgICAoLnRleHQpCisgICAgY3B1L21wYzV4eHgvdHJhcHMubyAgICAgICAgICAoLnRleHQpCisgICAgbGliX2dlbmVyaWMvY3JjMzIubyAgICAgICAgICgudGV4dCkKKyAgICBsaWJfcHBjL2NhY2hlLm8gICAgICAgICAgICAgKC50ZXh0KQorICAgIGxpYl9wcGMvdGltZS5vICAgICAgICAgICAgICAoLnRleHQpCisKKyAgICAuID0gREVGSU5FRChlbnZfb2Zmc2V0KSA/IGVudl9vZmZzZXQgOiAuOworICAgIGNvbW1vbi9lbnZpcm9ubWVudC5vICAgICAgICAoLnBwY2VudikKKworICAgICooLnRleHQpCisgICAgKiguZ290MSkKKyAgICAuID0gQUxJR04oMTYpOworICAgICooLnJvZGF0YSkKKyAgICAqKC5yb2RhdGExKQorICAgICooLnJvZGF0YS5zdHIxLjQpCisgICAgKiguZWhfZnJhbWUpCisgIH0KKyAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAorICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9CisgIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KKworICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KKyAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7CisgIF9lcm90ZXh0ID0gLjsKKyAgUFJPVklERSAoZXJvdGV4dCA9IC4pOworICAucmVsb2MgICA6CisgIHsKKyAgICAqKC5nb3QpCisgICAgX0dPVDJfVEFCTEVfID0gLjsKKyAgICAqKC5nb3QyKQorICAgIF9GSVhVUF9UQUJMRV8gPSAuOworICAgICooLmZpeHVwKQorICB9CisgIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7CisgIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKKworICAuZGF0YSAgICA6CisgIHsKKyAgICAqKC5kYXRhKQorICAgICooLmRhdGExKQorICAgICooLnNkYXRhKQorICAgICooLnNkYXRhMikKKyAgICAqKC5keW5hbWljKQorICAgIENPTlNUUlVDVE9SUworICB9CisgIF9lZGF0YSAgPSAgLjsKKyAgUFJPVklERSAoZWRhdGEgPSAuKTsKKworICAuID0gLjsKKyAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKKyAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KKyAgX191X2Jvb3RfY21kX2VuZCA9IC47CisKKworICAuID0gLjsKKyAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKKyAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9CisgIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKKworICAuID0gQUxJR04oNDA5Nik7CisgIF9faW5pdF9iZWdpbiA9IC47CisgIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQorICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRfZW5kID0gLjsKKworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgOgorICB7CisgICAqKC5zYnNzKSAqKC5zY29tbW9uKQorICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgIH0KKyAgX2VuZCA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKK30KZGlmZiAtLWdpdCBhL2NwdS9tcGM1eHh4L3UtYm9vdC5sZHMgYi9jcHUvbXBjNXh4eC91LWJvb3QubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyOGEzYWYKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvbXBjNXh4eC91LWJvb3QubGRzCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAzLTIwMDcKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0FSQ0gocG93ZXJwYykKK1NFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOworLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KKyAgIF9fRFlOQU1JQyA9IDA7ICAgICovCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9ICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQorICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KKyAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KKyAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KKyAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQorICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQorICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9CisgIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9CisgIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQorICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9CisgIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQorICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9CisgIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KKyAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KKyAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQorICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQorICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KKyAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQorICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KKyAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQorICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQorICAucGx0IDogeyAqKC5wbHQpIH0KKyAgLnRleHQgICAgICA6CisgIHsKKyAgICBjcHUvbXBjNXh4eC9zdGFydC5vCSgudGV4dCkKKyAgICAqKC50ZXh0KQorICAgICooLmdvdDEpCisgICAgLiA9IEFMSUdOKDE2KTsKKyAgICAqKC5yb2RhdGEpCisgICAgKigucm9kYXRhMSkKKyAgICAqKC5yb2RhdGEuc3RyMS40KQorICAgICooLmVoX2ZyYW1lKQorICB9CisgIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKKyAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQorICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9CisKKyAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCisgIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOworICBfZXJvdGV4dCA9IC47CisgIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKKyAgLnJlbG9jICAgOgorICB7CisgICAgKiguZ290KQorICAgIF9HT1QyX1RBQkxFXyA9IC47CisgICAgKiguZ290MikKKyAgICBfRklYVVBfVEFCTEVfID0gLjsKKyAgICAqKC5maXh1cCkKKyAgfQorICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOworICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7CisKKyAgLmRhdGEgICAgOgorICB7CisgICAgKiguZGF0YSkKKyAgICAqKC5kYXRhMSkKKyAgICAqKC5zZGF0YSkKKyAgICAqKC5zZGF0YTIpCisgICAgKiguZHluYW1pYykKKyAgICBDT05TVFJVQ1RPUlMKKyAgfQorICBfZWRhdGEgID0gIC47CisgIFBST1ZJREUgKGVkYXRhID0gLik7CisKKyAgLiA9IC47CisgIF9fdV9ib290X2NtZF9zdGFydCA9IC47CisgIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9CisgIF9fdV9ib290X2NtZF9lbmQgPSAuOworCisKKyAgLiA9IC47CisgIF9fc3RhcnRfX19leF90YWJsZSA9IC47CisgIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQorICBfX3N0b3BfX19leF90YWJsZSA9IC47CisKKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRfYmVnaW4gPSAuOworICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KKyAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19pbml0X2VuZCA9IC47CisKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgIDoKKyAgeworICAgKiguc2JzcykgKiguc2NvbW1vbikKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICB9CisgIF9lbmQgPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7Cit9CmRpZmYgLS1naXQgYS9jcHUvbXBjNXh4eC91c2IuYyBiL2NwdS9tcGM1eHh4L3VzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNzA5ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvbXBjNXh4eC91c2IuYwpAQCAtMCwwICsxLDU0IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA3CisgKiBNYXJrdXMgS2xvdHpidWVjaGVyLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nIDxta0BkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmIGRlZmluZWQoQ09ORklHX1VTQl9PSENJX05FVykgJiYgZGVmaW5lZChDRkdfVVNCX09IQ0lfQ1BVX0lOSVQpCisKKyNpbmNsdWRlIDxtcGM1eHh4Lmg+CisKK2ludCB1c2JfY3B1X2luaXQoKQoreworCS8qIFNldCB0aGUgVVNCIENsb2NrCQkJCQkJICAgICAqLworCSoodnVfbG9uZyAqKU1QQzVYWFhfQ0RNXzQ4X0ZEQyA9IENPTkZJR19VU0JfQ0xPQ0s7CisKKwkvKiByZW1vdmUgYWxsIFVTQiBiaXRzIGZpcnN0IGJlZm9yZSBPUmluZyBpbiBvdXJzICovCisJKih2dV9sb25nICopTVBDNVhYWF9HUFNfUE9SVF9DT05GSUcgJj0gfjB4MDA4MDcwMDA7CisKKwkvKiBBY3RpdmF0ZSBVU0IgcG9ydAkJCQkJCSAgICAgKi8KKwkqKHZ1X2xvbmcgKilNUEM1WFhYX0dQU19QT1JUX0NPTkZJRyB8PSBDT05GSUdfVVNCX0NPTkZJRzsKKworCXJldHVybiAwOworfQorCitpbnQgdXNiX2NwdV9zdG9wKCkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYl9jcHVfaW5pdF9mYWlsKCkKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1VTQl9PSENJKSAmJiBkZWZpbmVkKENGR19VU0JfT0hDSV9DUFVfSU5JVCkgKi8KZGlmZiAtLWdpdCBhL2NwdS9tcGM4MjIwL2NvbmZpZy5tayBiL2NwdS9tcGM4MjIwL2NvbmZpZy5tawppbmRleCA2ZmVjNWRmLi5jNDFjYWZlIDEwMDY0NAotLS0gYS9jcHUvbXBjODIyMC9jb25maWcubWsKKysrIGIvY3B1L21wYzgyMjAvY29uZmlnLm1rCkBAIC0yMSw3ICsyMSwxMCBAQAogIyBNQSAwMjExMS0xMzA3IFVTQQogIwogCi1QTEFURk9STV9SRUxGTEFHUyArPSAtZlBJQyAtZmZpeGVkLXIxNCAtbWVhYmkKK1BMQVRGT1JNX1JFTEZMQUdTICs9IC1mUElDIC1mZml4ZWQtcjE0IC1tZWFiaSAtbXJlbG9jYXRhYmxlCiAKIFBMQVRGT1JNX0NQUEZMQUdTICs9IC1EQ09ORklHX01QQzgyMjAgLWZmaXhlZC1yMiAtZmZpeGVkLXIyOSBcCiAJCSAgICAgLW1zdHJpbmcgLW1jcHU9NjAzZSAtbW11bHRpcGxlCisKKyMgVXNlIGRlZmF1bHQgbGlua2VyIHNjcmlwdC4gIEJvYXJkIHBvcnQgY2FuIG92ZXJyaWRlIGluIGJvYXJkLyovY29uZmlnLm1rCitMRFNDUklQVCA6PSAkKFNSQ1RSRUUpL2NwdS9tcGM4MjIwL3UtYm9vdC5sZHMKZGlmZiAtLWdpdCBhL2NwdS9tcGM4MjIwL2NwdV9pbml0LmMgYi9jcHUvbXBjODIyMC9jcHVfaW5pdC5jCmluZGV4IDNjZjVmNjYuLjBkYWFjNWIgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4MjIwL2NwdV9pbml0LmMKKysrIGIvY3B1L21wYzgyMjAvY3B1X2luaXQuYwpAQCAtMTI4LDcgKzEyOCw3IEBACiAJLyogcm91dGUgY3JpdGljYWwgaW50cyB0byBub3JtYWwgaW50cyAqLwogCSoodnVfbG9uZyAqKSAweGYwMDAwNzEwIHw9IDB4MDAwMDAwMDE7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX01QQzgyMjBfRkVDKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX01QQzgyMjBfRkVDKQogCS8qIGxvYWQgRkVDIG1pY3JvY29kZSAqLwogCWxvYWR0YXNrICgwLCAyKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L21wYzgyMjAvZmVjLmMgYi9jcHUvbXBjODIyMC9mZWMuYwppbmRleCAxMjAxZTc5Li45OTJlMGZmIDEwMDY0NAotLS0gYS9jcHUvbXBjODIyMC9mZWMuYworKysgYi9jcHUvbXBjODIyMC9mZWMuYwpAQCAtMTUsMTAgKzE1LDEwIEBACiAjaW5jbHVkZSAiZmVjLmgiCiAKICN1bmRlZiAgREVCVUcKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgJiYgXAorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgJiYgXAogICAgIGRlZmluZWQoQ09ORklHX01QQzgyMjBfRkVDKQogCi0jaWYgIShkZWZpbmVkKENPTkZJR19NSUkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkpCisjaWYgIShkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpKQogI2Vycm9yICJDT05GSUdfTUlJIGhhcyB0byBiZSBkZWZpbmVkISIKICNlbmRpZgogCkBAIC04NDcsNyArODQ3LDcgQEAKIAlzcHJpbnRmIChkZXYtPm5hbWUsICJGRUMgRVRIRVJORVQiKTsKIAlldGhfcmVnaXN0ZXIgKGRldik7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCiAJbWlpcGh5X3JlZ2lzdGVyIChkZXYtPm5hbWUsCiAJCQlmZWM4MjIwX21paXBoeV9yZWFkLCBmZWM4MjIwX21paXBoeV93cml0ZSk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9tcGM4MjIwL3N0YXJ0LlMgYi9jcHUvbXBjODIyMC9zdGFydC5TCmluZGV4IDUyMzMyMDIuLmI1MTQ1Y2EgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4MjIwL3N0YXJ0LlMKKysrIGIvY3B1L21wYzgyMjAvc3RhcnQuUwpAQCAtMTY5LDcgKzE2OSw3IEBACiAvKiBBbGlnbm1lbnQgZXhjZXB0aW9uLiAqLwogCS4gPSAweDYwMAogQWxpZ25tZW50OgotCUVYQ0VQVElPTl9QUk9MT0cKKwlFWENFUFRJT05fUFJPTE9HKFNSUjAsIFNSUjEpCiAJbWZzcHIJcjQsREFSCiAJc3R3CXI0LF9EQVIocjIxKQogCW1mc3ByCXI1LERTSVNSCkBAIC0xODgsNyArMTg4LDcgQEAKIC8qIFByb2dyYW0gY2hlY2sgZXhjZXB0aW9uICovCiAJLiA9IDB4NzAwCiBQcm9ncmFtQ2hlY2s6Ci0JRVhDRVBUSU9OX1BST0xPRworCUVYQ0VQVElPTl9QUk9MT0coU1JSMCwgU1JSMSkKIAlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECiAJbGkJcjIwLE1TUl9LRVJORUwKIAlybHdpbWkJcjIwLHIyMywwLDE2LDE2CSAgICAvKiBjb3B5IEVFIGJpdCBmcm9tIHNhdmVkIE1TUiAqLwpkaWZmIC0tZ2l0IGEvY3B1L21wYzgyMjAvdHJhcHMuYyBiL2NwdS9tcGM4MjIwL3RyYXBzLmMKaW5kZXggY2RlZTJiZS4uODljY2ExZCAxMDA2NDQKLS0tIGEvY3B1L21wYzgyMjAvdHJhcHMuYworKysgYi9jcHUvbXBjODIyMC90cmFwcy5jCkBAIC0zNyw3ICszNyw3IEBACiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiBpbnQgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikgKHN0cnVjdCBwdF9yZWdzICopID0gMDsKICNlbmRpZgogCkBAIC0xMTgsNyArMTE4LDcgQEAKIAkJcmVncy0+bmlwID0gZml4dXA7CiAJCXJldHVybjsKIAl9Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIKIAkgICAgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikgKHJlZ3MpKQogCQlyZXR1cm47CkBAIC0xNTIsNyArMTUyLDcgQEAKIAogdm9pZCBBbGlnbm1lbnRFeGNlcHRpb24gKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyCiAJICAgICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpIChyZWdzKSkKIAkJcmV0dXJuOwpAQCAtMTY0LDcgKzE2NCw3IEBACiAKIHZvaWQgUHJvZ3JhbUNoZWNrRXhjZXB0aW9uIChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcgogCSAgICAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKSAocmVncykpCiAJCXJldHVybjsKQEAgLTE3Niw3ICsxNzYsNyBAQAogCiB2b2lkIFNvZnRFbXVFeGNlcHRpb24gKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyCiAJICAgICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpIChyZWdzKSkKIAkJcmV0dXJuOwpAQCAtMTg5LDcgKzE4OSw3IEBACiAKIHZvaWQgVW5rbm93bkV4Y2VwdGlvbiAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIKIAkgICAgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikgKHJlZ3MpKQogCQlyZXR1cm47CkBAIC0xOTksNyArMTk5LDcgQEAKIAlfZXhjZXB0aW9uICgwLCByZWdzKTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogZXh0ZXJuIHZvaWQgZG9fYmVkYnVnX2JyZWFrcG9pbnQgKHN0cnVjdCBwdF9yZWdzICopOwogI2VuZGlmCiAKQEAgLTIwOCw3ICsyMDgsNyBAQAogCiAJcHJpbnRmICgiRGVidWdnZXIgdHJhcCBhdCBAICVseFxuIiwgcmVncy0+bmlwKTsKIAlzaG93X3JlZ3MgKHJlZ3MpOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogCWRvX2JlZGJ1Z19icmVha3BvaW50IChyZWdzKTsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvY3B1L21wYzgyMjAvdS1ib290LmxkcyBiL2NwdS9tcGM4MjIwL3UtYm9vdC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE5OWE2NAotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9tcGM4MjIwL3UtYm9vdC5sZHMKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfQVJDSChwb3dlcnBjKQorU0VBUkNIX0RJUigvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hbnktZWxmL2xpYik7CisvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPworICAgX19EWU5BTUlDID0gMDsgICAgKi8KK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9CisgIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQorICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQorICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQorICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9CisgIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpIAl9CisgIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KKyAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkgCX0KKyAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpIAl9CisgIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkgCX0KKyAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9CisgIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KKyAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQorICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQorICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9CisgIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9CisgIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQorICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9CisgIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQorICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9CisgIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9CisgIC5wbHQgOiB7ICooLnBsdCkgfQorICAudGV4dCAgICAgIDoKKyAgeworICAgIGNwdS9tcGM4MjIwL3N0YXJ0Lm8JKC50ZXh0KQorICAgICooLnRleHQpCisgICAgKiguZ290MSkKKyAgICAuID0gQUxJR04oMTYpOworICAgICooLnJvZGF0YSkKKyAgICAqKC5yb2RhdGExKQorICAgICooLnJvZGF0YS5zdHIxLjQpCisgICAgKiguZWhfZnJhbWUpCisgIH0KKyAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAorICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9CisgIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KKworICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KKyAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7CisgIF9lcm90ZXh0ID0gLjsKKyAgUFJPVklERSAoZXJvdGV4dCA9IC4pOworICAucmVsb2MgICA6CisgIHsKKyAgICAqKC5nb3QpCisgICAgX0dPVDJfVEFCTEVfID0gLjsKKyAgICAqKC5nb3QyKQorICAgIF9GSVhVUF9UQUJMRV8gPSAuOworICAgICooLmZpeHVwKQorICB9CisgIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7CisgIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKKworICAuZGF0YSAgICA6CisgIHsKKyAgICAqKC5kYXRhKQorICAgICooLmRhdGExKQorICAgICooLnNkYXRhKQorICAgICooLnNkYXRhMikKKyAgICAqKC5keW5hbWljKQorICAgIENPTlNUUlVDVE9SUworICB9CisgIF9lZGF0YSAgPSAgLjsKKyAgUFJPVklERSAoZWRhdGEgPSAuKTsKKworICAuID0gLjsKKyAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKKyAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KKyAgX191X2Jvb3RfY21kX2VuZCA9IC47CisKKworICAuID0gLjsKKyAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKKyAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9CisgIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKKworICAuID0gQUxJR04oNDA5Nik7CisgIF9faW5pdF9iZWdpbiA9IC47CisgIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQorICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRfZW5kID0gLjsKKworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgOgorICB7CisgICAqKC5zYnNzKSAqKC5zY29tbW9uKQorICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgIH0KKyAgX2VuZCA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKK30KZGlmZiAtLWdpdCBhL2NwdS9tcGM4MjR4L2NvbmZpZy5tayBiL2NwdS9tcGM4MjR4L2NvbmZpZy5tawppbmRleCBkYWM2MWQ4Li4xN2ZkYjIxIDEwMDY0NAotLS0gYS9jcHUvbXBjODI0eC9jb25maWcubWsKKysrIGIvY3B1L21wYzgyNHgvY29uZmlnLm1rCkBAIC0yMSw2ICsyMSw5IEBACiAjIE1BIDAyMTExLTEzMDcgVVNBCiAjCiAKLVBMQVRGT1JNX1JFTEZMQUdTICs9IC1mUElDIC1mZml4ZWQtcjE0IC1tZWFiaSAtZm5vLXN0cmljdC1hbGlhc2luZworUExBVEZPUk1fUkVMRkxBR1MgKz0gLWZQSUMgLWZmaXhlZC1yMTQgLW1lYWJpIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1tcmVsb2NhdGFibGUKIAogUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURDT05GSUdfTVBDODI0WCAtZmZpeGVkLXIyIC1mZml4ZWQtcjI5IC1tc3RyaW5nIC1tY3B1PTYwM2UgLW1zb2Z0LWZsb2F0CisKKyMgVXNlIGRlZmF1bHQgbGlua2VyIHNjcmlwdC4gIEJvYXJkIHBvcnQgY2FuIG92ZXJyaWRlIGluIGJvYXJkLyovY29uZmlnLm1rCitMRFNDUklQVCA6PSAkKFNSQ1RSRUUpL2NwdS9tcGM4MjR4L3UtYm9vdC5sZHMKZGlmZiAtLWdpdCBhL2NwdS9tcGM4MjR4L3N0YXJ0LlMgYi9jcHUvbXBjODI0eC9zdGFydC5TCmluZGV4IDlmZjA1MmMuLjc4NGVkYzMgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4MjR4L3N0YXJ0LlMKKysrIGIvY3B1L21wYzgyNHgvc3RhcnQuUwpAQCAtMjIwLDcgKzIyMCw3IEBACiAvKiBBbGlnbm1lbnQgZXhjZXB0aW9uLiAqLwogCS4gPSBFWENfT0ZGX0FMSUdOCiBBbGlnbm1lbnQ6Ci0JRVhDRVBUSU9OX1BST0xPRworCUVYQ0VQVElPTl9QUk9MT0coU1JSMCwgU1JSMSkKIAltZnNwcglyNCxEQVIKIAlzdHcJcjQsX0RBUihyMjEpCiAJbWZzcHIJcjUsRFNJU1IKQEAgLTIzOCw3ICsyMzgsNyBAQAogLyogUHJvZ3JhbSBjaGVjayBleGNlcHRpb24gKi8KIAkuID0gRVhDX09GRl9QUk9HUkFNCiBQcm9ncmFtQ2hlY2s6Ci0JRVhDRVBUSU9OX1BST0xPRworCUVYQ0VQVElPTl9QUk9MT0coU1JSMCwgU1JSMSkKIAlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECiAJbGkJcjIwLE1TUl9LRVJORUwKIAlybHdpbWkJcjIwLHIyMywwLDE2LDE2CQkvKiBjb3B5IEVFIGJpdCBmcm9tIHNhdmVkIE1TUiAqLwpkaWZmIC0tZ2l0IGEvY3B1L21wYzgyNHgvdHJhcHMuYyBiL2NwdS9tcGM4MjR4L3RyYXBzLmMKaW5kZXggMDcxZDAwMy4uMGE3MjQzMCAxMDA2NDQKLS0tIGEvY3B1L21wYzgyNHgvdHJhcHMuYworKysgYi9jcHUvbXBjODI0eC90cmFwcy5jCkBAIC0xNzUsNyArMTc1LDcgQEAKIAlfZXhjZXB0aW9uKDAsIHJlZ3MpOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQkVEQlVHKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCiBleHRlcm4gdm9pZCBkb19iZWRidWdfYnJlYWtwb2ludChzdHJ1Y3QgcHRfcmVncyAqKTsKICNlbmRpZgogCkBAIC0xODUsNyArMTg1LDcgQEAKIAogICBwcmludGYoIkRlYnVnZ2VyIHRyYXAgYXQgQCAlbHhcbiIsIHJlZ3MtPm5pcCApOwogICBzaG93X3JlZ3MocmVncyk7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQkVEQlVHKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCiAgIGRvX2JlZGJ1Z19icmVha3BvaW50KCByZWdzICk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2NwdS9tcGM4MjR4L3UtYm9vdC5sZHMgYi9jcHUvbXBjODI0eC91LWJvb3QubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYmVmNGEKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvbXBjODI0eC91LWJvb3QubGRzCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxLTIwMDcKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0FSQ0gocG93ZXJwYykKK1NFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOworLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KKyAgIF9fRFlOQU1JQyA9IDA7ICAgICovCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9ICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQorICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KKyAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KKyAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KKyAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQorICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQorICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9CisgIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9CisgIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQorICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9CisgIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQorICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9CisgIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KKyAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KKyAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQorICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQorICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KKyAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQorICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KKyAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQorICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQorICAucGx0IDogeyAqKC5wbHQpIH0KKyAgLnRleHQgICAgICA6CisgIHsKKyAgICBjcHUvbXBjODI0eC9zdGFydC5vCQkoLnRleHQpCisgICAgKigudGV4dCkKKyAgICAqKC5nb3QxKQorICAgIC4gPSBBTElHTigxNik7CisgICAgKigucm9kYXRhKQorICAgICooLnJvZGF0YTEpCisgICAgKigucm9kYXRhLnN0cjEuNCkKKyAgICAqKC5laF9mcmFtZSkKKyAgfQorICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCisgIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KKyAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQorCisgIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLworICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKKyAgX2Vyb3RleHQgPSAuOworICBQUk9WSURFIChlcm90ZXh0ID0gLik7CisgIC5yZWxvYyAgIDoKKyAgeworICAgICooLmdvdCkKKyAgICBfR09UMl9UQUJMRV8gPSAuOworICAgICooLmdvdDIpCisgICAgX0ZJWFVQX1RBQkxFXyA9IC47CisgICAgKiguZml4dXApCisgIH0KKyAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKKyAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOworCisgIC5kYXRhICAgIDoKKyAgeworICAgICooLmRhdGEpCisgICAgKiguZGF0YTEpCisgICAgKiguc2RhdGEpCisgICAgKiguc2RhdGEyKQorICAgICooLmR5bmFtaWMpCisgICAgQ09OU1RSVUNUT1JTCisgIH0KKyAgX2VkYXRhICA9ICAuOworICBQUk9WSURFIChlZGF0YSA9IC4pOworCisgIC4gPSAuOworICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOworICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQorICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKKworCisgIC4gPSAuOworICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOworICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KKyAgX19zdG9wX19fZXhfdGFibGUgPSAuOworCisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19pbml0X2JlZ2luID0gLjsKKyAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9CisgIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQorICAuID0gQUxJR04oNDA5Nik7CisgIF9faW5pdF9lbmQgPSAuOworCisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICA6CisgIHsKKyAgICooLnNic3MpICooLnNjb21tb24pCisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgfQorICBfZW5kID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworfQpkaWZmIC0tZ2l0IGEvY3B1L21wYzgyNjAvYmVkYnVnXzYwM2UuYyBiL2NwdS9tcGM4MjYwL2JlZGJ1Z182MDNlLmMKaW5kZXggYmUwOWNmYi4uZjFiZTQ4NSAxMDA2NDQKLS0tIGEvY3B1L21wYzgyNjAvYmVkYnVnXzYwM2UuYworKysgYi9jcHUvbXBjODI2MC9iZWRidWdfNjAzZS5jCkBAIC0xMCw3ICsxMCw4IEBACiAjaW5jbHVkZSA8YmVkYnVnL3JlZ3MuaD4KICNpbmNsdWRlIDxiZWRidWcvcHBjLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CRURCVUcpICYmIChkZWZpbmVkKENPTkZJR19NUEM4MjRYKSB8fCBkZWZpbmVkKENPTkZJR19NUEM4MjYwKSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKSBcCisJJiYgKGRlZmluZWQoQ09ORklHX01QQzgyNFgpIHx8IGRlZmluZWQoQ09ORklHX01QQzgyNjApKQogCiAjZGVmaW5lIE1BWF9CUkVBS19QT0lOVFMgMQogCmRpZmYgLS1naXQgYS9jcHUvbXBjODI2MC9jb25maWcubWsgYi9jcHUvbXBjODI2MC9jb25maWcubWsKaW5kZXggZGQ3YTcxZi4uZDQwMWU0YyAxMDA2NDQKLS0tIGEvY3B1L21wYzgyNjAvY29uZmlnLm1rCisrKyBiL2NwdS9tcGM4MjYwL2NvbmZpZy5tawpAQCAtMjEsNyArMjEsMTAgQEAKICMgTUEgMDIxMTEtMTMwNyBVU0EKICMKIAotUExBVEZPUk1fUkVMRkxBR1MgKz0gLWZQSUMgLWZmaXhlZC1yMTQgLW1lYWJpCitQTEFURk9STV9SRUxGTEFHUyArPSAtZlBJQyAtZmZpeGVkLXIxNCAtbWVhYmkgLW1yZWxvY2F0YWJsZQogCiBQTEFURk9STV9DUFBGTEFHUyArPSAtRENPTkZJR184MjYwIC1EQ09ORklHX0NQTTIgLWZmaXhlZC1yMiAtZmZpeGVkLXIyOSBcCiAJCSAgICAgLW1zdHJpbmcgLW1jcHU9NjAzZSAtbW11bHRpcGxlCisKKyMgVXNlIGRlZmF1bHQgbGlua2VyIHNjcmlwdC4gIEJvYXJkIHBvcnQgY2FuIG92ZXJyaWRlIGluIGJvYXJkLyovY29uZmlnLm1rCitMRFNDUklQVCA6PSAkKFNSQ1RSRUUpL2NwdS9tcGM4MjYwL3UtYm9vdC5sZHMKZGlmZiAtLWdpdCBhL2NwdS9tcGM4MjYwL2NwdV9pbml0LmMgYi9jcHUvbXBjODI2MC9jcHVfaW5pdC5jCmluZGV4IDM4MGQ3YWYuLjM2ZmMxZWIgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4MjYwL2NwdV9pbml0LmMKKysrIGIvY3B1L21wYzgyNjAvY3B1X2luaXQuYwpAQCAtMTgyLDcgKzE4Miw3IEBACiAjZW5kaWYKIAogCS8qIG5vdyByZXN0cmljdCB0byBwcmVsaW1pbmFyeSByYW5nZSAqLwotCS8qIHRoZSBQUyBjYW1lIGZyb20gdGhlIEhSQ1csIGRvbsK0dCBjaGFuZ2UgaXQgKi8KKwkvKiB0aGUgUFMgY2FtZSBmcm9tIHRoZSBIUkNXLCBkb260dCBjaGFuZ2UgaXQgKi8KIAltZW1jdGwtPm1lbWNfYnIwID0gU0VUX1ZBTF9NQVNLKG1lbWN0bC0+bWVtY19icjAgLCBDRkdfQlIwX1BSRUxJTSwgQlJ4X1BTX01TSyk7CiAJbWVtY3RsLT5tZW1jX29yMCA9IENGR19PUjBfUFJFTElNOwogCmRpZmYgLS1naXQgYS9jcHUvbXBjODI2MC9ldGhlcl9mY2MuYyBiL2NwdS9tcGM4MjYwL2V0aGVyX2ZjYy5jCmluZGV4IDU4NGM0MGYuLjM3YmY0NDUgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4MjYwL2V0aGVyX2ZjYy5jCisrKyBiL2NwdS9tcGM4MjYwL2V0aGVyX2ZjYy5jCkBAIC00NywxMyArNDcsMTMgQEAKICNpbmNsdWRlIDxjb25maWcuaD4KICNpbmNsdWRlIDxuZXQuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQorI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKICNpbmNsdWRlIDxtaWlwaHkuaD4KICNlbmRpZgogCiBERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKIAotI2lmIGRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZDQykgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBcCisjaWYgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkNDKSAmJiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSAmJiBcCiAJZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKQogCiBzdGF0aWMgc3RydWN0IGV0aGVyX2ZjY19pbmZvX3MKQEAgLTM5Myw3ICszOTMsNyBAQAogCiAJCWV0aF9yZWdpc3RlcihkZXYpOwogCi0jaWYgKGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKSkgXAorI2lmIChkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpKSBcCiAJCSYmIGRlZmluZWQoQ09ORklHX0JJVEJBTkdNSUkpCiAJCW1paXBoeV9yZWdpc3RlcihkZXYtPm5hbWUsCiAJCQkJYmJfbWlpcGh5X3JlYWQsCWJiX21paXBoeV93cml0ZSk7CkBAIC0xMTg3LDQgKzExODcsNCBAQAogCiAjZW5kaWYgLyogQ09ORklHX0VUSEVSX0xPT1BCQUNLX1RFU1QgKi8KIAotI2VuZGlmCS8qIENPTkZJR19FVEhFUl9PTl9GQ0MgJiYgQ0ZHX0NNRF9ORVQgJiYgQ09ORklHX05FVF9NVUxUSSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jcHUvbXBjODI2MC9ldGhlcl9zY2MuYyBiL2NwdS9tcGM4MjYwL2V0aGVyX3NjYy5jCmluZGV4IGE3MzNiNDUuLmU1NjgzOWQgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4MjYwL2V0aGVyX3NjYy5jCisrKyBiL2NwdS9tcGM4MjYwL2V0aGVyX3NjYy5jCkBAIC0zNiw3ICszNiw3IEBACiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPGNvbmZpZy5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fU0NDKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fU0NDKSAmJiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCiAjaWYgKENPTkZJR19FVEhFUl9JTkRFWCA9PSAxKQogIyAgZGVmaW5lIFBST0ZGX0VORVQgICAgICAgICAgICBQUk9GRl9TQ0MxCkBAIC0zNTMsNCArMzUzLDQgQEAKIH0KICNlbmRpZgogCi0jZW5kaWYgIC8qIENPTkZJR19FVEhFUl9PTl9TQ0MgJiYgQ0ZHX0NNRF9ORVQgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L21wYzgyNjAvaW50ZXJydXB0cy5jIGIvY3B1L21wYzgyNjAvaW50ZXJydXB0cy5jCmluZGV4IDU2ZTlhNzIuLmJmMGQ0ZDAgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4MjYwL2ludGVycnVwdHMuYworKysgYi9jcHUvbXBjODI2MC9pbnRlcnJ1cHRzLmMKQEAgLTI0Niw3ICsyNDYsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lSUSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSVJRKQogCiAvKiByaXBwZWQgdGhpcyBvdXQgb2YgcHBjNHh4L2ludGVycnVwdHMuYyAqLwogCkBAIC0yNzYsNCArMjc2LDQgQEAKIAkJZW5hYmxlX2ludGVycnVwdHMgKCk7CiB9CiAKLSNlbmRpZgkJCQkJCQkvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lSUSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jcHUvbXBjODI2MC9rZ2RiLlMgYi9jcHUvbXBjODI2MC9rZ2RiLlMKaW5kZXggMmEyNTAyNC4uZGFlODdiYiAxMDA2NDQKLS0tIGEvY3B1L21wYzgyNjAva2dkYi5TCisrKyBiL2NwdS9tcGM4MjYwL2tnZGIuUwpAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogI2luY2x1ZGUgPGFzbS9tbXUuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAKICAvKgogICogY2FjaGUgZmx1c2hpbmcgcm91dGluZXMgZm9yIGtnZGIKQEAgLTY5LDQgKzY5LDQgQEAKIAlTWU5DCiAJYmxyCiAKLSNlbmRpZiAvKiBDRkdfQ01EX0tHREIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L21wYzgyNjAvc3RhcnQuUyBiL2NwdS9tcGM4MjYwL3N0YXJ0LlMKaW5kZXggMmU5M2JiYi4uN2Y1ZGM4MSAxMDA2NDQKLS0tIGEvY3B1L21wYzgyNjAvc3RhcnQuUworKysgYi9jcHUvbXBjODI2MC9zdGFydC5TCkBAIC0yNzksNyArMjc5LDcgQEAKIC8qIEFsaWdubWVudCBleGNlcHRpb24uICovCiAJLiA9IDB4NjAwCiBBbGlnbm1lbnQ6Ci0JRVhDRVBUSU9OX1BST0xPRworCUVYQ0VQVElPTl9QUk9MT0coU1JSMCwgU1JSMSkKIAltZnNwcglyNCxEQVIKIAlzdHcJcjQsX0RBUihyMjEpCiAJbWZzcHIJcjUsRFNJU1IKQEAgLTI5OCw3ICsyOTgsNyBAQAogLyogUHJvZ3JhbSBjaGVjayBleGNlcHRpb24gKi8KIAkuID0gMHg3MDAKIFByb2dyYW1DaGVjazoKLQlFWENFUFRJT05fUFJPTE9HCisJRVhDRVBUSU9OX1BST0xPRyhTUlIwLCBTUlIxKQogCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKIAlsaQlyMjAsTVNSX0tFUk5FTAogCXJsd2ltaQlyMjAscjIzLDAsMTYsMTYJCS8qIGNvcHkgRUUgYml0IGZyb20gc2F2ZWQgTVNSICovCkBAIC02NzYsMTMgKzY3NiwxMyBAQAogCWJkbnoJMWIKIAogCS8qIExvYWQgdGhlIEluc3RydWN0aW9uIEFkZHJlc3MgQnJlYWtwb2ludCBSZWdpc3RlciAoSUFCUikuCSovCi0JLyogCQkJCQkJCQkqLworCS8qCQkJCQkJCQkqLwogCS8qIFRoZSBhZGRyZXNzIHRvIGxvYWQgaXMgc3RvcmVkIGluIHRoZSBmaXJzdCB3b3JkIG9mIGR1YWwgcG9ydAkqLwogCS8qIHJhbSBhbmQgc2hvdWxkIGJlIHByZXNlcnZlZCB3aGlsZSB0aGUgcG93ZXIgaXMgb24sIHNvIHlvdQkqLwogCS8qIGNhbiBwbHVnIGFkZHJlc3NlcyBpbnRvIHRoYXQgbG9jYXRpb24gdGhlbiByZXNldCB0aGUgY3B1IGFuZAkqLwogCS8qIHRoaXMgY29kZSB3aWxsIGxvYWQgdGhhdCBhZGRyZXNzIGludG8gdGhlIElBQlIgYWZ0ZXIgdGhlCSovCiAJLyogcmVzZXQuCQkJCQkJCSovCi0JLyogCQkJCQkJCQkqLworCS8qCQkJCQkJCQkqLwogCS8qIFdoZW4gdGhlIHByb2dyYW0gY291bnRlciBtYXRjaGVzIHRoZSBjb250ZW50cyBvZiB0aGUgSUFCUiwJKi8KIAkvKiBhbiBleGNlcHRpb24gaXMgZ2VuZXJhdGVkIChiZWZvcmUgdGhlIGluc3RydWN0aW9uIGF0IHRoYXQJKi8KIAkvKiBsb2NhdGlvbiBjb21wbGV0ZXMpLiBUaGUgdmVjdG9yIGZvciB0aGlzIGV4Y2VwdGlvbiBpcyAweDEzMDAgKi8KZGlmZiAtLWdpdCBhL2NwdS9tcGM4MjYwL3RyYXBzLmMgYi9jcHUvbXBjODI2MC90cmFwcy5jCmluZGV4IDBjMzllNDMuLmI1ZDQxNmMgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4MjYwL3RyYXBzLmMKKysrIGIvY3B1L21wYzgyNjAvdHJhcHMuYwpAQCAtMzcsNyArMzcsNyBAQAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vbTgyNjBfcGNpLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogaW50ICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHN0cnVjdCBwdF9yZWdzICopID0gMDsKICNlbmRpZgogCkBAIC0xNTAsNyArMTUwLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTE4Niw3ICsxODYsNyBAQAogdm9pZAogQWxpZ25tZW50RXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTE5OCw3ICsxOTgsNyBAQAogdm9pZAogUHJvZ3JhbUNoZWNrRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTIxMCw3ICsyMTAsNyBAQAogdm9pZAogU29mdEVtdUV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0yMjMsNyArMjIzLDcgQEAKIHZvaWQKIFVua25vd25FeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMjMyLDcgKzIzMiw3IEBACiAJX2V4Y2VwdGlvbigwLCByZWdzKTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogZXh0ZXJuIHZvaWQgZG9fYmVkYnVnX2JyZWFrcG9pbnQoc3RydWN0IHB0X3JlZ3MgKik7CiAjZW5kaWYKIApAQCAtMjQyLDcgKzI0Miw3IEBACiAKICAgcHJpbnRmKCJEZWJ1Z2dlciB0cmFwIGF0IEAgJWx4XG4iLCByZWdzLT5uaXAgKTsKICAgc2hvd19yZWdzKHJlZ3MpOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogICBkb19iZWRidWdfYnJlYWtwb2ludCggcmVncyApOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9jcHUvbXBjODI2MC91LWJvb3QubGRzIGIvY3B1L21wYzgyNjAvdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGFiYzE3Ci0tLSAvZGV2L251bGwKKysrIGIvY3B1L21wYzgyNjAvdS1ib290LmxkcwpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMS0yMDA3CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9BUkNIKHBvd2VycGMpCitTRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKKy8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/CisgICBfX0RZTkFNSUMgPSAwOyAgICAqLworU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KKyAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9CisgIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9CisgIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9CisgIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KKyAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KKyAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQorICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQorICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KKyAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQorICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KKyAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQorICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9CisgIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9CisgIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KKyAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KKyAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9CisgIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KKyAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9CisgIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KKyAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KKyAgLnBsdCA6IHsgKigucGx0KSB9CisgIC50ZXh0ICAgICAgOgorICB7CisgICAgY3B1L21wYzgyNjAvc3RhcnQubwkJKC50ZXh0KQorICAgICooLnRleHQpCisgICAgKiguZ290MSkKKyAgICAuID0gQUxJR04oMTYpOworICAgICooLnJvZGF0YSkKKyAgICAqKC5yb2RhdGExKQorICAgICooLnJvZGF0YS5zdHIxLjQpCisgICAgKiguZWhfZnJhbWUpCisgIH0KKyAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAorICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9CisgIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KKworICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KKyAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7CisgIF9lcm90ZXh0ID0gLjsKKyAgUFJPVklERSAoZXJvdGV4dCA9IC4pOworICAucmVsb2MgICA6CisgIHsKKyAgICAqKC5nb3QpCisgICAgX0dPVDJfVEFCTEVfID0gLjsKKyAgICAqKC5nb3QyKQorICAgIF9GSVhVUF9UQUJMRV8gPSAuOworICAgICooLmZpeHVwKQorICB9CisgIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7CisgIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKKworICAuZGF0YSAgICA6CisgIHsKKyAgICAqKC5kYXRhKQorICAgICooLmRhdGExKQorICAgICooLnNkYXRhKQorICAgICooLnNkYXRhMikKKyAgICAqKC5keW5hbWljKQorICAgIENPTlNUUlVDVE9SUworICB9CisgIF9lZGF0YSAgPSAgLjsKKyAgUFJPVklERSAoZWRhdGEgPSAuKTsKKworICAuID0gLjsKKyAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKKyAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KKyAgX191X2Jvb3RfY21kX2VuZCA9IC47CisKKworICAuID0gLjsKKyAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKKyAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9CisgIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKKworICAuID0gQUxJR04oNDA5Nik7CisgIF9faW5pdF9iZWdpbiA9IC47CisgIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQorICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRfZW5kID0gLjsKKworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgOgorICB7CisgICAqKC5zYnNzKSAqKC5zY29tbW9uKQorICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgIH0KKyAgX2VuZCA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKK30KZGlmZiAtLWdpdCBhL2NwdS9tcGM4M3h4L01ha2VmaWxlIGIvY3B1L21wYzgzeHgvTWFrZWZpbGUKaW5kZXggYmI5NmY3Ny4uMjMyOTk3MCAxMDA2NDQKLS0tIGEvY3B1L21wYzgzeHgvTWFrZWZpbGUKKysrIGIvY3B1L21wYzgzeHgvTWFrZWZpbGUKQEAgLTI5LDcgKzI5LDcgQEAKIAogU1RBUlQJPSBzdGFydC5vCiBDT0JKUwk9IHRyYXBzLm8gY3B1Lm8gY3B1X2luaXQubyBzcGVlZC5vIGludGVycnVwdHMubyBcCi0JICBzcGRfc2RyYW0ubyBxZV9pby5vIHBjaS5vCisJICBzcGRfc2RyYW0ubyBlY2MubyBxZV9pby5vIHBjaS5vCiAKIFNSQ1MJOj0gJChTVEFSVDoubz0uUykgJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKIE9CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlMpICQoQ09CSlMpKQpkaWZmIC0tZ2l0IGEvY3B1L21wYzgzeHgvY29uZmlnLm1rIGIvY3B1L21wYzgzeHgvY29uZmlnLm1rCmluZGV4IDhiNGZmOTIuLjJlYzM5NWQgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4M3h4L2NvbmZpZy5taworKysgYi9jcHUvbXBjODN4eC9jb25maWcubWsKQEAgLTIwLDcgKzIwLDEwIEBACiAjIE1BIDAyMTExLTEzMDcgVVNBCiAjCiAKLVBMQVRGT1JNX1JFTEZMQUdTICs9IC1mUElDIC1mZml4ZWQtcjE0IC1tZWFiaQorUExBVEZPUk1fUkVMRkxBR1MgKz0gLWZQSUMgLWZmaXhlZC1yMTQgLW1lYWJpIC1tcmVsb2NhdGFibGUKIAogUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURDT05GSUdfTVBDODNYWCAtRENPTkZJR19FMzAwIFwKIAkJCS1mZml4ZWQtcjIgLWZmaXhlZC1yMjkgLW1zb2Z0LWZsb2F0CisKKyMgVXNlIGRlZmF1bHQgbGlua2VyIHNjcmlwdC4gIEJvYXJkIHBvcnQgY2FuIG92ZXJyaWRlIGluIGJvYXJkLyovY29uZmlnLm1rCitMRFNDUklQVCA6PSAkKFNSQ1RSRUUpL2NwdS9tcGM4M3h4L3UtYm9vdC5sZHMKZGlmZiAtLWdpdCBhL2NwdS9tcGM4M3h4L2NwdS5jIGIvY3B1L21wYzgzeHgvY3B1LmMKaW5kZXggZTA3OGYyNy4uYWRmODA4MyAxMDA2NDQKLS0tIGEvY3B1L21wYzgzeHgvY3B1LmMKKysrIGIvY3B1L21wYzgzeHgvY3B1LmMKQEAgLTMzLDggKzMzLDcgQEAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaWYgZGVmaW5lZChDT05GSUdfT0ZfRkxBVF9UUkVFKQogI2luY2x1ZGUgPGZ0X2J1aWxkLmg+Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCisjZWxpZiBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCiAjaW5jbHVkZSA8bGliZmR0Lmg+CiAjaW5jbHVkZSA8bGliZmR0X2Vudi5oPgogI2VuZGlmCkBAIC0xMTMsMTIgKzExMiwxNCBAQAogCWNhc2UgU1BSXzgzNjBFX1JFVjExOgogCWNhc2UgU1BSXzgzNjBFX1JFVjEyOgogCWNhc2UgU1BSXzgzNjBFX1JFVjIwOgorCWNhc2UgU1BSXzgzNjBFX1JFVjIxOgogCQlwdXRzKCJNUEM4MzYwRSwgIik7CiAJCWJyZWFrOwogCWNhc2UgU1BSXzgzNjBfUkVWMTA6CiAJY2FzZSBTUFJfODM2MF9SRVYxMToKIAljYXNlIFNQUl84MzYwX1JFVjEyOgogCWNhc2UgU1BSXzgzNjBfUkVWMjA6CisJY2FzZSBTUFJfODM2MF9SRVYyMToKIAkJcHV0cygiTVBDODM2MCwgIik7CiAJCWJyZWFrOwogCWNhc2UgU1BSXzgzMjNFX1JFVjEwOgpAQCAtMTUwLDcgKzE1MSw4IEBACiAJCXB1dHMoIk1QQzgzMTNFLCAiKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHV0cygiUmV2OiBVbmtub3duIHJldmlzaW9uIG51bWJlci5cbldhcm5pbmc6IFVuc3VwcG9ydGVkIGNwdSByZXZpc2lvbiFcbiIpOworCQlwcmludGYoIlJldjogVW5rbm93biByZXZpc2lvbiBudW1iZXI6JTA4eFxuIgorCQkJIldhcm5pbmc6IFVuc3VwcG9ydGVkIGNwdSByZXZpc2lvbiFcbiIsc3ByaWRyKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0zMjksMTU0ICszMzEsMTY3IEBACiAvKgogICogIlNldHRlciIgZnVuY3Rpb25zIHVzZWQgdG8gYWRkL21vZGlmeSBGRFQgZW50cmllcy4KICAqLwotc3RhdGljIGludCBmZHRfc2V0X2V0aDAodm9pZCAqZmR0LCBpbnQgbm9kZW9mZnNldCwgY29uc3QgY2hhciAqbmFtZSwgYmRfdCAqYmQpCitzdGF0aWMgaW50IGZkdF9zZXRfZXRoMCh2b2lkICpibG9iLCBpbnQgbm9kZW9mZnNldCwgY29uc3QgY2hhciAqbmFtZSwgYmRfdCAqYmQpCiB7CiAJLyoKIAkgKiBGaXggaXQgdXAgaWYgaXQgZXhpc3RzLCBkb24ndCBjcmVhdGUgaXQgaWYgaXQgZG9lc24ndCBleGlzdC4KIAkgKi8KLQlpZiAoZmR0X2dldF9wcm9wZXJ0eShmZHQsIG5vZGVvZmZzZXQsIG5hbWUsIDApKSB7Ci0JCXJldHVybiBmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsIG5hbWUsIGJkLT5iaV9lbmV0YWRkciwgNik7CisJaWYgKGZkdF9nZXRfcHJvcGVydHkoYmxvYiwgbm9kZW9mZnNldCwgbmFtZSwgMCkpIHsKKwkJcmV0dXJuIGZkdF9zZXRwcm9wKGJsb2IsIG5vZGVvZmZzZXQsIG5hbWUsIGJkLT5iaV9lbmV0YWRkciwgNik7CiAJfQotCXJldHVybiAtRkRUX0VSUl9OT1RGT1VORDsKKwlyZXR1cm4gMDsKIH0KICNpZmRlZiBDT05GSUdfSEFTX0VUSDEKIC8qIHNlY29uZCBvbmJvYXJkIGV0aGVybmV0IHBvcnQgKi8KLXN0YXRpYyBpbnQgZmR0X3NldF9ldGgxKHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUsIGJkX3QgKmJkKQorc3RhdGljIGludCBmZHRfc2V0X2V0aDEodm9pZCAqYmxvYiwgaW50IG5vZGVvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUsIGJkX3QgKmJkKQogewogCS8qCiAJICogRml4IGl0IHVwIGlmIGl0IGV4aXN0cywgZG9uJ3QgY3JlYXRlIGl0IGlmIGl0IGRvZXNuJ3QgZXhpc3QuCiAJICovCi0JaWYgKGZkdF9nZXRfcHJvcGVydHkoZmR0LCBub2Rlb2Zmc2V0LCBuYW1lLCAwKSkgewotCQlyZXR1cm4gZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCBuYW1lLCBiZC0+YmlfZW5ldDFhZGRyLCA2KTsKKwlpZiAoZmR0X2dldF9wcm9wZXJ0eShibG9iLCBub2Rlb2Zmc2V0LCBuYW1lLCAwKSkgeworCQlyZXR1cm4gZmR0X3NldHByb3AoYmxvYiwgbm9kZW9mZnNldCwgbmFtZSwgYmQtPmJpX2VuZXQxYWRkciwgNik7CiAJfQotCXJldHVybiAtRkRUX0VSUl9OT1RGT1VORDsKKwlyZXR1cm4gMDsKIH0KICNlbmRpZgogI2lmZGVmIENPTkZJR19IQVNfRVRIMgogLyogdGhpcmQgb25ib2FyZCBldGhlcm5ldCBwb3J0ICovCi1zdGF0aWMgaW50IGZkdF9zZXRfZXRoMih2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lLCBiZF90ICpiZCkKK3N0YXRpYyBpbnQgZmR0X3NldF9ldGgyKHZvaWQgKmJsb2IsIGludCBub2Rlb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lLCBiZF90ICpiZCkKIHsKIAkvKgogCSAqIEZpeCBpdCB1cCBpZiBpdCBleGlzdHMsIGRvbid0IGNyZWF0ZSBpdCBpZiBpdCBkb2Vzbid0IGV4aXN0LgogCSAqLwotCWlmIChmZHRfZ2V0X3Byb3BlcnR5KGZkdCwgbm9kZW9mZnNldCwgbmFtZSwgMCkpIHsKLQkJcmV0dXJuIGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgbmFtZSwgYmQtPmJpX2VuZXQyYWRkciwgNik7CisJaWYgKGZkdF9nZXRfcHJvcGVydHkoYmxvYiwgbm9kZW9mZnNldCwgbmFtZSwgMCkpIHsKKwkJcmV0dXJuIGZkdF9zZXRwcm9wKGJsb2IsIG5vZGVvZmZzZXQsIG5hbWUsIGJkLT5iaV9lbmV0MmFkZHIsIDYpOwogCX0KLQlyZXR1cm4gLUZEVF9FUlJfTk9URk9VTkQ7CisJcmV0dXJuIDA7CiB9CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfSEFTX0VUSDMKIC8qIGZvdXJ0aCBvbmJvYXJkIGV0aGVybmV0IHBvcnQgKi8KLXN0YXRpYyBpbnQgZmR0X3NldF9ldGgzKHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUsIGJkX3QgKmJkKQorc3RhdGljIGludCBmZHRfc2V0X2V0aDModm9pZCAqYmxvYiwgaW50IG5vZGVvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUsIGJkX3QgKmJkKQogewogCS8qCiAJICogRml4IGl0IHVwIGlmIGl0IGV4aXN0cywgZG9uJ3QgY3JlYXRlIGl0IGlmIGl0IGRvZXNuJ3QgZXhpc3QuCiAJICovCi0JaWYgKGZkdF9nZXRfcHJvcGVydHkoZmR0LCBub2Rlb2Zmc2V0LCBuYW1lLCAwKSkgewotCQlyZXR1cm4gZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCBuYW1lLCBiZC0+YmlfZW5ldDNhZGRyLCA2KTsKKwlpZiAoZmR0X2dldF9wcm9wZXJ0eShibG9iLCBub2Rlb2Zmc2V0LCBuYW1lLCAwKSkgeworCQlyZXR1cm4gZmR0X3NldHByb3AoYmxvYiwgbm9kZW9mZnNldCwgbmFtZSwgYmQtPmJpX2VuZXQzYWRkciwgNik7CiAJfQotCXJldHVybiAtRkRUX0VSUl9OT1RGT1VORDsKKwlyZXR1cm4gMDsKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IGZkdF9zZXRfYnVzZnJlcSh2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lLCBiZF90ICpiZCkKK3N0YXRpYyBpbnQgZmR0X3NldF9idXNmcmVxKHZvaWQgKmJsb2IsIGludCBub2Rlb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lLCBiZF90ICpiZCkKIHsKIAl1MzIgIHRtcDsKIAkvKgogCSAqIENyZWF0ZSBvciB1cGRhdGUgdGhlIHByb3BlcnR5LgogCSAqLwogCXRtcCA9IGNwdV90b19iZTMyKGJkLT5iaV9idXNmcmVxKTsKLQlyZXR1cm4gZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCBuYW1lLCAmdG1wLCBzaXplb2YodG1wKSk7CisJcmV0dXJuIGZkdF9zZXRwcm9wKGJsb2IsIG5vZGVvZmZzZXQsIG5hbWUsICZ0bXAsIHNpemVvZih0bXApKTsKIH0KIAorc3RhdGljIGludCBmZHRfc2V0X3RiZnJlcSh2b2lkICpibG9iLCBpbnQgbm9kZW9mZnNldCwgY29uc3QgY2hhciAqbmFtZSwgYmRfdCAqYmQpCit7CisJdTMyICB0bXA7CisJLyoKKwkgKiBDcmVhdGUgb3IgdXBkYXRlIHRoZSBwcm9wZXJ0eS4KKwkgKi8KKwl0bXAgPSBjcHVfdG9fYmUzMihPRl9UQkNMSyk7CisJcmV0dXJuIGZkdF9zZXRwcm9wKGJsb2IsIG5vZGVvZmZzZXQsIG5hbWUsICZ0bXAsIHNpemVvZih0bXApKTsKK30KKworCiAvKgotICogRml4dXBzIHRvIHRoZSBmZHQuICBJZiAiY3JlYXRlIiBpcyBUUlVFLCB0aGUgbm9kZSBpcyBjcmVhdGVkCi0gKiB1bmNvbmRpdGlvbmFsbHkuICBJZiAiY3JlYXRlIiBpcyBGQUxTRSwgdGhlIG5vZGUgaXMgdXBkYXRlZAotICogb25seSBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KKyAqIEZpeHVwcyB0byB0aGUgZmR0LgogICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHsKIAljaGFyICpub2RlOwogCWNoYXIgKnByb3A7Ci0JaW50ICgqc2V0X2ZuKSh2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lLCBiZF90ICpiZCk7CisJaW50ICgqc2V0X2ZuKSh2b2lkICpibG9iLCBpbnQgbm9kZW9mZnNldCwgY29uc3QgY2hhciAqbmFtZSwgYmRfdCAqYmQpOwogfSBmaXh1cF9wcm9wc1tdID0gewogCXsJIi9jcHVzLyIgT0ZfQ1BVLAotCQkgImJ1cy1mcmVxdWVuY3kiLAotCQlmZHRfc2V0X2J1c2ZyZXEKKwkJInRpbWViYXNlLWZyZXF1ZW5jeSIsCisJCWZkdF9zZXRfdGJmcmVxCiAJfSwKLQl7CSIvY3B1cy8iIE9GX1NPQywKKwl7CSIvY3B1cy8iIE9GX0NQVSwKIAkJImJ1cy1mcmVxdWVuY3kiLAogCQlmZHRfc2V0X2J1c2ZyZXEKIAl9LAotCXsJIi8iIE9GX1NPQyAiL3NlcmlhbEA0NTAwLyIsCisJewkiL2NwdXMvIiBPRl9DUFUsCiAJCSJjbG9jay1mcmVxdWVuY3kiLAogCQlmZHRfc2V0X2J1c2ZyZXEKIAl9LAotCXsJIi8iIE9GX1NPQyAiL3NlcmlhbEA0NjAwLyIsCisJewkiLyIgT0ZfU09DICIvc2VyaWFsQDQ1MDAiLAogCQkiY2xvY2stZnJlcXVlbmN5IiwKIAkJZmR0X3NldF9idXNmcmVxCiAJfSwKLSNpZmRlZiBDT05GSUdfTVBDODNYWF9UU0VDMQotCXsJIi8iIE9GX1NPQyAiL2V0aGVybmV0QDI0MDAwLAorCXsJIi8iIE9GX1NPQyAiL3NlcmlhbEA0NjAwIiwKKwkJImNsb2NrLWZyZXF1ZW5jeSIsCisJCWZkdF9zZXRfYnVzZnJlcQorCX0sCisjaWZkZWYgQ09ORklHX1RTRUMxCisJewkiLyIgT0ZfU09DICIvZXRoZXJuZXRAMjQwMDAiLAogCQkibWFjLWFkZHJlc3MiLAogCQlmZHRfc2V0X2V0aDAKIAl9LAotCXsJIi8iIE9GX1NPQyAiL2V0aGVybmV0QDI0MDAwLAorCXsJIi8iIE9GX1NPQyAiL2V0aGVybmV0QDI0MDAwIiwKIAkJImxvY2FsLW1hYy1hZGRyZXNzIiwKIAkJZmR0X3NldF9ldGgwCiAJfSwKICNlbmRpZgotI2lmZGVmIENPTkZJR19NUEM4M1hYX1RTRUMyCi0JewkiLyIgT0ZfU09DICIvZXRoZXJuZXRAMjUwMDAsCisjaWZkZWYgQ09ORklHX1RTRUMyCisJewkiLyIgT0ZfU09DICIvZXRoZXJuZXRAMjUwMDAiLAogCQkibWFjLWFkZHJlc3MiLAogCQlmZHRfc2V0X2V0aDEKIAl9LAotCXsJIi8iIE9GX1NPQyAiL2V0aGVybmV0QDI1MDAwLAorCXsJIi8iIE9GX1NPQyAiL2V0aGVybmV0QDI1MDAwIiwKIAkJImxvY2FsLW1hYy1hZGRyZXNzIiwKIAkJZmR0X3NldF9ldGgxCiAJfSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19VRUNfRVRIMQogI2lmIENGR19VRUMxX1VDQ19OVU0gPT0gMCAgLyogVUNDMSAqLwotCXsJIi8iIE9GX1FFICIvdWNjQDIwMDAvbWFjLWFkZHJlc3MiLAorCXsJIi8iIE9GX1FFICIvdWNjQDIwMDAiLAogCQkibWFjLWFkZHJlc3MiLAogCQlmZHRfc2V0X2V0aDAKIAl9LAotCXsJIi8iIE9GX1FFICIvdWNjQDIwMDAvbWFjLWFkZHJlc3MiLAorCXsJIi8iIE9GX1FFICIvdWNjQDIwMDAiLAogCQkibG9jYWwtbWFjLWFkZHJlc3MiLAogCQlmZHRfc2V0X2V0aDAKIAl9LAogI2VsaWYgQ0ZHX1VFQzFfVUNDX05VTSA9PSAyICAvKiBVQ0MzICovCi0JewkiLyIgT0ZfUUUgIi91Y2NAMjIwMC9tYWMtYWRkcmVzcyIsCisJewkiLyIgT0ZfUUUgIi91Y2NAMjIwMCIsCiAJCSJtYWMtYWRkcmVzcyIsCiAJCWZkdF9zZXRfZXRoMAogCX0sCi0JewkiLyIgT0ZfUUUgIi91Y2NAMjIwMC9tYWMtYWRkcmVzcyIsCisJewkiLyIgT0ZfUUUgIi91Y2NAMjIwMCIsCiAJCSJsb2NhbC1tYWMtYWRkcmVzcyIsCiAJCWZkdF9zZXRfZXRoMAogCX0sCiAjZW5kaWYKLSNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19VRUNfRVRIMSAqLwogI2lmZGVmIENPTkZJR19VRUNfRVRIMgogI2lmIENGR19VRUMyX1VDQ19OVU0gPT0gMSAgLyogVUNDMiAqLwotCXsJIi8iIE9GX1FFICIvdWNjQDMwMDAvbWFjLWFkZHJlc3MiLAorCXsJIi8iIE9GX1FFICIvdWNjQDMwMDAiLAogCQkibWFjLWFkZHJlc3MiLAogCQlmZHRfc2V0X2V0aDEKIAl9LAotCXsJIi8iIE9GX1FFICIvdWNjQDMwMDAvbWFjLWFkZHJlc3MiLAorCXsJIi8iIE9GX1FFICIvdWNjQDMwMDAiLAogCQkibG9jYWwtbWFjLWFkZHJlc3MiLAogCQlmZHRfc2V0X2V0aDEKIAl9LAogI2VsaWYgQ0ZHX1VFQzFfVUNDX05VTSA9PSAzICAvKiBVQ0M0ICovCi0JewkiLyIgT0ZfUUUgIi91Y2NAMzIwMC9tYWMtYWRkcmVzcyIsCisJewkiLyIgT0ZfUUUgIi91Y2NAMzIwMCIsCiAJCSJtYWMtYWRkcmVzcyIsCiAJCWZkdF9zZXRfZXRoMQogCX0sCi0JewkiLyIgT0ZfUUUgIi91Y2NAMzIwMC9tYWMtYWRkcmVzcyIsCisJewkiLyIgT0ZfUUUgIi91Y2NAMzIwMCIsCiAJCSJsb2NhbC1tYWMtYWRkcmVzcyIsCiAJCWZkdF9zZXRfZXRoMQogCX0sCiAjZW5kaWYKLSNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19VRUNfRVRIMiAqLwogfTsKIAogdm9pZApAQCAtNDg3LDIwICs1MDIsMjMgQEAKIAlpbnQgIGo7CiAKIAlmb3IgKGogPSAwOyBqIDwgKHNpemVvZihmaXh1cF9wcm9wcykgLyBzaXplb2YoZml4dXBfcHJvcHNbMF0pKTsgaisrKSB7Ci0JCW5vZGVvZmZzZXQgPSBmZHRfcGF0aF9vZmZzZXQoZmR0LCBmaXh1cF9wcm9wc1tqXS5ub2RlKTsKKwkJbm9kZW9mZnNldCA9IGZkdF9maW5kX25vZGVfYnlfcGF0aChibG9iLCBmaXh1cF9wcm9wc1tqXS5ub2RlKTsKIAkJaWYgKG5vZGVvZmZzZXQgPj0gMCkgewotCQkJZXJyID0gKCpmaXh1cF9wcm9wc1tqXS5zZXRfZm4pKGJsb2IsIG5vZGVvZmZzZXQsIGZpeHVwX3Byb3BzW2pdLnByb3AsIGJkKTsKKwkJCWVyciA9IGZpeHVwX3Byb3BzW2pdLnNldF9mbihibG9iLCBub2Rlb2Zmc2V0LAorCQkJCQkJICAgIGZpeHVwX3Byb3BzW2pdLnByb3AsIGJkKTsKIAkJCWlmIChlcnIgPCAwKQotCQkJCXByaW50Zigic2V0X2ZuL2xpYmZkdDogJXMgJXMgcmV0dXJuZWQgJXNcbiIsCisJCQkJZGVidWcoIlByb2JsZW0gc2V0dGluZyAlcyA9ICVzOiAlc1xuIiwKIAkJCQkJZml4dXBfcHJvcHNbal0ubm9kZSwKIAkJCQkJZml4dXBfcHJvcHNbal0ucHJvcCwKIAkJCQkJZmR0X3N0cmVycm9yKGVycikpOworCQl9IGVsc2UgeworCQkJZGVidWcoIkNvdWxkbid0IGZpbmQgJXM6ICVzXG4iLAorCQkJCWZpeHVwX3Byb3BzW2pdLm5vZGUsCisJCQkJZmR0X3N0cmVycm9yKG5vZGVvZmZzZXQpKTsKIAkJfQogCX0KIH0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfT0ZfRkxBVF9UUkVFKQorI2VsaWYgZGVmaW5lZChDT05GSUdfT0ZfRkxBVF9UUkVFKQogdm9pZAogZnRfY3B1X3NldHVwKHZvaWQgKmJsb2IsIGJkX3QgKmJkKQogewpAQCAtNTI1LDcgKzU0Myw3IEBACiAJaWYgKHAgIT0gTlVMTCkKIAkJKnAgPSBjcHVfdG9fYmUzMihjbG9jayk7CiAKLSNpZmRlZiBDT05GSUdfTVBDODNYWF9UU0VDMQorI2lmZGVmIENPTkZJR19UU0VDMQogCXAgPSBmdF9nZXRfcHJvcChibG9iLCAiLyIgT0ZfU09DICIvZXRoZXJuZXRAMjQwMDAvbWFjLWFkZHJlc3MiLCAmbGVuKTsKIAlpZiAocCAhPSBOVUxMKQogCQltZW1jcHkocCwgYmQtPmJpX2VuZXRhZGRyLCA2KTsKQEAgLTUzNSw3ICs1NTMsNyBAQAogCQltZW1jcHkocCwgYmQtPmJpX2VuZXRhZGRyLCA2KTsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX01QQzgzWFhfVFNFQzIKKyNpZmRlZiBDT05GSUdfVFNFQzIKIAlwID0gZnRfZ2V0X3Byb3AoYmxvYiwgIi8iIE9GX1NPQyAiL2V0aGVybmV0QDI1MDAwL21hYy1hZGRyZXNzIiwgJmxlbik7CiAJaWYgKHAgIT0gTlVMTCkKIAkJbWVtY3B5KHAsIGJkLT5iaV9lbmV0MWFkZHIsIDYpOwpkaWZmIC0tZ2l0IGEvY3B1L21wYzgzeHgvY3B1X2luaXQuYyBiL2NwdS9tcGM4M3h4L2NwdV9pbml0LmMKaW5kZXggM2FjOTE2MS4uNzIyNDk3OSAxMDA2NDQKLS0tIGEvY3B1L21wYzgzeHgvY3B1X2luaXQuYworKysgYi9jcHUvbXBjODN4eC9jcHVfaW5pdC5jCkBAIC04MywyMCArODMsMzAgQEAKIAlpbS0+c3lzY29uZi5zcGNyID0gKGltLT5zeXNjb25mLnNwY3IgJiB+U1BDUl9UU0VDMkVQKSB8IChDRkdfU1BDUl9UU0VDMkVQIDw8IFNQQ1JfVFNFQzJFUF9TSElGVCk7CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19NUEM4MzRYCiAjaWZkZWYgQ0ZHX1NDQ1JfVFNFQzFDTQogCS8qIFRTRUMxIGNsb2NrIG1vZGUgKi8KIAlpbS0+Y2xrLnNjY3IgPSAoaW0tPmNsay5zY2NyICYgflNDQ1JfVFNFQzFDTSkgfCAoQ0ZHX1NDQ1JfVFNFQzFDTSA8PCBTQ0NSX1RTRUMxQ01fU0hJRlQpOwogI2VuZGlmCisKICNpZmRlZiBDRkdfU0NDUl9UU0VDMkNNCiAJLyogVFNFQzIgJiBJMkMxIGNsb2NrIG1vZGUgKi8KIAlpbS0+Y2xrLnNjY3IgPSAoaW0tPmNsay5zY2NyICYgflNDQ1JfVFNFQzJDTSkgfCAoQ0ZHX1NDQ1JfVFNFQzJDTSA8PCBTQ0NSX1RTRUMyQ01fU0hJRlQpOwogI2VuZGlmCisKKyNpZmRlZiBDRkdfU0NDUl9UU0VDMU9OCisJLyogVFNFQzEgY2xvY2sgc3dpdGNoICovCisJaW0tPmNsay5zY2NyID0gKGltLT5jbGsuc2NjciAmIH5TQ0NSX1RTRUMxT04pIHwgKENGR19TQ0NSX1RTRUMxT04gPDwgU0NDUl9UU0VDMU9OX1NISUZUKTsKKyNlbmRpZgorCisjaWZkZWYgQ0ZHX1NDQ1JfVFNFQzJPTgorCS8qIFRTRUMyIGNsb2NrIHN3aXRjaCAqLworCWltLT5jbGsuc2NjciA9IChpbS0+Y2xrLnNjY3IgJiB+U0NDUl9UU0VDMk9OKSB8IChDRkdfU0NDUl9UU0VDMk9OIDw8IFNDQ1JfVFNFQzJPTl9TSElGVCk7CisjZW5kaWYKKwogI2lmZGVmIENGR19TQ0NSX1VTQk1QSENNCiAJLyogVVNCIE1QSCBjbG9jayBtb2RlICovCiAJaW0tPmNsay5zY2NyID0gKGltLT5jbGsuc2NjciAmIH5TQ0NSX1VTQk1QSENNKSB8IChDRkdfU0NDUl9VU0JNUEhDTSA8PCBTQ0NSX1VTQk1QSENNX1NISUZUKTsKICNlbmRpZgotI2VuZGlmIC8qIENPTkZJR19NUEM4MzRYICovCiAKICNpZmRlZiBDRkdfU0NDUl9QQ0lDTQogCS8qIFBDSSAmIERNQSBjbG9jayBtb2RlICovCkBAIC0yNDcsMyArMjU3LDM5IEBACiAjZW5kaWYKIAlyZXR1cm4gMDsKIH0KKworLyoKKyAqIEZpZ3VyZSBvdXQgdGhlIGNhdXNlIG9mIHRoZSByZXNldAorICovCitpbnQgcHJ0XzgzeHhfcnNyKHZvaWQpCit7CisJc3RhdGljIHN0cnVjdCB7CisJCXVsb25nIG1hc2s7CisJCWNoYXIgKmRlc2M7CisJfSBiaXRzW10gPSB7CisJCXsKKwkJUlNSX1NXU1IsICJTb2Z0d2FyZSBTb2Z0In0sIHsKKwkJUlNSX1NXSFIsICJTb2Z0d2FyZSBIYXJkIn0sIHsKKwkJUlNSX0pTUlMsICJKVEFHIFNvZnQifSwgeworCQlSU1JfQ1NIUiwgIkNoZWNrIFN0b3AifSwgeworCQlSU1JfU1dSUywgIlNvZnR3YXJlIFdhdGNoZG9nIn0sIHsKKwkJUlNSX0JNUlMsICJCdXMgTW9uaXRvciJ9LCB7CisJCVJTUl9TUlMsICAiRXh0ZXJuYWwvSW50ZXJuYWwgU29mdCJ9LCB7CisJCVJTUl9IUlMsICAiRXh0ZXJuYWwvSW50ZXJuYWwgSGFyZCJ9CisJfTsKKwlzdGF0aWMgaW50IG4gPSBzaXplb2YgYml0cyAvIHNpemVvZiBiaXRzWzBdOworCXVsb25nIHJzciA9IGdkLT5yZXNldF9zdGF0dXM7CisJaW50IGk7CisJY2hhciAqc2VwOworCisJcHV0cygiUmVzZXQgU3RhdHVzOiIpOworCisJc2VwID0gIiAiOworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCWlmIChyc3IgJiBiaXRzW2ldLm1hc2spIHsKKwkJCXByaW50ZigiJXMlcyIsIHNlcCwgYml0c1tpXS5kZXNjKTsKKwkJCXNlcCA9ICIsICI7CisJCX0KKwlwdXRzKCJcblxuIik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jcHUvbXBjODN4eC9lY2MuYyBiL2NwdS9tcGM4M3h4L2VjYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMTMwOTQKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvbXBjODN4eC9lY2MuYwpAQCAtMCwwICsxLDM5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIERhdmUgTGl1IDxkYXZlbGl1QGZyZWVzY2FsZS5jb20+CisgKiBiYXNlZCBvbiB0aGUgY29udHJpYnV0aW9uIG9mIE1hcmlhbiBCYWxha293aWN6IDxtOEBzZW1paGFsZi5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjODN4eC5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX0REUl9FQ0MpICYmIGRlZmluZWQoQ09ORklHX0REUl9FQ0NfQ01EKQordm9pZCBlY2NfcHJpbnRfc3RhdHVzKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKwl2b2xhdGlsZSBkZHI4M3h4X3QgKmRkciA9ICZpbW1hcC0+ZGRyOworCisJcHJpbnRmKCJcbkVDQyBtb2RlOiAlc1xuXG4iLAorCSAgICAgICAoZGRyLT5zZHJhbV9jZmcgJiBTRFJBTV9DRkdfRUNDX0VOKSA/ICJPTiIgOiAiT0ZGIik7CisKKwkvKiBJbnRlcnJ1cHRzICovCisJcHJpbnRmKCJNZW1vcnkgRXJyb3IgSW50ZXJydXB0IEVuYWJsZTpcbiIpOworCXByaW50ZigiICBNdWx0aXBsZS1CaXQgRXJyb3IgSW50ZXJydXB0IEVuYWJsZTogJWRcbiIsCisJICAgICAgIChkZHItPmVycl9pbnRfZW4gJiBFQ0NfRVJSX0lOVF9FTl9NQkVFKSA/IDEgOiAwKTsKKwlwcmludGYoIiAgU2luZ2xlLUJpdCBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlOiAlZFxuIiwKKwkgICAgICAgKGRkci0+ZXJyX2ludF9lbiAmIEVDQ19FUlJfSU5UX0VOX1NCRUUpID8gMSA6IDApOworCXByaW50ZigiICBNZW1vcnkgU2VsZWN0IEVycm9yIEludGVycnVwdCBFbmFibGU6ICVkXG5cbiIsCisJICAgICAgIChkZHItPmVycl9pbnRfZW4gJiBFQ0NfRVJSX0lOVF9FTl9NU0VFKSA/IDEgOiAwKTsKKworCS8qIEVycm9yIGRpc2FibGUgKi8KKwlwcmludGYoIk1lbW9yeSBFcnJvciBEaXNhYmxlOlxuIik7CisJcHJpbnRmKCIgIE11bHRpcGxlLUJpdCBFcnJvciBEaXNhYmxlOiAlZFxuIiwKKwkgICAgICAgKGRkci0+ZXJyX2Rpc2FibGUgJiBFQ0NfRVJST1JfRElTQUJMRV9NQkVEKSA/IDEgOiAwKTsKKwlwcmludGYoIiAgU2lubGUtQml0IEVycm9yIERpc2FibGU6ICVkXG4iLAorCSAgICAgICAoZGRyLT5lcnJfZGlzYWJsZSAmIEVDQ19FUlJPUl9ESVNBQkxFX1NCRUQpID8gMSA6IDApOworCXByaW50ZigiICBNZW1vcnkgU2VsZWN0IEVycm9yIERpc2FibGU6ICVkXG5cbiIsCisJICAgICAgIChkZHItPmVycl9kaXNhYmxlICYgRUNDX0VSUk9SX0RJU0FCTEVfTVNFRCkgPyAxIDogMCk7CisKKwkvKiBFcnJvciBpbmplY3Rpb24gKi8KKwlwcmludGYoIk1lbW9yeSBEYXRhIFBhdGggRXJyb3IgSW5qZWN0aW9uIE1hc2sgSGlnaC9Mb3c6ICUwOGx4ICUwOGx4XG4iLAorCSAgICAgICBkZHItPmRhdGFfZXJyX2luamVjdF9oaSwgZGRyLT5kYXRhX2Vycl9pbmplY3RfbG8pOworCisJcHJpbnRmKCJNZW1vcnkgRGF0YSBQYXRoIEVycm9yIEluamVjdGlvbiBNYXNrIEVDQzpcbiIpOworCXByaW50ZigiICBFQ0MgTWlycm9yIEJ5dGU6ICVkXG4iLAorCSAgICAgICAoZGRyLT5lY2NfZXJyX2luamVjdCAmIEVDQ19FUlJfSU5KRUNUX0VNQikgPyAxIDogMCk7CisJcHJpbnRmKCIgIEVDQyBJbmplY3Rpb24gRW5hYmxlOiAlZFxuIiwKKwkgICAgICAgKGRkci0+ZWNjX2Vycl9pbmplY3QgJiBFQ0NfRVJSX0lOSkVDVF9FSUVOKSA/IDEgOiAwKTsKKwlwcmludGYoIiAgRUNDIEVycm9yIEluamVjdGlvbiBNYXNrOiAweCUwMnhcblxuIiwKKwkgICAgICAgZGRyLT5lY2NfZXJyX2luamVjdCAmIEVDQ19FUlJfSU5KRUNUX0VFSU0pOworCisJLyogU0JFIGNvdW50ZXIvdGhyZXNob2xkICovCisJcHJpbnRmKCJNZW1vcnkgU2luZ2xlLUJpdCBFcnJvciBNYW5hZ2VtZW50ICgwLi4yNTUpOlxuIik7CisJcHJpbnRmKCIgIFNpbmdsZS1CaXQgRXJyb3IgVGhyZXNob2xkOiAlZFxuIiwKKwkgICAgICAgKGRkci0+ZXJyX3NiZSAmIEVDQ19FUlJPUl9NQU5fU0JFVCkgPj4gRUNDX0VSUk9SX01BTl9TQkVUX1NISUZUKTsKKwlwcmludGYoIiAgU2luZ2xlLUJpdCBFcnJvciBDb3VudGVyOiAlZFxuXG4iLAorCSAgICAgICAoZGRyLT5lcnJfc2JlICYgRUNDX0VSUk9SX01BTl9TQkVDKSA+PiBFQ0NfRVJST1JfTUFOX1NCRUNfU0hJRlQpOworCisJLyogRXJyb3IgZGV0ZWN0ICovCisJcHJpbnRmKCJNZW1vcnkgRXJyb3IgRGV0ZWN0OlxuIik7CisJcHJpbnRmKCIgIE11bHRpcGxlIE1lbW9yeSBFcnJvcnM6ICVkXG4iLAorCSAgICAgICAoZGRyLT5lcnJfZGV0ZWN0ICYgRUNDX0VSUk9SX0RFVEVDVF9NTUUpID8gMSA6IDApOworCXByaW50ZigiICBNdWx0aXBsZS1CaXQgRXJyb3I6ICVkXG4iLAorCSAgICAgICAoZGRyLT5lcnJfZGV0ZWN0ICYgRUNDX0VSUk9SX0RFVEVDVF9NQkUpID8gMSA6IDApOworCXByaW50ZigiICBTaW5nbGUtQml0IEVycm9yOiAlZFxuIiwKKwkgICAgICAgKGRkci0+ZXJyX2RldGVjdCAmIEVDQ19FUlJPUl9ERVRFQ1RfU0JFKSA/IDEgOiAwKTsKKwlwcmludGYoIiAgTWVtb3J5IFNlbGVjdCBFcnJvcjogJWRcblxuIiwKKwkgICAgICAgKGRkci0+ZXJyX2RldGVjdCAmIEVDQ19FUlJPUl9ERVRFQ1RfTVNFKSA/IDEgOiAwKTsKKworCS8qIENhcHR1cmUgZGF0YSAqLworCXByaW50ZigiTWVtb3J5IEVycm9yIEFkZHJlc3MgQ2FwdHVyZTogMHglMDhseFxuIiwgZGRyLT5jYXB0dXJlX2FkZHJlc3MpOworCXByaW50ZigiTWVtb3J5IERhdGEgUGF0aCBSZWFkIENhcHR1cmUgSGlnaC9Mb3c6ICUwOGx4ICUwOGx4XG4iLAorCSAgICAgICBkZHItPmNhcHR1cmVfZGF0YV9oaSwgZGRyLT5jYXB0dXJlX2RhdGFfbG8pOworCXByaW50ZigiTWVtb3J5IERhdGEgUGF0aCBSZWFkIENhcHR1cmUgRUNDOiAweCUwMnhcblxuIiwKKwkgICAgICAgZGRyLT5jYXB0dXJlX2VjYyAmIENBUFRVUkVfRUNDX0VDRSk7CisKKwlwcmludGYoIk1lbW9yeSBFcnJvciBBdHRyaWJ1dGVzIENhcHR1cmU6XG4iKTsKKwlwcmludGYoIiBEYXRhIEJlYXQgTnVtYmVyOiAlZFxuIiwKKwkgICAgICAgKGRkci0+Y2FwdHVyZV9hdHRyaWJ1dGVzICYgRUNDX0NBUFRfQVRUUl9CTlVNKSA+PgorCSAgICAgICBFQ0NfQ0FQVF9BVFRSX0JOVU1fU0hJRlQpOworCXByaW50ZigiICBUcmFuc2FjdGlvbiBTaXplOiAlZFxuIiwKKwkgICAgICAgKGRkci0+Y2FwdHVyZV9hdHRyaWJ1dGVzICYgRUNDX0NBUFRfQVRUUl9UU0laKSA+PgorCSAgICAgICBFQ0NfQ0FQVF9BVFRSX1RTSVpfU0hJRlQpOworCXByaW50ZigiICBUcmFuc2FjdGlvbiBTb3VyY2U6ICVkXG4iLAorCSAgICAgICAoZGRyLT5jYXB0dXJlX2F0dHJpYnV0ZXMgJiBFQ0NfQ0FQVF9BVFRSX1RTUkMpID4+CisJICAgICAgIEVDQ19DQVBUX0FUVFJfVFNSQ19TSElGVCk7CisJcHJpbnRmKCIgIFRyYW5zYWN0aW9uIFR5cGU6ICVkXG4iLAorCSAgICAgICAoZGRyLT5jYXB0dXJlX2F0dHJpYnV0ZXMgJiBFQ0NfQ0FQVF9BVFRSX1RUWVApID4+CisJICAgICAgIEVDQ19DQVBUX0FUVFJfVFRZUF9TSElGVCk7CisJcHJpbnRmKCIgIEVycm9yIEluZm9ybWF0aW9uIFZhbGlkOiAlZFxuXG4iLAorCSAgICAgICBkZHItPmNhcHR1cmVfYXR0cmlidXRlcyAmIEVDQ19DQVBUX0FUVFJfVkxEKTsKK30KKworaW50IGRvX2VjYyhjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKKwl2b2xhdGlsZSBkZHI4M3h4X3QgKmRkciA9ICZpbW1hcC0+ZGRyOworCXZvbGF0aWxlIHUzMiB2YWw7CisJdTY0ICphZGRyOworCXUzMiBjb3VudDsKKwlyZWdpc3RlciB1NjQgKmk7CisJdTMyIHJldFsyXTsKKwl1MzIgcGF0dGVyblsyXTsKKwl1MzIgd3JpdGViYWNrWzJdOworCisJLyogVGhlIHBhdHRlcm4gaXMgd3JpdHRlbiBpbnRvIG1lbW9yeSB0byBnZW5lcmF0ZSBlcnJvciAqLworCXBhdHRlcm5bMF0gPSAweGZlZGNiYTk4VUw7CisJcGF0dGVyblsxXSA9IDB4NzY1NDMyMTBVTDsKKworCS8qIEFmdGVyIGluamVjdGluZyBlcnJvciwgcmUtaW5pdGlhbGl6ZSB0aGUgbWVtb3J5IHdpdGggdGhlIHZhbHVlICovCisJd3JpdGViYWNrWzBdID0gMHgwMTIzNDU2N1VMOworCXdyaXRlYmFja1sxXSA9IDB4ODlhYmNkZWZVTDsKKworCWlmIChhcmdjID4gNCkgeworCQlwcmludGYoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CisJCXJldHVybiAxOworCX0KKworCWlmIChhcmdjID09IDIpIHsKKwkJaWYgKHN0cmNtcChhcmd2WzFdLCAic3RhdHVzIikgPT0gMCkgeworCQkJZWNjX3ByaW50X3N0YXR1cygpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJjYXB0dXJlY2xlYXIiKSA9PSAwKSB7CisJCQlkZHItPmNhcHR1cmVfYWRkcmVzcyA9IDA7CisJCQlkZHItPmNhcHR1cmVfZGF0YV9oaSA9IDA7CisJCQlkZHItPmNhcHR1cmVfZGF0YV9sbyA9IDA7CisJCQlkZHItPmNhcHR1cmVfZWNjID0gMDsKKwkJCWRkci0+Y2FwdHVyZV9hdHRyaWJ1dGVzID0gMDsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWlmIChhcmdjID09IDMpIHsKKwkJaWYgKHN0cmNtcChhcmd2WzFdLCAic2JlY250IikgPT0gMCkgeworCQkJdmFsID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTApOworCQkJaWYgKHZhbCA+IDI1NSkgeworCQkJCXByaW50ZigiSW5jb3JyZWN0IENvdW50ZXIgdmFsdWUsICIKKwkJCQkgICAgICAgInNob3VsZCBiZSAwLi4yNTVcbiIpOworCQkJCXJldHVybiAxOworCQkJfQorCisJCQl2YWwgPSAodmFsIDw8IEVDQ19FUlJPUl9NQU5fU0JFQ19TSElGVCk7CisJCQl2YWwgfD0gKGRkci0+ZXJyX3NiZSAmIEVDQ19FUlJPUl9NQU5fU0JFVCk7CisKKwkJCWRkci0+ZXJyX3NiZSA9IHZhbDsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAic2JldGhyIikgPT0gMCkgeworCQkJdmFsID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTApOworCQkJaWYgKHZhbCA+IDI1NSkgeworCQkJCXByaW50ZigiSW5jb3JyZWN0IENvdW50ZXIgdmFsdWUsICIKKwkJCQkgICAgICAgInNob3VsZCBiZSAwLi4yNTVcbiIpOworCQkJCXJldHVybiAxOworCQkJfQorCisJCQl2YWwgPSAodmFsIDw8IEVDQ19FUlJPUl9NQU5fU0JFVF9TSElGVCk7CisJCQl2YWwgfD0gKGRkci0+ZXJyX3NiZSAmIEVDQ19FUlJPUl9NQU5fU0JFQyk7CisKKwkJCWRkci0+ZXJyX3NiZSA9IHZhbDsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiZXJyZGlzYWJsZSIpID09IDApIHsKKwkJCXZhbCA9IGRkci0+ZXJyX2Rpc2FibGU7CisKKwkJCWlmIChzdHJjbXAoYXJndlsyXSwgIitzYmUiKSA9PSAwKSB7CisJCQkJdmFsIHw9IEVDQ19FUlJPUl9ESVNBQkxFX1NCRUQ7CisJCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiK21iZSIpID09IDApIHsKKwkJCQl2YWwgfD0gRUNDX0VSUk9SX0RJU0FCTEVfTUJFRDsKKwkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICIrbXNlIikgPT0gMCkgeworCQkJCXZhbCB8PSBFQ0NfRVJST1JfRElTQUJMRV9NU0VEOworCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIithbGwiKSA9PSAwKSB7CisJCQkJdmFsIHw9IChFQ0NfRVJST1JfRElTQUJMRV9TQkVEIHwKKwkJCQkJRUNDX0VSUk9SX0RJU0FCTEVfTUJFRCB8CisJCQkJCUVDQ19FUlJPUl9ESVNBQkxFX01TRUQpOworCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIi1zYmUiKSA9PSAwKSB7CisJCQkJdmFsICY9IH5FQ0NfRVJST1JfRElTQUJMRV9TQkVEOworCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIi1tYmUiKSA9PSAwKSB7CisJCQkJdmFsICY9IH5FQ0NfRVJST1JfRElTQUJMRV9NQkVEOworCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIi1tc2UiKSA9PSAwKSB7CisJCQkJdmFsICY9IH5FQ0NfRVJST1JfRElTQUJMRV9NU0VEOworCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIi1hbGwiKSA9PSAwKSB7CisJCQkJdmFsICY9IH4oRUNDX0VSUk9SX0RJU0FCTEVfU0JFRCB8CisJCQkJCSBFQ0NfRVJST1JfRElTQUJMRV9NQkVEIHwKKwkJCQkJIEVDQ19FUlJPUl9ESVNBQkxFX01TRUQpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGYoIkluY29ycmVjdCBlcnJfZGlzYWJsZSBmaWVsZFxuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJCWRkci0+ZXJyX2Rpc2FibGUgPSB2YWw7CisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOworCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImlzeW5jIik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImVycmRldGVjdGNsciIpID09IDApIHsKKwkJCXZhbCA9IGRkci0+ZXJyX2RldGVjdDsKKworCQkJaWYgKHN0cmNtcChhcmd2WzJdLCAibW1lIikgPT0gMCkgeworCQkJCXZhbCB8PSBFQ0NfRVJST1JfREVURUNUX01NRTsKKwkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICJzYmUiKSA9PSAwKSB7CisJCQkJdmFsIHw9IEVDQ19FUlJPUl9ERVRFQ1RfU0JFOworCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIm1iZSIpID09IDApIHsKKwkJCQl2YWwgfD0gRUNDX0VSUk9SX0RFVEVDVF9NQkU7CisJCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAibXNlIikgPT0gMCkgeworCQkJCXZhbCB8PSBFQ0NfRVJST1JfREVURUNUX01TRTsKKwkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICJhbGwiKSA9PSAwKSB7CisJCQkJdmFsIHw9IChFQ0NfRVJST1JfREVURUNUX01NRSB8CisJCQkJCUVDQ19FUlJPUl9ERVRFQ1RfTUJFIHwKKwkJCQkJRUNDX0VSUk9SX0RFVEVDVF9TQkUgfAorCQkJCQlFQ0NfRVJST1JfREVURUNUX01TRSk7CisJCQl9IGVsc2UgeworCQkJCXByaW50ZigiSW5jb3JyZWN0IGVycl9kZXRlY3QgZmllbGRcbiIpOworCQkJCXJldHVybiAxOworCQkJfQorCisJCQlkZHItPmVycl9kZXRlY3QgPSB2YWw7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImluamVjdGRhdGFoaSIpID09IDApIHsKKwkJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKKworCQkJZGRyLT5kYXRhX2Vycl9pbmplY3RfaGkgPSB2YWw7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImluamVjdGRhdGFsbyIpID09IDApIHsKKwkJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKKworCQkJZGRyLT5kYXRhX2Vycl9pbmplY3RfbG8gPSB2YWw7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImluamVjdGVjYyIpID09IDApIHsKKwkJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKKwkJCWlmICh2YWwgPiAweGZmKSB7CisJCQkJcHJpbnRmKCJJbmNvcnJlY3QgRUNDIGluamVjdCBtYXNrLCAiCisJCQkJICAgICAgICJzaG91bGQgYmUgMHgwMC4uMHhmZlxuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQl2YWwgfD0gKGRkci0+ZWNjX2Vycl9pbmplY3QgJiB+RUNDX0VSUl9JTkpFQ1RfRUVJTSk7CisKKwkJCWRkci0+ZWNjX2Vycl9pbmplY3QgPSB2YWw7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImluamVjdCIpID09IDApIHsKKwkJCXZhbCA9IGRkci0+ZWNjX2Vycl9pbmplY3Q7CisKKwkJCWlmIChzdHJjbXAoYXJndlsyXSwgImVuIikgPT0gMCkKKwkJCQl2YWwgfD0gRUNDX0VSUl9JTkpFQ1RfRUlFTjsKKwkJCWVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiZGlzIikgPT0gMCkKKwkJCQl2YWwgJj0gfkVDQ19FUlJfSU5KRUNUX0VJRU47CisJCQllbHNlCisJCQkJcHJpbnRmKCJJbmNvcnJlY3QgY29tbWFuZFxuIik7CisKKwkJCWRkci0+ZWNjX2Vycl9pbmplY3QgPSB2YWw7CisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOworCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImlzeW5jIik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIm1pcnJvciIpID09IDApIHsKKwkJCXZhbCA9IGRkci0+ZWNjX2Vycl9pbmplY3Q7CisKKwkJCWlmIChzdHJjbXAoYXJndlsyXSwgImVuIikgPT0gMCkKKwkJCQl2YWwgfD0gRUNDX0VSUl9JTkpFQ1RfRU1COworCQkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICJkaXMiKSA9PSAwKQorCQkJCXZhbCAmPSB+RUNDX0VSUl9JTkpFQ1RfRU1COworCQkJZWxzZQorCQkJCXByaW50ZigiSW5jb3JyZWN0IGNvbW1hbmRcbiIpOworCisJCQlkZHItPmVjY19lcnJfaW5qZWN0ID0gdmFsOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJaWYgKGFyZ2MgPT0gNCkgeworCQlpZiAoc3RyY21wKGFyZ3ZbMV0sICJ0ZXN0ZHciKSA9PSAwKSB7CisJCQlhZGRyID0gKHU2NCAqKSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxNik7CisJCQljb3VudCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDE2KTsKKworCQkJaWYgKCh1MzIpIGFkZHIgJSA4KSB7CisJCQkJcHJpbnRmKCJBZGRyZXNzIG5vdCBhbGxpZ25lZCBvbiAiCisJCQkJICAgICAgICJkb3VibGUgd29yZCBib3VuZGFyeVxuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlkaXNhYmxlX2ludGVycnVwdHMoKTsKKworCQkJZm9yIChpID0gYWRkcjsgaSA8IGFkZHIgKyBjb3VudDsgaSsrKSB7CisKKwkJCQkvKiBlbmFibGUgaW5qZWN0cyAqLworCQkJCWRkci0+ZWNjX2Vycl9pbmplY3QgfD0gRUNDX0VSUl9JTkpFQ1RfRUlFTjsKKwkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOworCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJpc3luYyIpOworCisJCQkJLyogd3JpdGUgbWVtb3J5IGxvY2F0aW9uIGluamVjdGluZyBlcnJvcnMgKi8KKwkJCQlwcGNEV3N0b3JlKCh1MzIgKikgaSwgcGF0dGVybik7CisJCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsKKworCQkJCS8qIGRpc2FibGUgaW5qZWN0cyAqLworCQkJCWRkci0+ZWNjX2Vycl9pbmplY3QgJj0gfkVDQ19FUlJfSU5KRUNUX0VJRU47CisJCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsKKwkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiaXN5bmMiKTsKKworCQkJCS8qIHJlYWQgZGF0YSwgdGhpcyBnZW5lcmF0ZXMgRUNDIGVycm9yICovCisJCQkJcHBjRFdsb2FkKCh1MzIgKikgaSwgcmV0KTsKKwkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOworCisJCQkJLyogcmUtaW5pdGlhbGl6ZSBtZW1vcnksIGRvdWJsZSB3b3JkIHdyaXRlIHRoZSBsb2NhdGlvbiBhZ2FpbiwKKwkJCQkgKiBnZW5lcmF0ZXMgbmV3IEVDQyBjb2RlIHRoaXMgdGltZSAqLworCQkJCXBwY0RXc3RvcmUoKHUzMiAqKSBpLCB3cml0ZWJhY2spOworCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7CisJCQl9CisJCQllbmFibGVfaW50ZXJydXB0cygpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKHN0cmNtcChhcmd2WzFdLCAidGVzdHdvcmQiKSA9PSAwKSB7CisJCQlhZGRyID0gKHU2NCAqKSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxNik7CisJCQljb3VudCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDE2KTsKKworCQkJaWYgKCh1MzIpIGFkZHIgJSA4KSB7CisJCQkJcHJpbnRmKCJBZGRyZXNzIG5vdCBhbGxpZ25lZCBvbiAiCisJCQkJICAgICAgICJkb3VibGUgd29yZCBib3VuZGFyeVxuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlkaXNhYmxlX2ludGVycnVwdHMoKTsKKworCQkJZm9yIChpID0gYWRkcjsgaSA8IGFkZHIgKyBjb3VudDsgaSsrKSB7CisKKwkJCQkvKiBlbmFibGUgaW5qZWN0cyAqLworCQkJCWRkci0+ZWNjX2Vycl9pbmplY3QgfD0gRUNDX0VSUl9JTkpFQ1RfRUlFTjsKKwkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOworCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJpc3luYyIpOworCisJCQkJLyogd3JpdGUgbWVtb3J5IGxvY2F0aW9uIGluamVjdGluZyBlcnJvcnMgKi8KKwkJCQkqKHUzMiAqKSBpID0gMHhmZWRjYmE5OFVMOworCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7CisKKwkJCQkvKiBzdWIgZG91YmxlIHdvcmQgd3JpdGUsCisJCQkJICogYnVzIHdpbGwgcmVhZC1tb2RpZnktd3JpdGUsCisJCQkJICogZ2VuZXJhdGVzIEVDQyBlcnJvciAqLworCQkJCSooKHUzMiAqKSBpICsgMSkgPSAweDc2NTQzMjEwVUw7CisJCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsKKworCQkJCS8qIGRpc2FibGUgaW5qZWN0cyAqLworCQkJCWRkci0+ZWNjX2Vycl9pbmplY3QgJj0gfkVDQ19FUlJfSU5KRUNUX0VJRU47CisJCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsKKwkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiaXN5bmMiKTsKKworCQkJCS8qIHJlLWluaXRpYWxpemUgbWVtb3J5LAorCQkJCSAqIGRvdWJsZSB3b3JkIHdyaXRlIHRoZSBsb2NhdGlvbiBhZ2FpbiwKKwkJCQkgKiBnZW5lcmF0ZXMgbmV3IEVDQyBjb2RlIHRoaXMgdGltZSAqLworCQkJCXBwY0RXc3RvcmUoKHUzMiAqKSBpLCB3cml0ZWJhY2spOworCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7CisJCQl9CisJCQllbmFibGVfaW50ZXJydXB0cygpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcHJpbnRmKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOworCXJldHVybiAxOworfQorCitVX0JPT1RfQ01EKGVjYywgNCwgMCwgZG9fZWNjLAorCSAgICJlY2MgICAgIC0gc3VwcG9ydCBmb3IgRERSIEVDQyBmZWF0dXJlc1xuIiwKKwkgICAic3RhdHVzICAgICAgICAgICAgICAtIHByaW50IG91dCBzdGF0dXMgaW5mb1xuIgorCSAgICJlY2MgY2FwdHVyZWNsZWFyICAgICAgICAtIGNsZWFyIGNhcHR1cmUgcmVncyBkYXRhXG4iCisJICAgImVjYyBzYmVjbnQgPHZhbD4gICAgICAgIC0gc2V0IFNpbmdsZS1CaXQgRXJyb3IgY291bnRlclxuIgorCSAgICJlY2Mgc2JldGhyIDx2YWw+ICAgICAgICAtIHNldCBTaW5nbGUtQml0IFRocmVzaG9sZFxuIgorCSAgICJlY2MgZXJyZGlzYWJsZSA8ZmxhZz4gICAtIGNsZWFyL3NldCBkaXNhYmxlIE1lbW9yeSBFcnJvciBEaXNhYmxlLCBmbGFnOlxuIgorCSAgICIgIFstfCtdc2JlIC0gU2luZ2xlLUJpdCBFcnJvclxuIgorCSAgICIgIFstfCtdbWJlIC0gTXVsdGlwbGUtQml0IEVycm9yXG4iCisJICAgIiAgWy18K11tc2UgLSBNZW1vcnkgU2VsZWN0IEVycm9yXG4iCisJICAgIiAgWy18K11hbGwgLSBhbGwgZXJyb3JzXG4iCisJICAgImVjYyBlcnJkZXRlY3RjbHIgPGZsYWc+IC0gY2xlYXIgTWVtb3J5IEVycm9yIERldGVjdCwgZmxhZzpcbiIKKwkgICAiICBtbWUgLSBNdWx0aXBsZSBNZW1vcnkgRXJyb3JzXG4iCisJICAgIiAgc2JlIC0gU2luZ2xlLUJpdCBFcnJvclxuIgorCSAgICIgIG1iZSAtIE11bHRpcGxlLUJpdCBFcnJvclxuIgorCSAgICIgIG1zZSAtIE1lbW9yeSBTZWxlY3QgRXJyb3JcbiIKKwkgICAiICBhbGwgLSBhbGwgZXJyb3JzXG4iCisJICAgImVjYyBpbmplY3RkYXRhaGkgPGhpPiAgLSBzZXQgTWVtb3J5IERhdGEgUGF0aCBFcnJvciBJbmplY3Rpb24gTWFzayBIaWdoXG4iCisJICAgImVjYyBpbmplY3RkYXRhbG8gPGxvPiAgLSBzZXQgTWVtb3J5IERhdGEgUGF0aCBFcnJvciBJbmplY3Rpb24gTWFzayBMb3dcbiIKKwkgICAiZWNjIGluamVjdGVjYyA8ZWNjPiAgICAtIHNldCBFQ0MgRXJyb3IgSW5qZWN0aW9uIE1hc2tcbiIKKwkgICAiZWNjIGluamVjdCA8ZW58ZGlzPiAgICAtIGVuYWJsZS9kaXNhYmxlIGVycm9yIGluamVjdGlvblxuIgorCSAgICJlY2MgbWlycm9yIDxlbnxkaXM+ICAgIC0gZW5hYmxlL2Rpc2FibGUgbWlycm9yIGJ5dGVcbiIKKwkgICAiZWNjIHRlc3RkdyA8YWRkcj4gPGNudD4gIC0gdGVzdCBtZW0gcmVnaW9uIHdpdGggZG91YmxlIHdvcmQgYWNjZXNzOlxuIgorCSAgICIgIC0gZW5hYmxlcyBpbmplY3RzXG4iCisJICAgIiAgLSB3cml0ZXMgcGF0dGVybiBpbmplY3RpbmcgZXJyb3JzIHdpdGggZG91YmxlIHdvcmQgYWNjZXNzXG4iCisJICAgIiAgLSBkaXNhYmxlcyBpbmplY3RzXG4iCisJICAgIiAgLSByZWFkcyBwYXR0ZXJuIGJhY2sgd2l0aCBkb3VibGUgd29yZCBhY2Nlc3MsIGdlbmVyYXRlcyBlcnJvclxuIgorCSAgICIgIC0gcmUtaW5pdHMgbWVtb3J5XG4iCisJICAgImVjYyB0ZXN0d29yZCA8YWRkcj4gPGNudD4gIC0gdGVzdCBtZW0gcmVnaW9uIHdpdGggd29yZCBhY2Nlc3M6XG4iCisJICAgIiAgLSBlbmFibGVzIGluamVjdHNcbiIKKwkgICAiICAtIHdyaXRlcyBwYXR0ZXJuIGluamVjdGluZyBlcnJvcnMgd2l0aCB3b3JkIGFjY2Vzc1xuIgorCSAgICIgIC0gd3JpdGVzIHBhdHRlcm4gd2l0aCB3b3JkIGFjY2VzcywgZ2VuZXJhdGVzIGVycm9yXG4iCisJICAgIiAgLSBkaXNhYmxlcyBpbmplY3RzXG4iICIgIC0gcmUtaW5pdHMgbWVtb3J5Iik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9tcGM4M3h4L2ludGVycnVwdHMuYyBiL2NwdS9tcGM4M3h4L2ludGVycnVwdHMuYwppbmRleCBiYjFmZTFhLi45OGVkMjFjIDEwMDY0NAotLS0gYS9jcHUvbXBjODN4eC9pbnRlcnJ1cHRzLmMKKysrIGIvY3B1L21wYzgzeHgvaW50ZXJydXB0cy5jCkBAIC04MSw3ICs4MSw3IEBACiB9CiAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lSUSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSVJRKQogCiAvKiByaXBwZWQgdGhpcyBvdXQgb2YgcHBjNHh4L2ludGVycnVwdHMuYyAqLwogCkBAIC05NCw0ICs5NCw0IEBACiB7CiB9CiAKLSNlbmRpZgkJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JUlEgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L21wYzgzeHgvcGNpLmMgYi9jcHUvbXBjODN4eC9wY2kuYwppbmRleCA3ODVkNjEyLi4yMjk4MjE4IDEwMDY0NAotLS0gYS9jcHUvbXBjODN4eC9wY2kuYworKysgYi9jcHUvbXBjODN4eC9wY2kuYwpAQCAtMjUsNyArMjUsMTQgQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPHBjaS5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfT0ZfTElCRkRUKQorI2luY2x1ZGUgPGxpYmZkdC5oPgorI2luY2x1ZGUgPGxpYmZkdF9lbnYuaD4KKyNlbGlmIGRlZmluZWQoQ09ORklHX09GX0ZMQVRfVFJFRSkKICNpbmNsdWRlIDxmdF9idWlsZC5oPgorI2VuZGlmCisKICNpbmNsdWRlIDxhc20vbXBjODM0OV9wY2kuaD4KIAogI2lmZGVmIENPTkZJR184M1hYX0dFTkVSSUNfUENJCkBAIC0xNjMsNyArMTcwLDM0IEBACiAJCXBjaV9pbml0X2J1cyhpLCByZWdbaV0pOwogfQogCi0jaWZkZWYgQ09ORklHX09GX0ZMQVRfVFJFRQorI2lmIGRlZmluZWQoQ09ORklHX09GX0xJQkZEVCkKK3ZvaWQgZnRfcGNpX3NldHVwKHZvaWQgKmJsb2IsIGJkX3QgKmJkKQoreworCWludCBub2Rlb2Zmc2V0OworCWludCBlcnI7CisJaW50IHRtcFsyXTsKKworCWlmIChwY2lfbnVtX2J1c2VzIDwgMSkKKwkJcmV0dXJuOworCisJbm9kZW9mZnNldCA9IGZkdF9maW5kX25vZGVfYnlfcGF0aChibG9iLCAiLyIgT0ZfU09DICIvcGNpQDg1MDAiKTsKKwlpZiAobm9kZW9mZnNldCA+PSAwKSB7CisJCXRtcFswXSA9IGNwdV90b19iZTMyKHBjaV9ob3NlWzBdLmZpcnN0X2J1c25vKTsKKwkJdG1wWzFdID0gY3B1X3RvX2JlMzIocGNpX2hvc2VbMF0ubGFzdF9idXNubyk7CisJCWVyciA9IGZkdF9zZXRwcm9wKGJsb2IsIG5vZGVvZmZzZXQsICJidXMtcmFuZ2UiLCB0bXAsIHNpemVvZih0bXApKTsKKwl9CisKKwlpZiAocGNpX251bV9idXNlcyA8IDIpCisJCXJldHVybjsKKworCW5vZGVvZmZzZXQgPSBmZHRfZmluZF9ub2RlX2J5X3BhdGgoYmxvYiwgIi8iIE9GX1NPQyAiL3BjaUA4NjAwIik7CisJaWYgKG5vZGVvZmZzZXQgPj0gMCkgeworCQl0bXBbMF0gPSBjcHVfdG9fYmUzMihwY2lfaG9zZVswXS5maXJzdF9idXNubyk7CisJCXRtcFsxXSA9IGNwdV90b19iZTMyKHBjaV9ob3NlWzBdLmxhc3RfYnVzbm8pOworCQllcnIgPSBmZHRfc2V0cHJvcChibG9iLCBub2Rlb2Zmc2V0LCAiYnVzLXJhbmdlIiwgdG1wLCBzaXplb2YodG1wKSk7CisJfQorfQorI2VsaWYgQ09ORklHX09GX0ZMQVRfVFJFRQogdm9pZCBmdF9wY2lfc2V0dXAodm9pZCAqYmxvYiwgYmRfdCAqYmQpCiB7CiAJdTMyICpwOwpkaWZmIC0tZ2l0IGEvY3B1L21wYzgzeHgvc3BkX3NkcmFtLmMgYi9jcHUvbXBjODN4eC9zcGRfc2RyYW0uYwppbmRleCA2NDc4MTNmLi41NGYwYzgzIDEwMDY0NAotLS0gYS9jcHUvbXBjODN4eC9zcGRfc2RyYW0uYworKysgYi9jcHUvbXBjODN4eC9zcGRfc2RyYW0uYwpAQCAtNTc0LDcgKzU3NCwxMCBAQAogCiAJLyogQ2hlY2sgRElNTSBkYXRhIGJ1cyB3aWR0aCAqLwogCWlmIChzcGQuZGF0YXdfbHNiID09IDB4MjApIHsKLQkJYnVyc3RsZW4gPSAweDAzOyAvKiAzMiBiaXQgZGF0YSBidXMsIGJ1cnN0IGxlbiBpcyA4ICovCisJCWlmIChzcGQubWVtX3R5cGUgPT0gU1BEX01FTVRZUEVfRERSKQorCQkJYnVyc3RsZW4gPSAweDAzOyAvKiAzMiBiaXQgZGF0YSBidXMsIGJ1cnN0IGxlbiBpcyA4ICovCisJCWVsc2UKKwkJCWJ1cnN0bGVuID0gMHgwMjsgLyogMzIgYml0IGRhdGEgYnVzLCBidXJzdCBsZW4gaXMgNCAqLwogCQlwcmludGYoIlxuICAgRERSIERJTU06IGRhdGEgYnVzIHdpZHRoIGlzIDMyIGJpdCIpOwogCX0gZWxzZSB7CiAJCWJ1cnN0bGVuID0gMHgwMjsgLyogT3RoZXJzIGFjdCBhcyA2NCBiaXQgYnVzLCBidXJzdCBsZW4gaXMgNCAqLwpAQCAtNzMwLDggKzczMywxMiBAQAogCQlzZHJhbV9jZmcgfD0gMHgxMDAwMDAwMDsKIAogCS8qIFRoZSBESU1NIGlzIDMyYml0IHdpZHRoICovCi0JaWYgKHNwZC5kYXRhd19sc2IgPT0gMHgyMCkKLQkJc2RyYW1fY2ZnIHw9IDB4MDAwQzAwMDA7CisJaWYgKHNwZC5kYXRhd19sc2IgPT0gMHgyMCkgeworCQlpZiAoc3BkLm1lbV90eXBlID09IFNQRF9NRU1UWVBFX0REUikKKwkJCXNkcmFtX2NmZyB8PSAweDAwMEMwMDAwOworCQlpZiAoc3BkLm1lbV90eXBlID09IFNQRF9NRU1UWVBFX0REUjIpCisJCQlzZHJhbV9jZmcgfD0gMHgwMDA4MDAwMDsKKwl9CiAKIAlkZHJjX2VjY19lbmFibGUgPSAwOwogCmRpZmYgLS1naXQgYS9jcHUvbXBjODN4eC9zdGFydC5TIGIvY3B1L21wYzgzeHgvc3RhcnQuUwppbmRleCA2ZWU5ZWM5Li40OTZjOGE1IDEwMDY0NAotLS0gYS9jcHUvbXBjODN4eC9zdGFydC5TCisrKyBiL2NwdS9tcGM4M3h4L3N0YXJ0LlMKQEAgLTI2Myw3ICsyNjMsNyBAQAogLyogQWxpZ25tZW50IGV4Y2VwdGlvbi4gKi8KIAkuID0gMHg2MDAKIEFsaWdubWVudDoKLQlFWENFUFRJT05fUFJPTE9HCisJRVhDRVBUSU9OX1BST0xPRyhTUlIwLCBTUlIxKQogCW1mc3ByCXI0LERBUgogCXN0dwlyNCxfREFSKHIyMSkKIAltZnNwcglyNSxEU0lTUgpAQCAtMjgyLDcgKzI4Miw3IEBACiAvKiBQcm9ncmFtIGNoZWNrIGV4Y2VwdGlvbiAqLwogCS4gPSAweDcwMAogUHJvZ3JhbUNoZWNrOgotCUVYQ0VQVElPTl9QUk9MT0cKKwlFWENFUFRJT05fUFJPTE9HKFNSUjAsIFNSUjEpCiAJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAogCWxpCXIyMCxNU1JfS0VSTkVMCiAJcmx3aW1pCXIyMCxyMjMsMCwxNiwxNgkJLyogY29weSBFRSBiaXQgZnJvbSBzYXZlZCBNU1IgKi8KZGlmZiAtLWdpdCBhL2NwdS9tcGM4M3h4L3RyYXBzLmMgYi9jcHUvbXBjODN4eC90cmFwcy5jCmluZGV4IDE1MmZhNzMuLmRmZDZjMDMgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4M3h4L3RyYXBzLmMKKysrIGIvY3B1L21wYzgzeHgvdHJhcHMuYwpAQCAtMTQwLDcgKzE0MCw3IEBACiAJCXJldHVybjsKIAl9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0xNzYsNyArMTc2LDcgQEAKIHZvaWQKIEFsaWdubWVudEV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0xODgsNyArMTg4LDcgQEAKIHZvaWQKIFByb2dyYW1DaGVja0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0yMDAsNyArMjAwLDcgQEAKIHZvaWQKIFNvZnRFbXVFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMjEzLDcgKzIxMyw3IEBACiB2b2lkCiBVbmtub3duRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTIyMiw3ICsyMjIsNyBAQAogCV9leGNlcHRpb24oMCwgcmVncyk7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CRURCVUcpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JFREJVRykKIGV4dGVybiB2b2lkIGRvX2JlZGJ1Z19icmVha3BvaW50KHN0cnVjdCBwdF9yZWdzICopOwogI2VuZGlmCiAKQEAgLTIzMSw3ICsyMzEsNyBAQAogewogCXByaW50ZigiRGVidWdnZXIgdHJhcCBhdCBAICVseFxuIiwgcmVncy0+bmlwICk7CiAJc2hvd19yZWdzKHJlZ3MpOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogCWRvX2JlZGJ1Z19icmVha3BvaW50KCByZWdzICk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2NwdS9tcGM4M3h4L3UtYm9vdC5sZHMgYi9jcHUvbXBjODN4eC91LWJvb3QubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNjYzYmMKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvbXBjODN4eC91LWJvb3QubGRzCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA2CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9BUkNIKHBvd2VycGMpCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9ICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQorICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KKyAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KKyAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KKyAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQorICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQorICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9CisgIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9CisgIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQorICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9CisgIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQorICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9CisgIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KKyAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KKyAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQorICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQorICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KKyAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQorICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KKyAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQorICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQorICAucGx0IDogeyAqKC5wbHQpIH0KKyAgLnRleHQgICAgICA6CisgIHsKKyAgICBjcHUvbXBjODN4eC9zdGFydC5vCSgudGV4dCkKKyAgICAqKC50ZXh0KQorICAgICooLmdvdDEpCisgICAgLiA9IEFMSUdOKDE2KTsKKyAgICAqKC5yb2RhdGEpCisgICAgKigucm9kYXRhMSkKKyAgICAqKC5yb2RhdGEuc3RyMS40KQorICAgICooLmVoX2ZyYW1lKQorICB9CisgIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKKyAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQorICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9CisKKyAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCisgIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOworICBfZXJvdGV4dCA9IC47CisgIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKKyAgLnJlbG9jICAgOgorICB7CisgICAgKiguZ290KQorICAgIF9HT1QyX1RBQkxFXyA9IC47CisgICAgKiguZ290MikKKyAgICBfRklYVVBfVEFCTEVfID0gLjsKKyAgICAqKC5maXh1cCkKKyAgfQorICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOworICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7CisKKyAgLmRhdGEgICAgOgorICB7CisgICAgKiguZGF0YSkKKyAgICAqKC5kYXRhMSkKKyAgICAqKC5zZGF0YSkKKyAgICAqKC5zZGF0YTIpCisgICAgKiguZHluYW1pYykKKyAgICBDT05TVFJVQ1RPUlMKKyAgfQorICBfZWRhdGEgID0gIC47CisgIFBST1ZJREUgKGVkYXRhID0gLik7CisKKyAgLiA9IC47CisgIF9fdV9ib290X2NtZF9zdGFydCA9IC47CisgIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9CisgIF9fdV9ib290X2NtZF9lbmQgPSAuOworCisKKyAgLiA9IC47CisgIF9fc3RhcnRfX19leF90YWJsZSA9IC47CisgIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQorICBfX3N0b3BfX19leF90YWJsZSA9IC47CisKKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRfYmVnaW4gPSAuOworICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KKyAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19pbml0X2VuZCA9IC47CisKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgIDoKKyAgeworICAgKiguc2JzcykgKiguc2NvbW1vbikKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICB9CisgIF9lbmQgPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7Cit9CitFTlRSWShfc3RhcnQpCmRpZmYgLS1naXQgYS9jcHUvbXBjODV4eC9jcHUuYyBiL2NwdS9tcGM4NXh4L2NwdS5jCmluZGV4IDc3MzVhNTIuLjFkNzkxYzkgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4NXh4L2NwdS5jCisrKyBiL2NwdS9tcGM4NXh4L2NwdS5jCkBAIC0yODAsNyArMjgwLDcgQEAKIAlpZiAocCAhPSBOVUxMKQogCQkqcCA9IGNwdV90b19iZTMyKGNsb2NrKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX01QQzg1WFhfVFNFQzEpCisjaWYgZGVmaW5lZChDT05GSUdfVFNFQzEpCiAJcCA9IGZ0X2dldF9wcm9wKGJsb2IsICIvIiBPRl9TT0MgIi9ldGhlcm5ldEAyNDAwMC9tYWMtYWRkcmVzcyIsICZsZW4pOwogCWlmIChwKQogCQltZW1jcHkocCwgYmQtPmJpX2VuZXRhZGRyLCA2KTsKZGlmZiAtLWdpdCBhL2NwdS9tcGM4NXh4L2V0aGVyX2ZjYy5jIGIvY3B1L21wYzg1eHgvZXRoZXJfZmNjLmMKaW5kZXggZDE1ZDI0Mi4uNWIyM2E4MCAxMDA2NDQKLS0tIGEvY3B1L21wYzg1eHgvZXRoZXJfZmNjLmMKKysrIGIvY3B1L21wYzg1eHgvZXRoZXJfZmNjLmMKQEAgLTQ4LDEzICs0OCwxMyBAQAogI2luY2x1ZGUgPGNvbmZpZy5oPgogI2luY2x1ZGUgPG5ldC5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCisjaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogI2luY2x1ZGUgPG1paXBoeS5oPgogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19DUE0yKQogCi0jaWYgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkNDKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIFwKKyNpZiBkZWZpbmVkKENPTkZJR19FVEhFUl9PTl9GQ0MpICYmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmIFwKIAlkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpCiAKIHN0YXRpYyBzdHJ1Y3QgZXRoZXJfZmNjX2luZm9fcwpAQCAtNDU4LDcgKzQ1OCw3IEBACiAKIAkJZXRoX3JlZ2lzdGVyKGRldik7CiAKLSNpZiAoZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpKSBcCisjaWYgKGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkpIFwKIAkJJiYgZGVmaW5lZChDT05GSUdfQklUQkFOR01JSSkKIAkJbWlpcGh5X3JlZ2lzdGVyKGRldi0+bmFtZSwKIAkJCQliYl9taWlwaHlfcmVhZCwJYmJfbWlpcGh5X3dyaXRlKTsKQEAgLTQ2OCw2ICs0NjgsNiBAQAogCXJldHVybiAxOwogfQogCi0jZW5kaWYJLyogQ09ORklHX0VUSEVSX09OX0ZDQyAmJiBDRkdfQ01EX05FVCAmJiBDT05GSUdfTkVUX01VTFRJICovCisjZW5kaWYKIAogI2VuZGlmIC8qIENPTkZJR19DUE0yICovCmRpZmYgLS1naXQgYS9jcHUvbXBjODV4eC9pbnRlcnJ1cHRzLmMgYi9jcHUvbXBjODV4eC9pbnRlcnJ1cHRzLmMKaW5kZXggODMyNzgxYi4uZGMyNDZkYyAxMDA2NDQKLS0tIGEvY3B1L21wYzg1eHgvaW50ZXJydXB0cy5jCisrKyBiL2NwdS9tcGM4NXh4L2ludGVycnVwdHMuYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAJdGltZXN0YW1wID0gdDsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lSUSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSVJRKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTE1OSw0ICsxNTksNCBAQAogCXJldHVybiAwOwogfQogCi0jZW5kaWYgIC8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSVJRICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9tcGM4NXh4L3N0YXJ0LlMgYi9jcHUvbXBjODV4eC9zdGFydC5TCmluZGV4IDIwYzdlYmMuLjc3YzE1NWMgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4NXh4L3N0YXJ0LlMKKysrIGIvY3B1L21wYzg1eHgvc3RhcnQuUwpAQCAtNDU3LDcgKzQ1Nyw3IEBACiAvKiBBbGlnbm1lbnQgZXhjZXB0aW9uLiAqLwogCS4gPSAweDA2MDAKIEFsaWdubWVudDoKLQlFWENFUFRJT05fUFJPTE9HCisJRVhDRVBUSU9OX1BST0xPRyhTUlIwLCBTUlIxKQogCW1mc3ByCXI0LERBUgogCXN0dwlyNCxfREFSKHIyMSkKIAltZnNwcglyNSxEU0lTUgpAQCAtNDc1LDcgKzQ3NSw3IEBACiAvKiBQcm9ncmFtIGNoZWNrIGV4Y2VwdGlvbiAqLwogCS4gPSAweDA3MDAKIFByb2dyYW1DaGVjazoKLQlFWENFUFRJT05fUFJPTE9HCisJRVhDRVBUSU9OX1BST0xPRyhTUlIwLCBTUlIxKQogCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKIAlsaQlyMjAsTVNSX0tFUk5FTAogCXJsd2ltaQlyMjAscjIzLDAsMTYsMTYJCS8qIGNvcHkgRUUgYml0IGZyb20gc2F2ZWQgTVNSICovCmRpZmYgLS1naXQgYS9jcHUvbXBjODV4eC90cmFwcy5jIGIvY3B1L21wYzg1eHgvdHJhcHMuYwppbmRleCA5MDRmMDUyLi45Y2Q2MjFjIDEwMDY0NAotLS0gYS9jcHUvbXBjODV4eC90cmFwcy5jCisrKyBiL2NwdS9tcGM4NXh4L3RyYXBzLmMKQEAgLTQxLDcgKzQxLDcgQEAKIAogREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogaW50ICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHN0cnVjdCBwdF9yZWdzICopID0gMDsKICNlbmRpZgogCkBAIC03NCw3ICs3NCw3IEBACiAjZGVmaW5lIEVTUl9ESVogMHgwMDQwMDAwMAogI2RlZmluZSBFU1JfVTBGIDB4MDAwMDgwMDAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogZXh0ZXJuIHZvaWQgZG9fYmVkYnVnX2JyZWFrcG9pbnQoc3RydWN0IHB0X3JlZ3MgKik7CiAjZW5kaWYKIApAQCAtMTU5LDcgKzE1OSw3IEBACiAJCXJldHVybjsKIAl9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0xOTIsNyArMTkyLDcgQEAKIHZvaWQKIEFsaWdubWVudEV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0yMDcsNyArMjA3LDcgQEAKIHsKIAlsb25nIGVzcl92YWw7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0yNDQsNyArMjQ0LDcgQEAKIHZvaWQKIFVua25vd25FeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMjU5LDcgKzI1OSw3IEBACiB7CiAJcHJpbnRmKCJEZWJ1Z2dlciB0cmFwIGF0IEAgJWx4XG4iLCByZWdzLT5uaXAgKTsKIAlzaG93X3JlZ3MocmVncyk7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQkVEQlVHKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCiAJZG9fYmVkYnVnX2JyZWFrcG9pbnQoIHJlZ3MgKTsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvY3B1L21wYzg2eHgvTWFrZWZpbGUgYi9jcHUvbXBjODZ4eC9NYWtlZmlsZQppbmRleCBmZmZjZmQyLi42ZDkzMDBlIDEwMDY0NAotLS0gYS9jcHUvbXBjODZ4eC9NYWtlZmlsZQorKysgYi9jcHUvbXBjODZ4eC9NYWtlZmlsZQpAQCAtMSw0ICsxLDUgQEAKICMKKyMgQ29weXJpZ2h0IDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KICMgKEMpIENvcHlyaWdodCAyMDAyLDIwMDMgTW90b3JvbGEgSW5jLgogIyBYaWFuZ2h1YSBYaWFvLFguWGlhb0Btb3Rvcm9sYS5jb20KICMKQEAgLTMwLDcgKzMxLDcgQEAKIFNUQVJUCT0gc3RhcnQubyAjcmVzZXR2ZWMubwogU09CSlMJPSBjYWNoZS5vCiBDT0JKUwk9IHRyYXBzLm8gY3B1Lm8gY3B1X2luaXQubyBzcGVlZC5vIGludGVycnVwdHMubyBcCi0JICBwY2kubyBwY2llX2luZGlyZWN0Lm8gc3BkX3NkcmFtLm8KKwkgIHNwZF9zZHJhbS5vCiAKIFNSQ1MJOj0gJChTVEFSVDoubz0uUykgJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKIE9CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlMpICQoQ09CSlMpKQpkaWZmIC0tZ2l0IGEvY3B1L21wYzg2eHgvY3B1LmMgYi9jcHUvbXBjODZ4eC9jcHUuYwppbmRleCBhMzNhY2ZlLi45NDU2NDcxIDEwMDY0NAotLS0gYS9jcHUvbXBjODZ4eC9jcHUuYworKysgYi9jcHUvbXBjODZ4eC9jcHUuYwpAQCAtMjc4LDcgKzI3OCw3IEBACiAJaWYgKHAgIT0gTlVMTCkKIAkJKnAgPSBjcHVfdG9fYmUzMihjbG9jayk7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NUEM4NlhYX1RTRUMxKQorI2lmIGRlZmluZWQoQ09ORklHX1RTRUMxKQogCXAgPSBmdF9nZXRfcHJvcChibG9iLCAiLyIgT0ZfU09DICIvZXRoZXJuZXRAMjQwMDAvbWFjLWFkZHJlc3MiLCAmbGVuKTsKIAlpZiAocCAhPSBOVUxMKQogCQltZW1jcHkocCwgYmQtPmJpX2VuZXRhZGRyLCA2KTsKQEAgLTI4Nyw3ICsyODcsNyBAQAogCQltZW1jcHkocCwgYmQtPmJpX2VuZXRhZGRyLCA2KTsKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfTVBDODZYWF9UU0VDMikKKyNpZiBkZWZpbmVkKENPTkZJR19UU0VDMikKIAlwID0gZnRfZ2V0X3Byb3AoYmxvYiwgIi8iIE9GX1NPQyAiL2V0aGVybmV0QDI1MDAwL21hYy1hZGRyZXNzIiwgJmxlbik7CiAJaWYgKHAgIT0gTlVMTCkKIAkJbWVtY3B5KHAsIGJkLT5iaV9lbmV0MWFkZHIsIDYpOwpAQCAtMjk2LDcgKzI5Niw3IEBACiAJCW1lbWNweShwLCBiZC0+YmlfZW5ldDFhZGRyLCA2KTsKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfTVBDODZYWF9UU0VDMykKKyNpZiBkZWZpbmVkKENPTkZJR19UU0VDMykKIAlwID0gZnRfZ2V0X3Byb3AoYmxvYiwgIi8iIE9GX1NPQyAiL2V0aGVybmV0QDI2MDAwL21hYy1hZGRyZXNzIiwgJmxlbik7CiAJaWYgKHAgIT0gTlVMTCkKIAkJbWVtY3B5KHAsIGJkLT5iaV9lbmV0MmFkZHIsIDYpOwpAQCAtMzA1LDcgKzMwNSw3IEBACiAJCW1lbWNweShwLCBiZC0+YmlfZW5ldDJhZGRyLCA2KTsKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfTVBDODZYWF9UU0VDNCkKKyNpZiBkZWZpbmVkKENPTkZJR19UU0VDNCkKIAlwID0gZnRfZ2V0X3Byb3AoYmxvYiwgIi8iIE9GX1NPQyAiL2V0aGVybmV0QDI3MDAwL21hYy1hZGRyZXNzIiwgJmxlbik7CiAJaWYgKHAgIT0gTlVMTCkKIAkJbWVtY3B5KHAsIGJkLT5iaV9lbmV0M2FkZHIsIDYpOwpkaWZmIC0tZ2l0IGEvY3B1L21wYzg2eHgvY3B1X2luaXQuYyBiL2NwdS9tcGM4Nnh4L2NwdV9pbml0LmMKaW5kZXggNDY3M2QwNS4uYzhlNDY2NiAxMDA2NDQKLS0tIGEvY3B1L21wYzg2eHgvY3B1X2luaXQuYworKysgYi9jcHUvbXBjODZ4eC9jcHVfaW5pdC5jCkBAIC0xMDQsOCArMTA0LDggQEAKIAkvKiBlbmFibGUgdGhlIHRpbWViYXNlIGJpdCBpbiBISUQwICovCiAJc2V0X2hpZDAoZ2V0X2hpZDAoKSB8IDB4NDAwMDAwMCk7CiAKLQkvKiBlbmFibGUgU1lOQ0JFIHwgQUJFIGJpdHMgaW4gIEhJRDEgKi8KLQlzZXRfaGlkMShnZXRfaGlkMSgpIHwgMHgwMDAwMEMwMCk7CisJLyogZW5hYmxlIEVNQ1AsIFNZTkNCRSB8IEFCRSBiaXRzIGluIEhJRDEgKi8KKwlzZXRfaGlkMShnZXRfaGlkMSgpIHwgMHg4MDAwMEMwMCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9jcHUvbXBjODZ4eC9pbnRlcnJ1cHRzLmMgYi9jcHUvbXBjODZ4eC9pbnRlcnJ1cHRzLmMKaW5kZXggNDk4MjBiYi4uZDlmNjM0ZiAxMDA2NDQKLS0tIGEvY3B1L21wYzg2eHgvaW50ZXJydXB0cy5jCisrKyBiL2NwdS9tcGM4Nnh4L2ludGVycnVwdHMuYwpAQCAtOCw3ICs4LDcgQEAKICAqIChDKSBDb3B5cmlnaHQgMjAwMyBNb3Rvcm9sYSBJbmMuIChNUEM4NXh4IHBvcnQpCiAgKiBYaWFuZ2h1YSBYaWFvIChYLlhpYW9AbW90b3JvbGEuY29tKQogICoKLSAqIChDKSBDb3B5cmlnaHQgMjAwNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4gKE1QQzg2eHggUG9ydCkKKyAqIChDKSBDb3B5cmlnaHQgMjAwNCwgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4gKE1QQzg2eHggUG9ydCkKICAqIEplZmYgQnJvd24KICAqIFNyaWthbnRoIFNyaW5pdmFzYW4gKHNyaWthbnRoLnNyaW5pdmFzYW5AZnJlZXNjYWxlLmNvbSkKICAqCkBAIC03MSw3ICs3MSw3IEBACiB9CiAKIC8qIGludGVycnVwdCBpcyBub3Qgc3VwcG9ydGVkIHlldCAqLwotaW50IGludGVycnVwdF9pbml0X2NwdSh1bnNpZ25lZCAqZGVjcmVtZW50ZXJfY291bnQpCitpbnQgaW50ZXJydXB0X2luaXRfY3B1KHVuc2lnbmVkIGxvbmcgKmRlY3JlbWVudGVyX2NvdW50KQogewogCXJldHVybiAwOwogfQpAQCAtODAsMjUgKzgwLDEwIEBACiB7CiAJaW50IHJldDsKIAotCS8qCi0JICogVGhlIElSUTAgb24gUmV2IDIgaXMgcHVsbGVkIGhpZ2ggKGxvdyBpbiBSZXYgMS54KSB0bwotCSAqIGltcGxlbWVudCBQRVgxMCBlcnJhdGEuICBBcyBJTlQgaXMgYWN0aXZlIGhpZ2gsIGl0Ci0JICogd2lsbCBjYXVzZSBjb3JlIHRvIHRha2UgMHg1MDAgaW50ZXJydXB0LgotCSAqCi0JICogRHVlIHRvIHRoZSBQSUMncyBkZWZhdWx0IHBhc3MgdGhyb3VnaCBtb2RlLCBhcyBzb29uCi0JICogYXMgaW50ZXJydXB0cyBhcmUgZW5hYmxlZCAoTVNSW0VFXSA9IDEpLCBhbiBpbnRlcnJ1cHQKLQkgKiB3aWxsIGJlIHRha2VuIGFuZCB1LWJvb3Qgd2lsbCBoYW5nLiAgVGhpcyBpcyBkdWUgdG8gYQotCSAqIGhhcmR3YXJlIGNoYW5nZSAocGVyIGFuIGVycmF0YSBmaXgpIG9uIG5ldyByZXZpc2lvbnMKLQkgKiBvZiB0aGUgYm9hcmQgd2l0aCBSZXYgMi54IHBhcnRzLgotCSAqCi0JICogU2V0dGluZyB0aGUgUElDIHRvIG1peGVkIG1vZGUgcHJldmVudHMgdGhlIGhhbmcuCi0JICovCi0JaWYgKChnZXRfc3ZyKCkgJiAweGYwKSA9PSAweDIwKSB7Ci0JCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKUNGR19JTU1SOwotCQlpbW1yLT5pbV9waWMuZ2NyID0gTVBDODZ4eF9QSUNHQ1JfUlNUOwotCQl3aGlsZSAoaW1tci0+aW1fcGljLmdjciAmIE1QQzg2eHhfUElDR0NSX1JTVCk7Ci0JCWltbXItPmltX3BpYy5nY3IgPSBNUEM4Nnh4X1BJQ0dDUl9NT0RFOwotCX0KKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKilDRkdfSU1NUjsKKwlpbW1yLT5pbV9waWMuZ2NyID0gTVBDODZ4eF9QSUNHQ1JfUlNUOworCXdoaWxlIChpbW1yLT5pbV9waWMuZ2NyICYgTVBDODZ4eF9QSUNHQ1JfUlNUKTsKKwlpbW1yLT5pbV9waWMuZ2NyID0gTVBDODZ4eF9QSUNHQ1JfTU9ERTsKIAogCS8qIGNhbGwgY3B1IHNwZWNpZmljIGZ1bmN0aW9uIGZyb20gJChDUFUpL2ludGVycnVwdHMuYyAqLwogCXJldCA9IGludGVycnVwdF9pbml0X2NwdSgmZGVjcmVtZW50ZXJfY291bnQpOwpAQCAtMTA3LDcgKzkyLDcgQEAKIAkJcmV0dXJuIHJldDsKIAogCWRlY3JlbWVudGVyX2NvdW50ID0gZ2V0X3RiY2xrKCkgLyBDRkdfSFo7Ci0JZGVidWcoImludGVycnVwdCBpbml0OiB0YmNsaygpID0gJWQgTUh6LCBkZWNyZW1lbnRlcl9jb3VudCA9ICVkXG4iLAorCWRlYnVnKCJpbnRlcnJ1cHQgaW5pdDogdGJjbGsoKSA9ICVkIE1IeiwgZGVjcmVtZW50ZXJfY291bnQgPSAlbGRcbiIsCiAJICAgICAgKGdldF90YmNsaygpIC8gMTAwMDAwMCksCiAJICAgICAgZGVjcmVtZW50ZXJfY291bnQpOwogCkBAIC0xMTksNiArMTA0LDMwIEBACiAJICAgICAgZ2V0X21zcigpLAogCSAgICAgIGdldF9kZWMoKSk7CiAKKyNpZmRlZiBDT05GSUdfSU5URVJSVVBUUworCXZvbGF0aWxlIGNjc3JfcGljX3QgKnBpYyA9ICZpbW1yLT5pbV9waWM7CisKKwlwaWMtPmlpdnByMSA9IDB4ODEwMDAxOwkvKiA1MDIyMCBlbmFibGUgbWNtIGludGVycnVwdHMgKi8KKwlkZWJ1ZygiaWl2cHIxQCV4ID0gJXhcbiIsICZwaWMtPmlpdnByMSwgcGljLT5paXZwcjEpOworCisJcGljLT5paXZwcjIgPSAweDgxMDAwMjsJLyogNTAyNDAgZW5hYmxlIGRkciBpbnRlcnJ1cHRzICovCisJZGVidWcoImlpdnByMkAleCA9ICV4XG4iLCAmcGljLT5paXZwcjIsIHBpYy0+aWl2cHIyKTsKKworCXBpYy0+aWl2cHIzID0gMHg4MTAwMDM7CS8qIDUwMjYwIGVuYWJsZSBsYmMgaW50ZXJydXB0cyAqLworCWRlYnVnKCJpaXZwcjNAJXggPSAleFxuIiwgJnBpYy0+aWl2cHIzLCBwaWMtPmlpdnByMyk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kxKSB8fCBkZWZpbmVkKENPTkZJR19QQ0lFMSkKKwlwaWMtPmlpdnByOCA9IDB4ODEwMDA4OwkvKiBlbmFibGUgcGNpZTEgaW50ZXJydXB0cyAqLworCWRlYnVnKCJpaXZwcjhAJXggPSAleFxuIiwgJnBpYy0+aWl2cHI4LCBwaWMtPmlpdnByOCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kyKSB8fCBkZWZpbmVkKENPTkZJR19QQ0lFMikKKwlwaWMtPmlpdnByOSA9IDB4ODEwMDA5OwkvKiBlbmFibGUgcGNpZTIgaW50ZXJydXB0cyAqLworCWRlYnVnKCJpaXZwcjlAJXggPSAleFxuIiwgJnBpYy0+aWl2cHI5LCBwaWMtPmlpdnByOSk7CisjZW5kaWYKKworCXBpYy0+Y3RwciA9IDA7CS8qIDQwMDgwIGNsZWFyIGN1cnJlbnQgdGFzayBwcmlvcml0eSByZWdpc3RlciAqLworI2VuZGlmCisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU4LDggKzE2Nyw2IEBACiAKIAl0aW1lc3RhbXArKzsKIAotCXBwY0RjYmYoJnRpbWVzdGFtcCk7Ci0KIAkvKiBSZXN0b3JlIERlY3JlbWVudGVyIENvdW50ICovCiAJc2V0X2RlYyhkZWNyZW1lbnRlcl9jb3VudCk7CiAKZGlmZiAtLWdpdCBhL2NwdS9tcGM4Nnh4L3BjaS5jIGIvY3B1L21wYzg2eHgvcGNpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NjU0OGQuLjAwMDAwMDAKLS0tIGEvY3B1L21wYzg2eHgvcGNpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsSW5jLgotICogMjAwNSwgMjAwNi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBFZCBTd2FydGhvdXQgKGVkLnN3YXJ0aG91dEBmcmVlc2NhbGUuY29tKQotICogSmFzb24gSmluIChKYXNvbi5qaW5AZnJlZXNjYWxlLmNvbSkKLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi0vKgotICogUENJRSBDb25maWd1cmF0aW9uIHNwYWNlIGFjY2VzcyBzdXBwb3J0IGZvciBQQ0lFIEJyaWRnZQotICovCi0jaW5jbHVkZSA8Y29tbW9uLmg+Ci0jaW5jbHVkZSA8cGNpLmg+Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi12b2lkCi1wY2lfbXBjODZ4eF9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKLXsKLQl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIENGR19DQ1NSQkFSOwotCXZvbGF0aWxlIGNjc3JfcGV4X3QgKnBjaWUxID0gJmltbWFwLT5pbV9wZXgxOwotCXUxNiB0ZW1wMTY7Ci0JdTMyIHRlbXAzMjsKLQotCXZvbGF0aWxlIGNjc3JfZ3VyX3QgKmd1ciA9ICZpbW1hcC0+aW1fZ3VyOwotCXVpbnQgaG9zdDFfYWdlbnQgPSAoZ3VyLT5wb3JibXNyICYgTVBDODZ4eF9QT1JCTVNSX0hBKSA+PiAxNzsKLQl1aW50IHBjaWUxX2hvc3QgPSAoaG9zdDFfYWdlbnQgPT0gMikgfHwgKGhvc3QxX2FnZW50ID09IDMpOwotCXVpbnQgcGNpZTFfYWdlbnQgPSAoaG9zdDFfYWdlbnQgPT0gMCkgfHwgKGhvc3QxX2FnZW50ID09IDEpOwotCXVpbnQgZGV2ZGlzciA9IGd1ci0+ZGV2ZGlzcjsKLQl1aW50IGlvX3NlbCA9IChndXItPnBvcmRldnNyICYgTVBDODZ4eF9QT1JERVZTUl9JT19TRUwpID4+IDE2OwotCi0JaWYgKChpb19zZWwgPT0gMiB8fCBpb19zZWwgPT0gMyB8fCBpb19zZWwgPT0gNSB8fCBpb19zZWwgPT0gNiB8fAotCSAgICAgaW9fc2VsID09IDcgfHwgaW9fc2VsID09IDB4ZikKLQkgICAgJiYgIShkZXZkaXNyICYgTVBDODZ4eF9ERVZESVNSX1BDSUVYMSkpIHsKLQkJcHJpbnRmKCJQQ0ktRVhQUkVTUyAxOiBDb25maWd1cmVkIGFzICVzIFxuIiwKLQkJICAgICAgIHBjaWUxX2FnZW50ID8gIkFnZW50IiA6ICJIb3N0Iik7Ci0JCWlmIChwY2llMV9hZ2VudCkKLQkJCXJldHVybjsJLypEb24ndCBzY2FuIGJ1cyB3aGVuIGNvbmZpZ3VyZWQgYXMgYWdlbnQgKi8KLQkJcHJpbnRmKCIgICAgICAgICAgICAgICBTY2FubmluZyBQQ0lFIGJ1cyIpOwotCQlkZWJ1ZygiMHglMDh4PTB4JTA4eCAiLAotCQkgICAgICAmcGNpZTEtPnBtZV9tc2dfZGV0LAotCQkgICAgICBwY2llMS0+cG1lX21zZ19kZXQpOwotCQlpZiAocGNpZTEtPnBtZV9tc2dfZGV0KSB7Ci0JCQlwY2llMS0+cG1lX21zZ19kZXQgPSAweGZmZmZmZmZmOwotCQkJZGVidWcoIiB3aXRoIGVycm9ycy4gIENsZWFyaW5nLiAgTm93IDB4JTA4eCIsCi0JCQkgICAgICBwY2llMS0+cG1lX21zZ19kZXQpOwotCQl9Ci0JCWRlYnVnKCJcbiIpOwotCX0gZWxzZSB7Ci0JCXByaW50ZigiUENJLUVYUFJFU1MgMSBkaXNhYmxlZCFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiBTZXQgZmlyc3RfYnVzPTAgb25seSBza2lwcGVkIEIwOkQwOkYwIHdoaWNoIGlzCi0JICogYSByZXNlcnZlZCBkZXZpY2UgaW4gTTE1NzUsIGJ1dCBtYWtlIGl0IGVhc3kgZm9yCi0JICogbW9zdCBvZiB0aGUgc2NhbiBwcm9jZXNzLgotCSAqLwotCWhvc2UtPmZpcnN0X2J1c25vID0gMHgwMDsKLQlob3NlLT5sYXN0X2J1c25vID0gMHhmZTsKLQotCXBjaWVfc2V0dXBfaW5kaXJlY3QoaG9zZSwgKENGR19JTU1SICsgMHg4MDAwKSwgKENGR19JTU1SICsgMHg4MDA0KSk7Ci0KLQlwY2lfaG9zZV9yZWFkX2NvbmZpZ193b3JkKGhvc2UsCi0JCQkJICBQQ0lfQkRGKDAsIDAsIDApLCBQQ0lfQ09NTUFORCwgJnRlbXAxNik7Ci0JdGVtcDE2IHw9IFBDSV9DT01NQU5EX1NFUlIgfCBQQ0lfQ09NTUFORF9NQVNURVIgfAotCSAgICBQQ0lfQ09NTUFORF9NRU1PUlkgfCBQQ0lfQ09NTUFORF9JTzsKLQlwY2lfaG9zZV93cml0ZV9jb25maWdfd29yZChob3NlLAotCQkJCSAgIFBDSV9CREYoMCwgMCwgMCksIFBDSV9DT01NQU5ELCB0ZW1wMTYpOwotCi0JcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgUENJX0JERigwLCAwLCAwKSwgUENJX1NUQVRVUywgMHhmZmZmKTsKLQlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLAotCQkJCSAgIFBDSV9CREYoMCwgMCwgMCksIFBDSV9MQVRFTkNZX1RJTUVSLCAweDgwKTsKLQotCXBjaV9ob3NlX3JlYWRfY29uZmlnX2R3b3JkKGhvc2UsIFBDSV9CREYoMCwgMCwgMCksIFBDSV9QUklNQVJZX0JVUywKLQkJCQkgICAmdGVtcDMyKTsKLQl0ZW1wMzIgPSAodGVtcDMyICYgMHhmZjAwMDAwMCkgfCAoMHhmZikgfCAoMHgwIDw8IDgpIHwgKDB4ZmUgPDwgMTYpOwotCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19kd29yZChob3NlLCBQQ0lfQkRGKDAsIDAsIDApLCBQQ0lfUFJJTUFSWV9CVVMsCi0JCQkJICAgIHRlbXAzMik7Ci0KLQlwY2llMS0+cG93YXIxID0gMDsKLQlwY2llMS0+cG93YXIyID0gMDsKLQlwY2llMS0+cGl3YXIxID0gMDsKLQlwY2llMS0+cGl3YXIxID0gMDsKLQotCXBjaWUxLT5wb3diYXIxID0gKENGR19QQ0kxX01FTV9CQVNFID4+IDEyKSAmIDB4MDAwZmZmZmY7Ci0JcGNpZTEtPnBvd2FyMSA9IDB4ODAwNDQwMWM7CS8qIDUxMk0gTUVNIHNwYWNlICovCi0JcGNpZTEtPnBvdGFyMSA9IChDRkdfUENJMV9NRU1fQkFTRSA+PiAxMikgJiAweDAwMGZmZmZmOwotCXBjaWUxLT5wb3RlYXIxID0gMHgwMDAwMDAwMDsKLQotCXBjaWUxLT5wb3diYXIyID0gKENGR19QQ0kxX0lPX0JBU0UgPj4gMTIpICYgMHgwMDBmZmZmZjsKLQlwY2llMS0+cG93YXIyID0gMHg4MDA4ODAxNzsJLyogMTZNIElPIHNwYWNlICovCi0JcGNpZTEtPnBvdGFyMiA9IDB4MDAwMDAwMDA7Ci0JcGNpZTEtPnBvdGVhcjIgPSAweDAwMDAwMDAwOwotCi0JcGNpZTEtPnBpdGFyMSA9IDB4MDAwMDAwMDA7Ci0JcGNpZTEtPnBpd2JhcjEgPSAweDAwMDAwMDAwOwotCS8qIEVuYWJsZSwgUHJlZmV0Y2gsIExvY2FsIE1lbSwgKiBTbm9vcCBSL1csIDJHICovCi0JcGNpZTEtPnBpd2FyMSA9IDB4YTBmNTUwMWU7Ci0KLQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMCwKLQkJICAgICAgIENGR19QQ0lfTUVNT1JZX0JVUywKLQkJICAgICAgIENGR19QQ0lfTUVNT1JZX1BIWVMsCi0JCSAgICAgICBDRkdfUENJX01FTU9SWV9TSVpFLAotCQkgICAgICAgUENJX1JFR0lPTl9NRU0gfCBQQ0lfUkVHSU9OX01FTU9SWSk7Ci0KLQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMSwKLQkJICAgICAgIENGR19QQ0kxX01FTV9CQVNFLAotCQkgICAgICAgQ0ZHX1BDSTFfTUVNX1BIWVMsCi0JCSAgICAgICBDRkdfUENJMV9NRU1fU0laRSwKLQkJICAgICAgIFBDSV9SRUdJT05fTUVNKTsKLQotCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAyLAotCQkgICAgICAgQ0ZHX1BDSTFfSU9fQkFTRSwKLQkJICAgICAgIENGR19QQ0kxX0lPX1BIWVMsCi0JCSAgICAgICBDRkdfUENJMV9JT19TSVpFLAotCQkgICAgICAgUENJX1JFR0lPTl9JTyk7Ci0KLQlob3NlLT5yZWdpb25fY291bnQgPSAzOwotCi0JcGNpX3JlZ2lzdGVyX2hvc2UoaG9zZSk7Ci0KLQlob3NlLT5sYXN0X2J1c25vID0gcGNpX2hvc2Vfc2Nhbihob3NlKTsKLQlkZWJ1ZygicGNpZV9tcGM4Nnh4X2luaXQ6IGxhc3RfYnVzbm8gJXhcbiIsIGhvc2UtPmxhc3RfYnVzbm8pOwotCWRlYnVnKCJwY2llX21wYzg2eHggaW5pdDogY3VycmVudF9idXNubyAleFxuICIsIGhvc2UtPmN1cnJlbnRfYnVzbm8pOwotCi0JcHJpbnRmKCIuLi4uUENJRTEgc2NhbiAmIGVudW1lcmF0aW9uIGRvbmVcbiIpOwotfQotI2VuZGlmCQkJCS8qIENPTkZJR19QQ0kgKi8KZGlmZiAtLWdpdCBhL2NwdS9tcGM4Nnh4L3BjaWVfaW5kaXJlY3QuYyBiL2NwdS9tcGM4Nnh4L3BjaWVfaW5kaXJlY3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAwYWQ3Ni4uMDAwMDAwMAotLS0gYS9jcHUvbXBjODZ4eC9wY2llX2luZGlyZWN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoKLSAqIFN1cHBvcnQgZm9yIGluZGlyZWN0IFBDSSBicmlkZ2VzLgotICoKLSAqIENvcHlyaWdodCAoYykgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KLSAqIDIwMDYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogSmFzb24gSmluIDxKYXNvbi5qaW5AZnJlZXNjYWxlLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIHBhcnRseSBkZXJpdmVkIGZyb20KLSAqIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4Nnh4X3BjaWUuYwotICovCi0KLSNpbmNsdWRlIDxjb21tb24uaD4KLQotI2lmZGVmIENPTkZJR19QQ0kKLQotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxwY2kuaD4KLQotI2RlZmluZSBQQ0lfQ0ZHX09VVCAJb3V0X2JlMzIKLSNkZWZpbmUgUEVYX0ZJWAkJb3V0X2JlMzIoaG9zZS0+Y2ZnX2FkZHIrMHg0LCAweDA0MDBmZmZmKQotCi1zdGF0aWMgaW50Ci1pbmRpcmVjdF9yZWFkX2NvbmZpZ19wY2llKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKLQkJCSAgcGNpX2Rldl90IGRldiwKLQkJCSAgaW50IG9mZnNldCwKLQkJCSAgaW50IGxlbiwKLQkJCSAgdTMyICp2YWwpCi17Ci0JaW50IGJ1cyA9IFBDSV9CVVMoZGV2KTsKLQotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmNmZ19kYXRhOwotCXUzMiB0ZW1wOwotCi0JUEVYX0ZJWDsKLQlpZiAoYnVzID09IDB4ZmYpIHsKLQkJUENJX0NGR19PVVQoaG9zZS0+Y2ZnX2FkZHIsCi0JCQkgICAgZGV2IHwgKG9mZnNldCAmIDB4ZmMpIHwgMHg4MDAwMDAwMSk7Ci0JfSBlbHNlIHsKLQkJUENJX0NGR19PVVQoaG9zZS0+Y2ZnX2FkZHIsCi0JCQkgICAgZGV2IHwgKG9mZnNldCAmIDB4ZmMpIHwgMHg4MDAwMDAwMCk7Ci0JfQotCS8qCi0JICogTm90ZTogdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBjaGVja2VkIHRoYXQgb2Zmc2V0IGlzCi0JICogc3VpdGFibHkgYWxpZ25lZCBhbmQgdGhhdCBsZW4gaXMgMSwgMiBvciA0LgotCSAqLwotCS8qIEVSUkFUQSBQQ0ktRXggMTIgLSBDb25maWd1cmF0aW9uIEFkZHJlc3MvRGF0YSBBbGlnbm1lbnQgKi8KLQljZmdfZGF0YSA9IGhvc2UtPmNmZ19kYXRhOwotCVBFWF9GSVg7Ci0JdGVtcCA9IGluX2xlMzIoKHUzMiAqKSBjZmdfZGF0YSk7Ci0Jc3dpdGNoIChsZW4pIHsKLQljYXNlIDE6Ci0JCSp2YWwgPSAodGVtcCA+PiAoKChvZmZzZXQgJiAzKSkgKiA4KSkgJiAweGZmOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCSp2YWwgPSAodGVtcCA+PiAoKChvZmZzZXQgJiAzKSkgKiA4KSkgJiAweGZmZmY7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCSp2YWwgPSB0ZW1wOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotaW5kaXJlY3Rfd3JpdGVfY29uZmlnX3BjaWUoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAotCQkJICAgcGNpX2Rldl90IGRldiwKLQkJCSAgIGludCBvZmZzZXQsCi0JCQkgICBpbnQgbGVuLAotCQkJICAgdTMyIHZhbCkKLXsKLQlpbnQgYnVzID0gUENJX0JVUyhkZXYpOwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmNmZ19kYXRhOwotCXUzMiB0ZW1wOwotCi0JUEVYX0ZJWDsKLQlpZiAoYnVzID09IDB4ZmYpIHsKLQkJUENJX0NGR19PVVQoaG9zZS0+Y2ZnX2FkZHIsCi0JCQkgICAgZGV2IHwgKG9mZnNldCAmIDB4ZmMpIHwgMHg4MDAwMDAwMSk7Ci0JfSBlbHNlIHsKLQkJUENJX0NGR19PVVQoaG9zZS0+Y2ZnX2FkZHIsCi0JCQkgICAgZGV2IHwgKG9mZnNldCAmIDB4ZmMpIHwgMHg4MDAwMDAwMCk7Ci0JfQotCi0JLyoKLQkgKiBOb3RlOiB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgdGhhdCBvZmZzZXQgaXMKLQkgKiBzdWl0YWJseSBhbGlnbmVkIGFuZCB0aGF0IGxlbiBpcyAxLCAyIG9yIDQuCi0JICovCi0JLyogRVJSQVRBIFBDSS1FeCAxMiAtIENvbmZpZ3VyYXRpb24gQWRkcmVzcy9EYXRhIEFsaWdubWVudCAqLwotCWNmZ19kYXRhID0gaG9zZS0+Y2ZnX2RhdGE7Ci0Jc3dpdGNoIChsZW4pIHsKLQljYXNlIDE6Ci0JCVBFWF9GSVg7Ci0JCXRlbXAgPSBpbl9sZTMyKCh1MzIgKikgY2ZnX2RhdGEpOwotCQl0ZW1wID0gKHRlbXAgJiB+KDB4ZmYgPDwgKChvZmZzZXQgJiAzKSAqIDgpKSkgfAotCQkgICAgKHZhbCA8PCAoKG9mZnNldCAmIDMpICogOCkpOwotCQlQRVhfRklYOwotCQlvdXRfbGUzMigodTMyICopIGNmZ19kYXRhLCB0ZW1wKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlQRVhfRklYOwotCQl0ZW1wID0gaW5fbGUzMigodTMyICopIGNmZ19kYXRhKTsKLQkJdGVtcCA9ICh0ZW1wICYgfigweGZmZmYgPDwgKChvZmZzZXQgJiAzKSAqIDgpKSk7Ci0JCXRlbXAgfD0gKHZhbCA8PCAoKG9mZnNldCAmIDMpICogOCkpOwotCQlQRVhfRklYOwotCQlvdXRfbGUzMigodTMyICopIGNmZ19kYXRhLCB0ZW1wKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUEVYX0ZJWDsKLQkJb3V0X2xlMzIoKHUzMiAqKSBjZmdfZGF0YSwgdmFsKTsKLQkJYnJlYWs7Ci0JfQotCVBFWF9GSVg7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWluZGlyZWN0X3JlYWRfY29uZmlnX2J5dGVfcGNpZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCi0JCQkgICAgICAgcGNpX2Rldl90IGRldiwKLQkJCSAgICAgICBpbnQgb2Zmc2V0LAotCQkJICAgICAgIHU4ICp2YWwpCi17Ci0JdTMyIHZhbDMyOwotCWluZGlyZWN0X3JlYWRfY29uZmlnX3BjaWUoaG9zZSwgZGV2LCBvZmZzZXQsIDEsICZ2YWwzMik7Ci0JKnZhbCA9ICh1OCkgdmFsMzI7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWluZGlyZWN0X3JlYWRfY29uZmlnX3dvcmRfcGNpZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCi0JCQkgICAgICAgcGNpX2Rldl90IGRldiwKLQkJCSAgICAgICBpbnQgb2Zmc2V0LAotCQkJICAgICAgIHUxNiAqdmFsKQotewotCXUzMiB2YWwzMjsKLQlpbmRpcmVjdF9yZWFkX2NvbmZpZ19wY2llKGhvc2UsIGRldiwgb2Zmc2V0LCAyLCAmdmFsMzIpOwotCSp2YWwgPSAodTE2KSB2YWwzMjsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotaW5kaXJlY3RfcmVhZF9jb25maWdfZHdvcmRfcGNpZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCi0JCQkJcGNpX2Rldl90IGRldiwKLQkJCQlpbnQgb2Zmc2V0LAotCQkJCXUzMiAqdmFsKQotewotCXJldHVybiBpbmRpcmVjdF9yZWFkX2NvbmZpZ19wY2llKGhvc2UsIGRldiwgb2Zmc2V0LCA0LCB2YWwpOwotfQotCi1zdGF0aWMgaW50Ci1pbmRpcmVjdF93cml0ZV9jb25maWdfYnl0ZV9wY2llKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKLQkJCQlwY2lfZGV2X3QgZGV2LAotCQkJCWludCBvZmZzZXQsCi0JCQkJdTggdmFsKQotewotCXJldHVybiBpbmRpcmVjdF93cml0ZV9jb25maWdfcGNpZShob3NlLCBkZXYsIG9mZnNldCwgMSwgKHUzMikgdmFsKTsKLX0KLQotc3RhdGljIGludAotaW5kaXJlY3Rfd3JpdGVfY29uZmlnX3dvcmRfcGNpZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCi0JCQkJcGNpX2Rldl90IGRldiwKLQkJCQlpbnQgb2Zmc2V0LAotCQkJCXVuc2lnbmVkIHNob3J0IHZhbCkKLXsKLQlyZXR1cm4gaW5kaXJlY3Rfd3JpdGVfY29uZmlnX3BjaWUoaG9zZSwgZGV2LCBvZmZzZXQsIDIsICh1MzIpIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWluZGlyZWN0X3dyaXRlX2NvbmZpZ19kd29yZF9wY2llKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKLQkJCQkgcGNpX2Rldl90IGRldiwKLQkJCQkgaW50IG9mZnNldCwKLQkJCQkgdTMyIHZhbCkKLXsKLQlyZXR1cm4gaW5kaXJlY3Rfd3JpdGVfY29uZmlnX3BjaWUoaG9zZSwgZGV2LCBvZmZzZXQsIDQsIHZhbCk7Ci19Ci0KLXZvaWQKLXBjaWVfc2V0dXBfaW5kaXJlY3Qoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCB1MzIgY2ZnX2FkZHIsIHUzMiBjZmdfZGF0YSkKLXsKLQlwY2lfc2V0X29wcyhob3NlLAotCQkgICAgaW5kaXJlY3RfcmVhZF9jb25maWdfYnl0ZV9wY2llLAotCQkgICAgaW5kaXJlY3RfcmVhZF9jb25maWdfd29yZF9wY2llLAotCQkgICAgaW5kaXJlY3RfcmVhZF9jb25maWdfZHdvcmRfcGNpZSwKLQkJICAgIGluZGlyZWN0X3dyaXRlX2NvbmZpZ19ieXRlX3BjaWUsCi0JCSAgICBpbmRpcmVjdF93cml0ZV9jb25maWdfd29yZF9wY2llLAotCQkgICAgaW5kaXJlY3Rfd3JpdGVfY29uZmlnX2R3b3JkX3BjaWUpOwotCi0JaG9zZS0+Y2ZnX2FkZHIgPSAodW5zaWduZWQgaW50ICopY2ZnX2FkZHI7Ci0JaG9zZS0+Y2ZnX2RhdGEgPSAodW5zaWduZWQgY2hhciAqKWNmZ19kYXRhOwotfQotCi0jZW5kaWYJCQkJLyogQ09ORklHX1BDSSAqLwpkaWZmIC0tZ2l0IGEvY3B1L21wYzg2eHgvcmVzZXR2ZWMuUyBiL2NwdS9tcGM4Nnh4L3Jlc2V0dmVjLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNTUyZjYuLjAwMDAwMDAKLS0tIGEvY3B1L21wYzg2eHgvcmVzZXR2ZWMuUworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotCS5zZWN0aW9uIC5yZXNldHZlYywiYXgiCi0JYiBfc3RhcnQKZGlmZiAtLWdpdCBhL2NwdS9tcGM4Nnh4L3N0YXJ0LlMgYi9jcHUvbXBjODZ4eC9zdGFydC5TCmluZGV4IDY3YzU2ZGIuLmM4MzMxMGEgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4Nnh4L3N0YXJ0LlMKKysrIGIvY3B1L21wYzg2eHgvc3RhcnQuUwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgMjAwNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4KKyAqIENvcHlyaWdodCAyMDA0LCAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLgogICogU3Jpa2FudGggU3Jpbml2YXNhbiA8c3Jpa2FudGguc3Jpbml2YWFuQGZyZWVzY2FsZS5jb20+CiAgKgogICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKQEAgLTQ0LDExICs0NCw5IEBACiAjZGVmaW5lIENPTkZJR19JREVOVF9TVFJJTkcgIiIKICNlbmRpZgogCi0vKiBXZSBkb24ndCB3YW50IHRoZSAgTU1VIHlldC4KLSovCi0jdW5kZWYJTVNSX0tFUk5FTAotLyogTWFjaGluZSBDaGVjayBhbmQgUmVjb3ZlcmFibGUgSW50ZXJyLiAqLwotI2RlZmluZSBNU1JfS0VSTkVMICggTVNSX01FIHwgTVNSX1JJICkKKy8qCisgKiBOZWVkIE1TUl9EUiB8IE1TUl9JUiBlbmFibGVkIHRvIGFjY2VzcyBJL08gKHByaW50ZikgaW4gZXhjZXB0aW9ucworICovCiAKIC8qCiAgKiBTZXQgdXAgR09UOiBHbG9iYWwgT2Zmc2V0IFRhYmxlCkBAIC0xMTYsNyArMTE0LDcgQEAKIC8qIEFsaWdubWVudCBleGNlcHRpb24uICovCiAJLiA9IDB4NjAwCiBBbGlnbm1lbnQ6Ci0JRVhDRVBUSU9OX1BST0xPRworCUVYQ0VQVElPTl9QUk9MT0coU1JSMCwgU1JSMSkKIAltZnNwcglyNCxEQVIKIAlzdHcJcjQsX0RBUihyMjEpCiAJbWZzcHIJcjUsRFNJU1IKQEAgLTEzNCw3ICsxMzIsNyBAQAogLyogUHJvZ3JhbSBjaGVjayBleGNlcHRpb24gKi8KIAkuID0gMHg3MDAKIFByb2dyYW1DaGVjazoKLQlFWENFUFRJT05fUFJPTE9HCisJRVhDRVBUSU9OX1BST0xPRyhTUlIwLCBTUlIxKQogCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKIAlsaQlyMjAsTVNSX0tFUk5FTAogCXJsd2ltaQlyMjAscjIzLDAsMTYsMTYJCS8qIGNvcHkgRUUgYml0IGZyb20gc2F2ZWQgTVNSICovCkBAIC0xOTUsMTcgKzE5MywyMSBAQAogCWJsCXNlY29uZGFyeV9jcHVfc2V0dXAKICNlbmRpZgogCisxOgorI2lmZGVmIENGR19SQU1CT09UCiAJLyogZGlzYWJsZSBldmVyeXRoaW5nICovCi0xOglsaQlyMCwgMAorCWxpCXIwLCAwCiAJbXRzcHIJSElEMCwgcjAKIAlzeW5jCiAJbXRtc3IJMAorI2VuZGlmCisKIAlibAlpbnZhbGlkYXRlX2JhdHMKIAlzeW5jCiAKICNpZmRlZiBDRkdfTDIKIAkvKiBpbml0IHRoZSBMMiBjYWNoZSAqLwotCWFkZGlzCXIzLCByMCwgTDJfSU5JVEBoCisJbGlzCXIzLCBMMl9JTklUQGgKIAlvcmkJcjMsIHIzLCBMMl9JTklUQGwKIAltdHNwcglsMmNyLCByMwogCS8qIGludmFsaWRhdGUgdGhlIEwyIGNhY2hlICovCkBAIC0yNDEsNjkgKzI0Myw5IEBACiAJYmwJc2V0dXBfY2NzcmJhcgogI2VuZGlmCiAKLQotCS8qIC0tIE1QQzg2NDEgUmV2IDEuMCBNQ00gRXJyYXRhIGZpeHVwcyAtLSAqLwotCi0JLyogc2tpcCBmaXh1cHMgaWYgbm90IFJldiAxLjAgKi8KLQltZnNwcglyNCwgU1ZSCi0Jcmx3aW5tCXI0LHI0LDAsMjQsMzEKLQljbXB3aQlyNCwweDEwCi0JYm5lCTFmCi0KLQlsaXMJcjMsTUNNX0FCQ1JAaGEKLQlsd3oJcjQsTUNNX0FCQ1JAbChyMykJLyogQUJDUiAtPiByNCAqLwotCi0JLyogc2V0IEFCQ1JbQV9TVFJNX0NOVF0gPSAwICovCi0Jcmx3aW5tCXI0LHI0LDAsMCwyOQotCi0JLyogc2V0IEFCQ1JbQVJCX1BPTElDWV0gdG8gMHgxIChyb3VuZC1yb2JpbikgKi8KLQlhZGRpCXIwLHIwLDEKLQlybHdpbWkJcjQscjAsMTIsMTgsMTkKLQotCXN0dwlyNCxNQ01fQUJDUkBsKHIzKQkvKiByNCAtPiBBQkNSICovCi0Jc3luYwotCi0JLyogU2V0IERCQ1JbRVJEX0RJU10gKi8KLQlsaXMJcjMsTUNNX0RCQ1JAaGEKLQlsd3oJcjQsTUNNX0RCQ1JAbChyMykKLQlvcmlzCXI0LCByNCwgMHg0MDAwCi0Jc3R3CXI0LE1DTV9EQkNSQGwocjMpCi0Jc3luYwotMToKIAkvKiBzZXR1cCB0aGUgbGF3IGVudHJpZXMgKi8KIAlibAlsYXdfZW50cnkKIAlzeW5jCi0KLQotI2lmIChFTVVMQVRPUl9SVU4gPT0gMSkKLQkvKiBPbiB0aGUgZW11bGF0b3Igd2Ugd2FudCB0byBhZGp1c3QgdGhlc2UgQVNBUCAqLwotCS8qIG90aGVyd2lzZSB0aGluZ3MgYXJlIHNsb29vb3cgKi8KLQkvKiBTZXR1cCBPUjAgKExBTEUgRklYKSovCi0JbGlzCXIzLCBDRkdfQ0NTUkJBUkBoCi0Jb3JpCXIzLCByMywgMHg1MDA0Ci0JbGkJcjQsIDB4MEZGMwotCXN0dwlyNCwgMChyMykKLQlzeW5jCi0KLQkvKiBTZXR1cCBMQ1JSICovCi0JbGlzCXIzLCBDRkdfQ0NTUkJBUkBoCi0Jb3JpCXIzLCByMywgMHg1MEQ0Ci0JbGlzCXI0LCAweDgwMDAKLQlvcmkJcjQsIHI0LCAweDAwMDIKLQlzdHcJcjQsIDAocjMpCi0Jc3luYwotI2VuZGlmCi0jaWYgMQotCS8qIG1ha2Ugc3VyZSB0aW1lciBlbmFibGVkIGluIGd1dHMgcmVnaXN0ZXIgdG9vICovCi0JbGlzCXIzLCBDRkdfQ0NTUkJBUkBoCi0Jb3JpcwlyMyxyMywgMHhFCi0Jb3JpCXIzLHIzLDB4MDA3MAotCWx3eglyNCwgMChyMykKLQlsaXMJcjUsMHhGRkZDCi0Jb3JpCXI1LHI1LDB4NUZGRgotCWFuZAlyNCxyNCxyNQotCXN0dwlyNCwwKHIzKQotI2VuZGlmCiAJLyoKIAkgKiBDYWNoZSBtdXN0IGJlIGVuYWJsZWQgaGVyZSBmb3Igc3RhY2staW4tY2FjaGUgdHJpY2suCiAJICogVGhpcyBtZWFucyB3ZSBuZWVkIHRvIGVuYWJsZSB0aGUgQkFUUy4KQEAgLTM0Niw4ICsyODgsNiBAQAogCiAjaWZkZWYJUlVOX0RJQUcKIAotCS8qIFNyaToJIENvZGUgdG8gcnVuIHRoZSBkaWFnbm9zdGljIGF1dG9tYXRpY2FsbHkgKi8KLQogCS8qIExvYWQgUFhfQVVYIHJlZ2lzdGVyIGFkZHJlc3MgaW4gcjQgKi8KIAlsaXMJcjQsIDB4ZjgxMAogCW9yaQlyNCwgcjQsIDB4NgpAQCAtMzkyLDYgKzMzMiw3IEBACiAJLmdsb2JsCWludmFsaWRhdGVfYmF0cwogaW52YWxpZGF0ZV9iYXRzOgogCisJbGkJcjAsIDAKIAkvKiBpbnZhbGlkYXRlIEJBVHMgKi8KIAltdHNwcglJQkFUMFUsIHIwCiAJbXRzcHIJSUJBVDFVLCByMApAQCAtMTA0MCw2ICs5ODEsNyBAQAogCW1mbXNyCXI3CiAJbGkJcjgsTVNSX0lQCiAJYW5kYwlyNyxyNyxyOAorCW9yaQlyNyxyNyxNU1JfTUUJCS8qIEVuYWJsZSBNYWNoaW5lIENoZWNrICovCiAJbXRtc3IJcjcKIAogCW10bHIJcjQJCQkvKiByZXN0b3JlIGxpbmsgcmVnaXN0ZXIJKi8KQEAgLTEyMjQsOCArMTE2Niw5IEBACiAJc3luYwogCWlzeW5jCiAKLQkvKlNZTkNCRXxBQkUgaW4gSElEMSovCisJLyogTUNQfFNZTkNCRXxBQkUgaW4gSElEMSAqLwogCW1mc3ByCXI0LCBISUQxCisJb3JpcwlyNCwgcjQsIDB4ODAwMAogCW9yaQlyNCwgcjQsIDB4MEMwMAogCW10c3ByCUhJRDEsIHI0CiAJc3luYwpkaWZmIC0tZ2l0IGEvY3B1L21wYzg2eHgvdHJhcHMuYyBiL2NwdS9tcGM4Nnh4L3RyYXBzLmMKaW5kZXggOGVhMTRlNS4uYzg0YmZiZiAxMDA2NDQKLS0tIGEvY3B1L21wYzg2eHgvdHJhcHMuYworKysgYi9jcHUvbXBjODZ4eC90cmFwcy5jCkBAIC0zNCw3ICszNCw3IEBACiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiBpbnQgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikoc3RydWN0IHB0X3JlZ3MgKikgPSAwOwogI2VuZGlmCiAKQEAgLTEyMiw3ICsxMjIsNyBAQAogCQlyZXR1cm47CiAJfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikgKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTEzMCw4ICsxMzAsMTEgQEAKIAlwcmludGYoIk1hY2hpbmUgY2hlY2sgaW4ga2VybmVsIG1vZGUuXG4iKTsKIAlwcmludGYoIkNhdXNlZCBieSAoZnJvbSBtc3IpOiAiKTsKIAlwcmludGYoInJlZ3MgJXAgIiwgcmVncyk7Ci0Jc3dpdGNoIChyZWdzLT5tc3IgJiAweDAwMEYwMDAwKSB7Ci0JY2FzZSAoMHg4MDAwMDAwMCA+PiAxMik6CisJc3dpdGNoICggcmVncy0+bXNyICYgMHgwMDFGMDAwMCkgeworCWNhc2UgKDB4ODAwMDAwMDA+PjExKToKKwkJcHJpbnRmKCJNU1MgZXJyb3IuIE1TU1NSMDogJTA4eFxuIiwgbWZzcHIoU1BSTl9NU1NTUjApKTsKKwkJYnJlYWs7CisJY2FzZSAoMHg4MDAwMDAwMD4+MTIpOgogCQlwcmludGYoIk1hY2hpbmUgY2hlY2sgc2lnbmFsIC0gcHJvYmFibHkgZHVlIHRvIG1tIGZhdWx0XG4iCiAJCSAgICAgICAid2l0aCBtbXUgb2ZmXG4iKTsKIAkJYnJlYWs7CkBAIC0xNTUsNyArMTU4LDcgQEAKIHZvaWQKIEFsaWdubWVudEV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKSAocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMTcwLDcgKzE3Myw3IEBACiAJdW5zaWduZWQgY2hhciAqcCA9IHJlZ3MgPyAodW5zaWduZWQgY2hhciAqKShyZWdzLT5uaXApIDogTlVMTDsKIAlpbnQgaSwgajsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpIChyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0xOTMsNyArMTk2LDcgQEAKIHZvaWQKIFNvZnRFbXVFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikgKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTIwNSwxMCArMjA4LDExIEBACiB2b2lkCiBVbmtub3duRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpIChyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCisJcHJpbnRmKCJVbmtub3duRXhjZXB0aW9uIHJlZ3NAJXhcbiIsIHJlZ3MpOwogCXByaW50ZigiQmFkIHRyYXAgYXQgUEM6ICVseCwgU1I6ICVseCwgdmVjdG9yPSVseFxuIiwKIAkgICAgICAgcmVncy0+bmlwLCByZWdzLT5tc3IsIHJlZ3MtPnRyYXApOwogCV9leGNlcHRpb24oMCwgcmVncyk7CmRpZmYgLS1naXQgYS9jcHUvbXBjOHh4L2JlZGJ1Z184NjAuYyBiL2NwdS9tcGM4eHgvYmVkYnVnXzg2MC5jCmluZGV4IGU5MWExMDAuLjVkNTIzNjYgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4eHgvYmVkYnVnXzg2MC5jCisrKyBiL2NwdS9tcGM4eHgvYmVkYnVnXzg2MC5jCkBAIC0xMCw3ICsxMCw3IEBACiAjaW5jbHVkZSA8YmVkYnVnL3BwYy5oPgogI2luY2x1ZGUgPGJlZGJ1Zy90eXBlLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CRURCVUcpICYmIGRlZmluZWQoQ09ORklHXzh4eCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKSAmJiBkZWZpbmVkKENPTkZJR184eHgpCiAKICNkZWZpbmUgTUFYX0JSRUFLX1BPSU5UUyAyCiAKZGlmZiAtLWdpdCBhL2NwdS9tcGM4eHgvZmVjLmMgYi9jcHUvbXBjOHh4L2ZlYy5jCmluZGV4IDZkMjc1NWUuLjA4YTM3MTUgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4eHgvZmVjLmMKKysrIGIvY3B1L21wYzh4eC9mZWMuYwpAQCAtMzEsNyArMzEsNyBAQAogCiAjdW5kZWYJRVRfREVCVUcKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgXAorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmIFwKIAkoZGVmaW5lZChGRUNfRU5FVCkgfHwgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkVDMSkgfHwgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkVDMikpCiAKIC8qIGNvbXBhdGliaWxpdHkgdGVzdCwgaWYgb25seSBGRUNfRU5FVCBkZWZpbmVkIGFzc3VtZSBFVEhFUiBvbiBGRUMxICovCkBAIC00OSw3ICs0OSw3IEBACiAjaWYgZGVmaW5lZChXQU5UX01JSSkKICNpbmNsdWRlIDxtaWlwaHkuaD4KIAotI2lmICEoZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpKQorI2lmICEoZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKSkKICNlcnJvciAiQ09ORklHX01JSSBoYXMgdG8gYmUgZGVmaW5lZCEiCiAjZW5kaWYKIApAQCAtMTgyLDcgKzE4Miw3IEBACiAKIAkJZXRoX3JlZ2lzdGVyKGRldik7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCiAJCW1paXBoeV9yZWdpc3RlcihkZXYtPm5hbWUsCiAJCQlmZWM4eHhfbWlpcGh5X3JlYWQsIGZlYzh4eF9taWlwaHlfd3JpdGUpOwogI2VuZGlmCkBAIC0yNjgsNyArMjY4LDcgQEAKIAogCQkJbGVuZ3RoIC09IDQ7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9DRFApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0NEUCkKIAkJCWlmICgocnhbMF0gJiAxKSAhPSAwCiAJCQkgICAgJiYgbWVtY21wICgodWNoYXIgKikgcngsIE5ldEJjYXN0QWRkciwgNikgIT0gMAogCQkJICAgICYmIG1lbWNtcCAoKHVjaGFyICopIHJ4LCBOZXRDRFBBZGRyLCA2KSAhPSAwKQpAQCAtNjA4LDcgKzYwOCw3IEBACiAJZmVjcC0+ZmVjX2FkZHJfaGlnaCA9IChlYVs0XSA8PCA4KSB8IChlYVs1XSk7CiAjdW5kZWYgZWEKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0NEUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQ0RQKQogCS8qCiAJICogVHVybiBvbiBtdWx0aWNhc3QgYWRkcmVzcyBoYXNoIHRhYmxlCiAJICovCkBAIC03ODcsNyArNzg3LDcgQEAKIAllZmlzLT5pbml0aWFsaXplZCA9IDA7CiB9CiAKLSNpZiBkZWZpbmVkKENGR19ESVNDT1ZFUl9QSFkpIHx8IGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQorI2lmIGRlZmluZWQoQ0ZHX0RJU0NPVkVSX1BIWSkgfHwgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogCiAvKiBNYWtlIE1JSSByZWFkL3dyaXRlIGNvbW1hbmRzIGZvciB0aGUgRkVDLgogKi8KQEAgLTg1Miw3ICs4NTIsNyBAQAogI2VuZGlmCiAJcmV0dXJuIChtaWlfcmVwbHkgJiAweGZmZmYpOwkJLyogZGF0YSByZWFkIGZyb20gcGh5ICovCiB9Ci0jZW5kaWYgLyogQ0ZHX0RJU0NPVkVSX1BIWSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpICovCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ0ZHX0RJU0NPVkVSX1BIWSkKIHN0YXRpYyBpbnQgbWlpX2Rpc2NvdmVyX3BoeShzdHJ1Y3QgZXRoX2RldmljZSAqZGV2KQpAQCAtOTI2LDcgKzkyNiw3IEBACiB9CiAjZW5kaWYJLyogQ0ZHX0RJU0NPVkVSX1BIWSAqLwogCi0jaWYgKGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKSkgJiYgIWRlZmluZWQoQ09ORklHX0JJVEJBTkdNSUkpCisjaWYgKGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkpICYmICFkZWZpbmVkKENPTkZJR19CSVRCQU5HTUlJKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogbWlpX2luaXQgLS0gSW5pdGlhbGl6ZSB0aGUgTUlJIGZvciBNSUkgY29tbWFuZCB3aXRob3V0IGV0aGVybmV0CkBAIC0xMDIwLDYgKzEwMjAsNiBAQAogI2VuZGlmCiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKSAmJiAhZGVmaW5lZChDT05GSUdfQklUQkFOR01JSSkqLworI2VuZGlmCiAKLSNlbmRpZgkvKiBDRkdfQ01EX05FVCwgRkVDX0VORVQgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L21wYzh4eC9rZ2RiLlMgYi9jcHUvbXBjOHh4L2tnZGIuUwppbmRleCAxMWMzYzY5Li44MTJiYWEzIDEwMDY0NAotLS0gYS9jcHUvbXBjOHh4L2tnZGIuUworKysgYi9jcHUvbXBjOHh4L2tnZGIuUwpAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogI2luY2x1ZGUgPGFzbS9tbXUuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAKICAvKgogICogY2FjaGUgZmx1c2hpbmcgcm91dGluZXMgZm9yIGtnZGIKQEAgLTcxLDQgKzcxLDQgQEAKIAlTWU5DCiAJYmxyCiAKLSNlbmRpZiAvKiBDRkdfQ01EX0tHREIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L21wYzh4eC9zY2MuYyBiL2NwdS9tcGM4eHgvc2NjLmMKaW5kZXggNmI5MTEwZi4uNzQ0ZGNkZCAxMDA2NDQKLS0tIGEvY3B1L21wYzh4eC9zY2MuYworKysgYi9jcHUvbXBjOHh4L3NjYy5jCkBAIC0zOCw3ICszOCw3IEBACiAjaW5jbHVkZSA8bmV0Lmg+CiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBkZWZpbmVkKFNDQ19FTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmIGRlZmluZWQoU0NDX0VORVQpCiAKIC8qIEV0aGVybmV0IFRyYW5zbWl0IGFuZCBSZWNlaXZlIEJ1ZmZlcnMgKi8KICNkZWZpbmUgREJVRl9MRU5HVEggIDE1MjAKQEAgLTU2Nyw0ICs1NjcsNCBAQAogCQkoU0NDX0dTTVJMX0VOUiB8IFNDQ19HU01STF9FTlQpOwogfQogI2VuZGlmCi0jZW5kaWYJLyogQ0ZHX0NNRF9ORVQsIFNDQ19FTkVUICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9tcGM4eHgvc2VyaWFsLmMgYi9jcHUvbXBjOHh4L3NlcmlhbC5jCmluZGV4IGZmYzg5OGMuLjY4ODA0Y2MgMTAwNjQ0Ci0tLSBhL2NwdS9tcGM4eHgvc2VyaWFsLmMKKysrIGIvY3B1L21wYzh4eC9zZXJpYWwuYwpAQCAtNjY2LDcgKzY2Niw3IEBACiB9CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAKIHZvaWQKIGtnZGJfc2VyaWFsX2luaXQodm9pZCkKQEAgLTcyMyw2ICs3MjMsNiBAQAogewogCXJldHVybjsKIH0KLSNlbmRpZgkvKiBDRkdfQ01EX0tHREIJKi8KKyNlbmRpZgogCiAjZW5kaWYJLyogQ09ORklHXzh4eF9DT05TX05PTkUgKi8KZGlmZiAtLWdpdCBhL2NwdS9tcGM4eHgvc3RhcnQuUyBiL2NwdS9tcGM4eHgvc3RhcnQuUwppbmRleCAzM2EzZjZjLi5lY2E0YjUwIDEwMDY0NAotLS0gYS9jcHUvbXBjOHh4L3N0YXJ0LlMKKysrIGIvY3B1L21wYzh4eC9zdGFydC5TCkBAIC0yMjQsNyArMjI0LDcgQEAKIC8qIEFsaWdubWVudCBleGNlcHRpb24uICovCiAJLiA9IDB4NjAwCiBBbGlnbm1lbnQ6Ci0JRVhDRVBUSU9OX1BST0xPRworCUVYQ0VQVElPTl9QUk9MT0coU1JSMCwgU1JSMSkKIAltZnNwcglyNCxEQVIKIAlzdHcJcjQsX0RBUihyMjEpCiAJbWZzcHIJcjUsRFNJU1IKQEAgLTI0Miw3ICsyNDIsNyBAQAogLyogUHJvZ3JhbSBjaGVjayBleGNlcHRpb24gKi8KIAkuID0gMHg3MDAKIFByb2dyYW1DaGVjazoKLQlFWENFUFRJT05fUFJPTE9HCisJRVhDRVBUSU9OX1BST0xPRyhTUlIwLCBTUlIxKQogCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKIAlsaQlyMjAsTVNSX0tFUk5FTAogCXJsd2ltaQlyMjAscjIzLDAsMTYsMTYJCS8qIGNvcHkgRUUgYml0IGZyb20gc2F2ZWQgTVNSICovCmRpZmYgLS1naXQgYS9jcHUvbXBjOHh4L3RyYXBzLmMgYi9jcHUvbXBjOHh4L3RyYXBzLmMKaW5kZXggNjdiNzVjYy4uZTFlYzg4OSAxMDA2NDQKLS0tIGEvY3B1L21wYzh4eC90cmFwcy5jCisrKyBiL2NwdS9tcGM4eHgvdHJhcHMuYwpAQCAtMzYsMTEgKzM2LDExIEBACiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiBpbnQgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikoc3RydWN0IHB0X3JlZ3MgKikgPSAwOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CRURCVUcpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JFREJVRykKIGV4dGVybiB2b2lkIGRvX2JlZGJ1Z19icmVha3BvaW50KHN0cnVjdCBwdF9yZWdzICopOwogI2VuZGlmCiAKQEAgLTEyNiw3ICsxMjYsNyBAQAogCQlyZXR1cm47CiAJfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMTU5LDcgKzE1OSw3IEBACiB2b2lkCiBBbGlnbm1lbnRFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMTcxLDcgKzE3MSw3IEBACiB2b2lkCiBQcm9ncmFtQ2hlY2tFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMTgzLDcgKzE4Myw3IEBACiB2b2lkCiBTb2Z0RW11RXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTE5Niw3ICsxOTYsNyBAQAogdm9pZAogVW5rbm93bkV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0yMTAsNyArMjEwLDcgQEAKIHsKICAgcHJpbnRmKCJEZWJ1Z2dlciB0cmFwIGF0IEAgJWx4XG4iLCByZWdzLT5uaXAgKTsKICAgc2hvd19yZWdzKHJlZ3MpOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogICBkb19iZWRidWdfYnJlYWtwb2ludCggcmVncyApOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9jcHUvbmlvcy9jcHUuYyBiL2NwdS9uaW9zL2NwdS5jCmluZGV4IGQyYmIyYzAuLjU1MTllODIgMTAwNjQ0Ci0tLSBhL2NwdS9uaW9zL2NwdS5jCisrKyBiL2NwdS9uaW9zL2NwdS5jCkBAIC0zNCw3ICszNCw3IEBACiAKIAkvKiBHZXQgY3B1IHZlcnNpb24gaW5mbyAqLwogCXZhbCA9IHJkY3RsIChDVExfQ1BVX0lEKTsKLQlwcmludGYgKCJDUFU6ICIpOworCXB1dHMgKCJDUFU6ICAgIik7CiAJcHJpbnRmICgiJXMiLCAodmFsICYgMHgwMDAwODAwMCkgPyAiTmlvcy0xNiAiIDogIk5pb3MtMzIgIik7CiAJcmV2X21ham9yID0gKHZhbD4+MTIpICYgMHgwNzsKIAlyZXZfbWlub3IgPSAodmFsPj40KSAmIDB4MGZmOwpkaWZmIC0tZ2l0IGEvY3B1L25pb3MvaW50ZXJydXB0cy5jIGIvY3B1L25pb3MvaW50ZXJydXB0cy5jCmluZGV4IDQ4ZmM4MWUuLjc1ZTQ5MWQgMTAwNjQ0Ci0tLSBhL2NwdS9uaW9zL2ludGVycnVwdHMuYworKysgYi9jcHUvbmlvcy9pbnRlcnJ1cHRzLmMKQEAgLTE3Myw3ICsxNzMsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JUlEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lSUSkKIGludCBkb19pcnFpbmZvIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKIAlpbnQgdmVjOwpAQCAtMTkzLDQgKzE5Myw0IEBACiAKIAlyZXR1cm4gKDApOwogfQotI2VuZGlmICAvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lSUSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jcHUvbmlvczIvaW50ZXJydXB0cy5jIGIvY3B1L25pb3MyL2ludGVycnVwdHMuYwppbmRleCA0Njg1MTYxLi5hZWI1YjY1IDEwMDY0NAotLS0gYS9jcHUvbmlvczIvaW50ZXJydXB0cy5jCisrKyBiL2NwdS9uaW9zMi9pbnRlcnJ1cHRzLmMKQEAgLTIwNCw3ICsyMDQsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lSUSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSVJRKQogaW50IGRvX2lycWluZm8gKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQogewogCWludCBpOwpAQCAtMjI4LDQgKzIyOCw0IEBACiAKIAlyZXR1cm4gKDApOwogfQotI2VuZGlmICAvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lSUSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jcHUvcHBjNHh4LzQwNWdwX3BjaS5jIGIvY3B1L3BwYzR4eC80MDVncF9wY2kuYwppbmRleCA3MTM0MzU1Li4yODM3OTI5IDEwMDY0NAotLS0gYS9jcHUvcHBjNHh4LzQwNWdwX3BjaS5jCisrKyBiL2NwdS9wcGM0eHgvNDA1Z3BfcGNpLmMKQEAgLTc3LDExICs3NywyMSBAQAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxwY2kuaD4KIAorI2lmZGVmIENPTkZJR19QQ0kKKwogREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CiAKLSNpZiBkZWZpbmVkKENPTkZJR180MDVHUCkgfHwgZGVmaW5lZChDT05GSUdfNDA1RVApCisvKgorICogQm9hcmQtc3BlY2lmaWMgcGNpIGluaXRpYWxpemF0aW9uCisgKiBQbGF0Zm9ybSBjb2RlIGNhbiByZWltcGxlbWVudCBwY2lfcHJlX2luaXQoKSBpZiBuZWVkZWQKKyAqLworaW50IF9fcGNpX3ByZV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKK3sKKwlyZXR1cm4gMTsKK30KK2ludCBwY2lfcHJlX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrLCBhbGlhcygiX19wY2lfcHJlX2luaXQiKSkpOwogCi0jaWZkZWYgQ09ORklHX1BDSQorI2lmIGRlZmluZWQoQ09ORklHXzQwNUdQKSB8fCBkZWZpbmVkKENPTkZJR180MDVFUCkKIAogI2lmIGRlZmluZWQoQ09ORklHX1BNQzQwNSkKIHVzaG9ydCBwbWM0MDVfcGNpX3N1YnN5c19kZXZpY2VpZCh2b2lkKTsKQEAgLTE5MSw2ICsyMDEsMTMgQEAKIAlpZiAoaG9zZS0+cGNpX2ZiKQogCQlwY2lhdXRvX3JlZ2lvbl9pbml0KGhvc2UtPnBjaV9mYik7CiAKKwkvKiBMZXQgYm9hcmQgY2hhbmdlL21vZGlmeSBob3NlICYgZG8gaW5pdGlhbCBjaGVja3MgKi8KKwlpZiAocGNpX3ByZV9pbml0IChob3NlKSA9PSAwKSB7CisJCXByaW50ZigiUENJOiBCb2FyZC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBmYWlsZWQuXG4iKTsKKwkJcHJpbnRmKCJQQ0k6IENvbmZpZ3VyYXRpb24gYWJvcnRlZC5cbiIpOworCQlyZXR1cm47CisJfQorCiAJcGNpX3JlZ2lzdGVyX2hvc2UoaG9zZSk7CiAKIAkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwpAQCAtMzgwLDcgKzM5Nyw3IEBACiAJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIGRldiwgUENJX0NPTU1BTkQsIGNtZHN0YXQpOwogfQogCi0jaWYgIShkZWZpbmVkKENPTkZJR19QSVA0MDUpIHx8IGRlZmluZWQgKENPTkZJR19NSVA0MDUpKSAmJiAhKGRlZmluZWQgKENPTkZJR19TT0xJRENBUkQzKSkKKyNpZiAhKGRlZmluZWQoQ09ORklHX1BJUDQwNSkgfHwgZGVmaW5lZCAoQ09ORklHX01JUDQwNSkpICYmICEoZGVmaW5lZCAoQ09ORklHX1NDMykpCiAKIC8qCiAgKkFzIGlzIHRoZXNlIGZ1bmN0cyBnZXQgY2FsbGVkIG91dCBvZiBmbGFzaCBOb3QgYSBob3JyaWJsZQpAQCAtNDE2LDE0ICs0MzMsMTIgQEAKIAogI2VuZGlmCiAKLSNlbmRpZiAvKiBDT05GSUdfUENJICovCi0KICNlbmRpZiAvKiBDT05GSUdfNDA1R1AgKi8KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAqIENPTkZJR180NDAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmIGRlZmluZWQoQ09ORklHXzQ0MCkgJiYgZGVmaW5lZChDT05GSUdfUENJKQorI2lmIGRlZmluZWQoQ09ORklHXzQ0MCkKIAogc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBwcGM0NDBfaG9zZSA9IHswfTsKIApAQCAtNDk2LDE0ICs1MTEsMTIgQEAKIAogCXBjaV9zZXR1cF9pbmRpcmVjdChob3NlLCBQQ0lYMF9DRkdBRFIsIFBDSVgwX0NGR0RBVEEpOwogCi0jaWYgZGVmaW5lZChDRkdfUENJX1BSRV9JTklUKQogCS8qIExldCBib2FyZCBjaGFuZ2UvbW9kaWZ5IGhvc2UgJiBkbyBpbml0aWFsIGNoZWNrcyAqLwogCWlmIChwY2lfcHJlX2luaXQgKGhvc2UpID09IDApIHsKIAkJcHJpbnRmKCJQQ0k6IEJvYXJkLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGZhaWxlZC5cbiIpOwogCQlwcmludGYoIlBDSTogQ29uZmlndXJhdGlvbiBhYm9ydGVkLlxuIik7CiAJCXJldHVybjsKIAl9Ci0jZW5kaWYKIAogCXBjaV9yZWdpc3Rlcl9ob3NlKCBob3NlICk7CiAKQEAgLTU3NSw0ICs1ODgsNSBAQAogI2VuZGlmCiB9CiAKLSNlbmRpZiAvKiBDT05GSUdfNDQwICYgQ09ORklHX1BDSSAqLworI2VuZGlmIC8qIENPTkZJR180NDAgKi8KKyNlbmRpZiAvKiBDT05GSUdfUENJICovCmRpZmYgLS1naXQgYS9jcHUvcHBjNHh4LzQ0eF9zcGRfZGRyLmMgYi9jcHUvcHBjNHh4LzQ0eF9zcGRfZGRyLmMKaW5kZXggYzUwMGQzZi4uNmQ2ZmJhMSAxMDA2NDQKLS0tIGEvY3B1L3BwYzR4eC80NHhfc3BkX2Rkci5jCisrKyBiL2NwdS9wcGM0eHgvNDR4X3NwZF9kZHIuYwpAQCAtNzAsNiArNzAsMTUgQEAKIAogI2RlZmluZSBPTkVfQklMTElPTgkxMDAwMDAwMDAwCiAKKy8qCisgKiBCb2FyZC1zcGVjaWZpYyBQbGF0Zm9ybSBjb2RlIGNhbiByZWltcGxlbWVudCBzcGRfZGRyX2luaXRfaGFuZyAoKSBpZiBuZWVkZWQKKyAqLwordm9pZCBfX3NwZF9kZHJfaW5pdF9oYW5nICh2b2lkKQoreworCWhhbmcgKCk7Cit9Cit2b2lkIHNwZF9kZHJfaW5pdF9oYW5nICh2b2lkKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrLCBhbGlhcygiX19zcGRfZGRyX2luaXRfaGFuZyIpKSk7CisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgfCAgTWVtb3J5IENvbnRyb2xsZXIgT3B0aW9ucyAwCiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0yNjIsNyArMjcxLDcgQEAKICNpZmRlZiBDRkdfU0lNVUxBVEVfU1BEX0VFUFJPTQogZXh0ZXJuIHVuc2lnbmVkIGNoYXIgY2ZnX3NpbXVsYXRlX3NwZF9lZXByb21bMTI4XTsKICNlbmRpZgotdm9pZCBwcm9ncmFtX3RsYih1MzIgc3RhcnQsIHUzMiBzaXplLCB1MzIgdGxiX3dvcmQyX2lfdmFsdWUpOwordm9pZCBwcm9ncmFtX3RsYih1MzIgcGh5c19hZGRyLCB1MzIgdmlydF9hZGRyLCB1MzIgc2l6ZSwgdTMyIHRsYl93b3JkMl9pX3ZhbHVlKTsKIAogc3RhdGljIHVuc2lnbmVkIGNoYXIgc3BkX3JlYWQodWNoYXIgY2hpcCwgdWludCBhZGRyKTsKIHN0YXRpYyB2b2lkIGdldF9zcGRfaW5mbyh1bnNpZ25lZCBsb25nICpkaW1tX3BvcHVsYXRlZCwKQEAgLTM3Myw3ICszODIsNyBAQAogCiAjaWZkZWYgQ09ORklHX1BST0dfU0RSQU1fVExCIC8qIHRoaXMgZGVmaW5lIHNob3VsZCBldmVudHVhbGx5IGJlIHJlbW92ZWQgKi8KIAkvKiBhbmQgcHJvZ3JhbSB0bGIgZW50cmllcyBmb3IgdGhpcyBzaXplIChkeW5hbWljKSAqLwotCXByb2dyYW1fdGxiKDAsIHRvdGFsX3NpemUsIE1ZX1RMQl9XT1JEMl9JX0VOQUJMRSk7CisJcHJvZ3JhbV90bGIoMCwgMCwgdG90YWxfc2l6ZSwgTVlfVExCX1dPUkQyX0lfRU5BQkxFKTsKICNlbmRpZgogCiAJLyoKQEAgLTQ2Nyw3ICs0NzYsNyBAQAogCiAJaWYgKGRpbW1fZm91bmQgPT0gRkFMU0UpIHsKIAkJcHJpbnRmKCJFUlJPUiAtIE5vIG1lbW9yeSBpbnN0YWxsZWQuIEluc3RhbGwgYSBERFItU0RSQU0gRElNTS5cblxuIik7Ci0JCWhhbmcoKTsKKwkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJfQogfQogCkBAIC00OTAsNyArNDk5LDcgQEAKIAkJCQkgICAgICAgZGltbV9udW0pOwogCQkJCXByaW50ZigiT25seSBERFIgU0RSQU0gRElNTXMgYXJlIHN1cHBvcnRlZC5cbiIpOwogCQkJCXByaW50ZigiUmVwbGFjZSB0aGUgRElNTSBtb2R1bGUgd2l0aCBhIHN1cHBvcnRlZCBESU1NLlxuXG4iKTsKLQkJCQloYW5nKCk7CisJCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTUxMCw3ICs1MTksNyBAQAogCQkJaWYgKHZvbHRhZ2VfdHlwZSAhPSAweDA0KSB7CiAJCQkJcHJpbnRmKCJFUlJPUjogRElNTSAlbHUgd2l0aCB1bnN1cHBvcnRlZCB2b2x0YWdlIGxldmVsLlxuIiwKIAkJCQkgICAgICAgZGltbV9udW0pOwotCQkJCWhhbmcoKTsKKwkJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAkJCX0gZWxzZSB7CiAJCQkJZGVidWcoIkRJTU0gJWx1IHZvbHRhZ2UgbGV2ZWwgc3VwcG9ydGVkLlxuIiwgZGltbV9udW0pOwogCQkJfQpAQCAtNTgxLDcgKzU5MCw3IEBACiAJCQkJcHJpbnRmKCJXQVJOSU5HOiBESU1NIHdpdGggZGF0YXdpZHRoIG9mICVsdSBiaXRzLlxuIiwKIAkJCQkgICAgICAgZGF0YV93aWR0aCk7CiAJCQkJcHJpbnRmKCJPbmx5IERJTU1zIHdpdGggMzIgb3IgNjQgYml0IGRhdGF3aWR0aHMgc3VwcG9ydGVkLlxuIik7Ci0JCQkJaGFuZygpOworCQkJCXNwZF9kZHJfaW5pdF9oYW5nICgpOwogCQkJfQogCQkJYnJlYWs7CiAJCX0KQEAgLTc2OSw3ICs3NzgsNyBAQAogCQkJCWlmICgodGN5Y19yZWcgJiAweDBGKSA+PSAxMCkgewogCQkJCQlwcmludGYoIkVSUk9SOiBUY3ljIGluY29ycmVjdCBmb3IgRElNTSBpbiBzbG90ICVsdVxuIiwKIAkJCQkJICAgICAgIGRpbW1fbnVtKTsKLQkJCQkJaGFuZygpOworCQkJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAkJCQl9CiAKIAkJCQljeWNsZV90aW1lX25zX3hfMTBbY2FzX2luZGV4XSA9CkBAIC04NDksNyArODU4LDcgQEAKIAkJcHJpbnRmKCJFUlJPUjogTm8gc3VwcG9ydGVkIENBUyBsYXRlbmN5IHdpdGggdGhlIGluc3RhbGxlZCBESU1Ncy5cbiIpOwogCQlwcmludGYoIk9ubHkgQ0FTIGxhdGVuY2llcyBvZiAyLjAsIDIuNSwgYW5kIDMuMCBhcmUgc3VwcG9ydGVkLlxuIik7CiAJCXByaW50ZigiTWFrZSBzdXJlIHRoZSBQTEIgc3BlZWQgaXMgd2l0aGluIHRoZSBzdXBwb3J0ZWQgcmFuZ2UuXG4iKTsKLQkJaGFuZygpOworCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAl9CiAKIAkvKgpAQCAtMTAwOCw2ICsxMDE3LDcgQEAKIAkJCSAqLwogCQkJZm9yIChpID0gMDsgaSA8IE5VTU1FTVRFU1RTOyBpKyspIHsKIAkJCQlmb3IgKGogPSAwOyBqIDwgTlVNTUVNV09SRFM7IGorKykgeworCQkJCQkvKiBwcmludGYoImJhbmsgZW5hYmxlZCBiYXNlOiV4XG4iLCAmbWVtYmFzZVtqXSk7ICovCiAJCQkJCW1lbWJhc2Vbal0gPSB0ZXN0W2ldW2pdOwogCQkJCQlwcGNEY2JmKCh1bnNpZ25lZCBsb25nKSYobWVtYmFzZVtqXSkpOwogCQkJCX0KQEAgLTExNjAsNyArMTE3MCw3IEBACiAJICovCiAJaWYgKHdpbmRvd19mb3VuZCA9PSBGQUxTRSkgewogCQlwcmludGYoIkVSUk9SOiBDYW5ub3QgZGV0ZXJtaW5lIGEgY29tbW9uIHJlYWQgZGVsYXkuXG4iKTsKLQkJaGFuZygpOworCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAl9CiAKIAkvKgpAQCAtMTMxMCw3ICsxMzIwLDcgQEAKIAkJCQlwcmludGYoIkVSUk9SOiBVbnN1cHBvcnRlZCB2YWx1ZSBmb3IgdGhlIGJhbmtzaXplOiAlZC5cbiIsCiAJCQkJICAgICAgIGJhbmtfc2l6ZV9pZCk7CiAJCQkJcHJpbnRmKCJSZXBsYWNlIHRoZSBESU1NIG1vZHVsZSB3aXRoIGEgc3VwcG9ydGVkIERJTU0uXG5cbiIpOwotCQkJCWhhbmcoKTsKKwkJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAkJCX0KIAogCQkJc3dpdGNoIChudW1fY29sX2FkZHIpIHsKQEAgLTEzMzIsNyArMTM0Miw3IEBACiAJCQkJcHJpbnRmKCJFUlJPUjogVW5zdXBwb3J0ZWQgdmFsdWUgZm9yIG51bWJlciBvZiAiCiAJCQkJICAgICAgICJjb2x1bW4gYWRkcmVzc2VzOiAlZC5cbiIsIG51bV9jb2xfYWRkcik7CiAJCQkJcHJpbnRmKCJSZXBsYWNlIHRoZSBESU1NIG1vZHVsZSB3aXRoIGEgc3VwcG9ydGVkIERJTU0uXG5cbiIpOwotCQkJCWhhbmcoKTsKKwkJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAkJCX0KIAogCQkJLyoKQEAgLTEzNDAsMTQgKzEzNTAsMTQgQEAKIAkJCSAqLwogCQkJY3IgfD0gU0RSQU1fQlhDUl9TREJFOwogCi0gCQkJZm9yIChpID0gMDsgaSA8IG51bV9iYW5rczsgaSsrKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2JhbmtzOyBpKyspIHsKIAkJCQliYW5rX3Bhcm1zW2N0cmxfYmFua19udW1bZGltbV9udW1dK2ldLmJhbmtfc2l6ZV9ieXRlcyA9CiAJCQkJCSg0IDw8IDIwKSAqIGJhbmtfc2l6ZV9pZDsKIAkJCQliYW5rX3Bhcm1zW2N0cmxfYmFua19udW1bZGltbV9udW1dK2ldLmNyID0gY3I7CiAJCQkJZGVidWcoIkRJTU0lZC1iYW5rICVkIChTRFJBTTBfQiVkQ1IpOiBiYW5rX3NpemVfYnl0ZXM9JWRcbiIsCiAJCQkJICAgICAgZGltbV9udW0sIGksIGN0cmxfYmFua19udW1bZGltbV9udW1dK2ksCiAJCQkJICAgICAgYmFua19wYXJtc1tjdHJsX2JhbmtfbnVtW2RpbW1fbnVtXStpXS5iYW5rX3NpemVfYnl0ZXMpOwotIAkJCX0KKwkJCX0KIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvY3B1L3BwYzR4eC80NHhfc3BkX2RkcjIuYyBiL2NwdS9wcGM0eHgvNDR4X3NwZF9kZHIyLmMKaW5kZXggNDhiOWVlMi4uNWZlZjI3YiAxMDA2NDQKLS0tIGEvY3B1L3BwYzR4eC80NHhfc3BkX2RkcjIuYworKysgYi9jcHUvcHBjNHh4LzQ0eF9zcGRfZGRyMi5jCkBAIC01OCw4ICs1OCw4IEBACiAjZGVmaW5lIFNEUkFNX0REUjIJMgogI2RlZmluZSBTRFJBTV9OT05FCTAKIAotI2RlZmluZSBNQVhESU1NUyAJMgotI2RlZmluZSBNQVhSQU5LUyAJNAorI2RlZmluZSBNQVhESU1NUwkyCisjZGVmaW5lIE1BWFJBTktTCTQKICNkZWZpbmUgTUFYQlhDRgkJNAogI2RlZmluZSBNQVhfU1BEX0JZVEVTCTI1NiAgIC8qIE1heCBudW1iZXIgb2YgYnl0ZXMgb24gdGhlIERJTU0ncyBTUEQgRUVQUk9NICovCiAKQEAgLTEyOSw2ICsxMjksMTYgQEAKICNkZWZpbmUgTVlfVExCX1dPUkQyX0lfRU5BQkxFCVRMQl9XT1JEMl9JX0VOQUJMRQkvKiBkaXNhYmxlIGNhY2hpbmcgb24gU0RSQU0gKi8KICNlbmRpZgogCisvKgorICogQm9hcmQtc3BlY2lmaWMgUGxhdGZvcm0gY29kZSBjYW4gcmVpbXBsZW1lbnQgc3BkX2Rkcl9pbml0X2hhbmcgKCkgaWYgbmVlZGVkCisgKi8KK3ZvaWQgX19zcGRfZGRyX2luaXRfaGFuZyAodm9pZCkKK3sKKwloYW5nICgpOworfQordm9pZCBzcGRfZGRyX2luaXRfaGFuZyAodm9pZCkgX19hdHRyaWJ1dGVfXygod2VhaywgYWxpYXMoIl9fc3BkX2Rkcl9pbml0X2hhbmciKSkpOworCisKIC8qIFByaXZhdGUgU3RydWN0dXJlIERlZmluaXRpb25zICovCiAKIC8qIGVudW0gb25seSB0byBlYXNlIGNvZGUgZm9yIGNhcyBsYXRlbmN5IHNldHRpbmcgKi8KQEAgLTE0NCw3ICsxNTQsNyBAQAogICogUHJvdG90eXBlcwogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzZHJhbV9tZW1zaXplKHZvaWQpOwotdm9pZCBwcm9ncmFtX3RsYih1MzIgc3RhcnQsIHUzMiBzaXplLCB1MzIgdGxiX3dvcmQyX2lfdmFsdWUpOwordm9pZCBwcm9ncmFtX3RsYih1MzIgcGh5c19hZGRyLCB1MzIgdmlydF9hZGRyLCB1MzIgc2l6ZSwgdTMyIHRsYl93b3JkMl9pX3ZhbHVlKTsKIHN0YXRpYyB2b2lkIGdldF9zcGRfaW5mbyh1bnNpZ25lZCBsb25nICpkaW1tX3BvcHVsYXRlZCwKIAkJCSB1bnNpZ25lZCBjaGFyICppaWMwX2RpbW1fYWRkciwKIAkJCSB1bnNpZ25lZCBsb25nIG51bV9kaW1tX2JhbmtzKTsKQEAgLTUyOCw3ICs1MzgsNyBAQAogCWRyYW1fc2l6ZSA9IHNkcmFtX21lbXNpemUoKTsKIAogCS8qIGFuZCBwcm9ncmFtIHRsYiBlbnRyaWVzIGZvciB0aGlzIHNpemUgKGR5bmFtaWMpICovCi0JcHJvZ3JhbV90bGIoMCwgZHJhbV9zaXplLCBNWV9UTEJfV09SRDJfSV9FTkFCTEUpOworCXByb2dyYW1fdGxiKDAsIDAsIGRyYW1fc2l6ZSwgTVlfVExCX1dPUkQyX0lfRU5BQkxFKTsKIAogCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJICogRFFTIGNhbGlicmF0aW9uLgpAQCAtNTgyLDcgKzU5Miw3IEBACiAKIAlpZiAoZGltbV9mb3VuZCA9PSBGQUxTRSkgewogCQlwcmludGYoIkVSUk9SIC0gTm8gbWVtb3J5IGluc3RhbGxlZC4gSW5zdGFsbCBhIEREUi1TRFJBTSBESU1NLlxuXG4iKTsKLQkJaGFuZygpOworCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAl9CiB9CiAKQEAgLTYyOSw0MiArNjM5LDQyIEBACiAJCQkJICAgICAgICJzbG90ICVkLlxuIiwgKHVuc2lnbmVkIGludClkaW1tX251bSk7CiAJCQkJcHJpbnRmKCJPbmx5IEREUiBhbmQgRERSMiBTRFJBTSBESU1NcyBhcmUgc3VwcG9ydGVkLlxuIik7CiAJCQkJcHJpbnRmKCJSZXBsYWNlIHRoZSBESU1NIG1vZHVsZSB3aXRoIGEgc3VwcG9ydGVkIERJTU0uXG5cbiIpOwotCQkJCWhhbmcoKTsKKwkJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgMjoKIAkJCQlwcmludGYoIkVSUk9SOiBFRE8gRElNTSBkZXRlY3RlZCBpbiBzbG90ICVkLlxuIiwKIAkJCQkgICAgICAgKHVuc2lnbmVkIGludClkaW1tX251bSk7CiAJCQkJcHJpbnRmKCJPbmx5IEREUiBhbmQgRERSMiBTRFJBTSBESU1NcyBhcmUgc3VwcG9ydGVkLlxuIik7CiAJCQkJcHJpbnRmKCJSZXBsYWNlIHRoZSBESU1NIG1vZHVsZSB3aXRoIGEgc3VwcG9ydGVkIERJTU0uXG5cbiIpOwotCQkJCWhhbmcoKTsKKwkJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgMzoKIAkJCQlwcmludGYoIkVSUk9SOiBQaXBlbGluZWQgTmliYmxlIERJTU0gZGV0ZWN0ZWQgaW4gc2xvdCAlZC5cbiIsCiAJCQkJICAgICAgICh1bnNpZ25lZCBpbnQpZGltbV9udW0pOwogCQkJCXByaW50ZigiT25seSBERFIgYW5kIEREUjIgU0RSQU0gRElNTXMgYXJlIHN1cHBvcnRlZC5cbiIpOwogCQkJCXByaW50ZigiUmVwbGFjZSB0aGUgRElNTSBtb2R1bGUgd2l0aCBhIHN1cHBvcnRlZCBESU1NLlxuXG4iKTsKLQkJCQloYW5nKCk7CisJCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIDQ6CiAJCQkJcHJpbnRmKCJFUlJPUjogU0RSQU0gRElNTSBkZXRlY3RlZCBpbiBzbG90ICVkLlxuIiwKIAkJCQkgICAgICAgKHVuc2lnbmVkIGludClkaW1tX251bSk7CiAJCQkJcHJpbnRmKCJPbmx5IEREUiBhbmQgRERSMiBTRFJBTSBESU1NcyBhcmUgc3VwcG9ydGVkLlxuIik7CiAJCQkJcHJpbnRmKCJSZXBsYWNlIHRoZSBESU1NIG1vZHVsZSB3aXRoIGEgc3VwcG9ydGVkIERJTU0uXG5cbiIpOwotCQkJCWhhbmcoKTsKKwkJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgNToKIAkJCQlwcmludGYoIkVSUk9SOiBNdWx0aXBsZXhlZCBST00gRElNTSBkZXRlY3RlZCBpbiBzbG90ICVkLlxuIiwKIAkJCQkgICAgICAgKHVuc2lnbmVkIGludClkaW1tX251bSk7CiAJCQkJcHJpbnRmKCJPbmx5IEREUiBhbmQgRERSMiBTRFJBTSBESU1NcyBhcmUgc3VwcG9ydGVkLlxuIik7CiAJCQkJcHJpbnRmKCJSZXBsYWNlIHRoZSBESU1NIG1vZHVsZSB3aXRoIGEgc3VwcG9ydGVkIERJTU0uXG5cbiIpOwotCQkJCWhhbmcoKTsKKwkJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgNjoKIAkJCQlwcmludGYoIkVSUk9SOiBTR1JBTSBESU1NIGRldGVjdGVkIGluIHNsb3QgJWQuXG4iLAogCQkJCSAgICAgICAodW5zaWduZWQgaW50KWRpbW1fbnVtKTsKIAkJCQlwcmludGYoIk9ubHkgRERSIGFuZCBERFIyIFNEUkFNIERJTU1zIGFyZSBzdXBwb3J0ZWQuXG4iKTsKIAkJCQlwcmludGYoIlJlcGxhY2UgdGhlIERJTU0gbW9kdWxlIHdpdGggYSBzdXBwb3J0ZWQgRElNTS5cblxuIik7Ci0JCQkJaGFuZygpOworCQkJCXNwZF9kZHJfaW5pdF9oYW5nICgpOwogCQkJCWJyZWFrOwogCQkJY2FzZSA3OgogCQkJCWRlYnVnKCJESU1NIHNsb3QgJWQ6IEREUjEgU0RSQU0gZGV0ZWN0ZWRcbiIsIGRpbW1fbnVtKTsKQEAgLTY3OSw3ICs2ODksNyBAQAogCQkJCSAgICAgICAodW5zaWduZWQgaW50KWRpbW1fbnVtKTsKIAkJCQlwcmludGYoIk9ubHkgRERSMSBhbmQgRERSMiBTRFJBTSBESU1NcyBhcmUgc3VwcG9ydGVkLlxuIik7CiAJCQkJcHJpbnRmKCJSZXBsYWNlIHRoZSBESU1NIG1vZHVsZSB3aXRoIGEgc3VwcG9ydGVkIERJTU0uXG5cbiIpOwotCQkJCWhhbmcoKTsKKwkJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtNjg5LDcgKzY5OSw3IEBACiAJCSAgICAmJiAoZGltbV9wb3B1bGF0ZWRbZGltbV9udW1dICAgIT0gU0RSQU1fTk9ORSkKIAkJICAgICYmIChkaW1tX3BvcHVsYXRlZFtkaW1tX251bS0xXSAhPSBkaW1tX3BvcHVsYXRlZFtkaW1tX251bV0pKSB7CiAJCQlwcmludGYoIkVSUk9SOiBESU1NJ3MgRERSMSBhbmQgRERSMiB0eXBlIGNhbiBub3QgYmUgbWl4ZWQuXG4iKTsKLQkJCWhhbmcoKTsKKwkJCXNwZF9kZHJfaW5pdF9oYW5nICgpOwogCQl9CiAJfQogfQpAQCAtNzY0LDcgKzc3NCw3IEBACiAJCQkJICAgICAgICh1bnNpZ25lZCBpbnQpKGNhbGNfY3ljbGVfdGltZSoxMCkpOwogCQkJCXByaW50ZigiUmVwbGFjZSB0aGUgRElNTSwgb3IgY2hhbmdlIEREUiBmcmVxdWVuY3kgdmlhICIKIAkJCQkgICAgICAgInN0cmFwcGluZyBiaXRzLlxuXG4iKTsKLQkJCQloYW5nKCk7CisJCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJCQl9CiAJCX0KIAl9CkBAIC03OTYsNyArODA2LDcgQEAKIAkJCQkgICAgICAgInNsb3QgJWQgaXMgbm90IHN1cHBvcnRlZC5cbiIsIGRpbW1fcmFuaywgZGltbV9udW0pOwogCQkJCXByaW50ZigiT25seSAlZCByYW5rcyBhcmUgc3VwcG9ydGVkIGZvciBhbGwgRElNTS5cbiIsIE1BWFJBTktTKTsKIAkJCQlwcmludGYoIlJlcGxhY2UgdGhlIERJTU0gbW9kdWxlIHdpdGggYSBzdXBwb3J0ZWQgRElNTS5cblxuIik7Ci0JCQkJaGFuZygpOworCQkJCXNwZF9kZHJfaW5pdF9oYW5nICgpOwogCQkJfSBlbHNlCiAJCQkJdG90YWxfcmFuayArPSBkaW1tX3Jhbms7CiAJCX0KQEAgLTgwNSw3ICs4MTUsNyBAQAogCQkJICAgICAgICJmb3IgYWxsIHNsb3RzLlxuIiwgKHVuc2lnbmVkIGludCl0b3RhbF9yYW5rKTsKIAkJCXByaW50ZigiT25seSAlZCByYW5rcyBhcmUgc3VwcG9ydGVkIGZvciBhbGwgRElNTS5cbiIsIE1BWFJBTktTKTsKIAkJCXByaW50ZigiUmVtb3ZlIG9uZSBvZiB0aGUgRElNTSBtb2R1bGVzLlxuXG4iKTsKLQkJCWhhbmcoKTsKKwkJCXNwZF9kZHJfaW5pdF9oYW5nICgpOwogCQl9CiAJfQogfQpAQCAtODMwLDI4ICs4NDAsMjggQEAKIAkJCQlwcmludGYoIlRoaXMgRElNTSBpcyA1LjAgVm9sdC9UVEwuXG4iKTsKIAkJCQlwcmludGYoIlJlcGxhY2UgdGhlIERJTU0gbW9kdWxlIGluIHNsb3QgJWQgd2l0aCBhIHN1cHBvcnRlZCBESU1NLlxuXG4iLAogCQkJCSAgICAgICAodW5zaWduZWQgaW50KWRpbW1fbnVtKTsKLQkJCQloYW5nKCk7CisJCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIDB4MDE6CiAJCQkJcHJpbnRmKCJFUlJPUjogT25seSBESU1NcyBERFIgMi41ViBvciBERFIyIDEuOFYgYXJlIHN1cHBvcnRlZC5cbiIpOwogCQkJCXByaW50ZigiVGhpcyBESU1NIGlzIExWVFRMLlxuIik7CiAJCQkJcHJpbnRmKCJSZXBsYWNlIHRoZSBESU1NIG1vZHVsZSBpbiBzbG90ICVkIHdpdGggYSBzdXBwb3J0ZWQgRElNTS5cblxuIiwKIAkJCQkgICAgICAgKHVuc2lnbmVkIGludClkaW1tX251bSk7Ci0JCQkJaGFuZygpOworCQkJCXNwZF9kZHJfaW5pdF9oYW5nICgpOwogCQkJCWJyZWFrOwogCQkJY2FzZSAweDAyOgogCQkJCXByaW50ZigiRVJST1I6IE9ubHkgRElNTXMgRERSIDIuNVYgb3IgRERSMiAxLjhWIGFyZSBzdXBwb3J0ZWQuXG4iKTsKIAkJCQlwcmludGYoIlRoaXMgRElNTSBpcyAxLjUgVm9sdC5cbiIpOwogCQkJCXByaW50ZigiUmVwbGFjZSB0aGUgRElNTSBtb2R1bGUgaW4gc2xvdCAlZCB3aXRoIGEgc3VwcG9ydGVkIERJTU0uXG5cbiIsCiAJCQkJICAgICAgICh1bnNpZ25lZCBpbnQpZGltbV9udW0pOwotCQkJCWhhbmcoKTsKKwkJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgMHgwMzoKIAkJCQlwcmludGYoIkVSUk9SOiBPbmx5IERJTU1zIEREUiAyLjVWIG9yIEREUjIgMS44ViBhcmUgc3VwcG9ydGVkLlxuIik7CiAJCQkJcHJpbnRmKCJUaGlzIERJTU0gaXMgMy4zIFZvbHQvVFRMLlxuIik7CiAJCQkJcHJpbnRmKCJSZXBsYWNlIHRoZSBESU1NIG1vZHVsZSBpbiBzbG90ICVkIHdpdGggYSBzdXBwb3J0ZWQgRElNTS5cblxuIiwKIAkJCQkgICAgICAgKHVuc2lnbmVkIGludClkaW1tX251bSk7Ci0JCQkJaGFuZygpOworCQkJCXNwZF9kZHJfaW5pdF9oYW5nICgpOwogCQkJCWJyZWFrOwogCQkJY2FzZSAweDA0OgogCQkJCS8qIDIuNSBWb2x0YWdlIG9ubHkgZm9yIEREUjEgKi8KQEAgLTg2Myw3ICs4NzMsNyBAQAogCQkJCXByaW50ZigiRVJST1I6IE9ubHkgRElNTXMgRERSIDIuNVYgb3IgRERSMiAxLjhWIGFyZSBzdXBwb3J0ZWQuXG4iKTsKIAkJCQlwcmludGYoIlJlcGxhY2UgdGhlIERJTU0gbW9kdWxlIGluIHNsb3QgJWQgd2l0aCBhIHN1cHBvcnRlZCBESU1NLlxuXG4iLAogCQkJCSAgICAgICAodW5zaWduZWQgaW50KWRpbW1fbnVtKTsKLQkJCQloYW5nKCk7CisJCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTEwMDYsMTMgKzEwMTYsMTMgQEAKIAlpZiAoKGRpbW1fcG9wdWxhdGVkWzBdICE9IFNEUkFNX05PTkUpICYmIChkaW1tX3BvcHVsYXRlZFsxXSAhPSBTRFJBTV9OT05FKSkgewogCQlpZiAoYnVmMCAhPSBidWYxKSB7CiAJCQlwcmludGYoIkVSUk9SOiBESU1NJ3MgYnVmZmVyZWQvdW5idWZmZXJlZCwgcmVnaXN0ZXJlZCwgY2xvY2tpbmcgZG9uJ3QgbWF0Y2guXG4iKTsKLQkJCWhhbmcoKTsKKwkJCXNwZF9kZHJfaW5pdF9oYW5nICgpOwogCQl9CiAJfQogCiAJaWYgKChkaW1tXzY0Yml0ID09IFRSVUUpICYmIChkaW1tXzMyYml0ID09IFRSVUUpKSB7CiAJCXByaW50ZigiRVJST1I6IENhbm5vdCBtaXggMzIgYml0IGFuZCA2NCBiaXQgRERSLVNEUkFNIERJTU1zIHRvZ2V0aGVyLlxuIik7Ci0JCWhhbmcoKTsKKwkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJfQogCWVsc2UgaWYgKChkaW1tXzY0Yml0ID09IFRSVUUpICYmIChkaW1tXzMyYml0ID09IEZBTFNFKSkgewogCQltY29wdDEgfD0gU0RSQU1fTUNPUFQxX0RNV0RfNjQ7CkBAIC0xMDIwLDcgKzEwMzAsNyBAQAogCQltY29wdDEgfD0gU0RSQU1fTUNPUFQxX0RNV0RfMzI7CiAJfSBlbHNlIHsKIAkJcHJpbnRmKCJFUlJPUjogUGxlYXNlIGluc3RhbGwgb25seSAzMiBvciA2NCBiaXQgRERSLVNEUkFNIERJTU1zLlxuXG4iKTsKLQkJaGFuZygpOworCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAl9CiAKIAlpZiAoZWNjX2VuYWJsZWQgPT0gVFJVRSkKQEAgLTEyMDksNyArMTIxOSw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXByaW50ZigiRVJST1I6IHVjb2RlIGVycm9yIG9uIHNlbGVjdGVkX2NhcyB2YWx1ZSAlZCIsIHNlbGVjdGVkX2Nhcyk7Ci0JCQloYW5nKCk7CisJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTEyNDEsNyArMTI1MSw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXByaW50ZigiRVJST1I6IHdyaXRlIHJlY292ZXJ5IG5vdCBzdXBwb3J0ICglZCkiLCB3cml0ZV9yZWNvdmVyeSk7Ci0JCQloYW5nKCk7CisJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAkJCWJyZWFrOwogCQl9CiAjZWxzZQpAQCAtMTI1OSw3ICsxMjY5LDcgQEAKIAkJCW9kcyA9IE9EU19SRURVQ0VEOwogCQl9IGVsc2UgewogCQkJcHJpbnRmKCJFUlJPUjogVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIERJTU0ncyAoJWQpIiwgdG90YWxfZGltbSk7Ci0JCQloYW5nKCk7CisJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAkJfQogCiAJCW1yID0gQ01EX0VNUiB8IFNFTEVDVF9NUiB8IEJVUlNUX0xFTl80IHwgd3IgfCBjYXM7CkBAIC0xMjg0LDcgKzEyOTQsNyBAQAogCQltdHNkcmFtKFNEUkFNX0lOSVRQTFIxMywgMHg4MDgwMDAwMCB8IGVtcik7CQkvKiBFTVIgT0NEIEV4aXQgKi8KIAl9IGVsc2UgewogCQlwcmludGYoIkVSUk9SOiB1Y29kZSBlcnJvciBhcyB1bmtub3duIEREUiB0eXBlIGluIHByb2dyYW1faW5pdHBsciIpOwotCQloYW5nKCk7CisJCXNwZF9kZHJfaW5pdF9oYW5nICgpOwogCX0KIH0KIApAQCAtMTM4OSw3ICsxMzk5LDcgQEAKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCXByaW50ZigiRVJST1I6IFNQRCByZXBvcnRlZCBUY3ljIGlzIGluY29ycmVjdCBmb3IgRElNTSAiCiAJCQkJCQkgICAgICAgImluIHNsb3QgJWRcbiIsICh1bnNpZ25lZCBpbnQpZGltbV9udW0pOwotCQkJCQkJaGFuZygpOworCQkJCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CiAJCQkJCX0KIAkJCQl9IGVsc2UgewogCQkJCQkvKiBDb252ZXJ0IGZyb20gaGV4IHRvIGRlY2ltYWwgKi8KQEAgLTE1MjYsNyArMTUzNiw3IEBACiAJCQlwcmludGYoIkVSUk9SOiBDYW5ub3QgZmluZCBhIHN1cHBvcnRlZCBDQVMgbGF0ZW5jeSB3aXRoIHRoZSBpbnN0YWxsZWQgRElNTXMuXG4iKTsKIAkJCXByaW50ZigiT25seSBESU1NcyBERFIxIHdpdGggQ0FTIGxhdGVuY2llcyBvZiAyLjAsIDIuNSwgYW5kIDMuMCBhcmUgc3VwcG9ydGVkLlxuIik7CiAJCQlwcmludGYoIk1ha2Ugc3VyZSB0aGUgUExCIHNwZWVkIGlzIHdpdGhpbiB0aGUgc3VwcG9ydGVkIHJhbmdlIG9mIHRoZSBESU1Ncy5cblxuIik7Ci0JCQloYW5nKCk7CisJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAkJfQogCX0gZWxzZSB7IC8qIEREUjIgKi8KIAkJZGVidWcoImNhc18zXzBfYXZhaWxhYmxlPSVkXG4iLCBjYXNfM18wX2F2YWlsYWJsZSk7CkBAIC0xNTQ5LDcgKzE1NTksNyBAQAogCQkJICAgICAgIGNhc18zXzBfYXZhaWxhYmxlLCBjYXNfNF8wX2F2YWlsYWJsZSwgY2FzXzVfMF9hdmFpbGFibGUpOwogCQkJcHJpbnRmKCJzZHJhbV9mcmVxPSVkIGN5Y2xlMz0lZCBjeWNsZTQ9JWQgY3ljbGU1PSVkXG5cbiIsCiAJCQkgICAgICAgc2RyYW1fZnJlcSwgY3ljbGVfM18wX2NsaywgY3ljbGVfNF8wX2NsaywgY3ljbGVfNV8wX2Nsayk7Ci0JCQloYW5nKCk7CisJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAkJfQogCX0KIApAQCAtMTY1OCw3ICsxNjY4LDcgQEAKIAkJCQlwcmludGYoIkVSUk9SOiBESU1NICVkIHVuc3VwcG9ydGVkIHJlZnJlc2ggcmF0ZS90eXBlLlxuIiwKIAkJCQkgICAgICAgKHVuc2lnbmVkIGludClkaW1tX251bSk7CiAJCQkJcHJpbnRmKCJSZXBsYWNlIHRoZSBESU1NIG1vZHVsZSB3aXRoIGEgc3VwcG9ydGVkIERJTU0uXG5cbiIpOwotCQkJCWhhbmcoKTsKKwkJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAkJCQlicmVhazsKIAkJCX0KIApAQCAtMjA2Niw3ICsyMDc2LDcgQEAKIAkJCQkJcHJpbnRmKCJFUlJPUjogVW5zdXBwb3J0ZWQgdmFsdWUgZm9yIG51bWJlciBvZiAiCiAJCQkJCSAgICAgICAiY29sdW1uIGFkZHJlc3NlczogJWQuXG4iLCAodW5zaWduZWQgaW50KW51bV9jb2xfYWRkcik7CiAJCQkJCXByaW50ZigiUmVwbGFjZSB0aGUgRElNTSBtb2R1bGUgd2l0aCBhIHN1cHBvcnRlZCBESU1NLlxuXG4iKTsKLQkJCQkJaGFuZygpOworCQkJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAkJCQl9CiAJCQl9CiAKQEAgLTIxNDgsNyArMjE1OCw3IEBACiAJCQkJcHJpbnRmKCJFUlJPUjogVW5zdXBwb3J0ZWQgdmFsdWUgZm9yIHRoZSBiYW5rc2l6ZTogJWQuXG4iLAogCQkJCSAgICAgICAodW5zaWduZWQgaW50KXJhbmtfc2l6ZV9pZCk7CiAJCQkJcHJpbnRmKCJSZXBsYWNlIHRoZSBESU1NIG1vZHVsZSB3aXRoIGEgc3VwcG9ydGVkIERJTU0uXG5cbiIpOwotCQkJCWhhbmcoKTsKKwkJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAkJCX0KIAogCQkJaWYgKChkaW1tX3BvcHVsYXRlZFtkaW1tX251bV0gIT0gU0RSQU1fTk9ORSkgJiYgKGRpbW1fbnVtID09IDEpKQpAQCAtMjY5Myw3ICsyNzAzLDcgQEAKIAkJcHJpbnRmKCJcbkVSUk9SOiBDYW5ub3QgZGV0ZXJtaW5lIGEgY29tbW9uIHJlYWQgZGVsYXkgZm9yIHRoZSAiCiAJCSAgICAgICAiRElNTShzKSBpbnN0YWxsZWQuXG4iKTsKIAkJZGVidWcoIiVzWyVkXSBFUlJPUiA6IFxuIiwgX19GVU5DVElPTl9fLF9fTElORV9fKTsKLQkJaGFuZygpOworCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKIAl9CiAKIAlibGFua19zdHJpbmcoc3RybGVuKHN0cikpOwpAQCAtMjg0OSw3ICsyODU5LDcgQEAKIAlpZiAod2luZG93X2ZvdW5kID09IEZBTFNFKSB7CiAJCXByaW50ZigiRVJST1I6IENhbm5vdCBkZXRlcm1pbmUgYSBjb21tb24gcmVhZCBkZWxheSBmb3IgdGhlICIKIAkJICAgICAgICJESU1NKHMpIGluc3RhbGxlZC5cbiIpOwotCQloYW5nKCk7CisJCXNwZF9kZHJfaW5pdF9oYW5nICgpOwogCX0KIAogCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9jcHUvcHBjNHh4LzR4eF9lbmV0LmMgYi9jcHUvcHBjNHh4LzR4eF9lbmV0LmMKaW5kZXggMTIwMGQwMi4uZDc4Mjc5MSAxMDA2NDQKLS0tIGEvY3B1L3BwYzR4eC80eHhfZW5ldC5jCisrKyBiL2NwdS9wcGM0eHgvNHh4X2VuZXQuYwpAQCAtOTQsOSArOTQsOSBAQAogICogbmV0d29yayBzdXBwb3J0IGVuYWJsZWQuCiAgKiBSZW1hcms6IENPTkZJR180MDUgZGVzY3JpYmVzIFhpbGlueCBQUEM0MDUgRlBHQSB3aXRob3V0IEVNQUMgY29udHJvbGxlciEKICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgIWRlZmluZWQoQ09ORklHXzQwNSkgJiYgIWRlZmluZWQoQ09ORklHX0lPUDQ4MCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSAmJiAhZGVmaW5lZChDT05GSUdfNDA1KSAmJiAhZGVmaW5lZChDT05GSUdfSU9QNDgwKQogCi0jaWYgIShkZWZpbmVkKENPTkZJR19NSUkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkpCisjaWYgIShkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpKQogI2Vycm9yICJDT05GSUdfTUlJIGhhcyB0byBiZSBkZWZpbmVkISIKICNlbmRpZgogCkBAIC0xNjgzLDcgKzE2ODMsNyBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpCi0jaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCisjaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogCQltaWlwaHlfcmVnaXN0ZXIgKGRldi0+bmFtZSwKIAkJCQkgZW1hYzR4eF9taWlwaHlfcmVhZCwgZW1hYzR4eF9taWlwaHlfd3JpdGUpOwogI2VuZGlmCkBAIC0xNzI0LDcgKzE3MjQsNyBAQAogCiBpbnQgZW1hYzR4eF9taWlwaHlfaW5pdGlhbGl6ZSAoYmRfdCAqIGJpcykKIHsKLSNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCiAJbWlpcGh5X3JlZ2lzdGVyICgicHBjXzR4eF9ldGgwIiwKIAkJCSBlbWFjNHh4X21paXBoeV9yZWFkLCBlbWFjNHh4X21paXBoeV93cml0ZSk7CiAjZW5kaWYKQEAgLTE3MzMsNCArMTczMyw0IEBACiB9CiAjZW5kaWYgLyogIWRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgKi8KIAotI2VuZGlmIC8qICNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9wcGM0eHgvTWFrZWZpbGUgYi9jcHUvcHBjNHh4L01ha2VmaWxlCmluZGV4IDQwNjhiNTMuLmFmOWRhNWIgMTAwNjQ0Ci0tLSBhL2NwdS9wcGM0eHgvTWFrZWZpbGUKKysrIGIvY3B1L3BwYzR4eC9NYWtlZmlsZQpAQCAtMjcsMTIgKzI3LDEyIEBACiAKIFNUQVJUCT0gc3RhcnQubyByZXNldHZlYy5vIGtnZGIubwogU09CSlMJPSBkY3IubwotQ09CSlMJPSA0MDVncF9wY2kubyA0eHhfZW5ldC5vIFwKK0NPQkpTCT0gNDA1Z3BfcGNpLm8gNDQwc3BlX3BjaWUubyA0eHhfZW5ldC5vIFwKIAkgIGJlZGJ1Z180MDUubyBjb21tcHJvYy5vIFwKIAkgIGNwdS5vIGNwdV9pbml0Lm8gZ3Bpby5vIGkyYy5vIGludGVycnVwdHMubyBcCiAJICBtaWlwaHkubyBuZGZjLm8gc2RyYW0ubyBzZXJpYWwubyBcCiAJICA0MHhfc3BkX3NkcmFtLm8gNDR4X3NwZF9kZHIubyA0NHhfc3BkX2RkcjIubyBzcGVlZC5vIFwKLQkgIHRsYi5vIHRyYXBzLm8gdXNiX29oY2kubyB1c2JkZXYubyBcCisJICB0bGIubyB0cmFwcy5vIHVzYl9vaGNpLm8gdXNiLm8gdXNiZGV2Lm8gXAogCSAgNDQwc3BlX3BjaWUubwogCiBTUkNTCTo9ICQoU1RBUlQ6Lm89LlMpICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCmRpZmYgLS1naXQgYS9jcHUvcHBjNHh4L2JlZGJ1Z180MDUuYyBiL2NwdS9wcGM0eHgvYmVkYnVnXzQwNS5jCmluZGV4IGEzYzIxMTkuLjVlZjU2MDcgMTAwNjQ0Ci0tLSBhL2NwdS9wcGM0eHgvYmVkYnVnXzQwNS5jCisrKyBiL2NwdS9wcGM0eHgvYmVkYnVnXzQwNS5jCkBAIC0xMCw3ICsxMCw3IEBACiAjaW5jbHVkZSA8YmVkYnVnL3JlZ3MuaD4KICNpbmNsdWRlIDxiZWRidWcvcHBjLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CRURCVUcpICYmIGRlZmluZWQoQ09ORklHXzR4eCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKSAmJiBkZWZpbmVkKENPTkZJR180eHgpCiAKICNkZWZpbmUgTUFYX0JSRUFLX1BPSU5UUyA0CiAKZGlmZiAtLWdpdCBhL2NwdS9wcGM0eHgvY29uZmlnLm1rIGIvY3B1L3BwYzR4eC9jb25maWcubWsKaW5kZXggMTE5ZTA2MS4uNGZkNTEwOCAxMDA2NDQKLS0tIGEvY3B1L3BwYzR4eC9jb25maWcubWsKKysrIGIvY3B1L3BwYzR4eC9jb25maWcubWsKQEAgLTIyLDUgKzIyLDEzIEBACiAjCiAKIFBMQVRGT1JNX1JFTEZMQUdTICs9IC1mUElDIC1mZml4ZWQtcjE0IC1tZWFiaSAtZm5vLXN0cmljdC1hbGlhc2luZworUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURDT05GSUdfNHh4IC1mZml4ZWQtcjIgLWZmaXhlZC1yMjkgLW1zdHJpbmcgLW1zb2Z0LWZsb2F0CiAKLVBMQVRGT1JNX0NQUEZMQUdTICs9IC1EQ09ORklHXzR4eCAtZmZpeGVkLXIyIC1mZml4ZWQtcjI5IC1tc3RyaW5nIC1XYSwtbTQwNSAtbWNwdT00MDUgLW1zb2Z0LWZsb2F0CitjZmc9JChzaGVsbCBncmVwIGNvbmZpZ3MgJChPQkpUUkVFKS9pbmNsdWRlL2NvbmZpZy5oIHwgc2VkICdzLy4qPFwoY29uZmlncy4qXCk+L1wxLycpCitpczQ0MD0kKHNoZWxsIGdyZXAgQ09ORklHXzQ0MCAkKFRPUERJUikvaW5jbHVkZS8kKGNmZykpCisKK2lmbmVxICgsJChmaW5kc3RyaW5nIENPTkZJR180NDAsJChpczQ0MCkpKQorUExBVEZPUk1fQ1BQRkxBR1MgKz0gLVdhLC1tNDQwIC1tY3B1PTQ0MAorZWxzZQorUExBVEZPUk1fQ1BQRkxBR1MgKz0gLVdhLC1tNDA1IC1tY3B1PTQwNQorZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9wcGM0eHgvY3B1X2luaXQuYyBiL2NwdS9wcGM0eHgvY3B1X2luaXQuYwppbmRleCA2NmU4NjM3Li4zNTFkYTM2IDEwMDY0NAotLS0gYS9jcHUvcHBjNHh4L2NwdV9pbml0LmMKKysrIGIvY3B1L3BwYzR4eC9jcHVfaW5pdC5jCkBAIC0xNTMsNyArMTUzLDcgQEAKIAkgKi8KIAlhc20gdm9sYXRpbGUoIglibAkwZiIJCTo6OiAibHIiKTsKIAlhc20gdm9sYXRpbGUoIjA6CW1mbHIJMyIJCTo6OiAicjMiKTsKLQlhc20gdm9sYXRpbGUoIglhZGRpIAk0LCAwLCAxNCIJOjo6ICJyNCIpOworCWFzbSB2b2xhdGlsZSgiCWFkZGkJNCwgMCwgMTQiCTo6OiAicjQiKTsKIAlhc20gdm9sYXRpbGUoIgltdGN0cgk0IgkJOjo6ICJjdHIiKTsKIAlhc20gdm9sYXRpbGUoIjE6CWljYnQJMCwgMyIpOwogCWFzbSB2b2xhdGlsZSgiCWFkZGkJMywgMywgMzIiCTo6OiAicjMiKTsKQEAgLTIxMSw2ICsyMTEsOCBAQAogCXZhbCA9IG1mc3ByKHRjcik7CiAjaWYgZGVmaW5lZChDT05GSUdfNDQwRVApIHx8IGRlZmluZWQoQ09ORklHXzQ0MEdSKQogCXZhbCB8PSAweGI4MDAwMDAwOyAgICAgIC8qIGdlbmVyYXRlIHN5c3RlbSByZXNldCBhZnRlciAxLjM0IHNlY29uZHMgKi8KKyNlbGlmIGRlZmluZWQoQ09ORklHXzQ0MEVQWCkKKwl2YWwgfD0gMHhiMDAwMDAwMDsgICAgICAvKiBnZW5lcmF0ZSBzeXN0ZW0gcmVzZXQgYWZ0ZXIgMS4zNCBzZWNvbmRzICovCiAjZWxzZQogCXZhbCB8PSAweGYwMDAwMDAwOyAgICAgIC8qIGdlbmVyYXRlIHN5c3RlbSByZXNldCBhZnRlciAyLjY4NCBzZWNvbmRzICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9wcGM0eHgvZGNyLlMgYi9jcHUvcHBjNHh4L2Rjci5TCmluZGV4IDcxMDIzNjQuLjkzNDY1YTMgMTAwNjQ0Ci0tLSBhL2NwdS9wcGM0eHgvZGNyLlMKKysrIGIvY3B1L3BwYzR4eC9kY3IuUwpAQCAtMjIsNyArMjIsNyBAQAogICovCiAjaW5jbHVkZSA8Y29uZmlnLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR180eHgpICYmIGRlZmluZWQoQ0ZHX0NNRF9TRVRHRVREQ1IpCisjaWYgZGVmaW5lZChDT05GSUdfNHh4KSAmJiBkZWZpbmVkKENPTkZJR19DTURfU0VUR0VURENSKQogCiAjaW5jbHVkZSA8cHBjNHh4Lmg+CiAKQEAgLTE5NSw0ICsxOTUsNCBAQAogCQlibHIJCQkJLyogUmV0dXJuIHRvIGNhbGxpbmcgZnVuY3Rpb24gKi8KIC5MZmU0OgkJLnNpemUJc2V0X2RjciwuTGZlNC1zZXRfZGNyCiAvKiBlbmQgc2V0X2RjcigpICovCi0jZW5kaWYgLyogQ09ORklHXzR4eCAmIENGR19DTURfU0VUR0VURENSICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9wcGM0eHgvZ3Bpby5jIGIvY3B1L3BwYzR4eC9ncGlvLmMKaW5kZXggZGQ4NGU1OC4uNTIzNTIwMyAxMDA2NDQKLS0tIGEvY3B1L3BwYzR4eC9ncGlvLmMKKysrIGIvY3B1L3BwYzR4eC9ncGlvLmMKQEAgLTEwMyw2ICsxMDMsMTggQEAKIAkJb3V0MzIoR1BJTzBfT1IgKyBvZmZzLCBpbjMyKEdQSU8wX09SICsgb2ZmcykgJiB+R1BJT19WQUwocGluKSk7CiB9CiAKK2ludCBncGlvX3JlYWRfb3V0X2JpdChpbnQgcGluKQoreworCXUzMiBvZmZzID0gMDsKKworCWlmIChwaW4gPj0gR1BJT19NQVgpIHsKKwkJb2ZmcyA9IDB4MTAwOworCQlwaW4gLT0gR1BJT19NQVg7CisJfQorCisJcmV0dXJuIChpbjMyKEdQSU8wX09SICsgb2ZmcykgJiBHUElPX1ZBTChwaW4pID8gMSA6IDApOworfQorCiAjaWYgZGVmaW5lZChDRkdfNDQwX0dQSU9fVEFCTEUpCiB2b2lkIGdwaW9fc2V0X2NoaXBfY29uZmlndXJhdGlvbih2b2lkKQogewpAQCAtMTU3LDEyICsxNjksMzggQEAKIAkJCQlzd2l0Y2ggKGdwaW9fdGFiW2dwaW9fY29yZV1baV0uYWx0X25iKSB7CiAJCQkJY2FzZSBHUElPX1NFTDoKIAkJCQkJaWYgKGdwaW9fY29yZSA9PSBHUElPMCkgewotCQkJCQkJcmVnID0gaW4zMihHUElPMF9UQ1IpIHwgKDB4ODAwMDAwMDAgPj4gKGopKTsKKwkJCQkJCS8qCisJCQkJCQkgKiBTZXR1cCBvdXRwdXQgdmFsdWUKKwkJCQkJCSAqIDEgLT4gaGlnaCBsZXZlbAorCQkJCQkJICogMCAtPiBsb3cgbGV2ZWwKKwkJCQkJCSAqIGVsc2UgLT4gZG9uJ3QgdG91Y2gKKwkJCQkJCSAqLworCQkJCQkJcmVnID0gaW4zMihHUElPMF9PUik7CisJCQkJCQlpZiAoZ3Bpb190YWJbZ3Bpb19jb3JlXVtpXS5vdXRfdmFsID09IEdQSU9fT1VUXzEpCisJCQkJCQkJcmVnIHw9ICgweDgwMDAwMDAwID4+IChpKSk7CisJCQkJCQllbHNlIGlmIChncGlvX3RhYltncGlvX2NvcmVdW2ldLm91dF92YWwgPT0gR1BJT19PVVRfMCkKKwkJCQkJCQlyZWcgJj0gfigweDgwMDAwMDAwID4+IChpKSk7CisJCQkJCQlvdXQzMihHUElPMF9PUiwgcmVnKTsKKworCQkJCQkJcmVnID0gaW4zMihHUElPMF9UQ1IpIHwgKDB4ODAwMDAwMDAgPj4gKGkpKTsKIAkJCQkJCW91dDMyKEdQSU8wX1RDUiwgcmVnKTsKIAkJCQkJfQogCiAJCQkJCWlmIChncGlvX2NvcmUgPT0gR1BJTzEpIHsKLQkJCQkJCXJlZyA9IGluMzIoR1BJTzFfVENSKSB8ICgweDgwMDAwMDAwID4+IChqKSk7CisJCQkJCQkvKgorCQkJCQkJICogU2V0dXAgb3V0cHV0IHZhbHVlCisJCQkJCQkgKiAxIC0+IGhpZ2ggbGV2ZWwKKwkJCQkJCSAqIDAgLT4gbG93IGxldmVsCisJCQkJCQkgKiBlbHNlIC0+IGRvbid0IHRvdWNoCisJCQkJCQkgKi8KKwkJCQkJCXJlZyA9IGluMzIoR1BJTzBfT1IpOworCQkJCQkJaWYgKGdwaW9fdGFiW2dwaW9fY29yZV1baV0ub3V0X3ZhbCA9PSBHUElPX09VVF8xKQorCQkJCQkJCXJlZyB8PSAoMHg4MDAwMDAwMCA+PiAoaSkpOworCQkJCQkJZWxzZSBpZiAoZ3Bpb190YWJbZ3Bpb19jb3JlXVtpXS5vdXRfdmFsID09IEdQSU9fT1VUXzApCisJCQkJCQkJcmVnICY9IH4oMHg4MDAwMDAwMCA+PiAoaSkpOworCQkJCQkJb3V0MzIoR1BJTzBfT1IsIHJlZyk7CisKKwkJCQkJCXJlZyA9IGluMzIoR1BJTzFfVENSKSB8ICgweDgwMDAwMDAwID4+IChpKSk7CiAJCQkJCQlvdXQzMihHUElPMV9UQ1IsIHJlZyk7CiAJCQkJCX0KIApkaWZmIC0tZ2l0IGEvY3B1L3BwYzR4eC9pbnRlcnJ1cHRzLmMgYi9jcHUvcHBjNHh4L2ludGVycnVwdHMuYwppbmRleCBjNWE5ZjAyLi5jYTU2NWNjIDEwMDY0NAotLS0gYS9jcHUvcHBjNHh4L2ludGVycnVwdHMuYworKysgYi9jcHUvcHBjNHh4L2ludGVycnVwdHMuYwpAQCAtNjI4LDcgKzYyOCw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSVJRKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JUlEpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjk4LDQgKzY5OCw0IEBACiAKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZiAgLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JUlEgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L3BwYzR4eC9rZ2RiLlMgYi9jcHUvcHBjNHh4L2tnZGIuUwppbmRleCBiZTI4MzQwLi44YzRiYmYyIDEwMDY0NAotLS0gYS9jcHUvcHBjNHh4L2tnZGIuUworKysgYi9jcHUvcHBjNHh4L2tnZGIuUwpAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogI2luY2x1ZGUgPGFzbS9tbXUuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAgLyoKICAqIGNhY2hlIGZsdXNoaW5nIHJvdXRpbmVzIGZvciBrZ2RiCiAgKi8KQEAgLTc1LDQgKzc1LDQgQEAKIAlTWU5DCiAJYmxyCiAKLSNlbmRpZiAvKiBDRkdfQ01EX0tHREIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3B1L3BwYzR4eC9uZGZjLmMgYi9jcHUvcHBjNHh4L25kZmMuYwppbmRleCBmNjNmYzc5Li4zOTg0NTc3IDEwMDY0NAotLS0gYS9jcHUvcHBjNHh4L25kZmMuYworKysgYi9jcHUvcHBjNHh4L25kZmMuYwpAQCAtMzEsNyArMzEsNyBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAmJiAhZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpICYmIFwKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKSAmJiBcCiAJKGRlZmluZWQoQ09ORklHXzQ0MEVQKSB8fCBkZWZpbmVkKENPTkZJR180NDBHUikgfHwJICAgICBcCiAJIGRlZmluZWQoQ09ORklHXzQ0MEVQWCkgfHwgZGVmaW5lZChDT05GSUdfNDQwR1JYKSB8fAkgICAgIFwKIAkgZGVmaW5lZChDT05GSUdfNDA1RVopKQpkaWZmIC0tZ2l0IGEvY3B1L3BwYzR4eC9zZXJpYWwuYyBiL2NwdS9wcGM0eHgvc2VyaWFsLmMKaW5kZXggZTYyZGQ5ZC4uM2Y2NzEzNiAxMDA2NDQKLS0tIGEvY3B1L3BwYzR4eC9zZXJpYWwuYworKysgYi9jcHUvcHBjNHh4L3NlcmlhbC5jCkBAIC04NDMsNyArODQzLDcgQEAKIAogI2VuZGlmCS8qIENPTkZJR19TRVJJQUxfU09GVFdBUkVfRklGTyAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIC8qCiAgIEFTIEhBUk5PSVMgOiBhY2NvcmRpbmcgdG8gQ09ORklHX0tHREJfU0VSX0lOREVYIGtnZGIgdXNlcyBzZXJpYWwgcG9ydAogICBudW1iZXIgMCBvciBudW1iZXIgMQpAQCAtOTQ5LDcgKzk0OSw3IEBACiAJcmV0dXJuOwogfQogI2VuZGlmCS8qIChDT05GSUdfS0dEQl9TRVJfSU5ERVggJiAyKSAqLwotI2VuZGlmCS8qIENGR19DTURfS0dEQiAqLworI2VuZGlmCiAKIAogI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9NVUxUSSkKZGlmZiAtLWdpdCBhL2NwdS9wcGM0eHgvc3RhcnQuUyBiL2NwdS9wcGM0eHgvc3RhcnQuUwppbmRleCA3OGRlMzAwLi44ZWNhYWVhIDEwMDY0NAotLS0gYS9jcHUvcHBjNHh4L3N0YXJ0LlMKKysrIGIvY3B1L3BwYzR4eC9zdGFydC5TCkBAIC0yMiwyNiArMjIsMjcgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAgKiBNQSAwMjExMS0xMzA3IFVTQQogICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgKi8KLS8qICovCi0vKgkgVGhpcyBzb3VyY2UgY29kZSBoYXMgYmVlbiBtYWRlIGF2YWlsYWJsZSB0byB5b3UgYnkgSUJNIG9uIGFuIEFTLUlTICovCi0vKgkgYmFzaXMuCSBBbnlvbmUgcmVjZWl2aW5nIHRoaXMgc291cmNlIGlzIGxpY2Vuc2VkIHVuZGVyIElCTSAqLwotLyoJIGNvcHlyaWdodHMgdG8gdXNlIGl0IGluIGFueSB3YXkgaGUgb3Igc2hlIGRlZW1zIGZpdCwgaW5jbHVkaW5nICovCi0vKgkgY29weWluZyBpdCwgbW9kaWZ5aW5nIGl0LCBjb21waWxpbmcgaXQsIGFuZCByZWRpc3RyaWJ1dGluZyBpdCBlaXRoZXIgKi8KLS8qCSB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucy4JIE5vIGxpY2Vuc2UgdW5kZXIgSUJNIHBhdGVudHMgb3IgKi8KLS8qCSBwYXRlbnQgYXBwbGljYXRpb25zIGlzIHRvIGJlIGltcGxpZWQgYnkgdGhlIGNvcHlyaWdodCBsaWNlbnNlLiAqLwotLyogKi8KLS8qCSBBbnkgdXNlciBvZiB0aGlzIHNvZnR3YXJlIHNob3VsZCB1bmRlcnN0YW5kIHRoYXQgSUJNIGNhbm5vdCBwcm92aWRlICovCi0vKgkgdGVjaG5pY2FsIHN1cHBvcnQgZm9yIHRoaXMgc29mdHdhcmUgYW5kIHdpbGwgbm90IGJlIHJlc3BvbnNpYmxlIGZvciAqLwotLyoJIGFueSBjb25zZXF1ZW5jZXMgcmVzdWx0aW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLiAqLwotLyogKi8KLS8qCSBBbnkgcGVyc29uIHdobyB0cmFuc2ZlcnMgdGhpcyBzb3VyY2UgY29kZSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrICovCi0vKgkgbXVzdCBpbmNsdWRlIHRoZSBJQk0gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBwYXJhZ3JhcGgsIGFuZCB0aGUgKi8KLS8qCSBwcmVjZWRpbmcgdHdvIHBhcmFncmFwaHMgaW4gdGhlIHRyYW5zZmVycmVkIHNvZnR3YXJlLiAqLwotLyogKi8KLS8qCSBDT1BZUklHSFQgICBJIEIgTSAgIENPUlBPUkFUSU9OIDE5OTUgKi8KLS8qCSBMSUNFTlNFRCBNQVRFUklBTCAgLSAgUFJPR1JBTSBQUk9QRVJUWSBPRiBJIEIgTSAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKgkgVGhpcyBzb3VyY2UgY29kZSBoYXMgYmVlbiBtYWRlIGF2YWlsYWJsZSB0byB5b3UgYnkgSUJNIG9uIGFuIEFTLUlTCisgKgkgYmFzaXMuCSBBbnlvbmUgcmVjZWl2aW5nIHRoaXMgc291cmNlIGlzIGxpY2Vuc2VkIHVuZGVyIElCTQorICoJIGNvcHlyaWdodHMgdG8gdXNlIGl0IGluIGFueSB3YXkgaGUgb3Igc2hlIGRlZW1zIGZpdCwgaW5jbHVkaW5nCisgKgkgY29weWluZyBpdCwgbW9kaWZ5aW5nIGl0LCBjb21waWxpbmcgaXQsIGFuZCByZWRpc3RyaWJ1dGluZyBpdCBlaXRoZXIKKyAqCSB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucy4JIE5vIGxpY2Vuc2UgdW5kZXIgSUJNIHBhdGVudHMgb3IKKyAqCSBwYXRlbnQgYXBwbGljYXRpb25zIGlzIHRvIGJlIGltcGxpZWQgYnkgdGhlIGNvcHlyaWdodCBsaWNlbnNlLgorICoKKyAqCSBBbnkgdXNlciBvZiB0aGlzIHNvZnR3YXJlIHNob3VsZCB1bmRlcnN0YW5kIHRoYXQgSUJNIGNhbm5vdCBwcm92aWRlCisgKgkgdGVjaG5pY2FsIHN1cHBvcnQgZm9yIHRoaXMgc29mdHdhcmUgYW5kIHdpbGwgbm90IGJlIHJlc3BvbnNpYmxlIGZvcgorICoJIGFueSBjb25zZXF1ZW5jZXMgcmVzdWx0aW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqCSBBbnkgcGVyc29uIHdobyB0cmFuc2ZlcnMgdGhpcyBzb3VyY2UgY29kZSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrCisgKgkgbXVzdCBpbmNsdWRlIHRoZSBJQk0gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBwYXJhZ3JhcGgsIGFuZCB0aGUKKyAqCSBwcmVjZWRpbmcgdHdvIHBhcmFncmFwaHMgaW4gdGhlIHRyYW5zZmVycmVkIHNvZnR3YXJlLgorICoKKyAqCSBDT1BZUklHSFQgICBJIEIgTSAgIENPUlBPUkFUSU9OIDE5OTUKKyAqCSBMSUNFTlNFRCBNQVRFUklBTCAgLSAgUFJPR1JBTSBQUk9QRVJUWSBPRiBJIEIgTQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIAogLyogIFUtQm9vdCAtIFN0YXJ0dXAgQ29kZSBmb3IgQU1DQyA0eHggUG93ZXJQQyBiYXNlZCBFbWJlZGRlZCBCb2FyZHMKICAqCkBAIC01OSw3ICs2MCw2IEBACiAgKiAgYWRkcmVzcyBhbmQgKHMpZHJhbSB3aWxsIGJlIHBvc2l0aW9uZWQgYXQgYWRkcmVzcyAwCiAgKi8KICNpbmNsdWRlIDxjb25maWcuaD4KLSNpbmNsdWRlIDxtcGM4eHguaD4KICNpbmNsdWRlIDxwcGM0eHguaD4KICNpbmNsdWRlIDx2ZXJzaW9uLmg+CiAKQEAgLTExMCwxMSArMTEwLDExIEBACiAjIGVuZGlmCiAjZW5kaWYgLyogQ0ZHX0lOSVRfRENBQ0hFX0NTICovCiAKLSNkZWZpbmUgZnVuY3Rpb25fcHJvbG9nKGZ1bmNfbmFtZSkgICAgICAudGV4dDsgXAorI2RlZmluZSBmdW5jdGlvbl9wcm9sb2coZnVuY19uYW1lKQkudGV4dDsgXAogCQkJCQkuYWxpZ24gMjsgXAogCQkJCQkuZ2xvYmwgZnVuY19uYW1lOyBcCiAJCQkJCWZ1bmNfbmFtZToKLSNkZWZpbmUgZnVuY3Rpb25fZXBpbG9nKGZ1bmNfbmFtZSkgICAgICAudHlwZSBmdW5jX25hbWUsQGZ1bmN0aW9uOyBcCisjZGVmaW5lIGZ1bmN0aW9uX2VwaWxvZyhmdW5jX25hbWUpCS50eXBlIGZ1bmNfbmFtZSxAZnVuY3Rpb247IFwKIAkJCQkJLnNpemUgZnVuY19uYW1lLC4tZnVuY19uYW1lCiAKIC8qIFdlIGRvbid0IHdhbnQgdGhlICBNTVUgeWV0LgpAQCAtMTU1LDcgKzE1NSw5IEBACiAJICogTkFORCBVLUJvb3QgaW1hZ2UgaXMgc3RhcnRlZCBmcm9tIG9mZnNldCAwCiAJICovCiAJLnRleHQKKyNpZiBkZWZpbmVkKENPTkZJR180NDApCiAJYmwJcmVjb25maWdfdGxiMAorI2VuZGlmCiAJR0VUX0dPVAogCWJsCWNwdV9pbml0X2YJLyogcnVuIGxvdy1sZXZlbCBDUFUgaW5pdCBjb2RlCSAgIChmcm9tIEZsYXNoKSAqLwogCWJsCWJvYXJkX2luaXRfZgpAQCAtMjkyLDExICsyOTQsMTMgQEAKIAltdHNwcglpdm9yNyxyMQkvKiBGbG9hdGluZyBwb2ludCB1bmF2YWlsYWJsZSAqLwogCWxpCXIxLDB4MGMwMAogCW10c3ByCWl2b3I4LHIxCS8qIFN5c3RlbSBjYWxsICovCi0JbGkJcjEsMHgxMDAwCi0JbXRzcHIJaXZvcjEwLHIxCS8qIERlY3JlbWVudGVyIChQSVQgZm9yIDQ0MCkgKi8KLQlsaQlyMSwweDE0MDAKLQltdHNwcglpdm9yMTMscjEJLyogRGF0YSBUTEIgZXJyb3IgKi8KKwlsaQlyMSwweDBhMDAKKwltdHNwcglpdm9yOSxyMQkvKiBBdXhpbGlhcnkgUHJvY2Vzc29yIHVuYXZhaWxhYmxlICovCisJbGkJcjEsMHgwOTAwCisJbXRzcHIJaXZvcjEwLHIxCS8qIERlY3JlbWVudGVyICovCiAJbGkJcjEsMHgxMzAwCisJbXRzcHIJaXZvcjEzLHIxCS8qIERhdGEgVExCIGVycm9yICovCisJbGkJcjEsMHgxNDAwCiAJbXRzcHIJaXZvcjE0LHIxCS8qIEluc3RyIFRMQiBlcnJvciAqLwogCWxpCXIxLDB4MjAwMAogCW10c3ByCWl2b3IxNSxyMQkvKiBEZWJ1ZyAqLwpAQCAtNTAxLDExICs1MDUsODEgQEAKIAkuYXNjaWkgIiAoIiwgX19EQVRFX18sICIgLSAiLCBfX1RJTUVfXywgIikiCiAJLmFzY2lpIENPTkZJR19JREVOVF9TVFJJTkcsICJcMCIKIAotLyoKLSAqIE1heWJlIHRoaXMgc2hvdWxkIGJlIG1vdmVkIHNvbWV3aGVyZSBlbHNlIGJlY2F1c2UgdGhlIGN1cnJlbnQKLSAqIGxvY2F0aW9uICgweDEwMCkgaXMgd2hlcmUgdGhlIENyaXRpY2FsSW5wdXQgRXhlY3B0aW9uIHNob3VsZCBiZS4KLSAqLwogCS4gPSBFWENfT0ZGX1NZU19SRVNFVAorCS5nbG9ibAlfc3RhcnRfb2ZfdmVjdG9ycworX3N0YXJ0X29mX3ZlY3RvcnM6CisKKy8qIENyaXRpY2FsIGlucHV0LiAqLworCUNSSVRfRVhDRVBUSU9OKDB4MTAwLCBDcml0Y2FsSW5wdXQsIFVua25vd25FeGNlcHRpb24pCisKKyNpZmRlZiBDT05GSUdfNDQwCisvKiBNYWNoaW5lIGNoZWNrICovCisJTUNLX0VYQ0VQVElPTigweDIwMCwgTWFjaGluZUNoZWNrLCBNYWNoaW5lQ2hlY2tFeGNlcHRpb24pCisjZWxzZQorCUNSSVRfRVhDRVBUSU9OKDB4MjAwLCBNYWNoaW5lQ2hlY2ssIE1hY2hpbmVDaGVja0V4Y2VwdGlvbikKKyNlbmRpZiAvKiBDT05GSUdfNDQwICovCisKKy8qIERhdGEgU3RvcmFnZSBleGNlcHRpb24uICovCisJU1REX0VYQ0VQVElPTigweDMwMCwgRGF0YVN0b3JhZ2UsIFVua25vd25FeGNlcHRpb24pCisKKy8qIEluc3RydWN0aW9uIFN0b3JhZ2UgZXhjZXB0aW9uLiAqLworCVNURF9FWENFUFRJT04oMHg0MDAsIEluc3RTdG9yYWdlLCBVbmtub3duRXhjZXB0aW9uKQorCisvKiBFeHRlcm5hbCBJbnRlcnJ1cHQgZXhjZXB0aW9uLiAqLworCVNURF9FWENFUFRJT04oMHg1MDAsIEV4dEludGVycnVwdCwgZXh0ZXJuYWxfaW50ZXJydXB0KQorCisvKiBBbGlnbm1lbnQgZXhjZXB0aW9uLiAqLworCS4gPSAweDYwMAorQWxpZ25tZW50OgorCUVYQ0VQVElPTl9QUk9MT0coU1JSMCwgU1JSMSkKKwltZnNwcglyNCxEQVIKKwlzdHcJcjQsX0RBUihyMjEpCisJbWZzcHIJcjUsRFNJU1IKKwlzdHcJcjUsX0RTSVNSKHIyMSkKKwlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECisJbGkJcjIwLE1TUl9LRVJORUwKKwlybHdpbWkJcjIwLHIyMywwLDE2LDE2CQkvKiBjb3B5IEVFIGJpdCBmcm9tIHNhdmVkIE1TUiAqLworCWx3eglyNixHT1QodHJhbnNmZXJfdG9faGFuZGxlcikKKwltdGxyCXI2CisJYmxybAorLkxfQWxpZ25tZW50OgorCS5sb25nCUFsaWdubWVudEV4Y2VwdGlvbiAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQKKwkubG9uZwlpbnRfcmV0dXJuIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAorCisvKiBQcm9ncmFtIGNoZWNrIGV4Y2VwdGlvbiAqLworCS4gPSAweDcwMAorUHJvZ3JhbUNoZWNrOgorCUVYQ0VQVElPTl9QUk9MT0coU1JSMCwgU1JSMSkKKwlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECisJbGkJcjIwLE1TUl9LRVJORUwKKwlybHdpbWkJcjIwLHIyMywwLDE2LDE2CQkvKiBjb3B5IEVFIGJpdCBmcm9tIHNhdmVkIE1TUiAqLworCWx3eglyNixHT1QodHJhbnNmZXJfdG9faGFuZGxlcikKKwltdGxyCXI2CisJYmxybAorLkxfUHJvZ3JhbUNoZWNrOgorCS5sb25nCVByb2dyYW1DaGVja0V4Y2VwdGlvbiAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQKKwkubG9uZwlpbnRfcmV0dXJuIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAorCisjaWZkZWYgQ09ORklHXzQ0MAorCVNURF9FWENFUFRJT04oMHg4MDAsIEZQVW5hdmFpbGFibGUsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDkwMCwgRGVjcmVtZW50ZXIsIERlY3JlbWVudGVyUElURXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHhhMDAsIEFQVSwgVW5rbm93bkV4Y2VwdGlvbikKKyNlbmRpZgorCVNURF9FWENFUFRJT04oMHhjMDAsIFN5c3RlbUNhbGwsIFVua25vd25FeGNlcHRpb24pCisKKyNpZmRlZiBDT05GSUdfNDQwCisJU1REX0VYQ0VQVElPTigweDEzMDAsIERhdGFUTEJFcnJvciwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTQwMCwgSW5zdHJ1Y3Rpb25UTEJFcnJvciwgVW5rbm93bkV4Y2VwdGlvbikKKyNlbHNlCisJU1REX0VYQ0VQVElPTigweDEwMDAsIFBJVCwgRGVjcmVtZW50ZXJQSVRFeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDExMDAsIEluc3RydWN0aW9uVExCTWlzcywgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTIwMCwgRGF0YVRMQk1pc3MsIFVua25vd25FeGNlcHRpb24pCisjZW5kaWYKKwlDUklUX0VYQ0VQVElPTigweDIwMDAsIERlYnVnQnJlYWtwb2ludCwgRGVidWdFeGNlcHRpb24gKQorCisJLmdsb2JsCV9lbmRfb2ZfdmVjdG9ycworX2VuZF9vZl92ZWN0b3JzOgorCS4gPSBfU1RBUlRfT0ZGU0VUCiAjZW5kaWYKIAkuZ2xvYmwJX3N0YXJ0CiBfc3RhcnQ6CkBAIC04MTUsMjEgKzg4OSwyMSBAQAogCSAqLwogCWxpcwlyMyxDRkdfT0NNX0RBVEFfQUREUkBoCS8qIE9DTSBsb2NhdGlvbiAqLwogCW9yaQlyMyxyMyxDRkdfT0NNX0RBVEFfQUREUkBsCi0Jb3JpCXIzLHIzLDB4ODI3MAkvKiAzMksgT2Zmc2V0LCAxNksgZm9yIEJhbmsgMSwgUi9XL0VuYWJsZSAqLworCW9yaQlyMyxyMywweDAyNzAJCS8qIDE2SyBmb3IgQmFuayAxLCBSL1cvRW5hYmxlICovCiAJbXRkY3IJb2NtcGxiM2NyMSxyMwkJLyogU2V0IFBMQiBBY2Nlc3MgKi8KIAlvcmkJcjMscjMsMHg0MDAwCQkvKiBBZGQgMHg0MDAwIGZvciBiYW5rIDIgKi8KIAltdGRjcglvY21wbGIzY3IyLHIzCQkvKiBTZXQgUExCIEFjY2VzcyAqLwogCWlzeW5jCiAKLQlsaXMJcjMsQ0ZHX09DTV9EQVRBX0FERFJAaCAgLyogT0NNIGxvY2F0aW9uICovCisJbGlzCXIzLENGR19PQ01fREFUQV9BRERSQGgJLyogT0NNIGxvY2F0aW9uICovCiAJb3JpCXIzLHIzLENGR19PQ01fREFUQV9BRERSQGwKLQlvcmkJcjMscjMsMHgwMjcwICAgICAgICAgICAgLyogMTZLIGZvciBCYW5rIDEsIFIvVy9FbmFibGUgKi8KLQltdGRjcglvY21kc2NyMSwgcjMgICAgICAgICAgICAvKiBTZXQgRGF0YSBTaWRlICovCi0JbXRkY3IJb2NtaXNjcjEsIHIzICAgICAgICAgICAgLyogU2V0IEluc3RydWN0aW9uIFNpZGUgKi8KKwlvcmkJcjMscjMsMHgwMjcwCQkvKiAxNksgZm9yIEJhbmsgMSwgUi9XL0VuYWJsZSAqLworCW10ZGNyCW9jbWRzY3IxLCByMwkJLyogU2V0IERhdGEgU2lkZSAqLworCW10ZGNyCW9jbWlzY3IxLCByMwkJLyogU2V0IEluc3RydWN0aW9uIFNpZGUgKi8KIAlvcmkJcjMscjMsMHg0MDAwCQkvKiBBZGQgMHg0MDAwIGZvciBiYW5rIDIgKi8KLQltdGRjcglvY21kc2NyMiwgcjMgICAgICAgICAgICAvKiBTZXQgRGF0YSBTaWRlICovCi0JbXRkY3IJb2NtaXNjcjIsIHIzICAgICAgICAgICAgLyogU2V0IEluc3RydWN0aW9uIFNpZGUgKi8KLQlhZGRpcwlyMywwLDB4MDgwMCAgICAgICAgICAgICAvKiBPQ00gRGF0YSBQYXJpdHkgRGlzYWJsZSAtIDEgV2FpdCBTdGF0ZSAqLworCW10ZGNyCW9jbWRzY3IyLCByMwkJLyogU2V0IERhdGEgU2lkZSAqLworCW10ZGNyCW9jbWlzY3IyLCByMwkJLyogU2V0IEluc3RydWN0aW9uIFNpZGUgKi8KKwlhZGRpcwlyMywwLDB4MDgwMAkJLyogT0NNIERhdGEgUGFyaXR5IERpc2FibGUgLSAxIFdhaXQgU3RhdGUgKi8KIAltdGRjcglvY21kc2lzZHBjLHIzCiAKIAlpc3luYwpAQCAtODQ4LDcgKzkyMiw3IEBACiAJbXRkY3IJb2NtZHNjbnRsLCByNAkJLyogc2V0IGRhdGEtc2lkZSBJUkFNIGNvbmZpZyAqLwogCWlzeW5jCiAKLQlsaXMJcjMsQ0ZHX09DTV9EQVRBX0FERFJAaCAgLyogT0NNIGxvY2F0aW9uICovCisJbGlzCXIzLENGR19PQ01fREFUQV9BRERSQGgJLyogT0NNIGxvY2F0aW9uICovCiAJb3JpCXIzLHIzLENGR19PQ01fREFUQV9BRERSQGwKIAltdGRjcglvY21kc2FyYywgcjMKIAlhZGRpcwlyNCwgMCwgMHhDMDAwCQkvKiBPQ00gZGF0YSBhcmVhIGVuYWJsZWQgKi8KQEAgLTg1Nyw2ICs5MzEsMzggQEAKICNlbmRpZiAvKiBDT05GSUdfNDA1RVogKi8KICNlbmRpZgogCisjaWZkZWYgQ09ORklHX05BTkRfU1BMCisJLyoKKwkgKiBDb3B5IFNQTCBmcm9tIGNhY2hlIGludG8gaW50ZXJuYWwgU1JBTQorCSAqLworCWxpCXI0LChDRkdfTkFORF9CT09UX1NQTF9TSVpFID4+IDIpIC0gMQorCW10Y3RyCXI0CisJbGlzCXIyLENGR19OQU5EX0JPT1RfU1BMX1NSQ0BoCisJb3JpCXIyLHIyLENGR19OQU5EX0JPT1RfU1BMX1NSQ0BsCisJbGlzCXIzLENGR19OQU5EX0JPT1RfU1BMX0RTVEBoCisJb3JpCXIzLHIzLENGR19OQU5EX0JPT1RfU1BMX0RTVEBsCitzcGxfbG9vcDoKKwlsd3p1CXI0LDQocjIpCisJc3R3dQlyNCw0KHIzKQorCWJkbnoJc3BsX2xvb3AKKworCS8qCisJICogSnVtcCB0byBjb2RlIGluIFJBTQorCSAqLworCWJsCTAwZgorMDA6CW1mbHIJcjEwCisJbGlzCXIzLChDRkdfTkFORF9CT09UX1NQTF9TUkMgLSBDRkdfTkFORF9CT09UX1NQTF9EU1QpQGgKKwlvcmkJcjMscjMsKENGR19OQU5EX0JPT1RfU1BMX1NSQyAtIENGR19OQU5EX0JPT1RfU1BMX0RTVClAbAorCXN1YglyMTAscjEwLHIzCisJYWRkaQlyMTAscjEwLDI4CisJbXRscglyMTAKKwlibHIKKworc3RhcnRfcmFtOgorCXN5bmMKKwlpc3luYworI2VuZGlmIC8qIENPTkZJR19OQU5EX1NQTCAqLworCiAJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCS8qIFNldHVwIHRlbXBvcmFyeSBzdGFjayBpbiBEQ0FDSEUgb3IgT0NNIGlmIG5lZWRlZCBmb3IgU0RSQU0gU1BELiAqLwogCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTk2NywxMTkgKzEwNzMsMjIgQEAKIAlzdHcJcjAsICsxMihyMSkJCS8qIFNhdmUgcmV0dXJuIGFkZHIgKHVuZGVyZmxvdyB2ZWN0KSAqLwogI2VuZGlmIC8qICEoQ0ZHX0lOSVRfRENBQ0hFX0NTCXx8ICFDRkdfVEVNX1NUQUNLX09DTSkgKi8KIAorI2lmZGVmIENPTkZJR19OQU5EX1NQTAorCWJsCW5hbmRfYm9vdAkJLyogd2lsbCBub3QgcmV0dXJuICovCisjZWxzZQogCUdFVF9HT1QJCQkvKiBpbml0aWFsaXplIEdPVCBhY2Nlc3MJCQkqLwogCiAJYmwJY3B1X2luaXRfZgkvKiBydW4gbG93LWxldmVsIENQVSBpbml0IGNvZGUJICAgKGZyb20gRmxhc2gpICovCiAKIAkvKiBORVZFUiBSRVRVUk5TISAqLwogCWJsCWJvYXJkX2luaXRfZgkvKiBydW4gZmlyc3QgcGFydCBvZiBpbml0IGNvZGUgKGZyb20gRmxhc2gpCSovCisjZW5kaWYgLyogQ09ORklHX05BTkRfU1BMICovCiAKICNlbmRpZgkvKiBDT05GSUdfNDA1R1AgfHwgQ09ORklHXzQwNUNSIHx8IENPTkZJR180MDUgfHwgQ09ORklHXzQwNUVQICovCiAJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAKICNpZm5kZWYgQ09ORklHX05BTkRfU1BMCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLmdsb2JsCV9zdGFydF9vZl92ZWN0b3JzCi1fc3RhcnRfb2ZfdmVjdG9yczoKLQotI2lmIDAKLS8qVE9ETyBGaXh1cCBfc3RhcnQgYWJvdmUgc28gd2UgY2FuIGRvIHRoaXMqLwotLyogQ3JpdGljYWwgaW5wdXQuICovCi0JQ1JJVF9FWENFUFRJT04oMHgxMDAsIENyaXRjYWxJbnB1dCwgQ3JpdGNhbElucHV0RXhjZXB0aW9uKQotI2VuZGlmCi0KLS8qIE1hY2hpbmUgY2hlY2sgKi8KLQlDUklUX0VYQ0VQVElPTigweDIwMCwgTWFjaGluZUNoZWNrLCBNYWNoaW5lQ2hlY2tFeGNlcHRpb24pCi0KLS8qIERhdGEgU3RvcmFnZSBleGNlcHRpb24uICovCi0JU1REX0VYQ0VQVElPTigweDMwMCwgRGF0YVN0b3JhZ2UsIFVua25vd25FeGNlcHRpb24pCi0KLS8qIEluc3RydWN0aW9uIFN0b3JhZ2UgZXhjZXB0aW9uLiAqLwotCVNURF9FWENFUFRJT04oMHg0MDAsIEluc3RTdG9yYWdlLCBVbmtub3duRXhjZXB0aW9uKQotCi0vKiBFeHRlcm5hbCBJbnRlcnJ1cHQgZXhjZXB0aW9uLiAqLwotCVNURF9FWENFUFRJT04oMHg1MDAsIEV4dEludGVycnVwdCwgZXh0ZXJuYWxfaW50ZXJydXB0KQotCi0vKiBBbGlnbm1lbnQgZXhjZXB0aW9uLiAqLwotCS4gPSAweDYwMAotQWxpZ25tZW50OgotCUVYQ0VQVElPTl9QUk9MT0cKLQltZnNwcglyNCxEQVIKLQlzdHcJcjQsX0RBUihyMjEpCi0JbWZzcHIJcjUsRFNJU1IKLQlzdHcJcjUsX0RTSVNSKHIyMSkKLQlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECi0JbGkJcjIwLE1TUl9LRVJORUwKLQlybHdpbWkJcjIwLHIyMywwLDE2LDE2CQkvKiBjb3B5IEVFIGJpdCBmcm9tIHNhdmVkIE1TUiAqLwotCWx3eglyNixHT1QodHJhbnNmZXJfdG9faGFuZGxlcikKLQltdGxyCXI2Ci0JYmxybAotLkxfQWxpZ25tZW50OgotCS5sb25nCUFsaWdubWVudEV4Y2VwdGlvbiAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCi0JLmxvbmcJaW50X3JldHVybiAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCi0KLS8qIFByb2dyYW0gY2hlY2sgZXhjZXB0aW9uICovCi0JLiA9IDB4NzAwCi1Qcm9ncmFtQ2hlY2s6Ci0JRVhDRVBUSU9OX1BST0xPRwotCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKLQlsaQlyMjAsTVNSX0tFUk5FTAotCXJsd2ltaQlyMjAscjIzLDAsMTYsMTYJCS8qIGNvcHkgRUUgYml0IGZyb20gc2F2ZWQgTVNSICovCi0JbHd6CXI2LEdPVCh0cmFuc2Zlcl90b19oYW5kbGVyKQotCW10bHIJcjYKLQlibHJsCi0uTF9Qcm9ncmFtQ2hlY2s6Ci0JLmxvbmcJUHJvZ3JhbUNoZWNrRXhjZXB0aW9uIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKLQkubG9uZwlpbnRfcmV0dXJuIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKLQotCS8qIE5vIEZQVSBvbiBNUEM4eHguICBUaGlzIGV4Y2VwdGlvbiBpcyBub3Qgc3VwcG9zZWQgdG8gaGFwcGVuLgotCSovCi0JU1REX0VYQ0VQVElPTigweDgwMCwgRlBVbmF2YWlsYWJsZSwgVW5rbm93bkV4Y2VwdGlvbikKLQotCS8qIEkgZ3Vlc3Mgd2UgY291bGQgaW1wbGVtZW50IGRlY3JlbWVudGVyLCBhbmQgbWF5IGhhdmUKLQkgKiB0byBzb21lZGF5IGZvciB0aW1la2VlcGluZy4KLQkgKi8KLQlTVERfRVhDRVBUSU9OKDB4OTAwLCBEZWNyZW1lbnRlciwgdGltZXJfaW50ZXJydXB0KQotCVNURF9FWENFUFRJT04oMHhhMDAsIFRyYXBfMGEsIFVua25vd25FeGNlcHRpb24pCi0JU1REX0VYQ0VQVElPTigweGIwMCwgVHJhcF8wYiwgVW5rbm93bkV4Y2VwdGlvbikKLQlTVERfRVhDRVBUSU9OKDB4YzAwLCBTeXN0ZW1DYWxsLCBVbmtub3duRXhjZXB0aW9uKQotCVNURF9FWENFUFRJT04oMHhkMDAsIFNpbmdsZVN0ZXAsIFVua25vd25FeGNlcHRpb24pCi0KLQlTVERfRVhDRVBUSU9OKDB4ZTAwLCBUcmFwXzBlLCBVbmtub3duRXhjZXB0aW9uKQotCVNURF9FWENFUFRJT04oMHhmMDAsIFRyYXBfMGYsIFVua25vd25FeGNlcHRpb24pCi0KLQkvKiBPbiB0aGUgTVBDOHh4LCB0aGlzIGlzIGEgc29mdHdhcmUgZW11bGF0aW9uIGludGVycnVwdC4gIEl0IG9jY3VycwotCSAqIGZvciBhbGwgdW5pbXBsZW1lbnRlZCBhbmQgaWxsZWdhbCBpbnN0cnVjdGlvbnMuCi0JICovCi0JU1REX0VYQ0VQVElPTigweDEwMDAsIFBJVCwgUElURXhjZXB0aW9uKQotCi0JU1REX0VYQ0VQVElPTigweDExMDAsIEluc3RydWN0aW9uVExCTWlzcywgVW5rbm93bkV4Y2VwdGlvbikKLQlTVERfRVhDRVBUSU9OKDB4MTIwMCwgRGF0YVRMQk1pc3MsIFVua25vd25FeGNlcHRpb24pCi0JU1REX0VYQ0VQVElPTigweDEzMDAsIEluc3RydWN0aW9uVExCRXJyb3IsIFVua25vd25FeGNlcHRpb24pCi0JU1REX0VYQ0VQVElPTigweDE0MDAsIERhdGFUTEJFcnJvciwgVW5rbm93bkV4Y2VwdGlvbikKLQotCVNURF9FWENFUFRJT04oMHgxNTAwLCBSZXNlcnZlZDUsIFVua25vd25FeGNlcHRpb24pCi0JU1REX0VYQ0VQVElPTigweDE2MDAsIFJlc2VydmVkNiwgVW5rbm93bkV4Y2VwdGlvbikKLQlTVERfRVhDRVBUSU9OKDB4MTcwMCwgUmVzZXJ2ZWQ3LCBVbmtub3duRXhjZXB0aW9uKQotCVNURF9FWENFUFRJT04oMHgxODAwLCBSZXNlcnZlZDgsIFVua25vd25FeGNlcHRpb24pCi0JU1REX0VYQ0VQVElPTigweDE5MDAsIFJlc2VydmVkOSwgVW5rbm93bkV4Y2VwdGlvbikKLQlTVERfRVhDRVBUSU9OKDB4MWEwMCwgUmVzZXJ2ZWRBLCBVbmtub3duRXhjZXB0aW9uKQotCVNURF9FWENFUFRJT04oMHgxYjAwLCBSZXNlcnZlZEIsIFVua25vd25FeGNlcHRpb24pCi0KLQlTVERfRVhDRVBUSU9OKDB4MWMwMCwgRGF0YUJyZWFrcG9pbnQsIFVua25vd25FeGNlcHRpb24pCi0JU1REX0VYQ0VQVElPTigweDFkMDAsIEluc3RydWN0aW9uQnJlYWtwb2ludCwgVW5rbm93bkV4Y2VwdGlvbikKLQlTVERfRVhDRVBUSU9OKDB4MWUwMCwgUGVyaXBoZXJhbEJyZWFrcG9pbnQsIFVua25vd25FeGNlcHRpb24pCi0JU1REX0VYQ0VQVElPTigweDFmMDAsIERldlBvcnRCcmVha3BvaW50LCBVbmtub3duRXhjZXB0aW9uKQotCi0JQ1JJVF9FWENFUFRJT04oMHgyMDAwLCBEZWJ1Z0JyZWFrcG9pbnQsIERlYnVnRXhjZXB0aW9uICkKLQotCS5nbG9ibAlfZW5kX29mX3ZlY3RvcnMKLV9lbmRfb2ZfdmVjdG9yczoKLQotCi0JLiA9IDB4MjEwMAotCiAvKgogICogVGhpcyBjb2RlIGZpbmlzaGVzIHNhdmluZyB0aGUgcmVnaXN0ZXJzIHRvIHRoZSBleGNlcHRpb24gZnJhbWUKICAqIGFuZCBqdW1wcyB0byB0aGUgYXBwcm9wcmlhdGUgaGFuZGxlciBmb3IgdGhlIGV4Y2VwdGlvbi4KQEAgLTEwOTUsMjggKzExMDQsMTIgQEAKIAlTQVZFXzRHUFJTKDgsIHIyMSkKIAlTQVZFXzhHUFJTKDEyLCByMjEpCiAJU0FWRV84R1BSUygyNCwgcjIxKQotI2lmIDAKLQlhbmRpLglyMjMscjIzLE1TUl9QUgotCW1mc3ByCXIyMyxTUFJHMwkJLyogaWYgZnJvbSB1c2VyLCBmaXggdXAgdHNzLnJlZ3MgKi8KLQliZXEJMmYKLQlhZGRpCXIyNCxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAotCXN0dwlyMjQsUFRfUkVHUyhyMjMpCi0yOglhZGRpCXIyLHIyMywtVFNTCQkvKiBzZXQgcjIgdG8gY3VycmVudCAqLwotCXRvdmlydChyMixyMixyMjMpCi0jZW5kaWYKIAltZmxyCXIyMwogCWFuZGkuCXIyNCxyMjMsMHgzZjAwCQkvKiBnZXQgdmVjdG9yIG9mZnNldCAqLwogCXN0dwlyMjQsVFJBUChyMjEpCiAJbGkJcjIyLDAKIAlzdHcJcjIyLFJFU1VMVChyMjEpCiAJbXRzcHIJU1BSRzIscjIyCQkvKiByMSBpcyBub3cga2VybmVsIHNwICovCi0jaWYgMAotCWFkZGkJcjI0LHIyLFRBU0tfU1RSVUNUX1NJWkUgLyogY2hlY2sgZm9yIGtlcm5lbCBzdGFjayBvdmVyZmxvdyAqLwotCWNtcGx3CTAscjEscjIKLQljbXBsdwkxLHIxLHIyNAotCWNyYW5kCTEsMSw0Ci0JYmd0CXN0YWNrX292ZgkJLyogaWYgcjIgPCByMSA8IHIyK1RBU0tfU1RSVUNUX1NJWkUgKi8KLSNlbmRpZgogCWx3eglyMjQsMChyMjMpCQkvKiB2aXJ0dWFsIGFkZHJlc3Mgb2YgaGFuZGxlciAqLwogCWx3eglyMjMsNChyMjMpCQkvKiB3aGVyZSB0byBnbyB3aGVuIGRvbmUgKi8KIAltdHNwcglTUlIwLHIyNApAQCAtMTE3NywzMyArMTE3MCw3MiBAQAogCVJFU1RfR1BSKDMxLCByMSkKIAlsd3oJcjIsX05JUChyMSkJLyogUmVzdG9yZSBlbnZpcm9ubWVudCAqLwogCWx3eglyMCxfTVNSKHIxKQotCW10c3ByCTk5MCxyMgkJLyogU1JSMiAqLwotCW10c3ByCTk5MSxyMAkJLyogU1JSMyAqLworCW10c3ByCWNzcnIwLHIyCisJbXRzcHIJY3NycjEscjAKIAlsd3oJcjAsR1BSMChyMSkKIAlsd3oJcjIsR1BSMihyMSkKIAlsd3oJcjEsR1BSMShyMSkKIAlTWU5DCiAJcmZjaQogCi0vKiBDYWNoZSBmdW5jdGlvbnMuCi0qLwotaW52YWxpZGF0ZV9pY2FjaGU6Ci0JaWNjY2kJcjAscjAJCQkvKiBmb3IgNDA1LCBpY2NjaSBpbnZhbGlkYXRlcyB0aGUgKi8KLQlibHIJCQkJLyogICBlbnRpcmUgSSBjYWNoZSAqLworI2lmZGVmIENPTkZJR180NDAKK21ja19yZXR1cm46CisJbWZtc3IJcjI4CQkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlsaQlyNCwwCisJb3JpCXI0LHI0LE1TUl9FRQorCWFuZGMJcjI4LHIyOCxyNAorCVNZTkMJCQkvKiBTb21lIGNoaXAgcmV2cyBuZWVkIHRoaXMuLi4gKi8KKwltdG1zcglyMjgKKwlTWU5DCisJbHd6CXIyLF9DVFIocjEpCisJbHd6CXIwLF9MSU5LKHIxKQorCW10Y3RyCXIyCisJbXRscglyMAorCWx3eglyMixfWEVSKHIxKQorCWx3eglyMCxfQ0NSKHIxKQorCW10c3ByCVhFUixyMgorCW10Y3JmCTB4RkYscjAKKwlSRVNUXzEwR1BSUygzLCByMSkKKwlSRVNUXzEwR1BSUygxMywgcjEpCisJUkVTVF84R1BSUygyMywgcjEpCisJUkVTVF9HUFIoMzEsIHIxKQorCWx3eglyMixfTklQKHIxKQkvKiBSZXN0b3JlIGVudmlyb25tZW50ICovCisJbHd6CXIwLF9NU1IocjEpCisJbXRzcHIJbWNzcnIwLHIyCisJbXRzcHIJbWNzcnIxLHIwCisJbHd6CXIwLEdQUjAocjEpCisJbHd6CXIyLEdQUjIocjEpCisJbHd6CXIxLEdQUjEocjEpCisJU1lOQworCXJmbWNpCisjZW5kaWYgLyogQ09ORklHXzQ0MCAqLwogCi1pbnZhbGlkYXRlX2RjYWNoZToKLQlhZGRpCXI2LDAsMHgwMDAwCQkvKiBjbGVhciBHUFIgNiAqLwotCS8qIERvIGxvb3AgZm9yICMgb2YgZGNhY2hlIGNvbmdydWVuY2UgY2xhc3Nlcy4gKi8KLQlsaXMJcjcsIChDRkdfRENBQ0hFX1NJWkUgLyBDRkdfQ0FDSEVMSU5FX1NJWkUgLyAyKUBoYQkvKiBUQlMgZm9yIGxhcmdlIHNpemVkIGNhY2hlICovCi0Jb3JpCXI3LCByNywgKENGR19EQ0FDSEVfU0laRSAvIENGR19DQUNIRUxJTkVfU0laRSAvIDIpQGwKLQkJCQkJLyogTk9URTogZGNjY2kgaW52YWxpZGF0ZXMgYm90aCAqLwotCW10Y3RyCXI3CQkJLyogd2F5cyBpbiB0aGUgRCBjYWNoZSAqLwotLi5kY2xvb3A6Ci0JZGNjY2kJMCxyNgkJCS8qIGludmFsaWRhdGUgbGluZSAqLwotCWFkZGkJcjYscjYsIENGR19DQUNIRUxJTkVfU0laRSAvKiBidW1wIHRvIG5leHQgbGluZSAqLwotCWJkbnoJLi5kY2xvb3AKKworLyoKKyAqIENhY2hlIGZ1bmN0aW9ucy4KKyAqCisgKiBOT1RFOiBjdXJyZW50bHkgdGhlIDQ0MHMgcnVuIHdpdGggZGNhY2hlIF9kaXNhYmxlZF8gb25jZSByZWxvY2F0ZWQgdG8gRFJBTSwKKyAqIGFsdGhvdWdoIGZvciBzb21lIGNhY2hlLXJhbGF0ZWQgY2FsbHMgc3R1YnMgaGF2ZSB0byBiZSBwcm92aWRlZCB0byBzYXRpc2Z5CisgKiBzeW1ib2xzIHJlc29sdXRpb24uCisgKiBJY2FjaGUtcmVsYXRlZCBmdW5jdGlvbnMgYXJlIHVzZWQgaW4gUE9TVCBmcmFtZXdvcmsuCisgKgorICovCisjaWZkZWYgQ09ORklHXzQ0MAorICAgICAgIC5nbG9ibCAgZGNhY2hlX2Rpc2FibGUKKyAgICAgICAuZ2xvYmwgIGljYWNoZV9kaXNhYmxlCisgICAgICAgLmdsb2JsICBpY2FjaGVfZW5hYmxlCitkY2FjaGVfZGlzYWJsZToKK2ljYWNoZV9kaXNhYmxlOgoraWNhY2hlX2VuYWJsZToKIAlibHIKIAorCS5nbG9ibAlkY2FjaGVfc3RhdHVzCisJLmdsb2JsCWljYWNoZV9zdGF0dXMKK2RjYWNoZV9zdGF0dXM6CitpY2FjaGVfc3RhdHVzOgorCW1yCXIzLCAgMAorCWJscgorI2Vsc2UKIGZsdXNoX2RjYWNoZToKIAlhZGRpcwlyOSxyMCwweDAwMDIJCS8qIHNldCBtYXNrIGZvciBFRSBhbmQgQ0UgbXNyIGJpdHMgKi8KIAlvcmkJcjkscjksMHg4MDAwCkBAIC0xMjgyLDI0ICsxMzE0LDEzIEBACiAJbWZkY2NyCXIzCiAJc3J3aQlyMywgcjMsIDMxCS8qID4+MzEgPT4gc2VsZWN0IGJpdCAwICovCiAJYmxyCisjZW5kaWYKIAogCS5nbG9ibCBnZXRfcHZyCiBnZXRfcHZyOgogCW1mc3ByCXIzLCBQVlIKIAlibHIKIAotI2lmICFkZWZpbmVkKENPTkZJR180NDApCi0JLmdsb2JsIHdyX3BpdAotd3JfcGl0OgotCW10c3ByCXBpdCwgcjMKLQlibHIKLSNlbmRpZgotCi0JLmdsb2JsIHdyX3Rjcgotd3JfdGNyOgotCW10c3ByCXRjciwgcjMKLQlibHIKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBGdW5jdGlvbjoJIG91dDE2ICovCiAvKiBEZXNjcmlwdGlvbjoJIE91dHB1dCAxNiBiaXRzICovCkBAIC0xNDk3LDcgKzE1MTgsNyBAQAogICogaW5pdGlhbGl6YXRpb24sIG5vdyBydW5uaW5nIGZyb20gUkFNLgogICovCiAKLQlhZGRpCXIwLCByMTAsIGluX3JhbSAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJYWRkaQlyMCwgcjEwLCBpbl9yYW0gLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCiAJbXRscglyMAogCWJscgkJCQkvKiBORVZFUiBSRVRVUk5TISAqLwogCkBAIC0xNTY3LDcgKzE1ODgsNyBAQAogCSAqLwogCS5nbG9ibAl0cmFwX2luaXQKIHRyYXBfaW5pdDoKLQlsd3oJcjcsIEdPVChfc3RhcnQpCisJbHd6CXI3LCBHT1QoX3N0YXJ0X29mX3ZlY3RvcnMpCiAJbHd6CXI4LCBHT1QoX2VuZF9vZl92ZWN0b3JzKQogCiAJbGkJcjksIDB4MTAwCQkvKiByZXNldCB2ZWN0b3IgYWx3YXlzIGF0IDB4MTAwICovCkBAIC0xNTg3LDM1ICsxNjA4LDQ4IEBACiAJLyoKIAkgKiByZWxvY2F0ZSBgaGRscicgYW5kIGBpbnRfcmV0dXJuJyBlbnRyaWVzCiAJICovCi0JbGkJcjcsIC5MX01hY2hpbmVDaGVjayAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCi0JbGkJcjgsIEFsaWdubWVudCAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbGkJcjcsIC5MX01hY2hpbmVDaGVjayAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQKKwlsaQlyOCwgQWxpZ25tZW50IC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAogMjoKIAlibAl0cmFwX3JlbG9jCi0JYWRkaQlyNywgcjcsIDB4MTAwCQkvKiBuZXh0IGV4Y2VwdGlvbiB2ZWN0b3IJKi8KKwlhZGRpCXI3LCByNywgMHgxMDAJCS8qIG5leHQgZXhjZXB0aW9uIHZlY3RvciAqLwogCWNtcGx3CTAsIHI3LCByOAogCWJsdAkyYgogCi0JbGkJcjcsIC5MX0FsaWdubWVudCAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbGkJcjcsIC5MX0FsaWdubWVudCAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQKIAlibAl0cmFwX3JlbG9jCiAKLQlsaQlyNywgLkxfUHJvZ3JhbUNoZWNrIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlsaQlyNywgLkxfUHJvZ3JhbUNoZWNrIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAogCWJsCXRyYXBfcmVsb2MKIAotCWxpCXI3LCAuTF9GUFVuYXZhaWxhYmxlIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKLQlsaQlyOCwgU3lzdGVtQ2FsbCAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCi0zOgorI2lmZGVmIENPTkZJR180NDAKKwlsaQlyNywgLkxfRlBVbmF2YWlsYWJsZSAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQKIAlibAl0cmFwX3JlbG9jCi0JYWRkaQlyNywgcjcsIDB4MTAwCQkvKiBuZXh0IGV4Y2VwdGlvbiB2ZWN0b3IJKi8KLQljbXBsdwkwLCByNywgcjgKLQlibHQJM2IKIAotCWxpCXI3LCAuTF9TaW5nbGVTdGVwIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKLQlsaQlyOCwgX2VuZF9vZl92ZWN0b3JzIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKLTQ6CisJbGkJcjcsIC5MX0RlY3JlbWVudGVyIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAogCWJsCXRyYXBfcmVsb2MKLQlhZGRpCXI3LCByNywgMHgxMDAJCS8qIG5leHQgZXhjZXB0aW9uIHZlY3RvcgkqLwotCWNtcGx3CTAsIHI3LCByOAotCWJsdAk0YgorCisJbGkJcjcsIC5MX0FQVSAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQKKwlibAl0cmFwX3JlbG9jCisKKwlsaQlyNywgLkxfSW5zdHJ1Y3Rpb25UTEJFcnJvciAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQKKwlibAl0cmFwX3JlbG9jCisKKwlsaQlyNywgLkxfRGF0YVRMQkVycm9yIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAorCWJsCXRyYXBfcmVsb2MKKyNlbHNlIC8qIENPTkZJR180NDAgKi8KKwlsaQlyNywgLkxfUElUIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAorCWJsCXRyYXBfcmVsb2MKKworCWxpCXI3LCAuTF9JbnN0cnVjdGlvblRMQk1pc3MgLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCisJYmwJdHJhcF9yZWxvYworCisJbGkJcjcsIC5MX0RhdGFUTEJNaXNzIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAorCWJsCXRyYXBfcmVsb2MKKyNlbmRpZiAvKiBDT05GSUdfNDQwICovCisKKwlsaQlyNywgLkxfRGVidWdCcmVha3BvaW50IC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAorCWJsCXRyYXBfcmVsb2MKIAogI2lmICFkZWZpbmVkKENPTkZJR180NDApCiAJYWRkaQlyNyxyMCwweDEwMDAJCS8qIHNldCBNRSBiaXQgKE1hY2hpbmUgRXhjZXB0aW9ucykgKi8KQEAgLTE2NTgsMTMgKzE2OTIsMTMgQEAKICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAlmdW5jdGlvbl9wcm9sb2coZGNiel9hcmVhKQogCXJsd2lubS4gcjUscjQsMCwyNywzMQotCXJsd2lubSAgcjUscjQsMjcsNSwzMQotCWJlcSAgICAgLi5kX3JhMgotCWFkZGkgICAgcjUscjUsMHgwMDAxCi0uLmRfcmEyOm10Y3RyICAgcjUKLS4uZF9hZzI6ZGNieiAgICByMCxyMwotCWFkZGkgICAgcjMscjMsMzIKLQliZG56ICAgIC4uZF9hZzIKKwlybHdpbm0JcjUscjQsMjcsNSwzMQorCWJlcQkuLmRfcmEyCisJYWRkaQlyNSxyNSwweDAwMDEKKy4uZF9yYTI6bXRjdHIJcjUKKy4uZF9hZzI6ZGNieglyMCxyMworCWFkZGkJcjMscjMsMzIKKwliZG56CS4uZF9hZzIKIAlzeW5jCiAJYmxyCiAJZnVuY3Rpb25fZXBpbG9nKGRjYnpfYXJlYSkKQEAgLTE2NzMsMjYgKzE3MDcsMjYgQEAKIHwgZGZsdXNoLiAgQXNzdW1lIDMySyBhdCB2ZWN0b3IgYWRkcmVzcyBpcyBjYWNoYWJsZS4KICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAlmdW5jdGlvbl9wcm9sb2coZGZsdXNoKQotCW1mbXNyICAgcjkKLQlybHdpbm0gIHI4LHI5LDAsMTUsMTMKLQlybHdpbm0gIHI4LHI4LDAsMTcsMTUKLQltdG1zciAgIHI4Ci0JYWRkaSAgICByMyxyMCwweDAwMDAKLQltdHNwciAgIGR2bGltLHIzCi0JbWZzcHIgICByMyxpdnByCi0JYWRkaSAgICByNCxyMCwxMDI0Ci0JbXRjdHIgICByNAorCW1mbXNyCXI5CisJcmx3aW5tCXI4LHI5LDAsMTUsMTMKKwlybHdpbm0JcjgscjgsMCwxNywxNQorCW10bXNyCXI4CisJYWRkaQlyMyxyMCwweDAwMDAKKwltdHNwcglkdmxpbSxyMworCW1mc3ByCXIzLGl2cHIKKwlhZGRpCXI0LHIwLDEwMjQKKwltdGN0cglyNAogLi5kZmx1c2hfbG9vcDoKLQlsd3ogICAgIHI2LDB4MChyMykKLQlhZGRpICAgIHIzLHIzLDMyCi0JYmRueiAgICAuLmRmbHVzaF9sb29wCi0JYWRkaSAgICByMyxyMywtMzIKLQltdGN0ciAgIHI0Ci0uLmFnOiAgIGRjYmYgICAgcjAscjMKLQlhZGRpICAgIHIzLHIzLC0zMgotCWJkbnogICAgLi5hZworCWx3eglyNiwweDAocjMpCisJYWRkaQlyMyxyMywzMgorCWJkbnoJLi5kZmx1c2hfbG9vcAorCWFkZGkJcjMscjMsLTMyCisJbXRjdHIJcjQKKy4uYWc6CWRjYmYJcjAscjMKKwlhZGRpCXIzLHIzLC0zMgorCWJkbnoJLi5hZwogCXN5bmMKLQltdG1zciAgIHI5CisJbXRtc3IJcjkKIAlibHIKIAlmdW5jdGlvbl9lcGlsb2coZGZsdXNoKQogI2VuZGlmIC8qIENPTkZJR180NDAgKi8KQEAgLTE3MzQsNiArMTc2OCwyMyBAQAogCWx3egkzLDB4MDAwMCgzKQogCWJscgogCitpbnZhbGlkYXRlX2ljYWNoZToKKwlpY2NjaQlyMCxyMAkJCS8qIGZvciA0MDUsIGljY2NpIGludmFsaWRhdGVzIHRoZSAqLworCWJscgkJCQkvKiAgIGVudGlyZSBJIGNhY2hlICovCisKK2ludmFsaWRhdGVfZGNhY2hlOgorCWFkZGkJcjYsMCwweDAwMDAJCS8qIGNsZWFyIEdQUiA2ICovCisJLyogRG8gbG9vcCBmb3IgIyBvZiBkY2FjaGUgY29uZ3J1ZW5jZSBjbGFzc2VzLiAqLworCWxpcwlyNywgKENGR19EQ0FDSEVfU0laRSAvIENGR19DQUNIRUxJTkVfU0laRSAvIDIpQGhhCS8qIFRCUyBmb3IgbGFyZ2Ugc2l6ZWQgY2FjaGUgKi8KKwlvcmkJcjcsIHI3LCAoQ0ZHX0RDQUNIRV9TSVpFIC8gQ0ZHX0NBQ0hFTElORV9TSVpFIC8gMilAbAorCQkJCQkvKiBOT1RFOiBkY2NjaSBpbnZhbGlkYXRlcyBib3RoICovCisJbXRjdHIJcjcJCQkvKiB3YXlzIGluIHRoZSBEIGNhY2hlICovCisuLmRjbG9vcDoKKwlkY2NjaQkwLHI2CQkJLyogaW52YWxpZGF0ZSBsaW5lICovCisJYWRkaQlyNixyNiwgQ0ZHX0NBQ0hFTElORV9TSVpFIC8qIGJ1bXAgdG8gbmV4dCBsaW5lICovCisJYmRuegkuLmRjbG9vcAorCWJscgorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBQUEM0MDVFUCBzcGVjaWZpYyBzdHVmZgkJCQkJCSAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2NwdS9wcGM0eHgvdGxiLmMgYi9jcHUvcHBjNHh4L3RsYi5jCmluZGV4IDUwMzQ0YTQuLjA0OWE3ODUgMTAwNjQ0Ci0tLSBhL2NwdS9wcGM0eHgvdGxiLmMKKysrIGIvY3B1L3BwYzR4eC90bGIuYwpAQCAtMzYsNyArMzYsOCBAQAogCXVuc2lnbmVkIGxvbmcgdGxiX3dvcmQyX2lfdmFsdWU7CiB9IHJlZ2lvbl90OwogCi1zdGF0aWMgaW50IGFkZF90bGJfZW50cnkodW5zaWduZWQgbG9uZyBiYXNlX2FkZHIsCitzdGF0aWMgaW50IGFkZF90bGJfZW50cnkodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsCisJCQkgdW5zaWduZWQgbG9uZyB2aXJ0X2FkZHIsCiAJCQkgdW5zaWduZWQgbG9uZyB0bGJfd29yZDBfc2l6ZV92YWx1ZSwKIAkJCSB1bnNpZ25lZCBsb25nIHRsYl93b3JkMl9pX3ZhbHVlKQogewpAQCAtNTUsOSArNTYsOSBAQAogCQlyZXR1cm4gLTE7CiAKIAkvKiBTZWNvbmQsIGNyZWF0ZSB0aGUgVExCIGVudHJ5ICovCi0JdGxiX3dvcmQwX3ZhbHVlID0gVExCX1dPUkQwX0VQTl9FTkNPREUoYmFzZV9hZGRyKSB8IFRMQl9XT1JEMF9WX0VOQUJMRSB8CisJdGxiX3dvcmQwX3ZhbHVlID0gVExCX1dPUkQwX0VQTl9FTkNPREUodmlydF9hZGRyKSB8IFRMQl9XT1JEMF9WX0VOQUJMRSB8CiAJCVRMQl9XT1JEMF9UU18wIHwgdGxiX3dvcmQwX3NpemVfdmFsdWU7Ci0JdGxiX3dvcmQxX3ZhbHVlID0gVExCX1dPUkQxX1JQTl9FTkNPREUoYmFzZV9hZGRyKSB8IFRMQl9XT1JEMV9FUlBOX0VOQ09ERSgwKTsKKwl0bGJfd29yZDFfdmFsdWUgPSBUTEJfV09SRDFfUlBOX0VOQ09ERShwaHlzX2FkZHIpIHwgVExCX1dPUkQxX0VSUE5fRU5DT0RFKDApOwogCXRsYl93b3JkMl92YWx1ZSA9IFRMQl9XT1JEMl9VMF9ESVNBQkxFIHwgVExCX1dPUkQyX1UxX0RJU0FCTEUgfAogCQlUTEJfV09SRDJfVTJfRElTQUJMRSB8IFRMQl9XT1JEMl9VM19ESVNBQkxFIHwKIAkJVExCX1dPUkQyX1dfRElTQUJMRSB8IHRsYl93b3JkMl9pX3ZhbHVlIHwKQEAgLTgxLDcgKzgyLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcHJvZ3JhbV90bGJfYWRkcih1bnNpZ25lZCBsb25nIGJhc2VfYWRkciwgdW5zaWduZWQgbG9uZyBtZW1fc2l6ZSwKK3N0YXRpYyB2b2lkIHByb2dyYW1fdGxiX2FkZHIodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgdmlydF9hZGRyLAorCQkJICAgICB1bnNpZ25lZCBsb25nIG1lbV9zaXplLAogCQkJICAgICB1bnNpZ25lZCBsb25nIHRsYl93b3JkMl9pX3ZhbHVlKQogewogCWludCByYzsKQEAgLTkxLDcwICs5NCw4NiBAQAogCXdoaWxlIChtZW1fc2l6ZSAhPSAwKSB7CiAJCXJjID0gMDsKIAkJLyogQWRkIHRoZSBUTEIgZW50cmllcyBpbiB0byBtYXAgdGhlIHJlZ2lvbi4gKi8KLQkJaWYgKCgoYmFzZV9hZGRyICYgVExCXzI1Nk1CX0FMSUdOX01BU0spID09IGJhc2VfYWRkcikgJiYKKwkJaWYgKCgocGh5c19hZGRyICYgVExCXzI1Nk1CX0FMSUdOX01BU0spID09IHBoeXNfYWRkcikgJiYKIAkJICAgIChtZW1fc2l6ZSA+PSBUTEJfMjU2TUJfU0laRSkpIHsKIAkJCS8qIEFkZCBhIDI1Nk1CIFRMQiBlbnRyeSAqLwotCQkJaWYgKChyYyA9IGFkZF90bGJfZW50cnkoYmFzZV9hZGRyLCBUTEJfV09SRDBfU0laRV8yNTZNQiwgdGxiX2kpKSA9PSAwKSB7CisJCQlpZiAoKHJjID0gYWRkX3RsYl9lbnRyeShwaHlzX2FkZHIsIHZpcnRfYWRkciwKKwkJCQkJCVRMQl9XT1JEMF9TSVpFXzI1Nk1CLCB0bGJfaSkpID09IDApIHsKIAkJCQltZW1fc2l6ZSAtPSBUTEJfMjU2TUJfU0laRTsKLQkJCQliYXNlX2FkZHIgKz0gVExCXzI1Nk1CX1NJWkU7CisJCQkJcGh5c19hZGRyICs9IFRMQl8yNTZNQl9TSVpFOworCQkJCXZpcnRfYWRkciArPSBUTEJfMjU2TUJfU0laRTsKIAkJCX0KLQkJfSBlbHNlIGlmICgoKGJhc2VfYWRkciAmIFRMQl8xNk1CX0FMSUdOX01BU0spID09IGJhc2VfYWRkcikgJiYKKwkJfSBlbHNlIGlmICgoKHBoeXNfYWRkciAmIFRMQl8xNk1CX0FMSUdOX01BU0spID09IHBoeXNfYWRkcikgJiYKIAkJCSAgIChtZW1fc2l6ZSA+PSBUTEJfMTZNQl9TSVpFKSkgewogCQkJLyogQWRkIGEgMTZNQiBUTEIgZW50cnkgKi8KLQkJCWlmICgocmMgPSBhZGRfdGxiX2VudHJ5KGJhc2VfYWRkciwgVExCX1dPUkQwX1NJWkVfMTZNQiwgdGxiX2kpKSA9PSAwKSB7CisJCQlpZiAoKHJjID0gYWRkX3RsYl9lbnRyeShwaHlzX2FkZHIsIHZpcnRfYWRkciwKKwkJCQkJCVRMQl9XT1JEMF9TSVpFXzE2TUIsIHRsYl9pKSkgPT0gMCkgewogCQkJCW1lbV9zaXplIC09IFRMQl8xNk1CX1NJWkU7Ci0JCQkJYmFzZV9hZGRyICs9IFRMQl8xNk1CX1NJWkU7CisJCQkJcGh5c19hZGRyICs9IFRMQl8xNk1CX1NJWkU7CisJCQkJdmlydF9hZGRyICs9IFRMQl8xNk1CX1NJWkU7CiAJCQl9Ci0JCX0gZWxzZSBpZiAoKChiYXNlX2FkZHIgJiBUTEJfMU1CX0FMSUdOX01BU0spID09IGJhc2VfYWRkcikgJiYKKwkJfSBlbHNlIGlmICgoKHBoeXNfYWRkciAmIFRMQl8xTUJfQUxJR05fTUFTSykgPT0gcGh5c19hZGRyKSAmJgogCQkJICAgKG1lbV9zaXplID49IFRMQl8xTUJfU0laRSkpIHsKIAkJCS8qIEFkZCBhIDFNQiBUTEIgZW50cnkgKi8KLQkJCWlmICgocmMgPSBhZGRfdGxiX2VudHJ5KGJhc2VfYWRkciwgVExCX1dPUkQwX1NJWkVfMU1CLCB0bGJfaSkpID09IDApIHsKKwkJCWlmICgocmMgPSBhZGRfdGxiX2VudHJ5KHBoeXNfYWRkciwgdmlydF9hZGRyLAorCQkJCQkJVExCX1dPUkQwX1NJWkVfMU1CLCB0bGJfaSkpID09IDApIHsKIAkJCQltZW1fc2l6ZSAtPSBUTEJfMU1CX1NJWkU7Ci0JCQkJYmFzZV9hZGRyICs9IFRMQl8xTUJfU0laRTsKKwkJCQlwaHlzX2FkZHIgKz0gVExCXzFNQl9TSVpFOworCQkJCXZpcnRfYWRkciArPSBUTEJfMU1CX1NJWkU7CiAJCQl9Ci0JCX0gZWxzZSBpZiAoKChiYXNlX2FkZHIgJiBUTEJfMjU2S0JfQUxJR05fTUFTSykgPT0gYmFzZV9hZGRyKSAmJgorCQl9IGVsc2UgaWYgKCgocGh5c19hZGRyICYgVExCXzI1NktCX0FMSUdOX01BU0spID09IHBoeXNfYWRkcikgJiYKIAkJCSAgIChtZW1fc2l6ZSA+PSBUTEJfMjU2S0JfU0laRSkpIHsKIAkJCS8qIEFkZCBhIDI1NktCIFRMQiBlbnRyeSAqLwotCQkJaWYgKChyYyA9IGFkZF90bGJfZW50cnkoYmFzZV9hZGRyLCBUTEJfV09SRDBfU0laRV8yNTZLQiwgdGxiX2kpKSA9PSAwKSB7CisJCQlpZiAoKHJjID0gYWRkX3RsYl9lbnRyeShwaHlzX2FkZHIsIHZpcnRfYWRkciwKKwkJCQkJCVRMQl9XT1JEMF9TSVpFXzI1NktCLCB0bGJfaSkpID09IDApIHsKIAkJCQltZW1fc2l6ZSAtPSBUTEJfMjU2S0JfU0laRTsKLQkJCQliYXNlX2FkZHIgKz0gVExCXzI1NktCX1NJWkU7CisJCQkJcGh5c19hZGRyICs9IFRMQl8yNTZLQl9TSVpFOworCQkJCXZpcnRfYWRkciArPSBUTEJfMjU2S0JfU0laRTsKIAkJCX0KLQkJfSBlbHNlIGlmICgoKGJhc2VfYWRkciAmIFRMQl82NEtCX0FMSUdOX01BU0spID09IGJhc2VfYWRkcikgJiYKKwkJfSBlbHNlIGlmICgoKHBoeXNfYWRkciAmIFRMQl82NEtCX0FMSUdOX01BU0spID09IHBoeXNfYWRkcikgJiYKIAkJCSAgIChtZW1fc2l6ZSA+PSBUTEJfNjRLQl9TSVpFKSkgewogCQkJLyogQWRkIGEgNjRLQiBUTEIgZW50cnkgKi8KLQkJCWlmICgocmMgPSBhZGRfdGxiX2VudHJ5KGJhc2VfYWRkciwgVExCX1dPUkQwX1NJWkVfNjRLQiwgdGxiX2kpKSA9PSAwKSB7CisJCQlpZiAoKHJjID0gYWRkX3RsYl9lbnRyeShwaHlzX2FkZHIsIHZpcnRfYWRkciwKKwkJCQkJCVRMQl9XT1JEMF9TSVpFXzY0S0IsIHRsYl9pKSkgPT0gMCkgewogCQkJCW1lbV9zaXplIC09IFRMQl82NEtCX1NJWkU7Ci0JCQkJYmFzZV9hZGRyICs9IFRMQl82NEtCX1NJWkU7CisJCQkJcGh5c19hZGRyICs9IFRMQl82NEtCX1NJWkU7CisJCQkJdmlydF9hZGRyICs9IFRMQl82NEtCX1NJWkU7CiAJCQl9Ci0JCX0gZWxzZSBpZiAoKChiYXNlX2FkZHIgJiBUTEJfMTZLQl9BTElHTl9NQVNLKSA9PSBiYXNlX2FkZHIpICYmCisJCX0gZWxzZSBpZiAoKChwaHlzX2FkZHIgJiBUTEJfMTZLQl9BTElHTl9NQVNLKSA9PSBwaHlzX2FkZHIpICYmCiAJCQkgICAobWVtX3NpemUgPj0gVExCXzE2S0JfU0laRSkpIHsKIAkJCS8qIEFkZCBhIDE2S0IgVExCIGVudHJ5ICovCi0JCQlpZiAoKHJjID0gYWRkX3RsYl9lbnRyeShiYXNlX2FkZHIsIFRMQl9XT1JEMF9TSVpFXzE2S0IsIHRsYl9pKSkgPT0gMCkgeworCQkJaWYgKChyYyA9IGFkZF90bGJfZW50cnkocGh5c19hZGRyLCB2aXJ0X2FkZHIsCisJCQkJCQlUTEJfV09SRDBfU0laRV8xNktCLCB0bGJfaSkpID09IDApIHsKIAkJCQltZW1fc2l6ZSAtPSBUTEJfMTZLQl9TSVpFOwotCQkJCWJhc2VfYWRkciArPSBUTEJfMTZLQl9TSVpFOworCQkJCXBoeXNfYWRkciArPSBUTEJfMTZLQl9TSVpFOworCQkJCXZpcnRfYWRkciArPSBUTEJfMTZLQl9TSVpFOwogCQkJfQotCQl9IGVsc2UgaWYgKCgoYmFzZV9hZGRyICYgVExCXzRLQl9BTElHTl9NQVNLKSA9PSBiYXNlX2FkZHIpICYmCisJCX0gZWxzZSBpZiAoKChwaHlzX2FkZHIgJiBUTEJfNEtCX0FMSUdOX01BU0spID09IHBoeXNfYWRkcikgJiYKIAkJCSAgIChtZW1fc2l6ZSA+PSBUTEJfNEtCX1NJWkUpKSB7CiAJCQkvKiBBZGQgYSA0S0IgVExCIGVudHJ5ICovCi0JCQlpZiAoKHJjID0gYWRkX3RsYl9lbnRyeShiYXNlX2FkZHIsIFRMQl9XT1JEMF9TSVpFXzRLQiwgdGxiX2kpKSA9PSAwKSB7CisJCQlpZiAoKHJjID0gYWRkX3RsYl9lbnRyeShwaHlzX2FkZHIsIHZpcnRfYWRkciwKKwkJCQkJCVRMQl9XT1JEMF9TSVpFXzRLQiwgdGxiX2kpKSA9PSAwKSB7CiAJCQkJbWVtX3NpemUgLT0gVExCXzRLQl9TSVpFOwotCQkJCWJhc2VfYWRkciArPSBUTEJfNEtCX1NJWkU7CisJCQkJcGh5c19hZGRyICs9IFRMQl80S0JfU0laRTsKKwkJCQl2aXJ0X2FkZHIgKz0gVExCXzRLQl9TSVpFOwogCQkJfQotCQl9IGVsc2UgaWYgKCgoYmFzZV9hZGRyICYgVExCXzFLQl9BTElHTl9NQVNLKSA9PSBiYXNlX2FkZHIpICYmCisJCX0gZWxzZSBpZiAoKChwaHlzX2FkZHIgJiBUTEJfMUtCX0FMSUdOX01BU0spID09IHBoeXNfYWRkcikgJiYKIAkJCSAgIChtZW1fc2l6ZSA+PSBUTEJfMUtCX1NJWkUpKSB7CiAJCQkvKiBBZGQgYSAxS0IgVExCIGVudHJ5ICovCi0JCQlpZiAoKHJjID0gYWRkX3RsYl9lbnRyeShiYXNlX2FkZHIsIFRMQl9XT1JEMF9TSVpFXzFLQiwgdGxiX2kpKSA9PSAwKSB7CisJCQlpZiAoKHJjID0gYWRkX3RsYl9lbnRyeShwaHlzX2FkZHIsIHZpcnRfYWRkciwKKwkJCQkJCVRMQl9XT1JEMF9TSVpFXzFLQiwgdGxiX2kpKSA9PSAwKSB7CiAJCQkJbWVtX3NpemUgLT0gVExCXzFLQl9TSVpFOwotCQkJCWJhc2VfYWRkciArPSBUTEJfMUtCX1NJWkU7CisJCQkJcGh5c19hZGRyICs9IFRMQl8xS0JfU0laRTsKKwkJCQl2aXJ0X2FkZHIgKz0gVExCXzFLQl9TSVpFOwogCQkJfQogCQl9IGVsc2UgewogCQkJcHJpbnRmKCJFUlJPUjogbm8gVExCIHNpemUgZXhpc3RzIGZvciB0aGUgYmFzZSBhZGRyZXNzIDB4JTBYLlxuIiwKLQkJCQliYXNlX2FkZHIpOworCQkJCXBoeXNfYWRkcik7CiAJCX0KIAogCQlpZiAocmMgIT0gMCkKIAkJCXByaW50ZigiRVJST1I6IG5vIFRMQiBlbnRyaWVzIGF2YWlsYWJsZSBmb3IgdGhlIGJhc2UgYWRkciAweCUwWC5cbiIsCi0JCQkJYmFzZV9hZGRyKTsKKwkJCQlwaHlzX2FkZHIpOwogCX0KIAogCXJldHVybjsKQEAgLTE2NiwxNiArMTg1LDE2IEBACiAgKiBDb21tb24gdXNhZ2UgZm9yIGJvYXJkcyB3aXRoIFNEUkFNIERJTU0gbW9kdWxlcyB0byBkeW5hbWljYWxseQogICogY29uZmlndXJlIHRoZSBUTEIncyBmb3IgdGhlIFNEUkFNCiAgKi8KLXZvaWQgcHJvZ3JhbV90bGIodTMyIHN0YXJ0LCB1MzIgc2l6ZSwgdTMyIHRsYl93b3JkMl9pX3ZhbHVlKQordm9pZCBwcm9ncmFtX3RsYih1MzIgcGh5c19hZGRyLCB1MzIgdmlydF9hZGRyLCB1MzIgc2l6ZSwgdTMyIHRsYl93b3JkMl9pX3ZhbHVlKQogewogCXJlZ2lvbl90IHJlZ2lvbl9hcnJheTsKIAotCXJlZ2lvbl9hcnJheS5iYXNlID0gc3RhcnQ7CisJcmVnaW9uX2FycmF5LmJhc2UgPSBwaHlzX2FkZHI7CiAJcmVnaW9uX2FycmF5LnNpemUgPSBzaXplOwogCXJlZ2lvbl9hcnJheS50bGJfd29yZDJfaV92YWx1ZSA9IHRsYl93b3JkMl9pX3ZhbHVlOwkvKiBlbi0vZGlzYWJsZSBjYWNoZSAqLwogCiAJLyogQ2FsbCB0aGUgcm91dGluZSB0byBhZGQgaW4gdGhlIHRsYiBlbnRyaWVzIGZvciB0aGUgbWVtb3J5IHJlZ2lvbnMgKi8KLQlwcm9ncmFtX3RsYl9hZGRyKHJlZ2lvbl9hcnJheS5iYXNlLCByZWdpb25fYXJyYXkuc2l6ZSwKKwlwcm9ncmFtX3RsYl9hZGRyKHJlZ2lvbl9hcnJheS5iYXNlLCB2aXJ0X2FkZHIsIHJlZ2lvbl9hcnJheS5zaXplLAogCQkJIHJlZ2lvbl9hcnJheS50bGJfd29yZDJfaV92YWx1ZSk7CiAKIAlyZXR1cm47CmRpZmYgLS1naXQgYS9jcHUvcHBjNHh4L3RyYXBzLmMgYi9jcHUvcHBjNHh4L3RyYXBzLmMKaW5kZXggNmFlY2NhMi4uODk5Y2RiZCAxMDA2NDQKLS0tIGEvY3B1L3BwYzR4eC90cmFwcy5jCisrKyBiL2NwdS9wcGM0eHgvdHJhcHMuYwpAQCAtMzYsNyArMzYsOSBAQAogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIGludCAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShzdHJ1Y3QgcHRfcmVncyAqKSA9IDA7CiAjZW5kaWYKIApAQCAtNDUsOCArNDcsNyBAQAogCiAvKiBUSElTIE5FRURTIENIQU5HSU5HIHRvIHVzZSB0aGUgYm9hcmQgaW5mbyBzdHJ1Y3R1cmUuCiAgKi8KLSNkZWZpbmUgRU5EX09GX01FTQkweDAwNDAwMDAwCi0KKyNkZWZpbmUgRU5EX09GX01FTQkoZ2QtPmJkLT5iaV9tZW1zdGFydCArIGdkLT5iZC0+YmlfbWVtc2l6ZSkKIAogc3RhdGljIF9faW5saW5lX18gdm9pZCBzZXRfdHNyKHVuc2lnbmVkIGxvbmcgdmFsKQogewpAQCAtNzcsNyArNzgsNyBAQAogI2RlZmluZSBFU1JfRElaIDB4MDA0MDAwMDAKICNkZWZpbmUgRVNSX1UwRiAweDAwMDA4MDAwCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CRURCVUcpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JFREJVRykKIGV4dGVybiB2b2lkIGRvX2JlZGJ1Z19icmVha3BvaW50KHN0cnVjdCBwdF9yZWdzICopOwogI2VuZGlmCiAKQEAgLTExMCw3ICsxMTEsNyBAQAogewogCWludCBpOwogCi0JcHJpbnRmKCJOSVA6ICUwOGxYIFhFUjogJTA4bFggTFI6ICUwOGxYIFJFR1M6ICVwIFRSQVA6ICUwNGx4IERBUjogJTA4bFhcbiIsCisJcHJpbnRmKCJOSVA6ICUwOGxYIFhFUjogJTA4bFggTFI6ICUwOGxYIFJFR1M6ICVwIFRSQVA6ICUwNGx4IERFQVI6ICUwOGxYXG4iLAogCSAgICAgICByZWdzLT5uaXAsIHJlZ3MtPnhlciwgcmVncy0+bGluaywgcmVncywgcmVncy0+dHJhcCwgcmVncy0+ZGFyKTsKIAlwcmludGYoIk1TUjogJTA4bHggRUU6ICUwMXggUFI6ICUwMXggRlA6ICUwMXggTUU6ICUwMXggSVIvRFI6ICUwMXglMDF4XG4iLAogCSAgICAgICByZWdzLT5tc3IsIHJlZ3MtPm1zciZNU1JfRUUgPyAxIDogMCwgcmVncy0+bXNyJk1TUl9QUiA/IDEgOiAwLApAQCAtMTIwLDE0ICsxMjEsMTIgQEAKIAogCXByaW50ZigiXG4iKTsKIAlmb3IgKGkgPSAwOyAgaSA8IDMyOyAgaSsrKSB7Ci0JCWlmICgoaSAlIDgpID09IDApCi0JCXsKKwkJaWYgKChpICUgOCkgPT0gMCkgewogCQkJcHJpbnRmKCJHUFIlMDJkOiAiLCBpKTsKIAkJfQogCiAJCXByaW50ZigiJTA4bFggIiwgcmVncy0+Z3ByW2ldKTsKLQkJaWYgKChpICUgOCkgPT0gNykKLQkJeworCQlpZiAoKGkgJSA4KSA9PSA3KSB7CiAJCQlwcmludGYoIlxuIik7CiAJCX0KIAl9CkBAIC0xMzksMTMgKzEzOCwxNiBAQAogewogCXNob3dfcmVncyhyZWdzKTsKIAlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOwotCXBhbmljKCJFeGNlcHRpb24gaW4ga2VybmVsIHBjICVseCBzaWduYWwgJWQiLHJlZ3MtPm5pcCxzaWducik7CisJcGFuaWMoIkV4Y2VwdGlvbiIpOwogfQogCiB2b2lkCiBNYWNoaW5lQ2hlY2tFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JdW5zaWduZWQgbG9uZyBmaXh1cDsKKwl1bnNpZ25lZCBsb25nIGZpeHVwLCB2YWw7CisjaWYgZGVmaW5lZChDT05GSUdfNDQwRVBYKSB8fCBkZWZpbmVkKENPTkZJR180NDBHUlgpCisJdTMyIHZhbHVlMjsKKyNlbmRpZgogCiAJLyogUHJvYmluZyBQQ0kgdXNpbmcgY29uZmlnIGN5Y2xlcyBjYXVzZSB0aGlzIGV4Y2VwdGlvbgogCSAqIHdoZW4gYSBkZXZpY2UgaXMgbm90IHByZXNlbnQuICBDYXRjaCBpdCBhbmQgcmV0dXJuIHRvCkBAIC0xNTYsMzEgKzE1OCwxMzcgQEAKIAkJcmV0dXJuOwogCX0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQogCQlyZXR1cm47CiAjZW5kaWYKIAotCXByaW50ZigiTWFjaGluZSBjaGVjayBpbiBrZXJuZWwgbW9kZS5cbiIpOworCXByaW50ZigiTWFjaGluZSBDaGVjayBFeGNlcHRpb24uXG4iKTsKIAlwcmludGYoIkNhdXNlZCBieSAoZnJvbSBtc3IpOiAiKTsKLQlwcmludGYoInJlZ3MgJXAgIixyZWdzKTsKLQlzd2l0Y2goIHJlZ3MtPm1zciAmIDB4MDAwRjAwMDApIHsKLQljYXNlICgweDgwMDAwMDAwPj4xMik6Ci0JCXByaW50ZigiTWFjaGluZSBjaGVjayBzaWduYWwgLSBwcm9iYWJseSBkdWUgdG8gbW0gZmF1bHRcbiIKLQkJICAgICAgICJ3aXRoIG1tdSBvZmZcbiIpOworCXByaW50ZigicmVncyAlcCAiLCByZWdzKTsKKworCXZhbCA9IGdldF9lc3IoKTsKKworI2lmICFkZWZpbmVkKENPTkZJR180NDApCisJaWYgKHZhbCYgRVNSX0lNQ1ApIHsKKwkJcHJpbnRmKCJJbnN0cnVjdGlvbiIpOworCQltdHNwcihFU1IsIHZhbCAmIH5FU1JfSU1DUCk7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJEYXRhIik7CisJfQorCXByaW50ZigiIG1hY2hpbmUgY2hlY2suXG4iKTsKKworI2VsaWYgZGVmaW5lZChDT05GSUdfNDQwKQorCWlmICh2YWwmIEVTUl9JTUNQKXsKKwkJcHJpbnRmKCJJbnN0cnVjdGlvbiBTeW5jaHJvbm91cyBNYWNoaW5lIENoZWNrIGV4Y2VwdGlvblxuIik7CisJCW10c3ByKFNQUk5fRVNSLCB2YWwgJiB+RVNSX0lNQ1ApOworCX0gZWxzZSB7CisJCXZhbCA9IG1mc3ByKE1DU1IpOworCQlpZiAodmFsICYgTUNTUl9JQikKKwkJCXByaW50ZigiSW5zdHJ1Y3Rpb24gUmVhZCBQTEIgRXJyb3JcbiIpOworCQlpZiAodmFsICYgTUNTUl9EUkIpCisJCQlwcmludGYoIkRhdGEgUmVhZCBQTEIgRXJyb3JcbiIpOworCQlpZiAodmFsICYgTUNTUl9EV0IpCisJCQlwcmludGYoIkRhdGEgV3JpdGUgUExCIEVycm9yXG4iKTsKKwkJaWYgKHZhbCAmIE1DU1JfVExCUCkKKwkJCXByaW50ZigiVExCIFBhcml0eSBFcnJvclxuIik7CisJCWlmICh2YWwgJiBNQ1NSX0lDUCl7CisJCQkvKmZsdXNoX2luc3RydWN0aW9uX2NhY2hlKCk7ICovCisJCQlwcmludGYoIkktQ2FjaGUgUGFyaXR5IEVycm9yXG4iKTsKKwkJfQorCQlpZiAodmFsICYgTUNTUl9EQ1NQKQorCQkJcHJpbnRmKCJELUNhY2hlIFNlYXJjaCBQYXJpdHkgRXJyb3JcbiIpOworCQlpZiAodmFsICYgTUNTUl9EQ0ZQKQorCQkJcHJpbnRmKCJELUNhY2hlIEZsdXNoIFBhcml0eSBFcnJvclxuIik7CisJCWlmICh2YWwgJiBNQ1NSX0lNUEUpCisJCQlwcmludGYoIk1hY2hpbmUgQ2hlY2sgZXhjZXB0aW9uIGlzIGltcHJlY2lzZVxuIik7CisKKwkJLyogQ2xlYXIgTUNTUiAqLworCQltdHNwcihTUFJOX01DU1IsIHZhbCk7CisJfQorI2lmIGRlZmluZWQoQ09ORklHXzQ0MEVQWCkgfHwgZGVmaW5lZChDT05GSUdfNDQwR1JYKQorCW1mc2RyYW0oRERSMF8wMCwgdmFsKSA7CisJcHJpbnRmKCJERFIwOiBERFIwXzAwICVwXG4iLCB2YWwpOworCXZhbCA9ICh2YWwgPj4gMTYpICYgMHhmZjsKKwlpZiAodmFsICYgMHg4MCkKKwkJcHJpbnRmKCJERFIwOiBBdCBsZWFzdCBvbmUgaW50ZXJydXB0IGFjdGl2ZVxuIik7CisJaWYgKHZhbCAmIDB4NDApCisJCXByaW50ZigiRERSMDogRFJBTSBpbml0aWFsaXphdGlvbiBjb21wbGV0ZS5cbiIpOworCWlmICh2YWwgJiAweDIwKQorCQlwcmludGYoIkREUjA6IE11bHRpcGxlIHVuY29ycmVjdGFibGUgRUNDIGV2ZW50cy5cbiIpOworCWlmICh2YWwgJiAweDEwKQorCQlwcmludGYoIkREUjA6IFNpbmdsZSB1bmNvcnJlY3RhYmxlIEVDQyBldmVudC5cbiIpOworCWlmICh2YWwgJiAweDA4KQorCQlwcmludGYoIkREUjA6IE11bHRpcGxlIGNvcnJlY3RhYmxlIEVDQyBldmVudHMuXG4iKTsKKwlpZiAodmFsICYgMHgwNCkKKwkJcHJpbnRmKCJERFIwOiBTaW5nbGUgY29ycmVjdGFibGUgRUNDIGV2ZW50LlxuIik7CisJaWYgKHZhbCAmIDB4MDIpCisJCXByaW50ZigiTXVsdGlwbGUgYWNjZXNzZXMgb3V0c2lkZSB0aGUgZGVmaW5lZCIKKwkJICAgICAgICIgcGh5c2ljYWwgbWVtb3J5IHNwYWNlIGRldGVjdGVkXG4iKTsKKwlpZiAodmFsICYgMHgwMSkKKwkJcHJpbnRmKCJERFIwOiBTaW5nbGUgYWNjZXNzIG91dHNpZGUgdGhlIGRlZmluZWQiCisJCSAgICAgICAiIHBoeXNpY2FsIG1lbW9yeSBzcGFjZSBkZXRlY3RlZC5cbiIpOworCisJbWZzZHJhbShERFIwXzAxLCB2YWwpOworCXZhbCA9ICh2YWwgPj4gOCkgJiAweDc7CisJc3dpdGNoICh2YWwgKSB7CisJY2FzZSAwOgorCQlwcmludGYoIkREUjA6IFdyaXRlIE91dC1vZi1SYW5nZSBjb21tYW5kXG4iKTsKIAkJYnJlYWs7Ci0JY2FzZSAoMHg4MDAwMDAwMD4+MTMpOgotCQlwcmludGYoIlRyYW5zZmVyIGVycm9yIGFjayBzaWduYWxcbiIpOworCWNhc2UgMToKKwkJcHJpbnRmKCJERFIwOiBSZWFkIE91dC1vZi1SYW5nZSBjb21tYW5kXG4iKTsKIAkJYnJlYWs7Ci0JY2FzZSAoMHg4MDAwMDAwMD4+MTQpOgotCQlwcmludGYoIkRhdGEgcGFyaXR5IHNpZ25hbFxuIik7CisJY2FzZSAyOgorCQlwcmludGYoIkREUjA6IE1hc2tlZCB3cml0ZSBPdXQtb2YtUmFuZ2UgY29tbWFuZFxuIik7CiAJCWJyZWFrOwotCWNhc2UgKDB4ODAwMDAwMDA+PjE1KToKLQkJcHJpbnRmKCJBZGRyZXNzIHBhcml0eSBzaWduYWxcbiIpOworCWNhc2UgNDoKKwkJcHJpbnRmKCJERFIwOiBXcmFwIHdyaXRlIE91dC1vZi1SYW5nZSBjb21tYW5kXG4iKTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQlwcmludGYoIkREUjA6IFdyYXAgcmVhZCBPdXQtb2YtUmFuZ2UgY29tbWFuZFxuIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ZigiVW5rbm93biB2YWx1ZXMgaW4gbXNyXG4iKTsKKwkJbWZzZHJhbShERFIwXzAxLCB2YWx1ZTIpOworCQlwcmludGYoIkREUjA6IE5vIEREUjAgZXJyb3Iga25vdyAweCV4ICVwXG4iLCB2YWwsIHZhbHVlMik7CiAJfQorCW1mc2RyYW0oRERSMF8yMywgdmFsKTsKKwlpZiAoICh2YWwgPj4gMTYpICYgMHhmZikKKwkJcHJpbnRmKCJERFIwOiBTeW5kcm9tZSBmb3IgY29ycmVjdGFibGUgRUNDIGV2ZW50IDB4JXhcbiIsCisJCSAgICAgICAodmFsID4+IDE2KSAmIDB4ZmYpOworCW1mc2RyYW0oRERSMF8yMywgdmFsKTsKKwlpZiAoICh2YWwgPj4gOCkgJiAweGZmKQorCQlwcmludGYoIkREUjA6IFN5bmRyb21lIGZvciB1bmNvcnJlY3RhYmxlIEVDQyBldmVudCAweCV4XG4iLAorCQkgICAgICAgKHZhbCA+PiA4KSAmIDB4ZmYpOworCW1mc2RyYW0oRERSMF8zMywgdmFsKTsKKwlpZiAodmFsKQorCQlwcmludGYoIkREUjA6IEFkZHJlc3Mgb2YgY29tbWFuZCB0aGF0IGNhdXNlZCBhbiAiCisJCSAgICAgICAiT3V0LW9mLVJhbmdlIGludGVycnVwdCAlcFxuIiwgdmFsKTsKKwltZnNkcmFtKEREUjBfMzQsIHZhbCk7CisJaWYgKHZhbCkKKwkJcHJpbnRmKCJERFIwOiBBZGRyZXNzIG9mIHVuY29ycmVjdGFibGUgRUNDIGV2ZW50ICVwXG4iLCB2YWwpOworCW1mc2RyYW0oRERSMF8zNSwgdmFsKTsKKwlpZiAodmFsKQorCQlwcmludGYoIkREUjA6IEFkZHJlc3Mgb2YgdW5jb3JyZWN0YWJsZSBFQ0MgZXZlbnQgJXBcbiIsIHZhbCk7CisJbWZzZHJhbShERFIwXzM2LCB2YWwpOworCWlmICh2YWwpCisJCXByaW50ZigiRERSMDogRGF0YSBvZiB1bmNvcnJlY3RhYmxlIEVDQyBldmVudCAweCUwOHhcbiIsIHZhbCk7CisJbWZzZHJhbShERFIwXzM3LCB2YWwpOworCWlmICh2YWwpCisJCXByaW50ZigiRERSMDogRGF0YSBvZiB1bmNvcnJlY3RhYmxlIEVDQyBldmVudCAweCUwOHhcbiIsIHZhbCk7CisJbWZzZHJhbShERFIwXzM4LCB2YWwpOworCWlmICh2YWwpCisJCXByaW50ZigiRERSMDogQWRkcmVzcyBvZiBjb3JyZWN0YWJsZSBFQ0MgZXZlbnQgJXBcbiIsIHZhbCk7CisJbWZzZHJhbShERFIwXzM5LCB2YWwpOworCWlmICh2YWwpCisJCXByaW50ZigiRERSMDogQWRkcmVzcyBvZiBjb3JyZWN0YWJsZSBFQ0MgZXZlbnQgJXBcbiIsIHZhbCk7CisJbWZzZHJhbShERFIwXzQwLCB2YWwpOworCWlmICh2YWwpCisJCXByaW50ZigiRERSMDogRGF0YSBvZiBjb3JyZWN0YWJsZSBFQ0MgZXZlbnQgMHglMDh4XG4iLCB2YWwpOworCW1mc2RyYW0oRERSMF80MSwgdmFsKTsKKwlpZiAodmFsKQorCQlwcmludGYoIkREUjA6IERhdGEgb2YgY29ycmVjdGFibGUgRUNDIGV2ZW50IDB4JTA4eFxuIiwgdmFsKTsKKyNlbmRpZiAvKiBDT05GSUdfNDQwRVBYICovCisjZW5kaWYgLyogQ09ORklHXzQ0MCAqLwogCXNob3dfcmVncyhyZWdzKTsKIAlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOwogCXBhbmljKCJtYWNoaW5lIGNoZWNrIik7CkBAIC0xODksNyArMjk3LDcgQEAKIHZvaWQKIEFsaWdubWVudEV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0yMDQsNyArMzEyLDcgQEAKIHsKIAlsb25nIGVzcl92YWw7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKIAkJcmV0dXJuOwogI2VuZGlmCkBAIC0yMjQsNyArMzMyLDcgQEAKIH0KIAogdm9pZAotUElURXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorRGVjcmVtZW50ZXJQSVRFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJLyoKIAkgKiBSZXNldCBQSVQgaW50ZXJydXB0CkBAIC0yNDEsNyArMzQ5LDcgQEAKIHZvaWQKIFVua25vd25FeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMjU2LDcgKzM2NCw3IEBACiB7CiAJcHJpbnRmKCJEZWJ1Z2dlciB0cmFwIGF0IEAgJWx4XG4iLCByZWdzLT5uaXAgKTsKIAlzaG93X3JlZ3MocmVncyk7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQkVEQlVHKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCiAJZG9fYmVkYnVnX2JyZWFrcG9pbnQoIHJlZ3MgKTsKICNlbmRpZgogfQpAQCAtMjcyLDE3ICszODAsMTcgQEAKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCVwKIAkJIjE6CWx3eiAlMCwwKCUxKVxuIgkJXAotCQkJCQkJIgllaWVpb1xuIgkJXAotCQkJCQkJIglsaSAlMCwwXG4iCQlcCi0JCQkJCQkiMjpcbiIJCQkJXAotCQkJCQkJIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIJXAotCQkJCQkJIjM6CWxpICUwLC0xXG4iCQlcCi0JCQkJCQkiCWIgMmJcbiIJCQlcCi0JCQkJCQkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIglcCi0JCQkJCQkiCS5hbGlnbiAyXG4iCQlcCi0JCQkJCQkiCS5sb25nIDFiLDNiXG4iCQlcCi0JCQkJCQkiLnRleHQiCQkJCVwKLQkJCQkJCTogIj1yIiAocmV0dmFsKSA6ICJyIihhZGRyKSk7CisJCSIJZWllaW9cbiIJCVwKKwkJIglsaSAlMCwwXG4iCQlcCisJCSIyOlxuIgkJCQlcCisJCSIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCVwKKwkJIjM6CWxpICUwLC0xXG4iCQlcCisJCSIJYiAyYlxuIgkJCVwKKwkJIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIJXAorCQkiCS5hbGlnbiAyXG4iCQlcCisJCSIJLmxvbmcgMWIsM2JcbiIJCVwKKwkJIi50ZXh0IgkJCQlcCisJCTogIj1yIiAocmV0dmFsKSA6ICJyIihhZGRyKSk7CiAKIAlyZXR1cm4gKHJldHZhbCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NwdS9wcGM0eHgvdXNiLmMgYi9jcHUvcHBjNHh4L3VzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MzdiMzcKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvcHBjNHh4L3VzYi5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDcKKyAqIE1hcmt1cyBLbG90emJ1ZWNoZXIsIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcgPG1rQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfTkVXKSAmJiBkZWZpbmVkKENGR19VU0JfT0hDSV9DUFVfSU5JVCkKKworI2luY2x1ZGUgInVzYmRldi5oIgorCitpbnQgdXNiX2NwdV9pbml0KCkKK3sKKworI2lmIGRlZmluZWQoQ09ORklHXzQ0MEVQKSB8fCBkZWZpbmVkKENPTkZJR180NDBFUFgpCisJdXNiX2Rldl9pbml0KCk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitpbnQgdXNiX2NwdV9zdG9wKCkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYl9jcHVfaW5pdF9mYWlsKCkKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1VTQl9PSENJKSAmJiBkZWZpbmVkKENGR19VU0JfT0hDSV9DUFVfSU5JVCkgKi8KZGlmZiAtLWdpdCBhL2NwdS9wcGM0eHgvdXNiZGV2LmMgYi9jcHUvcHBjNHh4L3VzYmRldi5jCmluZGV4IDYxNDBkMmEuLjU5MjRhNmMgMTAwNjQ0Ci0tLSBhL2NwdS9wcGM0eHgvdXNiZGV2LmMKKysrIGIvY3B1L3BwYzR4eC91c2JkZXYuYwpAQCAtMyw3ICszLDcgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAKLSNpZiAoZGVmaW5lZChDT05GSUdfNDQwRVApIHx8IGRlZmluZWQoQ09ORklHXzQ0MEVQWCkpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikKKyNpZiAoZGVmaW5lZChDT05GSUdfNDQwRVApIHx8IGRlZmluZWQoQ09ORklHXzQ0MEVQWCkpICYmIGRlZmluZWQoQ09ORklHX0NNRF9VU0IpCiAKICNpbmNsdWRlIDx1c2IuaD4KICNpbmNsdWRlICJ1c2JkZXYuaCIKZGlmZiAtLWdpdCBhL2NwdS9weGEvTWFrZWZpbGUgYi9jcHUvcHhhL01ha2VmaWxlCmluZGV4IGNkZWQ3ZmYuLjhiNDM2N2UgMTAwNjQ0Ci0tLSBhL2NwdS9weGEvTWFrZWZpbGUKKysrIGIvY3B1L3B4YS9NYWtlZmlsZQpAQCAtMjYsNyArMjYsNyBAQAogTElCCT0gJChvYmopbGliJChDUFUpLmEKIAogU1RBUlQJPSBzdGFydC5vCi1DT0JKUwk9IHNlcmlhbC5vIGludGVycnVwdHMubyBjcHUubyBpMmMubyBweGFmYi5vIG1tYy5vCitDT0JKUwk9IHNlcmlhbC5vIGludGVycnVwdHMubyBjcHUubyBpMmMubyBweGFmYi5vIG1tYy5vIHVzYi5vCiAKIFNSQ1MJOj0gJChTVEFSVDoubz0uUykgJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKIE9CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlMpICQoQ09CSlMpKQpkaWZmIC0tZ2l0IGEvY3B1L3B4YS91c2IuYyBiL2NwdS9weGEvdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVmNDU3ZgotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9weGEvdXNiLmMKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogTWFya3VzIEtsb3R6YnVlY2hlciwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZyA8bWtAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9ORVcpICYmIGRlZmluZWQoQ0ZHX1VTQl9PSENJX0NQVV9JTklUKQorIyBpZiBkZWZpbmVkKENPTkZJR19DUFVfTU9OQUhBTlMpIHx8IGRlZmluZWQoQ09ORklHX1BYQTI3WCkKKworI2luY2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+CisKK2ludCB1c2JfY3B1X2luaXQoKQoreworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9NT05BSEFOUykKKwkvKiBFbmFibGUgVVNCIGhvc3QgY2xvY2suICovCisJQ0tFTkEgfD0gKENLRU5BXzJfVVNCSE9TVCB8ICBDS0VOQV8yMF9VREMpOworCXVkZWxheSgxMDApOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfUFhBMjdYKQorCS8qIEVuYWJsZSBVU0IgaG9zdCBjbG9jay4gKi8KKwlDS0VOIHw9IENLRU4xMF9VU0JIT1NUOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfTU9OQUhBTlMpCisJLyogQ29uZmlndXJlIFBvcnQgMiBmb3IgSG9zdCAoVVNCIENsaWVudCBSZWdpc3RlcnMpICovCisJVVAyT0NSID0gMHgzMDAwYzsKKyNlbmRpZgorCisJVUhDSFIgfD0gVUhDSFJfRkhSOworCXdhaXRfbXMoMTEpOworCVVIQ0hSICY9IH5VSENIUl9GSFI7CisKKwlVSENIUiB8PSBVSENIUl9GU0JJUjsKKwl3aGlsZSAoVUhDSFIgJiBVSENIUl9GU0JJUikKKwkJdWRlbGF5KDEpOworCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX01PTkFIQU5TKQorCVVIQ0hSICY9IH5VSENIUl9TU0VQMDsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1BYQTI3WCkKKwlVSENIUiAmPSB+VUhDSFJfU1NFUDI7CisjZW5kaWYKKwlVSENIUiAmPSB+VUhDSFJfU1NFUDE7CisJVUhDSFIgJj0gflVIQ0hSX1NTRTsKKworCXJldHVybiAwOworfQorCitpbnQgdXNiX2NwdV9zdG9wKCkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYl9jcHVfaW5pdF9mYWlsKCkKK3sKKwlyZXR1cm4gMDsKK30KKworIyBlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19DUFVfTU9OQUhBTlMpIHx8IGRlZmluZWQoQ09ORklHX1BYQTI3WCkgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19VU0JfT0hDSSkgJiYgZGVmaW5lZChDRkdfVVNCX09IQ0lfQ1BVX0lOSVQpICovCmRpZmYgLS1naXQgYS9kaXNrL3BhcnQuYyBiL2Rpc2svcGFydC5jCmluZGV4IGFjYzFhNzQuLjU2Yjk0MjcgMTAwNjQ0Ci0tLSBhL2Rpc2svcGFydC5jCisrKyBiL2Rpc2svcGFydC5jCkBAIC0zNCw5ICszNCw5IEBACiAjZGVmaW5lIFBSSU5URihmbXQsYXJncy4uLikKICNlbmRpZgogCi0jaWYgKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkJfHwgXAotICAgICAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TQ1NJKQl8fCBcCi0gICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikJfHwgXAorI2lmIChkZWZpbmVkKENPTkZJR19DTURfSURFKSB8fCBcCisgICAgIGRlZmluZWQoQ09ORklHX0NNRF9TQ1NJKSB8fCBcCisgICAgIGRlZmluZWQoQ09ORklHX0NNRF9VU0IpIHx8IFwKICAgICAgZGVmaW5lZChDT05GSUdfTU1DKSB8fCBcCiAgICAgIGRlZmluZWQoQ09ORklHX1NZU1RFTUFDRSkgKQogCkBAIC00NiwxMyArNDYsMTMgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYmxvY2tfZHJ2ciBibG9ja19kcnZyW10gPSB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpCiAJeyAubmFtZSA9ICJpZGUiLCAuZ2V0X2RldiA9IGlkZV9nZXRfZGV2LCB9LAogI2VuZGlmCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU0NTSSkKIAl7IC5uYW1lID0gInNjc2kiLCAuZ2V0X2RldiA9IHNjc2lfZ2V0X2RldiwgfSwKICNlbmRpZgotI2lmICgoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9VU0IpICYmIGRlZmluZWQoQ09ORklHX1VTQl9TVE9SQUdFKSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfVVNCKSAmJiBkZWZpbmVkKENPTkZJR19VU0JfU1RPUkFHRSkKIAl7IC5uYW1lID0gInVzYiIsIC5nZXRfZGV2ID0gdXNiX3N0b3JfZ2V0X2RldiwgfSwKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX01NQykKQEAgLTg2LDkgKzg2LDkgQEAKIH0KICNlbmRpZgogCi0jaWYgKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkJfHwgXAotICAgICAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TQ1NJKQl8fCBcCi0gICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikJfHwgXAorI2lmIChkZWZpbmVkKENPTkZJR19DTURfSURFKSB8fCBcCisgICAgIGRlZmluZWQoQ09ORklHX0NNRF9TQ1NJKSB8fCBcCisgICAgIGRlZmluZWQoQ09ORklHX0NNRF9VU0IpIHx8IFwKICAgICAgZGVmaW5lZChDT05GSUdfTU1DKSB8fCBcCiAgICAgIGRlZmluZWQoQ09ORklHX1NZU1RFTUFDRSkgKQogCkBAIC0xNzQsMTEgKzE3NCwxMSBAQAogCQlwdXRzICgiICAgICAgICAgICAgQ2FwYWNpdHk6IG5vdCBhdmFpbGFibGVcbiIpOwogCX0KIH0KLSNlbmRpZgkvKiBDRkdfQ01EX0lERSB8fCBDRkdfQ01EX1NDU0kgfHwgQ0ZHX0NNRF9VU0IgfHwgQ09ORklHX01NQyAqLworI2VuZGlmCiAKLSNpZiAoKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKQl8fCBcCi0gICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpCXx8IFwKLSAgICAgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfVVNCKQl8fCBcCisjaWYgKGRlZmluZWQoQ09ORklHX0NNRF9JREUpIHx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfQ01EX1NDU0kpIHx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfQ01EX1VTQikgfHwgXAogICAgICBkZWZpbmVkKENPTkZJR19NTUMpCQl8fCBcCiAgICAgIGRlZmluZWQoQ09ORklHX1NZU1RFTUFDRSkgICAgICAgICAgKQogCkBAIC0yMTksOSArMjE5LDEwIEBACiB9CiAKIAotaW50IGdldF9wYXJ0aXRpb25faW5mbyAoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MsIGludCBwYXJ0LCBkaXNrX3BhcnRpdGlvbl90ICppbmZvKQoraW50IGdldF9wYXJ0aXRpb25faW5mbyAoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MsIGludCBwYXJ0CisJCQkJCSwgZGlza19wYXJ0aXRpb25fdCAqaW5mbykKIHsKLQkJc3dpdGNoIChkZXZfZGVzYy0+cGFydF90eXBlKSB7CisJc3dpdGNoIChkZXZfZGVzYy0+cGFydF90eXBlKSB7CiAjaWZkZWYgQ09ORklHX01BQ19QQVJUSVRJT04KIAljYXNlIFBBUlRfVFlQRV9NQUM6CiAJCWlmIChnZXRfcGFydGl0aW9uX2luZm9fbWFjKGRldl9kZXNjLHBhcnQsaW5mbykgPT0gMCkgewpAQCAtMzI1LDcgKzMyNiw4IEBACiAKIAogI2Vsc2UJLyogbmVpdGhlciBNQUMgbm9yIERPUyBub3IgSVNPIHBhcnRpdGlvbiBjb25maWd1cmVkICovCi0jIGVycm9yIG5laXRoZXIgQ09ORklHX01BQ19QQVJUSVRJT04gbm9yIENPTkZJR19ET1NfUEFSVElUSU9OIG5vciBDT05GSUdfSVNPX1BBUlRJVElPTiBjb25maWd1cmVkIQorIyBlcnJvciBuZWl0aGVyIENPTkZJR19NQUNfUEFSVElUSU9OIG5vciBDT05GSUdfRE9TX1BBUlRJVElPTgorIyBlcnJvciBub3IgQ09ORklHX0lTT19QQVJUSVRJT04gY29uZmlndXJlZCEKICNlbmRpZgogCi0jZW5kaWYJLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSB8fCBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc2svcGFydF9hbWlnYS5jIGIvZGlzay9wYXJ0X2FtaWdhLmMKaW5kZXggNDFlNjhmYy4uNmMzZDc0OCAxMDA2NDQKLS0tIGEvZGlzay9wYXJ0X2FtaWdhLmMKKysrIGIvZGlzay9wYXJ0X2FtaWdhLmMKQEAgLTI2LDkgKzI2LDkgQEAKICNpbmNsdWRlIDxpZGUuaD4KICNpbmNsdWRlICJwYXJ0X2FtaWdhLmgiCiAKLSNpZiAoKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKQl8fCBcCi0gICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpCXx8IFwKLSAgICAgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfVVNCKQl8fCBcCisjaWYgKGRlZmluZWQoQ09ORklHX0NNRF9JREUpIHx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfQ01EX1NDU0kpIHx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfQ01EX1VTQikgfHwgXAogICAgICBkZWZpbmVkKENPTkZJR19NTUMpIHx8IFwKICAgICAgZGVmaW5lZChDT05GSUdfU1lTVEVNQUNFKSApICYmIGRlZmluZWQoQ09ORklHX0FNSUdBX1BBUlRJVElPTikKIApkaWZmIC0tZ2l0IGEvZGlzay9wYXJ0X2Rvcy5jIGIvZGlzay9wYXJ0X2Rvcy5jCmluZGV4IDEzM2VlNzkuLjQ3MDdmODAgMTAwNjQ0Ci0tLSBhL2Rpc2svcGFydF9kb3MuYworKysgYi9kaXNrL3BhcnRfZG9zLmMKQEAgLTM1LDkgKzM1LDkgQEAKICNpbmNsdWRlIDxpZGUuaD4KICNpbmNsdWRlICJwYXJ0X2Rvcy5oIgogCi0jaWYgKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkJfHwgXAotICAgICAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TQ1NJKQl8fCBcCi0gICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikJfHwgXAorI2lmIChkZWZpbmVkKENPTkZJR19DTURfSURFKSB8fCBcCisgICAgIGRlZmluZWQoQ09ORklHX0NNRF9TQ1NJKSB8fCBcCisgICAgIGRlZmluZWQoQ09ORklHX0NNRF9VU0IpIHx8IFwKICAgICAgZGVmaW5lZChDT05GSUdfTU1DKSB8fCBcCiAgICAgIGRlZmluZWQoQ09ORklHX1NZU1RFTUFDRSkgKSAmJiBkZWZpbmVkKENPTkZJR19ET1NfUEFSVElUSU9OKQogCkBAIC0yNDgsNCArMjQ4LDQgQEAKIH0KIAogCi0jZW5kaWYJLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSAmJiBDT05GSUdfRE9TX1BBUlRJVElPTiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9kaXNrL3BhcnRfaXNvLmMgYi9kaXNrL3BhcnRfaXNvLmMKaW5kZXggMDczNTMyNC4uMDZkZDc1ZSAxMDA2NDQKLS0tIGEvZGlzay9wYXJ0X2lzby5jCisrKyBiL2Rpc2svcGFydF9pc28uYwpAQCAtMjUsOSArMjUsOSBAQAogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlICJwYXJ0X2lzby5oIgogCi0jaWYgKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkJfHwgXAotICAgICAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TQ1NJKQl8fCBcCi0gICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikJfHwgXAorI2lmIChkZWZpbmVkKENPTkZJR19DTURfSURFKSB8fCBcCisgICAgIGRlZmluZWQoQ09ORklHX0NNRF9TQ1NJKSB8fCBcCisgICAgIGRlZmluZWQoQ09ORklHX0NNRF9VU0IpIHx8IFwKICAgICAgZGVmaW5lZChDT05GSUdfTU1DKSB8fCBcCiAgICAgIGRlZmluZWQoQ09ORklHX1NZU1RFTUFDRSkgKSAmJiBkZWZpbmVkKENPTkZJR19JU09fUEFSVElUSU9OKQogCkBAIC0yNTcsNCArMjU3LDQgQEAKIAlyZXR1cm4oZ2V0X3BhcnRpdGlvbl9pbmZvX2lzb192ZXJiKGRldl9kZXNjLDAsJmluZm8sMCkpOwogfQogCi0jZW5kaWYgLyogKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkpICYmIGRlZmluZWQoQ09ORklHX0lTT19QQVJUSVRJT04pICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2Rpc2svcGFydF9tYWMuYyBiL2Rpc2svcGFydF9tYWMuYwppbmRleCA4YzIzZTIxLi5kMzAzYTczIDEwMDY0NAotLS0gYS9kaXNrL3BhcnRfbWFjLmMKKysrIGIvZGlzay9wYXJ0X21hYy5jCkBAIC0zNCw5ICszNCw5IEBACiAjaW5jbHVkZSA8aWRlLmg+CiAjaW5jbHVkZSAicGFydF9tYWMuaCIKIAotI2lmICgoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCXx8IFwKLSAgICAgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkJfHwgXAotICAgICAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9VU0IpCXx8IFwKKyNpZiAoZGVmaW5lZChDT05GSUdfQ01EX0lERSkgfHwgXAorICAgICBkZWZpbmVkKENPTkZJR19DTURfU0NTSSkgfHwgXAorICAgICBkZWZpbmVkKENPTkZJR19DTURfVVNCKSB8fCBcCiAgICAgIGRlZmluZWQoQ09ORklHX01NQykgfHwgXAogICAgICBkZWZpbmVkKENPTkZJR19TWVNURU1BQ0UpICkgJiYgZGVmaW5lZChDT05GSUdfTUFDX1BBUlRJVElPTikKIApAQCAtMjUxLDQgKzI1MSw0IEBACiAJcmV0dXJuICgwKTsKIH0KIAotI2VuZGlmCS8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkgJiYgQ09ORklHX01BQ19QQVJUSVRJT04gKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZG9jL1JFQURNRS5KRkZTMiBiL2RvYy9SRUFETUUuSkZGUzIKaW5kZXggMjcwZGE5MC4uYzVkNjdmZCAxMDA2NDQKLS0tIGEvZG9jL1JFQURNRS5KRkZTMgorKysgYi9kb2MvUkVBRE1FLkpGRlMyCkBAIC0yLDcgKzIsNyBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogSkZGUzIgaW4gVS1Cb290IGlzIGEgcmVhZCBvbmx5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBmaWxlIHN5c3RlbSBpbgotTGludXggd2l0aCB0aGUgc2FtZSBuYW1lLiBUbyB1c2UgSkZGUzIgZGVmaW5lIENGR19DTURfSkZGUzIuCitMaW51eCB3aXRoIHRoZSBzYW1lIG5hbWUuIFRvIHVzZSBKRkZTMiBkZWZpbmUgQ09ORklHX0NNRF9KRkZTMi4KIAogVGhlIG1vZHVsZSBhZGRzIHRocmVlIG5ldyBjb21tYW5kcy4KIGZzbG9hZCAgLSBsb2FkIGJpbmFyeSBmaWxlIGZyb20gYSBmaWxlIHN5c3RlbSBpbWFnZQpkaWZmIC0tZ2l0IGEvZG9jL1JFQURNRS5QSVA0MDUgYi9kb2MvUkVBRE1FLlBJUDQwNQppbmRleCBjNWNjZjE4Li42MTBmZjIxIDEwMDY0NAotLS0gYS9kb2MvUkVBRE1FLlBJUDQwNQorKysgYi9kb2MvUkVBRE1FLlBJUDQwNQpAQCAtMzIsMTAgKzMyLDggQEAKIC0gaW5jbHVkZS9jbWRfYnNwLmgJCWFkZGVkIFBJUDQwNSBjb21tYW5kcyBkZWZpbml0aW9ucwogLSBpbmNsdWRlL2NtZF9jb25kZWZzLmgJCWFkZGVkIEZsb3BweSBhbmQgU0NTSSBzdXBwb3J0CiAtIGluY2x1ZGUvY21kX2Rpc2suaAkJY2hhbmdlZCB0byB3b3JrIHdpdGggYmxvY2sgZGV2aWNlIGRlc2NyaXB0aW9uCi0tIGluY2x1ZGUvY29uZmlnX0xBTlRFQy5oCWV4Y2x1ZGVkIENGR19DTURfRkRDIGFuZCBDRkdfQ01EX1NDU0kgZnJvbQotCQkJCUNPTkZJR19DTURfRlVMTAotLSBpbmNsdWRlL2NvbmZpZ19oeW1vZC5oCWV4Y2x1ZGVkIENGR19DTURfRkRDIGFuZCBDRkdfQ01EX1NDU0kgZnJvbQotCQkJCUNPTkZJR19DTURfRlVMTAorLSBpbmNsdWRlL2NvbmZpZ19MQU5URUMuaAlleGNsdWRlZCBDT05GSUdfQ01EX0ZEQyBhbmQgQ09ORklHX0NNRF9TQ1NJCistIGluY2x1ZGUvY29uZmlnX2h5bW9kLmgJZXhjbHVkZWQgQ09ORklHX0NNRF9GREMgYW5kIENPTkZJR19DTURfU0NTSQogLSBpbmNsdWRlL2ZsYXNoLmgJCWFkZGVkIElOVEVMX0lEXzI4RjMyMEMzVCAgMHg4OEM0ODhDNAogLSBpbmNsdWRlL2kyYy5oCQkJYWRkZWQgImRlZmluZWQoQ09ORklHX1BJUDQwNSkiCiAtIGluY2x1ZGUvaW1hZ2UuaAkJYWRkZWQgSUhfT1NfVV9CT09ULCBJSF9UWVBFX0ZJUk1XQVJFCkBAIC04OCw4ICs4Niw4IEBACiAKIE5ldyBDb21tYW5kczoKIC0tLS0tLS0tLS0tLS0KLUNGR19DTURfU0NTSQlTQ1NJIFN1cHBvcnQKLUNGR19DTUZfRkRDCUZsb3BweSBkaXNrIHN1cHBvcnQKK0NPTkZJR19DTURfU0NTSQlTQ1NJIFN1cHBvcnQKK0NPTkZJR19DTUZfRkRDCUZsb3BweSBkaXNrIHN1cHBvcnQKIAogSURFIGFkZGl0aW9uczoKIC0tLS0tLS0tLS0tLS0tCkBAIC0xNzIsOCArMTcwLDggQEAKIEZsb3BweSBzdXBwb3J0OgogLS0tLS0tLS0tLS0tLS0tCiBTdXBwb3J0IG9mIGEgc3RhbmRhcmQgZmxvcHB5IGRpc2sgY29udHJvbGxlciBhdCBhZGRyZXNzIENGR19JU0FfSU9fQkFTRV9BRERSRVNTCi0rIDB4M0YwLiBFbmFibGVkIHdpdGggZGVmaW5lIENGR19DTURfRkRDLiBSZWFkcyBhIHVuZm9ybWF0ZWQgZmxvcHB5IGRpc2sgd2l0aCBhCi1pbWFnZSBoZWFkZXIgKHNlZTogbWtpbWFnZSkuIE5vIGludGVycnVwdHMgYW5kIG5vIERNQSBhcmUgdXNlZCBmb3IgdGhpcy4KKysgMHgzRjAuIEVuYWJsZWQgd2l0aCBkZWZpbmUgQ09ORklHX0NNRF9GREMuIFJlYWRzIGEgdW5mb3JtYXRlZCBmbG9wcHkgZGlzaword2l0aCBhIGltYWdlIGhlYWRlciAoc2VlOiBta2ltYWdlKS4gTm8gaW50ZXJydXB0cyBhbmQgbm8gRE1BIGFyZSB1c2VkIGZvciB0aGlzLgogQWRkZWQgZmlsZXM6CiAtIGNvbW1vbi9jbWRfZmRjLmMKIC0gaW5jbHVkZS9jbWRfZmRjLmgKZGlmZiAtLWdpdCBhL2RvYy9SRUFETUUuU05UUCBiL2RvYy9SRUFETUUuU05UUAppbmRleCBmZDZmMjA5Li45ZWRjOTU3IDEwMDY0NAotLS0gYS9kb2MvUkVBRE1FLlNOVFAKKysrIGIvZG9jL1JFQURNRS5TTlRQCkBAIC0xLDUgKzEsNSBAQAotVG8gdXNlIFNOVFAgc3VwcG9ydCwgYWRkIGEgZGVmaW5lIENGR19DTURfU05UUCB0byBDT05GSUdfQ09NTUFORFMgaW4KLXRoZSBjb25maWd1cmF0aW9uIGZpbGUgb2YgdGhlIGJvYXJkLgorVG8gdXNlIFNOVFAgc3VwcG9ydCwgYWRkIGRlZmluZSBDT05GSUdfQ01EX1NOVFAgdG8gdGhlCitjb25maWd1cmF0aW9uIGZpbGUgb2YgdGhlIGJvYXJkLgogCiBUaGUgInNudHAiIGNvbW1hbmQgZ2V0cyBuZXR3b3JrIHRpbWUgZnJvbSBOVFAgdGltZSBzZXJ2ZXIgYW5kCiBzeW5jcm9uaXplIFJUQyBvZiB0aGUgYm9hcmQuIFRoaXMgY29tbWFuZCBuZWVkcyB0aGUgY29tbWFuZCBsaW5lCmRpZmYgLS1naXQgYS9kb2MvUkVBRE1FLmJlZGJ1ZyBiL2RvYy9SRUFETUUuYmVkYnVnCmluZGV4IDljZmI0MjEuLjI2MTZhY2MgMTAwNjQ0Ci0tLSBhL2RvYy9SRUFETUUuYmVkYnVnCisrKyBiL2RvYy9SRUFETUUuYmVkYnVnCkBAIC0zMSwxMiArMzEsNiBAQAogCWlmIGl0IGlzIGFuIGlsbGVnYWwgaW5zdHJ1Y3Rpb24sIHByaXZpbGVnZWQgaW5zdHJ1Y3Rpb24gb3IKIAlhIHRyYXAuIEFsc28gYWRkZWQgZGVidWcgdHJhcCBoYW5kbGVyLgogCi0uL2luY2x1ZGUvY21kX2NvbmZkZWZzLmgKLQlBZGRlZCBkZWZpbml0aW9uIG9mIENGR19DTURfQkVEQlVHLgotCi0uL2luY2x1ZGUvY29uZmlnX1dBTE5VVDQwNS5oCi0JQWRkZWQgQ0ZHX0NNRF9CRURCVUcgdG8gdGhlIENPTkZJR19DT01NQU5EUyBmb3IgdGhlIFdBTE5VVC4KLQogLi9pbmNsdWRlL3BwY19hc20udG1wbAogCUFkZGVkIGNvZGUgdG8gaGFuZGxlIGNyaXRpY2FsIGV4Y2VwdGlvbnMKIApAQCAtNzgsMTAgKzcyLDYgQEAKIAljcHUvbXBjOHh4L3RyYXBzLmMKIAkJQWRkZWQgbmV3IHJvdXRpbmUgRGVidWdFeGNlcHRpb24oKQogCi0JaW5jbHVkZS9jb25maWdfTUJYLmgKLQkJQWRkZWQgQ0ZHX0NNRF9CRURCVUcgdG8gQ09ORklHX0NPTU1BTkRTIGRlZmluZQotCi0KIE5ldyBGaWxlczoKIAogCWNwdS9tcGM4eHgvYmVkYnVnXzg2MC5jCmRpZmYgLS1naXQgYS9kb2MvUkVBRE1FLmdlbmVyaWNfdXNiX29oY2kgYi9kb2MvUkVBRE1FLmdlbmVyaWNfdXNiX29oY2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk0ZGQxZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9SRUFETUUuZ2VuZXJpY191c2Jfb2hjaQpAQCAtMCwwICsxLDU3IEBACitOb3RlcyBvbiB0aGUgdGhlIGdlbmVyaWMgVVNCLU9IQ0kgZHJpdmVyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZHJpdmVyIChkcml2ZXJzL3VzYl9vaGNpLltjaF0pIGlzIHRoZSByZXN1bHQgb2YgdGhlIG1lcmdlIG9mCit2YXJpb3VzIGV4aXN0aW5nIE9IQ0kgZHJpdmVycyB0aGF0IHdlcmUgYmFzaWNhbGx5IGlkZW50aWNhbCBiZXNpZGUKK2NwdS9ib2FyZCBkZXBlbmRhbnQgaW5pdGFsaXphdGlvbi4gVGhpcyBpbml0YWxpemF0aW9uIGhhcyBiZWVuIG1vdmVkCitpbnRvIGNwdS9ib2FyZCBkaXJlY3RvcmllcyBhbmQgYXJlIGNhbGxlZCB2aWEgdGhlIGhvb2tzIGJlbG93LgorCitDb25maWd1cmF0aW9uIG9wdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCUNPTkZJR19VU0JfT0hDSV9ORVc6IGVuYWJsZSB0aGUgbmV3IE9IQ0kgZHJpdmVyCisKKwlDRkdfVVNCX09IQ0lfQk9BUkRfSU5JVDogY2FsbCB0aGUgYm9hcmQgZGVwZW5kYW50IGhvb2tzOgorCisJCSAgLSBleHRlcm4gaW50IHVzYl9ib2FyZF9pbml0KHZvaWQpOworCQkgIC0gZXh0ZXJuIGludCB1c2JfYm9hcmRfc3RvcCh2b2lkKTsKKwkJICAtIGV4dGVybiBpbnQgdXNiX2NwdV9pbml0X2ZhaWwodm9pZCk7CisKKwlDRkdfVVNCX09IQ0lfQ1BVX0lOSVQ6IGNhbGwgdGhlIGNwdSBkZXBlbmRhbnQgaG9va3M6CisKKwkJICAtIGV4dGVybiBpbnQgdXNiX2NwdV9pbml0KHZvaWQpOworCQkgIC0gZXh0ZXJuIGludCB1c2JfY3B1X3N0b3Aodm9pZCk7CisJCSAgLSBleHRlcm4gaW50IHVzYl9jcHVfaW5pdF9mYWlsKHZvaWQpOworCisJQ0ZHX1VTQl9PSENJX1JFR1NfQkFTRTogZGVmaW5lcyB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBPSENJCisJCQkJcmVnaXN0ZXJzCisKKwlDRkdfVVNCX09IQ0lfU0xPVF9OQU1FOiBzbG90IG5hbWUKKworCUNGR19VU0JfT0hDSV9NQVhfUk9PVF9QT1JUUzogbWF4aW1hbCBudW1iZXIgb2YgcG9ydHMgb2YgdGhlCisJCQkJICAgICByb290IGh1Yi4KKworCitFbmRpYW5uZXNzIGlzc3VlcworLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBVU0IgYnVzIG9wZXJhdGVzIGluIGxpdHRsZSBlbmRpYW4sIGJ1dCB1bmZvcnR1bmF0ZWx5IHRoZXJlIGFyZQorT0hDSSBjb250cm9sbGVycyB0aGF0IG9wZXJhdGUgaW4gYmlnIGVuZGlhbiBzdWNoIGFzIHBwYzR4eCBhbmQKK21wYzV4eHguIEZvciB0aGVzZSB0aGUgY29uZmlnIG9wdGlvbgorCisJQ0ZHX09IQ0lfQkVfQ09OVFJPTExFUgorCituZWVkcyB0byBiZSBkZWZpbmVkLgorCisKK1BDSSBDb250cm9sbGVycworLS0tLS0tLS0tLS0tLS0tLQorCitZb3UnbGwgbmVlZCB0byBkZWZpbmUKKworCUNPTkZJR19QQ0lfT0hDSQorCitQQ0kgQ29udHJvbGxlcnMgbmVlZCB0byBkbyBieXRlIHN3YXBwaW5nIG9uIHJlZ2lzdGVyIGFjY2Vzc2VzLCBzbyB0aGV5CitzaG91bGQgdG8gZGVmaW5lOgorCisJQ0ZHX09IQ0lfU1dBUF9SRUdfQUNDRVNTCmRpZmYgLS1naXQgYS9kb2MvUkVBRE1FLm1wYzgzMjNlcmRiIGIvZG9jL1JFQURNRS5tcGM4MzIzZXJkYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Zjg5ODI5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL1JFQURNRS5tcGM4MzIzZXJkYgpAQCAtMCwwICsxLDcxIEBACitGcmVlc2NhbGUgTVBDODMyM0VSREIgQm9hcmQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzEuCU1lbW9yeSBNYXAKKwlUaGUgbWVtb3J5IG1hcCBsb29rcyBsaWtlIHRoaXM6CisKKwkweDAwMDBfMDAwMAkweDAzZmZfZmZmZglERFIJCSA2NE0KKwkweDgwMDBfMDAwMAkweDhmZmZfZmZmZglQQ0kgTUVNCQkgMjU2TQorCTB4OTAwMF8wMDAwCTB4OWZmZl9mZmZmCVBDSV9NTUlPCSAyNTZNCisJMHhlMDAwXzAwMDAJMHhlMDBmX2ZmZmYJSU1NUgkJIDFNCisJMHhkMDAwXzAwMDAJMHhkM2ZmX2ZmZmYJUENJIElPCQkgNjRNCisJMHhmZTAwXzAwMDAJMHhmZWZmX2ZmZmYJTk9SIEZMQVNIIChDUzApCSAxNk0KKworMi4JQ29tcGlsYXRpb24KKworCUFzc3VtaW5nIHlvdSdyZSB1c2luZyBCQVNIIChvciBzaW1pbGFyKSBhcyB5b3VyIHNoZWxsOgorCisJZXhwb3J0IENST1NTX0NPTVBJTEU9eW91ci1jcm9zcy1jb21waWxlci1wcmVmaXgtCisJbWFrZSBkaXN0Y2xlYW4KKwltYWtlIE1QQzgzMjNFUkRCX2NvbmZpZworCW1ha2UKKworMy4JRG93bmxvYWRpbmcgYW5kIEZsYXNoaW5nIEltYWdlcworCiszLjEJUmVmbGFzaCBVLWJvb3QgSW1hZ2UgdXNpbmcgVS1ib290CisKKwlOLmIsIGhhdmUgYW4gYWx0ZXJuYXRlIG1lYW5zIG9mIHByb2dyYW1taW5nCisJdGhlIGZsYXNoIGF2YWlsYWJsZSBpZiB0aGUgbmV3IHUtYm9vdCBkb2Vzbid0IGJvb3QuCisKKwlGaXJzdCB0cnkgYToKKworCXRmdHBib290ICRsb2FkYWRkciAkdWJvb3QKKworCXRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBURlRQIGxvYWQgd2lsbCBzdWNjZWVkIGJlZm9yZQorCWFuIGVyYXNlIGdvZXMgYWhlYWQgYW5kIHdpcGVzIG91dCB5b3VyIGN1cnJlbnQgZmlybXdhcmUuCisJVGhlbiBkbyBhOgorCisJcnVuIHRmdHBmbGFzaAorCisJd2hpY2ggaXMgYSBzaG9ydGVyIHZlcnNpb24gb2YgdGhlIG1hbnVhbCBzZXF1ZW5jZToKKworCXRmdHAgJGxvYWRhZGRyIHUtYm9vdC5iaW4KKwlwcm90ZWN0IG9mZiBmZTAwMDAwMCArJGZpbGVzaXplCisJZXJhc2UgZmUwMDAwMDAgKyRmaWxlc2l6ZQorCWNwLmIgJGxvYWRhZGRyIGZlMDAwMDAwICRmaWxlc2l6ZQorCisJVG8ga2VlcCB5b3VyIG9sZCB1LWJvb3QncyBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIGRvIGE6CisKKwlzYXZlZW52CisKKwlwcmlvciB0byByZXNldHRpbmcgdGhlIGJvYXJkLgorCiszLjIJRG93bmxvYWRpbmcgYW5kIEJvb3RpbmcgTGludXggS2VybmVsCisKKwlFbnN1cmUgdGhhdCBhbGwgbmV0d29ya2luZy1yZWxhdGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0CisJcHJvcGVybHkgKGluY2x1ZGluZyBpcGFkZHIsIHNlcnZlcmlwLCBnYXRld2F5aXAgKGlmIG5lZWRlZCksCisJbmV0bWFzaywgZXRoYWRkciwgZXRoMWFkZHIsIHJvb3RwYXRoIChpZiB1c2luZyBORlMgcm9vdCksCisJZmR0ZmlsZSwgYW5kIGJvb3RmaWxlKS4KKworCVRoZW4sIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nLCBkZXBlbmRpbmcgb24gd2hldGhlciB5b3UKKwl3YW50IGFuIE5GUyByb290IG9yIGEgcmFtZGlzayByb290OgorCisJcnVuIG5mc2Jvb3QKKworCW9yCisKKwlydW4gcmFtYm9vdAorCis0CU5vdGVzCisKKwlUaGUgY29uc29sZSBiYXVkcmF0ZSBmb3IgTVBDODMyM0VSREIgaXMgMTE1MjAwYnBzLgpkaWZmIC0tZ2l0IGEvZG9jL1JFQURNRS5tcGM4MzQ5ZW1kcy5kZHJlY2MgYi9kb2MvUkVBRE1FLm1wYzgzNDllbWRzLmRkcmVjYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIyNDljMy4uMDAwMDAwMAotLS0gYS9kb2MvUkVBRE1FLm1wYzgzNDllbWRzLmRkcmVjYworKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi1PdmVydmlldwotPT09PT09PT0KLQotVGhlIG92ZXJhbGwgdXNhZ2UgcGF0dGVybiBmb3IgRUNDIGRpYWdub3N0aWMgY29tbWFuZHMgaXMgdGhlIGZvbGxvd2luZzoKLQotICAqIChpbmplY3RpbmcgZXJyb3JzIGlzIGluaXRpYWxseSBkaXNhYmxlZCkKLQotICAqIGRlZmluZSBpbmplY3QgbWFzayAod2hpY2ggdGVsbHMgdGhlIEREUiBjb250cm9sbGVyIHdoYXQgdHlwZSBvZiBlcnJvcnMKLSAgICB3ZSdsbCBiZSBpbmplY3Rpbmc6IHNpbmdsZS9tdWx0aXBsZSBiaXQgZXRjLikKLQotICAqIGVuYWJsZSBpbmplY3RpbmcgZXJyb3JzIC0gZnJvbSBub3cgb24gdGhlIGNvbnRyb2xsZXIgaW5qZWN0cyBlcnJvcnMgYXMKLSAgICBpbmRpY2F0ZWQgaW4gdGhlIGluamVjdCBtYXNrCi0KLUlNUE9SVEFOVCBOT1RJQ0U6IGVuYWJsaW5nIGluamVjdGluZyBtdWx0aXBsZS1iaXQgZXJyb3JzIGlzIHBvdGVudGlhbGx5Ci1kYW5nZXJvdXMgYXMgc3VjaCBlcnJvcnMgYXJlIE5PVCBjb3JyZWN0ZWQgYnkgdGhlIGNvbnRyb2xsZXIuIFRoZXJlZm9yZSBjYXV0aW9uCi1zaG91bGQgYmUgdGFrZW4gd2hlbiBlbmFibGluZyB0aGUgaW5qZWN0aW9uIG9mIG11bHRpcGxlLWJpdCBlcnJvcnM6IGl0IGlzIG9ubHkKLXNhZmUgd2hlbiB1c2VkIG9uIGEgY2FyZWZ1bGx5IHNlbGVjdGVkIG1lbW9yeSBhcmVhIGFuZCB1c2VkIHVuZGVyIGNvbnRyb2wgb2YKLXRoZSAnZWNjIHRlc3QnIGNvbW1hbmQgKHNlZSBleGFtcGxlICdJbmplY3RpbmcgTXVsdGlwbGUtQml0IEVycm9ycycgYmVsb3cpLiBJbgotcGFydGljdWxhciwgd2hlbiB5b3Ugc2ltcGx5IHNldCB0aGUgbXVsdGlwbGUtYml0IGVycm9ycyBpbiBpbmplY3QgbWFzayBhbmQKLWVuYWJsZSBpbmplY3Rpb24sIFUtQm9vdCBpcyB2ZXJ5IGxpa2VseSB0byBoYW5nIHF1aWNrbHkgYXMgdGhlIGVycm9ycyB3aWxsIGJlCi1pbmplY3RlZCB3aGVuIGl0IGFjY2Vzc2VzIGl0cyBjb2RlLCBkYXRhIGV0Yy4KLQotCi1Vc2UgY2FzZXMgZm9yIEREUiAnZWNjJyBjb21tYW5kOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQmVmb3JlIGV4ZWN1dGluZyBwYXJ0aWN1bGFyIHRlc3RzIHJlc2V0IHRhcmdldCBib2FyZCBvciBjbGVhciBzdGF0dXMgcmVnaXN0ZXJzOgotCi09PiBlY2MgY2FwdHVyZWNsZWFyCi09PiBlY2MgZXJyZGV0ZWN0Y2xyIGFsbAotPT4gZWNjIHNiZWNudCAwCi0KLQotSW5qZWN0aW5nIFNpbmdsZS1CaXQgRXJyb3JzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotMS4gU2V0IDEgYml0IGluIERhdGEgUGF0aCBFcnJvciBJbmplY3QgTWFzawotCi09PiBlY2MgaW5qZWN0ZGF0YWhpIDEKLQotMi4gUnVuIHRlc3Qgb3ZlciBzb21lIG1lbW9yeSByZWdpb24KLQotPT4gZWNjIHRlc3QgMjAwMDAwIDEwCi0KLTMuIENoZWNrIEVDQyBzdGF0dXMKLQotPT4gZWNjIHN0YXR1cwotLi4uCi1NZW1vcnkgRGF0YSBQYXRoIEVycm9yIEluamVjdGlvbiBNYXNrIEhpZ2gvTG93OiAwMDAwMDAwMSAwMDAwMDAwMAotLi4uCi1NZW1vcnkgU2luZ2xlLUJpdCBFcnJvciBNYW5hZ2VtZW50ICgwLi4yNTUpOgotICBTaW5nbGUtQml0IEVycm9yIFRocmVzaG9sZDogMjU1Ci0gIFNpbmdsZSBCaXQgRXJyb3IgQ291bnRlcjogMTYKLS4uLgotTWVtb3J5IEVycm9yIERldGVjdDoKLSAgTXVsdGlwbGUgTWVtb3J5IEVycm9yczogMAotICBNdWx0aXBsZS1CaXQgRXJyb3I6IDAKLSAgU2luZ2xlLUJpdCBFcnJvcjogMAotLi4uCi0KLTE2IGVycm9ycyB3ZXJlIGdlbmVyYXRlZCwgU2luZ2xlLUJpdCBFcnJvciBmbGFnIHdhcyBub3Qgc2V0IGFzIFNpbmdsZSBCaXQgRXJyb3IKLUNvdW50ZXIgZGlkIG5vdCByZWFjaCAgU2luZ2xlLUJpdCBFcnJvciBUaHJlc2hvbGQuCi0KLTQuIE1ha2Ugc3VyZSB1c2VkIG1lbW9yeSByZWdpb24gZ290IHJlLWluaXRpYWxpemVkIHdpdGggMHhjYWZlY2FmZSBwYXR0ZXJuCi0KLT0+IG1kIDIwMDAwMAotMDAyMDAwMDA6IGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlICAgIC4uLi4uLi4uLi4uLi4uLi4KLTAwMjAwMDEwOiBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSAgICAuLi4uLi4uLi4uLi4uLi4uCi0wMDIwMDAyMDogY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgICAgLi4uLi4uLi4uLi4uLi4uLgotMDAyMDAwMzA6IGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlICAgIC4uLi4uLi4uLi4uLi4uLi4KLTAwMjAwMDQwOiBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSAgICAuLi4uLi4uLi4uLi4uLi4uCi0wMDIwMDA1MDogY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgICAgLi4uLi4uLi4uLi4uLi4uLgotMDAyMDAwNjA6IGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlICAgIC4uLi4uLi4uLi4uLi4uLi4KLTAwMjAwMDcwOiBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSAgICAuLi4uLi4uLi4uLi4uLi4uCi0wMDIwMDA4MDogZGVhZGJlZWYgZGVhZGJlZWYgZGVhZGJlZWYgZGVhZGJlZWYgICAgLi4uLi4uLi4uLi4uLi4uLgotMDAyMDAwOTA6IGRlYWRiZWVmIGRlYWRiZWVmIGRlYWRiZWVmIGRlYWRiZWVmICAgIC4uLi4uLi4uLi4uLi4uLi4KLQotCi1JbmplY3RpbmcgTXVsdGlwbGUtQml0IEVycm9ycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotMS4gU2V0IG1vcmUgdGhhbiAxIGJpdCBpbiBEYXRhIFBhdGggRXJyb3IgSW5qZWN0IE1hc2sKLQotPT4gZWNjIGluamVjdGRhdGFoaSA1Ci0KLTIuIFJ1biB0ZXN0IG92ZXIgc29tZSBtZW1vcnkgcmVnaW9uCi0KLT0+IGVjYyB0ZXN0IDIwMDAwMCAxMAotCi0zLiBDaGVjayBFQ0Mgc3RhdHVzCi0KLT0+IGVjYyBzdGF0dXMKLS4uLgotTWVtb3J5IERhdGEgUGF0aCBFcnJvciBJbmplY3Rpb24gTWFzayBIaWdoL0xvdzogMDAwMDAwMDUgMDAwMDAwMDAKLS4uLgotTWVtb3J5IEVycm9yIERldGVjdDoKLSAgTXVsdGlwbGUgTWVtb3J5IEVycm9yczogMQotICBNdWx0aXBsZS1CaXQgRXJyb3I6IDEKLSAgU2luZ2xlLUJpdCBFcnJvcjogMAotLi4uCi0KLU9ic2VydmUgdGhhdCBib3RoIE11bHRpcGxlIE1lbW9yeSBFcnJvcnMgYW5kIE11bHRpcGxlLUJpdCBFcnJvciBmbGFncyBhcmUgc2V0LgotCi00LiBNYWtlIHN1cmUgdXNlZCBtZW1vcnkgcmVnaW9uIGdvdCByZS1pbml0aWFsaXplZCB3aXRoIDB4Y2FmZWNhZmUgcGF0dGVybgotCi09PiBtZCAyMDAwMDAKLTAwMjAwMDAwOiBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSAgICAuLi4uLi4uLi4uLi4uLi4uCi0wMDIwMDAxMDogY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgICAgLi4uLi4uLi4uLi4uLi4uLgotMDAyMDAwMjA6IGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlICAgIC4uLi4uLi4uLi4uLi4uLi4KLTAwMjAwMDMwOiBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSAgICAuLi4uLi4uLi4uLi4uLi4uCi0wMDIwMDA0MDogY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgICAgLi4uLi4uLi4uLi4uLi4uLgotMDAyMDAwNTA6IGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlIGNhZmVjYWZlICAgIC4uLi4uLi4uLi4uLi4uLi4KLTAwMjAwMDYwOiBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSBjYWZlY2FmZSAgICAuLi4uLi4uLi4uLi4uLi4uCi0wMDIwMDA3MDogY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgY2FmZWNhZmUgICAgLi4uLi4uLi4uLi4uLi4uLgotMDAyMDAwODA6IGRlYWRiZWVmIGRlYWRiZWVmIGRlYWRiZWVmIGRlYWRiZWVmICAgIC4uLi4uLi4uLi4uLi4uLi4KLTAwMjAwMDkwOiBkZWFkYmVlZiBkZWFkYmVlZiBkZWFkYmVlZiBkZWFkYmVlZiAgICAuLi4uLi4uLi4uLi4uLi4uCi0KLQotVGVzdCBTaW5nbGUtQml0IEVycm9yIENvdW50ZXIgYW5kIFRocmVzaG9sZAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0xLiBTZXQgMSBiaXQgaW4gRGF0YSBQYXRoIEVycm9yIEluamVjdCBNYXNrCi0KLT0+IGVjYyBpbmplY3RkYXRhaGkgMQotCi0yLiBFbmFibGUgZXJyb3IgaW5qZWN0aW9uCi0KLT0+IGVjYyBpbmplY3QgZW4KLQotMy4gTGV0IHUtYm9vdCBydW4gZm9yIGEgd2l0aCBTaW5nbGUtQml0IGVycm9yIGluamVjdGlvbiBlbmFibGVkCi0KLTQuIERpc2FibGUgZXJyb3IgaW5qZWN0aW9uCi0KLT0+IGVjYyBpbmplY3QgZGlzCi0KLTQuIENoZWNrIHN0YXR1cwotCi09PiBlY2Mgc3RhdHVzCi0KLS4uLgotTWVtb3J5IFNpbmdsZS1CaXQgRXJyb3IgTWFuYWdlbWVudCAoMC4uMjU1KToKLSAgU2luZ2xlLUJpdCBFcnJvciBUaHJlc2hvbGQ6IDI1NQotICBTaW5nbGUgQml0IEVycm9yIENvdW50ZXI6IDYwCi0KLU1lbW9yeSBFcnJvciBEZXRlY3Q6Ci0gIE11bHRpcGxlIE1lbW9yeSBFcnJvcnM6IDEKLSAgTXVsdGlwbGUtQml0IEVycm9yOiAwCi0gIFNpbmdsZS1CaXQgRXJyb3I6IDEKLS4uLgotCi1PYnNlcnZlIHRoYXQgU2luZ2xlLUJpdCBFcnJvciBpcyAnb24nIHdoaWNoIG1lYW5zIHRoYXQgU2luZ2xlLUJpdCBFcnJvciBDb3VudGVyCi1yZWFjaGVkIFNpbmdsZS1CaXQgRXJyb3IgVGhyZXNob2xkLiBNdWx0aXBsZSBNZW1vcnkgRXJyb3JzIGJpdCBpcyBhbHNvICdvbicsIHRoYXQKLWlzIENvdW50ZXIgcmVhY2hlZCBUaHJlc2hvbGQgbW9yZSB0aGFuIG9uZSB0aW1lIChpdCB3cmFwcyBiYWNrIGFmdGVyIHJlYWNoaW5nCi1UaHJlc2hvbGQpLgpkaWZmIC0tZ2l0IGEvZG9jL1JFQURNRS5tcGM4MzYwZW1kcyBiL2RvYy9SRUFETUUubXBjODM2MGVtZHMKaW5kZXggYzg3NDY5Zi4uNWYyMDI0NyAxMDA2NDQKLS0tIGEvZG9jL1JFQURNRS5tcGM4MzYwZW1kcworKysgYi9kb2MvUkVBRE1FLm1wYzgzNjBlbWRzCkBAIC0yMSw3ICsyMSwxMyBAQAogCVNXM1sxOjhdPSAwMDAwXzAwMDEgcmVmZXJzIHRvIGJpdHMgbGFiZWxlZCAxIHRocm91Z2ggNiBpcyBzZXQgYXMgIk9uIgogCQlhbmQgYml0cyBsYWJlbGVkIDggaXMgc2V0IGFzICJPZmYiLgogCi0xLjEJRm9yIHRoZSBNUEM4MzYwRSBQQiBQUk9UTyBCb2FyZAorMS4xCVRoZXJlIGFyZSB0aHJlZSB0eXBlIGJvYXJkcyBmb3IgTVBDODM2MEUgc2lsaWNvbiB1cCB0byBub3csIFRoZXkgYXJlCisKKwkqIE1QQzgzNjBFLU1EUy1QQiBQUk9UTyAoYS5rLmEgODM2MFNZUyBQUk9UT1RZUEUpCisJKiBNUEM4MzYwRS1NRFMtUEIgUElMT1QgKGEuay5hIDgzNjBTWVMgUElMT1QpCisJKiBNUEM4MzYwRUEtTURTLVBCIFBST1RPIChhLmsuYSA4MzYwU1lTMiBQUk9UT1RZUEUpCisKKzEuMglGb3IgYWxsIHRoZSBNUEM4MzYwRU1EUyBCb2FyZAogCiAJRmlyc3QsIG1ha2Ugc3VyZSB0aGUgYm9hcmQgZGVmYXVsdCBzZXR0aW5nIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUKIAlkb2N1bWVudCBzaGlwcGVkIHdpdGggeW91ciBib2FyZC4gVGhlbiBhcHBseSB0aGUgZm9sbG93aW5nIHNldHRpbmc6CkBAIC0zMyw2ICszOSwyMSBAQAogCUpQNiAxLTIKIAlvbiBib2FyZCBPc2NpbGxhdG9yOiA2Nk0KIAorMS4zCVNpbmNlIGRpZmZlcmVudCBib2FyZC9jaGlwIHJldi4gY29tYmluYXRpb25zIGhhdmUgQUMgdGltaW5nIGlzc3VlcywKKwl1LWJvb3QgZm9yY2VzIFJHTUlJLUlEIChSR01JSSB3aXRoIEludGVybmFsIERlbGF5KSBtb2RlIG9uIGJ5IGRlZmF1bHQKKwlieSB0aGUgcGF0Y2ggKG1wYzgzeHg6IERpc2FibGUgRzFUWENMSywgRzJUWENMSyBoL3cgYnVmZmVycykuCisKKwlXaGVuIHRoZSByZXYyLnggc2lsaWNvbiBtb3VudCBvbiB0aGVzZSBib2FyZHMsIGFuZCBpZiB5b3UgYXJlIHVzaW5nCisJdS1ib290IHZlcnNpb24gYWZ0ZXIgdGhpcyBwYXRjaCwgdG8gbWFrZSB0aGUgZXRoZXJuZXQgaW50ZXJmYWNlcyB1c2FibGUsCisJYW5kIHRvIGVuYWJsZSBSR01JSS1JRCBvbiB5b3VyIGJvYXJkLCB5b3UgaGF2ZSB0byBzZXR1cCB0aGUganVtcGVycworCWNvcnJlY3RseS4KKworCSogTVBDODM2MEUtTURTLVBCIFBST1RPCisJICBub3RoaW5nIHRvIGRvCisJKiBNUEM4MzYwRS1NRFMtUEIgUElMT1QKKwkgIEpQOSBhbmQgSlA4IHNob3VsZCBiZSBPTgorCSogTVBDODM2MEVBLU1EUy1QQiBQUk9UTworCSAgSlAyIGFuZCBKUDMgc2hvdWxkIGJlIE9OCiAKIDIuCU1lbW9yeSBNYXAKIApkaWZmIC0tZ2l0IGEvZG9jL1JFQURNRS5tcGM4M3h4LmRkcmVjYyBiL2RvYy9SRUFETUUubXBjODN4eC5kZHJlY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAyOWYwOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9SRUFETUUubXBjODN4eC5kZHJlY2MKQEAgLTAsMCArMSwxNTQgQEAKK092ZXJ2aWV3Cis9PT09PT09PQorCitUaGUgb3ZlcmFsbCB1c2FnZSBwYXR0ZXJuIGZvciBFQ0MgZGlhZ25vc3RpYyBjb21tYW5kcyBpcyB0aGUgZm9sbG93aW5nOgorCisgICogKGluamVjdGluZyBlcnJvcnMgaXMgaW5pdGlhbGx5IGRpc2FibGVkKQorCisgICogZGVmaW5lIGluamVjdCBtYXNrICh3aGljaCB0ZWxscyB0aGUgRERSIGNvbnRyb2xsZXIgd2hhdCB0eXBlIG9mIGVycm9ycworICAgIHdlJ2xsIGJlIGluamVjdGluZzogc2luZ2xlL211bHRpcGxlIGJpdCBldGMuKQorCisgICogZW5hYmxlIGluamVjdGluZyBlcnJvcnMgLSBmcm9tIG5vdyBvbiB0aGUgY29udHJvbGxlciBpbmplY3RzIGVycm9ycyBhcworICAgIGluZGljYXRlZCBpbiB0aGUgaW5qZWN0IG1hc2sKKworSU1QT1JUQU5UIE5PVElDRTogZW5hYmxpbmcgaW5qZWN0aW5nIG11bHRpcGxlLWJpdCBlcnJvcnMgaXMgcG90ZW50aWFsbHkKK2Rhbmdlcm91cyBhcyBzdWNoIGVycm9ycyBhcmUgTk9UIGNvcnJlY3RlZCBieSB0aGUgY29udHJvbGxlci4gVGhlcmVmb3JlIGNhdXRpb24KK3Nob3VsZCBiZSB0YWtlbiB3aGVuIGVuYWJsaW5nIHRoZSBpbmplY3Rpb24gb2YgbXVsdGlwbGUtYml0IGVycm9yczogaXQgaXMgb25seQorc2FmZSB3aGVuIHVzZWQgb24gYSBjYXJlZnVsbHkgc2VsZWN0ZWQgbWVtb3J5IGFyZWEgYW5kIHVzZWQgdW5kZXIgY29udHJvbCBvZgordGhlICdlY2MgdGVzdGR3JyAnZWNjIHRlc3R3b3JkJyBjb21tYW5kIChzZWUgZXhhbXBsZSAnSW5qZWN0aW5nIE11bHRpcGxlLUJpdAorRXJyb3JzJyBiZWxvdykuIEluIHBhcnRpY3VsYXIsIHdoZW4geW91IHNpbXBseSBzZXQgdGhlIG11bHRpcGxlLWJpdCBlcnJvcnMgaW4KK2luamVjdCBtYXNrIGFuZCBlbmFibGUgaW5qZWN0aW9uLCBVLUJvb3QgaXMgdmVyeSBsaWtlbHkgdG8gaGFuZyBxdWlja2x5IGFzIHRoZQorZXJyb3JzIHdpbGwgYmUgaW5qZWN0ZWQgd2hlbiBpdCBhY2Nlc3NlcyBpdHMgY29kZSwgZGF0YSBldGMuCisKKworVXNlIGNhc2VzIGZvciBERFIgJ2VjYycgY29tbWFuZDoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0JlZm9yZSBleGVjdXRpbmcgcGFydGljdWxhciB0ZXN0cyByZXNldCB0YXJnZXQgYm9hcmQgb3IgY2xlYXIgc3RhdHVzIHJlZ2lzdGVyczoKKworPT4gZWNjIGNhcHR1cmVjbGVhcgorPT4gZWNjIGVycmRldGVjdGNsciBhbGwKKz0+IGVjYyBzYmVjbnQgMAorCisKK0luamVjdGluZyBTaW5nbGUtQml0IEVycm9ycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzEuIFNldCAxIGJpdCBpbiBEYXRhIFBhdGggRXJyb3IgSW5qZWN0IE1hc2sKKworPT4gZWNjIGluamVjdGRhdGFoaSAxCisKKzIuIFJ1biB0ZXN0IG92ZXIgc29tZSBtZW1vcnkgcmVnaW9uCisKKz0+IGVjYyB0ZXN0ZHcgMjAwMDAwIDEwCisKKzMuIENoZWNrIEVDQyBzdGF0dXMKKworPT4gZWNjIHN0YXR1cworLi4uCitNZW1vcnkgRGF0YSBQYXRoIEVycm9yIEluamVjdGlvbiBNYXNrIEhpZ2gvTG93OiAwMDAwMDAwMSAwMDAwMDAwMAorLi4uCitNZW1vcnkgU2luZ2xlLUJpdCBFcnJvciBNYW5hZ2VtZW50ICgwLi4yNTUpOgorICBTaW5nbGUtQml0IEVycm9yIFRocmVzaG9sZDogMjU1CisgIFNpbmdsZSBCaXQgRXJyb3IgQ291bnRlcjogMTYKKy4uLgorTWVtb3J5IEVycm9yIERldGVjdDoKKyAgTXVsdGlwbGUgTWVtb3J5IEVycm9yczogMAorICBNdWx0aXBsZS1CaXQgRXJyb3I6IDAKKyAgU2luZ2xlLUJpdCBFcnJvcjogMAorLi4uCisKKzE2IGVycm9ycyB3ZXJlIGdlbmVyYXRlZCwgU2luZ2xlLUJpdCBFcnJvciBmbGFnIHdhcyBub3Qgc2V0IGFzIFNpbmdsZSBCaXQgRXJyb3IKK0NvdW50ZXIgZGlkIG5vdCByZWFjaCAgU2luZ2xlLUJpdCBFcnJvciBUaHJlc2hvbGQuCisKKzQuIE1ha2Ugc3VyZSB1c2VkIG1lbW9yeSByZWdpb24gZ290IHJlLWluaXRpYWxpemVkIHdpdGggMHgwMTIzNDU2Nzg5YWJjZGVmCisKKz0+IG1kIDIwMDAwMAorMDAyMDAwMDA6IDAxMjM0NTY3IDg5YWJjZGVmIDAxMjM0NTY3IDg5YWJjZGVmICAgIC4jRWcuLi4uLiNFZy4uLi4KKzAwMjAwMDEwOiAwMTIzNDU2NyA4OWFiY2RlZiAwMTIzNDU2NyA4OWFiY2RlZiAgICAuI0VnLi4uLi4jRWcuLi4uCiswMDIwMDAyMDogMDEyMzQ1NjcgODlhYmNkZWYgMDEyMzQ1NjcgODlhYmNkZWYgICAgLiNFZy4uLi4uI0VnLi4uLgorMDAyMDAwMzA6IDAxMjM0NTY3IDg5YWJjZGVmIDAxMjM0NTY3IDg5YWJjZGVmICAgIC4jRWcuLi4uLiNFZy4uLi4KKzAwMjAwMDQwOiAwMTIzNDU2NyA4OWFiY2RlZiAwMTIzNDU2NyA4OWFiY2RlZiAgICAuI0VnLi4uLi4jRWcuLi4uCiswMDIwMDA1MDogMDEyMzQ1NjcgODlhYmNkZWYgMDEyMzQ1NjcgODlhYmNkZWYgICAgLiNFZy4uLi4uI0VnLi4uLgorMDAyMDAwNjA6IDAxMjM0NTY3IDg5YWJjZGVmIDAxMjM0NTY3IDg5YWJjZGVmICAgIC4jRWcuLi4uLiNFZy4uLi4KKzAwMjAwMDcwOiAwMTIzNDU2NyA4OWFiY2RlZiAwMTIzNDU2NyA4OWFiY2RlZiAgICAuI0VnLi4uLi4jRWcuLi4uCiswMDIwMDA4MDogZGVhZGJlZWYgZGVhZGJlZWYgZGVhZGJlZWYgZGVhZGJlZWYgICAgLi4uLi4uLi4uLi4uLi4uLgorMDAyMDAwOTA6IGRlYWRiZWVmIGRlYWRiZWVmIGRlYWRiZWVmIGRlYWRiZWVmICAgIC4uLi4uLi4uLi4uLi4uLi4KKworSW5qZWN0aW5nIE11bHRpcGxlLUJpdCBFcnJvcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzEuIFNldCBtb3JlIHRoYW4gMSBiaXQgaW4gRGF0YSBQYXRoIEVycm9yIEluamVjdCBNYXNrCisKKz0+IGVjYyBpbmplY3RkYXRhaGkgMQorPT4gZWNjIGluamVjdGRhdGFsbyAxCisKKzIuIFJ1biB0ZXN0IG92ZXIgc29tZSBtZW1vcnkgcmVnaW9uCisKKz0+IGVjYyB0ZXN0d29yZCAyMDAwMDAgMQorCiszLiBDaGVjayBFQ0Mgc3RhdHVzCisKKz0+IGVjYyBzdGF0dXMKKy4uLgorTWVtb3J5IERhdGEgUGF0aCBFcnJvciBJbmplY3Rpb24gTWFzayBIaWdoL0xvdzogMDAwMDAwMDEgMDAwMDAwMDEKKy4uLgorTWVtb3J5IEVycm9yIERldGVjdDoKKyAgTXVsdGlwbGUgTWVtb3J5IEVycm9yczogMAorICBNdWx0aXBsZS1CaXQgRXJyb3I6IDEKKyAgU2luZ2xlLUJpdCBFcnJvcjogMAorLi4uCisKK1RoZSBNdWx0aXBsZSBNZW1vcnkgRXJyb3JzIGZsYWdzIG5vdCBzZXQgYW5kIE11bHRpcGxlLUJpdCBFcnJvciBmbGFncyBhcmUgc2V0LgorCis0LiBNYWtlIHN1cmUgdXNlZCBtZW1vcnkgcmVnaW9uIGdvdCByZS1pbml0aWFsaXplZCB3aXRoIDB4MDEyMzQ1Njc4OWFiY2RlZgorCis9PiBtZCAyMDAwMDAKKzAwMjAwMDAwOiAwMTIzNDU2NyA4OWFiY2RlZiAwMTIzNDU2NyA4OWFiY2RlZiAgICAuI0VnLi4uLi4jRWcuLi4uCiswMDIwMDAxMDogMDEyMzQ1NjcgODlhYmNkZWYgMDEyMzQ1NjcgODlhYmNkZWYgICAgLiNFZy4uLi4uI0VnLi4uLgorMDAyMDAwMjA6IDAxMjM0NTY3IDg5YWJjZGVmIDAxMjM0NTY3IDg5YWJjZGVmICAgIC4jRWcuLi4uLiNFZy4uLi4KKzAwMjAwMDMwOiAwMTIzNDU2NyA4OWFiY2RlZiAwMTIzNDU2NyA4OWFiY2RlZiAgICAuI0VnLi4uLi4jRWcuLi4uCiswMDIwMDA0MDogMDEyMzQ1NjcgODlhYmNkZWYgMDEyMzQ1NjcgODlhYmNkZWYgICAgLiNFZy4uLi4uI0VnLi4uLgorMDAyMDAwNTA6IDAxMjM0NTY3IDg5YWJjZGVmIDAxMjM0NTY3IDg5YWJjZGVmICAgIC4jRWcuLi4uLiNFZy4uLi4KKzAwMjAwMDYwOiAwMTIzNDU2NyA4OWFiY2RlZiAwMTIzNDU2NyA4OWFiY2RlZiAgICAuI0VnLi4uLi4jRWcuLi4uCiswMDIwMDA3MDogMDEyMzQ1NjcgODlhYmNkZWYgMDEyMzQ1NjcgODlhYmNkZWYgICAgLiNFZy4uLi4uI0VnLi4uLgorMDAyMDAwODA6IGRlYWRiZWVmIGRlYWRiZWVmIGRlYWRiZWVmIGRlYWRiZWVmICAgIC4uLi4uLi4uLi4uLi4uLi4KKzAwMjAwMDkwOiBkZWFkYmVlZiBkZWFkYmVlZiBkZWFkYmVlZiBkZWFkYmVlZiAgICAuLi4uLi4uLi4uLi4uLi4uCisKKworVGVzdCBTaW5nbGUtQml0IEVycm9yIENvdW50ZXIgYW5kIFRocmVzaG9sZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisxLiBTZXQgMSBiaXQgaW4gRGF0YSBQYXRoIEVycm9yIEluamVjdCBNYXNrCisKKz0+IGVjYyBpbmplY3RkYXRhaGkgMQorCisyLiBFbmFibGUgZXJyb3IgaW5qZWN0aW9uCisKKz0+IGVjYyBpbmplY3QgZW4KKworMy4gTGV0IHUtYm9vdCBydW4gZm9yIGEgd2l0aCBTaW5nbGUtQml0IGVycm9yIGluamVjdGlvbiBlbmFibGVkCisKKzQuIERpc2FibGUgZXJyb3IgaW5qZWN0aW9uCisKKz0+IGVjYyBpbmplY3QgZGlzCisKKzQuIENoZWNrIHN0YXR1cworCis9PiBlY2Mgc3RhdHVzCisKKy4uLgorTWVtb3J5IFNpbmdsZS1CaXQgRXJyb3IgTWFuYWdlbWVudCAoMC4uMjU1KToKKyAgU2luZ2xlLUJpdCBFcnJvciBUaHJlc2hvbGQ6IDI1NQorICBTaW5nbGUgQml0IEVycm9yIENvdW50ZXI6IDE5OQorCitNZW1vcnkgRXJyb3IgRGV0ZWN0OgorICBNdWx0aXBsZSBNZW1vcnkgRXJyb3JzOiAxCisgIE11bHRpcGxlLUJpdCBFcnJvcjogMAorICBTaW5nbGUtQml0IEVycm9yOiAxCisuLi4KKworT2JzZXJ2ZSB0aGF0IFNpbmdsZS1CaXQgRXJyb3IgaXMgJ29uJyB3aGljaCBtZWFucyB0aGF0IFNpbmdsZS1CaXQgRXJyb3IgQ291bnRlcgorcmVhY2hlZCBTaW5nbGUtQml0IEVycm9yIFRocmVzaG9sZC4gTXVsdGlwbGUgTWVtb3J5IEVycm9ycyBiaXQgaXMgYWxzbyAnb24nLCB0aGF0CitpcyBDb3VudGVyIHJlYWNoZWQgVGhyZXNob2xkIG1vcmUgdGhhbiBvbmUgdGltZSAoaXQgd3JhcHMgYmFjayBhZnRlciByZWFjaGluZworVGhyZXNob2xkKS4KZGlmZiAtLWdpdCBhL2RvYy9SRUFETUUubXBjODY0MWhwY24gYi9kb2MvUkVBRE1FLm1wYzg2NDFocGNuCmluZGV4IDNiODhmOGIuLmFjNTZjY2EgMTAwNjQ0Ci0tLSBhL2RvYy9SRUFETUUubXBjODY0MWhwY24KKysrIGIvZG9jL1JFQURNRS5tcGM4NjQxaHBjbgpAQCAtOTYsMTQgKzk2LDE3IEBACiAKIAl0ZnRwIDEwMDAwMDAgdS1ib290LmJpbgogCXByb3RlY3Qgb2ZmIGFsbAotCWVyYXNlIGZmZjAwMDAwIGZmZmZmZmZmCi0JY3AuYiAxMDAwMDAwIGZmZjAwMTAwIDgwMDAwCisJZXJhc2UgZmZmMDAwMDAgKyRmaWxlc2l6ZQorCWNwLmIgMTAwMDAwMCBmZmYwMDAwMCAkZmlsZXNpemUKKworb3IgdXNlIHRmdHBmbGFzaCBjb21tYW5kOgorCXJ1biB0ZnRwZmxhc2gKIAogVG8gRmxhc2ggVS1ib290IGludG8gdGhlIGFsdGVybmF0aXZlIGJhbmsgKDB4RkY4MDAwMDAgLSAweEZGQkZGRkZGKToKIAogCXRmdHAgMTAwMDAwMCB1LWJvb3QuYmluCi0JZXJhc2UgZmZiMDAwMDAgZmZiZmZmZmYKLQljcC5iIDEwMDAwMDAgZmZiMDAxMDAgODAwMDAKKwllcmFzZSBmZmIwMDAwMCArJGZpbGVzaXplCisJY3AuYiAxMDAwMDAwIGZmYjAwMDAwICRmaWxlc2l6ZQogCiAKIDQuIE1lbW9yeSBNYXAKZGlmZiAtLWdpdCBhL2RvYy9SRUFETUUubmFuZCBiL2RvYy9SRUFETUUubmFuZAppbmRleCA1YzMxODQ1Li5jNWM1ZWYyIDEwMDY0NAotLS0gYS9kb2MvUkVBRE1FLm5hbmQKKysrIGIvZG9jL1JFQURNRS5uYW5kCkBAIC05Myw4ICs5Myw4IEBACiAKIENvbmZpZ3VyYXRpb24gT3B0aW9uczoKIAotICAgQ0ZHX0NNRF9OQU5ECi0gICAgICBBIGdvb2Qgb25lIHRvIGFkZCB0byBDT05GSUdfQ09NTUFORFMgc2luY2UgaXQgZW5hYmxlcyBOQU5EIHN1cHBvcnQuCisgICBDT05GSUdfQ01EX05BTkQKKyAgICAgIEVuYWJsZXMgTkFORCBzdXBwb3J0IGFuZCBjb21tbWFuZHMuCiAKICAgIENPTkZJR19NVERfTkFORF9FQ0NfSkZGUzIKICAgICAgIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IHRoZSBFcnJvciBDb3JyZWN0aW9uIENvZGUgaW5mb3JtYXRpb24gaW4KZGlmZiAtLWdpdCBhL2RvYy9SRUFETUUucHBjNDQwIGIvZG9jL1JFQURNRS5wcGM0NDAKaW5kZXggMDhmMzRmNS4uMmUwNGFiYSAxMDA2NDQKLS0tIGEvZG9jL1JFQURNRS5wcGM0NDAKKysrIGIvZG9jL1JFQURNRS5wcGM0NDAKQEAgLTE0NiwxMiArMTQ2LDEzIEBACiBzcGFjZSBiZWdpbnMgYXQgUENJIEkvTyBhZGRyZXNzIDAgYW5kIHRoZSBQQ0kgbWVtb3J5IHNwYWNlIGlzCiAyNTYgTUIgc3RhcnRpbmcgYXQgUENJIGFkZHJlc3MgQ0ZHX1BDSV9UQVJHQkFTRS4gQWZ0ZXIgdGhlCiBwY2lfY29udHJvbGxlciBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQsIHRoZSBjcHUtc3BlY2lmaWMgY29kZSB3aWxsCi1jYWxsIHRoZSByb3V0aW5lIHBjaV9wcmVfaW5pdCgpIGlmIHRoZSBDRkdfUENJX1BSRV9JTklUIGZsYWcgaXMKLWRlZmluZWQuIFRoaXMgcm91dGluZSBpcyBpbXBsZW1lbnRlZCBieSBib2FyZC1zcGVjaWZpYyBjb2RlICYgaXMgd2hlcmUKLXRoZSBib2FyZCBjYW4gb3Zlci1yaWRlL2V4dGVuZCB0aGUgZGVmYXVsdCBwY2lfY29udHJvbGxlciBzdHJ1Y3R1cmUKLXNldHRpbmdzIGFuZCBkbyBvdGhlciBwcmUtaW5pdGlhbGl6YXRpb24gdGFza3MuIElmIHBjaV9wcmVfaW5pdCgpCi1yZXR1cm5zIGEgdmFsdWUgb2YgemVybywgUENJIGluaXRpYWxpemF0aW9uIGlzIGFib3J0ZWQ7IG90aGVyd2lzZSB0aGUKLWNvbnRyb2xsZXIgc3RydWN0dXJlIGlzIHJlZ2lzdGVyZWQgYW5kIGluaXRpYWxpemF0aW9uIGNvbnRpbnVlcy4KK2NhbGwgdGhlIHJvdXRpbmUgcGNpX3ByZV9pbml0KCkuIFRoaXMgcm91dGluZSBpcyBpbXBsZW1lbnRlZCBieQorYm9hcmQtc3BlY2lmaWMgY29kZSAmIGlzIHdoZXJlIHRoZSBib2FyZCBjYW4gb3Zlci1yaWRlL2V4dGVuZCB0aGUKK2RlZmF1bHQgcGNpX2NvbnRyb2xsZXIgc3RydWN0dXJlIHNldHRpbmdzIGFuZCBleHNwZWNpYWxseSBwcm92aWRlCithIHJvdXRpbmUgdG8gbWFwIHRoZSBQQ0kgaW50ZXJydXB0cyBhbmQgZG8gb3RoZXIgcHJlLWluaXRpYWxpemF0aW9uCit0YXNrcy4gSWYgcGNpX3ByZV9pbml0KCkgcmV0dXJucyBhIHZhbHVlIG9mIHplcm8sIFBDSSBpbml0aWFsaXphdGlvbgoraXMgYWJvcnRlZDsgb3RoZXJ3aXNlIHRoZSBjb250cm9sbGVyIHN0cnVjdHVyZSBpcyByZWdpc3RlcmVkIGFuZAoraW5pdGlhbGl6YXRpb24gY29udGludWVzLgogCiBUaGUgZGVmYXVsdCA0NDBHUCBQQ0kgdGFyZ2V0IGNvbmZpZ3VyYXRpb24gaXMgbWluaW1hbCAtLSBpdCBhc3N1bWVzIHRoYXQKIHRoZSBzdHJhcHBpbmcgcmVnaXN0ZXJzIGFyZSBzZXQgYXMgbmVjZXNzYXJ5LiBTaW5jZSB0aGUgc3RyYXBwaW5nIGJpdHMKZGlmZiAtLWdpdCBhL2RvYy9SRUFETUUuc2JjODY0MWQgYi9kb2MvUkVBRE1FLnNiYzg2NDFkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNTE0NjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvUkVBRE1FLnNiYzg2NDFkCkBAIC0wLDAgKzEsMjggQEAKK1dpbmQgUml2ZXIgU0JDODY0MUQgcmVmZXJlbmNlIGJvYXJkCis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ3JlYXRlZCAwNi8xNC8yMDA3IEpvZSBIYW1tYW4KK0NvcHlyaWdodCAyMDA3LCBFbWJlZGRlZCBTcGVjaWFsdGllcywgSW5jLgorQ29weXJpZ2h0IDIwMDcgV2luZCBSaXZlciBTeXN0ZW1lcywgSW5jLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworMS4gQnVpbGRpbmcgVS1Cb290CistLS0tLS0tLS0tLS0tLS0tLS0KK1RoZSBTQkM4NjQxRCBjb2RlIGlzIGtub3duIHRvIGJ1aWxkIHVzaW5nIEVMREsgNC4xLgorCisgICAgJCBtYWtlIHNiYzg2NDFkX2NvbmZpZworICAgIENvbmZpZ3VyaW5nIGZvciBzYmM4NjQxZCBib2FyZC4uLgorCisgICAgJCBtYWtlCisKKworMi4gU3dpdGNoIGFuZCBKdW1wZXIgU2V0dGluZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBbGwgSnVtcGVycyAmIFN3aXRjaGVzIGFyZSBpbiB0aGVpciBkZWZhdWx0IHBvc2l0aW9ucy4gIFBsZWFzZSByZWZlciB0bwordGhlIGJvYXJkIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuICBTb21lIHNldHRpbmdzIGNvbnRyb2wgQ1BVIHZvbHRhZ2VzCithbmQgc2V0dGluZ3MgbWF5IGNoYW5nZSB3aXRoIGJvYXJkIHJldmlzaW9ucy4KKworMy4gS25vd24gbGltaXRhdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCitQQ0k6CisJVGhlIFBDSSBjb21tYW5kIG1heSBoYW5nIGlmIG5vIGJvYXJkcyBhcmUgcHJlc2VudCBpbiBlaXRoZXIgc2xvdC4KZGlmZiAtLWdpdCBhL2RvYy9SRUFETUUuc2hhMSBiL2RvYy9SRUFETUUuc2hhMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTkyZjdmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL1JFQURNRS5zaGExCkBAIC0wLDAgKzEsNTcgQEAKK1NIQTEgdXNhZ2U6CistLS0tLS0tLS0tLQorCitJbiB0aGUgVS1Cb290IEltYWdlIGZvciB0aGUgcGNzNDQwZXAgYm9hcmQgaXMgYSBTSEExIGNoZWNrc3VtIGludGVncmF0ZWQuCitUaGlzIFNIQTEgc3VtIGlzIHVzZWQsIHRvIGNoZWNrLCBpZiB0aGUgVS1Cb290IEltYWdlIGluIEZsYXNoIGlzIG5vdAorY29ycnVwdGVkLgorCitUaGUgZm9sbG93aW5nIGNvbW1hbmQgaXMgYXZhaWxhYmxlOgorCis9PiBoZWxwIHNoYTEKK3NoYTEgYWRkcmVzcyBsZW4gW2FkZHJdICBjYWxjdWxhdGUgdGhlIFNIQTEgc3VtIFtzYXZlIGF0IGFkZHJdCisgICAgIC1wIGNhbGN1bGF0ZSB0aGUgU0hBMSBzdW0gZnJvbSB0aGUgVS1Cb290IGltYWdlIGluIGZsYXNoIGFuZCBwcmludAorICAgICAtYyBjaGVjayB0aGUgVS1Cb290IGltYWdlIGluIGZsYXNoCisKKyJzaGExIC1wIgorCWNhbGN1bGF0ZXMgYW5kIHByaW50cyB0aGUgU0hBMSBzdW0sIGZyb20gdGhlIEltYWdlIHN0b3JlZCBpbiBGbGFzaAorCisic2hhMSAtYyIKKwljaGVjaywgaWYgdGhlIFNIQTEgc3VtIGZyb20gdGhlIEltYWdlIHN0b3JlZCBpbiBGbGFzaCBpcyBjb3JyZWN0CisKKworSXQgaXMgcG9zc2libGUgdG8gY2FsY3VsYXRlIGEgU0hBMSBjaGVja3N1bSBmcm9tIGEgbWVtb3J5cmFuZ2Ugd2l0aDoKKworInNoYTEgYWRkcmVzcyBsZW4iCisKK0lmIHlvdSB3YW50IHRvIHN0b3JlIGEgbmV3IEltYWdlIGluIEZsYXNoIGZvciB0aGUgcGNzNDQwZXAgYm9hcmQsCit3aGljaCBoYXMgbm8gU0hBMSBzdW0sIHlvdSBjYW4gZG8gdGhlIGZvbGxvd2luZzoKKworYSkgY3AgdGhlIG5ldyBJbWFnZSBvbiBhIHBvc2l0aW9uIGluIFJBTSAoaGVyZSAweDMwMDAwMCkKKyAgIChmb3IgdGhpcyBleGFtcGxlIHdlIHVzZSB0aGUgSW1hZ2UgZnJvbSBGbGFzaCwgc3RvcmVkIGF0IDB4ZmZmYTAwMDAgYW5kCisgICAgMHg2MDAwMCBCeXRlcyBsb25nKQorCisiY3AuYiBmZmZhMDAwMCAzMDAwMDAgNjAwMDAiCisKK2IpIEluaXRpYWxpemUgdGhlIFNIQTEgc3VtIGluIHRoZSBJbWFnZSB3aXRoIDB4MDAKKyAgIFRoZSBTSEExIHN1bSBpcyBzdG9yZWQgaW4gRmxhc2ggYXQ6CisJCQkgICBDRkdfTU9OSVRPUl9CQVNFICsgQ0ZHX01PTklUT1JfTEVOICsgU0hBMV9TVU1fUE9TCisgICBmb3IgdGhlIHBjczQ0MGVwIEZsYXNoOgkgMHhmZmZhMDAwMCArCSAgICAgIDB4NjAwMDAgKyAgICAgICAgLTB4MjAKKwkJCSAgICA9IDB4ZmZmZmZmZTAKKyAgIGZvciB0aGUgZXhhbXBsZSBpbiBSQU06CSAgIDB4MzAwMDAwICsJICAgICAgMHg2MDAwMCArICAgICAgICAtMHgyMAorCQkJICAgID0gMHgzNWZmZTAKKworICAgbm90ZTogYSBTSEExIGNoZWNrc3VtIGlzIDIwIGJ5dGVzIGxvbmcuCisKKyJtdy5iIDM1ZmZlMCAwIDE0IgorCitjKSBub3cgY2FsY3VsYXRlIHRoZSBTSEExIHN1bSBmcm9tIHRoZSBtZW1vcnlyYW5nZSBhbmQgd3JpdGUKKyAgIHRoZSBjYWxjdWxhdGVkIGNoZWNrc3VtIGF0IHRoZSByaWdodCBwbGFjZToKKworInNoYTEgMzAwMDAwIDYwMDAwIDM1ZmZlMCIKKworTm93IHlvdSBoYXZlIGEgVS1Cb290LUltYWdlIGZvciB0aGUgcGNzNDQwZXAgYm9hcmQgd2l0aCB0aGUgY29ycmVjdCBTSEExIHN1bS4KKworSWYgeW91IGRvIGEgIi4vTUFLRUFMTCBwY3M0NDBlcCIgb3IgYSAibWFrZSBhbGwiIHRvIGdldCB0aGUgVS1Cb290IGltYWdlLAordGhlIGNvcnJlY3QgU0hBMSBzdW0gd2lsbCBiZSBhdXRvbWFnaWNhbGx5IGluY2x1ZGVkIGluIHRoZSBVLUJvb3QgaW1hZ2UuCisKK0hlaWtvIFNjaG9jaGVyLCAxMSBKdWwgMjAwNwpkaWZmIC0tZ2l0IGEvZG9jL1JFQURNRS51c2IgYi9kb2MvUkVBRE1FLnVzYgppbmRleCA0MWY3NmY0Li5iM2JjYjkxIDEwMDY0NAotLS0gYS9kb2MvUkVBRE1FLnVzYgorKysgYi9kb2MvUkVBRE1FLnVzYgpAQCAtNzMsOCArNzMsOCBAQAogCiBDb25maWcgU3dpdGNoZXM6CiAtLS0tLS0tLS0tLS0tLS0tCi1DRkdfQ01EX1VTQgkgICAgZW5hYmxlcyBiYXNpYyBVU0Igc3VwcG9ydCBhbmQgdGhlIHVzYiBjb21tYW5kCi1DT05GSUdfVVNCX1VIQ0kJICAgIGRlZmluZXMgdGhlIGxvd2xldmVsIHBhcnQuQSBsb3dsZXZlbCBwYXJ0IG11c3QgYmUgZGVmaW5lZCBpZgotCQkgICAgdXNpbmcgQ0ZHX0NNRF9VU0IKK0NPTkZJR19DTURfVVNCCSAgICBlbmFibGVzIGJhc2ljIFVTQiBzdXBwb3J0IGFuZCB0aGUgdXNiIGNvbW1hbmQKK0NPTkZJR19VU0JfVUhDSQkgICAgZGVmaW5lcyB0aGUgbG93bGV2ZWwgcGFydC5BIGxvd2xldmVsIHBhcnQgbXVzdCBiZSBkZWZpbmVkCisJCSAgICBpZiB1c2luZyBDT05GSUdfQ01EX1VTQgogQ09ORklHX1VTQl9LRVlCT0FSRCBlbmFibGVzIHRoZSBVU0IgS2V5Ym9hcmQKIENPTkZJR19VU0JfU1RPUkFHRSAgZW5hYmxlcyB0aGUgVVNCIHN0b3JhZ2UgZGV2aWNlcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9NYWtlZmlsZSBiL2RyaXZlcnMvTWFrZWZpbGUKaW5kZXggZDY4Y2JhNi4uZmM5ODA0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL01ha2VmaWxlCkBAIC0yNywxMSArMjcsMTEgQEAKIAogTElCCT0gJChvYmopbGliZHJpdmVycy5hCiAKLUNPQkpTCT0gM2M1ODkubyA1NzAxcmxzLm8gYWxpNTEyeC5vIGF0bWVsX3VzYXJ0Lm8gXAorQ09CSlMJPSAzYzU4OS5vIDU3MDFybHMubyBhbGk1MTJ4Lm8gYXRhX3BpaXgubyBhdG1lbF91c2FydC5vIFwKIAkgIGJjbTU3MHgubyBiY201NzB4X2F1dG9uZWcubyBjZmJfY29uc29sZS5vIGNmaV9mbGFzaC5vIFwKIAkgIGNzODkwMC5vIGN0NjkwMDAubyBkYXRhZmxhc2gubyBkYzIxMTR4Lm8gZG05MDAweC5vIFwKLQkgIGUxMDAwLm8gZWVwcm8xMDAubyBcCi0JICBpODA0Mi5vIGluY2EtaXBfc3cubyBrZXlib2FyZC5vIFwKKwkgIGUxMDAwLm8gZWVwcm8xMDAubyBlbmMyOGo2MC5vIFwKKwkgIGk4MDQyLm8gaW5jYS1pcF9zdy5vIGlzcDExNngtaGNkLm8ga2V5Ym9hcmQubyBcCiAJICBsYW45MWM5Ni5vIG1hY2IubyBcCiAJICBuYXRzZW1pLm8gbmUyMDAwLm8gbmV0YXJtX2V0aC5vIG5ldGNvbnNvbGUubyBcCiAJICBuczE2NTUwLm8gbnM4MzgyeC5vIG5zODczMDgubyBuczc1MjBfZXRoLm8gb21hcDE1MTBfaTJjLm8gXApAQCAtNDcsMTIgKzQ3LDE0IEBACiAJICBzdGF0dXNfbGVkLm8gc3ltNTNjOHh4Lm8gc3lzdGVtYWNlLm8gYWhjaS5vIFwKIAkgIHRpX3BjaTE0MTBhLm8gdGlnb24zLm8gdHNlYy5vIFwKIAkgIHRzaTEwOF9ldGgubyB0c2kxMDhfaTJjLm8gdHNpMTA4X3BjaS5vIFwKLQkgIHVzYmRjb3JlLm8gdXNiZGNvcmVfZXAwLm8gdXNiZGNvcmVfb21hcDE1MTAubyB1c2J0dHkubyBcCisJICB1c2Jfb2hjaS5vIFwKKwkgIHVzYmRjb3JlLm8gdXNiZGNvcmVfZXAwLm8gdXNiZGNvcmVfbXBjOHh4Lm8gdXNiZGNvcmVfb21hcDE1MTAubyBcCisJICB1c2J0dHkubyBcCiAJICB2aWRlb21vZGVzLm8gdzgzYzU1M2YubyBcCiAJICBrczg2OTVldGgubyBcCiAJICBweGFfcGNtY2lhLm8gbXBjOHh4X3BjbWNpYS5vIHRxbTh4eF9wY21jaWEubwlcCiAJICBycHhfcGNtY2lhLm8gXAotCSAgZnNsX2kyYy5vCisJICBmc2xfaTJjLm8gZnNsX3BjaV9pbml0Lm8gYXRpX3JhZGVvbl9mYi5vCiAKIFNSQ1MJOj0gJChDT0JKUzoubz0uYykKIE9CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9haGNpLmMgYi9kcml2ZXJzL2FoY2kuYwppbmRleCA4Y2VmZjAwLi5jY2Q0ZDcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FoY2kuYworKysgYi9kcml2ZXJzL2FoY2kuYwpAQCAtMjUzLDcgKzI1Myw4IEBACiAKIHN0YXRpYyBpbnQgYWhjaV9pbml0X29uZShwY2lfZGV2X3QgcGRldikKIHsKLQl1MzIgaW9iYXNlLCB2ZW5kb3I7CisJdTMyIGlvYmFzZTsKKwl1MTYgdmVuZG9yOwogCWludCByYzsKIAogCW1lbXNldCgodm9pZCAqKWF0YWlkLCAwLCBzaXplb2YoaGRfZHJpdmVpZF90ICopICogQUhDSV9NQVhfUE9SVFMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGFfcGlpeC5jIGIvZHJpdmVycy9hdGFfcGlpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNDU2ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2F0YV9waWl4LmMKQEAgLTAsMCArMSwyMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFByb2NzeXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBdXRob3I6IE11c2h0YXEgS2hhbiA8bXVzaHRhcV9rQHByb2NzeXMuY29tPgorICoJCQk8bXVzaHRhcWtfOTIxQHlhaG9vLmNvLmluPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIHdpdGggdGhlIHJlZmVyZW5jZSB0byBhdGFfcGlpeCBkcml2ZXIgaW4ga2VybmVsIDIuNC4zMgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgU0FUQSBjb250cm9sbGVyIGFuZCBTQVRBIGRyaXZlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxwY2kuaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGlkZS5oPgorI2luY2x1ZGUgPGF0YS5oPgorCisjaWZkZWYgQ0ZHX0FUQV9QSUlYCQkvKmF0YV9waWl4IGRyaXZlciAqLworCisjZGVmaW5lIERFQlVHX1NBVEEgMAkJLypGb3IgZGVidWcgcHJpbnRzIHNldCBERUJVR19TQVRBIHRvIDEgKi8KKworI2RlZmluZSBEUlZfREVDTAkJLypGb3IgZmlsZSBzcGVjaWZpYyBkZWNsYXJhdGlvbnMgKi8KKyNpbmNsdWRlIDxzYXRhLmg+CisjdW5kZWYgRFJWX0RFQ0wKKworLypNYWNyb3MgcmVhbHRlZCB0byBQQ0kqLworI2RlZmluZSBQQ0lfU0FUQV9CVVMJMHgwMAorI2RlZmluZSBQQ0lfU0FUQV9ERVYJMHgxZgorI2RlZmluZSBQQ0lfU0FUQV9GVU5DCTB4MDIKKworI2RlZmluZSBQQ0lfU0FUQV9CQVNFMSAweDEwCisjZGVmaW5lIFBDSV9TQVRBX0JBU0UyIDB4MTQKKyNkZWZpbmUgUENJX1NBVEFfQkFTRTMgMHgxOAorI2RlZmluZSBQQ0lfU0FUQV9CQVNFNCAweDFjCisjZGVmaW5lIFBDSV9TQVRBX0JBU0U1IDB4MjAKKyNkZWZpbmUgUENJX1BNUiAgICAgICAgIDB4OTAKKyNkZWZpbmUgUENJX1BJICAgICAgICAgIDB4MDkKKyNkZWZpbmUgUENJX1BDUyAgICAgICAgIDB4OTIKKyNkZWZpbmUgUENJX0RNQV9DVEwgICAgIDB4NDgKKworI2RlZmluZSBQT1JUX1BSRVNFTlQgKDE8PDApCisjZGVmaW5lIFBPUlRfRU5BQkxFRCAoMTw8NCkKKwordTMyIGJkZjsKK3UzMiBpb2Jhc2UxID0gMDsJCS8qUHJpbWFyeSBjbWQgYmxvY2sgKi8KK3UzMiBpb2Jhc2UyID0gMDsJCS8qUHJpbWFyeSBjdGwgYmxvY2sgKi8KK3UzMiBpb2Jhc2UzID0gMDsJCS8qU2VjIGNtZCBibG9jayAqLwordTMyIGlvYmFzZTQgPSAwOwkJLypzZWMgY3RsIGJsb2NrICovCit1MzIgaW9iYXNlNSA9IDA7CQkvKkJNRE1BKi8KK2ludAorcGNpX3NhdGFfaW5pdCAodm9pZCkKK3sKKwl1MzIgYnVzID0gUENJX1NBVEFfQlVTOworCXUzMiBkZXYgPSBQQ0lfU0FUQV9ERVY7CisJdTMyIGZ1biA9IFBDSV9TQVRBX0ZVTkM7CisJdTE2IGNtZCA9IDA7CisJdTggbGF0ID0gMCwgcGNpYmlvc19tYXhfbGF0ZW5jeSA9IDB4ZmY7CisJdTggcG1yOwkJCS8qUG9ydCBtYXBwaW5nIHJlZyAqLworCXU4IHBpOwkJCS8qUHJnbWluZyBJbnRlcmZhY2UgcmVnICovCisKKwliZGYgPSBQQ0lfQkRGIChidXMsIGRldiwgZnVuKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQgKGJkZiwgUENJX1NBVEFfQkFTRTEsICZpb2Jhc2UxKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQgKGJkZiwgUENJX1NBVEFfQkFTRTIsICZpb2Jhc2UyKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQgKGJkZiwgUENJX1NBVEFfQkFTRTMsICZpb2Jhc2UzKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQgKGJkZiwgUENJX1NBVEFfQkFTRTQsICZpb2Jhc2U0KTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQgKGJkZiwgUENJX1NBVEFfQkFTRTUsICZpb2Jhc2U1KTsKKworCWlmICgoaW9iYXNlMSA9PSAweEZGRkZGRkZGKSB8fCAoaW9iYXNlMiA9PSAweEZGRkZGRkZGKSB8fAorCSAgICAoaW9iYXNlMyA9PSAweEZGRkZGRkZGKSB8fCAoaW9iYXNlNCA9PSAweEZGRkZGRkZGKSB8fAorCSAgICAoaW9iYXNlNSA9PSAweEZGRkZGRkZGKSkgeworCQlwcmludGYgKCJlcnJvciBubyBiYXNlIGFkZHIgZm9yIFNBVEEgY29udHJvbGxlclxuIik7CisJCXJldHVybiAxOworCSAvKkVSUk9SKi99CisKKwlpb2Jhc2UxICY9IDB4RkZGRkZGRkU7CisJaW9iYXNlMiAmPSAweEZGRkZGRkZFOworCWlvYmFzZTMgJj0gMHhGRkZGRkZGRTsKKwlpb2Jhc2U0ICY9IDB4RkZGRkZGRkU7CisJaW9iYXNlNSAmPSAweEZGRkZGRkZFOworCisJLypjaGVjayBmb3IgbW9kZSAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlIChiZGYsIFBDSV9QTVIsICZwbXIpOworCWlmIChwbXIgPiAxKSB7CisJCXByaW50ZiAoImNvbWJpbmVkIG1vZGUgbm90IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAxOworCX0KKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlIChiZGYsIFBDSV9QSSwgJnBpKTsKKwlpZiAoKHBpICYgMHgwNSkgIT0gMHgwNSkgeworCQlwcmludGYgKCJTYXRhIGlzIGluIExlZ2FjeSBtb2RlXG4iKTsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJcHJpbnRmICgic2F0YSBpcyBpbiBOYXRpdmUgbW9kZVxuIik7CisJfQorCisJLypNQVNURVIgQ0ZHIEFORCBJTyBDRkcgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZCAoYmRmLCBQQ0lfQ09NTUFORCwgJmNtZCk7CisJY21kIHw9IFBDSV9DT01NQU5EX01BU1RFUiB8IFBDSV9DT01NQU5EX0lPOworCXBjaV93cml0ZV9jb25maWdfd29yZCAoYmRmLCBQQ0lfQ09NTUFORCwgY21kKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZSAoZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgJmxhdCk7CisKKwlpZiAobGF0IDwgMTYpCisJCWxhdCA9ICg2NCA8PSBwY2liaW9zX21heF9sYXRlbmN5KSA/IDY0IDogcGNpYmlvc19tYXhfbGF0ZW5jeTsKKwllbHNlIGlmIChsYXQgPiBwY2liaW9zX21heF9sYXRlbmN5KQorCQlsYXQgPSBwY2liaW9zX21heF9sYXRlbmN5OworCXBjaV93cml0ZV9jb25maWdfYnl0ZSAoZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgbGF0KTsKKworCXJldHVybiAwOworfQorCitpbnQKK3NhdGFfYnVzX3Byb2JlIChpbnQgcG9ydF9ubykKK3sKKwlpbnQgb3JpZ19tYXNrLCBtYXNrOworCXUxNiBwY3M7CisKKwltYXNrID0gKFBPUlRfUFJFU0VOVCA8PCBwb3J0X25vKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZCAoYmRmLCBQQ0lfUENTLCAmcGNzKTsKKwlvcmlnX21hc2sgPSAoaW50KSBwY3MgJiAweGZmOworCWlmICgob3JpZ19tYXNrICYgbWFzaykgIT0gbWFzaykKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gMTsKK30KKworaW50Citpbml0X3NhdGEgKHZvaWQpCit7CisJdTggaSwgcnYgPSAwOworCisJZm9yIChpID0gMDsgaSA8IENGR19TQVRBX01BWERFVklDRVM7IGkrKykgeworCQlzYXRhX2Rldl9kZXNjW2ldLnR5cGUgPSBERVZfVFlQRV9VTktOT1dOOworCQlzYXRhX2Rldl9kZXNjW2ldLmlmX3R5cGUgPSBJRl9UWVBFX0lERTsKKwkJc2F0YV9kZXZfZGVzY1tpXS5kZXYgPSBpOworCQlzYXRhX2Rldl9kZXNjW2ldLnBhcnRfdHlwZSA9IFBBUlRfVFlQRV9VTktOT1dOOworCQlzYXRhX2Rldl9kZXNjW2ldLmJsa3N6ID0gMDsKKwkJc2F0YV9kZXZfZGVzY1tpXS5sYmEgPSAwOworCQlzYXRhX2Rldl9kZXNjW2ldLmJsb2NrX3JlYWQgPSBzYXRhX3JlYWQ7CisJfQorCisJcnYgPSBwY2lfc2F0YV9pbml0ICgpOworCWlmIChydiA9PSAxKSB7CisJCXByaW50ZiAoInBjaSBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlwb3J0WzBdLnBvcnRfbm8gPSAwOworCXBvcnRbMF0uaW9hZGRyLmNtZF9hZGRyID0gaW9iYXNlMTsKKwlwb3J0WzBdLmlvYWRkci5hbHRzdGF0dXNfYWRkciA9IHBvcnRbMF0uaW9hZGRyLmN0bF9hZGRyID0KKwkgICAgaW9iYXNlMiB8IEFUQV9QQ0lfQ1RMX09GUzsKKwlwb3J0WzBdLmlvYWRkci5ibWRtYV9hZGRyID0gaW9iYXNlNTsKKworCXBvcnRbMV0ucG9ydF9ubyA9IDE7CisJcG9ydFsxXS5pb2FkZHIuY21kX2FkZHIgPSBpb2Jhc2UzOworCXBvcnRbMV0uaW9hZGRyLmFsdHN0YXR1c19hZGRyID0gcG9ydFsxXS5pb2FkZHIuY3RsX2FkZHIgPQorCSAgICBpb2Jhc2U0IHwgQVRBX1BDSV9DVExfT0ZTOworCXBvcnRbMV0uaW9hZGRyLmJtZG1hX2FkZHIgPSBpb2Jhc2U1ICsgMHg4OworCisJZm9yIChpID0gMDsgaSA8IENGR19TQVRBX01BWEJVUzsgaSsrKQorCQlzYXRhX3BvcnQgKCZwb3J0W2ldLmlvYWRkcik7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ0ZHX1NBVEFfTUFYQlVTOyBpKyspIHsKKwkJaWYgKCEoc2F0YV9idXNfcHJvYmUgKGkpKSkgeworCQkJcG9ydFtpXS5wb3J0X3N0YXRlID0gMDsKKwkJCXByaW50ZiAoIlNBVEEjJWQgcG9ydCBpcyBub3QgcHJlc2VudCBcbiIsIGkpOworCQl9IGVsc2UgeworCQkJcHJpbnRmICgiU0FUQSMlZCBwb3J0IGlzIHByZXNlbnRcbiIsIGkpOworCQkJaWYgKHNhdGFfYnVzX3NvZnRyZXNldCAoaSkpIHsKKwkJCQlwb3J0W2ldLnBvcnRfc3RhdGUgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlwb3J0W2ldLnBvcnRfc3RhdGUgPSAxOworCQkJfQorCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IENGR19TQVRBX01BWEJVUzsgaSsrKSB7CisJCXU4IGosIGRldm5vOworCisJCWlmIChwb3J0W2ldLnBvcnRfc3RhdGUgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGogPSAwOyBqIDwgQ0ZHX1NBVEFfREVWU19QRVJfQlVTOyBqKyspIHsKKwkJCXNhdGFfaWRlbnRpZnkgKGksIGopOworCQkJc2V0X0ZlYXR1cmVfY21kIChpLCBqKTsKKwkJCWRldm5vID0gaSAqIENGR19TQVRBX0RFVlNfUEVSX0JVUyArIGo7CisJCQlpZiAoKHNhdGFfZGV2X2Rlc2NbZGV2bm9dLmxiYSA+IDApICYmCisJCQkgICAgKHNhdGFfZGV2X2Rlc2NbZGV2bm9dLmJsa3N6ID4gMCkpIHsKKwkJCQlkZXZfcHJpbnQgKCZzYXRhX2Rldl9kZXNjW2Rldm5vXSk7CisJCQkJLyogaW5pdGlhbGl6ZSBwYXJ0aXRpb24gdHlwZSAqLworCQkJCWluaXRfcGFydCAoJnNhdGFfZGV2X2Rlc2NbZGV2bm9dKTsKKwkJCQlpZiAoY3Vycl9kZXYgPCAwKQorCQkJCQljdXJyX2RldiA9CisJCQkJCSAgICBpICogQ0ZHX1NBVEFfREVWU19QRVJfQlVTICsgajsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGlfaWRzLmggYi9kcml2ZXJzL2F0aV9pZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTcyYTdkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hdGlfaWRzLmgKQEAgLTAsMCArMSwyMTEgQEAKKy8qCisgKiBBVEkgUENJIElEcyBmcm9tIFhGcmVlODYsIGtlcHQgaGVyZSB0byBtYWtlIHN5bmMnaW5nIHdpdGgKKyAqIFhGcmVlIG11Y2ggc2ltcGxlci4gQ3VycmVudGx5LCB0aGlzIGxpc3QgaXMgb25seSB1c2VkIGJ5CisgKiByYWRlb25mYgorICovCisKKyNkZWZpbmUgUENJX0NISVBfUlYzODBfMzE1MCAgICAgICAgICAgICAweDMxNTAKKyNkZWZpbmUgUENJX0NISVBfUlYzODBfMzE1MSAgICAgICAgICAgICAweDMxNTEKKyNkZWZpbmUgUENJX0NISVBfUlYzODBfMzE1MiAgICAgICAgICAgICAweDMxNTIKKyNkZWZpbmUgUENJX0NISVBfUlYzODBfMzE1MyAgICAgICAgICAgICAweDMxNTMKKyNkZWZpbmUgUENJX0NISVBfUlYzODBfMzE1NCAgICAgICAgICAgICAweDMxNTQKKyNkZWZpbmUgUENJX0NISVBfUlYzODBfMzE1NiAgICAgICAgICAgICAweDMxNTYKKyNkZWZpbmUgUENJX0NISVBfUlYzODBfM0U1MCAgICAgICAgICAgICAweDNFNTAKKyNkZWZpbmUgUENJX0NISVBfUlYzODBfM0U1MSAgICAgICAgICAgICAweDNFNTEKKyNkZWZpbmUgUENJX0NISVBfUlYzODBfM0U1MiAgICAgICAgICAgICAweDNFNTIKKyNkZWZpbmUgUENJX0NISVBfUlYzODBfM0U1MyAgICAgICAgICAgICAweDNFNTMKKyNkZWZpbmUgUENJX0NISVBfUlYzODBfM0U1NCAgICAgICAgICAgICAweDNFNTQKKyNkZWZpbmUgUENJX0NISVBfUlYzODBfM0U1NiAgICAgICAgICAgICAweDNFNTYKKyNkZWZpbmUgUENJX0NISVBfUlMxMDBfNDEzNgkJMHg0MTM2CisjZGVmaW5lIFBDSV9DSElQX1JTMjAwXzQxMzcJCTB4NDEzNworI2RlZmluZSBQQ0lfQ0hJUF9SMzAwX0FECQkweDQxNDQKKyNkZWZpbmUgUENJX0NISVBfUjMwMF9BRQkJMHg0MTQ1CisjZGVmaW5lIFBDSV9DSElQX1IzMDBfQUYJCTB4NDE0NgorI2RlZmluZSBQQ0lfQ0hJUF9SMzAwX0FHCQkweDQxNDcKKyNkZWZpbmUgUENJX0NISVBfUjM1MF9BSCAgICAgICAgICAgICAgICAweDQxNDgKKyNkZWZpbmUgUENJX0NISVBfUjM1MF9BSSAgICAgICAgICAgICAgICAweDQxNDkKKyNkZWZpbmUgUENJX0NISVBfUjM1MF9BSiAgICAgICAgICAgICAgICAweDQxNEEKKyNkZWZpbmUgUENJX0NISVBfUjM1MF9BSyAgICAgICAgICAgICAgICAweDQxNEIKKyNkZWZpbmUgUENJX0NISVBfUlYzNTBfQVAgICAgICAgICAgICAgICAweDQxNTAKKyNkZWZpbmUgUENJX0NISVBfUlYzNTBfQVEgICAgICAgICAgICAgICAweDQxNTEKKyNkZWZpbmUgUENJX0NISVBfUlYzNjBfQVIgICAgICAgICAgICAgICAweDQxNTIKKyNkZWZpbmUgUENJX0NISVBfUlYzNTBfQVMgICAgICAgICAgICAgICAweDQxNTMKKyNkZWZpbmUgUENJX0NISVBfUlYzNTBfQVQgICAgICAgICAgICAgICAweDQxNTQKKyNkZWZpbmUgUENJX0NISVBfUlYzNTBfQVYgICAgICAgICAgICAgICAweDQxNTYKKyNkZWZpbmUgUENJX0NISVBfTUFDSDMyCQkweDQxNTgKKyNkZWZpbmUgUENJX0NISVBfUlMyNTBfNDIzNwkJMHg0MjM3CisjZGVmaW5lIFBDSV9DSElQX1IyMDBfQkIJCTB4NDI0MgorI2RlZmluZSBQQ0lfQ0hJUF9SMjAwX0JDCQkweDQyNDMKKyNkZWZpbmUgUENJX0NISVBfUlMxMDBfNDMzNgkJMHg0MzM2CisjZGVmaW5lIFBDSV9DSElQX1JTMjAwXzQzMzcJCTB4NDMzNworI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRDVAkJMHg0MzU0CisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NENYCQkweDQzNTgKKyNkZWZpbmUgUENJX0NISVBfUlMyNTBfNDQzNwkJMHg0NDM3CisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NEVUCQkweDQ1NTQKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0R0IJCTB4NDc0MgorI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRHRAkJMHg0NzQ0CisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NEdJCQkweDQ3NDkKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0R0wJCTB4NDc0QworI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRHTQkJMHg0NzRECisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NEdOCQkweDQ3NEUKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0R08JCTB4NDc0RgorI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRHUAkJMHg0NzUwCisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NEdRCQkweDQ3NTEKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0R1IJCTB4NDc1MgorI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRHUwkJMHg0NzUzCisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NEdUCQkweDQ3NTQKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0R1UJCTB4NDc1NQorI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRHVgkJMHg0NzU2CisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NEdXCQkweDQ3NTcKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0R1gJCTB4NDc1OAorI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRHWQkJMHg0NzU5CisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NEdaCQkweDQ3NUEKKyNkZWZpbmUgUENJX0NISVBfUlYyNTBfSWQJCTB4NDk2NAorI2RlZmluZSBQQ0lfQ0hJUF9SVjI1MF9JZQkJMHg0OTY1CisjZGVmaW5lIFBDSV9DSElQX1JWMjUwX0lmCQkweDQ5NjYKKyNkZWZpbmUgUENJX0NISVBfUlYyNTBfSWcJCTB4NDk2NworI2RlZmluZSBQQ0lfQ0hJUF9SNDIwX0pIICAgICAgICAgICAgICAgIDB4NEE0OAorI2RlZmluZSBQQ0lfQ0hJUF9SNDIwX0pJICAgICAgICAgICAgICAgIDB4NEE0OQorI2RlZmluZSBQQ0lfQ0hJUF9SNDIwX0pKICAgICAgICAgICAgICAgIDB4NEE0QQorI2RlZmluZSBQQ0lfQ0hJUF9SNDIwX0pLICAgICAgICAgICAgICAgIDB4NEE0QgorI2RlZmluZSBQQ0lfQ0hJUF9SNDIwX0pMICAgICAgICAgICAgICAgIDB4NEE0QworI2RlZmluZSBQQ0lfQ0hJUF9SNDIwX0pNICAgICAgICAgICAgICAgIDB4NEE0RAorI2RlZmluZSBQQ0lfQ0hJUF9SNDIwX0pOICAgICAgICAgICAgICAgIDB4NEE0RQorI2RlZmluZSBQQ0lfQ0hJUF9SNDIwX0pQICAgICAgICAgICAgICAgIDB4NEE1MAorI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRMQgkJMHg0QzQyCisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NExECQkweDRDNDQKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOExFCQkweDRDNDUKKyNkZWZpbmUgUENJX0NISVBfUkFHRTEyOExGCQkweDRDNDYKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0TEcJCTB4NEM0NworI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRMSQkJMHg0QzQ5CisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NExNCQkweDRDNEQKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0TE4JCTB4NEM0RQorI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRMUAkJMHg0QzUwCisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NExRCQkweDRDNTEKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0TFIJCTB4NEM1MgorI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRMUwkJMHg0QzUzCisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NExUCQkweDRDNTQKKyNkZWZpbmUgUENJX0NISVBfUkFERU9OX0xXCQkweDRDNTcKKyNkZWZpbmUgUENJX0NISVBfUkFERU9OX0xYCQkweDRDNTgKKyNkZWZpbmUgUENJX0NISVBfUkFERU9OX0xZCQkweDRDNTkKKyNkZWZpbmUgUENJX0NISVBfUkFERU9OX0xaCQkweDRDNUEKKyNkZWZpbmUgUENJX0NISVBfUlYyNTBfTGQJCTB4NEM2NAorI2RlZmluZSBQQ0lfQ0hJUF9SVjI1MF9MZQkJMHg0QzY1CisjZGVmaW5lIFBDSV9DSElQX1JWMjUwX0xmCQkweDRDNjYKKyNkZWZpbmUgUENJX0NISVBfUlYyNTBfTGcJCTB4NEM2NworI2RlZmluZSBQQ0lfQ0hJUF9SVjI1MF9MbgkJMHg0QzZFCisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhNRgkJMHg0RDQ2CisjZGVmaW5lIFBDSV9DSElQX1JBR0UxMjhNTAkJMHg0RDRDCisjZGVmaW5lIFBDSV9DSElQX1IzMDBfTkQJCTB4NEU0NAorI2RlZmluZSBQQ0lfQ0hJUF9SMzAwX05FCQkweDRFNDUKKyNkZWZpbmUgUENJX0NISVBfUjMwMF9ORgkJMHg0RTQ2CisjZGVmaW5lIFBDSV9DSElQX1IzMDBfTkcJCTB4NEU0NworI2RlZmluZSBQQ0lfQ0hJUF9SMzUwX05IICAgICAgICAgICAgICAgIDB4NEU0OAorI2RlZmluZSBQQ0lfQ0hJUF9SMzUwX05JICAgICAgICAgICAgICAgIDB4NEU0OQorI2RlZmluZSBQQ0lfQ0hJUF9SMzYwX05KICAgICAgICAgICAgICAgIDB4NEU0QQorI2RlZmluZSBQQ0lfQ0hJUF9SMzUwX05LICAgICAgICAgICAgICAgIDB4NEU0QgorI2RlZmluZSBQQ0lfQ0hJUF9SVjM1MF9OUCAgICAgICAgICAgICAgIDB4NEU1MAorI2RlZmluZSBQQ0lfQ0hJUF9SVjM1MF9OUSAgICAgICAgICAgICAgIDB4NEU1MQorI2RlZmluZSBQQ0lfQ0hJUF9SVjM1MF9OUiAgICAgICAgICAgICAgIDB4NEU1MgorI2RlZmluZSBQQ0lfQ0hJUF9SVjM1MF9OUyAgICAgICAgICAgICAgIDB4NEU1MworI2RlZmluZSBQQ0lfQ0hJUF9SVjM1MF9OVCAgICAgICAgICAgICAgIDB4NEU1NAorI2RlZmluZSBQQ0lfQ0hJUF9SVjM1MF9OViAgICAgICAgICAgICAgIDB4NEU1NgorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UEEJCTB4NTA0MQorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UEIJCTB4NTA0MgorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UEMJCTB4NTA0MworI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UEQJCTB4NTA0NAorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UEUJCTB4NTA0NQorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UEYJCTB4NTA0NgorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UEcJCTB4NTA0NworI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UEgJCTB4NTA0OAorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UEkJCTB4NTA0OQorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UEoJCTB4NTA0QQorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UEsJCTB4NTA0QgorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UEwJCTB4NTA0QworI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UE0JCTB4NTA0RAorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UE4JCTB4NTA0RQorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UE8JCTB4NTA0RgorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UFAJCTB4NTA1MAorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UFEJCTB4NTA1MQorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UFIJCTB4NTA1MgorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UFMJCTB4NTA1MworI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UFQJCTB4NTA1NAorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UFUJCTB4NTA1NQorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UFYJCTB4NTA1NgorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UFcJCTB4NTA1NworI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UFgJCTB4NTA1OAorI2RlZmluZSBQQ0lfQ0hJUF9SQURFT05fUUQJCTB4NTE0NAorI2RlZmluZSBQQ0lfQ0hJUF9SQURFT05fUUUJCTB4NTE0NQorI2RlZmluZSBQQ0lfQ0hJUF9SQURFT05fUUYJCTB4NTE0NgorI2RlZmluZSBQQ0lfQ0hJUF9SQURFT05fUUcJCTB4NTE0NworI2RlZmluZSBQQ0lfQ0hJUF9SMjAwX1FICQkweDUxNDgKKyNkZWZpbmUgUENJX0NISVBfUjIwMF9RSQkJMHg1MTQ5CisjZGVmaW5lIFBDSV9DSElQX1IyMDBfUUoJCTB4NTE0QQorI2RlZmluZSBQQ0lfQ0hJUF9SMjAwX1FLCQkweDUxNEIKKyNkZWZpbmUgUENJX0NISVBfUjIwMF9RTAkJMHg1MTRDCisjZGVmaW5lIFBDSV9DSElQX1IyMDBfUU0JCTB4NTE0RAorI2RlZmluZSBQQ0lfQ0hJUF9SMjAwX1FOCQkweDUxNEUKKyNkZWZpbmUgUENJX0NISVBfUjIwMF9RTwkJMHg1MTRGCisjZGVmaW5lIFBDSV9DSElQX1JWMjAwX1FXCQkweDUxNTcKKyNkZWZpbmUgUENJX0NISVBfUlYyMDBfUVgJCTB4NTE1OAorI2RlZmluZSBQQ0lfQ0hJUF9SVjEwMF9RWQkJMHg1MTU5CisjZGVmaW5lIFBDSV9DSElQX1JWMTAwX1FaCQkweDUxNUEKKyNkZWZpbmUgUENJX0NISVBfUk41MAkJCTB4NTE1RQorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UkUJCTB4NTI0NQorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UkYJCTB4NTI0NgorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UkcJCTB4NTI0NworI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UksJCTB4NTI0QgorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4UkwJCTB4NTI0QworI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4U0UJCTB4NTM0NQorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4U0YJCTB4NTM0NgorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4U0cJCTB4NTM0NworI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4U0gJCTB4NTM0OAorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4U0sJCTB4NTM0QgorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4U0wJCTB4NTM0QworI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4U00JCTB4NTM0RAorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4U04JCTB4NTM0RQorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4VEYJCTB4NTQ0NgorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4VEwJCTB4NTQ0QworI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4VFIJCTB4NTQ1MgorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4VFMJCTB4NTQ1MworI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4VFQJCTB4NTQ1NAorI2RlZmluZSBQQ0lfQ0hJUF9SQUdFMTI4VFUJCTB4NTQ1NQorI2RlZmluZSBQQ0lfQ0hJUF9SVjM3MF81NDYwICAgICAgICAgICAgIDB4NTQ2MAorI2RlZmluZSBQQ0lfQ0hJUF9SVjM3MF81NDYxICAgICAgICAgICAgIDB4NTQ2MQorI2RlZmluZSBQQ0lfQ0hJUF9SVjM3MF81NDYyICAgICAgICAgICAgIDB4NTQ2MgorI2RlZmluZSBQQ0lfQ0hJUF9SVjM3MF81NDYzICAgICAgICAgICAgIDB4NTQ2MworI2RlZmluZSBQQ0lfQ0hJUF9SVjM3MF81NDY0ICAgICAgICAgICAgIDB4NTQ2NAorI2RlZmluZSBQQ0lfQ0hJUF9SVjM3MF81NDY1ICAgICAgICAgICAgIDB4NTQ2NQorI2RlZmluZSBQQ0lfQ0hJUF9SVjM3MF81NDY2ICAgICAgICAgICAgIDB4NTQ2NgorI2RlZmluZSBQQ0lfQ0hJUF9SVjM3MF81NDY3ICAgICAgICAgICAgIDB4NTQ2NworI2RlZmluZSBQQ0lfQ0hJUF9SNDIzX1VIICAgICAgICAgICAgICAgIDB4NTU0OAorI2RlZmluZSBQQ0lfQ0hJUF9SNDIzX1VJICAgICAgICAgICAgICAgIDB4NTU0OQorI2RlZmluZSBQQ0lfQ0hJUF9SNDIzX1VKICAgICAgICAgICAgICAgIDB4NTU0QQorI2RlZmluZSBQQ0lfQ0hJUF9SNDIzX1VLICAgICAgICAgICAgICAgIDB4NTU0QgorI2RlZmluZSBQQ0lfQ0hJUF9SNDIzX1VRICAgICAgICAgICAgICAgIDB4NTU1MQorI2RlZmluZSBQQ0lfQ0hJUF9SNDIzX1VSICAgICAgICAgICAgICAgIDB4NTU1MgorI2RlZmluZSBQQ0lfQ0hJUF9SNDIzX1VUICAgICAgICAgICAgICAgIDB4NTU1NAorI2RlZmluZSBQQ0lfQ0hJUF9NQUNINjRWVAkJMHg1NjU0CisjZGVmaW5lIFBDSV9DSElQX01BQ0g2NFZVCQkweDU2NTUKKyNkZWZpbmUgUENJX0NISVBfTUFDSDY0VlYJCTB4NTY1NgorI2RlZmluZSBQQ0lfQ0hJUF9SUzMwMF81ODM0CQkweDU4MzQKKyNkZWZpbmUgUENJX0NISVBfUlMzMDBfNTgzNQkJMHg1ODM1CisjZGVmaW5lIFBDSV9DSElQX1JTMzAwXzU4MzYJCTB4NTgzNgorI2RlZmluZSBQQ0lfQ0hJUF9SUzMwMF81ODM3CQkweDU4MzcKKyNkZWZpbmUgUENJX0NISVBfUlYzNzBfNUI2MCAgICAgICAgICAgICAweDVCNjAKKyNkZWZpbmUgUENJX0NISVBfUlYzNzBfNUI2MSAgICAgICAgICAgICAweDVCNjEKKyNkZWZpbmUgUENJX0NISVBfUlYzNzBfNUI2MiAgICAgICAgICAgICAweDVCNjIKKyNkZWZpbmUgUENJX0NISVBfUlYzNzBfNUI2MyAgICAgICAgICAgICAweDVCNjMKKyNkZWZpbmUgUENJX0NISVBfUlYzNzBfNUI2NCAgICAgICAgICAgICAweDVCNjQKKyNkZWZpbmUgUENJX0NISVBfUlYzNzBfNUI2NSAgICAgICAgICAgICAweDVCNjUKKyNkZWZpbmUgUENJX0NISVBfUlYzNzBfNUI2NiAgICAgICAgICAgICAweDVCNjYKKyNkZWZpbmUgUENJX0NISVBfUlYzNzBfNUI2NyAgICAgICAgICAgICAweDVCNjcKKyNkZWZpbmUgUENJX0NISVBfUlYyODBfNTk2MAkJMHg1OTYwCisjZGVmaW5lIFBDSV9DSElQX1JWMjgwXzU5NjEJCTB4NTk2MQorI2RlZmluZSBQQ0lfQ0hJUF9SVjI4MF81OTYyCQkweDU5NjIKKyNkZWZpbmUgUENJX0NISVBfUlYyODBfNTk2NAkJMHg1OTY0CisjZGVmaW5lIFBDSV9DSElQX1JWMjgwXzVDNjEJCTB4NUM2MQorI2RlZmluZSBQQ0lfQ0hJUF9SVjI4MF81QzYzCQkweDVDNjMKKyNkZWZpbmUgUENJX0NISVBfUjQyM181RDU3ICAgICAgICAgICAgICAweDVENTcKKyNkZWZpbmUgUENJX0NISVBfUlMzNTBfNzgzNCAgICAgICAgICAgICAweDc4MzQKKyNkZWZpbmUgUENJX0NISVBfUlMzNTBfNzgzNSAgICAgICAgICAgICAweDc4MzUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRpX3JhZGVvbl9mYi5jIGIvZHJpdmVycy9hdGlfcmFkZW9uX2ZiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE3NGYzNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYXRpX3JhZGVvbl9mYi5jCkBAIC0wLDAgKzEsNDg2IEBACisvKgorICogQVRJIFJhZGVvbiBWaWRlbyBjYXJkIEZyYW1lYnVmZmVyIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogWmhhbmcgV2VpIDx3ZWkuemhhbmdAZnJlZXNjYWxlLmNvbT4KKyAqIEphc29uIEppbiA8amFzb24uamluQGZyZWVzY2FsZS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogU29tZSBjb2RlcyBvZiB0aGlzIGZpbGUgaXMgcGFydGx5IHBvcnRlZCBmcm9tIExpbnV4IGtlcm5lbAorICogQVRJIHZpZGVvIGZyYW1lYnVmZmVyIGRyaXZlci4KKyAqCisgKiBOb3cgdGhlIGRyaXZlciBpcyB0ZXN0ZWQgb24gYmVsb3cgQVRJIGNoaXBzOgorICogICA5MjAwCisgKiAgIFgzMDAKKyAqICAgWDcwMAorICoKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDT05GSUdfQVRJX1JBREVPTl9GQgorCisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPHBjaS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDx2aWRlb19mYi5oPgorCisjaW5jbHVkZSA8cmFkZW9uLmg+CisjaW5jbHVkZSAiYXRpX2lkcy5oIgorI2luY2x1ZGUgImF0aV9yYWRlb25fZmIuaCIKKworI3VuZGVmIERFQlVHCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBEUFJJTlQoeC4uLikgcHJpbnRmKHgpCisjZWxzZQorI2RlZmluZSBEUFJJTlQoeC4uLikgZG97fXdoaWxlKDApCisjZW5kaWYKKworI2lmbmRlZiBtaW5fdAorI2RlZmluZSBtaW5fdCh0eXBlLHgseSkgXAorCSh7IHR5cGUgX194ID0gKHgpOyB0eXBlIF9feSA9ICh5KTsgX194IDwgX195ID8gX194OiBfX3k7IH0pCisjZW5kaWYKKworI2RlZmluZSBNQVhfTUFQUEVEX1ZSQU0JKDIwNDgqMjA0OCo0KQorI2RlZmluZSBNSU5fTUFQUEVEX1ZSQU0JKDEwMjQqNzY4KjEpCisKKy8qI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FUSSovCisjZGVmaW5lIFBDSV9DSElQX1JWMjgwXzU5NjAJCTB4NTk2MAorI2RlZmluZSBQQ0lfQ0hJUF9SVjI4MF81OTYxCQkweDU5NjEKKyNkZWZpbmUgUENJX0NISVBfUlYyODBfNTk2MgkJMHg1OTYyCisjZGVmaW5lIFBDSV9DSElQX1JWMjgwXzU5NjQJCTB4NTk2NAorI2RlZmluZSBQQ0lfQ0hJUF9SVjM3MF81QjYwCQkweDVCNjAKKyNkZWZpbmUgUENJX0NISVBfUlYzODBfNTY1NwkJMHg1NjU3CisjZGVmaW5lIFBDSV9DSElQX1I0MjBfNTU0ZAkJMHg1NTRkCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhdGlfcmFkZW9uX3BjaV9pZHNbXSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9BVEksIFBDSV9DSElQX1JWMjgwXzU5NjB9LAorCXtQQ0lfVkVORE9SX0lEX0FUSSwgUENJX0NISVBfUlYyODBfNTk2MX0sCisJe1BDSV9WRU5ET1JfSURfQVRJLCBQQ0lfQ0hJUF9SVjI4MF81OTYyfSwKKwl7UENJX1ZFTkRPUl9JRF9BVEksIFBDSV9DSElQX1JWMjgwXzU5NjR9LAorCXtQQ0lfVkVORE9SX0lEX0FUSSwgUENJX0NISVBfUlYzNzBfNUI2MH0sCisJe1BDSV9WRU5ET1JfSURfQVRJLCBQQ0lfQ0hJUF9SVjM4MF81NjU3fSwKKwl7UENJX1ZFTkRPUl9JRF9BVEksIFBDSV9DSElQX1I0MjBfNTU0ZH0sCisJezAsIDB9Cit9OworCitzdGF0aWMgdTE2IGF0aV9yYWRlb25faWRfZmFtaWx5X3RhYmxlW11bMl0gPSB7CisJe1BDSV9DSElQX1JWMjgwXzU5NjAsIENISVBfRkFNSUxZX1JWMjgwfSwKKwl7UENJX0NISVBfUlYyODBfNTk2MSwgQ0hJUF9GQU1JTFlfUlYyODB9LAorCXtQQ0lfQ0hJUF9SVjI4MF81OTYyLCBDSElQX0ZBTUlMWV9SVjI4MH0sCisJe1BDSV9DSElQX1JWMjgwXzU5NjQsIENISVBfRkFNSUxZX1JWMjgwfSwKKwl7UENJX0NISVBfUlYzNzBfNUI2MCwgQ0hJUF9GQU1JTFlfUlYzODB9LAorCXtQQ0lfQ0hJUF9SVjM4MF81NjU3LCBDSElQX0ZBTUlMWV9SVjM4MH0sCisJe1BDSV9DSElQX1I0MjBfNTU0ZCwgIENISVBfRkFNSUxZX1I0MjB9LAorCXswLCAwfQorfTsKKwordTE2IGdldF9yYWRlb25faWRfZmFtaWx5KHUxNiBkZXZpY2UpCit7CisJaW50IGk7CisJZm9yIChpPTA7IGF0aV9yYWRlb25faWRfZmFtaWx5X3RhYmxlWzBdW2ldOyBpKz0yKQorCQlpZiAoYXRpX3JhZGVvbl9pZF9mYW1pbHlfdGFibGVbMF1baV0gPT0gZGV2aWNlKQorCQkJcmV0dXJuIGF0aV9yYWRlb25faWRfZmFtaWx5X3RhYmxlWzBdW2kgKyAxXTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHJhZGVvbmZiX2luZm8gKnJpbmZvOworCitzdGF0aWMgdm9pZCByYWRlb25faWRlbnRpZnlfdnJhbShzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqcmluZm8pCit7CisJdTMyIHRtcDsKKworCS8qIGZyYW1lYnVmZmVyIHNpemUgKi8KKwlpZiAoKHJpbmZvLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlMxMDApIHx8CisJCShyaW5mby0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1JTMjAwKSB8fAorCQkocmluZm8tPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SUzMwMCkpIHsKKwkJdTMyIHRvbSA9IElOUkVHKE5CX1RPTSk7CisJCXRtcCA9ICgoKCh0b20gPj4gMTYpIC0gKHRvbSAmIDB4ZmZmZikgKyAxKSA8PCA2KSAqIDEwMjQpOworCisJCXJhZGVvbl9maWZvX3dhaXQoNik7CisJCU9VVFJFRyhNQ19GQl9MT0NBVElPTiwgdG9tKTsKKwkJT1VUUkVHKERJU1BMQVlfQkFTRV9BRERSLCAodG9tICYgMHhmZmZmKSA8PCAxNik7CisJCU9VVFJFRyhDUlRDMl9ESVNQTEFZX0JBU0VfQUREUiwgKHRvbSAmIDB4ZmZmZikgPDwgMTYpOworCQlPVVRSRUcoT1YwX0JBU0VfQUREUiwgKHRvbSAmIDB4ZmZmZikgPDwgMTYpOworCisJCS8qIFRoaXMgaXMgc3VwcG9zZWQgdG8gZml4IHRoZSBjcnRjMiBub2lzZSBwcm9ibGVtLiAqLworCQlPVVRSRUcoR1JQSDJfQlVGRkVSX0NOVEwsIElOUkVHKEdSUEgyX0JVRkZFUl9DTlRMKSAmIH4weDdmMDAwMCk7CisKKwkJaWYgKChyaW5mby0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1JTMTAwKSB8fAorCQkJKHJpbmZvLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlMyMDApKSB7CisJCS8qIFRoaXMgaXMgdG8gd29ya2Fyb3VuZCB0aGUgYXNpYyBidWcgZm9yIFJNWCwgc29tZSB2ZXJzaW9ucworCQkgICBvZiBCSU9TIGRvc2VuJ3QgaGF2ZSB0aGlzIHJlZ2lzdGVyIGluaXRpYWxpemVkIGNvcnJlY3RseS4KKwkJKi8KKwkJCU9VVFJFR1AoQ1JUQ19NT1JFX0NOVEwsIENSVENfSF9DVVRPRkZfQUNUSVZFX0VOLAorCQkJCX5DUlRDX0hfQ1VUT0ZGX0FDVElWRV9FTik7CisJCX0KKwl9IGVsc2UgeworCQl0bXAgPSBJTlJFRyhDT05GSUdfTUVNU0laRSk7CisJfQorCisJLyogbWVtIHNpemUgaXMgYml0cyBbMjg6MF0sIG1hc2sgb2ZmIHRoZSByZXN0ICovCisJcmluZm8tPnZpZGVvX3JhbSA9IHRtcCAmIENPTkZJR19NRU1TSVpFX01BU0s7CisKKwkvKgorCSAqIEhhY2sgdG8gZ2V0IGFyb3VuZCBzb21lIGJ1c3RlZCBwcm9kdWN0aW9uIE02J3MKKwkgKiByZXBvcnRpbmcgbm8gcmFtCisJICovCisJaWYgKHJpbmZvLT52aWRlb19yYW0gPT0gMCkgeworCQlzd2l0Y2ggKHJpbmZvLT5wZGV2LmRldmljZSkgeworCQljYXNlIFBDSV9DSElQX1JBREVPTl9MWToKKwkJY2FzZSBQQ0lfQ0hJUF9SQURFT05fTFo6CisJCQlyaW5mby0+dmlkZW9fcmFtID0gODE5MiAqIDEwMjQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyoKKwkgKiBOb3cgdHJ5IHRvIGlkZW50aWZ5IFZSQU0gdHlwZQorCSAqLworCWlmICgocmluZm8tPmZhbWlseSA+PSBDSElQX0ZBTUlMWV9SMzAwKSB8fAorCSAgICAoSU5SRUcoTUVNX1NEUkFNX01PREVfUkVHKSAmICgxPDwzMCkpKQorCQlyaW5mby0+dnJhbV9kZHIgPSAxOworCWVsc2UKKwkJcmluZm8tPnZyYW1fZGRyID0gMDsKKworCXRtcCA9IElOUkVHKE1FTV9DTlRMKTsKKwlpZiAoSVNfUjMwMF9WQVJJQU5UKHJpbmZvKSkgeworCQl0bXAgJj0gIFIzMDBfTUVNX05VTV9DSEFOTkVMU19NQVNLOworCQlzd2l0Y2ggKHRtcCkgeworCQljYXNlIDA6ICByaW5mby0+dnJhbV93aWR0aCA9IDY0OyBicmVhazsKKwkJY2FzZSAxOiAgcmluZm8tPnZyYW1fd2lkdGggPSAxMjg7IGJyZWFrOworCQljYXNlIDI6ICByaW5mby0+dnJhbV93aWR0aCA9IDI1NjsgYnJlYWs7CisJCWRlZmF1bHQ6IHJpbmZvLT52cmFtX3dpZHRoID0gMTI4OyBicmVhazsKKwkJfQorCX0gZWxzZSBpZiAoKHJpbmZvLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlYxMDApIHx8CisJCSAgIChyaW5mby0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1JTMTAwKSB8fAorCQkgICAocmluZm8tPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SUzIwMCkpeworCQlpZiAodG1wICYgUlYxMDBfTUVNX0hBTEZfTU9ERSkKKwkJCXJpbmZvLT52cmFtX3dpZHRoID0gMzI7CisJCWVsc2UKKwkJCXJpbmZvLT52cmFtX3dpZHRoID0gNjQ7CisJfSBlbHNlIHsKKwkJaWYgKHRtcCAmIE1FTV9OVU1fQ0hBTk5FTFNfTUFTSykKKwkJCXJpbmZvLT52cmFtX3dpZHRoID0gMTI4OworCQllbHNlCisJCQlyaW5mby0+dnJhbV93aWR0aCA9IDY0OworCX0KKworCS8qIFRoaXMgbWF5IG5vdCBiZSBjb3JyZWN0LCBhcyBzb21lIGNhcmRzIGNhbiBoYXZlIGhhbGYgb2YgY2hhbm5lbCBkaXNhYmxlZAorCSAqIFRvRG86IGlkZW50aWZ5IHRoZXNlIGNhc2VzCisJICovCisKKwlEUFJJTlQoInJhZGVvbmZiOiBGb3VuZCAlbGRrIG9mICVzICVkIGJpdHMgd2lkZSB2aWRlb3JhbVxuIiwKKwkgICAgICAgcmluZm8tPnZpZGVvX3JhbSAvIDEwMjQsCisJICAgICAgIHJpbmZvLT52cmFtX2RkciA/ICJERFIiIDogIlNEUkFNIiwKKwkgICAgICAgcmluZm8tPnZyYW1fd2lkdGgpOworCit9CisKK3N0YXRpYyB2b2lkIHJhZGVvbl93cml0ZV9wbGxfcmVncyhzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqcmluZm8sIHN0cnVjdCByYWRlb25fcmVncyAqbW9kZSkKK3sKKwlpbnQgaTsKKworCXJhZGVvbl9maWZvX3dhaXQoMjApOworCisjaWYgMAorCS8qIFdvcmthcm91bmQgZnJvbSBYRnJlZSAqLworCWlmIChyaW5mby0+aXNfbW9iaWxpdHkpIHsKKwkJLyogQSB0ZW1wb3JhbCB3b3JrYXJvdW5kIGZvciB0aGUgb2NjYXRpb25hbCBibGFua2luZyBvbiBjZXJ0YWluIGxhcHRvcAorCQkgKiBwYW5lbHMuIFRoaXMgYXBwZWFycyB0byByZWxhdGVkIHRvIHRoZSBQTEwgZGl2aWRlciByZWdpc3RlcnMKKwkJICogKGZhaWwgdG8gbG9jaz8pLiBJdCBvY2N1cnMgZXZlbiB3aGVuIGFsbCBkaXZpZGVycyBhcmUgdGhlIHNhbWUKKwkJICogd2l0aCB0aGVpciBvbGQgc2V0dGluZ3MuIEluIHRoaXMgY2FzZSB3ZSByZWFsbHkgZG9uJ3QgbmVlZCB0bworCQkgKiBmaWRkbGUgd2l0aCBQTEwgcmVnaXN0ZXJzLiBCeSBkb2luZyB0aGlzIHdlIGNhbiBhdm9pZCB0aGUgYmxhbmtpbmcKKwkJICogcHJvYmxlbSB3aXRoIHNvbWUgcGFuZWxzLgorCQkgKi8KKwkJaWYgKChtb2RlLT5wcGxsX3JlZl9kaXYgPT0gKElOUExMKFBQTExfUkVGX0RJVikgJiBQUExMX1JFRl9ESVZfTUFTSykpICYmCisJCSAgICAobW9kZS0+cHBsbF9kaXZfMyA9PSAoSU5QTEwoUFBMTF9ESVZfMykgJgorCQkJCQkgIChQUExMX1BPU1QzX0RJVl9NQVNLIHwgUFBMTF9GQjNfRElWX01BU0spKSkpIHsKKwkJCS8qIFdlIHN0aWxsIGhhdmUgdG8gZm9yY2UgYSBzd2l0Y2ggdG8gc2VsZWN0ZWQgUFBMTCBkaXYgdGhhbmtzIHRvCisJCQkgKiBhbiBYRnJlZTg2IGRyaXZlciBidWcgd2hpY2ggd2lsbCBzd2l0Y2ggaXQgYXdheSBpbiBzb21lIGNhc2VzCisJCQkgKiBldmVuIHdoZW4gdXNpbmcgVXNlRkRldiAqLworCQkJT1VUUkVHUChDTE9DS19DTlRMX0lOREVYLAorCQkJCW1vZGUtPmNsa19jbnRsX2luZGV4ICYgUFBMTF9ESVZfU0VMX01BU0ssCisJCQkJflBQTExfRElWX1NFTF9NQVNLKTsKKwkJCXJhZGVvbl9wbGxfZXJyYXRhX2FmdGVyX2luZGV4KHJpbmZvKTsKKwkJCXJhZGVvbl9wbGxfZXJyYXRhX2FmdGVyX2RhdGEocmluZm8pOworCQkJcmV0dXJuOworCQl9CisJfQorI2VuZGlmCisJaWYocmluZm8tPnBkZXYuZGV2aWNlID09IFBDSV9DSElQX1JWMzcwXzVCNjApIHJldHVybjsKKworCS8qIFN3aWNoIFZDS0wgY2xvY2sgaW5wdXQgdG8gQ1BVQ0xLIHNvIGl0IHN0YXlzIGZlZCB3aGlsZSBQUExMIHVwZGF0ZXMqLworCU9VVFBMTFAoVkNMS19FQ1BfQ05UTCwgVkNMS19TUkNfU0VMX0NQVUNMSywgflZDTEtfU1JDX1NFTF9NQVNLKTsKKworCS8qIFJlc2V0IFBQTEwgJiBlbmFibGUgYXRvbWljIHVwZGF0ZSAqLworCU9VVFBMTFAoUFBMTF9DTlRMLAorCQlQUExMX1JFU0VUIHwgUFBMTF9BVE9NSUNfVVBEQVRFX0VOIHwgUFBMTF9WR0FfQVRPTUlDX1VQREFURV9FTiwKKwkJfihQUExMX1JFU0VUIHwgUFBMTF9BVE9NSUNfVVBEQVRFX0VOIHwgUFBMTF9WR0FfQVRPTUlDX1VQREFURV9FTikpOworCisJLyogU3dpdGNoIHRvIHNlbGVjdGVkIFBQTEwgZGl2aWRlciAqLworCU9VVFJFR1AoQ0xPQ0tfQ05UTF9JTkRFWCwKKwkJbW9kZS0+Y2xrX2NudGxfaW5kZXggJiBQUExMX0RJVl9TRUxfTUFTSywKKwkJflBQTExfRElWX1NFTF9NQVNLKTsKKworCS8qIFNldCBQUExMIHJlZi4gZGl2ICovCisJaWYgKHJpbmZvLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUjMwMCB8fAorCSAgICByaW5mby0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1JTMzAwIHx8CisJICAgIHJpbmZvLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUjM1MCB8fAorCSAgICByaW5mby0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1JWMzUwKSB7CisJCWlmIChtb2RlLT5wcGxsX3JlZl9kaXYgJiBSMzAwX1BQTExfUkVGX0RJVl9BQ0NfTUFTSykgeworCQkJLyogV2hlbiByZXN0b3JpbmcgY29uc29sZSBtb2RlLCB1c2Ugc2F2ZWQgUFBMTF9SRUZfRElWCisJCQkgKiBzZXR0aW5nLgorCQkJICovCisJCQlPVVRQTExQKFBQTExfUkVGX0RJViwgbW9kZS0+cHBsbF9yZWZfZGl2LCAwKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFIzMDAgdXNlcyByZWZfZGl2X2FjYyBmaWVsZCBhcyByZWFsIHJlZiBkaXZpZGVyICovCisJCQlPVVRQTExQKFBQTExfUkVGX0RJViwKKwkJCQkobW9kZS0+cHBsbF9yZWZfZGl2IDw8IFIzMDBfUFBMTF9SRUZfRElWX0FDQ19TSElGVCksCisJCQkJflIzMDBfUFBMTF9SRUZfRElWX0FDQ19NQVNLKTsKKwkJfQorCX0gZWxzZQorCQlPVVRQTExQKFBQTExfUkVGX0RJViwgbW9kZS0+cHBsbF9yZWZfZGl2LCB+UFBMTF9SRUZfRElWX01BU0spOworCisJLyogU2V0IFBQTEwgZGl2aWRlciAzICYgcG9zdCBkaXZpZGVyKi8KKwlPVVRQTExQKFBQTExfRElWXzMsIG1vZGUtPnBwbGxfZGl2XzMsIH5QUExMX0ZCM19ESVZfTUFTSyk7CisJT1VUUExMUChQUExMX0RJVl8zLCBtb2RlLT5wcGxsX2Rpdl8zLCB+UFBMTF9QT1NUM19ESVZfTUFTSyk7CisKKwkvKiBXcml0ZSB1cGRhdGUgKi8KKwl3aGlsZSAoSU5QTEwoUFBMTF9SRUZfRElWKSAmIFBQTExfQVRPTUlDX1VQREFURV9SKQorCQk7CisJT1VUUExMUChQUExMX1JFRl9ESVYsIFBQTExfQVRPTUlDX1VQREFURV9XLCB+UFBMTF9BVE9NSUNfVVBEQVRFX1cpOworCisJLyogV2FpdCByZWFkIHVwZGF0ZSBjb21wbGV0ZSAqLworCS8qIEZJWE1FOiBDZXJ0YWluIHJldmlzaW9ucyBvZiBSMzAwIGNhbid0IHJlY292ZXIgaGVyZS4gIE5vdCBzdXJlIG9mCisJICAgdGhlIGNhdXNlIHlldCwgYnV0IHRoaXMgd29ya2Fyb3VuZCB3aWxsIG1hc2sgdGhlIHByb2JsZW0gZm9yIG5vdy4KKwkgICBPdGhlciBjaGlwcyB1c3VhbGx5IHdpbGwgcGFzcyBhdCB0aGUgdmVyeSBmaXJzdCB0ZXN0LCBzbyB0aGUKKwkgICB3b3JrYXJvdW5kIHNob3VsZG4ndCBoYXZlIGFueSBlZmZlY3Qgb24gdGhlbS4gKi8KKwlmb3IgKGkgPSAwOyAoaSA8IDEwMDAwICYmIElOUExMKFBQTExfUkVGX0RJVikgJiBQUExMX0FUT01JQ19VUERBVEVfUik7IGkrKykKKwkJOworCisJT1VUUExMKEhUT1RBTF9DTlRMLCAwKTsKKworCS8qIENsZWFyIHJlc2V0ICYgYXRvbWljIHVwZGF0ZSAqLworCU9VVFBMTFAoUFBMTF9DTlRMLCAwLAorCQl+KFBQTExfUkVTRVQgfCBQUExMX1NMRUVQIHwgUFBMTF9BVE9NSUNfVVBEQVRFX0VOIHwgUFBMTF9WR0FfQVRPTUlDX1VQREFURV9FTikpOworCisJLyogV2UgbWF5IHdhbnQgc29tZSBsb2NraW5nIC4uLiBvaCB3ZWxsICovCisJdWRlbGF5KDUwMDApOworCisJLyogU3dpdGNoIGJhY2sgVkNMSyBzb3VyY2UgdG8gUFBMTCAqLworCU9VVFBMTFAoVkNMS19FQ1BfQ05UTCwgVkNMS19TUkNfU0VMX1BQTExDTEssIH5WQ0xLX1NSQ19TRUxfTUFTSyk7Cit9CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYgcmVnOworCXUzMiB2YWw7Cit9IHJlZ192YWw7CisKKworLyogdGhlc2UgY29tbW9uIHJlZ3MgYXJlIGNsZWFyZWQgYmVmb3JlIG1vZGUgc2V0dGluZyBzbyB0aGV5IGRvIG5vdAorICogaW50ZXJmZXJlIHdpdGggYW55dGhpbmcKKyAqLworc3RhdGljIHJlZ192YWwgY29tbW9uX3JlZ3NbXSA9IHsKKwl7IE9WUl9DTFIsIDAgfSwKKwl7IE9WUl9XSURfTEVGVF9SSUdIVCwgMCB9LAorCXsgT1ZSX1dJRF9UT1BfQk9UVE9NLCAwIH0sCisJeyBPVjBfU0NBTEVfQ05UTCwgMCB9LAorCXsgU1VCUElDX0NOVEwsIDAgfSwKKwl7IFZJUEhfQ09OVFJPTCwgMCB9LAorCXsgSTJDX0NOVExfMSwgMCB9LAorCXsgR0VOX0lOVF9DTlRMLCAwIH0sCisJeyBDQVAwX1RSSUdfQ05UTCwgMCB9LAorCXsgQ0FQMV9UUklHX0NOVEwsIDAgfSwKK307CisKKwordm9pZCByYWRlb25fc2V0bW9kZSh2b2lkKQoreworCWludCBpOworCXN0cnVjdCByYWRlb25fcmVncyAqbW9kZSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHJhZGVvbl9yZWdzKSk7CisKKwltb2RlLT5jcnRjX2dlbl9jbnRsID0gMHgwMzAwMDIwMDsKKwltb2RlLT5jcnRjX2V4dF9jbnRsID0gMHgwMDAwODA0ODsKKwltb2RlLT5kYWNfY250bCA9IDB4ZmYwMDIxMDA7CisJbW9kZS0+Y3J0Y19oX3RvdGFsX2Rpc3AgPSAweDRmMDA2MzsKKwltb2RlLT5jcnRjX2hfc3luY19zdHJ0X3dpZCA9IDB4OGMwMmEyOworCW1vZGUtPmNydGNfdl90b3RhbF9kaXNwID0gMHgwMWRmMDIwYzsKKwltb2RlLT5jcnRjX3Zfc3luY19zdHJ0X3dpZCA9IDB4ODIwMWVhOworCW1vZGUtPmNydGNfcGl0Y2ggPSAweDAwNTAwMDUwOworCisJT1VUUkVHKENSVENfR0VOX0NOVEwsIG1vZGUtPmNydGNfZ2VuX2NudGwpOworCU9VVFJFR1AoQ1JUQ19FWFRfQ05UTCwgbW9kZS0+Y3J0Y19leHRfY250bCwKKwkJfihDUlRDX0hTWU5DX0RJUyB8IENSVENfVlNZTkNfRElTIHwgQ1JUQ19ESVNQTEFZX0RJUykpOworCU9VVFJFR1AoREFDX0NOVEwsIG1vZGUtPmRhY19jbnRsLCBEQUNfUkFOR0VfQ05UTCB8IERBQ19CTEFOS0lORyk7CisJT1VUUkVHKENSVENfSF9UT1RBTF9ESVNQLCBtb2RlLT5jcnRjX2hfdG90YWxfZGlzcCk7CisJT1VUUkVHKENSVENfSF9TWU5DX1NUUlRfV0lELCBtb2RlLT5jcnRjX2hfc3luY19zdHJ0X3dpZCk7CisJT1VUUkVHKENSVENfVl9UT1RBTF9ESVNQLCBtb2RlLT5jcnRjX3ZfdG90YWxfZGlzcCk7CisJT1VUUkVHKENSVENfVl9TWU5DX1NUUlRfV0lELCBtb2RlLT5jcnRjX3Zfc3luY19zdHJ0X3dpZCk7CisJT1VUUkVHKENSVENfT0ZGU0VULCAwKTsKKwlPVVRSRUcoQ1JUQ19PRkZTRVRfQ05UTCwgMCk7CisJT1VUUkVHKENSVENfUElUQ0gsIG1vZGUtPmNydGNfcGl0Y2gpOworCisJbW9kZS0+Y2xrX2NudGxfaW5kZXggPSAweDMwMDsKKwltb2RlLT5wcGxsX3JlZl9kaXYgPSAweGM7CisJbW9kZS0+cHBsbF9kaXZfMyA9IDB4MDAwMzAwNTk7CisKKwlyYWRlb25fd3JpdGVfcGxsX3JlZ3MocmluZm8sIG1vZGUpOworfQorCitpbnQgcmFkZW9uX3Byb2JlKHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbykKK3sKKwlwY2lfZGV2X3QgcGRldjsKKwl1MTYgZGlkOworCisJcGRldiA9IHBjaV9maW5kX2RldmljZXMoYXRpX3JhZGVvbl9wY2lfaWRzLCAwKTsKKworCWlmIChwZGV2ICE9IC0xKSB7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9ERVZJQ0VfSUQsICZkaWQpOworCQlwcmludGYoIkFUSSBSYWRlb24gdmlkZW8gY2FyZCAoJTA0eCwgJTA0eCkgZm91bmQgQCglZDolZDolZClcbiIsCisJCQkJUENJX1ZFTkRPUl9JRF9BVEksIGRpZCwgKHBkZXYgPj4gMTYpICYgMHhmZiwKKwkJCQkocGRldiA+PiAxMSkgJiAweDFmLCAocGRldiA+PiA4KSAmIDB4Nyk7CisKKwkJc3RyY3B5KHJpbmZvLT5uYW1lLCAiQVRJIFJhZGVvbiIpOworCQlyaW5mby0+cGRldi52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0FUSTsKKwkJcmluZm8tPnBkZXYuZGV2aWNlID0gZGlkOworCQlyaW5mby0+ZmFtaWx5ID0gZ2V0X3JhZGVvbl9pZF9mYW1pbHkocmluZm8tPnBkZXYuZGV2aWNlKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCwKKwkJCQkmcmluZm8tPmZiX2Jhc2VfcGh5cyk7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzIsCisJCQkJJnJpbmZvLT5tbWlvX2Jhc2VfcGh5cyk7CisJCXJpbmZvLT5mYl9iYXNlX3BoeXMgJj0gMHhmZmZmZjAwMDsKKwkJcmluZm8tPm1taW9fYmFzZV9waHlzICY9IH4weDA0OworCisJCXJpbmZvLT5tbWlvX2Jhc2UgPSAodm9pZCAqKXJpbmZvLT5tbWlvX2Jhc2VfcGh5czsKKwkJRFBSSU5UKCJyaW5mby0+bW1pb19iYXNlID0gMHgleFxuIixyaW5mby0+bW1pb19iYXNlKTsKKwkJcmluZm8tPmZiX2xvY2FsX2Jhc2UgPSBJTlJFRyhNQ19GQl9MT0NBVElPTikgPDwgMTY7CisJCURQUklOVCgicmluZm8tPmZiX2xvY2FsX2Jhc2UgPSAweCV4XG4iLHJpbmZvLT5mYl9sb2NhbF9iYXNlKTsKKwkJLyogUG9zdEJJT1Mgd2l0aCB4ODYgZW11bGF0ZXIgKi8KKwkJQm9vdFZpZGVvQ2FyZEJJT1MocGRldiwgTlVMTCwgMCk7CisKKwkJLyoKKwkJICogQ2hlY2sgZm9yIGVycmF0YQorCQkgKiAoVGhlc2Ugd2lsbCBiZSBhZGRlZCBpbiB0aGUgZnV0dXJlIGZvciB0aGUgY2hpcGZhbWlseQorCQkgKiBSMzAwLCBSVjIwMCwgUlMyMDAsIFJWMTAwLCBSUzEwMC4pCisJCSAqLworCisJCS8qIEdldCBWUkFNIHNpemUgYW5kIHR5cGUgKi8KKwkJcmFkZW9uX2lkZW50aWZ5X3ZyYW0ocmluZm8pOworCisJCXJpbmZvLT5tYXBwZWRfdnJhbSA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIE1BWF9NQVBQRURfVlJBTSwKKwkJCQlyaW5mby0+dmlkZW9fcmFtKTsKKwkJcmluZm8tPmZiX2Jhc2UgPSAodm9pZCAqKXJpbmZvLT5mYl9iYXNlX3BoeXM7CisKKwkJRFBSSU5UKCJSYWRlb246IGZyYW1lYnVmZmVyIGJhc2UgcGh5IGFkZHJlc3MgMHglMDh4LCIgXAorCQkgICAgICAiTU1JTyBiYXNlIHBoeSBhZGRyZXNzIDB4JTA4eCwiIFwKKwkJICAgICAgImZyYW1lYnVmZmVyIGxvY2FsIGJhc2UgMHglMDh4LlxuICIsCisJCSAgICAgIHJpbmZvLT5mYl9iYXNlX3BoeXMsIHJpbmZvLT5tbWlvX2Jhc2VfcGh5cywKKwkJICAgICAgcmluZm8tPmZiX2xvY2FsX2Jhc2UpOworCisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBUaGUgR3JhcGhpYyBEZXZpY2UKKyAqLworR3JhcGhpY0RldmljZSBjdGZiOworCisjZGVmaW5lIENVUlNPUl9TSVpFCTB4MTAwMAkvKiBpbiBLQnl0ZSBmb3IgSFcgQ3Vyc29yICovCisjZGVmaW5lIFBBVFRFUk5fQURSCShwR0QtPmRwckJhc2UgKyBDVVJTT1JfU0laRSkJLyogcGF0dGVybiBNZW1vcnkgYWZ0ZXIgQ3Vyc29yIE1lbW9yeSAqLworI2RlZmluZSBQQVRURVJOX1NJWkUJOCo4KjQJLyogNCBCeXRlcyBwZXIgUGl4ZWwgOCB4IDggUGl4ZWwgKi8KKyNkZWZpbmUgQUNDRUxNRU1PUlkJKENVUlNPUl9TSVpFICsgUEFUVEVSTl9TSVpFKQkvKiByZXNlcnZlZCBNZW1vcnkgZm9yIEJJVEJsdCBhbmQgaHcgY3Vyc29yICovCisKK3ZvaWQgKnZpZGVvX2h3X2luaXQodm9pZCkKK3sKKwlHcmFwaGljRGV2aWNlICpwR0QgPSAoR3JhcGhpY0RldmljZSAqKSAmIGN0ZmI7CisJaW50IGk7CisJdTMyICp2bTsKKworCXJpbmZvID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmFkZW9uZmJfaW5mbykpOworCisJaWYocmFkZW9uX3Byb2JlKHJpbmZvKSkgeworCQlwcmludGYoIk5vIHJhZGVvbiB2aWRlbyBjYXJkIGZvdW5kIVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIGZpbGwgaW4gR3JhcGhpYyBkZXZpY2Ugc3RydWN0ICovCisJc3ByaW50ZiAocEdELT5tb2RlSWRlbnQsICIlZHglZHglZCAlbGRrSHogJWxkSHoiLCA2NDAsCisJCSA0ODAsIDE2LCAoMTAwMCAvIDEwMDApLAorCQkgKDIwMDAgLyAxMDAwKSk7CisJcHJpbnRmICgiJXNcbiIsIHBHRC0+bW9kZUlkZW50KTsKKworCXBHRC0+d2luU2l6ZVggPSA2NDA7CisJcEdELT53aW5TaXplWSA9IDQ4MDsKKwlwR0QtPnBsblNpemVYID0gNjQwOworCXBHRC0+cGxuU2l6ZVkgPSA0ODA7CisKKwlwR0QtPmdkZkJ5dGVzUFAgPSAxOworCXBHRC0+Z2RmSW5kZXggPSBHREZfXzhCSVRfSU5ERVg7CisKKwlwR0QtPmlzYUJhc2UgPSBDRkdfSVNBX0lPX0JBU0VfQUREUkVTUzsKKwlwR0QtPnBjaUJhc2UgPSByaW5mby0+ZmJfYmFzZV9waHlzOworCXBHRC0+ZnJhbWVBZHJzID0gcmluZm8tPmZiX2Jhc2VfcGh5czsKKwlwR0QtPm1lbVNpemUgPSA2NCAqIDEwMjQgKiAxMDI0OworCisJLyogQ3Vyc29yIFN0YXJ0IEFkZHJlc3MgKi8KKwlwR0QtPmRwckJhc2UgPQorCSAgICAocEdELT53aW5TaXplWCAqIHBHRC0+d2luU2l6ZVkgKiBwR0QtPmdkZkJ5dGVzUFApICsgcmluZm8tPmZiX2Jhc2VfcGh5czsKKwlpZiAoKHBHRC0+ZHByQmFzZSAmIDB4MGZmZikgIT0gMCkgeworCQkvKiBhbGxpZ24gaXQgKi8KKwkJcEdELT5kcHJCYXNlICY9IDB4ZmZmZmYwMDA7CisJCXBHRC0+ZHByQmFzZSArPSAweDAwMDAxMDAwOworCX0KKwlEUFJJTlQgKCJDdXJzb3IgU3RhcnQgJXggUGF0dGVybiBTdGFydCAleFxuIiwgcEdELT5kcHJCYXNlLAorCQlQQVRURVJOX0FEUik7CisJcEdELT52cHJCYXNlID0gcmluZm8tPmZiX2Jhc2VfcGh5czsJLyogRHVtbXkgKi8KKwlwR0QtPmNwckJhc2UgPSByaW5mby0+ZmJfYmFzZV9waHlzOwkvKiBEdW1teSAqLworCS8qIHNldCB1cCBIYXJkd2FyZSAqLworCisJLyogQ2xlYXIgdmlkZW8gbWVtb3J5ICovCisJaSA9IHBHRC0+bWVtU2l6ZSAvIDQ7CisJdm0gPSAodW5zaWduZWQgaW50ICopIHBHRC0+cGNpQmFzZTsKKwl3aGlsZSAoaS0tKQorCQkqdm0rKyA9IDA7CisJLypTZXREcmF3aW5nRW5naW5lIChiaXRzX3Blcl9waXhlbCk7Ki8KKworCXJhZGVvbl9zZXRtb2RlKCk7CisKKwlyZXR1cm4gKCh2b2lkICopIHBHRCk7Cit9CisKK3ZvaWQgdmlkZW9fc2V0X2x1dCAodW5zaWduZWQgaW50IGluZGV4LAkvKiBjb2xvciBudW1iZXIgKi8KKwkgICAgICAgdW5zaWduZWQgY2hhciByLAkvKiByZWQgKi8KKwkgICAgICAgdW5zaWduZWQgY2hhciBnLAkvKiBncmVlbiAqLworCSAgICAgICB1bnNpZ25lZCBjaGFyIGIJLyogYmx1ZSAqLworCSAgICAgICApCit7CisJT1VUUkVHKFBBTEVUVEVfSU5ERVgsIGluZGV4KTsKKwlPVVRSRUcoUEFMRVRURV9EQVRBLCAociA8PCAxNikgfCAoZyA8PCA4KSB8IGIpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0aV9yYWRlb25fZmIuaCBiL2RyaXZlcnMvYXRpX3JhZGVvbl9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YzRiOGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2F0aV9yYWRlb25fZmIuaApAQCAtMCwwICsxLDI4MiBAQAorI2lmbmRlZiBfX0FUSV9SQURFT05fRkJfSAorI2RlZmluZSBfX0FUSV9SQURFT05fRkJfSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNb3N0IG9mIHRoZSBkZWZpbml0aW9ucyBoZXJlIGFyZSBhZGFwdGVkIHJpZ2h0IGZyb20gWEZyZWU4NiAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ2hpcCBmYW1pbGllcy4gTXVzdCBmaXQgaW4gdGhlIGxvdyAxNiBiaXRzIG9mIGEgbG9uZyB3b3JkCisgKi8KK2VudW0gcmFkZW9uX2ZhbWlseSB7CisJQ0hJUF9GQU1JTFlfVU5LTk9XLAorCUNISVBfRkFNSUxZX0xFR0FDWSwKKwlDSElQX0ZBTUlMWV9SQURFT04sCisJQ0hJUF9GQU1JTFlfUlYxMDAsCisJQ0hJUF9GQU1JTFlfUlMxMDAsICAgIC8qIFUxIChJR1AzMjBNKSBvciBBMyAoSUdQMzIwKSovCisJQ0hJUF9GQU1JTFlfUlYyMDAsCisJQ0hJUF9GQU1JTFlfUlMyMDAsICAgIC8qIFUyIChJR1AzMzBNLzM0ME0vMzUwTSkgb3IgQTQgKElHUDMzMC8zNDAvMzQ1LzM1MCksCisJCQkJIFJTMjUwIChJR1AgNzAwMCkgKi8KKwlDSElQX0ZBTUlMWV9SMjAwLAorCUNISVBfRkFNSUxZX1JWMjUwLAorCUNISVBfRkFNSUxZX1JTMzAwLCAgICAvKiBSYWRlb24gOTAwMCBJR1AgKi8KKwlDSElQX0ZBTUlMWV9SVjI4MCwKKwlDSElQX0ZBTUlMWV9SMzAwLAorCUNISVBfRkFNSUxZX1IzNTAsCisJQ0hJUF9GQU1JTFlfUlYzNTAsCisJQ0hJUF9GQU1JTFlfUlYzODAsICAgIC8qIFJWMzcwL1JWMzgwL00yMi9NMjQgKi8KKwlDSElQX0ZBTUlMWV9SNDIwLCAgICAgLyogUjQyMC9SNDIzL00xOCAqLworCUNISVBfRkFNSUxZX0xBU1QsCit9OworCisjZGVmaW5lIElTX1JWMTAwX1ZBUklBTlQocmluZm8pICgoKHJpbmZvKS0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1JWMTAwKSAgfHwgXAorCQkJCSAoKHJpbmZvKS0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1JWMjAwKSAgfHwgXAorCQkJCSAoKHJpbmZvKS0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1JTMTAwKSAgfHwgXAorCQkJCSAoKHJpbmZvKS0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1JTMjAwKSAgfHwgXAorCQkJCSAoKHJpbmZvKS0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1JWMjUwKSAgfHwgXAorCQkJCSAoKHJpbmZvKS0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1JWMjgwKSAgfHwgXAorCQkJCSAoKHJpbmZvKS0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1JTMzAwKSkKKworI2RlZmluZSBJU19SMzAwX1ZBUklBTlQocmluZm8pICgoKHJpbmZvKS0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1IzMDApICB8fCBcCisJCQkJKChyaW5mbyktPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SVjM1MCkgfHwgXAorCQkJCSgocmluZm8pLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUjM1MCkgIHx8IFwKKwkJCQkoKHJpbmZvKS0+ZmFtaWx5ID09IENISVBfRkFNSUxZX1JWMzgwKSB8fCBcCisJCQkJKChyaW5mbyktPmZhbWlseSA9PSBDSElQX0ZBTUlMWV9SNDIwKSkKKworc3RydWN0IHJhZGVvbmZiX2luZm8geworCWNoYXIgbmFtZVsyMF07CisKKwlzdHJ1Y3QgcGNpX2RldmljZV9pZAlwZGV2OworCXUxNiAJCQlmYW1pbHk7CisKKwl1MzIgCQkJZmJfYmFzZV9waHlzOworCXUzMiAJCQltbWlvX2Jhc2VfcGh5czsKKworCXZvaWQgCQkJKm1taW9fYmFzZTsKKwl2b2lkIAkJCSpmYl9iYXNlOworCisJdTMyCQkJdmlkZW9fcmFtOworCXUzMgkJCW1hcHBlZF92cmFtOworCWludAkJCXZyYW1fd2lkdGg7CisJaW50CQkJdnJhbV9kZHI7CisKKwl1MzIgCQkJZmJfbG9jYWxfYmFzZTsKK307CisKKyNkZWZpbmUgSU5SRUc4KGFkZHIpCQlyZWFkYigocmluZm8tPm1taW9fYmFzZSkrYWRkcikKKyNkZWZpbmUgT1VUUkVHOChhZGRyLHZhbCkJd3JpdGViKHZhbCwgKHJpbmZvLT5tbWlvX2Jhc2UpK2FkZHIpCisjZGVmaW5lIElOUkVHMTYoYWRkcikJCXJlYWR3KChyaW5mby0+bW1pb19iYXNlKSthZGRyKQorI2RlZmluZSBPVVRSRUcxNihhZGRyLHZhbCkJd3JpdGV3KHZhbCwgKHJpbmZvLT5tbWlvX2Jhc2UpK2FkZHIpCisjZGVmaW5lIElOUkVHKGFkZHIpCQlyZWFkbCgocmluZm8tPm1taW9fYmFzZSkrYWRkcikKKyNkZWZpbmUgT1VUUkVHKGFkZHIsdmFsKQl3cml0ZWwodmFsLCAocmluZm8tPm1taW9fYmFzZSkrYWRkcikKKworc3RhdGljIGlubGluZSB2b2lkIF9PVVRSRUdQKHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbywgdTMyIGFkZHIsCisJCSAgICAgICB1MzIgdmFsLCB1MzIgbWFzaykKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJdG1wID0gSU5SRUcoYWRkcik7CisJdG1wICY9IChtYXNrKTsKKwl0bXAgfD0gKHZhbCk7CisJT1VUUkVHKGFkZHIsIHRtcCk7Cit9CisKKyNkZWZpbmUgT1VUUkVHUChhZGRyLHZhbCxtYXNrKQlfT1VUUkVHUChyaW5mbywgYWRkciwgdmFsLG1hc2spCisKKy8qCisgKiAyRCBFbmdpbmUgaGVscGVyIHJvdXRpbmVzCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByYWRlb25fZW5naW5lX2ZsdXNoIChzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqcmluZm8pCit7CisJaW50IGk7CisKKwkvKiBpbml0aWF0ZSBmbHVzaCAqLworCU9VVFJFR1AoUkIyRF9EU1RDQUNIRV9DVExTVEFULCBSQjJEX0RDX0ZMVVNIX0FMTCwKKwkgICAgICAgIH5SQjJEX0RDX0ZMVVNIX0FMTCk7CisKKwlmb3IgKGk9MDsgaSA8IDIwMDAwMDA7IGkrKykgeworCQlpZiAoIShJTlJFRyhSQjJEX0RTVENBQ0hFX0NUTFNUQVQpICYgUkIyRF9EQ19CVVNZKSkKKwkJCXJldHVybjsKKwkJdWRlbGF5KDEpOworCX0KKwlwcmludGYoInJhZGVvbmZiOiBGbHVzaCBUaW1lb3V0ICFcbiIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX3JhZGVvbl9maWZvX3dhaXQoc3RydWN0IHJhZGVvbmZiX2luZm8gKnJpbmZvLCBpbnQgZW50cmllcykKK3sKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpPDIwMDAwMDA7IGkrKykgeworCQlpZiAoKElOUkVHKFJCQk1fU1RBVFVTKSAmIDB4N2YpID49IGVudHJpZXMpCisJCQlyZXR1cm47CisJCXVkZWxheSgxKTsKKwl9CisJcHJpbnRmKCJyYWRlb25mYjogRklGTyBUaW1lb3V0ICFcbiIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX3JhZGVvbl9lbmdpbmVfaWRsZShzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqcmluZm8pCit7CisJaW50IGk7CisKKwkvKiBlbnN1cmUgRklGTyBpcyBlbXB0eSBiZWZvcmUgd2FpdGluZyBmb3IgaWRsZSAqLworCV9yYWRlb25fZmlmb193YWl0IChyaW5mbywgNjQpOworCisJZm9yIChpPTA7IGk8MjAwMDAwMDsgaSsrKSB7CisJCWlmICgoKElOUkVHKFJCQk1fU1RBVFVTKSAmIEdVSV9BQ1RJVkUpKSA9PSAwKSB7CisJCQlyYWRlb25fZW5naW5lX2ZsdXNoIChyaW5mbyk7CisJCQlyZXR1cm47CisJCX0KKwkJdWRlbGF5KDEpOworCX0KKwlwcmludGYoInJhZGVvbmZiOiBJZGxlIFRpbWVvdXQgIVxuIik7Cit9CisKKyNkZWZpbmUgcmFkZW9uX2VuZ2luZV9pZGxlKCkJCV9yYWRlb25fZW5naW5lX2lkbGUocmluZm8pCisjZGVmaW5lIHJhZGVvbl9maWZvX3dhaXQoZW50cmllcykJX3JhZGVvbl9maWZvX3dhaXQocmluZm8sZW50cmllcykKKyNkZWZpbmUgcmFkZW9uX21zbGVlcChtcykJCV9yYWRlb25fbXNsZWVwKHJpbmZvLG1zKQorCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIHZhcmlvdXMgcmVnaXN0ZXJzIG1hbmlwdWxhdGVkIGJ5IHRoaXMKKyAqIGRyaXZlciBmb3Igc2V0dGluZyBvciByZXN0b3JpbmcgYSBtb2RlLiBJdCdzIG1vc3RseSBjb3BpZWQgZnJvbQorICogWEZyZWUncyBSQURFT05TYXZlUmVjIHN0cnVjdHVyZS4gQSBmZXcgY2hpcCBzZXR0aW5ncyBtaWdodCBzdGlsbCBiZQorICogdHdlYWtlZCB3aXRob3V0IGJlZWluZyByZWZsZWN0ZWQgb3Igc2F2ZWQgaW4gdGhlc2UgcmVnaXN0ZXJzIHRob3VnaAorICovCitzdHJ1Y3QgcmFkZW9uX3JlZ3MgeworCS8qIENvbW1vbiByZWdpc3RlcnMgKi8KKwl1MzIJCW92cl9jbHI7CisJdTMyCQlvdnJfd2lkX2xlZnRfcmlnaHQ7CisJdTMyCQlvdnJfd2lkX3RvcF9ib3R0b207CisJdTMyCQlvdjBfc2NhbGVfY250bDsKKwl1MzIJCW1wcF90Yl9jb25maWc7CisJdTMyCQltcHBfZ3BfY29uZmlnOworCXUzMgkJc3VicGljX2NudGw7CisJdTMyCQl2aXBoX2NvbnRyb2w7CisJdTMyCQlpMmNfY250bF8xOworCXUzMgkJZ2VuX2ludF9jbnRsOworCXUzMgkJY2FwMF90cmlnX2NudGw7CisJdTMyCQljYXAxX3RyaWdfY250bDsKKwl1MzIJCWJ1c19jbnRsOworCXUzMgkJc3VyZmFjZV9jbnRsOworCXUzMgkJYmlvc181X3NjcmF0Y2g7CisKKwkvKiBPdGhlciByZWdpc3RlcnMgdG8gc2F2ZSBmb3IgVlQgc3dpdGNoZXMgb3IgZHJpdmVyIGxvYWQvdW5sb2FkICovCisJdTMyCQlkcF9kYXRhdHlwZTsKKwl1MzIJCXJiYm1fc29mdF9yZXNldDsKKwl1MzIJCWNsb2NrX2NudGxfaW5kZXg7CisJdTMyCQlhbWNncGlvX2VuX3JlZzsKKwl1MzIJCWFtY2dwaW9fbWFzazsKKworCS8qIFN1cmZhY2UvdGlsaW5nIHJlZ2lzdGVycyAqLworCXUzMgkJc3VyZl9sb3dlcl9ib3VuZFs4XTsKKwl1MzIJCXN1cmZfdXBwZXJfYm91bmRbOF07CisJdTMyCQlzdXJmX2luZm9bOF07CisKKwkvKiBDUlRDIHJlZ2lzdGVycyAqLworCXUzMgkJY3J0Y19nZW5fY250bDsKKwl1MzIJCWNydGNfZXh0X2NudGw7CisJdTMyCQlkYWNfY250bDsKKwl1MzIJCWNydGNfaF90b3RhbF9kaXNwOworCXUzMgkJY3J0Y19oX3N5bmNfc3RydF93aWQ7CisJdTMyCQljcnRjX3ZfdG90YWxfZGlzcDsKKwl1MzIJCWNydGNfdl9zeW5jX3N0cnRfd2lkOworCXUzMgkJY3J0Y19vZmZzZXQ7CisJdTMyCQljcnRjX29mZnNldF9jbnRsOworCXUzMgkJY3J0Y19waXRjaDsKKwl1MzIJCWRpc3BfbWVyZ2VfY250bDsKKwl1MzIJCWdycGhfYnVmZmVyX2NudGw7CisJdTMyCQljcnRjX21vcmVfY250bDsKKworCS8qIENSVEMyIHJlZ2lzdGVycyAqLworCXUzMgkJY3J0YzJfZ2VuX2NudGw7CisJdTMyCQlkYWMyX2NudGw7CisJdTMyCQlkaXNwX291dHB1dF9jbnRsOworCXUzMgkJZGlzcF9od19kZWJ1ZzsKKwl1MzIJCWRpc3AyX21lcmdlX2NudGw7CisJdTMyCQlncnBoMl9idWZmZXJfY250bDsKKwl1MzIJCWNydGMyX2hfdG90YWxfZGlzcDsKKwl1MzIJCWNydGMyX2hfc3luY19zdHJ0X3dpZDsKKwl1MzIJCWNydGMyX3ZfdG90YWxfZGlzcDsKKwl1MzIJCWNydGMyX3Zfc3luY19zdHJ0X3dpZDsKKwl1MzIJCWNydGMyX29mZnNldDsKKwl1MzIJCWNydGMyX29mZnNldF9jbnRsOworCXUzMgkJY3J0YzJfcGl0Y2g7CisKKwkvKiBGbGF0IHBhbmVsIHJlZ3MgKi8KKwl1MzIgCQlmcF9jcnRjX2hfdG90YWxfZGlzcDsKKwl1MzIJCWZwX2NydGNfdl90b3RhbF9kaXNwOworCXUzMgkJZnBfZ2VuX2NudGw7CisJdTMyCQlmcDJfZ2VuX2NudGw7CisJdTMyCQlmcF9oX3N5bmNfc3RydF93aWQ7CisJdTMyCQlmcDJfaF9zeW5jX3N0cnRfd2lkOworCXUzMgkJZnBfaG9yel9zdHJldGNoOworCXUzMgkJZnBfcGFuZWxfY250bDsKKwl1MzIJCWZwX3Zfc3luY19zdHJ0X3dpZDsKKwl1MzIJCWZwMl92X3N5bmNfc3RydF93aWQ7CisJdTMyCQlmcF92ZXJ0X3N0cmV0Y2g7CisJdTMyCQlsdmRzX2dlbl9jbnRsOworCXUzMgkJbHZkc19wbGxfY250bDsKKwl1MzIJCXRtZHNfY3JjOworCXUzMgkJdG1kc190cmFuc21pdHRlcl9jbnRsOworCisJLyogQ29tcHV0ZWQgdmFsdWVzIGZvciBQTEwgKi8KKwl1MzIJCWRvdF9jbG9ja19mcmVxOworCWludAkJZmVlZGJhY2tfZGl2OworCWludAkJcG9zdF9kaXY7CisKKwkvKiBQTEwgcmVnaXN0ZXJzICovCisJdTMyCQlwcGxsX2Rpdl8zOworCXUzMgkJcHBsbF9yZWZfZGl2OworCXUzMgkJdmNsa19lY3BfY250bDsKKwl1MzIJCWNsa19jbnRsX2luZGV4OworCisJLyogQ29tcHV0ZWQgdmFsdWVzIGZvciBQTEwyICovCisJdTMyCQlkb3RfY2xvY2tfZnJlcV8yOworCWludAkJZmVlZGJhY2tfZGl2XzI7CisJaW50CQlwb3N0X2Rpdl8yOworCisJLyogUExMMiByZWdpc3RlcnMgKi8KKwl1MzIJCXAycGxsX3JlZl9kaXY7CisJdTMyCQlwMnBsbF9kaXZfMDsKKwl1MzIJCWh0b3RhbF9jbnRsMjsKKworCS8qIFBhbGV0dGUgKi8KKwlpbnQJCXBhbGV0dGVfdmFsaWQ7Cit9OworCitzdGF0aWMgaW5saW5lIHUzMiBfX0lOUExMKHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbywgdTMyIGFkZHIpCit7CisJdTMyIGRhdGE7CisKKwlPVVRSRUc4KENMT0NLX0NOVExfSU5ERVgsIGFkZHIgJiAweDAwMDAwMDNmKTsKKwkvKiByYWRlb25fcGxsX2VycmF0YV9hZnRlcl9pbmRleChyaW5mbyk7ICovCisJZGF0YSA9IElOUkVHKENMT0NLX0NOVExfREFUQSk7CisJLyogcmFkZW9uX3BsbF9lcnJhdGFfYWZ0ZXJfZGF0YShyaW5mbyk7ICovCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX09VVFBMTChzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqcmluZm8sIHVuc2lnbmVkIGludCBpbmRleCwKKwkJCSAgICB1MzIgdmFsKQoreworCisJT1VUUkVHOChDTE9DS19DTlRMX0lOREVYLCAoaW5kZXggJiAweDAwMDAwMDNmKSB8IDB4MDAwMDAwODApOworCS8qIHJhZGVvbl9wbGxfZXJyYXRhX2FmdGVyX2luZGV4KHJpbmZvKTsgKi8KKwlPVVRSRUcoQ0xPQ0tfQ05UTF9EQVRBLCB2YWwpOworCS8qIHJhZGVvbl9wbGxfZXJyYXRhX2FmdGVyX2RhdGEocmluZm8pOyAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19PVVRQTExQKHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbywgdW5zaWduZWQgaW50IGluZGV4LAorCQkJICAgICB1MzIgdmFsLCB1MzIgbWFzaykKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJdG1wICA9IF9fSU5QTEwocmluZm8sIGluZGV4KTsKKwl0bXAgJj0gKG1hc2spOworCXRtcCB8PSAodmFsKTsKKwlfX09VVFBMTChyaW5mbywgaW5kZXgsIHRtcCk7Cit9CisKKyNkZWZpbmUgSU5QTEwoYWRkcikJCQlfX0lOUExMKHJpbmZvLCBhZGRyKQorI2RlZmluZSBPVVRQTEwoaW5kZXgsIHZhbCkJCV9fT1VUUExMKHJpbmZvLCBpbmRleCwgdmFsKQorI2RlZmluZSBPVVRQTExQKGluZGV4LCB2YWwsIG1hc2spCV9fT1VUUExMUChyaW5mbywgaW5kZXgsIHZhbCwgbWFzaykKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JjbTU3MHguYyBiL2RyaXZlcnMvYmNtNTcweC5jCmluZGV4IDdhZWI1NDcuLmM4ZjQwNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmNtNTcweC5jCisrKyBiL2RyaXZlcnMvYmNtNTcweC5jCkBAIC02LDggKzYsOCBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmICghZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSkgJiYgXAotCWRlZmluZWQoQ09ORklHX0JDTTU3MHgpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgXAorCSYmICghZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSkgJiYgZGVmaW5lZChDT05GSUdfQkNNNTcweCkKIAogI2lmZGVmIENPTkZJR19CTVcKICNpbmNsdWRlIDxtcGM4MjR4Lmg+CkBAIC0xNjAwLDQgKzE2MDAsNCBAQAogCXJldHVybiBwUXVldWUtPkFycmF5W0lkeF07CiB9CiAKLSNlbmRpZgkJCQkvKiBDRkdfQ01EX05FVCwgIUNPTkZJR19ORVRfTVVMVEksIENPTkZJR19CQ001NzB4ICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmlvc19lbXVsYXRvci9NYWtlZmlsZSBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODZlODNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL01ha2VmaWxlCkBAIC0wLDAgKzEsMzAgQEAKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIgOj0gJChvYmopbGliYXRpYmlvc2VtdS5hCisKK1g4NkRJUiAgPSAuL3g4NmVtdQorCitPQkpTCT0gYXRpYmlvcy5vIGJpb3NlbXUubyBiZXN5cy5vIGJpb3MubyAgXAorCSQoWDg2RElSKS9kZWNvZGUubyBcCisJJChYODZESVIpL29wczIubyBcCisJJChYODZESVIpL29wcy5vIFwKKwkkKFg4NkRJUikvcHJpbV9vcHMubyBcCisJJChYODZESVIpL3N5cy5vIFwKKwkkKFg4NkRJUikvZGVidWcubworCitDRkxBR1MgKz0gLUkuIC1JLi9pbmNsdWRlICAtSSQoWDg2RElSKSAtSSQoVE9QRElSKS9pbmNsdWRlIFwKKwktRF9fUFBDX18gIC1EX19CSUdfRU5ESUFOX18KKworYWxsOgkkKExJQikKKworJChMSUIpOiAkKE9CSlMpCisJJChBUikgY3J2ICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisuZGVwZW5kOglNYWtlZmlsZSAkKE9CSlM6Lm89LmMpCisJCSQoQ0MpIC1NICQoQ0ZMQUdTKSAkKE9CSlM6Lm89LmMpID4gJEAKKworc2luY2x1ZGUgLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvYXRpYmlvcy5jIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2F0aWJpb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Nzc5Zjk5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2F0aWJpb3MuYwpAQCAtMCwwICsxLDM0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoJCSAgICAgVmlkZW8gQk9PVCBHcmFwaGljcyBDYXJkIFBPU1QgTW9kdWxlCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyogICBDb3B5cmlnaHQgKEMpIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogICBKYXNvbiBKaW4gPEphc29uLmppbkBmcmVlc2NhbGUuY29tPgorKgorKiAgIENvcHlyaWdodCAoQykgMTk5MS0yMDA0IFNjaVRlY2ggU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogICBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisqICAgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgYXBwZWFyaW5nIGluIHRoZSBmaWxlIExJQ0VOU0UuR1BMIGluY2x1ZGVkCisqICAgaW4gdGhlIHBhY2thZ2luZyBvZiB0aGlzIGZpbGUuCisqCisqICAgTGljZW5zZWVzIGhvbGRpbmcgYSB2YWxpZCBDb21tZXJjaWFsIExpY2Vuc2UgZm9yIHRoaXMgcHJvZHVjdCBmcm9tCisqICAgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiBtYXkgdXNlIHRoaXMgZmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCisqICAgQ29tbWVyY2lhbCBMaWNlbnNlIEFncmVlbWVudCBwcm92aWRlZCB3aXRoIHRoZSBTb2Z0d2FyZS4KKyoKKyogICBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgQVMgSVMgd2l0aCBOTyBXQVJSQU5UWSBPRiBBTlkgS0lORCwgSU5DTFVESU5HCisqICAgVEhFIFdBUlJBTlRZIE9GIERFU0lHTiwgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyogICBQVVJQT1NFLgorKgorKiAgIFNlZSBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9saWNlbnNlLyBmb3IgaW5mb3JtYXRpb24gYWJvdXQKKyogICB0aGUgbGljZW5zaW5nIG9wdGlvbnMgYXZhaWxhYmxlIGFuZCBob3cgdG8gcHVyY2hhc2UgYSBDb21tZXJjaWFsCisqICAgTGljZW5zZSBBZ3JlZW1lbnQuCisqCisqICAgQ29udGFjdCBsaWNlbnNlQHNjaXRlY2hzb2Z0LmNvbSBpZiBhbnkgY29uZGl0aW9ucyBvZiB0aGlzIGxpY2Vuc2luZworKiAgIGFyZSBub3QgY2xlYXIgdG8geW91LCBvciB5b3UgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgbGljZW5zaW5nIG9wdGlvbnMuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6CUFOU0kgQworKiBFbnZpcm9ubWVudDoJTGludXggS2VybmVsCisqIERldmVsb3BlcjoJS2VuZGFsbCBCZW5uZXR0CisqCisqIERlc2NyaXB0aW9uOglNb2R1bGUgdG8gaW1wbGVtZW50IGJvb3RpbmcgUENJL0FHUCBjb250cm9sbGVycyBvbiB0aGUKKyoJCWJ1cy4gV2UgdXNlIHRoZSB4ODYgcmVhbCBtb2RlIGVtdWxhdG9yIHRvIHJ1biB0aGUgQklPUyBvbgorKgkJZ3JhcGhpY3MgY29udHJvbGxlcnMgdG8gYnJpbmcgdGhlIGNhcmRzIHVwLgorKgorKgkJTm90ZSB0aGF0IGF0IHByZXNlbnQgdGhpcyBtb2R1bGUgZG9lcyAqbm90KiBzdXBwb3J0CisqCQltdWx0aXBsZSBjb250cm9sbGVycy4KKyoKKyoJCVRoZSBvcmlnbmFsIG5hbWUgb2YgdGhpcyBmaWxlIGlzIHdhcm1ib290LmMuCisqCQlKYXNvbiBwb3J0ZWQgdGhpcyBmaWxlIHRvIHUtYm9vdCB0byBydW4gdGhlIEFUSSB2aWRlbyBjYXJkCisqCQlCSU9TIGluIHUtYm9vdC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDT05GSUdfQklPU0VNVQorCisjaW5jbHVkZSAiYmlvc2VtdWkuaCIKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKworLyogTGVuZ3RoIG9mIHRoZSBCSU9TIGltYWdlICovCisjZGVmaW5lIE1BWF9CSU9TTEVOCSAgICAoMTI4ICogMTAyNEwpCisKKy8qIERlZmluZSBzb21lIHVzZWZ1bCB0eXBlcyBhbmQgbWFjcm9zICovCisjZGVmaW5lIHRydWUJCSAgICAxCisjZGVmaW5lIGZhbHNlCQkgICAgMAorCisvKiBQbGFjZSB0byBzYXZlIFBDSSBCQVIncyB0aGF0IHdlIGNoYW5nZSBhbmQgbGF0ZXIgcmVzdG9yZSAqLworc3RhdGljIHUzMiBzYXZlUk9NQmFzZUFkZHJlc3M7CitzdGF0aWMgdTMyIHNhdmVCYXNlQWRkcmVzczEwOworc3RhdGljIHUzMiBzYXZlQmFzZUFkZHJlc3MxNDsKK3N0YXRpYyB1MzIgc2F2ZUJhc2VBZGRyZXNzMTg7CitzdGF0aWMgdTMyIHNhdmVCYXNlQWRkcmVzczIwOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3BjaWRldgktIFBDSSBkZXZpY2UgaW5mbyBmb3IgdGhlIHZpZGVvIGNhcmQgb24gdGhlIGJ1cyB0byBib290CitWR0FJbmZvIC0gQklPUyBlbXVsYXRvciBWR0EgaW5mbyBzdHJ1Y3R1cmUKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgdGhlIEJJT1MgUE9TVCBjb2RlIG9uIHRoZSBjb250cm9sbGVyLiBXZSBhc3N1bWUgdGhhdAorYXQgdGhpcyBzdGFnZSB0aGUgY29udHJvbGxlciBoYXMgaXRzIEkvTyBhbmQgbWVtb3J5IHNwYWNlIGVuYWJsZWQgYW5kCit0aGF0IGFsbCBvdGhlciBjb250cm9sbGVycyBhcmUgaW4gYSBkaXNhYmxlZCBzdGF0ZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBQQ0lfZG9CSU9TUE9TVChwY2lfZGV2X3QgcGNpZGV2LCBCRV9WR0FJbmZvICogVkdBSW5mbykKK3sKKwlSTVJFR1MgcmVnczsKKwlSTVNSRUdTIHNyZWdzOworCisJLyogRGV0ZXJtaW5lIHRoZSB2YWx1ZSB0byBzdG9yZSBpbiBBWCBmb3IgQklPUyBQT1NULiBQZXIgdGhlIFBDSSBzcGVjcywKKwkgQUggbXVzdCBjb250YWluIHRoZSBidXMgYW5kIEFMIG11c3QgY29udGFpbiB0aGUgZGV2Zm4sIGVuY29kZWQgYXMKKwkgKGRldiA8PCAzKSB8IGZuCisJICovCisJbWVtc2V0KCZyZWdzLCAwLCBzaXplb2YocmVncykpOworCW1lbXNldCgmc3JlZ3MsIDAsIHNpemVvZihzcmVncykpOworCXJlZ3MueC5heCA9ICgoaW50KVBDSV9CVVMocGNpZGV2KSA8PCA4KSB8CisJICAgICgoaW50KVBDSV9ERVYocGNpZGV2KSA8PCAzKSB8IChpbnQpUENJX0ZVTkMocGNpZGV2KTsKKworCS8qU2V0dXAgdGhlIFg4NiBlbXVsYXRvciBmb3IgdGhlIFZHQSBCSU9TKi8KKwlCRV9zZXRWR0EoVkdBSW5mbyk7CisKKwkvKkV4ZWN1dGUgdGhlIEJJT1MgUE9TVCBjb2RlKi8KKwlCRV9jYWxsUmVhbE1vZGUoMHhDMDAwLCAweDAwMDMsICZyZWdzLCAmc3JlZ3MpOworCisJLypDbGVhbnVwIGFuZCBleGl0Ki8KKwlCRV9nZXRWR0EoVkdBSW5mbyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcGNpZGV2CS0gUENJIGRldmljZSBpbmZvIGZvciB0aGUgdmlkZW8gY2FyZCBvbiB0aGUgYnVzCitiYXIJLSBQbGFjZSB0byByZXR1cm4gdGhlIGJhc2UgYWRkcmVzcyByZWdpc3RlciBvZmZzZXQgdG8gdXNlCisKK1JFVFVSTlM6CitUaGUgYWRkcmVzcyB0byB1c2UgdG8gbWFwIHRoZSBzZWNvbmRhcnkgQklPUyAoQUdQIGRldmljZXMpCisKK1JFTUFSS1M6CitTZWFyY2hlcyBhbGwgdGhlIFBDSSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXJzIGZvciB0aGUgZGV2aWNlIGxvb2tpbmcgZm9yIGEKK21lbW9yeSBtYXBwaW5nIHRoYXQgaXMgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb3VyIFJPTSBCSU9TLiBXZSB1c3VhbGx5IGVuZCB1cAorZmluZGluZyB0aGUgZnJhbWVidWZmZXIgbWFwcGluZyAodXN1YWxseSBCQVIgMHgxMCksIGFuZCB3ZSB1c2UgdGhpcyBtYXBwaW5nCit0byBtYXAgdGhlIEJJT1MgZm9yIHRoZSBkZXZpY2UgaW50by4gV2UgdXNlIGEgbWFwcGluZyB0aGF0IGlzIGFscmVhZHkKK2Fzc2lnbmVkIHRvIHRoZSBkZXZpY2UgdG8gZW5zdXJlIHRoZSBtZW1vcnkgcmFuZ2Ugd2lsbCBiZSBwYXNzZWQgdGhyb3VnaAorYnkgYW55IFBDSS0+UENJIG9yIEFHUC0+UENJIGJyaWRnZSB0aGF0IG1heSBiZSBwcmVzZW50LgorCitOT1RFOiBVc3VhbGx5IHRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIGZvciBBR1AgZGV2aWNlcywgYnV0IGl0IG1heSBiZQorICAgICAgdXNlZCBmb3IgUENJIGRldmljZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBQT1NUJ2VkIGFuZCB0aGUgQklPUworICAgICAgUk9NIGJhc2UgYWRkcmVzcyBoYXMgYmVlbiB6ZXJvJ2VkIG91dC4KKworTk9URTogVGhpcyBmdW5jdGlvbiBsZWF2ZXMgdGhlIG9yaWdpbmFsIG1lbW9yeSBhcGVydHVyZSBkaXNhYmxlZCBieSBsZWF2aW5nCisgICAgICBpdCBwcm9ncmFtbWVkIHRvIGFsbCAxJ3MuIEl0IG11c3QgYmUgcmVzdG9yZWQgdG8gdGhlIGNvcnJlY3QgdmFsdWUKKyAgICAgIGxhdGVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1MzIgUENJX2ZpbmRCSU9TQWRkcihwY2lfZGV2X3QgcGNpZGV2LCBpbnQgKmJhcikKK3sKKwl1MzIgYmFzZSwgc2l6ZTsKKworCWZvciAoKmJhciA9IDB4MTA7ICpiYXIgPD0gMHgxNDsgKCpiYXIpICs9IDQpIHsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaWRldiwgKmJhciwgJmJhc2UpOworCQlpZiAoIShiYXNlICYgMHgxKSkgeworCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lkZXYsICpiYXIsIDB4RkZGRkZGRkYpOworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaWRldiwgKmJhciwgJnNpemUpOworCQkJc2l6ZSA9IH4oc2l6ZSAmIH4weEZGKSArIDE7CisJCQlpZiAoc2l6ZSA+PSBNQVhfQklPU0xFTikKKwkJCQlyZXR1cm4gYmFzZSAmIH4weEZGOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1NvbWUgbm9uLXg4NiBMaW51eCBrZXJuZWxzIG1hcCBQQ0kgcmVsb2NhdGVhYmxlIEkvTyB0byB2YWx1ZXMgdGhhdAorYXJlIGFib3ZlIDY0Sywgd2hpY2ggd2lsbCBub3Qgd29yayB3aXRoIHRoZSBCSU9TIGltYWdlIHRoYXQgcmVxdWlyZXMKK3RoZSBvZmZzZXQgZm9yIHRoZSBJL08gcG9ydHMgdG8gYmUgYSBtYXhpbXVtIG9mIDE2LWJpdHMuIElkZWFsbHkKK3NvbWVvbmUgc2hvdWxkIGZpeCB0aGUga2VybmVsIHRvIG1hcCB0aGUgSS9PIHBvcnRzIGZvciBWR0EgY29tcGF0aWJsZQorZGV2aWNlcyB0byBhIGRpZmZlcmVudCBsb2NhdGlvbiAob3IganVzdCBhbGwgSS9PIHBvcnRzIHNpbmNlIGl0IGlzCit1bmxpa2VseSB5b3UgY2FuIGhhdmUgZW5vdWdoIGRldmljZXMgaW4gdGhlIG1hY2hpbmUgdG8gdXNlIHVwIGFsbAorNjRLIG9mIHRoZSBJL08gc3BhY2UgLSBhIHRvdGFsIG9mIG1vcmUgdGhhbiAyNTYgY2FyZHMgd291bGQgYmUKK25lY2Vzc2FyeSkuCisKK0FueXdheSB0byBmaXggdGhpcyB3ZSBjaGFuZ2UgYWxsIEkvTyBtYXBwZWQgYmFzZSByZWdpc3RlcnMgYW5kCitjaG9wIG9mZiB0aGUgdG9wIGJpdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgUENJX2ZpeHVwSU9iYXNlKHBjaV9kZXZfdCBwY2lkZXYsIGludCByZWcsIHUzMiAqIGJhc2UpCit7CisJaWYgKCgqYmFzZSAmIDB4MSkgJiYgKCpiYXNlID4gMHhGRkZFKSkgeworCQkqYmFzZSAmPSAweEZGRkY7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpZGV2LCByZWcsICpiYXNlKTsKKworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitwY2lkZXYJLSBQQ0kgZGV2aWNlIGluZm8gZm9yIHRoZSB2aWRlbyBjYXJkIG9uIHRoZSBidXMKKworUkVUVVJOUzoKK1BvaW50ZXJzIHRvIHRoZSBtYXBwZWQgQklPUyBpbWFnZQorCitSRU1BUktTOgorTWFwcyBhIHBvaW50ZXIgdG8gdGhlIEJJT1MgaW1hZ2Ugb24gdGhlIGdyYXBoaWNzIGNhcmQgb24gdGhlIFBDSSBidXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqUENJX21hcEJJT1NJbWFnZShwY2lfZGV2X3QgcGNpZGV2KQoreworCXUzMiBCSU9TSW1hZ2VQaHlzOworCWludCBCSU9TSW1hZ2VCQVI7CisJdTggKkJJT1NJbWFnZTsKKworCS8qU2F2ZSBQQ0kgQkFSIHJlZ2lzdGVycyB0aGF0IG1pZ2h0IGdldCBjaGFuZ2VkKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpZGV2LCBQQ0lfUk9NX0FERFJFU1MsICZzYXZlUk9NQmFzZUFkZHJlc3MpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCwgJnNhdmVCYXNlQWRkcmVzczEwKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzEsICZzYXZlQmFzZUFkZHJlc3MxNCk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaWRldiwgUENJX0JBU0VfQUREUkVTU18yLCAmc2F2ZUJhc2VBZGRyZXNzMTgpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lkZXYsIFBDSV9CQVNFX0FERFJFU1NfNCwgJnNhdmVCYXNlQWRkcmVzczIwKTsKKworCS8qRml4IHVwIEkvTyBiYXNlIHJlZ2lzdGVycyB0byBsZXNzIHRoYW4gNjRLICovCisJaWYoc2F2ZUJhc2VBZGRyZXNzMTQgIT0gMCkKKwkJUENJX2ZpeHVwSU9iYXNlKHBjaWRldiwgUENJX0JBU0VfQUREUkVTU18xLCAmc2F2ZUJhc2VBZGRyZXNzMTQpOworCWVsc2UKKwkJUENJX2ZpeHVwSU9iYXNlKHBjaWRldiwgUENJX0JBU0VfQUREUkVTU180LCAmc2F2ZUJhc2VBZGRyZXNzMjApOworCisJLyogU29tZSBjYXJkcyBoYXZlIHByb2JsZW1zIHRoYXQgc3RvcCB1cyBmcm9tIGJlaW5nIGFibGUgdG8gcmVhZCB0aGUKKwkgQklPUyBpbWFnZSBmcm9tIHRoZSBST00gQkFSLiBUbyBmaXggdGhpcyB3ZSBoYXZlIHRvIGRvIHNvbWUgY2hpcHNldAorCSBzcGVjaWZpYyBwcm9ncmFtbWluZyBmb3IgZGlmZmVyZW50IGNhcmRzIHRvIHNvbHZlIHRoaXMgcHJvYmxlbS4KKwkqLworCisJaWYgKChCSU9TSW1hZ2VQaHlzID0gUENJX2ZpbmRCSU9TQWRkcihwY2lkZXYsICZCSU9TSW1hZ2VCQVIpKSA9PSAwKSB7CisJCXByaW50ZigiRmluZCBiaW9zIGFkZHIgZXJyb3JcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlCSU9TSW1hZ2UgPSAodTggKikgQklPU0ltYWdlUGh5czsKKworCS8qQ2hhbmdlIHRoZSBQQ0kgQkFSIHJlZ2lzdGVycyB0byBtYXAgaXQgb250byB0aGUgYnVzLiovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lkZXYsIEJJT1NJbWFnZUJBUiwgMCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lkZXYsIFBDSV9ST01fQUREUkVTUywgQklPU0ltYWdlUGh5cyB8IDB4MSk7CisKKwl1ZGVsYXkoMSk7CisKKwkvKkNoZWNrIHRoYXQgdGhlIEJJT1MgaW1hZ2UgaXMgdmFsaWQuIElmIG5vdCBmYWlsLCBvciByZXR1cm4gdGhlCisJIGNvbXBpbGVkIGluIEJJT1MgaW1hZ2UgaWYgdGhhdCBvcHRpb24gd2FzIGVuYWJsZWQKKwkgKi8KKwlpZiAoQklPU0ltYWdlWzBdICE9IDB4NTUgfHwgQklPU0ltYWdlWzFdICE9IDB4QUEgfHwgQklPU0ltYWdlWzJdID09IDApIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIEJJT1NJbWFnZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitwY2lkZXYJLSBQQ0kgZGV2aWNlIGluZm8gZm9yIHRoZSB2aWRlbyBjYXJkIG9uIHRoZSBidXMKKworUkVNQVJLUzoKK1VubWFwcyB0aGUgQklPUyBpbWFnZSBmb3IgdGhlIGRldmljZSBhbmQgcmVzdG9yZXMgZnJhbWVidWZmZXIgbWFwcGluZ3MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBDSV91bm1hcEJJT1NJbWFnZShwY2lfZGV2X3QgcGNpZGV2LCB2b2lkICpCSU9TSW1hZ2UpCit7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lkZXYsIFBDSV9ST01fQUREUkVTUywgc2F2ZVJPTUJhc2VBZGRyZXNzKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaWRldiwgUENJX0JBU0VfQUREUkVTU18wLCBzYXZlQmFzZUFkZHJlc3MxMCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lkZXYsIFBDSV9CQVNFX0FERFJFU1NfMSwgc2F2ZUJhc2VBZGRyZXNzMTQpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzIsIHNhdmVCYXNlQWRkcmVzczE4KTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaWRldiwgUENJX0JBU0VfQUREUkVTU180LCBzYXZlQmFzZUFkZHJlc3MyMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcGNpZGV2CS0gUENJIGRldmljZSBpbmZvIGZvciB0aGUgdmlkZW8gY2FyZCBvbiB0aGUgYnVzIHRvIGJvb3QKK1ZHQUluZm8gLSBCSU9TIGVtdWxhdG9yIFZHQSBpbmZvIHN0cnVjdHVyZQorCitSRVRVUk5TOgorVHJ1ZSBpZiBzdWNjZXNzZnVsbHkgaW5pdGlhbGlzZWQsIGZhbHNlIGlmIG5vdC4KKworUkVNQVJLUzoKK0xvYWRzIGFuZCBQT1NUJ3MgdGhlIGRpc3BsYXkgY29udHJvbGxlcnMgQklPUywgZGlyZWN0bHkgZnJvbSB0aGUgQklPUworaW1hZ2Ugd2UgY2FuIGV4dHJhY3Qgb3ZlciB0aGUgUENJIGJ1cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IFBDSV9wb3N0Q29udHJvbGxlcihwY2lfZGV2X3QgcGNpZGV2LCBCRV9WR0FJbmZvICogVkdBSW5mbykKK3sKKwl1MzIgQklPU0ltYWdlTGVuOworCXVjaGFyICptYXBwZWRCSU9TOworCXVjaGFyICpjb3B5T2ZCSU9TOworCisJLypBbGxvY2F0ZSBtZW1vcnkgdG8gc3RvcmUgY29weSBvZiBCSU9TIGZyb20gZGlzcGxheSBjb250cm9sbGVyKi8KKwlpZiAoKG1hcHBlZEJJT1MgPSBQQ0lfbWFwQklPU0ltYWdlKHBjaWRldikpID09IE5VTEwpIHsKKwkJcHJpbnRmKCJ2aWRlb2Jvb3Q6IFZpZGVvIFJPTSBmYWlsZWQgdG8gbWFwIVxuIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlCSU9TSW1hZ2VMZW4gPSBtYXBwZWRCSU9TWzJdICogNTEyOworCisJaWYgKChjb3B5T2ZCSU9TID0gbWFsbG9jKEJJT1NJbWFnZUxlbikpID09IE5VTEwpIHsKKwkJcHJpbnRmKCJ2aWRlb2Jvb3Q6IE91dCBvZiBtZW1vcnkhXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwltZW1jcHkoY29weU9mQklPUywgbWFwcGVkQklPUywgQklPU0ltYWdlTGVuKTsKKworCVBDSV91bm1hcEJJT1NJbWFnZShwY2lkZXYsIG1hcHBlZEJJT1MpOworCisJLypTYXZlIGluZm9ybWF0aW9uIGluIFZHQUluZm8gc3RydWN0dXJlKi8KKwlWR0FJbmZvLT5mdW5jdGlvbiA9IFBDSV9GVU5DKHBjaWRldik7CisJVkdBSW5mby0+ZGV2aWNlID0gUENJX0RFVihwY2lkZXYpOworCVZHQUluZm8tPmJ1cyA9IFBDSV9CVVMocGNpZGV2KTsKKwlWR0FJbmZvLT5wY2lkZXYgPSBwY2lkZXY7CisJVkdBSW5mby0+QklPU0ltYWdlID0gY29weU9mQklPUzsKKwlWR0FJbmZvLT5CSU9TSW1hZ2VMZW4gPSBCSU9TSW1hZ2VMZW47CisKKwkvKk5vdyBleGVjdXRlIHRoZSBCSU9TIFBPU1QgZm9yIHRoZSBkZXZpY2UqLworCWlmIChjb3B5T2ZCSU9TWzBdICE9IDB4NTUgfHwgY29weU9mQklPU1sxXSAhPSAweEFBKSB7CisJCXByaW50ZigidmlkZW9ib290OiBWaWRlbyBST00gaW1hZ2UgaXMgaW52YWxpZCFcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJUENJX2RvQklPU1BPU1QocGNpZGV2LCBWR0FJbmZvKTsKKworCS8qUmVzZXQgdGhlIHNpemUgb2YgdGhlIEJJT1MgaW1hZ2UgdG8gdGhlIGZpbmFsIHNpemUqLworCVZHQUluZm8tPkJJT1NJbWFnZUxlbiA9IGNvcHlPZkJJT1NbMl0gKiA1MTI7CisJcmV0dXJuIHRydWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcGNpZGV2CSAgICAtIFBDSSBkZXZpY2UgaW5mbyBmb3IgdGhlIHZpZGVvIGNhcmQgb24gdGhlIGJ1cyB0byBib290CitwVkdBSW5mbyAgICAtIFBsYWNlIHRvIHJldHVybiBWR0EgaW5mbyBzdHJ1Y3R1cmUgaXMgcmVxdWVzdGVkCitjbGVhblVwCSAgICAtIFRydWUgdG8gY2xlYW4gdXAgb24gZXhpdCwgZmFsc2UgdG8gbGVhdmUgZW11bGF0b3IgYWN0aXZlCisKK1JFTUFSS1M6CitCb290cyB0aGUgUENJL0FHUCB2aWRlbyBjYXJkIG9uIHRoZSBidXMgdXNpbmcgdGhlIFZpZGVvIFJPTSBCSU9TIGltYWdlCithbmQgdGhlIFg4NiBCSU9TIGVtdWxhdG9yIG1vZHVsZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgQm9vdFZpZGVvQ2FyZEJJT1MocGNpX2Rldl90IHBjaWRldiwgQkVfVkdBSW5mbyAqKiBwVkdBSW5mbywgaW50IGNsZWFuVXApCit7CisJQkVfVkdBSW5mbyAqVkdBSW5mbzsKKworCXByaW50ZigidmlkZW9ib290OiBCb290aW5nIFBDSSB2aWRlbyBjYXJkIGJ1cyAlZCwgZnVuY3Rpb24gJWQsIGRldmljZSAlZFxuIiwKKwkgICAgIFBDSV9CVVMocGNpZGV2KSwgUENJX0ZVTkMocGNpZGV2KSwgUENJX0RFVihwY2lkZXYpKTsKKworCS8qSW5pdGlhbGlzZSB0aGUgeDg2IEJJT1MgZW11bGF0b3IqLworCWlmICgoVkdBSW5mbyA9IG1hbGxvYyhzaXplb2YoKlZHQUluZm8pKSkgPT0gTlVMTCkgeworCQlwcmludGYoInZpZGVvYm9vdDogT3V0IG9mIG1lbW9yeSFcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCW1lbXNldChWR0FJbmZvLCAwLCBzaXplb2YoKlZHQUluZm8pKTsKKwlCRV9pbml0KDAsIDY1NTM2LCBWR0FJbmZvLCAwKTsKKworCS8qUG9zdCBhbGwgdGhlIGRpc3BsYXkgY29udHJvbGxlciBCSU9TJ2VzKi8KKwlQQ0lfcG9zdENvbnRyb2xsZXIocGNpZGV2LCBWR0FJbmZvKTsKKworCS8qQ2xlYW51cCBhbmQgZXhpdCB0aGUgZW11bGF0b3IgaWYgcmVxdWVzdGVkLiBJZiB0aGUgQklPUyBlbXVsYXRvcgorCWlzIG5lZWRlZCBhZnRlciBib290aW5nIHRoZSBjYXJkLCB3ZSB3aWxsIG5vdCBjYWxsIEJFX2V4aXQgYW5kCisJbGVhdmUgaXQgZW5hYmxlZCBmb3IgZnVydGhlciB1c2UgKGllOiBWRVNBIGRyaXZlciBldGMpLgorCSovCisJaWYgKGNsZWFuVXApIHsKKwkJQkVfZXhpdCgpOworCQlpZiAoVkdBSW5mby0+QklPU0ltYWdlKQorCQkJZnJlZShWR0FJbmZvLT5CSU9TSW1hZ2UpOworCQlmcmVlKFZHQUluZm8pOworCQlWR0FJbmZvID0gTlVMTDsKKwl9CisJLypSZXR1cm4gVkdBIGluZm8gcG9pbnRlciBpZiB0aGUgY2FsbGVyIHJlcXVlc3RlZCBpdCovCisJaWYgKHBWR0FJbmZvKQorCQkqcFZHQUluZm8gPSBWR0FJbmZvOworCXJldHVybiB0cnVlOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmlvc19lbXVsYXRvci9iZXN5cy5jIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2Jlc3lzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM0YmM4ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci9iZXN5cy5jCkBAIC0wLDAgKzEsNzIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgIEJJT1MgZW11bGF0b3IgYW5kIGludGVyZmFjZQorKiAgICAgICAgICAgICAgICAgICAgICB0byBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICAgQ29weXJpZ2h0IChDKSAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqICAgSmFzb24gSmluPEphc29uLmppbkBmcmVlc2NhbGUuY29tPgorKgorKiAgIENvcHlyaWdodCAoQykgMTk5MS0yMDA0IFNjaVRlY2ggU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogICBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisqICAgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgYXBwZWFyaW5nIGluIHRoZSBmaWxlIExJQ0VOU0UuR1BMIGluY2x1ZGVkCisqICAgaW4gdGhlIHBhY2thZ2luZyBvZiB0aGlzIGZpbGUuCisqCisqICAgTGljZW5zZWVzIGhvbGRpbmcgYSB2YWxpZCBDb21tZXJjaWFsIExpY2Vuc2UgZm9yIHRoaXMgcHJvZHVjdCBmcm9tCisqICAgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLiBtYXkgdXNlIHRoaXMgZmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCisqICAgQ29tbWVyY2lhbCBMaWNlbnNlIEFncmVlbWVudCBwcm92aWRlZCB3aXRoIHRoZSBTb2Z0d2FyZS4KKyoKKyogICBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgQVMgSVMgd2l0aCBOTyBXQVJSQU5UWSBPRiBBTlkgS0lORCwgSU5DTFVESU5HCisqICAgVEhFIFdBUlJBTlRZIE9GIERFU0lHTiwgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyogICBQVVJQT1NFLgorKgorKiAgIFNlZSBodHRwOi8vd3d3LnNjaXRlY2hzb2Z0LmNvbS9saWNlbnNlLyBmb3IgaW5mb3JtYXRpb24gYWJvdXQKKyogICB0aGUgbGljZW5zaW5nIG9wdGlvbnMgYXZhaWxhYmxlIGFuZCBob3cgdG8gcHVyY2hhc2UgYSBDb21tZXJjaWFsCisqICAgTGljZW5zZSBBZ3JlZW1lbnQuCisqCisqICAgQ29udGFjdCBsaWNlbnNlQHNjaXRlY2hzb2Z0LmNvbSBpZiBhbnkgY29uZGl0aW9ucyBvZiB0aGlzIGxpY2Vuc2luZworKiAgIGFyZSBub3QgY2xlYXIgdG8geW91LCBvciB5b3UgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgbGljZW5zaW5nIG9wdGlvbnMuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBBbnkKKyogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgaW5jbHVkZXMgQklPUyBlbXVsYXRvciBJL08gYW5kIG1lbW9yeSBhY2Nlc3MKKyogICAgICAgICAgICAgICBmdW5jdGlvbnMuCisqCisqCQlKYXNvbiBwb3J0ZWQgdGhpcyBmaWxlIHRvIHUtYm9vdCB0byBydW4gdGhlIEFUSSB2aWRlbyBjYXJkCisqCQlCSU9TIGluIHUtYm9vdC4gUmVtb3ZlZCBzb21lIGVtdWxhdGUgZnVuY3Rpb25zIHN1Y2ggYXMgdGhlCisqCQl0aW1lciBwb3J0IGFjY2Vzcy4gTWFkZSBhbGwgdGhlIFZHQSBwb3J0IGV4Y2VwdCByZWFkaW5nIDB4M2MzCisqCQliZSBlbXVsYXRlZC4gU2VlbXMgbGlrZSByZWFkaW5nIDB4M2MzIHNob3VsZCByZXR1cm4gdGhlIGhpZ2gKKyoJCTE2IGJpdCBvZiB0aGUgaW8gcG9ydC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJiaW9zZW11aS5oIgorCisjaWYgZGVmaW5lZChDT05GSUdfQklPU0VNVSkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgX19pMzg2X18KK3N0YXRpYyBjaGFyICpCRV9iaW9zRGF0ZSA9ICIwOC8xNC85OSI7CitzdGF0aWMgdTggQkVfbW9kZWwgPSAweEZDOworc3RhdGljIHU4IEJFX3N1Ym1vZGVsID0gMHgwMDsKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIgICAgLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byBjb252ZXJ0CisKK1JFVFVSTlM6CitBY3R1YWwgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZCBvciB3cml0ZSB0aGUgZGF0YQorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhbiBlbXVsYXRvciBtZW1vcnkgYWRkcmVzcyBpbiBhIDMyLWJpdCByYW5nZSB0bworYSByZWFsIG1lbW9yeSBhZGRyZXNzIHRoYXQgd2Ugd2lzaCB0byBhY2Nlc3MuIEl0IGhhbmRsZXMgc3BsaXR0aW5nIHVwIHRoZQorbWVtb3J5IGFkZHJlc3Mgc3BhY2UgYXBwcm9wcmlhdGVseSB0byBhY2Nlc3MgdGhlIGVtdWxhdG9yIEJJT1MgaW1hZ2UsIHZpZGVvCittZW1vcnkgYW5kIHN5c3RlbSBCSU9TIGV0Yy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdTggKkJFX21lbWFkZHIodTMyIGFkZHIpCit7CisJaWYgKGFkZHIgPj0gMHhDMDAwMCAmJiBhZGRyIDw9IF9CRV9lbnYuYmlvc21lbV9saW1pdCkgeworCQlyZXR1cm4gKHU4KikoX0JFX2Vudi5iaW9zbWVtX2Jhc2UgKyBhZGRyIC0gMHhDMDAwMCk7CisJfSBlbHNlIGlmIChhZGRyID4gX0JFX2Vudi5iaW9zbWVtX2xpbWl0ICYmIGFkZHIgPCAweEQwMDAwKSB7CisJCURCKHByaW50ZigiQkVfbWVtYWRkcjogYWRkcmVzcyAlI2x4IG1heSBiZSBpbnZhbGlkIVxuIiwgYWRkcik7KQorCQlyZXR1cm4gTS5tZW1fYmFzZTsKKwl9IGVsc2UgaWYgKGFkZHIgPj0gMHhBMDAwMCAmJiBhZGRyIDw9IDB4QkZGRkYpIHsKKwkJcmV0dXJuICh1OCopKF9CRV9lbnYuYnVzbWVtX2Jhc2UgKyBhZGRyIC0gMHhBMDAwMCk7CisJfQorI2lmZGVmIF9faTM4Nl9fCisJZWxzZSBpZiAoYWRkciA+PSAweEQwMDAwICYmIGFkZHIgPD0gMHhGRkZGRikgeworCQkvKiBXZSBtYXAgdGhlIHJlYWwgU3lzdGVtIEJJT1MgZGlyZWN0bHkgb24gcmVhbCBQQydzICovCisJCURCKHByaW50ZigiQkVfbWVtYWRkcjogU3lzdGVtIEJJT1MgYWRkcmVzcyAlI2x4XG4iLCBhZGRyKTspCisJCSAgICByZXR1cm4gX0JFX2Vudi5idXNtZW1fYmFzZSArIGFkZHIgLSAweEEwMDAwOworCX0KKyNlbHNlCisJZWxzZSBpZiAoYWRkciA+PSAweEZGRkY1ICYmIGFkZHIgPCAweEZGRkZFKSB7CisJCS8qIFJldHVybiBhIGZha2VkIEJJT1MgZGF0ZSBzdHJpbmcgZm9yIG5vbi14ODYgbWFjaGluZXMgKi8KKwkJREIocHJpbnRmKCJCRV9tZW1hZGRyIC0gUmV0dXJuaW5nIEJJT1MgZGF0ZVxuIik7KQorCQlyZXR1cm4gQkVfYmlvc0RhdGUgKyBhZGRyIC0gMHhGRkZGNTsKKwl9IGVsc2UgaWYgKGFkZHIgPT0gMHhGRkZGRSkgeworCQkvKiBSZXR1cm4gc3lzdGVtIG1vZGVsIGlkZW50aWZpZXIgZm9yIG5vbi14ODYgbWFjaGluZXMgKi8KKwkJREIocHJpbnRmKCJCRV9tZW1hZGRyIC0gUmV0dXJuaW5nIG1vZGVsXG4iKTspCisJCXJldHVybiAmQkVfbW9kZWw7CisJfSBlbHNlIGlmIChhZGRyID09IDB4RkZGRkYpIHsKKwkJLyogUmV0dXJuIHN5c3RlbSBzdWJtb2RlbCBpZGVudGlmaWVyIGZvciBub24teDg2IG1hY2hpbmVzICovCisJCURCKHByaW50ZigiQkVfbWVtYWRkciAtIFJldHVybmluZyBzdWJtb2RlbFxuIik7KQorCQlyZXR1cm4gJkJFX3N1Ym1vZGVsOworCX0KKyNlbmRpZgorCWVsc2UgaWYgKGFkZHIgPiBNLm1lbV9zaXplIC0gMSkgeworCQlIQUxUX1NZUygpOworCQlyZXR1cm4gTS5tZW1fYmFzZTsKKwl9CisKKwlyZXR1cm4gTS5tZW1fYmFzZSArIGFkZHI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYWRkciAgICAtIEVtdWxhdG9yIG1lbW9yeSBhZGRyZXNzIHRvIHJlYWQKKworUkVUVVJOUzoKK0J5dGUgdmFsdWUgcmVhZCBmcm9tIGVtdWxhdG9yIG1lbW9yeS4KKworUkVNQVJLUzoKK1JlYWRzIGEgYnl0ZSB2YWx1ZSBmcm9tIHRoZSBlbXVsYXRvciBtZW1vcnkuIFdlIGhhdmUgdGhyZWUgZGlzdGluY3QgbWVtb3J5CityZWdpb25zIHRoYXQgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIHdoaWNoIHRoaXMgZnVuY3Rpb24gaGFuZGxlcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBYODZBUEkgQkVfcmRiKHUzMiBhZGRyKQoreworCWlmIChfQkVfZW52LmVtdWxhdGVWR0EgJiYgYWRkciA+PSAweEEwMDAwICYmIGFkZHIgPD0gMHhCRkZGRikKKwkJcmV0dXJuIDA7CisJZWxzZSB7CisJCXU4IHZhbCA9IHJlYWRiX2xlKEJFX21lbWFkZHIoYWRkcikpOworCQlyZXR1cm4gdmFsOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CithZGRyICAgIC0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAorCitSRVRVUk5TOgorV29yZCB2YWx1ZSByZWFkIGZyb20gZW11bGF0b3IgbWVtb3J5LgorCitSRU1BUktTOgorUmVhZHMgYSB3b3JkIHZhbHVlIGZyb20gdGhlIGVtdWxhdG9yIG1lbW9yeS4gV2UgaGF2ZSB0aHJlZSBkaXN0aW5jdCBtZW1vcnkKK3JlZ2lvbnMgdGhhdCBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgd2hpY2ggdGhpcyBmdW5jdGlvbiBoYW5kbGVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBYODZBUEkgQkVfcmR3KHUzMiBhZGRyKQoreworCWlmIChfQkVfZW52LmVtdWxhdGVWR0EgJiYgYWRkciA+PSAweEEwMDAwICYmIGFkZHIgPD0gMHhCRkZGRikKKwkJcmV0dXJuIDA7CisJZWxzZSB7CisJCXU4ICpiYXNlID0gQkVfbWVtYWRkcihhZGRyKTsKKwkJdTE2IHZhbCA9IHJlYWR3X2xlKGJhc2UpOworCQlyZXR1cm4gdmFsOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CithZGRyICAgIC0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAorCitSRVRVUk5TOgorTG9uZyB2YWx1ZSByZWFkIGZyb20gZW11bGF0b3IgbWVtb3J5LgorCitSRU1BUktTOgorUmVhZHMgYSAzMi1iaXQgdmFsdWUgZnJvbSB0aGUgZW11bGF0b3IgbWVtb3J5LiBXZSBoYXZlIHRocmVlIGRpc3RpbmN0IG1lbW9yeQorcmVnaW9ucyB0aGF0IGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LCB3aGljaCB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIFg4NkFQSSBCRV9yZGwodTMyIGFkZHIpCit7CisJaWYgKF9CRV9lbnYuZW11bGF0ZVZHQSAmJiBhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEJGRkZGKQorCQlyZXR1cm4gMDsKKwllbHNlIHsKKwkJdTggKmJhc2UgPSBCRV9tZW1hZGRyKGFkZHIpOworCQl1MzIgdmFsID0gcmVhZGxfbGUoYmFzZSk7CisJCXJldHVybiB2YWw7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIgICAgLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCit2YWwgICAgIC0gVmFsdWUgdG8gc3RvcmUKKworUkVNQVJLUzoKK1dyaXRlcyBhIGJ5dGUgdmFsdWUgdG8gZW11bGF0b3IgbWVtb3J5LiBXZSBoYXZlIHRocmVlIGRpc3RpbmN0IG1lbW9yeQorcmVnaW9ucyB0aGF0IGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LCB3aGljaCB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBYODZBUEkgQkVfd3JiKHUzMiBhZGRyLCB1OCB2YWwpCit7CisJaWYgKCEoX0JFX2Vudi5lbXVsYXRlVkdBICYmIGFkZHIgPj0gMHhBMDAwMCAmJiBhZGRyIDw9IDB4QkZGRkYpKSB7CisJCXdyaXRlYl9sZShCRV9tZW1hZGRyKGFkZHIpLCB2YWwpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CithZGRyICAgIC0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAordmFsICAgICAtIFZhbHVlIHRvIHN0b3JlCisKK1JFTUFSS1M6CitXcml0ZXMgYSB3b3JkIHZhbHVlIHRvIGVtdWxhdG9yIG1lbW9yeS4gV2UgaGF2ZSB0aHJlZSBkaXN0aW5jdCBtZW1vcnkKK3JlZ2lvbnMgdGhhdCBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgd2hpY2ggdGhpcyBmdW5jdGlvbiBoYW5kbGVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgWDg2QVBJIEJFX3dydyh1MzIgYWRkciwgdTE2IHZhbCkKK3sKKwlpZiAoIShfQkVfZW52LmVtdWxhdGVWR0EgJiYgYWRkciA+PSAweEEwMDAwICYmIGFkZHIgPD0gMHhCRkZGRikpIHsKKwkJdTggKmJhc2UgPSBCRV9tZW1hZGRyKGFkZHIpOworCQl3cml0ZXdfbGUoYmFzZSwgdmFsKTsKKworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CithZGRyICAgIC0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAordmFsICAgICAtIFZhbHVlIHRvIHN0b3JlCisKK1JFTUFSS1M6CitXcml0ZXMgYSAzMi1iaXQgdmFsdWUgdG8gZW11bGF0b3IgbWVtb3J5LiBXZSBoYXZlIHRocmVlIGRpc3RpbmN0IG1lbW9yeQorcmVnaW9ucyB0aGF0IGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LCB3aGljaCB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBYODZBUEkgQkVfd3JsKHUzMiBhZGRyLCB1MzIgdmFsKQoreworCWlmICghKF9CRV9lbnYuZW11bGF0ZVZHQSAmJiBhZGRyID49IDB4QTAwMDAgJiYgYWRkciA8PSAweEJGRkZGKSkgeworCQl1OCAqYmFzZSA9IEJFX21lbWFkZHIoYWRkcik7CisJCXdyaXRlbF9sZShiYXNlLCB2YWwpOworCX0KK30KKworI2lmIGRlZmluZWQoREVCVUcpIHx8ICFkZWZpbmVkKF9faTM4Nl9fKQorCisvKiBGb3IgTm9uLUludGVsIG1hY2hpbmVzIHdlIG1heSBuZWVkIHRvIGVtdWxhdGUgc29tZSBJL08gcG9ydCBhY2Nlc3NlcyB0aGF0CisgKiB0aGUgQklPUyBtYXkgdHJ5IHRvIGFjY2Vzcywgc3VjaCBhcyB0aGUgUENJIGNvbmZpZyByZWdpc3RlcnMuCisgKi8KKworI2RlZmluZSBJU19USU1FUl9QT1JUKHBvcnQpICgweDQwIDw9IHBvcnQgJiYgcG9ydCA8PSAweDQzKQorI2RlZmluZSBJU19DTU9TX1BPUlQocG9ydCkgICgweDcwIDw9IHBvcnQgJiYgcG9ydCA8PSAweDcxKQorLyojZGVmaW5lIElTX1ZHQV9QT1JUKHBvcnQpICAgKF9CRV9lbnYuZW11bGF0ZVZHQSAmJiAweDNDMCA8PSBwb3J0ICYmIHBvcnQgPD0gMHgzREEpKi8KKyNkZWZpbmUgSVNfVkdBX1BPUlQocG9ydCkgICAoMHgzQzAgPD0gcG9ydCAmJiBwb3J0IDw9IDB4M0RBKQorI2RlZmluZSBJU19QQ0lfUE9SVChwb3J0KSAgICgweENGOCA8PSBwb3J0ICYmIHBvcnQgPD0gMHhDRkYpCisjZGVmaW5lIElTX1NQS1JfUE9SVChwb3J0KSAgKHBvcnQgPT0gMHg2MSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6Citwb3J0ICAgIC0gUG9ydCB0byByZWFkIGZyb20KK3R5cGUgICAgLSBUeXBlIG9mIGFjY2VzcyB0byBwZXJmb3JtCisKK1JFTUFSS1M6CitQZXJmb3JtcyBhbiBlbXVsYXRlZCByZWFkIGZyb20gdGhlIFN0YW5kYXJkIFZHQSBJL08gcG9ydHMuIElmIHRoZSB0YXJnZXQKK2hhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgbWFwcGluZyB0aGUgVkdBIEkvTyBhbmQgbWVtb3J5IChzdWNoIGFzIHNvbWUKK1Bvd2VyUEMgc3lzdGVtcyksIHdlIGVtdWxhdGUgdGhlIFZHQSBzbyB0aGF0IHRoZSBCSU9TIHdpbGwgc3RpbGwgYmUgYWJsZSB0bworc2V0IE5vblZHQSBkaXNwbGF5IG1vZGVzIHN1Y2ggYXMgb24gQVRJIGhhcmR3YXJlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1OCBWR0FfaW5wYiAoY29uc3QgaW50IHBvcnQpCit7CisJdTggdmFsID0gMHhmZjsKKworCXN3aXRjaCAocG9ydCkgeworCWNhc2UgMHgzQzA6CisJCS8qIDNDMCBoYXMgZnVua3kgY2hhcmFjdGVyaXN0aWNzIGJlY2F1c2UgaXQgY2FuIGFjdCBhcyBlaXRoZXIKKwkJICAgYSBkYXRhIHJlZ2lzdGVyIG9yIGluZGV4IHJlZ2lzdGVyIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUKKwkJICAgb2YgYW4gaW50ZXJuYWwgZmxpcCBmbG9wIGluIHRoZSBoYXJkd2FyZS4gSGVuY2Ugd2UgaGF2ZQorCQkgICB0byBlbXVsYXRlIHRoYXQgZnVuY3Rpb25hbGl0eSBpbiBoZXJlLiAqLworCQlpZiAoX0JFX2Vudi5mbGlwRmxvcDNDMCA9PSAwKSB7CisJCQkvKiBBY2Nlc3MgM0MwIGFzIGluZGV4IHJlZ2lzdGVyICovCisJCQl2YWwgPSBfQkVfZW52LmVtdTNDMDsKKwkJfSBlbHNlIHsKKwkJCS8qIEFjY2VzcyAzQzAgYXMgZGF0YSByZWdpc3RlciAqLworCQkJaWYgKF9CRV9lbnYuZW11M0MwIDwgQVRUX0MpCisJCQkJdmFsID0gX0JFX2Vudi5lbXUzQzFbX0JFX2Vudi5lbXUzQzBdOworCQl9CisJCV9CRV9lbnYuZmxpcEZsb3AzQzAgXj0gMTsKKwkJYnJlYWs7CisJY2FzZSAweDNDMToKKwkJaWYgKF9CRV9lbnYuZW11M0MwIDwgQVRUX0MpCisJCQlyZXR1cm4gX0JFX2Vudi5lbXUzQzFbX0JFX2Vudi5lbXUzQzBdOworCQlicmVhazsKKwljYXNlIDB4M0NDOgorCQlyZXR1cm4gX0JFX2Vudi5lbXUzQzI7CisJY2FzZSAweDNDNDoKKwkJcmV0dXJuIF9CRV9lbnYuZW11M0M0OworCWNhc2UgMHgzQzU6CisJCWlmIChfQkVfZW52LmVtdTNDNCA8IEFUVF9DKQorCQkJcmV0dXJuIF9CRV9lbnYuZW11M0M1W19CRV9lbnYuZW11M0M0XTsKKwkJYnJlYWs7CisJY2FzZSAweDNDNjoKKwkJcmV0dXJuIF9CRV9lbnYuZW11M0M2OworCWNhc2UgMHgzQzc6CisJCXJldHVybiBfQkVfZW52LmVtdTNDNzsKKwljYXNlIDB4M0M4OgorCQlyZXR1cm4gX0JFX2Vudi5lbXUzQzg7CisJY2FzZSAweDNDOToKKwkJaWYgKF9CRV9lbnYuZW11M0M3IDwgUEFMX0MpCisJCQlyZXR1cm4gX0JFX2Vudi5lbXUzQzlbX0JFX2Vudi5lbXUzQzcrK107CisJCWJyZWFrOworCWNhc2UgMHgzQ0U6CisJCXJldHVybiBfQkVfZW52LmVtdTNDRTsKKwljYXNlIDB4M0NGOgorCQlpZiAoX0JFX2Vudi5lbXUzQ0UgPCBHUkFfQykKKwkJCXJldHVybiBfQkVfZW52LmVtdTNDRltfQkVfZW52LmVtdTNDRV07CisJCWJyZWFrOworCWNhc2UgMHgzRDQ6CisJCWlmIChfQkVfZW52LmVtdTNDMiAmIDB4MSkKKwkJCXJldHVybiBfQkVfZW52LmVtdTNENDsKKwkJYnJlYWs7CisJY2FzZSAweDNENToKKwkJaWYgKChfQkVfZW52LmVtdTNDMiAmIDB4MSkgJiYgKF9CRV9lbnYuZW11M0Q0IDwgQ1JUX0MpKQorCQkJcmV0dXJuIF9CRV9lbnYuZW11M0Q1W19CRV9lbnYuZW11M0Q0XTsKKwkJYnJlYWs7CisJY2FzZSAweDNEQToKKwkJX0JFX2Vudi5mbGlwRmxvcDNDMCA9IDA7CisJCXZhbCA9IF9CRV9lbnYuZW11M0RBOworCQlfQkVfZW52LmVtdTNEQSBePSAweDk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gdmFsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3BvcnQgICAgLSBQb3J0IHRvIHdyaXRlIHRvCit0eXBlICAgIC0gVHlwZSBvZiBhY2Nlc3MgdG8gcGVyZm9ybQorCitSRU1BUktTOgorUGVyZm9ybXMgYW4gZW11bGF0ZWQgd3JpdGUgdG8gb25lIG9mIHRoZSA4MjUzIHRpbWVyIHJlZ2lzdGVycy4gRm9yIG5vdword2Ugb25seSBlbXVsYXRlIHRpbWVyIDAgd2hpY2ggaXMgdGhlIG9ubHkgdGltZXIgdGhhdCB0aGUgQklPUyBjb2RlIGFwcGVhcnMKK3RvIHVzZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBWR0Ffb3V0cGIgKGludCBwb3J0LCB1OCB2YWwpCit7CisJc3dpdGNoIChwb3J0KSB7CisJY2FzZSAweDNDMDoKKwkJLyogM0MwIGhhcyBmdW5reSBjaGFyYWN0ZXJpc3RpY3MgYmVjYXVzZSBpdCBjYW4gYWN0IGFzIGVpdGhlcgorCQkgICBhIGRhdGEgcmVnaXN0ZXIgb3IgaW5kZXggcmVnaXN0ZXIgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZQorCQkgICBvZiBhbiBpbnRlcm5hbCBmbGlwIGZsb3AgaW4gdGhlIGhhcmR3YXJlLiBIZW5jZSB3ZSBoYXZlCisJCSAgIHRvIGVtdWxhdGUgdGhhdCBmdW5jdGlvbmFsaXR5IGluIGhlcmUuICovCisJCWlmIChfQkVfZW52LmZsaXBGbG9wM0MwID09IDApIHsKKwkJCS8qIEFjY2VzcyAzQzAgYXMgaW5kZXggcmVnaXN0ZXIgKi8KKwkJCV9CRV9lbnYuZW11M0MwID0gdmFsOworCQl9IGVsc2UgeworCQkJLyogQWNjZXNzIDNDMCBhcyBkYXRhIHJlZ2lzdGVyICovCisJCQlpZiAoX0JFX2Vudi5lbXUzQzAgPCBBVFRfQykKKwkJCQlfQkVfZW52LmVtdTNDMVtfQkVfZW52LmVtdTNDMF0gPSB2YWw7CisJCX0KKwkJX0JFX2Vudi5mbGlwRmxvcDNDMCBePSAxOworCQlicmVhazsKKwljYXNlIDB4M0MyOgorCQlfQkVfZW52LmVtdTNDMiA9IHZhbDsKKwkJYnJlYWs7CisJY2FzZSAweDNDNDoKKwkJX0JFX2Vudi5lbXUzQzQgPSB2YWw7CisJCWJyZWFrOworCWNhc2UgMHgzQzU6CisJCWlmIChfQkVfZW52LmVtdTNDNCA8IEFUVF9DKQorCQkJX0JFX2Vudi5lbXUzQzVbX0JFX2Vudi5lbXUzQzRdID0gdmFsOworCQlicmVhazsKKwljYXNlIDB4M0M2OgorCQlfQkVfZW52LmVtdTNDNiA9IHZhbDsKKwkJYnJlYWs7CisJY2FzZSAweDNDNzoKKwkJX0JFX2Vudi5lbXUzQzcgPSAoaW50KSB2YWwgKjM7CisKKwkJYnJlYWs7CisJY2FzZSAweDNDODoKKwkJX0JFX2Vudi5lbXUzQzggPSAoaW50KSB2YWwgKjM7CisKKwkJYnJlYWs7CisJY2FzZSAweDNDOToKKwkJaWYgKF9CRV9lbnYuZW11M0M4IDwgUEFMX0MpCisJCQlfQkVfZW52LmVtdTNDOVtfQkVfZW52LmVtdTNDOCsrXSA9IHZhbDsKKwkJYnJlYWs7CisJY2FzZSAweDNDRToKKwkJX0JFX2Vudi5lbXUzQ0UgPSB2YWw7CisJCWJyZWFrOworCWNhc2UgMHgzQ0Y6CisJCWlmIChfQkVfZW52LmVtdTNDRSA8IEdSQV9DKQorCQkJX0JFX2Vudi5lbXUzQ0ZbX0JFX2Vudi5lbXUzQ0VdID0gdmFsOworCQlicmVhazsKKwljYXNlIDB4M0Q0OgorCQlpZiAoX0JFX2Vudi5lbXUzQzIgJiAweDEpCisJCQlfQkVfZW52LmVtdTNENCA9IHZhbDsKKwkJYnJlYWs7CisJY2FzZSAweDNENToKKwkJaWYgKChfQkVfZW52LmVtdTNDMiAmIDB4MSkgJiYgKF9CRV9lbnYuZW11M0Q0IDwgQ1JUX0MpKQorCQkJX0JFX2Vudi5lbXUzRDVbX0JFX2Vudi5lbXUzRDRdID0gdmFsOworCQlicmVhazsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcmVnT2Zmc2V0ICAgLSBPZmZzZXQgaW50byByZWdpc3RlciBzcGFjZSBmb3Igbm9uLURXT1JEIGFjY2Vzc2VzCit2YWx1ZSAgICAgICAtIFZhbHVlIHRvIHdyaXRlIHRvIHJlZ2lzdGVyIGZvciBQQ0lfV1JJVEVfKiBvcGVyYXRpb25zCitmdW5jICAgICAgICAtIEZ1bmN0aW9uIHRvIHBlcmZvcm0gKFBDSUFjY2Vzc1JlZ0ZsYWdzKQorCitSRVRVUk5TOgorVmFsdWUgcmVhZCBmcm9tIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgZm9yIFBDSV9SRUFEXyogb3BlcmF0aW9ucworCitSRU1BUktTOgorQWNjZXNzZXMgYSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSByZWdpc3RlciBieSBkZWNvZGluZyB0aGUgdmFsdWUgY3VycmVudGx5CitzdG9yZWQgaW4gdGhlIF9CRV9lbnYuY29uZmlnQWRkcmVzcyB2YXJpYWJsZSBhbmQgcGFzc2luZyBpdCB0aHJvdWdoIHRvIHRoZQorcG9ydGFibGUgUENJX2FjY2Vzc1JlZyBmdW5jdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdTMyIEJFX2FjY2Vzc1JlZyhpbnQgcmVnT2Zmc2V0LCB1MzIgdmFsdWUsIGludCBmdW5jKQoreworI2lmZGVmIF9fS0VSTkVMX18KKwlpbnQgZnVuY3Rpb24sIGRldmljZSwgYnVzOworCXU4IHZhbDg7CisJdTE2IHZhbDE2OworCXUzMiB2YWwzMjsKKworCisJLyogRGVjb2RlIHRoZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIHZhbHVlcyBmb3IgdGhlIHJlZ2lzdGVyIHdlIHdpc2ggdG8KKwkgKiBhY2Nlc3MKKwkgKi8KKwlyZWdPZmZzZXQgKz0gKF9CRV9lbnYuY29uZmlnQWRkcmVzcyAmIDB4RkYpOworCWZ1bmN0aW9uID0gKF9CRV9lbnYuY29uZmlnQWRkcmVzcyA+PiA4KSAmIDB4NzsKKwlkZXZpY2UgPSAoX0JFX2Vudi5jb25maWdBZGRyZXNzID4+IDExKSAmIDB4MUY7CisJYnVzID0gKF9CRV9lbnYuY29uZmlnQWRkcmVzcyA+PiAxNikgJiAweEZGOworCisJLyogSWdub3JlIGFjY2Vzc2VzIHRvIGFsbCBkZXZpY2VzIG90aGVyIHRoYW4gdGhlIG9uZSB3ZSdyZSBQT1NUaW5nICovCisJaWYgKChmdW5jdGlvbiA9PSBfQkVfZW52LnZnYUluZm8uZnVuY3Rpb24pICYmCisJICAgIChkZXZpY2UgPT0gX0JFX2Vudi52Z2FJbmZvLmRldmljZSkgJiYKKwkgICAgKGJ1cyA9PSBfQkVfZW52LnZnYUluZm8uYnVzKSkgeworCQlzd2l0Y2ggKGZ1bmMpIHsKKwkJY2FzZSBSRUdfUkVBRF9CWVRFOgorCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoX0JFX2Vudi52Z2FJbmZvLnBjaWRldiwgcmVnT2Zmc2V0LAorCQkJCQkgICAgICZ2YWw4KTsKKwkJCXJldHVybiB2YWw4OworCQljYXNlIFJFR19SRUFEX1dPUkQ6CisJCQlwY2lfcmVhZF9jb25maWdfd29yZChfQkVfZW52LnZnYUluZm8ucGNpZGV2LCByZWdPZmZzZXQsCisJCQkJCSAgICAgJnZhbDE2KTsKKwkJCXJldHVybiB2YWwxNjsKKwkJY2FzZSBSRUdfUkVBRF9EV09SRDoKKwkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChfQkVfZW52LnZnYUluZm8ucGNpZGV2LCByZWdPZmZzZXQsCisJCQkJCSAgICAgICZ2YWwzMik7CisJCQlyZXR1cm4gdmFsMzI7CisJCWNhc2UgUkVHX1dSSVRFX0JZVEU6CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoX0JFX2Vudi52Z2FJbmZvLnBjaWRldiwgcmVnT2Zmc2V0LAorCQkJCQkgICAgICB2YWx1ZSk7CisKKwkJCXJldHVybiAwOworCQljYXNlIFJFR19XUklURV9XT1JEOgorCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKF9CRV9lbnYudmdhSW5mby5wY2lkZXYsIHJlZ09mZnNldCwKKwkJCQkJICAgICAgdmFsdWUpOworCisJCQlyZXR1cm4gMDsKKwkJY2FzZSBSRUdfV1JJVEVfRFdPUkQ6CisJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKF9CRV9lbnYudmdhSW5mby5wY2lkZXYsCisJCQkJCSAgICAgICByZWdPZmZzZXQsIHZhbHVlKTsKKworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIDA7CisjZWxzZQorCVBDSURldmljZUluZm8gcGNpSW5mbzsKKworCXBjaUluZm8ubWVjaDEgPSAxOworCXBjaUluZm8uc2xvdC5pID0gMDsKKwlwY2lJbmZvLnNsb3QucC5GdW5jdGlvbiA9IChfQkVfZW52LmNvbmZpZ0FkZHJlc3MgPj4gOCkgJiAweDc7CisJcGNpSW5mby5zbG90LnAuRGV2aWNlID0gKF9CRV9lbnYuY29uZmlnQWRkcmVzcyA+PiAxMSkgJiAweDFGOworCXBjaUluZm8uc2xvdC5wLkJ1cyA9IChfQkVfZW52LmNvbmZpZ0FkZHJlc3MgPj4gMTYpICYgMHhGRjsKKwlwY2lJbmZvLnNsb3QucC5FbmFibGUgPSAxOworCisJLyogSWdub3JlIGFjY2Vzc2VzIHRvIGFsbCBkZXZpY2VzIG90aGVyIHRoYW4gdGhlIG9uZSB3ZSdyZSBQT1NUaW5nICovCisJaWYgKChwY2lJbmZvLnNsb3QucC5GdW5jdGlvbiA9PQorCSAgICAgX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8tPnNsb3QucC5GdW5jdGlvbikKKwkgICAgJiYgKHBjaUluZm8uc2xvdC5wLkRldmljZSA9PSBfQkVfZW52LnZnYUluZm8ucGNpSW5mby0+c2xvdC5wLkRldmljZSkKKwkgICAgJiYgKHBjaUluZm8uc2xvdC5wLkJ1cyA9PSBfQkVfZW52LnZnYUluZm8ucGNpSW5mby0+c2xvdC5wLkJ1cykpCisJCXJldHVybiBQQ0lfYWNjZXNzUmVnKChfQkVfZW52LmNvbmZpZ0FkZHJlc3MgJiAweEZGKSArIHJlZ09mZnNldCwKKwkJCQkgICAgIHZhbHVlLCBmdW5jLCAmcGNpSW5mbyk7CisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6Citwb3J0ICAgIC0gUG9ydCB0byByZWFkIGZyb20KK3R5cGUgICAgLSBUeXBlIG9mIGFjY2VzcyB0byBwZXJmb3JtCisKK1JFTUFSS1M6CitQZXJmb3JtcyBhbiBlbXVsYXRlZCByZWFkIGZyb20gb25lIG9mIHRoZSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSByZWdpc3RlcnMuCitXZSBlbXVsYXRlIHRoaXMgdXNpbmcgb3VyIFBDSV9hY2Nlc3NSZWcgZnVuY3Rpb24gd2hpY2ggd2lsbCBhY2Nlc3MgdGhlIFBDSQorY29uZmlndXJhdGlvbiBzcGFjZSByZWdpc3RlcnMgaW4gYSBwb3J0YWJsZSBmYXNoaW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1MzIgUENJX2lucChpbnQgcG9ydCwgaW50IHR5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBSRUdfUkVBRF9CWVRFOgorCQlpZiAoKF9CRV9lbnYuY29uZmlnQWRkcmVzcyAmIDB4ODAwMDAwMDApICYmIDB4Q0ZDIDw9IHBvcnQKKwkJICAgICYmIHBvcnQgPD0gMHhDRkYpCisJCQlyZXR1cm4gQkVfYWNjZXNzUmVnKHBvcnQgLSAweENGQywgMCwgUkVHX1JFQURfQllURSk7CisJCWJyZWFrOworCWNhc2UgUkVHX1JFQURfV09SRDoKKwkJaWYgKChfQkVfZW52LmNvbmZpZ0FkZHJlc3MgJiAweDgwMDAwMDAwKSAmJiAweENGQyA8PSBwb3J0CisJCSAgICAmJiBwb3J0IDw9IDB4Q0ZGKQorCQkJcmV0dXJuIEJFX2FjY2Vzc1JlZyhwb3J0IC0gMHhDRkMsIDAsIFJFR19SRUFEX1dPUkQpOworCQlicmVhazsKKwljYXNlIFJFR19SRUFEX0RXT1JEOgorCQlpZiAocG9ydCA9PSAweENGOCkKKwkJCXJldHVybiBfQkVfZW52LmNvbmZpZ0FkZHJlc3M7CisJCWVsc2UgaWYgKChfQkVfZW52LmNvbmZpZ0FkZHJlc3MgJiAweDgwMDAwMDAwKSAmJiBwb3J0ID09IDB4Q0ZDKQorCQkJcmV0dXJuIEJFX2FjY2Vzc1JlZygwLCAwLCBSRUdfUkVBRF9EV09SRCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6Citwb3J0ICAgIC0gUG9ydCB0byB3cml0ZSB0bwordHlwZSAgICAtIFR5cGUgb2YgYWNjZXNzIHRvIHBlcmZvcm0KKworUkVNQVJLUzoKK1BlcmZvcm1zIGFuIGVtdWxhdGVkIHdyaXRlIHRvIG9uZSBvZiB0aGUgUENJIGNvbnRyb2wgcmVnaXN0ZXJzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIFBDSV9vdXRwKGludCBwb3J0LCB1MzIgdmFsLCBpbnQgdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFJFR19XUklURV9CWVRFOgorCQlpZiAoKF9CRV9lbnYuY29uZmlnQWRkcmVzcyAmIDB4ODAwMDAwMDApICYmIDB4Q0ZDIDw9IHBvcnQKKwkJICAgICYmIHBvcnQgPD0gMHhDRkYpCisJCQlCRV9hY2Nlc3NSZWcocG9ydCAtIDB4Q0ZDLCB2YWwsIFJFR19XUklURV9CWVRFKTsKKwkJYnJlYWs7CisJY2FzZSBSRUdfV1JJVEVfV09SRDoKKwkJaWYgKChfQkVfZW52LmNvbmZpZ0FkZHJlc3MgJiAweDgwMDAwMDAwKSAmJiAweENGQyA8PSBwb3J0CisJCSAgICAmJiBwb3J0IDw9IDB4Q0ZGKQorCQkJQkVfYWNjZXNzUmVnKHBvcnQgLSAweENGQywgdmFsLCBSRUdfV1JJVEVfV09SRCk7CisJCWJyZWFrOworCWNhc2UgUkVHX1dSSVRFX0RXT1JEOgorCQlpZiAocG9ydCA9PSAweENGOCkKKwkJeworCQkJX0JFX2Vudi5jb25maWdBZGRyZXNzID0gdmFsICYgMHg4MEZGRkZGQzsKKwkJfQorCQllbHNlIGlmICgoX0JFX2Vudi5jb25maWdBZGRyZXNzICYgMHg4MDAwMDAwMCkgJiYgcG9ydCA9PSAweENGQykKKwkJCUJFX2FjY2Vzc1JlZygwLCB2YWwsIFJFR19XUklURV9EV09SRCk7CisJCWJyZWFrOworCX0KK30KKworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcG9ydCAgICAtIFBvcnQgdG8gd3JpdGUgdG8KKworUkVUVVJOUzoKK1ZhbHVlIHJlYWQgZnJvbSB0aGUgSS9PIHBvcnQKKworUkVNQVJLUzoKK1BlcmZvcm1zIGFuIGVtdWxhdGVkIDgtYml0IHJlYWQgZnJvbSBhbiBJL08gcG9ydC4gV2UgaGFuZGxlIHNwZWNpYWwgY2FzZXMKK3RoYXQgd2UgbmVlZCB0byBlbXVsYXRlIGluIGhlcmUsIGFuZCBmYWxsIHRocm91Z2ggdG8gcmVmbGVjdGluZyB0aGUgd3JpdGUKK3Rocm91Z2ggdG8gdGhlIHJlYWwgaGFyZHdhcmUgaWYgd2UgZG9uJ3QgbmVlZCB0byBzcGVjaWFsIGNhc2UgaXQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggWDg2QVBJIEJFX2luYihYODZFTVVfcGlvQWRkciBwb3J0KQoreworCXU4IHZhbCA9IDA7CisKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCAhZGVmaW5lZChfX2kzODZfXykKKwlpZiAoSVNfVkdBX1BPUlQocG9ydCkpeworCQkvKnNlZW1zIHJlYWRpbmcgcG9ydCAweDNjMyByZXR1cm4gdGhlIGhpZ2ggMTYgYml0IG9mIGlvIHBvcnQqLworCQlpZihwb3J0ID09IDB4M2MzKQorCQkJdmFsID0gTE9HX2lucGIocG9ydCk7CisJCWVsc2UKKwkJCXZhbCA9IFZHQV9pbnBiKHBvcnQpOworCX0KKwllbHNlIGlmIChJU19USU1FUl9QT1JUKHBvcnQpKQorCQlEQihwcmludGYoIkNhbiBub3QgaW50ZXJlcHQgVElNRVIgcG9ydCBub3chXG4iKTspCisJZWxzZSBpZiAoSVNfU1BLUl9QT1JUKHBvcnQpKQorCQlEQihwcmludGYoIkNhbiBub3QgaW50ZXJlcHQgU1BFQUtFUiBwb3J0IG5vdyFcbiIpOykKKwllbHNlIGlmIChJU19DTU9TX1BPUlQocG9ydCkpCisJCURCKHByaW50ZigiQ2FuIG5vdCBpbnRlcmVwdCBDTU9TIHBvcnQgbm93IVxuIik7KQorCWVsc2UgaWYgKElTX1BDSV9QT1JUKHBvcnQpKQorCQl2YWwgPSBQQ0lfaW5wKHBvcnQsIFJFR19SRUFEX0JZVEUpOworCWVsc2UgaWYgKHBvcnQgPCAweDEwMCkgeworCQlEQihwcmludGYoIldBUk46IElOVkFMSUQgaW5iLiUwNFggLT4gJTAyWFxuIiwgKHUxNikgcG9ydCwgdmFsKTspCisJCXZhbCA9IExPR19pbnBiKHBvcnQpOworCX0gZWxzZQorI2VuZGlmCisJCXZhbCA9IExPR19pbnBiKHBvcnQpOworCXJldHVybiB2YWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcG9ydCAgICAtIFBvcnQgdG8gd3JpdGUgdG8KKworUkVUVVJOUzoKK1ZhbHVlIHJlYWQgZnJvbSB0aGUgSS9PIHBvcnQKKworUkVNQVJLUzoKK1BlcmZvcm1zIGFuIGVtdWxhdGVkIDE2LWJpdCByZWFkIGZyb20gYW4gSS9PIHBvcnQuIFdlIGhhbmRsZSBzcGVjaWFsIGNhc2VzCit0aGF0IHdlIG5lZWQgdG8gZW11bGF0ZSBpbiBoZXJlLCBhbmQgZmFsbCB0aHJvdWdoIHRvIHJlZmxlY3RpbmcgdGhlIHdyaXRlCit0aHJvdWdoIHRvIHRoZSByZWFsIGhhcmR3YXJlIGlmIHdlIGRvbid0IG5lZWQgdG8gc3BlY2lhbCBjYXNlIGl0LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBYODZBUEkgQkVfaW53KFg4NkVNVV9waW9BZGRyIHBvcnQpCit7CisJdTE2IHZhbCA9IDA7CisKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCAhZGVmaW5lZChfX2kzODZfXykKKwlpZiAoSVNfUENJX1BPUlQocG9ydCkpCisJCXZhbCA9IFBDSV9pbnAocG9ydCwgUkVHX1JFQURfV09SRCk7CisJZWxzZSBpZiAocG9ydCA8IDB4MTAwKSB7CisJCURCKHByaW50ZigiV0FSTjogTWF5YmUgSU5WQUxJRCBpbncuJTA0WCAtPiAlMDRYXG4iLCAodTE2KSBwb3J0LCB2YWwpOykKKwkJdmFsID0gTE9HX2lucHcocG9ydCk7CisJfSBlbHNlCisjZW5kaWYKKwkJdmFsID0gTE9HX2lucHcocG9ydCk7CisJcmV0dXJuIHZhbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6Citwb3J0ICAgIC0gUG9ydCB0byB3cml0ZSB0bworCitSRVRVUk5TOgorVmFsdWUgcmVhZCBmcm9tIHRoZSBJL08gcG9ydAorCitSRU1BUktTOgorUGVyZm9ybXMgYW4gZW11bGF0ZWQgMzItYml0IHJlYWQgZnJvbSBhbiBJL08gcG9ydC4gV2UgaGFuZGxlIHNwZWNpYWwgY2FzZXMKK3RoYXQgd2UgbmVlZCB0byBlbXVsYXRlIGluIGhlcmUsIGFuZCBmYWxsIHRocm91Z2ggdG8gcmVmbGVjdGluZyB0aGUgd3JpdGUKK3Rocm91Z2ggdG8gdGhlIHJlYWwgaGFyZHdhcmUgaWYgd2UgZG9uJ3QgbmVlZCB0byBzcGVjaWFsIGNhc2UgaXQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIFg4NkFQSSBCRV9pbmwoWDg2RU1VX3Bpb0FkZHIgcG9ydCkKK3sKKwl1MzIgdmFsID0gMDsKKworI2lmIGRlZmluZWQoREVCVUcpIHx8ICFkZWZpbmVkKF9faTM4Nl9fKQorCWlmIChJU19QQ0lfUE9SVChwb3J0KSkKKwkJdmFsID0gUENJX2lucChwb3J0LCBSRUdfUkVBRF9EV09SRCk7CisJZWxzZSBpZiAocG9ydCA8IDB4MTAwKSB7CisJCXZhbCA9IExPR19pbnBkKHBvcnQpOworCX0gZWxzZQorI2VuZGlmCisJCXZhbCA9IExPR19pbnBkKHBvcnQpOworCXJldHVybiB2YWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcG9ydCAgICAtIFBvcnQgdG8gd3JpdGUgdG8KK3ZhbCAgICAgLSBWYWx1ZSB0byB3cml0ZSB0byBwb3J0CisKK1JFTUFSS1M6CitQZXJmb3JtcyBhbiBlbXVsYXRlZCA4LWJpdCB3cml0ZSB0byBhbiBJL08gcG9ydC4gV2UgaGFuZGxlIHNwZWNpYWwgY2FzZXMKK3RoYXQgd2UgbmVlZCB0byBlbXVsYXRlIGluIGhlcmUsIGFuZCBmYWxsIHRocm91Z2ggdG8gcmVmbGVjdGluZyB0aGUgd3JpdGUKK3Rocm91Z2ggdG8gdGhlIHJlYWwgaGFyZHdhcmUgaWYgd2UgZG9uJ3QgbmVlZCB0byBzcGVjaWFsIGNhc2UgaXQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBYODZBUEkgQkVfb3V0YihYODZFTVVfcGlvQWRkciBwb3J0LCB1OCB2YWwpCit7CisjaWYgZGVmaW5lZChERUJVRykgfHwgIWRlZmluZWQoX19pMzg2X18pCisJaWYgKElTX1ZHQV9QT1JUKHBvcnQpKQorCQlWR0Ffb3V0cGIocG9ydCwgdmFsKTsKKwllbHNlIGlmIChJU19USU1FUl9QT1JUKHBvcnQpKQorCQlEQihwcmludGYoIkNhbiBub3QgaW50ZXJlcHQgVElNRVIgcG9ydCBub3chXG4iKTspCisJZWxzZSBpZiAoSVNfU1BLUl9QT1JUKHBvcnQpKQorCQlEQihwcmludGYoIkNhbiBub3QgaW50ZXJlcHQgU1BFQUtFUiBwb3J0IG5vdyFcbiIpOykKKwllbHNlIGlmIChJU19DTU9TX1BPUlQocG9ydCkpCisJCURCKHByaW50ZigiQ2FuIG5vdCBpbnRlcmVwdCBDTU9TIHBvcnQgbm93IVxuIik7KQorCWVsc2UgaWYgKElTX1BDSV9QT1JUKHBvcnQpKQorCQlQQ0lfb3V0cChwb3J0LCB2YWwsIFJFR19XUklURV9CWVRFKTsKKwllbHNlIGlmIChwb3J0IDwgMHgxMDApIHsKKwkJREIocHJpbnRmKCJXQVJOOk1heWJlIElOVkFMSUQgb3V0Yi4lMDRYIDwtICUwMlhcbiIsICh1MTYpIHBvcnQsIHZhbCk7KQorCQlMT0dfb3V0cGIocG9ydCwgdmFsKTsKKwl9IGVsc2UKKyNlbmRpZgorCQlMT0dfb3V0cGIocG9ydCwgdmFsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6Citwb3J0ICAgIC0gUG9ydCB0byB3cml0ZSB0bwordmFsICAgICAtIFZhbHVlIHRvIHdyaXRlIHRvIHBvcnQKKworUkVNQVJLUzoKK1BlcmZvcm1zIGFuIGVtdWxhdGVkIDE2LWJpdCB3cml0ZSB0byBhbiBJL08gcG9ydC4gV2UgaGFuZGxlIHNwZWNpYWwgY2FzZXMKK3RoYXQgd2UgbmVlZCB0byBlbXVsYXRlIGluIGhlcmUsIGFuZCBmYWxsIHRocm91Z2ggdG8gcmVmbGVjdGluZyB0aGUgd3JpdGUKK3Rocm91Z2ggdG8gdGhlIHJlYWwgaGFyZHdhcmUgaWYgd2UgZG9uJ3QgbmVlZCB0byBzcGVjaWFsIGNhc2UgaXQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBYODZBUEkgQkVfb3V0dyhYODZFTVVfcGlvQWRkciBwb3J0LCB1MTYgdmFsKQoreworI2lmIGRlZmluZWQoREVCVUcpIHx8ICFkZWZpbmVkKF9faTM4Nl9fKQorCQlpZiAoSVNfVkdBX1BPUlQocG9ydCkpIHsKKwkJCVZHQV9vdXRwYihwb3J0LCB2YWwpOworCQkJVkdBX291dHBiKHBvcnQgKyAxLCB2YWwgPj4gOCk7CisJCX0gZWxzZSBpZiAoSVNfUENJX1BPUlQocG9ydCkpCisJCQlQQ0lfb3V0cChwb3J0LCB2YWwsIFJFR19XUklURV9XT1JEKTsKKwkJZWxzZSBpZiAocG9ydCA8IDB4MTAwKSB7CisJCQlEQihwcmludGYoIldBUk46IE1BeWJlIElOVkFMSUQgb3V0dy4lMDRYIDwtICUwNFhcbiIsICh1MTYpIHBvcnQsCisJCQkgICAgICAgdmFsKTspCisJCQlMT0dfb3V0cHcocG9ydCwgdmFsKTsKKwkJfSBlbHNlCisjZW5kaWYKKwkJCUxPR19vdXRwdyhwb3J0LCB2YWwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3BvcnQgICAgLSBQb3J0IHRvIHdyaXRlIHRvCit2YWwgICAgIC0gVmFsdWUgdG8gd3JpdGUgdG8gcG9ydAorCitSRU1BUktTOgorUGVyZm9ybXMgYW4gZW11bGF0ZWQgMzItYml0IHdyaXRlIHRvIGFuIEkvTyBwb3J0LiBXZSBoYW5kbGUgc3BlY2lhbCBjYXNlcwordGhhdCB3ZSBuZWVkIHRvIGVtdWxhdGUgaW4gaGVyZSwgYW5kIGZhbGwgdGhyb3VnaCB0byByZWZsZWN0aW5nIHRoZSB3cml0ZQordGhyb3VnaCB0byB0aGUgcmVhbCBoYXJkd2FyZSBpZiB3ZSBkb24ndCBuZWVkIHRvIHNwZWNpYWwgY2FzZSBpdC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFg4NkFQSSBCRV9vdXRsKFg4NkVNVV9waW9BZGRyIHBvcnQsIHUzMiB2YWwpCit7CisjaWYgZGVmaW5lZChERUJVRykgfHwgIWRlZmluZWQoX19pMzg2X18pCisJaWYgKElTX1BDSV9QT1JUKHBvcnQpKQorCQlQQ0lfb3V0cChwb3J0LCB2YWwsIFJFR19XUklURV9EV09SRCk7CisJZWxzZSBpZiAocG9ydCA8IDB4MTAwKSB7CisJCURCKHByaW50ZigiV0FSTjogSU5WQUxJRCBvdXRsLiUwNFggPC0gJTA4WFxuIiwgKHUxNikgcG9ydCx2YWwpOykKKwkJTE9HX291dHBkKHBvcnQsIHZhbCk7CisJfSBlbHNlCisjZW5kaWYKKwkJTE9HX291dHBkKHBvcnQsIHZhbCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmlvc19lbXVsYXRvci9iaW9zLmMgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvYmlvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYTFiZmIyZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci9iaW9zLmMKQEAgLTAsMCArMSwzMjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgICAgICAgQklPUyBlbXVsYXRvciBhbmQgaW50ZXJmYWNlCisqICAgICAgICAgICAgICAgICAgICAgIHRvIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqICBDb3B5cmlnaHQgKEMpIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogIEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CisqCisqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisqICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCisqICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisqICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubworKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisqCisqICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisqICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisqICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBBbnkKKyogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246ICBNb2R1bGUgaW1wbGVtZW50aW5nIHRoZSBCSU9TIHNwZWNpZmljIGZ1bmN0aW9ucy4KKyoKKyogCQlKYXNvbiBwb3J0ZWQgdGhpcyBmaWxlIHRvIHUtYm9vdCB0byBydW4gdGhlIEFUSSB2aWRlbyBjYXJkCisqIAkJdmlkZW8gQklPUy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJiaW9zZW11aS5oIgorCisjaWYgZGVmaW5lZChDT05GSUdfQklPU0VNVSkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgoraW50bm8gICAtIEludGVycnVwdCBudW1iZXIgYmVpbmcgc2VydmljZWQKKworUkVNQVJLUzoKK0hhbmRsZXIgZm9yIHVuZGVmaW5lZCBpbnRlcnJ1cHRzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIFg4NkFQSSB1bmRlZmluZWRfaW50cihpbnQgaW50bm8pCit7CisJaWYgKEJFX3JkdyhpbnRubyAqIDQgKyAyKSA9PSBCSU9TX1NFRykgeworCQlEQihwcmludGYoImJpb3NFbXU6IHVuZGVmaW5lZCBpbnRlcnJ1cHQgJXhoIGNhbGxlZCFcbiIsIGludG5vKTspCisJfSBlbHNlCisJCVg4NkVNVV9wcmVwYXJlRm9ySW50KGludG5vKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitpbnRubyAgIC0gSW50ZXJydXB0IG51bWJlciBiZWluZyBzZXJ2aWNlZAorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBkZWZhdWx0IHN5c3RlbSBCSU9TIEludCAxMGggKHRoZSBkZWZhdWx0IGlzIHN0b3JlZAoraW4gdGhlIEludCA0MmggdmVjdG9yIGJ5IHRoZSBzeXN0ZW0gQklPUyBhdCBib290dXApLiBXZSBvbmx5IG5lZWQgdG8gaGFuZGxlCithIHNtYWxsIG51bWJlciBvZiBzcGVjaWFsIGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBCSU9TIGR1cmluZyBQT1NUIHRpbWUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgWDg2QVBJIGludDQyKGludCBpbnRubykKK3sKKwlpZiAoTS54ODYuUl9BSCA9PSAweDEyICYmIE0ueDg2LlJfQkwgPT0gMHgzMikgeworCQlpZiAoTS54ODYuUl9BTCA9PSAwKSB7CisJCQkvKiBFbmFibGUgQ1BVIGFjY2Vzc2VzIHRvIHZpZGVvIG1lbW9yeSAqLworCQkJUE1fb3V0cGIoMHgzYzIsIFBNX2lucGIoMHgzY2MpIHwgKHU4KSAweDAyKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIGlmIChNLng4Ni5SX0FMID09IDEpIHsKKwkJCS8qIERpc2FibGUgQ1BVIGFjY2Vzc2VzIHRvIHZpZGVvIG1lbW9yeSAqLworCQkJUE1fb3V0cGIoMHgzYzIsIFBNX2lucGIoMHgzY2MpICYgKHU4KSB+IDB4MDIpOworCQkJcmV0dXJuOworCQl9CisjaWZkZWYgIERFQlVHCisJCWVsc2UgeworCQkJcHJpbnRmKCJpbnQ0MjogdW5rbm93biBmdW5jdGlvbiBBSD0weDEyLCBCTD0weDMyLCBBTD0lIzAyeFxuIiwKKwkJCSAgICAgTS54ODYuUl9BTCk7CisJCX0KKyNlbmRpZgorCX0KKyNpZmRlZiAgREVCVUcKKwllbHNlIHsKKwkJcHJpbnRmKCJpbnQ0MjogdW5rbm93biBmdW5jdGlvbiBBSD0lIzAyeCwgQUw9JSMwMngsIEJMPSUjMDJ4XG4iLAorCQkgICAgIE0ueDg2LlJfQUgsIE0ueDg2LlJfQUwsIE0ueDg2LlJfQkwpOworCX0KKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2ludG5vICAgLSBJbnRlcnJ1cHQgbnVtYmVyIGJlaW5nIHNlcnZpY2VkCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGRlZmF1bHQgc3lzdGVtIEJJT1MgSW50IDEwaC4gSWYgdGhlIFBPU1QgY29kZQoraGFzIG5vdCB5ZXQgcmUtdmVjdG9yZWQgdGhlIEludCAxMGggQklPUyBpbnRlcnJ1cHQgdmVjdG9yLCB3ZSBoYW5kbGUgdGhpcworYnkgc2ltcGx5IGNhbGxpbmcgdGhlIGludDQyIGludGVycnVwdCBoYW5kbGVyIGFib3ZlLiBWZXJ5IGVhcmx5IGluIHRoZQorQklPUyBQT1NUIHByb2Nlc3MsIHRoZSB2ZWN0b3IgZ2V0cyByZXBsYWNlZCBhbmQgd2Ugc2ltcGx5IGxldCB0aGUgcmVhbAorbW9kZSBpbnRlcnJ1cHQgaGFuZGxlciBwcm9jZXNzIHRoZSBpbnRlcnJ1cHQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgWDg2QVBJIGludDEwKGludCBpbnRubykKK3sKKwlpZiAoQkVfcmR3KGludG5vICogNCArIDIpID09IEJJT1NfU0VHKQorCQlpbnQ0MihpbnRubyk7CisJZWxzZQorCQlYODZFTVVfcHJlcGFyZUZvckludChpbnRubyk7Cit9CisKKy8qIFJlc3VsdCBjb2RlcyByZXR1cm5lZCBieSB0aGUgUENJIEJJT1MgKi8KKworI2RlZmluZSBTVUNDRVNTRlVMICAgICAgICAgIDB4MDAKKyNkZWZpbmUgRlVOQ19OT1RfU1VQUE9SVCAgICAweDgxCisjZGVmaW5lIEJBRF9WRU5ET1JfSUQgICAgICAgMHg4MworI2RlZmluZSBERVZJQ0VfTk9UX0ZPVU5EICAgIDB4ODYKKyNkZWZpbmUgQkFEX1JFR0lTVEVSX05VTUJFUiAweDg3CisjZGVmaW5lIFNFVF9GQUlMRUQgICAgICAgICAgMHg4OAorI2RlZmluZSBCVUZGRVJfVE9PX1NNQUxMICAgIDB4ODkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitpbnRubyAgIC0gSW50ZXJydXB0IG51bWJlciBiZWluZyBzZXJ2aWNlZAorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBkZWZhdWx0IEludCAxQWggaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSByZWFsCittb2RlIGNvZGUsIHdoaWNoIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBQQ0kgQklPUyBmdW5jdGlvbnMuIFNpbmNlIHdlIG9ubHkKK3dhbnQgdG8gYWxsb3cgdGhlIHJlYWwgbW9kZSBCSU9TIGNvZGUgKm9ubHkqIHNlZSB0aGUgUENJIGNvbmZpZyBzcGFjZSBmb3IKK2l0cyBvd24gZGV2aWNlLCB3ZSBvbmx5IHJldHVybiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmljIFBDSSBjb25maWcKK3NwYWNlIHRoYXQgd2UgaGF2ZSBwYXNzZWQgaW4gdG8gdGhlIGluaXQgZnVuY3Rpb24uIFRoaXMgc29sdmVzIHByb2JsZW1zCit3aGVuIHVzaW5nIHRoZSBCSU9TIHRvIHdhcm0gYm9vdCBhIHNlY29uZGFyeSBhZGFwdGVyIHdoZW4gdGhlcmUgaXMgYW4KK2lkZW50aWNhbCBhZGFwdGVyIGJlZm9yZSBpdCBvbiB0aGUgYnVzIChzb21lIEJJT1MnZXMgZ2V0IGNvbmZ1c2VkIGluIHRoaXMKK2Nhc2UpLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIFg4NkFQSSBpbnQxQShpbnQgdW51c2VkKQoreworCXUxNiBwY2lTbG90OworCisjaWZkZWYgX19LRVJORUxfXworCXU4IGludGVyZmFjZSwgc3ViY2xhc3MsIGJhc2VjbGFzczsKKworCS8qIEluaXRpYWxpc2UgdGhlIFBDSSBzbG90IG51bWJlciAqLworCXBjaVNsb3QgPSAoKGludClfQkVfZW52LnZnYUluZm8uYnVzIDw8IDgpIHwKKwkgICAgKChpbnQpX0JFX2Vudi52Z2FJbmZvLmRldmljZSA8PCAzKSB8IChpbnQpX0JFX2Vudi52Z2FJbmZvLmZ1bmN0aW9uOworI2Vsc2UKKy8qIEZhaWwgaWYgbm8gUENJIGRldmljZSBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZWdpc3RlcmVkICovCisJaWYgKCFfQkVfZW52LnZnYUluZm8ucGNpSW5mbykKKwkJcmV0dXJuOworCisJcGNpU2xvdCA9ICh1MTYpIChfQkVfZW52LnZnYUluZm8ucGNpSW5mby0+c2xvdC5pID4+IDgpOworI2VuZGlmCisJc3dpdGNoIChNLng4Ni5SX0FYKSB7CisJY2FzZSAweEIxMDE6CQkvKiBQQ0kgYmlvcyBwcmVzZW50PyAqLworCQlNLng4Ni5SX0FMID0gMHgwMDsJLyogbm8gY29uZmlnIHNwYWNlL3NwZWNpYWwgY3ljbGUgZ2VuZXJhdGlvbiBzdXBwb3J0ICovCisJCU0ueDg2LlJfRURYID0gMHgyMDQ5NDM1MDsJLyogIiBJQ1AiICovCisJCU0ueDg2LlJfQlggPSAweDAyMTA7CS8qIFZlcnNpb24gMi4xMCAqLworCQlNLng4Ni5SX0NMID0gMDsJLyogTWF4IGJ1cyBudW1iZXIgaW4gc3lzdGVtICovCisJCUNMRUFSX0ZMQUcoRl9DRik7CisJCWJyZWFrOworCWNhc2UgMHhCMTAyOgkJLyogRmluZCBQQ0kgZGV2aWNlICovCisJCU0ueDg2LlJfQUggPSBERVZJQ0VfTk9UX0ZPVU5EOworI2lmZGVmIF9fS0VSTkVMX18KKwkJaWYgKE0ueDg2LlJfRFggPT0gX0JFX2Vudi52Z2FJbmZvLlZlbmRvcklEICYmCisJCSAgICBNLng4Ni5SX0NYID09IF9CRV9lbnYudmdhSW5mby5EZXZpY2VJRCAmJiBNLng4Ni5SX1NJID09IDApIHsKKyNlbHNlCisJCWlmIChNLng4Ni5SX0RYID09IF9CRV9lbnYudmdhSW5mby5wY2lJbmZvLT5WZW5kb3JJRCAmJgorCQkgICAgTS54ODYuUl9DWCA9PSBfQkVfZW52LnZnYUluZm8ucGNpSW5mby0+RGV2aWNlSUQgJiYKKwkJICAgIE0ueDg2LlJfU0kgPT0gMCkgeworI2VuZGlmCisJCQlNLng4Ni5SX0FIID0gU1VDQ0VTU0ZVTDsKKwkJCU0ueDg2LlJfQlggPSBwY2lTbG90OworCQl9CisJCUNPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFNVQ0NFU1NGVUwpLCBGX0NGKTsKKwkJYnJlYWs7CisJY2FzZSAweEIxMDM6CQkvKiBGaW5kIFBDSSBjbGFzcyBjb2RlICovCisJCU0ueDg2LlJfQUggPSBERVZJQ0VfTk9UX0ZPVU5EOworI2lmZGVmIF9fS0VSTkVMX18KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoX0JFX2Vudi52Z2FJbmZvLnBjaWRldiwgUENJX0NMQVNTX1BST0csCisJCQkJICAgICAmaW50ZXJmYWNlKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoX0JFX2Vudi52Z2FJbmZvLnBjaWRldiwgUENJX0NMQVNTX0RFVklDRSwKKwkJCQkgICAgICZzdWJjbGFzcyk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKF9CRV9lbnYudmdhSW5mby5wY2lkZXYsCisJCQkJICAgICBQQ0lfQ0xBU1NfREVWSUNFICsgMSwgJmJhc2VjbGFzcyk7CisJCWlmIChNLng4Ni5SX0NMID09IGludGVyZmFjZSAmJiBNLng4Ni5SX0NIID09IHN1YmNsYXNzCisJCSAgICAmJiAodTgpIChNLng4Ni5SX0VDWCA+PiAxNikgPT0gYmFzZWNsYXNzKSB7CisjZWxzZQorCQlpZiAoTS54ODYuUl9DTCA9PSBfQkVfZW52LnZnYUluZm8ucGNpSW5mby0+SW50ZXJmYWNlICYmCisJCSAgICBNLng4Ni5SX0NIID09IF9CRV9lbnYudmdhSW5mby5wY2lJbmZvLT5TdWJDbGFzcyAmJgorCQkgICAgKHU4KSAoTS54ODYuUl9FQ1ggPj4gMTYpID09CisJCSAgICBfQkVfZW52LnZnYUluZm8ucGNpSW5mby0+QmFzZUNsYXNzKSB7CisjZW5kaWYKKwkJCU0ueDg2LlJfQUggPSBTVUNDRVNTRlVMOworCQkJTS54ODYuUl9CWCA9IHBjaVNsb3Q7CisJCX0KKwkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKE0ueDg2LlJfQUggIT0gU1VDQ0VTU0ZVTCksIEZfQ0YpOworCQlicmVhazsKKwljYXNlIDB4QjEwODoJCS8qIFJlYWQgY29uZmlndXJhdGlvbiBieXRlICovCisJCU0ueDg2LlJfQUggPSBCQURfUkVHSVNURVJfTlVNQkVSOworCQlpZiAoTS54ODYuUl9CWCA9PSBwY2lTbG90KSB7CisJCQlNLng4Ni5SX0FIID0gU1VDQ0VTU0ZVTDsKKyNpZmRlZiBfX0tFUk5FTF9fCisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShfQkVfZW52LnZnYUluZm8ucGNpZGV2LCBNLng4Ni5SX0RJLAorCQkJCQkgICAgICZNLng4Ni5SX0NMKTsKKyNlbHNlCisJCQlNLng4Ni5SX0NMID0KKwkJCSAgICAodTgpIFBDSV9hY2Nlc3NSZWcoTS54ODYuUl9ESSwgMCwgUENJX1JFQURfQllURSwKKwkJCQkJICAgICAgIF9CRV9lbnYudmdhSW5mby5wY2lJbmZvKTsKKyNlbmRpZgorCQl9CisJCUNPTkRJVElPTkFMX1NFVF9GTEFHKChNLng4Ni5SX0FIICE9IFNVQ0NFU1NGVUwpLCBGX0NGKTsKKwkJYnJlYWs7CisJY2FzZSAweEIxMDk6CQkvKiBSZWFkIGNvbmZpZ3VyYXRpb24gd29yZCAqLworCQlNLng4Ni5SX0FIID0gQkFEX1JFR0lTVEVSX05VTUJFUjsKKwkJaWYgKE0ueDg2LlJfQlggPT0gcGNpU2xvdCkgeworCQkJTS54ODYuUl9BSCA9IFNVQ0NFU1NGVUw7CisjaWZkZWYgX19LRVJORUxfXworCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoX0JFX2Vudi52Z2FJbmZvLnBjaWRldiwgTS54ODYuUl9ESSwKKwkJCQkJICAgICAmTS54ODYuUl9DWCk7CisjZWxzZQorCQkJTS54ODYuUl9DWCA9CisJCQkgICAgKHUxNikgUENJX2FjY2Vzc1JlZyhNLng4Ni5SX0RJLCAwLCBQQ0lfUkVBRF9XT1JELAorCQkJCQkJX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8pOworI2VuZGlmCisJCX0KKwkJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKE0ueDg2LlJfQUggIT0gU1VDQ0VTU0ZVTCksIEZfQ0YpOworCQlicmVhazsKKwljYXNlIDB4QjEwQToJCS8qIFJlYWQgY29uZmlndXJhdGlvbiBkd29yZCAqLworCQlNLng4Ni5SX0FIID0gQkFEX1JFR0lTVEVSX05VTUJFUjsKKwkJaWYgKE0ueDg2LlJfQlggPT0gcGNpU2xvdCkgeworCQkJTS54ODYuUl9BSCA9IFNVQ0NFU1NGVUw7CisjaWZkZWYgX19LRVJORUxfXworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKF9CRV9lbnYudmdhSW5mby5wY2lkZXYsCisJCQkJCSAgICAgIE0ueDg2LlJfREksICZNLng4Ni5SX0VDWCk7CisjZWxzZQorCQkJTS54ODYuUl9FQ1ggPQorCQkJICAgICh1MzIpIFBDSV9hY2Nlc3NSZWcoTS54ODYuUl9ESSwgMCwgUENJX1JFQURfRFdPUkQsCisJCQkJCQlfQkVfZW52LnZnYUluZm8ucGNpSW5mbyk7CisjZW5kaWYKKwkJfQorCQlDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBTVUNDRVNTRlVMKSwgRl9DRik7CisJCWJyZWFrOworCWNhc2UgMHhCMTBCOgkJLyogV3JpdGUgY29uZmlndXJhdGlvbiBieXRlICovCisJCU0ueDg2LlJfQUggPSBCQURfUkVHSVNURVJfTlVNQkVSOworCQlpZiAoTS54ODYuUl9CWCA9PSBwY2lTbG90KSB7CisJCQlNLng4Ni5SX0FIID0gU1VDQ0VTU0ZVTDsKKyNpZmRlZiBfX0tFUk5FTF9fCisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoX0JFX2Vudi52Z2FJbmZvLnBjaWRldiwKKwkJCQkJICAgICAgTS54ODYuUl9ESSwgTS54ODYuUl9DTCk7CisjZWxzZQorCQkJUENJX2FjY2Vzc1JlZyhNLng4Ni5SX0RJLCBNLng4Ni5SX0NMLCBQQ0lfV1JJVEVfQllURSwKKwkJCQkgICAgICBfQkVfZW52LnZnYUluZm8ucGNpSW5mbyk7CisjZW5kaWYKKwkJfQorCQlDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBTVUNDRVNTRlVMKSwgRl9DRik7CisJCWJyZWFrOworCWNhc2UgMHhCMTBDOgkJLyogV3JpdGUgY29uZmlndXJhdGlvbiB3b3JkICovCisJCU0ueDg2LlJfQUggPSBCQURfUkVHSVNURVJfTlVNQkVSOworCQlpZiAoTS54ODYuUl9CWCA9PSBwY2lTbG90KSB7CisJCQlNLng4Ni5SX0FIID0gU1VDQ0VTU0ZVTDsKKyNpZmRlZiBfX0tFUk5FTF9fCisJCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoX0JFX2Vudi52Z2FJbmZvLnBjaWRldiwKKwkJCQkJICAgICAgTS54ODYuUl9ESSwgTS54ODYuUl9DWCk7CisjZWxzZQorCQkJUENJX2FjY2Vzc1JlZyhNLng4Ni5SX0RJLCBNLng4Ni5SX0NYLCBQQ0lfV1JJVEVfV09SRCwKKwkJCQkgICAgICBfQkVfZW52LnZnYUluZm8ucGNpSW5mbyk7CisjZW5kaWYKKwkJfQorCQlDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBTVUNDRVNTRlVMKSwgRl9DRik7CisJCWJyZWFrOworCWNhc2UgMHhCMTBEOgkJLyogV3JpdGUgY29uZmlndXJhdGlvbiBkd29yZCAqLworCQlNLng4Ni5SX0FIID0gQkFEX1JFR0lTVEVSX05VTUJFUjsKKwkJaWYgKE0ueDg2LlJfQlggPT0gcGNpU2xvdCkgeworCQkJTS54ODYuUl9BSCA9IFNVQ0NFU1NGVUw7CisjaWZkZWYgX19LRVJORUxfXworCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChfQkVfZW52LnZnYUluZm8ucGNpZGV2LAorCQkJCQkgICAgICAgTS54ODYuUl9ESSwgTS54ODYuUl9FQ1gpOworI2Vsc2UKKwkJCVBDSV9hY2Nlc3NSZWcoTS54ODYuUl9ESSwgTS54ODYuUl9FQ1gsIFBDSV9XUklURV9EV09SRCwKKwkJCQkgICAgICBfQkVfZW52LnZnYUluZm8ucGNpSW5mbyk7CisjZW5kaWYKKwkJfQorCQlDT05ESVRJT05BTF9TRVRfRkxBRygoTS54ODYuUl9BSCAhPSBTVUNDRVNTRlVMKSwgRl9DRik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigiYmlvc0VtdS9iaW9zLmludDFhOiB1bmtub3duIGZ1bmN0aW9uIEFYPSUjMDR4XG4iLAorCQkgICAgICAgTS54ODYuUl9BWCk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gaW5pdGlhbGlzZXMgdGhlIEJJT1MgZW11bGF0aW9uIGZ1bmN0aW9ucyBmb3IgdGhlIHNwZWNpZmljCitQQ0kgZGlzcGxheSBkZXZpY2UuIFdlIGluc3VsYXRlIHRoZSByZWFsIG1vZGUgQklPUyBmcm9tIGFueSBvdGhlciBkZXZpY2VzCitvbiB0aGUgYnVzLCBzbyB0aGF0IGl0IHdpbGwgd29yayBjb3JyZWN0bHkgdGhpbmtpbmcgdGhhdCBpdCBpcyB0aGUgb25seQorZGV2aWNlIHByZXNlbnQgb24gdGhlIGJ1cyAoaWU6IGF2b2lkaW5nIGFueSBhZGFwdGVycyBwcmVzZW50IGluIGZyb20gb2YKK3RoZSBkZXZpY2Ugd2UgYXJlIHRyeWluZyB0byBjb250cm9sKS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEJFX2NvbnN0TEVfMzIodikgICAgKCgoKCgodikmMHhmZjAwKT4+OCl8KCgodikmMHhmZik8PDgpKTw8MTYpfCgoKCgodikmMHhmZjAwMDAwMCk+PjgpfCgoKHYpJjB4MDBmZjAwMDApPDw4KSk+PjE2KSkKKwordm9pZCBfQkVfYmlvc19pbml0KHUzMiAqIGludHJUYWIpCit7CisJaW50IGk7CisJWDg2RU1VX2ludHJGdW5jcyBiaW9zX2ludHJfdGFiWzI1Nl07CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKwkJaW50clRhYltpXSA9IEJFX2NvbnN0TEVfMzIoQklPU19TRUcgPDwgMTYpOworCQliaW9zX2ludHJfdGFiW2ldID0gdW5kZWZpbmVkX2ludHI7CisJfQorCWJpb3NfaW50cl90YWJbMHgxMF0gPSBpbnQxMDsKKwliaW9zX2ludHJfdGFiWzB4MUFdID0gaW50MUE7CisJYmlvc19pbnRyX3RhYlsweDQyXSA9IGludDQyOworCWJpb3NfaW50cl90YWJbMHg2RF0gPSBpbnQxMDsKKwlYODZFTVVfc2V0dXBJbnRyRnVuY3MoYmlvc19pbnRyX3RhYik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmlvc19lbXVsYXRvci9iaW9zZW11LmMgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvYmlvc2VtdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjM2FlZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvYmlvc2VtdS5jCkBAIC0wLDAgKzEsMzczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgkJCSBCSU9TIGVtdWxhdG9yIGFuZCBpbnRlcmZhY2UKKyoJCSAgICAgICB0byBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKiAgQ29weXJpZ2h0IChDKSAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqICBKYXNvbiBKaW4gPEphc29uLmppbkBmcmVlc2NhbGUuY29tPgorKgorKgkJQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisqICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCisqICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisqICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCVRoZSBhdXRob3JzIG1ha2VzIG5vCisqICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgorKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyoKKyogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKKyogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZToJQU5TSSBDCisqIEVudmlyb25tZW50OglBbnkKKyogRGV2ZWxvcGVyOglLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246CU1vZHVsZSBpbXBsZW1lbnRpbmcgdGhlIHN5c3RlbSBzcGVjaWZpYyBmdW5jdGlvbnMuIFRoaXMKKyoJCW1vZHVsZSBpcyBhbHdheXMgY29tcGlsZWQgYW5kIGxpbmtlZCBpbiB0aGUgT1MgZGVwZWRlbnQKKyoJCWxpYnJhcmllcywgYW5kIG5ldmVyIGluIGEgYmluYXJ5IHBvcnRhYmxlIGRyaXZlci4KKyoKKyoJCUphc29uIHBvcnRlZCB0aGlzIGZpbGUgdG8gdS1ib290IHRvIHJ1biB0aGUgQVRJIHZpZGVvIGNhcmQgQklPUworKgkJaW4gdS1ib290LiBNYWRlIGFsbCB0aGUgdmlkZW8gbWVtb3J5IGJlIGVtdWxhdGVkIGR1cmluZyB0aGUKKyoJCUJJT1MgcnVuaW5nIHByb2Nlc3Mgd2hpY2ggbWF5IGFmZmVjdCB0aGUgVkdBIGZ1bmN0aW9uIGJ1dCB0aGUKKyoJCWZyYW1idWZmZXIgZnVuY3Rpb24gY2FuIHdvcmsgYWZ0ZXIgcnVuIHRoZSBCSU9TLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImJpb3NlbXVpLmgiCisjaW5jbHVkZSA8bWFsbG9jLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19CSU9TRU1VKQorCitCRV9zeXNFbnYgX0JFX2VudiA9IHt7MH19Oworc3RhdGljIFg4NkVNVV9tZW1GdW5jcyBfQkVfbWVtIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oIi5nb3QyIikpKSA9IHsKKwlCRV9yZGIsCisJQkVfcmR3LAorCUJFX3JkbCwKKwlCRV93cmIsCisJQkVfd3J3LAorCUJFX3dybCwKKwl9OworCitzdGF0aWMgWDg2RU1VX3Bpb0Z1bmNzIF9CRV9waW8gX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiLmdvdDIiKSkpID0geworCUJFX2luYiwKKwlCRV9pbncsCisJQkVfaW5sLAorCUJFX291dGIsCisJQkVfb3V0dywKKwlCRV9vdXRsLAorCX07CisKKyNkZWZpbmUgT0ZGKGFkZHIpCSh1MTYpKCgoYWRkcikgPj4gMCkgJiAweGZmZmYpCisjZGVmaW5lIFNFRyhhZGRyKQkodTE2KSgoKGFkZHIpID4+IDQpICYgMHhmMDAwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2RlYnVnRmxhZ3MgIC0gRmxhZ3MgdG8gZW5hYmxlIGRlYnVnZ2luZyBvcHRpb25zIChkZWJ1ZyBidWlsZHMgb25seSkKK21lbVNpemUJICAgIC0gQW1vdW50IG9mIG1lbW9yeSB0byBhbGxvY2F0ZSBmb3IgcmVhbCBtb2RlIG1hY2hpbmUKK2luZm8JICAgIC0gUG9pbnRlciB0byBkZWZhdWx0IFZHQSBkZXZpY2UgaW5mb3JtYXRpb24KKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb25zIGluaXRpYWxpc2VzIHRoZSBCRWxpYiwgYW5kIHVzZXMgdGhlIHBhc3NlZCBpbgorQklPUyBpbWFnZSBhcyB0aGUgQklPUyB0aGF0IGlzIHVzZWQgYW5kIGVtdWxhdGVkIGF0IDB4QzAwMDAuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFg4NkFQSSBCRV9pbml0KHUzMiBkZWJ1Z0ZsYWdzLCBpbnQgbWVtU2l6ZSwgQkVfVkdBSW5mbyAqIGluZm8sIGludCBzaGFyZWQpCit7CisjaWYgIWRlZmluZWQoX19EUklWRVJfXykgICYmICFkZWZpbmVkKF9fS0VSTkVMX18pCisKKwlQTV9pbml0KCk7CisjZW5kaWYKKwltZW1zZXQoJk0sIDAsIHNpemVvZihNKSk7CisJaWYgKG1lbVNpemUgPCAyMDQ4MCl7CisJCXByaW50ZigiRW11bGF0b3IgcmVxdWlyZXMgYXQgbGVhc3QgMjBLYiBvZiBtZW1vcnkhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJTS5tZW1fYmFzZSA9ICh1bnNpZ25lZCBsb25nKW1hbGxvYyhtZW1TaXplKTsKKworCWlmIChNLm1lbV9iYXNlID09IE5VTEwpeworCQlwcmludGYoIkJpb3NlbXU6T3V0IG9mIG1lbW9yeSEiKTsKKwkJcmV0dXJuIDA7CisJfQorCU0ubWVtX3NpemUgPSBtZW1TaXplOworCisJX0JFX2Vudi5lbXVsYXRlVkdBID0gMDsKKwlfQkVfZW52LmJ1c21lbV9iYXNlID0gKHVuc2lnbmVkIGxvbmcpbWFsbG9jKDEyOCAqIDEwMjQpOworCWlmIChfQkVfZW52LmJ1c21lbV9iYXNlID09IE5VTEwpeworCQlwcmludGYoIkJpb3NlbXU6T3V0IG9mIG1lbW9yeSEiKTsKKwkJcmV0dXJuIDA7CisJfQorCU0ueDg2LmRlYnVnID0gZGVidWdGbGFnczsKKwlfQkVfYmlvc19pbml0KCh1MzIqKWluZm8tPkxvd01lbSk7CisJWDg2RU1VX3NldHVwTWVtRnVuY3MoJl9CRV9tZW0pOworCVg4NkVNVV9zZXR1cFBpb0Z1bmNzKCZfQkVfcGlvKTsKKwlCRV9zZXRWR0EoaW5mbyk7CisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgoraW5mbwkgICAgLSBQb2ludGVyIHRvIFZHQSBkZXZpY2UgaW5mb3JtYXRpb24gdG8gbWFrZSBjdXJyZW50CisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIFZHQSBCSU9TIGZ1bmN0aW9ucyBpbiB0aGUgZW11bGF0b3IgdG8gcG9pbnQgdG8gdGhlCitzcGVjaWZpYyBWR0EgQklPUyBpbiB1c2UuIFRoaXMgaW5jbHVkZXMgc3dhcHBpbmcgdGhlIEJJT1MgaW50ZXJydXB0Cit2ZWN0b3JzLCBCSU9TIGltYWdlIGFuZCBCSU9TIGRhdGEgYXJlYSB0byB0aGUgbmV3IEJJT1MuIFRoaXMgYWxsb3dzIHRoZQorcmVhbCBtb2RlIEJJT1MgdG8gYmUgc3dhcHBlZCB3aXRob3V0IHJlc2V0dGluZyB0aGUgZW50aXJlIGVtdWxhdG9yLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgWDg2QVBJIEJFX3NldFZHQShCRV9WR0FJbmZvICogaW5mbykKK3sKKworI2lmZGVmIF9fS0VSTkVMX18KKwlfQkVfZW52LnZnYUluZm8uZnVuY3Rpb24gPSBpbmZvLT5mdW5jdGlvbjsKKwlfQkVfZW52LnZnYUluZm8uZGV2aWNlID0gaW5mby0+ZGV2aWNlOworCV9CRV9lbnYudmdhSW5mby5idXMgPSBpbmZvLT5idXM7CisJX0JFX2Vudi52Z2FJbmZvLnBjaWRldiA9IGluZm8tPnBjaWRldjsKKyNlbHNlCisJX0JFX2Vudi52Z2FJbmZvLnBjaUluZm8gPSBpbmZvLT5wY2lJbmZvOworI2VuZGlmCisJX0JFX2Vudi52Z2FJbmZvLkJJT1NJbWFnZSA9IGluZm8tPkJJT1NJbWFnZTsKKwlpZiAoaW5mby0+QklPU0ltYWdlKSB7CisJCV9CRV9lbnYuYmlvc21lbV9iYXNlID0gKHVsb25nKSBpbmZvLT5CSU9TSW1hZ2U7CisJCV9CRV9lbnYuYmlvc21lbV9saW1pdCA9IDB4QzAwMDAgKyBpbmZvLT5CSU9TSW1hZ2VMZW4gLSAxOworCX0gZWxzZSB7CisJCV9CRV9lbnYuYmlvc21lbV9iYXNlID0gX0JFX2Vudi5idXNtZW1fYmFzZSArIDB4MjAwMDA7CisJCV9CRV9lbnYuYmlvc21lbV9saW1pdCA9IDB4QzdGRkY7CisJfQorCWlmICgqKCh1MzIgKikgaW5mby0+TG93TWVtKSA9PSAwKQorCQlfQkVfYmlvc19pbml0KCh1MzIgKikgaW5mby0+TG93TWVtKTsKKwltZW1jcHkoKHU4ICopIE0ubWVtX2Jhc2UsIGluZm8tPkxvd01lbSwgc2l6ZW9mKGluZm8tPkxvd01lbSkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2luZm8JICAgIC0gUG9pbnRlciB0byBWR0EgZGV2aWNlIGluZm9ybWF0aW9uIHRvIHJldHJpZXZlIGN1cnJlbnQKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgVkdBIEJJT1MgZnVuY3Rpb25zIGN1cnJlbnRseSBhY3RpdmUgaW4gdGhlCitlbXVsYXRvciwgc28gdGhleSBjYW4gYmUgcmVzdG9yZWQgYXQgYSBsYXRlciBkYXRlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgWDg2QVBJIEJFX2dldFZHQShCRV9WR0FJbmZvICogaW5mbykKK3sKKyNpZmRlZiBfX0tFUk5FTF9fCisJaW5mby0+ZnVuY3Rpb24gPSBfQkVfZW52LnZnYUluZm8uZnVuY3Rpb247CisJaW5mby0+ZGV2aWNlID0gX0JFX2Vudi52Z2FJbmZvLmRldmljZTsKKwlpbmZvLT5idXMgPSBfQkVfZW52LnZnYUluZm8uYnVzOworCWluZm8tPnBjaWRldiA9IF9CRV9lbnYudmdhSW5mby5wY2lkZXY7CisjZWxzZQorCWluZm8tPnBjaUluZm8gPSBfQkVfZW52LnZnYUluZm8ucGNpSW5mbzsKKyNlbmRpZgorCWluZm8tPkJJT1NJbWFnZSA9IF9CRV9lbnYudmdhSW5mby5CSU9TSW1hZ2U7CisJbWVtY3B5KGluZm8tPkxvd01lbSwgKHU4ICopIE0ubWVtX2Jhc2UsIHNpemVvZihpbmZvLT5Mb3dNZW0pKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CityX3NlZwktIFNlZ21lbnQgZm9yIHBvaW50ZXIgdG8gY29udmVydAorcl9vZmYJLSBPZmZzZXQgZm9yIHBvaW50ZXIgdG8gY29udmVydAorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBtYXBzIGEgcmVhbCBtb2RlIHBvaW50ZXIgaW4gdGhlIGVtdWxhdG9yIG1lbW9yeSB0byBhIHByb3RlY3RlZAorbW9kZSBwb2ludGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGlyZWN0bHkgYWNjZXNzIHRoZSBtZW1vcnkuCisKK05PVEU6CVRoZSBtZW1vcnkgaXMgKmFsd2F5cyogaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQsIHNvbiBvbiBub24teDg2CisJc3lzdGVtcyB5b3Ugd2lsbCBuZWVkIHRvIGRvIGVuZGlhbiB0cmFuc2xhdGlvbnMgdG8gYWNjZXNzIHRoaXMKKwltZW1vcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqWDg2QVBJIEJFX21hcFJlYWxQb2ludGVyKHVpbnQgcl9zZWcsIHVpbnQgcl9vZmYpCit7CisJdTMyIGFkZHIgPSAoKHUzMikgcl9zZWcgPDwgNCkgKyByX29mZjsKKworCWlmIChhZGRyID49IDB4QzAwMDAgJiYgYWRkciA8PSBfQkVfZW52LmJpb3NtZW1fbGltaXQpIHsKKwkJcmV0dXJuICh2b2lkICopKF9CRV9lbnYuYmlvc21lbV9iYXNlICsgYWRkciAtIDB4QzAwMDApOworCX0gZWxzZSBpZiAoYWRkciA+PSAweEEwMDAwICYmIGFkZHIgPD0gMHhGRkZGRikgeworCQlyZXR1cm4gKHZvaWQgKikoX0JFX2Vudi5idXNtZW1fYmFzZSArIGFkZHIgLSAweEEwMDAwKTsKKwl9CisJcmV0dXJuICh2b2lkICopKE0ubWVtX2Jhc2UgKyBhZGRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitsZW4JLSBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgVkVTQSBidWZmZXIKK3JzZWcJLSBQbGFjZSB0byBzdG9yZSBWRVNBIGJ1ZmZlciBzZWdtZW50Cityb2ZmCS0gUGxhY2UgdG8gc3RvcmUgVkVTQSBidWZmZXIgb2Zmc2V0CisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIFZFU0EgdHJhbnNmZXIgYnVmZmVyIGluIHJlYWwKK19CRV9waW9tb2RlIGVtdWxhdG9yIG1lbW9yeS4gVGhlIFZFU0EgdHJhbnNmZXIgYnVmZmVyIGlzIGFsd2F5cyAxMDI0IGJ5dGVzIGxvbmcsCithbmQgbG9jYXRlZCBhdCAxNUtiIGludG8gdGhlIHN0YXJ0IG9mIHRoZSByZWFsIG1vZGUgbWVtb3J5ICgxNktiIGlzIHdoZXJlCit3ZSBwdXQgdGhlIHJlYWwgbW9kZSBjb2RlIHdlIGV4ZWN1dGUgZm9yIGlzc3VpbmcgaW50ZXJydXB0cykuCisKK05PVEU6CVRoZSBtZW1vcnkgaXMgKmFsd2F5cyogaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQsIHNvbiBvbiBub24teDg2CisJc3lzdGVtcyB5b3Ugd2lsbCBuZWVkIHRvIGRvIGVuZGlhbiB0cmFuc2xhdGlvbnMgdG8gYWNjZXNzIHRoaXMKKwltZW1vcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAqWDg2QVBJIEJFX2dldFZFU0FCdWYodWludCAqIGxlbiwgdWludCAqIHJzZWcsIHVpbnQgKiByb2ZmKQoreworCSpsZW4gPSAxMDI0OworCSpyc2VnID0gU0VHKDB4MDNDMDApOworCSpyb2ZmID0gT0ZGKDB4MDNDMDApOworCXJldHVybiAodm9pZCAqKShNLm1lbV9iYXNlICsgKCh1MzIpICogcnNlZyA8PCA0KSArICpyb2ZmKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitDbGVhbnMgdXAgYW5kIGV4aXRzIHRoZSBlbXVsYXRvci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFg4NkFQSSBCRV9leGl0KHZvaWQpCit7CisJZnJlZShNLm1lbV9iYXNlKTsKKwlmcmVlKF9CRV9lbnYuYnVzbWVtX2Jhc2UpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3NlZwktIFNlZ21lbnQgb2YgY29kZSB0byBjYWxsCitvZmYJLSBPZmZzZXQgb2YgY29kZSB0byBjYWxsCityZWdzCS0gUmVhbCBtb2RlIHJlZ2lzdGVycyB0byBsb2FkCitzcmVncwktIFJlYWwgbW9kZSBzZWdtZW50IHJlZ2lzdGVycyB0byBsb2FkCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9ucyBjYWxscyBhIHJlYWwgbW9kZSBmYXIgZnVuY3Rpb24gYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLAorYW5kIGxvYWRzIGFsbCB0aGUgeDg2IHJlZ2lzdGVycyBmcm9tIHRoZSBwYXNzZWQgaW4gcmVnaXN0ZXJzIHN0cnVjdHVyZS4KK09uIGV4aXQgdGhlIHJlZ2lzdGVycyByZXR1cm5lZCBmcm9tIHRoZSBjYWxsIGFyZSByZXR1cm5lZCBpbiB0aGUgc2FtZQorc3RydWN0dXJlcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFg4NkFQSSBCRV9jYWxsUmVhbE1vZGUodWludCBzZWcsIHVpbnQgb2ZmLCBSTVJFR1MgKiByZWdzLCBSTVNSRUdTICogc3JlZ3MpCit7CisJTS54ODYuUl9FQVggPSByZWdzLT5lLmVheDsKKwlNLng4Ni5SX0VCWCA9IHJlZ3MtPmUuZWJ4OworCU0ueDg2LlJfRUNYID0gcmVncy0+ZS5lY3g7CisJTS54ODYuUl9FRFggPSByZWdzLT5lLmVkeDsKKwlNLng4Ni5SX0VTSSA9IHJlZ3MtPmUuZXNpOworCU0ueDg2LlJfRURJID0gcmVncy0+ZS5lZGk7CisJTS54ODYuUl9EUyA9IHNyZWdzLT5kczsKKwlNLng4Ni5SX0VTID0gc3JlZ3MtPmVzOworCU0ueDg2LlJfRlMgPSBzcmVncy0+ZnM7CisJTS54ODYuUl9HUyA9IHNyZWdzLT5nczsKKworCSgodTggKikgTS5tZW1fYmFzZSlbMHg0MDAwXSA9IDB4OUE7CisJKCh1OCAqKSBNLm1lbV9iYXNlKVsweDQwMDFdID0gKHU4KSBvZmY7CisJKCh1OCAqKSBNLm1lbV9iYXNlKVsweDQwMDJdID0gKHU4KSAob2ZmID4+IDgpOworCSgodTggKikgTS5tZW1fYmFzZSlbMHg0MDAzXSA9ICh1OCkgc2VnOworCSgodTggKikgTS5tZW1fYmFzZSlbMHg0MDA0XSA9ICh1OCkgKHNlZyA+PiA4KTsKKwkoKHU4ICopIE0ubWVtX2Jhc2UpWzB4NDAwNV0gPSAweEYxOwkvKiBJbGxlZ2FsIG9wLWNvZGUgKi8KKwlNLng4Ni5SX0NTID0gU0VHKDB4MDQwMDApOworCU0ueDg2LlJfSVAgPSBPRkYoMHgwNDAwMCk7CisKKwlNLng4Ni5SX1NTID0gU0VHKE0ubWVtX3NpemUgLSAyKTsKKwlNLng4Ni5SX1NQID0gT0ZGKE0ubWVtX3NpemUgLSAyKSArIDI7CisKKwlYODZFTVVfZXhlYygpOworCisJcmVncy0+ZS5jZmxhZyA9IE0ueDg2LlJfRUZMRyAmIEZfQ0Y7CisJcmVncy0+ZS5lYXggPSBNLng4Ni5SX0VBWDsKKwlyZWdzLT5lLmVieCA9IE0ueDg2LlJfRUJYOworCXJlZ3MtPmUuZWN4ID0gTS54ODYuUl9FQ1g7CisJcmVncy0+ZS5lZHggPSBNLng4Ni5SX0VEWDsKKwlyZWdzLT5lLmVzaSA9IE0ueDg2LlJfRVNJOworCXJlZ3MtPmUuZWRpID0gTS54ODYuUl9FREk7CisJc3JlZ3MtPmRzID0gTS54ODYuUl9EUzsKKwlzcmVncy0+ZXMgPSBNLng4Ni5SX0VTOworCXNyZWdzLT5mcyA9IE0ueDg2LlJfRlM7CisJc3JlZ3MtPmdzID0gTS54ODYuUl9HUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitpbnRubwktIEludGVycnVwdCBudW1iZXIgdG8gZXhlY3V0ZQoraW4JLSBSZWFsIG1vZGUgcmVnaXN0ZXJzIHRvIGxvYWQKK291dAktIFBsYWNlIHRvIHN0b3JlIHJlc3VsdGluZyByZWFsIG1vZGUgcmVnaXN0ZXJzCisKK1JFTUFSS1M6CitUaGlzIGZ1bmN0aW9ucyBjYWxscyBhIHJlYWwgbW9kZSBpbnRlcnJ1cHQgZnVuY3Rpb24gYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLAorYW5kIGxvYWRzIGFsbCB0aGUgeDg2IHJlZ2lzdGVycyBmcm9tIHRoZSBwYXNzZWQgaW4gcmVnaXN0ZXJzIHN0cnVjdHVyZS4KK09uIGV4aXQgdGhlIHJlZ2lzdGVycyByZXR1cm5lZCBmcm9tIHRoZSBjYWxsIGFyZSByZXR1cm5lZCBpbiBvdXQgc3R1Y3R1cmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFg4NkFQSSBCRV9pbnQ4NihpbnQgaW50bm8sIFJNUkVHUyAqIGluLCBSTVJFR1MgKiBvdXQpCit7CisJTS54ODYuUl9FQVggPSBpbi0+ZS5lYXg7CisJTS54ODYuUl9FQlggPSBpbi0+ZS5lYng7CisJTS54ODYuUl9FQ1ggPSBpbi0+ZS5lY3g7CisJTS54ODYuUl9FRFggPSBpbi0+ZS5lZHg7CisJTS54ODYuUl9FU0kgPSBpbi0+ZS5lc2k7CisJTS54ODYuUl9FREkgPSBpbi0+ZS5lZGk7CisJKCh1OCAqKSBNLm1lbV9iYXNlKVsweDQwMDBdID0gMHhDRDsKKwkoKHU4ICopIE0ubWVtX2Jhc2UpWzB4NDAwMV0gPSAodTgpIGludG5vOworCSgodTggKikgTS5tZW1fYmFzZSlbMHg0MDAyXSA9IDB4RjE7CisJTS54ODYuUl9DUyA9IFNFRygweDA0MDAwKTsKKwlNLng4Ni5SX0lQID0gT0ZGKDB4MDQwMDApOworCisJTS54ODYuUl9TUyA9IFNFRyhNLm1lbV9zaXplIC0gMSk7CisJTS54ODYuUl9TUCA9IE9GRihNLm1lbV9zaXplIC0gMSkgLSAxOworCisJWDg2RU1VX2V4ZWMoKTsKKwlvdXQtPmUuY2ZsYWcgPSBNLng4Ni5SX0VGTEcgJiBGX0NGOworCW91dC0+ZS5lYXggPSBNLng4Ni5SX0VBWDsKKwlvdXQtPmUuZWJ4ID0gTS54ODYuUl9FQlg7CisJb3V0LT5lLmVjeCA9IE0ueDg2LlJfRUNYOworCW91dC0+ZS5lZHggPSBNLng4Ni5SX0VEWDsKKwlvdXQtPmUuZXNpID0gTS54ODYuUl9FU0k7CisJb3V0LT5lLmVkaSA9IE0ueDg2LlJfRURJOworCXJldHVybiBvdXQtPnguYXg7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgoraW50bm8JLSBJbnRlcnJ1cHQgbnVtYmVyIHRvIGV4ZWN1dGUKK2luCS0gUmVhbCBtb2RlIHJlZ2lzdGVycyB0byBsb2FkCitvdXQJLSBQbGFjZSB0byBzdG9yZSByZXN1bHRpbmcgcmVhbCBtb2RlIHJlZ2lzdGVycworc3JlZ3MJLSBSZWFsIG1vZGUgc2VnbWVudCByZWdpc3RlcnMgdG8gbG9hZAorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbnMgY2FsbHMgYSByZWFsIG1vZGUgaW50ZXJydXB0IGZ1bmN0aW9uIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcywKK2FuZCBsb2FkcyBhbGwgdGhlIHg4NiByZWdpc3RlcnMgZnJvbSB0aGUgcGFzc2VkIGluIHJlZ2lzdGVycyBzdHJ1Y3R1cmUuCitPbiBleGl0IHRoZSByZWdpc3RlcnMgcmV0dXJuZWQgZnJvbSB0aGUgY2FsbCBhcmUgcmV0dXJuZWQgaW4gb3V0IHN0dWN0dXJlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBYODZBUEkgQkVfaW50ODZ4KGludCBpbnRubywgUk1SRUdTICogaW4sIFJNUkVHUyAqIG91dCwgUk1TUkVHUyAqIHNyZWdzKQoreworCU0ueDg2LlJfRUFYID0gaW4tPmUuZWF4OworCU0ueDg2LlJfRUJYID0gaW4tPmUuZWJ4OworCU0ueDg2LlJfRUNYID0gaW4tPmUuZWN4OworCU0ueDg2LlJfRURYID0gaW4tPmUuZWR4OworCU0ueDg2LlJfRVNJID0gaW4tPmUuZXNpOworCU0ueDg2LlJfRURJID0gaW4tPmUuZWRpOworCU0ueDg2LlJfRFMgPSBzcmVncy0+ZHM7CisJTS54ODYuUl9FUyA9IHNyZWdzLT5lczsKKwlNLng4Ni5SX0ZTID0gc3JlZ3MtPmZzOworCU0ueDg2LlJfR1MgPSBzcmVncy0+Z3M7CisJKCh1OCAqKSBNLm1lbV9iYXNlKVsweDQwMDBdID0gMHhDRDsKKwkoKHU4ICopIE0ubWVtX2Jhc2UpWzB4NDAwMV0gPSAodTgpIGludG5vOworCSgodTggKikgTS5tZW1fYmFzZSlbMHg0MDAyXSA9IDB4RjE7CisJTS54ODYuUl9DUyA9IFNFRygweDA0MDAwKTsKKwlNLng4Ni5SX0lQID0gT0ZGKDB4MDQwMDApOworCisJTS54ODYuUl9TUyA9IFNFRyhNLm1lbV9zaXplIC0gMSk7CisJTS54ODYuUl9TUCA9IE9GRihNLm1lbV9zaXplIC0gMSkgLSAxOworCisJWDg2RU1VX2V4ZWMoKTsKKwlvdXQtPmUuY2ZsYWcgPSBNLng4Ni5SX0VGTEcgJiBGX0NGOworCW91dC0+ZS5lYXggPSBNLng4Ni5SX0VBWDsKKwlvdXQtPmUuZWJ4ID0gTS54ODYuUl9FQlg7CisJb3V0LT5lLmVjeCA9IE0ueDg2LlJfRUNYOworCW91dC0+ZS5lZHggPSBNLng4Ni5SX0VEWDsKKwlvdXQtPmUuZXNpID0gTS54ODYuUl9FU0k7CisJb3V0LT5lLmVkaSA9IE0ueDg2LlJfRURJOworCXNyZWdzLT5kcyA9IE0ueDg2LlJfRFM7CisJc3JlZ3MtPmVzID0gTS54ODYuUl9FUzsKKwlzcmVncy0+ZnMgPSBNLng4Ni5SX0ZTOworCXNyZWdzLT5ncyA9IE0ueDg2LlJfR1M7CisJcmV0dXJuIG91dC0+eC5heDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2Jpb3NlbXVpLmggYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvYmlvc2VtdWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODVlNjU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2Jpb3NlbXVpLmgKQEAgLTAsMCArMSwxNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCQkJIEJJT1MgZW11bGF0b3IgYW5kIGludGVyZmFjZQorKgkJICAgICAgIHRvIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqICBDb3B5cmlnaHQgKEMpIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogIEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CisqCisqCQlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisqICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisqICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisqICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKKyogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4JVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOglBTlNJIEMKKyogRW52aXJvbm1lbnQ6CUFueQorKiBEZXZlbG9wZXI6CUtlbmRhbGwgQmVubmV0dAorKgorKiBEZXNjcmlwdGlvbjoJSW50ZXJuYWwgaGVhZGVyIGZpbGUgZm9yIHRoZSBCSU9TIGVtdWxhdG9yIGxpYnJhcnkuCisqCisqCQlKYXNvbiBwb3J0ZWQgdGhpcyBmaWxlIHRvIHUtYm9vdCwgQWRkZWQgc29tZSBhcmNoaXRlY3R1cmUKKyoJCXJlbGF0ZWQgTWFjcm8uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fQklPU0VNVUlfSAorI2RlZmluZSBfX0JJT1NFTVVJX0gKKworI2luY2x1ZGUgImJpb3NlbXUuaCIKKyNpbmNsdWRlIDxhc20vaW8uaD4KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIHR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBEQih4KQl4CisjZWxzZQorI2RlZmluZSBEQih4KQlkb3t9d2hpbGUoMCk7CisjZW5kaWYKKworI2RlZmluZSBCSU9TX1NFRwkweGZmZjAKK2V4dGVybiBYODZFTVVfc3lzRW52IF9YODZFTVVfZW52OworI2RlZmluZSBNCQlfWDg2RU1VX2VudgorCisvKiBNYWNyb3MgdG8gcmVhZCBhbmQgd3JpdGUgdmFsdWVzIHRvIHg4NiBlbXVsYXRvciBtZW1vcnkuIE1lbW9yeSBpcyBhbHdheXMKKyAqIGNvbnNpZGVyZWQgdG8gYmUgbGl0dGxlIGVuZGlhbiwgc28gd2UgdXNlIG1hY3JvcyB0byBkbyBlbmRpYW4gc3dhcHBpbmcKKyAqIHdoZXJlIG5lY2Vzc2FyeS4KKyAqLworCisjaWZkZWYgX19CSUdfRU5ESUFOX18KKyNkZWZpbmUgcmVhZGJfbGUoYmFzZSkJICAgICooKHU4KikoYmFzZSkpCisjZGVmaW5lIHJlYWR3X2xlKGJhc2UpCSAgICAoKHUxNilyZWFkYl9sZShiYXNlKSB8ICgodTE2KXJlYWRiX2xlKChiYXNlKSArIDEpIDw8IDgpKQorI2RlZmluZSByZWFkbF9sZShiYXNlKQkgICAgKCh1MzIpcmVhZGJfbGUoKGJhc2UpICsgMCkgfCAoKHUzMilyZWFkYl9sZSgoYmFzZSkgKyAxKSA8PCA4KSB8IFwKKwkJCSAgICAoKHUzMilyZWFkYl9sZSgoYmFzZSkgKyAyKSA8PCAxNikgfCAoKHUzMilyZWFkYl9sZSgoYmFzZSkgKyAzKSA8PCAyNCkpCisjZGVmaW5lIHdyaXRlYl9sZShiYXNlLCB2KSAgKigodTgqKShiYXNlKSkgPSAodikKKyNkZWZpbmUgd3JpdGV3X2xlKGJhc2UsIHYpICB3cml0ZWJfbGUoYmFzZSArIDAsICh2ID4+IDApICYgMHhmZiksCVwKKwkJCSAgICB3cml0ZWJfbGUoYmFzZSArIDEsICh2ID4+IDgpICYgMHhmZikKKyNkZWZpbmUgd3JpdGVsX2xlKGJhc2UsIHYpICB3cml0ZWJfbGUoYmFzZSArIDAsICh2ID4+IDApICYgMHhmZiksCVwKKwkJCSAgICB3cml0ZWJfbGUoYmFzZSArIDEsICh2ID4+IDgpICYgMHhmZiksCVwKKwkJCSAgICB3cml0ZWJfbGUoYmFzZSArIDIsICh2ID4+IDE2KSAmIDB4ZmYpLAlcCisJCQkgICAgd3JpdGViX2xlKGJhc2UgKyAzLCAodiA+PiAyNCkgJiAweGZmKQorI2Vsc2UKKyNkZWZpbmUgcmVhZGJfbGUoYmFzZSkJICAgICooKHU4KikoYmFzZSkpCisjZGVmaW5lIHJlYWR3X2xlKGJhc2UpCSAgICAqKCh1MTYqKShiYXNlKSkKKyNkZWZpbmUgcmVhZGxfbGUoYmFzZSkJICAgICooKHUzMiopKGJhc2UpKQorI2RlZmluZSB3cml0ZWJfbGUoYmFzZSwgdikgICooKHU4KikoYmFzZSkpID0gKHYpCisjZGVmaW5lIHdyaXRld19sZShiYXNlLCB2KSAgKigodTE2KikoYmFzZSkpID0gKHYpCisjZGVmaW5lIHdyaXRlbF9sZShiYXNlLCB2KSAgKigodTMyKikoYmFzZSkpID0gKHYpCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitGdW5jdGlvbiBjb2RlcyBwYXNzZWQgdG8gdGhlIGVtdWxhdGVkIEkvTyBwb3J0IGZ1bmN0aW9ucyB0byBkZXRlcm1pbmUgdGhlCit0eXBlIG9mIG9wZXJhdGlvbiB0byBwZXJmb3JtLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgZW51bSB7CisJUkVHX1JFQURfQllURSA9IDAsCisJUkVHX1JFQURfV09SRCA9IDEsCisJUkVHX1JFQURfRFdPUkQgPSAyLAorCVJFR19XUklURV9CWVRFID0gMywKKwlSRUdfV1JJVEVfV09SRCA9IDQsCisJUkVHX1dSSVRFX0RXT1JEID0gNQorfSBSZWdpc3RlckZsYWdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0Z1bmN0aW9uIGNvZGVzIHBhc3NlZCB0byB0aGUgZW11bGF0ZWQgSS9PIHBvcnQgZnVuY3Rpb25zIHRvIGRldGVybWluZSB0aGUKK3R5cGUgb2Ygb3BlcmF0aW9uIHRvIHBlcmZvcm0uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBlbnVtIHsKKwlQT1JUX0JZVEUgPSAxLAorCVBPUlRfV09SRCA9IDIsCisJUE9SVF9EV09SRCA9IDMsCit9IFBvcnRJbmZvRmxhZ3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSB0aGUgZGV0YWlscyBmb3IgdGhlIEJJT1MgZW11bGF0b3Igc3lzdGVtCitlbnZpcm9ubWVudCBhcyB1c2VkIGJ5IHRoZSBYODYgZW11bGF0b3IgbGlicmFyeS4KKworSEVBREVSOgorYmlvc2VtdS5oCisKK01FTUJFUlM6Cit0eXBlCSAgICAtIFR5cGUgb2YgcG9ydCBhY2Nlc3MgKDEgPSBieXRlLCAyID0gd29yZCwgMyA9IGR3b3JkKQorZGVmVmFsCSAgICAtIERlZmF1bHQgcG93ZXIgb24gdmFsdWUKK2ZpbmFsVmFsICAgIC0gRmluYWwgdmFsdWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCB7CisJdTggdHlwZTsKKwl1MzIgZGVmVmFsOworCXUzMiBmaW5hbFZhbDsKK30gQkVfcG9ydEluZm87CisKKyNkZWZpbmUgUE1faW5wYihwb3J0KQlpbmIocG9ydCtWSURFT19JT19PRkZTRVQpCisjZGVmaW5lIFBNX2lucHcocG9ydCkJaW53KHBvcnQrVklERU9fSU9fT0ZGU0VUKQorI2RlZmluZSBQTV9pbnBkKHBvcnQpCWlubChwb3J0K1ZJREVPX0lPX09GRlNFVCkKKyNkZWZpbmUgUE1fb3V0cGIocG9ydCx2YWwpCW91dGIodmFsLHBvcnQrVklERU9fSU9fT0ZGU0VUKQorI2RlZmluZSBQTV9vdXRwdyhwb3J0LHZhbCkJb3V0dyh2YWwscG9ydCtWSURFT19JT19PRkZTRVQpCisjZGVmaW5lIFBNX291dHBkKHBvcnQsdmFsKQlvdXRsKHZhbCxwb3J0K1ZJREVPX0lPX09GRlNFVCkKKworI2RlZmluZSBMT0dfaW5wYihwb3J0KQlQTV9pbnBiKHBvcnQpCisjZGVmaW5lIExPR19pbnB3KHBvcnQpCVBNX2lucHcocG9ydCkKKyNkZWZpbmUgTE9HX2lucGQocG9ydCkJUE1faW5wZChwb3J0KQorI2RlZmluZSBMT0dfb3V0cGIocG9ydCx2YWwpCVBNX291dHBiKHBvcnQsdmFsKQorI2RlZmluZSBMT0dfb3V0cHcocG9ydCx2YWwpCVBNX291dHB3KHBvcnQsdmFsKQorI2RlZmluZSBMT0dfb3V0cGQocG9ydCx2YWwpCVBNX291dHBkKHBvcnQsdmFsKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9uIFByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBiaW9zLmMgKi8KKwordm9pZCBfQkVfYmlvc19pbml0KHUzMiAqIGludHJUYWIpOwordm9pZCBfQkVfc2V0dXBfZnVuY3Modm9pZCk7CisKKy8qIGJlc3lzLmMgKi8KKyNkZWZpbmUgREVCVUdfSU8oKQkoTS54ODYuZGVidWcgJiBERUJVR19JT19UUkFDRV9GKQorCit1OCBYODZBUEkgQkVfcmRiKHUzMiBhZGRyKTsKK3UxNiBYODZBUEkgQkVfcmR3KHUzMiBhZGRyKTsKK3UzMiBYODZBUEkgQkVfcmRsKHUzMiBhZGRyKTsKK3ZvaWQgWDg2QVBJIEJFX3dyYih1MzIgYWRkciwgdTggdmFsKTsKK3ZvaWQgWDg2QVBJIEJFX3dydyh1MzIgYWRkciwgdTE2IHZhbCk7Cit2b2lkIFg4NkFQSSBCRV93cmwodTMyIGFkZHIsIHUzMiB2YWwpOworCit1OCBYODZBUEkgQkVfaW5iKFg4NkVNVV9waW9BZGRyIHBvcnQpOwordTE2IFg4NkFQSSBCRV9pbncoWDg2RU1VX3Bpb0FkZHIgcG9ydCk7Cit1MzIgWDg2QVBJIEJFX2lubChYODZFTVVfcGlvQWRkciBwb3J0KTsKK3ZvaWQgWDg2QVBJIEJFX291dGIoWDg2RU1VX3Bpb0FkZHIgcG9ydCwgdTggdmFsKTsKK3ZvaWQgWDg2QVBJIEJFX291dHcoWDg2RU1VX3Bpb0FkZHIgcG9ydCwgdTE2IHZhbCk7Cit2b2lkIFg4NkFQSSBCRV9vdXRsKFg4NkVNVV9waW9BZGRyIHBvcnQsIHUzMiB2YWwpOworI2VuZGlmCisvKiBfX0JJT1NFTVVJX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmlvc19lbXVsYXRvci9pbmNsdWRlL2Jpb3NlbXUuaCBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci9pbmNsdWRlL2Jpb3NlbXUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2NiMzE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUvYmlvc2VtdS5oCkBAIC0wLDAgKzEsMzkyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgIEJJT1MgZW11bGF0b3IgYW5kIGludGVyZmFjZQorKiAgICAgICAgICAgICAgICAgICAgICB0byBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55CisqIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0CisqCisqIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIHRoZSByZWFsIG1vZGUgeDg2IEJJT1MgZW11bGF0b3IsIHdoaWNoIGlzCisqICAgICAgICAgICAgICAgdXNlZCB0byB3YXJtYm9vdCBhbnkgbnVtYmVyIG9mIFZHQSBjb21wYXRpYmxlIFBDSS9BR1AKKyogICAgICAgICAgICAgICBjb250cm9sbGVycyB1bmRlciBhbnkgT1MsIG9uIGFueSBwcm9jZXNzb3IgZmFtaWx5IHRoYXQKKyogICAgICAgICAgICAgICBzdXBwb3J0cyBQQ0kuIFdlIGFsc28gYWxsb3cgdGhlIHVzZXIgYXBwbGljYXRpb24gdG8gY2FsbAorKiAgICAgICAgICAgICAgIHJlYWwgbW9kZSBCSU9TIGZ1bmN0aW9ucyBhbmQgSW50IDEwaCBmdW5jdGlvbnMgKGluY2x1ZGluZworKiAgICAgICAgICAgICAgIHRoZSBWRVNBIEJJT1MpLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0JJT1NFTVVfSAorI2RlZmluZSBfX0JJT1NFTVVfSAorCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgIng4NmVtdS5oIgorI2Vsc2UKKyNpbmNsdWRlICJ4ODZlbXUuaCIKKyNpbmNsdWRlICJwbWFwaS5oIgorI2luY2x1ZGUgInBjaWxpYi5oIgorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIHR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNwcmFnbWEgcGFjaygxKQorCisjaWZuZGVmIF9fS0VSTkVMX18KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSB0aGUgZGV0YWlscyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgVkdBCitjb250cm9sbGVyLiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gYWxsb3cgdGhlIFZHQSBjb250cm9sbGVyIHRvIGJlCitzd2FwcGVkIG9uIHRoZSBmbHkgd2l0aGluIHRoZSBCSU9TIGVtdWxhdG9yLgorCitIRUFERVI6CitiaW9zZW11LmgKKworTUVNQkVSUzoKK3BjaUluZm8gICAgICAgICAtIFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gYmxvY2sgZm9yIHRoZSBjb250cm9sbGVyCitCSU9TSW1hZ2UgICAgICAgLSBQb2ludGVyIHRvIGEgcmVhZC93cml0ZSBjb3B5IG9mIHRoZSBCSU9TIGltYWdlCitCSU9TSW1hZ2VMZW4gICAgLSBMZW5ndGggb2YgdGhlIEJJT1MgaW1hZ2UKK0xvd01lbSAgICAgICAgICAtIENvcHkgb2Yga2V5IGxvdyBtZW1vcnkgYXJlYXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCB7CisJUENJRGV2aWNlSW5mbyAqcGNpSW5mbzsKKwl2b2lkICpCSU9TSW1hZ2U7CisJdWxvbmcgQklPU0ltYWdlTGVuOworCXVjaGFyIExvd01lbVsxNTM2XTsKK30gQkVfVkdBSW5mbzsKKyNlbHNlCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0RhdGEgc3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGRldGFpbHMgZm9yIHRoZSBCSU9TIGVtdWxhdG9yIHN5c3RlbQorZW52aXJvbm1lbnQgYXMgdXNlZCBieSB0aGUgWDg2IGVtdWxhdG9yIGxpYnJhcnkuCisKK0hFQURFUjoKK2Jpb3NlbXUuaAorCitNRU1CRVJTOgordmdhSW5mbyAgICAgICAgIC0gVkdBIEJJT1MgaW5mb3JtYXRpb24gc3RydWN0dXJlCitiaW9zbWVtX2Jhc2UgICAgLSBCYXNlIG9mIHRoZSBCSU9TIGltYWdlCitiaW9zbWVtX2xpbWl0ICAgLSBMaW1pdCBvZiB0aGUgQklPUyBpbWFnZQorYnVzbWVtX2Jhc2UgICAgIC0gQmFzZSBvZiB0aGUgVkdBIGJ1cyBtZW1vcnkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IGZ1bmN0aW9uOworCWludCBkZXZpY2U7CisJaW50IGJ1czsKKwl1MzIgVmVuZG9ySUQ7CisJdTMyIERldmljZUlEOworCXBjaV9kZXZfdCBwY2lkZXY7CisJdm9pZCAqQklPU0ltYWdlOworCXUzMiBCSU9TSW1hZ2VMZW47CisJdTggTG93TWVtWzE1MzZdOworfSBCRV9WR0FJbmZvOworCisjZW5kaWYJCQkJLyogX19LRVJORUxfXyAqLworCisjZGVmaW5lIENSVF9DICAgMjQJCS8qIDI0ICBDUlQgQ29udHJvbGxlciBSZWdpc3RlcnMgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQVRUX0MgICAyMQkJLyogMjEgIEF0dHJpYnV0ZSBDb250cm9sbGVyIFJlZ2lzdGVycyAgICAgICAqLworI2RlZmluZSBHUkFfQyAgIDkJCS8qIDkgICBHcmFwaGljcyBDb250cm9sbGVyIFJlZ2lzdGVycyAgICAgICAgKi8KKyNkZWZpbmUgU0VRX0MgICA1CQkvKiA1ICAgU2VxdWVuY2VyIFJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBBTF9DICAgNzY4CQkvKiA3NjggUGFsZXR0ZSBSZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSB0aGUgZGV0YWlscyBmb3IgdGhlIEJJT1MgZW11bGF0b3Igc3lzdGVtCitlbnZpcm9ubWVudCBhcyB1c2VkIGJ5IHRoZSBYODYgZW11bGF0b3IgbGlicmFyeS4KKworSEVBREVSOgorYmlvc2VtdS5oCisKK01FTUJFUlM6Cit2Z2FJbmZvICAgICAgICAgLSBWR0EgQklPUyBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKK2Jpb3NtZW1fYmFzZSAgICAtIEJhc2Ugb2YgdGhlIEJJT1MgaW1hZ2UKK2Jpb3NtZW1fbGltaXQgICAtIExpbWl0IG9mIHRoZSBCSU9TIGltYWdlCitidXNtZW1fYmFzZSAgICAgLSBCYXNlIG9mIHRoZSBWR0EgYnVzIG1lbW9yeQordGltZXIgICAgICAgICAgIC0gVGltZXIgdXNlZCB0byBlbXVsYXRlIFBDIHRpbWVyIHBvcnRzCit0aW1lcjAgICAgICAgICAgLSBMYXRjaGVkIHZhbHVlIGZvciB0aW1lciAwCit0aW1lcjBMYXRjaGVkICAgLSBUcnVlIGlmIHRpbWVyIDAgdmFsdWUgd2FzIGp1c3QgbGF0Y2hlZAordGltZXIyICAgICAgICAgIC0gQ3VycmVudCB2YWx1ZSBmb3IgdGltZXIgMgorZW11bGF0ZVZHQSAgICAgIC0gVHJ1ZSB0byBlbXVsYXRlIFZHQSBJL08gYW5kIG1lbW9yeSBhY2Nlc3NlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCUJFX1ZHQUluZm8gdmdhSW5mbzsKKwl1bG9uZyBiaW9zbWVtX2Jhc2U7CisJdWxvbmcgYmlvc21lbV9saW1pdDsKKwl1bG9uZyBidXNtZW1fYmFzZTsKKworCXUzMiB0aW1lcjA7CisJaW50IHRpbWVyMExhdGNoZWQ7CisJdTMyIHRpbWVyMTsKKwlpbnQgdGltZXIxTGF0Y2hlZDsKKwl1MzIgdGltZXIyOworCWludCB0aW1lcjJMYXRjaGVkOworCisJaW50IGVtdWxhdGVWR0E7CisJdTggZW11NjE7CisJdTggZW11NzA7CisJaW50IGZsaXBGbG9wM0MwOworCXUzMiBjb25maWdBZGRyZXNzOworCXU4IGVtdTNDMDsKKwl1OCBlbXUzQzFbQVRUX0NdOworCXU4IGVtdTNDMjsKKwl1OCBlbXUzQzQ7CisJdTggZW11M0M1W1NFUV9DXTsKKwl1OCBlbXUzQzY7CisJdWludCBlbXUzQzc7CisJdWludCBlbXUzQzg7CisJdTggZW11M0M5W1BBTF9DXTsKKwl1OCBlbXUzQ0U7CisJdTggZW11M0NGW0dSQV9DXTsKKwl1OCBlbXUzRDQ7CisJdTggZW11M0Q1W0NSVF9DXTsKKwl1OCBlbXUzREE7CisKK30gQkVfc3lzRW52OworCisjaWZkZWYgX19LRVJORUxfXworCisvKiBEZWZpbmUgc29tZSB0eXBlcyB3aGVuIGNvbXBpbGluZyBmb3IgdGhlIExpbnV4IGtlcm5lbCB0aGF0IG5vcm1hbGx5CisgKiBjb21lIGZyb20gdGhlIFNjaVRlY2ggUE0gbGlicmFyeS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1N0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSAzMi1iaXQgZXh0ZW5kZWQgeDg2IENQVSByZWdpc3RlcnMKKworSEVBREVSOgorcG1hcGkuaAorCitNRU1CRVJTOgorZWF4ICAgICAtIFZhbHVlIG9mIHRoZSBFQVggcmVnaXN0ZXIKK2VieCAgICAgLSBWYWx1ZSBvZiB0aGUgRUJYIHJlZ2lzdGVyCitlY3ggICAgIC0gVmFsdWUgb2YgdGhlIEVDWCByZWdpc3RlcgorZWR4ICAgICAtIFZhbHVlIG9mIHRoZSBFRFggcmVnaXN0ZXIKK2VzaSAgICAgLSBWYWx1ZSBvZiB0aGUgRVNJIHJlZ2lzdGVyCitlZGkgICAgIC0gVmFsdWUgb2YgdGhlIEVESSByZWdpc3RlcgorY2ZsYWcgICAtIFZhbHVlIG9mIHRoZSBjYXJyeSBmbGFnCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiBlYXg7CisJdTMyIGVieDsKKwl1MzIgZWN4OworCXUzMiBlZHg7CisJdTMyIGVzaTsKKwl1MzIgZWRpOworCXUzMiBjZmxhZzsKK30gUk1EV09SRFJFR1M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIDE2LWJpdCB4ODYgQ1BVIHJlZ2lzdGVycworCitIRUFERVI6CitwbWFwaS5oCisKK01FTUJFUlM6CitheCAgICAgIC0gVmFsdWUgb2YgdGhlIEFYIHJlZ2lzdGVyCitieCAgICAgIC0gVmFsdWUgb2YgdGhlIEJYIHJlZ2lzdGVyCitjeCAgICAgIC0gVmFsdWUgb2YgdGhlIENYIHJlZ2lzdGVyCitkeCAgICAgIC0gVmFsdWUgb2YgdGhlIERYIHJlZ2lzdGVyCitzaSAgICAgIC0gVmFsdWUgb2YgdGhlIFNJIHJlZ2lzdGVyCitkaSAgICAgIC0gVmFsdWUgb2YgdGhlIERJIHJlZ2lzdGVyCitjZmxhZyAgIC0gVmFsdWUgb2YgdGhlIGNhcnJ5IGZsYWcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19CSUdfRU5ESUFOX18KK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYgYXhfaGksIGF4OworCXUxNiBieF9oaSwgYng7CisJdTE2IGN4X2hpLCBjeDsKKwl1MTYgZHhfaGksIGR4OworCXUxNiBzaV9oaSwgc2k7CisJdTE2IGRpX2hpLCBkaTsKKwl1MTYgY2ZsYWdfaGksIGNmbGFnOworfSBSTVdPUkRSRUdTOworI2Vsc2UKK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYgYXgsIGF4X2hpOworCXUxNiBieCwgYnhfaGk7CisJdTE2IGN4LCBjeF9oaTsKKwl1MTYgZHgsIGR4X2hpOworCXUxNiBzaSwgc2lfaGk7CisJdTE2IGRpLCBkaV9oaTsKKwl1MTYgY2ZsYWcsIGNmbGFnX2hpOworfSBSTVdPUkRSRUdTOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIDgtYml0IHg4NiBDUFUgcmVnaXN0ZXJzCisKK0hFQURFUjoKK3BtYXBpLmgKKworTUVNQkVSUzoKK2FsICAgICAgLSBWYWx1ZSBvZiB0aGUgQUwgcmVnaXN0ZXIKK2FoICAgICAgLSBWYWx1ZSBvZiB0aGUgQUggcmVnaXN0ZXIKK2JsICAgICAgLSBWYWx1ZSBvZiB0aGUgQkwgcmVnaXN0ZXIKK2JoICAgICAgLSBWYWx1ZSBvZiB0aGUgQkggcmVnaXN0ZXIKK2NsICAgICAgLSBWYWx1ZSBvZiB0aGUgQ0wgcmVnaXN0ZXIKK2NoICAgICAgLSBWYWx1ZSBvZiB0aGUgQ0ggcmVnaXN0ZXIKK2RsICAgICAgLSBWYWx1ZSBvZiB0aGUgREwgcmVnaXN0ZXIKK2RoICAgICAgLSBWYWx1ZSBvZiB0aGUgREggcmVnaXN0ZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19CSUdfRU5ESUFOX18KK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYgYXhfaGk7CisJdTggYWgsIGFsOworCXUxNiBieF9oaTsKKwl1OCBiaCwgYmw7CisJdTE2IGN4X2hpOworCXU4IGNoLCBjbDsKKwl1MTYgZHhfaGk7CisJdTggZGgsIGRsOworfSBSTUJZVEVSRUdTOworI2Vsc2UKK3R5cGVkZWYgc3RydWN0IHsKKwl1OCBhbDsKKwl1OCBhaDsKKwl1MTYgYXhfaGk7CisJdTggYmw7CisJdTggYmg7CisJdTE2IGJ4X2hpOworCXU4IGNsOworCXU4IGNoOworCXUxNiBjeF9oaTsKKwl1OCBkbDsKKwl1OCBkaDsKKwl1MTYgZHhfaGk7Cit9IFJNQllURVJFR1M7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitTdHJ1Y3R1cmUgZGVzY3JpYmluZyBhbGwgdGhlIHg4NiBDUFUgcmVnaXN0ZXJzCisKK0hFQURFUjoKK3BtYXBpLmgKKworTUVNQkVSUzoKK2UgICAtIE1lbWJlciB0byBhY2Nlc3MgcmVnaXN0ZXJzIGFzIDMyLWJpdCB2YWx1ZXMKK3ggICAtIE1lbWJlciB0byBhY2Nlc3MgcmVnaXN0ZXJzIGFzIDE2LWJpdCB2YWx1ZXMKK2ggICAtIE1lbWJlciB0byBhY2Nlc3MgcmVnaXN0ZXJzIGFzIDgtYml0IHZhbHVlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgdW5pb24geworCVJNRFdPUkRSRUdTIGU7CisJUk1XT1JEUkVHUyB4OworCVJNQllURVJFR1MgaDsKK30gUk1SRUdTOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1N0cnVjdHVyZSBkZXNjcmliaW5nIGFsbCB0aGUgeDg2IHNlZ21lbnQgcmVnaXN0ZXJzCisKK0hFQURFUjoKK3BtYXBpLmgKKworTUVNQkVSUzoKK2VzICAtIEVTIHNlZ21lbnQgcmVnaXN0ZXIKK2NzICAtIENTIHNlZ21lbnQgcmVnaXN0ZXIKK3NzICAtIFNTIHNlZ21lbnQgcmVnaXN0ZXIKK2RzICAtIERTIHNlZ21lbnQgcmVnaXN0ZXIKK2ZzICAtIEZTIHNlZ21lbnQgcmVnaXN0ZXIKK2dzICAtIEdTIHNlZ21lbnQgcmVnaXN0ZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IGVzOworCXUxNiBjczsKKwl1MTYgc3M7CisJdTE2IGRzOworCXUxNiBmczsKKwl1MTYgZ3M7Cit9IFJNU1JFR1M7CisKKyNlbmRpZgkJCQkvKiBfX0tFUk5FTF9fICovCisKKyNpZm5kZWYgX19LRVJORUxfXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1N0cnVjdHVyZSBkZWZpbmluZyBhbGwgdGhlIEJJT1MgRW11bGF0b3IgQVBJIGZ1bmN0aW9ucyBhcyBleHBvcnRlZCBmcm9tCit0aGUgQmluYXJ5IFBvcnRhYmxlIERMTC4KK3tzZWNyZXR9CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVsb25nIGR3U2l6ZTsKKwkgaWJvb2woUE1BUElQIEJFX2luaXQpICh1MzIgZGVidWdGbGFncywgaW50IG1lbVNpemUsIEJFX1ZHQUluZm8gKiBpbmZvKTsKKwl2b2lkIChQTUFQSVAgQkVfc2V0VkdBKSAoQkVfVkdBSW5mbyAqIGluZm8pOworCXZvaWQgKFBNQVBJUCBCRV9nZXRWR0EpIChCRV9WR0FJbmZvICogaW5mbyk7CisJdm9pZCAqKFBNQVBJUCBCRV9tYXBSZWFsUG9pbnRlcikgKHVpbnQgcl9zZWcsIHVpbnQgcl9vZmYpOworCXZvaWQgKihQTUFQSVAgQkVfZ2V0VkVTQUJ1ZikgKHVpbnQgKiBsZW4sIHVpbnQgKiByc2VnLCB1aW50ICogcm9mZik7CisJdm9pZCAoUE1BUElQIEJFX2NhbGxSZWFsTW9kZSkgKHVpbnQgc2VnLCB1aW50IG9mZiwgUk1SRUdTICogcmVncywKKwkJCQkgICAgICAgUk1TUkVHUyAqIHNyZWdzKTsKKwlpbnQgKFBNQVBJUCBCRV9pbnQ4NikgKGludCBpbnRubywgUk1SRUdTICogaW4sIFJNUkVHUyAqIG91dCk7CisJaW50IChQTUFQSVAgQkVfaW50ODZ4KSAoaW50IGludG5vLCBSTVJFR1MgKiBpbiwgUk1SRUdTICogb3V0LAorCQkJCVJNU1JFR1MgKiBzcmVncyk7CisJdm9pZCAqcmVzZXJ2ZWQxOworCXZvaWQgKFBNQVBJUCBCRV9leGl0KSAodm9pZCk7Cit9IEJFX2V4cG9ydHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorRnVuY3Rpb24gcG9pbnRlciB0eXBlIGZvciB0aGUgQmluYXJ5IFBvcnRhYmxlIERMTCBpbml0aWFsaXNhdGlvbiBlbnRyeSBwb2ludC4KK3tzZWNyZXR9CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBCRV9leHBvcnRzICooUE1BUElQIEJFX2luaXRMaWJyYXJ5X3QpIChQTV9pbXBvcnRzICogUE1JbXApOworI2VuZGlmCisKKyNwcmFnbWEgcGFjaygpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgewkJCS8qIFVzZSAiQyIgbGlua2FnZSB3aGVuIGluIEMrKyBtb2RlICovCisjZW5kaWYKKworLyoge3NlY3JldH0gR2xvYmFsIEJJT1MgZW11bGF0b3Igc3lzdGVtIGVudmlyb25tZW50ICovCisJZXh0ZXJuIEJFX3N5c0VudiBfQkVfZW52OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9uIFByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBCSU9TIGVtdWxhdG9yIGxpYnJhcnkgZW50cnkgcG9pbnRzICovCisJaW50IFg4NkFQSSBCRV9pbml0KHUzMiBkZWJ1Z0ZsYWdzLCBpbnQgbWVtU2l6ZSwgQkVfVkdBSW5mbyAqIGluZm8sCisJCQkgICBpbnQgc2hhcmVkKTsKKwl2b2lkIFg4NkFQSSBCRV9zZXRWR0EoQkVfVkdBSW5mbyAqIGluZm8pOworCXZvaWQgWDg2QVBJIEJFX2dldFZHQShCRV9WR0FJbmZvICogaW5mbyk7CisJdm9pZCBYODZBUEkgQkVfc2V0RGVidWdGbGFncyh1MzIgZGVidWdGbGFncyk7CisJdm9pZCAqWDg2QVBJIEJFX21hcFJlYWxQb2ludGVyKHVpbnQgcl9zZWcsIHVpbnQgcl9vZmYpOworCXZvaWQgKlg4NkFQSSBCRV9nZXRWRVNBQnVmKHVpbnQgKiBsZW4sIHVpbnQgKiByc2VnLCB1aW50ICogcm9mZik7CisJdm9pZCBYODZBUEkgQkVfY2FsbFJlYWxNb2RlKHVpbnQgc2VnLCB1aW50IG9mZiwgUk1SRUdTICogcmVncywKKwkJCQkgICAgUk1TUkVHUyAqIHNyZWdzKTsKKwlpbnQgWDg2QVBJIEJFX2ludDg2KGludCBpbnRubywgUk1SRUdTICogaW4sIFJNUkVHUyAqIG91dCk7CisJaW50IFg4NkFQSSBCRV9pbnQ4NngoaW50IGludG5vLCBSTVJFR1MgKiBpbiwgUk1SRUdTICogb3V0LAorCQkJICAgICBSTVNSRUdTICogc3JlZ3MpOworCXZvaWQgWDg2QVBJIEJFX2V4aXQodm9pZCk7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30JCQkJLyogRW5kIG9mICJDIiBsaW5rYWdlIGZvciBDKysgICAgICAgKi8KKyNlbmRpZgorI2VuZGlmCQkJCS8qIF9fQklPU0VNVV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvaW5jbHVkZS94ODZlbXUuaCBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci9pbmNsdWRlL3g4NmVtdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMDRiZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvaW5jbHVkZS94ODZlbXUuaApAQCAtMCwwICsxLDE5MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZworKiAgICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55CisqIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0CisqCisqIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIHB1YmxpYyBzcGVjaWZpYyBmdW5jdGlvbnMuCisqICAgICAgICAgICAgICAgQW55IGFwcGxpY2F0aW9uIGxpbmtpbmcgYWdhaW5zdCB1cyBzaG91bGQgb25seQorKiAgICAgICAgICAgICAgIGluY2x1ZGUgdGhpcyBoZWFkZXIKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19YODZFTVVfWDg2RU1VX0gKKyNkZWZpbmUgX19YODZFTVVfWDg2RU1VX0gKKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHBjaS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2RlZmluZSBYODZBUEkKKyNkZWZpbmUgWDg2QVBJUCAqCit0eXBlZGVmIHUxNiBYODZFTVVfcGlvQWRkcjsKKworI2luY2x1ZGUgIng4NmVtdS9yZWdzLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNyb3MgYW5kIHR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNwcmFnbWEgcGFjaygxKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0RhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgcG9udGVycyB0byBwcm9ncmFtbWVkIEkvTyBmdW5jdGlvbnMgdXNlZCBieSB0aGUKK2VtdWxhdG9yLiBUaGlzIGlzIHVzZWQgc28gdGhhdCB0aGUgdXNlciBwcm9ncmFtIGNhbiBob29rIGFsbCBwcm9ncmFtbWVkCitJL08gZm9yIHRoZSBlbXVsYXRvciB0byBoYW5kbGVkIGFzIG5lY2Vzc2FyeSBieSB0aGUgdXNlciBwcm9ncmFtLiBCeQorZGVmYXVsdCB0aGUgZW11bGF0b3IgY29udGFpbnMgc2ltcGxlIGZ1bmN0aW9ucyB0aGF0IGRvIG5vdCBkbyBhY2Nlc3MgdGhlCitoYXJkd2FyZSBpbiBhbnkgd2F5LiBUbyBhbGxvdyB0aGUgZW11YWx0b3IgYWNjZXNzIHRoZSBoYXJkd2FyZSwgeW91IHdpbGwKK25lZWQgdG8gb3ZlcnJpZGUgdGhlIHByb2dyYW1tZWQgSS9PIGZ1bmN0aW9ucyB1c2luZyB0aGUgWDg2RU1VX3NldHVwUGlvRnVuY3MKK2Z1bmN0aW9uLgorCitIRUFERVI6Cit4ODZlbXUuaAorCitNRU1CRVJTOgoraW5iICAgICAtIEZ1bmN0aW9uIHRvIHJlYWQgYSBieXRlIGZyb20gYW4gSS9PIHBvcnQKK2ludyAgICAgLSBGdW5jdGlvbiB0byByZWFkIGEgd29yZCBmcm9tIGFuIEkvTyBwb3J0CitpbmwgICAgIC0gRnVuY3Rpb24gdG8gcmVhZCBhIGR3b3JkIGZyb20gYW4gSS9PIHBvcnQKK291dGIgICAgLSBGdW5jdGlvbiB0byB3cml0ZSBhIGJ5dGUgdG8gYW4gSS9PIHBvcnQKK291dHcgICAgLSBGdW5jdGlvbiB0byB3cml0ZSBhIHdvcmQgdG8gYW4gSS9PIHBvcnQKK291dGwgICAgLSBGdW5jdGlvbiB0byB3cml0ZSBhIGR3b3JkIHRvIGFuIEkvTyBwb3J0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgeworCXU4KFg4NkFQSVAgaW5iKSAoWDg2RU1VX3Bpb0FkZHIgYWRkcik7CisJdTE2KFg4NkFQSVAgaW53KSAoWDg2RU1VX3Bpb0FkZHIgYWRkcik7CisJdTMyKFg4NkFQSVAgaW5sKSAoWDg2RU1VX3Bpb0FkZHIgYWRkcik7CisJdm9pZCAoWDg2QVBJUCBvdXRiKSAoWDg2RU1VX3Bpb0FkZHIgYWRkciwgdTggdmFsKTsKKwl2b2lkIChYODZBUElQIG91dHcpIChYODZFTVVfcGlvQWRkciBhZGRyLCB1MTYgdmFsKTsKKwl2b2lkIChYODZBUElQIG91dGwpIChYODZFTVVfcGlvQWRkciBhZGRyLCB1MzIgdmFsKTsKK30gWDg2RU1VX3Bpb0Z1bmNzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0RhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgcG9udGVycyB0byBtZW1vcnkgYWNjZXNzIGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZQorZW11bGF0b3IuIFRoaXMgaXMgdXNlZCBzbyB0aGF0IHRoZSB1c2VyIHByb2dyYW0gY2FuIGhvb2sgYWxsIG1lbW9yeQorYWNjZXNzIGZ1bmN0aW9ucyBhcyBuZWNlc3NhcnkgZm9yIHRoZSBlbXVsYXRvci4gQnkgZGVmYXVsdCB0aGUgZW11bGF0b3IKK2NvbnRhaW5zIHNpbXBsZSBmdW5jdGlvbnMgdGhhdCBvbmx5IGFjY2VzcyB0aGUgaW50ZXJuYWwgbWVtb3J5IG9mIHRoZQorZW11bGF0b3IuIElmIHlvdSBuZWVkIHNwZWNpYWxpc2VkIGZ1bmN0aW9ucyB0byBoYW5kbGUgYWNjZXNzIHRvIGRpZmZlcmVudAordHlwZXMgb2YgbWVtb3J5IChpZTogaGFyZHdhcmUgZnJhbWVidWZmZXIgYWNjZXNzZXMgYW5kIEJJT1MgbWVtb3J5IGFjY2VzcworZXRjKSwgeW91IHdpbGwgbmVlZCB0byBvdmVycmlkZSB0aGlzIHVzaW5nIHRoZSBYODZFTVVfc2V0dXBNZW1GdW5jcworZnVuY3Rpb24uCisKK0hFQURFUjoKK3g4NmVtdS5oCisKK01FTUJFUlM6CityZGIgICAgIC0gRnVuY3Rpb24gdG8gcmVhZCBhIGJ5dGUgZnJvbSBhbiBhZGRyZXNzCityZHcgICAgIC0gRnVuY3Rpb24gdG8gcmVhZCBhIHdvcmQgZnJvbSBhbiBhZGRyZXNzCityZGwgICAgIC0gRnVuY3Rpb24gdG8gcmVhZCBhIGR3b3JkIGZyb20gYW4gYWRkcmVzcword3JiICAgICAtIEZ1bmN0aW9uIHRvIHdyaXRlIGEgYnl0ZSB0byBhbiBhZGRyZXNzCit3cncgICAgIC0gRnVuY3Rpb24gdG8gd3JpdGUgYSB3b3JkIHRvIGFuIGFkZHJlc3MKK3dybCAgICAgLSBGdW5jdGlvbiB0byB3cml0ZSBhIGR3b3JkIHRvIGFuIGFkZHJlc3MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCB7CisJdTgoWDg2QVBJUCByZGIpICh1MzIgYWRkcik7CisJdTE2KFg4NkFQSVAgcmR3KSAodTMyIGFkZHIpOworCXUzMihYODZBUElQIHJkbCkgKHUzMiBhZGRyKTsKKwl2b2lkIChYODZBUElQIHdyYikgKHUzMiBhZGRyLCB1OCB2YWwpOworCXZvaWQgKFg4NkFQSVAgd3J3KSAodTMyIGFkZHIsIHUxNiB2YWwpOworCXZvaWQgKFg4NkFQSVAgd3JsKSAodTMyIGFkZHIsIHUzMiB2YWwpOworfSBYODZFTVVfbWVtRnVuY3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIEhlcmUgYXJlIHRoZSBkZWZhdWx0IG1lbW9yeSByZWFkIGFuZCB3cml0ZQorICBmdW5jdGlvbiBpbiBjYXNlIHRoZXkgYXJlIG5lZWRlZCBhcyBmYWxsYmFja3MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitleHRlcm4gdTggWDg2QVBJIHJkYih1MzIgYWRkcik7CitleHRlcm4gdTE2IFg4NkFQSSByZHcodTMyIGFkZHIpOworZXh0ZXJuIHUzMiBYODZBUEkgcmRsKHUzMiBhZGRyKTsKK2V4dGVybiB2b2lkIFg4NkFQSSB3cmIodTMyIGFkZHIsIHU4IHZhbCk7CitleHRlcm4gdm9pZCBYODZBUEkgd3J3KHUzMiBhZGRyLCB1MTYgdmFsKTsKK2V4dGVybiB2b2lkIFg4NkFQSSB3cmwodTMyIGFkZHIsIHUzMiB2YWwpOworCisjcHJhZ21hIHBhY2soKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0eXBlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiB2b2lkIChYODZBUElQIFg4NkVNVV9pbnRyRnVuY3MpIChpbnQgbnVtKTsKK2V4dGVybiBYODZFTVVfaW50ckZ1bmNzIF9YODZFTVVfaW50clRhYlsyNTZdOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9uIFByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsJCQkvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLworI2VuZGlmCisKKwl2b2lkIFg4NkVNVV9zZXR1cE1lbUZ1bmNzKFg4NkVNVV9tZW1GdW5jcyAqIGZ1bmNzKTsKKwl2b2lkIFg4NkVNVV9zZXR1cFBpb0Z1bmNzKFg4NkVNVV9waW9GdW5jcyAqIGZ1bmNzKTsKKwl2b2lkIFg4NkVNVV9zZXR1cEludHJGdW5jcyhYODZFTVVfaW50ckZ1bmNzIGZ1bmNzW10pOworCXZvaWQgWDg2RU1VX3ByZXBhcmVGb3JJbnQoaW50IG51bSk7CisKKy8qIGRlY29kZS5jICovCisKKwl2b2lkIFg4NkVNVV9leGVjKHZvaWQpOworCXZvaWQgWDg2RU1VX2hhbHRfc3lzKHZvaWQpOworCisjaWZkZWYgIERFQlVHCisjZGVmaW5lIEhBTFRfU1lTKCkgIFwKKyAgICBwcmludGYoImhhbHRfc3lzOiBmaWxlICVzLCBsaW5lICVkXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pLCBcCisgICAgWDg2RU1VX2hhbHRfc3lzKCkKKyNlbHNlCisjZGVmaW5lIEhBTFRfU1lTKCkgIFg4NkVNVV9oYWx0X3N5cygpCisjZW5kaWYKKworLyogRGVidWcgb3B0aW9ucyAqLworCisjZGVmaW5lIERFQlVHX0RFQ09ERV9GICAgICAgICAgIDB4MDAwMQkvKiBwcmludCBkZWNvZGVkIGluc3RydWN0aW9uICAqLworI2RlZmluZSBERUJVR19UUkFDRV9GICAgICAgICAgICAweDAwMDIJLyogZHVtcCByZWdzIGJlZm9yZS9hZnRlciBleGVjdXRpb24gKi8KKyNkZWZpbmUgREVCVUdfU1RFUF9GICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIERFQlVHX0RJU0FTU0VNQkxFX0YgICAgIDB4MDAwOAorI2RlZmluZSBERUJVR19CUkVBS19GICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgREVCVUdfU1ZDX0YgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIERFQlVHX1NBVkVfQ1NfSVAgICAgICAgIDB4MDA0MAorI2RlZmluZSBERUJVR19GU19GICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgREVCVUdfUFJPQ19GICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIERFQlVHX1NZU0lOVF9GICAgICAgICAgIDB4MDIwMAkvKiBiaW9zIHN5c3RlbSBpbnRlcnJ1cHRzLiAqLworI2RlZmluZSBERUJVR19UUkFDRUNBTExfRiAgICAgICAweDA0MDAKKyNkZWZpbmUgREVCVUdfSU5TVFJVTUVOVF9GICAgICAgMHgwODAwCisjZGVmaW5lIERFQlVHX01FTV9UUkFDRV9GICAgICAgIDB4MTAwMAorI2RlZmluZSBERUJVR19JT19UUkFDRV9GICAgICAgICAweDIwMDAKKyNkZWZpbmUgREVCVUdfVFJBQ0VDQUxMX1JFR1NfRiAgMHg0MDAwCisjZGVmaW5lIERFQlVHX0RFQ09ERV9OT1BSSU5UX0YgIDB4ODAwMAorI2RlZmluZSBERUJVR19FWElUICAgICAgICAgICAgICAweDEwMDAwCisjZGVmaW5lIERFQlVHX1NZU19GICAgICAgICAgICAgIChERUJVR19TVkNfRnxERUJVR19GU19GfERFQlVHX1BST0NfRikKKworCXZvaWQgWDg2RU1VX3RyYWNlX3JlZ3Modm9pZCk7CisJdm9pZCBYODZFTVVfdHJhY2VfeHJlZ3Modm9pZCk7CisJdm9pZCBYODZFTVVfZHVtcF9tZW1vcnkodTE2IHNlZywgdTE2IG9mZiwgdTMyIGFtdCk7CisJaW50IFg4NkVNVV90cmFjZV9vbih2b2lkKTsKKwlpbnQgWDg2RU1VX3RyYWNlX29mZih2b2lkKTsKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQkJCQkvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKyAgICAgICAqLworI2VuZGlmCisjZW5kaWYJCQkJLyogX19YODZFTVVfWDg2RU1VX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmlvc19lbXVsYXRvci9pbmNsdWRlL3g4NmVtdS9kZWJ1Zy5oIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUveDg2ZW11L2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY4YzlkMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci9pbmNsdWRlL3g4NmVtdS9kZWJ1Zy5oCkBAIC0wLDAgKzEsMjA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqCQlDb3B5cmlnaHQgKEMpIDE5OTEtMjAwNCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCQkgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKKyoJCSAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLglUaGUgYXV0aG9ycyBtYWtlcyBubworKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisqCisqICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisqICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisqICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6CUFOU0kgQworKiBFbnZpcm9ubWVudDoJQW55CisqIERldmVsb3BlcjoJS2VuZGFsbCBCZW5uZXR0CisqCisqIERlc2NyaXB0aW9uOglIZWFkZXIgZmlsZSBmb3IgZGVidWcgZGVmaW5pdGlvbnMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fWDg2RU1VX0RFQlVHX0gKKyNkZWZpbmUgX19YODZFTVVfREVCVUdfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFjcm9zIGFuZCB0eXBlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBjaGVja3MgdG8gYmUgZW5hYmxlZCBmb3IgInJ1bnRpbWUiICovCisKKyNkZWZpbmUgQ0hFQ0tfSVBfRkVUQ0hfRgkJMHgxCisjZGVmaW5lIENIRUNLX1NQX0FDQ0VTU19GCQkweDIKKyNkZWZpbmUgQ0hFQ0tfTUVNX0FDQ0VTU19GCQkweDQJLyp1c2luZyByZWd1bGFyIGxpbmVhciBwb2ludGVyICovCisjZGVmaW5lIENIRUNLX0RBVEFfQUNDRVNTX0YJCTB4OAkvKnVzaW5nIHNlZ21lbnQ6b2Zmc2V0ICovCisKKyNpZmRlZiBERUJVRworIyBkZWZpbmUgQ0hFQ0tfSVBfRkVUQ0goKQkJKE0ueDg2LmNoZWNrICYgQ0hFQ0tfSVBfRkVUQ0hfRikKKyMgZGVmaW5lIENIRUNLX1NQX0FDQ0VTUygpCQkoTS54ODYuY2hlY2sgJiBDSEVDS19TUF9BQ0NFU1NfRikKKyMgZGVmaW5lIENIRUNLX01FTV9BQ0NFU1MoKQkJKE0ueDg2LmNoZWNrICYgQ0hFQ0tfTUVNX0FDQ0VTU19GKQorIyBkZWZpbmUgQ0hFQ0tfREFUQV9BQ0NFU1MoKQkJKE0ueDg2LmNoZWNrICYgQ0hFQ0tfREFUQV9BQ0NFU1NfRikKKyNlbHNlCisjIGRlZmluZSBDSEVDS19JUF9GRVRDSCgpCisjIGRlZmluZSBDSEVDS19TUF9BQ0NFU1MoKQorIyBkZWZpbmUgQ0hFQ0tfTUVNX0FDQ0VTUygpCisjIGRlZmluZSBDSEVDS19EQVRBX0FDQ0VTUygpCisjZW5kaWYKKworI2lmZGVmIERFQlVHCisjIGRlZmluZSBERUJVR19JTlNUUlVNRU5UKCkJKE0ueDg2LmRlYnVnICYgREVCVUdfSU5TVFJVTUVOVF9GKQorIyBkZWZpbmUgREVCVUdfREVDT0RFKCkJCShNLng4Ni5kZWJ1ZyAmIERFQlVHX0RFQ09ERV9GKQorIyBkZWZpbmUgREVCVUdfVFJBQ0UoKQkJKE0ueDg2LmRlYnVnICYgREVCVUdfVFJBQ0VfRikKKyMgZGVmaW5lIERFQlVHX1NURVAoKQkJKE0ueDg2LmRlYnVnICYgREVCVUdfU1RFUF9GKQorIyBkZWZpbmUgREVCVUdfRElTQVNTRU1CTEUoKQkoTS54ODYuZGVidWcgJiBERUJVR19ESVNBU1NFTUJMRV9GKQorIyBkZWZpbmUgREVCVUdfQlJFQUsoKQkJKE0ueDg2LmRlYnVnICYgREVCVUdfQlJFQUtfRikKKyMgZGVmaW5lIERFQlVHX1NWQygpCQkoTS54ODYuZGVidWcgJiBERUJVR19TVkNfRikKKyMgZGVmaW5lIERFQlVHX1NBVkVfSVBfQ1MoKQkoTS54ODYuZGVidWcgJiBERUJVR19TQVZFX0NTX0lQKQorCisjIGRlZmluZSBERUJVR19GUygpCQkoTS54ODYuZGVidWcgJiBERUJVR19GU19GKQorIyBkZWZpbmUgREVCVUdfUFJPQygpCQkoTS54ODYuZGVidWcgJiBERUJVR19QUk9DX0YpCisjIGRlZmluZSBERUJVR19TWVNJTlQoKQkJKE0ueDg2LmRlYnVnICYgREVCVUdfU1lTSU5UX0YpCisjIGRlZmluZSBERUJVR19UUkFDRUNBTEwoKQkoTS54ODYuZGVidWcgJiBERUJVR19UUkFDRUNBTExfRikKKyMgZGVmaW5lIERFQlVHX1RSQUNFQ0FMTFJFR1MoKQkoTS54ODYuZGVidWcgJiBERUJVR19UUkFDRUNBTExfUkVHU19GKQorIyBkZWZpbmUgREVCVUdfU1lTKCkJCShNLng4Ni5kZWJ1ZyAmIERFQlVHX1NZU19GKQorIyBkZWZpbmUgREVCVUdfTUVNX1RSQUNFKCkJKE0ueDg2LmRlYnVnICYgREVCVUdfTUVNX1RSQUNFX0YpCisjIGRlZmluZSBERUJVR19JT19UUkFDRSgpCShNLng4Ni5kZWJ1ZyAmIERFQlVHX0lPX1RSQUNFX0YpCisjIGRlZmluZSBERUJVR19ERUNPREVfTk9QUklOVCgpIChNLng4Ni5kZWJ1ZyAmIERFQlVHX0RFQ09ERV9OT1BSSU5UX0YpCisjZWxzZQorIyBkZWZpbmUgREVCVUdfSU5TVFJVTUVOVCgpCTAKKyMgZGVmaW5lIERFQlVHX0RFQ09ERSgpCQkwCisjIGRlZmluZSBERUJVR19UUkFDRSgpCQkwCisjIGRlZmluZSBERUJVR19TVEVQKCkJCTAKKyMgZGVmaW5lIERFQlVHX0RJU0FTU0VNQkxFKCkJMAorIyBkZWZpbmUgREVCVUdfQlJFQUsoKQkJMAorIyBkZWZpbmUgREVCVUdfU1ZDKCkJCTAKKyMgZGVmaW5lIERFQlVHX1NBVkVfSVBfQ1MoKQkwCisjIGRlZmluZSBERUJVR19GUygpCQkwCisjIGRlZmluZSBERUJVR19QUk9DKCkJCTAKKyMgZGVmaW5lIERFQlVHX1NZU0lOVCgpCQkwCisjIGRlZmluZSBERUJVR19UUkFDRUNBTEwoKQkwCisjIGRlZmluZSBERUJVR19UUkFDRUNBTExSRUdTKCkJMAorIyBkZWZpbmUgREVCVUdfU1lTKCkJCTAKKyMgZGVmaW5lIERFQlVHX01FTV9UUkFDRSgpCTAKKyMgZGVmaW5lIERFQlVHX0lPX1RSQUNFKCkJMAorIyBkZWZpbmUgREVCVUdfREVDT0RFX05PUFJJTlQoKSAwCisjZW5kaWYKKworI2lmZGVmIERFQlVHCisKKyMgZGVmaW5lIERFQ09ERV9QUklOVEYoeCkJaWYgKERFQlVHX0RFQ09ERSgpKSBcCisJCQkJICAgIHg4NmVtdV9kZWNvZGVfcHJpbnRmKHgpCisjIGRlZmluZSBERUNPREVfUFJJTlRGMih4LHkpCWlmIChERUJVR19ERUNPREUoKSkgXAorCQkJCSAgICB4ODZlbXVfZGVjb2RlX3ByaW50ZjIoeCx5KQorCisvKgorICogVGhlIGZvbGxvd2luZyBhbGxvdyB1cyB0byBsb29rIGF0IHRoZSBieXRlcyBvZiBhbiBpbnN0cnVjdGlvbi4gIFRoZQorICogZmlyc3QgSU5DUl9JTlNUUk5fTEVOLCBpcyBjYWxsZWQgZXZlcnl0aW1lIGJ5dGVzIGFyZSBjb25zdW1lZCBpbgorICogdGhlIGRlY29kaW5nIHByb2Nlc3MuICBUaGUgU0FWRV9JUF9DUyBpcyBjYWxsZWQgaW5pdGlhbGx5IHdoZW4gdGhlCisgKiBtYWpvciBvcGNvZGUgb2YgdGhlIGluc3RydWN0aW9uIGlzIGFjY2Vzc2VkLgorICovCisjZGVmaW5lIElOQ19ERUNPREVEX0lOU1RfTEVOKHgpCQkJICAgIFwKKyAgICBpZiAoREVCVUdfREVDT0RFKCkpCQkJCSAgICBcCisJeDg2ZW11X2luY19kZWNvZGVkX2luc3RfbGVuKHgpCisKKyNkZWZpbmUgU0FWRV9JUF9DUyh4LHkpCQkJCQkJXAorICAgIGlmIChERUJVR19ERUNPREUoKSB8IERFQlVHX1RSQUNFQ0FMTCgpIHwgREVCVUdfQlJFQUsoKSBcCisJICAgICAgfCBERUJVR19JT19UUkFDRSgpIHwgREVCVUdfU0FWRV9JUF9DUygpKSB7IFwKKwlNLng4Ni5zYXZlZF9jcyA9IHg7CQkJCQlcCisJTS54ODYuc2F2ZWRfaXAgPSB5OwkJCQkJXAorICAgIH0KKyNlbHNlCisjIGRlZmluZSBJTkNfREVDT0RFRF9JTlNUX0xFTih4KQorIyBkZWZpbmUgREVDT0RFX1BSSU5URih4KQorIyBkZWZpbmUgREVDT0RFX1BSSU5URjIoeCx5KQorIyBkZWZpbmUgU0FWRV9JUF9DUyh4LHkpCisjZW5kaWYKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIFRSQUNFX1JFR1MoKQkJCQkJICAgIFwKKyAgICBpZiAoREVCVUdfRElTQVNTRU1CTEUoKSkgewkJCQkgICAgXAorCXg4NmVtdV9qdXN0X2Rpc2Fzc2VtYmxlKCk7CQkJICAgIFwKKwlnb3RvIEVuZE9mVGhlSW5zdHJ1Y3Rpb25Qcm9jZWR1cmU7CQkgICAgXAorICAgIH0JCQkJCQkJICAgIFwKKyAgICBpZiAoREVCVUdfVFJBQ0UoKSB8fCBERUJVR19ERUNPREUoKSkgWDg2RU1VX3RyYWNlX3JlZ3MoKQorI2Vsc2UKKyMgZGVmaW5lIFRSQUNFX1JFR1MoKQorI2VuZGlmCisKKyNpZmRlZiBERUJVRworIyBkZWZpbmUgU0lOR0xFX1NURVAoKQkgICAgaWYgKERFQlVHX1NURVAoKSkgeDg2ZW11X3NpbmdsZV9zdGVwKCkKKyNlbHNlCisjIGRlZmluZSBTSU5HTEVfU1RFUCgpCisjZW5kaWYKKworI2RlZmluZSBUUkFDRV9BTkRfU1RFUCgpICAgIFwKKyAgICBUUkFDRV9SRUdTKCk7CSAgICBcCisgICAgU0lOR0xFX1NURVAoKQorCisjaWZkZWYgREVCVUcKKyMgZGVmaW5lIFNUQVJUX09GX0lOU1RSKCkKKyMgZGVmaW5lIEVORF9PRl9JTlNUUigpCSAgICBFbmRPZlRoZUluc3RydWN0aW9uUHJvY2VkdXJlOiB4ODZlbXVfZW5kX2luc3RyKCk7CisjIGRlZmluZSBFTkRfT0ZfSU5TVFJfTk9fVFJBQ0UoKSAgICB4ODZlbXVfZW5kX2luc3RyKCk7CisjZWxzZQorIyBkZWZpbmUgU1RBUlRfT0ZfSU5TVFIoKQorIyBkZWZpbmUgRU5EX09GX0lOU1RSKCkKKyMgZGVmaW5lIEVORF9PRl9JTlNUUl9OT19UUkFDRSgpCisjZW5kaWYKKworI2lmZGVmIERFQlVHCisjIGRlZmluZSAgQ0FMTF9UUkFDRSh1LHYsdyx4LHMpCQkJCQlcCisgICAgaWYgKERFQlVHX1RSQUNFQ0FMTFJFR1MoKSkJCQkJCVwKKwl4ODZlbXVfZHVtcF9yZWdzKCk7CQkJCQlcCisgICAgaWYgKERFQlVHX1RSQUNFQ0FMTCgpKQkJCQkJXAorCXByaW50aygiJTA0eDolMDR4OiBDQUxMICVzJTA0eDolMDR4XG4iLCB1ICwgdiwgcywgdywgeCk7CisjIGRlZmluZSBSRVRVUk5fVFJBQ0Uobix1LHYpCQkJCQlcCisgICAgaWYgKERFQlVHX1RSQUNFQ0FMTFJFR1MoKSkJCQkJCVwKKwl4ODZlbXVfZHVtcF9yZWdzKCk7CQkJCQlcCisgICAgaWYgKERFQlVHX1RSQUNFQ0FMTCgpKQkJCQkJXAorCXByaW50aygiJTA0eDolMDR4OiAlc1xuIix1LHYsbik7CisjZWxzZQorIyBkZWZpbmUgQ0FMTF9UUkFDRSh1LHYsdyx4LHMpCisjIGRlZmluZSBSRVRVUk5fVFJBQ0Uobix1LHYpCisjZW5kaWYKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIERCKHgpCXgKKyNlbHNlCisjZGVmaW5lIERCKHgpCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbiBQcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmCV9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsJCQkvKiBVc2UgIkMiIGxpbmthZ2Ugd2hlbiBpbiBDKysgbW9kZSAqLworI2VuZGlmCisKKwlleHRlcm4gdm9pZCB4ODZlbXVfaW5jX2RlY29kZWRfaW5zdF9sZW4oaW50IHgpOworCWV4dGVybiB2b2lkIHg4NmVtdV9kZWNvZGVfcHJpbnRmKGNoYXIgKngpOworCWV4dGVybiB2b2lkIHg4NmVtdV9kZWNvZGVfcHJpbnRmMihjaGFyICp4LCBpbnQgeSk7CisJZXh0ZXJuIHZvaWQgeDg2ZW11X2p1c3RfZGlzYXNzZW1ibGUodm9pZCk7CisJZXh0ZXJuIHZvaWQgeDg2ZW11X3NpbmdsZV9zdGVwKHZvaWQpOworCWV4dGVybiB2b2lkIHg4NmVtdV9lbmRfaW5zdHIodm9pZCk7CisJZXh0ZXJuIHZvaWQgeDg2ZW11X2R1bXBfcmVncyh2b2lkKTsKKwlleHRlcm4gdm9pZCB4ODZlbXVfZHVtcF94cmVncyh2b2lkKTsKKwlleHRlcm4gdm9pZCB4ODZlbXVfcHJpbnRfaW50X3ZlY3QodTE2IGl2KTsKKwlleHRlcm4gdm9pZCB4ODZlbXVfaW5zdHJ1bWVudF9pbnN0cnVjdGlvbih2b2lkKTsKKwlleHRlcm4gdm9pZCB4ODZlbXVfY2hlY2tfaXBfYWNjZXNzKHZvaWQpOworCWV4dGVybiB2b2lkIHg4NmVtdV9jaGVja19zcF9hY2Nlc3Modm9pZCk7CisJZXh0ZXJuIHZvaWQgeDg2ZW11X2NoZWNrX21lbV9hY2Nlc3ModTMyIHApOworCWV4dGVybiB2b2lkIHg4NmVtdV9jaGVja19kYXRhX2FjY2Vzcyh1aW50IHMsIHVpbnQgbyk7CisKKyNpZmRlZglfX2NwbHVzcGx1cworfQkJCQkvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKwkgICAgKi8KKyNlbmRpZgorI2VuZGlmCQkJCS8qIF9fWDg2RU1VX0RFQlVHX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmlvc19lbXVsYXRvci9pbmNsdWRlL3g4NmVtdS9kZWNvZGUuaCBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci9pbmNsdWRlL3g4NmVtdS9kZWNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzc2OWYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUveDg2ZW11L2RlY29kZS5oCkBAIC0wLDAgKzEsODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgICAgICBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0yMDA0IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKKyogICAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisqICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisqICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisqICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKKyogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCisqICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgorKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyoKKyogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKKyogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIEFueQorKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAorKgorKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIGZvciBpbnN0cnVjdGlvbiBkZWNvZGluZyBsb2dpYy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19YODZFTVVfREVDT0RFX0gKKyNkZWZpbmUgX19YODZFTVVfREVDT0RFX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hY3JvcyBhbmQgdHlwZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogSW5zdHJ1Y3Rpb24gRGVjb2RpbmcgU3R1ZmYgKi8KKworI2RlZmluZSBGRVRDSF9ERUNPREVfTU9EUk0obW9kLHJoLHJsKSAgIGZldGNoX2RlY29kZV9tb2RybSgmbW9kLCZyaCwmcmwpCisjZGVmaW5lIERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHIpICAgICAgZGVjb2RlX3JtX2J5dGVfcmVnaXN0ZXIocikKKyNkZWZpbmUgREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocikgICAgICBkZWNvZGVfcm1fd29yZF9yZWdpc3RlcihyKQorI2RlZmluZSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyKSAgICAgIGRlY29kZV9ybV9sb25nX3JlZ2lzdGVyKHIpCisjZGVmaW5lIERFQ09ERV9DTEVBUl9TRUdPVlIoKSAgICAgICAgICAgTS54ODYubW9kZSAmPSB+U1lTTU9ERV9DTFJNQVNLCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnVuY3Rpb24gUHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVzZSAiQyIgbGlua2FnZSB3aGVuIGluIEMrKyBtb2RlICovCisjZW5kaWYKKwordm9pZCAgICB4ODZlbXVfaW50cl9yYWlzZSAodTggdHlwZSk7Cit2b2lkICAgIGZldGNoX2RlY29kZV9tb2RybSAoaW50ICptb2QsaW50ICpyZWdoLGludCAqcmVnbCk7Cit1OCAgICAgIGZldGNoX2J5dGVfaW1tICh2b2lkKTsKK3UxNiAgICAgZmV0Y2hfd29yZF9pbW0gKHZvaWQpOwordTMyICAgICBmZXRjaF9sb25nX2ltbSAodm9pZCk7Cit1OCAgICAgIGZldGNoX2RhdGFfYnl0ZSAodWludCBvZmZzZXQpOwordTggICAgICBmZXRjaF9kYXRhX2J5dGVfYWJzICh1aW50IHNlZ21lbnQsIHVpbnQgb2Zmc2V0KTsKK3UxNiAgICAgZmV0Y2hfZGF0YV93b3JkICh1aW50IG9mZnNldCk7Cit1MTYgICAgIGZldGNoX2RhdGFfd29yZF9hYnMgKHVpbnQgc2VnbWVudCwgdWludCBvZmZzZXQpOwordTMyICAgICBmZXRjaF9kYXRhX2xvbmcgKHVpbnQgb2Zmc2V0KTsKK3UzMiAgICAgZmV0Y2hfZGF0YV9sb25nX2FicyAodWludCBzZWdtZW50LCB1aW50IG9mZnNldCk7Cit2b2lkICAgIHN0b3JlX2RhdGFfYnl0ZSAodWludCBvZmZzZXQsIHU4IHZhbCk7Cit2b2lkICAgIHN0b3JlX2RhdGFfYnl0ZV9hYnMgKHVpbnQgc2VnbWVudCwgdWludCBvZmZzZXQsIHU4IHZhbCk7Cit2b2lkICAgIHN0b3JlX2RhdGFfd29yZCAodWludCBvZmZzZXQsIHUxNiB2YWwpOwordm9pZCAgICBzdG9yZV9kYXRhX3dvcmRfYWJzICh1aW50IHNlZ21lbnQsIHVpbnQgb2Zmc2V0LCB1MTYgdmFsKTsKK3ZvaWQgICAgc3RvcmVfZGF0YV9sb25nICh1aW50IG9mZnNldCwgdTMyIHZhbCk7Cit2b2lkICAgIHN0b3JlX2RhdGFfbG9uZ19hYnMgKHVpbnQgc2VnbWVudCwgdWludCBvZmZzZXQsIHUzMiB2YWwpOwordTgqICAgICBkZWNvZGVfcm1fYnl0ZV9yZWdpc3RlcihpbnQgcmVnKTsKK3UxNiogICAgZGVjb2RlX3JtX3dvcmRfcmVnaXN0ZXIoaW50IHJlZyk7Cit1MzIqICAgIGRlY29kZV9ybV9sb25nX3JlZ2lzdGVyKGludCByZWcpOwordTE2KiAgICBkZWNvZGVfcm1fc2VnX3JlZ2lzdGVyKGludCByZWcpOwordW5zaWduZWQgZGVjb2RlX3JtMDBfYWRkcmVzcyhpbnQgcm0pOwordW5zaWduZWQgZGVjb2RlX3JtMDFfYWRkcmVzcyhpbnQgcm0pOwordW5zaWduZWQgZGVjb2RlX3JtMTBfYWRkcmVzcyhpbnQgcm0pOwordW5zaWduZWQgZGVjb2RlX3JtWFhfYWRkcmVzcyhpbnQgbW9kLCBpbnQgcm0pOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKyAgICAgICAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBfX1g4NkVNVV9ERUNPREVfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUveDg2ZW11L29wcy5oIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUveDg2ZW11L29wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZjIzMTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvaW5jbHVkZS94ODZlbXUvb3BzLmgKQEAgLTAsMCArMSw0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTIwMDQgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZworKiAgICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55CisqIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0CisqCisqIERlc2NyaXB0aW9uOiAgSGVhZGVyIGZpbGUgZm9yIG9wZXJhbmQgZGVjb2RpbmcgZnVuY3Rpb25zLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1g4NkVNVV9PUFNfSAorI2RlZmluZSBfX1g4NkVNVV9PUFNfSAorCitleHRlcm4gdm9pZCAoKng4NmVtdV9vcHRhYlsweDEwMF0pKHU4IG9wMSk7CitleHRlcm4gdm9pZCAoKng4NmVtdV9vcHRhYjJbMHgxMDBdKSh1OCBvcDIpOworCisjZW5kaWYgLyogX19YODZFTVVfT1BTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmlvc19lbXVsYXRvci9pbmNsdWRlL3g4NmVtdS9wcmltX2FzbS5oIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUveDg2ZW11L3ByaW1fYXNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiNGNhYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci9pbmNsdWRlL3g4NmVtdS9wcmltX2FzbS5oCkBAIC0wLDAgKzEsOTcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKKyoKKyogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMjAwNCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCisqICAgICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisqICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCisqICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisqICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubworKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisqCisqICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisqICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisqICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBXYXRjb20gQysrIDEwLjYgb3IgbGF0ZXIKKyogRW52aXJvbm1lbnQ6ICBBbnkKKyogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246ICBJbmxpbmUgYXNzZW1ibGVyIHZlcnNpb25zIG9mIHRoZSBwcmltaXRpdmUgb3BlcmFuZAorKiAgICAgICAgICAgICAgIGZ1bmN0aW9ucyBmb3IgZmFzdGVyIHBlcmZvcm1hbmNlLiBBdCB0aGUgbW9tZW50IHRoaXMgaXMKKyogICAgICAgICAgICAgICB4ODYgaW5saW5lIGFzc2VtYmxlciwgYnV0IHRoZXNlIGZ1bmN0aW9ucyBjb3VsZCBiZSByZXBsYWNlZAorKiAgICAgICAgICAgICAgIHdpdGggbmF0aXZlIGlubGluZSBhc3NlbWJsZXIgZm9yIGVhY2ggc3VwcG9ydGVkIHByb2Nlc3NvcgorKiAgICAgICAgICAgICAgIHBsYXRmb3JtLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1g4NkVNVV9QUklNX0FTTV9ICisjZGVmaW5lIF9fWDg2RU1VX1BSSU1fQVNNX0gKKworI2lmZGVmICBfX1dBVENPTUNfXworCisjaWZuZGVmIFZBTElEQVRFCisjZGVmaW5lIF9fSEFWRV9JTkxJTkVfQVNTRU1CTEVSX18KKyNlbmRpZgorCit1MzIgZ2V0X2ZsYWdzX2FzbSh2b2lkKTsKKyNwcmFnbWEgYXV4IGdldF9mbGFnc19hc20gPSAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIGVheCIgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2VheF07CisKK3UxNiBhYWFfd29yZF9hc20odTMyICogZmxhZ3MsIHUxNiBkKTsKKyNwcmFnbWEgYXV4IGFhYV93b3JkX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiYWFhIiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtheF0gICAgICAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2F4XTsKKwordTE2IGFhc193b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2IGQpOworI3ByYWdtYSBhdXggYWFzX3dvcmRfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJhYXMiICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2F4XSAgICAgICAgICAgICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXhdOworCit1MTYgYWFkX3dvcmRfYXNtKHUzMiAqIGZsYWdzLCB1MTYgZCk7CisjcHJhZ21hIGF1eCBhYWRfd29yZF9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImFhZCIgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYXhdICAgICAgICAgICAgICAgICBcCisgICAgdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtheF07CisKK3UxNiBhYW1fd29yZF9hc20odTMyICogZmxhZ3MsIHU4IGQpOworI3ByYWdtYSBhdXggYWFtX3dvcmRfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJhYW0iICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2FsXSAgICAgICAgICAgICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXhdOworCit1OCBhZGNfYnl0ZV9hc20odTMyICogZmxhZ3MsIHU4IGQsIHU4IHMpOworI3ByYWdtYSBhdXggYWRjX2J5dGVfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJhZGMgICAgYWwsYmwiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2FsXSBbYmxdICAgICAgICAgICAgXAorICAgIHZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYWwgYmxdOworCit1MTYgYWRjX3dvcmRfYXNtKHUzMiAqIGZsYWdzLCB1MTYgZCwgdTE2IHMpOworI3ByYWdtYSBhdXggYWRjX3dvcmRfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJhZGMgICAgYXgsYngiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2F4XSBbYnhdICAgICAgICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXggYnhdOworCit1MzIgYWRjX2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgZCwgdTMyIHMpOworI3ByYWdtYSBhdXggYWRjX2xvbmdfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJhZGMgICAgZWF4LGVieCIgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VheF0gW2VieF0gICAgICAgICAgXAorICAgIHZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbZWF4IGVieF07CisKK3U4IGFkZF9ieXRlX2FzbSh1MzIgKiBmbGFncywgdTggZCwgdTggcyk7CisjcHJhZ21hIGF1eCBhZGRfYnl0ZV9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImFkZCAgICBhbCxibCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYWxdIFtibF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFthbCBibF07CisKK3UxNiBhZGRfd29yZF9hc20odTMyICogZmxhZ3MsIHUxNiBkLCB1MTYgcyk7CisjcHJhZ21hIGF1eCBhZGRfd29yZF9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImFkZCAgICBheCxieCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYXhdIFtieF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtheCBieF07CisKK3UzMiBhZGRfbG9uZ19hc20odTMyICogZmxhZ3MsIHUzMiBkLCB1MzIgcyk7CisjcHJhZ21hIGF1eCBhZGRfbG9uZ19hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImFkZCAgICBlYXgsZWJ4IiAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZWF4XSBbZWJ4XSAgICAgICAgICBcCisgICAgdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtlYXggZWJ4XTsKKwordTggYW5kX2J5dGVfYXNtKHUzMiAqIGZsYWdzLCB1OCBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IGFuZF9ieXRlX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiYW5kICAgIGFsLGJsIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFthbF0gW2JsXSAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2FsIGJsXTsKKwordTE2IGFuZF93b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2IGQsIHUxNiBzKTsKKyNwcmFnbWEgYXV4IGFuZF93b3JkX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiYW5kICAgIGF4LGJ4IiAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtheF0gW2J4XSAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2F4IGJ4XTsKKwordTMyIGFuZF9sb25nX2FzbSh1MzIgKiBmbGFncywgdTMyIGQsIHUzMiBzKTsKKyNwcmFnbWEgYXV4IGFuZF9sb25nX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiYW5kICAgIGVheCxlYngiICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlYXhdIFtlYnhdICAgICAgICAgIFwKKyAgICB2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2VheCBlYnhdOworCit1OCBjbXBfYnl0ZV9hc20odTMyICogZmxhZ3MsIHU4IGQsIHU4IHMpOworI3ByYWdtYSBhdXggY21wX2J5dGVfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJjbXAgICAgYWwsYmwiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2FsXSBbYmxdICAgICAgICAgICAgXAorICAgIHZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYWwgYmxdOworCit1MTYgY21wX3dvcmRfYXNtKHUzMiAqIGZsYWdzLCB1MTYgZCwgdTE2IHMpOworI3ByYWdtYSBhdXggY21wX3dvcmRfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJjbXAgICAgYXgsYngiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2F4XSBbYnhdICAgICAgICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXggYnhdOworCit1MzIgY21wX2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgZCwgdTMyIHMpOworI3ByYWdtYSBhdXggY21wX2xvbmdfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJjbXAgICAgZWF4LGVieCIgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VheF0gW2VieF0gICAgICAgICAgXAorICAgIHZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbZWF4IGVieF07CisKK3U4IGRhYV9ieXRlX2FzbSh1MzIgKiBmbGFncywgdTggZCk7CisjcHJhZ21hIGF1eCBkYWFfYnl0ZV9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImRhYSIgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYWxdICAgICAgICAgICAgICAgICBcCisgICAgdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFthbF07CisKK3U4IGRhc19ieXRlX2FzbSh1MzIgKiBmbGFncywgdTggZCk7CisjcHJhZ21hIGF1eCBkYXNfYnl0ZV9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImRhcyIgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYWxdICAgICAgICAgICAgICAgICBcCisgICAgdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFthbF07CisKK3U4IGRlY19ieXRlX2FzbSh1MzIgKiBmbGFncywgdTggZCk7CisjcHJhZ21hIGF1eCBkZWNfYnl0ZV9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImRlYyAgICBhbCIgICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYWxdICAgICAgICAgICAgICAgICBcCisgICAgdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFthbF07CisKK3UxNiBkZWNfd29yZF9hc20odTMyICogZmxhZ3MsIHUxNiBkKTsKKyNwcmFnbWEgYXV4IGRlY193b3JkX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiZGVjICAgIGF4IiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtheF0gICAgICAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2F4XTsKKwordTMyIGRlY19sb25nX2FzbSh1MzIgKiBmbGFncywgdTMyIGQpOworI3ByYWdtYSBhdXggZGVjX2xvbmdfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJkZWMgICAgZWF4IiAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VheF0gICAgICAgICAgICAgICAgXAorICAgIHZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbZWF4XTsKKwordTggaW5jX2J5dGVfYXNtKHUzMiAqIGZsYWdzLCB1OCBkKTsKKyNwcmFnbWEgYXV4IGluY19ieXRlX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiaW5jICAgIGFsIiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFthbF0gICAgICAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2FsXTsKKwordTE2IGluY193b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2IGQpOworI3ByYWdtYSBhdXggaW5jX3dvcmRfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpbmMgICAgYXgiICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2F4XSAgICAgICAgICAgICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXhdOworCit1MzIgaW5jX2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgZCk7CisjcHJhZ21hIGF1eCBpbmNfbG9uZ19hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImluYyAgICBlYXgiICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZWF4XSAgICAgICAgICAgICAgICBcCisgICAgdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtlYXhdOworCit1OCBvcl9ieXRlX2FzbSh1MzIgKiBmbGFncywgdTggZCwgdTggcyk7CisjcHJhZ21hIGF1eCBvcl9ieXRlX2FzbSA9ICAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm9yIGFsLGJsIiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYWxdIFtibF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFthbCBibF07CisKK3UxNiBvcl93b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2IGQsIHUxNiBzKTsKKyNwcmFnbWEgYXV4IG9yX3dvcmRfYXNtID0gICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAib3IgYXgsYngiICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtheF0gW2J4XSAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2F4IGJ4XTsKKwordTMyIG9yX2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgZCwgdTMyIHMpOworI3ByYWdtYSBhdXggb3JfbG9uZ19hc20gPSAgICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJvciBlYXgsZWJ4IiAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VheF0gW2VieF0gICAgICAgICAgXAorICAgIHZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbZWF4IGVieF07CisKK3U4IG5lZ19ieXRlX2FzbSh1MzIgKiBmbGFncywgdTggZCk7CisjcHJhZ21hIGF1eCBuZWdfYnl0ZV9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm5lZyAgICBhbCIgICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYWxdICAgICAgICAgICAgICAgICBcCisgICAgdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFthbF07CisKK3UxNiBuZWdfd29yZF9hc20odTMyICogZmxhZ3MsIHUxNiBkKTsKKyNwcmFnbWEgYXV4IG5lZ193b3JkX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibmVnICAgIGF4IiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtheF0gICAgICAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2F4XTsKKwordTMyIG5lZ19sb25nX2FzbSh1MzIgKiBmbGFncywgdTMyIGQpOworI3ByYWdtYSBhdXggbmVnX2xvbmdfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJuZWcgICAgZWF4IiAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VheF0gICAgICAgICAgICAgICAgXAorICAgIHZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbZWF4XTsKKwordTggbm90X2J5dGVfYXNtKHUzMiAqIGZsYWdzLCB1OCBkKTsKKyNwcmFnbWEgYXV4IG5vdF9ieXRlX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibm90ICAgIGFsIiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFthbF0gICAgICAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2FsXTsKKwordTE2IG5vdF93b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2IGQpOworI3ByYWdtYSBhdXggbm90X3dvcmRfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJub3QgICAgYXgiICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2F4XSAgICAgICAgICAgICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXhdOworCit1MzIgbm90X2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgZCk7CisjcHJhZ21hIGF1eCBub3RfbG9uZ19hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm5vdCAgICBlYXgiICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZWF4XSAgICAgICAgICAgICAgICBcCisgICAgdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtlYXhdOworCit1OCByY2xfYnl0ZV9hc20odTMyICogZmxhZ3MsIHU4IGQsIHU4IHMpOworI3ByYWdtYSBhdXggcmNsX2J5dGVfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJyY2wgICAgYWwsY2wiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2FsXSBbY2xdICAgICAgICAgICAgXAorICAgIHZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYWwgY2xdOworCit1MTYgcmNsX3dvcmRfYXNtKHUzMiAqIGZsYWdzLCB1MTYgZCwgdTggcyk7CisjcHJhZ21hIGF1eCByY2xfd29yZF9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInJjbCAgICBheCxjbCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYXhdIFtjbF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtheCBjbF07CisKK3UzMiByY2xfbG9uZ19hc20odTMyICogZmxhZ3MsIHUzMiBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHJjbF9sb25nX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicmNsICAgIGVheCxjbCIgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlYXhdIFtjbF0gICAgICAgICAgIFwKKyAgICB2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2VheCBjbF07CisKK3U4IHJjcl9ieXRlX2FzbSh1MzIgKiBmbGFncywgdTggZCwgdTggcyk7CisjcHJhZ21hIGF1eCByY3JfYnl0ZV9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInJjciAgICBhbCxjbCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYWxdIFtjbF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFthbCBjbF07CisKK3UxNiByY3Jfd29yZF9hc20odTMyICogZmxhZ3MsIHUxNiBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHJjcl93b3JkX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicmNyICAgIGF4LGNsIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtheF0gW2NsXSAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2F4IGNsXTsKKwordTMyIHJjcl9sb25nX2FzbSh1MzIgKiBmbGFncywgdTMyIGQsIHU4IHMpOworI3ByYWdtYSBhdXggcmNyX2xvbmdfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJyY3IgICAgZWF4LGNsIiAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VheF0gW2NsXSAgICAgICAgICAgXAorICAgIHZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbZWF4IGNsXTsKKwordTggcm9sX2J5dGVfYXNtKHUzMiAqIGZsYWdzLCB1OCBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHJvbF9ieXRlX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicm9sICAgIGFsLGNsIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFthbF0gW2NsXSAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2FsIGNsXTsKKwordTE2IHJvbF93b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2IGQsIHU4IHMpOworI3ByYWdtYSBhdXggcm9sX3dvcmRfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJyb2wgICAgYXgsY2wiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2F4XSBbY2xdICAgICAgICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXggY2xdOworCit1MzIgcm9sX2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgZCwgdTggcyk7CisjcHJhZ21hIGF1eCByb2xfbG9uZ19hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInJvbCAgICBlYXgsY2wiICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZWF4XSBbY2xdICAgICAgICAgICBcCisgICAgdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtlYXggY2xdOworCit1OCByb3JfYnl0ZV9hc20odTMyICogZmxhZ3MsIHU4IGQsIHU4IHMpOworI3ByYWdtYSBhdXggcm9yX2J5dGVfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJyb3IgICAgYWwsY2wiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2FsXSBbY2xdICAgICAgICAgICAgXAorICAgIHZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYWwgY2xdOworCit1MTYgcm9yX3dvcmRfYXNtKHUzMiAqIGZsYWdzLCB1MTYgZCwgdTggcyk7CisjcHJhZ21hIGF1eCByb3Jfd29yZF9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInJvciAgICBheCxjbCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYXhdIFtjbF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtheCBjbF07CisKK3UzMiByb3JfbG9uZ19hc20odTMyICogZmxhZ3MsIHUzMiBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHJvcl9sb25nX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicm9yICAgIGVheCxjbCIgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlYXhdIFtjbF0gICAgICAgICAgIFwKKyAgICB2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2VheCBjbF07CisKK3U4IHNobF9ieXRlX2FzbSh1MzIgKiBmbGFncywgdTggZCwgdTggcyk7CisjcHJhZ21hIGF1eCBzaGxfYnl0ZV9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInNobCAgICBhbCxjbCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYWxdIFtjbF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFthbCBjbF07CisKK3UxNiBzaGxfd29yZF9hc20odTMyICogZmxhZ3MsIHUxNiBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHNobF93b3JkX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAic2hsICAgIGF4LGNsIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtheF0gW2NsXSAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2F4IGNsXTsKKwordTMyIHNobF9sb25nX2FzbSh1MzIgKiBmbGFncywgdTMyIGQsIHU4IHMpOworI3ByYWdtYSBhdXggc2hsX2xvbmdfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJzaGwgICAgZWF4LGNsIiAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VheF0gW2NsXSAgICAgICAgICAgXAorICAgIHZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbZWF4IGNsXTsKKwordTggc2hyX2J5dGVfYXNtKHUzMiAqIGZsYWdzLCB1OCBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHNocl9ieXRlX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAic2hyICAgIGFsLGNsIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFthbF0gW2NsXSAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2FsIGNsXTsKKwordTE2IHNocl93b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2IGQsIHU4IHMpOworI3ByYWdtYSBhdXggc2hyX3dvcmRfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJzaHIgICAgYXgsY2wiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2F4XSBbY2xdICAgICAgICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXggY2xdOworCit1MzIgc2hyX2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgZCwgdTggcyk7CisjcHJhZ21hIGF1eCBzaHJfbG9uZ19hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInNociAgICBlYXgsY2wiICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZWF4XSBbY2xdICAgICAgICAgICBcCisgICAgdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtlYXggY2xdOworCit1OCBzYXJfYnl0ZV9hc20odTMyICogZmxhZ3MsIHU4IGQsIHU4IHMpOworI3ByYWdtYSBhdXggc2FyX2J5dGVfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJzYXIgICAgYWwsY2wiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2FsXSBbY2xdICAgICAgICAgICAgXAorICAgIHZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYWwgY2xdOworCit1MTYgc2FyX3dvcmRfYXNtKHUzMiAqIGZsYWdzLCB1MTYgZCwgdTggcyk7CisjcHJhZ21hIGF1eCBzYXJfd29yZF9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInNhciAgICBheCxjbCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYXhdIFtjbF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtheCBjbF07CisKK3UzMiBzYXJfbG9uZ19hc20odTMyICogZmxhZ3MsIHUzMiBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHNhcl9sb25nX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAic2FyICAgIGVheCxjbCIgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlYXhdIFtjbF0gICAgICAgICAgIFwKKyAgICB2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2VheCBjbF07CisKK3UxNiBzaGxkX3dvcmRfYXNtKHUzMiAqIGZsYWdzLCB1MTYgZCwgdTE2IGZpbGwsIHU4IHMpOworI3ByYWdtYSBhdXggc2hsZF93b3JkX2FzbSA9ICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJzaGxkICAgYXgsZHgsY2wiICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2F4XSBbZHhdIFtjbF0gICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXggZHggY2xdOworCit1MzIgc2hsZF9sb25nX2FzbSh1MzIgKiBmbGFncywgdTMyIGQsIHUzMiBmaWxsLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHNobGRfbG9uZ19hc20gPSAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAic2hsZCAgIGVheCxlZHgsY2wiICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlYXhdIFtlZHhdIFtjbF0gICAgIFwKKyAgICB2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2VheCBlZHggY2xdOworCit1MTYgc2hyZF93b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2IGQsIHUxNiBmaWxsLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHNocmRfd29yZF9hc20gPSAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAic2hyZCAgIGF4LGR4LGNsIiAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtheF0gW2R4XSBbY2xdICAgICAgIFwKKyAgICB2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2F4IGR4IGNsXTsKKwordTMyIHNocmRfbG9uZ19hc20odTMyICogZmxhZ3MsIHUzMiBkLCB1MzIgZmlsbCwgdTggcyk7CisjcHJhZ21hIGF1eCBzaHJkX2xvbmdfYXNtID0gICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInNocmQgICBlYXgsZWR4LGNsIiAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZWF4XSBbZWR4XSBbY2xdICAgICBcCisgICAgdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtlYXggZWR4IGNsXTsKKwordTggc2JiX2J5dGVfYXNtKHUzMiAqIGZsYWdzLCB1OCBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IHNiYl9ieXRlX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAic2JiICAgIGFsLGJsIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFthbF0gW2JsXSAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYWxdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2FsIGJsXTsKKwordTE2IHNiYl93b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2IGQsIHUxNiBzKTsKKyNwcmFnbWEgYXV4IHNiYl93b3JkX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAic2JiICAgIGF4LGJ4IiAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtheF0gW2J4XSAgICAgICAgICAgIFwKKyAgICB2YWx1ZSBbYXhdICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2F4IGJ4XTsKKwordTMyIHNiYl9sb25nX2FzbSh1MzIgKiBmbGFncywgdTMyIGQsIHUzMiBzKTsKKyNwcmFnbWEgYXV4IHNiYl9sb25nX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAic2JiICAgIGVheCxlYngiICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlYXhdIFtlYnhdICAgICAgICAgIFwKKyAgICB2YWx1ZSBbZWF4XSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2VheCBlYnhdOworCit1OCBzdWJfYnl0ZV9hc20odTMyICogZmxhZ3MsIHU4IGQsIHU4IHMpOworI3ByYWdtYSBhdXggc3ViX2J5dGVfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJzdWIgICAgYWwsYmwiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2FsXSBbYmxdICAgICAgICAgICAgXAorICAgIHZhbHVlIFthbF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYWwgYmxdOworCit1MTYgc3ViX3dvcmRfYXNtKHUzMiAqIGZsYWdzLCB1MTYgZCwgdTE2IHMpOworI3ByYWdtYSBhdXggc3ViX3dvcmRfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJzdWIgICAgYXgsYngiICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2F4XSBbYnhdICAgICAgICAgICAgXAorICAgIHZhbHVlIFtheF0gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbYXggYnhdOworCit1MzIgc3ViX2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgZCwgdTMyIHMpOworI3ByYWdtYSBhdXggc3ViX2xvbmdfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJzdWIgICAgZWF4LGVieCIgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VheF0gW2VieF0gICAgICAgICAgXAorICAgIHZhbHVlIFtlYXhdICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbZWF4IGVieF07CisKK3ZvaWQgdGVzdF9ieXRlX2FzbSh1MzIgKiBmbGFncywgdTggZCwgdTggcyk7CisjcHJhZ21hIGF1eCB0ZXN0X2J5dGVfYXNtID0gICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInRlc3QgICBhbCxibCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYWxdIFtibF0gICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFthbCBibF07CisKK3ZvaWQgdGVzdF93b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2IGQsIHUxNiBzKTsKKyNwcmFnbWEgYXV4IHRlc3Rfd29yZF9hc20gPSAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAidGVzdCAgIGF4LGJ4IiAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtheF0gW2J4XSAgICAgICAgICAgIFwKKyAgICBtb2RpZnkgZXhhY3QgW2F4IGJ4XTsKKwordm9pZCB0ZXN0X2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgZCwgdTMyIHMpOworI3ByYWdtYSBhdXggdGVzdF9sb25nX2FzbSA9ICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJ0ZXN0ICAgZWF4LGVieCIgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VheF0gW2VieF0gICAgICAgICAgXAorICAgIG1vZGlmeSBleGFjdCBbZWF4IGVieF07CisKK3U4IHhvcl9ieXRlX2FzbSh1MzIgKiBmbGFncywgdTggZCwgdTggcyk7CisjcHJhZ21hIGF1eCB4b3JfYnl0ZV9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInhvciAgICBhbCxibCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYWxdIFtibF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2FsXSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFthbCBibF07CisKK3UxNiB4b3Jfd29yZF9hc20odTMyICogZmxhZ3MsIHUxNiBkLCB1MTYgcyk7CisjcHJhZ21hIGF1eCB4b3Jfd29yZF9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInhvciAgICBheCxieCIgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbYXhdIFtieF0gICAgICAgICAgICBcCisgICAgdmFsdWUgW2F4XSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtheCBieF07CisKK3UzMiB4b3JfbG9uZ19hc20odTMyICogZmxhZ3MsIHUzMiBkLCB1MzIgcyk7CisjcHJhZ21hIGF1eCB4b3JfbG9uZ19hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInhvciAgICBlYXgsZWJ4IiAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZWF4XSBbZWJ4XSAgICAgICAgICBcCisgICAgdmFsdWUgW2VheF0gICAgICAgICAgICAgICAgICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtlYXggZWJ4XTsKKwordm9pZCBpbXVsX2J5dGVfYXNtKHUzMiAqIGZsYWdzLCB1MTYgKiBheCwgdTggZCwgdTggcyk7CisjcHJhZ21hIGF1eCBpbXVsX2J5dGVfYXNtID0gICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImltdWwgICBibCIgICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdiAgICBbZXNpXSxheCIgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZXNpXSBbYWxdIFtibF0gICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtlc2kgYXggYmxdOworCit2b2lkIGltdWxfd29yZF9hc20odTMyICogZmxhZ3MsIHUxNiAqIGF4LCB1MTYgKiBkeCwgdTE2IGQsIHUxNiBzKTsKKyNwcmFnbWEgYXV4IGltdWxfd29yZF9hc20gPSAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiaW11bCAgIGJ4IiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92ICAgIFtlc2ldLGF4IiAgICAgICAgICAgICAgIFwKKyAgICAibW92ICAgIFtlY3hdLGR4IiAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlc2ldIFtlY3hdIFtheF0gW2J4XVwKKyAgICBtb2RpZnkgZXhhY3QgW2VzaSBlZGkgYXggYnggZHhdOworCit2b2lkIGltdWxfbG9uZ19hc20odTMyICogZmxhZ3MsIHUzMiAqIGVheCwgdTMyICogZWR4LCB1MzIgZCwgdTMyIHMpOworI3ByYWdtYSBhdXggaW11bF9sb25nX2FzbSA9ICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpbXVsICAgZWJ4IiAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJtb3YgICAgW2VzaV0sZWF4IiAgICAgICAgICAgICAgXAorICAgICJtb3YgICAgW2VjeF0sZWR4IiAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VzaV0gW2VjeF0gW2VheF0gW2VieF0gXAorICAgIG1vZGlmeSBleGFjdCBbZXNpIGVkaSBlYXggZWJ4IGVkeF07CisKK3ZvaWQgbXVsX2J5dGVfYXNtKHUzMiAqIGZsYWdzLCB1MTYgKiBheCwgdTggZCwgdTggcyk7CisjcHJhZ21hIGF1eCBtdWxfYnl0ZV9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm11bCAgICBibCIgICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdiAgICBbZXNpXSxheCIgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZXNpXSBbYWxdIFtibF0gICAgICBcCisgICAgbW9kaWZ5IGV4YWN0IFtlc2kgYXggYmxdOworCit2b2lkIG11bF93b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2ICogYXgsIHUxNiAqIGR4LCB1MTYgZCwgdTE2IHMpOworI3ByYWdtYSBhdXggbXVsX3dvcmRfYXNtID0gICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtdWwgICAgYngiICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJtb3YgICAgW2VzaV0sYXgiICAgICAgICAgICAgICAgXAorICAgICJtb3YgICAgW2VjeF0sZHgiICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VzaV0gW2VjeF0gW2F4XSBbYnhdXAorICAgIG1vZGlmeSBleGFjdCBbZXNpIGVkaSBheCBieCBkeF07CisKK3ZvaWQgbXVsX2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgKiBlYXgsIHUzMiAqIGVkeCwgdTMyIGQsIHUzMiBzKTsKKyNwcmFnbWEgYXV4IG11bF9sb25nX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibXVsICAgIGVieCIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92ICAgIFtlc2ldLGVheCIgICAgICAgICAgICAgIFwKKyAgICAibW92ICAgIFtlY3hdLGVkeCIgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlc2ldIFtlY3hdIFtlYXhdIFtlYnhdIFwKKyAgICBtb2RpZnkgZXhhY3QgW2VzaSBlZGkgZWF4IGVieCBlZHhdOworCit2b2lkIGlkaXZfYnl0ZV9hc20odTMyICogZmxhZ3MsIHU4ICogYWwsIHU4ICogYWgsIHUxNiBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IGlkaXZfYnl0ZV9hc20gPSAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiaWRpdiAgIGJsIiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92ICAgIFtlc2ldLGFsIiAgICAgICAgICAgICAgIFwKKyAgICAibW92ICAgIFtlY3hdLGFoIiAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlc2ldIFtlY3hdIFtheF0gW2JsXVwKKyAgICBtb2RpZnkgZXhhY3QgW2VzaSBlZGkgYXggYmxdOworCit2b2lkIGlkaXZfd29yZF9hc20odTMyICogZmxhZ3MsIHUxNiAqIGF4LCB1MTYgKiBkeCwgdTE2IGRsbywgdTE2IGRoaSwgdTE2IHMpOworI3ByYWdtYSBhdXggaWRpdl93b3JkX2FzbSA9ICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpZGl2ICAgYngiICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJtb3YgICAgW2VzaV0sYXgiICAgICAgICAgICAgICAgXAorICAgICJtb3YgICAgW2VjeF0sZHgiICAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VzaV0gW2VjeF0gW2F4XSBbZHhdIFtieF1cCisgICAgbW9kaWZ5IGV4YWN0IFtlc2kgZWRpIGF4IGR4IGJ4XTsKKwordm9pZCBpZGl2X2xvbmdfYXNtKHUzMiAqIGZsYWdzLCB1MzIgKiBlYXgsIHUzMiAqIGVkeCwgdTMyIGRsbywgdTMyIGRoaSwgdTMyIHMpOworI3ByYWdtYSBhdXggaWRpdl9sb25nX2FzbSA9ICAgICAgICAgXAorICAgICJwdXNoICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJwb3BmIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpZGl2ICAgZWJ4IiAgICAgICAgICAgICAgICAgICAgXAorICAgICJwdXNoZiIgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwb3AgICAgW2VkaV0iICAgICAgICAgICAgICAgICAgXAorICAgICJtb3YgICAgW2VzaV0sZWF4IiAgICAgICAgICAgICAgXAorICAgICJtb3YgICAgW2VjeF0sZWR4IiAgICAgICAgICAgICAgXAorICAgIHBhcm0gW2VkaV0gW2VzaV0gW2VjeF0gW2VheF0gW2VkeF0gW2VieF1cCisgICAgbW9kaWZ5IGV4YWN0IFtlc2kgZWRpIGVheCBlZHggZWJ4XTsKKwordm9pZCBkaXZfYnl0ZV9hc20odTMyICogZmxhZ3MsIHU4ICogYWwsIHU4ICogYWgsIHUxNiBkLCB1OCBzKTsKKyNwcmFnbWEgYXV4IGRpdl9ieXRlX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiZGl2ICAgIGJsIiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92ICAgIFtlc2ldLGFsIiAgICAgICAgICAgICAgIFwKKyAgICAibW92ICAgIFtlY3hdLGFoIiAgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlc2ldIFtlY3hdIFtheF0gW2JsXVwKKyAgICBtb2RpZnkgZXhhY3QgW2VzaSBlZGkgYXggYmxdOworCit2b2lkIGRpdl93b3JkX2FzbSh1MzIgKiBmbGFncywgdTE2ICogYXgsIHUxNiAqIGR4LCB1MTYgZGxvLCB1MTYgZGhpLCB1MTYgcyk7CisjcHJhZ21hIGF1eCBkaXZfd29yZF9hc20gPSAgICAgICAgICBcCisgICAgInB1c2ggICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgInBvcGYiICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImRpdiAgICBieCIgICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1c2hmIiAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBvcCAgICBbZWRpXSIgICAgICAgICAgICAgICAgICBcCisgICAgIm1vdiAgICBbZXNpXSxheCIgICAgICAgICAgICAgICBcCisgICAgIm1vdiAgICBbZWN4XSxkeCIgICAgICAgICAgICAgICBcCisgICAgcGFybSBbZWRpXSBbZXNpXSBbZWN4XSBbYXhdIFtkeF0gW2J4XVwKKyAgICBtb2RpZnkgZXhhY3QgW2VzaSBlZGkgYXggZHggYnhdOworCit2b2lkIGRpdl9sb25nX2FzbSh1MzIgKiBmbGFncywgdTMyICogZWF4LCB1MzIgKiBlZHgsIHUzMiBkbG8sIHUzMiBkaGksIHUzMiBzKTsKKyNwcmFnbWEgYXV4IGRpdl9sb25nX2FzbSA9ICAgICAgICAgIFwKKyAgICAicHVzaCAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wZiIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiZGl2ICAgIGVieCIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVzaGYiICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicG9wICAgIFtlZGldIiAgICAgICAgICAgICAgICAgIFwKKyAgICAibW92ICAgIFtlc2ldLGVheCIgICAgICAgICAgICAgIFwKKyAgICAibW92ICAgIFtlY3hdLGVkeCIgICAgICAgICAgICAgIFwKKyAgICBwYXJtIFtlZGldIFtlc2ldIFtlY3hdIFtlYXhdIFtlZHhdIFtlYnhdXAorICAgIG1vZGlmeSBleGFjdCBbZXNpIGVkaSBlYXggZWR4IGVieF07CisKKyNlbmRpZgorCisjZW5kaWYJCQkJLyogX19YODZFTVVfUFJJTV9BU01fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUveDg2ZW11L3ByaW1fb3BzLmggYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvaW5jbHVkZS94ODZlbXUvcHJpbV9vcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjkxZTg0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUveDg2ZW11L3ByaW1fb3BzLmgKQEAgLTAsMCArMSwxNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgICAgICAgICBSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5MS0yMDA0IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyogICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKKyogICAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisqICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisqICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisqICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKKyogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBhdXRob3JzIG1ha2VzIG5vCisqICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgorKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyoKKyogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKKyogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZTogICAgIEFOU0kgQworKiBFbnZpcm9ubWVudDogIEFueQorKiBEZXZlbG9wZXI6ICAgIEtlbmRhbGwgQmVubmV0dAorKgorKiBEZXNjcmlwdGlvbjogIEhlYWRlciBmaWxlIGZvciBwcmltaXRpdmUgb3BlcmF0aW9uIGZ1bmN0aW9ucy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19YODZFTVVfUFJJTV9PUFNfSAorI2RlZmluZSBfX1g4NkVNVV9QUklNX09QU19ICisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVzZSAiQyIgbGlua2FnZSB3aGVuIGluIEMrKyBtb2RlICovCisjZW5kaWYKKwordTE2ICAgICBhYWFfd29yZCAodTE2IGQpOwordTE2ICAgICBhYXNfd29yZCAodTE2IGQpOwordTE2ICAgICBhYWRfd29yZCAodTE2IGQpOwordTE2ICAgICBhYW1fd29yZCAodTggZCk7Cit1OCAgICAgIGFkY19ieXRlICh1OCBkLCB1OCBzKTsKK3UxNiAgICAgYWRjX3dvcmQgKHUxNiBkLCB1MTYgcyk7Cit1MzIgICAgIGFkY19sb25nICh1MzIgZCwgdTMyIHMpOwordTggICAgICBhZGRfYnl0ZSAodTggZCwgdTggcyk7Cit1MTYgICAgIGFkZF93b3JkICh1MTYgZCwgdTE2IHMpOwordTMyICAgICBhZGRfbG9uZyAodTMyIGQsIHUzMiBzKTsKK3U4ICAgICAgYW5kX2J5dGUgKHU4IGQsIHU4IHMpOwordTE2ICAgICBhbmRfd29yZCAodTE2IGQsIHUxNiBzKTsKK3UzMiAgICAgYW5kX2xvbmcgKHUzMiBkLCB1MzIgcyk7Cit1OCAgICAgIGNtcF9ieXRlICh1OCBkLCB1OCBzKTsKK3UxNiAgICAgY21wX3dvcmQgKHUxNiBkLCB1MTYgcyk7Cit1MzIgICAgIGNtcF9sb25nICh1MzIgZCwgdTMyIHMpOwordTggICAgICBkYWFfYnl0ZSAodTggZCk7Cit1OCAgICAgIGRhc19ieXRlICh1OCBkKTsKK3U4ICAgICAgZGVjX2J5dGUgKHU4IGQpOwordTE2ICAgICBkZWNfd29yZCAodTE2IGQpOwordTMyICAgICBkZWNfbG9uZyAodTMyIGQpOwordTggICAgICBpbmNfYnl0ZSAodTggZCk7Cit1MTYgICAgIGluY193b3JkICh1MTYgZCk7Cit1MzIgICAgIGluY19sb25nICh1MzIgZCk7Cit1OCAgICAgIG9yX2J5dGUgKHU4IGQsIHU4IHMpOwordTE2ICAgICBvcl93b3JkICh1MTYgZCwgdTE2IHMpOwordTMyICAgICBvcl9sb25nICh1MzIgZCwgdTMyIHMpOwordTggICAgICBuZWdfYnl0ZSAodTggcyk7Cit1MTYgICAgIG5lZ193b3JkICh1MTYgcyk7Cit1MzIgICAgIG5lZ19sb25nICh1MzIgcyk7Cit1OCAgICAgIG5vdF9ieXRlICh1OCBzKTsKK3UxNiAgICAgbm90X3dvcmQgKHUxNiBzKTsKK3UzMiAgICAgbm90X2xvbmcgKHUzMiBzKTsKK3U4ICAgICAgcmNsX2J5dGUgKHU4IGQsIHU4IHMpOwordTE2ICAgICByY2xfd29yZCAodTE2IGQsIHU4IHMpOwordTMyICAgICByY2xfbG9uZyAodTMyIGQsIHU4IHMpOwordTggICAgICByY3JfYnl0ZSAodTggZCwgdTggcyk7Cit1MTYgICAgIHJjcl93b3JkICh1MTYgZCwgdTggcyk7Cit1MzIgICAgIHJjcl9sb25nICh1MzIgZCwgdTggcyk7Cit1OCAgICAgIHJvbF9ieXRlICh1OCBkLCB1OCBzKTsKK3UxNiAgICAgcm9sX3dvcmQgKHUxNiBkLCB1OCBzKTsKK3UzMiAgICAgcm9sX2xvbmcgKHUzMiBkLCB1OCBzKTsKK3U4ICAgICAgcm9yX2J5dGUgKHU4IGQsIHU4IHMpOwordTE2ICAgICByb3Jfd29yZCAodTE2IGQsIHU4IHMpOwordTMyICAgICByb3JfbG9uZyAodTMyIGQsIHU4IHMpOwordTggICAgICBzaGxfYnl0ZSAodTggZCwgdTggcyk7Cit1MTYgICAgIHNobF93b3JkICh1MTYgZCwgdTggcyk7Cit1MzIgICAgIHNobF9sb25nICh1MzIgZCwgdTggcyk7Cit1OCAgICAgIHNocl9ieXRlICh1OCBkLCB1OCBzKTsKK3UxNiAgICAgc2hyX3dvcmQgKHUxNiBkLCB1OCBzKTsKK3UzMiAgICAgc2hyX2xvbmcgKHUzMiBkLCB1OCBzKTsKK3U4ICAgICAgc2FyX2J5dGUgKHU4IGQsIHU4IHMpOwordTE2ICAgICBzYXJfd29yZCAodTE2IGQsIHU4IHMpOwordTMyICAgICBzYXJfbG9uZyAodTMyIGQsIHU4IHMpOwordTE2ICAgICBzaGxkX3dvcmQgKHUxNiBkLCB1MTYgZmlsbCwgdTggcyk7Cit1MzIgICAgIHNobGRfbG9uZyAodTMyIGQsIHUzMiBmaWxsLCB1OCBzKTsKK3UxNiAgICAgc2hyZF93b3JkICh1MTYgZCwgdTE2IGZpbGwsIHU4IHMpOwordTMyICAgICBzaHJkX2xvbmcgKHUzMiBkLCB1MzIgZmlsbCwgdTggcyk7Cit1OCAgICAgIHNiYl9ieXRlICh1OCBkLCB1OCBzKTsKK3UxNiAgICAgc2JiX3dvcmQgKHUxNiBkLCB1MTYgcyk7Cit1MzIgICAgIHNiYl9sb25nICh1MzIgZCwgdTMyIHMpOwordTggICAgICBzdWJfYnl0ZSAodTggZCwgdTggcyk7Cit1MTYgICAgIHN1Yl93b3JkICh1MTYgZCwgdTE2IHMpOwordTMyICAgICBzdWJfbG9uZyAodTMyIGQsIHUzMiBzKTsKK3ZvaWQgICAgdGVzdF9ieXRlICh1OCBkLCB1OCBzKTsKK3ZvaWQgICAgdGVzdF93b3JkICh1MTYgZCwgdTE2IHMpOwordm9pZCAgICB0ZXN0X2xvbmcgKHUzMiBkLCB1MzIgcyk7Cit1OCAgICAgIHhvcl9ieXRlICh1OCBkLCB1OCBzKTsKK3UxNiAgICAgeG9yX3dvcmQgKHUxNiBkLCB1MTYgcyk7Cit1MzIgICAgIHhvcl9sb25nICh1MzIgZCwgdTMyIHMpOwordm9pZCAgICBpbXVsX2J5dGUgKHU4IHMpOwordm9pZCAgICBpbXVsX3dvcmQgKHUxNiBzKTsKK3ZvaWQgICAgaW11bF9sb25nICh1MzIgcyk7Cit2b2lkICAgIGltdWxfbG9uZ19kaXJlY3QodTMyICpyZXNfbG8sIHUzMiogcmVzX2hpLHUzMiBkLCB1MzIgcyk7Cit2b2lkICAgIG11bF9ieXRlICh1OCBzKTsKK3ZvaWQgICAgbXVsX3dvcmQgKHUxNiBzKTsKK3ZvaWQgICAgbXVsX2xvbmcgKHUzMiBzKTsKK3ZvaWQgICAgaWRpdl9ieXRlICh1OCBzKTsKK3ZvaWQgICAgaWRpdl93b3JkICh1MTYgcyk7Cit2b2lkICAgIGlkaXZfbG9uZyAodTMyIHMpOwordm9pZCAgICBkaXZfYnl0ZSAodTggcyk7Cit2b2lkICAgIGRpdl93b3JkICh1MTYgcyk7Cit2b2lkICAgIGRpdl9sb25nICh1MzIgcyk7Cit2b2lkICAgIGlucyAoaW50IHNpemUpOwordm9pZCAgICBvdXRzIChpbnQgc2l6ZSk7Cit1MTYgICAgIG1lbV9hY2Nlc3Nfd29yZCAoaW50IGFkZHIpOwordm9pZCAgICBwdXNoX3dvcmQgKHUxNiB3KTsKK3ZvaWQgICAgcHVzaF9sb25nICh1MzIgdyk7Cit1MTYgICAgIHBvcF93b3JkICh2b2lkKTsKK3UzMiAgICAgcG9wX2xvbmcgKHZvaWQpOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmQgb2YgIkMiIGxpbmthZ2UgZm9yIEMrKyAgICAgICAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBfX1g4NkVNVV9QUklNX09QU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvaW5jbHVkZS94ODZlbXUvcmVncy5oIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUveDg2ZW11L3JlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2ZlZGQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL2luY2x1ZGUveDg2ZW11L3JlZ3MuaApAQCAtMCwwICsxLDM0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKgkJQ29weXJpZ2h0IChDKSAxOTkxLTIwMDQgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgkJICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCisqCQkgICAgICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisqICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisqICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisqICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKKyogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4JVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOglBTlNJIEMKKyogRW52aXJvbm1lbnQ6CUFueQorKiBEZXZlbG9wZXI6CUtlbmRhbGwgQmVubmV0dAorKgorKiBEZXNjcmlwdGlvbjoJSGVhZGVyIGZpbGUgZm9yIHg4NiByZWdpc3RlciBkZWZpbml0aW9ucy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19YODZFTVVfUkVHU19ICisjZGVmaW5lIF9fWDg2RU1VX1JFR1NfSAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFjcm9zIGFuZCB0eXBlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjcHJhZ21hIHBhY2soMSkKKworLyoKKyAqIEdlbmVyYWwgRUFYLCBFQlgsIEVDWCwgRURYIHR5cGUgcmVnaXN0ZXJzLiAgTm90ZSB0aGF0IGZvcgorICogcG9ydGFiaWxpdHksIGFuZCBzcGVlZCwgdGhlIGlzc3VlIG9mIGJ5dGUgc3dhcHBpbmcgaXMgbm90IGFkZHJlc3NlZAorICogaW4gdGhlIHJlZ2lzdGVycy4gIEFsbCByZWdpc3RlcnMgYXJlIHN0b3JlZCBpbiB0aGUgZGVmYXVsdCBmb3JtYXQKKyAqIGF2YWlsYWJsZSBvbiB0aGUgaG9zdCBtYWNoaW5lLiAgVGhlIG9ubHkgY3JpdGljYWwgaXNzdWUgaXMgdGhhdCB0aGUKKyAqIHJlZ2lzdGVycyBzaG91bGQgbGluZSB1cCBFWEFDVExZIGluIHRoZSBzYW1lIG1hbm5lciBhcyB0aGV5IGRvIGluCisgKiB0aGUgMzg2LiAgVGhhdCBpczoKKyAqCisgKiBFQVggJiAweGZmICA9PT0gQUwKKyAqIEVBWCAmIDB4ZmZmZiA9PSBBWAorICoKKyAqIGV0Yy4JIFRoZSByZXN1bHQgaXMgdGhhdCBhbG90IG9mIHRoZSBjYWxjdWxhdGlvbnMgY2FuIHRoZW4gYmUKKyAqIGRvbmUgdXNpbmcgdGhlIG5hdGl2ZSBpbnN0cnVjdGlvbiBzZXQgZnVsbHkuCisgKi8KKworI2lmZGVmCV9fQklHX0VORElBTl9fCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgZV9yZWc7Cit9IEkzMl9yZWdfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiBmaWxsZXIwLCB4X3JlZzsKK30gSTE2X3JlZ190OworCit0eXBlZGVmIHN0cnVjdCB7CisJdTggZmlsbGVyMCwgZmlsbGVyMSwgaF9yZWcsIGxfcmVnOworfSBJOF9yZWdfdDsKKworI2Vsc2UJCQkJLyogIV9fQklHX0VORElBTl9fICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgZV9yZWc7Cit9IEkzMl9yZWdfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiB4X3JlZzsKK30gSTE2X3JlZ190OworCit0eXBlZGVmIHN0cnVjdCB7CisJdTggbF9yZWcsIGhfcmVnOworfSBJOF9yZWdfdDsKKworI2VuZGlmCQkJCS8qIEJJR19FTkRJQU4gKi8KKwordHlwZWRlZiB1bmlvbiB7CisJSTMyX3JlZ190IEkzMl9yZWc7CisJSTE2X3JlZ190IEkxNl9yZWc7CisJSThfcmVnX3QgSThfcmVnOworfSBpMzg2X2dlbmVyYWxfcmVnaXN0ZXI7CisKK3N0cnVjdCBpMzg2X2dlbmVyYWxfcmVncyB7CisJaTM4Nl9nZW5lcmFsX3JlZ2lzdGVyIEEsIEIsIEMsIEQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBpMzg2X2dlbmVyYWxfcmVncyBHZW5fcmVnX3Q7CisKK3N0cnVjdCBpMzg2X3NwZWNpYWxfcmVncyB7CisJaTM4Nl9nZW5lcmFsX3JlZ2lzdGVyIFNQLCBCUCwgU0ksIERJLCBJUDsKKwl1MzIgRkxBR1M7Cit9OworCisvKgorICogU2VnbWVudCByZWdpc3RlcnMgaGVyZSByZXByZXNlbnQgdGhlIDE2IGJpdCBxdWFudGl0aWVzCisgKiBDUywgRFMsIEVTLCBTUy4KKyAqLworCisjdW5kZWYgQ1MKKyN1bmRlZiBEUworI3VuZGVmIFNTCisjdW5kZWYgRVMKKyN1bmRlZiBGUworI3VuZGVmIEdTCisKK3N0cnVjdCBpMzg2X3NlZ21lbnRfcmVncyB7CisJdTE2IENTLCBEUywgU1MsIEVTLCBGUywgR1M7Cit9OworCisvKiA4IGJpdCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUl9BSCAgZ2VuLkEuSThfcmVnLmhfcmVnCisjZGVmaW5lIFJfQUwgIGdlbi5BLkk4X3JlZy5sX3JlZworI2RlZmluZSBSX0JIICBnZW4uQi5JOF9yZWcuaF9yZWcKKyNkZWZpbmUgUl9CTCAgZ2VuLkIuSThfcmVnLmxfcmVnCisjZGVmaW5lIFJfQ0ggIGdlbi5DLkk4X3JlZy5oX3JlZworI2RlZmluZSBSX0NMICBnZW4uQy5JOF9yZWcubF9yZWcKKyNkZWZpbmUgUl9ESCAgZ2VuLkQuSThfcmVnLmhfcmVnCisjZGVmaW5lIFJfREwgIGdlbi5ELkk4X3JlZy5sX3JlZworCisvKiAxNiBiaXQgcmVnaXN0ZXJzICovCisjZGVmaW5lIFJfQVggIGdlbi5BLkkxNl9yZWcueF9yZWcKKyNkZWZpbmUgUl9CWCAgZ2VuLkIuSTE2X3JlZy54X3JlZworI2RlZmluZSBSX0NYICBnZW4uQy5JMTZfcmVnLnhfcmVnCisjZGVmaW5lIFJfRFggIGdlbi5ELkkxNl9yZWcueF9yZWcKKworLyogMzIgYml0IGV4dGVuZGVkIHJlZ2lzdGVycyAqLworI2RlZmluZSBSX0VBWCAgZ2VuLkEuSTMyX3JlZy5lX3JlZworI2RlZmluZSBSX0VCWCAgZ2VuLkIuSTMyX3JlZy5lX3JlZworI2RlZmluZSBSX0VDWCAgZ2VuLkMuSTMyX3JlZy5lX3JlZworI2RlZmluZSBSX0VEWCAgZ2VuLkQuSTMyX3JlZy5lX3JlZworCisvKiBzcGVjaWFsIHJlZ2lzdGVycyAqLworI2RlZmluZSBSX1NQICBzcGMuU1AuSTE2X3JlZy54X3JlZworI2RlZmluZSBSX0JQICBzcGMuQlAuSTE2X3JlZy54X3JlZworI2RlZmluZSBSX1NJICBzcGMuU0kuSTE2X3JlZy54X3JlZworI2RlZmluZSBSX0RJICBzcGMuREkuSTE2X3JlZy54X3JlZworI2RlZmluZSBSX0lQICBzcGMuSVAuSTE2X3JlZy54X3JlZworI2RlZmluZSBSX0ZMRyBzcGMuRkxBR1MKKworLyogc3BlY2lhbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUl9TUCAgc3BjLlNQLkkxNl9yZWcueF9yZWcKKyNkZWZpbmUgUl9CUCAgc3BjLkJQLkkxNl9yZWcueF9yZWcKKyNkZWZpbmUgUl9TSSAgc3BjLlNJLkkxNl9yZWcueF9yZWcKKyNkZWZpbmUgUl9ESSAgc3BjLkRJLkkxNl9yZWcueF9yZWcKKyNkZWZpbmUgUl9JUCAgc3BjLklQLkkxNl9yZWcueF9yZWcKKyNkZWZpbmUgUl9GTEcgc3BjLkZMQUdTCisKKy8qIHNwZWNpYWwgcmVnaXN0ZXJzICovCisjZGVmaW5lIFJfRVNQICBzcGMuU1AuSTMyX3JlZy5lX3JlZworI2RlZmluZSBSX0VCUCAgc3BjLkJQLkkzMl9yZWcuZV9yZWcKKyNkZWZpbmUgUl9FU0kgIHNwYy5TSS5JMzJfcmVnLmVfcmVnCisjZGVmaW5lIFJfRURJICBzcGMuREkuSTMyX3JlZy5lX3JlZworI2RlZmluZSBSX0VJUCAgc3BjLklQLkkzMl9yZWcuZV9yZWcKKyNkZWZpbmUgUl9FRkxHIHNwYy5GTEFHUworCisvKiBzZWdtZW50IHJlZ2lzdGVycyAqLworI2RlZmluZSBSX0NTICBzZWcuQ1MKKyNkZWZpbmUgUl9EUyAgc2VnLkRTCisjZGVmaW5lIFJfU1MgIHNlZy5TUworI2RlZmluZSBSX0VTICBzZWcuRVMKKyNkZWZpbmUgUl9GUyAgc2VnLkZTCisjZGVmaW5lIFJfR1MgIHNlZy5HUworCisvKiBmbGFnIGNvbmRpdGlvbnMgICAqLworI2RlZmluZSBGQl9DRiAweDAwMDEJCS8qIENBUlJZIGZsYWcgICovCisjZGVmaW5lIEZCX1BGIDB4MDAwNAkJLyogUEFSSVRZIGZsYWcgKi8KKyNkZWZpbmUgRkJfQUYgMHgwMDEwCQkvKiBBVVgJZmxhZyAgICovCisjZGVmaW5lIEZCX1pGIDB4MDA0MAkJLyogWkVSTyBmbGFnICAgKi8KKyNkZWZpbmUgRkJfU0YgMHgwMDgwCQkvKiBTSUdOIGZsYWcgICAqLworI2RlZmluZSBGQl9URiAweDAxMDAJCS8qIFRSQVAgZmxhZyAgICovCisjZGVmaW5lIEZCX0lGIDB4MDIwMAkJLyogSU5URVJSVVBUIEVOQUJMRSBmbGFnICovCisjZGVmaW5lIEZCX0RGIDB4MDQwMAkJLyogRElSIGZsYWcgICAgKi8KKyNkZWZpbmUgRkJfT0YgMHgwODAwCQkvKiBPVkVSRkxPVyBmbGFnICovCisKKy8qIDgwMjg2IGFuZCBhYm92ZSBhbHdheXMgaGF2ZSBiaXQjMSBzZXQgKi8KKyNkZWZpbmUgRl9BTFdBWVNfT04gICgweDAwMDIpCS8qIGZsYWcgYml0cyBhbHdheXMgb24gKi8KKworLyoKKyAqIERlZmluZSBhIG1hc2sgZm9yIG9ubHkgdGhvc2UgZmxhZyBiaXRzIHdlIHdpbGwgZXZlciBwYXNzIGJhY2sKKyAqICh2aWEgUFVTSEYpCisgKi8KKyNkZWZpbmUgRl9NU0sgKEZCX0NGfEZCX1BGfEZCX0FGfEZCX1pGfEZCX1NGfEZCX1RGfEZCX0lGfEZCX0RGfEZCX09GKQorCisvKiBmb2xsb3dpbmcgYml0cyBtYXNrZWQgaW4gdG8gYSAxNmJpdCBxdWFudGl0eSAqLworCisjZGVmaW5lIEZfQ0YgMHgwMDAxCQkvKiBDQVJSWSBmbGFnICAqLworI2RlZmluZSBGX1BGIDB4MDAwNAkJLyogUEFSSVRZIGZsYWcgKi8KKyNkZWZpbmUgRl9BRiAweDAwMTAJCS8qIEFVWAlmbGFnICAgKi8KKyNkZWZpbmUgRl9aRiAweDAwNDAJCS8qIFpFUk8gZmxhZyAgICovCisjZGVmaW5lIEZfU0YgMHgwMDgwCQkvKiBTSUdOIGZsYWcgICAqLworI2RlZmluZSBGX1RGIDB4MDEwMAkJLyogVFJBUCBmbGFnICAgKi8KKyNkZWZpbmUgRl9JRiAweDAyMDAJCS8qIElOVEVSUlVQVCBFTkFCTEUgZmxhZyAqLworI2RlZmluZSBGX0RGIDB4MDQwMAkJLyogRElSIGZsYWcgICAgKi8KKyNkZWZpbmUgRl9PRiAweDA4MDAJCS8qIE9WRVJGTE9XIGZsYWcgKi8KKworI2RlZmluZSBUT0dHTEVfRkxBRyhmbGFnKQkoTS54ODYuUl9GTEcgXj0gKGZsYWcpKQorI2RlZmluZSBTRVRfRkxBRyhmbGFnKQkJKE0ueDg2LlJfRkxHIHw9IChmbGFnKSkKKyNkZWZpbmUgQ0xFQVJfRkxBRyhmbGFnKQkoTS54ODYuUl9GTEcgJj0gfihmbGFnKSkKKyNkZWZpbmUgQUNDRVNTX0ZMQUcoZmxhZykJKE0ueDg2LlJfRkxHICYgKGZsYWcpKQorI2RlZmluZSBDTEVBUkFMTF9GTEFHKG0pCShNLng4Ni5SX0ZMRyA9IDApCisKKyNkZWZpbmUgQ09ORElUSU9OQUxfU0VUX0ZMQUcoQ09ORCxGTEFHKSBcCisgIGlmIChDT05EKSBTRVRfRkxBRyhGTEFHKTsgZWxzZSBDTEVBUl9GTEFHKEZMQUcpCisKKyNkZWZpbmUgRl9QRl9DQUxDIDB4MDEwMDAwCS8qIFBBUklUWSBmbGFnIGhhcyBiZWVuIGNhbGNlZAkgICovCisjZGVmaW5lIEZfWkZfQ0FMQyAweDAyMDAwMAkvKiBaRVJPIGZsYWcgaGFzIGJlZW4gY2FsY2VkCSAgKi8KKyNkZWZpbmUgRl9TRl9DQUxDIDB4MDQwMDAwCS8qIFNJR04gZmxhZyBoYXMgYmVlbiBjYWxjZWQJICAqLworCisjZGVmaW5lIEZfQUxMX0NBTEMJMHhmZjAwMDAJLyogQWxsIGhhdmUgYmVlbiBjYWxjZWQJICAqLworCisvKgorICogRW11bGF0b3IgbWFjaGluZSBzdGF0ZS4KKyAqIFNlZ21lbnQgdXNhZ2UgY29udHJvbC4KKyAqLworI2RlZmluZSBTWVNNT0RFX1NFR19EU19TUwkweDAwMDAwMDAxCisjZGVmaW5lIFNZU01PREVfU0VHT1ZSX0NTCTB4MDAwMDAwMDIKKyNkZWZpbmUgU1lTTU9ERV9TRUdPVlJfRFMJMHgwMDAwMDAwNAorI2RlZmluZSBTWVNNT0RFX1NFR09WUl9FUwkweDAwMDAwMDA4CisjZGVmaW5lIFNZU01PREVfU0VHT1ZSX0ZTCTB4MDAwMDAwMTAKKyNkZWZpbmUgU1lTTU9ERV9TRUdPVlJfR1MJMHgwMDAwMDAyMAorI2RlZmluZSBTWVNNT0RFX1NFR09WUl9TUwkweDAwMDAwMDQwCisjZGVmaW5lIFNZU01PREVfUFJFRklYX1JFUEUJMHgwMDAwMDA4MAorI2RlZmluZSBTWVNNT0RFX1BSRUZJWF9SRVBORQkweDAwMDAwMTAwCisjZGVmaW5lIFNZU01PREVfUFJFRklYX0RBVEEJMHgwMDAwMDIwMAorI2RlZmluZSBTWVNNT0RFX1BSRUZJWF9BRERSCTB4MDAwMDA0MDAKKyNkZWZpbmUgU1lTTU9ERV9JTlRSX1BFTkRJTkcJMHgxMDAwMDAwMAorI2RlZmluZSBTWVNNT0RFX0VYVFJOX0lOVFIJMHgyMDAwMDAwMAorI2RlZmluZSBTWVNNT0RFX0hBTFRFRAkJMHg0MDAwMDAwMAorCisjZGVmaW5lIFNZU01PREVfU0VHTUFTSyAoU1lTTU9ERV9TRUdfRFNfU1MJfCBcCisJCQkgU1lTTU9ERV9TRUdPVlJfQ1MJfCBcCisJCQkgU1lTTU9ERV9TRUdPVlJfRFMJfCBcCisJCQkgU1lTTU9ERV9TRUdPVlJfRVMJfCBcCisJCQkgU1lTTU9ERV9TRUdPVlJfRlMJfCBcCisJCQkgU1lTTU9ERV9TRUdPVlJfR1MJfCBcCisJCQkgU1lTTU9ERV9TRUdPVlJfU1MpCisjZGVmaW5lIFNZU01PREVfQ0xSTUFTSyAoU1lTTU9ERV9TRUdfRFNfU1MJfCBcCisJCQkgU1lTTU9ERV9TRUdPVlJfQ1MJfCBcCisJCQkgU1lTTU9ERV9TRUdPVlJfRFMJfCBcCisJCQkgU1lTTU9ERV9TRUdPVlJfRVMJfCBcCisJCQkgU1lTTU9ERV9TRUdPVlJfRlMJfCBcCisJCQkgU1lTTU9ERV9TRUdPVlJfR1MJfCBcCisJCQkgU1lTTU9ERV9TRUdPVlJfU1MJfCBcCisJCQkgU1lTTU9ERV9QUkVGSVhfREFUQQl8IFwKKwkJCSBTWVNNT0RFX1BSRUZJWF9BRERSKQorCisjZGVmaW5lCSBJTlRSX1NZTkNICSAgICAgIDB4MQorI2RlZmluZQkgSU5UUl9BU1lOQ0gJICAgICAgMHgyCisjZGVmaW5lCSBJTlRSX0hBTFRFRAkgICAgICAweDQKKwordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCBpMzg2X2dlbmVyYWxfcmVncyBnZW47CisJc3RydWN0IGkzODZfc3BlY2lhbF9yZWdzIHNwYzsKKwlzdHJ1Y3QgaTM4Nl9zZWdtZW50X3JlZ3Mgc2VnOworCS8qCisJICogTU9ERSBjb250YWlucyBpbmZvcm1hdGlvbiBvbjoKKwkgKiAgUkVQRSBwcmVmaXgJCSAgICAyIGJpdHMgIHJlcGUscmVwbmUKKwkgKiAgU0VHTUVOVCBvdmVycmlkZXMJICAgIDUgYml0cyAgbm9ybWFsLERTLFNTLENTLEVTCisJICogIERlbGF5ZWQgZmxhZyBzZXQJICAgIDMgYml0cyAgKHplcm8sIHNpZ25lZCwgcGFyaXR5KQorCSAqICByZXNlcnZlZAkJICAgIDYgYml0cworCSAqICBpbnRlcnJ1cHQgIwkJICAgIDggYml0cyAgaW5zdHJ1Y3Rpb24gcmFpc2VkIGludGVycnVwdAorCSAqICBCSU9TIHZpZGVvIHNlZ3JlZ3MJICAgIDQgYml0cworCSAqICBJbnRlcnJ1cHQgUGVuZGluZwkgICAgMSBiaXRzCisJICogIEV4dGVybiBpbnRlcnJ1cHQJICAgIDEgYml0cworCSAqICBIYWx0ZWQJCSAgICAxIGJpdHMKKwkgKi8KKwlsb25nIG1vZGU7CisJdTggaW50bm87CisJdm9sYXRpbGUgaW50IGludHI7CS8qIG1hc2sgb2YgcGVuZGluZyBpbnRlcnJ1cHRzICovCisJaW50IGRlYnVnOworI2lmZGVmIERFQlVHCisJaW50IGNoZWNrOworCXUxNiBzYXZlZF9pcDsKKwl1MTYgc2F2ZWRfY3M7CisJaW50IGVuY19wb3M7CisJaW50IGVuY19zdHJfcG9zOworCWNoYXIgZGVjb2RlX2J1ZlszMl07CS8qIGVuY29kZWQgYnl0ZSBzdHJlYW0JKi8KKwljaGFyIGRlY29kZWRfYnVmWzI1Nl07CS8qIGRpc2Fzc2VtYmxlZCBzdHJpbmdzICovCisjZW5kaWYKK30gWDg2RU1VX3JlZ3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorU3RydWN0dXJlIG1haW50YWluaW5nIHRoZSBlbXVsYXRvciBtYWNoaW5lIHN0YXRlLgorCitNRU1CRVJTOgoreDg2CQktIFg4NiByZWdpc3RlcnMKK21lbV9iYXNlCS0gQmFzZSByZWFsIG1vZGUgbWVtb3J5IGZvciB0aGUgZW11bGF0b3IKK21lbV9zaXplCS0gU2l6ZSBvZiB0aGUgcmVhbCBtb2RlIG1lbW9yeSBibG9jayBmb3IgdGhlIGVtdWxhdG9yCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI3VuZGVmIHg4NgordHlwZWRlZiBzdHJ1Y3QgeworCVg4NkVNVV9yZWdzIHg4NjsKKwl1OCAqbWVtX2Jhc2U7CisJdTMyIG1lbV9zaXplOworCXZvaWQgKnByaXZhdGU7Cit9IFg4NkVNVV9zeXNFbnY7CisKKyNwcmFnbWEgcGFjaygpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZglfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CQkJLyogVXNlICJDIiBsaW5rYWdlIHdoZW4gaW4gQysrIG1vZGUgKi8KKyNlbmRpZgorCisvKiBHbG9iYWwgZW11bGF0b3IgbWFjaGluZSBzdGF0ZS4KKyAqCisgKiBXZSBrZWVwIGl0IGdsb2JhbCB0byBhdm9pZCBwb2ludGVyIGRlcmVmZXJlbmNlcyBpbiB0aGUgY29kZSBmb3Igc3BlZWQuCisgKi8KKworCWV4dGVybiBYODZFTVVfc3lzRW52IF9YODZFTVVfZW52OworI2RlZmluZQkgIE0JCV9YODZFTVVfZW52CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnVuY3Rpb24gUHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEZ1bmN0aW9uIHRvIGxvZyBpbmZvcm1hdGlvbiBhdCBydW50aW1lICovCisKKyNpZm5kZWYgX19LRVJORUxfXworCXZvaWQgcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKyNlbmRpZgorCisjaWZkZWYJX19jcGx1c3BsdXMKK30JCQkJLyogRW5kIG9mICJDIiBsaW5rYWdlIGZvciBDKysJICAgICovCisjZW5kaWYKKyNlbmRpZgkJCQkvKiBfX1g4NkVNVV9SRUdTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmlvc19lbXVsYXRvci9pbmNsdWRlL3g4NmVtdS94ODZlbXVpLmggYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvaW5jbHVkZS94ODZlbXUveDg2ZW11aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NDk1N2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IvaW5jbHVkZS94ODZlbXUveDg2ZW11aS5oCkBAIC0wLDAgKzEsMTAxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKKyoKKyogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMjAwNCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCisqICAgICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisqICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCisqICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisqICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubworKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisqCisqICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisqICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisqICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBBbnkKKyogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246ICBIZWFkZXIgZmlsZSBmb3Igc3lzdGVtIHNwZWNpZmljIGZ1bmN0aW9ucy4gVGhlc2UgZnVuY3Rpb25zCisqICAgICAgICAgICAgICAgYXJlIGFsd2F5cyBjb21waWxlZCBhbmQgbGlua2VkIGluIHRoZSBPUyBkZXBlZGVudCBsaWJyYXJpZXMsCisqICAgICAgICAgICAgICAgYW5kIG5ldmVyIGluIGEgYmluYXJ5IHBvcnRhYmxlIGRyaXZlci4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19YODZFTVVfWDg2RU1VSV9ICisjZGVmaW5lIF9fWDg2RU1VX1g4NkVNVUlfSAorCisvKiBJZiB3ZSBhcmUgY29tcGlsaW5nIGluIEMrKyBtb2RlLCB3ZSBjYW4gY29tcGlsZSBzb21lIGZ1bmN0aW9ucyBhcworICogaW5saW5lIHRvIGluY3JlYXNlIHBlcmZvcm1hbmNlIChob3dldmVyIHRoZSBjb2RlIHNpemUgaW5jcmVhc2VzIHF1aXRlCisgKiBkcmFtYXRpY2FsbHkgaW4gdGhpcyBjYXNlKS4KKyAqLworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQoX05PX0lOTElORSkKKyNkZWZpbmUgX0lOTElORSBpbmxpbmUKKyNlbHNlCisjZGVmaW5lIF9JTkxJTkUgc3RhdGljCisjZW5kaWYKKworLyogR2V0IHJpZCBvZiB1bnVzZWQgcGFyYW1ldGVycyBpbiBDKysgY29tcGlsYXRpb24gbW9kZSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgWDg2RU1VX1VOVVNFRCh2KQorI2Vsc2UKKyNkZWZpbmUgWDg2RU1VX1VOVVNFRCh2KSAgICB2CisjZW5kaWYKKworI2luY2x1ZGUgIng4NmVtdS5oIgorI2luY2x1ZGUgIng4NmVtdS9yZWdzLmgiCisjaW5jbHVkZSAieDg2ZW11L2RlYnVnLmgiCisjaW5jbHVkZSAieDg2ZW11L2RlY29kZS5oIgorI2luY2x1ZGUgIng4NmVtdS9vcHMuaCIKKyNpbmNsdWRlICJ4ODZlbXUvcHJpbV9vcHMuaCIKKyNpZm5kZWYgX19LRVJORUxfXworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKworI2RlZmluZSBwcmludGsgcHJpbnRmCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5saW5lIEZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CQkJLyogVXNlICJDIiBsaW5rYWdlIHdoZW4gaW4gQysrIG1vZGUgKi8KKyNlbmRpZgorCisJZXh0ZXJuIHU4KFg4NkFQSVAgc3lzX3JkYikgKHUzMiBhZGRyKTsKKwlleHRlcm4gdTE2KFg4NkFQSVAgc3lzX3JkdykgKHUzMiBhZGRyKTsKKwlleHRlcm4gdTMyKFg4NkFQSVAgc3lzX3JkbCkgKHUzMiBhZGRyKTsKKwlleHRlcm4gdm9pZCAoWDg2QVBJUCBzeXNfd3JiKSAodTMyIGFkZHIsIHU4IHZhbCk7CisJZXh0ZXJuIHZvaWQgKFg4NkFQSVAgc3lzX3dydykgKHUzMiBhZGRyLCB1MTYgdmFsKTsKKwlleHRlcm4gdm9pZCAoWDg2QVBJUCBzeXNfd3JsKSAodTMyIGFkZHIsIHUzMiB2YWwpOworCisJZXh0ZXJuIHU4KFg4NkFQSVAgc3lzX2luYikgKFg4NkVNVV9waW9BZGRyIGFkZHIpOworCWV4dGVybiB1MTYoWDg2QVBJUCBzeXNfaW53KSAoWDg2RU1VX3Bpb0FkZHIgYWRkcik7CisJZXh0ZXJuIHUzMihYODZBUElQIHN5c19pbmwpIChYODZFTVVfcGlvQWRkciBhZGRyKTsKKwlleHRlcm4gdm9pZCAoWDg2QVBJUCBzeXNfb3V0YikgKFg4NkVNVV9waW9BZGRyIGFkZHIsIHU4IHZhbCk7CisJZXh0ZXJuIHZvaWQgKFg4NkFQSVAgc3lzX291dHcpIChYODZFTVVfcGlvQWRkciBhZGRyLCB1MTYgdmFsKTsKKwlleHRlcm4gdm9pZCAoWDg2QVBJUCBzeXNfb3V0bCkgKFg4NkVNVV9waW9BZGRyIGFkZHIsIHUzMiB2YWwpOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CQkJCS8qIEVuZCBvZiAiQyIgbGlua2FnZSBmb3IgQysrICAgICAgICovCisjZW5kaWYKKyNlbmRpZgkJCQkvKiBfX1g4NkVNVV9YODZFTVVJX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmlvc19lbXVsYXRvci94ODZlbXUvZGVidWcuYyBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci94ODZlbXUvZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTU3MzljCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL3g4NmVtdS9kZWJ1Zy5jCkBAIC0wLDAgKzEsNDY1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKKyoKKyogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTEtMjAwNCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCisqICAgICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisqICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCisqICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisqICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgYXV0aG9ycyBtYWtlcyBubworKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisqCisqICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisqICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisqICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6ICAgICBBTlNJIEMKKyogRW52aXJvbm1lbnQ6ICBBbnkKKyogRGV2ZWxvcGVyOiAgICBLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvZGUgdG8gaGFuZGxlIGRlYnVnZ2luZyBvZiB0aGUKKyogICAgICAgICAgICAgICBlbXVsYXRvci4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ4ODZlbXUveDg2ZW11aS5oIgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfQklPU0VNVSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIERFQlVHCisKK3N0YXRpYyB2b2lkIHByaW50X2VuY29kZWRfYnl0ZXModTE2IHMsIHUxNiBvKTsKK3N0YXRpYyB2b2lkIHByaW50X2RlY29kZWRfaW5zdHJ1Y3Rpb24odm9pZCk7CitzdGF0aWMgaW50IHBhcnNlX2xpbmUoY2hhciAqcywgaW50ICpwcywgaW50ICpuKTsKKworLyogc2hvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2UgZGVidWcncyBvdXRwdXQuICovCit2b2lkIFg4NkVNVV90cmFjZV9yZWdzKHZvaWQpCit7CisJaWYgKERFQlVHX1RSQUNFKCkpIHsKKwkJeDg2ZW11X2R1bXBfcmVncygpOworCX0KKwlpZiAoREVCVUdfREVDT0RFKCkgJiYgIURFQlVHX0RFQ09ERV9OT1BSSU5UKCkpIHsKKwkJcHJpbnRrKCIlMDR4OiUwNHggIiwgTS54ODYuc2F2ZWRfY3MsIE0ueDg2LnNhdmVkX2lwKTsKKwkJcHJpbnRfZW5jb2RlZF9ieXRlcyhNLng4Ni5zYXZlZF9jcywgTS54ODYuc2F2ZWRfaXApOworCQlwcmludF9kZWNvZGVkX2luc3RydWN0aW9uKCk7CisJfQorfQorCit2b2lkIFg4NkVNVV90cmFjZV94cmVncyh2b2lkKQoreworCWlmIChERUJVR19UUkFDRSgpKSB7CisJCXg4NmVtdV9kdW1wX3hyZWdzKCk7CisJfQorfQorCit2b2lkIHg4NmVtdV9qdXN0X2Rpc2Fzc2VtYmxlKHZvaWQpCit7CisJLyoKKwkgKiBUaGlzIHJvdXRpbmUgY2FsbGVkIGlmIHRoZSBmbGFnIERFQlVHX0RJU0FTU0VNQkxFIGlzIHNldCBraW5kCisJICogb2YgYSBoYWNrIQorCSAqLworCXByaW50aygiJTA0eDolMDR4ICIsIE0ueDg2LnNhdmVkX2NzLCBNLng4Ni5zYXZlZF9pcCk7CisJcHJpbnRfZW5jb2RlZF9ieXRlcyhNLng4Ni5zYXZlZF9jcywgTS54ODYuc2F2ZWRfaXApOworCXByaW50X2RlY29kZWRfaW5zdHJ1Y3Rpb24oKTsKK30KKworc3RhdGljIHZvaWQgZGlzYXNzZW1ibGVfZm9yd2FyZCh1MTYgc2VnLCB1MTYgb2ZmLCBpbnQgbikKK3sKKwlYODZFTVVfc3lzRW52IHRyZWdzOworCWludCBpOworCXU4IG9wMTsKKwkvKgorCSAqIGhhY2ssIGhhY2ssIGhhY2suICBXaGF0IHdlIGRvIGlzIHVzZSB0aGUgZXhhY3QgbWFjaGluZXJ5IHNldCB1cAorCSAqIGZvciBleGVjdXRpb24sIGV4Y2VwdCB0aGF0IG5vdyB0aGVyZSBpcyBhbiBhZGRpdGlvbmFsIHN0YXRlCisJICogZmxhZyBhc3NvY2lhdGVkIHdpdGggdGhlICJleGVjdXRpb24iLCBhbmQgd2UgYXJlIHVzaW5nIGEgY29weQorCSAqIG9mIHRoZSByZWdpc3RlciBzdHJ1Y3QuICBBbGwgdGhlIG1ham9yIG9wY29kZXMsIG9uY2UgZnVsbHkKKwkgKiBkZWNvZGVkLCBoYXZlIHRoZSBmb2xsb3dpbmcgdHdvIHN0ZXBzOiBUUkFDRV9SRUdTKHIsbSk7CisJICogU0lOR0xFX1NURVAocixtKTsgd2hpY2ggZGlzYXBwZWFyIGlmIERFQlVHIGlzIG5vdCBkZWZpbmVkIHRvCisJICogdGhlIHByZXByb2Nlc3Nvci4gIFRoZSBUUkFDRV9SRUdTIG1hY3JvIGV4cGFuZHMgdG86CisJICoKKwkgKiBpZiAoZGVidWcmREVCVUdfRElTQVNTRU1CTEUpCisJICogICAgIHtqdXN0X2Rpc2Fzc2VtYmxlKCk7IGdvdG8gRW5kT2ZJbnN0cnVjdGlvbjt9CisJICogICAgIGlmIChkZWJ1ZyZERUJVR19UUkFDRSkgdHJhY2VfcmVncyhyLG0pOworCSAqCisJICogLi4uLi4uICBhbmQgYXQgdGhlIGxhc3QgbGluZSBvZiB0aGUgcm91dGluZS4KKwkgKgorCSAqIEVuZE9mSW5zdHJ1Y3Rpb246IGVuZF9pbnN0cigpOworCSAqCisJICogVXAgdG8gdGhlIHBvaW50IHdoZXJlIFRSQUNFX1JFRyBpcyBleHBhbmRlZCwgTk8gbW9kaWZpY2F0aW9ucworCSAqIGFyZSBkb25lIHRvIGFueSByZWdpc3RlciBFWENFUFQgdGhlIElQIHJlZ2lzdGVyLCBmb3IgZmV0Y2ggYW5kCisJICogZGVjb2RpbmcgcHVycG9zZXMuCisJICoKKwkgKiBUaGlzIHdhcyBkb25lIGZvciBhbiBlbnRpcmVseSBkaWZmZXJlbnQgcmVhc29uLCBidXQgbWFrZXMgYQorCSAqIG5pY2Ugd2F5IHRvIGdldCB0aGUgc3lzdGVtIHRvIGhlbHAgZGVidWcgY29kZXMuCisJICovCisJdHJlZ3MgPSBNOworCXRyZWdzLng4Ni5SX0lQID0gb2ZmOworCXRyZWdzLng4Ni5SX0NTID0gc2VnOworCisJLyogcmVzZXQgdGhlIGRlY29kaW5nIGJ1ZmZlcnMgKi8KKwl0cmVncy54ODYuZW5jX3N0cl9wb3MgPSAwOworCXRyZWdzLng4Ni5lbmNfcG9zID0gMDsKKworCS8qIHR1cm4gb24gdGhlICJkaXNhc3NlbWJsZSBvbmx5LCBubyBleGVjdXRlIiBmbGFnICovCisJdHJlZ3MueDg2LmRlYnVnIHw9IERFQlVHX0RJU0FTU0VNQkxFX0Y7CisKKwkvKiBEVU1QIE5FWFQgbiBpbnN0cnVjdGlvbnMgdG8gc2NyZWVuIGluIHN0cmFpZ2h0X2xpbmUgZmFzaGlvbiAqLworCS8qCisJICogVGhpcyBsb29rcyBsaWtlIHRoZSByZWd1bGFyIGluc3RydWN0aW9uIGZldGNoIHN0cmVhbSwgZXhjZXB0CisJICogdGhhdCB3aGVuIHRoaXMgb2NjdXJzLCBlYWNoIGZldGNoZWQgb3Bjb2RlLCB1cG9uIHNlZWluZyB0aGUKKwkgKiBERUJVR19ESVNBU1NFTUJMRSBmbGFnIHNldCwgZXhpdHMgaW1tZWRpYXRlbHkgYWZ0ZXIgZGVjb2RpbmcKKwkgKiB0aGUgaW5zdHJ1Y3Rpb24uICBYWFggLS0tIENIRUNLIFRIQVQgTUVNIElTIE5PVCBBRkZFQ1RFRCEhIQorCSAqIE5vdGUgdGhlIHVzZSBvZiBhIGNvcHkgb2YgdGhlIHJlZ2lzdGVyIHN0cnVjdHVyZS4uLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJb3AxID0gKCpzeXNfcmRiKSAoKCh1MzIpIE0ueDg2LlJfQ1MgPDwgNCkgKyAoTS54ODYuUl9JUCsrKSk7CisJCSh4ODZlbXVfb3B0YWJbb3AxXSkgKG9wMSk7CisJfQorCS8qIGVuZCBtYWpvciBoYWNrIG1vZGUuICovCit9CisKK3ZvaWQgeDg2ZW11X2NoZWNrX2lwX2FjY2Vzcyh2b2lkKQoreworCS8qIE5VTEwgYXMgb2Ygbm93ICovCit9CisKK3ZvaWQgeDg2ZW11X2NoZWNrX3NwX2FjY2Vzcyh2b2lkKQoreworfQorCit2b2lkIHg4NmVtdV9jaGVja19tZW1fYWNjZXNzKHUzMiBkdW1teSkKK3sKKwkvKiAgY2hlY2sgYm91bmRzLCBldGMgKi8KK30KKwordm9pZCB4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3ModWludCBkdW1teTEsIHVpbnQgZHVtbXkyKQoreworCS8qICBjaGVjayBib3VuZHMsIGV0YyAqLworfQorCit2b2lkIHg4NmVtdV9pbmNfZGVjb2RlZF9pbnN0X2xlbihpbnQgeCkKK3sKKwlNLng4Ni5lbmNfcG9zICs9IHg7Cit9CisKK3ZvaWQgeDg2ZW11X2RlY29kZV9wcmludGYoY2hhciAqeCkKK3sKKwlzcHJpbnRmKE0ueDg2LmRlY29kZWRfYnVmICsgTS54ODYuZW5jX3N0cl9wb3MsICIlcyIsIHgpOworCU0ueDg2LmVuY19zdHJfcG9zICs9IHN0cmxlbih4KTsKK30KKwordm9pZCB4ODZlbXVfZGVjb2RlX3ByaW50ZjIoY2hhciAqeCwgaW50IHkpCit7CisJY2hhciB0ZW1wWzEwMF07CisJc3ByaW50Zih0ZW1wLCB4LCB5KTsKKwlzcHJpbnRmKE0ueDg2LmRlY29kZWRfYnVmICsgTS54ODYuZW5jX3N0cl9wb3MsICIlcyIsIHRlbXApOworCU0ueDg2LmVuY19zdHJfcG9zICs9IHN0cmxlbih0ZW1wKTsKK30KKwordm9pZCB4ODZlbXVfZW5kX2luc3RyKHZvaWQpCit7CisJTS54ODYuZW5jX3N0cl9wb3MgPSAwOworCU0ueDg2LmVuY19wb3MgPSAwOworfQorCitzdGF0aWMgdm9pZCBwcmludF9lbmNvZGVkX2J5dGVzKHUxNiBzLCB1MTYgbykKK3sKKwlpbnQgaTsKKwljaGFyIGJ1ZjFbNjRdOworCWZvciAoaSA9IDA7IGkgPCBNLng4Ni5lbmNfcG9zOyBpKyspIHsKKwkJc3ByaW50ZihidWYxICsgMiAqIGksICIlMDJ4IiwgZmV0Y2hfZGF0YV9ieXRlX2FicyhzLCBvICsgaSkpOworCX0KKwlwcmludGsoIiUtMjBzIiwgYnVmMSk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2RlY29kZWRfaW5zdHJ1Y3Rpb24odm9pZCkKK3sKKwlwcmludGsoIiVzIiwgTS54ODYuZGVjb2RlZF9idWYpOworfQorCit2b2lkIHg4NmVtdV9wcmludF9pbnRfdmVjdCh1MTYgaXYpCit7CisJdTE2IHNlZywgb2ZmOworCisJaWYgKGl2ID4gMjU2KQorCQlyZXR1cm47CisJc2VnID0gZmV0Y2hfZGF0YV93b3JkX2FicygwLCBpdiAqIDQpOworCW9mZiA9IGZldGNoX2RhdGFfd29yZF9hYnMoMCwgaXYgKiA0ICsgMik7CisJcHJpbnRrKCIlMDR4OiUwNHggIiwgc2VnLCBvZmYpOworfQorCit2b2lkIFg4NkVNVV9kdW1wX21lbW9yeSh1MTYgc2VnLCB1MTYgb2ZmLCB1MzIgYW10KQoreworCXUzMiBzdGFydCA9IG9mZiAmIDB4ZmZmZmZmZjA7CisJdTMyIGVuZCA9IChvZmYgKyAxNikgJiAweGZmZmZmZmYwOworCXUzMiBpOworCXUzMiBjdXJyZW50OworCisJY3VycmVudCA9IHN0YXJ0OworCXdoaWxlIChlbmQgPD0gb2ZmICsgYW10KSB7CisJCXByaW50aygiJTA0eDolMDR4ICIsIHNlZywgc3RhcnQpOworCQlmb3IgKGkgPSBzdGFydDsgaSA8IG9mZjsgaSsrKQorCQkJcHJpbnRrKCIgICAiKTsKKwkJZm9yICg7IGkgPCBlbmQ7IGkrKykKKwkJCXByaW50aygiJTAyeCAiLCBmZXRjaF9kYXRhX2J5dGVfYWJzKHNlZywgaSkpOworCQlwcmludGsoIlxuIik7CisJCXN0YXJ0ID0gZW5kOworCQllbmQgPSBzdGFydCArIDE2OworCX0KK30KKwordm9pZCB4ODZlbXVfc2luZ2xlX3N0ZXAodm9pZCkKK3sKKwljaGFyIHNbMTAyNF07CisJaW50IHBzWzEwXTsKKwlpbnQgbnRvazsKKwlpbnQgY21kOworCWludCBkb25lOworCWludCBzZWdtZW50OworCWludCBvZmZzZXQ7CisJc3RhdGljIGludCBicmVha3BvaW50OworCXN0YXRpYyBpbnQgbm9EZWNvZGUgPSAxOworCisJY2hhciAqcDsKKworCWlmIChERUJVR19CUkVBSygpKSB7CisJCWlmIChNLng4Ni5zYXZlZF9pcCAhPSBicmVha3BvaW50KSB7CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQlNLng4Ni5kZWJ1ZyAmPSB+REVCVUdfREVDT0RFX05PUFJJTlRfRjsKKwkJCU0ueDg2LmRlYnVnIHw9IERFQlVHX1RSQUNFX0Y7CisJCQlNLng4Ni5kZWJ1ZyAmPSB+REVCVUdfQlJFQUtfRjsKKwkJCXByaW50X2RlY29kZWRfaW5zdHJ1Y3Rpb24oKTsKKwkJCVg4NkVNVV90cmFjZV9yZWdzKCk7CisJCX0KKwl9CisJZG9uZSA9IDA7CisJb2Zmc2V0ID0gTS54ODYuc2F2ZWRfaXA7CisJd2hpbGUgKCFkb25lKSB7CisJCXByaW50aygiLSIpOworCQljbWQgPSBwYXJzZV9saW5lKHMsIHBzLCAmbnRvayk7CisJCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgJ3UnOgorCQkJZGlzYXNzZW1ibGVfZm9yd2FyZChNLng4Ni5zYXZlZF9jcywgKHUxNikgb2Zmc2V0LCAxMCk7CisJCQlicmVhazsKKwkJY2FzZSAnZCc6CisJCQlpZiAobnRvayA9PSAyKSB7CisJCQkJc2VnbWVudCA9IE0ueDg2LnNhdmVkX2NzOworCQkJCW9mZnNldCA9IHBzWzFdOworCQkJCVg4NkVNVV9kdW1wX21lbW9yeShzZWdtZW50LCAodTE2KSBvZmZzZXQsIDE2KTsKKwkJCQlvZmZzZXQgKz0gMTY7CisJCQl9IGVsc2UgaWYgKG50b2sgPT0gMykgeworCQkJCXNlZ21lbnQgPSBwc1sxXTsKKwkJCQlvZmZzZXQgPSBwc1syXTsKKwkJCQlYODZFTVVfZHVtcF9tZW1vcnkoc2VnbWVudCwgKHUxNikgb2Zmc2V0LCAxNik7CisJCQkJb2Zmc2V0ICs9IDE2OworCQkJfSBlbHNlIHsKKwkJCQlzZWdtZW50ID0gTS54ODYuc2F2ZWRfY3M7CisJCQkJWDg2RU1VX2R1bXBfbWVtb3J5KHNlZ21lbnQsICh1MTYpIG9mZnNldCwgMTYpOworCQkJCW9mZnNldCArPSAxNjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdjJzoKKwkJCU0ueDg2LmRlYnVnIF49IERFQlVHX1RSQUNFQ0FMTF9GOworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJTS54ODYuZGVidWcgXj0KKwkJCSAgICBERUJVR19TVkNfRiB8IERFQlVHX1NZU19GIHwgREVCVUdfU1lTSU5UX0Y7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQlYODZFTVVfdHJhY2VfcmVncygpOworCQkJYnJlYWs7CisJCWNhc2UgJ3gnOgorCQkJWDg2RU1VX3RyYWNlX3hyZWdzKCk7CisJCQlicmVhazsKKwkJY2FzZSAnZyc6CisJCQlpZiAobnRvayA9PSAyKSB7CisJCQkJYnJlYWtwb2ludCA9IHBzWzFdOworCQkJCWlmIChub0RlY29kZSkgeworCQkJCQlNLng4Ni5kZWJ1ZyB8PSBERUJVR19ERUNPREVfTk9QUklOVF9GOworCQkJCX0gZWxzZSB7CisJCQkJCU0ueDg2LmRlYnVnICY9IH5ERUJVR19ERUNPREVfTk9QUklOVF9GOworCQkJCX0KKwkJCQlNLng4Ni5kZWJ1ZyAmPSB+REVCVUdfVFJBQ0VfRjsKKwkJCQlNLng4Ni5kZWJ1ZyB8PSBERUJVR19CUkVBS19GOworCQkJCWRvbmUgPSAxOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ3EnOgorCQkJTS54ODYuZGVidWcgfD0gREVCVUdfRVhJVDsKKwkJCXJldHVybjsKKwkJY2FzZSAnUCc6CisJCQlub0RlY29kZSA9IChub0RlY29kZSkgPyAwIDogMTsKKwkJCXByaW50aygiVG9nZ2xlZCBkZWNvZGluZyB0byAlc1xuIiwKKwkJCSAgICAgICAobm9EZWNvZGUpID8gIkZBTFNFIiA6ICJUUlVFIik7CisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCWNhc2UgMDoKKwkJCWRvbmUgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK2ludCBYODZFTVVfdHJhY2Vfb24odm9pZCkKK3sKKwlyZXR1cm4gTS54ODYuZGVidWcgfD0gREVCVUdfU1RFUF9GIHwgREVCVUdfREVDT0RFX0YgfCBERUJVR19UUkFDRV9GOworfQorCitpbnQgWDg2RU1VX3RyYWNlX29mZih2b2lkKQoreworCXJldHVybiBNLng4Ni5kZWJ1ZyAmPSB+KERFQlVHX1NURVBfRiB8IERFQlVHX0RFQ09ERV9GIHwgREVCVUdfVFJBQ0VfRik7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfbGluZShjaGFyICpzLCBpbnQgKnBzLCBpbnQgKm4pCit7CisJaW50IGNtZDsKKworCSpuID0gMDsKKwl3aGlsZSAoKnMgPT0gJyAnIHx8ICpzID09ICdcdCcpCisJCXMrKzsKKwlwc1sqbl0gPSAqczsKKwlzd2l0Y2ggKCpzKSB7CisJY2FzZSAnXG4nOgorCQkqbiArPSAxOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQljbWQgPSAqczsKKwkJKm4gKz0gMTsKKwl9CisKKwl3aGlsZSAoMSkgeworCQl3aGlsZSAoKnMgIT0gJyAnICYmICpzICE9ICdcdCcgJiYgKnMgIT0gJ1xuJykKKwkJCXMrKzsKKworCQlpZiAoKnMgPT0gJ1xuJykKKwkJCXJldHVybiBjbWQ7CisKKwkJd2hpbGUgKCpzID09ICcgJyB8fCAqcyA9PSAnXHQnKQorCQkJcysrOworCisJCSpuICs9IDE7CisJfQorfQorCisjZW5kaWYJCQkJLyogREVCVUcgKi8KKwordm9pZCB4ODZlbXVfZHVtcF9yZWdzKHZvaWQpCit7CisJcHJpbnRrKCJcdEFYPSUwNHggICIsIE0ueDg2LlJfQVgpOworCXByaW50aygiQlg9JTA0eCAgIiwgTS54ODYuUl9CWCk7CisJcHJpbnRrKCJDWD0lMDR4ICAiLCBNLng4Ni5SX0NYKTsKKwlwcmludGsoIkRYPSUwNHggICIsIE0ueDg2LlJfRFgpOworCXByaW50aygiU1A9JTA0eCAgIiwgTS54ODYuUl9TUCk7CisJcHJpbnRrKCJCUD0lMDR4ICAiLCBNLng4Ni5SX0JQKTsKKwlwcmludGsoIlNJPSUwNHggICIsIE0ueDg2LlJfU0kpOworCXByaW50aygiREk9JTA0eFxuIiwgTS54ODYuUl9ESSk7CisJcHJpbnRrKCJcdERTPSUwNHggICIsIE0ueDg2LlJfRFMpOworCXByaW50aygiRVM9JTA0eCAgIiwgTS54ODYuUl9FUyk7CisJcHJpbnRrKCJTUz0lMDR4ICAiLCBNLng4Ni5SX1NTKTsKKwlwcmludGsoIkNTPSUwNHggICIsIE0ueDg2LlJfQ1MpOworCXByaW50aygiSVA9JTA0eCAgICIsIE0ueDg2LlJfSVApOworCWlmIChBQ0NFU1NfRkxBRyhGX09GKSkKKwkJcHJpbnRrKCJPViAiKTsJLyogQ0hFQ0tFRC4uLiAqLworCWVsc2UKKwkJcHJpbnRrKCJOViAiKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpCisJCXByaW50aygiRE4gIik7CisJZWxzZQorCQlwcmludGsoIlVQICIpOworCWlmIChBQ0NFU1NfRkxBRyhGX0lGKSkKKwkJcHJpbnRrKCJFSSAiKTsKKwllbHNlCisJCXByaW50aygiREkgIik7CisJaWYgKEFDQ0VTU19GTEFHKEZfU0YpKQorCQlwcmludGsoIk5HICIpOworCWVsc2UKKwkJcHJpbnRrKCJQTCAiKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9aRikpCisJCXByaW50aygiWlIgIik7CisJZWxzZQorCQlwcmludGsoIk5aICIpOworCWlmIChBQ0NFU1NfRkxBRyhGX0FGKSkKKwkJcHJpbnRrKCJBQyAiKTsKKwllbHNlCisJCXByaW50aygiTkEgIik7CisJaWYgKEFDQ0VTU19GTEFHKEZfUEYpKQorCQlwcmludGsoIlBFICIpOworCWVsc2UKKwkJcHJpbnRrKCJQTyAiKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9DRikpCisJCXByaW50aygiQ1kgIik7CisJZWxzZQorCQlwcmludGsoIk5DICIpOworCXByaW50aygiXG4iKTsKK30KKwordm9pZCB4ODZlbXVfZHVtcF94cmVncyh2b2lkKQoreworCXByaW50aygiXHRFQVg9JTA4eCAgIiwgTS54ODYuUl9FQVgpOworCXByaW50aygiRUJYPSUwOHggICIsIE0ueDg2LlJfRUJYKTsKKwlwcmludGsoIkVDWD0lMDh4ICAiLCBNLng4Ni5SX0VDWCk7CisJcHJpbnRrKCJFRFg9JTA4eCAgXG4iLCBNLng4Ni5SX0VEWCk7CisJcHJpbnRrKCJcdEVTUD0lMDh4ICAiLCBNLng4Ni5SX0VTUCk7CisJcHJpbnRrKCJFQlA9JTA4eCAgIiwgTS54ODYuUl9FQlApOworCXByaW50aygiRVNJPSUwOHggICIsIE0ueDg2LlJfRVNJKTsKKwlwcmludGsoIkVEST0lMDh4XG4iLCBNLng4Ni5SX0VESSk7CisJcHJpbnRrKCJcdERTPSUwNHggICIsIE0ueDg2LlJfRFMpOworCXByaW50aygiRVM9JTA0eCAgIiwgTS54ODYuUl9FUyk7CisJcHJpbnRrKCJTUz0lMDR4ICAiLCBNLng4Ni5SX1NTKTsKKwlwcmludGsoIkNTPSUwNHggICIsIE0ueDg2LlJfQ1MpOworCXByaW50aygiRUlQPSUwOHhcblx0IiwgTS54ODYuUl9FSVApOworCWlmIChBQ0NFU1NfRkxBRyhGX09GKSkKKwkJcHJpbnRrKCJPViAiKTsJLyogQ0hFQ0tFRC4uLiAqLworCWVsc2UKKwkJcHJpbnRrKCJOViAiKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpCisJCXByaW50aygiRE4gIik7CisJZWxzZQorCQlwcmludGsoIlVQICIpOworCWlmIChBQ0NFU1NfRkxBRyhGX0lGKSkKKwkJcHJpbnRrKCJFSSAiKTsKKwllbHNlCisJCXByaW50aygiREkgIik7CisJaWYgKEFDQ0VTU19GTEFHKEZfU0YpKQorCQlwcmludGsoIk5HICIpOworCWVsc2UKKwkJcHJpbnRrKCJQTCAiKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9aRikpCisJCXByaW50aygiWlIgIik7CisJZWxzZQorCQlwcmludGsoIk5aICIpOworCWlmIChBQ0NFU1NfRkxBRyhGX0FGKSkKKwkJcHJpbnRrKCJBQyAiKTsKKwllbHNlCisJCXByaW50aygiTkEgIik7CisJaWYgKEFDQ0VTU19GTEFHKEZfUEYpKQorCQlwcmludGsoIlBFICIpOworCWVsc2UKKwkJcHJpbnRrKCJQTyAiKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9DRikpCisJCXByaW50aygiQ1kgIik7CisJZWxzZQorCQlwcmludGsoIk5DICIpOworCXByaW50aygiXG4iKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jpb3NfZW11bGF0b3IveDg2ZW11L2RlY29kZS5jIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL3g4NmVtdS9kZWNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzlmMGEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL3g4NmVtdS9kZWNvZGUuYwpAQCAtMCwwICsxLDExNDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCQkJUmVhbG1vZGUgWDg2IEVtdWxhdG9yIExpYnJhcnkKKyoKKyoJCUNvcHlyaWdodCAoQykgMTk5MS0yMDA0IFNjaVRlY2ggU29mdHdhcmUsIEluYy4KKyoJCSAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZworKgkJICAgICAgIENvcHlyaWdodCAoQykgMTk5OSBFZ2JlcnQgRWljaAorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorKiAgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLAorKiAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorKiAgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisqICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG5vdCBiZSB1c2VkCisqICBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlCisqICB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCVRoZSBhdXRob3JzIG1ha2VzIG5vCisqICByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLgorKiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyoKKyogIFRIRSBBVVRIT1JTIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorKiAgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTworKiAgRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyogIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKKyogIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorKiAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorKiAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiBMYW5ndWFnZToJQU5TSSBDCisqIEVudmlyb25tZW50OglBbnkKKyogRGV2ZWxvcGVyOglLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246CVRoaXMgZmlsZSBpbmNsdWRlcyBzdWJyb3V0aW5lcyB3aGljaCBhcmUgcmVsYXRlZCB0bworKgkJaW5zdHJ1Y3Rpb24gZGVjb2RpbmcgYW5kIGFjY2Vzc2VzcyBvZiBpbW1lZGlhdGUgZGF0YSB2aWEgSVAuICBldGMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAieDg2ZW11L3g4NmVtdWkuaCIKKworI2lmIGRlZmluZWQoQ09ORklHX0JJT1NFTVUpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBhbnkgcGVuZGluZyBhc3ljaHJvbm91cyBpbnRlcnJ1cHRzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHg4NmVtdV9pbnRyX2hhbmRsZSh2b2lkKQoreworICAgIHU4CWludG5vOworCisgICAgaWYgKE0ueDg2LmludHIgJiBJTlRSX1NZTkNIKSB7CisJaW50bm8gPSBNLng4Ni5pbnRubzsKKwlpZiAoX1g4NkVNVV9pbnRyVGFiW2ludG5vXSkgeworCSAgICAoKl9YODZFTVVfaW50clRhYltpbnRub10pKGludG5vKTsKKwl9IGVsc2UgeworCSAgICBwdXNoX3dvcmQoKHUxNilNLng4Ni5SX0ZMRyk7CisJICAgIENMRUFSX0ZMQUcoRl9JRik7CisJICAgIENMRUFSX0ZMQUcoRl9URik7CisJICAgIHB1c2hfd29yZChNLng4Ni5SX0NTKTsKKwkgICAgTS54ODYuUl9DUyA9IG1lbV9hY2Nlc3Nfd29yZChpbnRubyAqIDQgKyAyKTsKKwkgICAgcHVzaF93b3JkKE0ueDg2LlJfSVApOworCSAgICBNLng4Ni5SX0lQID0gbWVtX2FjY2Vzc193b3JkKGludG5vICogNCk7CisJICAgIE0ueDg2LmludHIgPSAwOworCX0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgoraW50cm51bSAtIEludGVycnVwdCBudW1iZXIgdG8gcmFpc2UKKworUkVNQVJLUzoKK1JhaXNlIHRoZSBzcGVjaWZpZWQgaW50ZXJydXB0IHRvIGJlIGhhbmRsZWQgYmVmb3JlIHRoZSBleGVjdXRpb24gb2YgdGhlCituZXh0IGluc3RydWN0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11X2ludHJfcmFpc2UoCisgICAgdTggaW50cm51bSkKK3sKKyAgICBNLng4Ni5pbnRubyA9IGludHJudW07CisgICAgTS54ODYuaW50ciB8PSBJTlRSX1NZTkNIOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK01haW4gZXhlY3V0aW9uIGxvb3AgZm9yIHRoZSBlbXVsYXRvci4gV2UgcmV0dXJuIGZyb20gaGVyZSB3aGVuIHRoZSBzeXN0ZW0KK2hhbHRzLCB3aGljaCBpcyBub3JtYWxseSBjYXVzZWQgYnkgYSBzdGFjayBmYXVsdCB3aGVuIHdlIHJldHVybiBmcm9tIHRoZQorb3JpZ2luYWwgcmVhbCBtb2RlIGNhbGwuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBYODZFTVVfZXhlYyh2b2lkKQoreworICAgIHU4IG9wMTsKKworICAgIE0ueDg2LmludHIgPSAwOworICAgIERCKHg4NmVtdV9lbmRfaW5zdHIoKTspCisKKyAgICBmb3IgKDs7KSB7CitEQigJaWYgKENIRUNLX0lQX0ZFVENIKCkpCisJICAgIHg4NmVtdV9jaGVja19pcF9hY2Nlc3MoKTspCisJLyogSWYgZGVidWdnaW5nLCBzYXZlIHRoZSBJUCBhbmQgQ1MgdmFsdWVzLiAqLworCVNBVkVfSVBfQ1MoTS54ODYuUl9DUywgTS54ODYuUl9JUCk7CisJSU5DX0RFQ09ERURfSU5TVF9MRU4oMSk7CisJaWYgKE0ueDg2LmludHIpIHsKKwkgICAgaWYgKE0ueDg2LmludHIgJiBJTlRSX0hBTFRFRCkgeworREIoCQlpZiAoTS54ODYuUl9TUCAhPSAwKSB7CisJCSAgICBwcmludGsoImhhbHRlZFxuIik7CisJCSAgICBYODZFTVVfdHJhY2VfcmVncygpOworCQkgICAgfQorCQllbHNlIHsKKwkJICAgIGlmIChNLng4Ni5kZWJ1ZykKKwkJCXByaW50aygiU2VydmljZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XG4iKTsKKwkJICAgIH0pCisJCXJldHVybjsKKwkgICAgfQorCSAgICBpZiAoKChNLng4Ni5pbnRyICYgSU5UUl9TWU5DSCkgJiYgKE0ueDg2LmludG5vID09IDAgfHwgTS54ODYuaW50bm8gPT0gMikpIHx8CisJCSFBQ0NFU1NfRkxBRyhGX0lGKSkgeworCQl4ODZlbXVfaW50cl9oYW5kbGUoKTsKKwkgICAgfQorCX0KKwlvcDEgPSAoKnN5c19yZGIpKCgodTMyKU0ueDg2LlJfQ1MgPDwgNCkgKyAoTS54ODYuUl9JUCsrKSk7CisJKCp4ODZlbXVfb3B0YWJbb3AxXSkob3AxKTsKKwlpZiAoTS54ODYuZGVidWcgJiBERUJVR19FWElUKSB7CisJICAgIE0ueDg2LmRlYnVnICY9IH5ERUJVR19FWElUOworCSAgICByZXR1cm47CisJfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYWx0cyB0aGUgc3lzdGVtIGJ5IHNldHRpbmcgdGhlIGhhbHRlZCBzeXN0ZW0gZmxhZy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFg4NkVNVV9oYWx0X3N5cyh2b2lkKQoreworICAgIE0ueDg2LmludHIgfD0gSU5UUl9IQUxURUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorbW9kCS0gTW9kIHZhbHVlIGZyb20gZGVjb2RlZCBieXRlCityZWdoCS0gUmVnIGggdmFsdWUgZnJvbSBkZWNvZGVkIGJ5dGUKK3JlZ2wJLSBSZWcgbCB2YWx1ZSBmcm9tIGRlY29kZWQgYnl0ZQorCitSRU1BUktTOgorUmFpc2UgdGhlIHNwZWNpZmllZCBpbnRlcnJ1cHQgdG8gYmUgaGFuZGxlZCBiZWZvcmUgdGhlIGV4ZWN1dGlvbiBvZiB0aGUKK25leHQgaW5zdHJ1Y3Rpb24uCisKK05PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiwgYXMgKCpzeXNfcmRiKSBpcyBhbHJlYWR5IGlubGluZSEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGZldGNoX2RlY29kZV9tb2RybSgKKyAgICBpbnQgKm1vZCwKKyAgICBpbnQgKnJlZ2gsCisgICAgaW50ICpyZWdsKQoreworICAgIGludCBmZXRjaGVkOworCitEQiggaWYgKENIRUNLX0lQX0ZFVENIKCkpCisJeDg2ZW11X2NoZWNrX2lwX2FjY2VzcygpOykKKyAgICBmZXRjaGVkID0gKCpzeXNfcmRiKSgoKHUzMilNLng4Ni5SX0NTIDw8IDQpICsgKE0ueDg2LlJfSVArKykpOworICAgIElOQ19ERUNPREVEX0lOU1RfTEVOKDEpOworICAgICptb2QgID0gKGZldGNoZWQgPj4gNikgJiAweDAzOworICAgICpyZWdoID0gKGZldGNoZWQgPj4gMykgJiAweDA3OworICAgICpyZWdsID0gKGZldGNoZWQgPj4gMCkgJiAweDA3OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVUVVJOUzoKK0ltbWVkaWF0ZSBieXRlIHZhbHVlIHJlYWQgZnJvbSBpbnN0cnVjdGlvbiBxdWV1ZQorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBpbW1lZGlhdGUgYnl0ZSBmcm9tIHRoZSBpbnN0cnVjdGlvbiBxdWV1ZSwgYW5kCittb3ZlcyB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciB0byB0aGUgbmV4dCB2YWx1ZS4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uLCBhcyAoKnN5c19yZGIpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IGZldGNoX2J5dGVfaW1tKHZvaWQpCit7CisgICAgdTggZmV0Y2hlZDsKKworREIoIGlmIChDSEVDS19JUF9GRVRDSCgpKQorCXg4NmVtdV9jaGVja19pcF9hY2Nlc3MoKTspCisgICAgZmV0Y2hlZCA9ICgqc3lzX3JkYikoKCh1MzIpTS54ODYuUl9DUyA8PCA0KSArIChNLng4Ni5SX0lQKyspKTsKKyAgICBJTkNfREVDT0RFRF9JTlNUX0xFTigxKTsKKyAgICByZXR1cm4gZmV0Y2hlZDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFVFVSTlM6CitJbW1lZGlhdGUgd29yZCB2YWx1ZSByZWFkIGZyb20gaW5zdHJ1Y3Rpb24gcXVldWUKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgaW1tZWRpYXRlIGJ5dGUgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gcXVldWUsIGFuZAorbW92ZXMgdGhlIGluc3RydWN0aW9uIHBvaW50ZXIgdG8gdGhlIG5leHQgdmFsdWUuCisKK05PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiwgYXMgKCpzeXNfcmR3KSBpcyBhbHJlYWR5IGlubGluZSEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgZmV0Y2hfd29yZF9pbW0odm9pZCkKK3sKKyAgICB1MTYgZmV0Y2hlZDsKKworREIoIGlmIChDSEVDS19JUF9GRVRDSCgpKQorCXg4NmVtdV9jaGVja19pcF9hY2Nlc3MoKTspCisgICAgZmV0Y2hlZCA9ICgqc3lzX3JkdykoKCh1MzIpTS54ODYuUl9DUyA8PCA0KSArIChNLng4Ni5SX0lQKSk7CisgICAgTS54ODYuUl9JUCArPSAyOworICAgIElOQ19ERUNPREVEX0lOU1RfTEVOKDIpOworICAgIHJldHVybiBmZXRjaGVkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVUVVJOUzoKK0ltbWVkaWF0ZSBsb25lIHZhbHVlIHJlYWQgZnJvbSBpbnN0cnVjdGlvbiBxdWV1ZQorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBpbW1lZGlhdGUgYnl0ZSBmcm9tIHRoZSBpbnN0cnVjdGlvbiBxdWV1ZSwgYW5kCittb3ZlcyB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciB0byB0aGUgbmV4dCB2YWx1ZS4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uLCBhcyAoKnN5c19yZHcpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBmZXRjaF9sb25nX2ltbSh2b2lkKQoreworICAgIHUzMiBmZXRjaGVkOworCitEQiggaWYgKENIRUNLX0lQX0ZFVENIKCkpCisJeDg2ZW11X2NoZWNrX2lwX2FjY2VzcygpOykKKyAgICBmZXRjaGVkID0gKCpzeXNfcmRsKSgoKHUzMilNLng4Ni5SX0NTIDw8IDQpICsgKE0ueDg2LlJfSVApKTsKKyAgICBNLng4Ni5SX0lQICs9IDQ7CisgICAgSU5DX0RFQ09ERURfSU5TVF9MRU4oNCk7CisgICAgcmV0dXJuIGZldGNoZWQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRVRVUk5TOgorVmFsdWUgb2YgdGhlIGRlZmF1bHQgZGF0YSBzZWdtZW50CisKK1JFTUFSS1M6CitJbmxpbmUgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBkZWZhdWx0IGRhdGEgc2VnbWVudCBmb3IgdGhlIGN1cnJlbnQKK2luc3RydWN0aW9uLgorCitPbiB0aGUgeDg2IHByb2Nlc3NvciwgdGhlIGRlZmF1bHQgc2VnbWVudCBpcyBub3QgYWx3YXlzIERTIGlmIHRoZXJlIGlzCitubyBzZWdtZW50IG92ZXJyaWRlLiBBZGRyZXNzIG1vZGVzIHN1Y2ggYXMgLTNbQlBdIG9yIDEwW0JQK1NJXSBhbGwgcmVmZXIgdG8KK2FkZHJlc3NlcyByZWxhdGl2ZSB0byBTUyAoaWU6IG9uIHRoZSBzdGFjaykuIFNvLCBhdCB0aGUgbWluaW11bSwgYWxsCitkZWNvZGluZ3Mgb2YgYWRkcmVzc2luZyBtb2RlcyB3b3VsZCBoYXZlIHRvIHNldC9jbGVhciBhIGJpdCBkZXNjcmliaW5nCit3aGV0aGVyIHRoZSBhY2Nlc3MgaXMgcmVsYXRpdmUgdG8gRFMgb3IgU1MuICBUaGF0IGlzIHRoZSBmdW5jdGlvbiBvZiB0aGUKK2NwdS1zdGF0ZS12YXJpYmxlIE0ueDg2Lm1vZGUuIFRoZXJlIGFyZSBzZXZlcmFsIHBvdGVudGlhbCBzdGF0ZXM6CisKKyAgICByZXBlIHByZWZpeCBzZWVuICAoaGFuZGxlZCBlbHNld2hlcmUpCisgICAgcmVwbmUgcHJlZml4IHNlZW4gIChkaXR0bykKKworICAgIGNzIHNlZ21lbnQgb3ZlcnJpZGUKKyAgICBkcyBzZWdtZW50IG92ZXJyaWRlCisgICAgZXMgc2VnbWVudCBvdmVycmlkZQorICAgIGZzIHNlZ21lbnQgb3ZlcnJpZGUKKyAgICBncyBzZWdtZW50IG92ZXJyaWRlCisgICAgc3Mgc2VnbWVudCBvdmVycmlkZQorCisgICAgZHMvc3Mgc2VsZWN0IChpbiBhYnNlbnNlIG9mIG92ZXJyaWRlKQorCitFYWNoIG9mIHRoZSBhYm92ZSA3IGl0ZW1zIGFyZSBoYW5kbGVkIHdpdGggYSBiaXQgaW4gdGhlIG1vZGUgZmllbGQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworX0lOTElORSB1MzIgZ2V0X2RhdGFfc2VnbWVudCh2b2lkKQoreworI2RlZmluZSBHRVRfU0VHTUVOVChzZWdtZW50KQorICAgIHN3aXRjaCAoTS54ODYubW9kZSAmIFNZU01PREVfU0VHTUFTSykgeworICAgICAgY2FzZSAwOgkJCS8qIGRlZmF1bHQgY2FzZTogdXNlIGRzIHJlZ2lzdGVyICovCisgICAgICBjYXNlIFNZU01PREVfU0VHT1ZSX0RTOgorICAgICAgY2FzZSBTWVNNT0RFX1NFR09WUl9EUyB8IFNZU01PREVfU0VHX0RTX1NTOgorCXJldHVybglNLng4Ni5SX0RTOworICAgICAgY2FzZSBTWVNNT0RFX1NFR19EU19TUzoJLyogbm9uLW92ZXJyaWRkZW4sIHVzZSBzcyByZWdpc3RlciAqLworCXJldHVybglNLng4Ni5SX1NTOworICAgICAgY2FzZSBTWVNNT0RFX1NFR09WUl9DUzoKKyAgICAgIGNhc2UgU1lTTU9ERV9TRUdPVlJfQ1MgfCBTWVNNT0RFX1NFR19EU19TUzoKKwlyZXR1cm4JTS54ODYuUl9DUzsKKyAgICAgIGNhc2UgU1lTTU9ERV9TRUdPVlJfRVM6CisgICAgICBjYXNlIFNZU01PREVfU0VHT1ZSX0VTIHwgU1lTTU9ERV9TRUdfRFNfU1M6CisJcmV0dXJuCU0ueDg2LlJfRVM7CisgICAgICBjYXNlIFNZU01PREVfU0VHT1ZSX0ZTOgorICAgICAgY2FzZSBTWVNNT0RFX1NFR09WUl9GUyB8IFNZU01PREVfU0VHX0RTX1NTOgorCXJldHVybglNLng4Ni5SX0ZTOworICAgICAgY2FzZSBTWVNNT0RFX1NFR09WUl9HUzoKKyAgICAgIGNhc2UgU1lTTU9ERV9TRUdPVlJfR1MgfCBTWVNNT0RFX1NFR19EU19TUzoKKwlyZXR1cm4JTS54ODYuUl9HUzsKKyAgICAgIGNhc2UgU1lTTU9ERV9TRUdPVlJfU1M6CisgICAgICBjYXNlIFNZU01PREVfU0VHT1ZSX1NTIHwgU1lTTU9ERV9TRUdfRFNfU1M6CisJcmV0dXJuCU0ueDg2LlJfU1M7CisgICAgICBkZWZhdWx0OgorI2lmZGVmCURFQlVHCisJcHJpbnRrKCJlcnJvcjogc2hvdWxkIG5vdCBoYXBwZW46ICBtdWx0aXBsZSBvdmVycmlkZXMuXG4iKTsKKyNlbmRpZgorCUhBTFRfU1lTKCk7CisJcmV0dXJuIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK29mZnNldAktIE9mZnNldCB0byBsb2FkIGRhdGEgZnJvbQorCitSRVRVUk5TOgorQnl0ZSB2YWx1ZSByZWFkIGZyb20gdGhlIGFic29sdXRlIG1lbW9yeSBsb2NhdGlvbi4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3JkWCkgaXMgYWxyZWFkeSBpbmxpbmUhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggZmV0Y2hfZGF0YV9ieXRlKAorICAgIHVpbnQgb2Zmc2V0KQoreworI2lmZGVmIERFQlVHCisgICAgaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCisJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKCh1MTYpZ2V0X2RhdGFfc2VnbWVudCgpLCBvZmZzZXQpOworI2VuZGlmCisgICAgcmV0dXJuICgqc3lzX3JkYikoKGdldF9kYXRhX3NlZ21lbnQoKSA8PCA0KSArIG9mZnNldCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorb2Zmc2V0CS0gT2Zmc2V0IHRvIGxvYWQgZGF0YSBmcm9tCisKK1JFVFVSTlM6CitXb3JkIHZhbHVlIHJlYWQgZnJvbSB0aGUgYWJzb2x1dGUgbWVtb3J5IGxvY2F0aW9uLgorCitOT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfcmRYKSBpcyBhbHJlYWR5IGlubGluZSEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgZmV0Y2hfZGF0YV93b3JkKAorICAgIHVpbnQgb2Zmc2V0KQoreworI2lmZGVmIERFQlVHCisgICAgaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCisJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKCh1MTYpZ2V0X2RhdGFfc2VnbWVudCgpLCBvZmZzZXQpOworI2VuZGlmCisgICAgcmV0dXJuICgqc3lzX3JkdykoKGdldF9kYXRhX3NlZ21lbnQoKSA8PCA0KSArIG9mZnNldCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorb2Zmc2V0CS0gT2Zmc2V0IHRvIGxvYWQgZGF0YSBmcm9tCisKK1JFVFVSTlM6CitMb25nIHZhbHVlIHJlYWQgZnJvbSB0aGUgYWJzb2x1dGUgbWVtb3J5IGxvY2F0aW9uLgorCitOT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfcmRYKSBpcyBhbHJlYWR5IGlubGluZSEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZmV0Y2hfZGF0YV9sb25nKAorICAgIHVpbnQgb2Zmc2V0KQoreworI2lmZGVmIERFQlVHCisgICAgaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCisJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKCh1MTYpZ2V0X2RhdGFfc2VnbWVudCgpLCBvZmZzZXQpOworI2VuZGlmCisgICAgcmV0dXJuICgqc3lzX3JkbCkoKGdldF9kYXRhX3NlZ21lbnQoKSA8PCA0KSArIG9mZnNldCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorc2VnbWVudCAtIFNlZ21lbnQgdG8gbG9hZCBkYXRhIGZyb20KK29mZnNldAktIE9mZnNldCB0byBsb2FkIGRhdGEgZnJvbQorCitSRVRVUk5TOgorQnl0ZSB2YWx1ZSByZWFkIGZyb20gdGhlIGFic29sdXRlIG1lbW9yeSBsb2NhdGlvbi4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3JkWCkgaXMgYWxyZWFkeSBpbmxpbmUhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggZmV0Y2hfZGF0YV9ieXRlX2FicygKKyAgICB1aW50IHNlZ21lbnQsCisgICAgdWludCBvZmZzZXQpCit7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoQ0hFQ0tfREFUQV9BQ0NFU1MoKSkKKwl4ODZlbXVfY2hlY2tfZGF0YV9hY2Nlc3Moc2VnbWVudCwgb2Zmc2V0KTsKKyNlbmRpZgorICAgIHJldHVybiAoKnN5c19yZGIpKCgodTMyKXNlZ21lbnQgPDwgNCkgKyBvZmZzZXQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3NlZ21lbnQgLSBTZWdtZW50IHRvIGxvYWQgZGF0YSBmcm9tCitvZmZzZXQJLSBPZmZzZXQgdG8gbG9hZCBkYXRhIGZyb20KKworUkVUVVJOUzoKK1dvcmQgdmFsdWUgcmVhZCBmcm9tIHRoZSBhYnNvbHV0ZSBtZW1vcnkgbG9jYXRpb24uCisKK05PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiBhcyAoKnN5c19yZFgpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBmZXRjaF9kYXRhX3dvcmRfYWJzKAorICAgIHVpbnQgc2VnbWVudCwKKyAgICB1aW50IG9mZnNldCkKK3sKKyNpZmRlZiBERUJVRworICAgIGlmIChDSEVDS19EQVRBX0FDQ0VTUygpKQorCXg4NmVtdV9jaGVja19kYXRhX2FjY2VzcyhzZWdtZW50LCBvZmZzZXQpOworI2VuZGlmCisgICAgcmV0dXJuICgqc3lzX3JkdykoKCh1MzIpc2VnbWVudCA8PCA0KSArIG9mZnNldCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorc2VnbWVudCAtIFNlZ21lbnQgdG8gbG9hZCBkYXRhIGZyb20KK29mZnNldAktIE9mZnNldCB0byBsb2FkIGRhdGEgZnJvbQorCitSRVRVUk5TOgorTG9uZyB2YWx1ZSByZWFkIGZyb20gdGhlIGFic29sdXRlIG1lbW9yeSBsb2NhdGlvbi4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3JkWCkgaXMgYWxyZWFkeSBpbmxpbmUhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGZldGNoX2RhdGFfbG9uZ19hYnMoCisgICAgdWludCBzZWdtZW50LAorICAgIHVpbnQgb2Zmc2V0KQoreworI2lmZGVmIERFQlVHCisgICAgaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCisJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKHNlZ21lbnQsIG9mZnNldCk7CisjZW5kaWYKKyAgICByZXR1cm4gKCpzeXNfcmRsKSgoKHUzMilzZWdtZW50IDw8IDQpICsgb2Zmc2V0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitvZmZzZXQJLSBPZmZzZXQgdG8gc3RvcmUgZGF0YSBhdAordmFsCS0gVmFsdWUgdG8gc3RvcmUKKworUkVNQVJLUzoKK1dyaXRlcyBhIHdvcmQgdmFsdWUgdG8gYW4gc2VnbWVudGVkIG1lbW9yeSBsb2NhdGlvbi4gVGhlIHNlZ21lbnQgdXNlZCBpcwordGhlIGN1cnJlbnQgJ2RlZmF1bHQnIHNlZ21lbnQsIHdoaWNoIG1heSBoYXZlIGJlZW4gb3ZlcnJpZGRlbi4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3dyWCkgaXMgYWxyZWFkeSBpbmxpbmUhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzdG9yZV9kYXRhX2J5dGUoCisgICAgdWludCBvZmZzZXQsCisgICAgdTggdmFsKQoreworI2lmZGVmIERFQlVHCisgICAgaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCisJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKCh1MTYpZ2V0X2RhdGFfc2VnbWVudCgpLCBvZmZzZXQpOworI2VuZGlmCisgICAgKCpzeXNfd3JiKSgoZ2V0X2RhdGFfc2VnbWVudCgpIDw8IDQpICsgb2Zmc2V0LCB2YWwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK29mZnNldAktIE9mZnNldCB0byBzdG9yZSBkYXRhIGF0Cit2YWwJLSBWYWx1ZSB0byBzdG9yZQorCitSRU1BUktTOgorV3JpdGVzIGEgd29yZCB2YWx1ZSB0byBhbiBzZWdtZW50ZWQgbWVtb3J5IGxvY2F0aW9uLiBUaGUgc2VnbWVudCB1c2VkIGlzCit0aGUgY3VycmVudCAnZGVmYXVsdCcgc2VnbWVudCwgd2hpY2ggbWF5IGhhdmUgYmVlbiBvdmVycmlkZGVuLgorCitOT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfd3JYKSBpcyBhbHJlYWR5IGlubGluZSEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHN0b3JlX2RhdGFfd29yZCgKKyAgICB1aW50IG9mZnNldCwKKyAgICB1MTYgdmFsKQoreworI2lmZGVmIERFQlVHCisgICAgaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCisJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKCh1MTYpZ2V0X2RhdGFfc2VnbWVudCgpLCBvZmZzZXQpOworI2VuZGlmCisgICAgKCpzeXNfd3J3KSgoZ2V0X2RhdGFfc2VnbWVudCgpIDw8IDQpICsgb2Zmc2V0LCB2YWwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK29mZnNldAktIE9mZnNldCB0byBzdG9yZSBkYXRhIGF0Cit2YWwJLSBWYWx1ZSB0byBzdG9yZQorCitSRU1BUktTOgorV3JpdGVzIGEgbG9uZyB2YWx1ZSB0byBhbiBzZWdtZW50ZWQgbWVtb3J5IGxvY2F0aW9uLiBUaGUgc2VnbWVudCB1c2VkIGlzCit0aGUgY3VycmVudCAnZGVmYXVsdCcgc2VnbWVudCwgd2hpY2ggbWF5IGhhdmUgYmVlbiBvdmVycmlkZGVuLgorCitOT1RFOiBEbyBub3QgaW5saW5lIHRoaXMgZnVuY3Rpb24gYXMgKCpzeXNfd3JYKSBpcyBhbHJlYWR5IGlubGluZSEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHN0b3JlX2RhdGFfbG9uZygKKyAgICB1aW50IG9mZnNldCwKKyAgICB1MzIgdmFsKQoreworI2lmZGVmIERFQlVHCisgICAgaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCisJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKCh1MTYpZ2V0X2RhdGFfc2VnbWVudCgpLCBvZmZzZXQpOworI2VuZGlmCisgICAgKCpzeXNfd3JsKSgoZ2V0X2RhdGFfc2VnbWVudCgpIDw8IDQpICsgb2Zmc2V0LCB2YWwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3NlZ21lbnQgLSBTZWdtZW50IHRvIHN0b3JlIGRhdGEgYXQKK29mZnNldAktIE9mZnNldCB0byBzdG9yZSBkYXRhIGF0Cit2YWwJLSBWYWx1ZSB0byBzdG9yZQorCitSRU1BUktTOgorV3JpdGVzIGEgYnl0ZSB2YWx1ZSB0byBhbiBhYnNvbHV0ZSBtZW1vcnkgbG9jYXRpb24uCisKK05PVEU6IERvIG5vdCBpbmxpbmUgdGhpcyBmdW5jdGlvbiBhcyAoKnN5c193clgpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc3RvcmVfZGF0YV9ieXRlX2FicygKKyAgICB1aW50IHNlZ21lbnQsCisgICAgdWludCBvZmZzZXQsCisgICAgdTggdmFsKQoreworI2lmZGVmIERFQlVHCisgICAgaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCisJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKHNlZ21lbnQsIG9mZnNldCk7CisjZW5kaWYKKyAgICAoKnN5c193cmIpKCgodTMyKXNlZ21lbnQgPDwgNCkgKyBvZmZzZXQsIHZhbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorc2VnbWVudCAtIFNlZ21lbnQgdG8gc3RvcmUgZGF0YSBhdAorb2Zmc2V0CS0gT2Zmc2V0IHRvIHN0b3JlIGRhdGEgYXQKK3ZhbAktIFZhbHVlIHRvIHN0b3JlCisKK1JFTUFSS1M6CitXcml0ZXMgYSB3b3JkIHZhbHVlIHRvIGFuIGFic29sdXRlIG1lbW9yeSBsb2NhdGlvbi4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3dyWCkgaXMgYWxyZWFkeSBpbmxpbmUhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzdG9yZV9kYXRhX3dvcmRfYWJzKAorICAgIHVpbnQgc2VnbWVudCwKKyAgICB1aW50IG9mZnNldCwKKyAgICB1MTYgdmFsKQoreworI2lmZGVmIERFQlVHCisgICAgaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCisJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKHNlZ21lbnQsIG9mZnNldCk7CisjZW5kaWYKKyAgICAoKnN5c193cncpKCgodTMyKXNlZ21lbnQgPDwgNCkgKyBvZmZzZXQsIHZhbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorc2VnbWVudCAtIFNlZ21lbnQgdG8gc3RvcmUgZGF0YSBhdAorb2Zmc2V0CS0gT2Zmc2V0IHRvIHN0b3JlIGRhdGEgYXQKK3ZhbAktIFZhbHVlIHRvIHN0b3JlCisKK1JFTUFSS1M6CitXcml0ZXMgYSBsb25nIHZhbHVlIHRvIGFuIGFic29sdXRlIG1lbW9yeSBsb2NhdGlvbi4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzIGZ1bmN0aW9uIGFzICgqc3lzX3dyWCkgaXMgYWxyZWFkeSBpbmxpbmUhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzdG9yZV9kYXRhX2xvbmdfYWJzKAorICAgIHVpbnQgc2VnbWVudCwKKyAgICB1aW50IG9mZnNldCwKKyAgICB1MzIgdmFsKQoreworI2lmZGVmIERFQlVHCisgICAgaWYgKENIRUNLX0RBVEFfQUNDRVNTKCkpCisJeDg2ZW11X2NoZWNrX2RhdGFfYWNjZXNzKHNlZ21lbnQsIG9mZnNldCk7CisjZW5kaWYKKyAgICAoKnN5c193cmwpKCgodTMyKXNlZ21lbnQgPDwgNCkgKyBvZmZzZXQsIHZhbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcmVnIC0gUmVnaXN0ZXIgdG8gZGVjb2RlCisKK1JFVFVSTlM6CitQb2ludGVyIHRvIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlcgorCitSRU1BUktTOgorUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgcmVnaXN0ZXIgZ2l2ZW4gYnkgdGhlIFIvUk0gZmllbGQgb2YgdGhlCittb2RybSBieXRlLCBmb3IgYnl0ZSBvcGVyYW5kcy4gQWxzbyBlbmFibGVzIHRoZSBkZWNvZGluZyBvZiBpbnN0cnVjdGlvbnMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTgqIGRlY29kZV9ybV9ieXRlX3JlZ2lzdGVyKAorICAgIGludCByZWcpCit7CisgICAgc3dpdGNoIChyZWcpIHsKKyAgICAgIGNhc2UgMDoKKwlERUNPREVfUFJJTlRGKCJBTCIpOworCXJldHVybiAmTS54ODYuUl9BTDsKKyAgICAgIGNhc2UgMToKKwlERUNPREVfUFJJTlRGKCJDTCIpOworCXJldHVybiAmTS54ODYuUl9DTDsKKyAgICAgIGNhc2UgMjoKKwlERUNPREVfUFJJTlRGKCJETCIpOworCXJldHVybiAmTS54ODYuUl9ETDsKKyAgICAgIGNhc2UgMzoKKwlERUNPREVfUFJJTlRGKCJCTCIpOworCXJldHVybiAmTS54ODYuUl9CTDsKKyAgICAgIGNhc2UgNDoKKwlERUNPREVfUFJJTlRGKCJBSCIpOworCXJldHVybiAmTS54ODYuUl9BSDsKKyAgICAgIGNhc2UgNToKKwlERUNPREVfUFJJTlRGKCJDSCIpOworCXJldHVybiAmTS54ODYuUl9DSDsKKyAgICAgIGNhc2UgNjoKKwlERUNPREVfUFJJTlRGKCJESCIpOworCXJldHVybiAmTS54ODYuUl9ESDsKKyAgICAgIGNhc2UgNzoKKwlERUNPREVfUFJJTlRGKCJCSCIpOworCXJldHVybiAmTS54ODYuUl9CSDsKKyAgICB9CisgICAgSEFMVF9TWVMoKTsKKyAgICByZXR1cm4gTlVMTDsJCS8qIE5PVCBSRUFDSEVEIE9SIFJFQUNIRUQgT04gRVJST1IgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CityZWcgLSBSZWdpc3RlciB0byBkZWNvZGUKKworUkVUVVJOUzoKK1BvaW50ZXIgdG8gdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyCisKK1JFTUFSS1M6CitSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSByZWdpc3RlciBnaXZlbiBieSB0aGUgUi9STSBmaWVsZCBvZiB0aGUKK21vZHJtIGJ5dGUsIGZvciB3b3JkIG9wZXJhbmRzLglBbHNvIGVuYWJsZXMgdGhlIGRlY29kaW5nIG9mIGluc3RydWN0aW9ucy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYqIGRlY29kZV9ybV93b3JkX3JlZ2lzdGVyKAorICAgIGludCByZWcpCit7CisgICAgc3dpdGNoIChyZWcpIHsKKyAgICAgIGNhc2UgMDoKKwlERUNPREVfUFJJTlRGKCJBWCIpOworCXJldHVybiAmTS54ODYuUl9BWDsKKyAgICAgIGNhc2UgMToKKwlERUNPREVfUFJJTlRGKCJDWCIpOworCXJldHVybiAmTS54ODYuUl9DWDsKKyAgICAgIGNhc2UgMjoKKwlERUNPREVfUFJJTlRGKCJEWCIpOworCXJldHVybiAmTS54ODYuUl9EWDsKKyAgICAgIGNhc2UgMzoKKwlERUNPREVfUFJJTlRGKCJCWCIpOworCXJldHVybiAmTS54ODYuUl9CWDsKKyAgICAgIGNhc2UgNDoKKwlERUNPREVfUFJJTlRGKCJTUCIpOworCXJldHVybiAmTS54ODYuUl9TUDsKKyAgICAgIGNhc2UgNToKKwlERUNPREVfUFJJTlRGKCJCUCIpOworCXJldHVybiAmTS54ODYuUl9CUDsKKyAgICAgIGNhc2UgNjoKKwlERUNPREVfUFJJTlRGKCJTSSIpOworCXJldHVybiAmTS54ODYuUl9TSTsKKyAgICAgIGNhc2UgNzoKKwlERUNPREVfUFJJTlRGKCJESSIpOworCXJldHVybiAmTS54ODYuUl9ESTsKKyAgICB9CisgICAgSEFMVF9TWVMoKTsKKyAgICByZXR1cm4gTlVMTDsJCS8qIE5PVFJFQUNIRUQgT1IgUkVBQ0hFRCBPTiBFUlJPUiAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3JlZyAtIFJlZ2lzdGVyIHRvIGRlY29kZQorCitSRVRVUk5TOgorUG9pbnRlciB0byB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIKKworUkVNQVJLUzoKK1JldHVybiBhIHBvaW50ZXIgdG8gdGhlIHJlZ2lzdGVyIGdpdmVuIGJ5IHRoZSBSL1JNIGZpZWxkIG9mIHRoZQorbW9kcm0gYnl0ZSwgZm9yIGR3b3JkIG9wZXJhbmRzLgkgQWxzbyBlbmFibGVzIHRoZSBkZWNvZGluZyBvZiBpbnN0cnVjdGlvbnMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyKiBkZWNvZGVfcm1fbG9uZ19yZWdpc3RlcigKKyAgICBpbnQgcmVnKQoreworICAgIHN3aXRjaCAocmVnKSB7CisgICAgICBjYXNlIDA6CisJREVDT0RFX1BSSU5URigiRUFYIik7CisJcmV0dXJuICZNLng4Ni5SX0VBWDsKKyAgICAgIGNhc2UgMToKKwlERUNPREVfUFJJTlRGKCJFQ1giKTsKKwlyZXR1cm4gJk0ueDg2LlJfRUNYOworICAgICAgY2FzZSAyOgorCURFQ09ERV9QUklOVEYoIkVEWCIpOworCXJldHVybiAmTS54ODYuUl9FRFg7CisgICAgICBjYXNlIDM6CisJREVDT0RFX1BSSU5URigiRUJYIik7CisJcmV0dXJuICZNLng4Ni5SX0VCWDsKKyAgICAgIGNhc2UgNDoKKwlERUNPREVfUFJJTlRGKCJFU1AiKTsKKwlyZXR1cm4gJk0ueDg2LlJfRVNQOworICAgICAgY2FzZSA1OgorCURFQ09ERV9QUklOVEYoIkVCUCIpOworCXJldHVybiAmTS54ODYuUl9FQlA7CisgICAgICBjYXNlIDY6CisJREVDT0RFX1BSSU5URigiRVNJIik7CisJcmV0dXJuICZNLng4Ni5SX0VTSTsKKyAgICAgIGNhc2UgNzoKKwlERUNPREVfUFJJTlRGKCJFREkiKTsKKwlyZXR1cm4gJk0ueDg2LlJfRURJOworICAgIH0KKyAgICBIQUxUX1NZUygpOworICAgIHJldHVybiBOVUxMOwkJLyogTk9UUkVBQ0hFRCBPUiBSRUFDSEVEIE9OIEVSUk9SICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcmVnIC0gUmVnaXN0ZXIgdG8gZGVjb2RlCisKK1JFVFVSTlM6CitQb2ludGVyIHRvIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlcgorCitSRU1BUktTOgorUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgcmVnaXN0ZXIgZ2l2ZW4gYnkgdGhlIFIvUk0gZmllbGQgb2YgdGhlCittb2RybSBieXRlLCBmb3Igd29yZCBvcGVyYW5kcywgbW9kaWZpZWQgZnJvbSBhYm92ZSBmb3IgdGhlIHdlaXJkbworc3BlY2lhbCBjYXNlIG9mIHNlZ3JlZyBvcGVyYW5kcy4gIEFsc28gZW5hYmxlcyB0aGUgZGVjb2Rpbmcgb2YgaW5zdHJ1Y3Rpb25zLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiogZGVjb2RlX3JtX3NlZ19yZWdpc3RlcigKKyAgICBpbnQgcmVnKQoreworICAgIHN3aXRjaCAocmVnKSB7CisgICAgICBjYXNlIDA6CisJREVDT0RFX1BSSU5URigiRVMiKTsKKwlyZXR1cm4gJk0ueDg2LlJfRVM7CisgICAgICBjYXNlIDE6CisJREVDT0RFX1BSSU5URigiQ1MiKTsKKwlyZXR1cm4gJk0ueDg2LlJfQ1M7CisgICAgICBjYXNlIDI6CisJREVDT0RFX1BSSU5URigiU1MiKTsKKwlyZXR1cm4gJk0ueDg2LlJfU1M7CisgICAgICBjYXNlIDM6CisJREVDT0RFX1BSSU5URigiRFMiKTsKKwlyZXR1cm4gJk0ueDg2LlJfRFM7CisgICAgICBjYXNlIDQ6CisJREVDT0RFX1BSSU5URigiRlMiKTsKKwlyZXR1cm4gJk0ueDg2LlJfRlM7CisgICAgICBjYXNlIDU6CisJREVDT0RFX1BSSU5URigiR1MiKTsKKwlyZXR1cm4gJk0ueDg2LlJfR1M7CisgICAgICBjYXNlIDY6CisgICAgICBjYXNlIDc6CisJREVDT0RFX1BSSU5URigiSUxMRUdBTCBTRUdSRUciKTsKKwlicmVhazsKKyAgICB9CisgICAgSEFMVF9TWVMoKTsKKyAgICByZXR1cm4gTlVMTDsJCS8qIE5PVCBSRUFDSEVEIE9SIFJFQUNIRUQgT04gRVJST1IgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitzY2FsZSAtIHNjYWxlIHZhbHVlIG9mIFNJQiBieXRlCitpbmRleCAtIGluZGV4IHZhbHVlIG9mIFNJQiBieXRlCisKK1JFVFVSTlM6CitWYWx1ZSBvZiBzY2FsZSAqIGluZGV4CisKK1JFTUFSS1M6CitEZWNvZGVzIHNjYWxlL2luZGV4IG9mIFNJQiBieXRlIGFuZCByZXR1cm5zIHJlbGV2YW50IG9mZnNldCBwYXJ0IG9mCitlZmZlY3RpdmUgYWRkcmVzcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bnNpZ25lZCBkZWNvZGVfc2liX3NpKAorICAgIGludCBzY2FsZSwKKyAgICBpbnQgaW5kZXgpCit7CisgICAgc2NhbGUgPSAxIDw8IHNjYWxlOworICAgIGlmIChzY2FsZSA+IDEpIHsKKwlERUNPREVfUFJJTlRGMigiWyVkKiIsIHNjYWxlKTsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYoIlsiKTsKKyAgICB9CisgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgY2FzZSAwOgorCURFQ09ERV9QUklOVEYoIkVBWF0iKTsKKwlyZXR1cm4gTS54ODYuUl9FQVggKiBpbmRleDsKKyAgICAgIGNhc2UgMToKKwlERUNPREVfUFJJTlRGKCJFQ1hdIik7CisJcmV0dXJuIE0ueDg2LlJfRUNYICogaW5kZXg7CisgICAgICBjYXNlIDI6CisJREVDT0RFX1BSSU5URigiRURYXSIpOworCXJldHVybiBNLng4Ni5SX0VEWCAqIGluZGV4OworICAgICAgY2FzZSAzOgorCURFQ09ERV9QUklOVEYoIkVCWF0iKTsKKwlyZXR1cm4gTS54ODYuUl9FQlggKiBpbmRleDsKKyAgICAgIGNhc2UgNDoKKwlERUNPREVfUFJJTlRGKCIwXSIpOworCXJldHVybiAwOworICAgICAgY2FzZSA1OgorCURFQ09ERV9QUklOVEYoIkVCUF0iKTsKKwlyZXR1cm4gTS54ODYuUl9FQlAgKiBpbmRleDsKKyAgICAgIGNhc2UgNjoKKwlERUNPREVfUFJJTlRGKCJFU0ldIik7CisJcmV0dXJuIE0ueDg2LlJfRVNJICogaW5kZXg7CisgICAgICBjYXNlIDc6CisJREVDT0RFX1BSSU5URigiRURJXSIpOworCXJldHVybiBNLng4Ni5SX0VESSAqIGluZGV4OworICAgIH0KKyAgICBIQUxUX1NZUygpOworICAgIHJldHVybiAwOwkJCS8qIE5PVCBSRUFDSEVEIE9SIFJFQUNIRUQgT04gRVJST1IgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6Cittb2QgLSBNT0QgdmFsdWUgb2YgcHJlY2VkaW5nIE1vZFIvTSBieXRlCisKK1JFVFVSTlM6CitPZmZzZXQgaW4gbWVtb3J5IGZvciB0aGUgYWRkcmVzcyBkZWNvZGluZworCitSRU1BUktTOgorRGVjb2RlcyBTSUIgYWRkcmVzc2luZyBieXRlIGFuZCByZXR1cm5zIGNhbGN1bGF0ZWQgZWZmZWN0aXZlIGFkZHJlc3MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordW5zaWduZWQgZGVjb2RlX3NpYl9hZGRyZXNzKAorICAgIGludCBtb2QpCit7CisgICAgaW50IHNpYiAgID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBpbnQgc3MgICAgPSAoc2liID4+IDYpICYgMHgwMzsKKyAgICBpbnQgaW5kZXggPSAoc2liID4+IDMpICYgMHgwNzsKKyAgICBpbnQgYmFzZSAgPSBzaWIgJiAweDA3OworICAgIGludCBvZmZzZXQgPSAwOworICAgIGludCBkaXNwbGFjZW1lbnQ7CisKKyAgICBzd2l0Y2ggKGJhc2UpIHsKKyAgICAgIGNhc2UgMDoKKwlERUNPREVfUFJJTlRGKCJbRUFYXSIpOworCW9mZnNldCA9IE0ueDg2LlJfRUFYOworCWJyZWFrOworICAgICAgY2FzZSAxOgorCURFQ09ERV9QUklOVEYoIltFQ1hdIik7CisJb2Zmc2V0ID0gTS54ODYuUl9FQ1g7CisJYnJlYWs7CisgICAgICBjYXNlIDI6CisJREVDT0RFX1BSSU5URigiW0VEWF0iKTsKKwlvZmZzZXQgPSBNLng4Ni5SX0VEWDsKKwlicmVhazsKKyAgICAgIGNhc2UgMzoKKwlERUNPREVfUFJJTlRGKCJbRUJYXSIpOworCW9mZnNldCA9IE0ueDg2LlJfRUJYOworCWJyZWFrOworICAgICAgY2FzZSA0OgorCURFQ09ERV9QUklOVEYoIltFU1BdIik7CisJb2Zmc2V0ID0gTS54ODYuUl9FU1A7CisJYnJlYWs7CisgICAgICBjYXNlIDU6CisJc3dpdGNoIChtb2QpIHsKKwkgIGNhc2UgMDoKKwkgICAgZGlzcGxhY2VtZW50ID0gKHMzMilmZXRjaF9sb25nX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiWyVkXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIG9mZnNldCA9IGRpc3BsYWNlbWVudDsKKwkgICAgYnJlYWs7CisJICBjYXNlIDE6CisJICAgIGRpc3BsYWNlbWVudCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiWyVkXVtFQlBdIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgb2Zmc2V0ID0gTS54ODYuUl9FQlAgKyBkaXNwbGFjZW1lbnQ7CisJICAgIGJyZWFrOworCSAgY2FzZSAyOgorCSAgICBkaXNwbGFjZW1lbnQgPSAoczMyKWZldGNoX2xvbmdfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCJbJWRdW0VCUF0iLCBkaXNwbGFjZW1lbnQpOworCSAgICBvZmZzZXQgPSBNLng4Ni5SX0VCUCArIGRpc3BsYWNlbWVudDsKKwkgICAgYnJlYWs7CisJICBkZWZhdWx0OgorCSAgICBIQUxUX1NZUygpOworCX0KKwlERUNPREVfUFJJTlRGKCJbRUFYXSIpOworCW9mZnNldCA9IE0ueDg2LlJfRUFYOworCWJyZWFrOworICAgICAgY2FzZSA2OgorCURFQ09ERV9QUklOVEYoIltFU0ldIik7CisJb2Zmc2V0ID0gTS54ODYuUl9FU0k7CisJYnJlYWs7CisgICAgICBjYXNlIDc6CisJREVDT0RFX1BSSU5URigiW0VESV0iKTsKKwlvZmZzZXQgPSBNLng4Ni5SX0VESTsKKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJSEFMVF9TWVMoKTsKKyAgICB9CisgICAgb2Zmc2V0ICs9IGRlY29kZV9zaWJfc2koc3MsIGluZGV4KTsKKyAgICByZXR1cm4gb2Zmc2V0OworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorcm0gIC0gUk0gdmFsdWUgdG8gZGVjb2RlCisKK1JFVFVSTlM6CitPZmZzZXQgaW4gbWVtb3J5IGZvciB0aGUgYWRkcmVzcyBkZWNvZGluZworCitSRU1BUktTOgorUmV0dXJuIHRoZSBvZmZzZXQgZ2l2ZW4gYnkgbW9kPTAwIGFkZHJlc3NpbmcuICBBbHNvIGVuYWJsZXMgdGhlCitkZWNvZGluZyBvZiBpbnN0cnVjdGlvbnMuCisKK05PVEU6CVRoZSBjb2RlIHdoaWNoIHNwZWNpZmllcyB0aGUgY29ycmVzcG9uZGluZyBzZWdtZW50IChkcyB2cyBzcykKKwliZWxvdyBpbiB0aGUgY2FzZSBvZiBbQlArLi5dLiAgVGhlIGFzc3VtcHRpb24gaGVyZSBpcyB0aGF0IGF0IHRoZQorCXBvaW50IHRoYXQgdGhpcyBzdWJyb3V0aW5lIGlzIGNhbGxlZCwgdGhlIGJpdCBjb3JyZXNwb25kaW5nIHRvCisJU1lTTU9ERV9TRUdfRFNfU1Mgd2lsbCBiZSB6ZXJvLgkgQWZ0ZXIgZXZlcnkgaW5zdHJ1Y3Rpb24KKwlleGNlcHQgdGhlIHNlZ21lbnQgb3ZlcnJpZGUgaW5zdHJ1Y3Rpb25zLCB0aGlzIGJpdCAoYXMgd2VsbAorCWFzIGFueSBiaXRzIGluZGljYXRpbmcgc2VnbWVudCBvdmVycmlkZXMpIHdpbGwgYmUgY2xlYXIuICBTbworCWlmIGEgU1MgYWNjZXNzIGlzIG5lZWRlZCwgc2V0IHRoaXMgYml0LgkgT3RoZXJ3aXNlLCBEUyBhY2Nlc3MKKwlvY2N1cnMgKHVubGVzcyBhbnkgb2YgdGhlIHNlZ21lbnQgb3ZlcnJpZGUgYml0cyBhcmUgc2V0KS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bnNpZ25lZCBkZWNvZGVfcm0wMF9hZGRyZXNzKAorICAgIGludCBybSkKK3sKKyAgICB1bnNpZ25lZCBvZmZzZXQ7CisKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0FERFIpIHsKKwkvKiAzMi1iaXQgYWRkcmVzc2luZyAqLworCXN3aXRjaCAocm0pIHsKKwkgIGNhc2UgMDoKKwkgICAgREVDT0RFX1BSSU5URigiW0VBWF0iKTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfRUFYOworCSAgY2FzZSAxOgorCSAgICBERUNPREVfUFJJTlRGKCJbRUNYXSIpOworCSAgICByZXR1cm4gTS54ODYuUl9FQ1g7CisJICBjYXNlIDI6CisJICAgIERFQ09ERV9QUklOVEYoIltFRFhdIik7CisJICAgIHJldHVybiBNLng4Ni5SX0VEWDsKKwkgIGNhc2UgMzoKKwkgICAgREVDT0RFX1BSSU5URigiW0VCWF0iKTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfRUJYOworCSAgY2FzZSA0OgorCSAgICByZXR1cm4gZGVjb2RlX3NpYl9hZGRyZXNzKDApOworCSAgY2FzZSA1OgorCSAgICBvZmZzZXQgPSBmZXRjaF9sb25nX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiWyUwOHhdIiwgb2Zmc2V0KTsKKwkgICAgcmV0dXJuIG9mZnNldDsKKwkgIGNhc2UgNjoKKwkgICAgREVDT0RFX1BSSU5URigiW0VTSV0iKTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfRVNJOworCSAgY2FzZSA3OgorCSAgICBERUNPREVfUFJJTlRGKCJbRURJXSIpOworCSAgICByZXR1cm4gTS54ODYuUl9FREk7CisJfQorICAgIH0gZWxzZSB7CisJLyogMTYtYml0IGFkZHJlc3NpbmcgKi8KKwlzd2l0Y2ggKHJtKSB7CisJICBjYXNlIDA6CisJICAgIERFQ09ERV9QUklOVEYoIltCWCtTSV0iKTsKKwkgICAgcmV0dXJuIChNLng4Ni5SX0JYICsgTS54ODYuUl9TSSkgJiAweGZmZmY7CisJICBjYXNlIDE6CisJICAgIERFQ09ERV9QUklOVEYoIltCWCtESV0iKTsKKwkgICAgcmV0dXJuIChNLng4Ni5SX0JYICsgTS54ODYuUl9ESSkgJiAweGZmZmY7CisJICBjYXNlIDI6CisJICAgIERFQ09ERV9QUklOVEYoIltCUCtTSV0iKTsKKwkgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR19EU19TUzsKKwkgICAgcmV0dXJuIChNLng4Ni5SX0JQICsgTS54ODYuUl9TSSkgJiAweGZmZmY7CisJICBjYXNlIDM6CisJICAgIERFQ09ERV9QUklOVEYoIltCUCtESV0iKTsKKwkgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR19EU19TUzsKKwkgICAgcmV0dXJuIChNLng4Ni5SX0JQICsgTS54ODYuUl9ESSkgJiAweGZmZmY7CisJICBjYXNlIDQ6CisJICAgIERFQ09ERV9QUklOVEYoIltTSV0iKTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfU0k7CisJICBjYXNlIDU6CisJICAgIERFQ09ERV9QUklOVEYoIltESV0iKTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfREk7CisJICBjYXNlIDY6CisJICAgIG9mZnNldCA9IGZldGNoX3dvcmRfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCJbJTA0eF0iLCBvZmZzZXQpOworCSAgICByZXR1cm4gb2Zmc2V0OworCSAgY2FzZSA3OgorCSAgICBERUNPREVfUFJJTlRGKCJbQlhdIik7CisJICAgIHJldHVybiBNLng4Ni5SX0JYOworCX0KKyAgICB9CisgICAgSEFMVF9TWVMoKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitybSAgLSBSTSB2YWx1ZSB0byBkZWNvZGUKKworUkVUVVJOUzoKK09mZnNldCBpbiBtZW1vcnkgZm9yIHRoZSBhZGRyZXNzIGRlY29kaW5nCisKK1JFTUFSS1M6CitSZXR1cm4gdGhlIG9mZnNldCBnaXZlbiBieSBtb2Q9MDEgYWRkcmVzc2luZy4gIEFsc28gZW5hYmxlcyB0aGUKK2RlY29kaW5nIG9mIGluc3RydWN0aW9ucy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bnNpZ25lZCBkZWNvZGVfcm0wMV9hZGRyZXNzKAorICAgIGludCBybSkKK3sKKyAgICBpbnQgZGlzcGxhY2VtZW50OworCisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9BRERSKSB7CisJLyogMzItYml0IGFkZHJlc3NpbmcgKi8KKwlpZiAocm0gIT0gNCkKKwkgICAgZGlzcGxhY2VtZW50ID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7CisJZWxzZQorCSAgICBkaXNwbGFjZW1lbnQgPSAwOworCisJc3dpdGNoIChybSkgeworCSAgY2FzZSAwOgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbRUFYXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiBNLng4Ni5SX0VBWCArIGRpc3BsYWNlbWVudDsKKwkgIGNhc2UgMToKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VDWF0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gTS54ODYuUl9FQ1ggKyBkaXNwbGFjZW1lbnQ7CisJICBjYXNlIDI6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtFRFhdIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfRURYICsgZGlzcGxhY2VtZW50OworCSAgY2FzZSAzOgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbRUJYXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiBNLng4Ni5SX0VCWCArIGRpc3BsYWNlbWVudDsKKwkgIGNhc2UgNDogeworCSAgICBpbnQgb2Zmc2V0ID0gZGVjb2RlX3NpYl9hZGRyZXNzKDEpOworCSAgICBkaXNwbGFjZW1lbnQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIlslZF0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gb2Zmc2V0ICsgZGlzcGxhY2VtZW50OworCSAgfQorCSAgY2FzZSA1OgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbRUJQXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiBNLng4Ni5SX0VCUCArIGRpc3BsYWNlbWVudDsKKwkgIGNhc2UgNjoKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VTSV0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gTS54ODYuUl9FU0kgKyBkaXNwbGFjZW1lbnQ7CisJICBjYXNlIDc6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtFREldIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfRURJICsgZGlzcGxhY2VtZW50OworCX0KKyAgICB9IGVsc2UgeworCS8qIDE2LWJpdCBhZGRyZXNzaW5nICovCisJZGlzcGxhY2VtZW50ID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7CisJc3dpdGNoIChybSkgeworCSAgY2FzZSAwOgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbQlgrU0ldIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIChNLng4Ni5SX0JYICsgTS54ODYuUl9TSSArIGRpc3BsYWNlbWVudCkgJiAweGZmZmY7CisJICBjYXNlIDE6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtCWCtESV0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gKE0ueDg2LlJfQlggKyBNLng4Ni5SX0RJICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKKwkgIGNhc2UgMjoKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0JQK1NJXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdfRFNfU1M7CisJICAgIHJldHVybiAoTS54ODYuUl9CUCArIE0ueDg2LlJfU0kgKyBkaXNwbGFjZW1lbnQpICYgMHhmZmZmOworCSAgY2FzZSAzOgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbQlArREldIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR19EU19TUzsKKwkgICAgcmV0dXJuIChNLng4Ni5SX0JQICsgTS54ODYuUl9ESSArIGRpc3BsYWNlbWVudCkgJiAweGZmZmY7CisJICBjYXNlIDQ6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtTSV0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gKE0ueDg2LlJfU0kgKyBkaXNwbGFjZW1lbnQpICYgMHhmZmZmOworCSAgY2FzZSA1OgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbREldIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIChNLng4Ni5SX0RJICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKKwkgIGNhc2UgNjoKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0JQXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdfRFNfU1M7CisJICAgIHJldHVybiAoTS54ODYuUl9CUCArIGRpc3BsYWNlbWVudCkgJiAweGZmZmY7CisJICBjYXNlIDc6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtCWF0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gKE0ueDg2LlJfQlggKyBkaXNwbGFjZW1lbnQpICYgMHhmZmZmOworCX0KKyAgICB9CisgICAgSEFMVF9TWVMoKTsKKyAgICByZXR1cm4gMDsJCQkvKiBTSE9VTEQgTk9UIEhBUFBFTiAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK3JtICAtIFJNIHZhbHVlIHRvIGRlY29kZQorCitSRVRVUk5TOgorT2Zmc2V0IGluIG1lbW9yeSBmb3IgdGhlIGFkZHJlc3MgZGVjb2RpbmcKKworUkVNQVJLUzoKK1JldHVybiB0aGUgb2Zmc2V0IGdpdmVuIGJ5IG1vZD0xMCBhZGRyZXNzaW5nLiAgQWxzbyBlbmFibGVzIHRoZQorZGVjb2Rpbmcgb2YgaW5zdHJ1Y3Rpb25zLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGRlY29kZV9ybTEwX2FkZHJlc3MoCisgICAgaW50IHJtKQoreworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfQUREUikgeworCWludCBkaXNwbGFjZW1lbnQ7CisKKwkvKiAzMi1iaXQgYWRkcmVzc2luZyAqLworCWlmIChybSAhPSA0KQorCSAgICBkaXNwbGFjZW1lbnQgPSAoczMyKWZldGNoX2xvbmdfaW1tKCk7CisJZWxzZQorCSAgICBkaXNwbGFjZW1lbnQgPSAwOworCisJc3dpdGNoIChybSkgeworCSAgY2FzZSAwOgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbRUFYXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiBNLng4Ni5SX0VBWCArIGRpc3BsYWNlbWVudDsKKwkgIGNhc2UgMToKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VDWF0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gTS54ODYuUl9FQ1ggKyBkaXNwbGFjZW1lbnQ7CisJICBjYXNlIDI6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtFRFhdIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfRURYICsgZGlzcGxhY2VtZW50OworCSAgY2FzZSAzOgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbRUJYXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiBNLng4Ni5SX0VCWCArIGRpc3BsYWNlbWVudDsKKwkgIGNhc2UgNDogeworCSAgICBpbnQgb2Zmc2V0ID0gZGVjb2RlX3NpYl9hZGRyZXNzKDIpOworCSAgICBkaXNwbGFjZW1lbnQgPSAoczMyKWZldGNoX2xvbmdfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCJbJWRdIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIG9mZnNldCArIGRpc3BsYWNlbWVudDsKKwkgIH0KKwkgIGNhc2UgNToKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0VCUF0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gTS54ODYuUl9FQlAgKyBkaXNwbGFjZW1lbnQ7CisJICBjYXNlIDY6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtFU0ldIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgcmV0dXJuIE0ueDg2LlJfRVNJICsgZGlzcGxhY2VtZW50OworCSAgY2FzZSA3OgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbRURJXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiBNLng4Ni5SX0VESSArIGRpc3BsYWNlbWVudDsKKwl9CisgICAgfSBlbHNlIHsKKwlpbnQgZGlzcGxhY2VtZW50ID0gKHMxNilmZXRjaF93b3JkX2ltbSgpOworCisJLyogMTYtYml0IGFkZHJlc3NpbmcgKi8KKwlzd2l0Y2ggKHJtKSB7CisJICBjYXNlIDA6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtCWCtTSV0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gKE0ueDg2LlJfQlggKyBNLng4Ni5SX1NJICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKKwkgIGNhc2UgMToKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0JYK0RJXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiAoTS54ODYuUl9CWCArIE0ueDg2LlJfREkgKyBkaXNwbGFjZW1lbnQpICYgMHhmZmZmOworCSAgY2FzZSAyOgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbQlArU0ldIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR19EU19TUzsKKwkgICAgcmV0dXJuIChNLng4Ni5SX0JQICsgTS54ODYuUl9TSSArIGRpc3BsYWNlbWVudCkgJiAweGZmZmY7CisJICBjYXNlIDM6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtCUCtESV0iLCBkaXNwbGFjZW1lbnQpOworCSAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHX0RTX1NTOworCSAgICByZXR1cm4gKE0ueDg2LlJfQlAgKyBNLng4Ni5SX0RJICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKKwkgIGNhc2UgNDoKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW1NJXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiAoTS54ODYuUl9TSSArIGRpc3BsYWNlbWVudCkgJiAweGZmZmY7CisJICBjYXNlIDU6CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFtESV0iLCBkaXNwbGFjZW1lbnQpOworCSAgICByZXR1cm4gKE0ueDg2LlJfREkgKyBkaXNwbGFjZW1lbnQpICYgMHhmZmZmOworCSAgY2FzZSA2OgorCSAgICBERUNPREVfUFJJTlRGMigiJWRbQlBdIiwgZGlzcGxhY2VtZW50KTsKKwkgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR19EU19TUzsKKwkgICAgcmV0dXJuIChNLng4Ni5SX0JQICsgZGlzcGxhY2VtZW50KSAmIDB4ZmZmZjsKKwkgIGNhc2UgNzoKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkW0JYXSIsIGRpc3BsYWNlbWVudCk7CisJICAgIHJldHVybiAoTS54ODYuUl9CWCArIGRpc3BsYWNlbWVudCkgJiAweGZmZmY7CisJfQorICAgIH0KKyAgICBIQUxUX1NZUygpOworICAgIHJldHVybiAwOwkJCS8qIFNIT1VMRCBOT1QgSEFQUEVOICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorbW9kIC0gbW9kaWZpZXIKK3JtICAtIFJNIHZhbHVlIHRvIGRlY29kZQorCitSRVRVUk5TOgorT2Zmc2V0IGluIG1lbW9yeSBmb3IgdGhlIGFkZHJlc3MgZGVjb2RpbmcsIG11bHRpcGxleGluZyBjYWxscyB0bwordGhlIGRlY29kZV9ybVhYX2FkZHJlc3MgZnVuY3Rpb25zCisKK1JFTUFSS1M6CitSZXR1cm4gdGhlIG9mZnNldCBnaXZlbiBieSAibW9kIiBhZGRyZXNzaW5nLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordW5zaWduZWQgZGVjb2RlX3JtWFhfYWRkcmVzcyhpbnQgbW9kLCBpbnQgcm0pCit7CisgIGlmKG1vZCA9PSAwKQorICAgIHJldHVybiBkZWNvZGVfcm0wMF9hZGRyZXNzKHJtKTsKKyAgaWYobW9kID09IDEpCisgICAgcmV0dXJuIGRlY29kZV9ybTAxX2FkZHJlc3Mocm0pOworICByZXR1cm4gZGVjb2RlX3JtMTBfYWRkcmVzcyhybSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iaW9zX2VtdWxhdG9yL3g4NmVtdS9vcHMuYyBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci94ODZlbXUvb3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMzNGZiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci94ODZlbXUvb3BzLmMKQEAgLTAsMCArMSw1NDM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqICBDb3B5cmlnaHQgKEMpIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyogIEphc29uIEppbiA8SmFzb24uamluQGZyZWVzY2FsZS5jb20+CisqCisqCQlDb3B5cmlnaHQgKEMpIDE5OTEtMjAwNCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCQkJCSAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZworKgkJCQkJICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisqICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisqICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisqICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKKyogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4JVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOgkJQU5TSSBDCisqIEVudmlyb25tZW50OglBbnkKKyogRGV2ZWxvcGVyOglLZW5kYWxsIEJlbm5ldHQKKyoKKyogRGVzY3JpcHRpb246CVRoaXMgZmlsZSBpbmNsdWRlcyBzdWJyb3V0aW5lcyB0byBpbXBsZW1lbnQgdGhlIGRlY29kaW5nCisqCQlhbmQgZW11bGF0aW9uIG9mIGFsbCB0aGUgeDg2IHByb2Nlc3NvciBpbnN0cnVjdGlvbnMuCisqCisqIFRoZXJlIGFyZSBhcHByb3hpbWF0ZWx5IDI1MCBzdWJyb3V0aW5lcyBpbiBoZXJlLCB3aGljaCBjb3JyZXNwb25kCisqIHRvIHRoZSAyNTYgYnl0ZS0ib3Bjb2RlcyIgZm91bmQgb24gdGhlIDgwODYuCVRoZSB0YWJsZSB3aGljaAorKiBkaXNwYXRjaGVzIHRoaXMgaXMgZm91bmQgaW4gdGhlIGZpbGVzIG9wdGFiLltjaF0uCisqCisqIEVhY2ggb3Bjb2RlIHByb2MgaGFzIGEgY29tbWVudCBwcmVjZWVkaW5nIGl0IHdoaWNoIGdpdmVzIGl0J3MgdGFibGUKKyogYWRkcmVzcy4gIFNldmVyYWwgb3Bjb2RlcyBhcmUgbWlzc2luZyAodW5kZWZpbmVkKSBpbiB0aGUgdGFibGUuCisqCisqIEVhY2ggcHJvYyBpbmNsdWRlcyBpbmZvcm1hdGlvbiBmb3IgZGVjb2RpbmcgKERFQ09ERV9QUklOVEYgYW5kCisqIERFQ09ERV9QUklOVEYyKSwgZGVidWdnaW5nIChUUkFDRV9SRUdTLCBTSU5HTEVfU1RFUCksIGFuZCBtaXNjCisqIGZ1bmN0aW9ucyAoU1RBUlRfT0ZfSU5TVFIsIEVORF9PRl9JTlNUUikuCisqCisqIE1hbnkgb2YgdGhlIHByb2NlZHVyZXMgYXJlICpWRVJZKiBzaW1pbGFyIGluIGNvZGluZy4JVGhpcyBoYXMKKyogYWxsb3dlZCBmb3IgYSB2ZXJ5IGxhcmdlIGFtb3VudCBvZiBjb2RlIHRvIGJlIGdlbmVyYXRlZCBpbiBhIGZhaXJseQorKiBzaG9ydCBhbW91bnQgb2YgdGltZSAoaS5lLiBjdXQsIHBhc3RlLCBhbmQgbW9kaWZ5KS4gIFRoZSByZXN1bHQgaXMKKyogdGhhdCBtdWNoIG9mIHRoZSBjb2RlIGJlbG93IGNvdWxkIGhhdmUgYmVlbiBmb2xkZWQgaW50byBzdWJyb3V0aW5lcworKiBmb3IgYSBsYXJnZSByZWR1Y3Rpb24gaW4gc2l6ZSBvZiB0aGlzIGZpbGUuICBUaGUgZG93bnNpZGUgd291bGQgYmUKKyogdGhhdCB0aGVyZSB3b3VsZCBiZSBhIHBlbmFsdHkgaW4gZXhlY3V0aW9uIHNwZWVkLiAgVGhlIGZpbGUgY291bGQKKyogYWxzbyBoYXZlIGJlZW4gKk1VQ0gqIGxhcmdlciBieSBpbmxpbmluZyBjZXJ0YWluIGZ1bmN0aW9ucyB3aGljaAorKiB3ZXJlIGNhbGxlZC4JVGhpcyBjb3VsZCBoYXZlIHJlc3VsdGVkIGV2ZW4gZmFzdGVyIGV4ZWN1dGlvbi4JIFRoZQorKiBwcmltZSBkaXJlY3RpdmUgSSB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGlubGluZSB0aGUgY29kZSBvciB0bworKiBtb2R1bGFyaXplIGl0LCB3YXMgYmFzaWNhbGx5OiAxKSBubyB1bm5lY2Vzc2FyeSBzdWJyb3V0aW5lIGNhbGxzLAorKiAyKSBubyByb3V0aW5lcyBtb3JlIHRoYW4gYWJvdXQgMjAwIGxpbmVzIGluIHNpemUsIGFuZCAzKSBtb2R1bGFyaXplCisqIGFueSBjb2RlIHRoYXQgSSBtaWdodCBub3QgZ2V0IHJpZ2h0IHRoZSBmaXJzdCB0aW1lLiAgVGhlIGZldGNoXyoKKyogc3Vicm91dGluZXMgZmFsbCBpbnRvIHRoZSBsYXR0ZXIgY2F0ZWdvcnkuICBUaGUgVGhlIGRlY29kZV8qIGZhbGwKKyogaW50byB0aGUgc2Vjb25kIGNhdGVnb3J5LiAgVGhlIGNvZGluZyBvZiB0aGUgInN3aXRjaChtb2QpeyAuLi4uIH0iCisqIGluIG1hbnkgb2YgdGhlIHN1YnJvdXRpbmVzIGJlbG93IGZhbGxzIGludG8gdGhlIGZpcnN0IGNhdGVnb3J5LgorKiBFc3BlY2lhbGx5LCB0aGUgY29kaW5nIG9mIHthZGQsYW5kLG9yLHN1YiwuLi59X3tieXRlLHdvcmR9CisqIHN1YnJvdXRpbmVzIGFyZSBhbiBlc3BlY2lhbGx5IGdsYXJpbmcgY2FzZSBvZiB0aGUgdGhpcmQgZ3VpZGVsaW5lLgorKiBTaW5jZSBzbyBtdWNoIG9mIHRoZSBjb2RlIGlzIGNsb25lZCBmcm9tIG90aGVyIG1vZHVsZXMgKGNvbXBhcmUKKyogb3Bjb2RlICMwMCB0byBvcGNvZGUgIzAxKSwgbWFraW5nIHRoZSBiYXNpYyBvcGVyYXRpb25zIHN1YnJvdXRpbmUKKyogY2FsbHMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQ7IG90aGVyd2lzZSBtaXN0YWtlcyBpbiBjb2RpbmcgYW4KKyogImFkZCIgd291bGQgcmVwcmVzZW50IGEgbmlnaHRtYXJlIGluIG1haW50ZW5hbmNlLgorKgorKiBKYXNvbiBwb3J0ZWQgdGhpcyBmaWxlIHRvIHUtYm9vdC4gcGxhY2UgYWxsIHRoZSBmdW5jdGlvbiBwb2ludGVyIGluCisqIHRoZSBnb3QyIHNlY3Rvci4gUmVtb3ZlZCBzb21lIG9wY29kZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ4ODZlbXUveDg2ZW11aS5oIgorCisjaWYgZGVmaW5lZChDT05GSUdfQklPU0VNVSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogY29uc3RhbnQgYXJyYXlzIHRvIGRvIHNldmVyYWwgaW5zdHJ1Y3Rpb25zIGluIGp1c3Qgb25lIGZ1bmN0aW9uICovCisKKyNpZmRlZiBERUJVRworc3RhdGljIGNoYXIgKng4NmVtdV9HZW5PcE5hbWVbOF0gPSB7CisgICAgIkFERCIsICJPUiIsICJBREMiLCAiU0JCIiwgIkFORCIsICJTVUIiLCAiWE9SIiwgIkNNUCJ9OworI2VuZGlmCisKKy8qIHVzZWQgYnkgc2V2ZXJhbCBvcGNvZGVzICAqLworc3RhdGljIHU4ICgqZ2Vub3BfYnl0ZV9vcGVyYXRpb25bXSkodTggZCwgdTggcykgX19hdHRyaWJ1dGVfXyAoKHNlY3Rpb24oIi5nb3QyIikpKSA9Cit7CisgICAgYWRkX2J5dGUsCQkvKiAwMCAqLworICAgIG9yX2J5dGUsCQkvKiAwMSAqLworICAgIGFkY19ieXRlLAkJLyogMDIgKi8KKyAgICBzYmJfYnl0ZSwJCS8qIDAzICovCisgICAgYW5kX2J5dGUsCQkvKiAwNCAqLworICAgIHN1Yl9ieXRlLAkJLyogMDUgKi8KKyAgICB4b3JfYnl0ZSwJCS8qIDA2ICovCisgICAgY21wX2J5dGUsCQkvKiAwNyAqLworfTsKKworc3RhdGljIHUxNiAoKmdlbm9wX3dvcmRfb3BlcmF0aW9uW10pKHUxNiBkLCB1MTYgcykgX19hdHRyaWJ1dGVfXyAoKHNlY3Rpb24oIi5nb3QyIikpKSA9Cit7CisgICAgYWRkX3dvcmQsCQkvKjAwICovCisgICAgb3Jfd29yZCwJCS8qMDEgKi8KKyAgICBhZGNfd29yZCwJCS8qMDIgKi8KKyAgICBzYmJfd29yZCwJCS8qMDMgKi8KKyAgICBhbmRfd29yZCwJCS8qMDQgKi8KKyAgICBzdWJfd29yZCwJCS8qMDUgKi8KKyAgICB4b3Jfd29yZCwJCS8qMDYgKi8KKyAgICBjbXBfd29yZCwJCS8qMDcgKi8KK307CisKK3N0YXRpYyB1MzIgKCpnZW5vcF9sb25nX29wZXJhdGlvbltdKSh1MzIgZCwgdTMyIHMpIF9fYXR0cmlidXRlX18gKChzZWN0aW9uKCIuZ290MiIpKSkgPQoreworICAgIGFkZF9sb25nLAkJLyowMCAqLworICAgIG9yX2xvbmcsCQkvKjAxICovCisgICAgYWRjX2xvbmcsCQkvKjAyICovCisgICAgc2JiX2xvbmcsCQkvKjAzICovCisgICAgYW5kX2xvbmcsCQkvKjA0ICovCisgICAgc3ViX2xvbmcsCQkvKjA1ICovCisgICAgeG9yX2xvbmcsCQkvKjA2ICovCisgICAgY21wX2xvbmcsCQkvKjA3ICovCit9OworCisvKiB1c2VkIGJ5IG9wY29kZXMgODAsIGMwLCBkMCwgYW5kIGQyLiAqLworc3RhdGljIHU4KCpvcGNEMF9ieXRlX29wZXJhdGlvbltdKSh1OCBkLCB1OCBzKSBfX2F0dHJpYnV0ZV9fICgoc2VjdGlvbigiLmdvdDIiKSkpID0KK3sKKyAgICByb2xfYnl0ZSwKKyAgICByb3JfYnl0ZSwKKyAgICByY2xfYnl0ZSwKKyAgICByY3JfYnl0ZSwKKyAgICBzaGxfYnl0ZSwKKyAgICBzaHJfYnl0ZSwKKyAgICBzaGxfYnl0ZSwJCS8qIHNhbF9ieXRlID09PSBzaGxfYnl0ZSAgYnkgZGVmaW5pdGlvbiAqLworICAgIHNhcl9ieXRlLAorfTsKKworLyogdXNlZCBieSBvcGNvZGVzIGMxLCBkMSwgYW5kIGQzLiAqLworc3RhdGljIHUxNigqb3BjRDFfd29yZF9vcGVyYXRpb25bXSkodTE2IHMsIHU4IGQpIF9fYXR0cmlidXRlX18gKChzZWN0aW9uKCIuZ290MiIpKSkgPQoreworICAgIHJvbF93b3JkLAorICAgIHJvcl93b3JkLAorICAgIHJjbF93b3JkLAorICAgIHJjcl93b3JkLAorICAgIHNobF93b3JkLAorICAgIHNocl93b3JkLAorICAgIHNobF93b3JkLAkJLyogc2FsX2J5dGUgPT09IHNobF9ieXRlICBieSBkZWZpbml0aW9uICovCisgICAgc2FyX3dvcmQsCit9OworCisvKiB1c2VkIGJ5IG9wY29kZXMgYzEsIGQxLCBhbmQgZDMuICovCitzdGF0aWMgdTMyICgqb3BjRDFfbG9uZ19vcGVyYXRpb25bXSkodTMyIHMsIHU4IGQpIF9fYXR0cmlidXRlX18gKChzZWN0aW9uKCIuZ290MiIpKSkgPQoreworICAgIHJvbF9sb25nLAorICAgIHJvcl9sb25nLAorICAgIHJjbF9sb25nLAorICAgIHJjcl9sb25nLAorICAgIHNobF9sb25nLAorICAgIHNocl9sb25nLAorICAgIHNobF9sb25nLAkJLyogc2FsX2J5dGUgPT09IHNobF9ieXRlICBieSBkZWZpbml0aW9uICovCisgICAgc2FyX2xvbmcsCit9OworCisjaWZkZWYgREVCVUcKKworc3RhdGljIGNoYXIgKm9wRjZfbmFtZXNbOF0gPQorICB7ICJURVNUXHQiLCAiIiwgIk5PVFx0IiwgIk5FR1x0IiwgIk1VTFx0IiwgIklNVUxcdCIsICJESVZcdCIsICJJRElWXHQiIH07CisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK29wMSAtIEluc3RydWN0aW9uIG9wIGNvZGUKKworUkVNQVJLUzoKK0hhbmRsZXMgaWxsZWdhbCBvcGNvZGVzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfaWxsZWdhbF9vcCgKKyAgICB1OCBvcDEpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYuUl9TUCAhPSAwKSB7CisJREVDT0RFX1BSSU5URigiSUxMRUdBTCBYODYgT1BDT0RFXG4iKTsKKwlUUkFDRV9SRUdTKCk7CisJREIoIHByaW50aygiJTA0eDolMDR4OiAlMDJYIElMTEVHQUwgWDg2IE9QQ09ERSFcbiIsCisJICAgIE0ueDg2LlJfQ1MsIE0ueDg2LlJfSVAtMSxvcDEpKTsKKwlIQUxUX1NZUygpOworCX0KKyAgICBlbHNlIHsKKwkvKiBJZiB3ZSBnZXQgaGVyZSwgaXQgbWVhbnMgdGhlIHN0YWNrIHBvaW50ZXIgaXMgYmFjayB0byB6ZXJvCisJICogc28gd2UgYXJlIGp1c3QgcmV0dXJuaW5nIGZyb20gYW4gZW11bGF0b3Igc2VydmljZSBjYWxsCisJICogc28gdGhlcnRlIGlzIG5vIG5lZWQgdG8gZGlzcGxheSBhbiBlcnJvciBtZXNzYWdlLiBXZSB0cmFwCisJICogdGhlIGVtdWxhdG9yIHdpdGggYW4gMHhGMSBvcGNvZGUgdG8gZmluaXNoIHRoZSBzZXJ2aWNlCisJICogY2FsbC4KKwkgKi8KKwlYODZFTVVfaGFsdF9zeXMoKTsKKwl9CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGVzIDB4MDAsIDB4MDgsIDB4MTAsIDB4MTgsIDB4MjAsIDB4MjgsIDB4MzAsIDB4MzgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2dlbm9wX2J5dGVfUk1fUih1OCBvcDEpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKyAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKKyAgICB1OCBkZXN0dmFsOworCisgICAgb3AxID0gKG9wMSA+PiAzKSAmIDB4NzsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URih4ODZlbXVfR2VuT3BOYW1lW29wMV0pOworICAgIERFQ09ERV9QUklOVEYoIlx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZihtb2Q8MykKKwl7IGRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCxybCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisJc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwlkZXN0dmFsID0gZ2Vub3BfYnl0ZV9vcGVyYXRpb25bb3AxXShkZXN0dmFsLCAqc3JjcmVnKTsKKwlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJfQorICAgIGVsc2UKKwl7CQkJLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCSpkZXN0cmVnID0gZ2Vub3BfYnl0ZV9vcGVyYXRpb25bb3AxXSgqZGVzdHJlZywgKnNyY3JlZyk7CisJfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZXMgMHgwMSwgMHgwOSwgMHgxMSwgMHgxOSwgMHgyMSwgMHgyOSwgMHgzMSwgMHgzOQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfZ2Vub3Bfd29yZF9STV9SKHU4IG9wMSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBkZXN0b2Zmc2V0OworCisgICAgb3AxID0gKG9wMSA+PiAzKSAmIDB4NzsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URih4ODZlbXVfR2VuT3BOYW1lW29wMV0pOworICAgIERFQ09ERV9QUklOVEYoIlx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKworICAgIGlmKG1vZDwzKSB7CisJZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLHJsKTsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyIGRlc3R2YWw7CisJICAgIHUzMiAqc3JjcmVnOworCisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gZ2Vub3BfbG9uZ19vcGVyYXRpb25bb3AxXShkZXN0dmFsLCAqc3JjcmVnKTsKKwkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCX0gZWxzZSB7CisJICAgIHUxNiBkZXN0dmFsOworCSAgICB1MTYgKnNyY3JlZzsKKworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGVzdHZhbCA9IGdlbm9wX3dvcmRfb3BlcmF0aW9uW29wMV0oZGVzdHZhbCwgKnNyY3JlZyk7CisJICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwl9CisgICAgfSBlbHNlIHsJCQkvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSBnZW5vcF9sb25nX29wZXJhdGlvbltvcDFdKCpkZXN0cmVnLCAqc3JjcmVnKTsKKwl9IGVsc2UgeworCSAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSBnZW5vcF93b3JkX29wZXJhdGlvbltvcDFdKCpkZXN0cmVnLCAqc3JjcmVnKTsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZXMgMHgwMiwgMHgwYSwgMHgxMiwgMHgxYSwgMHgyMiwgMHgyYSwgMHgzMiwgMHgzYQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfZ2Vub3BfYnl0ZV9SX1JNKHU4IG9wMSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTggKmRlc3RyZWcsICpzcmNyZWc7CisgICAgdWludCBzcmNvZmZzZXQ7CisgICAgdTggc3JjdmFsOworCisgICAgb3AxID0gKG9wMSA+PiAzKSAmIDB4NzsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URih4ODZlbXVfR2VuT3BOYW1lW29wMV0pOworICAgIERFQ09ERV9QUklOVEYoIlx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihyaCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCXNyY29mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLHJsKTsKKwlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKKyAgICB9IGVsc2UgewkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisJc3JjdmFsID0gKnNyY3JlZzsKKyAgICB9CisgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgICpkZXN0cmVnID0gZ2Vub3BfYnl0ZV9vcGVyYXRpb25bb3AxXSgqZGVzdHJlZywgc3JjdmFsKTsKKworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZXMgMHgwMywgMHgwYiwgMHgxMywgMHgxYiwgMHgyMywgMHgyYiwgMHgzMywgMHgzYgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfZ2Vub3Bfd29yZF9SX1JNKHU4IG9wMSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBzcmNvZmZzZXQ7CisgICAgdTMyICpkZXN0cmVnMzIsIHNyY3ZhbDsKKyAgICB1MTYgKmRlc3RyZWc7CisKKyAgICBvcDEgPSAob3AxID4+IDMpICYgMHg3OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKHg4NmVtdV9HZW5PcE5hbWVbb3AxXSk7CisgICAgREVDT0RFX1BSSU5URigiXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QscmwpOworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICBkZXN0cmVnMzIgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnMzIgPSBnZW5vcF9sb25nX29wZXJhdGlvbltvcDFdKCpkZXN0cmVnMzIsIHNyY3ZhbCk7CisJfSBlbHNlIHsKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSBnZW5vcF93b3JkX29wZXJhdGlvbltvcDFdKCpkZXN0cmVnLCBzcmN2YWwpOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKnNyY3JlZzsKKwkgICAgZGVzdHJlZzMyID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWczMiA9IGdlbm9wX2xvbmdfb3BlcmF0aW9uW29wMV0oKmRlc3RyZWczMiwgKnNyY3JlZyk7CisJfSBlbHNlIHsKKwkgICAgdTE2ICpzcmNyZWc7CisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9IGdlbm9wX3dvcmRfb3BlcmF0aW9uW29wMV0oKmRlc3RyZWcsICpzcmNyZWcpOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlcyAweDA0LCAweDBjLCAweDE0LCAweDFjLCAweDI0LCAweDJjLCAweDM0LCAweDNjCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9nZW5vcF9ieXRlX0FMX0lNTSh1OCBvcDEpCit7CisgICAgdTggc3JjdmFsOworCisgICAgb3AxID0gKG9wMSA+PiAzKSAmIDB4NzsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URih4ODZlbXVfR2VuT3BOYW1lW29wMV0pOworICAgIERFQ09ERV9QUklOVEYoIlx0QUwsIik7CisgICAgc3JjdmFsID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHNyY3ZhbCk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0FMID0gZ2Vub3BfYnl0ZV9vcGVyYXRpb25bb3AxXShNLng4Ni5SX0FMLCBzcmN2YWwpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZXMgMHgwNSwgMHgwZCwgMHgxNSwgMHgxZCwgMHgyNSwgMHgyZCwgMHgzNSwgMHgzZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfZ2Vub3Bfd29yZF9BWF9JTU0odTggb3AxKQoreworICAgIHUzMiBzcmN2YWw7CisKKyAgICBvcDEgPSAob3AxID4+IDMpICYgMHg3OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlERUNPREVfUFJJTlRGKHg4NmVtdV9HZW5PcE5hbWVbb3AxXSk7CisJREVDT0RFX1BSSU5URigiXHRFQVgsIik7CisJc3JjdmFsID0gZmV0Y2hfbG9uZ19pbW0oKTsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYoeDg2ZW11X0dlbk9wTmFtZVtvcDFdKTsKKwlERUNPREVfUFJJTlRGKCJcdEFYLCIpOworCXNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgfQorICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCU0ueDg2LlJfRUFYID0gZ2Vub3BfbG9uZ19vcGVyYXRpb25bb3AxXShNLng4Ni5SX0VBWCwgc3JjdmFsKTsKKyAgICB9IGVsc2UgeworCU0ueDg2LlJfQVggPSBnZW5vcF93b3JkX29wZXJhdGlvbltvcDFdKE0ueDg2LlJfQVgsICh1MTYpc3JjdmFsKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MDYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3B1c2hfRVModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUFVTSFx0RVNcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgcHVzaF93b3JkKE0ueDg2LlJfRVMpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDA3CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wb3BfRVModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUE9QXHRFU1xuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0VTID0gcG9wX3dvcmQoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcHVzaF9DUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJQVVNIXHRDU1xuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBwdXNoX3dvcmQoTS54ODYuUl9DUyk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYuIEVzY2FwZSBmb3IgdHdvLWJ5dGUgb3Bjb2RlICgyODYgb3IgYmV0dGVyKQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfdHdvX2J5dGUodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHU4IG9wMiA9ICgqc3lzX3JkYikoKCh1MzIpTS54ODYuUl9DUyA8PCA0KSArIChNLng4Ni5SX0lQKyspKTsKKyAgICBJTkNfREVDT0RFRF9JTlNUX0xFTigxKTsKKyAgICAoKng4NmVtdV9vcHRhYjJbb3AyXSkob3AyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDE2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wdXNoX1NTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlBVU0hcdFNTXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIHB1c2hfd29yZChNLng4Ni5SX1NTKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgxNworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcG9wX1NTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlBPUFx0U1NcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9TUyA9IHBvcF93b3JkKCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3B1c2hfRFModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUFVTSFx0RFNcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgcHVzaF93b3JkKE0ueDg2LlJfRFMpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDFmCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wb3BfRFModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUE9QXHREU1xuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0RTID0gcG9wX3dvcmQoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgyNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfc2Vnb3ZyX0VTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkVTOlxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHT1ZSX0VTOworICAgIC8qCisgICAgICogbm90ZSB0aGUgbGFjayBvZiBERUNPREVfQ0xFQVJfU0VHT1ZSKHIpIHNpbmNlLCBoZXJlIGlzIG9uZSBvZiA0CisgICAgICogb3Bjb2RlIHN1YnJvdXRpbmVzIHdlIGRvIG5vdCB3YW50IHRvIGRvIHRoaXMuCisgICAgICovCisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgyNworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfZGFhKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkRBQVxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0FMID0gZGFhX2J5dGUoTS54ODYuUl9BTCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MmUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3NlZ292cl9DUyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJDUzpcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1NFR09WUl9DUzsKKyAgICAvKiBub3RlIG5vIERFQ09ERV9DTEVBUl9TRUdPVlIgaGVyZS4gKi8KKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDJmCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9kYXModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiREFTXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfQUwgPSBkYXNfYnl0ZShNLng4Ni5SX0FMKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgzNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfc2Vnb3ZyX1NTKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlNTOlxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfU0VHT1ZSX1NTOworICAgIC8qIG5vIERFQ09ERV9DTEVBUl9TRUdPVlIgISAqLworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MzcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2FhYSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJBQUFcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9BWCA9IGFhYV93b3JkKE0ueDg2LlJfQVgpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDNlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9zZWdvdnJfRFModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiRFM6XG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdPVlJfRFM7CisgICAgLyogTk8gREVDT0RFX0NMRUFSX1NFR09WUiEgKi8KKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDNmCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9hYXModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQUFTXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfQVggPSBhYXNfd29yZChNLng4Ni5SX0FYKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg0MCAtIDB4NDcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2luY19yZWdpc3Rlcih1OCBvcDEpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBvcDEgJj0gMHg3OworICAgIERFQ09ERV9QUklOVEYoIklOQ1x0Iik7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJdTMyICpyZWc7CisJcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIob3AxKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKnJlZyA9IGluY19sb25nKCpyZWcpOworICAgIH0gZWxzZSB7CisJdTE2ICpyZWc7CisJcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIob3AxKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKnJlZyA9IGluY193b3JkKCpyZWcpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg0OCAtIDB4NEYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2RlY19yZWdpc3Rlcih1OCBvcDEpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBvcDEgJj0gMHg3OworICAgIERFQ09ERV9QUklOVEYoIkRFQ1x0Iik7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJdTMyICpyZWc7CisJcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIob3AxKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKnJlZyA9IGRlY19sb25nKCpyZWcpOworICAgIH0gZWxzZSB7CisJdTE2ICpyZWc7CisJcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIob3AxKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKnJlZyA9IGRlY193b3JkKCpyZWcpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg1MCAtIDB4NTcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3B1c2hfcmVnaXN0ZXIodTggb3AxKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgb3AxICY9IDB4NzsKKyAgICBERUNPREVfUFJJTlRGKCJQVVNIXHQiKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwl1MzIgKnJlZzsKKwlyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihvcDEpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwlwdXNoX2xvbmcoKnJlZyk7CisgICAgfSBlbHNlIHsKKwl1MTYgKnJlZzsKKwlyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihvcDEpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwlwdXNoX3dvcmQoKnJlZyk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDU4IC0gMHg1RgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcG9wX3JlZ2lzdGVyKHU4IG9wMSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIG9wMSAmPSAweDc7CisgICAgREVDT0RFX1BSSU5URigiUE9QXHQiKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwl1MzIgKnJlZzsKKwlyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihvcDEpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwkqcmVnID0gcG9wX2xvbmcoKTsKKyAgICB9IGVsc2UgeworCXUxNiAqcmVnOworCXJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKG9wMSk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCSpyZWcgPSBwb3Bfd29yZCgpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg2MAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcHVzaF9hbGwodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJREVDT0RFX1BSSU5URigiUFVTSEFEXG4iKTsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYoIlBVU0hBXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwl1MzIgb2xkX3NwID0gTS54ODYuUl9FU1A7CisKKwlwdXNoX2xvbmcoTS54ODYuUl9FQVgpOworCXB1c2hfbG9uZyhNLng4Ni5SX0VDWCk7CisJcHVzaF9sb25nKE0ueDg2LlJfRURYKTsKKwlwdXNoX2xvbmcoTS54ODYuUl9FQlgpOworCXB1c2hfbG9uZyhvbGRfc3ApOworCXB1c2hfbG9uZyhNLng4Ni5SX0VCUCk7CisJcHVzaF9sb25nKE0ueDg2LlJfRVNJKTsKKwlwdXNoX2xvbmcoTS54ODYuUl9FREkpOworICAgIH0gZWxzZSB7CisJdTE2IG9sZF9zcCA9IE0ueDg2LlJfU1A7CisKKwlwdXNoX3dvcmQoTS54ODYuUl9BWCk7CisJcHVzaF93b3JkKE0ueDg2LlJfQ1gpOworCXB1c2hfd29yZChNLng4Ni5SX0RYKTsKKwlwdXNoX3dvcmQoTS54ODYuUl9CWCk7CisJcHVzaF93b3JkKG9sZF9zcCk7CisJcHVzaF93b3JkKE0ueDg2LlJfQlApOworCXB1c2hfd29yZChNLng4Ni5SX1NJKTsKKwlwdXNoX3dvcmQoTS54ODYuUl9ESSk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDYxCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wb3BfYWxsKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCURFQ09ERV9QUklOVEYoIlBPUEFEXG4iKTsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYoIlBPUEFcbiIpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCU0ueDg2LlJfRURJID0gcG9wX2xvbmcoKTsKKwlNLng4Ni5SX0VTSSA9IHBvcF9sb25nKCk7CisJTS54ODYuUl9FQlAgPSBwb3BfbG9uZygpOworCU0ueDg2LlJfRVNQICs9IDQ7CSAgICAgICAvKiBza2lwIEVTUCAqLworCU0ueDg2LlJfRUJYID0gcG9wX2xvbmcoKTsKKwlNLng4Ni5SX0VEWCA9IHBvcF9sb25nKCk7CisJTS54ODYuUl9FQ1ggPSBwb3BfbG9uZygpOworCU0ueDg2LlJfRUFYID0gcG9wX2xvbmcoKTsKKyAgICB9IGVsc2UgeworCU0ueDg2LlJfREkgPSBwb3Bfd29yZCgpOworCU0ueDg2LlJfU0kgPSBwb3Bfd29yZCgpOworCU0ueDg2LlJfQlAgPSBwb3Bfd29yZCgpOworCU0ueDg2LlJfU1AgKz0gMjsJICAgICAgIC8qIHNraXAgU1AgKi8KKwlNLng4Ni5SX0JYID0gcG9wX3dvcmQoKTsKKwlNLng4Ni5SX0RYID0gcG9wX3dvcmQoKTsKKwlNLng4Ni5SX0NYID0gcG9wX3dvcmQoKTsKKwlNLng4Ni5SX0FYID0gcG9wX3dvcmQoKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKm9wY29kZSAweDYyCUlMTEVHQUwgT1AsIGNhbGxzIHg4NmVtdU9wX2lsbGVnYWxfb3AoKSAqLworLypvcGNvZGUgMHg2MwlJTExFR0FMIE9QLCBjYWxscyB4ODZlbXVPcF9pbGxlZ2FsX29wKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDY0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9zZWdvdnJfRlModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiRlM6XG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdPVlJfRlM7CisgICAgLyoKKyAgICAgKiBub3RlIHRoZSBsYWNrIG9mIERFQ09ERV9DTEVBUl9TRUdPVlIocikgc2luY2UsIGhlcmUgaXMgb25lIG9mIDQKKyAgICAgKiBvcGNvZGUgc3Vicm91dGluZXMgd2UgZG8gbm90IHdhbnQgdG8gZG8gdGhpcy4KKyAgICAgKi8KKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDY1CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9zZWdvdnJfR1ModTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiR1M6XG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9TRUdPVlJfR1M7CisgICAgLyoKKyAgICAgKiBub3RlIHRoZSBsYWNrIG9mIERFQ09ERV9DTEVBUl9TRUdPVlIocikgc2luY2UsIGhlcmUgaXMgb25lIG9mIDQKKyAgICAgKiBvcGNvZGUgc3Vicm91dGluZXMgd2UgZG8gbm90IHdhbnQgdG8gZG8gdGhpcy4KKyAgICAgKi8KKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDY2IC0gcHJlZml4IGZvciAzMi1iaXQgcmVnaXN0ZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3ByZWZpeF9kYXRhKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkRBVEE6XG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2Lm1vZGUgfD0gU1lTTU9ERV9QUkVGSVhfREFUQTsKKyAgICAvKiBub3RlIG5vIERFQ09ERV9DTEVBUl9TRUdPVlIgaGVyZS4gKi8KKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDY3IC0gcHJlZml4IGZvciAzMi1iaXQgYWRkcmVzcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcHJlZml4X2FkZHIodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQUREUjpcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1BSRUZJWF9BRERSOworICAgIC8qIG5vdGUgbm8gREVDT0RFX0NMRUFSX1NFR09WUiBoZXJlLiAqLworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NjgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3B1c2hfd29yZF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUzMiBpbW07CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCWltbSA9IGZldGNoX2xvbmdfaW1tKCk7CisgICAgfSBlbHNlIHsKKwlpbW0gPSBmZXRjaF93b3JkX2ltbSgpOworICAgIH0KKyAgICBERUNPREVfUFJJTlRGMigiUFVTSFx0JXhcbiIsIGltbSk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlwdXNoX2xvbmcoaW1tKTsKKyAgICB9IGVsc2UgeworCXB1c2hfd29yZCgodTE2KWltbSk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDY5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9pbXVsX3dvcmRfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBzcmNvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIklNVUxcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWc7CisJICAgIHUzMiBzcmN2YWw7CisJICAgIHUzMiByZXNfbG8scmVzX2hpOworCSAgICBzMzIgaW1tOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7CisJICAgIGltbSA9IGZldGNoX2xvbmdfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgaW11bF9sb25nX2RpcmVjdCgmcmVzX2xvLCZyZXNfaGksKHMzMilzcmN2YWwsKHMzMilpbW0pOworCSAgICBpZiAoKCgocmVzX2xvICYgMHg4MDAwMDAwMCkgPT0gMCkgJiYgKHJlc19oaSA9PSAweDAwMDAwMDAwKSkgfHwKKwkJKCgocmVzX2xvICYgMHg4MDAwMDAwMCkgIT0gMCkgJiYgKHJlc19oaSA9PSAweEZGRkZGRkZGKSkpIHsKKwkJQ0xFQVJfRkxBRyhGX0NGKTsKKwkJQ0xFQVJfRkxBRyhGX09GKTsKKwkgICAgfSBlbHNlIHsKKwkJU0VUX0ZMQUcoRl9DRik7CisJCVNFVF9GTEFHKEZfT0YpOworCSAgICB9CisJICAgICpkZXN0cmVnID0gKHUzMilyZXNfbG87CisJfSBlbHNlIHsKKwkgICAgdTE2ICpkZXN0cmVnOworCSAgICB1MTYgc3JjdmFsOworCSAgICB1MzIgcmVzOworCSAgICBzMTYgaW1tOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisJICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgcmVzID0gKHMxNilzcmN2YWwgKiAoczE2KWltbTsKKwkgICAgaWYgKCgoKHJlcyAmIDB4ODAwMCkgPT0gMCkgJiYgKChyZXMgPj4gMTYpID09IDB4MDAwMCkpIHx8CisJCSgoKHJlcyAmIDB4ODAwMCkgIT0gMCkgJiYgKChyZXMgPj4gMTYpID09IDB4RkZGRikpKSB7CisJCUNMRUFSX0ZMQUcoRl9DRik7CisJCUNMRUFSX0ZMQUcoRl9PRik7CisJICAgIH0gZWxzZSB7CisJCVNFVF9GTEFHKEZfQ0YpOworCQlTRVRfRkxBRyhGX09GKTsKKwkgICAgfQorCSAgICAqZGVzdHJlZyA9ICh1MTYpcmVzOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKKwkgICAgdTMyIHJlc19sbyxyZXNfaGk7CisJICAgIHMzMiBpbW07CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJICAgIGltbSA9IGZldGNoX2xvbmdfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgaW11bF9sb25nX2RpcmVjdCgmcmVzX2xvLCZyZXNfaGksKHMzMikqc3JjcmVnLChzMzIpaW1tKTsKKwkgICAgaWYgKCgoKHJlc19sbyAmIDB4ODAwMDAwMDApID09IDApICYmIChyZXNfaGkgPT0gMHgwMDAwMDAwMCkpIHx8CisJCSgoKHJlc19sbyAmIDB4ODAwMDAwMDApICE9IDApICYmIChyZXNfaGkgPT0gMHhGRkZGRkZGRikpKSB7CisJCUNMRUFSX0ZMQUcoRl9DRik7CisJCUNMRUFSX0ZMQUcoRl9PRik7CisJICAgIH0gZWxzZSB7CisJCVNFVF9GTEFHKEZfQ0YpOworCQlTRVRfRkxBRyhGX09GKTsKKwkgICAgfQorCSAgICAqZGVzdHJlZyA9ICh1MzIpcmVzX2xvOworCX0gZWxzZSB7CisJICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOworCSAgICB1MzIgcmVzOworCSAgICBzMTYgaW1tOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCSAgICBpbW0gPSBmZXRjaF93b3JkX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiLCVkXG4iLCAoczMyKWltbSk7CisJICAgIHJlcyA9IChzMTYpKnNyY3JlZyAqIChzMTYpaW1tOworCSAgICBpZiAoKCgocmVzICYgMHg4MDAwKSA9PSAwKSAmJiAoKHJlcyA+PiAxNikgPT0gMHgwMDAwKSkgfHwKKwkJKCgocmVzICYgMHg4MDAwKSAhPSAwKSAmJiAoKHJlcyA+PiAxNikgPT0gMHhGRkZGKSkpIHsKKwkJQ0xFQVJfRkxBRyhGX0NGKTsKKwkJQ0xFQVJfRkxBRyhGX09GKTsKKwkgICAgfSBlbHNlIHsKKwkJU0VUX0ZMQUcoRl9DRik7CisJCVNFVF9GTEFHKEZfT0YpOworCSAgICB9CisJICAgICpkZXN0cmVnID0gKHUxNilyZXM7CisJfQorICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg2YQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcHVzaF9ieXRlX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgczE2IGltbTsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaW1tID0gKHM4KWZldGNoX2J5dGVfaW1tKCk7CisgICAgREVDT0RFX1BSSU5URjIoIlBVU0hcdCVkXG4iLCBpbW0pOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgcHVzaF93b3JkKGltbSk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NmIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2ltdWxfYnl0ZV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IHNyY29mZnNldDsKKyAgICBzOAlpbW07CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIklNVUxcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWc7CisJICAgIHUzMiBzcmN2YWw7CisJICAgIHUzMiByZXNfbG8scmVzX2hpOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7CisJICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgaW11bF9sb25nX2RpcmVjdCgmcmVzX2xvLCZyZXNfaGksKHMzMilzcmN2YWwsKHMzMilpbW0pOworCSAgICBpZiAoKCgocmVzX2xvICYgMHg4MDAwMDAwMCkgPT0gMCkgJiYgKHJlc19oaSA9PSAweDAwMDAwMDAwKSkgfHwKKwkJKCgocmVzX2xvICYgMHg4MDAwMDAwMCkgIT0gMCkgJiYgKHJlc19oaSA9PSAweEZGRkZGRkZGKSkpIHsKKwkJQ0xFQVJfRkxBRyhGX0NGKTsKKwkJQ0xFQVJfRkxBRyhGX09GKTsKKwkgICAgfSBlbHNlIHsKKwkJU0VUX0ZMQUcoRl9DRik7CisJCVNFVF9GTEFHKEZfT0YpOworCSAgICB9CisJICAgICpkZXN0cmVnID0gKHUzMilyZXNfbG87CisJfSBlbHNlIHsKKwkgICAgdTE2ICpkZXN0cmVnOworCSAgICB1MTYgc3JjdmFsOworCSAgICB1MzIgcmVzOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisJICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgcmVzID0gKHMxNilzcmN2YWwgKiAoczE2KWltbTsKKwkgICAgaWYgKCgoKHJlcyAmIDB4ODAwMCkgPT0gMCkgJiYgKChyZXMgPj4gMTYpID09IDB4MDAwMCkpIHx8CisJCSgoKHJlcyAmIDB4ODAwMCkgIT0gMCkgJiYgKChyZXMgPj4gMTYpID09IDB4RkZGRikpKSB7CisJCUNMRUFSX0ZMQUcoRl9DRik7CisJCUNMRUFSX0ZMQUcoRl9PRik7CisJICAgIH0gZWxzZSB7CisJCVNFVF9GTEFHKEZfQ0YpOworCQlTRVRfRkxBRyhGX09GKTsKKwkgICAgfQorCSAgICAqZGVzdHJlZyA9ICh1MTYpcmVzOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKKwkgICAgdTMyIHJlc19sbyxyZXNfaGk7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJICAgIGltbSA9IGZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIChzMzIpaW1tKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgaW11bF9sb25nX2RpcmVjdCgmcmVzX2xvLCZyZXNfaGksKHMzMikqc3JjcmVnLChzMzIpaW1tKTsKKwkgICAgaWYgKCgoKHJlc19sbyAmIDB4ODAwMDAwMDApID09IDApICYmIChyZXNfaGkgPT0gMHgwMDAwMDAwMCkpIHx8CisJCSgoKHJlc19sbyAmIDB4ODAwMDAwMDApICE9IDApICYmIChyZXNfaGkgPT0gMHhGRkZGRkZGRikpKSB7CisJCUNMRUFSX0ZMQUcoRl9DRik7CisJCUNMRUFSX0ZMQUcoRl9PRik7CisJICAgIH0gZWxzZSB7CisJCVNFVF9GTEFHKEZfQ0YpOworCQlTRVRfRkxBRyhGX09GKTsKKwkgICAgfQorCSAgICAqZGVzdHJlZyA9ICh1MzIpcmVzX2xvOworCX0gZWxzZSB7CisJICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOworCSAgICB1MzIgcmVzOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCSAgICBpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiLCVkXG4iLCAoczMyKWltbSk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHJlcyA9IChzMTYpKnNyY3JlZyAqIChzMTYpaW1tOworCSAgICBpZiAoKCgocmVzICYgMHg4MDAwKSA9PSAwKSAmJiAoKHJlcyA+PiAxNikgPT0gMHgwMDAwKSkgfHwKKwkJKCgocmVzICYgMHg4MDAwKSAhPSAwKSAmJiAoKHJlcyA+PiAxNikgPT0gMHhGRkZGKSkpIHsKKwkJQ0xFQVJfRkxBRyhGX0NGKTsKKwkJQ0xFQVJfRkxBRyhGX09GKTsKKwkgICAgfSBlbHNlIHsKKwkJU0VUX0ZMQUcoRl9DRik7CisJCVNFVF9GTEFHKEZfT0YpOworCSAgICB9CisJICAgICpkZXN0cmVnID0gKHUxNilyZXM7CisJfQorICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg2YworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfaW5zX2J5dGUodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSU5TQlxuIik7CisgICAgaW5zKDEpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NmQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2luc193b3JkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCURFQ09ERV9QUklOVEYoIklOU0RcbiIpOworCWlucyg0KTsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYoIklOU1dcbiIpOworCWlucygyKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg2ZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfb3V0c19ieXRlKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk9VVFNCXG4iKTsKKyAgICBvdXRzKDEpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4NmYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX291dHNfd29yZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlERUNPREVfUFJJTlRGKCJPVVRTRFxuIik7CisJb3V0cyg0KTsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYoIk9VVFNXXG4iKTsKKwlvdXRzKDIpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDcwIC0gMHg3RgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB4ODZlbXVfY2hlY2tfanVtcF9jb25kaXRpb24odTggb3ApOworCit2b2lkIHg4NmVtdU9wX2p1bXBfbmVhcl9jb25kKHU4IG9wMSkKK3sKKyAgICBzOCBvZmZzZXQ7CisgICAgdTE2IHRhcmdldDsKKyAgICBpbnQgY29uZDsKKworICAgIC8qIGp1bXAgdG8gYnl0ZSBvZmZzZXQgaWYgb3ZlcmZsb3cgZmxhZyBpcyBzZXQgKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGNvbmQgPSB4ODZlbXVfY2hlY2tfanVtcF9jb25kaXRpb24ob3AxICYgMHhGKTsKKyAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgKHMxNilvZmZzZXQpOworICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChjb25kKQorCU0ueDg2LlJfSVAgPSB0YXJnZXQ7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ODAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX29wYzgwX2J5dGVfUk1fSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTggKmRlc3RyZWc7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4IGltbTsKKyAgICB1OCBkZXN0dmFsOworCisgICAgLyoKKyAgICAgKiBXZWlyZG8gc3BlY2lhbCBjYXNlIGluc3RydWN0aW9uIGZvcm1hdC4JUGFydCBvZiB0aGUgb3Bjb2RlCisgICAgICogaGVsZCBiZWxvdyBpbiAiUkgiLiAgRG91Ymx5IG5lc3RlZCBjYXNlIHdvdWxkIHJlc3VsdCwgZXhjZXB0CisgICAgICogdGhhdCB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbgorICAgICAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyNpZmRlZiBERUJVRworICAgIGlmIChERUJVR19ERUNPREUoKSkgeworCS8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCisJICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKKwkgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKKwkgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCisKKwlzd2l0Y2ggKHJoKSB7CisJY2FzZSAwOgorCSAgICBERUNPREVfUFJJTlRGKCJBRERcdCIpOworCSAgICBicmVhazsKKwljYXNlIDE6CisJICAgIERFQ09ERV9QUklOVEYoIk9SXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAyOgorCSAgICBERUNPREVfUFJJTlRGKCJBRENcdCIpOworCSAgICBicmVhazsKKwljYXNlIDM6CisJICAgIERFQ09ERV9QUklOVEYoIlNCQlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNDoKKwkgICAgREVDT0RFX1BSSU5URigiQU5EXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA1OgorCSAgICBERUNPREVfUFJJTlRGKCJTVUJcdCIpOworCSAgICBicmVhazsKKwljYXNlIDY6CisJICAgIERFQ09ERV9QUklOVEYoIlhPUlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNzoKKwkgICAgREVDT0RFX1BSSU5URigiQ01QXHQiKTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyNlbmRpZgorICAgIC8qIGtub3cgb3BlcmF0aW9uLCBkZWNvZGUgdGhlIG1vZCBieXRlIHRvIGZpbmQgdGhlIGFkZHJlc3NpbmcKKyAgICAgICBtb2RlLiAqLworICAgIGlmIChtb2QgPCAzKSB7CisJREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7CisJZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisJaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKwlERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwlkZXN0dmFsID0gKCpnZW5vcF9ieXRlX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOworCWlmIChyaCAhPSA3KQorCSAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOworCURFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCWRlc3R2YWwgPSAoKmdlbm9wX2J5dGVfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCBpbW0pOworCWlmIChyaCAhPSA3KQorCSAgICAqZGVzdHJlZyA9IGRlc3R2YWw7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDgxCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9vcGM4MV93b3JkX1JNX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKworICAgIC8qCisgICAgICogV2VpcmRvIHNwZWNpYWwgY2FzZSBpbnN0cnVjdGlvbiBmb3JtYXQuCVBhcnQgb2YgdGhlIG9wY29kZQorICAgICAqIGhlbGQgYmVsb3cgaW4gIlJIIi4gIERvdWJseSBuZXN0ZWQgY2FzZSB3b3VsZCByZXN1bHQsIGV4Y2VwdAorICAgICAqIHRoYXQgdGhlIGRlY29kZWQgaW5zdHJ1Y3Rpb24KKyAgICAgKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoREVCVUdfREVDT0RFKCkpIHsKKwkvKiBYWFggREVDT0RFX1BSSU5URiBtYXkgYmUgY2hhbmdlZCB0byBzb21ldGhpbmcgbW9yZQorCSAgIGdlbmVyYWwsIHNvIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRvIGxlYXZlIHRoZSBzdHJpbmdzCisJICAgaW4gdGhlIHNhbWUgZm9ybWF0LCBldmVuIHRob3VnaCB0aGUgcmVzdWx0IGlzIHRoYXQgdGhlCisJICAgYWJvdmUgdGVzdCBpcyBkb25lIHR3aWNlLiAqLworCisJc3dpdGNoIChyaCkgeworCWNhc2UgMDoKKwkgICAgREVDT0RFX1BSSU5URigiQUREXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAxOgorCSAgICBERUNPREVfUFJJTlRGKCJPUlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMjoKKwkgICAgREVDT0RFX1BSSU5URigiQURDXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAzOgorCSAgICBERUNPREVfUFJJTlRGKCJTQkJcdCIpOworCSAgICBicmVhazsKKwljYXNlIDQ6CisJICAgIERFQ09ERV9QUklOVEYoIkFORFx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNToKKwkgICAgREVDT0RFX1BSSU5URigiU1VCXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA2OgorCSAgICBERUNPREVfUFJJTlRGKCJYT1JcdCIpOworCSAgICBicmVhazsKKwljYXNlIDc6CisJICAgIERFQ09ERV9QUklOVEYoIkNNUFx0Iik7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisjZW5kaWYKKyAgICAvKgorICAgICAqIEtub3cgb3BlcmF0aW9uLCBkZWNvZGUgdGhlIG1vZCBieXRlIHRvIGZpbmQgdGhlIGFkZHJlc3NpbmcKKyAgICAgKiBtb2RlLgorICAgICAqLworICAgIGlmIChtb2QgPCAzKSB7CisJREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgZGVzdHZhbCxpbW07CisKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworCSAgICBpbW0gPSBmZXRjaF9sb25nX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSAoKmdlbm9wX2xvbmdfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGltbSk7CisJICAgIGlmIChyaCAhPSA3KQorCQlzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJfSBlbHNlIHsKKwkgICAgdTE2IGRlc3R2YWwsaW1tOworCisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKwkgICAgaW1tID0gZmV0Y2hfd29yZF9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gKCpnZW5vcF93b3JkX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOworCSAgICBpZiAocmggIT0gNykKKwkJc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWc7CisJICAgIHUzMiBkZXN0dmFsLGltbTsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIGltbSA9IGZldGNoX2xvbmdfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgaW1tKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGVzdHZhbCA9ICgqZ2Vub3BfbG9uZ19vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIGltbSk7CisJICAgIGlmIChyaCAhPSA3KQorCQkqZGVzdHJlZyA9IGRlc3R2YWw7CisJfSBlbHNlIHsKKwkgICAgdTE2ICpkZXN0cmVnOworCSAgICB1MTYgZGVzdHZhbCxpbW07CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBpbW0gPSBmZXRjaF93b3JkX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSAoKmdlbm9wX3dvcmRfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCBpbW0pOworCSAgICBpZiAocmggIT0gNykKKwkJKmRlc3RyZWcgPSBkZXN0dmFsOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ODIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX29wYzgyX2J5dGVfUk1fSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTggKmRlc3RyZWc7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4IGltbTsKKyAgICB1OCBkZXN0dmFsOworCisgICAgLyoKKyAgICAgKiBXZWlyZG8gc3BlY2lhbCBjYXNlIGluc3RydWN0aW9uIGZvcm1hdC4JUGFydCBvZiB0aGUgb3Bjb2RlCisgICAgICogaGVsZCBiZWxvdyBpbiAiUkgiLiAgRG91Ymx5IG5lc3RlZCBjYXNlIHdvdWxkIHJlc3VsdCwgZXhjZXB0CisgICAgICogdGhhdCB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbiBTaW1pbGFyIHRvIG9wY29kZSA4MSwgZXhjZXB0IHRoYXQKKyAgICAgKiB0aGUgaW1tZWRpYXRlIGJ5dGUgaXMgc2lnbiBleHRlbmRlZCB0byBhIHdvcmQgbGVuZ3RoLgorICAgICAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyNpZmRlZiBERUJVRworICAgIGlmIChERUJVR19ERUNPREUoKSkgeworCS8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCisJICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKKwkgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKKwkgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCisJc3dpdGNoIChyaCkgeworCWNhc2UgMDoKKwkgICAgREVDT0RFX1BSSU5URigiQUREXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAxOgorCSAgICBERUNPREVfUFJJTlRGKCJPUlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMjoKKwkgICAgREVDT0RFX1BSSU5URigiQURDXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAzOgorCSAgICBERUNPREVfUFJJTlRGKCJTQkJcdCIpOworCSAgICBicmVhazsKKwljYXNlIDQ6CisJICAgIERFQ09ERV9QUklOVEYoIkFORFx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNToKKwkgICAgREVDT0RFX1BSSU5URigiU1VCXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA2OgorCSAgICBERUNPREVfUFJJTlRGKCJYT1JcdCIpOworCSAgICBicmVhazsKKwljYXNlIDc6CisJICAgIERFQ09ERV9QUklOVEYoIkNNUFx0Iik7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisjZW5kaWYKKyAgICAvKiBrbm93IG9wZXJhdGlvbiwgZGVjb2RlIHRoZSBtb2QgYnl0ZSB0byBmaW5kIHRoZSBhZGRyZXNzaW5nCisgICAgICAgbW9kZS4gKi8KKyAgICBpZiAobW9kIDwgMykgeworCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisJaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKwlERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOworCVRSQUNFX0FORF9TVEVQKCk7CisJZGVzdHZhbCA9ICgqZ2Vub3BfYnl0ZV9vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgaW1tKTsKKwlpZiAocmggIT0gNykKKwkgICAgc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKKwlpbW0gPSBmZXRjaF9ieXRlX2ltbSgpOworCURFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwlkZXN0dmFsID0gKCpnZW5vcF9ieXRlX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgaW1tKTsKKwlpZiAocmggIT0gNykKKwkgICAgKmRlc3RyZWcgPSBkZXN0dmFsOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg4MworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfb3BjODNfd29yZF9STV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisKKyAgICAvKgorICAgICAqIFdlaXJkbyBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24gZm9ybWF0LglQYXJ0IG9mIHRoZSBvcGNvZGUKKyAgICAgKiBoZWxkIGJlbG93IGluICJSSCIuICBEb3VibHkgbmVzdGVkIGNhc2Ugd291bGQgcmVzdWx0LCBleGNlcHQKKyAgICAgKiB0aGF0IHRoZSBkZWNvZGVkIGluc3RydWN0aW9uIFNpbWlsYXIgdG8gb3Bjb2RlIDgxLCBleGNlcHQgdGhhdAorICAgICAqIHRoZSBpbW1lZGlhdGUgYnl0ZSBpcyBzaWduIGV4dGVuZGVkIHRvIGEgd29yZCBsZW5ndGguCisgICAgICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworI2lmZGVmIERFQlVHCisgICAgaWYgKERFQlVHX0RFQ09ERSgpKSB7CisJLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKKwkgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncworCSAgIGluIHRoZSBzYW1lIGZvcm1hdCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBpcyB0aGF0IHRoZQorCSAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KKyAgICAgICBzd2l0Y2ggKHJoKSB7CisJY2FzZSAwOgorCSAgICBERUNPREVfUFJJTlRGKCJBRERcdCIpOworCSAgICBicmVhazsKKwljYXNlIDE6CisJICAgIERFQ09ERV9QUklOVEYoIk9SXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAyOgorCSAgICBERUNPREVfUFJJTlRGKCJBRENcdCIpOworCSAgICBicmVhazsKKwljYXNlIDM6CisJICAgIERFQ09ERV9QUklOVEYoIlNCQlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNDoKKwkgICAgREVDT0RFX1BSSU5URigiQU5EXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA1OgorCSAgICBERUNPREVfUFJJTlRGKCJTVUJcdCIpOworCSAgICBicmVhazsKKwljYXNlIDY6CisJICAgIERFQ09ERV9QUklOVEYoIlhPUlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNzoKKwkgICAgREVDT0RFX1BSSU5URigiQ01QXHQiKTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyNlbmRpZgorICAgIC8qIGtub3cgb3BlcmF0aW9uLCBkZWNvZGUgdGhlIG1vZCBieXRlIHRvIGZpbmQgdGhlIGFkZHJlc3NpbmcKKyAgICAgICBtb2RlLiAqLworICAgIGlmIChtb2QgPCAzKSB7CisJREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCxybCk7CisKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyIGRlc3R2YWwsaW1tOworCisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisJICAgIGltbSA9IChzOCkgZmV0Y2hfYnl0ZV9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGVzdHZhbCA9ICgqZ2Vub3BfbG9uZ19vcGVyYXRpb25bcmhdKSAoZGVzdHZhbCwgaW1tKTsKKwkgICAgaWYgKHJoICE9IDcpCisJCXN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwl9IGVsc2UgeworCSAgICB1MTYgZGVzdHZhbCxpbW07CisKKwkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKwkgICAgaW1tID0gKHM4KSBmZXRjaF9ieXRlX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gKCpnZW5vcF93b3JkX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBpbW0pOworCSAgICBpZiAocmggIT0gNykKKwkJc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWc7CisJICAgIHUzMiBkZXN0dmFsLGltbTsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBpbW0gPSAoczgpIGZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSAoKmdlbm9wX2xvbmdfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCBpbW0pOworCSAgICBpZiAocmggIT0gNykKKwkJKmRlc3RyZWcgPSBkZXN0dmFsOworCX0gZWxzZSB7CisJICAgIHUxNiAqZGVzdHJlZzsKKwkgICAgdTE2IGRlc3R2YWwsaW1tOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIGltbSA9IChzOCkgZmV0Y2hfYnl0ZV9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGVzdHZhbCA9ICgqZ2Vub3Bfd29yZF9vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIGltbSk7CisJICAgIGlmIChyaCAhPSA3KQorCQkqZGVzdHJlZyA9IGRlc3R2YWw7CisJfQorICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg4NAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfdGVzdF9ieXRlX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1OCAqZGVzdHJlZywgKnNyY3JlZzsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisgICAgdTggZGVzdHZhbDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiVEVTVFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOworCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJdGVzdF9ieXRlKGRlc3R2YWwsICpzcmNyZWcpOworICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwl0ZXN0X2J5dGUoKmRlc3RyZWcsICpzcmNyZWcpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg4NQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfdGVzdF93b3JkX1JNX1IodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlRFU1RcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyIGRlc3R2YWw7CisJICAgIHUzMiAqc3JjcmVnOworCisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfbG9uZyhkZXN0b2Zmc2V0KTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICB0ZXN0X2xvbmcoZGVzdHZhbCwgKnNyY3JlZyk7CisJfSBlbHNlIHsKKwkgICAgdTE2IGRlc3R2YWw7CisJICAgIHUxNiAqc3JjcmVnOworCisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICB0ZXN0X3dvcmQoZGVzdHZhbCwgKnNyY3JlZyk7CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZywqc3JjcmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICB0ZXN0X2xvbmcoKmRlc3RyZWcsICpzcmNyZWcpOworCX0gZWxzZSB7CisJICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICB0ZXN0X3dvcmQoKmRlc3RyZWcsICpzcmNyZWcpOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ODYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3hjaGdfYnl0ZV9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTggKmRlc3RyZWcsICpzcmNyZWc7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4IGRlc3R2YWw7CisgICAgdTggdG1wOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJYQ0hHXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisJc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwl0bXAgPSAqc3JjcmVnOworCSpzcmNyZWcgPSBkZXN0dmFsOworCWRlc3R2YWwgPSB0bXA7CisJc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwl0bXAgPSAqc3JjcmVnOworCSpzcmNyZWcgPSAqZGVzdHJlZzsKKwkqZGVzdHJlZyA9IHRtcDsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ODcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3hjaGdfd29yZF9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBkZXN0b2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJYQ0hHXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKnNyY3JlZzsKKwkgICAgdTMyIGRlc3R2YWwsdG1wOworCisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgdG1wID0gKnNyY3JlZzsKKwkgICAgKnNyY3JlZyA9IGRlc3R2YWw7CisJICAgIGRlc3R2YWwgPSB0bXA7CisJICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwl9IGVsc2UgeworCSAgICB1MTYgKnNyY3JlZzsKKwkgICAgdTE2IGRlc3R2YWwsdG1wOworCisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgdG1wID0gKnNyY3JlZzsKKwkgICAgKnNyY3JlZyA9IGRlc3R2YWw7CisJICAgIGRlc3R2YWwgPSB0bXA7CisJICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwl9CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7CisJICAgIHUzMiB0bXA7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHRtcCA9ICpzcmNyZWc7CisJICAgICpzcmNyZWcgPSAqZGVzdHJlZzsKKwkgICAgKmRlc3RyZWcgPSB0bXA7CisJfSBlbHNlIHsKKwkgICAgdTE2ICpkZXN0cmVnLCpzcmNyZWc7CisJICAgIHUxNiB0bXA7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHRtcCA9ICpzcmNyZWc7CisJICAgICpzcmNyZWcgPSAqZGVzdHJlZzsKKwkgICAgKmRlc3RyZWcgPSB0bXA7CisJfQorICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg4OAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92X2J5dGVfUk1fUih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOworICAgIHVpbnQgZGVzdG9mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTU9WXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCXNyY3JlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsICpzcmNyZWcpOworICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwkqZGVzdHJlZyA9ICpzcmNyZWc7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDg5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9tb3Zfd29yZF9STV9SKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBkZXN0b2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyICpzcmNyZWc7CisKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCAqc3JjcmVnKTsKKwl9IGVsc2UgeworCSAgICB1MTYgKnNyY3JlZzsKKworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsICpzcmNyZWcpOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWcsKnNyY3JlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSAqc3JjcmVnOworCX0gZWxzZSB7CisJICAgIHUxNiAqZGVzdHJlZywqc3JjcmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9ICpzcmNyZWc7CisJfQorICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg4YQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92X2J5dGVfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHU4ICpkZXN0cmVnLCAqc3JjcmVnOworICAgIHVpbnQgc3Jjb2Zmc2V0OworICAgIHU4IHNyY3ZhbDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTU9WXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJoKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKmRlc3RyZWcgPSBzcmN2YWw7CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmgpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCSpkZXN0cmVnID0gKnNyY3JlZzsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4OGIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX21vdl93b3JkX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IHNyY29mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTU9WXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZzsKKwkgICAgdTMyIHNyY3ZhbDsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY29mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKKwl9IGVsc2UgeworCSAgICB1MTYgKmRlc3RyZWc7CisJICAgIHUxNiBzcmN2YWw7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSBzcmN2YWw7CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZywgKnNyY3JlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSAqc3JjcmVnOworCX0gZWxzZSB7CisJICAgIHUxNiAqZGVzdHJlZywgKnNyY3JlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSAqc3JjcmVnOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4OGMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX21vdl93b3JkX1JNX1NSKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTE2ICpkZXN0cmVnLCAqc3JjcmVnOworICAgIHVpbnQgZGVzdG9mZnNldDsKKyAgICB1MTYgZGVzdHZhbDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTU9WXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCXNyY3JlZyA9IGRlY29kZV9ybV9zZWdfcmVnaXN0ZXIocmgpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwlkZXN0dmFsID0gKnNyY3JlZzsKKwlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlzcmNyZWcgPSBkZWNvZGVfcm1fc2VnX3JlZ2lzdGVyKHJoKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKmRlc3RyZWcgPSAqc3JjcmVnOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg4ZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbGVhX3dvcmRfUl9NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTE2ICpzcmNyZWc7CisgICAgdWludCBkZXN0b2Zmc2V0OworCisvKgorICogVE9ETzogTmVlZCB0byBoYW5kbGUgYWRkcmVzcyBzaXplIHByZWZpeCEKKyAqCisgKiBsZWEJZWF4LFtlYXgrZWJ4KjJdID8/CisgKi8KKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTEVBXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKnNyY3JlZyA9ICh1MTYpZGVzdG9mZnNldDsKKwl9CisgICAgLyogfSBlbHNlIHsgdW5kZWZpbmVkLiAgRG8gbm90aGluZy4gfSAqLworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDhlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9tb3Zfd29yZF9TUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHUxNiAqZGVzdHJlZywgKnNyY3JlZzsKKyAgICB1aW50IHNyY29mZnNldDsKKyAgICB1MTYgc3JjdmFsOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlkZXN0cmVnID0gZGVjb2RlX3JtX3NlZ19yZWdpc3RlcihyaCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCXNyY29mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCSpkZXN0cmVnID0gc3JjdmFsOworICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJZGVzdHJlZyA9IGRlY29kZV9ybV9zZWdfcmVnaXN0ZXIocmgpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCSpkZXN0cmVnID0gKnNyY3JlZzsKKyAgICB9CisgICAgLyoKKyAgICAgKiBDbGVhbiB1cCwgYW5kIHJlc2V0IGFsbCB0aGUgUl94U1AgcG9pbnRlcnMgdG8gdGhlIGNvcnJlY3QKKyAgICAgKiBsb2NhdGlvbnMuICBUaGlzIGlzIGFib3V0IDN4IHRvbyBtdWNoIG92ZXJoZWFkIChkb2luZyBhbGwgdGhlCisgICAgICogc2VncmVnIHB0cnMgd2hlbiBvbmx5IG9uZSBpcyBuZWVkZWQsIGJ1dCB0aGlzIGluc3RydWN0aW9uCisgICAgICogKmNhbm5vdCogYmUgdGhhdCBjb21tb24sIGFuZCB0aGlzIGlzbid0IHRvbyBtdWNoIHdvcmsgYW55d2F5LgorICAgICAqLworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDhmCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wb3BfUk0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlBPUFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAocmggIT0gMCkgeworCURFQ09ERV9QUklOVEYoIklMTEVHQUwgREVDT0RFIE9GIE9QQ09ERSA4RlxuIik7CisJSEFMVF9TWVMoKTsKKyAgICB9CisgICAgaWYgKG1vZCA8IDMpIHsKKwlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyIGRlc3R2YWw7CisKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGVzdHZhbCA9IHBvcF9sb25nKCk7CisJICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwl9IGVsc2UgeworCSAgICB1MTYgZGVzdHZhbDsKKworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gcG9wX3dvcmQoKTsKKwkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCX0KKyAgICB9IGVsc2UgewkJCS8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9IHBvcF9sb25nKCk7CisJfSBlbHNlIHsKKwkgICAgdTE2ICpkZXN0cmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gcG9wX3dvcmQoKTsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDkwCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9ub3AodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTk9QXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDkxLTB4OTcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3hjaGdfd29yZF9BWF9yZWdpc3Rlcih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTMyIHRtcDsKKworICAgIG9wMSAmPSAweDc7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworCisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJdTMyICpyZWczMjsKKwlERUNPREVfUFJJTlRGKCJYQ0hHXHRFQVgsIik7CisJcmVnMzIgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihvcDEpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwl0bXAgPSBNLng4Ni5SX0VBWDsKKwlNLng4Ni5SX0VBWCA9ICpyZWczMjsKKwkqcmVnMzIgPSB0bXA7CisgICAgfSBlbHNlIHsKKwl1MTYgKnJlZzE2OworCURFQ09ERV9QUklOVEYoIlhDSEdcdEFYLCIpOworCXJlZzE2ID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIob3AxKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJdG1wID0gTS54ODYuUl9BWDsKKwlNLng4Ni5SX0VBWCA9ICpyZWcxNjsKKwkqcmVnMTYgPSAodTE2KXRtcDsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4OTgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2Nidyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlERUNPREVfUFJJTlRGKCJDV0RFXG4iKTsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYoIkNCV1xuIik7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJaWYgKE0ueDg2LlJfQVggJiAweDgwMDApIHsKKwkgICAgTS54ODYuUl9FQVggfD0gMHhmZmZmMDAwMDsKKwl9IGVsc2UgeworCSAgICBNLng4Ni5SX0VBWCAmPSAweDAwMDBmZmZmOworCX0KKyAgICB9IGVsc2UgeworCWlmIChNLng4Ni5SX0FMICYgMHg4MCkgeworCSAgICBNLng4Ni5SX0FIID0gMHhmZjsKKwl9IGVsc2UgeworCSAgICBNLng4Ni5SX0FIID0gMHgwOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4OTkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2N3ZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlERUNPREVfUFJJTlRGKCJDRFFcbiIpOworICAgIH0gZWxzZSB7CisJREVDT0RFX1BSSU5URigiQ1dEXG4iKTsKKyAgICB9CisgICAgREVDT0RFX1BSSU5URigiQ1dEXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCWlmIChNLng4Ni5SX0VBWCAmIDB4ODAwMDAwMDApIHsKKwkgICAgTS54ODYuUl9FRFggPSAweGZmZmZmZmZmOworCX0gZWxzZSB7CisJICAgIE0ueDg2LlJfRURYID0gMHgwOworCX0KKyAgICB9IGVsc2UgeworCWlmIChNLng4Ni5SX0FYICYgMHg4MDAwKSB7CisJICAgIE0ueDg2LlJfRFggPSAweGZmZmY7CisJfSBlbHNlIHsKKwkgICAgTS54ODYuUl9EWCA9IDB4MDsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDlhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9jYWxsX2Zhcl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUxNiBmYXJzZWcsIGZhcm9mZjsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisJREVDT0RFX1BSSU5URigiQ0FMTFx0Iik7CisJZmFyb2ZmID0gZmV0Y2hfd29yZF9pbW0oKTsKKwlmYXJzZWcgPSBmZXRjaF93b3JkX2ltbSgpOworCURFQ09ERV9QUklOVEYyKCIlMDR4OiIsIGZhcnNlZyk7CisJREVDT0RFX1BSSU5URjIoIiUwNHhcbiIsIGZhcm9mZik7CisJQ0FMTF9UUkFDRShNLng4Ni5zYXZlZF9jcywgTS54ODYuc2F2ZWRfaXAsIGZhcnNlZywgZmFyb2ZmLCAiRkFSICIpOworCisgICAgLyogWFhYCisgICAgICoKKyAgICAgKiBIb29rZWQgaW50ZXJydXB0IHZlY3RvcnMgY2FsbGluZyBpbnRvIG91ciAiQklPUyIgd2lsbCBjYXVzZQorICAgICAqIHByb2JsZW1zIHVubGVzcyBhbGwgaW50ZXJzZWdtZW50IHN0dWZmIGlzIGNoZWNrZWQgZm9yIEJJT1MKKyAgICAgKiBhY2Nlc3MuCUNoZWNrIG5lZWRlZCBoZXJlLiAgRm9yIG1vbWVudCwgbGV0IGl0IGFsb25lLgorICAgICAqLworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgcHVzaF93b3JkKE0ueDg2LlJfQ1MpOworICAgIE0ueDg2LlJfQ1MgPSBmYXJzZWc7CisgICAgcHVzaF93b3JkKE0ueDg2LlJfSVApOworICAgIE0ueDg2LlJfSVAgPSBmYXJvZmY7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4OWIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3dhaXQodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiV0FJVCIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgLyogTkFEQS4gICovCisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4OWMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3B1c2hmX3dvcmQodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUzMiBmbGFnczsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJREVDT0RFX1BSSU5URigiUFVTSEZEXG4iKTsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYoIlBVU0hGXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKworICAgIC8qIGNsZWFyIG91dCAqYWxsKiBiaXRzIG5vdCByZXByZXNlbnRpbmcgZmxhZ3MsIGFuZCB0dXJuIG9uIHJlYWwgYml0cyAqLworICAgIGZsYWdzID0gKE0ueDg2LlJfRUZMRyAmIEZfTVNLKSB8IEZfQUxXQVlTX09OOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCXB1c2hfbG9uZyhmbGFncyk7CisgICAgfSBlbHNlIHsKKwlwdXNoX3dvcmQoKHUxNilmbGFncyk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDlkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9wb3BmX3dvcmQodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJREVDT0RFX1BSSU5URigiUE9QRkRcbiIpOworICAgIH0gZWxzZSB7CisJREVDT0RFX1BSSU5URigiUE9QRlxuIik7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJTS54ODYuUl9FRkxHID0gcG9wX2xvbmcoKTsKKyAgICB9IGVsc2UgeworCU0ueDg2LlJfRkxHID0gcG9wX3dvcmQoKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4OWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3NhaGYodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiU0FIRlxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAvKiBjbGVhciB0aGUgbG93ZXIgYml0cyBvZiB0aGUgZmxhZyByZWdpc3RlciAqLworICAgIE0ueDg2LlJfRkxHICY9IDB4ZmZmZmZmMDA7CisgICAgLyogb3IgaW4gdGhlIEFIIHJlZ2lzdGVyIGludG8gdGhlIGZsYWdzIHJlZ2lzdGVyICovCisgICAgTS54ODYuUl9GTEcgfD0gTS54ODYuUl9BSDsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHg5ZgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbGFoZih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJMQUhGXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworCU0ueDg2LlJfQUggPSAodTgpKE0ueDg2LlJfRkxHICYgMHhmZik7CisgICAgLyp1bmRvY3VtZW50ZWQgVEMrKyBiZWhhdmlvcj8/PyBOb3BlLiAgSXQncyBkb2N1bWVudGVkLCBidXQKKyAgICAgICB5b3UgaGF2ZSB0b28gbG9vayByZWFsIGhhcmQgdG8gbm90aWNlIGl0LiAqLworICAgIE0ueDg2LlJfQUggfD0gMHgyOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGEwCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9tb3ZfQUxfTV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUxNiBvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk1PVlx0QUwsIik7CisgICAgb2Zmc2V0ID0gZmV0Y2hfd29yZF9pbW0oKTsKKyAgICBERUNPREVfUFJJTlRGMigiWyUwNHhdXG4iLCBvZmZzZXQpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9BTCA9IGZldGNoX2RhdGFfYnl0ZShvZmZzZXQpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGExCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9tb3ZfQVhfTV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUxNiBvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIG9mZnNldCA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJREVDT0RFX1BSSU5URjIoIk1PVlx0RUFYLFslMDR4XVxuIiwgb2Zmc2V0KTsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYyKCJNT1ZcdEFYLFslMDR4XVxuIiwgb2Zmc2V0KTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlNLng4Ni5SX0VBWCA9IGZldGNoX2RhdGFfbG9uZyhvZmZzZXQpOworICAgIH0gZWxzZSB7CisJTS54ODYuUl9BWCA9IGZldGNoX2RhdGFfd29yZChvZmZzZXQpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhhMgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92X01fQUxfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1MTYgb2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZcdCIpOworICAgIG9mZnNldCA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgREVDT0RFX1BSSU5URjIoIlslMDR4XSxBTFxuIiwgb2Zmc2V0KTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIHN0b3JlX2RhdGFfYnl0ZShvZmZzZXQsIE0ueDg2LlJfQUwpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGEzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9tb3ZfTV9BWF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUxNiBvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIG9mZnNldCA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJREVDT0RFX1BSSU5URjIoIk1PVlx0WyUwNHhdLEVBWFxuIiwgb2Zmc2V0KTsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYyKCJNT1ZcdFslMDR4XSxBWFxuIiwgb2Zmc2V0KTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlzdG9yZV9kYXRhX2xvbmcob2Zmc2V0LCBNLng4Ni5SX0VBWCk7CisgICAgfSBlbHNlIHsKKwlzdG9yZV9kYXRhX3dvcmQob2Zmc2V0LCBNLng4Ni5SX0FYKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YTQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX21vdnNfYnl0ZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTgJdmFsOworICAgIHUzMiBjb3VudDsKKyAgICBpbnQgaW5jOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZTXHRCWVRFXG4iKTsKKyAgICBpZiAoQUNDRVNTX0ZMQUcoRl9ERikpICAgLyogZG93biAqLworCWluYyA9IC0xOworICAgIGVsc2UKKwlpbmMgPSAxOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgY291bnQgPSAxOworICAgIGlmIChNLng4Ni5tb2RlICYgKFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSkpIHsKKwkvKiBkb250IGNhcmUgd2hldGhlciBSRVBFIG9yIFJFUE5FICovCisJLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCisJY291bnQgPSBNLng4Ni5SX0NYOworCU0ueDg2LlJfQ1ggPSAwOworCU0ueDg2Lm1vZGUgJj0gfihTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpOworICAgIH0KKyAgICB3aGlsZSAoY291bnQtLSkgeworCXZhbCA9IGZldGNoX2RhdGFfYnl0ZShNLng4Ni5SX1NJKTsKKwlzdG9yZV9kYXRhX2J5dGVfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREksIHZhbCk7CisJTS54ODYuUl9TSSArPSBpbmM7CisJTS54ODYuUl9ESSArPSBpbmM7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGE1CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9tb3ZzX3dvcmQodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUzMiB2YWw7CisgICAgaW50IGluYzsKKyAgICB1MzIgY291bnQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCURFQ09ERV9QUklOVEYoIk1PVlNcdERXT1JEXG4iKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpCSAgICAvKiBkb3duICovCisJICAgIGluYyA9IC00OworCWVsc2UKKwkgICAgaW5jID0gNDsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYoIk1PVlNcdFdPUkRcbiIpOworCWlmIChBQ0NFU1NfRkxBRyhGX0RGKSkJICAgIC8qIGRvd24gKi8KKwkgICAgaW5jID0gLTI7CisJZWxzZQorCSAgICBpbmMgPSAyOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGNvdW50ID0gMTsKKyAgICBpZiAoTS54ODYubW9kZSAmIChTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpKSB7CisJLyogZG9udCBjYXJlIHdoZXRoZXIgUkVQRSBvciBSRVBORSAqLworCS8qIG1vdmUgdGhlbSB1bnRpbCBDWCBpcyBaRVJPLiAqLworCWNvdW50ID0gTS54ODYuUl9DWDsKKwlNLng4Ni5SX0NYID0gMDsKKwlNLng4Ni5tb2RlICY9IH4oU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKTsKKyAgICB9CisgICAgd2hpbGUgKGNvdW50LS0pIHsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdmFsID0gZmV0Y2hfZGF0YV9sb25nKE0ueDg2LlJfU0kpOworCSAgICBzdG9yZV9kYXRhX2xvbmdfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREksIHZhbCk7CisJfSBlbHNlIHsKKwkgICAgdmFsID0gZmV0Y2hfZGF0YV93b3JkKE0ueDg2LlJfU0kpOworCSAgICBzdG9yZV9kYXRhX3dvcmRfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREksICh1MTYpdmFsKTsKKwl9CisJTS54ODYuUl9TSSArPSBpbmM7CisJTS54ODYuUl9ESSArPSBpbmM7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGE2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9jbXBzX2J5dGUodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHM4IHZhbDEsIHZhbDI7CisgICAgaW50IGluYzsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQ01QU1x0QllURVxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoQUNDRVNTX0ZMQUcoRl9ERikpICAgLyogZG93biAqLworCWluYyA9IC0xOworICAgIGVsc2UKKwlpbmMgPSAxOworCisgICAgaWYgKE0ueDg2Lm1vZGUgJiAoU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKSkgeworCS8qIFJFUEUJICovCisJLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCisJd2hpbGUgKE0ueDg2LlJfQ1ggIT0gMCkgeworCSAgICB2YWwxID0gZmV0Y2hfZGF0YV9ieXRlKE0ueDg2LlJfU0kpOworCSAgICB2YWwyID0gZmV0Y2hfZGF0YV9ieXRlX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKKwkJICAgICBjbXBfYnl0ZSh2YWwxLCB2YWwyKTsKKwkgICAgTS54ODYuUl9DWCAtPSAxOworCSAgICBNLng4Ni5SX1NJICs9IGluYzsKKwkgICAgTS54ODYuUl9ESSArPSBpbmM7CisJICAgIGlmICggKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9SRVBFKSAmJiAoQUNDRVNTX0ZMQUcoRl9aRikgPT0gMCkgKSBicmVhazsKKwkgICAgaWYgKCAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX1JFUE5FKSAmJiBBQ0NFU1NfRkxBRyhGX1pGKSApIGJyZWFrOworCX0KKwlNLng4Ni5tb2RlICY9IH4oU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKTsKKyAgICB9IGVsc2UgeworCXZhbDEgPSBmZXRjaF9kYXRhX2J5dGUoTS54ODYuUl9TSSk7CisJdmFsMiA9IGZldGNoX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7CisJY21wX2J5dGUodmFsMSwgdmFsMik7CisJTS54ODYuUl9TSSArPSBpbmM7CisJTS54ODYuUl9ESSArPSBpbmM7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGE3CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9jbXBzX3dvcmQodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUzMiB2YWwxLHZhbDI7CisgICAgaW50IGluYzsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJREVDT0RFX1BSSU5URigiQ01QU1x0RFdPUkRcbiIpOworCWluYyA9IDQ7CisgICAgfSBlbHNlIHsKKwlERUNPREVfUFJJTlRGKCJDTVBTXHRXT1JEXG4iKTsKKwlpbmMgPSAyOworICAgIH0KKyAgICBpZiAoQUNDRVNTX0ZMQUcoRl9ERikpICAgLyogZG93biAqLworCWluYyA9IC1pbmM7CisKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgKFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSkpIHsKKwkvKiBSRVBFCSAqLworCS8qIG1vdmUgdGhlbSB1bnRpbCBDWCBpcyBaRVJPLiAqLworCXdoaWxlIChNLng4Ni5SX0NYICE9IDApIHsKKwkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJCXZhbDEgPSBmZXRjaF9kYXRhX2xvbmcoTS54ODYuUl9TSSk7CisJCXZhbDIgPSBmZXRjaF9kYXRhX2xvbmdfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOworCQljbXBfbG9uZyh2YWwxLCB2YWwyKTsKKwkgICAgfSBlbHNlIHsKKwkJdmFsMSA9IGZldGNoX2RhdGFfd29yZChNLng4Ni5SX1NJKTsKKwkJdmFsMiA9IGZldGNoX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7CisJCWNtcF93b3JkKCh1MTYpdmFsMSwgKHUxNil2YWwyKTsKKwkgICAgfQorCSAgICBNLng4Ni5SX0NYIC09IDE7CisJICAgIE0ueDg2LlJfU0kgKz0gaW5jOworCSAgICBNLng4Ni5SX0RJICs9IGluYzsKKwkgICAgaWYgKCAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX1JFUEUpICYmIEFDQ0VTU19GTEFHKEZfWkYpID09IDAgKSBicmVhazsKKwkgICAgaWYgKCAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX1JFUE5FKSAmJiBBQ0NFU1NfRkxBRyhGX1pGKSApIGJyZWFrOworCX0KKwlNLng4Ni5tb2RlICY9IH4oU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKTsKKyAgICB9IGVsc2UgeworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB2YWwxID0gZmV0Y2hfZGF0YV9sb25nKE0ueDg2LlJfU0kpOworCSAgICB2YWwyID0gZmV0Y2hfZGF0YV9sb25nX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKKwkgICAgY21wX2xvbmcodmFsMSwgdmFsMik7CisJfSBlbHNlIHsKKwkgICAgdmFsMSA9IGZldGNoX2RhdGFfd29yZChNLng4Ni5SX1NJKTsKKwkgICAgdmFsMiA9IGZldGNoX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7CisJICAgIGNtcF93b3JkKCh1MTYpdmFsMSwgKHUxNil2YWwyKTsKKwl9CisJTS54ODYuUl9TSSArPSBpbmM7CisJTS54ODYuUl9ESSArPSBpbmM7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGE4CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF90ZXN0X0FMX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IGltbTsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiVEVTVFx0QUwsIik7CisgICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBERUNPREVfUFJJTlRGMigiJTA0eFxuIiwgaW1tKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworCXRlc3RfYnl0ZShNLng4Ni5SX0FMLCAodTgpaW1tKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhhOQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfdGVzdF9BWF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUzMiBzcmN2YWw7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCURFQ09ERV9QUklOVEYoIlRFU1RcdEVBWCwiKTsKKwlzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOworICAgIH0gZWxzZSB7CisJREVDT0RFX1BSSU5URigiVEVTVFx0QVgsIik7CisJc3JjdmFsID0gZmV0Y2hfd29yZF9pbW0oKTsKKyAgICB9CisgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBzcmN2YWwpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJdGVzdF9sb25nKE0ueDg2LlJfRUFYLCBzcmN2YWwpOworICAgIH0gZWxzZSB7CisJdGVzdF93b3JkKE0ueDg2LlJfQVgsICh1MTYpc3JjdmFsKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YWEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3N0b3NfYnl0ZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IGluYzsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiU1RPU1x0QllURVxuIik7CisgICAgaWYgKEFDQ0VTU19GTEFHKEZfREYpKSAgIC8qIGRvd24gKi8KKwlpbmMgPSAtMTsKKyAgICBlbHNlCisJaW5jID0gMTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgKFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSkpIHsKKwkvKiBkb250IGNhcmUgd2hldGhlciBSRVBFIG9yIFJFUE5FICovCisJLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCisJd2hpbGUgKE0ueDg2LlJfQ1ggIT0gMCkgeworCSAgICBzdG9yZV9kYXRhX2J5dGVfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREksIE0ueDg2LlJfQUwpOworCSAgICBNLng4Ni5SX0NYIC09IDE7CisJICAgIE0ueDg2LlJfREkgKz0gaW5jOworCX0KKwlNLng4Ni5tb2RlICY9IH4oU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKTsKKyAgICB9IGVsc2UgeworCXN0b3JlX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwgTS54ODYuUl9BTCk7CisJTS54ODYuUl9ESSArPSBpbmM7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGFiCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9zdG9zX3dvcmQodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBpbmM7CisgICAgdTMyIGNvdW50OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlERUNPREVfUFJJTlRGKCJTVE9TXHREV09SRFxuIik7CisJaWYgKEFDQ0VTU19GTEFHKEZfREYpKQkgLyogZG93biAqLworCSAgICBpbmMgPSAtNDsKKwllbHNlCisJICAgIGluYyA9IDQ7CisgICAgfSBlbHNlIHsKKwlERUNPREVfUFJJTlRGKCJTVE9TXHRXT1JEXG4iKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpCSAvKiBkb3duICovCisJICAgIGluYyA9IC0yOworCWVsc2UKKwkgICAgaW5jID0gMjsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBjb3VudCA9IDE7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiAoU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKSkgeworCS8qIGRvbnQgY2FyZSB3aGV0aGVyIFJFUEUgb3IgUkVQTkUgKi8KKwkvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KKwljb3VudCA9IE0ueDg2LlJfQ1g7CisJTS54ODYuUl9DWCA9IDA7CisJTS54ODYubW9kZSAmPSB+KFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSk7CisgICAgfQorICAgIHdoaWxlIChjb3VudC0tKSB7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHN0b3JlX2RhdGFfbG9uZ19hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwgTS54ODYuUl9FQVgpOworCX0gZWxzZSB7CisJICAgIHN0b3JlX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwgTS54ODYuUl9BWCk7CisJfQorCU0ueDg2LlJfREkgKz0gaW5jOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhhYworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbG9kc19ieXRlKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgaW5jOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJMT0RTXHRCWVRFXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgICAvKiBkb3duICovCisJaW5jID0gLTE7CisgICAgZWxzZQorCWluYyA9IDE7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiAoU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKSkgeworCS8qIGRvbnQgY2FyZSB3aGV0aGVyIFJFUEUgb3IgUkVQTkUgKi8KKwkvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KKwl3aGlsZSAoTS54ODYuUl9DWCAhPSAwKSB7CisJICAgIE0ueDg2LlJfQUwgPSBmZXRjaF9kYXRhX2J5dGUoTS54ODYuUl9TSSk7CisJICAgIE0ueDg2LlJfQ1ggLT0gMTsKKwkgICAgTS54ODYuUl9TSSArPSBpbmM7CisJfQorCU0ueDg2Lm1vZGUgJj0gfihTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpOworICAgIH0gZWxzZSB7CisJTS54ODYuUl9BTCA9IGZldGNoX2RhdGFfYnl0ZShNLng4Ni5SX1NJKTsKKwlNLng4Ni5SX1NJICs9IGluYzsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YWQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2xvZHNfd29yZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IGluYzsKKyAgICB1MzIgY291bnQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCURFQ09ERV9QUklOVEYoIkxPRFNcdERXT1JEXG4iKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpCSAvKiBkb3duICovCisJICAgIGluYyA9IC00OworCWVsc2UKKwkgICAgaW5jID0gNDsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYoIkxPRFNcdFdPUkRcbiIpOworCWlmIChBQ0NFU1NfRkxBRyhGX0RGKSkJIC8qIGRvd24gKi8KKwkgICAgaW5jID0gLTI7CisJZWxzZQorCSAgICBpbmMgPSAyOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGNvdW50ID0gMTsKKyAgICBpZiAoTS54ODYubW9kZSAmIChTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpKSB7CisJLyogZG9udCBjYXJlIHdoZXRoZXIgUkVQRSBvciBSRVBORSAqLworCS8qIG1vdmUgdGhlbSB1bnRpbCBDWCBpcyBaRVJPLiAqLworCWNvdW50ID0gTS54ODYuUl9DWDsKKwlNLng4Ni5SX0NYID0gMDsKKwlNLng4Ni5tb2RlICY9IH4oU1lTTU9ERV9QUkVGSVhfUkVQRSB8IFNZU01PREVfUFJFRklYX1JFUE5FKTsKKyAgICB9CisgICAgd2hpbGUgKGNvdW50LS0pIHsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgTS54ODYuUl9FQVggPSBmZXRjaF9kYXRhX2xvbmcoTS54ODYuUl9TSSk7CisJfSBlbHNlIHsKKwkgICAgTS54ODYuUl9BWCA9IGZldGNoX2RhdGFfd29yZChNLng4Ni5SX1NJKTsKKwl9CisJTS54ODYuUl9TSSArPSBpbmM7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGFlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9zY2FzX2J5dGUodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHM4IHZhbDI7CisgICAgaW50IGluYzsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiU0NBU1x0QllURVxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoQUNDRVNTX0ZMQUcoRl9ERikpICAgLyogZG93biAqLworCWluYyA9IC0xOworICAgIGVsc2UKKwlpbmMgPSAxOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfUkVQRSkgeworCS8qIFJFUEUJICovCisJLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCisJd2hpbGUgKE0ueDg2LlJfQ1ggIT0gMCkgeworCSAgICB2YWwyID0gZmV0Y2hfZGF0YV9ieXRlX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKKwkgICAgY21wX2J5dGUoTS54ODYuUl9BTCwgdmFsMik7CisJICAgIE0ueDg2LlJfQ1ggLT0gMTsKKwkgICAgTS54ODYuUl9ESSArPSBpbmM7CisJICAgIGlmIChBQ0NFU1NfRkxBRyhGX1pGKSA9PSAwKQorCQlicmVhazsKKwl9CisJTS54ODYubW9kZSAmPSB+U1lTTU9ERV9QUkVGSVhfUkVQRTsKKyAgICB9IGVsc2UgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9SRVBORSkgeworCS8qIFJFUE5FICAqLworCS8qIG1vdmUgdGhlbSB1bnRpbCBDWCBpcyBaRVJPLiAqLworCXdoaWxlIChNLng4Ni5SX0NYICE9IDApIHsKKwkgICAgdmFsMiA9IGZldGNoX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7CisJICAgIGNtcF9ieXRlKE0ueDg2LlJfQUwsIHZhbDIpOworCSAgICBNLng4Ni5SX0NYIC09IDE7CisJICAgIE0ueDg2LlJfREkgKz0gaW5jOworCSAgICBpZiAoQUNDRVNTX0ZMQUcoRl9aRikpCisJCWJyZWFrOwkJLyogemVybyBmbGFnIHNldCBtZWFucyBlcXVhbCAqLworCX0KKwlNLng4Ni5tb2RlICY9IH5TWVNNT0RFX1BSRUZJWF9SRVBORTsKKyAgICB9IGVsc2UgeworCXZhbDIgPSBmZXRjaF9kYXRhX2J5dGVfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOworCWNtcF9ieXRlKE0ueDg2LlJfQUwsIHZhbDIpOworCU0ueDg2LlJfREkgKz0gaW5jOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhhZgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfc2Nhc193b3JkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgaW5jOworICAgIHUzMiB2YWw7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCURFQ09ERV9QUklOVEYoIlNDQVNcdERXT1JEXG4iKTsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9ERikpCSAvKiBkb3duICovCisJICAgIGluYyA9IC00OworCWVsc2UKKwkgICAgaW5jID0gNDsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYoIlNDQVNcdFdPUkRcbiIpOworCWlmIChBQ0NFU1NfRkxBRyhGX0RGKSkJIC8qIGRvd24gKi8KKwkgICAgaW5jID0gLTI7CisJZWxzZQorCSAgICBpbmMgPSAyOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfUkVQRSkgeworCS8qIFJFUEUJICovCisJLyogbW92ZSB0aGVtIHVudGlsIENYIGlzIFpFUk8uICovCisJd2hpbGUgKE0ueDg2LlJfQ1ggIT0gMCkgeworCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkJdmFsID0gZmV0Y2hfZGF0YV9sb25nX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKKwkJY21wX2xvbmcoTS54ODYuUl9FQVgsIHZhbCk7CisJICAgIH0gZWxzZSB7CisJCXZhbCA9IGZldGNoX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7CisJCWNtcF93b3JkKE0ueDg2LlJfQVgsICh1MTYpdmFsKTsKKwkgICAgfQorCSAgICBNLng4Ni5SX0NYIC09IDE7CisJICAgIE0ueDg2LlJfREkgKz0gaW5jOworCSAgICBpZiAoQUNDRVNTX0ZMQUcoRl9aRikgPT0gMCkKKwkJYnJlYWs7CisJfQorCU0ueDg2Lm1vZGUgJj0gflNZU01PREVfUFJFRklYX1JFUEU7CisgICAgfSBlbHNlIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfUkVQTkUpIHsKKwkvKiBSRVBORSAgKi8KKwkvKiBtb3ZlIHRoZW0gdW50aWwgQ1ggaXMgWkVSTy4gKi8KKwl3aGlsZSAoTS54ODYuUl9DWCAhPSAwKSB7CisJICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCQl2YWwgPSBmZXRjaF9kYXRhX2xvbmdfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREkpOworCQljbXBfbG9uZyhNLng4Ni5SX0VBWCwgdmFsKTsKKwkgICAgfSBlbHNlIHsKKwkJdmFsID0gZmV0Y2hfZGF0YV93b3JkX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJKTsKKwkJY21wX3dvcmQoTS54ODYuUl9BWCwgKHUxNil2YWwpOworCSAgICB9CisJICAgIE0ueDg2LlJfQ1ggLT0gMTsKKwkgICAgTS54ODYuUl9ESSArPSBpbmM7CisJICAgIGlmIChBQ0NFU1NfRkxBRyhGX1pGKSkKKwkJYnJlYWs7CQkvKiB6ZXJvIGZsYWcgc2V0IG1lYW5zIGVxdWFsICovCisJfQorCU0ueDg2Lm1vZGUgJj0gflNZU01PREVfUFJFRklYX1JFUE5FOworICAgIH0gZWxzZSB7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHZhbCA9IGZldGNoX2RhdGFfbG9uZ19hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7CisJICAgIGNtcF9sb25nKE0ueDg2LlJfRUFYLCB2YWwpOworCX0gZWxzZSB7CisJICAgIHZhbCA9IGZldGNoX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSk7CisJICAgIGNtcF93b3JkKE0ueDg2LlJfQVgsICh1MTYpdmFsKTsKKwl9CisJTS54ODYuUl9ESSArPSBpbmM7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGIwIC0gMHhiNworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92X2J5dGVfcmVnaXN0ZXJfSU1NKHU4IG9wMSkKK3sKKyAgICB1OCBpbW0sICpwdHI7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk1PVlx0Iik7CisgICAgcHRyID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIob3AxICYgMHg3KTsKKyAgICBERUNPREVfUFJJTlRGKCIsIik7CisgICAgaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICAqcHRyID0gaW1tOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGI4IC0gMHhiZgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92X3dvcmRfcmVnaXN0ZXJfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1MzIgc3JjdmFsOworCisgICAgb3AxICY9IDB4NzsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTU9WXHQiKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwl1MzIgKnJlZzMyOworCXJlZzMyID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIob3AxKTsKKwlzcmN2YWwgPSBmZXRjaF9sb25nX2ltbSgpOworCURFQ09ERV9QUklOVEYyKCIsJXhcbiIsIHNyY3ZhbCk7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwkqcmVnMzIgPSBzcmN2YWw7CisgICAgfSBlbHNlIHsKKwl1MTYgKnJlZzE2OworCXJlZzE2ID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIob3AxKTsKKwlzcmN2YWwgPSBmZXRjaF93b3JkX2ltbSgpOworCURFQ09ERV9QUklOVEYyKCIsJXhcbiIsIHNyY3ZhbCk7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwkqcmVnMTYgPSAodTE2KXNyY3ZhbDsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YzAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX29wY0MwX2J5dGVfUk1fTUVNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTggKmRlc3RyZWc7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4IGRlc3R2YWw7CisgICAgdTggYW10OworCisgICAgLyoKKyAgICAgKiBZZXQgYW5vdGhlciB3ZWlyZG8gc3BlY2lhbCBjYXNlIGluc3RydWN0aW9uIGZvcm1hdC4gIFBhcnQgb2YKKyAgICAgKiB0aGUgb3Bjb2RlIGhlbGQgYmVsb3cgaW4gIlJIIi4gIERvdWJseSBuZXN0ZWQgY2FzZSB3b3VsZAorICAgICAqIHJlc3VsdCwgZXhjZXB0IHRoYXQgdGhlIGRlY29kZWQgaW5zdHJ1Y3Rpb24KKyAgICAgKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisjaWZkZWYgREVCVUcKKyAgICBpZiAoREVCVUdfREVDT0RFKCkpIHsKKwkvKiBYWFggREVDT0RFX1BSSU5URiBtYXkgYmUgY2hhbmdlZCB0byBzb21ldGhpbmcgbW9yZQorCSAgIGdlbmVyYWwsIHNvIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRvIGxlYXZlIHRoZSBzdHJpbmdzCisJICAgaW4gdGhlIHNhbWUgZm9ybWF0LCBldmVuIHRob3VnaCB0aGUgcmVzdWx0IGlzIHRoYXQgdGhlCisJICAgYWJvdmUgdGVzdCBpcyBkb25lIHR3aWNlLiAqLworCisJc3dpdGNoIChyaCkgeworCWNhc2UgMDoKKwkgICAgREVDT0RFX1BSSU5URigiUk9MXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAxOgorCSAgICBERUNPREVfUFJJTlRGKCJST1JcdCIpOworCSAgICBicmVhazsKKwljYXNlIDI6CisJICAgIERFQ09ERV9QUklOVEYoIlJDTFx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMzoKKwkgICAgREVDT0RFX1BSSU5URigiUkNSXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA0OgorCSAgICBERUNPREVfUFJJTlRGKCJTSExcdCIpOworCSAgICBicmVhazsKKwljYXNlIDU6CisJICAgIERFQ09ERV9QUklOVEYoIlNIUlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNjoKKwkgICAgREVDT0RFX1BSSU5URigiU0FMXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA3OgorCSAgICBERUNPREVfUFJJTlRGKCJTQVJcdCIpOworCSAgICBicmVhazsKKwl9CisgICAgfQorI2VuZGlmCisgICAgLyoga25vdyBvcGVyYXRpb24sIGRlY29kZSB0aGUgbW9kIGJ5dGUgdG8gZmluZCB0aGUgYWRkcmVzc2luZworICAgICAgIG1vZGUuICovCisgICAgaWYgKG1vZCA8IDMpIHsKKwlERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKKwlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlhbXQgPSBmZXRjaF9ieXRlX2ltbSgpOworCURFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGFtdCk7CisJZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCWRlc3R2YWwgPSAoKm9wY0QwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7CisJc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKKwlhbXQgPSBmZXRjaF9ieXRlX2ltbSgpOworCURFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGFtdCk7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwlkZXN0dmFsID0gKCpvcGNEMF9ieXRlX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgYW10KTsKKwkqZGVzdHJlZyA9IGRlc3R2YWw7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGMxCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9vcGNDMV93b3JkX1JNX01FTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKyAgICB1OCBhbXQ7CisKKyAgICAvKgorICAgICAqIFlldCBhbm90aGVyIHdlaXJkbyBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgUGFydCBvZgorICAgICAqIHRoZSBvcGNvZGUgaGVsZCBiZWxvdyBpbiAiUkgiLiAgRG91Ymx5IG5lc3RlZCBjYXNlIHdvdWxkCisgICAgICogcmVzdWx0LCBleGNlcHQgdGhhdCB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbgorICAgICAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyNpZmRlZiBERUJVRworICAgIGlmIChERUJVR19ERUNPREUoKSkgeworCS8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCisJICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKKwkgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKKwkgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCisKKwlzd2l0Y2ggKHJoKSB7CisJY2FzZSAwOgorCSAgICBERUNPREVfUFJJTlRGKCJST0xcdCIpOworCSAgICBicmVhazsKKwljYXNlIDE6CisJICAgIERFQ09ERV9QUklOVEYoIlJPUlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMjoKKwkgICAgREVDT0RFX1BSSU5URigiUkNMXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAzOgorCSAgICBERUNPREVfUFJJTlRGKCJSQ1JcdCIpOworCSAgICBicmVhazsKKwljYXNlIDQ6CisJICAgIERFQ09ERV9QUklOVEYoIlNITFx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNToKKwkgICAgREVDT0RFX1BSSU5URigiU0hSXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA2OgorCSAgICBERUNPREVfUFJJTlRGKCJTQUxcdCIpOworCSAgICBicmVhazsKKwljYXNlIDc6CisJICAgIERFQ09ERV9QUklOVEYoIlNBUlx0Iik7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisjZW5kaWYKKyAgICAvKiBrbm93IG9wZXJhdGlvbiwgZGVjb2RlIHRoZSBtb2QgYnl0ZSB0byBmaW5kIHRoZSBhZGRyZXNzaW5nCisgICAgICAgbW9kZS4gKi8KKyAgICBpZiAobW9kIDwgMykgeworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgZGVzdHZhbDsKKworCSAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7CisJICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCSAgICBhbXQgPSBmZXRjaF9ieXRlX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBhbXQpOworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gKCpvcGNEMV9sb25nX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOworCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJfSBlbHNlIHsKKwkgICAgdTE2IGRlc3R2YWw7CisKKwkgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7CisJICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCSAgICBhbXQgPSBmZXRjaF9ieXRlX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBhbXQpOworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gKCpvcGNEMV93b3JkX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOworCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBhbXQgPSBmZXRjaF9ieXRlX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBhbXQpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9ICgqb3BjRDFfbG9uZ19vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIGFtdCk7CisJfSBlbHNlIHsKKwkgICAgdTE2ICpkZXN0cmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIGFtdCA9IGZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGFtdCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gKCpvcGNEMV93b3JkX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgYW10KTsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGMyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9yZXRfbmVhcl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUxNiBpbW07CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlJFVFx0Iik7CisgICAgaW1tID0gZmV0Y2hfd29yZF9pbW0oKTsKKyAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGltbSk7CisJUkVUVVJOX1RSQUNFKCJSRVQiLE0ueDg2LnNhdmVkX2NzLE0ueDg2LnNhdmVkX2lwKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfSVAgPSBwb3Bfd29yZCgpOworICAgIE0ueDg2LlJfU1AgKz0gaW1tOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGMzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9yZXRfbmVhcih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJSRVRcbiIpOworCVJFVFVSTl9UUkFDRSgiUkVUIixNLng4Ni5zYXZlZF9jcyxNLng4Ni5zYXZlZF9pcCk7CisJVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0lQID0gcG9wX3dvcmQoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhjNAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbGVzX1JfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCByaCwgcmw7CisgICAgdTE2ICpkc3RyZWc7CisgICAgdWludCBzcmNvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkxFU1x0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCWRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKmRzdHJlZyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworCU0ueDg2LlJfRVMgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0ICsgMik7CisgICAgfQorICAgIC8qIGVsc2UgVU5ERUZJTkVEIQkJCSByZWdpc3RlciB0byByZWdpc3RlciAqLworCisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4YzUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2xkc19SX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmgsIHJsOworICAgIHUxNiAqZHN0cmVnOworICAgIHVpbnQgc3Jjb2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJMRFNcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCXNyY29mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCSpkc3RyZWcgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKwlNLng4Ni5SX0RTID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCArIDIpOworICAgIH0KKyAgICAvKiBlbHNlIFVOREVGSU5FRCEgKi8KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhjNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92X2J5dGVfUk1fSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTggKmRlc3RyZWc7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4IGltbTsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTU9WXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChyaCAhPSAwKSB7CisJREVDT0RFX1BSSU5URigiSUxMRUdBTCBERUNPREUgT0YgT1BDT0RFIGM2XG4iKTsKKwlIQUxUX1NZUygpOworICAgIH0KKyAgICBpZiAobW9kIDwgMykgeworCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCWltbSA9IGZldGNoX2J5dGVfaW1tKCk7CisJREVDT0RFX1BSSU5URjIoIiwlMnhcbiIsIGltbSk7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwlzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgaW1tKTsKKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisJaW1tID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKwlERUNPREVfUFJJTlRGMigiLCUyeFxuIiwgaW1tKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCSpkZXN0cmVnID0gaW1tOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhjNworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbW92X3dvcmRfUk1fSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBkZXN0b2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKHJoICE9IDApIHsKKwlERUNPREVfUFJJTlRGKCJJTExFR0FMIERFQ09ERSBPRiBPUENPREUgOEZcbiIpOworCUhBTFRfU1lTKCk7CisgICAgfQorICAgIGlmIChtb2QgPCAzKSB7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiBpbW07CisKKwkgICAgREVDT0RFX1BSSU5URigiRFdPUkQgUFRSICIpOworCSAgICBkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwkgICAgaW1tID0gZmV0Y2hfbG9uZ19pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiwleFxuIiwgaW1tKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGltbSk7CisJfSBlbHNlIHsKKwkgICAgdTE2IGltbTsKKworCSAgICBERUNPREVfUFJJTlRGKCJXT1JEIFBUUiAiKTsKKwkgICAgZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIGltbSk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBpbW0pOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCQkJdTMyICpkZXN0cmVnOworCQkJdTMyIGltbTsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBpbW0gPSBmZXRjaF9sb25nX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9IGltbTsKKwl9IGVsc2UgeworCQkJdTE2ICpkZXN0cmVnOworCQkJdTE2IGltbTsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCSAgICBpbW0gPSBmZXRjaF93b3JkX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiLCV4XG4iLCBpbW0pOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9IGltbTsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGM4CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9lbnRlcih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTE2IGxvY2FsLGZyYW1lX3BvaW50ZXI7CisgICAgdTgJbmVzdGluZzsKKyAgICBpbnQgaTsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgbG9jYWwgPSBmZXRjaF93b3JkX2ltbSgpOworICAgIG5lc3RpbmcgPSBmZXRjaF9ieXRlX2ltbSgpOworICAgIERFQ09ERV9QUklOVEYyKCJFTlRFUiAleFxuIiwgbG9jYWwpOworICAgIERFQ09ERV9QUklOVEYyKCIsJXhcbiIsIG5lc3RpbmcpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgcHVzaF93b3JkKE0ueDg2LlJfQlApOworICAgIGZyYW1lX3BvaW50ZXIgPSBNLng4Ni5SX1NQOworICAgIGlmIChuZXN0aW5nID4gMCkgeworCWZvciAoaSA9IDE7IGkgPCBuZXN0aW5nOyBpKyspIHsKKwkgICAgTS54ODYuUl9CUCAtPSAyOworCSAgICBwdXNoX3dvcmQoZmV0Y2hfZGF0YV93b3JkX2FicyhNLng4Ni5SX1NTLCBNLng4Ni5SX0JQKSk7CisJICAgIH0KKwlwdXNoX3dvcmQoZnJhbWVfcG9pbnRlcik7CisJfQorICAgIE0ueDg2LlJfQlAgPSBmcmFtZV9wb2ludGVyOworICAgIE0ueDg2LlJfU1AgPSAodTE2KShNLng4Ni5SX1NQIC0gbG9jYWwpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGM5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9sZWF2ZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJMRUFWRVxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX1NQID0gTS54ODYuUl9CUDsKKyAgICBNLng4Ni5SX0JQID0gcG9wX3dvcmQoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhjYQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfcmV0X2Zhcl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUxNiBpbW07CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlJFVEZcdCIpOworICAgIGltbSA9IGZldGNoX3dvcmRfaW1tKCk7CisgICAgREVDT0RFX1BSSU5URjIoIiV4XG4iLCBpbW0pOworCVJFVFVSTl9UUkFDRSgiUkVURiIsTS54ODYuc2F2ZWRfY3MsTS54ODYuc2F2ZWRfaXApOworCVRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9JUCA9IHBvcF93b3JkKCk7CisgICAgTS54ODYuUl9DUyA9IHBvcF93b3JkKCk7CisgICAgTS54ODYuUl9TUCArPSBpbW07CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4Y2IKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3JldF9mYXIodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUkVURlxuIik7CisJUkVUVVJOX1RSQUNFKCJSRVRGIixNLng4Ni5zYXZlZF9jcyxNLng4Ni5zYXZlZF9pcCk7CisJVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0lQID0gcG9wX3dvcmQoKTsKKyAgICBNLng4Ni5SX0NTID0gcG9wX3dvcmQoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhjYworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfaW50Myh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTE2IHRtcDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSU5UIDNcbiIpOworICAgIHRtcCA9ICh1MTYpIG1lbV9hY2Nlc3Nfd29yZCgzICogNCArIDIpOworICAgIC8qIGFjY2VzcyB0aGUgc2VnbWVudCByZWdpc3RlciAqLworICAgIFRSQUNFX0FORF9TVEVQKCk7CisJaWYgKF9YODZFTVVfaW50clRhYlszXSkgeworCQkoKl9YODZFTVVfaW50clRhYlszXSkoMyk7CisgICAgfSBlbHNlIHsKKwlwdXNoX3dvcmQoKHUxNilNLng4Ni5SX0ZMRyk7CisJQ0xFQVJfRkxBRyhGX0lGKTsKKwlDTEVBUl9GTEFHKEZfVEYpOworCXB1c2hfd29yZChNLng4Ni5SX0NTKTsKKwlNLng4Ni5SX0NTID0gbWVtX2FjY2Vzc193b3JkKDMgKiA0ICsgMik7CisJcHVzaF93b3JkKE0ueDg2LlJfSVApOworCU0ueDg2LlJfSVAgPSBtZW1fYWNjZXNzX3dvcmQoMyAqIDQpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhjZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfaW50X0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTE2IHRtcDsKKyAgICB1OCBpbnRudW07CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIklOVFx0Iik7CisgICAgaW50bnVtID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIGludG51bSk7CisgICAgdG1wID0gbWVtX2FjY2Vzc193b3JkKGludG51bSAqIDQgKyAyKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworCWlmIChfWDg2RU1VX2ludHJUYWJbaW50bnVtXSkgeworCQkoKl9YODZFTVVfaW50clRhYltpbnRudW1dKShpbnRudW0pOworICAgIH0gZWxzZSB7CisJcHVzaF93b3JkKCh1MTYpTS54ODYuUl9GTEcpOworCUNMRUFSX0ZMQUcoRl9JRik7CisJQ0xFQVJfRkxBRyhGX1RGKTsKKwlwdXNoX3dvcmQoTS54ODYuUl9DUyk7CisJTS54ODYuUl9DUyA9IG1lbV9hY2Nlc3Nfd29yZChpbnRudW0gKiA0ICsgMik7CisJcHVzaF93b3JkKE0ueDg2LlJfSVApOworCU0ueDg2LlJfSVAgPSBtZW1fYWNjZXNzX3dvcmQoaW50bnVtICogNCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGNlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9pbnRvKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1MTYgdG1wOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJJTlRPXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChBQ0NFU1NfRkxBRyhGX09GKSkgeworCXRtcCA9IG1lbV9hY2Nlc3Nfd29yZCg0ICogNCArIDIpOworCQlpZiAoX1g4NkVNVV9pbnRyVGFiWzRdKSB7CisJCQkoKl9YODZFTVVfaW50clRhYls0XSkoNCk7CisJfSBlbHNlIHsKKwkgICAgcHVzaF93b3JkKCh1MTYpTS54ODYuUl9GTEcpOworCSAgICBDTEVBUl9GTEFHKEZfSUYpOworCSAgICBDTEVBUl9GTEFHKEZfVEYpOworCSAgICBwdXNoX3dvcmQoTS54ODYuUl9DUyk7CisJICAgIE0ueDg2LlJfQ1MgPSBtZW1fYWNjZXNzX3dvcmQoNCAqIDQgKyAyKTsKKwkgICAgcHVzaF93b3JkKE0ueDg2LlJfSVApOworCSAgICBNLng4Ni5SX0lQID0gbWVtX2FjY2Vzc193b3JkKDQgKiA0KTsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGNmCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9pcmV0KHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIklSRVRcbiIpOworCisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKworICAgIE0ueDg2LlJfSVAgPSBwb3Bfd29yZCgpOworICAgIE0ueDg2LlJfQ1MgPSBwb3Bfd29yZCgpOworICAgIE0ueDg2LlJfRkxHID0gcG9wX3dvcmQoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhkMAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfb3BjRDBfYnl0ZV9STV8xKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTggKmRlc3RyZWc7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4IGRlc3R2YWw7CisKKyAgICAvKgorICAgICAqIFlldCBhbm90aGVyIHdlaXJkbyBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgUGFydCBvZgorICAgICAqIHRoZSBvcGNvZGUgaGVsZCBiZWxvdyBpbiAiUkgiLiAgRG91Ymx5IG5lc3RlZCBjYXNlIHdvdWxkCisgICAgICogcmVzdWx0LCBleGNlcHQgdGhhdCB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbgorICAgICAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyNpZmRlZiBERUJVRworICAgIGlmIChERUJVR19ERUNPREUoKSkgeworCS8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCisJICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKKwkgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKKwkgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCisJc3dpdGNoIChyaCkgeworCWNhc2UgMDoKKwkgICAgREVDT0RFX1BSSU5URigiUk9MXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAxOgorCSAgICBERUNPREVfUFJJTlRGKCJST1JcdCIpOworCSAgICBicmVhazsKKwljYXNlIDI6CisJICAgIERFQ09ERV9QUklOVEYoIlJDTFx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMzoKKwkgICAgREVDT0RFX1BSSU5URigiUkNSXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA0OgorCSAgICBERUNPREVfUFJJTlRGKCJTSExcdCIpOworCSAgICBicmVhazsKKwljYXNlIDU6CisJICAgIERFQ09ERV9QUklOVEYoIlNIUlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNjoKKwkgICAgREVDT0RFX1BSSU5URigiU0FMXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA3OgorCSAgICBERUNPREVfUFJJTlRGKCJTQVJcdCIpOworCSAgICBicmVhazsKKwl9CisgICAgfQorI2VuZGlmCisgICAgLyoga25vdyBvcGVyYXRpb24sIGRlY29kZSB0aGUgbW9kIGJ5dGUgdG8gZmluZCB0aGUgYWRkcmVzc2luZworICAgICAgIG1vZGUuICovCisgICAgaWYgKG1vZCA8IDMpIHsKKwlERUNPREVfUFJJTlRGKCJCWVRFIFBUUiAiKTsKKwlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlERUNPREVfUFJJTlRGKCIsMVxuIik7CisJZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCWRlc3R2YWwgPSAoKm9wY0QwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIDEpOworCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisJREVDT0RFX1BSSU5URigiLDFcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJZGVzdHZhbCA9ICgqb3BjRDBfYnl0ZV9vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIDEpOworCSpkZXN0cmVnID0gZGVzdHZhbDsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZDEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX29wY0QxX3dvcmRfUk1fMSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKworICAgIC8qCisgICAgICogWWV0IGFub3RoZXIgd2VpcmRvIHNwZWNpYWwgY2FzZSBpbnN0cnVjdGlvbiBmb3JtYXQuICBQYXJ0IG9mCisgICAgICogdGhlIG9wY29kZSBoZWxkIGJlbG93IGluICJSSCIuICBEb3VibHkgbmVzdGVkIGNhc2Ugd291bGQKKyAgICAgKiByZXN1bHQsIGV4Y2VwdCB0aGF0IHRoZSBkZWNvZGVkIGluc3RydWN0aW9uCisgICAgICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworI2lmZGVmIERFQlVHCisgICAgaWYgKERFQlVHX0RFQ09ERSgpKSB7CisJLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKKwkgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncworCSAgIGluIHRoZSBzYW1lIGZvcm1hdCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBpcyB0aGF0IHRoZQorCSAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KKwlzd2l0Y2ggKHJoKSB7CisJY2FzZSAwOgorCSAgICBERUNPREVfUFJJTlRGKCJST0xcdCIpOworCSAgICBicmVhazsKKwljYXNlIDE6CisJICAgIERFQ09ERV9QUklOVEYoIlJPUlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMjoKKwkgICAgREVDT0RFX1BSSU5URigiUkNMXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAzOgorCSAgICBERUNPREVfUFJJTlRGKCJSQ1JcdCIpOworCSAgICBicmVhazsKKwljYXNlIDQ6CisJICAgIERFQ09ERV9QUklOVEYoIlNITFx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNToKKwkgICAgREVDT0RFX1BSSU5URigiU0hSXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA2OgorCSAgICBERUNPREVfUFJJTlRGKCJTQUxcdCIpOworCSAgICBicmVhazsKKwljYXNlIDc6CisJICAgIERFQ09ERV9QUklOVEYoIlNBUlx0Iik7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisjZW5kaWYKKyAgICAvKiBrbm93IG9wZXJhdGlvbiwgZGVjb2RlIHRoZSBtb2QgYnl0ZSB0byBmaW5kIHRoZSBhZGRyZXNzaW5nCisgICAgICAgbW9kZS4gKi8KKyAgICBpZiAobW9kIDwgMykgeworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgZGVzdHZhbDsKKworCSAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7CisJICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsMVxuIik7CisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSAoKm9wY0QxX2xvbmdfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIDEpOworCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJfSBlbHNlIHsKKwkgICAgdTE2IGRlc3R2YWw7CisKKwkgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7CisJICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsMVxuIik7CisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSAoKm9wY0QxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIDEpOworCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJCQl1MzIgZGVzdHZhbDsKKwkJCXUzMiAqZGVzdHJlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsMVxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSAoKm9wY0QxX2xvbmdfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCAxKTsKKwkgICAgKmRlc3RyZWcgPSBkZXN0dmFsOworCX0gZWxzZSB7CisJCQl1MTYgZGVzdHZhbDsKKwkJCXUxNiAqZGVzdHJlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsMVxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSAoKm9wY0QxX3dvcmRfb3BlcmF0aW9uW3JoXSkgKCpkZXN0cmVnLCAxKTsKKwkgICAgKmRlc3RyZWcgPSBkZXN0dmFsOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZDIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX29wY0QyX2J5dGVfUk1fQ0wodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1OCAqZGVzdHJlZzsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisgICAgdTggZGVzdHZhbDsKKyAgICB1OCBhbXQ7CisKKyAgICAvKgorICAgICAqIFlldCBhbm90aGVyIHdlaXJkbyBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgUGFydCBvZgorICAgICAqIHRoZSBvcGNvZGUgaGVsZCBiZWxvdyBpbiAiUkgiLiAgRG91Ymx5IG5lc3RlZCBjYXNlIHdvdWxkCisgICAgICogcmVzdWx0LCBleGNlcHQgdGhhdCB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbgorICAgICAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyNpZmRlZiBERUJVRworICAgIGlmIChERUJVR19ERUNPREUoKSkgeworCS8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCisJICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKKwkgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKKwkgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCisJc3dpdGNoIChyaCkgeworCWNhc2UgMDoKKwkgICAgREVDT0RFX1BSSU5URigiUk9MXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAxOgorCSAgICBERUNPREVfUFJJTlRGKCJST1JcdCIpOworCSAgICBicmVhazsKKwljYXNlIDI6CisJICAgIERFQ09ERV9QUklOVEYoIlJDTFx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMzoKKwkgICAgREVDT0RFX1BSSU5URigiUkNSXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA0OgorCSAgICBERUNPREVfUFJJTlRGKCJTSExcdCIpOworCSAgICBicmVhazsKKwljYXNlIDU6CisJICAgIERFQ09ERV9QUklOVEYoIlNIUlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNjoKKwkgICAgREVDT0RFX1BSSU5URigiU0FMXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA3OgorCSAgICBERUNPREVfUFJJTlRGKCJTQVJcdCIpOworCSAgICBicmVhazsKKwl9CisgICAgfQorI2VuZGlmCisgICAgLyoga25vdyBvcGVyYXRpb24sIGRlY29kZSB0aGUgbW9kIGJ5dGUgdG8gZmluZCB0aGUgYWRkcmVzc2luZworICAgICAgIG1vZGUuICovCisgICAgYW10ID0gTS54ODYuUl9DTDsKKyAgICBpZiAobW9kIDwgMykgeworCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCURFQ09ERV9QUklOVEYoIixDTFxuIik7CisJZGVzdHZhbCA9IGZldGNoX2RhdGFfYnl0ZShkZXN0b2Zmc2V0KTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCWRlc3R2YWwgPSAoKm9wY0QwX2J5dGVfb3BlcmF0aW9uW3JoXSkgKGRlc3R2YWwsIGFtdCk7CisJc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJZGVzdHJlZyA9IERFQ09ERV9STV9CWVRFX1JFR0lTVEVSKHJsKTsKKwlERUNPREVfUFJJTlRGKCIsQ0xcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJZGVzdHZhbCA9ICgqb3BjRDBfYnl0ZV9vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIGFtdCk7CisJKmRlc3RyZWcgPSBkZXN0dmFsOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhkMworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfb3BjRDNfd29yZF9STV9DTCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKyAgICB1OCBhbXQ7CisKKyAgICAvKgorICAgICAqIFlldCBhbm90aGVyIHdlaXJkbyBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgUGFydCBvZgorICAgICAqIHRoZSBvcGNvZGUgaGVsZCBiZWxvdyBpbiAiUkgiLiAgRG91Ymx5IG5lc3RlZCBjYXNlIHdvdWxkCisgICAgICogcmVzdWx0LCBleGNlcHQgdGhhdCB0aGUgZGVjb2RlZCBpbnN0cnVjdGlvbgorICAgICAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyNpZmRlZiBERUJVRworICAgIGlmIChERUJVR19ERUNPREUoKSkgeworCS8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCisJICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKKwkgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKKwkgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCisJc3dpdGNoIChyaCkgeworCWNhc2UgMDoKKwkgICAgREVDT0RFX1BSSU5URigiUk9MXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAxOgorCSAgICBERUNPREVfUFJJTlRGKCJST1JcdCIpOworCSAgICBicmVhazsKKwljYXNlIDI6CisJICAgIERFQ09ERV9QUklOVEYoIlJDTFx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMzoKKwkgICAgREVDT0RFX1BSSU5URigiUkNSXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA0OgorCSAgICBERUNPREVfUFJJTlRGKCJTSExcdCIpOworCSAgICBicmVhazsKKwljYXNlIDU6CisJICAgIERFQ09ERV9QUklOVEYoIlNIUlx0Iik7CisJICAgIGJyZWFrOworCWNhc2UgNjoKKwkgICAgREVDT0RFX1BSSU5URigiU0FMXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA3OgorCSAgICBERUNPREVfUFJJTlRGKCJTQVJcdCIpOworCSAgICBicmVhazsKKwl9CisgICAgfQorI2VuZGlmCisgICAgLyoga25vdyBvcGVyYXRpb24sIGRlY29kZSB0aGUgbW9kIGJ5dGUgdG8gZmluZCB0aGUgYWRkcmVzc2luZworICAgICAgIG1vZGUuICovCisgICAgYW10ID0gTS54ODYuUl9DTDsKKyAgICBpZiAobW9kIDwgMykgeworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgZGVzdHZhbDsKKworCSAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7CisJICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gKCpvcGNEMV9sb25nX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOworCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJfSBlbHNlIHsKKwkgICAgdTE2IGRlc3R2YWw7CisKKwkgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7CisJICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gKCpvcGNEMV93b3JkX29wZXJhdGlvbltyaF0pIChkZXN0dmFsLCBhbXQpOworCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9ICgqb3BjRDFfbG9uZ19vcGVyYXRpb25bcmhdKSAoKmRlc3RyZWcsIGFtdCk7CisJfSBlbHNlIHsKKwkgICAgdTE2ICpkZXN0cmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gKCpvcGNEMV93b3JkX29wZXJhdGlvbltyaF0pICgqZGVzdHJlZywgYW10KTsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGQ0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9hYW0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHU4IGE7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkFBTVxuIik7CisgICAgYSA9IGZldGNoX2J5dGVfaW1tKCk7ICAgICAgLyogdGhpcyBpcyBhIHN0dXBpZCBlbmNvZGluZy4gKi8KKyAgICBpZiAoYSAhPSAxMCkgeworCURFQ09ERV9QUklOVEYoIkVSUk9SIERFQ09ESU5HIEFBTVxuIik7CisJVFJBQ0VfUkVHUygpOworCUhBTFRfU1lTKCk7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgLyogbm90ZSB0aGUgdHlwZSBjaGFuZ2UgaGVyZSAtLS0gcmV0dXJuaW5nIEFMIGFuZCBBSCBpbiBBWC4gKi8KKyAgICBNLng4Ni5SX0FYID0gYWFtX3dvcmQoTS54ODYuUl9BTCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZDUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2FhZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTggYTsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQUFEXG4iKTsKKyAgICBhID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfQVggPSBhYWRfd29yZChNLng4Ni5SX0FYKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qIG9wY29kZSAweGQ2IElMTEVHQUwgT1BDT0RFICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhkNworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfeGxhdCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTE2IGFkZHI7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlhMQVRcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisJYWRkciA9ICh1MTYpKE0ueDg2LlJfQlggKyAodTgpTS54ODYuUl9BTCk7CisgICAgTS54ODYuUl9BTCA9IGZldGNoX2RhdGFfYnl0ZShhZGRyKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qIGluc3R1Y3Rpb25zCUQ4IC4uIERGIGFyZSBpbiBpODdfb3BzLmMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGUwCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9sb29wbmUodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHMxNiBpcDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTE9PUE5FXHQiKTsKKyAgICBpcCA9IChzOCkgZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBpcCArPSAoczE2KSBNLng4Ni5SX0lQOworICAgIERFQ09ERV9QUklOVEYyKCIlMDR4XG4iLCBpcCk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0NYIC09IDE7CisgICAgaWYgKE0ueDg2LlJfQ1ggIT0gMCAmJiAhQUNDRVNTX0ZMQUcoRl9aRikpCSAgICAvKiBDWCAhPSAwIGFuZCAhWkYgKi8KKwlNLng4Ni5SX0lQID0gaXA7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZTEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2xvb3BlKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBzMTYgaXA7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkxPT1BFXHQiKTsKKyAgICBpcCA9IChzOCkgZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBpcCArPSAoczE2KSBNLng4Ni5SX0lQOworICAgIERFQ09ERV9QUklOVEYyKCIlMDR4XG4iLCBpcCk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0NYIC09IDE7CisgICAgaWYgKE0ueDg2LlJfQ1ggIT0gMCAmJiBBQ0NFU1NfRkxBRyhGX1pGKSkJICAgIC8qIENYICE9IDAgYW5kIFpGICovCisJTS54ODYuUl9JUCA9IGlwOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGUyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9sb29wKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBzMTYgaXA7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkxPT1BcdCIpOworICAgIGlwID0gKHM4KSBmZXRjaF9ieXRlX2ltbSgpOworICAgIGlwICs9IChzMTYpIE0ueDg2LlJfSVA7CisgICAgREVDT0RFX1BSSU5URjIoIiUwNHhcbiIsIGlwKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfQ1ggLT0gMTsKKyAgICBpZiAoTS54ODYuUl9DWCAhPSAwKQorCU0ueDg2LlJfSVAgPSBpcDsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhlMworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfamN4eih1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTE2IHRhcmdldDsKKyAgICBzOAlvZmZzZXQ7CisKKyAgICAvKiBqdW1wIHRvIGJ5dGUgb2Zmc2V0IGlmIG92ZXJmbG93IGZsYWcgaXMgc2V0ICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJKQ1haXHQiKTsKKyAgICBvZmZzZXQgPSAoczgpZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICB0YXJnZXQgPSAodTE2KShNLng4Ni5SX0lQICsgb2Zmc2V0KTsKKyAgICBERUNPREVfUFJJTlRGMigiJXhcbiIsIHRhcmdldCk7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYuUl9DWCA9PSAwKQorCU0ueDg2LlJfSVAgPSB0YXJnZXQ7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZTQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2luX2J5dGVfQUxfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1OCBwb3J0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJJTlx0Iik7CisJcG9ydCA9ICh1OCkgZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBERUNPREVfUFJJTlRGMigiJXgsQUxcbiIsIHBvcnQpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9BTCA9ICgqc3lzX2luYikocG9ydCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZTUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2luX3dvcmRfQVhfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICB1OCBwb3J0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJJTlx0Iik7CisJcG9ydCA9ICh1OCkgZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlERUNPREVfUFJJTlRGMigiRUFYLCV4XG4iLCBwb3J0KTsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYyKCJBWCwleFxuIiwgcG9ydCk7CisgICAgfQorICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJTS54ODYuUl9FQVggPSAoKnN5c19pbmwpKHBvcnQpOworICAgIH0gZWxzZSB7CisJTS54ODYuUl9BWCA9ICgqc3lzX2ludykocG9ydCk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGU2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9vdXRfYnl0ZV9JTU1fQUwodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHU4IHBvcnQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk9VVFx0Iik7CisJcG9ydCA9ICh1OCkgZmV0Y2hfYnl0ZV9pbW0oKTsKKyAgICBERUNPREVfUFJJTlRGMigiJXgsQUxcbiIsIHBvcnQpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgKCpzeXNfb3V0YikocG9ydCwgTS54ODYuUl9BTCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZTcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX291dF93b3JkX0lNTV9BWCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTggcG9ydDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiT1VUXHQiKTsKKwlwb3J0ID0gKHU4KSBmZXRjaF9ieXRlX2ltbSgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCURFQ09ERV9QUklOVEYyKCIleCxFQVhcbiIsIHBvcnQpOworICAgIH0gZWxzZSB7CisJREVDT0RFX1BSSU5URjIoIiV4LEFYXG4iLCBwb3J0KTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkoKnN5c19vdXRsKShwb3J0LCBNLng4Ni5SX0VBWCk7CisgICAgfSBlbHNlIHsKKwkoKnN5c19vdXR3KShwb3J0LCBNLng4Ni5SX0FYKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZTgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2NhbGxfbmVhcl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHMxNiBpcDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisJREVDT0RFX1BSSU5URigiQ0FMTFx0Iik7CisJaXAgPSAoczE2KSBmZXRjaF93b3JkX2ltbSgpOworCWlwICs9IChzMTYpIE0ueDg2LlJfSVA7CSAgIC8qIENIRUNLIFNJR04gKi8KKwlERUNPREVfUFJJTlRGMigiJTA0eFxuIiwgaXApOworCUNBTExfVFJBQ0UoTS54ODYuc2F2ZWRfY3MsIE0ueDg2LnNhdmVkX2lwLCBNLng4Ni5SX0NTLCBpcCwgIiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgcHVzaF93b3JkKE0ueDg2LlJfSVApOworICAgIE0ueDg2LlJfSVAgPSBpcDsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhlOQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfanVtcF9uZWFyX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IGlwOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJKTVBcdCIpOworICAgIGlwID0gKHMxNilmZXRjaF93b3JkX2ltbSgpOworICAgIGlwICs9IChzMTYpTS54ODYuUl9JUDsKKyAgICBERUNPREVfUFJJTlRGMigiJTA0eFxuIiwgaXApOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9JUCA9ICh1MTYpaXA7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZWEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2p1bXBfZmFyX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgdTE2IGNzLCBpcDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSk1QXHRGQVIgIik7CisgICAgaXAgPSBmZXRjaF93b3JkX2ltbSgpOworICAgIGNzID0gZmV0Y2hfd29yZF9pbW0oKTsKKyAgICBERUNPREVfUFJJTlRGMigiJTA0eDoiLCBjcyk7CisgICAgREVDT0RFX1BSSU5URjIoIiUwNHhcbiIsIGlwKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfSVAgPSBpcDsKKyAgICBNLng4Ni5SX0NTID0gY3M7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZWIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2p1bXBfYnl0ZV9JTU0odTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIHUxNiB0YXJnZXQ7CisgICAgczggb2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJKTVBcdCIpOworICAgIG9mZnNldCA9IChzOClmZXRjaF9ieXRlX2ltbSgpOworICAgIHRhcmdldCA9ICh1MTYpKE0ueDg2LlJfSVAgKyBvZmZzZXQpOworICAgIERFQ09ERV9QUklOVEYyKCIleFxuIiwgdGFyZ2V0KTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfSVAgPSB0YXJnZXQ7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZWMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2luX2J5dGVfQUxfRFgodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSU5cdEFMLERYXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIE0ueDg2LlJfQUwgPSAoKnN5c19pbmIpKE0ueDg2LlJfRFgpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGVkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9pbl93b3JkX0FYX0RYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCURFQ09ERV9QUklOVEYoIklOXHRFQVgsRFhcbiIpOworICAgIH0gZWxzZSB7CisJREVDT0RFX1BSSU5URigiSU5cdEFYLERYXG4iKTsKKyAgICB9CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwlNLng4Ni5SX0VBWCA9ICgqc3lzX2lubCkoTS54ODYuUl9EWCk7CisgICAgfSBlbHNlIHsKKwlNLng4Ni5SX0FYID0gKCpzeXNfaW53KShNLng4Ni5SX0RYKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX291dF9ieXRlX0RYX0FMKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIk9VVFx0RFgsQUxcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgKCpzeXNfb3V0YikoTS54ODYuUl9EWCwgTS54ODYuUl9BTCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZWYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX291dF93b3JkX0RYX0FYKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCURFQ09ERV9QUklOVEYoIk9VVFx0RFgsRUFYXG4iKTsKKyAgICB9IGVsc2UgeworCURFQ09ERV9QUklOVEYoIk9VVFx0RFgsQVhcbiIpOworICAgIH0KKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSgqc3lzX291dGwpKE0ueDg2LlJfRFgsIE0ueDg2LlJfRUFYKTsKKyAgICB9IGVsc2UgeworCSgqc3lzX291dHcpKE0ueDg2LlJfRFgsIE0ueDg2LlJfQVgpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhmMAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfbG9jayh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJMT0NLOlxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qb3Bjb2RlIDB4ZjEgSUxMRUdBTCBPUEVSQVRJT04gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGYyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9yZXBuZSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJSRVBORVxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5tb2RlIHw9IFNZU01PREVfUFJFRklYX1JFUE5FOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGYzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9yZXBlKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlJFUEVcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYubW9kZSB8PSBTWVNNT0RFX1BSRUZJWF9SRVBFOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGY0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9oYWx0KHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkhBTFRcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgSEFMVF9TWVMoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhmNQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfY21jKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICAvKiBjb21wbGVtZW50IHRoZSBjYXJyeSBmbGFnLiAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQ01DXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIFRPR0dMRV9GTEFHKEZfQ0YpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGY2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9vcGNGNl9ieXRlX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdTggKmRlc3RyZWc7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4IGRlc3R2YWwsIHNyY3ZhbDsKKworICAgIC8qIGxvbmcsIGRyYXduIG91dCBjb2RlIGZvbGxvd3MuICBEb3VibGUgc3dpdGNoIGZvciBhIHRvdGFsCisgICAgICAgb2YgMzIgY2FzZXMuICAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBERUNPREVfUFJJTlRGKG9wRjZfbmFtZXNbcmhdKTsKKyAgICBpZiAobW9kIDwgMykgeworCURFQ09ERV9QUklOVEYoIkJZVEUgUFRSICIpOworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2J5dGUoZGVzdG9mZnNldCk7CisKKwlzd2l0Y2ggKHJoKSB7CisJY2FzZSAwOgkJLyogdGVzdCBieXRlIGltbSAqLworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY3ZhbCA9IGZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIlMDJ4XG4iLCBzcmN2YWwpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICB0ZXN0X2J5dGUoZGVzdHZhbCwgc3JjdmFsKTsKKwkgICAgYnJlYWs7CisJY2FzZSAxOgorCSAgICBERUNPREVfUFJJTlRGKCJJTExFR0FMIE9QIE1PRD0wMCBSSD0wMSBPUD1GNlxuIik7CisJICAgIEhBTFRfU1lTKCk7CisJICAgIGJyZWFrOworCWNhc2UgMjoKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGVzdHZhbCA9IG5vdF9ieXRlKGRlc3R2YWwpOworCSAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJICAgIGJyZWFrOworCWNhc2UgMzoKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGVzdHZhbCA9IG5lZ19ieXRlKGRlc3R2YWwpOworCSAgICBzdG9yZV9kYXRhX2J5dGUoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJICAgIGJyZWFrOworCWNhc2UgNDoKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgbXVsX2J5dGUoZGVzdHZhbCk7CisJICAgIGJyZWFrOworCWNhc2UgNToKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgaW11bF9ieXRlKGRlc3R2YWwpOworCSAgICBicmVhazsKKwljYXNlIDY6CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRpdl9ieXRlKGRlc3R2YWwpOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBpZGl2X2J5dGUoZGVzdHZhbCk7CisJICAgIGJyZWFrOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiBtb2Q9MTEgKi8KKwlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworCXN3aXRjaCAocmgpIHsKKwljYXNlIDA6CQkvKiB0ZXN0IGJ5dGUgaW1tICovCisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiUwMnhcbiIsIHNyY3ZhbCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHRlc3RfYnl0ZSgqZGVzdHJlZywgc3JjdmFsKTsKKwkgICAgYnJlYWs7CisJY2FzZSAxOgorCSAgICBERUNPREVfUFJJTlRGKCJJTExFR0FMIE9QIE1PRD0wMCBSSD0wMSBPUD1GNlxuIik7CisJICAgIEhBTFRfU1lTKCk7CisJICAgIGJyZWFrOworCWNhc2UgMjoKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSBub3RfYnl0ZSgqZGVzdHJlZyk7CisJICAgIGJyZWFrOworCWNhc2UgMzoKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSBuZWdfYnl0ZSgqZGVzdHJlZyk7CisJICAgIGJyZWFrOworCWNhc2UgNDoKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgbXVsX2J5dGUoKmRlc3RyZWcpOwkgICAgIC8qISEhICAqLworCSAgICBicmVhazsKKwljYXNlIDU6CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGltdWxfYnl0ZSgqZGVzdHJlZyk7CisJICAgIGJyZWFrOworCWNhc2UgNjoKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGl2X2J5dGUoKmRlc3RyZWcpOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBpZGl2X2J5dGUoKmRlc3RyZWcpOworCSAgICBicmVhazsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGY3CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9vcGNGN193b3JkX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBkZXN0b2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIERFQ09ERV9QUklOVEYob3BGNl9uYW1lc1tyaF0pOworICAgIGlmIChtb2QgPCAzKSB7CisKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyIGRlc3R2YWwsIHNyY3ZhbDsKKworCSAgICBERUNPREVfUFJJTlRGKCJEV09SRCBQVFIgIik7CisJICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworCisJICAgIHN3aXRjaCAocmgpIHsKKwkgICAgY2FzZSAwOgorCQlERUNPREVfUFJJTlRGKCIsIik7CisJCXNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7CisJCURFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJdGVzdF9sb25nKGRlc3R2YWwsIHNyY3ZhbCk7CisJCWJyZWFrOworCSAgICBjYXNlIDE6CisJCURFQ09ERV9QUklOVEYoIklMTEVHQUwgT1AgTU9EPTAwIFJIPTAxIE9QPUY3XG4iKTsKKwkJSEFMVF9TWVMoKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgMjoKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJZGVzdHZhbCA9IG5vdF9sb25nKGRlc3R2YWwpOworCQlzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJCWJyZWFrOworCSAgICBjYXNlIDM6CisJCURFQ09ERV9QUklOVEYoIlxuIik7CisJCVRSQUNFX0FORF9TVEVQKCk7CisJCWRlc3R2YWwgPSBuZWdfbG9uZyhkZXN0dmFsKTsKKwkJc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCQlicmVhazsKKwkgICAgY2FzZSA0OgorCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQltdWxfbG9uZyhkZXN0dmFsKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgNToKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJaW11bF9sb25nKGRlc3R2YWwpOworCQlicmVhazsKKwkgICAgY2FzZSA2OgorCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQlkaXZfbG9uZyhkZXN0dmFsKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgNzoKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJaWRpdl9sb25nKGRlc3R2YWwpOworCQlicmVhazsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIHUxNiBkZXN0dmFsLCBzcmN2YWw7CisKKwkgICAgREVDT0RFX1BSSU5URigiV09SRCBQVFIgIik7CisJICAgIGRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworCisJICAgIHN3aXRjaCAocmgpIHsKKwkgICAgY2FzZSAwOgkgICAgLyogdGVzdCB3b3JkIGltbSAqLworCQlERUNPREVfUFJJTlRGKCIsIik7CisJCXNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7CisJCURFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJdGVzdF93b3JkKGRlc3R2YWwsIHNyY3ZhbCk7CisJCWJyZWFrOworCSAgICBjYXNlIDE6CisJCURFQ09ERV9QUklOVEYoIklMTEVHQUwgT1AgTU9EPTAwIFJIPTAxIE9QPUY3XG4iKTsKKwkJSEFMVF9TWVMoKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgMjoKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJZGVzdHZhbCA9IG5vdF93b3JkKGRlc3R2YWwpOworCQlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJCWJyZWFrOworCSAgICBjYXNlIDM6CisJCURFQ09ERV9QUklOVEYoIlxuIik7CisJCVRSQUNFX0FORF9TVEVQKCk7CisJCWRlc3R2YWwgPSBuZWdfd29yZChkZXN0dmFsKTsKKwkJc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCQlicmVhazsKKwkgICAgY2FzZSA0OgorCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQltdWxfd29yZChkZXN0dmFsKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgNToKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJaW11bF93b3JkKGRlc3R2YWwpOworCQlicmVhazsKKwkgICAgY2FzZSA2OgorCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQlkaXZfd29yZChkZXN0dmFsKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgNzoKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJaWRpdl93b3JkKGRlc3R2YWwpOworCQlicmVhazsKKwkgICAgfQorCX0KKworICAgIH0gZWxzZSB7CQkJIC8qIG1vZD0xMSAqLworCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZzsKKwkgICAgdTMyIHNyY3ZhbDsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCisJICAgIHN3aXRjaCAocmgpIHsKKwkgICAgY2FzZSAwOgkgICAgLyogdGVzdCB3b3JkIGltbSAqLworCQlERUNPREVfUFJJTlRGKCIsIik7CisJCXNyY3ZhbCA9IGZldGNoX2xvbmdfaW1tKCk7CisJCURFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJdGVzdF9sb25nKCpkZXN0cmVnLCBzcmN2YWwpOworCQlicmVhazsKKwkgICAgY2FzZSAxOgorCQlERUNPREVfUFJJTlRGKCJJTExFR0FMIE9QIE1PRD0wMCBSSD0wMSBPUD1GNlxuIik7CisJCUhBTFRfU1lTKCk7CisJCWJyZWFrOworCSAgICBjYXNlIDI6CisJCURFQ09ERV9QUklOVEYoIlxuIik7CisJCVRSQUNFX0FORF9TVEVQKCk7CisJCSpkZXN0cmVnID0gbm90X2xvbmcoKmRlc3RyZWcpOworCQlicmVhazsKKwkgICAgY2FzZSAzOgorCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQkqZGVzdHJlZyA9IG5lZ19sb25nKCpkZXN0cmVnKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgNDoKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJbXVsX2xvbmcoKmRlc3RyZWcpOwkgLyohISEJKi8KKwkJYnJlYWs7CisJICAgIGNhc2UgNToKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJaW11bF9sb25nKCpkZXN0cmVnKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgNjoKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJZGl2X2xvbmcoKmRlc3RyZWcpOworCQlicmVhazsKKwkgICAgY2FzZSA3OgorCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQlpZGl2X2xvbmcoKmRlc3RyZWcpOworCQlicmVhazsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIHUxNiAqZGVzdHJlZzsKKwkgICAgdTE2IHNyY3ZhbDsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCisJICAgIHN3aXRjaCAocmgpIHsKKwkgICAgY2FzZSAwOgkgICAgLyogdGVzdCB3b3JkIGltbSAqLworCQlERUNPREVfUFJJTlRGKCIsIik7CisJCXNyY3ZhbCA9IGZldGNoX3dvcmRfaW1tKCk7CisJCURFQ09ERV9QUklOVEYyKCIleFxuIiwgc3JjdmFsKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJdGVzdF93b3JkKCpkZXN0cmVnLCBzcmN2YWwpOworCQlicmVhazsKKwkgICAgY2FzZSAxOgorCQlERUNPREVfUFJJTlRGKCJJTExFR0FMIE9QIE1PRD0wMCBSSD0wMSBPUD1GNlxuIik7CisJCUhBTFRfU1lTKCk7CisJCWJyZWFrOworCSAgICBjYXNlIDI6CisJCURFQ09ERV9QUklOVEYoIlxuIik7CisJCVRSQUNFX0FORF9TVEVQKCk7CisJCSpkZXN0cmVnID0gbm90X3dvcmQoKmRlc3RyZWcpOworCQlicmVhazsKKwkgICAgY2FzZSAzOgorCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQkqZGVzdHJlZyA9IG5lZ193b3JkKCpkZXN0cmVnKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgNDoKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJbXVsX3dvcmQoKmRlc3RyZWcpOwkgLyohISEJKi8KKwkJYnJlYWs7CisJICAgIGNhc2UgNToKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJaW11bF93b3JkKCpkZXN0cmVnKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgNjoKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJZGl2X3dvcmQoKmRlc3RyZWcpOworCQlicmVhazsKKwkgICAgY2FzZSA3OgorCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQlpZGl2X3dvcmQoKmRlc3RyZWcpOworCQlicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZjgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2NsYyh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgLyogY2xlYXIgdGhlIGNhcnJ5IGZsYWcuICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJDTENcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgQ0xFQVJfRkxBRyhGX0NGKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhmOQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfc3RjKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICAvKiBzZXQgdGhlIGNhcnJ5IGZsYWcuICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJTVENcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgU0VUX0ZMQUcoRl9DRik7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZmEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX2NsaSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgLyogY2xlYXIgaW50ZXJydXB0cy4gKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkNMSVxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBDTEVBUl9GTEFHKEZfSUYpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGZiCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9zdGkodTggWDg2RU1VX1VOVVNFRChvcDEpKQoreworICAgIC8qIGVuYWJsZSAgaW50ZXJydXB0cy4gKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlNUSVxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBTRVRfRkxBRyhGX0lGKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhmYworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3BfY2xkKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICAvKiBjbGVhciBpbnRlcnJ1cHRzLiAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQ0xEXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIENMRUFSX0ZMQUcoRl9ERik7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4ZmQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wX3N0ZCh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgLyogY2xlYXIgaW50ZXJydXB0cy4gKi8KKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlNURFxuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBTRVRfRkxBRyhGX0RGKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHhmZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3Bfb3BjRkVfYnl0ZV9STSh1OCBYODZFTVVfVU5VU0VEKG9wMSkpCit7CisgICAgaW50IG1vZCwgcmgsIHJsOworICAgIHU4IGRlc3R2YWw7CisgICAgdWludCBkZXN0b2Zmc2V0OworICAgIHU4ICpkZXN0cmVnOworCisgICAgLyogWWV0IGFub3RoZXIgc3BlY2lhbCBjYXNlIGluc3RydWN0aW9uLiAqLworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyNpZmRlZiBERUJVRworICAgIGlmIChERUJVR19ERUNPREUoKSkgeworCS8qIFhYWCBERUNPREVfUFJJTlRGIG1heSBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyBtb3JlCisJICAgZ2VuZXJhbCwgc28gdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgdGhlIHN0cmluZ3MKKwkgICBpbiB0aGUgc2FtZSBmb3JtYXQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgaXMgdGhhdCB0aGUKKwkgICBhYm92ZSB0ZXN0IGlzIGRvbmUgdHdpY2UuICovCisKKwlzd2l0Y2ggKHJoKSB7CisJY2FzZSAwOgorCSAgICBERUNPREVfUFJJTlRGKCJJTkNcdCIpOworCSAgICBicmVhazsKKwljYXNlIDE6CisJICAgIERFQ09ERV9QUklOVEYoIkRFQ1x0Iik7CisJICAgIGJyZWFrOworCWNhc2UgMjoKKwljYXNlIDM6CisJY2FzZSA0OgorCWNhc2UgNToKKwljYXNlIDY6CisJY2FzZSA3OgorCSAgICBERUNPREVfUFJJTlRGMigiSUxMRUdBTCBPUCBNQUpPUiBPUCAweEZFIE1JTk9SIE9QICV4IFxuIiwgbW9kKTsKKwkgICAgSEFMVF9TWVMoKTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyNlbmRpZgorICAgIGlmIChtb2QgPCAzKSB7CisJREVDT0RFX1BSSU5URigiQllURSBQVFIgIik7CisJZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlkZXN0dmFsID0gZmV0Y2hfZGF0YV9ieXRlKGRlc3RvZmZzZXQpOworCVRSQUNFX0FORF9TVEVQKCk7CisJaWYgKHJoID09IDApCisJICBkZXN0dmFsID0gaW5jX2J5dGUoZGVzdHZhbCk7CisJZWxzZQorCSAgZGVzdHZhbCA9IGRlY19ieXRlKGRlc3R2YWwpOworCXN0b3JlX2RhdGFfYnl0ZShkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKyAgICB9IGVsc2UgeworCWRlc3RyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCWlmIChyaCA9PSAwKQorCSAgKmRlc3RyZWcgPSBpbmNfYnl0ZSgqZGVzdHJlZyk7CisJZWxzZQorCSAgKmRlc3RyZWcgPSBkZWNfYnl0ZSgqZGVzdHJlZyk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweGZmCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcF9vcGNGRl93b3JkX1JNKHU4IFg4NkVNVV9VTlVTRUQob3AxKSkKK3sKKyAgICBpbnQgbW9kLCByaCwgcmw7CisgICAgdWludCBkZXN0b2Zmc2V0ID0gMDsKKwl1MTYgKmRlc3RyZWc7CisJdTE2IGRlc3R2YWwsZGVzdHZhbDI7CisKKyAgICAvKiBZZXQgYW5vdGhlciBzcGVjaWFsIGNhc2UgaW5zdHJ1Y3Rpb24uICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworI2lmZGVmIERFQlVHCisgICAgaWYgKERFQlVHX0RFQ09ERSgpKSB7CisJLyogWFhYIERFQ09ERV9QUklOVEYgbWF5IGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIG1vcmUKKwkgICBnZW5lcmFsLCBzbyB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBsZWF2ZSB0aGUgc3RyaW5ncworCSAgIGluIHRoZSBzYW1lIGZvcm1hdCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBpcyB0aGF0IHRoZQorCSAgIGFib3ZlIHRlc3QgaXMgZG9uZSB0d2ljZS4gKi8KKworCXN3aXRjaCAocmgpIHsKKwljYXNlIDA6CisJICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCQlERUNPREVfUFJJTlRGKCJJTkNcdERXT1JEIFBUUiAiKTsKKwkgICAgfSBlbHNlIHsKKwkJREVDT0RFX1BSSU5URigiSU5DXHRXT1JEIFBUUiAiKTsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIDE6CisJICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCQlERUNPREVfUFJJTlRGKCJERUNcdERXT1JEIFBUUiAiKTsKKwkgICAgfSBlbHNlIHsKKwkJREVDT0RFX1BSSU5URigiREVDXHRXT1JEIFBUUiAiKTsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIDI6CisJICAgIERFQ09ERV9QUklOVEYoIkNBTExcdCAiKTsKKwkgICAgYnJlYWs7CisJY2FzZSAzOgorCSAgICBERUNPREVfUFJJTlRGKCJDQUxMXHRGQVIgIik7CisJICAgIGJyZWFrOworCWNhc2UgNDoKKwkgICAgREVDT0RFX1BSSU5URigiSk1QXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA1OgorCSAgICBERUNPREVfUFJJTlRGKCJKTVBcdEZBUiAiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA2OgorCSAgICBERUNPREVfUFJJTlRGKCJQVVNIXHQiKTsKKwkgICAgYnJlYWs7CisJY2FzZSA3OgorCSAgICBERUNPREVfUFJJTlRGKCJJTExFR0FMIERFQ09ESU5HIE9GIE9QQ09ERSBGRlx0Iik7CisJICAgIEhBTFRfU1lTKCk7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisjZW5kaWYKKyAgICBpZiAobW9kIDwgMykgeworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJc3dpdGNoIChyaCkgeworCWNhc2UgMDoJCS8qIGluYyB3b3JkIHB0ciAuLi4gKi8KKwkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJCXUzMiBkZXN0dmFsOworCisJCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisJCVRSQUNFX0FORF9TVEVQKCk7CisJCWRlc3R2YWwgPSBpbmNfbG9uZyhkZXN0dmFsKTsKKwkJc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCSAgICB9IGVsc2UgeworCQl1MTYgZGVzdHZhbDsKKworCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQlkZXN0dmFsID0gaW5jX3dvcmQoZGVzdHZhbCk7CisJCXN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIDE6CQkvKiBkZWMgd29yZCBwdHIgLi4uICovCisJICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCQl1MzIgZGVzdHZhbDsKKworCQlkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQlkZXN0dmFsID0gZGVjX2xvbmcoZGVzdHZhbCk7CisJCXN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwkgICAgfSBlbHNlIHsKKwkJdTE2IGRlc3R2YWw7CisKKwkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJZGVzdHZhbCA9IGRlY193b3JkKGRlc3R2YWwpOworCQlzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSAyOgkJLyogY2FsbCB3b3JkIHB0ciAuLi4gKi8KKwkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgcHVzaF93b3JkKE0ueDg2LlJfSVApOworCSAgICBNLng4Ni5SX0lQID0gZGVzdHZhbDsKKwkgICAgYnJlYWs7CisJY2FzZSAzOgkJLyogY2FsbCBmYXIgcHRyIC4uLiAqLworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworCSAgICBkZXN0dmFsMiA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0ICsgMik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHB1c2hfd29yZChNLng4Ni5SX0NTKTsKKwkgICAgTS54ODYuUl9DUyA9IGRlc3R2YWwyOworCSAgICBwdXNoX3dvcmQoTS54ODYuUl9JUCk7CisJICAgIE0ueDg2LlJfSVAgPSBkZXN0dmFsOworCSAgICBicmVhazsKKwljYXNlIDQ6CQkvKiBqbXAgd29yZCBwdHIgLi4uICovCisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIE0ueDg2LlJfSVAgPSBkZXN0dmFsOworCSAgICBicmVhazsKKwljYXNlIDU6CQkvKiBqbXAgZmFyIHB0ciAuLi4gKi8KKwkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKwkgICAgZGVzdHZhbDIgPSBmZXRjaF9kYXRhX3dvcmQoZGVzdG9mZnNldCArIDIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBNLng4Ni5SX0lQID0gZGVzdHZhbDsKKwkgICAgTS54ODYuUl9DUyA9IGRlc3R2YWwyOworCSAgICBicmVhazsKKwljYXNlIDY6CQkvKiAgcHVzaCB3b3JkIHB0ciAuLi4gKi8KKwkgICAgaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJCXUzMiBkZXN0dmFsOworCisJCWRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisJCVRSQUNFX0FORF9TVEVQKCk7CisJCXB1c2hfbG9uZyhkZXN0dmFsKTsKKwkgICAgfSBlbHNlIHsKKwkJdTE2IGRlc3R2YWw7CisKKwkJZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJcHVzaF93b3JkKGRlc3R2YWwpOworCSAgICB9CisJICAgIGJyZWFrOworCX0KKyAgICB9IGVsc2UgeworCXN3aXRjaCAocmgpIHsKKwljYXNlIDA6CisJICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCQl1MzIgKmRlc3RyZWc7CisKKwkJZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJKmRlc3RyZWcgPSBpbmNfbG9uZygqZGVzdHJlZyk7CisJICAgIH0gZWxzZSB7CisJCXUxNiAqZGVzdHJlZzsKKworCQlkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQkqZGVzdHJlZyA9IGluY193b3JkKCpkZXN0cmVnKTsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIDE6CisJICAgIGlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCQl1MzIgKmRlc3RyZWc7CisKKwkJZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKwkJREVDT0RFX1BSSU5URigiXG4iKTsKKwkJVFJBQ0VfQU5EX1NURVAoKTsKKwkJKmRlc3RyZWcgPSBkZWNfbG9uZygqZGVzdHJlZyk7CisJICAgIH0gZWxzZSB7CisJCXUxNiAqZGVzdHJlZzsKKworCQlkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQkqZGVzdHJlZyA9IGRlY193b3JkKCpkZXN0cmVnKTsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIDI6CQkvKiBjYWxsIHdvcmQgcHRyIC4uLiAqLworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBwdXNoX3dvcmQoTS54ODYuUl9JUCk7CisJICAgIE0ueDg2LlJfSVAgPSAqZGVzdHJlZzsKKwkgICAgYnJlYWs7CisJY2FzZSAzOgkJLyogam1wIGZhciBwdHIgLi4uICovCisJICAgIERFQ09ERV9QUklOVEYoIk9QRVJBVElPTiBVTkRFRklORUQgMFhGRiBcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBIQUxUX1NZUygpOworCSAgICBicmVhazsKKworCWNhc2UgNDoJCS8qIGptcAkuLi4gKi8KKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgTS54ODYuUl9JUCA9ICh1MTYpICgqZGVzdHJlZyk7CisJICAgIGJyZWFrOworCWNhc2UgNToJCS8qIGptcCBmYXIgcHRyIC4uLiAqLworCSAgICBERUNPREVfUFJJTlRGKCJPUEVSQVRJT04gVU5ERUZJTkVEIDBYRkYgXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgSEFMVF9TWVMoKTsKKwkgICAgYnJlYWs7CisJY2FzZSA2OgorCSAgICBpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkJdTMyICpkZXN0cmVnOworCisJCWRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJCURFQ09ERV9QUklOVEYoIlxuIik7CisJCVRSQUNFX0FORF9TVEVQKCk7CisJCXB1c2hfbG9uZygqZGVzdHJlZyk7CisJICAgIH0gZWxzZSB7CisJCXUxNiAqZGVzdHJlZzsKKworCQlkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCQlERUNPREVfUFJJTlRGKCJcbiIpOworCQlUUkFDRV9BTkRfU1RFUCgpOworCQlwdXNoX3dvcmQoKmRlc3RyZWcpOworCSAgICB9CisJICAgIGJyZWFrOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTaW5nbGUgYnl0ZSBvcGVyYXRpb24gY29kZSB0YWJsZToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKCp4ODZlbXVfb3B0YWJbMjU2XSkodTgpIF9fYXR0cmlidXRlX18gKChzZWN0aW9uKCIuZ290MiIpKSkgPQoreworLyogIDB4MDAgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9STV9SLAorLyogIDB4MDEgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9STV9SLAorLyogIDB4MDIgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9SX1JNLAorLyogIDB4MDMgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9SX1JNLAorLyogIDB4MDQgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9BTF9JTU0sCisvKiAgMHgwNSAqLyB4ODZlbXVPcF9nZW5vcF93b3JkX0FYX0lNTSwKKy8qICAweDA2ICovIHg4NmVtdU9wX3B1c2hfRVMsCisvKiAgMHgwNyAqLyB4ODZlbXVPcF9wb3BfRVMsCisKKy8qICAweDA4ICovIHg4NmVtdU9wX2dlbm9wX2J5dGVfUk1fUiwKKy8qICAweDA5ICovIHg4NmVtdU9wX2dlbm9wX3dvcmRfUk1fUiwKKy8qICAweDBhICovIHg4NmVtdU9wX2dlbm9wX2J5dGVfUl9STSwKKy8qICAweDBiICovIHg4NmVtdU9wX2dlbm9wX3dvcmRfUl9STSwKKy8qICAweDBjICovIHg4NmVtdU9wX2dlbm9wX2J5dGVfQUxfSU1NLAorLyogIDB4MGQgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9BWF9JTU0sCisvKiAgMHgwZSAqLyB4ODZlbXVPcF9wdXNoX0NTLAorLyogIDB4MGYgKi8geDg2ZW11T3BfdHdvX2J5dGUsCisKKy8qICAweDEwICovIHg4NmVtdU9wX2dlbm9wX2J5dGVfUk1fUiwKKy8qICAweDExICovIHg4NmVtdU9wX2dlbm9wX3dvcmRfUk1fUiwKKy8qICAweDEyICovIHg4NmVtdU9wX2dlbm9wX2J5dGVfUl9STSwKKy8qICAweDEzICovIHg4NmVtdU9wX2dlbm9wX3dvcmRfUl9STSwKKy8qICAweDE0ICovIHg4NmVtdU9wX2dlbm9wX2J5dGVfQUxfSU1NLAorLyogIDB4MTUgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9BWF9JTU0sCisvKiAgMHgxNiAqLyB4ODZlbXVPcF9wdXNoX1NTLAorLyogIDB4MTcgKi8geDg2ZW11T3BfcG9wX1NTLAorCisvKiAgMHgxOCAqLyB4ODZlbXVPcF9nZW5vcF9ieXRlX1JNX1IsCisvKiAgMHgxOSAqLyB4ODZlbXVPcF9nZW5vcF93b3JkX1JNX1IsCisvKiAgMHgxYSAqLyB4ODZlbXVPcF9nZW5vcF9ieXRlX1JfUk0sCisvKiAgMHgxYiAqLyB4ODZlbXVPcF9nZW5vcF93b3JkX1JfUk0sCisvKiAgMHgxYyAqLyB4ODZlbXVPcF9nZW5vcF9ieXRlX0FMX0lNTSwKKy8qICAweDFkICovIHg4NmVtdU9wX2dlbm9wX3dvcmRfQVhfSU1NLAorLyogIDB4MWUgKi8geDg2ZW11T3BfcHVzaF9EUywKKy8qICAweDFmICovIHg4NmVtdU9wX3BvcF9EUywKKworLyogIDB4MjAgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9STV9SLAorLyogIDB4MjEgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9STV9SLAorLyogIDB4MjIgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9SX1JNLAorLyogIDB4MjMgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9SX1JNLAorLyogIDB4MjQgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9BTF9JTU0sCisvKiAgMHgyNSAqLyB4ODZlbXVPcF9nZW5vcF93b3JkX0FYX0lNTSwKKy8qICAweDI2ICovIHg4NmVtdU9wX3NlZ292cl9FUywKKy8qICAweDI3ICovIHg4NmVtdU9wX2RhYSwKKworLyogIDB4MjggKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9STV9SLAorLyogIDB4MjkgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9STV9SLAorLyogIDB4MmEgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9SX1JNLAorLyogIDB4MmIgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9SX1JNLAorLyogIDB4MmMgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9BTF9JTU0sCisvKiAgMHgyZCAqLyB4ODZlbXVPcF9nZW5vcF93b3JkX0FYX0lNTSwKKy8qICAweDJlICovIHg4NmVtdU9wX3NlZ292cl9DUywKKy8qICAweDJmICovIHg4NmVtdU9wX2RhcywKKworLyogIDB4MzAgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9STV9SLAorLyogIDB4MzEgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9STV9SLAorLyogIDB4MzIgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9SX1JNLAorLyogIDB4MzMgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9SX1JNLAorLyogIDB4MzQgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9BTF9JTU0sCisvKiAgMHgzNSAqLyB4ODZlbXVPcF9nZW5vcF93b3JkX0FYX0lNTSwKKy8qICAweDM2ICovIHg4NmVtdU9wX3NlZ292cl9TUywKKy8qICAweDM3ICovIHg4NmVtdU9wX2FhYSwKKworLyogIDB4MzggKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9STV9SLAorLyogIDB4MzkgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9STV9SLAorLyogIDB4M2EgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9SX1JNLAorLyogIDB4M2IgKi8geDg2ZW11T3BfZ2Vub3Bfd29yZF9SX1JNLAorLyogIDB4M2MgKi8geDg2ZW11T3BfZ2Vub3BfYnl0ZV9BTF9JTU0sCisvKiAgMHgzZCAqLyB4ODZlbXVPcF9nZW5vcF93b3JkX0FYX0lNTSwKKy8qICAweDNlICovIHg4NmVtdU9wX3NlZ292cl9EUywKKy8qICAweDNmICovIHg4NmVtdU9wX2FhcywKKworLyogIDB4NDAgKi8geDg2ZW11T3BfaW5jX3JlZ2lzdGVyLAorLyogIDB4NDEgKi8geDg2ZW11T3BfaW5jX3JlZ2lzdGVyLAorLyogIDB4NDIgKi8geDg2ZW11T3BfaW5jX3JlZ2lzdGVyLAorLyogIDB4NDMgKi8geDg2ZW11T3BfaW5jX3JlZ2lzdGVyLAorLyogIDB4NDQgKi8geDg2ZW11T3BfaW5jX3JlZ2lzdGVyLAorLyogIDB4NDUgKi8geDg2ZW11T3BfaW5jX3JlZ2lzdGVyLAorLyogIDB4NDYgKi8geDg2ZW11T3BfaW5jX3JlZ2lzdGVyLAorLyogIDB4NDcgKi8geDg2ZW11T3BfaW5jX3JlZ2lzdGVyLAorCisvKiAgMHg0OCAqLyB4ODZlbXVPcF9kZWNfcmVnaXN0ZXIsCisvKiAgMHg0OSAqLyB4ODZlbXVPcF9kZWNfcmVnaXN0ZXIsCisvKiAgMHg0YSAqLyB4ODZlbXVPcF9kZWNfcmVnaXN0ZXIsCisvKiAgMHg0YiAqLyB4ODZlbXVPcF9kZWNfcmVnaXN0ZXIsCisvKiAgMHg0YyAqLyB4ODZlbXVPcF9kZWNfcmVnaXN0ZXIsCisvKiAgMHg0ZCAqLyB4ODZlbXVPcF9kZWNfcmVnaXN0ZXIsCisvKiAgMHg0ZSAqLyB4ODZlbXVPcF9kZWNfcmVnaXN0ZXIsCisvKiAgMHg0ZiAqLyB4ODZlbXVPcF9kZWNfcmVnaXN0ZXIsCisKKy8qICAweDUwICovIHg4NmVtdU9wX3B1c2hfcmVnaXN0ZXIsCisvKiAgMHg1MSAqLyB4ODZlbXVPcF9wdXNoX3JlZ2lzdGVyLAorLyogIDB4NTIgKi8geDg2ZW11T3BfcHVzaF9yZWdpc3RlciwKKy8qICAweDUzICovIHg4NmVtdU9wX3B1c2hfcmVnaXN0ZXIsCisvKiAgMHg1NCAqLyB4ODZlbXVPcF9wdXNoX3JlZ2lzdGVyLAorLyogIDB4NTUgKi8geDg2ZW11T3BfcHVzaF9yZWdpc3RlciwKKy8qICAweDU2ICovIHg4NmVtdU9wX3B1c2hfcmVnaXN0ZXIsCisvKiAgMHg1NyAqLyB4ODZlbXVPcF9wdXNoX3JlZ2lzdGVyLAorCisvKiAgMHg1OCAqLyB4ODZlbXVPcF9wb3BfcmVnaXN0ZXIsCisvKiAgMHg1OSAqLyB4ODZlbXVPcF9wb3BfcmVnaXN0ZXIsCisvKiAgMHg1YSAqLyB4ODZlbXVPcF9wb3BfcmVnaXN0ZXIsCisvKiAgMHg1YiAqLyB4ODZlbXVPcF9wb3BfcmVnaXN0ZXIsCisvKiAgMHg1YyAqLyB4ODZlbXVPcF9wb3BfcmVnaXN0ZXIsCisvKiAgMHg1ZCAqLyB4ODZlbXVPcF9wb3BfcmVnaXN0ZXIsCisvKiAgMHg1ZSAqLyB4ODZlbXVPcF9wb3BfcmVnaXN0ZXIsCisvKiAgMHg1ZiAqLyB4ODZlbXVPcF9wb3BfcmVnaXN0ZXIsCisKKy8qICAweDYwICovIHg4NmVtdU9wX3B1c2hfYWxsLAorLyogIDB4NjEgKi8geDg2ZW11T3BfcG9wX2FsbCwKKy8qICAweDYyICovIHg4NmVtdU9wX2lsbGVnYWxfb3AsICAgLyogYm91bmQgKi8KKy8qICAweDYzICovIHg4NmVtdU9wX2lsbGVnYWxfb3AsICAgLyogYXJwbCAqLworLyogIDB4NjQgKi8geDg2ZW11T3Bfc2Vnb3ZyX0ZTLAorLyogIDB4NjUgKi8geDg2ZW11T3Bfc2Vnb3ZyX0dTLAorLyogIDB4NjYgKi8geDg2ZW11T3BfcHJlZml4X2RhdGEsCisvKiAgMHg2NyAqLyB4ODZlbXVPcF9wcmVmaXhfYWRkciwKKworLyogIDB4NjggKi8geDg2ZW11T3BfcHVzaF93b3JkX0lNTSwKKy8qICAweDY5ICovIHg4NmVtdU9wX2ltdWxfd29yZF9JTU0sCisvKiAgMHg2YSAqLyB4ODZlbXVPcF9wdXNoX2J5dGVfSU1NLAorLyogIDB4NmIgKi8geDg2ZW11T3BfaW11bF9ieXRlX0lNTSwKKy8qICAweDZjICovIHg4NmVtdU9wX2luc19ieXRlLAorLyogIDB4NmQgKi8geDg2ZW11T3BfaW5zX3dvcmQsCisvKiAgMHg2ZSAqLyB4ODZlbXVPcF9vdXRzX2J5dGUsCisvKiAgMHg2ZiAqLyB4ODZlbXVPcF9vdXRzX3dvcmQsCisKKy8qICAweDcwICovIHg4NmVtdU9wX2p1bXBfbmVhcl9jb25kLAorLyogIDB4NzEgKi8geDg2ZW11T3BfanVtcF9uZWFyX2NvbmQsCisvKiAgMHg3MiAqLyB4ODZlbXVPcF9qdW1wX25lYXJfY29uZCwKKy8qICAweDczICovIHg4NmVtdU9wX2p1bXBfbmVhcl9jb25kLAorLyogIDB4NzQgKi8geDg2ZW11T3BfanVtcF9uZWFyX2NvbmQsCisvKiAgMHg3NSAqLyB4ODZlbXVPcF9qdW1wX25lYXJfY29uZCwKKy8qICAweDc2ICovIHg4NmVtdU9wX2p1bXBfbmVhcl9jb25kLAorLyogIDB4NzcgKi8geDg2ZW11T3BfanVtcF9uZWFyX2NvbmQsCisKKy8qICAweDc4ICovIHg4NmVtdU9wX2p1bXBfbmVhcl9jb25kLAorLyogIDB4NzkgKi8geDg2ZW11T3BfanVtcF9uZWFyX2NvbmQsCisvKiAgMHg3YSAqLyB4ODZlbXVPcF9qdW1wX25lYXJfY29uZCwKKy8qICAweDdiICovIHg4NmVtdU9wX2p1bXBfbmVhcl9jb25kLAorLyogIDB4N2MgKi8geDg2ZW11T3BfanVtcF9uZWFyX2NvbmQsCisvKiAgMHg3ZCAqLyB4ODZlbXVPcF9qdW1wX25lYXJfY29uZCwKKy8qICAweDdlICovIHg4NmVtdU9wX2p1bXBfbmVhcl9jb25kLAorLyogIDB4N2YgKi8geDg2ZW11T3BfanVtcF9uZWFyX2NvbmQsCisKKy8qICAweDgwICovIHg4NmVtdU9wX29wYzgwX2J5dGVfUk1fSU1NLAorLyogIDB4ODEgKi8geDg2ZW11T3Bfb3BjODFfd29yZF9STV9JTU0sCisvKiAgMHg4MiAqLyB4ODZlbXVPcF9vcGM4Ml9ieXRlX1JNX0lNTSwKKy8qICAweDgzICovIHg4NmVtdU9wX29wYzgzX3dvcmRfUk1fSU1NLAorLyogIDB4ODQgKi8geDg2ZW11T3BfdGVzdF9ieXRlX1JNX1IsCisvKiAgMHg4NSAqLyB4ODZlbXVPcF90ZXN0X3dvcmRfUk1fUiwKKy8qICAweDg2ICovIHg4NmVtdU9wX3hjaGdfYnl0ZV9STV9SLAorLyogIDB4ODcgKi8geDg2ZW11T3BfeGNoZ193b3JkX1JNX1IsCisKKy8qICAweDg4ICovIHg4NmVtdU9wX21vdl9ieXRlX1JNX1IsCisvKiAgMHg4OSAqLyB4ODZlbXVPcF9tb3Zfd29yZF9STV9SLAorLyogIDB4OGEgKi8geDg2ZW11T3BfbW92X2J5dGVfUl9STSwKKy8qICAweDhiICovIHg4NmVtdU9wX21vdl93b3JkX1JfUk0sCisvKiAgMHg4YyAqLyB4ODZlbXVPcF9tb3Zfd29yZF9STV9TUiwKKy8qICAweDhkICovIHg4NmVtdU9wX2xlYV93b3JkX1JfTSwKKy8qICAweDhlICovIHg4NmVtdU9wX21vdl93b3JkX1NSX1JNLAorLyogIDB4OGYgKi8geDg2ZW11T3BfcG9wX1JNLAorCisvKiAgMHg5MCAqLyB4ODZlbXVPcF9ub3AsCisvKiAgMHg5MSAqLyB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfcmVnaXN0ZXIsCisvKiAgMHg5MiAqLyB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfcmVnaXN0ZXIsCisvKiAgMHg5MyAqLyB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfcmVnaXN0ZXIsCisvKiAgMHg5NCAqLyB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfcmVnaXN0ZXIsCisvKiAgMHg5NSAqLyB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfcmVnaXN0ZXIsCisvKiAgMHg5NiAqLyB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfcmVnaXN0ZXIsCisvKiAgMHg5NyAqLyB4ODZlbXVPcF94Y2hnX3dvcmRfQVhfcmVnaXN0ZXIsCisKKy8qICAweDk4ICovIHg4NmVtdU9wX2NidywKKy8qICAweDk5ICovIHg4NmVtdU9wX2N3ZCwKKy8qICAweDlhICovIHg4NmVtdU9wX2NhbGxfZmFyX0lNTSwKKy8qICAweDliICovIHg4NmVtdU9wX3dhaXQsCisvKiAgMHg5YyAqLyB4ODZlbXVPcF9wdXNoZl93b3JkLAorLyogIDB4OWQgKi8geDg2ZW11T3BfcG9wZl93b3JkLAorLyogIDB4OWUgKi8geDg2ZW11T3Bfc2FoZiwKKy8qICAweDlmICovIHg4NmVtdU9wX2xhaGYsCisKKy8qICAweGEwICovIHg4NmVtdU9wX21vdl9BTF9NX0lNTSwKKy8qICAweGExICovIHg4NmVtdU9wX21vdl9BWF9NX0lNTSwKKy8qICAweGEyICovIHg4NmVtdU9wX21vdl9NX0FMX0lNTSwKKy8qICAweGEzICovIHg4NmVtdU9wX21vdl9NX0FYX0lNTSwKKy8qICAweGE0ICovIHg4NmVtdU9wX21vdnNfYnl0ZSwKKy8qICAweGE1ICovIHg4NmVtdU9wX21vdnNfd29yZCwKKy8qICAweGE2ICovIHg4NmVtdU9wX2NtcHNfYnl0ZSwKKy8qICAweGE3ICovIHg4NmVtdU9wX2NtcHNfd29yZCwKKy8qICAweGE4ICovIHg4NmVtdU9wX3Rlc3RfQUxfSU1NLAorLyogIDB4YTkgKi8geDg2ZW11T3BfdGVzdF9BWF9JTU0sCisvKiAgMHhhYSAqLyB4ODZlbXVPcF9zdG9zX2J5dGUsCisvKiAgMHhhYiAqLyB4ODZlbXVPcF9zdG9zX3dvcmQsCisvKiAgMHhhYyAqLyB4ODZlbXVPcF9sb2RzX2J5dGUsCisvKiAgMHhhZCAqLyB4ODZlbXVPcF9sb2RzX3dvcmQsCisvKiAgMHhhYyAqLyB4ODZlbXVPcF9zY2FzX2J5dGUsCisvKiAgMHhhZCAqLyB4ODZlbXVPcF9zY2FzX3dvcmQsCisKKy8qICAweGIwICovIHg4NmVtdU9wX21vdl9ieXRlX3JlZ2lzdGVyX0lNTSwKKy8qICAweGIxICovIHg4NmVtdU9wX21vdl9ieXRlX3JlZ2lzdGVyX0lNTSwKKy8qICAweGIyICovIHg4NmVtdU9wX21vdl9ieXRlX3JlZ2lzdGVyX0lNTSwKKy8qICAweGIzICovIHg4NmVtdU9wX21vdl9ieXRlX3JlZ2lzdGVyX0lNTSwKKy8qICAweGI0ICovIHg4NmVtdU9wX21vdl9ieXRlX3JlZ2lzdGVyX0lNTSwKKy8qICAweGI1ICovIHg4NmVtdU9wX21vdl9ieXRlX3JlZ2lzdGVyX0lNTSwKKy8qICAweGI2ICovIHg4NmVtdU9wX21vdl9ieXRlX3JlZ2lzdGVyX0lNTSwKKy8qICAweGI3ICovIHg4NmVtdU9wX21vdl9ieXRlX3JlZ2lzdGVyX0lNTSwKKworLyogIDB4YjggKi8geDg2ZW11T3BfbW92X3dvcmRfcmVnaXN0ZXJfSU1NLAorLyogIDB4YjkgKi8geDg2ZW11T3BfbW92X3dvcmRfcmVnaXN0ZXJfSU1NLAorLyogIDB4YmEgKi8geDg2ZW11T3BfbW92X3dvcmRfcmVnaXN0ZXJfSU1NLAorLyogIDB4YmIgKi8geDg2ZW11T3BfbW92X3dvcmRfcmVnaXN0ZXJfSU1NLAorLyogIDB4YmMgKi8geDg2ZW11T3BfbW92X3dvcmRfcmVnaXN0ZXJfSU1NLAorLyogIDB4YmQgKi8geDg2ZW11T3BfbW92X3dvcmRfcmVnaXN0ZXJfSU1NLAorLyogIDB4YmUgKi8geDg2ZW11T3BfbW92X3dvcmRfcmVnaXN0ZXJfSU1NLAorLyogIDB4YmYgKi8geDg2ZW11T3BfbW92X3dvcmRfcmVnaXN0ZXJfSU1NLAorCisvKiAgMHhjMCAqLyB4ODZlbXVPcF9vcGNDMF9ieXRlX1JNX01FTSwKKy8qICAweGMxICovIHg4NmVtdU9wX29wY0MxX3dvcmRfUk1fTUVNLAorLyogIDB4YzIgKi8geDg2ZW11T3BfcmV0X25lYXJfSU1NLAorLyogIDB4YzMgKi8geDg2ZW11T3BfcmV0X25lYXIsCisvKiAgMHhjNCAqLyB4ODZlbXVPcF9sZXNfUl9JTU0sCisvKiAgMHhjNSAqLyB4ODZlbXVPcF9sZHNfUl9JTU0sCisvKiAgMHhjNiAqLyB4ODZlbXVPcF9tb3ZfYnl0ZV9STV9JTU0sCisvKiAgMHhjNyAqLyB4ODZlbXVPcF9tb3Zfd29yZF9STV9JTU0sCisvKiAgMHhjOCAqLyB4ODZlbXVPcF9lbnRlciwKKy8qICAweGM5ICovIHg4NmVtdU9wX2xlYXZlLAorLyogIDB4Y2EgKi8geDg2ZW11T3BfcmV0X2Zhcl9JTU0sCisvKiAgMHhjYiAqLyB4ODZlbXVPcF9yZXRfZmFyLAorLyogIDB4Y2MgKi8geDg2ZW11T3BfaW50MywKKy8qICAweGNkICovIHg4NmVtdU9wX2ludF9JTU0sCisvKiAgMHhjZSAqLyB4ODZlbXVPcF9pbnRvLAorLyogIDB4Y2YgKi8geDg2ZW11T3BfaXJldCwKKworLyogIDB4ZDAgKi8geDg2ZW11T3Bfb3BjRDBfYnl0ZV9STV8xLAorLyogIDB4ZDEgKi8geDg2ZW11T3Bfb3BjRDFfd29yZF9STV8xLAorLyogIDB4ZDIgKi8geDg2ZW11T3Bfb3BjRDJfYnl0ZV9STV9DTCwKKy8qICAweGQzICovIHg4NmVtdU9wX29wY0QzX3dvcmRfUk1fQ0wsCisvKiAgMHhkNCAqLyB4ODZlbXVPcF9hYW0sCisvKiAgMHhkNSAqLyB4ODZlbXVPcF9hYWQsCisvKiAgMHhkNiAqLyB4ODZlbXVPcF9pbGxlZ2FsX29wLCAgIC8qIFVuZG9jdW1lbnRlZCBTRVRBTEMgaW5zdHJ1Y3Rpb24gKi8KKy8qICAweGQ3ICovIHg4NmVtdU9wX3hsYXQsCisvKiAgMHhkOCAqLyBOVUxMLCAvKng4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZDgsKi8KKy8qICAweGQ5ICovIE5VTEwsIC8qeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kOSwqLworLyogIDB4ZGEgKi8gTlVMTCwgLyp4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RhLCovCisvKiAgMHhkYiAqLyBOVUxMLCAvKng4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZGIsKi8KKy8qICAweGRjICovIE5VTEwsIC8qeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kYywqLworLyogIDB4ZGQgKi8gTlVMTCwgLyp4ODZlbXVPcF9lc2NfY29wcm9jZXNzX2RkLCovCisvKiAgMHhkZSAqLyBOVUxMLCAvKng4NmVtdU9wX2VzY19jb3Byb2Nlc3NfZGUsKi8KKy8qICAweGRmICovIE5VTEwsIC8qeDg2ZW11T3BfZXNjX2NvcHJvY2Vzc19kZiwqLworCisvKiAgMHhlMCAqLyB4ODZlbXVPcF9sb29wbmUsCisvKiAgMHhlMSAqLyB4ODZlbXVPcF9sb29wZSwKKy8qICAweGUyICovIHg4NmVtdU9wX2xvb3AsCisvKiAgMHhlMyAqLyB4ODZlbXVPcF9qY3h6LAorLyogIDB4ZTQgKi8geDg2ZW11T3BfaW5fYnl0ZV9BTF9JTU0sCisvKiAgMHhlNSAqLyB4ODZlbXVPcF9pbl93b3JkX0FYX0lNTSwKKy8qICAweGU2ICovIHg4NmVtdU9wX291dF9ieXRlX0lNTV9BTCwKKy8qICAweGU3ICovIHg4NmVtdU9wX291dF93b3JkX0lNTV9BWCwKKworLyogIDB4ZTggKi8geDg2ZW11T3BfY2FsbF9uZWFyX0lNTSwKKy8qICAweGU5ICovIHg4NmVtdU9wX2p1bXBfbmVhcl9JTU0sCisvKiAgMHhlYSAqLyB4ODZlbXVPcF9qdW1wX2Zhcl9JTU0sCisvKiAgMHhlYiAqLyB4ODZlbXVPcF9qdW1wX2J5dGVfSU1NLAorLyogIDB4ZWMgKi8geDg2ZW11T3BfaW5fYnl0ZV9BTF9EWCwKKy8qICAweGVkICovIHg4NmVtdU9wX2luX3dvcmRfQVhfRFgsCisvKiAgMHhlZSAqLyB4ODZlbXVPcF9vdXRfYnl0ZV9EWF9BTCwKKy8qICAweGVmICovIHg4NmVtdU9wX291dF93b3JkX0RYX0FYLAorCisvKiAgMHhmMCAqLyB4ODZlbXVPcF9sb2NrLAorLyogIDB4ZjEgKi8geDg2ZW11T3BfaWxsZWdhbF9vcCwKKy8qICAweGYyICovIHg4NmVtdU9wX3JlcG5lLAorLyogIDB4ZjMgKi8geDg2ZW11T3BfcmVwZSwKKy8qICAweGY0ICovIHg4NmVtdU9wX2hhbHQsCisvKiAgMHhmNSAqLyB4ODZlbXVPcF9jbWMsCisvKiAgMHhmNiAqLyB4ODZlbXVPcF9vcGNGNl9ieXRlX1JNLAorLyogIDB4ZjcgKi8geDg2ZW11T3Bfb3BjRjdfd29yZF9STSwKKworLyogIDB4ZjggKi8geDg2ZW11T3BfY2xjLAorLyogIDB4ZjkgKi8geDg2ZW11T3Bfc3RjLAorLyogIDB4ZmEgKi8geDg2ZW11T3BfY2xpLAorLyogIDB4ZmIgKi8geDg2ZW11T3Bfc3RpLAorLyogIDB4ZmMgKi8geDg2ZW11T3BfY2xkLAorLyogIDB4ZmQgKi8geDg2ZW11T3Bfc3RkLAorLyogIDB4ZmUgKi8geDg2ZW11T3Bfb3BjRkVfYnl0ZV9STSwKKy8qICAweGZmICovIHg4NmVtdU9wX29wY0ZGX3dvcmRfUk0sCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmlvc19lbXVsYXRvci94ODZlbXUvb3BzMi5jIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL3g4NmVtdS9vcHMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFjMGQ0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmlvc19lbXVsYXRvci94ODZlbXUvb3BzMi5jCkBAIC0wLDAgKzEsMTc3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoJCQlSZWFsbW9kZSBYODYgRW11bGF0b3IgTGlicmFyeQorKgorKiAgQ29weXJpZ2h0IChDKSAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqICBKYXNvbiBKaW4gPEphc29uLmppbkBmcmVlc2NhbGUuY29tPgorKgorKgkJQ29weXJpZ2h0IChDKSAxOTkxLTIwMDQgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKgkJICAgICBDb3B5cmlnaHQgKEMpIERhdmlkIE1vc2Jlcmdlci1UYW5nCisqCQkgICAgICAgQ29weXJpZ2h0IChDKSAxOTk5IEVnYmVydCBFaWNoCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisqICBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisqICBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisqICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyogIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbm90IGJlIHVzZWQKKyogIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKKyogIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4JVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOglBTlNJIEMKKyogRW52aXJvbm1lbnQ6CUFueQorKiBEZXZlbG9wZXI6CUtlbmRhbGwgQmVubmV0dAorKgorKiBEZXNjcmlwdGlvbjoJVGhpcyBmaWxlIGluY2x1ZGVzIHN1YnJvdXRpbmVzIHRvIGltcGxlbWVudCB0aGUgZGVjb2RpbmcKKyoJCWFuZCBlbXVsYXRpb24gb2YgYWxsIHRoZSB4ODYgZXh0ZW5kZWQgdHdvLWJ5dGUgcHJvY2Vzc29yCisqCQlpbnN0cnVjdGlvbnMuCisqCisqCQlKYXNvbiBwb3J0IHRoaXMgZmlsZSB0byB1LWJvb3QuIFB1dCB0aGUgZnVuY3Rpb24gcG9pbnRlciBpbnRvCisqCQlnb3QyIHNlY3Rvci4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ4ODZlbXUveDg2ZW11aS5oIgorCisjaWYgZGVmaW5lZChDT05GSUdfQklPU0VNVSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitvcDEgLSBJbnN0cnVjdGlvbiBvcCBjb2RlCisKK1JFTUFSS1M6CitIYW5kbGVzIGlsbGVnYWwgb3Bjb2Rlcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9pbGxlZ2FsX29wKAorICAgIHU4IG9wMikKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIklMTEVHQUwgRVhURU5ERUQgWDg2IE9QQ09ERVxuIik7CisgICAgVFJBQ0VfUkVHUygpOworICAgIHByaW50aygiJTA0eDolMDR4OiAlMDJYIElMTEVHQUwgRVhURU5ERUQgWDg2IE9QQ09ERSFcbiIsCisJTS54ODYuUl9DUywgTS54ODYuUl9JUC0yLG9wMik7CisgICAgSEFMVF9TWVMoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworI2RlZmluZSB4b3JsKGEsYikgICAoKGEpICYmICEoYikpIHx8ICghKGEpICYmIChiKSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4ODAtMHg4RgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB4ODZlbXVfY2hlY2tfanVtcF9jb25kaXRpb24odTggb3ApCit7CisgICAgc3dpdGNoIChvcCkgeworICAgICAgY2FzZSAweDA6CisJREVDT0RFX1BSSU5URigiSk9cdCIpOworCXJldHVybiBBQ0NFU1NfRkxBRyhGX09GKTsKKyAgICAgIGNhc2UgMHgxOgorCURFQ09ERV9QUklOVEYoIkpOT1x0Iik7CisJcmV0dXJuICFBQ0NFU1NfRkxBRyhGX09GKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMHgyOgorCURFQ09ERV9QUklOVEYoIkpCXHQiKTsKKwlyZXR1cm4gQUNDRVNTX0ZMQUcoRl9DRik7CisJYnJlYWs7CisgICAgICBjYXNlIDB4MzoKKwlERUNPREVfUFJJTlRGKCJKTkJcdCIpOworCXJldHVybiAhQUNDRVNTX0ZMQUcoRl9DRik7CisJYnJlYWs7CisgICAgICBjYXNlIDB4NDoKKwlERUNPREVfUFJJTlRGKCJKWlx0Iik7CisJcmV0dXJuIEFDQ0VTU19GTEFHKEZfWkYpOworCWJyZWFrOworICAgICAgY2FzZSAweDU6CisJREVDT0RFX1BSSU5URigiSk5aXHQiKTsKKwlyZXR1cm4gIUFDQ0VTU19GTEFHKEZfWkYpOworCWJyZWFrOworICAgICAgY2FzZSAweDY6CisJREVDT0RFX1BSSU5URigiSkJFXHQiKTsKKwlyZXR1cm4gQUNDRVNTX0ZMQUcoRl9DRikgfHwgQUNDRVNTX0ZMQUcoRl9aRik7CisJYnJlYWs7CisgICAgICBjYXNlIDB4NzoKKwlERUNPREVfUFJJTlRGKCJKTkJFXHQiKTsKKwlyZXR1cm4gIShBQ0NFU1NfRkxBRyhGX0NGKSB8fCBBQ0NFU1NfRkxBRyhGX1pGKSk7CisJYnJlYWs7CisgICAgICBjYXNlIDB4ODoKKwlERUNPREVfUFJJTlRGKCJKU1x0Iik7CisJcmV0dXJuIEFDQ0VTU19GTEFHKEZfU0YpOworCWJyZWFrOworICAgICAgY2FzZSAweDk6CisJREVDT0RFX1BSSU5URigiSk5TXHQiKTsKKwlyZXR1cm4gIUFDQ0VTU19GTEFHKEZfU0YpOworCWJyZWFrOworICAgICAgY2FzZSAweGE6CisJREVDT0RFX1BSSU5URigiSlBcdCIpOworCXJldHVybiBBQ0NFU1NfRkxBRyhGX1BGKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMHhiOgorCURFQ09ERV9QUklOVEYoIkpOUFx0Iik7CisJcmV0dXJuICFBQ0NFU1NfRkxBRyhGX1BGKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMHhjOgorCURFQ09ERV9QUklOVEYoIkpMXHQiKTsKKwlyZXR1cm4geG9ybChBQ0NFU1NfRkxBRyhGX1NGKSwgQUNDRVNTX0ZMQUcoRl9PRikpOworCWJyZWFrOworICAgICAgY2FzZSAweGQ6CisJREVDT0RFX1BSSU5URigiSk5MXHQiKTsKKwlyZXR1cm4gIXhvcmwoQUNDRVNTX0ZMQUcoRl9TRiksIEFDQ0VTU19GTEFHKEZfT0YpKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMHhlOgorCURFQ09ERV9QUklOVEYoIkpMRVx0Iik7CisJcmV0dXJuICh4b3JsKEFDQ0VTU19GTEFHKEZfU0YpLCBBQ0NFU1NfRkxBRyhGX09GKSkgfHwKKwkJQUNDRVNTX0ZMQUcoRl9aRikpOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwlERUNPREVfUFJJTlRGKCJKTkxFXHQiKTsKKwlyZXR1cm4gISh4b3JsKEFDQ0VTU19GTEFHKEZfU0YpLCBBQ0NFU1NfRkxBRyhGX09GKSkgfHwKKwkJIEFDQ0VTU19GTEFHKEZfWkYpKTsKKyAgICB9Cit9CisKK3ZvaWQgeDg2ZW11T3AyX2xvbmdfanVtcCh1OCBvcDIpCit7CisgICAgczMyIHRhcmdldDsKKyAgICBpbnQgY29uZDsKKworICAgIC8qIGNvbmRpdGlvbmFsIGp1bXAgdG8gd29yZCBvZmZzZXQuICovCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBjb25kID0geDg2ZW11X2NoZWNrX2p1bXBfY29uZGl0aW9uKG9wMiAmIDB4Rik7CisgICAgdGFyZ2V0ID0gKHMxNikgZmV0Y2hfd29yZF9pbW0oKTsKKyAgICB0YXJnZXQgKz0gKHMxNikgTS54ODYuUl9JUDsKKyAgICBERUNPREVfUFJJTlRGMigiJTA0eFxuIiwgdGFyZ2V0KTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIGlmIChjb25kKQorCU0ueDg2LlJfSVAgPSAodTE2KXRhcmdldDsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweDkwLTB4OUYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9zZXRfYnl0ZSh1OCBvcDIpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKyAgICB1OAkqZGVzdHJlZzsKKyAgICBjaGFyICpuYW1lID0gMDsKKyAgICBpbnQgY29uZCA9IDA7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIHN3aXRjaCAob3AyKSB7CisgICAgICBjYXNlIDB4OTA6CisJbmFtZSA9ICJTRVRPXHQiOworCWNvbmQgPQlBQ0NFU1NfRkxBRyhGX09GKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMHg5MToKKwluYW1lID0gIlNFVE5PXHQiOworCWNvbmQgPSAhQUNDRVNTX0ZMQUcoRl9PRik7CisJYnJlYWs7CisgICAgICBjYXNlIDB4OTI6CisJbmFtZSA9ICJTRVRCXHQiOworCWNvbmQgPSBBQ0NFU1NfRkxBRyhGX0NGKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMHg5MzoKKwluYW1lID0gIlNFVE5CXHQiOworCWNvbmQgPSAhQUNDRVNTX0ZMQUcoRl9DRik7CisJYnJlYWs7CisgICAgICBjYXNlIDB4OTQ6CisJbmFtZSA9ICJTRVRaXHQiOworCWNvbmQgPSBBQ0NFU1NfRkxBRyhGX1pGKTsKKwlicmVhazsKKyAgICAgIGNhc2UgMHg5NToKKwluYW1lID0gIlNFVE5aXHQiOworCWNvbmQgPSAhQUNDRVNTX0ZMQUcoRl9aRik7CisJYnJlYWs7CisgICAgICBjYXNlIDB4OTY6CisJbmFtZSA9ICJTRVRCRVx0IjsKKwljb25kID0gQUNDRVNTX0ZMQUcoRl9DRikgfHwgQUNDRVNTX0ZMQUcoRl9aRik7CisJYnJlYWs7CisgICAgICBjYXNlIDB4OTc6CisJbmFtZSA9ICJTRVROQkVcdCI7CisJY29uZCA9ICEoQUNDRVNTX0ZMQUcoRl9DRikgfHwgQUNDRVNTX0ZMQUcoRl9aRikpOworCWJyZWFrOworICAgICAgY2FzZSAweDk4OgorCW5hbWUgPSAiU0VUU1x0IjsKKwljb25kID0gQUNDRVNTX0ZMQUcoRl9TRik7CisJYnJlYWs7CisgICAgICBjYXNlIDB4OTk6CisJbmFtZSA9ICJTRVROU1x0IjsKKwljb25kID0gIUFDQ0VTU19GTEFHKEZfU0YpOworCWJyZWFrOworICAgICAgY2FzZSAweDlhOgorCW5hbWUgPSAiU0VUUFx0IjsKKwljb25kID0gQUNDRVNTX0ZMQUcoRl9QRik7CisJYnJlYWs7CisgICAgICBjYXNlIDB4OWI6CisJbmFtZSA9ICJTRVROUFx0IjsKKwljb25kID0gIUFDQ0VTU19GTEFHKEZfUEYpOworCWJyZWFrOworICAgICAgY2FzZSAweDljOgorCW5hbWUgPSAiU0VUTFx0IjsKKwljb25kID0geG9ybChBQ0NFU1NfRkxBRyhGX1NGKSwgQUNDRVNTX0ZMQUcoRl9PRikpOworCWJyZWFrOworICAgICAgY2FzZSAweDlkOgorCW5hbWUgPSAiU0VUTkxcdCI7CisJY29uZCA9ICF4b3JsKEFDQ0VTU19GTEFHKEZfU0YpLCBBQ0NFU1NfRkxBRyhGX09GKSk7CisJYnJlYWs7CisgICAgICBjYXNlIDB4OWU6CisJbmFtZSA9ICJTRVRMRVx0IjsKKwljb25kID0gKHhvcmwoQUNDRVNTX0ZMQUcoRl9TRiksIEFDQ0VTU19GTEFHKEZfT0YpKSB8fAorCQlBQ0NFU1NfRkxBRyhGX1pGKSk7CisJYnJlYWs7CisgICAgICBjYXNlIDB4OWY6CisJbmFtZSA9ICJTRVROTEVcdCI7CisJY29uZCA9ICEoeG9ybChBQ0NFU1NfRkxBRyhGX1NGKSwgQUNDRVNTX0ZMQUcoRl9PRikpIHx8CisJCSBBQ0NFU1NfRkxBRyhGX1pGKSk7CisJYnJlYWs7CisgICAgfQorICAgIERFQ09ERV9QUklOVEYobmFtZSk7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCVRSQUNFX0FORF9TVEVQKCk7CisJc3RvcmVfZGF0YV9ieXRlKGRlc3RvZmZzZXQsIGNvbmQgPyAweDAxIDogMHgwMCk7CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlkZXN0cmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKmRlc3RyZWcgPSBjb25kID8gMHgwMSA6IDB4MDA7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YTAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9wdXNoX0ZTKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlBVU0hcdEZTXG4iKTsKKyAgICBUUkFDRV9BTkRfU1RFUCgpOworICAgIHB1c2hfd29yZChNLng4Ni5SX0ZTKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweGExCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcDJfcG9wX0ZTKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKK3sKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlBPUFx0RlNcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgTS54ODYuUl9GUyA9IHBvcF93b3JkKCk7CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhhMworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX2J0X1IodTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IHNyY29mZnNldDsKKyAgICBpbnQgYml0LGRpc3A7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkJUXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyIHNyY3ZhbDsKKwkgICAgdTMyICpzaGlmdHJlZzsKKworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweDFGOworCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwKTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgKDB4MSA8PCBiaXQpLEZfQ0YpOworCX0gZWxzZSB7CisJICAgIHUxNiBzcmN2YWw7CisJICAgIHUxNiAqc2hpZnRyZWc7CisKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHhGOworCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNDsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwKTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgKDB4MSA8PCBiaXQpLEZfQ0YpOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKnNyY3JlZywqc2hpZnRyZWc7CisKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweDFGOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnICYgKDB4MSA8PCBiaXQpLEZfQ0YpOworCX0gZWxzZSB7CisJICAgIHUxNiAqc3JjcmVnLCpzaGlmdHJlZzsKKworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyAmICgweDEgPDwgYml0KSxGX0NGKTsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YTQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9zaGxkX0lNTSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKyAgICB1OCBzaGlmdDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiU0hMRFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgZGVzdHZhbDsKKwkgICAgdTMyICpzaGlmdHJlZzsKKworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisJICAgIGRlc3R2YWwgPSBzaGxkX2xvbmcoZGVzdHZhbCwqc2hpZnRyZWcsc2hpZnQpOworCSAgICBzdG9yZV9kYXRhX2xvbmcoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJfSBlbHNlIHsKKwkgICAgdTE2IGRlc3R2YWw7CisJICAgIHUxNiAqc2hpZnRyZWc7CisKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFxuIiwgc2hpZnQpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworCSAgICBkZXN0dmFsID0gc2hsZF93b3JkKGRlc3R2YWwsKnNoaWZ0cmVnLHNoaWZ0KTsKKwkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWcsKnNoaWZ0cmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSBzaGxkX2xvbmcoKmRlc3RyZWcsKnNoaWZ0cmVnLHNoaWZ0KTsKKwl9IGVsc2UgeworCSAgICB1MTYgKmRlc3RyZWcsKnNoaWZ0cmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSBzaGxkX3dvcmQoKmRlc3RyZWcsKnNoaWZ0cmVnLHNoaWZ0KTsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YTUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9zaGxkX0NMKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBkZXN0b2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJTSExEXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJZGVzdG9mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiBkZXN0dmFsOworCSAgICB1MzIgKnNoaWZ0cmVnOworCisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisJICAgIGRlc3R2YWwgPSBzaGxkX2xvbmcoZGVzdHZhbCwqc2hpZnRyZWcsTS54ODYuUl9DTCk7CisJICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwl9IGVsc2UgeworCSAgICB1MTYgZGVzdHZhbDsKKwkgICAgdTE2ICpzaGlmdHJlZzsKKworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsQ0xcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV93b3JkKGRlc3RvZmZzZXQpOworCSAgICBkZXN0dmFsID0gc2hsZF93b3JkKGRlc3R2YWwsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOworCSAgICBzdG9yZV9kYXRhX3dvcmQoZGVzdG9mZnNldCwgZGVzdHZhbCk7CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqZGVzdHJlZywqc2hpZnRyZWc7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSBzaGxkX2xvbmcoKmRlc3RyZWcsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOworCX0gZWxzZSB7CisJICAgIHUxNiAqZGVzdHJlZywqc2hpZnRyZWc7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSBzaGxkX3dvcmQoKmRlc3RyZWcsKnNoaWZ0cmVnLE0ueDg2LlJfQ0wpOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhhOAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX3B1c2hfR1ModTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUFVTSFx0R1NcbiIpOworICAgIFRSQUNFX0FORF9TVEVQKCk7CisgICAgcHVzaF93b3JkKE0ueDg2LlJfR1MpOworICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YTkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9wb3BfR1ModTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiUE9QXHRHU1xuIik7CisgICAgVFJBQ0VfQU5EX1NURVAoKTsKKyAgICBNLng4Ni5SX0dTID0gcG9wX3dvcmQoKTsKKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweGFhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcDJfYnRzX1IodTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IHNyY29mZnNldDsKKyAgICBpbnQgYml0LGRpc3A7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkJUU1x0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCXNyY29mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiBzcmN2YWwsbWFzazsKKwkgICAgdTMyICpzaGlmdHJlZzsKKworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweDFGOworCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwKTsKKwkgICAgbWFzayA9ICgweDEgPDwgYml0KTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKKwkgICAgc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwLCBzcmN2YWwgfCBtYXNrKTsKKwl9IGVsc2UgeworCSAgICB1MTYgc3JjdmFsLG1hc2s7CisJICAgIHUxNiAqc2hpZnRyZWc7CisKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHhGOworCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNDsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwKTsKKwkgICAgbWFzayA9ICh1MTYpKDB4MSA8PCBiaXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOworCSAgICBzdG9yZV9kYXRhX3dvcmQoc3Jjb2Zmc2V0K2Rpc3AsIHNyY3ZhbCB8IG1hc2spOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKnNyY3JlZywqc2hpZnRyZWc7CisJICAgIHUzMiBtYXNrOworCisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKKwkgICAgbWFzayA9ICgweDEgPDwgYml0KTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyAmIG1hc2ssRl9DRik7CisJICAgICpzcmNyZWcgfD0gbWFzazsKKwl9IGVsc2UgeworCSAgICB1MTYgKnNyY3JlZywqc2hpZnRyZWc7CisJICAgIHUxNiBtYXNrOworCisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHhGOworCSAgICBtYXNrID0gKHUxNikoMHgxIDw8IGJpdCk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKCpzcmNyZWcgJiBtYXNrLEZfQ0YpOworCSAgICAqc3JjcmVnIHw9IG1hc2s7CisJfQorICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweGFjCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcDJfc2hyZF9JTU0odTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IGRlc3RvZmZzZXQ7CisgICAgdTggc2hpZnQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIlNITERcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlkZXN0b2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyIGRlc3R2YWw7CisJICAgIHUzMiAqc2hpZnRyZWc7CisKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIlZFxuIiwgc2hpZnQpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBkZXN0dmFsID0gZmV0Y2hfZGF0YV9sb25nKGRlc3RvZmZzZXQpOworCSAgICBkZXN0dmFsID0gc2hyZF9sb25nKGRlc3R2YWwsKnNoaWZ0cmVnLHNoaWZ0KTsKKwkgICAgc3RvcmVfZGF0YV9sb25nKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCX0gZWxzZSB7CisJICAgIHUxNiBkZXN0dmFsOworCSAgICB1MTYgKnNoaWZ0cmVnOworCisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnQgPSBmZXRjaF9ieXRlX2ltbSgpOworCSAgICBERUNPREVfUFJJTlRGMigiJWRcbiIsIHNoaWZ0KTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKwkgICAgZGVzdHZhbCA9IHNocmRfd29yZChkZXN0dmFsLCpzaGlmdHJlZyxzaGlmdCk7CisJICAgIHN0b3JlX2RhdGFfd29yZChkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwl9CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyICpkZXN0cmVnLCpzaGlmdHJlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gc2hyZF9sb25nKCpkZXN0cmVnLCpzaGlmdHJlZyxzaGlmdCk7CisJfSBlbHNlIHsKKwkgICAgdTE2ICpkZXN0cmVnLCpzaGlmdHJlZzsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0ID0gZmV0Y2hfYnl0ZV9pbW0oKTsKKwkgICAgREVDT0RFX1BSSU5URjIoIiVkXG4iLCBzaGlmdCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gc2hyZF93b3JkKCpkZXN0cmVnLCpzaGlmdHJlZyxzaGlmdCk7CisJfQorICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweGFkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcDJfc2hyZF9DTCh1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgZGVzdG9mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiU0hMRFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCWRlc3RvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyIGRlc3R2YWw7CisJICAgIHUzMiAqc2hpZnRyZWc7CisKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGRlc3R2YWwgPSBmZXRjaF9kYXRhX2xvbmcoZGVzdG9mZnNldCk7CisJICAgIGRlc3R2YWwgPSBzaHJkX2xvbmcoZGVzdHZhbCwqc2hpZnRyZWcsTS54ODYuUl9DTCk7CisJICAgIHN0b3JlX2RhdGFfbG9uZyhkZXN0b2Zmc2V0LCBkZXN0dmFsKTsKKwl9IGVsc2UgeworCSAgICB1MTYgZGVzdHZhbDsKKwkgICAgdTE2ICpzaGlmdHJlZzsKKworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLENMXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgZGVzdHZhbCA9IGZldGNoX2RhdGFfd29yZChkZXN0b2Zmc2V0KTsKKwkgICAgZGVzdHZhbCA9IHNocmRfd29yZChkZXN0dmFsLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKKwkgICAgc3RvcmVfZGF0YV93b3JkKGRlc3RvZmZzZXQsIGRlc3R2YWwpOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWcsKnNoaWZ0cmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gc2hyZF9sb25nKCpkZXN0cmVnLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKKwl9IGVsc2UgeworCSAgICB1MTYgKmRlc3RyZWcsKnNoaWZ0cmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIixDTFxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gc2hyZF93b3JkKCpkZXN0cmVnLCpzaGlmdHJlZyxNLng4Ni5SX0NMKTsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YWYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9pbXVsX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IHNyY29mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiSU1VTFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWc7CisJICAgIHUzMiBzcmN2YWw7CisJICAgIHUzMiByZXNfbG8scmVzX2hpOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGltdWxfbG9uZ19kaXJlY3QoJnJlc19sbywmcmVzX2hpLChzMzIpKmRlc3RyZWcsKHMzMilzcmN2YWwpOworCSAgICBpZiAocmVzX2hpICE9IDApIHsKKwkJU0VUX0ZMQUcoRl9DRik7CisJCVNFVF9GTEFHKEZfT0YpOworCSAgICB9IGVsc2UgeworCQlDTEVBUl9GTEFHKEZfQ0YpOworCQlDTEVBUl9GTEFHKEZfT0YpOworCSAgICB9CisJICAgICpkZXN0cmVnID0gKHUzMilyZXNfbG87CisJfSBlbHNlIHsKKwkgICAgdTE2ICpkZXN0cmVnOworCSAgICB1MTYgc3JjdmFsOworCSAgICB1MzIgcmVzOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHJlcyA9IChzMTYpKmRlc3RyZWcgKiAoczE2KXNyY3ZhbDsKKwkgICAgaWYgKHJlcyA+IDB4RkZGRikgeworCQlTRVRfRkxBRyhGX0NGKTsKKwkJU0VUX0ZMQUcoRl9PRik7CisJICAgIH0gZWxzZSB7CisJCUNMRUFSX0ZMQUcoRl9DRik7CisJCUNMRUFSX0ZMQUcoRl9PRik7CisJICAgIH0KKwkgICAgKmRlc3RyZWcgPSAodTE2KXJlczsKKwl9CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyICpkZXN0cmVnLCpzcmNyZWc7CisJICAgIHUzMiByZXNfbG8scmVzX2hpOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBpbXVsX2xvbmdfZGlyZWN0KCZyZXNfbG8sJnJlc19oaSwoczMyKSpkZXN0cmVnLChzMzIpKnNyY3JlZyk7CisJICAgIGlmIChyZXNfaGkgIT0gMCkgeworCQlTRVRfRkxBRyhGX0NGKTsKKwkJU0VUX0ZMQUcoRl9PRik7CisJICAgIH0gZWxzZSB7CisJCUNMRUFSX0ZMQUcoRl9DRik7CisJCUNMRUFSX0ZMQUcoRl9PRik7CisJICAgIH0KKwkgICAgKmRlc3RyZWcgPSAodTMyKXJlc19sbzsKKwl9IGVsc2UgeworCSAgICB1MTYgKmRlc3RyZWcsKnNyY3JlZzsKKwkgICAgdTMyIHJlczsKKworCSAgICBkZXN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwkgICAgcmVzID0gKHMxNikqZGVzdHJlZyAqIChzMTYpKnNyY3JlZzsKKwkgICAgaWYgKHJlcyA+IDB4RkZGRikgeworCQlTRVRfRkxBRyhGX0NGKTsKKwkJU0VUX0ZMQUcoRl9PRik7CisJICAgIH0gZWxzZSB7CisJCUNMRUFSX0ZMQUcoRl9DRik7CisJCUNMRUFSX0ZMQUcoRl9PRik7CisJICAgIH0KKwkgICAgKmRlc3RyZWcgPSAodTE2KXJlczsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YjIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9sc3NfUl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIGludCBtb2QsIHJoLCBybDsKKyAgICB1MTYgKmRzdHJlZzsKKyAgICB1aW50IHNyY29mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTFNTXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwkqZHN0cmVnID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisJTS54ODYuUl9TUyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQgKyAyKTsKKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCS8qIFVOREVGSU5FRCEgKi8KKwlUUkFDRV9BTkRfU1RFUCgpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweGIzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcDJfYnRyX1IodTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IHNyY29mZnNldDsKKyAgICBpbnQgYml0LGRpc3A7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkJUUlx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCXNyY29mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgc3JjdmFsLG1hc2s7CisJICAgIHUzMiAqc2hpZnRyZWc7CisKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4MUY7CisJICAgIGRpc3AgPSAoczE2KSpzaGlmdHJlZyA+PiA1OworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3ApOworCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOworCSAgICBzdG9yZV9kYXRhX2xvbmcoc3Jjb2Zmc2V0K2Rpc3AsIHNyY3ZhbCAmIH5tYXNrKTsKKwl9IGVsc2UgeworCSAgICB1MTYgc3JjdmFsLG1hc2s7CisJICAgIHUxNiAqc2hpZnRyZWc7CisKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKKwkgICAgZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDQ7CisJICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCk7CisJICAgIG1hc2sgPSAodTE2KSgweDEgPDwgYml0KTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKKwkgICAgc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwLCAodTE2KShzcmN2YWwgJiB+bWFzaykpOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKnNyY3JlZywqc2hpZnRyZWc7CisJICAgIHUzMiBtYXNrOworCisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzaGlmdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgYml0ID0gKnNoaWZ0cmVnICYgMHgxRjsKKwkgICAgbWFzayA9ICgweDEgPDwgYml0KTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyAmIG1hc2ssRl9DRik7CisJICAgICpzcmNyZWcgJj0gfm1hc2s7CisJfSBlbHNlIHsKKwkgICAgdTE2ICpzcmNyZWcsKnNoaWZ0cmVnOworCSAgICB1MTYgbWFzazsKKworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKKwkgICAgbWFzayA9ICh1MTYpKDB4MSA8PCBiaXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnICYgbWFzayxGX0NGKTsKKwkgICAgKnNyY3JlZyAmPSB+bWFzazsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YjQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9sZnNfUl9JTU0odTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIGludCBtb2QsIHJoLCBybDsKKyAgICB1MTYgKmRzdHJlZzsKKyAgICB1aW50IHNyY29mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTEZTXHQiKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwkqZHN0cmVnID0gZmV0Y2hfZGF0YV93b3JkKHNyY29mZnNldCk7CisJTS54ODYuUl9GUyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQgKyAyKTsKKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCS8qIFVOREVGSU5FRCEgKi8KKwlUUkFDRV9BTkRfU1RFUCgpOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweGI1CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcDJfbGdzX1JfSU1NKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKK3sKKyAgICBpbnQgbW9kLCByaCwgcmw7CisgICAgdTE2ICpkc3RyZWc7CisgICAgdWludCBzcmNvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkxHU1x0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCWRzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKmRzdHJlZyA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworCU0ueDg2LlJfR1MgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0ICsgMik7CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwkvKiBVTkRFRklORUQhICovCisJVFJBQ0VfQU5EX1NURVAoKTsKKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX21vdnp4X2J5dGVfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgc3Jjb2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZaWFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWc7CisJICAgIHUzMiBzcmN2YWw7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2J5dGUoc3Jjb2Zmc2V0KTsKKwkgICAgREVDT0RFX1BSSU5URigiXG4iKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgKmRlc3RyZWcgPSBzcmN2YWw7CisJfSBlbHNlIHsKKwkgICAgdTE2ICpkZXN0cmVnOworCSAgICB1MTYgc3JjdmFsOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gc3JjdmFsOworCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWc7CisJICAgIHU4CSpzcmNyZWc7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gKnNyY3JlZzsKKwl9IGVsc2UgeworCSAgICB1MTYgKmRlc3RyZWc7CisJICAgIHU4CSpzcmNyZWc7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gKnNyY3JlZzsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YjcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9tb3Z6eF93b3JkX1JfUk0odTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IHNyY29mZnNldDsKKyAgICB1MzIgKmRlc3RyZWc7CisgICAgdTMyIHNyY3ZhbDsKKyAgICB1MTYgKnNyY3JlZzsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiTU9WWlhcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlkZXN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCXNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwkqZGVzdHJlZyA9IHNyY3ZhbDsKKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCXNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwlERUNPREVfUFJJTlRGKCJcbiIpOworCVRSQUNFX0FORF9TVEVQKCk7CisJKmRlc3RyZWcgPSAqc3JjcmVnOworICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweGJhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcDJfYnRYX0kodTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IHNyY29mZnNldDsKKyAgICB1OCBzaGlmdDsKKyAgICBpbnQgYml0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIHN3aXRjaCAocmgpIHsKKyAgICBjYXNlIDQ6CisJREVDT0RFX1BSSU5URigiQlRcdCIpOworCWJyZWFrOworICAgIGNhc2UgNToKKwlERUNPREVfUFJJTlRGKCJCVFNcdCIpOworCWJyZWFrOworICAgIGNhc2UgNjoKKwlERUNPREVfUFJJTlRGKCJCVFJcdCIpOworCWJyZWFrOworICAgIGNhc2UgNzoKKwlERUNPREVfUFJJTlRGKCJCVENcdCIpOworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJREVDT0RFX1BSSU5URigiSUxMRUdBTCBFWFRFTkRFRCBYODYgT1BDT0RFXG4iKTsKKwlUUkFDRV9SRUdTKCk7CisJcHJpbnRrKCIlMDR4OiUwNHg6ICUwMlglMDJYIElMTEVHQUwgRVhURU5ERUQgWDg2IE9QQ09ERSBFWFRFTlNJT04hXG4iLAorCQlNLng4Ni5SX0NTLCBNLng4Ni5SX0lQLTMsb3AyLCAobW9kPDw2KXwocmg8PDMpfHJsKTsKKwlIQUxUX1NZUygpOworICAgIH0KKyAgICBpZiAobW9kIDwgMykgeworCisJc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7CisJREVDT0RFX1BSSU5URjIoIiwlZFxuIiwgc2hpZnQpOworCVRSQUNFX0FORF9TVEVQKCk7CisKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyIHNyY3ZhbCwgbWFzazsKKworCSAgICBiaXQgPSBzaGlmdCAmIDB4MUY7CisJICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfbG9uZyhzcmNvZmZzZXQpOworCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOworCSAgICBzd2l0Y2ggKHJoKSB7CisJICAgIGNhc2UgNToKKwkJc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCwgc3JjdmFsIHwgbWFzayk7CisJCWJyZWFrOworCSAgICBjYXNlIDY6CisJCXN0b3JlX2RhdGFfbG9uZyhzcmNvZmZzZXQsIHNyY3ZhbCAmIH5tYXNrKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgNzoKKwkJc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCwgc3JjdmFsIF4gbWFzayk7CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQlicmVhazsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIHUxNiBzcmN2YWwsIG1hc2s7CisKKwkgICAgYml0ID0gc2hpZnQgJiAweEY7CisJICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgJiBtYXNrLEZfQ0YpOworCSAgICBzd2l0Y2ggKHJoKSB7CisJICAgIGNhc2UgNToKKwkJc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCwgc3JjdmFsIHwgbWFzayk7CisJCWJyZWFrOworCSAgICBjYXNlIDY6CisJCXN0b3JlX2RhdGFfd29yZChzcmNvZmZzZXQsIHNyY3ZhbCAmIH5tYXNrKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgNzoKKwkJc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCwgc3JjdmFsIF4gbWFzayk7CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQlicmVhazsKKwkgICAgfQorCX0KKyAgICB9IGVsc2UgewkJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKnNyY3JlZzsKKwkgICAgdTMyIG1hc2s7CisKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIHNoaWZ0KTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgYml0ID0gc2hpZnQgJiAweDFGOworCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnICYgbWFzayxGX0NGKTsKKwkgICAgc3dpdGNoIChyaCkgeworCSAgICBjYXNlIDU6CisJCSpzcmNyZWcgfD0gbWFzazsKKwkJYnJlYWs7CisJICAgIGNhc2UgNjoKKwkJKnNyY3JlZyAmPSB+bWFzazsKKwkJYnJlYWs7CisJICAgIGNhc2UgNzoKKwkJKnNyY3JlZyBePSBtYXNrOworCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJYnJlYWs7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICB1MTYgKnNyY3JlZzsKKwkgICAgdTE2IG1hc2s7CisKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCSAgICBzaGlmdCA9IGZldGNoX2J5dGVfaW1tKCk7CisJICAgIERFQ09ERV9QUklOVEYyKCIsJWRcbiIsIHNoaWZ0KTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgYml0ID0gc2hpZnQgJiAweEY7CisJICAgIG1hc2sgPSAoMHgxIDw8IGJpdCk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKCpzcmNyZWcgJiBtYXNrLEZfQ0YpOworCSAgICBzd2l0Y2ggKHJoKSB7CisJICAgIGNhc2UgNToKKwkJKnNyY3JlZyB8PSBtYXNrOworCQlicmVhazsKKwkgICAgY2FzZSA2OgorCQkqc3JjcmVnICY9IH5tYXNrOworCQlicmVhazsKKwkgICAgY2FzZSA3OgorCQkqc3JjcmVnIF49IG1hc2s7CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQlicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiYgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX2J0Y19SKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBzcmNvZmZzZXQ7CisgICAgaW50IGJpdCxkaXNwOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJCVENcdCIpOworICAgIEZFVENIX0RFQ09ERV9NT0RSTShtb2QsIHJoLCBybCk7CisgICAgaWYgKG1vZCA8IDMpIHsKKwlzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCURFQ09ERV9QUklOVEYoIiwiKTsKKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyIHNyY3ZhbCxtYXNrOworCSAgICB1MzIgKnNoaWZ0cmVnOworCisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweDFGOworCSAgICBkaXNwID0gKHMxNikqc2hpZnRyZWcgPj4gNTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwKTsKKwkgICAgbWFzayA9ICgweDEgPDwgYml0KTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKKwkgICAgc3RvcmVfZGF0YV9sb25nKHNyY29mZnNldCtkaXNwLCBzcmN2YWwgXiBtYXNrKTsKKwl9IGVsc2UgeworCSAgICB1MTYgc3JjdmFsLG1hc2s7CisJICAgIHUxNiAqc2hpZnRyZWc7CisKKwkgICAgc2hpZnRyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIGJpdCA9ICpzaGlmdHJlZyAmIDB4RjsKKwkgICAgZGlzcCA9IChzMTYpKnNoaWZ0cmVnID4+IDQ7CisJICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQrZGlzcCk7CisJICAgIG1hc2sgPSAodTE2KSgweDEgPDwgYml0KTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsICYgbWFzayxGX0NGKTsKKwkgICAgc3RvcmVfZGF0YV93b3JkKHNyY29mZnNldCtkaXNwLCAodTE2KShzcmN2YWwgXiBtYXNrKSk7CisJfQorICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiAqc3JjcmVnLCpzaGlmdHJlZzsKKwkgICAgdTMyIG1hc2s7CisKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweDFGOworCSAgICBtYXNrID0gKDB4MSA8PCBiaXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnICYgbWFzayxGX0NGKTsKKwkgICAgKnNyY3JlZyBePSBtYXNrOworCX0gZWxzZSB7CisJICAgIHUxNiAqc3JjcmVnLCpzaGlmdHJlZzsKKwkgICAgdTE2IG1hc2s7CisKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIHNoaWZ0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBiaXQgPSAqc2hpZnRyZWcgJiAweEY7CisJICAgIG1hc2sgPSAodTE2KSgweDEgPDwgYml0KTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyAmIG1hc2ssRl9DRik7CisJICAgICpzcmNyZWcgXj0gbWFzazsKKwl9CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitIYW5kbGVzIG9wY29kZSAweDBmLDB4YmMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHg4NmVtdU9wMl9ic2YodTggWDg2RU1VX1VOVVNFRChvcDIpKQoreworICAgIGludCBtb2QsIHJsLCByaDsKKyAgICB1aW50IHNyY29mZnNldDsKKworICAgIFNUQVJUX09GX0lOU1RSKCk7CisgICAgREVDT0RFX1BSSU5URigiQlNGXG4iKTsKKyAgICBGRVRDSF9ERUNPREVfTU9EUk0obW9kLCByaCwgcmwpOworICAgIGlmIChtb2QgPCAzKSB7CisJc3Jjb2Zmc2V0ID0gZGVjb2RlX3JtWFhfYWRkcmVzcyhtb2QsIHJsKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIHUzMiBzcmN2YWwsICpkc3RyZWc7CisKKwkgICAgZHN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX2xvbmcoc3Jjb2Zmc2V0KTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsID09IDAsIEZfWkYpOworCSAgICBmb3IoKmRzdHJlZyA9IDA7ICpkc3RyZWcgPCAzMjsgKCpkc3RyZWcpKyspCisJCWlmICgoc3JjdmFsID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7CisJfSBlbHNlIHsKKwkgICAgdTE2IHNyY3ZhbCwgKmRzdHJlZzsKKworCSAgICBkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIHNyY3ZhbCA9IGZldGNoX2RhdGFfd29yZChzcmNvZmZzZXQpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhzcmN2YWwgPT0gMCwgRl9aRik7CisJICAgIGZvcigqZHN0cmVnID0gMDsgKmRzdHJlZyA8IDE2OyAoKmRzdHJlZykrKykKKwkJaWYgKChzcmN2YWwgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKKwl9CisgICAgfSBlbHNlIHsJCSAvKiByZWdpc3RlciB0byByZWdpc3RlciAqLworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKnNyY3JlZywgKmRzdHJlZzsKKworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgZHN0cmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnID09IDAsIEZfWkYpOworCSAgICBmb3IoKmRzdHJlZyA9IDA7ICpkc3RyZWcgPCAzMjsgKCpkc3RyZWcpKyspCisJCWlmICgoKnNyY3JlZyA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOworCX0gZWxzZSB7CisJICAgIHUxNiAqc3JjcmVnLCAqZHN0cmVnOworCisJICAgIHNyY3JlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJsKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBkc3RyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihyaCk7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKCpzcmNyZWcgPT0gMCwgRl9aRik7CisJICAgIGZvcigqZHN0cmVnID0gMDsgKmRzdHJlZyA8IDE2OyAoKmRzdHJlZykrKykKKwkJaWYgKCgqc3JjcmVnID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7CisJfQorICAgIH0KKyAgICBERUNPREVfQ0xFQVJfU0VHT1ZSKCk7CisgICAgRU5EX09GX0lOU1RSKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSGFuZGxlcyBvcGNvZGUgMHgwZiwweGJkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4ODZlbXVPcDJfYnNyKHU4IFg4NkVNVV9VTlVTRUQob3AyKSkKK3sKKyAgICBpbnQgbW9kLCBybCwgcmg7CisgICAgdWludCBzcmNvZmZzZXQ7CisKKyAgICBTVEFSVF9PRl9JTlNUUigpOworICAgIERFQ09ERV9QUklOVEYoIkJTRlxuIik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCXNyY29mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgc3JjdmFsLCAqZHN0cmVnOworCisJICAgIGRzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgc3JjdmFsID0gZmV0Y2hfZGF0YV9sb25nKHNyY29mZnNldCk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHNyY3ZhbCA9PSAwLCBGX1pGKTsKKwkgICAgZm9yKCpkc3RyZWcgPSAzMTsgKmRzdHJlZyA+IDA7ICgqZHN0cmVnKS0tKQorCQlpZiAoKHNyY3ZhbCA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOworCX0gZWxzZSB7CisJICAgIHUxNiBzcmN2YWwsICpkc3RyZWc7CisKKwkgICAgZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBzcmN2YWwgPSBmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoc3JjdmFsID09IDAsIEZfWkYpOworCSAgICBmb3IoKmRzdHJlZyA9IDE1OyAqZHN0cmVnID4gMDsgKCpkc3RyZWcpLS0pCisJCWlmICgoc3JjdmFsID4+ICpkc3RyZWcpICYgMSkgYnJlYWs7CisJfQorICAgIH0gZWxzZSB7CQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyICpzcmNyZWcsICpkc3RyZWc7CisKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX0xPTkdfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCIsIik7CisJICAgIGRzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgVFJBQ0VfQU5EX1NURVAoKTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoKnNyY3JlZyA9PSAwLCBGX1pGKTsKKwkgICAgZm9yKCpkc3RyZWcgPSAzMTsgKmRzdHJlZyA+IDA7ICgqZHN0cmVnKS0tKQorCQlpZiAoKCpzcmNyZWcgPj4gKmRzdHJlZykgJiAxKSBicmVhazsKKwl9IGVsc2UgeworCSAgICB1MTYgKnNyY3JlZywgKmRzdHJlZzsKKworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fV09SRF9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgZHN0cmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmgpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygqc3JjcmVnID09IDAsIEZfWkYpOworCSAgICBmb3IoKmRzdHJlZyA9IDE1OyAqZHN0cmVnID4gMDsgKCpkc3RyZWcpLS0pCisJCWlmICgoKnNyY3JlZyA+PiAqZHN0cmVnKSAmIDEpIGJyZWFrOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX21vdnN4X2J5dGVfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgc3Jjb2Zmc2V0OworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZTWFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCWlmIChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgeworCSAgICB1MzIgKmRlc3RyZWc7CisJICAgIHUzMiBzcmN2YWw7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCSAgICBzcmN2YWwgPSAoczMyKSgoczgpZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCkpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKKwl9IGVsc2UgeworCSAgICB1MTYgKmRlc3RyZWc7CisJICAgIHUxNiBzcmN2YWw7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNvZmZzZXQgPSBkZWNvZGVfcm1YWF9hZGRyZXNzKG1vZCwgcmwpOworCSAgICBzcmN2YWwgPSAoczE2KSgoczgpZmV0Y2hfZGF0YV9ieXRlKHNyY29mZnNldCkpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9IHNyY3ZhbDsKKwl9CisgICAgfSBlbHNlIHsJCQkgLyogcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgKi8KKwlpZiAoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpIHsKKwkgICAgdTMyICpkZXN0cmVnOworCSAgICB1OAkqc3JjcmVnOworCisJICAgIGRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJICAgIERFQ09ERV9QUklOVEYoIiwiKTsKKwkgICAgc3JjcmVnID0gREVDT0RFX1JNX0JZVEVfUkVHSVNURVIocmwpOworCSAgICBERUNPREVfUFJJTlRGKCJcbiIpOworCSAgICBUUkFDRV9BTkRfU1RFUCgpOworCSAgICAqZGVzdHJlZyA9IChzMzIpKChzOCkqc3JjcmVnKTsKKwl9IGVsc2UgeworCSAgICB1MTYgKmRlc3RyZWc7CisJICAgIHU4CSpzcmNyZWc7CisKKwkgICAgZGVzdHJlZyA9IERFQ09ERV9STV9XT1JEX1JFR0lTVEVSKHJoKTsKKwkgICAgREVDT0RFX1BSSU5URigiLCIpOworCSAgICBzcmNyZWcgPSBERUNPREVfUk1fQllURV9SRUdJU1RFUihybCk7CisJICAgIERFQ09ERV9QUklOVEYoIlxuIik7CisJICAgIFRSQUNFX0FORF9TVEVQKCk7CisJICAgICpkZXN0cmVnID0gKHMxNikoKHM4KSpzcmNyZWcpOworCX0KKyAgICB9CisgICAgREVDT0RFX0NMRUFSX1NFR09WUigpOworICAgIEVORF9PRl9JTlNUUigpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0hhbmRsZXMgb3Bjb2RlIDB4MGYsMHhiZgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgeDg2ZW11T3AyX21vdnN4X3dvcmRfUl9STSh1OCBYODZFTVVfVU5VU0VEKG9wMikpCit7CisgICAgaW50IG1vZCwgcmwsIHJoOworICAgIHVpbnQgc3Jjb2Zmc2V0OworICAgIHUzMiAqZGVzdHJlZzsKKyAgICB1MzIgc3JjdmFsOworICAgIHUxNiAqc3JjcmVnOworCisgICAgU1RBUlRfT0ZfSU5TVFIoKTsKKyAgICBERUNPREVfUFJJTlRGKCJNT1ZTWFx0Iik7CisgICAgRkVUQ0hfREVDT0RFX01PRFJNKG1vZCwgcmgsIHJsKTsKKyAgICBpZiAobW9kIDwgMykgeworCWRlc3RyZWcgPSBERUNPREVfUk1fTE9OR19SRUdJU1RFUihyaCk7CisJREVDT0RFX1BSSU5URigiLCIpOworCXNyY29mZnNldCA9IGRlY29kZV9ybVhYX2FkZHJlc3MobW9kLCBybCk7CisJc3JjdmFsID0gKHMzMikoKHMxNilmZXRjaF9kYXRhX3dvcmQoc3Jjb2Zmc2V0KSk7CisJREVDT0RFX1BSSU5URigiXG4iKTsKKwlUUkFDRV9BTkRfU1RFUCgpOworCSpkZXN0cmVnID0gc3JjdmFsOworICAgIH0gZWxzZSB7CQkJIC8qIHJlZ2lzdGVyIHRvIHJlZ2lzdGVyICovCisJZGVzdHJlZyA9IERFQ09ERV9STV9MT05HX1JFR0lTVEVSKHJoKTsKKwlERUNPREVfUFJJTlRGKCIsIik7CisJc3JjcmVnID0gREVDT0RFX1JNX1dPUkRfUkVHSVNURVIocmwpOworCURFQ09ERV9QUklOVEYoIlxuIik7CisJVFJBQ0VfQU5EX1NURVAoKTsKKwkqZGVzdHJlZyA9IChzMzIpKChzMTYpKnNyY3JlZyk7CisgICAgfQorICAgIERFQ09ERV9DTEVBUl9TRUdPVlIoKTsKKyAgICBFTkRfT0ZfSU5TVFIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRG91YmxlIGJ5dGUgb3BlcmF0aW9uIGNvZGUgdGFibGU6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICgqeDg2ZW11X29wdGFiMlsyNTZdKSh1OCkgX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiLmdvdDIiKSkpID0KK3sKKy8qICAweDAwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogR3JvdXAgRiAocmluZyAwIFBNKSAgICAgICovCisvKiAgMHgwMSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIEdyb3VwIEcgKHJpbmcgMCBQTSkgICAgICAqLworLyogIDB4MDIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBsYXIgKHJpbmcgMCBQTSkJICAgICAgICovCisvKiAgMHgwMyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIGxzbCAocmluZyAwIFBNKQkgICAgICAgKi8KKy8qICAweDA0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MDUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBsb2FkYWxsICh1bmRvY3VtZW50ZWQpICAgKi8KKy8qICAweDA2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogY2x0cyAocmluZyAwIFBNKQkgICAgICAgKi8KKy8qICAweDA3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogbG9hZGFsbCAodW5kb2N1bWVudGVkKSAgICovCisvKiAgMHgwOCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIGludmQgKHJpbmcgMCBQTSkJICAgICAgICovCisvKiAgMHgwOSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIHdiaW52ZCAocmluZyAwIFBNKSAgICAgICAqLworLyogIDB4MGEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgwYiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDBjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MGQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgwZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDBmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorCisvKiAgMHgxMCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDExICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MTIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgxMyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDE0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MTUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgxNiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDE3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MTggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgxOSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDFhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MWIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgxYyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDFkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MWUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgxZiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKworLyogIDB4MjAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBtb3YgcmVnMzIsY3JlZyAocmluZyAwIFBNKSAqLworLyogIDB4MjEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBtb3YgcmVnMzIsZHJlZyAocmluZyAwIFBNKSAqLworLyogIDB4MjIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBtb3YgY3JlZyxyZWczMiAocmluZyAwIFBNKSAqLworLyogIDB4MjMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBtb3YgZHJlZyxyZWczMiAocmluZyAwIFBNKSAqLworLyogIDB4MjQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBtb3YgcmVnMzIsdHJlZyAocmluZyAwIFBNKSAqLworLyogIDB4MjUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgyNiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIG1vdiB0cmVnLHJlZzMyIChyaW5nIDAgUE0pICovCisvKiAgMHgyNyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDI4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MjkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgyYSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDJiICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MmMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgyZCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDJlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MmYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisKKy8qICAweDMwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MzEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgzMiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDMzICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MzQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgzNSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDM2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4MzcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgzOCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDM5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4M2EgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgzYiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDNjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4M2QgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHgzZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDNmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorCisvKiAgMHg0MCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDQxICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NDIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg0MyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDQ0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NDUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg0NiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDQ3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NDggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg0OSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDRhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NGIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg0YyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDRkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NGUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg0ZiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKworLyogIDB4NTAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg1MSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDUyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NTMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg1NCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDU1ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NTYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg1NyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDU4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NTkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg1YSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDViICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NWMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg1ZCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDVlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NWYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisKKy8qICAweDYwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NjEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg2MiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDYzICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NjQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg2NSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDY2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NjcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg2OCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDY5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NmEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg2YiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDZjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NmQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg2ZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDZmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorCisvKiAgMHg3MCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDcxICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NzIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg3MyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDc0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NzUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg3NiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDc3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4NzggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg3OSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDdhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4N2IgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg3YyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweDdkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4N2UgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHg3ZiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKworLyogIDB4ODAgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKKy8qICAweDgxICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCisvKiAgMHg4MiAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAorLyogIDB4ODMgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKKy8qICAweDg0ICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCisvKiAgMHg4NSAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAorLyogIDB4ODYgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKKy8qICAweDg3ICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCisvKiAgMHg4OCAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAorLyogIDB4ODkgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKKy8qICAweDhhICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCisvKiAgMHg4YiAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAorLyogIDB4OGMgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKKy8qICAweDhkICovIHg4NmVtdU9wMl9sb25nX2p1bXAsCisvKiAgMHg4ZSAqLyB4ODZlbXVPcDJfbG9uZ19qdW1wLAorLyogIDB4OGYgKi8geDg2ZW11T3AyX2xvbmdfanVtcCwKKworLyogIDB4OTAgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OTEgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OTIgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OTMgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OTQgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OTUgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OTYgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OTcgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OTggKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OTkgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OWEgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OWIgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OWMgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OWQgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OWUgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorLyogIDB4OWYgKi8geDg2ZW11T3AyX3NldF9ieXRlLAorCisvKiAgMHhhMCAqLyB4ODZlbXVPcDJfcHVzaF9GUywKKy8qICAweGExICovIHg4NmVtdU9wMl9wb3BfRlMsCisvKiAgMHhhMiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGEzICovIHg4NmVtdU9wMl9idF9SLAorLyogIDB4YTQgKi8geDg2ZW11T3AyX3NobGRfSU1NLAorLyogIDB4YTUgKi8geDg2ZW11T3AyX3NobGRfQ0wsCisvKiAgMHhhNiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGE3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4YTggKi8geDg2ZW11T3AyX3B1c2hfR1MsCisvKiAgMHhhOSAqLyB4ODZlbXVPcDJfcG9wX0dTLAorLyogIDB4YWEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhhYiAqLyB4ODZlbXVPcDJfYnRfUiwKKy8qICAweGFjICovIHg4NmVtdU9wMl9zaHJkX0lNTSwKKy8qICAweGFkICovIHg4NmVtdU9wMl9zaHJkX0NMLAorLyogIDB4YWUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhhZiAqLyB4ODZlbXVPcDJfaW11bF9SX1JNLAorCisvKiAgMHhiMCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIFRPRE86IGNtcHhjaGcgKi8KKy8qICAweGIxICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogY21weGNoZyAqLworLyogIDB4YjIgKi8geDg2ZW11T3AyX2xzc19SX0lNTSwKKy8qICAweGIzICovIHg4NmVtdU9wMl9idHJfUiwKKy8qICAweGI0ICovIHg4NmVtdU9wMl9sZnNfUl9JTU0sCisvKiAgMHhiNSAqLyB4ODZlbXVPcDJfbGdzX1JfSU1NLAorLyogIDB4YjYgKi8geDg2ZW11T3AyX21vdnp4X2J5dGVfUl9STSwKKy8qICAweGI3ICovIHg4NmVtdU9wMl9tb3Z6eF93b3JkX1JfUk0sCisvKiAgMHhiOCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGI5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4YmEgKi8geDg2ZW11T3AyX2J0WF9JLAorLyogIDB4YmIgKi8geDg2ZW11T3AyX2J0Y19SLAorLyogIDB4YmMgKi8geDg2ZW11T3AyX2JzZiwKKy8qICAweGJkICovIHg4NmVtdU9wMl9ic3IsCisvKiAgMHhiZSAqLyB4ODZlbXVPcDJfbW92c3hfYnl0ZV9SX1JNLAorLyogIDB4YmYgKi8geDg2ZW11T3AyX21vdnN4X3dvcmRfUl9STSwKKworLyogIDB4YzAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsICAvKiBUT0RPOiB4YWRkICovCisvKiAgMHhjMSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwgIC8qIFRPRE86IHhhZGQgKi8KKy8qICAweGMyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4YzMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhjNCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGM1ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4YzYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhjNyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGM4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogYnN3YXAgKi8KKy8qICAweGM5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogYnN3YXAgKi8KKy8qICAweGNhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogYnN3YXAgKi8KKy8qICAweGNiICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogYnN3YXAgKi8KKy8qICAweGNjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogYnN3YXAgKi8KKy8qICAweGNkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogYnN3YXAgKi8KKy8qICAweGNlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogYnN3YXAgKi8KKy8qICAweGNmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLCAgLyogVE9ETzogYnN3YXAgKi8KKworLyogIDB4ZDAgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhkMSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGQyICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZDMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhkNCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGQ1ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZDYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhkNyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGQ4ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZDkgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhkYSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGRiICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZGMgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhkZCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGRlICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZGYgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisKKy8qICAweGUwICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZTEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhlMiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGUzICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZTQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhlNSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGU2ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZTcgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhlOCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGU5ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZWEgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhlYiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGVjICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZWQgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhlZSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGVmICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorCisvKiAgMHhmMCAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGYxICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZjIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhmMyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGY0ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZjUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhmNiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGY3ICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZjggKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhmOSAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGZhICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZmIgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhmYyAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKKy8qICAweGZkICovIHg4NmVtdU9wMl9pbGxlZ2FsX29wLAorLyogIDB4ZmUgKi8geDg2ZW11T3AyX2lsbGVnYWxfb3AsCisvKiAgMHhmZiAqLyB4ODZlbXVPcDJfaWxsZWdhbF9vcCwKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iaW9zX2VtdWxhdG9yL3g4NmVtdS9wcmltX29wcy5jIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL3g4NmVtdS9wcmltX29wcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMTUyZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jpb3NfZW11bGF0b3IveDg2ZW11L3ByaW1fb3BzLmMKQEAgLTAsMCArMSwyNDQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgkJCVJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqCQlDb3B5cmlnaHQgKEMpIDE5OTEtMjAwNCBTY2lUZWNoIFNvZnR3YXJlLCBJbmMuCisqCQkgICAgIENvcHlyaWdodCAoQykgRGF2aWQgTW9zYmVyZ2VyLVRhbmcKKyoJCSAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLglUaGUgYXV0aG9ycyBtYWtlcyBubworKiAgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4KKyogIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisqCisqICBUSEUgQVVUSE9SUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyogIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyogIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisqICBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GCisqICBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKKyogIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyogIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisqCisqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyoKKyogTGFuZ3VhZ2U6CUFOU0kgQworKiBFbnZpcm9ubWVudDoJQW55CisqIERldmVsb3BlcjoJS2VuZGFsbCBCZW5uZXR0CisqCisqIERlc2NyaXB0aW9uOglUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvZGUgdG8gaW1wbGVtZW50IHRoZSBwcmltaXRpdmUKKyoJCW1hY2hpbmUgb3BlcmF0aW9ucyB1c2VkIGJ5IHRoZSBlbXVsYXRpb24gY29kZSBpbiBvcHMuYworKgorKiBDYXJyeSBDaGFpbiBDYWxjdWxhdGlvbgorKgorKiBUaGlzIHJlcHJlc2VudHMgYSBzb21ld2hhdCBleHBlbnNpdmUgY2FsY3VsYXRpb24gd2hpY2ggaXMKKyogYXBwYXJlbnRseSByZXF1aXJlZCB0byBlbXVsYXRlIHRoZSBzZXR0aW5nIG9mIHRoZSBPRjM0MzM2NCBhbmQgQUYgZmxhZy4KKyogVGhlIGxhdHRlciBpcyBub3Qgc28gaW1wb3J0YW50LCBidXQgdGhlIGZvcm1lciBpcy4gIFRoZSBvdmVyZmxvdworKiBmbGFnIGlzIHRoZSBYT1Igb2YgdGhlIHRvcCB0d28gYml0cyBvZiB0aGUgY2FycnkgY2hhaW4gZm9yIGFuCisqIGFkZGl0aW9uIChzaW1pbGFyIGZvciBzdWJ0cmFjdGlvbikuICBTaW5jZSB3ZSBkbyBub3Qgd2FudCB0bworKiBzaW11bGF0ZSB0aGUgYWRkaXRpb24gaW4gYSBiaXR3aXNlIG1hbm5lciwgd2UgdHJ5IHRvIGNhbGN1bGF0ZSB0aGUKKyogY2FycnkgY2hhaW4gZ2l2ZW4gdGhlIHR3byBvcGVyYW5kcyBhbmQgdGhlIHJlc3VsdC4KKyoKKyogU28sIGdpdmVuIHRoZSBmb2xsb3dpbmcgdGFibGUsIHdoaWNoIHJlcHJlc2VudHMgdGhlIGFkZGl0aW9uIG9mIHR3bworKiBiaXRzLCB3ZSBjYW4gZGVyaXZlIGEgZm9ybXVsYSBmb3IgdGhlIGNhcnJ5IGNoYWluLgorKgorKiBhICAgYgkgIGNpbglyICAgICBjb3V0CisqIDAgICAwCSAgMAkwICAgICAwCisqIDAgICAwCSAgMQkxICAgICAwCisqIDAgICAxCSAgMAkxICAgICAwCisqIDAgICAxCSAgMQkwICAgICAxCisqIDEgICAwCSAgMAkxICAgICAwCisqIDEgICAwCSAgMQkwICAgICAxCisqIDEgICAxCSAgMAkwICAgICAxCisqIDEgICAxCSAgMQkxICAgICAxCisqCisqIENvbnN0cnVjdGlvbiBvZiB0YWJsZSBmb3IgY291dDoKKyoKKyogYWIKKyogciAgXAkwMCAgIDAxCSAgMTEgIDEwCisqIHwtLS0tLS0tLS0tLS0tLS0tLS0KKyogMCAgfAkgMCAgICAxCSAgIDEgICAxCisqIDEgIHwJIDAgICAgMAkgICAxICAgMAorKgorKiBCeSBpbnNwZWN0aW9uLCBvbmUgZ2V0czogIGNjID0gYWIgKyAgcicoYSArIGIpCisqCisqIFRoYXQgcmVwcmVzZW50cyBhbG90IG9mIG9wZXJhdGlvbnMsIGJ1dCBOTyBDSE9JQ0UuLi4uCisqCisqIEJvcnJvdyBDaGFpbiBDYWxjdWxhdGlvbi4KKyoKKyogVGhlIGZvbGxvd2luZyB0YWJsZSByZXByZXNlbnRzIHRoZSBzdWJ0cmFjdGlvbiBvZiB0d28gYml0cywgZnJvbQorKiB3aGljaCB3ZSBjYW4gZGVyaXZlIGEgZm9ybXVsYSBmb3IgdGhlIGJvcnJvdyBjaGFpbi4KKyoKKyogYSAgIGIJICBiaW4JciAgICAgYm91dAorKiAwICAgMAkgIDAJMCAgICAgMAorKiAwICAgMAkgIDEJMSAgICAgMQorKiAwICAgMQkgIDAJMSAgICAgMQorKiAwICAgMQkgIDEJMCAgICAgMQorKiAxICAgMAkgIDAJMSAgICAgMAorKiAxICAgMAkgIDEJMCAgICAgMAorKiAxICAgMQkgIDAJMCAgICAgMAorKiAxICAgMQkgIDEJMSAgICAgMQorKgorKiBDb25zdHJ1Y3Rpb24gb2YgdGFibGUgZm9yIGNvdXQ6CisqCisqIGFiCisqIHIgIFwJMDAgICAwMQkgIDExICAxMAorKiB8LS0tLS0tLS0tLS0tLS0tLS0tCisqIDAgIHwJIDAgICAgMQkgICAwICAgMAorKiAxICB8CSAxICAgIDEJICAgMSAgIDAKKyoKKyogQnkgaW5zcGVjdGlvbiwgb25lIGdldHM6ICBiYyA9IGEnYiArCXIoYScgKyBiKQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBQUklNX09QU19OT19SRURFRklORV9BU00KKyNpbmNsdWRlICJ4ODZlbXUveDg2ZW11aS5oIgorCisjaWYgZGVmaW5lZChDT05GSUdfQklPU0VNVSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiB4ODZlbXVfcGFyaXR5X3RhYls4XSA9Cit7CisgICAgMHg5NjY5Njk5NiwKKyAgICAweDY5OTY5NjY5LAorICAgIDB4Njk5Njk2NjksCisgICAgMHg5NjY5Njk5NiwKKyAgICAweDY5OTY5NjY5LAorICAgIDB4OTY2OTY5OTYsCisgICAgMHg5NjY5Njk5NiwKKyAgICAweDY5OTY5NjY5LAorfTsKKworI2RlZmluZSBQQVJJVFkoeCkgICAoKCh4ODZlbXVfcGFyaXR5X3RhYlsoeCkgLyAzMl0gPj4gKCh4KSAlIDMyKSkgJiAxKSA9PSAwKQorI2RlZmluZSBYT1IyKHgpCSAgICAoKCh4KSBeICgoeCk+PjEpKSAmIDB4MSkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgYWJzKGludCB2KQoreworCXJldHVybiAodj4wKT92Oi12OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tIFNpZGUgZWZmZWN0cyBoZWxwZXIgZnVuY3Rpb25zIC0tLS0tLS0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK2ltcGxlbWVudHMgc2lkZSBlZmVjdHMgZm9yIGJ5dGUgb3BlcmF0aW9ucyB0aGF0IGRvbid0IG92ZXJmbG93CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBzZXRfcGFyaXR5X2ZsYWcodTMyIHJlcykKK3sKKyAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhQQVJJVFkocmVzICYgMHhGRiksIEZfUEYpOworfQorCitzdGF0aWMgdm9pZCBzZXRfc3pwX2ZsYWdzXzgodTggcmVzKQoreworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAsIEZfU0YpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyA9PSAwLCBGX1pGKTsKKyAgICBzZXRfcGFyaXR5X2ZsYWcocmVzKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3N6cF9mbGFnc18xNih1MTYgcmVzKQoreworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMCwgRl9TRik7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzID09IDAsIEZfWkYpOworICAgIHNldF9wYXJpdHlfZmxhZyhyZXMpOworfQorCitzdGF0aWMgdm9pZCBzZXRfc3pwX2ZsYWdzXzMyKHUzMiByZXMpCit7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwMDAwMCwgRl9TRik7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzID09IDAsIEZfWkYpOworICAgIHNldF9wYXJpdHlfZmxhZyhyZXMpOworfQorCitzdGF0aWMgdm9pZCBub19jYXJyeV9ieXRlX3NpZGVfZWZmKHU4IHJlcykKK3sKKyAgICBDTEVBUl9GTEFHKEZfT0YpOworICAgIENMRUFSX0ZMQUcoRl9DRik7CisgICAgQ0xFQVJfRkxBRyhGX0FGKTsKKyAgICBzZXRfc3pwX2ZsYWdzXzgocmVzKTsKK30KKworc3RhdGljIHZvaWQgbm9fY2Fycnlfd29yZF9zaWRlX2VmZih1MTYgcmVzKQoreworICAgIENMRUFSX0ZMQUcoRl9PRik7CisgICAgQ0xFQVJfRkxBRyhGX0NGKTsKKyAgICBDTEVBUl9GTEFHKEZfQUYpOworICAgIHNldF9zenBfZmxhZ3NfMTYocmVzKTsKK30KKworc3RhdGljIHZvaWQgbm9fY2FycnlfbG9uZ19zaWRlX2VmZih1MzIgcmVzKQoreworICAgIENMRUFSX0ZMQUcoRl9PRik7CisgICAgQ0xFQVJfRkxBRyhGX0NGKTsKKyAgICBDTEVBUl9GTEFHKEZfQUYpOworICAgIHNldF9zenBfZmxhZ3NfMzIocmVzKTsKK30KKworc3RhdGljIHZvaWQgY2FsY19jYXJyeV9jaGFpbihpbnQgYml0cywgdTMyIGQsIHUzMiBzLCB1MzIgcmVzLCBpbnQgc2V0X2NhcnJ5KQoreworICAgIHUzMiBjYzsKKworICAgIGNjID0gKHMgJiBkKSB8ICgofnJlcykgJiAocyB8IGQpKTsKKyAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGNjID4+IChiaXRzIC0gMikpLCBGX09GKTsKKyAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhjYyAmIDB4OCwgRl9BRik7CisgICAgaWYgKHNldF9jYXJyeSkgeworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmICgxIDw8IGJpdHMpLCBGX0NGKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNhbGNfYm9ycm93X2NoYWluKGludCBiaXRzLCB1MzIgZCwgdTMyIHMsIHUzMiByZXMsIGludCBzZXRfY2FycnkpCit7CisgICAgdTMyIGJjOworCisgICAgYmMgPSAocmVzICYgKH5kIHwgcykpIHwgKH5kICYgcyk7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiAoYml0cyAtIDIpKSwgRl9PRik7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOworICAgIGlmIChzZXRfY2FycnkpIHsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmICgxIDw8IChiaXRzIC0gMSkpLCBGX0NGKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgQUFBIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IGFhYV93b3JkKHUxNiBkKQoreworICAgIHUxNiByZXM7CisgICAgaWYgKChkICYgMHhmKSA+IDB4OSB8fCBBQ0NFU1NfRkxBRyhGX0FGKSkgeworCWQgKz0gMHg2OworCWQgKz0gMHgxMDA7CisJU0VUX0ZMQUcoRl9BRik7CisJU0VUX0ZMQUcoRl9DRik7CisgICAgfSBlbHNlIHsKKwlDTEVBUl9GTEFHKEZfQ0YpOworCUNMRUFSX0ZMQUcoRl9BRik7CisgICAgfQorICAgIHJlcyA9ICh1MTYpKGQgJiAweEZGMEYpOworICAgIHNldF9zenBfZmxhZ3NfMTYocmVzKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIEFBQSBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBhYXNfd29yZCh1MTYgZCkKK3sKKyAgICB1MTYgcmVzOworICAgIGlmICgoZCAmIDB4ZikgPiAweDkgfHwgQUNDRVNTX0ZMQUcoRl9BRikpIHsKKwlkIC09IDB4NjsKKwlkIC09IDB4MTAwOworCVNFVF9GTEFHKEZfQUYpOworCVNFVF9GTEFHKEZfQ0YpOworICAgIH0gZWxzZSB7CisJQ0xFQVJfRkxBRyhGX0NGKTsKKwlDTEVBUl9GTEFHKEZfQUYpOworICAgIH0KKyAgICByZXMgPSAodTE2KShkICYgMHhGRjBGKTsKKyAgICBzZXRfc3pwX2ZsYWdzXzE2KHJlcyk7CisgICAgcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBBQUQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgYWFkX3dvcmQodTE2IGQpCit7CisgICAgdTE2IGw7CisgICAgdTggaGIsIGxiOworCisgICAgaGIgPSAodTgpKChkID4+IDgpICYgMHhmZik7CisgICAgbGIgPSAodTgpKChkICYgMHhmZikpOworICAgIGwgPSAodTE2KSgobGIgKyAxMCAqIGhiKSAmIDB4RkYpOworCisgICAgbm9fY2FycnlfYnl0ZV9zaWRlX2VmZihsICYgMHhGRik7CisgICAgcmV0dXJuIGw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgQUFNIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IGFhbV93b3JkKHU4IGQpCit7CisgICAgdTE2IGgsIGw7CisKKyAgICBoID0gKHUxNikoZCAvIDEwKTsKKyAgICBsID0gKHUxNikoZCAlIDEwKTsKKyAgICBsIHw9ICh1MTYpKGggPDwgOCk7CisKKyAgICBub19jYXJyeV9ieXRlX3NpZGVfZWZmKGwgJiAweEZGKTsKKyAgICByZXR1cm4gbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBBREMgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBhZGNfYnl0ZSh1OCBkLCB1OCBzKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisKKyAgICByZXMgPSBkICsgczsKKyAgICBpZiAoQUNDRVNTX0ZMQUcoRl9DRikpIHJlcysrOworCisgICAgc2V0X3N6cF9mbGFnc184KHJlcyk7CisgICAgY2FsY19jYXJyeV9jaGFpbig4LHMsZCxyZXMsMSk7CisKKyAgICByZXR1cm4gKHU4KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBBREMgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgYWRjX3dvcmQodTE2IGQsIHUxNiBzKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisKKyAgICByZXMgPSBkICsgczsKKyAgICBpZiAoQUNDRVNTX0ZMQUcoRl9DRikpCisJcmVzKys7CisKKyAgICBzZXRfc3pwX2ZsYWdzXzE2KCh1MTYpcmVzKTsKKyAgICBjYWxjX2NhcnJ5X2NoYWluKDE2LHMsZCxyZXMsMSk7CisKKyAgICByZXR1cm4gKHUxNilyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgQURDIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGFkY19sb25nKHUzMiBkLCB1MzIgcykKK3sKKyAgICB1MzIgbG87ICAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworICAgIHUzMiBoaTsKKyAgICB1MzIgcmVzOworCisgICAgbG8gPSAoZCAmIDB4RkZGRikgKyAocyAmIDB4RkZGRik7CisgICAgcmVzID0gZCArIHM7CisKKyAgICBpZiAoQUNDRVNTX0ZMQUcoRl9DRikpIHsKKwlsbysrOworCXJlcysrOworICAgIH0KKworICAgIGhpID0gKGxvID4+IDE2KSArIChkID4+IDE2KSArIChzID4+IDE2KTsKKworICAgIHNldF9zenBfZmxhZ3NfMzIocmVzKTsKKyAgICBjYWxjX2NhcnJ5X2NoYWluKDMyLHMsZCxyZXMsMCk7CisKKyAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhoaSAmIDB4MTAwMDAsIEZfQ0YpOworCisgICAgcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBBREQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBhZGRfYnl0ZSh1OCBkLCB1OCBzKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisKKyAgICByZXMgPSBkICsgczsKKyAgICBzZXRfc3pwX2ZsYWdzXzgoKHU4KXJlcyk7CisgICAgY2FsY19jYXJyeV9jaGFpbig4LHMsZCxyZXMsMSk7CisKKyAgICByZXR1cm4gKHU4KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBBREQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgYWRkX3dvcmQodTE2IGQsIHUxNiBzKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisKKyAgICByZXMgPSBkICsgczsKKyAgICBzZXRfc3pwX2ZsYWdzXzE2KCh1MTYpcmVzKTsKKyAgICBjYWxjX2NhcnJ5X2NoYWluKDE2LHMsZCxyZXMsMSk7CisKKyAgICByZXR1cm4gKHUxNilyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgQUREIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGFkZF9sb25nKHUzMiBkLCB1MzIgcykKK3sKKyAgICB1MzIgcmVzOworCisgICAgcmVzID0gZCArIHM7CisgICAgc2V0X3N6cF9mbGFnc18zMihyZXMpOworICAgIGNhbGNfY2FycnlfY2hhaW4oMzIscyxkLHJlcywwKTsKKworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyA8IGQgfHwgcmVzIDwgcywgRl9DRik7CisKKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIEFORCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IGFuZF9ieXRlKHU4IGQsIHU4IHMpCit7CisgICAgdTggcmVzOyAgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgJiBzOworCisgICAgbm9fY2FycnlfYnl0ZV9zaWRlX2VmZihyZXMpOworICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgQU5EIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IGFuZF93b3JkKHUxNiBkLCB1MTYgcykKK3sKKyAgICB1MTYgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCisgICAgcmVzID0gZCAmIHM7CisKKyAgICBub19jYXJyeV93b3JkX3NpZGVfZWZmKHJlcyk7CisgICAgcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBBTkQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgYW5kX2xvbmcodTMyIGQsIHUzMiBzKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisKKyAgICByZXMgPSBkICYgczsKKyAgICBub19jYXJyeV9sb25nX3NpZGVfZWZmKHJlcyk7CisgICAgcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBDTVAgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBjbXBfYnl0ZSh1OCBkLCB1OCBzKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisKKyAgICByZXMgPSBkIC0gczsKKyAgICBzZXRfc3pwX2ZsYWdzXzgoKHU4KXJlcyk7CisgICAgY2FsY19ib3Jyb3dfY2hhaW4oOCwgZCwgcywgcmVzLCAxKTsKKworICAgIHJldHVybiBkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIENNUCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBjbXBfd29yZCh1MTYgZCwgdTE2IHMpCit7CisgICAgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgLSBzOworICAgIHNldF9zenBfZmxhZ3NfMTYoKHUxNilyZXMpOworICAgIGNhbGNfYm9ycm93X2NoYWluKDE2LCBkLCBzLCByZXMsIDEpOworCisgICAgcmV0dXJuIGQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgQ01QIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGNtcF9sb25nKHUzMiBkLCB1MzIgcykKK3sKKyAgICB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCisgICAgcmVzID0gZCAtIHM7CisgICAgc2V0X3N6cF9mbGFnc18zMihyZXMpOworICAgIGNhbGNfYm9ycm93X2NoYWluKDMyLCBkLCBzLCByZXMsIDEpOworCisgICAgcmV0dXJuIGQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgREFBIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggZGFhX2J5dGUodTggZCkKK3sKKyAgICB1MzIgcmVzID0gZDsKKyAgICBpZiAoKGQgJiAweGYpID4gOSB8fCBBQ0NFU1NfRkxBRyhGX0FGKSkgeworCXJlcyArPSA2OworCVNFVF9GTEFHKEZfQUYpOworICAgIH0KKyAgICBpZiAocmVzID4gMHg5RiB8fCBBQ0NFU1NfRkxBRyhGX0NGKSkgeworCXJlcyArPSAweDYwOworCVNFVF9GTEFHKEZfQ0YpOworICAgIH0KKyAgICBzZXRfc3pwX2ZsYWdzXzgoKHU4KXJlcyk7CisgICAgcmV0dXJuICh1OClyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgREFTIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggZGFzX2J5dGUodTggZCkKK3sKKyAgICBpZiAoKGQgJiAweGYpID4gOSB8fCBBQ0NFU1NfRkxBRyhGX0FGKSkgeworCWQgLT0gNjsKKwlTRVRfRkxBRyhGX0FGKTsKKyAgICB9CisgICAgaWYgKGQgPiAweDlGIHx8IEFDQ0VTU19GTEFHKEZfQ0YpKSB7CisJZCAtPSAweDYwOworCVNFVF9GTEFHKEZfQ0YpOworICAgIH0KKyAgICBzZXRfc3pwX2ZsYWdzXzgoZCk7CisgICAgcmV0dXJuIGQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgREVDIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggZGVjX2J5dGUodTggZCkKK3sKKyAgICB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCisgICAgcmVzID0gZCAtIDE7CisgICAgc2V0X3N6cF9mbGFnc184KCh1OClyZXMpOworICAgIGNhbGNfYm9ycm93X2NoYWluKDgsIGQsIDEsIHJlcywgMCk7CisKKyAgICByZXR1cm4gKHU4KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBERUMgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgZGVjX3dvcmQodTE2IGQpCit7CisgICAgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgLSAxOworICAgIHNldF9zenBfZmxhZ3NfMTYoKHUxNilyZXMpOworICAgIGNhbGNfYm9ycm93X2NoYWluKDE2LCBkLCAxLCByZXMsIDApOworCisgICAgcmV0dXJuICh1MTYpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIERFQyBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBkZWNfbG9uZyh1MzIgZCkKK3sKKyAgICB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCisgICAgcmVzID0gZCAtIDE7CisKKyAgICBzZXRfc3pwX2ZsYWdzXzMyKHJlcyk7CisgICAgY2FsY19ib3Jyb3dfY2hhaW4oMzIsIGQsIDEsIHJlcywgMCk7CisKKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIElOQyBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IGluY19ieXRlKHU4IGQpCit7CisgICAgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgKyAxOworICAgIHNldF9zenBfZmxhZ3NfOCgodTgpcmVzKTsKKyAgICBjYWxjX2NhcnJ5X2NoYWluKDgsIGQsIDEsIHJlcywgMCk7CisKKyAgICByZXR1cm4gKHU4KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBJTkMgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgaW5jX3dvcmQodTE2IGQpCit7CisgICAgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgKyAxOworICAgIHNldF9zenBfZmxhZ3NfMTYoKHUxNilyZXMpOworICAgIGNhbGNfY2FycnlfY2hhaW4oMTYsIGQsIDEsIHJlcywgMCk7CisKKyAgICByZXR1cm4gKHUxNilyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgSU5DIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGluY19sb25nKHUzMiBkKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisKKyAgICByZXMgPSBkICsgMTsKKyAgICBzZXRfc3pwX2ZsYWdzXzMyKHJlcyk7CisgICAgY2FsY19jYXJyeV9jaGFpbigzMiwgZCwgMSwgcmVzLCAwKTsKKworICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgT1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBvcl9ieXRlKHU4IGQsIHU4IHMpCit7CisgICAgdTggcmVzOyAgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgfCBzOworICAgIG5vX2NhcnJ5X2J5dGVfc2lkZV9lZmYocmVzKTsKKworICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgT1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgb3Jfd29yZCh1MTYgZCwgdTE2IHMpCit7CisgICAgdTE2IHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgfCBzOworICAgIG5vX2NhcnJ5X3dvcmRfc2lkZV9lZmYocmVzKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIE9SIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIG9yX2xvbmcodTMyIGQsIHUzMiBzKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisKKyAgICByZXMgPSBkIHwgczsKKyAgICBub19jYXJyeV9sb25nX3NpZGVfZWZmKHJlcyk7CisgICAgcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IG5lZ19ieXRlKHU4IHMpCit7CisgICAgdTggcmVzOworCisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcocyAhPSAwLCBGX0NGKTsKKyAgICByZXMgPSAodTgpLXM7CisgICAgc2V0X3N6cF9mbGFnc184KHJlcyk7CisgICAgY2FsY19ib3Jyb3dfY2hhaW4oOCwgMCwgcywgcmVzLCAwKTsKKworICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgT1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgbmVnX3dvcmQodTE2IHMpCit7CisgICAgdTE2IHJlczsKKworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHMgIT0gMCwgRl9DRik7CisgICAgcmVzID0gKHUxNiktczsKKyAgICBzZXRfc3pwX2ZsYWdzXzE2KCh1MTYpcmVzKTsKKyAgICBjYWxjX2JvcnJvd19jaGFpbigxNiwgMCwgcywgcmVzLCAwKTsKKworICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgT1IgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgbmVnX2xvbmcodTMyIHMpCit7CisgICAgdTMyIHJlczsKKworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKHMgIT0gMCwgRl9DRik7CisgICAgcmVzID0gKHUzMiktczsKKyAgICBzZXRfc3pwX2ZsYWdzXzMyKHJlcyk7CisgICAgY2FsY19ib3Jyb3dfY2hhaW4oMzIsIDAsIHMsIHJlcywgMCk7CisKKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIE5PVCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IG5vdF9ieXRlKHU4IHMpCit7CisgICAgcmV0dXJuIH5zOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIE5PVCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBub3Rfd29yZCh1MTYgcykKK3sKKyAgICByZXR1cm4gfnM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgTk9UIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIG5vdF9sb25nKHUzMiBzKQoreworICAgIHJldHVybiB+czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBSQ0wgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCByY2xfYnl0ZSh1OCBkLCB1OCBzKQoreworICAgIHVuc2lnbmVkIGludCByZXMsIGNudCwgbWFzaywgY2Y7CisKKyAgICAvKiBzIGlzIHRoZSByb3RhdGUgZGlzdGFuY2UuICBJdCB2YXJpZXMgZnJvbSAwIC0gOC4gKi8KKyAgICAvKiBoYXZlCisKKyAgICAgICBDRiAgQl83IEJfNiBCXzUgQl80IEJfMyBCXzIgQl8xIEJfMAorCisgICAgICAgd2FudCB0byByb3RhdGUgdGhyb3VnaCB0aGUgY2FycnkgYnkgInMiIGJpdHMuICBXZSBjb3VsZAorICAgICAgIGxvb3AsIGJ1dCB0aGF0J3MgaW5lZmZpY2llbnQuICBTbyB0aGUgd2lkdGggaXMgOSwKKyAgICAgICBhbmQgd2Ugc3BsaXQgaW50byB0aHJlZSBwYXJ0czoKKworICAgICAgIFRoZSBuZXcgY2FycnkgZmxhZyAgICh3YXMgQl9uKQorICAgICAgIHRoZSBzdHVmZiBpbiBCX24tMSAuLiBCXzAKKyAgICAgICB0aGUgc3R1ZmYgaW4gQl83IC4uIEJfbisxCisKKyAgICAgICBUaGUgbmV3IHJvdGF0ZSBpcyBkb25lIG1vZCA5LCBhbmQgZ2l2ZW4gdGhpcywKKyAgICAgICBmb3IgYSByb3RhdGlvbiBvZiBuIGJpdHMgKG1vZCA5KSB0aGUgbmV3IGNhcnJ5IGZsYWcgaXMKKyAgICAgICB0aGVuIGxvY2F0ZWQgbiBiaXRzIGZyb20gdGhlIE1TQi4gIFRoZSBsb3cgcGFydCBpcworICAgICAgIHRoZW4gc2hpZnRlZCB1cCBjbnQgYml0cywgYW5kIHRoZSBoaWdoIHBhcnQgaXMgb3InZAorICAgICAgIGluLiAgVXNpbmcgQ0FQUyBmb3IgbmV3IHZhbHVlcywgYW5kIGxvd2VyY2FzZSBmb3IgdGhlCisgICAgICAgb3JpZ2luYWwgdmFsdWVzLCB0aGlzIGNhbiBiZSBleHByZXNzZWQgYXM6CisKKyAgICAgICBJRiBuID4gMAorICAgICAgIDEpIENGIDwtCSBiXyg4LW4pCisgICAgICAgMikgQl8oNykgLi4gQl8obikgIDwtICBiXyg4LShuKzEpKSAuLiBiXzAKKyAgICAgICAzKSBCXyhuLTEpIDwtIGNmCisgICAgICAgNCkgQl8obi0yKSAuLiBCXzAgPC0gIGJfNyAuLiBiXyg4LShuLTEpKQorICAgICAqLworICAgIHJlcyA9IGQ7CisgICAgaWYgKChjbnQgPSBzICUgOSkgIT0gMCkgeworCS8qIGV4dHJhY3QgdGhlIG5ldyBDQVJSWSBGTEFHLiAqLworCS8qIENGIDwtICBiXyg4LW4pCSAgICAgICovCisJY2YgPSAoZCA+PiAoOCAtIGNudCkpICYgMHgxOworCisJLyogZ2V0IHRoZSBsb3cgc3R1ZmYgd2hpY2ggcm90YXRlZAorCSAgIGludG8gdGhlIHJhbmdlIEJfNyAuLiBCX2NudCAqLworCS8qIEJfKDcpIC4uIEJfKG4pICA8LSAgYl8oOC0obisxKSkgLi4gYl8wICAqLworCS8qIG5vdGUgdGhhdCB0aGUgcmlnaHQgaGFuZCBzaWRlIGRvbmUgYnkgdGhlIG1hc2sgKi8KKwlyZXMgPSAoZCA8PCBjbnQpICYgMHhmZjsKKworCS8qIG5vdyB0aGUgaGlnaCBzdHVmZiB3aGljaCByb3RhdGVkIGFyb3VuZAorCSAgIGludG8gdGhlIHBvc2l0aW9ucyBCX2NudC0yIC4uIEJfMCAqLworCS8qIEJfKG4tMikgLi4gQl8wIDwtICBiXzcgLi4gYl8oOC0obi0xKSkgKi8KKwkvKiBzaGlmdCBpdCBkb3dud2FyZCwgNy0obi0yKSA9IDktbiBwb3NpdGlvbnMuCisJICAgYW5kIG1hc2sgb2ZmIHRoZSByZXN1bHQgYmVmb3JlIG9yJ2luZyBpbi4KKwkgKi8KKwltYXNrID0gKDEgPDwgKGNudCAtIDEpKSAtIDE7CisJcmVzIHw9IChkID4+ICg5IC0gY250KSkgJiBtYXNrOworCisJLyogaWYgdGhlIGNhcnJ5IGZsYWcgd2FzIHNldCwgb3IgaXQgaW4uCSAqLworCWlmIChBQ0NFU1NfRkxBRyhGX0NGKSkgeyAgICAgLyogY2FycnkgZmxhZyBpcyBzZXQgKi8KKwkgICAgLyoJQl8obi0xKSA8LSBjZiAqLworCSAgICByZXMgfD0gMSA8PCAoY250IC0gMSk7CisJfQorCS8qIHNldCB0aGUgbmV3IGNhcnJ5IGZsYWcsIGJhc2VkIG9uIHRoZSB2YXJpYWJsZSAiY2YiICovCisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOworCS8qIE9WRVJGTE9XIGlzIHNldCAqSUZGKiBjbnQ9PTEsIHRoZW4gaXQgaXMgdGhlCisJICAgeG9yIG9mIENGIGFuZCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQuICBCbGVjY2suICovCisJLyogcGFyZW50aGVzaXplZCB0aGlzIGV4cHJlc3Npb24gc2luY2UgaXQgYXBwZWFycyB0bworCSAgIGJlIGNhdXNpbmcgT0YgdG8gYmUgbWlzc2V0ICovCisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY250ID09IDEgJiYgWE9SMihjZiArICgocmVzID4+IDYpICYgMHgyKSksCisJCQkgICAgIEZfT0YpOworCisgICAgfQorICAgIHJldHVybiAodTgpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFJDTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiByY2xfd29yZCh1MTYgZCwgdTggcykKK3sKKyAgICB1bnNpZ25lZCBpbnQgcmVzLCBjbnQsIG1hc2ssIGNmOworCisgICAgcmVzID0gZDsKKyAgICBpZiAoKGNudCA9IHMgJSAxNykgIT0gMCkgeworCWNmID0gKGQgPj4gKDE2IC0gY250KSkgJiAweDE7CisJcmVzID0gKGQgPDwgY250KSAmIDB4ZmZmZjsKKwltYXNrID0gKDEgPDwgKGNudCAtIDEpKSAtIDE7CisJcmVzIHw9IChkID4+ICgxNyAtIGNudCkpICYgbWFzazsKKwlpZiAoQUNDRVNTX0ZMQUcoRl9DRikpIHsKKwkgICAgcmVzIHw9IDEgPDwgKGNudCAtIDEpOworCX0KKwlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoY250ID09IDEgJiYgWE9SMihjZiArICgocmVzID4+IDE0KSAmIDB4MikpLAorCQkJICAgICBGX09GKTsKKyAgICB9CisgICAgcmV0dXJuICh1MTYpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFJDTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiByY2xfbG9uZyh1MzIgZCwgdTggcykKK3sKKyAgICB1MzIgcmVzLCBjbnQsIG1hc2ssIGNmOworCisgICAgcmVzID0gZDsKKyAgICBpZiAoKGNudCA9IHMgJSAzMykgIT0gMCkgeworCWNmID0gKGQgPj4gKDMyIC0gY250KSkgJiAweDE7CisJcmVzID0gKGQgPDwgY250KSAmIDB4ZmZmZmZmZmY7CisJbWFzayA9ICgxIDw8IChjbnQgLSAxKSkgLSAxOworCXJlcyB8PSAoZCA+PiAoMzMgLSBjbnQpKSAmIG1hc2s7CisJaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKSB7ICAgICAvKiBjYXJyeSBmbGFnIGlzIHNldCAqLworCSAgICByZXMgfD0gMSA8PCAoY250IC0gMSk7CisJfQorCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhjbnQgPT0gMSAmJiBYT1IyKGNmICsgKChyZXMgPj4gMzApICYgMHgyKSksCisJCQkgICAgIEZfT0YpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFJDUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IHJjcl9ieXRlKHU4IGQsIHU4IHMpCit7CisgICAgdTMyIHJlcywgY250OworICAgIHUzMiBtYXNrLCBjZiwgb2NmID0gMDsKKworICAgIC8qIHJvdGF0ZSByaWdodCB0aHJvdWdoIGNhcnJ5ICovCisgICAgLyoKKyAgICAgICBzIGlzIHRoZSByb3RhdGUgZGlzdGFuY2UuICBJdCB2YXJpZXMgZnJvbSAwIC0gOC4KKyAgICAgICBkIGlzIHRoZSBieXRlIG9iamVjdCByb3RhdGVkLgorCisgICAgICAgaGF2ZQorCisgICAgICAgQ0YgIEJfNyBCXzYgQl81IEJfNCBCXzMgQl8yIEJfMSBCXzAKKworICAgICAgIFRoZSBuZXcgcm90YXRlIGlzIGRvbmUgbW9kIDksIGFuZCBnaXZlbiB0aGlzLAorICAgICAgIGZvciBhIHJvdGF0aW9uIG9mIG4gYml0cyAobW9kIDkpIHRoZSBuZXcgY2FycnkgZmxhZyBpcworICAgICAgIHRoZW4gbG9jYXRlZCBuIGJpdHMgZnJvbSB0aGUgTFNCLiAgVGhlIGxvdyBwYXJ0IGlzCisgICAgICAgdGhlbiBzaGlmdGVkIHVwIGNudCBiaXRzLCBhbmQgdGhlIGhpZ2ggcGFydCBpcyBvcidkCisgICAgICAgaW4uICBVc2luZyBDQVBTIGZvciBuZXcgdmFsdWVzLCBhbmQgbG93ZXJjYXNlIGZvciB0aGUKKyAgICAgICBvcmlnaW5hbCB2YWx1ZXMsIHRoaXMgY2FuIGJlIGV4cHJlc3NlZCBhczoKKworICAgICAgIElGIG4gPiAwCisgICAgICAgMSkgQ0YgPC0JIGJfKG4tMSkKKyAgICAgICAyKSBCXyg4LShuKzEpKSAuLiBCXygwKQk8LSAgYl8oNykgLi4gYl8obikKKyAgICAgICAzKSBCXyg4LW4pIDwtIGNmCisgICAgICAgNCkgQl8oNykgLi4gQl8oOC0obi0xKSkgPC0gIGJfKG4tMikgLi4gYl8oMCkKKyAgICAgKi8KKyAgICByZXMgPSBkOworICAgIGlmICgoY250ID0gcyAlIDkpICE9IDApIHsKKwkvKiBleHRyYWN0IHRoZSBuZXcgQ0FSUlkgRkxBRy4gKi8KKwkvKiBDRiA8LSAgYl8obi0xKQkgICAgICAgKi8KKwlpZiAoY250ID09IDEpIHsKKwkgICAgY2YgPSBkICYgMHgxOworCSAgICAvKiBub3RlIGhhY2tlcnkgaGVyZS4gIEFjY2Vzc19mbGFnKC4uKSBldmFsdWF0ZXMgdG8gZWl0aGVyCisJICAgICAgIDAgaWYgZmxhZyBub3Qgc2V0CisJICAgICAgIG5vbi16ZXJvIGlmIGZsYWcgaXMgc2V0LgorCSAgICAgICBkb2luZyBhY2Nlc3NfZmxhZyguLikgIT0gMCBjYXN0cyB0aGF0IGludG8gZWl0aGVyCisJICAgICAgIDAuLjEgaW4gYW55IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmbGFncyByZWdpc3RlcgorCSAgICAgICAoaS5lLiBwYWNrZWQgYml0IGFycmF5IG9yIHVucGFja2VkLikKKwkgICAgICovCisJICAgIG9jZiA9IEFDQ0VTU19GTEFHKEZfQ0YpICE9IDA7CisJfSBlbHNlCisJICAgIGNmID0gKGQgPj4gKGNudCAtIDEpKSAmIDB4MTsKKworCS8qIEJfKDgtKG4rMSkpIC4uIEJfKDApCSA8LSAgYl8oNykgLi4gYl9uICAqLworCS8qIG5vdGUgdGhhdCB0aGUgcmlnaHQgaGFuZCBzaWRlIGRvbmUgYnkgdGhlIG1hc2sKKwkgICBUaGlzIGlzIGVmZmVjdGl2ZWx5IGRvbmUgYnkgc2hpZnRpbmcgdGhlCisJICAgb2JqZWN0IHRvIHRoZSByaWdodC4JIFRoZSByZXN1bHQgbXVzdCBiZSBtYXNrZWQsCisJICAgaW4gY2FzZSB0aGUgb2JqZWN0IGNhbWUgaW4gYW5kIHdhcyB0cmVhdGVkCisJICAgYXMgYSBuZWdhdGl2ZSBudW1iZXIuICBOZWVkZWQ/Pz8gKi8KKworCW1hc2sgPSAoMSA8PCAoOCAtIGNudCkpIC0gMTsKKwlyZXMgPSAoZCA+PiBjbnQpICYgbWFzazsKKworCS8qIG5vdyB0aGUgaGlnaCBzdHVmZiB3aGljaCByb3RhdGVkIGFyb3VuZAorCSAgIGludG8gdGhlIHBvc2l0aW9ucyBCX2NudC0yIC4uIEJfMCAqLworCS8qIEJfKDcpIC4uIEJfKDgtKG4tMSkpIDwtICBiXyhuLTIpIC4uIGJfKDApICovCisJLyogc2hpZnQgaXQgZG93bndhcmQsIDctKG4tMikgPSA5LW4gcG9zaXRpb25zLgorCSAgIGFuZCBtYXNrIG9mZiB0aGUgcmVzdWx0IGJlZm9yZSBvcidpbmcgaW4uCisJICovCisJcmVzIHw9IChkIDw8ICg5IC0gY250KSk7CisKKwkvKiBpZiB0aGUgY2FycnkgZmxhZyB3YXMgc2V0LCBvciBpdCBpbi4JICovCisJaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKSB7ICAgICAvKiBjYXJyeSBmbGFnIGlzIHNldCAqLworCSAgICAvKglCXyg4LW4pIDwtIGNmICovCisJICAgIHJlcyB8PSAxIDw8ICg4IC0gY250KTsKKwl9CisJLyogc2V0IHRoZSBuZXcgY2FycnkgZmxhZywgYmFzZWQgb24gdGhlIHZhcmlhYmxlICJjZiIgKi8KKwlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7CisJLyogT1ZFUkZMT1cgaXMgc2V0ICpJRkYqIGNudD09MSwgdGhlbiBpdCBpcyB0aGUKKwkgICB4b3Igb2YgQ0YgYW5kIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdC4gIEJsZWNjay4gKi8KKwkvKiBwYXJlbnRoZXNpemVkLi4uICovCisJaWYgKGNudCA9PSAxKSB7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIob2NmICsgKChkID4+IDYpICYgMHgyKSksCisJCQkJIEZfT0YpOworCX0KKyAgICB9CisgICAgcmV0dXJuICh1OClyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgUkNSIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IHJjcl93b3JkKHUxNiBkLCB1OCBzKQoreworICAgIHUzMiByZXMsIGNudDsKKyAgICB1MzIgbWFzaywgY2YsIG9jZiA9IDA7CisKKyAgICAvKiByb3RhdGUgcmlnaHQgdGhyb3VnaCBjYXJyeSAqLworICAgIHJlcyA9IGQ7CisgICAgaWYgKChjbnQgPSBzICUgMTcpICE9IDApIHsKKwlpZiAoY250ID09IDEpIHsKKwkgICAgY2YgPSBkICYgMHgxOworCSAgICBvY2YgPSBBQ0NFU1NfRkxBRyhGX0NGKSAhPSAwOworCX0gZWxzZQorCSAgICBjZiA9IChkID4+IChjbnQgLSAxKSkgJiAweDE7CisJbWFzayA9ICgxIDw8ICgxNiAtIGNudCkpIC0gMTsKKwlyZXMgPSAoZCA+PiBjbnQpICYgbWFzazsKKwlyZXMgfD0gKGQgPDwgKDE3IC0gY250KSk7CisJaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKSB7CisJICAgIHJlcyB8PSAxIDw8ICgxNiAtIGNudCk7CisJfQorCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwlpZiAoY250ID09IDEpIHsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihvY2YgKyAoKGQgPj4gMTQpICYgMHgyKSksCisJCQkJIEZfT0YpOworCX0KKyAgICB9CisgICAgcmV0dXJuICh1MTYpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFJDUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiByY3JfbG9uZyh1MzIgZCwgdTggcykKK3sKKyAgICB1MzIgcmVzLCBjbnQ7CisgICAgdTMyIG1hc2ssIGNmLCBvY2YgPSAwOworCisgICAgLyogcm90YXRlIHJpZ2h0IHRocm91Z2ggY2FycnkgKi8KKyAgICByZXMgPSBkOworICAgIGlmICgoY250ID0gcyAlIDMzKSAhPSAwKSB7CisJaWYgKGNudCA9PSAxKSB7CisJICAgIGNmID0gZCAmIDB4MTsKKwkgICAgb2NmID0gQUNDRVNTX0ZMQUcoRl9DRikgIT0gMDsKKwl9IGVsc2UKKwkgICAgY2YgPSAoZCA+PiAoY250IC0gMSkpICYgMHgxOworCW1hc2sgPSAoMSA8PCAoMzIgLSBjbnQpKSAtIDE7CisJcmVzID0gKGQgPj4gY250KSAmIG1hc2s7CisJaWYgKGNudCAhPSAxKQorCSAgICByZXMgfD0gKGQgPDwgKDMzIC0gY250KSk7CisJaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKSB7ICAgICAvKiBjYXJyeSBmbGFnIGlzIHNldCAqLworCSAgICByZXMgfD0gMSA8PCAoMzIgLSBjbnQpOworCX0KKwlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7CisJaWYgKGNudCA9PSAxKSB7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIob2NmICsgKChkID4+IDMwKSAmIDB4MikpLAorCQkJCSBGX09GKTsKKwl9CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgUk9MIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggcm9sX2J5dGUodTggZCwgdTggcykKK3sKKyAgICB1bnNpZ25lZCBpbnQgcmVzLCBjbnQsIG1hc2s7CisKKyAgICAvKiByb3RhdGUgbGVmdCAqLworICAgIC8qCisgICAgICAgcyBpcyB0aGUgcm90YXRlIGRpc3RhbmNlLiAgSXQgdmFyaWVzIGZyb20gMCAtIDguCisgICAgICAgZCBpcyB0aGUgYnl0ZSBvYmplY3Qgcm90YXRlZC4KKworICAgICAgIGhhdmUKKworICAgICAgIENGICBCXzcgLi4uIEJfMAorCisgICAgICAgVGhlIG5ldyByb3RhdGUgaXMgZG9uZSBtb2QgOC4KKyAgICAgICBNdWNoIHNpbXBsZXIgdGhhbiB0aGUgInJjbCIgb3IgInJjciIgb3BlcmF0aW9ucy4KKworICAgICAgIElGIG4gPiAwCisgICAgICAgMSkgQl8oNykgLi4gQl8obikgIDwtICBiXyg4LShuKzEpKSAuLiBiXygwKQorICAgICAgIDIpIEJfKG4tMSkgLi4gQl8oMCkgPC0gIGJfKDcpIC4uIGJfKDgtbikKKyAgICAgKi8KKyAgICByZXMgPSBkOworICAgIGlmICgoY250ID0gcyAlIDgpICE9IDApIHsKKwkvKiBCXyg3KSAuLiBCXyhuKSAgPC0gIGJfKDgtKG4rMSkpIC4uIGJfKDApICovCisJcmVzID0gKGQgPDwgY250KTsKKworCS8qIEJfKG4tMSkgLi4gQl8oMCkgPC0JYl8oNykgLi4gYl8oOC1uKSAqLworCW1hc2sgPSAoMSA8PCBjbnQpIC0gMTsKKwlyZXMgfD0gKGQgPj4gKDggLSBjbnQpKSAmIG1hc2s7CisKKwkvKiBzZXQgdGhlIG5ldyBjYXJyeSBmbGFnLCBOb3RlIHRoYXQgaXQgaXMgdGhlIGxvdyBvcmRlcgorCSAgIGJpdCBvZiB0aGUgcmVzdWx0ISEhCQkJCSAgICAgICovCisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHgxLCBGX0NGKTsKKwkvKiBPVkVSRkxPVyBpcyBzZXQgKklGRiogcz09MSwgdGhlbiBpdCBpcyB0aGUKKwkgICB4b3Igb2YgQ0YgYW5kIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdC4gIEJsZWNjay4gKi8KKwlDT05ESVRJT05BTF9TRVRfRkxBRyhzID09IDEgJiYKKwkJCSAgICAgWE9SMigocmVzICYgMHgxKSArICgocmVzID4+IDYpICYgMHgyKSksCisJCQkgICAgIEZfT0YpOworICAgIH0gaWYgKHMgIT0gMCkgeworCS8qIHNldCB0aGUgbmV3IGNhcnJ5IGZsYWcsIE5vdGUgdGhhdCBpdCBpcyB0aGUgbG93IG9yZGVyCisJICAgYml0IG9mIHRoZSByZXN1bHQhISEJCQkJICAgICAgKi8KKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDEsIEZfQ0YpOworICAgIH0KKyAgICByZXR1cm4gKHU4KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBST0wgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgcm9sX3dvcmQodTE2IGQsIHU4IHMpCit7CisgICAgdW5zaWduZWQgaW50IHJlcywgY250LCBtYXNrOworCisgICAgcmVzID0gZDsKKyAgICBpZiAoKGNudCA9IHMgJSAxNikgIT0gMCkgeworCXJlcyA9IChkIDw8IGNudCk7CisJbWFzayA9ICgxIDw8IGNudCkgLSAxOworCXJlcyB8PSAoZCA+PiAoMTYgLSBjbnQpKSAmIG1hc2s7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHgxLCBGX0NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhzID09IDEgJiYKKwkJCSAgICAgWE9SMigocmVzICYgMHgxKSArICgocmVzID4+IDE0KSAmIDB4MikpLAorCQkJICAgICBGX09GKTsKKyAgICB9IGlmIChzICE9IDApIHsKKwkvKiBzZXQgdGhlIG5ldyBjYXJyeSBmbGFnLCBOb3RlIHRoYXQgaXQgaXMgdGhlIGxvdyBvcmRlcgorCSAgIGJpdCBvZiB0aGUgcmVzdWx0ISEhCQkJCSAgICAgICovCisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHgxLCBGX0NGKTsKKyAgICB9CisgICAgcmV0dXJuICh1MTYpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFJPTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiByb2xfbG9uZyh1MzIgZCwgdTggcykKK3sKKyAgICB1MzIgcmVzLCBjbnQsIG1hc2s7CisKKyAgICByZXMgPSBkOworICAgIGlmICgoY250ID0gcyAlIDMyKSAhPSAwKSB7CisJcmVzID0gKGQgPDwgY250KTsKKwltYXNrID0gKDEgPDwgY250KSAtIDE7CisJcmVzIHw9IChkID4+ICgzMiAtIGNudCkpICYgbWFzazsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDEsIEZfQ0YpOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHMgPT0gMSAmJgorCQkJICAgICBYT1IyKChyZXMgJiAweDEpICsgKChyZXMgPj4gMzApICYgMHgyKSksCisJCQkgICAgIEZfT0YpOworICAgIH0gaWYgKHMgIT0gMCkgeworCS8qIHNldCB0aGUgbmV3IGNhcnJ5IGZsYWcsIE5vdGUgdGhhdCBpdCBpcyB0aGUgbG93IG9yZGVyCisJICAgYml0IG9mIHRoZSByZXN1bHQhISEJCQkJICAgICAgKi8KKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDEsIEZfQ0YpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFJPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IHJvcl9ieXRlKHU4IGQsIHU4IHMpCit7CisgICAgdW5zaWduZWQgaW50IHJlcywgY250LCBtYXNrOworCisgICAgLyogcm90YXRlIHJpZ2h0ICovCisgICAgLyoKKyAgICAgICBzIGlzIHRoZSByb3RhdGUgZGlzdGFuY2UuICBJdCB2YXJpZXMgZnJvbSAwIC0gOC4KKyAgICAgICBkIGlzIHRoZSBieXRlIG9iamVjdCByb3RhdGVkLgorCisgICAgICAgaGF2ZQorCisgICAgICAgQl83IC4uLiBCXzAKKworICAgICAgIFRoZSByb3RhdGUgaXMgZG9uZSBtb2QgOC4KKworICAgICAgIElGIG4gPiAwCisgICAgICAgMSkgQl8oOC0obisxKSkgLi4gQl8oMCkJPC0gIGJfKDcpIC4uIGJfKG4pCisgICAgICAgMikgQl8oNykgLi4gQl8oOC1uKSA8LSAgYl8obi0xKSAuLiBiXygwKQorICAgICAqLworICAgIHJlcyA9IGQ7CisgICAgaWYgKChjbnQgPSBzICUgOCkgIT0gMCkgewkJLyogbm90IGEgdHlwbywgZG8gbmFkYSBpZiBjbnQ9PTAgKi8KKwkvKiBCXyg3KSAuLiBCXyg4LW4pIDwtCWJfKG4tMSkgLi4gYl8oMCkgKi8KKwlyZXMgPSAoZCA8PCAoOCAtIGNudCkpOworCisJLyogQl8oOC0obisxKSkgLi4gQl8oMCkJIDwtICBiXyg3KSAuLiBiXyhuKSAqLworCW1hc2sgPSAoMSA8PCAoOCAtIGNudCkpIC0gMTsKKwlyZXMgfD0gKGQgPj4gKGNudCkpICYgbWFzazsKKworCS8qIHNldCB0aGUgbmV3IGNhcnJ5IGZsYWcsIE5vdGUgdGhhdCBpdCBpcyB0aGUgbG93IG9yZGVyCisJICAgYml0IG9mIHRoZSByZXN1bHQhISEJCQkJICAgICAgKi8KKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwLCBGX0NGKTsKKwkvKiBPVkVSRkxPVyBpcyBzZXQgKklGRiogcz09MSwgdGhlbiBpdCBpcyB0aGUKKwkgICB4b3Igb2YgdGhlIHR3byBtb3N0IHNpZ25pZmljYW50IGJpdHMuICBCbGVjY2suICovCisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocyA9PSAxICYmIFhPUjIocmVzID4+IDYpLCBGX09GKTsKKyAgICB9IGVsc2UgaWYgKHMgIT0gMCkgeworCS8qIHNldCB0aGUgbmV3IGNhcnJ5IGZsYWcsIE5vdGUgdGhhdCBpdCBpcyB0aGUgbG93IG9yZGVyCisJICAgYml0IG9mIHRoZSByZXN1bHQhISEJCQkJICAgICAgKi8KKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwLCBGX0NGKTsKKyAgICB9CisgICAgcmV0dXJuICh1OClyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgUk9SIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IHJvcl93b3JkKHUxNiBkLCB1OCBzKQoreworICAgIHVuc2lnbmVkIGludCByZXMsIGNudCwgbWFzazsKKworICAgIHJlcyA9IGQ7CisgICAgaWYgKChjbnQgPSBzICUgMTYpICE9IDApIHsKKwlyZXMgPSAoZCA8PCAoMTYgLSBjbnQpKTsKKwltYXNrID0gKDEgPDwgKDE2IC0gY250KSkgLSAxOworCXJlcyB8PSAoZCA+PiAoY250KSkgJiBtYXNrOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKHJlcyAmIDB4ODAwMCwgRl9DRik7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocyA9PSAxICYmIFhPUjIocmVzID4+IDE0KSwgRl9PRik7CisgICAgfSBlbHNlIGlmIChzICE9IDApIHsKKwkvKiBzZXQgdGhlIG5ldyBjYXJyeSBmbGFnLCBOb3RlIHRoYXQgaXQgaXMgdGhlIGxvdyBvcmRlcgorCSAgIGJpdCBvZiB0aGUgcmVzdWx0ISEhCQkJCSAgICAgICovCisJQ09ORElUSU9OQUxfU0VUX0ZMQUcocmVzICYgMHg4MDAwLCBGX0NGKTsKKyAgICB9CisgICAgcmV0dXJuICh1MTYpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFJPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiByb3JfbG9uZyh1MzIgZCwgdTggcykKK3sKKyAgICB1MzIgcmVzLCBjbnQsIG1hc2s7CisKKyAgICByZXMgPSBkOworICAgIGlmICgoY250ID0gcyAlIDMyKSAhPSAwKSB7CisJcmVzID0gKGQgPDwgKDMyIC0gY250KSk7CisJbWFzayA9ICgxIDw8ICgzMiAtIGNudCkpIC0gMTsKKwlyZXMgfD0gKGQgPj4gKGNudCkpICYgbWFzazsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX0NGKTsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhzID09IDEgJiYgWE9SMihyZXMgPj4gMzApLCBGX09GKTsKKyAgICB9IGVsc2UgaWYgKHMgIT0gMCkgeworCS8qIHNldCB0aGUgbmV3IGNhcnJ5IGZsYWcsIE5vdGUgdGhhdCBpdCBpcyB0aGUgbG93IG9yZGVyCisJICAgYml0IG9mIHRoZSByZXN1bHQhISEJCQkJICAgICAgKi8KKwlDT05ESVRJT05BTF9TRVRfRkxBRyhyZXMgJiAweDgwMDAwMDAwLCBGX0NGKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBTSEwgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBzaGxfYnl0ZSh1OCBkLCB1OCBzKQoreworICAgIHVuc2lnbmVkIGludCBjbnQsIHJlcywgY2Y7CisKKyAgICBpZiAocyA8IDgpIHsKKwljbnQgPSBzICUgODsKKworCS8qIGxhc3QgYml0IHNoaWZ0ZWQgb3V0IGdvZXMgaW50byBjYXJyeSBmbGFnICovCisJaWYgKGNudCA+IDApIHsKKwkgICAgcmVzID0gZCA8PCBjbnQ7CisJICAgIGNmID0gZCAmICgxIDw8ICg4IC0gY250KSk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwkgICAgc2V0X3N6cF9mbGFnc184KCh1OClyZXMpOworCX0gZWxzZSB7CisJICAgIHJlcyA9ICh1OCkgZDsKKwl9CisKKwlpZiAoY250ID09IDEpIHsKKwkgICAgLyogTmVlZHMgc2ltcGxpZmljYXRpb24uICovCisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKAorCQkJCSAgICAoKChyZXMgJiAweDgwKSA9PSAweDgwKSBeCisJCQkJICAgICAoQUNDRVNTX0ZMQUcoRl9DRikgIT0gMCkpLAorCSAgICAvKiB3YXMgKE0ueDg2LlJfRkxHJkZfQ0YpPT1GX0NGKSksICovCisJCQkJICAgIEZfT0YpOworCX0gZWxzZSB7CisJICAgIENMRUFSX0ZMQUcoRl9PRik7CisJfQorICAgIH0gZWxzZSB7CisJcmVzID0gMDsKKwlDT05ESVRJT05BTF9TRVRfRkxBRygoZCA8PCAocy0xKSkgJiAweDgwLCBGX0NGKTsKKwlDTEVBUl9GTEFHKEZfT0YpOworCUNMRUFSX0ZMQUcoRl9TRik7CisJU0VUX0ZMQUcoRl9QRik7CisJU0VUX0ZMQUcoRl9aRik7CisgICAgfQorICAgIHJldHVybiAodTgpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFNITCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBzaGxfd29yZCh1MTYgZCwgdTggcykKK3sKKyAgICB1bnNpZ25lZCBpbnQgY250LCByZXMsIGNmOworCisgICAgaWYgKHMgPCAxNikgeworCWNudCA9IHMgJSAxNjsKKwlpZiAoY250ID4gMCkgeworCSAgICByZXMgPSBkIDw8IGNudDsKKwkgICAgY2YgPSBkICYgKDEgPDwgKDE2IC0gY250KSk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwkgICAgc2V0X3N6cF9mbGFnc18xNigodTE2KXJlcyk7CisJfSBlbHNlIHsKKwkgICAgcmVzID0gKHUxNikgZDsKKwl9CisKKwlpZiAoY250ID09IDEpIHsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoCisJCQkJICAgICgoKHJlcyAmIDB4ODAwMCkgPT0gMHg4MDAwKSBeCisJCQkJICAgICAoQUNDRVNTX0ZMQUcoRl9DRikgIT0gMCkpLAorCQkJCSAgICBGX09GKTsKKwl9IGVsc2UgeworCSAgICBDTEVBUl9GTEFHKEZfT0YpOworCX0KKyAgICB9IGVsc2UgeworCXJlcyA9IDA7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKGQgPDwgKHMtMSkpICYgMHg4MDAwLCBGX0NGKTsKKwlDTEVBUl9GTEFHKEZfT0YpOworCUNMRUFSX0ZMQUcoRl9TRik7CisJU0VUX0ZMQUcoRl9QRik7CisJU0VUX0ZMQUcoRl9aRik7CisgICAgfQorICAgIHJldHVybiAodTE2KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBTSEwgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgc2hsX2xvbmcodTMyIGQsIHU4IHMpCit7CisgICAgdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZjsKKworICAgIGlmIChzIDwgMzIpIHsKKwljbnQgPSBzICUgMzI7CisJaWYgKGNudCA+IDApIHsKKwkgICAgcmVzID0gZCA8PCBjbnQ7CisJICAgIGNmID0gZCAmICgxIDw8ICgzMiAtIGNudCkpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7CisJICAgIHNldF9zenBfZmxhZ3NfMzIoKHUzMilyZXMpOworCX0gZWxzZSB7CisJICAgIHJlcyA9IGQ7CisJfQorCWlmIChjbnQgPT0gMSkgeworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygoKChyZXMgJiAweDgwMDAwMDAwKSA9PSAweDgwMDAwMDAwKSBeCisJCQkJICAoQUNDRVNTX0ZMQUcoRl9DRikgIT0gMCkpLCBGX09GKTsKKwl9IGVsc2UgeworCSAgICBDTEVBUl9GTEFHKEZfT0YpOworCX0KKyAgICB9IGVsc2UgeworCXJlcyA9IDA7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKGQgPDwgKHMtMSkpICYgMHg4MDAwMDAwMCwgRl9DRik7CisJQ0xFQVJfRkxBRyhGX09GKTsKKwlDTEVBUl9GTEFHKEZfU0YpOworCVNFVF9GTEFHKEZfUEYpOworCVNFVF9GTEFHKEZfWkYpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFNIUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IHNocl9ieXRlKHU4IGQsIHU4IHMpCit7CisgICAgdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZjsKKworICAgIGlmIChzIDwgOCkgeworCWNudCA9IHMgJSA4OworCWlmIChjbnQgPiAwKSB7CisJICAgIGNmID0gZCAmICgxIDw8IChjbnQgLSAxKSk7CisJICAgIHJlcyA9IGQgPj4gY250OworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7CisJICAgIHNldF9zenBfZmxhZ3NfOCgodTgpcmVzKTsKKwl9IGVsc2UgeworCSAgICByZXMgPSAodTgpIGQ7CisJfQorCisJaWYgKGNudCA9PSAxKSB7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIocmVzID4+IDYpLCBGX09GKTsKKwl9IGVsc2UgeworCSAgICBDTEVBUl9GTEFHKEZfT0YpOworCX0KKyAgICB9IGVsc2UgeworCXJlcyA9IDA7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKGQgPj4gKHMtMSkpICYgMHgxLCBGX0NGKTsKKwlDTEVBUl9GTEFHKEZfT0YpOworCUNMRUFSX0ZMQUcoRl9TRik7CisJU0VUX0ZMQUcoRl9QRik7CisJU0VUX0ZMQUcoRl9aRik7CisgICAgfQorICAgIHJldHVybiAodTgpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFNIUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBzaHJfd29yZCh1MTYgZCwgdTggcykKK3sKKyAgICB1bnNpZ25lZCBpbnQgY250LCByZXMsIGNmOworCisgICAgaWYgKHMgPCAxNikgeworCWNudCA9IHMgJSAxNjsKKwlpZiAoY250ID4gMCkgeworCSAgICBjZiA9IGQgJiAoMSA8PCAoY250IC0gMSkpOworCSAgICByZXMgPSBkID4+IGNudDsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOworCSAgICBzZXRfc3pwX2ZsYWdzXzE2KCh1MTYpcmVzKTsKKwl9IGVsc2UgeworCSAgICByZXMgPSBkOworCX0KKworCWlmIChjbnQgPT0gMSkgeworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKHJlcyA+PiAxNCksIEZfT0YpOworCX0gZWxzZSB7CisJICAgIENMRUFSX0ZMQUcoRl9PRik7CisJfQorICAgIH0gZWxzZSB7CisJcmVzID0gMDsKKwlDTEVBUl9GTEFHKEZfQ0YpOworCUNMRUFSX0ZMQUcoRl9PRik7CisJU0VUX0ZMQUcoRl9aRik7CisJQ0xFQVJfRkxBRyhGX1NGKTsKKwlDTEVBUl9GTEFHKEZfUEYpOworICAgIH0KKyAgICByZXR1cm4gKHUxNilyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgU0hSIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHNocl9sb25nKHUzMiBkLCB1OCBzKQoreworICAgIHVuc2lnbmVkIGludCBjbnQsIHJlcywgY2Y7CisKKyAgICBpZiAocyA8IDMyKSB7CisJY250ID0gcyAlIDMyOworCWlmIChjbnQgPiAwKSB7CisJICAgIGNmID0gZCAmICgxIDw8IChjbnQgLSAxKSk7CisJICAgIHJlcyA9IGQgPj4gY250OworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7CisJICAgIHNldF9zenBfZmxhZ3NfMzIoKHUzMilyZXMpOworCX0gZWxzZSB7CisJICAgIHJlcyA9IGQ7CisJfQorCWlmIChjbnQgPT0gMSkgeworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKHJlcyA+PiAzMCksIEZfT0YpOworCX0gZWxzZSB7CisJICAgIENMRUFSX0ZMQUcoRl9PRik7CisJfQorICAgIH0gZWxzZSB7CisJcmVzID0gMDsKKwlDTEVBUl9GTEFHKEZfQ0YpOworCUNMRUFSX0ZMQUcoRl9PRik7CisJU0VUX0ZMQUcoRl9aRik7CisJQ0xFQVJfRkxBRyhGX1NGKTsKKwlDTEVBUl9GTEFHKEZfUEYpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFNBUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IHNhcl9ieXRlKHU4IGQsIHU4IHMpCit7CisgICAgdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZiwgbWFzaywgc2Y7CisKKyAgICByZXMgPSBkOworICAgIHNmID0gZCAmIDB4ODA7CisgICAgY250ID0gcyAlIDg7CisgICAgaWYgKGNudCA+IDAgJiYgY250IDwgOCkgeworCW1hc2sgPSAoMSA8PCAoOCAtIGNudCkpIC0gMTsKKwljZiA9IGQgJiAoMSA8PCAoY250IC0gMSkpOworCXJlcyA9IChkID4+IGNudCkgJiBtYXNrOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwlpZiAoc2YpIHsKKwkgICAgcmVzIHw9IH5tYXNrOworCX0KKwlzZXRfc3pwX2ZsYWdzXzgoKHU4KXJlcyk7CisgICAgfSBlbHNlIGlmIChjbnQgPj0gOCkgeworCWlmIChzZikgeworCSAgICByZXMgPSAweGZmOworCSAgICBTRVRfRkxBRyhGX0NGKTsKKwkgICAgQ0xFQVJfRkxBRyhGX1pGKTsKKwkgICAgU0VUX0ZMQUcoRl9TRik7CisJICAgIFNFVF9GTEFHKEZfUEYpOworCX0gZWxzZSB7CisJICAgIHJlcyA9IDA7CisJICAgIENMRUFSX0ZMQUcoRl9DRik7CisJICAgIFNFVF9GTEFHKEZfWkYpOworCSAgICBDTEVBUl9GTEFHKEZfU0YpOworCSAgICBDTEVBUl9GTEFHKEZfUEYpOworCX0KKyAgICB9CisgICAgcmV0dXJuICh1OClyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgU0FSIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IHNhcl93b3JkKHUxNiBkLCB1OCBzKQoreworICAgIHVuc2lnbmVkIGludCBjbnQsIHJlcywgY2YsIG1hc2ssIHNmOworCisgICAgc2YgPSBkICYgMHg4MDAwOworICAgIGNudCA9IHMgJSAxNjsKKyAgICByZXMgPSBkOworICAgIGlmIChjbnQgPiAwICYmIGNudCA8IDE2KSB7CisJbWFzayA9ICgxIDw8ICgxNiAtIGNudCkpIC0gMTsKKwljZiA9IGQgJiAoMSA8PCAoY250IC0gMSkpOworCXJlcyA9IChkID4+IGNudCkgJiBtYXNrOworCUNPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwlpZiAoc2YpIHsKKwkgICAgcmVzIHw9IH5tYXNrOworCX0KKwlzZXRfc3pwX2ZsYWdzXzE2KCh1MTYpcmVzKTsKKyAgICB9IGVsc2UgaWYgKGNudCA+PSAxNikgeworCWlmIChzZikgeworCSAgICByZXMgPSAweGZmZmY7CisJICAgIFNFVF9GTEFHKEZfQ0YpOworCSAgICBDTEVBUl9GTEFHKEZfWkYpOworCSAgICBTRVRfRkxBRyhGX1NGKTsKKwkgICAgU0VUX0ZMQUcoRl9QRik7CisJfSBlbHNlIHsKKwkgICAgcmVzID0gMDsKKwkgICAgQ0xFQVJfRkxBRyhGX0NGKTsKKwkgICAgU0VUX0ZMQUcoRl9aRik7CisJICAgIENMRUFSX0ZMQUcoRl9TRik7CisJICAgIENMRUFSX0ZMQUcoRl9QRik7CisJfQorICAgIH0KKyAgICByZXR1cm4gKHUxNilyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgU0FSIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHNhcl9sb25nKHUzMiBkLCB1OCBzKQoreworICAgIHUzMiBjbnQsIHJlcywgY2YsIG1hc2ssIHNmOworCisgICAgc2YgPSBkICYgMHg4MDAwMDAwMDsKKyAgICBjbnQgPSBzICUgMzI7CisgICAgcmVzID0gZDsKKyAgICBpZiAoY250ID4gMCAmJiBjbnQgPCAzMikgeworCW1hc2sgPSAoMSA8PCAoMzIgLSBjbnQpKSAtIDE7CisJY2YgPSBkICYgKDEgPDwgKGNudCAtIDEpKTsKKwlyZXMgPSAoZCA+PiBjbnQpICYgbWFzazsKKwlDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7CisJaWYgKHNmKSB7CisJICAgIHJlcyB8PSB+bWFzazsKKwl9CisJc2V0X3N6cF9mbGFnc18zMihyZXMpOworICAgIH0gZWxzZSBpZiAoY250ID49IDMyKSB7CisJaWYgKHNmKSB7CisJICAgIHJlcyA9IDB4ZmZmZmZmZmY7CisJICAgIFNFVF9GTEFHKEZfQ0YpOworCSAgICBDTEVBUl9GTEFHKEZfWkYpOworCSAgICBTRVRfRkxBRyhGX1NGKTsKKwkgICAgU0VUX0ZMQUcoRl9QRik7CisJfSBlbHNlIHsKKwkgICAgcmVzID0gMDsKKwkgICAgQ0xFQVJfRkxBRyhGX0NGKTsKKwkgICAgU0VUX0ZMQUcoRl9aRik7CisJICAgIENMRUFSX0ZMQUcoRl9TRik7CisJICAgIENMRUFSX0ZMQUcoRl9QRik7CisJfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFNITEQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgc2hsZF93b3JkICh1MTYgZCwgdTE2IGZpbGwsIHU4IHMpCit7CisgICAgdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZjsKKworICAgIGlmIChzIDwgMTYpIHsKKwljbnQgPSBzICUgMTY7CisJaWYgKGNudCA+IDApIHsKKwkgICAgcmVzID0gKGQgPDwgY250KSB8IChmaWxsID4+ICgxNi1jbnQpKTsKKwkgICAgY2YgPSBkICYgKDEgPDwgKDE2IC0gY250KSk7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGNmLCBGX0NGKTsKKwkgICAgc2V0X3N6cF9mbGFnc18xNigodTE2KXJlcyk7CisJfSBlbHNlIHsKKwkgICAgcmVzID0gZDsKKwl9CisJaWYgKGNudCA9PSAxKSB7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKCgoKHJlcyAmIDB4ODAwMCkgPT0gMHg4MDAwKSBeCisJCQkJICAoQUNDRVNTX0ZMQUcoRl9DRikgIT0gMCkpLCBGX09GKTsKKwl9IGVsc2UgeworCSAgICBDTEVBUl9GTEFHKEZfT0YpOworCX0KKyAgICB9IGVsc2UgeworCXJlcyA9IDA7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKGQgPDwgKHMtMSkpICYgMHg4MDAwLCBGX0NGKTsKKwlDTEVBUl9GTEFHKEZfT0YpOworCUNMRUFSX0ZMQUcoRl9TRik7CisJU0VUX0ZMQUcoRl9QRik7CisJU0VUX0ZMQUcoRl9aRik7CisgICAgfQorICAgIHJldHVybiAodTE2KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBTSExEIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHNobGRfbG9uZyAodTMyIGQsIHUzMiBmaWxsLCB1OCBzKQoreworICAgIHVuc2lnbmVkIGludCBjbnQsIHJlcywgY2Y7CisKKyAgICBpZiAocyA8IDMyKSB7CisJY250ID0gcyAlIDMyOworCWlmIChjbnQgPiAwKSB7CisJICAgIHJlcyA9IChkIDw8IGNudCkgfCAoZmlsbCA+PiAoMzItY250KSk7CisJICAgIGNmID0gZCAmICgxIDw8ICgzMiAtIGNudCkpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7CisJICAgIHNldF9zenBfZmxhZ3NfMzIoKHUzMilyZXMpOworCX0gZWxzZSB7CisJICAgIHJlcyA9IGQ7CisJfQorCWlmIChjbnQgPT0gMSkgeworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRygoKChyZXMgJiAweDgwMDAwMDAwKSA9PSAweDgwMDAwMDAwKSBeCisJCQkJICAoQUNDRVNTX0ZMQUcoRl9DRikgIT0gMCkpLCBGX09GKTsKKwl9IGVsc2UgeworCSAgICBDTEVBUl9GTEFHKEZfT0YpOworCX0KKyAgICB9IGVsc2UgeworCXJlcyA9IDA7CisJQ09ORElUSU9OQUxfU0VUX0ZMQUcoKGQgPDwgKHMtMSkpICYgMHg4MDAwMDAwMCwgRl9DRik7CisJQ0xFQVJfRkxBRyhGX09GKTsKKwlDTEVBUl9GTEFHKEZfU0YpOworCVNFVF9GTEFHKEZfUEYpOworCVNFVF9GTEFHKEZfWkYpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFNIUkQgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgc2hyZF93b3JkICh1MTYgZCwgdTE2IGZpbGwsIHU4IHMpCit7CisgICAgdW5zaWduZWQgaW50IGNudCwgcmVzLCBjZjsKKworICAgIGlmIChzIDwgMTYpIHsKKwljbnQgPSBzICUgMTY7CisJaWYgKGNudCA+IDApIHsKKwkgICAgY2YgPSBkICYgKDEgPDwgKGNudCAtIDEpKTsKKwkgICAgcmVzID0gKGQgPj4gY250KSB8IChmaWxsIDw8ICgxNiAtIGNudCkpOworCSAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhjZiwgRl9DRik7CisJICAgIHNldF9zenBfZmxhZ3NfMTYoKHUxNilyZXMpOworCX0gZWxzZSB7CisJICAgIHJlcyA9IGQ7CisJfQorCisJaWYgKGNudCA9PSAxKSB7CisJICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIocmVzID4+IDE0KSwgRl9PRik7CisJfSBlbHNlIHsKKwkgICAgQ0xFQVJfRkxBRyhGX09GKTsKKwl9CisgICAgfSBlbHNlIHsKKwlyZXMgPSAwOworCUNMRUFSX0ZMQUcoRl9DRik7CisJQ0xFQVJfRkxBRyhGX09GKTsKKwlTRVRfRkxBRyhGX1pGKTsKKwlDTEVBUl9GTEFHKEZfU0YpOworCUNMRUFSX0ZMQUcoRl9QRik7CisgICAgfQorICAgIHJldHVybiAodTE2KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBTSFJEIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHNocmRfbG9uZyAodTMyIGQsIHUzMiBmaWxsLCB1OCBzKQoreworICAgIHVuc2lnbmVkIGludCBjbnQsIHJlcywgY2Y7CisKKyAgICBpZiAocyA8IDMyKSB7CisJY250ID0gcyAlIDMyOworCWlmIChjbnQgPiAwKSB7CisJICAgIGNmID0gZCAmICgxIDw8IChjbnQgLSAxKSk7CisJICAgIHJlcyA9IChkID4+IGNudCkgfCAoZmlsbCA8PCAoMzIgLSBjbnQpKTsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoY2YsIEZfQ0YpOworCSAgICBzZXRfc3pwX2ZsYWdzXzMyKCh1MzIpcmVzKTsKKwl9IGVsc2UgeworCSAgICByZXMgPSBkOworCX0KKwlpZiAoY250ID09IDEpIHsKKwkgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihyZXMgPj4gMzApLCBGX09GKTsKKwl9IGVsc2UgeworCSAgICBDTEVBUl9GTEFHKEZfT0YpOworCX0KKyAgICB9IGVsc2UgeworCXJlcyA9IDA7CisJQ0xFQVJfRkxBRyhGX0NGKTsKKwlDTEVBUl9GTEFHKEZfT0YpOworCVNFVF9GTEFHKEZfWkYpOworCUNMRUFSX0ZMQUcoRl9TRik7CisJQ0xFQVJfRkxBRyhGX1BGKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBTQkIgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBzYmJfYnl0ZSh1OCBkLCB1OCBzKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisgICAgdTMyIGJjOworCisgICAgaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKQorCXJlcyA9IGQgLSBzIC0gMTsKKyAgICBlbHNlCisJcmVzID0gZCAtIHM7CisgICAgc2V0X3N6cF9mbGFnc184KCh1OClyZXMpOworCisgICAgLyogY2FsY3VsYXRlIHRoZSBib3Jyb3cgY2hhaW4uICBTZWUgbm90ZSBhdCB0b3AgKi8KKyAgICBiYyA9IChyZXMgJiAofmQgfCBzKSkgfCAofmQgJiBzKTsKKyAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4ODAsIEZfQ0YpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoYmMgPj4gNiksIEZfT0YpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4LCBGX0FGKTsKKyAgICByZXR1cm4gKHU4KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBTQkIgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MTYgc2JiX3dvcmQodTE2IGQsIHUxNiBzKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisgICAgdTMyIGJjOworCisgICAgaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKQorCXJlcyA9IGQgLSBzIC0gMTsKKyAgICBlbHNlCisJcmVzID0gZCAtIHM7CisgICAgc2V0X3N6cF9mbGFnc18xNigodTE2KXJlcyk7CisKKyAgICAvKiBjYWxjdWxhdGUgdGhlIGJvcnJvdyBjaGFpbi4gIFNlZSBub3RlIGF0IHRvcCAqLworICAgIGJjID0gKHJlcyAmICh+ZCB8IHMpKSB8ICh+ZCAmIHMpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4MDAwLCBGX0NGKTsKKyAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhYT1IyKGJjID4+IDE0KSwgRl9PRik7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOworICAgIHJldHVybiAodTE2KXJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBTQkIgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgc2JiX2xvbmcodTMyIGQsIHUzMiBzKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisgICAgdTMyIGJjOworCisgICAgaWYgKEFDQ0VTU19GTEFHKEZfQ0YpKQorCXJlcyA9IGQgLSBzIC0gMTsKKyAgICBlbHNlCisJcmVzID0gZCAtIHM7CisKKyAgICBzZXRfc3pwX2ZsYWdzXzMyKHJlcyk7CisKKyAgICAvKiBjYWxjdWxhdGUgdGhlIGJvcnJvdyBjaGFpbi4gIFNlZSBub3RlIGF0IHRvcCAqLworICAgIGJjID0gKHJlcyAmICh+ZCB8IHMpKSB8ICh+ZCAmIHMpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4MDAwMDAwMCwgRl9DRik7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiAzMCksIEZfT0YpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4LCBGX0FGKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFNVQiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IHN1Yl9ieXRlKHU4IGQsIHU4IHMpCit7CisgICAgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKyAgICB1MzIgYmM7CisKKyAgICByZXMgPSBkIC0gczsKKyAgICBzZXRfc3pwX2ZsYWdzXzgoKHU4KXJlcyk7CisKKyAgICAvKiBjYWxjdWxhdGUgdGhlIGJvcnJvdyBjaGFpbi4gIFNlZSBub3RlIGF0IHRvcCAqLworICAgIGJjID0gKHJlcyAmICh+ZCB8IHMpKSB8ICh+ZCAmIHMpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4MCwgRl9DRik7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiA2KSwgRl9PRik7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgsIEZfQUYpOworICAgIHJldHVybiAodTgpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFNVQiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBzdWJfd29yZCh1MTYgZCwgdTE2IHMpCit7CisgICAgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKyAgICB1MzIgYmM7CisKKyAgICByZXMgPSBkIC0gczsKKyAgICBzZXRfc3pwX2ZsYWdzXzE2KCh1MTYpcmVzKTsKKworICAgIC8qIGNhbGN1bGF0ZSB0aGUgYm9ycm93IGNoYWluLiAgU2VlIG5vdGUgYXQgdG9wICovCisgICAgYmMgPSAocmVzICYgKH5kIHwgcykpIHwgKH5kICYgcyk7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoYmMgJiAweDgwMDAsIEZfQ0YpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKFhPUjIoYmMgPj4gMTQpLCBGX09GKTsKKyAgICBDT05ESVRJT05BTF9TRVRfRkxBRyhiYyAmIDB4OCwgRl9BRik7CisgICAgcmV0dXJuICh1MTYpcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFNVQiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBzdWJfbG9uZyh1MzIgZCwgdTMyIHMpCit7CisgICAgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKyAgICB1MzIgYmM7CisKKyAgICByZXMgPSBkIC0gczsKKyAgICBzZXRfc3pwX2ZsYWdzXzMyKHJlcyk7CisKKyAgICAvKiBjYWxjdWxhdGUgdGhlIGJvcnJvdyBjaGFpbi4gIFNlZSBub3RlIGF0IHRvcCAqLworICAgIGJjID0gKHJlcyAmICh+ZCB8IHMpKSB8ICh+ZCAmIHMpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4MDAwMDAwMCwgRl9DRik7CisgICAgQ09ORElUSU9OQUxfU0VUX0ZMQUcoWE9SMihiYyA+PiAzMCksIEZfT0YpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGJjICYgMHg4LCBGX0FGKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFRFU1QgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHRlc3RfYnl0ZSh1OCBkLCB1OCBzKQoreworICAgIHUzMiByZXM7ICAgLyogYWxsIG9wZXJhbmRzIGluIG5hdGl2ZSBtYWNoaW5lIG9yZGVyICovCisKKyAgICByZXMgPSBkICYgczsKKworICAgIENMRUFSX0ZMQUcoRl9PRik7CisgICAgc2V0X3N6cF9mbGFnc184KCh1OClyZXMpOworICAgIC8qIEFGID09IGRvbnQgY2FyZSAqLworICAgIENMRUFSX0ZMQUcoRl9DRik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgVEVTVCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdGVzdF93b3JkKHUxNiBkLCB1MTYgcykKK3sKKyAgICB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCisgICAgcmVzID0gZCAmIHM7CisKKyAgICBDTEVBUl9GTEFHKEZfT0YpOworICAgIHNldF9zenBfZmxhZ3NfMTYoKHUxNilyZXMpOworICAgIC8qIEFGID09IGRvbnQgY2FyZSAqLworICAgIENMRUFSX0ZMQUcoRl9DRik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgVEVTVCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdGVzdF9sb25nKHUzMiBkLCB1MzIgcykKK3sKKyAgICB1MzIgcmVzOyAgIC8qIGFsbCBvcGVyYW5kcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlciAqLworCisgICAgcmVzID0gZCAmIHM7CisKKyAgICBDTEVBUl9GTEFHKEZfT0YpOworICAgIHNldF9zenBfZmxhZ3NfMzIocmVzKTsKKyAgICAvKiBBRiA9PSBkb250IGNhcmUgKi8KKyAgICBDTEVBUl9GTEFHKEZfQ0YpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFhPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IHhvcl9ieXRlKHU4IGQsIHU4IHMpCit7CisgICAgdTggcmVzOyAgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgXiBzOworICAgIG5vX2NhcnJ5X2J5dGVfc2lkZV9lZmYocmVzKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFhPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiB4b3Jfd29yZCh1MTYgZCwgdTE2IHMpCit7CisgICAgdTE2IHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgXiBzOworICAgIG5vX2NhcnJ5X3dvcmRfc2lkZV9lZmYocmVzKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIFhPUiBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiB4b3JfbG9uZyh1MzIgZCwgdTMyIHMpCit7CisgICAgdTMyIHJlczsgICAvKiBhbGwgb3BlcmFuZHMgaW4gbmF0aXZlIG1hY2hpbmUgb3JkZXIgKi8KKworICAgIHJlcyA9IGQgXiBzOworICAgIG5vX2NhcnJ5X2xvbmdfc2lkZV9lZmYocmVzKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIElNVUwgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGltdWxfYnl0ZSh1OCBzKQoreworICAgIHMxNiByZXMgPSAoczE2KSgoczgpTS54ODYuUl9BTCAqIChzOClzKTsKKworICAgIE0ueDg2LlJfQVggPSByZXM7CisgICAgaWYgKCgoTS54ODYuUl9BTCAmIDB4ODApID09IDAgJiYgTS54ODYuUl9BSCA9PSAweDAwKSB8fAorCSgoTS54ODYuUl9BTCAmIDB4ODApICE9IDAgJiYgTS54ODYuUl9BSCA9PSAweEZGKSkgeworCUNMRUFSX0ZMQUcoRl9DRik7CisJQ0xFQVJfRkxBRyhGX09GKTsKKyAgICB9IGVsc2UgeworCVNFVF9GTEFHKEZfQ0YpOworCVNFVF9GTEFHKEZfT0YpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBJTVVMIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBpbXVsX3dvcmQodTE2IHMpCit7CisgICAgczMyIHJlcyA9IChzMTYpTS54ODYuUl9BWCAqIChzMTYpczsKKworICAgIE0ueDg2LlJfQVggPSAodTE2KXJlczsKKyAgICBNLng4Ni5SX0RYID0gKHUxNikocmVzID4+IDE2KTsKKyAgICBpZiAoKChNLng4Ni5SX0FYICYgMHg4MDAwKSA9PSAwICYmIE0ueDg2LlJfRFggPT0gMHgwMDAwKSB8fAorCSgoTS54ODYuUl9BWCAmIDB4ODAwMCkgIT0gMCAmJiBNLng4Ni5SX0RYID09IDB4RkZGRikpIHsKKwlDTEVBUl9GTEFHKEZfQ0YpOworCUNMRUFSX0ZMQUcoRl9PRik7CisgICAgfSBlbHNlIHsKKwlTRVRfRkxBRyhGX0NGKTsKKwlTRVRfRkxBRyhGX09GKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgSU1VTCBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaW11bF9sb25nX2RpcmVjdCh1MzIgKnJlc19sbywgdTMyKiByZXNfaGksdTMyIGQsIHUzMiBzKQoreworI2lmZGVmCV9fSEFTX0xPTkdfTE9OR19fCisgICAgczY0IHJlcyA9IChzMzIpZCAqIChzMzIpczsKKworICAgICpyZXNfbG8gPSAodTMyKXJlczsKKyAgICAqcmVzX2hpID0gKHUzMikocmVzID4+IDMyKTsKKyNlbHNlCisgICAgdTMyIGRfbG8sZF9oaSxkX3NpZ247CisgICAgdTMyIHNfbG8sc19oaSxzX3NpZ247CisgICAgdTMyIHJsb19sbyxybG9faGkscmhpX2xvOworCisgICAgaWYgKChkX3NpZ24gPSBkICYgMHg4MDAwMDAwMCkgIT0gMCkKKwlkID0gLWQ7CisgICAgZF9sbyA9IGQgJiAweEZGRkY7CisgICAgZF9oaSA9IGQgPj4gMTY7CisgICAgaWYgKChzX3NpZ24gPSBzICYgMHg4MDAwMDAwMCkgIT0gMCkKKwlzID0gLXM7CisgICAgc19sbyA9IHMgJiAweEZGRkY7CisgICAgc19oaSA9IHMgPj4gMTY7CisgICAgcmxvX2xvID0gZF9sbyAqIHNfbG87CisgICAgcmxvX2hpID0gKGRfaGkgKiBzX2xvICsgZF9sbyAqIHNfaGkpICsgKHJsb19sbyA+PiAxNik7CisgICAgcmhpX2xvID0gZF9oaSAqIHNfaGkgKyAocmxvX2hpID4+IDE2KTsKKyAgICAqcmVzX2xvID0gKHJsb19oaSA8PCAxNikgfCAocmxvX2xvICYgMHhGRkZGKTsKKyAgICAqcmVzX2hpID0gcmhpX2xvOworICAgIGlmIChkX3NpZ24gIT0gc19zaWduKSB7CisJZCA9IH4qcmVzX2xvOworCXMgPSAoKChkICYgMHhGRkZGKSArIDEpID4+IDE2KSArIChkID4+IDE2KTsKKwkqcmVzX2xvID0gfipyZXNfbG8rMTsKKwkqcmVzX2hpID0gfipyZXNfaGkrKHMgPj4gMTYpOworCX0KKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIElNVUwgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGltdWxfbG9uZyh1MzIgcykKK3sKKyAgICBpbXVsX2xvbmdfZGlyZWN0KCZNLng4Ni5SX0VBWCwmTS54ODYuUl9FRFgsTS54ODYuUl9FQVgscyk7CisgICAgaWYgKCgoTS54ODYuUl9FQVggJiAweDgwMDAwMDAwKSA9PSAwICYmIE0ueDg2LlJfRURYID09IDB4MDAwMDAwMDApIHx8CisJKChNLng4Ni5SX0VBWCAmIDB4ODAwMDAwMDApICE9IDAgJiYgTS54ODYuUl9FRFggPT0gMHhGRkZGRkZGRikpIHsKKwlDTEVBUl9GTEFHKEZfQ0YpOworCUNMRUFSX0ZMQUcoRl9PRik7CisgICAgfSBlbHNlIHsKKwlTRVRfRkxBRyhGX0NGKTsKKwlTRVRfRkxBRyhGX09GKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgTVVMIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBtdWxfYnl0ZSh1OCBzKQoreworICAgIHUxNiByZXMgPSAodTE2KShNLng4Ni5SX0FMICogcyk7CisKKyAgICBNLng4Ni5SX0FYID0gcmVzOworICAgIGlmIChNLng4Ni5SX0FIID09IDApIHsKKwlDTEVBUl9GTEFHKEZfQ0YpOworCUNMRUFSX0ZMQUcoRl9PRik7CisgICAgfSBlbHNlIHsKKwlTRVRfRkxBRyhGX0NGKTsKKwlTRVRfRkxBRyhGX09GKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgTVVMIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBtdWxfd29yZCh1MTYgcykKK3sKKyAgICB1MzIgcmVzID0gTS54ODYuUl9BWCAqIHM7CisKKyAgICBNLng4Ni5SX0FYID0gKHUxNilyZXM7CisgICAgTS54ODYuUl9EWCA9ICh1MTYpKHJlcyA+PiAxNik7CisgICAgaWYgKE0ueDg2LlJfRFggPT0gMCkgeworCUNMRUFSX0ZMQUcoRl9DRik7CisJQ0xFQVJfRkxBRyhGX09GKTsKKyAgICB9IGVsc2UgeworCVNFVF9GTEFHKEZfQ0YpOworCVNFVF9GTEFHKEZfT0YpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBNVUwgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIG11bF9sb25nKHUzMiBzKQoreworI2lmZGVmCV9fSEFTX0xPTkdfTE9OR19fCisgICAgdTY0IHJlcyA9ICh1MzIpTS54ODYuUl9FQVggKiAodTMyKXM7CisKKyAgICBNLng4Ni5SX0VBWCA9ICh1MzIpcmVzOworICAgIE0ueDg2LlJfRURYID0gKHUzMikocmVzID4+IDMyKTsKKyNlbHNlCisgICAgdTMyIGEsYV9sbyxhX2hpOworICAgIHUzMiBzX2xvLHNfaGk7CisgICAgdTMyIHJsb19sbyxybG9faGkscmhpX2xvOworCisgICAgYSA9IE0ueDg2LlJfRUFYOworICAgIGFfbG8gPSBhICYgMHhGRkZGOworICAgIGFfaGkgPSBhID4+IDE2OworICAgIHNfbG8gPSBzICYgMHhGRkZGOworICAgIHNfaGkgPSBzID4+IDE2OworICAgIHJsb19sbyA9IGFfbG8gKiBzX2xvOworICAgIHJsb19oaSA9IChhX2hpICogc19sbyArIGFfbG8gKiBzX2hpKSArIChybG9fbG8gPj4gMTYpOworICAgIHJoaV9sbyA9IGFfaGkgKiBzX2hpICsgKHJsb19oaSA+PiAxNik7CisgICAgTS54ODYuUl9FQVggPSAocmxvX2hpIDw8IDE2KSB8IChybG9fbG8gJiAweEZGRkYpOworICAgIE0ueDg2LlJfRURYID0gcmhpX2xvOworI2VuZGlmCisgICAgaWYgKE0ueDg2LlJfRURYID09IDApIHsKKwlDTEVBUl9GTEFHKEZfQ0YpOworCUNMRUFSX0ZMQUcoRl9PRik7CisgICAgfSBlbHNlIHsKKwlTRVRfRkxBRyhGX0NGKTsKKwlTRVRfRkxBRyhGX09GKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgSURJViBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaWRpdl9ieXRlKHU4IHMpCit7CisgICAgczMyIGR2ZCwgZGl2LCBtb2Q7CisKKyAgICBkdmQgPSAoczE2KU0ueDg2LlJfQVg7CisgICAgaWYgKHMgPT0gMCkgeworCXg4NmVtdV9pbnRyX3JhaXNlKDApOworCXJldHVybjsKKyAgICB9CisgICAgZGl2ID0gZHZkIC8gKHM4KXM7CisgICAgbW9kID0gZHZkICUgKHM4KXM7CisgICAgaWYgKGFicyhkaXYpID4gMHg3ZikgeworCXg4NmVtdV9pbnRyX3JhaXNlKDApOworCXJldHVybjsKKyAgICB9CisgICAgTS54ODYuUl9BTCA9IChzOCkgZGl2OworICAgIE0ueDg2LlJfQUggPSAoczgpIG1vZDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBJRElWIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBpZGl2X3dvcmQodTE2IHMpCit7CisgICAgczMyIGR2ZCwgZGl2LCBtb2Q7CisKKyAgICBkdmQgPSAoKChzMzIpTS54ODYuUl9EWCkgPDwgMTYpIHwgTS54ODYuUl9BWDsKKyAgICBpZiAocyA9PSAwKSB7CisJeDg2ZW11X2ludHJfcmFpc2UoMCk7CisJcmV0dXJuOworICAgIH0KKyAgICBkaXYgPSBkdmQgLyAoczE2KXM7CisgICAgbW9kID0gZHZkICUgKHMxNilzOworICAgIGlmIChhYnMoZGl2KSA+IDB4N2ZmZikgeworCXg4NmVtdV9pbnRyX3JhaXNlKDApOworCXJldHVybjsKKyAgICB9CisgICAgQ0xFQVJfRkxBRyhGX0NGKTsKKyAgICBDTEVBUl9GTEFHKEZfU0YpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGRpdiA9PSAwLCBGX1pGKTsKKyAgICBzZXRfcGFyaXR5X2ZsYWcobW9kKTsKKworICAgIE0ueDg2LlJfQVggPSAodTE2KWRpdjsKKyAgICBNLng4Ni5SX0RYID0gKHUxNiltb2Q7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgSURJViBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaWRpdl9sb25nKHUzMiBzKQoreworI2lmZGVmCV9fSEFTX0xPTkdfTE9OR19fCisgICAgczY0IGR2ZCwgZGl2LCBtb2Q7CisKKyAgICBkdmQgPSAoKChzNjQpTS54ODYuUl9FRFgpIDw8IDMyKSB8IE0ueDg2LlJfRUFYOworICAgIGlmIChzID09IDApIHsKKwl4ODZlbXVfaW50cl9yYWlzZSgwKTsKKwlyZXR1cm47CisgICAgfQorICAgIGRpdiA9IGR2ZCAvIChzMzIpczsKKyAgICBtb2QgPSBkdmQgJSAoczMyKXM7CisgICAgaWYgKGFicyhkaXYpID4gMHg3ZmZmZmZmZikgeworCXg4NmVtdV9pbnRyX3JhaXNlKDApOworCXJldHVybjsKKyAgICB9CisjZWxzZQorICAgIHMzMiBkaXYgPSAwLCBtb2Q7CisgICAgczMyIGhfZHZkID0gTS54ODYuUl9FRFg7CisgICAgdTMyIGxfZHZkID0gTS54ODYuUl9FQVg7CisgICAgdTMyIGFic19zID0gcyAmIDB4N0ZGRkZGRkY7CisgICAgdTMyIGFic19oX2R2ZCA9IGhfZHZkICYgMHg3RkZGRkZGRjsKKyAgICB1MzIgaF9zID0gYWJzX3MgPj4gMTsKKyAgICB1MzIgbF9zID0gYWJzX3MgPDwgMzE7CisgICAgaW50IGNvdW50ZXIgPSAzMTsKKyAgICBpbnQgY2Fycnk7CisKKyAgICBpZiAocyA9PSAwKSB7CisJeDg2ZW11X2ludHJfcmFpc2UoMCk7CisJcmV0dXJuOworICAgIH0KKyAgICBkbyB7CisJZGl2IDw8PSAxOworCWNhcnJ5ID0gKGxfZHZkID49IGxfcykgPyAwIDogMTsKKworCWlmIChhYnNfaF9kdmQgPCAoaF9zICsgY2FycnkpKSB7CisJICAgIGhfcyA+Pj0gMTsKKwkgICAgbF9zID0gYWJzX3MgPDwgKC0tY291bnRlcik7CisJICAgIGNvbnRpbnVlOworCX0gZWxzZSB7CisJICAgIGFic19oX2R2ZCAtPSAoaF9zICsgY2FycnkpOworCSAgICBsX2R2ZCA9IGNhcnJ5ID8gKCgweEZGRkZGRkZGIC0gbF9zKSArIGxfZHZkICsgMSkKKwkJOiAobF9kdmQgLSBsX3MpOworCSAgICBoX3MgPj49IDE7CisJICAgIGxfcyA9IGFic19zIDw8ICgtLWNvdW50ZXIpOworCSAgICBkaXYgfD0gMTsKKwkgICAgY29udGludWU7CisJfQorCisgICAgfSB3aGlsZSAoY291bnRlciA+IC0xKTsKKyAgICAvKiBvdmVyZmxvdyAqLworICAgIGlmIChhYnNfaF9kdmQgfHwgKGxfZHZkID4gYWJzX3MpKSB7CisJeDg2ZW11X2ludHJfcmFpc2UoMCk7CisJcmV0dXJuOworICAgIH0KKyAgICAvKiBzaWduICovCisgICAgZGl2IHw9ICgoaF9kdmQgJiAweDEwMDAwMDAwKSBeIChzICYgMHgxMDAwMDAwMCkpOworICAgIG1vZCA9IGxfZHZkOworCisjZW5kaWYKKyAgICBDTEVBUl9GTEFHKEZfQ0YpOworICAgIENMRUFSX0ZMQUcoRl9BRik7CisgICAgQ0xFQVJfRkxBRyhGX1NGKTsKKyAgICBTRVRfRkxBRyhGX1pGKTsKKyAgICBzZXRfcGFyaXR5X2ZsYWcobW9kKTsKKworICAgIE0ueDg2LlJfRUFYID0gKHUzMilkaXY7CisgICAgTS54ODYuUl9FRFggPSAodTMyKW1vZDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitJbXBsZW1lbnRzIHRoZSBESVYgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGRpdl9ieXRlKHU4IHMpCit7CisgICAgdTMyIGR2ZCwgZGl2LCBtb2Q7CisKKyAgICBkdmQgPSBNLng4Ni5SX0FYOworICAgIGlmIChzID09IDApIHsKKwl4ODZlbXVfaW50cl9yYWlzZSgwKTsKKwlyZXR1cm47CisgICAgfQorICAgIGRpdiA9IGR2ZCAvICh1OClzOworICAgIG1vZCA9IGR2ZCAlICh1OClzOworICAgIGlmIChhYnMoZGl2KSA+IDB4ZmYpIHsKKwl4ODZlbXVfaW50cl9yYWlzZSgwKTsKKwlyZXR1cm47CisgICAgfQorICAgIE0ueDg2LlJfQUwgPSAodTgpZGl2OworICAgIE0ueDg2LlJfQUggPSAodTgpbW9kOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIERJViBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgZGl2X3dvcmQodTE2IHMpCit7CisgICAgdTMyIGR2ZCwgZGl2LCBtb2Q7CisKKyAgICBkdmQgPSAoKCh1MzIpTS54ODYuUl9EWCkgPDwgMTYpIHwgTS54ODYuUl9BWDsKKyAgICBpZiAocyA9PSAwKSB7CisJeDg2ZW11X2ludHJfcmFpc2UoMCk7CisJcmV0dXJuOworICAgIH0KKyAgICBkaXYgPSBkdmQgLyAodTE2KXM7CisgICAgbW9kID0gZHZkICUgKHUxNilzOworICAgIGlmIChhYnMoZGl2KSA+IDB4ZmZmZikgeworCXg4NmVtdV9pbnRyX3JhaXNlKDApOworCXJldHVybjsKKyAgICB9CisgICAgQ0xFQVJfRkxBRyhGX0NGKTsKKyAgICBDTEVBUl9GTEFHKEZfU0YpOworICAgIENPTkRJVElPTkFMX1NFVF9GTEFHKGRpdiA9PSAwLCBGX1pGKTsKKyAgICBzZXRfcGFyaXR5X2ZsYWcobW9kKTsKKworICAgIE0ueDg2LlJfQVggPSAodTE2KWRpdjsKKyAgICBNLng4Ni5SX0RYID0gKHUxNiltb2Q7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorSW1wbGVtZW50cyB0aGUgRElWIGluc3RydWN0aW9uIGFuZCBzaWRlIGVmZmVjdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBkaXZfbG9uZyh1MzIgcykKK3sKKyNpZmRlZglfX0hBU19MT05HX0xPTkdfXworICAgIHU2NCBkdmQsIGRpdiwgbW9kOworCisgICAgZHZkID0gKCgodTY0KU0ueDg2LlJfRURYKSA8PCAzMikgfCBNLng4Ni5SX0VBWDsKKyAgICBpZiAocyA9PSAwKSB7CisJeDg2ZW11X2ludHJfcmFpc2UoMCk7CisJcmV0dXJuOworICAgIH0KKyAgICBkaXYgPSBkdmQgLyAodTMyKXM7CisgICAgbW9kID0gZHZkICUgKHUzMilzOworICAgIGlmIChhYnMoZGl2KSA+IDB4ZmZmZmZmZmYpIHsKKwl4ODZlbXVfaW50cl9yYWlzZSgwKTsKKwlyZXR1cm47CisgICAgfQorI2Vsc2UKKyAgICBzMzIgZGl2ID0gMCwgbW9kOworICAgIHMzMiBoX2R2ZCA9IE0ueDg2LlJfRURYOworICAgIHUzMiBsX2R2ZCA9IE0ueDg2LlJfRUFYOworCisgICAgdTMyIGhfcyA9IHM7CisgICAgdTMyIGxfcyA9IDA7CisgICAgaW50IGNvdW50ZXIgPSAzMjsKKyAgICBpbnQgY2Fycnk7CisKKyAgICBpZiAocyA9PSAwKSB7CisJeDg2ZW11X2ludHJfcmFpc2UoMCk7CisJcmV0dXJuOworICAgIH0KKyAgICBkbyB7CisJZGl2IDw8PSAxOworCWNhcnJ5ID0gKGxfZHZkID49IGxfcykgPyAwIDogMTsKKworCWlmIChoX2R2ZCA8IChoX3MgKyBjYXJyeSkpIHsKKwkgICAgaF9zID4+PSAxOworCSAgICBsX3MgPSBzIDw8ICgtLWNvdW50ZXIpOworCSAgICBjb250aW51ZTsKKwl9IGVsc2UgeworCSAgICBoX2R2ZCAtPSAoaF9zICsgY2FycnkpOworCSAgICBsX2R2ZCA9IGNhcnJ5ID8gKCgweEZGRkZGRkZGIC0gbF9zKSArIGxfZHZkICsgMSkKKwkJOiAobF9kdmQgLSBsX3MpOworCSAgICBoX3MgPj49IDE7CisJICAgIGxfcyA9IHMgPDwgKC0tY291bnRlcik7CisJICAgIGRpdiB8PSAxOworCSAgICBjb250aW51ZTsKKwl9CisKKyAgICB9IHdoaWxlIChjb3VudGVyID4gLTEpOworICAgIC8qIG92ZXJmbG93ICovCisgICAgaWYgKGhfZHZkIHx8IChsX2R2ZCA+IHMpKSB7CisJeDg2ZW11X2ludHJfcmFpc2UoMCk7CisJcmV0dXJuOworICAgIH0KKyAgICBtb2QgPSBsX2R2ZDsKKyNlbmRpZgorICAgIENMRUFSX0ZMQUcoRl9DRik7CisgICAgQ0xFQVJfRkxBRyhGX0FGKTsKKyAgICBDTEVBUl9GTEFHKEZfU0YpOworICAgIFNFVF9GTEFHKEZfWkYpOworICAgIHNldF9wYXJpdHlfZmxhZyhtb2QpOworCisgICAgTS54ODYuUl9FQVggPSAodTMyKWRpdjsKKyAgICBNLng4Ni5SX0VEWCA9ICh1MzIpbW9kOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIElOIHN0cmluZyBpbnN0cnVjdGlvbiBhbmQgc2lkZSBlZmZlY3RzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgc2luZ2xlX2luKGludCBzaXplKQoreworICAgIGlmKHNpemUgPT0gMSkKKwlzdG9yZV9kYXRhX2J5dGVfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfREksKCpzeXNfaW5iKShNLng4Ni5SX0RYKSk7CisgICAgZWxzZSBpZiAoc2l6ZSA9PSAyKQorCXN0b3JlX2RhdGFfd29yZF9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9ESSwoKnN5c19pbncpKE0ueDg2LlJfRFgpKTsKKyAgICBlbHNlCisJc3RvcmVfZGF0YV9sb25nX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX0RJLCgqc3lzX2lubCkoTS54ODYuUl9EWCkpOworfQorCit2b2lkIGlucyhpbnQgc2l6ZSkKK3sKKyAgICBpbnQgaW5jID0gc2l6ZTsKKworICAgIGlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgeworCWluYyA9IC1zaXplOworICAgIH0KKyAgICBpZiAoTS54ODYubW9kZSAmIChTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpKSB7CisJLyogZG9udCBjYXJlIHdoZXRoZXIgUkVQRSBvciBSRVBORSAqLworCS8qIGluIHVudGlsIENYIGlzIFpFUk8uICovCisJdTMyIGNvdW50ID0gKChNLng4Ni5tb2RlICYgU1lTTU9ERV9QUkVGSVhfREFUQSkgPworCQkgICAgIE0ueDg2LlJfRUNYIDogTS54ODYuUl9DWCk7CisKKwl3aGlsZSAoY291bnQtLSkgeworCSAgc2luZ2xlX2luKHNpemUpOworCSAgTS54ODYuUl9ESSArPSBpbmM7CisJICB9CisJTS54ODYuUl9DWCA9IDA7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIE0ueDg2LlJfRUNYID0gMDsKKwl9CisJTS54ODYubW9kZSAmPSB+KFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSk7CisgICAgfSBlbHNlIHsKKwlzaW5nbGVfaW4oc2l6ZSk7CisJTS54ODYuUl9ESSArPSBpbmM7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK0ltcGxlbWVudHMgdGhlIE9VVCBzdHJpbmcgaW5zdHJ1Y3Rpb24gYW5kIHNpZGUgZWZmZWN0cy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHNpbmdsZV9vdXQoaW50IHNpemUpCit7CisgICAgIGlmKHNpemUgPT0gMSkKKyAgICAgICAoKnN5c19vdXRiKShNLng4Ni5SX0RYLGZldGNoX2RhdGFfYnl0ZV9hYnMoTS54ODYuUl9FUywgTS54ODYuUl9TSSkpOworICAgICBlbHNlIGlmIChzaXplID09IDIpCisgICAgICAgKCpzeXNfb3V0dykoTS54ODYuUl9EWCxmZXRjaF9kYXRhX3dvcmRfYWJzKE0ueDg2LlJfRVMsIE0ueDg2LlJfU0kpKTsKKyAgICAgZWxzZQorICAgICAgICgqc3lzX291dGwpKE0ueDg2LlJfRFgsZmV0Y2hfZGF0YV9sb25nX2FicyhNLng4Ni5SX0VTLCBNLng4Ni5SX1NJKSk7Cit9CisKK3ZvaWQgb3V0cyhpbnQgc2l6ZSkKK3sKKyAgICBpbnQgaW5jID0gc2l6ZTsKKworICAgIGlmIChBQ0NFU1NfRkxBRyhGX0RGKSkgeworCWluYyA9IC1zaXplOworICAgIH0KKyAgICBpZiAoTS54ODYubW9kZSAmIChTWVNNT0RFX1BSRUZJWF9SRVBFIHwgU1lTTU9ERV9QUkVGSVhfUkVQTkUpKSB7CisJLyogZG9udCBjYXJlIHdoZXRoZXIgUkVQRSBvciBSRVBORSAqLworCS8qIG91dCB1bnRpbCBDWCBpcyBaRVJPLiAqLworCXUzMiBjb3VudCA9ICgoTS54ODYubW9kZSAmIFNZU01PREVfUFJFRklYX0RBVEEpID8KKwkJICAgICBNLng4Ni5SX0VDWCA6IE0ueDg2LlJfQ1gpOworCXdoaWxlIChjb3VudC0tKSB7CisJICBzaW5nbGVfb3V0KHNpemUpOworCSAgTS54ODYuUl9TSSArPSBpbmM7CisJICB9CisJTS54ODYuUl9DWCA9IDA7CisJaWYgKE0ueDg2Lm1vZGUgJiBTWVNNT0RFX1BSRUZJWF9EQVRBKSB7CisJICAgIE0ueDg2LlJfRUNYID0gMDsKKwl9CisJTS54ODYubW9kZSAmPSB+KFNZU01PREVfUFJFRklYX1JFUEUgfCBTWVNNT0RFX1BSRUZJWF9SRVBORSk7CisgICAgfSBlbHNlIHsKKwlzaW5nbGVfb3V0KHNpemUpOworCU0ueDg2LlJfU0kgKz0gaW5jOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CithZGRyCS0gQWRkcmVzcyB0byBmZXRjaCB3b3JkIGZyb20KKworUkVNQVJLUzoKK0ZldGNoZXMgYSB3b3JkIGZyb20gZW11bGF0b3IgbWVtb3J5IHVzaW5nIGFuIGFic29sdXRlIGFkZHJlc3MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTE2IG1lbV9hY2Nlc3Nfd29yZChpbnQgYWRkcikKK3sKK0RCKCBpZiAoQ0hFQ0tfTUVNX0FDQ0VTUygpKQorICAgICAgeDg2ZW11X2NoZWNrX21lbV9hY2Nlc3MoYWRkcik7KQorICAgIHJldHVybiAoKnN5c19yZHcpKGFkZHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUkVNQVJLUzoKK1B1c2hlcyBhIHdvcmQgb250byB0aGUgc3RhY2suCisKK05PVEU6IERvIG5vdCBpbmxpbmUgdGhpcywgYXMgKCpzeXNfd3JYKSBpcyBhbHJlYWR5IGlubGluZSEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHB1c2hfd29yZCh1MTYgdykKK3sKK0RCKCBpZiAoQ0hFQ0tfU1BfQUNDRVNTKCkpCisgICAgICB4ODZlbXVfY2hlY2tfc3BfYWNjZXNzKCk7KQorICAgIE0ueDg2LlJfU1AgLT0gMjsKKyAgICAoKnN5c193cncpKCgodTMyKU0ueDg2LlJfU1MgPDwgNCkgICsgTS54ODYuUl9TUCwgdyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSRU1BUktTOgorUHVzaGVzIGEgbG9uZyBvbnRvIHRoZSBzdGFjay4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzLCBhcyAoKnN5c193clgpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcHVzaF9sb25nKHUzMiB3KQoreworREIoIGlmIChDSEVDS19TUF9BQ0NFU1MoKSkKKyAgICAgIHg4NmVtdV9jaGVja19zcF9hY2Nlc3MoKTspCisgICAgTS54ODYuUl9TUCAtPSA0OworICAgICgqc3lzX3dybCkoKCh1MzIpTS54ODYuUl9TUyA8PCA0KSAgKyBNLng4Ni5SX1NQLCB3KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitQb3BzIGEgd29yZCBmcm9tIHRoZSBzdGFjay4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzLCBhcyAoKnN5c19yZFgpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBwb3Bfd29yZCh2b2lkKQoreworICAgIHUxNiByZXM7CisKK0RCKCBpZiAoQ0hFQ0tfU1BfQUNDRVNTKCkpCisgICAgICB4ODZlbXVfY2hlY2tfc3BfYWNjZXNzKCk7KQorICAgIHJlcyA9ICgqc3lzX3JkdykoKCh1MzIpTS54ODYuUl9TUyA8PCA0KSAgKyBNLng4Ni5SX1NQKTsKKyAgICBNLng4Ni5SX1NQICs9IDI7CisgICAgcmV0dXJuIHJlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1JFTUFSS1M6CitQb3BzIGEgbG9uZyBmcm9tIHRoZSBzdGFjay4KKworTk9URTogRG8gbm90IGlubGluZSB0aGlzLCBhcyAoKnN5c19yZFgpIGlzIGFscmVhZHkgaW5saW5lIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBwb3BfbG9uZyh2b2lkKQoreworICAgIHUzMiByZXM7CisKK0RCKCBpZiAoQ0hFQ0tfU1BfQUNDRVNTKCkpCisgICAgICB4ODZlbXVfY2hlY2tfc3BfYWNjZXNzKCk7KQorICAgIHJlcyA9ICgqc3lzX3JkbCkoKCh1MzIpTS54ODYuUl9TUyA8PCA0KSAgKyBNLng4Ni5SX1NQKTsKKyAgICBNLng4Ni5SX1NQICs9IDQ7CisgICAgcmV0dXJuIHJlczsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jpb3NfZW11bGF0b3IveDg2ZW11L3N5cy5jIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL3g4NmVtdS9zeXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjYzODlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iaW9zX2VtdWxhdG9yL3g4NmVtdS9zeXMuYwpAQCAtMCwwICsxLDMyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICAgICAgICAgIFJlYWxtb2RlIFg4NiBFbXVsYXRvciBMaWJyYXJ5CisqCisqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLTIwMDQgU2NpVGVjaCBTb2Z0d2FyZSwgSW5jLgorKiAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSBEYXZpZCBNb3NiZXJnZXItVGFuZworKiAgICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgRWdiZXJ0IEVpY2gKKyoKKyogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKgorKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQKKyogIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyogIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyogIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorKiAgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBub3QgYmUgdXNlZAorKiAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorKiAgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhlIGF1dGhvcnMgbWFrZXMgbm8KKyogIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuCisqICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorKgorKiAgVEhFIEFVVEhPUlMgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisqICBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisqICBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorKiAgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCisqICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCisqICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorKgorKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqCisqIExhbmd1YWdlOiAgICAgQU5TSSBDCisqIEVudmlyb25tZW50OiAgQW55CisqIERldmVsb3BlcjogICAgS2VuZGFsbCBCZW5uZXR0CisqCisqIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGluY2x1ZGVzIHN1YnJvdXRpbmVzIHdoaWNoIGFyZSByZWxhdGVkIHRvCisqICAgICAgICAgICAgICAgcHJvZ3JhbW1lZCBJL08gYW5kIG1lbW9yeSBhY2Nlc3MuIEluY2x1ZGVkIGluIHRoaXMgbW9kdWxlCisqICAgICAgICAgICAgICAgYXJlIGRlZmF1bHQgZnVuY3Rpb25zIHRoYXQgZG8gbm90aGluZy4gRm9yIHJlYWwgdXNlcyB0aGVzZQorKiAgICAgICAgICAgICAgIGZ1bmN0aW9ucyB3aWxsIGhhdmUgdG8gYmUgb3ZlcnJpZGVuIGJ5IHRoZSB1c2VyIGxpYnJhcnkuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAieDg2ZW11L3g4NmVtdWkuaCIKKworI2lmIGRlZmluZWQoQ09ORklHX0JJT1NFTVUpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK1g4NkVNVV9zeXNFbnYgX1g4NkVNVV9lbnY7CS8qIEdsb2JhbCBlbXVsYXRvciBtYWNoaW5lIHN0YXRlICovCitYODZFTVVfaW50ckZ1bmNzIF9YODZFTVVfaW50clRhYlsyNTZdOworCitpbnQgZGVidWdfaW50cjsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CithZGRyICAgIC0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAorCitSRVRVUk5TOgorQnl0ZSB2YWx1ZSByZWFkIGZyb20gZW11bGF0b3IgbWVtb3J5LgorCitSRU1BUktTOgorUmVhZHMgYSBieXRlIHZhbHVlIGZyb20gdGhlIGVtdWxhdG9yIG1lbW9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBYODZBUEkgcmRiKHUzMiBhZGRyKQoreworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIgICAgLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCisKK1JFVFVSTlM6CitXb3JkIHZhbHVlIHJlYWQgZnJvbSBlbXVsYXRvciBtZW1vcnkuCisKK1JFTUFSS1M6CitSZWFkcyBhIHdvcmQgdmFsdWUgZnJvbSB0aGUgZW11bGF0b3IgbWVtb3J5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiBYODZBUEkgcmR3KHUzMiBhZGRyKQoreworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIgICAgLSBFbXVsYXRvciBtZW1vcnkgYWRkcmVzcyB0byByZWFkCisKK1JFVFVSTlM6CitMb25nIHZhbHVlIHJlYWQgZnJvbSBlbXVsYXRvciBtZW1vcnkuCitSRU1BUktTOgorUmVhZHMgYSBsb25nIHZhbHVlIGZyb20gdGhlIGVtdWxhdG9yIG1lbW9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgWDg2QVBJIHJkbCh1MzIgYWRkcikKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CithZGRyICAgIC0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAordmFsICAgICAtIFZhbHVlIHRvIHN0b3JlCisKK1JFTUFSS1M6CitXcml0ZXMgYSBieXRlIHZhbHVlIHRvIGVtdWxhdG9yIG1lbW9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFg4NkFQSSB3cmIodTMyIGFkZHIsIHU4IHZhbCkKK3sKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CithZGRyICAgIC0gRW11bGF0b3IgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAordmFsICAgICAtIFZhbHVlIHRvIHN0b3JlCisKK1JFTUFSS1M6CitXcml0ZXMgYSB3b3JkIHZhbHVlIHRvIGVtdWxhdG9yIG1lbW9yeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFg4NkFQSSB3cncodTMyIGFkZHIsIHUxNiB2YWwpCit7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYWRkciAgICAtIEVtdWxhdG9yIG1lbW9yeSBhZGRyZXNzIHRvIHJlYWQKK3ZhbCAgICAgLSBWYWx1ZSB0byBzdG9yZQorCitSRU1BUktTOgorV3JpdGVzIGEgbG9uZyB2YWx1ZSB0byBlbXVsYXRvciBtZW1vcnkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBYODZBUEkgd3JsKHUzMiBhZGRyLCB1MzIgdmFsKQoreworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIgICAgLSBQSU8gYWRkcmVzcyB0byByZWFkCitSRVRVUk46CiswCitSRU1BUktTOgorRGVmYXVsdCBQSU8gYnl0ZSByZWFkIGZ1bmN0aW9uLiBEb2Vzbid0IHBlcmZvcm0gcmVhbCBpbmIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHU4IFg4NkFQSSBwX2luYihYODZFTVVfcGlvQWRkciBhZGRyKQoreworCURCKGlmIChERUJVR19JT19UUkFDRSgpKQorCSAgIHByaW50aygiaW5iICUjMDR4IFxuIiwgYWRkcik7KQorCQlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CithZGRyICAgIC0gUElPIGFkZHJlc3MgdG8gcmVhZAorUkVUVVJOOgorMAorUkVNQVJLUzoKK0RlZmF1bHQgUElPIHdvcmQgcmVhZCBmdW5jdGlvbi4gRG9lc24ndCBwZXJmb3JtIHJlYWwgaW53LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1MTYgWDg2QVBJIHBfaW53KFg4NkVNVV9waW9BZGRyIGFkZHIpCit7CisJREIoaWYgKERFQlVHX0lPX1RSQUNFKCkpCisJICAgcHJpbnRrKCJpbncgJSMwNHggXG4iLCBhZGRyKTspCisJCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIgICAgLSBQSU8gYWRkcmVzcyB0byByZWFkCitSRVRVUk46CiswCitSRU1BUktTOgorRGVmYXVsdCBQSU8gbG9uZyByZWFkIGZ1bmN0aW9uLiBEb2Vzbid0IHBlcmZvcm0gcmVhbCBpbmwuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHUzMiBYODZBUEkgcF9pbmwoWDg2RU1VX3Bpb0FkZHIgYWRkcikKK3sKKwlEQihpZiAoREVCVUdfSU9fVFJBQ0UoKSkKKwkgICBwcmludGsoImlubCAlIzA0eCBcbiIsIGFkZHIpOykKKwkJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYWRkciAgICAtIFBJTyBhZGRyZXNzIHRvIHdyaXRlCit2YWwgICAgIC0gVmFsdWUgdG8gc3RvcmUKK1JFTUFSS1M6CitEZWZhdWx0IFBJTyBieXRlIHdyaXRlIGZ1bmN0aW9uLiBEb2Vzbid0IHBlcmZvcm0gcmVhbCBvdXRiLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIFg4NkFQSSBwX291dGIoWDg2RU1VX3Bpb0FkZHIgYWRkciwgdTggdmFsKQoreworCURCKGlmIChERUJVR19JT19UUkFDRSgpKQorCSAgIHByaW50aygib3V0YiAlIzAyeCAtPiAlIzA0eCBcbiIsIHZhbCwgYWRkcik7KQorCQlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorYWRkciAgICAtIFBJTyBhZGRyZXNzIHRvIHdyaXRlCit2YWwgICAgIC0gVmFsdWUgdG8gc3RvcmUKK1JFTUFSS1M6CitEZWZhdWx0IFBJTyB3b3JkIHdyaXRlIGZ1bmN0aW9uLiBEb2Vzbid0IHBlcmZvcm0gcmVhbCBvdXR3LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIFg4NkFQSSBwX291dHcoWDg2RU1VX3Bpb0FkZHIgYWRkciwgdTE2IHZhbCkKK3sKKwlEQihpZiAoREVCVUdfSU9fVFJBQ0UoKSkKKwkgICBwcmludGsoIm91dHcgJSMwNHggLT4gJSMwNHggXG4iLCB2YWwsIGFkZHIpOykKKwkJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUEFSQU1FVEVSUzoKK2FkZHIgICAgLSBQSU8gYWRkcmVzcyB0byB3cml0ZQordmFsICAgICAtIFZhbHVlIHRvIHN0b3JlCitSRU1BUktTOgorRGVmYXVsdCBQSU8gO29uZyB3cml0ZSBmdW5jdGlvbi4gRG9lc24ndCBwZXJmb3JtIHJlYWwgb3V0bC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBYODZBUEkgcF9vdXRsKFg4NkVNVV9waW9BZGRyIGFkZHIsIHUzMiB2YWwpCit7CisJREIoaWYgKERFQlVHX0lPX1RSQUNFKCkpCisJICAgcHJpbnRrKCJvdXRsICUjMDh4IC0+ICUjMDR4IFxuIiwgdmFsLCBhZGRyKTspCisJCXJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordTgoWDg2QVBJUCBzeXNfcmRiKSAodTMyIGFkZHIpID0gcmRiOwordTE2KFg4NkFQSVAgc3lzX3JkdykgKHUzMiBhZGRyKSA9IHJkdzsKK3UzMihYODZBUElQIHN5c19yZGwpICh1MzIgYWRkcikgPSByZGw7Cit2b2lkIChYODZBUElQIHN5c193cmIpICh1MzIgYWRkciwgdTggdmFsKSA9IHdyYjsKK3ZvaWQgKFg4NkFQSVAgc3lzX3dydykgKHUzMiBhZGRyLCB1MTYgdmFsKSA9IHdydzsKK3ZvaWQgKFg4NkFQSVAgc3lzX3dybCkgKHUzMiBhZGRyLCB1MzIgdmFsKSA9IHdybDsKK3U4KFg4NkFQSVAgc3lzX2luYikgKFg4NkVNVV9waW9BZGRyIGFkZHIpID0gcF9pbmI7Cit1MTYoWDg2QVBJUCBzeXNfaW53KSAoWDg2RU1VX3Bpb0FkZHIgYWRkcikgPSBwX2ludzsKK3UzMihYODZBUElQIHN5c19pbmwpIChYODZFTVVfcGlvQWRkciBhZGRyKSA9IHBfaW5sOwordm9pZCAoWDg2QVBJUCBzeXNfb3V0YikgKFg4NkVNVV9waW9BZGRyIGFkZHIsIHU4IHZhbCkgPSBwX291dGI7Cit2b2lkIChYODZBUElQIHN5c19vdXR3KSAoWDg2RU1VX3Bpb0FkZHIgYWRkciwgdTE2IHZhbCkgPSBwX291dHc7Cit2b2lkIChYODZBUElQIHN5c19vdXRsKSAoWDg2RU1VX3Bpb0FkZHIgYWRkciwgdTMyIHZhbCkgPSBwX291dGw7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2V0dXAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorZnVuY3MgICAtIE5ldyBtZW1vcnkgZnVuY3Rpb24gcG9pbnRlcnMgdG8gbWFrZSBhY3RpdmUKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdGhlIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyB3aGljaCBhY2Nlc3MKK21lbW9yeSBzcGFjZSwgYWxsb3dpbmcgdGhlIHVzZXIgYXBwbGljYXRpb24gdG8gb3ZlcnJpZGUgdGhlc2UgZnVuY3Rpb25zCithbmQgaG9vayB0aGVtIG91dCBhcyBuZWNlc3NhcnkgZm9yIHRoZWlyIGFwcGxpY2F0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgWDg2RU1VX3NldHVwTWVtRnVuY3MoWDg2RU1VX21lbUZ1bmNzICogZnVuY3MpCit7CisJc3lzX3JkYiA9IGZ1bmNzLT5yZGI7CisJc3lzX3JkdyA9IGZ1bmNzLT5yZHc7CisJc3lzX3JkbCA9IGZ1bmNzLT5yZGw7CisJc3lzX3dyYiA9IGZ1bmNzLT53cmI7CisJc3lzX3dydyA9IGZ1bmNzLT53cnc7CisJc3lzX3dybCA9IGZ1bmNzLT53cmw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgorZnVuY3MgICAtIE5ldyBwcm9ncmFtbWVkIEkvTyBmdW5jdGlvbiBwb2ludGVycyB0byBtYWtlIGFjdGl2ZQorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCB0aGUgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIHdoaWNoIGFjY2VzcworSS9PIHNwYWNlLCBhbGxvd2luZyB0aGUgdXNlciBhcHBsaWNhdGlvbiB0byBvdmVycmlkZSB0aGVzZSBmdW5jdGlvbnMKK2FuZCBob29rIHRoZW0gb3V0IGFzIG5lY2Vzc2FyeSBmb3IgdGhlaXIgYXBwbGljYXRpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBYODZFTVVfc2V0dXBQaW9GdW5jcyhYODZFTVVfcGlvRnVuY3MgKiBmdW5jcykKK3sKKwlzeXNfaW5iID0gZnVuY3MtPmluYjsKKwlzeXNfaW53ID0gZnVuY3MtPmludzsKKwlzeXNfaW5sID0gZnVuY3MtPmlubDsKKwlzeXNfb3V0YiA9IGZ1bmNzLT5vdXRiOworCXN5c19vdXR3ID0gZnVuY3MtPm91dHc7CisJc3lzX291dGwgPSBmdW5jcy0+b3V0bDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BBUkFNRVRFUlM6CitmdW5jcyAgIC0gTmV3IGludGVycnVwdCB2ZWN0b3IgdGFibGUgdG8gbWFrZSBhY3RpdmUKKworUkVNQVJLUzoKK1RoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdGhlIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyB3aGljaCBoYW5kbGUKK2ludGVycnVwdCBwcm9jZXNzaW5nIGluIHRoZSBlbXVsYXRvciwgYWxsb3dpbmcgdGhlIHVzZXIgYXBwbGljYXRpb24gdG8KK2hvb2sgaW50ZXJydXB0cyBhcyBuZWNlc3NhcnkgZm9yIHRoZWlyIGFwcGxpY2F0aW9uLiBBbnkgaW50ZXJydXB0cyB0aGF0CithcmUgbm90IGhvb2tlZCBieSB0aGUgdXNlciBhcHBsaWNhdGlvbiwgYW5kIHJlZmxlY3RlZCBhbmQgaGFuZGxlZCBpbnRlcm5hbGx5CitpbiB0aGUgZW11bGF0b3IgdmlhIHRoZSBpbnRlcnJ1cHQgdmVjdG9yIHRhYmxlLiBUaGlzIGFsbG93cyB0aGUgYXBwbGljYXRpb24KK3RvIGdldCBjb250cm9sIHdoZW4gdGhlIGNvZGUgYmVpbmcgZW11bGF0ZWQgZXhlY3V0ZXMgc3BlY2lmaWMgc29mdHdhcmUKK2ludGVycnVwdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBYODZFTVVfc2V0dXBJbnRyRnVuY3MoWDg2RU1VX2ludHJGdW5jcyBmdW5jc1tdKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorCQlfWDg2RU1VX2ludHJUYWJbaV0gPSBOVUxMOworCWlmIChmdW5jcykgeworCQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCQlfWDg2RU1VX2ludHJUYWJbaV0gPSBmdW5jc1tpXTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQQVJBTUVURVJTOgoraW50IC0gTmV3IHNvZnR3YXJlIGludGVycnVwdCB0byBwcmVwYXJlIGZvcgorCitSRU1BUktTOgorVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCB1cCB0aGUgZW11bGF0b3Igc3RhdGUgdG8gZXhjZXV0ZSBhIHNvZnR3YXJlCitpbnRlcnJ1cHQuIFRoaXMgY2FuIGJlIHVzZWQgYnkgdGhlIHVzZXIgYXBwbGljYXRpb24gY29kZSB0byBhbGxvdyBhbgoraW50ZXJydXB0IHRvIGJlIGhvb2tlZCwgZXhhbWluZWQgYW5kIHRoZW4gcmVmbGVjdGVkIGJhY2sgdG8gdGhlIGVtdWxhdG9yCitzbyB0aGF0IHRoZSBjb2RlIGluIHRoZSBlbXVsYXRvciB3aWxsIGNvbnRpbnVlIHByb2Nlc3NpbmcgdGhlIHNvZnR3YXJlCitpbnRlcnJ1cHQgYXMgcGVyIG5vcm1hbC4gVGhpcyBlc3NlbnRpYWxseSBhbGxvd3Mgc3lzdGVtIGNvZGUgdG8gYWN0aXZlbHkKK2hvb2sgYW5kIGhhbmRsZSBjZXJ0YWluIHNvZnR3YXJlIGludGVycnVwdHMgYXMgbmVjZXNzYXJ5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgWDg2RU1VX3ByZXBhcmVGb3JJbnQoaW50IG51bSkKK3sKKwlwdXNoX3dvcmQoKHUxNikgTS54ODYuUl9GTEcpOworCUNMRUFSX0ZMQUcoRl9JRik7CisJQ0xFQVJfRkxBRyhGX1RGKTsKKwlwdXNoX3dvcmQoTS54ODYuUl9DUyk7CisJTS54ODYuUl9DUyA9IG1lbV9hY2Nlc3Nfd29yZChudW0gKiA0ICsgMik7CisJcHVzaF93b3JkKE0ueDg2LlJfSVApOworCU0ueDg2LlJfSVAgPSBtZW1fYWNjZXNzX3dvcmQobnVtICogNCk7CisJTS54ODYuaW50ciA9IDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jZmJfY29uc29sZS5jIGIvZHJpdmVycy9jZmJfY29uc29sZS5jCmluZGV4IDk3MjdhZWIuLmJjZjg3NzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2ZiX2NvbnNvbGUuYworKysgYi9kcml2ZXJzL2NmYl9jb25zb2xlLmMKQEAgLTYzLDcgKzYzLDcgQEAKIAkJCSAgICAgICBsb29wIGluIFZJREVPX1RTVENfRkNUIChpODA0MikKICBDRkdfQ09OU09MRV9CTElOS19DT1VOVCAgICAgLSB2YWx1ZSBmb3IgZGVsYXkgbG9vcCAtIGJsaW5rIHJhdGUKICBDT05GSUdfQ09OU09MRV9USU1FCSAgICAgLSBkaXNwbGF5IHRpbWUvZGF0ZSBpbiB1cHBlciByaWdodCBjb3JuZXIsCi0JCQkgICAgICAgbmVlZHMgQ0ZHX0NNRF9EQVRFIGFuZCBDT05GSUdfQ09OU09MRV9DVVJTT1IKKwkJCSAgICAgICBuZWVkcyBDT05GSUdfQ01EX0RBVEUgYW5kIENPTkZJR19DT05TT0xFX0NVUlNPUgogIENPTkZJR19WSURFT19MT0dPCSAgICAgLSBkaXNwbGF5IExpbnV4IExvZ28gaW4gdXBwZXIgbGVmdCBjb3JuZXIKICBDT05GSUdfVklERU9fQk1QX0xPR08JICAgICAtIHVzZSBibXBfbG9nbyBpbnN0ZWFkIG9mIGxpbnV4X2xvZ28KICBDT05GSUdfQ09OU09MRV9FWFRSQV9JTkZPICAgLSBkaXNwbGF5IGFkZGl0aW9uYWwgYm9hcmQgaW5mb3JtYXRpb24gc3RyaW5ncwpAQCAtMTc1LDE1ICsxNzUsMTUgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGRldmljZXMuaD4KICNpbmNsdWRlIDx2aWRlb19mb250Lmg+Ci0jaWZkZWYgQ0ZHX0NNRF9EQVRFCi0jaW5jbHVkZSA8cnRjLmg+CiAKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfREFURSkKKyNpbmNsdWRlIDxydGMuaD4KICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQk1QKSB8fCBkZWZpbmVkKENPTkZJR19TUExBU0hfU0NSRUVOKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CTVApIHx8IGRlZmluZWQoQ09ORklHX1NQTEFTSF9TQ1JFRU4pCiAjaW5jbHVkZSA8d2F0Y2hkb2cuaD4KICNpbmNsdWRlIDxibXBfbGF5b3V0Lmg+Ci0jZW5kaWYgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQk1QKSB8fCBDT05GSUdfU1BMQVNIX1NDUkVFTiAqLworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEN1cnNvciBkZWZpbml0aW9uOgkJCQkJCQkgICAgICovCkBAIC03MDksNyArNzA5LDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQk1QKSB8fCBkZWZpbmVkKENPTkZJR19TUExBU0hfU0NSRUVOKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CTVApIHx8IGRlZmluZWQoQ09ORklHX1NQTEFTSF9TQ1JFRU4pCiAKICNkZWZpbmUgRklMTF84QklUXzMzMlJHQihyLGcsYikJewkJCVwKIAkqZmIgPSAoKHI+PjUpPDw1KSB8ICgoZz4+NSk8PDIpIHwgKGI+PjYpOwlcCkBAIC0xMDA0LDcgKzEwMDQsNyBAQAogCiAJcmV0dXJuICgwKTsKIH0KLSNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9CTVApIHx8IENPTkZJR19TUExBU0hfU0NSRUVOICovCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NzODkwMC5jIGIvZHJpdmVycy9jczg5MDAuYwppbmRleCAwODI0MzRjLi44MGM0YmEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NzODkwMC5jCisrKyBiL2RyaXZlcnMvY3M4OTAwLmMKQEAgLTQzLDcgKzQzLDcgQEAKIAogI2lmZGVmIENPTkZJR19EUklWRVJfQ1M4OTAwCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAogI3VuZGVmIERFQlVHCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZGMyMTE0eC5jIGIvZHJpdmVycy9kYzIxMTR4LmMKaW5kZXggYzQzY2Q1ZS4uZDUyNzVkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9kYzIxMTR4LmMKKysrIGIvZHJpdmVycy9kYzIxMTR4LmMKQEAgLTIwLDggKzIwLDggQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpIFwKLQkmJiBkZWZpbmVkKENPTkZJR19UVUxJUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSBcCisJJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAmJiBkZWZpbmVkKENPTkZJR19UVUxJUCkKIAogI2luY2x1ZGUgPG1hbGxvYy5oPgogI2luY2x1ZGUgPG5ldC5oPgpAQCAtNzY4LDQgKzc2OCw0IEBACiB9CiAjZW5kaWYJLyogVVBEQVRFX1NST00gKi8KIAotI2VuZGlmCS8qIENGR19DTURfTkVUICYmIENPTkZJR19ORVRfTVVMVEkgJiYgQ09ORklHX1RVTElQICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZTEwMDAuYyBiL2RyaXZlcnMvZTEwMDAuYwppbmRleCA5MjdhY2JiLi5mMDc0MWRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2UxMDAwLmMKKysrIGIvZHJpdmVycy9lMTAwMC5jCkBAIC00NCw4ICs0NCw4IEBACiAKICNpbmNsdWRlICJlMTAwMC5oIgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIFwKLQlkZWZpbmVkKENPTkZJR19FMTAwMCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSBcCisJJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAmJiBkZWZpbmVkKENPTkZJR19FMTAwMCkKIAogI2RlZmluZSBUT1VUX0xPT1AgICAxMDAwMDAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZXBybzEwMC5jIGIvZHJpdmVycy9lZXBybzEwMC5jCmluZGV4IDA0YzE3ZjYuLjczODE0NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWVwcm8xMDAuYworKysgYi9kcml2ZXJzL2VlcHJvMTAwLmMKQEAgLTMwLDggKzMwLDggQEAKIAogI3VuZGVmIERFQlVHCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgJiYgXAotCWRlZmluZWQoQ09ORklHX0VFUFJPMTAwKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpIFwKKwkmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIGRlZmluZWQoQ09ORklHX0VFUFJPMTAwKQogCiAJLyogRXRoZXJuZXQgY2hpcCByZWdpc3RlcnMuCiAJICovCkBAIC0yNzIsNyArMjcyLDcgQEAKIAkqKHZvbGF0aWxlIHUzMiAqKSAoKGFkZHIgKyBkZXYtPmlvYmFzZSkpID0gY3B1X3RvX2xlMzIgKGNvbW1hbmQpOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCisjaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogc3RhdGljIGlubGluZSBpbnQgSU5MIChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2LCB1X2xvbmcgYWRkcikKIHsKIAlyZXR1cm4gbGUzMl90b19jcHUgKCoodm9sYXRpbGUgdTMyICopIChhZGRyICsgZGV2LT5pb2Jhc2UpKTsKQEAgLTM4Niw3ICszODYsNyBAQAogCXJldHVybiAwOwogfQogCi0jZW5kaWYgLyogZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpICovCisjZW5kaWYKIAogLyogV2FpdCBmb3IgdGhlIGNoaXAgZ2V0IHRoZSBjb21tYW5kLgogKi8KQEAgLTQ2Miw3ICs0NjIsNyBAQAogCiAJCWV0aF9yZWdpc3RlciAoZGV2KTsKIAotI2lmIGRlZmluZWQgKENPTkZJR19NSUkpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX01JSSkKKyNpZiBkZWZpbmVkIChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogCQkvKiByZWdpc3RlciBtaWkgY29tbWFuZCBhY2Nlc3Mgcm91dGluZXMgKi8KIAkJbWlpcGh5X3JlZ2lzdGVyKGRldi0+bmFtZSwKIAkJCQllZXBybzEwMF9taWlwaHlfcmVhZCwgZWVwcm8xMDBfbWlpcGh5X3dyaXRlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZW5jMjhqNjAuYyBiL2RyaXZlcnMvZW5jMjhqNjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODMwM2FjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9lbmMyOGo2MC5jCkBAIC0wLDAgKzEsOTgzIEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGNvbW1vbi5oPgorI2lmZGVmIENPTkZJR19FTkMyOEo2MAorI2luY2x1ZGUgPG5ldC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3BpLmg+CisKKy8qCisgKiBDb250cm9sIFJlZ2lzdGVycyBpbiBCYW5rIDAKKyAqLworCisjZGVmaW5lIENUTF9SRUdfRVJEUFRMCSAweDAwCisjZGVmaW5lIENUTF9SRUdfRVJEUFRICSAweDAxCisjZGVmaW5lIENUTF9SRUdfRVdSUFRMCSAweDAyCisjZGVmaW5lIENUTF9SRUdfRVdSUFRICSAweDAzCisjZGVmaW5lIENUTF9SRUdfRVRYU1RMCSAweDA0CisjZGVmaW5lIENUTF9SRUdfRVRYU1RICSAweDA1CisjZGVmaW5lIENUTF9SRUdfRVRYTkRMCSAweDA2CisjZGVmaW5lIENUTF9SRUdfRVRYTkRICSAweDA3CisjZGVmaW5lIENUTF9SRUdfRVJYU1RMCSAweDA4CisjZGVmaW5lIENUTF9SRUdfRVJYU1RICSAweDA5CisjZGVmaW5lIENUTF9SRUdfRVJYTkRMCSAweDBBCisjZGVmaW5lIENUTF9SRUdfRVJYTkRICSAweDBCCisjZGVmaW5lIENUTF9SRUdfRVJYUkRQVEwgMHgwQworI2RlZmluZSBDVExfUkVHX0VSWFJEUFRIIDB4MEQKKyNkZWZpbmUgQ1RMX1JFR19FUlhXUlBUTCAweDBFCisjZGVmaW5lIENUTF9SRUdfRVJYV1JQVEggMHgwRgorI2RlZmluZSBDVExfUkVHX0VETUFTVEwgIDB4MTAKKyNkZWZpbmUgQ1RMX1JFR19FRE1BU1RIICAweDExCisjZGVmaW5lIENUTF9SRUdfRURNQU5ETCAgMHgxMgorI2RlZmluZSBDVExfUkVHX0VETUFOREggIDB4MTMKKyNkZWZpbmUgQ1RMX1JFR19FRE1BRFNUTCAweDE0CisjZGVmaW5lIENUTF9SRUdfRURNQURTVEggMHgxNQorI2RlZmluZSBDVExfUkVHX0VETUFDU0wgIDB4MTYKKyNkZWZpbmUgQ1RMX1JFR19FRE1BQ1NIICAweDE3CisvKiB0aGVzZSBhcmUgY29tbW9uIGluIGFsbCBiYW5rcyAqLworI2RlZmluZSBDVExfUkVHX0VJRQkgMHgxQgorI2RlZmluZSBDVExfUkVHX0VJUgkgMHgxQworI2RlZmluZSBDVExfUkVHX0VTVEFUCSAweDFECisjZGVmaW5lIENUTF9SRUdfRUNPTjIJIDB4MUUKKyNkZWZpbmUgQ1RMX1JFR19FQ09OMQkgMHgxRgorCisvKgorICogQ29udHJvbCBSZWdpc3RlcnMgaW4gQmFuayAxCisgKi8KKworI2RlZmluZSBDVExfUkVHX0VIVDAJMHgwMAorI2RlZmluZSBDVExfUkVHX0VIVDEJMHgwMQorI2RlZmluZSBDVExfUkVHX0VIVDIJMHgwMgorI2RlZmluZSBDVExfUkVHX0VIVDMJMHgwMworI2RlZmluZSBDVExfUkVHX0VIVDQJMHgwNAorI2RlZmluZSBDVExfUkVHX0VIVDUJMHgwNQorI2RlZmluZSBDVExfUkVHX0VIVDYJMHgwNgorI2RlZmluZSBDVExfUkVHX0VIVDcJMHgwNworI2RlZmluZSBDVExfUkVHX0VQTU0wCTB4MDgKKyNkZWZpbmUgQ1RMX1JFR19FUE1NMQkweDA5CisjZGVmaW5lIENUTF9SRUdfRVBNTTIJMHgwQQorI2RlZmluZSBDVExfUkVHX0VQTU0zCTB4MEIKKyNkZWZpbmUgQ1RMX1JFR19FUE1NNAkweDBDCisjZGVmaW5lIENUTF9SRUdfRVBNTTUJMHgwRAorI2RlZmluZSBDVExfUkVHX0VQTU02CTB4MEUKKyNkZWZpbmUgQ1RMX1JFR19FUE1NNwkweDBGCisjZGVmaW5lIENUTF9SRUdfRVBNQ1NMCTB4MTAKKyNkZWZpbmUgQ1RMX1JFR19FUE1DU0gJMHgxMQorI2RlZmluZSBDVExfUkVHX0VQTU9MCTB4MTQKKyNkZWZpbmUgQ1RMX1JFR19FUE1PSAkweDE1CisjZGVmaW5lIENUTF9SRUdfRVdPTElFCTB4MTYKKyNkZWZpbmUgQ1RMX1JFR19FV09MSVIJMHgxNworI2RlZmluZSBDVExfUkVHX0VSWEZDT04gMHgxOAorI2RlZmluZSBDVExfUkVHX0VQS1RDTlQgMHgxOQorCisvKgorICogQ29udHJvbCBSZWdpc3RlcnMgaW4gQmFuayAyCisgKi8KKworI2RlZmluZSBDVExfUkVHX01BQ09OMQkgMHgwMAorI2RlZmluZSBDVExfUkVHX01BQ09OMgkgMHgwMQorI2RlZmluZSBDVExfUkVHX01BQ09OMwkgMHgwMgorI2RlZmluZSBDVExfUkVHX01BQ09ONAkgMHgwMworI2RlZmluZSBDVExfUkVHX01BQkJJUEcgIDB4MDQKKyNkZWZpbmUgQ1RMX1JFR19NQUlQR0wJIDB4MDYKKyNkZWZpbmUgQ1RMX1JFR19NQUlQR0gJIDB4MDcKKyNkZWZpbmUgQ1RMX1JFR19NQUNMQ09OMSAweDA4CisjZGVmaW5lIENUTF9SRUdfTUFDTENPTjIgMHgwOQorI2RlZmluZSBDVExfUkVHX01BTVhGTEwgIDB4MEEKKyNkZWZpbmUgQ1RMX1JFR19NQU1YRkxIICAweDBCCisjZGVmaW5lIENUTF9SRUdfTUFQSFNVUCAgMHgwRAorI2RlZmluZSBDVExfUkVHX01JQ09OCSAweDExCisjZGVmaW5lIENUTF9SRUdfTUlDTUQJIDB4MTIKKyNkZWZpbmUgQ1RMX1JFR19NSVJFR0FEUiAweDE0CisjZGVmaW5lIENUTF9SRUdfTUlXUkwJIDB4MTYKKyNkZWZpbmUgQ1RMX1JFR19NSVdSSAkgMHgxNworI2RlZmluZSBDVExfUkVHX01JUkRMCSAweDE4CisjZGVmaW5lIENUTF9SRUdfTUlSREgJIDB4MTkKKworLyoKKyAqIENvbnRyb2wgUmVnaXN0ZXJzIGluIEJhbmsgMworICovCisKKyNkZWZpbmUgQ1RMX1JFR19NQUFEUjEJMHgwMAorI2RlZmluZSBDVExfUkVHX01BQURSMAkweDAxCisjZGVmaW5lIENUTF9SRUdfTUFBRFIzCTB4MDIKKyNkZWZpbmUgQ1RMX1JFR19NQUFEUjIJMHgwMworI2RlZmluZSBDVExfUkVHX01BQURSNQkweDA0CisjZGVmaW5lIENUTF9SRUdfTUFBRFI0CTB4MDUKKyNkZWZpbmUgQ1RMX1JFR19FQlNUU0QJMHgwNgorI2RlZmluZSBDVExfUkVHX0VCU1RDT04gMHgwNworI2RlZmluZSBDVExfUkVHX0VCU1RDU0wgMHgwOAorI2RlZmluZSBDVExfUkVHX0VCU1RDU0ggMHgwOQorI2RlZmluZSBDVExfUkVHX01JU1RBVAkweDBBCisjZGVmaW5lIENUTF9SRUdfRVJFVklECTB4MTIKKyNkZWZpbmUgQ1RMX1JFR19FQ09DT04JMHgxNQorI2RlZmluZSBDVExfUkVHX0VGTE9DT04gMHgxNworI2RlZmluZSBDVExfUkVHX0VQQVVTTAkweDE4CisjZGVmaW5lIENUTF9SRUdfRVBBVVNICTB4MTkKKworCisvKgorICogUEhZIFJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBQSFlfUkVHX1BISUQxIDB4MDIKKyNkZWZpbmUgUEhZX1JFR19QSElEMiAweDAzCisvKiB0YWtlbiBmcm9tIHRoZSBMaW51eCBkcml2ZXIgKi8KKyNkZWZpbmUgUEhZX1JFR19QSENPTjEgMHgwMAorI2RlZmluZSBQSFlfUkVHX1BIQ09OMiAweDEwCisjZGVmaW5lIFBIWV9SRUdfUEhMQ09OIDB4MTQKKworLyoKKyAqIFJlY2VpdmUgRmlsdGVyIFJlZ2lzdGVyIChFUlhGQ09OKSBiaXRzCisgKi8KKworI2RlZmluZSBFTkNfUkZSX1VDRU4gIDB4ODAKKyNkZWZpbmUgRU5DX1JGUl9BTkRPUiAweDQwCisjZGVmaW5lIEVOQ19SRlJfQ1JDRU4gMHgyMAorI2RlZmluZSBFTkNfUkZSX1BNRU4gIDB4MTAKKyNkZWZpbmUgRU5DX1JGUl9NUEVOICAweDA4CisjZGVmaW5lIEVOQ19SRlJfSFRFTiAgMHgwNAorI2RlZmluZSBFTkNfUkZSX01DRU4gIDB4MDIKKyNkZWZpbmUgRU5DX1JGUl9CQ0VOICAweDAxCisKKy8qCisgKiBFQ09OMSBSZWdpc3RlciBCaXRzCisgKi8KKworI2RlZmluZSBFTkNfRUNPTjFfVFhSU1QgIDB4ODAKKyNkZWZpbmUgRU5DX0VDT04xX1JYUlNUICAweDQwCisjZGVmaW5lIEVOQ19FQ09OMV9ETUFTVCAgMHgyMAorI2RlZmluZSBFTkNfRUNPTjFfQ1NVTUVOIDB4MTAKKyNkZWZpbmUgRU5DX0VDT04xX1RYUlRTICAweDA4CisjZGVmaW5lIEVOQ19FQ09OMV9SWEVOCSAweDA0CisjZGVmaW5lIEVOQ19FQ09OMV9CU0VMMSAgMHgwMgorI2RlZmluZSBFTkNfRUNPTjFfQlNFTDAgIDB4MDEKKworLyoKKyAqIEVDT04yIFJlZ2lzdGVyIEJpdHMKKyAqLworI2RlZmluZSBFTkNfRUNPTjJfQVVUT0lOQyAweDgwCisjZGVmaW5lIEVOQ19FQ09OMl9QS1RERUMgIDB4NDAKKyNkZWZpbmUgRU5DX0VDT04yX1BXUlNWICAgMHgyMAorI2RlZmluZSBFTkNfRUNPTjJfVlJQUwkgIDB4MDgKKworLyoKKyAqIEVJUiBSZWdpc3RlciBCaXRzCisgKi8KKyNkZWZpbmUgRU5DX0VJUl9QS1RJRiAgMHg0MAorI2RlZmluZSBFTkNfRUlSX0RNQUlGICAweDIwCisjZGVmaW5lIEVOQ19FSVJfTElOS0lGIDB4MTAKKyNkZWZpbmUgRU5DX0VJUl9UWElGICAgMHgwOAorI2RlZmluZSBFTkNfRUlSX1dPTElGICAweDA0CisjZGVmaW5lIEVOQ19FSVJfVFhFUklGIDB4MDIKKyNkZWZpbmUgRU5DX0VJUl9SWEVSSUYgMHgwMQorCisvKgorICogRVNUQVQgUmVnaXN0ZXIgQml0cworICovCisKKyNkZWZpbmUgRU5DX0VTVEFUX0lOVAkgIDB4ODAKKyNkZWZpbmUgRU5DX0VTVEFUX0xBVEVDT0wgMHgxMAorI2RlZmluZSBFTkNfRVNUQVRfUlhCVVNZICAweDA0CisjZGVmaW5lIEVOQ19FU1RBVF9UWEFCUlQgIDB4MDIKKyNkZWZpbmUgRU5DX0VTVEFUX0NMS1JEWSAgMHgwMQorCisvKgorICogRUlFIFJlZ2lzdGVyIEJpdHMKKyAqLworCisjZGVmaW5lIEVOQ19FSUVfSU5USUUgIDB4ODAKKyNkZWZpbmUgRU5DX0VJRV9QS1RJRSAgMHg0MAorI2RlZmluZSBFTkNfRUlFX0RNQUlFICAweDIwCisjZGVmaW5lIEVOQ19FSUVfTElOS0lFIDB4MTAKKyNkZWZpbmUgRU5DX0VJRV9UWElFICAgMHgwOAorI2RlZmluZSBFTkNfRUlFX1dPTElFICAweDA0CisjZGVmaW5lIEVOQ19FSUVfVFhFUklFIDB4MDIKKyNkZWZpbmUgRU5DX0VJRV9SWEVSSUUgMHgwMQorCisvKgorICogTUFDT04xIFJlZ2lzdGVyIEJpdHMKKyAqLworI2RlZmluZSBFTkNfTUFDT04xX0xPT1BCSyAgMHgxMAorI2RlZmluZSBFTkNfTUFDT04xX1RYUEFVUyAgMHgwOAorI2RlZmluZSBFTkNfTUFDT04xX1JYUEFVUyAgMHgwNAorI2RlZmluZSBFTkNfTUFDT04xX1BBU1NBTEwgMHgwMgorI2RlZmluZSBFTkNfTUFDT04xX01BUlhFTiAgMHgwMQorCisKKy8qCisgKiBNQUNPTjIgUmVnaXN0ZXIgQml0cworICovCisjZGVmaW5lIEVOQ19NQUNPTjJfTUFSU1QgICAweDgwCisjZGVmaW5lIEVOQ19NQUNPTjJfUk5EUlNUICAweDQwCisjZGVmaW5lIEVOQ19NQUNPTjJfTUFSWFJTVCAweDA4CisjZGVmaW5lIEVOQ19NQUNPTjJfUkZVTlJTVCAweDA0CisjZGVmaW5lIEVOQ19NQUNPTjJfTUFUWFJTVCAweDAyCisjZGVmaW5lIEVOQ19NQUNPTjJfVEZVTlJTVCAweDAxCisKKy8qCisgKiBNQUNPTjMgUmVnaXN0ZXIgQml0cworICovCisjZGVmaW5lIEVOQ19NQUNPTjNfUEFEQ0ZHMiAweDgwCisjZGVmaW5lIEVOQ19NQUNPTjNfUEFEQ0ZHMSAweDQwCisjZGVmaW5lIEVOQ19NQUNPTjNfUEFEQ0ZHMCAweDIwCisjZGVmaW5lIEVOQ19NQUNPTjNfVFhDUkNFTiAweDEwCisjZGVmaW5lIEVOQ19NQUNPTjNfUEhEUkxFTiAweDA4CisjZGVmaW5lIEVOQ19NQUNPTjNfSEZSTUVOICAweDA0CisjZGVmaW5lIEVOQ19NQUNPTjNfRlJNTE5FTiAweDAyCisjZGVmaW5lIEVOQ19NQUNPTjNfRlVMRFBYICAweDAxCisKKy8qCisgKiBNSUNNRCBSZWdpc3RlciBCaXRzCisgKi8KKyNkZWZpbmUgRU5DX01JQ01EX01JSVNDQU4gMHgwMgorI2RlZmluZSBFTkNfTUlDTURfTUlJUkQgICAweDAxCisKKy8qCisgKiBNSVNUQVQgUmVnaXN0ZXIgQml0cworICovCisjZGVmaW5lIEVOQ19NSVNUQVRfTlZBTElEIDB4MDQKKyNkZWZpbmUgRU5DX01JU1RBVF9TQ0FOICAgMHgwMgorI2RlZmluZSBFTkNfTUlTVEFUX0JVU1kgICAweDAxCisKKy8qCisgKiBQSElEMSBhbmQgUEhJRDIgdmFsdWVzCisgKi8KKyNkZWZpbmUgRU5DX1BISUQxX1ZBTFVFIDB4MDA4MworI2RlZmluZSBFTkNfUEhJRDJfVkFMVUUgMHgxNDAwCisjZGVmaW5lIEVOQ19QSElEMl9NQVNLCTB4RkMwMAorCisKKyNkZWZpbmUgRU5DX1NQSV9TTEFWRV9DUyAweDAwMDEwMDAwCS8qIHBpbiBQMS4xNiAqLworI2RlZmluZSBFTkNfUkVTRVQJIDB4MDAwMjAwMDAJLyogcGluIFAxLjE3ICovCisKKyNkZWZpbmUgRkFJTFNBRkVfVkFMVUUgNTAwMAorCisvKgorICogQ29udHJvbGxlciBtZW1vcnkgbGF5b3V0OgorICoKKyAqIDB4MDAwMCAtIDB4MTdmZiAgNmsgYnl0ZXMgcmVjZWl2ZSBidWZmZXIKKyAqIDB4MTgwMCAtIDB4MWZmZiAgMmsgYnl0ZXMgdHJhbnNtaXQgYnVmZmVyCisgKi8KKy8qIFVzZSB0aGUgbG93ZXIgbWVtb3J5IGZvciByZWNlaXZlciBidWZmZXIuIFNlZSBlcnJhdGEgcHQuIDUgKi8KKyNkZWZpbmUgRU5DX1JYX0JVRl9TVEFSVCAweDAwMDAKKyNkZWZpbmUgRU5DX1RYX0JVRl9TVEFSVCAweDE4MDAKKy8qIHRha2VuIGZyb20gdGhlIExpbnV4IGRyaXZlciAqLworI2RlZmluZSBFTkNfUlhfQlVGX0VORCAgIDB4MTdmZgorI2RlZmluZSBFTkNfVFhfQlVGX0VORCAgIDB4MWZmZgorCisvKiBtYXhpbXVtIGZyYW1lIGxlbmd0aCAqLworI2RlZmluZSBFTkNfTUFYX0ZSTV9MRU4gMTUxOAorCisjZGVmaW5lIGVuY19lbmFibGUoKSBQVVQzMihJTzFDTFIsIEVOQ19TUElfU0xBVkVfQ1MpCisjZGVmaW5lIGVuY19kaXNhYmxlKCkgUFVUMzIoSU8xU0VULCBFTkNfU1BJX1NMQVZFX0NTKQorI2RlZmluZSBlbmNfY2ZnX3NwaSgpIHNwaV9zZXRfY2ZnKDAsIDAsIDApOyBzcGlfc2V0X2Nsb2NrKDgpOworCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGVuY1JlYWRSZWcgKHVuc2lnbmVkIGNoYXIgcmVnTm8pOworc3RhdGljIHZvaWQgZW5jV3JpdGVSZWcgKHVuc2lnbmVkIGNoYXIgcmVnTm8sIHVuc2lnbmVkIGNoYXIgZGF0YSk7CitzdGF0aWMgdm9pZCBlbmNXcml0ZVJlZ1JldHJ5ICh1bnNpZ25lZCBjaGFyIHJlZ05vLCB1bnNpZ25lZCBjaGFyIGRhdGEsIGludCBjKTsKK3N0YXRpYyB2b2lkIGVuY1JlYWRCdWZmICh1bnNpZ25lZCBzaG9ydCBsZW5ndGgsIHVuc2lnbmVkIGNoYXIgKnBCdWZmKTsKK3N0YXRpYyB2b2lkIGVuY1dyaXRlQnVmZiAodW5zaWduZWQgc2hvcnQgbGVuZ3RoLCB1bnNpZ25lZCBjaGFyICpwQnVmZik7CitzdGF0aWMgdm9pZCBlbmNCaXRTZXQgKHVuc2lnbmVkIGNoYXIgcmVnTm8sIHVuc2lnbmVkIGNoYXIgZGF0YSk7CitzdGF0aWMgdm9pZCBlbmNCaXRDbHIgKHVuc2lnbmVkIGNoYXIgcmVnTm8sIHVuc2lnbmVkIGNoYXIgZGF0YSk7CitzdGF0aWMgdm9pZCBlbmNSZXNldCAodm9pZCk7CitzdGF0aWMgdm9pZCBlbmNJbml0ICh1bnNpZ25lZCBjaGFyICpwRXRoQWRkcik7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcGh5UmVhZCAodW5zaWduZWQgY2hhciBhZGRyKTsKK3N0YXRpYyB2b2lkIHBoeVdyaXRlKHVuc2lnbmVkIGNoYXIsIHVuc2lnbmVkIHNob3J0KTsKK3N0YXRpYyB2b2lkIGVuY1BvbGwgKHZvaWQpOworc3RhdGljIHZvaWQgZW5jUnggKHZvaWQpOworCisjZGVmaW5lIG1fbmljX3JlYWQocmVnKSBlbmNSZWFkUmVnKHJlZykKKyNkZWZpbmUgbV9uaWNfd3JpdGUocmVnLCBkYXRhKSBlbmNXcml0ZVJlZyhyZWcsIGRhdGEpCisjZGVmaW5lIG1fbmljX3dyaXRlX3JldHJ5KHJlZywgZGF0YSwgY291bnQpIGVuY1dyaXRlUmVnUmV0cnkocmVnLCBkYXRhLCBjb3VudCkKKyNkZWZpbmUgbV9uaWNfcmVhZF9kYXRhKGxlbiwgYnVmKSBlbmNSZWFkQnVmZigobGVuKSwgKGJ1ZikpCisjZGVmaW5lIG1fbmljX3dyaXRlX2RhdGEobGVuLCBidWYpIGVuY1dyaXRlQnVmZigobGVuKSwgKGJ1ZikpCisKKy8qIGJpdCBmaWVsZCBzZXQgKi8KKyNkZWZpbmUgbV9uaWNfYmZzKHJlZywgZGF0YSkgZW5jQml0U2V0KHJlZywgZGF0YSkKKworLyogYml0IGZpZWxkIGNsZWFyICovCisjZGVmaW5lIG1fbmljX2JmYyhyZWcsIGRhdGEpIGVuY0JpdENscihyZWcsIGRhdGEpCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGJhbmsgPSAwOwkvKiBjdXJyZW50IGJhbmsgaW4gZW5jMjhqNjAgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG5leHRfcG9pbnRlcl9sc2I7CitzdGF0aWMgdW5zaWduZWQgY2hhciBuZXh0X3BvaW50ZXJfbXNiOworCitzdGF0aWMgdW5zaWduZWQgY2hhciBidWZmZXJbRU5DX01BWF9GUk1fTEVOXTsKK3N0YXRpYyBpbnQgcnhSZXNldENvdW50ZXIgPSAwOworCisjZGVmaW5lIFJYX1JFU0VUX0NPVU5URVIgMTAwMDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQWx3YXlzIHJldHVybnMgMAorICovCitpbnQgZXRoX2luaXQgKGJkX3QgKiBiaXMpCit7CisJdW5zaWduZWQgY2hhciBlc3RhdFZhbDsKKworCS8qIGNvbmZpZ3VyZSBHUElPICovCisJKCooKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgSU8xRElSKSkgfD0gRU5DX1NQSV9TTEFWRV9DUzsKKwkoKigodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSBJTzFESVIpKSB8PSBFTkNfUkVTRVQ7CisKKwkvKiBDUyBhbmQgUkVTRVQgYWN0aXZlIGxvdyAqLworCVBVVDMyIChJTzFTRVQsIEVOQ19TUElfU0xBVkVfQ1MpOworCVBVVDMyIChJTzFTRVQsIEVOQ19SRVNFVCk7CisKKwlzcGlfaW5pdCAoKTsKKworCS8qIHRha2VuIGZyb20gdGhlIExpbnV4IGRyaXZlciAtIGRhbmdlcm91cyBzdHVmZiBoZXJlISAqLworCS8qIFdhaXQgZm9yIENMS1JEWSB0byBiZWNvbWUgc2V0IChpLmUuLCBjaGVjayB0aGF0IHdlIGNhbiBjb21tdW5pY2F0ZSB3aXRoCisJICAgdGhlIEVOQykgKi8KKwlkbworCXsKKwkJZXN0YXRWYWwgPSBtX25pY19yZWFkKENUTF9SRUdfRVNUQVQpOworCX0gd2hpbGUgKChlc3RhdFZhbCAmIDB4MDgpIHx8ICh+ZXN0YXRWYWwgJiBFTkNfRVNUQVRfQ0xLUkRZKSk7CisKKwkvKiBpbml0aWFsaXplIGNvbnRyb2xsZXIgKi8KKwllbmNSZXNldCAoKTsKKwllbmNJbml0IChiaXMtPmJpX2VuZXRhZGRyKTsKKworCW1fbmljX2JmcyAoQ1RMX1JFR19FQ09OMSwgRU5DX0VDT04xX1JYRU4pOwkvKiBlbmFibGUgcmVjZWl2ZSAqLworCisJcmV0dXJuIDA7Cit9CisKK2ludCBldGhfc2VuZCAodm9sYXRpbGUgdm9pZCAqcGFja2V0LCBpbnQgbGVuZ3RoKQoreworCS8qIGNoZWNrIGZyYW1lIGxlbmd0aCwgZXRjLiAqLworCS8qIFRPRE86ICovCisKKwkvKiBzd2l0Y2ggdG8gYmFuayAwICovCisJbV9uaWNfYmZjIChDVExfUkVHX0VDT04xLCAoRU5DX0VDT04xX0JTRUwxIHwgRU5DX0VDT04xX0JTRUwwKSk7CisKKwkvKiBzZXQgRVdSUFQgKi8KKwltX25pY193cml0ZSAoQ1RMX1JFR19FV1JQVEwsIChFTkNfVFhfQlVGX1NUQVJUICYgMHhmZikpOworCW1fbmljX3dyaXRlIChDVExfUkVHX0VXUlBUSCwgKEVOQ19UWF9CVUZfU1RBUlQgPj4gOCkpOworCisJLyogc2V0IEVUWE5EICovCisJbV9uaWNfd3JpdGUgKENUTF9SRUdfRVRYTkRMLCAobGVuZ3RoICsgRU5DX1RYX0JVRl9TVEFSVCkgJiAweEZGKTsKKwltX25pY193cml0ZSAoQ1RMX1JFR19FVFhOREgsIChsZW5ndGggKyBFTkNfVFhfQlVGX1NUQVJUKSA+PiA4KTsKKworCS8qIHNldCBFVFhTVCAqLworCW1fbmljX3dyaXRlIChDVExfUkVHX0VUWFNUTCwgRU5DX1RYX0JVRl9TVEFSVCAmIDB4RkYpOworCW1fbmljX3dyaXRlIChDVExfUkVHX0VUWFNUSCwgRU5DX1RYX0JVRl9TVEFSVCA+PiA4KTsKKworCS8qIHdyaXRlIHBhY2tldCAqLworCW1fbmljX3dyaXRlX2RhdGEgKGxlbmd0aCwgKHVuc2lnbmVkIGNoYXIgKikgcGFja2V0KTsKKworCS8qIHRha2VuIGZyb20gdGhlIExpbnV4IGRyaXZlciAqLworCS8qIFZlcmlmeSB0aGF0IHRoZSBpbnRlcm5hbCB0cmFuc21pdCBsb2dpYyBoYXMgbm90IGJlZW4gYWx0ZXJlZCBieSBleGNlc3NpdmUKKwkgICBjb2xsaXNpb25zLiAgU2VlIEVycmF0YSBCNCAxMiBhbmQgMTQuCisJICovCisJaWYgKG1fbmljX3JlYWQoQ1RMX1JFR19FSVIpICYgRU5DX0VJUl9UWEVSSUYpIHsKKwkJbV9uaWNfYmZzKENUTF9SRUdfRUNPTjEsIEVOQ19FQ09OMV9UWFJTVCk7CisJCW1fbmljX2JmYyhDVExfUkVHX0VDT04xLCBFTkNfRUNPTjFfVFhSU1QpOworCX0KKwltX25pY19iZmMoQ1RMX1JFR19FSVIsIChFTkNfRUlSX1RYRVJJRiB8IEVOQ19FSVJfVFhJRikpOworCisJLyogc2V0IEVDT04xLlRYUlRTICovCisJbV9uaWNfYmZzIChDVExfUkVHX0VDT04xLCBFTkNfRUNPTjFfVFhSVFMpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgcmVjZWl2ZXIgb25seS4gVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGZyb20KKyAqIGludGVycnVwdC1jb250ZXh0LgorICovCitzdGF0aWMgdm9pZCBlbmNSZWNlaXZlclJlc2V0ICh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgZWNvbjE7CisKKwllY29uMSA9IG1fbmljX3JlYWQgKENUTF9SRUdfRUNPTjEpOworCWlmICgoZWNvbjEgJiBFTkNfRUNPTjFfUlhSU1QpID09IDApIHsKKwkJbV9uaWNfYmZzIChDVExfUkVHX0VDT04xLCBFTkNfRUNPTjFfUlhSU1QpOworCQlyeFJlc2V0Q291bnRlciA9IFJYX1JFU0VUX0NPVU5URVI7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHJlY2VpdmVyIHJlc2V0IHRpbWVyCisgKi8KK3N0YXRpYyB2b2lkIGVuY1JlY2VpdmVyUmVzZXRDYWxsYmFjayAodm9pZCkKK3sKKwltX25pY19iZmMgKENUTF9SRUdfRUNPTjEsIEVOQ19FQ09OMV9SWFJTVCk7CisJbV9uaWNfYmZzIChDVExfUkVHX0VDT04xLCBFTkNfRUNPTjFfUlhFTik7CS8qIGVuYWJsZSByZWNlaXZlICovCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENoZWNrIGZvciByZWNlaXZlZCBwYWNrZXRzLiBDYWxsIE5ldFJlY2VpdmUgZm9yIGVhY2ggcGFja2V0LiBUaGUgcmV0dXJuCisgKiB2YWx1ZSBpcyBpZ25vcmVkIGJ5IHRoZSBjYWxsZXIuCisgKi8KK2ludCBldGhfcnggKHZvaWQpCit7CisJaWYgKHJ4UmVzZXRDb3VudGVyID4gMCAmJiAtLXJ4UmVzZXRDb3VudGVyID09IDApIHsKKwkJZW5jUmVjZWl2ZXJSZXNldENhbGxiYWNrICgpOworCX0KKworCWVuY1BvbGwgKCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBldGhfaGFsdCAodm9pZCkKK3sKKwltX25pY19iZmMgKENUTF9SRUdfRUNPTjEsIEVOQ19FQ09OMV9SWEVOKTsJLyogZGlzYWJsZSByZWNlaXZlICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgZW5jUG9sbCAodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGVpcl9yZWc7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBlc3RhdF9yZWc7CisJdW5zaWduZWQgY2hhciBwa3RfY250OworCisjaWZkZWYgQ09ORklHX1VTRV9JUlEKKwkvKiBjbGVhciBnbG9iYWwgaW50ZXJydXB0IGVuYWJsZSBiaXQgaW4gZW5jMjhqNjAgKi8KKwltX25pY19iZmMgKENUTF9SRUdfRUlFLCBFTkNfRUlFX0lOVElFKTsKKyNlbmRpZgorCWVzdGF0X3JlZyA9IG1fbmljX3JlYWQgKENUTF9SRUdfRVNUQVQpOworCisJZWlyX3JlZyA9IG1fbmljX3JlYWQgKENUTF9SRUdfRUlSKTsKKworCWlmIChlaXJfcmVnICYgRU5DX0VJUl9UWElGKSB7CisJCS8qIGNsZWFyIFRYSUYgYml0IGluIEVJUiAqLworCQltX25pY19iZmMgKENUTF9SRUdfRUlSLCBFTkNfRUlSX1RYSUYpOworCX0KKworCS8qIFdlIGhhdmUgdG8gdXNlIHBrdGNudCBhbmQgbm90IHBrdGlmIGJpdCwgc2VlIGVycmF0YSBwdC4gNiAqLworCisJLyogbW92ZSB0byBiYW5rIDEgKi8KKwltX25pY19iZmMgKENUTF9SRUdfRUNPTjEsIEVOQ19FQ09OMV9CU0VMMSk7CisJbV9uaWNfYmZzIChDVExfUkVHX0VDT04xLCBFTkNfRUNPTjFfQlNFTDApOworCisJLyogcmVhZCBwa3RjbnQgKi8KKwlwa3RfY250ID0gbV9uaWNfcmVhZCAoQ1RMX1JFR19FUEtUQ05UKTsKKworCWlmIChwa3RfY250ID4gMCkgeworCQlpZiAoKGVpcl9yZWcgJiBFTkNfRUlSX1BLVElGKSA9PSAwKSB7CisJCQkvKnByaW50ZigiZW5jUG9sbDogcGt0IGNudCA+IDAsIGJ1dCBwa3RpZiBub3Qgc2V0XG4iKTsgKi8KKwkJfQorCQllbmNSeCAoKTsKKwkJLyogY2xlYXIgUEtUSUYgYml0IGluIEVJUiwgdGhpcyBzaG91bGQgbm90IG5lZWQgdG8gYmUgZG9uZSBidXQgaXQKKwkJICAgc2VlbXMgbGlrZSB3ZSBnZXQgcHJvYmxlbXMgaWYgd2UgZG8gbm90ICovCisJCW1fbmljX2JmYyAoQ1RMX1JFR19FSVIsIEVOQ19FSVJfUEtUSUYpOworCX0KKworCWlmIChlaXJfcmVnICYgRU5DX0VJUl9SWEVSSUYpIHsKKwkJcHJpbnRmICgiZW5jUG9sbDogcnggZXJyb3JcbiIpOworCQltX25pY19iZmMgKENUTF9SRUdfRUlSLCBFTkNfRUlSX1JYRVJJRik7CisJfQorCWlmIChlaXJfcmVnICYgRU5DX0VJUl9UWEVSSUYpIHsKKwkJcHJpbnRmICgiZW5jUG9sbDogdHggZXJyb3JcbiIpOworCQltX25pY19iZmMgKENUTF9SRUdfRUlSLCBFTkNfRUlSX1RYRVJJRik7CisJfQorCisjaWZkZWYgQ09ORklHX1VTRV9JUlEKKwkvKiBzZXQgZ2xvYmFsIGludGVycnVwdCBlbmFibGUgYml0IGluIGVuYzI4ajYwICovCisJbV9uaWNfYmZzIChDVExfUkVHX0VJRSwgRU5DX0VJRV9JTlRJRSk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgZW5jUnggKHZvaWQpCit7CisJdW5zaWduZWQgc2hvcnQgcGt0X2xlbjsKKwl1bnNpZ25lZCBzaG9ydCBjb3B5X2xlbjsKKwl1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CisJdW5zaWduZWQgY2hhciBlaXJfcmVnOworCXVuc2lnbmVkIGNoYXIgcGt0X2NudCA9IDA7CisJdW5zaWduZWQgc2hvcnQgcnhidWZfcmRwdDsKKworCS8qIHN3aXRjaCB0byBiYW5rIDAgKi8KKwltX25pY19iZmMgKENUTF9SRUdfRUNPTjEsIChFTkNfRUNPTjFfQlNFTDEgfCBFTkNfRUNPTjFfQlNFTDApKTsKKworCW1fbmljX3dyaXRlIChDVExfUkVHX0VSRFBUTCwgbmV4dF9wb2ludGVyX2xzYik7CisJbV9uaWNfd3JpdGUgKENUTF9SRUdfRVJEUFRILCBuZXh0X3BvaW50ZXJfbXNiKTsKKworCWRvIHsKKwkJbV9uaWNfcmVhZF9kYXRhICg2LCBidWZmZXIpOworCQluZXh0X3BvaW50ZXJfbHNiID0gYnVmZmVyWzBdOworCQluZXh0X3BvaW50ZXJfbXNiID0gYnVmZmVyWzFdOworCQlwa3RfbGVuID0gYnVmZmVyWzJdOworCQlwa3RfbGVuIHw9ICh1bnNpZ25lZCBzaG9ydCkgYnVmZmVyWzNdIDw8IDg7CisJCXN0YXR1cyA9IGJ1ZmZlcls0XTsKKwkJc3RhdHVzIHw9ICh1bnNpZ25lZCBzaG9ydCkgYnVmZmVyWzVdIDw8IDg7CisKKwkJaWYgKHBrdF9sZW4gPD0gRU5DX01BWF9GUk1fTEVOKQorCQkJY29weV9sZW4gPSBwa3RfbGVuOworCQllbHNlCisJCQljb3B5X2xlbiA9IDA7CisKKwkJaWYgKChzdGF0dXMgJiAoMUwgPDwgNykpID09IDApIC8qIGNoZWNrIFJlY2VpdmVkIE9rIGJpdCAqLworCQkJY29weV9sZW4gPSAwOworCisJCS8qIHRha2VuIGZyb20gdGhlIExpbnV4IGRyaXZlciAqLworCQkvKiBjaGVjayBpZiBuZXh0IHBvaW50ZXIgaXMgcmVzb25hYmxlICovCisJCWlmICgoKCh1bnNpZ25lZCBpbnQpbmV4dF9wb2ludGVyX21zYiA8PCA4KSB8CisJCQkodW5zaWduZWQgaW50KW5leHRfcG9pbnRlcl9sc2IpID49IEVOQ19UWF9CVUZfU1RBUlQpCisJCQljb3B5X2xlbiA9IDA7CisKKwkJaWYgKGNvcHlfbGVuID4gMCkgeworCQkJbV9uaWNfcmVhZF9kYXRhIChjb3B5X2xlbiwgYnVmZmVyKTsKKwkJfQorCisJCS8qIGFkdmFuY2UgcmVhZCBwb2ludGVyIHRvIG5leHQgcG9pbnRlciAqLworCQltX25pY193cml0ZSAoQ1RMX1JFR19FUkRQVEwsIG5leHRfcG9pbnRlcl9sc2IpOworCQltX25pY193cml0ZSAoQ1RMX1JFR19FUkRQVEgsIG5leHRfcG9pbnRlcl9tc2IpOworCisJCS8qIGRlY3JlYXNlIHBhY2tldCBjb3VudGVyICovCisJCW1fbmljX2JmcyAoQ1RMX1JFR19FQ09OMiwgRU5DX0VDT04yX1BLVERFQyk7CisKKwkJLyogdGFrZW4gZnJvbSB0aGUgTGludXggZHJpdmVyICovCisJCS8qIE9ubHkgb2RkIHZhbHVlcyBzaG91bGQgYmUgd3JpdHRlbiB0byBFUlhSRFBUTCwKKwkJICogc2VlIGVycmF0YSBCNCBwdC4xMworCQkgKi8KKwkJcnhidWZfcmRwdCA9IChuZXh0X3BvaW50ZXJfbXNiIDw8IDggfCBuZXh0X3BvaW50ZXJfbHNiKSAtIDE7CisJCWlmICgocnhidWZfcmRwdCA8IChtX25pY19yZWFkKENUTF9SRUdfRVJYU1RIKSA8PCA4IHwKKwkJCQltX25pY19yZWFkKENUTF9SRUdfRVJYU1RMKSkpIHx8IChyeGJ1Zl9yZHB0ID4KKwkJCQkobV9uaWNfcmVhZChDVExfUkVHX0VSWE5ESCkgPDwgOCB8CisJCQkJbV9uaWNfcmVhZChDVExfUkVHX0VSWE5ETCkpKSkgeworCQkJbV9uaWNfd3JpdGUoQ1RMX1JFR19FUlhSRFBUTCwgbV9uaWNfcmVhZChDVExfUkVHX0VSWE5ETCkpOworCQkJbV9uaWNfd3JpdGUoQ1RMX1JFR19FUlhSRFBUSCwgbV9uaWNfcmVhZChDVExfUkVHX0VSWE5ESCkpOworCQl9IGVsc2UgeworCQkJbV9uaWNfd3JpdGUoQ1RMX1JFR19FUlhSRFBUTCwgcnhidWZfcmRwdCAmIDB4RkYpOworCQkJbV9uaWNfd3JpdGUoQ1RMX1JFR19FUlhSRFBUSCwgcnhidWZfcmRwdCA+PiA4KTsKKwkJfQorCisJCS8qIG1vdmUgdG8gYmFuayAxICovCisJCW1fbmljX2JmYyAoQ1RMX1JFR19FQ09OMSwgRU5DX0VDT04xX0JTRUwxKTsKKwkJbV9uaWNfYmZzIChDVExfUkVHX0VDT04xLCBFTkNfRUNPTjFfQlNFTDApOworCisJCS8qIHJlYWQgcGt0Y250ICovCisJCXBrdF9jbnQgPSBtX25pY19yZWFkIChDVExfUkVHX0VQS1RDTlQpOworCisJCS8qIHN3aXRjaCB0byBiYW5rIDAgKi8KKwkJbV9uaWNfYmZjIChDVExfUkVHX0VDT04xLAorCQkJICAgKEVOQ19FQ09OMV9CU0VMMSB8IEVOQ19FQ09OMV9CU0VMMCkpOworCisJCWlmIChjb3B5X2xlbiA9PSAwKSB7CisJCQllaXJfcmVnID0gbV9uaWNfcmVhZCAoQ1RMX1JFR19FSVIpOworCQkJZW5jUmVjZWl2ZXJSZXNldCAoKTsKKwkJCXByaW50ZiAoImV0aF9yeDogY29weV9sZW49MFxuIik7CisJCQljb250aW51ZTsKKwkJfQorCisJCU5ldFJlY2VpdmUgKCh1bnNpZ25lZCBjaGFyICopIGJ1ZmZlciwgcGt0X2xlbik7CisKKwkJZWlyX3JlZyA9IG1fbmljX3JlYWQgKENUTF9SRUdfRUlSKTsKKwl9IHdoaWxlIChwa3RfY250KTsJLyogVXNlIEVQS1RDTlQgbm90IEVJUi5QS1RJRiBmbGFnLCBzZWUgZXJyYXRhIHB0LiA2ICovCit9CisKK3N0YXRpYyB2b2lkIGVuY1dyaXRlUmVnICh1bnNpZ25lZCBjaGFyIHJlZ05vLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJc3BpX2xvY2sgKCk7CisJZW5jX2NmZ19zcGkgKCk7CisJZW5jX2VuYWJsZSAoKTsKKworCXNwaV93cml0ZSAoMHg0MCB8IHJlZ05vKTsJLyogd3JpdGUgaW4gcmVnTm8gKi8KKwlzcGlfd3JpdGUgKGRhdGEpOworCisJZW5jX2Rpc2FibGUgKCk7CisJZW5jX2VuYWJsZSAoKTsKKworCXNwaV93cml0ZSAoMHgxZik7CS8qIHdyaXRlIHJlZyAweDFmICovCisKKwllbmNfZGlzYWJsZSAoKTsKKwlzcGlfdW5sb2NrICgpOworfQorCitzdGF0aWMgdm9pZCBlbmNXcml0ZVJlZ1JldHJ5ICh1bnNpZ25lZCBjaGFyIHJlZ05vLCB1bnNpZ25lZCBjaGFyIGRhdGEsIGludCBjKQoreworCXVuc2lnbmVkIGNoYXIgcmVhZGJhY2s7CisJaW50IGk7CisKKwlzcGlfbG9jayAoKTsKKworCWZvciAoaSA9IDA7IGkgPCBjOyBpKyspIHsKKwkJZW5jX2NmZ19zcGkgKCk7CisJCWVuY19lbmFibGUgKCk7CisKKwkJc3BpX3dyaXRlICgweDQwIHwgcmVnTm8pOwkvKiB3cml0ZSBpbiByZWdObyAqLworCQlzcGlfd3JpdGUgKGRhdGEpOworCisJCWVuY19kaXNhYmxlICgpOworCQllbmNfZW5hYmxlICgpOworCisJCXNwaV93cml0ZSAoMHgxZik7CS8qIHdyaXRlIHJlZyAweDFmICovCisKKwkJZW5jX2Rpc2FibGUgKCk7CisKKwkJc3BpX3VubG9jayAoKTsJLyogd2UgbXVzdCB1bmxvY2sgc3BpIGZpcnN0ICovCisKKwkJcmVhZGJhY2sgPSBlbmNSZWFkUmVnIChyZWdObyk7CisKKwkJc3BpX2xvY2sgKCk7CisKKwkJaWYgKHJlYWRiYWNrID09IGRhdGEpCisJCQlicmVhazsKKwl9CisJc3BpX3VubG9jayAoKTsKKworCWlmIChpID09IGMpIHsKKwkJcHJpbnRmICgiZW5jMjhqNjA6IHdyaXRlIHJlZyAlZCBmYWlsZWRcbiIsIHJlZ05vKTsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGVuY1JlYWRSZWcgKHVuc2lnbmVkIGNoYXIgcmVnTm8pCit7CisJdW5zaWduZWQgY2hhciByeEJ5dGU7CisKKwlzcGlfbG9jayAoKTsKKwllbmNfY2ZnX3NwaSAoKTsKKwllbmNfZW5hYmxlICgpOworCisJc3BpX3dyaXRlICgweDFmKTsJLyogcmVhZCByZWcgMHgxZiAqLworCisJYmFuayA9IHNwaV9yZWFkICgpICYgMHgzOworCisJZW5jX2Rpc2FibGUgKCk7CisJZW5jX2VuYWJsZSAoKTsKKworCXNwaV93cml0ZSAocmVnTm8pOworCXJ4Qnl0ZSA9IHNwaV9yZWFkICgpOworCisJLyogY2hlY2sgaWYgTUFDIG9yIE1JSSByZWdpc3RlciAqLworCWlmICgoKGJhbmsgPT0gMikgJiYgKHJlZ05vIDw9IDB4MWEpKSB8fAorCSAgICAoKGJhbmsgPT0gMykgJiYgKHJlZ05vIDw9IDB4MDUgfHwgcmVnTm8gPT0gMHgwYSkpKSB7CisJCS8qIGlnbm9yZSBmaXJzdCBieXRlIGFuZCByZWFkIGFub3RoZXIgYnl0ZSAqLworCQlyeEJ5dGUgPSBzcGlfcmVhZCAoKTsKKwl9CisKKwllbmNfZGlzYWJsZSAoKTsKKwlzcGlfdW5sb2NrICgpOworCisJcmV0dXJuIHJ4Qnl0ZTsKK30KKworc3RhdGljIHZvaWQgZW5jUmVhZEJ1ZmYgKHVuc2lnbmVkIHNob3J0IGxlbmd0aCwgdW5zaWduZWQgY2hhciAqcEJ1ZmYpCit7CisJc3BpX2xvY2sgKCk7CisJZW5jX2NmZ19zcGkgKCk7CisJZW5jX2VuYWJsZSAoKTsKKworCXNwaV93cml0ZSAoMHgyMCB8IDB4MWEpOwkvKiByZWFkIGJ1ZmZlciBtZW1vcnkgKi8KKworCXdoaWxlIChsZW5ndGgtLSkgeworCQlpZiAocEJ1ZmYgIT0gTlVMTCkKKwkJCSpwQnVmZisrID0gc3BpX3JlYWQgKCk7CisJCWVsc2UKKwkJCXNwaV93cml0ZSAoMCk7CisJfQorCisJZW5jX2Rpc2FibGUgKCk7CisJc3BpX3VubG9jayAoKTsKK30KKworc3RhdGljIHZvaWQgZW5jV3JpdGVCdWZmICh1bnNpZ25lZCBzaG9ydCBsZW5ndGgsIHVuc2lnbmVkIGNoYXIgKnBCdWZmKQoreworCXNwaV9sb2NrICgpOworCWVuY19jZmdfc3BpICgpOworCWVuY19lbmFibGUgKCk7CisKKwlzcGlfd3JpdGUgKDB4NjAgfCAweDFhKTsJLyogd3JpdGUgYnVmZmVyIG1lbW9yeSAqLworCisJc3BpX3dyaXRlICgweDAwKTsJLyogY29udHJvbCBieXRlICovCisKKwl3aGlsZSAobGVuZ3RoLS0pCisJCXNwaV93cml0ZSAoKnBCdWZmKyspOworCisJZW5jX2Rpc2FibGUgKCk7CisJc3BpX3VubG9jayAoKTsKK30KKworc3RhdGljIHZvaWQgZW5jQml0U2V0ICh1bnNpZ25lZCBjaGFyIHJlZ05vLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJc3BpX2xvY2sgKCk7CisJZW5jX2NmZ19zcGkgKCk7CisJZW5jX2VuYWJsZSAoKTsKKworCXNwaV93cml0ZSAoMHg4MCB8IHJlZ05vKTsJLyogYml0IGZpZWxkIHNldCAqLworCXNwaV93cml0ZSAoZGF0YSk7CisKKwllbmNfZGlzYWJsZSAoKTsKKwlzcGlfdW5sb2NrICgpOworfQorCitzdGF0aWMgdm9pZCBlbmNCaXRDbHIgKHVuc2lnbmVkIGNoYXIgcmVnTm8sIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlzcGlfbG9jayAoKTsKKwllbmNfY2ZnX3NwaSAoKTsKKwllbmNfZW5hYmxlICgpOworCisJc3BpX3dyaXRlICgweEEwIHwgcmVnTm8pOwkvKiBiaXQgZmllbGQgY2xlYXIgKi8KKwlzcGlfd3JpdGUgKGRhdGEpOworCisJZW5jX2Rpc2FibGUgKCk7CisJc3BpX3VubG9jayAoKTsKK30KKworc3RhdGljIHZvaWQgZW5jUmVzZXQgKHZvaWQpCit7CisJc3BpX2xvY2sgKCk7CisJZW5jX2NmZ19zcGkgKCk7CisJZW5jX2VuYWJsZSAoKTsKKworCXNwaV93cml0ZSAoMHhmZik7CS8qIHNvZnQgcmVzZXQgKi8KKworCWVuY19kaXNhYmxlICgpOworCXNwaV91bmxvY2sgKCk7CisKKwkvKiBzbGVlcCAxIG1zLiBTZWUgZXJyYXRhIHB0LiAyICovCisJdWRlbGF5ICgxMDAwKTsKK30KKworc3RhdGljIHZvaWQgZW5jSW5pdCAodW5zaWduZWQgY2hhciAqcEV0aEFkZHIpCit7CisJdW5zaWduZWQgc2hvcnQgcGhpZDEgPSAwOworCXVuc2lnbmVkIHNob3J0IHBoaWQyID0gMDsKKworCS8qIHN3aXRjaCB0byBiYW5rIDAgKi8KKwltX25pY19iZmMgKENUTF9SRUdfRUNPTjEsIChFTkNfRUNPTjFfQlNFTDEgfCBFTkNfRUNPTjFfQlNFTDApKTsKKworCS8qCisJICogU2V0dXAgdGhlIGJ1ZmZlciBzcGFjZS4gVGhlIHJlc2V0IHZhbHVlcyBhcmUgdmFsaWQgZm9yIHRoZQorCSAqIG90aGVyIHBvaW50ZXJzLgorCSAqLworCS8qIFdlIHNoYWxsIG5vdCB3cml0ZSB0byBFUlhTVCwgc2VlIGVycmF0YSBwdC4gNS4gSW5zdGVhZCB3ZQorCSAgIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgRU5DX1JYX0JVU19TVEFSVCBpcyAwLiAqLworCW1fbmljX3dyaXRlX3JldHJ5IChDVExfUkVHX0VSWFNUTCwgKEVOQ19SWF9CVUZfU1RBUlQgJiAweEZGKSwgMSk7CisJbV9uaWNfd3JpdGVfcmV0cnkgKENUTF9SRUdfRVJYU1RILCAoRU5DX1JYX0JVRl9TVEFSVCA+PiA4KSwgMSk7CisKKwkvKiB0YWtlbiBmcm9tIHRoZSBMaW51eCBkcml2ZXIgKi8KKwltX25pY193cml0ZV9yZXRyeSAoQ1RMX1JFR19FUlhOREwsIChFTkNfUlhfQlVGX0VORCAmIDB4RkYpLCAxKTsKKwltX25pY193cml0ZV9yZXRyeSAoQ1RMX1JFR19FUlhOREgsIChFTkNfUlhfQlVGX0VORCA+PiA4KSwgMSk7CisKKwltX25pY193cml0ZV9yZXRyeSAoQ1RMX1JFR19FUkRQVEwsIChFTkNfUlhfQlVGX1NUQVJUICYgMHhGRiksIDEpOworCW1fbmljX3dyaXRlX3JldHJ5IChDVExfUkVHX0VSRFBUSCwgKEVOQ19SWF9CVUZfU1RBUlQgPj4gOCksIDEpOworCisJbmV4dF9wb2ludGVyX2xzYiA9IChFTkNfUlhfQlVGX1NUQVJUICYgMHhGRik7CisJbmV4dF9wb2ludGVyX21zYiA9IChFTkNfUlhfQlVGX1NUQVJUID4+IDgpOworCisJLyogdmVyaWZ5IGlkZW50aWZpY2F0aW9uICovCisJcGhpZDEgPSBwaHlSZWFkIChQSFlfUkVHX1BISUQxKTsKKwlwaGlkMiA9IHBoeVJlYWQgKFBIWV9SRUdfUEhJRDIpOworCisJaWYgKHBoaWQxICE9IEVOQ19QSElEMV9WQUxVRQorCSAgICB8fCAocGhpZDIgJiBFTkNfUEhJRDJfTUFTSykgIT0gRU5DX1BISUQyX1ZBTFVFKSB7CisJCXByaW50ZiAoIkVSUk9SOiBmYWlsZWQgdG8gaWRlbnRpZnkgY29udHJvbGxlclxuIik7CisJCXByaW50ZiAoInBoaWQxID0gJXgsIHBoaWQyID0gJXhcbiIsCisJCQlwaGlkMSwgKHBoaWQyICYgRU5DX1BISUQyX01BU0spKTsKKwkJcHJpbnRmICgic2hvdWxkIGJlIHBoaWQxID0gJXgsIHBoaWQyID0gJXhcbiIsCisJCQlFTkNfUEhJRDFfVkFMVUUsIEVOQ19QSElEMl9WQUxVRSk7CisJfQorCisJLyoKKwkgKiAtLS0gTUFDIEluaXRpYWxpemF0aW9uIC0tLQorCSAqLworCisJLyogUHVsbCBNQUMgb3V0IG9mIFJlc2V0ICovCisKKwkvKiBzd2l0Y2ggdG8gYmFuayAyICovCisJbV9uaWNfYmZjIChDVExfUkVHX0VDT04xLCBFTkNfRUNPTjFfQlNFTDApOworCW1fbmljX2JmcyAoQ1RMX1JFR19FQ09OMSwgRU5DX0VDT04xX0JTRUwxKTsKKworCS8qIGVuYWJsZSBNQUMgdG8gcmVjZWl2ZSBmcmFtZXMgKi8KKwkvKiBhZGRlZCBzb21lIGJpdHMgZnJvbSB0aGUgTGludXggZHJpdmVyICovCisJbV9uaWNfd3JpdGVfcmV0cnkgKENUTF9SRUdfTUFDT04xCisJCSwoRU5DX01BQ09OMV9NQVJYRU4gfCBFTkNfTUFDT04xX1RYUEFVUyB8IEVOQ19NQUNPTjFfUlhQQVVTKQorCQksMTApOworCisJLyogY29uZmlndXJlIHBhZCwgdHgtY3JjIGFuZCBkdXBsZXggKi8KKwkvKiBhZGRlZCBhIGJpdCBmcm9tIHRoZSBMaW51eCBkcml2ZXIgKi8KKwltX25pY193cml0ZV9yZXRyeSAoQ1RMX1JFR19NQUNPTjMKKwkJLChFTkNfTUFDT04zX1BBRENGRzAgfCBFTkNfTUFDT04zX1RYQ1JDRU4gfCBFTkNfTUFDT04zX0ZSTUxORU4pCisJCSwxMCk7CisKKwkvKiBhZGRlZCA0IG5ldyBsaW5lcyBmcm9tIHRoZSBMaW51eCBkcml2ZXIgKi8KKwkvKiBBbGxvdyBpbmZpbml0ZSBkZWZlcmFscyBpZiB0aGUgbWVkaXVtIGlzIGNvbnRpbm91c2x5IGJ1c3kgKi8KKwltX25pY193cml0ZV9yZXRyeShDVExfUkVHX01BQ09ONCwgKDE8PDYpIC8qRU5DX01BQ09ONF9ERUZFUiovLCAxMCk7CisKKwkvKiBMYXRlIGNvbGxpc2lvbnMgb2NjdXIgYmV5b25kIDYzIGJ5dGVzICovCisJbV9uaWNfd3JpdGVfcmV0cnkoQ1RMX1JFR19NQUNMQ09OMiwgNjMsIDEwKTsKKworCS8qIFNldCAobG93IGJ5dGUpIE5vbi1CYWNrLXRvX0JhY2sgSW50ZXItUGFja2V0IEdhcC4gUmVjb21tZW5kZWQgMHgxMiAqLworCW1fbmljX3dyaXRlX3JldHJ5KENUTF9SRUdfTUFJUEdMLCAweDEyLCAxMCk7CisKKwkvKgorCSogU2V0IChoaWdoIGJ5dGUpIE5vbi1CYWNrLXRvX0JhY2sgSW50ZXItUGFja2V0IEdhcC4gUmVjb21tZW5kZWQKKwkqIDB4MGMgZm9yIGhhbGYtZHVwbGV4LiBOb3RoaW5nIGZvciBmdWxsLWR1cGxleAorCSovCisJbV9uaWNfd3JpdGVfcmV0cnkoQ1RMX1JFR19NQUlQR0gsIDB4MEMsIDEwKTsKKworCS8qIHNldCBtYXhpbXVtIGZyYW1lIGxlbmd0aCAqLworCW1fbmljX3dyaXRlX3JldHJ5IChDVExfUkVHX01BTVhGTEwsIChFTkNfTUFYX0ZSTV9MRU4gJiAweGZmKSwgMTApOworCW1fbmljX3dyaXRlX3JldHJ5IChDVExfUkVHX01BTVhGTEgsIChFTkNfTUFYX0ZSTV9MRU4gPj4gOCksIDEwKTsKKworCS8qCisJICogU2V0IE1BQyBiYWNrLXRvLWJhY2sgaW50ZXItcGFja2V0IGdhcC4gUmVjb21tZW5kZWQgMHgxMiBmb3IgaGFsZiBkdXBsZXgKKwkgKiBhbmQgMHgxNSBmb3IgZnVsbCBkdXBsZXguCisJICovCisJbV9uaWNfd3JpdGVfcmV0cnkgKENUTF9SRUdfTUFCQklQRywgMHgxMiwgMTApOworCisJLyogc2V0IE1BQyBhZGRyZXNzICovCisKKwkvKiBzd2l0Y2ggdG8gYmFuayAzICovCisJbV9uaWNfYmZzIChDVExfUkVHX0VDT04xLCAoRU5DX0VDT04xX0JTRUwwIHwgRU5DX0VDT04xX0JTRUwxKSk7CisKKwltX25pY193cml0ZV9yZXRyeSAoQ1RMX1JFR19NQUFEUjAsIHBFdGhBZGRyWzVdLCAxKTsKKwltX25pY193cml0ZV9yZXRyeSAoQ1RMX1JFR19NQUFEUjEsIHBFdGhBZGRyWzRdLCAxKTsKKwltX25pY193cml0ZV9yZXRyeSAoQ1RMX1JFR19NQUFEUjIsIHBFdGhBZGRyWzNdLCAxKTsKKwltX25pY193cml0ZV9yZXRyeSAoQ1RMX1JFR19NQUFEUjMsIHBFdGhBZGRyWzJdLCAxKTsKKwltX25pY193cml0ZV9yZXRyeSAoQ1RMX1JFR19NQUFEUjQsIHBFdGhBZGRyWzFdLCAxKTsKKwltX25pY193cml0ZV9yZXRyeSAoQ1RMX1JFR19NQUFEUjUsIHBFdGhBZGRyWzBdLCAxKTsKKworCS8qCisJKiBQSFkgSW5pdGlhbGl6YXRpb24gdGFrZW4gZnJvbSB0aGUgTGludXggZHJpdmVyCisJICovCisKKwkvKiBQcmV2ZW50IGF1dG9tYXRpYyBsb29wYmFjayBvZiBkYXRhIGJlZWluZyB0cmFuc21pdHRlZCBieSBzZXR0aW5nCisJICAgRU5DX1BIQ09OMl9IRExESVMgKi8KKwlwaHlXcml0ZShQSFlfUkVHX1BIQ09OMiwgKDE8PDgpKTsKKworCS8qIExFRHMgY29uZmlndXJhdGlvbgorCSAqIExFREE6IExBQ0ZHID0gMDEwMCAtPiBkaXNwbGF5IGxpbmsgc3RhdHVzCisJICogTEVEQjogTEJDRkcgPSAwMTExIC0+IGRpc3BsYXkgVFggJiBSWCBhY3Rpdml0eQorCSAqIFNUUkNIID0gMSAtPiBMRUQgcHVsc2VzCisJICovCisJcGh5V3JpdGUoUEhZX1JFR19QSExDT04sIDB4MDQ3Mik7CisKKwkvKiBSZXNldCBQRFBYTUQtYml0ID0+IGhhbGYgZHVwbGV4ICovCisJcGh5V3JpdGUoUEhZX1JFR19QSENPTjEsIDApOworCisJLyoKKwkgKiBSZWNlaXZlIHNldHRpbmdzCisJICovCisKKyNpZmRlZiBDT05GSUdfVVNFX0lSUQorCS8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJbV9uaWNfYmZzIChDVExfUkVHX0VJRSwgRU5DX0VJRV9QS1RJRSk7CisJbV9uaWNfYmZzIChDVExfUkVHX0VJRSwgRU5DX0VJRV9UWElFKTsKKwltX25pY19iZnMgKENUTF9SRUdfRUlFLCBFTkNfRUlFX1JYRVJJRSk7CisJbV9uaWNfYmZzIChDVExfUkVHX0VJRSwgRU5DX0VJRV9UWEVSSUUpOworCW1fbmljX2JmcyAoQ1RMX1JFR19FSUUsIEVOQ19FSUVfSU5USUUpOworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgUmVhZCBQSFkgcmVnaXN0ZXJzLgorICoKKyAqICAgIE5PVEUhIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGFuZ2UgdG8gQmFuayAyLgorICoKKyAqIFBhcmFtczoKKyAqICAgIFtpbl0gYWRkciBhZGRyZXNzIG9mIHRoZSByZWdpc3RlciB0byByZWFkCisgKgorICogUmV0dXJuczoKKyAqICAgIFRoZSB2YWx1ZSBpbiB0aGUgcmVnaXN0ZXIKKyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IHBoeVJlYWQgKHVuc2lnbmVkIGNoYXIgYWRkcikKK3sKKwl1bnNpZ25lZCBzaG9ydCByZXQgPSAwOworCisJLyogbW92ZSB0byBiYW5rIDIgKi8KKwltX25pY19iZmMgKENUTF9SRUdfRUNPTjEsIEVOQ19FQ09OMV9CU0VMMCk7CisJbV9uaWNfYmZzIChDVExfUkVHX0VDT04xLCBFTkNfRUNPTjFfQlNFTDEpOworCisJLyogd3JpdGUgYWRkcmVzcyB0byBNSVJFR0FEUiAqLworCW1fbmljX3dyaXRlIChDVExfUkVHX01JUkVHQURSLCBhZGRyKTsKKworCS8qIHNldCBNSUNNRC5NSUlSRCAqLworCW1fbmljX3dyaXRlIChDVExfUkVHX01JQ01ELCBFTkNfTUlDTURfTUlJUkQpOworCisJLyogdGFrZW4gZnJvbSB0aGUgTGludXggZHJpdmVyICovCisJLyogbW92ZSB0byBiYW5rIDMgKi8KKwltX25pY19iZnMoQ1RMX1JFR19FQ09OMSwgRU5DX0VDT04xX0JTRUwwKTsKKwltX25pY19iZnMoQ1RMX1JFR19FQ09OMSwgRU5DX0VDT04xX0JTRUwxKTsKKworCS8qIHBvbGwgTUlTVEFULkJVU1kgYml0IHVudGlsIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSAqLworCXdoaWxlICgobV9uaWNfcmVhZCAoQ1RMX1JFR19NSVNUQVQpICYgRU5DX01JU1RBVF9CVVNZKSAhPSAwKSB7CisJCXN0YXRpYyBpbnQgY250ID0gMDsKKworCQlpZiAoY250KysgPj0gMTAwMCkgeworCQkJLyogR0ogLSB0aGlzIHNlZW1zIGV4dHJlbWVseSBkYW5nZXJvdXMhICovCisJCQkvKiBwcmludGYoIiMiKTsgKi8KKwkJCWNudCA9IDA7CisJCX0KKwl9CisKKwkvKiB0YWtlbiBmcm9tIHRoZSBMaW51eCBkcml2ZXIgKi8KKwkvKiBtb3ZlIHRvIGJhbmsgMiAqLworCW1fbmljX2JmYyhDVExfUkVHX0VDT04xLCBFTkNfRUNPTjFfQlNFTDApOworCW1fbmljX2JmcyhDVExfUkVHX0VDT04xLCBFTkNfRUNPTjFfQlNFTDEpOworCisJLyogY2xlYXIgTUlDTUQuTUlJUkQgKi8KKwltX25pY193cml0ZSAoQ1RMX1JFR19NSUNNRCwgMCk7CisKKwlyZXQgPSAobV9uaWNfcmVhZCAoQ1RMX1JFR19NSVJESCkgPDwgOCk7CisJcmV0IHw9IChtX25pY19yZWFkIChDVExfUkVHX01JUkRMKSAmIDB4RkYpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGFrZW4gZnJvbSB0aGUgTGludXggZHJpdmVyLgorICogRGVzY3JpcHRpb246CisgKiBXcml0ZSBQSFkgcmVnaXN0ZXJzLgorICoKKyAqIE5PVEUhIFRoaXMgZnVuY3Rpb24gd2lsbCBjaGFuZ2UgdG8gQmFuayAzLgorICoKKyAqIFBhcmFtczoKKyAqIFtpbl0gYWRkciBhZGRyZXNzIG9mIHRoZSByZWdpc3RlciB0byB3cml0ZSB0bworICogW2luXSBkYXRhIHRvIGJlIHdyaXR0ZW4KKyAqCisgKiBSZXR1cm5zOgorICogICAgTm9uZQorICovCitzdGF0aWMgdm9pZCBwaHlXcml0ZSh1bnNpZ25lZCBjaGFyIGFkZHIsIHVuc2lnbmVkIHNob3J0IGRhdGEpCit7CisJLyogbW92ZSB0byBiYW5rIDIgKi8KKwltX25pY19iZmMoQ1RMX1JFR19FQ09OMSwgRU5DX0VDT04xX0JTRUwwKTsKKwltX25pY19iZnMoQ1RMX1JFR19FQ09OMSwgRU5DX0VDT04xX0JTRUwxKTsKKworCS8qIHdyaXRlIGFkZHJlc3MgdG8gTUlSRUdBRFIgKi8KKwltX25pY193cml0ZShDVExfUkVHX01JUkVHQURSLCBhZGRyKTsKKworCW1fbmljX3dyaXRlKENUTF9SRUdfTUlXUkwsIGRhdGEgJiAweGZmKTsKKwltX25pY193cml0ZShDVExfUkVHX01JV1JILCBkYXRhID4+IDgpOworCisJLyogbW92ZSB0byBiYW5rIDMgKi8KKwltX25pY19iZnMoQ1RMX1JFR19FQ09OMSwgRU5DX0VDT04xX0JTRUwwKTsKKwltX25pY19iZnMoQ1RMX1JFR19FQ09OMSwgRU5DX0VDT04xX0JTRUwxKTsKKworCS8qIHBvbGwgTUlTVEFULkJVU1kgYml0IHVudGlsIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSAqLworCXdoaWxlKChtX25pY19yZWFkKENUTF9SRUdfTUlTVEFUKSAmIEVOQ19NSVNUQVRfQlVTWSkgIT0gMCkgeworCQlzdGF0aWMgaW50IGNudCA9IDA7CisKKwkJaWYoY250KysgPj0gMTAwMCkgeworCQkJY250ID0gMDsKKwkJfQorCX0KK30KKworI2VuZGlmIC8qIENPTkZJR19FTkMyOEo2MCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mc2xfaTJjLmMgYi9kcml2ZXJzL2ZzbF9pMmMuYwppbmRleCBlYmFlNWFmLi4yMjQ4NWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZzbF9pMmMuYworKysgYi9kcml2ZXJzL2ZzbF9pMmMuYwpAQCAtNjksOSArNjksMTAgQEAKIAlkZXYgPSAoc3RydWN0IGZzbF9pMmMgKikgKENGR19JTU1SICsgQ0ZHX0kyQzJfT0ZGU0VUKTsKIAogCXdyaXRlYigwLCAmZGV2LT5jcik7CQkJLyogc3RvcCBJMkMgY29udHJvbGxlciAqLworCXVkZWxheSg1KTsJCQkJLyogbGV0IGl0IHNodXRkb3duIGluIHBlYWNlICovCiAJd3JpdGViKDB4M0YsICZkZXYtPmZkcik7CQkvKiBzZXQgYnVzIHNwZWVkICovCiAJd3JpdGViKDB4M0YsICZkZXYtPmRmc3JyKTsJCS8qIHNldCBkZWZhdWx0IGZpbHRlciAqLwotCXdyaXRlYihzbGF2ZWFkZCwgJmRldi0+YWRyKTsJCS8qIHdyaXRlIHNsYXZlIGFkZHJlc3MgKi8KKwl3cml0ZWIoc2xhdmVhZGQgPDwgMSwgJmRldi0+YWRyKTsJLyogd3JpdGUgc2xhdmUgYWRkcmVzcyAqLwogCXdyaXRlYigweDAsICZkZXYtPnNyKTsJCQkvKiBjbGVhciBzdGF0dXMgcmVnaXN0ZXIgKi8KIAl3cml0ZWIoSTJDX0NSX01FTiwgJmRldi0+Y3IpOwkJLyogc3RhcnQgSTJDIGNvbnRyb2xsZXIgKi8KICNlbmRpZgkvKiBDRkdfSTJDMl9PRkZTRVQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnNsX3BjaV9pbml0LmMgYi9kcml2ZXJzL2ZzbF9wY2lfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwODRkYzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2ZzbF9wY2lfaW5pdC5jCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDT05GSUdfRlNMX1BDSV9JTklUCisKKy8qCisgKiBQQ0kvUENJRSBDb250cm9sbGVyIGluaXRpYWxpemF0aW9uIGZvciBtcGM4NXh4L21wYzg2eHggc29jJ3MKKyAqCisgKiBJbml0aWFsaXplIGNvbnRyb2xsZXIgYW5kIGNhbGwgdGhlIGNvbW1vbiBkcml2ZXIvcGNpIHBjaV9ob3NlX3NjYW4gdG8KKyAqIHNjYW4gZm9yIGJyaWRnZXMgYW5kIGRldmljZXMuCisgKgorICogSG9zZSBmaWVsZHMgd2hpY2ggbmVlZCB0byBiZSBwcmUtaW5pdGlhbGl6ZWQgYnkgYm9hcmQgc3BlY2lmaWMgY29kZToKKyAqICAgcmVnaW9uc1tdCisgKiAgIGZpcnN0X2J1c25vCisgKgorICogRmllbGRzIHVwZGF0ZWQ6CisgKiAgIGxhc3RfYnVzbm8KKyAqLworCisjaW5jbHVkZSA8cGNpLmg+CisjaW5jbHVkZSA8YXNtL2ltbWFwX2ZzbF9wY2kuaD4KKwordm9pZCBwY2lhdXRvX3ByZXNjYW5fc2V0dXBfYnJpZGdlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCQlwY2lfZGV2X3QgZGV2LCBpbnQgc3ViX2J1cyk7Cit2b2lkIHBjaWF1dG9fcG9zdHNjYW5fc2V0dXBfYnJpZGdlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCQlwY2lfZGV2X3QgZGV2LCBpbnQgc3ViX2J1cyk7CisKK3ZvaWQgcGNpYXV0b19jb25maWdfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpOwordm9pZAorZnNsX3BjaV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKK3sKKwl1MTYgdGVtcDE2OworCXUzMiB0ZW1wMzI7CisJaW50IGJ1c25vID0gaG9zZS0+Zmlyc3RfYnVzbm87CisJaW50IGVuYWJsZWQ7CisJdTE2IGx0c3NtOworCXU4IHRlbXA4OworCWludCByOworCWludCBicmlkZ2U7CisJdm9sYXRpbGUgY2Nzcl9mc2xfcGNpX3QgKnBjaSA9IChjY3NyX2ZzbF9wY2lfdCAqKSBob3NlLT5jZmdfYWRkcjsKKwlwY2lfZGV2X3QgZGV2ID0gUENJX0JERihidXNubywwLDApOworCisJLyogSW5pdGlhbGl6ZSBBVE1VIHJlZ2lzdGVycyBiYXNlZCBvbiBob3NlIHJlZ2lvbnMgYW5kIGZsYWdzICovCisJdm9sYXRpbGUgcG90X3QgKnBvPSZwY2ktPnBvdFsxXTsJLyogc2tpcCAwICovCisJdm9sYXRpbGUgcGl0X3QgKnBpPSZwY2ktPnBpdFswXTsJLyogcmFuZ2VzIGZyb206IDMgdG8gMSAqLworCisjaWZkZWYgREVCVUcKKwlpbnQgbmVnX2xpbmtfdzsKKyNlbmRpZgorCisJZm9yIChyPTA7IHI8aG9zZS0+cmVnaW9uX2NvdW50OyByKyspIHsKKwkJaWYgKGhvc2UtPnJlZ2lvbnNbcl0uZmxhZ3MgJiBQQ0lfUkVHSU9OX01FTU9SWSkgeyAvKiBpbmJvdW5kICovCisJCQlwaS0+cGl0YXIgPSAoaG9zZS0+cmVnaW9uc1tyXS5idXNfc3RhcnQgPj4gMTIpICYgMHgwMDBmZmZmZjsKKwkJCXBpLT5waXdiYXIgPSAoaG9zZS0+cmVnaW9uc1tyXS5waHlzX3N0YXJ0ID4+IDEyKSAmIDB4MDAwZmZmZmY7CisJCQlwaS0+cGl3YmVhciA9IDA7CisJCQlwaS0+cGl3YXIgPSBQSVdBUl9FTiB8IFBJV0FSX1BGIHwgUElXQVJfTE9DQUwgfAorCQkJCVBJV0FSX1JFQURfU05PT1AgfCBQSVdBUl9XUklURV9TTk9PUCB8CisJCQkJKF9faWxvZzIoaG9zZS0+cmVnaW9uc1tyXS5zaXplKSAtIDEpOworCQkJcGkrKzsKKwkJfSBlbHNlIHsgLyogT3V0Ym91bmQgKi8KKwkJCXBvLT5wb3diYXIgPSAoaG9zZS0+cmVnaW9uc1tyXS5waHlzX3N0YXJ0ID4+IDEyKSAmIDB4MDAwZmZmZmY7CisJCQlwby0+cG90YXIgPSAoaG9zZS0+cmVnaW9uc1tyXS5idXNfc3RhcnQgPj4gMTIpICYgMHgwMDBmZmZmZjsKKwkJCXBvLT5wb3RlYXIgPSAwOworCQkJaWYgKGhvc2UtPnJlZ2lvbnNbcl0uZmxhZ3MgJiBQQ0lfUkVHSU9OX0lPKQorCQkJCXBvLT5wb3dhciA9IFBPV0FSX0VOIHwgUE9XQVJfSU9fUkVBRCB8IFBPV0FSX0lPX1dSSVRFIHwKKwkJCQkJKF9faWxvZzIoaG9zZS0+cmVnaW9uc1tyXS5zaXplKSAtIDEpOworCQkJZWxzZQorCQkJCXBvLT5wb3dhciA9IFBPV0FSX0VOIHwgUE9XQVJfTUVNX1JFQUQgfCBQT1dBUl9NRU1fV1JJVEUgfAorCQkJCQkoX19pbG9nMihob3NlLT5yZWdpb25zW3JdLnNpemUpIC0gMSk7CisJCQlwbysrOworCQl9CisJfQorCisJcGNpX3JlZ2lzdGVyX2hvc2UoaG9zZSk7CisJcGNpYXV0b19jb25maWdfaW5pdChob3NlKTsJLyogZ3JhYiBwY2lfe21lbSxwcmVmZXRjaCxpb30gKi8KKwlob3NlLT5jdXJyZW50X2J1c25vID0gaG9zZS0+Zmlyc3RfYnVzbm87CisKKwlwY2ktPnBlZHIgPSAweGZmZmZmZmZmOwkJLyogQ2xlYXIgYW55IGVycm9ycyAqLworCXBjaS0+cGVlciA9IH4weDIwMTQwOwkJLyogRW5hYmxlIEFsbCBFcnJvciBJbnRlcnVwdHMgZXhjZXB0CisJCQkJCSAqIC0gTWFzdGVyIGFib3J0IChwY2kpCisJCQkJCSAqIC0gTWFzdGVyIFBFUlIgKHBjaSkKKwkJCQkJICogLSBJQ0NBIChQQ0llKQorCQkJCQkgKi8KKwlwY2lfaG9zZV9yZWFkX2NvbmZpZ19kd29yZCAoaG9zZSwgZGV2LCBQQ0lfRENSLCAmdGVtcDMyKTsKKwl0ZW1wMzIgfD0gMHhmMDAwZTsJCS8qIHNldCBVUlIsIEZFUiwgTkZFUiAoYnV0IG5vdCBDRVIpICovCisJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIGRldiwgUENJX0RDUiwgdGVtcDMyKTsKKworCXBjaV9ob3NlX3JlYWRfY29uZmlnX2J5dGUgKGhvc2UsIGRldiwgUENJX0hFQURFUl9UWVBFLCAmdGVtcDgpOworCWJyaWRnZSA9IHRlbXA4ICYgUENJX0hFQURFUl9UWVBFX0JSSURHRTsgLyogQnJpZGdlLCBzdWNoIGFzIHBjaWUgKi8KKworCWlmICggYnJpZGdlICkgeworCisJCXBjaV9ob3NlX3JlYWRfY29uZmlnX3dvcmQoaG9zZSwgZGV2LCBQQ0lfTFRTU00sICZsdHNzbSk7CisJCWVuYWJsZWQgPSBsdHNzbSA+PSBQQ0lfTFRTU01fTDA7CisKKwkJaWYgKCFlbmFibGVkKSB7CisJCQlkZWJ1ZygiLi4uLlBDSUUgbGluayBlcnJvci4gIFNraXBwaW5nIHNjYW4uIgorCQkJICAgICAgIkxUU1NNPTB4JTAyeFxuIiwgbHRzc20pOworCQkJaG9zZS0+bGFzdF9idXNubyA9IGhvc2UtPmZpcnN0X2J1c25vOworCQkJcmV0dXJuOworCQl9CisKKwkJcGNpLT5wbWVfbXNnX2RldCA9IDB4ZmZmZmZmZmY7CisJCXBjaS0+cG1lX21zZ19pbnRfZW4gPSAweGZmZmZmZmZmOworI2lmZGVmIERFQlVHCisJCXBjaV9ob3NlX3JlYWRfY29uZmlnX3dvcmQoaG9zZSwgZGV2LCBQQ0lfTFNSLCAmdGVtcDE2KTsKKwkJbmVnX2xpbmtfdyA9ICh0ZW1wMTYgJiAweDNmMCApID4+IDQ7CisJCXByaW50ZigiLi4uUENJRSBMVFNTTT0weCV4LCBOZWdvdGlhdGVkIGxpbmsgd2lkdGg9JWRcbiIsCisJCSAgICAgIGx0c3NtLCBuZWdfbGlua193KTsKKyNlbmRpZgorCQlob3NlLT5jdXJyZW50X2J1c25vKys7IC8qIFN0YXJ0IHNjYW4gd2l0aCBzZWNvbmRhcnkgKi8KKwkJcGNpYXV0b19wcmVzY2FuX3NldHVwX2JyaWRnZShob3NlLCBkZXYsIGhvc2UtPmN1cnJlbnRfYnVzbm8pOworCisJfQorCisJLyogQ2FsbCBzZXR1cCB0byBhbGxvY2F0ZSBQQ1NSQkFSIHdpbmRvdyAqLworCXBjaWF1dG9fc2V0dXBfZGV2aWNlKGhvc2UsIGRldiwgMSwgaG9zZS0+cGNpX21lbSwKKwkJCSAgICAgaG9zZS0+cGNpX3ByZWZldGNoLCBob3NlLT5wY2lfaW8pOworI2lmbmRlZiBDT05GSUdfUENJX05PU0NBTgorCXByaW50ZiAoIiAgICAgICAgICAgICAgIFNjYW5uaW5nIFBDSSBidXMgJTAyeFxuIiwgaG9zZS0+Y3VycmVudF9idXNubyk7CisJaG9zZS0+bGFzdF9idXNubyA9IHBjaV9ob3NlX3NjYW5fYnVzKGhvc2UsaG9zZS0+Y3VycmVudF9idXNubyk7CisKKwlpZiAoIGJyaWRnZSApIHsgLyogdXBkYXRlIGxpbWl0IHJlZ3MgYW5kIHN1Ym9yZGluYXRlIGJ1c25vICovCisJCXBjaWF1dG9fcG9zdHNjYW5fc2V0dXBfYnJpZGdlKGhvc2UsIGRldiwgaG9zZS0+bGFzdF9idXNubyk7CisJfQorI2Vsc2UKKwlob3NlLT5sYXN0X2J1c25vID0gaG9zZS0+Y3VycmVudF9idXNubzsKKyNlbmRpZgorCisJLyogQ2xlYXIgYWxsIGVycm9yIGluZGljYXRpb25zICovCisKKwlwY2ktPnBtZV9tc2dfZGV0ID0gMHhmZmZmZmZmZjsKKwlwY2ktPnBlZHIgPSAweGZmZmZmZmZmOworCisJcGNpX2hvc2VfcmVhZF9jb25maWdfd29yZCAoaG9zZSwgZGV2LCBQQ0lfRFNSLCAmdGVtcDE2KTsKKwlpZiAodGVtcDE2KSB7CisJCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIGRldiwKKwkJCQkJUENJX0RTUiwgMHhmZmZmKTsKKwl9CisKKwlwY2lfaG9zZV9yZWFkX2NvbmZpZ193b3JkIChob3NlLCBkZXYsIFBDSV9TRUNfU1RBVFVTLCAmdGVtcDE2KTsKKwlpZiAodGVtcDE2KSB7CisJCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIGRldiwgUENJX1NFQ19TVEFUVVMsIDB4ZmZmZik7CisJfQorfQorCisjZW5kaWYgLyogQ09ORklHX0ZTTF9QQ0kgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5jYS1pcF9zdy5jIGIvZHJpdmVycy9pbmNhLWlwX3N3LmMKaW5kZXggYWIyMmI0ZC4uZTRhYWVkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmNhLWlwX3N3LmMKKysrIGIvZHJpdmVycy9pbmNhLWlwX3N3LmMKQEAgLTI2LDggKzI2LDggQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpIFwKLQkmJiBkZWZpbmVkKENPTkZJR19JTkNBX0lQX1NXSVRDSCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSBcCisJJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAmJiBkZWZpbmVkKENPTkZJR19JTkNBX0lQX1NXSVRDSCkKIAogI2luY2x1ZGUgPG1hbGxvYy5oPgogI2luY2x1ZGUgPG5ldC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc3AxMTZ4LWhjZC5jIGIvZHJpdmVycy9pc3AxMTZ4LWhjZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMmJjN2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lzcDExNngtaGNkLmMKQEAgLTAsMCArMSwxNDEzIEBACisvKgorICogSVNQMTE2eCBIQ0QgKEhvc3QgQ29udHJvbGxlciBEcml2ZXIpIGZvciB1LWJvb3QuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgUm9kb2xmbyBHaW9tZXR0aSA8Z2lvbWV0dGlAbGludXguaXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBFdXJvdGVjaCBTLnAuQS4gPGluZm9AZXVyb3RlY2guaXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICoKKyAqIERlcml2ZWQgaW4gcGFydCBmcm9tIHRoZSBTTDgxMSBIQ0QgZHJpdmVyICJ1LWJvb3QvZHJpdmVycy9zbDgxMV91c2IuYyIKKyAqIChvcmlnaW5hbCBjb3B5cmlnaHQgbWVzc2FnZSBmb2xsb3dzKToKKyAqCisgKiAgICAoQykgQ29weXJpZ2h0IDIwMDQKKyAqICAgIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogICAgVGhpcyBjb2RlIGlzIGJhc2VkIG9uIGxpbnV4IGRyaXZlciBmb3Igc2w4MTFocyBjaGlwLCBzb3VyY2UgYXQKKyAqICAgIGRyaXZlcnMvdXNiL2hvc3Qvc2w4MTEuYzoKKyAqCisgKiAgICBTTDgxMSBIb3N0IENvbnRyb2xsZXIgSW50ZXJmYWNlIGRyaXZlciBmb3IgVVNCLgorICoKKyAqICAgIENvcHlyaWdodCAoYykgMjAwMy8wNiwgQ291cmFnZSBDby4sIEx0ZC4KKyAqCisgKiAgICBCYXNlZCBvbjoKKyAqICAgICAgICAgMS51aGNpLmMgYnkgTGludXMgVG9ydmFsZHMsIEpvaGFubmVzIEVyZGZlbHQsIFJhbmR5IER1bmxhcCwKKyAqICAgICAgICAgICBHZW9yZyBBY2hlciwgRGV0aSBGbGllZ2wsIFRob21hcyBTYWlsZXIsIFJvbWFuIFdlaXNzZ2FlcmJlciwKKyAqICAgICAgICAgICBBZGFtIFJpY2h0ZXIsIEdyZWdvcnkgUC4gU21pdGg7CisgKiAgICAgICAgIDIuT3JpZ2luYWwgU0w4MTEgZHJpdmVyIChoY19zbDgxMS5vKSBieSBQZWkgTGl1IDxwYmxAY3lwcmVzcy5jb20+CisgKiAgICAgICAgIDMuUmV3cml0ZWQgYXMgc2w4MTEubyBieSBZaW4gQWlodWEgPHlpbmFoOmNvdXJhZ2V0ZWNoLmNvbS5jbj4KKyAqCisgKiAgICBbW0dOVS9HUEwgZGlzY2xhaW1lcl1dCisgKgorICogYW5kIGluIHBhcnQgZnJvbSBBVTF4MDAgT0hDSSBIQ0QgZHJpdmVyICJ1LWJvb3QvY3B1L21pcHMvYXUxeDAwX3VzYl9vaGNpLmMiCisgKiAob3JpZ2luYWwgY29weXJpZ2h0IG1lc3NhZ2UgZm9sbG93cyk6CisgKgorICogICAgVVJCIE9IQ0kgSENEIChIb3N0IENvbnRyb2xsZXIgRHJpdmVyKSBmb3IgVVNCIG9uIHRoZSBBVTF4MDAuCisgKgorICogICAgKEMpIENvcHlyaWdodCAyMDAzCisgKiAgICBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZyA8Z2pAZGVueC5kZT4KKyAqCisgKiAgICBbW0dOVS9HUEwgZGlzY2xhaW1lcl1dCisgKgorICogICAgTm90ZTogUGFydCBvZiB0aGlzIGNvZGUgaGFzIGJlZW4gZGVyaXZlZCBmcm9tIGxpbnV4CisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWZkZWYgQ09ORklHX1VTQl9JU1AxMTZYX0hDRAorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPHVzYi5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworLyoKKyAqIElTUDExNnggY2hpcHMgcmVxdWlyZSBjZXJ0YWluIGRlbGF5cyBiZXR3ZWVuIGFjY2Vzc2VzIHRvIGl0cworICogcmVnaXN0ZXJzLiBUaGUgZm9sbG93aW5nIHRpbWluZyBvcHRpb25zIGV4aXN0LgorICoKKyAqIDEuIENvbmZpZ3VyZSB5b3VyIG1lbW9yeSBjb250cm9sbGVyICh0aGUgYmVzdCkKKyAqIDIuIFVzZSBuZGVsYXkgKGVhc2llc3QsIHBvb3Jlc3QpLiBGb3IgdGhhdCwgZW5hYmxlIHRoZSBmb2xsb3dpbmcgbWFjcm8uCisgKgorICogVmFsdWUgaXMgaW4gbWljcm9zZWNvbmRzLgorICovCisjaWZkZWYgSVNQMTE2WF9IQ0RfVVNFX1VERUxBWQorI2RlZmluZSBVREVMQVkJCTEKKyNlbmRpZgorCisvKgorICogT24gc29tZSAoc2xvd2x5PykgbWFjaGluZXMgYW4gZXh0cmEgZGVsYXkgYWZ0ZXIgZGF0YSBwYWNraW5nIGludG8KKyAqIGNvbnRyb2xsZXIncyBGSUZPcyBpcyByZXF1aXJlZCwgKiBvdGhlcndpc2UgeW91IG1heSBnZXQgdGhlIGZvbGxvd2luZworICogZXJyb3I6CisgKgorICogICB1Ym9vdD4gdXNiIHN0YXJ0CisgKiAgIChSZSlzdGFydCBVU0IuLi4KKyAqICAgVVNCOiAgIHNjYW5uaW5nIGJ1cyBmb3IgZGV2aWNlcy4uLiBpc3AxMTZ4OiBpc3AxMTZ4X3N1Ym1pdF9qb2I6IENUTDpUSU1FT1VUCisgKiAgIGlzcDExNng6IGlzcDExNnhfc3VibWl0X2pvYjogKioqKioqIEZJRk8gbm90IHJlYWR5ISAqKioqKioKKyAqCisgKiAgICAgICAgIFVTQiBkZXZpY2Ugbm90IHJlc3BvbmRpbmcsIGdpdmluZyB1cCAoc3RhdHVzPTQpCisgKiAgICAgICAgIGlzcDExNng6IGlzcDExNnhfc3VibWl0X2pvYjogKioqKioqIEZJRk8gbm90IGVtcHR5ISAqKioqKioKKyAqICAgICAgICAgaXNwMTE2eDogaXNwMTE2eF9zdWJtaXRfam9iOiAqKioqKiogRklGTyBub3QgZW1wdHkhICoqKioqKgorICogICAgICAgICBpc3AxMTZ4OiBpc3AxMTZ4X3N1Ym1pdF9qb2I6ICoqKioqKiBGSUZPIG5vdCBlbXB0eSEgKioqKioqCisgKiAgICAgICAgIDMgVVNCIERldmljZShzKSBmb3VuZAorICogICAgICAgICAgICAgICAgc2Nhbm5pbmcgYnVzIGZvciBzdG9yYWdlIGRldmljZXMuLi4gMCBTdG9yYWdlIERldmljZShzKSBmb3VuZAorICoKKyAqIFZhbHVlIGlzIGluIG1pbGxpc2Vjb25kcy4KKyAqLworI2lmZGVmIElTUDExNlhfSENEX1VTRV9FWFRSQV9ERUxBWQorI2RlZmluZSBFWFRSQV9ERUxBWQkyCisjZW5kaWYKKworLyoKKyAqIEVuYWJsZSB0aGUgZm9sbG93aW5nIGRlZmluZXMgaWYgeW91IHdpc2ggZW5hYmxlIGRlYnVnZ2luZyBtZXNzYWdlcy4KKyAqLworI3VuZGVmIERFQlVHCQkJLyogZW5hYmxlIGRlYnVnZ2luZyBtZXNzYWdlcyAqLworI3VuZGVmIFRSQUNFCQkJLyogZW5hYmxlIHRyYWNpbmcgY29kZSAqLworI3VuZGVmIFZFUkJPU0UJCQkvKiB2ZXJib3NlIGRlYnVnZ2luZyBtZXNzYWdlcyAqLworCisjaW5jbHVkZSAiaXNwMTE2eC5oIgorCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCSIwOCBKYW4gMjAwNyIKK3N0YXRpYyBjb25zdCBjaGFyIGhjZF9uYW1lW10gPSAiaXNwMTE2eC1oY2QiOworCitzdHJ1Y3QgaXNwMTE2eCBpc3AxMTZ4X2RldjsKK3N0cnVjdCBpc3AxMTZ4X3BsYXRmb3JtX2RhdGEgaXNwMTE2eF9ib2FyZDsKK2ludCBnb3RfcmhzYyA9IDA7CQkvKiByb290IGh1YiBzdGF0dXMgY2hhbmdlICovCitzdHJ1Y3QgdXNiX2RldmljZSAqZGV2Z29uZTsJLyogZGV2aWNlIHdoaWNoIHdhcyBkaXNjb25uZWN0ZWQgKi8KK2ludCByaF9kZXZudW0gPSAwOwkJLyogYWRkcmVzcyBvZiBSb290IEh1YiBlbmRwb2ludCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgQUxJR04oeCxhKQkoKCh4KSsoYSktMVVMKSZ+KChhKS0xVUwpKQorI2RlZmluZSBtaW5fdCh0eXBlLHgseSkJXAorCSh7IHR5cGUgX194ID0gKHgpOyB0eXBlIF9feSA9ICh5KTsgX194IDwgX195ID8gX194IDogX195OyB9KQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgaXNwMTE2eF9yZXNldChzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCk7CisKKy8qIC0tLSBEZWJ1Z2dpbmcgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBpc3AxMTZ4X3Nob3dfcmVnKGQsIHIpIHsJCQkJXAorCWlmICgocikgPCAweDIwKSB7CQkJCQlcCisJCURCRygiJS0xMnNbJTAyeF06ICUwOHgiLCAjciwJCQlcCisJCQlyLCBpc3AxMTZ4X3JlYWRfcmVnMzIoZCwgcikpOwkJXAorCX0gZWxzZSB7CQkJCQkJXAorCQlEQkcoIiUtMTJzWyUwMnhdOiAgICAgJTA0eCIsICNyLAkJXAorCQkJciwgaXNwMTE2eF9yZWFkX3JlZzE2KGQsIHIpKTsgIAkJXAorCX0JCQkJCQkJXAorfQorCisjZGVmaW5lIGlzcDExNnhfc2hvd19yZWdzKGQpIHsJCQkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDUkVWSVNJT04pOwkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDQ09OVFJPTCk7CQkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDQ01EU1RBVCk7CQkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDSU5UU1RBVCk7CQkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDSU5URU5CKTsJCQkJXAorCWlzcDExNnhfc2hvd19yZWcoZCwgSENGTUlOVFZMKTsJCQkJXAorCWlzcDExNnhfc2hvd19yZWcoZCwgSENGTVJFTSk7CQkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDRk1OVU0pOwkJCQlcCisJaXNwMTE2eF9zaG93X3JlZyhkLCBIQ0xTVEhSRVNIKTsJCQlcCisJaXNwMTE2eF9zaG93X3JlZyhkLCBIQ1JIREVTQ0EpOwkJCQlcCisJaXNwMTE2eF9zaG93X3JlZyhkLCBIQ1JIREVTQ0IpOwkJCQlcCisJaXNwMTE2eF9zaG93X3JlZyhkLCBIQ1JIU1RBVFVTKTsJCQlcCisJaXNwMTE2eF9zaG93X3JlZyhkLCBIQ1JIUE9SVDEpOwkJCQlcCisJaXNwMTE2eF9zaG93X3JlZyhkLCBIQ1JIUE9SVDIpOwkJCQlcCisJaXNwMTE2eF9zaG93X3JlZyhkLCBIQ0hXQ0ZHKTsJCQkJXAorCWlzcDExNnhfc2hvd19yZWcoZCwgSENETUFDRkcpOwkJCQlcCisJaXNwMTE2eF9zaG93X3JlZyhkLCBIQ1hGRVJDVFIpOwkJCQlcCisJaXNwMTE2eF9zaG93X3JlZyhkLCBIQ3VQSU5UKTsJCQkJXAorCWlzcDExNnhfc2hvd19yZWcoZCwgSEN1UElOVEVOQik7CQkJXAorCWlzcDExNnhfc2hvd19yZWcoZCwgSENDSElQSUQpOwkJCQlcCisJaXNwMTE2eF9zaG93X3JlZyhkLCBIQ1NDUkFUQ0gpOwkJCQlcCisJaXNwMTE2eF9zaG93X3JlZyhkLCBIQ0lUTEJVRkxFTik7CQkJXAorCWlzcDExNnhfc2hvd19yZWcoZCwgSENBVExCVUZMRU4pOwkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDQlVGU1RBVCk7CQkJCVwKKwlpc3AxMTZ4X3Nob3dfcmVnKGQsIEhDUkRJVEwwTEVOKTsJCQlcCisJaXNwMTE2eF9zaG93X3JlZyhkLCBIQ1JESVRMMUxFTik7CQkJXAorfQorCisjaWYgZGVmaW5lZChUUkFDRSkKKworc3RhdGljIGludCBpc3AxMTZ4X2dldF9jdXJyZW50X2ZyYW1lX251bWJlcihzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldikKK3sKKwlzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCA9ICZpc3AxMTZ4X2RldjsKKworCXJldHVybiBpc3AxMTZ4X3JlYWRfcmVnMzIoaXNwMTE2eCwgSENGTU5VTSk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqYnVmZmVyLAorCQkgICAgIGludCBsZW4sIGNoYXIgKnN0cikKK3sKKyNpZiBkZWZpbmVkKFZFUkJPU0UpCisJaW50IGk7CisjZW5kaWYKKworCURCRygiJXMgVVJCOlslNHhdIGRldjolMmQsZXA6JTJkLSVjLHR5cGU6JXMsbGVuOiVkIHN0YXQ6JSNseCIsCisJICAgIHN0ciwKKwkgICAgaXNwMTE2eF9nZXRfY3VycmVudF9mcmFtZV9udW1iZXIoZGV2KSwKKwkgICAgdXNiX3BpcGVkZXZpY2UocGlwZSksCisJICAgIHVzYl9waXBlZW5kcG9pbnQocGlwZSksCisJICAgIHVzYl9waXBlb3V0KHBpcGUpID8gJ08nIDogJ0knLAorCSAgICB1c2JfcGlwZXR5cGUocGlwZSkgPCAyID8KKwkgICAgKHVzYl9waXBlaW50KHBpcGUpID8KKwkgICAgICJJTlRSIiA6ICJJU09DIikgOgorCSAgICAodXNiX3BpcGVjb250cm9sKHBpcGUpID8gIkNUUkwiIDogIkJVTEsiKSwgbGVuLCBkZXYtPnN0YXR1cyk7CisjaWYgZGVmaW5lZChWRVJCT1NFKQorCWlmIChsZW4gPiAwICYmIGJ1ZmZlcikgeworCQlwcmludGYoX19GSUxFX18gIjogZGF0YSglZCk6IiwgbGVuKTsKKwkJZm9yIChpID0gMDsgaSA8IDE2ICYmIGkgPCBsZW47IGkrKykKKwkJCXByaW50ZigiICUwMngiLCAoKF9fdTggKikgYnVmZmVyKVtpXSk7CisJCXByaW50ZigiJXNcbiIsIGkgPCBsZW4gPyAiLi4uIiA6ICIiKTsKKwl9CisjZW5kaWYKK30KKworI2RlZmluZSBQVERfRElSX1NUUihwdGQpICAoe2NoYXIgX19jOwkJXAorCXN3aXRjaChQVERfR0VUX0RJUihwdGQpKXsJCVwKKwljYXNlIDA6ICBfX2MgPSAncyc7IGJyZWFrOwkJXAorCWNhc2UgMTogIF9fYyA9ICdvJzsgYnJlYWs7CQlcCisJZGVmYXVsdDogX19jID0gJ2knOyBicmVhazsJCVwKKwl9OyBfX2M7fSkKKworLyoKKyAgRHVtcCBQVEQgaW5mby4gVGhlIGNvZGUgZG9jdW1lbnRzIHRoZSBmb3JtYXQKKyAgcGVyZmVjdGx5LCByaWdodCA6KQorKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX3B0ZChzdHJ1Y3QgcHRkICpwdGQpCit7CisjaWYgZGVmaW5lZChWRVJCT1NFKQorCWludCBrOworI2VuZGlmCisKKwlEQkcoIlBURChleHQpIDogY2M6JXggJWQlYyVkICVkLCVkLCVkIHQ6JXggJXgleCV4IiwKKwkgICAgUFREX0dFVF9DQyhwdGQpLAorCSAgICBQVERfR0VUX0ZBKHB0ZCksIFBURF9ESVJfU1RSKHB0ZCksIFBURF9HRVRfRVAocHRkKSwKKwkgICAgUFREX0dFVF9DT1VOVChwdGQpLCBQVERfR0VUX0xFTihwdGQpLCBQVERfR0VUX01QUyhwdGQpLAorCSAgICBQVERfR0VUX1RPR0dMRShwdGQpLAorCSAgICBQVERfR0VUX0FDVElWRShwdGQpLCBQVERfR0VUX1NQRChwdGQpLCBQVERfR0VUX0xBU1QocHRkKSk7CisjaWYgZGVmaW5lZChWRVJCT1NFKQorCXByaW50ZigiaXNwMTE2eDogJXM6IFBURChieXRlKTogIiwgX19GVU5DVElPTl9fKTsKKwlmb3IgKGsgPSAwOyBrIDwgc2l6ZW9mKHN0cnVjdCBwdGQpOyArK2spCisJCXByaW50ZigiJTAyeCAiLCAoKHU4ICopIHB0ZClba10pOworCXByaW50ZigiXG4iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9wdGRfZGF0YShzdHJ1Y3QgcHRkICpwdGQsIHU4ICogYnVmLCBpbnQgdHlwZSkKK3sKKyNpZiBkZWZpbmVkKFZFUkJPU0UpCisJaW50IGs7CisKKwlpZiAodHlwZSA9PSAwIC8qIDB1dCBkYXRhICovICkgeworCQlwcmludGYoImlzcDExNng6ICVzOiBvdXQgZGF0YTogIiwgX19GVU5DVElPTl9fKTsKKwkJZm9yIChrID0gMDsgayA8IFBURF9HRVRfTEVOKHB0ZCk7ICsraykKKwkJCXByaW50ZigiJTAyeCAiLCAoKHU4ICopIGJ1Zilba10pOworCQlwcmludGYoIlxuIik7CisJfQorCWlmICh0eXBlID09IDEgLyogMW4gZGF0YSAqLyApIHsKKwkJcHJpbnRmKCJpc3AxMTZ4OiAlczogaW4gZGF0YTogIiwgX19GVU5DVElPTl9fKTsKKwkJZm9yIChrID0gMDsgayA8IFBURF9HRVRfQ09VTlQocHRkKTsgKytrKQorCQkJcHJpbnRmKCIlMDJ4ICIsICgodTggKikgYnVmKVtrXSk7CisJCXByaW50ZigiXG4iKTsKKwl9CisKKwlpZiAoUFREX0dFVF9MQVNUKHB0ZCkpCisJCURCRygiLS0tIGxhc3QgUFREIC0tLSIpOworI2VuZGlmCit9CisKKyNlbHNlCisKKyNkZWZpbmUgZHVtcF9tc2coZGV2LCBwaXBlLCBidWZmZXIsIGxlbiwgc3RyKQkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZHVtcF9wa3QoZGV2LCBwaXBlLCBidWZmZXIsIGxlbiwgc2V0dXAsIHN0ciwgc21hbGwpCWRvIHt9IHdoaWxlICgwKQorCisjZGVmaW5lIGR1bXBfcHRkKHB0ZCkJCQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgZHVtcF9wdGRfZGF0YShwdGQsIGJ1ZiwgdHlwZSkJZG8ge30gd2hpbGUgKDApCisKKyNlbmRpZgorCisvKiAtLS0gVmlydHVhbCBSb290IEh1YiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIERldmljZSBkZXNjcmlwdG9yICovCitzdGF0aWMgX191OCByb290X2h1Yl9kZXZfZGVzW10gPSB7CisJMHgxMiwJCQkvKiAgX191OCAgYkxlbmd0aDsgKi8KKwkweDAxLAkJCS8qICBfX3U4ICBiRGVzY3JpcHRvclR5cGU7IERldmljZSAqLworCTB4MTAsCQkJLyogIF9fdTE2IGJjZFVTQjsgdjEuMSAqLworCTB4MDEsCisJMHgwOSwJCQkvKiAgX191OCAgYkRldmljZUNsYXNzOyBIVUJfQ0xBU1NDT0RFICovCisJMHgwMCwJCQkvKiAgX191OCAgYkRldmljZVN1YkNsYXNzOyAqLworCTB4MDAsCQkJLyogIF9fdTggIGJEZXZpY2VQcm90b2NvbDsgKi8KKwkweDA4LAkJCS8qICBfX3U4ICBiTWF4UGFja2V0U2l6ZTA7IDggQnl0ZXMgKi8KKwkweDAwLAkJCS8qICBfX3UxNiBpZFZlbmRvcjsgKi8KKwkweDAwLAorCTB4MDAsCQkJLyogIF9fdTE2IGlkUHJvZHVjdDsgKi8KKwkweDAwLAorCTB4MDAsCQkJLyogIF9fdTE2IGJjZERldmljZTsgKi8KKwkweDAwLAorCTB4MDAsCQkJLyogIF9fdTggIGlNYW51ZmFjdHVyZXI7ICovCisJMHgwMSwJCQkvKiAgX191OCAgaVByb2R1Y3Q7ICovCisJMHgwMCwJCQkvKiAgX191OCAgaVNlcmlhbE51bWJlcjsgKi8KKwkweDAxCQkJLyogIF9fdTggIGJOdW1Db25maWd1cmF0aW9uczsgKi8KK307CisKKy8qIENvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciAqLworc3RhdGljIF9fdTggcm9vdF9odWJfY29uZmlnX2Rlc1tdID0geworCTB4MDksCQkJLyogIF9fdTggIGJMZW5ndGg7ICovCisJMHgwMiwJCQkvKiAgX191OCAgYkRlc2NyaXB0b3JUeXBlOyBDb25maWd1cmF0aW9uICovCisJMHgxOSwJCQkvKiAgX191MTYgd1RvdGFsTGVuZ3RoOyAqLworCTB4MDAsCisJMHgwMSwJCQkvKiAgX191OCAgYk51bUludGVyZmFjZXM7ICovCisJMHgwMSwJCQkvKiAgX191OCAgYkNvbmZpZ3VyYXRpb25WYWx1ZTsgKi8KKwkweDAwLAkJCS8qICBfX3U4ICBpQ29uZmlndXJhdGlvbjsgKi8KKwkweDQwLAkJCS8qICBfX3U4ICBibUF0dHJpYnV0ZXM7CisJCQkJICAgQml0IDc6IEJ1cy1wb3dlcmVkLCA2OiBTZWxmLXBvd2VyZWQsIDUgUmVtb3RlLXdha3d1cCwgNC4uMDogcmVzdmQgKi8KKwkweDAwLAkJCS8qICBfX3U4ICBNYXhQb3dlcjsgKi8KKworCS8qIGludGVyZmFjZSAqLworCTB4MDksCQkJLyogIF9fdTggIGlmX2JMZW5ndGg7ICovCisJMHgwNCwJCQkvKiAgX191OCAgaWZfYkRlc2NyaXB0b3JUeXBlOyBJbnRlcmZhY2UgKi8KKwkweDAwLAkJCS8qICBfX3U4ICBpZl9iSW50ZXJmYWNlTnVtYmVyOyAqLworCTB4MDAsCQkJLyogIF9fdTggIGlmX2JBbHRlcm5hdGVTZXR0aW5nOyAqLworCTB4MDEsCQkJLyogIF9fdTggIGlmX2JOdW1FbmRwb2ludHM7ICovCisJMHgwOSwJCQkvKiAgX191OCAgaWZfYkludGVyZmFjZUNsYXNzOyBIVUJfQ0xBU1NDT0RFICovCisJMHgwMCwJCQkvKiAgX191OCAgaWZfYkludGVyZmFjZVN1YkNsYXNzOyAqLworCTB4MDAsCQkJLyogIF9fdTggIGlmX2JJbnRlcmZhY2VQcm90b2NvbDsgKi8KKwkweDAwLAkJCS8qICBfX3U4ICBpZl9pSW50ZXJmYWNlOyAqLworCisJLyogZW5kcG9pbnQgKi8KKwkweDA3LAkJCS8qICBfX3U4ICBlcF9iTGVuZ3RoOyAqLworCTB4MDUsCQkJLyogIF9fdTggIGVwX2JEZXNjcmlwdG9yVHlwZTsgRW5kcG9pbnQgKi8KKwkweDgxLAkJCS8qICBfX3U4ICBlcF9iRW5kcG9pbnRBZGRyZXNzOyBJTiBFbmRwb2ludCAxICovCisJMHgwMywJCQkvKiAgX191OCAgZXBfYm1BdHRyaWJ1dGVzOyBJbnRlcnJ1cHQgKi8KKwkweDAwLAkJCS8qICBfX3UxNiBlcF93TWF4UGFja2V0U2l6ZTsgKChNQVhfUk9PVF9QT1JUUyArIDEpIC8gOCAqLworCTB4MDIsCisJMHhmZgkJCS8qICBfX3U4ICBlcF9iSW50ZXJ2YWw7IDI1NSBtcyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcm9vdF9odWJfc3RyX2luZGV4MFtdID0geworCTB4MDQsCQkJLyogIF9fdTggIGJMZW5ndGg7ICovCisJMHgwMywJCQkvKiAgX191OCAgYkRlc2NyaXB0b3JUeXBlOyBTdHJpbmctZGVzY3JpcHRvciAqLworCTB4MDksCQkJLyogIF9fdTggIGxhbmcgSUQgKi8KKwkweDA0LAkJCS8qICBfX3U4ICBsYW5nIElEICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciByb290X2h1Yl9zdHJfaW5kZXgxW10gPSB7CisJMHgyMiwJCQkvKiAgX191OCAgYkxlbmd0aDsgKi8KKwkweDAzLAkJCS8qICBfX3U4ICBiRGVzY3JpcHRvclR5cGU7IFN0cmluZy1kZXNjcmlwdG9yICovCisJJ0knLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSdTJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknUCcsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJzEnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkvKiAgX191OCAgVW5pY29kZSAqLworCScxJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknNicsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ3gnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkvKiAgX191OCAgVW5pY29kZSAqLworCScgJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknUicsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ28nLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSdvJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkndCcsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJyAnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSdIJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkndScsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ2InLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkvKiAgX191OCAgVW5pY29kZSAqLworfTsKKworLyoKKyAqIEh1YiBjbGFzcy1zcGVjaWZpYyBkZXNjcmlwdG9yIGlzIGNvbnN0cnVjdGVkIGR5bmFtaWNhbGx5CisgKi8KKworLyogLS0tIFZpcnR1YWwgcm9vdCBodWIgbWFuYWdlbWVudCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHJoX2NoZWNrX3BvcnRfc3RhdHVzKHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4KQoreworCXUzMiB0ZW1wLCBuZHAsIGk7CisJaW50IHJlczsKKworCXJlcyA9IC0xOworCXRlbXAgPSBpc3AxMTZ4X3JlYWRfcmVnMzIoaXNwMTE2eCwgSENSSFNUQVRVUyk7CisJbmRwID0gKHRlbXAgJiBSSF9BX05EUCk7CisJZm9yIChpID0gMDsgaSA8IG5kcDsgaSsrKSB7CisJCXRlbXAgPSBpc3AxMTZ4X3JlYWRfcmVnMzIoaXNwMTE2eCwgSENSSFBPUlQxICsgaSk7CisJCS8qIGNoZWNrIGZvciBhIGRldmljZSBkaXNjb25uZWN0ICovCisJCWlmICgoKHRlbXAgJiAoUkhfUFNfUEVTQyB8IFJIX1BTX0NTQykpID09CisJCSAgICAgKFJIX1BTX1BFU0MgfCBSSF9QU19DU0MpKSAmJiAoKHRlbXAgJiBSSF9QU19DQ1MpID09IDApKSB7CisJCQlyZXMgPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJlczsKK30KKworLyogLS0tIEhDIG1hbmFnZW1lbnQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBXcml0ZSBsZW4gYnl0ZXMgdG8gZmlmbywgcGFkIHRpbGwgMzItYml0IGJvdW5kYXJ5CisgKi8KK3N0YXRpYyB2b2lkIHdyaXRlX3B0ZGRhdGFfdG9fZmlmbyhzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgdm9pZCAqYnVmLCBpbnQgbGVuKQoreworCXU4ICpkcCA9ICh1OCAqKSBidWY7CisJdTE2ICpkcDIgPSAodTE2ICopIGJ1ZjsKKwl1MTYgdzsKKwlpbnQgcXVvdCA9IGxlbiAlIDQ7CisKKwlpZiAoKHVuc2lnbmVkIGxvbmcpZHAyICYgMSkgeworCQkvKiBub3QgYWxpZ25lZCAqLworCQlmb3IgKDsgbGVuID4gMTsgbGVuIC09IDIpIHsKKwkJCXcgPSAqZHArKzsKKwkJCXcgfD0gKmRwKysgPDwgODsKKwkJCWlzcDExNnhfcmF3X3dyaXRlX2RhdGExNihpc3AxMTZ4LCB3KTsKKwkJfQorCQlpZiAobGVuKQorCQkJaXNwMTE2eF93cml0ZV9kYXRhMTYoaXNwMTE2eCwgKHUxNikgKiBkcCk7CisJfSBlbHNlIHsKKwkJLyogYWxpZ25lZCAqLworCQlmb3IgKDsgbGVuID4gMTsgbGVuIC09IDIpCisJCQlpc3AxMTZ4X3Jhd193cml0ZV9kYXRhMTYoaXNwMTE2eCwgKmRwMisrKTsKKwkJaWYgKGxlbikKKwkJCWlzcDExNnhfd3JpdGVfZGF0YTE2KGlzcDExNngsIDB4ZmYgJiAqKCh1OCAqKSBkcDIpKTsKKwl9CisJaWYgKHF1b3QgPT0gMSB8fCBxdW90ID09IDIpCisJCWlzcDExNnhfcmF3X3dyaXRlX2RhdGExNihpc3AxMTZ4LCAwKTsKK30KKworLyogUmVhZCBsZW4gYnl0ZXMgZnJvbSBmaWZvIGFuZCB0aGVuIHJlYWQgdGlsbCAzMi1iaXQgYm91bmRhcnkKKyAqLworc3RhdGljIHZvaWQgcmVhZF9wdGRkYXRhX2Zyb21fZmlmbyhzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgdm9pZCAqYnVmLCBpbnQgbGVuKQoreworCXU4ICpkcCA9ICh1OCAqKSBidWY7CisJdTE2ICpkcDIgPSAodTE2ICopIGJ1ZjsKKwl1MTYgdzsKKwlpbnQgcXVvdCA9IGxlbiAlIDQ7CisKKwlpZiAoKHVuc2lnbmVkIGxvbmcpZHAyICYgMSkgeworCQkvKiBub3QgYWxpZ25lZCAqLworCQlmb3IgKDsgbGVuID4gMTsgbGVuIC09IDIpIHsKKwkJCXcgPSBpc3AxMTZ4X3Jhd19yZWFkX2RhdGExNihpc3AxMTZ4KTsKKwkJCSpkcCsrID0gdyAmIDB4ZmY7CisJCQkqZHArKyA9ICh3ID4+IDgpICYgMHhmZjsKKwkJfQorCQlpZiAobGVuKQorCQkJKmRwID0gMHhmZiAmIGlzcDExNnhfcmVhZF9kYXRhMTYoaXNwMTE2eCk7CisJfSBlbHNlIHsKKwkJLyogYWxpZ25lZCAqLworCQlmb3IgKDsgbGVuID4gMTsgbGVuIC09IDIpCisJCQkqZHAyKysgPSBpc3AxMTZ4X3Jhd19yZWFkX2RhdGExNihpc3AxMTZ4KTsKKwkJaWYgKGxlbikKKwkJCSoodTggKikgZHAyID0gMHhmZiAmIGlzcDExNnhfcmVhZF9kYXRhMTYoaXNwMTE2eCk7CisJfQorCWlmIChxdW90ID09IDEgfHwgcXVvdCA9PSAyKQorCQlpc3AxMTZ4X3Jhd19yZWFkX2RhdGExNihpc3AxMTZ4KTsKK30KKworLyogV3JpdGUgUFREJ3MgYW5kIGRhdGEgZm9yIHNjaGVkdWxlZCB0cmFuc2ZlcnMgaW50byB0aGUgZmlmbyByYW0uCisgKiBGaWZvIG11c3QgYmUgZW1wdHkgYW5kIHJlYWR5ICovCitzdGF0aWMgdm9pZCBwYWNrX2ZpZm8oc3RydWN0IGlzcDExNnggKmlzcDExNngsIHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgcGlwZSwgc3RydWN0IHB0ZCAqcHRkLCBpbnQgbiwgdm9pZCAqZGF0YSwKKwkJICAgICAgaW50IGxlbikKK3sKKwlpbnQgYnVmbGVuID0gbiAqIHNpemVvZihzdHJ1Y3QgcHRkKSArIGxlbjsKKwlpbnQgaSwgZG9uZTsKKworCURCRygiLS0tIHBhY2sgYnVmZmVyICVwIC0gJWQgYnl0ZXMgKGZpZm8gJWQpIC0tLSIsIGRhdGEsIGxlbiwgYnVmbGVuKTsKKworCWlzcDExNnhfd3JpdGVfcmVnMTYoaXNwMTE2eCwgSEN1UElOVCwgSEN1UElOVF9BSUlFT1QpOworCWlzcDExNnhfd3JpdGVfcmVnMTYoaXNwMTE2eCwgSENYRkVSQ1RSLCBidWZsZW4pOworCWlzcDExNnhfd3JpdGVfYWRkcihpc3AxMTZ4LCBIQ0FUTFBPUlQgfCBJU1AxMTZ4X1dSSVRFX09GRlNFVCk7CisKKwlkb25lID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCURCRygiaT0lZCAtIGRvbmU9JWQgLSBsZW49JWQiLCBpLCBkb25lLCBQVERfR0VUX0xFTigmcHRkW2ldKSk7CisKKwkJZHVtcF9wdGQoJnB0ZFtpXSk7CisJCWlzcDExNnhfd3JpdGVfZGF0YTE2KGlzcDExNngsIHB0ZFtpXS5jb3VudCk7CisJCWlzcDExNnhfd3JpdGVfZGF0YTE2KGlzcDExNngsIHB0ZFtpXS5tcHMpOworCQlpc3AxMTZ4X3dyaXRlX2RhdGExNihpc3AxMTZ4LCBwdGRbaV0ubGVuKTsKKwkJaXNwMTE2eF93cml0ZV9kYXRhMTYoaXNwMTE2eCwgcHRkW2ldLmZhZGRyKTsKKworCQlkdW1wX3B0ZF9kYXRhKCZwdGRbaV0sIChfX3U4ICopIGRhdGEgKyBkb25lLCAwKTsKKwkJd3JpdGVfcHRkZGF0YV90b19maWZvKGlzcDExNngsCisJCQkJICAgICAgKF9fdTggKikgZGF0YSArIGRvbmUsCisJCQkJICAgICAgUFREX0dFVF9MRU4oJnB0ZFtpXSkpOworCisJCWRvbmUgKz0gUFREX0dFVF9MRU4oJnB0ZFtpXSk7CisJfQorfQorCisvKiBSZWFkIHRoZSBwcm9jZXNzZWQgUFREJ3MgYW5kIGRhdGEgZnJvbSBmaWZvIHJhbSBiYWNrIHRvIFVSQnMnIGJ1ZmZlcnMuCisgKiBGaWZvIG11c3QgYmUgZnVsbCBhbmQgZG9uZSAqLworc3RhdGljIGludCB1bnBhY2tfZmlmbyhzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgcGlwZSwgc3RydWN0IHB0ZCAqcHRkLCBpbnQgbiwgdm9pZCAqZGF0YSwKKwkJICAgICAgIGludCBsZW4pCit7CisJaW50IGJ1ZmxlbiA9IG4gKiBzaXplb2Yoc3RydWN0IHB0ZCkgKyBsZW47CisJaW50IGksIGRvbmUsIGNjLCByZXQ7CisKKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDdVBJTlQsIEhDdVBJTlRfQUlJRU9UKTsKKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDWEZFUkNUUiwgYnVmbGVuKTsKKwlpc3AxMTZ4X3dyaXRlX2FkZHIoaXNwMTE2eCwgSENBVExQT1JUKTsKKworCXJldCA9IFREX0NDX05PRVJST1I7CisJZG9uZSA9IDA7CisJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQlEQkcoImk9JWQgLSBkb25lPSVkIC0gbGVuPSVkIiwgaSwgZG9uZSwgUFREX0dFVF9MRU4oJnB0ZFtpXSkpOworCisJCXB0ZFtpXS5jb3VudCA9IGlzcDExNnhfcmVhZF9kYXRhMTYoaXNwMTE2eCk7CisJCXB0ZFtpXS5tcHMgPSBpc3AxMTZ4X3JlYWRfZGF0YTE2KGlzcDExNngpOworCQlwdGRbaV0ubGVuID0gaXNwMTE2eF9yZWFkX2RhdGExNihpc3AxMTZ4KTsKKwkJcHRkW2ldLmZhZGRyID0gaXNwMTE2eF9yZWFkX2RhdGExNihpc3AxMTZ4KTsKKwkJZHVtcF9wdGQoJnB0ZFtpXSk7CisKKwkJcmVhZF9wdGRkYXRhX2Zyb21fZmlmbyhpc3AxMTZ4LAorCQkJCSAgICAgICAoX191OCAqKSBkYXRhICsgZG9uZSwKKwkJCQkgICAgICAgUFREX0dFVF9MRU4oJnB0ZFtpXSkpOworCQlkdW1wX3B0ZF9kYXRhKCZwdGRbaV0sIChfX3U4ICopIGRhdGEgKyBkb25lLCAxKTsKKworCQlkb25lICs9IFBURF9HRVRfTEVOKCZwdGRbaV0pOworCisJCWNjID0gUFREX0dFVF9DQygmcHRkW2ldKTsKKwkJaWYgKGNjID09IFREX0RBVEFVTkRFUlJVTikgewkvKiB1bmRlcnJ1biBpcyBubyBlcnJvci4uLiAqLworCQkJREJHKCJhbGxvd2VkIGRhdGEgdW5kZXJydW4iKTsKKwkJCWNjID0gVERfQ0NfTk9FUlJPUjsKKwkJfQorCQlpZiAoY2MgIT0gVERfQ0NfTk9FUlJPUiAmJiByZXQgPT0gVERfQ0NfTk9FUlJPUikKKwkJCXJldCA9IGNjOworCX0KKworCURCRygiLS0tIHVucGFjayBidWZmZXIgJXAgLSAlZCBieXRlcyAoZmlmbyAlZCkgLS0tIiwgZGF0YSwgbGVuLCBidWZsZW4pOworCisJcmV0dXJuIHJldDsKK30KKworLyogSW50ZXJydXB0IGhhbmRsaW5nCisgKi8KK3N0YXRpYyBpbnQgaXNwMTE2eF9pbnRlcnJ1cHQoc3RydWN0IGlzcDExNnggKmlzcDExNngpCit7CisJdTE2IGlycXN0YXQ7CisJdTMyIGludHN0YXQ7CisJaW50IHJldCA9IDA7CisKKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDdVBJTlRFTkIsIDApOworCWlycXN0YXQgPSBpc3AxMTZ4X3JlYWRfcmVnMTYoaXNwMTE2eCwgSEN1UElOVCk7CisJaXNwMTE2eF93cml0ZV9yZWcxNihpc3AxMTZ4LCBIQ3VQSU5ULCBpcnFzdGF0KTsKKwlEQkcoIj4+Pj4+PiBpcnFzdGF0ICV4IDw8PDw8PCIsIGlycXN0YXQpOworCisJaWYgKGlycXN0YXQgJiBIQ3VQSU5UX0FUTCkgeworCQlEQkcoIj4+Pj4+PiBIQ3VQSU5UX0FUTCA8PDw8PDwiKTsKKwkJdWRlbGF5KDUwMCk7CisJCXJldCA9IDE7CisJfQorCisJaWYgKGlycXN0YXQgJiBIQ3VQSU5UX09QUikgeworCQlpbnRzdGF0ID0gaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIEhDSU5UU1RBVCk7CisJCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENJTlRTVEFULCBpbnRzdGF0KTsKKwkJREJHKCI+Pj4+Pj4gSEN1UElOVF9PUFIgJXggPDw8PDw8IiwgaW50c3RhdCk7CisKKwkJaWYgKGludHN0YXQgJiBIQ0lOVF9VRSkgeworCQkJRVJSKCJ1bnJlY292ZXJhYmxlIGVycm9yLCBjb250cm9sbGVyIGRpc2FibGVkIik7CisKKwkJCS8qIEZJWE1FOiBiZSBvcHRpbWlzdGljLCBob3BlIHRoYXQgYnVnIHdvbid0IHJlcGVhdAorCQkJICogb2Z0ZW4uIE1ha2Ugc29tZSBub24taW50ZXJydXB0IGNvbnRleHQgcmVzdGFydCB0aGUKKwkJCSAqIGNvbnRyb2xsZXIuIENvdW50IGFuZCBsaW1pdCB0aGUgcmV0cmllcyB0aG91Z2g7CisJCQkgKiBlaXRoZXIgaGFyZHdhcmUgb3Igc29mdHdhcmUgZXJyb3JzIGNhbiBnbyBmb3JldmVyLi4uCisJCQkgKi8KKwkJCWlzcDExNnhfcmVzZXQoaXNwMTE2eCk7CisJCQlyZXQgPSAtMTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmIChpbnRzdGF0ICYgSENJTlRfUkhTQykgeworCQkJZ290X3Joc2MgPSAxOworCQkJcmV0ID0gMTsKKwkJCS8qIFdoZW4gcm9vdCBodWIgb3IgYW55IG9mIGl0cyBwb3J0cyBpcyBnb2luZworCQkJICAgdG8gY29tZSBvdXQgb2Ygc3VzcGVuZCwgaXQgbWF5IHRha2UgbW9yZQorCQkJICAgdGhhbiAxMG1zIGZvciBzdGF0dXMgYml0cyB0byBzdGFiaWxpemUuICovCisJCQl3YWl0X21zKDIwKTsKKwkJfQorCisJCWlmIChpbnRzdGF0ICYgSENJTlRfU08pIHsKKwkJCUVSUigic2NoZWR1bGUgb3ZlcnJ1biIpOworCQkJcmV0ID0gLTE7CisJCX0KKworCQlpcnFzdGF0ICY9IH5IQ3VQSU5UX09QUjsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFBURF9OVU0JCQk2NAkvKiBpdCBzaG91bGQgYmUgZW5vdWd0aC4uLiAqLworc3RydWN0IHB0ZCBwdGRbUFREX05VTV07CitzdGF0aWMgaW5saW5lIGludCBtYXhfdHJhbnNmZXJfbGVuKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSkKK3sKKwlyZXR1cm4gbWluKFBURF9OVU0gKiB1c2JfbWF4cGFja2V0KGRldiwgcGlwZSksIFBURF9OVU0gKiAxNik7Cit9CisKKy8qIERvIGFuIFVTQiB0cmFuc2ZlcgorICovCitzdGF0aWMgaW50IGlzcDExNnhfc3VibWl0X2pvYihzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsCisJCQkgICAgICBpbnQgZGlyLCB2b2lkICpidWZmZXIsIGludCBsZW4pCit7CisJc3RydWN0IGlzcDExNnggKmlzcDExNnggPSAmaXNwMTE2eF9kZXY7CisJaW50IHR5cGUgPSB1c2JfcGlwZXR5cGUocGlwZSk7CisJaW50IGVwbnVtID0gdXNiX3BpcGVlbmRwb2ludChwaXBlKTsKKwlpbnQgbWF4ID0gdXNiX21heHBhY2tldChkZXYsIHBpcGUpOworCWludCBkaXJfb3V0ID0gdXNiX3BpcGVvdXQocGlwZSk7CisJaW50IHNwZWVkX2xvdyA9IHVzYl9waXBlc2xvdyhwaXBlKTsKKwlpbnQgaSwgZG9uZSwgc3RhdCwgdGltZW91dCwgY2M7CisJaW50IHJldHJpZXMgPSAxMDsKKworCURCRygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisJZHVtcF9tc2coZGV2LCBwaXBlLCBidWZmZXIsIGxlbiwgIlNVQk1JVCIpOworCURCRygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisKKwlpZiAoaXNwMTE2eC0+ZGlzYWJsZWQpIHsKKwkJRVJSKCJFUElQRSIpOworCQlkZXYtPnN0YXR1cyA9IFVTQl9TVF9DUkNfRVJSOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogZGV2aWNlIHB1bGxlZD8gU2hvcnRjdXQgdGhlIGFjdGlvbi4gKi8KKwlpZiAoZGV2Z29uZSA9PSBkZXYpIHsKKwkJRVJSKCJFTk9ERVYiKTsKKwkJZGV2LT5zdGF0dXMgPSBVU0JfU1RfQ1JDX0VSUjsKKwkJcmV0dXJuIFVTQl9TVF9DUkNfRVJSOworCX0KKworCWlmICghbWF4KSB7CisJCUVSUigicGlwZXNpemUgZm9yIHBpcGUgJWx4IGlzIHplcm8iLCBwaXBlKTsKKwkJZGV2LT5zdGF0dXMgPSBVU0JfU1RfQ1JDX0VSUjsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICh0eXBlID09IFBJUEVfSVNPQ0hST05PVVMpIHsKKwkJRVJSKCJpc29jaHJvbm91cyB0cmFuc2ZlcnMgbm90IHN1cHBvcnRlZCIpOworCQlkZXYtPnN0YXR1cyA9IFVTQl9TVF9DUkNfRVJSOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogRklGTyBub3QgZW1wdHk/ICovCisJaWYgKGlzcDExNnhfcmVhZF9yZWcxNihpc3AxMTZ4LCBIQ0JVRlNUQVQpICYgSENCVUZTVEFUX0FUTF9GVUxMKSB7CisJCUVSUigiKioqKioqIEZJRk8gbm90IGVtcHR5ISAqKioqKioiKTsKKwkJZGV2LT5zdGF0dXMgPSBVU0JfU1RfQlVGX0VSUjsKKwkJcmV0dXJuIC0xOworCX0KKworICAgICAgcmV0cnk6CisJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ0lOVFNUQVQsIDB4ZmYpOworCisJLyogUHJlcGFyZSB0aGUgUFREIGRhdGEgKi8KKwlkb25lID0gMDsKKwlpID0gMDsKKwlkbyB7CisJCXB0ZFtpXS5jb3VudCA9IFBURF9DQ19NU0sgfCBQVERfQUNUSVZFX01TSyB8CisJCSAgICBQVERfVE9HR0xFKHVzYl9nZXR0b2dnbGUoZGV2LCBlcG51bSwgZGlyX291dCkpOworCQlwdGRbaV0ubXBzID0gUFREX01QUyhtYXgpIHwgUFREX1NQRChzcGVlZF9sb3cpIHwgUFREX0VQKGVwbnVtKTsKKwkJcHRkW2ldLmxlbiA9IFBURF9MRU4obWF4ID4gbGVuIC0gZG9uZSA/IGxlbiAtIGRvbmUgOiBtYXgpIHwKKwkJICAgIFBURF9ESVIoZGlyKTsKKwkJcHRkW2ldLmZhZGRyID0gUFREX0ZBKHVzYl9waXBlZGV2aWNlKHBpcGUpKTsKKworCQl1c2JfZG90b2dnbGUoZGV2LCBlcG51bSwgZGlyX291dCk7CisJCWRvbmUgKz0gUFREX0dFVF9MRU4oJnB0ZFtpXSk7CisJCWkrKzsKKwkJaWYgKGkgPj0gUFREX05VTSkgeworCQkJRVJSKCIqKioqKiogQ2Fubm90IHBhY2sgYnVmZmVyISAqKioqKioiKTsKKwkJCWRldi0+c3RhdHVzID0gVVNCX1NUX0JVRl9FUlI7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9IHdoaWxlIChkb25lIDwgbGVuKTsKKwlwdGRbaSAtIDFdLm1wcyB8PSBQVERfTEFTVF9NU0s7CisKKwkvKiBQYWNrIGRhdGEgaW50byBGSUZPIHJhbSAqLworCXBhY2tfZmlmbyhpc3AxMTZ4LCBkZXYsIHBpcGUsIHB0ZCwgaSwgYnVmZmVyLCBsZW4pOworI2lmZGVmIEVYVFJBX0RFTEFZCisJd2FpdF9tcyhFWFRSQV9ERUxBWSk7CisjZW5kaWYKKworCS8qIFN0YXJ0IHRoZSBkYXRhIHRyYW5zZmVyICovCisKKwkvKiBBbGxvdyBtb3JlIHRpbWUgZm9yIGEgQlVMSyBkZXZpY2UgdG8gcmVhY3QgLSBzb21lIGFyZSBzbG93ICovCisJaWYgKHVzYl9waXBldHlwZShwaXBlKSA9PSBQSVBFX0JVTEspCisJCXRpbWVvdXQgPSA1MDAwOworCWVsc2UKKwkJdGltZW91dCA9IDEwMDsKKworCS8qIFdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlICovCisJZm9yICg7OykgeworCQkvKiBDaGVjayB3aGV0aGVyIHRoZSBjb250cm9sbGVyIGlzIGRvbmUgKi8KKwkJc3RhdCA9IGlzcDExNnhfaW50ZXJydXB0KGlzcDExNngpOworCisJCWlmIChzdGF0IDwgMCkgeworCQkJZGV2LT5zdGF0dXMgPSBVU0JfU1RfQ1JDX0VSUjsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzdGF0ID4gMCkKKwkJCWJyZWFrOworCisJCS8qIENoZWNrIHRoZSB0aW1lb3V0ICovCisJCWlmICgtLXRpbWVvdXQpCisJCQl1ZGVsYXkoMSk7CisJCWVsc2UgeworCQkJRVJSKCJDVEw6VElNRU9VVCAiKTsKKwkJCXN0YXQgPSBVU0JfU1RfQ1JDX0VSUjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogV2UgZ290IGFuIFJvb3QgSHViIFN0YXR1cyBDaGFuZ2UgaW50ZXJydXB0ICovCisJaWYgKGdvdF9yaHNjKSB7CisJCWlzcDExNnhfc2hvd19yZWdzKGlzcDExNngpOworCisJCWdvdF9yaHNjID0gMDsKKworCQkvKiBBYnVzZSB0aW1lb3V0ICovCisJCXRpbWVvdXQgPSByaF9jaGVja19wb3J0X3N0YXR1cyhpc3AxMTZ4KTsKKwkJaWYgKHRpbWVvdXQgPj0gMCkgeworCQkJLyoKKwkJCSAqIEZJWE1FISBOT1RFISBBQUFBUkdIIQorCQkJICogVGhpcyBpcyBwb3RlbnRpYWxseSBkYW5nZXJvdXMgYmVjYXVzZSBpdCBhc3N1bWVzCisJCQkgKiB0aGF0IG9ubHkgb25lIGRldmljZSBpcyBldmVyIHBsdWdnZWQgaW4hCisJCQkgKi8KKwkJCWRldmdvbmUgPSBkZXY7CisJCX0KKwl9CisKKwkvKiBPaywgbm93IHdlIGNhbiByZWFkIHRyYW5zZmVyIHN0YXR1cyAqLworCisJLyogRklGTyBub3QgcmVhZHk/ICovCisJaWYgKCEoaXNwMTE2eF9yZWFkX3JlZzE2KGlzcDExNngsIEhDQlVGU1RBVCkgJiBIQ0JVRlNUQVRfQVRMX0RPTkUpKSB7CisJCUVSUigiKioqKioqIEZJRk8gbm90IHJlYWR5ISAqKioqKioiKTsKKwkJZGV2LT5zdGF0dXMgPSBVU0JfU1RfQlVGX0VSUjsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFVucGFjayBkYXRhIGZyb20gRklGTyByYW0gKi8KKwljYyA9IHVucGFja19maWZvKGlzcDExNngsIGRldiwgcGlwZSwgcHRkLCBpLCBidWZmZXIsIGxlbik7CisKKwkvKiBNbW0uLi4gc29tZXRpbWUgd2UgZ2V0IDB4MGYgYXMgY2Mgd2hpY2ggaXMgYSBub24gc2Vuc2UhCisJICogSnVzdCByZXRyeSB0aGUgdHJhbnNmZXIuLi4KKwkgKi8KKwlpZiAoY2MgPT0gMHgwZiAmJiByZXRyaWVzLS0gPiAwKSB7CisJCXVzYl9kb3RvZ2dsZShkZXYsIGVwbnVtLCBkaXJfb3V0KTsKKwkJZ290byByZXRyeTsKKwl9CisKKwlpZiAoY2MgIT0gVERfQ0NfTk9FUlJPUikgeworCQlEQkcoIioqKioqKiBjb21wbGV0aXRpb24gY29kZSBlcnJvciAleCAqKioqKioiLCBjYyk7CisJCXN3aXRjaCAoY2MpIHsKKwkJY2FzZSBURF9DQ19CSVRTVFVGRklORzoKKwkJCWRldi0+c3RhdHVzID0gVVNCX1NUX0JJVF9FUlI7CisJCQlicmVhazsKKwkJY2FzZSBURF9DQ19TVEFMTDoKKwkJCWRldi0+c3RhdHVzID0gVVNCX1NUX1NUQUxMRUQ7CisJCQlicmVhazsKKwkJY2FzZSBURF9CVUZGRVJPVkVSUlVOOgorCQljYXNlIFREX0JVRkZFUlVOREVSUlVOOgorCQkJZGV2LT5zdGF0dXMgPSBVU0JfU1RfQlVGX0VSUjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2LT5zdGF0dXMgPSBVU0JfU1RfQ1JDX0VSUjsKKwkJfQorCQlyZXR1cm4gLWNjOworCX0KKworCWR1bXBfbXNnKGRldiwgcGlwZSwgYnVmZmVyLCBsZW4sICJTVUJNSVQocmV0KSIpOworCisJZGV2LT5zdGF0dXMgPSAwOworCXJldHVybiBkb25lOworfQorCisvKiBBZGFwdGVkIGZyb20gYXUxeDAwX3VzYl9vaGNpLmMKKyAqLworc3RhdGljIGludCBpc3AxMTZ4X3N1Ym1pdF9yaF9tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLAorCQkJCSB2b2lkICpidWZmZXIsIGludCB0cmFuc2Zlcl9sZW4sCisJCQkJIHN0cnVjdCBkZXZyZXF1ZXN0ICpjbWQpCit7CisJc3RydWN0IGlzcDExNnggKmlzcDExNnggPSAmaXNwMTE2eF9kZXY7CisJdTMyIHRtcCA9IDA7CisKKwlpbnQgbGVuaSA9IHRyYW5zZmVyX2xlbjsKKwlpbnQgbGVuID0gMDsKKwlpbnQgc3RhdCA9IDA7CisJdTMyIGRhdGFiWzRdOworCXU4ICpkYXRhX2J1ZiA9ICh1OCAqKSBkYXRhYjsKKwl1MTYgYm1SVHlwZV9iUmVxOworCXUxNiB3VmFsdWU7CisJdTE2IHdJbmRleDsKKwl1MTYgd0xlbmd0aDsKKworCWlmICgocGlwZSAmIFBJUEVfSU5URVJSVVBUKSA9PSBQSVBFX0lOVEVSUlVQVCkgeworCQlJTkZPKCJSb290LUh1YiBzdWJtaXQgSVJROiBOT1QgaW1wbGVtZW50ZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJYm1SVHlwZV9iUmVxID0gY21kLT5yZXF1ZXN0dHlwZSB8IChjbWQtPnJlcXVlc3QgPDwgOCk7CisJd1ZhbHVlID0gc3dhcF8xNihjbWQtPnZhbHVlKTsKKwl3SW5kZXggPSBzd2FwXzE2KGNtZC0+aW5kZXgpOworCXdMZW5ndGggPSBzd2FwXzE2KGNtZC0+bGVuZ3RoKTsKKworCURCRygiLS0tIEhVQiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisJREJHKCJzdWJtaXQgcmggdXJiLCByZXE9JXggdmFsPSUjeCBpbmRleD0lI3ggbGVuPSVkIiwKKwkgICAgYm1SVHlwZV9iUmVxLCB3VmFsdWUsIHdJbmRleCwgd0xlbmd0aCk7CisJZHVtcF9tc2coZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwgIlJIIik7CisJREJHKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKworCXN3aXRjaCAoYm1SVHlwZV9iUmVxKSB7CisJY2FzZSBSSF9HRVRfU1RBVFVTOgorCQlEQkcoIlJIX0dFVF9TVEFUVVMiKTsKKworCQkqKF9fdTE2ICopIGRhdGFfYnVmID0gc3dhcF8xNigxKTsKKwkJbGVuID0gMjsKKwkJYnJlYWs7CisKKwljYXNlIFJIX0dFVF9TVEFUVVMgfCBSSF9JTlRFUkZBQ0U6CisJCURCRygiUkhfR0VUX1NUQVRVUyB8IFJIX0lOVEVSRkFDRSIpOworCisJCSooX191MTYgKikgZGF0YV9idWYgPSBzd2FwXzE2KDApOworCQlsZW4gPSAyOworCQlicmVhazsKKworCWNhc2UgUkhfR0VUX1NUQVRVUyB8IFJIX0VORFBPSU5UOgorCQlEQkcoIlJIX0dFVF9TVEFUVVMgfCBSSF9FTkRQT0lOVCIpOworCisJCSooX191MTYgKikgZGF0YV9idWYgPSBzd2FwXzE2KDApOworCQlsZW4gPSAyOworCQlicmVhazsKKworCWNhc2UgUkhfR0VUX1NUQVRVUyB8IFJIX0NMQVNTOgorCQlEQkcoIlJIX0dFVF9TVEFUVVMgfCBSSF9DTEFTUyIpOworCisJCXRtcCA9IGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ1JIU1RBVFVTKTsKKworCQkqKF9fdTMyICopIGRhdGFfYnVmID0gc3dhcF8zMih0bXAgJiB+KFJIX0hTX0NSV0UgfCBSSF9IU19EUldFKSk7CisJCWxlbiA9IDQ7CisJCWJyZWFrOworCisJY2FzZSBSSF9HRVRfU1RBVFVTIHwgUkhfT1RIRVIgfCBSSF9DTEFTUzoKKwkJREJHKCJSSF9HRVRfU1RBVFVTIHwgUkhfT1RIRVIgfCBSSF9DTEFTUyIpOworCisJCXRtcCA9IGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ1JIUE9SVDEgKyB3SW5kZXggLSAxKTsKKwkJKihfX3UzMiAqKSBkYXRhX2J1ZiA9IHN3YXBfMzIodG1wKTsKKwkJaXNwMTE2eF9zaG93X3JlZ3MoaXNwMTE2eCk7CisJCWxlbiA9IDQ7CisJCWJyZWFrOworCisJY2FzZSBSSF9DTEVBUl9GRUFUVVJFIHwgUkhfRU5EUE9JTlQ6CisJCURCRygiUkhfQ0xFQVJfRkVBVFVSRSB8IFJIX0VORFBPSU5UIik7CisKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJY2FzZSBSSF9FTkRQT0lOVF9TVEFMTDoKKwkJCURCRygiQ19IVUJfRU5EUE9JTlRfU1RBTEwiKTsKKwkJCWxlbiA9IDA7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUkhfQ0xFQVJfRkVBVFVSRSB8IFJIX0NMQVNTOgorCQlEQkcoIlJIX0NMRUFSX0ZFQVRVUkUgfCBSSF9DTEFTUyIpOworCisJCXN3aXRjaCAod1ZhbHVlKSB7CisJCWNhc2UgUkhfQ19IVUJfTE9DQUxfUE9XRVI6CisJCQlEQkcoIkNfSFVCX0xPQ0FMX1BPV0VSIik7CisJCQlsZW4gPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBSSF9DX0hVQl9PVkVSX0NVUlJFTlQ6CisJCQlEQkcoIkNfSFVCX09WRVJfQ1VSUkVOVCIpOworCQkJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ1JIU1RBVFVTLCBSSF9IU19PQ0lDKTsKKwkJCWxlbiA9IDA7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUkhfQ0xFQVJfRkVBVFVSRSB8IFJIX09USEVSIHwgUkhfQ0xBU1M6CisJCURCRygiUkhfQ0xFQVJfRkVBVFVSRSB8IFJIX09USEVSIHwgUkhfQ0xBU1MiKTsKKworCQlzd2l0Y2ggKHdWYWx1ZSkgeworCQljYXNlIFJIX1BPUlRfRU5BQkxFOgorCQkJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ1JIUE9SVDEgKyB3SW5kZXggLSAxLAorCQkJCQkgICAgUkhfUFNfQ0NTKTsKKwkJCWxlbiA9IDA7CisJCQlicmVhazsKKworCQljYXNlIFJIX1BPUlRfU1VTUEVORDoKKwkJCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSFBPUlQxICsgd0luZGV4IC0gMSwKKwkJCQkJICAgIFJIX1BTX1BPQ0kpOworCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgUkhfUE9SVF9QT1dFUjoKKwkJCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSFBPUlQxICsgd0luZGV4IC0gMSwKKwkJCQkJICAgIFJIX1BTX0xTREEpOworCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgUkhfQ19QT1JUX0NPTk5FQ1RJT046CisJCQlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDUkhQT1JUMSArIHdJbmRleCAtIDEsCisJCQkJCSAgICBSSF9QU19DU0MpOworCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgUkhfQ19QT1JUX0VOQUJMRToKKwkJCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSFBPUlQxICsgd0luZGV4IC0gMSwKKwkJCQkJICAgIFJIX1BTX1BFU0MpOworCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgUkhfQ19QT1JUX1NVU1BFTkQ6CisJCQlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDUkhQT1JUMSArIHdJbmRleCAtIDEsCisJCQkJCSAgICBSSF9QU19QU1NDKTsKKwkJCWxlbiA9IDA7CisJCQlicmVhazsKKworCQljYXNlIFJIX0NfUE9SVF9PVkVSX0NVUlJFTlQ6CisJCQlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDUkhQT1JUMSArIHdJbmRleCAtIDEsCisJCQkJCSAgICBSSF9QU19QT0NJKTsKKwkJCWxlbiA9IDA7CisJCQlicmVhazsKKworCQljYXNlIFJIX0NfUE9SVF9SRVNFVDoKKwkJCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSFBPUlQxICsgd0luZGV4IC0gMSwKKwkJCQkJICAgIFJIX1BTX1BSU0MpOworCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlFUlIoImludmFsaWQgd1ZhbHVlIik7CisJCQlzdGF0ID0gVVNCX1NUX1NUQUxMRUQ7CisJCX0KKworCQlpc3AxMTZ4X3Nob3dfcmVncyhpc3AxMTZ4KTsKKworCQlicmVhazsKKworCWNhc2UgUkhfU0VUX0ZFQVRVUkUgfCBSSF9PVEhFUiB8IFJIX0NMQVNTOgorCQlEQkcoIlJIX1NFVF9GRUFUVVJFIHwgUkhfT1RIRVIgfCBSSF9DTEFTUyIpOworCisJCXN3aXRjaCAod1ZhbHVlKSB7CisJCWNhc2UgUkhfUE9SVF9TVVNQRU5EOgorCQkJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ1JIUE9SVDEgKyB3SW5kZXggLSAxLAorCQkJCQkgICAgUkhfUFNfUFNTKTsKKwkJCWxlbiA9IDA7CisJCQlicmVhazsKKworCQljYXNlIFJIX1BPUlRfUkVTRVQ6CisJCQkvKiBTcGluIHVudGlsIGFueSBjdXJyZW50IHJlc2V0IGZpbmlzaGVzICovCisJCQl3aGlsZSAoMSkgeworCQkJCXRtcCA9CisJCQkJICAgIGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LAorCQkJCQkJICAgICAgIEhDUkhQT1JUMSArIHdJbmRleCAtIDEpOworCQkJCWlmICghKHRtcCAmIFJIX1BTX1BSUykpCisJCQkJCWJyZWFrOworCQkJCXdhaXRfbXMoMSk7CisJCQl9CisJCQlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDUkhQT1JUMSArIHdJbmRleCAtIDEsCisJCQkJCSAgICBSSF9QU19QUlMpOworCQkJd2FpdF9tcygxMCk7CisKKwkJCWxlbiA9IDA7CisJCQlicmVhazsKKworCQljYXNlIFJIX1BPUlRfUE9XRVI6CisJCQlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDUkhQT1JUMSArIHdJbmRleCAtIDEsCisJCQkJCSAgICBSSF9QU19QUFMpOworCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgUkhfUE9SVF9FTkFCTEU6CisJCQlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDUkhQT1JUMSArIHdJbmRleCAtIDEsCisJCQkJCSAgICBSSF9QU19QRVMpOworCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlFUlIoImludmFsaWQgd1ZhbHVlIik7CisJCQlzdGF0ID0gVVNCX1NUX1NUQUxMRUQ7CisJCX0KKworCQlpc3AxMTZ4X3Nob3dfcmVncyhpc3AxMTZ4KTsKKworCQlicmVhazsKKworCWNhc2UgUkhfU0VUX0FERFJFU1M6CisJCURCRygiUkhfU0VUX0FERFJFU1MiKTsKKworCQlyaF9kZXZudW0gPSB3VmFsdWU7CisJCWxlbiA9IDA7CisJCWJyZWFrOworCisJY2FzZSBSSF9HRVRfREVTQ1JJUFRPUjoKKwkJREJHKCJSSF9HRVRfREVTQ1JJUFRPUjogJXgsICVkIiwgd1ZhbHVlLCB3TGVuZ3RoKTsKKworCQlzd2l0Y2ggKHdWYWx1ZSkgeworCQljYXNlIChVU0JfRFRfREVWSUNFIDw8IDgpOgkvKiBkZXZpY2UgZGVzY3JpcHRvciAqLworCQkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LAorCQkJCSAgICBsZW5pLCBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQkJCQlzaXplb2Yocm9vdF9odWJfZGV2X2RlcyksCisJCQkJCQl3TGVuZ3RoKSk7CisJCQlkYXRhX2J1ZiA9IHJvb3RfaHViX2Rldl9kZXM7CisJCQlicmVhazsKKworCQljYXNlIChVU0JfRFRfQ09ORklHIDw8IDgpOgkvKiBjb25maWd1cmF0aW9uIGRlc2NyaXB0b3IgKi8KKwkJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwKKwkJCQkgICAgbGVuaSwgbWluX3QodW5zaWduZWQgaW50LAorCQkJCQkJc2l6ZW9mKHJvb3RfaHViX2NvbmZpZ19kZXMpLAorCQkJCQkJd0xlbmd0aCkpOworCQkJZGF0YV9idWYgPSByb290X2h1Yl9jb25maWdfZGVzOworCQkJYnJlYWs7CisKKwkJY2FzZSAoKFVTQl9EVF9TVFJJTkcgPDwgOCkgfCAweDAwKToJLyogc3RyaW5nIDAgZGVzY3JpcHRvcnMgKi8KKwkJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwKKwkJCQkgICAgbGVuaSwgbWluX3QodW5zaWduZWQgaW50LAorCQkJCQkJc2l6ZW9mKHJvb3RfaHViX3N0cl9pbmRleDApLAorCQkJCQkJd0xlbmd0aCkpOworCQkJZGF0YV9idWYgPSByb290X2h1Yl9zdHJfaW5kZXgwOworCQkJYnJlYWs7CisKKwkJY2FzZSAoKFVTQl9EVF9TVFJJTkcgPDwgOCkgfCAweDAxKToJLyogc3RyaW5nIDEgZGVzY3JpcHRvcnMgKi8KKwkJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwKKwkJCQkgICAgbGVuaSwgbWluX3QodW5zaWduZWQgaW50LAorCQkJCQkJc2l6ZW9mKHJvb3RfaHViX3N0cl9pbmRleDEpLAorCQkJCQkJd0xlbmd0aCkpOworCQkJZGF0YV9idWYgPSByb290X2h1Yl9zdHJfaW5kZXgxOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCUVSUigiaW52YWxpZCB3VmFsdWUiKTsKKwkJCXN0YXQgPSBVU0JfU1RfU1RBTExFRDsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBSSF9HRVRfREVTQ1JJUFRPUiB8IFJIX0NMQVNTOgorCQlEQkcoIlJIX0dFVF9ERVNDUklQVE9SIHwgUkhfQ0xBU1MiKTsKKworCQl0bXAgPSBpc3AxMTZ4X3JlYWRfcmVnMzIoaXNwMTE2eCwgSENSSERFU0NBKTsKKworCQlkYXRhX2J1ZlswXSA9IDB4MDk7CS8qIG1pbiBsZW5ndGg7ICovCisJCWRhdGFfYnVmWzFdID0gMHgyOTsKKwkJZGF0YV9idWZbMl0gPSB0bXAgJiBSSF9BX05EUDsKKwkJZGF0YV9idWZbM10gPSAwOworCQlpZiAodG1wICYgUkhfQV9QU00pCS8qIHBlci1wb3J0IHBvd2VyIHN3aXRjaGluZz8gKi8KKwkJCWRhdGFfYnVmWzNdIHw9IDB4MDE7CisJCWlmICh0bXAgJiBSSF9BX05PQ1ApCS8qIG5vIG92ZXJjdXJyZW50IHJlcG9ydGluZz8gKi8KKwkJCWRhdGFfYnVmWzNdIHw9IDB4MTA7CisJCWVsc2UgaWYgKHRtcCAmIFJIX0FfT0NQTSkJLyogcGVyLXBvcnQgb3ZlcmN1cnJlbnQgcmVwPyAqLworCQkJZGF0YV9idWZbM10gfD0gMHgwODsKKworCQkvKiBDb3JyZXNwb25kcyB0byBkYXRhX2J1Zls0LTddICovCisJCWRhdGFiWzFdID0gMDsKKwkJZGF0YV9idWZbNV0gPSAodG1wICYgUkhfQV9QT1RQR1QpID4+IDI0OworCisJCXRtcCA9IGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ1JIREVTQ0IpOworCisJCWRhdGFfYnVmWzddID0gdG1wICYgUkhfQl9EUjsKKwkJaWYgKGRhdGFfYnVmWzJdIDwgNykKKwkJCWRhdGFfYnVmWzhdID0gMHhmZjsKKwkJZWxzZSB7CisJCQlkYXRhX2J1ZlswXSArPSAyOworCQkJZGF0YV9idWZbOF0gPSAodG1wICYgUkhfQl9EUikgPj4gODsKKwkJCWRhdGFfYnVmWzEwXSA9IGRhdGFfYnVmWzldID0gMHhmZjsKKwkJfQorCisJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuaSwKKwkJCSAgICBtaW5fdCh1bnNpZ25lZCBpbnQsIGRhdGFfYnVmWzBdLCB3TGVuZ3RoKSk7CisJCWJyZWFrOworCisJY2FzZSBSSF9HRVRfQ09ORklHVVJBVElPTjoKKwkJREJHKCJSSF9HRVRfQ09ORklHVVJBVElPTiIpOworCisJCSooX191OCAqKSBkYXRhX2J1ZiA9IDB4MDE7CisJCWxlbiA9IDE7CisJCWJyZWFrOworCisJY2FzZSBSSF9TRVRfQ09ORklHVVJBVElPTjoKKwkJREJHKCJSSF9TRVRfQ09ORklHVVJBVElPTiIpOworCisJCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSFNUQVRVUywgUkhfSFNfTFBTQyk7CisJCWxlbiA9IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJRVJSKCIqKiogKioqICoqKiB1bnN1cHBvcnRlZCByb290IGh1YiBjb21tYW5kICoqKiAqKiogKioqIik7CisJCXN0YXQgPSBVU0JfU1RfU1RBTExFRDsKKwl9CisKKwlsZW4gPSBtaW5fdChpbnQsIGxlbiwgbGVuaSk7CisJaWYgKGJ1ZmZlciAhPSBkYXRhX2J1ZikKKwkJbWVtY3B5KGJ1ZmZlciwgZGF0YV9idWYsIGxlbik7CisKKwlkZXYtPmFjdF9sZW4gPSBsZW47CisJZGV2LT5zdGF0dXMgPSBzdGF0OworCURCRygiZGV2IGFjdF9sZW4gJWQsIHN0YXR1cyAlZCIsIGRldi0+YWN0X2xlbiwgZGV2LT5zdGF0dXMpOworCisJZHVtcF9tc2coZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwgIlJIKHJldCkiKTsKKworCXJldHVybiBzdGF0OworfQorCisvKiAtLS0gVHJhbnNmZXIgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2ludCBzdWJtaXRfaW50X21zZyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsIHZvaWQgKmJ1ZmZlciwKKwkJICAgaW50IGxlbiwgaW50IGludGVydmFsKQoreworCURCRygiZGV2PSVwIHBpcGU9JSNseCBidWY9JXAgc2l6ZT0lZCBpbnQ9JWQiLAorCSAgICBkZXYsIHBpcGUsIGJ1ZmZlciwgbGVuLCBpbnRlcnZhbCk7CisKKwlyZXR1cm4gLTE7Cit9CisKK2ludCBzdWJtaXRfY29udHJvbF9tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICpidWZmZXIsCisJCSAgICAgICBpbnQgbGVuLCBzdHJ1Y3QgZGV2cmVxdWVzdCAqc2V0dXApCit7CisJaW50IGRldm51bSA9IHVzYl9waXBlZGV2aWNlKHBpcGUpOworCWludCBlcG51bSA9IHVzYl9waXBlZW5kcG9pbnQocGlwZSk7CisJaW50IG1heCA9IG1heF90cmFuc2Zlcl9sZW4oZGV2LCBwaXBlKTsKKwlpbnQgZGlyX2luID0gdXNiX3BpcGVpbihwaXBlKTsKKwlpbnQgZG9uZSwgcmV0OworCisJLyogQ29udHJvbCBtZXNzYWdlIGlzIGZvciB0aGUgSFVCPyAqLworCWlmIChkZXZudW0gPT0gcmhfZGV2bnVtKQorCQlyZXR1cm4gaXNwMTE2eF9zdWJtaXRfcmhfbXNnKGRldiwgcGlwZSwgYnVmZmVyLCBsZW4sIHNldHVwKTsKKworCS8qIE9rLCBubyBIVUIgbWVzc2FnZSBzbyBzZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBkZXZpY2UgKi8KKworCS8qIFNldHVwIHBoYXNlICovCisJREJHKCItLS0gU0VUVVAgUEhBU0UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKwl1c2Jfc2V0dG9nZ2xlKGRldiwgZXBudW0sIDEsIDApOworCXJldCA9IGlzcDExNnhfc3VibWl0X2pvYihkZXYsIHBpcGUsCisJCQkJIFBURF9ESVJfU0VUVVAsCisJCQkJIHNldHVwLCBzaXplb2Yoc3RydWN0IGRldnJlcXVlc3QpKTsKKwlpZiAocmV0IDwgMCkgeworCQlEQkcoImNvbnRyb2wgc2V0dXAgcGhhc2UgZXJyb3IgKHJldCA9ICVkIiwgcmV0KTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIERhdGEgcGhhc2UgKi8KKwlEQkcoIi0tLSBEQVRBIFBIQVNFIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCWRvbmUgPSAwOworCXVzYl9zZXR0b2dnbGUoZGV2LCBlcG51bSwgIWRpcl9pbiwgMSk7CisJd2hpbGUgKGRvbmUgPCBsZW4pIHsKKwkJcmV0ID0gaXNwMTE2eF9zdWJtaXRfam9iKGRldiwgcGlwZSwKKwkJCQkJIGRpcl9pbiA/IFBURF9ESVJfSU4gOiBQVERfRElSX09VVCwKKwkJCQkJIChfX3U4ICopIGJ1ZmZlciArIGRvbmUsCisJCQkJCSBtYXggPiBsZW4gLSBkb25lID8gbGVuIC0gZG9uZSA6IG1heCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlEQkcoImNvbnRyb2wgZGF0YSBwaGFzZSBlcnJvciAocmV0ID0gJWQpIiwgcmV0KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlkb25lICs9IHJldDsKKworCQlpZiAoZGlyX2luICYmIHJldCA8IG1heCkJLyogc2hvcnQgcGFja2V0ICovCisJCQlicmVhazsKKwl9CisKKwkvKiBTdGF0dXMgcGhhc2UgKi8KKwlEQkcoIi0tLSBTVEFUVVMgUEhBU0UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCXVzYl9zZXR0b2dnbGUoZGV2LCBlcG51bSwgIWRpcl9pbiwgMSk7CisJcmV0ID0gaXNwMTE2eF9zdWJtaXRfam9iKGRldiwgcGlwZSwKKwkJCQkgIWRpcl9pbiA/IFBURF9ESVJfSU4gOiBQVERfRElSX09VVCwgTlVMTCwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJREJHKCJjb250cm9sIHN0YXR1cyBwaGFzZSBlcnJvciAocmV0ID0gJWQiLCByZXQpOworCQlyZXR1cm4gLTE7CisJfQorCisJZGV2LT5hY3RfbGVuID0gZG9uZTsKKworCWR1bXBfbXNnKGRldiwgcGlwZSwgYnVmZmVyLCBsZW4sICJERVYocmV0KSIpOworCisJcmV0dXJuIGRvbmU7Cit9CisKK2ludCBzdWJtaXRfYnVsa19tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICpidWZmZXIsCisJCSAgICBpbnQgbGVuKQoreworCWludCBkaXJfb3V0ID0gdXNiX3BpcGVvdXQocGlwZSk7CisJaW50IG1heCA9IG1heF90cmFuc2Zlcl9sZW4oZGV2LCBwaXBlKTsKKwlpbnQgZG9uZSwgcmV0OworCisJREJHKCItLS0gQlVMSyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKwlEQkcoImRldj0lbGQgcGlwZT0lbGQgYnVmPSVwIHNpemU9JWQgZGlyX291dD0lZCIsCisJICAgIHVzYl9waXBlZGV2aWNlKHBpcGUpLCB1c2JfcGlwZWVuZHBvaW50KHBpcGUpLCBidWZmZXIsIGxlbiwgZGlyX291dCk7CisKKwlkb25lID0gMDsKKwl3aGlsZSAoZG9uZSA8IGxlbikgeworCQlyZXQgPSBpc3AxMTZ4X3N1Ym1pdF9qb2IoZGV2LCBwaXBlLAorCQkJCQkgIWRpcl9vdXQgPyBQVERfRElSX0lOIDogUFREX0RJUl9PVVQsCisJCQkJCSAoX191OCAqKSBidWZmZXIgKyBkb25lLAorCQkJCQkgbWF4ID4gbGVuIC0gZG9uZSA/IGxlbiAtIGRvbmUgOiBtYXgpOworCQlpZiAocmV0IDwgMCkgeworCQkJREJHKCJlcnJvciBvbiBidWxrIG1lc3NhZ2UgKHJldCA9ICVkKSIsIHJldCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlkb25lICs9IHJldDsKKworCQlpZiAoIWRpcl9vdXQgJiYgcmV0IDwgbWF4KQkvKiBzaG9ydCBwYWNrZXQgKi8KKwkJCWJyZWFrOworCX0KKworCWRldi0+YWN0X2xlbiA9IGRvbmU7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tIEJhc2ljIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGlzcDExNnhfc3dfcmVzZXQoc3RydWN0IGlzcDExNnggKmlzcDExNngpCit7CisJaW50IHJldHJpZXMgPSAxNTsKKwlpbnQgcmV0ID0gMDsKKworCURCRygiIik7CisKKwlpc3AxMTZ4LT5kaXNhYmxlZCA9IDE7CisKKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDU1dSRVMsIEhDU1dSRVNfTUFHSUMpOworCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENDTURTVEFULCBIQ0NNRFNUQVRfSENSKTsKKwl3aGlsZSAoLS1yZXRyaWVzKSB7CisJCS8qIEl0IHVzdWFsbHkgcmVzZXRzIHdpdGhpbiAxIG1zICovCisJCXdhaXRfbXMoMSk7CisJCWlmICghKGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ0NNRFNUQVQpICYgSENDTURTVEFUX0hDUikpCisJCQlicmVhazsKKwl9CisJaWYgKCFyZXRyaWVzKSB7CisJCUVSUigic29mdHdhcmUgcmVzZXQgdGltZW91dCIpOworCQlyZXQgPSAtMTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpc3AxMTZ4X3Jlc2V0KHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4KQoreworCXVuc2lnbmVkIGxvbmcgdDsKKwl1MTYgY2xrcmR5ID0gMDsKKwlpbnQgcmV0LCB0aW1lb3V0ID0gMTUgLyogbXMgKi8gOworCisJREJHKCIiKTsKKworCXJldCA9IGlzcDExNnhfc3dfcmVzZXQoaXNwMTE2eCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWZvciAodCA9IDA7IHQgPCB0aW1lb3V0OyB0KyspIHsKKwkJY2xrcmR5ID0gaXNwMTE2eF9yZWFkX3JlZzE2KGlzcDExNngsIEhDdVBJTlQpICYgSEN1UElOVF9DTEtSRFk7CisJCWlmIChjbGtyZHkpCisJCQlicmVhazsKKwkJd2FpdF9tcygxKTsKKwl9CisJaWYgKCFjbGtyZHkpIHsKKwkJRVJSKCJjbG9jayBub3QgcmVhZHkgYWZ0ZXIgJWRtcyIsIHRpbWVvdXQpOworCQkvKiBBZnRlciBzd19yZXNldCB0aGUgY2xvY2sgd29uJ3QgcmVwb3J0IHRvIGJlIHJlYWR5LCBpZgorCQkgICBIX1dBS0VVUCBwaW4gaXMgaGlnaC4gKi8KKwkJRVJSKCJwbGVhc2UgbWFrZSBzdXJlIHRoYXQgdGhlIEhfV0FLRVVQIHBpbiBpcyBwdWxsZWQgbG93ISIpOworCQlyZXQgPSAtMTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaXNwMTE2eF9zdG9wKHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4KQoreworCXUzMiB2YWw7CisKKwlEQkcoIiIpOworCisJaXNwMTE2eF93cml0ZV9yZWcxNihpc3AxMTZ4LCBIQ3VQSU5URU5CLCAwKTsKKworCS8qIFN3aXRjaCBvZmYgcG9ydHMnIHBvd2VyLCBzb21lIGRldmljZXMgZG9uJ3QgY29tZSB1cAorCSAgIGFmdGVyIG5leHQgJ3N0YXJ0JyB3aXRob3V0IHRoaXMgKi8KKwl2YWwgPSBpc3AxMTZ4X3JlYWRfcmVnMzIoaXNwMTE2eCwgSENSSERFU0NBKTsKKwl2YWwgJj0gfihSSF9BX05QUyB8IFJIX0FfUFNNKTsKKwlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDUkhERVNDQSwgdmFsKTsKKwlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDUkhTVEFUVVMsIFJIX0hTX0xQUyk7CisKKwlpc3AxMTZ4X3N3X3Jlc2V0KGlzcDExNngpOworfQorCisvKgorICogIENvbmZpZ3VyZSB0aGUgY2hpcC4gVGhlIGNoaXAgbXVzdCBiZSBzdWNjZXNzZnVsbHkgcmVzZXQgYnkgbm93LgorICovCitzdGF0aWMgaW50IGlzcDExNnhfc3RhcnQoc3RydWN0IGlzcDExNnggKmlzcDExNngpCit7CisJc3RydWN0IGlzcDExNnhfcGxhdGZvcm1fZGF0YSAqYm9hcmQgPSBpc3AxMTZ4LT5ib2FyZDsKKwl1MzIgdmFsOworCisJREJHKCIiKTsKKworCS8qIENsZWFyIGludGVycnVwdCBzdGF0dXMgYW5kIGRpc2FibGUgYWxsIGludGVycnVwdCBzb3VyY2VzICovCisJaXNwMTE2eF93cml0ZV9yZWcxNihpc3AxMTZ4LCBIQ3VQSU5ULCAweGZmKTsKKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDdVBJTlRFTkIsIDApOworCisJaXNwMTE2eF93cml0ZV9yZWcxNihpc3AxMTZ4LCBIQ0lUTEJVRkxFTiwgSVNQMTE2eF9JVExfQlVGU0laRSk7CisJaXNwMTE2eF93cml0ZV9yZWcxNihpc3AxMTZ4LCBIQ0FUTEJVRkxFTiwgSVNQMTE2eF9BVExfQlVGU0laRSk7CisKKwkvKiBIYXJkd2FyZSBjb25maWd1cmF0aW9uICovCisJdmFsID0gSENIV0NGR19EQldJRFRIKDEpOworCWlmIChib2FyZC0+c2VsMTVLcmVzKQorCQl2YWwgfD0gSENIV0NGR18xNUtSU0VMOworCS8qIFJlbW90ZSB3YWtldXAgd29uJ3Qgd29yayB3aXRob3V0IHdvcmtpbmcgY2xvY2sgKi8KKwlpZiAoYm9hcmQtPnJlbW90ZV93YWtldXBfZW5hYmxlKQorCQl2YWwgfD0gSENIV0NGR19DTEtOT1RTVE9QOworCWlmIChib2FyZC0+b2NfZW5hYmxlKQorCQl2YWwgfD0gSENIV0NGR19BTkFMT0dfT0M7CisJaXNwMTE2eF93cml0ZV9yZWcxNihpc3AxMTZ4LCBIQ0hXQ0ZHLCB2YWwpOworCisJLyogLS0tIFJvb3QgaHViIGNvbmZpZ3VyYXRpb24gKi8KKwl2YWwgPSAoMjUgPDwgMjQpICYgUkhfQV9QT1RQR1Q7CisJLyogQU4xMDAwM18xLnBkZiByZWNvbW1lbmRzIFJIX0FfTlBTIChubyBwb3dlciBzd2l0Y2hpbmcpIHRvCisJICAgYmUgYWx3YXlzIHNldC4gWWV0LCBpbnN0ZWFkLCB3ZSByZXF1ZXN0IGluZGl2aWR1YWwgcG9ydAorCSAgIHBvd2VyIHN3aXRjaGluZy4gKi8KKwl2YWwgfD0gUkhfQV9QU007CisJLyogUmVwb3J0IG92ZXJjdXJyZW50IHBlciBwb3J0ICovCisJdmFsIHw9IFJIX0FfT0NQTTsKKwlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDUkhERVNDQSwgdmFsKTsKKwlpc3AxMTZ4LT5yaGRlc2NhID0gaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIEhDUkhERVNDQSk7CisKKwl2YWwgPSBSSF9CX1BQQ007CisJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ1JIREVTQ0IsIHZhbCk7CisJaXNwMTE2eC0+cmhkZXNjYiA9IGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ1JIREVTQ0IpOworCisJdmFsID0gMDsKKwlpZiAoYm9hcmQtPnJlbW90ZV93YWtldXBfZW5hYmxlKQorCQl2YWwgfD0gUkhfSFNfRFJXRTsKKwlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDUkhTVEFUVVMsIHZhbCk7CisJaXNwMTE2eC0+cmhzdGF0dXMgPSBpc3AxMTZ4X3JlYWRfcmVnMzIoaXNwMTE2eCwgSENSSFNUQVRVUyk7CisKKwlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDRk1JTlRWTCwgMHgyNzc4MmVkZik7CisKKwkvKiBHbyBvcGVyYXRpb25hbCAqLworCXZhbCA9IEhDQ09OVFJPTF9VU0JfT1BFUjsKKwlpZiAoYm9hcmQtPnJlbW90ZV93YWtldXBfZW5hYmxlKQorCQl2YWwgfD0gSENDT05UUk9MX1JXRTsKKwlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDQ09OVFJPTCwgdmFsKTsKKworCS8qIERpc2FibGUgcG9ydHMgdG8gYXZvaWQgcmFjZSBpbiBkZXZpY2UgZW51bWVyYXRpb24gKi8KKwlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDUkhQT1JUMSwgUkhfUFNfQ0NTKTsKKwlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDUkhQT1JUMiwgUkhfUFNfQ0NTKTsKKworCWlzcDExNnhfc2hvd19yZWdzKGlzcDExNngpOworCisJaXNwMTE2eC0+ZGlzYWJsZWQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLSBJbml0IGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW50IGlzcDExNnhfY2hlY2tfaWQoc3RydWN0IGlzcDExNnggKmlzcDExNngpCit7CisJaW50IHZhbDsKKworCXZhbCA9IGlzcDExNnhfcmVhZF9yZWcxNihpc3AxMTZ4LCBIQ0NISVBJRCk7CisJaWYgKCh2YWwgJiBIQ0NISVBJRF9NQVNLKSAhPSBIQ0NISVBJRF9NQUdJQykgeworCQlFUlIoImludmFsaWQgY2hpcCBJRCAlMDR4IiwgdmFsKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgdXNiX2xvd2xldmVsX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCA9ICZpc3AxMTZ4X2RldjsKKworCURCRygiIik7CisKKwkvKiBJbml0IGRldmljZSByZWdpc3RlcnMgYWRkciAqLworCWlzcDExNngtPmFkZHJfcmVnID0gKHUxNiAqKSBJU1AxMTZYX0hDRF9BRERSOworCWlzcDExNngtPmRhdGFfcmVnID0gKHUxNiAqKSBJU1AxMTZYX0hDRF9EQVRBOworCisJLyogU2V0dXAgc3BlY2lmaWMgYm9hcmQgc2V0dGluZ3MgKi8KKyNpZmRlZiBJU1AxMTZYX0hDRF9TRUwxNWtSRVMKKwlpc3AxMTZ4X2JvYXJkLnNlbDE1S3JlcyA9IDE7CisjZW5kaWYKKyNpZmRlZiBJU1AxMTZYX0hDRF9PQ19FTkFCTEUKKwlpc3AxMTZ4X2JvYXJkLm9jX2VuYWJsZSA9IDE7CisjZW5kaWYKKyNpZmRlZiBJU1AxMTZYX0hDRF9SRU1PVEVfV0FLRVVQX0VOQUJMRQorCWlzcDExNnhfYm9hcmQucmVtb3RlX3dha2V1cF9lbmFibGUgPSAxOworI2VuZGlmCisJaXNwMTE2eC0+Ym9hcmQgPSAmaXNwMTE2eF9ib2FyZDsKKworCS8qIFRyeSB0byBnZXQgSVNQMTE2eCBzaWxpY29uIGNoaXAgSUQgKi8KKwlpZiAoaXNwMTE2eF9jaGVja19pZChpc3AxMTZ4KSA8IDApCisJCXJldHVybiAtMTsKKworCWlzcDExNngtPmRpc2FibGVkID0gMTsKKwlpc3AxMTZ4LT5zbGVlcGluZyA9IDA7CisKKwlpc3AxMTZ4X3Jlc2V0KGlzcDExNngpOworCWlzcDExNnhfc3RhcnQoaXNwMTE2eCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYl9sb3dsZXZlbF9zdG9wKHZvaWQpCit7CisJc3RydWN0IGlzcDExNnggKmlzcDExNnggPSAmaXNwMTE2eF9kZXY7CisKKwlEQkcoIiIpOworCisJaWYgKCFpc3AxMTZ4LT5kaXNhYmxlZCkKKwkJaXNwMTE2eF9zdG9wKGlzcDExNngpOworCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgkJCQkvKiBDT05GSUdfVVNCX0lTUDExNlhfSENEICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzcDExNnguaCBiL2RyaXZlcnMvaXNwMTE2eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzY2UzYjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lzcDExNnguaApAQCAtMCwwICsxLDQ4OSBAQAorLyoKKyAqIElTUDExNnggcmVnaXN0ZXIgZGVjbGFyYXRpb25zIGFuZCBIQ0QgZGF0YSBzdHJ1Y3R1cmVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJvZG9sZm8gR2lvbWV0dGkgPGdpb21ldHRpQGxpbnV4Lml0PgorICogQ29weXJpZ2h0IChDKSAyMDA3IEV1cm90ZWNoIFMucC5BLiA8aW5mb0BldXJvdGVjaC5pdD4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBPbGF2IEtvbmdhcyA8b2tAYXJ0ZWNkZXNpZ24uZWU+CisgKiBQb3J0aW9uczoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBMb3RoYXIgV2Fzc21hbm4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBQc2lvbiBUZWtsb2dpeAorICogQ29weXJpZ2h0IChDKSAyMDA0IERhdmlkIEJyb3duZWxsCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmZGVmIERFQlVHCisjZGVmaW5lIERCRyhmbXQsIGFyZ3MuLi4pCVwKKwkJcHJpbnRmKCJpc3AxMTZ4OiAlczogIiBmbXQgIlxuIiAsIF9fRlVOQ1RJT05fXyAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBEQkcoZm10LCBhcmdzLi4uKQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWZkZWYgVkVSQk9TRQorIyAgICBkZWZpbmUgVkRCRwkJREJHCisjZWxzZQorIyAgICBkZWZpbmUgVkRCRyhmbXQsIGFyZ3MuLi4pCWRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKyNkZWZpbmUgRVJSKGZtdCwgYXJncy4uLikJXAorCQlwcmludGYoImlzcDExNng6ICVzOiAiIGZtdCAiXG4iICwgX19GVU5DVElPTl9fICwgIyMgYXJncykKKyNkZWZpbmUgV0FSTihmbXQsIGFyZ3MuLi4pCVwKKwkJcHJpbnRmKCJpc3AxMTZ4OiAlczogIiBmbXQgIlxuIiAsIF9fRlVOQ1RJT05fXyAsICMjIGFyZ3MpCisjZGVmaW5lIElORk8oZm10LCBhcmdzLi4uKQlcCisJCXByaW50ZigiaXNwMTE2eDogIiBmbXQgIlxuIiAsICMjIGFyZ3MpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogdXMgb2YgMW1zIGZyYW1lICovCisjZGVmaW5lICBNQVhfTE9BRF9MSU1JVAkJODUwCisKKy8qIEZ1bGwgc3BlZWQ6IG1heCAjIG9mIGJ5dGVzIHRvIHRyYW5zZmVyIGZvciBhIHNpbmdsZSB1cmIKKyAgIGF0IGEgdGltZSBtdXN0IGJlIDwgMTAyNCAmJiBtdXN0IGJlIG11bHRpcGxlIG9mIDY0LgorICAgODMyIGFsbG93cyB0cmFuc2ZlcmluZyA0a2lCIHdpdGhpbiA1IGZyYW1lcy4gKi8KKyNkZWZpbmUgTUFYX1RSQU5TRkVSX1NJWkVfRlVMTFNQRUVECTgzMgorCisvKiBMb3cgc3BlZWQ6IHRoZXJlIGlzIG5vIHJlYXNvbiB0byBzY2hlZHVsZSBpbiB2ZXJ5IGJpZworICAgY2h1bmtzOyBvZnRlbiB0aGUgcmVxdWVzdGVkIGxvbmcgdHJhbnNmZXJzIGFyZSBmb3IKKyAgIHN0cmluZyBkZXNjcmlwdG9ycyBjb250YWluaW5nIHNob3J0IHN0cmluZ3MuICovCisjZGVmaW5lIE1BWF9UUkFOU0ZFUl9TSVpFX0xPV1NQRUVECTY0CisKKy8qIEJ5dGV0aW1lICh1cyksIGEgcm91Z2ggaW5kaWNhdGlvbiBvZiBob3cgbXVjaCB0aW1lIGl0CisgICB3b3VsZCB0YWtlIHRvIHRyYW5zZmVyIGEgYnl0ZSBvZiB1c2VmdWwgZGF0YSBvdmVyIFVTQiAqLworI2RlZmluZSBCWVRFX1RJTUVfRlVMTFNQRUVECTEKKyNkZWZpbmUgQllURV9USU1FX0xPV1NQRUVECTIwCisKKy8qIEJ1ZmZlciBzaXplcyAqLworI2RlZmluZSBJU1AxMTZ4X0JVRl9TSVpFCTQwOTYKKyNkZWZpbmUgSVNQMTE2eF9JVExfQlVGU0laRQkwCisjZGVmaW5lIElTUDExNnhfQVRMX0JVRlNJWkUJKChJU1AxMTZ4X0JVRl9TSVpFKSAtIDIqKElTUDExNnhfSVRMX0JVRlNJWkUpKQorCisjZGVmaW5lIElTUDExNnhfV1JJVEVfT0ZGU0VUCTB4ODAKKworLyogLS0tIElTUDExNnggcmVnaXN0ZXJzL2JpdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lCUhDUkVWSVNJT04JMHgwMAorI2RlZmluZQlIQ0NPTlRST0wJMHgwMQorI2RlZmluZQkJSENDT05UUk9MX0hDRlMJKDMgPDwgNikJLyogaG9zdCBjb250cm9sbGVyCisJCQkJCQkgICBmdW5jdGlvbmFsIHN0YXRlICovCisjZGVmaW5lCQlIQ0NPTlRST0xfVVNCX1JFU0VUCSgwIDw8IDYpCisjZGVmaW5lCQlIQ0NPTlRST0xfVVNCX1JFU1VNRQkoMSA8PCA2KQorI2RlZmluZQkJSENDT05UUk9MX1VTQl9PUEVSCSgyIDw8IDYpCisjZGVmaW5lCQlIQ0NPTlRST0xfVVNCX1NVU1BFTkQJKDMgPDwgNikKKyNkZWZpbmUJCUhDQ09OVFJPTF9SV0MJKDEgPDwgOSkJLyogcmVtb3RlIHdha2V1cCBjb25uZWN0ZWQgKi8KKyNkZWZpbmUJCUhDQ09OVFJPTF9SV0UJKDEgPDwgMTApCS8qIHJlbW90ZSB3YWtldXAgZW5hYmxlICovCisjZGVmaW5lCUhDQ01EU1RBVAkweDAyCisjZGVmaW5lCQlIQ0NNRFNUQVRfSENSCSgxIDw8IDApCS8qIGhvc3QgY29udHJvbGxlciByZXNldCAqLworI2RlZmluZQkJSENDTURTVEFUX1NPQwkoMyA8PCAxNikJLyogc2NoZWR1bGluZyBvdmVycnVuIGNvdW50ICovCisjZGVmaW5lCUhDSU5UU1RBVAkweDAzCisjZGVmaW5lCQlIQ0lOVF9TTwkoMSA8PCAwKQkvKiBzY2hlZHVsaW5nIG92ZXJydW4gKi8KKyNkZWZpbmUJCUhDSU5UX1dESAkoMSA8PCAxKQkvKiB3cml0ZWJhY2sgb2YgZG9uZV9oZWFkICovCisjZGVmaW5lCQlIQ0lOVF9TRgkoMSA8PCAyKQkvKiBzdGFydCBmcmFtZSAqLworI2RlZmluZQkJSENJTlRfUkQJKDEgPDwgMykJLyogcmVzdW1lIGRldGVjdCAqLworI2RlZmluZQkJSENJTlRfVUUJKDEgPDwgNCkJLyogdW5yZWNvdmVyYWJsZSBlcnJvciAqLworI2RlZmluZQkJSENJTlRfRk5PCSgxIDw8IDUpCS8qIGZyYW1lIG51bWJlciBvdmVyZmxvdyAqLworI2RlZmluZQkJSENJTlRfUkhTQwkoMSA8PCA2KQkvKiByb290IGh1YiBzdGF0dXMgY2hhbmdlICovCisjZGVmaW5lCQlIQ0lOVF9PQwkoMSA8PCAzMCkJLyogb3duZXJzaGlwIGNoYW5nZSAqLworI2RlZmluZQkJSENJTlRfTUlFCSgxIDw8IDMxKQkvKiBtYXN0ZXIgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZQlIQ0lOVEVOQgkweDA0CisjZGVmaW5lCUhDSU5URElTCTB4MDUKKyNkZWZpbmUJSENGTUlOVFZMCTB4MGQKKyNkZWZpbmUJSENGTVJFTQkJMHgwZQorI2RlZmluZQlIQ0ZNTlVNCQkweDBmCisjZGVmaW5lCUhDTFNUSFJFU0gJMHgxMQorI2RlZmluZQlIQ1JIREVTQ0EJMHgxMgorI2RlZmluZQkJUkhfQV9ORFAJKDB4MyA8PCAwKQkvKiAjIGRvd25zdHJlYW0gcG9ydHMgKi8KKyNkZWZpbmUJCVJIX0FfUFNNCSgxIDw8IDgpCS8qIHBvd2VyIHN3aXRjaGluZyBtb2RlICovCisjZGVmaW5lCQlSSF9BX05QUwkoMSA8PCA5KQkvKiBubyBwb3dlciBzd2l0Y2hpbmcgKi8KKyNkZWZpbmUJCVJIX0FfRFQJCSgxIDw8IDEwKQkvKiBkZXZpY2UgdHlwZSAobWJ6KSAqLworI2RlZmluZQkJUkhfQV9PQ1BNCSgxIDw8IDExKQkvKiBvdmVyY3VycmVudCBwcm90ZWN0aW9uCisJCQkJCQkgICBtb2RlICovCisjZGVmaW5lCQlSSF9BX05PQ1AJKDEgPDwgMTIpCS8qIG5vIG92ZXJjdXJyZW50IHByb3RlY3Rpb24gKi8KKyNkZWZpbmUJCVJIX0FfUE9UUEdUCSgweGZmIDw8IDI0KQkvKiBwb3dlciBvbiAtPiBwb3dlciBnb29kCisJCQkJCQkgICB0aW1lICovCisjZGVmaW5lCUhDUkhERVNDQgkweDEzCisjZGVmaW5lCQlSSF9CX0RSCQkoMHhmZmZmIDw8IDApCS8qIGRldmljZSByZW1vdmFibGUgZmxhZ3MgKi8KKyNkZWZpbmUJCVJIX0JfUFBDTQkoMHhmZmZmIDw8IDE2KQkvKiBwb3J0IHBvd2VyIGNvbnRyb2wgbWFzayAqLworI2RlZmluZQlIQ1JIU1RBVFVTCTB4MTQKKyNkZWZpbmUJCVJIX0hTX0xQUwkoMSA8PCAwKQkvKiBsb2NhbCBwb3dlciBzdGF0dXMgKi8KKyNkZWZpbmUJCVJIX0hTX09DSQkoMSA8PCAxKQkvKiBvdmVyIGN1cnJlbnQgaW5kaWNhdG9yICovCisjZGVmaW5lCQlSSF9IU19EUldFCSgxIDw8IDE1KQkvKiBkZXZpY2UgcmVtb3RlIHdha2V1cAorCQkJCQkJICAgZW5hYmxlICovCisjZGVmaW5lCQlSSF9IU19MUFNDCSgxIDw8IDE2KQkvKiBsb2NhbCBwb3dlciBzdGF0dXMgY2hhbmdlICovCisjZGVmaW5lCQlSSF9IU19PQ0lDCSgxIDw8IDE3KQkvKiBvdmVyIGN1cnJlbnQgaW5kaWNhdG9yCisJCQkJCQkgICBjaGFuZ2UgKi8KKyNkZWZpbmUJCVJIX0hTX0NSV0UJKDEgPDwgMzEpCS8qIGNsZWFyIHJlbW90ZSB3YWtldXAKKwkJCQkJCSAgIGVuYWJsZSAqLworI2RlZmluZQlIQ1JIUE9SVDEJMHgxNQorI2RlZmluZQkJUkhfUFNfQ0NTCSgxIDw8IDApCS8qIGN1cnJlbnQgY29ubmVjdCBzdGF0dXMgKi8KKyNkZWZpbmUJCVJIX1BTX1BFUwkoMSA8PCAxKQkvKiBwb3J0IGVuYWJsZSBzdGF0dXMgKi8KKyNkZWZpbmUJCVJIX1BTX1BTUwkoMSA8PCAyKQkvKiBwb3J0IHN1c3BlbmQgc3RhdHVzICovCisjZGVmaW5lCQlSSF9QU19QT0NJCSgxIDw8IDMpCS8qIHBvcnQgb3ZlciBjdXJyZW50CisJCQkJCQkgICBpbmRpY2F0b3IgKi8KKyNkZWZpbmUJCVJIX1BTX1BSUwkoMSA8PCA0KQkvKiBwb3J0IHJlc2V0IHN0YXR1cyAqLworI2RlZmluZQkJUkhfUFNfUFBTCSgxIDw8IDgpCS8qIHBvcnQgcG93ZXIgc3RhdHVzICovCisjZGVmaW5lCQlSSF9QU19MU0RBCSgxIDw8IDkpCS8qIGxvdyBzcGVlZCBkZXZpY2UgYXR0YWNoZWQgKi8KKyNkZWZpbmUJCVJIX1BTX0NTQwkoMSA8PCAxNikJLyogY29ubmVjdCBzdGF0dXMgY2hhbmdlICovCisjZGVmaW5lCQlSSF9QU19QRVNDCSgxIDw8IDE3KQkvKiBwb3J0IGVuYWJsZSBzdGF0dXMgY2hhbmdlICovCisjZGVmaW5lCQlSSF9QU19QU1NDCSgxIDw8IDE4KQkvKiBwb3J0IHN1c3BlbmQgc3RhdHVzCisJCQkJCQkgICBjaGFuZ2UgKi8KKyNkZWZpbmUJCVJIX1BTX09DSUMJKDEgPDwgMTkpCS8qIG92ZXIgY3VycmVudCBpbmRpY2F0b3IKKwkJCQkJCSAgIGNoYW5nZSAqLworI2RlZmluZQkJUkhfUFNfUFJTQwkoMSA8PCAyMCkJLyogcG9ydCByZXNldCBzdGF0dXMgY2hhbmdlICovCisjZGVmaW5lCQlIQ1JIUE9SVF9DTFJNQVNLCSgweDFmIDw8IDE2KQorI2RlZmluZQlIQ1JIUE9SVDIJMHgxNgorI2RlZmluZQlIQ0hXQ0ZHCQkweDIwCisjZGVmaW5lCQlIQ0hXQ0ZHXzE1S1JTRUwJCSgxIDw8IDEyKQorI2RlZmluZQkJSENIV0NGR19DTEtOT1RTVE9QCSgxIDw8IDExKQorI2RlZmluZQkJSENIV0NGR19BTkFMT0dfT0MJKDEgPDwgMTApCisjZGVmaW5lCQlIQ0hXQ0ZHX0RBQ0tfTU9ERQkoMSA8PCA4KQorI2RlZmluZQkJSENIV0NGR19FT1RfUE9MCQkoMSA8PCA3KQorI2RlZmluZQkJSENIV0NGR19EQUNLX1BPTAkoMSA8PCA2KQorI2RlZmluZQkJSENIV0NGR19EUkVRX1BPTAkoMSA8PCA1KQorI2RlZmluZQkJSENIV0NGR19EQldJRFRIX01BU0sJKDB4MDMgPDwgMykKKyNkZWZpbmUJCUhDSFdDRkdfREJXSURUSChuKQkoKChuKSA8PCAzKSAmIEhDSFdDRkdfREJXSURUSF9NQVNLKQorI2RlZmluZQkJSENIV0NGR19JTlRfUE9MCQkoMSA8PCAyKQorI2RlZmluZQkJSENIV0NGR19JTlRfVFJJR0dFUgkoMSA8PCAxKQorI2RlZmluZQkJSENIV0NGR19JTlRfRU5BQkxFCSgxIDw8IDApCisjZGVmaW5lCUhDRE1BQ0ZHCTB4MjEKKyNkZWZpbmUJCUhDRE1BQ0ZHX0JVUlNUX0xFTl9NQVNLCSgweDAzIDw8IDUpCisjZGVmaW5lCQlIQ0RNQUNGR19CVVJTVF9MRU4obikJKCgobikgPDwgNSkgJiBIQ0RNQUNGR19CVVJTVF9MRU5fTUFTSykKKyNkZWZpbmUJCUhDRE1BQ0ZHX0JVUlNUX0xFTl8xCUhDRE1BQ0ZHX0JVUlNUX0xFTigwKQorI2RlZmluZQkJSENETUFDRkdfQlVSU1RfTEVOXzQJSENETUFDRkdfQlVSU1RfTEVOKDEpCisjZGVmaW5lCQlIQ0RNQUNGR19CVVJTVF9MRU5fOAlIQ0RNQUNGR19CVVJTVF9MRU4oMikKKyNkZWZpbmUJCUhDRE1BQ0ZHX0RNQV9FTkFCTEUJKDEgPDwgNCkKKyNkZWZpbmUJCUhDRE1BQ0ZHX0JVRl9UWVBFX01BU0sJKDB4MDcgPDwgMSkKKyNkZWZpbmUJCUhDRE1BQ0ZHX0NUUl9TRUwJKDEgPDwgMikKKyNkZWZpbmUJCUhDRE1BQ0ZHX0lUTEFUTF9TRUwJKDEgPDwgMSkKKyNkZWZpbmUJCUhDRE1BQ0ZHX0RNQV9SV19TRUxFQ1QJKDEgPDwgMCkKKyNkZWZpbmUJSENYRkVSQ1RSCTB4MjIKKyNkZWZpbmUJSEN1UElOVAkJMHgyNAorI2RlZmluZQkJSEN1UElOVF9TT0YJCSgxIDw8IDApCisjZGVmaW5lCQlIQ3VQSU5UX0FUTAkJKDEgPDwgMSkKKyNkZWZpbmUJCUhDdVBJTlRfQUlJRU9UCQkoMSA8PCAyKQorI2RlZmluZQkJSEN1UElOVF9PUFIJCSgxIDw8IDQpCisjZGVmaW5lCQlIQ3VQSU5UX1NVU1AJCSgxIDw8IDUpCisjZGVmaW5lCQlIQ3VQSU5UX0NMS1JEWQkJKDEgPDwgNikKKyNkZWZpbmUJSEN1UElOVEVOQgkweDI1CisjZGVmaW5lCUhDQ0hJUElECTB4MjcKKyNkZWZpbmUJCUhDQ0hJUElEX01BU0sJCTB4ZmYwMAorI2RlZmluZQkJSENDSElQSURfTUFHSUMJCTB4NjEwMAorI2RlZmluZQlIQ1NDUkFUQ0gJMHgyOAorI2RlZmluZQlIQ1NXUkVTCQkweDI5CisjZGVmaW5lCQlIQ1NXUkVTX01BR0lDCQkweDAwZjYKKyNkZWZpbmUJSENJVExCVUZMRU4JMHgyYQorI2RlZmluZQlIQ0FUTEJVRkxFTgkweDJiCisjZGVmaW5lCUhDQlVGU1RBVAkweDJjCisjZGVmaW5lCQlIQ0JVRlNUQVRfSVRMMF9GVUxMCSgxIDw8IDApCisjZGVmaW5lCQlIQ0JVRlNUQVRfSVRMMV9GVUxMCSgxIDw8IDEpCisjZGVmaW5lCQlIQ0JVRlNUQVRfQVRMX0ZVTEwJKDEgPDwgMikKKyNkZWZpbmUJCUhDQlVGU1RBVF9JVEwwX0RPTkUJKDEgPDwgMykKKyNkZWZpbmUJCUhDQlVGU1RBVF9JVEwxX0RPTkUJKDEgPDwgNCkKKyNkZWZpbmUJCUhDQlVGU1RBVF9BVExfRE9ORQkoMSA8PCA1KQorI2RlZmluZQlIQ1JESVRMMExFTgkweDJkCisjZGVmaW5lCUhDUkRJVEwxTEVOCTB4MmUKKyNkZWZpbmUJSENJVExQT1JUCTB4NDAKKyNkZWZpbmUJSENBVExQT1JUCTB4NDEKKworLyogUFREIGFjY2Vzc29yIG1hY3Jvcy4gKi8KKyNkZWZpbmUgUFREX0dFVF9DT1VOVChwKQkoKChwKS0+Y291bnQgJiBQVERfQ09VTlRfTVNLKSA+PiAwKQorI2RlZmluZSBQVERfQ09VTlQodikJCSgoKHYpIDw8IDApICYgUFREX0NPVU5UX01TSykKKyNkZWZpbmUgUFREX0dFVF9UT0dHTEUocCkJKCgocCktPmNvdW50ICYgUFREX1RPR0dMRV9NU0spID4+IDEwKQorI2RlZmluZSBQVERfVE9HR0xFKHYpCQkoKCh2KSA8PCAxMCkgJiBQVERfVE9HR0xFX01TSykKKyNkZWZpbmUgUFREX0dFVF9BQ1RJVkUocCkJKCgocCktPmNvdW50ICYgUFREX0FDVElWRV9NU0spID4+IDExKQorI2RlZmluZSBQVERfQUNUSVZFKHYpCQkoKCh2KSA8PCAxMSkgJiBQVERfQUNUSVZFX01TSykKKyNkZWZpbmUgUFREX0dFVF9DQyhwKQkJKCgocCktPmNvdW50ICYgUFREX0NDX01TSykgPj4gMTIpCisjZGVmaW5lIFBURF9DQyh2KQkJKCgodikgPDwgMTIpICYgUFREX0NDX01TSykKKyNkZWZpbmUgUFREX0dFVF9NUFMocCkJCSgoKHApLT5tcHMgJiBQVERfTVBTX01TSykgPj4gMCkKKyNkZWZpbmUgUFREX01QUyh2KQkJKCgodikgPDwgMCkgJiBQVERfTVBTX01TSykKKyNkZWZpbmUgUFREX0dFVF9TUEQocCkJCSgoKHApLT5tcHMgJiBQVERfU1BEX01TSykgPj4gMTApCisjZGVmaW5lIFBURF9TUEQodikJCSgoKHYpIDw8IDEwKSAmIFBURF9TUERfTVNLKQorI2RlZmluZSBQVERfR0VUX0xBU1QocCkJCSgoKHApLT5tcHMgJiBQVERfTEFTVF9NU0spID4+IDExKQorI2RlZmluZSBQVERfTEFTVCh2KQkJKCgodikgPDwgMTEpICYgUFREX0xBU1RfTVNLKQorI2RlZmluZSBQVERfR0VUX0VQKHApCQkoKChwKS0+bXBzICYgUFREX0VQX01TSykgPj4gMTIpCisjZGVmaW5lIFBURF9FUCh2KQkJKCgodikgPDwgMTIpICYgUFREX0VQX01TSykKKyNkZWZpbmUgUFREX0dFVF9MRU4ocCkJCSgoKHApLT5sZW4gJiBQVERfTEVOX01TSykgPj4gMCkKKyNkZWZpbmUgUFREX0xFTih2KQkJKCgodikgPDwgMCkgJiBQVERfTEVOX01TSykKKyNkZWZpbmUgUFREX0dFVF9ESVIocCkJCSgoKHApLT5sZW4gJiBQVERfRElSX01TSykgPj4gMTApCisjZGVmaW5lIFBURF9ESVIodikJCSgoKHYpIDw8IDEwKSAmIFBURF9ESVJfTVNLKQorI2RlZmluZSBQVERfR0VUX0I1XzUocCkJCSgoKHApLT5sZW4gJiBQVERfQjVfNV9NU0spID4+IDEzKQorI2RlZmluZSBQVERfQjVfNSh2KQkJKCgodikgPDwgMTMpICYgUFREX0I1XzVfTVNLKQorI2RlZmluZSBQVERfR0VUX0ZBKHApCQkoKChwKS0+ZmFkZHIgJiBQVERfRkFfTVNLKSA+PiAwKQorI2RlZmluZSBQVERfRkEodikJCSgoKHYpIDw8IDApICYgUFREX0ZBX01TSykKKyNkZWZpbmUgUFREX0dFVF9GTVQocCkJCSgoKHApLT5mYWRkciAmIFBURF9GTVRfTVNLKSA+PiA3KQorI2RlZmluZSBQVERfRk1UKHYpCQkoKCh2KSA8PCA3KSAmIFBURF9GTVRfTVNLKQorCisvKiAgSGFyZHdhcmUgdHJhbnNmZXIgc3RhdHVzIGNvZGVzIC0tIENDIGZyb20gcHRkLT5jb3VudCAqLworI2RlZmluZSBURF9DQ19OT0VSUk9SICAgICAgMHgwMAorI2RlZmluZSBURF9DQ19DUkMgICAgICAgICAgMHgwMQorI2RlZmluZSBURF9DQ19CSVRTVFVGRklORyAgMHgwMgorI2RlZmluZSBURF9DQ19EQVRBVE9HR0xFTSAgMHgwMworI2RlZmluZSBURF9DQ19TVEFMTCAgICAgICAgMHgwNAorI2RlZmluZSBURF9ERVZOT1RSRVNQICAgICAgMHgwNQorI2RlZmluZSBURF9QSURDSEVDS0ZBSUwgICAgMHgwNgorI2RlZmluZSBURF9VTkVYUEVDVEVEUElEICAgMHgwNworI2RlZmluZSBURF9EQVRBT1ZFUlJVTiAgICAgMHgwOAorI2RlZmluZSBURF9EQVRBVU5ERVJSVU4gICAgMHgwOQorICAgIC8qIDB4MEEsIDB4MEIgcmVzZXJ2ZWQgZm9yIGhhcmR3YXJlICovCisjZGVmaW5lIFREX0JVRkZFUk9WRVJSVU4gICAweDBDCisjZGVmaW5lIFREX0JVRkZFUlVOREVSUlVOICAweDBECisgICAgLyogMHgwRSwgMHgwRiByZXNlcnZlZCBmb3IgSENEICovCisjZGVmaW5lIFREX05PVEFDQ0VTU0VEICAgICAweDBGCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZQlMT0cyX1BFUklPRElDX1NJWkUJNQkvKiBhcmJpdHJhcnk7IHRoaXMgbWF0Y2hlcyBPSENJICovCisjZGVmaW5lCVBFUklPRElDX1NJWkUJCSgxIDw8IExPRzJfUEVSSU9ESUNfU0laRSkKKworLyogUGhpbGlwcyB0cmFuc2ZlciBkZXNjcmlwdG9yICovCitzdHJ1Y3QgcHRkIHsKKwl1MTYgY291bnQ7CisjZGVmaW5lCVBURF9DT1VOVF9NU0sJKDB4M2ZmIDw8IDApCisjZGVmaW5lCVBURF9UT0dHTEVfTVNLCSgxIDw8IDEwKQorI2RlZmluZQlQVERfQUNUSVZFX01TSwkoMSA8PCAxMSkKKyNkZWZpbmUJUFREX0NDX01TSwkoMHhmIDw8IDEyKQorCXUxNiBtcHM7CisjZGVmaW5lCVBURF9NUFNfTVNLCSgweDNmZiA8PCAwKQorI2RlZmluZQlQVERfU1BEX01TSwkoMSA8PCAxMCkKKyNkZWZpbmUJUFREX0xBU1RfTVNLCSgxIDw8IDExKQorI2RlZmluZQlQVERfRVBfTVNLCSgweGYgPDwgMTIpCisJdTE2IGxlbjsKKyNkZWZpbmUJUFREX0xFTl9NU0sJKDB4M2ZmIDw8IDApCisjZGVmaW5lCVBURF9ESVJfTVNLCSgzIDw8IDEwKQorI2RlZmluZQlQVERfRElSX1NFVFVQCSgwKQorI2RlZmluZQlQVERfRElSX09VVAkoMSkKKyNkZWZpbmUJUFREX0RJUl9JTgkoMikKKyNkZWZpbmUJUFREX0I1XzVfTVNLCSgxIDw8IDEzKQorCXUxNiBmYWRkcjsKKyNkZWZpbmUJUFREX0ZBX01TSwkoMHg3ZiA8PCAwKQorI2RlZmluZQlQVERfRk1UX01TSwkoMSA8PCA3KQorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkLCBhbGlnbmVkKDIpKSk7CisKK3N0cnVjdCBpc3AxMTZ4X2VwIHsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwlzdHJ1Y3QgcHRkIHB0ZDsKKworCXU4IG1heHBhY2tldDsKKwl1OCBlcG51bTsKKwl1OCBuZXh0cGlkOworCisJdTE2IGxlbmd0aDsJCS8qIG9mIGN1cnJlbnQgcGFja2V0ICovCisJdW5zaWduZWQgY2hhciAqZGF0YTsJLyogdG8gZGF0YWJ1ZiAqLworCisJdTE2IGVycm9yX2NvdW50OworfTsKKworLyogVVJCIHN0cnVjdCAqLworI2RlZmluZSBOX1VSQl9URAkJNDgKKyNkZWZpbmUgVVJCX0RFTAkJCTEKK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgaXNwMTE2eF9lcCAqZWQ7CisJdm9pZCAqdHJhbnNmZXJfYnVmZmVyOwkvKiAoaW4pIGFzc29jaWF0ZWQgZGF0YSBidWZmZXIgKi8KKwlpbnQgYWN0dWFsX2xlbmd0aDsJLyogKHJldHVybikgYWN0dWFsIHRyYW5zZmVyIGxlbmd0aCAqLworCXVuc2lnbmVkIGxvbmcgcGlwZTsJLyogKGluKSBwaXBlIGluZm9ybWF0aW9uICovCisjaWYgMAorCWludCBzdGF0ZTsKKyNlbmRpZgorfSB1cmJfcHJpdl90OworCitzdHJ1Y3QgaXNwMTE2eF9wbGF0Zm9ybV9kYXRhIHsKKwkvKiBFbmFibGUgaW50ZXJuYWwgcmVzaXN0b3JzIG9uIGRvd25zdHJlYW0gcG9ydHMgKi8KKwl1bnNpZ25lZCBzZWwxNUtyZXM6MTsKKwkvKiBPbi1jaGlwIG92ZXJjdXJyZW50IGRldGVjdGlvbiAqLworCXVuc2lnbmVkIG9jX2VuYWJsZToxOworCS8qIEVuYWJsZSB3YWtldXAgYnkgZGV2aWNlcyBvbiB1c2IgYnVzIChlLmcuIHdha2V1cAorCSAgIGJ5IGF0dGFjaG1lbnQvZGV0YWNobWVudCBvciBieSBkZXZpY2UgYWN0aXZpdHkKKwkgICBzdWNoIGFzIG1vdmluZyBhIG1vdXNlKS4gV2hlbiBjaG9zZW4sIHRoaXMgb3B0aW9uCisJICAgcHJldmVudHMgc3RvcHBpbmcgaW50ZXJuYWwgY2xvY2ssIGluY3JlYXNpbmcKKwkgICB0aGVyZWJ5IHBvd2VyIGNvbnN1bXB0aW9uIGluIHN1c3BlbmRlZCBzdGF0ZS4gKi8KKwl1bnNpZ25lZCByZW1vdGVfd2FrZXVwX2VuYWJsZToxOworfTsKKworc3RydWN0IGlzcDExNnggeworCXUxNiAqYWRkcl9yZWc7CisJdTE2ICpkYXRhX3JlZzsKKworCXN0cnVjdCBpc3AxMTZ4X3BsYXRmb3JtX2RhdGEgKmJvYXJkOworCisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXVuc2lnbmVkIGxvbmcgc3RhdDEsIHN0YXQyLCBzdGF0NCwgc3RhdDgsIHN0YXQxNjsKKworCS8qIFN0YXR1cyBmbGFncyAqLworCXVuc2lnbmVkIGRpc2FibGVkOjE7CisJdW5zaWduZWQgc2xlZXBpbmc6MTsKKworCS8qIFJvb3QgaHViIHJlZ2lzdGVycyAqLworCXUzMiByaGRlc2NhOworCXUzMiByaGRlc2NiOworCXUzMiByaHN0YXR1czsKKwl1MzIgcmhwb3J0WzJdOworCisJLyogU2NoZWR1bGUgZm9yIHRoZSBjdXJyZW50IGZyYW1lICovCisJc3RydWN0IGlzcDExNnhfZXAgKmF0bF9hY3RpdmU7CisJaW50IGF0bF9idWZsZW47CisJaW50IGF0bF9idWZzaHJ0OworCWludCBhdGxfbGFzdF9kaXI7CisJaW50IGF0bF9maW5pc2hpbmc7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEludGVyLWlvIGRlbGF5IChucykuIFRoZSBjaGlwIGlzIHBpY2t5IGFib3V0IGFjY2VzcyB0aW1pbmdzOyBpdAorICogZXhwZWN0cyBhdCBsZWFzdDoKKyAqIDE1MG5zIGRlbGF5IGJldHdlZW4gY29uc2VjdXRpdmUgYWNjZXNzZXMgdG8gREFUQV9SRUcsCisgKiAzMDBucyBkZWxheSBiZXR3ZWVuIGFjY2VzcyB0byBBRERSX1JFRyBhbmQgREFUQV9SRUcKKyAqIE9FLCBXRSBNVVNUIE5PVCBiZSBjaGFuZ2VkIGR1cmluZyB0aGVzZSBpbnRlcnZhbHMKKyAqLworI2lmIGRlZmluZWQoVURFTEFZKQorI2RlZmluZQlpc3AxMTZ4X2RlbGF5KGgsZCkJdWRlbGF5KGQpCisjZWxzZQorI2RlZmluZQlpc3AxMTZ4X2RlbGF5KGgsZCkJZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIGlzcDExNnhfd3JpdGVfYWRkcihzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgdW5zaWduZWQgcmVnKQoreworCXdyaXRldyhyZWcgJiAweGZmLCBpc3AxMTZ4LT5hZGRyX3JlZyk7CisJaXNwMTE2eF9kZWxheShpc3AxMTZ4LCBVREVMQVkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXNwMTE2eF93cml0ZV9kYXRhMTYoc3RydWN0IGlzcDExNnggKmlzcDExNngsIHUxNiB2YWwpCit7CisJd3JpdGV3KHZhbCwgaXNwMTE2eC0+ZGF0YV9yZWcpOworCWlzcDExNnhfZGVsYXkoaXNwMTE2eCwgVURFTEFZKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlzcDExNnhfcmF3X3dyaXRlX2RhdGExNihzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgdTE2IHZhbCkKK3sKKwlfX3Jhd193cml0ZXcodmFsLCBpc3AxMTZ4LT5kYXRhX3JlZyk7CisJaXNwMTE2eF9kZWxheShpc3AxMTZ4LCBVREVMQVkpOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBpc3AxMTZ4X3JlYWRfZGF0YTE2KHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4KQoreworCXUxNiB2YWw7CisKKwl2YWwgPSByZWFkdyhpc3AxMTZ4LT5kYXRhX3JlZyk7CisJaXNwMTE2eF9kZWxheShpc3AxMTZ4LCBVREVMQVkpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGlzcDExNnhfcmF3X3JlYWRfZGF0YTE2KHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4KQoreworCXUxNiB2YWw7CisKKwl2YWwgPSBfX3Jhd19yZWFkdyhpc3AxMTZ4LT5kYXRhX3JlZyk7CisJaXNwMTE2eF9kZWxheShpc3AxMTZ4LCBVREVMQVkpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpc3AxMTZ4X3dyaXRlX2RhdGEzMihzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgdTMyIHZhbCkKK3sKKwl3cml0ZXcodmFsICYgMHhmZmZmLCBpc3AxMTZ4LT5kYXRhX3JlZyk7CisJaXNwMTE2eF9kZWxheShpc3AxMTZ4LCBVREVMQVkpOworCXdyaXRldyh2YWwgPj4gMTYsIGlzcDExNngtPmRhdGFfcmVnKTsKKwlpc3AxMTZ4X2RlbGF5KGlzcDExNngsIFVERUxBWSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGlzcDExNnhfcmVhZF9kYXRhMzIoc3RydWN0IGlzcDExNnggKmlzcDExNngpCit7CisJdTMyIHZhbDsKKworCXZhbCA9ICh1MzIpIHJlYWR3KGlzcDExNngtPmRhdGFfcmVnKTsKKwlpc3AxMTZ4X2RlbGF5KGlzcDExNngsIFVERUxBWSk7CisJdmFsIHw9ICgodTMyKSByZWFkdyhpc3AxMTZ4LT5kYXRhX3JlZykpIDw8IDE2OworCWlzcDExNnhfZGVsYXkoaXNwMTE2eCwgVURFTEFZKTsKKwlyZXR1cm4gdmFsOworfQorCisvKiBMZXQncyBrZWVwIHJlZ2lzdGVyIGFjY2VzcyBmdW5jdGlvbnMgb3V0IG9mIGxpbmUuIEhpbnQ6CisgICB3ZSB3YWl0IGF0IGxlYXN0IDE1MCBucyBhdCBldmVyeSBhY2Nlc3MuCisqLworc3RhdGljIHUxNiBpc3AxMTZ4X3JlYWRfcmVnMTYoc3RydWN0IGlzcDExNnggKmlzcDExNngsIHVuc2lnbmVkIHJlZykKK3sKKwlpc3AxMTZ4X3dyaXRlX2FkZHIoaXNwMTE2eCwgcmVnKTsKKwlyZXR1cm4gaXNwMTE2eF9yZWFkX2RhdGExNihpc3AxMTZ4KTsKK30KKworc3RhdGljIHUzMiBpc3AxMTZ4X3JlYWRfcmVnMzIoc3RydWN0IGlzcDExNnggKmlzcDExNngsIHVuc2lnbmVkIHJlZykKK3sKKwlpc3AxMTZ4X3dyaXRlX2FkZHIoaXNwMTE2eCwgcmVnKTsKKwlyZXR1cm4gaXNwMTE2eF9yZWFkX2RhdGEzMihpc3AxMTZ4KTsKK30KKworc3RhdGljIHZvaWQgaXNwMTE2eF93cml0ZV9yZWcxNihzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgdW5zaWduZWQgcmVnLAorCQkJCXVuc2lnbmVkIHZhbCkKK3sKKwlpc3AxMTZ4X3dyaXRlX2FkZHIoaXNwMTE2eCwgcmVnIHwgSVNQMTE2eF9XUklURV9PRkZTRVQpOworCWlzcDExNnhfd3JpdGVfZGF0YTE2KGlzcDExNngsICh1MTYpICh2YWwgJiAweGZmZmYpKTsKK30KKworc3RhdGljIHZvaWQgaXNwMTE2eF93cml0ZV9yZWczMihzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgdW5zaWduZWQgcmVnLAorCQkJCXVuc2lnbmVkIHZhbCkKK3sKKwlpc3AxMTZ4X3dyaXRlX2FkZHIoaXNwMTE2eCwgcmVnIHwgSVNQMTE2eF9XUklURV9PRkZTRVQpOworCWlzcDExNnhfd3JpdGVfZGF0YTMyKGlzcDExNngsICh1MzIpIHZhbCk7Cit9CisKKy8qIC0tLSBVU0IgSFVCIGNvbnN0YW50cyAobm90IE9IQ0ktc3BlY2lmaWM7IHNlZSBodWIuaCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogZGVzdGluYXRpb24gb2YgcmVxdWVzdCAqLworI2RlZmluZSBSSF9JTlRFUkZBQ0UgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFJIX0VORFBPSU5UICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgUkhfT1RIRVIgICAgICAgICAgICAgICAgICAgMHgwMworCisjZGVmaW5lIFJIX0NMQVNTICAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgUkhfVkVORE9SICAgICAgICAgICAgICAgICAgMHg0MAorCisvKiBSZXF1ZXN0czogYlJlcXVlc3QgPDwgOCB8IGJtUmVxdWVzdFR5cGUgKi8KKyNkZWZpbmUgUkhfR0VUX1NUQVRVUyAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFJIX0NMRUFSX0ZFQVRVUkUgICAgICAgIDB4MDEwMAorI2RlZmluZSBSSF9TRVRfRkVBVFVSRSAgICAgICAgICAweDAzMDAKKyNkZWZpbmUgUkhfU0VUX0FERFJFU1MgICAgICAgICAgMHgwNTAwCisjZGVmaW5lIFJIX0dFVF9ERVNDUklQVE9SICAgICAgIDB4MDY4MAorI2RlZmluZSBSSF9TRVRfREVTQ1JJUFRPUiAgICAgICAweDA3MDAKKyNkZWZpbmUgUkhfR0VUX0NPTkZJR1VSQVRJT04gICAgMHgwODgwCisjZGVmaW5lIFJIX1NFVF9DT05GSUdVUkFUSU9OICAgIDB4MDkwMAorI2RlZmluZSBSSF9HRVRfU1RBVEUgICAgICAgICAgICAweDAyODAKKyNkZWZpbmUgUkhfR0VUX0lOVEVSRkFDRSAgICAgICAgMHgwQTgwCisjZGVmaW5lIFJIX1NFVF9JTlRFUkZBQ0UgICAgICAgIDB4MEIwMAorI2RlZmluZSBSSF9TWU5DX0ZSQU1FICAgICAgICAgICAweDBDODAKKy8qIE91ciBWZW5kb3IgU3BlY2lmaWMgUmVxdWVzdCAqLworI2RlZmluZSBSSF9TRVRfRVAgICAgICAgICAgICAgICAweDIwMDAKKworLyogSHViIHBvcnQgZmVhdHVyZXMgKi8KKyNkZWZpbmUgUkhfUE9SVF9DT05ORUNUSU9OICAgICAgICAgMHgwMAorI2RlZmluZSBSSF9QT1JUX0VOQUJMRSAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFJIX1BPUlRfU1VTUEVORCAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgUkhfUE9SVF9PVkVSX0NVUlJFTlQgICAgICAgMHgwMworI2RlZmluZSBSSF9QT1JUX1JFU0VUICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIFJIX1BPUlRfUE9XRVIgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgUkhfUE9SVF9MT1dfU1BFRUQgICAgICAgICAgMHgwOQorCisjZGVmaW5lIFJIX0NfUE9SVF9DT05ORUNUSU9OICAgICAgIDB4MTAKKyNkZWZpbmUgUkhfQ19QT1JUX0VOQUJMRSAgICAgICAgICAgMHgxMQorI2RlZmluZSBSSF9DX1BPUlRfU1VTUEVORCAgICAgICAgICAweDEyCisjZGVmaW5lIFJIX0NfUE9SVF9PVkVSX0NVUlJFTlQgICAgIDB4MTMKKyNkZWZpbmUgUkhfQ19QT1JUX1JFU0VUICAgICAgICAgICAgMHgxNAorCisvKiBIdWIgZmVhdHVyZXMgKi8KKyNkZWZpbmUgUkhfQ19IVUJfTE9DQUxfUE9XRVIgICAgICAgMHgwMAorI2RlZmluZSBSSF9DX0hVQl9PVkVSX0NVUlJFTlQgICAgICAweDAxCisKKyNkZWZpbmUgUkhfREVWSUNFX1JFTU9URV9XQUtFVVAgICAgMHgwMAorI2RlZmluZSBSSF9FTkRQT0lOVF9TVEFMTCAgICAgICAgICAweDAxCisKKyNkZWZpbmUgUkhfQUNLICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBSSF9SRVFfRVJSICAgICAgICAgICAgICAgICAtMQorI2RlZmluZSBSSF9OQUNLICAgICAgICAgICAgICAgICAgICAweDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xhbjkxYzk2LmMgYi9kcml2ZXJzL2xhbjkxYzk2LmMKaW5kZXggYTUwYzVmMC4uZWNkY2JkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9sYW45MWM5Ni5jCisrKyBiL2RyaXZlcnMvbGFuOTFjOTYuYwpAQCAtNjUsNyArNjUsNyBAQAogCiAjaWZkZWYgQ09ORklHX0RSSVZFUl9MQU45MUM5NgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNiLmMgYi9kcml2ZXJzL21hY2IuYwppbmRleCAxODZhYjE5Li45NWNkYzQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2IuYworKysgYi9kcml2ZXJzL21hY2IuYwpAQCAtMTcsNyArMTcsOCBAQAogICovCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NQUNCKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgKENGR19DTURfTkVUIHwgQ0ZHX0NNRF9NSUkpKQorI2lmIGRlZmluZWQoQ09ORklHX01BQ0IpIFwKKwkmJiAoZGVmaW5lZChDT05GSUdfQ01EX05FVCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkpCiAKIC8qCiAgKiBUaGUgdS1ib290IG5ldHdvcmtpbmcgc3RhY2sgaXMgYSBsaXR0bGUgd2VpcmQuICBJdCBzZWVtcyBsaWtlIHRoZQpAQCAtNTEsNiArNTIsOCBAQAogCiAjaW5jbHVkZSAibWFjYi5oIgogCisjZGVmaW5lIGJhcnJpZXIoKSBhc20gdm9sYXRpbGUoIiIgOjo6ICJtZW1vcnkiKQorCiAjZGVmaW5lIENGR19NQUNCX1JYX0JVRkZFUl9TSVpFCQk0MDk2CiAjZGVmaW5lIENGR19NQUNCX1JYX1JJTkdfU0laRQkJKENGR19NQUNCX1JYX0JVRkZFUl9TSVpFIC8gMTI4KQogI2RlZmluZSBDRkdfTUFDQl9UWF9SSU5HX1NJWkUJCTE2CkBAIC0xNjMsNyArMTY2LDcgQEAKIAlyZXR1cm4gTUFDQl9CRkVYVChEQVRBLCBmcmFtZSk7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAogc3RhdGljIGludCBtYWNiX3NlbmQoc3RydWN0IGV0aF9kZXZpY2UgKm5ldGRldiwgdm9sYXRpbGUgdm9pZCAqcGFja2V0LAogCQkgICAgIGludCBsZW5ndGgpCkBAIC0xODUsMzEgKzE4OCwzMSBAQAogCiAJbWFjYi0+dHhfcmluZ1t0eF9oZWFkXS5jdHJsID0gY3RybDsKIAltYWNiLT50eF9yaW5nW3R4X2hlYWRdLmFkZHIgPSBwYWRkcjsKKwliYXJyaWVyKCk7CiAJbWFjYl93cml0ZWwobWFjYiwgTkNSLCBNQUNCX0JJVChURSkgfCBNQUNCX0JJVChSRSkgfCBNQUNCX0JJVChUU1RBUlQpKTsKIAogCS8qCiAJICogSSBndWVzcyB0aGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBuZXR3b3JraW5nIGNvcmUgbWF5CiAJICogcmUtdXNlIHRoZSB0cmFuc21pdCBidWZmZXIgYXMgc29vbiBhcyB3ZSByZXR1cm4uLi4KIAkgKi8KLQlpID0gMDsKLQl3aGlsZSAoIShtYWNiLT50eF9yaW5nW3R4X2hlYWRdLmN0cmwgJiBUWEJVRl9VU0VEKSkgewotCQlpZiAoaSA+IENGR19NQUNCX1RYX1RJTUVPVVQpIHsKLQkJCXByaW50ZigiJXM6IFRYIHRpbWVvdXRcbiIsIG5ldGRldi0+bmFtZSk7CisJZm9yIChpID0gMDsgaSA8PSBDRkdfTUFDQl9UWF9USU1FT1VUOyBpKyspIHsKKwkJYmFycmllcigpOworCQljdHJsID0gbWFjYi0+dHhfcmluZ1t0eF9oZWFkXS5jdHJsOworCQlpZiAoY3RybCAmIFRYQlVGX1VTRUQpCiAJCQlicmVhazsKLQkJfQogCQl1ZGVsYXkoMSk7Ci0JCWkrKzsKIAl9CiAKIAlkbWFfdW5tYXBfc2luZ2xlKHBhY2tldCwgbGVuZ3RoLCBwYWRkcik7CiAKIAlpZiAoaSA8PSBDRkdfTUFDQl9UWF9USU1FT1VUKSB7Ci0JCWN0cmwgPSBtYWNiLT50eF9yaW5nW3R4X2hlYWRdLmN0cmw7CiAJCWlmIChjdHJsICYgVFhCVUZfVU5ERVJSVU4pCiAJCQlwcmludGYoIiVzOiBUWCB1bmRlcnJ1blxuIiwgbmV0ZGV2LT5uYW1lKTsKIAkJaWYgKGN0cmwgJiBUWEJVRl9FWEhBVVNURUQpCiAJCQlwcmludGYoIiVzOiBUWCBidWZmZXJzIGV4aGF1c3RlZCBpbiBtaWQgZnJhbWVcbiIsCiAJCQkgICAgICAgbmV0ZGV2LT5uYW1lKTsKKwl9IGVsc2UgeworCQlwcmludGYoIiVzOiBUWCB0aW1lb3V0XG4iLCBuZXRkZXYtPm5hbWUpOwogCX0KIAogCS8qIE5vIG9uZSBjYXJlcyBhbnl3YXkgKi8KQEAgLTIzNCw2ICsyMzcsNyBAQAogCQlpKys7CiAJfQogCisJYmFycmllcigpOwogCW1hY2ItPnJ4X3RhaWwgPSBuZXdfdGFpbDsKIH0KIApAQCAtMjgzLDExICsyODcsMzggQEAKIAkJCQlyeF90YWlsID0gMDsKIAkJCX0KIAkJfQorCQliYXJyaWVyKCk7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIG1hY2JfcGh5X3Jlc2V0KHN0cnVjdCBtYWNiX2RldmljZSAqbWFjYikKK3sKKwlzdHJ1Y3QgZXRoX2RldmljZSAqbmV0ZGV2ID0gJm1hY2ItPm5ldGRldjsKKwlpbnQgaTsKKwl1MTYgc3RhdHVzLCBhZHY7CisKKwlhZHYgPSBBRFZFUlRJU0VfQ1NNQSB8IEFEVkVSVElTRV9BTEw7CisJbWFjYl9tZGlvX3dyaXRlKG1hY2IsIE1JSV9BRFZFUlRJU0UsIGFkdik7CisJcHJpbnRmKCIlczogU3RhcnRpbmcgYXV0b25lZ290aWF0aW9uLi4uXG4iLCBuZXRkZXYtPm5hbWUpOworCW1hY2JfbWRpb193cml0ZShtYWNiLCBNSUlfQk1DUiwgKEJNQ1JfQU5FTkFCTEUKKwkJCQkJIHwgQk1DUl9BTlJFU1RBUlQpKTsKKworCWZvciAoaSA9IDA7IGkgPCBDRkdfTUFDQl9BVVRPTkVHX1RJTUVPVVQgLyAxMDA7IGkrKykgeworCQlzdGF0dXMgPSBtYWNiX21kaW9fcmVhZChtYWNiLCBNSUlfQk1TUik7CisJCWlmIChzdGF0dXMgJiBCTVNSX0FORUdDT01QTEVURSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTAwKTsKKwl9CisKKwlpZiAoc3RhdHVzICYgQk1TUl9BTkVHQ09NUExFVEUpCisJCXByaW50ZigiJXM6IEF1dG9uZWdvdGlhdGlvbiBjb21wbGV0ZVxuIiwgbmV0ZGV2LT5uYW1lKTsKKwllbHNlCisJCXByaW50ZigiJXM6IEF1dG9uZWdvdGlhdGlvbiB0aW1lZCBvdXQgKHN0YXR1cz0weCUwNHgpXG4iLAorCQkgICAgICAgbmV0ZGV2LT5uYW1lLCBzdGF0dXMpOworfQorCiBzdGF0aWMgaW50IG1hY2JfcGh5X2luaXQoc3RydWN0IG1hY2JfZGV2aWNlICptYWNiKQogewogCXN0cnVjdCBldGhfZGV2aWNlICpuZXRkZXYgPSAmbWFjYi0+bmV0ZGV2OwpAQCAtMzAzLDM2ICszMzQsMTYgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JYWR2ID0gQURWRVJUSVNFX0NTTUEgfCBBRFZFUlRJU0VfQUxMOwotCW1hY2JfbWRpb193cml0ZShtYWNiLCBNSUlfQURWRVJUSVNFLCBhZHYpOwotCXByaW50ZigiJXM6IFN0YXJ0aW5nIGF1dG9uZWdvdGlhdGlvbi4uLlxuIiwgbmV0ZGV2LT5uYW1lKTsKLQltYWNiX21kaW9fd3JpdGUobWFjYiwgTUlJX0JNQ1IsIChCTUNSX0FORU5BQkxFCi0JCQkJCSB8IEJNQ1JfQU5SRVNUQVJUKSk7Ci0KLSNpZiAwCi0JZm9yIChpID0gMDsgaSA8IDk7IGkrKykKLQkJcHJpbnRmKCJtaWklZDogMHglMDR4XG4iLCBpLCBtYWNiX21kaW9fcmVhZChtYWNiLCBpKSk7Ci0jZW5kaWYKLQotCWZvciAoaSA9IDA7IGkgPCBDRkdfTUFDQl9BVVRPTkVHX1RJTUVPVVQgLyAxMDA7IGkrKykgewotCQlzdGF0dXMgPSBtYWNiX21kaW9fcmVhZChtYWNiLCBNSUlfQk1TUik7Ci0JCWlmIChzdGF0dXMgJiBCTVNSX0FORUdDT01QTEVURSkKLQkJCWJyZWFrOwotCQl1ZGVsYXkoMTAwKTsKLQl9Ci0KLQlpZiAoc3RhdHVzICYgQk1TUl9BTkVHQ09NUExFVEUpCi0JCXByaW50ZigiJXM6IEF1dG9uZWdvdGlhdGlvbiBjb21wbGV0ZVxuIiwgbmV0ZGV2LT5uYW1lKTsKLQllbHNlCi0JCXByaW50ZigiJXM6IEF1dG9uZWdvdGlhdGlvbiB0aW1lZCBvdXQgKHN0YXR1cz0weCUwNHgpXG4iLAotCQkgICAgICAgbmV0ZGV2LT5uYW1lLCBzdGF0dXMpOwotCisJc3RhdHVzID0gbWFjYl9tZGlvX3JlYWQobWFjYiwgTUlJX0JNU1IpOwogCWlmICghKHN0YXR1cyAmIEJNU1JfTFNUQVRVUykpIHsKKwkJLyogVHJ5IHRvIHJlLW5lZ290aWF0ZSBpZiB3ZSBkb24ndCBoYXZlIGxpbmsgYWxyZWFkeS4gKi8KKwkJbWFjYl9waHlfcmVzZXQobWFjYik7CisKIAkJZm9yIChpID0gMDsgaSA8IENGR19NQUNCX0FVVE9ORUdfVElNRU9VVCAvIDEwMDsgaSsrKSB7Ci0JCQl1ZGVsYXkoMTAwKTsKIAkJCXN0YXR1cyA9IG1hY2JfbWRpb19yZWFkKG1hY2IsIE1JSV9CTVNSKTsKIAkJCWlmIChzdGF0dXMgJiBCTVNSX0xTVEFUVVMpCiAJCQkJYnJlYWs7CisJCQl1ZGVsYXkoMTAwKTsKIAkJfQogCX0KIApAQCAtMzQxLDYgKzM1Miw3IEBACiAJCSAgICAgICBuZXRkZXYtPm5hbWUsIHN0YXR1cyk7CiAJCXJldHVybiAwOwogCX0gZWxzZSB7CisJCWFkdiA9IG1hY2JfbWRpb19yZWFkKG1hY2IsIE1JSV9BRFZFUlRJU0UpOwogCQlscGEgPSBtYWNiX21kaW9fcmVhZChtYWNiLCBNSUlfTFBBKTsKIAkJbWVkaWEgPSBtaWlfbndheV9yZXN1bHQobHBhICYgYWR2KTsKIAkJc3BlZWQgPSAobWVkaWEgJiAoQURWRVJUSVNFXzEwMEZVTEwgfCBBRFZFUlRJU0VfMTAwSEFMRikKQEAgLTQ5Miw5ICs1MDQsOSBAQAogCXJldHVybiAwOwogfQogCi0jZW5kaWYgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAqLworI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKIAogaW50IG1paXBoeV9yZWFkKHVuc2lnbmVkIGNoYXIgYWRkciwgdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIHNob3J0ICp2YWx1ZSkKIHsKQEAgLTU3MCw2ICs1ODIsNiBAQAogCXJldHVybiAwOwogfQogCi0jZW5kaWYgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKSAqLworI2VuZGlmCiAKICNlbmRpZiAvKiBDT05GSUdfTUFDQiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tcGM4eHhfcGNtY2lhLmMgYi9kcml2ZXJzL21wYzh4eF9wY21jaWEuYwppbmRleCAzOTlhNzE5Li44YTM0Y2QzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21wYzh4eF9wY21jaWEuYworKysgYi9kcml2ZXJzL21wYzh4eF9wY21jaWEuYwpAQCAtNiwxMSArNiwxMSBAQAogCiAjdW5kZWYJQ09ORklHX1BDTUNJQQogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiAjZGVmaW5lCUNPTkZJR19QQ01DSUEKICNlbmRpZgogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKQEAgLTIzLDcgKzIzLDcgQEAKIGV4dGVybiBpbnQgcGNtY2lhX2hhcmR3YXJlX2VuYWJsZSAoaW50IHNsb3QpOwogZXh0ZXJuIGludCBwY21jaWFfdm9sdGFnZV9zZXQoaW50IHNsb3QsIGludCB2Y2MsIGludCB2cHApOwogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiBleHRlcm4gaW50IHBjbWNpYV9oYXJkd2FyZV9kaXNhYmxlKGludCBzbG90KTsKICNlbmRpZgogCkBAIC0xODksNyArMTg5LDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKIGludCBwY21jaWFfb2ZmICh2b2lkKQogewogCWludCBpOwpAQCAtMjIxLDcgKzIyMSw3IEBACiAJcGNtY2lhX2hhcmR3YXJlX2Rpc2FibGUoX3Nsb3RfKTsKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZgkvKiBDRkdfQ01EX1BDTUNJQSAqLworI2VuZGlmCiAKIAogc3RhdGljIHVfaW50IG04eHhfZ2V0X2dyYXljb2RlKHVfaW50IHNpemUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25hbmQvbmFuZC5jIGIvZHJpdmVycy9uYW5kL25hbmQuYwppbmRleCA5ZmVmNzFkLi4yN2I1NzkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25hbmQvbmFuZC5jCisrKyBiL2RyaXZlcnMvbmFuZC9uYW5kLmMKQEAgLTIzLDcgKzIzLDcgQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKSAmJiAhZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCiAKICNpbmNsdWRlIDxuYW5kLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmFuZC9uYW5kX2Jhc2UuYyBiL2RyaXZlcnMvbmFuZC9uYW5kX2Jhc2UuYwppbmRleCBjNmZlZTE4Li4xNTFmNTM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25hbmQvbmFuZF9iYXNlLmMKKysrIGIvZHJpdmVycy9uYW5kL25hbmRfYmFzZS5jCkBAIC03Miw3ICs3Miw3IEBACiAKICNpbmNsdWRlIDxjb21tb24uaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpICYmICFkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKQogCiAjaW5jbHVkZSA8bWFsbG9jLmg+CiAjaW5jbHVkZSA8d2F0Y2hkb2cuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmFuZC9uYW5kX2JidC5jIGIvZHJpdmVycy9uYW5kL25hbmRfYmJ0LmMKaW5kZXggYWFhOTQwMC4uMTlhOWJjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uYW5kL25hbmRfYmJ0LmMKKysrIGIvZHJpdmVycy9uYW5kL25hbmRfYmJ0LmMKQEAgLTU0LDcgKzU0LDcgQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKSAmJiAhZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCiAKICNpbmNsdWRlIDxtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvY29tcGF0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25hbmQvbmFuZF9lY2MuYyBiL2RyaXZlcnMvbmFuZC9uYW5kX2VjYy5jCmluZGV4IDkwMjc0ZTYuLjRjNTMyYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmFuZC9uYW5kX2VjYy5jCisrKyBiL2RyaXZlcnMvbmFuZC9uYW5kX2VjYy5jCkBAIC0zNyw3ICszNyw3IEBACiAKICNpbmNsdWRlIDxjb21tb24uaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpICYmICFkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKQogCiAjaW5jbHVkZTxsaW51eC9tdGQvbXRkLmg+CiAKQEAgLTE5Nyw0ICsxOTcsNCBAQAogCXJldHVybiAtMTsKIH0KIAotI2VuZGlmCS8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25hbmQvbmFuZF9pZHMuYyBiL2RyaXZlcnMvbmFuZC9uYW5kX2lkcy5jCmluZGV4IDhiNTg3MzYuLjA3NWNhZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmFuZC9uYW5kX2lkcy5jCisrKyBiL2RyaXZlcnMvbmFuZC9uYW5kX2lkcy5jCkBAIC0xMyw3ICsxMyw3IEBACiAKICNpbmNsdWRlIDxjb21tb24uaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpICYmICFkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKQogCiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uYW5kL25hbmRfdXRpbC5jIGIvZHJpdmVycy9uYW5kL25hbmRfdXRpbC5jCmluZGV4IDEwYmYwMzYuLmNmMDUwNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmFuZC9uYW5kX3V0aWwuYworKysgYi9kcml2ZXJzL25hbmQvbmFuZF91dGlsLmMKQEAgLTMyLDExICszMiwxMiBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAmJiAhZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpICYmICFkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKIAogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDx3YXRjaGRvZy5oPgogI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPGRpdjY0Lmg+CiAKICNpbmNsdWRlIDxuYW5kLmg+CiAjaW5jbHVkZSA8amZmczIvamZmczIuaD4KQEAgLTIwOCwxMCArMjA5LDEwIEBACiAJCX0KIAogCQlpZiAoIW9wdHMtPnF1aWV0KSB7Ci0JCQlpbnQgcGVyY2VudCA9IChpbnQpCi0JCQkJKCh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQl1bnNpZ25lZCBsb25nIGxvbmcgbiA9KHVuc2lnbmVkIGxvbmcgbG9uZykKIAkJCQkgKGVyYXNlLmFkZHIrbWVtaW5mby0+ZXJhc2VzaXplLW9wdHMtPm9mZnNldCkKLQkJCQkgKiAxMDAgLyBlcmFzZV9sZW5ndGgpOworCQkJCSAqIDEwMDsKKwkJCWludCBwZXJjZW50ID0gKGludClkb19kaXYobiwgZXJhc2VfbGVuZ3RoKTsKIAogCQkJLyogb3V0cHV0IHByb2dyZXNzIG1lc3NhZ2Ugb25seSBhdCB3aG9sZSBwZXJjZW50CiAJCQkgKiBzdGVwcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBtZXNzYWdlcyBwcmludGVkCkBAIC00NzUsMTAgKzQ3Niw5IEBACiAJCWltZ2xlbiAtPSByZWFkbGVuOwogCiAJCWlmICghb3B0cy0+cXVpZXQpIHsKLQkJCWludCBwZXJjZW50ID0gKGludCkKLQkJCQkoKHVuc2lnbmVkIGxvbmcgbG9uZykKLQkJCQkgKG9wdHMtPmxlbmd0aC1pbWdsZW4pICogMTAwCi0JCQkJIC8gb3B0cy0+bGVuZ3RoKTsKKwkJCXVuc2lnbmVkIGxvbmcgbG9uZyBuID0gKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkgKG9wdHMtPmxlbmd0aC1pbWdsZW4pICogMTAwOworCQkJaW50IHBlcmNlbnQgPSAoaW50KWRvX2RpdihuLCBvcHRzLT5sZW5ndGgpOwogCQkJLyogb3V0cHV0IHByb2dyZXNzIG1lc3NhZ2Ugb25seSBhdCB3aG9sZSBwZXJjZW50CiAJCQkgKiBzdGVwcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBtZXNzYWdlcyBwcmludGVkCiAJCQkgKiBvbiAoc2xvdykgc2VyaWFsIGNvbnNvbGVzCkBAIC02NTEsMTAgKzY1MSw5IEBACiAJCX0KIAogCQlpZiAoIW9wdHMtPnF1aWV0KSB7Ci0JCQlpbnQgcGVyY2VudCA9IChpbnQpCi0JCQkJKCh1bnNpZ25lZCBsb25nIGxvbmcpCi0JCQkJIChvcHRzLT5sZW5ndGgtaW1nbGVuKSAqIDEwMAotCQkJCSAvIG9wdHMtPmxlbmd0aCk7CisJCQl1bnNpZ25lZCBsb25nIGxvbmcgbiA9ICh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQkJIChvcHRzLT5sZW5ndGgtaW1nbGVuKSAqIDEwMDsKKwkJCWludCBwZXJjZW50ID0gKGludClkb19kaXYobiAsb3B0cy0+bGVuZ3RoKTsKIAkJCS8qIG91dHB1dCBwcm9ncmVzcyBtZXNzYWdlIG9ubHkgYXQgd2hvbGUgcGVyY2VudAogCQkJICogc3RlcHMgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgbWVzc2FnZXMgcHJpbnRlZAogCQkJICogb24gKHNsb3cpIHNlcmlhbCBjb25zb2xlcwpAQCAtODU5LDQgKzg1OCw0IEBACiAJcmV0dXJuIHJldDsKIH0KIAotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpICYmICFkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uYW5kX2xlZ2FjeS9uYW5kX2xlZ2FjeS5jIGIvZHJpdmVycy9uYW5kX2xlZ2FjeS9uYW5kX2xlZ2FjeS5jCmluZGV4IDQ1ODA0NmQuLjQ5ZDJlYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmFuZF9sZWdhY3kvbmFuZF9sZWdhY3kuYworKysgYi9kcml2ZXJzL25hbmRfbGVnYWN5L25hbmRfbGVnYWN5LmMKQEAgLTE1LDE0ICsxNSw3IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8d2F0Y2hkb2cuaD4KIAotI2lmZGVmIENPTkZJR19TSE9XX0JPT1RfUFJPR1JFU1MKLSMgaW5jbHVkZSA8c3RhdHVzX2xlZC5oPgotIyBkZWZpbmUgU0hPV19CT09UX1BST0dSRVNTKGFyZykJc2hvd19ib290X3Byb2dyZXNzKGFyZykKLSNlbHNlCi0jIGRlZmluZSBTSE9XX0JPT1RfUFJPR1JFU1MoYXJnKQotI2VuZGlmCi0KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKSAmJiBkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkgJiYgZGVmaW5lZChDRkdfTkFORF9MRUdBQ1kpCiAKICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9sZWdhY3kuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9pZHMuaD4KQEAgLTE2MTYsNCArMTYwOSw0IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX0pGRlMyX05BTkQgKi8KIAotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpICYmIGRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25hdHNlbWkuYyBiL2RyaXZlcnMvbmF0c2VtaS5jCmluZGV4IGIwMDlkYjYuLjA3NWQ2YzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmF0c2VtaS5jCisrKyBiL2RyaXZlcnMvbmF0c2VtaS5jCkBAIC01Niw4ICs1Niw4IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8cGNpLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgJiYgXAotCWRlZmluZWQoQ09ORklHX05BVFNFTUkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgXAorCSYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgJiYgZGVmaW5lZChDT05GSUdfTkFUU0VNSSkKIAogLyogZGVmaW5lcyAqLwogI2RlZmluZSBFRVBST01fU0laRSAweGIgLyoxMiAxNi1iaXQgY2h1bmtzLCBvciAyNCBieXRlcyovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldGFybV9ldGguYyBiL2RyaXZlcnMvbmV0YXJtX2V0aC5jCmluZGV4IDg5YjNhODMuLmE5OWVlNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0YXJtX2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0YXJtX2V0aC5jCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8YXNtL2FyY2gvbmV0YXJtX3JlZ2lzdGVycy5oPgogCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAogc3RhdGljIGludCBuYV9taWlfcG9sbF9idXN5ICh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uczgzODJ4LmMgYi9kcml2ZXJzL25zODM4MnguYwppbmRleCA5NzZmODZhLi5mOGIxNDNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25zODM4MnguYworKysgYi9kcml2ZXJzL25zODM4MnguYwpAQCAtNTYsOCArNTYsOCBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPHBjaS5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIFwKLQlkZWZpbmVkKENPTkZJR19OUzgzODJYKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpIFwKKwkmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIGRlZmluZWQoQ09ORklHX05TODM4MlgpCiAKIC8qIGRlZmluZXMgKi8KICNkZWZpbmUgRFNJWkUgICAgIDB4MDAwMDBGRkYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpLmMgYi9kcml2ZXJzL3BjaS5jCmluZGV4IDA1MDU4MmYuLjQxNTg5MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpLmMKKysrIGIvZHJpdmVycy9wY2kuYwpAQCAtNDkwLDEwICs0OTAsMTYgQEAKIAogaW50IHBjaV9ob3NlX3NjYW4oc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQogeworCS8qIFN0YXJ0IHNjYW4gYXQgY3VycmVudF9idXNuby4KKwkgKiBQQ0llIHdpbGwgc3RhcnQgc2NhbiBhdCBmaXJzdF9idXNubysxLgorCSAqLworCS8qIEZvciBsZWdhY3kgc3VwcG9ydCwgZW5zdXJlIGN1cnJlbnQ+PWZpcnN0ICovCisJaWYgKGhvc2UtPmZpcnN0X2J1c25vID4gaG9zZS0+Y3VycmVudF9idXNubykKKwkJaG9zZS0+Y3VycmVudF9idXNubyA9IGhvc2UtPmZpcnN0X2J1c25vOwogI2lmZGVmIENPTkZJR19QQ0lfUE5QCiAJcGNpYXV0b19jb25maWdfaW5pdChob3NlKTsKICNlbmRpZgotCXJldHVybiBwY2lfaG9zZV9zY2FuX2J1cyhob3NlLCBob3NlLT5maXJzdF9idXNubyk7CisJcmV0dXJuIHBjaV9ob3NlX3NjYW5fYnVzKGhvc2UsIGhvc2UtPmN1cnJlbnRfYnVzbm8pOwogfQogCiB2b2lkIHBjaV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaV9hdXRvLmMgYi9kcml2ZXJzL3BjaV9hdXRvLmMKaW5kZXggZjE3MGMyZC4uMjM3ODU1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2lfYXV0by5jCisrKyBiL2RyaXZlcnMvcGNpX2F1dG8uYwpAQCAtNjUsNyArNjUsNyBAQAogCiAJcmVzLT5idXNfbG93ZXIgPSBhZGRyICsgc2l6ZTsKIAotCURFQlVHRigiYWRkcmVzcz0weCVseCIsIGFkZHIpOworCURFQlVHRigiYWRkcmVzcz0weCVseCBidXNfbG93ZXI9JXgiLCBhZGRyLCByZXMtPmJ1c19sb3dlcik7CiAKIAkqYmFyID0gYWRkcjsKIAlyZXR1cm4gMDsKQEAgLTk0LDcgKzk0LDcgQEAKIAlwY2lfaG9zZV9yZWFkX2NvbmZpZ19kd29yZChob3NlLCBkZXYsIFBDSV9DT01NQU5ELCAmY21kc3RhdCk7CiAJY21kc3RhdCA9IChjbWRzdGF0ICYgfihQQ0lfQ09NTUFORF9JTyB8IFBDSV9DT01NQU5EX01FTU9SWSkpIHwgUENJX0NPTU1BTkRfTUFTVEVSOwogCi0JZm9yIChiYXIgPSBQQ0lfQkFTRV9BRERSRVNTXzA7IGJhciA8PSBQQ0lfQkFTRV9BRERSRVNTXzAgKyAoYmFyc19udW0qNCk7IGJhciArPSA0KSB7CisJZm9yIChiYXIgPSBQQ0lfQkFTRV9BRERSRVNTXzA7IGJhciA8IFBDSV9CQVNFX0FERFJFU1NfMCArIChiYXJzX251bSo0KTsgYmFyICs9IDQpIHsKIAkJLyogVGlja2xlIHRoZSBCQVIgYW5kIGdldCB0aGUgcmVzcG9uc2UgKi8KIAkJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIGRldiwgYmFyLCAweGZmZmZmZmZmKTsKIAkJcGNpX2hvc2VfcmVhZF9jb25maWdfZHdvcmQoaG9zZSwgZGV2LCBiYXIsICZiYXJfcmVzcG9uc2UpOwpAQCAtMTU0LDcgKzE1NCw3IEBACiAJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgMHg4MCk7CiB9CiAKLXN0YXRpYyB2b2lkIHBjaWF1dG9fcHJlc2Nhbl9zZXR1cF9icmlkZ2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAordm9pZCBwY2lhdXRvX3ByZXNjYW5fc2V0dXBfYnJpZGdlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKIAkJCQkJIHBjaV9kZXZfdCBkZXYsIGludCBzdWJfYnVzKQogewogCXN0cnVjdCBwY2lfcmVnaW9uICpwY2lfbWVtID0gaG9zZS0+cGNpX21lbTsKQEAgLTE2NSw4ICsxNjUsMTAgQEAKIAlwY2lfaG9zZV9yZWFkX2NvbmZpZ19kd29yZChob3NlLCBkZXYsIFBDSV9DT01NQU5ELCAmY21kc3RhdCk7CiAKIAkvKiBDb25maWd1cmUgYnVzIG51bWJlciByZWdpc3RlcnMgKi8KLQlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9QUklNQVJZX0JVUywgUENJX0JVUyhkZXYpKTsKLQlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9TRUNPTkRBUllfQlVTLCBzdWJfYnVzKTsKKwlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9QUklNQVJZX0JVUywKKwkJCQkgICBQQ0lfQlVTKGRldikgLSBob3NlLT5maXJzdF9idXNubyk7CisJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfU0VDT05EQVJZX0JVUywKKwkJCQkgICBzdWJfYnVzIC0gaG9zZS0+Zmlyc3RfYnVzbm8pOwogCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgUENJX1NVQk9SRElOQVRFX0JVUywgMHhmZik7CiAKIAlpZiAocGNpX21lbSkgewpAQCAtMjExLDcgKzIxMyw3IEBACiAJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIGRldiwgUENJX0NPTU1BTkQsIGNtZHN0YXQgfCBQQ0lfQ09NTUFORF9NQVNURVIpOwogfQogCi1zdGF0aWMgdm9pZCBwY2lhdXRvX3Bvc3RzY2FuX3NldHVwX2JyaWRnZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCit2b2lkIHBjaWF1dG9fcG9zdHNjYW5fc2V0dXBfYnJpZGdlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKIAkJCQkJICBwY2lfZGV2X3QgZGV2LCBpbnQgc3ViX2J1cykKIHsKIAlzdHJ1Y3QgcGNpX3JlZ2lvbiAqcGNpX21lbSA9IGhvc2UtPnBjaV9tZW07CkBAIC0yMTksNyArMjIxLDggQEAKIAlzdHJ1Y3QgcGNpX3JlZ2lvbiAqcGNpX2lvID0gaG9zZS0+cGNpX2lvOwogCiAJLyogQ29uZmlndXJlIGJ1cyBudW1iZXIgcmVnaXN0ZXJzICovCi0JcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfU1VCT1JESU5BVEVfQlVTLCBzdWJfYnVzKTsKKwlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9TVUJPUkRJTkFURV9CVVMsCisJCQkJICAgc3ViX2J1cyAtIGhvc2UtPmZpcnN0X2J1c25vKTsKIAogCWlmIChwY2lfbWVtKSB7CiAJCS8qIFJvdW5kIG1lbW9yeSBhbGxvY2F0b3IgdG8gMU1CIGJvdW5kYXJ5ICovCkBAIC0yODIsMjUgKzI4NSwzNiBAQAogCWlmIChob3NlLT5wY2lfbWVtKSB7CiAJCXBjaWF1dG9fcmVnaW9uX2luaXQoaG9zZS0+cGNpX21lbSk7CiAKLQkJREVCVUdGKCJQQ0kgQXV0b2NvbmZpZzogTWVtb3J5IHJlZ2lvbjogWyVseC0lbHhdXG4iLAorCQlERUJVR0YoIlBDSSBBdXRvY29uZmlnOiBCdXMgTWVtb3J5IHJlZ2lvbjogWyVseC0lbHhdLFxuIgorCQkgICAgICAgIlx0XHRQaHlzaWNhbCBNZW1vcnkgWyV4LSV4XVxuIiwKIAkJICAgIGhvc2UtPnBjaV9tZW0tPmJ1c19zdGFydCwKLQkJICAgIGhvc2UtPnBjaV9tZW0tPmJ1c19zdGFydCArIGhvc2UtPnBjaV9tZW0tPnNpemUgLSAxKTsKKwkJICAgIGhvc2UtPnBjaV9tZW0tPmJ1c19zdGFydCArIGhvc2UtPnBjaV9tZW0tPnNpemUgLSAxLAorCQkgICAgaG9zZS0+cGNpX21lbS0+cGh5c19zdGFydCwKKwkJICAgIGhvc2UtPnBjaV9tZW0tPnBoeXNfc3RhcnQgKyBob3NlLT5wY2lfbWVtLT5zaXplIC0gMSk7CiAJfQogCiAJaWYgKGhvc2UtPnBjaV9wcmVmZXRjaCkgewogCQlwY2lhdXRvX3JlZ2lvbl9pbml0KGhvc2UtPnBjaV9wcmVmZXRjaCk7CiAKLQkJREVCVUdGKCJQQ0kgQXV0b2NvbmZpZzogUHJlZmV0Y2hhYmxlIE1lbW9yeSByZWdpb246IFslbHgtJWx4XVxuIiwKKwkJREVCVUdGKCJQQ0kgQXV0b2NvbmZpZzogQnVzIFByZWZldGNoYWJsZSBNZW06IFslbHgtJWx4XSxcbiIKKwkJICAgICAgICJcdFx0UGh5c2ljYWwgTWVtb3J5IFsleC0leF1cbiIsCiAJCSAgICBob3NlLT5wY2lfcHJlZmV0Y2gtPmJ1c19zdGFydCwKLQkJICAgIGhvc2UtPnBjaV9wcmVmZXRjaC0+YnVzX3N0YXJ0ICsgaG9zZS0+cGNpX3ByZWZldGNoLT5zaXplIC0gMSk7CisJCSAgICBob3NlLT5wY2lfcHJlZmV0Y2gtPmJ1c19zdGFydCArIGhvc2UtPnBjaV9wcmVmZXRjaC0+c2l6ZSAtIDEsCisJCSAgICBob3NlLT5wY2lfcHJlZmV0Y2gtPnBoeXNfc3RhcnQsCisJCSAgICBob3NlLT5wY2lfcHJlZmV0Y2gtPnBoeXNfc3RhcnQgKworCQkJCWhvc2UtPnBjaV9wcmVmZXRjaC0+c2l6ZSAtIDEpOwogCX0KIAogCWlmIChob3NlLT5wY2lfaW8pIHsKIAkJcGNpYXV0b19yZWdpb25faW5pdChob3NlLT5wY2lfaW8pOwogCi0JCURFQlVHRigiUENJIEF1dG9jb25maWc6IEkvTyByZWdpb246IFslbHgtJWx4XVxuIiwKKwkJREVCVUdGKCJQQ0kgQXV0b2NvbmZpZzogQnVzIEkvTyByZWdpb246IFslbHgtJWx4XSxcbiIKKwkJICAgICAgICJcdFx0UGh5c2ljYWwgTWVtb3J5OiBbJXgtJXhdXG4iLAogCQkgICAgaG9zZS0+cGNpX2lvLT5idXNfc3RhcnQsCi0JCSAgICBob3NlLT5wY2lfaW8tPmJ1c19zdGFydCArIGhvc2UtPnBjaV9pby0+c2l6ZSAtIDEpOworCQkgICAgaG9zZS0+cGNpX2lvLT5idXNfc3RhcnQgKyBob3NlLT5wY2lfaW8tPnNpemUgLSAxLAorCQkgICAgaG9zZS0+cGNpX2lvLT5waHlzX3N0YXJ0LAorCQkgICAgaG9zZS0+cGNpX2lvLT5waHlzX3N0YXJ0ICsgaG9zZS0+cGNpX2lvLT5zaXplIC0gMSk7CisKIAl9CiB9CiAKQEAgLTMxNyw2ICszMzEsMTIgQEAKIAlwY2lfaG9zZV9yZWFkX2NvbmZpZ193b3JkKGhvc2UsIGRldiwgUENJX0NMQVNTX0RFVklDRSwgJmNsYXNzKTsKIAogCXN3aXRjaChjbGFzcykgeworCWNhc2UgUENJX0NMQVNTX1BST0NFU1NPUl9QT1dFUlBDOiAvKiBhbiBhZ2VudCBvciBlbmQtcG9pbnQgKi8KKwkJREVCVUdGKCJQQ0kgQXV0b0NvbmZpZzogRm91bmQgUG93ZXJQQyBkZXZpY2VcbiIpOworCQlwY2lhdXRvX3NldHVwX2RldmljZShob3NlLCBkZXYsIDYsIGhvc2UtPnBjaV9tZW0sCisJCQkJICAgICBob3NlLT5wY2lfcHJlZmV0Y2gsIGhvc2UtPnBjaV9pbyk7CisJCWJyZWFrOworCiAJY2FzZSBQQ0lfQ0xBU1NfQlJJREdFX1BDSToKIAkJaG9zZS0+Y3VycmVudF9idXNubysrOwogCQlwY2lhdXRvX3NldHVwX2RldmljZShob3NlLCBkZXYsIDIsIGhvc2UtPnBjaV9tZW0sIGhvc2UtPnBjaV9wcmVmZXRjaCwgaG9zZS0+cGNpX2lvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpX2luZGlyZWN0LmMgYi9kcml2ZXJzL3BjaV9pbmRpcmVjdC5jCmluZGV4IGQ3YmUwODEuLmE4MjIwZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpX2luZGlyZWN0LmMKKysrIGIvZHJpdmVycy9wY2lfaW5kaXJlY3QuYwpAQCAtNDUsNyArNDUsNyBAQAogCWNmZ18jI3J3KHZhbCwgaG9zZS0+Y2ZnX2RhdGEgKyAob2Zmc2V0ICYgbWFzayksIHR5cGUsIG9wKTsJIFwKIAlyZXR1cm4gMDsgICAgCQkJCQkgCQkgXAogfQotI2VsaWYgZGVmaW5lZChDT05GSUdfRTUwMCkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0U1MDApIHx8IGRlZmluZWQoQ09ORklHX01QQzg2eHgpCiAjZGVmaW5lIElORElSRUNUX1BDSV9PUChydywgc2l6ZSwgdHlwZSwgb3AsIG1hc2spICAgICAgICAgICAgICAgICAgICAgICAgXAogc3RhdGljIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIGluZGlyZWN0XyMjcncjI19jb25maWdfIyNzaXplKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgICAgICAgICAgICAgICBcCkBAIC01NSw3ICs1NSw3IEBACiAJYiA9IFBDSV9CVVMoZGV2KTsgZCA9IFBDSV9ERVYoZGV2KTsgZiA9IFBDSV9GVU5DKGRldik7CQkgXAogCWIgPSBiIC0gaG9zZS0+Zmlyc3RfYnVzbm87CQkJCQkgXAogCWRldiA9IFBDSV9CREYoYiwgZCwgZik7CQkJCQkJIFwKLQkqKGhvc2UtPmNmZ19hZGRyKSA9IGRldiB8IChvZmZzZXQgJiAweGZjKSB8IDB4ODAwMDAwMDA7ICAgICAgICAgIFwKKwkqKGhvc2UtPmNmZ19hZGRyKSA9IGRldiB8IChvZmZzZXQgJiAweGZjKSB8ICgob2Zmc2V0ICYgMHhmMDApIDw8IDE2KSB8IDB4ODAwMDAwMDA7IFwKIAlzeW5jKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAljZmdfIyNydyh2YWwsIGhvc2UtPmNmZ19kYXRhICsgKG9mZnNldCAmIG1hc2spLCB0eXBlLCBvcCk7ICAgICAgIFwKIAlyZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNuZXQuYyBiL2RyaXZlcnMvcGNuZXQuYwppbmRleCBkYTlhYzdmLi4yYWYwZThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbmV0LmMKKysrIGIvZHJpdmVycy9wY25ldC5jCkBAIC00NSw4ICs0NSw4IEBACiAjZGVmaW5lIFBDTkVUX0RFQlVHMihmbXQsYXJncy4uLikKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpIFwKLSAgICAmJiBkZWZpbmVkKENPTkZJR19QQ05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSBcCisJJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAmJiBkZWZpbmVkKENPTkZJR19QQ05FVCkKIAogI2lmICFkZWZpbmVkKENPTkZfUENORVRfNzlDOTczKSAmJiBkZWZpbmVkKENPTkZfUENORVRfNzlDOTc1KQogI2Vycm9yICJNYWNybyBmb3IgUENuZXQgY2hpcCB2ZXJzaW9uIGlzIG5vdCBkZWZpbmVkISIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxiMjgwMF9ldGguYyBiL2RyaXZlcnMvcGxiMjgwMF9ldGguYwppbmRleCA0YzY4M2Q3Li4wYWU1ZDgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYjI4MDBfZXRoLmMKKysrIGIvZHJpdmVycy9wbGIyODAwX2V0aC5jCkBAIC0yNSw4ICsyNSw4IEBACiAKICNpbmNsdWRlIDxjb21tb24uaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSBcCi0JJiYgZGVmaW5lZChDT05GSUdfUExCMjgwMF9FVEhFUikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSBcCisJJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAmJiBkZWZpbmVkKENPTkZJR19QTEIyODAwX0VUSEVSKQogCiAjaW5jbHVkZSA8bWFsbG9jLmg+CiAjaW5jbHVkZSA8bmV0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3B4YV9wY21jaWEuYyBiL2RyaXZlcnMvcHhhX3BjbWNpYS5jCmluZGV4IGQ5ZDM4YmIuLjYwMjBlNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHhhX3BjbWNpYS5jCisrKyBiL2RyaXZlcnMvcHhhX3BjbWNpYS5jCkBAIC04NSw3ICs4NSw3IEBACiAJcmV0dXJuIHJjOwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiBpbnQgcGNtY2lhX29mZiAodm9pZCkKIHsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcWUvcWUuYyBiL2RyaXZlcnMvcWUvcWUuYwppbmRleCA1ZjIwOTYyLi4wZjUyMzJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3FlL3FlLmMKKysrIGIvZHJpdmVycy9xZS9xZS5jCkBAIC05OCw3ICs5OCw3IEBACiAJb3V0X2JlMzIoJnAtPnNkYXFtciwgMCk7CiAKIAkvKiBBbGxvY2F0ZSAyS0IgdGVtcG9yYXJ5IGJ1ZmZlciBmb3Igc2RtYSAqLwotCXNkbWFfYnVmZmVyX2Jhc2UgPSBxZV9tdXJhbV9hbGxvYygyMDQ4LCA2NCk7CisJc2RtYV9idWZmZXJfYmFzZSA9IHFlX211cmFtX2FsbG9jKDIwNDgsIDQwOTYpOwogCW91dF9iZTMyKCZwLT5zZHdiY3IsIHNkbWFfYnVmZmVyX2Jhc2UgJiBRRV9TREVCQ1JfQkFfTUFTSyk7CiAKIAkvKiBDbGVhciBzZG1hIHN0YXR1cyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9xZS9xZS5oIGIvZHJpdmVycy9xZS9xZS5oCmluZGV4IDBiY2QwYTkuLjQwMGIxYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcWUvcWUuaAorKysgYi9kcml2ZXJzL3FlL3FlLmgKQEAgLTI5LDcgKzI5LDcgQEAKICNkZWZpbmUgUUVfTlVNX09GX0JSR1MJMTYKICNkZWZpbmUgVUNDX01BWF9OVU0JOAogCi0jZGVmaW5lIFFFX0RBVEFPTkxZX0JBU0UJKHVpbnQpKDEyOCkKKyNkZWZpbmUgUUVfREFUQU9OTFlfQkFTRQkwCiAjZGVmaW5lIFFFX0RBVEFPTkxZX1NJWkUJKFFFX01VUkFNX1NJWkUgLSBRRV9EQVRBT05MWV9CQVNFKQogCiAvKiBRRSB0aHJlYWRzIFNOVU0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnB4X3BjbWNpYS5jIGIvZHJpdmVycy9ycHhfcGNtY2lhLmMKaW5kZXggMmEwYTllMC4uYzdjNDI1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ycHhfcGNtY2lhLmMKKysrIGIvZHJpdmVycy9ycHhfcGNtY2lhLmMKQEAgLTksMTEgKzksMTEgQEAKIAogI3VuZGVmCUNPTkZJR19QQ01DSUEKIAotI2lmCUNPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKLSNpZgkoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpICYmIGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKQogI2RlZmluZQlDT05GSUdfUENNQ0lBCiAjZW5kaWYKIApAQCAtNjIsMTIgKzYyLDEyIEBACiAJcmV0dXJuIDA7CS8qIE5vIGhhcmR3YXJlIHRvIGVuYWJsZSAqLwogfQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiBzdGF0aWMgaW50IHBjbWNpYV9oYXJkd2FyZV9kaXNhYmxlKGludCBzbG90KQogewogCXJldHVybiAwOwkvKiBObyBoYXJkd2FyZSB0byBkaXNhYmxlICovCiB9Ci0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEgKi8KKyNlbmRpZgogCiAKICNlbmRpZgkvKiBDT05GSUdfUENNQ0lBICYmIChDT05GSUdfUlBYQ0xBU1NJQyB8fCBDT05GSUdfUlBYTElURSkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRsODAxOS5jIGIvZHJpdmVycy9ydGw4MDE5LmMKaW5kZXggNjJiOTI0NS4uNDA5YTY5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGw4MDE5LmMKKysrIGIvZHJpdmVycy9ydGw4MDE5LmMKQEAgLTM0LDcgKzM0LDcgQEAKIAogI2lmZGVmIENPTkZJR19EUklWRVJfUlRMODAxOQogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAKIAogLyogcGFja2V0IHBhZ2UgcmVnaXN0ZXIgYWNjZXNzIGZ1bmN0aW9ucyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGw4MTM5LmMgYi9kcml2ZXJzL3J0bDgxMzkuYwppbmRleCBhZmUxYTRmLi45MDQ1NTIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0bDgxMzkuYworKysgYi9kcml2ZXJzL3J0bDgxMzkuYwpAQCAtNzcsNyArNzcsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPHBjaS5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIFwKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIFwKIAlkZWZpbmVkKENPTkZJR19SVEw4MTM5KQogCiAjZGVmaW5lIFRJQ0tTX1BFUl9TRUMJQ0ZHX0haCkBAIC01MzUsNCArNTM1LDQgQEAKIAkJdWRlbGF5ICgxMDApOyAvKiB3YWl0IDEwMHVzICovCiAJfQogfQotI2VuZGlmCS8qIENGR19DTURfTkVUICYmIENPTkZJR19ORVRfTVVMVEkgJiYgQ09ORklHX1JUTDgxMzkgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGw4MTY5LmMgYi9kcml2ZXJzL3J0bDgxNjkuYwppbmRleCAzMzkzYmE4Li42M2VhMmNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0bDgxNjkuYworKysgYi9kcml2ZXJzL3J0bDgxNjkuYwpAQCAtNTUsNyArNTUsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPHBjaS5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIFwKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIFwKIAlkZWZpbmVkKENPTkZJR19SVEw4MTY5KQogCiAjdW5kZWYgREVCVUdfUlRMODE2OQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zazk4bGluL3Vib290X2Rydi5jIGIvZHJpdmVycy9zazk4bGluL3Vib290X2Rydi5jCmluZGV4IDI2M2RhYzguLmQwMmNkMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2s5OGxpbi91Ym9vdF9kcnYuYworKysgYi9kcml2ZXJzL3NrOThsaW4vdWJvb3RfZHJ2LmMKQEAgLTI1LDcgKzI1LDcgQEAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIFwKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIFwKIAlkZWZpbmVkKENPTkZJR19TSzk4KQogCiAjaW5jbHVkZSAiaC9za2RydjFzdC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zeW01M2M4eHguYyBiL2RyaXZlcnMvc3ltNTNjOHh4LmMKaW5kZXggYWUxMGY4MC4uMjllZWNjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zeW01M2M4eHguYworKysgYi9kcml2ZXJzL3N5bTUzYzh4eC5jCkBAIC01MSw3ICs1MSw3IEBACiAjZGVmaW5lIFBSSU5URihmbXQsYXJncy4uLikKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkgJiYgZGVmaW5lZChDT05GSUdfU0NTSV9TWU01M0M4WFgpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NDU0kpICYmIGRlZmluZWQoQ09ORklHX1NDU0lfU1lNNTNDOFhYKQogCiAjdW5kZWYgU0NTSV9TSU5HTEVfU1RFUAogLyoKQEAgLTc4Nyw3ICs3ODcsNyBAQAogCXNjc2lfd3JpdGVfYnl0ZShETU9ERSwweDAwKTsKICNlbmRpZgogfQotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpICovCisjZW5kaWYKIAogCiAjZW5kaWYgLyogQ09ORklHX1NDU0lfU1lNNTNDOFhYICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RpX3BjaTE0MTBhLmMgYi9kcml2ZXJzL3RpX3BjaTE0MTBhLmMKaW5kZXggZDUyOTdiNS4uMjA4Y2E1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy90aV9wY2kxNDEwYS5jCisrKyBiL2RyaXZlcnMvdGlfcGNpMTQxMGEuYwpAQCAtNjQsNyArNjQsNyBAQAogCiAjaW5jbHVkZSA8cGNtY2lhLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpICYmIGRlZmluZWQoQ09ORklHX0lERV9USV9DQVJEQlVTKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpICYmIGRlZmluZWQoQ09ORklHX0lERV9USV9DQVJEQlVTKQogCiBpbnQgcGNtY2lhX29uKGludCBpZGVfYmFzZV9idXMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RpZ29uMy5jIGIvZHJpdmVycy90aWdvbjMuYwppbmRleCA5MWUyMmViLi41ZjZhNGVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RpZ29uMy5jCisrKyBiL2RyaXZlcnMvdGlnb24zLmMKQEAgLTEyLDcgKzEyLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiAhZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAmJiBcCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgJiYgIWRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgJiYgXAogCWRlZmluZWQoQ09ORklHX1RJR09OMykKICNpZmRlZiBDT05GSUdfQk1XCiAjaW5jbHVkZSA8bXBjODI0eC5oPgpAQCAtNTY5NSw0ICs1Njk1LDUgQEAKIAl9CiAJcmV0dXJuIExNX1NUQVRVU19TVUNDRVNTOwogfQotI2VuZGlmCQkJCS8qIENGR19DTURfTkVULCAhQ09ORklHX05FVF9NVUxUSSwgQ09ORklHX1RJR09OMyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHFtOHh4X3BjbWNpYS5jIGIvZHJpdmVycy90cW04eHhfcGNtY2lhLmMKaW5kZXggYTBmNTNjZC4uMTMyYzdhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy90cW04eHhfcGNtY2lhLmMKKysrIGIvZHJpdmVycy90cW04eHhfcGNtY2lhLmMKQEAgLTEwLDExICsxMCwxMSBAQAogCiAjdW5kZWYJQ09ORklHX1BDTUNJQQogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpCiAjZGVmaW5lCUNPTkZJR19QQ01DSUEKICNlbmRpZgogCi0jaWYJKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkKICNkZWZpbmUJQ09ORklHX1BDTUNJQQogI2VuZGlmCiAKQEAgLTI0MSw3ICsyNDEsNyBAQAogfQogCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkKIGludCBwY21jaWFfaGFyZHdhcmVfZGlzYWJsZShpbnQgc2xvdCkKIHsKIAl1X2xvbmcgcmVnOwpAQCAtMjYzLDcgKzI2Myw3IEBACiAKIAlyZXR1cm4gKDApOwogfQotI2VuZGlmCS8qIENGR19DTURfUENNQ0lBICovCisjZW5kaWYKIAogaW50IHBjbWNpYV92b2x0YWdlX3NldChpbnQgc2xvdCwgaW50IHZjYywgaW50IHZwcCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHNlYy5jIGIvZHJpdmVycy90c2VjLmMKaW5kZXggYjQxODc3My4uYzAxMTEyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy90c2VjLmMKKysrIGIvZHJpdmVycy90c2VjLmMKQEAgLTY1LDMzICs2NSwzMyBAQAogICogICBGRUNfUEhZSURYCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgdHNlY19pbmZvX3N0cnVjdCB0c2VjX2luZm9bXSA9IHsKLSNpZiBkZWZpbmVkKENPTkZJR19NUEM4NVhYX1RTRUMxKSB8fCBkZWZpbmVkKENPTkZJR19NUEM4M1hYX1RTRUMxKQotI2lmIGRlZmluZWQoQ09ORklHX01QQzg1NDREUykKKyNpZiBkZWZpbmVkKENPTkZJR19UU0VDMSkKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4NTQ0RFMpIHx8IGRlZmluZWQoQ09ORklHX01QQzg2NDFIUENOKQogCXtUU0VDMV9QSFlfQUREUiwgVFNFQ19HSUdBQklUIHwgVFNFQ19SRURVQ0VELCBUU0VDMV9QSFlJRFh9LAogI2Vsc2UKIAl7VFNFQzFfUEhZX0FERFIsIFRTRUNfR0lHQUJJVCwgVFNFQzFfUEhZSURYfSwKICNlbmRpZgotI2VsaWYgZGVmaW5lZChDT05GSUdfTVBDODZYWF9UU0VDMSkKLQl7VFNFQzFfUEhZX0FERFIsIFRTRUNfR0lHQUJJVCB8IFRTRUNfUkVEVUNFRCwgVFNFQzFfUEhZSURYfSwKICNlbHNlCiAJezAsIDAsIDB9LAogI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfTVBDODVYWF9UU0VDMikgfHwgZGVmaW5lZChDT05GSUdfTVBDODNYWF9UU0VDMikKLQl7VFNFQzJfUEhZX0FERFIsIFRTRUNfR0lHQUJJVCwgVFNFQzJfUEhZSURYfSwKLSNlbGlmIGRlZmluZWQoQ09ORklHX01QQzg2WFhfVFNFQzIpCisjaWYgZGVmaW5lZChDT05GSUdfVFNFQzIpCisjaWYgZGVmaW5lZChDT05GSUdfTVBDODY0MUhQQ04pCiAJe1RTRUMyX1BIWV9BRERSLCBUU0VDX0dJR0FCSVQgfCBUU0VDX1JFRFVDRUQsIFRTRUMyX1BIWUlEWH0sCiAjZWxzZQorCXtUU0VDMl9QSFlfQUREUiwgVFNFQ19HSUdBQklULCBUU0VDMl9QSFlJRFh9LAorI2VuZGlmCisjZWxzZQogCXswLCAwLCAwfSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19NUEM4NVhYX0ZFQwogCXtGRUNfUEhZX0FERFIsIDAsIEZFQ19QSFlJRFh9LAogI2Vsc2UKLSNpZiBkZWZpbmVkKENPTkZJR19NUEM4NVhYX1RTRUMzKSB8fCBkZWZpbmVkKENPTkZJR19NUEM4M1hYX1RTRUMzKSB8fCBkZWZpbmVkKENPTkZJR19NUEM4NlhYX1RTRUMzKQorI2lmIGRlZmluZWQoQ09ORklHX1RTRUMzKQogCXtUU0VDM19QSFlfQUREUiwgVFNFQ19HSUdBQklUIHwgVFNFQ19SRURVQ0VELCBUU0VDM19QSFlJRFh9LAogI2Vsc2UKIAl7MCwgMCwgMH0sCiAjZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19NUEM4NVhYX1RTRUM0KSB8fCBkZWZpbmVkKENPTkZJR19NUEM4M1hYX1RTRUM0KSB8fCBkZWZpbmVkKENPTkZJR19NUEM4NlhYX1RTRUM0KQorI2lmIGRlZmluZWQoQ09ORklHX1RTRUM0KQogCXtUU0VDNF9QSFlfQUREUiwgVFNFQ19HSUdBQklUIHwgVFNFQ19SRURVQ0VELCBUU0VDNF9QSFlJRFh9LAogI2Vsc2UKIAl7MCwgMCwgMH0sCkBAIC0xNzgsNyArMTc4LDcgQEAKIAlwcml2LT5yZWdzLT5tYWNjZmcxIHw9IE1BQ0NGRzFfU09GVF9SRVNFVDsKIAlwcml2LT5yZWdzLT5tYWNjZmcxICY9IH4oTUFDQ0ZHMV9TT0ZUX1JFU0VUKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKSBcCisjaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKSBcCiAJJiYgIWRlZmluZWQoQklUQkFOR01JSSkKIAltaWlwaHlfcmVnaXN0ZXIoZGV2LT5uYW1lLCB0c2VjX21paXBoeV9yZWFkLCB0c2VjX21paXBoeV93cml0ZSk7CiAjZW5kaWYKQEAgLTI5OCw5ICsyOTgsOSBAQAogCXZvbGF0aWxlIHRzZWNfdCAqcmVncyA9ICh2b2xhdGlsZSB0c2VjX3QgKikoVFNFQ19CQVNFX0FERFIpOwogCiAJLyogQXNzaWduIGEgUGh5c2ljYWwgYWRkcmVzcyB0byB0aGUgVEJJICovCi0JcmVncy0+dGJpcGEgPSBUQklQQV9WQUxVRTsKKwlyZWdzLT50YmlwYSA9IENGR19UQklQQV9WQUxVRTsKIAlyZWdzID0gKHZvbGF0aWxlIHRzZWNfdCAqKShUU0VDX0JBU0VfQUREUiArIFRTRUNfU0laRSk7Ci0JcmVncy0+dGJpcGEgPSBUQklQQV9WQUxVRTsKKwlyZWdzLT50YmlwYSA9IENGR19UQklQQV9WQUxVRTsKIAlhc20oInN5bmMiKTsKIAogCS8qIFJlc2V0IE1JSSAoZHVlIHRvIG5ldyBhZGRyZXNzZXMpICovCkBAIC05MDAsNiArOTAwLDM5IEBACiAJCXBoeV9ydW5fY29tbWFuZHMocHJpdiwgcHJpdi0+cGh5aW5mby0+c2h1dGRvd24pOwogfQogCitzdHJ1Y3QgcGh5X2luZm8gcGh5X2luZm9fTTg4RTExNDlTID0geworCTB4MTQxMGNhLAorCSJNYXJ2ZWxsIDg4RTExNDlTIiwKKwk0LAorCShzdHJ1Y3QgcGh5X2NtZFtdKXsgICAgIC8qIGNvbmZpZyAqLworCQkvKiBSZXNldCBhbmQgY29uZmlndXJlIHRoZSBQSFkgKi8KKwkJe01JSU1fQ09OVFJPTCwgTUlJTV9DT05UUk9MX1JFU0VULCBOVUxMfSwKKwkJezB4MWQsIDB4MWYsIE5VTEx9LAorCQl7MHgxZSwgMHgyMDBjLCBOVUxMfSwKKwkJezB4MWQsIDB4NSwgTlVMTH0sCisJCXsweDFlLCAweDAsIE5VTEx9LAorCQl7MHgxZSwgMHgxMDAsIE5VTEx9LAorCQl7TUlJTV9HQklUX0NPTlRST0wsIE1JSU1fR0JJVF9DT05UUk9MX0lOSVQsIE5VTEx9LAorCQl7TUlJTV9BTkFSLCBNSUlNX0FOQVJfSU5JVCwgTlVMTH0sCisJCXtNSUlNX0NPTlRST0wsIE1JSU1fQ09OVFJPTF9SRVNFVCwgTlVMTH0sCisJCXtNSUlNX0NPTlRST0wsIE1JSU1fQ09OVFJPTF9JTklULCAmbWlpX2NyX2luaXR9LAorCQl7bWlpbV9lbmQsfQorCX0sCisJKHN0cnVjdCBwaHlfY21kW10peyAgICAgLyogc3RhcnR1cCAqLworCQkvKiBTdGF0dXMgaXMgcmVhZCBvbmNlIHRvIGNsZWFyIG9sZCBsaW5rIHN0YXRlICovCisJCXtNSUlNX1NUQVRVUywgbWlpbV9yZWFkLCBOVUxMfSwKKwkJLyogQXV0by1uZWdvdGlhdGUgKi8KKwkJe01JSU1fU1RBVFVTLCBtaWltX3JlYWQsICZtaWlfcGFyc2Vfc3J9LAorCQkvKiBSZWFkIHRoZSBzdGF0dXMgKi8KKwkJe01JSU1fODhFMTAxMV9QSFlfU1RBVFVTLCBtaWltX3JlYWQsCisJCSAmbWlpX3BhcnNlXzg4RTEwMTFfcHNyfSwKKwkJe21paW1fZW5kLH0KKwl9LAorCShzdHJ1Y3QgcGh5X2NtZFtdKXsgICAgIC8qIHNodXRkb3duICovCisJCXttaWltX2VuZCx9CisJfSwKK307CisKIC8qIFRoZSA1NDExIGlkIGlzIDB4MjA2MDcwLCB0aGUgNTQyMSBpcyAweDIwNjBlMCAqLwogc3RydWN0IHBoeV9pbmZvIHBoeV9pbmZvX0JDTTU0NjFTID0gewogCTB4MDIwNjBjMSwJLyogNTQ2MSBJRCAqLwpAQCAtOTI4LDYgKzk2MSwzMyBAQAogCX0sCiB9OwogCitzdHJ1Y3QgcGh5X2luZm8gcGh5X2luZm9fQkNNNTQ2NFMgPSB7CisJMHgwMjA2MGIxLAkvKiA1NDY0IElEICovCisJIkJyb2FkY29tIEJDTTU0NjRTIiwKKwkwLCAvKiBub3QgY2xlYXIgdG8gbWUgd2hhdCBtaW5vciByZXZpc2lvbnMgd2UgY2FuIHNoaWZ0IGF3YXkgKi8KKwkoc3RydWN0IHBoeV9jbWRbXSkgeyAvKiBjb25maWcgKi8KKwkJLyogUmVzZXQgYW5kIGNvbmZpZ3VyZSB0aGUgUEhZICovCisJCXtNSUlNX0NPTlRST0wsIE1JSU1fQ09OVFJPTF9SRVNFVCwgTlVMTH0sCisJCXtNSUlNX0dCSVRfQ09OVFJPTCwgTUlJTV9HQklUX0NPTlRST0xfSU5JVCwgTlVMTH0sCisJCXtNSUlNX0FOQVIsIE1JSU1fQU5BUl9JTklULCBOVUxMfSwKKwkJe01JSU1fQ09OVFJPTCwgTUlJTV9DT05UUk9MX1JFU0VULCBOVUxMfSwKKwkJe01JSU1fQ09OVFJPTCwgTUlJTV9DT05UUk9MX0lOSVQsICZtaWlfY3JfaW5pdH0sCisJCXttaWltX2VuZCx9CisJfSwKKwkoc3RydWN0IHBoeV9jbWRbXSkgeyAvKiBzdGFydHVwICovCisJCS8qIFN0YXR1cyBpcyByZWFkIG9uY2UgdG8gY2xlYXIgb2xkIGxpbmsgc3RhdGUgKi8KKwkJe01JSU1fU1RBVFVTLCBtaWltX3JlYWQsIE5VTEx9LAorCQkvKiBBdXRvLW5lZ290aWF0ZSAqLworCQl7TUlJTV9TVEFUVVMsIG1paW1fcmVhZCwgJm1paV9wYXJzZV9zcn0sCisJCS8qIFJlYWQgdGhlIHN0YXR1cyAqLworCQl7TUlJTV9CQ001NHh4X0FVWFNUQVRVUywgbWlpbV9yZWFkLCAmbWlpX3BhcnNlX0JDTTU0eHhfc3J9LAorCQl7bWlpbV9lbmQsfQorCX0sCisJKHN0cnVjdCBwaHlfY21kW10pIHsgLyogc2h1dGRvd24gKi8KKwkJe21paW1fZW5kLH0KKwl9LAorfTsKKwogc3RydWN0IHBoeV9pbmZvIHBoeV9pbmZvX004OEUxMDExUyA9IHsKIAkweDAxNDEwYzYsCiAJIk1hcnZlbGwgODhFMTAxMVMiLApAQCAtOTY4LDExICsxMDI4LDYgQEAKIAkoc3RydWN0IHBoeV9jbWRbXSl7CS8qIGNvbmZpZyAqLwogCQkJICAgLyogUmVzZXQgYW5kIGNvbmZpZ3VyZSB0aGUgUEhZICovCiAJCQkgICB7TUlJTV9DT05UUk9MLCBNSUlNX0NPTlRST0xfUkVTRVQsIE5VTEx9LAotCQkJICAgezB4MWQsIDB4MWYsIE5VTEx9LAotCQkJICAgezB4MWUsIDB4MjAwYywgTlVMTH0sCi0JCQkgICB7MHgxZCwgMHg1LCBOVUxMfSwKLQkJCSAgIHsweDFlLCAweDAsIE5VTEx9LAotCQkJICAgezB4MWUsIDB4MTAwLCBOVUxMfSwKIAkJCSAgIHsweDE0LCAweDBjZDIsIE5VTEx9LCAvKiBEZWxheSBSR01JSSBUWCBhbmQgUlggKi8KIAkJCSAgIHtNSUlNX0dCSVRfQ09OVFJPTCwgTUlJTV9HQklUX0NPTlRST0xfSU5JVCwgTlVMTH0sCiAJCQkgICB7TUlJTV9BTkFSLCBNSUlNX0FOQVJfSU5JVCwgTlVMTH0sCkBAIC0xMDEyLDE0ICsxMDY3LDE2IEBACiAJIk1hcnZlbGwgODhFMTE0NSIsCiAJNCwKIAkoc3RydWN0IHBoeV9jbWRbXSl7CS8qIGNvbmZpZyAqLworCQkJICAgLyogUmVzZXQgdGhlIFBIWSAqLworCQkJICAge01JSU1fQ09OVFJPTCwgTUlJTV9DT05UUk9MX1JFU0VULCBOVUxMfSwKKwogCQkJICAgLyogRXJyYXRhIEUwLCBFMSAqLwogCQkJICAgezI5LCAweDAwMWIsIE5VTEx9LAogCQkJICAgezMwLCAweDQxOGYsIE5VTEx9LAogCQkJICAgezI5LCAweDAwMTYsIE5VTEx9LAogCQkJICAgezMwLCAweGEyZGEsIE5VTEx9LAogCi0JCQkgICAvKiBSZXNldCBhbmQgY29uZmlndXJlIHRoZSBQSFkgKi8KLQkJCSAgIHtNSUlNX0NPTlRST0wsIE1JSU1fQ09OVFJPTF9SRVNFVCwgTlVMTH0sCisJCQkgICAvKiBDb25maWd1cmUgdGhlIFBIWSAqLwogCQkJICAge01JSU1fR0JJVF9DT05UUk9MLCBNSUlNX0dCSVRfQ09OVFJPTF9JTklULCBOVUxMfSwKIAkJCSAgIHtNSUlNX0FOQVIsIE1JSU1fQU5BUl9JTklULCBOVUxMfSwKIAkJCSAgIHtNSUlNXzg4RTEwMTFfUEhZX1NDUiwgTUlJTV84OEUxMDExX1BIWV9NRElfWF9BVVRPLApAQCAtMTI5Miw5ICsxMzQ5LDExIEBACiAJJnBoeV9pbmZvX2NpczgyMDQsCiAJJnBoeV9pbmZvX2NpczgyMDEsCiAJJnBoeV9pbmZvX0JDTTU0NjFTLAorCSZwaHlfaW5mb19CQ001NDY0UywKIAkmcGh5X2luZm9fTTg4RTEwMTFTLAogCSZwaHlfaW5mb19NODhFMTExMVMsCiAJJnBoeV9pbmZvX004OEUxMTQ1LAorCSZwaHlfaW5mb19NODhFMTE0OVMsCiAJJnBoeV9pbmZvX2RtOTE2MSwKIAkmcGh5X2luZm9fbHh0OTcxLAogCSZwaHlfaW5mb19WU0M4MjQ0LApAQCAtMTMyNSw4ICsxMzg0LDEwIEBACiAJLyogbG9vcCB0aHJvdWdoIGFsbCB0aGUga25vd24gUEhZIHR5cGVzLCBhbmQgZmluZCBvbmUgdGhhdCAqLwogCS8qIG1hdGNoZXMgdGhlIElEIHdlIHJlYWQgZnJvbSB0aGUgUEhZLiAqLwogCWZvciAoaSA9IDA7IHBoeV9pbmZvW2ldOyBpKyspIHsKLQkJaWYgKHBoeV9pbmZvW2ldLT5pZCA9PSAocGh5X0lEID4+IHBoeV9pbmZvW2ldLT5zaGlmdCkpCisJCWlmIChwaHlfaW5mb1tpXS0+aWQgPT0gKHBoeV9JRCA+PiBwaHlfaW5mb1tpXS0+c2hpZnQpKSB7CiAJCQl0aGVJbmZvID0gcGh5X2luZm9baV07CisJCQlicmVhazsKKwkJfQogCX0KIAogCWlmICh0aGVJbmZvID09IE5VTEwpIHsKQEAgLTE0MTcsNyArMTQ3OCw3IEBACiAJcmVsb2NhdGVkID0gMTsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKSBcCisjaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKSBcCiAJJiYgIWRlZmluZWQoQklUQkFOR01JSSkKIAogc3RydWN0IHRzZWNfcHJpdmF0ZSAqZ2V0X3ByaXZfZm9yX3BoeSh1bnNpZ25lZCBjaGFyIHBoeWFkZHIpCkBAIC0xNDc2LDcgKzE1MzcsNiBAQAogCXJldHVybiAwOwogfQogCi0jZW5kaWYgLyogZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCi0JCSYmICFkZWZpbmVkKEJJVEJBTkdNSUkpICovCisjZW5kaWYKIAogI2VuZGlmIC8qIENPTkZJR19UU0VDX0VORVQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHNlYy5oIGIvZHJpdmVycy90c2VjLmgKaW5kZXggN2JmM2RlZS4uMmYwMDkyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy90c2VjLmgKKysrIGIvZHJpdmVycy90c2VjLmgKQEAgLTcwLDcgKzcwLDkgQEAKICNkZWZpbmUgbWlpbV9lbmQgLTIKICNkZWZpbmUgbWlpbV9yZWFkIC0xCiAKLSNkZWZpbmUgVEJJUEFfVkFMVUUJCTB4MWYKKyNpZm5kZWYgQ0ZHX1RCSVBBX1ZBTFVFCisgICAgI2RlZmluZSBDRkdfVEJJUEFfVkFMVUUJMHgxZgorI2VuZGlmCiAjZGVmaW5lIE1JSU1DRkdfSU5JVF9WQUxVRQkweDAwMDAwMDAzCiAjZGVmaW5lIE1JSU1DRkdfUkVTRVQJCTB4ODAwMDAwMDAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90c2kxMDhfZXRoLmMgYi9kcml2ZXJzL3RzaTEwOF9ldGguYwppbmRleCA0NzM0MWJlLi41MjRlOWRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RzaTEwOF9ldGguYworKysgYi9kcml2ZXJzL3RzaTEwOF9ldGguYwpAQCAtMjcsNyArMjcsNyBAQAogCiAjaW5jbHVkZSA8Y29uZmlnLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgXAorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkgXAogCSYmIGRlZmluZWQoQ09ORklHX1RTSTEwOF9FVEgpCiAKICNpZiAhZGVmaW5lZChDT05GSUdfVFNJMTA4X0VUSF9OVU1fUE9SVFMpIHx8IChDT05GSUdfVFNJMTA4X0VUSF9OVU1fUE9SVFMgPiAyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90c2kxMDhfaTJjLmMgYi9kcml2ZXJzL3RzaTEwOF9pMmMuYwppbmRleCBlYjUyY2I2Li4zYTNiNzVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RzaTEwOF9pMmMuYworKysgYi9kcml2ZXJzL3RzaTEwOF9pMmMuYwpAQCAtMjgsNyArMjgsNyBAQAogI2lmZGVmIENPTkZJR19UU0kxMDhfSTJDCiAjaW5jbHVkZSA8dHNpMTA4Lmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JMkMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0kyQykKIAogI2RlZmluZSBJMkNfREVMQVkJMTAwMDAwCiAjdW5kZWYgIERFQlVHX0kyQwpAQCAtMjc5LDUgKzI3OSw1IEBACiAJcmV0dXJuIGkyY19yZWFkIChjaGlwLCAwLCAxLCAoY2hhciAqKSZ0bXAsIDEpOwogfQogCi0jZW5kaWYJLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSTJDKSAqLworI2VuZGlmCiAjZW5kaWYgLyogQ09ORklHX1RTSTEwOF9JMkMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiX29oY2kuYyBiL2RyaXZlcnMvdXNiX29oY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGEzN2IyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2Jfb2hjaS5jCkBAIC0wLDAgKzEsMTkxOCBAQAorLyoKKyAqIFVSQiBPSENJIEhDRCAoSG9zdCBDb250cm9sbGVyIERyaXZlcikgZm9yIFVTQiBvbiB0aGUgQVQ5MVJNOTIwMCBhbmQgUENJIGJ1cy4KKyAqCisgKiBJbnRlcnJ1cHQgc3VwcG9ydCBpcyBhZGRlZC4gTm93LCBpdCBoYXMgYmVlbiB0ZXN0ZWQKKyAqIG9uIFVMSTE1NzUgY2hpcCBhbmQgd29ya3Mgd2VsbCB3aXRoIFVTQiBrZXlib2FyZC4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDcKKyAqIFpoYW5nIFdlaSwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gPHdlaS56aGFuZ0BmcmVlc2NhbGUuY29tPgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMworICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcgPGdqQGRlbnguZGU+CisgKgorICogTm90ZTogTXVjaCBvZiB0aGlzIGNvZGUgaGFzIGJlZW4gZGVyaXZlZCBmcm9tIExpbnV4IDIuNAorICogKEMpIENvcHlyaWdodCAxOTk5IFJvbWFuIFdlaXNzZ2FlcmJlciA8d2Vpc3NnQHZpZW5uYS5hdD4KKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDAyIERhdmlkIEJyb3duZWxsCisgKgorICogTW9kaWZpZWQgZm9yIHRoZSBNUDJVU0IgYnkgKEMpIENvcHlyaWdodCAyMDA1IEVyaWMgQmVuYXJkCisgKiBlYmVuYXJkQGV1a3JlYS5jb20gLSBiYXNlZCBvbiBzM2MyNHgwJ3MgZHJpdmVyCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCVNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKy8qCisgKiBJTVBPUlRBTlQgTk9URVMKKyAqIDEgLSBSZWFkIGRvYy9SRUFETUUuZ2VuZXJpY191c2Jfb2hjaQorICogMiAtIHRoaXMgZHJpdmVyIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBVU0IgTWFzcyBTdG9yYWdlIERldmljZXMKKyAqICAgICAoQkJCKSBhbmQgVVNCIGtleWJvYXJkLiBUaGVyZSBpcyBOTyBzdXBwb3J0IGZvciBJc29jaHJvbm91cyBwaXBlcyEKKyAqIDIgLSB3aGVuIHJ1bm5pbmcgb24gYSBQUUZQMjA4IEFUOTFSTTkyMDAsIGRlZmluZSBDT05GSUdfQVQ5MUNfUFFGUF9VSFBCVUcKKyAqICAgICB0byBhY3RpdmF0ZSB3b3JrYXJvdW5kIGZvciBidWcgIzQxIG9yIHRoaXMgZHJpdmVyIHdpbGwgTk9UIHdvcmshCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWZkZWYgQ09ORklHX1VTQl9PSENJX05FVworCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfUENJX09IQ0kpCisjIGluY2x1ZGUgPHBjaS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDx1c2IuaD4KKyNpbmNsdWRlICJ1c2Jfb2hjaS5oIgorCisjaWYgZGVmaW5lZChDT05GSUdfQVJNOTIwVCkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX1MzQzI0MDApIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19TM0MyNDEwKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfNDQwRVApIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19QQ0lfT0hDSSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX01QQzUyMDApCisjIGRlZmluZSBPSENJX1VTRV9OUFMJCS8qIGZvcmNlIE5vUG93ZXJTd2l0Y2hpbmcgbW9kZSAqLworI2VuZGlmCisKKyN1bmRlZiBPSENJX1ZFUkJPU0VfREVCVUcJLyogbm90IGFsd2F5cyBoZWxwZnVsICovCisjdW5kZWYgREVCVUcKKyN1bmRlZiBTSE9XX0lORk8KKyN1bmRlZiBPSENJX0ZJTExfVFJBQ0UKKworLyogRm9yIGluaXRpYWxpemluZyBjb250cm9sbGVyIChtYXNrIGluIGFuIEhDRlMgbW9kZSB0b28pICovCisjZGVmaW5lIE9IQ0lfQ09OVFJPTF9JTklUIFwKKwkoT0hDSV9DVFJMX0NCU1IgJiAweDMpIHwgT0hDSV9DVFJMX0lFIHwgT0hDSV9DVFJMX1BMRQorCisvKgorICogZS5nLiBQQ0kgY29udHJvbGxlcnMgbmVlZCB0aGlzCisgKi8KKyNpZmRlZiBDRkdfT0hDSV9TV0FQX1JFR19BQ0NFU1MKKyMgZGVmaW5lIHJlYWRsKGEpIF9fc3dhcF8zMigqKCh2dV9sb25nICopKGEpKSkKKyMgZGVmaW5lIHdyaXRlbChhLCBiKSAoKigodnVfbG9uZyAqKShiKSkgPSBfX3N3YXBfMzIoKHZ1X2xvbmcpYSkpCisjZWxzZQorIyBkZWZpbmUgcmVhZGwoYSkgKCooKHZ1X2xvbmcgKikoYSkpKQorIyBkZWZpbmUgd3JpdGVsKGEsIGIpICgqKCh2dV9sb25nICopKGIpKSA9ICgodnVfbG9uZylhKSkKKyNlbmRpZiAvKiBDRkdfT0hDSV9TV0FQX1JFR19BQ0NFU1MgKi8KKworI2RlZmluZSBtaW5fdCh0eXBlLHgseSkgKHsgdHlwZSBfX3ggPSAoeCk7IHR5cGUgX195ID0gKHkpOyBfX3ggPCBfX3kgPyBfX3g6IF9feTsgfSkKKworI2lmZGVmIENPTkZJR19QQ0lfT0hDSQorc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG9oY2lfcGNpX2lkc1tdID0geworCXsweDEwYjksIDB4NTIzN30sCS8qIFVMSTE1NzUgUENJIE9IQ0kgbW9kdWxlIGlkcyAqLworCS8qIFBsZWFzZSBhZGQgc3VwcG9ydGVkIFBDSSBPSENJIGNvbnRyb2xsZXIgaWRzIGhlcmUgKi8KKwl7MCwgMH0KK307CisjZW5kaWYKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIGRiZyhmb3JtYXQsIGFyZy4uLikgcHJpbnRmKCJERUJVRzogIiBmb3JtYXQgIlxuIiwgIyMgYXJnKQorI2Vsc2UKKyNkZWZpbmUgZGJnKGZvcm1hdCwgYXJnLi4uKSBkbyB7fSB3aGlsZSgwKQorI2VuZGlmIC8qIERFQlVHICovCisjZGVmaW5lIGVycihmb3JtYXQsIGFyZy4uLikgcHJpbnRmKCJFUlJPUjogIiBmb3JtYXQgIlxuIiwgIyMgYXJnKQorI3VuZGVmIFNIT1dfSU5GTworI2lmZGVmIFNIT1dfSU5GTworI2RlZmluZSBpbmZvKGZvcm1hdCwgYXJnLi4uKSBwcmludGYoIklORk86ICIgZm9ybWF0ICJcbiIsICMjIGFyZykKKyNlbHNlCisjZGVmaW5lIGluZm8oZm9ybWF0LCBhcmcuLi4pIGRvIHt9IHdoaWxlKDApCisjZW5kaWYKKworI2lmZGVmIENGR19PSENJX0JFX0NPTlRST0xMRVIKKyMgZGVmaW5lIG0xNl9zd2FwKHgpIGNwdV90b19iZTE2KHgpCisjIGRlZmluZSBtMzJfc3dhcCh4KSBjcHVfdG9fYmUzMih4KQorI2Vsc2UKKyMgZGVmaW5lIG0xNl9zd2FwKHgpIGNwdV90b19sZTE2KHgpCisjIGRlZmluZSBtMzJfc3dhcCh4KSBjcHVfdG9fbGUzMih4KQorI2VuZGlmIC8qIENGR19PSENJX0JFX0NPTlRST0xMRVIgKi8KKworLyogZ2xvYmFsIG9oY2lfdCAqLworc3RhdGljIG9oY2lfdCBnb2hjaTsKKy8qIHRoaXMgbXVzdCBiZSBhbGlnbmVkIHRvIGEgMjU2IGJ5dGUgYm91bmRhcnkgKi8KK3N0cnVjdCBvaGNpX2hjY2EgZ2hjY2FbMV07CisvKiBhIHBvaW50ZXIgdG8gdGhlIGFsaWduZWQgc3RvcmFnZSAqLworc3RydWN0IG9oY2lfaGNjYSAqcGhjY2E7CisvKiB0aGlzIGFsbG9jYXRlcyBFRHMgZm9yIGFsbCBwb3NzaWJsZSBlbmRwb2ludHMgKi8KK3N0cnVjdCBvaGNpX2RldmljZSBvaGNpX2RldjsKKy8qIFJIU0MgZmxhZyAqLworaW50IGdvdF9yaHNjOworLyogZGV2aWNlIHdoaWNoIHdhcyBkaXNjb25uZWN0ZWQgKi8KK3N0cnVjdCB1c2JfZGV2aWNlICpkZXZnb25lOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBBTUQtNzU2IChEMiByZXYpIHJlcG9ydHMgY29ycnVwdCByZWdpc3RlciBjb250ZW50cyBpbiBzb21lIGNhc2VzLgorICogVGhlIGVycmF0dW0gKCM0KSBkZXNjcmlwdGlvbiBpcyBpbmNvcnJlY3QuICBBTUQncyB3b3JrYXJvdW5kIHdhaXRzCisgKiB0aWxsIHNvbWUgYml0cyAobW9zdGx5IHJlc2VydmVkKSBhcmUgY2xlYXI7IG9rIGZvciBhbGwgcmV2cy4KKyAqLworI2RlZmluZSBPSENJX1FVSVJLX0FNRDc1NiAweGFiY2QKKyNkZWZpbmUgcmVhZF9yb290aHViKGhjLCByZWdpc3RlciwgbWFzaykgKHsgXAorCXUzMiB0ZW1wID0gcmVhZGwgKCZoYy0+cmVncy0+cm9vdGh1Yi5yZWdpc3Rlcik7IFwKKwlpZiAoaGMtPmZsYWdzICYgT0hDSV9RVUlSS19BTUQ3NTYpIFwKKwkJd2hpbGUgKHRlbXAgJiBtYXNrKSBcCisJCQl0ZW1wID0gcmVhZGwgKCZoYy0+cmVncy0+cm9vdGh1Yi5yZWdpc3Rlcik7IFwKKwl0ZW1wOyB9KQorCitzdGF0aWMgdTMyIHJvb3RodWJfYSAoc3RydWN0IG9oY2kgKmhjKQorCXsgcmV0dXJuIHJlYWRfcm9vdGh1YiAoaGMsIGEsIDB4ZmMwZmUwMDApOyB9CitzdGF0aWMgaW5saW5lIHUzMiByb290aHViX2IgKHN0cnVjdCBvaGNpICpoYykKKwl7IHJldHVybiByZWFkbCAoJmhjLT5yZWdzLT5yb290aHViLmIpOyB9CitzdGF0aWMgaW5saW5lIHUzMiByb290aHViX3N0YXR1cyAoc3RydWN0IG9oY2kgKmhjKQorCXsgcmV0dXJuIHJlYWRsICgmaGMtPnJlZ3MtPnJvb3RodWIuc3RhdHVzKTsgfQorc3RhdGljIHUzMiByb290aHViX3BvcnRzdGF0dXMgKHN0cnVjdCBvaGNpICpoYywgaW50IGkpCisJeyByZXR1cm4gcmVhZF9yb290aHViIChoYywgcG9ydHN0YXR1cyBbaV0sIDB4ZmZlMGZjZTApOyB9CisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3N0YXRpYyBpbnQgaGNfaW50ZXJydXB0ICh2b2lkKTsKK3N0YXRpYyB2b2lkCit0ZF9zdWJtaXRfam9iIChzdHJ1Y3QgdXNiX2RldmljZSAqIGRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICogYnVmZmVyLAorCWludCB0cmFuc2Zlcl9sZW4sIHN0cnVjdCBkZXZyZXF1ZXN0ICogc2V0dXAsIHVyYl9wcml2X3QgKiB1cmIsIGludCBpbnRlcnZhbCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIFVSQiBzdXBwb3J0IGZ1bmN0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogZnJlZSBIQ0QtcHJpdmF0ZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFVSQiAqLworCitzdGF0aWMgdm9pZCB1cmJfZnJlZV9wcml2ICh1cmJfcHJpdl90ICogdXJiKQoreworCWludAkJaTsKKwlpbnQJCWxhc3Q7CisJc3RydWN0IHRkCSogdGQ7CisKKwlsYXN0ID0gdXJiLT5sZW5ndGggLSAxOworCWlmIChsYXN0ID49IDApIHsKKwkJZm9yIChpID0gMDsgaSA8PSBsYXN0OyBpKyspIHsKKwkJCXRkID0gdXJiLT50ZFtpXTsKKwkJCWlmICh0ZCkgeworCQkJCXRkLT51c2JfZGV2ID0gTlVMTDsKKwkJCQl1cmItPnRkW2ldID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKwlmcmVlKHVyYik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBERUJVRworc3RhdGljIGludCBzb2hjaV9nZXRfY3VycmVudF9mcmFtZV9udW1iZXIgKHN0cnVjdCB1c2JfZGV2aWNlICogZGV2KTsKKworLyogZGVidWd8IHByaW50IHRoZSBtYWluIGNvbXBvbmVudHMgb2YgYW4gVVJCCisgKiBzbWFsbDogMCkgaGVhZGVyICsgZGF0YSBwYWNrZXRzIDEpIGp1c3QgaGVhZGVyICovCisKK3N0YXRpYyB2b2lkIHBrdF9wcmludCAodXJiX3ByaXZfdCAqcHVyYiwgc3RydWN0IHVzYl9kZXZpY2UgKiBkZXYsCisJdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICogYnVmZmVyLAorCWludCB0cmFuc2Zlcl9sZW4sIHN0cnVjdCBkZXZyZXF1ZXN0ICogc2V0dXAsIGNoYXIgKiBzdHIsIGludCBzbWFsbCkKK3sKKwlkYmcoIiVzIFVSQjpbJTR4XSBkZXY6JTJkLGVwOiUyZC0lYyx0eXBlOiVzLGxlbjolZC8lZCBzdGF0OiUjbHgiLAorCQkJc3RyLAorCQkJc29oY2lfZ2V0X2N1cnJlbnRfZnJhbWVfbnVtYmVyIChkZXYpLAorCQkJdXNiX3BpcGVkZXZpY2UgKHBpcGUpLAorCQkJdXNiX3BpcGVlbmRwb2ludCAocGlwZSksCisJCQl1c2JfcGlwZW91dCAocGlwZSk/ICdPJzogJ0knLAorCQkJdXNiX3BpcGV0eXBlIChwaXBlKSA8IDI/ICh1c2JfcGlwZWludCAocGlwZSk/ICJJTlRSIjogIklTT0MiKToKKwkJCQkodXNiX3BpcGVjb250cm9sIChwaXBlKT8gIkNUUkwiOiAiQlVMSyIpLAorCQkJKHB1cmIgPyBwdXJiLT5hY3R1YWxfbGVuZ3RoIDogMCksCisJCQl0cmFuc2Zlcl9sZW4sIGRldi0+c3RhdHVzKTsKKyNpZmRlZglPSENJX1ZFUkJPU0VfREVCVUcKKwlpZiAoIXNtYWxsKSB7CisJCWludCBpLCBsZW47CisKKwkJaWYgKHVzYl9waXBlY29udHJvbCAocGlwZSkpIHsKKwkJCXByaW50ZiAoX19GSUxFX18gIjogY21kKDgpOiIpOworCQkJZm9yIChpID0gMDsgaSA8IDggOyBpKyspCisJCQkJcHJpbnRmICgiICUwMngiLCAoKF9fdTggKikgc2V0dXApIFtpXSk7CisJCQlwcmludGYgKCJcbiIpOworCQl9CisJCWlmICh0cmFuc2Zlcl9sZW4gPiAwICYmIGJ1ZmZlcikgeworCQkJcHJpbnRmIChfX0ZJTEVfXyAiOiBkYXRhKCVkLyVkKToiLAorCQkJCShwdXJiID8gcHVyYi0+YWN0dWFsX2xlbmd0aCA6IDApLAorCQkJCXRyYW5zZmVyX2xlbik7CisJCQlsZW4gPSB1c2JfcGlwZW91dCAocGlwZSk/CisJCQkJCXRyYW5zZmVyX2xlbjoKKwkJCQkJKHB1cmIgPyBwdXJiLT5hY3R1YWxfbGVuZ3RoIDogMCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgMTYgJiYgaSA8IGxlbjsgaSsrKQorCQkJCXByaW50ZiAoIiAlMDJ4IiwgKChfX3U4ICopIGJ1ZmZlcikgW2ldKTsKKwkJCXByaW50ZiAoIiVzXG4iLCBpIDwgbGVuPyAiLi4uIjogIiIpOworCQl9CisJfQorI2VuZGlmCit9CisKKy8qIGp1c3QgZm9yIGRlYnVnZ2luZzsgcHJpbnRzIG5vbi1lbXB0eSBicmFuY2hlcyBvZiB0aGUgaW50IGVkIHRyZWUgaW5jbHVzaXZlIGlzbyBlZHMqLwordm9pZCBlcF9wcmludF9pbnRfZWRzIChvaGNpX3QgKm9oY2ksIGNoYXIgKiBzdHIpIHsKKwlpbnQgaSwgajsKKwkgX191MzIgKiBlZF9wOworCWZvciAoaT0gMDsgaSA8IDMyOyBpKyspIHsKKwkJaiA9IDU7CisJCWVkX3AgPSAmKG9oY2ktPmhjY2EtPmludF90YWJsZSBbaV0pOworCQlpZiAoKmVkX3AgPT0gMCkKKwkJICAgIGNvbnRpbnVlOworCQlwcmludGYgKF9fRklMRV9fICI6ICVzIGJyYW5jaCBpbnQgJTJkKCUyeCk6Iiwgc3RyLCBpLCBpKTsKKwkJd2hpbGUgKCplZF9wICE9IDAgJiYgai0tKSB7CisJCQllZF90ICplZCA9IChlZF90ICopbTMyX3N3YXAoZWRfcCk7CisJCQlwcmludGYgKCIgZWQ6ICU0eDsiLCBlZC0+aHdJTkZPKTsKKwkJCWVkX3AgPSAmZWQtPmh3TmV4dEVEOworCQl9CisJCXByaW50ZiAoIlxuIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBvaGNpX2R1bXBfaW50cl9tYXNrIChjaGFyICpsYWJlbCwgX191MzIgbWFzaykKK3sKKwlkYmcgKCIlczogMHglMDh4JXMlcyVzJXMlcyVzJXMlcyVzIiwKKwkJbGFiZWwsCisJCW1hc2ssCisJCShtYXNrICYgT0hDSV9JTlRSX01JRSkgPyAiIE1JRSIgOiAiIiwKKwkJKG1hc2sgJiBPSENJX0lOVFJfT0MpID8gIiBPQyIgOiAiIiwKKwkJKG1hc2sgJiBPSENJX0lOVFJfUkhTQykgPyAiIFJIU0MiIDogIiIsCisJCShtYXNrICYgT0hDSV9JTlRSX0ZOTykgPyAiIEZOTyIgOiAiIiwKKwkJKG1hc2sgJiBPSENJX0lOVFJfVUUpID8gIiBVRSIgOiAiIiwKKwkJKG1hc2sgJiBPSENJX0lOVFJfUkQpID8gIiBSRCIgOiAiIiwKKwkJKG1hc2sgJiBPSENJX0lOVFJfU0YpID8gIiBTRiIgOiAiIiwKKwkJKG1hc2sgJiBPSENJX0lOVFJfV0RIKSA/ICIgV0RIIiA6ICIiLAorCQkobWFzayAmIE9IQ0lfSU5UUl9TTykgPyAiIFNPIiA6ICIiCisJCSk7Cit9CisKK3N0YXRpYyB2b2lkIG1heWJlX3ByaW50X2VkcyAoY2hhciAqbGFiZWwsIF9fdTMyIHZhbHVlKQoreworCWVkX3QgKmVkcCA9IChlZF90ICopdmFsdWU7CisKKwlpZiAodmFsdWUpIHsKKwkJZGJnICgiJXMgJTA4eCIsIGxhYmVsLCB2YWx1ZSk7CisJCWRiZyAoIiUwOHgiLCBlZHAtPmh3SU5GTyk7CisJCWRiZyAoIiUwOHgiLCBlZHAtPmh3VGFpbFApOworCQlkYmcgKCIlMDh4IiwgZWRwLT5od0hlYWRQKTsKKwkJZGJnICgiJTA4eCIsIGVkcC0+aHdOZXh0RUQpOworCX0KK30KKworc3RhdGljIGNoYXIgKiBoY2ZzMnN0cmluZyAoaW50IHN0YXRlKQoreworCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBPSENJX1VTQl9SRVNFVDoJcmV0dXJuICJyZXNldCI7CisJCWNhc2UgT0hDSV9VU0JfUkVTVU1FOglyZXR1cm4gInJlc3VtZSI7CisJCWNhc2UgT0hDSV9VU0JfT1BFUjoJcmV0dXJuICJvcGVyYXRpb25hbCI7CisJCWNhc2UgT0hDSV9VU0JfU1VTUEVORDoJcmV0dXJuICJzdXNwZW5kIjsKKwl9CisJcmV0dXJuICI/IjsKK30KKworLyogZHVtcCBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXJzICovCitzdGF0aWMgdm9pZCBvaGNpX2R1bXBfc3RhdHVzIChvaGNpX3QgKmNvbnRyb2xsZXIpCit7CisJc3RydWN0IG9oY2lfcmVncwkqcmVncyA9IGNvbnRyb2xsZXItPnJlZ3M7CisJX191MzIJCQl0ZW1wOworCisJdGVtcCA9IHJlYWRsICgmcmVncy0+cmV2aXNpb24pICYgMHhmZjsKKwlpZiAodGVtcCAhPSAweDEwKQorCQlkYmcgKCJzcGVjICVkLiVkIiwgKHRlbXAgPj4gNCksICh0ZW1wICYgMHgwZikpOworCisJdGVtcCA9IHJlYWRsICgmcmVncy0+Y29udHJvbCk7CisJZGJnICgiY29udHJvbDogMHglMDh4JXMlcyVzIEhDRlM9JXMlcyVzJXMlcyBDQlNSPSVkIiwgdGVtcCwKKwkJKHRlbXAgJiBPSENJX0NUUkxfUldFKSA/ICIgUldFIiA6ICIiLAorCQkodGVtcCAmIE9IQ0lfQ1RSTF9SV0MpID8gIiBSV0MiIDogIiIsCisJCSh0ZW1wICYgT0hDSV9DVFJMX0lSKSA/ICIgSVIiIDogIiIsCisJCWhjZnMyc3RyaW5nICh0ZW1wICYgT0hDSV9DVFJMX0hDRlMpLAorCQkodGVtcCAmIE9IQ0lfQ1RSTF9CTEUpID8gIiBCTEUiIDogIiIsCisJCSh0ZW1wICYgT0hDSV9DVFJMX0NMRSkgPyAiIENMRSIgOiAiIiwKKwkJKHRlbXAgJiBPSENJX0NUUkxfSUUpID8gIiBJRSIgOiAiIiwKKwkJKHRlbXAgJiBPSENJX0NUUkxfUExFKSA/ICIgUExFIiA6ICIiLAorCQl0ZW1wICYgT0hDSV9DVFJMX0NCU1IKKwkJKTsKKworCXRlbXAgPSByZWFkbCAoJnJlZ3MtPmNtZHN0YXR1cyk7CisJZGJnICgiY21kc3RhdHVzOiAweCUwOHggU09DPSVkJXMlcyVzJXMiLCB0ZW1wLAorCQkodGVtcCAmIE9IQ0lfU09DKSA+PiAxNiwKKwkJKHRlbXAgJiBPSENJX09DUikgPyAiIE9DUiIgOiAiIiwKKwkJKHRlbXAgJiBPSENJX0JMRikgPyAiIEJMRiIgOiAiIiwKKwkJKHRlbXAgJiBPSENJX0NMRikgPyAiIENMRiIgOiAiIiwKKwkJKHRlbXAgJiBPSENJX0hDUikgPyAiIEhDUiIgOiAiIgorCQkpOworCisJb2hjaV9kdW1wX2ludHJfbWFzayAoImludHJzdGF0dXMiLCByZWFkbCAoJnJlZ3MtPmludHJzdGF0dXMpKTsKKwlvaGNpX2R1bXBfaW50cl9tYXNrICgiaW50cmVuYWJsZSIsIHJlYWRsICgmcmVncy0+aW50cmVuYWJsZSkpOworCisJbWF5YmVfcHJpbnRfZWRzICgiZWRfcGVyaW9kY3VycmVudCIsIHJlYWRsICgmcmVncy0+ZWRfcGVyaW9kY3VycmVudCkpOworCisJbWF5YmVfcHJpbnRfZWRzICgiZWRfY29udHJvbGhlYWQiLCByZWFkbCAoJnJlZ3MtPmVkX2NvbnRyb2xoZWFkKSk7CisJbWF5YmVfcHJpbnRfZWRzICgiZWRfY29udHJvbGN1cnJlbnQiLCByZWFkbCAoJnJlZ3MtPmVkX2NvbnRyb2xjdXJyZW50KSk7CisKKwltYXliZV9wcmludF9lZHMgKCJlZF9idWxraGVhZCIsIHJlYWRsICgmcmVncy0+ZWRfYnVsa2hlYWQpKTsKKwltYXliZV9wcmludF9lZHMgKCJlZF9idWxrY3VycmVudCIsIHJlYWRsICgmcmVncy0+ZWRfYnVsa2N1cnJlbnQpKTsKKworCW1heWJlX3ByaW50X2VkcyAoImRvbmVoZWFkIiwgcmVhZGwgKCZyZWdzLT5kb25laGVhZCkpOworfQorCitzdGF0aWMgdm9pZCBvaGNpX2R1bXBfcm9vdGh1YiAob2hjaV90ICpjb250cm9sbGVyLCBpbnQgdmVyYm9zZSkKK3sKKwlfX3UzMgkJCXRlbXAsIG5kcCwgaTsKKworCXRlbXAgPSByb290aHViX2EgKGNvbnRyb2xsZXIpOworCW5kcCA9ICh0ZW1wICYgUkhfQV9ORFApOworI2lmZGVmIENPTkZJR19BVDkxQ19QUUZQX1VIUEJVRworCW5kcCA9IChuZHAgPT0gMikgPyAxOjA7CisjZW5kaWYKKwlpZiAodmVyYm9zZSkgeworCQlkYmcgKCJyb290aHViLmE6ICUwOHggUE9UUEdUPSVkJXMlcyVzJXMlcyBORFA9JWQiLCB0ZW1wLAorCQkJKCh0ZW1wICYgUkhfQV9QT1RQR1QpID4+IDI0KSAmIDB4ZmYsCisJCQkodGVtcCAmIFJIX0FfTk9DUCkgPyAiIE5PQ1AiIDogIiIsCisJCQkodGVtcCAmIFJIX0FfT0NQTSkgPyAiIE9DUE0iIDogIiIsCisJCQkodGVtcCAmIFJIX0FfRFQpID8gIiBEVCIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfQV9OUFMpID8gIiBOUFMiIDogIiIsCisJCQkodGVtcCAmIFJIX0FfUFNNKSA/ICIgUFNNIiA6ICIiLAorCQkJbmRwCisJCQkpOworCQl0ZW1wID0gcm9vdGh1Yl9iIChjb250cm9sbGVyKTsKKwkJZGJnICgicm9vdGh1Yi5iOiAlMDh4IFBQQ009JTA0eCBEUj0lMDR4IiwKKwkJCXRlbXAsCisJCQkodGVtcCAmIFJIX0JfUFBDTSkgPj4gMTYsCisJCQkodGVtcCAmIFJIX0JfRFIpCisJCQkpOworCQl0ZW1wID0gcm9vdGh1Yl9zdGF0dXMgKGNvbnRyb2xsZXIpOworCQlkYmcgKCJyb290aHViLnN0YXR1czogJTA4eCVzJXMlcyVzJXMlcyIsCisJCQl0ZW1wLAorCQkJKHRlbXAgJiBSSF9IU19DUldFKSA/ICIgQ1JXRSIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfSFNfT0NJQykgPyAiIE9DSUMiIDogIiIsCisJCQkodGVtcCAmIFJIX0hTX0xQU0MpID8gIiBMUFNDIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9IU19EUldFKSA/ICIgRFJXRSIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfSFNfT0NJKSA/ICIgT0NJIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9IU19MUFMpID8gIiBMUFMiIDogIiIKKwkJCSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG5kcDsgaSsrKSB7CisJCXRlbXAgPSByb290aHViX3BvcnRzdGF0dXMgKGNvbnRyb2xsZXIsIGkpOworCQlkYmcgKCJyb290aHViLnBvcnRzdGF0dXMgWyVkXSA9IDB4JTA4eCVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyIsCisJCQlpLAorCQkJdGVtcCwKKwkJCSh0ZW1wICYgUkhfUFNfUFJTQykgPyAiIFBSU0MiIDogIiIsCisJCQkodGVtcCAmIFJIX1BTX09DSUMpID8gIiBPQ0lDIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9QU19QU1NDKSA/ICIgUFNTQyIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfUFNfUEVTQykgPyAiIFBFU0MiIDogIiIsCisJCQkodGVtcCAmIFJIX1BTX0NTQykgPyAiIENTQyIgOiAiIiwKKworCQkJKHRlbXAgJiBSSF9QU19MU0RBKSA/ICIgTFNEQSIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfUFNfUFBTKSA/ICIgUFBTIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9QU19QUlMpID8gIiBQUlMiIDogIiIsCisJCQkodGVtcCAmIFJIX1BTX1BPQ0kpID8gIiBQT0NJIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9QU19QU1MpID8gIiBQU1MiIDogIiIsCisKKwkJCSh0ZW1wICYgUkhfUFNfUEVTKSA/ICIgUEVTIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9QU19DQ1MpID8gIiBDQ1MiIDogIiIKKwkJCSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBvaGNpX2R1bXAgKG9oY2lfdCAqY29udHJvbGxlciwgaW50IHZlcmJvc2UpCit7CisJZGJnICgiT0hDSSBjb250cm9sbGVyIHVzYi0lcyBzdGF0ZSIsIGNvbnRyb2xsZXItPnNsb3RfbmFtZSk7CisKKwkvKiBkdW1wcyBzb21lIG9mIHRoZSBzdGF0ZSB3ZSBrbm93IGFib3V0ICovCisJb2hjaV9kdW1wX3N0YXR1cyAoY29udHJvbGxlcik7CisJaWYgKHZlcmJvc2UpCisJCWVwX3ByaW50X2ludF9lZHMgKGNvbnRyb2xsZXIsICJoY2NhIik7CisJZGJnICgiaGNjYSBmcmFtZSAjJTA0eCIsIGNvbnRyb2xsZXItPmhjY2EtPmZyYW1lX25vKTsKKwlvaGNpX2R1bXBfcm9vdGh1YiAoY29udHJvbGxlciwgMSk7CisKKyNlbmRpZiAvKiBERUJVRyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBJbnRlcmZhY2UgZnVuY3Rpb25zIChVUkIpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBnZXQgYSB0cmFuc2ZlciByZXF1ZXN0ICovCisKK2ludCBzb2hjaV9zdWJtaXRfam9iKHVyYl9wcml2X3QgKnVyYiwgc3RydWN0IGRldnJlcXVlc3QgKnNldHVwKQoreworCW9oY2lfdCAqb2hjaTsKKwllZF90ICogZWQ7CisJdXJiX3ByaXZfdCAqcHVyYl9wcml2ID0gdXJiOworCWludCBpLCBzaXplID0gMDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gdXJiLT5kZXY7CisJdW5zaWduZWQgbG9uZyBwaXBlID0gdXJiLT5waXBlOworCXZvaWQgKmJ1ZmZlciA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOworCWludCB0cmFuc2Zlcl9sZW4gPSB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGg7CisJaW50IGludGVydmFsID0gdXJiLT5pbnRlcnZhbDsKKworCW9oY2kgPSAmZ29oY2k7CisKKwkvKiB3aGVuIGNvbnRyb2xsZXIncyBodW5nLCBwZXJtaXQgb25seSByb290aHViIGNsZWFudXAgYXR0ZW1wdHMKKwkgKiBzdWNoIGFzIHBvd2VyaW5nIGRvd24gcG9ydHMgKi8KKwlpZiAob2hjaS0+ZGlzYWJsZWQpIHsKKwkJZXJyKCJzb2hjaV9zdWJtaXRfam9iOiBFUElQRSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogd2UncmUgYWJvdXQgdG8gYmVnaW4gYSBuZXcgdHJhbnNhY3Rpb24gaGVyZSBzbyBtYXJrIHRoZSBVUkIgdW5maW5pc2hlZCAqLworCXVyYi0+ZmluaXNoZWQgPSAwOworCisJLyogZXZlcnkgZW5kcG9pbnQgaGFzIGEgZWQsIGxvY2F0ZSBhbmQgZmlsbCBpdCAqLworCWlmICghKGVkID0gZXBfYWRkX2VkIChkZXYsIHBpcGUsIGludGVydmFsLCAxKSkpIHsKKwkJZXJyKCJzb2hjaV9zdWJtaXRfam9iOiBFTk9NRU0iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGZvciB0aGUgcHJpdmF0ZSBwYXJ0IG9mIHRoZSBVUkIgd2UgbmVlZCB0aGUgbnVtYmVyIG9mIFREcyAoc2l6ZSkgKi8KKwlzd2l0Y2ggKHVzYl9waXBldHlwZSAocGlwZSkpIHsKKwkJY2FzZSBQSVBFX0JVTEs6IC8qIG9uZSBURCBmb3IgZXZlcnkgNDA5NiBCeXRlICovCisJCQlzaXplID0gKHRyYW5zZmVyX2xlbiAtIDEpIC8gNDA5NiArIDE7CisJCQlicmVhazsKKwkJY2FzZSBQSVBFX0NPTlRST0w6IC8qIDEgVEQgZm9yIHNldHVwLCAxIGZvciBBQ0sgYW5kIDEgZm9yIGV2ZXJ5IDQwOTYgQiAqLworCQkJc2l6ZSA9ICh0cmFuc2Zlcl9sZW4gPT0gMCk/IDI6CisJCQkJCQkodHJhbnNmZXJfbGVuIC0gMSkgLyA0MDk2ICsgMzsKKwkJCWJyZWFrOworCQljYXNlIFBJUEVfSU5URVJSVVBUOiAvKiAxIFREICovCisJCQlzaXplID0gMTsKKwkJCWJyZWFrOworCX0KKworCWVkLT5wdXJiID0gdXJiOworCisJaWYgKHNpemUgPj0gKE5fVVJCX1REIC0gMSkpIHsKKwkJZXJyKCJuZWVkICVkIFREcywgb25seSBoYXZlICVkIiwgc2l6ZSwgTl9VUkJfVEQpOworCQlyZXR1cm4gLTE7CisJfQorCXB1cmJfcHJpdi0+cGlwZSA9IHBpcGU7CisKKwkvKiBmaWxsIHRoZSBwcml2YXRlIHBhcnQgb2YgdGhlIFVSQiAqLworCXB1cmJfcHJpdi0+bGVuZ3RoID0gc2l6ZTsKKwlwdXJiX3ByaXYtPmVkID0gZWQ7CisJcHVyYl9wcml2LT5hY3R1YWxfbGVuZ3RoID0gMDsKKworCS8qIGFsbG9jYXRlIHRoZSBURHMgKi8KKwkvKiBub3RlIHRoYXQgdGRbMF0gd2FzIGFsbG9jYXRlZCBpbiBlcF9hZGRfZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCXB1cmJfcHJpdi0+dGRbaV0gPSB0ZF9hbGxvYyAoZGV2KTsKKwkJaWYgKCFwdXJiX3ByaXYtPnRkW2ldKSB7CisJCQlwdXJiX3ByaXYtPmxlbmd0aCA9IGk7CisJCQl1cmJfZnJlZV9wcml2IChwdXJiX3ByaXYpOworCQkJZXJyKCJzb2hjaV9zdWJtaXRfam9iOiBFTk9NRU0iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWlmIChlZC0+c3RhdGUgPT0gRURfTkVXIHx8IChlZC0+c3RhdGUgJiBFRF9ERUwpKSB7CisJCXVyYl9mcmVlX3ByaXYgKHB1cmJfcHJpdik7CisJCWVycigic29oY2lfc3VibWl0X2pvYjogRUlOVkFMIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBsaW5rIHRoZSBlZCBpbnRvIGEgY2hhaW4gaWYgaXMgbm90IGFscmVhZHkgKi8KKwlpZiAoZWQtPnN0YXRlICE9IEVEX09QRVIpCisJCWVwX2xpbmsgKG9oY2ksIGVkKTsKKworCS8qIGZpbGwgdGhlIFREcyBhbmQgbGluayBpdCB0byB0aGUgZWQgKi8KKwl0ZF9zdWJtaXRfam9iKGRldiwgcGlwZSwgYnVmZmVyLCB0cmFuc2Zlcl9sZW4sIHNldHVwLCBwdXJiX3ByaXYsIGludGVydmFsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBzb2hjaV9yZXR1cm5fam9iKHN0cnVjdCBvaGNpICpoYywgdXJiX3ByaXZfdCAqdXJiKQoreworCXN0cnVjdCBvaGNpX3JlZ3MgKnJlZ3MgPSBoYy0+cmVnczsKKworCXN3aXRjaCAodXNiX3BpcGV0eXBlICh1cmItPnBpcGUpKSB7CisJY2FzZSBQSVBFX0lOVEVSUlVQVDoKKwkJLyogaW1wbGljaXRseSByZXF1ZXVlZCAqLworCQlpZiAodXJiLT5kZXYtPmlycV9oYW5kbGUgJiYKKwkJCQkodXJiLT5kZXYtPmlycV9hY3RfbGVuID0gdXJiLT5hY3R1YWxfbGVuZ3RoKSkgeworCQkJd3JpdGVsIChPSENJX0lOVFJfV0RILCAmcmVncy0+aW50cmVuYWJsZSk7CisJCQlyZWFkbCAoJnJlZ3MtPmludHJlbmFibGUpOyAvKiBQQ0kgcG9zdGluZyBmbHVzaCAqLworCQkJdXJiLT5kZXYtPmlycV9oYW5kbGUodXJiLT5kZXYpOworCQkJd3JpdGVsIChPSENJX0lOVFJfV0RILCAmcmVncy0+aW50cmRpc2FibGUpOworCQkJcmVhZGwgKCZyZWdzLT5pbnRyZGlzYWJsZSk7IC8qIFBDSSBwb3N0aW5nIGZsdXNoICovCisJCX0KKwkJdXJiLT5hY3R1YWxfbGVuZ3RoID0gMDsKKwkJdGRfc3VibWl0X2pvYiAoCisJCQkJdXJiLT5kZXYsCisJCQkJdXJiLT5waXBlLAorCQkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyLAorCQkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKKwkJCQlOVUxMLAorCQkJCXVyYiwKKwkJCQl1cmItPmludGVydmFsKTsKKwkJYnJlYWs7CisJY2FzZSBQSVBFX0NPTlRST0w6CisJY2FzZSBQSVBFX0JVTEs6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIERFQlVHCisvKiB0ZWxsIHVzIHRoZSBjdXJyZW50IFVTQiBmcmFtZSBudW1iZXIgKi8KKworc3RhdGljIGludCBzb2hjaV9nZXRfY3VycmVudF9mcmFtZV9udW1iZXIgKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2KQoreworCW9oY2lfdCAqb2hjaSA9ICZnb2hjaTsKKworCXJldHVybiBtMTZfc3dhcCAob2hjaS0+aGNjYS0+ZnJhbWVfbm8pOworfQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIEVEIGhhbmRsaW5nIGZ1bmN0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogc2VhcmNoIGZvciB0aGUgcmlnaHQgYnJhbmNoIHRvIGluc2VydCBhbiBpbnRlcnJ1cHQgZWQgaW50byB0aGUgaW50IHRyZWUKKyAqIGRvIHNvbWUgbG9hZCBiYWxsYW5jaW5nOworICogcmV0dXJucyB0aGUgYnJhbmNoIGFuZAorICogc2V0cyB0aGUgaW50ZXJ2YWwgdG8gaW50ZXJ2YWwgPSAyXmludGVnZXIgKGxkIChpbnRlcnZhbCkpICovCisKK3N0YXRpYyBpbnQgZXBfaW50X2JhbGxhbmNlIChvaGNpX3QgKiBvaGNpLCBpbnQgaW50ZXJ2YWwsIGludCBsb2FkKQoreworCWludCBpLCBicmFuY2ggPSAwOworCisJLyogc2VhcmNoIGZvciB0aGUgbGVhc3QgbG9hZGVkIGludGVycnVwdCBlbmRwb2ludAorCSAqIGJyYW5jaCBvZiBhbGwgMzIgYnJhbmNoZXMKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJaWYgKG9oY2ktPm9oY2lfaW50X2xvYWQgW2JyYW5jaF0gPiBvaGNpLT5vaGNpX2ludF9sb2FkIFtpXSkKKwkJCWJyYW5jaCA9IGk7CisKKwlicmFuY2ggPSBicmFuY2ggJSBpbnRlcnZhbDsKKwlmb3IgKGkgPSBicmFuY2g7IGkgPCAzMjsgaSArPSBpbnRlcnZhbCkKKwkJb2hjaS0+b2hjaV9pbnRfbG9hZCBbaV0gKz0gbG9hZDsKKworCXJldHVybiBicmFuY2g7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qICAyXmludCggbGQgKGludGVyKSkgKi8KKworc3RhdGljIGludCBlcF8yX25faW50ZXJ2YWwgKGludCBpbnRlcikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyAoKGludGVyID4+IGkpID4gMSApICYmIChpIDwgNSk7IGkrKyk7CisJcmV0dXJuIDEgPDwgaTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogdGhlIGludCB0cmVlIGlzIGEgYmluYXJ5IHRyZWUKKyAqIGluIG9yZGVyIHRvIHByb2Nlc3MgaXQgc2VxdWVudGlhbGx5IHRoZSBpbmRleGVzIG9mIHRoZSBicmFuY2hlcyBoYXZlIHRvIGJlIG1hcHBlZAorICogdGhlIG1hcHBpbmcgcmV2ZXJzZXMgdGhlIGJpdHMgb2YgYSB3b3JkIG9mIG51bV9iaXRzIGxlbmd0aCAqLworCitzdGF0aWMgaW50IGVwX3JldiAoaW50IG51bV9iaXRzLCBpbnQgd29yZCkKK3sKKwlpbnQgaSwgd291dCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2JpdHM7IGkrKykKKwkJd291dCB8PSAoKCh3b3JkID4+IGkpICYgMSkgPDwgKG51bV9iaXRzIC0gaSAtIDEpKTsKKwlyZXR1cm4gd291dDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogRUQgaGFuZGxpbmcgZnVuY3Rpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBsaW5rIGFuIGVkIGludG8gb25lIG9mIHRoZSBIQyBjaGFpbnMgKi8KKworc3RhdGljIGludCBlcF9saW5rIChvaGNpX3QgKm9oY2ksIGVkX3QgKmVkaSkKK3sKKwl2b2xhdGlsZSBlZF90ICplZCA9IGVkaTsKKwlpbnQgaW50X2JyYW5jaDsKKwlpbnQgaTsKKwlpbnQgaW50ZXI7CisJaW50IGludGVydmFsOworCWludCBsb2FkOworCV9fdTMyICogZWRfcDsKKworCWVkLT5zdGF0ZSA9IEVEX09QRVI7CisJZWQtPmludF9pbnRlcnZhbCA9IDA7CisKKwlzd2l0Y2ggKGVkLT50eXBlKSB7CisJY2FzZSBQSVBFX0NPTlRST0w6CisJCWVkLT5od05leHRFRCA9IDA7CisJCWlmIChvaGNpLT5lZF9jb250cm9sdGFpbCA9PSBOVUxMKSB7CisJCQl3cml0ZWwgKGVkLCAmb2hjaS0+cmVncy0+ZWRfY29udHJvbGhlYWQpOworCQl9IGVsc2UgeworCQkJb2hjaS0+ZWRfY29udHJvbHRhaWwtPmh3TmV4dEVEID0gbTMyX3N3YXAgKCh1bnNpZ25lZCBsb25nKWVkKTsKKwkJfQorCQllZC0+ZWRfcHJldiA9IG9oY2ktPmVkX2NvbnRyb2x0YWlsOworCQlpZiAoIW9oY2ktPmVkX2NvbnRyb2x0YWlsICYmICFvaGNpLT5lZF9ybV9saXN0WzBdICYmCisJCQkhb2hjaS0+ZWRfcm1fbGlzdFsxXSAmJiAhb2hjaS0+c2xlZXBpbmcpIHsKKwkJCW9oY2ktPmhjX2NvbnRyb2wgfD0gT0hDSV9DVFJMX0NMRTsKKwkJCXdyaXRlbCAob2hjaS0+aGNfY29udHJvbCwgJm9oY2ktPnJlZ3MtPmNvbnRyb2wpOworCQl9CisJCW9oY2ktPmVkX2NvbnRyb2x0YWlsID0gZWRpOworCQlicmVhazsKKworCWNhc2UgUElQRV9CVUxLOgorCQllZC0+aHdOZXh0RUQgPSAwOworCQlpZiAob2hjaS0+ZWRfYnVsa3RhaWwgPT0gTlVMTCkgeworCQkJd3JpdGVsIChlZCwgJm9oY2ktPnJlZ3MtPmVkX2J1bGtoZWFkKTsKKwkJfSBlbHNlIHsKKwkJCW9oY2ktPmVkX2J1bGt0YWlsLT5od05leHRFRCA9IG0zMl9zd2FwICgodW5zaWduZWQgbG9uZyllZCk7CisJCX0KKwkJZWQtPmVkX3ByZXYgPSBvaGNpLT5lZF9idWxrdGFpbDsKKwkJaWYgKCFvaGNpLT5lZF9idWxrdGFpbCAmJiAhb2hjaS0+ZWRfcm1fbGlzdFswXSAmJgorCQkJIW9oY2ktPmVkX3JtX2xpc3RbMV0gJiYgIW9oY2ktPnNsZWVwaW5nKSB7CisJCQlvaGNpLT5oY19jb250cm9sIHw9IE9IQ0lfQ1RSTF9CTEU7CisJCQl3cml0ZWwgKG9oY2ktPmhjX2NvbnRyb2wsICZvaGNpLT5yZWdzLT5jb250cm9sKTsKKwkJfQorCQlvaGNpLT5lZF9idWxrdGFpbCA9IGVkaTsKKwkJYnJlYWs7CisKKwljYXNlIFBJUEVfSU5URVJSVVBUOgorCQlsb2FkID0gZWQtPmludF9sb2FkOworCQlpbnRlcnZhbCA9IGVwXzJfbl9pbnRlcnZhbCAoZWQtPmludF9wZXJpb2QpOworCQllZC0+aW50X2ludGVydmFsID0gaW50ZXJ2YWw7CisJCWludF9icmFuY2ggPSBlcF9pbnRfYmFsbGFuY2UgKG9oY2ksIGludGVydmFsLCBsb2FkKTsKKwkJZWQtPmludF9icmFuY2ggPSBpbnRfYnJhbmNoOworCisJCWZvciAoaSA9IDA7IGkgPCBlcF9yZXYgKDYsIGludGVydmFsKTsgaSArPSBpbnRlcikgeworCQkJaW50ZXIgPSAxOworCQkJZm9yIChlZF9wID0gJihvaGNpLT5oY2NhLT5pbnRfdGFibGVbZXBfcmV2ICg1LCBpKSArIGludF9icmFuY2hdKTsKKwkJCQkoKmVkX3AgIT0gMCkgJiYgKCgoZWRfdCAqKWVkX3ApLT5pbnRfaW50ZXJ2YWwgPj0gaW50ZXJ2YWwpOworCQkJCWVkX3AgPSAmKCgoZWRfdCAqKWVkX3ApLT5od05leHRFRCkpCisJCQkJCWludGVyID0gZXBfcmV2ICg2LCAoKGVkX3QgKillZF9wKS0+aW50X2ludGVydmFsKTsKKwkJCWVkLT5od05leHRFRCA9ICplZF9wOworCQkJKmVkX3AgPSBtMzJfc3dhcChlZCk7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBzY2FuIHRoZSBwZXJpb2RpYyB0YWJsZSB0byBmaW5kIGFuZCB1bmxpbmsgdGhpcyBFRCAqLworc3RhdGljIHZvaWQgcGVyaW9kaWNfdW5saW5rICggc3RydWN0IG9oY2kgKm9oY2ksIHZvbGF0aWxlIHN0cnVjdCBlZCAqZWQsCisJCXVuc2lnbmVkIGluZGV4LCB1bnNpZ25lZCBwZXJpb2QpCit7CisJZm9yICg7IGluZGV4IDwgTlVNX0lOVFM7IGluZGV4ICs9IHBlcmlvZCkgeworCQlfX3UzMgkqZWRfcCA9ICZvaGNpLT5oY2NhLT5pbnRfdGFibGUgW2luZGV4XTsKKworCQkvKiBFRCBtaWdodCBoYXZlIGJlZW4gdW5saW5rZWQgdGhyb3VnaCBhbm90aGVyIHBhdGggKi8KKwkJd2hpbGUgKCplZF9wICE9IDApIHsKKwkJCWlmICgoKHN0cnVjdCBlZCAqKW0zMl9zd2FwIChlZF9wKSkgPT0gZWQpIHsKKwkJCQkqZWRfcCA9IGVkLT5od05leHRFRDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVkX3AgPSAmICgoKHN0cnVjdCBlZCAqKW0zMl9zd2FwIChlZF9wKSktPmh3TmV4dEVEKTsKKwkJfQorCX0KK30KKworLyogdW5saW5rIGFuIGVkIGZyb20gb25lIG9mIHRoZSBIQyBjaGFpbnMuCisgKiBqdXN0IHRoZSBsaW5rIHRvIHRoZSBlZCBpcyB1bmxpbmtlZC4KKyAqIHRoZSBsaW5rIGZyb20gdGhlIGVkIHN0aWxsIHBvaW50cyB0byBhbm90aGVyIG9wZXJhdGlvbmFsIGVkIG9yIDAKKyAqIHNvIHRoZSBIQyBjYW4gZXZlbnR1YWxseSBmaW5pc2ggdGhlIHByb2Nlc3Npbmcgb2YgdGhlIHVubGlua2VkIGVkICovCisKK3N0YXRpYyBpbnQgZXBfdW5saW5rIChvaGNpX3QgKm9oY2ksIGVkX3QgKmVkaSkKK3sKKwl2b2xhdGlsZSBlZF90ICplZCA9IGVkaTsKKwlpbnQgaTsKKworCWVkLT5od0lORk8gfD0gbTMyX3N3YXAgKE9IQ0lfRURfU0tJUCk7CisKKwlzd2l0Y2ggKGVkLT50eXBlKSB7CisJY2FzZSBQSVBFX0NPTlRST0w6CisJCWlmIChlZC0+ZWRfcHJldiA9PSBOVUxMKSB7CisJCQlpZiAoIWVkLT5od05leHRFRCkgeworCQkJCW9oY2ktPmhjX2NvbnRyb2wgJj0gfk9IQ0lfQ1RSTF9DTEU7CisJCQkJd3JpdGVsIChvaGNpLT5oY19jb250cm9sLCAmb2hjaS0+cmVncy0+Y29udHJvbCk7CisJCQl9CisJCQl3cml0ZWwgKG0zMl9zd2FwICgqKChfX3UzMiAqKSZlZC0+aHdOZXh0RUQpKSwgJm9oY2ktPnJlZ3MtPmVkX2NvbnRyb2xoZWFkKTsKKwkJfSBlbHNlIHsKKwkJCWVkLT5lZF9wcmV2LT5od05leHRFRCA9IGVkLT5od05leHRFRDsKKwkJfQorCQlpZiAob2hjaS0+ZWRfY29udHJvbHRhaWwgPT0gZWQpIHsKKwkJCW9oY2ktPmVkX2NvbnRyb2x0YWlsID0gZWQtPmVkX3ByZXY7CisJCX0gZWxzZSB7CisJCQkoKGVkX3QgKiltMzJfc3dhcCAoKigoX191MzIgKikmZWQtPmh3TmV4dEVEKSkpLT5lZF9wcmV2ID0gZWQtPmVkX3ByZXY7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFBJUEVfQlVMSzoKKwkJaWYgKGVkLT5lZF9wcmV2ID09IE5VTEwpIHsKKwkJCWlmICghZWQtPmh3TmV4dEVEKSB7CisJCQkJb2hjaS0+aGNfY29udHJvbCAmPSB+T0hDSV9DVFJMX0JMRTsKKwkJCQl3cml0ZWwgKG9oY2ktPmhjX2NvbnRyb2wsICZvaGNpLT5yZWdzLT5jb250cm9sKTsKKwkJCX0KKwkJCXdyaXRlbCAobTMyX3N3YXAgKCooKF9fdTMyICopJmVkLT5od05leHRFRCkpLCAmb2hjaS0+cmVncy0+ZWRfYnVsa2hlYWQpOworCQl9IGVsc2UgeworCQkJZWQtPmVkX3ByZXYtPmh3TmV4dEVEID0gZWQtPmh3TmV4dEVEOworCQl9CisJCWlmIChvaGNpLT5lZF9idWxrdGFpbCA9PSBlZCkgeworCQkJb2hjaS0+ZWRfYnVsa3RhaWwgPSBlZC0+ZWRfcHJldjsKKwkJfSBlbHNlIHsKKwkJCSgoZWRfdCAqKW0zMl9zd2FwICgqKChfX3UzMiAqKSZlZC0+aHdOZXh0RUQpKSktPmVkX3ByZXYgPSBlZC0+ZWRfcHJldjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUElQRV9JTlRFUlJVUFQ6CisJCXBlcmlvZGljX3VubGluayAob2hjaSwgZWQsIDAsIDEpOworCQlmb3IgKGkgPSBlZC0+aW50X2JyYW5jaDsgaSA8IDMyOyBpICs9IGVkLT5pbnRfaW50ZXJ2YWwpCisJCSAgICBvaGNpLT5vaGNpX2ludF9sb2FkW2ldIC09IGVkLT5pbnRfbG9hZDsKKwkJYnJlYWs7CisJfQorCWVkLT5zdGF0ZSA9IEVEX1VOTElOSzsKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogYWRkL3JlaW5pdCBhbiBlbmRwb2ludDsgdGhpcyBzaG91bGQgYmUgZG9uZSBvbmNlIGF0IHRoZQorICogdXNiX3NldF9jb25maWd1cmF0aW9uIGNvbW1hbmQsIGJ1dCB0aGUgVVNCIHN0YWNrIGlzIGEgbGl0dGxlIGJpdAorICogc3RhdGVsZXNzIHNvIHdlIGRvIGl0IGF0IGV2ZXJ5IHRyYW5zYWN0aW9uIGlmIHRoZSBzdGF0ZSBvZiB0aGUgZWQKKyAqIGlzIEVEX05FVyB0aGVuIGEgZHVtbXkgdGQgaXMgYWRkZWQgYW5kIHRoZSBzdGF0ZSBpcyBjaGFuZ2VkIHRvCisgKiBFRF9VTkxJTksgaW4gYWxsIG90aGVyIGNhc2VzIHRoZSBzdGF0ZSBpcyBsZWZ0IHVuY2hhbmdlZCB0aGUgZWQKKyAqIGluZm8gZmllbGRzIGFyZSBzZXR0ZWQgYW55d2F5IGV2ZW4gdGhvdWdoIG1vc3Qgb2YgdGhlbSBzaG91bGQgbm90CisgKiBjaGFuZ2UKKyAqLworc3RhdGljIGVkX3QgKiBlcF9hZGRfZWQgKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsCisJCWludCBpbnRlcnZhbCwgaW50IGxvYWQpCit7CisJdGRfdCAqdGQ7CisJZWRfdCAqZWRfcmV0OworCXZvbGF0aWxlIGVkX3QgKmVkOworCisJZWQgPSBlZF9yZXQgPSAmb2hjaV9kZXYuZWRbKHVzYl9waXBlZW5kcG9pbnQgKHBpcGUpIDw8IDEpIHwKKwkJCSh1c2JfcGlwZWNvbnRyb2wgKHBpcGUpPyAwOiB1c2JfcGlwZW91dCAocGlwZSkpXTsKKworCWlmICgoZWQtPnN0YXRlICYgRURfREVMKSB8fCAoZWQtPnN0YXRlICYgRURfVVJCX0RFTCkpIHsKKwkJZXJyKCJlcF9hZGRfZWQ6IHBlbmRpbmcgZGVsZXRlIik7CisJCS8qIHBlbmRpbmcgZGVsZXRlIHJlcXVlc3QgKi8KKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGVkLT5zdGF0ZSA9PSBFRF9ORVcpIHsKKwkJZWQtPmh3SU5GTyA9IG0zMl9zd2FwIChPSENJX0VEX1NLSVApOyAvKiBza2lwIGVkICovCisJCS8qIGR1bW15IHRkOyBlbmQgb2YgdGQgbGlzdCBmb3IgZWQgKi8KKwkJdGQgPSB0ZF9hbGxvYyAodXNiX2Rldik7CisJCWVkLT5od1RhaWxQID0gbTMyX3N3YXAgKCh1bnNpZ25lZCBsb25nKXRkKTsKKwkJZWQtPmh3SGVhZFAgPSBlZC0+aHdUYWlsUDsKKwkJZWQtPnN0YXRlID0gRURfVU5MSU5LOworCQllZC0+dHlwZSA9IHVzYl9waXBldHlwZSAocGlwZSk7CisJCW9oY2lfZGV2LmVkX2NudCsrOworCX0KKworCWVkLT5od0lORk8gPSBtMzJfc3dhcCAodXNiX3BpcGVkZXZpY2UgKHBpcGUpCisJCQl8IHVzYl9waXBlZW5kcG9pbnQgKHBpcGUpIDw8IDcKKwkJCXwgKHVzYl9waXBlaXNvYyAocGlwZSk/IDB4ODAwMDogMCkKKwkJCXwgKHVzYl9waXBlY29udHJvbCAocGlwZSk/IDA6ICh1c2JfcGlwZW91dCAocGlwZSk/IDB4ODAwOiAweDEwMDApKQorCQkJfCB1c2JfcGlwZXNsb3cgKHBpcGUpIDw8IDEzCisJCQl8IHVzYl9tYXhwYWNrZXQgKHVzYl9kZXYsIHBpcGUpIDw8IDE2KTsKKworCWlmIChlZC0+dHlwZSA9PSBQSVBFX0lOVEVSUlVQVCAmJiBlZC0+c3RhdGUgPT0gRURfVU5MSU5LKSB7CisJCWVkLT5pbnRfcGVyaW9kID0gaW50ZXJ2YWw7CisJCWVkLT5pbnRfbG9hZCA9IGxvYWQ7CisJfQorCisJcmV0dXJuIGVkX3JldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogVEQgaGFuZGxpbmcgZnVuY3Rpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBlbnF1ZXVlIG5leHQgVEQgZm9yIHRoaXMgVVJCIChPSENJIHNwZWMgNS4yLjguMikgKi8KKworc3RhdGljIHZvaWQgdGRfZmlsbCAob2hjaV90ICpvaGNpLCB1bnNpZ25lZCBpbnQgaW5mbywKKwl2b2lkICpkYXRhLCBpbnQgbGVuLAorCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIGludCBpbmRleCwgdXJiX3ByaXZfdCAqdXJiX3ByaXYpCit7CisJdm9sYXRpbGUgdGRfdCAgKnRkLCAqdGRfcHQ7CisjaWZkZWYgT0hDSV9GSUxMX1RSQUNFCisJaW50IGk7CisjZW5kaWYKKworCWlmIChpbmRleCA+IHVyYl9wcml2LT5sZW5ndGgpIHsKKwkJZXJyKCJpbmRleCA+IGxlbmd0aCIpOworCQlyZXR1cm47CisJfQorCS8qIHVzZSB0aGlzIHRkIGFzIHRoZSBuZXh0IGR1bW15ICovCisJdGRfcHQgPSB1cmJfcHJpdi0+dGQgW2luZGV4XTsKKwl0ZF9wdC0+aHdOZXh0VEQgPSAwOworCisJLyogZmlsbCB0aGUgb2xkIGR1bW15IFREICovCisJdGQgPSB1cmJfcHJpdi0+dGQgW2luZGV4XSA9ICh0ZF90ICopKG0zMl9zd2FwICh1cmJfcHJpdi0+ZWQtPmh3VGFpbFApICYgfjB4Zik7CisKKwl0ZC0+ZWQgPSB1cmJfcHJpdi0+ZWQ7CisJdGQtPm5leHRfZGxfdGQgPSBOVUxMOworCXRkLT5pbmRleCA9IGluZGV4OworCXRkLT5kYXRhID0gKF9fdTMyKWRhdGE7CisjaWZkZWYgT0hDSV9GSUxMX1RSQUNFCisJaWYgKCh1c2JfcGlwZXR5cGUodXJiX3ByaXYtPnBpcGUpID09IFBJUEVfQlVMSykgJiYgdXNiX3BpcGVvdXQodXJiX3ByaXYtPnBpcGUpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJcHJpbnRmKCJ0ZC0+ZGF0YVslZF0gJSMyeCAiLGksICgodW5zaWduZWQgY2hhciAqKXRkLT5kYXRhKVtpXSk7CisJCXByaW50ZigiXG4iKTsKKwl9CisjZW5kaWYKKwlpZiAoIWxlbikKKwkJZGF0YSA9IDA7CisKKwl0ZC0+aHdJTkZPID0gbTMyX3N3YXAgKGluZm8pOworCXRkLT5od0NCUCA9IG0zMl9zd2FwICgodW5zaWduZWQgbG9uZylkYXRhKTsKKwlpZiAoZGF0YSkKKwkJdGQtPmh3QkUgPSBtMzJfc3dhcCAoKHVuc2lnbmVkIGxvbmcpKGRhdGEgKyBsZW4gLSAxKSk7CisJZWxzZQorCQl0ZC0+aHdCRSA9IDA7CisJdGQtPmh3TmV4dFREID0gbTMyX3N3YXAgKCh1bnNpZ25lZCBsb25nKXRkX3B0KTsKKworCS8qIGFwcGVuZCB0byBxdWV1ZSAqLworCXRkLT5lZC0+aHdUYWlsUCA9IHRkLT5od05leHRURDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogcHJlcGFyZSBhbGwgVERzIG9mIGEgdHJhbnNmZXIgKi8KKworc3RhdGljIHZvaWQgdGRfc3VibWl0X2pvYiAoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICpidWZmZXIsCisJaW50IHRyYW5zZmVyX2xlbiwgc3RydWN0IGRldnJlcXVlc3QgKnNldHVwLCB1cmJfcHJpdl90ICp1cmIsIGludCBpbnRlcnZhbCkKK3sKKwlvaGNpX3QgKm9oY2kgPSAmZ29oY2k7CisJaW50IGRhdGFfbGVuID0gdHJhbnNmZXJfbGVuOworCXZvaWQgKmRhdGE7CisJaW50IGNudCA9IDA7CisJX191MzIgaW5mbyA9IDA7CisJdW5zaWduZWQgaW50IHRvZ2dsZSA9IDA7CisKKwkvKiBPSENJIGhhbmRsZXMgdGhlIERBVEEtdG9nZ2xlcyBpdHNlbGYsIHdlIGp1c3QgdXNlIHRoZSBVU0ItdG9nZ2xlIGJpdHMgZm9yIHJlc2V0aW5nICovCisJaWYodXNiX2dldHRvZ2dsZShkZXYsIHVzYl9waXBlZW5kcG9pbnQocGlwZSksIHVzYl9waXBlb3V0KHBpcGUpKSkgeworCQl0b2dnbGUgPSBURF9UX1RPR0dMRTsKKwl9IGVsc2UgeworCQl0b2dnbGUgPSBURF9UX0RBVEEwOworCQl1c2Jfc2V0dG9nZ2xlKGRldiwgdXNiX3BpcGVlbmRwb2ludChwaXBlKSwgdXNiX3BpcGVvdXQocGlwZSksIDEpOworCX0KKwl1cmItPnRkX2NudCA9IDA7CisJaWYgKGRhdGFfbGVuKQorCQlkYXRhID0gYnVmZmVyOworCWVsc2UKKwkJZGF0YSA9IDA7CisKKwlzd2l0Y2ggKHVzYl9waXBldHlwZSAocGlwZSkpIHsKKwljYXNlIFBJUEVfQlVMSzoKKwkJaW5mbyA9IHVzYl9waXBlb3V0IChwaXBlKT8KKwkJCVREX0NDIHwgVERfRFBfT1VUIDogVERfQ0MgfCBURF9EUF9JTiA7CisJCXdoaWxlKGRhdGFfbGVuID4gNDA5NikgeworCQkJdGRfZmlsbCAob2hjaSwgaW5mbyB8IChjbnQ/IFREX1RfVE9HR0xFOnRvZ2dsZSksIGRhdGEsIDQwOTYsIGRldiwgY250LCB1cmIpOworCQkJZGF0YSArPSA0MDk2OyBkYXRhX2xlbiAtPSA0MDk2OyBjbnQrKzsKKwkJfQorCQlpbmZvID0gdXNiX3BpcGVvdXQgKHBpcGUpPworCQkJVERfQ0MgfCBURF9EUF9PVVQgOiBURF9DQyB8IFREX1IgfCBURF9EUF9JTiA7CisJCXRkX2ZpbGwgKG9oY2ksIGluZm8gfCAoY250PyBURF9UX1RPR0dMRTp0b2dnbGUpLCBkYXRhLCBkYXRhX2xlbiwgZGV2LCBjbnQsIHVyYik7CisJCWNudCsrOworCisJCWlmICghb2hjaS0+c2xlZXBpbmcpCisJCQl3cml0ZWwgKE9IQ0lfQkxGLCAmb2hjaS0+cmVncy0+Y21kc3RhdHVzKTsgLyogc3RhcnQgYnVsayBsaXN0ICovCisJCWJyZWFrOworCisJY2FzZSBQSVBFX0NPTlRST0w6CisJCWluZm8gPSBURF9DQyB8IFREX0RQX1NFVFVQIHwgVERfVF9EQVRBMDsKKwkJdGRfZmlsbCAob2hjaSwgaW5mbywgc2V0dXAsIDgsIGRldiwgY250KyssIHVyYik7CisJCWlmIChkYXRhX2xlbiA+IDApIHsKKwkJCWluZm8gPSB1c2JfcGlwZW91dCAocGlwZSk/CisJCQkJVERfQ0MgfCBURF9SIHwgVERfRFBfT1VUIHwgVERfVF9EQVRBMSA6IFREX0NDIHwgVERfUiB8IFREX0RQX0lOIHwgVERfVF9EQVRBMTsKKwkJCS8qIE5PVEU6ICBtaXNoYW5kbGVzIHRyYW5zZmVycyA+OEssIHNvbWUgPjRLICovCisJCQl0ZF9maWxsIChvaGNpLCBpbmZvLCBkYXRhLCBkYXRhX2xlbiwgZGV2LCBjbnQrKywgdXJiKTsKKwkJfQorCQlpbmZvID0gdXNiX3BpcGVvdXQgKHBpcGUpPworCQkJVERfQ0MgfCBURF9EUF9JTiB8IFREX1RfREFUQTE6IFREX0NDIHwgVERfRFBfT1VUIHwgVERfVF9EQVRBMTsKKwkJdGRfZmlsbCAob2hjaSwgaW5mbywgZGF0YSwgMCwgZGV2LCBjbnQrKywgdXJiKTsKKwkJaWYgKCFvaGNpLT5zbGVlcGluZykKKwkJCXdyaXRlbCAoT0hDSV9DTEYsICZvaGNpLT5yZWdzLT5jbWRzdGF0dXMpOyAvKiBzdGFydCBDb250cm9sIGxpc3QgKi8KKwkJYnJlYWs7CisKKwljYXNlIFBJUEVfSU5URVJSVVBUOgorCQlpbmZvID0gdXNiX3BpcGVvdXQgKHVyYi0+cGlwZSk/CisJCQlURF9DQyB8IFREX0RQX09VVCB8IHRvZ2dsZToKKwkJCVREX0NDIHwgVERfUiB8IFREX0RQX0lOIHwgdG9nZ2xlOworCQl0ZF9maWxsIChvaGNpLCBpbmZvLCBkYXRhLCBkYXRhX2xlbiwgZGV2LCBjbnQrKywgdXJiKTsKKwkJYnJlYWs7CisJfQorCWlmICh1cmItPmxlbmd0aCAhPSBjbnQpCisJCWRiZygiVEQgTEVOR1RIICVkICE9IENOVCAlZCIsIHVyYi0+bGVuZ3RoLCBjbnQpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBEb25lIExpc3QgaGFuZGxpbmcgZnVuY3Rpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBjYWxjdWxhdGUgdGhlIHRyYW5zZmVyIGxlbmd0aCBhbmQgdXBkYXRlIHRoZSB1cmIgKi8KKworc3RhdGljIHZvaWQgZGxfdHJhbnNmZXJfbGVuZ3RoKHRkX3QgKiB0ZCkKK3sKKwlfX3UzMiB0ZElORk8sIHRkQkUsIHRkQ0JQOworCXVyYl9wcml2X3QgKmx1cmJfcHJpdiA9IHRkLT5lZC0+cHVyYjsKKworCXRkSU5GTyA9IG0zMl9zd2FwICh0ZC0+aHdJTkZPKTsKKwl0ZEJFICAgPSBtMzJfc3dhcCAodGQtPmh3QkUpOworCXRkQ0JQICA9IG0zMl9zd2FwICh0ZC0+aHdDQlApOworCisJaWYgKCEodXNiX3BpcGV0eXBlIChsdXJiX3ByaXYtPnBpcGUpID09IFBJUEVfQ09OVFJPTCAmJgorCSAgICAoKHRkLT5pbmRleCA9PSAwKSB8fCAodGQtPmluZGV4ID09IGx1cmJfcHJpdi0+bGVuZ3RoIC0gMSkpKSkgeworCQlpZiAodGRCRSAhPSAwKSB7CisJCQlpZiAodGQtPmh3Q0JQID09IDApCisJCQkJbHVyYl9wcml2LT5hY3R1YWxfbGVuZ3RoICs9IHRkQkUgLSB0ZC0+ZGF0YSArIDE7CisJCQllbHNlCisJCQkJbHVyYl9wcml2LT5hY3R1YWxfbGVuZ3RoICs9IHRkQ0JQIC0gdGQtPmRhdGE7CisJCX0KKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHJlcGxpZXMgdG8gdGhlIHJlcXVlc3QgaGF2ZSB0byBiZSBvbiBhIEZJRk8gYmFzaXMgc28KKyAqIHdlIHJldmVyc2UgdGhlIHJldmVyc2VkIGRvbmUtbGlzdCAqLworCitzdGF0aWMgdGRfdCAqIGRsX3JldmVyc2VfZG9uZV9saXN0IChvaGNpX3QgKm9oY2kpCit7CisJX191MzIgdGRfbGlzdF9oYzsKKwl0ZF90ICp0ZF9yZXYgPSBOVUxMOworCXRkX3QgKnRkX2xpc3QgPSBOVUxMOworCXVyYl9wcml2X3QgKmx1cmJfcHJpdiA9IE5VTEw7CisKKwl0ZF9saXN0X2hjID0gbTMyX3N3YXAgKG9oY2ktPmhjY2EtPmRvbmVfaGVhZCkgJiAweGZmZmZmZmYwOworCW9oY2ktPmhjY2EtPmRvbmVfaGVhZCA9IDA7CisKKwl3aGlsZSAodGRfbGlzdF9oYykgeworCQl0ZF9saXN0ID0gKHRkX3QgKil0ZF9saXN0X2hjOworCisJCWlmIChURF9DQ19HRVQgKG0zMl9zd2FwICh0ZF9saXN0LT5od0lORk8pKSkgeworCQkJbHVyYl9wcml2ID0gdGRfbGlzdC0+ZWQtPnB1cmI7CisJCQlkYmcoIiBVU0ItZXJyb3Ivc3RhdHVzOiAleCA6ICVwIiwKKwkJCQkJVERfQ0NfR0VUIChtMzJfc3dhcCAodGRfbGlzdC0+aHdJTkZPKSksIHRkX2xpc3QpOworCQkJaWYgKHRkX2xpc3QtPmVkLT5od0hlYWRQICYgbTMyX3N3YXAgKDB4MSkpIHsKKwkJCQlpZiAobHVyYl9wcml2ICYmICgodGRfbGlzdC0+aW5kZXggKyAxKSA8IGx1cmJfcHJpdi0+bGVuZ3RoKSkgeworCQkJCQl0ZF9saXN0LT5lZC0+aHdIZWFkUCA9CisJCQkJCQkobHVyYl9wcml2LT50ZFtsdXJiX3ByaXYtPmxlbmd0aCAtIDFdLT5od05leHRURCAmIG0zMl9zd2FwICgweGZmZmZmZmYwKSkgfAorCQkJCQkJCQkJKHRkX2xpc3QtPmVkLT5od0hlYWRQICYgbTMyX3N3YXAgKDB4MikpOworCQkJCQlsdXJiX3ByaXYtPnRkX2NudCArPSBsdXJiX3ByaXYtPmxlbmd0aCAtIHRkX2xpc3QtPmluZGV4IC0gMTsKKwkJCQl9IGVsc2UKKwkJCQkJdGRfbGlzdC0+ZWQtPmh3SGVhZFAgJj0gbTMyX3N3YXAgKDB4ZmZmZmZmZjIpOworCQkJfQorI2lmZGVmIENPTkZJR19NUEM1MjAwCisJCQl0ZF9saXN0LT5od05leHRURCA9IDA7CisjZW5kaWYKKwkJfQorCisJCXRkX2xpc3QtPm5leHRfZGxfdGQgPSB0ZF9yZXY7CisJCXRkX3JldiA9IHRkX2xpc3Q7CisJCXRkX2xpc3RfaGMgPSBtMzJfc3dhcCAodGRfbGlzdC0+aHdOZXh0VEQpICYgMHhmZmZmZmZmMDsKKwl9CisJcmV0dXJuIHRkX2xpc3Q7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHRkIGRvbmUgbGlzdCAqLworc3RhdGljIGludCBkbF9kb25lX2xpc3QgKG9oY2lfdCAqb2hjaSwgdGRfdCAqdGRfbGlzdCkKK3sKKwl0ZF90ICp0ZF9saXN0X25leHQgPSBOVUxMOworCWVkX3QgKmVkOworCWludCBjYyA9IDA7CisJaW50IHN0YXQgPSAwOworCS8qIHVyYl90ICp1cmI7ICovCisJdXJiX3ByaXZfdCAqbHVyYl9wcml2OworCV9fdTMyIHRkSU5GTywgZWRIZWFkUCwgZWRUYWlsUDsKKworCXdoaWxlICh0ZF9saXN0KSB7CisJCXRkX2xpc3RfbmV4dCA9IHRkX2xpc3QtPm5leHRfZGxfdGQ7CisKKwkJdGRJTkZPID0gbTMyX3N3YXAgKHRkX2xpc3QtPmh3SU5GTyk7CisKKwkJZWQgPSB0ZF9saXN0LT5lZDsKKwkJbHVyYl9wcml2ID0gZWQtPnB1cmI7CisKKwkJZGxfdHJhbnNmZXJfbGVuZ3RoKHRkX2xpc3QpOworCisJCS8qIGVycm9yIGNvZGUgb2YgdHJhbnNmZXIgKi8KKwkJY2MgPSBURF9DQ19HRVQgKHRkSU5GTyk7CisJCWlmIChjYyAhPSAwKSB7CisJCQlkYmcoIkNvbmRpdGlvbkNvZGUgJSN4IiwgY2MpOworCQkJc3RhdCA9IGNjX3RvX2Vycm9yW2NjXTsKKwkJfQorCisJCS8qIHNlZSBpZiB0aGlzIGRvbmUgbGlzdCBtYWtlcyBmb3IgYWxsIFREJ3Mgb2YgY3VycmVudCBVUkIsCisJCSAqIGFuZCBtYXJrIHRoZSBVUkIgZmluaXNoZWQgaWYgc28gKi8KKwkJaWYgKCsrKGx1cmJfcHJpdi0+dGRfY250KSA9PSBsdXJiX3ByaXYtPmxlbmd0aCkgeworI2lmIDEKKwkJCWlmICgoZWQtPnN0YXRlICYgKEVEX09QRVIgfCBFRF9VTkxJTkspKSAmJgorCQkJICAgIChsdXJiX3ByaXYtPnN0YXRlICE9IFVSQl9ERUwpKQorI2Vsc2UKKwkJCWlmICgoZWQtPnN0YXRlICYgKEVEX09QRVIgfCBFRF9VTkxJTkspKSkKKyNlbmRpZgorCQkJCWx1cmJfcHJpdi0+ZmluaXNoZWQgPSBzb2hjaV9yZXR1cm5fam9iKG9oY2ksCisJCQkJCQlsdXJiX3ByaXYpOworCQkJZWxzZQorCQkJCWRiZygiZGxfZG9uZV9saXN0OiBzdHJhbmdlLi4sIEVEIHN0YXRlICV4LCBlZC0+c3RhdGVcbiIpOworCQl9IGVsc2UKKwkJCWRiZygiZGxfZG9uZV9saXN0OiBwcm9jZXNzaW5nIFREICV4LCBsZW4gJXhcbiIsIGx1cmJfcHJpdi0+dGRfY250LAorCQkJCWx1cmJfcHJpdi0+bGVuZ3RoKTsKKwkJaWYgKGVkLT5zdGF0ZSAhPSBFRF9ORVcgJiYKKwkJCSAgKHVzYl9waXBldHlwZSAobHVyYl9wcml2LT5waXBlKSAhPSBQSVBFX0lOVEVSUlVQVCkpIHsKKwkJCWVkSGVhZFAgPSBtMzJfc3dhcCAoZWQtPmh3SGVhZFApICYgMHhmZmZmZmZmMDsKKwkJCWVkVGFpbFAgPSBtMzJfc3dhcCAoZWQtPmh3VGFpbFApOworCisJCQkvKiB1bmxpbmsgZWRzIGlmIHRoZXkgYXJlIG5vdCBidXN5ICovCisJCQlpZiAoKGVkSGVhZFAgPT0gZWRUYWlsUCkgJiYgKGVkLT5zdGF0ZSA9PSBFRF9PUEVSKSkKKwkJCQllcF91bmxpbmsgKG9oY2ksIGVkKTsKKwkJfQorCisJCXRkX2xpc3QgPSB0ZF9saXN0X25leHQ7CisJfQorCXJldHVybiBzdGF0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBWaXJ0dWFsIFJvb3QgSHViCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBEZXZpY2UgZGVzY3JpcHRvciAqLworc3RhdGljIF9fdTggcm9vdF9odWJfZGV2X2Rlc1tdID0KK3sKKwkweDEyLAkgICAgLyoJX191OCAgYkxlbmd0aDsgKi8KKwkweDAxLAkgICAgLyoJX191OCAgYkRlc2NyaXB0b3JUeXBlOyBEZXZpY2UgKi8KKwkweDEwLAkgICAgLyoJX191MTYgYmNkVVNCOyB2MS4xICovCisJMHgwMSwKKwkweDA5LAkgICAgLyoJX191OCAgYkRldmljZUNsYXNzOyBIVUJfQ0xBU1NDT0RFICovCisJMHgwMCwJICAgIC8qCV9fdTggIGJEZXZpY2VTdWJDbGFzczsgKi8KKwkweDAwLAkgICAgLyoJX191OCAgYkRldmljZVByb3RvY29sOyAqLworCTB4MDgsCSAgICAvKglfX3U4ICBiTWF4UGFja2V0U2l6ZTA7IDggQnl0ZXMgKi8KKwkweDAwLAkgICAgLyoJX191MTYgaWRWZW5kb3I7ICovCisJMHgwMCwKKwkweDAwLAkgICAgLyoJX191MTYgaWRQcm9kdWN0OyAqLworCTB4MDAsCisJMHgwMCwJICAgIC8qCV9fdTE2IGJjZERldmljZTsgKi8KKwkweDAwLAorCTB4MDAsCSAgICAvKglfX3U4ICBpTWFudWZhY3R1cmVyOyAqLworCTB4MDEsCSAgICAvKglfX3U4ICBpUHJvZHVjdDsgKi8KKwkweDAwLAkgICAgLyoJX191OCAgaVNlcmlhbE51bWJlcjsgKi8KKwkweDAxCSAgICAvKglfX3U4ICBiTnVtQ29uZmlndXJhdGlvbnM7ICovCit9OworCisvKiBDb25maWd1cmF0aW9uIGRlc2NyaXB0b3IgKi8KK3N0YXRpYyBfX3U4IHJvb3RfaHViX2NvbmZpZ19kZXNbXSA9Cit7CisJMHgwOSwJICAgIC8qCV9fdTggIGJMZW5ndGg7ICovCisJMHgwMiwJICAgIC8qCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsgQ29uZmlndXJhdGlvbiAqLworCTB4MTksCSAgICAvKglfX3UxNiB3VG90YWxMZW5ndGg7ICovCisJMHgwMCwKKwkweDAxLAkgICAgLyoJX191OCAgYk51bUludGVyZmFjZXM7ICovCisJMHgwMSwJICAgIC8qCV9fdTggIGJDb25maWd1cmF0aW9uVmFsdWU7ICovCisJMHgwMCwJICAgIC8qCV9fdTggIGlDb25maWd1cmF0aW9uOyAqLworCTB4NDAsCSAgICAvKglfX3U4ICBibUF0dHJpYnV0ZXM7CisJCSBCaXQgNzogQnVzLXBvd2VyZWQsIDY6IFNlbGYtcG93ZXJlZCwgNSBSZW1vdGUtd2Frd3VwLCA0Li4wOiByZXN2ZCAqLworCTB4MDAsCSAgICAvKglfX3U4ICBNYXhQb3dlcjsgKi8KKworCS8qIGludGVyZmFjZSAqLworCTB4MDksCSAgICAvKglfX3U4ICBpZl9iTGVuZ3RoOyAqLworCTB4MDQsCSAgICAvKglfX3U4ICBpZl9iRGVzY3JpcHRvclR5cGU7IEludGVyZmFjZSAqLworCTB4MDAsCSAgICAvKglfX3U4ICBpZl9iSW50ZXJmYWNlTnVtYmVyOyAqLworCTB4MDAsCSAgICAvKglfX3U4ICBpZl9iQWx0ZXJuYXRlU2V0dGluZzsgKi8KKwkweDAxLAkgICAgLyoJX191OCAgaWZfYk51bUVuZHBvaW50czsgKi8KKwkweDA5LAkgICAgLyoJX191OCAgaWZfYkludGVyZmFjZUNsYXNzOyBIVUJfQ0xBU1NDT0RFICovCisJMHgwMCwJICAgIC8qCV9fdTggIGlmX2JJbnRlcmZhY2VTdWJDbGFzczsgKi8KKwkweDAwLAkgICAgLyoJX191OCAgaWZfYkludGVyZmFjZVByb3RvY29sOyAqLworCTB4MDAsCSAgICAvKglfX3U4ICBpZl9pSW50ZXJmYWNlOyAqLworCisJLyogZW5kcG9pbnQgKi8KKwkweDA3LAkgICAgLyoJX191OCAgZXBfYkxlbmd0aDsgKi8KKwkweDA1LAkgICAgLyoJX191OCAgZXBfYkRlc2NyaXB0b3JUeXBlOyBFbmRwb2ludCAqLworCTB4ODEsCSAgICAvKglfX3U4ICBlcF9iRW5kcG9pbnRBZGRyZXNzOyBJTiBFbmRwb2ludCAxICovCisJMHgwMywJICAgIC8qCV9fdTggIGVwX2JtQXR0cmlidXRlczsgSW50ZXJydXB0ICovCisJMHgwMiwJICAgIC8qCV9fdTE2IGVwX3dNYXhQYWNrZXRTaXplOyAoKE1BWF9ST09UX1BPUlRTICsgMSkgLyA4ICovCisJMHgwMCwKKwkweGZmCSAgICAvKglfX3U4ICBlcF9iSW50ZXJ2YWw7IDI1NSBtcyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcm9vdF9odWJfc3RyX2luZGV4MFtdID0KK3sKKwkweDA0LAkJCS8qICBfX3U4ICBiTGVuZ3RoOyAqLworCTB4MDMsCQkJLyogIF9fdTggIGJEZXNjcmlwdG9yVHlwZTsgU3RyaW5nLWRlc2NyaXB0b3IgKi8KKwkweDA5LAkJCS8qICBfX3U4ICBsYW5nIElEICovCisJMHgwNCwJCQkvKiAgX191OCAgbGFuZyBJRCAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcm9vdF9odWJfc3RyX2luZGV4MVtdID0KK3sKKwkyOCwJCQkvKiAgX191OCAgYkxlbmd0aDsgKi8KKwkweDAzLAkJCS8qICBfX3U4ICBiRGVzY3JpcHRvclR5cGU7IFN0cmluZy1kZXNjcmlwdG9yICovCisJJ08nLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknSCcsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSdDJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ0knLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknICcsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSdSJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ28nLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknbycsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSd0JywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJyAnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknSCcsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSd1JywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ2InLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KK307CisKKy8qIEh1YiBjbGFzcy1zcGVjaWZpYyBkZXNjcmlwdG9yIGlzIGNvbnN0cnVjdGVkIGR5bmFtaWNhbGx5ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgT0soeCkJCQlsZW4gPSAoeCk7IGJyZWFrCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgV1JfUkhfU1RBVCh4KQkJe2luZm8oIldSOnN0YXR1cyAlIzh4IiwgKHgpKTt3cml0ZWwoKHgpLCAmZ29oY2kucmVncy0+cm9vdGh1Yi5zdGF0dXMpO30KKyNkZWZpbmUgV1JfUkhfUE9SVFNUQVQoeCkJe2luZm8oIldSOnBvcnRzdGF0dXNbJWRdICUjOHgiLCB3SW5kZXgtMSwgKHgpKTt3cml0ZWwoKHgpLCAmZ29oY2kucmVncy0+cm9vdGh1Yi5wb3J0c3RhdHVzW3dJbmRleC0xXSk7fQorI2Vsc2UKKyNkZWZpbmUgV1JfUkhfU1RBVCh4KQkJd3JpdGVsKCh4KSwgJmdvaGNpLnJlZ3MtPnJvb3RodWIuc3RhdHVzKQorI2RlZmluZSBXUl9SSF9QT1JUU1RBVCh4KQl3cml0ZWwoKHgpLCAmZ29oY2kucmVncy0+cm9vdGh1Yi5wb3J0c3RhdHVzW3dJbmRleC0xXSkKKyNlbmRpZgorI2RlZmluZSBSRF9SSF9TVEFUCQlyb290aHViX3N0YXR1cygmZ29oY2kpCisjZGVmaW5lIFJEX1JIX1BPUlRTVEFUCQlyb290aHViX3BvcnRzdGF0dXMoJmdvaGNpLHdJbmRleC0xKQorCisvKiByZXF1ZXN0IHRvIHZpcnR1YWwgcm9vdCBodWIgKi8KKworaW50IHJoX2NoZWNrX3BvcnRfc3RhdHVzKG9oY2lfdCAqY29udHJvbGxlcikKK3sKKwlfX3UzMiB0ZW1wLCBuZHAsIGk7CisJaW50IHJlczsKKworCXJlcyA9IC0xOworCXRlbXAgPSByb290aHViX2EgKGNvbnRyb2xsZXIpOworCW5kcCA9ICh0ZW1wICYgUkhfQV9ORFApOworI2lmZGVmIENPTkZJR19BVDkxQ19QUUZQX1VIUEJVRworCW5kcCA9IChuZHAgPT0gMikgPyAxOjA7CisjZW5kaWYKKwlmb3IgKGkgPSAwOyBpIDwgbmRwOyBpKyspIHsKKwkJdGVtcCA9IHJvb3RodWJfcG9ydHN0YXR1cyAoY29udHJvbGxlciwgaSk7CisJCS8qIGNoZWNrIGZvciBhIGRldmljZSBkaXNjb25uZWN0ICovCisJCWlmICgoKHRlbXAgJiAoUkhfUFNfUEVTQyB8IFJIX1BTX0NTQykpID09CisJCQkoUkhfUFNfUEVTQyB8IFJIX1BTX0NTQykpICYmCisJCQkoKHRlbXAgJiBSSF9QU19DQ1MpID09IDApKSB7CisJCQlyZXMgPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBvaGNpX3N1Ym1pdF9yaF9tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLAorCQl2b2lkICpidWZmZXIsIGludCB0cmFuc2Zlcl9sZW4sIHN0cnVjdCBkZXZyZXF1ZXN0ICpjbWQpCit7CisJdm9pZCAqIGRhdGEgPSBidWZmZXI7CisJaW50IGxlbmkgPSB0cmFuc2Zlcl9sZW47CisJaW50IGxlbiA9IDA7CisJaW50IHN0YXQgPSAwOworCV9fdTMyIGRhdGFiWzRdOworCV9fdTggKmRhdGFfYnVmID0gKF9fdTggKilkYXRhYjsKKwlfX3UxNiBibVJUeXBlX2JSZXE7CisJX191MTYgd1ZhbHVlOworCV9fdTE2IHdJbmRleDsKKwlfX3UxNiB3TGVuZ3RoOworCisjaWZkZWYgREVCVUcKK3BrdF9wcmludChOVUxMLCBkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCBjbWQsICJTVUIocmgpIiwgdXNiX3BpcGVpbihwaXBlKSk7CisjZWxzZQorCXdhaXRfbXMoMSk7CisjZW5kaWYKKwlpZiAoKHBpcGUgJiBQSVBFX0lOVEVSUlVQVCkgPT0gUElQRV9JTlRFUlJVUFQpIHsKKwkJaW5mbygiUm9vdC1IdWIgc3VibWl0IElSUTogTk9UIGltcGxlbWVudGVkIik7CisJCXJldHVybiAwOworCX0KKworCWJtUlR5cGVfYlJlcSAgPSBjbWQtPnJlcXVlc3R0eXBlIHwgKGNtZC0+cmVxdWVzdCA8PCA4KTsKKwl3VmFsdWUJICAgICAgPSBjcHVfdG9fbGUxNiAoY21kLT52YWx1ZSk7CisJd0luZGV4CSAgICAgID0gY3B1X3RvX2xlMTYgKGNtZC0+aW5kZXgpOworCXdMZW5ndGgJICAgICAgPSBjcHVfdG9fbGUxNiAoY21kLT5sZW5ndGgpOworCisJaW5mbygiUm9vdC1IdWI6IGFkcjogJTJ4IGNtZCglMXgpOiAlMDh4ICUwNHggJTA0eCAlMDR4IiwKKwkJZGV2LT5kZXZudW0sIDgsIGJtUlR5cGVfYlJlcSwgd1ZhbHVlLCB3SW5kZXgsIHdMZW5ndGgpOworCisJc3dpdGNoIChibVJUeXBlX2JSZXEpIHsKKwkvKiBSZXF1ZXN0IERlc3RpbmF0aW9uOgorCSAgIHdpdGhvdXQgZmxhZ3M6IERldmljZSwKKwkgICBSSF9JTlRFUkZBQ0U6IGludGVyZmFjZSwKKwkgICBSSF9FTkRQT0lOVDogZW5kcG9pbnQsCisJICAgUkhfQ0xBU1MgbWVhbnMgSFVCIGhlcmUsCisJICAgUkhfT1RIRVIgfCBSSF9DTEFTUwlhbG1vc3QgZXZlciBtZWFucyBIVUJfUE9SVCBoZXJlCisJKi8KKworCWNhc2UgUkhfR0VUX1NUQVRVUzoKKwkJCSooX191MTYgKikgZGF0YV9idWYgPSBjcHVfdG9fbGUxNiAoMSk7IE9LICgyKTsKKwljYXNlIFJIX0dFVF9TVEFUVVMgfCBSSF9JTlRFUkZBQ0U6CisJCQkqKF9fdTE2ICopIGRhdGFfYnVmID0gY3B1X3RvX2xlMTYgKDApOyBPSyAoMik7CisJY2FzZSBSSF9HRVRfU1RBVFVTIHwgUkhfRU5EUE9JTlQ6CisJCQkqKF9fdTE2ICopIGRhdGFfYnVmID0gY3B1X3RvX2xlMTYgKDApOyBPSyAoMik7CisJY2FzZSBSSF9HRVRfU1RBVFVTIHwgUkhfQ0xBU1M6CisJCQkqKF9fdTMyICopIGRhdGFfYnVmID0gY3B1X3RvX2xlMzIgKAorCQkJCVJEX1JIX1NUQVQgJiB+KFJIX0hTX0NSV0UgfCBSSF9IU19EUldFKSk7CisJCQlPSyAoNCk7CisJY2FzZSBSSF9HRVRfU1RBVFVTIHwgUkhfT1RIRVIgfCBSSF9DTEFTUzoKKwkJCSooX191MzIgKikgZGF0YV9idWYgPSBjcHVfdG9fbGUzMiAoUkRfUkhfUE9SVFNUQVQpOyBPSyAoNCk7CisKKwljYXNlIFJIX0NMRUFSX0ZFQVRVUkUgfCBSSF9FTkRQT0lOVDoKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJCWNhc2UgKFJIX0VORFBPSU5UX1NUQUxMKTogT0sgKDApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSSF9DTEVBUl9GRUFUVVJFIHwgUkhfQ0xBU1M6CisJCXN3aXRjaCAod1ZhbHVlKSB7CisJCQljYXNlIFJIX0NfSFVCX0xPQ0FMX1BPV0VSOgorCQkJCU9LKDApOworCQkJY2FzZSAoUkhfQ19IVUJfT1ZFUl9DVVJSRU5UKToKKwkJCQkJV1JfUkhfU1RBVChSSF9IU19PQ0lDKTsgT0sgKDApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSSF9DTEVBUl9GRUFUVVJFIHwgUkhfT1RIRVIgfCBSSF9DTEFTUzoKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJCWNhc2UgKFJIX1BPUlRfRU5BQkxFKToKKwkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX0NDUyApOyBPSyAoMCk7CisJCQljYXNlIChSSF9QT1JUX1NVU1BFTkQpOgorCQkJCQlXUl9SSF9QT1JUU1RBVCAoUkhfUFNfUE9DSSk7IE9LICgwKTsKKwkJCWNhc2UgKFJIX1BPUlRfUE9XRVIpOgorCQkJCQlXUl9SSF9QT1JUU1RBVCAoUkhfUFNfTFNEQSk7IE9LICgwKTsKKwkJCWNhc2UgKFJIX0NfUE9SVF9DT05ORUNUSU9OKToKKwkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX0NTQyApOyBPSyAoMCk7CisJCQljYXNlIChSSF9DX1BPUlRfRU5BQkxFKToKKwkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX1BFU0MpOyBPSyAoMCk7CisJCQljYXNlIChSSF9DX1BPUlRfU1VTUEVORCk6CisJCQkJCVdSX1JIX1BPUlRTVEFUIChSSF9QU19QU1NDKTsgT0sgKDApOworCQkJY2FzZSAoUkhfQ19QT1JUX09WRVJfQ1VSUkVOVCk6CisJCQkJCVdSX1JIX1BPUlRTVEFUIChSSF9QU19PQ0lDKTsgT0sgKDApOworCQkJY2FzZSAoUkhfQ19QT1JUX1JFU0VUKToKKwkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX1BSU0MpOyBPSyAoMCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFJIX1NFVF9GRUFUVVJFIHwgUkhfT1RIRVIgfCBSSF9DTEFTUzoKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJCWNhc2UgKFJIX1BPUlRfU1VTUEVORCk6CisJCQkJCVdSX1JIX1BPUlRTVEFUIChSSF9QU19QU1MgKTsgT0sgKDApOworCQkJY2FzZSAoUkhfUE9SVF9SRVNFVCk6IC8qIEJVRyBJTiBIVVAgQ09ERSAqKioqKioqKiovCisJCQkJCWlmIChSRF9SSF9QT1JUU1RBVCAmIFJIX1BTX0NDUykKKwkJCQkJICAgIFdSX1JIX1BPUlRTVEFUIChSSF9QU19QUlMpOworCQkJCQlPSyAoMCk7CisJCQljYXNlIChSSF9QT1JUX1BPV0VSKToKKwkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX1BQUyApOworCQkJCQl3YWl0X21zKDEwMCk7CisJCQkJCU9LICgwKTsKKwkJCWNhc2UgKFJIX1BPUlRfRU5BQkxFKTogLyogQlVHIElOIEhVUCBDT0RFICoqKioqKioqKi8KKwkJCQkJaWYgKFJEX1JIX1BPUlRTVEFUICYgUkhfUFNfQ0NTKQorCQkJCQkgICAgV1JfUkhfUE9SVFNUQVQgKFJIX1BTX1BFUyApOworCQkJCQlPSyAoMCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFJIX1NFVF9BRERSRVNTOiBnb2hjaS5yaC5kZXZudW0gPSB3VmFsdWU7IE9LKDApOworCisJY2FzZSBSSF9HRVRfREVTQ1JJUFRPUjoKKwkJc3dpdGNoICgod1ZhbHVlICYgMHhmZjAwKSA+PiA4KSB7CisJCQljYXNlICgweDAxKTogLyogZGV2aWNlIGRlc2NyaXB0b3IgKi8KKwkJCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQkJCSAgbGVuaSwKKwkJCQkJICBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQkJCSAgICAgIHNpemVvZiAocm9vdF9odWJfZGV2X2RlcyksCisJCQkJCSAgICAgIHdMZW5ndGgpKTsKKwkJCQlkYXRhX2J1ZiA9IHJvb3RfaHViX2Rldl9kZXM7IE9LKGxlbik7CisJCQljYXNlICgweDAyKTogLyogY29uZmlndXJhdGlvbiBkZXNjcmlwdG9yICovCisJCQkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LAorCQkJCQkgIGxlbmksCisJCQkJCSAgbWluX3QodW5zaWduZWQgaW50LAorCQkJCQkgICAgICBzaXplb2YgKHJvb3RfaHViX2NvbmZpZ19kZXMpLAorCQkJCQkgICAgICB3TGVuZ3RoKSk7CisJCQkJZGF0YV9idWYgPSByb290X2h1Yl9jb25maWdfZGVzOyBPSyhsZW4pOworCQkJY2FzZSAoMHgwMyk6IC8qIHN0cmluZyBkZXNjcmlwdG9ycyAqLworCQkJCWlmKHdWYWx1ZT09MHgwMzAwKSB7CisJCQkJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwKKwkJCQkJCSAgbGVuaSwKKwkJCQkJCSAgbWluX3QodW5zaWduZWQgaW50LAorCQkJCQkJICAgICAgc2l6ZW9mIChyb290X2h1Yl9zdHJfaW5kZXgwKSwKKwkJCQkJCSAgICAgIHdMZW5ndGgpKTsKKwkJCQkJZGF0YV9idWYgPSByb290X2h1Yl9zdHJfaW5kZXgwOworCQkJCQlPSyhsZW4pOworCQkJCX0KKwkJCQlpZih3VmFsdWU9PTB4MDMwMSkgeworCQkJCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQkJCQkgIGxlbmksCisJCQkJCQkgIG1pbl90KHVuc2lnbmVkIGludCwKKwkJCQkJCSAgICAgIHNpemVvZiAocm9vdF9odWJfc3RyX2luZGV4MSksCisJCQkJCQkgICAgICB3TGVuZ3RoKSk7CisJCQkJCWRhdGFfYnVmID0gcm9vdF9odWJfc3RyX2luZGV4MTsKKwkJCQkJT0sobGVuKTsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQkJc3RhdCA9IFVTQl9TVF9TVEFMTEVEOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSSF9HRVRfREVTQ1JJUFRPUiB8IFJIX0NMQVNTOgorCXsKKwkJX191MzIgdGVtcCA9IHJvb3RodWJfYSAoJmdvaGNpKTsKKworCQlkYXRhX2J1ZiBbMF0gPSA5OwkJLyogbWluIGxlbmd0aDsgKi8KKwkJZGF0YV9idWYgWzFdID0gMHgyOTsKKwkJZGF0YV9idWYgWzJdID0gdGVtcCAmIFJIX0FfTkRQOworI2lmZGVmIENPTkZJR19BVDkxQ19QUUZQX1VIUEJVRworCQlkYXRhX2J1ZiBbMl0gPSAoZGF0YV9idWYgWzJdID09IDIpID8gMTowOworI2VuZGlmCisJCWRhdGFfYnVmIFszXSA9IDA7CisJCWlmICh0ZW1wICYgUkhfQV9QU00pCS8qIHBlci1wb3J0IHBvd2VyIHN3aXRjaGluZz8gKi8KKwkJCWRhdGFfYnVmIFszXSB8PSAweDE7CisJCWlmICh0ZW1wICYgUkhfQV9OT0NQKQkvKiBubyBvdmVyY3VycmVudCByZXBvcnRpbmc/ICovCisJCQlkYXRhX2J1ZiBbM10gfD0gMHgxMDsKKwkJZWxzZSBpZiAodGVtcCAmIFJIX0FfT0NQTSkJLyogcGVyLXBvcnQgb3ZlcmN1cnJlbnQgcmVwb3J0aW5nPyAqLworCQkJZGF0YV9idWYgWzNdIHw9IDB4ODsKKworCQkvKiBjb3JyZXNwb25kcyB0byBkYXRhX2J1Zls0LTddICovCisJCWRhdGFiIFsxXSA9IDA7CisJCWRhdGFfYnVmIFs1XSA9ICh0ZW1wICYgUkhfQV9QT1RQR1QpID4+IDI0OworCQl0ZW1wID0gcm9vdGh1Yl9iICgmZ29oY2kpOworCQlkYXRhX2J1ZiBbN10gPSB0ZW1wICYgUkhfQl9EUjsKKwkJaWYgKGRhdGFfYnVmIFsyXSA8IDcpIHsKKwkJCWRhdGFfYnVmIFs4XSA9IDB4ZmY7CisJCX0gZWxzZSB7CisJCQlkYXRhX2J1ZiBbMF0gKz0gMjsKKwkJCWRhdGFfYnVmIFs4XSA9ICh0ZW1wICYgUkhfQl9EUikgPj4gODsKKwkJCWRhdGFfYnVmIFsxMF0gPSBkYXRhX2J1ZiBbOV0gPSAweGZmOworCQl9CisKKwkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW5pLAorCQkJICAgIG1pbl90KHVuc2lnbmVkIGludCwgZGF0YV9idWYgWzBdLCB3TGVuZ3RoKSk7CisJCU9LIChsZW4pOworCX0KKworCWNhc2UgUkhfR0VUX0NPTkZJR1VSQVRJT046CSooX191OCAqKSBkYXRhX2J1ZiA9IDB4MDE7IE9LICgxKTsKKworCWNhc2UgUkhfU0VUX0NPTkZJR1VSQVRJT046CVdSX1JIX1NUQVQgKDB4MTAwMDApOyBPSyAoMCk7CisKKwlkZWZhdWx0OgorCQlkYmcgKCJ1bnN1cHBvcnRlZCByb290IGh1YiBjb21tYW5kIik7CisJCXN0YXQgPSBVU0JfU1RfU1RBTExFRDsKKwl9CisKKyNpZmRlZglERUJVRworCW9oY2lfZHVtcF9yb290aHViICgmZ29oY2ksIDEpOworI2Vsc2UKKwl3YWl0X21zKDEpOworI2VuZGlmCisKKwlsZW4gPSBtaW5fdChpbnQsIGxlbiwgbGVuaSk7CisJaWYgKGRhdGEgIT0gZGF0YV9idWYpCisJICAgIG1lbWNweSAoZGF0YSwgZGF0YV9idWYsIGxlbik7CisJZGV2LT5hY3RfbGVuID0gbGVuOworCWRldi0+c3RhdHVzID0gc3RhdDsKKworI2lmZGVmIERFQlVHCisJcGt0X3ByaW50KE5VTEwsIGRldiwgcGlwZSwgYnVmZmVyLCB0cmFuc2Zlcl9sZW4sIGNtZCwgIlJFVChyaCkiLCAwLyp1c2JfcGlwZWluKHBpcGUpKi8pOworI2Vsc2UKKwl3YWl0X21zKDEpOworI2VuZGlmCisKKwlyZXR1cm4gc3RhdDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogY29tbW9uIGNvZGUgZm9yIGhhbmRsaW5nIHN1Ym1pdCBtZXNzYWdlcyAtIHVzZWQgZm9yIGFsbCBidXQgcm9vdCBodWIgKi8KKy8qIGFjY2Vzc2VzLiAqLworaW50IHN1Ym1pdF9jb21tb25fbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqYnVmZmVyLAorCQlpbnQgdHJhbnNmZXJfbGVuLCBzdHJ1Y3QgZGV2cmVxdWVzdCAqc2V0dXAsIGludCBpbnRlcnZhbCkKK3sKKwlpbnQgc3RhdCA9IDA7CisJaW50IG1heHNpemUgPSB1c2JfbWF4cGFja2V0KGRldiwgcGlwZSk7CisJaW50IHRpbWVvdXQ7CisJdXJiX3ByaXZfdCAqdXJiOworCisJdXJiID0gbWFsbG9jKHNpemVvZih1cmJfcHJpdl90KSk7CisJbWVtc2V0KHVyYiwgMCwgc2l6ZW9mKHVyYl9wcml2X3QpKTsKKworCXVyYi0+ZGV2ID0gZGV2OworCXVyYi0+cGlwZSA9IHBpcGU7CisJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBidWZmZXI7CisJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gdHJhbnNmZXJfbGVuOworCXVyYi0+aW50ZXJ2YWwgPSBpbnRlcnZhbDsKKworCS8qIGRldmljZSBwdWxsZWQ/IFNob3J0Y3V0IHRoZSBhY3Rpb24uICovCisJaWYgKGRldmdvbmUgPT0gZGV2KSB7CisJCWRldi0+c3RhdHVzID0gVVNCX1NUX0NSQ19FUlI7CisJCXJldHVybiAwOworCX0KKworI2lmZGVmIERFQlVHCisJdXJiLT5hY3R1YWxfbGVuZ3RoID0gMDsKKwlwa3RfcHJpbnQodXJiLCBkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCBzZXR1cCwgIlNVQiIsIHVzYl9waXBlaW4ocGlwZSkpOworI2Vsc2UKKwl3YWl0X21zKDEpOworI2VuZGlmCisJaWYgKCFtYXhzaXplKSB7CisJCWVycigic3VibWl0X2NvbW1vbl9tZXNzYWdlOiBwaXBlc2l6ZSBmb3IgcGlwZSAlbHggaXMgemVybyIsCisJCQlwaXBlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChzb2hjaV9zdWJtaXRfam9iKHVyYiwgc2V0dXApIDwgMCkgeworCQllcnIoInNvaGNpX3N1Ym1pdF9qb2IgZmFpbGVkIik7CisJCXJldHVybiAtMTsKKwl9CisKKyNpZiAwCisJd2FpdF9tcygxMCk7CisJLyogb2hjaV9kdW1wX3N0YXR1cygmZ29oY2kpOyAqLworI2VuZGlmCisKKwkvKiBhbGxvdyBtb3JlIHRpbWUgZm9yIGEgQlVMSyBkZXZpY2UgdG8gcmVhY3QgLSBzb21lIGFyZSBzbG93ICovCisjZGVmaW5lIEJVTEtfVE8JIDUwMDAJLyogdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKi8KKwlpZiAodXNiX3BpcGV0eXBlIChwaXBlKSA9PSBQSVBFX0JVTEspCisJCXRpbWVvdXQgPSBCVUxLX1RPOworCWVsc2UKKwkJdGltZW91dCA9IDEwMDsKKworCS8qIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlICovCisJZm9yICg7OykgeworCQkvKiBjaGVjayB3aGV0aGVyIHRoZSBjb250cm9sbGVyIGlzIGRvbmUgKi8KKwkJc3RhdCA9IGhjX2ludGVycnVwdCgpOworCQlpZiAoc3RhdCA8IDApIHsKKwkJCXN0YXQgPSBVU0JfU1RfQ1JDX0VSUjsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogTk9URTogc2luY2Ugd2UgYXJlIG5vdCBpbnRlcnJ1cHQgZHJpdmVuIGluIFUtQm9vdCBhbmQgYWx3YXlzCisJCSAqIGhhbmRsZSBvbmx5IG9uZSBVUkIgYXQgYSB0aW1lLCB3ZSBjYW5ub3QgYXNzdW1lIHRoZQorCQkgKiB0cmFuc2FjdGlvbiBmaW5pc2hlZCBvbiB0aGUgZmlyc3Qgc3VjY2Vzc2Z1bCByZXR1cm4gZnJvbQorCQkgKiBoY19pbnRlcnJ1cHQoKS4uIHVubGVzcyB0aGUgZmxhZyBmb3IgY3VycmVudCBVUkIgaXMgc2V0LAorCQkgKiBtZWFuaW5nIHRoYXQgYWxsIFREJ3MgdG8vZnJvbSBkZXZpY2UgZ290IGFjdHVhbGx5CisJCSAqIHRyYW5zZmVycmVkIGFuZCBwcm9jZXNzZWQuIElmIHRoZSBjdXJyZW50IFVSQiBpcyBub3QKKwkJICogZmluaXNoZWQgd2UgbmVlZCB0byByZS1pdGVyYXRlIHRoaXMgbG9vcCBzbyBhcworCQkgKiBoY19pbnRlcnJ1cHQoKSBnZXRzIGNhbGxlZCBhZ2FpbiBhcyB0aGVyZSBuZWVkcyB0byBiZSBzb21lCisJCSAqIG1vcmUgVEQncyB0byBwcm9jZXNzIHN0aWxsICovCisJCWlmICgoc3RhdCA+PSAwKSAmJiAoc3RhdCAhPSAweGZmKSAmJiAodXJiLT5maW5pc2hlZCkpIHsKKwkJCS8qIDB4ZmYgaXMgcmV0dXJuZWQgZm9yIGFuIFNGLWludGVycnVwdCAqLworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoLS10aW1lb3V0KSB7CisJCQl3YWl0X21zKDEpOworCQkJaWYgKCF1cmItPmZpbmlzaGVkKQorCQkJCWRiZygiXCUiKTsKKworCQl9IGVsc2UgeworCQkJZXJyKCJDVEw6VElNRU9VVCAiKTsKKwkJCWRiZygic3VibWl0X2NvbW1vbl9tc2c6IFRPIHN0YXR1cyAleFxuIiwgc3RhdCk7CisJCQl1cmItPmZpbmlzaGVkID0gMTsKKwkJCXN0YXQgPSBVU0JfU1RfQ1JDX0VSUjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZGV2LT5zdGF0dXMgPSBzdGF0OworCWRldi0+YWN0X2xlbiA9IHRyYW5zZmVyX2xlbjsKKworI2lmZGVmIERFQlVHCisJcGt0X3ByaW50KHVyYiwgZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwgc2V0dXAsICJSRVQoY3RscikiLCB1c2JfcGlwZWluKHBpcGUpKTsKKyNlbHNlCisJd2FpdF9tcygxKTsKKyNlbmRpZgorCisJLyogZnJlZSBURHMgaW4gdXJiX3ByaXYgKi8KKwlpZiAodXNiX3BpcGV0eXBlIChwaXBlKSAhPSBQSVBFX0lOVEVSUlVQVCkKKwkJdXJiX2ZyZWVfcHJpdiAodXJiKTsKKwlyZXR1cm4gMDsKK30KKworLyogc3VibWl0IHJvdXRpbmVzIGNhbGxlZCBmcm9tIHVzYi5jICovCitpbnQgc3VibWl0X2J1bGtfbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqYnVmZmVyLAorCQlpbnQgdHJhbnNmZXJfbGVuKQoreworCWluZm8oInN1Ym1pdF9idWxrX21zZyIpOworCXJldHVybiBzdWJtaXRfY29tbW9uX21zZyhkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCBOVUxMLCAwKTsKK30KKworaW50IHN1Ym1pdF9jb250cm9sX21zZyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsIHZvaWQgKmJ1ZmZlciwKKwkJaW50IHRyYW5zZmVyX2xlbiwgc3RydWN0IGRldnJlcXVlc3QgKnNldHVwKQoreworCWludCBtYXhzaXplID0gdXNiX21heHBhY2tldChkZXYsIHBpcGUpOworCisJaW5mbygic3VibWl0X2NvbnRyb2xfbXNnIik7CisjaWZkZWYgREVCVUcKKwlwa3RfcHJpbnQoTlVMTCwgZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwgc2V0dXAsICJTVUIiLCB1c2JfcGlwZWluKHBpcGUpKTsKKyNlbHNlCisJd2FpdF9tcygxKTsKKyNlbmRpZgorCWlmICghbWF4c2l6ZSkgeworCQllcnIoInN1Ym1pdF9jb250cm9sX21lc3NhZ2U6IHBpcGVzaXplIGZvciBwaXBlICVseCBpcyB6ZXJvIiwKKwkJCXBpcGUpOworCQlyZXR1cm4gLTE7CisJfQorCWlmICgoKHBpcGUgPj4gOCkgJiAweDdmKSA9PSBnb2hjaS5yaC5kZXZudW0pIHsKKwkJZ29oY2kucmguZGV2ID0gZGV2OworCQkvKiByb290IGh1YiAtIHJlZGlyZWN0ICovCisJCXJldHVybiBvaGNpX3N1Ym1pdF9yaF9tc2coZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwKKwkJCXNldHVwKTsKKwl9CisKKwlyZXR1cm4gc3VibWl0X2NvbW1vbl9tc2coZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwgc2V0dXAsIDApOworfQorCitpbnQgc3VibWl0X2ludF9tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICpidWZmZXIsCisJCWludCB0cmFuc2Zlcl9sZW4sIGludCBpbnRlcnZhbCkKK3sKKwlpbmZvKCJzdWJtaXRfaW50X21zZyIpOworCXJldHVybiBzdWJtaXRfY29tbW9uX21zZyhkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCBOVUxMLAorCQkJaW50ZXJ2YWwpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBIQyBmdW5jdGlvbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHJlc2V0IHRoZSBIQyBhbmQgQlVTICovCisKK3N0YXRpYyBpbnQgaGNfcmVzZXQgKG9oY2lfdCAqb2hjaSkKK3sKKwlpbnQgdGltZW91dCA9IDMwOworCWludCBzbW1fdGltZW91dCA9IDUwOyAvKiAwLDUgc2VjICovCisKKwlkYmcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaWYgKHJlYWRsICgmb2hjaS0+cmVncy0+Y29udHJvbCkgJiBPSENJX0NUUkxfSVIpIHsgLyogU01NIG93bnMgdGhlIEhDICovCisJCXdyaXRlbCAoT0hDSV9PQ1IsICZvaGNpLT5yZWdzLT5jbWRzdGF0dXMpOyAvKiByZXF1ZXN0IG93bmVyc2hpcCAqLworCQlpbmZvKCJVU0IgSEMgVGFrZU92ZXIgZnJvbSBTTU0iKTsKKwkJd2hpbGUgKHJlYWRsICgmb2hjaS0+cmVncy0+Y29udHJvbCkgJiBPSENJX0NUUkxfSVIpIHsKKwkJCXdhaXRfbXMgKDEwKTsKKwkJCWlmICgtLXNtbV90aW1lb3V0ID09IDApIHsKKwkJCQllcnIoIlVTQiBIQyBUYWtlT3ZlciBmYWlsZWQhIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJfQorCisJLyogRGlzYWJsZSBIQyBpbnRlcnJ1cHRzICovCisJd3JpdGVsIChPSENJX0lOVFJfTUlFLCAmb2hjaS0+cmVncy0+aW50cmRpc2FibGUpOworCisJZGJnKCJVU0IgSEMgcmVzZXRfaGMgdXNiLSVzOiBjdHJsID0gMHglWCA7XG4iLAorCQlvaGNpLT5zbG90X25hbWUsCisJCXJlYWRsKCZvaGNpLT5yZWdzLT5jb250cm9sKSk7CisKKwkvKiBSZXNldCBVU0IgKG5lZWRlZCBieSBzb21lIGNvbnRyb2xsZXJzKSAqLworCW9oY2ktPmhjX2NvbnRyb2wgPSAwOworCXdyaXRlbCAob2hjaS0+aGNfY29udHJvbCwgJm9oY2ktPnJlZ3MtPmNvbnRyb2wpOworCisJLyogSEMgUmVzZXQgcmVxdWlyZXMgbWF4IDEwIHVzIGRlbGF5ICovCisJd3JpdGVsIChPSENJX0hDUiwgICZvaGNpLT5yZWdzLT5jbWRzdGF0dXMpOworCXdoaWxlICgocmVhZGwgKCZvaGNpLT5yZWdzLT5jbWRzdGF0dXMpICYgT0hDSV9IQ1IpICE9IDApIHsKKwkJaWYgKC0tdGltZW91dCA9PSAwKSB7CisJCQllcnIoIlVTQiBIQyByZXNldCB0aW1lZCBvdXQhIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJdWRlbGF5ICgxKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFN0YXJ0IGFuIE9IQ0kgY29udHJvbGxlciwgc2V0IHRoZSBCVVMgb3BlcmF0aW9uYWwKKyAqIGVuYWJsZSBpbnRlcnJ1cHRzCisgKiBjb25uZWN0IHRoZSB2aXJ0dWFsIHJvb3QgaHViICovCisKK3N0YXRpYyBpbnQgaGNfc3RhcnQgKG9oY2lfdCAqIG9oY2kpCit7CisJX191MzIgbWFzazsKKwl1bnNpZ25lZCBpbnQgZm1pbnRlcnZhbDsKKworCW9oY2ktPmRpc2FibGVkID0gMTsKKworCS8qIFRlbGwgdGhlIGNvbnRyb2xsZXIgd2hlcmUgdGhlIGNvbnRyb2wgYW5kIGJ1bGsgbGlzdHMgYXJlCisJICogVGhlIGxpc3RzIGFyZSBlbXB0eSBub3cuICovCisKKwl3cml0ZWwgKDAsICZvaGNpLT5yZWdzLT5lZF9jb250cm9saGVhZCk7CisJd3JpdGVsICgwLCAmb2hjaS0+cmVncy0+ZWRfYnVsa2hlYWQpOworCisJd3JpdGVsICgoX191MzIpb2hjaS0+aGNjYSwgJm9oY2ktPnJlZ3MtPmhjY2EpOyAvKiBhIHJlc2V0IGNsZWFycyB0aGlzICovCisKKwlmbWludGVydmFsID0gMHgyZWRmOworCXdyaXRlbCAoKGZtaW50ZXJ2YWwgKiA5KSAvIDEwLCAmb2hjaS0+cmVncy0+cGVyaW9kaWNzdGFydCk7CisJZm1pbnRlcnZhbCB8PSAoKCgoZm1pbnRlcnZhbCAtIDIxMCkgKiA2KSAvIDcpIDw8IDE2KTsKKwl3cml0ZWwgKGZtaW50ZXJ2YWwsICZvaGNpLT5yZWdzLT5mbWludGVydmFsKTsKKwl3cml0ZWwgKDB4NjI4LCAmb2hjaS0+cmVncy0+bHN0aHJlc2gpOworCisJLyogc3RhcnQgY29udHJvbGxlciBvcGVyYXRpb25zICovCisJb2hjaS0+aGNfY29udHJvbCA9IE9IQ0lfQ09OVFJPTF9JTklUIHwgT0hDSV9VU0JfT1BFUjsKKwlvaGNpLT5kaXNhYmxlZCA9IDA7CisJd3JpdGVsIChvaGNpLT5oY19jb250cm9sLCAmb2hjaS0+cmVncy0+Y29udHJvbCk7CisKKwkvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJbWFzayA9IChPSENJX0lOVFJfU08gfCBPSENJX0lOVFJfV0RIIHwgT0hDSV9JTlRSX1NGIHwgT0hDSV9JTlRSX1JEIHwKKwkJCU9IQ0lfSU5UUl9VRSB8IE9IQ0lfSU5UUl9GTk8gfCBPSENJX0lOVFJfUkhTQyB8CisJCQlPSENJX0lOVFJfT0MgfCBPSENJX0lOVFJfTUlFKTsKKwl3cml0ZWwgKG1hc2ssICZvaGNpLT5yZWdzLT5pbnRyZGlzYWJsZSk7CisJLyogY2xlYXIgYWxsIGludGVycnVwdHMgKi8KKwltYXNrICY9IH5PSENJX0lOVFJfTUlFOworCXdyaXRlbCAobWFzaywgJm9oY2ktPnJlZ3MtPmludHJzdGF0dXMpOworCS8qIENob29zZSB0aGUgaW50ZXJydXB0cyB3ZSBjYXJlIGFib3V0IG5vdyAgLSBidXQgdy9vIE1JRSAqLworCW1hc2sgPSBPSENJX0lOVFJfUkhTQyB8IE9IQ0lfSU5UUl9VRSB8IE9IQ0lfSU5UUl9XREggfCBPSENJX0lOVFJfU087CisJd3JpdGVsIChtYXNrLCAmb2hjaS0+cmVncy0+aW50cmVuYWJsZSk7CisKKyNpZmRlZglPSENJX1VTRV9OUFMKKwkvKiByZXF1aXJlZCBmb3IgQU1ELTc1NiBhbmQgc29tZSBNYWMgcGxhdGZvcm1zICovCisJd3JpdGVsICgocm9vdGh1Yl9hIChvaGNpKSB8IFJIX0FfTlBTKSAmIH5SSF9BX1BTTSwKKwkJJm9oY2ktPnJlZ3MtPnJvb3RodWIuYSk7CisJd3JpdGVsIChSSF9IU19MUFNDLCAmb2hjaS0+cmVncy0+cm9vdGh1Yi5zdGF0dXMpOworI2VuZGlmCS8qIE9IQ0lfVVNFX05QUyAqLworCisjZGVmaW5lIG1kZWxheShuKSAoe3Vuc2lnbmVkIGxvbmcgbXNlYz0obik7IHdoaWxlIChtc2VjLS0pIHVkZWxheSgxMDAwKTt9KQorCS8qIFBPVFBHVCBkZWxheSBpcyBiaXRzIDI0LTMxLCBpbiAyIG1zIHVuaXRzLiAqLworCW1kZWxheSAoKHJvb3RodWJfYSAob2hjaSkgPj4gMjMpICYgMHgxZmUpOworCisJLyogY29ubmVjdCB0aGUgdmlydHVhbCByb290IGh1YiAqLworCW9oY2ktPnJoLmRldm51bSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogUG9sbCBVU0IgaW50ZXJydXB0LiAqLwordm9pZCB1c2JfZXZlbnRfcG9sbCh2b2lkKQoreworCWhjX2ludGVycnVwdCgpOworfQorCisvKiBhbiBpbnRlcnJ1cHQgaGFwcGVucyAqLworCitzdGF0aWMgaW50IGhjX2ludGVycnVwdCAodm9pZCkKK3sKKwlvaGNpX3QgKm9oY2kgPSAmZ29oY2k7CisJc3RydWN0IG9oY2lfcmVncyAqcmVncyA9IG9oY2ktPnJlZ3M7CisJaW50IGludHM7CisJaW50IHN0YXQgPSAtMTsKKworCWlmICgob2hjaS0+aGNjYS0+ZG9uZV9oZWFkICE9IDApICYmCisJICAgICEobTMyX3N3YXAgKG9oY2ktPmhjY2EtPmRvbmVfaGVhZCkgJiAweDAxKSkgeworCQlpbnRzID0gIE9IQ0lfSU5UUl9XREg7CisJfSBlbHNlIGlmICgoaW50cyA9IHJlYWRsICgmcmVncy0+aW50cnN0YXR1cykpID09IH4odTMyKTApIHsKKwkJb2hjaS0+ZGlzYWJsZWQrKzsKKwkJZXJyICgiJXMgZGV2aWNlIHJlbW92ZWQhIiwgb2hjaS0+c2xvdF9uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0gZWxzZSBpZiAoKGludHMgJj0gcmVhZGwgKCZyZWdzLT5pbnRyZW5hYmxlKSkgPT0gMCkgeworCQlkYmcoImhjX2ludGVycnVwdDogcmV0dXJuaW5nLi5cbiIpOworCQlyZXR1cm4gMHhmZjsKKwl9CisKKwkvKiBkYmcoIkludGVycnVwdDogJXggZnJhbWU6ICV4IiwgaW50cywgbGUxNl90b19jcHUgKG9oY2ktPmhjY2EtPmZyYW1lX25vKSk7ICovCisKKwlpZiAoaW50cyAmIE9IQ0lfSU5UUl9SSFNDKSB7CisJCWdvdF9yaHNjID0gMTsKKwkJc3RhdCA9IDB4ZmY7CisJfQorCisJaWYgKGludHMgJiBPSENJX0lOVFJfVUUpIHsKKwkJb2hjaS0+ZGlzYWJsZWQrKzsKKwkJZXJyICgiT0hDSSBVbnJlY292ZXJhYmxlIEVycm9yLCBjb250cm9sbGVyIHVzYi0lcyBkaXNhYmxlZCIsCisJCQlvaGNpLT5zbG90X25hbWUpOworCQkvKiBlLmcuIGR1ZSB0byBQQ0kgTWFzdGVyL1RhcmdldCBBYm9ydCAqLworCisjaWZkZWYJREVCVUcKKwkJb2hjaV9kdW1wIChvaGNpLCAxKTsKKyNlbHNlCisJd2FpdF9tcygxKTsKKyNlbmRpZgorCQkvKiBGSVhNRTogYmUgb3B0aW1pc3RpYywgaG9wZSB0aGF0IGJ1ZyB3b24ndCByZXBlYXQgb2Z0ZW4uICovCisJCS8qIE1ha2Ugc29tZSBub24taW50ZXJydXB0IGNvbnRleHQgcmVzdGFydCB0aGUgY29udHJvbGxlci4gKi8KKwkJLyogQ291bnQgYW5kIGxpbWl0IHRoZSByZXRyaWVzIHRob3VnaDsgZWl0aGVyIGhhcmR3YXJlIG9yICovCisJCS8qIHNvZnR3YXJlIGVycm9ycyBjYW4gZ28gZm9yZXZlci4uLiAqLworCQloY19yZXNldCAob2hjaSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoaW50cyAmIE9IQ0lfSU5UUl9XREgpIHsKKwkJd2FpdF9tcygxKTsKKwkJd3JpdGVsIChPSENJX0lOVFJfV0RILCAmcmVncy0+aW50cmRpc2FibGUpOworCQkodm9pZClyZWFkbCAoJnJlZ3MtPmludHJkaXNhYmxlKTsgLyogZmx1c2ggKi8KKwkJc3RhdCA9IGRsX2RvbmVfbGlzdCAoJmdvaGNpLCBkbF9yZXZlcnNlX2RvbmVfbGlzdCAoJmdvaGNpKSk7CisJCXdyaXRlbCAoT0hDSV9JTlRSX1dESCwgJnJlZ3MtPmludHJlbmFibGUpOworCQkodm9pZClyZWFkbCAoJnJlZ3MtPmludHJkaXNhYmxlKTsgLyogZmx1c2ggKi8KKwl9CisKKwlpZiAoaW50cyAmIE9IQ0lfSU5UUl9TTykgeworCQlkYmcoIlVTQiBTY2hlZHVsZSBvdmVycnVuXG4iKTsKKwkJd3JpdGVsIChPSENJX0lOVFJfU08sICZyZWdzLT5pbnRyZW5hYmxlKTsKKwkJc3RhdCA9IC0xOworCX0KKworCS8qIEZJWE1FOiAgdGhpcyBhc3N1bWVzIFNPRiAoMS9tcykgaW50ZXJydXB0cyBkb24ndCBnZXQgbG9zdC4uLiAqLworCWlmIChpbnRzICYgT0hDSV9JTlRSX1NGKSB7CisJCXVuc2lnbmVkIGludCBmcmFtZSA9IG0xNl9zd2FwIChvaGNpLT5oY2NhLT5mcmFtZV9ubykgJiAxOworCQl3YWl0X21zKDEpOworCQl3cml0ZWwgKE9IQ0lfSU5UUl9TRiwgJnJlZ3MtPmludHJkaXNhYmxlKTsKKwkJaWYgKG9oY2ktPmVkX3JtX2xpc3RbZnJhbWVdICE9IE5VTEwpCisJCQl3cml0ZWwgKE9IQ0lfSU5UUl9TRiwgJnJlZ3MtPmludHJlbmFibGUpOworCQlzdGF0ID0gMHhmZjsKKwl9CisKKwl3cml0ZWwgKGludHMsICZyZWdzLT5pbnRyc3RhdHVzKTsKKwlyZXR1cm4gc3RhdDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRGUtYWxsb2NhdGUgYWxsIHJlc291cmNlcy4uICovCisKK3N0YXRpYyB2b2lkIGhjX3JlbGVhc2Vfb2hjaSAob2hjaV90ICpvaGNpKQoreworCWRiZyAoIlVTQiBIQyByZWxlYXNlIG9oY2kgdXNiLSVzIiwgb2hjaS0+c2xvdF9uYW1lKTsKKworCWlmICghb2hjaS0+ZGlzYWJsZWQpCisJCWhjX3Jlc2V0IChvaGNpKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIGxvdyBsZXZlbCBpbml0YWxpc2F0aW9uIHJvdXRpbmUsIGNhbGxlZCBmcm9tIHVzYi5jCisgKi8KK3N0YXRpYyBjaGFyIG9oY2lfaW5pdGVkID0gMDsKKworaW50IHVzYl9sb3dsZXZlbF9pbml0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1BDSV9PSENJCisJcGNpX2Rldl90IHBkZXY7CisjZW5kaWYKKworI2lmZGVmIENGR19VU0JfT0hDSV9DUFVfSU5JVAorCS8qIGNwdSBkZXBlbmRhbnQgaW5pdCAqLworCWlmKHVzYl9jcHVfaW5pdCgpKQorCQlyZXR1cm4gLTE7CisjZW5kaWYKKworI2lmZGVmIENGR19VU0JfT0hDSV9CT0FSRF9JTklUCisJLyogIGJvYXJkIGRlcGVuZGFudCBpbml0ICovCisJaWYodXNiX2JvYXJkX2luaXQoKSkKKwkJcmV0dXJuIC0xOworI2VuZGlmCisJbWVtc2V0ICgmZ29oY2ksIDAsIHNpemVvZiAob2hjaV90KSk7CisKKwkvKiBhbGlnbiB0aGUgc3RvcmFnZSAqLworCWlmICgoX191MzIpJmdoY2NhWzBdICYgMHhmZikgeworCQllcnIoIkhDQ0Egbm90IGFsaWduZWQhISIpOworCQlyZXR1cm4gLTE7CisJfQorCXBoY2NhID0gJmdoY2NhWzBdOworCWluZm8oImFsaWduZWQgZ2hjY2EgJXAiLCBwaGNjYSk7CisJbWVtc2V0KCZvaGNpX2RldiwgMCwgc2l6ZW9mKHN0cnVjdCBvaGNpX2RldmljZSkpOworCWlmICgoX191MzIpJm9oY2lfZGV2LmVkWzBdICYgMHg3KSB7CisJCWVycigiRURzIG5vdCBhbGlnbmVkISEiKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1zZXQoZ3RkLCAwLCBzaXplb2YodGRfdCkgKiAoTlVNX1REICsgMSkpOworCWlmICgoX191MzIpZ3RkICYgMHg3KSB7CisJCWVycigiVERzIG5vdCBhbGlnbmVkISEiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwdGQgPSBndGQ7CisJZ29oY2kuaGNjYSA9IHBoY2NhOworCW1lbXNldCAocGhjY2EsIDAsIHNpemVvZiAoc3RydWN0IG9oY2lfaGNjYSkpOworCisJZ29oY2kuZGlzYWJsZWQgPSAxOworCWdvaGNpLnNsZWVwaW5nID0gMDsKKwlnb2hjaS5pcnEgPSAtMTsKKyNpZmRlZiBDT05GSUdfUENJX09IQ0kKKwlwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlcyhvaGNpX3BjaV9pZHMsIDApOworCisJaWYgKHBkZXYgIT0gLTEpIHsKKwkJdTE2IHZpZCwgZGlkOworCQl1MzIgYmFzZTsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX1ZFTkRPUl9JRCwgJnZpZCk7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9ERVZJQ0VfSUQsICZkaWQpOworCQlwcmludGYoIk9IQ0kgcGNpIGNvbnRyb2xsZXIgKCUwNHgsICUwNHgpIGZvdW5kIEAoJWQ6JWQ6JWQpXG4iLAorCQkJCXZpZCwgZGlkLCAocGRldiA+PiAxNikgJiAweGZmLAorCQkJCShwZGV2ID4+IDExKSAmIDB4MWYsIChwZGV2ID4+IDgpICYgMHg3KTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCwgJmJhc2UpOworCQlwcmludGYoIk9IQ0kgcmVncyBhZGRyZXNzIDB4JTA4eFxuIiwgYmFzZSk7CisJCWdvaGNpLnJlZ3MgPSAoc3RydWN0IG9oY2lfcmVncyAqKWJhc2U7CisJfSBlbHNlCisJCXJldHVybiAtMTsKKyNlbHNlCisJZ29oY2kucmVncyA9IChzdHJ1Y3Qgb2hjaV9yZWdzICopQ0ZHX1VTQl9PSENJX1JFR1NfQkFTRTsKKyNlbmRpZgorCisJZ29oY2kuZmxhZ3MgPSAwOworCWdvaGNpLnNsb3RfbmFtZSA9IENGR19VU0JfT0hDSV9TTE9UX05BTUU7CisKKwlpZiAoaGNfcmVzZXQgKCZnb2hjaSkgPCAwKSB7CisJCWhjX3JlbGVhc2Vfb2hjaSAoJmdvaGNpKTsKKwkJZXJyICgiY2FuJ3QgcmVzZXQgdXNiLSVzIiwgZ29oY2kuc2xvdF9uYW1lKTsKKyNpZmRlZiBDRkdfVVNCX09IQ0lfQk9BUkRfSU5JVAorCQkvKiBib2FyZCBkZXBlbmRhbnQgY2xlYW51cCAqLworCQl1c2JfYm9hcmRfaW5pdF9mYWlsKCk7CisjZW5kaWYKKworI2lmZGVmIENGR19VU0JfT0hDSV9DUFVfSU5JVAorCQkvKiBjcHUgZGVwZW5kYW50IGNsZWFudXAgKi8KKwkJdXNiX2NwdV9pbml0X2ZhaWwoKTsKKyNlbmRpZgorCQlyZXR1cm4gLTE7CisJfQorCisJLyogRklYTUUgdGhpcyBpcyBhIHNlY29uZCBIQyByZXNldDsgd2h5Pz8gKi8KKwkvKiB3cml0ZWwoZ29oY2kuaGNfY29udHJvbCA9IE9IQ0lfVVNCX1JFU0VULCAmZ29oY2kucmVncy0+Y29udHJvbCk7CisJICAgd2FpdF9tcygxMCk7ICovCisJaWYgKGhjX3N0YXJ0ICgmZ29oY2kpIDwgMCkgeworCQllcnIgKCJjYW4ndCBzdGFydCB1c2ItJXMiLCBnb2hjaS5zbG90X25hbWUpOworCQloY19yZWxlYXNlX29oY2kgKCZnb2hjaSk7CisJCS8qIEluaXRpYWxpemF0aW9uIGZhaWxlZCAqLworI2lmZGVmIENGR19VU0JfT0hDSV9CT0FSRF9JTklUCisJCS8qIGJvYXJkIGRlcGVuZGFudCBjbGVhbnVwICovCisJCXVzYl9ib2FyZF9zdG9wKCk7CisjZW5kaWYKKworI2lmZGVmIENGR19VU0JfT0hDSV9DUFVfSU5JVAorCQkvKiBjcHUgZGVwZW5kYW50IGNsZWFudXAgKi8KKwkJdXNiX2NwdV9zdG9wKCk7CisjZW5kaWYKKwkJcmV0dXJuIC0xOworCX0KKworI2lmZGVmCURFQlVHCisJb2hjaV9kdW1wICgmZ29oY2ksIDEpOworI2Vsc2UKKwl3YWl0X21zKDEpOworI2VuZGlmCisJb2hjaV9pbml0ZWQgPSAxOworCXJldHVybiAwOworfQorCitpbnQgdXNiX2xvd2xldmVsX3N0b3Aodm9pZCkKK3sKKwkvKiB0aGlzIGdldHMgY2FsbGVkIHJlYWxseSBlYXJseSAtIGJlZm9yZSB0aGUgY29udHJvbGxlciBoYXMgKi8KKwkvKiBldmVuIGJlZW4gaW5pdGlhbGl6ZWQhICovCisJaWYgKCFvaGNpX2luaXRlZCkKKwkJcmV0dXJuIDA7CisJLyogVE9ETyByZWxlYXNlIGFueSBpbnRlcnJ1cHRzLCBldGMuICovCisJLyogY2FsbCBoY19yZWxlYXNlX29oY2koKSBoZXJlID8gKi8KKwloY19yZXNldCAoJmdvaGNpKTsKKworI2lmZGVmIENGR19VU0JfT0hDSV9CT0FSRF9JTklUCisJLyogYm9hcmQgZGVwZW5kYW50IGNsZWFudXAgKi8KKwlpZih1c2JfYm9hcmRfc3RvcCgpKQorCQlyZXR1cm4gLTE7CisjZW5kaWYKKworI2lmZGVmIENGR19VU0JfT0hDSV9DUFVfSU5JVAorCS8qIGNwdSBkZXBlbmRhbnQgY2xlYW51cCAqLworCWlmKHVzYl9jcHVfc3RvcCgpKQorCQlyZXR1cm4gLTE7CisjZW5kaWYKKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19VU0JfT0hDSV9ORVcgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiX29oY2kuaCBiL2RyaXZlcnMvdXNiX29oY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODBjYjRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2Jfb2hjaS5oCkBAIC0wLDAgKzEsNDQ1IEBACisvKgorICogVVJCIE9IQ0kgSENEIChIb3N0IENvbnRyb2xsZXIgRHJpdmVyKSBmb3IgVVNCLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMTk5OSBSb21hbiBXZWlzc2dhZXJiZXIgPHdlaXNzZ0B2aWVubmEuYXQ+CisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMSBEYXZpZCBCcm93bmVsbCA8ZGJyb3duZWxsQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiB1c2Itb2hjaS5oCisgKi8KKworLyogZnVuY3Rpb25zIGZvciBkb2luZyBib2FyZCBvciBDUFUgc3BlY2lmaWMgc2V0dXAvY2xlYW51cCAqLworZXh0ZXJuIGludCB1c2JfYm9hcmRfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgdXNiX2JvYXJkX3N0b3Aodm9pZCk7CitleHRlcm4gaW50IHVzYl9ib2FyZF9pbml0X2ZhaWwodm9pZCk7CisKK2V4dGVybiBpbnQgdXNiX2NwdV9pbml0KHZvaWQpOworZXh0ZXJuIGludCB1c2JfY3B1X3N0b3Aodm9pZCk7CitleHRlcm4gaW50IHVzYl9jcHVfaW5pdF9mYWlsKHZvaWQpOworCisKK3N0YXRpYyBpbnQgY2NfdG9fZXJyb3JbMTZdID0geworCisvKiBtYXBwaW5nIG9mIHRoZSBPSENJIENDIHN0YXR1cyB0byBlcnJvciBjb2RlcyAqLworCS8qIE5vICBFcnJvciAgKi8JICAgICAgIDAsCisJLyogQ1JDIEVycm9yICAqLwkgICAgICAgVVNCX1NUX0NSQ19FUlIsCisJLyogQml0IFN0dWZmICAqLwkgICAgICAgVVNCX1NUX0JJVF9FUlIsCisJLyogRGF0YSBUb2dnICAqLwkgICAgICAgVVNCX1NUX0NSQ19FUlIsCisJLyogU3RhbGwgICAgICAqLwkgICAgICAgVVNCX1NUX1NUQUxMRUQsCisJLyogRGV2Tm90UmVzcCAqLwkgICAgICAgLTEsCisJLyogUElEQ2hlY2sgICAqLwkgICAgICAgVVNCX1NUX0JJVF9FUlIsCisJLyogVW5FeHBQSUQgICAqLwkgICAgICAgVVNCX1NUX0JJVF9FUlIsCisJLyogRGF0YU92ZXIgICAqLwkgICAgICAgVVNCX1NUX0JVRl9FUlIsCisJLyogRGF0YVVuZGVyICAqLwkgICAgICAgVVNCX1NUX0JVRl9FUlIsCisJLyogcmVzZXJ2ZCAgICAqLwkgICAgICAgLTEsCisJLyogcmVzZXJ2ZCAgICAqLwkgICAgICAgLTEsCisJLyogQnVmZmVyT3ZlciAqLwkgICAgICAgVVNCX1NUX0JVRl9FUlIsCisJLyogQnVmZlVuZGVyICAqLwkgICAgICAgVVNCX1NUX0JVRl9FUlIsCisJLyogTm90IEFjY2VzcyAqLwkgICAgICAgLTEsCisJLyogTm90IEFjY2VzcyAqLwkgICAgICAgLTEKK307CisKKy8qIEVEIFN0YXRlcyAqLworCisjZGVmaW5lIEVEX05FVwkJMHgwMAorI2RlZmluZSBFRF9VTkxJTksJMHgwMQorI2RlZmluZSBFRF9PUEVSCQkweDAyCisjZGVmaW5lIEVEX0RFTAkJMHgwNAorI2RlZmluZSBFRF9VUkJfREVMCTB4MDgKKworLyogdXNiX29oY2lfZWQgKi8KK3N0cnVjdCBlZCB7CisJX191MzIgaHdJTkZPOworCV9fdTMyIGh3VGFpbFA7CisJX191MzIgaHdIZWFkUDsKKwlfX3UzMiBod05leHRFRDsKKworCXN0cnVjdCBlZCAqZWRfcHJldjsKKwlfX3U4IGludF9wZXJpb2Q7CisJX191OCBpbnRfYnJhbmNoOworCV9fdTggaW50X2xvYWQ7CisJX191OCBpbnRfaW50ZXJ2YWw7CisJX191OCBzdGF0ZTsKKwlfX3U4IHR5cGU7CisJX191MTYgbGFzdF9pc287CisJc3RydWN0IGVkICplZF9ybV9saXN0OworCisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXY7CisJdm9pZCAqcHVyYjsKKwlfX3UzMiB1bnVzZWRbMl07Cit9IF9fYXR0cmlidXRlKChhbGlnbmVkKDE2KSkpOwordHlwZWRlZiBzdHJ1Y3QgZWQgZWRfdDsKKworCisvKiBURCBpbmZvIGZpZWxkICovCisjZGVmaW5lIFREX0NDCSAgICAweGYwMDAwMDAwCisjZGVmaW5lIFREX0NDX0dFVCh0ZF9wKSAoKHRkX3AgPj4yOCkgJiAweDBmKQorI2RlZmluZSBURF9DQ19TRVQodGRfcCwgY2MpICh0ZF9wKSA9ICgodGRfcCkgJiAweDBmZmZmZmZmKSB8ICgoKGNjKSAmIDB4MGYpIDw8IDI4KQorI2RlZmluZSBURF9FQwkgICAgMHgwQzAwMDAwMAorI2RlZmluZSBURF9UCSAgICAweDAzMDAwMDAwCisjZGVmaW5lIFREX1RfREFUQTAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgVERfVF9EQVRBMSAgMHgwMzAwMDAwMAorI2RlZmluZSBURF9UX1RPR0dMRSAweDAwMDAwMDAwCisjZGVmaW5lIFREX1IJICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgVERfREkJICAgIDB4MDBFMDAwMDAKKyNkZWZpbmUgVERfRElfU0VUKFgpICgoKFgpICYgMHgwNyk8PCAyMSkKKyNkZWZpbmUgVERfRFAJICAgIDB4MDAxODAwMDAKKyNkZWZpbmUgVERfRFBfU0VUVVAgMHgwMDAwMDAwMAorI2RlZmluZSBURF9EUF9JTiAgICAweDAwMTAwMDAwCisjZGVmaW5lIFREX0RQX09VVCAgIDB4MDAwODAwMDAKKworI2RlZmluZSBURF9JU08JICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgVERfREVMCSAgICAweDAwMDIwMDAwCisKKy8qIENDIENvZGVzICovCisjZGVmaW5lIFREX0NDX05PRVJST1IJICAgMHgwMAorI2RlZmluZSBURF9DQ19DUkMJICAgMHgwMQorI2RlZmluZSBURF9DQ19CSVRTVFVGRklORyAgMHgwMgorI2RlZmluZSBURF9DQ19EQVRBVE9HR0xFTSAgMHgwMworI2RlZmluZSBURF9DQ19TVEFMTAkgICAweDA0CisjZGVmaW5lIFREX0RFVk5PVFJFU1AJICAgMHgwNQorI2RlZmluZSBURF9QSURDSEVDS0ZBSUwJICAgMHgwNgorI2RlZmluZSBURF9VTkVYUEVDVEVEUElEICAgMHgwNworI2RlZmluZSBURF9EQVRBT1ZFUlJVTgkgICAweDA4CisjZGVmaW5lIFREX0RBVEFVTkRFUlJVTgkgICAweDA5CisjZGVmaW5lIFREX0JVRkZFUk9WRVJSVU4gICAweDBDCisjZGVmaW5lIFREX0JVRkZFUlVOREVSUlVOICAweDBECisjZGVmaW5lIFREX05PVEFDQ0VTU0VECSAgIDB4MEYKKworCisjZGVmaW5lIE1BWFBTVyAxCisKK3N0cnVjdCB0ZCB7CisJX191MzIgaHdJTkZPOworCV9fdTMyIGh3Q0JQOwkJLyogQ3VycmVudCBCdWZmZXIgUG9pbnRlciAqLworCV9fdTMyIGh3TmV4dFREOwkJLyogTmV4dCBURCBQb2ludGVyICovCisJX191MzIgaHdCRTsJCS8qIE1lbW9yeSBCdWZmZXIgRW5kIFBvaW50ZXIgKi8KKworLyogI2lmbmRlZiBDT05GSUdfTVBDNTIwMCAvXCogdGhpcyBzZWVtcyB3cm9uZyAqXC8gKi8KKwlfX3UxNiBod1BTV1tNQVhQU1ddOworLyogI2VuZGlmICovCisJX191OCB1bnVzZWQ7CisJX191OCBpbmRleDsKKwlzdHJ1Y3QgZWQgKmVkOworCXN0cnVjdCB0ZCAqbmV4dF9kbF90ZDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldjsKKwlpbnQgdHJhbnNmZXJfbGVuOworCV9fdTMyIGRhdGE7CisKKwlfX3UzMiB1bnVzZWQyWzJdOworfSBfX2F0dHJpYnV0ZSgoYWxpZ25lZCgzMikpKTsKK3R5cGVkZWYgc3RydWN0IHRkIHRkX3Q7CisKKyNkZWZpbmUgT0hDSV9FRF9TS0lQCSgxIDw8IDE0KQorCisvKgorICogVGhlIEhDQ0EgKEhvc3QgQ29udHJvbGxlciBDb21tdW5pY2F0aW9ucyBBcmVhKSBpcyBhIDI1NiBieXRlCisgKiBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGUgT0hDSSBzcGVjLiB0aGF0IHRoZSBob3N0IGNvbnRyb2xsZXIgaXMKKyAqIHRvbGQgdGhlIGJhc2UgYWRkcmVzcyBvZi4gIEl0IG11c3QgYmUgMjU2LWJ5dGUgYWxpZ25lZC4KKyAqLworCisjZGVmaW5lIE5VTV9JTlRTIDMyCS8qIHBhcnQgb2YgdGhlIE9IQ0kgc3RhbmRhcmQgKi8KK3N0cnVjdCBvaGNpX2hjY2EgeworCV9fdTMyCWludF90YWJsZVtOVU1fSU5UU107CS8qIEludGVycnVwdCBFRCB0YWJsZSAqLworI2lmIGRlZmluZWQoQ09ORklHX01QQzUyMDApCisJX191MTYJcGFkMTsJCQkvKiBzZXQgdG8gMCBvbiBlYWNoIGZyYW1lX25vIGNoYW5nZSAqLworCV9fdTE2CWZyYW1lX25vOwkJLyogY3VycmVudCBmcmFtZSBudW1iZXIgKi8KKyNlbHNlCisJX191MTYJZnJhbWVfbm87CQkvKiBjdXJyZW50IGZyYW1lIG51bWJlciAqLworCV9fdTE2CXBhZDE7CQkJLyogc2V0IHRvIDAgb24gZWFjaCBmcmFtZV9ubyBjaGFuZ2UgKi8KKyNlbmRpZgorCV9fdTMyCWRvbmVfaGVhZDsJCS8qIGluZm8gcmV0dXJuZWQgZm9yIGFuIGludGVycnVwdCAqLworCXU4CQlyZXNlcnZlZF9mb3JfaGNbMTE2XTsKK30gX19hdHRyaWJ1dGUoKGFsaWduZWQoMjU2KSkpOworCisKKy8qCisgKiBNYXhpbXVtIG51bWJlciBvZiByb290IGh1YiBwb3J0cy4KKyAqLworI2lmbmRlZiBDRkdfVVNCX09IQ0lfTUFYX1JPT1RfUE9SVFMKKyMgZXJyb3IgIkNGR19VU0JfT0hDSV9NQVhfUk9PVF9QT1JUUyB1bmRlZmluZWQhIgorI2VuZGlmCisKKy8qCisgKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIE9IQ0kgY29udHJvbGxlcidzIG1lbW9yeSBtYXBwZWQgSS9PCisgKiByZWdpb24uICBUaGlzIGlzIE1lbW9yeSBNYXBwZWQgSS9PLglZb3UgbXVzdCB1c2UgdGhlIHJlYWRsKCkgYW5kCisgKiB3cml0ZWwoKSBtYWNyb3MgZGVmaW5lZCBpbiBhc20vaW8uaCB0byBhY2Nlc3MgdGhlc2UhIQorICovCitzdHJ1Y3Qgb2hjaV9yZWdzIHsKKwkvKiBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXJzICovCisJX191MzIJcmV2aXNpb247CisJX191MzIJY29udHJvbDsKKwlfX3UzMgljbWRzdGF0dXM7CisJX191MzIJaW50cnN0YXR1czsKKwlfX3UzMglpbnRyZW5hYmxlOworCV9fdTMyCWludHJkaXNhYmxlOworCS8qIG1lbW9yeSBwb2ludGVycyAqLworCV9fdTMyCWhjY2E7CisJX191MzIJZWRfcGVyaW9kY3VycmVudDsKKwlfX3UzMgllZF9jb250cm9saGVhZDsKKwlfX3UzMgllZF9jb250cm9sY3VycmVudDsKKwlfX3UzMgllZF9idWxraGVhZDsKKwlfX3UzMgllZF9idWxrY3VycmVudDsKKwlfX3UzMglkb25laGVhZDsKKwkvKiBmcmFtZSBjb3VudGVycyAqLworCV9fdTMyCWZtaW50ZXJ2YWw7CisJX191MzIJZm1yZW1haW5pbmc7CisJX191MzIJZm1udW1iZXI7CisJX191MzIJcGVyaW9kaWNzdGFydDsKKwlfX3UzMglsc3RocmVzaDsKKwkvKiBSb290IGh1YiBwb3J0cyAqLworCXN0cnVjdAlvaGNpX3Jvb3RodWJfcmVncyB7CisJCV9fdTMyCWE7CisJCV9fdTMyCWI7CisJCV9fdTMyCXN0YXR1czsKKwkJX191MzIJcG9ydHN0YXR1c1tDRkdfVVNCX09IQ0lfTUFYX1JPT1RfUE9SVFNdOworCX0gcm9vdGh1YjsKK30gX19hdHRyaWJ1dGUoKGFsaWduZWQoMzIpKSk7CisKKworLyogT0hDSSBDT05UUk9MIEFORCBTVEFUVVMgUkVHSVNURVIgTUFTS1MgKi8KKworLyoKKyAqIEhjQ29udHJvbCAoY29udHJvbCkgcmVnaXN0ZXIgbWFza3MKKyAqLworI2RlZmluZSBPSENJX0NUUkxfQ0JTUgkoMyA8PCAwKQkvKiBjb250cm9sL2J1bGsgc2VydmljZSByYXRpbyAqLworI2RlZmluZSBPSENJX0NUUkxfUExFCSgxIDw8IDIpCS8qIHBlcmlvZGljIGxpc3QgZW5hYmxlICovCisjZGVmaW5lIE9IQ0lfQ1RSTF9JRQkoMSA8PCAzKQkvKiBpc29jaHJvbm91cyBlbmFibGUgKi8KKyNkZWZpbmUgT0hDSV9DVFJMX0NMRQkoMSA8PCA0KQkvKiBjb250cm9sIGxpc3QgZW5hYmxlICovCisjZGVmaW5lIE9IQ0lfQ1RSTF9CTEUJKDEgPDwgNSkJLyogYnVsayBsaXN0IGVuYWJsZSAqLworI2RlZmluZSBPSENJX0NUUkxfSENGUwkoMyA8PCA2KQkvKiBob3N0IGNvbnRyb2xsZXIgZnVuY3Rpb25hbCBzdGF0ZSAqLworI2RlZmluZSBPSENJX0NUUkxfSVIJKDEgPDwgOCkJLyogaW50ZXJydXB0IHJvdXRpbmcgKi8KKyNkZWZpbmUgT0hDSV9DVFJMX1JXQwkoMSA8PCA5KQkvKiByZW1vdGUgd2FrZXVwIGNvbm5lY3RlZCAqLworI2RlZmluZSBPSENJX0NUUkxfUldFCSgxIDw8IDEwKQkvKiByZW1vdGUgd2FrZXVwIGVuYWJsZSAqLworCisvKiBwcmUtc2hpZnRlZCB2YWx1ZXMgZm9yIEhDRlMgKi8KKyMJZGVmaW5lIE9IQ0lfVVNCX1JFU0VUCSgwIDw8IDYpCisjCWRlZmluZSBPSENJX1VTQl9SRVNVTUUJKDEgPDwgNikKKyMJZGVmaW5lIE9IQ0lfVVNCX09QRVIJKDIgPDwgNikKKyMJZGVmaW5lIE9IQ0lfVVNCX1NVU1BFTkQgKDMgPDwgNikKKworLyoKKyAqIEhjQ29tbWFuZFN0YXR1cyAoY21kc3RhdHVzKSByZWdpc3RlciBtYXNrcworICovCisjZGVmaW5lIE9IQ0lfSENSCSgxIDw8IDApCS8qIGhvc3QgY29udHJvbGxlciByZXNldCAqLworI2RlZmluZSBPSENJX0NMRgkoMSA8PCAxKQkvKiBjb250cm9sIGxpc3QgZmlsbGVkICovCisjZGVmaW5lIE9IQ0lfQkxGCSgxIDw8IDIpCS8qIGJ1bGsgbGlzdCBmaWxsZWQgKi8KKyNkZWZpbmUgT0hDSV9PQ1IJKDEgPDwgMykJLyogb3duZXJzaGlwIGNoYW5nZSByZXF1ZXN0ICovCisjZGVmaW5lIE9IQ0lfU09DCSgzIDw8IDE2KQkvKiBzY2hlZHVsaW5nIG92ZXJydW4gY291bnQgKi8KKworLyoKKyAqIG1hc2tzIHVzZWQgd2l0aCBpbnRlcnJ1cHQgcmVnaXN0ZXJzOgorICogSGNJbnRlcnJ1cHRTdGF0dXMgKGludHJzdGF0dXMpCisgKiBIY0ludGVycnVwdEVuYWJsZSAoaW50cmVuYWJsZSkKKyAqIEhjSW50ZXJydXB0RGlzYWJsZSAoaW50cmRpc2FibGUpCisgKi8KKyNkZWZpbmUgT0hDSV9JTlRSX1NPCSgxIDw8IDApCS8qIHNjaGVkdWxpbmcgb3ZlcnJ1biAqLworI2RlZmluZSBPSENJX0lOVFJfV0RICSgxIDw8IDEpCS8qIHdyaXRlYmFjayBvZiBkb25lX2hlYWQgKi8KKyNkZWZpbmUgT0hDSV9JTlRSX1NGCSgxIDw8IDIpCS8qIHN0YXJ0IGZyYW1lICovCisjZGVmaW5lIE9IQ0lfSU5UUl9SRAkoMSA8PCAzKQkvKiByZXN1bWUgZGV0ZWN0ICovCisjZGVmaW5lIE9IQ0lfSU5UUl9VRQkoMSA8PCA0KQkvKiB1bnJlY292ZXJhYmxlIGVycm9yICovCisjZGVmaW5lIE9IQ0lfSU5UUl9GTk8JKDEgPDwgNSkJLyogZnJhbWUgbnVtYmVyIG92ZXJmbG93ICovCisjZGVmaW5lIE9IQ0lfSU5UUl9SSFNDCSgxIDw8IDYpCS8qIHJvb3QgaHViIHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUgT0hDSV9JTlRSX09DCSgxIDw8IDMwKQkvKiBvd25lcnNoaXAgY2hhbmdlICovCisjZGVmaW5lIE9IQ0lfSU5UUl9NSUUJKDEgPDwgMzEpCS8qIG1hc3RlciBpbnRlcnJ1cHQgZW5hYmxlICovCisKKworLyogVmlydHVhbCBSb290IEhVQiAqLworc3RydWN0IHZpcnRfcm9vdF9odWIgeworCWludCBkZXZudW07IC8qIEFkZHJlc3Mgb2YgUm9vdCBIdWIgZW5kcG9pbnQgKi8KKwl2b2lkICpkZXY7ICAvKiB3YXMgdXJiICovCisJdm9pZCAqaW50X2FkZHI7CisJaW50IHNlbmQ7CisJaW50IGludGVydmFsOworfTsKKworLyogVVNCIEhVQiBDT05TVEFOVFMgKG5vdCBPSENJLXNwZWNpZmljOyBzZWUgaHViLmgpICovCisKKy8qIGRlc3RpbmF0aW9uIG9mIHJlcXVlc3QgKi8KKyNkZWZpbmUgUkhfSU5URVJGQUNFCQkgICAweDAxCisjZGVmaW5lIFJIX0VORFBPSU5UCQkgICAweDAyCisjZGVmaW5lIFJIX09USEVSCQkgICAweDAzCisKKyNkZWZpbmUgUkhfQ0xBU1MJCSAgIDB4MjAKKyNkZWZpbmUgUkhfVkVORE9SCQkgICAweDQwCisKKy8qIFJlcXVlc3RzOiBiUmVxdWVzdCA8PCA4IHwgYm1SZXF1ZXN0VHlwZSAqLworI2RlZmluZSBSSF9HRVRfU1RBVFVTCQkweDAwODAKKyNkZWZpbmUgUkhfQ0xFQVJfRkVBVFVSRQkweDAxMDAKKyNkZWZpbmUgUkhfU0VUX0ZFQVRVUkUJCTB4MDMwMAorI2RlZmluZSBSSF9TRVRfQUREUkVTUwkJMHgwNTAwCisjZGVmaW5lIFJIX0dFVF9ERVNDUklQVE9SCTB4MDY4MAorI2RlZmluZSBSSF9TRVRfREVTQ1JJUFRPUgkweDA3MDAKKyNkZWZpbmUgUkhfR0VUX0NPTkZJR1VSQVRJT04JMHgwODgwCisjZGVmaW5lIFJIX1NFVF9DT05GSUdVUkFUSU9OCTB4MDkwMAorI2RlZmluZSBSSF9HRVRfU1RBVEUJCTB4MDI4MAorI2RlZmluZSBSSF9HRVRfSU5URVJGQUNFCTB4MEE4MAorI2RlZmluZSBSSF9TRVRfSU5URVJGQUNFCTB4MEIwMAorI2RlZmluZSBSSF9TWU5DX0ZSQU1FCQkweDBDODAKKy8qIE91ciBWZW5kb3IgU3BlY2lmaWMgUmVxdWVzdCAqLworI2RlZmluZSBSSF9TRVRfRVAJCTB4MjAwMAorCisKKy8qIEh1YiBwb3J0IGZlYXR1cmVzICovCisjZGVmaW5lIFJIX1BPUlRfQ09OTkVDVElPTgkgICAweDAwCisjZGVmaW5lIFJIX1BPUlRfRU5BQkxFCQkgICAweDAxCisjZGVmaW5lIFJIX1BPUlRfU1VTUEVORAkJICAgMHgwMgorI2RlZmluZSBSSF9QT1JUX09WRVJfQ1VSUkVOVAkgICAweDAzCisjZGVmaW5lIFJIX1BPUlRfUkVTRVQJCSAgIDB4MDQKKyNkZWZpbmUgUkhfUE9SVF9QT1dFUgkJICAgMHgwOAorI2RlZmluZSBSSF9QT1JUX0xPV19TUEVFRAkgICAweDA5CisKKyNkZWZpbmUgUkhfQ19QT1JUX0NPTk5FQ1RJT04JICAgMHgxMAorI2RlZmluZSBSSF9DX1BPUlRfRU5BQkxFCSAgIDB4MTEKKyNkZWZpbmUgUkhfQ19QT1JUX1NVU1BFTkQJICAgMHgxMgorI2RlZmluZSBSSF9DX1BPUlRfT1ZFUl9DVVJSRU5UCSAgIDB4MTMKKyNkZWZpbmUgUkhfQ19QT1JUX1JFU0VUCQkgICAweDE0CisKKy8qIEh1YiBmZWF0dXJlcyAqLworI2RlZmluZSBSSF9DX0hVQl9MT0NBTF9QT1dFUgkgICAweDAwCisjZGVmaW5lIFJIX0NfSFVCX09WRVJfQ1VSUkVOVAkgICAweDAxCisKKyNkZWZpbmUgUkhfREVWSUNFX1JFTU9URV9XQUtFVVAJICAgMHgwMAorI2RlZmluZSBSSF9FTkRQT0lOVF9TVEFMTAkgICAweDAxCisKKyNkZWZpbmUgUkhfQUNLCQkJICAgMHgwMQorI2RlZmluZSBSSF9SRVFfRVJSCQkgICAtMQorI2RlZmluZSBSSF9OQUNLCQkJICAgMHgwMAorCisKKy8qIE9IQ0kgUk9PVCBIVUIgUkVHSVNURVIgTUFTS1MgKi8KKworLyogcm9vdGh1Yi5wb3J0c3RhdHVzIFtpXSBiaXRzICovCisjZGVmaW5lIFJIX1BTX0NDUwkgICAgIDB4MDAwMDAwMDEJCS8qIGN1cnJlbnQgY29ubmVjdCBzdGF0dXMgKi8KKyNkZWZpbmUgUkhfUFNfUEVTCSAgICAgMHgwMDAwMDAwMgkJLyogcG9ydCBlbmFibGUgc3RhdHVzKi8KKyNkZWZpbmUgUkhfUFNfUFNTCSAgICAgMHgwMDAwMDAwNAkJLyogcG9ydCBzdXNwZW5kIHN0YXR1cyAqLworI2RlZmluZSBSSF9QU19QT0NJCSAgICAgMHgwMDAwMDAwOAkJLyogcG9ydCBvdmVyIGN1cnJlbnQgaW5kaWNhdG9yICovCisjZGVmaW5lIFJIX1BTX1BSUwkgICAgIDB4MDAwMDAwMTAJCS8qIHBvcnQgcmVzZXQgc3RhdHVzICovCisjZGVmaW5lIFJIX1BTX1BQUwkgICAgIDB4MDAwMDAxMDAJCS8qIHBvcnQgcG93ZXIgc3RhdHVzICovCisjZGVmaW5lIFJIX1BTX0xTREEJICAgICAweDAwMDAwMjAwCQkvKiBsb3cgc3BlZWQgZGV2aWNlIGF0dGFjaGVkICovCisjZGVmaW5lIFJIX1BTX0NTQwkgICAgIDB4MDAwMTAwMDAJCS8qIGNvbm5lY3Qgc3RhdHVzIGNoYW5nZSAqLworI2RlZmluZSBSSF9QU19QRVNDCSAgICAgMHgwMDAyMDAwMAkJLyogcG9ydCBlbmFibGUgc3RhdHVzIGNoYW5nZSAqLworI2RlZmluZSBSSF9QU19QU1NDCSAgICAgMHgwMDA0MDAwMAkJLyogcG9ydCBzdXNwZW5kIHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUgUkhfUFNfT0NJQwkgICAgIDB4MDAwODAwMDAJCS8qIG92ZXIgY3VycmVudCBpbmRpY2F0b3IgY2hhbmdlICovCisjZGVmaW5lIFJIX1BTX1BSU0MJICAgICAweDAwMTAwMDAwCQkvKiBwb3J0IHJlc2V0IHN0YXR1cyBjaGFuZ2UgKi8KKworLyogcm9vdGh1Yi5zdGF0dXMgYml0cyAqLworI2RlZmluZSBSSF9IU19MUFMJICAgICAweDAwMDAwMDAxCQkvKiBsb2NhbCBwb3dlciBzdGF0dXMgKi8KKyNkZWZpbmUgUkhfSFNfT0NJCSAgICAgMHgwMDAwMDAwMgkJLyogb3ZlciBjdXJyZW50IGluZGljYXRvciAqLworI2RlZmluZSBSSF9IU19EUldFCSAgICAgMHgwMDAwODAwMAkJLyogZGV2aWNlIHJlbW90ZSB3YWtldXAgZW5hYmxlICovCisjZGVmaW5lIFJIX0hTX0xQU0MJICAgICAweDAwMDEwMDAwCQkvKiBsb2NhbCBwb3dlciBzdGF0dXMgY2hhbmdlICovCisjZGVmaW5lIFJIX0hTX09DSUMJICAgICAweDAwMDIwMDAwCQkvKiBvdmVyIGN1cnJlbnQgaW5kaWNhdG9yIGNoYW5nZSAqLworI2RlZmluZSBSSF9IU19DUldFCSAgICAgMHg4MDAwMDAwMAkJLyogY2xlYXIgcmVtb3RlIHdha2V1cCBlbmFibGUgKi8KKworLyogcm9vdGh1Yi5iIG1hc2tzICovCisjZGVmaW5lIFJIX0JfRFIJCTB4MDAwMGZmZmYJCS8qIGRldmljZSByZW1vdmFibGUgZmxhZ3MgKi8KKyNkZWZpbmUgUkhfQl9QUENNCTB4ZmZmZjAwMDAJCS8qIHBvcnQgcG93ZXIgY29udHJvbCBtYXNrICovCisKKy8qIHJvb3RodWIuYSBtYXNrcyAqLworI2RlZmluZSBSSF9BX05EUAkoMHhmZiA8PCAwKQkJLyogbnVtYmVyIG9mIGRvd25zdHJlYW0gcG9ydHMgKi8KKyNkZWZpbmUgUkhfQV9QU00JKDEgPDwgOCkJCS8qIHBvd2VyIHN3aXRjaGluZyBtb2RlICovCisjZGVmaW5lIFJIX0FfTlBTCSgxIDw8IDkpCQkvKiBubyBwb3dlciBzd2l0Y2hpbmcgKi8KKyNkZWZpbmUgUkhfQV9EVAkJKDEgPDwgMTApCQkvKiBkZXZpY2UgdHlwZSAobWJ6KSAqLworI2RlZmluZSBSSF9BX09DUE0JKDEgPDwgMTEpCQkvKiBvdmVyIGN1cnJlbnQgcHJvdGVjdGlvbiBtb2RlICovCisjZGVmaW5lIFJIX0FfTk9DUAkoMSA8PCAxMikJCS8qIG5vIG92ZXIgY3VycmVudCBwcm90ZWN0aW9uICovCisjZGVmaW5lIFJIX0FfUE9UUEdUCSgweGZmIDw8IDI0KQkJLyogcG93ZXIgb24gdG8gcG93ZXIgZ29vZCB0aW1lICovCisKKy8qIHVyYiAqLworI2RlZmluZSBOX1VSQl9URCA0OAordHlwZWRlZiBzdHJ1Y3QKK3sKKwllZF90ICplZDsKKwlfX3UxNiBsZW5ndGg7CS8qIG51bWJlciBvZiB0ZHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVxdWVzdCAqLworCV9fdTE2IHRkX2NudDsJLyogbnVtYmVyIG9mIHRkcyBhbHJlYWR5IHNlcnZpY2VkICovCisJc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKKwlpbnQgICBzdGF0ZTsKKwl1bnNpZ25lZCBsb25nIHBpcGU7CisJdm9pZCAqdHJhbnNmZXJfYnVmZmVyOworCWludCB0cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOworCWludCBpbnRlcnZhbDsKKwlpbnQgYWN0dWFsX2xlbmd0aDsKKwlpbnQgZmluaXNoZWQ7CisJdGRfdCAqdGRbTl9VUkJfVERdOwkvKiBsaXN0IHBvaW50ZXIgdG8gYWxsIGNvcnJlc3BvbmRpbmcgVERzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QgKi8KK30gdXJiX3ByaXZfdDsKKyNkZWZpbmUgVVJCX0RFTCAxCisKKy8qCisgKiBUaGlzIGlzIHRoZSBmdWxsIG9oY2kgY29udHJvbGxlciBkZXNjcmlwdGlvbgorICoKKyAqIE5vdGUgaG93IHRoZSAicHJvcGVyIiBVU0IgaW5mb3JtYXRpb24gaXMganVzdAorICogYSBzdWJzZXQgb2Ygd2hhdCB0aGUgZnVsbCBpbXBsZW1lbnRhdGlvbiBuZWVkcy4gKExpbnVzKQorICovCisKKwordHlwZWRlZiBzdHJ1Y3Qgb2hjaSB7CisJc3RydWN0IG9oY2lfaGNjYSAqaGNjYTsJCS8qIGhjY2EgKi8KKwkvKmRtYV9hZGRyX3QgaGNjYV9kbWE7Ki8KKworCWludCBpcnE7CisJaW50IGRpc2FibGVkOwkJCS8qIGUuZy4gZ290IGEgVUUsIHdlJ3JlIGh1bmcgKi8KKwlpbnQgc2xlZXBpbmc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsJCS8qIGZvciBIQyBidWdzICovCisKKwlzdHJ1Y3Qgb2hjaV9yZWdzICpyZWdzOyAvKiBPSENJIGNvbnRyb2xsZXIncyBtZW1vcnkgKi8KKworCWludCBvaGNpX2ludF9sb2FkWzMyXTsJIC8qIGxvYWQgb2YgdGhlIDMyIEludGVycnVwdCBDaGFpbnMgKGZvciBsb2FkIGJhbGFuY2luZykqLworCWVkX3QgKmVkX3JtX2xpc3RbMl07CSAvKiBsaXN0cyBvZiBhbGwgZW5kcG9pbnRzIHRvIGJlIHJlbW92ZWQgKi8KKwllZF90ICplZF9idWxrdGFpbDsJIC8qIGxhc3QgZW5kcG9pbnQgb2YgYnVsayBsaXN0ICovCisJZWRfdCAqZWRfY29udHJvbHRhaWw7CSAvKiBsYXN0IGVuZHBvaW50IG9mIGNvbnRyb2wgbGlzdCAqLworCWludCBpbnRyc3RhdHVzOworCV9fdTMyIGhjX2NvbnRyb2w7CQkvKiBjb3B5IG9mIHRoZSBoYyBjb250cm9sIHJlZyAqLworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXZbMzJdOworCXN0cnVjdCB2aXJ0X3Jvb3RfaHViIHJoOworCisJY29uc3QgY2hhcgkqc2xvdF9uYW1lOworfSBvaGNpX3Q7CisKKyNkZWZpbmUgTlVNX0VEUyA4CQkvKiBudW0gb2YgcHJlYWxsb2NhdGVkIGVuZHBvaW50IGRlc2NyaXB0b3JzICovCisKK3N0cnVjdCBvaGNpX2RldmljZSB7CisJZWRfdAllZFtOVU1fRURTXTsKKwlpbnQgZWRfY250OworfTsKKworLyogaGNkICovCisvKiBlbmRwb2ludCAqLworc3RhdGljIGludCBlcF9saW5rKG9oY2lfdCAqIG9oY2ksIGVkX3QgKiBlZCk7CitzdGF0aWMgaW50IGVwX3VubGluayhvaGNpX3QgKiBvaGNpLCBlZF90ICogZWQpOworc3RhdGljIGVkX3QgKiBlcF9hZGRfZWQoc3RydWN0IHVzYl9kZXZpY2UgKiB1c2JfZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsCisJCWludCBpbnRlcnZhbCwgaW50IGxvYWQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiB3ZSBuZWVkIG1vcmUgVERzIHRoYW4gRURzICovCisjZGVmaW5lIE5VTV9URCA2NAorCisvKiArMSBzbyB3ZSBjYW4gYWxpZ24gdGhlIHN0b3JhZ2UgKi8KK3RkX3QgZ3RkW05VTV9URCsxXTsKKy8qIHBvaW50ZXJzIHRvIGFsaWduZWQgc3RvcmFnZSAqLwordGRfdCAqcHRkOworCisvKiBURHMgLi4uICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0ZCAqCit0ZF9hbGxvYyAoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYpCit7CisJaW50IGk7CisJc3RydWN0IHRkCSp0ZDsKKworCXRkID0gTlVMTDsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1REOyBpKyspCisJeworCQlpZiAocHRkW2ldLnVzYl9kZXYgPT0gTlVMTCkKKwkJeworCQkJdGQgPSAmcHRkW2ldOworCQkJdGQtPnVzYl9kZXYgPSB1c2JfZGV2OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gdGQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZWRfZnJlZSAoc3RydWN0IGVkICplZCkKK3sKKwllZC0+dXNiX2RldiA9IE5VTEw7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYmRjb3JlX2VwMC5jIGIvZHJpdmVycy91c2JkY29yZV9lcDAuYwppbmRleCAyNjBiZWZlLi4xZTQ0ZjMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYmRjb3JlX2VwMC5jCisrKyBiL2RyaXZlcnMvdXNiZGNvcmVfZXAwLmMKQEAgLTIsNiArMiw5IEBACiAgKiAoQykgQ29weXJpZ2h0IDIwMDMKICAqIEdlcnJ5IEhhbWVsLCBnZWhAdGkuY29tLCBUZXhhcyBJbnN0cnVtZW50cwogICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogQnJ5YW4gTydEb25vZ2h1ZSwgZGVja2FyZEBDb2RlSGVybWl0LmllCisgKgogICogQmFzZWQgb24KICAqIGxpbnV4L2RyaXZlcnMvdXNiZC9lcDAuYwogICoKQEAgLTM5LDExICs0MiwxNyBAQAogICogZnVuY3Rpb24gZHJpdmVyLiBUaGlzIG1heSBuZWVkIHRvIGNoYW5nZS4KICAqCiAgKiBYWFgKKyAqCisgKiBBcyBhbGx1ZGVkIHRvIGFib3ZlLCBhIHNpbXBsZSBjYWxsYmFjayBjZGNfcmVjdl9zZXR1cCBoYXMgYmVlbiBpbXBsZW1lbnRlZAorICogaW4gdGhlIHVzYl9kZXZpY2UgZGF0YSBzdHJ1Y3R1cmUgdG8gZmFjaWxpY2F0ZSBwYXNzaW5nCisgKiBDb21tb24gRGV2aWNlIENsYXNzIHBhY2tldHMgdG8gYSBmdW5jdGlvbiBkcml2ZXIuCisgKgorICogWFhYCiAgKi8KIAogI2luY2x1ZGUgPGNvbW1vbi5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfT01BUDE1MTApICYmIGRlZmluZWQoQ09ORklHX1VTQl9ERVZJQ0UpCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX0RFVklDRSkKICNpbmNsdWRlICJ1c2JkY29yZS5oIgogCiAjaWYgMApAQCAtNjksNyArNzgsNyBAQAogCWNoYXIgKmNwOwogCiAJdXJiLT5hY3R1YWxfbGVuZ3RoID0gMjsKLQljcCA9IHVyYi0+YnVmZmVyOworCWNwID0gKGNoYXIqKXVyYi0+YnVmZmVyOwogCWNwWzBdID0gY3BbMV0gPSAwOwogCiAJc3dpdGNoIChyZXF1ZXN0dHlwZSkgewpAQCAtMTE1LDcgKzEyNCw3IEBACiAgKgogICogQ29weSBjb25maWd1cmF0aW9uIGRhdGEgdG8gdXJiIHRyYW5zZmVyIGJ1ZmZlciBpZiB0aGVyZSBpcyByb29tIGZvciBpdC4KICAqLwotc3RhdGljIHZvaWQgY29weV9jb25maWcgKHN0cnVjdCB1cmIgKnVyYiwgdm9pZCAqZGF0YSwgaW50IG1heF9sZW5ndGgsCit2b2lkIGNvcHlfY29uZmlnIChzdHJ1Y3QgdXJiICp1cmIsIHZvaWQgKmRhdGEsIGludCBtYXhfbGVuZ3RoLAogCQkJIGludCBtYXhfYnVmKQogewogCWludCBhdmFpbGFibGU7CkBAIC0xMjgsMTAgKzEzNyw3IEBACiAJCWRiZ19lcDAgKDEsICJkYXRhIGlzIE5VTEwiKTsKIAkJcmV0dXJuOwogCX0KLQlpZiAoIShsZW5ndGggPSAqKHVuc2lnbmVkIGNoYXIgKikgZGF0YSkpIHsKLQkJZGJnX2VwMCAoMSwgImxlbmd0aCBpcyB6ZXJvIik7Ci0JCXJldHVybjsKLQl9CisJbGVuZ3RoID0gbWF4X2xlbmd0aDsKIAogCWlmIChsZW5ndGggPiBtYXhfbGVuZ3RoKSB7CiAJCWRiZ19lcDAgKDEsICJsZW5ndGg6ICVkID49IG1heF9sZW5ndGg6ICVkIiwgbGVuZ3RoLApAQCAtMTkyLDcgKzE5OCw3IEBACiAKIAkvKiBzZXR1cCB0eCB1cmIgKi8KIAl1cmItPmFjdHVhbF9sZW5ndGggPSAwOwotCWNwID0gdXJiLT5idWZmZXI7CisJY3AgPSAoY2hhciopdXJiLT5idWZmZXI7CiAKIAlkYmdfZXAwICgyLCAiJXMiLCBVU0JEX0RFVklDRV9ERVNDUklQVE9SUyAoZGVzY3JpcHRvcl90eXBlKSk7CiAKQEAgLTIwMCw3ICsyMDYsNiBAQAogCWNhc2UgVVNCX0RFU0NSSVBUT1JfVFlQRV9ERVZJQ0U6CiAJCXsKIAkJCXN0cnVjdCB1c2JfZGV2aWNlX2Rlc2NyaXB0b3IgKmRldmljZV9kZXNjcmlwdG9yOwotCiAJCQlpZiAoIQogCQkJICAgIChkZXZpY2VfZGVzY3JpcHRvciA9CiAJCQkgICAgIHVzYmRfZGV2aWNlX2RldmljZV9kZXNjcmlwdG9yIChkZXZpY2UsIHBvcnQpKSkgewpAQCAtMjE0LDIwICsyMTksMTYgQEAKIAkJCS8qIGNvcnJlY3QgdGhlIGNvcnJlY3QgY29udHJvbCBlbmRwb2ludCAwIG1heCBwYWNrZXQgc2l6ZSBpbnRvIHRoZSBkZXNjcmlwdG9yICovCiAJCQlkZXZpY2VfZGVzY3JpcHRvciA9CiAJCQkJKHN0cnVjdCB1c2JfZGV2aWNlX2Rlc2NyaXB0b3IgKikgdXJiLT5idWZmZXI7Ci0JCQlkZXZpY2VfZGVzY3JpcHRvci0+Yk1heFBhY2tldFNpemUwID0KLQkJCQl1cmItPmRldmljZS0+YnVzLT5tYXhwYWNrZXRzaXplOwogCiAJCX0KLQkJLypkYmdfZXAwKDMsICJjb3BpZWQgZGV2aWNlIGNvbmZpZ3VyYXRpb24sIGFjdHVhbF9sZW5ndGg6ICV4IiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsgKi8KKwkJZGJnX2VwMCgzLCAiY29waWVkIGRldmljZSBjb25maWd1cmF0aW9uLCBhY3R1YWxfbGVuZ3RoOiAweCV4IiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkJYnJlYWs7CiAKIAljYXNlIFVTQl9ERVNDUklQVE9SX1RZUEVfQ09ORklHVVJBVElPTjoKIAkJewotCQkJaW50IGJOdW1JbnRlcmZhY2U7CiAJCQlzdHJ1Y3QgdXNiX2NvbmZpZ3VyYXRpb25fZGVzY3JpcHRvcgogCQkJCSpjb25maWd1cmF0aW9uX2Rlc2NyaXB0b3I7CiAJCQlzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yICpkZXZpY2VfZGVzY3JpcHRvcjsKLQogCQkJaWYgKCEKIAkJCSAgICAoZGV2aWNlX2Rlc2NyaXB0b3IgPQogCQkJICAgICB1c2JkX2RldmljZV9kZXZpY2VfZGVzY3JpcHRvciAoZGV2aWNlLCBwb3J0KSkpIHsKQEAgLTI1MSwxMzAgKzI1MiwzNSBAQAogCQkJCQkgaW5kZXgpOwogCQkJCXJldHVybiAtMTsKIAkJCX0KKwkJCWRiZ19lcDAoMCwgImF0dGVtcHQgdG8gY29weSAlZCBieXRlcyB0byB1cmJcbiIsY3B1X3RvX2xlMTYoY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yLT53VG90YWxMZW5ndGgpKTsKIAkJCWNvcHlfY29uZmlnICh1cmIsIGNvbmZpZ3VyYXRpb25fZGVzY3JpcHRvciwKLQkJCQkgICAgIHNpemVvZiAoc3RydWN0Ci0JCQkJCSAgICAgdXNiX2NvbmZpZ3VyYXRpb25fZGVzY3JpcHRvciksCisKKwkJCQkJY3B1X3RvX2xlMTYoY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yLT53VG90YWxMZW5ndGgpLAogCQkJCSAgICAgbWF4KTsKLQotCi0JCQkvKiBpdGVyYXRlIGFjcm9zcyBpbnRlcmZhY2VzIGZvciBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiAqLwotCQkJZGJnX2VwMCAoMCwgImJOdW1JbnRlcmZhY2VzOiAlZCIsCi0JCQkJIGNvbmZpZ3VyYXRpb25fZGVzY3JpcHRvci0+Yk51bUludGVyZmFjZXMpOwotCQkJZm9yIChiTnVtSW50ZXJmYWNlID0gMDsKLQkJCSAgICAgYk51bUludGVyZmFjZSA8Ci0JCQkgICAgIGNvbmZpZ3VyYXRpb25fZGVzY3JpcHRvci0+Yk51bUludGVyZmFjZXM7Ci0JCQkgICAgIGJOdW1JbnRlcmZhY2UrKykgewotCi0JCQkJaW50IGJBbHRlcm5hdGVTZXR0aW5nOwotCQkJCXN0cnVjdCB1c2JfaW50ZXJmYWNlX2luc3RhbmNlCi0JCQkJCSppbnRlcmZhY2VfaW5zdGFuY2U7Ci0KLQkJCQlkYmdfZXAwICgzLCAiWyVkXSBiTnVtSW50ZXJmYWNlczogJWQiLAotCQkJCQkgYk51bUludGVyZmFjZSwKLQkJCQkJIGNvbmZpZ3VyYXRpb25fZGVzY3JpcHRvci0+Yk51bUludGVyZmFjZXMpOwotCi0JCQkJaWYgKCEgKGludGVyZmFjZV9pbnN0YW5jZSA9IHVzYmRfZGV2aWNlX2ludGVyZmFjZV9pbnN0YW5jZSAoZGV2aWNlLAotCQkJCQkJCQkgICAgIHBvcnQsIGluZGV4LCBiTnVtSW50ZXJmYWNlKSkpCi0JCQkJewotCQkJCQlkYmdfZXAwICgzLCAiWyVkXSBpbnRlcmZhY2VfaW5zdGFuY2UgTlVMTCIsCi0JCQkJCQkgYk51bUludGVyZmFjZSk7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQkJLyogaXRlcmF0ZSBhY3Jvc3MgaW50ZXJmYWNlIGFsdGVybmF0ZXMgKi8KLQkJCQlmb3IgKGJBbHRlcm5hdGVTZXR0aW5nID0gMDsKLQkJCQkgICAgIGJBbHRlcm5hdGVTZXR0aW5nIDwgaW50ZXJmYWNlX2luc3RhbmNlLT5hbHRlcm5hdGVzOwotCQkJCSAgICAgYkFsdGVybmF0ZVNldHRpbmcrKykgewotCQkJCQkvKmludCBjbGFzczsgKi8KLQkJCQkJaW50IGJOdW1FbmRwb2ludDsKLQkJCQkJc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqaW50ZXJmYWNlX2Rlc2NyaXB0b3I7Ci0KLQkJCQkJc3RydWN0IHVzYl9hbHRlcm5hdGVfaW5zdGFuY2UgKmFsdGVybmF0ZV9pbnN0YW5jZTsKLQotCQkJCQlkYmdfZXAwICgzLCAiWyVkOiVkXSBhbHRlcm5hdGVzOiAlZCIsCi0JCQkJCQkgYk51bUludGVyZmFjZSwKLQkJCQkJCSBiQWx0ZXJuYXRlU2V0dGluZywKLQkJCQkJCSBpbnRlcmZhY2VfaW5zdGFuY2UtPmFsdGVybmF0ZXMpOwotCi0JCQkJCWlmICghIChhbHRlcm5hdGVfaW5zdGFuY2UgPSB1c2JkX2RldmljZV9hbHRlcm5hdGVfaW5zdGFuY2UgKGRldmljZSwgcG9ydCwgaW5kZXgsIGJOdW1JbnRlcmZhY2UsIGJBbHRlcm5hdGVTZXR0aW5nKSkpIHsKLQkJCQkJCWRiZ19lcDAgKDMsICJbJWRdIGFsdGVybmF0ZV9pbnN0YW5jZSBOVUxMIiwKLQkJCQkJCQkgYk51bUludGVyZmFjZSk7Ci0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCX0KLQkJCQkJLyogY29weSBkZXNjcmlwdG9yIGZvciB0aGlzIGludGVyZmFjZSAqLwotCQkJCQljb3B5X2NvbmZpZyAodXJiLCBhbHRlcm5hdGVfaW5zdGFuY2UtPmludGVyZmFjZV9kZXNjcmlwdG9yLAotCQkJCQkJICAgICBzaXplb2YgKHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IpLAotCQkJCQkJICAgICBtYXgpOwotCi0JCQkJCS8qZGJnX2VwMCgzLCAiWyVkOiVkXSBjbGFzc2VzOiAlZCBlbmRwb2ludHM6ICVkIiwgYk51bUludGVyZmFjZSwgYkFsdGVybmF0ZVNldHRpbmcsICovCi0JCQkJCS8qICAgICAgICBhbHRlcm5hdGVfaW5zdGFuY2UtPmNsYXNzZXMsIGFsdGVybmF0ZV9pbnN0YW5jZS0+ZW5kcG9pbnRzKTsgKi8KLQotCQkJCQkvKiBpdGVyYXRlIGFjcm9zcyBjbGFzc2VzIGZvciB0aGlzIGFsdGVybmF0ZSBpbnRlcmZhY2UgKi8KLSNpZiAwCi0JCQkJCWZvciAoY2xhc3MgPSAwOwotCQkJCQkgICAgIGNsYXNzIDwgYWx0ZXJuYXRlX2luc3RhbmNlLT5jbGFzc2VzOwotCQkJCQkgICAgIGNsYXNzKyspIHsKLQkJCQkJCXN0cnVjdCB1c2JfY2xhc3NfZGVzY3JpcHRvciAqY2xhc3NfZGVzY3JpcHRvcjsKLQkJCQkJCS8qZGJnX2VwMCgzLCAiWyVkOiVkOiVkXSBjbGFzc2VzOiAlZCIsIGJOdW1JbnRlcmZhY2UsIGJBbHRlcm5hdGVTZXR0aW5nLCAqLwotCQkJCQkJLyogICAgICAgIGNsYXNzLCBhbHRlcm5hdGVfaW5zdGFuY2UtPmNsYXNzZXMpOyAqLwotCQkJCQkJaWYgKCEoY2xhc3NfZGVzY3JpcHRvciA9IHVzYmRfZGV2aWNlX2NsYXNzX2Rlc2NyaXB0b3JfaW5kZXggKGRldmljZSwgcG9ydCwgaW5kZXgsIGJOdW1JbnRlcmZhY2UsIGJBbHRlcm5hdGVTZXR0aW5nLCBjbGFzcykpKSB7Ci0JCQkJCQkJZGJnX2VwMCAoMywgIlslZF0gY2xhc3MgTlVMTCIsCi0JCQkJCQkJCSBjbGFzcyk7Ci0JCQkJCQkJcmV0dXJuIC0xOwotCQkJCQkJfQotCQkJCQkJLyogY29weSBkZXNjcmlwdG9yIGZvciB0aGlzIGNsYXNzICovCi0JCQkJCQljb3B5X2NvbmZpZyAodXJiLCBjbGFzc19kZXNjcmlwdG9yLAotCQkJCQkJCXNpemVvZiAoc3RydWN0IHVzYl9jbGFzc19kZXNjcmlwdG9yKSwKLQkJCQkJCQltYXgpOwotCQkJCQl9Ci0jZW5kaWYKLQotCQkJCQkvKiBpdGVyYXRlIGFjcm9zcyBlbmRwb2ludHMgZm9yIHRoaXMgYWx0ZXJuYXRlIGludGVyZmFjZSAqLwotCQkJCQlpbnRlcmZhY2VfZGVzY3JpcHRvciA9IGFsdGVybmF0ZV9pbnN0YW5jZS0+aW50ZXJmYWNlX2Rlc2NyaXB0b3I7Ci0JCQkJCWZvciAoYk51bUVuZHBvaW50ID0gMDsKLQkJCQkJICAgICBiTnVtRW5kcG9pbnQgPCBhbHRlcm5hdGVfaW5zdGFuY2UtPmVuZHBvaW50czsKLQkJCQkJICAgICBiTnVtRW5kcG9pbnQrKykgewotCQkJCQkJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludF9kZXNjcmlwdG9yOwotCQkJCQkJZGJnX2VwMCAoMywgIlslZDolZDolZF0gZW5kcG9pbnQ6ICVkIiwKLQkJCQkJCQkgYk51bUludGVyZmFjZSwKLQkJCQkJCQkgYkFsdGVybmF0ZVNldHRpbmcsCi0JCQkJCQkJIGJOdW1FbmRwb2ludCwKLQkJCQkJCQkgaW50ZXJmYWNlX2Rlc2NyaXB0b3ItPgotCQkJCQkJCSBiTnVtRW5kcG9pbnRzKTsKLQkJCQkJCWlmICghKGVuZHBvaW50X2Rlc2NyaXB0b3IgPSB1c2JkX2RldmljZV9lbmRwb2ludF9kZXNjcmlwdG9yX2luZGV4IChkZXZpY2UsIHBvcnQsIGluZGV4LCBiTnVtSW50ZXJmYWNlLCBiQWx0ZXJuYXRlU2V0dGluZywgYk51bUVuZHBvaW50KSkpIHsKLQkJCQkJCQlkYmdfZXAwICgzLCAiWyVkXSBlbmRwb2ludCBOVUxMIiwKLQkJCQkJCQkJIGJOdW1FbmRwb2ludCk7Ci0JCQkJCQkJcmV0dXJuIC0xOwotCQkJCQkJfQotCQkJCQkJLyogY29weSBkZXNjcmlwdG9yIGZvciB0aGlzIGVuZHBvaW50ICovCi0JCQkJCQljb3B5X2NvbmZpZyAodXJiLCBlbmRwb2ludF9kZXNjcmlwdG9yLAotCQkJCQkJCSAgICAgc2l6ZW9mIChzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IpLAotCQkJCQkJCSAgICAgbWF4KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWRiZ19lcDAgKDMsICJsZW5ndGhzOiAlZCAlZCIsCi0JCQkJIGxlMTZfdG9fY3B1IChjb25maWd1cmF0aW9uX2Rlc2NyaXB0b3ItPndUb3RhbExlbmd0aCksCi0JCQkJIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJCX0KKwogCQlicmVhazsKIAogCWNhc2UgVVNCX0RFU0NSSVBUT1JfVFlQRV9TVFJJTkc6CiAJCXsKIAkJCXN0cnVjdCB1c2Jfc3RyaW5nX2Rlc2NyaXB0b3IgKnN0cmluZ19kZXNjcmlwdG9yOwotCiAJCQlpZiAoIShzdHJpbmdfZGVzY3JpcHRvciA9IHVzYmRfZ2V0X3N0cmluZyAoaW5kZXgpKSkgeworCQkJCXNlcmlhbF9wcmludGYoIkludmFsaWQgc3RyaW5nIGluZGV4ICVkXG4iLCBpbmRleCk7CiAJCQkJcmV0dXJuIC0xOwogCQkJfQotCQkJLypkYmdfZXAwKDMsICJzdHJpbmdfZGVzY3JpcHRvcjogJXAiLCBzdHJpbmdfZGVzY3JpcHRvcik7ICovCisJCQlkYmdfZXAwKDMsICJzdHJpbmdfZGVzY3JpcHRvcjogJXAgbGVuZ3RoICVkIiwgc3RyaW5nX2Rlc2NyaXB0b3IsIHN0cmluZ19kZXNjcmlwdG9yLT5iTGVuZ3RoKTsKIAkJCWNvcHlfY29uZmlnICh1cmIsIHN0cmluZ19kZXNjcmlwdG9yLCBzdHJpbmdfZGVzY3JpcHRvci0+Ykxlbmd0aCwgbWF4KTsKIAkJfQogCQlicmVhazsKIAljYXNlIFVTQl9ERVNDUklQVE9SX1RZUEVfSU5URVJGQUNFOgorCXNlcmlhbF9wcmludGYoIlVTQl9ERVNDUklQVE9SX1RZUEVfSU5URVJGQUNFIC0gZXJyb3Igbm90IGltcGxlbWVudGVkXG4iKTsKIAkJcmV0dXJuIC0xOwogCWNhc2UgVVNCX0RFU0NSSVBUT1JfVFlQRV9FTkRQT0lOVDoKKwkJc2VyaWFsX3ByaW50ZigiVVNCX0RFU0NSSVBUT1JfVFlQRV9FTkRQT0lOVCAtIGVycm9yIG5vdCBpbXBsZW1lbnRlZFxuIik7CiAJCXJldHVybiAtMTsKIAljYXNlIFVTQl9ERVNDUklQVE9SX1RZUEVfSElEOgogCQl7CisJCQlzZXJpYWxfcHJpbnRmKCJVU0JfREVTQ1JJUFRPUl9UWVBFX0hJRCAtIGVycm9yIG5vdCBpbXBsZW1lbnRlZFxuIik7CiAJCQlyZXR1cm4gLTE7CS8qIHVuc3VwcG9ydGVkIGF0IHRoaXMgdGltZSAqLwogI2lmIDAKIAkJCWludCBiTnVtSW50ZXJmYWNlID0KQEAgLTQwMyw2ICszMDksNyBAQAogCQlicmVhazsKIAljYXNlIFVTQl9ERVNDUklQVE9SX1RZUEVfUkVQT1JUOgogCQl7CisJCQlzZXJpYWxfcHJpbnRmKCJVU0JfREVTQ1JJUFRPUl9UWVBFX1JFUE9SVCAtIGVycm9yIG5vdCBpbXBsZW1lbnRlZFxuIik7CiAJCQlyZXR1cm4gLTE7CS8qIHVuc3VwcG9ydGVkIGF0IHRoaXMgdGltZSAqLwogI2lmIDAKIAkJCWludCBiTnVtSW50ZXJmYWNlID0KQEAgLTQzNCwxMiArMzQxLDE5IEBACiAjZW5kaWYKIAkJfQogCQlicmVhazsKKwljYXNlIFVTQl9ERVNDUklQVE9SX1RZUEVfREVWSUNFX1FVQUxJRklFUjoKKwkJeworCQkJLyogSWYgYSBVU0IgZGV2aWNlIHN1cHBvcnRzIGJvdGggYSBmdWxsIHNwZWVkIGFuZCBsb3cgc3BlZWQgb3BlcmF0aW9uCisJCQkgKiB3ZSBtdXN0IHNlbmQgYSBEZXZpY2VfUXVhbGlmaWVyIGRlc2NyaXB0b3IgaGVyZQorCQkJICovCisJCQlyZXR1cm4gLTE7CisJCX0KIAlkZWZhdWx0OgogCQlyZXR1cm4gLTE7CiAJfQogCiAKLQlkYmdfZXAwICgxLCAidXJiOiBidWZmZXI6ICVwIGJ1ZmZlcl9sZW5ndGg6ICUyZCBhY3R1YWxfbGVuZ3RoOiAlMmQgcGFja2V0IHNpemU6ICUyZCIsCisJZGJnX2VwMCAoMSwgInVyYjogYnVmZmVyOiAlcCBidWZmZXJfbGVuZ3RoOiAlMmQgYWN0dWFsX2xlbmd0aDogJTJkIHR4X3BhY2tldFNpemU6ICUyZCIsCiAJCSB1cmItPmJ1ZmZlciwgdXJiLT5idWZmZXJfbGVuZ3RoLCB1cmItPmFjdHVhbF9sZW5ndGgsCiAJCSBkZXZpY2UtPmJ1cy0+ZW5kcG9pbnRfYXJyYXlbMF0udHhfcGFja2V0U2l6ZSk7CiAvKgpAQCAtNDk1LDYgKzQwOSwxMiBAQAogCiAJLyogaGFuZGxlIFVTQiBTdGFuZGFyZCBSZXF1ZXN0IChjLmYuIFVTQiBTcGVjIHRhYmxlIDktMikgKi8KIAlpZiAoKHJlcXVlc3QtPmJtUmVxdWVzdFR5cGUgJiBVU0JfUkVRX1RZUEVfTUFTSykgIT0gMCkgeworCQlpZihkZXZpY2UtPmRldmljZV9zdGF0ZSA8PSBTVEFURV9DT05GSUdVUkVEKXsKKwkJCS8qCUF0dGVtcHQgdG8gaGFuZGxlIGEgQ0RDIHNwZWNpZmljIHJlcXVlc3QgaWYgd2UgYXJlCisJCQkgKglpbiB0aGUgY29uZmlndXJlZCBzdGF0ZS4KKwkJCSAqLworCQkJcmV0dXJuIGRldmljZS0+Y2RjX3JlY3Zfc2V0dXAocmVxdWVzdCx1cmIpOworCQl9CiAJCWRiZ19lcDAgKDEsICJub24gc3RhbmRhcmQgcmVxdWVzdDogJXgiLAogCQkJIHJlcXVlc3QtPmJtUmVxdWVzdFR5cGUgJiBVU0JfUkVRX1RZUEVfTUFTSyk7CiAJCXJldHVybiAtMTsJLyogU3RhbGwgaGVyZSAqLwpAQCAtNTY3LDYgKzQ4Nyw3IEBACiAJCQkJCQkgICBsZTE2X3RvX2NwdSAocmVxdWVzdC0+d1ZhbHVlKSAmIDB4ZmYpOwogCiAJCWNhc2UgVVNCX1JFUV9HRVRfQ09ORklHVVJBVElPTjoKKwkJCXNlcmlhbF9wcmludGYoImdldCBjb25maWcgJWRcbiIsIGRldmljZS0+Y29uZmlndXJhdGlvbik7CiAJCQlyZXR1cm4gZXAwX2dldF9vbmUgKGRldmljZSwgdXJiLAogCQkJCQkgICAgZGV2aWNlLT5jb25maWd1cmF0aW9uKTsKIApAQCAtNjQyLDcgKzU2Myw2IEBACiAJCQkvKmRiZ19lcDAoMiwgImFkZHJlc3M6ICVkICVkICVkIiwgKi8KIAkJCS8qICAgICAgICByZXF1ZXN0LT53VmFsdWUsIGxlMTZfdG9fY3B1KHJlcXVlc3QtPndWYWx1ZSksIGRldmljZS0+YWRkcmVzcyk7ICovCiAKLQkJCXNlcmlhbF9wcmludGYgKCJERVZJQ0VfQUREUkVTU19BU1NJR05FRC4uIGV2ZW50P1xuIik7CiAJCQlyZXR1cm4gMDsKIAogCQljYXNlIFVTQl9SRVFfU0VUX0RFU0NSSVBUT1I6CS8qIFhYWCBzaG91bGQgd2Ugc3VwcG9ydCB0aGlzPyAqLwpAQCAtNjUzLDkgKzU3MywxMCBAQAogCQkJLyogYy5mLiA5LjQuNyAtIHRoZSB0b3AgaGFsZiBvZiB3VmFsdWUgaXMgcmVzZXJ2ZWQgKi8KIAkJCS8qICovCiAJCQlpZiAoKGRldmljZS0+Y29uZmlndXJhdGlvbiA9Ci0JCQkgICAgIGxlMTZfdG9fY3B1IChyZXF1ZXN0LT53VmFsdWUpICYgMHg3ZikgIT0gMCkgeworCQkJCWxlMTZfdG9fY3B1IChyZXF1ZXN0LT53VmFsdWUpICYgMHhGRjgwKSAhPSAwKSB7CiAJCQkJLyogYy5mLiA5LjQuNyAtIHplcm8gaXMgdGhlIGRlZmF1bHQgb3IgYWRkcmVzc2VkIHN0YXRlLCBpbiBvdXIgY2FzZSB0aGlzICovCiAJCQkJLyogaXMgdGhlIHNhbWUgaXMgY29uZmlndXJhdGlvbiB6ZXJvICovCisJCQkJc2VyaWFsX3ByaW50ZigiZXJyb3Igc2V0dGluZyBkZXYtPmNvbmZpZyB0byB6ZXJvIVxuIik7CiAJCQkJZGV2aWNlLT5jb25maWd1cmF0aW9uID0gMDsJLyogVEJSIC0gPz8/Pz8/ICovCiAJCQl9CiAJCQkvKiByZXNldCBpbnRlcmZhY2UgYW5kIGFsdGVybmF0ZSBzZXR0aW5ncyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2JkY29yZV9tcGM4eHguYyBiL2RyaXZlcnMvdXNiZGNvcmVfbXBjOHh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg3Mjg0YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiZGNvcmVfbXBjOHh4LmMKQEAgLTAsMCArMSwxNDAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IGJ5IEJyeWFuIE8nRG9ub2dodWUsIENvZGVIZXJtaXQKKyAqIGJvZG9ub2dodWVAQ29kZUhlcm1pdC5pZQorICoKKyAqIFJlZmVyZW5jZXMKKyAqIERhc1VCb290L2RyaXZlcnMvdXNiZGNvcmVfb21hcDE1MTAuYywgZm9yIGRlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gaWRlYXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworCisvKgorICogTm90ZXMgOgorICogMS4JI2RlZmluZSBfX1NJTVVMQVRFX0VSUk9SX18gdG8gaW5qZWN0IGEgQ1JDIGVycm9yIGludG8gZXZlcnkgMm5kIFRYCisgKgkJcGFja2V0IHRvIGZvcmNlIHRoZSBVU0IgcmUtdHJhbnNtaXQgcHJvdG9jb2wuCisgKgorICogMi4JI2RlZmluZSBfX0RFQlVHX1VEQ19fIHRvIHN3aXRjaCBvbiBkZWJ1ZyB0cmFjaW5nIHRvIHNlcmlhbCBjb25zb2xlCisgKgliZSBjYXJlZnVsIHRoYXQgdHJhY2luZyBkb2Vzbid0IGNyZWF0ZSBIaWVzZW4tYnVncyB3aXRoIHJlc3BlY3QgdG8KKyAqCXJlc3BvbnNlIHRpbWVvdXRzIHRvIGNvbnRyb2wgcmVxdWVzdHMuCisgKgorICogMy4JVGhpcyBkcml2ZXIgc2hvdWxkIGJlIGFibGUgdG8gc3VwcG9ydCBhbnkgaGlnaGVyIGxldmVsIGRyaXZlciB0aGF0CisgKgl0aGF0IHdhbnRzIHRvIGRvIGVpdGhlciBvZiB0aGUgdHdvIHN0YW5kYXJkIFVEQyBpbXBsZW1lbnRhdGlvbnMKKyAqCUNvbnRyb2wtQnVsay1JbnRlcnJ1cHQgb3IgIEJ1bGstSU4vQnVsay1PdXQgc3RhbmRhcmRzLiBIZW5jZQorICoJZ3NlcmlhbCBhbmQgY2RjX2FjbSBzaG91bGQgd29yayB3aXRoIHRoaXMgY29kZS4KKyAqCisgKiA0LglOQUsgZXZlbnRzIG5ldmVyIGFjdHVhbGx5IGdldCByYWlzZWQgYXQgYWxsLCB0aGUgZG9jdW1lbnRhdGlvbgorICoJaXMganVzdCB3cm9uZyAhCisgKgorICogNS4JRm9yIHNvbWUgcmVhc29uLCBjYmRfZGF0bGVuIGlzICphbHdheXMqICsyIHRoZSB2YWx1ZSBpdCBzaG91bGQgYmUuCisgKgl0aGlzIG1lYW5zIHRoYXQgaGF2aW5nIGFuIFJYIGNiZCBvZiAxNiBieXRlcyBpcyBub3QgcG9zc2libGUsIHNpbmNlCisgKgl0aGUgc2FtZSBzaXplIGlzIHJlcG9ydGVkIGZvciAxNCBieXRlcyByZWNlaXZlZCBhcyAxNiBieXRlcyByZWNlaXZlZAorICoJdW50aWwgd2UgY2FuIGZpbmQgb3V0IHdoeSB0aGlzIGhhcHBlbnMsIFJYIGNiZHMgbXVzdCBiZSBsaW1pdGVkIHRvIDgKKyAqCWJ5dGVzLiBUT0RPOiBjaGVjayBlcnJhdGEgZm9yIHRoaXMgYmVoYXZpb3VyLgorICoKKyAqIDYuCVJpZ2h0IG5vdyB0aGlzIGNvZGUgZG9lc24ndCBzdXBwb3J0IHByb3Blcmx5IHBvd2VyaW5nIHVwIHdpdGggdGhlIFVTQgorICoJY2FibGUgYXR0YWNoZWQgdG8gdGhlIFVTQiBob3N0IG15IGRldmVsb3BtZW50IGJvYXJkIHRoZSBBZGRlcjg3eCBkb2Vzbid0CisgKgloYXZlIGEgcHVsbC11cCBmaXR0ZWQgdG8gYWxsb3cgdGhpcywgc28gaXQgaXMgbmVjZXNzYXJ5IHRvIHBvd2VyIHRoZQorICoJYm9hcmQgYW5kICp0aGVuKiBhdHRhY2hlZCB0aGUgVVNCIGNhYmxlIHRvIHRoZSBob3N0LiBIb3dldmVyIHNvbWVib2R5CisgKgl3aXRoIGEgZGlmZmVyZW50IGRlc2lnbiBpbiB0aGVpciBib2FyZCBtYXkgYmUgYWJsZSB0byBrZWVwIHRoZSBjYWJsZQorICoJY29uc3RhbnRseSBjb25uZWN0ZWQgYW5kIHNpbXBseSBlbmFibGUvZGlzYWJsZSBhIHB1bGwtdXAgIHJlCisgKglmaWd1cmUgMzEuMSBpbiBNUEM4ODVSTS5wZGYgaW5zdGVhZCBvZiBoYXZpbmcgdG8gcG93ZXIgdXAgdGhlIGJvYXJkIGFuZAorICoJdGhlbiBhdHRhY2ggdGhlIGNhYmxlICEKKyAqCisgKi8KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX01QQzg4NV9GQU1JTFkpICYmIGRlZmluZWQoQ09ORklHX1VTQl9ERVZJQ0UpCisjaW5jbHVkZSA8Y29tbXByb2MuaD4KKyNpbmNsdWRlICJ1c2JkY29yZS5oIgorI2luY2x1ZGUgInVzYmRjb3JlX21wYzh4eC5oIgorI2luY2x1ZGUgInVzYmRjb3JlX2VwMC5oIgorCisjZGVmaW5lIEVSUihmbXQsIGFyZ3MuLi4pXAorCXNlcmlhbF9wcmludGYoIkVSUk9SIDogWyVzXSAlczolZDogImZtdCxcCisJCQkJX19GSUxFX18sX19GVU5DVElPTl9fLF9fTElORV9fLCAjI2FyZ3MpCisjaWZkZWYgX19ERUJVR19VRENfXworI2RlZmluZSBEQkcoZm10LGFyZ3MuLi4pXAorCQlzZXJpYWxfcHJpbnRmKCJbJXNdICVzOiVkOiAiZm10LFwKKwkJCQlfX0ZJTEVfXyxfX0ZVTkNUSU9OX18sX19MSU5FX18sICMjYXJncykKKyNlbHNlCisjZGVmaW5lIERCRyhmbXQsYXJncy4uLikKKyNlbmRpZgorCisvKiBTdGF0aWMgRGF0YSAqLworI2lmZGVmIF9fU0lNVUxBVEVfRVJST1JfXworc3RhdGljIGNoYXIgZXJyX3BvaXNvbl90ZXN0ID0gMDsKKyNlbmRpZgorc3RhdGljIHN0cnVjdCBtcGM4eHhfZXAgZXBfcmVmW01BWF9FTkRQT0lOVFNdOworc3RhdGljIHUzMiBhZGRyZXNzX2Jhc2UgPSBTVEFURV9OT1RfUkVBRFk7CitzdGF0aWMgbXBjOHh4X3VkY19zdGF0ZV90IHVkY19zdGF0ZSA9IDA7CitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaW5zdGFuY2UgKnVkY19kZXZpY2UgPSAwOworc3RhdGljIHZvbGF0aWxlIHVzYl9lcGJfdCAqZW5kcG9pbnRzW01BWF9FTkRQT0lOVFNdOworc3RhdGljIHZvbGF0aWxlIGNiZF90ICp0eF9jYmRbVFhfUklOR19TSVpFXTsKK3N0YXRpYyB2b2xhdGlsZSBjYmRfdCAqcnhfY2JkW1JYX1JJTkdfU0laRV07CitzdGF0aWMgdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IDA7CitzdGF0aWMgdm9sYXRpbGUgY3BtOHh4X3QgKmNwID0gMDsKK3N0YXRpYyB2b2xhdGlsZSB1c2JfcHJhbV90ICp1c2JfcGFyYW1wID0gMDsKK3N0YXRpYyB2b2xhdGlsZSB1c2JfdCAqdXNicCA9IDA7CitzdGF0aWMgaW50IHJ4X2N0ID0gMDsKK3N0YXRpYyBpbnQgdHhfY3QgPSAwOworCisvKiBTdGF0aWMgRnVuY3Rpb24gRGVjbGFyYXRpb25zICovCitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX3N0YXRlX3RyYW5zaXRpb25fdXAgKHVzYl9kZXZpY2Vfc3RhdGVfdCBpbml0aWFsLAorCQkJCQkgICAgdXNiX2RldmljZV9zdGF0ZV90IGZpbmFsKTsKK3N0YXRpYyB2b2lkIG1wYzh4eF91ZGNfc3RhdGVfdHJhbnNpdGlvbl9kb3duICh1c2JfZGV2aWNlX3N0YXRlX3QgaW5pdGlhbCwKKwkJCQkJICAgICAgdXNiX2RldmljZV9zdGF0ZV90IGZpbmFsKTsKK3N0YXRpYyB2b2lkIG1wYzh4eF91ZGNfc3RhbGwgKHVuc2lnbmVkIGludCBlcCk7CitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX2ZsdXNoX3R4X2ZpZm8gKGludCBlcGlkKTsKK3N0YXRpYyB2b2lkIG1wYzh4eF91ZGNfZmx1c2hfcnhfZmlmbyAodm9pZCk7CitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX2NsZWFyX3J4YmQgKHZvbGF0aWxlIGNiZF90ICogcnhfY2JkcCk7CitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX2luaXRfdHggKHN0cnVjdCB1c2JfZW5kcG9pbnRfaW5zdGFuY2UgKmVwaSwKKwkJCQlzdHJ1Y3QgdXJiICp0eF91cmIpOworc3RhdGljIHZvaWQgbXBjOHh4X3VkY19kdW1wX3JlcXVlc3QgKHN0cnVjdCB1c2JfZGV2aWNlX3JlcXVlc3QgKnJlcXVlc3QpOworc3RhdGljIHZvaWQgbXBjOHh4X3VkY19jbG9ja19pbml0ICh2b2xhdGlsZSBpbW1hcF90ICogaW1tciwKKwkJCQkgICB2b2xhdGlsZSBjcG04eHhfdCAqIGNwKTsKK3N0YXRpYyBpbnQgbXBjOHh4X3VkY19lcF90eCAoc3RydWN0IHVzYl9lbmRwb2ludF9pbnN0YW5jZSAqZXBpKTsKK3N0YXRpYyBpbnQgbXBjOHh4X3VkY19lcG5fcnggKHVuc2lnbmVkIGludCBlcGlkLCB2b2xhdGlsZSBjYmRfdCAqIHJ4X2NiZHApOworc3RhdGljIHZvaWQgbXBjOHh4X3VkY19lcDBfcnggKHZvbGF0aWxlIGNiZF90ICogcnhfY2JkcCk7CitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX2NiZF9pbml0ICh2b2lkKTsKK3N0YXRpYyB2b2lkIG1wYzh4eF91ZGNfZW5kcG9pbnRfaW5pdCAodm9pZCk7CitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX2NiZF9hdHRhY2ggKGludCBlcCwgdWNoYXIgdHhfc2l6ZSwgdWNoYXIgcnhfc2l6ZSk7CitzdGF0aWMgdTMyIG1wYzh4eF91ZGNfYWxsb2MgKHUzMiBkYXRhX3NpemUsIHUzMiBhbGlnbm1lbnQpOworc3RhdGljIGludCBtcGM4eHhfdWRjX2VwMF9yeF9zZXR1cCAodm9sYXRpbGUgY2JkX3QgKiByeF9jYmRwKTsKK3N0YXRpYyB2b2lkIG1wYzh4eF91ZGNfc2V0X25hayAodW5zaWduZWQgaW50IGVwKTsKK3N0YXRpYyBzaG9ydCBtcGM4eHhfdWRjX2hhbmRsZV90eGVyciAodm9pZCk7CitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX2FkdmFuY2VfcnggKHZvbGF0aWxlIGNiZF90ICoqIHJ4X2NiZHAsIGludCBlcGlkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkJICAgICAgIEdsb2JhbCBMaW5rYWdlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHVkY19pbml0CisgKgorICogRG8gaW5pdGlhbCBidXMgZ2x1aW5nCisgKi8KK2ludCB1ZGNfaW5pdCAodm9pZCkKK3sKKwkvKiBJbml0IHZhcmlvdXMgcG9pbnRlcnMgKi8KKwlpbW1yID0gKGltbWFwX3QgKikgQ0ZHX0lNTVI7CisJY3AgPSAoY3BtOHh4X3QgKikgJiAoaW1tci0+aW1fY3BtKTsKKwl1c2JfcGFyYW1wID0gKHVzYl9wcmFtX3QgKikgJiAoY3AtPmNwX2RwYXJhbVtQUk9GRl9VU0JdKTsKKwl1c2JwID0gKHVzYl90ICopICYgKGNwLT5jcF9zY2NbMF0pOworCisJbWVtc2V0IChlcF9yZWYsIDB4MDAsIChzaXplb2YgKHN0cnVjdCBtcGM4eHhfZXApICogTUFYX0VORFBPSU5UUykpOworCisJdWRjX2RldmljZSA9IDA7CisJdWRjX3N0YXRlID0gU1RBVEVfTk9UX1JFQURZOworCisJdXNicC0+dXNtb2QgPSAweDAwOworCXVzYnAtPnVzY29tID0gMDsKKworCS8qIFNldCBVU0IgRnJhbWUgIzAsIFJlc3BvbmQgYXQgQWRkcmVzcyAmIEdldCBhIGNsb2NrIHNvdXJjZSAgKi8KKwl1c2JwLT51c2FkZHIgPSAweDAwOworCW1wYzh4eF91ZGNfY2xvY2tfaW5pdCAoaW1tciwgY3ApOworCisJLyogUEExNSwgUEExNCBhcyBwZXJoaXBlcmFsIFVTQlJYRCBhbmQgVVNCT0UgKi8KKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BhZGlyICY9IH4weDAwMDM7CisJaW1tci0+aW1faW9wb3J0LmlvcF9wYXBhciB8PSAweDAwMDM7CisKKwkvKiBQQzExL1BDMTAgYXMgcGVyaXBoZXJhbCBVU0JSWFAgVVNCUlhOICovCisJaW1tci0+aW1faW9wb3J0LmlvcF9wY3NvIHw9IDB4MDAzMDsKKworCS8qIFBDNy9QQzYgYXMgcGVyaGlwZXJhbCBVU0JUWFAgYW5kIFVTQlRYTiAqLworCWltbXItPmltX2lvcG9ydC5pb3BfcGNkaXIgfD0gMHgwMzAwOworCWltbXItPmltX2lvcG9ydC5pb3BfcGNwYXIgfD0gMHgwMzAwOworCisJLyogU2V0IHRoZSBiYXNlIGFkZHJlc3MgKi8KKwlhZGRyZXNzX2Jhc2UgPSAodTMyKSAoY3AtPmNwX2RwbWVtICsgQ1BNX1VTQl9CQVNFKTsKKworCS8qIEluaXRpYWxpc2UgZW5kcG9pbnRzIGFuZCBjaXJjdWxhciBidWZmZXJzICovCisJbXBjOHh4X3VkY19lbmRwb2ludF9pbml0ICgpOworCW1wYzh4eF91ZGNfY2JkX2luaXQgKCk7CisKKwkvKiBBc3NpZ24gYWxsb2NhdGVkIER1YWwgUG9ydCBFbmRwb2ludCBkZXNjcmlwdG9ycyAqLworCXVzYl9wYXJhbXAtPmVwMHB0ciA9ICh1MzIpIGVuZHBvaW50c1swXTsKKwl1c2JfcGFyYW1wLT5lcDFwdHIgPSAodTMyKSBlbmRwb2ludHNbMV07CisJdXNiX3BhcmFtcC0+ZXAycHRyID0gKHUzMikgZW5kcG9pbnRzWzJdOworCXVzYl9wYXJhbXAtPmVwM3B0ciA9ICh1MzIpIGVuZHBvaW50c1szXTsKKwl1c2JfcGFyYW1wLT5mcmFtZV9uID0gMDsKKworCURCRyAoImVwMHB0cj0weCUwOHggZXAxcHRyPTB4JTA4eCBlcDJwdHI9MHglMDh4IGVwM3B0cj0weCUwOHhcbiIsCisJICAgICB1c2JfcGFyYW1wLT5lcDBwdHIsIHVzYl9wYXJhbXAtPmVwMXB0ciwgdXNiX3BhcmFtcC0+ZXAycHRyLAorCSAgICAgdXNiX3BhcmFtcC0+ZXAzcHRyKTsKKworCXJldHVybiAwOworfQorCisvKiB1ZGNfaXJxCisgKgorICogUG9sbCBmb3Igd2hhdGV2ZXIgZXZlbnRzIG1heSBoYXZlIG9jY3VyZWQKKyAqLwordm9pZCB1ZGNfaXJxICh2b2lkKQoreworCWludCBlcGlkID0gMDsKKwl2b2xhdGlsZSBjYmRfdCAqcnhfY2JkcCA9IDA7CisJdm9sYXRpbGUgY2JkX3QgKnJ4X2NiZHBfYmFzZSA9IDA7CisKKwlpZiAodWRjX3N0YXRlICE9IFNUQVRFX1JFQURZKSB7CisJCXJldHVybjsKKwl9CisKKwlpZiAodXNicC0+dXNiZXIgJiBVU0JfRV9CU1kpIHsKKwkJLyogVGhpcyBzaG91bGRuJ3QgaGFwcGVuLiBJZiBpdCBkb2VzIHRoZW4gaXQncyBhIGJ1ZyAhICovCisJCXVzYnAtPnVzYmVyIHw9IFVTQl9FX0JTWTsKKwkJbXBjOHh4X3VkY19mbHVzaF9yeF9maWZvICgpOworCX0KKworCS8qIFNjYW4gYWxsIFJYL0JpZGlyZWN0aW9uYWwgRW5kcG9pbnRzIGZvciBSWCBkYXRhLiAqLworCWZvciAoZXBpZCA9IDA7IGVwaWQgPCBNQVhfRU5EUE9JTlRTOyBlcGlkKyspIHsKKwkJaWYgKCFlcF9yZWZbZXBpZF0ucHJ4KSB7CisJCQljb250aW51ZTsKKwkJfQorCQlyeF9jYmRwID0gcnhfY2JkcF9iYXNlID0gZXBfcmVmW2VwaWRdLnByeDsKKworCQlkbyB7CisJCQlpZiAoIShyeF9jYmRwLT5jYmRfc2MgJiBSWF9CRF9FKSkgeworCisJCQkJaWYgKHJ4X2NiZHAtPmNiZF9zYyAmIDB4MUYpIHsKKwkJCQkJLyogQ29ycnVwdCBkYXRhIGRpc2NhcmQgaXQuCisJCQkJCSAqIENvbnRyb2xsZXIgaGFzIE5BSydkIHRoaXMgcGFja2V0LgorCQkJCQkgKi8KKwkJCQkJbXBjOHh4X3VkY19jbGVhcl9yeGJkIChyeF9jYmRwKTsKKworCQkJCX0gZWxzZSB7CisJCQkJCWlmICghZXBpZCkgeworCQkJCQkJbXBjOHh4X3VkY19lcDBfcnggKHJ4X2NiZHApOworCisJCQkJCX0gZWxzZSB7CisJCQkJCQkvKiBQcm9jZXNzIGRhdGEgKi8KKwkJCQkJCW1wYzh4eF91ZGNfc2V0X25hayAoZXBpZCk7CisJCQkJCQltcGM4eHhfdWRjX2Vwbl9yeCAoZXBpZCwgcnhfY2JkcCk7CisJCQkJCQltcGM4eHhfdWRjX2NsZWFyX3J4YmQgKHJ4X2NiZHApOworCQkJCQl9CisJCQkJfQorCisJCQkJLyogQWR2YW5jZSBSWCBDQkQgcG9pbnRlciAqLworCQkJCW1wYzh4eF91ZGNfYWR2YW5jZV9yeCAoJnJ4X2NiZHAsIGVwaWQpOworCQkJCWVwX3JlZltlcGlkXS5wcnggPSByeF9jYmRwOworCQkJfSBlbHNlIHsKKwkJCQkvKiBBZHZhbmNlIFJYIENCRCBwb2ludGVyICovCisJCQkJbXBjOHh4X3VkY19hZHZhbmNlX3J4ICgmcnhfY2JkcCwgZXBpZCk7CisJCQl9CisKKwkJfSB3aGlsZSAocnhfY2JkcCAhPSByeF9jYmRwX2Jhc2UpOworCX0KKworCS8qIEhhbmRsZSBUWCBldmVudHMgYXMgYXBwcm9waWF0ZSwgdGhlIGNvcnJlY3QgcGxhY2UgdG8gZG8gdGhpcyBpcworCSAqIGluIGEgdHggcm91dGluZS4gUGVyaGFwcyBUWCBvbiBlcG4gd2FzIHByZS1lbXB0ZWQgYnkgZXAwCisJICovCisKKwlpZiAodXNicC0+dXNiZXIgJiBVU0JfRV9UWEIpIHsKKwkJdXNicC0+dXNiZXIgfD0gVVNCX0VfVFhCOworCX0KKworCWlmICh1c2JwLT51c2JlciAmIChVU0JfVFhfRVJSTUFTSykpIHsKKwkJbXBjOHh4X3VkY19oYW5kbGVfdHhlcnIgKCk7CisJfQorCisJLyogU3dpdGNoIHRvIHRoZSBkZWZhdWx0IHN0YXRlLCByZXNwb25kIGF0IHRoZSBkZWZhdWx0IGFkZHJlc3MgKi8KKwlpZiAodXNicC0+dXNiZXIgJiBVU0JfRV9SRVNFVCkgeworCQl1c2JwLT51c2JlciB8PSBVU0JfRV9SRVNFVDsKKwkJdXNicC0+dXNhZGRyID0gMHgwMDsKKwkJdWRjX2RldmljZS0+ZGV2aWNlX3N0YXRlID0gU1RBVEVfREVGQVVMVDsKKwl9CisKKwkvKiBpZih1c2JwLT51c2JlciZVU0JfRV9JRExFKXsKKwkgICBXZSBjb3VsZCBzdXNwZW5kIGhlcmUgIQorCSAgIHVzYnAtPnVzYmVyfD1VU0JfRV9JRExFOworCSAgIERCRygiaWRsZSBzdGF0ZSBjaGFuZ2VcbiIpOworCSAgIH0KKwkgICBpZih1c2JwLT51c2JzKXsKKwkgICBXZSBjb3VsZCByZXN1bWUgaGVyZSB3aGVuIElETEUgaXMgZGVhc3NlcnRlZCAhCisJICAgTm90IHdvcnRoIGRvaW5nLCBzbyBsb25nIGFzIHdlIGFyZSBzZWxmIHBvd2VyZWQgdGhvdWdoLgorCSAgIH0KKwkqLworCisJcmV0dXJuOworfQorCisvKiB1ZGNfZW5kcG9pbnRfd3JpdGUKKyAqCisgKiBXcml0ZSBzb21lIGRhdGEgdG8gYW4gZW5kcG9pbnQKKyAqLworaW50IHVkY19lbmRwb2ludF93cml0ZSAoc3RydWN0IHVzYl9lbmRwb2ludF9pbnN0YW5jZSAqZXBpKQoreworCWludCBlcCA9IDA7CisJc2hvcnQgZXBpZCA9IDEsIHVubmFrID0gMCwgcmV0ID0gMDsKKworCWlmICh1ZGNfc3RhdGUgIT0gU1RBVEVfUkVBRFkpIHsKKwkJRVJSICgiaW52YWxpZCB1ZGNfc3RhdGUgIT0gU1RBVEVfUkVBRFkhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICghdWRjX2RldmljZSB8fCAhZXBpKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAodWRjX2RldmljZS0+ZGV2aWNlX3N0YXRlICE9IFNUQVRFX0NPTkZJR1VSRUQpIHsKKwkJcmV0dXJuIC0xOworCX0KKworCWVwID0gZXBpLT5lbmRwb2ludF9hZGRyZXNzICYgMHgwMzsKKwlpZiAoZXAgPj0gTUFYX0VORFBPSU5UUykgeworCQlyZXR1cm4gLTE7CisJfQorCisJLyogU2V0IE5BSyBmb3IgYWxsIFJYIGVuZHBvaW50cyBkdXJpbmcgVFggKi8KKwlmb3IgKGVwaWQgPSAxOyBlcGlkIDwgTUFYX0VORFBPSU5UUzsgZXBpZCsrKSB7CisKKwkJLyogRG9uJ3Qgc2V0IE5BSyBvbiBEQVRBIElOL0NPTlRST0wgZW5kcG9pbnRzICovCisJCWlmIChlcF9yZWZbZXBpZF0uc2MgJiBVU0JfRElSX0lOKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghKHVzYnAtPnVzZXBbZXBpZF0gJiAoVVNFUF9USFNfTkFLIHwgVVNFUF9SSFNfTkFLKSkpIHsKKwkJCXVubmFrIHw9IDEgPDwgZXBpZDsKKwkJfQorCisJCW1wYzh4eF91ZGNfc2V0X25hayAoZXBpZCk7CisJfQorCisJbXBjOHh4X3VkY19pbml0X3R4ICgmdWRjX2RldmljZS0+YnVzLT5lbmRwb2ludF9hcnJheVtlcF0sCisJCQkgICAgZXBpLT50eF91cmIpOworCXJldCA9IG1wYzh4eF91ZGNfZXBfdHggKCZ1ZGNfZGV2aWNlLT5idXMtPmVuZHBvaW50X2FycmF5W2VwXSk7CisKKwkvKiBSZW1vdmUgdGVtcG9yYXJ5IE5BSyAqLworCWZvciAoZXBpZCA9IDE7IGVwaWQgPCBNQVhfRU5EUE9JTlRTOyBlcGlkKyspIHsKKwkJaWYgKHVubmFrICYgKDEgPDwgZXBpZCkpIHsKKwkJCXVkY191bnNldF9uYWsgKGVwaWQpOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogbXBjOHh4X3VkY19hc3NpZ25fdXJiCisgKgorICogQXNzb2NpYXRlIGEgZ2l2ZW4gdXJiIHRvIGFuIGVuZHBvaW50IFRYIG9yIFJYIHRyYW5zbWl0L3JlY2VpdmUgYnVmZmVycworICovCitzdGF0aWMgaW50IG1wYzh4eF91ZGNfYXNzaWduX3VyYiAoaW50IGVwLCBjaGFyIGRpcmVjdGlvbikKK3sKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2luc3RhbmNlICplcGkgPSAwOworCisJaWYgKGVwID49IE1BWF9FTkRQT0lOVFMpIHsKKwkJZ290byBlcnI7CisJfQorCWVwaSA9ICZ1ZGNfZGV2aWNlLT5idXMtPmVuZHBvaW50X2FycmF5W2VwXTsKKwlpZiAoIWVwaSkgeworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoIWVwX3JlZltlcF0udXJiKSB7CisJCWVwX3JlZltlcF0udXJiID0gdXNiZF9hbGxvY191cmIgKHVkY19kZXZpY2UsIHVkY19kZXZpY2UtPmJ1cy0+ZW5kcG9pbnRfYXJyYXkpOworCQlpZiAoIWVwX3JlZltlcF0udXJiKSB7CisJCQlnb3RvIGVycjsKKwkJfQorCX0gZWxzZSB7CisJCWVwX3JlZltlcF0udXJiLT5hY3R1YWxfbGVuZ3RoID0gMDsKKwl9CisKKwlzd2l0Y2ggKGRpcmVjdGlvbikgeworCWNhc2UgVVNCX0RJUl9JTjoKKwkJZXBpLT50eF91cmIgPSBlcF9yZWZbZXBdLnVyYjsKKwkJYnJlYWs7CisJY2FzZSBVU0JfRElSX09VVDoKKwkJZXBpLT5yY3ZfdXJiID0gZXBfcmVmW2VwXS51cmI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gZXJyOworCX0KKwlyZXR1cm4gMDsKKworICAgICAgZXJyOgorCXVkY19zdGF0ZSA9IFNUQVRFX0VSUk9SOworCXJldHVybiAtMTsKK30KKworLyogdWRjX3NldHVwX2VwCisgKgorICogQXNzb2NpYXRlIFUtQm9vdCBzb2Z0d2FyZSBlbmRwb2ludHMgdG8gbXBjOHh4IGVuZHBvaW50IHBhcmFtZXRlciByYW0KKyAqIElzb2Nocm9ub3VzIGVuZHBvaW50cyBhcmVuJ3QgeWV0IHN1cHBvcnRlZCEKKyAqLwordm9pZCB1ZGNfc2V0dXBfZXAgKHN0cnVjdCB1c2JfZGV2aWNlX2luc3RhbmNlICpkZXZpY2UsIHVuc2lnbmVkIGludCBlcCwKKwkJICAgc3RydWN0IHVzYl9lbmRwb2ludF9pbnN0YW5jZSAqZXBpKQoreworCXVjaGFyIGRpcmVjdGlvbiA9IDA7CisJaW50IGVwX2F0dHJpYiA9IDA7CisKKwlpZiAoZXBpICYmIChlcCA8IE1BWF9FTkRQT0lOVFMpKSB7CisKKwkJaWYgKGVwID09IDApIHsKKwkJCWlmIChlcGktPnJjdl9hdHRyaWJ1dGVzICE9IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wKKwkJCSAgICB8fCBlcGktPnR4X2F0dHJpYnV0ZXMgIT0KKwkJCSAgICBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MKSB7CisKKwkJCQkvKiBlcDAgbXVzdCBiZSBhIGNvbnRyb2wgZW5kcG9pbnQgKi8KKwkJCQl1ZGNfc3RhdGUgPSBTVEFURV9FUlJPUjsKKwkJCQlyZXR1cm47CisKKwkJCX0KKwkJCWlmICghKGVwX3JlZltlcF0uc2MgJiBFUF9BVFRBQ0hFRCkpIHsKKwkJCQltcGM4eHhfdWRjX2NiZF9hdHRhY2ggKGVwLCBlcGktPnR4X3BhY2tldFNpemUsCisJCQkJCQkgICAgICAgZXBpLT5yY3ZfcGFja2V0U2l6ZSk7CisJCQl9CisJCQl1c2JwLT51c2VwW2VwXSA9IDB4MDAwMDsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmICgoZXBpLT5lbmRwb2ludF9hZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKQorCQkgICAgPT0gVVNCX0RJUl9JTikgeworCisJCQlkaXJlY3Rpb24gPSAxOworCQkJZXBfYXR0cmliID0gZXBpLT50eF9hdHRyaWJ1dGVzOworCQkJZXBpLT5yY3ZfcGFja2V0U2l6ZSA9IDA7CisJCQllcF9yZWZbZXBdLnNjIHw9IFVTQl9ESVJfSU47CisJCX0gZWxzZSB7CisKKwkJCWRpcmVjdGlvbiA9IDA7CisJCQllcF9hdHRyaWIgPSBlcGktPnJjdl9hdHRyaWJ1dGVzOworCQkJZXBpLT50eF9wYWNrZXRTaXplID0gMDsKKwkJCWVwX3JlZltlcF0uc2MgJj0gflVTQl9ESVJfSU47CisJCX0KKworCQlpZiAobXBjOHh4X3VkY19hc3NpZ25fdXJiIChlcCwgZXBpLT5lbmRwb2ludF9hZGRyZXNzCisJCQkJCSAgICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSkgeworCQkJcmV0dXJuOworCQl9CisKKwkJc3dpdGNoIChlcF9hdHRyaWIpIHsKKwkJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MOgorCQkJaWYgKCEoZXBfcmVmW2VwXS5zYyAmIEVQX0FUVEFDSEVEKSkgeworCQkJCW1wYzh4eF91ZGNfY2JkX2F0dGFjaCAoZXAsCisJCQkJCQkgICAgICAgZXBpLT50eF9wYWNrZXRTaXplLAorCQkJCQkJICAgICAgIGVwaS0+cmN2X3BhY2tldFNpemUpOworCQkJfQorCQkJdXNicC0+dXNlcFtlcF0gPSBlcCA8PCAxMjsKKwkJCWVwaS0+cmN2X3VyYiA9IGVwaS0+dHhfdXJiID0gZXBfcmVmW2VwXS51cmI7CisKKwkJCWJyZWFrOworCQljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0JVTEs6CisJCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfSU5UOgorCQkJaWYgKCEoZXBfcmVmW2VwXS5zYyAmIEVQX0FUVEFDSEVEKSkgeworCQkJCWlmIChkaXJlY3Rpb24pIHsKKwkJCQkJbXBjOHh4X3VkY19jYmRfYXR0YWNoIChlcCwKKwkJCQkJCQkgICAgICAgZXBpLT50eF9wYWNrZXRTaXplLAorCQkJCQkJCSAgICAgICAwKTsKKwkJCQl9IGVsc2UgeworCQkJCQltcGM4eHhfdWRjX2NiZF9hdHRhY2ggKGVwLAorCQkJCQkJCSAgICAgICAwLAorCQkJCQkJCSAgICAgICBlcGktPnJjdl9wYWNrZXRTaXplKTsKKwkJCQl9CisJCQl9CisJCQl1c2JwLT51c2VwW2VwXSA9IChlcCA8PCAxMikgfCAoKGVwX2F0dHJpYikgPDwgOCk7CisKKwkJCWJyZWFrOworCQljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lTT0M6CisJCWRlZmF1bHQ6CisJCQlzZXJpYWxfcHJpbnRmICgiRXJyb3IgZW5kcG9pbnQgYXR0cmliICVkPjNcbiIsIGVwX2F0dHJpYik7CisJCQl1ZGNfc3RhdGUgPSBTVEFURV9FUlJPUjsKKwkJCWJyZWFrOworCQl9CisJfQorCit9CisKKy8qIHVkY19jb25uZWN0CisgKgorICogTW92ZSBzdGF0ZSwgc3dpdGNoIG9uIHRoZSBVU0IKKyAqLwordm9pZCB1ZGNfY29ubmVjdCAodm9pZCkKK3sKKwkvKiBFbmFibGUgcHVsbC11cCByZXNpc3RvciBvbiBEKworCSAqIFRPRE86IGZpdCBhIHB1bGwtdXAgcmVzaXN0b3IgdG8gZHJpdmUgU0UwIGZvciA+IDIuNXVzCisJICovCisKKwlpZiAodWRjX3N0YXRlICE9IFNUQVRFX0VSUk9SKSB7CisJCXVkY19zdGF0ZSA9IFNUQVRFX1JFQURZOworCQl1c2JwLT51c21vZCB8PSBVU01PRF9FTjsKKwl9Cit9CisKKy8qIHVkY19kaXNjb25uZWN0CisgKgorICogRGlzY29ubmVjdCBpcyBub3QgdXNlZCBidXQsIGlzIGluY2x1ZGVkIGZvciBjb21wbGV0ZW5lc3MKKyAqLwordm9pZCB1ZGNfZGlzY29ubmVjdCAodm9pZCkKK3sKKwkvKiBEaXNhYmxlIHB1bGwtdXAgcmVzaXN0b3Igb24gRC0KKwkgKiBUT0RPOiBmaXggYSBwdWxsdXAgcmVzaXN0b3IgdG8gY29udHJvbCB0aGlzCisJICovCisKKwlpZiAodWRjX3N0YXRlICE9IFNUQVRFX0VSUk9SKSB7CisJCXVkY19zdGF0ZSA9IFNUQVRFX05PVF9SRUFEWTsKKwl9CisJdXNicC0+dXNtb2QgJj0gflVTTU9EX0VOOworfQorCisvKiB1ZGNfZW5hYmxlCisgKgorICogR3JhYiBhbiBFUDAgVVJCLCByZWdpc3RlciBpbnRlcmVzdCBpbiBhIHN1YnNldCBvZiBVU0IgZXZlbnRzCisgKi8KK3ZvaWQgdWRjX2VuYWJsZSAoc3RydWN0IHVzYl9kZXZpY2VfaW5zdGFuY2UgKmRldmljZSkKK3sKKwlpZiAodWRjX3N0YXRlID09IFNUQVRFX0VSUk9SKSB7CisJCXJldHVybjsKKwl9CisKKwl1ZGNfZGV2aWNlID0gZGV2aWNlOworCisJaWYgKCFlcF9yZWZbMF0udXJiKSB7CisJCWVwX3JlZlswXS51cmIgPSB1c2JkX2FsbG9jX3VyYiAoZGV2aWNlLCBkZXZpY2UtPmJ1cy0+ZW5kcG9pbnRfYXJyYXkpOworCX0KKworCS8qIFJlZ2lzdGVyIGludGVyZXN0IGluIGFsbCBldmVudHMgZXhjZXB0IFNPRiwgZW5hYmxlIHRyYW5zY2VpdmVyICovCisJdXNicC0+dXNiZXIgPSAweDAzRkY7CisJdXNicC0+dXNibXIgPSAweDAyRjc7CisKKwlyZXR1cm47Cit9CisKKy8qIHVkY19kaXNhYmxlCisgKgorICogZGlzYWJsZSB0aGUgY3VycmVudGx5IGhvb2tlZCBkZXZpY2UKKyAqLwordm9pZCB1ZGNfZGlzYWJsZSAodm9pZCkKK3sKKwlpbnQgaSA9IDA7CisKKwlpZiAodWRjX3N0YXRlID09IFNUQVRFX0VSUk9SKSB7CisJCURCRyAoIldvbid0IGRpc2FibGUgVURDLiB1ZGNfc3RhdGU9PVNUQVRFX0VSUk9SICFcbiIpOworCQlyZXR1cm47CisJfQorCisJdWRjX2RldmljZSA9IDA7CisKKwlmb3IgKDsgaSA8IE1BWF9FTkRQT0lOVFM7IGkrKykgeworCQlpZiAoZXBfcmVmW2ldLnVyYikgeworCQkJdXNiZF9kZWFsbG9jX3VyYiAoZXBfcmVmW2ldLnVyYik7CisJCQllcF9yZWZbaV0udXJiID0gMDsKKwkJfQorCX0KKworCXVzYnAtPnVzYm1yID0gMHgwMDsKKwl1c2JwLT51c21vZCA9IH5VU01PRF9FTjsKKwl1ZGNfc3RhdGUgPSBTVEFURV9OT1RfUkVBRFk7Cit9CisKKy8qIHVkY19zdGFydHVwX2V2ZW50cworICoKKyAqIEVuYWJsZSB0aGUgc3BlY2lmaWVkIGRldmljZQorICovCit2b2lkIHVkY19zdGFydHVwX2V2ZW50cyAoc3RydWN0IHVzYl9kZXZpY2VfaW5zdGFuY2UgKmRldmljZSkKK3sKKwl1ZGNfZW5hYmxlIChkZXZpY2UpOworCWlmICh1ZGNfc3RhdGUgPT0gU1RBVEVfUkVBRFkpIHsKKwkJdXNiZF9kZXZpY2VfZXZlbnRfaXJxIChkZXZpY2UsIERFVklDRV9DUkVBVEUsIDApOworCX0KK30KKworLyogdWRjX3NldF9uYWsKKyAqCisgKiBBbGxvdyB1cHBlciBsYXllcnMgdG8gc2lnbmFsIGxvd2VyIGxheWVycyBzaG91bGQgbm90IGFjY2VwdCBtb3JlIFJYIGRhdGEKKyAqCisgKi8KK3ZvaWQgdWRjX3NldF9uYWsgKGludCBlcGlkKQoreworCWlmIChlcGlkKSB7CisJCW1wYzh4eF91ZGNfc2V0X25hayAoZXBpZCk7CisJfQorfQorCisvKiB1ZGNfdW5zZXRfbmFrCisgKgorICogU3VzcGVuZCBzZW5kaW5nIG9mIE5BSyB0b2tlbnMgZm9yIERBVEEgT1VUIHRva2VucyBvbiBhIGdpdmVuIGVuZHBvaW50LgorICogU3dpdGNoIG9mZiBOQUtpbmcgb24gdGhpcyBlbmRwb2ludCB0byBhY2NlcHQgbW9yZSBkYXRhIG91dHB1dCBmcm9tIGhvc3QuCisgKgorICovCit2b2lkIHVkY191bnNldF9uYWsgKGludCBlcGlkKQoreworCWlmIChlcGlkID4gTUFYX0VORFBPSU5UUykgeworCQlyZXR1cm47CisJfQorCisJaWYgKHVzYnAtPnVzZXBbZXBpZF0gJiAoVVNFUF9USFNfTkFLIHwgVVNFUF9SSFNfTkFLKSkgeworCQl1c2JwLT51c2VwW2VwaWRdICY9IH4oVVNFUF9USFNfTkFLIHwgVVNFUF9SSFNfTkFLKTsKKwkJX19hc21fXyAoImVpZWlvIik7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCQkgICAgICBTdGF0aWMgTGlua2FnZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiB1ZGNfc3RhdGVfdHJhbnNpdGlvbl91cAorICogdWRjX3N0YXRlX3RyYW5zaXRpb25fZG93bgorICoKKyAqIEhlbHBlciBmdW5jdGlvbnMgdG8gaW1wbGVtZW50IGRldmljZSBzdGF0ZSBjaGFuZ2VzLglUaGUgZGV2aWNlIHN0YXRlcyBhbmQKKyAqIHRoZSBldmVudHMgdGhhdCB0cmFuc2l0aW9uIGJldHdlZW4gdGhlbSBhcmU6CisgKgorICoJCQkJU1RBVEVfQVRUQUNIRUQKKyAqCQkJCXx8CS9cCisgKgkJCQlcLwl8fAorICoJREVWSUNFX0hVQl9DT05GSUdVUkVECQkJREVWSUNFX0hVQl9SRVNFVAorICoJCQkJfHwJL1wKKyAqCQkJCVwvCXx8CisgKgkJCQlTVEFURV9QT1dFUkVECisgKgkJCQl8fAkvXAorICoJCQkJXC8JfHwKKyAqCURFVklDRV9SRVNFVAkJCQlERVZJQ0VfUE9XRVJfSU5URVJSVVBUSU9OCisgKgkJCQl8fAkvXAorICoJCQkJXC8JfHwKKyAqCQkJCVNUQVRFX0RFRkFVTFQKKyAqCQkJCXx8CS9cCisgKgkJCQlcLwl8fAorICoJREVWSUNFX0FERFJFU1NfQVNTSUdORUQJCQlERVZJQ0VfUkVTRVQKKyAqCQkJCXx8CS9cCisgKgkJCQlcLwl8fAorICoJCQkJU1RBVEVfQUREUkVTU0VECisgKgkJCQl8fAkvXAorICoJCQkJXC8JfHwKKyAqCURFVklDRV9DT05GSUdVUkVECQkJREVWSUNFX0RFX0NPTkZJR1VSRUQKKyAqCQkJCXx8CS9cCisgKgkJCQlcLwl8fAorICoJCQkJU1RBVEVfQ09ORklHVVJFRAorICoKKyAqIHVkY19zdGF0ZV90cmFuc2l0aW9uX3VwIHRyYW5zaXRpb25zIHVwIChpbiB0aGUgZGlyZWN0aW9uIGZyb20gU1RBVEVfQVRUQUNIRUQKKyAqIHRvIFNUQVRFX0NPTkZJR1VSRUQpIGZyb20gdGhlIHNwZWNpZmllZCBpbml0aWFsIHN0YXRlIHRvIHRoZSBzcGVjaWZpZWQgZmluYWwKKyAqIHN0YXRlLCBwYXNzaW5nIHRocm91Z2ggZWFjaCBpbnRlcm1lZGlhdGUgc3RhdGUgb24gdGhlIHdheS4gIElmIHRoZSBpbml0aWFsCisgKiBzdGF0ZSBpcyBhdCBvciBhYm92ZSAoaS5lLiBuZWFyZXIgdG8gU1RBVEVfQ09ORklHVVJFRCkgdGhlIGZpbmFsIHN0YXRlLCB0aGVuCisgKiBubyBzdGF0ZSB0cmFuc2l0aW9ucyB3aWxsIHRha2UgcGxhY2UuCisgKgorICogdWRjX3N0YXRlX3RyYW5zaXRpb25fZG93biB0cmFuc2l0aW9ucyBkb3duIChpbiB0aGUgZGlyZWN0aW9uIGZyb20KKyAqIFNUQVRFX0NPTkZJR1VSRUQgdG8gU1RBVEVfQVRUQUNIRUQpIGZyb20gdGhlIHNwZWNpZmllZCBpbml0aWFsIHN0YXRlIHRvIHRoZQorICogc3BlY2lmaWVkIGZpbmFsIHN0YXRlLCBwYXNzaW5nIHRocm91Z2ggZWFjaCBpbnRlcm1lZGlhdGUgc3RhdGUgb24gdGhlIHdheS4KKyAqIElmIHRoZSBpbml0aWFsIHN0YXRlIGlzIGF0IG9yIGJlbG93IChpLmUuIG5lYXJlciB0byBTVEFURV9BVFRBQ0hFRCkgdGhlIGZpbmFsCisgKiBzdGF0ZSwgdGhlbiBubyBzdGF0ZSB0cmFuc2l0aW9ucyB3aWxsIHRha2UgcGxhY2UuCisgKgorICovCisKK3N0YXRpYyB2b2lkIG1wYzh4eF91ZGNfc3RhdGVfdHJhbnNpdGlvbl91cCAodXNiX2RldmljZV9zdGF0ZV90IGluaXRpYWwsCisJCQkJCSAgICB1c2JfZGV2aWNlX3N0YXRlX3QgZmluYWwpCit7CisJaWYgKGluaXRpYWwgPCBmaW5hbCkgeworCQlzd2l0Y2ggKGluaXRpYWwpIHsKKwkJY2FzZSBTVEFURV9BVFRBQ0hFRDoKKwkJCXVzYmRfZGV2aWNlX2V2ZW50X2lycSAodWRjX2RldmljZSwKKwkJCQkJICAgICAgIERFVklDRV9IVUJfQ09ORklHVVJFRCwgMCk7CisJCQlpZiAoZmluYWwgPT0gU1RBVEVfUE9XRVJFRCkKKwkJCQlicmVhazsKKwkJY2FzZSBTVEFURV9QT1dFUkVEOgorCQkJdXNiZF9kZXZpY2VfZXZlbnRfaXJxICh1ZGNfZGV2aWNlLCBERVZJQ0VfUkVTRVQsIDApOworCQkJaWYgKGZpbmFsID09IFNUQVRFX0RFRkFVTFQpCisJCQkJYnJlYWs7CisJCWNhc2UgU1RBVEVfREVGQVVMVDoKKwkJCXVzYmRfZGV2aWNlX2V2ZW50X2lycSAodWRjX2RldmljZSwKKwkJCQkJICAgICAgIERFVklDRV9BRERSRVNTX0FTU0lHTkVELCAwKTsKKwkJCWlmIChmaW5hbCA9PSBTVEFURV9BRERSRVNTRUQpCisJCQkJYnJlYWs7CisJCWNhc2UgU1RBVEVfQUREUkVTU0VEOgorCQkJdXNiZF9kZXZpY2VfZXZlbnRfaXJxICh1ZGNfZGV2aWNlLCBERVZJQ0VfQ09ORklHVVJFRCwKKwkJCQkJICAgICAgIDApOworCQljYXNlIFNUQVRFX0NPTkZJR1VSRUQ6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX3N0YXRlX3RyYW5zaXRpb25fZG93biAodXNiX2RldmljZV9zdGF0ZV90IGluaXRpYWwsCisJCQkJCSAgICAgIHVzYl9kZXZpY2Vfc3RhdGVfdCBmaW5hbCkKK3sKKwlpZiAoaW5pdGlhbCA+IGZpbmFsKSB7CisJCXN3aXRjaCAoaW5pdGlhbCkgeworCQljYXNlIFNUQVRFX0NPTkZJR1VSRUQ6CisJCQl1c2JkX2RldmljZV9ldmVudF9pcnEgKHVkY19kZXZpY2UsCisJCQkJCSAgICAgICBERVZJQ0VfREVfQ09ORklHVVJFRCwgMCk7CisJCQlpZiAoZmluYWwgPT0gU1RBVEVfQUREUkVTU0VEKQorCQkJCWJyZWFrOworCQljYXNlIFNUQVRFX0FERFJFU1NFRDoKKwkJCXVzYmRfZGV2aWNlX2V2ZW50X2lycSAodWRjX2RldmljZSwgREVWSUNFX1JFU0VULCAwKTsKKwkJCWlmIChmaW5hbCA9PSBTVEFURV9ERUZBVUxUKQorCQkJCWJyZWFrOworCQljYXNlIFNUQVRFX0RFRkFVTFQ6CisJCQl1c2JkX2RldmljZV9ldmVudF9pcnEgKHVkY19kZXZpY2UsCisJCQkJCSAgICAgICBERVZJQ0VfUE9XRVJfSU5URVJSVVBUSU9OLCAwKTsKKwkJCWlmIChmaW5hbCA9PSBTVEFURV9QT1dFUkVEKQorCQkJCWJyZWFrOworCQljYXNlIFNUQVRFX1BPV0VSRUQ6CisJCQl1c2JkX2RldmljZV9ldmVudF9pcnEgKHVkY19kZXZpY2UsIERFVklDRV9IVUJfUkVTRVQsCisJCQkJCSAgICAgICAwKTsKKwkJY2FzZSBTVEFURV9BVFRBQ0hFRDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qIG1wYzh4eF91ZGNfc3RhbGwKKyAqCisgKiBGb3JjZSByZXR1cm5pbmcgb2YgU1RBTEwgdG9rZW5zIG9uIHRoZSBnaXZlbiBlbmRwb2ludC4gUHJvdG9jb2wgb3IgZnVuY3Rpb24KKyAqIFNUQUxMIGNvbmRpdGlvbnMgYXJlIHBlcm1pc3NhYmxlIGhlcmUKKyAqLworc3RhdGljIHZvaWQgbXBjOHh4X3VkY19zdGFsbCAodW5zaWduZWQgaW50IGVwKQoreworCXVzYnAtPnVzZXBbZXBdIHw9IFNUQUxMX0JJVE1BU0s7Cit9CisKKy8qIG1wYzh4eF91ZGNfc2V0X25haworICoKKyAqIEZvcmNlIHJldHVybmluZyBvZiBOQUsgcmVzcG9uc2VzIGZvciB0aGUgZ2l2ZW4gZW5kcG9pbnQgYXMgYSBraW5kIG9mIHZlcnkKKyAqIHNpbXBsZSBmbG93IGNvbnRyb2wKKyAqLworc3RhdGljIHZvaWQgbXBjOHh4X3VkY19zZXRfbmFrICh1bnNpZ25lZCBpbnQgZXApCit7CisJdXNicC0+dXNlcFtlcF0gfD0gTkFLX0JJVE1BU0s7CisJX19hc21fXyAoImVpZWlvIik7Cit9CisKKy8qIG1wYzh4eF91ZGNfaGFuZGxlX3R4ZXJyCisgKgorICogSGFuZGxlIGVycm9ycyByZWxldmFudCB0byBUWC4gUmV0dXJuIGEgc3RhdHVzIGNvZGUgdG8gYWxsb3cgY2FsbGluZworICogaW5kaWNhdGl2ZSBvZiB3aGF0IGlmIGFueXRoaW5nIGhhcHBlbmVkCisgKi8KK3N0YXRpYyBzaG9ydCBtcGM4eHhfdWRjX2hhbmRsZV90eGVyciAoKQoreworCXNob3J0IGVwID0gMCwgcmV0ID0gMDsKKworCWZvciAoOyBlcCA8IFRYX1JJTkdfU0laRTsgZXArKykgeworCQlpZiAodXNicC0+dXNiZXIgJiAoMHgxMCA8PCBlcCkpIHsKKworCQkJLyogVGltZW91dCBvciB1bmRlcnJ1biAqLworCQkJaWYgKHR4X2NiZFtlcF0tPmNiZF9zYyAmIDB4MDYpIHsKKwkJCQlyZXQgPSAxOworCQkJCW1wYzh4eF91ZGNfZmx1c2hfdHhfZmlmbyAoZXApOworCisJCQl9IGVsc2UgeworCQkJCWlmICh1c2JwLT51c2VwW2VwXSAmIFNUQUxMX0JJVE1BU0spIHsKKwkJCQkJaWYgKCFlcCkgeworCQkJCQkJdXNicC0+dXNlcFtlcF0gJj0gflNUQUxMX0JJVE1BU0s7CisJCQkJCX0KKwkJCQl9CS8qIGVsc2UgTkFLICovCisJCQl9CisJCQl1c2JwLT51c2JlciB8PSAoMHgxMCA8PCBlcCk7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogbXBjOHh4X3VkY19hZHZhbmNlX3J4CisgKgorICogQWR2YW5jZSBjYmQgcngKKyAqLworc3RhdGljIHZvaWQgbXBjOHh4X3VkY19hZHZhbmNlX3J4ICh2b2xhdGlsZSBjYmRfdCAqKiByeF9jYmRwLCBpbnQgZXBpZCkKK3sKKwlpZiAoKCpyeF9jYmRwKS0+Y2JkX3NjICYgUlhfQkRfVykgeworCQkqcnhfY2JkcCA9ICh2b2xhdGlsZSBjYmRfdCAqKSAoZW5kcG9pbnRzW2VwaWRdLT5yYmFzZSArIENGR19JTU1SKTsKKworCX0gZWxzZSB7CisJCSgqcnhfY2JkcCkrKzsKKwl9Cit9CisKKworLyogbXBjOHh4X3VkY19mbHVzaF90eF9maWZvCisgKgorICogRmx1c2ggYSBnaXZlbiBUWCBmaWZvLiBBc3N1bWVzIG9uZSB0eCBjYmQgcGVyIGVuZHBvaW50CisgKi8KK3N0YXRpYyB2b2lkIG1wYzh4eF91ZGNfZmx1c2hfdHhfZmlmbyAoaW50IGVwaWQpCit7CisJdm9sYXRpbGUgY2JkX3QgKnR4X2NiZHAgPSAwOworCisJaWYgKGVwaWQgPiBNQVhfRU5EUE9JTlRTKSB7CisJCXJldHVybjsKKwl9CisKKwkvKiBUWCBzdG9wICovCisJaW1tci0+aW1fY3BtLmNwX2NwY3IgPSAoKGVwaWQgPDwgMikgfCAweDFEMDEpOworCV9fYXNtX18gKCJlaWVpbyIpOworCXdoaWxlIChpbW1yLT5pbV9jcG0uY3BfY3BjciAmIDB4MDEpOworCisJdXNicC0+dXNjb20gPSAweDQwIHwgMDsKKworCS8qIHJlc2V0IHJpbmcgKi8KKwl0eF9jYmRwID0gKGNiZF90ICopIChlbmRwb2ludHNbZXBpZF0tPnRicHRyICsgQ0ZHX0lNTVIpOworCXR4X2NiZHAtPmNiZF9zYyA9IChUWF9CRF9JIHwgVFhfQkRfVyk7CisKKworCWVuZHBvaW50c1tlcGlkXS0+dHB0ciA9IGVuZHBvaW50c1tlcGlkXS0+dGJhc2U7CisJZW5kcG9pbnRzW2VwaWRdLT50c3RhdGUgPSAweDAwOworCWVuZHBvaW50c1tlcGlkXS0+dGJjbnQgPSAweDAwOworCisJLyogVFggc3RhcnQgKi8KKwlpbW1yLT5pbV9jcG0uY3BfY3BjciA9ICgoZXBpZCA8PCAyKSB8IDB4MkQwMSk7CisJX19hc21fXyAoImVpZWlvIik7CisJd2hpbGUgKGltbXItPmltX2NwbS5jcF9jcGNyICYgMHgwMSk7CisKKwlyZXR1cm47Cit9CisKKy8qIG1wYzh4eF91ZGNfZmx1c2hfcnhfZmlmbworICoKKyAqIEZvciB0aGUgc2FrZSBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIG5hbWVzcGFjZSwgaXQgc2VlbXMgbGlrZQorICogYSBnb29kLWRlc2lnbi1kZWNpc2lvbiAodG0pIHRvIGluY2x1ZGUgbXBjOHh4X3VkY19mbHVzaF9yeF9maWZvKCk7CisgKiBJZiBSWF9CRF9FIGlzIHRydWUgPT4gYSBkcml2ZXIgYnVnIGVpdGhlciBoZXJlIG9yIGluIGFuIHVwcGVyIGxheWVyCisgKiBub3QgcG9sbGluZyBmcmVxdWVudGx5IGVub3VnaC4gSWYgUlhfQkRfRSBpcyB0cnVlIHdlIGhhdmUgdG9sZCB0aGUgaG9zdAorICogd2UgaGF2ZSBhY2NlcHRlZCBkYXRhIGJ1dCwgdGhlIENQTSBmb3VuZCBpdCBoYWQgbm8td2hlcmUgdG8gcHV0IHRoYXQgZGF0YQorICogd2hpY2ggbmVlZGxlc3MgdG8gc2F5IHdvdWxkIGJlIGEgYmFkIHRoaW5nLgorICovCitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX2ZsdXNoX3J4X2ZpZm8gKCkKK3sKKwlpbnQgaSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJaWYgKCEocnhfY2JkW2ldLT5jYmRfc2MgJiBSWF9CRF9FKSkgeworCQkJRVJSICgiYnVmICVwIHVzZWQgcnggZGF0YSBsZW4gPSAweCV4IHNjPTB4JXghXG4iLAorCQkJICAgICByeF9jYmRbaV0sIHJ4X2NiZFtpXS0+Y2JkX2RhdGxlbiwKKwkJCSAgICAgcnhfY2JkW2ldLT5jYmRfc2MpOworCisJCX0KKwl9CisJRVJSICgiQlVHIDogSW5wdXQgb3Zlci1ydW5cbiIpOworfQorCisvKiBtcGM4eHhfdWRjX2NsZWFyX3J4YmQKKyAqCisgKiBSZWxlYXNlIGNvbnRyb2wgb2YgUlggQ0JEIHRvIENQLgorICovCitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX2NsZWFyX3J4YmQgKHZvbGF0aWxlIGNiZF90ICogcnhfY2JkcCkKK3sKKwlyeF9jYmRwLT5jYmRfZGF0bGVuID0gMHgwMDAwOworCXJ4X2NiZHAtPmNiZF9zYyA9ICgocnhfY2JkcC0+Y2JkX3NjICYgUlhfQkRfVykgfCAoUlhfQkRfRSB8IFJYX0JEX0kpKTsKKwlfX2FzbV9fICgiZWllaW8iKTsKK30KKworLyogbXBjOHh4X3VkY190eF9pcnEKKyAqCisgKiBQYXJzZSBmb3IgdHggdGltZW91dCwgY29udHJvbCBSWCBvciBVU0IgcmVzZXQvYnVzeSBjb25kaXRpb25zCisgKiBSZXR1cm4gLTEgb24gdGltZW91dCwgLTIgb24gZmF0YWwgZXJyb3IsIGVsc2UgcmV0dXJuIHplcm8KKyAqLworc3RhdGljIGludCBtcGM4eHhfdWRjX3R4X2lycSAoaW50IGVwKQoreworCWludCBpID0gMDsKKworCWlmICh1c2JwLT51c2JlciAmIChVU0JfVFhfRVJSTUFTSykpIHsKKwkJaWYgKG1wYzh4eF91ZGNfaGFuZGxlX3R4ZXJyICgpKSB7CisJCQkvKiBUaW1lb3V0LCBjb250cm9sbGluZyBmdW5jdGlvbiBtdXN0IHJldHJ5IHNlbmQgKi8KKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWlmICh1c2JwLT51c2JlciAmIChVU0JfRV9SRVNFVCB8IFVTQl9FX0JTWSkpIHsKKwkJLyogRmF0YWwsIGFiYW5kb24gVFggdHJhbnNhY3Rpb24gKi8KKwkJcmV0dXJuIC0yOworCX0KKworCWlmICh1c2JwLT51c2JlciAmIFVTQl9FX1JYQikgeworCQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJCWlmICghKHJ4X2NiZFtpXS0+Y2JkX3NjICYgUlhfQkRfRSkpIHsKKwkJCQlpZiAoKHJ4X2NiZFtpXSA9PSBlcF9yZWZbMF0ucHJ4KSB8fCBlcCkgeworCQkJCQlyZXR1cm4gLTI7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIG1wYzh4eF91ZGNfZXBfdHgKKyAqCisgKiBUcmFuc21pdCBpbiBhIHJlLWVudHJhbnQgZmFzaGlvbiBvdXRib3VuZCBVU0IgcGFja2V0cy4KKyAqIEltcGxlbWVudCByZXRyeS90aW1lb3V0IG1lY2hhbmlzbSBkZXNjcmliZWQgaW4gVVNCIHNwZWNpZmljYXRpb24KKyAqIFRvZ2dsZSBEQVRBMC9EQVRBMSBwaWRzIGFzIG5lY2Vzc2FyeQorICogSW50cm9kdWNlcyBub24tc3RhbmRhcmQgdHhfcmV0cnkuIFRoZSBVU0Igc3RhbmRhcmQgaGFzIG5vIHNjb3BlIGZvciBzbGF2ZQorICogZGV2aWNlcyB0byBnaXZlIHVwIFRYLCBob3dldmVyIHR4X3JldHJ5IHN0b3BzIHVzIGdldHRpbmcgc3R1Y2sgaW4gYW4gZW5kbGVzcworICogVFggbG9vcC4KKyAqLworc3RhdGljIGludCBtcGM4eHhfdWRjX2VwX3R4IChzdHJ1Y3QgdXNiX2VuZHBvaW50X2luc3RhbmNlICplcGkpCit7CisJc3RydWN0IHVyYiAqdXJiID0gZXBpLT50eF91cmI7CisJdm9sYXRpbGUgY2JkX3QgKnR4X2NiZHAgPSAwOworCXVuc2lnbmVkIGludCBlcCA9IDAsIHBrdF9sZW4gPSAwLCB4ID0gMCwgdHhfcmV0cnkgPSAwOworCWludCByZXQgPSAwOworCisJaWYgKCFlcGkgfHwgKGVwaS0+ZW5kcG9pbnRfYWRkcmVzcyAmIDB4MDMpID49IE1BWF9FTkRQT0lOVFMgfHwgIXVyYikgeworCQlyZXR1cm4gLTE7CisJfQorCisJZXAgPSBlcGktPmVuZHBvaW50X2FkZHJlc3MgJiAweDAzOworCXR4X2NiZHAgPSAoY2JkX3QgKikgKGVuZHBvaW50c1tlcF0tPnRicHRyICsgQ0ZHX0lNTVIpOworCisJaWYgKHR4X2NiZHAtPmNiZF9zYyAmIFRYX0JEX1IgfHwgdXNicC0+dXNiZXIgJiBVU0JfRV9UWEIpIHsKKwkJbXBjOHh4X3VkY19mbHVzaF90eF9maWZvIChlcCk7CisJCXVzYnAtPnVzYmVyIHw9IFVTQl9FX1RYQjsKKwl9OworCisJd2hpbGUgKHR4X3JldHJ5KysgPCAxMDApIHsKKwkJcmV0ID0gbXBjOHh4X3VkY190eF9pcnEgKGVwKTsKKwkJaWYgKHJldCA9PSAtMSkgeworCQkJLyogaWdub3JlIHRpbWVvdXQgaGVyZSAqLworCQl9IGVsc2UgaWYgKHJldCA9PSAtMikgeworCQkJLyogQWJhbmRvbiBUWCAqLworCQkJbXBjOHh4X3VkY19mbHVzaF90eF9maWZvIChlcCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQl0eF9jYmRwID0gKGNiZF90ICopIChlbmRwb2ludHNbZXBdLT50YnB0ciArIENGR19JTU1SKTsKKwkJd2hpbGUgKHR4X2NiZHAtPmNiZF9zYyAmIFRYX0JEX1IpIHsKKwkJfTsKKwkJdHhfY2JkcC0+Y2JkX3NjID0gKHR4X2NiZHAtPmNiZF9zYyAmIFRYX0JEX1cpOworCisJCXBrdF9sZW4gPSB1cmItPmFjdHVhbF9sZW5ndGggLSBlcGktPnNlbnQ7CisKKwkJaWYgKHBrdF9sZW4gPiBlcGktPnR4X3BhY2tldFNpemUgfHwgcGt0X2xlbiA+IEVQX01BWF9QS1QpIHsKKwkJCXBrdF9sZW4gPSBNSU4gKGVwaS0+dHhfcGFja2V0U2l6ZSwgRVBfTUFYX1BLVCk7CisJCX0KKworCQlmb3IgKHggPSAwOyB4IDwgcGt0X2xlbjsgeCsrKSB7CisJCQkqKCh1bnNpZ25lZCBjaGFyICopICh0eF9jYmRwLT5jYmRfYnVmYWRkciArIHgpKSA9CisJCQkJdXJiLT5idWZmZXJbZXBpLT5zZW50ICsgeF07CisJCX0KKwkJdHhfY2JkcC0+Y2JkX2RhdGxlbiA9IHBrdF9sZW47CisJCXR4X2NiZHAtPmNiZF9zYyB8PSAoQ0JEX1RYX0JJVE1BU0sgfCBlcF9yZWZbZXBdLnBpZCk7CisJCV9fYXNtX18gKCJlaWVpbyIpOworCisjaWZkZWYgX19TSU1VTEFURV9FUlJPUl9fCisJCWlmICgrK2Vycl9wb2lzb25fdGVzdCA9PSAyKSB7CisJCQllcnJfcG9pc29uX3Rlc3QgPSAwOworCQkJdHhfY2JkcC0+Y2JkX3NjICY9IH5UWF9CRF9UQzsKKwkJfQorI2VuZGlmCisKKwkJdXNicC0+dXNjb20gPSAoVVNDT01fU1RSIHwgZXApOworCisJCXdoaWxlICghKHVzYnAtPnVzYmVyICYgVVNCX0VfVFhCKSkgeworCQkJcmV0ID0gbXBjOHh4X3VkY190eF9pcnEgKGVwKTsKKwkJCWlmIChyZXQgPT0gLTEpIHsKKwkJCQkvKiBUWCB0aW1lb3V0ICovCisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKHJldCA9PSAtMikgeworCQkJCWlmICh1c2JwLT51c2JlciAmIFVTQl9FX1RYQikgeworCQkJCQl1c2JwLT51c2JlciB8PSBVU0JfRV9UWEI7CisJCQkJfQorCQkJCW1wYzh4eF91ZGNfZmx1c2hfdHhfZmlmbyAoZXApOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfTsKKworCQlpZiAodXNicC0+dXNiZXIgJiBVU0JfRV9UWEIpIHsKKwkJCXVzYnAtPnVzYmVyIHw9IFVTQl9FX1RYQjsKKwkJfQorCisJCS8qIEFDSyBtdXN0IGJlIHByZXNlbnQgPD0gMThiaXQgdGltZXMgZnJvbSBUWCAqLworCQlpZiAocmV0ID09IC0xKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFRYIEFDSyA6IFVTQiAyLjAgOC43LjIsIFRvZ2dsZSBQSUQsIEFkdmFuY2UgVFggKi8KKwkJZXBpLT5zZW50ICs9IHBrdF9sZW47CisJCWVwaS0+bGFzdCA9IE1JTiAodXJiLT5hY3R1YWxfbGVuZ3RoIC0gZXBpLT5zZW50LCBlcGktPnR4X3BhY2tldFNpemUpOworCQlUT0dHTEVfVFhfUElEIChlcF9yZWZbZXBdLnBpZCk7CisKKwkJaWYgKGVwaS0+c2VudCA+PSBlcGktPnR4X3VyYi0+YWN0dWFsX2xlbmd0aCkgeworCisJCQllcGktPnR4X3VyYi0+YWN0dWFsX2xlbmd0aCA9IDA7CisJCQllcGktPnNlbnQgPSAwOworCisJCQlpZiAoZXBfcmVmW2VwXS5zYyAmIEVQX1NFTkRfWkxQKSB7CisJCQkJZXBfcmVmW2VwXS5zYyAmPSB+RVBfU0VORF9aTFA7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCisJRVJSICgiVFggZmFpbCwgZW5kcG9pbnQgMHgleCB0eCBieXRlcyAweCV4LzB4JXhcbiIsIGVwLCBlcGktPnNlbnQsCisJICAgICBlcGktPnR4X3VyYi0+YWN0dWFsX2xlbmd0aCk7CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qIG1wYzh4eF91ZGNfZHVtcF9yZXF1ZXN0CisgKgorICogRHVtcCBhIGNvbnRyb2wgcmVxdWVzdCB0byBjb25zb2xlCisgKi8KK3N0YXRpYyB2b2lkIG1wYzh4eF91ZGNfZHVtcF9yZXF1ZXN0IChzdHJ1Y3QgdXNiX2RldmljZV9yZXF1ZXN0ICpyZXF1ZXN0KQoreworCURCRyAoImJtUmVxdWVzdFR5cGU6JTAyeCBiUmVxdWVzdDolMDJ4IHdWYWx1ZTolMDR4ICIKKwkgICAgICJ3SW5kZXg6JTA0eCB3TGVuZ3RoOiUwNHggP1xuIiwKKwkgICAgIHJlcXVlc3QtPmJtUmVxdWVzdFR5cGUsCisJICAgICByZXF1ZXN0LT5iUmVxdWVzdCwKKwkgICAgIHJlcXVlc3QtPndWYWx1ZSwgcmVxdWVzdC0+d0luZGV4LCByZXF1ZXN0LT53TGVuZ3RoKTsKKworCXJldHVybjsKK30KKworLyogbXBjOHh4X3VkY19lcDBfcnhfc2V0dXAKKyAqCisgKiBEZWNvZGUgcmVjZWl2ZWQgZXAwIFNFVFVQIHBhY2tldC4gcmV0dXJuIG5vbi16ZXJvIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgbXBjOHh4X3VkY19lcDBfcnhfc2V0dXAgKHZvbGF0aWxlIGNiZF90ICogcnhfY2JkcCkKK3sKKwl1bnNpZ25lZCBpbnQgeCA9IDA7CisJc3RydWN0IHVyYiAqcHVyYiA9IGVwX3JlZlswXS51cmI7CisJc3RydWN0IHVzYl9lbmRwb2ludF9pbnN0YW5jZSAqZXBpID0KKwkJJnVkY19kZXZpY2UtPmJ1cy0+ZW5kcG9pbnRfYXJyYXlbMF07CisKKwlmb3IgKDsgeCA8IHJ4X2NiZHAtPmNiZF9kYXRsZW47IHgrKykgeworCQkqKCgodW5zaWduZWQgY2hhciAqKSAmZXBfcmVmWzBdLnVyYi0+ZGV2aWNlX3JlcXVlc3QpICsgeCkgPQorCQkJKigodW5zaWduZWQgY2hhciAqKSAocnhfY2JkcC0+Y2JkX2J1ZmFkZHIgKyB4KSk7CisJfQorCisJbXBjOHh4X3VkY19jbGVhcl9yeGJkIChyeF9jYmRwKTsKKworCWlmIChlcDBfcmVjdl9zZXR1cCAocHVyYikpIHsKKwkJbXBjOHh4X3VkY19kdW1wX3JlcXVlc3QgKCZwdXJiLT5kZXZpY2VfcmVxdWVzdCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoKHB1cmItPmRldmljZV9yZXF1ZXN0LmJtUmVxdWVzdFR5cGUgJiBVU0JfUkVRX0RJUkVDVElPTl9NQVNLKQorCSAgICA9PSBVU0JfUkVRX0hPU1QyREVWSUNFKSB7CisKKwkJc3dpdGNoIChwdXJiLT5kZXZpY2VfcmVxdWVzdC5iUmVxdWVzdCkgeworCQljYXNlIFVTQl9SRVFfU0VUX0FERFJFU1M6CisJCQkvKiBTZW5kIHRoZSBTdGF0dXMgT1VUIFpMUCAqLworCQkJZXBfcmVmWzBdLnBpZCA9IFRYX0JEX1BJRF9EQVRBMTsKKwkJCXB1cmItPmFjdHVhbF9sZW5ndGggPSAwOworCQkJbXBjOHh4X3VkY19pbml0X3R4IChlcGksIHB1cmIpOworCQkJbXBjOHh4X3VkY19lcF90eCAoZXBpKTsKKworCQkJLyogTW92ZSB0byB0aGUgYWRkcmVzc2VkIHN0YXRlICovCisJCQl1c2JwLT51c2FkZHIgPSB1ZGNfZGV2aWNlLT5hZGRyZXNzOworCQkJbXBjOHh4X3VkY19zdGF0ZV90cmFuc2l0aW9uX3VwICh1ZGNfZGV2aWNlLT5kZXZpY2Vfc3RhdGUsCisJCQkJCQkJU1RBVEVfQUREUkVTU0VEKTsKKwkJCXJldHVybiAwOworCisJCWNhc2UgVVNCX1JFUV9TRVRfQ09ORklHVVJBVElPTjoKKwkJCWlmICghcHVyYi0+ZGV2aWNlX3JlcXVlc3Qud1ZhbHVlKSB7CisJCQkJLyogUmVzcG9uZCBhdCBkZWZhdWx0IGFkZHJlc3MgKi8KKwkJCQl1c2JwLT51c2FkZHIgPSAweDAwOworCQkJCW1wYzh4eF91ZGNfc3RhdGVfdHJhbnNpdGlvbl9kb3duICh1ZGNfZGV2aWNlLT5kZXZpY2Vfc3RhdGUsCisJCQkJCQkJCSAgU1RBVEVfQUREUkVTU0VEKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogVE9ETzogU3VwcG9ydCBtdWx0aXBsZSBjb25maWd1cmF0aW9ucyAqLworCQkJCW1wYzh4eF91ZGNfc3RhdGVfdHJhbnNpdGlvbl91cCAodWRjX2RldmljZS0+ZGV2aWNlX3N0YXRlLAorCQkJCQkJCQlTVEFURV9DT05GSUdVUkVEKTsKKwkJCQlmb3IgKHggPSAxOyB4IDwgTUFYX0VORFBPSU5UUzsgeCsrKSB7CisJCQkJCWlmICgodWRjX2RldmljZS0+YnVzLT5lbmRwb2ludF9hcnJheVt4XS5lbmRwb2ludF9hZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKQorCQkJCQkgICAgPT0gVVNCX0RJUl9JTikgeworCQkJCQkJZXBfcmVmW3hdLnBpZCA9IFRYX0JEX1BJRF9EQVRBMDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWVwX3JlZlt4XS5waWQgPSBSWF9CRF9QSURfREFUQTA7CisJCQkJCX0KKwkJCQkJLyogU2V0IGNvbmZpZ3VyYXRpb24gbXVzdCB1bnN0YWxsIGVuZHBvaW50cyAqLworCQkJCQl1c2JwLT51c2VwW3hdICY9IH5TVEFMTF9CSVRNQVNLOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogQ0RDL1ZlbmRvciBzcGVjaWZpYyAqLworCQkJYnJlYWs7CisJCX0KKworCQkvKiBTZW5kIFpMUCBhcyBBQ0sgaW4gU3RhdHVzIE9VVCBwaGFzZSAqLworCQllcF9yZWZbMF0ucGlkID0gVFhfQkRfUElEX0RBVEExOworCQlwdXJiLT5hY3R1YWxfbGVuZ3RoID0gMDsKKwkJbXBjOHh4X3VkY19pbml0X3R4IChlcGksIHB1cmIpOworCQltcGM4eHhfdWRjX2VwX3R4IChlcGkpOworCisJfSBlbHNlIHsKKworCQlpZiAocHVyYi0+YWN0dWFsX2xlbmd0aCkgeworCQkJZXBfcmVmWzBdLnBpZCA9IFRYX0JEX1BJRF9EQVRBMTsKKwkJCW1wYzh4eF91ZGNfaW5pdF90eCAoZXBpLCBwdXJiKTsKKworCQkJaWYgKCEocHVyYi0+YWN0dWFsX2xlbmd0aCAlIEVQMF9NQVhfUEFDS0VUX1NJWkUpKSB7CisJCQkJZXBfcmVmWzBdLnNjIHw9IEVQX1NFTkRfWkxQOworCQkJfQorCisJCQlpZiAocHVyYi0+ZGV2aWNlX3JlcXVlc3Qud1ZhbHVlID09CisJCQkgICAgVVNCX0RFU0NSSVBUT1JfVFlQRV9ERVZJQ0UpIHsKKwkJCQlpZiAobGUxNl90b19jcHUgKHB1cmItPmRldmljZV9yZXF1ZXN0LndMZW5ndGgpCisJCQkJICAgID4gcHVyYi0+YWN0dWFsX2xlbmd0aCkgeworCQkJCQkvKiBTZW5kIEVQMF9NQVhfUEFDS0VUX1NJWkUgYnl0ZXMKKwkJCQkJICogdW5sZXNzIGNvcnJlY3Qgc2l6ZSByZXF1ZXN0ZWQuCisJCQkJCSAqLworCQkJCQlpZiAocHVyYi0+YWN0dWFsX2xlbmd0aCA+IGVwaS0+dHhfcGFja2V0U2l6ZSkgeworCQkJCQkJcHVyYi0+YWN0dWFsX2xlbmd0aCA9IGVwaS0+dHhfcGFja2V0U2l6ZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCW1wYzh4eF91ZGNfZXBfdHggKGVwaSk7CisKKwkJfSBlbHNlIHsKKwkJCS8qIENvcnJ1cHQgU0VUVVAgcGFja2V0PyAqLworCQkJRVJSICgiWmVybyBsZW5ndGggZGF0YSBvciBTRVRVUCB3aXRoIERBVEEtSU4gcGhhc2UgP1xuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyogbXBjOHh4X3VkY19pbml0X3R4CisgKgorICogU2V0dXAgc29tZSBiYXNpYyBwYXJhbWV0ZXJzIGZvciBhIFRYIHRyYW5zYWN0aW9uCisgKi8KK3N0YXRpYyB2b2lkIG1wYzh4eF91ZGNfaW5pdF90eCAoc3RydWN0IHVzYl9lbmRwb2ludF9pbnN0YW5jZSAqZXBpLAorCQkJCXN0cnVjdCB1cmIgKnR4X3VyYikKK3sKKwllcGktPnNlbnQgPSAwOworCWVwaS0+bGFzdCA9IDA7CisJZXBpLT50eF91cmIgPSB0eF91cmI7Cit9CisKKy8qIG1wYzh4eF91ZGNfZXAwX3J4CisgKgorICogUmVjZWl2ZSBlcDAvY29udHJvbCBVU0IgZGF0YS4gUGFyc2UgYW5kIHBvc3NpYmx5IHNlbmQgYSByZXNwb25zZS4KKyAqLworc3RhdGljIHZvaWQgbXBjOHh4X3VkY19lcDBfcnggKHZvbGF0aWxlIGNiZF90ICogcnhfY2JkcCkKK3sKKwlpZiAocnhfY2JkcC0+Y2JkX3NjICYgUlhfQkRfUElEX1NFVFVQKSB7CisKKwkJLyogVW5jb25kaXRpb25hbGx5IGFjY2VwdCBTRVRVUCBwYWNrZXRzICovCisJCWlmIChtcGM4eHhfdWRjX2VwMF9yeF9zZXR1cCAocnhfY2JkcCkpIHsKKwkJCW1wYzh4eF91ZGNfc3RhbGwgKDApOworCQl9CisKKwl9IGVsc2UgeworCisJCW1wYzh4eF91ZGNfY2xlYXJfcnhiZCAocnhfY2JkcCk7CisKKwkJaWYgKChyeF9jYmRwLT5jYmRfZGF0bGVuIC0gMikpIHsKKwkJCS8qIFNFVFVQIHdpdGggYSBEQVRBIHBoYXNlCisJCQkgKiBvdXRzaWRlIG9mIFNFVFVQIHBhY2tldC4KKwkJCSAqIFJlcGx5IHdpdGggU1RBTEwuCisJCQkgKi8KKwkJCW1wYzh4eF91ZGNfc3RhbGwgKDApOworCQl9CisJfQorfQorCisvKiBtcGM4eHhfdWRjX2Vwbl9yeAorICoKKyAqIFJlY2VpdmUgc29tZSBkYXRhIGZyb20gY2JkIGludG8gVVNCIHN5c3RlbSB1cmIgZGF0YSBhYnN0cmFjdGlvbgorICogVXBwZXIgbGF5ZXJzIHNob3VsZCBOQUsgaWYgdGhlcmUgaXMgaW5zdWZmaWNpZW50IFJYIGRhdGEgc3BhY2UKKyAqLworc3RhdGljIGludCBtcGM4eHhfdWRjX2Vwbl9yeCAodW5zaWduZWQgaW50IGVwaWQsIHZvbGF0aWxlIGNiZF90ICogcnhfY2JkcCkKK3sKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2luc3RhbmNlICplcGkgPSAwOworCXN0cnVjdCB1cmIgKnVyYiA9IDA7CisJdW5zaWduZWQgaW50IHggPSAwOworCisJaWYgKGVwaWQgPj0gTUFYX0VORFBPSU5UUyB8fCAhcnhfY2JkcC0+Y2JkX2RhdGxlbikgeworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBVU0IgMi4wIFBERiBzZWN0aW9uIDguNi40CisJICogRGlzY2FyZCBkYXRhIHdpdGggaW52YWxpZCBQSUQgaXQgaXMgYSByZXNlbmQuCisJICovCisJaWYgKGVwX3JlZltlcGlkXS5waWQgIT0gKHJ4X2NiZHAtPmNiZF9zYyAmIDB4QzApKSB7CisJCXJldHVybiAxOworCX0KKwlUT0dHTEVfUlhfUElEIChlcF9yZWZbZXBpZF0ucGlkKTsKKworCWVwaSA9ICZ1ZGNfZGV2aWNlLT5idXMtPmVuZHBvaW50X2FycmF5W2VwaWRdOworCXVyYiA9IGVwaS0+cmN2X3VyYjsKKworCWZvciAoOyB4IDwgKHJ4X2NiZHAtPmNiZF9kYXRsZW4gLSAyKTsgeCsrKSB7CisJCSooKHVuc2lnbmVkIGNoYXIgKikgKHVyYi0+YnVmZmVyICsgdXJiLT5hY3R1YWxfbGVuZ3RoICsgeCkpID0KKwkJCSooKHVuc2lnbmVkIGNoYXIgKikgKHJ4X2NiZHAtPmNiZF9idWZhZGRyICsgeCkpOworCX0KKworCWlmICh4KSB7CisJCXVzYmRfcmN2X2NvbXBsZXRlIChlcGksIHgsIDApOworCQlpZiAoZXBfcmVmW2VwaWRdLnVyYi0+c3RhdHVzID09IFJFQ1ZfRVJST1IpIHsKKwkJCURCRyAoIlJYIGVycm9yIHVuc2V0IE5BS1xuIik7CisJCQl1ZGNfdW5zZXRfbmFrIChlcGlkKTsKKwkJfQorCX0KKwlyZXR1cm4geDsKK30KKworLyogbXBjOHh4X3VkY19jbG9ja19pbml0CisgKgorICogT2J0YWluIGEgY2xvY2sgcmVmZXJlbmNlIGZvciBGdWxsIFNwZWVkIFNpZ25hbGluZworICovCitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX2Nsb2NrX2luaXQgKHZvbGF0aWxlIGltbWFwX3QgKiBpbW1yLAorCQkJCSAgIHZvbGF0aWxlIGNwbTh4eF90ICogY3ApCit7CisKKyNpZiBkZWZpbmVkKENGR19VU0JfRVhUQ19DTEspCisKKwkvKiBUaGlzIGhhcyBiZWVuIHRlc3RlZCB3aXRoIGEgNDhNSHogY3J5c3RhbCBvbiBDTEs2ICovCisJc3dpdGNoIChDRkdfVVNCX0VYVENfQ0xLKSB7CisJY2FzZSAxOgorCQlpbW1yLT5pbV9pb3BvcnQuaW9wX3BhcGFyIHw9IDB4MDEwMDsKKwkJaW1tci0+aW1faW9wb3J0LmlvcF9wYWRpciAmPSB+MHgwMTAwOworCQljcC0+Y3Bfc2ljciB8PSAweDI0OworCQlicmVhazsKKwljYXNlIDI6CisJCWltbXItPmltX2lvcG9ydC5pb3BfcGFwYXIgfD0gMHgwMjAwOworCQlpbW1yLT5pbV9pb3BvcnQuaW9wX3BhZGlyICY9IH4weDAyMDA7CisJCWNwLT5jcF9zaWNyIHw9IDB4MkQ7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJaW1tci0+aW1faW9wb3J0LmlvcF9wYXBhciB8PSAweDA0MDA7CisJCWltbXItPmltX2lvcG9ydC5pb3BfcGFkaXIgJj0gfjB4MDQwMDsKKwkJY3AtPmNwX3NpY3IgfD0gMHgzNjsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlpbW1yLT5pbV9pb3BvcnQuaW9wX3BhcGFyIHw9IDB4MDgwMDsKKwkJaW1tci0+aW1faW9wb3J0LmlvcF9wYWRpciAmPSB+MHgwODAwOworCQljcC0+Y3Bfc2ljciB8PSAweDNGOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl1ZGNfc3RhdGUgPSBTVEFURV9FUlJPUjsKKwkJYnJlYWs7CisJfQorCisjZWxpZiBkZWZpbmVkKENGR19VU0JfQlJHQ0xLKQorCisJLyogVGhpcyBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBicmdjbGsgPT0gNTBNSHogKi8KKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKwlpbnQgZGl2aXNvciA9IDA7CisKKwlpZiAoZ2QtPmNwdV9jbGsgPCA0ODAwMDAwMEwpIHsKKwkJRVJSICgiYnJnY2xrIGlzIHRvbyBzbG93IGZvciBmdWxsLXNwZWVkIFVTQiFcbiIpOworCQl1ZGNfc3RhdGUgPSBTVEFURV9FUlJPUjsKKwkJcmV0dXJuOworCX0KKworCS8qIEFzc3VtZSB0aGUgYnJnY2xrIGlzICdnb29kIGVub3VnaCcsIHdlIHdhbnQgIShnZC0+Y3B1X2NsayU0OE1oeikKKwkgKiBidXQsIGNhbiAvcHJvYmFibHkvIGxpdmUgd2l0aCBjbG9zZS1pc2ggYWx0ZXJuYXRpdmUgcmF0ZXMuCisJICovCisJZGl2aXNvciA9IChnZC0+Y3B1X2NsayAvIDQ4MDAwMDAwTCkgLSAxOworCWNwLT5jcF9zaWNyICY9IH4weDAwMDAwMDNGOworCisJc3dpdGNoIChDRkdfVVNCX0JSR0NMSykgeworCWNhc2UgMToKKwkJY3AtPmNwX2JyZ2MxIHw9IChkaXZpc29yIHwgQ1BNX0JSR19FTik7CisJCWNwLT5jcF9zaWNyICY9IH4weDJGOworCQlicmVhazsKKwljYXNlIDI6CisJCWNwLT5jcF9icmdjMiB8PSAoZGl2aXNvciB8IENQTV9CUkdfRU4pOworCQljcC0+Y3Bfc2ljciB8PSAweDAwMDAwMDA5OworCQlicmVhazsKKwljYXNlIDM6CisJCWNwLT5jcF9icmdjMyB8PSAoZGl2aXNvciB8IENQTV9CUkdfRU4pOworCQljcC0+Y3Bfc2ljciB8PSAweDAwMDAwMDEyOworCQlicmVhazsKKwljYXNlIDQ6CisJCWNwLT5jcF9icmdjNCA9IChkaXZpc29yIHwgQ1BNX0JSR19FTik7CisJCWNwLT5jcF9zaWNyIHw9IDB4MDAwMDAwMUI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXVkY19zdGF0ZSA9IFNUQVRFX0VSUk9SOworCQlicmVhazsKKwl9CisKKyNlbHNlCisjZXJyb3IgIkNGR19VU0JfRVhUQ19DTEsgb3IgQ0ZHX1VTQl9CUkdDTEsgbXVzdCBiZSBkZWZpbmVkIgorI2VuZGlmCisKK30KKworLyogbXBjOHh4X3VkY19jYmRfYXR0YWNoCisgKgorICogYXR0YWNoIGEgY2JkIHRvIGFuZCBlbmRwb2ludAorICovCitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX2NiZF9hdHRhY2ggKGludCBlcCwgdWNoYXIgdHhfc2l6ZSwgdWNoYXIgcnhfc2l6ZSkKK3sKKworCWlmICghdHhfY2JkW2VwXSB8fCAhcnhfY2JkW2VwXSB8fCBlcCA+PSBNQVhfRU5EUE9JTlRTKSB7CisJCXVkY19zdGF0ZSA9IFNUQVRFX0VSUk9SOworCQlyZXR1cm47CisJfQorCisJaWYgKHR4X3NpemUgPiBVU0JfTUFYX1BLVCB8fCByeF9zaXplID4gVVNCX01BWF9QS1QgfHwKKwkgICAgKCF0eF9zaXplICYmICFyeF9zaXplKSkgeworCQl1ZGNfc3RhdGUgPSBTVEFURV9FUlJPUjsKKwkJcmV0dXJuOworCX0KKworCS8qIEF0dGFjaCBDQkQgdG8gYXBwcm9waWF0ZSBQYXJhbWV0ZXIgUkFNIEVuZHBvaW50IGRhdGEgc3RydWN0dXJlICovCisJaWYgKHJ4X3NpemUpIHsKKwkJZW5kcG9pbnRzW2VwXS0+cmJhc2UgPSAodTMyKSByeF9jYmRbcnhfY3RdOworCQllbmRwb2ludHNbZXBdLT5yYnB0ciA9ICh1MzIpIHJ4X2NiZFtyeF9jdF07CisJCXJ4X2N0Kys7CisKKwkJaWYgKCFlcCkgeworCisJCQllbmRwb2ludHNbZXBdLT5yYnB0ciA9ICh1MzIpIHJ4X2NiZFtyeF9jdF07CisJCQlyeF9jYmRbcnhfY3RdLT5jYmRfc2MgfD0gUlhfQkRfVzsKKwkJCXJ4X2N0Kys7CisKKwkJfSBlbHNlIHsKKwkJCXJ4X2N0ICs9IDI7CisJCQllbmRwb2ludHNbZXBdLT5yYnB0ciA9ICh1MzIpIHJ4X2NiZFtyeF9jdF07CisJCQlyeF9jYmRbcnhfY3RdLT5jYmRfc2MgfD0gUlhfQkRfVzsKKwkJCXJ4X2N0Kys7CisJCX0KKworCQkvKiBXaGVyZSB3ZSBleHBlY3QgdG8gUlggZGF0YSBvbiB0aGlzIGVuZHBvaW50ICovCisJCWVwX3JlZltlcF0ucHJ4ID0gcnhfY2JkW3J4X2N0IC0gMV07CisJfSBlbHNlIHsKKworCQllcF9yZWZbZXBdLnByeCA9IDA7CisJCWVuZHBvaW50c1tlcF0tPnJiYXNlID0gMDsKKwkJZW5kcG9pbnRzW2VwXS0+cmJwdHIgPSAwOworCX0KKworCWlmICh0eF9zaXplKSB7CisJCWVuZHBvaW50c1tlcF0tPnRiYXNlID0gKHUzMikgdHhfY2JkW3R4X2N0XTsKKwkJZW5kcG9pbnRzW2VwXS0+dGJwdHIgPSAodTMyKSB0eF9jYmRbdHhfY3RdOworCQl0eF9jdCsrOworCX0gZWxzZSB7CisJCWVuZHBvaW50c1tlcF0tPnRiYXNlID0gMDsKKwkJZW5kcG9pbnRzW2VwXS0+dGJwdHIgPSAwOworCX0KKworCWVuZHBvaW50c1tlcF0tPnRzdGF0ZSA9IDA7CisJZW5kcG9pbnRzW2VwXS0+dGJjbnQgPSAwOworCWVuZHBvaW50c1tlcF0tPm1yYmxyID0gRVBfTUFYX1BLVDsKKwllbmRwb2ludHNbZXBdLT5yZmNyID0gMHgxODsKKwllbmRwb2ludHNbZXBdLT50ZmNyID0gMHgxODsKKwllcF9yZWZbZXBdLnNjIHw9IEVQX0FUVEFDSEVEOworCisJREJHICgiZXAgJWQgcmJhc2UgMHglMDh4IHJicHRyIDB4JTA4eCB0YmFzZSAweCUwOHggdGJwdHIgMHglMDh4IHByeCA9ICVwXG4iLAorCQllcCwgZW5kcG9pbnRzW2VwXS0+cmJhc2UsIGVuZHBvaW50c1tlcF0tPnJicHRyLAorCQllbmRwb2ludHNbZXBdLT50YmFzZSwgZW5kcG9pbnRzW2VwXS0+dGJwdHIsCisJCWVwX3JlZltlcF0ucHJ4KTsKKworCXJldHVybjsKK30KKworLyogbXBjOHh4X3VkY19jYmRfaW5pdAorICoKKyAqIEFsbG9jYXRlIHNwYWNlIGZvciBhIGNiZCBhbmQgYWxsb2NhdGUgVFgvUlggZGF0YSBzcGFjZQorICovCitzdGF0aWMgdm9pZCBtcGM4eHhfdWRjX2NiZF9pbml0ICh2b2lkKQoreworCWludCBpID0gMDsKKworCWZvciAoOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJdHhfY2JkW2ldID0gKGNiZF90ICopCisJCQltcGM4eHhfdWRjX2FsbG9jIChzaXplb2YgKGNiZF90KSwgc2l6ZW9mIChpbnQpKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJcnhfY2JkW2ldID0gKGNiZF90ICopCisJCQltcGM4eHhfdWRjX2FsbG9jIChzaXplb2YgKGNiZF90KSwgc2l6ZW9mIChpbnQpKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJdHhfY2JkW2ldLT5jYmRfYnVmYWRkciA9CisJCQltcGM4eHhfdWRjX2FsbG9jIChFUF9NQVhfUEtULCBzaXplb2YgKGludCkpOworCisJCXR4X2NiZFtpXS0+Y2JkX3NjID0gKFRYX0JEX0kgfCBUWF9CRF9XKTsKKwkJdHhfY2JkW2ldLT5jYmRfZGF0bGVuID0gMHgwMDAwOworCX0KKworCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXJ4X2NiZFtpXS0+Y2JkX2J1ZmFkZHIgPQorCQkJbXBjOHh4X3VkY19hbGxvYyAoRVBfTUFYX1BLVCwgc2l6ZW9mIChpbnQpKTsKKwkJcnhfY2JkW2ldLT5jYmRfc2MgPSAoUlhfQkRfSSB8IFJYX0JEX0UpOworCQlyeF9jYmRbaV0tPmNiZF9kYXRsZW4gPSAweDAwMDA7CisKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qIG1wYzh4eF91ZGNfZW5kcG9pbnRfaW5pdAorICoKKyAqIEF0dGFjaCBhbiBlbmRwb2ludCB0byBzb21lIGRwcmFtCisgKi8KK3N0YXRpYyB2b2lkIG1wYzh4eF91ZGNfZW5kcG9pbnRfaW5pdCAodm9pZCkKK3sKKwlpbnQgaSA9IDA7CisKKwlmb3IgKDsgaSA8IE1BWF9FTkRQT0lOVFM7IGkrKykgeworCQllbmRwb2ludHNbaV0gPSAodXNiX2VwYl90ICopCisJCQltcGM4eHhfdWRjX2FsbG9jIChzaXplb2YgKHVzYl9lcGJfdCksIDMyKTsKKwl9Cit9CisKKy8qIG1wYzh4eF91ZGNfYWxsb2MKKyAqCisgKiBHcmFiIHRoZSBhZGRyZXNzIG9mIHNvbWUgZHByYW0KKyAqLworc3RhdGljIHUzMiBtcGM4eHhfdWRjX2FsbG9jICh1MzIgZGF0YV9zaXplLCB1MzIgYWxpZ25tZW50KQoreworCXUzMiByZXRhZGRyID0gYWRkcmVzc19iYXNlOworCisJd2hpbGUgKHJldGFkZHIgJSBhbGlnbm1lbnQpIHsKKwkJcmV0YWRkcisrOworCX0KKwlhZGRyZXNzX2Jhc2UgKz0gZGF0YV9zaXplOworCisJcmV0dXJuIHJldGFkZHI7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfTVBDODg1X0ZBTUlMWSAmJiBDT05GSUdfVVNCX0RFVklDRSkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiZGNvcmVfb21hcDE1MTAuYyBiL2RyaXZlcnMvdXNiZGNvcmVfb21hcDE1MTAuYwppbmRleCAxZDU0YTYzLi44NGJiOTM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYmRjb3JlX29tYXAxNTEwLmMKKysrIGIvZHJpdmVycy91c2JkY29yZV9vbWFwMTUxMC5jCkBAIC0xNTE3LDQgKzE1MTcsMzEgQEAKIAl1ZGNfZW5hYmxlIChkZXZpY2UpOwogfQogCisvKioKKyAqIHVkY19pcnEgLSBkbyBwc2V1ZG8gaW50ZXJydXB0cworICovCit2b2lkIHVkY19pcnEodm9pZCkKK3sKKwkvKiBMb29wIHdoaWxlIHdlIGhhdmUgaW50ZXJydXB0cy4KKwkgKiBJZiB3ZSBkb24ndCBkbyB0aGlzLCB0aGUgaW5wdXQgY2hhaW4KKwkgKiBwb2xsaW5nIGRlbGF5IGlzIGxpa2VseSB0byBtaXNzCisJICogaG9zdCByZXF1ZXN0cy4KKwkgKi8KKwl3aGlsZSAoaW53IChVRENfSVJRX1NSQykgJiB+VURDX1NPRl9GbGcpIHsKKwkJLyogSGFuZGxlIGFueSBuZXcgSVJRcyAqLworCQlvbWFwMTUxMF91ZGNfaXJxICgpOworCQlvbWFwMTUxMF91ZGNfbm9uaXNvX2lycSAoKTsKKwl9Cit9CisKKy8qIEZsb3cgY29udHJvbCAqLwordm9pZCB1ZGNfc2V0X25hayhpbnQgZXBpZCkKK3sKKwkvKiBUT0RPOiBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbmFsaXR5IGluIG9tYXAxNTEwICovCit9CisKK3ZvaWQgdWRjX3Vuc2V0X25hayAoaW50IGVwaWQpCit7CisJLyogVE9ETzogaW1wbGVtZW50IHRoaXMgZnVuY3Rpb25hbGl0eSBpbiBvbWFwMTUxMCAqLworfQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYnR0eS5jIGIvZHJpdmVycy91c2J0dHkuYwppbmRleCBjZTRhMTJlLi5hM2I1MDEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYnR0eS5jCisrKyBiL2RyaXZlcnMvdXNidHR5LmMKQEAgLTIsNiArMiw5IEBACiAgKiAoQykgQ29weXJpZ2h0IDIwMDMKICAqIEdlcnJ5IEhhbWVsLCBnZWhAdGkuY29tLCBUZXhhcyBJbnN0cnVtZW50cwogICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogQnJ5YW4gTydEb25vZ2h1ZSwgYm9kb25vZ2h1ZUBjb2RlaGVybWl0LmllCisgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgpAQCAtMjUsMjAgKzI4LDQyIEBACiAjaW5jbHVkZSA8Y2lyY2J1Zi5oPgogI2luY2x1ZGUgPGRldmljZXMuaD4KICNpbmNsdWRlICJ1c2J0dHkuaCIKKyNpbmNsdWRlICJ1c2JfY2RjX2FjbS5oIgorI2luY2x1ZGUgInVzYmRlc2NyaXB0b3JzLmgiCisjaW5jbHVkZSA8Y29uZmlnLmg+CQkvKiBJZiBkZWZpbmVkLCBvdmVycmlkZSBMaW51eCBpZGVudGlmaWVycyB3aXRoCisJCQkgICAJICogdmVuZG9yIHNwZWNpZmljIG9uZXMgKi8KIAogI2lmIDAKLSNkZWZpbmUgVFRZREJHKGZtdCxhcmdzLi4uKSBzZXJpYWxfcHJpbnRmKCJbJXNdICVzICVkOiAiZm10LCBfX0ZJTEVfXyxfX0ZVTkNUSU9OX18sX19MSU5FX18sIyNhcmdzKQorI2RlZmluZSBUVFlEQkcoZm10LGFyZ3MuLi4pXAorCXNlcmlhbF9wcmludGYoIlslc10gJXMgJWQ6ICJmbXQsIF9fRklMRV9fLF9fRlVOQ1RJT05fXyxfX0xJTkVfXywjI2FyZ3MpCiAjZWxzZQogI2RlZmluZSBUVFlEQkcoZm10LGFyZ3MuLi4pIGRve313aGlsZSgwKQogI2VuZGlmCiAKLSNpZiAwCi0jZGVmaW5lIFRUWUVSUihmbXQsYXJncy4uLikgc2VyaWFsX3ByaW50ZigiRVJST1IhWyVzXSAlcyAlZDogImZtdCwgX19GSUxFX18sX19GVU5DVElPTl9fLF9fTElORV9fLCMjYXJncykKKyNpZiAxCisjZGVmaW5lIFRUWUVSUihmbXQsYXJncy4uLilcCisJc2VyaWFsX3ByaW50ZigiRVJST1IhWyVzXSAlcyAlZDogImZtdCwgX19GSUxFX18sX19GVU5DVElPTl9fLFwKKwlfX0xJTkVfXywjI2FyZ3MpCiAjZWxzZQogI2RlZmluZSBUVFlFUlIoZm10LGFyZ3MuLi4pIGRve313aGlsZSgwKQogI2VuZGlmCiAKIC8qCisgKiBEZWZpbmVzCisgKi8KKyNkZWZpbmUgTlVNX0NPTkZJR1MgICAgMQorI2RlZmluZSBNQVhfSU5URVJGQUNFUyAyCisjZGVmaW5lIE5VTV9FTkRQT0lOVFMgIDMKKyNkZWZpbmUgQUNNX1RYX0VORFBPSU5UIDMKKyNkZWZpbmUgQUNNX1JYX0VORFBPSU5UIDIKKyNkZWZpbmUgR1NFUklBTF9UWF9FTkRQT0lOVCAyCisjZGVmaW5lIEdTRVJJQUxfUlhfRU5EUE9JTlQgMQorI2RlZmluZSBOVU1fQUNNX0lOVEVSRkFDRVMgMgorI2RlZmluZSBOVU1fR1NFUklBTF9JTlRFUkZBQ0VTIDEKKyNkZWZpbmUgQ09ORklHX1VTQkRfREFUQV9JTlRFUkZBQ0VfU1RSICJCdWxrIERhdGEgSW50ZXJmYWNlIgorI2RlZmluZSBDT05GSUdfVVNCRF9DVFJMX0lOVEVSRkFDRV9TVFIgIkNvbnRyb2wgSW50ZXJmYWNlIgorCisvKgogICogQnVmZmVycyB0byBob2xkIGlucHV0IGFuZCBvdXRwdXQgZGF0YQogICovCiAjZGVmaW5lIFVTQlRUWV9CVUZGRVJfU0laRSAyNTYKQEAgLTUwLDE1NyArNzUsMzM2IEBACiAgKiBJbnN0YW5jZSB2YXJpYWJsZXMKICAqLwogc3RhdGljIGRldmljZV90IHVzYnR0eWRldjsKLXN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pbnN0YW5jZQkgZGV2aWNlX2luc3RhbmNlWzFdOwotc3RhdGljIHN0cnVjdCB1c2JfYnVzX2luc3RhbmNlCQkgYnVzX2luc3RhbmNlWzFdOworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2luc3RhbmNlIGRldmljZV9pbnN0YW5jZVsxXTsKK3N0YXRpYyBzdHJ1Y3QgdXNiX2J1c19pbnN0YW5jZSBidXNfaW5zdGFuY2VbMV07CiBzdGF0aWMgc3RydWN0IHVzYl9jb25maWd1cmF0aW9uX2luc3RhbmNlIGNvbmZpZ19pbnN0YW5jZVtOVU1fQ09ORklHU107Ci1zdGF0aWMgc3RydWN0IHVzYl9pbnRlcmZhY2VfaW5zdGFuY2UJIGludGVyZmFjZV9pbnN0YW5jZVtOVU1fSU5URVJGQUNFU107Ci1zdGF0aWMgc3RydWN0IHVzYl9hbHRlcm5hdGVfaW5zdGFuY2UJIGFsdGVybmF0ZV9pbnN0YW5jZVtOVU1fSU5URVJGQUNFU107Ci1zdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9pbnN0YW5jZQkgZW5kcG9pbnRfaW5zdGFuY2VbTlVNX0VORFBPSU5UUysxXTsgLyogb25lIGV4dHJhIGZvciBjb250cm9sIGVuZHBvaW50ICovCi0KLS8qCi0gKiBTdGF0aWMgYWxsb2NhdGlvbiBvZiB1cmJzCi0gKi8KLSNkZWZpbmUgUkVDVl9FTkRQT0lOVCAxCi0jZGVmaW5lIFRYX0VORFBPSU5UIDIKK3N0YXRpYyBzdHJ1Y3QgdXNiX2ludGVyZmFjZV9pbnN0YW5jZSBpbnRlcmZhY2VfaW5zdGFuY2VbTUFYX0lOVEVSRkFDRVNdOworc3RhdGljIHN0cnVjdCB1c2JfYWx0ZXJuYXRlX2luc3RhbmNlIGFsdGVybmF0ZV9pbnN0YW5jZVtNQVhfSU5URVJGQUNFU107CisvKiBvbmUgZXh0cmEgZm9yIGNvbnRyb2wgZW5kcG9pbnQgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2luc3RhbmNlIGVuZHBvaW50X2luc3RhbmNlW05VTV9FTkRQT0lOVFMrMV07CiAKIC8qCiAgKiBHbG9iYWwgZmxhZwogICovCiBpbnQgdXNidHR5X2NvbmZpZ3VyZWRfZmxhZyA9IDA7CiAKLQogLyoKICAqIFNlcmlhbCBudW1iZXIKICAqLwogc3RhdGljIGNoYXIgc2VyaWFsX251bWJlclsxNl07CiAKKwogLyoKLSAqIERlc2NyaXB0b3JzCisgKiBEZXNjcmlwdG9ycywgU3RyaW5ncywgTG9jYWwgdmFyaWFibGVzLgogICovCisKKy8qIGRlZmluZWQgYW5kIHVzZWQgYnkgdXNiZGNvcmVfZXAwLmMgKi8KK2V4dGVybiBzdHJ1Y3QgdXNiX3N0cmluZ19kZXNjcmlwdG9yICoqdXNiX3N0cmluZ3M7CisKKy8qIEluZGljaWVzLCBSZWZlcmVuY2VzICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcnhfZW5kcG9pbnQgPSAwOworc3RhdGljIHVuc2lnbmVkIHNob3J0IHR4X2VuZHBvaW50ID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpbnRlcmZhY2VfY291bnQgPSAwOworc3RhdGljIHN0cnVjdCB1c2Jfc3RyaW5nX2Rlc2NyaXB0b3IgKnVzYnR0eV9zdHJpbmdfdGFibGVbU1RSX0NPVU5UXTsKKworLyogVVNCIERlc2NyaXB0b3IgU3RyaW5ncyAqLwogc3RhdGljIHU4IHdzdHJMYW5nWzRdID0gezQsVVNCX0RUX1NUUklORywweDksMHg0fTsKIHN0YXRpYyB1OCB3c3RyTWFudWZhY3R1cmVyWzIgKyAyKihzaXplb2YoQ09ORklHX1VTQkRfTUFOVUZBQ1RVUkVSKS0xKV07CiBzdGF0aWMgdTggd3N0clByb2R1Y3RbMiArIDIqKHNpemVvZihDT05GSUdfVVNCRF9QUk9EVUNUX05BTUUpLTEpXTsKIHN0YXRpYyB1OCB3c3RyU2VyaWFsWzIgKyAyKihzaXplb2Yoc2VyaWFsX251bWJlcikgLSAxKV07CiBzdGF0aWMgdTggd3N0ckNvbmZpZ3VyYXRpb25bMiArIDIqKHNpemVvZihDT05GSUdfVVNCRF9DT05GSUdVUkFUSU9OX1NUUiktMSldOwotc3RhdGljIHU4IHdzdHJJbnRlcmZhY2VbMiArIDIqKHNpemVvZihDT05GSUdfVVNCRF9JTlRFUkZBQ0VfU1RSKS0xKV07CitzdGF0aWMgdTggd3N0ckRhdGFJbnRlcmZhY2VbMiArIDIqKHNpemVvZihDT05GSUdfVVNCRF9EQVRBX0lOVEVSRkFDRV9TVFIpLTEpXTsKK3N0YXRpYyB1OCB3c3RyQ3RybEludGVyZmFjZVsyICsgMiooc2l6ZW9mKENPTkZJR19VU0JEX0RBVEFfSU5URVJGQUNFX1NUUiktMSldOwogCi1zdGF0aWMgc3RydWN0IHVzYl9zdHJpbmdfZGVzY3JpcHRvciAqdXNidHR5X3N0cmluZ190YWJsZVtdID0gewotICAoc3RydWN0IHVzYl9zdHJpbmdfZGVzY3JpcHRvciopd3N0ckxhbmcsCi0gIChzdHJ1Y3QgdXNiX3N0cmluZ19kZXNjcmlwdG9yKil3c3RyTWFudWZhY3R1cmVyLAotICAoc3RydWN0IHVzYl9zdHJpbmdfZGVzY3JpcHRvciopd3N0clByb2R1Y3QsCi0gIChzdHJ1Y3QgdXNiX3N0cmluZ19kZXNjcmlwdG9yKil3c3RyU2VyaWFsLAotICAoc3RydWN0IHVzYl9zdHJpbmdfZGVzY3JpcHRvciopd3N0ckNvbmZpZ3VyYXRpb24sCi0gIChzdHJ1Y3QgdXNiX3N0cmluZ19kZXNjcmlwdG9yKil3c3RySW50ZXJmYWNlCi19OwotZXh0ZXJuIHN0cnVjdCB1c2Jfc3RyaW5nX2Rlc2NyaXB0b3IgKip1c2Jfc3RyaW5nczsgLyogZGVmaW5lZCBhbmQgdXNlZCBieSBvbWFwMTUxMF9lcDAuYyAqLwotCisvKiBTdGFuZGFyZCBVU0IgRGF0YSBTdHJ1Y3R1cmVzICovCitzdGF0aWMgc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciBpbnRlcmZhY2VfZGVzY3JpcHRvcnNbTUFYX0lOVEVSRkFDRVNdOworc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfZGVzY3JpcHRvcl9wdHJzW05VTV9FTkRQT0lOVFNdOworc3RhdGljIHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yCSpjb25maWd1cmF0aW9uX2Rlc2NyaXB0b3IgPSAwOwogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2Rlc2NyaXB0b3IgZGV2aWNlX2Rlc2NyaXB0b3IgPSB7Ci0gIGJMZW5ndGg6CSAgICAgIHNpemVvZihzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yKSwKLSAgYkRlc2NyaXB0b3JUeXBlOiAgICBVU0JfRFRfREVWSUNFLAotICBiY2RVU0I6CSAgICAgIFVTQl9CQ0RfVkVSU0lPTiwKLSAgYkRldmljZUNsYXNzOgkgICAgICBVU0JUVFlfREVWSUNFX0NMQVNTLAotICBiRGV2aWNlU3ViQ2xhc3M6ICAgIFVTQlRUWV9ERVZJQ0VfU1VCQ0xBU1MsCi0gIGJEZXZpY2VQcm90b2NvbDogICAgVVNCVFRZX0RFVklDRV9QUk9UT0NPTCwKLSAgYk1heFBhY2tldFNpemUwOiAgICBFUDBfTUFYX1BBQ0tFVF9TSVpFLAotICBpZFZlbmRvcjoJICAgICAgQ09ORklHX1VTQkRfVkVORE9SSUQsCi0gIGlkUHJvZHVjdDoJICAgICAgQ09ORklHX1VTQkRfUFJPRFVDVElELAotICBiY2REZXZpY2U6CSAgICAgIFVTQlRUWV9CQ0RfREVWSUNFLAotICBpTWFudWZhY3R1cmVyOiAgICAgIFNUUl9NQU5VRkFDVFVSRVIsCi0gIGlQcm9kdWN0OgkgICAgICBTVFJfUFJPRFVDVCwKLSAgaVNlcmlhbE51bWJlcjogICAgICBTVFJfU0VSSUFMLAotICBiTnVtQ29uZmlndXJhdGlvbnM6IE5VTV9DT05GSUdTCi0gIH07Ci1zdGF0aWMgc3RydWN0IHVzYl9jb25maWd1cmF0aW9uX2Rlc2NyaXB0b3IgY29uZmlnX2Rlc2NyaXB0b3JzW05VTV9DT05GSUdTXSA9IHsKLSAgewotICAgIGJMZW5ndGg6CQkgc2l6ZW9mKHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yKSwKLSAgICBiRGVzY3JpcHRvclR5cGU6CSBVU0JfRFRfQ09ORklHLAotICAgIHdUb3RhbExlbmd0aDoJIChzaXplb2Yoc3RydWN0IHVzYl9jb25maWd1cmF0aW9uX2Rlc2NyaXB0b3IpKk5VTV9DT05GSUdTKSArCi0JCQkgKHNpemVvZihzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yKSpOVU1fSU5URVJGQUNFUykgKwotCQkJIChzaXplb2Yoc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yKSpOVU1fRU5EUE9JTlRTKSwKLSAgICBiTnVtSW50ZXJmYWNlczoJIE5VTV9JTlRFUkZBQ0VTLAotICAgIGJDb25maWd1cmF0aW9uVmFsdWU6IDEsCi0gICAgaUNvbmZpZ3VyYXRpb246CSBTVFJfQ09ORklHLAotICAgIGJtQXR0cmlidXRlczoJIEJNQVRUUklCVVRFX1NFTEZfUE9XRVJFRCB8IEJNQVRUUklCVVRFX1JFU0VSVkVELAotICAgIGJNYXhQb3dlcjoJCSBVU0JUVFlfTUFYUE9XRVIKLSAgfSwKKwkuYkxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yKSwKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0RFVklDRSwKKwkuYmNkVVNCID0gCQljcHVfdG9fbGUxNihVU0JfQkNEX1ZFUlNJT04pLAorCS5iRGV2aWNlU3ViQ2xhc3MgPQkweDAwLAorCS5iRGV2aWNlUHJvdG9jb2wgPQkweDAwLAorCS5iTWF4UGFja2V0U2l6ZTAgPQlFUDBfTUFYX1BBQ0tFVF9TSVpFLAorCS5pZFZlbmRvciA9CQljcHVfdG9fbGUxNihDT05GSUdfVVNCRF9WRU5ET1JJRCksCisJLmJjZERldmljZSA9CQljcHVfdG9fbGUxNihVU0JUVFlfQkNEX0RFVklDRSksCisJLmlNYW51ZmFjdHVyZXIgPQlTVFJfTUFOVUZBQ1RVUkVSLAorCS5pUHJvZHVjdCA9CQlTVFJfUFJPRFVDVCwKKwkuaVNlcmlhbE51bWJlciA9CVNUUl9TRVJJQUwsCisJLmJOdW1Db25maWd1cmF0aW9ucyA9CU5VTV9DT05GSUdTCiB9Owotc3RhdGljIHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgaW50ZXJmYWNlX2Rlc2NyaXB0b3JzW05VTV9JTlRFUkZBQ0VTXSA9IHsKLSAgewotICAgIGJMZW5ndGg6CQkgc2l6ZW9mKHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IpLAotICAgIGJEZXNjcmlwdG9yVHlwZToJIFVTQl9EVF9JTlRFUkZBQ0UsCi0gICAgYkludGVyZmFjZU51bWJlcjoJIDAsCi0gICAgYkFsdGVybmF0ZVNldHRpbmc6CSAwLAotICAgIGJOdW1FbmRwb2ludHM6CSBOVU1fRU5EUE9JTlRTLAotICAgIGJJbnRlcmZhY2VDbGFzczoJIFVTQlRUWV9JTlRFUkZBQ0VfQ0xBU1MsCi0gICAgYkludGVyZmFjZVN1YkNsYXNzOgkgVVNCVFRZX0lOVEVSRkFDRV9TVUJDTEFTUywKLSAgICBiSW50ZXJmYWNlUHJvdG9jb2w6CSBVU0JUVFlfSU5URVJGQUNFX1BST1RPQ09MLAotICAgIGlJbnRlcmZhY2U6CQkgU1RSX0lOVEVSRkFDRQotICB9LAorCisKKy8qCisgKiBTdGF0aWMgQ0RDIEFDTSBzcGVjaWZpYyBkZXNjcmlwdG9ycworICovCisKK3N0cnVjdCBhY21fY29uZmlnX2Rlc2MgeworCXN0cnVjdCB1c2JfY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yIGNvbmZpZ3VyYXRpb25fZGVzYzsKKworCS8qIE1hc3RlciBJbnRlcmZhY2UgKi8KKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yIGludGVyZmFjZV9kZXNjOworCisJc3RydWN0IHVzYl9jbGFzc19oZWFkZXJfZnVuY3Rpb25fZGVzY3JpcHRvciB1c2JfY2xhc3NfaGVhZGVyOworCXN0cnVjdCB1c2JfY2xhc3NfY2FsbF9tYW5hZ2VtZW50X2Rlc2NyaXB0b3IgdXNiX2NsYXNzX2NhbGxfbWd0OworCXN0cnVjdCB1c2JfY2xhc3NfYWJzdHJhY3RfY29udHJvbF9kZXNjcmlwdG9yIHVzYl9jbGFzc19hY207CisJc3RydWN0IHVzYl9jbGFzc191bmlvbl9mdW5jdGlvbl9kZXNjcmlwdG9yIHVzYl9jbGFzc191bmlvbjsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Igbm90aWZpY2F0aW9uX2VuZHBvaW50OworCisJLyogU2xhdmUgSW50ZXJmYWNlICovCisJc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciBkYXRhX2NsYXNzX2ludGVyZmFjZTsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IKKwkJZGF0YV9lbmRwb2ludHNbTlVNX0VORFBPSU5UUy0xXSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0YXRpYyBzdHJ1Y3QgYWNtX2NvbmZpZ19kZXNjIGFjbV9jb25maWd1cmF0aW9uX2Rlc2NyaXB0b3JzW05VTV9DT05GSUdTXSA9IHsKKwl7CisJCS5jb25maWd1cmF0aW9uX2Rlc2MgPXsKKwkJCS5iTGVuZ3RoID0KKwkJCQlzaXplb2Yoc3RydWN0IHVzYl9jb25maWd1cmF0aW9uX2Rlc2NyaXB0b3IpLAorICAgIAkJCS5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfQ09ORklHLAorCQkJLndUb3RhbExlbmd0aCA9CisJCQkJY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBhY21fY29uZmlnX2Rlc2MpKSwKKwkgICAgCQkuYk51bUludGVyZmFjZXMgPSBOVU1fQUNNX0lOVEVSRkFDRVMsCisgICAgCQkJLmJDb25maWd1cmF0aW9uVmFsdWUgPSAxLAorCQkJLmlDb25maWd1cmF0aW9uID0gU1RSX0NPTkZJRywKKwkJCS5ibUF0dHJpYnV0ZXMgPQorCQkJCUJNQVRUUklCVVRFX1NFTEZfUE9XRVJFRHxCTUFUVFJJQlVURV9SRVNFUlZFRCwKKwkJCS5iTWF4UG93ZXIgPSBVU0JUVFlfTUFYUE9XRVIKKwkJfSwKKwkJLyogSW50ZXJmYWNlIDEgKi8KKwkJLmludGVyZmFjZV9kZXNjID0geworCQkJLmJMZW5ndGggID0gc2l6ZW9mKHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IpLAorCQkJLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9JTlRFUkZBQ0UsCisJCQkuYkludGVyZmFjZU51bWJlciA9IDAsCisJCQkuYkFsdGVybmF0ZVNldHRpbmcgPSAwLAorCQkJLmJOdW1FbmRwb2ludHMgPSAweDAxLAorCQkJLmJJbnRlcmZhY2VDbGFzcyA9CisJCQkJQ09NTVVOSUNBVElPTlNfSU5URVJGQUNFX0NMQVNTX0NPTlRST0wsCisJCQkuYkludGVyZmFjZVN1YkNsYXNzID0gQ09NTVVOSUNBVElPTlNfQUNNX1NVQkNMQVNTLAorCQkJLmJJbnRlcmZhY2VQcm90b2NvbCA9IENPTU1VTklDQVRJT05TX1YyNVRFUl9QUk9UT0NPTCwKKwkJCS5pSW50ZXJmYWNlID0gU1RSX0NUUkxfSU5URVJGQUNFLAorCQl9LAorCQkudXNiX2NsYXNzX2hlYWRlciA9IHsKKwkJCS5iRnVuY3Rpb25MZW5ndGgJPQorCQkJCXNpemVvZihzdHJ1Y3QgdXNiX2NsYXNzX2hlYWRlcl9mdW5jdGlvbl9kZXNjcmlwdG9yKSwKKwkJCS5iRGVzY3JpcHRvclR5cGUJPSBDU19JTlRFUkZBQ0UsCisJCQkuYkRlc2NyaXB0b3JTdWJ0eXBlCT0gVVNCX1NUX0hFQURFUiwKKwkJCS5iY2RDREMJPSBjcHVfdG9fbGUxNigxMTApLAorCQl9LAorCQkudXNiX2NsYXNzX2NhbGxfbWd0ID0geworCQkJLmJGdW5jdGlvbkxlbmd0aAk9CisJCQkJc2l6ZW9mKHN0cnVjdCB1c2JfY2xhc3NfY2FsbF9tYW5hZ2VtZW50X2Rlc2NyaXB0b3IpLAorCQkJLmJEZXNjcmlwdG9yVHlwZQk9IENTX0lOVEVSRkFDRSwKKwkJCS5iRGVzY3JpcHRvclN1YnR5cGUJPSBVU0JfU1RfQ01GLAorCQkJLmJtQ2FwYWJpbGl0aWVzCQk9IDB4MDAsCisJCQkuYkRhdGFJbnRlcmZhY2UJCT0gMHgwMSwKKwkJfSwKKwkJLnVzYl9jbGFzc19hY20gPSB7CisJCQkuYkZ1bmN0aW9uTGVuZ3RoCT0KKwkJCQlzaXplb2Yoc3RydWN0IHVzYl9jbGFzc19hYnN0cmFjdF9jb250cm9sX2Rlc2NyaXB0b3IpLAorCQkJLmJEZXNjcmlwdG9yVHlwZQk9IENTX0lOVEVSRkFDRSwKKwkJCS5iRGVzY3JpcHRvclN1YnR5cGUJPSBVU0JfU1RfQUNNRiwKKwkJCS5ibUNhcGFiaWxpdGllcwkJPSAweDAwLAorCQl9LAorCQkudXNiX2NsYXNzX3VuaW9uID0geworCQkJLmJGdW5jdGlvbkxlbmd0aAk9CisJCQkJc2l6ZW9mKHN0cnVjdCB1c2JfY2xhc3NfdW5pb25fZnVuY3Rpb25fZGVzY3JpcHRvciksCisJCQkuYkRlc2NyaXB0b3JUeXBlCT0gQ1NfSU5URVJGQUNFLAorCQkJLmJEZXNjcmlwdG9yU3VidHlwZQk9IFVTQl9TVF9VRiwKKwkJCS5iTWFzdGVySW50ZXJmYWNlCT0gMHgwMCwKKwkJCS5iU2xhdmVJbnRlcmZhY2UwCT0gMHgwMSwKKwkJfSwKKwkJLm5vdGlmaWNhdGlvbl9lbmRwb2ludCA9IHsKKwkJCS5iTGVuZ3RoID0KKwkJCQlzaXplb2Yoc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yKSwKKwkJCS5iRGVzY3JpcHRvclR5cGUJPSBVU0JfRFRfRU5EUE9JTlQsCisJCQkuYkVuZHBvaW50QWRkcmVzcwk9IDB4MDEgfCBVU0JfRElSX0lOLAorCQkJLmJtQXR0cmlidXRlcwkJPSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQsCisJCQkud01heFBhY2tldFNpemUKKwkJCQk9IGNwdV90b19sZTE2KENPTkZJR19VU0JEX1NFUklBTF9JTlRfUEtUU0laRSksCisJCQkuYkludGVydmFsCQk9IDB4RkYsCisJCX0sCisKKwkJLyogSW50ZXJmYWNlIDIgKi8KKwkJLmRhdGFfY2xhc3NfaW50ZXJmYWNlID0geworCQkJLmJMZW5ndGgJCT0KKwkJCQlzaXplb2Yoc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciksCisJCQkuYkRlc2NyaXB0b3JUeXBlCT0gVVNCX0RUX0lOVEVSRkFDRSwKKwkJCS5iSW50ZXJmYWNlTnVtYmVyCT0gMHgwMSwKKwkJCS5iQWx0ZXJuYXRlU2V0dGluZwk9IDB4MDAsCisJCQkuYk51bUVuZHBvaW50cwkJPSAweDAyLAorCQkJLmJJbnRlcmZhY2VDbGFzcwk9CisJCQkJQ09NTVVOSUNBVElPTlNfSU5URVJGQUNFX0NMQVNTX0RBVEEsCisJCQkuYkludGVyZmFjZVN1YkNsYXNzCT0gREFUQV9JTlRFUkZBQ0VfU1VCQ0xBU1NfTk9ORSwKKwkJCS5iSW50ZXJmYWNlUHJvdG9jb2wJPSBEQVRBX0lOVEVSRkFDRV9QUk9UT0NPTF9OT05FLAorCQkJLmlJbnRlcmZhY2UJCT0gU1RSX0RBVEFfSU5URVJGQUNFLAorCQl9LAorCQkuZGF0YV9lbmRwb2ludHMgPSB7CisJCQl7CisJCQkJLmJMZW5ndGgJCT0KKwkJCQkJc2l6ZW9mKHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciksCisJCQkJLmJEZXNjcmlwdG9yVHlwZQk9IFVTQl9EVF9FTkRQT0lOVCwKKwkJCQkuYkVuZHBvaW50QWRkcmVzcwk9IDB4MDIgfCBVU0JfRElSX09VVCwKKwkJCQkuYm1BdHRyaWJ1dGVzCQk9CisJCQkJCVVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCisJCQkJLndNYXhQYWNrZXRTaXplCQk9CisJCQkJCWNwdV90b19sZTE2KENPTkZJR19VU0JEX1NFUklBTF9CVUxLX1BLVFNJWkUpLAorCQkJCS5iSW50ZXJ2YWwJCT0gMHhGRiwKKwkJCX0sCisJCQl7CisJCQkJLmJMZW5ndGgJCT0KKwkJCQkJc2l6ZW9mKHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciksCisJCQkJLmJEZXNjcmlwdG9yVHlwZQk9IFVTQl9EVF9FTkRQT0lOVCwKKwkJCQkuYkVuZHBvaW50QWRkcmVzcwk9IDB4MDMgfCBVU0JfRElSX0lOLAorCQkJCS5ibUF0dHJpYnV0ZXMJCT0KKwkJCQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKKwkJCQkud01heFBhY2tldFNpemUJCT0KKwkJCQkJY3B1X3RvX2xlMTYoQ09ORklHX1VTQkRfU0VSSUFMX0JVTEtfUEtUU0laRSksCisJCQkJLmJJbnRlcnZhbAkJPSAweEZGLAorCQkJfSwKKwkJfSwKKwl9LAogfTsKLXN0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgZXBfZGVzY3JpcHRvcnNbTlVNX0VORFBPSU5UU10gPSB7Ci0gIHsKLSAgICBiTGVuZ3RoOgkJIHNpemVvZihzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IpLAotICAgIGJEZXNjcmlwdG9yVHlwZToJIFVTQl9EVF9FTkRQT0lOVCwKLSAgICBiRW5kcG9pbnRBZGRyZXNzOgkgQ09ORklHX1VTQkRfU0VSSUFMX09VVF9FTkRQT0lOVCB8IFVTQl9ESVJfT1VULAotICAgIGJtQXR0cmlidXRlczoJIFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCi0gICAgd01heFBhY2tldFNpemU6CSBDT05GSUdfVVNCRF9TRVJJQUxfT1VUX1BLVFNJWkUsCi0gICAgYkludGVydmFsOgkJIDAKLSAgfSwKLSAgewotICAgIGJMZW5ndGg6CQkgc2l6ZW9mKHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciksCi0gICAgYkRlc2NyaXB0b3JUeXBlOgkgVVNCX0RUX0VORFBPSU5ULAotICAgIGJFbmRwb2ludEFkZHJlc3M6CSBDT05GSUdfVVNCRF9TRVJJQUxfSU5fRU5EUE9JTlQgfCBVU0JfRElSX0lOLAotICAgIGJtQXR0cmlidXRlczoJIFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCi0gICAgd01heFBhY2tldFNpemU6CSBDT05GSUdfVVNCRF9TRVJJQUxfSU5fUEtUU0laRSwKLSAgICBiSW50ZXJ2YWw6CQkgMAotICB9LAotICB7Ci0gICAgYkxlbmd0aDoJCSBzaXplb2Yoc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yKSwKLSAgICBiRGVzY3JpcHRvclR5cGU6CSBVU0JfRFRfRU5EUE9JTlQsCi0gICAgYkVuZHBvaW50QWRkcmVzczoJIENPTkZJR19VU0JEX1NFUklBTF9JTlRfRU5EUE9JTlQgfCBVU0JfRElSX0lOLAotICAgIGJtQXR0cmlidXRlczoJIFVTQl9FTkRQT0lOVF9YRkVSX0lOVCwKLSAgICB3TWF4UGFja2V0U2l6ZToJIENPTkZJR19VU0JEX1NFUklBTF9JTlRfUEtUU0laRSwKLSAgICBiSW50ZXJ2YWw6CQkgMAotICB9LAorCitzdGF0aWMgc3RydWN0IHJzMjMyX2VtdSByczIzMl9kZXNjPXsKKwkJLmR0ZXIgCQk9ICAJMTE1MjAwLAorCSAgIAkuc3RvcF9iaXRzCT0JMHgwMCwKKwkgICAJLnBhcml0eQkJPQkweDAwLAorCQkuZGF0YV9iaXRzCT0JMHgwOAogfTsKLXN0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwX2Rlc2NyaXB0b3JfcHRyc1tOVU1fRU5EUE9JTlRTXSA9IHsKLSAgJihlcF9kZXNjcmlwdG9yc1swXSksCi0gICYoZXBfZGVzY3JpcHRvcnNbMV0pLAotICAmKGVwX2Rlc2NyaXB0b3JzWzJdKSwKKworCisvKgorICogU3RhdGljIEdlbmVyaWMgU2VyaWFsIHNwZWNpZmljIGRhdGEKKyAqLworCisKK3N0cnVjdCBnc2VyaWFsX2NvbmZpZ19kZXNjIHsKKworCXN0cnVjdCB1c2JfY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yIGNvbmZpZ3VyYXRpb25fZGVzYzsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yCisJCWludGVyZmFjZV9kZXNjW05VTV9HU0VSSUFMX0lOVEVSRkFDRVNdIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgorCQlkYXRhX2VuZHBvaW50c1tOVU1fRU5EUE9JTlRTXSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RhdGljIHN0cnVjdCBnc2VyaWFsX2NvbmZpZ19kZXNjCitnc2VyaWFsX2NvbmZpZ3VyYXRpb25fZGVzY3JpcHRvcnNbTlVNX0NPTkZJR1NdID17CisJeworCQkuY29uZmlndXJhdGlvbl9kZXNjID17CisJCQkuYkxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgdXNiX2NvbmZpZ3VyYXRpb25fZGVzY3JpcHRvciksCisJCQkuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0NPTkZJRywKKwkJCS53VG90YWxMZW5ndGggPQorCQkJCWNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgZ3NlcmlhbF9jb25maWdfZGVzYykpLAorCQkJLmJOdW1JbnRlcmZhY2VzID0gTlVNX0dTRVJJQUxfSU5URVJGQUNFUywKKwkJCS5iQ29uZmlndXJhdGlvblZhbHVlID0gMSwKKwkJCS5pQ29uZmlndXJhdGlvbiA9IFNUUl9DT05GSUcsCisJCQkuYm1BdHRyaWJ1dGVzID0KKwkJCQlCTUFUVFJJQlVURV9TRUxGX1BPV0VSRUR8Qk1BVFRSSUJVVEVfUkVTRVJWRUQsCisJCQkuYk1heFBvd2VyID0gVVNCVFRZX01BWFBPV0VSCisJCX0sCisJCS5pbnRlcmZhY2VfZGVzYyA9IHsKKwkJCXsKKwkJCQkuYkxlbmd0aCAgPQorCQkJCQlzaXplb2Yoc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciksCisJCQkJLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9JTlRFUkZBQ0UsCisJCQkJLmJJbnRlcmZhY2VOdW1iZXIgPSAwLAorCQkJCS5iQWx0ZXJuYXRlU2V0dGluZyA9IDAsCisJCQkJLmJOdW1FbmRwb2ludHMgPSBOVU1fRU5EUE9JTlRTLAorCQkJCS5iSW50ZXJmYWNlQ2xhc3MgPQorCQkJCQlDT01NVU5JQ0FUSU9OU19JTlRFUkZBQ0VfQ0xBU1NfVkVORE9SLAorCQkJCS5iSW50ZXJmYWNlU3ViQ2xhc3MgPQorCQkJCQlDT01NVU5JQ0FUSU9OU19OT19TVUJDTEFTUywKKwkJCQkuYkludGVyZmFjZVByb3RvY29sID0KKwkJCQkJQ09NTVVOSUNBVElPTlNfTk9fUFJPVE9DT0wsCisJCQkJLmlJbnRlcmZhY2UgPSBTVFJfREFUQV9JTlRFUkZBQ0UKKwkJCX0sCisgIAkJfSwKKwkJLmRhdGFfZW5kcG9pbnRzICA9IHsKKwkJCXsKKwkJCQkuYkxlbmd0aCA9CisJCQkJCXNpemVvZihzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IpLAorCQkJCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCisJCQkJLmJFbmRwb2ludEFkZHJlc3MgPQkweDAxIHwgVVNCX0RJUl9PVVQsCisJCQkJLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorCQkJCS53TWF4UGFja2V0U2l6ZSA9CisJCQkJCWNwdV90b19sZTE2KENPTkZJR19VU0JEX1NFUklBTF9PVVRfUEtUU0laRSksCisJCQkJLmJJbnRlcnZhbD0JCTB4RkYsCisJCQl9LAorCQkJeworCQkJCS5iTGVuZ3RoID0KKwkJCQkJc2l6ZW9mKHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciksCisJCQkJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9FTkRQT0lOVCwKKwkJCQkuYkVuZHBvaW50QWRkcmVzcyA9CTB4MDIgfCBVU0JfRElSX0lOLAorCQkJCS5ibUF0dHJpYnV0ZXMgPQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKKwkJCQkud01heFBhY2tldFNpemUgPQorCQkJCQljcHVfdG9fbGUxNihDT05GSUdfVVNCRF9TRVJJQUxfSU5fUEtUU0laRSksCisJCQkJLmJJbnRlcnZhbCA9IAkJMHhGRiwKKwkJCX0sCisJCQl7CisJCQkJLmJMZW5ndGggPQorCQkJCQlzaXplb2Yoc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yKSwKKwkJCQkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0VORFBPSU5ULAorCQkJCS5iRW5kcG9pbnRBZGRyZXNzID0JMHgwMyB8IFVTQl9ESVJfSU4sCisJCQkJLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9JTlQsCisgICAgCQkJCS53TWF4UGFja2V0U2l6ZSA9CisJCQkJCWNwdV90b19sZTE2KENPTkZJR19VU0JEX1NFUklBTF9JTlRfUEtUU0laRSksCisJCQkJLmJJbnRlcnZhbCA9CQkweEZGLAorCQkJfSwKKwkJfSwKKwl9LAogfTsKIAorLyoKKyAqIFN0YXRpYyBGdW5jdGlvbiBQcm90b3R5cGVzCisgKi8KKworc3RhdGljIHZvaWQgdXNidHR5X2luaXRfc3RyaW5ncyAodm9pZCk7CitzdGF0aWMgdm9pZCB1c2J0dHlfaW5pdF9pbnN0YW5jZXMgKHZvaWQpOworc3RhdGljIHZvaWQgdXNidHR5X2luaXRfZW5kcG9pbnRzICh2b2lkKTsKK3N0YXRpYyB2b2lkIHVzYnR0eV9pbml0X3Rlcm1pbmFsX3R5cGUoc2hvcnQgdHlwZSk7CitzdGF0aWMgdm9pZCB1c2J0dHlfZXZlbnRfaGFuZGxlciAoc3RydWN0IHVzYl9kZXZpY2VfaW5zdGFuY2UgKmRldmljZSwKKwkJCQl1c2JfZGV2aWNlX2V2ZW50X3QgZXZlbnQsIGludCBkYXRhKTsKK3N0YXRpYyBpbnQgdXNidHR5X2NkY19zZXR1cChzdHJ1Y3QgdXNiX2RldmljZV9yZXF1ZXN0ICpyZXF1ZXN0LAorCQkJCXN0cnVjdCB1cmIgKnVyYik7CitzdGF0aWMgaW50IHVzYnR0eV9jb25maWd1cmVkICh2b2lkKTsKK3N0YXRpYyBpbnQgd3JpdGVfYnVmZmVyIChjaXJjYnVmX3QgKiBidWYpOworc3RhdGljIGludCBmaWxsX2J1ZmZlciAoY2lyY2J1Zl90ICogYnVmKTsKKwordm9pZCB1c2J0dHlfcG9sbCAodm9pZCk7CisKIC8qIHV0aWxpdHkgZnVuY3Rpb24gZm9yIGNvbnZlcnRpbmcgY2hhciogdG8gd2lkZSBzdHJpbmcgdXNlZCBieSBVU0IgKi8KIHN0YXRpYyB2b2lkIHN0cjJ3aWRlIChjaGFyICpzdHIsIHUxNiAqIHdpZGUpCiB7CiAJaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc3RybGVuIChzdHIpICYmIHN0cltpXTsgaSsrKQotCQl3aWRlW2ldID0gKHUxNikgc3RyW2ldOworCWZvciAoaSA9IDA7IGkgPCBzdHJsZW4gKHN0cikgJiYgc3RyW2ldOyBpKyspeworCQkjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJCQl3aWRlW2ldID0gKHUxNikgc3RyW2ldOworCQkjZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKwkJCXdpZGVbaV0gPSAoKHUxNikoc3RyW2ldKTw8OCk7CisJCSNlbHNlCisJCQkjZXJyb3IgIl9fTElUVExFX0VORElBTiBvciBfX0JJR19FTkRJQU4gdW5kZWZpbmVkIgorCQkjZW5kaWYKKwl9CiB9CiAKIC8qCi0gKiBQcm90b3R5cGVzCi0gKi8KLXN0YXRpYyB2b2lkIHVzYnR0eV9pbml0X3N0cmluZ3MgKHZvaWQpOwotc3RhdGljIHZvaWQgdXNidHR5X2luaXRfaW5zdGFuY2VzICh2b2lkKTsKLXN0YXRpYyB2b2lkIHVzYnR0eV9pbml0X2VuZHBvaW50cyAodm9pZCk7Ci0KLXN0YXRpYyB2b2lkIHVzYnR0eV9ldmVudF9oYW5kbGVyIChzdHJ1Y3QgdXNiX2RldmljZV9pbnN0YW5jZSAqZGV2aWNlLAotCQkJCSAgdXNiX2RldmljZV9ldmVudF90IGV2ZW50LCBpbnQgZGF0YSk7Ci1zdGF0aWMgaW50IHVzYnR0eV9jb25maWd1cmVkICh2b2lkKTsKLQotc3RhdGljIGludCB3cml0ZV9idWZmZXIgKGNpcmNidWZfdCAqIGJ1Zik7Ci1zdGF0aWMgaW50IGZpbGxfYnVmZmVyIChjaXJjYnVmX3QgKiBidWYpOwotCi12b2lkIHVzYnR0eV9wb2xsICh2b2lkKTsKLXN0YXRpYyB2b2lkIHByZXRlbmRfaW50ZXJydXB0cyAodm9pZCk7Ci0KLQotLyoKICAqIFRlc3Qgd2hldGhlciBhIGNoYXJhY3RlciBpcyBpbiB0aGUgUlggYnVmZmVyCiAgKi8KKwogaW50IHVzYnR0eV90c3RjICh2b2lkKQogeworCXN0cnVjdCB1c2JfZW5kcG9pbnRfaW5zdGFuY2UgKmVuZHBvaW50ID0KKwkJJmVuZHBvaW50X2luc3RhbmNlW3J4X2VuZHBvaW50XTsKKworCS8qIElmIG5vIGlucHV0IGRhdGEgZXhpc3RzLCBhbGxvdyBtb3JlIFJYIHRvIGJlIGFjY2VwdGVkICovCisJaWYodXNidHR5X2lucHV0LnNpemUgPD0gMCl7CisJCXVkY191bnNldF9uYWsoZW5kcG9pbnQtPmVuZHBvaW50X2FkZHJlc3MmMHgwMyk7CisJfQorCiAJdXNidHR5X3BvbGwgKCk7CiAJcmV0dXJuICh1c2J0dHlfaW5wdXQuc2l6ZSA+IDApOwogfQpAQCAtMjEwLDE1ICs0MTQsMjEgQEAKICAqIG90aGVyd2lzZS4gV2hlbiB0aGUgZnVuY3Rpb24gaXMgc3VjY2VzZnVsbCwgdGhlIGNoYXJhY3RlciByZWFkIGlzCiAgKiB3cml0dGVuIGludG8gaXRzIGFyZ3VtZW50IGMuCiAgKi8KKwogaW50IHVzYnR0eV9nZXRjICh2b2lkKQogewogCWNoYXIgYzsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2luc3RhbmNlICplbmRwb2ludCA9CisJCSZlbmRwb2ludF9pbnN0YW5jZVtyeF9lbmRwb2ludF07CiAKIAl3aGlsZSAodXNidHR5X2lucHV0LnNpemUgPD0gMCkgeworCQl1ZGNfdW5zZXRfbmFrKGVuZHBvaW50LT5lbmRwb2ludF9hZGRyZXNzJjB4MDMpOwogCQl1c2J0dHlfcG9sbCAoKTsKIAl9CiAKIAlidWZfcG9wICgmdXNidHR5X2lucHV0LCAmYywgMSk7CisJdWRjX3NldF9uYWsoZW5kcG9pbnQtPmVuZHBvaW50X2FkZHJlc3MmMHgwMyk7CisKIAlyZXR1cm4gYzsKIH0KIApAQCAtMjM4LDcgKzQ0OCw2IEBACiAJfQogfQogCi0KIC8qIHVzYnR0eV9wdXRzKCkgaGVscGVyIGZ1bmN0aW9uIGZvciBmaW5kaW5nIHRoZSBuZXh0ICdcbicgaW4gYSBzdHJpbmcgKi8KIHN0YXRpYyBpbnQgbmV4dF9ubF9wb3MgKGNvbnN0IGNoYXIgKnMpCiB7CkBAIC0yNTIsOCArNDYxLDkgQEAKIH0KIAogLyoKLSAqIE91dHB1dCBhIHN0cmluZyB0byB0aGUgdXNiIGNsaWVudCBwb3J0LgorICogT3V0cHV0IGEgc3RyaW5nIHRvIHRoZSB1c2IgY2xpZW50IHBvcnQgLSBpbXBsZW1lbnRpbmcgZmxvdyBjb250cm9sCiAgKi8KKwogc3RhdGljIHZvaWQgX191c2J0dHlfcHV0cyAoY29uc3QgY2hhciAqc3RyLCBpbnQgbGVuKQogewogCWludCBtYXhsZW4gPSB1c2J0dHlfb3V0cHV0LnRvdGFsc2l6ZTsKQEAgLTI2MSwyMiArNDcxLDE5IEBACiAKIAkvKiBicmVhayBzdHIgaW50byBjaHVua3MgPCBidWZmZXIgc2l6ZSwgaWYgbmVlZGVkICovCiAJd2hpbGUgKGxlbiA+IDApIHsKKwkJdXNidHR5X3BvbGwgKCk7CisKIAkJc3BhY2UgPSBtYXhsZW4gLSB1c2J0dHlfb3V0cHV0LnNpemU7Ci0KIAkJLyogRW1wdHkgYnVmZmVyIGhlcmUsIGlmIG5lZWRlZCwgdG8gZW5zdXJlIHNwYWNlLi4uICovCi0JCWlmIChzcGFjZSA8PSAwKSB7CisJCWlmIChzcGFjZSkgewogCQkJd3JpdGVfYnVmZmVyICgmdXNidHR5X291dHB1dCk7Ci0JCQlzcGFjZSA9IG1heGxlbiAtIHVzYnR0eV9vdXRwdXQuc2l6ZTsKLQkJCWlmIChzcGFjZSA8PSAwKSB7Ci0JCQkJc3BhY2UgPSBsZW47CS8qIGFsbG93IG9sZCBkYXRhIHRvIGJlIG92ZXJ3cml0dGVuLiAqLwotCQkJfQorCisJCQluID0gTUlOIChzcGFjZSwgTUlOIChsZW4sIG1heGxlbikpOworCQkJYnVmX3B1c2ggKCZ1c2J0dHlfb3V0cHV0LCBzdHIsIG4pOworCisJCQlzdHIgKz0gbjsKKwkJCWxlbiAtPSBuOwogCQl9Ci0KLQkJbiA9IE1JTiAoc3BhY2UsIE1JTiAobGVuLCBtYXhsZW4pKTsKLQkJYnVmX3B1c2ggKCZ1c2J0dHlfb3V0cHV0LCBzdHIsIG4pOwotCi0JCXN0ciArPSBuOwotCQlsZW4gLT0gbjsKIAl9CiB9CiAKQEAgLTMxMyw4ICs1MjAsMTAgQEAKIHsKIAlpbnQgcmM7CiAJY2hhciAqIHNuOworCWNoYXIgKiB0dDsKIAlpbnQgc25sZW47CiAKKwkvKiBHZXIgc2VpcmFsIG51bWJlciAqLwogCWlmICghKHNuID0gZ2V0ZW52KCJzZXJpYWwjIikpKSB7CiAJCXNuID0gIjAwMDAwMDAwMDAwMCI7CiAJfQpAQCAtMzI3LDYgKzUzNiwxNCBAQAogCW1lbWNweSAoc2VyaWFsX251bWJlciwgc24sIHNubGVuKTsKIAlzZXJpYWxfbnVtYmVyW3NubGVuXSA9ICdcMCc7CiAKKwkvKiBEZWNpZGUgb24gd2hpY2ggdHlwZSBvZiBVREMgZGV2aWNlIHRvIGJlLgorCSAqLworCisJaWYoISh0dCA9IGdldGVudigidXNidHR5IikpKSB7CisJCXR0ID0gImdlbmVyaWMiOworCX0KKwl1c2J0dHlfaW5pdF90ZXJtaW5hbF90eXBlKHN0cmNtcCh0dCwiY2RjX2FjbSIpKTsKKwogCS8qIHByZXBhcmUgYnVmZmVycy4uLiAqLwogCWJ1Zl9pbml0ICgmdXNidHR5X2lucHV0LCBVU0JUVFlfQlVGRkVSX1NJWkUpOwogCWJ1Zl9pbml0ICgmdXNidHR5X291dHB1dCwgVVNCVFRZX0JVRkZFUl9TSVpFKTsKQEAgLTMzNyw3ICs1NTQsNyBAQAogCXVzYnR0eV9pbml0X3N0cmluZ3MgKCk7CiAJdXNidHR5X2luaXRfaW5zdGFuY2VzICgpOwogCi0JdWRjX3N0YXJ0dXBfZXZlbnRzIChkZXZpY2VfaW5zdGFuY2UpOwkvKiBFbmFibGUgb3VyIGRldmljZSwgaW5pdGlhbGl6ZSB1ZGMgcG9pbnRlcnMgKi8KKwl1ZGNfc3RhcnR1cF9ldmVudHMgKGRldmljZV9pbnN0YW5jZSk7LyogRW5hYmxlIGRldiwgaW5pdCB1ZGMgcG9pbnRlcnMgKi8KIAl1ZGNfY29ubmVjdCAoKTsJCS8qIEVuYWJsZSBwdWxsdXAgZm9yIGhvc3QgZGV0ZWN0aW9uICovCiAKIAl1c2J0dHlfaW5pdF9lbmRwb2ludHMgKCk7CkBAIC0zNjIsMzAgKzU3OSw0OCBAQAogewogCXN0cnVjdCB1c2Jfc3RyaW5nX2Rlc2NyaXB0b3IgKnN0cmluZzsKIAorCXVzYnR0eV9zdHJpbmdfdGFibGVbU1RSX0xBTkddID0KKwkJKHN0cnVjdCB1c2Jfc3RyaW5nX2Rlc2NyaXB0b3IqKXdzdHJMYW5nOworCiAJc3RyaW5nID0gKHN0cnVjdCB1c2Jfc3RyaW5nX2Rlc2NyaXB0b3IgKikgd3N0ck1hbnVmYWN0dXJlcjsKLQlzdHJpbmctPmJMZW5ndGggPSBzaXplb2YgKHdzdHJNYW51ZmFjdHVyZXIpOworCXN0cmluZy0+Ykxlbmd0aCA9IHNpemVvZih3c3RyTWFudWZhY3R1cmVyKTsKIAlzdHJpbmctPmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9TVFJJTkc7CiAJc3RyMndpZGUgKENPTkZJR19VU0JEX01BTlVGQUNUVVJFUiwgc3RyaW5nLT53RGF0YSk7CisJdXNidHR5X3N0cmluZ190YWJsZVtTVFJfTUFOVUZBQ1RVUkVSXT1zdHJpbmc7CisKIAogCXN0cmluZyA9IChzdHJ1Y3QgdXNiX3N0cmluZ19kZXNjcmlwdG9yICopIHdzdHJQcm9kdWN0OwotCXN0cmluZy0+Ykxlbmd0aCA9IHNpemVvZiAod3N0clByb2R1Y3QpOworCXN0cmluZy0+Ykxlbmd0aCA9IHNpemVvZih3c3RyUHJvZHVjdCk7CiAJc3RyaW5nLT5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfU1RSSU5HOwogCXN0cjJ3aWRlIChDT05GSUdfVVNCRF9QUk9EVUNUX05BTUUsIHN0cmluZy0+d0RhdGEpOworCXVzYnR0eV9zdHJpbmdfdGFibGVbU1RSX1BST0RVQ1RdPXN0cmluZzsKKwogCiAJc3RyaW5nID0gKHN0cnVjdCB1c2Jfc3RyaW5nX2Rlc2NyaXB0b3IgKikgd3N0clNlcmlhbDsKLQlzdHJpbmctPmJMZW5ndGggPSAyICsgMipzdHJsZW4oc2VyaWFsX251bWJlcik7CisJc3RyaW5nLT5iTGVuZ3RoID0gc2l6ZW9mKHNlcmlhbF9udW1iZXIpOwogCXN0cmluZy0+YkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX1NUUklORzsKIAlzdHIyd2lkZSAoc2VyaWFsX251bWJlciwgc3RyaW5nLT53RGF0YSk7CisJdXNidHR5X3N0cmluZ190YWJsZVtTVFJfU0VSSUFMXT1zdHJpbmc7CisKIAogCXN0cmluZyA9IChzdHJ1Y3QgdXNiX3N0cmluZ19kZXNjcmlwdG9yICopIHdzdHJDb25maWd1cmF0aW9uOwotCXN0cmluZy0+Ykxlbmd0aCA9IHNpemVvZiAod3N0ckNvbmZpZ3VyYXRpb24pOworCXN0cmluZy0+Ykxlbmd0aCA9IHNpemVvZih3c3RyQ29uZmlndXJhdGlvbik7CiAJc3RyaW5nLT5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfU1RSSU5HOwogCXN0cjJ3aWRlIChDT05GSUdfVVNCRF9DT05GSUdVUkFUSU9OX1NUUiwgc3RyaW5nLT53RGF0YSk7CisJdXNidHR5X3N0cmluZ190YWJsZVtTVFJfQ09ORklHXT1zdHJpbmc7CiAKLQlzdHJpbmcgPSAoc3RydWN0IHVzYl9zdHJpbmdfZGVzY3JpcHRvciAqKSB3c3RySW50ZXJmYWNlOwotCXN0cmluZy0+Ykxlbmd0aCA9IHNpemVvZiAod3N0ckludGVyZmFjZSk7CisKKwlzdHJpbmcgPSAoc3RydWN0IHVzYl9zdHJpbmdfZGVzY3JpcHRvciAqKSB3c3RyRGF0YUludGVyZmFjZTsKKwlzdHJpbmctPmJMZW5ndGggPSBzaXplb2Yod3N0ckRhdGFJbnRlcmZhY2UpOwogCXN0cmluZy0+YkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX1NUUklORzsKLQlzdHIyd2lkZSAoQ09ORklHX1VTQkRfSU5URVJGQUNFX1NUUiwgc3RyaW5nLT53RGF0YSk7CisJc3RyMndpZGUgKENPTkZJR19VU0JEX0RBVEFfSU5URVJGQUNFX1NUUiwgc3RyaW5nLT53RGF0YSk7CisJdXNidHR5X3N0cmluZ190YWJsZVtTVFJfREFUQV9JTlRFUkZBQ0VdPXN0cmluZzsKKworCXN0cmluZyA9IChzdHJ1Y3QgdXNiX3N0cmluZ19kZXNjcmlwdG9yICopIHdzdHJDdHJsSW50ZXJmYWNlOworCXN0cmluZy0+Ykxlbmd0aCA9IHNpemVvZih3c3RyQ3RybEludGVyZmFjZSk7CisJc3RyaW5nLT5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfU1RSSU5HOworCXN0cjJ3aWRlIChDT05GSUdfVVNCRF9DVFJMX0lOVEVSRkFDRV9TVFIsIHN0cmluZy0+d0RhdGEpOworCXVzYnR0eV9zdHJpbmdfdGFibGVbU1RSX0NUUkxfSU5URVJGQUNFXT1zdHJpbmc7CiAKIAkvKiBOb3csIGluaXRpYWxpemUgdGhlIHN0cmluZyB0YWJsZSBmb3IgZXAwIGhhbmRsaW5nICovCiAJdXNiX3N0cmluZ3MgPSB1c2J0dHlfc3RyaW5nX3RhYmxlOwpAQCAtNDAwLDYgKzYzNSw3IEBACiAJZGV2aWNlX2luc3RhbmNlLT5kZXZpY2Vfc3RhdGUgPSBTVEFURV9JTklUOwogCWRldmljZV9pbnN0YW5jZS0+ZGV2aWNlX2Rlc2NyaXB0b3IgPSAmZGV2aWNlX2Rlc2NyaXB0b3I7CiAJZGV2aWNlX2luc3RhbmNlLT5ldmVudCA9IHVzYnR0eV9ldmVudF9oYW5kbGVyOworCWRldmljZV9pbnN0YW5jZS0+Y2RjX3JlY3Zfc2V0dXAgPSB1c2J0dHlfY2RjX3NldHVwOwogCWRldmljZV9pbnN0YW5jZS0+YnVzID0gYnVzX2luc3RhbmNlOwogCWRldmljZV9pbnN0YW5jZS0+Y29uZmlndXJhdGlvbnMgPSBOVU1fQ09ORklHUzsKIAlkZXZpY2VfaW5zdGFuY2UtPmNvbmZpZ3VyYXRpb25faW5zdGFuY2VfYXJyYXkgPSBjb25maWdfaW5zdGFuY2U7CkBAIC00MTUsOCArNjUxLDggQEAKIAkvKiBjb25maWd1cmF0aW9uIGluc3RhbmNlICovCiAJbWVtc2V0IChjb25maWdfaW5zdGFuY2UsIDAsCiAJCXNpemVvZiAoc3RydWN0IHVzYl9jb25maWd1cmF0aW9uX2luc3RhbmNlKSk7Ci0JY29uZmlnX2luc3RhbmNlLT5pbnRlcmZhY2VzID0gTlVNX0lOVEVSRkFDRVM7Ci0JY29uZmlnX2luc3RhbmNlLT5jb25maWd1cmF0aW9uX2Rlc2NyaXB0b3IgPSBjb25maWdfZGVzY3JpcHRvcnM7CisJY29uZmlnX2luc3RhbmNlLT5pbnRlcmZhY2VzID0gaW50ZXJmYWNlX2NvdW50OworCWNvbmZpZ19pbnN0YW5jZS0+Y29uZmlndXJhdGlvbl9kZXNjcmlwdG9yID0gY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yOwogCWNvbmZpZ19pbnN0YW5jZS0+aW50ZXJmYWNlX2luc3RhbmNlX2FycmF5ID0gaW50ZXJmYWNlX2luc3RhbmNlOwogCiAJLyogaW50ZXJmYWNlIGluc3RhbmNlICovCkBAIC00NDcsMTcgKzY4MywyMiBAQAogCQkJc2l6ZW9mIChzdHJ1Y3QgdXNiX2VuZHBvaW50X2luc3RhbmNlKSk7CiAKIAkJZW5kcG9pbnRfaW5zdGFuY2VbaV0uZW5kcG9pbnRfYWRkcmVzcyA9Ci0JCQllcF9kZXNjcmlwdG9yc1tpIC0gMV0uYkVuZHBvaW50QWRkcmVzczsKKwkJCWVwX2Rlc2NyaXB0b3JfcHRyc1tpIC0gMV0tPmJFbmRwb2ludEFkZHJlc3M7CisKKwkJZW5kcG9pbnRfaW5zdGFuY2VbaV0ucmN2X2F0dHJpYnV0ZXMgPQorCQkJZXBfZGVzY3JpcHRvcl9wdHJzW2kgLSAxXS0+Ym1BdHRyaWJ1dGVzOwogCiAJCWVuZHBvaW50X2luc3RhbmNlW2ldLnJjdl9wYWNrZXRTaXplID0KLQkJCWVwX2Rlc2NyaXB0b3JzW2kgLSAxXS53TWF4UGFja2V0U2l6ZTsKLQkJZW5kcG9pbnRfaW5zdGFuY2VbaV0ucmN2X2F0dHJpYnV0ZXMgPQotCQkJZXBfZGVzY3JpcHRvcnNbaSAtIDFdLmJtQXR0cmlidXRlczsKKwkJCWxlMTZfdG9fY3B1KGVwX2Rlc2NyaXB0b3JfcHRyc1tpIC0gMV0tPndNYXhQYWNrZXRTaXplKTsKKworCQllbmRwb2ludF9pbnN0YW5jZVtpXS50eF9hdHRyaWJ1dGVzID0KKwkJCWVwX2Rlc2NyaXB0b3JfcHRyc1tpIC0gMV0tPmJtQXR0cmlidXRlczsKIAogCQllbmRwb2ludF9pbnN0YW5jZVtpXS50eF9wYWNrZXRTaXplID0KLQkJCWVwX2Rlc2NyaXB0b3JzW2kgLSAxXS53TWF4UGFja2V0U2l6ZTsKKwkJCWxlMTZfdG9fY3B1KGVwX2Rlc2NyaXB0b3JfcHRyc1tpIC0gMV0tPndNYXhQYWNrZXRTaXplKTsKKwogCQllbmRwb2ludF9pbnN0YW5jZVtpXS50eF9hdHRyaWJ1dGVzID0KLQkJCWVwX2Rlc2NyaXB0b3JzW2kgLSAxXS5ibUF0dHJpYnV0ZXM7CisJCQllcF9kZXNjcmlwdG9yX3B0cnNbaSAtIDFdLT5ibUF0dHJpYnV0ZXM7CiAKIAkJdXJiX2xpbmtfaW5pdCAoJmVuZHBvaW50X2luc3RhbmNlW2ldLnJjdik7CiAJCXVyYl9saW5rX2luaXQgKCZlbmRwb2ludF9pbnN0YW5jZVtpXS5yZHkpOwpAQCAtNDgwLDEzICs3MjEsNzkgQEAKIAlpbnQgaTsKIAogCWJ1c19pbnN0YW5jZS0+bWF4X2VuZHBvaW50cyA9IE5VTV9FTkRQT0lOVFMgKyAxOwotCWZvciAoaSA9IDA7IGkgPD0gTlVNX0VORFBPSU5UUzsgaSsrKSB7CisJZm9yIChpID0gMTsgaSA8PSBOVU1fRU5EUE9JTlRTOyBpKyspIHsKIAkJdWRjX3NldHVwX2VwIChkZXZpY2VfaW5zdGFuY2UsIGksICZlbmRwb2ludF9pbnN0YW5jZVtpXSk7CiAJfQogfQogCisvKiB1c2J0dHlfaW5pdF90ZXJtaW5hbF90eXBlCisgKgorICogRG8gc29tZSBsYXRlIGJpbmRpbmcgZm9yIG91ciBkZXZpY2UgdHlwZS4KKyAqLworc3RhdGljIHZvaWQgdXNidHR5X2luaXRfdGVybWluYWxfdHlwZShzaG9ydCB0eXBlKQoreworCXN3aXRjaCh0eXBlKXsKKwkJLyogQ0RDIEFDTSAqLworCQljYXNlIDA6CisJCQkvKiBBc3NpZ24gZW5kcG9pbnQgZGVzY3JpcHRvcnMgKi8KKwkJCWVwX2Rlc2NyaXB0b3JfcHRyc1swXSA9CisJCQkJJmFjbV9jb25maWd1cmF0aW9uX2Rlc2NyaXB0b3JzWzBdLm5vdGlmaWNhdGlvbl9lbmRwb2ludDsKKwkJCWVwX2Rlc2NyaXB0b3JfcHRyc1sxXSA9CisJCQkJJmFjbV9jb25maWd1cmF0aW9uX2Rlc2NyaXB0b3JzWzBdLmRhdGFfZW5kcG9pbnRzWzBdOworCQkJZXBfZGVzY3JpcHRvcl9wdHJzWzJdID0KKwkJCQkmYWNtX2NvbmZpZ3VyYXRpb25fZGVzY3JpcHRvcnNbMF0uZGF0YV9lbmRwb2ludHNbMV07CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJCQkvKiBFbnVtZXJhdGUgRGV2aWNlIERlc2NyaXB0b3IgKi8KKwkJCWRldmljZV9kZXNjcmlwdG9yLmJEZXZpY2VDbGFzcyA9CisJCQkJQ09NTVVOSUNBVElPTlNfREVWSUNFX0NMQVNTOworCQkJZGV2aWNlX2Rlc2NyaXB0b3IuaWRQcm9kdWN0ID0KKwkJCQljcHVfdG9fbGUxNihDT05GSUdfVVNCRF9QUk9EVUNUSURfQ0RDQUNNKTsKKworCQkJLyogQXNzaWduIGVuZHBvaW50IGluZGljZXMgKi8KKwkJCXR4X2VuZHBvaW50ID0gQUNNX1RYX0VORFBPSU5UOworCQkJcnhfZW5kcG9pbnQgPSBBQ01fUlhfRU5EUE9JTlQ7CisKKwkJCS8qIENvbmZpZ3VyYXRpb24gRGVzY3JpcHRvciAqLworCQkJY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yID0KKwkJCQkoc3RydWN0IHVzYl9jb25maWd1cmF0aW9uX2Rlc2NyaXB0b3IqKQorCQkJCSZhY21fY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yczsKKworCQkJLyogSW50ZXJmYWNlIGNvdW50ICovCisJCQlpbnRlcmZhY2VfY291bnQgPSBOVU1fQUNNX0lOVEVSRkFDRVM7CisJCWJyZWFrOworCisJCS8qIEJVTEsgSU4vT1VUICYgRGVmYXVsdCAqLworCQljYXNlIDE6CisJCWRlZmF1bHQ6CisJCQkvKiBBc3NpZ24gZW5kcG9pbnQgZGVzY3JpcHRvcnMgKi8KKwkJCWVwX2Rlc2NyaXB0b3JfcHRyc1swXSA9CisJCQkJJmdzZXJpYWxfY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yc1swXS5kYXRhX2VuZHBvaW50c1swXTsKKwkJCWVwX2Rlc2NyaXB0b3JfcHRyc1sxXSA9CisJCQkJJmdzZXJpYWxfY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yc1swXS5kYXRhX2VuZHBvaW50c1sxXTsKKwkJCWVwX2Rlc2NyaXB0b3JfcHRyc1syXSA9CisJCQkJJmdzZXJpYWxfY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yc1swXS5kYXRhX2VuZHBvaW50c1syXTsKKworCQkJLyogRW51bWVyYXRlIERldmljZSBEZXNjcmlwdG9yICovCisJCQlkZXZpY2VfZGVzY3JpcHRvci5iRGV2aWNlQ2xhc3MgPSAweEZGOworCQkJZGV2aWNlX2Rlc2NyaXB0b3IuaWRQcm9kdWN0ID0KKwkJCQljcHVfdG9fbGUxNihDT05GSUdfVVNCRF9QUk9EVUNUSURfR1NFUklBTCk7CisKKwkJCS8qIEFzc2lnbiBlbmRwb2ludCBpbmRpY2VzICovCisJCQl0eF9lbmRwb2ludCA9IEdTRVJJQUxfVFhfRU5EUE9JTlQ7CisJCQlyeF9lbmRwb2ludCA9IEdTRVJJQUxfUlhfRU5EUE9JTlQ7CisKKwkJCS8qIENvbmZpZ3VyYXRpb24gRGVzY3JpcHRvciAqLworCQkJY29uZmlndXJhdGlvbl9kZXNjcmlwdG9yID0KKwkJCQkoc3RydWN0IHVzYl9jb25maWd1cmF0aW9uX2Rlc2NyaXB0b3IqKQorCQkJCSZnc2VyaWFsX2NvbmZpZ3VyYXRpb25fZGVzY3JpcHRvcnM7CisKKwkJCS8qIEludGVyZmFjZSBjb3VudCAqLworCQkJaW50ZXJmYWNlX2NvdW50ID0gTlVNX0dTRVJJQUxfSU5URVJGQUNFUzsKKwkJYnJlYWs7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgc3RydWN0IHVyYiAqbmV4dF91cmIgKHN0cnVjdCB1c2JfZGV2aWNlX2luc3RhbmNlICpkZXZpY2UsCiAJCQkgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfaW5zdGFuY2UgKmVuZHBvaW50KQpAQCAtNTI2LDI3ICs4MzMsMzkgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKGJ1Zi0+c2l6ZSkgeworCXN0cnVjdCB1c2JfZW5kcG9pbnRfaW5zdGFuY2UgKmVuZHBvaW50ID0KKwkJCSZlbmRwb2ludF9pbnN0YW5jZVt0eF9lbmRwb2ludF07CisJc3RydWN0IHVyYiAqY3VycmVudF91cmIgPSBOVUxMOwogCi0JCXN0cnVjdCB1c2JfZW5kcG9pbnRfaW5zdGFuY2UgKmVuZHBvaW50ID0KLQkJCSZlbmRwb2ludF9pbnN0YW5jZVtUWF9FTkRQT0lOVF07Ci0JCXN0cnVjdCB1cmIgKmN1cnJlbnRfdXJiID0gTlVMTDsKKwljdXJyZW50X3VyYiA9IG5leHRfdXJiIChkZXZpY2VfaW5zdGFuY2UsIGVuZHBvaW50KTsKKwkvKiBUWCBkYXRhIHN0aWxsIGV4aXN0cyAtIHNlbmQgaXQgbm93CisJICovCisJaWYoZW5kcG9pbnQtPnNlbnQgPCBjdXJyZW50X3VyYi0+YWN0dWFsX2xlbmd0aCl7CisJCWlmKHVkY19lbmRwb2ludF93cml0ZSAoZW5kcG9pbnQpKXsKKwkJCS8qIFdyaXRlIHByZS1lbXB0ZWQgYnkgUlggKi8KKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWlmIChidWYtPnNpemUpIHsKIAkJY2hhciAqZGVzdDsKIAogCQlpbnQgc3BhY2VfYXZhaWw7CiAJCWludCBwb3BudW0sIHBvcHBlZDsKIAkJaW50IHRvdGFsID0gMDsKIAotCQkvKiBCcmVhayBidWZmZXIgaW50byB1cmIgc2l6ZWQgcGllY2VzLCBhbmQgbGluayBlYWNoIHRvIHRoZSBlbmRwb2ludCAqLworCQkvKiBCcmVhayBidWZmZXIgaW50byB1cmIgc2l6ZWQgcGllY2VzLAorCQkgKiBhbmQgbGluayBlYWNoIHRvIHRoZSBlbmRwb2ludAorCQkgKi8KIAkJd2hpbGUgKGJ1Zi0+c2l6ZSA+IDApIHsKLQkJCWN1cnJlbnRfdXJiID0gbmV4dF91cmIgKGRldmljZV9pbnN0YW5jZSwgZW5kcG9pbnQpOworCiAJCQlpZiAoIWN1cnJlbnRfdXJiKSB7CiAJCQkJVFRZRVJSICgiY3VycmVudF91cmIgaXMgTlVMTCwgYnVmLT5zaXplICVkXG4iLAogCQkJCQlidWYtPnNpemUpOwogCQkJCXJldHVybiB0b3RhbDsKIAkJCX0KIAotCQkJZGVzdCA9IGN1cnJlbnRfdXJiLT5idWZmZXIgKworCQkJZGVzdCA9IChjaGFyKiljdXJyZW50X3VyYi0+YnVmZmVyICsKIAkJCQljdXJyZW50X3VyYi0+YWN0dWFsX2xlbmd0aDsKIAogCQkJc3BhY2VfYXZhaWwgPQpAQCAtNTYyLDE0ICs4ODEsMTkgQEAKIAkJCWN1cnJlbnRfdXJiLT5hY3R1YWxfbGVuZ3RoICs9IHBvcHBlZDsKIAkJCXRvdGFsICs9IHBvcHBlZDsKIAotCQkJLyogSWYgZW5kcG9pbnQtPmxhc3QgPT0gMCwgdGhlbiB0cmFuc2ZlcnMgaGF2ZSBub3Qgc3RhcnRlZCBvbiB0aGlzIGVuZHBvaW50ICovCisJCQkvKiBJZiBlbmRwb2ludC0+bGFzdCA9PSAwLCB0aGVuIHRyYW5zZmVycyBoYXZlCisJCQkgKiBub3Qgc3RhcnRlZCBvbiB0aGlzIGVuZHBvaW50CisJCQkgKi8KIAkJCWlmIChlbmRwb2ludC0+bGFzdCA9PSAwKSB7Ci0JCQkJdWRjX2VuZHBvaW50X3dyaXRlIChlbmRwb2ludCk7CisJCQkJaWYodWRjX2VuZHBvaW50X3dyaXRlIChlbmRwb2ludCkpeworCQkJCQkvKiBXcml0ZSBwcmUtZW1wdGVkIGJ5IFJYICovCisJCQkJCXJldHVybiAtMTsKKwkJCQl9CiAJCQl9CiAKLQkJfQkJLyogZW5kIHdoaWxlICovCisJCX0vKiBlbmQgd2hpbGUgKi8KIAkJcmV0dXJuIHRvdGFsOwotCX0JCQkvKiBlbmQgaWYgdHhfdXJiICovCisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC01NzcsMTggKzkwMSwyMiBAQAogc3RhdGljIGludCBmaWxsX2J1ZmZlciAoY2lyY2J1Zl90ICogYnVmKQogewogCXN0cnVjdCB1c2JfZW5kcG9pbnRfaW5zdGFuY2UgKmVuZHBvaW50ID0KLQkJJmVuZHBvaW50X2luc3RhbmNlW1JFQ1ZfRU5EUE9JTlRdOworCQkmZW5kcG9pbnRfaW5zdGFuY2VbcnhfZW5kcG9pbnRdOwogCiAJaWYgKGVuZHBvaW50LT5yY3ZfdXJiICYmIGVuZHBvaW50LT5yY3ZfdXJiLT5hY3R1YWxfbGVuZ3RoKSB7Ci0JCXVuc2lnbmVkIGludCBuYiA9IGVuZHBvaW50LT5yY3ZfdXJiLT5hY3R1YWxfbGVuZ3RoOworCQl1bnNpZ25lZCBpbnQgbmIgPSAwOwogCQljaGFyICpzcmMgPSAoY2hhciAqKSBlbmRwb2ludC0+cmN2X3VyYi0+YnVmZmVyOworCQl1bnNpZ25lZCBpbnQgcnhfYXZhaWwgPSBidWYtPnRvdGFsc2l6ZSAtIGJ1Zi0+c2l6ZTsKIAotCQlidWZfcHVzaCAoYnVmLCBzcmMsIG5iKTsKLQkJZW5kcG9pbnQtPnJjdl91cmItPmFjdHVhbF9sZW5ndGggPSAwOworCQlpZihyeF9hdmFpbCA+PSBlbmRwb2ludC0+cmN2X3VyYi0+YWN0dWFsX2xlbmd0aCl7CiAKKwkJCW5iID0gZW5kcG9pbnQtPnJjdl91cmItPmFjdHVhbF9sZW5ndGg7CisJCQlidWZfcHVzaCAoYnVmLCBzcmMsIG5iKTsKKwkJCWVuZHBvaW50LT5yY3ZfdXJiLT5hY3R1YWxfbGVuZ3RoID0gMDsKKworCQl9CiAJCXJldHVybiBuYjsKIAl9Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNTk3LDcgKzkyNSw3IEBACiAJcmV0dXJuIHVzYnR0eV9jb25maWd1cmVkX2ZsYWc7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZCB1c2J0dHlfZXZlbnRfaGFuZGxlciAoc3RydWN0IHVzYl9kZXZpY2VfaW5zdGFuY2UgKmRldmljZSwKIAkJCQkgIHVzYl9kZXZpY2VfZXZlbnRfdCBldmVudCwgaW50IGRhdGEpCkBAIC02MTksOCArOTQ3LDM0IEBACiAJfQogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAoraW50IHVzYnR0eV9jZGNfc2V0dXAoc3RydWN0IHVzYl9kZXZpY2VfcmVxdWVzdCAqcmVxdWVzdCwgc3RydWN0IHVyYiAqdXJiKQoreworCXN3aXRjaCAocmVxdWVzdC0+YlJlcXVlc3QpeworCisJICAgCWNhc2UgQUNNX1NFVF9DT05UUk9MX0xJTkVfU1RBVEU6CS8qIEltcGxpZXMgRFRFIHJlYWR5ICovCisJCQlicmVhazsKKwkgICAJY2FzZSBBQ01fU0VORF9FTkNBUFNVTEFURURfQ09NTUFORCA6CS8qIFJlcXVpcmVkICovCisJCQlicmVhazsKKwkJY2FzZSBBQ01fU0VUX0xJTkVfRU5DT0RJTkcgOgkJLyogRFRFIHN0b3AvcGFyaXR5IGJpdHMKKwkJCQkJCQkgKiBwZXIgY2hhcmFjdGVyICovCisJCQlicmVhazsKKwkgICAJY2FzZSBBQ01fR0VUX0VOQ0FQU1VMQVRFRF9SRVNQT05TRSA6CS8qIHJlcXVlc3QgcmVzcG9uc2UgKi8KKwkJCWJyZWFrOworCQljYXNlIEFDTV9HRVRfTElORV9FTkNPRElORyA6CQkvKiByZXF1ZXN0IERURSByYXRlLAorCQkJCQkJCSAqIHN0b3AvcGFyaXR5IGJpdHMgKi8KKwkJCW1lbWNweSAodXJiLT5idWZmZXIgLCAmcnMyMzJfZGVzYywgc2l6ZW9mKHJzMjMyX2Rlc2MpKTsKKwkJCXVyYi0+YWN0dWFsX2xlbmd0aCA9IHNpemVvZihyczIzMl9kZXNjKTsKKworCQkJYnJlYWs7CisJIAlkZWZhdWx0OgorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgogICogU2luY2UgaW50ZXJydXB0IGhhbmRsaW5nIGhhcyBub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWQsIHdlIHVzZSB0aGlzIGZ1bmN0aW9uCkBAIC02MzAsMzYgKzk4NCwyOSBAQAogdm9pZCB1c2J0dHlfcG9sbCAodm9pZCkKIHsKIAkvKiBOZXcgaW50ZXJydXB0cz8gKi8KLQlwcmV0ZW5kX2ludGVycnVwdHMgKCk7CisJdWRjX2lycSgpOwogCi0JLyogV3JpdGUgYW55IG91dHB1dCBkYXRhIHRvIGhvc3QgYnVmZmVyIChkbyB0aGlzIGJlZm9yZSBjaGVja2luZyBpbnRlcnJ1cHRzIHRvIGF2b2lkIG1pc3Npbmcgb25lKSAqLworCS8qIFdyaXRlIGFueSBvdXRwdXQgZGF0YSB0byBob3N0IGJ1ZmZlcgorCSAqIChkbyB0aGlzIGJlZm9yZSBjaGVja2luZyBpbnRlcnJ1cHRzIHRvIGF2b2lkIG1pc3Npbmcgb25lKQorCSAqLwogCWlmICh1c2J0dHlfY29uZmlndXJlZCAoKSkgewogCQl3cml0ZV9idWZmZXIgKCZ1c2J0dHlfb3V0cHV0KTsKIAl9CiAKIAkvKiBOZXcgaW50ZXJydXB0cz8gKi8KLQlwcmV0ZW5kX2ludGVycnVwdHMgKCk7CisJdWRjX2lycSgpOwogCi0JLyogQ2hlY2sgZm9yIG5ldyBkYXRhIGZyb20gaG9zdC4uIChkbyB0aGlzIGFmdGVyIGNoZWNraW5nIGludGVycnVwdHMgdG8gZ2V0IGxhdGVzdCBkYXRhKSAqLworCS8qIENoZWNrIGZvciBuZXcgZGF0YSBmcm9tIGhvc3QuLgorCSAqIChkbyB0aGlzIGFmdGVyIGNoZWNraW5nIGludGVycnVwdHMgdG8gZ2V0IGxhdGVzdCBkYXRhKQorCSAqLwogCWlmICh1c2J0dHlfY29uZmlndXJlZCAoKSkgewogCQlmaWxsX2J1ZmZlciAoJnVzYnR0eV9pbnB1dCk7CiAJfQogCiAJLyogTmV3IGludGVycnVwdHM/ICovCi0JcHJldGVuZF9pbnRlcnJ1cHRzICgpOworCXVkY19pcnEoKTsKKwogfQogCi1zdGF0aWMgdm9pZCBwcmV0ZW5kX2ludGVycnVwdHMgKHZvaWQpCi17Ci0JLyogTG9vcCB3aGlsZSB3ZSBoYXZlIGludGVycnVwdHMuCi0JICogSWYgd2UgZG9uJ3QgZG8gdGhpcywgdGhlIGlucHV0IGNoYWluCi0JICogcG9sbGluZyBkZWxheSBpcyBsaWtlbHkgdG8gbWlzcwotCSAqIGhvc3QgcmVxdWVzdHMuCi0JICovCi0Jd2hpbGUgKGludyAoVURDX0lSUV9TUkMpICYgflVEQ19TT0ZfRmxnKSB7Ci0JCS8qIEhhbmRsZSBhbnkgbmV3IElSUXMgKi8KLQkJb21hcDE1MTBfdWRjX2lycSAoKTsKLQkJb21hcDE1MTBfdWRjX25vbmlzb19pcnEgKCk7Ci0JfQotfQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNidHR5LmggYi9kcml2ZXJzL3VzYnR0eS5oCmluZGV4IDc5YzJmZTUuLjgxNTRlMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNidHR5LmgKKysrIGIvZHJpdmVycy91c2J0dHkuaApAQCAtMiw2ICsyLDkgQEAKICAqIChDKSBDb3B5cmlnaHQgMjAwMwogICogR2VycnkgSGFtZWwsIGdlaEB0aS5jb20sIFRleGFzIEluc3RydW1lbnRzCiAgKgorICogKEMpIENvcHlyaWdodCAyMDA2CisgKiBCcnlhbiBPJ0Rvbm9naHVlLCBib2Rvbm9naHVlQGNvZGVoZXJtaXQuaWUsIENvZGVIZXJtaXQKKyAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCkBAIC0yMSw0NCArMjQsNDcgQEAKICNpZm5kZWYgX19VU0JfVFRZX0hfXwogI2RlZmluZSBfX1VTQl9UVFlfSF9fCiAKLQogI2luY2x1ZGUgInVzYmRjb3JlLmgiCisjaWYgZGVmaW5lZChDT05GSUdfUFBDKQorI2luY2x1ZGUgInVzYmRjb3JlX21wYzh4eC5oIgorI2VsaWYgZGVmaW5lZChDT05GSUdfQVJNKQogI2luY2x1ZGUgInVzYmRjb3JlX29tYXAxNTEwLmgiCisjZW5kaWYKIAorI2luY2x1ZGUgPHZlcnNpb25fYXV0b2dlbmVyYXRlZC5oPgogCi0jZGVmaW5lIE5VTV9DT05GSUdTICAgIDEKLSNkZWZpbmUgTlVNX0lOVEVSRkFDRVMgMQotI2RlZmluZSBOVU1fRU5EUE9JTlRTICAzCisvKiBJZiBubyBWZW5kb3JJRC9Qcm9kdWN0SUQgaXMgZGVmaW5lZCBpbiBjb25maWcuaCwgcHJldGVuZCB0byBiZSBMaW51eAorICogRE8gTk9UIFJldXNlIHRoaXMgVmVuZG9yL1Byb2R1Y3Qgc2V0dXAgd2l0aCBwcm90b2NvbCBpbmNvbXBhdGlibGUgZGV2aWNlcyAqLwogCi0jZGVmaW5lIEVQMF9NQVhfUEFDS0VUX1NJWkUgNjQKKyNkZWZpbmUgQ09ORklHX1VTQkRfVkVORE9SSUQgMHgwNTI1IAkvKiBMaW51eC9OZXRDaGlwICovCisjZGVmaW5lIENPTkZJR19VU0JEX1BST0RVQ1RJRF9HU0VSSUFMIDB4YTRhNgkvKiBnc2VyaWFsICovCisjZGVmaW5lIENPTkZJR19VU0JEX1BST0RVQ1RJRF9DRENBQ00gIDB4YTRhNwkvKiBDREMgQUNNICovCisjZGVmaW5lIENPTkZJR19VU0JEX01BTlVGQUNUVVJFUiAiRGFzIFUtQm9vdCIKKyNkZWZpbmUgQ09ORklHX1VTQkRfUFJPRFVDVF9OQU1FIFVfQk9PVF9WRVJTSU9OCisKIAogI2RlZmluZSBDT05GSUdfVVNCRF9DT05GSUdVUkFUSU9OX1NUUiAiVFRZIHZpYSBVU0IiCi0jZGVmaW5lIENPTkZJR19VU0JEX0lOVEVSRkFDRV9TVFIgICAgICJTaW1wbGUgU2VyaWFsIERhdGEgSW50ZXJmYWNlIC0gQnVsayBNb2RlIgogCi0KLSNkZWZpbmUgQ09ORklHX1VTQkRfU0VSSUFMX09VVF9FTkRQT0lOVCAyCi0jZGVmaW5lIENPTkZJR19VU0JEX1NFUklBTF9PVVRfUEtUU0laRQk2NAotI2RlZmluZSBDT05GSUdfVVNCRF9TRVJJQUxfSU5fRU5EUE9JTlQJMQotI2RlZmluZSBDT05GSUdfVVNCRF9TRVJJQUxfSU5fUEtUU0laRQk2NAotI2RlZmluZSBDT05GSUdfVVNCRF9TRVJJQUxfSU5UX0VORFBPSU5UIDUKLSNkZWZpbmUgQ09ORklHX1VTQkRfU0VSSUFMX0lOVF9QS1RTSVpFCTE2Ci0KKyNkZWZpbmUgQ09ORklHX1VTQkRfU0VSSUFMX09VVF9FTkRQT0lOVCBVRENfT1VUX0VORFBPSU5UCisjZGVmaW5lIENPTkZJR19VU0JEX1NFUklBTF9PVVRfUEtUU0laRQlVRENfT1VUX1BBQ0tFVF9TSVpFCisjZGVmaW5lIENPTkZJR19VU0JEX1NFUklBTF9JTl9FTkRQT0lOVAlVRENfSU5fRU5EUE9JTlQKKyNkZWZpbmUgQ09ORklHX1VTQkRfU0VSSUFMX0lOX1BLVFNJWkUJVURDX0lOX1BBQ0tFVF9TSVpFCisjZGVmaW5lIENPTkZJR19VU0JEX1NFUklBTF9JTlRfRU5EUE9JTlQgVURDX0lOVF9FTkRQT0lOVAorI2RlZmluZSBDT05GSUdfVVNCRF9TRVJJQUxfSU5UX1BLVFNJWkUJVURDX0lOVF9QQUNLRVRfU0laRQorI2RlZmluZSBDT05GSUdfVVNCRF9TRVJJQUxfQlVMS19QS1RTSVpFCVVEQ19CVUxLX1BBQ0tFVF9TSVpFCiAKICNkZWZpbmUgVVNCVFRZX0RFVklDRV9DTEFTUwlDT01NVU5JQ0FUSU9OU19ERVZJQ0VfQ0xBU1MKLSNkZWZpbmUgVVNCVFRZX0RFVklDRV9TVUJDTEFTUwlDT01NVU5JQ0FUSU9OU19OT19TVUJDTEFTUwotI2RlZmluZSBVU0JUVFlfREVWSUNFX1BST1RPQ09MCUNPTU1VTklDQVRJT05TX05PX1BST1RPQ09MCiAKLSNkZWZpbmUgVVNCVFRZX0lOVEVSRkFDRV9DTEFTUwkgICAweEZGIC8qIFZlbmRvciBTcGVjaWZpYyAqLwotI2RlZmluZSBVU0JUVFlfSU5URVJGQUNFX1NVQkNMQVNTICAweDAyCi0jZGVmaW5lIFVTQlRUWV9JTlRFUkZBQ0VfUFJPVE9DT0wgIDB4MDEKKyNkZWZpbmUgVVNCVFRZX0JDRF9ERVZJQ0UgCTB4MDAKKyNkZWZpbmUgVVNCVFRZX01BWFBPV0VSCSAgCTB4MDAKIAotI2RlZmluZSBVU0JUVFlfQkNEX0RFVklDRSAweDAKLSNkZWZpbmUgVVNCVFRZX01BWFBPV0VSCSAgMHgwCi0KLSNkZWZpbmUgU1RSX01BTlVGQUNUVVJFUiAxCi0jZGVmaW5lIFNUUl9QUk9EVUNUCSAyCi0jZGVmaW5lIFNUUl9TRVJJQUwJIDMKLSNkZWZpbmUgU1RSX0NPTkZJRwkgNAotI2RlZmluZSBTVFJfSU5URVJGQUNFCSA1CisjZGVmaW5lIFNUUl9MQU5HCQkweDAwCisjZGVmaW5lIFNUUl9NQU5VRkFDVFVSRVIJMHgwMQorI2RlZmluZSBTVFJfUFJPRFVDVAkJMHgwMgorI2RlZmluZSBTVFJfU0VSSUFMCQkweDAzCisjZGVmaW5lIFNUUl9DT05GSUcJCTB4MDQKKyNkZWZpbmUgU1RSX0RBVEFfSU5URVJGQUNFCTB4MDUKKyNkZWZpbmUgU1RSX0NUUkxfSU5URVJGQUNFCTB4MDYKKyNkZWZpbmUgU1RSX0NPVU5UCQkweDA3CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvY3JhbWZzL2NyYW1mcy5jIGIvZnMvY3JhbWZzL2NyYW1mcy5jCmluZGV4IDQ4ZTdmNjMuLjM2OWQxZjEgMTAwNjQ0Ci0tLSBhL2ZzL2NyYW1mcy9jcmFtZnMuYworKysgYi9mcy9jcmFtZnMvY3JhbWZzLmMKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxtYWxsb2MuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikKIAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CmRpZmYgLS1naXQgYS9mcy9jcmFtZnMvdW5jb21wcmVzcy5jIGIvZnMvY3JhbWZzL3VuY29tcHJlc3MuYwppbmRleCAxNzA4MzJhLi4yZTkwNmViIDEwMDY0NAotLS0gYS9mcy9jcmFtZnMvdW5jb21wcmVzcy5jCisrKyBiL2ZzL2NyYW1mcy91bmNvbXByZXNzLmMKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDx3YXRjaGRvZy5oPgogI2luY2x1ZGUgPHpsaWIuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikKIAogc3RhdGljIHpfc3RyZWFtIHN0cmVhbTsKIApkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9kZXYuYyBiL2ZzL2V4dDIvZGV2LmMKaW5kZXggMTQ2OWU5OC4uNjQzYTFhOCAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9kZXYuYworKysgYi9mcy9leHQyL2Rldi5jCkBAIC0yNSw3ICsyNSw3IEBACiAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0VYVDIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0VYVDIpCiAKICNpbmNsdWRlIDxjb25maWcuaD4KICNpbmNsdWRlIDxleHQyZnMuaD4KQEAgLTEyMyw0ICsxMjMsNCBAQAogCX0KIAlyZXR1cm4gKDEpOwogfQotI2VuZGlmIC8qIENGR19DTURfRVhUMkZTICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvZXh0MmZzLmMgYi9mcy9leHQyL2V4dDJmcy5jCmluZGV4IDljZjJmYjcuLjUxM2EyZjkgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvZXh0MmZzLmMKKysrIGIvZnMvZXh0Mi9leHQyZnMuYwpAQCAtMjUsNyArMjUsNyBAQAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9FWFQyKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9FWFQyKQogI2luY2x1ZGUgPGV4dDJmcy5oPgogI2luY2x1ZGUgPG1hbGxvYy5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KQEAgLTg3NSw0ICs4NzUsNCBAQAogCXJldHVybiAoMCk7CiB9CiAKLSNlbmRpZiAvKiBDRkdfQ01EX0VYVDJGUyAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9mYXQvZmF0LmMgYi9mcy9mYXQvZmF0LmMKaW5kZXggYTgyM2I1YS4uZTk4ZTUwYSAxMDA2NDQKLS0tIGEvZnMvZmF0L2ZhdC5jCisrKyBiL2ZzL2ZhdC9mYXQuYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxwYXJ0Lmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GQVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0ZBVCkKIAogLyoKICAqIENvbnZlcnQgYSBzdHJpbmcgdG8gbG93ZXJjYXNlLgpAQCAtNTksNyArNTksOCBAQAogCWlmIChjdXJfZGV2ID09IE5VTEwpCiAJCXJldHVybiAtMTsKIAlpZiAoY3VyX2Rldi0+YmxvY2tfcmVhZCkgewotCQlyZXR1cm4gY3VyX2Rldi0+YmxvY2tfcmVhZCAoY3VyX2Rldi0+ZGV2LCBzdGFydGJsb2NrLCBnZXRzaXplLCAodW5zaWduZWQgbG9uZyAqKWJ1ZnB0cik7CisJCXJldHVybiBjdXJfZGV2LT5ibG9ja19yZWFkIChjdXJfZGV2LT5kZXYKKwkJCSwgc3RhcnRibG9jaywgZ2V0c2l6ZSwgKHVuc2lnbmVkIGxvbmcgKilidWZwdHIpOwogCX0KIAlyZXR1cm4gLTE7CiB9CkBAIC02OSwxMCArNzAsMTEgQEAKIGZhdF9yZWdpc3Rlcl9kZXZpY2UoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MsIGludCBwYXJ0X25vKQogewogCXVuc2lnbmVkIGNoYXIgYnVmZmVyW1NFQ1RPUl9TSVpFXTsKKwlkaXNrX3BhcnRpdGlvbl90IGluZm87CiAKIAlpZiAoIWRldl9kZXNjLT5ibG9ja19yZWFkKQogCQlyZXR1cm4gLTE7Ci0JY3VyX2Rldj1kZXZfZGVzYzsKKwljdXJfZGV2ID0gZGV2X2Rlc2M7CiAJLyogY2hlY2sgaWYgd2UgaGF2ZSBhIE1CUiAob24gZmxvcHBpZXMgd2UgaGF2ZSBvbmx5IGEgUEJSKSAqLwogCWlmIChkZXZfZGVzYy0+YmxvY2tfcmVhZCAoZGV2X2Rlc2MtPmRldiwgMCwgMSwgKHVsb25nICopIGJ1ZmZlcikgIT0gMSkgewogCQlwcmludGYgKCIqKiBDYW4ndCByZWFkIGZyb20gZGV2aWNlICVkICoqXG4iLCBkZXZfZGVzYy0+ZGV2KTsKQEAgLTg3LDI3ICs4OSw0MCBAQAogCQkvKiBvaywgd2UgYXNzdW1lIHdlIGFyZSBvbiBhIFBCUiBvbmx5ICovCiAJCWN1cl9wYXJ0ID0gMTsKIAkJcGFydF9vZmZzZXQ9MDsKLQl9Ci0JZWxzZSB7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TQ1NJKSB8fCBcCi0gICAgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfVVNCKSB8fCBkZWZpbmVkKENPTkZJR19TWVNURU1BQ0UpCi0JCWRpc2tfcGFydGl0aW9uX3QgaW5mbzsKLQkJaWYoIWdldF9wYXJ0aXRpb25faW5mbyhkZXZfZGVzYywgcGFydF9ubywgJmluZm8pKSB7CisJfSBlbHNlIHsKKyNpZiAoZGVmaW5lZChDT05GSUdfQ01EX0lERSkgfHwgXAorICAgICBkZWZpbmVkKENPTkZJR19DTURfU0NTSSkgfHwgXAorICAgICBkZWZpbmVkKENPTkZJR19DTURfVVNCKSB8fCBcCisgICAgIChkZWZpbmVkKENPTkZJR19NTUMpICYmIGRlZmluZWQoQ09ORklHX0xQQzIyOTIpKSB8fCBcCisgICAgIGRlZmluZWQoQ09ORklHX1NZU1RFTUFDRSkgICAgICAgICAgKQorCQkvKiBGaXJzdCB3ZSBhc3N1bWUsIHRoZXJlIGlzIGEgTUJSICovCisJCWlmICghZ2V0X3BhcnRpdGlvbl9pbmZvIChkZXZfZGVzYywgcGFydF9ubywgJmluZm8pKSB7CiAJCQlwYXJ0X29mZnNldCA9IGluZm8uc3RhcnQ7CiAJCQljdXJfcGFydCA9IHBhcnRfbm87Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwcmludGYgKCIqKiBQYXJ0aXRpb24gJWQgbm90IHZhbGlkIG9uIGRldmljZSAlZCAqKlxuIixwYXJ0X25vLGRldl9kZXNjLT5kZXYpOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKChjaGFyICopJmJ1ZmZlcltET1NfRlNfVFlQRV9PRkZTRVRdLCAiRkFUIiwgMykpIHsKKwkJCS8qIG9rLCB3ZSBhc3N1bWUgd2UgYXJlIG9uIGEgUEJSIG9ubHkgKi8KKwkJCWN1cl9wYXJ0ID0gMTsKKwkJCXBhcnRfb2Zmc2V0ID0gMDsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZiAoIioqIFBhcnRpdGlvbiAlZCBub3QgdmFsaWQgb24gZGV2aWNlICVkICoqXG4iLAorCQkJCXBhcnRfbm8sIGRldl9kZXNjLT5kZXYpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAjZWxzZQotCQkvKiBGSVhNRSB3ZSBuZWVkIHRvIGRldGVybWluZSB0aGUgc3RhcnQgYmxvY2sgb2YgdGhlCi0JCSAqIHBhcnRpdGlvbiB3aGVyZSB0aGUgRE9TIEZTIHJlc2lkZXMuIFRoaXMgY2FuIGJlIGRvbmUKLQkJICogYnkgdXNpbmcgdGhlIGdldF9wYXJ0aXRpb25faW5mbyByb3V0aW5lLiBGb3IgdGhpcwotCQkgKiBwdXJwb3NlIHRoZSBsaWJwYXJ0IG11c3QgYmUgaW5jbHVkZWQuCi0JCSAqLwotCQlwYXJ0X29mZnNldD0zMjsKLQkJY3VyX3BhcnQgPSAxOworCQlpZighc3RybmNtcCgoY2hhciAqKSZidWZmZXJbRE9TX0ZTX1RZUEVfT0ZGU0VUXSwiRkFUIiwzKSkgeworCQkJLyogb2ssIHdlIGFzc3VtZSB3ZSBhcmUgb24gYSBQQlIgb25seSAqLworCQkJY3VyX3BhcnQgPSAxOworCQkJcGFydF9vZmZzZXQgPSAwOworCQkJaW5mby5zdGFydCA9IHBhcnRfb2Zmc2V0OworCQl9IGVsc2UgeworCQkJLyogRklYTUUgd2UgbmVlZCB0byBkZXRlcm1pbmUgdGhlIHN0YXJ0IGJsb2NrIG9mIHRoZQorCQkJICogcGFydGl0aW9uIHdoZXJlIHRoZSBET1MgRlMgcmVzaWRlcy4gVGhpcyBjYW4gYmUgZG9uZQorCQkJICogYnkgdXNpbmcgdGhlIGdldF9wYXJ0aXRpb25faW5mbyByb3V0aW5lLiBGb3IgdGhpcworCQkJICogcHVycG9zZSB0aGUgbGlicGFydCBtdXN0IGJlIGluY2x1ZGVkLgorCQkJICovCisJCQlwYXJ0X29mZnNldCA9IDMyOworCQkJY3VyX3BhcnQgPSAxOworCQl9CiAjZW5kaWYKIAl9CiAJcmV0dXJuIDA7CkBAIC05NzEsOCArOTg2LDEwIEBACiAJCXByaW50ZigiTm8gY3VycmVudCBkZXZpY2VcbiIpOwogCQlyZXR1cm4gMTsKIAl9Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TQ1NJKSB8fCBcCi0gICAgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfVVNCKSB8fCAoQ09ORklHX01NQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfQ01EX1NDU0kpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19DTURfVVNCKSB8fCBcCisgICAgKENPTkZJR19NTUMpCiAJcHJpbnRmKCJJbnRlcmZhY2U6ICAiKTsKIAlzd2l0Y2goY3VyX2Rldi0+aWZfdHlwZSkgewogCQljYXNlIElGX1RZUEVfSURFIDoJcHJpbnRmKCJJREUiKTsgYnJlYWs7CkBAIC05OTMsNyArMTAxMCw4IEBACiAJbWVtY3B5ICh2b2xfbGFiZWwsIHZvbGluZm8udm9sdW1lX2xhYmVsLCAxMSk7CiAJdm9sX2xhYmVsWzExXSA9ICdcMCc7CiAJdm9saW5mby5mc190eXBlWzVdPSdcMCc7Ci0JcHJpbnRmKCJQYXJ0aXRpb24gJWQ6IEZpbGVzeXN0ZW06ICVzIFwiJXNcIlxuIixjdXJfcGFydCx2b2xpbmZvLmZzX3R5cGUsdm9sX2xhYmVsKTsKKwlwcmludGYoIlBhcnRpdGlvbiAlZDogRmlsZXN5c3RlbTogJXMgXCIlc1wiXG4iCisJCQksY3VyX3BhcnQsdm9saW5mby5mc190eXBlLHZvbF9sYWJlbCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwMTIsNCArMTAzMCw0IEBACiAJcmV0dXJuIGRvX2ZhdF9yZWFkKGZpbGVuYW1lLCBidWZmZXIsIG1heHNpemUsIExTX05PKTsKIH0KIAotI2VuZGlmIC8qICNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GQVQpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2ZhdC9maWxlLmMgYi9mcy9mYXQvZmlsZS5jCmluZGV4IGY5OTlhYzUuLjUxNGRiYWUgMTAwNjQ0Ci0tLSBhL2ZzL2ZhdC9maWxlLmMKKysrIGIvZnMvZmF0L2ZpbGUuYwpAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GQVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0ZBVCkKIAogLyogU3VwcG9ydGVkIGZpbGVzeXN0ZW1zICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVzeXN0ZW0gZmlsZXN5c3RlbXNbXSA9IHsKQEAgLTIwNSw0ICsyMDUsNCBAQAogCXJldHVybiBmaWxlc3lzdGVtc1tjdXJyZW50X2ZpbGVzeXN0ZW1dLnJlYWQoYXJnLCBidWZmZXIsIG1heHNpemUpOwogfQogCi0jZW5kaWYgLyogI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZBVCkgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvZmRvcy9kZXYuYyBiL2ZzL2Zkb3MvZGV2LmMKaW5kZXggNWRlYTVjZC4uMjcxZDBlNyAxMDA2NDQKLS0tIGEvZnMvZmRvcy9kZXYuYworKysgYi9mcy9mZG9zL2Rldi5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSAiZG9zLmgiCiAjaW5jbHVkZSAiZmRvcy5oIgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRPUykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRkRPUykKIAogI2RlZmluZSBOQl9IRUFEUyAgICAgICAgMgogI2RlZmluZSBOQl9UUkFDS1MgICAgICAgODAKZGlmZiAtLWdpdCBhL2ZzL2Zkb3MvZmF0LmMgYi9mcy9mZG9zL2ZhdC5jCmluZGV4IDJlZjIzNzEuLjJlMmQyYjggMTAwNjQ0Ci0tLSBhL2ZzL2Zkb3MvZmF0LmMKKysrIGIvZnMvZmRvcy9mYXQuYwpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPGNvbmZpZy5oPgogI2luY2x1ZGUgPG1hbGxvYy5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkRPUykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRkRPUykKIAogI2luY2x1ZGUgImRvcy5oIgogI2luY2x1ZGUgImZkb3MuaCIKZGlmZiAtLWdpdCBhL2ZzL2Zkb3MvZmRvcy5jIGIvZnMvZmRvcy9mZG9zLmMKaW5kZXggYTI5ZjQzZC4uNWJlNmE5NiAxMDA2NDQKLS0tIGEvZnMvZmRvcy9mZG9zLmMKKysrIGIvZnMvZmRvcy9mZG9zLmMKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxjb25maWcuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZET1MpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0ZET1MpCiAjaW5jbHVkZSA8bWFsbG9jLmg+CiAjaW5jbHVkZSAiZG9zLmgiCiAjaW5jbHVkZSAiZmRvcy5oIgpkaWZmIC0tZ2l0IGEvZnMvZmRvcy9mcy5jIGIvZnMvZmRvcy9mcy5jCmluZGV4IDNiOWQwOWUuLmFkZWQ2NzAgMTAwNjQ0Ci0tLSBhL2ZzL2Zkb3MvZnMuYworKysgYi9mcy9mZG9zL2ZzLmMKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlIDxjb25maWcuaD4KICNpbmNsdWRlIDxtYWxsb2MuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZET1MpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0ZET1MpCiAKICNpbmNsdWRlICJkb3MuaCIKICNpbmNsdWRlICJmZG9zLmgiCmRpZmYgLS1naXQgYS9mcy9mZG9zL3N1YmRpci5jIGIvZnMvZmRvcy9zdWJkaXIuYwppbmRleCA5N2IyNTA0Li40OTdmNTU0IDEwMDY0NAotLS0gYS9mcy9mZG9zL3N1YmRpci5jCisrKyBiL2ZzL2Zkb3Mvc3ViZGlyLmMKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlIDxjb25maWcuaD4KICNpbmNsdWRlIDxtYWxsb2MuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZET1MpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0ZET1MpCiAKICNpbmNsdWRlICJkb3MuaCIKICNpbmNsdWRlICJmZG9zLmgiCmRpZmYgLS1naXQgYS9mcy9mZG9zL3ZmYXQuYyBiL2ZzL2Zkb3MvdmZhdC5jCmluZGV4IDQ2YTQ2NGIuLjBlNzg4M2IgMTAwNjQ0Ci0tLSBhL2ZzL2Zkb3MvdmZhdC5jCisrKyBiL2ZzL2Zkb3MvdmZhdC5jCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8Y29uZmlnLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GRE9TKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9GRE9TKQogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAKICNpbmNsdWRlICJkb3MuaCIKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2NvbXByX2x6YXJpLmMgYi9mcy9qZmZzMi9jb21wcl9semFyaS5jCmluZGV4IDgyOGI2ZTUuLmY2NGJjNzQgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2NvbXByX2x6YXJpLmMKKysrIGIvZnMvamZmczIvY29tcHJfbHphcmkuYwpAQCAtNTAsNyArNTAsNyBAQAogCiAKICNpbmNsdWRlIDxjb25maWcuaD4KLSNpZiAoKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0xaT19MWkFSSSkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9MWk9fTFpBUkkpCiAKICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxqZmZzMi9qZmZzMi5oPgpAQCAtMjU5LDQgKzI1OSw0IEBACiB7CiAgICAgcmV0dXJuIERlY29kZShkYXRhX2luLCBjcGFnZV9vdXQsIHNyY2xlbiwgZGVzdGxlbik7CiB9Ci0jZW5kaWYgLyogKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9MWk9fTFpBUkkpKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9jb21wcl9sem8uYyBiL2ZzL2pmZnMyL2NvbXByX2x6by5jCmluZGV4IGI2YzU5MGEuLmEzMmI5OTMgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2NvbXByX2x6by5jCisrKyBiL2ZzL2pmZnMyL2NvbXByX2x6by5jCkBAIC02Nyw3ICs2Nyw3IEBACiAKIAogI2luY2x1ZGUgPGNvbmZpZy5oPgotI2lmICgoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikgJiYgZGVmaW5lZChDT05GSUdfSkZGUzJfTFpPX0xaQVJJKSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSkZGUzIpICYmIGRlZmluZWQoQ09ORklHX0pGRlMyX0xaT19MWkFSSSkKIAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGpmZnMyL2pmZnMyLmg+CkBAIC00MDIsNCArNDAyLDQgQEAKIAlyZXR1cm4gbHpvMXhfZGVjb21wcmVzcyAoZGF0YV9pbiwgc3JjbGVuLCBjcGFnZV9vdXQsICZvdXRsZW4sIE5VTEwpOwogfQogCi0jZW5kaWYgLyogKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKSAmJiBkZWZpbmVkKENPTkZJR19KRkZTMl9MWk9fTFpBUkkpKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9jb21wcl9ydGltZS5jIGIvZnMvamZmczIvY29tcHJfcnRpbWUuYwppbmRleCA5YmI0ZjFiLi4xNDQyNjNjIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9jb21wcl9ydGltZS5jCisrKyBiL2ZzL2pmZnMyL2NvbXByX3J0aW1lLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKQogCiAjaW5jbHVkZSA8amZmczIvamZmczIuaD4KIApAQCAtODgsNCArODgsNCBAQAogCX0KIH0KIAotI2VuZGlmIC8qIENGR19DTURfSkZGUzIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvamZmczIvY29tcHJfcnViaW4uYyBiL2ZzL2pmZnMyL2NvbXByX3J1YmluLmMKaW5kZXggNzQ1NzdkOS4uZjZmM2ZhMSAxMDA2NDQKLS0tIGEvZnMvamZmczIvY29tcHJfcnViaW4uYworKysgYi9mcy9qZmZzMi9jb21wcl9ydWJpbi5jCkBAIC0zOSw3ICszOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGNvbmZpZy5oPgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikKIAogI2luY2x1ZGUgPGpmZnMyL2pmZnMyLmg+CiAjaW5jbHVkZSA8amZmczIvY29tcHJfcnViaW4uaD4KQEAgLTEyMyw0ICsxMjMsNCBAQAogCXJ1YmluX2RvX2RlY29tcHJlc3MoYml0cywgZGF0YV9pbis4LCBjcGFnZV9vdXQsIGRzdGxlbik7CiB9CiAKLSNlbmRpZiAvKiBDRkdfQ01EX0pGRlMyICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2NvbXByX3psaWIuYyBiL2ZzL2pmZnMyL2NvbXByX3psaWIuYwppbmRleCBkODhkMGY4Li4yOWRmZTFiIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9jb21wcl96bGliLmMKKysrIGIvZnMvamZmczIvY29tcHJfemxpYi5jCkBAIC0zNyw3ICszNyw3IEBACiAKICNpbmNsdWRlIDxjb21tb24uaD4KICNpbmNsdWRlIDxjb25maWcuaD4KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSkZGUzIpCiAKICNpbmNsdWRlIDxqZmZzMi9qZmZzMi5oPgogI2luY2x1ZGUgPGpmZnMyL21pbmlfaW5mbGF0ZS5oPgpAQCAtNDksNCArNDksNCBAQAogCiB9CiAKLSNlbmRpZiAvKiBDRkdfQ01EX0pGRlMyICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2pmZnMyXzFwYXNzLmMgYi9mcy9qZmZzMi9qZmZzMl8xcGFzcy5jCmluZGV4IDQxZmY0YzEuLjUzMTY2NjggMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2pmZnMyXzFwYXNzLmMKKysrIGIvZnMvamZmczIvamZmczJfMXBhc3MuYwpAQCAtMTE3LDcgKzExNyw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikKIAogI2luY2x1ZGUgPGpmZnMyL2pmZnMyLmg+CiAjaW5jbHVkZSA8amZmczIvamZmczJfMXBhc3MuaD4KQEAgLTE0Myw3ICsxNDMsOCBAQAogLyoga2VlcHMgcG9pbnRlciB0byBjdXJyZW50bHUgcHJvY2Vzc2VkIHBhcnRpdGlvbiAqLwogc3RhdGljIHN0cnVjdCBwYXJ0X2luZm8gKmN1cnJlbnRfcGFydDsKIAotI2lmIGRlZmluZWQoQ09ORklHX0pGRlMyX05BTkQpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgKGRlZmluZWQoQ09ORklHX0pGRlMyX05BTkQpICYmIFwKKyAgICAgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpICkKICNpZiBkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkKICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9sZWdhY3kuaD4KICNlbHNlCkBAIC0yNzQsMTAgKzI3NSwxMCBAQAogewogCWZyZWUoYnVmKTsKIH0KLSNlbmRpZiAvKiAjaWYgZGVmaW5lZChDT05GSUdfSkZGUzJfTkFORCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkgKi8KKyNlbmRpZgogCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GTEFTSCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRkxBU0gpCiAvKgogICogU3VwcG9ydCBmb3IgamZmczIgb24gdG9wIG9mIE5PUi1mbGFzaAogICoKQEAgLTMwMCw3ICszMDEsNyBAQAogewogCXJldHVybiAodm9pZCopZ2V0X2ZsX21lbV9ub3Iob2ZmKTsKIH0KLSNlbmRpZiAvKiAjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkxBU0gpICovCisjZW5kaWYKIAogCiAvKgpAQCAtMzExLDEyICszMTIsMTIgQEAKIHsKIAlzdHJ1Y3QgbXRkaWRzICppZCA9IGN1cnJlbnRfcGFydC0+ZGV2LT5pZDsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZMQVNIKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9GTEFTSCkKIAlpZiAoaWQtPnR5cGUgPT0gTVREX0RFVl9UWVBFX05PUikKIAkJcmV0dXJuIGdldF9mbF9tZW1fbm9yKG9mZik7CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0pGRlMyX05BTkQpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfSkZGUzJfTkFORCkgJiYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAJaWYgKGlkLT50eXBlID09IE1URF9ERVZfVFlQRV9OQU5EKQogCQlyZXR1cm4gZ2V0X2ZsX21lbV9uYW5kKG9mZiwgc2l6ZSwgZXh0X2J1Zik7CiAjZW5kaWYKQEAgLTMyOSwxMiArMzMwLDEzIEBACiB7CiAJc3RydWN0IG10ZGlkcyAqaWQgPSBjdXJyZW50X3BhcnQtPmRldi0+aWQ7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GTEFTSCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRkxBU0gpCiAJaWYgKGlkLT50eXBlID09IE1URF9ERVZfVFlQRV9OT1IpCiAJCXJldHVybiBnZXRfbm9kZV9tZW1fbm9yKG9mZik7CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0pGRlMyX05BTkQpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfSkZGUzJfTkFORCkgJiYgXAorICAgIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogCWlmIChpZC0+dHlwZSA9PSBNVERfREVWX1RZUEVfTkFORCkKIAkJcmV0dXJuIGdldF9ub2RlX21lbV9uYW5kKG9mZik7CiAjZW5kaWYKQEAgLTM0NSw3ICszNDcsOCBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHV0X2ZsX21lbSh2b2lkICpidWYpCiB7Ci0jaWYgZGVmaW5lZChDT05GSUdfSkZGUzJfTkFORCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCkKKyNpZiBkZWZpbmVkKENPTkZJR19KRkZTMl9OQU5EKSAmJiBcCisgICAgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAJc3RydWN0IG10ZGlkcyAqaWQgPSBjdXJyZW50X3BhcnQtPmRldi0+aWQ7CiAKIAlpZiAoaWQtPnR5cGUgPT0gTVREX0RFVl9UWVBFX05BTkQpCkBAIC0xMzk0LDQgKzEzOTcsNCBAQAogCXJldHVybiAxOwogfQogCi0jZW5kaWYgLyogQ0ZHX0NNRF9KRkZTMiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9qZmZzMl9uYW5kXzFwYXNzLmMgYi9mcy9qZmZzMi9qZmZzMl9uYW5kXzFwYXNzLmMKaW5kZXggZTc4YWY3NS4uM2E0YzY0OSAxMDA2NDQKLS0tIGEvZnMvamZmczIvamZmczJfbmFuZF8xcGFzcy5jCisrKyBiL2ZzL2pmZnMyL2pmZnMyX25hbmRfMXBhc3MuYwpAQCAtMSw2ICsxLDYgQEAKICNpbmNsdWRlIDxjb21tb24uaD4KIAotI2lmICFkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpCisjaWYgIWRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKSAmJiBkZWZpbmVkKENPTkZJR19DTURfSkZGUzIpCiAKICNpbmNsdWRlIDxtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CkBAIC0xMDMzLDQgKzEwMzMsNCBAQAogCXJldHVybiAxOwogfQogCi0jZW5kaWYgLyogQ0ZHX0NNRF9KRkZTMiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9taW5pX2luZmxhdGUuYyBiL2ZzL2pmZnMyL21pbmlfaW5mbGF0ZS5jCmluZGV4IDRmNTExZWMuLjRjNTBmYzMgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL21pbmlfaW5mbGF0ZS5jCisrKyBiL2ZzL2pmZnMyL21pbmlfaW5mbGF0ZS5jCkBAIC0yNSw3ICsyNSw3IEBACiAKICNpbmNsdWRlIDxjb25maWcuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikKIAogI2luY2x1ZGUgPGpmZnMyL21pbmlfaW5mbGF0ZS5oPgogCkBAIC0zOTMsNCArMzkzLDQgQEAKIAlyZXR1cm4gc3RyZWFtLmVycm9yID8gLXN0cmVhbS5lcnJvciA6IHN0cmVhbS5kZWNvZGVkOwogfQogCi0jZW5kaWYgLyogQ0ZHX0NNRF9KRkZTMiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9kZXYuYyBiL2ZzL3JlaXNlcmZzL2Rldi5jCmluZGV4IDZmNjA1NmYuLjZiMzZjMDYgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2Rldi5jCisrKyBiL2ZzL3JlaXNlcmZzL2Rldi5jCkBAIC0xOSw3ICsxOSw3IEBACiAKIAogI2luY2x1ZGUgPGNvbW1vbi5oPgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1JFSVNFUikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUkVJU0VSKQogCiAjaW5jbHVkZSA8Y29uZmlnLmg+CiAjaW5jbHVkZSA8cmVpc2VyZnMuaD4KQEAgLTEyMCw0ICsxMjAsNCBAQAogCXJldHVybiAxOwogfQogCi0jZW5kaWYgLyogQ0ZHX0NNRF9SRUlTRVJGUyAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9tb2RlX3N0cmluZy5jIGIvZnMvcmVpc2VyZnMvbW9kZV9zdHJpbmcuYwppbmRleCBiYzU2NWZiLi5hZTk4ODM0IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9tb2RlX3N0cmluZy5jCisrKyBiL2ZzL3JlaXNlcmZzL21vZGVfc3RyaW5nLmMKQEAgLTI2LDcgKzI2LDcgQEAKIAogCiAjaW5jbHVkZSA8Y29tbW9uLmg+Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUkVJU0VSKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9SRUlTRVIpCiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogCiAjaWYgKCBTX0lTVUlEICE9IDA0MDAwICkgfHwgKCBTX0lTR0lEICE9IDAyMDAwICkgfHwgKCBTX0lTVlRYICE9IDAxMDAwICkgXApAQCAtMTM5LDQgKzEzOSw0IEBACiAKICNlbmRpZgogCi0jZW5kaWYgLyogQ0ZHX0NNRF9SRUlTRVIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvcmVpc2VyZnMuYyBiL2ZzL3JlaXNlcmZzL3JlaXNlcmZzLmMKaW5kZXggMzFjMjVlYi4uYWE5NjM2MSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvcmVpc2VyZnMuYworKysgYi9mcy9yZWlzZXJmcy9yZWlzZXJmcy5jCkBAIC0yOSw3ICsyOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGNvbW1vbi5oPgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1JFSVNFUikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUkVJU0VSKQogCiAjaW5jbHVkZSA8bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KQEAgLTk4Myw0ICs5ODMsNCBAQAogCXJldHVybiBmaWxlbWF4OwogfQogCi0jZW5kaWYgLyogQ0ZHX0NNRF9SRUlTRVIgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS83NHh4Xzd4eC5oIGIvaW5jbHVkZS83NHh4Xzd4eC5oCmluZGV4IGJhNzNiYWUuLjRhMDNjZWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvNzR4eF83eHguaAorKysgYi9pbmNsdWRlLzc0eHhfN3h4LmgKQEAgLTM0LDYgKzM0LDcgQEAKICAqIEV4Y2VwdGlvbiBvZmZzZXRzIChQb3dlclBDIHN0YW5kYXJkKQogICovCiAjZGVmaW5lIEVYQ19PRkZfU1lTX1JFU0VUICAgICAgICAweDAxMDAgICAgICAvKiBkZWZhdWx0IHN5c3RlbSByZXNldCBvZmZzZXQgKi8KKyNkZWZpbmUgX1NUQVJUX09GRlNFVAkJRVhDX09GRl9TWVNfUkVTRVQKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBsMmNyIHZhbHVlcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9fZXhwb3J0cy5oIGIvaW5jbHVkZS9fZXhwb3J0cy5oCmluZGV4IDJiOGVjM2QuLmFmNDM4ODUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvX2V4cG9ydHMuaAorKysgYi9pbmNsdWRlL19leHBvcnRzLmgKQEAgLTE0LDggKzE0LDEzIEBACiBFWFBPUlRfRlVOQyhkb19yZXNldCkKIEVYUE9SVF9GVU5DKGdldGVudikKIEVYUE9SVF9GVU5DKHNldGVudikKKyNpZmRlZiBDT05GSUdfSEFTX1VJRAorRVhQT1JUX0ZVTkMoZm9yY2VlbnYpCisjZW5kaWYKIEVYUE9SVF9GVU5DKHNpbXBsZV9zdHJ0b3VsKQotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0kyQykKK0VYUE9SVF9GVU5DKHNpbXBsZV9zdHJ0b2wpCitFWFBPUlRfRlVOQyhzdHJjbXApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0kyQykKIEVYUE9SVF9GVU5DKGkyY193cml0ZSkKIEVYUE9SVF9GVU5DKGkyY19yZWFkKQotI2VuZGlmCS8qIENGR19DTURfSTJDICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWFybTcyMHQvaGFyZHdhcmUuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWFybTcyMHQvaGFyZHdhcmUuaAppbmRleCAxZTljZDQxLi4zMDU2Y2E3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hcm03MjB0L2hhcmR3YXJlLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXJtNzIwdC9oYXJkd2FyZS5oCkBAIC0zNiw4ICszNiw2IEBACiAvKiBpbmNsdWRlIGFybWFkaWxsbyBzcGVjaWZpYyBoYXJkd2FyZSBmaWxlIGlmIHRoZXJlIHdhcyBvbmUgKi8KICNlbGlmIGRlZmluZWQoQ09ORklHX0lOVEVHUkFUT1IpICYmIGRlZmluZWQoQ09ORklHX0FSQ0hfSU5URUdSQVRPUikKIC8qIGluY2x1ZGUgSW50ZWdyYXRvckNQL0NNNzIwVCBzcGVjaWZpYyBoYXJkd2FyZSBmaWxlIGlmIHRoZXJlIHdhcyBvbmUgKi8KLSNlbGlmIGRlZmluZWQoQ09ORklHX0xQQzIyOTIpCi0jaW5jbHVkZSA8YXNtLWFybS9hcmNoLWFybTcyMHQvbHBjMjI5Ml9yZWdpc3RlcnMuaD4KICNlbHNlCiAjZXJyb3IgTm8gaGFyZHdhcmUgZmlsZSBkZWZpbmVkIGZvciB0aGlzIGNvbmZpZ3VyYXRpb24KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtZGF2aW5jaS9lbWFjX2RlZnMuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWRhdmluY2kvZW1hY19kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUxMDExNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWRhdmluY2kvZW1hY19kZWZzLmgKQEAgLTAsMCArMSwzMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisgKgorICogQmFzZWQgb246CisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIGRtNjQ0eF9lbWFjLmgKKyAqCisgKiBUSSBEYVZpbmNpIChETTY0NFgpIEVNQUMgcGVyaXBoZXJhbCBkcml2ZXIgaGVhZGVyIGZvciBEVi1FVk0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGV4YXMgSW5zdHJ1bWVudHMuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgKiBNb2RpZmljYXRpb25zOgorICogdmVyLiAxLjA6IFNlcCAyMDA1LCBUSSBQU1AgVGVhbSAtIENyZWF0ZWQgRU1BQyB2ZXJzaW9uIGZvciB1Qm9vdC4KKyAqCisgKi8KKworI2lmbmRlZiBfRE02NDRYX0VNQUNfSF8KKyNkZWZpbmUgX0RNNjQ0WF9FTUFDX0hfCisKKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorCisjZGVmaW5lIEVNQUNfQkFTRV9BRERSCQkJKDB4MDFjODAwMDApCisjZGVmaW5lIEVNQUNfV1JBUFBFUl9CQVNFX0FERFIJCSgweDAxYzgxMDAwKQorI2RlZmluZSBFTUFDX1dSQVBQRVJfUkFNX0FERFIJCSgweDAxYzgyMDAwKQorI2RlZmluZSBFTUFDX01ESU9fQkFTRV9BRERSCQkoMHgwMWM4NDAwMCkKKworLyogTURJTyBtb2R1bGUgaW5wdXQgZnJlcXVlbmN5ICovCisjZGVmaW5lIEVNQUNfTURJT19CVVNfRlJFUQkJOTkwMDAwMDAJLyogUExMLzYgLSA5OSBNSHogKi8KKy8qIE1ESU8gY2xvY2sgb3V0cHV0IGZyZXF1ZW5jeSAqLworI2RlZmluZSBFTUFDX01ESU9fQ0xPQ0tfRlJFUQkJMjAwMDAwMAkJLyogMi4wIE1IeiAqLworCisvKiBFdGhlcm5ldCBNaW4vTWF4IHBhY2tldCBzaXplICovCisjZGVmaW5lIEVNQUNfTUlOX0VUSEVSTkVUX1BLVF9TSVpFCTYwCisjZGVmaW5lIEVNQUNfTUFYX0VUSEVSTkVUX1BLVF9TSVpFCTE1MTgKKyNkZWZpbmUgRU1BQ19QS1RfQUxJR04JCQkxOAkvKiAxNTE4ICsgMTggPSAxNTM2IChwYWNrZXQgYWxpZ25lZCBvbiAzMiBieXRlIGJvdW5kcnkpICovCisKKy8qIE51bWJlciBvZiBSWCBwYWNrZXQgYnVmZmVycworICogTk9URTogT25seSAxIGJ1ZmZlciBzdXBwb3J0ZWQgYXMgb2Ygbm93CisgKi8KKyNkZWZpbmUgRU1BQ19NQVhfUlhfQlVGRkVSUwkJMTAKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKiBJbnRlcm5hbGx5IHVzZWQgbWFjcm9zICoqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEVNQUNfQ0hfVFgJCQkxCisjZGVmaW5lIEVNQUNfQ0hfUlgJCQkwCisKKy8qIEVhY2ggZGVzY3JpcHRvciBvY2N1cGllcyA0IHdvcmRzLCBsZXRzIHN0YXJ0IFJYIGRlc2MncyBhdCAwIGFuZAorICogcmVzZXJ2ZSBzcGFjZSBmb3IgNjQgZGVzY3JpcHRvcnMgbWF4CisgKi8KKyNkZWZpbmUgRU1BQ19SWF9ERVNDX0JBU0UJCTB4MAorI2RlZmluZSBFTUFDX1RYX0RFU0NfQkFTRQkJMHgxMDAwCisKKy8qIEVNQUMgVGVhcmRvd24gdmFsdWUgKi8KKyNkZWZpbmUgRU1BQ19URUFSRE9XTl9WQUxVRQkJMHhmZmZmZmZmYworCisvKiBNSUkgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9TVEFUVVNfUkVHCQkJMQorCisvKiBOdW1iZXIgb2Ygc3RhdGlzdGljcyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRU1BQ19OVU1fU1RBVFMJCQkzNgorCisKKy8qIEVNQUMgRGVzY3JpcHRvciAqLwordHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3QgX2VtYWNfZGVzYworeworCXVfaW50MzJfdAluZXh0OwkJLyogUG9pbnRlciB0byBuZXh0IGRlc2NyaXB0b3IgaW4gY2hhaW4gKi8KKwl1X2ludDhfdAkqYnVmZmVyOwkvKiBQb2ludGVyIHRvIGRhdGEgYnVmZmVyICovCisJdV9pbnQzMl90CWJ1ZmZfb2ZmX2xlbjsJLyogQnVmZmVyIE9mZnNldChNU1cpIGFuZCBMZW5ndGgoTFNXKSAqLworCXVfaW50MzJfdAlwa3RfZmxhZ19sZW47CS8qIFBhY2tldCBGbGFncyhNU1cpIGFuZCBMZW5ndGgoTFNXKSAqLworfSBlbWFjX2Rlc2M7CisKKy8qIENQUEkgYml0IHBvc2l0aW9ucyAqLworI2RlZmluZSBFTUFDX0NQUElfU09QX0JJVAkJKDB4ODAwMDAwMDApCisjZGVmaW5lIEVNQUNfQ1BQSV9FT1BfQklUCQkoMHg0MDAwMDAwMCkKKyNkZWZpbmUgRU1BQ19DUFBJX09XTkVSU0hJUF9CSVQJCSgweDIwMDAwMDAwKQorI2RlZmluZSBFTUFDX0NQUElfRU9RX0JJVAkJKDB4MTAwMDAwMDApCisjZGVmaW5lIEVNQUNfQ1BQSV9URUFSRE9XTl9DT01QTEVURV9CSVQJKDB4MDgwMDAwMDApCisjZGVmaW5lIEVNQUNfQ1BQSV9QQVNTX0NSQ19CSVQJCSgweDA0MDAwMDAwKQorCisjZGVmaW5lIEVNQUNfQ1BQSV9SWF9FUlJPUl9GUkFNRQkoMHgwM2ZjMDAwMCkKKworI2RlZmluZSBFTUFDX01BQ0NPTlRST0xfTUlJRU5fRU5BQkxFCQkoMHgyMCkKKyNkZWZpbmUgRU1BQ19NQUNDT05UUk9MX0ZVTExEVVBMRVhfRU5BQkxFCSgweDEpCisKKyNkZWZpbmUgRU1BQ19SWE1CUEVOQUJMRV9SWENBRkVOX0VOQUJMRQkoMHgyMDAwMDApCisjZGVmaW5lIEVNQUNfUlhNQlBFTkFCTEVfUlhCUk9BREVOCSgweDIwMDApCisKKworI2RlZmluZSBNRElPX0NPTlRST0xfSURMRQkJKDB4ODAwMDAwMDApCisjZGVmaW5lIE1ESU9fQ09OVFJPTF9FTkFCTEUJCSgweDQwMDAwMDAwKQorI2RlZmluZSBNRElPX0NPTlRST0xfRkFVTFRfRU5BQkxFCSgweDQwMDAwKQorI2RlZmluZSBNRElPX0NPTlRST0xfRkFVTFQJCSgweDgwMDAwKQorI2RlZmluZSBNRElPX1VTRVJBQ0NFU1MwX0dPCQkoMHg4MDAwMDAwMCkKKyNkZWZpbmUgTURJT19VU0VSQUNDRVNTMF9XUklURV9SRUFECSgweDApCisjZGVmaW5lIE1ESU9fVVNFUkFDQ0VTUzBfV1JJVEVfV1JJVEUJKDB4NDAwMDAwMDApCisjZGVmaW5lIE1ESU9fVVNFUkFDQ0VTUzBfQUNLCQkoMHgyMDAwMDAwMCkKKworLyogRXRoZXJuZXQgTUFDIFJlZ2lzdGVycyBTdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0ICB7CisJZHZfcmVnCQlUWElEVkVSOworCWR2X3JlZwkJVFhDT05UUk9MOworCWR2X3JlZwkJVFhURUFSRE9XTjsKKwl1X2ludDhfdAlSU1ZEMFs0XTsKKwlkdl9yZWcJCVJYSURWRVI7CisJZHZfcmVnCQlSWENPTlRST0w7CisJZHZfcmVnCQlSWFRFQVJET1dOOworCXVfaW50OF90CVJTVkQxWzEwMF07CisJZHZfcmVnCQlUWElOVFNUQVRSQVc7CisJZHZfcmVnCQlUWElOVFNUQVRNQVNLRUQ7CisJZHZfcmVnCQlUWElOVE1BU0tTRVQ7CisJZHZfcmVnCQlUWElOVE1BU0tDTEVBUjsKKwlkdl9yZWcJCU1BQ0lOVkVDVE9SOworCXVfaW50OF90CVJTVkQyWzEyXTsKKwlkdl9yZWcJCVJYSU5UU1RBVFJBVzsKKwlkdl9yZWcJCVJYSU5UU1RBVE1BU0tFRDsKKwlkdl9yZWcJCVJYSU5UTUFTS1NFVDsKKwlkdl9yZWcJCVJYSU5UTUFTS0NMRUFSOworCWR2X3JlZwkJTUFDSU5UU1RBVFJBVzsKKwlkdl9yZWcJCU1BQ0lOVFNUQVRNQVNLRUQ7CisJZHZfcmVnCQlNQUNJTlRNQVNLU0VUOworCWR2X3JlZwkJTUFDSU5UTUFTS0NMRUFSOworCXVfaW50OF90CVJTVkQzWzY0XTsKKwlkdl9yZWcJCVJYTUJQRU5BQkxFOworCWR2X3JlZwkJUlhVTklDQVNUU0VUOworCWR2X3JlZwkJUlhVTklDQVNUQ0xFQVI7CisJZHZfcmVnCQlSWE1BWExFTjsKKwlkdl9yZWcJCVJYQlVGRkVST0ZGU0VUOworCWR2X3JlZwkJUlhGSUxURVJMT1dUSFJFU0g7CisJdV9pbnQ4X3QJUlNWRDRbOF07CisJZHZfcmVnCQlSWDBGTE9XVEhSRVNIOworCWR2X3JlZwkJUlgxRkxPV1RIUkVTSDsKKwlkdl9yZWcJCVJYMkZMT1dUSFJFU0g7CisJZHZfcmVnCQlSWDNGTE9XVEhSRVNIOworCWR2X3JlZwkJUlg0RkxPV1RIUkVTSDsKKwlkdl9yZWcJCVJYNUZMT1dUSFJFU0g7CisJZHZfcmVnCQlSWDZGTE9XVEhSRVNIOworCWR2X3JlZwkJUlg3RkxPV1RIUkVTSDsKKwlkdl9yZWcJCVJYMEZSRUVCVUZGRVI7CisJZHZfcmVnCQlSWDFGUkVFQlVGRkVSOworCWR2X3JlZwkJUlgyRlJFRUJVRkZFUjsKKwlkdl9yZWcJCVJYM0ZSRUVCVUZGRVI7CisJZHZfcmVnCQlSWDRGUkVFQlVGRkVSOworCWR2X3JlZwkJUlg1RlJFRUJVRkZFUjsKKwlkdl9yZWcJCVJYNkZSRUVCVUZGRVI7CisJZHZfcmVnCQlSWDdGUkVFQlVGRkVSOworCWR2X3JlZwkJTUFDQ09OVFJPTDsKKwlkdl9yZWcJCU1BQ1NUQVRVUzsKKwlkdl9yZWcJCUVNQ09OVFJPTDsKKwlkdl9yZWcJCUZJRk9DT05UUk9MOworCWR2X3JlZwkJTUFDQ09ORklHOworCWR2X3JlZwkJU09GVFJFU0VUOworCXVfaW50OF90CVJTVkQ1Wzg4XTsKKwlkdl9yZWcJCU1BQ1NSQ0FERFJMTzsKKwlkdl9yZWcJCU1BQ1NSQ0FERFJISTsKKwlkdl9yZWcJCU1BQ0hBU0gxOworCWR2X3JlZwkJTUFDSEFTSDI7CisJZHZfcmVnCQlCT0ZGVEVTVDsKKwlkdl9yZWcJCVRQQUNFVEVTVDsKKwlkdl9yZWcJCVJYUEFVU0U7CisJZHZfcmVnCQlUWFBBVVNFOworCXVfaW50OF90CVJTVkQ2WzE2XTsKKwlkdl9yZWcJCVJYR09PREZSQU1FUzsKKwlkdl9yZWcJCVJYQkNBU1RGUkFNRVM7CisJZHZfcmVnCQlSWE1DQVNURlJBTUVTOworCWR2X3JlZwkJUlhQQVVTRUZSQU1FUzsKKwlkdl9yZWcJCVJYQ1JDRVJST1JTOworCWR2X3JlZwkJUlhBTElHTkNPREVFUlJPUlM7CisJZHZfcmVnCQlSWE9WRVJTSVpFRDsKKwlkdl9yZWcJCVJYSkFCQkVSOworCWR2X3JlZwkJUlhVTkRFUlNJWkVEOworCWR2X3JlZwkJUlhGUkFHTUVOVFM7CisJZHZfcmVnCQlSWEZJTFRFUkVEOworCWR2X3JlZwkJUlhRT1NGSUxURVJFRDsKKwlkdl9yZWcJCVJYT0NURVRTOworCWR2X3JlZwkJVFhHT09ERlJBTUVTOworCWR2X3JlZwkJVFhCQ0FTVEZSQU1FUzsKKwlkdl9yZWcJCVRYTUNBU1RGUkFNRVM7CisJZHZfcmVnCQlUWFBBVVNFRlJBTUVTOworCWR2X3JlZwkJVFhERUZFUlJFRDsKKwlkdl9yZWcJCVRYQ09MTElTSU9OOworCWR2X3JlZwkJVFhTSU5HTEVDT0xMOworCWR2X3JlZwkJVFhNVUxUSUNPTEw7CisJZHZfcmVnCQlUWEVYQ0VTU0lWRUNPTEw7CisJZHZfcmVnCQlUWExBVEVDT0xMOworCWR2X3JlZwkJVFhVTkRFUlJVTjsKKwlkdl9yZWcJCVRYQ0FSUklFUlNFTlNFOworCWR2X3JlZwkJVFhPQ1RFVFM7CisJZHZfcmVnCQlGUkFNRTY0OworCWR2X3JlZwkJRlJBTUU2NVQxMjc7CisJZHZfcmVnCQlGUkFNRTEyOFQyNTU7CisJZHZfcmVnCQlGUkFNRTI1NlQ1MTE7CisJZHZfcmVnCQlGUkFNRTUxMlQxMDIzOworCWR2X3JlZwkJRlJBTUUxMDI0VFVQOworCWR2X3JlZwkJTkVUT0NURVRTOworCWR2X3JlZwkJUlhTT0ZPVkVSUlVOUzsKKwlkdl9yZWcJCVJYTU9GT1ZFUlJVTlM7CisJZHZfcmVnCQlSWERNQU9WRVJSVU5TOworCXVfaW50OF90CVJTVkQ3WzYyNF07CisJZHZfcmVnCQlNQUNBRERSTE87CisJZHZfcmVnCQlNQUNBRERSSEk7CisJZHZfcmVnCQlNQUNJTkRFWDsKKwl1X2ludDhfdAlSU1ZEOFsyNDRdOworCWR2X3JlZwkJVFgwSERQOworCWR2X3JlZwkJVFgxSERQOworCWR2X3JlZwkJVFgySERQOworCWR2X3JlZwkJVFgzSERQOworCWR2X3JlZwkJVFg0SERQOworCWR2X3JlZwkJVFg1SERQOworCWR2X3JlZwkJVFg2SERQOworCWR2X3JlZwkJVFg3SERQOworCWR2X3JlZwkJUlgwSERQOworCWR2X3JlZwkJUlgxSERQOworCWR2X3JlZwkJUlgySERQOworCWR2X3JlZwkJUlgzSERQOworCWR2X3JlZwkJUlg0SERQOworCWR2X3JlZwkJUlg1SERQOworCWR2X3JlZwkJUlg2SERQOworCWR2X3JlZwkJUlg3SERQOworCWR2X3JlZwkJVFgwQ1A7CisJZHZfcmVnCQlUWDFDUDsKKwlkdl9yZWcJCVRYMkNQOworCWR2X3JlZwkJVFgzQ1A7CisJZHZfcmVnCQlUWDRDUDsKKwlkdl9yZWcJCVRYNUNQOworCWR2X3JlZwkJVFg2Q1A7CisJZHZfcmVnCQlUWDdDUDsKKwlkdl9yZWcJCVJYMENQOworCWR2X3JlZwkJUlgxQ1A7CisJZHZfcmVnCQlSWDJDUDsKKwlkdl9yZWcJCVJYM0NQOworCWR2X3JlZwkJUlg0Q1A7CisJZHZfcmVnCQlSWDVDUDsKKwlkdl9yZWcJCVJYNkNQOworCWR2X3JlZwkJUlg3Q1A7Cit9IGVtYWNfcmVnczsKKworLyogRU1BQyBXcmFwcGVyIFJlZ2lzdGVycyBTdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0ICB7CisJdV9pbnQ4X3QJUlNWRDBbNDEwMF07CisJZHZfcmVnCQlFV0NUTDsKKwlkdl9yZWcJCUVXSU5UVENOVDsKK30gZXdyYXBfcmVnczsKKworCisvKiBFTUFDIE1ESU8gUmVnaXN0ZXJzIFN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgIHsKKwlkdl9yZWcJCVZFUlNJT047CisJZHZfcmVnCQlDT05UUk9MOworCWR2X3JlZwkJQUxJVkU7CisJZHZfcmVnCQlMSU5LOworCWR2X3JlZwkJTElOS0lOVFJBVzsKKwlkdl9yZWcJCUxJTktJTlRNQVNLRUQ7CisJdV9pbnQ4X3QJUlNWRDBbOF07CisJZHZfcmVnCQlVU0VSSU5UUkFXOworCWR2X3JlZwkJVVNFUklOVE1BU0tFRDsKKwlkdl9yZWcJCVVTRVJJTlRNQVNLU0VUOworCWR2X3JlZwkJVVNFUklOVE1BU0tDTEVBUjsKKwl1X2ludDhfdAlSU1ZEMVs4MF07CisJZHZfcmVnCQlVU0VSQUNDRVNTMDsKKwlkdl9yZWcJCVVTRVJQSFlTRUwwOworCWR2X3JlZwkJVVNFUkFDQ0VTUzE7CisJZHZfcmVnCQlVU0VSUEhZU0VMMTsKK30gbWRpb19yZWdzOworCitpbnQgZG02NDR4X2V0aF9waHlfcmVhZCh1X2ludDhfdCBwaHlfYWRkciwgdV9pbnQ4X3QgcmVnX251bSwgdV9pbnQxNl90ICpkYXRhKTsKK2ludCBkbTY0NHhfZXRoX3BoeV93cml0ZSh1X2ludDhfdCBwaHlfYWRkciwgdV9pbnQ4X3QgcmVnX251bSwgdV9pbnQxNl90IGRhdGEpOworCit0eXBlZGVmIHN0cnVjdAoreworCWNoYXIJbmFtZVs2NF07CisJaW50CSgqaW5pdCkoaW50IHBoeV9hZGRyKTsKKwlpbnQJKCppc19waHlfY29ubmVjdGVkKShpbnQgcGh5X2FkZHIpOworCWludAkoKmdldF9saW5rX3NwZWVkKShpbnQgcGh5X2FkZHIpOworCWludAkoKmF1dG9fbmVnb3RpYXRlKShpbnQgcGh5X2FkZHIpOworfSBwaHlfdDsKKworI2RlZmluZSBQSFlfTFhUOTcyCSgweDAwMTM3OGUyKQoraW50IGx4dDk3Ml9pc19waHlfY29ubmVjdGVkKGludCBwaHlfYWRkcik7CitpbnQgbHh0OTcyX2dldF9saW5rX3NwZWVkKGludCBwaHlfYWRkcik7CitpbnQgbHh0OTcyX2luaXRfcGh5KGludCBwaHlfYWRkcik7CitpbnQgbHh0OTcyX2F1dG9fbmVnb3RpYXRlKGludCBwaHlfYWRkcik7CisKKyNkZWZpbmUgUEhZX0RQODM4NDgJKDB4MjAwMDVjOTApCitpbnQgZHA4Mzg0OF9pc19waHlfY29ubmVjdGVkKGludCBwaHlfYWRkcik7CitpbnQgZHA4Mzg0OF9nZXRfbGlua19zcGVlZChpbnQgcGh5X2FkZHIpOworaW50IGRwODM4NDhfaW5pdF9waHkoaW50IHBoeV9hZGRyKTsKK2ludCBkcDgzODQ4X2F1dG9fbmVnb3RpYXRlKGludCBwaHlfYWRkcik7CisKKyNlbmRpZiAgLyogX0RNNjQ0WF9FTUFDX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1kYXZpbmNpL2VtaWZfZGVmcy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtZGF2aW5jaS9lbWlmX2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDZmYzc3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtZGF2aW5jaS9lbWlmX2RlZnMuaApAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaWZuZGVmIF9FTUlGX0RFRlNfSF8KKyNkZWZpbmUgX0VNSUZfREVGU19IXworCisjaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KKwordHlwZWRlZiBzdHJ1Y3QgeworCWR2X3JlZwkJRVJDU1I7CisJZHZfcmVnCQlBV0NDUjsKKwlkdl9yZWcJCVNEQkNSOworCWR2X3JlZwkJU0RSQ1I7CisJZHZfcmVnCQlBQjFDUjsKKwlkdl9yZWcJCUFCMkNSOworCWR2X3JlZwkJQUIzQ1I7CisJZHZfcmVnCQlBQjRDUjsKKwlkdl9yZWcJCVNEVElNUjsKKwlkdl9yZWcJCUREUlNSOworCWR2X3JlZwkJRERSUEhZQ1I7CisJZHZfcmVnCQlERFJQSFlTUjsKKwlkdl9yZWcJCVRPVEFSOworCWR2X3JlZwkJVE9UQUNUUjsKKwlkdl9yZWcJCUREUlBIWUlEX1JFVjsKKwlkdl9yZWcJCVNEU1JFVFI7CisJZHZfcmVnCQlFSVJSOworCWR2X3JlZwkJRUlNUjsKKwlkdl9yZWcJCUVJTVNSOworCWR2X3JlZwkJRUlNQ1I7CisJZHZfcmVnCQlJT0NUUkxSOworCWR2X3JlZwkJSU9TVEFUUjsKKwl1X2ludDhfdAlSU1ZEMFs4XTsKKwlkdl9yZWcJCU5BTkRGQ1I7CisJZHZfcmVnCQlOQU5ERlNSOworCXVfaW50OF90CVJTVkQxWzhdOworCWR2X3JlZwkJTkFOREYxRUNDOworCWR2X3JlZwkJTkFOREYyRUNDOworCWR2X3JlZwkJTkFOREYzRUNDOworCWR2X3JlZwkJTkFOREY0RUNDOworfSBlbWlmX3JlZ2lzdGVyczsKKwordHlwZWRlZiBlbWlmX3JlZ2lzdGVycwkqZW1pZnJlZ3M7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWRhdmluY2kvaGFyZHdhcmUuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWRhdmluY2kvaGFyZHdhcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmNkY2ZlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtZGF2aW5jaS9oYXJkd2FyZS5oCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorICoKKyAqIEJhc2VkIG9uOgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtZGF2aW5jaS9oYXJkd2FyZS5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNiBUZXhhcyBJbnN0cnVtZW50cy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisjaWZuZGVmIF9fQVNNX0FSQ0hfSEFSRFdBUkVfSAorI2RlZmluZSBfX0FTTV9BUkNIX0hBUkRXQVJFX0gKKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9zaXplcy5oPgorCisjZGVmaW5lCVJFRyhhZGRyKQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikoYWRkcikpCisjZGVmaW5lIFJFR19QKGFkZHIpCSgodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKGFkZHIpKQorCit0eXBlZGVmIHZvbGF0aWxlIHVuc2lnbmVkIGludAlkdl9yZWc7Cit0eXBlZGVmIHZvbGF0aWxlIHVuc2lnbmVkIGludCAqCWR2X3JlZ19wOworCisvKgorICogQmFzZSByZWdpc3RlciBhZGRyZXNzZXMKKyAqLworI2RlZmluZSBEQVZJTkNJX0RNQV8zUENDX0JBU0UJCQkoMHgwMWMwMDAwMCkKKyNkZWZpbmUgREFWSU5DSV9ETUFfM1BUQzBfQkFTRQkJCSgweDAxYzEwMDAwKQorI2RlZmluZSBEQVZJTkNJX0RNQV8zUFRDMV9CQVNFCQkJKDB4MDFjMTA0MDApCisjZGVmaW5lIERBVklOQ0lfVUFSVDBfQkFTRQkJCSgweDAxYzIwMDAwKQorI2RlZmluZSBEQVZJTkNJX1VBUlQxX0JBU0UJCQkoMHgwMWMyMDQwMCkKKyNkZWZpbmUgREFWSU5DSV9VQVJUMl9CQVNFCQkJKDB4MDFjMjA4MDApCisjZGVmaW5lIERBVklOQ0lfSTJDX0JBU0UJCQkoMHgwMWMyMTAwMCkKKyNkZWZpbmUgREFWSU5DSV9USU1FUjBfQkFTRQkJCSgweDAxYzIxNDAwKQorI2RlZmluZSBEQVZJTkNJX1RJTUVSMV9CQVNFCQkJKDB4MDFjMjE4MDApCisjZGVmaW5lIERBVklOQ0lfV0RPR19CQVNFCQkJKDB4MDFjMjFjMDApCisjZGVmaW5lIERBVklOQ0lfUFdNMF9CQVNFCQkJKDB4MDFjMjIwMDApCisjZGVmaW5lIERBVklOQ0lfUFdNMV9CQVNFCQkJKDB4MDFjMjI0MDApCisjZGVmaW5lIERBVklOQ0lfUFdNMl9CQVNFCQkJKDB4MDFjMjI4MDApCisjZGVmaW5lIERBVklOQ0lfU1lTVEVNX01PRFVMRV9CQVNFCQkoMHgwMWM0MDAwMCkKKyNkZWZpbmUgREFWSU5DSV9QTExfQ05UUkwwX0JBU0UJCQkoMHgwMWM0MDgwMCkKKyNkZWZpbmUgREFWSU5DSV9QTExfQ05UUkwxX0JBU0UJCQkoMHgwMWM0MGMwMCkKKyNkZWZpbmUgREFWSU5DSV9QV1JfU0xFRVBfQ05UUkxfQkFTRQkJKDB4MDFjNDEwMDApCisjZGVmaW5lIERBVklOQ0lfU1lTVEVNX0RGVF9CQVNFCQkJKDB4MDFjNDIwMDApCisjZGVmaW5lIERBVklOQ0lfQVJNX0lOVENfQkFTRQkJCSgweDAxYzQ4MDAwKQorI2RlZmluZSBEQVZJTkNJX0lFRUUxMzk0X0JBU0UJCQkoMHgwMWM2MDAwMCkKKyNkZWZpbmUgREFWSU5DSV9VU0JfT1RHX0JBU0UJCQkoMHgwMWM2NDAwMCkKKyNkZWZpbmUgREFWSU5DSV9DRkNfQVRBX0JBU0UJCQkoMHgwMWM2NjAwMCkKKyNkZWZpbmUgREFWSU5DSV9TUElfQkFTRQkJCSgweDAxYzY2ODAwKQorI2RlZmluZSBEQVZJTkNJX0dQSU9fQkFTRQkJCSgweDAxYzY3MDAwKQorI2RlZmluZSBEQVZJTkNJX1VIUElfQkFTRQkJCSgweDAxYzY3ODAwKQorI2RlZmluZSBEQVZJTkNJX1ZQU1NfUkVHU19CQVNFCQkJKDB4MDFjNzAwMDApCisjZGVmaW5lIERBVklOQ0lfRU1BQ19DTlRSTF9SRUdTX0JBU0UJCSgweDAxYzgwMDAwKQorI2RlZmluZSBEQVZJTkNJX0VNQUNfV1JBUFBFUl9DTlRSTF9SRUdTX0JBU0UJKDB4MDFjODEwMDApCisjZGVmaW5lIERBVklOQ0lfRU1BQ19XUkFQUEVSX1JBTV9CQVNFCQkoMHgwMWM4MjAwMCkKKyNkZWZpbmUgREFWSU5DSV9NRElPX0NOVFJMX1JFR1NfQkFTRQkJKDB4MDFjODQwMDApCisjZGVmaW5lIERBVklOQ0lfSU1DT1BfQkFTRQkJCSgweDAxY2MwMDAwKQorI2RlZmluZSBEQVZJTkNJX0FTWU5DX0VNSUZfQ05UUkxfQkFTRQkJKDB4MDFlMDAwMDApCisjZGVmaW5lIERBVklOQ0lfVkxZTlFfQkFTRQkJCSgweDAxZTAxMDAwKQorI2RlZmluZSBEQVZJTkNJX01DQlNQX0JBU0UJCQkoMHgwMWUwMjAwMCkKKyNkZWZpbmUgREFWSU5DSV9NTUNfU0RfQkFTRQkJCSgweDAxZTEwMDAwKQorI2RlZmluZSBEQVZJTkNJX01TX0JBU0UJCQkJKDB4MDFlMjAwMDApCisjZGVmaW5lIERBVklOQ0lfQVNZTkNfRU1JRl9EQVRBX0NFMF9CQVNFCSgweDAyMDAwMDAwKQorI2RlZmluZSBEQVZJTkNJX0FTWU5DX0VNSUZfREFUQV9DRTFfQkFTRQkoMHgwNDAwMDAwMCkKKyNkZWZpbmUgREFWSU5DSV9BU1lOQ19FTUlGX0RBVEFfQ0UyX0JBU0UJKDB4MDYwMDAwMDApCisjZGVmaW5lIERBVklOQ0lfQVNZTkNfRU1JRl9EQVRBX0NFM19CQVNFCSgweDA4MDAwMDAwKQorI2RlZmluZSBEQVZJTkNJX1ZMWU5RX1JFTU9URV9CQVNFCQkoMHgwYzAwMDAwMCkKKworLyogUG93ZXIgYW5kIFNsZWVwIENvbnRyb2xsZXIgKFBTQykgRG9tYWlucyAqLworI2RlZmluZSBEQVZJTkNJX0dQU0NfQVJNRE9NQUlOCQkwCisjZGVmaW5lIERBVklOQ0lfR1BTQ19EU1BET01BSU4JCTEKKworI2RlZmluZSBEQVZJTkNJX0xQU0NfVlBTU01TVFIJCTAKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1ZQU1NTTFYJCTEKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1RQQ0MJCTIKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1RQVEMwCQkzCisjZGVmaW5lIERBVklOQ0lfTFBTQ19UUFRDMQkJNAorI2RlZmluZSBEQVZJTkNJX0xQU0NfRU1BQwkJNQorI2RlZmluZSBEQVZJTkNJX0xQU0NfRU1BQ19XUkFQUEVSCTYKKyNkZWZpbmUgREFWSU5DSV9MUFNDX01ESU8JCTcKKyNkZWZpbmUgREFWSU5DSV9MUFNDX0lFRUUxMzk0CQk4CisjZGVmaW5lIERBVklOQ0lfTFBTQ19VU0IJCTkKKyNkZWZpbmUgREFWSU5DSV9MUFNDX0FUQQkJMTAKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1ZMWU5RCQkxMQorI2RlZmluZSBEQVZJTkNJX0xQU0NfVUhQSQkJMTIKKyNkZWZpbmUgREFWSU5DSV9MUFNDX0REUl9FTUlGCQkxMworI2RlZmluZSBEQVZJTkNJX0xQU0NfQUVNSUYJCTE0CisjZGVmaW5lIERBVklOQ0lfTFBTQ19NTUNfU0QJCTE1CisjZGVmaW5lIERBVklOQ0lfTFBTQ19NRU1TVElDSwkJMTYKKyNkZWZpbmUgREFWSU5DSV9MUFNDX01jQlNQCQkxNworI2RlZmluZSBEQVZJTkNJX0xQU0NfSTJDCQkxOAorI2RlZmluZSBEQVZJTkNJX0xQU0NfVUFSVDAJCTE5CisjZGVmaW5lIERBVklOQ0lfTFBTQ19VQVJUMQkJMjAKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1VBUlQyCQkyMQorI2RlZmluZSBEQVZJTkNJX0xQU0NfU1BJCQkyMgorI2RlZmluZSBEQVZJTkNJX0xQU0NfUFdNMAkJMjMKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1BXTTEJCTI0CisjZGVmaW5lIERBVklOQ0lfTFBTQ19QV00yCQkyNQorI2RlZmluZSBEQVZJTkNJX0xQU0NfR1BJTwkJMjYKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1RJTUVSMAkJMjcKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1RJTUVSMQkJMjgKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1RJTUVSMgkJMjkKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1NZU1RFTV9TVUJTWVMJMzAKKyNkZWZpbmUgREFWSU5DSV9MUFNDX0FSTQkJMzEKKyNkZWZpbmUgREFWSU5DSV9MUFNDX1NDUjIJCTMyCisjZGVmaW5lIERBVklOQ0lfTFBTQ19TQ1IzCQkzMworI2RlZmluZSBEQVZJTkNJX0xQU0NfU0NSNAkJMzQKKyNkZWZpbmUgREFWSU5DSV9MUFNDX0NST1NTQkFSCQkzNQorI2RlZmluZSBEQVZJTkNJX0xQU0NfQ0ZHMjcJCTM2CisjZGVmaW5lIERBVklOQ0lfTFBTQ19DRkczCQkzNworI2RlZmluZSBEQVZJTkNJX0xQU0NfQ0ZHNQkJMzgKKyNkZWZpbmUgREFWSU5DSV9MUFNDX0dFTQkJMzkKKyNkZWZpbmUgREFWSU5DSV9MUFNDX0lNQ09QCQk0MAorCisvKiBTb21lIFBTQyBkZWZpbmVzICovCisjZGVmaW5lIFBTQ19DSFBfU0hSVFNXCQkJKDB4MDFjNDAwMzgpCisjZGVmaW5lIFBTQ19HQkxDVEwJCQkoMHgwMWM0MTAxMCkKKyNkZWZpbmUgUFNDX0VQQ1BSCQkJKDB4MDFjNDEwNzApCisjZGVmaW5lIFBTQ19FUENDUgkJCSgweDAxYzQxMDc4KQorI2RlZmluZSBQU0NfUFRDTUQJCQkoMHgwMWM0MTEyMCkKKyNkZWZpbmUgUFNDX1BUU1RBVAkJCSgweDAxYzQxMTI4KQorI2RlZmluZSBQU0NfUERTVEFUCQkJKDB4MDFjNDEyMDApCisjZGVmaW5lIFBTQ19QRFNUQVQxCQkJKDB4MDFjNDEyMDQpCisjZGVmaW5lIFBTQ19QRENUTAkJCSgweDAxYzQxMzAwKQorI2RlZmluZSBQU0NfUERDVEwxCQkJKDB4MDFjNDEzMDQpCisKKyNkZWZpbmUgUFNDX01EQ1RMX0JBU0UJCQkoMHgwMWM0MWEwMCkKKyNkZWZpbmUgUFNDX01EU1RBVF9CQVNFCQkJKDB4MDFjNDE4MDApCisKKyNkZWZpbmUgVkREM1AzVl9QV0ROCQkJKDB4MDFjNDAwNDgpCisjZGVmaW5lIFVBUlQwX1BXUkVNVV9NR01UCQkoMHgwMWMyMDAzMCkKKworI2RlZmluZSBQU0NfU0lMVkVSX0JVTExFVAkJKDB4MDFjNDFhMjApCisKKy8qIFNvbWUgUExMIGRlZmluZXMgKi8KKyNkZWZpbmUgUExMMV9QTExNCQkJKDB4MDFjNDA5MTApCisjZGVmaW5lIFBMTDJfUExMTQkJCSgweDAxYzQwZDEwKQorI2RlZmluZSBQTEwyX0RJVjIJCQkoMHgwMWM0MGQxYykKKworLyogTWlzY2VsbGFuaWEuLi4gKi8KKyNkZWZpbmUgVkJQUgkJCQkoMHgyMDAwMDAyMCkKKyNkZWZpbmUgUElOTVVYMAkJCQkoMHgwMWM0MDAwMCkKKyNkZWZpbmUgUElOTVVYMQkJCQkoMHgwMWM0MDAwNCkKKworI2VuZGlmIC8qIF9fQVNNX0FSQ0hfSEFSRFdBUkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtZGF2aW5jaS9pMmNfZGVmcy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtZGF2aW5jaS9pMmNfZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlOTAyZTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1kYXZpbmNpL2kyY19kZWZzLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICoKKyAqIFNvbWUgY2hhbmdlcyBjb3B5cmlnaHQgKEMpIDIwMDcgU2VyZ2V5IEt1YnVzaHluIDxrc2lAa29pOC5uZXQ+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpZm5kZWYgX0RBVklOQ0lfSTJDX0hfCisjZGVmaW5lIF9EQVZJTkNJX0kyQ19IXworCisjZGVmaW5lIEkyQ19XUklURQkJMAorI2RlZmluZSBJMkNfUkVBRAkJMQorCisjZGVmaW5lIEkyQ19CQVNFCQkweDAxYzIxMDAwCisKKyNkZWZpbmUJSTJDX09BCQkJKEkyQ19CQVNFICsgMHgwMCkKKyNkZWZpbmUgSTJDX0lFCQkJKEkyQ19CQVNFICsgMHgwNCkKKyNkZWZpbmUgSTJDX1NUQVQJCShJMkNfQkFTRSArIDB4MDgpCisjZGVmaW5lIEkyQ19TQ0xMCQkoSTJDX0JBU0UgKyAweDBjKQorI2RlZmluZSBJMkNfU0NMSAkJKEkyQ19CQVNFICsgMHgxMCkKKyNkZWZpbmUgSTJDX0NOVAkJCShJMkNfQkFTRSArIDB4MTQpCisjZGVmaW5lIEkyQ19EUlIJCQkoSTJDX0JBU0UgKyAweDE4KQorI2RlZmluZSBJMkNfU0EJCQkoSTJDX0JBU0UgKyAweDFjKQorI2RlZmluZSBJMkNfRFhSCQkJKEkyQ19CQVNFICsgMHgyMCkKKyNkZWZpbmUgSTJDX0NPTgkJCShJMkNfQkFTRSArIDB4MjQpCisjZGVmaW5lIEkyQ19JVgkJCShJMkNfQkFTRSArIDB4MjgpCisjZGVmaW5lIEkyQ19QU0MJCQkoSTJDX0JBU0UgKyAweDMwKQorCisvKiBJMkMgbWFza3MgKi8KKworLyogSTJDIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKEkyQ19JRSk6ICovCisjZGVmaW5lIEkyQ19JRV9TQ0RfSUUJKDEgPDwgNSkJLyogU3RvcCBjb25kaXRpb24gZGV0ZWN0IGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSTJDX0lFX1hSRFlfSUUJKDEgPDwgNCkJLyogVHJhbnNtaXQgZGF0YSByZWFkeSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIEkyQ19JRV9SUkRZX0lFCSgxIDw8IDMpCS8qIFJlY2VpdmUgZGF0YSByZWFkeSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIEkyQ19JRV9BUkRZX0lFCSgxIDw8IDIpCS8qIFJlZ2lzdGVyIGFjY2VzcyByZWFkeSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIEkyQ19JRV9OQUNLX0lFCSgxIDw8IDEpCS8qIE5vIGFja25vd2xlZGdtZW50IGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSTJDX0lFX0FMX0lFCSgxIDw8IDApCS8qIEFyYml0cmF0aW9uIGxvc3QgaW50ZXJydXB0IGVuYWJsZSAqLworCisvKiBJMkMgU3RhdHVzIFJlZ2lzdGVyIChJMkNfU1RBVCk6ICovCisKKyNkZWZpbmUgSTJDX1NUQVRfQkIJKDEgPDwgMTIpCS8qIEJ1cyBidXN5ICovCisjZGVmaW5lIEkyQ19TVEFUX1JPVlIJKDEgPDwgMTEpCS8qIFJlY2VpdmUgb3ZlcnJ1biAqLworI2RlZmluZSBJMkNfU1RBVF9YVURGCSgxIDw8IDEwKQkvKiBUcmFuc21pdCB1bmRlcmZsb3cgKi8KKyNkZWZpbmUgSTJDX1NUQVRfQUFTCSgxIDw8IDkpCS8qIEFkZHJlc3MgYXMgc2xhdmUgKi8KKyNkZWZpbmUgSTJDX1NUQVRfU0NECSgxIDw8IDUpCS8qIFN0b3AgY29uZGl0aW9uIGRldGVjdCAqLworI2RlZmluZSBJMkNfU1RBVF9YUkRZCSgxIDw8IDQpCS8qIFRyYW5zbWl0IGRhdGEgcmVhZHkgKi8KKyNkZWZpbmUgSTJDX1NUQVRfUlJEWQkoMSA8PCAzKQkvKiBSZWNlaXZlIGRhdGEgcmVhZHkgKi8KKyNkZWZpbmUgSTJDX1NUQVRfQVJEWQkoMSA8PCAyKQkvKiBSZWdpc3RlciBhY2Nlc3MgcmVhZHkgKi8KKyNkZWZpbmUgSTJDX1NUQVRfTkFDSwkoMSA8PCAxKQkvKiBObyBhY2tub3dsZWRnbWVudCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIEkyQ19TVEFUX0FMCSgxIDw8IDApCS8qIEFyYml0cmF0aW9uIGxvc3QgaW50ZXJydXB0IGVuYWJsZSAqLworCisKKy8qIEkyQyBJbnRlcnJ1cHQgQ29kZSBSZWdpc3RlciAoSTJDX0lOVENPREUpOiAqLworCisjZGVmaW5lIEkyQ19JTlRDT0RFX01BU0sJNworI2RlZmluZSBJMkNfSU5UQ09ERV9OT05FCTAKKyNkZWZpbmUgSTJDX0lOVENPREVfQUwJCTEJLyogQXJiaXRyYXRpb24gbG9zdCAqLworI2RlZmluZSBJMkNfSU5UQ09ERV9OQUsJCTIJLyogTm8gYWNrbm93bGVkZ2VtZW50L2dlbmVyYWwgY2FsbCAqLworI2RlZmluZSBJMkNfSU5UQ09ERV9BUkRZCTMJLyogUmVnaXN0ZXIgYWNjZXNzIHJlYWR5ICovCisjZGVmaW5lIEkyQ19JTlRDT0RFX1JSRFkJNAkvKiBSY3YgZGF0YSByZWFkeSAqLworI2RlZmluZSBJMkNfSU5UQ09ERV9YUkRZCTUJLyogWG1pdCBkYXRhIHJlYWR5ICovCisjZGVmaW5lIEkyQ19JTlRDT0RFX1NDRAkJNgkvKiBTdG9wIGNvbmRpdGlvbiBkZXRlY3QgKi8KKworCisvKiBJMkMgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoSTJDX0NPTik6ICovCisKKyNkZWZpbmUgSTJDX0NPTl9FTgkoMSA8PCA1KQkvKiBJMkMgbW9kdWxlIGVuYWJsZSAqLworI2RlZmluZSBJMkNfQ09OX1NUQgkoMSA8PCA0KQkvKiBTdGFydCBieXRlIG1vZGUgKG1hc3RlciBtb2RlIG9ubHkpICovCisjZGVmaW5lIEkyQ19DT05fTVNUCSgxIDw8IDEwKQkvKiBNYXN0ZXIvc2xhdmUgbW9kZSAqLworI2RlZmluZSBJMkNfQ09OX1RSWAkoMSA8PCA5KQkvKiBUcmFuc21pdHRlci9yZWNlaXZlciBtb2RlIChtYXN0ZXIgbW9kZSBvbmx5KSAqLworI2RlZmluZSBJMkNfQ09OX1hBCSgxIDw8IDgpCS8qIEV4cGFuZCBhZGRyZXNzICovCisjZGVmaW5lIEkyQ19DT05fU1RQCSgxIDw8IDExKQkvKiBTdG9wIGNvbmRpdGlvbiAobWFzdGVyIG1vZGUgb25seSkgKi8KKyNkZWZpbmUgSTJDX0NPTl9TVFQJKDEgPDwgMTMpCS8qIFN0YXJ0IGNvbmRpdGlvbiAobWFzdGVyIG1vZGUgb25seSkgKi8KKworI2RlZmluZSBJMkNfVElNRU9VVAkweGZmZmYwMDAwCS8qIFRpbWVvdXQgbWFzayBmb3IgcG9sbF9pMmNfaXJxKCkgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1kYXZpbmNpL25hbmRfZGVmcy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtZGF2aW5jaS9uYW5kX2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTliZDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtZGF2aW5jaS9uYW5kX2RlZnMuaApAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKyAqCisgKiBQYXJ0cyBzaGFtZWxlc2x5IHN0b2xlbiBmcm9tIExpbnV4IEtlcm5lbCBzb3VyY2UgdHJlZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZiBfTkFORF9ERUZTX0hfCisjZGVmaW5lIF9OQU5EX0RFRlNfSF8KKworI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisKKyNkZWZpbmUJTUFTS19DTEUJMHgxMAorI2RlZmluZQlNQVNLX0FMRQkweDBhCisKKyNkZWZpbmUgTkFORF9DRTBDTEUJKCh2b2xhdGlsZSB1X2ludDhfdCAqKShDRkdfTkFORF9CQVNFICsgMHgxMCkpCisjZGVmaW5lIE5BTkRfQ0UwQUxFCSgodm9sYXRpbGUgdV9pbnQ4X3QgKikoQ0ZHX05BTkRfQkFTRSArIDB4MGEpKQorI2RlZmluZSBOQU5EX0NFMERBVEEJKCh2b2xhdGlsZSB1X2ludDhfdCAqKUNGR19OQU5EX0JBU0UpCisKK3R5cGVkZWYgc3RydWN0ICB7CisJdV9pbnQzMl90CU5SQ1NSOworCXVfaW50MzJfdAlBV0NDUjsKKwl1X2ludDhfdAlSU1ZEMFs4XTsKKwl1X2ludDMyX3QJQUIxQ1I7CisJdV9pbnQzMl90CUFCMkNSOworCXVfaW50MzJfdAlBQjNDUjsKKwl1X2ludDMyX3QJQUI0Q1I7CisJdV9pbnQ4X3QJUlNWRDFbMzJdOworCXVfaW50MzJfdAlOSVJSOworCXVfaW50MzJfdAlOSU1SOworCXVfaW50MzJfdAlOSU1TUjsKKwl1X2ludDMyX3QJTklNQ1I7CisJdV9pbnQ4X3QJUlNWRDJbMTZdOworCXVfaW50MzJfdAlOQU5ERkNSOworCXVfaW50MzJfdAlOQU5ERlNSOworCXVfaW50OF90CVJTVkQzWzhdOworCXVfaW50MzJfdAlOQU5ERjFFQ0M7CisJdV9pbnQzMl90CU5BTkRGMkVDQzsKKwl1X2ludDMyX3QJTkFOREYzRUNDOworCXVfaW50MzJfdAlOQU5ERjRFQ0M7CisJdV9pbnQ4X3QJUlNWRDRbNF07CisJdV9pbnQzMl90CUlPREZURUNSOworCXVfaW50MzJfdAlJT0RGVEdDUjsKKwl1X2ludDhfdAlSU1ZENVs0XTsKKwl1X2ludDMyX3QJSU9ERlRNUkxSOworCXVfaW50MzJfdAlJT0RGVE1STVI7CisJdV9pbnQzMl90CUlPREZUTVJNU0JSOworCXVfaW50OF90CVJTVkQ2WzIwXTsKKwl1X2ludDMyX3QJTU9EUk5SOworCXVfaW50OF90CVJTVkQ3Wzc2XTsKKwl1X2ludDMyX3QJQ0UwREFUQTsKKwl1X2ludDMyX3QJQ0UwQUxFOworCXVfaW50MzJfdAlDRTBDTEU7CisJdV9pbnQ4X3QJUlNWRDhbNF07CisJdV9pbnQzMl90CUNFMURBVEE7CisJdV9pbnQzMl90CUNFMUFMRTsKKwl1X2ludDMyX3QJQ0UxQ0xFOworCXVfaW50OF90CVJTVkQ5WzRdOworCXVfaW50MzJfdAlDRTJEQVRBOworCXVfaW50MzJfdAlDRTJBTEU7CisJdV9pbnQzMl90CUNFMkNMRTsKKwl1X2ludDhfdAlSU1ZEMTBbNF07CisJdV9pbnQzMl90CUNFM0RBVEE7CisJdV9pbnQzMl90CUNFM0FMRTsKKwl1X2ludDMyX3QJQ0UzQ0xFOworfSBuYW5kX3JlZ2lzdGVyczsKKwordHlwZWRlZiB2b2xhdGlsZSBuYW5kX3JlZ2lzdGVycwkqbmFuZHJlZ3M7CisKKyNkZWZpbmUgTkFORF9SRUFEX1NUQVJUCQkweDAwCisjZGVmaW5lIE5BTkRfUkVBRF9FTkQJCTB4MzAKKyNkZWZpbmUgTkFORF9TVEFUVVMJCTB4NzAKKworI2lmZGVmIENGR19OQU5EX0hXX0VDQworI2RlZmluZSBOQU5EX0VjY19QMWUJCSgxIDw8IDApCisjZGVmaW5lIE5BTkRfRWNjX1AyZQkJKDEgPDwgMSkKKyNkZWZpbmUgTkFORF9FY2NfUDRlCQkoMSA8PCAyKQorI2RlZmluZSBOQU5EX0VjY19QOGUJCSgxIDw8IDMpCisjZGVmaW5lIE5BTkRfRWNjX1AxNmUJCSgxIDw8IDQpCisjZGVmaW5lIE5BTkRfRWNjX1AzMmUJCSgxIDw8IDUpCisjZGVmaW5lIE5BTkRfRWNjX1A2NGUJCSgxIDw8IDYpCisjZGVmaW5lIE5BTkRfRWNjX1AxMjhlCQkoMSA8PCA3KQorI2RlZmluZSBOQU5EX0VjY19QMjU2ZQkJKDEgPDwgOCkKKyNkZWZpbmUgTkFORF9FY2NfUDUxMmUJCSgxIDw8IDkpCisjZGVmaW5lIE5BTkRfRWNjX1AxMDI0ZQkJKDEgPDwgMTApCisjZGVmaW5lIE5BTkRfRWNjX1AyMDQ4ZQkJKDEgPDwgMTEpCisKKyNkZWZpbmUgTkFORF9FY2NfUDFvCQkoMSA8PCAxNikKKyNkZWZpbmUgTkFORF9FY2NfUDJvCQkoMSA8PCAxNykKKyNkZWZpbmUgTkFORF9FY2NfUDRvCQkoMSA8PCAxOCkKKyNkZWZpbmUgTkFORF9FY2NfUDhvCQkoMSA8PCAxOSkKKyNkZWZpbmUgTkFORF9FY2NfUDE2bwkJKDEgPDwgMjApCisjZGVmaW5lIE5BTkRfRWNjX1AzMm8JCSgxIDw8IDIxKQorI2RlZmluZSBOQU5EX0VjY19QNjRvCQkoMSA8PCAyMikKKyNkZWZpbmUgTkFORF9FY2NfUDEyOG8JCSgxIDw8IDIzKQorI2RlZmluZSBOQU5EX0VjY19QMjU2bwkJKDEgPDwgMjQpCisjZGVmaW5lIE5BTkRfRWNjX1A1MTJvCQkoMSA8PCAyNSkKKyNkZWZpbmUgTkFORF9FY2NfUDEwMjRvCQkoMSA8PCAyNikKKyNkZWZpbmUgTkFORF9FY2NfUDIwNDhvCQkoMSA8PCAyNykKKworI2RlZmluZSBURih2KQkJCSh2ID8gMSA6IDApCisKKyNkZWZpbmUgUDIwNDhlKGEpCQkoVEYoYSAmIE5BTkRfRWNjX1AyMDQ4ZSkgPDwgMCkKKyNkZWZpbmUgUDIwNDhvKGEpCQkoVEYoYSAmIE5BTkRfRWNjX1AyMDQ4bykgPDwgMSkKKyNkZWZpbmUgUDFlKGEpCQkJKFRGKGEgJiBOQU5EX0VjY19QMWUpIDw8IDIpCisjZGVmaW5lIFAxbyhhKQkJCShURihhICYgTkFORF9FY2NfUDFvKSA8PCAzKQorI2RlZmluZSBQMmUoYSkJCQkoVEYoYSAmIE5BTkRfRWNjX1AyZSkgPDwgNCkKKyNkZWZpbmUgUDJvKGEpCQkJKFRGKGEgJiBOQU5EX0VjY19QMm8pIDw8IDUpCisjZGVmaW5lIFA0ZShhKQkJCShURihhICYgTkFORF9FY2NfUDRlKSA8PCA2KQorI2RlZmluZSBQNG8oYSkJCQkoVEYoYSAmIE5BTkRfRWNjX1A0bykgPDwgNykKKworI2RlZmluZSBQOGUoYSkJCQkoVEYoYSAmIE5BTkRfRWNjX1A4ZSkgPDwgMCkKKyNkZWZpbmUgUDhvKGEpCQkJKFRGKGEgJiBOQU5EX0VjY19QOG8pIDw8IDEpCisjZGVmaW5lIFAxNmUoYSkJCQkoVEYoYSAmIE5BTkRfRWNjX1AxNmUpIDw8IDIpCisjZGVmaW5lIFAxNm8oYSkJCQkoVEYoYSAmIE5BTkRfRWNjX1AxNm8pIDw8IDMpCisjZGVmaW5lIFAzMmUoYSkJCQkoVEYoYSAmIE5BTkRfRWNjX1AzMmUpIDw8IDQpCisjZGVmaW5lIFAzMm8oYSkJCQkoVEYoYSAmIE5BTkRfRWNjX1AzMm8pIDw8IDUpCisjZGVmaW5lIFA2NGUoYSkJCQkoVEYoYSAmIE5BTkRfRWNjX1A2NGUpIDw8IDYpCisjZGVmaW5lIFA2NG8oYSkJCQkoVEYoYSAmIE5BTkRfRWNjX1A2NG8pIDw8IDcpCisKKyNkZWZpbmUgUDEyOGUoYSkJCShURihhICYgTkFORF9FY2NfUDEyOGUpIDw8IDApCisjZGVmaW5lIFAxMjhvKGEpCQkoVEYoYSAmIE5BTkRfRWNjX1AxMjhvKSA8PCAxKQorI2RlZmluZSBQMjU2ZShhKQkJKFRGKGEgJiBOQU5EX0VjY19QMjU2ZSkgPDwgMikKKyNkZWZpbmUgUDI1Nm8oYSkJCShURihhICYgTkFORF9FY2NfUDI1Nm8pIDw8IDMpCisjZGVmaW5lIFA1MTJlKGEpCQkoVEYoYSAmIE5BTkRfRWNjX1A1MTJlKSA8PCA0KQorI2RlZmluZSBQNTEybyhhKQkJKFRGKGEgJiBOQU5EX0VjY19QNTEybykgPDwgNSkKKyNkZWZpbmUgUDEwMjRlKGEpCQkoVEYoYSAmIE5BTkRfRWNjX1AxMDI0ZSkgPDwgNikKKyNkZWZpbmUgUDEwMjRvKGEpCQkoVEYoYSAmIE5BTkRfRWNjX1AxMDI0bykgPDwgNykKKworI2RlZmluZSBQOGVfcyhhKQkJKFRGKGEgJiBOQU5EX0VjY19QOGUpIDw8IDApCisjZGVmaW5lIFA4b19zKGEpCQkoVEYoYSAmIE5BTkRfRWNjX1A4bykgPDwgMSkKKyNkZWZpbmUgUDE2ZV9zKGEpCQkoVEYoYSAmIE5BTkRfRWNjX1AxNmUpIDw8IDIpCisjZGVmaW5lIFAxNm9fcyhhKQkJKFRGKGEgJiBOQU5EX0VjY19QMTZvKSA8PCAzKQorI2RlZmluZSBQMWVfcyhhKQkJKFRGKGEgJiBOQU5EX0VjY19QMWUpIDw8IDQpCisjZGVmaW5lIFAxb19zKGEpCQkoVEYoYSAmIE5BTkRfRWNjX1AxbykgPDwgNSkKKyNkZWZpbmUgUDJlX3MoYSkJCShURihhICYgTkFORF9FY2NfUDJlKSA8PCA2KQorI2RlZmluZSBQMm9fcyhhKQkJKFRGKGEgJiBOQU5EX0VjY19QMm8pIDw8IDcpCisKKyNkZWZpbmUgUDRlX3MoYSkJCShURihhICYgTkFORF9FY2NfUDRlKSA8PCAwKQorI2RlZmluZSBQNG9fcyhhKQkJKFRGKGEgJiBOQU5EX0VjY19QNG8pIDw8IDEpCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1scGMyMjkyL2hhcmR3YXJlLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1scGMyMjkyL2hhcmR3YXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQyYjQ2NAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWxwYzIyOTIvaGFyZHdhcmUuaApAQCAtMCwwICsxLDMzIEBACisjaWZuZGVmIF9fQVNNX0FSQ0hfSEFSRFdBUkVfSAorI2RlZmluZSBfX0FTTV9BUkNIX0hBUkRXQVJFX0gKKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNAlDdWN5IFN5c3RlbXMgKGh0dHA6Ly93d3cuY3VjeS5jb20pCisgKiBDdXJ0IEJydW5lIDxjdXJ0QGN1Y3kuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19MUEMyMjkyKQorI2luY2x1ZGUgPGFzbS1hcm0vYXJjaC1scGMyMjkyL2xwYzIyOTJfcmVnaXN0ZXJzLmg+CisjZWxzZQorI2Vycm9yIE5vIGhhcmR3YXJlIGZpbGUgZGVmaW5lZCBmb3IgdGhpcyBjb25maWd1cmF0aW9uCisjZW5kaWYKKworI2VuZGlmIC8qIF9fQVNNX0FSQ0hfSEFSRFdBUkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXJtNzIwdC9scGMyMjkyX3JlZ2lzdGVycy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtbHBjMjI5Mi9scGMyMjkyX3JlZ2lzdGVycy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1hcm0vYXJjaC1hcm03MjB0L2xwYzIyOTJfcmVnaXN0ZXJzLmgKcmVuYW1lIHRvIGluY2x1ZGUvYXNtLWFybS9hcmNoLWxwYzIyOTIvbHBjMjI5Ml9yZWdpc3RlcnMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXJtNzIwdC9tbWMuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWxwYzIyOTIvbW1jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLWFybS9hcmNoLWFybTcyMHQvbW1jLmgKcmVuYW1lIHRvIGluY2x1ZGUvYXNtLWFybS9hcmNoLWxwYzIyOTIvbW1jLmgKZGlmZiAtLWdpdCBhL2JvYXJkL2xwYzIyOTJzb2RpbW0vc3BpLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1scGMyMjkyL3NwaS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBib2FyZC9scGMyMjkyc29kaW1tL3NwaS5oCnJlbmFtZSB0byBpbmNsdWRlL2FzbS1hcm0vYXJjaC1scGMyMjkyL3NwaS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvcHhhLXJlZ3MuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9weGEtcmVncy5oCmluZGV4IGViZGE3MTkuLmU4Y2IyOTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9weGEtcmVncy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9weGEtcmVncy5oCkBAIC01OTIsOSArNTkyLDExIEBACiAjZGVmaW5lIFBNQ19SRUdfQkFTRQlfX1JFRygweDQwNTAwNDAwKSAgLyogUHJpbWFyeSBNb2RlbSBDb2RlYyAqLwogI2RlZmluZSBTTUNfUkVHX0JBU0UJX19SRUcoMHg0MDUwMDUwMCkgIC8qIFNlY29uZGFyeSBNb2RlbSBDb2RlYyAqLwogCisKIC8qCiAgKiBVU0IgRGV2aWNlIENvbnRyb2xsZXIKICAqLworI2lmbmRlZiBDT05GSUdfQ1BVX01PTkFIQU5TCiAjZGVmaW5lIFVEQ19SRVMxCV9fUkVHKDB4NDA2MDAwMDQpICAvKiBVREMgVW5kb2N1bWVudGVkIC0gUmVzZXJ2ZWQxICovCiAjZGVmaW5lIFVEQ19SRVMyCV9fUkVHKDB4NDA2MDAwMDgpICAvKiBVREMgVW5kb2N1bWVudGVkIC0gUmVzZXJ2ZWQyICovCiAjZGVmaW5lIFVEQ19SRVMzCV9fUkVHKDB4NDA2MDAwMEMpICAvKiBVREMgVW5kb2N1bWVudGVkIC0gUmVzZXJ2ZWQzICovCkBAIC03NDksMTEgKzc1MSwyOCBAQAogI2RlZmluZSBVU0lSMV9JUjEzCSgxIDw8IDUpCS8qIEludGVycnVwIHJlcXVlc3QgZXAgMTMgKi8KICNkZWZpbmUgVVNJUjFfSVIxNAkoMSA8PCA2KQkvKiBJbnRlcnJ1cCByZXF1ZXN0IGVwIDE0ICovCiAjZGVmaW5lIFVTSVIxX0lSMTUJKDEgPDwgNykJLyogSW50ZXJydXAgcmVxdWVzdCBlcCAxNSAqLworI2VuZGlmIC8qICEgQ09ORklHX0NQVV9NT05BSEFOUyAqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfUFhBMjdYKQorI2lmIGRlZmluZWQoQ09ORklHX1BYQTI3WCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX01PTkFIQU5TKQorCisvKgorICogVVNCIENsaWVudCBDb250cm9sbGVyIChpbmNvbXBsZXRlKQorICovCisjZGVmaW5lIFVEQ0NSCQlfX1JFRygweDQwNjAwMDAwKQorI2RlZmluZSBVRENJQ1IwCQlfX1JFRygweDQwNjAwMDA0KQorI2RlZmluZSBVRENDSVIwCQlfX1JFRygweDQwNjAwMDA4KQorI2RlZmluZSBVRENJU1IwCQlfX1JFRygweDQwNjAwMDBjKQorI2RlZmluZSBVRENTSVIxCQlfX1JFRygweDQwNjAwMDEwKQorI2RlZmluZSBVRENGTlIJCV9fUkVHKDB4NDA2MDAwMTQpCisjZGVmaW5lIFVEQ09UR0lDUglfX1JFRygweDQwNjAwMDE4KQorI2RlZmluZSBVRENPVEdJU1IJX19SRUcoMHg0MDYwMDAxYykKKyNkZWZpbmUgVVAyT0NSCQlfX1JFRygweDQwNjAwMDIwKQorI2RlZmluZSBVUDNPQ1IJCV9fUkVHKDB4NDA2MDAwMjQpCisKIC8qCiAgKiBVU0IgSG9zdCBDb250cm9sbGVyCiAgKi8KKyNkZWZpbmUgT0hDSV9SRUdTX0JBU0UJMHg0QzAwMDAwMAkvKiByZXF1aXJlZCBmb3Igb2hjaSBkcml2ZXIgKi8KICNkZWZpbmUgVUhDUkVWCQlfX1JFRygweDRDMDAwMDAwKQogI2RlZmluZSBVSENIQ09OCQlfX1JFRygweDRDMDAwMDA0KQogI2RlZmluZSBVSENDT01TCQlfX1JFRygweDRDMDAwMDA4KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWljcm9ibGF6ZS9hc20uaCBiL2luY2x1ZGUvYXNtLW1pY3JvYmxhemUvYXNtLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL2UzMDAuaCBiL2luY2x1ZGUvYXNtLXBwYy9lMzAwLmgKaW5kZXggZDFiYjE1OS4uZGU4MjM5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL2UzMDAuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvZTMwMC5oCkBAIC05LDYgKzksNyBAQAogI2RlZmluZSBQVlJfRTMwMEMxCTB4ODA4MzAwMDAKICNkZWZpbmUgUFZSX0UzMDBDMgkweDgwODQwMDAwCiAjZGVmaW5lIFBWUl9FMzAwQzMJMHg4MDg1MDAwMAorI2RlZmluZSBQVlJfRTMwMEM0CTB4ODA4NjAwMDAKIAogLyoKICAqIEhhcmR3YXJlIEltcGxlbWVudGF0aW9uLURlcGVuZGVudCBSZWdpc3RlciAwIChISUQwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL2dsb2JhbF9kYXRhLmggYi9pbmNsdWRlL2FzbS1wcGMvZ2xvYmFsX2RhdGEuaAppbmRleCBjZDI0NjM2Li5iYmFlYjNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvZ2xvYmFsX2RhdGEuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvZ2xvYmFsX2RhdGEuaApAQCAtODUsNiArODUsMTAgQEAKIAl1bnNpZ25lZCBsb25nCWlwYl9jbGs7CiAJdW5zaWduZWQgbG9uZwlwY2lfY2xrOwogI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfTVBDNTEyWCkKKwl1MzIgaXBiX2NsazsKKwl1MzIgY3NiX2NsazsKKyNlbmRpZiAvKiBDT05GSUdfTVBDNTEyWCAqLwogI2lmIGRlZmluZWQoQ09ORklHX01QQzgyMjApCiAJdW5zaWduZWQgbG9uZyAgIGJFeHRVYXJ0OwogCXVuc2lnbmVkIGxvbmcgICBpbnBfY2xrOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL2dwaW8uaCBiL2luY2x1ZGUvYXNtLXBwYy9ncGlvLmgKaW5kZXggMTE0ZGM5Mi4uYzliNmEzNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL2dwaW8uaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvZ3Bpby5oCkBAIC00NSwxMiArNDUsMTQgQEAKIHR5cGVkZWYgZW51bSBncGlvX291dAkgeyBHUElPX09VVF8wLCBHUElPX09VVF8xLCBHUElPX09VVF9OT19DSEcgfSBncGlvX291dF90OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgbG9uZyBhZGQ7CS8qIGdwaW8gY29yZSBiYXNlIGFkZHJlc3MJKi8KLQlncGlvX2RyaXZlcl90IGluX291dDsJLyogRHJpdmVyIFNldHRpbmcJCSovCi0JZ3Bpb19zZWxlY3RfdCBhbHRfbmI7CS8qIFNlbGVjdGVkIEFsdGVybmF0ZQkJKi8KKwl1bnNpZ25lZCBsb25nCWFkZDsJLyogZ3BpbyBjb3JlIGJhc2UgYWRkcmVzcwkqLworCWdwaW9fZHJpdmVyX3QJaW5fb3V0OwkvKiBEcml2ZXIgU2V0dGluZwkJKi8KKwlncGlvX3NlbGVjdF90CWFsdF9uYjsJLyogU2VsZWN0ZWQgQWx0ZXJuYXRlCQkqLworCWdwaW9fb3V0X3QJb3V0X3ZhbDsvKiBEZWZhdWx0IE91dHB1dCBWYWx1ZQkJKi8KIH0gZ3Bpb19wYXJhbV9zOwogI2VuZGlmCiAKIHZvaWQgZ3Bpb19jb25maWcoaW50IHBpbiwgaW50IGluX291dCwgaW50IGdwaW9fYWx0LCBpbnQgb3V0X3ZhbCk7CiB2b2lkIGdwaW9fd3JpdGVfYml0KGludCBwaW4sIGludCB2YWwpOworaW50IGdwaW9fcmVhZF9vdXRfYml0KGludCBwaW4pOwogdm9pZCBncGlvX3NldF9jaGlwX2NvbmZpZ3VyYXRpb24odm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvaW1tYXBfNTEyeC5oIGIvaW5jbHVkZS9hc20tcHBjL2ltbWFwXzUxMnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2QxMGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcHBjL2ltbWFwXzUxMnguaApAQCAtMCwwICsxLDU2OSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNyBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nCisgKgorICogTVBDNTEyeCBJbnRlcm5hbCBNZW1vcnkgTWFwCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBCYXNlZCBvbiB0aGUgTVBDODN4eCBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfX0lNTUFQXzUxMnhfXworI2RlZmluZSBfX0lNTUFQXzUxMnhfXworCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKK3R5cGVkZWYgc3RydWN0IGxhdzUxMnggeworCXUzMiBiYXI7CS8qIEJhc2UgQWRkciBSZWdpc3RlciAqLworCXUzMiBhcjsJCS8qIEF0dHJpYnV0ZXMgUmVnaXN0ZXIgKi8KK30gbGF3NTIxeF90OworCisvKgorICogU3lzdGVtIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCisgKi8KK3R5cGVkZWYgc3RydWN0IHN5c2NvbmY1MTJ4IHsKKwl1MzIgaW1tcmJhcjsJCS8qIEludGVybmFsIG1lbW9yeSBtYXAgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyICovCisJdTggcmVzMFsweDFjXTsKKwl1MzIgbHBiYXc7CQkvKiBMUCBCb290IEFjY2VzcyBXaW5kb3cgKi8KKwl1MzIgbHBjczBhdzsJCS8qIExQIENTMCBBY2Nlc3MgV2luZG93ICovCisJdTMyIGxwY3MxYXc7CQkvKiBMUCBDUzEgQWNjZXNzIFdpbmRvdyAqLworCXUzMiBscGNzMmF3OwkJLyogTFAgQ1MyIEFjY2VzcyBXaW5kb3cgKi8KKwl1MzIgbHBjczNhdzsJCS8qIExQIENTMyBBY2Nlc3MgV2luZG93ICovCisJdTMyIGxwY3M0YXc7CQkvKiBMUCBDUzQgQWNjZXNzIFdpbmRvdyAqLworCXUzMiBscGNzNWF3OwkJLyogTFAgQ1M1IEFjY2VzcyBXaW5kb3cgKi8KKwl1MzIgbHBjczZhdzsJCS8qIExQIENTNiBBY2Nlc3MgV2luZG93ICovCisJdTMyIGxwY3M3YXc7CQkvKiBMUCBDUzcgQWNjZXNzIFdpbmRvdyAqLworCXU4IHJlczFbMHgxY107CisJbGF3NTIxeF90IHBjaWxhd1szXTsJLyogUENJIExvY2FsIEFjY2VzcyBXaW5kb3cgMC0yIFJlZ2lzdGVycyAqLworCXU4IHJlczJbMHgyOF07CisJbGF3NTIxeF90IGRkcmxhdzsJLyogRERSIExvY2FsIEFjY2VzcyBXaW5kb3cgKi8KKwl1OCByZXMzWzB4MThdOworCXUzMiBtYnhiYXI7CQkvKiBNQlggQmFzZSBBZGRyZXNzICovCisJdTMyIHNyYW1iYXI7CQkvKiBTUkFNIEJhc2UgQWRkcmVzcyAqLworCXUzMiBuZmNiYXI7CQkvKiBORkMgQmFzZSBBZGRyZXNzICovCisJdTggcmVzNFsweDM0XTsKKwl1MzIgc3ByaWRyOwkJLyogU3lzdGVtIFBhcnQgYW5kIFJldmlzaW9uIElEIFJlZ2lzdGVyICovCisJdTMyIHNwY3I7CQkvKiBTeXN0ZW0gUHJpb3JpdHkgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworCXU4IHJlczVbMHhmOF07Cit9IHN5c2NvbmY1MTJ4X3Q7CisKKy8qCisgKiBXYXRjaCBEb2cgVGltZXIgKFdEVCkgUmVnaXN0ZXJzCisgKi8KK3R5cGVkZWYgc3RydWN0IHdkdDUxMnggeworCXU4IHJlczBbNF07CisJdTMyIHN3Y3JyOwkJLyogU3lzdGVtIHdhdGNoZG9nIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwl1MzIgc3djbnI7CQkvKiBTeXN0ZW0gd2F0Y2hkb2cgY291bnQgcmVnaXN0ZXIgKi8KKwl1OCByZXMxWzJdOworCXUxNiBzd3NycjsJCS8qIFN5c3RlbSB3YXRjaGRvZyBzZXJ2aWNlIHJlZ2lzdGVyICovCisJdTggcmVzMlsweEYwXTsKK30gd2R0NTEyeF90OworCisvKgorICogUlRDIE1vZHVsZSBSZWdpc3RlcnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgcnRjbGs1MTJ4IHsKKwl1OCBmaXhtZVsweDEwMF07Cit9IHJ0Y2xrNTEyeF90OworCisvKgorICogR2VuZXJhbCBQdXJwb3NlIFRpbWVyCisgKi8KK3R5cGVkZWYgc3RydWN0IGdwdDUxMnggeworCXU4IGZpeG1lWzB4MTAwXTsKK30gZ3B0NTEyeF90OworCisvKgorICogSW50ZWdyYXRlZCBQcm9ncmFtbWFibGUgSW50ZXJydXB0IENvbnRyb2xsZXIKKyAqLwordHlwZWRlZiBzdHJ1Y3QgaXBpYzUxMnggeworCXU4IGZpeG1lWzB4MTAwXTsKK30gaXBpYzUxMnhfdDsKKworLyoKKyAqIFN5c3RlbSBBcmJpdGVyIFJlZ2lzdGVycworICovCit0eXBlZGVmIHN0cnVjdCBhcmJpdGVyNTEyeCB7CisJdTMyIGFjcjsJCS8qIEFyYml0ZXIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworCXUzMiBhdHI7CQkvKiBBcmJpdGVyIFRpbWVycyBSZWdpc3RlciAqLworCXUzMiBhdGVyOwkJLyogQXJiaXRlciBUcmFuc2ZlciBFcnJvciBSZWdpc3RlciAqLworCXUzMiBhZXI7CQkvKiBBcmJpdGVyIEV2ZW50IFJlZ2lzdGVyICovCisJdTMyIGFpZHI7CQkvKiBBcmJpdGVyIEludGVycnVwdCBEZWZpbml0aW9uIFJlZ2lzdGVyICovCisJdTMyIGFtcjsJCS8qIEFyYml0ZXIgTWFzayBSZWdpc3RlciAqLworCXUzMiBhZWF0cjsJCS8qIEFyYml0ZXIgRXZlbnQgQXR0cmlidXRlcyBSZWdpc3RlciAqLworCXUzMiBhZWFkcjsJCS8qIEFyYml0ZXIgRXZlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworCXUzMiBhZXJyOwkJLyogQXJiaXRlciBFdmVudCBSZXNwb25zZSBSZWdpc3RlciAqLworCXU4IHJlczFbMHhEQ107Cit9IGFyYml0ZXI1MTJ4X3Q7CisKKy8qCisgKiBSZXNldCBNb2R1bGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgcmVzZXQ1MTJ4IHsKKwl1MzIgcmN3bDsJCS8qIFJlc2V0IENvbmZpZ3VyYXRpb24gV29yZCBMb3cgUmVnaXN0ZXIgKi8KKwl1MzIgcmN3aDsJCS8qIFJlc2V0IENvbmZpZ3VyYXRpb24gV29yZCBIaWdoIFJlZ2lzdGVyICovCisJdTggcmVzMFs4XTsKKwl1MzIgcnNyOwkJLyogUmVzZXQgU3RhdHVzIFJlZ2lzdGVyICovCisJdTMyIHJtcjsJCS8qIFJlc2V0IE1vZGUgUmVnaXN0ZXIgKi8KKwl1MzIgcnByOwkJLyogUmVzZXQgcHJvdGVjdGlvbiBSZWdpc3RlciAqLworCXUzMiByY3I7CQkvKiBSZXNldCBDb250cm9sIFJlZ2lzdGVyICovCisJdTMyIHJjZXI7CQkvKiBSZXNldCBDb250cm9sIEVuYWJsZSBSZWdpc3RlciAqLworCXU4IHJlczFbMHhEQ107Cit9IHJlc2V0NTEyeF90OworCisvKgorICogQ2xvY2sgTW9kdWxlCisgKi8KK3R5cGVkZWYgc3RydWN0IGNsazUxMnggeworCXUzMiBzcG1yOwkJLyogU3lzdGVtIFBMTCBNb2RlIFJlZ2lzdGVyICovCisJdTMyIHNjY3JbMl07CQkvKiBTeXN0ZW0gQ2xvY2sgQ29udHJvbCBSZWdpc3RlcnMgKi8KKwl1MzIgc2NmclsyXTsJCS8qIFN5c3RlbSBDbG9jayBGcmVxdWVuY3kgUmVnaXN0ZXJzICovCisJdTggcmVzMFs0XTsKKwl1MzIgYmNyOwkJLyogQnJlYWQgQ3J1bWIgUmVnaXN0ZXIgKi8KKwl1MzIgcHNjY2NyWzEyXTsJCS8qIFBTQzAtMTEgQ2xvY2sgQ29udHJvbCBSZWdpc3RlcnMgKi8KKwl1MzIgc3BjY3I7CQkvKiBTUERJRiBDbG9jayBDb250cm9sIFJlZ2lzdGVycyAqLworCXUzMiBjY2NyOwkJLyogQ0ZNIENsb2NrIENvbnRyb2wgUmVnaXN0ZXJzICovCisJdTMyIGRjY3I7CQkvKiBESVUgQ2xvY2sgQ29udHJvbCBSZWdpc3RlcnMgKi8KKwl1OCByZXMxWzB4YThdOworfSBjbGs1MTJ4X3Q7CisKKy8qCisgKiBQb3dlciBNYW5hZ2VtZW50IENvbnRyb2wgTW9kdWxlCisgKi8KK3R5cGVkZWYgc3RydWN0IHBtYzUxMnggeworCXU4IGZpeG1lWzB4MTAwXTsKK30gcG1jNTEyeF90OworCisvKgorICogR2VuZXJhbCBwdXJwb3NlIEkvTyBtb2R1bGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgZ3BpbzUxMnggeworCXU4IGZpeG1lWzB4MTAwXTsKK30gZ3BpbzUxMnhfdDsKKworLyoKKyAqIEREUiBNZW1vcnkgQ29udHJvbGxlciBNZW1vcnkgTWFwCisgKi8KK3R5cGVkZWYgc3RydWN0IGRkcjUxMnggeworCXUzMiBkZHJfc3lzX2NvbmZpZzsJLyogU3lzdGVtIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKwl1MzIgZGRyX3RpbWVfY29uZmlnMDsJLyogVGltaW5nIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKwl1MzIgZGRyX3RpbWVfY29uZmlnMTsJLyogVGltaW5nIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKwl1MzIgZGRyX3RpbWVfY29uZmlnMjsJLyogVGltaW5nIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKwl1MzIgZGRyX2NvbW1hbmQ7CS8qIENvbW1hbmQgUmVnaXN0ZXIgKi8KKwl1MzIgZGRyX2NvbXBhY3RfY29tbWFuZDsJLyogQ29tcGFjdCBDb21tYW5kIFJlZ2lzdGVyICovCisJdTMyIHNlbGZfcmVmcmVzaF9jbWRfMDsJLyogRW50ZXIvRXhpdCBTZWxmIFJlZnJlc2ggUmVnaXN0ZXJzICovCisJdTMyIHNlbGZfcmVmcmVzaF9jbWRfMTsJLyogRW50ZXIvRXhpdCBTZWxmIFJlZnJlc2ggUmVnaXN0ZXJzICovCisJdTMyIHNlbGZfcmVmcmVzaF9jbWRfMjsJLyogRW50ZXIvRXhpdCBTZWxmIFJlZnJlc2ggUmVnaXN0ZXJzICovCisJdTMyIHNlbGZfcmVmcmVzaF9jbWRfMzsJLyogRW50ZXIvRXhpdCBTZWxmIFJlZnJlc2ggUmVnaXN0ZXJzICovCisJdTMyIHNlbGZfcmVmcmVzaF9jbWRfNDsJLyogRW50ZXIvRXhpdCBTZWxmIFJlZnJlc2ggUmVnaXN0ZXJzICovCisJdTMyIHNlbGZfcmVmcmVzaF9jbWRfNTsJLyogRW50ZXIvRXhpdCBTZWxmIFJlZnJlc2ggUmVnaXN0ZXJzICovCisJdTMyIHNlbGZfcmVmcmVzaF9jbWRfNjsJLyogRW50ZXIvRXhpdCBTZWxmIFJlZnJlc2ggUmVnaXN0ZXJzICovCisJdTMyIHNlbGZfcmVmcmVzaF9jbWRfNzsJLyogRW50ZXIvRXhpdCBTZWxmIFJlZnJlc2ggUmVnaXN0ZXJzICovCisJdTMyIERRU19jb25maWdfb2Zmc2V0X2NvdW50OwkvKiBEUVMgQ29uZmlnIE9mZnNldCBDb3VudCAqLworCXUzMiBEUVNfY29uZmlnX29mZnNldF90aW1lOwkvKiBEUVMgQ29uZmlnIE9mZnNldCBUaW1lICovCisJdTMyIERRU19kZWxheV9zdGF0dXM7CS8qIERRUyBEZWxheSBTdGF0dXMgKi8KKwl1MzIgcmVzMFsweEZdOworCXUzMiBwcmlvbWFuX2NvbmZpZzE7CS8qIFByaW9yaXR5IE1hbmFnZXIgQ29uZmlndXJhdGlvbiAqLworCXUzMiBwcmlvbWFuX2NvbmZpZzI7CS8qIFByaW9yaXR5IE1hbmFnZXIgQ29uZmlndXJhdGlvbiAqLworCXUzMiBoaXByaW9fY29uZmlnOwkvKiBIaWdoIFByaW9yaXR5IENvbmZpZ3VyYXRpb24gKi8KKwl1MzIgbHV0X3RhYmxlMF9tYWluX3VwcGVyOwkvKiBMVVQwIE1haW4gVXBwZXIgKi8KKwl1MzIgbHV0X3RhYmxlMV9tYWluX3VwcGVyOwkvKiBMVVQxIE1haW4gVXBwZXIgKi8KKwl1MzIgbHV0X3RhYmxlMl9tYWluX3VwcGVyOwkvKiBMVVQyIE1haW4gVXBwZXIgKi8KKwl1MzIgbHV0X3RhYmxlM19tYWluX3VwcGVyOwkvKiBMVVQzIE1haW4gVXBwZXIgKi8KKwl1MzIgbHV0X3RhYmxlNF9tYWluX3VwcGVyOwkvKiBMVVQ0IE1haW4gVXBwZXIgKi8KKwl1MzIgbHV0X3RhYmxlMF9tYWluX2xvd2VyOwkvKiBMVVQwIE1haW4gTG93ZXIgKi8KKwl1MzIgbHV0X3RhYmxlMV9tYWluX2xvd2VyOwkvKiBMVVQxIE1haW4gTG93ZXIgKi8KKwl1MzIgbHV0X3RhYmxlMl9tYWluX2xvd2VyOwkvKiBMVVQyIE1haW4gTG93ZXIgKi8KKwl1MzIgbHV0X3RhYmxlM19tYWluX2xvd2VyOwkvKiBMVVQzIE1haW4gTG93ZXIgKi8KKwl1MzIgbHV0X3RhYmxlNF9tYWluX2xvd2VyOwkvKiBMVVQ0IE1haW4gTG93ZXIgKi8KKwl1MzIgbHV0X3RhYmxlMF9hbHRlcm5hdGVfdXBwZXI7CS8qIExVVDAgQWx0ZXJuYXRlIFVwcGVyICovCisJdTMyIGx1dF90YWJsZTFfYWx0ZXJuYXRlX3VwcGVyOyAvKiBMVVQxIEFsdGVybmF0ZSBVcHBlciAqLworCXUzMiBsdXRfdGFibGUyX2FsdGVybmF0ZV91cHBlcjsgLyogTFVUMiBBbHRlcm5hdGUgVXBwZXIgKi8KKwl1MzIgbHV0X3RhYmxlM19hbHRlcm5hdGVfdXBwZXI7IC8qIExVVDMgQWx0ZXJuYXRlIFVwcGVyICovCisJdTMyIGx1dF90YWJsZTRfYWx0ZXJuYXRlX3VwcGVyOyAvKiBMVVQ0IEFsdGVybmF0ZSBVcHBlciAqLworCXUzMiBsdXRfdGFibGUwX2FsdGVybmF0ZV9sb3dlcjsgLyogTFVUMCBBbHRlcm5hdGUgTG93ZXIgKi8KKwl1MzIgbHV0X3RhYmxlMV9hbHRlcm5hdGVfbG93ZXI7IC8qIExVVDEgQWx0ZXJuYXRlIExvd2VyICovCisJdTMyIGx1dF90YWJsZTJfYWx0ZXJuYXRlX2xvd2VyOyAvKiBMVVQyIEFsdGVybmF0ZSBMb3dlciAqLworCXUzMiBsdXRfdGFibGUzX2FsdGVybmF0ZV9sb3dlcjsgLyogTFVUMyBBbHRlcm5hdGUgTG93ZXIgKi8KKwl1MzIgbHV0X3RhYmxlNF9hbHRlcm5hdGVfbG93ZXI7IC8qIExVVDQgQWx0ZXJuYXRlIExvd2VyICovCisJdTMyIHBlcmZvcm1hbmNlX21vbml0b3JfY29uZmlnOworCXUzMiBldmVudF90aW1lX2NvdW50ZXI7CisJdTMyIGV2ZW50X3RpbWVfcHJlc2V0OworCXUzMiBwZXJmb3JtYW5jZV9tb25pdG9yMV9hZGRyZXNzX2xvdzsKKwl1MzIgcGVyZm9ybWFuY2VfbW9uaXRvcjJfYWRkcmVzc19sb3c7CisJdTMyIHBlcmZvcm1hbmNlX21vbml0b3IxX2FkZHJlc3NfaGk7CisJdTMyIHBlcmZvcm1hbmNlX21vbml0b3IyX2FkZHJlc3NfaGk7CisJdTMyIHJlczFbMl07CisJdTMyIHBlcmZvcm1hbmNlX21vbml0b3IxX3JlYWRfY291bnRlcjsKKwl1MzIgcGVyZm9ybWFuY2VfbW9uaXRvcjJfcmVhZF9jb3VudGVyOworCXUzMiBwZXJmb3JtYW5jZV9tb25pdG9yMV93cml0ZV9jb3VudGVyOworCXUzMiBwZXJmb3JtYW5jZV9tb25pdG9yMl93cml0ZV9jb3VudGVyOworCXUzMiBncmFudGVkX2Fja19jb3VudGVyMDsKKwl1MzIgZ3JhbnRlZF9hY2tfY291bnRlcjE7CisJdTMyIGdyYW50ZWRfYWNrX2NvdW50ZXIyOworCXUzMiBncmFudGVkX2Fja19jb3VudGVyMzsKKwl1MzIgZ3JhbnRlZF9hY2tfY291bnRlcjQ7CisJdTMyIGN1bXVsYXRpdmVfd2FpdF9jb3VudGVyMDsKKwl1MzIgY3VtdWxhdGl2ZV93YWl0X2NvdW50ZXIxOworCXUzMiBjdW11bGF0aXZlX3dhaXRfY291bnRlcjI7CisJdTMyIGN1bXVsYXRpdmVfd2FpdF9jb3VudGVyMzsKKwl1MzIgY3VtdWxhdGl2ZV93YWl0X2NvdW50ZXI0OworCXUzMiBzdW1tZWRfcHJpb3JpdHlfY291bnRlcjA7CisJdTMyIHN1bW1lZF9wcmlvcml0eV9jb3VudGVyMTsKKwl1MzIgc3VtbWVkX3ByaW9yaXR5X2NvdW50ZXIyOworCXUzMiBzdW1tZWRfcHJpb3JpdHlfY291bnRlcjM7CisJdTMyIHN1bW1lZF9wcmlvcml0eV9jb3VudGVyNDsKKwl1MzIgcmVzMlsweDNBRF07Cit9IGRkcjUxMnhfdDsKKworCisvKgorICogRE1BL01lc3NhZ2luZyBVbml0CisgKi8KK3R5cGVkZWYgc3RydWN0IGRtYTUxMnggeworCXU4IGZpeG1lWzB4MTgwMF07Cit9IGRtYTUxMnhfdDsKKworLyoKKyAqIFBDSSBTb2Z0d2FyZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVycworICovCit0eXBlZGVmIHN0cnVjdCBwY2ljb25mNTEyeCB7CisJdTggZml4bWVbMHg4MF07Cit9IHBjaWNvbmY1MTJ4X3Q7CisKKy8qCisgKiBTZXF1ZW5jZXIKKyAqLwordHlwZWRlZiBzdHJ1Y3QgaW9zNTEyeCB7CisJdTggZml4bWVbMHgxMDBdOworfSBpb3M1MTJ4X3Q7CisKKy8qCisgKiBQQ0kgQ29udHJvbGxlcgorICovCit0eXBlZGVmIHN0cnVjdCBwY2ljdHJsNTEyeCB7CisJdTggZml4bWVbMHgxMDBdOworfSBwY2ljdHJsNTEyeF90OworCisKKy8qCisgKiBNU0NBTgorICovCit0eXBlZGVmIHN0cnVjdCBtc2NhbjUxMnggeworCXU4IGZpeG1lWzB4MTAwXTsKK30gbXNjYW41MTJ4X3Q7CisKKy8qCisgKiBCRExDCisgKi8KK3R5cGVkZWYgc3RydWN0IGJkbGM1MTJ4IHsKKwl1OCBmaXhtZVsweDEwMF07Cit9IGJkbGM1MTJ4X3Q7CisKKy8qCisgKiBTREhDCisgKi8KK3R5cGVkZWYgc3RydWN0IHNkaGM1MTJ4IHsKKwl1OCBmaXhtZVsweDEwMF07Cit9IHNkaGM1MTJ4X3Q7CisKKy8qCisgKiBTUERJRgorICovCit0eXBlZGVmIHN0cnVjdCBzcGRpZjUxMnggeworCXU4IGZpeG1lWzB4MTAwXTsKK30gc3BkaWY1MTJ4X3Q7CisKKy8qCisgKiBJMkMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgaTJjNTEyeF9kZXYgeworCXZvbGF0aWxlIHUzMiBtYWRyOwkJLyogSTJDbiArIDB4MDAgKi8KKwl2b2xhdGlsZSB1MzIgbWZkcjsJCS8qIEkyQ24gKyAweDA0ICovCisJdm9sYXRpbGUgdTMyIG1jcjsJCS8qIEkyQ24gKyAweDA4ICovCisJdm9sYXRpbGUgdTMyIG1zcjsJCS8qIEkyQ24gKyAweDBDICovCisJdm9sYXRpbGUgdTMyIG1kcjsJCS8qIEkyQ24gKyAweDEwICovCisJdTggcmVzMFsweDBDXTsKK30gaTJjNTEyeF9kZXZfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaTJjNTEyeCB7CisJaTJjNTEyeF9kZXZfdCBkZXZbM107CisJdm9sYXRpbGUgdTMyIGljcjsKKwl2b2xhdGlsZSB1MzIgbWlmcjsKKwl1OCByZXMwWzB4OThdOworfSBpMmM1MTJ4X3Q7CisKKy8qCisgKiBBWEUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYXhlNTEyeCB7CisJdTggZml4bWVbMHgxMDBdOworfSBheGU1MTJ4X3Q7CisKKy8qCisgKiBESVUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgZGl1NTEyeCB7CisJdTggZml4bWVbMHgxMDBdOworfSBkaXU1MTJ4X3Q7CisKKy8qCisgKiBDRk0KKyAqLwordHlwZWRlZiBzdHJ1Y3QgY2ZtNTEyeCB7CisJdTggZml4bWVbMHgxMDBdOworfSBjZm01MTJ4X3Q7CisKKy8qCisgKiBGRUMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgZmVjNTEyeCB7CisJdTggZml4bWVbMHg4MDBdOworfSBmZWM1MTJ4X3Q7CisKKy8qCisgKiBVTFBJCisgKi8KK3R5cGVkZWYgc3RydWN0IHVscGk1MTJ4IHsKKwl1OCBmaXhtZVsweDYwMF07Cit9IHVscGk1MTJ4X3Q7CisKKy8qCisgKiBVVE1JCisgKi8KK3R5cGVkZWYgc3RydWN0IHV0bWk1MTJ4IHsKKwl1OCBmaXhtZVsweDMwMDBdOworfSB1dG1pNTEyeF90OworCisvKgorICogUENJIERNQQorICovCit0eXBlZGVmIHN0cnVjdCBwY2lkbWE1MTJ4IHsKKwl1OCBmaXhtZVsweDMwMF07Cit9IHBjaWRtYTUxMnhfdDsKKworLyoKKyAqIElPIENvbnRyb2wKKyAqLwordHlwZWRlZiBzdHJ1Y3QgaW9jdHJsNTEyeCB7CisJdTMyIHJlZ3NbMHg0MDBdOworfSBpb2N0cmw1MTJ4X3Q7CisKKy8qCisgKiBJSU0KKyAqLwordHlwZWRlZiBzdHJ1Y3QgaWltNTEyeCB7CisJdTggZml4bWVbMHgxMDAwXTsKK30gaWltNTEyeF90OworCisvKgorICogTFBDCisgKi8KK3R5cGVkZWYgc3RydWN0IGxwYzUxMnggeworCXUzMgljc19jZmdbOF07CS8qIENoaXAgU2VsZWN0IE4gQ29uZmlndXJhdGlvbiBSZWdpc3RlcnMKKwkJCQkgICBObyBkZWRpY2F0ZWQgZW50cnkgZm9yIENTIEJvb3QgYXMgPT0gQ1MwICovCisJdTMyCWNzX2NyOwkJLyogQ2hpcCBTZWxlY3QgQ29udHJvbCBSZWdpc3RlciAqLworCXUzMgljc19zcjsJCS8qIENoaXAgU2VsZWN0IFN0YXR1cyBSZWdpc3RlciAqLworCXUzMgljc19iY3I7CQkvKiBDaGlwIFNlbGVjdCBCdXJzdCBDb250cm9sIFJlZ2lzdGVyICovCisJdTMyCWNzX2RjY3I7CS8qIENoaXAgU2VsZWN0IERlYWRjeWNsZSBDb250cm9sIFJlZ2lzdGVyICovCisJdTMyCWNzX2hjY3I7CS8qIENoaXAgU2VsZWN0IEhvbGRjeWNsZSBDb250cm9sIFJlZ2lzdGVyICovCisJdTgJcmVzMFsweGNjXTsKKwl1MzIJc2NscGNfcHNyOwkvKiBTQ0xQQyBQYWNrZXQgU2l6ZSBSZWdpc3RlciAqLworCXUzMglzY2xwY19zYXI7CS8qIFNDTFBDIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKwl1MzIJc2NscGNfY3I7CS8qIFNDTFBDIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwl1MzIJc2NscGNfZXI7CS8qIFNDTFBDIEVuYWJsZSBSZWdpc3RlciAqLworCXUzMglzY2xwY19uYXI7CS8qIFNDTFBDIE5leHRBZGRyZXNzIFJlZ2lzdGVyICovCisJdTMyCXNjbHBjX3NyOwkvKiBTQ0xQQyBTdGF0dXMgUmVnaXN0ZXIgKi8KKwl1MzIJc2NscGNfYmRyOwkvKiBTQ0xQQyBCeXRlcyBEb25lIFJlZ2lzdGVyICovCisJdTMyCWVtYl9zY3I7CS8qIEVNQiBTaGFyZSBDb3VudGVyIFJlZ2lzdGVyICovCisJdTMyCWVtYl9wY3I7CS8qIEVNQiBQYXVzZSBDb250cm9sIFJlZ2lzdGVyICovCisJdTgJcmVzMVsweDFjXTsKKwl1MzIJbHBjX2Zkd3I7CS8qIExQQyBSWC9UWCBGSUZPIERhdGEgV29yZCBSZWdpc3RlciAqLworCXUzMglscGNfZnNyOwkvKiBMUEMgUlgvVFggRklGTyBTdGF0dXMgUmVnaXN0ZXIgKi8KKwl1MzIJbHBjX2NyOwkJLyogTFBDIFJYL1RYIEZJRk8gQ29udHJvbCBSZWdpc3RlciAqLworCXUzMglscGNfYXI7CQkvKiBMUEMgUlgvVFggRklGTyBBbGFybSBSZWdpc3RlciAqLworCXU4CXJlczJbMHhiMF07Cit9IGxwYzUxMnhfdDsKKworLyoKKyAqIFBBVEEKKyAqLwordHlwZWRlZiBzdHJ1Y3QgcGF0YTUxMnggeworCXU4IGZpeG1lWzB4MTAwXTsKK30gcGF0YTUxMnhfdDsKKworLyoKKyAqIFBTQworICovCit0eXBlZGVmIHN0cnVjdCBwc2M1MTJ4IHsKKwl2b2xhdGlsZSB1OAltb2RlOwkJLyogUFNDICsgMHgwMCAqLworCXZvbGF0aWxlIHU4CXJlczBbM107CisJdW5pb24gewkJCQkvKiBQU0MgKyAweDA0ICovCisJCXZvbGF0aWxlIHUxNglzdGF0dXM7CisJCXZvbGF0aWxlIHUxNgljbG9ja19zZWxlY3Q7CisJfSBzcl9jc3I7CisjZGVmaW5lIHBzY19zdGF0dXMJc3JfY3NyLnN0YXR1cworI2RlZmluZSBwc2NfY2xvY2tfc2VsZWN0IHNyX2Nzci5jbG9ja19zZWxlY3QKKwl2b2xhdGlsZSB1MTYJcmVzMTsKKwl2b2xhdGlsZSB1OAljb21tYW5kOwkvKiBQU0MgKyAweDA4ICovCisJdm9sYXRpbGUgdTgJcmVzMlszXTsKKwl1bmlvbiB7CQkJCS8qIFBTQyArIDB4MGMgKi8KKwkJdm9sYXRpbGUgdTgJYnVmZmVyXzg7CisJCXZvbGF0aWxlIHUxNglidWZmZXJfMTY7CisJCXZvbGF0aWxlIHUzMglidWZmZXJfMzI7CisJfSBidWZmZXI7CisjZGVmaW5lIHBzY19idWZmZXJfOAlidWZmZXIuYnVmZmVyXzgKKyNkZWZpbmUgcHNjX2J1ZmZlcl8xNglidWZmZXIuYnVmZmVyXzE2CisjZGVmaW5lIHBzY19idWZmZXJfMzIJYnVmZmVyLmJ1ZmZlcl8zMgorCXVuaW9uIHsJCQkJLyogUFNDICsgMHgxMCAqLworCQl2b2xhdGlsZSB1OAlpcGNyOworCQl2b2xhdGlsZSB1OAlhY3I7CisJfSBpcGNyX2FjcjsKKyNkZWZpbmUgcHNjX2lwY3IJaXBjcl9hY3IuaXBjcgorI2RlZmluZSBwc2NfYWNyCQlpcGNyX2Fjci5hY3IKKwl2b2xhdGlsZSB1OAlyZXMzWzNdOworCXVuaW9uIHsJCQkJLyogUFNDICsgMHgxNCAqLworCQl2b2xhdGlsZSB1MTYJaXNyOworCQl2b2xhdGlsZSB1MTYJaW1yOworCX0gaXNyX2ltcjsKKyNkZWZpbmUgcHNjX2lzcgkJaXNyX2ltci5pc3IKKyNkZWZpbmUgcHNjX2ltcgkJaXNyX2ltci5pbXIKKwl2b2xhdGlsZSB1MTYJcmVzNDsKKwl2b2xhdGlsZSB1OAljdHVyOwkJLyogUFNDICsgMHgxOCAqLworCXZvbGF0aWxlIHU4CXJlczVbM107CisJdm9sYXRpbGUgdTgJY3RscjsJCS8qIFBTQyArIDB4MWMgKi8KKwl2b2xhdGlsZSB1OAlyZXM2WzNdOworCXZvbGF0aWxlIHUzMgljY3I7CQkvKiBQU0MgKyAweDIwICovCisJdm9sYXRpbGUgdTgJcmVzN1sxMl07CisJdm9sYXRpbGUgdTgJaXZyOwkJLyogUFNDICsgMHgzMCAqLworCXZvbGF0aWxlIHU4CXJlczhbM107CisJdm9sYXRpbGUgdTgJaXA7CQkvKiBQU0MgKyAweDM0ICovCisJdm9sYXRpbGUgdTgJcmVzOVszXTsKKwl2b2xhdGlsZSB1OAlvcDE7CQkvKiBQU0MgKyAweDM4ICovCisJdm9sYXRpbGUgdTgJcmVzMTBbM107CisJdm9sYXRpbGUgdTgJb3AwOwkJLyogUFNDICsgMHgzYyAqLworCXZvbGF0aWxlIHU4CXJlczExWzNdOworCXZvbGF0aWxlIHUzMglzaWNyOwkJLyogUFNDICsgMHg0MCAqLworCXZvbGF0aWxlIHU4CXJlczEyWzYwXTsKKwl2b2xhdGlsZSB1MzIJdGZjbWQ7CQkvKiBQU0MgKyAweDgwICovCisJdm9sYXRpbGUgdTMyCXRmYWxhcm07CS8qIFBTQyArIDB4ODQgKi8KKwl2b2xhdGlsZSB1MzIJdGZzdGF0OwkJLyogUFNDICsgMHg4OCAqLworCXZvbGF0aWxlIHUzMgl0ZmludHN0YXQ7CS8qIFBTQyArIDB4OEMgKi8KKwl2b2xhdGlsZSB1MzIJdGZpbnRtYXNrOwkvKiBQU0MgKyAweDkwICovCisJdm9sYXRpbGUgdTMyCXRmY291bnQ7CS8qIFBTQyArIDB4OTQgKi8KKwl2b2xhdGlsZSB1MTYJdGZ3cHRyOwkJLyogUFNDICsgMHg5OCAqLworCXZvbGF0aWxlIHUxNgl0ZnJwdHI7CQkvKiBQU0MgKyAweDlBICovCisJdm9sYXRpbGUgdTMyCXRmc2l6ZTsJCS8qIFBTQyArIDB4OUMgKi8KKwl2b2xhdGlsZSB1OAlyZXMxM1syOF07CisJdW5pb24gewkJCQkvKiBQU0MgKyAweEJDICovCisJCXZvbGF0aWxlIHU4CWJ1ZmZlcl84OworCQl2b2xhdGlsZSB1MTYJYnVmZmVyXzE2OworCQl2b2xhdGlsZSB1MzIJYnVmZmVyXzMyOworCX0gdGZkYXRhX2J1ZmZlcjsKKyNkZWZpbmUgdGZkYXRhXzgJdGZkYXRhX2J1ZmZlci5idWZmZXJfOAorI2RlZmluZSB0ZmRhdGFfMTYJdGZkYXRhX2J1ZmZlci5idWZmZXJfMTYKKyNkZWZpbmUgdGZkYXRhXzMyCXRmZGF0YV9idWZmZXIuYnVmZmVyXzMyCisKKwl2b2xhdGlsZSB1MzIJcmZjbWQ7CQkvKiBQU0MgKyAweEMwICovCisJdm9sYXRpbGUgdTMyCXJmYWxhcm07CS8qIFBTQyArIDB4QzQgKi8KKwl2b2xhdGlsZSB1MzIJcmZzdGF0OwkJLyogUFNDICsgMHhDOCAqLworCXZvbGF0aWxlIHUzMglyZmludHN0YXQ7CS8qIFBTQyArIDB4Q0MgKi8KKwl2b2xhdGlsZSB1MzIJcmZpbnRtYXNrOwkvKiBQU0MgKyAweEQwICovCisJdm9sYXRpbGUgdTMyCXJmY291bnQ7CS8qIFBTQyArIDB4RDQgKi8KKwl2b2xhdGlsZSB1MTYJcmZ3cHRyOwkJLyogUFNDICsgMHhEOCAqLworCXZvbGF0aWxlIHUxNglyZnJwdHI7CQkvKiBQU0MgKyAweERBICovCisJdm9sYXRpbGUgdTMyCXJmc2l6ZTsJCS8qIFBTQyArIDB4REMgKi8KKwl2b2xhdGlsZSB1OAlyZXMxOFsyOF07CisJdW5pb24gewkJCQkvKiBQU0MgKyAweEZDICovCisJCXZvbGF0aWxlIHU4CWJ1ZmZlcl84OworCQl2b2xhdGlsZSB1MTYJYnVmZmVyXzE2OworCQl2b2xhdGlsZSB1MzIJYnVmZmVyXzMyOworCX0gcmZkYXRhX2J1ZmZlcjsKKyNkZWZpbmUgcmZkYXRhXzgJcmZkYXRhX2J1ZmZlci5idWZmZXJfOAorI2RlZmluZSByZmRhdGFfMTYJcmZkYXRhX2J1ZmZlci5idWZmZXJfMTYKKyNkZWZpbmUgcmZkYXRhXzMyCXJmZGF0YV9idWZmZXIuYnVmZmVyXzMyCit9IHBzYzUxMnhfdDsKKworLyoKKyAqIEZJRk9DCisgKi8KK3R5cGVkZWYgc3RydWN0IGZpZm9jNTEyeCB7CisJdTMyIGZpZm9jX2NtZDsKKwl1MzIgZmlmb2NfaW50OworCXUzMiBmaWZvY19kbWE7CisJdTMyIGZpZm9jX2F4ZTsKKwl1MzIgZmlmb2NfZGVidWc7CisJdTggZml4bWVbMHhFQ107Cit9IGZpZm9jNTEyeF90OworCisvKgorICogU0FUQQorICovCit0eXBlZGVmIHN0cnVjdCBzYXRhNTEyeCB7CisJdTggZml4bWVbMHgyMDAwXTsKK30gc2F0YTUxMnhfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaW1tYXAgeworCXN5c2NvbmY1MTJ4X3QJCXN5c2NvbmY7CS8qIFN5c3RlbSBjb25maWd1cmF0aW9uICovCisJdTgJCQlyZXMwWzB4NzAwXTsKKwl3ZHQ1MTJ4X3QJCXdkdDsJCS8qIFdhdGNoIERvZyBUaW1lciAoV0RUKSAqLworCXJ0Y2xrNTEyeF90CQlydGM7CQkvKiBSZWFsIFRpbWUgQ2xvY2sgTW9kdWxlICovCisJZ3B0NTEyeF90CQlncHQ7CQkvKiBHZW5lcmFsIFB1cnBvc2UgVGltZXIgKi8KKwlpcGljNTEyeF90CQlpcGljOwkJLyogSW50ZWdyYXRlZCBQcm9ncmFtbWFibGUgSW50ZXJydXB0IENvbnRyb2xsZXIgKi8KKwlhcmJpdGVyNTEyeF90CQlhcmJpdGVyOwkvKiBDU0IgQXJiaXRlciAqLworCXJlc2V0NTEyeF90CQlyZXNldDsJCS8qIFJlc2V0IE1vZHVsZSAqLworCWNsazUxMnhfdAkJY2xrOwkJLyogQ2xvY2sgTW9kdWxlICovCisJcG1jNTEyeF90CQlwbWM7CQkvKiBQb3dlciBNYW5hZ2VtZW50IENvbnRyb2wgTW9kdWxlICovCisJZ3BpbzUxMnhfdAkJZ3BpbzsJCS8qIEdlbmVyYWwgcHVycG9zZSBJL08gbW9kdWxlICovCisJdTgJCQlyZXMxWzB4MTAwXTsKKwltc2NhbjUxMnhfdAkJbXNjYW47CQkvKiBNU0NBTiAqLworCWJkbGM1MTJ4X3QJCWJkbGM7CQkvKiBCRExDICovCisJc2RoYzUxMnhfdAkJc2RoYzsJCS8qIFNESEMgKi8KKwlzcGRpZjUxMnhfdAkJc3BkaWY7CQkvKiBTUERJRiAqLworCWkyYzUxMnhfdAkJaTJjOwkJLyogSTJDIENvbnRyb2xsZXJzICovCisJdTgJCQlyZXMyWzB4ODAwXTsKKwlheGU1MTJ4X3QJCWF4ZTsJCS8qIEFYRSAqLworCWRpdTUxMnhfdAkJZGl1OwkJLyogRGlzcGxheSBJbnRlcmZhY2UgVW5pdCAqLworCWNmbTUxMnhfdAkJY2ZtOwkJLyogQ2xvY2sgRnJlcXVlbmN5IE1lYXN1cmVtZW50ICovCisJdTgJCQlyZXMzWzB4NTAwXTsKKwlmZWM1MTJ4X3QJCWZlYzsJCS8qIEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlciAqLworCXVscGk1MTJ4X3QJCXVscGk7CQkvKiBVU0IgVUxQSSAqLworCXU4CQkJcmVzNFsweGEwMF07CisJdXRtaTUxMnhfdAkJdXRtaTsJCS8qIFVTQiBVVE1JICovCisJdTgJCQlyZXM1WzB4MTAwMF07CisJcGNpZG1hNTEyeF90CQlwY2lfZG1hOwkvKiBQQ0kgRE1BICovCisJcGNpY29uZjUxMnhfdAkJcGNpX2NvbmY7CS8qIFBDSSBDb25maWd1cmF0aW9uICovCisJdTgJCQlyZXM2WzB4ODBdOworCWlvczUxMnhfdAkJaW9zOwkJLyogUENJIFNlcXVlbmNlciAqLworCXBjaWN0cmw1MTJ4X3QJCXBjaV9jdHJsOwkvKiBQQ0kgQ29udHJvbGxlciBDb250cm9sIGFuZCBTdGF0dXMgKi8KKwl1OAkJCXJlczdbMHhhMDBdOworCWRkcjUxMnhfdAkJbWRkcmM7CQkvKiBNdWx0aS1wb3J0IEREUiBNZW1vcnkgQ29udHJvbGxlciAqLworCWlvY3RybDUxMnhfdAkJaW9fY3RybDsJLyogSU8gQ29udHJvbCAqLworCWlpbTUxMnhfdAkJaWltOwkJLyogSUMgSWRlbnRpZmljYXRpb24gbW9kdWxlICovCisJdTgJCQlyZXM4WzB4NDAwMF07CisJbHBjNTEyeF90CQlscGM7CQkvKiBMb2NhbFBsdXMgQ29udHJvbGxlciAqLworCXBhdGE1MTJ4X3QJCXBhdGE7CQkvKiBQYXJhbGxlbCBBVEEgKi8KKwl1OAkJCXJlczlbMHhkMDBdOworCXBzYzUxMnhfdAkJcHNjWzEyXTsJLyogUFNDcyAqLworCXU4CQkJcmVzMTBbMHgzMDBdOworCWZpZm9jNTEyeF90CQlmaWZvYzsJCS8qIEZJRk8gQ29udHJvbGxlciAqLworCXU4CQkJcmVzMTFbMHgyMDAwXTsKKwlkbWE1MTJ4X3QJCWRtYTsJCS8qIERNQSAqLworCXU4CQkJcmVzMTJbMHhhODAwXTsKKwlzYXRhNTEyeF90CQlzYXRhOwkJLyogU2VyaWFsIEFUQSAqLworCXU4CQkJcmVzMTNbMHhkZTAwMF07Cit9IGltbWFwX3Q7CisjZW5kaWYgLyogX19JTU1BUF81MTJ4X18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9pbW1hcF84NXh4LmggYi9pbmNsdWRlL2FzbS1wcGMvaW1tYXBfODV4eC5oCmluZGV4IDUzNzdjMmUuLmUwMDJkMjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9pbW1hcF84NXh4LmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL2ltbWFwXzg1eHguaApAQCAtMTU0OCw3ICsxNTQ4LDkgQEAKIAljaGFyCXJlczlbMTJdOwogCXVpbnQJcHZyOwkJLyogMHhlMDBhMCAtIFByb2Nlc3NvciB2ZXJzaW9uIHJlZ2lzdGVyICovCiAJdWludAlzdnI7CQkvKiAweGUwMGE0IC0gU3lzdGVtIHZlcnNpb24gcmVnaXN0ZXIgKi8KLQljaGFyCXJlczEwWzM0MTZdOworCWNoYXIJcmVzMTBhWzhdOworCXVpbnQJcnN0Y3I7CQkvKiAweGUwMGIwIC0gUmVzZXQgY29udHJvbCByZWdpc3RlciAqLworCWNoYXIJcmVzMTBiWzM0MDRdOwogCXVpbnQJY2xrb2NyOwkJLyogMHhlMGUwMCAtIENsb2NrIG91dCBzZWxlY3QgcmVnaXN0ZXIgKi8KIAljaGFyCXJlczExWzEyXTsKIAl1aW50CWRkcmRsbGNyOwkvKiAweGUwZTEwIC0gRERSIERMTCBjb250cm9sIHJlZ2lzdGVyICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvaW1tYXBfODZ4eC5oIGIvaW5jbHVkZS9hc20tcHBjL2ltbWFwXzg2eHguaAppbmRleCAwZTNmYzM0Li4xNjk3MjViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvaW1tYXBfODZ4eC5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9pbW1hcF84Nnh4LmgKQEAgLTEyNTcsOSArMTI1NywxMiBAQAogCXVpbnQJcG9ycGxsc3I7CS8qIDB4ZTAwMDAgLSBQT1IgUExMIHJhdGlvIHN0YXR1cyByZWdpc3RlciAqLwogCXVpbnQJcG9yYm1zcjsJLyogMHhlMDAwNCAtIFBPUiBib290IG1vZGUgc3RhdHVzIHJlZ2lzdGVyICovCiAjZGVmaW5lIE1QQzg2eHhfUE9SQk1TUl9IQSAgICAgIDB4MDAwNjAwMDAKKyNkZWZpbmUgTVBDODV4eF9QT1JCTVNSX0hBCQkweDAwMDcwMDAwCiAJdWludAlwb3JpbXBzY3I7CS8qIDB4ZTAwMDggLSBQT1IgSS9PIGltcGVkYW5jZSBzdGF0dXMgYW5kIGNvbnRyb2wgcmVnaXN0ZXIgKi8KIAl1aW50CXBvcmRldnNyOwkvKiAweGUwMDBjIC0gUE9SIEkvTyBkZXZpY2Ugc3RhdHVzIHJlZ3NpdGVyICovCi0jZGVmaW5lIE1QQzg2eHhfUE9SREVWU1JfSU9fU0VMIDB4MDAwRjAwMDAKKyNkZWZpbmUgTVBDODZ4eF9QT1JERVZTUl9JT19TRUwJCTB4MDAwRjAwMDAKKyNkZWZpbmUgTVBDODV4eF9QT1JERVZTUl9JT19TRUwJCTB4MDAzODAwMDAgLyogODV4eCBwbGF0Zm9ybSB0eXBlICovCisjZGVmaW5lIE1QQzg2eHhfUE9SREVWU1JfQ09SRTFURQkweDAwMDAwMDgwIC8qIEFTTVAgKENvcmUxIGFkZHIgdHJhbnMpICovCiAJdWludAlwb3JkYmdtc3I7CS8qIDB4ZTAwMTAgLSBQT1IgZGVidWcgbW9kZSBzdGF0dXMgcmVnaXN0ZXIgKi8KIAljaGFyCXJlczFbMTJdOwogCXVpbnQJZ3Bwb3JjcjsJLyogMHhlMDAyMCAtIEdlbmVyYWwtcHVycG9zZSBQT1IgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLwpAQCAtMTI3Myw4ICsxMjc2LDExIEBACiAJdWludAlwbXV4Y3I7CQkvKiAweGUwMDYwIC0gQWx0ZXJuYXRlIGZ1bmN0aW9uIHNpZ25hbCBtdWx0aXBsZXggY29udHJvbCAqLwogCWNoYXIJcmVzNlsxMl07CiAJdWludAlkZXZkaXNyOwkvKiAweGUwMDcwIC0gRGV2aWNlIGRpc2FibGUgY29udHJvbCAqLwotI2RlZmluZSBNUEM4Nnh4X0RFVkRJU1JfUENJRVgxICAweDgwMDAwMDAwCi0jZGVmaW5lIE1QQzg2eHhfREVWRElTUl9QQ0lFWDIgIDB4NDAwMDAwMDAKKyNkZWZpbmUgTVBDODZ4eF9ERVZESVNSX1BDSUVYMQkweDgwMDAwMDAwCisjZGVmaW5lIE1QQzg2eHhfREVWRElTUl9QQ0lFWDIJMHg0MDAwMDAwMAorI2RlZmluZSBNUEM4Nnh4X0RFVkRJU1JfUENJMQkweDgwMDAwMDAwCisjZGVmaW5lIE1QQzg2eHhfREVWRElTUl9QQ0lFMQkweDQwMDAwMDAwCisjZGVmaW5lIE1QQzg2eHhfREVWRElTUl9QQ0lFMgkweDIwMDAwMDAwCiAJY2hhcglyZXM3WzEyXTsKIAl1aW50CXBvd21ndGNzcjsJLyogMHhlMDA4MCAtIFBvd2VyIG1hbmFnZW1lbnQgc3RhdHVzIGFuZCBjb250cm9sIHJlZ2lzdGVyICovCiAJY2hhcglyZXM4WzEyXTsKQEAgLTEyODIsNyArMTI4OCw5IEBACiAJY2hhcglyZXM5WzEyXTsKIAl1aW50CXB2cjsJCS8qIDB4ZTAwYTAgLSBQcm9jZXNzb3IgdmVyc2lvbiByZWdpc3RlciAqLwogCXVpbnQJc3ZyOwkJLyogMHhlMDBhNCAtIFN5c3RlbSB2ZXJzaW9uIHJlZ2lzdGVyICovCi0JY2hhcglyZXMxMFszNDE2XTsKKwljaGFyCXJlczEwYVsxODgwXTsKKwl1aW50CWNsa2R2ZHI7CS8qIDB4ZTA4MDAgLSBDbG9jayBEaXZpZGUgcmVnaXN0ZXIgKi8KKwljaGFyCXJlczEwYlsxNTMyXTsKIAl1aW50CWNsa29jcjsJCS8qIDB4ZTBlMDAgLSBDbG9jayBvdXQgc2VsZWN0IHJlZ2lzdGVyICovCiAJY2hhcglyZXMxMVsxMl07CiAJdWludAlkZHJkbGxjcjsJLyogMHhlMGUxMCAtIEREUiBETEwgY29udHJvbCByZWdpc3RlciAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL2ltbWFwX2ZzbF9wY2kuaCBiL2luY2x1ZGUvYXNtLXBwYy9pbW1hcF9mc2xfcGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ3MzJiNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9pbW1hcF9mc2xfcGNpLmgKQEAgLTAsMCArMSwxNTAgQEAKKy8qIChDKSBDb3B5cmlnaHQgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fSU1NQVBfODV4eF9mc2xfcGNpX18KKyNkZWZpbmUgX19JTU1BUF84NXh4X2ZzbF9wY2lfXworCisvKgorICogQ29tbW9uIFBDSS9QQ0lFIFJlZ2lzdGVyIHN0cnVjdHVyZSBmb3IgbXBjODV4eCBhbmQgbXBjODZ4eAorICovCisKKy8qCisgKiBQQ0kgVHJhbnNsYXRpb24gUmVnaXN0ZXJzCisgKi8KK3R5cGVkZWYgc3RydWN0IHBjaV9vdXRib3VuZF93aW5kb3cgeworCXUzMglwb3RhcjsJCS8qIDB4MDAgLSBBZGRyZXNzICovCisJdTMyCXBvdGVhcjsJCS8qIDB4MDQgLSBBZGRyZXNzIEV4dGVuZGVkICovCisJdTMyCXBvd2JhcjsJCS8qIDB4MDggLSBXaW5kb3cgQmFzZSBBZGRyZXNzICovCisJdTMyCXJlczE7CisJdTMyCXBvd2FyOwkJLyogMHgxMCAtIFdpbmRvdyBBdHRyaWJ1dGVzICovCisjZGVmaW5lIFBPV0FSX0VOCTB4ODAwMDAwMDAKKyNkZWZpbmUgUE9XQVJfSU9fUkVBRAkweDAwMDgwMDAwCisjZGVmaW5lIFBPV0FSX01FTV9SRUFECTB4MDAwNDAwMDAKKyNkZWZpbmUgUE9XQVJfSU9fV1JJVEUJMHgwMDAwODAwMAorI2RlZmluZSBQT1dBUl9NRU1fV1JJVEUJMHgwMDAwNDAwMAorCXUzMglyZXMyWzNdOworfSBwb3RfdDsKKwordHlwZWRlZiBzdHJ1Y3QgcGNpX2luYm91bmRfd2luZG93IHsKKwl1MzIJcGl0YXI7CQkvKiAweDAwIC0gQWRkcmVzcyAqLworCXUzMglyZXMxOworCXUzMglwaXdiYXI7CQkvKiAweDA4IC0gV2luZG93IEJhc2UgQWRkcmVzcyAqLworCXUzMglwaXdiZWFyOwkvKiAweDBjIC0gV2luZG93IEJhc2UgQWRkcmVzcyBFeHRlbmRlZCAqLworCXUzMglwaXdhcjsJCS8qIDB4MTAgLSBXaW5kb3cgQXR0cmlidXRlcyAqLworI2RlZmluZSBQSVdBUl9FTgkJMHg4MDAwMDAwMAorI2RlZmluZSBQSVdBUl9QRgkJMHgyMDAwMDAwMAorI2RlZmluZSBQSVdBUl9MT0NBTAkJMHgwMGYwMDAwMAorI2RlZmluZSBQSVdBUl9SRUFEX1NOT09QCTB4MDAwNTAwMDAKKyNkZWZpbmUgUElXQVJfV1JJVEVfU05PT1AJMHgwMDAwNTAwMAorCXUzMglyZXMyWzNdOworfSBwaXRfdDsKKworLyogUENJL1BDSSBFeHByZXNzIFJlZ2lzdGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgY2Nzcl9wY2kgeworCXUzMgljZmdfYWRkcjsJLyogMHgwMDAgLSBQQ0kgQ29uZmlndXJhdGlvbiBBZGRyZXNzIFJlZ2lzdGVyICovCisJdTMyCWNmZ19kYXRhOwkvKiAweDAwNCAtIFBDSSBDb25maWd1cmF0aW9uIERhdGEgUmVnaXN0ZXIgKi8KKwl1MzIJaW50X2FjazsJLyogMHgwMDggLSBQQ0kgSW50ZXJydXB0IEFja25vd2xlZGdlIFJlZ2lzdGVyICovCisJdTMyCW91dF9jb21wX3RvOwkvKiAweDAwQyAtIFBDSSBPdXRib3VuZCBDb21wbGV0aW9uIFRpbWVvdXQgUmVnaXN0ZXIgKi8KKwl1MzIJb3V0X2NvbmZfdG87CS8qIDB4MDEwIC0gUENJIENvbmZpZ3VyYXRpb24gVGltZW91dCBSZWdpc3RlciAqLworCXUzMgljb25maWc7CQkvKiAweDAxNCAtIFBDSUUgQ09ORklHIFJlZ2lzdGVyICovCisJY2hhcglyZXMyWzhdOworCXUzMglwbWVfbXNnX2RldDsJLyogMHgwMjAgLSBQQ0lFIFBNRSAmIG1lc3NhZ2UgZGV0ZWN0IHJlZ2lzdGVyICovCisJdTMyCXBtZV9tc2dfZGlzOwkvKiAweDAyNCAtIFBDSUUgUE1FICYgbWVzc2FnZSBkaXNhYmxlIHJlZ2lzdGVyICovCisJdTMyCXBtZV9tc2dfaW50X2VuOwkvKiAweDAyOCAtIFBDSUUgUE1FICYgbWVzc2FnZSBpbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyICovCisJdTMyCXBtX2NvbW1hbmQ7CS8qIDB4MDJjIC0gUENJRSBQTSBDb21tYW5kIHJlZ2lzdGVyICovCisJY2hhcglyZXM0WzMwMTZdOwkvKiAgICAgKC0gI3hiZjgJICN4MzApMzAxNiAqLworCXUzMglibG9ja19yZXYxOwkvKiAweGJmOCAtIFBDSUUgQmxvY2sgUmV2aXNpb24gcmVnaXN0ZXIgMSAqLworCXUzMglibG9ja19yZXYyOwkvKiAweGJmYyAtIFBDSUUgQmxvY2sgUmV2aXNpb24gcmVnaXN0ZXIgMiAqLworCisJcG90X3QJcG90WzVdOwkJLyogMHhjMDAgLSAweGM5ZiBPdXRib3VuZCBBVE1VJ3MgMCwgMSwgMiwgMywgYW5kIDQgKi8KKwl1MzIJcmVzNVs2NF07CisJcGl0X3QJcGl0WzNdOwkJLyogMHhkYTAgLSAweGRmZiBJbmJvdW5kIEFUTVUncyAzLCAyLCBhbmQgMSAqLworI2RlZmluZSBQSVQzIDAKKyNkZWZpbmUgUElUMiAxCisjZGVmaW5lIFBJVDEgMgorCisjaWYgMAorCXUzMglwb3RhcjA7CQkvKiAweGMwMCAtIFBDSSBPdXRib3VuZCBUcmFuc2FjdGlvbiBBZGRyZXNzIFJlZ2lzdGVyIDAgKi8KKwl1MzIJcG90ZWFyMDsJLyogMHhjMDQgLSBQQ0kgT3V0Ym91bmQgVHJhbnNsYXRpb24gRXh0ZW5kZWQgQWRkcmVzcyBSZWdpc3RlciAwICovCisJY2hhcglyZXM1WzhdOworCXUzMglwb3dhcjA7CQkvKiAweGMxMCAtIFBDSSBPdXRib3VuZCBXaW5kb3cgQXR0cmlidXRlcyBSZWdpc3RlciAwICovCisJY2hhcglyZXM2WzEyXTsKKwl1MzIJcG90YXIxOwkJLyogMHhjMjAgLSBQQ0kgT3V0Ym91bmQgVHJhbnNhY3Rpb24gQWRkcmVzcyBSZWdpc3RlciAxICovCisJdTMyCXBvdGVhcjE7CS8qIDB4YzI0IC0gUENJIE91dGJvdW5kIFRyYW5zbGF0aW9uIEV4dGVuZGVkIEFkZHJlc3MgUmVnaXN0ZXIgMSAqLworCXUzMglwb3diYXIxOwkvKiAweGMyOCAtIFBDSSBPdXRib3VuZCBXaW5kb3cgQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIDEgKi8KKwljaGFyCXJlczdbNF07CisJdTMyCXBvd2FyMTsJCS8qIDB4YzMwIC0gUENJIE91dGJvdW5kIFdpbmRvdyBBdHRyaWJ1dGVzIFJlZ2lzdGVyIDEgKi8KKwljaGFyCXJlczhbMTJdOworCXUzMglwb3RhcjI7CQkvKiAweGM0MCAtIFBDSSBPdXRib3VuZCBUcmFuc2FjdGlvbiBBZGRyZXNzIFJlZ2lzdGVyIDIgKi8KKwl1MzIJcG90ZWFyMjsJLyogMHhjNDQgLSBQQ0kgT3V0Ym91bmQgVHJhbnNsYXRpb24gRXh0ZW5kZWQgQWRkcmVzcyBSZWdpc3RlciAyICovCisJdTMyCXBvd2JhcjI7CS8qIDB4YzQ4IC0gUENJIE91dGJvdW5kIFdpbmRvdyBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgMiAqLworCWNoYXIJcmVzOVs0XTsKKwl1MzIJcG93YXIyOwkJLyogMHhjNTAgLSBQQ0kgT3V0Ym91bmQgV2luZG93IEF0dHJpYnV0ZXMgUmVnaXN0ZXIgMiAqLworCWNoYXIJcmVzMTBbMTJdOworCXUzMglwb3RhcjM7CQkvKiAweGM2MCAtIFBDSSBPdXRib3VuZCBUcmFuc2FjdGlvbiBBZGRyZXNzIFJlZ2lzdGVyIDMgKi8KKwl1MzIJcG90ZWFyMzsJLyogMHhjNjQgLSBQQ0kgT3V0Ym91bmQgVHJhbnNsYXRpb24gRXh0ZW5kZWQgQWRkcmVzcyBSZWdpc3RlciAzICovCisJdTMyCXBvd2JhcjM7CS8qIDB4YzY4IC0gUENJIE91dGJvdW5kIFdpbmRvdyBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgMyAqLworCWNoYXIJcmVzMTFbNF07CisJdTMyCXBvd2FyMzsJCS8qIDB4YzcwIC0gUENJIE91dGJvdW5kIFdpbmRvdyBBdHRyaWJ1dGVzIFJlZ2lzdGVyIDMgKi8KKwljaGFyCXJlczEyWzEyXTsKKwl1MzIJcG90YXI0OwkJLyogMHhjODAgLSBQQ0kgT3V0Ym91bmQgVHJhbnNhY3Rpb24gQWRkcmVzcyBSZWdpc3RlciA0ICovCisJdTMyCXBvdGVhcjQ7CS8qIDB4Yzg0IC0gUENJIE91dGJvdW5kIFRyYW5zbGF0aW9uIEV4dGVuZGVkIEFkZHJlc3MgUmVnaXN0ZXIgNCAqLworCXUzMglwb3diYXI0OwkvKiAweGM4OCAtIFBDSSBPdXRib3VuZCBXaW5kb3cgQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIDQgKi8KKwljaGFyCXJlczEzWzRdOworCXUzMglwb3dhcjQ7CQkvKiAweGM5MCAtIFBDSSBPdXRib3VuZCBXaW5kb3cgQXR0cmlidXRlcyBSZWdpc3RlciA0ICovCisJY2hhcglyZXMxNFsyNjhdOworCXUzMglwaXRhcjM7CQkvKiAweGRhMCAtIFBDSSBJbmJvdW5kIFRyYW5zbGF0aW9uIEFkZHJlc3MgUmVnaXN0ZXIgMyAqLworCWNoYXIJcmVzMTVbNF07CisJdTMyCXBpd2JhcjM7CS8qIDB4ZGE4IC0gUENJIEluYm91bmQgV2luZG93IEJhc2UgQWRkcmVzcyBSZWdpc3RlciAzICovCisJdTMyCXBpd2JlYXIzOwkvKiAweGRhYyAtIFBDSSBJbmJvdW5kIFdpbmRvdyBCYXNlIEV4dGVuZGVkIEFkZHJlc3MgUmVnaXN0ZXIgMyAqLworCXUzMglwaXdhcjM7CQkvKiAweGRiMCAtIFBDSSBJbmJvdW5kIFdpbmRvdyBBdHRyaWJ1dGVzIFJlZ2lzdGVyIDMgKi8KKwljaGFyCXJlczE2WzEyXTsKKwl1MzIJcGl0YXIyOwkJLyogMHhkYzAgLSBQQ0kgSW5ib3VuZCBUcmFuc2xhdGlvbiBBZGRyZXNzIFJlZ2lzdGVyIDIgKi8KKwljaGFyCXJlczE3WzRdOworCXUzMglwaXdiYXIyOwkvKiAweGRjOCAtIFBDSSBJbmJvdW5kIFdpbmRvdyBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgMiAqLworCXUzMglwaXdiZWFyMjsJLyogMHhkY2MgLSBQQ0kgSW5ib3VuZCBXaW5kb3cgQmFzZSBFeHRlbmRlZCBBZGRyZXNzIFJlZ2lzdGVyIDIgKi8KKwl1MzIJcGl3YXIyOwkJLyogMHhkZDAgLSBQQ0kgSW5ib3VuZCBXaW5kb3cgQXR0cmlidXRlcyBSZWdpc3RlciAyICovCisJY2hhcglyZXMxOFsxMl07CisJdTMyCXBpdGFyMTsJCS8qIDB4ZGUwIC0gUENJIEluYm91bmQgVHJhbnNsYXRpb24gQWRkcmVzcyBSZWdpc3RlciAxICovCisJY2hhcglyZXMxOVs0XTsKKwl1MzIJcGl3YmFyMTsJLyogMHhkZTggLSBQQ0kgSW5ib3VuZCBXaW5kb3cgQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIDEgKi8KKwljaGFyCXJlczIwWzRdOworCXUzMglwaXdhcjE7CQkvKiAweGRmMCAtIFBDSSBJbmJvdW5kIFdpbmRvdyBBdHRyaWJ1dGVzIFJlZ2lzdGVyIDEgKi8KKwljaGFyCXJlczIxWzEyXTsKKyNlbmRpZgorCXUzMglwZWRyOwkJLyogMHhlMDAgLSBQQ0kgRXJyb3IgRGV0ZWN0IFJlZ2lzdGVyICovCisJdTMyCXBlY2RyOwkJLyogMHhlMDQgLSBQQ0kgRXJyb3IgQ2FwdHVyZSBEaXNhYmxlIFJlZ2lzdGVyICovCisJdTMyCXBlZXI7CQkvKiAweGUwOCAtIFBDSSBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisJdTMyCXBlYXR0cmNyOwkvKiAweGUwYyAtIFBDSSBFcnJvciBBdHRyaWJ1dGVzIENhcHR1cmUgUmVnaXN0ZXIgKi8KKwl1MzIJcGVhZGRyY3I7CS8qIDB4ZTEwIC0gUENJIEVycm9yIEFkZHJlc3MgQ2FwdHVyZSBSZWdpc3RlciAqLworLyoJdTMyCXBlcnJfZGlzcgkgKiAweGUxMCAtIFBDSUUgRXJvcnIgRGlzYWJsZSBSZWdpc3RlciAqLworCXUzMglwZWV4dGFkZHJjcjsJLyogMHhlMTQgLSBQQ0kJRXJyb3IgRXh0ZW5kZWQgQWRkcmVzcyBDYXB0dXJlIFJlZ2lzdGVyICovCisJdTMyCXBlZGxjcjsJCS8qIDB4ZTE4IC0gUENJIEVycm9yIERhdGEgTG93IENhcHR1cmUgUmVnaXN0ZXIgKi8KKwl1MzIJcGVkaGNyOwkJLyogMHhlMWMgLSBQQ0kgRXJyb3IgRXJyb3IgRGF0YSBIaWdoIENhcHR1cmUgUmVnaXN0ZXIgKi8KKwl1MzIJZ2FzX3RpbXI7CS8qIDB4ZTIwIC0gUENJIEdhc2tldCBUaW1lciBSZWdpc3RlciAqLworLyoJdTMyCXBlcnJfY2FwX3N0YXQ7CSAqIDB4ZTIwIC0gUENJRSBFcnJvciBDYXB0dXJlIFN0YXR1cyBSZWdpc3RlciAqLworCWNoYXIJcmVzMjJbNF07CisJdTMyCXBlcnJfY2FwMDsJLyogMHhlMjggLSBQQ0lFIEVycm9yIENhcHR1cmUgUmVnaXN0ZXIgMCAqLworCXUzMglwZXJyX2NhcDE7CS8qIDB4ZTJjIC0gUENJRSBFcnJvciBDYXB0dXJlIFJlZ2lzdGVyIDEgKi8KKwl1MzIJcGVycl9jYXAyOwkvKiAweGUzMCAtIFBDSUUgRXJyb3IgQ2FwdHVyZSBSZWdpc3RlciAyICovCisJdTMyCXBlcnJfY2FwMzsJLyogMHhlMzQgLSBQQ0lFIEVycm9yIENhcHR1cmUgUmVnaXN0ZXIgMyAqLworCWNoYXIJcmVzMjNbNDU2XTsJLyogICAgICgtICN4MTAwMCAjeGUzOCkgNDU2ICovCit9IGNjc3JfZnNsX3BjaV90OworCisjZW5kaWYgLypfX0lNTUFQX2ZzbF9wY2lfXyovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1wcGMvcHJvY2Vzc29yLmgKaW5kZXggNWVmYzNlZS4uOWJlNWEyNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9wcm9jZXNzb3IuaApAQCAtMzUsMTggKzM1LDE4IEBACiAjZGVmaW5lIE1TUl9EV0UgICAgICAgICAoMTw8MTApICAgICAgICAgLyogRGVidWcgV2FpdCBFbmFibGUgKDR4eCkgKi8KICNkZWZpbmUgTVNSX1VCTEUgICAgICAgICgxPDwxMCkgICAgICAgICAvKiBCVEIgbG9jayBlbmFibGUgKGU1MDApICovCiAjZGVmaW5lIE1TUl9CRQkJKDE8PDkpCQkvKiBCcmFuY2ggVHJhY2UgKi8KLSNkZWZpbmUgTVNSX0RFCQkoMTw8OSkgCQkvKiBEZWJ1ZyBFeGNlcHRpb24gRW5hYmxlICovCisjZGVmaW5lIE1TUl9ERQkJKDE8PDkpCQkvKiBEZWJ1ZyBFeGNlcHRpb24gRW5hYmxlICovCiAjZGVmaW5lIE1TUl9GRTEJCSgxPDw4KQkJLyogRmxvYXRpbmcgRXhjZXB0aW9uIG1vZGUgMSAqLwogI2RlZmluZSBNU1JfSVAJCSgxPDw2KQkJLyogRXhjZXB0aW9uIHByZWZpeCAweDAwMC8weEZGRiAqLwotI2RlZmluZSBNU1JfSVIJCSgxPDw1KSAJCS8qIEluc3RydWN0aW9uIFJlbG9jYXRlICovCisjZGVmaW5lIE1TUl9JUgkJKDE8PDUpCQkvKiBJbnN0cnVjdGlvbiBSZWxvY2F0ZSAqLwogI2RlZmluZSBNU1JfSVMgICAgICAgICAgKDE8PDUpICAgICAgICAgIC8qIEJvb2sgRSBJbnN0cnVjdGlvbiBzcGFjZSAqLwotI2RlZmluZSBNU1JfRFIJCSgxPDw0KSAJCS8qIERhdGEgUmVsb2NhdGUgKi8KKyNkZWZpbmUgTVNSX0RSCQkoMTw8NCkJCS8qIERhdGEgUmVsb2NhdGUgKi8KICNkZWZpbmUgTVNSX0RTICAgICAgICAgICgxPDw0KSAgICAgICAgICAvKiBCb29rIEUgRGF0YSBzcGFjZSAqLwogI2RlZmluZSBNU1JfUEUJCSgxPDwzKQkJLyogUHJvdGVjdGlvbiBFbmFibGUgKi8KICNkZWZpbmUgTVNSX1BYCQkoMTw8MikJCS8qIFByb3RlY3Rpb24gRXhjbHVzaXZlIE1vZGUgKi8KICNkZWZpbmUgTVNSX1BNTSAgICAgICAgICgxPDwyKSAgICAgICAgICAvKiBQZXJmb3JtYW5jZSBtb25pdG9yIG1hcmsgYml0IChlNTAwKSAqLwogI2RlZmluZSBNU1JfUkkJCSgxPDwxKQkJLyogUmVjb3ZlcmFibGUgRXhjZXB0aW9uICovCi0jZGVmaW5lIE1TUl9MRQkJKDE8PDApIAkJLyogTGl0dGxlIEVuZGlhbiAqLworI2RlZmluZSBNU1JfTEUJCSgxPDwwKQkJLyogTGl0dGxlIEVuZGlhbiAqLwogCiAjaWZkZWYgQ09ORklHX0FQVVNfRkFTVF9FWENFUFQKICNkZWZpbmUgTVNSXwkJTVNSX01FfE1TUl9JUHxNU1JfUkkKQEAgLTU4LDcgKzU4LDYgQEAKICNlbHNlCiAjZGVmaW5lIE1TUl9LRVJORUwJTVNSX01FCiAjZW5kaWYKLSNkZWZpbmUgTVNSX1VTRVIJTVNSX0tFUk5FTHxNU1JfUFJ8TVNSX0VFCiAKIC8qIEZsb2F0aW5nIFBvaW50IFN0YXR1cyBhbmQgQ29udHJvbCBSZWdpc3RlciAoRlBTQ1IpIEZpZWxkcyAqLwogCkBAIC0xMjMsOSArMTIyLDkgQEAKICNkZWZpbmUgICBEQkNSX0VETQkweDgwMDAwMDAwCiAjZGVmaW5lICAgREJDUl9JRE0JMHg0MDAwMDAwMAogI2RlZmluZSAgIERCQ1JfUlNUKHgpCSgoKHgpICYgMHgzKSA8PCAyOCkKLSNkZWZpbmUgICAgIERCQ1JfUlNUX05PTkUgICAgICAgCTAKLSNkZWZpbmUgICAgIERCQ1JfUlNUX0NPUkUgICAgICAgCTEKLSNkZWZpbmUgICAgIERCQ1JfUlNUX0NISVAgICAgICAgCTIKKyNkZWZpbmUgICAgIERCQ1JfUlNUX05PTkUJCTAKKyNkZWZpbmUgICAgIERCQ1JfUlNUX0NPUkUJCTEKKyNkZWZpbmUgICAgIERCQ1JfUlNUX0NISVAJCTIKICNkZWZpbmUgICAgIERCQ1JfUlNUX1NZU1RFTQkJMwogI2RlZmluZSAgIERCQ1JfSUMJMHgwODAwMDAwMAkvKiBJbnN0cnVjdGlvbiBDb21wbGV0aW9uIERlYnVnIEV2bnQgKi8KICNkZWZpbmUgICBEQkNSX0JUCTB4MDQwMDAwMDAJLyogQnJhbmNoIFRha2VuIERlYnVnIEV2ZW50ICovCkBAIC0yNjYsNyArMjY1LDcgQEAKICNkZWZpbmUgU1BSTl9JQ01QCTB4M0Q1CS8qIEluc3RydWN0aW9uIFRMQiBDb21wYXJlIFJlZ2lzdGVyICovCiAjZGVmaW5lIFNQUk5fSUNUQwkweDNGQgkvKiBJbnN0cnVjdGlvbiBDYWNoZSBUaHJvdHRsaW5nIENvbnRyb2wgUmVnICovCiAjZGVmaW5lIFNQUk5fSU1JU1MJMHgzRDQJLyogSW5zdHJ1Y3Rpb24gVExCIE1pc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU1BSTl9JTU1SCTB4MjdFICAJLyogSW50ZXJuYWwgTWVtb3J5IE1hcCBSZWdpc3RlciAqLworI2RlZmluZSBTUFJOX0lNTVIJMHgyN0UJLyogSW50ZXJuYWwgTWVtb3J5IE1hcCBSZWdpc3RlciAqLwogI2RlZmluZSBTUFJOX0xEU1RDUgkweDNGOCAgIC8qIExvYWQvU3RvcmUgQ29udHJvbCBSZWdpc3RlciAqLwogI2RlZmluZSBTUFJOX0wyQ1IJMHgzRjkJLyogTGV2ZWwgMiBDYWNoZSBDb250cm9sIFJlZ3NpdGVyICovCiAjZGVmaW5lIFNQUk5fTFIJCTB4MDA4CS8qIExpbmsgUmVnaXN0ZXIgKi8KQEAgLTMwOCw3ICszMDcsNyBAQAogI2RlZmluZSBTUFJOX1NSUjAJMHgwMUEJLyogU2F2ZS9SZXN0b3JlIFJlZ2lzdGVyIDAgKi8KICNkZWZpbmUgU1BSTl9TUlIxCTB4MDFCCS8qIFNhdmUvUmVzdG9yZSBSZWdpc3RlciAxICovCiAjZGVmaW5lIFNQUk5fU1JSMgkweDNERQkvKiBTYXZlL1Jlc3RvcmUgUmVnaXN0ZXIgMiAqLwotI2RlZmluZSBTUFJOX1NSUjMgCTB4M0RGCS8qIFNhdmUvUmVzdG9yZSBSZWdpc3RlciAzICovCisjZGVmaW5lIFNQUk5fU1JSMwkweDNERgkvKiBTYXZlL1Jlc3RvcmUgUmVnaXN0ZXIgMyAqLwogI2lmZGVmIENPTkZJR19CT09LRQogI2RlZmluZSBTUFJOX1NWUgkweDNGRgkvKiBTeXN0ZW0gVmVyc2lvbiBSZWdpc3RlciAqLwogI2Vsc2UKQEAgLTQ1MSwxMCArNDUwLDIyIEBACiAjZGVmaW5lIFNQUk5fUElEMSAgICAgICAweDI3OSAgIC8qIFByb2Nlc3MgSUQgUmVnaXN0ZXIgMSAqLwogI2RlZmluZSBTUFJOX1BJRDIgICAgICAgMHgyN2EgICAvKiBQcm9jZXNzIElEIFJlZ2lzdGVyIDIgKi8KICNkZWZpbmUgU1BSTl9NQ1NSCTB4MjNjCS8qIE1hY2hpbmUgQ2hlY2sgU3luZHJvbWUgcmVnaXN0ZXIgKi8KKyNpZmRlZiBDT05GSUdfNDQwCisjZGVmaW5lIE1DU1JfTUNTCTB4ODAwMDAwMDAJLyogTWFjaGluZSBDaGVjayBTdW1tYXJ5ICovCisjZGVmaW5lIE1DU1JfSUIJCTB4NDAwMDAwMDAJLyogSW5zdHJ1Y3Rpb24gUExCIEVycm9yICovCisjZGVmaW5lIE1DU1JfRFJCCTB4MjAwMDAwMDAJLyogRGF0YSBSZWFkIFBMQiBFcnJvciAqLworI2RlZmluZSBNQ1NSX0RXQgkweDEwMDAwMDAwCS8qIERhdGEgV3JpdGUgUExCIEVycm9yICovCisjZGVmaW5lIE1DU1JfVExCUAkweDA4MDAwMDAwCS8qIFRMQiBQYXJpdHkgRXJyb3IgKi8KKyNkZWZpbmUgTUNTUl9JQ1AJMHgwNDAwMDAwMAkvKiBJLUNhY2hlIFBhcml0eSBFcnJvciAqLworI2RlZmluZSBNQ1NSX0RDU1AJMHgwMjAwMDAwMAkvKiBELUNhY2hlIFNlYXJjaCBQYXJpdHkgRXJyb3IgKi8KKyNkZWZpbmUgTUNTUl9EQ0ZQCTB4MDEwMDAwMDAJLyogRC1DYWNoZSBGbHVzaCBQYXJpdHkgRXJyb3IgKi8KKyNkZWZpbmUgTUNTUl9JTVBFCTB4MDA4MDAwMDAJLyogSW1wcmVjaXNlIE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uICovCisjZW5kaWYKICNkZWZpbmUgRVNSX1NUICAgICAgICAgIDB4MDA4MDAwMDAgICAgICAvKiBTdG9yZSBPcGVyYXRpb24gKi8KIAogI2lmIGRlZmluZWQoQ09ORklHX01QQzg2eHgpCi0jZGVmaW5lIFNQUk5fTVNTQ1JPCTB4M2Y2CisjZGVmaW5lIFNQUk5fTVNTQ1IwCTB4M2Y2CisjZGVmaW5lIFNQUk5fTVNTU1IwCTB4M2Y3CiAjZW5kaWYKIAogCkBAIC00ODQsMTcgKzQ5NSwxNyBAQAogI2RlZmluZSBEQkNSMAlTUFJOX0RCQ1IwCS8qIERlYnVnIENvbnRyb2wgUmVnaXN0ZXIgMCAqLwogI2RlZmluZSBEQkNSMQlTUFJOX0RCQ1IxCS8qIERlYnVnIENvbnRyb2wgUmVnaXN0ZXIgMSAqLwogI2RlZmluZSBEQlNSCVNQUk5fREJTUgkvKiBEZWJ1ZyBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgRENNUAlTUFJOX0RDTVAgICAgICAJLyogRGF0YSBUTEIgQ29tcGFyZSBSZWdpc3RlciAqLwotI2RlZmluZSBERUMJU1BSTl9ERUMgICAgICAgCS8qIERlY3JlbWVudCBSZWdpc3RlciAqLwotI2RlZmluZSBETUlTUwlTUFJOX0RNSVNTICAgICAJLyogRGF0YSBUTEIgTWlzcyBSZWdpc3RlciAqLworI2RlZmluZSBEQ01QCVNQUk5fRENNUAkvKiBEYXRhIFRMQiBDb21wYXJlIFJlZ2lzdGVyICovCisjZGVmaW5lIERFQwlTUFJOX0RFQwkvKiBEZWNyZW1lbnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1JU1MJU1BSTl9ETUlTUwkvKiBEYXRhIFRMQiBNaXNzIFJlZ2lzdGVyICovCiAjZGVmaW5lIERTSVNSCVNQUk5fRFNJU1IJLyogRGF0YSBTdG9yYWdlIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgRUFSCVNQUk5fRUFSICAgICAgIAkvKiBFeHRlcm5hbCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lIEVBUglTUFJOX0VBUgkvKiBFeHRlcm5hbCBBZGRyZXNzIFJlZ2lzdGVyICovCiAjZGVmaW5lIEVTUglTUFJOX0VTUgkvKiBFeGNlcHRpb24gU3luZHJvbWUgUmVnaXN0ZXIgKi8KICNkZWZpbmUgSEFTSDEJU1BSTl9IQVNIMQkvKiBQcmltYXJ5IEhhc2ggQWRkcmVzcyBSZWdpc3RlciAqLwogI2RlZmluZSBIQVNIMglTUFJOX0hBU0gyCS8qIFNlY29uZGFyeSBIYXNoIEFkZHJlc3MgUmVnaXN0ZXIgKi8KICNkZWZpbmUgSElEMAlTUFJOX0hJRDAJLyogSGFyZHdhcmUgSW1wbGVtZW50YXRpb24gUmVnaXN0ZXIgMCAqLwogI2RlZmluZSBISUQxCVNQUk5fSElEMQkvKiBIYXJkd2FyZSBJbXBsZW1lbnRhdGlvbiBSZWdpc3RlciAxICovCi0jZGVmaW5lIElBQlIJU1BSTl9JQUJSICAgICAgCS8qIEluc3RydWN0aW9uIEFkZHJlc3MgQnJlYWtwb2ludCBSZWdpc3RlciAqLworI2RlZmluZSBJQUJSCVNQUk5fSUFCUgkvKiBJbnN0cnVjdGlvbiBBZGRyZXNzIEJyZWFrcG9pbnQgUmVnaXN0ZXIgKi8KICNkZWZpbmUgSUFDMQlTUFJOX0lBQzEJLyogSW5zdHJ1Y3Rpb24gQWRkcmVzcyBSZWdpc3RlciAxICovCiAjZGVmaW5lIElBQzIJU1BSTl9JQUMyCS8qIEluc3RydWN0aW9uIEFkZHJlc3MgUmVnaXN0ZXIgMiAqLwogI2RlZmluZSBJQkFUMEwJU1BSTl9JQkFUMEwJLyogSW5zdHJ1Y3Rpb24gQkFUIDAgTG93ZXIgUmVnaXN0ZXIgKi8KQEAgLTUxMSwxNyArNTIyLDE3IEBACiAjZGVmaW5lIElCQVQ1VQlTUFJOX0lCQVQ1VQkvKiBJbnN0cnVjdGlvbiBCQVQgNSBVcHBlciBSZWdpc3RlciAqLwogI2RlZmluZSBJQkFUNkwJU1BSTl9JQkFUNkwJLyogSW5zdHJ1Y3Rpb24gQkFUIDYgTG93ZXIgUmVnaXN0ZXIgKi8KICNkZWZpbmUgSUJBVDZVCVNQUk5fSUJBVDZVCS8qIEluc3RydWN0aW9uIEJBVCA2IFVwcGVyIFJlZ2lzdGVyICovCi0jZGVmaW5lIElCQVQ3TCAJU1BSTl9JQkFUN0wJLyogSW5zdHJ1Y3Rpb24gQkFUIDcgTG93ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUJBVDdMCVNQUk5fSUJBVDdMCS8qIEluc3RydWN0aW9uIEJBVCA3IExvd2VyIFJlZ2lzdGVyICovCiAjZGVmaW5lIElCQVQ3VQlTUFJOX0lCQVQ3VQkvKiBJbnN0cnVjdGlvbiBCQVQgNyBMb3dlciBSZWdpc3RlciAqLwogI2RlZmluZSBJQ01QCVNQUk5fSUNNUAkvKiBJbnN0cnVjdGlvbiBUTEIgQ29tcGFyZSBSZWdpc3RlciAqLwogI2RlZmluZSBJTUlTUwlTUFJOX0lNSVNTCS8qIEluc3RydWN0aW9uIFRMQiBNaXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lIElNTVIJU1BSTl9JTU1SICAgICAgCS8qIFBQQyA4NjAvODIxIEludGVybmFsIE1lbW9yeSBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSU1NUglTUFJOX0lNTVIJLyogUFBDIDg2MC84MjEgSW50ZXJuYWwgTWVtb3J5IE1hcCBSZWdpc3RlciAqLwogI2RlZmluZSBMRFNUQ1IJU1BSTl9MRFNUQ1IgICAgIC8qIExvYWQvU3RvcmUgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBMMkNSCVNQUk5fTDJDUiAgICAJLyogUFBDIDc1MCBMMiBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIEwyQ1IJU1BSTl9MMkNSCS8qIFBQQyA3NTAgTDIgY29udHJvbCByZWdpc3RlciAqLwogI2RlZmluZSBMUglTUFJOX0xSCiAjZGVmaW5lIE1CQVIgICAgU1BSTl9NQkFSICAgICAgIC8qIFN5c3RlbSBtZW1vcnkgYmFzZSBhZGRyZXNzICovCiAjaWYgZGVmaW5lZChDT05GSUdfTVBDODZ4eCkKLSNkZWZpbmUgTVNTQ1IwCVNQUk5fTVNTQ1JPCisjZGVmaW5lIE1TU0NSMAlTUFJOX01TU0NSMAogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfRTUwMCkgfHwgZGVmaW5lZChDT05GSUdfTVBDODZ4eCkKICNkZWZpbmUgUElSCVNQUk5fUElSCkBAIC01MjksNyArNTQwLDcgQEAKICNkZWZpbmUgU1ZSCVNQUk5fU1ZSCS8qIFN5c3RlbS1Pbi1DaGlwIFZlcnNpb24gUmVnaXN0ZXIgKi8KICNkZWZpbmUgUFZSCVNQUk5fUFZSCS8qIFByb2Nlc3NvciBWZXJzaW9uICovCiAjZGVmaW5lIFJQQQlTUFJOX1JQQQkvKiBSZXF1aXJlZCBQaHlzaWNhbCBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNEUjEJU1BSTl9TRFIxICAgICAgCS8qIE1NVSBoYXNoIGJhc2UgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0RSMQlTUFJOX1NEUjEJLyogTU1VIGhhc2ggYmFzZSByZWdpc3RlciAqLwogI2RlZmluZSBTUFIwCVNQUk5fU1BSRzAJLyogU3VwZXJ2aXNvciBQcml2YXRlIFJlZ2lzdGVycyAqLwogI2RlZmluZSBTUFIxCVNQUk5fU1BSRzEKICNkZWZpbmUgU1BSMglTUFJOX1NQUkcyCkBAIC01NDQsNiArNTU1LDggQEAKICNkZWZpbmUgU1BSRzcgICBTUFJOX1NQUkc3CiAjZGVmaW5lIFNSUjAJU1BSTl9TUlIwCS8qIFNhdmUgYW5kIFJlc3RvcmUgUmVnaXN0ZXIgMCAqLwogI2RlZmluZSBTUlIxCVNQUk5fU1JSMQkvKiBTYXZlIGFuZCBSZXN0b3JlIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgU1JSMglTUFJOX1NSUjIJLyogU2F2ZSBhbmQgUmVzdG9yZSBSZWdpc3RlciAyICovCisjZGVmaW5lIFNSUjMJU1BSTl9TUlIzCS8qIFNhdmUgYW5kIFJlc3RvcmUgUmVnaXN0ZXIgMyAqLwogI2RlZmluZSBTVlIJU1BSTl9TVlIJLyogU3lzdGVtIFZlcnNpb24gUmVnaXN0ZXIgKi8KICNkZWZpbmUgVEJSTAlTUFJOX1RCUkwJLyogVGltZSBCYXNlIFJlYWQgTG93ZXIgUmVnaXN0ZXIgKi8KICNkZWZpbmUgVEJSVQlTUFJOX1RCUlUJLyogVGltZSBCYXNlIFJlYWQgVXBwZXIgUmVnaXN0ZXIgKi8KQEAgLTU5OCw3ICs2MTEsNyBAQAogI2RlZmluZSBJVk9SMzUJU1BSTl9JVk9SMzUKICNkZWZpbmUgTUNTUlIwCVNQUk5fTUNTUlIwCiAjZGVmaW5lIE1DU1JSMQlTUFJOX01DU1JSMQotI2RlZmluZSBMMUNTUjAgCVNQUk5fTDFDU1IwCisjZGVmaW5lIEwxQ1NSMAlTUFJOX0wxQ1NSMAogI2RlZmluZSBMMUNTUjEJU1BSTl9MMUNTUjEKICNkZWZpbmUgTUNTUglTUFJOX01DU1IKICNkZWZpbmUgTU1VQ1NSMAlTUFJOX01NVUNTUjAKQEAgLTYwNyw3ICs2MjAsNyBAQAogI2RlZmluZSBQSUQxCVNQUk5fUElEMQogI2RlZmluZSBQSUQyCVNQUk5fUElEMgogI2RlZmluZSBNQVMwCVNQUk5fTUFTMAotI2RlZmluZSBNQVMxIAlTUFJOX01BUzEKKyNkZWZpbmUgTUFTMQlTUFJOX01BUzEKICNkZWZpbmUgTUFTMglTUFJOX01BUzIKICNkZWZpbmUgTUFTMwlTUFJOX01BUzMKICNkZWZpbmUgTUFTNAlTUFJOX01BUzQKQEAgLTYxNSwxMSArNjI4LDE3IEBACiAjZGVmaW5lIE1BUzYJU1BSTl9NQVM2CiAjZGVmaW5lIE1BUzcJU1BSTl9NQVM3CiAKKyNpZiBkZWZpbmVkKENPTkZJR180eHgpIHx8IGRlZmluZWQoQ09ORklHXzQ0eCkgfHwgZGVmaW5lZChDT05GSUdfTVBDODV4eCkKKyNkZWZpbmUgREFSX0RFQVIgREVBUgorI2Vsc2UKKyNkZWZpbmUgREFSX0RFQVIgREFSCisjZW5kaWYKKwogLyogRGV2aWNlIENvbnRyb2wgUmVnaXN0ZXJzICovCiAKICNkZWZpbmUgRENSTl9CRUFSCTB4MDkwCS8qIEJ1cyBFcnJvciBBZGRyZXNzIFJlZ2lzdGVyICovCiAjZGVmaW5lIERDUk5fQkVTUgkweDA5MQkvKiBCdXMgRXJyb3IgU3luZHJvbWUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICBCRVNSX0RTRVMgICAgCTB4ODAwMDAwMDAJLyogRGF0YS1TaWRlIEVycm9yIFN0YXR1cyAqLworI2RlZmluZSAgIEJFU1JfRFNFUwkweDgwMDAwMDAwCS8qIERhdGEtU2lkZSBFcnJvciBTdGF0dXMgKi8KICNkZWZpbmUgICBCRVNSX0RNRVMJMHg0MDAwMDAwMAkvKiBETUEgRXJyb3IgU3RhdHVzICovCiAjZGVmaW5lICAgQkVTUl9SV1MJMHgyMDAwMDAwMAkvKiBSZWFkL1dyaXRlIFN0YXR1cyAqLwogI2RlZmluZSAgIEJFU1JfRVRNQVNLCTB4MUMwMDAwMDAJLyogRXJyb3IgVHlwZSAqLwpAQCAtNjc2LDggKzY5NSw4IEBACiAjZGVmaW5lICAgSU9DUl9FM0xQCTB4MDEwMDAwMDAKICNkZWZpbmUgICBJT0NSX0U0VEUJMHgwMDgwMDAwMAogI2RlZmluZSAgIElPQ1JfRTRMUAkweDAwNDAwMDAwCi0jZGVmaW5lICAgSU9DUl9FRFQgICAgIAkweDAwMDgwMDAwCi0jZGVmaW5lICAgSU9DUl9TT1IgICAgIAkweDAwMDQwMDAwCisjZGVmaW5lICAgSU9DUl9FRFQJMHgwMDA4MDAwMAorI2RlZmluZSAgIElPQ1JfU09SCTB4MDAwNDAwMDAKICNkZWZpbmUgICBJT0NSX0VETwkweDAwMDA4MDAwCiAjZGVmaW5lICAgSU9DUl8yWEMJMHgwMDAwNDAwMAogI2RlZmluZSAgIElPQ1JfQVRDCTB4MDAwMDIwMDAKQEAgLTgwMiw3ICs4MjEsNyBAQAogI2RlZmluZSBQVlJfODIzCQlQVlJfODIxCiAjZGVmaW5lIFBWUl84NTAJCVBWUl84MjEKICNkZWZpbmUgUFZSXzg2MAkJUFZSXzgyMQotI2RlZmluZSBQVlJfNzQwMCAgICAgICAJMHgwMDBDMDAwMAorI2RlZmluZSBQVlJfNzQwMAkweDAwMEMwMDAwCiAjZGVmaW5lIFBWUl84MjQwCTB4MDA4MTAxMDAKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXRhLmggYi9pbmNsdWRlL2F0YS5oCmluZGV4IDg1ODQyMjYuLmFhNmU5MGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXRhLmgKKysrIGIvaW5jbHVkZS9hdGEuaApAQCAtODMsNiArODMsNjYgQEAKICNkZWZpbmUgQVRBX0RFVklDRSh4KQkoKHggJiAxKTw8NCkKICNkZWZpbmUgQVRBX0xCQQkJMHhFMAogCitlbnVtIHsKKwlBVEFfTUFYX0RFVklDRVMgPSAxLAkvKiBwZXIgYnVzL3BvcnQgKi8KKwlBVEFfTUFYX1BSRCA9IDI1NiwJLyogd2UgY291bGQgbWFrZSB0aGVzZSAyNTYvMjU2ICovCisJQVRBX1NFQ1RfU0laRSA9IDI1NiwJLyoyNTYgd29yZHMgcGVyIHNlY3RvciAqLworCisJLyogYml0cyBpbiBBVEEgY29tbWFuZCBibG9jayByZWdpc3RlcnMgKi8KKwlBVEFfSE9CID0gKDEgPDwgNyksCS8qIExCQTQ4IHNlbGVjdG9yICovCisJQVRBX05JRU4gPSAoMSA8PCAxKSwJLyogZGlzYWJsZS1pcnEgZmxhZyAqLworCS8qQVRBX0xCQSAgICAgICAgICAgICAgICAgPSAoMSA8PCA2KSwgKi8gLyogTEJBMjggc2VsZWN0b3IgKi8KKwlBVEFfREVWMSA9ICgxIDw8IDQpLAkvKiBTZWxlY3QgRGV2aWNlIDEgKHNsYXZlKSAqLworCUFUQV9ERVZJQ0VfT0JTID0gKDEgPDwgNykgfCAoMSA8PCA1KSwJLyogb2JzIGJpdHMgaW4gZGV2IHJlZyAqLworCUFUQV9ERVZDVExfT0JTID0gKDEgPDwgMyksCS8qIG9ic29sZXRlIGJpdCBpbiBkZXZjdGwgcmVnICovCisJQVRBX0JVU1kgPSAoMSA8PCA3KSwJLyogQlNZIHN0YXR1cyBiaXQgKi8KKwlBVEFfRFJEWSA9ICgxIDw8IDYpLAkvKiBkZXZpY2UgcmVhZHkgKi8KKwlBVEFfREYgPSAoMSA8PCA1KSwJLyogZGV2aWNlIGZhdWx0ICovCisJQVRBX0RSUSA9ICgxIDw8IDMpLAkvKiBkYXRhIHJlcXVlc3QgaS9vICovCisJQVRBX0VSUiA9ICgxIDw8IDApLAkvKiBoYXZlIGFuIGVycm9yICovCisJQVRBX1NSU1QgPSAoMSA8PCAyKSwJLyogc29mdHdhcmUgcmVzZXQgKi8KKwlBVEFfQUJPUlRFRCA9ICgxIDw8IDIpLAkvKiBjb21tYW5kIGFib3J0ZWQgKi8KKwkvKiBBVEEgY29tbWFuZCBibG9jayByZWdpc3RlcnMgKi8KKwlBVEFfUkVHX0RBVEEgPSAweDAwLAorCUFUQV9SRUdfRVJSID0gMHgwMSwKKwlBVEFfUkVHX05TRUNUID0gMHgwMiwKKwlBVEFfUkVHX0xCQUwgPSAweDAzLAorCUFUQV9SRUdfTEJBTSA9IDB4MDQsCisJQVRBX1JFR19MQkFIID0gMHgwNSwKKwlBVEFfUkVHX0RFVklDRSA9IDB4MDYsCisJQVRBX1JFR19TVEFUVVMgPSAweDA3LAorCUFUQV9QQ0lfQ1RMX09GUyA9IDB4MDIsCisJLyogYW5kIHRoZWlyIGFsaWFzZXMgKi8KKwlBVEFfUkVHX0ZFQVRVUkUgPSBBVEFfUkVHX0VSUiwKKwlBVEFfUkVHX0NNRCA9IEFUQV9SRUdfU1RBVFVTLAorCUFUQV9SRUdfQllURUwgPSBBVEFfUkVHX0xCQU0sCisJQVRBX1JFR19CWVRFSCA9IEFUQV9SRUdfTEJBSCwKKwlBVEFfUkVHX0RFVlNFTCA9IEFUQV9SRUdfREVWSUNFLAorCUFUQV9SRUdfSVJRID0gQVRBX1JFR19OU0VDVCwKKworCS8qIFNFVEZFQVRVUkVTIHN0dWZmICovCisJU0VURkVBVFVSRVNfWEZFUiA9IDB4MDMsCisJWEZFUl9VRE1BXzcgPSAweDQ3LAorCVhGRVJfVURNQV82ID0gMHg0NiwKKwlYRkVSX1VETUFfNSA9IDB4NDUsCisJWEZFUl9VRE1BXzQgPSAweDQ0LAorCVhGRVJfVURNQV8zID0gMHg0MywKKwlYRkVSX1VETUFfMiA9IDB4NDIsCisJWEZFUl9VRE1BXzEgPSAweDQxLAorCVhGRVJfVURNQV8wID0gMHg0MCwKKwlYRkVSX01XX0RNQV8yID0gMHgyMiwKKwlYRkVSX01XX0RNQV8xID0gMHgyMSwKKwlYRkVSX01XX0RNQV8wID0gMHgyMCwKKwlYRkVSX1BJT180ID0gMHgwQywKKwlYRkVSX1BJT18zID0gMHgwQiwKKwlYRkVSX1BJT18yID0gMHgwQSwKKwlYRkVSX1BJT18xID0gMHgwOSwKKwlYRkVSX1BJT18wID0gMHgwOCwKKwlYRkVSX1NXX0RNQV8yID0gMHgxMiwKKwlYRkVSX1NXX0RNQV8xID0gMHgxMSwKKwlYRkVSX1NXX0RNQV8wID0gMHgxMCwKKwlYRkVSX1BJT19TTE9XID0gMHgwMAorfTsKIC8qCiAgKiBBVEEgQ29tbWFuZHMgKG9ubHkgbWFuZGF0b3J5IGNvbW1hbmRzIGxpc3RlZCBoZXJlKQogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NtZF9jb25mZGVmcy5oIGIvaW5jbHVkZS9jbWRfY29uZmRlZnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNjY2RjZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NtZF9jb25mZGVmcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMgotICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KLSAqCi0gKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwotICogcHJvamVjdC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICogTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi0vKgotICogRGVmaW5pdGlvbnMgZm9yIENvbmZpZ3VyaW5nIHRoZSBtb25pdG9yIGNvbW1hbmRzCi0gKi8KLSNpZm5kZWYgX0NNRF9DT05GSUdfSAotI2RlZmluZSBfQ01EX0NPTkZJR19ICi0KLS8qCi0gKiBDb25maWd1cmFibGUgbW9uaXRvciBjb21tYW5kcwotICovCi0jZGVmaW5lIENGR19DTURfQkRJCQkweDAwMDAwMDAxVUxMCS8qIGJkaW5mbwkJCSovCi0jZGVmaW5lIENGR19DTURfTE9BRFMJCTB4MDAwMDAwMDJVTEwJLyogbG9hZHMJCQkqLwotI2RlZmluZSBDRkdfQ01EX0xPQURCCQkweDAwMDAwMDA0VUxMCS8qIGxvYWRiCQkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9JTUkJCTB4MDAwMDAwMDhVTEwJLyogaW1pbmZvCQkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9DQUNIRQkJMHgwMDAwMDAxMFVMTAkvKiBpY2FjaGUsIGRjYWNoZQkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9GTEFTSAkJMHgwMDAwMDAyMFVMTAkvKiBmbGluZm8sIGVyYXNlLCBwcm90ZWN0CSovCi0jZGVmaW5lIENGR19DTURfTUVNT1JZCQkweDAwMDAwMDQwVUxMCS8qIG1kLCBtbSwgbm0sIG13LCBjcCwgY21wLAkqLwotCQkJCQkJLyogY3JjLCBiYXNlLCBsb29wLCBtdGVzdAkqLwotI2RlZmluZSBDRkdfQ01EX05FVAkJMHgwMDAwMDA4MFVMTAkvKiBib290cCwgdGZ0cGJvb3QsIHJhcnBib290CSovCi0jZGVmaW5lIENGR19DTURfRU5WCQkweDAwMDAwMTAwVUxMCS8qIHNhdmVlbnYJCQkqLwotI2RlZmluZSBDRkdfQ01EX0tHREIJCTB4MDAwMDAwMDAwMDAwMDIwMFVMTAkvKiBrZ2RiCQkJCSovCi0jZGVmaW5lIENGR19DTURfUENNQ0lBCQkweDAwMDAwNDAwVUxMCS8qIFBDTUNJQSBzdXBwb3J0CQkqLwotI2RlZmluZSBDRkdfQ01EX0lERQkJMHgwMDAwMDgwMFVMTAkvKiBJREUgaGFyZGRpc2sgc3VwcG9ydAkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9QQ0kJCTB4MDAwMDEwMDBVTEwJLyogcGNpaW5mbwkJCSovCi0jZGVmaW5lIENGR19DTURfSVJRCQkweDAwMDAyMDAwVUxMCS8qIGlycWluZm8JCQkqLwotI2RlZmluZSBDRkdfQ01EX0JPT1RECQkweDAwMDA0MDAwVUxMCS8qIGJvb3RkCQkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9DT05TT0xFCQkweDAwMDA4MDAwVUxMCS8qIGNvbmluZm8JCQkqLwotI2RlZmluZSBDRkdfQ01EX0VFUFJPTQkJMHgwMDAxMDAwMFVMTAkvKiBFRVBST00gcmVhZC93cml0ZSBzdXBwb3J0CSovCi0jZGVmaW5lIENGR19DTURfQVNLRU5WCQkweDAwMDIwMDAwVUxMCS8qIGFzayBmb3IgZW52IHZhcmlhYmxlCQkqLwotI2RlZmluZSBDRkdfQ01EX1JVTgkJMHgwMDA0MDAwMFVMTAkvKiBydW4gY29tbWFuZCBpbiBlbnYgdmFyaWFibGUJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9FQ0hPCQkweDAwMDgwMDAwVUxMCS8qIGVjaG8gYXJndW1lbnRzCQkqLwotI2RlZmluZSBDRkdfQ01EX0kyQwkJMHgwMDEwMDAwMFVMTAkvKiBJMkMgc2VyaWFsIGJ1cyBzdXBwb3J0CSovCi0jZGVmaW5lIENGR19DTURfUkVHSU5GTwkJMHgwMDIwMDAwMFVMTAkvKiBSZWdpc3RlciBkdW1wCQkqLwotI2RlZmluZSBDRkdfQ01EX0lNTUFQCQkweDAwNDAwMDAwVUxMCS8qIElNTVIgZHVtcCBzdXBwb3J0CQkqLwotI2RlZmluZSBDRkdfQ01EX0RBVEUJCTB4MDA4MDAwMDBVTEwJLyogc3VwcG9ydCBmb3IgUlRDLCBkYXRlL3RpbWUuLi4qLwotI2RlZmluZSBDRkdfQ01EX0RIQ1AJCTB4MDEwMDAwMDBVTEwJLyogREhDUCBTdXBwb3J0CQkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9CRURCVUcJCTB4MDIwMDAwMDBVTEwJLyogSW5jbHVkZSBCZWRCdWcgRGVidWdnZXIJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9GREMJCTB4MDQwMDAwMDBVTEwJLyogRmxvcHB5IERpc2sgU3VwcG9ydAkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9TQ1NJCQkweDA4MDAwMDAwVUxMCS8qIFNDU0kgU3VwcG9ydAkJCSovCi0jZGVmaW5lIENGR19DTURfQVVUT1NDUklQVAkweDEwMDAwMDAwVUxMCS8qIEF1dG9zY3JpcHQgU3VwcG9ydAkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9NSUkJCTB4MjAwMDAwMDBVTEwJLyogTUlJIHN1cHBvcnQJCQkqLwotI2RlZmluZSBDRkdfQ01EX1NFVEdFVERDUgkweDQwMDAwMDAwVUxMCS8qIERDUiBzdXBwb3J0IG9uIDR4eAkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9CU1AJCTB4ODAwMDAwMDBVTEwJLyogQm9hcmQgU3BlY2lmaWMgZnVuY3Rpb25zCSovCi0KLSNkZWZpbmUgQ0ZHX0NNRF9FTEYJMHgwMDAwMDAwMTAwMDAwMDAwVUxMCS8qIEVMRiAoVnhXb3JrcykgbG9hZC9ib290IGNtZAkqLwotI2RlZmluZSBDRkdfQ01EX01JU0MJMHgwMDAwMDAwMjAwMDAwMDAwVUxMCS8qIE1pc2MgZnVuY3Rpb25zIGxpa2Ugc2xlZXAgZXRjKi8KLSNkZWZpbmUgQ0ZHX0NNRF9VU0IJMHgwMDAwMDAwNDAwMDAwMDAwVUxMCS8qIFVTQiBTdXBwb3J0CQkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9ET0MJMHgwMDAwMDAwODAwMDAwMDAwVUxMCS8qIERpc2stT24tQ2hpcCBTdXBwb3J0CQkqLwotI2RlZmluZSBDRkdfQ01EX0pGRlMyCTB4MDAwMDAwMTAwMDAwMDAwMFVMTAkvKiBKRkZTMiBTdXBwb3J0CQkqLwotI2RlZmluZSBDRkdfQ01EX0RUVAkweDAwMDAwMDIwMDAwMDAwMDBVTEwJLyogRGlnaXRhbCBUaGVybSBhbmQgVGhlcm1vc3RhdCAqLwotI2RlZmluZSBDRkdfQ01EX1NEUkFNCTB4MDAwMDAwNDAwMDAwMDAwMFVMTAkvKiBTRFJBTSBESU1NIFNQRCBpbmZvIHByaW50b3V0ICovCi0jZGVmaW5lIENGR19DTURfRElBRwkweDAwMDAwMDgwMDAwMDAwMDBVTEwJLyogRGlhZ25vc3RpY3MJCQkqLwotI2RlZmluZSBDRkdfQ01EX0ZQR0EJMHgwMDAwMDEwMDAwMDAwMDAwVUxMCS8qIEZQR0EgY29uZmlndXJhdGlvbiBTdXBwb3J0CSovCi0jZGVmaW5lIENGR19DTURfSFdGTE9XCTB4MDAwMDAyMDAwMDAwMDAwMFVMTAkvKiBSVFMvQ1RTIGh3IGZsb3cgY29udHJvbAkqLwotI2RlZmluZSBDRkdfQ01EX1NBVkVTCTB4MDAwMDA0MDAwMDAwMDAwMFVMTAkvKiBzYXZlIFMgcmVjb3JkIGR1bXAJCSovCi0jZGVmaW5lIENGR19DTURfU1BJCTB4MDAwMDEwMDAwMDAwMDAwMFVMTAkvKiBTUEkgdXRpbGl0eQkJCSovCi0jZGVmaW5lIENGR19DTURfRkRPUwkweDAwMDAyMDAwMDAwMDAwMDBVTEwJLyogRmxvcHB5IERPUyBzdXBwb3J0CQkqLwotI2RlZmluZSBDRkdfQ01EX1ZGRAkweDAwMDA0MDAwMDAwMDAwMDBVTEwJLyogVkZEIHN1cHBvcnQgKFRSQUIpCQkqLwotI2RlZmluZSBDRkdfQ01EX05BTkQJMHgwMDAwODAwMDAwMDAwMDAwVUxMCS8qIE5BTkQgc3VwcG9ydAkJCSovCi0jZGVmaW5lIENGR19DTURfQk1QCTB4MDAwMTAwMDAwMDAwMDAwMFVMTAkvKiBCTVAgc3VwcG9ydAkJCSovCi0jZGVmaW5lIENGR19DTURfUE9SVElPCTB4MDAwMjAwMDAwMDAwMDAwMFVMTAkvKiBQb3J0IEkvTwkJCSovCi0jZGVmaW5lIENGR19DTURfUElORwkweDAwMDQwMDAwMDAwMDAwMDBVTEwJLyogcGluZyBzdXBwb3J0CQkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9NTUMJMHgwMDA4MDAwMDAwMDAwMDAwVUxMCS8qIE1NQyBzdXBwb3J0CQkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9GQVQJMHgwMDEwMDAwMDAwMDAwMDAwVUxMCS8qIEZBVCBzdXBwb3J0CQkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9JTUxTCTB4MDAyMDAwMDAwMDAwMDAwMFVMTAkvKiBMaXN0IGFsbCBmb3VuZCBpbWFnZXMJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9JVEVTVAkweDAwNDAwMDAwMDAwMDAwMDBVTEwJLyogSW50ZWdlciAoYW5kIHN0cmluZykgdGVzdAkqLwotI2RlZmluZSBDRkdfQ01EX05GUwkweDAwODAwMDAwMDAwMDAwMDBVTEwJLyogTkZTIHN1cHBvcnQJCQkqLwotI2RlZmluZSBDRkdfQ01EX1JFSVNFUgkweDAxMDAwMDAwMDAwMDAwMDBVTEwJLyogUmVpc2VyZnMgc3VwcG9ydAkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9DRFAJMHgwMjAwMDAwMDAwMDAwMDAwVUxMCS8qIENpc2NvIERpc2NvdmVyeSBQcm90b2NvbCAJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9YSU1HCTB4MDQwMDAwMDAwMDAwMDAwMFVMTAkvKiBMb2FkIHBhcnQgb2YgTXVsdGkgSW1hZ2UJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9VTklWRVJTRSAweDA4MDAwMDAwMDAwMDAwMDBVTEwJLyogVHVuZHJhIFVuaXZlcnNlIFN1cHBvcnQgICAgICAqLwotI2RlZmluZSBDRkdfQ01EX0VYVDIJMHgxMDAwMDAwMDAwMDAwMDAwVUxMCS8qIEVYVDIgU3VwcG9ydAkJCSovCi0jZGVmaW5lIENGR19DTURfU05UUAkweDIwMDAwMDAwMDAwMDAwMDBVTEwJLyogU05UUCBzdXBwb3J0CQkJKi8KLSNkZWZpbmUgQ0ZHX0NNRF9ESVNQTEFZCTB4NDAwMDAwMDAwMDAwMDAwMFVMTAkvKiBEaXNwbGF5IHN1cHBvcnQJCSovCi0jZGVmaW5lIENGR19DTURfTUZTTAkweDgwMDAwMDAwMDAwMDAwMDBVTEwJLyogRlNMIHN1cHBvcnQgZm9yIE1pY3JvYmxhemUJKi8KLQotI2RlZmluZSBDRkdfQ01EX0FMTAkweEZGRkZGRkZGRkZGRkZGRkZVTEwJLyogQUxMIGNvbW1hbmRzCQkJKi8KLQotLyogQ29tbWFuZHMgdGhhdCBhcmUgY29uc2lkZXJlZCAibm9uLXN0YW5kYXJkIiBmb3Igc29tZSByZWFzb24KLSAqIChtZW1vcnkgaG9ncywgcmVxdWlyZXMgc3BlY2lhbCBoYXJkd2FyZSwgbm90IGZ1bGx5IHRlc3RlZCwgZXRjLikKLSAqLwotI2RlZmluZSBDRkdfQ01EX05PTlNURCAoQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQlDRkdfQ01EX0JFREJVRwl8IFwKLQkJCUNGR19DTURfQk1QCXwgXAotCQkJQ0ZHX0NNRF9CU1AJfCBcCi0JCQlDRkdfQ01EX0NBQ0hFCXwgXAotCQkJQ0ZHX0NNRF9DRFAJfCBcCi0JCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQlDRkdfQ01EX0RJQUcJfCBcCi0JCQlDRkdfQ01EX0RJU1BMQVkJfCBcCi0JCQlDRkdfQ01EX0RPQwl8IFwKLQkJCUNGR19DTURfRFRUCXwgXAotCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQlDRkdfQ01EX0VMRgl8IFwKLQkJCUNGR19DTURfRVhUMgl8IFwKLQkJCUNGR19DTURfRkRDCXwgXAotCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQlDRkdfQ01EX0ZET1MJfCBcCi0JCQlDRkdfQ01EX0hXRkxPVwl8IFwKLQkJCUNGR19DTURfSTJDCXwgXAotCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQlDRkdfQ01EX0lNTUFQCXwgXAotCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQlDRkdfQ01EX0pGRlMyCXwgXAotCQkJQ0ZHX0NNRF9LR0RCCXwgXAotCQkJQ0ZHX0NNRF9NRlNMCXwgXAotCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQlDRkdfQ01EX01NQwl8IFwKLQkJCUNGR19DTURfTkFORAl8IFwKLQkJCUNGR19DTURfUENJCXwgXAotCQkJQ0ZHX0NNRF9QQ01DSUEJfCBcCi0JCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQlDRkdfQ01EX1BPUlRJTwl8IFwKLQkJCUNGR19DTURfUkVHSU5GTyB8IFwKLQkJCUNGR19DTURfUkVJU0VSCXwgXAotCQkJQ0ZHX0NNRF9TQVZFUwl8IFwKLQkJCUNGR19DTURfU0NTSQl8IFwKLQkJCUNGR19DTURfU0RSQU0JfCBcCi0JCQlDRkdfQ01EX1NOVFAJfCBcCi0JCQlDRkdfQ01EX1NQSQl8IFwKLQkJCUNGR19DTURfVU5JVkVSU0UgfCBcCi0JCQlDRkdfQ01EX1VTQgl8IFwKLQkJCUNGR19DTURfVkZECSkKLQotLyogRGVmYXVsdCBjb25maWd1cmF0aW9uCi0gKi8KLSNkZWZpbmUgQ09ORklHX0NNRF9ERkwJKENGR19DTURfQUxMICYgfkNGR19DTURfTk9OU1REKQotCi0jaWZuZGVmIENPTkZJR19DT01NQU5EUwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgQ09ORklHX0NNRF9ERkwKLSNlbmRpZgotCi0KLS8qCi0gKiBvcHRpb25hbCBCT09UUCBmaWVsZHMKLSAqLwotCi0jZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCQkweDAwMDAwMDAxCi0jZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCQkweDAwMDAwMDAyCi0jZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQkJMHgwMDAwMDAwNAotI2RlZmluZSBDT05GSUdfQk9PVFBfTklTRE9NQUlOCQkweDAwMDAwMDA4Ci0jZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAkJMHgwMDAwMDAxMAotI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCTB4MDAwMDAwMjAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUwkJMHgwMDAwMDA0MAotI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TMgkJMHgwMDAwMDA4MAotI2RlZmluZSBDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRQkweDAwMDAwMTAwCi0jZGVmaW5lIENPTkZJR19CT09UUF9OVFBTRVJWRVIJCTB4MDAwMDAyMDAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX1RJTUVPRkZTRVQJCTB4MDAwMDA0MDAKLQotI2RlZmluZSBDT05GSUdfQk9PVFBfVkVORE9SRVgJCTB4ODAwMDAwMDAKLQotI2RlZmluZSBDT05GSUdfQk9PVFBfQUxMCQkofkNPTkZJR19CT09UUF9WRU5ET1JFWCkKLQotCi0jZGVmaW5lIENPTkZJR19CT09UUF9ERUZBVUxUCQkoQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sgfCBcCi0JCQkJCUNPTkZJR19CT09UUF9HQVRFV0FZCSB8IFwKLQkJCQkJQ09ORklHX0JPT1RQX0hPU1ROQU1FCSB8IFwKLQkJCQkJQ09ORklHX0JPT1RQX0JPT1RQQVRIKQotCi0jaWZuZGVmIENPTkZJR19CT09UUF9NQVNLCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCQlDT05GSUdfQk9PVFBfREVGQVVMVAotI2VuZGlmCi0KLSNlbmRpZgkvKiBfQ01EX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbW1hbmQuaCBiL2luY2x1ZGUvY29tbWFuZC5oCmluZGV4IGEyOTM2YWQuLjA1OTdjMTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29tbWFuZC5oCisrKyBiL2luY2x1ZGUvY29tbWFuZC5oCkBAIC04NCwxMiArODQsNiBAQAogI2RlZmluZSBDTURfRkxBR19SRVBFQVQJCTB4MDAwMQkvKiByZXBlYXQgbGFzdCBjb21tYW5kCQkqLwogI2RlZmluZSBDTURfRkxBR19CT09URAkJMHgwMDAyCS8qIGNvbW1hbmQgaXMgZnJvbSBib290ZAkqLwogCi0vKgotICogQ29uZmlndXJhYmxlIG1vbml0b3IgY29tbWFuZHMgZGVmaW5pdGlvbnMgaGF2ZSBiZWVuIG1vdmVkCi0gKiB0byBpbmNsdWRlL2NtZF9jb25mZGVmcy5oCi0gKi8KLQotCiAjZGVmaW5lIFN0cnVjdF9TZWN0aW9uICBfX2F0dHJpYnV0ZV9fICgodW51c2VkLHNlY3Rpb24gKCIudV9ib290X2NtZCIpKSkKIAogI2lmZGVmICBDRkdfTE9OR0hFTFAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29tbW9uLmggYi9pbmNsdWRlL2NvbW1vbi5oCmluZGV4IDNjNGIzN2IuLjI3YTY2MGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29tbW9uLmgKKysrIGIvaW5jbHVkZS9jb21tb24uaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwNAorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDcKICAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCiAgKgogICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKQEAgLTM4LDcgKzM4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaWYgZGVmaW5lZChDT05GSUdfUENJKSAmJiBkZWZpbmVkKENPTkZJR180NDApCisjaWYgZGVmaW5lZChDT05GSUdfUENJKSAmJiAoZGVmaW5lZChDT05GSUdfNHh4KSAmJiAhZGVmaW5lZChDT05GSUdfQVAxMDAwKSkKICNpbmNsdWRlIDxwY2kuaD4KICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHXzh4eCkKQEAgLTYzLDEwICs2MywxOSBAQAogI2VuZGlmCiAjZWxpZiBkZWZpbmVkKENPTkZJR181eHgpCiAjaW5jbHVkZSA8YXNtLzV4eF9pbW1hcC5oPgorI2RlZmluZSBDT05GSUdfUkVMT0NfRklYVVBfV09SS1MKICNlbGlmIGRlZmluZWQoQ09ORklHX01QQzV4eHgpCiAjaW5jbHVkZSA8bXBjNXh4eC5oPgorI2RlZmluZSBDT05GSUdfUkVMT0NfRklYVVBfV09SS1MKKyNlbGlmIGRlZmluZWQoQ09ORklHX01QQzUxMlgpCisjaW5jbHVkZSA8bXBjNTEyeC5oPgorI2luY2x1ZGUgPGFzbS9pbW1hcF81MTJ4Lmg+CisjZGVmaW5lIENPTkZJR19SRUxPQ19GSVhVUF9XT1JLUwogI2VsaWYgZGVmaW5lZChDT05GSUdfTVBDODIyMCkKICNpbmNsdWRlIDxhc20vaW1tYXBfODIyMC5oPgorI2RlZmluZSBDT05GSUdfUkVMT0NfRklYVVBfV09SS1MKKyNlbGlmIGRlZmluZWQoQ09ORklHXzgyNFgpCisjZGVmaW5lIENPTkZJR19SRUxPQ19GSVhVUF9XT1JLUwogI2VsaWYgZGVmaW5lZChDT05GSUdfODI2MCkKICNpZiAgIGRlZmluZWQoQ09ORklHX01QQzgyNDcpIFwKICAgIHx8IGRlZmluZWQoQ09ORklHX01QQzgyNDgpIFwKQEAgLTc4LDYgKzg3LDcgQEAKICNkZWZpbmUgQ09ORklHX01QQzgyNjAJMQogI2VuZGlmCiAjaW5jbHVkZSA8YXNtL2ltbWFwXzgyNjAuaD4KKyNkZWZpbmUgQ09ORklHX1JFTE9DX0ZJWFVQX1dPUktTCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTVBDODZ4eAogI2luY2x1ZGUgPG1wYzg2eHguaD4KQEAgLTkwLDYgKzEwMCw3IEBACiAjaWZkZWYgQ09ORklHX01QQzgzWFgKICNpbmNsdWRlIDxtcGM4M3h4Lmg+CiAjaW5jbHVkZSA8YXNtL2ltbWFwXzgzeHguaD4KKyNkZWZpbmUgQ09ORklHX1JFTE9DX0ZJWFVQX1dPUktTCiAjZW5kaWYKICNpZmRlZglDT05GSUdfNHh4CiAjaW5jbHVkZSA8cHBjNHh4Lmg+CkBAIC0yMzAsNiArMjQxLDkgQEAKIHZvaWQgaW5saW5lIHNldGVudiAgIChjaGFyICosIGNoYXIgKik7CiAjZWxzZQogdm9pZAlzZXRlbnYJICAgICAoY2hhciAqLCBjaGFyICopOworI2lmZGVmIENPTkZJR19IQVNfVUlECit2b2lkCWZvcmNlZW52ICAgICAoY2hhciAqLCBjaGFyICopOworI2VuZGlmCiAjZW5kaWYgLyogQ09ORklHX1BQQyAqLwogI2lmZGVmIENPTkZJR19BUk0KICMgaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KQEAgLTI0OCwxMCArMjYyLDExIEBACiB2b2lkCXBjaV9pbml0X2JvYXJkKHZvaWQpOwogdm9pZAlwY2lpbmZvCSAgICAgIChpbnQsIGludCk7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19QQ0kpICYmIGRlZmluZWQoQ09ORklHXzQ0MCkKLSMgICBpZiBkZWZpbmVkKENGR19QQ0lfUFJFX0lOSVQpCisjaWYgZGVmaW5lZChDT05GSUdfUENJKSAmJiAoZGVmaW5lZChDT05GSUdfNHh4KSAmJiAhZGVmaW5lZChDT05GSUdfQVAxMDAwKSkKICAgICBpbnQJICAgcGNpX3ByZV9pbml0CSAgICAgICAoc3RydWN0IHBjaV9jb250cm9sbGVyICogKTsKLSMgICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpICYmIGRlZmluZWQoQ09ORklHXzQ0MCkKICMgICBpZiBkZWZpbmVkKENGR19QQ0lfVEFSR0VUX0lOSVQpCiAJdm9pZAlwY2lfdGFyZ2V0X2luaXQJICAgICAoc3RydWN0IHBjaV9jb250cm9sbGVyICopOwogIyAgIGVuZGlmCkBAIC00NDcsNiArNDYyLDkgQEAKICNlbGlmIGRlZmluZWQoQ09ORklHX01QQzV4eHgpCiBpbnQJcHJ0X21wYzV4eHhfY2xrcyAodm9pZCk7CiAjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM1MTJ4KQoraW50CXBydF9tcGM1MTJ4eHhfY2xrcyAodm9pZCk7CisjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19NUEM4MjIwKQogaW50CXBydF9tcGM4MjIwX2Nsa3MgKHZvaWQpOwogI2VuZGlmCkBAIC01MTEsNiArNTI5LDggQEAKIGludAljcHVfaW5pdF9yICAgICh2b2lkKTsKICNpZiBkZWZpbmVkKENPTkZJR184MjYwKQogaW50CXBydF84MjYwX3JzciAgKHZvaWQpOworI2VsaWYgZGVmaW5lZChDT05GSUdfTVBDODNYWCkKK2ludAlwcnRfODN4eF9yc3IgICh2b2lkKTsKICNlbmRpZgogCiAvKiAkKENQVSkvaW50ZXJydXB0cy5jICovCkBAIC02MjUsOSArNjQ1LDEzIEBACiAKIGludAlwY21jaWFfaW5pdCAodm9pZCk7CiAKLSNpZmRlZiBDT05GSUdfU0hPV19CT09UX1BST0dSRVNTCi12b2lkCXNob3dfYm9vdF9wcm9ncmVzcyAoaW50IHN0YXR1cyk7CisjaWZkZWYgQ09ORklHX1NUQVRVU19MRUQKKyMgaW5jbHVkZSA8c3RhdHVzX2xlZC5oPgogI2VuZGlmCisvKgorICogQm9hcmQtc3BlY2lmaWMgUGxhdGZvcm0gY29kZSBjYW4gcmVpbXBsZW1lbnQgc2hvd19ib290X3Byb2dyZXNzICgpIGlmIG5lZWRlZAorICovCit2b2lkIGlubGluZSBzaG93X2Jvb3RfcHJvZ3Jlc3MgKGludCB2YWwpOwogCiAjaWZkZWYgQ09ORklHX0lOSVRfQ1JJVElDQUwKICNlcnJvciBDT05GSUdfSU5JVF9DUklUSUNBTCBpcyBkZXByZWNhdGVkIQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdfY21kX2FsbC5oIGIvaW5jbHVkZS9jb25maWdfY21kX2FsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ODAxYjUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvbmZpZ19jbWRfYWxsLmgKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIFZlcnNpb24gMi4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaWZuZGVmIF9DT05GSUdfQ01EX0FMTF9ICisjZGVmaW5lIF9DT05GSUdfQ01EX0FMTF9ICisKKy8qCisgKiBBbHBoYWJldGljYWwgbGlzdCBvZiBhbGwgcG9zc2libGUgY29tbWFuZHMuCisgKi8KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgkvKiBhc2sgZm9yIGVudiB2YXJpYWJsZQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9BVVRPU0NSSVBUCS8qIEF1dG9zY3JpcHQgU3VwcG9ydAkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9CREkJICAgICAgIAkvKiBiZGluZm8JCQkqLworI2RlZmluZSBDT05GSUdfQ01EX0JFREJVRwkvKiBJbmNsdWRlIEJlZEJ1ZyBEZWJ1Z2dlcgkqLworI2RlZmluZSBDT05GSUdfQ01EX0JNUAkJLyogQk1QIHN1cHBvcnQJCQkqLworI2RlZmluZSBDT05GSUdfQ01EX0JPT1RECS8qIGJvb3RkCQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AJCS8qIEJvYXJkIFNwZWNpZmljIGZ1bmN0aW9ucwkqLworI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCS8qIGljYWNoZSwgZGNhY2hlCQkqLworI2RlZmluZSBDT05GSUdfQ01EX0NEUAkJLyogQ2lzY28gRGlzY292ZXJ5IFByb3RvY29sIAkqLworI2RlZmluZSBDT05GSUdfQ01EX0NPTlNPTEUJLyogY29uaW5mbwkJCSovCisjZGVmaW5lIENPTkZJR19DTURfREFURQkJLyogc3VwcG9ydCBmb3IgUlRDLCBkYXRlL3RpbWUuLi4qLworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AJCS8qIERIQ1AgU3VwcG9ydAkJCSovCisjZGVmaW5lIENPTkZJR19DTURfRElBRwkJLyogRGlhZ25vc3RpY3MJCQkqLworI2RlZmluZSBDT05GSUdfQ01EX0RJU1BMQVkJLyogRGlzcGxheSBzdXBwb3J0CQkqLworI2RlZmluZSBDT05GSUdfQ01EX0RPQwkJLyogRGlzay1Pbi1DaGlwIFN1cHBvcnQJCSovCisjZGVmaW5lIENPTkZJR19DTURfRFRUCQkvKiBEaWdpdGFsIFRoZXJtIGFuZCBUaGVybW9zdGF0ICovCisjZGVmaW5lIENPTkZJR19DTURfRUNITwkJLyogZWNobyBhcmd1bWVudHMJCSovCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCS8qIEVFUFJPTSByZWFkL3dyaXRlIHN1cHBvcnQJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYJCS8qIEVMRiAoVnhXb3JrcykgbG9hZC9ib290IGNtZAkqLworI2RlZmluZSBDT05GSUdfQ01EX0VOVgkJLyogc2F2ZWVudgkJCSovCisjZGVmaW5lIENPTkZJR19DTURfRVhUMgkJLyogRVhUMiBTdXBwb3J0CQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQJCS8qIEZBVCBzdXBwb3J0CQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9GREMJCS8qIEZsb3BweSBEaXNrIFN1cHBvcnQJCSovCisjZGVmaW5lIENPTkZJR19DTURfRkRPUwkJLyogRmxvcHB5IERPUyBzdXBwb3J0CQkqLworI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICS8qIGZsaW5mbywgZXJhc2UsIHByb3RlY3QJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9GUEdBCQkvKiBGUEdBIGNvbmZpZ3VyYXRpb24gU3VwcG9ydAkqLworI2RlZmluZSBDT05GSUdfQ01EX0hXRkxPVwkvKiBSVFMvQ1RTIGh3IGZsb3cgY29udHJvbAkqLworI2RlZmluZSBDT05GSUdfQ01EX0kyQwkJLyogSTJDIHNlcmlhbCBidXMgc3VwcG9ydAkqLworI2RlZmluZSBDT05GSUdfQ01EX0lERQkJLyogSURFIGhhcmRkaXNrIHN1cHBvcnQJCSovCisjZGVmaW5lIENPTkZJR19DTURfSU1JCQkvKiBpbWluZm8JCQkqLworI2RlZmluZSBDT05GSUdfQ01EX0lNTFMJCS8qIExpc3QgYWxsIGZvdW5kIGltYWdlcwkqLworI2RlZmluZSBDT05GSUdfQ01EX0lNTUFQCS8qIElNTVIgZHVtcCBzdXBwb3J0CQkqLworI2RlZmluZSBDT05GSUdfQ01EX0lSUQkJLyogaXJxaW5mbwkJCSovCisjZGVmaW5lIENPTkZJR19DTURfSVRFU1QJLyogSW50ZWdlciAoYW5kIHN0cmluZykgdGVzdAkqLworI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCS8qIEpGRlMyIFN1cHBvcnQJCSovCisjZGVmaW5lIENPTkZJR19DTURfS0dEQgkJLyoga2dkYgkJCQkqLworI2RlZmluZSBDT05GSUdfQ01EX0xPQURCCS8qIGxvYWRiCQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEUwkvKiBsb2FkcwkJCSovCisjZGVmaW5lIENPTkZJR19DTURfTUVNT1JZCS8qIG1kIG1tIG5tIG13IGNwIGNtcCBjcmMgYmFzZSBsb29wIG10ZXN0ICovCisjZGVmaW5lIENPTkZJR19DTURfTUZTTAkJLyogRlNMIHN1cHBvcnQgZm9yIE1pY3JvYmxhemUJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkJCS8qIE1JSSBzdXBwb3J0CQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9NSVNDCQkvKiBNaXNjIGZ1bmN0aW9ucyBsaWtlIHNsZWVwIGV0YyovCisjZGVmaW5lIENPTkZJR19DTURfTU1DCQkvKiBNTUMgc3VwcG9ydAkJCSovCisjZGVmaW5lIENPTkZJR19DTURfTkFORAkJLyogTkFORCBzdXBwb3J0CQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQJCS8qIGJvb3RwLCB0ZnRwYm9vdCwgcmFycGJvb3QJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMJCS8qIE5GUyBzdXBwb3J0CQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kJCS8qIHBjaWluZm8JCQkqLworI2RlZmluZSBDT05GSUdfQ01EX1BDTUNJQQkvKiBQQ01DSUEgc3VwcG9ydAkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCQkvKiBwaW5nIHN1cHBvcnQJCQkqLworI2RlZmluZSBDT05GSUdfQ01EX1BPUlRJTwkvKiBQb3J0IEkvTwkJCSovCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTwkvKiBSZWdpc3RlciBkdW1wCQkqLworI2RlZmluZSBDT05GSUdfQ01EX1JFSVNFUgkvKiBSZWlzZXJmcyBzdXBwb3J0CQkqLworI2RlZmluZSBDT05GSUdfQ01EX1JVTgkJLyogcnVuIGNvbW1hbmQgaW4gZW52IHZhcmlhYmxlCSovCisjZGVmaW5lIENPTkZJR19DTURfU0FWRVMJLyogc2F2ZSBTIHJlY29yZCBkdW1wCQkqLworI2RlZmluZSBDT05GSUdfQ01EX1NDU0kJCS8qIFNDU0kgU3VwcG9ydAkJCSovCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0JLyogU0RSQU0gRElNTSBTUEQgaW5mbyBwcmludG91dCAqLworI2RlZmluZSBDT05GSUdfQ01EX1NFVEdFVERDUgkvKiBEQ1Igc3VwcG9ydCBvbiA0eHgJCSovCisjZGVmaW5lIENPTkZJR19DTURfU05UUAkJLyogU05UUCBzdXBwb3J0CQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9TUEkJCS8qIFNQSSB1dGlsaXR5CQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9VTklWRVJTRQkvKiBUdW5kcmEgVW5pdmVyc2UgU3VwcG9ydAkqLworI2RlZmluZSBDT05GSUdfQ01EX1VTQgkJLyogVVNCIFN1cHBvcnQJCQkqLworI2RlZmluZSBDT05GSUdfQ01EX1ZGRAkJLyogVkZEIHN1cHBvcnQgKFRSQUIpCQkqLworI2RlZmluZSBDT05GSUdfQ01EX1hJTUcJCS8qIExvYWQgcGFydCBvZiBNdWx0aSBJbWFnZQkqLworCisjZW5kaWYJLyogX0NPTkZJR19DTURfQUxMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlnX2NtZF9kZWZhdWx0LmggYi9pbmNsdWRlL2NvbmZpZ19jbWRfZGVmYXVsdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MWNmYzkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvbmZpZ19jbWRfZGVmYXVsdC5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBWZXJzaW9uIDIuIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2lmbmRlZiBfQ09ORklHX0NNRF9ERUZBVUxUX0gKKyNkZWZpbmUgX0NPTkZJR19DTURfREVGQVVMVF9ICisKKy8qCisgKiBBbHBoYWJldGljYWwgbGlzdCBvZiBhbGwgY29tbWFuZHMgdGhhdCBhcmUgY29uZmlndXJlZCBieSBkZWZhdWx0LgorICogVGhpcyBpcyBlc3NlbnRpYWxseSBhbGwgY29tbWFuZHMgbWludXMgdGhvc2UgdGhhdCBhcmUgY29uc2lkZXJlZAorICogIm5vbi1zdGFuZGFyZCIgZm9yIHNvbWUgcmVhc29uIChtZW1vcnkgaG9ncywgcmVxdWlyZXMgc3BlY2lhbAorICogaGFyZHdhcmUsIG5vdCBmdWxseSB0ZXN0ZWQsIGV0Yy4pLgorICovCisKKyNkZWZpbmUgQ09ORklHX0NNRF9BVVRPU0NSSVBUCS8qIEF1dG9zY3JpcHQgU3VwcG9ydAkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9CREkJICAgICAgIAkvKiBiZGluZm8JCQkqLworI2RlZmluZSBDT05GSUdfQ01EX0JPT1RECS8qIGJvb3RkCQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9DT05TT0xFCS8qIGNvbmluZm8JCQkqLworI2RlZmluZSBDT05GSUdfQ01EX0VDSE8JCS8qIGVjaG8gYXJndW1lbnRzCQkqLworI2RlZmluZSBDT05GSUdfQ01EX0VOVgkJLyogc2F2ZWVudgkJCSovCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gJLyogZmxpbmZvLCBlcmFzZSwgcHJvdGVjdAkqLworI2RlZmluZSBDT05GSUdfQ01EX0ZQR0EJCS8qIEZQR0EgY29uZmlndXJhdGlvbiBTdXBwb3J0CSovCisjZGVmaW5lIENPTkZJR19DTURfSU1JCQkvKiBpbWluZm8JCQkqLworI2RlZmluZSBDT05GSUdfQ01EX0lNTFMJCS8qIExpc3QgYWxsIGZvdW5kIGltYWdlcwkqLworI2RlZmluZSBDT05GSUdfQ01EX0lURVNUCS8qIEludGVnZXIgKGFuZCBzdHJpbmcpIHRlc3QJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEQgkvKiBsb2FkYgkJCSovCisjZGVmaW5lIENPTkZJR19DTURfTE9BRFMJLyogbG9hZHMJCQkqLworI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQkvKiBtZCBtbSBubSBtdyBjcCBjbXAgY3JjIGJhc2UgbG9vcCBtdGVzdCAqLworI2RlZmluZSBDT05GSUdfQ01EX01JU0MJCS8qIE1pc2MgZnVuY3Rpb25zIGxpa2Ugc2xlZXAgZXRjKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQJCS8qIGJvb3RwLCB0ZnRwYm9vdCwgcmFycGJvb3QJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMJCS8qIE5GUyBzdXBwb3J0CQkJKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9SVU4JCS8qIHJ1biBjb21tYW5kIGluIGVudiB2YXJpYWJsZQkqLworI2RlZmluZSBDT05GSUdfQ01EX1NFVEdFVERDUgkvKiBEQ1Igc3VwcG9ydCBvbiA0eHgJCSovCisjZGVmaW5lIENPTkZJR19DTURfWElNRwkJLyogTG9hZCBwYXJ0IG9mIE11bHRpIEltYWdlCSovCisKKyNlbmRpZgkvKiBfQ09ORklHX0NNRF9ERUZBVUxUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9BMzAwMC5oIGIvaW5jbHVkZS9jb25maWdzL0EzMDAwLmgKaW5kZXggY2E5NTkyYy4uMGE5YTFmZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0EzMDAwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0EzMDAwLmgKQEAgLTUyLDIzICs1MiwyMCBAQAogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJNQogCi0jaWYgMAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSggQ09ORklHX0NNRF9ERkwgfCBcCi0JCQkJICBDRkdfQ01EX0JFREJVRyB8IFwKLQkJCQkgIENGR19DTURfQlNQICAgIHwgXAotCQkJCSAgQ0ZHX0NNRF9FTEYgICAgfCBcCi0JCQkJICBDRkdfQ01EX0kyQyAJIHwgXAotCQkJCSAgQ0ZHX0NNRF9GTEFTSCB8IFwKLQkJCQkgIENGR19DTURfQkVEQlVHIHwgXAotCQkJCSAgQ0ZHX0NNRF9ORVQgICAgfCBcCi0JCQkJICBDRkdfQ01EX1BDSSApCi0jZW5kaWYKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSggQ09ORklHX0NNRF9ERkwgKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAJKi8KIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CiAKIAogLyoKQEAgLTMwOSw3ICszMDYsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0FEQ0lPUC5oIGIvaW5jbHVkZS9jb25maWdzL0FEQ0lPUC5oCmluZGV4IDgyMWVmZTUuLjQ2MzI5OTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9BRENJT1AuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQURDSU9QLmgKQEAgLTU5LDIxICs1OSwzMiBAQAogI2RlZmluZSBDT05GSUdfSVBBRERSCQkxMC4wLjE4LjIyMgogI2RlZmluZSBDT05GSUdfU0VSVkVSSVAJCTEwLjAuMTguMTkwCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTg1LDcgKzE5Niw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkyMDQ4CS8qIEZvciBQTFggSU9QNDgwCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBBTUNDIDQwMS80MDMgQ1BVcwkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQUROUEVTQzEuaCBiL2luY2x1ZGUvY29uZmlncy9BRE5QRVNDMS5oCmluZGV4IDJlZmNhMTAuLjc3OTM4YjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9BRE5QRVNDMS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9BRE5QRVNDMS5oCkBAIC00MDEsMTUgKzQwMSw4IEBACiAjZGVmaW5lCUNPTkZJR19SVENfRFMxMzA2CTEJLyogRGFsbGFzIDEzMDYgcmVhbCB0aW1lIGNsb2NrCSovCiAjZGVmaW5lIENGR19TUElfUlRDX0RFVklECTAJLyogICAgICAgIGFzIDFzdCBTUEkgZGV2aWNlCSovCiAKLSNkZWZpbmUJX19TUElfQ01EX09GRgkJMAkvKiBhbGxvdyBkZWZhdWx0IGNvbW1hbmRzOgkqLwotCQkJCQkvKglDRkdfQ01EX1NQSQkJKi8KLQkJCQkJLyoJQ0ZHX0NNRF9EQVRFCQkqLwotCiAjZWxzZQogI3VuZGVmCUNPTkZJR19OSU9TX1NQSQkJCQkvKiBOTyBTUEkgc3VwcG9ydAkqLwotI2RlZmluZQlfX1NQSV9DTURfT0ZGCSgJQ0ZHX0NNRF9TUEkJXAotCQkJfAlDRkdfQ01EX0RBVEUJXAotCQkJKQogI2VuZGlmCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC01NzAsNDUgKzU2Myw1NSBAQAogI2RlZmluZQlDT05GSUdfUE9TVAkJCUNGR19QT1NUX1JUQwogI2RlZmluZQlDRkdfTklPU19QT1NUX1dPUkRfQUREUgkJKENGR19NT05JVE9SX0JBU0UgKyBDRkdfTU9OSVRPUl9MRU4pCiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDT01NQU5EUwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ0ZHX0NNRF9BTEwgJiB+KCBcCi0JCQkJIENGR19DTURfQVNLRU5WIHwgXAotCQkJCSBDRkdfQ01EX0JFREJVRyB8IFwKLQkJCQkgQ0ZHX0NNRF9CTVAJfCBcCi0JCQkJIENGR19DTURfQ0FDSEUJfCBcCi0JCQkJIENGR19DTURfRE9DCXwgXAotCQkJCSBDRkdfQ01EX0RUVAl8IFwKLQkJCQkgQ0ZHX0NNRF9FRVBST00gfCBcCi0JCQkJIENGR19DTURfRUxGICAgIHwgXAotCQkJCSBDRkdfQ01EX0ZBVAl8IFwKLQkJCQkgQ0ZHX0NNRF9GREMJfCBcCi0JCQkJIENGR19DTURfRkRPUwl8IFwKLQkJCQkgQ0ZHX0NNRF9IV0ZMT1cJfCBcCi0JCQkJIENGR19DTURfSURFCXwgXAotCQkJCSBDRkdfQ01EX0kyQwl8IFwKLQkJCQkgQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQkgQ0ZHX0NNRF9LR0RCCXwgXAotCQkJCSBDRkdfQ01EX05BTkQJfCBcCi0JCQkJIENGR19DTURfTkZTCXwgXAotCQkJCSBDRkdfQ01EX01NQwl8IFwKLQkJCQkgQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJIENGR19DTURfUENJCXwgXAotCQkJCSBDRkdfQ01EX1BDTUNJQSB8IFwKLQkJCQkgQ0ZHX0NNRF9TQ1NJCXwgXAotCQkJCSBDRkdfQ01EX1ZGRAl8IFwKLQkJCQkgQ0ZHX0NNRF9VU0IJfCBcCi0JCQkJIENGR19DTURfWElNRwl8IFwKLQkJCQkgX19TUElfQ01EX09GRgkpICkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfYWxsLmg+CiAKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyN1bmRlZiBDT05GSUdfQ01EX0FTS0VOVgorI3VuZGVmIENPTkZJR19DTURfQkVEQlVHCisjdW5kZWYgQ09ORklHX0NNRF9CTVAKKyN1bmRlZiBDT05GSUdfQ01EX0NBQ0hFCisjdW5kZWYgQ09ORklHX0NNRF9ET0MKKyN1bmRlZiBDT05GSUdfQ01EX0RUVAorI3VuZGVmIENPTkZJR19DTURfRUVQUk9NCisjdW5kZWYgQ09ORklHX0NNRF9FTEYKKyN1bmRlZiBDT05GSUdfQ01EX0ZBVAorI3VuZGVmIENPTkZJR19DTURfRkRDCisjdW5kZWYgQ09ORklHX0NNRF9GRE9TCisjdW5kZWYgQ09ORklHX0NNRF9IV0ZMT1cKKyN1bmRlZiBDT05GSUdfQ01EX0lERQorI3VuZGVmIENPTkZJR19DTURfSTJDCisjdW5kZWYgQ09ORklHX0NNRF9KRkZTMgorI3VuZGVmIENPTkZJR19DTURfS0dEQgorI3VuZGVmIENPTkZJR19DTURfTkFORAorI3VuZGVmIENPTkZJR19DTURfTkZTCisjdW5kZWYgQ09ORklHX0NNRF9NTUMKKyN1bmRlZiBDT05GSUdfQ01EX01JSQorI3VuZGVmIENPTkZJR19DTURfUENJCisjdW5kZWYgQ09ORklHX0NNRF9QQ01DSUEKKyN1bmRlZiBDT05GSUdfQ01EX1NDU0kKKyN1bmRlZiBDT05GSUdfQ01EX1ZGRAorI3VuZGVmIENPTkZJR19DTURfVVNCCisjdW5kZWYgQ09ORklHX0NNRF9YSU1HCisKKyNpZiAoQ0ZHX05JT1NfQ1BVX1NQSV9OVU1TICE9IDEpCisjdW5kZWYgQ09ORklHX0NNRF9TUEkKKyN1bmRlZiBDT05GSUdfQ01EX0RBVEUKKyNlbmRpZgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogS0dEQgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQk5NjAwCiAjZW5kaWYKIApAQCAtNjUxLDcgKzY1NCw2IEBACiAjdW5kZWYJQ0ZHX0xPQURfQUREUgkJLyogZm9yY2UgZXJyb3IgYnJlYWsgKi8KICNlbmRpZgogCi0KIC8qIE1FTSB0ZXN0IGFyZWEgKi8KICNpZgkoQ0ZHX1NEUkFNX1NJWkUgIT0gMCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0FEUzg2MC5oIGIvaW5jbHVkZS9jb25maWdzL0FEUzg2MC5oCmluZGV4IGRmMjA5NjUuLjJlZThjNjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9BRFM4NjAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQURTODYwLmgKQEAgLTM3LDEzICszNywxOSBAQAogCiAjZGVmaW5lIENPTkZJR19EUkFNXzUwTUhaCQkxCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTIChDT05GSUdfQ01EX0RGTCAgIFwKLQkJCSB8IENGR19DTURfREhDUCAgIFwKLQkJCSB8IENGR19DTURfSU1NQVAgIFwKLQkJCSB8IENGR19DTURfUENNQ0lBIFwKLQkJCSB8IENGR19DTURfUElORyAgIFwKLQkJCSkKIAorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ01DSUEKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisKKy8qIFRoaXMgaXMgcGlja2VkIHVwIGFnYWluIGluIGZhZHMuaCAqLworI2RlZmluZSBGQURTX0NPTU1BTkRTX0FMUkVBRFlfREVGSU5FRAogCiAjaW5jbHVkZSAiZmFkcy5oIgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQU1YODYwLmggYi9pbmNsdWRlL2NvbmZpZ3MvQU1YODYwLmgKaW5kZXggMTRkNTZiZi4uNmY2NDAzOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0FNWDg2MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9BTVg4NjAuaApAQCAtNjEsNyArNjEsMjUgQEAKIAogI3VuZGVmIENPTkZJR19CT09UQVJHUwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KKworI2RlZmluZQlDT05GSUdfU0NDMV9FTkVUCTEJLyogdXNlIFNDQzEgZXRoZXJuZXQgKi8KKworI2RlZmluZQlDT05GSUdfUlRDX01QQzh4eAkJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHgJKi8KKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCisKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICN1bmRlZglDT05GSUdfS0dEQl9PTl9TTUMJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIFNNQyAqLwogI2RlZmluZQlDT05GSUdfS0dEQl9PTl9TQ0MJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIFNDQyAqLwogI3VuZGVmCUNPTkZJR19LR0RCX05PTkUJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIHNvbWV0aGluZyBlbHNlICovCkBAIC03MCwyOSArODgsMjIgQEAKICNlbmRpZgogCiAKLSN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCiAKLSNkZWZpbmUJQ09ORklHX1NDQzFfRU5FVAkxCS8qIHVzZSBTQ0MxIGV0aGVybmV0ICovCi0KLSNkZWZpbmUJQ09ORklHX1JUQ19NUEM4eHgJCS8qIHVzZSBpbnRlcm5hbCBSVEMgb2YgTVBDOHh4CSovCi0KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQotCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCi0KLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTk2LDcgKzIwNyw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9BUDEwMDAuaCBiL2luY2x1ZGUvY29uZmlncy9BUDEwMDAuaAppbmRleCBiYTRiMWEyLi5kMjVhYTc0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQVAxMDAwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0FQMTAwMC5oCkBAIC02NiwxOCArNjYsMjggQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQJKi8KICNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlCSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfTVZFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCVwKLQkJCSAgICAgICApCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX01WRU5WCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUElORworCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkgICAgKi8KIApAQCAtODksNyArOTksNyBAQAogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE4OCw3ICsxOTgsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICAgICovCiAjZW5kaWYKIApAQCAtMjI4LDcgKzIzOCw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9BUEM0MDUuaCBiL2luY2x1ZGUvY29uZmlncy9BUEM0MDUuaAppbmRleCAzZGY5OWEwLi5mNjQ5NWU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQVBDNDA1LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0FQQzQwNS5oCkBAIC02NywyNyArNjcsMzggQEAKIAogI2RlZmluZSBDT05GSUdfUEhZX0NMS19GUkVRCUVNQUNfU1RBQ1JfQ0xLXzY2TUhaIC8qIDY2IE1IeiBPUEIgY2xvY2sqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX0ZBVAl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfRUVQUk9NICApCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCiAjZGVmaW5lIENPTkZJR19TVVBQT1JUX1ZGQVQKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjdW5kZWYgIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCiAjZGVmaW5lIENPTkZJR19SVENfTUMxNDY4MTggICAgICAgICAgICAgLyogRFMxNjg1IGlzIE1DMTQ2ODE4IGNvbXBhdGlibGUqLwpAQCAtMTA2LDcgKzExNyw3IEBACiAjZGVmaW5lCUNGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI2Niw3ICsyNzcsNyBAQAogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTE2Mzg0CS8qIEZvciBBTUNDIDQwNSBDUFVzLCBvbGRlciA0MDUgcHBjJ3MgICAqLwogCQkJCQkvKiBoYXZlIG9ubHkgOGtCLCAxNmtCIGlzIHNhdmUgaGVyZSAgICAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0FSNDA1LmggYi9pbmNsdWRlL2NvbmZpZ3MvQVI0MDUuaAppbmRleCAxY2QwMjgwLi4wZjMwMWVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQVI0MDUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQVI0MDUuaApAQCAtNzEsMTcgKzcxLDI5IEBACiAjZGVmaW5lIENPTkZJR19QSFlfQUREUgkJMAkvKiBQSFkgYWRkcmVzcwkJCSovCiAjZGVmaW5lIENPTkZJR19MWFQ5NzFfTk9fU0xFRVAgIDEgICAgICAgLyogZGlzYWJsZSBzbGVlcCBtb2RlIGluIExYVDk3MSAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9CU1AJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTkyLDcgKzEwNCw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIwNyw3ICsyMTksNyBAQAogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTE2Mzg0CS8qIEZvciBBTUNDIDQwNSBDUFVzLCBvbGRlciA0MDUgcHBjJ3MJKi8KIAkJCQkJLyogaGF2ZSBvbmx5IDhrQiwgMTZrQiBpcyBzYXZlIGhlcmUJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0FTSDQwNS5oIGIvaW5jbHVkZS9jb25maWdzL0FTSDQwNS5oCmluZGV4IGQwM2MwNWIuLjllMGVlMzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9BU0g0MDUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQVNINDA1LmgKQEAgLTU5LDE5ICs1OSwzMSBAQAogCiAjZGVmaW5lIENPTkZJR19QSFlfQ0xLX0ZSRVEJRU1BQ19TVEFDUl9DTEtfNjZNSFogLyogNjYgTUh6IE9QQiBjbG9jayovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKwogCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTkxLDcgKzEwMyw3IEBACiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI3MCw3ICsyODIsNyBAQAogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTE2Mzg0CS8qIEZvciBBTUNDIDQwNSBDUFVzLCBvbGRlciA0MDUgcHBjJ3MJKi8KIAkJCQkJLyogaGF2ZSBvbmx5IDhrQiwgMTZrQiBpcyBzYXZlIGhlcmUJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0FkZGVyLmggYi9pbmNsdWRlL2NvbmZpZ3MvQWRkZXIuaAppbmRleCAwZTZiNTBmLi40MzA0ZWNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQWRkZXIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQWRkZXIuaApAQCAtNTIsMTUgKzUyLDI2IEBACiAjZGVmaW5lIENGR184eHhfQ1BVQ0xLX01BWAkJMTMzMDAwMDAwCiAjZW5kaWYgLyogQ09ORklHX01QQzg1MlQgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCAgXAotCQkJCXwgQ0ZHX0NNRF9ESENQICAgXAotCQkJCXwgQ0ZHX0NNRF9JTU1BUCAgXAotCQkJCXwgQ0ZHX0NNRF9NSUkgICAgXAotCQkJCXwgQ0ZHX0NNRF9QSU5HICAgXAotCQkJCSkKIAotLyogVGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JTU1BUAorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJNQkJLyogQXV0b2Jvb3QgYWZ0ZXIgNSBzZWNvbmRzCSovCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdG0gZmUwNDAwMDAiCS8qIEF1dG9ib290IGNvbW1hbmQJKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9BZGRlclVTQi5oIGIvaW5jbHVkZS9jb25maWdzL0FkZGVyVVNCLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRmN2Y5YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29uZmlncy9BZGRlclVTQi5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQ29kZUhlcm1pdC4KKyAqIEJyeWFuIE8nRG9ub2dodWUgPGJvZG9ub2dodWVAY29kZWhlcm1pdC5pZT4KKyAqCisgKiBQcm92aWRlcyBzdXBwb3J0IGZvciBVU0IgY29uc29sZSBvbiB0aGUgQW5hbG9ndWUgJiBNaWNybyBBZGRlcjg3eAorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19BRERFUlVTQl9fCisjZGVmaW5lIF9fQURERVJVU0JfXworCisvKiBJbmNsdWRlIHRoZSBib2FyZCBwb3J0ICovCisjaW5jbHVkZSAiQWRkZXIuaCIKKworI2RlZmluZSBDT05GSUdfVVNCX0RFVklDRQkJLyogSW5jbHVkZSBVREMgZHJpdmVyICovCisjZGVmaW5lIENPTkZJR19VU0JfVFRZCQkJLyogQmluZCB0aGUgVFRZIGRyaXZlciB0byBVREMgKi8KKyNkZWZpbmUgQ0ZHX1VTQl9FWFRDX0NMSyAweDAyCQkvKiBPc2NpbGxhdG9yIG9uIEVYVENfQ0xLIDIgKi8KKyNkZWZpbmUgQ0ZHX1VTQl9CUkdfQ0xLCTB4MDQJCS8qIG9yIHVzZSBCYXVkIHJhdGUgZ2VuZXJhdG9yIDB4MDQgKi8KKyNkZWZpbmUgQ0ZHX0NPTlNPTEVfSVNfSU5fRU5WCQkvKiBDb25zb2xlIGlzIGluIGVudiAqLworCisvKiBJZiB5b3UgaGF2ZSBhIFVTQi1JRiBhc3NpZ25lZCBWZW5kb3JJRCB0aGVuIHlvdSBtYXkgd2lzaCB0byBkZWZpbmUKKyAqIHlvdXIgb3duIHZlbmRvciBzcGVjaWZpYyB2YWx1ZXMgZWl0aGVyIGluIEJvYXJkTmFtZS5oIG9yIGRpcmVjdGx5IGluCisgKiB1c2JkX3ZlbmRvcl9pbmZvLmgKKyAqLworCisvKgorI2RlZmluZSBDT05GSUdfVVNCRF9NQU5VRkFDVFVSRVIJIkNvZGVIZXJtaXQuaWUiCisjZGVmaW5lIENPTkZJR19VU0JEX1BST0RVQ1RfTkFNRQkiRGFzIFUtQm9vdCIKKyNkZWZpbmUgQ09ORklHX1VTQkRfVkVORE9SSUQJCTB4RkZGRgorI2RlZmluZSBDT05GSUdfVVNCRF9QUk9EVUNUSURfR1NFUklBTAkweEZGRkYKKyNkZWZpbmUgQ09ORklHX1VTQkRfUFJPRFVDVElEX0NEQ0FDTQkweEZGRkUKKyovCisKKyNlbmRpZiAvKiBfX0FEREVSVVNCX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0FsYXNrYTgyMjAuaCBiL2luY2x1ZGUvY29uZmlncy9BbGFza2E4MjIwLmgKaW5kZXggYzA4YjJjMy4uM2YyZjYxNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0FsYXNrYTgyMjAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQWxhc2thODIyMC5oCkBAIC0zOSwxMiArMzksNiBAQAogI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290CSovCiAKLSNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM4MjIwIENQVXMgKi8KLQotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1ICAgLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KLSNlbmRpZgotCiAvKgogICogU2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgogICovCkBAIC03MCwzMSArNjQsNDAgQEAKIAogI2RlZmluZSBDT05GSUdfVElNRVNUQU1QCQkJLyogUHJpbnQgaW1hZ2UgaW5mbyB3aXRoIHRpbWVzdGFtcCAqLwogCisKIC8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKKyAqIEJPT1RQIG9wdGlvbnMKICAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0JPT1RECXwgXAotCQkJCUNGR19DTURfQ0FDSEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRElBRwl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX05FVAl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPIHwgXAotCQkJCUNGR19DTURfU0RSQU0JfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9CT09URAorI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKICNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQogI2RlZmluZSBDT05GSUdfTUlJCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogLyoKICAqIEF1dG9ib290aW5nCiAgKi8KQEAgLTI4Miw3ICsyODUsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCSAgICAvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkgICAgLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJICAgIC8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJICAgIC8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yOTgsNiArMzAxLDExIEBACiAKICNkZWZpbmUgQ0ZHX0haCQkJMTAwMAkgICAgLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcyAqLwogCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODIyMCBDUFVzICovCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1ICAgLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKyNlbmRpZgorCiAvKgogICogVmFyaW91cyBsb3ctbGV2ZWwgc2V0dGluZ3MKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0FtaWdhT25lRzNTRS5oIGIvaW5jbHVkZS9jb25maWdzL0FtaWdhT25lRzNTRS5oCmluZGV4IGVhNTBmNDEuLmQ5MTRkY2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9BbWlnYU9uZUczU0UuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQW1pZ2FPbmVHM1NFLmgKQEAgLTU2LDM4ICs1Niw0NiBAQAogCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJInJvb3Q9L2Rldi9yYW0gcncgcmFtZGlzaz00MDk2IgogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfQU1JR0FfUEFSVElUSU9OCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgfCBcCi0JCQkJIENGR19DTURfQVNLRU5WIHwgXAotCQkJCSBDRkdfQ01EX0JTUAl8IFwKLQkJCQkgQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCSBDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJIENGR19DTURfRUxGCXwgXAotCQkJCSBDRkdfQ01EX05FVAl8IFwKLQkJCQkgQ0ZHX0NNRF9JREUJfCBcCi0JCQkJIENGR19DTURfRkRDCXwgXAotCQkJCSBDRkdfQ01EX0NBQ0hFCXwgXAotCQkJCSBDRkdfQ01EX0NPTlNPTEV8IFwKLQkJCQkgQ0ZHX0NNRF9VU0IJfCBcCi0JCQkJIENGR19DTURfQlNQCXwgXAotCQkJCSBDRkdfQ01EX1BDSQkpCiAKLS8qCQkJCSAgICBDRkdfQ01EX01JSQkgICB8IFwgKi8KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9GREMKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX0NPTlNPTEV8CisjZGVmaW5lIENPTkZJR19DTURfVVNCCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfUENJCisKIAogI2RlZmluZSBDT05GSUdfUENJCQkxCiAvKiAjZGVmaW5lIENPTkZJR19QQ0lfU0NBTl9TSE9XIDEgKi8KICNkZWZpbmUgQ09ORklHX1BDSV9QTlAJCTEJLyogUENJIHBsdWctYW5kLXBsYXkgKi8KIAotLyogVGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KQotICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KKyNkZWZpbmUgYXRvaSh4KQkJc2ltcGxlX3N0cnRvdWwoeCxOVUxMLDEwKQogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMjQ3LDcgKzI1NSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCkBAIC0zNDgsOCArMzU2LDYgQEAKIAogI2RlZmluZSBDT05GSUdfM0NPTQogLyogI2RlZmluZSBDT05GSUdfQk9PVFBfUkFORE9NX0RFTEFZICovCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKIAogLyoKICAqIFVTQiBjb25maWd1cmF0aW9uCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQjIuaCBiL2luY2x1ZGUvY29uZmlncy9CMi5oCmluZGV4IGU1NTg1OGQuLmYxNDExZGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9CMi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9CMi5oCkBAIC03MiwxNiArNzIsMjYgQEAKIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLICAgICAgIChDT05GSUdfQk9PVFBfREVGQVVMVHxDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSggQ09ORklHX0NNRF9ERkwgfCBcCi0JCQkJCQkJCUNGR19DTURfREFURSB8IFwKLQkJCQkJCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCQkJCQlDRkdfQ01EX0kyQwkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CiAjZGVmaW5lIENPTkZJR19FVEhBRERSCTAwOjUwOmMyOjFlOmFmOmZiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQkFCN3h4LmggYi9pbmNsdWRlL2NvbmZpZ3MvQkFCN3h4LmgKaW5kZXggNDZiZGZhMi4uYzExZTljOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0JBQjd4eC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9CQUI3eHguaApAQCAtNjYsMTQgKzY2LDMwIEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPICAgICAgIDAgICAgICAgLyogZWNobyBvZmYgZm9yIHNlcmlhbCBkb3dubG9hZCAqLwogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UgICAgICAgICAgIC8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZXMgKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSyAgICAgICAoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgICAgKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QQ0kgfCBDRkdfQ01EX0pGRlMyIHxcCi0JCQkJIENGR19DTURfU0NTSSAgIHwgQ0ZHX0NNRF9JREUgfCBDRkdfQ01EX0RBVEUgIHxcCi0JCQkJIENGR19DTURfRkRDICAgIHwgQ0ZHX0NNRF9FTEYpCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfU0NTSQorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9GREMKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtODYsNyArMTAyLDcgQEAKICAqLwogI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWCAgICAgICAxCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFICAgICAgICAgICAgICAxMDI0ICAgICAgICAvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRSAgICAgICAgICAgICAgMjU2ICAgICAgICAgLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTQzNiw3ICs0NTIsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRSAgICAgICAgMzIgICAgLyogRm9yIGFsbCBNUEM3NHh4IENQVXMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUICAgICAgICA1ICAgIC8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0JDMzQ1MC5oIGIvaW5jbHVkZS9jb25maWdzL0JDMzQ1MC5oCmluZGV4IGJjMzA5NzcuLjVjMmJmYzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9CQzM0NTAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQkMzNDUwLmgKQEAgLTYxLDExICs2MSw2IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QJCSAgICAqLwogCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzCQkgICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQotIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAgICAqLwotI2VuZGlmCi0KIC8qCiAgKiBTZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCiAgKi8KQEAgLTEwNiwxMiArMTAxLDYgQEAKICNkZWZpbmUgQ0ZHX1JYX0VUSF9CVUZGRVIJOAkvKiB1c2UgOCByeCBidWZmZXIgb24gZWVwcm8xMDAJKi8KICNkZWZpbmUgQ09ORklHX05TODM4MlgJCTEKIAotI2lmZGVmIENPTkZJR19QQ0kKLSMgZGVmaW5lIEFERF9QQ0lfQ01ECQlDRkdfQ01EX1BDSQotI2Vsc2UKLSMgZGVmaW5lIEFERF9QQ0lfQ01ECQkwCi0jZW5kaWYKLQogLyoKICAqIFZpZGVvIGNvbnNvbGUKICAqLwpAQCAtMTI2LDEyICsxMTUsNiBAQAogIyBkZWZpbmUgQ09ORklHX1NQTEFTSF9TQ1JFRU4KICMgZGVmaW5lIENGR19DT05TT0xFX0lTX0lOX0VOVgogCi0jaWZkZWYgQ09ORklHX1ZJREVPCi0jIGRlZmluZSBBRERfQk1QX0NNRAkJQ0ZHX0NNRF9CTVAKLSNlbHNlCi0jIGRlZmluZSBBRERfQk1QX0NNRAkJMAotI2VuZGlmCi0KIC8qCiAgKiBQYXJ0aXRpb25zCiAgKi8KQEAgLTE0NCwxMCArMTI3LDcgQEAKICAqLwogI2lmZGVmIENPTkZJR19CQzM0NTBfVVNCCiAjIGRlZmluZSBDT05GSUdfVVNCX09IQ0kKLSMgZGVmaW5lIEFERF9VU0JfQ01ECQlDRkdfQ01EX1VTQgogIyBkZWZpbmUgQ09ORklHX1VTQl9TVE9SQUdFCi0jZWxzZSAvKiAhQ09ORklHX0JDMzQ1MF9VU0IgKi8KLSMgZGVmaW5lIEFERF9VU0JfQ01ECQkwCiAjZW5kaWYgLyogQ09ORklHX0JDMzQ1MF9VU0IgKi8KIAogLyoKQEAgLTE1OCw2NiArMTM4LDY5IEBACiAJCQkJIENGR19QT1NUX0kyQykKIAogI2lmZGVmIENPTkZJR19QT1NUCi0jIGRlZmluZSBDRkdfQ01EX1BPU1RfRElBRyBDRkdfQ01EX0RJQUcKIC8qIHByZXNlcnZlIHNwYWNlIGZvciB0aGUgcG9zdF93b3JkIGF0IGVuZCBvZiBvbi1jaGlwIFNSQU0gKi8KICMgZGVmaW5lIE1QQzVYWFhfU1JBTV9QT1NUX1NJWkUgTVBDNVhYWF9TUkFNX1NJWkUtNAotI2Vsc2UKLSMgZGVmaW5lIENGR19DTURfUE9TVF9ESUFHIDAKICNlbmRpZiAvKiBDT05GSUdfUE9TVCAqLwogCisKIC8qCi0gKiBJREUKKyAqIEJPT1RQIG9wdGlvbnMKICAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUNITworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisKKyNpZmRlZiBDT05GSUdfVklERU8KKyAgICAjZGVmaW5lIENPTkZJR19DTURfQk1QCisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19CQzM0NTBfSURFCi0jIGRlZmluZSBBRERfSURFX0NNRAkJQ0ZHX0NNRF9JREUKLSNlbHNlCi0jIGRlZmluZSBBRERfSURFX0NNRAkJMAotI2VuZGlmIC8qIENPTkZJR19CQzM0NTBfSURFICovCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2VuZGlmCiAKLS8qCi0gKiBGaWxlc3lzdGVtIHN1cHBvcnQKLSAqLwotI2lmIGRlZmluZWQgKENPTkZJR19CQzM0NTBfSURFKSB8fCBkZWZpbmVkIChDT05GSUdfQkMzNDUwX1VTQikKLSNpZmRlZiBDT05GSUdfRkFUCi0jIGRlZmluZSBBRERfRkFUX0NNRAkJQ0ZHX0NNRF9GQVQKLSNlbHNlCi0jIGRlZmluZSBBRERfRkFUX0NNRAkJMAotI2VuZGlmIC8qIENPTkZJR19GQVQgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19CQzM0NTBfSURFKSB8fCBkZWZpbmVkKENPTkZJR19CQzM0NTBfVVNCKQorICAgICNpZmRlZiBDT05GSUdfRkFUCisJI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorICAgICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0VYVDIKLSMgZGVmaW5lIEFERF9FWFQyX0NNRAkJQ0ZHX0NNRF9FWFQyCi0jZWxzZQotIyBkZWZpbmUgQUREX0VYVDJfQ01ECQkwCi0jZW5kaWYgLyogQ09ORklHX0VYVDIgKi8KLSNlbmRpZiAvKiBDT05GSUdfQkMzNDUwX0lERSAvIF9VU0IgKi8KKyAgICAjaWZkZWYgQ09ORklHX0VYVDIKKwkjZGVmaW5lIENPTkZJR19DTURfRVhUMgorICAgICNlbmRpZgorI2VuZGlmCiAKLS8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKLSAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlBRERfQk1QX0NNRAl8IFwKLQkJCQlBRERfSURFX0NNRAl8IFwKLQkJCQlBRERfRkFUX0NNRAl8IFwKLQkJCQlBRERfRVhUMl9DTUQJfCBcCi0JCQkJQUREX1BDSV9DTUQJfCBcCi0JCQkJQUREX1VTQl9DTUQJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0VDSE8JfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9QT1NUX0RJQUcgfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPIHwgXAotCQkJCUNGR19DTURfU05UUAl8IFwKLQkJCQlDRkdfQ01EX0JTUCkKKyNpZmRlZiBDT05GSUdfQkMzNDUwX1VTQgorICAgICNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKyNlbmRpZgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjaWZkZWYgQ09ORklHX1BDSQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BPU1QKKyAgICAjZGVmaW5lIENPTkZJR19DTURfRElBRworI2VuZGlmCisKIAogI2RlZmluZSBDT05GSUdfVElNRVNUQU1QCQkvKiBkaXNwbGF5IGltYWdlIHRpbWVzdGFtcHMgKi8KIApAQCAtNDUwLDcgKzQzMyw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAgICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtNDY5LDkgKzQ1MiwxMyBAQAogCiAjZGVmaW5lIENGR19IWgkJCTEwMDAJCS8qIGRlYyBmcmVxOiAxbXMgdGlja3MJICAgICovCiAKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMJCSAgICAqLworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAgICAqLworI2VuZGlmCisKIC8qCi0gKiBFbmFibGUgbG9vcHcgY29tbWFuZG8uIFRoaXMgaGFzIG9ubHkgYWZmZWN0LCBpZiBDRkdfQ01EX01FTSBpcyBkZWZpbmVkLAotICogd2hpY2ggaXMgbm9ybWFsbHkgcGFydCBvZiB0aGUgZGVmYXVsdCBjb21tYW5kcyAoQ0ZWX0NNRF9ERkwpCisgKiBFbmFibGUgbG9vcHcgY29tbWFuZC4KICAqLwogI2RlZmluZSBDT05GSUdfTE9PUFcKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0JNVy5oIGIvaW5jbHVkZS9jb25maWdzL0JNVy5oCmluZGV4IDNiZDQzZDguLmJiNzg1NmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9CTVcuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQk1XLmgKQEAgLTY0LDI4ICs2NCwzNSBAQAogI2RlZmluZSBDRkdfRE9DX1NVUFBPUlRfMjAwMCAgICAxCiAjZGVmaW5lIENGR19ET0NfU1VQUE9SVF9NSUxMRU5OSVVNIDEKICNkZWZpbmUgQ0ZHX0RPQ19TSE9SVF9USU1FT1VUICAgIDEKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfRE9DCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCTAgKQogCi0vKiBDRkdfQ01EX0RPQyByZXF1aXJlZCBsZWdhY3kgTkFORCBzdXBwb3J0ICovCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfRE9DCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisKKworLyogQ09ORklHX0NNRF9ET0MgcmVxdWlyZWQgbGVnYWN5IE5BTkQgc3VwcG9ydCAqLwogI2RlZmluZSBDRkdfTkFORF9MRUdBQ1kKIAogI2lmIDAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAgKENPTkZJR19DTURfREZMCXwgQ0ZHX0NNRF9ESENQIHwgXAotCQkJCSBDRkdfQ01EX1BDSSB8IENGR19DTURfRE9DIHwgQ0ZHX0NNRF9EQVRFKQotCiAjZGVmaW5lIENPTkZJR19QQ0kJCTEKICNkZWZpbmUgQ09ORklHX1BDSV9QTlAJCTEJLyogUENJIHBsdWctYW5kLXBsYXkgKi8KICNlbmRpZgogCi0vKiBUaGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpCi0gKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCkBAIC0yOTMsNyArMzAwLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAgICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0NBTkJULmggYi9pbmNsdWRlL2NvbmZpZ3MvQ0FOQlQuaAppbmRleCBlMDI2MmE4Li5hZTMyZjZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ0FOQlQuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQ0FOQlQuaApAQCAtNTYsMTMgKzU2LDI2IEBACiAKICNkZWZpbmUgQ09ORklHX1BIWV9BRERSCQkwCS8qIFBIWSBhZGRyZXNzCQkJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAoKCBDT05GSUdfQ01EX0RGTAl8CVwKLQkJCQlDRkdfQ01EX0lSUQl8CVwKLQkJCQlDRkdfQ01EX0VFUFJPTQkgICAgKSAmIFwKLQkJCSAgICAgICB+Q0ZHX0NNRF9ORVQpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKworI3VuZGVmIENPTkZJR19DTURfTkVUCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC03Myw3ICs4Niw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE3Myw3ICsxODYsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJODE5MgkvKiBGb3IgQU1DQyA0MDUgQ1BVcwkJCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9DQVRjZW50ZXIuaCBiL2luY2x1ZGUvY29uZmlncy9DQVRjZW50ZXIuaAppbmRleCA3ZWM0NTk5Li42MmEyZWFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ0FUY2VudGVyLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0NBVGNlbnRlci5oCkBAIC0xMTksMjQgKzExOSwzNiBAQAogCiAjZGVmaW5lCUNPTkZJR19USU1FU1RBTVAJCS8qIFByaW50IGltYWdlIGluZm8gd2l0aCB0aW1lc3RhbXAgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX05BTkQJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIAogI2RlZmluZSBDT05GSUdfUlRDX01DMTQ2ODE4CQkvKiBEUzE2ODUgaXMgTUMxNDY4MTggY29tcGF0aWJsZSovCkBAIC0xNTUsNyArMTY3LDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtNDEzLDcgKzQyNSw3IEBACiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQJLyogRm9yIEFNQ0MgNDA1IENQVXMsIG9sZGVyIDQwNSBwcGMncwkqLwogCQkJCQkvKiBoYXZlIG9ubHkgOGtCLCAxNmtCIGlzIHNhdmUgaGVyZQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQ0NNLmggYi9pbmNsdWRlL2NvbmZpZ3MvQ0NNLmgKaW5kZXggZTg5OTRmZi4uOWYwNjk1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0NDTS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9DQ00uaApAQCAtOTQsMjcgKzk0LDM1IEBACiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCQkvKiBub2QgdXNlZCB5ZXQJCQkqLwogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQlNQCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0NNUzcwMC5oIGIvaW5jbHVkZS9jb25maWdzL0NNUzcwMC5oCmluZGV4IDFjY2EyODUuLjA4ZWY5YjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9DTVM3MDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQ01TNzAwLmgKQEAgLTYwLDI2ICs2MCwzNSBAQAogI2RlZmluZSBDT05GSUdfTFhUOTcxX05PX1NMRUVQICAxICAgICAgIC8qIGRpc2FibGUgc2xlZXAgbW9kZSBpbiBMWFQ5NzEgKi8KICNkZWZpbmUgQ09ORklHX1JFU0VUX1BIWV9SICAgICAgMSAgICAgICAvKiB1c2UgcmVzZXRfcGh5KCkgdG8gZGlzYWJsZSBwaHkgc2xlZXAgbW9kZSAqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0ROUyB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0ROUzIgfCBcCi0JCQkJIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FICkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMyCisjZGVmaW5lIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfQlNQCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfTkFORAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisKIAogI2RlZmluZSBDRkdfTkFORF9MRUdBQ1kKIApAQCAtMTAwLDcgKzEwOSw3IEBACiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI4OSw3ICsyOTgsNyBAQAogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTE2Mzg0CS8qIEZvciBBTUNDIDQwNSBDUFVzLCBvbGRlciA0MDUgcHBjJ3MJKi8KIAkJCQkJLyogaGF2ZSBvbmx5IDhrQiwgMTZrQiBpcyBzYXZlIGhlcmUJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0NQQzQ1LmggYi9pbmNsdWRlL2NvbmZpZ3MvQ1BDNDUuaAppbmRleCBiODgyZjdhLi5hZWE4NTIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDNDUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQ1BDNDUuaApAQCAtNTQsMjcgKzU0LDM2IEBACiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKLQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0JFREJVRwl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfRVhUMgl8IFwKLQkJCQlDRkdfQ01EX0ZBVAl8IFwKLQkJCQlDRkdfQ01EX0ZMQVNICXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX1NEUkFNCXwgXAotCQkJCUNGR19DTURfU05UUAkpCi0KLS8qIFRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkKKy8qCisgKiBCT09UUCBvcHRpb25zCiAgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0JFREJVRworI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRVhUMgorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisjZGVmaW5lIENPTkZJR19DTURfU05UUAogCiAKIC8qCkBAIC0zMjUsNyArMzM0LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9DUENJMkRQLmggYi9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTJEUC5oCmluZGV4IDU2ZmQ5YTYuLmEzNzE3YjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9DUENJMkRQLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0NQQ0kyRFAuaApAQCAtNTQsMTYgKzU0LDI5IEBACiAjZGVmaW5lIENPTkZJR19NSUkJCTEJLyogTUlJIFBIWSBtYW5hZ2VtZW50CQkqLwogI2RlZmluZSBDT05GSUdfUEhZX0FERFIJCTAJLyogUEhZIGFkZHJlc3MJCQkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIChDT05GSUdfQ01EX0RGTAkmIH5DRkdfQ01EX05FVCkgfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0JTUAorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCisjdW5kZWYgQ09ORklHX0NNRF9ORVQKKwogCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTgwLDcgKzkzLDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjE2LDcgKzIyOSw3IEBACiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQJLyogRm9yIEFNQ0MgNDA1IENQVXMsIG9sZGVyIDQwNSBwcGMncwkqLwogCQkJCQkvKiBoYXZlIG9ubHkgOGtCLCAxNmtCIGlzIHNhdmUgaGVyZQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQwNS5oIGIvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDUuaAppbmRleCAwNDdlMmYxLi4wYTRlMWU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQwNS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9DUENJNDA1LmgKQEAgLTU1LDMwICs1NSw0MyBAQAogI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudAkJKi8KICNkZWZpbmUgQ09ORklHX1BIWV9BRERSCQkwCS8qIFBIWSBhZGRyZXNzCQkJKi8KICNkZWZpbmUgQ09ORklHX0xYVDk3MV9OT19TTEVFUCAgMSAgICAgICAvKiBkaXNhYmxlIHNsZWVwIG1vZGUgaW4gTFhUOTcxICovCisjZGVmaW5lIENPTkZJR19SRVNFVF9QSFlfUiAgICAgIDEgICAgICAgLyogdXNlIHJlc2V0X3BoeSgpIHRvIGRpc2FibGUgcGh5IHNsZWVwIG1vZGUgKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBcCi0JCQkJIENPTkZJR19CT09UUF9ETlMgfCBcCi0JCQkJIENPTkZJR19CT09UUF9ETlMyIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRSApCisjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkJMQorI3VuZGVmICBDT05GSUdfSEFTX0VUSDEKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUzIKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NFTkRfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKICNkZWZpbmUgQ09ORklHX1NVUFBPUlRfVkZBVAogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KICNkZWZpbmUgQ0ZHX05BTkRfTEVHQUNZCiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KQEAgLTk2LDcgKzEwOSw3IEBACiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI2MCw3ICsyNzMsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJODE5MgkvKiBGb3IgQU1DQyA0MDUgQ1BVcwkJCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9DUENJNDA1Mi5oIGIvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDUyLmgKaW5kZXggZDc1NmY0NC4uY2VlYmE2ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDUyLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDUyLmgKQEAgLTM3LDYgKzM3LDcgQEAKICNkZWZpbmUgQ09ORklHXzR4eAkJMQkvKiAuLi5tZW1iZXIgb2YgUFBDNHh4IGZhbWlseQkqLwogI2RlZmluZSBDT05GSUdfQ1BDSTQwNQkJMQkvKiAuLi5vbiBhIENQQ0k0MDUgYm9hcmQJKi8KICNkZWZpbmUgQ09ORklHX0NQQ0k0MDVfVkVSMgkxCS8qIC4uLnZlcnNpb24gMgkJCSovCisjdW5kZWYgIENPTkZJR19DUENJNDA1XzZVICAgICAgICAgICAgICAgLyogZW5hYmxlIHRoaXMgZm9yIDZVIGJvYXJkcyAgICAqLwogCiAjZGVmaW5lIENPTkZJR19CT0FSRF9FQVJMWV9JTklUX0YgMQkvKiBjYWxsIGJvYXJkX2Vhcmx5X2luaXRfZigpCSovCiAKQEAgLTU2LDI4ICs1Nyw0NCBAQAogI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudAkJKi8KICNkZWZpbmUgQ09ORklHX1BIWV9BRERSCQkwCS8qIFBIWSBhZGRyZXNzCQkJKi8KICNkZWZpbmUgQ09ORklHX0xYVDk3MV9OT19TTEVFUCAgMSAgICAgICAvKiBkaXNhYmxlIHNsZWVwIG1vZGUgaW4gTFhUOTcxICovCisjZGVmaW5lIENPTkZJR19SRVNFVF9QSFlfUiAgICAgIDEgICAgICAgLyogdXNlIHJlc2V0X3BoeSgpIHRvIGRpc2FibGUgcGh5IHNsZWVwIG1vZGUgKi8KKworI2RlZmluZSBDT05GSUdfTkVUX01VTFRJCTEKKyN1bmRlZiAgQ09ORklHX0hBU19FVEgxCiAKICNkZWZpbmUgQ09ORklHX1JUQ19NNDhUMzVBCTEJCS8qIFNUIEVsZWN0cm9uaWNzIE00OCB0aW1la2VlcGVyICovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfRE5TIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfRE5TMiB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX1NFTkRfSE9TVE5BTUUgKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUzIKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NFTkRfSE9TVE5BTUUKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfSkZGUzIJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfQlNQCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCSkKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0JTUAorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCiAKICNpZiAwIC8qIHRlc3Qtb25seSAqLwogI2RlZmluZSBDT05GSUdfTkVUQ09OU09MRQpAQCAtOTcsOSArMTE0LDYgQEAKICNkZWZpbmUgQ09ORklHX0FVVE9fVVBEQVRFICAgICAgMSAgICAgICAvKiBhdXRvdXBkYXRlIHZpYSBjb21wYWN0Zmxhc2ggICovCiAjZW5kaWYKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjZGVmaW5lIENGR19OQU5EX0xFR0FDWQogCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCkBAIC0xMTcsNyArMTMxLDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMzExLDcgKzMyNSw3IEBACiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQJLyogRm9yIEFNQ0MgNDA1IENQVXMsIG9sZGVyIDQwNSBwcGMncwkqLwogCQkJCQkvKiBoYXZlIG9ubHkgOGtCLCAxNmtCIGlzIHNhdmUgaGVyZQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQwNUFCLmggYi9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQwNUFCLmgKaW5kZXggODUyZDk0YS4uMWFlZmJiYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDVBQi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9DUENJNDA1QUIuaApAQCAtNTcsMzYgKzU3LDQ5IEBACiAjZGVmaW5lIENPTkZJR19NSUkJCTEJLyogTUlJIFBIWSBtYW5hZ2VtZW50CQkqLwogI2RlZmluZSBDT05GSUdfUEhZX0FERFIJCTAJLyogUEhZIGFkZHJlc3MJCQkqLwogI2RlZmluZSBDT05GSUdfTFhUOTcxX05PX1NMRUVQICAxICAgICAgIC8qIGRpc2FibGUgc2xlZXAgbW9kZSBpbiBMWFQ5NzEgKi8KKyNkZWZpbmUgQ09ORklHX1JFU0VUX1BIWV9SICAgICAgMSAgICAgICAvKiB1c2UgcmVzZXRfcGh5KCkgdG8gZGlzYWJsZSBwaHkgc2xlZXAgbW9kZSAqLworCisjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkJMQorI3VuZGVmICBDT05GSUdfSEFTX0VUSDEKIAogI2RlZmluZSBDT05GSUdfUlRDX000OFQzNUEJMQkJLyogU1QgRWxlY3Ryb25pY3MgTTQ4IHRpbWVrZWVwZXIgKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBcCi0JCQkJIENPTkZJR19CT09UUF9ETlMgfCBcCi0JCQkJIENPTkZJR19CT09UUF9ETlMyIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRSApCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUworI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TMgorI2RlZmluZSBDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX0ZBVAl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JKQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCiAjZGVmaW5lIENPTkZJR19TVVBQT1JUX1ZGQVQKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjZGVmaW5lIENGR19OQU5EX0xFR0FDWQogCiAKQEAgLTEwNSw3ICsxMTgsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yODQsNyArMjk3LDcgQEAKICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkvKiBGb3IgQU1DQyA0MDUgQ1BVcywgb2xkZXIgNDA1IHBwYydzCSovCiAJCQkJCS8qIGhhdmUgb25seSA4a0IsIDE2a0IgaXMgc2F2ZSBoZXJlCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9DUENJNDA1RFQuaCBiL2luY2x1ZGUvY29uZmlncy9DUENJNDA1RFQuaAppbmRleCAyMjYwMzI3Li5lMjY1MmU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQwNURULmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0NQQ0k0MDVEVC5oCkBAIC01NiwyOCArNTYsNDQgQEAKICNkZWZpbmUgQ09ORklHX01JSQkJMQkvKiBNSUkgUEhZIG1hbmFnZW1lbnQJCSovCiAjZGVmaW5lIENPTkZJR19QSFlfQUREUgkJMAkvKiBQSFkgYWRkcmVzcwkJCSovCiAjZGVmaW5lIENPTkZJR19MWFQ5NzFfTk9fU0xFRVAgIDEgICAgICAgLyogZGlzYWJsZSBzbGVlcCBtb2RlIGluIExYVDk3MSAqLworI2RlZmluZSBDT05GSUdfUkVTRVRfUEhZX1IgICAgICAxICAgICAgIC8qIHVzZSByZXNldF9waHkoKSB0byBkaXNhYmxlIHBoeSBzbGVlcCBtb2RlICovCisKKyNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQkxCisjdW5kZWYgIENPTkZJR19IQVNfRVRIMQogCiAjZGVmaW5lIENPTkZJR19SVENfTTQ4VDM1QQkxCQkvKiBTVCBFbGVjdHJvbmljcyBNNDggdGltZWtlZXBlciAqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0ROUyB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0ROUzIgfCBcCi0JCQkJIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FICkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMyCisjZGVmaW5lIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfRkFUCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0pGRlMyCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX0JTUAl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQkpCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKwogCiAjaWYgMCAvKiB0ZXN0LW9ubHkgKi8KICNkZWZpbmUgQ09ORklHX05FVENPTlNPTEUKQEAgLTk1LDkgKzExMSw2IEBACiAKICN1bmRlZiAgQ09ORklHX0FVVE9fVVBEQVRFICAgICAgICAgICAgICAvKiBhdXRvdXBkYXRlIHZpYSBjb21wYWN0Zmxhc2ggICovCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogI2RlZmluZSBDRkdfTkFORF9MRUdBQ1kKIAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwpAQCAtMTE1LDcgKzEyOCw3IEBACiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTMxNCw3ICszMjcsNyBAQAogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTE2Mzg0CS8qIEZvciBBTUNDIDQwNSBDUFVzLCBvbGRlciA0MDUgcHBjJ3MJKi8KIAkJCQkJLyogaGF2ZSBvbmx5IDhrQiwgMTZrQiBpcyBzYXZlIGhlcmUJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0NQQ0k0NDAuaCBiL2luY2x1ZGUvY29uZmlncy9DUENJNDQwLmgKaW5kZXggOTBkM2E4ZC4uMzE4YWRhMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0NQQ0k0NDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTQ0MC5oCkBAIC0zMyw2ICszMyw3IEBACiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2RlZmluZSBDT05GSUdfQ1BDSTQ0MAkJMQkgICAgLyogQm9hcmQgaXMgZWJvbnkJCSovCiAjZGVmaW5lIENPTkZJR180NDBHUAkJMQkgICAgLyogU3BlY2lmYyBHUCBzdXBwb3J0CSovCisjZGVmaW5lIENPTkZJR180NDAJCTEJICAgIC8qIC4uLiBQUEM0NDAgZmFtaWx5CSovCiAjZGVmaW5lIENPTkZJR180eHgJCTEJICAgIC8qIC4uLiBQUEM0eHggZmFtaWx5CSovCiAjZGVmaW5lIENPTkZJR19CT0FSRF9FQVJMWV9JTklUX0YgMQkgICAgLyogQ2FsbCBib2FyZF9lYXJseV9pbml0X2YJKi8KICN1bmRlZglDRkdfRFJBTV9URVNUCQkJICAgIC8qIERpc2FibGUtdGFrZXMgbG9uZyB0aW1lISAqLwpAQCAtMTcxLDI5ICsxNzIsMjcgQEAKICNkZWZpbmUgQ09ORklHX1BIWV9BRERSCQkxCS8qIFBIWSBhZGRyZXNzCQkJKi8KICNkZWZpbmUgQ09ORklHX0xYVDk3MV9OT19TTEVFUCAgMSAgICAgICAvKiBkaXNhYmxlIHNsZWVwIG1vZGUgaW4gTFhUOTcxICovCiAKLSNpZiAwIC8qIHRlc3Qtb25seSAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0tHREIJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0JFREJVRwl8IFwKLQkJCQlDRkdfQ01EX0VMRgkpCi0jZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JKQotLyogdGVzdC1vbmx5OiBzdXBwb3J0IGZlaGx0IGJpc2hlci4uLiAqLwotLyoJCQkJQ0ZHX0NNRF9JREUJfCBcKi8KLS8qCQkJCUNGR19DTURfUENJCXwgXCovCi0jZW5kaWYKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTIwNCw3ICsyMDMsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yNjgsNyArMjY3LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTMyNzY4CS8qIEZvciBBTUNDIDQ0MCBDUFVzCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtMjkwLDcgKzI4OSw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTc1MC5oIGIvaW5jbHVkZS9jb25maWdzL0NQQ0k3NTAuaAppbmRleCBiYzIzZmMwLi40OGUyOWEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDSTc1MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9DUENJNzUwLmgKQEAgLTEzMywzMCArMTMzLDM3IEBACiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAjdW5kZWYJQ09ORklHX0FMVElWRUMJCQkvKiB1bmRlZiB0byBkaXNhYmxlCQkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCiAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgKENPTkZJR19DTURfREZMCSAgIFwKLQkJCSB8IENGR19DTURfQVNLRU5WICBcCi0JCQkgfCBDRkdfQ01EX0kyQwkgICBcCi0JCQkgfCBDRkdfQ01EX0NBQ0hFICAgXAotCQkJIHwgQ0ZHX0NNRF9FRVBST00gIFwKLQkJCSB8IENGR19DTURfUENJCSAgIFwKLQkJCSB8IENGR19DTURfRUxGCSAgIFwKLQkJCSB8IENGR19DTURfREFURQkgICBcCi0JCQkgfCBDRkdfQ01EX05FVAkgICBcCi0JCQkgfCBDRkdfQ01EX1BJTkcJICAgXAotCQkJIHwgQ0ZHX0NNRF9JREUJICAgXAotCQkJIHwgQ0ZHX0NNRF9GQVQJICAgXAotCQkJIHwgQ0ZHX0NNRF9FWFQyCSAgIFwKLQkJCQkJKQorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfRVhUMgorCiAKICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjZGVmaW5lIENPTkZJR19VU0VfQ1BDSURWSQogCiAjaWZkZWYJQ09ORklHX1VTRV9DUENJRFZJCkBAIC0xNzksNyArMTg2LDcgQEAKICNkZWZpbmUgQ0ZHX0dUX0RVQUxfQ1BVCQkJLyogYWxzbyBmb3IgSlRBRyBldmVuIHdpdGggb25lIGNwdSAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtNTg1LDcgKzU5Miw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBhbGwgTVBDNzR4eCBDUFVzCQkgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvQ1BDSUlTRVI0LmggYi9pbmNsdWRlL2NvbmZpZ3MvQ1BDSUlTRVI0LmgKaW5kZXggOTNkNDlmMy4uYzdiNjIzYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0NQQ0lJU0VSNC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9DUENJSVNFUjQuaApAQCAtNTQsMTUgKzU0LDM2IEBACiAjZGVmaW5lIENPTkZJR19QSFlfQUREUgkJMAkvKiBQSFkgYWRkcmVzcwkJCSovCiAjZGVmaW5lIENPTkZJR19MWFQ5NzFfTk9fU0xFRVAgIDEgICAgICAgLyogZGlzYWJsZSBzbGVlcCBtb2RlIGluIExYVDk3MSAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC03Myw3ICs5NCw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE4OSw3ICsyMTAsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJODE5MgkvKiBGb3IgQU1DQyA0MDUgQ1BVcwkJCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9DUFU4Ni5oIGIvaW5jbHVkZS9jb25maWdzL0NQVTg2LmgKaW5kZXggMTZhOWVhNS4uYzU4OWYyOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0NQVTg2LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0NQVTg2LmgKQEAgLTY4LDkgKzY4LDcgQEAKICAqIGZvciBGQ0MpCiAgKgogICogaWYgQ09ORklHX0VUSEVSX05PTkUgaXMgZGVmaW5lZCwgdGhlbiBlaXRoZXIgdGhlIGV0aGVybmV0IHJvdXRpbmVzIG11c3QgYmUKLSAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDRkdfQ01EX05FVCBtdXN0IGJlIHJlbW92ZWQKLSAqIGZyb20gQ09ORklHX0NPTU1BTkRTIHRvIHJlbW92ZSBzdXBwb3J0IGZvciBuZXR3b3JraW5nLgotICoKKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICovCiAjdW5kZWYJQ09ORklHX0VUSEVSX09OX1NDQwkJLyogZGVmaW5lIGlmIGV0aGVyIG9uIFNDQyAgICAgICAqLwogI2RlZmluZQlDT05GSUdfRVRIRVJfT05fRkNDCQkvKiBkZWZpbmUgaWYgZXRoZXIgb24gRkNDICAgICAgICovCkBAIC0xNjMsMjcgKzE2MSwzNyBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLwogI3VuZGVmCUNGR19MT0FEU19CQVVEX0NIQU5HRQkJLyogZG9uJ3QgYWxsb3cgYmF1ZHJhdGUgY2hhbmdlCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUfENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQkVEQlVHCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9ET0MJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9CRURCVUcKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RPQworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zNDgsNyArMzU2LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUgICAgICAzMiAgICAgIC8qIEZvciBNUEM4MjYwIENQVSAgICAgICAgICAgICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0NQVTg3LmggYi9pbmNsdWRlL2NvbmZpZ3MvQ1BVODcuaAppbmRleCBjZTk2OWVjLi5iMDg3ZWJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ1BVODcuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQ1BVODcuaApAQCAtNjksOSArNjksNyBAQAogICogZm9yIEZDQykKICAqCiAgKiBpZiBDT05GSUdfRVRIRVJfTk9ORSBpcyBkZWZpbmVkLCB0aGVuIGVpdGhlciB0aGUgZXRoZXJuZXQgcm91dGluZXMgbXVzdCBiZQotICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENGR19DTURfTkVUIG11c3QgYmUgcmVtb3ZlZAotICogZnJvbSBDT05GSUdfQ09NTUFORFMgdG8gcmVtb3ZlIHN1cHBvcnQgZm9yIG5ldHdvcmtpbmcuCi0gKgorICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUIG11c3QgYmUgdW5zZXQuCiAgKi8KICN1bmRlZglDT05GSUdfRVRIRVJfT05fU0NDCQkvKiBkZWZpbmUgaWYgZXRoZXIgb24gU0NDCSovCiAjZGVmaW5lIENPTkZJR19FVEhFUl9PTl9GQ0MJCS8qIGRlZmluZSBpZiBldGhlciBvbiBGQ0MJKi8KQEAgLTE2NywyNyArMTY1LDMxIEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkCSovCiAjdW5kZWYJQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCQkvKiBkb24ndCBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFR8Q09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9CRURCVUcKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfRE9DCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSTJDCiAKICNpZmRlZiBDT05GSUdfUENJCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMIHwgXAotCQkJCSBDRkdfQ01EX0JFREJVRyB8IFwKLQkJCQkgQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCSBDRkdfQ01EX0RPQwl8IFwKLQkJCQkgQ0ZHX0NNRF9FRVBST00gfCBcCi0JCQkJIENGR19DTURfSTJDCXwgXAotCQkJCSBDRkdfQ01EX1BDSSkKLSNlbHNlCS8qICEgUENJICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMIHwgXAotCQkJCSBDRkdfQ01EX0JFREJVRyB8IFwKLQkJCQkgQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCSBDRkdfQ01EX0RPQwl8IFwKLQkJCQkgQ0ZHX0NNRF9FRVBST00gfCBcCi0JCQkJIENGR19DTURfSTJDCSkKLSNlbmRpZgkvKiBDT05GSUdfUENJICovCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2VuZGlmCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogI2RlZmluZSBDRkdfTkFORF9MRUdBQ1kKIApAQCAtMTk2LDcgKzE5OCw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTM2OSw3ICszNzEsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODI2MCBDUFUJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9DUkFZTDEuaCBiL2luY2x1ZGUvY29uZmlncy9DUkFZTDEuaAppbmRleCA2M2Q3YTkyLi5hOTY1YzEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ1JBWUwxLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0NSQVlMMS5oCkBAIC03NSwzOCArNzUsNDIgQEAKICNkZWZpbmUgQ09ORklHX0FVVE9TQ1JJUFQJCTEKIAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgKFwKLQlDRkdfQ01EX0JESXxcCi0JQ0ZHX0NNRF9JTUl8XAotCUNGR19DTURfRkxBU0h8XAotCUNGR19DTURfTUVNT1JZfFwKLQlDRkdfQ01EX05FVHxcCi0JQ0ZHX0NNRF9FTlZ8XAotCUNGR19DTURfQ09OU09MRXxcCi0JQ0ZHX0NNRF9BU0tFTlZ8XAotCUNGR19DTURfRUNIT3xcCi0JQ0ZHX0NNRF9JTU1BUHxcCi0JQ0ZHX0NNRF9SRUdJTkZPfFwKLQlDRkdfQ01EX0RIQ1B8XAotCUNGR19DTURfREFURXxcCi0JQ0ZHX0NNRF9SVU58XAotCUNGR19DTURfSTJDfFwKLQlDRkdfQ01EX0VFUFJPTXxcCi0JQ0ZHX0NNRF9ESUFHfFwKLQlDRkdfQ01EX0FVVE9TQ1JJUFR8XAotCUNGR19DTURfU0VUR0VURENSKQorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisKKyNkZWZpbmUgQ09ORklHX0NNRF9CREkKKyNkZWZpbmUgQ09ORklHX0NNRF9JTUkKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0NPTlNPTEUKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9FQ0hPCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9SVU4KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfQVVUT1NDUklQVAorI2RlZmluZSBDT05GSUdfQ01EX1NFVEdFVERDUgorCiAKIC8qCi0gKiBvcHRpb25hbCBCT09UUCAvIERIQ1AgZmllbGRzCisgKiBCT09UUCBvcHRpb25zCiAgKi8KLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sgKFwKLQlDT05GSUdfQk9PVFBfVkVORE9SRVh8XAotCUNPTkZJR19CT09UUF9TVUJORVRNQVNLfFwKLQlDT05GSUdfQk9PVFBfR0FURVdBWXxcCi0JQ09ORklHX0JPT1RQX0ROU3xcCi0JQ09ORklHX0JPT1RQX0hPU1ROQU1FfFwKLQlDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFfFwKLQlDT05GSUdfQk9PVFBfQk9PVFBBVEgpCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1ZFTkRPUkVYCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKIC8qCiAgKiBob3cgbWFueSB0aW1lIHRvIGZhaWwgJiByZXN0YXJ0IGEgbmV0LVRGVFAgYmVmb3JlIGdpdmluZyB1cCAmIHJlc2V0dGluZwpAQCAtMTIzLDkgKzEyNyw2IEBACiAjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRSAgXAogICAgIHszMDAsIDYwMCwgMTIwMCwgMjQwMCwgNDgwMCwgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwLCAyMzA0MDB9CiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0NVODI0LmggYi9pbmNsdWRlL2NvbmZpZ3MvQ1U4MjQuaAppbmRleCBhY2M4NDg0Li42OGU4MTZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvQ1U4MjQuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvQ1U4MjQuaApAQCAtNTUsMjEgKzU1LDI5IEBACiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdG0gRkUwMjAwMDAiCS8qIGF1dG9ib290IGNvbW1hbmQJKi8KICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZQlDT05GSUdfVElNRVNUQU1QCQkvKiBQcmludCBpbWFnZSBpbmZvIHdpdGggdGltZXN0YW1wICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9CRURCVUcgIHwgXAotCQkJCTAgLyogQ0ZHX0NNRF9EQVRFICovCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiBUaGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCiAgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0JFREJVRworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCiAKIAogLyoKQEAgLTI3OCw3ICsyODYsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0RBU0FfU0lNLmggYi9pbmNsdWRlL2NvbmZpZ3MvREFTQV9TSU0uaAppbmRleCA5OTdlMWJhLi42MjdlYTE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvREFTQV9TSU0uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvREFTQV9TSU0uaApAQCAtNTcsMzIgKzU3LDM1IEBACiAjZGVmaW5lIENPTkZJR19JUEFERFIJCTEwLjAuMTguMjIyCiAjZGVmaW5lIENPTkZJR19TRVJWRVJJUAkJMTAuMC4xOC4xOTAKIAotI2lmIDAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfQlNQCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfRUxGCSkKLSNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQlNQCSkKLSNlbmRpZgorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisKIAogI2lmIDAgLyogRG9lcyBub3QgYXBwZWFyIHRvIGJlIHVzZWQ/ISAgSWYgaXQgaXMgdXNlZCwgbmVlZHMgdG8gYmUgZml4ZWQgKi8KICNkZWZpbmUgQ09ORklHX1NPRlRfSTJDCQkJLyogU29mdHdhcmUgSTJDIHN1cHBvcnQgZW5hYmxlZCAqLwogI2VuZGlmCiAjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFJfTEVOIDEJLyogQnl0ZXMgb2YgYWRkcmVzcwkJKi8KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xODQsNyArMTg3LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTIwNDgJLyogRm9yIFBMWCBJT1A0ODAJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIEFNQ0MgNDAxLzQwMyBDUFVzCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9EQjY0MzYwLmggYi9pbmNsdWRlL2NvbmZpZ3MvREI2NDM2MC5oCmluZGV4IGJkN2FmZjEuLmRiMmU5NmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9EQjY0MzYwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0RCNjQzNjAuaApAQCAtMjE1LDggKzIxNSwxNiBAQAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogI3VuZGVmCUNPTkZJR19BTFRJVkVDCQkJLyogdW5kZWYgdG8gZGlzYWJsZQkJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBcCi0JCQkJIENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCisKIC8qCiAgKiBKRkZTMiBwYXJ0aXRpb25zCiAgKgpAQCAtMjM5LDE3ICsyNDcsMjAgQEAKICNkZWZpbmUgTVREUEFSVFNfREVGQVVMVAkibXRkcGFydHM9ZGI2NDM2MC0xOi0oamZmczIpIgogKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgKENPTkZJR19DTURfREZMIFwKLQkJCSB8IENGR19DTURfQVNLRU5WIFwKLQkJCSB8IENGR19DTURfSTJDIFwKLQkJCSB8IENGR19DTURfRUVQUk9NIFwKLQkJCSB8IENGR19DTURfQ0FDSEUgXAotCQkJIHwgQ0ZHX0NNRF9KRkZTMiBcCi0JCQkgfCBDRkdfQ01EX1BDSSBcCi0JCQkgfCBDRkdfQ01EX05FVCApCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC0yNjEsNyArMjcyLDcgQEAKIC8qICNkZWZpbmUgQ0ZHX0dUX0RVQUxfQ1BVCSBhbHNvIGZvciBKVEFHIGV2ZW4gd2l0aCBvbmUgY3B1ICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC01NTgsNyArNTY5LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIGFsbCBNUEM3NHh4IENQVXMJCSAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9EQjY0NDYwLmggYi9pbmNsdWRlL2NvbmZpZ3MvREI2NDQ2MC5oCmluZGV4IDRiNzJlOWIuLmI1ZDNmNzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9EQjY0NDYwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0RCNjQ0NjAuaApAQCAtMTUzLDggKzE1MywxNiBAQAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogI3VuZGVmCUNPTkZJR19BTFRJVkVDCQkJLyogdW5kZWYgdG8gZGlzYWJsZQkJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBcCi0JCQkJIENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCisKIC8qCiAgKiBKRkZTMiBwYXJ0aXRpb25zCiAgKgpAQCAtMTc3LDE3ICsxODUsMjAgQEAKICNkZWZpbmUgTVREUEFSVFNfREVGQVVMVAkibXRkcGFydHM9ZGI2NDQ2MC0xOi0oamZmczIpIgogKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgKENPTkZJR19DTURfREZMIFwKLQkJCSB8IENGR19DTURfQVNLRU5WIFwKLQkJCSB8IENGR19DTURfSTJDIFwKLQkJCSB8IENGR19DTURfRUVQUk9NIFwKLQkJCSB8IENGR19DTURfQ0FDSEUgXAotCQkJIHwgQ0ZHX0NNRF9KRkZTMiBcCi0JCQkgfCBDRkdfQ01EX1BDSSBcCi0JCQkgfCBDRkdfQ01EX05FVCApCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC0xOTksNyArMjEwLDcgQEAKIC8qICNkZWZpbmUgQ0ZHX0dUX0RVQUxfQ1BVCSBhbHNvIGZvciBKVEFHIGV2ZW4gd2l0aCBvbmUgY3B1ICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC00OTYsNyArNTA3LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIGFsbCBNUEM3NHh4IENQVXMJCSAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9ESzFDMjAuaCBiL2luY2x1ZGUvY29uZmlncy9ESzFDMjAuaAppbmRleCBiNTg4NDZkLi4wZGRmMGUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvREsxQzIwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0RLMUMyMC5oCkBAIC00NDYsNDYgKzQ0Niw1NSBAQAogI2RlZmluZSBDT05GSUdfTklPU19BU01JCQkJICAgLyogRW5hYmxlIEFTTUkJKi8KICNkZWZpbmUgQ0ZHX05JT1NfQVNNSUJBU0UJQ0ZHX05JT1NfQ1BVX0FTTUkwIC8qIEFTTUkgYmFzZSBhZGRyZXNzCSovCiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDT01NQU5EUwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ0ZHX0NNRF9BTEwgJiB+KCBcCi0JCQkJIENGR19DTURfQVNLRU5WIHwgXAotCQkJCSBDRkdfQ01EX0JFREJVRyB8IFwKLQkJCQkgQ0ZHX0NNRF9CTVAJfCBcCi0JCQkJIENGR19DTURfQlNQCXwgXAotCQkJCSBDRkdfQ01EX0NBQ0hFCXwgXAotCQkJCSBDRkdfQ01EX0RBVEUJfCBcCi0JCQkJIENGR19DTURfRE9DCXwgXAotCQkJCSBDRkdfQ01EX0RUVAl8IFwKLQkJCQkgQ0ZHX0NNRF9FRVBST00gfCBcCi0JCQkJIENGR19DTURfRUxGICAgIHwgXAotCQkJCSBDRkdfQ01EX0ZEQwl8IFwKLQkJCQkgQ0ZHX0NNRF9GRE9TCXwgXAotCQkJCSBDRkdfQ01EX0hXRkxPVwl8IFwKLQkJCQkgQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJIENGR19DTURfSkZGUzIJfCBcCi0JCQkJIENGR19DTURfS0dEQgl8IFwKLQkJCQkgQ0ZHX0NNRF9OQU5ECXwgXAotCQkJCSBDRkdfQ01EX05GUwl8IFwKLQkJCQkgQ0ZHX0NNRF9NTUMJfCBcCi0JCQkJIENGR19DTURfTUlJCXwgXAotCQkJCSBDRkdfQ01EX1BDSQl8IFwKLQkJCQkgQ0ZHX0NNRF9QQ01DSUEgfCBcCi0JCQkJIENGR19DTURfUkVJU0VSCXwgXAotCQkJCSBDRkdfQ01EX1NDU0kJfCBcCi0JCQkJIENGR19DTURfU1BJCXwgXAotCQkJCSBDRkdfQ01EX1ZGRAl8IFwKLQkJCQkgQ0ZHX0NNRF9VU0IJfCBcCi0JCQkJIENGR19DTURfWElNRwkpICkKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAogCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2FsbC5oPgorCisjdW5kZWYgQ09ORklHX0NNRF9BU0tFTlYKKyN1bmRlZiBDT05GSUdfQ01EX0JFREJVRworI3VuZGVmIENPTkZJR19DTURfQk1QCisjdW5kZWYgQ09ORklHX0NNRF9CU1AKKyN1bmRlZiBDT05GSUdfQ01EX0NBQ0hFCisjdW5kZWYgQ09ORklHX0NNRF9EQVRFCisjdW5kZWYgQ09ORklHX0NNRF9ET0MKKyN1bmRlZiBDT05GSUdfQ01EX0RUVAorI3VuZGVmIENPTkZJR19DTURfRUVQUk9NCisjdW5kZWYgQ09ORklHX0NNRF9FTEYKKyN1bmRlZiBDT05GSUdfQ01EX0ZEQworI3VuZGVmIENPTkZJR19DTURfRkRPUworI3VuZGVmIENPTkZJR19DTURfSFdGTE9XCisjdW5kZWYgQ09ORklHX0NNRF9JMkMKKyN1bmRlZiBDT05GSUdfQ01EX0pGRlMyCisjdW5kZWYgQ09ORklHX0NNRF9LR0RCCisjdW5kZWYgQ09ORklHX0NNRF9OQU5ECisjdW5kZWYgQ09ORklHX0NNRF9ORlMKKyN1bmRlZiBDT05GSUdfQ01EX01NQworI3VuZGVmIENPTkZJR19DTURfTUlJCisjdW5kZWYgQ09ORklHX0NNRF9QQ0kKKyN1bmRlZiBDT05GSUdfQ01EX1BDTUNJQQorI3VuZGVmIENPTkZJR19DTURfUkVJU0VSCisjdW5kZWYgQ09ORklHX0NNRF9TQ1NJCisjdW5kZWYgQ09ORklHX0NNRF9TUEkKKyN1bmRlZiBDT05GSUdfQ01EX1ZGRAorI3VuZGVmIENPTkZJR19DTURfVVNCCisjdW5kZWYgQ09ORklHX0NNRF9YSU1HCisKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIENPTVBBQ1QgRkxBU0gKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JREUpCiAjZGVmaW5lIENPTkZJR19JREVfUFJFSU5JVAkJCS8qIEltcGxlbWVudCBpZF9wcmVpbml0CSovCiAjZGVmaW5lIENGR19JREVfTUFYQlVTCQkxCQkvKiAxIElERSBidXMJCSovCiAjZGVmaW5lIENGR19JREVfTUFYREVWSUNFCTEJCS8qIDEgZHJpdmUgcGVyIElERSBidXMJKi8KQEAgLTUwMywxMiArNTEyLDEyIEBACiAjZGVmaW5lIENGR19DRl9QT1dFUgkJMHgwMDkyMDljMAkvKiBDRiBQb3dlciBGRVQgUElPIGJhc2UqLwogI2RlZmluZSBDRkdfQ0ZfQVRBU0VMCQkweDAwOTIwOWQwCS8qIENGIEFUQVNFTCBQSU8gYmFzZQkqLwogCi0jZW5kaWYgLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUgKi8KKyNlbmRpZgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogS0dEQgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQk5NjAwCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0RLMVMxMC5oIGIvaW5jbHVkZS9jb25maWdzL0RLMVMxMC5oCmluZGV4IDNlMzgwM2MuLjAwMzJmZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9ESzFTMTAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvREsxUzEwLmgKQEAgLTQ1NCw0NyArNDU0LDU1IEBACiAKICNlbmRpZgkvKiBDRkdfTklPU19DUFVfUElPX05VTVMgKi8KIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENPTU1BTkRTCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDRkdfQ01EX0FMTCAmIH4oIFwKLQkJCQkgQ0ZHX0NNRF9BU0tFTlYgfCBcCi0JCQkJIENGR19DTURfQkVEQlVHIHwgXAotCQkJCSBDRkdfQ01EX0JNUAl8IFwKLQkJCQkgQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJIENGR19DTURfQ0FDSEUJfCBcCi0JCQkJIENGR19DTURfREFURQl8IFwKLQkJCQkgQ0ZHX0NNRF9ET0MJfCBcCi0JCQkJIENGR19DTURfRFRUCXwgXAotCQkJCSBDRkdfQ01EX0VFUFJPTSB8IFwKLQkJCQkgQ0ZHX0NNRF9FTEYgICAgfCBcCi0JCQkJIENGR19DTURfRkFUCXwgXAotCQkJCSBDRkdfQ01EX0ZEQwl8IFwKLQkJCQkgQ0ZHX0NNRF9GRE9TCXwgXAotCQkJCSBDRkdfQ01EX0hXRkxPVwl8IFwKLQkJCQkgQ0ZHX0NNRF9JREUJfCBcCi0JCQkJIENGR19DTURfSTJDCXwgXAotCQkJCSBDRkdfQ01EX0pGRlMyCXwgXAotCQkJCSBDRkdfQ01EX0tHREIJfCBcCi0JCQkJIENGR19DTURfTkFORAl8IFwKLQkJCQkgQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJIENGR19DTURfTU1DCXwgXAotCQkJCSBDRkdfQ01EX01JSQl8IFwKLQkJCQkgQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJIENGR19DTURfUENNQ0lBIHwgXAotCQkJCSBDRkdfQ01EX1NDU0kJfCBcCi0JCQkJIENGR19DTURfU1BJCXwgXAotCQkJCSBDRkdfQ01EX1ZGRAl8IFwKLQkJCQkgQ0ZHX0NNRF9VU0IJfCBcCi0JCQkJIENGR19DTURfWElNRwkpICkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9hbGwuaD4KKworI3VuZGVmIENPTkZJR19DTURfQVNLRU5WCisjdW5kZWYgQ09ORF9DTURfQkVEQlVHCisjdW5kZWYgQ09ORF9DTURfQk1QCisjdW5kZWYgQ09ORF9DTURfQlNQCisjdW5kZWYgQ09ORF9DTURfQ0FDSEUKKyN1bmRlZiBDT05EX0NNRF9EQVRFCisjdW5kZWYgQ09ORF9DTURfRE9DCisjdW5kZWYgQ09ORF9DTURfRFRUCisjdW5kZWYgQ09ORF9DTURfRUVQUk9NCisjdW5kZWYgQ09ORF9DTURfRUxGCisjdW5kZWYgQ09ORF9DTURfRkFUCisjdW5kZWYgQ09ORF9DTURfRkRDCisjdW5kZWYgQ09ORF9DTURfRkRPUworI3VuZGVmIENPTkRfQ01EX0hXRkxPVworI3VuZGVmIENPTkRfQ01EX0lERQorI3VuZGVmIENPTkRfQ01EX0kyQworI3VuZGVmIENPTkRfQ01EX0pGRlMyCisjdW5kZWYgQ09ORF9DTURfS0dEQgorI3VuZGVmIENPTkRfQ01EX05BTkQKKyN1bmRlZiBDT05EX0NNRF9ORlMKKyN1bmRlZiBDT05EX0NNRF9NTUMKKyN1bmRlZiBDT05EX0NNRF9NSUkKKyN1bmRlZiBDT05EX0NNRF9QQ0kKKyN1bmRlZiBDT05EX0NNRF9QQ01DSUEKKyN1bmRlZiBDT05EX0NNRF9TQ1NJCisjdW5kZWYgQ09ORF9DTURfU1BJCisjdW5kZWYgQ09ORF9DTURfVkZECisjdW5kZWYgQ09ORF9DTURfVVNCCisjdW5kZWYgQ09ORF9DTURfWElNRworCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBLR0RCCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTk2MDAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvRFA0MDUuaCBiL2luY2x1ZGUvY29uZmlncy9EUDQwNS5oCmluZGV4IDJhZTc5NGQuLjJlYWRiZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9EUDQwNS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9EUDQwNS5oCkBAIC01NSwxNyArNTUsMjkgQEAKICNkZWZpbmUgQ09ORklHX01JSQkJMQkvKiBNSUkgUEhZIG1hbmFnZW1lbnQJCSovCiAjZGVmaW5lIENPTkZJR19QSFlfQUREUgkJMAkvKiBQSFkgYWRkcmVzcwkJCSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtODcsNyArOTksNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMzUsNyArMjQ3LDcgQEAKICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkvKiBGb3IgQU1DQyA0MDUgQ1BVcywgb2xkZXIgNDA1IHBwYydzCSovCiAJCQkJCS8qIGhhdmUgb25seSA4a0IsIDE2a0IgaXMgc2F2ZSBoZXJlCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9EVTQwNS5oIGIvaW5jbHVkZS9jb25maWdzL0RVNDA1LmgKaW5kZXggNTQ4OWE1My4uNWM1OTVmNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0RVNDA1LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0RVNDA1LmgKQEAgLTU4LDIxICs1OCwzMyBAQAogI2RlZmluZSBDT05GSUdfUEhZX0FERFIJCTAJLyogUEhZIGFkZHJlc3MJCQkqLwogI2RlZmluZSBDT05GSUdfTFhUOTcxX05PX1NMRUVQICAxICAgICAgIC8qIGRpc2FibGUgc2xlZXAgbW9kZSBpbiBMWFQ5NzEgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JKQorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKICNkZWZpbmUgQ09ORklHX1JUQ19NQzE0NjgxOAkJLyogQlEzMjg1IGlzIE1DMTQ2ODE4IGNvbXBhdGlibGUqLwpAQCAtODUsNyArOTcsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMjUsNyArMjM3LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTgxOTIJLyogRm9yIEFNQ0MgNDA1IENQVXMJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvRUIrTUNGLUVWMTIzLmggYi9pbmNsdWRlL2NvbmZpZ3MvRUIrTUNGLUVWMTIzLmgKaW5kZXggNzIwYjMzNS4uYTg2OTdlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0VCK01DRi1FVjEyMy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9FQitNQ0YtRVYxMjMuaApAQCAtNjgsMTcgKzY4LDI5IEBACiAjZGVmaW5lIENGR19FTlZfSVNfSU5fRkxBU0gJMQogI2VuZGlmCiAKLS8qI2RlZmluZSBDT05GSUdfQ09NTUFORFMgICggQ09ORklHX0NNRF9ERkwgJiB+KENGR19DTURfTE9BRFMgfCBDRkdfQ01EX0xPQURCKSApICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAgKCBDT05GSUdfQ01EX0RGTCAmIH4oQ0ZHX0NNRF9MT0FEQikpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURCCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUKICNkZWZpbmUgQ0ZHX1BST01QVAkJIlxuRVYxMjMgVS1Cb290PiAiCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvRUxQUEMuaCBiL2luY2x1ZGUvY29uZmlncy9FTFBQQy5oCmluZGV4IDJjOTliNGIuLmJiNzcxODggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9FTFBQQy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9FTFBQQy5oCkBAIC02NiwxMiArNjYsMjUgQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8gICAgICAgMCAgICAgICAvKiBlY2hvIG9mZiBmb3Igc2VyaWFsIGRvd25sb2FkICovCiAjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRSAgICAgICAgICAgLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlcyAqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLICAgICAgIChDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgICAgICAgICAoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BDSSB8IENGR19DTURfSkZGUzIpCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTg0LDcgKzk3LDcgQEAKICAqLwogI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWCAgICAgICAxCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFICAgICAgICAgICAgICAxMDI0ICAgICAgICAvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRSAgICAgICAgICAgICAgMjU2ICAgICAgICAgLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTMxNyw3ICszMzAsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRSAgICAgICAgMzIgICAgLyogRm9yIGFsbCBNUEM3NHh4IENQVXMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUICAgICAgICA1ICAgIC8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0VMUFQ4NjAuaCBiL2luY2x1ZGUvY29uZmlncy9FTFBUODYwLmgKaW5kZXggZTczYmNlYy4uZjkyN2EyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0VMUFQ4NjAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvRUxQVDg2MC5oCkBAIC04MSw3ICs4MSwxNSBAQAogICAgICIiCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkicnVuIHJhbWJvb3QiCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI3VuZGVmCSAgQ09ORklHX1dBVENIRE9HCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KICN1bmRlZgkgIENPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQJKi8KQEAgLTkxLDEyICs5OSwxNSBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLwogI3VuZGVmCSAgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCQkvKiBkb24ndCBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSggQ09ORklHX0NNRF9ERkwgfCBcCi0JCQkJICBDRkdfQ01EX0FTS0VOViB8IFwKLQkJCQkgIENGR19DTURfREFURQkgKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMTA0LDcgKzExNSw3IEBACiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUICAgICAiTEVPWF9lbHB0ODYwOiAiIC8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICMgIGRlZmluZSBDRkdfQ0JTSVpFCSAyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMjQsNyArMjM1LDcgQEAKICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJICAgICAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCSA0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICAgICAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9FUDFDMjAuaCBiL2luY2x1ZGUvY29uZmlncy9FUDFDMjAuaAppbmRleCA1NTA3ZjM1Li5jZmE2MzM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvRVAxQzIwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0VQMUMyMC5oCkBAIC0xNjAsMjUgKzE2MCwzNiBAQAogI2RlZmluZSBDT05GSUdfSVBBRERSCQkxOTIuMTY4LjIuMjEKICNkZWZpbmUgQ09ORklHX1NFUlZFUklQCQkxOTIuMTY4LjIuMTYKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENPTU1BTkRTCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDRkdfQ01EX0JESQl8IFwKLQkJCQkgQ0ZHX0NNRF9ESENQCXwgXAotCQkJCSBDRkdfQ01EX0VDSE8JfCBcCi0JCQkJIENGR19DTURfRU5WCXwgXAotCQkJCSBDRkdfQ01EX0ZMQVNICXwgXAotCQkJCSBDRkdfQ01EX0lNSQl8IFwKLQkJCQkgQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJIENGR19DTURfTE9BRFMJfCBcCi0JCQkJIENGR19DTURfTE9BREIJfCBcCi0JCQkJIENGR19DTURfTUVNT1JZIHwgXAotCQkJCSBDRkdfQ01EX01JU0MJfCBcCi0JCQkJIENGR19DTURfTkVUCXwgXAotCQkJCSBDRkdfQ01EX1BJTkcJfCBcCi0JCQkJIENGR19DTURfUlVOCXwgXAotCQkJCSBDRkdfQ01EX1NBVkVTCSkKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfU0FWRVMKKworI3VuZGVmIENPTkZJR19DTURfQVVUT1NDUklQVAorI3VuZGVmIENPTkZJR19DTURfQk9PVEQKKyN1bmRlZiBDT05GSUdfQ01EX0NPTlNPTEUKKyN1bmRlZiBDT05GSUdfQ01EX0ZQR0EKKyN1bmRlZiBDT05GSUdfQ01EX0lNTFMKKyN1bmRlZiBDT05GSUdfQ01EX0lURVNUCisjdW5kZWYgQ09ORklHX0NNRF9ORlMKKyN1bmRlZiBDT05GSUdfQ01EX1NFVEdFVERDUgorI3VuZGVmIENPTkZJR19DTURfWElNRworCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBNSVNDCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvRVAxUzEwLmggYi9pbmNsdWRlL2NvbmZpZ3MvRVAxUzEwLmgKaW5kZXggNmVjYTlmMi4uN2M1MjZmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0VQMVMxMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9FUDFTMTAuaApAQCAtMTU0LDI1ICsxNTQsMzUgQEAKICNkZWZpbmUgQ09ORklHX0lQQUREUgkJMTkyLjE2OC4yLjIxCiAjZGVmaW5lIENPTkZJR19TRVJWRVJJUAkJMTkyLjE2OC4yLjE2CiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDT01NQU5EUwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ0ZHX0NNRF9CREkJfCBcCi0JCQkJIENGR19DTURfREhDUAl8IFwKLQkJCQkgQ0ZHX0NNRF9FQ0hPCXwgXAotCQkJCSBDRkdfQ01EX0VOVgl8IFwKLQkJCQkgQ0ZHX0NNRF9GTEFTSAl8IFwKLQkJCQkgQ0ZHX0NNRF9JTUkJfCBcCi0JCQkJIENGR19DTURfSVJRCXwgXAotCQkJCSBDRkdfQ01EX0xPQURTCXwgXAotCQkJCSBDRkdfQ01EX0xPQURCCXwgXAotCQkJCSBDRkdfQ01EX01FTU9SWSB8IFwKLQkJCQkgQ0ZHX0NNRF9NSVNDCXwgXAotCQkJCSBDRkdfQ01EX05FVAl8IFwKLQkJCQkgQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCSBDRkdfQ01EX1JVTgl8IFwKLQkJCQkgQ0ZHX0NNRF9TQVZFUwkpCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjZGVmaW5lIENPTkZJR19DTURfQkRJCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VDSE8KKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX0lNSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0xPQURTCisjZGVmaW5lIENPTkZJR19DTURfTE9BREIKKyNkZWZpbmUgQ09ORklHX0NNRF9NRU1PUlkKKyNkZWZpbmUgQ09ORklHX0NNRF9NSVNDCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JVTgorI2RlZmluZSBDT05GSUdfQ01EX1NBVkVTCisKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIE1JU0MKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9FUDFTNDAuaCBiL2luY2x1ZGUvY29uZmlncy9FUDFTNDAuaAppbmRleCA5NzZlNzlhLi4xZmU4ZjY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvRVAxUzQwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0VQMVM0MC5oCkBAIC0xNTQsMjUgKzE1NCwzNSBAQAogI2RlZmluZSBDT05GSUdfSVBBRERSCQkxOTIuMTY4LjIuMjEKICNkZWZpbmUgQ09ORklHX1NFUlZFUklQCQkxOTIuMTY4LjIuMTYKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENPTU1BTkRTCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDRkdfQ01EX0JESQl8IFwKLQkJCQkgQ0ZHX0NNRF9ESENQCXwgXAotCQkJCSBDRkdfQ01EX0VDSE8JfCBcCi0JCQkJIENGR19DTURfRU5WCXwgXAotCQkJCSBDRkdfQ01EX0ZMQVNICXwgXAotCQkJCSBDRkdfQ01EX0lNSQl8IFwKLQkJCQkgQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJIENGR19DTURfTE9BRFMJfCBcCi0JCQkJIENGR19DTURfTE9BREIJfCBcCi0JCQkJIENGR19DTURfTUVNT1JZIHwgXAotCQkJCSBDRkdfQ01EX01JU0MJfCBcCi0JCQkJIENGR19DTURfTkVUCXwgXAotCQkJCSBDRkdfQ01EX1BJTkcJfCBcCi0JCQkJIENGR19DTURfUlVOCXwgXAotCQkJCSBDRkdfQ01EX1NBVkVTCSkKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9CREkKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUNITworI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfSU1JCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTE9BRFMKKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEQgorI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX01JU0MKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUlVOCisjZGVmaW5lIENPTkZJR19DTURfU0FWRVMKKwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogTUlTQwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0VQODh4LmggYi9pbmNsdWRlL2NvbmZpZ3MvRVA4OHguaAppbmRleCA3Mzg3NjNiLi44OWUwZWViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvRVA4OHguaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvRVA4OHguaApAQCAtNTAsMTUgKzUwLDI1IEBACiAjZGVmaW5lIENGR184eHhfQ1BVQ0xLX01JTgkJNDAwMDAwMDAKICNkZWZpbmUgQ0ZHXzh4eF9DUFVDTEtfTUFYCQkxMzMwMDAwMDAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCAgXAotCQkJCXwgQ0ZHX0NNRF9ESENQICAgXAotCQkJCXwgQ0ZHX0NNRF9JTU1BUCAgXAotCQkJCXwgQ0ZHX0NNRF9NSUkgICAgXAotCQkJCXwgQ0ZHX0NNRF9QSU5HICAgXAotCQkJCSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLS8qIFRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUJCS8qIEF1dG9ib290IGFmdGVyIDUgc2Vjb25kcwkqLwogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIGZlMDYwMDAwIgkvKiBBdXRvYm9vdCBjb21tYW5kCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvRVJJQy5oIGIvaW5jbHVkZS9jb25maWdzL0VSSUMuaAppbmRleCBjMjAzYWVhLi41ZDQ4ZDJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvRVJJQy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9FUklDLmgKQEAgLTk2LDIzICs5NiwyNiBAQAogI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudAkJKi8KICNkZWZpbmUgQ09ORklHX1BIWV9BRERSCQkxCS8qIFBIWSBhZGRyZXNzCQkJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0VOVgl8IFwKLQkJCQlDRkdfQ01EX0ZMQVNIKQogCiAvKgotICogI2RlZmluZSBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QQ0kgfCBDRkdfQ01EX0lSUSB8IFwKLSAqCQkJCSBDRkdfQ01EX0tHREIgfCBDRkdfQ01EX0kyQyB8IENGR19DTURfRUVQUk9NIHwgXAotICoJCQkJIENGR19DTURfRU5WIHwgQ0ZHX0NNRF9GTEFTSCkKKyAqIEJPT1RQIG9wdGlvbnMKICAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAotLyogQ0ZHX0NNRF9FTlYgZXN0IGRlZmluaWUgKi8KLS8qCSgoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BDSSB8IENGR19DTURfSVJRIHwgQ0ZHX0NNRF9LR0RCKSAmIH4oQ0ZHX0NNRF9FTlYpKQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCiAgKi8KLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC0xMjEsNyArMTI0LDcgQEAKICAqLwogI3VuZGVmCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zMjUsNyArMzI4LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTgxOTIJLyogRm9yIEFNQ0MgNDA1IENQVXMJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCkBAIC0zNjUsNyArMzY4LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9FU1RFRU0xOTJFLmggYi9pbmNsdWRlL2NvbmZpZ3MvRVNURUVNMTkyRS5oCmluZGV4IGIxNzZjNmYuLjY2ZTEyMDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9FU1RFRU0xOTJFLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0VTVEVFTTE5MkUuaApAQCAtNzAsMTAgKzcwLDIxIEBACiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKwogCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSJCT09UOiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9FVFgwOTQuaCBiL2luY2x1ZGUvY29uZmlncy9FVFgwOTQuaAppbmRleCBkNTVlYjdkLi5lZDQzOWIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvRVRYMDk0LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0VUWDA5NC5oCkBAIC04MiwxNyArODIsMjkgQEAKIAogI2RlZmluZQlDT05GSUdfU1RBVFVTX0xFRAkxCS8qIFN0YXR1cyBMRUQgZW5hYmxlZAkJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE3OSw3ICsxOTEsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvRVZCNjQyNjAuaCBiL2luY2x1ZGUvY29uZmlncy9FVkI2NDI2MC5oCmluZGV4IDc4ZTU3MTYuLjFjNDRhMGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9FVkI2NDI2MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9FVkI2NDI2MC5oCkBAIC0xMDMsMjEgKzEwMywzMCBAQAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogI3VuZGVmCUNPTkZJR19BTFRJVkVDICAgICAgICAgICAgICAgICAgLyogdW5kZWYgdG8gZGlzYWJsZSAgICAgICAgICAgICAqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCiAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9BU0tFTlYpCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTM5MSw3ICs0MDAsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgYWxsIE1QQzc0eHggQ1BVcwkJICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0VYQklUR0VOLmggYi9pbmNsdWRlL2NvbmZpZ3MvRVhCSVRHRU4uaAppbmRleCBkODViZTQyLi5hM2YzOGJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvRVhCSVRHRU4uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvRVhCSVRHRU4uaApAQCAtODIsMTAgKzgyLDIxIEBACiAjZGVmaW5lIENPTkZJR19NSUkJCTEJLyogTUlJIFBIWSBtYW5hZ2VtZW50CQkqLwogI2RlZmluZSBDT05GSUdfUEhZX0FERFIJCTAJLyogUEhZIGFkZHJlc3MJCQkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtOTQsNyArMTA1LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjA2LDcgKzIxNyw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvRkFEUzgyMy5oIGIvaW5jbHVkZS9jb25maWdzL0ZBRFM4MjMuaAppbmRleCAxYjU2MmQ2Li5hNTYyYjJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvRkFEUzgyMy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9GQURTODIzLmgKQEAgLTQ2LDcgKzQ2LDYgQEAKICNkZWZpbmUgQ0ZHX0kyQ19TUEVFRAkJNDAwMDAwCS8qIEkyQyBzcGVlZCBhbmQgc2xhdmUgYWRkcmVzcyAqLwogI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCiAKLS8qTm93IGluY2x1ZGVkIGJ5IENGR19DTURfUENNQ0lBICovCiAvKiNkZWZpbmUgQ09ORklHX1BDTUNJQQkJMQkvICogVG8gZW5hYmxlIFBDTUNJQSBzdXBwb3J0ICovCiAKIC8qIFZpZGVvIHJlbGF0ZWQgKi8KQEAgLTEwNSwxNyArMTA0LDM5IEBACiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwlDT05GSUdfQk9PVFBfQUxMCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfTklTRE9NQUlOCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMyCisjZGVmaW5lIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9OVFBTRVJWRVIKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1RJTUVPRkZTRVQKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkJIjo+IgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xOTAsNyArMjExLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0ZBRFM4NTBTQVIuaCBiL2luY2x1ZGUvY29uZmlncy9GQURTODUwU0FSLmgKaW5kZXggMmE5ODZmMC4uYzhjZTI1OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0ZBRFM4NTBTQVIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvRkFEUzg1MFNBUi5oCkBAIC02MSwxNSArNjEsMjggQEAKIAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI3VuZGVmCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCQkiOj4iCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xNDgsNyArMTYxLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0ZMQUdBRE0uaCBiL2luY2x1ZGUvY29uZmlncy9GTEFHQURNLmgKaW5kZXggOGJhYmVlMS4uNDMxODQ0YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0ZMQUdBRE0uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvRkxBR0FETS5oCkBAIC02MiwyMSArNjIsMzkgQEAKIC8qI2RlZmluZQlDT05GSUdfV0FUQ0hET0cqLwkvKiB3YXRjaGRvZyBlbmFibGVkCQkqLwogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAoQ0ZHX0NNRF9CREkgfCBDRkdfQ01EX0lNSSB8IENGR19DTURfQ0FDSEUgfCBcCi0JCUNGR19DTURfTUVNT1JZIHwgQ0ZHX0NNRF9GTEFTSCB8IENGR19DTURfTE9BREIgfCBDRkdfQ01EX0xPQURTIHwgXAotCQlDRkdfQ01EX0VOViB8IENGR19DTURfUkVHSU5GTyB8IENGR19DTURfSU1NQVAgfCBDRkdfQ01EX05FVCkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisKKyNkZWZpbmUgQ09ORklHX0NNRF9CREkKKyNkZWZpbmUgQ09ORklHX0NNRF9JTUkKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfTE9BREIKKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEUworI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9JTU1BUAorI2RlZmluZSBDT05GSUdfQ01EX05FVAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIkVFRz4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTUyLDcgKzE3MCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9GUFM4NTBMLmggYi9pbmNsdWRlL2NvbmZpZ3MvRlBTODUwTC5oCmluZGV4IDBkZDIxYmMuLjMyMjE1OGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9GUFM4NTBMLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0ZQUzg1MEwuaApAQCAtNjAsMjQgKzYwLDQ1IEBACiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwlDT05GSUdfQk9PVFBfQUxMCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAoIENPTkZJR19DTURfREZMICYJCX4oIFwKLQkJCQkJQ0ZHX0NNRF9DT05TT0xFCXwgXAotCQkJCQlDRkdfQ01EX0JESQl8IFwKLQkJCQkJQ0ZHX0NNRF9MT0FEUwl8IFwKLQkJCQkJQ0ZHX0NNRF9MT0FEQgl8IFwKLQkJCQkJQ0ZHX0NNRF9DQUNIRQkpICkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfTklTRE9NQUlOCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMyCisjZGVmaW5lIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9OVFBTRVJWRVIKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1RJTUVPRkZTRVQKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI3VuZGVmIENPTkZJR19DTURfQ09OU09MRQorI3VuZGVmIENPTkZJR19DTURfQkRJCisjdW5kZWYgQ09ORklHX0NNRF9MT0FEUworI3VuZGVmIENPTkZJR19DTURfTE9BREIKKyN1bmRlZiBDT05GSUdfQ01EX0NBQ0hFCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTYwLDcgKzE4MSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9GUFM4NjBMLmggYi9pbmNsdWRlL2NvbmZpZ3MvRlBTODYwTC5oCmluZGV4IDQyM2Q3NGUuLmY4Njk4YjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9GUFM4NjBMLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0ZQUzg2MEwuaApAQCAtNTgsMjYgKzU4LDQ1IEBACiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwlDT05GSUdfQk9PVFBfQUxMCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX05JU0RPTUFJTgorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUworI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TMgorI2RlZmluZSBDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfTlRQU0VSVkVSCisjZGVmaW5lIENPTkZJR19CT09UUF9USU1FT0ZGU0VUCiAKICNkZWZpbmUJQ09ORklHX1JUQ19NUEM4eHgJCS8qIHVzZSBpbnRlcm5hbCBSVEMgb2YgTVBDOHh4CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xNjAsNyArMTc5LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0cyMDAwLmggYi9pbmNsdWRlL2NvbmZpZ3MvRzIwMDAuaAppbmRleCBkYjQyZmQwLi45YzcxM2M2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvRzIwMDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvRzIwMDAuaApAQCAtODgsMjAgKzg4LDMyIEBACiAjZGVmaW5lIENPTkZJR19QSFlfQ0xLX0ZSRVEJRU1BQ19TVEFDUl9DTEtfNjZNSFogLyogNjYgTUh6IE9QQiBjbG9jayovCiAjZW5kaWYKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX0JTUAl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKwogCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTEyMCw3ICsxMzIsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zMjQsNyArMzM2LDcgQEAKICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkvKiBGb3IgQU1DQyA0MDUgQ1BVcywgb2xkZXIgNDA1IHBwYydzCSovCiAJCQkJCS8qIGhhdmUgb25seSA4a0IsIDE2a0IgaXMgc2F2ZSBoZXJlCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9HRU44NjBULmggYi9pbmNsdWRlL2NvbmZpZ3MvR0VOODYwVC5oCmluZGV4IDY2MTNmOTAuLmJmYmYzYTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9HRU44NjBULmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0dFTjg2MFQuaApAQCAtMTMyLDkgKzEzMiwxMiBAQAogLyoKICAqIEJPT1RQIG9wdGlvbnMKICAqLwotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkJCQkoIENPTkZJR19CT09UUF9ERUZBVUxUCQl8IFwKLQkJCQkJCQkJCSAgCSAgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSAgIFwKLQkJCQkJCQkJCQkpCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKIC8qCiAgKiBUaGUgR0VOODYwVCBuZXR3b3JrIGludGVyZmFjZSB1c2VzIHRoZSBvbi1jaGlwIDEwLzEwMCBGRUMgd2l0aApAQCAtMjIyLDM1ICsyMjUsMzAgQEAKIAkJCQkJCQkJQ0ZHX1BPU1RfVUFSVAkJfCBcCiAJCQkJCQkJCUNGR19QT1NUX1NQUiApCiAKLSNpZmRlZiBDT05GSUdfUE9TVAotI2RlZmluZSBDRkdfQ01EX1BPU1RfRElBRyBDRkdfQ01EX0RJQUcKLSNlbHNlCi0jZGVmaW5lIENGR19DTURfUE9TVF9ESUFHCQkwCi0jZW5kaWYKIAogLyoKLSAqIExpc3Qgb2YgYXZhaWxhYmxlIG1vbml0b3IgY29tbWFuZHMuICBVc2UgdGhlIHN5c3RlbSBkZWZhdWx0IGxpc3QKLSAqIHBsdXMgYWRkIHNvbWUgb2YgdGhlICJub24tc3RhbmRhcmQiIGNvbW1hbmRzIGJhY2sgaW4uCi0gKiBTZWUgLi9jbWRfY29uZmRlZnMuaAorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCiAgKi8KLSNkZWZpbmUgQkFTRV9DT05GSUdfQ09NTUFORFMJKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQkJCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQkJCQkJQ0ZHX0NNRF9JMkMJCXwgXAotCQkJCQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQkJCQkJQ0ZHX0NNRF9SRUdJTkZPCXwgXAotCQkJCQkJCQlDRkdfQ01EX0lNTUFQCXwgXAotCQkJCQkJCQlDRkdfQ01EX0VMRgkJfCBcCi0JCQkJCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQkJCQkJQ0ZHX0NNRF9GUEdBCXwgXAotCQkJCQkJCQlDRkdfQ01EX01JSSAJfCBcCi0JCQkJCQkJCUNGR19DTURfQkVEQlVHCXwgXAotCQkJCQkJCQlDRkdfQ01EX1BPU1RfRElBRyApCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX0lNTUFQCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0ZQR0EKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9CRURCVUcKIAogI2lmICFkZWZpbmVkKENPTkZJR19TQykKLSNkZWZpbmUJQ09ORklHX0NPTU1BTkRTICggQkFTRV9DT05GSUdfQ09NTUFORFMgfCBDRkdfQ01EX0RPQyApCi0jZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJQkFTRV9DT05GSUdfQ09NTUFORFMKKyAgICAjZGVmaW5lIENPTkZJR19DTURfRE9DCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QT1NUCisjZGVmaW5lIENPTkZJR19DTURfRElBRwogI2VuZGlmCiAKIC8qCkBAIC0yNzksMTEgKzI3Nyw2IEBACiAjZGVmaW5lIENGR19GUEdBX1BST0dfRkVFREJBQ0sKIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUaGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgYW55IENPTkZJR19DT01NQU5EUwotICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KICNkZWZpbmUgQ0ZHX05BTkRfTEVHQUNZCiAKIC8qCkBAIC0zMDYsNyArMjk5LDcgQEAKIC8qCiAgKiBTZXQgYnVmZmVyIHNpemUgZm9yIGNvbnNvbGUgSS9PCiAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCQkJMTAyNAogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJCTI1NgpAQCAtNDcxLDcgKzQ2NCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAkJNAkvKiBsb2cgYmFzZSAyIG9mIGFib3ZlIHZhbHVlCQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9HRU5JRVRWLmggYi9pbmNsdWRlL2NvbmZpZ3MvR0VOSUVUVi5oCmluZGV4IDhjMDFkOTcuLjc4NTM1NWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9HRU5JRVRWLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0dFTklFVFYuaApAQCAtMTA1LDE1ICsxMDUsMjggQEAKIAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJCSI6PiIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTkzLDcgKzIwNiw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9HVEguaCBiL2luY2x1ZGUvY29uZmlncy9HVEguaAppbmRleCAwM2I5NjU5Li43OWY1NzE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvR1RILmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0dUSC5oCkBAIC05NywxOCArOTcsMzIgQEAKICNlcnJvciBCb3RoIENPTkZJR19TQ0MxX0VORVQgYW5kIENPTkZJR19GRUNfRU5FVCBjb25maWd1cmVkCiAjZW5kaWYKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgICAgICAgICAgICAgICAoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX0lERSkKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0lERQorCisKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19QUk9NUFQJCSI9PiIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTkwLDcgKzIwNCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9ISDQwNS5oIGIvaW5jbHVkZS9jb25maWdzL0hINDA1LmgKaW5kZXggZGM0MGViYy4uMDBmNDgxYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0hINDA1LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0hINDA1LmgKQEAgLTk4LDI2ICs5OCw0MCBAQAogI2RlZmluZSBDT05GSUdfVklERU9fQk1QX0daSVAJCS8qIGd6aXAgY29tcHJlc3NlZCBibXAgaW1hZ2VzCSovCiAjZGVmaW5lIENGR19WSURFT19MT0dPX01BWF9TSVpFCSgyIDw8IDIwKQkvKiBmb3IgZGVjb21wcmVzc2VkIGltZyAqLwogCi0jZGVmaW5lIEFERF9CTVBfQ01ECQlDRkdfQ01EX0JNUAotI2Vsc2UKLSNkZWZpbmUgQUREX0JNUF9DTUQJCTAKICNlbmRpZiAvKiBDT05GSUdfVklERU8gKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9FWFQyCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUFERF9CTVBfQ01ECXwgXAotCQkJCUNGR19DTURfRUVQUk9NICApCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfRVhUMgorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCisjaWZkZWYgQ09ORklHX1ZJREVPCisjZGVmaW5lIENPTkZJR19DTURfQk1QCisjZW5kaWYKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgpAQCAtMTI3LDkgKzE0MSw2IEBACiAjZGVmaW5lIENPTkZJR19BVVRPX1VQREFURSAgICAgIDEgICAgICAgLyogYXV0b3VwZGF0ZSB2aWEgY29tcGFjdGZsYXNoICAqLwogI3VuZGVmIENPTkZJR19BVVRPX1VQREFURV9TSE9XICAgICAgICAgIC8qIHVzZSBib2FyZCBzaG93IHJvdXRpbmUgICAgICAgKi8KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjZGVmaW5lIENGR19OQU5EX0xFR0FDWQogCiAjdW5kZWYgIENPTkZJR19CWklQMgkgLyogaW5jbHVkZSBzdXBwb3J0IGZvciBiemlwMiBjb21wcmVzc2VkIGltYWdlcyAqLwpAQCAtMTQ4LDcgKzE1OSw3IEBACiAjZGVmaW5lCUNGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTM3Nyw3ICszODgsNyBAQAogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTE2Mzg0CS8qIEZvciBBTUNDIDQwNSBDUFVzLCBvbGRlciA0MDUgcHBjJ3MgICAgKi8KIAkJCQkJLyogaGF2ZSBvbmx5IDhrQiwgMTZrQiBpcyBzYXZlIGhlcmUgICAgICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9ISURERU5fRFJBR09OLmggYi9pbmNsdWRlL2NvbmZpZ3MvSElEREVOX0RSQUdPTi5oCmluZGV4IDY4NjQ3NDAuLjI2ZGQ5NTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9ISURERU5fRFJBR09OLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0hJRERFTl9EUkFHT04uaApAQCAtNTIsMTYgKzUyLDI3IEBACiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJOTYwMAogI2RlZmluZSBDT05GSUdfRFJBTV9TUEVFRAkxMDAJCS8qIE1IegkJCQkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKCBDT05GSUdfQ01EX0RGTCB8IFwKLQkJCQkgIENGR19DTURfRUVQUk9NIHwgXAotCQkJCSAgQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJICBDRkdfQ01EX0kyQwl8IFwKLQkJCQkgIENGR19DTURfTkVUCXwgXAotCQkJCSAgQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJICBDRkdfQ01EX1BJTkcJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpCSovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUElORwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMzYzLDcgKzM3NCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM4MjQwIENQVQkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvSE1JMTAuaCBiL2luY2x1ZGUvY29uZmlncy9ITUkxMC5oCmluZGV4IDdjY2U4NzYuLjAyYWU1ZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9ITUkxMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9ITUkxMC5oCkBAIC0xMTcsNyArMTE3LDE1IEBACiAKICNkZWZpbmUgQ09ORklHX0NBTl9EUklWRVIJMQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZW5hYmxlZAkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KQEAgLTEyNSwzMSArMTMzLDI1IEBACiAjZGVmaW5lIENPTkZJR19SVENfRFMxMzM3CQkvKiBVc2UgZHMxMzM3IHJ0YyB2aWEgaTJjCSovCiAjZGVmaW5lIENGR19JMkNfUlRDX0FERFIgMHg2OAkJLyogYXQgYWRkcmVzcyAweDY4CQkqLwogCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKICNpZmRlZglDT05GSUdfU1BMQVNIX1NDUkVFTgotIyBkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0JNUAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRkFUCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCi0jZWxzZQotIyBkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRkFUCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0JNUAogI2VuZGlmCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTE2NCw3ICsxNjYsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yNDcsNyArMjQ5LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0hVQjQwNS5oIGIvaW5jbHVkZS9jb25maWdzL0hVQjQwNS5oCmluZGV4IGY4NGUzNTYuLjY2MWI4OTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9IVUI0MDUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvSFVCNDA1LmgKQEAgLTYwLDE4ICs2MCwzMCBAQAogCiAjZGVmaW5lIENPTkZJR19QSFlfQ0xLX0ZSRVEJRU1BQ19TVEFDUl9DTEtfNjZNSFogLyogNjYgTUh6IE9QQiBjbG9jayovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisKIAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC04OCw3ICsxMDAsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yNzEsNyArMjgzLDcgQEAKICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkvKiBGb3IgQU1DQyA0MDUgQ1BVcywgb2xkZXIgNDA1IHBwYydzCSovCiAJCQkJCS8qIGhhdmUgb25seSA4a0IsIDE2a0IgaXMgc2F2ZSBoZXJlCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9JQUQyMTAuaCBiL2luY2x1ZGUvY29uZmlncy9JQUQyMTAuaAppbmRleCAzNWQ4NGFlLi5iZDA4OTRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvSUFEMjEwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0lBRDIxMC5oCkBAIC04NCw3ICs4NCwxNSBAQAogCiAvKiAjZGVmaW5lCUNPTkZJR19TVEFUVVNfTEVECTEqLwkvKiBTdGF0dXMgTEVEIGVuYWJsZWQJCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogIyB1bmRlZiAgQ09ORklHX1NDQzFfRU5FVAkJLyogZGlzYWJsZSBTQ0MxIGV0aGVybmV0ICovCiAjIGRlZmluZSBDT05GSUdfRkVDX0VORVQgICAgMQkvKiB1c2UgRkVDIGV0aGVybmV0ICAqLwpAQCAtMTIzLDIwICsxMzEsMjMgQEAKIAogI2RlZmluZQlDT05GSUdfUlRDX01QQzh4eAkJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHgJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfREFURQorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIxNyw3ICsyMjgsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvSUNVODYyLmggYi9pbmNsdWRlL2NvbmZpZ3MvSUNVODYyLmgKaW5kZXggY2QxNzkzNS4uMjdhNWJjMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0lDVTg2Mi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9JQ1U4NjIuaApAQCAtODEsNyArODEsMTUgQEAKIAogI2RlZmluZQlDT05GSUdfU1RBVFVTX0xFRAkxCS8qIFN0YXR1cyBMRUQgZW5hYmxlZAkJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjdW5kZWYJQ09ORklHX1NDQzFfRU5FVAkJLyogZGlzYWJsZSBTQ0MxIGV0aGVybmV0ICovCiAjZGVmaW5lCUNPTkZJR19GRUNfRU5FVAkJMQkvKiB1c2UgRkVDIGV0aGVybmV0ICAqLwpAQCAtMTIzLDI1ICsxMzEsMjggQEAKIAogI2RlZmluZQlDT05GSUdfUlRDX01QQzh4eAkJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHgJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjI4LDcgKzIzOSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9JRFM4MjQ3LmggYi9pbmNsdWRlL2NvbmZpZ3MvSURTODI0Ny5oCmluZGV4IDI5ZWI4NzQuLjg1ZDJiYjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9JRFM4MjQ3LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0lEUzgyNDcuaApAQCAtMTI4LDkgKzEyOCw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KLSAqCisgKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ09ORklHX0NNRF9ORVQgbXVzdCBiZSB1bnNldC4KICAqLwogI3VuZGVmCUNPTkZJR19FVEhFUl9PTl9TQ0MJCS8qIGRlZmluZSBpZiBldGhlciBvbiBTQ0MgICAgICAgKi8KICNkZWZpbmUJQ09ORklHX0VUSEVSX09OX0ZDQwkJLyogZGVmaW5lIGlmIGV0aGVyIG9uIEZDQyAgICAgICAqLwpAQCAtMTU5LDI0ICsxNTcsMzQgQEAKIAogI2RlZmluZQlDT05GSUdfVElNRVNUQU1QCQkvKiBQcmludCBpbWFnZSBpbmZvIHdpdGggdGltZXN0YW1wICovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUfENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX05BTkQJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfTkFORAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMzQsNyArMjQyLDcgQEAKICAqIE5BTkQtRkxBU0ggc3R1ZmYKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAKICNkZWZpbmUgQ0ZHX05BTkRfTEVHQUNZCiAjZGVmaW5lIENGR19OQU5EMF9CQVNFIDB4RTEwMDAwMDAKQEAgLTI5NSw3ICszMDMsNyBAQAogI2RlZmluZSBXUklURV9OQU5EKGQsIGFkcikgZG97ICoodm9sYXRpbGUgX191OCAqKSgodW5zaWduZWQgbG9uZykoYWRyICsgMHgwKSkgPSAoX191OClkOyB9IHdoaWxlKDApCiAjZGVmaW5lIFJFQURfTkFORChhZHIpICgodm9sYXRpbGUgdW5zaWduZWQgY2hhcikoKih2b2xhdGlsZSBfX3U4ICopKHVuc2lnbmVkIGxvbmcpKGFkciArIDB4MCkpKQogCi0jZW5kaWYgLyogQ0ZHX0NNRF9OQU5EICovCisjZW5kaWYgLyogQ09ORklHX0NNRF9OQU5EICovCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEhhcmQgUmVzZXQgQ29uZmlndXJhdGlvbiBXb3JkcwpAQCAtMzU1LDcgKzM2Myw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFICAgICAgMzIgICAgICAvKiBGb3IgTVBDODI2MCBDUFUgICAgICAgICAgICAgICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKQEAgLTQ3NCw3ICs0ODIsNyBAQAogI2RlZmluZSBDRkdfT1IwX1BSRUxJTSAgKE1FR19UT19BTShDRkdfRkxBU0hfU0laRSkgICAgICB8XAogCQkJIE9SeEdfU0NZXzZfQ0xLICAgICAgICAgICAgICAgICApCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogLyogQmFuayAxIC0gTkFORCBGbGFzaAogKi8KICNkZWZpbmUJQ0ZHX05BTkRfQkFTRQkJQ0ZHX05BTkQwX0JBU0UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9JUDg2MC5oIGIvaW5jbHVkZS9jb25maWdzL0lQODYwLmgKaW5kZXggMGUyMGU1Ni4uYmQ5NjFkOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0lQODYwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0lQODYwLmgKQEAgLTg4LDI4ICs4OCwzMiBAQAogCiAjZGVmaW5lCUNPTkZJR19USU1FU1RBTVAJCS8qIFByaW50IGltYWdlIGluZm8gd2l0aCB0aW1lc3RhbXAgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0JFREJVRwl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCUNPTkZJR19CT09UUF9ERUZBVUxUCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9CRURCVUcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMDIsNyArMjA2LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0lQSEFTRTQ1MzkuaCBiL2luY2x1ZGUvY29uZmlncy9JUEhBU0U0NTM5LmgKaW5kZXggYzE1NjVmYy4uNmZlZTQ1NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0lQSEFTRTQ1MzkuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvSVBIQVNFNDUzOS5oCkBAIC02Nyw4ICs2Nyw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICovCiAjdW5kZWYJQ09ORklHX0VUSEVSX09OX1NDQwkJLyogZGVmaW5lIGlmIGV0aGVyIG9uIFNDQyAgICovCiAjZGVmaW5lIENPTkZJR19FVEhFUl9PTl9GQ0MJCS8qIGRlZmluZSBpZiBldGhlciBvbiBGQ0MgICAqLwpAQCAtOTUsNyArOTQsMTQgQEAKICNkZWZpbmUgQ09ORklHXzgyNjBfQ0xLSU4JNjY2NjY2NjYJLyogaW4gSHogKi8KICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxOTIwMAogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVHxDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAogLyoKICAqIHNlbGVjdCBpMmMgc3VwcG9ydCBjb25maWd1cmF0aW9uCkBAIC0xMjQsMTcgKzEzMCwxOCBAQAogI2RlZmluZSBJMkNfREVMQVkJdWRlbGF5KDUpCS8qIDEvNCBJMkMgY2xvY2sgZHVyYXRpb24gKi8KICNlbmRpZiAvKiBDT05GSUdfU09GVF9JMkMgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCUNPTkZJR19DTURfREZMCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgogCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CS8qIGF1dG9ib290IGFmdGVyIDUgc2Vjb25kcyAqLwogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIDEwMDAwMCIJLyogYXV0b2Jvb3QgY29tbWFuZCAqLwogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MJCSJyb290PS9kZXYvcmFtIHJ3IgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICN1bmRlZglDT05GSUdfS0dEQl9PTl9TTUMJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIFNNQyAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9PTl9TQ0MJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIFNDQyAqLwogI3VuZGVmCUNPTkZJR19LR0RCX05PTkUJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIHNvbWV0aGluZyBlbHNlICovCkBAIC0xNDksNyArMTU2LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjU3LDcgKzI2NCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyICAgICAvKiBGb3IgTVBDODI2MCBDUFUJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNSAgICAgIC8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0lTUEFOLmggYi9pbmNsdWRlL2NvbmZpZ3MvSVNQQU4uaAppbmRleCA3MDZiZGI5Li45NjViNTE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvSVNQQU4uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvSVNQQU4uaApAQCAtNTgsOCArNTgsNyBAQAogICogZm9yIEZDQykuCiAgKgogICogSWYgQ09ORklHX0VUSEVSX05PTkUgaXMgZGVmaW5lZCwgdGhlbiBlaXRoZXIgdGhlIEV0aGVybmV0IHJvdXRpbmVzIG11c3QKLSAqIGJlIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDRkdfQ01EX05FVCBtdXN0IGJlIHJlbW92ZWQKLSAqIGZyb20gQ09ORklHX0NPTU1BTkRTIHRvIHJlbW92ZSBzdXBwb3J0IGZvciBuZXR3b3JraW5nLgorICogYmUgZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUIG11c3QgYmUgdW5zZXQuCiAgKi8KICN1bmRlZglDT05GSUdfRVRIRVJfT05fU0NDCQkvKiBEZWZpbmUgaWYgRXRoZXJuZXQgb24gU0NDCQkqLwogI2RlZmluZSBDT05GSUdfRVRIRVJfT05fRkNDCQkvKiBEZWZpbmUgaWYgRXRoZXJuZXQgb24gRkNDCQkqLwpAQCAtMTA2LDE3ICsxMDUsMjggQEAKICNkZWZpbmUgQ09ORklHXzgyNjBfQ0xLSU4JNjU1MzYwMDAJLyogaW4gSHogKi8KICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkzODQwMAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKCBDT05GSUdfQ01EX0RGTCAgXAotCQkJCXwgQ0ZHX0NNRF9BU0tFTlYgIFwKLQkJCQl8IENGR19DTURfREhDUCAgICBcCi0JCQkJfCBDRkdfQ01EX0lNTUFQICAgXAotCQkJCXwgQ0ZHX0NNRF9NSUkgICAgIFwKLQkJCQl8IENGR19DTURfUElORyAgICBcCi0JCQkJfCBDRkdfQ01EX1JFR0lORk8gXAotCQkJCSkKIAotLyogVGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JTU1BUAorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUJCS8qIGF1dG9ib290IGFmdGVyIDUgc2Vjb25kcwkqLwogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIGZlMDEwMDAwIgkvKiBhdXRvYm9vdCBjb21tYW5kCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvSVZNTDI0LmggYi9pbmNsdWRlL2NvbmZpZ3MvSVZNTDI0LmgKaW5kZXggYTBjYjFkZC4uMTE0MmYyYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0lWTUwyNC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9JVk1MMjQuaApAQCAtNzIsMjQgKzcyLDMzIEBACiAKICNkZWZpbmUJQ09ORklHX1NUQVRVU19MRUQJMQkvKiBTdGF0dXMgTEVEIGVuYWJsZWQJCSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX0lERSkKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKworCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sgXAotICAgICgoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKSAmIH5DT05GSUdfQk9PVFBfR0FURVdBWSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTgyLDcgKzE5MSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9JVk1TOC5oIGIvaW5jbHVkZS9jb25maWdzL0lWTVM4LmgKaW5kZXggNDZiNGQ1My4uYmQxOWRhZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0lWTVM4LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0lWTVM4LmgKQEAgLTcyLDI0ICs3MiwzMiBAQAogCiAjZGVmaW5lCUNPTkZJR19TVEFUVVNfTEVECTEJLyogU3RhdHVzIExFRCBlbmFibGVkCQkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9JREUpCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0lERQorCisKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSyBcCi0gICAgKChDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpICYgfkNPTkZJR19CT09UUF9HQVRFV0FZKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xNzksNyArMTg3LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0ljZUN1YmUuaCBiL2luY2x1ZGUvY29uZmlncy9JY2VDdWJlLmgKaW5kZXggNzNiZTA2OS4uNTMyNjE1NDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9JY2VDdWJlLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0ljZUN1YmUuaApAQCAtMzcsMTEgKzM3LDYgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAgKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QJICAgICAqLwogCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKLSMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KLSNlbmRpZgotCiAvKgogICogU2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgogICovCkBAIC02OSw3ICs2NCw2IEBACiAjZGVmaW5lIENPTkZJR19QQ0lfSU9fQlVTCTB4NTAwMDAwMDAKICNkZWZpbmUgQ09ORklHX1BDSV9JT19QSFlTCUNPTkZJR19QQ0lfSU9fQlVTCiAjZGVmaW5lIENPTkZJR19QQ0lfSU9fU0laRQkweDAxMDAwMDAwCi0jZGVmaW5lIEFERF9QQ0lfQ01EIAkJQ0ZHX0NNRF9QQ0kKICNlbmRpZgogCiAjZGVmaW5lIENGR19YTEJfUElQRUxJTklORwkxCkBAIC04MCwxMSArNzQsOCBAQAogI2RlZmluZSBDRkdfUlhfRVRIX0JVRkZFUgk4ICAvKiB1c2UgOCByeCBidWZmZXIgb24gZWVwcm8xMDAgICovCiAjZGVmaW5lIENPTkZJR19OUzgzODJYCQkxCiAKLSNlbHNlCS8qIE1QQzUxMDAgKi8KLQorI2Vsc2UKICNkZWZpbmUgQ09ORklHX01JSQkJMQotI2RlZmluZSBBRERfUENJX0NNRAkJMCAgLyogbm8gQ0ZHX0NNRF9QQ0kgKi8KLQogI2VuZGlmCiAKIC8qIFBhcnRpdGlvbnMgKi8KQEAgLTkzLDMxICs4NCw0NCBAQAogI2RlZmluZSBDT05GSUdfSVNPX1BBUlRJVElPTgogCiAvKiBVU0IgKi8KLSNpZiAxCi0jZGVmaW5lIENPTkZJR19VU0JfT0hDSQotI2RlZmluZSBBRERfVVNCX0NNRCAgICAgICAgICAgICBDRkdfQ01EX1VTQiB8IENGR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19VU0JfT0hDSV9ORVcKICNkZWZpbmUgQ09ORklHX1VTQl9TVE9SQUdFCi0jZWxzZQotI2RlZmluZSBBRERfVVNCX0NNRCAgICAgICAgICAgICAwCi0jZW5kaWYKKyNkZWZpbmUgQ0ZHX09IQ0lfQkVfQ09OVFJPTExFUgorI3VuZGVmIENGR19VU0JfT0hDSV9CT0FSRF9JTklUCisjZGVmaW5lIENGR19VU0JfT0hDSV9DUFVfSU5JVAkxCisjZGVmaW5lIENGR19VU0JfT0hDSV9SRUdTX0JBU0UJTVBDNVhYWF9VU0IKKyNkZWZpbmUgQ0ZHX1VTQl9PSENJX1NMT1RfTkFNRQkibXBjNTIwMCIKKyNkZWZpbmUgQ0ZHX1VTQl9PSENJX01BWF9ST09UX1BPUlRTCTE1CiAKICNkZWZpbmUJQ09ORklHX1RJTUVTVEFNUAkJLyogUHJpbnQgaW1hZ2UgaW5mbyB3aXRoIHRpbWVzdGFtcCAqLwogCi0vKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCi0gKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCXwgXAotCQkJCUFERF9QQ0lfQ01ECXwgXAotCQkJCUFERF9VU0JfQ01ECSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKyNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNlbmRpZgorCiAKICNpZiAoVEVYVF9CQVNFID09IDB4RkYwMDAwMDApCQkvKiBCb290IGxvdyB3aXRoIDE2IE1CIEZsYXNoICovCiAjICAgZGVmaW5lIENGR19MT1dCT09UCSAgICAgICAgMQpAQCAtMzEyLDcgKzMxNiw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJICAgICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCkBAIC0zMjgsNiArMzMyLDExIEBACiAKICNkZWZpbmUgQ0ZHX0haCQkJMTAwMAkvKiBkZWNyZW1lbnRlciBmcmVxOiAxIG1zIHRpY2tzICovCiAKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKyNlbmRpZgorCiAvKgogICogVmFyaW91cyBsb3ctbGV2ZWwgc2V0dGluZ3MKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0pTRS5oIGIvaW5jbHVkZS9jb25maWdzL0pTRS5oCmluZGV4IGNjZDFmMTkuLmVhM2IwYjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9KU0UuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvSlNFLmgKQEAgLTQ5LDYgKzQ5LDcgQEAKICAgLyogTWFwIHRoZSBTeXN0ZW1BQ0UgY2hpcCAoQ1MjMSkgaGVyZS4gKE11c3QgYmUgYSBtdWx0aXBsZSBvZiAxTWVnKSAqLwogI2RlZmluZSBDT05GSUdfU1lTVEVNQUNFIDEKICNkZWZpbmUgQ0ZHX1NZU1RFTUFDRV9CQVNFIDB4ZjAwMDAwMDAKKyNkZWZpbmUgQ0ZHX1NZU1RFTUFDRV9XSURUSCA4CiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OIDEKIAogICAvKiBVc2UgdGhlIE9uLUNoaXAtTWVtb3J5IChPQ00pIGFzIGEgdGVtcG9yYXJ5IHN0YWNrIGZvciB0aGUgc3RhcnR1cCBjb2RlLiAqLwpAQCAtMTM0LDIwICsxMzUsMzIgQEAKICNkZWZpbmUgQ09ORklHX01JSQkJMQkvKiBNSUkgUEhZIG1hbmFnZW1lbnQJCSovCiAjZGVmaW5lIENPTkZJR19QSFlfQUREUgkJMQkvKiBQSFkgYWRkcmVzcwkJCSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfRkFUCXwgXAotCQkJCUNGR19DTURfRkxBU0gJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKwogCiAgIC8qIHdhdGNoZG9nIGRpc2FibGVkICovCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCkBAIC0xNjYsNyArMTc5LDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjcxLDcgKzI4NCw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkvKiBGb3IgQU1DQyA0MDVHUHIgQ1BVcwkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCkBAIC0yOTcsNyArMzEwLDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9LQVJFRi5oIGIvaW5jbHVkZS9jb25maWdzL0tBUkVGLmgKaW5kZXggMmFkNmYwNi4uMzY0NGU0MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0tBUkVGLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0tBUkVGLmgKQEAgLTM4LDYgKzM4LDcgQEAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjZGVmaW5lIENPTkZJR19LQVJFRgkgICAgIDEJCS8qIEJvYXJkIGlzIEthbWlubyBSZWYgVmFyaWFudCAqLwogI2RlZmluZSBDT05GSUdfNDQwR1gJCSAgMQkgICAgIC8qIFNwZWNpZmMgR1ggc3VwcG9ydAkqLworI2RlZmluZSBDT05GSUdfNDQwCQkgIDEJICAgICAvKiAuLi4gUFBDNDQwIGZhbWlseQkqLwogI2RlZmluZSBDT05GSUdfNHh4CQkgIDEJICAgICAvKiAuLi4gUFBDNHh4IGZhbWlseQkqLwogI2RlZmluZSBDT05GSUdfQk9BUkRfRUFSTFlfSU5JVF9GIDEJICAgICAvKiBDYWxsIGJvYXJkX3ByZV9pbml0CSovCiAjZGVmaW5lIENPTkZJR19NSVNDX0lOSVRfRgkgIDEJICAgICAvKiBDYWxsIGJvYXJkIG1pc2NfaW5pdF9mCSovCkBAIC0xNzcsMjMgKzE3OCwzNCBAQAogI2RlZmluZSBDRkdfUlhfRVRIX0JVRkZFUiAgICAgMzIJICAgICAvKiAjZXRoIHJ4IGJ1ZmYgJiBkZXNjcnMJKi8KIAogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb25zb2xlL0NvbW1hbmRzL1BhcnNlcgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0JFREJVRwl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9ESUFHCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkVUCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfRkFUKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKwogCiAvKiBJbmNsdWRlIE5ldENvbnNvbGUgc3VwcG9ydCAqLwogI2RlZmluZSBDT05GSUdfTkVUQ09OU09MRQpAQCAtMjAyLDEwICsyMTQsNiBAQAogI2RlZmluZSBDT05GSUdfQVVUT19DT01QTEVURSAxCiAjZGVmaW5lIENGR19BTFRfTUVNVEVTVAkgICAgIDEJICAgICAvKiB1c2UgcmVhbCBtZW1vcnkgdGVzdAkgKi8KIAotCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJICAgICAvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSAgICAgICJLYVJlZkRlcz0+ICIgIC8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KIApAQCAtMjE2LDcgKzIyNCw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBDb25zb2xlIEJ1ZmZlcgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCSAgICAgIDEwMjQJICAgICAvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkgICAgICAyNTYJICAgICAvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtMjYyLDcgKzI3MCw2IEBACiAjZGVmaW5lIENGR19QQ0lfVEFSR0JBU0UgICAgICAoQ0ZHX1BDSV9NRU1CQVNFKQogCiAvKiBCb2FyZC1zcGVjaWZpYyBQQ0kgKi8KLSNkZWZpbmUgQ0ZHX1BDSV9QUkVfSU5JVAkJICAgICAvKiBlbmFibGUgYm9hcmQgcGNpX3ByZV9pbml0Ki8KICNkZWZpbmUgQ0ZHX1BDSV9UQVJHRVRfSU5JVAkJICAgICAvKiBsZXQgYm9hcmQgaW5pdCBwY2kgdGFyZ2V0Ki8KIAogI2RlZmluZSBDRkdfUENJX1NVQlNZU19WRU5ET1JJRCAweDE3QkEJICAgICAvKiBTYW5kYnVyc3QgKi8KQEAgLTI3OSw3ICsyODYsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkgICAgICA4MTkyCSAgICAgLyogRm9yIEFNQ0MgNDA1IENQVXMJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFICAgIDMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVCAgIDUJCSAgICAgLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgKi8KICNlbmRpZgogCkBAIC0yOTEsNyArMjk4LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkgICAgICAweDAxCSAgICAgLyogTm9ybWFsIFBvd2VyT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCSAgICAgIDB4MDIJICAgICAvKiBTb2Z0d2FyZSByZWJvb3QgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFICAyMzA0MDAJICAgICAvKiBrZ2RiIHNlcmlhbCBwb3J0IGJhdWQJKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYIDIJCSAgICAgLyoga2dkYiBzZXJpYWwgcG9ydAkqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvS1VQNEsuaCBiL2luY2x1ZGUvY29uZmlncy9LVVA0Sy5oCmluZGV4IDliOTUwZmMuLmY2YzMxZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9LVVA0Sy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9LVVA0Sy5oCkBAIC04OSw3ICs4OSwxNSBAQAogCiAjdW5kZWYJQ09ORklHX0NBTl9EUklWRVIJCS8qIENBTiBEcml2ZXIgc3VwcG9ydCBkaXNhYmxlZAkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KQEAgLTE1NiwzMiArMTY0LDMxIEBACiAjZGVmaW5lIENPTkZJR19QT1NUCQkoQ0ZHX1BPU1RfQ1BVCSAgIHwgXAogCQkJCSBDRkdfUE9TVF9SVEMJICAgfCBcCiAJCQkJIENGR19QT1NUX0kyQykKKyNlbmRpZgorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCiAKICNpZmRlZiBDT05GSUdfUE9TVAotI2RlZmluZSBDRkdfQ01EX1BPU1RfRElBRyBDRkdfQ01EX0RJQUcKLSNlbHNlCi0jZGVmaW5lIENGR19DTURfUE9TVF9ESUFHIDAKKyAgICAjZGVmaW5lIENPTkZJR19DTURfRElBRwogI2VuZGlmCi0jZW5kaWYKLQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUE9TVF9ESUFHCXwgXAotCQkJCUNGR19DTURfU05UUAkpCi0KLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjY5LDcgKzI3Niw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9LVVA0WC5oIGIvaW5jbHVkZS9jb25maWdzL0tVUDRYLmgKaW5kZXggY2QzOGIwZi4uZTU1OGFhNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL0tVUDRYLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL0tVUDRYLmgKQEAgLTk5LDcgKzk5LDE1IEBACiAKICN1bmRlZglDT05GSUdfQ0FOX0RSSVZFUgkJLyogQ0FOIERyaXZlciBzdXBwb3J0IGRpc2FibGVkCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgpAQCAtMTY3LDM0ICsxNzUsMzMgQEAKICNkZWZpbmUgQ09ORklHX1BPU1QJCShDRkdfUE9TVF9DUFUJICAgfCBcCiAJCQkJIENGR19QT1NUX1JUQwkgICB8IFwKIAkJCQkgQ0ZHX1BPU1RfSTJDKQorI2VuZGlmCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKyNkZWZpbmUgQ09ORklHX0NNRF9VU0IKIAogI2lmZGVmIENPTkZJR19QT1NUCi0jZGVmaW5lIENGR19DTURfUE9TVF9ESUFHIENGR19DTURfRElBRwotI2Vsc2UKLSNkZWZpbmUgQ0ZHX0NNRF9QT1NUX0RJQUcgMAorICAgICNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCiAjZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QT1NUX0RJQUcJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCXwgXAotCQkJCUNGR19DTURfVVNCCSkKLQotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yODEsNyArMjg4LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL0xBTlRFQy5oIGIvaW5jbHVkZS9jb25maWdzL0xBTlRFQy5oCmluZGV4IGU0NGYxY2MuLjQ2ZWRkMDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9MQU5URUMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTEFOVEVDLmgKQEAgLTc0LDY0ICs3NCw2OCBAQAogCiAjZGVmaW5lCUNPTkZJR19TVEFUVVNfTEVECTEJLyogU3RhdHVzIExFRCBlbmFibGVkCQkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCi0jZGVmaW5lIENPTkZJR19DTURfTUlOSU1BTAkwCi0jZGVmaW5lIENPTkZJR19DTURfVElOWQkJKENGR19DTURfRkxBU0ggIHwgXAotCQkJCSBDRkdfQ01EX01FTU9SWSB8IFwKLQkJCQkgQ0ZHX0NNRF9MT0FEUyAgfCBcCi0JCQkJIENGR19DTURfTE9BREIpCi0jZGVmaW5lIENPTkZJR19DTURfTk9STUFMCShDT05GSUdfQ01EX0RGTCAmIH5DRkdfQ01EX0JPT1REICYgfkNGR19DTURfUkVJU0VSKQotI2RlZmluZSBDT05GSUdfQ01EX0dEQgkJKENPTkZJR19DTURfTk9STUFMIHwgQ0ZHX0NNRF9LR0RCKQotI2RlZmluZSBDT05GSUdfQ01EX0ZVTEwJCShDRkdfQ01EX0FMTCAmIH5DRkdfQ01EX0JFREJVRwlcCi0JCQkJCSAgICAgJiB+Q0ZHX0NNRF9CTVAJXAotCQkJCQkgICAgICYgfkNGR19DTURfQlNQCVwKLQkJCQkJICAgICAmIH5DRkdfQ01EX0RJU1BMQVkJXAotCQkJCQkgICAgICYgfkNGR19DTURfRE9DCVwKLQkJCQkJICAgICAmIH5DRkdfQ01EX0RUVAlcCi0JCQkJCSAgICAgJiB+Q0ZHX0NNRF9FRVBST00JXAotCQkJCQkgICAgICYgfkNGR19DTURfRUxGCVwKLQkJCQkJICAgICAmIH5DRkdfQ01EX0VYVDIJXAotCQkJCQkgICAgICYgfkNGR19DTURfRkRDCVwKLQkJCQkJICAgICAmIH5DRkdfQ01EX0ZET1MJXAotCQkJCQkgICAgICYgfkNGR19DTURfSFdGTE9XCVwKLQkJCQkJICAgICAmIH5DRkdfQ01EX0kyQwlcCi0JCQkJCSAgICAgJiB+Q0ZHX0NNRF9JREUJXAotCQkJCQkgICAgICYgfkNGR19DTURfSVJRCVwKLQkJCQkJICAgICAmIH5DRkdfQ01EX0pGRlMyCVwKLQkJCQkJICAgICAmIH5DRkdfQ01EX0tHREIJXAotCQkJCQkgICAgICYgfkNGR19DTURfTUlJCVwKLQkJCQkJICAgICAmIH5DRkdfQ01EX01NQwlcCi0JCQkJCSAgICAgJiB+Q0ZHX0NNRF9OQU5ECVwKLQkJCQkJICAgICAmIH5DRkdfQ01EX1BDSQlcCi0JCQkJCSAgICAgJiB+Q0ZHX0NNRF9QQ01DSUEJXAotCQkJCQkgICAgICYgfkNGR19DTURfUkVJU0VSCVwKLQkJCQkJICAgICAmIH5DRkdfQ01EX1NDU0kJXAotCQkJCQkgICAgICYgfkNGR19DTURfU1BJCVwKLQkJCQkJICAgICAmIH5DRkdfQ01EX1VOSVZFUlNFXAotCQkJCQkgICAgICYgfkNGR19DTURfVVNCCVwKLQkJCQkJICAgICAmIH5DRkdfQ01EX1ZGRAlcCi0JCQkJCSAgICAgJiB+Q0ZHX0NNRF9YSU1HCSkKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9hbGwuaD4KKworI3VuZGVmIENPTkZJR19DTURfQkVEQlVHCisjdW5kZWYgQ09ORklHX0NNRF9CTVAKKyN1bmRlZiBDT05GSUdfQ01EX0JTUAorI3VuZGVmIENPTkZJR19DTURfRElTUExBWQorI3VuZGVmIENPTkZJR19DTURfRE9DCisjdW5kZWYgQ09ORklHX0NNRF9EVFQKKyN1bmRlZiBDT05GSUdfQ01EX0VFUFJPTQorI3VuZGVmIENPTkZJR19DTURfRUxGCisjdW5kZWYgQ09ORklHX0NNRF9FWFQyCisjdW5kZWYgQ09ORklHX0NNRF9GREMKKyN1bmRlZiBDT05GSUdfQ01EX0ZET1MKKyN1bmRlZiBDT05GSUdfQ01EX0hXRkxPVworI3VuZGVmIENPTkZJR19DTURfSTJDCisjdW5kZWYgQ09ORklHX0NNRF9JREUKKyN1bmRlZiBDT05GSUdfQ01EX0lSUQorI3VuZGVmIENPTkZJR19DTURfSkZGUzIKKyN1bmRlZiBDT05GSUdfQ01EX0tHREIKKyN1bmRlZiBDT05GSUdfQ01EX01GU0wKKyN1bmRlZiBDT05GSUdfQ01EX01JSQorI3VuZGVmIENPTkZJR19DTURfTU1DCisjdW5kZWYgQ09ORklHX0NNRF9OQU5ECisjdW5kZWYgQ09ORklHX0NNRF9QQ0kKKyN1bmRlZiBDT05GSUdfQ01EX1BDTUNJQQorI3VuZGVmIENPTkZJR19DTURfUkVJU0VSCisjdW5kZWYgQ09ORklHX0NNRF9TQ1NJCisjdW5kZWYgQ09ORklHX0NNRF9TUEkKKyN1bmRlZiBDT05GSUdfQ01EX1VOSVZFUlNFCisjdW5kZWYgQ09ORklHX0NNRF9VU0IKKyN1bmRlZiBDT05GSUdfQ01EX1ZGRAorI3VuZGVmIENPTkZJR19DTURfWElNRworCisjaWYgIShDT05GSUdfTEFOVEVDID49IDIpCisgICAgI3VuZGVmIENPTkZJR19DTURfREFURQorICAgICN1bmRlZiBDT05GSUdfQ01EX05FVAorI2VuZGlmCisKIAogI2lmIENPTkZJR19MQU5URUMgPj0gMgogI2RlZmluZQlDT05GSUdfUlRDX01QQzh4eAkJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHgJKi8KICNlbmRpZgogCi0jaWYgQ09ORklHX0xBTlRFQyA+PSAyCi0jIGRlZmluZSBDT05GSUdfQ09NTUFORFMJQ09ORklHX0NNRF9GVUxMCi0jZWxzZQotIyBkZWZpbmUgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0ZVTEwgJiB+Q0ZHX0NNRF9EQVRFICYgfkNGR19DTURfTkVUKQotI2VuZGlmCi0KLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjAzLDcgKzIwNyw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NNTI3MUVWQi5oIGIvaW5jbHVkZS9jb25maWdzL001MjcxRVZCLmgKaW5kZXggZjBmYzAxMy4uODg1YTg4MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL001MjcxRVZCLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL001MjcxRVZCLmgKQEAgLTY1LDE1ICs2NSwzMSBAQAogI2RlZmluZSBDRkdfRU5WX0lTX0lOX0ZMQVNICTEKICNlbmRpZgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgKChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUElORyB8IENGR19DTURfTkVUICkgJiB+KENGR19DTURfTE9BRFMgfCBDRkdfQ01EX0xPQURCKSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjdW5kZWYgQ09ORklHX0NNRF9MT0FEQgorCiAKICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIKICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NNTI3MkMzLmggYi9pbmNsdWRlL2NvbmZpZ3MvTTUyNzJDMy5oCmluZGV4IDVmZDZhOTUuLmNjNDU2ZGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9NNTI3MkMzLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL001MjcyQzMuaApAQCAtNjAsMTcgKzYwLDMzIEBACiAjZGVmaW5lIENGR19FTlZfSVNfSU5fRkxBU0gJMQogI2VuZGlmCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAoIENPTkZJR19DTURfREZMICYgfihDRkdfQ01EX0xPQURTIHwgQ0ZHX0NNRF9MT0FEQikgfCBcCi0JCQkgICBDRkdfQ01EX01JSSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX01JSQorCisjdW5kZWYgQ09ORklHX0NNRF9MT0FEUworI3VuZGVmIENPTkZJR19DTURfTE9BREIKKworCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJNQogCiAjZGVmaW5lIENGR19QUk9NUFQJCSItPiAiCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTTUyODJFVkIuaCBiL2luY2x1ZGUvY29uZmlncy9NNTI4MkVWQi5oCmluZGV4IGNiYjNlM2IuLmYyYTc2NDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9NNTI4MkVWQi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9NNTI4MkVWQi5oCkBAIC01MSwxNiArNTEsMzAgQEAKICNkZWZpbmUgQ0ZHX0VOVl9JU19JTl9GTEFTSAkxCiAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgICggQ09ORklHX0NNRF9ERkwgJiB+KENGR19DTURfTE9BRFMgfCBDRkdfQ01EX0xPQURCKSApCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjdW5kZWYgQ09ORklHX0NNRF9MT0FEUworI3VuZGVmIENPTkZJR19DTURfTE9BREIKKworCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJNQogCiAjZGVmaW5lIENGR19QUk9NUFQJCSItPiAiCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTUJYLmggYi9pbmNsdWRlL2NvbmZpZ3MvTUJYLmgKaW5kZXggZDZlM2ZiOC4uZDlmMmFkZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01CWC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9NQlguaApAQCAtNzEsMTQgKzcxLDI4IEBACiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSggQ0ZHX0NNRF9ORVQgfCBDT05GSUdfQ01EX0RGTCB8IENGR19DTURfU0RSQU0gfCBcCi0JCQkgICAgICBDRkdfQ01EX1BDTUNJQSB8IENGR19DTURfSURFICkKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ERkwKKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorI2RlZmluZSBDT05GSUdfQ01EX1BDTUNJQQorI2RlZmluZSBDT05GSUdfQ01EX0lERQorCiAKICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCkBAIC04OCw3ICsxMDIsNyBAQAogI2lmZGVmCUNGR19IVVNIX1BBUlNFUgogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTg3LDcgKzIwMSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NQlg4NjBULmggYi9pbmNsdWRlL2NvbmZpZ3MvTUJYODYwVC5oCmluZGV4IDBjYTA5NzAuLjY5ZDE5NWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9NQlg4NjBULmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01CWDg2MFQuaApAQCAtMTUxLDcgKzE1MSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NRVRST0JPWC5oIGIvaW5jbHVkZS9jb25maWdzL01FVFJPQk9YLmgKaW5kZXggNDY1YTRlYy4uOGQ3ZWM1OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01FVFJPQk9YLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01FVFJPQk9YLmgKQEAgLTEwNCw2ICsxMDQsNyBAQAogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNkZWZpbmUgQ09ORklHX01FVFJPQk9YCQkgIDEJICAgICAvKiBCb2FyZCBpcyBNZXRyb2JveAkqLwogI2RlZmluZSBDT05GSUdfNDQwR1gJCSAgMQkgICAgIC8qIFNwZWNpZmMgR1ggc3VwcG9ydAkqLworI2RlZmluZSBDT05GSUdfNDQwCQkgIDEJICAgICAvKiAuLi4gUFBDNDQwIGZhbWlseQkqLwogI2RlZmluZSBDT05GSUdfNHh4CQkgIDEJICAgICAvKiAuLi4gUFBDNHh4IGZhbWlseQkqLwogI2RlZmluZSBDT05GSUdfQk9BUkRfRUFSTFlfSU5JVF9GIDEJICAgICAvKiBDYWxsIGJvYXJkX3ByZV9pbml0CSovCiAjZGVmaW5lIENPTkZJR19NSVNDX0lOSVRfRgkgIDEJICAgICAvKiBDYWxsIGJvYXJkIG1pc2NfaW5pdF9mCSovCkBAIC0yNDEsMjYgKzI0MiwzMyBAQAogI2RlZmluZSBDRkdfUlhfRVRIX0JVRkZFUiAgICAgMzIJICAgICAvKiAjZXRoIHJ4IGJ1ZmYgJiBkZXNjcnMJKi8KIAogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb25zb2xlL0NvbW1hbmRzL1BhcnNlcgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0JFREJVRwl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9ESUFHCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkVUCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfRkFUKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAotLyogdGJzIDA5LU1hcmNoLTIwMDUgUmVtb3ZlZCB0byBiZSBhYmxlIHRvIHVzZSAybmQgc2VyaWFsICovCi0vKgkJCQkgIENGR19DTURfS0dEQgkgIHwgXCAqLworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKIAogCiAvKiBJbmNsdWRlIE5ldENvbnNvbGUgc3VwcG9ydCAqLwpAQCAtMjcxLDEwICsyNzksNiBAQAogI2RlZmluZSBDT05GSUdfQVVUT19DT01QTEVURSAxCiAjZGVmaW5lIENGR19BTFRfTUVNVEVTVAkgICAgIDEJICAgICAvKiB1c2UgcmVhbCBtZW1vcnkgdGVzdAkgKi8KIAotCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJICAgICAvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSAgICAgICJNZXRyb0JveD0+ICIgIC8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KIApAQCAtMjg1LDcgKzI4OSw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBDb25zb2xlIEJ1ZmZlcgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCSAgICAgIDEwMjQJICAgICAvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkgICAgICAyNTYJICAgICAvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtMzMxLDcgKzMzNSw2IEBACiAjZGVmaW5lIENGR19QQ0lfVEFSR0JBU0UgICAgICAoQ0ZHX1BDSV9NRU1CQVNFKQogCiAvKiBCb2FyZC1zcGVjaWZpYyBQQ0kgKi8KLSNkZWZpbmUgQ0ZHX1BDSV9QUkVfSU5JVAkJICAgICAvKiBlbmFibGUgYm9hcmQgcGNpX3ByZV9pbml0Ki8KICNkZWZpbmUgQ0ZHX1BDSV9UQVJHRVRfSU5JVAkJICAgICAvKiBsZXQgYm9hcmQgaW5pdCBwY2kgdGFyZ2V0Ki8KIAogI2RlZmluZSBDRkdfUENJX1NVQlNZU19WRU5ET1JJRCAweDE3QkEJICAgICAvKiBTYW5kYnVyc3QgKi8KQEAgLTM0OCw3ICszNTEsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkgICAgICA4MTkyCSAgICAgLyogRm9yIEFNQ0MgNDA1IENQVXMJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFICAgIDMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVCAgIDUJCSAgICAgLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgKi8KICNlbmRpZgogCkBAIC0zNjAsNyArMzYzLDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkgICAgICAweDAxCSAgICAgLyogTm9ybWFsIFBvd2VyT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCSAgICAgIDB4MDIJICAgICAvKiBTb2Z0d2FyZSByZWJvb3QgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFICAyMzA0MDAJICAgICAvKiBrZ2RiIHNlcmlhbCBwb3J0IGJhdWQJKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYIDIJCSAgICAgLyoga2dkYiBzZXJpYWwgcG9ydAkqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTUhQQy5oIGIvaW5jbHVkZS9jb25maWdzL01IUEMuaAppbmRleCA1MzY4NGNhLi5kZGU3NzQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTUhQQy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9NSFBDLmgKQEAgLTExNSwyNSArMTE1LDM2IEBACiAKICNkZWZpbmUgQ09ORklHX0JSMF9XT1JLQVJPVU5ECTEKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAoIENPTkZJR19DTURfREZMICB8IFwKLQkJCSAgICAgICBDRkdfQ01EX0RBVEUgICAgfCBcCi0JCQkgICAgICAgQ0ZHX0NNRF9FRVBST00gIHwgXAotCQkJICAgICAgIENGR19DTURfRUxGICAgICB8IFwKLQkJCSAgICAgICBDRkdfQ01EX0kyQyAgICAgfCBcCi0JCQkgICAgICAgQ0ZHX0NNRF9KRkZTMiAgIHwgXAotCQkJICAgICAgIENGR19DTURfUkVHSU5GTyApCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjI1LDcgKzIzNiw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NSVA0MDUuaCBiL2luY2x1ZGUvY29uZmlncy9NSVA0MDUuaAppbmRleCA3ZTU3YTBmLi41YjUyNmEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTUlQNDA1LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01JUDQwNS5oCkBAIC01MCw0MSArNTAsNDMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgQ09ORklHX1NZU19DTEtfRlJFUQkzMzAwMDAwMCAvKiBleHRlcm5hbCBmcmVxdWVuY3kgdG8gcGxsICAgKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb21tYW5kIGRlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIE1JUDQwNV9DT01NT05fQ01EUyBcCi0JCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQlDRkdfQ01EX0NBQ0hFCXwgXAotCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQlDRkdfQ01EX0VMRgl8IFwKLQkJCUNGR19DTURfRkFUCXwgXAotCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQlDRkdfQ01EX0lERQl8IFwKLQkJCUNGR19DTURfSVJRCXwgXAotCQkJQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCUNGR19DTURfTUlJCXwgXAotCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQlDRkdfQ01EX1JFR0lORk8gfCBcCi0JCQlDRkdfQ01EX1NBVkVTCXwgXAotCQkJQ0ZHX0NNRF9CU1AJKQogCi0jaWYgZGVmaW5lZChDT05GSUdfTUlQNDA1VCkKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQlcCi0JCQlNSVA0MDVfQ09NTU9OX0NNRFMKLSNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJXAotCQkJKE1JUDQwNV9DT01NT05fQ01EUyB8IFwKLQkJCUNGR19DTURfVVNCCXwgXAotCQkJQ0ZHX0NNRF9ET0MJKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfU0FWRVMKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKworI2lmICFkZWZpbmVkKENPTkZJR19NSVA0MDVUKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKyAgICAjZGVmaW5lIENPTkZJR19DTURfRE9DCiAjZW5kaWYKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogI2RlZmluZSBDRkdfTkFORF9MRUdBQ1kKIApAQCAtMTY1LDcgKzE2Nyw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI2MCw3ICsyNjIsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMHg0MDAwCS8qIEZvciBBTUNDIDQwNUdQciBDUFVzCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtNDI2LDcgKzQyOCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBEZWJ1ZyBzdXBwb3J0CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL01MMi5oIGIvaW5jbHVkZS9jb25maWdzL01MMi5oCmluZGV4IGQ4ODA1ZWEuLmY0ODgyNzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9NTDIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTUwyLmgKQEAgLTc2LDIwICs3NiwzMSBAQAogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UJKi8KIAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKChDT05GSUdfQ01EX0RGTCAmIFwKLQkJCQkgICAgIH4oIENGR19DTURfTkVUIHwgXAotCQkJCQlDRkdfQ01EX1JUQyB8IFwKLQkJCQkJQ0ZHX0NNRF9QQ0kgfCBcCi0JCQkJCUNGR19DTURfSTJDICAgXAotCQkJCSAgICAgICkgKSB8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0tHREIJfCBcCi0JCQkJQ0ZHX0NNRF9CRURCVUcJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9KRkZTMgkgICkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9LR0RCCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKworI3VuZGVmIENPTkZJR19DTURfTkVUCisjdW5kZWYgQ09ORklHX0NNRF9SVEMKKyN1bmRlZiBDT05GSUdfQ01EX1BDSQorI3VuZGVmIENPTkZJR19DTURfSTJDCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC0xMDIsNyArMTEzLDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTk1LDcgKzIwNiw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQk4MTkyCS8qIEZvciBBTUNDIDQwNSBDUFVzCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtMjM2LDcgKzI0Nyw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTU9VU1NFLmggYi9pbmNsdWRlL2NvbmZpZ3MvTU9VU1NFLmgKaW5kZXggNmFkMmZlYi4uOTM3MGMyNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01PVVNTRS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9NT1VTU0UuaApAQCAtNTgsMTQgKzU4LDMxIEBACiAjZW5kaWYKICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTICAgICAgImNvbnNvbGU9dHR5UzAgcm9vdD0vZGV2L25mcyBydyBuZnNyb290PTIwOS4xMjguOTMuMTMzOi9ib290IG5mc2FkZHJzPTIwOS4xMjguOTMuMTMzOjIwOS4xMjguOTMuMTM4IgogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZICAgICAzCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAgICAgIChDT05GSUdfQ01EX0RGTHxDRkdfQ01EX0FTS0VOVnxDRkdfQ01EX0RBVEUpCisKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKworCiAjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFIDEKICNkZWZpbmUgQ09ORklHX0VUSF9BRERSICAgICAgIjAwOjEwOjE4OjEwOjAwOjA2IgogCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OICAxIC8qIE1TRE9TIGJvb3RhYmxlIHBhcnRpdGlpb24gc3VwcG9ydCAqLwotLyogVGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KQotICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKICNpbmNsdWRlICIuLi9ib2FyZC9tb3Vzc2UvbW91c3NlLmgiCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODI2MEFEUy5oIGIvaW5jbHVkZS9jb25maWdzL01QQzgyNjBBRFMuaAppbmRleCA2MTk1YmNhLi43MTM1MThkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODI2MEFEUy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9NUEM4MjYwQURTLmgKQEAgLTEwMSw4ICsxMDEsNyBAQAogICogZm9yIEZDQykKICAqCiAgKiBpZiBDT05GSUdfRVRIRVJfTk9ORSBpcyBkZWZpbmVkLCB0aGVuIGVpdGhlciB0aGUgZXRoZXJuZXQgcm91dGluZXMgbXVzdCBiZQotICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENGR19DTURfTkVUIG11c3QgYmUgcmVtb3ZlZAotICogZnJvbSBDT05GSUdfQ09NTUFORFMgdG8gcmVtb3ZlIHN1cHBvcnQgZm9yIG5ldHdvcmtpbmcuCisgKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ09ORklHX0NNRF9ORVQgbXVzdCBiZSB1bnNldC4KICAqLwogI3VuZGVmCUNPTkZJR19FVEhFUl9PTl9TQ0MJCS8qIGRlZmluZSBpZiBldGhlciBvbiBTQ0MgICAqLwogI2RlZmluZSBDT05GSUdfRVRIRVJfT05fRkNDCQkvKiBkZWZpbmUgaWYgZXRoZXIgb24gRkNDICAgKi8KQEAgLTE5OCw1OSArMTk3LDY5IEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKIAotI2RlZmluZSBDRkdfRVhDTFVERQkJQ0ZHX0NNRF9CRURCVUcJfCBcCi0JCQkJQ0ZHX0NNRF9CTVAJfCBcCi0JCQkJQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfRElTUExBWSB8IFwKLQkJCQlDRkdfQ01EX0RPQwl8IFwKLQkJCQlDRkdfQ01EX0RUVAl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0VYVDIJfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9GREMJfCBcCi0JCQkJQ0ZHX0NNRF9GRE9TCXwgXAotCQkJCUNGR19DTURfSFdGTE9XCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfS0dEQgl8IFwKLQkJCQlDRkdfQ01EX01NQwl8IFwKLQkJCQlDRkdfQ01EX05BTkQJfCBcCi0JCQkJQ0ZHX0NNRF9QQ01DSUEJfCBcCi0JCQkJQ0ZHX0NNRF9SRUlTRVIJfCBcCi0JCQkJQ0ZHX0NNRF9TQ1NJCXwgXAotCQkJCUNGR19DTURfU1BJCXwgXAotCQkJCUNGR19DTURfU05UUAl8IFwKLQkJCQlDRkdfQ01EX1VOSVZFUlNFIHwgXAotCQkJCUNGR19DTURfVVNCCXwgXAotCQkJCUNGR19DTURfVkZECXwgXAotCQkJCUNGR19DTURfWElNRworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2FsbC5oPgorCisjdW5kZWYgQ09ORklHX0NNRF9CRURCVUcKKyN1bmRlZiBDT05GSUdfQ01EX0JNUAorI3VuZGVmIENPTkZJR19DTURfQlNQCisjdW5kZWYgQ09ORklHX0NNRF9EQVRFCisjdW5kZWYgQ09ORklHX0NNRF9ESVNQTEFZCisjdW5kZWYgQ09ORklHX0NNRF9ET0MKKyN1bmRlZiBDT05GSUdfQ01EX0RUVAorI3VuZGVmIENPTkZJR19DTURfRUVQUk9NCisjdW5kZWYgQ09ORklHX0NNRF9FTEYKKyN1bmRlZiBDT05GSUdfQ01EX0VYVDIKKyN1bmRlZiBDT05GSUdfQ01EX0ZBVAorI3VuZGVmIENPTkZJR19DTURfRkRDCisjdW5kZWYgQ09ORklHX0NNRF9GRE9TCisjdW5kZWYgQ09ORklHX0NNRF9IV0ZMT1cKKyN1bmRlZiBDT05GSUdfQ01EX0lERQorI3VuZGVmIENPTkZJR19DTURfS0dEQgorI3VuZGVmIENPTkZJR19DTURfTUZTTAorI3VuZGVmIENPTkZJR19DTURfTU1DCisjdW5kZWYgQ09ORklHX0NNRF9OQU5ECisjdW5kZWYgQ09ORklHX0NNRF9QQ01DSUEKKyN1bmRlZiBDT05GSUdfQ01EX1JFSVNFUgorI3VuZGVmIENPTkZJR19DTURfU0NTSQorI3VuZGVmIENPTkZJR19DTURfU1BJCisjdW5kZWYgQ09ORklHX0NNRF9TTlRQCisjdW5kZWYgQ09ORklHX0NNRF9VTklWRVJTRQorI3VuZGVmIENPTkZJR19DTURfVVNCCisjdW5kZWYgQ09ORklHX0NNRF9WRkQKKyN1bmRlZiBDT05GSUdfQ01EX1hJTUcKIAogI2lmIENPTkZJR19BRFNUWVBFID09IENGR184MjcyQURTCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENGR19DTURfQUxMICYgfiggXAotCQkJICAgICAgICAgQ0ZHX0NNRF9TRFJBTQl8IFwKLQkJCQkgQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJIENGR19FWENMVURFCSkgKQorICAgICN1bmRlZiBDT05GSUdfQ01EX1NEUkFNCisgICAgI3VuZGVmIENPTkZJR19DTURfSTJDCisKICNlbGlmIENPTkZJR19BRFNUWVBFID49IENGR19QUTJGQURTCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENGR19DTURfQUxMICYgfiggXAotCQkJCSBDRkdfQ01EX1NEUkFNCXwgXAotCQkJCSBDRkdfQ01EX0kyQwl8IFwKLQkJCQkgQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJIENGR19FWENMVURFCSkgKQorICAgICN1bmRlZiBDT05GSUdfQ01EX1NEUkFNCisgICAgI3VuZGVmIENPTkZJR19DTURfSTJDCisgICAgI3VuZGVmIENPTkZJR19DTURfUENJCisKICNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENGR19DTURfQUxMICYgfiggXAotCQkJCSBDTURfQ0ZHX1BDSSAJfCBcCi0JCQkJIENGR19FWENMVURFIAkpICkKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9QQ0kKKwogI2VuZGlmIC8qIENPTkZJR19BRFNUWVBFID49IENGR19QUTJGQURTICovCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUJCS8qIGF1dG9ib290IGFmdGVyIDUgc2Vjb25kcyAqLwogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIGZmZjgwMDAwIgkvKiBhdXRvYm9vdCBjb21tYW5kICovCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJInJvb3Q9L2Rldi9tdGRibG9jazIiCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI3VuZGVmCUNPTkZJR19LR0RCX09OX1NNQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU01DICovCiAjZGVmaW5lIENPTkZJR19LR0RCX09OX1NDQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU0NDICovCiAjdW5kZWYJQ09ORklHX0tHREJfTk9ORQkJLyogZGVmaW5lIGlmIGtnZGIgb24gc29tZXRoaW5nIGVsc2UgKi8KQEAgLTI2OCw3ICsyNzcsNyBAQAogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyICI+ICIKICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJICAgICovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtMzg0LDcgKzM5Myw3IEBACiAjZW5kaWYgLyogQ0ZHX1JBTUJPT1QgKi8KIAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyNjAgQ1BVICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCkBAIC0zOTcsOSArNDA2LDkgQEAKICNkZWZpbmUgQ0ZHX0JDUgkJCTB4MTAwQzAwMDAKICNkZWZpbmUgQ0ZHX1NJVU1DUgkJMHgwQTIwMDAwMAogI2RlZmluZSBDRkdfU0NDUgkJU0NDUl9ERkJSRzAxCi0jZGVmaW5lIENGR19CUjBfUFJFTElNCQlDRkdfRkxBU0hfQkFTRSB8IDB4MDAwMDE4MDEKKyNkZWZpbmUgQ0ZHX0JSMF9QUkVMSU0JCShDRkdfRkxBU0hfQkFTRSB8IDB4MDAwMDE4MDEpCiAjZGVmaW5lIENGR19PUjBfUFJFTElNCQkweEZGODAwODc2Ci0jZGVmaW5lIENGR19CUjFfUFJFTElNCQlDRkdfQkNTUiB8IDB4MDAwMDE4MDEKKyNkZWZpbmUgQ0ZHX0JSMV9QUkVMSU0JCShDRkdfQkNTUiB8IDB4MDAwMDE4MDEpCiAjZGVmaW5lIENGR19PUjFfUFJFTElNCQkweEZGRkY4MDEwCiAKIC8qV2UgbmVlZCB0byBjb25maWd1cmUgY2hpcCBzZWxlY3QgdG8gdXNlIENQTEQgUENJIElDIG9uIE1QQzgyNzJBRFMqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL01QQzgyNjZBRFMuaCBiL2luY2x1ZGUvY29uZmlncy9NUEM4MjY2QURTLmgKaW5kZXggNDk1M2I3MC4uMTRiMDQxZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01QQzgyNjZBRFMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODI2NkFEUy5oCkBAIC04Myw4ICs4Myw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICovCiAjdW5kZWYJQ09ORklHX0VUSEVSX09OX1NDQwkJLyogZGVmaW5lIGlmIGV0aGVyIG9uIFNDQyAgICovCiAjZGVmaW5lIENPTkZJR19FVEhFUl9PTl9GQ0MJCS8qIGRlZmluZSBpZiBldGhlciBvbiBGQ0MgICAqLwpAQCAtMTQxLDQwICsxNDAsNDMgQEAKICAqLwogI2RlZmluZSBTUERfRUVQUk9NX0FERFJFU1MJMHg1MAogCi0KICNkZWZpbmUgQ09ORklHXzgyNjBfQ0xLSU4JNjYwMDAwMDAJLyogaW4gSHogKi8KICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKIAorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9hbGwuaD4KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDRkdfQ01EX0FMTCAmIH4oIFwKLQkJCQlDRkdfQ01EX0JFREJVRwl8IFwKLQkJCQlDRkdfQ01EX0JNUAl8IFwKLQkJCQlDRkdfQ01EX0JTUAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRElTUExBWSB8IFwKLQkJCQlDRkdfQ01EX0RPQwl8IFwKLQkJCQlDRkdfQ01EX0RUVAl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0VYVDIJfCBcCi0JCQkJQ0ZHX0NNRF9GREMJfCBcCi0JCQkJQ0ZHX0NNRF9GRE9TCXwgXAotCQkJCUNGR19DTURfSFdGTE9XCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfSkZGUzIJfCBcCi0JCQkJQ0ZHX0NNRF9LR0RCCXwgXAotCQkJCUNGR19DTURfTU1DCXwgXAotCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQlDRkdfQ01EX1BDTUNJQQl8IFwKLQkJCQlDRkdfQ01EX1JFSVNFUgl8IFwKLQkJCQlDRkdfQ01EX1NDU0kJfCBcCi0JCQkJQ0ZHX0NNRF9TUEkJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCXwgXAotCQkJCUNGR19DTURfVkZECXwgXAotCQkJCUNGR19DTURfVU5JVkVSU0UgfCBcCi0JCQkJQ0ZHX0NNRF9VU0IJfCBcCi0JCQkJQ0ZHX0NNRF9YSU1HCSkgKQorI3VuZGVmIENPTkZJR19DTURfQkVEQlVHCisjdW5kZWYgQ09ORklHX0NNRF9CTVAKKyN1bmRlZiBDT05GSUdfQ01EX0JTUAorI3VuZGVmIENPTkZJR19DTURfREFURQorI3VuZGVmIENPTkZJR19DTURfREhDUAorI3VuZGVmIENPTkZJR19DTURfRElTUExBWQorI3VuZGVmIENPTkZJR19DTURfRE9DCisjdW5kZWYgQ09ORklHX0NNRF9EVFQKKyN1bmRlZiBDT05GSUdfQ01EX0VFUFJPTQorI3VuZGVmIENPTkZJR19DTURfRUxGCisjdW5kZWYgQ09ORklHX0NNRF9FWFQyCisjdW5kZWYgQ09ORklHX0NNRF9GREMKKyN1bmRlZiBDT05GSUdfQ01EX0ZET1MKKyN1bmRlZiBDT05GSUdfQ01EX0hXRkxPVworI3VuZGVmIENPTkZJR19DTURfSURFCisjdW5kZWYgQ09ORklHX0NNRF9KRkZTMgorI3VuZGVmIENPTkZJR19DTURfS0dEQgorI3VuZGVmIENPTkZJR19DTURfTUZTTAorI3VuZGVmIENPTkZJR19DTURfTU1DCisjdW5kZWYgQ09ORklHX0NNRF9OQU5ECisjdW5kZWYgQ09ORklHX0NNRF9QQ01DSUEKKyN1bmRlZiBDT05GSUdfQ01EX1JFSVNFUgorI3VuZGVmIENPTkZJR19DTURfU0NTSQorI3VuZGVmIENPTkZJR19DTURfU1BJCisjdW5kZWYgQ09ORklHX0NNRF9TTlRQCisjdW5kZWYgQ09ORklHX0NNRF9WRkQKKyN1bmRlZiBDT05GSUdfQ01EX1VOSVZFUlNFCisjdW5kZWYgQ09ORklHX0NNRF9VU0IKKyN1bmRlZiBDT05GSUdfQ01EX1hJTUcKIAogLyogRGVmaW5lIGEgY29tbWFuZCBzdHJpbmcgdGhhdCBpcyBhdXRvbWF0aWNhbGx5IGV4ZWN1dGVkIHdoZW4gbm8gY2hhcmFjdGVyCiAgKiBpcyByZWFkIG9uIHRoZSBjb25zb2xlIGludGVyZmFjZSB3aXRoaW5nICJCb290IERlbGF5IiBhZnRlciByZXNldC4KQEAgLTIwMiwyMSArMjA0LDE5IEBACiAJImJvb3RtIgogI2VuZGlmIC8qIENPTkZJR19CT09UX1JPT1RfTkZTICovCiAKLS8qIEFkZCBzdXBwb3J0IGZvciBhIGZldyBleHRyYSBib290cCBvcHRpb25zIGxpa2U6Ci0gKgktIEZpbGUgc2l6ZQotICoJLSBETlMKKy8qCisgKiBCT09UUCBvcHRpb25zCiAgKi8KLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfRE5TKQotCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUJLyogYXV0b2Jvb3QgYWZ0ZXIgNSBzZWNvbmRzICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI3VuZGVmCUNPTkZJR19LR0RCX09OX1NNQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU01DICovCiAjZGVmaW5lIENPTkZJR19LR0RCX09OX1NDQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU0NDICovCiAjdW5kZWYJQ09ORklHX0tHREJfTk9ORQkJLyogZGVmaW5lIGlmIGtnZGIgb24gc29tZXRoaW5nIGVsc2UgKi8KQEAgLTIzMSw3ICsyMzEsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KQEAgLTI4Myw3ICsyODMsNiBAQAogCiAjZGVmaW5lIFNEUkFNX1NQRF9BRERSIDB4NTAKIAotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBCUjIsQlIzIC0gQmFzZSBSZWdpc3RlcgogICogICAgIFJlZjogU2VjdGlvbiAxMC4zLjEgb24gcGFnZSAxMC0xNApAQCAtMzgxLDcgKzM4MCw2IEBACiAjZXJyb3IgIklOVkFMSUQgU0RSQU0gQ09ORklHVVJBVElPTiIKICNlbmRpZgogCi0KICNkZWZpbmUgUlMyMzJFTl8xCQkweDAyMDAwMDAyCiAjZGVmaW5lIFJTMjMyRU5fMgkJMHgwMTAwMDAwMQogI2RlZmluZSBGRVRISUVOCQkJMHgwODAwMDAwOApAQCAtMzkzLDcgKzM5MSw2IEBACiAjZGVmaW5lIENGR19HQkxfREFUQV9PRkZTRVQJKENGR19JTklUX1JBTV9FTkQgLSBDRkdfR0JMX0RBVEFfU0laRSkKICNkZWZpbmUgQ0ZHX0lOSVRfU1BfT0ZGU0VUCUNGR19HQkxfREFUQV9PRkZTRVQKIAotCiAvKiBVc2UgdGhpcyBIUkNXIGZvciBib290aW5nIGZyb20gYWRkcmVzcyAweGZlMDAwMDAgKEpQMyBpbiBzZXR0aW5nIDEtMikgICovCiAvKiAweDBFQjJCNjQ1ICovCiAjZGVmaW5lIENGR19IUkNXX01BU1RFUiAoKCBIUkNXX0JQUzExIHwgSFJDV19DSVAgKQkJCQl8XApAQCAtNDUwLDEzICs0NDcsMTEgQEAKICMgIGRlZmluZSBDRkdfRU5WX1NJWkUJCTB4MjAwCiAjZW5kaWYgLyogQ0ZHX1JBTUJPT1QgKi8KIAotCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODI2MCBDUFUgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogSElEeCAtIEhhcmR3YXJlIEltcGxlbWVudGF0aW9uLWRlcGVuZGVudCBSZWdpc3RlcnMJCQkgMi0xMQogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL01QQzgzMTNFUkRCLmggYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODMxM0VSREIuaAppbmRleCA2OTc2MzEzLi44MWRiOTZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODMxM0VSREIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODMxM0VSREIuaApAQCAtMjY1LDcgKzI2NSw3IEBACiAjZGVmaW5lIENPTkZJR19JMkNfQ01EX1RSRUUKICNkZWZpbmUgQ0ZHX0kyQ19TUEVFRAkJNDAwMDAwCS8qIEkyQyBzcGVlZCBhbmQgc2xhdmUgYWRkcmVzcyAqLwogI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCi0jZGVmaW5lIENGR19JMkNfTk9QUk9CRVMJezB4Njl9CS8qIERvbid0IHByb2JlIHRoZXNlIGFkZHJzICovCisjZGVmaW5lIENGR19JMkNfTk9QUk9CRVMJe3swLDB4Njl9fSAvKiBEb24ndCBwcm9iZSB0aGVzZSBhZGRycyAqLwogI2RlZmluZSBDRkdfSTJDX09GRlNFVAkJMHgzMDAwCiAjZGVmaW5lIENGR19JMkMyX09GRlNFVAkJMHgzMTAwCiAKQEAgLTMwMywxMSArMzAzLDExIEBACiAjZW5kaWYKIAogI2RlZmluZSBDT05GSUdfR01JSQkJCTEJLyogTUlJIFBIWSBtYW5hZ2VtZW50ICovCi0jZGVmaW5lIENPTkZJR19NUEM4M1hYX1RTRUMxCQkxCisjZGVmaW5lIENPTkZJR19UU0VDMQkJMQogCi0jZGVmaW5lIENPTkZJR19NUEM4M1hYX1RTRUMxX05BTUUJIlRTRUMwIgotI2RlZmluZSBDT05GSUdfTVBDODNYWF9UU0VDMgkJMQotI2RlZmluZSBDT05GSUdfTVBDODNYWF9UU0VDMl9OQU1FCSJUU0VDMSIKKyNkZWZpbmUgQ09ORklHX1RTRUMxX05BTUUJIlRTRUMwIgorI2RlZmluZSBDT05GSUdfVFNFQzIJCTEKKyNkZWZpbmUgQ09ORklHX1RTRUMyX05BTUUJIlRTRUMxIgogI2RlZmluZSBUU0VDMV9QSFlfQUREUgkJCTB4MWMKICNkZWZpbmUgVFNFQzJfUEhZX0FERFIJCQk0CiAjZGVmaW5lIFRTRUMxX1BIWUlEWAkJCTAKQEAgLTM0MSwyNiArMzQxLDM0IEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkICovCiAjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZSAqLwogCi0jZGVmaW5lIENGR19CQVNFX0NPTU1BTkRTCSggQ09ORklHX0NNRF9ERkwJXAotCQkJCXwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJfCBDRkdfQ01EX0RIQ1AJCVwKLQkJCQl8IENGR19DTURfSTJDCQlcCi0JCQkJfCBDRkdfQ01EX01JSQkJXAotCQkJCXwgQ0ZHX0NNRF9EQVRFCQlcCi0JCQkJfCBDRkdfQ01EX1BDSSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKworI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpCisgICAgI3VuZGVmIENPTkZJR19DTURfRU5WCisgICAgI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyNlbmRpZgogCiAjZGVmaW5lIENPTkZJR19DTURMSU5FX0VESVRJTkcgMQogCi0jZGVmaW5lIENGR19SQU1CT09UX0NPTU1BTkRTCShDRkdfQkFTRV9DT01NQU5EUyAmIFwKLQkJCQkgfihDRkdfQ01EX0VOViB8IENGR19DTURfTE9BRFMpKQotCi0jaWYgZGVmaW5lZChDRkdfUkFNQk9PVCkKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTIENGR19SQU1CT09UX0NPTU1BTkRTCi0jZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgQ0ZHX0JBU0VfQ09NTUFORFMKLSNlbmRpZgotCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODMyM0VSREIuaCBiL2luY2x1ZGUvY29uZmlncy9NUEM4MzIzRVJEQi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3Njk3M2IKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODMyM0VSREIuaApAQCAtMCwwICsxLDU4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworI3VuZGVmIERFQlVHCisKKy8qCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19FMzAwCQkxCS8qIEUzMDAgZmFtaWx5ICovCisjZGVmaW5lIENPTkZJR19RRQkJMQkvKiBIYXMgUUUgKi8KKyNkZWZpbmUgQ09ORklHX01QQzgzWFgJCTEJLyogTVBDODN4eCBmYW1pbHkgKi8KKyNkZWZpbmUgQ09ORklHX01QQzgzMlgJCTEJLyogTVBDODMyeCBDUFUgc3BlY2lmaWMgKi8KKworI2RlZmluZSBDT05GSUdfUENJCQkxCisjZGVmaW5lIENPTkZJR184M1hYX0dFTkVSSUNfUENJCTEKKworLyoKKyAqIFN5c3RlbSBDbG9jayBTZXR1cAorICovCisjZGVmaW5lIENPTkZJR184M1hYX0NMS0lOCTY2NjY2NjY3CS8qIGluIEh6ICovCisKKyNpZm5kZWYgQ09ORklHX1NZU19DTEtfRlJFUQorI2RlZmluZSBDT05GSUdfU1lTX0NMS19GUkVRCUNPTkZJR184M1hYX0NMS0lOCisjZW5kaWYKKworLyoKKyAqIEhhcmR3YXJlIFJlc2V0IENvbmZpZ3VyYXRpb24gV29yZAorICovCisjZGVmaW5lIENGR19IUkNXX0xPVyAoXAorCUhSQ1dMX0xDTF9CVVNfVE9fU0NCX0NMS18xWDEgfFwKKwlIUkNXTF9ERFJfVE9fU0NCX0NMS18yWDEgfFwKKwlIUkNXTF9WQ09fMVgyIHxcCisJSFJDV0xfQ1NCX1RPX0NMS0lOXzJYMSB8XAorCUhSQ1dMX0NPUkVfVE9fQ1NCXzJfNVgxIHxcCisJSFJDV0xfQ0VfUExMX1ZDT19ESVZfMiB8XAorCUhSQ1dMX0NFX1BMTF9ESVZfMVgxIHxcCisJSFJDV0xfQ0VfVE9fUExMXzFYMykKKworI2RlZmluZSBDRkdfSFJDV19ISUdIIChcCisJSFJDV0hfUENJX0hPU1QgfFwKKwlIUkNXSF9QQ0kxX0FSQklURVJfRU5BQkxFIHxcCisJSFJDV0hfQ09SRV9FTkFCTEUgfFwKKwlIUkNXSF9GUk9NXzBYMDAwMDAxMDAgfFwKKwlIUkNXSF9CT09UU0VRX0RJU0FCTEUgfFwKKwlIUkNXSF9TV19XQVRDSERPR19ESVNBQkxFIHxcCisJSFJDV0hfUk9NX0xPQ19MT0NBTF8xNkJJVCB8XAorCUhSQ1dIX0JJR19FTkRJQU4gfFwKKwlIUkNXSF9MQUxFX05PUk1BTCkKKworLyoKKyAqIFN5c3RlbSBJTyBDb25maWcKKyAqLworI2RlZmluZSBDRkdfU0lDUkwJCTB4MDAwMDAwMDAKKworI2RlZmluZSBDT05GSUdfQk9BUkRfRUFSTFlfSU5JVF9GCS8qIGNhbGwgYm9hcmRfcHJlX2luaXQgKi8KKworLyoKKyAqIElNTVIgbmV3IGFkZHJlc3MKKyAqLworI2RlZmluZSBDRkdfSU1NUgkJMHhFMDAwMDAwMAorCisvKgorICogRERSIFNldHVwCisgKi8KKyNkZWZpbmUgQ0ZHX0REUl9CQVNFCQkweDAwMDAwMDAwCS8qIEREUiBpcyBzeXN0ZW0gbWVtb3J5ICovCisjZGVmaW5lIENGR19TRFJBTV9CQVNFCQlDRkdfRERSX0JBU0UKKyNkZWZpbmUgQ0ZHX0REUl9TRFJBTV9CQVNFCUNGR19ERFJfQkFTRQorI2RlZmluZSBDRkdfRERSQ0RSCQkweDczMDAwMDAyCS8qIEREUiBJSSB2b2x0YWdlIGlzIDEuOFYgKi8KKworI3VuZGVmIENPTkZJR19TUERfRUVQUk9NCisjaWYgZGVmaW5lZChDT05GSUdfU1BEX0VFUFJPTSkKKy8qIERldGVybWluZSBERFIgY29uZmlndXJhdGlvbiBmcm9tIEkyQyBpbnRlcmZhY2UKKyAqLworI2RlZmluZSBTUERfRUVQUk9NX0FERFJFU1MJMHg1MQkvKiBERFIgU09ESU1NICovCisjZWxzZQorLyogTWFudWFsbHkgc2V0IHVwIEREUiBwYXJhbWV0ZXJzCisgKi8KKyNkZWZpbmUgQ0ZHX0REUl9TSVpFCQk2NAkvKiBNQiAqLworI2RlZmluZSBDRkdfRERSX0NTMF9DT05GSUcJMHg4MDg0MDEwMQorI2RlZmluZSBDRkdfRERSX1RJTUlOR18wCTB4MDAyMjA4MDIKKyNkZWZpbmUgQ0ZHX0REUl9USU1JTkdfMQkweDM5MzVkMzIyCisjZGVmaW5lIENGR19ERFJfVElNSU5HXzIJMHgwZjkwNDhjYQorI2RlZmluZSBDRkdfRERSX1RJTUlOR18zCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0REUl9DTEtfQ05UTAkweDAyMDAwMDAwCisjZGVmaW5lIENGR19ERFJfTU9ERQkJMHg0NDQwMDIzMgorI2RlZmluZSBDRkdfRERSX01PREUyCQkweDgwMDBjMDAwCisjZGVmaW5lIENGR19ERFJfSU5URVJWQUwJMHgwMzIwMDA2NAorI2RlZmluZSBDRkdfRERSX0NTMF9CTkRTCTB4MDAwMDAwMDMKKyNkZWZpbmUgQ0ZHX0REUl9TRFJBTV9DRkcJMHg0MzA4MDAwMAorI2RlZmluZSBDRkdfRERSX1NEUkFNX0NGRzIJMHgwMDQwMTAwMAorI2VuZGlmCisKKy8qCisgKiBNZW1vcnkgdGVzdAorICovCisjdW5kZWYgQ0ZHX0RSQU1fVEVTVAkJLyogbWVtb3J5IHRlc3QsIHRha2VzIHRpbWUgKi8KKyNkZWZpbmUgQ0ZHX01FTVRFU1RfU1RBUlQJMHgwMDAzMDAwMAkvKiBtZW10ZXN0IHJlZ2lvbiAqLworI2RlZmluZSBDRkdfTUVNVEVTVF9FTkQJCTB4MDNmMDAwMDAKKworLyoKKyAqIFRoZSByZXNlcnZlZCBtZW1vcnkKKyAqLworI2RlZmluZSBDRkdfTU9OSVRPUl9CQVNFCVRFWFRfQkFTRQkvKiBzdGFydCBvZiBtb25pdG9yICovCisKKyNpZiAoQ0ZHX01PTklUT1JfQkFTRSA8IENGR19GTEFTSF9CQVNFKQorI2RlZmluZSBDRkdfUkFNQk9PVAorI2Vsc2UKKyN1bmRlZiAgQ0ZHX1JBTUJPT1QKKyNlbmRpZgorCisjZGVmaW5lIENGR19NT05JVE9SX0xFTgkJKDI1NiAqIDEwMjQpCS8qIFJlc2VydmUgMjU2IGtCIGZvciBNb24gKi8KKyNkZWZpbmUgQ0ZHX01BTExPQ19MRU4JCSgxMjggKiAxMDI0KQkvKiBSZXNlcnZlZCBmb3IgbWFsbG9jICovCisKKy8qCisgKiBJbml0aWFsIFJBTSBCYXNlIEFkZHJlc3MgU2V0dXAKKyAqLworI2RlZmluZSBDRkdfSU5JVF9SQU1fTE9DSwkxCisjZGVmaW5lIENGR19JTklUX1JBTV9BRERSCTB4RTYwMDAwMDAJLyogSW5pdGlhbCBSQU0gYWRkcmVzcyAqLworI2RlZmluZSBDRkdfSU5JVF9SQU1fRU5ECTB4MTAwMAkJLyogRW5kIG9mIHVzZWQgYXJlYSBpbiBSQU0gKi8KKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX1NJWkUJMHgxMDAJCS8qIG51bSBieXRlcyBpbml0aWFsIGRhdGEgKi8KKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX09GRlNFVAkoQ0ZHX0lOSVRfUkFNX0VORCAtIENGR19HQkxfREFUQV9TSVpFKQorCisvKgorICogTG9jYWwgQnVzIENvbmZpZ3VyYXRpb24gJiBDbG9jayBTZXR1cAorICovCisjZGVmaW5lIENGR19MQ1JSCQkoTENSUl9EQllQIHwgTENSUl9DTEtESVZfMikKKyNkZWZpbmUgQ0ZHX0xCQ19MQkNSCQkweDAwMDAwMDAwCisKKy8qCisgKiBGTEFTSCBvbiB0aGUgTG9jYWwgQnVzCisgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX0NGSQkJLyogdXNlIHRoZSBDb21tb24gRmxhc2ggSW50ZXJmYWNlICovCisjZGVmaW5lIENGR19GTEFTSF9DRklfRFJJVkVSCS8qIHVzZSB0aGUgQ0ZJIGRyaXZlciAqLworI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJMHhGRTAwMDAwMAkvKiBGTEFTSCBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX1NJWkUJCTE2CS8qIEZMQVNIIHNpemUgaXMgMTZNICovCisKKyNkZWZpbmUgQ0ZHX0xCTEFXQkFSMF9QUkVMSU0JQ0ZHX0ZMQVNIX0JBU0UJLyogV2luZG93IGJhc2UgYXQgZmxhc2ggYmFzZSAqLworI2RlZmluZSBDRkdfTEJMQVdBUjBfUFJFTElNCTB4ODAwMDAwMTgJLyogMzJNQiB3aW5kb3cgc2l6ZSAqLworCisjZGVmaW5lIENGR19CUjBfUFJFTElNCShDRkdfRkxBU0hfQkFTRSB8CS8qIEZsYXNoIEJhc2UgYWRkcmVzcyAqLyBcCisJCQkoMiA8PCBCUl9QU19TSElGVCkgfAkvKiAxNiBiaXQgcG9ydCBzaXplICovIFwKKwkJCUJSX1YpCQkJLyogdmFsaWQgKi8KKyNkZWZpbmUgQ0ZHX09SMF9QUkVMSU0JCTB4ZmUwMDZmZjcJLyogMTZNQiBGbGFzaCBzaXplICovCisKKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9CQU5LUwkxCQkvKiBudW1iZXIgb2YgYmFua3MgKi8KKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9TRUNUCTEyOAkJLyogc2VjdG9ycyBwZXIgZGV2aWNlICovCisKKyN1bmRlZiBDRkdfRkxBU0hfQ0hFQ0tTVU0KKworLyoKKyAqIFNEUkFNIG9uIHRoZSBMb2NhbCBCdXMKKyAqLworI3VuZGVmIENGR19MQl9TRFJBTQkJLyogVGhlIGJvYXJkIGhhcyBub3QgU1JEQU0gb24gbG9jYWwgYnVzICovCisKKyNpZmRlZiBDRkdfTEJfU0RSQU0KKyNkZWZpbmUgQ0ZHX0xCQ19TRFJBTV9CQVNFCTB4RjAwMDAwMDAJLyogU0RSQU0gYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIENGR19MQkNfU0RSQU1fU0laRQk2NAkJLyogTEJDIFNEUkFNIGlzIDY0TUIgKi8KKworI2RlZmluZSBDRkdfTEJMQVdCQVIyX1BSRUxJTQlDRkdfTEJDX1NEUkFNX0JBU0UKKyNkZWZpbmUgQ0ZHX0xCTEFXQVIyX1BSRUxJTQkweDgwMDAwMDE5CS8qIDY0TUIgKi8KKworLypsb2NhbCBidXMgQlIyLCBPUjIgZGVmaW5pdGlvbiBmb3IgU0RSQU0gaWYgc29sZGVyZWQgb24gdGhlIEVQQiBib2FyZCAqLworLyoKKyAqIEJhc2UgUmVnaXN0ZXIgMiBhbmQgT3B0aW9uIFJlZ2lzdGVyIDIgY29uZmlndXJlIFNEUkFNLgorICogVGhlIFNEUkFNIGJhc2UgYWRkcmVzcywgQ0ZHX0xCQ19TRFJBTV9CQVNFLCBpcyAweGYwMDAwMDAwLgorICoKKyAqIEZvciBCUjIsIG5lZWQ6CisgKiAgICBCYXNlIGFkZHJlc3Mgb2YgMHhmMDAwMDAwMCA9IEJSWzA6MTZdID0gMTExMSAwMDAwIDAwMDAgMDAwMCAwCisgKiAgICBwb3J0IHNpemUgPSAzMi1iaXRzID0gQlIyWzE5OjIwXSA9IDExCisgKiAgICBubyBwYXJpdHkgY2hlY2tpbmcgPSBCUjJbMjE6MjJdID0gMDAKKyAqICAgIFNEUkFNIGZvciBNU0VMID0gQlIyWzI0OjI2XSA9IDAxMQorICogICAgVmFsaWQgPSBCUlszMV0gPSAxCisgKgorICogMCAgICA0ICAgIDggICAgMTIgICAxNiAgIDIwICAgMjQgICAyOAorICogMTExMSAwMDAwIDAwMDAgMDAwMCAwMDAxIDEwMDAgMDExMCAwMDAxID0gZjAwMDE4NjEKKyAqCisgKiBDRkdfTEJDX1NEUkFNX0JBU0Ugc2hvdWxkIGJlIG1hc2tlZCBhbmQgT1InZWQgaW50bworICogdGhlIHRvcCAxNyBiaXRzIG9mIEJSMi4KKyAqLworCisjZGVmaW5lIENGR19CUjJfUFJFTElNCTB4ZjAwMDE4NjEJLypQb3J0IHNpemU9MzJiaXQsIE1TRUw9U0RSQU0gKi8KKworLyoKKyAqIFRoZSBTRFJBTSBzaXplIGluIE1CLCBDRkdfTEJDX1NEUkFNX1NJWkUsIGlzIDY0LgorICoKKyAqIEZvciBPUjIsIG5lZWQ6CisgKiAgICA2NE1CIG1hc2sgZm9yIEFNLCBPUjJbMDo3XSA9IDExMTEgMTEwMAorICogICAgICAgICAgICAgICAgIFhBTSwgT1IyWzE3OjE4XSA9IDExCisgKiAgICA5IGNvbHVtbnMgT1IyWzE5LTIxXSA9IDAxMAorICogICAgMTMgcm93cyAgIE9SMlsyMy0yNV0gPSAxMDAKKyAqICAgIEVBRCBzZXQgZm9yIGV4dHJhIHRpbWUgT1JbMzFdID0gMQorICoKKyAqIDAgICAgNCAgICA4ICAgIDEyICAgMTYgICAyMCAgIDI0ICAgMjgKKyAqIDExMTEgMTEwMCAwMDAwIDAwMDAgMDExMCAxMDAxIDAwMDAgMDAwMSA9IGZjMDA2OTAxCisgKi8KKworI2RlZmluZSBDRkdfT1IyX1BSRUxJTQkweGZjMDA2OTAxCisKKyNkZWZpbmUgQ0ZHX0xCQ19MU1JUCTB4MzIwMDAwMDAJLyogTEIgc2RyYW0gcmVmcmVzaCB0aW1lciwgYWJvdXQgNnVzICovCisjZGVmaW5lIENGR19MQkNfTVJUUFIJMHgyMDAwMDAwMAkvKiBMQiByZWZyZXNoIHRpbWVyIHByZXNjYWwsIDI2Nk1Iei8zMiAqLworCisvKgorICogTFNETVIgbWFza3MKKyAqLworI2RlZmluZSBDRkdfTEJDX0xTRE1SX09QX05PUk1BTAkoMCA8PCAoMzEgLSA0KSkKKyNkZWZpbmUgQ0ZHX0xCQ19MU0RNUl9PUF9BUkZSU0gJKDEgPDwgKDMxIC0gNCkpCisjZGVmaW5lIENGR19MQkNfTFNETVJfT1BfU1JGUlNICSgyIDw8ICgzMSAtIDQpKQorI2RlZmluZSBDRkdfTEJDX0xTRE1SX09QX01SVwkoMyA8PCAoMzEgLSA0KSkKKyNkZWZpbmUgQ0ZHX0xCQ19MU0RNUl9PUF9QUkVDSAkoNCA8PCAoMzEgLSA0KSkKKyNkZWZpbmUgQ0ZHX0xCQ19MU0RNUl9PUF9QQ0hBTEwJKDUgPDwgKDMxIC0gNCkpCisjZGVmaW5lIENGR19MQkNfTFNETVJfT1BfQUNUQk5LCSg2IDw8ICgzMSAtIDQpKQorI2RlZmluZSBDRkdfTEJDX0xTRE1SX09QX1JXSU5WCSg3IDw8ICgzMSAtIDQpKQorCisjZGVmaW5lIENGR19MQkNfTFNETVJfQ09NTU9OCTB4MDA2M2I3MjMKKworLyoKKyAqIFNEUkFNIENvbnRyb2xsZXIgY29uZmlndXJhdGlvbiBzZXF1ZW5jZS4KKyAqLworI2RlZmluZSBDRkdfTEJDX0xTRE1SXzEJCSggQ0ZHX0xCQ19MU0RNUl9DT01NT04gXAorCQkJCXwgQ0ZHX0xCQ19MU0RNUl9PUF9QQ0hBTEwpCisjZGVmaW5lIENGR19MQkNfTFNETVJfMgkJKCBDRkdfTEJDX0xTRE1SX0NPTU1PTiBcCisJCQkJfCBDRkdfTEJDX0xTRE1SX09QX0FSRlJTSCkKKyNkZWZpbmUgQ0ZHX0xCQ19MU0RNUl8zCQkoIENGR19MQkNfTFNETVJfQ09NTU9OIFwKKwkJCQl8IENGR19MQkNfTFNETVJfT1BfQVJGUlNIKQorI2RlZmluZSBDRkdfTEJDX0xTRE1SXzQJCSggQ0ZHX0xCQ19MU0RNUl9DT01NT04gXAorCQkJCXwgQ0ZHX0xCQ19MU0RNUl9PUF9NUlcpCisjZGVmaW5lIENGR19MQkNfTFNETVJfNQkJKCBDRkdfTEJDX0xTRE1SX0NPTU1PTiBcCisJCQkJfCBDRkdfTEJDX0xTRE1SX09QX05PUk1BTCkKKworI2VuZGlmCisKKy8qCisgKiBXaW5kb3dzIHRvIGFjY2VzcyBQSUIgdmlhIGxvY2FsIGJ1cworICovCisjZGVmaW5lIENGR19MQkxBV0JBUjNfUFJFTElNCTB4ZjgwMDgwMDAJLyogd2luZG93cyBiYXNlIDB4ZjgwMDgwMDAgKi8KKyNkZWZpbmUgQ0ZHX0xCTEFXQVIzX1BSRUxJTQkweDgwMDAwMDBmCS8qIHdpbmRvd3Mgc2l6ZSA2NEtCICovCisKKy8qCisgKiBTZXJpYWwgUG9ydAorICovCisjZGVmaW5lIENPTkZJR19DT05TX0lOREVYCTEKKyN1bmRlZiBDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8KKyNkZWZpbmUgQ0ZHX05TMTY1NTAKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfU0VSSUFMCisjZGVmaW5lIENGR19OUzE2NTUwX1JFR19TSVpFCTEKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ0xLCQlnZXRfYnVzX2ZyZXEoMCkKKworI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUgIFwKKwl7MzAwLCA2MDAsIDEyMDAsIDI0MDAsIDQ4MDAsIDk2MDAsIDE5MjAwLCAzODQwMCwxMTUyMDB9CisKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMQkoQ0ZHX0lNTVIrMHg0NTAwKQorI2RlZmluZSBDRkdfTlMxNjU1MF9DT00yCShDRkdfSU1NUisweDQ2MDApCisKKyNkZWZpbmUgQ09ORklHX0NNRExJTkVfRURJVElORwkxCS8qIGFkZCBjb21tYW5kIGxpbmUgaGlzdG9yeSAqLworLyogVXNlIHRoZSBIVVNIIHBhcnNlciAqLworI2RlZmluZSBDRkdfSFVTSF9QQVJTRVIKKyNpZmRlZiBDRkdfSFVTSF9QQVJTRVIKKyNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMiAiPiAiCisjZW5kaWYKKworLyogcGFzcyBvcGVuIGZpcm13YXJlIGZsYXQgdHJlZSAqLworI2RlZmluZSBDT05GSUdfT0ZfTElCRkRUCTEKKyNkZWZpbmUgQ09ORklHX09GX0JPQVJEX1NFVFVQCTEKKworI2RlZmluZSBPRl9DUFUJCQkiUG93ZXJQQyw4MzIzQDAiCisjZGVmaW5lIE9GX1NPQwkJCSJzb2M4MzIzQGUwMDAwMDAwIgorI2RlZmluZSBPRl9RRQkJCSJxZUBlMDEwMDAwMCIKKyNkZWZpbmUgT0ZfVEJDTEsJCShiZC0+YmlfYnVzZnJlcSAvIDQpCisjZGVmaW5lIE9GX1NURE9VVF9QQVRICQkiL3NvYzgzMjNAZTAwMDAwMDAvc2VyaWFsQDQ1MDAiCisKKy8qIEkyQyAqLworI2RlZmluZSBDT05GSUdfSEFSRF9JMkMJCS8qIEkyQyB3aXRoIGhhcmR3YXJlIHN1cHBvcnQgKi8KKyN1bmRlZiBDT05GSUdfU09GVF9JMkMJCS8qIEkyQyBiaXQtYmFuZ2VkICovCisjZGVmaW5lIENPTkZJR19GU0xfSTJDCisjZGVmaW5lIENGR19JMkNfU1BFRUQJNDAwMDAwCS8qIEkyQyBzcGVlZCBhbmQgc2xhdmUgYWRkcmVzcyAqLworI2RlZmluZSBDRkdfSTJDX1NMQVZFCTB4N0YKKyNkZWZpbmUgQ0ZHX0kyQ19OT1BST0JFUwl7MHg1MX0JLyogRG9uJ3QgcHJvYmUgdGhlc2UgYWRkcnMgKi8KKyNkZWZpbmUgQ0ZHX0kyQ19PRkZTRVQJMHgzMDAwCisKKy8qCisgKiBDb25maWcgb24tYm9hcmQgUlRDCisgKi8KKyNkZWZpbmUgQ09ORklHX1JUQ19EUzEzNzQJCS8qIHVzZSBkczEzNzQgcnRjIHZpYSBpMmMgKi8KKyNkZWZpbmUgQ0ZHX0kyQ19SVENfQUREUgkweDY4CS8qIGF0IGFkZHJlc3MgMHg2OCAqLworCisvKgorICogR2VuZXJhbCBQQ0kKKyAqIEFkZHJlc3NlcyBhcmUgbWFwcGVkIDEtMS4KKyAqLworI2RlZmluZSBDRkdfUENJMV9NRU1fQkFTRQkweDgwMDAwMDAwCisjZGVmaW5lIENGR19QQ0kxX01FTV9QSFlTCUNGR19QQ0kxX01FTV9CQVNFCisjZGVmaW5lIENGR19QQ0kxX01FTV9TSVpFCTB4MTAwMDAwMDAJLyogMjU2TSAqLworI2RlZmluZSBDRkdfUENJMV9NTUlPX0JBU0UJMHg5MDAwMDAwMAorI2RlZmluZSBDRkdfUENJMV9NTUlPX1BIWVMJQ0ZHX1BDSTFfTU1JT19CQVNFCisjZGVmaW5lIENGR19QQ0kxX01NSU9fU0laRQkweDEwMDAwMDAwCS8qIDI1Nk0gKi8KKyNkZWZpbmUgQ0ZHX1BDSTFfSU9fQkFTRQkJMHhkMDAwMDAwMAorI2RlZmluZSBDRkdfUENJMV9JT19QSFlTCQlDRkdfUENJMV9JT19CQVNFCisjZGVmaW5lIENGR19QQ0kxX0lPX1NJWkUJCTB4MDQwMDAwMDAJLyogNjRNICovCisKKyNpZmRlZiBDT05GSUdfUENJCisKKyNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQorI2RlZmluZSBDT05GSUdfUENJX1BOUAkJLyogZG8gcGNpIHBsdWctYW5kLXBsYXkgKi8KKworI3VuZGVmIENPTkZJR19FRVBSTzEwMAorI3VuZGVmIENPTkZJR19QQ0lfU0NBTl9TSE9XCS8qIHNob3cgcGNpIGRldmljZXMgb24gc3RhcnR1cCAqLworI2RlZmluZSBDRkdfUENJX1NVQlNZU19WRU5ET1JJRAkweDE5NTcJLyogRnJlZXNjYWxlICovCisKKyNlbmRpZgkvKiBDT05GSUdfUENJICovCisKKworI2lmbmRlZiBDT05GSUdfTkVUX01VTFRJCisjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkJMQorI2VuZGlmCisKKy8qCisgKiBRRSBVRUMgZXRoZXJuZXQgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19VRUNfRVRICisjZGVmaW5lIENPTkZJR19FVEhQUklNRQkJIkZyZWVzY2FsZSBHRVRIIgorCisjZGVmaW5lIENPTkZJR19VRUNfRVRIMQkJLyogRVRIMyAqLworCisjaWZkZWYgQ09ORklHX1VFQ19FVEgxCisjZGVmaW5lIENGR19VRUMxX1VDQ19OVU0JMgkvKiBVQ0MzICovCisjZGVmaW5lIENGR19VRUMxX1JYX0NMSwkJUUVfQ0xLOQorI2RlZmluZSBDRkdfVUVDMV9UWF9DTEsJCVFFX0NMSzEwCisjZGVmaW5lIENGR19VRUMxX0VUSF9UWVBFCUZBU1RfRVRICisjZGVmaW5lIENGR19VRUMxX1BIWV9BRERSCTQKKyNkZWZpbmUgQ0ZHX1VFQzFfSU5URVJGQUNFX01PREUJRU5FVF8xMDBfTUlJCisjZW5kaWYKKworI2RlZmluZSBDT05GSUdfVUVDX0VUSDIJCS8qIEVUSDQgKi8KKworI2lmZGVmIENPTkZJR19VRUNfRVRIMgorI2RlZmluZSBDRkdfVUVDMl9VQ0NfTlVNCTEJLyogVUNDMiAqLworI2RlZmluZSBDRkdfVUVDMl9SWF9DTEsJCVFFX0NMSzE2CisjZGVmaW5lIENGR19VRUMyX1RYX0NMSwkJUUVfQ0xLMworI2RlZmluZSBDRkdfVUVDMl9FVEhfVFlQRQlGQVNUX0VUSAorI2RlZmluZSBDRkdfVUVDMl9QSFlfQUREUgkwCisjZGVmaW5lIENGR19VRUMyX0lOVEVSRkFDRV9NT0RFCUVORVRfMTAwX01JSQorI2VuZGlmCisKKy8qCisgKiBFbnZpcm9ubWVudAorICovCisjaWZuZGVmIENGR19SQU1CT09UCisJI2RlZmluZSBDRkdfRU5WX0lTX0lOX0ZMQVNICTEKKwkjZGVmaW5lIENGR19FTlZfQUREUgkJKENGR19NT05JVE9SX0JBU0UgKyAweDQwMDAwKQorCSNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJMHg0MDAwMAkvKiAyNTZLKG9uZSBzZWN0b3IpIGZvciBlbnYgKi8KKwkjZGVmaW5lIENGR19FTlZfU0laRQkJMHgyMDAwCisjZWxzZQorCSNkZWZpbmUgQ0ZHX05PX0ZMQVNICQkxCS8qIEZsYXNoIGlzIG5vdCB1c2FibGUgbm93ICovCisJI2RlZmluZSBDRkdfRU5WX0lTX05PV0hFUkUJMQkvKiBTdG9yZSBFTlYgaW4gbWVtb3J5IG9ubHkgKi8KKwkjZGVmaW5lIENGR19FTlZfQUREUgkJKENGR19NT05JVE9SX0JBU0UgLSAweDEwMDApCisJI2RlZmluZSBDRkdfRU5WX1NJWkUJCTB4MjAwMAorI2VuZGlmCisKKyNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQgKi8KKyNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlICovCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorCSNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpCisJI3VuZGVmIENPTkZJR19DTURfRU5WCisJI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyNlbmRpZgorCisjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkvKiB3YXRjaGRvZyBkaXNhYmxlZCAqLworCisvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisjZGVmaW5lIENGR19MT05HSEVMUAkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkgKi8KKyNkZWZpbmUgQ0ZHX0xPQURfQUREUgkJMHgyMDAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCisjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgKi8KKworI2lmIChDT05GSUdfQ01EX0tHREIpCisJI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KKyNlbHNlCisJI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLworI2VuZGlmCisKKyNkZWZpbmUgQ0ZHX1BCU0laRSAoQ0ZHX0NCU0laRStzaXplb2YoQ0ZHX1BST01QVCkrMTYpCS8qIFByaW50IEJ1ZmZlciBTaXplICovCisjZGVmaW5lIENGR19NQVhBUkdTCTE2CQkvKiBtYXggbnVtYmVyIG9mIGNvbW1hbmQgYXJncyAqLworI2RlZmluZSBDRkdfQkFSR1NJWkUJQ0ZHX0NCU0laRQkvKiBCb290IEFyZ3VtZW50IEJ1ZmZlciBTaXplICovCisjZGVmaW5lIENGR19IWgkJMTAwMAkJLyogZGVjcmVtZW50ZXIgZnJlcTogMW1zIHRpY2tzICovCisKKy8qCisgKiBGb3IgYm9vdGluZyBMaW51eCwgdGhlIGJvYXJkIGluZm8gYW5kIGNvbW1hbmQgbGluZSBkYXRhCisgKiBoYXZlIHRvIGJlIGluIHRoZSBmaXJzdCA4IE1CIG9mIG1lbW9yeSwgc2luY2UgdGhpcyBpcworICogdGhlIG1heGltdW0gbWFwcGVkIGJ5IHRoZSBMaW51eCBrZXJuZWwgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICovCisjZGVmaW5lIENGR19CT09UTUFQU1oJCSg4IDw8IDIwKQkvKiBJbml0aWFsIE1lbW9yeSBtYXAgZm9yIExpbnV4ICovCisKKy8qCisgKiBDb3JlIEhJRCBTZXR1cAorICovCisjZGVmaW5lIENGR19ISUQwX0lOSVQJCTB4MDAwMDAwMDAwCisjZGVmaW5lIENGR19ISUQwX0ZJTkFMCQlISUQwX0VOQUJMRV9NQUNISU5FX0NIRUNLCisjZGVmaW5lIENGR19ISUQyCQlISUQyX0hCRQorCisvKgorICogQ2FjaGUgQ29uZmlnCisgKi8KKyNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKyNlbmRpZgorCisvKgorICogTU1VIFNldHVwCisgKi8KKworLyogRERSOiBjYWNoZSBjYWNoZWFibGUgKi8KKyNkZWZpbmUgQ0ZHX0lCQVQwTAkoQ0ZHX1NEUkFNX0JBU0UgfCBCQVRMX1BQXzEwIHwgQkFUTF9NRU1DT0hFUkVOQ0UpCisjZGVmaW5lIENGR19JQkFUMFUJKENGR19TRFJBTV9CQVNFIHwgQkFUVV9CTF8yNTZNIHwgQkFUVV9WUyB8IEJBVFVfVlApCisjZGVmaW5lIENGR19EQkFUMEwJQ0ZHX0lCQVQwTAorI2RlZmluZSBDRkdfREJBVDBVCUNGR19JQkFUMFUKKworLyogSU1NUkJBUiAmIFBDSSBJTzogY2FjaGUtaW5oaWJpdCBhbmQgZ3VhcmRlZCAqLworI2RlZmluZSBDRkdfSUJBVDFMCShDRkdfSU1NUiB8IEJBVExfUFBfMTAgfCBcCisJCQlCQVRMX0NBQ0hFSU5ISUJJVCB8IEJBVExfR1VBUkRFRFNUT1JBR0UpCisjZGVmaW5lIENGR19JQkFUMVUJKENGR19JTU1SIHwgQkFUVV9CTF80TSB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorI2RlZmluZSBDRkdfREJBVDFMCUNGR19JQkFUMUwKKyNkZWZpbmUgQ0ZHX0RCQVQxVQlDRkdfSUJBVDFVCisKKy8qIEZMQVNIOiBpY2FjaGUgY2FjaGVhYmxlLCBidXQgZGNhY2hlLWluaGliaXQgYW5kIGd1YXJkZWQgKi8KKyNkZWZpbmUgQ0ZHX0lCQVQyTAkoQ0ZHX0ZMQVNIX0JBU0UgfCBCQVRMX1BQXzEwIHwgQkFUTF9NRU1DT0hFUkVOQ0UpCisjZGVmaW5lIENGR19JQkFUMlUJKENGR19GTEFTSF9CQVNFIHwgQkFUVV9CTF8zMk0gfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKyNkZWZpbmUgQ0ZHX0RCQVQyTAkoQ0ZHX0ZMQVNIX0JBU0UgfCBCQVRMX1BQXzEwIHwgXAorCQkJQkFUTF9DQUNIRUlOSElCSVQgfCBCQVRMX0dVQVJERURTVE9SQUdFKQorI2RlZmluZSBDRkdfREJBVDJVCUNGR19JQkFUMlUKKworI2RlZmluZSBDRkdfSUJBVDNMCSgwKQorI2RlZmluZSBDRkdfSUJBVDNVCSgwKQorI2RlZmluZSBDRkdfREJBVDNMCUNGR19JQkFUM0wKKyNkZWZpbmUgQ0ZHX0RCQVQzVQlDRkdfSUJBVDNVCisKKy8qIFN0YWNrIGluIGRjYWNoZTogY2FjaGVhYmxlLCBubyBtZW1vcnkgY29oZXJlbmNlICovCisjZGVmaW5lIENGR19JQkFUNEwJKENGR19JTklUX1JBTV9BRERSIHwgQkFUTF9QUF8xMCkKKyNkZWZpbmUgQ0ZHX0lCQVQ0VQkoQ0ZHX0lOSVRfUkFNX0FERFIgfCBCQVRVX0JMXzEyOEsgfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKyNkZWZpbmUgQ0ZHX0RCQVQ0TAlDRkdfSUJBVDRMCisjZGVmaW5lIENGR19EQkFUNFUJQ0ZHX0lCQVQ0VQorCisjaWZkZWYgQ09ORklHX1BDSQorLyogUENJIE1FTSBzcGFjZTogY2FjaGVhYmxlICovCisjZGVmaW5lIENGR19JQkFUNUwJKENGR19QQ0kxX01FTV9QSFlTIHwgQkFUTF9QUF8xMCB8IEJBVExfTUVNQ09IRVJFTkNFKQorI2RlZmluZSBDRkdfSUJBVDVVCShDRkdfUENJMV9NRU1fUEhZUyB8IEJBVFVfQkxfMjU2TSB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorI2RlZmluZSBDRkdfREJBVDVMCUNGR19JQkFUNUwKKyNkZWZpbmUgQ0ZHX0RCQVQ1VQlDRkdfSUJBVDVVCisvKiBQQ0kgTU1JTyBzcGFjZTogY2FjaGUtaW5oaWJpdCBhbmQgZ3VhcmRlZCAqLworI2RlZmluZSBDRkdfSUJBVDZMCShDRkdfUENJMV9NTUlPX1BIWVMgfCBCQVRMX1BQXzEwIHwgXAorCQkJQkFUTF9DQUNIRUlOSElCSVQgfCBCQVRMX0dVQVJERURTVE9SQUdFKQorI2RlZmluZSBDRkdfSUJBVDZVCShDRkdfUENJMV9NTUlPX1BIWVMgfCBCQVRVX0JMXzI1Nk0gfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKyNkZWZpbmUgQ0ZHX0RCQVQ2TAlDRkdfSUJBVDZMCisjZGVmaW5lIENGR19EQkFUNlUJQ0ZHX0lCQVQ2VQorI2Vsc2UKKyNkZWZpbmUgQ0ZHX0lCQVQ1TAkoMCkKKyNkZWZpbmUgQ0ZHX0lCQVQ1VQkoMCkKKyNkZWZpbmUgQ0ZHX0lCQVQ2TAkoMCkKKyNkZWZpbmUgQ0ZHX0lCQVQ2VQkoMCkKKyNkZWZpbmUgQ0ZHX0RCQVQ1TAlDRkdfSUJBVDVMCisjZGVmaW5lIENGR19EQkFUNVUJQ0ZHX0lCQVQ1VQorI2RlZmluZSBDRkdfREJBVDZMCUNGR19JQkFUNkwKKyNkZWZpbmUgQ0ZHX0RCQVQ2VQlDRkdfSUJBVDZVCisjZW5kaWYKKworLyogTm90aGluZyBpbiBCQVQ3ICovCisjZGVmaW5lIENGR19JQkFUN0wJKDApCisjZGVmaW5lIENGR19JQkFUN1UJKDApCisjZGVmaW5lIENGR19EQkFUN0wJQ0ZHX0lCQVQ3TAorI2RlZmluZSBDRkdfREJBVDdVCUNGR19JQkFUN1UKKworLyoKKyAqIEludGVybmFsIERlZmluaXRpb25zCisgKgorICogQm9vdCBGbGFncworICovCisjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLworI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJLyogU29mdHdhcmUgcmVib290ICovCisKKyNpZiAoQ09ORklHX0NNRF9LR0RCKQorI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgb2Yga2dkYiBzZXJpYWwgcG9ydCAqLworI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KKyNlbmRpZgorCisvKgorICogRW52aXJvbm1lbnQgQ29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFCisKKyNkZWZpbmUgQ09ORklHX0VUSEFERFIJMDA6MDQ6OWY6ZWY6MDM6MDEKKyNkZWZpbmUgQ09ORklHX0hBU19FVEgxCQkJCS8qIGFkZCBzdXBwb3J0IGZvciAiZXRoMWFkZHIiICovCisjZGVmaW5lIENPTkZJR19FVEgxQUREUgkwMDowNDo5ZjplZjowMzowMgorCisjZGVmaW5lIENPTkZJR19JUEFERFIJCTEwLjAuMC4yCisjZGVmaW5lIENPTkZJR19TRVJWRVJJUAkJMTAuMC4wLjEKKyNkZWZpbmUgQ09ORklHX0dBVEVXQVlJUAkxMC4wLjAuMQorI2RlZmluZSBDT05GSUdfTkVUTUFTSwkJMjU1LjAuMC4wCisjZGVmaW5lIENPTkZJR19ORVRERVYJCWV0aDEKKworI2RlZmluZSBDT05GSUdfSE9TVE5BTUUJCW1wYzgzMjNlcmRiCisjZGVmaW5lIENPTkZJR19ST09UUEFUSAkJL25mc3Jvb3QKKyNkZWZpbmUgQ09ORklHX1JBTURJU0tGSUxFCXJvb3Rmcy5leHQyLmd6LnVib290CisjZGVmaW5lIENPTkZJR19CT09URklMRQkJdUltYWdlCisjZGVmaW5lIENPTkZJR19VQk9PVFBBVEgJdS1ib290LmJpbgkvKiBVLUJvb3QgaW1hZ2Ugb24gVEZUUCBzZXJ2ZXIgKi8KKyNkZWZpbmUgQ09ORklHX0ZEVEZJTEUJCW1wYzgzMnhfcmRiLmR0YgorCisjZGVmaW5lIENPTkZJR19MT0FEQUREUgkJMjAwMDAwCS8qIGRlZmF1bHQgbG9jYXRpb24gZm9yIHRmdHAgYW5kIGJvb3RtICovCisjZGVmaW5lIENPTkZJR19CT09UREVMQVkJLTEJLyogLTEgZGlzYWJsZXMgYXV0by1ib290ICovCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCisKKyNkZWZpbmUgWE1LX1NUUih4KQkjeAorI2RlZmluZSBNS19TVFIoeCkJWE1LX1NUUih4KQorCisjZGVmaW5lIENPTkZJR19FWFRSQV9FTlZfU0VUVElOR1MgXAorCSJuZXRkZXY9IiBNS19TVFIoQ09ORklHX05FVERFVikgIlwwIgkJCQlcCisJInVib290PSIgTUtfU1RSKENPTkZJR19VQk9PVFBBVEgpICJcMCIJCQkJXAorCSJ0ZnRwZmxhc2g9dGZ0cCAkbG9hZGFkZHIgJHVib290OyIJCQkJXAorCQkicHJvdGVjdCBvZmYgIiBNS19TVFIoVEVYVF9CQVNFKSAiICskZmlsZXNpemU7ICIJXAorCQkiZXJhc2UgIiBNS19TVFIoVEVYVF9CQVNFKSAiICskZmlsZXNpemU7ICIJCVwKKwkJImNwLmIgJGxvYWRhZGRyICIgTUtfU1RSKFRFWFRfQkFTRSkgIiAkZmlsZXNpemU7ICIJXAorCQkicHJvdGVjdCBvbiAiIE1LX1NUUihURVhUX0JBU0UpICIgKyRmaWxlc2l6ZTsgIgkJXAorCQkiY21wLmIgJGxvYWRhZGRyICIgTUtfU1RSKFRFWFRfQkFTRSkgIiAkZmlsZXNpemVcMCIJXAorCSJmZHRhZGRyPTQwMDAwMFwwIgkJCQkJCVwKKwkiZmR0ZmlsZT0iIE1LX1NUUihDT05GSUdfRkRURklMRSkgIlwwIgkJCQlcCisJInJhbWRpc2thZGRyPTEwMDAwMDBcMCIJCQkJCQlcCisJInJhbWRpc2tmaWxlPSIgTUtfU1RSKENPTkZJR19SQU1ESVNLRklMRSkgIlwwIgkJCVwKKwkiY29uc29sZT10dHlTMFwwIgkJCQkJCVwKKwkic2V0Ym9vdGFyZ3M9c2V0ZW52IGJvb3RhcmdzICIJCQkJCVwKKwkJInJvb3Q9JHJvb3RkZXYgcncgY29uc29sZT0kY29uc29sZSwkYmF1ZHJhdGUgJG90aGJvb3RhcmdzXDAiIFwKKwkic2V0aXBhcmdzPXNldGVudiBib290YXJncyBuZnNyb290PSRzZXJ2ZXJpcDokcm9vdHBhdGggIglcCisJCSJpcD0kaXBhZGRyOiRzZXJ2ZXJpcDokZ2F0ZXdheWlwOiRuZXRtYXNrOiRob3N0bmFtZTokbmV0ZGV2Om9mZiAiIFwKKwkJInJvb3Q9JHJvb3RkZXYgcncgY29uc29sZT0kY29uc29sZSwkYmF1ZHJhdGUgJG90aGJvb3RhcmdzXDAiCisKKyNkZWZpbmUgQ09ORklHX05GU0JPT1RDT01NQU5ECQkJCQkJXAorCSJzZXRlbnYgcm9vdGRldiAvZGV2L25mczsiCQkJCQlcCisJInJ1biBzZXRib290YXJnczsiCQkJCQkJXAorCSJydW4gc2V0aXBhcmdzOyIJCQkJCQlcCisJInRmdHAgJGxvYWRhZGRyICRib290ZmlsZTsiCQkJCQlcCisJInRmdHAgJGZkdGFkZHIgJGZkdGZpbGU7IgkJCQkJXAorCSJib290bSAkbG9hZGFkZHIgLSAkZmR0YWRkciIKKworI2RlZmluZSBDT05GSUdfUkFNQk9PVENPTU1BTkQJCQkJCQlcCisJInNldGVudiByb290ZGV2IC9kZXYvcmFtOyIJCQkJCVwKKwkicnVuIHNldGJvb3RhcmdzOyIJCQkJCQlcCisJInRmdHAgJHJhbWRpc2thZGRyICRyYW1kaXNrZmlsZTsiCQkJCVwKKwkidGZ0cCAkbG9hZGFkZHIgJGJvb3RmaWxlOyIJCQkJCVwKKwkidGZ0cCAkZmR0YWRkciAkZmR0ZmlsZTsiCQkJCQlcCisJImJvb3RtICRsb2FkYWRkciAkcmFtZGlza2FkZHIgJGZkdGFkZHIiCisKKyN1bmRlZiBNS19TVFIKKyN1bmRlZiBYTUtfU1RSCisKKyNlbmRpZgkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODMyWEVNRFMuaCBiL2luY2x1ZGUvY29uZmlncy9NUEM4MzJYRU1EUy5oCmluZGV4IGNlY2IyMjUuLmY2MmNhMmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9NUEM4MzJYRU1EUy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9NUEM4MzJYRU1EUy5oCkBAIC00MjMsNDEgKzQyMywzMyBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZCAqLwogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UgKi8KIAotI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwgXAotCQkJCXwgQ0ZHX0NNRF9QSU5HIFwKLQkJCQl8IENGR19DTURfQVNLRU5WIFwKLQkJCQl8IENGR19DTURfUENJIFwKLQkJCQl8IENGR19DTURfSTJDKSBcCi0JCQkJJiBcCi0JCQkJfihDRkdfQ01EX0VOViBcCi0JCQkJfCBDRkdfQ01EX0xPQURTKSkKLSNlbHNlCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTCBcCi0JCQkJfCBDRkdfQ01EX1BJTkcgXAotCQkJCXwgQ0ZHX0NNRF9BU0tFTlYgXAotCQkJCXwgQ0ZHX0NNRF9JMkMpIFwKLQkJCQkmIFwKLQkJCQl+KENGR19DTURfRU5WIFwKLQkJCQl8IENGR19DTURfTE9BRFMpKQotI2VuZGlmCi0jZWxzZQotI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwgXAotCQkJCXwgQ0ZHX0NNRF9QQ0kgXAotCQkJCXwgQ0ZHX0NNRF9QSU5HIFwKLQkJCQl8IENGR19DTURfQVNLRU5WIFwKLQkJCQl8IENGR19DTURfSTJDKQotI2Vsc2UKLSNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwgXAotCQkJCXwgQ0ZHX0NNRF9QSU5HIFwKLQkJCQl8IENGR19DTURfQVNLRU5WIFwKLQkJCQl8IENGR19DTURfSTJDICApCi0jZW5kaWYKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCiAjZW5kaWYKIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpCisgICAgI3VuZGVmIENPTkZJR19DTURfRU5WCisgICAgI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyNlbmRpZgorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCS8qIHdhdGNoZG9nIGRpc2FibGVkICovCiAKQEAgLTQ2OCw3ICs0NjAsNyBAQAogI2RlZmluZSBDRkdfTE9BRF9BRERSCQkweDIwMDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAkjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKIAkjZGVmaW5lIENGR19DQlNJWkUJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCkBAIC00OTgsNyArNDkwLDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTE2Mzg0CiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKmxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApAQCAtNTc1LDcgKzU2Nyw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJLyogU29mdHdhcmUgcmVib290ICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgb2Yga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL01QQzgzNDlFTURTLmggYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODM0OUVNRFMuaAppbmRleCAwNDYwYmU5Li4xNTY3ZmNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODM0OUVNRFMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODM0OUVNRFMuaApAQCAtNDMyLDEwICs0MzIsMTAgQEAKICNlbmRpZgogCiAjZGVmaW5lIENPTkZJR19HTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudCAqLwotI2RlZmluZSBDT05GSUdfTVBDODNYWF9UU0VDMQkxCi0jZGVmaW5lIENPTkZJR19NUEM4M1hYX1RTRUMxX05BTUUJIlRTRUMwIgotI2RlZmluZSBDT05GSUdfTVBDODNYWF9UU0VDMgkxCi0jZGVmaW5lIENPTkZJR19NUEM4M1hYX1RTRUMyX05BTUUJIlRTRUMxIgorI2RlZmluZSBDT05GSUdfVFNFQzEJMQorI2RlZmluZSBDT05GSUdfVFNFQzFfTkFNRQkiVFNFQzAiCisjZGVmaW5lIENPTkZJR19UU0VDMgkxCisjZGVmaW5lIENPTkZJR19UU0VDMl9OQU1FCSJUU0VDMSIKICNkZWZpbmUgVFNFQzFfUEhZX0FERFIJCTAKICNkZWZpbmUgVFNFQzJfUEhZX0FERFIJCTEKICNkZWZpbmUgVFNFQzFfUEhZSURYCQkwCkBAIC00NzUsNDQgKzQ3NSwzNSBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZCAqLwogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UgKi8KIAotI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX01JSQorCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwJXAotCQkJCSB8IENGR19DTURfUElORwkJXAotCQkJCSB8IENGR19DTURfUENJCQlcCi0JCQkJIHwgQ0ZHX0NNRF9JMkMgICAgICAgICAgXAotCQkJCSB8IENGR19DTURfREFURSkJXAotCQkJCSYJCQlcCi0JCQkJIH4oQ0ZHX0NNRF9FTlYJCVwKLQkJCQkgIHwgQ0ZHX0NNRF9MT0FEUykpCi0jZWxzZQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwJXAotCQkJCSB8IENGR19DTURfUElORwkJXAotCQkJCSB8IENGR19DTURfSTJDCQlcCi0JCQkJIHwgQ0ZHX0NNRF9EQVRFKQlcCi0JCQkJJgkJCVwKLQkJCQkgfihDRkdfQ01EX0VOVgkJXAotCQkJCSAgfCBDRkdfQ01EX0xPQURTKSkKLSNlbmRpZgotI2Vsc2UKLSNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMCQlcCi0JCQkJfCBDRkdfQ01EX1BDSQkJXAotCQkJCXwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJfCBDRkdfQ01EX0kyQwkJXAotCQkJCXwgQ0ZHX0NNRF9EQVRFCQlcCi0JCQkJKQotI2Vsc2UKLSNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwJCVwKLQkJCQl8IENGR19DTURfUElORwkJXAotCQkJCXwgQ0ZHX0NNRF9JMkMgICAgICAgCVwKLQkJCQl8IENGR19DTURfTUlJICAgICAgIAlcCi0JCQkJfCBDRkdfQ01EX0RBVEUJCVwKLQkJCQkpCi0jZW5kaWYKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCiAjZW5kaWYKIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpCisgICAgI3VuZGVmIENPTkZJR19DTURfRU5WCisgICAgI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyNlbmRpZgorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZCAqLwogCkBAIC01MjMsNyArNTE0LDcgQEAKICNkZWZpbmUgQ0ZHX0xPQURfQUREUgkweDIwMDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKIAkjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAJI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTU0NCw3ICs1MzUsNyBAQAogLyogQ2FjaGUgQ29uZmlndXJhdGlvbiAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTMyNzY4CiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKmxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlKi8KICNlbmRpZgogCkBAIC02OTUsNyArNjg2LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCBvZiBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODM0OUlUWC5oIGIvaW5jbHVkZS9jb25maWdzL01QQzgzNDlJVFguaAppbmRleCA5MDYzMzllLi40NDY0OWQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODM0OUlUWC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9NUEM4MzQ5SVRYLmgKQEAgLTI4OSw2ICsyODksNyBAQAogI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUgIFwKIAl7MzAwLCA2MDAsIDEyMDAsIDI0MDAsIDQ4MDAsIDk2MDAsIDE5MjAwLCAzODQwMCwgMTE1MjAwfQogCisjZGVmaW5lIENPTkZJR19DT05TT0xFCQl0dHlTMAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAogCiAjZGVmaW5lIENGR19OUzE2NTUwX0NPTTEJKENGR19JTU1SICsgMHg0NTAwKQpAQCAtMzcyLDIwICszNzMsMjAgQEAKIAogI2RlZmluZSBDT05GSUdfTkVUX01VTFRJCiAjZGVmaW5lIENPTkZJR19NSUkKLSNkZWZpbmUgQ09ORklHX1BIWV9HSUdFCQkvKiBJbiBjYXNlIENGR19DTURfTUlJIGlzIHNwZWNpZmllZCAqLworI2RlZmluZSBDT05GSUdfUEhZX0dJR0UJCS8qIEluIGNhc2UgQ09ORklHX0NNRF9NSUkgaXMgc3BlY2lmaWVkICovCiAKLSNkZWZpbmUgQ09ORklHX01QQzgzWFhfVFNFQzEKKyNkZWZpbmUgQ09ORklHX1RTRUMxCiAKLSNpZmRlZiBDT05GSUdfTVBDODNYWF9UU0VDMQotI2RlZmluZSBDT05GSUdfTVBDODNYWF9UU0VDMV9OQU1FICAiVFNFQzAiCisjaWZkZWYgQ09ORklHX1RTRUMxCisjZGVmaW5lIENPTkZJR19UU0VDMV9OQU1FICAiVFNFQzAiCiAjZGVmaW5lIENGR19UU0VDMV9PRkZTRVQJMHgyNDAwMAogI2RlZmluZSBUU0VDMV9QSFlfQUREUgkJMHgxYwkvKiBWU0M4MjAxIHVzZXMgYWRkcmVzcyAweDFjICovCiAjZGVmaW5lIFRTRUMxX1BIWUlEWAkJMAogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfTVBDODNYWF9UU0VDMgorI2lmZGVmIENPTkZJR19UU0VDMgogI2RlZmluZSBDT05GSUdfSEFTX0VUSDEKLSNkZWZpbmUgQ09ORklHX01QQzgzWFhfVFNFQzJfTkFNRSAgIlRTRUMxIgorI2RlZmluZSBDT05GSUdfVFNFQzJfTkFNRSAgIlRTRUMxIgogI2RlZmluZSBDRkdfVFNFQzJfT0ZGU0VUCTB4MjUwMDAKICNkZWZpbmUgQ09ORklHX1VOS05PV05fVFNFQwkvKiBUU0VDMiBpcyBwcm9wcmlldGFyeSAqLwogI2RlZmluZSBUU0VDMl9QSFlfQUREUgkJNApAQCAtNDA4LDYgKzQwOSw3IEBACiAgICNkZWZpbmUgQ0ZHX0VOVl9TSVpFCQkweDIwMDAKICNlbHNlCiAgICNkZWZpbmUgQ0ZHX05PX0ZMQVNICQkvKiBGbGFzaCBpcyBub3QgdXNhYmxlIG5vdyAqLworICAjdW5kZWYgIENGR19GTEFTSF9DRklfRFJJVkVSCiAgICNkZWZpbmUgQ0ZHX0VOVl9JU19OT1dIRVJFCS8qIFN0b3JlIEVOViBpbiBtZW1vcnkgb25seSAqLwogICAjZGVmaW5lIENGR19FTlZfQUREUgkJKENGR19NT05JVE9SX0JBU0UgLSAweDEwMDApCiAgICNkZWZpbmUgQ0ZHX0VOVl9TSVpFCQkweDIwMDAKQEAgLTQxNiw0MCArNDE4LDQxIEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZCAqLwogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlICovCiAKLS8qIENPTkZJR19DT01NQU5EUyAqLworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQogCiAjaWZkZWYgQ09ORklHX0NPTVBBQ1RfRkxBU0gKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTX0NGCShDRkdfQ01EX0lERSB8IENGR19DTURfRkFUKQotI2Vsc2UKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTX0NGCTAKKyAgICAjZGVmaW5lIENPTkZJR19DTURfSURFCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0ZBVAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfUENJCi0jZGVmaW5lIENPTkZJR19DT01NQU5EU19QQ0kJQ0ZHX0NNRF9QQ0kKLSNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EU19QQ0kJMAorICAgICNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0hBUkRfSTJDCi0jZGVmaW5lIENPTkZJR19DT01NQU5EU19JMkMJQ0ZHX0NNRF9JMkMKLSNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EU19JMkMJMAorICAgICNkZWZpbmUgQ09ORklHX0NNRF9JMkMKICNlbmRpZgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMIHwgXAotCQkJCUNPTkZJR19DT01NQU5EU19DRgl8IFwKLQkJCQlDRkdfQ01EX05FVAl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ09ORklHX0NPTU1BTkRTX0kyQwl8IFwKLQkJCQlDT05GSUdfQ09NTUFORFNfUENJCXwgXAotCQkJCUNGR19DTURfU0RSQU0JfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfQ0FDSEUJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEpCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qIFdhdGNoZG9nICovCi0KICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCS8qIHdhdGNoZG9nIGRpc2FibGVkICovCiAKIC8qCkBAIC00NjksNyArNDcyLDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVAkiTVBDODM0OUUtbUlUWC1HUD4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAgICAgI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCiAjZWxzZQogICAgICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCkBAIC00OTIsNyArNDk1LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTMyNzY4CiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKQEAgLTYxNyw3ICs2MjAsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIG9mIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKQEAgLTYyOCwxMSArNjMxLDExIEBACiAgKi8KICNkZWZpbmUgQ09ORklHX0VOVl9PVkVSV1JJVEUKIAotI2lmZGVmIENPTkZJR19NUEM4M1hYX1RTRUMxCisjaWZkZWYgQ09ORklHX1RTRUMxCiAjZGVmaW5lIENPTkZJR19FVEhBRERSCQkwMDpFMDowQzowMDo4QzowMQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfTVBDODNYWF9UU0VDMgorI2lmZGVmIENPTkZJR19UU0VDMgogI2RlZmluZSBDT05GSUdfRVRIMUFERFIJCTAwOkUwOjBDOjAwOjhDOjAyCiAjZW5kaWYKIApAQCAtNjcwLDkgKzY3MywxMCBAQAogCSIgaXA9IiBNS19TVFIoQ09ORklHX0lQQUREUikgIjoiIE1LX1NUUihDT05GSUdfU0VSVkVSSVApICI6IiAJXAogCQlNS19TVFIoQ09ORklHX0dBVEVXQVlJUCkgIjoiIE1LX1NUUihDT05GSUdfTkVUTUFTSykgIjoiIFwKIAkJTUtfU1RSKENPTkZJR19IT1NUTkFNRSkgIjoiIE1LX1NUUihDT05GSUdfTkVUREVWKSAiOm9mZiIgXAotCSIgY29uc29sZT10dHlTMCwiIE1LX1NUUihDT05GSUdfQkFVRFJBVEUpCisJIiBjb25zb2xlPSIgTUtfU1RSKENPTkZJR19DT05TT0xFKSAiLCIgTUtfU1RSKENPTkZJR19CQVVEUkFURSkKIAogI2RlZmluZSBDT05GSUdfRVhUUkFfRU5WX1NFVFRJTkdTIFwKKwkiY29uc29sZT0iIE1LX1NUUihDT05GSUdfQ09OU09MRSkgIlwwIiAJCQkJXAogCSJuZXRkZXY9IiBNS19TVFIoQ09ORklHX05FVERFVikgIlwwIiAJCQkJXAogCSJ1Ym9vdD0iIE1LX1NUUihDT05GSUdfVUJPT1RQQVRIKSAiXDAiIAkJCQlcCiAJInRmdHBmbGFzaD10ZnRwYm9vdCAkbG9hZGFkZHIgJHVib290OyAiIAkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NUEM4MzYwRU1EUy5oIGIvaW5jbHVkZS9jb25maWdzL01QQzgzNjBFTURTLmgKaW5kZXggNzk5MzdkYy4uNGIzMmExNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01QQzgzNjBFTURTLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01QQzgzNjBFTURTLmgKQEAgLTQ1Nyw0MSArNDU3LDMzIEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkICovCiAjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZSAqLwogCi0jaWYgZGVmaW5lZChDRkdfUkFNQk9PVCkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisKICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0jZGVmaW5lCSBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTCBcCi0JCQkJfCBDRkdfQ01EX1BJTkcgXAotCQkJCXwgQ0ZHX0NNRF9BU0tFTlYgXAotCQkJCXwgQ0ZHX0NNRF9QQ0kgXAotCQkJCXwgQ0ZHX0NNRF9JMkMpIFwKLQkJCQkmIFwKLQkJCQl+KENGR19DTURfRU5WIFwKLQkJCQl8IENGR19DTURfTE9BRFMpKQotI2Vsc2UKLSNkZWZpbmUJIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMIFwKLQkJCQl8IENGR19DTURfUElORyBcCi0JCQkJfCBDRkdfQ01EX0FTS0VOViBcCi0JCQkJfCBDRkdfQ01EX0kyQykgXAotCQkJCSYgXAotCQkJCX4oQ0ZHX0NNRF9FTlYgXAotCQkJCXwgQ0ZHX0NNRF9MT0FEUykpCi0jZW5kaWYKLSNlbHNlCi0jaWYgZGVmaW5lZChDT05GSUdfUENJKQotI2RlZmluZQkgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCBcCi0JCQkJfCBDRkdfQ01EX1BDSSBcCi0JCQkJfCBDRkdfQ01EX1BJTkcgXAotCQkJCXwgQ0ZHX0NNRF9BU0tFTlYgXAotCQkJCXwgQ0ZHX0NNRF9JMkMpCi0jZWxzZQotI2RlZmluZQkgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCBcCi0JCQkJfCBDRkdfQ01EX1BJTkcgXAotCQkJCXwgQ0ZHX0NNRF9BU0tFTlYgXAotCQkJCXwgQ0ZHX0NNRF9JMkMgICkKLSNlbmRpZgorICAgICNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKICNlbmRpZgogCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjaWYgZGVmaW5lZChDRkdfUkFNQk9PVCkKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9FTlYKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9MT0FEUworI2VuZGlmCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJLyogd2F0Y2hkb2cgZGlzYWJsZWQgKi8KIApAQCAtNTAyLDcgKzQ5NCw3IEBACiAjZGVmaW5lIENGR19MT0FEX0FERFIJCTB4MjAwMDAwMCAvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCSNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0IC8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCiAjZWxzZQogCSNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYgLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTUzMiw3ICs1MjQsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMzI3NjgKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1IC8qbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCkBAIC02MTAsNyArNjAyLDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxIC8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMiAvKiBTb2Z0d2FyZSByZWJvb3QgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCBvZiBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODU0MEFEUy5oIGIvaW5jbHVkZS9jb25maWdzL01QQzg1NDBBRFMuaAppbmRleCA1YWVlYTU4Li41YTdjODc5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODU0MEFEUy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9NUEM4NTQwQURTLmgKQEAgLTM2NiwxMCArMzY2LDEwIEBACiAjZW5kaWYKIAogI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudCAqLwotI2RlZmluZSBDT05GSUdfTVBDODVYWF9UU0VDMQkxCi0jZGVmaW5lIENPTkZJR19NUEM4NVhYX1RTRUMxX05BTUUJIlRTRUMwIgotI2RlZmluZSBDT05GSUdfTVBDODVYWF9UU0VDMgkxCi0jZGVmaW5lIENPTkZJR19NUEM4NVhYX1RTRUMyX05BTUUJIlRTRUMxIgorI2RlZmluZSBDT05GSUdfVFNFQzEJMQorI2RlZmluZSBDT05GSUdfVFNFQzFfTkFNRQkiVFNFQzAiCisjZGVmaW5lIENPTkZJR19UU0VDMgkxCisjZGVmaW5lIENPTkZJR19UU0VDMl9OQU1FCSJUU0VDMSIKICNkZWZpbmUgVFNFQzFfUEhZX0FERFIJCTAKICNkZWZpbmUgVFNFQzJfUEhZX0FERFIJCTEKICNkZWZpbmUgVFNFQzFfUEhZSURYCQkwCkBAIC00MDcsMzcgKzQwNywzMyBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZCAqLwogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UgKi8KIAotI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpCi0gICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwJXAotCQkJCSB8IENGR19DTURfUElORwkJXAotCQkJCSB8IENGR19DTURfUENJCQlcCi0JCQkJIHwgQ0ZHX0NNRF9JMkMpCQlcCi0JCQkJJgkJCVwKLQkJCQkgfihDRkdfQ01EX0VOVgkJXAotCQkJCSAgfCBDRkdfQ01EX0xPQURTKSkKLSAgI2Vsc2UKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTAlcCi0JCQkJIHwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJIHwgQ0ZHX0NNRF9JMkMpCQlcCi0JCQkJJgkJCVwKLQkJCQkgfihDRkdfQ01EX0VOVgkJXAotCQkJCSAgfCBDRkdfQ01EX0xPQURTKSkKLSAgI2VuZGlmCi0jZWxzZQotICAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotICAgICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwJCVwKLQkJCQl8IENGR19DTURfUENJCQlcCi0JCQkJfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQl8IENGR19DTURfSTJDKQotICAjZWxzZQotICAgICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwJCVwKLQkJCQl8IENGR19DTURfUElORwkJXAotCQkJCXwgQ0ZHX0NNRF9JMkMpCi0gICNlbmRpZgorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0kyQworCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKICNlbmRpZgogCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjaWYgZGVmaW5lZChDRkdfUkFNQk9PVCkKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9FTlYKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9MT0FEUworI2VuZGlmCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkICovCiAKQEAgLTQ0OCw3ICs0NDQsNyBAQAogI2RlZmluZSBDRkdfTE9BRF9BRERSCTB4MjAwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogICAgICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICAgICAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtNDY5LDcgKzQ2NSw3IEBACiAvKiBDYWNoZSBDb25maWd1cmF0aW9uICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMzI3NjgKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUqLwogI2VuZGlmCiAKQEAgLTQ4MSw3ICs0NzcsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290ICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKQEAgLTUyMCw3ICs1MTYsNyBAQAogI2RlZmluZQlDT05GSUdfRVhUUkFfRU5WX1NFVFRJTkdTCQkJCSAgICAgICAgXAogICAgIm5ldGRldj1ldGgwXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgImNvbnNvbGVkZXY9dHR5UzBcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgInJhbWRpc2thZGRyPTYwMDAwMFwwIgkJCQkJCVwKKyAgICJyYW1kaXNrYWRkcj0xMDAwMDAwXDAiCQkJCQkJXAogICAgInJhbWRpc2tmaWxlPXlvdXIucmFtZGlzay51LWJvb3RcMCIJCQkJCVwKICAgICJmZHRhZGRyPTQwMDAwMFwwIgkJCQkJCQlcCiAgICAiZmR0ZmlsZT15b3VyLmZkdC5kdGJcMCIKQEAgLTU0MCw3ICs1MzYsNyBAQAogICAgInRmdHAgJHJhbWRpc2thZGRyICRyYW1kaXNrZmlsZTsiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgInRmdHAgJGxvYWRhZGRyICRib290ZmlsZTsiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgInRmdHAgJGZkdGFkZHIgJGZkdGZpbGU7IgkJCQkJCVwKLSAgICJib290bSAkbG9hZGFkZHIgJHJhbWRpc2thZGRyIgorICAgImJvb3RtICRsb2FkYWRkciAkcmFtZGlza2FkZHIgJGZkdGFkZHIiCiAKICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5EICBDT05GSUdfTkZTQk9PVENPTU1BTkQKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL01QQzg1NDBFVkFMLmggYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODU0MEVWQUwuaAppbmRleCA0MThhM2EzLi4wY2UyNWNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODU0MEVWQUwuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODU0MEVWQUwuaApAQCAtMjEyLDEwICsyMTIsMTAgQEAKICNlbGlmIGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkKICNkZWZpbmUgQ09ORklHX05FVF9NVUxUSSAJMQogI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudAkqLwotI2RlZmluZSBDT05GSUdfTVBDODVYWF9UU0VDMSAgICAxCi0jZGVmaW5lIENPTkZJR19NUEM4NVhYX1RTRUMxX05BTUUgICAgICAiVFNFQzAiCi0jZGVmaW5lIENPTkZJR19NUEM4NVhYX1RTRUMyCTEKLSNkZWZpbmUgQ09ORklHX01QQzg1WFhfVFNFQzJfTkFNRSAgICAgICJUU0VDMSIKKyNkZWZpbmUgQ09ORklHX1RTRUMxICAgIDEKKyNkZWZpbmUgQ09ORklHX1RTRUMxX05BTUUgICAgICAiVFNFQzAiCisjZGVmaW5lIENPTkZJR19UU0VDMgkxCisjZGVmaW5lIENPTkZJR19UU0VDMl9OQU1FICAgICAgIlRTRUMxIgogI2RlZmluZSBDT05GSUdfTVBDODVYWF9GRUMgICAgICAxCiAjZGVmaW5lIENPTkZJR19NUEM4NVhYX0ZFQ19OQU1FICAgICAgICAgICAgICAgICJGRUMiCiAjZGVmaW5lIFRTRUMxX1BIWV9BRERSICAgICAgICAgIDcKQEAgLTI1OSwyNiArMjU5LDMzIEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkCSovCiAjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZQkqLwogCi0jaWYgZGVmaW5lZChDRkdfUkFNQk9PVCkgfHwgZGVmaW5lZChDT05GSUdfUkFNX0FTX0ZMQVNIKQorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0kyQworCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BJTkcgXAotCQkJCXwgQ0ZHX0NNRF9QQ0kgfCBDRkdfQ01EX0kyQyApICYgXAotCQkJCSB+KENGR19DTURfRU5WIHwgQ0ZHX0NNRF9MT0FEUyApKQotI2Vsc2UKLSNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QSU5HIFwKLQkJCQl8IENGR19DTURfSTJDICkgJiBcCi0JCQkJIH4oQ0ZHX0NNRF9FTlYgfCBDRkdfQ01EX0xPQURTICkpCi0jZW5kaWYKLSNlbHNlCi0jaWYgZGVmaW5lZChDT05GSUdfUENJKQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUENJIFwKLQkJCQl8IENGR19DTURfUElORyB8IENGR19DTURfSTJDICkKLSNlbHNlCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QSU5HIHwgQ0ZHX0NNRF9JMkMgKQotI2VuZGlmCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQogI2VuZGlmCiAKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNpZiBkZWZpbmVkKENGR19SQU1CT09UKSB8fCBkZWZpbmVkKENPTkZJR19SQU1fQVNfRkxBU0gpCisgICAgI3VuZGVmIENPTkZJR19DTURfRU5WCisgICAgI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyNlbmRpZgorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtMjg4LDcgKzI5NSw3IEBACiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfTE9BRF9BRERSICAgMHgyMDAwMDAwICAgICAgIC8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCiAjZGVmaW5lIENGR19QUk9NUFQJIk1QQzg1NDBFVkFMPT4gIi8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTMwOCw3ICszMTUsNyBAQAogLyogQ2FjaGUgQ29uZmlndXJhdGlvbiAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJMzI3NjgKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApAQCAtMzIwLDcgKzMyNyw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NUEM4NTQxQ0RTLmggYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODU0MUNEUy5oCmluZGV4IGZiMzYwZDIuLjUwZDNiNmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9NUEM4NTQxQ0RTLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01QQzg1NDFDRFMuaApAQCAtMzczLDEwICszNzMsMTAgQEAKICNlbmRpZgogCiAjZGVmaW5lIENPTkZJR19NSUkJCTEJLyogTUlJIFBIWSBtYW5hZ2VtZW50ICovCi0jZGVmaW5lIENPTkZJR19NUEM4NVhYX1RTRUMxCTEKLSNkZWZpbmUgQ09ORklHX01QQzg1WFhfVFNFQzFfTkFNRQkiVFNFQzAiCi0jZGVmaW5lIENPTkZJR19NUEM4NVhYX1RTRUMyCTEKLSNkZWZpbmUgQ09ORklHX01QQzg1WFhfVFNFQzJfTkFNRQkiVFNFQzEiCisjZGVmaW5lIENPTkZJR19UU0VDMQkxCisjZGVmaW5lIENPTkZJR19UU0VDMV9OQU1FCSJUU0VDMCIKKyNkZWZpbmUgQ09ORklHX1RTRUMyCTEKKyNkZWZpbmUgQ09ORklHX1RTRUMyX05BTUUJIlRTRUMxIgogI3VuZGVmIENPTkZJR19NUEM4NVhYX0ZFQwogI2RlZmluZSBUU0VDMV9QSFlfQUREUgkJMAogI2RlZmluZSBUU0VDMl9QSFlfQUREUgkJMQpAQCAtNDAxLDE5ICs0MDEsMjggQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQgKi8KICNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlICovCiAKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisKICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIFwKLQkJCQl8IENGR19DTURfUENJIFwKLQkJCQl8IENGR19DTURfUElORyBcCi0JCQkJfCBDRkdfQ01EX0kyQyBcCi0JCQkJfCBDRkdfQ01EX01JSSkKLSNlbHNlCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIFwKLQkJCQl8IENGR19DTURfUElORyBcCi0JCQkJfCBDRkdfQ01EX0kyQyBcCi0JCQkJfCBDRkdfQ01EX01JSSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCiAjZW5kaWYKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQgKi8KIApAQCAtNDIzLDcgKzQzMiw3IEBACiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSovCiAjZGVmaW5lIENGR19MT0FEX0FERFIJMHgyMDAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTQ0Myw3ICs0NTIsNyBAQAogLyogQ2FjaGUgQ29uZmlndXJhdGlvbiAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJMzI3NjgKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUqLwogI2VuZGlmCiAKQEAgLTQ1NSw3ICs0NjQsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290ICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NUEM4NTQ0RFMuaCBiL2luY2x1ZGUvY29uZmlncy9NUEM4NTQ0RFMuaAppbmRleCA0YzM0MzA4Li5kMGY5NGEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODU0NERTLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01QQzg1NDREUy5oCkBAIC0zNTksMTAgKzM1OSwxMCBAQAogCiAjZGVmaW5lIENPTkZJR19NSUkJCTEJLyogTUlJIFBIWSBtYW5hZ2VtZW50ICovCiAjZGVmaW5lIENPTkZJR19NSUlfREVGQVVMVF9UU0VDCTEJLyogQWxsb3cgdW5yZWdpc3RlcmVkIHBoeXMgKi8KLSNkZWZpbmUgQ09ORklHX01QQzg1WFhfVFNFQzEJMQotI2RlZmluZSBDT05GSUdfTVBDODVYWF9UU0VDMV9OQU1FCSJlVFNFQzEiCi0jZGVmaW5lIENPTkZJR19NUEM4NVhYX1RTRUMzCTEKLSNkZWZpbmUgQ09ORklHX01QQzg1WFhfVFNFQzNfTkFNRQkiZVRTRUMzIgorI2RlZmluZSBDT05GSUdfVFNFQzEJMQorI2RlZmluZSBDT05GSUdfVFNFQzFfTkFNRQkiZVRTRUMxIgorI2RlZmluZSBDT05GSUdfVFNFQzMJMQorI2RlZmluZSBDT05GSUdfVFNFQzNfTkFNRQkiZVRTRUMzIgogI3VuZGVmIENPTkZJR19NUEM4NVhYX0ZFQwogCiAjZGVmaW5lIFRTRUMxX1BIWV9BRERSCQkwCkBAIC0zOTIsMjEgKzM5MiwzMSBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZCAqLwogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UgKi8KIAorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotI2RlZmluZQlDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIFwKLQkJCQl8IENGR19DTURfUENJIFwKLQkJCQl8IENGR19DTURfUElORyBcCi0JCQkJfCBDRkdfQ01EX0kyQyBcCi0JCQkJfCBDRkdfQ01EX01JSSBcCi0JCQkJfCBDRkdfQ01EX0JFREJVRyBcCi0JCQkJfCBDRkdfQ01EX05FVCkKLSNlbHNlCi0jZGVmaW5lCUNPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwgXAotCQkJCXwgQ0ZHX0NNRF9QSU5HIFwKLQkJCQl8IENGR19DTURfSTJDIFwKLQkJCQl8IENGR19DTURfTUlJKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyAgICAjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisgICAgI2RlZmluZSBDT05GSUdfQ01EX05FVAogI2VuZGlmCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkICovCiAKQEAgLTQxNiw3ICs0MjYsNyBAQAogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkqLwogI2RlZmluZSBDRkdfTE9BRF9BRERSCTB4MjAwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCkBAIC00MzYsNyArNDQ2LDcgQEAKIC8qIENhY2hlIENvbmZpZ3VyYXRpb24gKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCTMyNzY4CiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKmxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlKi8KICNlbmRpZgogCkBAIC00NDgsNyArNDU4LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODU0OENEUy5oIGIvaW5jbHVkZS9jb25maWdzL01QQzg1NDhDRFMuaAppbmRleCA2ODAwMDlkLi4yZTg0ZmM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTVBDODU0OENEUy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9NUEM4NTQ4Q0RTLmgKQEAgLTM5MSwxNCArMzkxLDE0IEBACiAjZW5kaWYKIAogI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudCAqLwotI2RlZmluZSBDT05GSUdfTVBDODVYWF9UU0VDMQkxCi0jZGVmaW5lIENPTkZJR19NUEM4NVhYX1RTRUMxX05BTUUJImVUU0VDMCIKLSNkZWZpbmUgQ09ORklHX01QQzg1WFhfVFNFQzIJMQotI2RlZmluZSBDT05GSUdfTVBDODVYWF9UU0VDMl9OQU1FCSJlVFNFQzEiCi0jZGVmaW5lIENPTkZJR19NUEM4NVhYX1RTRUMzCTEKLSNkZWZpbmUgQ09ORklHX01QQzg1WFhfVFNFQzNfTkFNRQkiZVRTRUMyIgotI3VuZGVmIENPTkZJR19NUEM4NVhYX1RTRUM0Ci0jZGVmaW5lIENPTkZJR19NUEM4NVhYX1RTRUM0X05BTUUJImVUU0VDMyIKKyNkZWZpbmUgQ09ORklHX1RTRUMxCTEKKyNkZWZpbmUgQ09ORklHX1RTRUMxX05BTUUJImVUU0VDMCIKKyNkZWZpbmUgQ09ORklHX1RTRUMyCTEKKyNkZWZpbmUgQ09ORklHX1RTRUMyX05BTUUJImVUU0VDMSIKKyNkZWZpbmUgQ09ORklHX1RTRUMzCTEKKyNkZWZpbmUgQ09ORklHX1RTRUMzX05BTUUJImVUU0VDMiIKKyN1bmRlZiBDT05GSUdfVFNFQzQKKyNkZWZpbmUgQ09ORklHX1RTRUM0X05BTUUJImVUU0VDMyIKICN1bmRlZiBDT05GSUdfTVBDODVYWF9GRUMKIAogI2RlZmluZSBUU0VDMV9QSFlfQUREUgkJMApAQCAtNDI3LDE5ICs0MjcsMjggQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQgKi8KICNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlICovCiAKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisKICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIFwKLQkJCQl8IENGR19DTURfUENJIFwKLQkJCQl8IENGR19DTURfUElORyBcCi0JCQkJfCBDRkdfQ01EX0kyQyBcCi0JCQkJfCBDRkdfQ01EX01JSSkKLSNlbHNlCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIFwKLQkJCQl8IENGR19DTURfUElORyBcCi0JCQkJfCBDRkdfQ01EX0kyQyBcCi0JCQkJfCBDRkdfQ01EX01JSSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCiAjZW5kaWYKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQgKi8KIApAQCAtNDQ5LDcgKzQ1OCw3IEBACiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSovCiAjZGVmaW5lIENGR19MT0FEX0FERFIJMHgyMDAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTQ2OSw3ICs0NzgsNyBAQAogLyogQ2FjaGUgQ29uZmlndXJhdGlvbiAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJMzI3NjgKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUqLwogI2VuZGlmCiAKQEAgLTQ4MSw3ICs0OTAsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290ICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NUEM4NTU1Q0RTLmggYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODU1NUNEUy5oCmluZGV4IDRjOGI0ZTcuLmEzMDI1YmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9NUEM4NTU1Q0RTLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01QQzg1NTVDRFMuaApAQCAtMzczLDEwICszNzMsMTAgQEAKICNlbmRpZgogCiAjZGVmaW5lIENPTkZJR19NSUkJCTEJLyogTUlJIFBIWSBtYW5hZ2VtZW50ICovCi0jZGVmaW5lIENPTkZJR19NUEM4NVhYX1RTRUMxCTEKLSNkZWZpbmUgQ09ORklHX01QQzg1WFhfVFNFQzFfTkFNRQkiVFNFQzAiCi0jZGVmaW5lIENPTkZJR19NUEM4NVhYX1RTRUMyCTEKLSNkZWZpbmUgQ09ORklHX01QQzg1WFhfVFNFQzJfTkFNRQkiVFNFQzEiCisjZGVmaW5lIENPTkZJR19UU0VDMQkxCisjZGVmaW5lIENPTkZJR19UU0VDMV9OQU1FCSJUU0VDMCIKKyNkZWZpbmUgQ09ORklHX1RTRUMyCTEKKyNkZWZpbmUgQ09ORklHX1RTRUMyX05BTUUJIlRTRUMxIgogI3VuZGVmIENPTkZJR19NUEM4NVhYX0ZFQwogI2RlZmluZSBUU0VDMV9QSFlfQUREUgkJMAogI2RlZmluZSBUU0VDMl9QSFlfQUREUgkJMQpAQCAtNDAxLDE5ICs0MDEsMjggQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQgKi8KICNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlICovCiAKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisKICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIFwKLQkJCQl8IENGR19DTURfUENJIFwKLQkJCQl8IENGR19DTURfUElORyBcCi0JCQkJfCBDRkdfQ01EX0kyQyBcCi0JCQkJfCBDRkdfQ01EX01JSSkKLSNlbHNlCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIFwKLQkJCQl8IENGR19DTURfUElORyBcCi0JCQkJfCBDRkdfQ01EX0kyQyBcCi0JCQkJfCBDRkdfQ01EX01JSSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCiAjZW5kaWYKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQgKi8KIApAQCAtNDIzLDcgKzQzMiw3IEBACiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSovCiAjZGVmaW5lIENGR19MT0FEX0FERFIJMHgyMDAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTQ0Myw3ICs0NTIsNyBAQAogLyogQ2FjaGUgQ29uZmlndXJhdGlvbiAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJMzI3NjgKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUqLwogI2VuZGlmCiAKQEAgLTQ1NSw3ICs0NjQsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290ICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NUEM4NTYwQURTLmggYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODU2MEFEUy5oCmluZGV4IDIxZTY2MzcuLmMxMGU1NTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9NUEM4NTYwQURTLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01QQzg1NjBBRFMuaApAQCAtNDMsOSArNDMsNyBAQAogCiAjZGVmaW5lIENPTkZJR19QQ0kKICNkZWZpbmUgQ09ORklHX1RTRUNfRU5FVCAJCS8qIHRzZWMgZXRoZXJuZXQgc3VwcG9ydCAqLwotI3VuZGVmIENPTkZJR19UU0VDX0VORVQgCQkvKiB0c2VjIGV0aGVybmV0IHN1cHBvcnQgKi8KLSN1bmRlZiAgQ09ORklHX0VUSEVSX09OX0ZDQyAgICAgICAgICAgICAvKiBjcG0gRkNDIGV0aGVybmV0IHN1cHBvcnQgKi8KLSNkZWZpbmUgIENPTkZJR19FVEhFUl9PTl9GQ0MgICAgICAgICAgICAgLyogY3BtIEZDQyBldGhlcm5ldCBzdXBwb3J0ICovCisjdW5kZWYgQ09ORklHX0VUSEVSX09OX0ZDQyAgICAgICAgICAgICAvKiBjcG0gRkNDIGV0aGVybmV0IHN1cHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0VOVl9PVkVSV1JJVEUKICNkZWZpbmUgQ09ORklHX1NQRF9FRVBST00JCS8qIFVzZSBTUEQgRUVQUk9NIGZvciBERFIgc2V0dXAqLwogI2RlZmluZSBDT05GSUdfRERSX0RMTAkJCS8qIHBvc3NpYmxlIERMTCBmaXggbmVlZGVkICovCkBAIC0zNDksMTcgKzM0NywxOSBAQAogI2VuZGlmCS8qIENPTkZJR19QQ0kgKi8KIAogCi0jaWYgZGVmaW5lZChDT05GSUdfVFNFQ19FTkVUKQorI2lmZGVmIENPTkZJR19UU0VDX0VORVQKIAogI2lmbmRlZiBDT05GSUdfTkVUX01VTFRJCiAjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkgCTEKICNlbmRpZgogCisjaWZuZGVmIENPTkZJR19NSUkKICNkZWZpbmUgQ09ORklHX01JSQkJMQkvKiBNSUkgUEhZIG1hbmFnZW1lbnQgKi8KLSNkZWZpbmUgQ09ORklHX01QQzg1WFhfVFNFQzEJMQotI2RlZmluZSBDT05GSUdfTVBDODVYWF9UU0VDMV9OQU1FCSJUU0VDMCIKLSNkZWZpbmUgQ09ORklHX01QQzg1WFhfVFNFQzIJMQotI2RlZmluZSBDT05GSUdfTVBDODVYWF9UU0VDMl9OQU1FCSJUU0VDMSIKKyNlbmRpZgorI2RlZmluZSBDT05GSUdfVFNFQzEJMQorI2RlZmluZSBDT05GSUdfVFNFQzFfTkFNRQkiVFNFQzAiCisjZGVmaW5lIENPTkZJR19UU0VDMgkxCisjZGVmaW5lIENPTkZJR19UU0VDMl9OQU1FCSJUU0VDMSIKICN1bmRlZiBDT05GSUdfTVBDODVYWF9GRUMKICNkZWZpbmUgVFNFQzFfUEhZX0FERFIJCTAKICNkZWZpbmUgVFNFQzJfUEhZX0FERFIJCTEKQEAgLTM2OSw5ICszNjksMTAgQEAKIC8qIE9wdGlvbnMgYXJlOiBUU0VDWzAtMV0gKi8KICNkZWZpbmUgQ09ORklHX0VUSFBSSU1FCQkiVFNFQzAiCiAKLSNlbGlmIGRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZDQykJLyogQ1BNIEZDQyBFdGhlcm5ldCAqLworI2VuZGlmIC8qIENPTkZJR19UU0VDX0VORVQgKi8KIAotI2RlZmluZSBDT05GSUdfRVRIRVJfT05fRkNDCS8qIGRlZmluZSBpZiBldGhlciBvbiBGQ0MgICAqLworI2lmZGVmIENPTkZJR19FVEhFUl9PTl9GQ0MJLyogQ1BNIEZDQyBFdGhlcm5ldCAqLworCiAjdW5kZWYgIENPTkZJR19FVEhFUl9OT05FCS8qIGRlZmluZSBpZiBldGhlciBvbiBzb21ldGhpbmcgZWxzZSAqLwogI2RlZmluZSBDT05GSUdfRVRIRVJfSU5ERVggICAgICAyICAgICAgIC8qIHdoaWNoIGNoYW5uZWwgZm9yIGV0aGVyICovCiAKQEAgLTM5Miw3ICszOTMsMTAgQEAKICAgI2RlZmluZSBGRVRIM19SU1QJCTB4ODAKICNlbmRpZiAgCQkJCS8qIENPTkZJR19FVEhFUl9JTkRFWCAqLwogCi0jZGVmaW5lIENPTkZJR19NSUkJCQkvKiBNSUkgUEhZIG1hbmFnZW1lbnQgKi8KKyNpZm5kZWYgQ09ORklHX01JSQorI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudCAqLworI2VuZGlmCisKICNkZWZpbmUgQ09ORklHX0JJVEJBTkdNSUkJCS8qIGJpdC1iYW5nIE1JSSBQSFkgbWFuYWdlbWVudCAqLwogCiAvKgpAQCAtNDMyLDQ2ICs0MzYsMzYgQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQgKi8KICNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlICovCiAKLSNpZiBkZWZpbmVkKENGR19SQU1CT09UKQotICAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotICAgICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMCVwKLQkJCQkgfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQkgfCBDRkdfQ01EX1BDSQkJXAotCQkJCSB8IENGR19DTURfSTJDKQkJXAotCQkJCSYJCQlcCi0JCQkJIH4oQ0ZHX0NNRF9FTlYJCVwKLQkJCQkgIHwgQ0ZHX0NNRF9MT0FEUykpCi0gICNlbGlmIGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTAlcCi0JCQkJfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQl8IENGR19DTURfSTJDKQkJXAotCQkJCSYgfihDRkdfQ01EX0VOVikpCi0gICNlbGlmIGRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZDQykKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTAlcCi0JCQkJIHwgQ0ZHX0NNRF9NSUkJCVwKLQkJCQkgfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQkgfCBDRkdfQ01EX0kyQykJCVwKLQkJCQkmIH4oQ0ZHX0NNRF9FTlYpKQotICAjZW5kaWYKLSNlbHNlCi0gICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTAkJXAotCQkJCXwgQ0ZHX0NNRF9QQ0kJCVwKLQkJCQl8IENGR19DTURfUElORwkJXAotCQkJCXwgQ0ZHX0NNRF9JMkMpCi0gICNlbGlmIGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMCQlcCi0JCQkJfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQl8IENGR19DTURfSTJDKQotICAjZWxpZiBkZWZpbmVkKENPTkZJR19FVEhFUl9PTl9GQ0MpCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTAkJXAotCQkJCXwgQ0ZHX0NNRF9NSUkJCVwKLQkJCQl8IENGR19DTURfUElORwkJXAotCQkJCXwgQ0ZHX0NNRF9JMkMpCi0gICNlbmRpZgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCiAjZW5kaWYKIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2lmIGRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZDQykKKyAgICAjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpCisgICAgI3VuZGVmIENPTkZJR19DTURfRU5WCisgICAgI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyNlbmRpZgorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZCAqLwogCkBAIC00ODIsNyArNDc2LDcgQEAKICNkZWZpbmUgQ0ZHX0xPQURfQUREUgkweDEwMDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICAgICAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAgICAgI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTUwMyw3ICs0OTcsNyBAQAogLyogQ2FjaGUgQ29uZmlndXJhdGlvbiAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTMyNzY4CiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKmxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlKi8KICNlbmRpZgogCkBAIC01MTUsNyArNTA5LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCkBAIC01NTMsOSArNTQ3LDExIEBACiAKICNkZWZpbmUJQ09ORklHX0VYVFJBX0VOVl9TRVRUSU5HUwkJCQkgICAgICAgIFwKICAgICJuZXRkZXY9ZXRoMFwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICJjb25zb2xlZGV2PXR0eVMwXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICJyYW1kaXNrYWRkcj00MDAwMDBcMCIJCQkJCQlcCi0gICAicmFtZGlza2ZpbGU9eW91ci5yYW1kaXNrLnUtYm9vdFwwIgorICAgImNvbnNvbGVkZXY9dHR5Q1BNXDAiCQkJCQkJXAorICAgInJhbWRpc2thZGRyPTEwMDAwMDBcMCIJCQkJCQlcCisgICAicmFtZGlza2ZpbGU9eW91ci5yYW1kaXNrLnUtYm9vdFwwIgkJCQkJXAorICAgImZkdGFkZHI9NDAwMDAwXDAiCQkJCQkJCVwKKyAgICJmZHRmaWxlPW1wYzg1NjBhZHMuZHRiXDAiCiAKICNkZWZpbmUgQ09ORklHX05GU0JPT1RDT01NQU5ECSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAic2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9uZnMgcncgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC01NjMsMTQgKzU1OSwxNiBAQAogICAgICAgImlwPSRpcGFkZHI6JHNlcnZlcmlwOiRnYXRld2F5aXA6JG5ldG1hc2s6JGhvc3RuYW1lOiRuZXRkZXY6b2ZmICIgXAogICAgICAgImNvbnNvbGU9JGNvbnNvbGVkZXYsJGJhdWRyYXRlICRvdGhib290YXJnczsiICAgICAgICAgICAgICAgICAgICAgXAogICAgInRmdHAgJGxvYWRhZGRyICRib290ZmlsZTsiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgImJvb3RtICRsb2FkYWRkciIKKyAgICJ0ZnRwICRmZHRhZGRyICRmZHRmaWxlOyIJCQkJCQlcCisgICAiYm9vdG0gJGxvYWRhZGRyIC0gJGZkdGFkZHIiCiAKICNkZWZpbmUgQ09ORklHX1JBTUJPT1RDT01NQU5EIFwKICAgICJzZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L3JhbSBydyAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICJjb25zb2xlPSRjb25zb2xlZGV2LCRiYXVkcmF0ZSAkb3RoYm9vdGFyZ3M7IiAgICAgICAgICAgICAgICAgICAgIFwKICAgICJ0ZnRwICRyYW1kaXNrYWRkciAkcmFtZGlza2ZpbGU7IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICJ0ZnRwICRsb2FkYWRkciAkYm9vdGZpbGU7IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICJib290bSAkbG9hZGFkZHIgJHJhbWRpc2thZGRyIgorICAgInRmdHAgJGZkdGFkZHIgJGZkdGZpbGU7IgkJCQkJCVwKKyAgICJib290bSAkbG9hZGFkZHIgJHJhbWRpc2thZGRyICRmZHRhZGRyIgogCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORCAgQ09ORklHX05GU0JPT1RDT01NQU5ECiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NUEM4NTY4TURTLmggYi9pbmNsdWRlL2NvbmZpZ3MvTVBDODU2OE1EUy5oCmluZGV4IDNmNjU2NDQuLmVlZjE2OGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9NUEM4NTY4TURTLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01QQzg1NjhNRFMuaApAQCAtMzUzLDEyICszNTMsMTIgQEAKICNlbmRpZgogCiAjZGVmaW5lIENPTkZJR19NSUkJCTEJLyogTUlJIFBIWSBtYW5hZ2VtZW50ICovCi0jZGVmaW5lIENPTkZJR19NUEM4NVhYX1RTRUMxCTEKLSNkZWZpbmUgQ09ORklHX01QQzg1WFhfVFNFQzFfTkFNRQkiZVRTRUMwIgotI2RlZmluZSBDT05GSUdfTVBDODVYWF9UU0VDMgkxCi0jZGVmaW5lIENPTkZJR19NUEM4NVhYX1RTRUMyX05BTUUJImVUU0VDMSIKLSN1bmRlZiAgQ09ORklHX01QQzg1WFhfVFNFQzMKLSN1bmRlZiAgQ09ORklHX01QQzg1WFhfVFNFQzQKKyNkZWZpbmUgQ09ORklHX1RTRUMxCTEKKyNkZWZpbmUgQ09ORklHX1RTRUMxX05BTUUJImVUU0VDMCIKKyNkZWZpbmUgQ09ORklHX1RTRUMyCTEKKyNkZWZpbmUgQ09ORklHX1RTRUMyX05BTUUJImVUU0VDMSIKKyN1bmRlZiAgQ09ORklHX1RTRUMzCisjdW5kZWYgIENPTkZJR19UU0VDNAogI3VuZGVmICBDT05GSUdfTVBDODVYWF9GRUMKIAogI2RlZmluZSBUU0VDMV9QSFlfQUREUgkJMgpAQCAtMzgzLDE5ICszODMsMjkgQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQgKi8KICNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlICovCiAKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKwogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwgXAotCQkJCXwgQ0ZHX0NNRF9QQ0kgXAotCQkJCXwgQ0ZHX0NNRF9QSU5HIFwKLQkJCQl8IENGR19DTURfSTJDIFwKLQkJCQl8IENGR19DTURfTUlJKQotI2Vsc2UKLSNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwgXAotCQkJCXwgQ0ZHX0NNRF9QSU5HIFwKLQkJCQl8IENGR19DTURfSTJDIFwKLQkJCQl8IENGR19DTURfTUlJKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKICNlbmRpZgotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZCAqLwogCkBAIC00MDUsNyArNDE1LDcgQEAKICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJKi8KICNkZWZpbmUgQ0ZHX0xPQURfQUREUgkweDIwMDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTQyNSw3ICs0MzUsNyBAQAogLyogQ2FjaGUgQ29uZmlndXJhdGlvbiAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJMzI3NjgKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUqLwogI2VuZGlmCiAKQEAgLTQzNyw3ICs0NDcsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290ICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9NUEM4NjQxSFBDTi5oIGIvaW5jbHVkZS9jb25maWdzL01QQzg2NDFIUENOLmgKaW5kZXggYmJlMzUwNS4uNjRkY2JkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01QQzg2NDFIUENOLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL01QQzg2NDFIUENOLmgKQEAgLTQ2LDggKzQ2LDEwIEBACiAKICNkZWZpbmUgQ0ZHX1JFU0VUX0FERFJFU1MgICAgMHhmZmYwMDEwMAogCi0vKiN1bmRlZiBDT05GSUdfUENJKi8KLSNkZWZpbmUgQ09ORklHX1BDSQorI2RlZmluZSBDT05GSUdfUENJCQkxCS8qIEVuYWJsZSBQQ0kvUENJRSAqLworI2RlZmluZSBDT05GSUdfUENJMQkJMQkvKiBQQ0lFIGNvbnRyb2xlciAxIChVTEkgYnJpZGdlKSAqLworI2RlZmluZSBDT05GSUdfUENJMgkJMQkvKiBQQ0lFIGNvbnRyb2xlciAyIChzbG90KSAqLworI2RlZmluZSBDT05GSUdfRlNMX1BDSV9JTklUCTEJLyogVXNlIGNvbW1vbiBGU0wgaW5pdCBjb2RlICovCiAKICNkZWZpbmUgQ09ORklHX1RTRUNfRU5FVCAJCS8qIHRzZWMgZXRoZXJuZXQgc3VwcG9ydCAqLwogI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQpAQCAtNzYsNiArNzgsOSBAQAogI2RlZmluZSBMMl9FTkFCTEUJKEwyQ1JfTDJFKQogCiAjaWZuZGVmIENPTkZJR19TWVNfQ0xLX0ZSRVEKKyNpZm5kZWYgX19BU1NFTUJMWV9fCitleHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfYm9hcmRfc3lzX2Nsayh1bnNpZ25lZCBsb25nIGR1bW15KTsKKyNlbmRpZgogI2RlZmluZSBDT05GSUdfU1lTX0NMS19GUkVRICAgICBnZXRfYm9hcmRfc3lzX2NsaygwKQogI2VuZGlmCiAKQEAgLTkzLDYgKzk4LDkgQEAKICNkZWZpbmUgQ0ZHX0NDU1JCQVIJCTB4ZjgwMDAwMDAJLyogcmVsb2NhdGVkIENDU1JCQVIgKi8KICNkZWZpbmUgQ0ZHX0lNTVIJCUNGR19DQ1NSQkFSCS8qIFBRSUkgdXNlcyBDRkdfSU1NUiAqLwogCisjZGVmaW5lIENGR19QQ0kxX0FERFIJCShDRkdfQ0NTUkJBUisweDgwMDApCisjZGVmaW5lIENGR19QQ0kyX0FERFIJCShDRkdfQ0NTUkJBUisweDkwMDApCisKIC8qCiAgKiBERFIgU2V0dXAKICAqLwpAQCAtMjMyLDcgKzI0MCw3IEBACiAjZGVmaW5lIENGR19JTklUX1NQX09GRlNFVAlDRkdfR0JMX0RBVEFfT0ZGU0VUCiAKICNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOCSAgICAJKDI1NiAqIDEwMjQpICAgIC8qIFJlc2VydmUgMjU2IGtCIGZvciBNb24gKi8KLSNkZWZpbmUgQ0ZHX01BTExPQ19MRU4JICAgIAkoMTI4ICogMTAyNCkgICAgLyogUmVzZXJ2ZWQgZm9yIG1hbGxvYyAqLworI2RlZmluZSBDRkdfTUFMTE9DX0xFTgkgICAgCSgxMDI0ICogMTAyNCkgICAgLyogUmVzZXJ2ZWQgZm9yIG1hbGxvYyAqLwogCiAvKiBTZXJpYWwgUG9ydCAqLwogI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWCAgICAgMQpAQCAtMjk2LDkgKzMwNCw5IEBACiAjZGVmaW5lIENGR19QQ0kxX01FTV9CQVNFCTB4ODAwMDAwMDAKICNkZWZpbmUgQ0ZHX1BDSTFfTUVNX1BIWVMJQ0ZHX1BDSTFfTUVNX0JBU0UKICNkZWZpbmUgQ0ZHX1BDSTFfTUVNX1NJWkUJMHgyMDAwMDAwMAkvKiA1MTJNICovCi0jZGVmaW5lIENGR19QQ0kxX0lPX0JBU0UJMHhlMjAwMDAwMAotI2RlZmluZSBDRkdfUENJMV9JT19QSFlTCUNGR19QQ0kxX0lPX0JBU0UKLSNkZWZpbmUgQ0ZHX1BDSTFfSU9fU0laRQkweDEwMDAwMDAJLyogMTZNICovCisjZGVmaW5lIENGR19QQ0kxX0lPX0JBU0UJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfUENJMV9JT19QSFlTCTB4ZTIwMDAwMDAKKyNkZWZpbmUgQ0ZHX1BDSTFfSU9fU0laRQkweDAwMTAwMDAwCS8qIDFNICovCiAKIC8qIFBDSSB2aWV3IG9mIFN5c3RlbSBNZW1vcnkgKi8KICNkZWZpbmUgQ0ZHX1BDSV9NRU1PUllfQlVTICAgICAgMHgwMDAwMDAwMApAQCAtMzExLDEwICszMTksMTAgQEAKIAogI2RlZmluZSBDRkdfUENJMl9NRU1fQkFTRQkweGEwMDAwMDAwCiAjZGVmaW5lIENGR19QQ0kyX01FTV9QSFlTCUNGR19QQ0kyX01FTV9CQVNFCi0jZGVmaW5lIENGR19QQ0kyX01FTV9TSVpFCTB4MTAwMDAwMDAJLyogMjU2TSAqLwotI2RlZmluZSBDRkdfUENJMl9JT19CQVNFCTB4ZTMwMDAwMDAKLSNkZWZpbmUgQ0ZHX1BDSTJfSU9fUEhZUwlDRkdfUENJMl9JT19CQVNFCi0jZGVmaW5lIENGR19QQ0kyX0lPX1NJWkUJMHgxMDAwMDAwCS8qIDE2TSAqLworI2RlZmluZSBDRkdfUENJMl9NRU1fU0laRQkweDIwMDAwMDAwCS8qIDUxMk0gKi8KKyNkZWZpbmUgQ0ZHX1BDSTJfSU9fQkFTRQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19QQ0kyX0lPX1BIWVMJMHhlMzAwMDAwMAorI2RlZmluZSBDRkdfUENJMl9JT19TSVpFCTB4MDAxMDAwMDAJLyogMU0gKi8KIAogI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKIApAQCAtMzMwLDEyICszMzgsNDMgQEAKICN1bmRlZiBDT05GSUdfRUVQUk8xMDAKICN1bmRlZiBDT05GSUdfVFVMSVAKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVVNCIHN1cHBvcnQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENPTkZJR19QQ0lfT0hDSQkJMQorI2RlZmluZSBDT05GSUdfVVNCX09IQ0lfTkVXCQkxCisjZGVmaW5lIENPTkZJR19VU0JfS0VZQk9BUkQJMQorI2RlZmluZSBDRkdfREVWSUNFX0RFUkVHSVNURVIKKyNkZWZpbmUgQ0ZHX1VTQl9FVkVOVF9QT0xMCTEKKyNkZWZpbmUgQ0ZHX1VTQl9PSENJX1NMT1RfTkFNRSAJIm9oY2lfcGNpIgorI2RlZmluZSBDRkdfVVNCX09IQ0lfTUFYX1JPT1RfUE9SVFMgMTUKKwogI2lmICFkZWZpbmVkKENPTkZJR19QQ0lfUE5QKQogICAgICNkZWZpbmUgUENJX0VORVQwX0lPQUREUgkweGUwMDAwMDAwCiAgICAgI2RlZmluZSBQQ0lfRU5FVDBfTUVNQUREUgkweGUwMDAwMDAwCiAgICAgI2RlZmluZSBQQ0lfSURTRUxfTlVNQkVSCTB4MGMgCS8qIHNsb3QwLT4zKElEU0VMKT0xMi0+MTUgKi8KICNlbmRpZgogCisvKlBDSUUgdmlkZW8gY2FyZCB1c2VkKi8KKyNkZWZpbmUgVklERU9fSU9fT0ZGU0VUCQlDRkdfUENJMl9JT19QSFlTCisKKy8qUENJIHZpZGVvIGNhcmQgdXNlZCovCisvKiNkZWZpbmUgVklERU9fSU9fT0ZGU0VUCUNGR19QQ0kxX0lPX1BIWVMqLworCisvKiB2aWRlbyAqLworI2RlZmluZSBDT05GSUdfVklERU8KKworI2lmIGRlZmluZWQoQ09ORklHX1ZJREVPKQorI2RlZmluZSBDT05GSUdfQklPU0VNVQorI2RlZmluZSBDT05GSUdfQ0ZCX0NPTlNPTEUKKyNkZWZpbmUgQ09ORklHX1ZJREVPX1NXX0NVUlNPUgorI2RlZmluZSBDT05GSUdfVkdBX0FTX1NJTkdMRV9ERVZJQ0UKKyNkZWZpbmUgQ09ORklHX0FUSV9SQURFT05fRkIKKyNkZWZpbmUgQ09ORklHX1ZJREVPX0xPR08KKy8qI2RlZmluZSBDT05GSUdfQ09OU09MRV9DVVJTT1IqLworI2RlZmluZSBDRkdfSVNBX0lPX0JBU0VfQUREUkVTUyBDRkdfUENJMl9JT19QSFlTCisjZW5kaWYKKwogI3VuZGVmIENPTkZJR19QQ0lfU0NBTl9TSE9XCQkvKiBzaG93IHBjaSBkZXZpY2VzIG9uIHN0YXJ0dXAgKi8KIAogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgpAQCAtMzQ5LDYgKzM4OCw4IEBACiAjZGVmaW5lIENGR19TQ1NJX01BWERFVklDRQlDRkdfU0NTSV9NQVhfREVWSUNFCiAjZW5kaWYKIAorI2RlZmluZSBDT05GSUdfTVBDODZYWF9QQ0kyCisKICNlbmRpZgkvKiBDT05GSUdfUENJICovCiAKICNpZiBkZWZpbmVkKENPTkZJR19UU0VDX0VORVQpCkBAIC0zNTksMTQgKzQwMCwxNCBAQAogCiAjZGVmaW5lIENPTkZJR19NSUkJCTEJLyogTUlJIFBIWSBtYW5hZ2VtZW50ICovCiAKLSNkZWZpbmUgQ09ORklHX01QQzg2WFhfVFNFQzEgICAgMQotI2RlZmluZSBDT05GSUdfTVBDODZYWF9UU0VDMV9OQU1FICAgICAgICJlVFNFQzEiCi0jZGVmaW5lIENPTkZJR19NUEM4NlhYX1RTRUMyICAgIDEKLSNkZWZpbmUgQ09ORklHX01QQzg2WFhfVFNFQzJfTkFNRSAgICAgICAiZVRTRUMyIgotI2RlZmluZSBDT05GSUdfTVBDODZYWF9UU0VDMyAgICAxCi0jZGVmaW5lIENPTkZJR19NUEM4NlhYX1RTRUMzX05BTUUgICAgICAgImVUU0VDMyIKLSNkZWZpbmUgQ09ORklHX01QQzg2WFhfVFNFQzQgICAgMQotI2RlZmluZSBDT05GSUdfTVBDODZYWF9UU0VDNF9OQU1FICAgICAgICJlVFNFQzQiCisjZGVmaW5lIENPTkZJR19UU0VDMSAgICAxCisjZGVmaW5lIENPTkZJR19UU0VDMV9OQU1FICAgICAgICJlVFNFQzEiCisjZGVmaW5lIENPTkZJR19UU0VDMiAgICAxCisjZGVmaW5lIENPTkZJR19UU0VDMl9OQU1FICAgICAgICJlVFNFQzIiCisjZGVmaW5lIENPTkZJR19UU0VDMyAgICAxCisjZGVmaW5lIENPTkZJR19UU0VDM19OQU1FICAgICAgICJlVFNFQzMiCisjZGVmaW5lIENPTkZJR19UU0VDNCAgICAxCisjZGVmaW5lIENPTkZJR19UU0VDNF9OQU1FICAgICAgICJlVFNFQzQiCiAKICNkZWZpbmUgVFNFQzFfUEhZX0FERFIJCTAKICNkZWZpbmUgVFNFQzJfUEhZX0FERFIJCTEKQEAgLTM5NiwyMCArNDM3LDIwIEBACiAgKiAweGEwMDBfMDAwMCAgNTEyTSAgIFBDSS1FeHByZXNzIDIgTWVtb3J5CiAgKglDaGFuZ2VkIGl0IGZvciBvcGVyYXRpbmcgZnJvbSAweGQwMDAwMDAwCiAgKi8KLSNkZWZpbmUgQ0ZHX0RCQVQxTCAgICAgICggQ0ZHX1BDSTFfTUVNX0JBU0UgfCBCQVRMX1BQX1JXIFwKKyNkZWZpbmUgQ0ZHX0RCQVQxTCAgICAgICggQ0ZHX1BDSTFfTUVNX1BIWVMgfCBCQVRMX1BQX1JXIFwKIAkJCXwgQkFUTF9DQUNIRUlOSElCSVQgfCBCQVRMX0dVQVJERURTVE9SQUdFKQotI2RlZmluZSBDRkdfREJBVDFVICAgICAgKENGR19QQ0kxX01FTV9CQVNFIHwgQkFUVV9CTF8yNTZNIHwgQkFUVV9WUyB8IEJBVFVfVlApCi0jZGVmaW5lIENGR19JQkFUMUwgICAgICAoQ0ZHX1BDSTFfTUVNX0JBU0UgfCBCQVRMX1BQX1JXIHwgQkFUTF9DQUNIRUlOSElCSVQpCisjZGVmaW5lIENGR19EQkFUMVUJKENGR19QQ0kxX01FTV9QSFlTIHwgQkFUVV9CTF8xRyB8IEJBVFVfVlMgfCBCQVRVX1ZQKQorI2RlZmluZSBDRkdfSUJBVDFMCShDRkdfUENJMV9NRU1fUEhZUyB8IEJBVExfUFBfUlcgfCBCQVRMX0NBQ0hFSU5ISUJJVCkKICNkZWZpbmUgQ0ZHX0lCQVQxVSAgICAgIENGR19EQkFUMVUKIAogLyoKICAqIEJBVDIgICAgICAgICA1MTJNICAgQ2FjaGUtaW5oaWJpdGVkLCBndWFyZGVkCiAgKiAweGMwMDBfMDAwMCAgNTEyTSAgIFJhcGlkSU8gTWVtb3J5CiAgKi8KLSNkZWZpbmUgQ0ZHX0RCQVQyTCAgICAgIChDRkdfUklPX01FTV9CQVNFIHwgQkFUTF9QUF9SVyBcCisjZGVmaW5lIENGR19EQkFUMkwgICAgICAoQ0ZHX1JJT19NRU1fUEhZUyB8IEJBVExfUFBfUlcgXAogCQkJfCBCQVRMX0NBQ0hFSU5ISUJJVCB8IEJBVExfR1VBUkRFRFNUT1JBR0UpCi0jZGVmaW5lIENGR19EQkFUMlUgICAgICAoQ0ZHX1JJT19NRU1fQkFTRSB8IEJBVFVfQkxfNTEyTSB8IEJBVFVfVlMgfCBCQVRVX1ZQKQotI2RlZmluZSBDRkdfSUJBVDJMICAgICAgKENGR19SSU9fTUVNX0JBU0UgfCBCQVRMX1BQX1JXIHwgQkFUTF9DQUNIRUlOSElCSVQpCisjZGVmaW5lIENGR19EQkFUMlUJKENGR19SSU9fTUVNX1BIWVMgfCBCQVRVX0JMXzUxMk0gfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKyNkZWZpbmUgQ0ZHX0lCQVQyTAkoQ0ZHX1JJT19NRU1fUEhZUyB8IEJBVExfUFBfUlcgfCBCQVRMX0NBQ0hFSU5ISUJJVCkKICNkZWZpbmUgQ0ZHX0lCQVQyVSAgICAgIENGR19EQkFUMlUKIAogLyoKQEAgLTQyOCwxMCArNDY5LDEwIEBACiAgKiAweGUzMDBfMDAwMCAgMTZNICAgIFBDSS1FeHByZXNzIDIgSS8wCiAgKiAgICBOb3RlIHRoYXQgdGhpcyBpcyBhdCAweGUwMDAwMDAwCiAgKi8KLSNkZWZpbmUgQ0ZHX0RCQVQ0TCAgICAgICggQ0ZHX1BDSTFfSU9fQkFTRSB8IEJBVExfUFBfUlcgXAorI2RlZmluZSBDRkdfREJBVDRMICAgICAgKCBDRkdfUENJMV9JT19QSFlTIHwgQkFUTF9QUF9SVyBcCiAJCQl8IEJBVExfQ0FDSEVJTkhJQklUIHwgQkFUTF9HVUFSREVEU1RPUkFHRSkKLSNkZWZpbmUgQ0ZHX0RCQVQ0VSAgICAgIChDRkdfUENJMV9JT19CQVNFIHwgQkFUVV9CTF8zMk0gfCBCQVRVX1ZTIHwgQkFUVV9WUCkKLSNkZWZpbmUgQ0ZHX0lCQVQ0TCAgICAgIChDRkdfUENJMV9JT19CQVNFIHwgQkFUTF9QUF9SVyB8IEJBVExfQ0FDSEVJTkhJQklUKQorI2RlZmluZSBDRkdfREJBVDRVCShDRkdfUENJMV9JT19QSFlTIHwgQkFUVV9CTF8zMk0gfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKyNkZWZpbmUgQ0ZHX0lCQVQ0TAkoQ0ZHX1BDSTFfSU9fUEhZUyB8IEJBVExfUFBfUlcgfCBCQVRMX0NBQ0hFSU5ISUJJVCkKICNkZWZpbmUgQ0ZHX0lCQVQ0VSAgICAgIENGR19EQkFUNFUKIAogLyoKQEAgLTQ2Myw4ICs1MDQsOCBAQAogICovCiAjaWZuZGVmIENGR19SQU1CT09UCiAgICAgI2RlZmluZSBDRkdfRU5WX0lTX0lOX0ZMQVNICTEKLSAgICAjZGVmaW5lIENGR19FTlZfQUREUgkJKENGR19NT05JVE9SX0JBU0UgKyAweDQwMDAwKQotICAgICNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJCTB4NDAwMDAJLyogMjU2SyhvbmUgc2VjdG9yKSBmb3IgZW52ICovCisgICAgI2RlZmluZSBDRkdfRU5WX0FERFIJCShDRkdfTU9OSVRPUl9CQVNFICsgMHg2MDAwMCkKKyAgICAjZGVmaW5lIENGR19FTlZfU0VDVF9TSVpFCQkweDEwMDAwCS8qIDY0SyhvbmUgc2VjdG9yKSBmb3IgZW52ICovCiAgICAgI2RlZmluZSBDRkdfRU5WX1NJWkUJCTB4MjAwMAogI2Vsc2UKICAgICAjZGVmaW5lIENGR19FTlZfSVNfTk9XSEVSRQkxCS8qIFN0b3JlIEVOViBpbiBtZW1vcnkgb25seSAqLwpAQCAtNDc1LDM5ICs1MTYsMzQgQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQgKi8KICNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlICovCiAKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKwogI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpCi0gICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwJXAotCQkJCSB8IENGR19DTURfUElORwkJXAotCQkJCSB8IENGR19DTURfUENJCQlcCi0JCQkJIHwgQ0ZHX0NNRF9JMkMJCVwKLQkJCQkgfCBDRkdfQ01EX1NDU0kJCVwKLQkJCQkgfCBDRkdfQ01EX0VYVDIpCVwKLQkJCQkmCQkJXAotCQkJCSB+KENGR19DTURfRU5WKSkKLSAgI2Vsc2UKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTAlcCi0JCQkJIHwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJIHwgQ0ZHX0NNRF9JMkMpCQlcCi0JCQkJJgkJCVwKLQkJCQkgfihDRkdfQ01EX0VOVikpCi0gICNlbmRpZgotI2Vsc2UKLSAgI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMCQlcCi0JCQkJfCBDRkdfQ01EX1BDSQkJXAotCQkJCXwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJfCBDRkdfQ01EX0kyQwkJXAotCQkJCXwgQ0ZHX0NNRF9TQ1NJCQlcCi0JCQkJfCBDRkdfQ01EX0VYVDIpCi0gICNlbHNlCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTAkJXAotCQkJCXwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJfCBDRkdfQ01EX0kyQykKLSAgI2VuZGlmCisgICAgI3VuZGVmIENPTkZJR19DTURfRU5WCiAjZW5kaWYKIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1NDU0kKKyAgICAjZGVmaW5lIENPTkZJR19DTURfRVhUMgorI2VuZGlmCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkICovCiAKQEAgLTUxOCw3ICs1NTQsNyBAQAogI2RlZmluZSBDRkdfTE9BRF9BRERSCTB4MjAwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogICAgICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICAgICAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtNTM5LDggKzU3NSw4IEBACiAvKiBDYWNoZSBDb25maWd1cmF0aW9uICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMzI3NjgKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKLSNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUqLworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorICAgICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUqLwogI2VuZGlmCiAKIC8qCkBAIC01NTEsOSArNTg3LDkgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKLSNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCi0jZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorICAgICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCisgICAgI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgogCiAvKgpAQCAtNTc3LDYgKzYxMyw3IEBACiAjZGVmaW5lIENPTkZJR19IT1NUTkFNRQkJdW5rbm93bgogI2RlZmluZSBDT05GSUdfUk9PVFBBVEgJCS9vcHQvbmZzcm9vdAogI2RlZmluZSBDT05GSUdfQk9PVEZJTEUJCXVJbWFnZQorI2RlZmluZSBDT05GSUdfVUJPT1RQQVRICXUtYm9vdC5iaW4JLyogVS1Cb290IGltYWdlIG9uIFRGVFAgc2VydmVyICovCiAKICNkZWZpbmUgQ09ORklHX1NFUlZFUklQCQkxOTIuMTY4LjEuMQogI2RlZmluZSBDT05GSUdfR0FURVdBWUlQCTE5Mi4xNjguMS4xCkBAIC01OTIsMTAgKzYyOSwxNyBAQAogCiAjZGVmaW5lCUNPTkZJR19FWFRSQV9FTlZfU0VUVElOR1MJCQkJICAgICAgICBcCiAgICAibmV0ZGV2PWV0aDBcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAidWJvb3Q9IiBNS19TVFIoQ09ORklHX1VCT09UUEFUSCkgIlwwIiAJCQkJXAorICAgInRmdHBmbGFzaD10ZnRwYm9vdCAkbG9hZGFkZHIgJHVib290OyAiIAkJCVwKKwkicHJvdGVjdCBvZmYgIiBNS19TVFIoVEVYVF9CQVNFKSAiICskZmlsZXNpemU7ICIgCVwKKwkiZXJhc2UgIiBNS19TVFIoVEVYVF9CQVNFKSAiICskZmlsZXNpemU7ICIgCQlcCisJImNwLmIgJGxvYWRhZGRyICIgTUtfU1RSKFRFWFRfQkFTRSkgIiAkZmlsZXNpemU7ICIgCVwKKwkicHJvdGVjdCBvbiAiIE1LX1NUUihURVhUX0JBU0UpICIgKyRmaWxlc2l6ZTsgIiAJXAorCSJjbXAuYiAkbG9hZGFkZHIgIiBNS19TVFIoVEVYVF9CQVNFKSAiICRmaWxlc2l6ZVwwIiAJXAogICAgImNvbnNvbGVkZXY9dHR5UzBcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgInJhbWRpc2thZGRyPTIwMDAwMDBcMCIJCQkJCQlcCiAgICAicmFtZGlza2ZpbGU9eW91ci5yYW1kaXNrLnUtYm9vdFwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAiZHRiYWRkcj00MDAwMDBcMCIJCQkJCQlcCisgICAiZHRiYWRkcj1jMDAwMDBcMCIJCQkJCQlcCiAgICAiZHRiZmlsZT1tcGM4NjQxX2hwY24uZHRiXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICJlbi13ZD1tdy5iIGY4MTAwMDEwIDB4MDg7IGVjaG8gLWV4cGVjdDotIDA4OyBtZC5iIGY4MTAwMDEwIDFcMCIgXAogICAgImRpcy13ZD1tdy5iIGY4MTAwMDEwIDB4MDA7IGVjaG8gLWV4cGVjdDotIDAwOyBtZC5iIGY4MTAwMDEwIDFcMCIgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL01VU0VOS0kuaCBiL2luY2x1ZGUvY29uZmlncy9NVVNFTktJLmgKaW5kZXggZGE1MmUwZS4uZjhjZjAxZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01VU0VOS0kuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTVVTRU5LSS5oCkBAIC01MiwxMSArNTIsMjAgQEAKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAJKi8KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CiAKIAogLyoKQEAgLTI4MCw3ICsyODksNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL01WQkxVRS5oIGIvaW5jbHVkZS9jb25maWdzL01WQkxVRS5oCmluZGV4IDg4ZWVmYTEuLjBkZWZhZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9NVkJMVUUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTVZCTFVFLmgKQEAgLTc2LDE1ICs3Niw0NCBAQAogI2RlZmluZSBDT05GSUdfWkVST19CT09UREVMQVlfQ0hFQ0sKICNkZWZpbmUgQ09ORklHX1JFU0VUX1RPX1JFVFJZCQk2MAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKCBDRkdfQ01EX0FTS0VOViB8IENGR19DTURfQk9PVEQgfCBDRkdfQ01EX0NBQ0hFIHwgQ0ZHX0NNRF9ESENQCXwgXAotCQkJCSAgQ0ZHX0NNRF9FQ0hPCSB8IENGR19DTURfRU5WICAgfCBDRkdfQ01EX0ZMQVNIIHwgQ0ZHX0NNRF9JTUkJfCBcCi0JCQkJICBDRkdfQ01EX0lSUQkgfCBDRkdfQ01EX05FVAkgfCBDRkdfQ01EX1BDSQkgfCBDRkdfQ01EX1JVTiAgICkKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9CT09URAorI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VDSE8KKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX0lNSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1JVTgogCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sgICAoIDB4ZmZmZmZmZmYgKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9OSVNET01BSU4KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUzIKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NFTkRfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX05UUFNFUlZFUgorI2RlZmluZSBDT05GSUdfQk9PVFBfVElNRU9GRlNFVAogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpIAkqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMzEwLDcgKzMzOSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL01WUzEuaCBiL2luY2x1ZGUvY29uZmlncy9NVlMxLmgKaW5kZXggNTk5NTkxOC4uNzVlZmQxZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL01WUzEuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTVZTMS5oCkBAIC02MywyNyArNjMsMzYgQEAKIAogI3VuZGVmICBDT05GSUdfQ0FOX0RSSVZFUiAgICAgICAvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQgICovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX1ZFTkRPUkVYICkKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9WRU5ET1JFWAogCiAjdW5kZWYgQ09ORklHX01BQ19QQVJUSVRJT04KICN1bmRlZiBDT05GSUdfRE9TX1BBUlRJVElPTgogCiAjZGVmaW5lCUNPTkZJR19SVENfTVBDOHh4CQkvKiB1c2UgaW50ZXJuYWwgUlRDIG9mIE1QQzh4eAkqLwogCi0vKiBNVnNlbnNvciB1c2VzIGEgcmVhbGx5IG1pbmltYWwgVS1Cb290ICEgKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ0ZHX0NNRF9MT0FEUwl8IFwKLQkJCQlDRkdfQ01EX0xPQURCCXwgXAotCQkJCUNGR19DTURfSU1JCXwgXAotCQkJCUNGR19DTURfRkxBU0gJfCBcCi0JCQkJQ0ZHX0NNRF9NRU1PUlkJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRU5WCXwgXAotCQkJCUNGR19DTURfQk9PVEQJfCBcCi0JCQkJQ0ZHX0NNRF9SVU4JKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEUworI2RlZmluZSBDT05GSUdfQ01EX0xPQURCCisjZGVmaW5lIENPTkZJR19DTURfSU1JCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gKKyNkZWZpbmUgQ09ORklHX0NNRF9NRU1PUlkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRU5WCisjZGVmaW5lIENPTkZJR19DTURfQk9PVEQKKyNkZWZpbmUgQ09ORklHX0NNRF9SVU4KKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtOTYsNyArMTA1LDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMiAgICAgIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE3Miw3ICsxODEsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTkM2NTAuaCBiL2luY2x1ZGUvY29uZmlncy9OQzY1MC5oCmluZGV4IGExMmM4ZGEuLmMwNTFhMzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9OQzY1MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9OQzY1MC5oCkBAIC04NSw3ICs4NSwxNSBAQAogCiAjdW5kZWYJQ09ORklHX1NUQVRVU19MRUQJCS8qIFN0YXR1cyBMRUQgZGlzYWJsZWQJCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZQlDT05GSUdfRkVDX0VORVQJCTEJLyogdXNlIEZFQyBldGhlcm5ldCAgKi8KICNkZWZpbmUgRkVDX0VORVQKQEAgLTEzNCwyNSArMTQyLDI4IEBACiAjZGVmaW5lIENPTkZJR19SVENfUENGODU2MwogI2RlZmluZSBDRkdfSTJDX1JUQ19BRERSCQkweDUxCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX05BTkQJfCBcCi0JCQkJQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTkFORAorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIzMCw3ICsyNDEsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTkVUUEhPTkUuaCBiL2luY2x1ZGUvY29uZmlncy9ORVRQSE9ORS5oCmluZGV4IDQ0NGY3MjEuLmJiM2QxOWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9ORVRQSE9ORS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9ORVRQSE9ORS5oCkBAIC04Miw3ICs4MiwxNSBAQAogI2RlZmluZQlDT05GSUdfU1RBVFVTX0xFRAkxCS8qIFN0YXR1cyBMRUQgZW5hYmxlZAkJKi8KICNkZWZpbmUgQ09ORklHX0JPQVJEX1NQRUNJRklDX0xFRAkvKiB2ZXJzaW9uIGhhcyBib2FyZCBzcGVjaWZpYyBsZWRzICovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUgfCBDT05GSUdfQk9PVFBfTklTRE9NQUlOKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX05JU0RPTUFJTgogCiAjdW5kZWYgQ09ORklHX01BQ19QQVJUSVRJT04KICN1bmRlZiBDT05GSUdfRE9TX1BBUlRJVElPTgpAQCAtMTA1LDIwICsxMTMsMjIgQEAKIAogI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQkxCS8qIGFsbG93IG1vZGlmaWNhdGlvbiBvZiB2ZW5kb3IgcGFyYW1zICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9OQU5ECXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX1BJTkcgIAl8IFwKLQkJCQlDRkdfQ01EX01JSSAJfCBcCi0JCQkJQ0ZHX0NNRF9DRFAJICBcCi0JCQkJKQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX0NEUAorCiAKICNkZWZpbmUgQ09ORklHX0JPQVJEX0VBUkxZX0lOSVRfRgkxCiAjZGVmaW5lIENPTkZJR19NSVNDX0lOSVRfUgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KQEAgLTEyOCw3ICsxMzgsNyBAQAogI2RlZmluZSBDRkdfSFVTSF9QQVJTRVIJMQogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjIwLDcgKzIzMCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9ORVRUQS5oIGIvaW5jbHVkZS9jb25maWdzL05FVFRBLmgKaW5kZXggMjViNjM0NS4uMTk3NDNjMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL05FVFRBLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL05FVFRBLmgKQEAgLTc3LDcgKzc3LDE2IEBACiAKICN1bmRlZglDT05GSUdfQ0FOX0RSSVZFUgkJLyogQ0FOIERyaXZlciBzdXBwb3J0IGRpc2FibGVkCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUgfCBDT05GSUdfQk9PVFBfTklTRE9NQUlOKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX05JU0RPTUFJTgorCiAKICN1bmRlZiBDT05GSUdfTUFDX1BBUlRJVElPTgogI3VuZGVmIENPTkZJR19ET1NfUEFSVElUSU9OCkBAIC0xMTEsMjYgKzEyMCwyOCBAQAogCQkJCSBDRkdfUE9TVF9DT0RFQwkgICB8IFwKIAkJCQkgQ0ZHX1BPU1RfRFNQCSAgICkKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0NEUAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9ESUFHICAgIHwgXAotCQkJCUNGR19DTURfRkFUCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfSkZGUzIJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkgCXwgXAotCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BDTUNJQQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcgIAl8IFwKLQkJCQkwKQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0NEUAorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUENNQ0lBCisjZGVmaW5lIENPTkZJR19DTURfUElORworCiAKICNkZWZpbmUgQ09ORklHX0JPQVJEX0VBUkxZX0lOSVRfRgkxCiAjZGVmaW5lIENPTkZJR19NSVNDX0lOSVRfUgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KQEAgLTE0MCw3ICsxNTEsNyBAQAogI2RlZmluZSBDRkdfSFVTSF9QQVJTRVIJMQogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjIzLDcgKzIzNCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9ORVRUQTIuaCBiL2luY2x1ZGUvY29uZmlncy9ORVRUQTIuaAppbmRleCBlMjBlNzI0Li5mYjgwODVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvTkVUVEEyLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL05FVFRBMi5oCkBAIC04Miw3ICs4MiwxNiBAQAogI2RlZmluZQlDT05GSUdfU1RBVFVTX0xFRAkxCS8qIFN0YXR1cyBMRUQgZW5hYmxlZAkJKi8KICNkZWZpbmUgQ09ORklHX0JPQVJEX1NQRUNJRklDX0xFRAkvKiB2ZXJzaW9uIGhhcyBib2FyZCBzcGVjaWZpYyBsZWRzICovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUgfCBDT05GSUdfQk9PVFBfTklTRE9NQUlOKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX05JU0RPTUFJTgorCiAKICN1bmRlZiBDT05GSUdfTUFDX1BBUlRJVElPTgogI3VuZGVmIENPTkZJR19ET1NfUEFSVElUSU9OCkBAIC0xMDUsMjAgKzExNCwyMiBAQAogCiAjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFCTEJLyogYWxsb3cgbW9kaWZpY2F0aW9uIG9mIHZlbmRvciBwYXJhbXMgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX05BTkQJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfUElORyAgCXwgXAotCQkJCUNGR19DTURfTUlJIAl8IFwKLQkJCQlDRkdfQ01EX0NEUAkgIFwKLQkJCQkpCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfTkFORAorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfQ0RQCisKIAogI2RlZmluZSBDT05GSUdfQk9BUkRfRUFSTFlfSU5JVF9GCTEKICNkZWZpbmUgQ09ORklHX01JU0NfSU5JVF9SCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwpAQCAtMTI4LDcgKzEzOSw3IEBACiAjZGVmaW5lIENGR19IVVNIX1BBUlNFUgkxCiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMjAsNyArMjMxLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL05FVFZJQS5oIGIvaW5jbHVkZS9jb25maWdzL05FVFZJQS5oCmluZGV4IGUzMGJlMDkuLmQ0Y2I5ZTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9ORVRWSUEuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvTkVUVklBLmgKQEAgLTgxLDM1ICs4MSw0NSBAQAogCiAjdW5kZWYJQ09ORklHX0NBTl9EUklWRVIJCS8qIENBTiBEcml2ZXIgc3VwcG9ydCBkaXNhYmxlZAkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCQkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFIHwgQ09ORklHX0JPT1RQX05JU0RPTUFJTikKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9OSVNET01BSU4KKwogCiAjdW5kZWYgQ09ORklHX01BQ19QQVJUSVRJT04KICN1bmRlZiBDT05GSUdfRE9TX1BBUlRJVElPTgogCiAjZGVmaW5lCUNPTkZJR19SVENfTVBDOHh4CQkvKiB1c2UgaW50ZXJuYWwgUlRDIG9mIE1QQzh4eAkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EU19CQVNFICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX1BJTkcgKQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCiAKICNpZiBkZWZpbmVkKENPTkZJR19ORVRWSUFfVkVSU0lPTikgJiYgQ09ORklHX05FVFZJQV9WRVJTSU9OID49IDIKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NPTU1BTkRTX0JBU0UgfCBDRkdfQ01EX05BTkQpCi0jZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCUNPTkZJR19DT01NQU5EU19CQVNFCisjZGVmaW5lIENPTkZJR19DTURfTkFORAogI2VuZGlmCiAKKwogI2RlZmluZSBDT05GSUdfQk9BUkRfRUFSTFlfSU5JVF9GIDEKICNkZWZpbmUgQ09ORklHX01JU0NfSU5JVF9SCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTkyLDcgKzIwMiw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9OU0NVLmggYi9pbmNsdWRlL2NvbmZpZ3MvTlNDVS5oCmluZGV4IGQ5OTQ0MjAuLjRjZDQ0NzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9OU0NVLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL05TQ1UuaApAQCAtODQsNyArODQsMTUgQEAKIAogI3VuZGVmCUNPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCkBAIC05MywxNiArMTAxLDE5IEBACiAKICNkZWZpbmUJQ09ORklHX0lTUDEzNjJfVVNCCQkvKiBJU1AxMzYyIFVTQiBPVEcgY29udHJvbGxlcgkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMTE3LDcgKzEyOCw3IEBACiAjZGVmaW5lCUNGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIwMSw3ICsyMTIsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvTlg4MjMuaCBiL2luY2x1ZGUvY29uZmlncy9OWDgyMy5oCmluZGV4IDFjYjhiOGYuLjUyNGFhMDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9OWDgyMy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9OWDgyMy5oCkBAIC01NSwyMiArNTUsMzUgQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQJKi8KICN1bmRlZglDRkdfTE9BRFNfQkFVRF9DSEFOR0UJCS8qIGRvbid0IGFsbG93IGJhdWRyYXRlIGNoYW5nZQkqLwogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkLCBmb3Igbm93CSAgICAqLwotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJIAkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX0FVVE9TQ1JJUFQpCiAjZGVmaW5lIENPTkZJR19BVVRPU0NSSVBUCiAKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BVVRPU0NSSVBUCisKKwogLyogY2FsbCB2YXJpb3VzIGdlbmVyaWMgZnVuY3Rpb25zICovCiAjZGVmaW5lIENPTkZJR19NSVNDX0lOSVRfUgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJICAgICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCkBAIC0xNTIsNyArMTY1LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgICAgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvT0NSVEMuaCBiL2luY2x1ZGUvY29uZmlncy9PQ1JUQy5oCmluZGV4IGFhOWQxYmEuLjU4NDBlYTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9PQ1JUQy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9PQ1JUQy5oCkBAIC01NCwyMCArNTQsMzIgQEAKICNkZWZpbmUgQ09ORklHX1BIWV9BRERSCQkwCS8qIFBIWSBhZGRyZXNzCQkJKi8KICNkZWZpbmUgQ09ORklHX0xYVDk3MV9OT19TTEVFUCAgMSAgICAgICAvKiBkaXNhYmxlIHNsZWVwIG1vZGUgaW4gTFhUOTcxICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JKQorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIAogI2RlZmluZSBDT05GSUdfU0RSQU1fQkFOSzAJMQkvKiBpbml0IG9uYm9hcmQgU0RSQU0gYmFuayAwCSovCkBAIC03Nyw3ICs4OSw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIxNSw3ICsyMjcsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJODE5MgkvKiBGb3IgQU1DQyA0MDUgQ1BVcwkJCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9PUlNHLmggYi9pbmNsdWRlL2NvbmZpZ3MvT1JTRy5oCmluZGV4IDJlN2M1MDUuLjkzN2RmMjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9PUlNHLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL09SU0cuaApAQCAtNTQsMjAgKzU0LDMyIEBACiAjZGVmaW5lIENPTkZJR19QSFlfQUREUgkJMAkvKiBQSFkgYWRkcmVzcwkJCSovCiAjZGVmaW5lIENPTkZJR19MWFQ5NzFfTk9fU0xFRVAgIDEgICAgICAgLyogZGlzYWJsZSBzbGVlcCBtb2RlIGluIExYVDk3MSAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfQlNQCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCSkKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0JTUAorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKICNkZWZpbmUgQ09ORklHX1NEUkFNX0JBTkswCTEJLyogaW5pdCBvbmJvYXJkIFNEUkFNIGJhbmsgMAkqLwpAQCAtNzcsNyArODksNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMTMsNyArMjI1LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTgxOTIJLyogRm9yIEFNQ0MgNDA1IENQVXMJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvT1hDLmggYi9pbmNsdWRlL2NvbmZpZ3MvT1hDLmgKaW5kZXggNzg3NDA3Yy4uOGQ2MWJjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL09YQy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9PWEMuaApAQCAtNTEsMTAgKzUxLDIzIEBACiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJOTYwMAogI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9FTEYpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkJKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMjk5LDcgKzMxMiw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM4MjQwIENQVQkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUDNHNC5oIGIvaW5jbHVkZS9jb25maWdzL1AzRzQuaAppbmRleCBhOTMzZTFiLi5lZjk3MGYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUDNHNC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9QM0c0LmgKQEAgLTEyMCwzMCArMTIwLDQwIEBACiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAjdW5kZWYJQ09ORklHX0FMVElWRUMgICAgICAgICAgICAgICAgICAvKiB1bmRlZiB0byBkaXNhYmxlICAgICAgICAgICAgICovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lCUNPTkZJR19USU1FU1RBTVAJCS8qIFByaW50IGltYWdlIGluZm8gd2l0aCB0aW1lc3RhbXAgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfVU5JVkVSU0V8IFwKLQkJCQlDRkdfQ01EX0JTUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9VTklWRVJTRQorI2RlZmluZSBDT05GSUdfQ01EX0JTUAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTM5Niw3ICs0MDYsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgYWxsIE1QQzc0eHggQ1BVcwkJICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1BBVEkuaCBiL2luY2x1ZGUvY29uZmlncy9QQVRJLmgKaW5kZXggZDg4ZmZmMy4uMGRlNzU5MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1BBVEkuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUEFUSS5oCkBAIC0zOSwxNCArMzksMzUgQEAKIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTk2MDAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDRkdfQ01EX01FTU9SWSB8IENGR19DTURfTE9BREIgfCBDRkdfQ01EX1JFR0lORk8gfCAJCVwKLQkJCQkgQ0ZHX0NNRF9GTEFTSCB8IENGR19DTURfTE9BRFMgfCBDRkdfQ01EX0VOViB8ICBDRkdfQ01EX1JFR0lORk8JfCAJCVwKLQkJCQkgQ0ZHX0NNRF9CREkgfCBDRkdfQ01EX0NPTlNPTEUgfCBDRkdfQ01EX1JVTiB8IENGR19DTURfQlNQIHwJXAotCQkJCSBDRkdfQ01EX0lNSSB8IENGR19DTURfRUVQUk9NICB8IENGR19DTURfSVJRIHwgQ0ZHX0NNRF9NSVNDIFwKLSkKIAotLyogVGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9NRU1PUlkKKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEQgorI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX0xPQURTCisjZGVmaW5lIENPTkZJR19DTURfRU5WCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX0JESQorI2RlZmluZSBDT05GSUdfQ01EX0NPTlNPTEUKKyNkZWZpbmUgQ09ORklHX0NNRF9SVU4KKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JTUkKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9NSVNDCisKIAogI2lmIDAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQktMQkJLyogYXV0b2Jvb3QgZGlzYWJsZWQJCQkqLwpAQCAtNzEsNyArOTIsNyBAQAogCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkJInBhdGk9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9QQ0k0MDUuaCBiL2luY2x1ZGUvY29uZmlncy9QQ0k0MDUuaAppbmRleCAwMjdkZDIyLi5kNmU3MDgyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUENJNDA1LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1BDSTQwNS5oCkBAIC02OCwxNyArNjgsMjkgQEAKIAogI2RlZmluZSBDT05GSUdfUlRDX000OFQzNUEJMQkJLyogU1QgRWxlY3Ryb25pY3MgTTQ4IHRpbWVrZWVwZXIgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0JTUAorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtOTcsNyArMTA5LDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjQ0LDcgKzI1Niw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQk4MTkyCS8qIEZvciBBTUNDIDQwNSBDUFVzCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1BDSTU0NDEuaCBiL2luY2x1ZGUvY29uZmlncy9QQ0k1NDQxLmgKaW5kZXggM2E3ZjdmMC4uMjRiMjVkOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1BDSTU0NDEuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUENJNTQ0MS5oCkBAIC0xMjIsMjIgKzEyMiwzMiBAQAogI2RlZmluZSBDRkdfTklPU19UTVJDTlQJKENGR19OSU9TX1RNUk1TICogKENPTkZJR19TWVNfQ0xLX0ZSRVEvMTAwMCkpCiAjZGVmaW5lCUNGR19IWgkJKENPTkZJR19TWVNfQ0xLX0ZSRVEvKENGR19OSU9TX1RNUkNOVCArIDEpKQogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ09NTUFORFMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENGR19DTURfQkRJCXwgXAotCQkJCSBDRkdfQ01EX0VDSE8JfCBcCi0JCQkJIENGR19DTURfRU5WCXwgXAotCQkJCSBDRkdfQ01EX0ZMQVNICXwgXAotCQkJCSBDRkdfQ01EX0lNSQl8IFwKLQkJCQkgQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJIENGR19DTURfTE9BRFMJfCBcCi0JCQkJIENGR19DTURfTE9BREIJfCBcCi0JCQkJIENGR19DTURfTUVNT1JZCXwgXAotCQkJCSBDRkdfQ01EX01JU0MJfCBcCi0JCQkJIENGR19DTURfUlVOCXwgXAotCQkJCSBDRkdfQ01EX1NBVkVTCSkKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9CREkKKyNkZWZpbmUgQ09ORklHX0NNRF9FQ0hPCisjZGVmaW5lIENPTkZJR19DTURfRU5WCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gKKyNkZWZpbmUgQ09ORklHX0NNRF9JTUkKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEUworI2RlZmluZSBDT05GSUdfQ01EX0xPQURCCisjZGVmaW5lIENPTkZJR19DTURfTUVNT1JZCisjZGVmaW5lIENPTkZJR19DTURfTUlTQworI2RlZmluZSBDT05GSUdfQ01EX1JVTgorI2RlZmluZSBDT05GSUdfQ01EX1NBVkVTCisKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIE1JU0MKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9QQ0lQUEMyLmggYi9pbmNsdWRlL2NvbmZpZ3MvUENJUFBDMi5oCmluZGV4IDNhOTdmYmMuLjI2OGIwMzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9QQ0lQUEMyLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1BDSVBQQzIuaApAQCAtNTMsMzAgKzUzLDM3IEBACiAjZGVmaW5lIENPTkZJR19QUkVCT09UCQkiIgogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUKIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBcCi0JCQkJIENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RPQwl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0JTUAorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRE9DCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfU05UUAogCiAjZGVmaW5lIENPTkZJR19QQ0kJCTEKICNkZWZpbmUgQ09ORklHX1BDSV9QTlAJCTEJLyogUENJIHBsdWctYW5kLXBsYXkgKi8KIAotLyogVGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KQotICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KICNkZWZpbmUgQ0ZHX05BTkRfTEVHQUNZCiAKIC8qCkBAIC0yMjMsNyArMjMwLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9QQ0lQUEM2LmggYi9pbmNsdWRlL2NvbmZpZ3MvUENJUFBDNi5oCmluZGV4IDEzMGJlYjcuLjI1MGI1ODYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9QQ0lQUEM2LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1BDSVBQQzYuaApAQCAtNTMsMzIgKzUzLDM5IEBACiAjZGVmaW5lIENPTkZJR19QUkVCT09UCQkiIgogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUKIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBcCi0JCQkJIENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RPQwl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX1NDU0kJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RPQworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1NDU0kKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCiAKIAogI2RlZmluZSBDT05GSUdfUENJCQkxCiAjZGVmaW5lIENPTkZJR19QQ0lfUE5QCQkxCS8qIFBDSSBwbHVnLWFuZC1wbGF5ICovCiAKLS8qIFRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkKLSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjZGVmaW5lIENGR19OQU5EX0xFR0FDWQogCiAvKgpAQCAtMjI1LDcgKzIzMiw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUElQNDA1LmggYi9pbmNsdWRlL2NvbmZpZ3MvUElQNDA1LmgKaW5kZXggODA2ZTk1Zi4uZWZhMDE1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1BJUDQwNS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9QSVA0MDUuaApAQCAtNDAsMzMgKzQwLDQyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjZGVmaW5lIENPTkZJR19TWVNfQ0xLX0ZSRVEJMzMwMDAwMDAgLyogZXh0ZXJuYWwgZnJlcXVlbmN5IHRvIHBsbAkqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvbW1hbmQgZGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQlcCi0JCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQlDRkdfQ01EX0lERQl8IFwKLQkJCUNGR19DTURfREhDUAl8IFwKLQkJCUNGR19DTURfUENJCXwgXAotCQkJQ0ZHX0NNRF9DQUNIRQl8IFwKLQkJCUNGR19DTURfSVJRCXwgXAotCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQlDRkdfQ01EX0kyQwl8IFwKLQkJCUNGR19DTURfUkVHSU5GTyB8IFwKLQkJCUNGR19DTURfRkRDCXwgXAotCQkJQ0ZHX0NNRF9TQ1NJCXwgXAotCQkJQ0ZHX0NNRF9GQVQgCXwgXAotCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQlDRkdfQ01EX1VTQgl8IFwKLQkJCUNGR19DTURfTUlJCXwgXAotCQkJQ0ZHX0NNRF9TRFJBTQl8IFwKLQkJCUNGR19DTURfRE9DCXwgXAotCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJQ0ZHX0NNRF9TQVZFUyAgIHwgXAotCQkJQ0ZHX0NNRF9CU1AJKQotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9GREMKKyNkZWZpbmUgQ09ORklHX0NNRF9TQ1NJCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX1VTQgorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisjZGVmaW5lIENPTkZJR19DTURfRE9DCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1NBVkVTCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisKIAogI2RlZmluZSBDRkdfTkFORF9MRUdBQ1kKIApAQCAtMTUwLDcgKzE1OSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIyNyw3ICsyMzYsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJODE5MgkvKiBGb3IgQU1DQyA0MDUgQ1BVcwkJCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKQEAgLTM2Niw3ICszNzUsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRGVidWcgc3VwcG9ydAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9QSzFDMjAuaCBiL2luY2x1ZGUvY29uZmlncy9QSzFDMjAuaAppbmRleCA4M2E3ZWMyLi5kOTAzNTFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUEsxQzIwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1BLMUMyMC5oCkBAIC0xNjAsMzAgKzE2MCw0MSBAQAogI2RlZmluZSBDT05GSUdfSVBBRERSCQkxOTIuMTY4LjIuMjEKICNkZWZpbmUgQ09ORklHX1NFUlZFUklQCQkxOTIuMTY4LjIuMTYKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENPTU1BTkRTCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDRkdfQ01EX0JESQl8IFwKLQkJCQkgQ0ZHX0NNRF9ESENQCXwgXAotCQkJCSBDRkdfQ01EX0VDSE8JfCBcCi0JCQkJIENGR19DTURfRU5WCXwgXAotCQkJCSBDRkdfQ01EX0ZMQVNICXwgXAotCQkJCSBDRkdfQ01EX0lNSQl8IFwKLQkJCQkgQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJIENGR19DTURfTE9BRFMJfCBcCi0JCQkJIENGR19DTURfTE9BREIJfCBcCi0JCQkJIENGR19DTURfTUVNT1JZIHwgXAotCQkJCSBDRkdfQ01EX01JU0MJfCBcCi0JCQkJIENGR19DTURfTkVUCXwgXAotCQkJCSBDRkdfQ01EX1BJTkcJfCBcCi0JCQkJIENGR19DTURfUlVOCXwgXAotCQkJCSBDRkdfQ01EX1NBVkVTCSkKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKworI2RlZmluZSBDT05GSUdfQ01EX0JESQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FQ0hPCisjZGVmaW5lIENPTkZJR19DTURfRU5WCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gKKyNkZWZpbmUgQ09ORklHX0NNRF9JTUkKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEUworI2RlZmluZSBDT05GSUdfQ01EX0xPQURCCisjZGVmaW5lIENPTkZJR19DTURfTUVNT1JZCisjZGVmaW5lIENPTkZJR19DTURfTUlTQworI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SVU4KKyNkZWZpbmUgQ09ORklHX0NNRF9TQVZFUworCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBDT01QQUNUIEZMQVNICiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKQogI2RlZmluZSBDT05GSUdfSURFX1BSRUlOSVQJCQkvKiBJbXBsZW1lbnQgaWRfcHJlaW5pdAkqLwogI2RlZmluZSBDRkdfSURFX01BWEJVUwkJMQkJLyogMSBJREUgYnVzCQkqLwogI2RlZmluZSBDRkdfSURFX01BWERFVklDRQkxCQkvKiAxIGRyaXZlIHBlciBJREUgYnVzCSovCkBAIC0yMDEsMTIgKzIxMiwxMiBAQAogI2RlZmluZSBDRkdfQ0ZfUE9XRVIJCTB4MDA5MDA4OTAJLyogQ0YgUG93ZXIgRkVUIFBJTyBiYXNlKi8KICNkZWZpbmUgQ0ZHX0NGX0FUQVNFTAkJMHgwMDkwMDhhMAkvKiBDRiBBVEFTRUwgUElPIGJhc2UJKi8KIAotI2VuZGlmIC8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFICovCisjZW5kaWYKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEpGRlMyCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9KRkZTMikKICNkZWZpbmUgQ0ZHX0pGRlNfQ1VTVE9NX1BBUlQJCQkvKiBib2FyZCBkZWZpbmVkIHBhcnQJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUExVNDA1LmggYi9pbmNsdWRlL2NvbmZpZ3MvUExVNDA1LmgKaW5kZXggZDAyYzM5Yi4uNTQ3MDM3MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1BMVTQwNS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9QTFU0MDUuaApAQCAtNjEsMTkgKzYxLDM0IEBACiAKICNkZWZpbmUgQ09ORklHX1BIWV9DTEtfRlJFUQlFTUFDX1NUQUNSX0NMS182Nk1IWiAvKiA2NiBNSHogT1BCIGNsb2NrKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9OQU5ECXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JKQorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KQEAgLTgzLDkgKzk4LDYgQEAKICNkZWZpbmUgQ09ORklHX0FVVE9fVVBEQVRFICAgICAgMSAgICAgICAvKiBhdXRvdXBkYXRlIHZpYSBjb21wYWN0Zmxhc2ggICovCiAjZGVmaW5lIENPTkZJR19BVVRPX1VQREFURV9TSE9XIDEgICAgICAgLyogdXNlIGJvYXJkIHNob3cgcm91dGluZSAgICAgICAqLwogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIAogI2RlZmluZSBDT05GSUdfUlRDX01DMTQ2ODE4CQkvKiBEUzE2ODUgaXMgTUMxNDY4MTggY29tcGF0aWJsZSovCkBAIC0xMDQsNyArMTE2LDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMzMxLDcgKzM0Myw3IEBACiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQJLyogRm9yIEFNQ0MgNDA1IENQVXMsIG9sZGVyIDQwNSBwcGMncwkqLwogCQkJCQkvKiBoYXZlIG9ubHkgOGtCLCAxNmtCIGlzIHNhdmUgaGVyZQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUE01MjAuaCBiL2luY2x1ZGUvY29uZmlncy9QTTUyMC5oCmluZGV4IDdkOTFhMDEuLjViYThmNGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9QTTUyMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9QTTUyMC5oCkBAIC00MCwxMSArNDAsNiBAQAogI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdAkgICAgICovCiAKLSNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQotIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwotI2VuZGlmCi0KIC8qCiAgKiBTZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCiAgKi8KQEAgLTc3LDEyICs3Miw2IEBACiAjZGVmaW5lIENGR19SWF9FVEhfQlVGRkVSCTggIC8qIHVzZSA4IHJ4IGJ1ZmZlciBvbiBlZXBybzEwMCAgKi8KICN1bmRlZiAgQ09ORklHX05TODM4MlgKIAotI2RlZmluZSBBRERfUENJX0NNRCAJCUNGR19DTURfUENJCi0KLSNlbHNlCS8qIE1QQzUxMDAgKi8KLQotI2RlZmluZSBBRERfUENJX0NNRAkJMCAgLyogbm8gQ0ZHX0NNRF9QQ0kgKi8KLQogI2VuZGlmCiAKIC8qIFBhcnRpdGlvbnMgKi8KQEAgLTkxLDM5ICs4MCw0OCBAQAogLyogVVNCICovCiAjaWYgMQogI2RlZmluZSBDT05GSUdfVVNCX09IQ0kKLSNkZWZpbmUgQUREX1VTQl9DTUQgICAgICAgICAgICAgQ0ZHX0NNRF9VU0IgfCBDRkdfQ01EX0ZBVAogI2RlZmluZSBDT05GSUdfVVNCX1NUT1JBR0UKLSNlbHNlCi0jZGVmaW5lIEFERF9VU0JfQ01EICAgICAgICAgICAgIDAKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfQk9PVF9ST00pCi0jZGVmaW5lIEFERF9ET0NfQ01EICAgICAgICAgICAgIDAKLSNlbHNlCi0jZGVmaW5lIEFERF9ET0NfQ01EICAgICAgICAgICAgIENGR19DTURfRE9DCisjaWYgIWRlZmluZWQoQ09ORklHX0JPT1RfUk9NKQogLyogRG9DIHJlcXVpcmVzIGxlZ2FjeSBOQU5EIGZvciBub3cgKi8KICNkZWZpbmUgQ0ZHX05BTkRfTEVHQUNZCiAjZW5kaWYKIAotLyoKLSAqIFN1cHBvcnRlZCBjb21tYW5kcwotICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUFERF9ET0NfQ01ECXwgXAotCQkJCUFERF9QQ0lfQ01ECXwgXAotCQkJCUFERF9VU0JfQ01ECXwgXAotCQkJCUNGR19DTURfQkVEQlVHCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0JFREJVRworI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorI2RlZmluZSBDT05GSUdfQ01EX1VTQgorCisjaWYgIWRlZmluZWQoQ09ORklHX0JPT1RfUk9NKQorI2RlZmluZSBDT05GSUdfQ01EX0RPQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM1MjAwKQorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2VuZGlmCisKIAogLyoKICAqIEF1dG9ib290aW5nCkBAIC0yOTQsNyArMjkyLDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkgICAgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAgICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KQEAgLTMxMCw2ICszMDgsMTEgQEAKIAogI2RlZmluZSBDRkdfSFoJCQkxMDAwCS8qIGRlY3JlbWVudGVyIGZyZXE6IDEgbXMgdGlja3MgKi8KIAorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLworI2VuZGlmCisKIC8qCiAgKiBWYXJpb3VzIGxvdy1sZXZlbCBzZXR0aW5ncwogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUE04MjYuaCBiL2luY2x1ZGUvY29uZmlncy9QTTgyNi5oCmluZGV4IDg4ZmRiNTEuLmM4MGIxNTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9QTTgyNi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9QTTgyNi5oCkBAIC0xMDMsOCArMTAzLDcgQEAKICAqICAgLSBDT05GSUdfTkVUX01VTFRJIG11c3QgYmUgZGVmaW5lZAogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICovCiAjZGVmaW5lCUNPTkZJR19ORVRfTVVMVEkKICN1bmRlZglDT05GSUdfRVRIRVJfTk9ORQkJLyogZGVmaW5lIGlmIGV0aGVyIG9uIHNvbWV0aGluZyBlbHNlICovCkBAIC0xNTIsMzMgKzE1MSwzNCBAQAogCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUfENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ET0MKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCiAKICNpZmRlZiBDT05GSUdfUENJCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQkVEQlVHCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9ET0MJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKLSNlbHNlCS8qICEgUENJICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQkVEQlVHCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9ET0MJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKLSNlbmRpZgkvKiBDT05GSUdfUENJICovCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZW5kaWYKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgogCiAjZGVmaW5lIENGR19OQU5EX0xFR0FDWQogCkBAIC0xOTcsNyArMTk3LDcgQEAKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMzQ1LDcgKzM0NSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFICAgICAgMzIgICAgICAvKiBGb3IgTVBDODI2MCBDUFUgICAgICAgICAgICAgICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUE04MjguaCBiL2luY2x1ZGUvY29uZmlncy9QTTgyOC5oCmluZGV4IDM3ZWU5NzcuLjhmNWJlNWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9QTTgyOC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9QTTgyOC5oCkBAIC0xMDMsOCArMTAzLDcgQEAKICAqICAgLSBDT05GSUdfTkVUX01VTFRJIG11c3QgYmUgZGVmaW5lZAogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICovCiAjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkKICN1bmRlZglDT05GSUdfRVRIRVJfTk9ORQkJLyogZGVmaW5lIGlmIGV0aGVyIG9uIHNvbWV0aGluZyBlbHNlICovCkBAIC0xNTIsMzMgKzE1MSwzNCBAQAogCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUfENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ET0MKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCiAKICNpZmRlZiBDT05GSUdfUENJCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQkVEQlVHCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9ET0MJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKLSNlbHNlCS8qICEgUENJICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQkVEQlVHCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9ET0MJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKLSNlbmRpZgkvKiBDT05GSUdfUENJICovCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZW5kaWYKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgogCiAvKgogICogRGlzay1Pbi1DaGlwIGNvbmZpZ3VyYXRpb24KQEAgLTE5Niw3ICsxOTYsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zMzgsNyArMzM4LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyNjAgQ1BVCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1BNODU0LmggYi9pbmNsdWRlL2NvbmZpZ3MvUE04NTQuaAppbmRleCA0ZmI1NDQwLi5kYmY5NDIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUE04NTQuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUE04NTQuaApAQCAtMjYyLDEwICsyNjIsMTAgQEAKICNlbmRpZgogCiAjZGVmaW5lIENPTkZJR19NSUkJCTEJLyogTUlJIFBIWSBtYW5hZ2VtZW50ICovCi0jZGVmaW5lIENPTkZJR19NUEM4NVhYX1RTRUMxCTEKLSNkZWZpbmUgQ09ORklHX01QQzg1WFhfVFNFQzFfTkFNRQkiVFNFQzAiCi0jZGVmaW5lIENPTkZJR19NUEM4NVhYX1RTRUMyCTEKLSNkZWZpbmUgQ09ORklHX01QQzg1WFhfVFNFQzJfTkFNRQkiVFNFQzEiCisjZGVmaW5lIENPTkZJR19UU0VDMQkxCisjZGVmaW5lIENPTkZJR19UU0VDMV9OQU1FCSJUU0VDMCIKKyNkZWZpbmUgQ09ORklHX1RTRUMyCTEKKyNkZWZpbmUgQ09ORklHX1RTRUMyX05BTUUJIlRTRUMxIgogI2RlZmluZSBUU0VDMV9QSFlfQUREUgkJMAogI2RlZmluZSBUU0VDMl9QSFlfQUREUgkJMQogI2RlZmluZSBUU0VDMV9QSFlJRFgJCTAKQEAgLTMwMyw0MyArMzAzLDM2IEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkICovCiAjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZSAqLwogCi0jaWYgZGVmaW5lZChDRkdfUkFNQk9PVCkKLSAgI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTAlcCi0JCQkJIHwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJIHwgQ0ZHX0NNRF9QQ0kJCVwKLQkJCQkgfCBDRkdfQ01EX0kyQykJCVwKLQkJCQkmCQkJXAotCQkJCSB+KENGR19DTURfRU5WCQlcCi0JCQkJICB8IENGR19DTURfTE9BRFMpKQotICAjZWxzZQotICAgICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMCVwKLQkJCQkgfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQkgfCBDRkdfQ01EX0kyQykJCVwKLQkJCQkmCQkJXAotCQkJCSB+KENGR19DTURfRU5WCQlcCi0JCQkJICB8IENGR19DTURfTE9BRFMpKQotICAjZW5kaWYKLSNlbHNlCi0gICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTAkJXAotCQkJCXwgQ0ZHX0NNRF9FRVBST00JXAotCQkJCXwgQ0ZHX0NNRF9EQVRFCQlcCi0JCQkJfCBDRkdfQ01EX01JSQkJXAotCQkJCXwgQ0ZHX0NNRF9QQ0kJCVwKLQkJCQl8IENGR19DTURfUElORwkJXAotCQkJCXwgQ0ZHX0NNRF9JMkMpCi0gICNlbHNlCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTAkJXAotCQkJCXwgQ0ZHX0NNRF9FRVBST00JXAotCQkJCXwgQ0ZHX0NNRF9EQVRFCQlcCi0JCQkJfCBDRkdfQ01EX01JSQkJXAotCQkJCXwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJfCBDRkdfQ01EX0kyQykKLSAgI2VuZGlmCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKICNlbmRpZgogCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjaWYgZGVmaW5lZChDRkdfUkFNQk9PVCkKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9FTlYKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9MT0FEUworI2VuZGlmCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkICovCiAKQEAgLTM1MCw3ICszNDMsNyBAQAogI2RlZmluZSBDRkdfTE9BRF9BRERSCTB4MjAwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogICAgICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICAgICAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtMzcyLDcgKzM2NSw3IEBACiAvKiBDYWNoZSBDb25maWd1cmF0aW9uICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMzI3NjgKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUqLwogI2VuZGlmCiAKQEAgLTM4NCw3ICszNzcsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290ICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9QTTg1Ni5oIGIvaW5jbHVkZS9jb25maWdzL1BNODU2LmgKaW5kZXggODdhYjkzNC4uNmJkZmE1ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1BNODU2LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1BNODU2LmgKQEAgLTI1OCwxMCArMjU4LDEwIEBACiAjZW5kaWYKIAogI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudCAqLwotI2RlZmluZSBDT05GSUdfTVBDODVYWF9UU0VDMQkxCi0jZGVmaW5lIENPTkZJR19NUEM4NVhYX1RTRUMxX05BTUUJIlRTRUMwIgotI2RlZmluZSBDT05GSUdfTVBDODVYWF9UU0VDMgkxCi0jZGVmaW5lIENPTkZJR19NUEM4NVhYX1RTRUMyX05BTUUJIlRTRUMxIgorI2RlZmluZSBDT05GSUdfVFNFQzEJMQorI2RlZmluZSBDT05GSUdfVFNFQzFfTkFNRQkiVFNFQzAiCisjZGVmaW5lIENPTkZJR19UU0VDMgkxCisjZGVmaW5lIENPTkZJR19UU0VDMl9OQU1FCSJUU0VDMSIKICN1bmRlZiBDT05GSUdfTVBDODVYWF9GRUMKICNkZWZpbmUgVFNFQzFfUEhZX0FERFIJCTAKICNkZWZpbmUgVFNFQzJfUEhZX0FERFIJCTEKQEAgLTMwNiw0MSArMzA2LDM1IEBACiAjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkICovCiAjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZSAqLwogCi0jaWYgZGVmaW5lZChDRkdfUkFNQk9PVCkKLSAgI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTAlcCi0JCQkJIHwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJIHwgQ0ZHX0NNRF9QQ0kJCVwKLQkJCQkgfCBDRkdfQ01EX0kyQykJCVwKLQkJCQkmCQkJXAotCQkJCSB+KENGR19DTURfRU5WCQlcCi0JCQkJICB8IENGR19DTURfTE9BRFMpKQotICAjZWxzZQotICAgICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMCVwKLQkJCQkgfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQkgfCBDRkdfQ01EX0kyQykJCVwKLQkJCQkmCQkJXAotCQkJCSB+KENGR19DTURfRU5WCQlcCi0JCQkJICB8IENGR19DTURfTE9BRFMpKQotICAjZW5kaWYKLSNlbHNlCi0gICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0gICAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTAkJXAotCQkJCXwgQ0ZHX0NNRF9FRVBST00JXAotCQkJCXwgQ0ZHX0NNRF9EQVRFCQlcCi0JCQkJfCBDRkdfQ01EX1BDSQkJXAotCQkJCXwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJfCBDRkdfQ01EX0kyQykKLSAgI2Vsc2UKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMCQlcCi0JCQkJfCBDRkdfQ01EX0VFUFJPTQlcCi0JCQkJfCBDRkdfQ01EX0RBVEUJCVwKLQkJCQl8IENGR19DTURfUElORwkJXAotCQkJCXwgQ0ZHX0NNRF9JMkMpCi0gICNlbmRpZgorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCiAjZW5kaWYKIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpCisgICAgI3VuZGVmIENPTkZJR19DTURfRU5WCisgICAgI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyNlbmRpZgorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZCAqLwogCkBAIC0zNTEsNyArMzQ1LDcgQEAKICNkZWZpbmUgQ0ZHX0xPQURfQUREUgkweDEwMDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICAgICAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAgICAgI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTM3Myw3ICszNjcsNyBAQAogLyogQ2FjaGUgQ29uZmlndXJhdGlvbiAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTMyNzY4CiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKmxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlKi8KICNlbmRpZgogCkBAIC0zODUsNyArMzc5LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUE1DNDA1LmggYi9pbmNsdWRlL2NvbmZpZ3MvUE1DNDA1LmgKaW5kZXggNmUwYmQ3Zi4uYjI5ZjM2OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1BNQzQwNS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9QTUM0MDUuaApAQCAtNjMsMjUgKzYzLDM3IEBACiAKICNkZWZpbmUgQ09ORklHX05FVENPTlNPTEUJCS8qIGluY2x1ZGUgTmV0Q29uc29sZSBzdXBwb3J0CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfSkZGUzIJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfVU5JVkVSU0UgfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00gICkKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0JTUAorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9VTklWRVJTRQorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKICNkZWZpbmUgQ09ORklHX1JUQ19NQzE0NjgxOCAgICAgICAgICAgICAvKiBEUzE2ODUgaXMgTUMxNDY4MTggY29tcGF0aWJsZSovCkBAIC0xMDAsNyArMTEyLDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjYzLDcgKzI3NSw3IEBACiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQJLyogRm9yIEFNQ0MgNDA1IENQVXMsIG9sZGVyIDQwNSBwcGMncwkqLwogCQkJCQkvKiBoYXZlIG9ubHkgOGtCLCAxNmtCIGlzIHNhdmUgaGVyZQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUE42Mi5oIGIvaW5jbHVkZS9jb25maWdzL1BONjIuaAppbmRleCBhNzE3NjU5Li43MmFjZjVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUE42Mi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9QTjYyLmgKQEAgLTQyLDE1ICs0MiwyOSBAQAogI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWAkxCiAKIAotI2RlZmluZSBSRU1PVkVfQ09NTUFORFMgICAgICAgICAoIENGR19DTURfQVVUT1NDUklQVAl8IFwKLSAJCQkJICBDRkdfQ01EX0xPQURTCQl8IFwKLSAJCQkJICBDRkdfQ01EX0VOVgkJfCBcCi0gCQkJCSAgQ0ZHX0NNRF9GTEFTSAkJfCBcCi0JCQkJICBDRkdfQ01EX0lNTFMJCSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoIChDT05GSUdfQ01EX0RGTCAmIH5SRU1PVkVfQ09NTUFORFMpIHxcCi0JCQkJICBDRkdfQ01EX1BDSSB8XAotCQkJCSAgQ0ZHX0NNRF9CU1ApCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisKKyN1bmRlZiBDT05GSUdfQ01EX0FVVE9TQ1JJUFQKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjdW5kZWYgQ09ORklHX0NNRF9FTlYKKyN1bmRlZiBDT05GSUdfQ01EX0ZMQVNICisjdW5kZWYgQ09ORklHX0NNRF9JTUxTCisKIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTE5MjAwCS8qIGNvbnNvbGUgYmF1ZHJhdGUJCSovCiAKQEAgLTgyLDEwICs5Niw2IEBACiAJCQkibG9hZHAgMjAwMDAwOyBib290bSIKICNlbmRpZgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpCSovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KLQogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwpAQCAtMjg3LDcgKzI5Nyw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM4MjQwIENQVQkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUFBDaGFtZWxlb25FVkIuaCBiL2luY2x1ZGUvY29uZmlncy9QUENoYW1lbGVvbkVWQi5oCmluZGV4IDE2ZTJjYzYuLmRkMWRlY2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9QUENoYW1lbGVvbkVWQi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9QUENoYW1lbGVvbkVWQi5oCkBAIC0xMTMsMjYgKzExMywzOCBAQAogI2VuZGlmCiAjZGVmaW5lIENPTkZJR19QSFlfQ0xLX0ZSRVEJRU1BQ19TVEFDUl9DTEtfNjZNSFoKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfSkZGUzIJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9OQU5ECXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfU05UUAkpCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkFORAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCiAjZGVmaW5lIENPTkZJR19SVENfTTQxVDExCTEJLyogdXNlcyBhIE00MVQwMCBSVEMJCSovCkBAIC0xNjIsNyArMTc0LDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtNDQ2LDcgKzQ1OCw3IEBACiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQJLyogRm9yIEFNQ0MgNDA1IENQVXMsIG9sZGVyIDQwNSBwcGMncwkqLwogCQkJCQkvKiBoYXZlIG9ubHkgOGtCLCAxNmtCIGlzIHNhdmUgaGVyZQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUVM4MjMuaCBiL2luY2x1ZGUvY29uZmlncy9RUzgyMy5oCmluZGV4IDIzNWJjNDguLjM2NTdmZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9RUzgyMy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9RUzgyMy5oCkBAIC0xODksMjcgKzE4OSwzNyBAQAogI3VuZGVmIENPTkZJR19TVEFUVVNfTEVECQkvKiBTdGF0dXMgTEVEIGRpc2FibGVkICovCiAjdW5kZWYgQ09ORklHX0NBTl9EUklWRVIJCS8qIENBTiBEcml2ZXIgc3VwcG9ydCBkaXNhYmxlZCAqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICN1bmRlZiBDT05GSUdfTUFDX1BBUlRJVElPTgogI3VuZGVmIENPTkZJR19ET1NfUEFSVElUSU9OCiAKICNkZWZpbmUgQ09ORklHX1JUQ19NUEM4eHgJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHggKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDRkdfQ01EX0JESQl8IFwKLQlDRkdfQ01EX0JPT1RECXwgXAotCUNGR19DTURfQ09OU09MRQl8IFwKLQlDRkdfQ01EX0RBVEUJfCBcCi0JQ0ZHX0NNRF9FTlYJfCBcCi0JQ0ZHX0NNRF9GTEFTSAl8IFwKLQlDRkdfQ01EX0lNSQl8IFwKLQlDRkdfQ01EX0lNTUFQCXwgXAotCUNGR19DTURfTUVNT1JZCXwgXAotCUNGR19DTURfTkVUCXwgXAotCUNGR19DTURfUlVOKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNkZWZpbmUgQ09ORklHX0NNRF9CREkKKyNkZWZpbmUgQ09ORklHX0NNRF9CT09URAorI2RlZmluZSBDT05GSUdfQ01EX0NPTlNPTEUKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfRU5WCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gKKyNkZWZpbmUgQ09ORklHX0NNRF9JTUkKKyNkZWZpbmUgQ09ORklHX0NNRF9JTU1BUAorI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX1JVTgorCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEVudmlyb25tZW50IHZhcmlhYmxlIHN0b3JhZ2UgaXMgaW4gRkxBU0gsIG9uZSBzZWN0b3IgYmVmb3JlIFUtYm9vdApAQCAtMjI4LDcgKzIzOCw3IEBACiAjZGVmaW5lIENGR19IVVNIX1BBUlNFUgkJMQkJLyogdXNlICJodXNoIiBjb21tYW5kIHBhcnNlciAqLwogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCkBAIC0zMDMsNyArMzEzLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJCS8qIEZvciBhbGwgTVBDOHh4IENQVXMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJCS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1FTODUwLmggYi9pbmNsdWRlL2NvbmZpZ3MvUVM4NTAuaAppbmRleCA5Njc1ODJiLi4zZGI1MzlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUVM4NTAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUVM4NTAuaApAQCAtMTg5LDI3ICsxODksMzcgQEAKICN1bmRlZiBDT05GSUdfU1RBVFVTX0xFRAkJLyogU3RhdHVzIExFRCBkaXNhYmxlZCAqLwogI3VuZGVmIENPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQgKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAogI3VuZGVmIENPTkZJR19NQUNfUEFSVElUSU9OCiAjdW5kZWYgQ09ORklHX0RPU19QQVJUSVRJT04KIAogI2RlZmluZSBDT05GSUdfUlRDX01QQzh4eAkvKiB1c2UgaW50ZXJuYWwgUlRDIG9mIE1QQzh4eCAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENGR19DTURfQkRJCXwgXAotCUNGR19DTURfQk9PVEQJfCBcCi0JQ0ZHX0NNRF9DT05TT0xFCXwgXAotCUNGR19DTURfREFURQl8IFwKLQlDRkdfQ01EX0VOVgl8IFwKLQlDRkdfQ01EX0ZMQVNICXwgXAotCUNGR19DTURfSU1JCXwgXAotCUNGR19DTURfSU1NQVAJfCBcCi0JQ0ZHX0NNRF9NRU1PUlkJfCBcCi0JQ0ZHX0NNRF9ORVQJfCBcCi0JQ0ZHX0NNRF9SVU4pCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworCisjZGVmaW5lIENPTkZJR19DTURfQkRJCisjZGVmaW5lIENPTkZJR19DTURfQk9PVEQKKyNkZWZpbmUgQ09ORklHX0NNRF9DT05TT0xFCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfSU1JCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9NRU1PUlkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9SVU4KKwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBFbnZpcm9ubWVudCB2YXJpYWJsZSBzdG9yYWdlIGlzIGluIEZMQVNILCBvbmUgc2VjdG9yIGJlZm9yZSBVLWJvb3QKQEAgLTIyOCw3ICsyMzgsNyBAQAogI2RlZmluZSBDRkdfSFVTSF9QQVJTRVIJCTEJCS8qIHVzZSAiaHVzaCIgY29tbWFuZCBwYXJzZXIgKi8KICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtMzAzLDcgKzMxMyw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CQkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9RUzg2MFQuaCBiL2luY2x1ZGUvY29uZmlncy9RUzg2MFQuaAppbmRleCAzMmZhYTYxLi5iMzQ0MmRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUVM4NjBULmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1FTODYwVC5oCkBAIC05MiwyMyArOTIsMzMgQEAKIAogI3VuZGVmIENPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQgKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKICNkZWZpbmUgQ09ORklHX1JUQ19NUEM4eHgJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHggKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSggQ09ORklHX0NNRF9ERkwgfCBcCi0JQ0ZHX0NNRF9SRUdJTkZPCXwgXAotCUNGR19DTURfSU1NQVAJfCBcCi0JQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JQ0ZHX0NNRF9ORVQJfCBcCi0JQ0ZHX0NNRF9ESENQCXwgXAotCUNGR19DTURfREFURQkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX0lNTUFQCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKIAogCiAvKiBUT0RPICovCkBAIC0xMzYsNyArMTQ2LDcgQEAKICNkZWZpbmUgQ0ZHX0hVU0hfUEFSU0VSCQkxCQkvKiB1c2UgImh1c2giIGNvbW1hbmQgcGFyc2VyICovCiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTIxMCw3ICsyMjAsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkJLyogRm9yIGFsbCBNUEM4eHggQ1BVcyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUjM2ME1QSS5oIGIvaW5jbHVkZS9jb25maWdzL1IzNjBNUEkuaAppbmRleCA4MjIyOGMwLi41MTZlYzY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUjM2ME1QSS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9SMzYwTVBJLmgKQEAgLTc5LDcgKzc5LDE0IEBACiAKICNkZWZpbmUJQ09ORklHX0NBTl9EUklWRVIJCS8qIENBTiBEcml2ZXIgc3VwcG9ydCBlbmFibGVkCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KQEAgLTExMSwyMCArMTE4LDIzIEBACiAjZGVmaW5lIENGR19JMkNfS0VZX0FERFIJMHg5CS8qIEtleWJvYXJkIGNvcHJvY2Vzc29yICovCiAjZGVmaW5lIENGR19JMkNfVEVNX0FERFIJMHg0OQkvKiBUZW1wZXJhdHVyZSBTZW5zb3JzICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9CTVAJfCBcCi0JCQkJQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX0pGRlMyCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUENNQ0lBCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQk1QCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDTUNJQQorI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMTM0LDcgKzE0NCw3IEBACiAKICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIyOCw3ICsyMzgsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUkJDODIzLmggYi9pbmNsdWRlL2NvbmZpZ3MvUkJDODIzLmgKaW5kZXggMjQyYzgzNy4uMmY2ZGU4MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1JCQzgyMy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9SQkM4MjMuaApAQCAtNzksNyArNzksMTUgQEAKIAogI3VuZGVmCUNPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjdW5kZWYgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KQEAgLTk0LDQyICsxMDIsNDUgQEAKICNkZWZpbmUgQ0ZHX0VFUFJPTV9XUklURV9CSVRTCQk0CiAjZGVmaW5lIENGR19FRVBST01fV1JJVEVfREVMQVlfTVMJMTAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDRkdfQ01EX0FMTAkmIFwKLQkJCQl+Q0ZHX0NNRF9CU1AJJiBcCi0JCQkJfkNGR19DTURfREFURQkmIFwKLQkJCQl+Q0ZHX0NNRF9ESVNQTEFZJiBcCi0JCQkJfkNGR19DTURfRFRUCSYgXAotCQkJCX5DRkdfQ01EX0VYVDIJJiBcCi0JCQkJfkNGR19DTURfRkRDCSYgXAotCQkJCX5DRkdfQ01EX0ZET1MJJiBcCi0JCQkJfkNGR19DTURfSFdGTE9XCSYgXAotCQkJCX5DRkdfQ01EX0lERQkmIFwKLQkJCQl+Q0ZHX0NNRF9JUlEJJiBcCi0JCQkJfkNGR19DTURfSkZGUzIJJiBcCi0JCQkJfkNGR19DTURfTUlJCSYgXAotCQkJCX5DRkdfQ01EX01NQwkmIFwKLQkJCQl+Q0ZHX0NNRF9OQU5ECSYgXAotCQkJCX5DRkdfQ01EX1BDSQkmIFwKLQkJCQl+Q0ZHX0NNRF9QQ01DSUEJJiBcCi0JCQkJfkNGR19DTURfUkVJU0VSCSYgXAotCQkJCX5DRkdfQ01EX1NDU0kJJiBcCi0JCQkJfkNGR19DTURfU0VUR0VURENSICYgXAotCQkJCX5DRkdfQ01EX1NOVFAJJiBcCi0JCQkJfkNGR19DTURfU1BJCSYgXAotCQkJCX5DRkdfQ01EX1VOSVZFUlNFICYgXAotCQkJCX5DRkdfQ01EX1VTQgkmIFwKLQkJCQl+Q0ZHX0NNRF9WRkQJJiBcCi0JCQkJfkNGR19DTURfWElNRwkpCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2FsbC5oPgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjdW5kZWYgQ09ORklHX0NNRF9CU1AKKyN1bmRlZiBDT05GSUdfQ01EX0RBVEUKKyN1bmRlZiBDT05GSUdfQ01EX0RJU1BMQVkKKyN1bmRlZiBDT05GSUdfQ01EX0RUVAorI3VuZGVmIENPTkZJR19DTURfRVhUMgorI3VuZGVmIENPTkZJR19DTURfRkRDCisjdW5kZWYgQ09ORklHX0NNRF9GRE9TCisjdW5kZWYgQ09ORklHX0NNRF9IV0ZMT1cKKyN1bmRlZiBDT05GSUdfQ01EX0lERQorI3VuZGVmIENPTkZJR19DTURfSVJRCisjdW5kZWYgQ09ORklHX0NNRF9KRkZTMgorI3VuZGVmIENPTkZJR19DTURfTUlJCisjdW5kZWYgQ09ORklHX0NNRF9NRlNMCisjdW5kZWYgQ09ORklHX0NNRF9NTUMKKyN1bmRlZiBDT05GSUdfQ01EX05BTkQKKyN1bmRlZiBDT05GSUdfQ01EX1BDSQorI3VuZGVmIENPTkZJR19DTURfUENNQ0lBCisjdW5kZWYgQ09ORklHX0NNRF9SRUlTRVIKKyN1bmRlZiBDT05GSUdfQ01EX1NDU0kKKyN1bmRlZiBDT05GSUdfQ01EX1NFVEdFVERDUgorI3VuZGVmIENPTkZJR19DTURfU05UUAorI3VuZGVmIENPTkZJR19DTURfU1BJCisjdW5kZWYgQ09ORklHX0NNRF9VTklWRVJTRQorI3VuZGVmIENPTkZJR19DTURfVVNCCisjdW5kZWYgQ09ORklHX0NNRF9WRkQKKyN1bmRlZiBDT05GSUdfQ01EX1hJTUcKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMDUsNyArMjE2LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1JQWENsYXNzaWMuaCBiL2luY2x1ZGUvY29uZmlncy9SUFhDbGFzc2ljLmgKaW5kZXggNTkxMzgyYy4uNzkzYjFkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1JQWENsYXNzaWMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUlBYQ2xhc3NpYy5oCkBAIC04OCwxNSArODgsMjYgQEAKIAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICNkZWZpbmUJQ09ORklHX0NMT0NLU19JTl9NSFoJMQkvKiBjbG9ja3MgcGFzc3NlZCB0byBMaW51eCBpbiBNSHogKi8KIAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkoKENGR19DTURfQUxMICYgfkNGR19DTURfTk9OU1REKSB8IENGR19DTURfRUxGKQorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMTA0LDcgKzExNSw3IEBACiAjZGVmaW5lIENGR19SRVNFVF9BRERSRVNTCTB4ODAwMDAwMDAKICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE4Miw3ICsxOTMsNyBAQAogI2RlZmluZQlDRkdfU0RSQU1fQkFTRQkJMHgwMDAwMDAwMAogI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkweEZGMDAwMDAwCiAKLSNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkIChDT05GSUdfVklERU9fU0VEMTM4MDYpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkIChDT05GSUdfVklERU9fU0VEMTM4MDYpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9JREUpCiAjZGVmaW5lCUNGR19NT05JVE9SX0xFTgkJKDI1NiA8PCAxMCkJLyogUmVzZXJ2ZSAyNTYga0IgZm9yIE1vbml0b3IJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19NT05JVE9SX0xFTgkJKDEyOCA8PCAxMCkJLyogUmVzZXJ2ZSAxMjgga0IgZm9yIE1vbml0b3IJKi8KQEAgLTIyMiw3ICsyMzMsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUlBYbGl0ZS5oIGIvaW5jbHVkZS9jb25maWdzL1JQWGxpdGUuaAppbmRleCA0OGFkYTBlLi4zYzVlNmI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUlBYbGl0ZS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9SUFhsaXRlLmgKQEAgLTYyLDE3ICs2MiwyOCBAQAogI2RlZmluZSBDT05GSUdfQlpJUDIJCS8qIEluY2x1ZGUgc3VwcG9ydCBmb3IgYnppcDIgY29tcHJlc3NlZCBpbWFnZXMgICovCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTU0LDcgKzE2NSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9SUFhsaXRlX0RXLmggYi9pbmNsdWRlL2NvbmZpZ3MvUlBYbGl0ZV9EVy5oCmluZGV4IDMxMDI1NDcuLjg3Mjc2NWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9SUFhsaXRlX0RXLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1JQWGxpdGVfRFcuaApAQCAtMTE1LDI5ICsxMTUsMzYgQEAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KICN1bmRlZglDT05GSUdfU1RBVFVTX0xFRAkJLyogZGlzdHVyYnMgZGlzcGxheS4gU3RhdHVzIExFRCBkaXNhYmxlZC4gKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjaWYgMQkgICAgICAgLyogRW5hYmxlIHRoaXMgc3R1ZmYgY291bGQgbWFrZSBpbWFnZSBlbmxhcmdlIGFib3V0IDI1S0IuIE1hc2sgaXQgaWYgeW91CiAJCSAgZG9uJ3Qgd2FudCB0aGUgYWR2YW5jZWQgZnVuY3Rpb24gKi8KIAorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisKICNpZmRlZglDT05GSUdfU1BMQVNIX1NDUkVFTgotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0JNUAl8IFwKLQkJCQlDRkdfQ01EX0pGRlMyCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX1JFR0lORk8gfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCSkKLSNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfSkZGUzIJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTyB8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJKQotI2VuZGlmCS8qIENPTkZJR19TUExBU0hfU0NSRUVOICovCisjZGVmaW5lIENPTkZJR19DTURfQk1QCisjZW5kaWYKKwogCiAvKiB0ZXN0LW9ubHkgKi8KICNkZWZpbmUgQ0ZHX0pGRlMyX0ZJUlNUX0JBTksJMAkgICAgLyogdXNlIGZvciBKRkZTMiAqLwpAQCAtMTQ3LDE2ICsxNTQsMTMgQEAKIAogI2VuZGlmCS8qIDEgKi8KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSJ1LWJvb3Q+IgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjAwLDcgKzIwNCw3IEBACiAjZGVmaW5lIENGR19TRFJBTV9CQVNFCQkweDAwMDAwMDAwCiAjZGVmaW5lIENGR19GTEFTSF9CQVNFCQkweEZGMDAwMDAwCiAKLSNpZiBkZWZpbmVkKERFQlVHKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCisjaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChDT05GSUdfQ01EX0lERSkKICNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOCQkoMjU2IDw8IDEwKQkvKiBSZXNlcnZlIDI1NiBrQiBmb3IgTW9uaXRvcgkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOCQkoMTI4IDw8IDEwKQkvKiBSZXNlcnZlIDEyOCBrQiBmb3IgTW9uaXRvciAqLwpAQCAtMjM5LDcgKzI0Myw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9SUFhzdXBlci5oIGIvaW5jbHVkZS9jb25maWdzL1JQWHN1cGVyLmgKaW5kZXggNDU5MDdhYS4uZGZhZGQyYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1JQWHN1cGVyLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1JQWHN1cGVyLmgKQEAgLTkxLDggKzkxLDcgQEAKICAqIGZvciBGQ0MpCiAgKgogICogaWYgQ09ORklHX0VUSEVSX05PTkUgaXMgZGVmaW5lZCwgdGhlbiBlaXRoZXIgdGhlIGV0aGVybmV0IHJvdXRpbmVzIG11c3QgYmUKLSAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDRkdfQ01EX05FVCBtdXN0IGJlIHJlbW92ZWQKLSAqIGZyb20gQ09ORklHX0NPTU1BTkRTIHRvIHJlbW92ZSBzdXBwb3J0IGZvciBuZXR3b3JraW5nLgorICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUIG11c3QgYmUgdW5zZXQuCiAgKi8KICN1bmRlZiAgQ09ORklHX0VUSEVSX09OX1NDQyAgICAgICAgICAgLyogZGVmaW5lIGlmIGV0aGVybmV0IG9uIFNDQyAgICAqLwogI2RlZmluZSBDT05GSUdfRVRIRVJfT05fRkNDICAgICAgICAgICAvKiBkZWZpbmUgaWYgZXRoZXJuZXQgb24gRkNDICAgICovCkBAIC0xNTAsMTMgKzE0OSwyOCBAQAogLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAgICAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUICAgICAgICAgICAgICAiPT4gIgogCi0vKiBXaGF0IFUtQm9vdCBzdWJzeXRlbXMgZG8geW91IHdhbnQgZW5hYmxlZD8gKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgICAgKCBDT05GSUdfQ01EX0RGTCB8IFwKLQkJCQkgIENGR19DTURfSU1NQVAgIHwgXAotCQkJCSAgQ0ZHX0NNRF9BU0tFTlYgfCBcCi0JCQkJICBDRkdfQ01EX0kyQyAgICB8IFwKLQkJCQkgIENGR19DTURfUkVHSU5GTyAmIFwKLQkJCQkgfkNGR19DTURfS0dEQiApCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9JTU1BUAorI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKworI3VuZGVmIENPTkZJR19DTURfS0dEQgorCiAKIC8qIFdoZXJlIGRvIHRoZSBpbnRlcm5hbCByZWdpc3RlcnMgbGl2ZT8gKi8KICNkZWZpbmUgQ0ZHX0lNTVIgICAgICAgICAgICAgICAweEYwMDAwMDAwCkBAIC0xNzYsMTMgKzE5MCwxMCBAQAogCiAjZGVmaW5lIENPTkZJR19CT0FSRF9FQVJMWV9JTklUX0YgMQkvKiBDYWxsIGJvYXJkX2Vhcmx5X2luaXRfZgkqLwogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQlNJWkUgICAgICAgICAgICAgIDEwMjQgICAgICAgLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICAgICAqLwogI2Vsc2UKICMgIGRlZmluZSBDRkdfQ0JTSVpFICAgICAgICAgICAgICAyNTYgICAgICAgIC8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAgICAgKi8KQEAgLTMxMCw3ICszMjEsNyBAQAogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRSAgICAgIDMyICAgICAgLyogRm9yIE1QQzgyNjAgQ1BVICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQgICAgIDUgICAgIC8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1JSdmlzaW9uLmggYi9pbmNsdWRlL2NvbmZpZ3MvUlJ2aXNpb24uaAppbmRleCAzODg1YmNkLi4xZTZlOGMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUlJ2aXNpb24uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvUlJ2aXNpb24uaApAQCAtOTIsNyArOTIsMTUgQEAKIAogI3VuZGVmCUNPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCkBAIC0xMzUsMjMgKzE0MywyNiBAQAogI2VuZGlmCS8qIENPTkZJR19TT0ZUX0kyQyAqLwogCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAoICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfREFURQkpICYgXAotCQkJICAgICB+KCBDRkdfQ01EX1BDTUNJQSAgfCBcCi0JCQkgICAgICAgIENGR19DTURfSURFCSkgKQorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfREFURQorCisjdW5kZWYgQ09ORklHX0NNRF9QQ01DSUEKKyN1bmRlZiBDT05GSUdfQ01EX0lERQorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIyOCw3ICsyMzksNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvUmF0dGxlci5oIGIvaW5jbHVkZS9jb25maWdzL1JhdHRsZXIuaAppbmRleCBkYmM1N2U4Li5kNzY1MmZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvUmF0dGxlci5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9SYXR0bGVyLmgKQEAgLTYyLDggKzYyLDggQEAKICAqIFNDQywgMS0zIGZvciBGQ0MpCiAgKgogICogSWYgQ09ORklHX0VUSEVSX05PTkUgaXMgZGVmaW5lZCwgdGhlbiBlaXRoZXIgdGhlIGV0aGVybmV0IHJvdXRpbmVzCi0gKiBtdXN0IGJlIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDRkdfQ01EX05FVCBtdXN0Ci0gKiBiZSByZW1vdmVkIGZyb20gQ09ORklHX0NPTU1BTkRTIHRvIHJlbW92ZSBzdXBwb3J0IGZvciBuZXR3b3JraW5nLgorICogbXVzdCBiZSBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ09ORklHX0NNRF9ORVQKKyAqIG11c3QgYmUgdW5zZXQuCiAgKi8KICN1bmRlZglDT05GSUdfRVRIRVJfT05fU0NDCQkvKiBFdGhlcm5ldCBpcyBub3Qgb24gU0NDICovCiAjZGVmaW5lIENPTkZJR19FVEhFUl9PTl9GQ0MJCS8qIEV0aGVybmV0IGlzIG9uIEZDQyAgICAgKi8KQEAgLTEyNSwyMiArMTI1LDMzIEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkzODQwMAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMICAgXAotCQkJCXwgQ0ZHX0NNRF9ESENQICAgIFwKLQkJCQl8IENGR19DTURfSU1NQVAgICBcCi0JCQkJfCBDRkdfQ01EX0pGRlMyICAgXAotCQkJCXwgQ0ZHX0NNRF9NSUkgICAgIFwKLQkJCQl8IENGR19DTURfUElORyAgICBcCi0JCQkJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0lNTUFQCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUJLyogYXV0b2Jvb3QgYWZ0ZXIgNSBzZWNvbmRzICovCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdG0gRkUwNDAwMDAiCS8qIGF1dG9ib290IGNvbW1hbmQgKi8KICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTCQkicm9vdD0vZGV2L210ZGJsb2NrMiBydyBtdGRwYXJ0cz1waHlzOjFNKFJPTSlybywtKHJvb3QpIgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICN1bmRlZglDT05GSUdfS0dEQl9PTl9TTUMJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIFNNQyAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9PTl9TQ0MJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIFNDQyAqLwogI3VuZGVmCUNPTkZJR19LR0RCX05PTkUJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIHNvbWV0aGluZyBlbHNlICovCkBAIC0xNTgsNyArMTY5LDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtMTg0LDcgKzE5NSw3IEBACiAKICNkZWZpbmUJQ0ZHX0RJUkVDVF9GTEFTSF9URlRQCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSkZGUzIpCiAjZGVmaW5lIENGR19KRkZTMl9OVU1fQkFOS1MJQ0ZHX01BWF9GTEFTSF9CQU5LUwogI2RlZmluZSBDRkdfSkZGUzJfU09SVF9GUkFHTUVOVFMKIApAQCAtMjA1LDcgKzIxNiw3IEBACiAjZGVmaW5lIE1URElEU19ERUZBVUxUCQkibm9yMD1yYXR0bGVyLTAiCiAjZGVmaW5lIE1URFBBUlRTX0RFRkFVTFQJIm10ZHBhcnRzPXJhdHRsZXItMDotQDFtKGpmZnMyKSIKICovCi0jZW5kaWYgLyogQ0ZHX0NNRF9KRkZTMiAqLworI2VuZGlmIC8qIENPTkZJR19DTURfSkZGUzIgKi8KIAogI2RlZmluZSBDRkdfTU9OSVRPUl9CQVNFCVRFWFRfQkFTRQogI2lmIChDRkdfTU9OSVRPUl9CQVNFIDwgQ0ZHX0ZMQVNIX0JBU0UpCkBAIC0yNTYsNyArMjY3LDcgQEAKICNkZWZpbmUgQ0ZHX0JPT1RNQVBTWgkJKDggPDwgMjApCS8qIEluaXRpYWwgTWVtb3J5IG1hcCBmb3IgTGludXggKi8KIAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyNjAgQ1BVcyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1NCQzg1NDAuaCBiL2luY2x1ZGUvY29uZmlncy9TQkM4NTQwLmgKaW5kZXggZjhlMzM5Ny4uZjJjMzY5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1NCQzg1NDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvU0JDODU0MC5oCkBAIC0zMzgsMjggKzMzOCwzNyBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLwogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UJKi8KIAotI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpIHx8IGRlZmluZWQoQ09ORklHX1JBTV9BU19GTEFTSCkKLSAgI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUENJIHwgXAotCQkJCUNGR19DTURfUElORyB8IENGR19DTURfSTJDKSAmIFwKLQkJCQkgfihDRkdfQ01EX0VOViB8IFwKLQkJCQkgIENGR19DTURfTE9BRFMgKSkKLSAgI2VsaWYgKGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkgfHwgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkNDKSkKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfTUlJIHwgXAotCQkJCUNGR19DTURfUElORyB8IENGR19DTURfSTJDKSAmIFwKLQkJCQl+KENGR19DTURfRU5WKSkKLSAgI2VuZGlmCi0jZWxzZQotICAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotICAgICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BDSSB8IFwKLQkJCQlDRkdfQ01EX1BJTkcgfCBDRkdfQ01EX0kyQykKLSAgI2VsaWYgKGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkgfHwgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkNDKSkKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9NSUkgfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HIHwgQ0ZHX0NNRF9JMkMpCi0gICNlbmRpZgorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0kyQworCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKICNlbmRpZgogCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjaWYgZGVmaW5lZChDT05GSUdfVFNFQ19FTkVUKSB8fCBkZWZpbmVkKENPTkZJR19FVEhFUl9PTl9GQ0MpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENGR19SQU1CT09UKQorICAgICN1bmRlZiBDT05GSUdfQ01EX0VOVgorICAgICN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjZW5kaWYKKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTM2OCw3ICszNzcsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSJTQkM4NTQwPT4gIiAvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICAgI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogICAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMzg5LDcgKzM5OCw3IEBACiAvKiBDYWNoZSBDb25maWd1cmF0aW9uICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMzI3NjgKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICAgI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCkBAIC00MDEsNyArNDEwLDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAgICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAgICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9TQ00uaCBiL2luY2x1ZGUvY29uZmlncy9TQ00uaAppbmRleCBlMjYzZGI2Li5mOTAwOTY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvU0NNLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1NDTS5oCkBAIC0xMzMsOCArMTMzLDcgQEAKICAqIGZvciBGQ0MpCiAgKgogICogaWYgQ09ORklHX0VUSEVSX05PTkUgaXMgZGVmaW5lZCwgdGhlbiBlaXRoZXIgdGhlIGV0aGVybmV0IHJvdXRpbmVzIG11c3QgYmUKLSAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDRkdfQ01EX05FVCBtdXN0IGJlIHJlbW92ZWQKLSAqIGZyb20gQ09ORklHX0NPTU1BTkRTIHRvIHJlbW92ZSBzdXBwb3J0IGZvciBuZXR3b3JraW5nLgorICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUIG11c3QgYmUgdW5zZXQuCiAgKgogICogKE9uIFRRTTgyNjAgZWl0aGVyIFNDQzEgb3IgRkNDMiBtYXkgYmUgY2hvc2VuOiBTQ0MxIGlzIGhhcmR3aXJlZCB0byB0aGUKICAqIFguMjkgY29ubmVjdG9yLCBhbmQgRkNDMiBpcyBoYXJkd2lyZWQgdG8gdGhlIFguMSBjb25uZWN0b3IpCkBAIC0xOTEsMjMgKzE5MCwzMyBAQAogCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUfENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMIHwgXAotCQkJCSBDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJIENGR19DTURfSTJDCXwgXAotCQkJCSBDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQkgQ0ZHX0NNRF9CU1ApCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0JTUAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTM1Myw3ICszNjIsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRSAgICAgIDMyICAgICAgLyogRm9yIE1QQzgyNjAgQ1BVICAgICAgICAgICAgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvU0w4MjQ1LmggYi9pbmNsdWRlL2NvbmZpZ3MvU0w4MjQ1LmgKaW5kZXggNjE4OTZkMC4uNGQ5ZDQxYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1NMODI0NS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9TTDgyNDUuaApAQCAtNTMsMTEgKzUzLDIyIEBACiAKICNkZWZpbmUJQ09ORklHX1RJTUVTVEFNUAkJLyogUHJpbnQgaW1hZ2UgaW5mbyB3aXRoIHRpbWVzdGFtcCAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QQ0kpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgCSovCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUENJCiAKIAogLyoKQEAgLTI1NSw3ICsyNjYsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1NNODUwLmggYi9pbmNsdWRlL2NvbmZpZ3MvU004NTAuaAppbmRleCA0OTc3NjI5Li40MWE1NGYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvU004NTAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvU004NTAuaApAQCAtNjgsMjMgKzY4LDM0IEBACiAKICN1bmRlZglDT05GSUdfQ0FOX0RSSVZFUgkJLyogQ0FOIERyaXZlciBzdXBwb3J0IGRpc2FibGVkCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfUlRDX01QQzh4eAkJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHgJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJICBDRkdfQ01EX0RIQ1AJCXwgXAotCQkJCSAgQ0ZHX0NNRF9EQVRFCQkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikgJiYgZGVmaW5lZChLR0RCX0RFQlVHKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKSAmJiBkZWZpbmVkKEtHREJfREVCVUcpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTY3LDcgKzE3OCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9TTU40Mi5oIGIvaW5jbHVkZS9jb25maWdzL1NNTjQyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVkM2Q2OQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29uZmlncy9TTU40Mi5oCkBAIC0wLDAgKzEsMjA2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA3CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIENvbmZpZ3VhdGlvbiBzZXR0aW5ncyBmb3IgdGhlIFNNTjQyIGJvYXJkIGZyb20gU2llbWVucy4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisvKgorICogSWYgd2UgYXJlIGRldmVsb3BpbmcsIHdlIG1pZ2h0IHdhbnQgdG8gc3RhcnQgdS1ib290IGZyb20gcmFtCisgKiBzbyB3ZSBNVVNUIE5PVCBpbml0aWFsaXplIGNyaXRpY2FsIHJlZ3MgbGlrZSBtZW0tdGltaW5nIC4uLgorICovCisjdW5kZWYgQ09ORklHX0lOSVRfQ1JJVElDQUwJCS8qIHVuZGVmIGZvciBkZXZlbG9waW5nICovCisKKyN1bmRlZiBDT05GSUdfU0tJUF9MT1dMRVZFTF9JTklUCisjdW5kZWYgQ09ORklHX1NLSVBfUkVMT0NBVEVfVUJPT1QKKworLyoKKyAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCisgKiAoZWFzeSB0byBjaGFuZ2UpCisgKi8KKyNkZWZpbmUgQ09ORklHX0FSTTcJCTEJLyogVGhpcyBpcyBhIEFSTTcgQ1BVCSovCisjZGVmaW5lIENPTkZJR19BUk1fVEhVTUIJMQkvKiB0aGlzIGlzIGFuIEFSTTcyMFRETUkgKi8KKyNkZWZpbmUgQ09ORklHX0xQQzIyOTIKKyN1bmRlZglDT05GSUdfQVJNN19SRVZECQkvKiBkaXNhYmxlIEFSTTcyMCBSRVYuRCBXb3JrYXJvdW5kcyAqLworCisjdW5kZWYgQ09ORklHX1VTRV9JUlEJCQkvKiBkb24ndCBuZWVkIHRoZW0gYW55bW9yZSAqLworCisvKgorICogU2l6ZSBvZiBtYWxsb2MoKSBwb29sCisgKi8KKyNkZWZpbmUgQ0ZHX01BTExPQ19MRU4JCShDRkdfRU5WX1NJWkUgKyAxMjgqMTAyNCkKKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX1NJWkUJMTI4CS8qIHNpemUgaW4gYnl0ZXMgcmVzZXJ2ZWQgZm9yIGluaXRpYWwgZGF0YSAqLworCisvKgorICogSGFyZHdhcmUgZHJpdmVycworICovCisKKy8qCisgKiBzZWxlY3Qgc2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19TRVJJQUwxCQkxCS8qIHdlIHVzZSBTZXJpYWwgbGluZSAxICovCisKKy8qIGFsbG93IHRvIG92ZXJ3cml0ZSBzZXJpYWwgYW5kIGV0aGFkZHIgKi8KKyNkZWZpbmUgQ09ORklHX0VOVl9PVkVSV1JJVEUKKworI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCisKKy8qIGVuYWJsZSBJMkMgYW5kIHNlbGVjdCB0aGUgaGFyZHdhcmUvc29mdHdhcmUgZHJpdmVyICovCisjdW5kZWYJQ09ORklHX0hBUkRfSTJDCQkJLyogSTJDIHdpdGggaGFyZHdhcmUgc3VwcG9ydAkqLworI2RlZmluZSBDT05GSUdfU09GVF9JMkMJCTEJLyogSTJDIGJpdC1iYW5nZWQJCSovCisvKiB0aGlzIHdvdWxkIGJlIDB4QUUgaWYgRTAsIEUxIGFuZCBFMiB3ZXJlIHB1bGxlZCBoaWdoICovCisjZGVmaW5lIENGR19JMkNfU0xBVkUJCTB4QTAKKyNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUgkoMHhBMCA+PiAxKQorI2RlZmluZSBDRkdfSTJDX0VFUFJPTV9BRERSX0xFTiAyIC8qIDE2IGJpdCBhZGRyZXNzICovCisjZGVmaW5lIENGR19FRVBST01fUEFHRV9XUklURV9CSVRTIDYgLyogNjQgYnl0ZXMgcGVyIHdyaXRlICovCisjZGVmaW5lIENGR19FRVBST01fUEFHRV9XUklURV9ERUxBWV9NUyAyMAorLyogbm90IHVzZWQgYnV0IHJlcXVpcmVkIGJ5IGRldmljZXMuYyAqLworI2RlZmluZSBDRkdfSTJDX1NQRUVEIDEwMDAwCisKKyNpZmRlZiBDT05GSUdfU09GVF9JMkMKKy8qCisgKiBTb2Z0d2FyZSAoYml0LWJhbmcpIEkyQyBkcml2ZXIgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIFNDTAkJMHgwMDAwMDAwNAkJLyogUDAuMiAqLworI2RlZmluZSBTREEJCTB4MDAwMDAwMDgJCS8qIFAwLjMgKi8KKworI2RlZmluZQlJMkNfUkVBRAkoKEdFVDMyKElPMFBJTikgJiBTREEpID8gMSA6IDApCisjZGVmaW5lCUkyQ19TREEoeCkJeyBpZiAoeCkgUFVUMzIoSU8wU0VULCBTREEpOyBlbHNlIFBVVDMyKElPMENMUiwgU0RBKTsgfQorI2RlZmluZQlJMkNfU0NMKHgpCXsgaWYgKHgpIFBVVDMyKElPMFNFVCwgU0NMKTsgZWxzZSBQVVQzMihJTzBDTFIsIFNDTCk7IH0KKyNkZWZpbmUJSTJDX0RFTEFZCXsgdWRlbGF5KDEwMCk7IH0KKyNkZWZpbmUJSTJDX0FDVElWRQl7IHVuc2lnbmVkIGludCBpMmN0bXA7IFwKKwkJCQkJICBpMmN0bXAgPSBHRVQzMihJTzBESVIpOyBcCisJCQkJCSAgaTJjdG1wIHw9IFNEQTsgXAorCQkJCQkgIFBVVDMyKElPMERJUiwgaTJjdG1wKTsgfQorI2RlZmluZQlJMkNfVFJJU1RBVEUJeyB1bnNpZ25lZCBpbnQgaTJjdG1wOyBcCisJCQkJCSAgICAgIGkyY3RtcCA9IEdFVDMyKElPMERJUik7IFwKKwkJCQkJICAgICAgaTJjdG1wICY9IH5TREE7IFwKKwkJCQkJCSAgUFVUMzIoSU8wRElSLCBpMmN0bXApOyB9CisjZW5kaWYgLyogQ09ORklHX1NPRlRfSTJDICovCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX01NQworI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKworCisjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCisKKyNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLworI2RlZmluZQlDRkdfUFJPTVBUCQkiU01ONDIgIyAiIC8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KKyNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLworI2RlZmluZQlDRkdfUEJTSVpFIChDRkdfQ0JTSVpFK3NpemVvZihDRkdfUFJPTVBUKSsxNikgLyogUHJpbnQgQnVmZmVyIFNpemUgKi8KKyNkZWZpbmUJQ0ZHX01BWEFSR1MJCTE2CQkvKiBtYXggbnVtYmVyIG9mIGNvbW1hbmQgYXJncwkqLworI2RlZmluZSBDRkdfQkFSR1NJWkUJCUNGR19DQlNJWkUJLyogQm9vdCBBcmd1bWVudCBCdWZmZXIgU2l6ZQkqLworCisjZGVmaW5lIENGR19NRU1URVNUX1NUQVJUCTB4ODE4MDAwMDAJLyogbWVtdGVzdCB3b3JrcyBvbgkqLworI2RlZmluZSBDRkdfTUVNVEVTVF9FTkQJCTB4ODMwMDAwMDAJLyogMjQgTUIgaW4gU1JBTQkqLworCisjdW5kZWYJQ0ZHX0NMS1NfSU5fSFoJCS8qIGV2ZXJ5dGhpbmcsIGluY2wgYm9hcmQgaW5mbywgaW4gSHogKi8KKworI2RlZmluZQlDRkdfTE9BRF9BRERSCQkweDgxMDAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzCSovCisJCQkJCQkvKiBmb3IgdUNsaW51eCBpbWcgaXMgaGVyZSovCisKKyNkZWZpbmUgQ0ZHX1NZU19DTEtfRlJFUQk1ODk4MjQwMAkvKiBIeiAqLworI2RlZmluZQlDRkdfSFoJCQkyMDQ4CQkvKiBkZWNyZW1lbnRlciBmcmVxIGluIEh6ICovCisKKwkJCQkJCS8qIHZhbGlkIGJhdWRyYXRlcyAqLworI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGFjayBzaXplcworICoKKyAqIFRoZSBzdGFjayBzaXplcyBhcmUgc2V0IHVwIGluIHN0YXJ0LlMgdXNpbmcgdGhlIHNldHRpbmdzIGJlbG93CisgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRQkoMTI4KjEwMjQpCS8qIHJlZ3VsYXIgc3RhY2sgKi8KKyNpZmRlZiBDT05GSUdfVVNFX0lSUQorI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFX0lSUQkoNCoxMDI0KQkvKiBJUlEgc3RhY2sgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRV9GSVEJKDQqMTAyNCkJLyogRklRIHN0YWNrICovCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUGh5c2ljYWwgTWVtb3J5IE1hcAorICovCisjZGVmaW5lIENPTkZJR19OUl9EUkFNX0JBTktTCTEJICAgLyogd2UgaGF2ZSAxIGJhbmsgb2YgU1JBTSAqLworI2RlZmluZSBQSFlTX1NEUkFNXzEJCTB4ODEwMDAwMDAgLyogU1JBTSBCYW5rICMxICovCisjZGVmaW5lIFBIWVNfU0RSQU1fMV9TSVpFCTB4MDIwMDAwMDAgLyogMzIgTUIgU1JBTSAqLworCisvKiBUaGlzIGlzIHRoZSBleHRlcm5hbCBmbGFzaCAqLworI2RlZmluZSBQSFlTX0ZMQVNIXzEJCTB4ODAwMDAwMDAgLyogRmxhc2ggQmFuayAjMSAqLworI2RlZmluZSBQSFlTX0ZMQVNIX1NJWkUJCTB4MDEwMDAwMDAgLyogMTYgTUIgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRkxBU0ggYW5kIGVudmlyb25tZW50IG9yZ2FuaXphdGlvbgorICovCisKKy8qCisgKiBUaGUgZmlyc3QgZW50cnkgaW4gQ0ZHX0ZMQVNIX0JBTktTX0xJU1QgaXMgYSBkdW1teSwgYnV0IGl0IG11c3QgYmUgcHJlc2VudC4KKyAqLworI2RlZmluZSBDRkdfRkxBU0hfQkFOS1NfTElTVAl7IDAsIFBIWVNfRkxBU0hfMSB9CisjZGVmaW5lIENGR19GTEFTSF9BRERSMAkJCTB4NTU1CisjZGVmaW5lIENGR19GTEFTSF9BRERSMQkJCTB4MkFBCisjZGVmaW5lIENGR19GTEFTSF9FUkFTRV9UT1VUCTE2Mzg0CS8qIFRpbWVvdXQgZm9yIEZsYXNoIEVyYXNlIChpbiBtcykgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX1dSSVRFX1RPVVQJNQkvKiBUaW1lb3V0IGZvciBGbGFzaCBXcml0ZSAoaW4gbXMpICovCisKKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9TRUNUCTEyOCAgLyogbWF4IG51bWJlciBvZiBzZWN0b3JzIG9uIG9uZSBjaGlwICAgICovCisKKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9CQU5LUwkyCS8qIG1heCBudW1iZXIgb2YgbWVtb3J5IGJhbmtzCQkqLworCisjZGVmaW5lCUNGR19FTlZfSVNfSU5fRkxBU0gJMQorLyogVGhlIEVudmlyb25tZW50IFNlY3RvciBpcyBpbiB0aGUgQ1BVLWludGVybmFsIGZsYXNoICovCisjZGVmaW5lIENGR19GTEFTSF9CQVNFCQkwCisjZGVmaW5lIENGR19FTlZfT0ZGU0VUCQkweDNDMDAwCisjZGVmaW5lIENGR19FTlZfQUREUgkJKENGR19GTEFTSF9CQVNFICsgQ0ZHX0VOVl9PRkZTRVQpCisjZGVmaW5lIENGR19FTlZfU0laRQkJMHgyMDAwIC8qIFRvdGFsIFNpemUgb2YgRW52aXJvbm1lbnQgU2VjdG9yCSovCisKKyNkZWZpbmUgQ09ORklHX0NNRExJTkVfVEFHCisjZGVmaW5lIENPTkZJR19TRVRVUF9NRU1PUllfVEFHUworI2RlZmluZSBDT05GSUdfSU5JVFJEX1RBRworI2RlZmluZSBDT05GSUdfTU1DCQkJMQorLyogd2UgdXNlIHRoaXMgZXRoZXJuZXQgY2hpcCAqLworI2RlZmluZSBDT05GSUdfRU5DMjhKNjAKKworI2VuZGlmCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9TUEQ4MjNUUy5oIGIvaW5jbHVkZS9jb25maWdzL1NQRDgyM1RTLmgKaW5kZXggYWU0ZGNjMi4uMzk1YzdhMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1NQRDgyM1RTLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1NQRDgyM1RTLmgKQEAgLTU5LDE1ICs1OSwyOSBAQAogCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTIFwKLSgoQ09ORklHX0NNRF9ERkwgJiB+KENGR19DTURfRkxBU0gpKSB8IENGR19DTURfSURFKSAvKiBubyBGbGFzaCwgYnV0IElERSAqLworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0lERQorCisjdW5kZWYgQ09ORklHX0NNRF9GTEFTSAorCisKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2RlZmluZSBDT05GSUdfRVRIQUREUgkJMDA6RDA6OTM6MDA6MDE6Q0IKQEAgLTgyLDcgKzk2LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTYwLDcgKzE3NCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9TWDEuaCBiL2luY2x1ZGUvY29uZmlncy9TWDEuaAppbmRleCA2ZWQ5OGI4Li4wNWNlZjg3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvU1gxLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1NYMS5oCkBAIC05MywxMiArOTMsMjYgQEAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKICNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwIH0KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSgoIENPTkZJR19DTURfREZMIHwgXAotCQkJCSAgIENGR19DTURfSTJDICkgJiBcCi0JCQkJICB+Q0ZHX0NNRF9ORVQpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKworI3VuZGVmIENPTkZJR19DTURfTkVUCisKKwogI2luY2x1ZGUgPGNvbmZpZ3Mvb21hcDE1MTAuaD4KIAogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MJCSJtZW09MTZNIGNvbnNvbGU9dHR5UzAsMTE1MjAwbjggcm9vdD0vZGV2L210ZGJsb2NrMyBydyIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9TWE5JODU1VC5oIGIvaW5jbHVkZS9jb25maWdzL1NYTkk4NTVULmgKaW5kZXggYTg0NTRkOS4uOGYyYTVlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1NYTkk4NTVULmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1NYTkk4NTVULmgKQEAgLTE0NiwxNCArMTQ2LDI2IEBACiAKICNkZWZpbmUgQ0ZHX0RJU0NPVkVSX1BIWQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMCQl8IFwKLQkJCQkgQ0ZHX0NNRF9FRVBST00JCXwgXAotCQkJCSBDRkdfQ01EX0pGRlMyCQl8IFwKLQkJCQkgQ0ZHX0NNRF9OQU5ECQl8IFwKLQkJCQkgQ0ZHX0NNRF9EQVRFKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECisjZGVmaW5lIENPTkZJR19DTURfREFURQorCiAKICNkZWZpbmUgQ0ZHX0pGRlMyX1NPUlRfRlJBR01FTlRTCiAKQEAgLTIyNiw3ICsyMzgsNyBAQAogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgYSBsaXR0bGUgbWVtb3J5ICovCiAjZGVmaW5lCUNGR19QUk9NUFQJCSI9PiIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMzA5LDcgKzMyMSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9TYW5kcG9pbnQ4MjQwLmggYi9pbmNsdWRlL2NvbmZpZ3MvU2FuZHBvaW50ODI0MC5oCmluZGV4IGY0MzM5ZWMuLjViYmUzYzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9TYW5kcG9pbnQ4MjQwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1NhbmRwb2ludDgyNDAuaApAQCAtODAsMTggKzgwLDMwIEBACiAJIiIKICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJydW4gZmxhc2hfc2VsZiIKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9TRFJBTQl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpCSovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKICNkZWZpbmUgQ09ORklHX0RSQU1fU1BFRUQJMTAwCQkvKiBNSHoJCQkJKi8KIApAQCAtMzg0LDcgKzM5Niw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM4MjQwIENQVQkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvU2FuZHBvaW50ODI0NS5oIGIvaW5jbHVkZS9jb25maWdzL1NhbmRwb2ludDgyNDUuaAppbmRleCBkNDJiZDY5Li5hMDg0NTFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvU2FuZHBvaW50ODI0NS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9TYW5kcG9pbnQ4MjQ1LmgKQEAgLTUxLDE3ICs1MSwyOCBAQAogCiAjZGVmaW5lCUNPTkZJR19USU1FU1RBTVAJCS8qIFByaW50IGltYWdlIGluZm8gd2l0aCB0aW1lc3RhbXAgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KQkqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCiAKIAogLyoKQEAgLTM2Myw3ICszNzQsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODI0MCBDUFUJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1RBU1JFRy5oIGIvaW5jbHVkZS9jb25maWdzL1RBU1JFRy5oCmluZGV4IDExOWJjMjQuLjJiMmFlMDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9UQVNSRUcuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvVEFTUkVHLmgKQEAgLTUwLDIwICs1MCwzNCBAQAogCiAjdW5kZWYgQ09ORklHX01PTklUT1JfSVNfSU5fUkFNCSAgICAgICAgICAgICAgLyogbm8gcHJlLWxvYWRlciByZXF1aXJlZCEhISA7LSkgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKChDT05GSUdfQ01EX0RGTCAgICAgICAgfCAgICBcCi0JCQkJQ0ZHX0NNRF9CU1AgICAgICAgICAgIHwgICAgXAotCQkJCUNGR19DTURfRUVQUk9NICAgICAgICB8ICAgIFwKLQkJCQlDRkdfQ01EX0kyQyAgICAgICAgICAgICkgJiBcCi0JCQkgICAgICAgfihDRkdfQ01EX05FVCkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKworI3VuZGVmIENPTkZJR19DTURfTkVUCisKKwogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKIAogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1RCNTIwMC5oIGIvaW5jbHVkZS9jb25maWdzL1RCNTIwMC5oCmluZGV4IGI0MmNmYjYuLjFjNmE5YWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9UQjUyMDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvVEI1MjAwLmgKQEAgLTQyLDExICs0Miw2IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290CSAgICAgKi8KIAotI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCi0jZW5kaWYKLQogLyoKICAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KICAqLwpAQCAtNzIsMTIgKzY3LDYgQEAKICNkZWZpbmUgQ0ZHX0NPTlNPTEVfSVNfSU5fRU5WCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19WSURFTwotI2RlZmluZSBBRERfQk1QX0NNRAkJQ0ZHX0NNRF9CTVAKLSNlbHNlCi0jZGVmaW5lIEFERF9CTVBfQ01ECQkwCi0jZW5kaWYKLQogLyogUGFydGl0aW9ucyAqLwogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgpAQCAtODUsNyArNzQsNiBAQAogCiAvKiBVU0IgKi8KICNkZWZpbmUgQ09ORklHX1VTQl9PSENJCi0jZGVmaW5lIEFERF9VU0JfQ01ECQlDRkdfQ01EX1VTQiB8IENGR19DTURfRkFUCiAjZGVmaW5lIENPTkZJR19VU0JfU1RPUkFHRQogCiAvKiBQT1NUIHN1cHBvcnQgKi8KQEAgLTk0LDQxICs4Miw1MSBAQAogCQkJCSBDRkdfUE9TVF9JMkMpCiAKICNpZmRlZiBDT05GSUdfUE9TVAotI2RlZmluZSBDRkdfQ01EX1BPU1RfRElBRyBDRkdfQ01EX0RJQUcKIC8qIHByZXNlcnZlIHNwYWNlIGZvciB0aGUgcG9zdF93b3JkIGF0IGVuZCBvZiBvbi1jaGlwIFNSQU0gKi8KICNkZWZpbmUgTVBDNVhYWF9TUkFNX1BPU1RfU0laRSBNUEM1WFhYX1NSQU1fU0laRS00Ci0jZWxzZQotI2RlZmluZSBDRkdfQ01EX1BPU1RfRElBRyAwCiAjZW5kaWYKIAotLyogSURFICovCi0jZGVmaW5lIEFERF9JREVfQ01ECQkoQ0ZHX0NNRF9JREUgfCBDRkdfQ01EX0ZBVCB8IENGR19DTURfRVhUMikKIAogLyoKLSAqIFN1cHBvcnRlZCBjb21tYW5kcworICogQk9PVFAgb3B0aW9ucwogICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUFERF9CTVBfQ01ECXwgXAotCQkJCUFERF9JREVfQ01ECXwgXAotCQkJCUFERF9QQ0lfQ01ECXwgXAotCQkJCUFERF9VU0JfQ01ECXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FQ0hPCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSkZGUzIJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUE9TVF9ESUFHIHwgXAotCQkJCUNGR19DTURfUkVHSU5GTyB8IFwKLQkJCQlDRkdfQ01EX1NOVFAJfCBcCi0JCQkJQ0ZHX0NNRF9CU1ApCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FQ0hPCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRVhUMgorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfVVNCCisKKyNpZmRlZiBDT05GSUdfVklERU8KKyNkZWZpbmUgQ09ORklHX0NNRF9CTVAKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BPU1QKKyNkZWZpbmUgQ09ORklHX19DTURfRElBRworI2VuZGlmCisKIAogI2RlZmluZQlDT05GSUdfVElNRVNUQU1QCQkvKiBkaXNwbGF5IGltYWdlIHRpbWVzdGFtcHMgKi8KIApAQCAtMjA3LDcgKzIwNSw3IEBACiAgKiBQQ0kgQnVzIGNsb2NraW5nIGNvbmZpZ3VyYXRpb24KICAqCiAgKiBBY3R1YWxseSBhIFBDSSBDbG9jayBvZiA2NiBNSHogaXMgb25seSBzZXQgKGluIGNwdV9pbml0LmMpIGlmCi0gKiBDRkdfSVBCQ0xLX0VRVUFMU19YTEJDTEsgaXMgZGVmaW5lZC4gVGhpcyBpcyBiZWNhdXNlIGEgUENJIENsb2NrIAorICogQ0ZHX0lQQkNMS19FUVVBTFNfWExCQ0xLIGlzIGRlZmluZWQuIFRoaXMgaXMgYmVjYXVzZSBhIFBDSSBDbG9jawogICogb2YgNjYgTUh6IHlldCBoYXNuJ3QgYmVlbiB0ZXN0ZWQgd2l0aCBhIElQQiBCdXMgQ2xvY2sgb2YgNjYgTUh6LgogICovCiAjZGVmaW5lIENGR19QQ0lDTEtfRVFVQUxTX0lQQkNMS19ESVYyCQkvKiBkZWZpbmUgZm9yIDY2TUh6IHNwZWVkICovCkBAIC0zOTQsNyArMzkyLDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkgICAgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAgICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KQEAgLTQwMyw2ICs0MDEsMTEgQEAKICNkZWZpbmUgQ0ZHX01BWEFSR1MJCTE2CS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzCSovCiAjZGVmaW5lIENGR19CQVJHU0laRQkJQ0ZHX0NCU0laRQkvKiBCb290IEFyZ3VtZW50IEJ1ZmZlciBTaXplCSovCiAKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKyNlbmRpZgorCiAvKiBFbmFibGUgYW4gYWx0ZXJuYXRlLCBtb3JlIGV4dGVuc2l2ZSBtZW1vcnkgdGVzdCAqLwogI2RlZmluZSBDRkdfQUxUX01FTVRFU1QKIApAQCAtNDE0LDggKzQxNyw3IEBACiAjZGVmaW5lIENGR19IWgkJCTEwMDAJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcyAqLwogCiAvKgotICogRW5hYmxlIGxvb3B3IGNvbW1hbmRvLiBUaGlzIGhhcyBvbmx5IGFmZmVjdCwgaWYgQ0ZHX0NNRF9NRU0gaXMgZGVmaW5lZCwKLSAqIHdoaWNoIGlzIG5vcm1hbGx5IHBhcnQgb2YgdGhlIGRlZmF1bHQgY29tbWFuZHMgKENGVl9DTURfREZMKQorICogRW5hYmxlIGxvb3B3IGNvbW1hbmQuCiAgKi8KICNkZWZpbmUgQ09ORklHX0xPT1BXCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9UT1A1MjAwLmggYi9pbmNsdWRlL2NvbmZpZ3MvVE9QNTIwMC5oCmluZGV4IDFjYzljZTkuLjcyNDBjZTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9UT1A1MjAwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1RPUDUyMDAuaApAQCAtNTAsMTEgKzUwLDYgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAgKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QJICAgICAqLwogCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKLSMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KLSNlbmRpZgotCiAvKgogICogU2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgogICovCkBAIC04MSwxMiArNzYsNiBAQAogIyAgZGVmaW5lIENPTkZJR19QQ0lfSU9fUEhZUwlDT05GSUdfUENJX0lPX0JVUwogIyAgZGVmaW5lIENPTkZJR19QQ0lfSU9fU0laRQkweDAxMDAwMDAwCiAKLSMgIGRlZmluZSBBRERfUENJX0NNRCAJCUNGR19DTURfUENJCi0KLSNlbHNlCS8qIG5vIEV2YWx1YXRpb24gYm9hcmQgKi8KLQotIyAgZGVmaW5lIEFERF9QQ0lfQ01ECQkwICAvKiBubyBDRkdfQ01EX1BDSSAqLwotCiAjZW5kaWYKIAogLyogVVNCICovCkBAIC05OSw0OSArODgsNDkgQEAKICMgIGVsc2UKICMgICAgZGVmaW5lIENPTkZJR19VU0JfQ09ORklHCTB4MDAwMDEwMDAKICMgIGVuZGlmCi0jICBkZWZpbmUgQUREX1VTQl9DTUQgICAgICAgICAgICAgQ0ZHX0NNRF9VU0IgfCBDRkdfQ01EX0ZBVAogIyAgZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAjICBkZWZpbmUgQ09ORklHX1VTQl9TVE9SQUdFCiAKLSNlbHNlCi0KLSMgIGRlZmluZSBBRERfVVNCX0NNRAkJMAotCiAjZW5kaWYKIAogLyogSURFICovCiAjaWYgZGVmaW5lZCAoQ09ORklHX0VWQUw1MjAwKSB8fCBkZWZpbmVkIChDT05GSUdfTElURTUyMDApCi0KLSMgIGRlZmluZSBBRERfSURFX0NNRCAgICAgICAgICAgICBDRkdfQ01EX0lERSB8IENGR19DTURfRkFUCiAjICBkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KLQotI2Vsc2UKLQotIyAgZGVmaW5lIEFERF9JREVfQ01ECQkwCi0KICNlbmRpZgogCi0vKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCi0gKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQUREX1BDSV9DTUQJfCBcCi0JCQkJQUREX1VTQl9DTUQJfCBcCi0JCQkJQUREX0lERV9DTUQJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX1JFR0lORk8JfCBcCi0JCQkJQ0ZHX0NNRF9JTU1BUAl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX01JSSAJfCBcCi0JCQkJQ0ZHX0NNRF9CRURCVUcJXAotCQkJICAgICAgKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JTU1BUAorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKworI2lmIGRlZmluZWQgKENPTkZJR19FVkFMNTIwMCkgfHwgZGVmaW5lZCAoQ09ORklHX0xJVEU1MjAwKQorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX1VTQgorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2VuZGlmCisKIAogLyoKICAqIE1VU1QgYmUgbG93IGJvb3QgLSBISUdIQk9PVCBpcyBub3Qgc3VwcG9ydGVkIGFueW1vcmUKQEAgLTMzNiw3ICszMjUsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogIyAgZGVmaW5lIENGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KQEAgLTM1Miw2ICszNDEsMTIgQEAKIAogI2RlZmluZSBDRkdfSFoJCQkxMDAwCS8qIGRlY3JlbWVudGVyIGZyZXE6IDEgbXMgdGlja3MgKi8KIAorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLworI2VuZGlmCisKKwogI2lmZGVmIENPTkZJR19FVkFMNTIwMAkJLyogTTQ4VDA4IGlzIGF2YWlsYWJsZSB3aXRoIHRoZSBFdmFsdWF0aW9uIGJvYXJkIG9ubHkgKi8KICAgI2RlZmluZSBDT05GSUdfUlRDX01LNDhUNTkJMQkvKiB1c2UgTTQ4VDA4IG9uIEVWQUw1MjAwICovCiAgICNkZWZpbmUgUlRDKHJlZykJCSgweGYwMDEwMDAwK3JlZykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9UT1A4NjAuaCBiL2luY2x1ZGUvY29uZmlncy9UT1A4NjAuaAppbmRleCAyMzQ0Yjk2Li42NmY3YTExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVE9QODYwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1RPUDg2MC5oCkBAIC0xMDcsMzAgKzEwNywyOCBAQAogICovCiAjZGVmaW5lIENGR19NQVRDSF9QQVJUSUFMX0NNRAogCisKIC8qCi0gKiBMaXN0IG9mIGF2YWlsYWJsZSBtb25pdG9yIGNvbW1hbmRzLiAgVXNlIHRoZSBzeXN0ZW0gZGVmYXVsdCBsaXN0Ci0gKiBwbHVzIGFkZCBzb21lIG9mIHRoZSAibm9uLXN0YW5kYXJkIiBjb21tYW5kcyBiYWNrIGluLgotICogU2VlIC4vY21kX2NvbmZkZWZzLmgKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgogICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQkJCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCQkJCQlDRkdfQ01EX0kyQwkJfCBcCi0JCQkJCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCQkJCQlDRkdfQ01EX1JFR0lORk8JfCBcCi0JCQkJCQkJCUNGR19DTURfSU1NQVAJfCBcCi0JCQkJCQkJCUNGR19DTURfRUxGCQl8IFwKLQkJCQkJCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCQkJCQlDRkdfQ01EX01JSSAJfCBcCi0JCQkJCQkJCUNGR19DTURfQkVEQlVHCVwKLQkJCQkJCSAgICAgICkKKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisKIAogI2RlZmluZQlDT05GSUdfQVVUT1NDUklQVAkJMQogI2RlZmluZQlDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQogI3VuZGVmCUNPTkZJR19MT0FEU19FQ0hPCQkJLyogTk8gZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkCSovCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwpAQCAtMTQxLDcgKzEzOSw3IEBACiAgI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAgI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIzOSw3ICsyMzcsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCkBAIC00MTEsMTAgKzQwOSwxMSBAQAogLyoKICAqIEJPT1RQIG9wdGlvbnMKICAqLwotI3VuZGVmCUNPTkZJR19CT09UUF9NQVNLCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCQkJCSggQ09ORklHX0JPT1RQX0RFRkFVTFQJCXwgXAotCQkJCQkJCQkJICAJICBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFICAgXAotCQkJCQkJCQkJCSkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCiAKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9UUU01MjAwLmggYi9pbmNsdWRlL2NvbmZpZ3MvVFFNNTIwMC5oCmluZGV4IDc5MzU1OTMuLjNkOTg1MDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9UUU01MjAwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1RRTTUyMDAuaApAQCAtNDQsMTQgKzQ0LDkgQEAKIAogI2RlZmluZSBDRkdfTVBDNVhYWF9DTEtJTgkzMzAwMDAwMCAvKiAuLi4gcnVubmluZyBhdCAzMy4wMDAwMDBNSHoJCSovCiAKLSNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAJKi8KKyNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLwogI2RlZmluZSBCT09URkxBR19XQVJNCQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCiAKLSNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCi0jZW5kaWYKLQogLyoKICAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KICAqLwpAQCAtMTA1LDEyICsxMDAsNiBAQAogI2RlZmluZSBDT05GSUdfTlM4MzgyWAkJMQogI2VuZGlmCS8qIENPTkZJR19TVEs1MlhYICovCiAKLSNpZmRlZiBDT05GSUdfUENJCi0jZGVmaW5lIEFERF9QQ0lfQ01ECQlDRkdfQ01EX1BDSQotI2Vsc2UKLSNkZWZpbmUgQUREX1BDSV9DTUQJCTAKLSNlbmRpZgotCiAvKgogICogVmlkZW8gY29uc29sZQogICovCkBAIC0xMzMsMTEgKzEyMiw2IEBACiAjZGVmaW5lIENGR19DT05TT0xFX0lTX0lOX0VOVgogI2VuZGlmIC8qICNpZm5kZWYgQ09ORklHX1RRTTUyMDBTICovCiAKLSNpZmRlZiBDT05GSUdfVklERU8KLSNkZWZpbmUgQUREX0JNUF9DTUQJCUNGR19DTURfQk1QCi0jZWxzZQotI2RlZmluZSBBRERfQk1QX0NNRAkJMAotI2VuZGlmCiAKIC8qIFBhcnRpdGlvbnMgKi8KICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KQEAgLTE0NiwxMSArMTMwLDE3IEBACiAKIC8qIFVTQiAqLwogI2lmIGRlZmluZWQoQ09ORklHX1NUSzUyWFgpIHx8IGRlZmluZWQoQ09ORklHX0ZPMzAwKQotI2RlZmluZSBDT05GSUdfVVNCX09IQ0kKLSNkZWZpbmUgQUREX1VTQl9DTUQJCUNGR19DTURfVVNCIHwgQ0ZHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX1VTQl9PSENJX05FVwogI2RlZmluZSBDT05GSUdfVVNCX1NUT1JBR0UKLSNlbHNlCi0jZGVmaW5lIEFERF9VU0JfQ01ECQkwCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfVVNCCisKKyN1bmRlZiBDRkdfVVNCX09IQ0lfQk9BUkRfSU5JVAorI2RlZmluZSBDRkdfVVNCX09IQ0lfQ1BVX0lOSVQKKyNkZWZpbmUgQ0ZHX1VTQl9PSENJX1JFR1NfQkFTRQlNUEM1WFhYX1VTQgorI2RlZmluZSBDRkdfVVNCX09IQ0lfU0xPVF9OQU1FCSJtcGM1MjAwIgorI2RlZmluZSBDRkdfVVNCX09IQ0lfTUFYX1JPT1RfUE9SVFMJMTUKKwogI2VuZGlmCiAKICNpZm5kZWYgQ09ORklHX0NBTTUyMDAKQEAgLTE2MSw0NCArMTUxLDYxIEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QT1NUCi0jZGVmaW5lIENGR19DTURfUE9TVF9ESUFHIENGR19DTURfRElBRwogLyogcHJlc2VydmUgc3BhY2UgZm9yIHRoZSBwb3N0X3dvcmQgYXQgZW5kIG9mIG9uLWNoaXAgU1JBTSAqLwogI2RlZmluZSBNUEM1WFhYX1NSQU1fUE9TVF9TSVpFIE1QQzVYWFhfU1JBTV9TSVpFLTQKLSNlbHNlCi0jZGVmaW5lIENGR19DTURfUE9TVF9ESUFHIDAKICNlbmRpZgogCi0vKiBJREUgKi8KLSNpZiBkZWZpbmVkIChDT05GSUdfTUlOSUZBUCkgfHwgZGVmaW5lZCAoQ09ORklHX1NUSzUyWFgpIHx8IGRlZmluZWQoQ09ORklHX0ZPMzAwKQotI2RlZmluZSBBRERfSURFX0NNRAkJKENGR19DTURfSURFIHwgQ0ZHX0NNRF9GQVQgfCBDRkdfQ01EX0VYVDIpCi0jZWxzZQotI2RlZmluZSBBRERfSURFX0NNRAkJMAotI2VuZGlmCiAKIC8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKKyAqIEJPT1RQIG9wdGlvbnMKICAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlBRERfQk1QX0NNRAl8IFwKLQkJCQlBRERfSURFX0NNRAl8IFwKLQkJCQlBRERfUENJX0NNRAl8IFwKLQkJCQlBRERfVVNCX0NNRAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSkZGUzIJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUE9TVF9ESUFHIHwgXAotCQkJCUNGR19DTURfUkVHSU5GTyB8IFwKLQkJCQlDRkdfQ01EX1NOVFAJfCBcCi0JCQkJQ0ZHX0NNRF9CU1ApCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorI2RlZmluZSBDT05GSUdfQ01EX0JTUAorCisjaWZkZWYgQ09ORklHX1ZJREVPCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0JNUAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUENJCisjZGVmaW5lIENPTkZJR19DTURfQ01EX1BDSQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19NSU5JRkFQKSB8fCBkZWZpbmVkKENPTkZJR19TVEs1MlhYKSB8fCBkZWZpbmVkKENPTkZJR19GTzMwMCkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfSURFCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorICAgICNkZWZpbmUgQ09ORklHX0NNRF9FWFQyCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NUSzUyWFgpIHx8IGRlZmluZWQoQ09ORklHX0ZPMzAwKQorICAgICNkZWZpbmUgQ09ORklHX0NGR19VU0IKKyAgICAjZGVmaW5lIENPTkZJR19DRkdfRkFUCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QT1NUCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNlbmRpZgorCiAKICNkZWZpbmUJQ09ORklHX1RJTUVTVEFNUAkJLyogZGlzcGxheSBpbWFnZSB0aW1lc3RhbXBzICovCiAKQEAgLTIzNCwxNSArMjQxLDIxIEBACiAjaWZuZGVmIENPTkZJR19DQU01MjAwCiAjZGVmaW5lIENVU1RPTV9FTlZfU0VUVElOR1MJCQkJCQlcCiAJImJvb3RmaWxlPS90ZnRwYm9vdC90cW01MjAwL3VJbWFnZVwwIgkJCQlcCisJImJvb3RmaWxlX2ZkdD0vdGZ0cGJvb3QvdHFtNTIwMC91SW1hZ2VfZmR0XDAiCQkJXAorCSJmZHRfZmlsZT0vdGZ0cGJvb3QvdHFtNTIwMC90cW01MjAwLmR0YlwwIgkJCVwKIAkidS1ib290PS90ZnRwYm9vdC90cW01MjAwL3UtYm9vdC5iaW5cMCIKICNlbHNlCi0jZGVmaW5lIENVU1RPTV9FTlZfU0VUVElOR1MgCQkJCQkJXAorI2RlZmluZSBDVVNUT01fRU5WX1NFVFRJTkdTCQkJCQkJXAogCSJib290ZmlsZT1jYW01MjAwL3VJbWFnZVwwIgkJCQkJXAogCSJ1LWJvb3Q9Y2FtNTIwMC91LWJvb3QuYmluXDAiCQkJCQlcCiAJInNldHVwPXRmdHAgMjAwMDAwIGNhbTUyMDAvc2V0dXAuaW1nOyBhdXRvc2NyIDIwMDAwMFwwIgogI2VuZGlmCiAKICNkZWZpbmUgQ09ORklHX0VYVFJBX0VOVl9TRVRUSU5HUwkJCQkJXAorCSJjb25zb2xlPXR0eVMwXDAiCQkJCQkJXAorCSJrZXJuZWxfYWRkcj0yMDAwMDBcMCIJCQkJCQlcCisJImZkdF9hZGRyPTQwMDAwMFwwIgkJCQkJCVwKKwkiaG9zdG5hbWU9dHFtNTIwMFwwIgkJCQkJCVwKIAkibmV0ZGV2PWV0aDBcMCIJCQkJCQkJXAogCSJyb290cGF0aD0vb3B0L2VsZGsvcHBjXzZ4eFwwIgkJCQkJXAogCSJyYW1hcmdzPXNldGVudiBib290YXJncyByb290PS9kZXYvcmFtIHJ3XDAiCQkJXApAQCAtMjUyLDEzICsyNjUsMTcgQEAKIAkJImlwPSR7aXBhZGRyfToke3NlcnZlcmlwfToke2dhdGV3YXlpcH06JHtuZXRtYXNrfSIJXAogCQkiOiR7aG9zdG5hbWV9OiR7bmV0ZGV2fTpvZmYgcGFuaWM9MVwwIgkJCVwKIAkiYWRkY29ucz1zZXRlbnYgYm9vdGFyZ3MgJHtib290YXJnc30gIgkJCQlcCi0JCSJjb25zb2xlPXR0eVMwLCR7YmF1ZHJhdGV9XDAiCQkJCVwKKwkJImNvbnNvbGU9JHtjb25zb2xlfSwke2JhdWRyYXRlfVwwIgkJCVwKIAkiZmxhc2hfc2VsZj1ydW4gcmFtYXJncyBhZGRpcCBhZGRjb25zOyIJCQkJXAogCQkiYm9vdG0gJHtrZXJuZWxfYWRkcn0gJHtyYW1kaXNrX2FkZHJ9XDAiCQlcCiAJImZsYXNoX25mcz1ydW4gbmZzYXJncyBhZGRpcCBhZGRjb25zOyIJCQkJXAogCQkiYm9vdG0gJHtrZXJuZWxfYWRkcn1cMCIJCQkJXAotCSJuZXRfbmZzPXRmdHAgMjAwMDAwICR7Ym9vdGZpbGV9O3J1biBuZnNhcmdzIGFkZGlwIGFkZGNvbnM7IglcCi0JCSJib290bVwwIgkJCQkJCVwKKwkibmV0X25mcz10ZnRwICR7a2VybmVsX2FkZHJ9ICR7Ym9vdGZpbGV9OyIJCQlcCisJCSJydW4gbmZzYXJncyBhZGRpcCBhZGRjb25zO2Jvb3RtXDAiCQkJXAorCSJuZXRfbmZzX2ZkdD10ZnRwICR7a2VybmVsX2FkZHJ9ICR7Ym9vdGZpbGVfZmR0fTsiCQlcCisJCSJ0ZnRwICR7ZmR0X2FkZHJ9ICR7ZmR0X2ZpbGV9O3NldGVudiBjb25zb2xlIHR0eVBTQzA7IglcCisJCSJydW4gbmZzYXJncyBhZGRpcCBhZGRjb25zOyIJCQkJXAorCQkiYm9vdG0gJHtrZXJuZWxfYWRkcn0gLSAke2ZkdF9hZGRyfVwwIgkJCVwKIAlDVVNUT01fRU5WX1NFVFRJTkdTCQkJCQkJXAogCSJsb2FkPXRmdHAgMjAwMDAwICR7dS1ib290fVwwIgkJCQkJXAogCUVOVl9VUERUCQkJCQkJCVwKQEAgLTU1Niw3ICs1NzMsMTIgQEAKICNkZWZpbmUJQ0ZHX0hVU0hfUEFSU0VSCQkxCS8qIHVzZSAiaHVzaCIgY29tbWFuZCBwYXJzZXIJKi8KICNkZWZpbmUJQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCkBAIC01NzYsOCArNTk4LDcgQEAKICNkZWZpbmUgQ0ZHX0haCQkJMTAwMAkvKiBkZWNyZW1lbnRlciBmcmVxOiAxIG1zIHRpY2tzICovCiAKIC8qCi0gKiBFbmFibGUgbG9vcHcgY29tbWFuZG8uIFRoaXMgaGFzIG9ubHkgYWZmZWN0LCBpZiBDRkdfQ01EX01FTSBpcyBkZWZpbmVkLAotICogd2hpY2ggaXMgbm9ybWFsbHkgcGFydCBvZiB0aGUgZGVmYXVsdCBjb21tYW5kcyAoQ0ZWX0NNRF9ERkwpCisgKiBFbmFibGUgbG9vcHcgY29tbWFuZC4KICAqLwogI2RlZmluZSBDT05GSUdfTE9PUFcKIApAQCAtNjc2LDQgKzY5NywxOCBAQAogLyogSW50ZXJ2YWwgYmV0d2VlbiByZWdpc3RlcnMJCQkJCQkgICAgICovCiAjZGVmaW5lIENGR19BVEFfU1RSSURFCQk0CiAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE9wZW4gZmlybXdhcmUgZmxhdCB0cmVlIHN1cHBvcnQKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2RlZmluZSBDT05GSUdfT0ZfRkxBVF9UUkVFCTEKKyNkZWZpbmUgQ09ORklHX09GX0JPQVJEX1NFVFVQCTEKKworLyogbWF4aW11bSBzaXplIG9mIHRoZSBmbGF0IHRyZWUgKDhLKSAqLworI2RlZmluZSBPRl9GTEFUX1RSRUVfTUFYX1NJWkUJODE5MgorI2RlZmluZSBPRl9DUFUJCQkiUG93ZXJQQyw1MjAwQDAiCisjZGVmaW5lIE9GX1NPQwkJCSJzb2M1MjAwQGYwMDAwMDAwIgorI2RlZmluZSBPRl9UQkNMSwkJKGJkLT5iaV9idXNmcmVxIC8gNCkKKyNkZWZpbmUgT0ZfU1RET1VUX1BBVEgJCSIvc29jNTIwMEBmMDAwMDAwMC9zZXJpYWxAMjAwMCIKKwogI2VuZGlmIC8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9UUU04MjNMLmggYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODIzTC5oCmluZGV4IDI0N2Y3MDUuLjJiZGNmMmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9UUU04MjNMLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1RRTTgyM0wuaApAQCAtODgsMzQgKzg4LDM4IEBACiAKICN1bmRlZglDT05GSUdfQ0FOX0RSSVZFUgkJLyogQ0FOIERyaXZlciBzdXBwb3J0IGRpc2FibGVkCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCiAjZGVmaW5lCUNPTkZJR19SVENfTVBDOHh4CQkvKiB1c2UgaW50ZXJuYWwgUlRDIG9mIE1QQzh4eAkqLwogCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKICNpZmRlZglDT05GSUdfU1BMQVNIX1NDUkVFTgotIyBkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0JNUAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCi0jZWxzZQotIyBkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0JNUAogI2VuZGlmCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTEyOSw3ICsxMzMsNyBAQAogI2RlZmluZQlDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMTIsNyArMjE2LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1RRTTgyM00uaCBiL2luY2x1ZGUvY29uZmlncy9UUU04MjNNLmgKaW5kZXggMTQ2MWI1Zi4uNThiYzVkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1RRTTgyM00uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODIzTS5oCkBAIC04OCwyMyArODgsMzQgQEAKIAogI3VuZGVmCUNPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKICNkZWZpbmUJQ09ORklHX1JUQ19NUEM4eHgJCS8qIHVzZSBpbnRlcm5hbCBSVEMgb2YgTVBDOHh4CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC0xMTgsNyArMTI5LDcgQEAKICNkZWZpbmUJQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjAyLDcgKzIxMyw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9UUU04MjYwLmggYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODI2MC5oCmluZGV4IGZmZDVjMGIuLjNiNzgzMjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9UUU04MjYwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1RRTTgyNjAuaApAQCAtMTY3LDggKzE2Nyw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICoKICAqIChPbiBUUU04MjYwIGVpdGhlciBTQ0MxIG9yIEZDQzIgbWF5IGJlIGNob3NlbjogU0NDMSBpcyBoYXJkd2lyZWQgdG8gdGhlCiAgKiBYLjI5IGNvbm5lY3RvciwgYW5kIEZDQzIgaXMgaGFyZHdpcmVkIHRvIHRoZSBYLjEgY29ubmVjdG9yKQpAQCAtMjIwLDE3ICsyMTksMjggQEAKIAogI2RlZmluZQlDT05GSUdfVElNRVNUQU1QCQkvKiBQcmludCBpbWFnZSBpbmZvIHdpdGggdGltZXN0YW1wICovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUfENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMjQ0LDcgKzI1NCw3IEBACiAjZGVmaW5lCUNGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTM4NSw3ICszOTUsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRSAgICAgIDMyICAgICAgLyogRm9yIE1QQzgyNjAgQ1BVICAgICAgICAgICAgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODI3Mi5oIGIvaW5jbHVkZS9jb25maWdzL1RRTTgyNzIuaAppbmRleCA5MjViZjM0Li41MGY2NzUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODI3Mi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9UUU04MjcyLmgKQEAgLTk3LDEwICs5Nyw2IEBACiAvKiBlbmFibGUgSTJDIGFuZCBzZWxlY3QgdGhlIGhhcmR3YXJlL3NvZnR3YXJlIGRyaXZlciAqLwogI3VuZGVmICBDT05GSUdfSEFSRF9JMkMJCQkvKiBJMkMgd2l0aCBoYXJkd2FyZSBzdXBwb3J0CSovCiAjZGVmaW5lIENPTkZJR19TT0ZUX0kyQwkJMQkvKiBJMkMgYml0LWJhbmdlZAkJKi8KLSNkZWZpbmUgQUREX0NNRF9JMkMJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfREFURQl8XAotCQkJCUNGR19DTURfRFRUCXxcCi0JCQkJQ0ZHX0NNRF9FRVBST00KICNkZWZpbmUgQ0ZHX0kyQ19TUEVFRAkJNDAwMDAwCS8qIEkyQyBzcGVlZCBhbmQgc2xhdmUgYWRkcmVzcwkqLwogI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCiAKQEAgLTE0MCw3ICsxMzYsNiBAQAogI2Vsc2UKICN1bmRlZiBDT05GSUdfSEFSRF9JMkMKICN1bmRlZiBDT05GSUdfU09GVF9JMkMKLSNkZWZpbmUgQUREX0NNRF9JMkMJCTAKICNlbmRpZgogCiAvKgpAQCAtMTc3LDggKzE3Miw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICoKICAqIChPbiBUUU04MjcyIGVpdGhlciBTQ0MxIG9yIEZDQzIgbWF5IGJlIGNob3NlbjogU0NDMSBpcyBoYXJkd2lyZWQgdG8gdGhlCiAgKiBYLjI5IGNvbm5lY3RvciwgYW5kIEZDQzIgaXMgaGFyZHdpcmVkIHRvIHRoZSBYLjEgY29ubmVjdG9yKQpAQCAtMjcyLDIwICsyNjYsMzcgQEAKIAogI2RlZmluZQlDT05GSUdfVElNRVNUQU1QCQkvKiBQcmludCBpbWFnZSBpbmZvIHdpdGggdGltZXN0YW1wICovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUfENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUFERF9DTURfSTJDCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCisjaWYgQ09ORklHX0kyQworICAgICNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyAgICAjZGVmaW5lIENPTkZJR19DTURfREFURQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9EVFQKKyAgICAjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZW5kaWYKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMzAxLDcgKzMxMiw3IEBACiAjZW5kaWYKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zOTIsNyArNDAzLDcgQEAKICAqIE5BTkQtRkxBU0ggc3R1ZmYKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAKICNkZWZpbmUgQ0ZHX05BTkRfQ1NfRElTVAkJMHg4MAogI2RlZmluZSBDRkdfTkFORF9VUE1fV1JJVEVfQ01EX09GUwkweDIwCkBAIC00MzAsNyArNDQxLDcgQEAKIAlXUklURV9OQU5EKGQsIGFkZHIpOyBcCiB9IHdoaWxlKDApCiAKLSNlbmRpZiAvKiBDRkdfQ01EX05BTkQgKi8KKyNlbmRpZiAvKiBDT05GSUdfQ01EX05BTkQgKi8KIAogI2RlZmluZQlDT05GSUdfUENJCiAjaWZkZWYgQ09ORklHX1BDSQpAQCAtNTAyLDcgKzUxMyw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFICAgICAgMzIgICAgICAvKiBGb3IgTVBDODI2MCBDUFUgICAgICAgICAgICAgICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9UUU04MzR4LmggYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODM0eC5oCmluZGV4IGVkMDM1NzcuLjY2MTcxMmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9UUU04MzR4LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1RRTTgzNHguaApAQCAtMjgsOSArMjgsNiBAQAogI2lmbmRlZiBfX0NPTkZJR19ICiAjZGVmaW5lIF9fQ09ORklHX0gKIAotI2RlZmluZSBERUJVRwotI3VuZGVmIERFQlVHCi0KIC8qCiAgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucwogICovCkBAIC0yNDgsMTAgKzI0NSwxMCBAQAogI2RlZmluZSBDT05GSUdfTkVUX01VTFRJCiAjZW5kaWYKIAotI2RlZmluZSBDT05GSUdfTVBDODNYWF9UU0VDMQkJMQotI2RlZmluZSBDT05GSUdfTVBDODNYWF9UU0VDMV9OQU1FCSJUU0VDMCIKLSNkZWZpbmUgQ09ORklHX01QQzgzWFhfVFNFQzIJCTEKLSNkZWZpbmUgQ09ORklHX01QQzgzWFhfVFNFQzJfTkFNRQkiVFNFQzEiCisjZGVmaW5lIENPTkZJR19UU0VDMQkJMQorI2RlZmluZSBDT05GSUdfVFNFQzFfTkFNRQkiVFNFQzAiCisjZGVmaW5lIENPTkZJR19UU0VDMgkJMQorI2RlZmluZSBDT05GSUdfVFNFQzJfTkFNRQkiVFNFQzEiCiAjZGVmaW5lIFRTRUMxX1BIWV9BRERSCQkJMgogI2RlZmluZSBUU0VDMl9QSFlfQUREUgkJCTEKICNkZWZpbmUgVFNFQzFfUEhZSURYCQkJMApAQCAtMjgxLDcgKzI3OCw2IEBACiAjZGVmaW5lIENGR19QQ0kxX0lPX1BIWVMgICAgICAgIENGR19QQ0kxX0lPX0JBU0UKICNkZWZpbmUgQ0ZHX1BDSTFfSU9fU0laRSAgICAgICAgMHgxMDAwMDAwICAgICAgIC8qIDE2TSAqLwogCi0KICN1bmRlZiBDT05GSUdfRUVQUk8xMDAKICNkZWZpbmUgQ09ORklHX0VFUFJPMTAwCiAjdW5kZWYgQ09ORklHX1RVTElQCkBAIC0zMTYsMzkgKzMxMiwzNyBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkJMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQgKi8KICNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZSAqLwogCi0vKiBDb21tb24gY29tbWFuZHMgKi8KLSNkZWZpbmUgQ0ZHX0NNRF9UUU04MzQ5X0NPTU1PTglDRkdfQ01EX0RBVEUgfCBDRkdfQ01EX0kyQyB8IENGR19DTURfRFRUXAotCQkJCXwgQ0ZHX0NNRF9QSU5HIHwgQ0ZHX0NNRF9FRVBST00JCVwKLQkJCQl8IENGR19DTURfTUlJIHwgQ0ZHX0NNRF9KRkZTMgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9EVFQKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpCi0KLSNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUENJCVwKLQkJCQl8IENGR19DTURfVFFNODM0OV9DT01NT04pCVwKLQkJCQkmCQkJCVwKLQkJCQl+KENGR19DTURfRU5WIHwgQ0ZHX0NNRF9MT0FEUykpCi0jZWxzZQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwJCVwKLQkJCQl8IENGR19DTURfVFFNODM0OV9DT01NT04pCVwKLQkJCQkmCQkJCVwKLQkJCQl+KENGR19DTURfRU5WIHwgQ0ZHX0NNRF9MT0FEUykpCisgICAgI3VuZGVmIENPTkZJR19DTURfRU5WCisgICAgI3VuZGVmIENPTkZJR19DTURfTE9BRFMKICNlbmRpZgogCi0jZWxzZSAvKiBDRkdfUkFNQk9PVCAqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfUENJKQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUENJCVwKLQkJCQl8IENGR19DTURfVFFNODM0OV9DT01NT04pCi0jZWxzZQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTAkJCVwKLQkJCQl8IENGR19DTURfVFFNODM0OV9DT01NT04pCi0jZW5kaWYKLQotI2VuZGlmIC8qIENGR19SQU1CT09UICovCi0KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwpAQCAtMzYyLDcgKzM1Niw3IEBACiAjZGVmaW5lCUNGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCSNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKIAkjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtMzg3LDcgKzM4MSw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkzMjc2OAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLypsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSovCiAjZW5kaWYKIApAQCAtNDk1LDcgKzQ4OSw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCBvZiBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODUwTC5oIGIvaW5jbHVkZS9jb25maWdzL1RRTTg1MEwuaAppbmRleCA5MGVjYmFkLi43NGIxNmM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODUwTC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9UUU04NTBMLmgKQEAgLTgwLDIzICs4MCwzMyBAQAogCiAjdW5kZWYJQ09ORklHX0NBTl9EUklWRVIJCS8qIENBTiBEcml2ZXIgc3VwcG9ydCBkaXNhYmxlZAkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAogI2RlZmluZQlDT05GSUdfUlRDX01QQzh4eAkJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHgJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC0xMTAsNyArMTIwLDcgQEAKICNkZWZpbmUJQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTkzLDcgKzIwMyw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9UUU04NTBNLmggYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODUwTS5oCmluZGV4IGIzZjhmOGQuLmUzOTM2YzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9UUU04NTBNLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1RRTTg1ME0uaApAQCAtNzgsMjMgKzc4LDMzIEBACiAKICN1bmRlZglDT05GSUdfQ0FOX0RSSVZFUgkJLyogQ0FOIERyaXZlciBzdXBwb3J0IGRpc2FibGVkCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCiAjZGVmaW5lCUNPTkZJR19SVENfTVBDOHh4CQkvKiB1c2UgaW50ZXJuYWwgUlRDIG9mIE1QQzh4eAkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTEwOCw3ICsxMTgsNyBAQAogI2RlZmluZQlDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xOTIsNyArMjAyLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1RRTTg1NUwuaCBiL2luY2x1ZGUvY29uZmlncy9UUU04NTVMLmgKaW5kZXggNDlhYWVlYS4uYWUyMmI3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1RRTTg1NUwuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODU1TC5oCkBAIC04MywyMyArODMsMzQgQEAKIAogI3VuZGVmCUNPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKICNkZWZpbmUJQ09ORklHX1JUQ19NUEM4eHgJCS8qIHVzZSBpbnRlcm5hbCBSVEMgb2YgTVBDOHh4CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC0xMTMsNyArMTI0LDcgQEAKICNkZWZpbmUJQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTk2LDcgKzIwNyw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9UUU04NTVNLmggYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODU1TS5oCmluZGV4IDUwZGY0OWUuLjVkNTRmODcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9UUU04NTVNLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1RRTTg1NU0uaApAQCAtMTE2LDI0ICsxMTYsMzUgQEAKICNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0JJVFMJNQogI2VuZGlmCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCiAjZGVmaW5lCUNPTkZJR19SVENfTVBDOHh4CQkvKiB1c2UgaW50ZXJuYWwgUlRDIG9mIE1QQzh4eAkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMTQ3LDcgKzE1OCw3IEBACiAjZGVmaW5lCUNGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIzMSw3ICsyNDIsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODV4eC5oIGIvaW5jbHVkZS9jb25maWdzL1RRTTg1eHguaAppbmRleCBmNDVmM2EyLi5kNWNlM2JhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODV4eC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9UUU04NXh4LmgKQEAgLTI1OCwxMCArMjU4LDEwIEBACiAjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkJMQogCiAjZGVmaW5lIENPTkZJR19NSUkJCTEJLyogTUlJIFBIWSBtYW5hZ2VtZW50CQkqLwotI2RlZmluZSBDT05GSUdfTVBDODVYWF9UU0VDMQkxCi0jZGVmaW5lIENPTkZJR19NUEM4NVhYX1RTRUMxX05BTUUJIlRTRUMwIgotI2RlZmluZSBDT05GSUdfTVBDODVYWF9UU0VDMgkxCi0jZGVmaW5lIENPTkZJR19NUEM4NVhYX1RTRUMyX05BTUUJIlRTRUMxIgorI2RlZmluZSBDT05GSUdfVFNFQzEJMQorI2RlZmluZSBDT05GSUdfVFNFQzFfTkFNRQkiVFNFQzAiCisjZGVmaW5lIENPTkZJR19UU0VDMgkxCisjZGVmaW5lIENPTkZJR19UU0VDMl9OQU1FCSJUU0VDMSIKICNkZWZpbmUgVFNFQzFfUEhZX0FERFIJCTIKICNkZWZpbmUgVFNFQzJfUEhZX0FERFIJCTEKICNkZWZpbmUgVFNFQzFfUEhZSURYCQkwCkBAIC0zNTcsMjQgKzM1NywzNSBAQAogCiAjZGVmaW5lCUNPTkZJR19USU1FU1RBTVAJCS8qIFByaW50IGltYWdlIGluZm8gd2l0aCB0cwkqLwogCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRFRUCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisKICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0jIGRlZmluZSBBRERfUENJX0NNRAkJKENGR19DTURfUENJKQotI2Vsc2UKLSMgZGVmaW5lIEFERF9QQ0lfQ01ECQkwCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQogI2VuZGlmCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJIENGR19DTURfREhDUAl8IFwKLQkJCQkgQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJIENGR19DTURfU05UUAl8IFwKLQkJCQkgQUREX1BDSV9DTUQJfCBcCi0JCQkJIENGR19DTURfSTJDCXwgXAotCQkJCSBDRkdfQ01EX0RBVEUJfCBcCi0JCQkJIENGR19DTURfRUVQUk9NCXwgXAotCQkJCSBDRkdfQ01EX0RUVAl8IFwKLQkJCQkgQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJIENGR19DTURfUElORwkpCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtMzg1LDcgKzM5Niw3IEBACiAjZGVmaW5lIENGR19MT0FEX0FERFIJMHgyMDAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzCQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogICAgICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICAgICAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtNDA2LDcgKzQxNyw3IEBACiAvKiBDYWNoZSBDb25maWd1cmF0aW9uICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMzI3NjgKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCkBAIC00MTgsNyArNDI5LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNICSovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290CQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0Ki8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlCSovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9UUU04NjBMLmggYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODYwTC5oCmluZGV4IDliZTVkYjEuLjQwYzA5NDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9UUU04NjBMLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1RRTTg2MEwuaApAQCAtODMsMjcgKzgzLDM4IEBACiAKICN1bmRlZglDT05GSUdfQ0FOX0RSSVZFUgkJLyogQ0FOIERyaXZlciBzdXBwb3J0IGRpc2FibGVkCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCiAjZGVmaW5lCUNPTkZJR19SVENfTVBDOHh4CQkvKiB1c2UgaW50ZXJuYWwgUlRDIG9mIE1QQzh4eAkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAjZGVmaW5lIENPTkZJR19ORVRDT05TT0xFCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwpAQCAtMTE2LDcgKzEyNyw3IEBACiAjZGVmaW5lCUNGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE5OSw3ICsyMTAsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODYwTS5oIGIvaW5jbHVkZS9jb25maWdzL1RRTTg2ME0uaAppbmRleCAzN2Y2Yzk4Li40ODFlM2QwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODYwTS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9UUU04NjBNLmgKQEAgLTgzLDI0ICs4MywzNSBAQAogCiAjdW5kZWYJQ09ORklHX0NBTl9EUklWRVIJCS8qIENBTiBEcml2ZXIgc3VwcG9ydCBkaXNhYmxlZAkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAogI2RlZmluZQlDT05GSUdfUlRDX01QQzh4eAkJLyogdXNlIGludGVybmFsIFJUQyBvZiBNUEM4eHgJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTExNCw3ICsxMjUsNyBAQAogI2RlZmluZQlDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xOTgsNyArMjA5LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1RRTTg2MkwuaCBiL2luY2x1ZGUvY29uZmlncy9UUU04NjJMLmgKaW5kZXggZjAzNjkwYS4uYmIzYjFjYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1RRTTg2MkwuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODYyTC5oCkBAIC04NiwyMyArODYsMzQgQEAKIAogI3VuZGVmCUNPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKICNkZWZpbmUJQ09ORklHX1JUQ19NUEM4eHgJCS8qIHVzZSBpbnRlcm5hbCBSVEMgb2YgTVBDOHh4CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC0xMTYsNyArMTI3LDcgQEAKICNkZWZpbmUJQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjAwLDcgKzIxMSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9UUU04NjJNLmggYi9pbmNsdWRlL2NvbmZpZ3MvVFFNODYyTS5oCmluZGV4IDQ5NTkzNDAuLmQ2ODdkMDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9UUU04NjJNLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1RRTTg2Mk0uaApAQCAtODYsMjMgKzg2LDM0IEBACiAKICN1bmRlZglDT05GSUdfQ0FOX0RSSVZFUgkJLyogQ0FOIERyaXZlciBzdXBwb3J0IGRpc2FibGVkCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCiAjZGVmaW5lCUNPTkZJR19SVENfTVBDOHh4CQkvKiB1c2UgaW50ZXJuYWwgUlRDIG9mIE1QQzh4eAkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMTE2LDcgKzEyNyw3IEBACiAjZGVmaW5lCUNGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIwMSw3ICsyMTIsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODY2TS5oIGIvaW5jbHVkZS9jb25maWdzL1RRTTg2Nk0uaAppbmRleCAxNDg0OTBiLi5mZjAwYzEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODY2TS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9UUU04NjZNLmgKQEAgLTEyNSw3ICsxMjUsMTUgQEAKICNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0JJVFMJNAogI2RlZmluZSBDRkdfRUVQUk9NX1BBR0VfV1JJVEVfREVMQVlfTVMJMTAJLyogYW5kIHRha2VzIHVwIHRvIDEwIG1zZWMgKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCkBAIC0xMzQsMTYgKzE0MiwxOSBAQAogCiAjZGVmaW5lCUNPTkZJR19USU1FU1RBTVAJCS8qIGJ1dCBwcmludCBpbWFnZSB0aW1lc3RtcHMJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMTU3LDcgKzE2OCw3IEBACiAjZGVmaW5lCUNGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI0MSw3ICsyNTIsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODg1RC5oIGIvaW5jbHVkZS9jb25maWdzL1RRTTg4NUQuaAppbmRleCBkNDcwYWRlLi5mMzZiNzI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVFFNODg1RC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9UUU04ODVELmgKQEAgLTEzMSw3ICsxMzEsMTUgQEAKICMgZGVmaW5lIENPTkZJR19SVENfRFMxMzM3IDEKICMgZGVmaW5lIENGR19JMkNfUlRDX0FERFIgMHg2OAogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KQEAgLTE0MCwxOSArMTQ4LDIyIEBACiAKICNkZWZpbmUJQ09ORklHX1RJTUVTVEFNUAkJLyogYnV0IHByaW50IGltYWdlIHRpbWVzdG1wcwkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HICkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKwogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpAQCAtMTY2LDcgKzE3Nyw3IEBACiAjZGVmaW5lCUNGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE4Nyw4ICsxOTgsNyBAQAogI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfQogCiAvKgotICogRW5hYmxlIGxvb3B3IGNvbW1hbmRvLiBUaGlzIGhhcyBvbmx5IGVmZmVjdCwgaWYgQ0ZHX0NNRF9NRU0gaXMgZGVmaW5lZCwKLSAqIHdoaWNoIGlzIG5vcm1hbGx5IHBhcnQgb2YgdGhlIGRlZmF1bHQgY29tbWFuZHMgKENGVl9DTURfREZMKQorICogRW5hYmxlIGxvb3B3IGNvbW1hbmQuCiAgKi8KICNkZWZpbmUgQ09ORklHX0xPT1BXCiAKQEAgLTI1OCw3ICsyNjgsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCkBAIC00NzgsNyArNDg4LDcgQEAKICNkZWZpbmUgQ09ORklHX0VUSEVSX09OX0ZFQzEJCS8qIC4uLiBmb3IgRkVDMSAqLwogI2RlZmluZSBDT05GSUdfRVRIRVJfT05fRkVDMgkJLyogLi4uIGZvciBGRUMyICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKICNkZWZpbmUgQ0ZHX0RJU0NPVkVSX1BIWQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9Ub3RhbDUyMDAuaCBiL2luY2x1ZGUvY29uZmlncy9Ub3RhbDUyMDAuaAppbmRleCBkODY4NmRkLi45ZWRmNzkwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVG90YWw1MjAwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1RvdGFsNTIwMC5oCkBAIC00OCwxMSArNDgsNiBAQAogI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdAkgICAgICovCiAKLSNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQotIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwotI2VuZGlmCi0KIC8qCiAgKiBTZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCiAgKi8KQEAgLTYzLDcgKzU4LDYgQEAKIC8qCiAgKiBWaWRlbyBjb25zb2xlCiAgKi8KLSNpZiAxCiAjZGVmaW5lIENPTkZJR19WSURFTwogI2RlZmluZSBDT05GSUdfVklERU9fU0VEMTM4MDYKICNkZWZpbmUgQ09ORklHX1ZJREVPX1NFRDEzODA2XzE2QlBQCkBAIC03NiwxMCArNzAsNiBAQAogI2RlZmluZSBDT05GSUdfVklERU9fU1dfQ1VSU09SCiAjZGVmaW5lIENPTkZJR19TUExBU0hfU0NSRUVOCiAKLSNkZWZpbmUgQUREX1ZJREVPX0NNRAlDRkdfQ01EX0JNUAotI2Vsc2UKLSNkZWZpbmUgQUREX1ZJREVPX0NNRAkwCi0jZW5kaWYKIAogI2lmZGVmIENPTkZJR19NUEM1MjAwCS8qIE1HVDUxMDAgUENJIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LiAqLwogLyoKQEAgLTEwNSwxMiArOTUsOSBAQAogI2RlZmluZSBDRkdfUlhfRVRIX0JVRkZFUgk4ICAvKiB1c2UgOCByeCBidWZmZXIgb24gZWVwcm8xMDAgICovCiAjZGVmaW5lIENPTkZJR19OUzgzODJYCQkxCiAKLSNkZWZpbmUgQUREX1BDSV9DTUQgCQlDRkdfQ01EX1BDSQotCiAjZWxzZQkvKiBNR1Q1MTAwICovCiAKICNkZWZpbmUgQ09ORklHX01JSQkJMQotI2RlZmluZSBBRERfUENJX0NNRAkJMCAgLyogbm8gQ0ZHX0NNRF9QQ0kgKi8KIAogI2VuZGlmCiAKQEAgLTExOSwyOSArMTA2LDM2IEBACiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKIC8qIFVTQiAqLwotI2lmIDEKICNkZWZpbmUgQ09ORklHX1VTQl9PSENJCi0jZGVmaW5lIEFERF9VU0JfQ01EICAgICAgICAgICAgIENGR19DTURfVVNCIHwgQ0ZHX0NNRF9GQVQKICNkZWZpbmUgQ09ORklHX1VTQl9TVE9SQUdFCi0jZWxzZQotI2RlZmluZSBBRERfVVNCX0NNRCAgICAgICAgICAgICAwCi0jZW5kaWYKKwogCiAvKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCisgKiBCT09UUCBvcHRpb25zCiAgKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJIENGR19DTURfUElORwl8IFwKLQkJCQkgQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJIENGR19DTURfRUVQUk9NCXwgXAotCQkJCSBDRkdfQ01EX0ZBVAl8IFwKLQkJCQkgQ0ZHX0NNRF9JREUJfCBcCi0JCQkJIEFERF9WSURFT19DTUQgIHwgXAotCQkJCSBBRERfUENJX0NNRAl8IFwKLQkJCQkgQUREX1VTQl9DTUQpCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfTVBDNTIwMCkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCisjZW5kaWYKKworI2RlZmluZSBDT05GSUdfQ01EX0JNUAorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKwogCiAjaWYgKFRFWFRfQkFTRSA9PSAweEZFMDAwMDAwKQkJLyogQm9vdCBsb3cgKi8KICMgICBkZWZpbmUgQ0ZHX0xPV0JPT1QJCTEKQEAgLTMwMyw3ICsyOTcsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtMzE5LDYgKzMxMywxMiBAQAogCiAjZGVmaW5lIENGR19IWgkJCTEwMDAJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcyAqLwogCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCisjZW5kaWYKKworCiAvKgogICogVmFyaW91cyBsb3ctbGV2ZWwgc2V0dGluZ3MKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1ZDTUE5LmggYi9pbmNsdWRlL2NvbmZpZ3MvVkNNQTkuaAppbmRleCA1ZjQ4YTcwLi5kZjY4OTRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVkNNQTkuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvVkNNQTkuaApAQCAtNDgsMjcgKzQ4LDMzIEBACiAjZGVmaW5lIENPTkZJR19TRVRVUF9NRU1PUllfVEFHUyAxCiAjZGVmaW5lIENPTkZJR19JTklUUkRfVEFHCSAxCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29tbWFuZCBkZWZpbml0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyBcCi0JCQkoQ09ORklHX0NNRF9ERkwJIHwgXAotCQkJQ0ZHX0NNRF9DQUNIRQkgfCBcCi0JCQkvKkNGR19DTURfSkZGUzIJIHwqLyBcCi0JCQkvKkNGR19DTURfTkFORAkgfCovIFwKLQkJCUNGR19DTURfRUVQUk9NCSB8IFwKLQkJCUNGR19DTURfSTJDCSB8IFwKLQkJCUNGR19DTURfVVNCCSB8IFwKLQkJCUNGR19DTURfUkVHSU5GTyAgfCBcCi0JCQlDRkdfQ01EX0ZBVAkgfCBcCi0JCQlDRkdfQ01EX0RBVEUJIHwgXAotCQkJQ0ZHX0NNRF9FTEYJIHwgXAotCQkJQ0ZHX0NNRF9ESENQCSB8IFwKLQkJCUNGR19DTURfUElORwkgfCBcCi0JCQlDRkdfQ01EX0JTUCkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIGFmdGVyIHRoZSBkZWZpbml0b24gb2YgQ09ORklHX0NPTU1BTkRTICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisKIAogI2RlZmluZSBDRkdfSFVTSF9QQVJTRVIKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMiAiPiAiCkBAIC0xNDUsNyArMTUxLDcgQEAKICNkZWZpbmUgQ09ORklHX0lQQUREUgkJMTAuMC4wLjExMAogI2RlZmluZSBDT05GSUdfU0VSVkVSSVAJCTEwLjAuMC4xCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxMTUyMDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAvKiB3aGF0J3MgdGhpcyA/IGl0J3Mgbm90IHVzZWQgYW55d2hlcmUgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTEJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwpAQCAtMjQ2LDcgKzI1Miw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBOQU5EIGZsYXNoIHNldHRpbmdzCiAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogCiAjZGVmaW5lIENGR19OQU5EX0xFR0FDWQogI2RlZmluZSBDRkdfTUFYX05BTkRfREVWSUNFCTEJLyogTWF4IG51bWJlciBvZiBOQU5EIGRldmljZXMJCSovCkBAIC0yODAsNiArMjg2LDYgQEAKICNkZWZpbmUgQ09ORklHX01URF9OQU5EX1ZFUklGWV9XUklURQkxCiAjZGVmaW5lIENPTkZJR19NVERfTkFORF9FQ0NfSkZGUzIJMQogCi0jZW5kaWYJLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EICovCisjZW5kaWYKIAogI2VuZGlmCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9WT0g0MDUuaCBiL2luY2x1ZGUvY29uZmlncy9WT0g0MDUuaAppbmRleCA5NmYzZDI2Li4zNGYwZWJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVk9INDA1LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1ZPSDQwNS5oCkBAIC01OCwyOCArNTgsNDAgQEAKIAogI2RlZmluZSBDT05GSUdfUEhZX0NMS19GUkVRCUVNQUNfU1RBQ1JfQ0xLXzY2TUhaIC8qIDY2IE1IeiBPUEIgY2xvY2sqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX0ZBVAl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX05BTkQJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQkpCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfTkFORAorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCiAjZGVmaW5lIENPTkZJR19TVVBQT1JUX1ZGQVQKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKICNkZWZpbmUgQ09ORklHX1JUQ19NQzE0NjgxOAkJLyogRFMxNjg1IGlzIE1DMTQ2ODE4IGNvbXBhdGlibGUqLwpAQCAtOTgsNyArMTEwLDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMzE5LDcgKzMzMSw3IEBACiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQJLyogRm9yIEFNQ0MgNDA1IENQVXMsIG9sZGVyIDQwNSBwcGMncwkqLwogCQkJCQkvKiBoYXZlIG9ubHkgOGtCLCAxNmtCIGlzIHNhdmUgaGVyZQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVk9NNDA1LmggYi9pbmNsdWRlL2NvbmZpZ3MvVk9NNDA1LmgKaW5kZXggZjJmM2VhNy4uNTUxMmY0YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1ZPTTQwNS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9WT000MDUuaApAQCAtNjAsMjQgKzYwLDMzIEBACiAjZGVmaW5lIENPTkZJR19MWFQ5NzFfTk9fU0xFRVAgIDEgICAgICAgLyogZGlzYWJsZSBzbGVlcCBtb2RlIGluIExYVDk3MSAqLwogI2RlZmluZSBDT05GSUdfUkVTRVRfUEhZX1IgICAgICAxICAgICAgIC8qIHVzZSByZXNldF9waHkoKSB0byBkaXNhYmxlIHBoeSBzbGVlcCBtb2RlICovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfRE5TIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfRE5TMiB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX1NFTkRfSE9TVE5BTUUgKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUzIKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NFTkRfSE9TVE5BTUUKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCiAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtOTYsNyArMTA1LDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjQ0LDcgKzI1Myw3IEBACiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQJLyogRm9yIEFNQ0MgNDA1IENQVXMsIG9sZGVyIDQwNSBwcGMncwkqLwogCQkJCQkvKiBoYXZlIG9ubHkgOGtCLCAxNmtCIGlzIHNhdmUgaGVyZQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvVm9WUE4tR1cuaCBiL2luY2x1ZGUvY29uZmlncy9Wb1ZQTi1HVy5oCmluZGV4IDkyYmFkZTUuLjE0MDU3ODQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9Wb1ZQTi1HVy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9Wb1ZQTi1HVy5oCkBAIC05NSw4ICs5NSw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICovCiAjdW5kZWYJQ09ORklHX0VUSEVSX09OX1NDQwogI2RlZmluZQlDT05GSUdfRVRIRVJfT05fRkNDCkBAIC0xMzgsMjQgKzEzNywzNCBAQAogCiAjZW5kaWYKIAotLyogY29uZmlndXJlIGNvbW1hbmRzICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKAlDRkdfQ01EX0FVVE9TQ1JJUFQJfCBcCi0JCQkJCUNGR19DTURfQkRJCQl8IFwKLQkJCQkJQ0ZHX0NNRF9DT05TT0xFCQl8IFwKLQkJCQkJQ0ZHX0NNRF9FQ0hPCQl8IFwKLQkJCQkJQ0ZHX0NNRF9FTlYJCXwgXAotCQkJCQlDRkdfQ01EX0ZMQVNICQl8IFwKLQkJCQkJQ0ZHX0NNRF9JTUkJCXwgXAotCQkJCQlDRkdfQ01EX0lNTFMJCXwgXAotCQkJCQlDRkdfQ01EX0xPQURCCQl8IFwKLQkJCQkJQ0ZHX0NNRF9NRU1PUlkJCXwgXAotCQkJCQlDRkdfQ01EX01JU0MJCXwgXAotCQkJCQlDRkdfQ01EX05FVAkJfCBcCi0JCQkJCUNGR19DTURfUElORwkJfCBcCi0JCQkJCUNGR19DTURfUlVOCSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisKKyNkZWZpbmUgQ09ORklHX0NNRF9BVVRPU0NSSVBUCisjZGVmaW5lIENPTkZJR19DTURfQkRJCisjZGVmaW5lIENPTkZJR19DTURfQ09OU09MRQorI2RlZmluZSBDT05GSUdfQ01EX0VDSE8KKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX0lNSQorI2RlZmluZSBDT05GSUdfQ01EX0lNTFMKKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEQgorI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX01JU0MKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUlVOCisKIAogLyoKICAqIGJvb3Qgb3B0aW9ucyAmIGVudmlyb25tZW50CkBAIC0yMDYsNyArMjE1LDcgQEAKICNkZWZpbmUJQ0ZHX1BST01QVAkJCSI9PiAiCiAKIC8qIGNvbnNvbGUgaS9vIGJ1ZmZlciBzaXplICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJCTEwMjQKICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCQkyNTYKQEAgLTMwNSw3ICszMTQsNyBAQAogCiAvKiBjYWNoZSBjb25maWd1cmF0aW9uICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkJMzIgICAgICAvKiBmb3IgTVBDODI2MCAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJCTUJLyogbG9nIGJhc2UgMiBvZiBhYm92ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9XN09MTUMuaCBiL2luY2x1ZGUvY29uZmlncy9XN09MTUMuaAppbmRleCA4ZGM2MjNlLi5mYzE3N2ZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVzdPTE1DLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1c3T0xNQy5oCkBAIC03MCwxMyArNzAsMzEgQEAKIAogI2RlZmluZSBDT05GSUdfUlRDX000OFQzNUEJMQkJLyogU1QgRWxlY3Ryb25pY3MgTTQ4IHRpbWVrZWVwZXIgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCVwKLQkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BDSSB8IENGR19DTURfSVJRIHwgQ0ZHX0NNRF9BU0tFTlYgfCBcCi0JIENGR19DTURfREhDUCB8IENGR19DTURfQkVEQlVHIHwgQ0ZHX0NNRF9EQVRFIHwgQ0ZHX0NNRF9JMkMgfCBcCi0JIENGR19DTURfRUVQUk9NIHwgQ0ZHX0NNRF9FTEYgfCBDRkdfQ01EX0JTUCB8IENGR19DTURfUkVHSU5GTykKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0JTUAorI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KICNkZWZpbmUgQ09ORklHX0hXX1dBVENIRE9HCQkJLyogSFcgV2F0Y2hkb2csIGJvYXJkIHNwZWNpZmljCSovCkBAIC05Miw3ICsxMTAsNyBAQAogI2lmZGVmICBDRkdfSFVTSF9QQVJTRVIKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMiAgICAgIj4gIgogI2VuZGlmCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI3Nyw3ICsyOTUsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJODE5MgkJLyogRm9yIEFNQ0MgNDA1IENQVXMJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJCS8qIC4uLgkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJCS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbC4gKi8KICNlbmRpZgogCkBAIC0zMDksNyArMzI3LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkJLyogU29mdHdhcmUgcmVib290CQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlCSovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9XN09MTUcuaCBiL2luY2x1ZGUvY29uZmlncy9XN09MTUcuaAppbmRleCAyYmQ5OGIzLi4yMGQ2OTNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvVzdPTE1HLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1c3T0xNRy5oCkBAIC03NSwxNCArNzUsMzQgQEAKICNkZWZpbmUgQ0ZHX0RUVF9MT1dfVEVNUAktMzAKICNkZWZpbmUgQ0ZHX0RUVF9IWVNURVJFU0lTCTMKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCVwKLQkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BDSSB8IENGR19DTURfSVJRIHwgQ0ZHX0NNRF9BU0tFTlYgfCBcCi0JIENGR19DTURfREhDUCB8IENGR19DTURfQkVEQlVHIHwgQ0ZHX0NNRF9EQVRFIHwgQ0ZHX0NNRF9JMkMgfCBcCi0JIENGR19DTURfRUVQUk9NIHwgQ0ZHX0NNRF9FTEYgfCBDRkdfQ01EX0JTUCB8IENGR19DTURfUkVHSU5GTyB8IFwKLQkgQ0ZHX0NNRF9EVFQpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0JTUAorI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9EVFQKKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogI2RlZmluZSBDT05GSUdfSFdfV0FUQ0hET0cJCQkvKiBIVyBXYXRjaGRvZywgYm9hcmQgc3BlY2lmaWMJKi8KQEAgLTk4LDcgKzExOCw3IEBACiAjaWZkZWYgIENGR19IVVNIX1BBUlNFUgogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyICAgICAiPiAiCiAjZW5kaWYKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjc4LDcgKzI5OCw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQk4MTkyCQkvKiBGb3IgQU1DQyA0MDUgQ1BVcwkJCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkJLyogLi4uCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsLiAqLwogI2VuZGlmCiAKQEAgLTMxMCw3ICszMzAsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UJKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1dVSDQwNS5oIGIvaW5jbHVkZS9jb25maWdzL1dVSDQwNS5oCmluZGV4IGZhZjg1NWQuLmMxYjNkYTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9XVUg0MDUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvV1VINDA1LmgKQEAgLTYwLDE5ICs2MCwzMSBAQAogCiAjZGVmaW5lIENPTkZJR19QSFlfQ0xLX0ZSRVEJRU1BQ19TVEFDUl9DTEtfNjZNSFogLyogNjYgTUh6IE9QQiBjbG9jayovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKwogCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTkyLDcgKzEwNCw3IEBACiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI3MCw3ICsyODIsNyBAQAogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTE2Mzg0CS8qIEZvciBBTUNDIDQwNSBDUFVzLCBvbGRlciA0MDUgcHBjJ3MJKi8KIAkJCQkJLyogaGF2ZSBvbmx5IDhrQiwgMTZrQiBpcyBzYXZlIGhlcmUJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL1hQRURJVEUxSy5oIGIvaW5jbHVkZS9jb25maWdzL1hQRURJVEUxSy5oCmluZGV4IDliMzI1MTQuLjYxMWY1YTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9YUEVESVRFMUsuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvWFBFRElURTFLLmgKQEAgLTE4MiwyNSArMTgyLDMzIEBACiAjZGVmaW5lIENPTkZJR19IQVNfRVRIMgkJMQkvKiBhZGQgc3VwcG9ydCBmb3IgImV0aDJhZGRyIgkqLwogI2RlZmluZSBDT05GSUdfSEFTX0VUSDMJCTEJLyogYWRkIHN1cHBvcnQgZm9yICJldGgzYWRkciIJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9CRURCVUcJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HIHwgXAotCQkJCUNGR19DTURfRUxGIHwgXAotCQkJCUNGR19DTURfTUlJIHwgXAotCQkJCUNGR19DTURfRElBRyB8IFwKLQkJCQlDRkdfQ01EX0ZBVCApCiAKLS8qCQkJCUNGR19DTURfREhDUAl8IFwgKi8KLS8qCQkJCUNGR19DTURfS0dEQgl8IFwgKi8KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTIwOSw3ICsyMTcsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMzgsNyArMjQ2LDYgQEAKICNkZWZpbmUgQ0ZHX1BDSV9UQVJHQkFTRSAgICAweDgwMDAwMDAwCS8qIFBDSWFkZHIgbWFwcGVkIHRvIENGR19QQ0lfTUVNQkFTRSAqLwogCiAvKiBCb2FyZC1zcGVjaWZpYyBQQ0kgKi8KLSNkZWZpbmUgQ0ZHX1BDSV9QUkVfSU5JVAkJLyogZW5hYmxlIGJvYXJkIHBjaV9wcmVfaW5pdCgpCSovCiAjZGVmaW5lIENGR19QQ0lfVEFSR0VUX0lOSVQJCSAgICAvKiBsZXQgYm9hcmQgaW5pdCBwY2kgdGFyZ2V0ICAgICovCiAKICNkZWZpbmUgQ0ZHX1BDSV9TVUJTWVNfVkVORE9SSUQgMHgxMDE0CS8qIElCTSAqLwpAQCAtMjU1LDcgKzI2Miw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQk4MTkyIC8qIEZvciBBTUNDIDQ0MEdYIENQVXMgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtMjY3LDcgKzI3NCw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvWXVrb244MjIwLmggYi9pbmNsdWRlL2NvbmZpZ3MvWXVrb244MjIwLmgKaW5kZXggMzdlZjEwNS4uMDBjNGZmMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL1l1a29uODIyMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9ZdWtvbjgyMjAuaApAQCAtMzksMTIgKzM5LDYgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdAkqLwogCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODIyMCBDUFVzICovCi0KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQotIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNSAgIC8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCi0jZW5kaWYKLQogLyoKICAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KICAqLwpAQCAtNzAsMzEgKzY0LDQwIEBACiAKICNkZWZpbmUgQ09ORklHX1RJTUVTVEFNUAkJCS8qIFByaW50IGltYWdlIGluZm8gd2l0aCB0aW1lc3RhbXAgKi8KIAorCiAvKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCisgKiBCT09UUCBvcHRpb25zCiAgKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9CT09URAl8IFwKLQkJCQlDRkdfQ01EX0NBQ0hFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RJQUcJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTyB8IFwKLQkJCQlDRkdfQ01EX1NEUkFNCXwgXAotCQkJCUNGR19DTURfU05UUAkpCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQk9PVEQKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkKICNkZWZpbmUgQ09ORklHX01JSQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qCiAgKiBBdXRvYm9vdGluZwogICovCkBAIC0yOTMsNyArMjk2LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkgICAgLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJICAgIC8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CSAgICAvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CSAgICAvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMzA5LDYgKzMxMiwxMSBAQAogCiAjZGVmaW5lIENGR19IWgkJCTEwMDAJICAgIC8qIGRlY3JlbWVudGVyIGZyZXE6IDEgbXMgdGlja3MgKi8KIAorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyMjAgQ1BVcyAqLworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNSAgIC8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCisjZW5kaWYKKwogLyoKICAqIFZhcmlvdXMgbG93LWxldmVsIHNldHRpbmdzCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9aUEMxOTAwLmggYi9pbmNsdWRlL2NvbmZpZ3MvWlBDMTkwMC5oCmluZGV4IGE1MDg1Y2YuLjdjMWE1YjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9aUEMxOTAwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1pQQzE5MDAuaApAQCAtNTUsOCArNTUsOCBAQAogICogU0NDLCAxLTMgZm9yIEZDQykKICAqCiAgKiBJZiBDT05GSUdfRVRIRVJfTk9ORSBpcyBkZWZpbmVkLCB0aGVuIGVpdGhlciB0aGUgZXRoZXJuZXQgcm91dGluZXMKLSAqIG11c3QgYmUgZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENGR19DTURfTkVUIG11c3QKLSAqIGJlIHJlbW92ZWQgZnJvbSBDT05GSUdfQ09NTUFORFMgdG8gcmVtb3ZlIHN1cHBvcnQgZm9yIG5ldHdvcmtpbmcuCisgKiBtdXN0IGJlIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVAorICogbXVzdCBiZSB1bnNldC4KICAqLwogI3VuZGVmCUNPTkZJR19FVEhFUl9PTl9TQ0MJCS8qIEV0aGVybmV0IGlzIG5vdCBvbiBTQ0MgKi8KICNkZWZpbmUgQ09ORklHX0VUSEVSX09OX0ZDQwkJLyogRXRoZXJuZXQgaXMgb24gRkNDICAgICAqLwpAQCAtMTA2LDIyICsxMDYsMzMgQEAKIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTM4NDAwCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgICBcCi0JCQkJfCBDRkdfQ01EX0FTS0VOViAgXAotCQkJCXwgQ0ZHX0NNRF9ESENQICAgIFwKLQkJCQl8IENGR19DTURfSU1NQVAgICBcCi0JCQkJfCBDRkdfQ01EX01JSSAgICAgXAotCQkJCXwgQ0ZHX0NNRF9QSU5HICAgIFwKLQkJCQkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUJLyogYXV0b2Jvb3QgYWZ0ZXIgNSBzZWNvbmRzICovCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiZGhjcDtib290bSIJLyogYXV0b2Jvb3QgY29tbWFuZCAqLwogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MJCSJyb290PS9kZXYvbmZzIHJ3IGlwPTo6Ojo6ZXRoMDpkaGNwIgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICN1bmRlZglDT05GSUdfS0dEQl9PTl9TTUMJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIFNNQyAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9PTl9TQ0MJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIFNDQyAqLwogI3VuZGVmCUNPTkZJR19LR0RCX05PTkUJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIHNvbWV0aGluZyBlbHNlICovCkBAIC0xMzksNyArMTUwLDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtMjIzLDcgKzIzNCw3IEBACiAjZW5kaWYKIAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyNjAgQ1BVICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCkBAIC0yNDgsMTggKzI1OSwxOCBAQAogI2RlZmluZSBDRkdfTFNSVAkJMHgwRgogI2RlZmluZSBDRkdfTVBUUFIJCTB4NDAwMAogCi0jZGVmaW5lIENGR19QU0RSQU1fQlIJCUNGR19TRFJBTV9CQVNFIHwgMHgwMDAwMDA0MQorI2RlZmluZSBDRkdfUFNEUkFNX0JSCQkoQ0ZHX1NEUkFNX0JBU0UgfCAweDAwMDAwMDQxKQogI2RlZmluZSBDRkdfUFNEUkFNX09SCQkweEZDMDAyOEMwCi0jZGVmaW5lIENGR19MU0RSQU1fQlIJCUNGR19MU0RSQU1fQkFTRSB8IDB4MDAwMDE4NjEKKyNkZWZpbmUgQ0ZHX0xTRFJBTV9CUgkJKENGR19MU0RSQU1fQkFTRSB8IDB4MDAwMDE4NjEpCiAjZGVmaW5lIENGR19MU0RSQU1fT1IJCTB4RkY4MDM0ODAKIAotI2RlZmluZSBDRkdfQlIwX1BSRUxJTQkJQ0ZHX0ZMQVNIX0JBU0UgfCAweDAwMDAwODAxCisjZGVmaW5lIENGR19CUjBfUFJFTElNCQkoQ0ZHX0ZMQVNIX0JBU0UgfCAweDAwMDAwODAxKQogI2RlZmluZSBDRkdfT1IwX1BSRUxJTQkJMHhGRkUwMDg1NgotI2RlZmluZSBDRkdfQlI1X1BSRUxJTQkJQ0ZHX0VFUFJPTSB8IDB4MDAwMDA4MDEKKyNkZWZpbmUgQ0ZHX0JSNV9QUkVMSU0JCShDRkdfRUVQUk9NIHwgMHgwMDAwMDgwMSkKICNkZWZpbmUgQ0ZHX09SNV9QUkVMSU0JCTB4RkZGRjAzRjYKLSNkZWZpbmUgQ0ZHX0JSNl9QUkVMSU0JCUNGR19GTFNJTU1fQkFTRSB8IDB4MDAwMDE4MDEKKyNkZWZpbmUgQ0ZHX0JSNl9QUkVMSU0JCShDRkdfRkxTSU1NX0JBU0UgfCAweDAwMDAxODAxKQogI2RlZmluZSBDRkdfT1I2X1BSRUxJTQkJMHhGRjAwMDg1NgotI2RlZmluZSBDRkdfQlI3X1BSRUxJTQkJQ0ZHX0JDU1IgfCAweDAwMDAwODAxCisjZGVmaW5lIENGR19CUjdfUFJFTElNCQkoQ0ZHX0JDU1IgfCAweDAwMDAwODAxKQogI2RlZmluZSBDRkdfT1I3X1BSRUxJTQkJMHhGRkZGODNGNgogCiAjZGVmaW5lIENGR19SRVNFVF9BRERSRVNTCTB4QzAwMDAwMDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9aVU1BLmggYi9pbmNsdWRlL2NvbmZpZ3MvWlVNQS5oCmluZGV4IGYxNjNkMDAuLjViYThkMWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9aVU1BLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL1pVTUEuaApAQCAtMTAxLDE3ICsxMDEsMjkgQEAKICN1bmRlZglDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KICN1bmRlZglDT05GSUdfQUxUSVZFQwkJCS8qIHVuZGVmIHRvIGRpc2FibGUJCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAogI2RlZmluZSBDT05GSUdfTUlJCQkvKiBlbmFibGUgTUlJIGNvbW1hbmRzICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgfCBcCi0JCQkJIENGR19DTURfQVNLRU5WIHwgXAotCQkJCSBDRkdfQ01EX0JTUAl8IFwKLQkJCQkgQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQkgQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJIENGR19DTURfREFURSkKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKwogCiAvKgogICogSkZGUzIgcGFydGl0aW9ucwpAQCAtMTMxLDE1ICsxNDMsMTIgQEAKICNkZWZpbmUgTVREUEFSVFNfREVGQVVMVAkibXRkcGFydHM9enVtYS0xOi0oamZmczIpLHp1bWEtMjotKHVzZXIpIgogKi8KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zNDksNyArMzU4LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIGFsbCBNUEM3NHh4IENQVXMJCSAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9hY2FkaWEuaCBiL2luY2x1ZGUvY29uZmlncy9hY2FkaWEuaAppbmRleCBjNzJkOTMzLi5lM2Y2ZTJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvYWNhZGlhLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2FjYWRpYS5oCkBAIC03NSw3ICs3NSw3IEBACiAjZGVmaW5lIENGR19URU1QX1NUQUNLX09DTQkxCQkvKiBPQ00gYXMgaW5pdCByYW0JKi8KIAogLyogT24gQ2hpcCBNZW1vcnkgbG9jYXRpb24gKi8KLSNkZWZpbmUgQ0ZHX09DTV9EQVRBX0FERFIJMHhGODAwMDAwMAorI2RlZmluZSBDRkdfT0NNX0RBVEFfQUREUgkweGY4MDAwMDAwCiAjZGVmaW5lIENGR19PQ01fREFUQV9TSVpFCTB4NDAwMAkJCS8qIDE2SyBvZiBvbmNoaXAgU1JBTQkJKi8KICNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0FERFIJQ0ZHX09DTV9EQVRBX0FERFIJLyogaW5zaWRlIG9mIFNSQU0JCSovCiAjZGVmaW5lIENGR19JTklUX1JBTV9FTkQJQ0ZHX09DTV9EQVRBX1NJWkUJLyogRW5kIG9mIHVzZWQgYXJlYSBpbiBSQU0JKi8KQEAgLTEwOSw2ICsxMDksNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRkxBU0ggcmVsYXRlZAogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiAhZGVmaW5lZChDT05GSUdfTkFORF9VX0JPT1QpICYmICFkZWZpbmVkKENPTkZJR19OQU5EX1NQTCkKICNkZWZpbmUgQ0ZHX0ZMQVNIX0NGSQkJCS8qIFRoZSBmbGFzaCBpcyBDRkkgY29tcGF0aWJsZQkqLwogI2RlZmluZSBDRkdfRkxBU0hfQ0ZJX0RSSVZFUgkJLyogVXNlIGNvbW1vbiBDRkkgZHJpdmVyCSovCiAKQEAgLTEyMiw2ICsxMjMsMTAgQEAKICNkZWZpbmUgQ0ZHX0ZMQVNIX1VTRV9CVUZGRVJfV1JJVEUgMQkvKiB1c2UgYnVmZmVyZWQgd3JpdGVzICgyMHggZmFzdGVyKQkqLwogI2RlZmluZSBDRkdfRkxBU0hfRU1QVFlfSU5GTwkJLyogcHJpbnQgJ0UnIGZvciBlbXB0eSBzZWN0b3Igb24gZmxpbmZvICovCiAKKyNlbHNlCisjZGVmaW5lCUNGR19OT19GTEFTSAkJMQkvKiBObyBOT1Igb24gQWNhZGlhIHdoZW4gTkFORC1ib290aW5nCSovCisjZW5kaWYKKwogI2lmZGVmIENGR19FTlZfSVNfSU5fRkxBU0gKICNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJMHg0MDAwMCAvKiBzaXplIG9mIG9uZSBjb21wbGV0ZSBzZWN0b3IJKi8KICNkZWZpbmUgQ0ZHX0VOVl9BRERSCQkoQ0ZHX01PTklUT1JfQkFTRS1DRkdfRU5WX1NFQ1RfU0laRSkKQEAgLTEzMiw2ICsxMzcsNjMgQEAKICNkZWZpbmUgQ0ZHX0VOVl9TSVpFX1JFRFVORAkoQ0ZHX0VOVl9TSVpFKQogI2VuZGlmCiAKKy8qCisgKiBJUEwgKEluaXRpYWwgUHJvZ3JhbSBMb2FkZXIsIGludGVncmF0ZWQgaW5zaWRlIENQVSkKKyAqIFdpbGwgbG9hZCBmaXJzdCA0ayBmcm9tIE5BTkQgKFNQTCkgaW50byBjYWNoZSBhbmQgZXhlY3V0ZSBpdCBmcm9tIHRoZXJlLgorICoKKyAqIFNQTCAoU2Vjb25kYXJ5IFByb2dyYW0gTG9hZGVyKQorICogV2lsbCBsb2FkIHNwZWNpYWwgVS1Cb290IHZlcnNpb24gKE5VQikgZnJvbSBOQU5EIGFuZCBleGVjdXRlIGl0LiBUaGlzIFNQTAorICogaGFzIHRvIGZpdCBpbnRvIDRrQnl0ZS4gSXQgc2V0cyB1cCB0aGUgQ1BVIGFuZCBjb25maWd1cmVzIHRoZSBTRFJBTQorICogY29udHJvbGxlciBhbmQgdGhlIE5BTkQgY29udHJvbGxlciBzbyB0aGF0IHRoZSBzcGVjaWFsIFUtQm9vdCBpbWFnZSBjYW4gYmUKKyAqIGxvYWRlZCBmcm9tIE5BTkQgdG8gU0RSQU0uCisgKgorICogTlVCIChOQU5EIFUtQm9vdCkKKyAqIFRoaXMgTkFORCBVLUJvb3QgKE5VQikgaXMgYSBzcGVjaWFsIFUtQm9vdCB2ZXJzaW9uIHdoaWNoIGNhbiBiZSBzdGFydGVkCisgKiBmcm9tIFJBTS4gVGhlcmVmb3JlIGl0IG11c3RuJ3QgKHJlLSljb25maWd1cmUgdGhlIFNEUkFNIGNvbnRyb2xsZXIuCisgKgorICogT24gNDQwRVB4IHRoZSBTUEwgaXMgY29waWVkIHRvIFNEUkFNIGJlZm9yZSB0aGUgTkFORCBjb250cm9sbGVyIGlzCisgKiBzZXQgdXAuIFdoaWxlIHN0aWxsIHJ1bm5pbmcgZnJvbSBjYWNoZSwgSSBleHBlcmllbmNlZCBwcm9ibGVtcyBhY2Nlc3NpbmcKKyAqIHRoZSBOQU5EIGNvbnRyb2xsZXIuCXNyIC0gMjAwNi0wOC0yNQorICovCisjZGVmaW5lIENGR19OQU5EX0JPT1RfU1BMX1NSQwkweGZmZmZmMDAwCS8qIFNQTCBsb2NhdGlvbgkJCSovCisjZGVmaW5lIENGR19OQU5EX0JPT1RfU1BMX1NJWkUJKDQgPDwgMTApCS8qIFNQTCBzaXplCQkJKi8KKyNkZWZpbmUgQ0ZHX05BTkRfQk9PVF9TUExfRFNUCShDRkdfT0NNX0RBVEFfQUREUiArICgxNiA8PCAxMCkpIC8qIENvcHkgU1BMIGhlcmUqLworI2RlZmluZSBDRkdfTkFORF9VX0JPT1RfRFNUCTB4MDEwMDAwMDAJLyogTG9hZCBOVUIgdG8gdGhpcyBhZGRyCSovCisjZGVmaW5lIENGR19OQU5EX1VfQk9PVF9TVEFSVAlDRkdfTkFORF9VX0JPT1RfRFNUIC8qIFN0YXJ0IE5VQiBmcm9tIHRoaXMgYWRkcgkqLworI2RlZmluZSBDRkdfTkFORF9CT09UX1NQTF9ERUxUQQkoQ0ZHX05BTkRfQk9PVF9TUExfU1JDIC0gQ0ZHX05BTkRfQk9PVF9TUExfRFNUKQorCisvKgorICogRGVmaW5lIHRoZSBwYXJ0aXRpb25pbmcgb2YgdGhlIE5BTkQgY2hpcCAob25seSBSQU0gVS1Cb290IGlzIG5lZWRlZCBoZXJlKQorICovCisjZGVmaW5lIENGR19OQU5EX1VfQk9PVF9PRkZTCSgxNiA8PCAxMCkJLyogT2Zmc2V0IHRvIFJBTSBVLUJvb3QgaW1hZ2UJKi8KKyNkZWZpbmUgQ0ZHX05BTkRfVV9CT09UX1NJWkUJKDM4NCA8PCAxMCkJLyogU2l6ZSBvZiBSQU0gVS1Cb290IGltYWdlCSovCisKKy8qCisgKiBOb3cgdGhlIE5BTkQgY2hpcCBoYXMgdG8gYmUgZGVmaW5lZCAobm8gYXV0b2RldGVjdGlvbiB1c2VkISkKKyAqLworI2RlZmluZSBDRkdfTkFORF9QQUdFX1NJWkUJNTEyCQkvKiBOQU5EIGNoaXAgcGFnZSBzaXplCQkqLworI2RlZmluZSBDRkdfTkFORF9CTE9DS19TSVpFCSgxNiA8PCAxMCkJLyogTkFORCBjaGlwIGJsb2NrIHNpemUJCSovCisjZGVmaW5lIENGR19OQU5EX1BBR0VfQ09VTlQJMzIJCS8qIE5BTkQgY2hpcCBwYWdlIGNvdW50CQkqLworI2RlZmluZSBDRkdfTkFORF9CQURfQkxPQ0tfUE9TCTUJCS8qIExvY2F0aW9uIG9mIGJhZCBibG9jayBtYXJrZXIJKi8KKyN1bmRlZiBDRkdfTkFORF80X0FERFJfQ1lDTEUJCQkvKiBObyBmb3VydGggYWRkciB1c2VkICg8PTMyTUIpCSovCisKKyNkZWZpbmUgQ0ZHX05BTkRfRUNDU0laRQkyNTYKKyNkZWZpbmUgQ0ZHX05BTkRfRUNDQllURVMJMworI2RlZmluZSBDRkdfTkFORF9FQ0NTVEVQUwkoQ0ZHX05BTkRfUEFHRV9TSVpFIC8gQ0ZHX05BTkRfRUNDU0laRSkKKyNkZWZpbmUgQ0ZHX05BTkRfT09CU0laRQkxNgorI2RlZmluZSBDRkdfTkFORF9FQ0NUT1RBTAkoQ0ZHX05BTkRfRUNDQllURVMgKiBDRkdfTkFORF9FQ0NTVEVQUykKKyNkZWZpbmUgQ0ZHX05BTkRfRUNDUE9TCQl7MCwgMSwgMiwgMywgNiwgN30KKworI2lmZGVmIENGR19FTlZfSVNfSU5fTkFORAorLyoKKyAqIEZvciBOQU5EIGJvb3RpbmcgdGhlIGVudmlyb25tZW50IGlzIGVtYmVkZGVkIGluIHRoZSBVLUJvb3QgaW1hZ2UuIFBsZWFzZSB0YWtlCisgKiBsb29rIGF0IHRoZSBmaWxlIGJvYXJkL2FtY2Mvc2VxdW9pYS91LWJvb3QtbmFuZC5sZHMgZm9yIGRldGFpbHMuCisgKi8KKyNkZWZpbmUgQ0ZHX0VOVl9TSVpFCQlDRkdfTkFORF9CTE9DS19TSVpFCisjZGVmaW5lIENGR19FTlZfT0ZGU0VUCQkoQ0ZHX05BTkRfVV9CT09UX09GRlMgKyBDRkdfRU5WX1NJWkUpCisjZGVmaW5lIENGR19FTlZfT0ZGU0VUX1JFRFVORAkoQ0ZHX0VOVl9PRkZTRVQgKyBDRkdfRU5WX1NJWkUpCisjZW5kaWYKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogUkFNIChDUkFNKQogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTIwOSw3ICsyNzEsMTEgQEAKIAkidXBkYXRlPXByb3RlY3Qgb2ZmIGZmZmMwMDAwIGZmZmZmZmZmO2VyYSBmZmZjMDAwMCBmZmZmZmZmZjsiCVwKIAkJImNwLmIgJHtmaWxlYWRkcn0gZmZmYzAwMDAgJHtmaWxlc2l6ZX07IgkJXAogCQkic2V0ZW52IGZpbGVzaXplO3NhdmVlbnZcMCIJCQkJXAotCSJ1cGQ9cnVuIGxvYWQ7cnVuIHVwZGF0ZVwwIgkJCQkJXAorCSJ1cGQ9cnVuIGxvYWQgdXBkYXRlXDAiCQkJCQkJXAorCSJubG9hZD10ZnRwIDIwMDAwMCBhY2FkaWEvdS1ib290LW5hbmQuYmluXDAiCQkJXAorCSJudXBkYXRlPW5hbmQgZXJhc2UgMCA2MDAwMDtuYW5kIHdyaXRlIDIwMDAwMCAwIDYwMDAwOyIJCVwKKwkJInNldGVudiBmaWxlc2l6ZTtzYXZlZW52XDAiCQkJCVwKKwkibnVwZD1ydW4gbmxvYWQgbnVwZGF0ZVwwIgkJCQkJXAogCSJrb3ppbz1ib290bSBmZmM2MDAwMFwwIgkJCQkJXAogCSIiCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkicnVuIGZsYXNoX3NlbGYiCkBAIC0yMzMsMjcgKzI5OSw0NSBAQAogCiAjZGVmaW5lIENPTkZJR19TVVBQT1JUX1ZGQVQKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgICAgICAgKENPTkZJR19DTURfREZMCXwJXAotCQkJICAgICAgIENGR19DTURfQVNLRU5WCXwJXAotCQkJICAgICAgIENGR19DTURfREhDUAl8CVwKLQkJCSAgICAgICBDRkdfQ01EX0RUVAl8CVwKLQkJCSAgICAgICBDRkdfQ01EX0RJQUcJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9FRVBST00JfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9FTEYJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9GQVQJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9JMkMJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9JUlEJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9NSUkJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9OQU5ECXwJXAotCQkJICAgICAgIENGR19DTURfTkVUCXwJXAotCQkJICAgICAgIENGR19DTURfTkZTCXwJXAotCQkJICAgICAgIENGR19DTURfUENJCXwJXAotCQkJICAgICAgIENGR19DTURfUElORwl8CVwKLQkJCSAgICAgICBDRkdfQ01EX1JFR0lORk8JfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9VU0IpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RUVAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKworLyoKKyAqIE5vIE5PUiBvbiBBY2FkaWEgd2hlbiBOQU5ELWJvb3RpbmcKKyAqLworI2lmIGRlZmluZWQoQ09ORklHX05BTkRfVV9CT09UKSB8fCBkZWZpbmVkKENPTkZJR19OQU5EX1NQTCkKKyN1bmRlZiBDT05GSUdfQ01EX0ZMQVNICisjdW5kZWYgQ09ORklHX0NNRF9JTUxTCisjZW5kaWYKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTI2Miw3ICszNDYsNyBAQAogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJICAgICAgICAiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkgICAgICAgIDEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJICAgICAgICAyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTMwNSwxOSArMzg5LDIzIEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkJLyogRm9yIEFNQ0MgNDA1RVogQ1BVCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJCS8qIC4uLgkJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUqLwogI2VuZGlmCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEV4dGVybmFsIEJ1cyBDb250cm9sbGVyIChFQkMpIFNldHVwCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBDRkdfTkFORF9DUwkJMwkJLyogTkFORCBjaGlwIGNvbm5lY3RlZCB0byBDU3gJKi8KLQorI2lmICFkZWZpbmVkKENPTkZJR19OQU5EX1VfQk9PVCkgJiYgIWRlZmluZWQoQ09ORklHX05BTkRfU1BMKQorI2RlZmluZSBDRkdfTkFORF9DUwkJMwogLyogTWVtb3J5IEJhbmsgMCAoRmxhc2gpIGluaXRpYWxpemF0aW9uCQkJCQkJKi8KICNkZWZpbmUgQ0ZHX0VCQ19QQjBBUAkJMHgwMzMzNzIwMAogI2RlZmluZSBDRkdfRUJDX1BCMENSCQkweGZlMGJjMDAwCiAKKy8qIE1lbW9yeSBCYW5rIDMgKE5BTkQtRkxBU0gpIGluaXRpYWxpemF0aW9uCQkJCQkqLworI2RlZmluZSBDRkdfRUJDX1BCM0FQCQkweDAxODAwM2MwCisjZGVmaW5lIENGR19FQkNfUEIzQ1IJCShDRkdfTkFORF9BRERSIHwgMHgxYzAwMCkKKwogLyogSnVzdCBpbml0aWFsIGNvbmZpZ3VyYXRpb24gZm9yIENSQU0uIFdpbGwgYmUgY2hhbmdlZCBpbiBtZW1vcnkuYyB0byBzeW5jIG1vZGUqLwogLyogTWVtb3J5IEJhbmsgMSAoQ1JBTSkgaW5pdGlhbGl6YXRpb24JCQkJCQkqLwogI2RlZmluZSBDRkdfRUJDX1BCMUFQCQkweDAzMDQwMGMwCkBAIC0zMjYsMTAgKzQxNCwyNCBAQAogLyogTWVtb3J5IEJhbmsgMiAoQ1JBTSkgaW5pdGlhbGl6YXRpb24JCQkJCQkqLwogI2RlZmluZSBDRkdfRUJDX1BCMkFQCQkweDAzMDQwMGMwCiAjZGVmaW5lIENGR19FQkNfUEIyQ1IJCTB4MDIwYmMwMDAKKyNlbHNlCisjZGVmaW5lIENGR19OQU5EX0NTCQkwCQkvKiBOQU5EIGNoaXAgY29ubmVjdGVkIHRvIENTeAkqLworLyogTWVtb3J5IEJhbmsgMCAoTkFORC1GTEFTSCkgaW5pdGlhbGl6YXRpb24JCQkJCSovCisjZGVmaW5lIENGR19FQkNfUEIwQVAJCTB4MDE4MDAzYzAKKyNkZWZpbmUgQ0ZHX0VCQ19QQjBDUgkJKENGR19OQU5EX0FERFIgfCAweDFjMDAwKQogCi0vKiBNZW1vcnkgQmFuayAzIChOQU5ELUZMQVNIKSBpbml0aWFsaXphdGlvbgkJCQkJKi8KLSNkZWZpbmUgQ0ZHX0VCQ19QQjNBUAkJMHgwMTgwMDNjMAotI2RlZmluZSBDRkdfRUJDX1BCM0NSCQkoQ0ZHX05BTkRfQUREUiB8IDB4MWMwMDApCisvKgorICogV2hlbiBOQU5ELWJvb3RpbmcgdGhlIENSQU0gRUJDIHNldHVwIG11c3QgYmUgZG9uZSBpbiBzeW5jIG1vZGUsIHNpbmNlIHRoZQorICogTkFORC1TUEwgYWxyZWFkeSBpbml0aWFsaXplZCB0aGUgQ1JBTSBhbmQgRUJDIHRvIHN5bmMgbW9kZS4KKyAqLworLyogTWVtb3J5IEJhbmsgMSAoQ1JBTSkgaW5pdGlhbGl6YXRpb24JCQkJCQkqLworI2RlZmluZSBDRkdfRUJDX1BCMUFQCQkweDlDMDIwMUMwCisjZGVmaW5lIENGR19FQkNfUEIxQ1IJCTB4MDAwYmMwMDAKKworLyogTWVtb3J5IEJhbmsgMiAoQ1JBTSkgaW5pdGlhbGl6YXRpb24JCQkJCQkqLworI2RlZmluZSBDRkdfRUJDX1BCMkFQCQkweDlDMDIwMUMwCisjZGVmaW5lIENGR19FQkNfUEIyQ1IJCTB4MDIwYmMwMDAKKyNlbmRpZgogCiAvKiBNZW1vcnkgQmFuayA0IChDUExEKSBpbml0aWFsaXphdGlvbgkJCQkJCSovCiAjZGVmaW5lIENGR19FQkNfUEI0QVAJCTB4MDQwMDYwMDAKQEAgLTM0MSw5ICs0NDMsOSBAQAogICogR1BJTyBTZXR1cAogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNkZWZpbmUgQ0ZHX0dQSU9fQ1JBTV9DTEsJOAotI2RlZmluZSBDRkdfR1BJT19DUkFNX1dBSVQJOQorI2RlZmluZSBDRkdfR1BJT19DUkFNX1dBSVQJOQkJLyogR1BJTy1JbgkJKi8KICNkZWZpbmUgQ0ZHX0dQSU9fQ1JBTV9BRFYJMTAKLSNkZWZpbmUgQ0ZHX0dQSU9fQ1JBTV9DUkUJKDMyICsgMjEpCisjZGVmaW5lIENGR19HUElPX0NSQU1fQ1JFCSgzMiArIDIxKQkvKiBHUElPLU91dAkJKi8KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRGVmaW5pdGlvbnMgZm9yIEdQSU9fMCBzZXR1cCAoUFBDNDA1RVogc3BlY2lmaWMpCkBAIC0zNjUsMTAgKzQ2NywxMCBAQAogICogR1BJTzBbMjgtMzBdCS0gVHJhY2UgT3V0cHV0cyAvIFBXTSBJbnB1dHMKICAqIEdQSU8wWzMxXQktIFBXTV84IEkvTwogICovCi0jZGVmaW5lIENGR19HUElPMF9UQ1IJCTB4QzAwMDAwMDAKLSNkZWZpbmUgQ0ZHX0dQSU8wX09TUkwJCTB4NTAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0dQSU8wX1RDUgkJMHhDMEEwMDAwMAorI2RlZmluZSBDRkdfR1BJTzBfT1NSTAkJMHg1MDAwNDQwMAogI2RlZmluZSBDRkdfR1BJTzBfT1NSSAkJMHgwMjAwMDA1NQotI2RlZmluZSBDRkdfR1BJTzBfSVNSMUwJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0dQSU8wX0lTUjFMCQkweDAwMDAxMDAwCiAjZGVmaW5lIENGR19HUElPMF9JU1IxSAkJMHgwMDAwMDA1NQogI2RlZmluZSBDRkdfR1BJTzBfVFNSTAkJMHgwMjAwMDAwMAogI2RlZmluZSBDRkdfR1BJTzBfVFNSSAkJMHgwMDAwMDA1NQpAQCAtMzg3LDEzICs0ODksMTMgQEAKICAqIEdQSU8xWzE2XQktIFNQSV9TU18xX04gT3V0cHV0CiAgKiBHUElPMVsxNy0yMF0JLSBUcmFjZSBPdXRwdXQvRXh0ZXJuYWwgSW50ZXJydXB0cyBJUlEwIC0gSVJRMyBpbnB1dHMKICAqLwotI2RlZmluZSBDRkdfR1BJTzFfT1NSSAkJMHg1NTQ1NTU1NQorI2RlZmluZSBDRkdfR1BJTzFfVENSCQkweEZGRkY4NDE0CiAjZGVmaW5lIENGR19HUElPMV9PU1JMCQkweDQwMDAwMTEwCi0jZGVmaW5lIENGR19HUElPMV9JU1IxSAkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfR1BJTzFfT1NSSAkJMHg1NTQ1NTU1NQogI2RlZmluZSBDRkdfR1BJTzFfSVNSMUwJCTB4MTU1NTU0NDUKLSNkZWZpbmUgQ0ZHX0dQSU8xX1RTUkgJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0dQSU8xX0lTUjFICQkweDAwMDAwMDAwCiAjZGVmaW5lIENGR19HUElPMV9UU1JMCQkweDAwMDAwMDAwCi0jZGVmaW5lIENGR19HUElPMV9UQ1IJCTB4RkZGRjgwMTQKKyNkZWZpbmUgQ0ZHX0dQSU8xX1RTUkgJCTB4MDAwMDAwMDAKIAogLyoKICAqIEludGVybmFsIERlZmluaXRpb25zCkBAIC00MDMsNyArNTA1LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogICAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogICAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvYWRzNTEyMS5oIGIvaW5jbHVkZS9jb25maWdzL2FkczUxMjEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmVhYzFiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb25maWdzL2FkczUxMjEuaApAQCAtMCwwICsxLDQwMSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNyBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIEFEUzUxMjEgYm9hcmQgY29uZmlndXJhdGlvbiBmaWxlCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworI2RlZmluZSBERUJVRworI3VuZGVmIERFQlVHCisKKy8qCisgKiBNZW1vcnkgbWFwIGZvciB0aGUgQURTNTEyMSBib2FyZDoKKyAqCisgKiAweDAwMDBfMDAwMCAtIDB4MEZGRl9GRkZGCUREUiBSQU0gKDI1NiBNQikKKyAqIDB4MzAwMF8wMDAwIC0gMHgzMDAxX0ZGRkYJU1JBTSAoMTI4IEtCKQorICogMHg4MDAwXzAwMDAgLSAweDgwM0ZfRkZGRglJTU1SICg0IE1CKQorICogMHg4MjAwXzAwMDAgLSAweDgyMDBfMDAxRglDUExEICgzMiBCKQorICogMHhGQzAwXzAwMDAgLSAweEZGRkZfRkZGRglOT1IgQm9vdCBGTEFTSCAoNjQgTUIpCisgKi8KKworLyoKKyAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0UzMDAJCTEJLyogRTMwMCBGYW1pbHkgKi8KKyNkZWZpbmUgQ09ORklHX01QQzUxMlgJCTEJLyogTVBDNTEyWCBmYW1pbHkgKi8KKworI3VuZGVmIENPTkZJR19QQ0kKKworI2RlZmluZSBDRkdfTVBDNTEyWF9DTEtJTgk2NjAwMDAwMAkvKiBpbiBIeiAqLworCisjZGVmaW5lIENPTkZJR19CT0FSRF9FQVJMWV9JTklUX0YJCS8qIGNhbGwgYm9hcmRfZWFybHlfaW5pdF9mKCkgKi8KKworI2RlZmluZSBDRkdfSU1NUgkJMHg4MDAwMDAwMAorCisjZGVmaW5lIENGR19NRU1URVNUX1NUQVJUCTB4MDAyMDAwMDAgICAgICAvKiBtZW10ZXN0IHJlZ2lvbiAqLworI2RlZmluZSBDRkdfTUVNVEVTVF9FTkQJCTB4MDA0MDAwMDAKKworLyoKKyAqIEREUiBTZXR1cCAtIG1hbnVhbGx5IHNldCBhbGwgcGFyYW1ldGVycyBhcyB0aGVyZSdzIG5vIFNQRCBldGMuCisgKi8KKyNkZWZpbmUgQ0ZHX0REUl9TSVpFCQkyNTYJCS8qIE1CICovCisjZGVmaW5lIENGR19ERFJfQkFTRQkJMHgwMDAwMDAwMAkvKiBERFIgaXMgc3lzdGVtIG1lbW9yeSovCisjZGVmaW5lIENGR19TRFJBTV9CQVNFCQlDRkdfRERSX0JBU0UKKworLyogRERSIENvbnRyb2xsZXIgQ29uZmlndXJhdGlvbgorICoKKyAqIFNZU19DRkc6CisgKglbMzE6MzFdCU1ERFJDIFNvZnQgUmVzZXQ6CURpYWJsZWQKKyAqCVszMDozMF0JRFJBTSBDS0UgcGluOgkJRW5hYmxlZAorICoJWzI5OjI5XQlEUkFNIENMSzoJCUVuYWJsZWQKKyAqCVsyODoyOF0JQ29tbWFuZCBNb2RlOgkJRW5hYmxlZCAoRm9yIGluaXRpYWxpemF0aW9uIG9ubHkpCisgKglbMjc6MjVdCURSQU0gUm93IFNlbGVjdDoJZHJhbV9yb3dbMTU6MF0gPSBtYWdlbnRhX2FkZHJlc3NbMjU6MTBdCisgKglbMjQ6MjFdCURSQU0gQmFuayBTZWxlY3Q6CWRyYW1fYmFua1sxOjBdID0gbWFnZW50YV9hZGRyZXNzWzExOjEwXQorICoJWzIwOjE5XQlSZWFkIFRlc3Q6CQlET04nVCBVU0UKKyAqCVsxODoxOF0JU2VsZiBSZWZyZXNoOgkJRW5hYmxlZAorICoJWzE3OjE3XQkxNmJpdCBNb2RlOgkJRGlzYWJsZWQKKyAqCVsxNjoxM10gUmVhZHkgRGVsYXk6CQkyCisgKglbMTI6MTJdCUhhbGYgRFFTIERlbGF5OgkJRGlzYWJsZWQKKyAqCVsxMToxMV0JUXVhcnRlciBEUVMgRGVsYXk6CURpc2FibGVkCisgKglbMTA6MDhdCVdyaXRlIERlbGF5OgkJMgorICoJWzA3OjA3XQlFYXJseSBPRFQ6CQlEaXNhYmxlZAorICoJWzA2OjA2XQlPbiBESUUgVGVybWluYXRpb246CURpc2FibGVkCisgKglbMDU6MDVdCUZJRk8gT3ZlcmZsb3cgQ2xlYXI6CURPTidUIFVTRSBoZXJlCisgKglbMDQ6MDRdCUZJRk8gVW5kZXJmbG93IENsZWFyOglET04nVCBVU0UgaGVyZQorICoJWzAzOjAzXQlGSUZPIE92ZXJmbG93IFBlbmRpbmc6CURPTidUIFVTRSBoZXJlCisgKglbMDI6MDJdCUZJRk8gVW5kZXJsZm93IFBlbmRpbmc6CURPTidUIFVTRSBoZXJlCisgKglbMDE6MDFdCUZJRk8gT3Zlcmxmb3cgRW5hYmxlZDoJRW5hYmxlZAorICoJWzAwOjAwXQlGSUZPIFVuZGVyZmxvdyBFbmFibGVkOglFbmFibGVkCisgKiBUSU1FX0NGRzAKKyAqCVszMToxNl0JRFJBTSBSZWZyZXNoIFRpbWU6CTAgQ1NCIGNsb2NrcworICoJWzE1OjhdCURSQU0gQ29tbWFuZCBUaW1lOgkwIENTQiBjbG9ja3MKKyAqCVswNzowMF0JRFJBTSBQcmVjaGFyZ2UgVGltZToJMCBDU0IgY2xvY2tzCisgKiBUSU1FX0NGRzEKKyAqCVszMToyNl0JRFJBTSB0UkZDOgorICoJWzI1OjIxXQlEUkFNIHRXUjE6CisgKglbMjA6MTddCURSQU0gdFdSVDE6CisgKglbMTY6MTFdCURSQU0gdERSUjoKKyAqCVsxMDowNV0JRFJBTSB0UkM6CisgKglbMDQ6MDBdCURSQU0gdFJBUzoKKyAqIFRJTUVfQ0ZHMgorICoJWzMxOjI4XQlEUkFNIHRSQ0Q6CisgKglbMjc6MjNdCURSQU0gdEZBVzoKKyAqCVsyMjoxOV0JRFJBTSB0UlRXMToKKyAqCVsxODoxNV0JRFJBTSB0Q0NEOgorICoJWzE0OjEwXSBEUkFNIHRSVFA6CisgKglbMDk6MDVdCURSQU0gdFJQOgorICoJWzA0OjAwXSBEUkFNIHRSUEEKKyAqLworCisjZGVmaW5lIENGR19NRERSQ19TWVNfQ0ZHCTB4Rjg2MDQyMDAKKyNkZWZpbmUgQ0ZHX01ERFJDX1NZU19DRkdfUlVOCTB4RTg2MDQyMDAKKyNkZWZpbmUgQ0ZHX01ERFJDX1NZU19DRkdfRU4JMHgzMDAwMDAwMAorI2RlZmluZSBDRkdfTUREUkNfVElNRV9DRkcwCTB4MDAwMDI4MUUKKyNkZWZpbmUgQ0ZHX01ERFJDX1RJTUVfQ0ZHMF9SVU4JMHgwMUY0MjgxRQorI2RlZmluZSBDRkdfTUREUkNfVElNRV9DRkcxCTB4NTRFQzExNjgKKyNkZWZpbmUgQ0ZHX01ERFJDX1RJTUVfQ0ZHMgkweDM1MjEwODY0CisKKyNkZWZpbmUgQ0ZHX01JQ1JPTl9OT1AJCTB4MDEzODAwMDAKKyNkZWZpbmUgQ0ZHX01JQ1JPTl9QQ0hHX0FMTAkweDAxMTAwNDAwCisjZGVmaW5lIENGR19NSUNST05fTVIJCTB4MDEwMDAwMjIKKyNkZWZpbmUgQ0ZHX01JQ1JPTl9FTTIJCTB4MDEwMjAwMDAKKyNkZWZpbmUgQ0ZHX01JQ1JPTl9FTTMJCTB4MDEwMzAwMDAKKyNkZWZpbmUgQ0ZHX01JQ1JPTl9FTl9ETEwJMHgwMTAxMDAwMAorI2RlZmluZSBDRkdfTUlDUk9OX1JTVF9ETEwJMHgwMTAwMDkzMgorI2RlZmluZSBDRkdfTUlDUk9OX1JGU0gJCTB4MDEwODAwMDAKKyNkZWZpbmUgQ0ZHX01JQ1JPTl9JTklUX0RFVl9PUAkweDAxMDAwODMyCisjZGVmaW5lIENGR19NSUNST05fT0NEX0RFRkFVTFQJMHgwMTAxMDc4MAorI2RlZmluZSBDRkdfTUlDUk9OX09DRF9FWElUCTB4MDEwMTA0MDAKKworLyogRERSIFByaW9yaXR5IE1hbmFnZXIgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBDRkdfTUREUkNHUlBfUE1fQ0ZHMQkweDAwMDc3N0FBCisjZGVmaW5lIENGR19NRERSQ0dSUF9QTV9DRkcyCTB4MDAwMDAwNTUKKyNkZWZpbmUgQ0ZHX01ERFJDR1JQX0hJUFJJT19DRkcJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfTUREUkNHUlBfTFVUMF9NVSAgICAweDExMTExMTE3CisjZGVmaW5lIENGR19NRERSQ0dSUF9MVVQwX01MCTB4Nzc3Nzc3N0EKKyNkZWZpbmUgQ0ZHX01ERFJDR1JQX0xVVDFfTVUgICAgMHg0NDQ0RUVFRQorI2RlZmluZSBDRkdfTUREUkNHUlBfTFVUMV9NTAkweEVFRUVFRUVFCisjZGVmaW5lIENGR19NRERSQ0dSUF9MVVQyX01VICAgIDB4NDQ0NDQ0NDQKKyNkZWZpbmUgQ0ZHX01ERFJDR1JQX0xVVDJfTUwJMHg0NDQ0NDQ0NAorI2RlZmluZSBDRkdfTUREUkNHUlBfTFVUM19NVSAgICAweDU1NTU1NTU1CisjZGVmaW5lIENGR19NRERSQ0dSUF9MVVQzX01MCTB4NTU1NTU1NTgKKyNkZWZpbmUgQ0ZHX01ERFJDR1JQX0xVVDRfTVUgICAgMHgxMTExMTExMQorI2RlZmluZSBDRkdfTUREUkNHUlBfTFVUNF9NTAkweDExMTExMTdDCisjZGVmaW5lIENGR19NRERSQ0dSUF9MVVQwX0FVICAgIDB4MzMzMzMzNzcKKyNkZWZpbmUgQ0ZHX01ERFJDR1JQX0xVVDBfQUwJMHg3Nzc3RUVFRQorI2RlZmluZSBDRkdfTUREUkNHUlBfTFVUMV9BVSAgICAweDExMTExMTExCisjZGVmaW5lIENGR19NRERSQ0dSUF9MVVQxX0FMCTB4MTExMTExMTEKKyNkZWZpbmUgQ0ZHX01ERFJDR1JQX0xVVDJfQVUgICAgMHgxMTExMTExMQorI2RlZmluZSBDRkdfTUREUkNHUlBfTFVUMl9BTAkweDExMTExMTExCisjZGVmaW5lIENGR19NRERSQ0dSUF9MVVQzX0FVICAgIDB4MTExMTExMTEKKyNkZWZpbmUgQ0ZHX01ERFJDR1JQX0xVVDNfQUwJMHgxMTExMTExMQorI2RlZmluZSBDRkdfTUREUkNHUlBfTFVUNF9BVSAgICAweDExMTExMTExCisjZGVmaW5lIENGR19NRERSQ0dSUF9MVVQ0X0FMCTB4MTExMTExMTEKKworLyoKKyAqIE5PUiBGTEFTSCBvbiB0aGUgTG9jYWwgQnVzCisgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX0NGSQkJCQkvKiB1c2UgdGhlIENvbW1vbiBGbGFzaCBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX0NGSV9EUklWRVIJCQkvKiB1c2UgdGhlIENGSSBkcml2ZXIgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX0JBU0UJCTB4RkMwMDAwMDAJLyogc3RhcnQgb2YgRkxBU0ggICAqLworI2RlZmluZSBDRkdfRkxBU0hfU0laRQkJMHgwNDAwMDAwMAkvKiBtYXggZmxhc2ggc2l6ZSBpbiBieXRlcyAqLworI2RlZmluZSBDRkdfRkxBU0hfVVNFX0JVRkZFUl9XUklURQorCisjZGVmaW5lIENGR19NQVhfRkxBU0hfQkFOS1MJMQkJLyogbnVtYmVyIG9mIGJhbmtzICovCisjZGVmaW5lIENGR19GTEFTSF9CQU5LU19MSVNUIAl7Q0ZHX0ZMQVNIX0JBU0V9CisjZGVmaW5lIENGR19NQVhfRkxBU0hfU0VDVAkyNTYJCS8qIG1heCBzZWN0b3JzIHBlciBkZXZpY2UgKi8KKworI3VuZGVmIENGR19GTEFTSF9DSEVDS1NVTQorCisvKgorICogQ1BMRCByZWdpc3RlcnMgYXJlYSBpcyByZWFsbHkgb25seSAzMiBieXRlcyBpbiBzaXplLCBidXQgdGhlIHNtYWxsZXN0IHBvc3NpYmxlIExQCisgKiB3aW5kb3cgaXMgNjRLQgorICovCisjZGVmaW5lIENGR19DUExEX0JBU0UJCTB4ODIwMDAwMDAKKyNkZWZpbmUgQ0ZHX0NQTERfU0laRQkJMHgwMDAxMDAwMAkvKiA2NCBLQiAqLworCisjZGVmaW5lIENGR19TUkFNX0JBU0UJCTB4MzAwMDAwMDAKKyNkZWZpbmUgQ0ZHX1NSQU1fU0laRQkJMHgwMDAyMDAwMAkvKiAxMjggS0IgKi8KKworI2RlZmluZSBDRkdfQ1MwX0NGRwkJMHgwNTA1OTMxMAkvKiBBTEUgYWN0aXZlIGxvdywgZGF0YSBzaXplIDRieXRlcyAqLworI2RlZmluZSBDRkdfQ1MyX0NGRwkJMHgwNTA1OTAxMAkvKiBBTEUgYWN0aXZlIGxvdywgZGF0YSBzaXplIDFieXRlICovCisKKy8qIFVzZSBTUkFNIGZvciBpbml0aWFsIHN0YWNrICovCisjZGVmaW5lIENGR19JTklUX1JBTV9BRERSCUNGR19TUkFNX0JBU0UJCS8qIEluaXRpYWwgUkFNIGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0VORAlDRkdfU1JBTV9TSVpFCQkvKiBFbmQgb2YgdXNlZCBhcmVhIGluIFJBTSAqLworCisjZGVmaW5lIENGR19HQkxfREFUQV9TSVpFCTB4MTAwCQkJLyogbnVtIGJ5dGVzIGluaXRpYWwgZGF0YSAqLworI2RlZmluZSBDRkdfR0JMX0RBVEFfT0ZGU0VUCShDRkdfSU5JVF9SQU1fRU5EIC0gQ0ZHX0dCTF9EQVRBX1NJWkUpCisjZGVmaW5lIENGR19JTklUX1NQX09GRlNFVAlDRkdfR0JMX0RBVEFfT0ZGU0VUCisKKyNkZWZpbmUgQ0ZHX01PTklUT1JfQkFTRQlURVhUX0JBU0UJCS8qIFN0YXJ0IG9mIG1vbml0b3IgKi8KKyNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOCQkoMjU2ICogMTAyNCkJCS8qIFJlc2VydmUgMjU2IGtCIGZvciBNb24gKi8KKyNkZWZpbmUgQ0ZHX01BTExPQ19MRU4JCSg1MTIgKiAxMDI0KQkJLyogUmVzZXJ2ZWQgZm9yIG1hbGxvYyAqLworCisvKgorICogU2VyaWFsIFBvcnQKKyAqLworI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWCAgICAgMQorI3VuZGVmIENPTkZJR19TRVJJQUxfU09GVFdBUkVfRklGTworCisvKgorICogU2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19QU0NfQ09OU09MRQkzCS8qIGNvbnNvbGUgaXMgb24gUFNDMyAqLworI2lmIENPTkZJR19QU0NfQ09OU09MRSAhPSAzCisjZXJyb3IgQ09ORklHX1BTQ19DT05TT0xFIG11c3QgYmUgMworI2VuZGlmCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCS8qIC4uLiBhdCAxMTUyMDAgYnBzICovCisjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRSAgXAorCXszMDAsIDYwMCwgMTIwMCwgMjQwMCwgNDgwMCwgOTYwMCwgMTkyMDAsIDM4NDAwLDExNTIwMH0KKworI2RlZmluZSBDT05TT0xFX0ZJRk9fVFhfU0laRQlGSUZPQ19QU0MzX1RYX1NJWkUKKyNkZWZpbmUgQ09OU09MRV9GSUZPX1RYX0FERFIJRklGT0NfUFNDM19UWF9BRERSCisjZGVmaW5lIENPTlNPTEVfRklGT19SWF9TSVpFCUZJRk9DX1BTQzNfUlhfU0laRQorI2RlZmluZSBDT05TT0xFX0ZJRk9fUlhfQUREUglGSUZPQ19QU0MzX1JYX0FERFIKKworI2RlZmluZSBDT05GSUdfQ01ETElORV9FRElUSU5HCTEJLyogYWRkIGNvbW1hbmQgbGluZSBoaXN0b3J5CSovCisvKiBVc2UgdGhlIEhVU0ggcGFyc2VyICovCisjZGVmaW5lIENGR19IVVNIX1BBUlNFUgorI2lmZGVmICBDRkdfSFVTSF9QQVJTRVIKKyNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMiAiPiAiCisjZW5kaWYKKworLyogSTJDICovCisjZGVmaW5lIENPTkZJR19IQVJEX0kyQwkJCS8qIEkyQyB3aXRoIGhhcmR3YXJlIHN1cHBvcnQgKi8KKyN1bmRlZiBDT05GSUdfU09GVF9JMkMJCQkvKiBzbyBkaXNhYmxlIGJpdC1iYW5nZWQgSTJDICovCisjZGVmaW5lIENPTkZJR19JMkNfTVVMVElfQlVTCisjZGVmaW5lIENPTkZJR19JMkNfQ01EX1RSRUUKKyNkZWZpbmUgQ0ZHX0kyQ19TUEVFRAkJMTAwMDAwCS8qIEkyQyBzcGVlZCBhbmQgc2xhdmUgYWRkcmVzcyAqLworI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCisjaWYgMAorI2RlZmluZSBDRkdfSTJDX05PUFJPQkVTCXt7MCwweDY5fX0JKiBEb24ndCBwcm9iZSB0aGVzZSBhZGRycyAqLworI2VuZGlmCisKKy8qCisgKiBFdGhlcm5ldCBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX01QQzUxMnhfRkVDCTEKKyNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQorI2RlZmluZSBDT05GSUdfUEhZX0FERFIJCTB4MQorI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudAkJKi8KKworI2lmIDAKKy8qCisgKiBDb25maWd1cmUgb24tYm9hcmQgUlRDCisgKi8KKyNkZWZpbmUgQ09ORklHX1JUQ19EUzEzNzQJCQkvKiB1c2UgZHMxMzc0IHJ0YyB2aWEgaTJjCSovCisjZGVmaW5lIENGR19JMkNfUlRDX0FERFIJCTB4NjgJLyogYXQgYWRkcmVzcyAweDY4CQkqLworI2VuZGlmCisKKy8qCisgKiBFbnZpcm9ubWVudAorICovCisjZGVmaW5lIENGR19FTlZfSVNfSU5fRkxBU0gJMQorLyogVGhpcyBoYXMgdG8gYmUgYSBtdWx0aXBsZSBvZiB0aGUgRmxhc2ggc2VjdG9yIHNpemUgKi8KKyNkZWZpbmUgQ0ZHX0VOVl9BRERSCQkoQ0ZHX01PTklUT1JfQkFTRSArIENGR19NT05JVE9SX0xFTikKKyNkZWZpbmUgQ0ZHX0VOVl9TSVpFCQkweDIwMDAKKyNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJMHg0MDAwMAkvKiBvbmUgc2VjdG9yICgyNTZLKSBmb3IgZW52ICovCisKKy8qIEFkZHJlc3MgYW5kIHNpemUgb2YgUmVkdW5kYW50IEVudmlyb25tZW50IFNlY3RvcgkqLworI2RlZmluZSBDRkdfRU5WX0FERFJfUkVEVU5ECShDRkdfRU5WX0FERFIgKyBDRkdfRU5WX1NFQ1RfU0laRSkKKyNkZWZpbmUgQ0ZHX0VOVl9TSVpFX1JFRFVORAkoQ0ZHX0VOVl9TSVpFKQorCisjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkICovCisjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZSAqLworCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNlbmRpZgorCisvKgorICogV2F0Y2hkb2cgdGltZW91dCA9IENGR19XQVRDSERPR19WQUxVRSAqIDY1NTM2IC8gSVBTIGNsb2NrLgorICogRm9yIGV4YW1wbGUsIHdoZW4gSVBTIGlzIHNldCB0byA2Nk1IeiBhbmQgQ0ZHX1dBVENIRE9HX1ZBTFVFIGlzIHNldAorICogdG8gMHhGRkZGLCB3YXRjaGRvZyB0aW1lb3V0cyBhZnRlciBhYm91dCA2NHMuIEZvciBkZXRhaWxzIHJlZmVyCisgKiB0byBjaGFwdGVyIDM2IG9mIHRoZSBNUEM1MTIxZSBSZWZlcmVuY2UgTWFudWFsLgorICovCisjZGVmaW5lIENPTkZJR19XQVRDSERPRwkJCS8qIGVuYWJsZSB3YXRjaGRvZyAqLworI2RlZmluZSBDRkdfV0FUQ0hET0dfVkFMVUUgMHhGRkZGCisKKyAvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5ICovCisjZGVmaW5lIENGR19MT0FEX0FERFIJMHgyMDAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCisjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgKi8KKworI2lmZGVmIENPTkZJR19DTURfS0dEQgorCSNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLworI2Vsc2UKKwkjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLworI2VuZGlmCisKKworI2RlZmluZSBDRkdfUEJTSVpFIChDRkdfQ0JTSVpFICsgc2l6ZW9mKENGR19QUk9NUFQpICsgMTYpIC8qIFByaW50IEJ1ZmZlciBTaXplICovCisjZGVmaW5lIENGR19NQVhBUkdTCTE2CQkvKiBtYXggbnVtYmVyIG9mIGNvbW1hbmQgYXJncyAqLworI2RlZmluZSBDRkdfQkFSR1NJWkUJQ0ZHX0NCU0laRQkvKiBCb290IEFyZ3VtZW50IEJ1ZmZlciBTaXplICovCisjZGVmaW5lIENGR19IWgkJMTAwMAkJLyogZGVjcmVtZW50ZXIgZnJlcTogMW1zIHRpY2tzICovCisKKy8qCisgKiBGb3IgYm9vdGluZyBMaW51eCwgdGhlIGJvYXJkIGluZm8gYW5kIGNvbW1hbmQgbGluZSBkYXRhCisgKiBoYXZlIHRvIGJlIGluIHRoZSBmaXJzdCA4IE1CIG9mIG1lbW9yeSwgc2luY2UgdGhpcyBpcworICogdGhlIG1heGltdW0gbWFwcGVkIGJ5IHRoZSBMaW51eCBrZXJuZWwgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICovCisjZGVmaW5lIENGR19CT09UTUFQU1oJKDggPDwgMjApCS8qIEluaXRpYWwgTWVtb3J5IG1hcCBmb3IgTGludXgqLworCisvKiBDYWNoZSBDb25maWd1cmF0aW9uICovCisjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMzI3NjgKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCisjaWZkZWYgQ09ORklHX0NNRF9LR0RCCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKmxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlKi8KKyNlbmRpZgorCisjZGVmaW5lIENGR19ISUQwX0lOSVQJMHgwMDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0hJRDBfRklOQUwJSElEMF9FTkFCTEVfTUFDSElORV9DSEVDSworI2RlZmluZSBDRkdfSElEMglISUQyX0hCRQorCisvKgorICogSW50ZXJuYWwgRGVmaW5pdGlvbnMKKyAqCisgKiBCb290IEZsYWdzCisgKi8KKyNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCisjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QgKi8KKworI2lmZGVmIENPTkZJR19DTURfS0dEQgorI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgb2Yga2dkYiBzZXJpYWwgcG9ydCAqLworI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KKyNlbmRpZgorCisvKgorICogRW52aXJvbm1lbnQgQ29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFCisKKyNkZWZpbmUgQ09ORklHX0hPU1ROQU1FCQlhZHM1MTIxCisjZGVmaW5lIENPTkZJR19CT09URklMRQkJdUltYWdlCisKKyNkZWZpbmUgQ09ORklHX0xPQURBRERSCQkyMDAwMDAJLyogZGVmYXVsdCBsb2NhdGlvbiBmb3IgdGZ0cCBhbmQgYm9vdG0gKi8KKworI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUJLyogLTEgZGlzYWJsZXMgYXV0by1ib290ICovCisjdW5kZWYgIENPTkZJR19CT09UQVJHUwkJCS8qIHRoZSBib290IGNvbW1hbmQgd2lsbCBzZXQgYm9vdGFyZ3MgKi8KKworI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAorCisjZGVmaW5lIENPTkZJR19QUkVCT09UCSJlY2hvOyIJXAorCSJlY2hvIFR5cGUgXCJydW4gZmxhc2hfbmZzXCIgdG8gbW91bnQgcm9vdCBmaWxlc3lzdGVtIG92ZXIgTkZTOyIgXAorCSJlY2hvIgorCisjZGVmaW5lCUNPTkZJR19FWFRSQV9FTlZfU0VUVElOR1MJCQkJCVwKKwkibmV0ZGV2PWV0aDBcMCIJCQkJCQkJXAorCSJuZnNhcmdzPXNldGVudiBib290YXJncyByb290PS9kZXYvbmZzIHJ3ICIJCQlcCisJCSJuZnNyb290PSR7c2VydmVyaXB9OiR7cm9vdHBhdGh9XDAiCQkJXAorCSJyYW1hcmdzPXNldGVudiBib290YXJncyByb290PS9kZXYvcmFtIHJ3XDAiCQkJXAorCSJhZGRpcD1zZXRlbnYgYm9vdGFyZ3MgJHtib290YXJnc30gIgkJCQlcCisJCSJpcD0ke2lwYWRkcn06JHtzZXJ2ZXJpcH06JHtnYXRld2F5aXB9OiR7bmV0bWFza30iCVwKKwkJIjoke2hvc3RuYW1lfToke25ldGRldn06b2ZmIHBhbmljPTFcMCIJCQlcCisJImFkZHR0eT1zZXRlbnYgYm9vdGFyZ3MgJHtib290YXJnc30gY29uc29sZT10dHlTMCwke2JhdWRyYXRlfVwwIlwKKwkiZmxhc2hfbmZzPXJ1biBuZnNhcmdzIGFkZGlwIGFkZHR0eTsiCQkJCVwKKwkJImJvb3RtICR7a2VybmVsX2FkZHJ9XDAiCQkJCVwKKwkiZmxhc2hfc2VsZj1ydW4gcmFtYXJncyBhZGRpcCBhZGR0dHk7IgkJCQlcCisJCSJib290bSAke2tlcm5lbF9hZGRyfSAke3JhbWRpc2tfYWRkcn1cMCIJCVwKKwkibmV0X25mcz10ZnRwIDIwMDAwMCAke2Jvb3RmaWxlfTtydW4gbmZzYXJncyBhZGRpcCBhZGR0dHk7IglcCisJCSJib290bVwwIgkJCQkJCVwKKwkibG9hZD10ZnRwIDIwMDAwMCAvdGZ0cGJvb3QvYWRzNTEyMS91LWJvb3QuYmluXDAiCQlcCisJInVwZGF0ZT1wcm90ZWN0IG9mZiBGRkYwMDAwMCArJHtmaWxlc2l6ZX07IgkJCVwKKwkJImVyYSBGRkYwMDAwMCArJHtmaWxlc2l6ZX07Y3AuYiAyMDAwMDAgRkZGMDAwMDAgJHtmaWxlc2l6ZX1cMCIgXAorCSJ1cGQ9cnVuIGxvYWQ7cnVuIHVwZGF0ZVwwIgkJCQkJXAorCSIiCisKKyNkZWZpbmUgQ09ORklHX05GU0JPT1RDT01NQU5ECQkJCQkJXAorCSJzZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L25mcyBydyAiCQkJCVwKKwkJIm5mc3Jvb3Q9JHNlcnZlcmlwOiRyb290cGF0aCAiCQkJCVwKKwkJImlwPSRpcGFkZHI6JHNlcnZlcmlwOiRnYXRld2F5aXA6JG5ldG1hc2s6JGhvc3RuYW1lOiRuZXRkZXY6b2ZmICIgXAorCQkiY29uc29sZT0kY29uc29sZWRldiwkYmF1ZHJhdGUgJG90aGJvb3RhcmdzOyIJCVwKKwkidGZ0cCAkbG9hZGFkZHIgJGJvb3RmaWxlOyIJCQkJCVwKKwkidGZ0cCAkZmR0YWRkciAkZmR0ZmlsZTsiCQkJCQlcCisJImJvb3RtICRsb2FkYWRkciAtICRmZHRhZGRyIgorCisjZGVmaW5lIENPTkZJR19SQU1CT09UQ09NTUFORAkJCQkJCVwKKwkic2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9yYW0gcncgIgkJCQlcCisJCSJjb25zb2xlPSRjb25zb2xlZGV2LCRiYXVkcmF0ZSAkb3RoYm9vdGFyZ3M7IgkJXAorCSJ0ZnRwICRyYW1kaXNrYWRkciAkcmFtZGlza2ZpbGU7IgkJCQlcCisJInRmdHAgJGxvYWRhZGRyICRib290ZmlsZTsiCQkJCQlcCisJInRmdHAgJGZkdGFkZHIgJGZkdGZpbGU7IgkJCQkJXAorCSJib290bSAkbG9hZGFkZHIgJHJhbWRpc2thZGRyICRmZHRhZGRyIgorCisjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkicnVuIGZsYXNoX3NlbGYiCisKKyNlbmRpZgkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvYWRzdml4LmggYi9pbmNsdWRlL2NvbmZpZ3MvYWRzdml4LmgKaW5kZXggYzQxMDg5MS4uNzAzZDMxMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2Fkc3ZpeC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9hZHN2aXguaApAQCAtNjgsMTAgKzY4LDI4IEBACiAKICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04gICAxCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoKENPTkZJR19DTURfREZMICYgfkNGR19DTURfTkVUKSB8IENGR19DTURfTU1DIHwgQ0ZHX0NNRF9GQVQgfCBDRkdfQ01EX0lERSB8IENGR19DTURfUENNQ0lBKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfTU1DCisjZGVmaW5lIENPTkZJR19DTURfUENNQ0lBCisKKyN1bmRlZiBDT05GSUdfQ01EX05FVAorCiAKICN1bmRlZiBDT05GSUdfU0hPV19CT09UX1BST0dSRVNTCiAKQEAgLTE2Miw3ICsxODAsNyBAQAogI2RlZmluZSBDT05GSUdfQ01ETElORV9UQUcJIDEJLyogZW5hYmxlIHBhc3Npbmcgb2YgQVRBR3MJKi8KIC8qICNkZWZpbmUgQ09ORklHX0lOSVRSRF9UQUcJIDEgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvYWV2LmggYi9pbmNsdWRlL2NvbmZpZ3MvYWV2LmgKaW5kZXggNmMyYTM2MC4uNWJhYjc5MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2Fldi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9hZXYuaApAQCAtNDQsMTEgKzQ0LDYgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAgKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QJICAgICAqLwogCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKLSMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KLSNlbmRpZgotCiAvKgogICogU2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgogICovCkBAIC05MSwzNCArODYsNDIgQEAKIAkJCQkgQ0ZHX1BPU1RfSTJDKQogCiAjaWZkZWYgQ09ORklHX1BPU1QKLSNkZWZpbmUgQ0ZHX0NNRF9QT1NUX0RJQUcgQ0ZHX0NNRF9ESUFHCiAvKiBwcmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIHBvc3Rfd29yZCBhdCBlbmQgb2Ygb24tY2hpcCBTUkFNICovCiAjZGVmaW5lIE1QQzVYWFhfU1JBTV9QT1NUX1NJWkUgTVBDNVhYWF9TUkFNX1NJWkUtNAotI2Vsc2UKLSNkZWZpbmUgQ0ZHX0NNRF9QT1NUX0RJQUcgMAogI2VuZGlmCiAKLS8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKLSAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlBRERfQk1QX0NNRAl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRUNITwl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9QT1NUX0RJQUcgfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPIHwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VDSE8KKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKworI2lmZGVmIENPTkZJR19QT1NUCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2VuZGlmCisKIAogI2RlZmluZQlDT05GSUdfVElNRVNUQU1QCQkvKiBkaXNwbGF5IGltYWdlIHRpbWVzdGFtcHMgKi8KIApAQCAtMTczLDcgKzE3Niw3IEBACiAgKiBQQ0kgQnVzIGNsb2NraW5nIGNvbmZpZ3VyYXRpb24KICAqCiAgKiBBY3R1YWxseSBhIFBDSSBDbG9jayBvZiA2NiBNSHogaXMgb25seSBzZXQgKGluIGNwdV9pbml0LmMpIGlmCi0gKiBDRkdfSVBCQ0xLX0VRVUFMU19YTEJDTEsgaXMgZGVmaW5lZC4gVGhpcyBpcyBiZWNhdXNlIGEgUENJIENsb2NrIAorICogQ0ZHX0lQQkNMS19FUVVBTFNfWExCQ0xLIGlzIGRlZmluZWQuIFRoaXMgaXMgYmVjYXVzZSBhIFBDSSBDbG9jawogICogb2YgNjYgTUh6IHlldCBoYXNuJ3QgYmVlbiB0ZXN0ZWQgd2l0aCBhIElQQiBCdXMgQ2xvY2sgb2YgNjYgTUh6LgogICovCiAjZGVmaW5lIENGR19QQ0lDTEtfRVFVQUxTX0lQQkNMS19ESVYyCS8qIGRlZmluZSBmb3IgNjZNSHogc3BlZWQgKi8KQEAgLTMyNCw3ICszMjcsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtMzQzLDkgKzM0NiwxMyBAQAogCiAjZGVmaW5lIENGR19IWgkJCTEwMDAJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcyAqLwogCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCisjZW5kaWYKKwogLyoKLSAqIEVuYWJsZSBsb29wdyBjb21tYW5kby4gVGhpcyBoYXMgb25seSBhZmZlY3QsIGlmIENGR19DTURfTUVNIGlzIGRlZmluZWQsCi0gKiB3aGljaCBpcyBub3JtYWxseSBwYXJ0IG9mIHRoZSBkZWZhdWx0IGNvbW1hbmRzIChDRlZfQ01EX0RGTCkKKyAqIEVuYWJsZSBsb29wdyBjb21tYW5kLgogICovCiAjZGVmaW5lIENPTkZJR19MT09QVwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvYWxwci5oIGIvaW5jbHVkZS9jb25maWdzL2FscHIuaAppbmRleCA2N2Y2MmQzLi5kODhjM2FkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvYWxwci5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9hbHByLmgKQEAgLTI5LDYgKzI5LDcgQEAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjZGVmaW5lIENPTkZJR19BTFBSCQkxCSAgICAvKiBCb2FyZCBpcyBlYm9ueQkJKi8KICNkZWZpbmUgQ09ORklHXzQ0MEdYCQkxCSAgICAvKiBTcGVjaWZjIEdYIHN1cHBvcnQJKi8KKyNkZWZpbmUgQ09ORklHXzQ0MAkJMQkgICAgLyogLi4uIFBQQzQ0MCBmYW1pbHkJKi8KICNkZWZpbmUgQ09ORklHXzR4eAkJMQkgICAgLyogLi4uIFBQQzR4eCBmYW1pbHkJKi8KICNkZWZpbmUgQ09ORklHX0JPQVJEX0VBUkxZX0lOSVRfRiAxCSAgICAvKiBDYWxsIGJvYXJkX3ByZV9pbml0CSovCiAjZGVmaW5lIENPTkZJR19MQVNUX1NUQUdFX0lOSVQJMQkgICAgLyogY2FsbCBsYXN0X3N0YWdlX2luaXQoKQkqLwpAQCAtOTQsNyArOTUsNyBAQAogCiAjZGVmaW5lIENGR19FTlZfSVNfSU5fRkxBU0ggICAgIDEJLyogdXNlIEZMQVNIIGZvciBlbnZpcm9ubWVudCB2YXJzCSovCiAKLSNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJMHgxMDAwMCAJLyogc2l6ZSBvZiBvbmUgY29tcGxldGUgc2VjdG9yCSovCisjZGVmaW5lIENGR19FTlZfU0VDVF9TSVpFCTB4MTAwMDAJLyogc2l6ZSBvZiBvbmUgY29tcGxldGUgc2VjdG9yCQkqLwogI2RlZmluZSBDRkdfRU5WX0FERFIJCShDRkdfTU9OSVRPUl9CQVNFLUNGR19FTlZfU0VDVF9TSVpFKQogI2RlZmluZQlDRkdfRU5WX1NJWkUJCTB4MjAwMAkvKiBUb3RhbCBTaXplIG9mIEVudmlyb25tZW50IFNlY3RvcgkqLwogCkBAIC0yMDksMjUgKzIxMCwzNyBAQAogCiAjZGVmaW5lIENPTkZJR19ORVRDT05TT0xFCQkvKiBpbmNsdWRlIE5ldENvbnNvbGUgc3VwcG9ydAkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RJQUcJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfRlBHQQl8IFwKLQkJCQlDRkdfQ01EX05BTkQJfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9GUEdBCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkFORAorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC0yMzYsNyArMjQ5LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjU2LDcgKzI2OSw3IEBACiAKICNkZWZpbmUgQ09ORklHX0NNRExJTkVfRURJVElORwkxCS8qIGFkZCBjb21tYW5kIGxpbmUgaGlzdG9yeQkqLwogI2RlZmluZSBDT05GSUdfTE9PUFcgICAgICAgICAgICAxICAgICAgIC8qIGVuYWJsZSBsb29wdyBjb21tYW5kICAgICAgICAgKi8KLSNkZWZpbmUgQ09ORklHX01YX0NZQ0xJQyAgICAgCTEgICAgICAgLyogZW5hYmxlIG1kYy9td2MgY29tbWFuZHMgICAgICAqLworI2RlZmluZSBDT05GSUdfTVhfQ1lDTElDCTEgICAgICAgLyogZW5hYmxlIG1kYy9td2MgY29tbWFuZHMgICAgICAqLwogI2RlZmluZSBDT05GSUdfWkVST19CT09UREVMQVlfQ0hFQ0sJLyogY2hlY2sgZm9yIGtleXByZXNzIG9uIGJvb3RkZWxheT09MCAqLwogI2RlZmluZSBDT05GSUdfVkVSU0lPTl9WQVJJQUJMRQkxCS8qIGluY2x1ZGUgdmVyc2lvbiBlbnYgdmFyaWFibGUgKi8KIApAQCAtMjc0LDcgKzI4Nyw2IEBACiAjZGVmaW5lIENPTkZJR19QQ0lfQk9PVERFTEFZCTEgICAgICAgLyogZW5hYmxlIHBjaSBib290ZGVsYXkgdmFyaWFibGUqLwogCiAvKiBCb2FyZC1zcGVjaWZpYyBQQ0kgKi8KLSNkZWZpbmUgQ0ZHX1BDSV9QUkVfSU5JVAkJLyogZW5hYmxlIGJvYXJkIHBjaV9wcmVfaW5pdCgpCSovCiAjZGVmaW5lIENGR19QQ0lfVEFSR0VUX0lOSVQJCS8qIGxldCBib2FyZCBpbml0IHBjaSB0YXJnZXQgICAgKi8KICNkZWZpbmUgQ0ZHX1BDSV9NQVNURVJfSU5JVAogCkBAIC0zNTgsNyArMzcwLDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9hcm1hZGlsbG8uaCBiL2luY2x1ZGUvY29uZmlncy9hcm1hZGlsbG8uaAppbmRleCA5YTFjNTU5Li43M2E4ODg1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvYXJtYWRpbGxvLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2FybWFkaWxsby5oCkBAIC03MSwxMiArNzEsMjEgQEAKIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLICAgICAgIChDT05GSUdfQk9PVFBfREVGQVVMVHxDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCkgLyogfCBDRkdfQ01EX0pGRlMyKSovCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUyAgICAJInJvb3Q9L2Rldi9yYW0wIHJvb3Rmc3R5cGU9ZXh0MiBjb25zb2xlPXR0eUFNMCwxMTUyMDAiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvYXNzYWJldC5oIGIvaW5jbHVkZS9jb25maWdzL2Fzc2FiZXQuaAppbmRleCAxYTY5ZWJlLi4yMjZhZDU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvYXNzYWJldC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9hc3NhYmV0LmgKQEAgLTY2LDE4ICs2NiwzMCBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX0RIQ1ApCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCUNPTkZJR19CT09UUF9ERUZBVUxUCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJImNvbnNvbGU9dHR5U0EwLDExNTIwMG44IHJvb3Q9L2Rldi9uZnMgaXA9Ym9vdHAiCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdHA7dGZ0cDtib290bSIKICNkZWZpbmUgQ0ZHX0FVVE9MT0FEICAgICAgICAgICAgIm4iCS8qIE5vIGF1dG9sb2FkICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxMTUyMDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9hdDkxcm05MjAwZGsuaCBiL2luY2x1ZGUvY29uZmlncy9hdDkxcm05MjAwZGsuaAppbmRleCA4ZmFkNTVkLi5lY2ZhMjFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvYXQ5MXJtOTIwMGRrLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2F0OTFybTkyMDBkay5oCkBAIC05NywxOCArOTcsMzEgQEAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWSAgICAgIDMKIC8qICNkZWZpbmUgQ09ORklHX0VOVl9PVkVSV1JJVEUJMSAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJXAotCQkgICAgICAgKChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfTUlJIHxcCi0JCQlDRkdfQ01EX0RIQ1AgKSAmIFwKLQkJICAgICAgfihDRkdfQ01EX0JESSB8IFwKLQkJCUNGR19DTURfSU1JIHwgXAotCQkJQ0ZHX0NNRF9BVVRPU0NSSVBUIHwgXAotCQkJQ0ZHX0NNRF9GUEdBIHwgXAotCQkJQ0ZHX0NNRF9NSVNDIHwgXAotCQkJQ0ZHX0NNRF9MT0FEUyApKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorCisjdW5kZWYgQ09ORklHX0NNRF9CREkKKyN1bmRlZiBDT05GSUdfQ01EX0lNSQorI3VuZGVmIENPTkZJR19DTURfQVVUT1NDUklQVAorI3VuZGVmIENPTkZJR19DTURfRlBHQQorI3VuZGVmIENPTkZJR19DTURfTUlTQworI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKwogCiAjZGVmaW5lIENGR19NQVhfTkFORF9ERVZJQ0UJMQkvKiBNYXggbnVtYmVyIG9mIE5BTkQgZGV2aWNlcwkJKi8KICNkZWZpbmUgU0VDVE9SU0laRSA1MTIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9hdGMuaCBiL2luY2x1ZGUvY29uZmlncy9hdGMuaAppbmRleCBiZjZjMTcwLi4zZmY0YjY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvYXRjLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2F0Yy5oCkBAIC02NCw5ICs2NCw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KLSAqCisgKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ09ORklHX0NNRF9ORVQgbXVzdCBiZSB1bnNldC4KICAqLwogI3VuZGVmCUNPTkZJR19FVEhFUl9PTl9TQ0MJCS8qIGRlZmluZSBpZiBldGhlciBvbiBTQ0MgICAgICAgKi8KICN1bmRlZglDT05GSUdfRVRIRVJfTk9ORQkJLyogZGVmaW5lIGlmIGV0aGVyIG9uIHNvbWV0aGluZyBlbHNlICovCkBAIC0xMjQsMjcgKzEyMiwzNyBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLwogI3VuZGVmCUNGR19MT0FEU19CQVVEX0NIQU5HRQkJLyogZG9uJ3QgYWxsb3cgYmF1ZHJhdGUgY2hhbmdlCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUfENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgfCBcCi0JCQkJIENGR19DTURfRUVQUk9NIHwgXAotCQkJCSBDRkdfQ01EX1BDSSB8IFwKLQkJCQkgQ0ZHX0NNRF9QQ01DSUEgfCBcCi0JCQkJIENGR19DTURfREFURSB8IFwKLQkJCQkgQ0ZHX0NNRF9JREUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUENNQ0lBCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0lERQogCiAKICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yODUsNyArMjkzLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUgICAgICAzMiAgICAgIC8qIEZvciBNUEM4MjYwIENQVSAgICAgICAgICAgICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2F0c3RrMTAwMi5oIGIvaW5jbHVkZS9jb25maWdzL2F0c3RrMTAwMi5oCmluZGV4IGJlYWYzODUuLmUxZDhmNzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9hdHN0azEwMDIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvYXRzdGsxMDAyLmgKQEAgLTEwOCw0NyArMTA4LDI5IEBACiAjZGVmaW5lIENPTkZJR19PVkVSV1JJVEVfRVRIQUREUl9PTkNFCTEKICNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQkJMQogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCQkoQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sJXAotCQkJCQkgfCBDT05GSUdfQk9PVFBfR0FURVdBWSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCQkoQ0ZHX0NNRF9CREkJCQlcCi0JCQkJCSB8IENGR19DTURfTE9BRFMJCVwKLQkJCQkJIHwgQ0ZHX0NNRF9MT0FEQgkJXAotCQkJCQkgfCBDRkdfQ01EX0lNSQkJCVwKLQkJCQkJIC8qIHwgQ0ZHX0NNRF9DQUNIRSAqLwkJXAotCQkJCQkgfCBDRkdfQ01EX0ZMQVNICQlcCi0JCQkJCSB8IENGR19DTURfTUVNT1JZCQlcCi0JCQkJCSB8IENGR19DTURfTkVUCQkJXAotCQkJCQkgfCBDRkdfQ01EX0VOVgkJCVwKLQkJCQkJIC8qIHwgQ0ZHX0NNRF9JUlEgKi8JCVwKLQkJCQkJIHwgQ0ZHX0NNRF9CT09URAkJXAotCQkJCQkgfCBDRkdfQ01EX0NPTlNPTEUJCVwKLQkJCQkJIC8qIHwgQ0ZHX0NNRF9FRVBST00gKi8JCVwKLQkJCQkJIHwgQ0ZHX0NNRF9BU0tFTlYJCVwKLQkJCQkJIHwgQ0ZHX0NNRF9SVU4JCQlcCi0JCQkJCSB8IENGR19DTURfRUNITwkJCVwKLQkJCQkJIC8qIHwgQ0ZHX0NNRF9JMkMgKi8JCVwKLQkJCQkJIHwgQ0ZHX0NNRF9SRUdJTkZPCQlcCi0JCQkJCSAvKiB8IENGR19DTURfREFURSAqLwkJXAotCQkJCQkgfCBDRkdfQ01EX0RIQ1AJCQlcCi0JCQkJCSAvKiB8IENGR19DTURfQVVUT1NDUklQVCAqLwlcCi0JCQkJCSAvKiB8IENGR19DTURfTUlJICovCQlcCi0JCQkJCSB8IENGR19DTURfTUlTQwkJCVwKLQkJCQkJIC8qIHwgQ0ZHX0NNRF9TRFJBTSAqLwkJXAotCQkJCQkgLyogfCBDRkdfQ01EX0RJQUcgKi8JCVwKLQkJCQkJIC8qIHwgQ0ZHX0NNRF9IV0ZMT1cgKi8JCVwKLQkJCQkJIC8qIHwgQ0ZHX0NNRF9TQVZFUyAqLwkJXAotCQkJCQkgLyogfCBDRkdfQ01EX1NQSSAqLwkJXAotCQkJCQkgLyogfCBDRkdfQ01EX1BJTkcgKi8JCVwKLQkJCQkJIHwgQ0ZHX0NNRF9NTUMJCQlcCi0JCQkJCSB8IENGR19DTURfRkFUCQkJXAotCQkJCQkgfCBDRkdfQ01EX0lNTFMJCQlcCi0JCQkJCSAvKiB8IENGR19DTURfSVRFU1QgKi8JCVwKLQkJCQkJIHwgQ0ZHX0NNRF9FWFQyCQkJXAotCQkJCQkgfCBDRkdfQ01EX0pGRlMyCQlcCi0JCSkKIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRVhUMgorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfTU1DCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworCisjdW5kZWYgQ09ORklHX0NNRF9BVVRPU0NSSVBUCisjdW5kZWYgQ09ORklHX0NNRF9TRVRHRVREQ1IKKyN1bmRlZiBDT05GSUdfQ01EX1hJTUcKIAogI2RlZmluZSBDT05GSUdfQVRNRUxfVVNBUlQJCTEKICNkZWZpbmUgQ09ORklHX01BQ0IJCQkxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvYmFtYm9vLmggYi9pbmNsdWRlL2NvbmZpZ3MvYmFtYm9vLmgKaW5kZXggNzYzZDFjNy4uMTliMjlhYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2JhbWJvby5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9iYW1ib28uaApAQCAtMzIsNiArMzIsNyBAQAogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNkZWZpbmUgQ09ORklHX0JBTUJPTwkJMQkvKiBCb2FyZCBpcyBCQU1CT08gICAgICAgICAgICAgICovCiAjZGVmaW5lIENPTkZJR180NDBFUAkJMQkvKiBTcGVjaWZpYyBQUEM0NDBFUCBzdXBwb3J0ICAgICovCisjZGVmaW5lIENPTkZJR180NDAJCTEJLyogLi4uIFBQQzQ0MCBmYW1pbHkJICAgICAgICAqLwogI2RlZmluZSBDT05GSUdfNHh4CQkxCS8qIC4uLiBQUEM0eHggZmFtaWx5CSAgICAgICAgKi8KICNkZWZpbmUgQ09ORklHX1NZU19DTEtfRlJFUQkzMzMzMzMzMyAgICAvKiBleHRlcm5hbCBmcmVxIHRvIHBsbAkqLwogCkBAIC03Myw5ICs3NCw5IEBACiAgKiBJbml0aWFsIFJBTSAmIHN0YWNrIHBvaW50ZXIgKHBsYWNlZCBpbiBTRFJBTSkKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjZGVmaW5lIENGR19JTklUX1JBTV9EQ0FDSEUJMQkJLyogZC1jYWNoZSBhcyBpbml0IHJhbQkqLwotI2RlZmluZSBDRkdfSU5JVF9SQU1fQUREUgkweDcwMDAwMDAwCQkvKiBEQ2FjaGUgICAgICAgKi8KKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0FERFIJMHg3MDAwMDAwMAkvKiBEQ2FjaGUgICAgICAgKi8KICNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0VORAkoNCA8PCAxMCkKLSNkZWZpbmUgQ0ZHX0dCTF9EQVRBX1NJWkUJMjU2CQkgICAgCS8qIG51bSBieXRlcyBpbml0aWFsIGRhdGEJKi8KKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX1NJWkUJMjU2CQkvKiBudW0gYnl0ZXMgaW5pdGlhbCBkYXRhCSovCiAjZGVmaW5lIENGR19HQkxfREFUQV9PRkZTRVQJKENGR19JTklUX1JBTV9FTkQgLSBDRkdfR0JMX0RBVEFfU0laRSkKICNkZWZpbmUgQ0ZHX0lOSVRfU1BfT0ZGU0VUCUNGR19HQkxfREFUQV9PRkZTRVQKIApAQCAtMTE0LDggKzExNSw4IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBGTEFTSCByZWxhdGVkCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBDRkdfTUFYX0ZMQVNIX0JBTktTCTMJCSAgICAvKiBudW1iZXIgb2YgYmFua3MJICAgICovCi0jZGVmaW5lIENGR19NQVhfRkxBU0hfU0VDVAkyNTYJCSAgICAvKiBzZWN0b3JzIHBlciBkZXZpY2UgICAqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX0JBTktTCTMJLyogbnVtYmVyIG9mIGJhbmtzCQkJKi8KKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9TRUNUCTI1NgkvKiBzZWN0b3JzIHBlciBkZXZpY2UJCQkqLwogCiAjdW5kZWYJQ0ZHX0ZMQVNIX0NIRUNLU1VNCiAjZGVmaW5lIENGR19GTEFTSF9FUkFTRV9UT1VUCTEyMDAwMAkvKiBUaW1lb3V0IGZvciBGbGFzaCBFcmFzZSAoaW4gbXMpCSovCkBAIC0xMjUsMTEgKzEyNiwxMSBAQAogI2RlZmluZSBDRkdfRkxBU0hfQUREUjEgICAgICAgICAweDJhYQogI2RlZmluZSBDRkdfRkxBU0hfV09SRF9TSVpFICAgICB1bnNpZ25lZCBjaGFyCiAKLSNkZWZpbmUgQ0ZHX0ZMQVNIXzJORF8xNkJJVF9ERVYgMSAgICAgICAgIC8qIGJhbWJvbyBoYXMgOCBhbmQgMTZiaXQgZGV2aWNlICAgICAgKi8KLSNkZWZpbmUgQ0ZHX0ZMQVNIXzJORF9BRERSICAgICAgMHg4NzgwMDAwMCAgLyogYmFtYm9vIGhhcyA4IGFuZCAxNmJpdCBkZXZpY2UgICAgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIXzJORF8xNkJJVF9ERVYgMQkvKiBiYW1ib28gaGFzIDggYW5kIDE2Yml0IGRldmljZQkqLworI2RlZmluZSBDRkdfRkxBU0hfMk5EX0FERFIgICAgICAweDg3ODAwMDAwICAvKiBiYW1ib28gaGFzIDggYW5kIDE2Yml0IGRldmljZQkqLwogCiAjaWZkZWYgQ0ZHX0VOVl9JU19JTl9GTEFTSAotI2RlZmluZSBDRkdfRU5WX1NFQ1RfU0laRQkweDEwMDAwIAkvKiBzaXplIG9mIG9uZSBjb21wbGV0ZSBzZWN0b3IJKi8KKyNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJMHgxMDAwMAkvKiBzaXplIG9mIG9uZSBjb21wbGV0ZSBzZWN0b3IJCSovCiAjZGVmaW5lIENGR19FTlZfQUREUgkJKCgtQ0ZHX01PTklUT1JfTEVOKS1DRkdfRU5WX1NFQ1RfU0laRSkKICNkZWZpbmUJQ0ZHX0VOVl9TSVpFCQkweDIwMDAJLyogVG90YWwgU2l6ZSBvZiBFbnZpcm9ubWVudCBTZWN0b3IJKi8KIApAQCAtMzE1LDQ1ICszMTYsNTUgQEAKICNkZWZpbmUgVVNCXzJfMF9ERVZJQ0UKICNlbmRpZiAvKkNPTkZJR180NDBFUCovCiAKLSNpZmRlZiBDT05GSUdfQkFNQk9PX05BTkQKLSNkZWZpbmUgX0NGR19DTURfTkFORCBDRkdfQ01EX05BTkQKLSNlbHNlCi0jZGVmaW5lIF9DRkdfQ01EX05BTkQgMAotI2VuZGlmIC8qIENPTkZJR19CQU1CT09fTkFORCAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9ESUFHCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkVUCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX1JFR0lORk8JfCBcCi0JCQkJQ0ZHX0NNRF9TRFJBTQl8IFwKLQkJCQlDRkdfQ01EX1VTQgl8IFwKLQkJCQlDRkdfQ01EX0ZBVAl8IFwKLQkJCQlDRkdfQ01EX0VYVDIJfCBcCi0JCQkJX0NGR19DTURfTkFORAl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorI2RlZmluZSBDT05GSUdfQ01EX1VTQgorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0VYVDIKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKKyNpZmRlZiBDT05GSUdfQkFNQk9PX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECisjZW5kaWYKKwogCiAjZGVmaW5lIENPTkZJR19TVVBQT1JUX1ZGQVQKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSAgICAgICAgIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJICAgICAgICAxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCSAgICAgICAgMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zODgsNyArMzk5LDYgQEAKICNkZWZpbmUgQ0ZHX1BDSV9UQVJHQkFTRSAgICAgICAgMHg4MDAwMDAwMCAvKiBQQ0lhZGRyIG1hcHBlZCB0byBDRkdfUENJX01FTUJBU0UqLwogCiAvKiBCb2FyZC1zcGVjaWZpYyBQQ0kgKi8KLSNkZWZpbmUgQ0ZHX1BDSV9QUkVfSU5JVCAgICAgICAgICAgICAgICAvKiBlbmFibGUgYm9hcmQgcGNpX3ByZV9pbml0KCkgICovCiAjZGVmaW5lIENGR19QQ0lfVEFSR0VUX0lOSVQKICNkZWZpbmUgQ0ZHX1BDSV9NQVNURVJfSU5JVAogCkBAIC00MDcsNyArNDE3LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCSgzMjw8MTApIC8qIEZvciBBTUNDIDQ0MCBDUFVzCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtNDE5LDcgKzQyOSw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvYmFyY28uaCBiL2luY2x1ZGUvY29uZmlncy9iYXJjby5oCmluZGV4IDYyNGZhMWQuLjBiYjQ0NmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9iYXJjby5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9iYXJjby5oCkBAIC03MCwyMiArNzAsMzAgQEAKIAogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MgIm1lbT0zMk0iCiAKLS8qIEFkZCBzdXBwb3J0IGZvciBhIGZldyBleHRyYSBib290cCBvcHRpb25zIGxpa2U6Ci0gKgktIEZpbGUgc2l6ZQotICoJLSBETlMKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKICAqLwotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBcCi0JCQkJIENPTkZJR19CT09UUF9CT09URklMRVNJWkUgfCBcCi0JCQkJIENPTkZJR19CT09UUF9ETlMpCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoIENPTkZJR19DTURfREZMIHwgXAotCQkJCSAgQ0ZHX0NNRF9FTEYgICAgfCBcCi0JCQkJICBDRkdfQ01EX0kyQyAJIHwgXAotCQkJCSAgQ0ZHX0NNRF9FRVBST00gfCBcCi0JCQkJICBDRkdfQ01EX1BDSSAgICApCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkJKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfUENJCisKKyN1bmRlZiBDT05GSUdfQ01EX05FVAorCiAKICNkZWZpbmUgQ09ORklHX0hVU0hfUEFSU0VSCTEgLyogdXNlICJodXNoIiBjb21tYW5kIHBhcnNlciAqLwogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZIAkxCkBAIC0xMTAsNyArMTE4LDYgQEAKICAqLwogI2RlZmluZSBDT05GSUdfUENJCQkJCS8qIGluY2x1ZGUgcGNpIHN1cHBvcnQJCSovCiAjdW5kZWYgQ09ORklHX1BDSV9QTlAKLSN1bmRlZiBDRkdfQ01EX05FVAogCiAjZGVmaW5lIFBDSV9FTkVUMF9JT0FERFIJMHg4MDAwMDAwMAogI2RlZmluZSBQQ0lfRU5FVDBfTUVNQUREUgkweDgwMDAwMDAwCkBAIC0zNDAsNyArMzQ3LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyNDAgQ1BVCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9iZjUzMy1lemtpdC5oIGIvaW5jbHVkZS9jb25maWdzL2JmNTMzLWV6a2l0LmgKaW5kZXggNjVkZmM4MS4uNmNiNmJjNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2JmNTMzLWV6a2l0LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2JmNTMzLWV6a2l0LmgKQEAgLTk3LDE5ICs5NywzMSBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCiAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCQkoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJCSBDRkdfQ01EX1BJTkcJfCBcCi0JCQkJCSBDRkdfQ01EX0VMRgl8IFwKLQkJCQkJIENGR19DTURfSTJDCXwgXAotCQkJCQkgQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQkJIENGR19DTURfREFURSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisKKwogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MgInJvb3Q9L2Rldi9tdGRibG9jazAgaXA9MTkyLjE2OC4wLjE1OjE5Mi4xNjguMC4yOjE5Mi4xNjguMC4xOjI1NS4yNTUuMjU1LjA6ZXpraXQ6ZXRoMDpvZmYgY29uc29sZT10dHlCRjAsNTc2MDAiCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogI2RlZmluZQlDRkdfUFJPTVBUCQkiZXpraXQ+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2JmNTMzLXN0YW1wLmggYi9pbmNsdWRlL2NvbmZpZ3MvYmY1MzMtc3RhbXAuaAppbmRleCA3OWExNDA0Li5jY2U2ZWY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvYmY1MzMtc3RhbXAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvYmY1MzMtc3RhbXAuaApAQCAtMjQwLDIzICsyNDAsNiBAQAogCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJInJvb3Q9L2Rldi9tdGRibG9jazAgcncgY29uc29sZT10dHlCRjAsNTc2MDAiCiAKLSNpZiAoQ09ORklHX0RSSVZFUl9TTUM5MTExMSkKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTMQkoQ09ORklHX0NNRF9ERkwgfCBcCi0JCQkJIENGR19DTURfUElORyAgIHwgXAotCQkJCSBDRkdfQ01EX0VMRiAgICB8IFwKLQkJCQkgQ0ZHX0NNRF9DQUNIRSAgfCBcCi0JCQkJIENGR19DTURfSkZGUzIgIHwgXAotCQkJCSBDRkdfQ01EX0VFUFJPTSB8IFwKLQkJCQkgQ0ZHX0NNRF9EQVRFKQotCi0jZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMxCShDT05GSUdfQ01EX0RGTCB8IFwKLQkJCQkgQ0ZHX0NNRF9FTEYgICAgfCBcCi0JCQkJIENGR19DTURfQ0FDSEUgIHwgXAotCQkJCSBDRkdfQ01EX0pGRlMyICB8IFwKLQkJCQkgQ0ZHX0NNRF9FRVBST00gfCBcCi0JCQkJIENGR19DTURfREFURSkKLSNlbmRpZgogCiAjaWYgKEJGSU5fQk9PVF9NT0RFID09IEJGNTMzX0JZUEFTU19CT09UKQogI2lmIChDT05GSUdfRFJJVkVSX1NNQzkxMTExKQpAQCAtMzA1LDIwICsyODgsMzkgQEAKICNlbmRpZgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX1NPRlRfSTJDKQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMyICAgQ0ZHX0NNRF9JMkMKLSNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUzIgMAotI2VuZGlmIC8qIENPTkZJR19TT0ZUX0kyQyAqLwogCi0jaWYgKEJGSU5fQk9PVF9NT0RFID09IEJGNTMzX0JZUEFTU19CT09UKQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgICggQ09ORklHX0NPTU1BTkRTMSB8IENPTkZJR19DT01NQU5EUzIgfCBDRkdfQ01EX0RIQ1ApCi0jZWxpZiAoQkZJTl9CT09UX01PREUgPT0gQkY1MzNfU1BJX0JPT1QpCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAgKCBDT05GSUdfQ09NTUFORFMxIHwgQ09ORklHX0NPTU1BTkRTMikKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfREFURQorCisjaWYgKENPTkZJR19EUklWRVJfU01DOTExMTEpCisjZGVmaW5lIENPTkZJR19DTURfUElORwogI2VuZGlmCiAKLS8qIFRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNpZiAoQ09ORklHX1NPRlRfSTJDKQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2VuZGlmCisKKyNpZiAoQkZJTl9CT09UX01PREUgPT0gQkY1MzNfQllQQVNTX0JPT1QpCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2VuZGlmCisKIAogLyoKICAqIENvbnNvbGUgc2V0dGluZ3MKQEAgLTM0NSw3ICszNDcsNyBAQAogI2VuZGlmCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpAQCAtMzk1LDcgKzM5Nyw3IEBACiAvKiBFbmFibGVkIGJlbG93IG9wdGlvbiBmb3IgQ0Ygc3VwcG9ydCAqLwogLyogI2RlZmluZSBDT05GSUdfU1RBTVBfQ0YJMSAqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfU1RBTVBfQ0YpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkKKyNpZiBkZWZpbmVkKENPTkZJR19TVEFNUF9DRikgJiYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkKIAogI2RlZmluZSBDT05GSUdfTUlTQ19JTklUX1IJMQogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgkxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvYmY1Mzctc3RhbXAuaCBiL2luY2x1ZGUvY29uZmlncy9iZjUzNy1zdGFtcC5oCmluZGV4IGY2NzU1YWMuLmI5YTllM2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9iZjUzNy1zdGFtcC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9iZjUzNy1zdGFtcC5oCkBAIC0xNDQsMTEgKzE0NCw4IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QT1NUCi0jZGVmaW5lIENGR19DTURfUE9TVF9ESUFHCUNGR19DTURfRElBRwogI2RlZmluZSBGTEFTSF9TVEFSVF9QT1NUX0JMT0NLCTExCS8qIFNob3VsZCA+ID0gMTEgKi8KICNkZWZpbmUgRkxBU0hfRU5EX1BPU1RfQkxPQ0sJNzEJLyogU2hvdWxkIDwgPSA3MSAqLwotI2Vsc2UKLSNkZWZpbmUgQ0ZHX0NNRF9QT1NUX0RJQUcJMAogI2VuZGlmCiAKIC8qIENGLUNBUkQgSURFLUhERCBTdXBwb3J0ICovCkBAIC0xNTksNTEgKzE1Niw2NSBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9DRl9JREUpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fSEREX0lERSkgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9UUlVFX0lERSkKICMgZGVmaW5lIENPTkZJR19CRklOX0lERQkxCi0jIGRlZmluZSBBRERfSURFX0NNRAkJQ0ZHX0NNRF9JREUKLSNlbHNlCi0jIGRlZmluZSBBRERfSURFX0NNRAkJMAogI2VuZGlmCiAKIC8qI2RlZmluZSBDT05GSUdfQkY1MzdfTkFORCAqLwkJLyogQWRkIG5hbmQgZmxhc2ggc3VwcG9ydCAqLwogCi0jaWZkZWYgQ09ORklHX0JGNTM3X05BTkQKLSMgZGVmaW5lIEFERF9OQU5EX0NNRAkJQ0ZHX0NNRF9OQU5ECi0jZWxzZQotIyBkZWZpbmUgQUREX05BTkRfQ01ECQkwCi0jZW5kaWYKLQogI2RlZmluZSBDT05GSUdfTkVUQ09OU09MRQkxCiAjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkJMQogCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjaWYgKEJGSU5fQk9PVF9NT0RFID09IEJGNTM3X0JZUEFTU19CT09UKSB8fCAoQkZJTl9CT09UX01PREUgPT0gQkY1MzdfU1BJX01BU1RFUl9CT09UKQorCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKwogI2lmIChCRklOX0NQVSA9PSBBRFNQX0JGNTM0KQotI2RlZmluZSBDT05GSUdfQkZJTl9DTUQJCShDT05GSUdfQ01EX0RGTCAmIH5DRkdfQ01EX05FVCkKKyN1bmRlZiBDT05GSUdfQ01EX05FVAogI2Vsc2UKLSNkZWZpbmUgQ09ORklHX0JGSU5fQ01ECQkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BJTkcpCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRklOX0NGX0lERSkgXAorCXx8IGRlZmluZWQoQ09ORklHX0JGSU5fSEREX0lERSkgXAorCXx8IGRlZmluZWQoQ09ORklHX0JGSU5fVFJVRV9JREUpCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZW5kaWYKKwogI2VuZGlmCiAKICNpZiAoQkZJTl9CT09UX01PREUgPT0gQkY1MzdfQllQQVNTX0JPT1QpCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19CRklOX0NNRHwgXAotCQkJCSBDRkdfQ01EX0VMRgl8IFwKLQkJCQkgQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJIENGR19DTURfQ0FDSEUgIHwgXAotCQkJCSBDRkdfQ01EX0pGRlMyCXwgXAotCQkJCSBDRkdfQ01EX0VFUFJPTSB8IFwKLQkJCQkgQ0ZHX0NNRF9ESENQICAgfCBcCi0JCQkJIEFERF9JREVfQ01ECXwgXAotCQkJCSBBRERfTkFORF9DTUQJfCBcCi0JCQkJIENGR19DTURfUE9TVF9ESUFHIHwgXAotCQkJCSBDRkdfQ01EX0RBVEUpCi0jZWxpZiAoQkZJTl9CT09UX01PREUgPT0gQkY1MzdfU1BJX01BU1RFUl9CT09UKQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQkZJTl9DTUR8IFwKLQkJCQkgQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJIENGR19DTURfSTJDCXwgXAotCQkJCSBDRkdfQ01EX0NBQ0hFICB8IFwKLQkJCQkgQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQkgQ0ZHX0NNRF9FRVBST00gfCBcCi0JCQkJIEFERF9JREVfQ01ECXwgXAotCQkJCSBDRkdfQ01EX0RBVEUpCisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisKKyNpZiBkZWZpbmVkKENPTkZJR19QT1NUKQorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0JGNTM3X05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECisjZW5kaWYKKworI2VuZGlmCisKKwogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MgInJvb3Q9L2Rldi9tdGRibG9jazAgcncgY29uc29sZT10dHlCRjAsNTc2MDAiCiAjZGVmaW5lIENPTkZJR19MT0FEQUREUgkweDEwMDAwMDAKIApAQCAtMjU2LDkgKzI2Nyw2IEBACiAjZW5kaWYKICNlbmRpZgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KICNpZiAoQkZJTl9CT09UX01PREUgPT0gQkY1MzdfU1BJX01BU1RFUl9CT09UKQogI2lmIChCRklOX0NQVSA9PSBBRFNQX0JGNTM0KQogI2RlZmluZQlDRkdfUFJPTVBUCQkic2VyaWFsX2JmNTM0PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgKi8KQEAgLTI3Nyw3ICsyODUsNyBAQAogI2VuZGlmCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2JmNTYxLWV6a2l0LmggYi9pbmNsdWRlL2NvbmZpZ3MvYmY1NjEtZXpraXQuaAppbmRleCA4ZDgyNmZhLi4yOTY2MjYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvYmY1NjEtZXpraXQuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvYmY1NjEtZXpraXQuaApAQCAtMTY0LDEyICsxNjQsNiBAQAogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MJCSJyb290PS9kZXYvbXRkYmxvY2swIHJ3IGNvbnNvbGU9dHR5QkYwLDU3NjAwIgogCiAjaWYgKENPTkZJR19EUklWRVJfU01DOTExMTEpCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUzEJKENPTkZJR19DTURfREZMCXwgXAotCQkJCSBDRkdfQ01EX1BJTkcJfCBcCi0JCQkJIENGR19DTURfRUxGCXwgXAotCQkJCSBDRkdfQ01EX0NBQ0hFCXwgXAotCQkJCSBDRkdfQ01EX0pGRlMyCXwgXAotCQkJCSBDRkdfQ01EX0RIQ1ApCiAjZGVmaW5lIENPTkZJR19FWFRSQV9FTlZfU0VUVElOR1MgXAogCSJyYW1hcmdzPXNldGVudiBib290YXJncyByb290PS9kZXYvbXRkYmxvY2swIHJ3IGNvbnNvbGU9dHR5QkYwLDU3NjAwXDAiIAkJXAogCSJuZnNhcmdzPXNldGVudiBib290YXJncyByb290PS9kZXYvbmZzIHJ3IG5mc3Jvb3Q9JChzZXJ2ZXJpcCk6IglcCkBAIC0xODYsMjAgKzE4MCwzNiBAQAogCQkiY3AuYiAkKGxvYWRhZGRyKSAweDIwMDAwMDAwICQoZmlsZXNpemUpXDAiIFwKIAkiIgogI2Vsc2UKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTMQkoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJIENGR19DTURfRUxGCXwgXAotCQkJCSBDRkdfQ01EX0NBQ0hFCXwgXAotCQkJCSBDRkdfQ01EX0pGRlMyKQogI2RlZmluZSBDT05GSUdfRVhUUkFfRU5WX1NFVFRJTkdTIFwKIAkicmFtYXJncz1zZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L210ZGJsb2NrMCBydyBjb25zb2xlPXR0eUJGMCw1NzYwMFwwIgkJXAogCSJmbGFzaGJvb3Q9Ym9vdG0gMHgyMDEwMDAwMFwwIgkJCQkJXAogCSIiCiAjZW5kaWYKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgKCBDT05GSUdfQ09NTUFORFMxIHwgQ09ORklHX0NPTU1BTkRTMiApCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisKKyNpZiBkZWZpbmVkKENPTkZJR19EUklWRVJfU01DOTExMTEpCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNlbmRpZgorCiAKIC8qCiAgKiBDb25zb2xlIHNldHRpbmdzCkBAIC0yMDgsNyArMjE4LDcgQEAKIAogI2RlZmluZQlDRkdfUFJPTVBUCQkiZXpraXQ+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9idWJpbmdhLmggYi9pbmNsdWRlL2NvbmZpZ3MvYnViaW5nYS5oCmluZGV4IDEwYzQ4MTQuLjc3MzZhMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9idWJpbmdhLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2J1YmluZ2EuaApAQCAtMTM3LDI1ICsxMzcsMzcgQEAKIAogI2RlZmluZSBDT05GSUdfUlRDX0RTMTc0eAkxCS8qIHVzZSBEUzE3NDMgUlRDIGluIEJ1YmluZ2EJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0NBQ0hFCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTwl8IFwKLQkJCQlDRkdfQ01EX1NEUkFNCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTE2Niw3ICsxNzgsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yMTksNyArMjMxLDcgQEAKICNkZWZpbmUgQ0ZHX0kyQ19OT1BST0JFUwl7IDB4NjkgfQkvKiBhdm9pZCBpcHJvYmUgaGFuZ3VwICh3aHk/KSAqLwogI2RlZmluZSBDRkdfRUVQUk9NX1BBR0VfV1JJVEVfREVMQVlfTVMJNgkvKiAyNEMwMiByZXF1aXJlcyA1bXMgZGVsYXkgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0VFUFJPTSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRUVQUk9NKQogI2RlZmluZSBDRkdfSTJDX0VFUFJPTV9BRERSCTB4NTAJLyogSTJDIGJvb3QgRUVQUk9NICgyNEMwMlcpCSovCiAjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFJfTEVOCTEJLyogQnl0ZXMgb2YgYWRkcmVzcwkJKi8KICNlbmRpZgpAQCAtMzE0LDcgKzMyNiw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkxNjM4NAkvKiBGb3IgQU1DQyA0MDVFUCBDUFUJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCkBAIC00MjYsNyArNDM4LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9jMm1vbi5oIGIvaW5jbHVkZS9jb25maWdzL2MybW9uLmgKaW5kZXggYWU3NTUzOS4uYTlhNTI1NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2MybW9uLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2MybW9uLmgKQEAgLTY4LDcgKzY4LDE1IEBACiAKICN1bmRlZglDT05GSUdfQ0FOX0RSSVZFUgkJLyogQ0FOIERyaXZlciBzdXBwb3J0IGRpc2FibGVkCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgpAQCAtNzcsMTUgKzg1LDE4IEBACiAKICNkZWZpbmUJQ09ORklHX1JUQ19NUEM4eHgJCS8qIHVzZSBpbnRlcm5hbCBSVEMgb2YgTVBDOHh4CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC05OCw3ICsxMDksNyBAQAogI2RlZmluZQlDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0xNzQsNyArMTg1LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2Nhbm1iLmggYi9pbmNsdWRlL2NvbmZpZ3MvY2FubWIuaAppbmRleCBlYzZkNTdlLi5kNTc3Yjk1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvY2FubWIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvY2FubWIuaApAQCAtMzgsMTEgKzM4LDYgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAgKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QJICAgICAqLwogCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKLSMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KLSNlbmRpZgotCiAjZGVmaW5lIENPTkZJR19CT0FSRF9FQVJMWV9JTklUX1IKIAogLyoKQEAgLTUyLDIxICs0NywzMCBAQAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAkvKiAuLi4gYXQgMTE1MjAwIGJwcyAqLwogI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAsIDIzMDQwMCB9CiAKLS8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKLSAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSU1NQVAJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkgCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JTU1BUAorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogLyoKICAqIE1VU1QgYmUgbG93IGJvb3QgLSBISUdIQk9PVCBpcyBub3Qgc3VwcG9ydGVkIGFueW1vcmUKQEAgLTE4MSw3ICsxODUsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogIyAgZGVmaW5lIENGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KQEAgLTE5OSw2ICsyMDMsMTEgQEAKIAogI2RlZmluZSBDT05GSUdfUlRDX01QQzUyMDAJMQkvKiB1c2UgaW50ZXJuYWwgTVBDNTIwMCBSVEMgKi8KIAorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLworI2VuZGlmCisKIC8qCiAgKiBWYXJpb3VzIGxvdy1sZXZlbCBzZXR0aW5ncwogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvY2VyZjI1MC5oIGIvaW5jbHVkZS9jb25maWdzL2NlcmYyNTAuaAppbmRleCA2OTk3YzdhLi5lMDY3MzVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvY2VyZjI1MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9jZXJmMjUwLmgKQEAgLTYxLDEwICs2MSwyMSBAQAogCiAvKiBhbGxvdyB0byBvdmVyd3JpdGUgc2VyaWFsIGFuZCBldGhhZGRyICovCiAjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCiAjZGVmaW5lIENPTkZJR19FVEhBRERSCQkwMDpEMDpDQTpGMTozQzpEMgpAQCAtNzUsNyArODYsNyBAQAogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MJCSJyb290PS9kZXYvbXRkYmxvY2szIHJvb3Rmc3R5cGU9amZmczIgY29uc29sZT10dHlTMCwzODQwMCIKICNkZWZpbmUgQ09ORklHX0NNRExJTkVfVEFHCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvY200MDA4LmggYi9pbmNsdWRlL2NvbmZpZ3MvY200MDA4LmgKaW5kZXggNTk0N2MyYS4uYWU0MGIzNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2NtNDAwOC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9jbTQwMDguaApAQCAtNTgsMTAgKzU4LDIzIEBACiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLSN1bmRlZiBDT05GSUdfQ09NTUFORFMKLSNkZWZpbmUJQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgJiB+KENGR19DTURfTk9OU1REIHwgQ0ZHX0NNRF9FTlYpKQorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjdW5kZWYgQ09ORklHX0NNRF9FTlYKKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMAogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MJCSJtZW09MTZNIGNvbnNvbGU9dHR5QU0wLDExNTIwMCIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9jbTQxeHguaCBiL2luY2x1ZGUvY29uZmlncy9jbTQxeHguaAppbmRleCBlNjJmYzA2Li5jMWRkMzNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvY200MXh4LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2NtNDF4eC5oCkBAIC01OCwxMCArNTgsMjMgQEAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKICNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwIH0KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotI3VuZGVmIENPTkZJR19DT01NQU5EUwotI2RlZmluZQlDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCAmIH4oQ0ZHX0NNRF9OT05TVEQgfCBDRkdfQ01EX0VOVikpCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyN1bmRlZiBDT05GSUdfQ01EX0VOVgorCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkwCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJIm1lbT0zMk0gY29uc29sZT10dHlBTTAsMTE1MjAwIgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2NtNTIwMC5oIGIvaW5jbHVkZS9jb25maWdzL2NtNTIwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NTQzNDgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvY201MjAwLmgKQEAgLTAsMCArMSwzMzggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNworICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfTVBDNXh4eAkJMQkvKiBUaGlzIGlzIGFuIE1QQzV4eHggQ1BVICovCisjZGVmaW5lIENPTkZJR19NUEM1MjAwCQkxCS8qIChtb3JlIHByZWNpc2VseSBhbiBNUEM1MjAwIENQVSkgKi8KKyNkZWZpbmUgQ09ORklHX0NNNTIwMAkJMQkvKiAuLi4gb24gQ001MjAwIHBsYXRmb3JtICovCisKKy8qCisgKiBTdXBwb3J0ZWQgY29tbWFuZHMKKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKyNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKworLyoKKyAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfUFNDX0NPTlNPTEUJMQkvKiBjb25zb2xlIGlzIG9uIFBTQzEgKi8KKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQk1NzYwMAkvKiAuLi4gYXQgNTc2MDAgYnBzICovCisjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCwgMjMwNDAwIH0KKyNkZWZpbmUgQ09ORklHX1NJTEVOVF9DT05TT0xFCTEJLyogbmVlZGVkIHRvIHNpbGVuY2UgaTJjX2luaXQoKSAqLworCisvKgorICogRXRoZXJuZXQgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19NUEM1eHh4X0ZFQwkxCisjZGVmaW5lIENPTkZJR19QSFlfQUREUgkJMHgwMAorI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQkxCS8qIGFsbG93IG92ZXJ3cml0aW5nIG9mIGV0aGFkZHIgKi8KKy8qIHVzZSBtaXNjX2luaXRfcigpIHRvIHJlYWQgZXRoYWRkciBmcm9tIEkyQyBFRVBST00gKHNlZSBDRkdfSTJDX0VFUFJPTSkgKi8KKyNkZWZpbmUgQ09ORklHX01JU0NfSU5JVF9SCTEKKyNkZWZpbmUgQ09ORklHX01BQ19PRkZTRVQJMHgzNQkvKiBNQUMgYWRkcmVzcyBvZmZzZXQgaW4gSTJDIEVFUFJPTSAqLworCisvKgorICogUE9TVCBzdXBwb3J0CisgKi8KKyNkZWZpbmUgQ09ORklHX1BPU1QJCShDRkdfUE9TVF9NRU1PUlkgfCBDRkdfUE9TVF9DUFUgfCBDRkdfUE9TVF9JMkMpCisjZGVmaW5lIE1QQzVYWFhfU1JBTV9QT1NUX1NJWkUJKE1QQzVYWFhfU1JBTV9TSVpFIC0gNCkKKy8qIExpc3Qgb2YgSTJDIGFkZHJlc3NlcyB0byBiZSB2ZXJpZmllZCBieSBQT1NUICovCisjZGVmaW5lIEkyQ19BRERSX0xJU1QJCXsgQ0ZHX0kyQ19TTEFWRSwgQ0ZHX0kyQ19JTywgQ0ZHX0kyQ19FRVBST00gfQorCisvKiBkaXNwbGF5IGltYWdlIHRpbWVzdGFtcHMgKi8KKyNkZWZpbmUgQ09ORklHX1RJTUVTVEFNUAkxCisKKy8qCisgKiBBdXRvYm9vdGluZworICovCisjZGVmaW5lIENPTkZJR19CT09UREVMQVkJNQkvKiBhdXRvYm9vdCBhZnRlciA1IHNlY29uZHMgKi8KKyNkZWZpbmUgQ09ORklHX1BSRUJPT1QJImVjaG87IiBcCisJImVjaG8gVHlwZSBcInJ1biBuZXRfbmZzX2ZkdFwiIHRvIG1vdW50IHJvb3QgZmlsZXN5c3RlbSBvdmVyIE5GUzsiIFwKKwkiZWNobyIKKyN1bmRlZiBDT05GSUdfQk9PVEFSR1MKKworLyoKKyAqIERlZmF1bHQgZW52aXJvbm1lbnQgc2V0dGluZ3MKKyAqLworI2RlZmluZSBDT05GSUdfRVhUUkFfRU5WX1NFVFRJTkdTCQkJCQlcCisJIm5ldGRldj1ldGgwXDAiCQkJCQkJCVwKKwkibmV0bWFzaz0yNTUuMjU1LjAuMFwwIgkJCQkJCVwKKwkiaXBhZGRyPTE5Mi4xNjguMTYwLjMzXDAiCQkJCQlcCisJInNlcnZlcmlwPTE5Mi4xNjguMS4xXDAiCQkJCQlcCisJImdhdGV3YXlpcD0xOTIuMTY4LjEuMVwwIgkJCQkJXAorCSJjb25zb2xlPXR0eVBTQzBcMCIJCQkJCQlcCisJInUtYm9vdF9hZGRyPTEwMDAwMFwwIgkJCQkJCVwKKwkia2VybmVsX2FkZHI9MjAwMDAwXDAiCQkJCQkJXAorCSJrZXJuZWxfYWRkcl9mbGFzaD1mYzBjMDAwMFwwIgkJCQkJXAorCSJmZHRfYWRkcj00MDAwMDBcMCIJCQkJCQlcCisJImZkdF9hZGRyX2ZsYXNoPWZjMGEwMDAwXDAiCQkJCQlcCisJInJhbWRpc2tfYWRkcj01MDAwMDBcMCIJCQkJCQlcCisJInJvb3RwYXRoPS9vcHQvZWxkay00LjEvcHBjXzZ4eFwwIgkJCQlcCisJInUtYm9vdD0vdGZ0cGJvb3QvY201MjAwL3UtYm9vdC5iaW5cMCIJCQkJXAorCSJib290ZmlsZV9mZHQ9L3RmdHBib290L2NtNTIwMC91SW1hZ2VcMCIJCQlcCisJImZkdF9maWxlPS90ZnRwYm9vdC9jbTUyMDAvY201MjAwLmR0YlwwIgkJCVwKKwkibG9hZD10ZnRwICR7dS1ib290X2FkZHJ9ICR7dS1ib290fVwwIgkJCQlcCisJInVwZGF0ZT1wcm90IG9mZiBmYzAwMDAwMCArJHtmaWxlc2l6ZX07ICIJCQlcCisJCSJlcmEgZmMwMDAwMDAgKyR7ZmlsZXNpemV9OyAiCQkJCVwKKwkJImNwLmIgJHt1LWJvb3RfYWRkcn0gZmMwMDAwMDAgJHtmaWxlc2l6ZX07ICIJCVwKKwkJInByb3Qgb24gZmMwMDAwMDAgKyR7ZmlsZXNpemV9XDAiCQkJXAorCSJuZnNhcmdzPXNldGVudiBib290YXJncyByb290PS9kZXYvbmZzIHJ3ICIJCQlcCisJCSJuZnNyb290PSR7c2VydmVyaXB9OiR7cm9vdHBhdGh9XDAiCQkJXAorCSJmbGFzaGFyZ3M9c2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9tdGRibG9jazUgcndcMCIJCVwKKwkiYWRkbXRkPXNldGVudiBib290YXJncyAke2Jvb3RhcmdzfSAke210ZHBhcnRzfVwwIgkJXAorCSJhZGRpbml0PXNldGVudiBib290YXJncyAke2Jvb3RhcmdzfSBpbml0PS9saW51eHJjXDAiCQlcCisJImFkZGNvbnM9c2V0ZW52IGJvb3RhcmdzICR7Ym9vdGFyZ3N9ICIJCQkJXAorCQkiY29uc29sZT0ke2NvbnNvbGV9LCR7YmF1ZHJhdGV9XDAiCQkJXAorCSJhZGRpcD1zZXRlbnYgYm9vdGFyZ3MgJHtib290YXJnc30gIgkJCQlcCisJCSJpcD0ke2lwYWRkcn06JHtzZXJ2ZXJpcH06JHtnYXRld2F5aXB9OiIJCVwKKwkJIiR7bmV0bWFza306JHtob3N0bmFtZX06JHtuZXRkZXZ9Om9mZiBwYW5pYz0xXDAiCVwKKwkiZmxhc2hfZmxhc2g9cnVuIGZsYXNoYXJncyBhZGRpbml0IGFkZGlwIGFkZGNvbnM7IgkJXAorCQkiYm9vdG0gJHtrZXJuZWxfYWRkcl9mbGFzaH0gLSAke2ZkdF9hZGRyX2ZsYXNofVwwIglcCisJIm5ldF9uZnNfZmR0PXRmdHAgJHtrZXJuZWxfYWRkcn0gJHtib290ZmlsZV9mZHR9OyAiCQlcCisJCSJ0ZnRwICR7ZmR0X2FkZHJ9ICR7ZmR0X2ZpbGV9OyBydW4gbmZzYXJncyBhZGRpcCAiCVwKKwkJImFkZGNvbnM7IGJvb3RtICR7a2VybmVsX2FkZHJ9IC0gJHtmZHRfYWRkcn1cMCIJCVwKKwkiIgorI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJInJ1biBmbGFzaF9mbGFzaCIKKworLyoKKyAqIExvdyBsZXZlbCBjb25maWd1cmF0aW9uCisgKi8KKworLyoKKyAqIENsb2NrIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDRkdfTVBDNVhYWF9DTEtJTgkzMzAwMDAwMAkvKiBTWVNfWFRBTF9JTiA9IDMzTUh6ICovCisjZGVmaW5lIENGR19JUEJDTEtfRVFVQUxTX1hMQkNMSwkxCS8qIElQQiA9IDEzM01IeiAqLworCisvKgorICogTWVtb3J5IG1hcAorICovCisjZGVmaW5lIENGR19NQkFSCQkweEYwMDAwMDAwCisjZGVmaW5lIENGR19TRFJBTV9CQVNFCQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19ERUZBVUxUX01CQVIJMHg4MDAwMDAwMAorCisjZGVmaW5lIENGR19MT1dCT09UCQkxCisKKy8qIFVzZSBPTi1DaGlwIFNSQU0gdW50aWwgUkFNIHdpbGwgYmUgYXZhaWxhYmxlICovCisjZGVmaW5lIENGR19JTklUX1JBTV9BRERSCU1QQzVYWFhfU1JBTQorI2lmZGVmIENPTkZJR19QT1NUCisvKiBwcmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIHBvc3Rfd29yZCBhdCBlbmQgb2Ygb24tY2hpcCBTUkFNICovCisjZGVmaW5lIENGR19JTklUX1JBTV9FTkQJTVBDNVhYWF9TUkFNX1BPU1RfU0laRQorI2Vsc2UKKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0VORAlNUEM1WFhYX1NSQU1fU0laRQorI2VuZGlmCisKKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX1NJWkUJMTI4CS8qIHNpemUgaW4gYnl0ZXMgZm9yIGluaXRpYWwgZGF0YSAqLworI2RlZmluZSBDRkdfR0JMX0RBVEFfT0ZGU0VUCShDRkdfSU5JVF9SQU1fRU5EIC0gQ0ZHX0dCTF9EQVRBX1NJWkUpCisjZGVmaW5lIENPTkZJR19CT0FSRF9UWVBFUwkxCS8qIHdlIHVzZSBib2FyZF90eXBlICovCisKKyNkZWZpbmUgQ0ZHX0lOSVRfU1BfT0ZGU0VUCUNGR19HQkxfREFUQV9PRkZTRVQKKworI2RlZmluZSBDRkdfTU9OSVRPUl9CQVNFCVRFWFRfQkFTRQorI2RlZmluZSBDRkdfTU9OSVRPUl9MRU4JCSgzODQgPDwgMTApCS8qIDM4NCBrQiBmb3IgTW9uaXRvciAqLworI2RlZmluZSBDRkdfTUFMTE9DX0xFTgkJKDI1NiA8PCAxMCkJLyogMjU2IGtCIGZvciBtYWxsb2MoKSAqLworI2RlZmluZSBDRkdfQk9PVE1BUFNaCQkoOCA8PCAyMCkJLyogaW5pdGlhbCBtZW0gbWFwIGZvciBMaW51eCAqLworCisvKgorICogRmxhc2ggY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENGR19GTEFTSF9DRkkJCTEKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0NGSV9EUklWRVIJMQorI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJMHhmYzAwMDAwMAorLyogd2UgbmVlZCB0aGVzZSBkZXNwaXRlIHVzaW5nIENGSSAqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX0JBTktTCTEJLyogbWF4IG51bSBvZiBmbGFzaCBiYW5rcyAqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX1NFQ1QJMjU2CS8qIG1heCBudW0gb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcCAqLworI2RlZmluZSBDRkdfRkxBU0hfU0laRQkJMHgwMjAwMDAwMCAvKiAzMiBNaUIgKi8KKworCisjaWYgKENGR19NT05JVE9SX0JBU0UgPCBDRkdfRkxBU0hfQkFTRSkKKyNkZWZpbmUgQ0ZHX1JBTUJPT1QJCTEKKyN1bmRlZiBDRkdfTE9XQk9PVAorI2VuZGlmCisKKworLyoKKyAqIENoaXAgc2VsZWN0cyBjb25maWd1cmF0aW9uCisgKi8KKy8qIEJvb3QgQ2hpcHNlbGVjdCAqLworI2RlZmluZSBDRkdfQk9PVENTX1NUQVJUCUNGR19GTEFTSF9CQVNFCisjZGVmaW5lIENGR19CT09UQ1NfU0laRQkJQ0ZHX0ZMQVNIX1NJWkUKKyNkZWZpbmUgQ0ZHX0JPT1RDU19DRkcJCTB4MDAwODdEMzEJLyogZm9yIHBjaV9jbGsgPSAzMyBNSHogKi8KKy8qIHVzZSBib2FyZF9lYXJseV9pbml0X3IgdG8gZW5hYmxlIGZsYXNoIHdyaXRlIGluIENTX0JPT1QgKi8KKyNkZWZpbmUgQ09ORklHX0JPQVJEX0VBUkxZX0lOSVRfUgorCisvKiBGbGFzaCBtZW1vcnkgYWRkcmVzc2luZyAqLworI2RlZmluZSBDRkdfQ1MwX1NUQVJUCQlDRkdfRkxBU0hfQkFTRQorI2RlZmluZSBDRkdfQ1MwX1NJWkUJCUNGR19GTEFTSF9TSVpFCisKKy8qIE5vIGJ1cnN0LCBkZWFkIGN5Y2xlID0gMSBmb3IgQ1MwIChGbGFzaCkgKi8KKyNkZWZpbmUgQ0ZHX0NTX0JVUlNUCQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19DU19ERUFEQ1lDTEUJMHgwMDAwMDAwMQorCisvKgorICogU0RSQU0gY29uZmlndXJhdGlvbgorICogc2V0dGluZ3MgZm9yIGs0czU2MTYzMkUteHg3NSwgYXNzdW1pbmcgWExCID0gMTMyIE1IegorICovCisjZGVmaW5lIFNEUkFNX01PREUJMHgwMENEMDAwMAkvKiBDQVNMIDMsIGJ1cnN0IGxlbmd0aCA4ICovCisjZGVmaW5lIFNEUkFNX0NPTlRST0wJMHg1MTRGMDAwMAorI2RlZmluZSBTRFJBTV9DT05GSUcxCTB4RTIzMzM5MDAKKyNkZWZpbmUgU0RSQU1fQ09ORklHMgkweDhFRTcwMDAwCisKKy8qCisgKiBNVEQgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19KRkZTMl9DTURMSU5FCTEKKyNkZWZpbmUgTVRESURTX0RFRkFVTFQJCSJub3IwPWNtNTIwMC0wIgorI2RlZmluZSBNVERQQVJUU19ERUZBVUxUCSJtdGRwYXJ0cz1jbTUyMDAtMDoiCQkJXAorCQkJCQkiMzg0ayh1Ym9vdCksMTI4ayhlbnYpLCIJXAorCQkJCQkiMTI4ayhyZWR1bmRfZW52KSwxMjhrKGR0YiksIglcCisJCQkJCSIybShrZXJuZWwpLDI3OTA0ayhyb290ZnMpLCIJXAorCQkJCQkiLShjb25maWcpIgorCisvKgorICogSTJDIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfSEFSRF9JMkMJCTEJLyogSTJDIHdpdGggaGFyZHdhcmUgc3VwcG9ydCAqLworI2RlZmluZSBDRkdfSTJDX01PRFVMRQkJMgkvKiBTZWxlY3QgSTJDIG1vZHVsZSAjMiAqLworI2RlZmluZSBDRkdfSTJDX1NQRUVECQk0MDAwMAkvKiA0MCBrSHogKi8KKyNkZWZpbmUgQ0ZHX0kyQ19TTEFWRQkJMHgwCisjZGVmaW5lIENGR19JMkNfSU8JCTB4MzgJLyogUENBOTU1NEFEIEkyQyBJL08gcG9ydCBhZGRyZXNzICovCisjZGVmaW5lIENGR19JMkNfRUVQUk9NCQkweDUzCS8qIEkyQyBFRVBST00gZGV2aWNlIGFkZHJlc3MgKi8KKworLyoKKyAqIFJUQyBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX1JUQ19NUEM1MjAwCTEJLyogdXNlIGludGVybmFsIE1QQzUyMDAgUlRDICovCisKKy8qCisgKiBVU0IgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19VU0JfT0hDSQkJMQorI2RlZmluZSBDT05GSUdfVVNCX1NUT1JBR0UJMQorI2RlZmluZSBDT05GSUdfVVNCX0NMT0NLCTB4MDAwMUJCQkIKKyNkZWZpbmUgQ09ORklHX1VTQl9DT05GSUcJMHgwMDAwMTAwMAorLyogUGFydGl0aW9ucyAoZm9yIFVTQikgKi8KKyNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04JMQorI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgkxCisjZGVmaW5lIENPTkZJR19JU09fUEFSVElUSU9OCTEKKworLyoKKyAqIEludm9rZSBvdXIgbGFzdF9zdGFnZV9pbml0IGZ1bmN0aW9uIC0gbmVlZGVkIGJ5IGZ3dXBkYXRlCisgKi8KKyNkZWZpbmUgQ09ORklHX0xBU1RfU1RBR0VfSU5JVAkxCisKKy8qCisgKiBFbnZpcm9ubWVudCBzZXR0aW5ncworICovCisjZGVmaW5lIENGR19FTlZfSVNfSU5fRkxBU0gJMQorI2RlZmluZSBDRkdfRU5WX1NJWkUJCTB4MTAwMDAKKyNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJMHgyMDAwMAorI2RlZmluZSBDRkdfRU5WX0FERFIJCShDRkdfRkxBU0hfQkFTRSArIENGR19NT05JVE9SX0xFTikKKy8qIENvbmZpZ3VyYXRpb24gb2YgcmVkdW5kYW50IGVudmlyb25tZW50ICovCisjZGVmaW5lIENGR19FTlZfQUREUl9SRURVTkQJKENGR19FTlZfQUREUiArIENGR19FTlZfU0VDVF9TSVpFKQorI2RlZmluZSBDRkdfRU5WX1NJWkVfUkVEVU5ECShDRkdfRU5WX1NJWkUpCisKKy8qCisgKiBQaW4gbXVsdGlwbGV4aW5nIGNvbmZpZ3VyYXRpb24KKyAqLworCisvKgorICogQ1MxL0dQSU9fV0tVUF82OiBHUElPIChkZWZhdWx0KQorICogQUxUczogQ0FOMSBvbiBJMkMxLCBDQU4yIG9uIFRJTUVSMC8xCisgKiBJUkRBL1BTQzY6IFVBUlQKKyAqIEV0aGVyOiBFdGhlcm5ldCAxMDBNYml0IHdpdGggTUQKKyAqIFBDSV9ESVM6IFBDSSBjb250cm9sbGVyIGRpc2FibGVkCisgKiBVU0I6IFVTQgorICogUFNDMzogU1BJIHdpdGggVUFSVDMKKyAqIFBTQzI6IFVBUlQKKyAqIFBTQzE6IFVBUlQKKyAqLworI2RlZmluZSBDRkdfR1BTX1BPUlRfQ09ORklHCTB4MTA1NTlDNDQKKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDRkdfTE9OR0hFTFAJCTEJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkgKi8KKyNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLworI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCisjZGVmaW5lIENGR19QQlNJWkUgKENGR19DQlNJWkUrc2l6ZW9mKENGR19QUk9NUFQpKzE2KSAvKiBQcmludCBCdWZmZXIgU2l6ZSAqLworI2RlZmluZSBDRkdfTUFYQVJHUwkJMTYJLyogbWF4IG51bWJlciBvZiBjb21tYW5kIGFyZ3MgKi8KKyNkZWZpbmUgQ0ZHX0JBUkdTSVpFCQlDRkdfQ0JTSVpFCS8qIEJvb3QgQXJndW1lbnQgQnVmZmVyIFNpemUgKi8KKworI2RlZmluZSBDRkdfQUxUX01FTVRFU1QJCTEKKyNkZWZpbmUgQ0ZHX01FTVRFU1RfU1RBUlQJMHgwMDEwMDAwMAkvKiBtZW10ZXN0IHdvcmtzIG9uICovCisjZGVmaW5lIENGR19NRU1URVNUX0VORAkJMHgwM2YwMDAwMAkvKiAxIC4uIDYzIE1pQiBpbiBTRFJBTSAqLworCisjZGVmaW5lIENPTkZJR19MT09QVwkJMQorCisjZGVmaW5lIENGR19MT0FEX0FERFIJCTB4MTAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCisjZGVmaW5lIENGR19IWgkJCTEwMDAJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcyAqLworCisvKgorICogVmFyaW91cyBsb3ctbGV2ZWwgc2V0dGluZ3MKKyAqLworI2RlZmluZSBDRkdfSElEMF9JTklUCQlISUQwX0lDRSB8IEhJRDBfSUNGSQorI2RlZmluZSBDRkdfSElEMF9GSU5BTAkJSElEMF9JQ0UKKworI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCisjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290ICovCisKKyNkZWZpbmUgQ0ZHX1hMQl9QSVBFTElOSU5HCTEJLyogZW5hYmxlIHRyYW5zYWN0aW9uIHBpcGVsaW5nICovCisKKy8qCisgKiBDYWNoZSBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KKyNpZmRlZiBDT05GSUdfQ01EX0tHREIKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCisjZW5kaWYKKworLyoKKyAqIEZsYXQgRGV2aWNlIFRyZWUgc3VwcG9ydAorICovCisjZGVmaW5lIENPTkZJR19PRl9MSUJGRFQJMQorI2RlZmluZSBDT05GSUdfT0ZfQk9BUkRfU0VUVVAJMQorI2RlZmluZSBPRl9DUFUJCQkiUG93ZXJQQyw1MjAwQDAiCisjZGVmaW5lIE9GX1NPQwkJCSJzb2M1MjAwQGYwMDAwMDAwIgorI2RlZmluZSBPRl9UQkNMSwkJKGJkLT5iaV9idXNmcmVxIC8gNCkKKyNkZWZpbmUgT0ZfU1RET1VUX1BBVEgJCSIvc29jNTIwMEBmMDAwMDAwMC9zZXJpYWxAMjAwMCIKKworI2VuZGlmIC8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9jbWNfcHUyLmggYi9pbmNsdWRlL2NvbmZpZ3MvY21jX3B1Mi5oCmluZGV4IDU3MmE3MGYuLmYzMmM4YzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9jbWNfcHUyLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2NtY19wdTIuaApAQCAtMTA0LDM1ICsxMDQsNDQgQEAKICNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUgkweDUwCiAjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFJfTEVOIDEKICNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUl9PVkVSRkxPVworI2Vsc2UKKyNkZWZpbmUgQ09ORklHX1RJTUVTVEFNUAogI2VuZGlmCiAvKiBzdGlsbCBhYm91dCAyMCBrQiBmcmVlIHdpdGggdGhpcyBkZWZpbmVkICovCiAjZGVmaW5lIENGR19MT05HSEVMUAogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkgICAgICAxCiAKLSNpZmRlZiBDT05GSUdfSEFSRF9JMkMKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQlcCi0JCSAgICAgICAoKENPTkZJR19DTURfREZMCXwgXAotCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJQ0ZHX0NNRF9ESENQIAl8IFwKLQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQlDRkdfQ01EX05GUwl8IFwKLQkJCUNGR19DTURfU05UUCAgKSAmIFwKLQkJICAgICAgfihDRkdfQ01EX0ZQR0EgfCBDRkdfQ01EX01JU0MpICkKLSNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJXAotCQkgICAgICAgKChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCUNGR19DTURfREhDUCAJfCBcCi0JCQlDRkdfQ01EX05GUwl8IFwKLQkJCUNGR19DTURfU05UUCAgKSAmIFwKLQkJICAgICAgfihDRkdfQ01EX0ZQR0EgfCBDRkdfQ01EX01JU0MpICkKLSNkZWZpbmUgQ09ORklHX1RJTUVTVEFNUAotI2VuZGlmCi0jZGVmaW5lIENGR19MT05HSEVMUAogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKworI3VuZGVmIENPTkZJR19DTURfRlBHQQorI3VuZGVmIENPTkZJR19DTURfTUlTQworCisjaWYgZGVmaW5lZChDT05GSUdfSEFSRF9JMkMpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyAgICAjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2VuZGlmCisKKworI2RlZmluZSBDRkdfTE9OR0hFTFAKIAogI2RlZmluZSBBVDkxX1NNQVJUX01FRElBX0FMRQkoMSA8PCAyMikJLyogb3VyIEFMRSBpcyBBRDIyICovCiAjZGVmaW5lIEFUOTFfU01BUlRfTUVESUFfQ0xFCSgxIDw8IDIxKQkvKiBvdXIgQ0xFIGlzIEFEMjEgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9jbWlfbXBjNXh4LmggYi9pbmNsdWRlL2NvbmZpZ3MvY21pX21wYzV4eC5oCmluZGV4IGU0NTk5MTkuLmNkOTJhZjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9jbWlfbXBjNXh4LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2NtaV9tcGM1eHguaApAQCAtNDQsMTMgKzQ0LDMzIEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQk1NzYwMAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENGR19DTURfTUVNT1JZIHwgQ0ZHX0NNRF9MT0FEQiB8IENGR19DTURfUkVHSU5GTyB8IAkJXAotCQkJCSBDRkdfQ01EX0ZMQVNIIHwgQ0ZHX0NNRF9MT0FEUyB8IENGR19DTURfQVNLRU5WIHwgICAJCVwKLQkJCQkgQ0ZHX0NNRF9CREkgfCBDRkdfQ01EX0NPTlNPTEUgfCBDRkdfQ01EX0VOViB8IENGR19DTURfUlVOIHwJXAotCQkJCSBDRkdfQ01EX0lNSSkKIAotLyogVGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX0xPQURCCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfTE9BRFMKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9CREkKKyNkZWZpbmUgQ09ORklHX0NNRF9DT05TT0xFCisjZGVmaW5lIENPTkZJR19DTURfRU5WCisjZGVmaW5lIENPTkZJR19DTURfUlVOCisjZGVmaW5lIENPTkZJR19DTURfSU1JCisKIAogI2lmIDAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQktMQkJLyogYXV0b2Jvb3QgZGlzYWJsZWQJCQkqLwpAQCAtNzMsNyArOTMsNyBAQAogCiAjZGVmaW5lCUNGR19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2NvYnJhNTI3Mi5oIGIvaW5jbHVkZS9jb25maWdzL2NvYnJhNTI3Mi5oCmluZGV4IDkwMzNmYTguLjUxMDUyNGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9jb2JyYTUyNzIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvY29icmE1MjcyLmgKQEAgLTEzMCwxNiArMTMwLDI3IEBACiAjZGVmaW5lIENGR19FTlZfSVNfSU5fRkxBU0gJMQogI2VuZGlmCiAKLS8qIC0tLQotICogRGVmaW5lIHdoaWNoIGNvbW1tYW5kcyBzaG91bGQgYmUgYXZhaWxhYmxlIGF0IHUtYm9vdCBjb21tYW5kIHByb21wdAotICogLS0tCisKKy8qCisgKiBCT09UUCBvcHRpb25zCiAgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAoIENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QSU5HICYgfihDRkdfQ01EX0xPQURTIHwgXAotQ0ZHX0NNRF9MT0FEQikgfCBDRkdfQ01EX01JSSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjdW5kZWYgQ09ORklHX0NNRF9MT0FEQgorI3VuZGVmIENPTkZJR19DTURfTUlJCisKIAogLyoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE4NCw3ICsxOTUsNyBAQAogCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvY29nZW50X21wYzgyNjAuaCBiL2luY2x1ZGUvY29uZmlncy9jb2dlbnRfbXBjODI2MC5oCmluZGV4IGFlYTJlNjQuLjg0ZDUwYzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9jb2dlbnRfbXBjODI2MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9jb2dlbnRfbXBjODI2MC5oCkBAIC03MSw4ICs3MSw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICovCiAjdW5kZWYJQ09ORklHX0VUSEVSX09OX1NDQwkJLyogZGVmaW5lIGlmIGV0aGVyIG9uIFNDQwkqLwogI3VuZGVmCUNPTkZJR19FVEhFUl9PTl9GQ0MJCS8qIGRlZmluZSBpZiBldGhlciBvbiBGQ0MJKi8KQEAgLTg4LDEwICs4NywyNSBAQAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTk2MDAKICNlbmRpZgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKChDT05GSUdfQ01EX0RGTHxDRkdfQ01EX0tHREIpJn5DRkdfQ01EX05FVCkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0tHREIKKworI3VuZGVmIENPTkZJR19DTURfTkVUCisKIAogI2lmZGVmIERFQlVHCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJLTEJLyogYXV0b2Jvb3QgZGlzYWJsZWQJCSovCkBAIC0xMDIsNyArMTE2LDcgQEAKIAogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MJCSJyb290PS9kZXYvcmFtIHJ3IgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ09ORklHX0tHREJfT05fU01DCQkvKiBkZWZpbmUgaWYga2dkYiBvbiBTTUMgKi8KICN1bmRlZglDT05GSUdfS0dEQl9PTl9TQ0MJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIFNDQyAqLwogI3VuZGVmCUNPTkZJR19LR0RCX05PTkUJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIHNvbWV0aGluZyBlbHNlICovCkBAIC0xMjQsNyArMTM4LDcgQEAKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjU2LDcgKzI3MCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM4MjYwIENQVQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvY29nZW50X21wYzh4eC5oIGIvaW5jbHVkZS9jb25maWdzL2NvZ2VudF9tcGM4eHguaAppbmRleCA4MDk2MmQzLi5jZTM4YWYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvY29nZW50X21wYzh4eC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9jb2dlbnRfbXBjOHh4LmgKQEAgLTU5LDEwICs1OSwyNSBAQAogI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkweDdGCiAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSgoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX0tHREIgfCBDRkdfQ01EX0kyQykgJiB+Q0ZHX0NNRF9ORVQpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfS0dEQgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworCisjdW5kZWYgQ09ORklHX0NNRF9ORVQKKwogCiAjaWYgMAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCS0xCS8qIGF1dG9ib290IGRpc2FibGVkCQkqLwpAQCAtNzMsNyArODgsNyBAQAogCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJInJvb3Q9L2Rldi9yYW0gcnciCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI3VuZGVmCUNPTkZJR19LR0RCX09OX1NNQwkJLyogZGVmaW5lIGlmIGtnZGIgb24gU01DICovCiAjdW5kZWYJQ09ORklHX0tHREJfT05fU0NDCQkvKiBkZWZpbmUgaWYga2dkYiBvbiBTQ0MgKi8KICNkZWZpbmUJQ09ORklHX0tHREJfTk9ORQkJLyogZGVmaW5lIGlmIGtnZGIgb24gc29tZXRoaW5nIGVsc2UgKi8KQEAgLTg4LDcgKzEwMyw3IEBACiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTIwMCw3ICsyMTUsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvY3BjaTUyMDAuaCBiL2luY2x1ZGUvY29uZmlncy9jcGNpNTIwMC5oCmluZGV4IGY1ZWZjZDkuLmNlNGVhMWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9jcGNpNTIwMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9jcGNpNTIwMC5oCkBAIC01MCwxMSArNTAsNiBAQAogI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdAkgICAgICovCiAKLSNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQotIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwotI2VuZGlmCi0KIC8qCiAgKiBTZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCiAgKi8KQEAgLTkyLDEyICs4Nyw2IEBACiAjZGVmaW5lIENPTkZJR19OUzgzODJYCQkxCiAjZW5kaWYKIAotI2RlZmluZSBBRERfUENJX0NNRAkJQ0ZHX0NNRF9QQ0kKLQotI2Vsc2UJCQkJLyogTVBDNTEwMCAqLwotCi0jZGVmaW5lIEFERF9QQ0lfQ01ECQkwCS8qIG5vIENGR19DTURfUENJICovCi0KICNlbmRpZgogCiAvKiBQYXJ0aXRpb25zICovCkBAIC0xMDcsMjggKzk2LDM1IEBACiAvKiBVU0IgKi8KICNpZiAwCiAjZGVmaW5lIENPTkZJR19VU0JfT0hDSQotI2RlZmluZSBBRERfVVNCX0NNRAkJQ0ZHX0NNRF9VU0IgfCBDRkdfQ01EX0ZBVAogI2RlZmluZSBDT05GSUdfVVNCX1NUT1JBR0UKLSNlbHNlCi0jZGVmaW5lIEFERF9VU0JfQ01ECQkwCiAjZW5kaWYKIAogLyoKLSAqIFN1cHBvcnRlZCBjb21tYW5kcworICogQk9PVFAgb3B0aW9ucwogICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMCXwgXAotCQkJCSBDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQkgQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJIENGR19DTURfSURFCXwgXAotCQkJCSBDRkdfQ01EX0kyQwl8IFwKLQkJCQkgQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJIENGR19DTURfRUxGCXwgXAotCQkJCSBDRkdfQ01EX0VYVDIJfCBcCi0JCQkJIENGR19DTURfREFURQl8IFwKLQkJCQkgQUREX1BDSV9DTUQJICApCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2VuZGlmCisKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9FWFQyCisjZGVmaW5lIENPTkZJR19DTURfREFURQogCiAjaWYgKFRFWFRfQkFTRSA9PSAweEZGMDAwMDAwKQkvKiBCb290IGxvdyB3aXRoIDE2IE1CIEZsYXNoICovCiAjICAgZGVmaW5lIENGR19MT1dCT09UCQkxCkBAIC0yNzcsNyArMjczLDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtMjk1LDYgKzI5MSwxMSBAQAogCiAjZGVmaW5lIENGR19WWFdPUktTX01BQ19QVFIJMHgwMDAwMDAwMAkvKiBQYXNzIEV0aGVybmV0IE1BQyB0byBWeFdvcmtzICovCiAKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKyNlbmRpZgorCiAvKgogICogVmFyaW91cyBsb3ctbGV2ZWwgc2V0dGluZ3MKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2NyYWRsZS5oIGIvaW5jbHVkZS9jb25maWdzL2NyYWRsZS5oCmluZGV4IDc3NmUxZDIuLmViOTNhOGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9jcmFkbGUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvY3JhZGxlLmgKQEAgLTYxLDEwICs2MSwyMSBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURSAgICAgICAgIDExNTIwMAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAgICAgICAgIChDT05GSUdfQ01EX0RGTCkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkgICAgICAgIDMKICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTICAgICAgICAgInJvb3Q9L2Rldi9tdGRibG9jazIgY29uc29sZT10dHlTMCwxMTUyMDAiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvY3NiMjI2LmggYi9pbmNsdWRlL2NvbmZpZ3MvY3NiMjI2LmgKaW5kZXggZjA0MTAyZS4uMGJlMGYyMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2NzYjIyNi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9jc2IyMjYuaApAQCAtNTcsMTAgKzU3LDM0IEBACiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTkyMDAKICN1bmRlZiAgQ09ORklHX01JU0NfSU5JVF9SCQkvKiBub3QgdXNlZCB5ZXQgICAgICAgICAgICAgICAgICAgICAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAoQ0ZHX0NNRF9CREl8Q0ZHX0NNRF9MT0FEQnxDRkdfQ01EX0lNSXxDRkdfQ01EX0ZMQVNIfENGR19DTURfTUVNT1JZfENGR19DTURfTkVUfENGR19DTURfRU5WfENGR19DTURfUlVOfENGR19DTURfQVNLRU5WfENGR19DTURfRUNIT3xDRkdfQ01EX0RIQ1B8Q0ZHX0NNRF9DQUNIRSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0JESQorI2RlZmluZSBDT05GSUdfQ01EX0xPQURCCisjZGVmaW5lIENPTkZJR19DTURfSU1JCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gKKyNkZWZpbmUgQ09ORklHX0NNRF9NRU1PUlkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9SVU4KKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9FQ0hPCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTCQkiY29uc29sZT10dHlTMCwxOTIwMCBpcD0xOTIuMTY4LjEuMTAsMTkyLjE2OC4xLjUsLDI1NSwyNTUsMjU1LDAsY3NiIHJvb3Q9L2Rldi9uZnMsIGV0aGVyPTAsMHgwODAwMDAwMCxldGgwIgpAQCAtNzMsNyArOTcsNyBAQAogCiAjZGVmaW5lIENPTkZJR19DTURMSU5FX1RBRwkxCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxOTIwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvY3NiMjcyLmggYi9pbmNsdWRlL2NvbmZpZ3MvY3NiMjcyLmgKaW5kZXggMjdkNjRjMS4uYzQzYjQ5NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2NzYjI3Mi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9jc2IyNzIuaApAQCAtNzMsMzAgKzczLDMyIEBACiAjZW5kaWYKIAogLyoKLSAqIEJPT1RQL0RIQ1AgcHJvdG9jb2wgY29uZmlndXJhdGlvbgotICoKKyAqIEJPT1RQIG9wdGlvbnMKICAqLwotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoIENPTkZJR19CT09UUF9ERUZBVUxUCQl8IFwKLQkJCQkgIENPTkZJR19CT09UUF9ETlMyCQl8IFwKLQkJCQkgIENPTkZJR19CT09UUF9CT09URklMRVNJWkUJKQotLyoKLSAqIFUtQm9vdCBNb25pdG9yIENvbW1hbmQgTGluZSBGdW5jdGlvbnMgQ29uZmlndXJhdGlvbgotICoKLSAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJICBDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQkgIENGR19DTURfQkVEQlVHCXwgXAotCQkJCSAgQ0ZHX0NNRF9FTEYJCXwgXAotCQkJCSAgQ0ZHX0NNRF9JUlEJCXwgXAotCQkJCSAgQ0ZHX0NNRF9JMkMJCXwgXAotCQkJCSAgQ0ZHX0NNRF9QQ0kJCXwgXAotCQkJCSAgQ0ZHX0NNRF9EQVRFCQl8IFwKLQkJCQkgIENGR19DTURfTUlJCQl8IFwKLQkJCQkgIENGR19DTURfUElORwkJfCBcCi0JCQkJICBDRkdfQ01EX0RIQ1AJCSApCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TMgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisKIAogLyoKICAqIFNlcmlhbCBkb3dubG9hZCBjb25maWd1cmF0aW9uCkBAIC0xMDksNyArMTExLDcgQEAKICAqIEtHREIgQ29uZmlndXJhdGlvbgogICoKICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpAQCAtMTI1LDcgKzEyNyw3IEBACiAKICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2NzYjQ3Mi5oIGIvaW5jbHVkZS9jb25maWdzL2NzYjQ3Mi5oCmluZGV4IDA5ZDUyZGUuLmE3MTIwYWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9jc2I0NzIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvY3NiNDcyLmgKQEAgLTczLDMwICs3MywzMSBAQAogI2VuZGlmCiAKIC8qCi0gKiBCT09UUC9ESENQIHByb3RvY29sIGNvbmZpZ3VyYXRpb24KLSAqCisgKiBCT09UUCBvcHRpb25zCiAgKi8KLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKCBDT05GSUdfQk9PVFBfREVGQVVMVAkJfCBcCi0JCQkJICBDT05GSUdfQk9PVFBfRE5TMgkJfCBcCi0JCQkJICBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCSkKLS8qCi0gKiBVLUJvb3QgTW9uaXRvciBDb21tYW5kIExpbmUgRnVuY3Rpb25zIENvbmZpZ3VyYXRpb24KLSAqCi0gKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoIENPTkZJR19DTURfREZMCXwgXAotCQkJCSAgQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJICBDRkdfQ01EX0JFREJVRwl8IFwKLQkJCQkgIENGR19DTURfRUxGCQl8IFwKLQkJCQkgIENGR19DTURfSVJRCQl8IFwKLQkJCQkgIENGR19DTURfSTJDCQl8IFwKLQkJCQkgIENGR19DTURfUENJCQl8IFwKLQkJCQkgIENGR19DTURfREFURQkJfCBcCi0JCQkJICBDRkdfQ01EX01JSQkJfCBcCi0JCQkJICBDRkdfQ01EX1BJTkcJCXwgXAotCQkJCSAgQ0ZHX0NNRF9ESENQCQkgKQorI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUzIKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0JFREJVRworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfREhDUAogCiAvKgogICogU2VyaWFsIGRvd25sb2FkIGNvbmZpZ3VyYXRpb24KQEAgLTEwOSw3ICsxMTAsNyBAQAogICogS0dEQiBDb25maWd1cmF0aW9uCiAgKgogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCkBAIC0xMjUsNyArMTI2LDcgQEAKIAogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvY3NiNjM3LmggYi9pbmNsdWRlL2NvbmZpZ3MvY3NiNjM3LmgKaW5kZXggMDcxZDViNy4uOTc2ZGFlMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2NzYjYzNy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9jc2I2MzcuaApAQCAtOTksMjAgKzk5LDMyIEBACiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkgICAgICAzCiAvKiAjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFCTEgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCVwKLQkJICAgICAgICgoQ09ORklHX0NNRF9ERkwgfCBcCi0JCQlDRkdfQ01EX0pGRlMyIHwgXAotCQkJQ0ZHX0NNRF9ESENQIHwgXAotCQkJQ0ZHX0NNRF9QSU5HICkgJiBcCi0JCSAgICAgIH4oQ0ZHX0NNRF9CREkgfCBcCi0JCQlDRkdfQ01EX0lNSSB8IFwKLQkJCUNGR19DTURfQVVUT1NDUklQVCB8IFwKLQkJCUNGR19DTURfRlBHQSB8IFwKLQkJCUNGR19DTURfTUlTQyB8IFwKLQkJCUNGR19DTURfTE9BRFMgKSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKworI3VuZGVmIENPTkZJR19DTURfQkRJCisjdW5kZWYgQ09ORklHX0NNRF9JTUkKKyN1bmRlZiBDT05GSUdfQ01EX0FVVE9TQ1JJUFQKKyN1bmRlZiBDT05GSUdfQ01EX0ZQR0EKKyN1bmRlZiBDT05GSUdfQ01EX01JU0MKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisKIAogI2RlZmluZSBDRkdfTUFYX05BTkRfREVWSUNFCTEJLyogTWF4IG51bWJlciBvZiBOQU5EIGRldmljZXMJCSovCiAjZGVmaW5lIFNFQ1RPUlNJWkUgNTEyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvZGF2aW5jaV9kdmV2bS5oIGIvaW5jbHVkZS9jb25maWdzL2RhdmluY2lfZHZldm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWNkMDU5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb25maWdzL2RhdmluY2lfZHZldm0uaApAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBTZXJnZXkgS3VidXNoeW4gPGtzaUBrb2k4Lm5ldD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorI2luY2x1ZGUgPGFzbS9zaXplcy5oPgorCisvKgorICogRGVmaW5lIHRoaXMgdG8gbWFrZSBVLUJvb3Qgc2tpcCBsb3cgbGV2ZWwgaW5pdGlhbGl6YXRpb24gd2hlbiBsb2FkZWQKKyAqIGJ5IGluaXRpYWwgYm9vdGxvYWRlci4gTm90IHJlcXVpcmVkIGJ5IE5BTkQgVS1Cb290IHZlcnNpb24gYnV0IElTCisgKiByZXF1aXJlZCBmb3IgYSBOT1IgdmVyc2lvbiB1c2VkIHRvIGJ1cm4gdGhlIHJlYWwgTk9SIFUtQm9vdCBpbnRvCisgKiBOT1IgRmxhc2guIE5BTkQgYW5kIE5PUiBzdXBwb3J0IGZvciBEYVZpbmNpIGNoaXBzIGlzIG11dHVhbGx5IGV4Y2x1c2l2ZQorICogc28gaXQgaXMgTk9UIHBvc3NpYmxlIHRvIGJ1aWxkIGEgVS1Cb290IHdpdGggYm90aCBOQU5EIGFuZCBOT1Igcm91dGluZXMuCisgKiBOT1IgVS1Cb290IGlzIGxvYWRlZCBkaXJlY3RseSBmcm9tIEZsYXNoIHNvIGl0IG11c3QgcGVyZm9ybSBhbGwgdGhlCisgKiBsb3cgbGV2ZWwgaW5pdGlhbGl6YXRpb24gaXRzZWxmLiBOQU5EIHZlcnNpb24gaXMgbG9hZGVkIGJ5IGFuIGluaXRpYWwKKyAqIGJvb3Rsb2FkZXIgKFVCTCBpbiBUSS1lc2UpIHRoYXQgcGVyZm9ybXMgc3VjaCBhbiBpbml0aWFsaXphdGlvbiBzbyBpdCdzCisgKiBza2lwcGVkIGluIE5BTkQgdmVyc2lvbi4gVGhlIHRoaXJkIERhVmluY2kgYm9vdCBtb2RlIGxvYWRzIGEgYm9vdGxvYWRlcgorICogdmlhIFVBUlQwIGFuZCB0aGF0IGJvb3Rsb2FkZXIgaW4gdHVybiBsb2FkcyBhbmQgcnVucyBVLUJvb3QgKG9yIHdoYXRldmVyKQorICogcGVyZm9ybWluZyBsb3cgbGV2ZWwgaW5pdCBwcmlvciB0byBsb2FkaW5nLiBBbGwgdGhhdCBtZWFucyB3ZSBjYW4gTk9UIHVzZQorICogTkFORCB2ZXJzaW9uIHRvIHB1dCBVLUJvb3QgaW50byBOT1IgYmVjYXVzZSBpdCBkb2Vzbid0IGhhdmUgTk9SIHN1cHBvcnQgYW5kCisgKiB3ZSBjYW4gTk9UIHVzZSBOT1IgdmVyc2lvbiBiZWNhdXNlIGl0IHBlcmZvcm1zIGxvdyBsZXZlbCBpbml0aWFsaXphdGlvbgorICogZWZmZWN0aXZlbHkgZGVzdHJveWluZyBpdHNlbGYgaW4gRERSIG1lbW9yeS4gVGhhdCdzIHdoeSBhIHNlcGFyYXRlIE5PUgorICogdmVyc2lvbiB3aXRoIHRoaXMgZGVmaW5lIGlzIG5lZWRlZC4gSXQgaXMgbG9hZGVkIHZpYSBVQVJULCB0aGVuIG9uZSB1c2VzCisgKiBpdCB0byBzb21laG93IGRvd25sb2FkIGEgcHJvcGVyIE5PUiB2ZXJzaW9uIGJ1aWx0IFdJVEhPVVQgdGhpcyBkZWZpbmUgdG8KKyAqIFJBTSAodGZ0cD8pIGFuZCBidXJuIGl0IHRvIE5PUiBGbGFzaC4gSSB3b3VsZCBiZSBwcm9iYWJseSBhYmxlIHRvIHNxdWVlemUKKyAqIE5PUiBzdXBwb3J0IGludG8gdGhlIGluaXRpYWwgYm9vdGxvYWRlciBzbyBpdCB3b24ndCBiZSBuZWVkZWQgYnV0IERhVmluY2kKKyAqIHN0YXRpYyBSQU0gbWlnaHQgYmUgdG9vIHNtYWxsIGZvciB0aGlzIChJIGhhdmUgc29tZXRoaW5nIGxpa2UgMktieXRlcyBsZWZ0CisgKiBhcyBvZiBub3csIHdpdGhvdXQgTk9SIHN1cHBvcnQpIHNvIHRoaXMgbWlnaHQndmUgbm90IGhhcHBlbmVkLi4uCisgKgorI2RlZmluZSBDT05GSUdfTk9SX1VBUlRfQk9PVAorICovCisKKy8qPT09PT09PSovCisvKiBCb2FyZCAqLworLyo9PT09PT09Ki8KKyNkZWZpbmUgRFZfRVZNCisjZGVmaW5lIENGR19OQU5EX1NNQUxMUEFHRQorI2RlZmluZSBDRkdfVVNFX05PUgorLyo9PT09PT09PT09PT09PT09PT09Ki8KKy8qIFNvQyBDb25maWd1cmF0aW9uICovCisvKj09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBDT05GSUdfQVJNOTI2RUpTCQkJLyogYXJtOTI2ZWpzIENQVSBjb3JlICovCisjZGVmaW5lIENPTkZJR19TWVNfQ0xLX0ZSRVEJMjk3MDAwMDAwCS8qIEFybSBDbG9jayBmcmVxdWVuY3kgKi8KKyNkZWZpbmUgQ0ZHX1RJTUVSQkFTRQkJMHgwMWMyMTQwMAkvKiB1c2UgdGltZXIgMCAqLworI2RlZmluZSBDRkdfSFpfQ0xPQ0sJCTI3MDAwMDAwCS8qIFRpbWVyIElucHV0IGNsb2NrIGZyZXEgKi8KKyNkZWZpbmUgQ0ZHX0haCQkJMTAwMAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIEVFUFJPTSBkZWZpbml0aW9ucyBmb3IgQXRtZWwgMjRDMjU2Qk4gU0VFUFJPTSBjaGlwICovCisvKiBvbiBTb25hdGEvRFZfRVZNIGJvYXJkLiBObyBFRVBST00gb24gc2NobW9vZ2llLiAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUl9MRU4JCTIKKyNkZWZpbmUgQ0ZHX0kyQ19FRVBST01fQUREUgkJMHg1MAorI2RlZmluZSBDRkdfRUVQUk9NX1BBR0VfV1JJVEVfQklUUwk2CisjZGVmaW5lIENGR19FRVBST01fUEFHRV9XUklURV9ERUxBWV9NUwkyMAorLyo9PT09PT09PT09PT09Ki8KKy8qIE1lbW9yeSBJbmZvICovCisvKj09PT09PT09PT09PT0qLworI2RlZmluZSBDRkdfTUFMTE9DX0xFTgkJKDB4MTAwMDAgKyAxMjgqMTAyNCkJLyogbWFsbG9jKCkgbGVuICovCisjZGVmaW5lIENGR19HQkxfREFUQV9TSVpFCTEyOAkJLyogcmVzZXJ2ZWQgZm9yIGluaXRpYWwgZGF0YSAqLworI2RlZmluZSBDRkdfTUVNVEVTVF9TVEFSVAkweDgwMDAwMDAwCS8qIG1lbXRlc3Qgc3RhcnQgYWRkcmVzcyAqLworI2RlZmluZSBDRkdfTUVNVEVTVF9FTkQJCTB4ODEwMDAwMDAJLyogMTZNQiBSQU0gdGVzdCAqLworI2RlZmluZSBDT05GSUdfTlJfRFJBTV9CQU5LUwkxCQkvKiB3ZSBoYXZlIDEgYmFuayBvZiBEUkFNICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkUJKDI1NioxMDI0KQkvKiByZWd1bGFyIHN0YWNrICovCisjZGVmaW5lIFBIWVNfU0RSQU1fMQkJMHg4MDAwMDAwMAkvKiBERFIgU3RhcnQgKi8KKyNkZWZpbmUgUEhZU19TRFJBTV8xX1NJWkUJMHgxMDAwMDAwMAkvKiBERFIgc2l6ZSAyNTZNQiAqLworI2RlZmluZSBERFJfOEJBTktTCQkJCS8qIDgtYmFuayBERFIyICgyNTZNQikgKi8KKy8qPT09PT09PT09PT09PT09PT09PT0qLworLyogU2VyaWFsIERyaXZlciBpbmZvICovCisvKj09PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUgQ0ZHX05TMTY1NTAKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfU0VSSUFMCisjZGVmaW5lIENGR19OUzE2NTUwX1JFR19TSVpFCTQJCS8qIE5TMTY1NTAgcmVnaXN0ZXIgc2l6ZSAqLworI2RlZmluZSBDRkdfTlMxNjU1MF9DT00xCTB4MDFjMjAwMDAJLyogQmFzZSBhZGRyZXNzIG9mIFVBUlQwICovCisjZGVmaW5lIENGR19OUzE2NTUwX0NMSwkJMjcwMDAwMDAJLyogSW5wdXQgY2xvY2sgdG8gTlMxNjU1MCAqLworI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWAkxCQkvKiB1c2UgVUFSVDAgZm9yIGNvbnNvbGUgKi8KKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAJCS8qIERlZmF1bHQgYmF1ZCByYXRlICovCisjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CisvKj09PT09PT09PT09PT09PT09PT0qLworLyogSTJDIENvbmZpZ3VyYXRpb24gKi8KKy8qPT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIENPTkZJR19IQVJEX0kyQworI2RlZmluZSBDT05GSUdfRFJJVkVSX0RBVklOQ0lfSTJDCisjZGVmaW5lIENGR19JMkNfU1BFRUQJCTgwMDAwCS8qIDEwMEticHMgd29uJ3Qgd29yaywgc2lsaWNvbiBidWcgKi8KKyNkZWZpbmUgQ0ZHX0kyQ19TTEFWRQkJMTAJLyogQm9ndXMsIG1hc3Rlci1vbmx5IGluIFUtQm9vdCAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIE5ldHdvcmsgJiBFdGhlcm5ldCBDb25maWd1cmF0aW9uICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBDT05GSUdfRFJJVkVSX1RJX0VNQUMKKyNkZWZpbmUgQ09ORklHX01JSQorI2RlZmluZSBDT05GSUdfQk9PVFBfREVGQVVMVAorI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMyCisjZGVmaW5lIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19ORVRfUkVUUllfQ09VTlQJMTAKKy8qPT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIEZsYXNoICYgRW52aXJvbm1lbnQgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09Ki8KKyNpZmRlZiBDRkdfVVNFX05BTkQKKyN1bmRlZiBDRkdfRU5WX0lTX0lOX0ZMQVNICisjZGVmaW5lIENGR19OT19GTEFTSAorI2RlZmluZSBDRkdfRU5WX0lTX0lOX05BTkQJCS8qIFUtQm9vdCBlbnYgaW4gTkFORCBGbGFzaCAgKi8KKyNpZmRlZiBDRkdfTkFORF9TTUFMTFBBR0UKKyNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJNTEyCS8qIEVudiBzZWN0b3IgU2l6ZSAqLworI2RlZmluZSBDRkdfRU5WX1NJWkUJCVNaXzE2SworI2Vsc2UKKyNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJMjA0OAkvKiBFbnYgc2VjdG9yIFNpemUgKi8KKyNkZWZpbmUgQ0ZHX0VOVl9TSVpFCQlTWl8xMjhLCisjZW5kaWYKKyNkZWZpbmUgQ09ORklHX1NLSVBfTE9XTEVWRUxfSU5JVAkvKiBVLUJvb3QgaXMgbG9hZGVkIGJ5IGEgYm9vdGxvYWRlciAqLworI2RlZmluZSBDT05GSUdfU0tJUF9SRUxPQ0FURV9VQk9PVAkvKiB0byBhIHByb3BlciBhZGRyZXNzLCBpbml0IGRvbmUgKi8KKyNkZWZpbmUgQ0ZHX05BTkRfQkFTRQkJMHgwMjAwMDAwMAorI2RlZmluZSBDRkdfTkFORF9IV19FQ0MKKyNkZWZpbmUgQ0ZHX01BWF9OQU5EX0RFVklDRQkxCS8qIE1heCBudW1iZXIgb2YgTkFORCBkZXZpY2VzICovCisjZGVmaW5lIE5BTkRfTUFYX0NISVBTCQkxCisjZGVmaW5lIENGR19FTlZfT0ZGU0VUCQkweDAJLyogQmxvY2sgMC0tbm90IHVzZWQgYnkgYm9vdGNvZGUgKi8KKyNkZWZpbmUgREVGX0JPT1RNCQkiIgorI2VsaWYgZGVmaW5lZChDRkdfVVNFX05PUikKKyNpZmRlZiBDT05GSUdfTk9SX1VBUlRfQk9PVAorI2RlZmluZSBDT05GSUdfU0tJUF9MT1dMRVZFTF9JTklUCS8qIFUtQm9vdCBpcyBsb2FkZWQgYnkgYSBib290bG9hZGVyICovCisjZGVmaW5lIENPTkZJR19TS0lQX1JFTE9DQVRFX1VCT09UCS8qIHRvIGEgcHJvcGVyIGFkZHJlc3MsIGluaXQgZG9uZSAqLworI2Vsc2UKKyN1bmRlZiBDT05GSUdfU0tJUF9MT1dMRVZFTF9JTklUCisjdW5kZWYgQ09ORklHX1NLSVBfUkVMT0NBVEVfVUJPT1QKKyNlbmRpZgorI2RlZmluZSBDRkdfRU5WX0lTX0lOX0ZMQVNICisjdW5kZWYgQ0ZHX05PX0ZMQVNICisjZGVmaW5lIENGR19GTEFTSF9DRklfRFJJVkVSCisjZGVmaW5lIENGR19GTEFTSF9DRkkKKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9CQU5LUwkxCQkvKiBtYXggbnVtYmVyIG9mIGZsYXNoIGJhbmtzICovCisjZGVmaW5lIENGR19GTEFTSF9TRUNUX1NaCTB4MTAwMDAJCS8qIDY0S0Igc2VjdCBzaXplIEFNRCBGbGFzaCAqLworI2RlZmluZSBDRkdfRU5WX09GRlNFVAkJKENGR19GTEFTSF9TRUNUX1NaKjMpCisjZGVmaW5lIFBIWVNfRkxBU0hfMQkJMHgwMjAwMDAwMAkvKiBDUzIgQmFzZSBhZGRyZXNzIAkgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX0JBU0UJCVBIWVNfRkxBU0hfMQkvKiBGbGFzaCBCYXNlIGZvciBVLUJvb3QgKi8KKyNkZWZpbmUgUEhZU19GTEFTSF9TSVpFCQkweDIwMDAwMDAJLyogRmxhc2ggc2l6ZSAzMk1CIAkgKi8KKyNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9TRUNUCShQSFlTX0ZMQVNIX1NJWkUvQ0ZHX0ZMQVNIX1NFQ1RfU1opCisjZGVmaW5lIENGR19FTlZfU0VDVF9TSVpFCUNGR19GTEFTSF9TRUNUX1NaCS8qIEVudiBzZWN0b3IgU2l6ZSAqLworI2VuZGlmCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBVLUJvb3QgZ2VuZXJhbCBjb25maWd1cmF0aW9uICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjdW5kZWYgCUNPTkZJR19VU0VfSVJRCQkJLyogTm8gSVJRL0ZJUSBpbiBVLUJvb3QgKi8KKyNkZWZpbmUgQ09ORklHX01JU0NfSU5JVF9SCisjdW5kZWYgQ09ORklHX0JPT1RERUxBWQorI2RlZmluZSBDT05GSUdfQk9PVEZJTEUJCSJ1SW1hZ2UiCS8qIEJvb3QgZmlsZSBuYW1lICovCisjZGVmaW5lIENGR19QUk9NUFQJCSJVLUJvb3QgPiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgKi8KKyNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCisjZGVmaW5lIENGR19QQlNJWkUJCShDRkdfQ0JTSVpFK3NpemVvZihDRkdfUFJPTVBUKSsxNikJLyogUHJpbnQgYnVmZmVyIHN6ICovCisjZGVmaW5lIENGR19NQVhBUkdTCQkxNgkJLyogbWF4IG51bWJlciBvZiBjb21tYW5kIGFyZ3MgKi8KKyNkZWZpbmUgQ0ZHX0JBUkdTSVpFCQlDRkdfQ0JTSVpFCS8qIEJvb3QgQXJndW1lbnQgQnVmZmVyIFNpemUgKi8KKyNkZWZpbmUgQ0ZHX0xPQURfQUREUgkJMHg4MDcwMDAwMAkvKiBkZWZhdWx0IExpbnV4IGtlcm5lbCBsb2FkIGFkZHJlc3MgKi8KKyNkZWZpbmUgQ09ORklHX1ZFUlNJT05fVkFSSUFCTEUKKyNkZWZpbmUgQ09ORklHX0FVVE9fQ09NUExFVEUJCS8qIFdvbid0IHdvcmsgd2l0aCBodXNoIHNvIGZhciwgbWF5IGJlIGxhdGVyICovCisjZGVmaW5lIENGR19IVVNIX1BBUlNFUgorI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKKyNkZWZpbmUgQ09ORklHX0NNRExJTkVfRURJVElORworI2RlZmluZSBDRkdfTE9OR0hFTFAKKyNkZWZpbmUgQ09ORklHX0NSQzMyX1ZFUklGWQorI2RlZmluZSBDT05GSUdfTVhfQ1lDTElDCisvKj09PT09PT09PT09PT09PT09PT0qLworLyogTGludXggSW5mb3JtYXRpb24gKi8KKy8qPT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIExJTlVYX0JPT1RfUEFSQU1fQUREUgkweDgwMDAwMTAwCisjZGVmaW5lIENPTkZJR19DTURMSU5FX1RBRworI2RlZmluZSBDT05GSUdfU0VUVVBfTUVNT1JZX1RBR1MKKyNkZWZpbmUgQ09ORklHX0JPT1RBUkdTCQkibWVtPTEyME0gY29uc29sZT10dHlTMCwxMTUyMDBuOCByb290PS9kZXYvaGRhMSBydyBub2luaXRyZCBpcD1kaGNwIgorI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJInNldGVudiBzZXRib290IHNldGVudiBib290YXJncyBcXCQoYm9vdGFyZ3MpIHZpZGVvPWRtNjR4eGZiOm91dHB1dD1cXCQodmlkZW9zdGQpO3J1biBzZXRib290OyBib290bSAweDIwNTAwMDAiCisvKj09PT09PT09PT09PT09PT09Ki8KKy8qIFUtQm9vdCBjb21tYW5kcyAqLworLyo9PT09PT09PT09PT09PT09PSovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfU0FWRVMKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyN1bmRlZiBDT05GSUdfQ01EX0JESQorI3VuZGVmIENPTkZJR19DTURfRlBHQQorI3VuZGVmIENPTkZJR19DTURfU0VUR0VURENSCisjaWZkZWYgQ0ZHX1VTRV9OQU5ECisjdW5kZWYgQ09ORklHX0NNRF9GTEFTSAorI3VuZGVmIENPTkZJR19DTURfSU1MUworI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNlbGlmIGRlZmluZWQoQ0ZHX1VTRV9OT1IpCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNlbHNlCisjZXJyb3IgIkVpdGhlciBDRkdfVVNFX05BTkQgb3IgQ0ZHX1VTRV9OT1IgX01VU1RfIGJlIGRlZmluZWQgISEhIgorI2VuZGlmCisvKj09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIEtHREIgc3VwcG9ydCAoaWYgYW55KSAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PSovCisjaWZkZWYgQ09ORklHX0NNRF9LR0RCCisjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTExNTIwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLworI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KKyNlbmRpZgorI2VuZGlmIC8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9kYXZpbmNpX3NjaG1vb2dpZS5oIGIvaW5jbHVkZS9jb25maWdzL2RhdmluY2lfc2NobW9vZ2llLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZjOWEzMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29uZmlncy9kYXZpbmNpX3NjaG1vb2dpZS5oCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisjaW5jbHVkZSA8YXNtL3NpemVzLmg+CisKKy8qPT09PT09PSovCisvKiBCb2FyZCAqLworLyo9PT09PT09Ki8KKyNkZWZpbmUgU0NITU9PR0lFCisjZGVmaW5lIENGR19OQU5EX0xBUkdFUEFHRQorI2RlZmluZSBDRkdfVVNFX05BTkQKKy8qPT09PT09PT09PT09PT09PT09PSovCisvKiBTb0MgQ29uZmlndXJhdGlvbiAqLworLyo9PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUgQ09ORklHX0FSTTkyNkVKUwkJCS8qIGFybTkyNmVqcyBDUFUgY29yZSAqLworI2RlZmluZSBDT05GSUdfU1lTX0NMS19GUkVRCTI5NzAwMDAwMAkvKiBBcm0gQ2xvY2sgZnJlcXVlbmN5ICovCisjZGVmaW5lIENGR19USU1FUkJBU0UJCTB4MDFjMjE0MDAJLyogdXNlIHRpbWVyIDAgKi8KKyNkZWZpbmUgQ0ZHX0haX0NMT0NLCQkyNzAwMDAwMAkvKiBUaW1lciBJbnB1dCBjbG9jayBmcmVxICovCisjZGVmaW5lIENGR19IWgkJCTEwMDAKKy8qPT09PT09PT09PT09PSovCisvKiBNZW1vcnkgSW5mbyAqLworLyo9PT09PT09PT09PT09Ki8KKyNkZWZpbmUgQ0ZHX01BTExPQ19MRU4JCSgweDEwMDAwICsgMjU2KjEwMjQpCS8qIG1hbGxvYygpIGxlbiAqLworI2RlZmluZSBDRkdfR0JMX0RBVEFfU0laRQkxMjgJCS8qIHJlc2VydmVkIGZvciBpbml0aWFsIGRhdGEgKi8KKyNkZWZpbmUgQ0ZHX01FTVRFU1RfU1RBUlQJMHg4MDAwMDAwMAkvKiBtZW10ZXN0IHN0YXJ0IGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0ZHX01FTVRFU1RfRU5ECQkweDgxMDAwMDAwCS8qIDE2TUIgUkFNIHRlc3QgKi8KKyNkZWZpbmUgQ09ORklHX05SX0RSQU1fQkFOS1MJMQkJLyogd2UgaGF2ZSAxIGJhbmsgb2YgRFJBTSAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFCSgyNTYqMTAyNCkJLyogcmVndWxhciBzdGFjayAqLworI2RlZmluZSBQSFlTX1NEUkFNXzEJCTB4ODAwMDAwMDAJLyogRERSIFN0YXJ0ICovCisjZGVmaW5lIFBIWVNfU0RSQU1fMV9TSVpFCTB4MDgwMDAwMDAJLyogRERSIHNpemUgMTI4TUIgKi8KKyNkZWZpbmUgRERSXzRCQU5LUwkJCQkvKiA0LWJhbmsgRERSMiAoMTI4TUIpICovCisvKj09PT09PT09PT09PT09PT09PT09Ki8KKy8qIFNlcmlhbCBEcml2ZXIgaW5mbyAqLworLyo9PT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIENGR19OUzE2NTUwCisjZGVmaW5lIENGR19OUzE2NTUwX1NFUklBTAorI2RlZmluZSBDRkdfTlMxNjU1MF9SRUdfU0laRQk0CQkvKiBOUzE2NTUwIHJlZ2lzdGVyIHNpemUgKi8KKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMQkweDAxYzIwMDAwCS8qIEJhc2UgYWRkcmVzcyBvZiBVQVJUMCAqLworI2RlZmluZSBDRkdfTlMxNjU1MF9DTEsJCTI3MDAwMDAwCS8qIElucHV0IGNsb2NrIHRvIE5TMTY1NTAgKi8KKyNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVgJMQkJLyogdXNlIFVBUlQwIGZvciBjb25zb2xlICovCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCQkvKiBEZWZhdWx0IGJhdWQgcmF0ZSAqLworI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfQorLyo9PT09PT09PT09PT09PT09PT09Ki8KKy8qIEkyQyBDb25maWd1cmF0aW9uICovCisvKj09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBDT05GSUdfSEFSRF9JMkMKKyNkZWZpbmUgQ09ORklHX0RSSVZFUl9EQVZJTkNJX0kyQworI2RlZmluZSBDRkdfSTJDX1NQRUVECQk4MDAwMAkvKiAxMDBLYnBzIHdvbid0IHdvcmssIHNpbGljb24gYnVnICovCisjZGVmaW5lIENGR19JMkNfU0xBVkUJCTEwCS8qIEJvZ3VzLCBtYXN0ZXItb25seSBpbiBVLUJvb3QgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBOZXR3b3JrICYgRXRoZXJuZXQgQ29uZmlndXJhdGlvbiAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUgQ09ORklHX0RSSVZFUl9USV9FTUFDCisjZGVmaW5lIENPTkZJR19NSUkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0RFRkFVTFQKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUworI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TMgorI2RlZmluZSBDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfTkVUX1JFVFJZX0NPVU5UCTEwCisjZGVmaW5lIENPTkZJR19PVkVSV1JJVEVfRVRIQUREUl9PTkNFCisvKj09PT09PT09PT09PT09PT09PT09PSovCisvKiBGbGFzaCAmIEVudmlyb25tZW50ICovCisvKj09PT09PT09PT09PT09PT09PT09PSovCisjdW5kZWYgQ0ZHX0VOVl9JU19JTl9GTEFTSAorI2RlZmluZSBDRkdfTk9fRkxBU0gKKyNkZWZpbmUgQ0ZHX0VOVl9JU19JTl9OQU5ECQkvKiBVLUJvb3QgZW52IGluIE5BTkQgRmxhc2ggICovCisjZGVmaW5lIENGR19FTlZfU0VDVF9TSVpFCTIwNDgJLyogRW52IHNlY3RvciBTaXplICovCisjZGVmaW5lIENGR19FTlZfU0laRQkJU1pfMTI4SworI2RlZmluZSBDT05GSUdfU0tJUF9MT1dMRVZFTF9JTklUCS8qIFUtQm9vdCBpcyBsb2FkZWQgYnkgYSBib290bG9hZGVyICovCisjZGVmaW5lIENPTkZJR19TS0lQX1JFTE9DQVRFX1VCT09UCS8qIHRvIGEgcHJvcGVyIGFkZHJlc3MsIGluaXQgZG9uZSAqLworI2RlZmluZSBDRkdfTkFORF9CQVNFCQkweDAyMDAwMDAwCisjZGVmaW5lIENGR19OQU5EX0hXX0VDQworI2RlZmluZSBDRkdfTUFYX05BTkRfREVWSUNFCTEJLyogTWF4IG51bWJlciBvZiBOQU5EIGRldmljZXMgKi8KKyNkZWZpbmUgTkFORF9NQVhfQ0hJUFMJCTEKKyNkZWZpbmUgQ0ZHX0VOVl9PRkZTRVQJCTB4MAkvKiBCbG9jayAwLS1ub3QgdXNlZCBieSBib290Y29kZSAqLworLyo9PT09PT09PT09PT09PT09PT09PT0qLworLyogQm9hcmQgcmVsYXRlZCBzdHVmZiAqLworLyo9PT09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBDT05GSUdfUlRDX0RTMTMwNwkJLyogUlRDIGNoaXAgb24gU0NITU9PR0lFICovCisjZGVmaW5lIENGR19JMkNfUlRDX0FERFIJMHg2ZgkvKiBSVEMgY2hpcCBJMkMgYWRkcmVzcyAqLworI2RlZmluZSBDT05GSUdfSEFTX1VJRAorI2RlZmluZSBDT05GSUdfVUlEX0RTMjhDTTAwCQkvKiBVbmlxdWUgSUQgb24gU0NITU9PR0lFICovCisjZGVmaW5lIENGR19VSURfQUREUgkJMHg1MAkvKiBVSUQgY2hpcCBJMkMgYWRkcmVzcyAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogVS1Cb290IGdlbmVyYWwgY29uZmlndXJhdGlvbiAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI3VuZGVmIAlDT05GSUdfVVNFX0lSUQkJCS8qIE5vIElSUS9GSVEgaW4gVS1Cb290ICovCisjZGVmaW5lIENPTkZJR19NSVNDX0lOSVRfUgorI3VuZGVmIENPTkZJR19CT09UREVMQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RGSUxFCQkidUltYWdlIgkvKiBCb290IGZpbGUgbmFtZSAqLworI2RlZmluZSBDRkdfUFJPTVBUCQkiVS1Cb290ID4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCisjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLworI2RlZmluZSBDRkdfUEJTSVpFCQkoQ0ZHX0NCU0laRStzaXplb2YoQ0ZHX1BST01QVCkrMTYpCS8qIFByaW50IGJ1ZmZlciBzeiAqLworI2RlZmluZSBDRkdfTUFYQVJHUwkJMTYJCS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzICovCisjZGVmaW5lIENGR19CQVJHU0laRQkJQ0ZHX0NCU0laRQkvKiBCb290IEFyZ3VtZW50IEJ1ZmZlciBTaXplICovCisjZGVmaW5lIENGR19MT0FEX0FERFIJCTB4ODA3MDAwMDAJLyogZGVmYXVsdCBMaW51eCBrZXJuZWwgbG9hZCBhZGRyZXNzICovCisjZGVmaW5lIENPTkZJR19WRVJTSU9OX1ZBUklBQkxFCisjZGVmaW5lIENPTkZJR19BVVRPX0NPTVBMRVRFCQkvKiBXb24ndCB3b3JrIHdpdGggaHVzaCBzbyBmYXIsIG1heSBiZSBsYXRlciAqLworI2RlZmluZSBDRkdfSFVTSF9QQVJTRVIKKyNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCisjZGVmaW5lIENPTkZJR19DTURMSU5FX0VESVRJTkcKKyNkZWZpbmUgQ0ZHX0xPTkdIRUxQCisjZGVmaW5lIENPTkZJR19DUkMzMl9WRVJJRlkKKyNkZWZpbmUgQ09ORklHX01YX0NZQ0xJQworLyo9PT09PT09PT09PT09PT09PT09Ki8KKy8qIExpbnV4IEluZm9ybWF0aW9uICovCisvKj09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBMSU5VWF9CT09UX1BBUkFNX0FERFIJMHg4MDAwMDEwMAorI2RlZmluZSBDT05GSUdfQ01ETElORV9UQUcKKyNkZWZpbmUgQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTCisjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJIm1lbT01Nk0gY29uc29sZT10dHlTMCwxMTUyMDBuOCByb290PS9kZXYvaGRhMSBydyBub2luaXRyZCBpcD1kaGNwIgorI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJInNldGVudiBzZXRib290IHNldGVudiBib290YXJncyBcXCQoYm9vdGFyZ3MpIHZpZGVvPWRtNjR4eGZiOm91dHB1dD1cXCQodmlkZW9zdGQpO3J1biBzZXRib290IgorLyo9PT09PT09PT09PT09PT09PSovCisvKiBVLUJvb3QgY29tbWFuZHMgKi8KKy8qPT09PT09PT09PT09PT09PT0qLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1NBVkVTCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyN1bmRlZiBDT05GSUdfQ01EX0VFUFJPTQorI3VuZGVmIENPTkZJR19DTURfQkRJCisjdW5kZWYgQ09ORklHX0NNRF9GUEdBCisjdW5kZWYgQ09ORklHX0NNRF9TRVRHRVREQ1IKKyN1bmRlZiBDT05GSUdfQ01EX0ZMQVNICisjdW5kZWYgQ09ORklHX0NNRF9JTUxTCisvKj09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIEtHREIgc3VwcG9ydCAoaWYgYW55KSAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PSovCisjaWZkZWYgQ09ORklHX0NNRF9LR0RCCisjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTExNTIwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLworI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KKyNlbmRpZgorI2VuZGlmIC8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9kYXZpbmNpX3NvbmF0YS5oIGIvaW5jbHVkZS9jb25maWdzL2RhdmluY2lfc29uYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU4YzRmYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29uZmlncy9kYXZpbmNpX3NvbmF0YS5oCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisjaW5jbHVkZSA8YXNtL3NpemVzLmg+CisKKy8qCisgKiBEZWZpbmUgdGhpcyB0byBtYWtlIFUtQm9vdCBza2lwIGxvdyBsZXZlbCBpbml0aWFsaXphdGlvbiB3aGVuIGxvYWRlZAorICogYnkgaW5pdGlhbCBib290bG9hZGVyLiBOb3QgcmVxdWlyZWQgYnkgTkFORCBVLUJvb3QgdmVyc2lvbiBidXQgSVMKKyAqIHJlcXVpcmVkIGZvciBhIE5PUiB2ZXJzaW9uIHVzZWQgdG8gYnVybiB0aGUgcmVhbCBOT1IgVS1Cb290IGludG8KKyAqIE5PUiBGbGFzaC4gTkFORCBhbmQgTk9SIHN1cHBvcnQgZm9yIERhVmluY2kgY2hpcHMgaXMgbXV0dWFsbHkgZXhjbHVzaXZlCisgKiBzbyBpdCBpcyBOT1QgcG9zc2libGUgdG8gYnVpbGQgYSBVLUJvb3Qgd2l0aCBib3RoIE5BTkQgYW5kIE5PUiByb3V0aW5lcy4KKyAqIE5PUiBVLUJvb3QgaXMgbG9hZGVkIGRpcmVjdGx5IGZyb20gRmxhc2ggc28gaXQgbXVzdCBwZXJmb3JtIGFsbCB0aGUKKyAqIGxvdyBsZXZlbCBpbml0aWFsaXphdGlvbiBpdHNlbGYuIE5BTkQgdmVyc2lvbiBpcyBsb2FkZWQgYnkgYW4gaW5pdGlhbAorICogYm9vdGxvYWRlciAoVUJMIGluIFRJLWVzZSkgdGhhdCBwZXJmb3JtcyBzdWNoIGFuIGluaXRpYWxpemF0aW9uIHNvIGl0J3MKKyAqIHNraXBwZWQgaW4gTkFORCB2ZXJzaW9uLiBUaGUgdGhpcmQgRGFWaW5jaSBib290IG1vZGUgbG9hZHMgYSBib290bG9hZGVyCisgKiB2aWEgVUFSVDAgYW5kIHRoYXQgYm9vdGxvYWRlciBpbiB0dXJuIGxvYWRzIGFuZCBydW5zIFUtQm9vdCAob3Igd2hhdGV2ZXIpCisgKiBwZXJmb3JtaW5nIGxvdyBsZXZlbCBpbml0IHByaW9yIHRvIGxvYWRpbmcuIEFsbCB0aGF0IG1lYW5zIHdlIGNhbiBOT1QgdXNlCisgKiBOQU5EIHZlcnNpb24gdG8gcHV0IFUtQm9vdCBpbnRvIE5PUiBiZWNhdXNlIGl0IGRvZXNuJ3QgaGF2ZSBOT1Igc3VwcG9ydCBhbmQKKyAqIHdlIGNhbiBOT1QgdXNlIE5PUiB2ZXJzaW9uIGJlY2F1c2UgaXQgcGVyZm9ybXMgbG93IGxldmVsIGluaXRpYWxpemF0aW9uCisgKiBlZmZlY3RpdmVseSBkZXN0cm95aW5nIGl0c2VsZiBpbiBERFIgbWVtb3J5LiBUaGF0J3Mgd2h5IGEgc2VwYXJhdGUgTk9SCisgKiB2ZXJzaW9uIHdpdGggdGhpcyBkZWZpbmUgaXMgbmVlZGVkLiBJdCBpcyBsb2FkZWQgdmlhIFVBUlQsIHRoZW4gb25lIHVzZXMKKyAqIGl0IHRvIHNvbWVob3cgZG93bmxvYWQgYSBwcm9wZXIgTk9SIHZlcnNpb24gYnVpbHQgV0lUSE9VVCB0aGlzIGRlZmluZSB0bworICogUkFNICh0ZnRwPykgYW5kIGJ1cm4gaXQgdG8gTk9SIEZsYXNoLiBJIHdvdWxkIGJlIHByb2JhYmx5IGFibGUgdG8gc3F1ZWV6ZQorICogTk9SIHN1cHBvcnQgaW50byB0aGUgaW5pdGlhbCBib290bG9hZGVyIHNvIGl0IHdvbid0IGJlIG5lZWRlZCBidXQgRGFWaW5jaQorICogc3RhdGljIFJBTSBtaWdodCBiZSB0b28gc21hbGwgZm9yIHRoaXMgKEkgaGF2ZSBzb21ldGhpbmcgbGlrZSAyS2J5dGVzIGxlZnQKKyAqIGFzIG9mIG5vdywgd2l0aG91dCBOT1Igc3VwcG9ydCkgc28gdGhpcyBtaWdodCd2ZSBub3QgaGFwcGVuZWQuLi4KKyAqCisjZGVmaW5lIENPTkZJR19OT1JfVUFSVF9CT09UCisgKi8KKworLyo9PT09PT09Ki8KKy8qIEJvYXJkICovCisvKj09PT09PT0qLworI2RlZmluZSBTT05BVEFfQk9BUkQKKyNkZWZpbmUgQ0ZHX05BTkRfU01BTExQQUdFCisjZGVmaW5lIENGR19VU0VfTk9SCisvKj09PT09PT09PT09PT09PT09PT0qLworLyogU29DIENvbmZpZ3VyYXRpb24gKi8KKy8qPT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIENPTkZJR19BUk05MjZFSlMJCQkvKiBhcm05MjZlanMgQ1BVIGNvcmUgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19DTEtfRlJFUQkyOTcwMDAwMDAJLyogQXJtIENsb2NrIGZyZXF1ZW5jeSAqLworI2RlZmluZSBDRkdfVElNRVJCQVNFCQkweDAxYzIxNDAwCS8qIHVzZSB0aW1lciAwICovCisjZGVmaW5lIENGR19IWl9DTE9DSwkJMjcwMDAwMDAJLyogVGltZXIgSW5wdXQgY2xvY2sgZnJlcSAqLworI2RlZmluZSBDRkdfSFoJCQkxMDAwCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogRUVQUk9NIGRlZmluaXRpb25zIGZvciBBdG1lbCAyNEMyNTZCTiBTRUVQUk9NIGNoaXAgKi8KKy8qIG9uIFNvbmF0YS9EVl9FVk0gYm9hcmQuIE5vIEVFUFJPTSBvbiBzY2htb29naWUuICAgICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBDRkdfSTJDX0VFUFJPTV9BRERSX0xFTgkJMgorI2RlZmluZSBDRkdfSTJDX0VFUFJPTV9BRERSCQkweDUwCisjZGVmaW5lIENGR19FRVBST01fUEFHRV9XUklURV9CSVRTCTYKKyNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0RFTEFZX01TCTIwCisvKj09PT09PT09PT09PT0qLworLyogTWVtb3J5IEluZm8gKi8KKy8qPT09PT09PT09PT09PSovCisjZGVmaW5lIENGR19NQUxMT0NfTEVOCQkoMHgxMDAwMCArIDEyOCoxMDI0KQkvKiBtYWxsb2MoKSBsZW4gKi8KKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX1NJWkUJMTI4CQkvKiByZXNlcnZlZCBmb3IgaW5pdGlhbCBkYXRhICovCisjZGVmaW5lIENGR19NRU1URVNUX1NUQVJUCTB4ODAwMDAwMDAJLyogbWVtdGVzdCBzdGFydCBhZGRyZXNzICovCisjZGVmaW5lIENGR19NRU1URVNUX0VORAkJMHg4MTAwMDAwMAkvKiAxNk1CIFJBTSB0ZXN0ICovCisjZGVmaW5lIENPTkZJR19OUl9EUkFNX0JBTktTCTEJCS8qIHdlIGhhdmUgMSBiYW5rIG9mIERSQU0gKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRQkoMjU2KjEwMjQpCS8qIHJlZ3VsYXIgc3RhY2sgKi8KKyNkZWZpbmUgUEhZU19TRFJBTV8xCQkweDgwMDAwMDAwCS8qIEREUiBTdGFydCAqLworI2RlZmluZSBQSFlTX1NEUkFNXzFfU0laRQkweDA4MDAwMDAwCS8qIEREUiBzaXplIDEyOE1CICovCisjZGVmaW5lIEREUl80QkFOS1MJCQkJLyogNC1iYW5rIEREUjIgKDEyOE1CKSAqLworLyo9PT09PT09PT09PT09PT09PT09PSovCisvKiBTZXJpYWwgRHJpdmVyIGluZm8gKi8KKy8qPT09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBDRkdfTlMxNjU1MAorI2RlZmluZSBDRkdfTlMxNjU1MF9TRVJJQUwKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfUkVHX1NJWkUJNAkJLyogTlMxNjU1MCByZWdpc3RlciBzaXplICovCisjZGVmaW5lIENGR19OUzE2NTUwX0NPTTEJMHgwMWMyMDAwMAkvKiBCYXNlIGFkZHJlc3Mgb2YgVUFSVDAgKi8KKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ0xLCQkyNzAwMDAwMAkvKiBJbnB1dCBjbG9jayB0byBOUzE2NTUwICovCisjZGVmaW5lIENPTkZJR19DT05TX0lOREVYCTEJCS8qIHVzZSBVQVJUMCBmb3IgY29uc29sZSAqLworI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAkJLyogRGVmYXVsdCBiYXVkIHJhdGUgKi8KKyNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwIH0KKy8qPT09PT09PT09PT09PT09PT09PSovCisvKiBJMkMgQ29uZmlndXJhdGlvbiAqLworLyo9PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUgQ09ORklHX0hBUkRfSTJDCisjZGVmaW5lIENPTkZJR19EUklWRVJfREFWSU5DSV9JMkMKKyNkZWZpbmUgQ0ZHX0kyQ19TUEVFRAkJODAwMDAJLyogMTAwS2JwcyB3b24ndCB3b3JrLCBzaWxpY29uIGJ1ZyAqLworI2RlZmluZSBDRkdfSTJDX1NMQVZFCQkxMAkvKiBCb2d1cywgbWFzdGVyLW9ubHkgaW4gVS1Cb290ICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogTmV0d29yayAmIEV0aGVybmV0IENvbmZpZ3VyYXRpb24gKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIENPTkZJR19EUklWRVJfVElfRU1BQworI2RlZmluZSBDT05GSUdfTUlJCisjZGVmaW5lIENPTkZJR19CT09UUF9ERUZBVUxUCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUzIKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NFTkRfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX05FVF9SRVRSWV9DT1VOVAkxMAorLyo9PT09PT09PT09PT09PT09PT09PT0qLworLyogRmxhc2ggJiBFbnZpcm9ubWVudCAqLworLyo9PT09PT09PT09PT09PT09PT09PT0qLworI2lmZGVmIENGR19VU0VfTkFORAorI3VuZGVmIENGR19FTlZfSVNfSU5fRkxBU0gKKyNkZWZpbmUgQ0ZHX05PX0ZMQVNICisjZGVmaW5lIENGR19FTlZfSVNfSU5fTkFORAkJLyogVS1Cb290IGVudiBpbiBOQU5EIEZsYXNoICAqLworI2RlZmluZSBDRkdfRU5WX1NFQ1RfU0laRQk1MTIJLyogRW52IHNlY3RvciBTaXplICovCisjZGVmaW5lIENGR19FTlZfU0laRQkJU1pfMTZLCisjZGVmaW5lIENPTkZJR19TS0lQX0xPV0xFVkVMX0lOSVQJLyogVS1Cb290IGlzIGxvYWRlZCBieSBhIGJvb3Rsb2FkZXIgKi8KKyNkZWZpbmUgQ09ORklHX1NLSVBfUkVMT0NBVEVfVUJPT1QJLyogdG8gYSBwcm9wZXIgYWRkcmVzcywgaW5pdCBkb25lICovCisjZGVmaW5lIENGR19OQU5EX0JBU0UJCTB4MDIwMDAwMDAKKyNkZWZpbmUgQ0ZHX05BTkRfSFdfRUNDCisjZGVmaW5lIENGR19NQVhfTkFORF9ERVZJQ0UJMQkvKiBNYXggbnVtYmVyIG9mIE5BTkQgZGV2aWNlcyAqLworI2RlZmluZSBOQU5EX01BWF9DSElQUwkJMQorI2RlZmluZSBDRkdfRU5WX09GRlNFVAkJMHgwCS8qIEJsb2NrIDAtLW5vdCB1c2VkIGJ5IGJvb3Rjb2RlICovCisjZGVmaW5lIERFRl9CT09UTQkJIiIKKyNlbGlmIGRlZmluZWQoQ0ZHX1VTRV9OT1IpCisjaWZkZWYgQ09ORklHX05PUl9VQVJUX0JPT1QKKyNkZWZpbmUgQ09ORklHX1NLSVBfTE9XTEVWRUxfSU5JVAkvKiBVLUJvb3QgaXMgbG9hZGVkIGJ5IGEgYm9vdGxvYWRlciAqLworI2RlZmluZSBDT05GSUdfU0tJUF9SRUxPQ0FURV9VQk9PVAkvKiB0byBhIHByb3BlciBhZGRyZXNzLCBpbml0IGRvbmUgKi8KKyNlbHNlCisjdW5kZWYgQ09ORklHX1NLSVBfTE9XTEVWRUxfSU5JVAorI3VuZGVmIENPTkZJR19TS0lQX1JFTE9DQVRFX1VCT09UCisjZW5kaWYKKyNkZWZpbmUgQ0ZHX0VOVl9JU19JTl9GTEFTSAorI3VuZGVmIENGR19OT19GTEFTSAorI2RlZmluZSBDRkdfRkxBU0hfQ0ZJX0RSSVZFUgorI2RlZmluZSBDRkdfRkxBU0hfQ0ZJCisjZGVmaW5lIENGR19NQVhfRkxBU0hfQkFOS1MJMQkJLyogbWF4IG51bWJlciBvZiBmbGFzaCBiYW5rcyAqLworI2RlZmluZSBDRkdfRkxBU0hfU0VDVF9TWgkweDIwMDAwCQkvKiAxMjhLQiBzZWN0IHNpemUgQU1EIEZsYXNoICovCisjZGVmaW5lIENGR19FTlZfT0ZGU0VUCQkoQ0ZHX0ZMQVNIX1NFQ1RfU1oqMikKKyNkZWZpbmUgUEhZU19GTEFTSF8xCQkweDAyMDAwMDAwCS8qIENTMiBCYXNlIGFkZHJlc3MgCSAqLworI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJUEhZU19GTEFTSF8xCS8qIEZsYXNoIEJhc2UgZm9yIFUtQm9vdCAqLworI2RlZmluZSBQSFlTX0ZMQVNIX1NJWkUJCTB4MjAwMDAwMAkvKiBGbGFzaCBzaXplIDMyTUIgCSAqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX1NFQ1QJKFBIWVNfRkxBU0hfU0laRS9DRkdfRkxBU0hfU0VDVF9TWikKKyNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJQ0ZHX0ZMQVNIX1NFQ1RfU1oJLyogRW52IHNlY3RvciBTaXplICovCisjZW5kaWYKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIFUtQm9vdCBnZW5lcmFsIGNvbmZpZ3VyYXRpb24gKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyN1bmRlZiAJQ09ORklHX1VTRV9JUlEJCQkvKiBObyBJUlEvRklRIGluIFUtQm9vdCAqLworI2RlZmluZSBDT05GSUdfTUlTQ19JTklUX1IKKyN1bmRlZiBDT05GSUdfQk9PVERFTEFZCisjZGVmaW5lIENPTkZJR19CT09URklMRQkJInVJbWFnZSIJLyogQm9vdCBmaWxlIG5hbWUgKi8KKyNkZWZpbmUgQ0ZHX1BST01QVAkJIlUtQm9vdCA+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLworI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KKyNkZWZpbmUgQ0ZHX1BCU0laRQkJKENGR19DQlNJWkUrc2l6ZW9mKENGR19QUk9NUFQpKzE2KQkvKiBQcmludCBidWZmZXIgc3ogKi8KKyNkZWZpbmUgQ0ZHX01BWEFSR1MJCTE2CQkvKiBtYXggbnVtYmVyIG9mIGNvbW1hbmQgYXJncyAqLworI2RlZmluZSBDRkdfQkFSR1NJWkUJCUNGR19DQlNJWkUJLyogQm9vdCBBcmd1bWVudCBCdWZmZXIgU2l6ZSAqLworI2RlZmluZSBDRkdfTE9BRF9BRERSCQkweDgwNzAwMDAwCS8qIGRlZmF1bHQgTGludXgga2VybmVsIGxvYWQgYWRkcmVzcyAqLworI2RlZmluZSBDT05GSUdfVkVSU0lPTl9WQVJJQUJMRQorI2RlZmluZSBDT05GSUdfQVVUT19DT01QTEVURQkJLyogV29uJ3Qgd29yayB3aXRoIGh1c2ggc28gZmFyLCBtYXkgYmUgbGF0ZXIgKi8KKyNkZWZpbmUgQ0ZHX0hVU0hfUEFSU0VSCisjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgorI2RlZmluZSBDT05GSUdfQ01ETElORV9FRElUSU5HCisjZGVmaW5lIENGR19MT05HSEVMUAorI2RlZmluZSBDT05GSUdfQ1JDMzJfVkVSSUZZCisjZGVmaW5lIENPTkZJR19NWF9DWUNMSUMKKy8qPT09PT09PT09PT09PT09PT09PSovCisvKiBMaW51eCBJbmZvcm1hdGlvbiAqLworLyo9PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUgTElOVVhfQk9PVF9QQVJBTV9BRERSCTB4ODAwMDAxMDAKKyNkZWZpbmUgQ09ORklHX0NNRExJTkVfVEFHCisjZGVmaW5lIENPTkZJR19TRVRVUF9NRU1PUllfVEFHUworI2RlZmluZSBDT05GSUdfQk9PVEFSR1MJCSJtZW09NTZNIGNvbnNvbGU9dHR5UzAsMTE1MjAwbjggcm9vdD0vZGV2L2hkYTEgcncgbm9pbml0cmQgaXA9ZGhjcCIKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJzZXRlbnYgc2V0Ym9vdCBzZXRlbnYgYm9vdGFyZ3MgXFwkKGJvb3RhcmdzKSB2aWRlbz1kbTY0eHhmYjpvdXRwdXQ9XFwkKHZpZGVvc3RkKTtydW4gc2V0Ym9vdDsgYm9vdG0gMHgyMDYwMDAwIgorLyo9PT09PT09PT09PT09PT09PSovCisvKiBVLUJvb3QgY29tbWFuZHMgKi8KKy8qPT09PT09PT09PT09PT09PT0qLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1NBVkVTCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjdW5kZWYgQ09ORklHX0NNRF9CREkKKyN1bmRlZiBDT05GSUdfQ01EX0ZQR0EKKyN1bmRlZiBDT05GSUdfQ01EX1NFVEdFVERDUgorI2lmZGVmIENGR19VU0VfTkFORAorI3VuZGVmIENPTkZJR19DTURfRkxBU0gKKyN1bmRlZiBDT05GSUdfQ01EX0lNTFMKKyNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECisjZWxpZiBkZWZpbmVkKENGR19VU0VfTk9SKQorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZWxzZQorI2Vycm9yICJFaXRoZXIgQ0ZHX1VTRV9OQU5EIG9yIENGR19VU0VfTk9SIF9NVVNUXyBiZSBkZWZpbmVkICEhISIKKyNlbmRpZgorLyo9PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBLR0RCIHN1cHBvcnQgKGlmIGFueSkgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT0qLworI2lmZGVmIENPTkZJR19DTURfS0dEQgorI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxMTUyMDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KKyNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTEJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCisjZW5kaWYKKyNlbmRpZiAvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvZGJhdTF4MDAuaCBiL2luY2x1ZGUvY29uZmlncy9kYmF1MXgwMC5oCmluZGV4IDRjYzUwODUuLmIyZjYwNmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9kYmF1MXgwMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9kYmF1MXgwMC5oCkBAIC03NSwyMSArNzUsNTcgQEAKICNpZmRlZiBDT05GSUdfREJBVTE1NTAKIC8qIEJvb3QgZnJvbSBmbGFzaCBieSBkZWZhdWx0LCByZXZlcnQgdG8gYm9vdHAgKi8KICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJib290bSAweGJmYzIwMDAwOyBib290cDsgYm9vdG0iCi0KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9GTEFTSCB8IENGR19DTURfTE9BREIgfCBDRkdfQ01EX05FVCkgJiBcCi0JCQkJIH4oQ0ZHX0NNRF9FTlYgfCBDRkdfQ01EX0ZBVCB8IENGR19DTURfRlBHQSB8IENGR19DTURfSURFIHwgXAotCQkJCSAgIENGR19DTURfTUlJIHwgQ0ZHX0NNRF9SVU4gfCBDRkdfQ01EX0JESSB8IENGR19DTURfQkVEQlVHIHwgXAotCQkJCSAgIENGR19DTURfTkZTIHwgQ0ZHX0NNRF9FTEYgfCBDRkdfQ01EX1BDTUNJQSB8IENGR19DTURfSTJDKSkKICNlbHNlIC8qIENPTkZJR19EQkFVMTU1MCAqLwogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RwO2Jvb3RtIgotCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfSURFIHwgQ0ZHX0NNRF9ESENQIHwgQ0ZHX0NNRF9FTEYpICYgXAotCQkJCSB+KENGR19DTURfRU5WIHwgQ0ZHX0NNRF9GQVQgfCBDRkdfQ01EX0ZMQVNIIHwgQ0ZHX0NNRF9GUEdBIHwgXAotCQkJCSAgIENGR19DTURfTUlJIHwgQ0ZHX0NNRF9MT0FEUyB8IENGR19DTURfUlVOIHwgQ0ZHX0NNRF9MT0FEQiB8IFwKLQkJCQkgICBDRkdfQ01EX0VMRiB8IENGR19DTURfQkRJIHwgQ0ZHX0NNRF9CRURCVUcpKQogI2VuZGlmIC8qIENPTkZJR19EQkFVMTU1MCAqLwogCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyN1bmRlZiBDT05GSUdfQ01EX0JESQorI3VuZGVmIENPTkZJR19DTURfQkVEQlVHCisjdW5kZWYgQ09ORklHX0NNRF9FTEYKKyN1bmRlZiBDT05GSUdfQ01EX0VOVgorI3VuZGVmIENPTkZJR19DTURfRkFUCisjdW5kZWYgQ09ORklHX0NNRF9GUEdBCisjdW5kZWYgQ09ORklHX0NNRF9NSUkKKyN1bmRlZiBDT05GSUdfQ01EX1JVTgorCisKKyNpZmRlZiBDT05GSUdfREJBVTE1NTAKKworI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfTE9BREIKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKworI3VuZGVmIENPTkZJR19DTURfSTJDCisjdW5kZWYgQ09ORklHX0NNRF9JREUKKyN1bmRlZiBDT05GSUdfQ01EX05GUworI3VuZGVmIENPTkZJR19DTURfUENNQ0lBCisKKyNlbHNlCisKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisKKyN1bmRlZiBDT05GSUdfQ01EX0ZMQVNICisjdW5kZWYgQ09ORklHX0NNRF9MT0FEQgorI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKworI2VuZGlmCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9kZWJyaXMuaCBiL2luY2x1ZGUvY29uZmlncy9kZWJyaXMuaAppbmRleCA4ZmY5NjNmLi43NjY3ZTVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvZGVicmlzLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2RlYnJpcy5oCkBAIC0xMjIsMjMgKzEyMiwzNSBAQAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTk2MDAKICNkZWZpbmUgQ09ORklHX0RSQU1fU1BFRUQJMTAwCQkvKiBNSHogKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJICBDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQkgIENGR19DTURfQ0FDSEUJCXwgXAotCQkJCSAgQ0ZHX0NNRF9EQVRFCQl8IFwKLQkJCQkgIENGR19DTURfREhDUAkJfCBcCi0JCQkJICBDRkdfQ01EX0RJQUcJCXwgXAotCQkJCSAgQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJICBDRkdfQ01EX0VMRgkJfCBcCi0JCQkJICBDRkdfQ01EX0kyQwkJfCBcCi0JCQkJICBDRkdfQ01EX0pGRlMyCQl8IFwKLQkJCQkgIENGR19DTURfS0dCRAkJfCBcCi0JCQkJICBDRkdfQ01EX1BDSQkJfCBcCi0JCQkJICBDRkdfQ01EX1BJTkcJCXwgXAotCQkJCSAgQ0ZHX0NNRF9TQVZFUwkJfCBcCi0JCQkJICBDRkdfQ01EX1NEUkFNKQotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KQkqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX0tHQkQKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfU0FWRVMKKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQogCiAKIC8qCkBAIC00MzUsNyArNDQ3LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyNDAgQ1BVCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9kZWx0YS5oIGIvaW5jbHVkZS9jb25maWdzL2RlbHRhLmgKaW5kZXggMTU2ODEyMC4uMDk2NjdlZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2RlbHRhLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2RlbHRhLmgKQEAgLTg3LDIyICs4Nyw0OSBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAKLS8qICNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgIChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfTU1DIHwgQ0ZHX0NNRF9GQVQpICovCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKICNpZmRlZiBUVVJOX09OX0VUSEVSTkVUCi0jIGRlZmluZSBDT05GSUdfQ09NTUFORFMgICAgICAgIChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUElORykKKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKwogI2Vsc2UKLSMgZGVmaW5lIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMIFwKLQkJCQkgIHwgQ0ZHX0NNRF9FTlYgXAotCQkJCSAgfCBDRkdfQ01EX05BTkQgXAotCQkJCSAgfCBDRkdfQ01EX0kyQykgXAotCQkJCSAmIH4oQ0ZHX0NNRF9ORVQgXAotCQkJCSAgICAgfCBDRkdfQ01EX0ZMQVNIIFwKLQkJCQkgICAgIHwgQ0ZHX0NNRF9JTUxTKSkKKworI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKworI3VuZGVmIENPTkZJR19DTURfTkVUCisjdW5kZWYgQ09ORklHX0NNRF9GTEFTSAorI3VuZGVmIENPTkZJR19DTURfSU1MUworCiAjZW5kaWYKIAorLyogVVNCICovCisjZGVmaW5lIENPTkZJR19VU0JfT0hDSV9ORVcJMQorI2RlZmluZSBDT05GSUdfVVNCX1NUT1JBR0UgICAgICAxCisjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OICAgIDEKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI3VuZGVmIENGR19VU0JfT0hDSV9CT0FSRF9JTklUCisjZGVmaW5lIENGR19VU0JfT0hDSV9DUFVfSU5JVAkxCisjZGVmaW5lIENGR19VU0JfT0hDSV9SRUdTX0JBU0UJT0hDSV9SRUdTX0JBU0UKKyNkZWZpbmUgQ0ZHX1VTQl9PSENJX1NMT1RfTkFNRQkiZGVsdGEiCisjZGVmaW5lIENGR19VU0JfT0hDSV9NQVhfUk9PVF9QT1JUUwkzCisKKyNkZWZpbmUgTElUVExFRU5ESUFOICAgICAgICAgICAgMSAgICAgICAvKiB1c2VkIGJ5IHVzYl9vaGNpLmMgICovCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQktMQogI2RlZmluZSBDT05GSUdfRVRIQUREUgkJMDg6MDA6M2U6MjY6MGE6NWIKQEAgLTExNCw3ICsxNDEsNyBAQAogI2RlZmluZSBDT05GSUdfQ01ETElORV9UQUcKICNkZWZpbmUgQ09ORklHX1RJTUVTVEFNUAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9kbnAxMTEwLmggYi9pbmNsdWRlL2NvbmZpZ3MvZG5wMTExMC5oCmluZGV4IDlhYzI4NTYuLmQzMmUwNDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9kbnAxMTEwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2RucDExMTAuaApAQCAtNjYsMTAgKzY2LDIxIEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MgICAgCSJyb290PXJhbWZzIGRldmZzPW1vdW50IGNvbnNvbGU9dHR5U0EwLDExNTIwMCIKQEAgLTgwLDcgKzkxLDcgQEAKICNkZWZpbmUgQ09ORklHX0JPT1RGSUxFCQkiZG5wMTExMCIKICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJ0ZnRwOyBib290bSIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvZVhhbGlvbi5oIGIvaW5jbHVkZS9jb25maWdzL2VYYWxpb24uaAppbmRleCBhMDE0YzdjLi5mOGUyYzg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvZVhhbGlvbi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9lWGFsaW9uLmgKQEAgLTU4LDE3ICs1OCwyNyBAQAogCiAJCQkJCQkgICAgLyojZGVmaW5lIENPTkZJR19EUkFNX1NQRUVECSAgICAgIDY2ICAgKi8gLyogTUh6CQkJICAgICAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKCAgIENPTkZJR19DTURfREZMICB8IFwKLQkJCQkgICAgQ0ZHX0NNRF9GTEFTSCAgIHwgXAotCQkJCSAgICBDRkdfQ01EX1NEUkFNICAgfCBcCi0JCQkJICAgIENGR19DTURfSTJDCSAgICB8IFwKLQkJCQkgICAgQ0ZHX0NNRF9JREUJICAgIHwgXAotCQkJCSAgICBDRkdfQ01EX0ZBVAkgICAgfCBcCi0JCQkJICAgIENGR19DTURfRU5WCSAgICB8IFwKLQkJCQkgICAgQ0ZHX0NNRF9QQ0kgKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KQkqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKIAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zOTgsNyArNDA4LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9lYm9ueS5oIGIvaW5jbHVkZS9jb25maWdzL2Vib255LmgKaW5kZXggYTQyMzE5Yi4uMmM2MjZhMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2Vib255LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2Vib255LmgKQEAgLTMyLDYgKzMyLDcgQEAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjZGVmaW5lIENPTkZJR19FQk9OWQkJMQkgICAgLyogQm9hcmQgaXMgZWJvbnkJCSovCiAjZGVmaW5lIENPTkZJR180NDBHUAkJMQkgICAgLyogU3BlY2lmYyBHUCBzdXBwb3J0CSovCisjZGVmaW5lIENPTkZJR180NDAJCTEJICAgIC8qIC4uLiBQUEM0NDAgZmFtaWx5CSovCiAjZGVmaW5lIENPTkZJR180eHgJCTEJICAgIC8qIC4uLiBQUEM0eHggZmFtaWx5CSovCiAjZGVmaW5lIENPTkZJR19CT0FSRF9FQVJMWV9JTklUX0YgMQkgICAgLyogQ2FsbCBib2FyZF9lYXJseV9pbml0X2YJKi8KICN1bmRlZglDRkdfRFJBTV9URVNUCQkJICAgIC8qIERpc2FibGUtdGFrZXMgbG9uZyB0aW1lISAqLwpAQCAtMTIxLDcgKzEyMiw3IEBACiAjZGVmaW5lIENGR19GTEFTSF9XT1JEX1NJWkUgICAgIHVuc2lnbmVkIGNoYXIKIAogI2lmZGVmIENGR19FTlZfSVNfSU5fRkxBU0gKLSNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJMHgxMDAwMCAJLyogc2l6ZSBvZiBvbmUgY29tcGxldGUgc2VjdG9yCSovCisjZGVmaW5lIENGR19FTlZfU0VDVF9TSVpFCTB4MTAwMDAJLyogc2l6ZSBvZiBvbmUgY29tcGxldGUgc2VjdG9yCQkqLwogI2RlZmluZSBDRkdfRU5WX0FERFIJCShDRkdfTU9OSVRPUl9CQVNFLUNGR19FTlZfU0VDVF9TSVpFKQogI2RlZmluZQlDRkdfRU5WX1NJWkUJCTB4NDAwMAkvKiBUb3RhbCBTaXplIG9mIEVudmlyb25tZW50IFNlY3RvcgkqLwogCkBAIC0yMDcsMjYgKzIwOCwzOCBAQAogCiAjZGVmaW5lIENPTkZJR19ORVRDT05TT0xFCQkvKiBpbmNsdWRlIE5ldENvbnNvbGUgc3VwcG9ydAkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9ESUFHCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkVUCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX1JFR0lORk8JfCBcCi0JCQkJQ0ZHX0NNRF9TRFJBTQl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTIzNSw3ICsyNDgsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSI9PiAiCQkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yNjksNyArMjgyLDYgQEAKICNkZWZpbmUgQ0ZHX1BDSV9UQVJHQkFTRSAgICAweDgwMDAwMDAwICAvKiBQQ0lhZGRyIG1hcHBlZCB0byBDRkdfUENJX01FTUJBU0UgKi8KIAogLyogQm9hcmQtc3BlY2lmaWMgUENJICovCi0jZGVmaW5lIENGR19QQ0lfUFJFX0lOSVQgICAgICAgICAgICAgICAgLyogZW5hYmxlIGJvYXJkIHBjaV9wcmVfaW5pdCgpICAqLwogI2RlZmluZSBDRkdfUENJX1RBUkdFVF9JTklUCSAgICAgICAgICAgIC8qIGxldCBib2FyZCBpbml0IHBjaSB0YXJnZXQgICAgKi8KIAogI2RlZmluZSBDRkdfUENJX1NVQlNZU19WRU5ET1JJRCAweDEwZTgJLyogQU1DQyAqLwpAQCAtMjg2LDcgKzI5OCw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQk4MTkyCS8qIEZvciBBTUNDIDQwNSBDUFVzCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtMjk4LDcgKzMxMCw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvZXA3MzEyLmggYi9pbmNsdWRlL2NvbmZpZ3MvZXA3MzEyLmgKaW5kZXggYmRkYTYyOS4uZjVjZjQ3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2VwNzMxMi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9lcDczMTIuaApAQCAtNjIsMTIgKzYyLDIzIEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQk5NjAwCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sgICAgICAgKENPTkZJR19CT09UUF9ERUZBVUxUfENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9KRkZTMikKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUyAgICAJImRldmZzPW1vdW50IHJvb3Q9cmFtZnMgY29uc29sZT10dHlTMCw5NjAwIgpAQCAtNzgsNyArODksNyBAQAogLyojZGVmaW5lIENPTkZJR19CT09URklMRQkiaW1wYTciCSovCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdHA7Ym9vdG0iCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2VwODI0OC5oIGIvaW5jbHVkZS9jb25maWdzL2VwODI0OC5oCmluZGV4IDA0MTQ3YTUuLjg1YWQ3MGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9lcDgyNDguaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvZXA4MjQ4LmgKQEAgLTYwLDggKzYwLDggQEAKICAqIFNDQywgMS0zIGZvciBGQ0MpCiAgKgogICogSWYgQ09ORklHX0VUSEVSX05PTkUgaXMgZGVmaW5lZCwgdGhlbiBlaXRoZXIgdGhlIGV0aGVybmV0IHJvdXRpbmVzCi0gKiBtdXN0IGJlIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDRkdfQ01EX05FVCBtdXN0Ci0gKiBiZSByZW1vdmVkIGZyb20gQ09ORklHX0NPTU1BTkRTIHRvIHJlbW92ZSBzdXBwb3J0IGZvciBuZXR3b3JraW5nLgorICogbXVzdCBiZSBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ09ORklHX0NNRF9ORVQKKyAqIG11c3QgYmUgdW5zZXQuCiAgKi8KICN1bmRlZglDT05GSUdfRVRIRVJfT05fU0NDCQkvKiBFdGhlcm5ldCBpcyBub3Qgb24gU0NDICovCiAjZGVmaW5lIENPTkZJR19FVEhFUl9PTl9GQ0MJCS8qIEV0aGVybmV0IGlzIG9uIEZDQyAgICAgKi8KQEAgLTEyMywyMyArMTIzLDM0IEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkzODQwMAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMICAgXAotCQkJCXwgQ0ZHX0NNRF9ESENQICAgIFwKLQkJCQl8IENGR19DTURfRUNITyAgICBcCi0JCQkJfCBDRkdfQ01EX0kyQyAgICAgXAotCQkJCXwgQ0ZHX0NNRF9JTU1BUCAgIFwKLQkJCQl8IENGR19DTURfTUlJICAgICBcCi0JCQkJfCBDRkdfQ01EX1BJTkcgICAgXAotCQkJCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FQ0hPCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUJLyogYXV0b2Jvb3QgYWZ0ZXIgNSBzZWNvbmRzICovCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdG0gRkY4NjAwMDAiCS8qIGF1dG9ib290IGNvbW1hbmQgKi8KICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTCQkicm9vdD0vZGV2L210ZGJsb2NrMSBydyBtdGRwYXJ0cz1waHlzOjdNKHJvb3QpLC0ocm9vdClybyIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjdW5kZWYJQ09ORklHX0tHREJfT05fU01DCQkvKiBkZWZpbmUgaWYga2dkYiBvbiBTTUMgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfT05fU0NDCQkvKiBkZWZpbmUgaWYga2dkYiBvbiBTQ0MgKi8KICN1bmRlZglDT05GSUdfS0dEQl9OT05FCQkvKiBkZWZpbmUgaWYga2dkYiBvbiBzb21ldGhpbmcgZWxzZSAqLwpAQCAtMTU3LDcgKzE2OCw3IEBACiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkgICAgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAgICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KQEAgLTE4MywyMCArMTk0LDIwIEBACiAKICNkZWZpbmUJQ0ZHX0RJUkVDVF9GTEFTSF9URlRQCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9KRkZTMikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSkZGUzIpCiAjZGVmaW5lIENGR19KRkZTMl9GSVJTVF9CQU5LCTAKICNkZWZpbmUgQ0ZHX0pGRlMyX05VTV9CQU5LUwlDRkdfTUFYX0ZMQVNIX0JBTktTCiAjZGVmaW5lIENGR19KRkZTMl9GSVJTVF9TRUNUT1IgIDAKICNkZWZpbmUgQ0ZHX0pGRlMyX0xBU1RfU0VDVE9SICAgNjIKICNkZWZpbmUgQ0ZHX0pGRlMyX1NPUlRfRlJBR01FTlRTCiAjZGVmaW5lIENGR19KRkZTX0NVU1RPTV9QQVJUCi0jZW5kaWYgLyogQ0ZHX0NNRF9KRkZTMiAqLworI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JMkMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0kyQykKICNkZWZpbmUgQ09ORklHX0hBUkRfSTJDCQkxCS8qIFRvIGVuYWJsZSBJMkMgc3VwcG9ydAkqLwogI2RlZmluZSBDRkdfSTJDX1NQRUVECQkxMDAwMDAJLyogSTJDIHNwZWVkCQkJKi8KICNkZWZpbmUgQ0ZHX0kyQ19TTEFWRQkJMHg3RgkvKiBJMkMgc2xhdmUgYWRkcmVzcwkJKi8KLSNlbmRpZiAvKiBDRkdfQ01EX0kyQyAqLworI2VuZGlmCiAKICNkZWZpbmUgQ0ZHX01PTklUT1JfQkFTRQlURVhUX0JBU0UKICNpZiAoQ0ZHX01PTklUT1JfQkFTRSA8IENGR19GTEFTSF9CQVNFKQpAQCAtMjQwLDcgKzI1MSw3IEBACiAjZGVmaW5lIENGR19CT09UTUFQU1oJCSg4IDw8IDIwKQkvKiBJbml0aWFsIE1lbW9yeSBtYXAgZm9yIExpbnV4ICovCiAKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM4MjYwIENQVXMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9lcDgyNjAuaCBiL2luY2x1ZGUvY29uZmlncy9lcDgyNjAuaAppbmRleCA2ODYyNTE5Li4wMjVjMjQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvZXA4MjYwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2VwODI2MC5oCkBAIC0xODMsOCArMTgzLDcgQEAKICAqIGZvciBGQ0MpCiAgKgogICogaWYgQ09ORklHX0VUSEVSX05PTkUgaXMgZGVmaW5lZCwgdGhlbiBlaXRoZXIgdGhlIGV0aGVybmV0IHJvdXRpbmVzIG11c3QgYmUKLSAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDRkdfQ01EX05FVCBtdXN0IGJlIHJlbW92ZWQKLSAqIGZyb20gQ09ORklHX0NPTU1BTkRTIHRvIHJlbW92ZSBzdXBwb3J0IGZvciBuZXR3b3JraW5nLgorICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUIG11c3QgYmUgdW5zZXQuCiAgKi8KICN1bmRlZiAgQ09ORklHX0VUSEVSX09OX1NDQyAgICAgICAgICAgLyogZGVmaW5lIGlmIGV0aGVybmV0IG9uIFNDQyAgICAqLwogI2RlZmluZSBDT05GSUdfRVRIRVJfT05fRkNDICAgICAgICAgICAvKiBkZWZpbmUgaWYgZXRoZXJuZXQgb24gRkNDICAgICovCkBAIC0yOTEsMzcgKzI5MCw0OSBAQAogI2RlZmluZSBDRkdfSFVTSF9QQVJTRVIKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAKLS8qIFdoYXQgVS1Cb290IHN1YnN5dGVtcyBkbyB5b3Ugd2FudCBlbmFibGVkPyAqLworCiAvKgotKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoIENGR19DTURfQUxMICAgICAmIFwKLQkJCQkgIH4oCUNGR19DTURfQk1QCXwgXAotCQkJCQlDRkdfQ01EX0JTUAl8IFwKLQkJCQkJQ0ZHX0NNRF9EQ1IJfCBcCi0JCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQkJQ0ZHX0NNRF9ESVNQTEFZCXwgXAotCQkJCQlDRkdfQ01EX0RPQwl8IFwKLQkJCQkJQ0ZHX0NNRF9EVFQJfCBcCi0JCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCQlDRkdfQ01EX0VYVDIJfCBcCi0JCQkJCUNGR19DTURfRkRDCXwgXAotCQkJCQlDRkdfQ01EX0ZET1MJfCBcCi0JCQkJCUNGR19DTURfSFdGTE9XCXwgXAotCQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQkJQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQkJQ0ZHX0NNRF9LR0RCCXwgXAotCQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQkJQ0ZHX0NNRF9NTUMJfCBcCi0JCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJCUNGR19DTURfUENNQ0lBCXwgXAotCQkJCQlDRkdfQ01EX1JFSVNFUgl8IFwKLQkJCQkJQ0ZHX0NNRF9TQ1NJCXwgXAotCQkJCQlDRkdfQ01EX1NQSQl8IFwKLQkJCQkJQ0ZHX0NNRF9VTklWRVJTRXwgXAotCQkJCQlDRkdfQ01EX1VTQgl8IFwKLQkJCQkJQ0ZHX0NNRF9WRkQJfCBcCi0JCQkJCUNGR19DTURfWElNRwkpICkKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2FsbC5oPgorCisjdW5kZWYgQ09ORklHX0NNRF9CTVAKKyN1bmRlZiBDT05GSUdfQ01EX0JTUAorI3VuZGVmIENPTkZJR19DTURfRENSCisjdW5kZWYgQ09ORklHX0NNRF9ESENQCisjdW5kZWYgQ09ORklHX0NNRF9ESVNQTEFZCisjdW5kZWYgQ09ORklHX0NNRF9ET0MKKyN1bmRlZiBDT05GSUdfQ01EX0RUVAorI3VuZGVmIENPTkZJR19DTURfRUVQUk9NCisjdW5kZWYgQ09ORklHX0NNRF9FWFQyCisjdW5kZWYgQ09ORklHX0NNRF9GREMKKyN1bmRlZiBDT05GSUdfQ01EX0ZET1MKKyN1bmRlZiBDT05GSUdfQ01EX0hXRkxPVworI3VuZGVmIENPTkZJR19DTURfSURFCisjdW5kZWYgQ09ORklHX0NNRF9KRkZTMgorI3VuZGVmIENPTkZJR19DTURfS0dEQgorI3VuZGVmIENPTkZJR19DTURfTUlJCisjdW5kZWYgQ09ORklHX0NNRF9NRlNMCisjdW5kZWYgQ09ORklHX0NNRF9NTUMKKyN1bmRlZiBDT05GSUdfQ01EX05BTkQKKyN1bmRlZiBDT05GSUdfQ01EX1BDSQorI3VuZGVmIENPTkZJR19DTURfUENNQ0lBCisjdW5kZWYgQ09ORklHX0NNRF9SRUlTRVIKKyN1bmRlZiBDT05GSUdfQ01EX1NDU0kKKyN1bmRlZiBDT05GSUdfQ01EX1NQSQorI3VuZGVmIENPTkZJR19DTURfVU5JVkVSU0UKKyN1bmRlZiBDT05GSUdfQ01EX1VTQgorI3VuZGVmIENPTkZJR19DTURfVkZECisjdW5kZWYgQ09ORklHX0NNRF9YSU1HCiAKIAogLyogV2hlcmUgZG8gdGhlIGludGVybmFsIHJlZ2lzdGVycyBsaXZlPyAqLwpAQCAtMzQyLDEzICszNTMsMTAgQEAKIAogI2RlZmluZSBDT05GSUdfQk9BUkRfRUFSTFlfSU5JVF9GIDEJICAgIC8qIENhbGwgYm9hcmRfZWFybHlfaW5pdF9mCSovCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NCU0laRSAgICAgICAgICAgICAgMTAyNCAgICAgICAvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgICAgICovCiAjZWxzZQogIyAgZGVmaW5lIENGR19DQlNJWkUgICAgICAgICAgICAgIDI1NiAgICAgICAgLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICAgICAqLwpAQCAtNDk2LDcgKzUwNCw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFICAgICAgMzIgICAgICAvKiBGb3IgTVBDODI2MCBDUFUgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVCAgICAgNSAgICAgLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvZXA4Mnh4bS5oIGIvaW5jbHVkZS9jb25maWdzL2VwODJ4eG0uaAppbmRleCBhNzdjY2VmLi40ZmViZDMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvZXA4Mnh4bS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9lcDgyeHhtLmgKQEAgLTYwLDggKzYwLDggQEAKICAqIFNDQywgMS0zIGZvciBGQ0MpCiAgKgogICogSWYgQ09ORklHX0VUSEVSX05PTkUgaXMgZGVmaW5lZCwgdGhlbiBlaXRoZXIgdGhlIGV0aGVybmV0IHJvdXRpbmVzCi0gKiBtdXN0IGJlIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDRkdfQ01EX05FVCBtdXN0Ci0gKiBiZSByZW1vdmVkIGZyb20gQ09ORklHX0NPTU1BTkRTIHRvIHJlbW92ZSBzdXBwb3J0IGZvciBuZXR3b3JraW5nLgorICogbXVzdCBiZSBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ09ORklHX0NNRF9ORVQKKyAqIG11c3QgYmUgdW5zZXQuCiAgKi8KICN1bmRlZglDT05GSUdfRVRIRVJfT05fU0NDCQkvKiBFdGhlcm5ldCBpcyBub3Qgb24gU0NDICovCiAjZGVmaW5lIENPTkZJR19FVEhFUl9PTl9GQ0MJCS8qIEV0aGVybmV0IGlzIG9uIEZDQyAgICAgKi8KQEAgLTEwOCwyMiArMTA4LDM0IEBACiAKICNkZWZpbmUgQ0ZHX1ZYV09SS1NfTUFDX1BUUiAweDQzMDAgLyogUGFzcyBFdGhlcm5ldCBNQUMgdG8gVnhXb3JrcyAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMICAgXAotCQkJCXwgQ0ZHX0NNRF9ESENQICAgIFwKLQkJCQl8IENGR19DTURfRUNITyAgICBcCi0JCQkJfCBDRkdfQ01EX0kyQyAgICAgXAotCQkJCXwgQ0ZHX0NNRF9JTU1BUCAgIFwKLQkJCQl8IENGR19DTURfTUlJICAgICBcCi0JCQkJfCBDRkdfQ01EX1BJTkcgICAgXAotCQkJCXwgQ0ZHX0NNRF9EQVRFICAgIFwKLQkJCQl8IENGR19DTURfRFRUCSAgXAotCQkJCXwgQ0ZHX0NNRF9FRVBST00gIFwKLQkJCQl8IENGR19DTURfUENJCSAgXAotCQkJCXwgQ0ZHX0NNRF9ESUFHCSAgXAotCQkJCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VDSE8KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JTU1BUAorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfRFRUCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfRElBRworCiAKICNkZWZpbmUgQ09ORklHX0VUSEFERFIJCTAwOjEwOkVDOjAwOjg4OjY1CiAjZGVmaW5lIENPTkZJR19IQVNfRVRIMQpAQCAtMTM4LDcgKzE1MCw3IEBACiAjZGVmaW5lIENPTkZJR19BVVRPX0NPTVBMRVRFCTEKICNkZWZpbmUJQ09ORklHX0VYVFJBX0VOVl9TRVRUSU5HUwkiZXRocHJpbWU9RkNDMyBFVEhFUk5FVCIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjdW5kZWYJQ09ORklHX0tHREJfT05fU01DCQkvKiBkZWZpbmUgaWYga2dkYiBvbiBTTUMgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfT05fU0NDCQkvKiBkZWZpbmUgaWYga2dkYiBvbiBTQ0MgKi8KICN1bmRlZglDT05GSUdfS0dEQl9OT05FCQkvKiBkZWZpbmUgaWYga2dkYiBvbiBzb21ldGhpbmcgZWxzZSAqLwpAQCAtMTU2LDcgKzE2OCw3IEBACiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkgICAgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJImVwODJ4eG09PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCkBAIC0zMDgsMjAgKzMyMCwyMCBAQAogCiAjZGVmaW5lCUNGR19ESVJFQ1RfRkxBU0hfVEZUUAogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKQogI2RlZmluZSBDRkdfSkZGUzJfRklSU1RfQkFOSwkwCiAjZGVmaW5lIENGR19KRkZTMl9OVU1fQkFOS1MJQ0ZHX01BWF9GTEFTSF9CQU5LUwogI2RlZmluZSBDRkdfSkZGUzJfRklSU1RfU0VDVE9SICAwCiAjZGVmaW5lIENGR19KRkZTMl9MQVNUX1NFQ1RPUiAgIDYyCiAjZGVmaW5lIENGR19KRkZTMl9TT1JUX0ZSQUdNRU5UUwogI2RlZmluZSBDRkdfSkZGU19DVVNUT01fUEFSVAotI2VuZGlmIC8qIENGR19DTURfSkZGUzIgKi8KKyNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSTJDKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JMkMpCiAjZGVmaW5lIENPTkZJR19IQVJEX0kyQwkJMQkvKiBUbyBlbmFibGUgSTJDIHN1cHBvcnQJKi8KICNkZWZpbmUgQ0ZHX0kyQ19TUEVFRAkJMTAwMDAwCS8qIEkyQyBzcGVlZAkJCSovCiAjZGVmaW5lIENGR19JMkNfU0xBVkUJCTB4N0YJLyogSTJDIHNsYXZlIGFkZHJlc3MJCSovCi0jZW5kaWYgLyogQ0ZHX0NNRF9JMkMgKi8KKyNlbmRpZgogCiAjZGVmaW5lIENGR19NT05JVE9SX0JBU0UJVEVYVF9CQVNFCiAjaWYgKENGR19NT05JVE9SX0JBU0UgPCBDRkdfRkxBU0hfQkFTRSkKQEAgLTM1OCw3ICszNzAsNyBAQAogI2RlZmluZSBDRkdfQk9PVE1BUFNaCQkoOCA8PCAyMCkJLyogSW5pdGlhbCBNZW1vcnkgbWFwIGZvciBMaW51eCAqLwogCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODI2MCBDUFVzICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2V2YjQ1MTAuaCBiL2luY2x1ZGUvY29uZmlncy9ldmI0NTEwLmgKaW5kZXggODhjMmM3NC4uNjY1MDBjMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2V2YjQ1MTAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvZXZiNDUxMC5oCkBAIC03MiwxMiArNzIsMjMgQEAKIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTE5MjAwCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUfENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QSU5HKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKwogCiAjZGVmaW5lIENPTkZJR19FVEhBRERSCQkwMDo0MDo5NTozNjozNTozMwogI2RlZmluZSBDT05GSUdfTkVUTUFTSwkJMjU1LjI1NS4yNTUuMApAQCAtODksNyArMTAwLDcgQEAKICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJ0ZnRwIDEwMDAwMCB1SW1hZ2UiCiAvKiAjZGVmaW5lIENPTkZJR19CT09UQVJHUyAgICAJImNvbnNvbGU9dHR5UzAsMTkyMDAgaW5pdHJkPTB4MTAwYTAwNDAsNTMwSyByb290PS9kZXYvcmFtIGtlZXBpbml0cmQiICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxOTIwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvZ2NwbHVzLmggYi9pbmNsdWRlL2NvbmZpZ3MvZ2NwbHVzLmgKaW5kZXggYjY4YTJkYy4uZTExY2U0YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2djcGx1cy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9nY3BsdXMuaApAQCAtNzksMTggKzc5LDMwIEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkzODQwMAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9ESENQKQotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwlDT05GSUdfQk9PVFBfREVGQVVMVAogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKworCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MJCSJjb25zb2xlPXR0eVNBMCwzODQwMG44IG10ZHBhcnRzPXNhMTEwMC1mbGFzaDoxbUAwKHpJbWFnZSksM21AMW0ocmFtZGlzay5neiksMTJtQDRtKHVzZXJmcykgcm9vdD0vZGV2L25mcyBpcD1ib290cCIKICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJib290cDt0ZnRwO2Jvb3RtIgogI2RlZmluZSBDRkdfQVVUT0xPQUQgICAgICAgICAgICAibiIgICAgICAgICAgICAgLyogTm8gYXV0b2xvYWQgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTM4NDAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9ndGgyLmggYi9pbmNsdWRlL2NvbmZpZ3MvZ3RoMi5oCmluZGV4IGE0OWVkM2IuLmMyYTUwYzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9ndGgyLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2d0aDIuaApAQCAtNzEsMTIgKzcxLDM3IEBACiAvKiBCb290IGZyb20gQ29tcGFjdCBmbGFzaCBwYXJ0aXRpb24gMiBhcyBkZWZhdWx0ICovCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiaWRlIHJlc2V0O2Rpc2sgMHg4MTAwMDAwMCAwOjI7cnVuIGFkZG1pc2M7Ym9vdG0iCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICgoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX0lERSB8IENGR19DTURfREhDUCApICYgXAotIH4oQ0ZHX0NNRF9FTlYgfCBDRkdfQ01EX0ZBVCB8IENGR19DTURfRkxBU0ggfCBDRkdfQ01EX0ZQR0EgfCBcCi0gICBDRkdfQ01EX01JSSB8IENGR19DTURfTE9BRFMJfCBDRkdfQ01EX0xPQURCIHwgQ0ZHX0NNRF9FTEYgfCBcCi0gICBDRkdfQ01EX0JESSB8IENGR19DTURfQkVEQlVHIHwgQ0ZHX0NNRF9ORlMgfCBDRkdfQ01EX0FVVE9TQ1JJUFQgKSkKIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKworI3VuZGVmIENPTkZJR19DTURfRU5WCisjdW5kZWYgQ09ORklHX0NNRF9GQVQKKyN1bmRlZiBDT05GSUdfQ01EX0ZMQVNICisjdW5kZWYgQ09ORklHX0NNRF9GUEdBCisjdW5kZWYgQ09ORklHX0NNRF9NSUkKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjdW5kZWYgQ09ORklHX0NNRF9MT0FEQgorI3VuZGVmIENPTkZJR19DTURfRUxGCisjdW5kZWYgQ09ORklHX0NNRF9CREkKKyN1bmRlZiBDT05GSUdfQ01EX0JFREJVRworI3VuZGVmIENPTkZJR19DTURfTkZTCisjdW5kZWYgQ09ORklHX0NNRF9BVVRPU0NSSVBUCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9ndzgyNjAuaCBiL2luY2x1ZGUvY29uZmlncy9ndzgyNjAuaAppbmRleCA0ZjgzYjE5Li5mZjU3MjQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvZ3c4MjYwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2d3ODI2MC5oCkBAIC0xOTQsOCArMTk0LDcgQEAKICAqIGZvciBGQ0MpCiAgKgogICogaWYgQ09ORklHX0VUSEVSX05PTkUgaXMgZGVmaW5lZCwgdGhlbiBlaXRoZXIgdGhlIGV0aGVybmV0IHJvdXRpbmVzIG11c3QgYmUKLSAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDRkdfQ01EX05FVCBtdXN0IGJlIHJlbW92ZWQKLSAqIGZyb20gQ09ORklHX0NPTU1BTkRTIHRvIHJlbW92ZSBzdXBwb3J0IGZvciBuZXR3b3JraW5nLgorICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUIG11c3QgYmUgdW5zZXQuCiAgKi8KIAogI3VuZGVmICBDT05GSUdfRVRIRVJfT05fU0NDCkBAIC0yODYsMTMgKzI4NSwxNiBAQAogI3VuZGVmICBDT05GSUdfQVVUT0JPT1RfREVMQVlfU1RSCiAjZGVmaW5lIERFQlVHX0JPT1RLRVlTICAgICAgMAogCi0vKiBBZGQgc3VwcG9ydCBmb3IgYSBmZXcgZXh0cmEgYm9vdHAgb3B0aW9ucyBsaWtlOgotICogIC0gRmlsZSBzaXplCi0gKiAgLSBETlMKKy8qCisgKiBCT09UUCBvcHRpb25zCiAgKi8KLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sgICAoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBcCi0JCQkgICAgIENPTkZJR19CT09UUF9CT09URklMRVNJWkUgfCBcCi0JCQkgICAgIENPTkZJR19CT09UUF9ETlMpCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9ETlMKIAogLyogdW5kZWYgdGhpcyB0byBzYXZlIG1lbW9yeSAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAKQEAgLTMwMCwxNCArMzAyLDIxIEBACiAvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCiAjZGVmaW5lIENGR19QUk9NUFQgICAgICAiPT4gIgogCi0vKiBXaGF0IFUtQm9vdCBzdWJzeXRlbXMgZG8geW91IHdhbnQgZW5hYmxlZD8gKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAoKChDT05GSUdfQ01EX0RGTCAmIH4oQ0ZHX0NNRF9LR0RCKSkpIHwgXAotCQkJICAgICAgIENGR19DTURfQkVEQlVHICB8IFwKLQkJCSAgICAgICBDRkdfQ01EX0VMRiB8IFwKLQkJCSAgICAgICBDRkdfQ01EX0FTS0VOViAgfCBcCi0JCQkgICAgICAgQ0ZHX0NNRF9SRUdJTkZPIHwgXAotCQkJICAgICAgIENGR19DTURfSU1NQVAgICB8IFwKLQkJCSAgICAgICBDRkdfQ01EX01JSSkKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9CRURCVUcKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKworI3VuZGVmIENPTkZJR19DTURfS0dEQgorCiAKIC8qIFdoZXJlIGRvIHRoZSBpbnRlcm5hbCByZWdpc3RlcnMgbGl2ZT8gKi8KICNkZWZpbmUgQ0ZHX0lNTVIgICAgICAgIDB4ZjAwMDAwMDAKQEAgLTMzMSwxMyArMzQwLDEwIEBACiAjZGVmaW5lIENPTkZJR19HVzgyNjAgICAgICAgMSAgIC8qIG9uIGFuIEdXODI2MCBCb2FyZCAgKi8KICNkZWZpbmUgQ09ORklHX0NQTTIJCTEJLyogSGFzIGEgQ1BNMiAqLwogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQlNJWkUgICAgICAgIDEwMjQgICAgLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICAgICAgKi8KICNlbHNlCiAjICBkZWZpbmUgQ0ZHX0NCU0laRSAgICAgICAgMjU2ICAgICAvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgICAgICAqLwpAQCAtNDczLDcgKzQ3OSw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFICAzMiAgICAgIC8qIEZvciBNUEM4MjYwIENQVSAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQgICAgNSAgIC8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2hlcm1lcy5oIGIvaW5jbHVkZS9jb25maWdzL2hlcm1lcy5oCmluZGV4IDkxMTE3YmEuLmUzYTJlZDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9oZXJtZXMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvaGVybWVzLmgKQEAgLTY0LDIzICs2NCwyOCBAQAogCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQlDT05GSUdfQ01EX0RGTAogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCUNPTkZJR19CT09UUF9ERUZBVUxUCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE1Nyw3ICsxNjIsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvaG1pMTAwMS5oIGIvaW5jbHVkZS9jb25maWdzL2htaTEwMDEuaAppbmRleCA0ZDgxM2Q4Li42YzE1YjRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvaG1pMTAwMS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9obWkxMDAxLmgKQEAgLTM4LDExICszOCw2IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQotIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwotI2VuZGlmCi0KICNkZWZpbmUgQ09ORklHX0JPQVJEX0VBUkxZX0lOSVRfUgogCiAvKgpAQCAtNTUsMjIgKzUwLDMxIEBACiAvKiBQYXJ0aXRpb25zICovCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKLS8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKLSAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESVNQTEFZCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RJU1BMQVkKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKICNkZWZpbmUJQ09ORklHX1RJTUVTVEFNUAkxCS8qIFByaW50IGltYWdlIGluZm8gd2l0aCB0aW1lc3RhbXAgKi8KIApAQCAtMjIyLDcgKzIyNiw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJICAgICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCkBAIC0yMzEsNiArMjM1LDExIEBACiAjZGVmaW5lIENGR19NQVhBUkdTCQkxNgkvKiBtYXggbnVtYmVyIG9mIGNvbW1hbmQgYXJncwkqLwogI2RlZmluZSBDRkdfQkFSR1NJWkUJCUNGR19DQlNJWkUJLyogQm9vdCBBcmd1bWVudCBCdWZmZXIgU2l6ZQkqLwogCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzCQkJKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KKyNlbmRpZgorCiAvKiBFbmFibGUgYW4gYWx0ZXJuYXRlLCBtb3JlIGV4dGVuc2l2ZSBtZW1vcnkgdGVzdCAqLwogI2RlZmluZSBDRkdfQUxUX01FTVRFU1QKIApAQCAtMjQyLDggKzI1MSw3IEBACiAjZGVmaW5lIENGR19IWgkJCTEwMDAJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcyAqLwogCiAvKgotICogRW5hYmxlIGxvb3B3IGNvbW1hbmRvLiBUaGlzIGhhcyBvbmx5IGFmZmVjdCwgaWYgQ0ZHX0NNRF9NRU0gaXMgZGVmaW5lZCwKLSAqIHdoaWNoIGlzIG5vcm1hbGx5IHBhcnQgb2YgdGhlIGRlZmF1bHQgY29tbWFuZHMgKENGVl9DTURfREZMKQorICogRW5hYmxlIGxvb3B3IGNvbW1hbmQuCiAgKi8KICNkZWZpbmUgQ09ORklHX0xPT1BXCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9oeW1vZC5oIGIvaW5jbHVkZS9jb25maWdzL2h5bW9kLmgKaW5kZXggOGNhZDk4ZC4uMmY2NGVjMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2h5bW9kLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2h5bW9kLmgKQEAgLTY5LDggKzY5LDcgQEAKICAqIGZvciBGQ0MpCiAgKgogICogaWYgQ09ORklHX0VUSEVSX05PTkUgaXMgZGVmaW5lZCwgdGhlbiBlaXRoZXIgdGhlIGV0aGVybmV0IHJvdXRpbmVzIG11c3QgYmUKLSAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDRkdfQ01EX05FVCBtdXN0IGJlIHJlbW92ZWQKLSAqIGZyb20gQ09ORklHX0NPTU1BTkRTIHRvIHJlbW92ZSBzdXBwb3J0IGZvciBuZXR3b3JraW5nLgorICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUIG11c3QgYmUgdW5zZXQuCiAgKi8KICN1bmRlZglDT05GSUdfRVRIRVJfT05fU0NDCQkvKiBkZWZpbmUgaWYgZXRoZXIgb24gU0NDCSovCiAjZGVmaW5lCUNPTkZJR19FVEhFUl9PTl9GQ0MJCS8qIGRlZmluZSBpZiBldGhlciBvbiBGQ0MJKi8KQEAgLTE3NCwzMiArMTczLDQ0IEBACiAKICNkZWZpbmUgQ09ORklHX0xBU1RfU1RBR0VfSU5JVAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENGR19DTURfQUxMICYgfiggXAotCQkJCQlDRkdfQ01EX0JFREJVRwl8IFwKLQkJCQkJQ0ZHX0NNRF9CTVAJfCBcCi0JCQkJCUNGR19DTURfRElTUExBWQl8IFwKLQkJCQkJQ0ZHX0NNRF9ET0MJfCBcCi0JCQkJCUNGR19DTURfRVhUMgl8IFwKLQkJCQkJQ0ZHX0NNRF9GREMJfCBcCi0JCQkJCUNGR19DTURfRkRPUwl8IFwKLQkJCQkJQ0ZHX0NNRF9GUEdBICAgIHwgXAotCQkJCQlDRkdfQ01EX0hXRkxPVwl8IFwKLQkJCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJCUNGR19DTURfSkZGUzIJfCBcCi0JCQkJCUNGR19DTURfTkFORAl8IFwKLQkJCQkJQ0ZHX0NNRF9NTUMJfCBcCi0JCQkJCUNGR19DTURfUENNQ0lBCXwgXAotCQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQkJQ0ZHX0NNRF9VU0IJfCBcCi0JCQkJCUNGR19DTURfUkVJU0VSCXwgXAotCQkJCQlDRkdfQ01EX1NDU0kJfCBcCi0JCQkJCUNGR19DTURfU1BJCXwgXAotCQkJCQlDRkdfQ01EX1VOSVZFUlNFfCBcCi0JCQkJCUNGR19DTURfVkZECXwgXAotCQkJCQlDRkdfQ01EX1hJTUcJKSApCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfYWxsLmg+CisKKyN1bmRlZiBDT05GSUdfQ01EX0JFREJVRworI3VuZGVmIENPTkZJR19DTURfQk1QCisjdW5kZWYgQ09ORklHX0NNRF9ESVNQTEFZCisjdW5kZWYgQ09ORklHX0NNRF9ET0MKKyN1bmRlZiBDT05GSUdfQ01EX0VYVDIKKyN1bmRlZiBDT05GSUdfQ01EX0ZEQworI3VuZGVmIENPTkZJR19DTURfRkRPUworI3VuZGVmIENPTkZJR19DTURfRlBHQQorI3VuZGVmIENPTkZJR19DTURfSFdGTE9XCisjdW5kZWYgQ09ORklHX0NNRF9JREUKKyN1bmRlZiBDT05GSUdfQ01EX0pGRlMyCisjdW5kZWYgQ09ORklHX0NNRF9OQU5ECisjdW5kZWYgQ09ORklHX0NNRF9NRlNMCisjdW5kZWYgQ09ORklHX0NNRF9NTUMKKyN1bmRlZiBDT05GSUdfQ01EX1BDTUNJQQorI3VuZGVmIENPTkZJR19DTURfUENJCisjdW5kZWYgQ09ORklHX0NNRF9VU0IKKyN1bmRlZiBDT05GSUdfQ01EX1JFSVNFUgorI3VuZGVmIENPTkZJR19DTURfU0NTSQorI3VuZGVmIENPTkZJR19DTURfU1BJCisjdW5kZWYgQ09ORklHX0NNRF9VTklWRVJTRQorI3VuZGVmIENPTkZJR19DTURfVkZECisjdW5kZWYgQ09ORklHX0NNRF9YSU1HCisKIAogI2lmZGVmIERFQlVHCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJLTEJLyogYXV0b2Jvb3QgZGlzYWJsZWQJCSovCkBAIC0yMTgsNyArMjI5LDcgQEAKICNkZWZpbmUgREVCVUdfQk9PVEtFWVMJCTAKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICN1bmRlZglDT05GSUdfS0dEQl9PTl9TTUMJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIFNNQyAqLwogI2RlZmluZQlDT05GSUdfS0dEQl9PTl9TQ0MJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIFNDQyAqLwogI3VuZGVmCUNPTkZJR19LR0RCX05PTkUJCS8qIGRlZmluZSBpZiBrZ2RiIG9uIHNvbWV0aGluZyBlbHNlICovCkBAIC0yNDcsNyArMjU4LDcgQEAKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtNDAwLDcgKzQxMSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM4MjYwIENQVQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9pZG1yLmggYi9pbmNsdWRlL2NvbmZpZ3MvaWRtci5oCmluZGV4IGIxZGJlMmMuLjFhYjdiMjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9pZG1yLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2lkbXIuaApAQCAtNzgsMTggKzc4LDI3IEBACiAJInUtYm9vdD0vdGZ0cGJvb3QvaWRtci91LWJvb3QuYmluXDAiCQkJCVwKIAkiIgogCi0vKgotICogQ29tbWFuZHMnIGRlZmluaXRpb24KLSAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSgoQ09ORklHX0NNRF9ERkwJCXwgXAotCQkJCQlDRkdfQ01EX1BJTkcJCXwgXAotCQkJCQlDRkdfQ01EX0pGRlMyCQl8IFwKLQkJCQkJQ0ZHX0NNRF9ORVQpCQkmIFwKLQkJCQkJfihDRkdfQ01EX0xPQURTCQl8IFwKLQkJCQkJCUNGR19DTURfTE9BREIpKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjdW5kZWYgQ09ORklHX0NNRF9MT0FEQgogCiAKIC8qCkBAIC0xMTUsMTEgKzEyNCwxMSBAQAogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCi0jZWxzZSAvKiAhKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikgKi8KKyNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KLSNlbmRpZiAvKiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKSAqLworI2VuZGlmCiAKICNkZWZpbmUgQ0ZHX1BCU0laRSAoQ0ZHX0NCU0laRStzaXplb2YoQ0ZHX1BST01QVCkrMTYpIC8qIFByaW50IEJ1ZmZlciBTaXplICovCiAjZGVmaW5lIENGR19NQVhBUkdTCQkxNgkJLyogbWF4IG51bWJlciBvZiBjb21tYW5kIGFyZ3MgKi8KQEAgLTIwNiw4ICsyMTUsOCBAQAogCQkJCQkJIjJtKHJvb3RmcyksIglcCiAJCQkJCQkiLSh1c2VyKSI7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKICNlcnJvciBNSUkgY29tbWFuZHMgZG9uJ3Qgd29yayBvbiBpRE1SIGJvYXJkIGFuZCBzaG9sdWQgbm90IGJlIGVuYWJsZWQuCi0jZW5kaWYgLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKSAqLworI2VuZGlmCiAKICNlbmRpZiAvKiBfSURNUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvaW1wYTcuaCBiL2luY2x1ZGUvY29uZmlncy9pbXBhNy5oCmluZGV4IDhiODQxZmYuLjBlNTJmZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9pbXBhNy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9pbXBhNy5oCkBAIC02MSwxMiArNjEsMjMgQEAKIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTk2MDAKIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSyAgICAgICAoQ09ORklHX0JPT1RQX0RFRkFVTFR8Q09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX0pGRlMyKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTICAgIAkiZGV2ZnM9bW91bnQgcm9vdD1yYW1mcyBjb25zb2xlPXR0eVMwLDk2MDAiCkBAIC03Nyw3ICs4OCw3IEBACiAvKiNkZWZpbmUgQ09ORklHX0JPT1RGSUxFCSJpbXBhNyIJKi8KICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJib290cDtib290bSIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvaW5jYWlwLmggYi9pbmNsdWRlL2NvbmZpZ3MvaW5jYWlwLmgKaW5kZXggMWM2MjE2Yi4uNGNhZjU0ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2luY2FpcC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9pbmNhaXAuaApAQCAtODEsMTUgKzgxLDI5IEBACiAJIiIKICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJydW4gZmxhc2hfc2VsZiIKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9pbmthNHgwLmggYi9pbmNsdWRlL2NvbmZpZ3MvaW5rYTR4MC5oCmluZGV4IGFkM2NmMDYuLjBmYWMyOGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9pbmthNHgwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2lua2E0eDAuaApAQCAtNDAsMTEgKzQwLDYgQEAKIAogI2RlZmluZSBDT05GSUdfTUlTQ19JTklUX0YJMQkvKiBVc2UgbWlzY19pbml0X2YoKQkJCSovCiAKLSNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCi0jZW5kaWYKLQogLyoKICAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KICAqLwpAQCAtNzYsMjEgKzcxLDMwIEBACiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19JU09fUEFSVElUSU9OCiAKLS8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKLSAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FWFQyCXwgXAotCQkJCUNGR19DTURfRkFUCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfU05UUAl8IFwKLQkJCQlDRkdfQ01EX1VTQgkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRVhUMgorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKyNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKwogCiAjZGVmaW5lCUNPTkZJR19USU1FU1RBTVAJMQkvKiBQcmludCBpbWFnZSBpbmZvIHdpdGggdGltZXN0YW1wICovCiAKQEAgLTIzOSw3ICsyNDMsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtMjQ4LDYgKzI1MiwxMSBAQAogI2RlZmluZSBDRkdfTUFYQVJHUwkJMTYJLyogbWF4IG51bWJlciBvZiBjb21tYW5kIGFyZ3MJKi8KICNkZWZpbmUgQ0ZHX0JBUkdTSVpFCQlDRkdfQ0JTSVpFCS8qIEJvb3QgQXJndW1lbnQgQnVmZmVyIFNpemUJKi8KIAorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcwkJCSovCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCisjZW5kaWYKKwogLyogRW5hYmxlIGFuIGFsdGVybmF0ZSwgbW9yZSBleHRlbnNpdmUgbWVtb3J5IHRlc3QgKi8KICNkZWZpbmUgQ0ZHX0FMVF9NRU1URVNUCiAKQEAgLTI1OSw4ICsyNjgsNyBAQAogI2RlZmluZSBDRkdfSFoJCQkxMDAwCS8qIGRlY3JlbWVudGVyIGZyZXE6IDEgbXMgdGlja3MgKi8KIAogLyoKLSAqIEVuYWJsZSBsb29wdyBjb21tYW5kby4gVGhpcyBoYXMgb25seSBhZmZlY3QsIGlmIENGR19DTURfTUVNIGlzIGRlZmluZWQsCi0gKiB3aGljaCBpcyBub3JtYWxseSBwYXJ0IG9mIHRoZSBkZWZhdWx0IGNvbW1hbmRzIChDRlZfQ01EX0RGTCkKKyAqIEVuYWJsZSBsb29wdyBjb21tYW5kLgogICovCiAjZGVmaW5lIENPTkZJR19MT09QVwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvaW5ub2tvbS5oIGIvaW5jbHVkZS9jb25maWdzL2lubm9rb20uaAppbmRleCAzY2I5ZWJjLi41MzEwZTBkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvaW5ub2tvbS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9pbm5va29tLmgKQEAgLTU0LDEwICs1NCwzNCBAQAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTE5MjAwCiAjZGVmaW5lIENPTkZJR19NSVNDX0lOSVRfUgkxCS8qIHdlIGhhdmUgYSBtaXNjX2luaXRfcigpIGZ1bmN0aW9uICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTIChDRkdfQ01EX0JESXxDRkdfQ01EX0xPQURCfENGR19DTURfSU1JfENGR19DTURfRkxBU0h8Q0ZHX0NNRF9NRU1PUll8Q0ZHX0NNRF9ORVR8Q0ZHX0NNRF9FTlZ8Q0ZHX0NNRF9SVU58Q0ZHX0NNRF9BU0tFTlZ8Q0ZHX0NNRF9FQ0hPfENGR19DTURfSTJDfENGR19DTURfREhDUHxDRkdfQ01EX0NBQ0hFKQotLyogQ09ORklHX0NNRF9ERkx8Q0ZHX0NNRF9JMkN8Q0ZHX0NNRF9FRVBST018Q0ZHX0NNRF9ORVR8Q0ZHX0NNRF9KRkZTMnxDRkdfQ01EX0RIQ1ApICovCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICAgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0JESQorI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VDSE8KKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lNSQorI2RlZmluZSBDT05GSUdfQ01EX0xPQURCCisjZGVmaW5lIENPTkZJR19DTURfTUVNT1JZCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfUlVOCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKIC8qICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTCSJyb290PS9kZXYvbmZzIGlwPWJvb3RwIGNvbnNvbGU9dHR5UzAsMTkyMDAiICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvaW50ZWdyYXRvcmFwLmggYi9pbmNsdWRlL2NvbmZpZ3MvaW50ZWdyYXRvcmFwLmgKaW5kZXggMmY2ZTM5OS4uMTQ1MmJmMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2ludGVncmF0b3JhcC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9pbnRlZ3JhdG9yYXAuaApAQCAtNjYsMTUgKzY2LDI2IEBACiAjZGVmaW5lIENGR19TRVJJQUwwCQkweDE2MDAwMDAwCiAjZGVmaW5lIENGR19TRVJJQUwxCQkweDE3MDAwMDAwCiAKLS8qI2RlZmluZSBDT05GSUdfQ09NTUFORFMJKENGR19DTURfREhDUCB8IENGR19DTURfSU1JIHwgQ0ZHX0NNRF9ORVQgfCBDRkdfQ01EX1BJTkcgfCBDRkdfQ01EX0JESSB8IENGR19DTURfUENJKSAqLwogLyojZGVmaW5lIENPTkZJR19ORVRfTVVMVEkgKi8KLS8qI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkgIENPTkZJR19CT09UUF9ERUZBVUxUICovCi0KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTIChDRkdfQ01EX0lNSSB8IENGR19DTURfQkRJIHwgQ0ZHX0NNRF9NRU1PUlkpCiAKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKworI2RlZmluZSBDT05GSUdfQ01EX0lNSQorI2RlZmluZSBDT05GSUdfQ01EX0JESQorI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkyCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJInJvb3Q9L2Rldi9tdGRibG9jazAgbWVtPTMyTSBjb25zb2xlPXR0eUFNMCBjb25zb2xlPXR0eSIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9pbnRlZ3JhdG9yY3AuaCBiL2luY2x1ZGUvY29uZmlncy9pbnRlZ3JhdG9yY3AuaAppbmRleCA0MTg5ZjljLi42OTMxMGQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvaW50ZWdyYXRvcmNwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2ludGVncmF0b3JjcC5oCkBAIC03MCwxNyArNzAsMjggQEAKICNkZWZpbmUgQ0ZHX1NFUklBTDAJCTB4MTYwMDAwMDAKICNkZWZpbmUgQ0ZHX1NFUklBTDEJCTB4MTcwMDAwMDAKIAorCiAvKgotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDRkdfQ01EX0RGTCB8IENGR19DTURfUENJKQotKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ0ZHX0NNRF9ESENQIHwgQ0ZHX0NNRF9JTUkgfCBDRkdfQ01EX05FVCB8IENGR19DTURfUElORyB8IFwKLQkJCQkgQ0ZHX0NNRF9CREkgfCBDRkdfQ01EX01FTU9SWSB8IENGR19DTURfRkxBU0ggfCBDRkdfQ01EX0VOViBcCi0JCQkJKQorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiAjZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCUNPTkZJR19CT09UUF9ERUZBVUxUICovCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2RlZmluZSBDT05GSUdfQ01EX0JESQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX0lNSQorI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKwogCiAjaWYgMAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9peGRwNDI1LmggYi9pbmNsdWRlL2NvbmZpZ3MvaXhkcDQyNS5oCmluZGV4IDlmOWZkYjIuLmJjNWY5ZTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9peGRwNDI1LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2l4ZHA0MjUuaApAQCAtNTMsMTQgKzUzLDI4IEBACiAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFICAgICAgICAgMTE1MjAwCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgICAgKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9FTEYgfCBDRkdfQ01EX1BDSSkKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorCiAKICNkZWZpbmUgQ09ORklHX1BDSQogI2RlZmluZSBDT05GSUdfTkVUX01VTFRJCiAjZGVmaW5lIENPTkZJR19FRVBSTzEwMAotLyogVGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotLyogVGhlc2UgYXJlIHUtYm9vdCBnZW5lcmljIHBhcmFtZXRlcnMgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZICAgICAgICAzCiAvKiNkZWZpbmUgQ09ORklHX0VUSEFERFIgICAgICAgICAgMDg6MDA6M2U6MjY6MGE6NWIqLwpAQCAtNzEsNyArODUsNyBAQAogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MgICAgICAgICAicm9vdD0vZGV2L210ZGJsb2NrMiByb290ZnN0eXBlPWNyYW1mcyBjb25zb2xlPXR0eVMwLDExNTIwMCIKICNkZWZpbmUgQ09ORklHX0NNRExJTkVfVEFHCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURSAgICAyMzA0MDAgICAgICAgICAgLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYICAgMiAgICAgICAgICAgICAgIC8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvaXhkcGc0MjUuaCBiL2luY2x1ZGUvY29uZmlncy9peGRwZzQyNS5oCmluZGV4IGFmNGVjZjYuLmRhNTkyMzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9peGRwZzQyNS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9peGRwZzQyNS5oCkBAIC03NSwxNiArNzUsMjcgQEAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFICAgICAgICAgMTE1MjAwCiAjZGVmaW5lIENGR19JWFA0MjVfQ09OU09MRQlJWFA0MjVfVUFSVDEgICAvKiB3ZSB1c2UgVUFSVDEgZm9yIGNvbnNvbGUgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HKQogCi0vKiBUaGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0vKiBUaGVzZSBhcmUgdS1ib290IGdlbmVyaWMgcGFyYW1ldGVycyAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisKIAogI2RlZmluZSBDT05GSUdfWkVST19CT09UREVMQVlfQ0hFQ0sJLyogY2hlY2sgZm9yIGtleXByZXNzIG9uIGJvb3RkZWxheT09MCAqLwogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUJLyogYXV0b2Jvb3QgYWZ0ZXIgNSBzZWNvbmRzCSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvanVwaXRlci5oIGIvaW5jbHVkZS9jb25maWdzL2p1cGl0ZXIuaAppbmRleCA1Yjk3NTI2Li5iNjhjNWFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvanVwaXRlci5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9qdXBpdGVyLmgKQEAgLTQxLDExICs0MSw2IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290CSAgICAgKi8KIAotI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCi0jZW5kaWYKLQogLyoKICAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KICAqLwpAQCAtNzEsNyArNjYsNiBAQAogI2RlZmluZSBDT05GSUdfUENJX0lPX0JVUwkweDUwMDAwMDAwCiAjZGVmaW5lIENPTkZJR19QQ0lfSU9fUEhZUwlDT05GSUdfUENJX0lPX0JVUwogI2RlZmluZSBDT05GSUdfUENJX0lPX1NJWkUJMHgwMTAwMDAwMAotI2RlZmluZSBBRERfUENJX0NNRCAJCUNGR19DTURfUENJCiAjZW5kaWYKIAogI2RlZmluZSBDRkdfWExCX1BJUEVMSU5JTkcJMQpAQCAtODcsMTUgKzgxLDI4IEBACiAKICNkZWZpbmUJQ09ORklHX1RJTUVTVEFNUAkJLyogUHJpbnQgaW1hZ2UgaW5mbyB3aXRoIHRpbWVzdGFtcCAqLwogCi0vKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCi0gKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorI2RlZmluZSBDT0RGSUdfQ01EX1BDSQorI2VuZGlmCisKIAogLyoKICAqIEF1dG9ib290aW5nCkBAIC0yNTQsNyArMjYxLDcgQEAKICNpZmRlZglDRkdfSFVTSF9QQVJTRVIKICNkZWZpbmUJQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtMjcxLDYgKzI3OCwxMSBAQAogCiAjZGVmaW5lIENGR19IWgkJCTEwMDAJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcyAqLwogCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCisjZW5kaWYKKwogLyoKICAqIFZhcmlvdXMgbG93LWxldmVsIHNldHRpbmdzCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9rYXRtYWkuaCBiL2luY2x1ZGUvY29uZmlncy9rYXRtYWkuaAppbmRleCBjYzQ3YTE2Li4xMTBhZDQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mva2F0bWFpLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2thdG1haS5oCkBAIC0yMTAsMjggKzIxMCw0MCBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLwogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UJKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRElBRwl8IFwKLQkJCQlDRkdfQ01EX0RUVAl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0VYVDIJfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTwl8IFwKLQkJCQlDRkdfQ01EX1NEUkFNKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfRFRUCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfRVhUMgorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KKwogCiAjZGVmaW5lCUNPTkZJR19JQk1fRU1BQzRfVjQJMQkvKiA0NDBTUGUgaGFzIHRoaXMgRU1BQyB2ZXJzaW9uCSovCiAjZGVmaW5lIENPTkZJR19NSUkJCTEJLyogTUlJIFBIWSBtYW5hZ2VtZW50CQkqLwpAQCAtMjU0LDcgKzI2Niw3IEBACiAjZGVmaW5lIENGR19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zMTQsNyArMzI2LDYgQEAKICN1bmRlZiBDT05GSUdfUENJX0NPTkZJR19IT1NUX0JSSURHRQogCiAvKiBCb2FyZC1zcGVjaWZpYyBQQ0kgKi8KLSNkZWZpbmUgQ0ZHX1BDSV9QUkVfSU5JVAkxCS8qIGVuYWJsZSBib2FyZCBwY2lfcHJlX2luaXQoKQkqLwogI2RlZmluZSBDRkdfUENJX1RBUkdFVF9JTklUCQkvKiBsZXQgYm9hcmQgaW5pdCBwY2kgdGFyZ2V0ICAgICovCiAjdW5kZWYJQ0ZHX1BDSV9NQVNURVJfSU5JVAogCkBAIC00MjEsNyArNDMyLDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTgxOTIJLyogRm9yIEFNQ0MgNDA1IENQVXMJCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCkBAIC00MzMsNyArNDQ0LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mva2I5MjAyLmggYi9pbmNsdWRlL2NvbmZpZ3Mva2I5MjAyLmgKaW5kZXggNjU5MGY2Zi4uNzVkOWMzYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2tiOTIwMi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9rYjkyMDIuaApAQCAtNzgsMTcgKzc4LDI5IEBACiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwogI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQkxCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQlcCi0JCSAgICAgICAoKENPTkZJR19DTURfREZMIHwgXAotCQkgICAgICAgIENGR19DTURfSTJDIHwgXAotCQkJQ0ZHX0NNRF9QSU5HIHwgXAotCQkJQ0ZHX0NNRF9ESENQICkgJiBcCi0JCSAgICAgIH4oQ0ZHX0NNRF9CREkgfCBcCi0JCQlDRkdfQ01EX0ZQR0EgfCBcCi0JCQlDRkdfQ01EX01JU0MpKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKworI3VuZGVmIENPTkZJR19DTURfQkRJCisjdW5kZWYgQ09ORklHX0NNRF9GUEdBCisjdW5kZWYgQ09ORklHX0NNRF9NSVNDCisKIAogI2RlZmluZSBDT05GSUdfTlJfRFJBTV9CQU5LUyAxCiAjZGVmaW5lIFBIWVNfU0RSQU0gMHgyMDAwMDAwMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2t2bWUwODAuaCBiL2luY2x1ZGUvY29uZmlncy9rdm1lMDgwLmgKaW5kZXggNjFjZjcwNS4uNTY5ODAwYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2t2bWUwODAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mva3ZtZTA4MC5oCkBAIC02MCwzMyArNjAsNDUgQEAKIAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAogI2RlZmluZSBDT05GSUdfUlRDX0RTMTY0eAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQkgIENGR19DTURfQVNLRU5WCXwgXAotCQkJCSAgQ0ZHX0NNRF9DQUNIRQkJfCBcCi0JCQkJICBDRkdfQ01EX0RBVEUJCXwgXAotCQkJCSAgQ0ZHX0NNRF9ESENQCQl8IFwKLQkJCQkgIENGR19DTURfRElBRwkJfCBcCi0JCQkJICBDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQkgIENGR19DTURfRUxGCQl8IFwKLQkJCQkgIENGR19DTURfSTJDCQl8IFwKLQkJCQkgIENGR19DTURfSkZGUzIJCXwgXAotCQkJCSAgQ0ZHX0NNRF9ORlMJCXwgXAotCQkJCSAgQ0ZHX0NNRF9QQ0kJCXwgXAotCQkJCSAgQ0ZHX0NNRF9QSU5HCQl8IFwKLQkJCQkgIENGR19DTURfU0RSQU0JCXwgXAotCQkJCSAgQ0ZHX0NNRF9TTlRQKQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogI2RlZmluZSBDT05GSUdfTkVUQ09OU09MRQogCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgpAQCAtMTc4LDcgKzE5MCw3IEBACiAjZGVmaW5lIENPTkZJR19TWVNfQ0xLX0ZSRVEJMzMzMzMzMzMKIAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvbGFydC5oIGIvaW5jbHVkZS9jb25maWdzL2xhcnQuaAppbmRleCBhMDA2NDBiLi44ZjE4YzlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvbGFydC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9sYXJ0LmgKQEAgLTU5LDEwICs1OSwyMSBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJOTYwMAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUyAgICAJInJvb3Q9cmFtZnMgZGV2ZnM9bW91bnQgY29uc29sZT10dHlTQTAsOTYwMCIKQEAgLTczLDcgKzg0LDcgQEAKICNkZWZpbmUgQ09ORklHX0JPT1RGSUxFCQkiZWxpbm9zLWxhcnQiCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkidGZ0cDsgYm9vdG0iCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2xvZ29kbC5oIGIvaW5jbHVkZS9jb25maWdzL2xvZ29kbC5oCmluZGV4IDcxNWVkNzQuLjJiMmQzNzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9sb2dvZGwuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvbG9nb2RsLmgKQEAgLTU0LDEwICs1NCwyNiBAQAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTE5MjAwCiAjdW5kZWYgQ09ORklHX01JU0NfSU5JVF9SCQkvKiBGSVhNRTogbWlzY19pbml0X3IoKSBtaXNzaW5nICAgICAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAoQ0ZHX0NNRF9GTEFTSHxDRkdfQ01EX01FTU9SWXxDRkdfQ01EX0VOVnxDRkdfQ01EX1JVTnxDRkdfQ01EX0FTS0VOVnxDRkdfQ01EX0VDSE8pCi0vKiBDT05GSUdfQ01EX0RGTHxDRkdfQ01EX0kyQ3xDRkdfQ01EX0VFUFJPTXxDRkdfQ01EX05FVHxDRkdfQ01EX0pGRlMyfENGR19DTURfREhDUCkgKi8KLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgICAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0VDSE8KKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX1JVTgorCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCiAvKiAjZGVmaW5lIENPTkZJR19CT09UQVJHUwkicm9vdD0vZGV2L25mcyBpcD1ib290cCBjb25zb2xlPXR0eVMwLDE5MjAwIiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2xwYzIyOTJzb2RpbW0uaCBiL2luY2x1ZGUvY29uZmlncy9scGMyMjkyc29kaW1tLmgKaW5kZXggN2U1MTUyMy4uZTNmZWY1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2xwYzIyOTJzb2RpbW0uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvbHBjMjI5MnNvZGltbS5oCkBAIC0xLDEyICsxLDggQEAKIC8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDAKLSAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgotICogTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPgorICogKEMpIENvcHlyaWdodCAyMDA3CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgogICoKLSAqIENvbmZpZ3VhdGlvbiBzZXR0aW5ncyBmb3IgdGhlIEVQNzMxMiBib2FyZC4KLSAqCi0gKiBNb2RpZmllZCB0byB3b3JrIG9uIEFybWFkaWxsbyBIVDEwNzAgQVJNNzIwVCBib2FyZAotICogKEMpIENvcHlyaWdodCAyMDA1IFJvd2VsIEF0aWVuemEgcm93ZWxAZGl3YWxhYnMuY29tCisgKiBDb25maWd1YXRpb24gc2V0dGluZ3MgZm9yIHRoZSBMUEMyMjkyU09ESU1NIGJvYXJkIGZyb20gRW1iZWRkZWQgQXJ0aXN0cy4KICAqCiAgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogICogcHJvamVjdC4KQEAgLTMxLDcgKzI3LDcgQEAKICNkZWZpbmUgX19DT05GSUdfSAogCiAvKgotICogSWYgd2UgYXJlIGRldmVsb3BpbmcsIHdlIG1pZ2h0IHdhbnQgdG8gc3RhcnQgYXJtYm9vdCBmcm9tIHJhbQorICogSWYgd2UgYXJlIGRldmVsb3BpbmcsIHdlIG1pZ2h0IHdhbnQgdG8gc3RhcnQgdS1ib290IGZyb20gcmFtCiAgKiBzbyB3ZSBNVVNUIE5PVCBpbml0aWFsaXplIGNyaXRpY2FsIHJlZ3MgbGlrZSBtZW0tdGltaW5nIC4uLgogICovCiAjdW5kZWYgQ09ORklHX0lOSVRfQ1JJVElDQUwJCS8qIHVuZGVmIGZvciBkZXZlbG9waW5nICovCkBAIC00Niw3ICs0Miw3IEBACiAjZGVmaW5lIENPTkZJR19BUk03CQkxCS8qIFRoaXMgaXMgYSBBUk03IENQVQkqLwogI2RlZmluZSBDT05GSUdfQVJNX1RIVU1CCTEJLyogdGhpcyBpcyBhbiBBUk03MjBURE1JICovCiAjZGVmaW5lIENPTkZJR19MUEMyMjkyCi0jdW5kZWYgIENPTkZJR19BUk03X1JFVkQJIAkvKiBkaXNhYmxlIEFSTTcyMCBSRVYuRCBXb3JrYXJvdW5kcyAqLworI3VuZGVmCUNPTkZJR19BUk03X1JFVkQJCS8qIGRpc2FibGUgQVJNNzIwIFJFVi5EIFdvcmthcm91bmRzICovCiAKICN1bmRlZiBDT05GSUdfVVNFX0lSUQkJCS8qIGRvbid0IG5lZWQgdGhlbSBhbnltb3JlICovCiAKQEAgLTcwLDI0ICs2NiwzMSBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sgICAgICAgKENPTkZJR19CT09UUF9ERUZBVUxUfENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKIC8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgogICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0ZBVAl8IFwKLQkJCQlDRkdfQ01EX01NQwl8IFwKLQkJCQlDRkdfQ01EX05FVAl8IFwKLQkJCQlDRkdfQ01EX1BJTkcpCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfTU1DCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfUElORworCiAKICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJNQogCiAvKgpAQCAtMTAzLDExICsxMDYsMTIgQEAKICNkZWZpbmUgQ0ZHX01FTVRFU1RfU1RBUlQJMHg0MDAwMDAwMAkvKiBtZW10ZXN0IHdvcmtzIG9uCSovCiAjZGVmaW5lIENGR19NRU1URVNUX0VORAkJMHg0MDAwMDAwMAkvKiA0IC4uLiA4IE1CIGluIERSQU0JKi8KIAotI3VuZGVmICBDRkdfQ0xLU19JTl9IWgkJLyogZXZlcnl0aGluZywgaW5jbCBib2FyZCBpbmZvLCBpbiBIeiAqLworI3VuZGVmCUNGR19DTEtTX0lOX0haCQkvKiBldmVyeXRoaW5nLCBpbmNsIGJvYXJkIGluZm8sIGluIEh6ICovCiAKLSNkZWZpbmUJQ0ZHX0xPQURfQUREUgkJMHgwMDA0MDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcwlmb3IgYXJtYWRpbGxvOiBrZXJuZWwgaW1nIGlzIGhlcmUqLworI2RlZmluZQlDRkdfTE9BRF9BRERSCQkweDAwMDQwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzCWZvcgkqLworCQkJCQkJLyogYXJtYWRpbGxvOiBrZXJuZWwgaW1nIGlzIGhlcmUqLwogCi0jZGVmaW5lIENGR19TWVNfQ0xLX0ZSRVEgICAgICAgIDU4OTgyNDAwICAgICAgICAvKiBIeiAqLworI2RlZmluZSBDRkdfU1lTX0NMS19GUkVRCTU4OTgyNDAwCS8qIEh6ICovCiAjZGVmaW5lCUNGR19IWgkJCTIwNDgJCS8qIGRlY3JlbWVudGVyIGZyZXEgaW4gSHogKi8KIAogCQkJCQkJLyogdmFsaWQgYmF1ZHJhdGVzICovCkBAIC0xNTQsNSArMTU4LDcgQEAKICNkZWZpbmUgQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTCiAjZGVmaW5lIENPTkZJR19JTklUUkRfVEFHCiAjZGVmaW5lIENPTkZJR19NTUMgMQorLyogd2UgdXNlIHRoaXMgZXRoZXJuZXQgY2hpcCAqLworI2RlZmluZSBDT05GSUdfRU5DMjhKNjAKIAogI2VuZGlmCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9scGQ3YTQwMC5oIGIvaW5jbHVkZS9jb25maWdzL2xwZDdhNDAwLmgKaW5kZXggZDdkMDQ2MC4uMDQxNDg4OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2xwZDdhNDAwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL2xwZDdhNDAwLmgKQEAgLTU1LDE5ICs1NSwzMiBAQAogCiAjZGVmaW5lCUNPTkZJR19USU1FU1RBTVAJMQkvKiBQcmludCB0aW1lc3RhbXAgaW5mbyBmb3IgaW1hZ2VzICovCiAKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKwogI2lmbmRlZiBVU0VfOTIwVF9NTVUKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICgoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BJTkcpICYgfihDRkdfQ01EX0NBQ0hFKSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUElORworICAgICN1bmRlZiBDT05GSUdfQ01EX0NBQ0hFCiAjZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9EQVRFKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCiAjZW5kaWYKIAogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxMTUyMDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAvKiB3aGF0J3MgdGhpcyA/IGl0J3Mgbm90IHVzZWQgYW55d2hlcmUgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTEJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2xwZDdhNDA0LmggYi9pbmNsdWRlL2NvbmZpZ3MvbHBkN2E0MDQuaAppbmRleCA0MDAyZTY4Li4xMWVkZTk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvbHBkN2E0MDQuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvbHBkN2E0MDQuaApAQCAtNTUsMTkgKzU1LDMyIEBACiAKICNkZWZpbmUJQ09ORklHX1RJTUVTVEFNUAkxCS8qIFByaW50IHRpbWVzdGFtcCBpbmZvIGZvciBpbWFnZXMgKi8KIAorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCiAjaWZuZGVmIFVTRV85MjBUX01NVQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgKChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUElORykgJiB+KENGR19DTURfQ0FDSEUpKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9QSU5HKQorICAgICN1bmRlZiBDT05GSUdfQ01EX0NBQ0hFCiAjZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9EQVRFKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCiAjZW5kaWYKIAogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxMTUyMDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAvKiB3aGF0J3MgdGhpcyA/IGl0J3Mgbm90IHVzZWQgYW55d2hlcmUgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTEJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2x1YW4uaCBiL2luY2x1ZGUvY29uZmlncy9sdWFuLmgKaW5kZXggMDQ1YTE0NC4uNzJhYWUwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2x1YW4uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvbHVhbi5oCkBAIC0yMTMsMzEgKzIxMyw0MiBAQAogI2RlZmluZSBDT05GSUdfSFdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyAqLwogI2VuZGlmCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJCXwJXAotCQkJCUNGR19DTURfQVNLRU5WCQl8CVwKLQkJCQlDRkdfQ01EX0RIQ1AJCXwJXAotCQkJCUNGR19DTURfRUxGCQl8CVwKLQkJCQlDRkdfQ01EX0VFUFJPTQkJfAlcCi0JCQkJQ0ZHX0NNRF9JMkMJCXwJXAotCQkJCUNGR19DTURfSVJRCQl8CVwKLQkJCQlDRkdfQ01EX01JSQkJfAlcCi0JCQkJQ0ZHX0NNRF9ORVQJCXwJXAotCQkJCUNGR19DTURfTkZTCQl8CVwKLQkJCQlDRkdfQ01EX1BDSQkJfAlcCi0JCQkJQ0ZHX0NNRF9QSU5HCQl8CVwKLQkJCQlDRkdfQ01EX1JFR0lORk8JCXwJXAotCQkJCUNGR19DTURfU0RSQU0JCXwJXAotCQkJCTApCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJICAgICAgICAiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkgICAgICAgIDEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJICAgICAgICAyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI2NSw3ICsyNzYsNyBAQAogICogUENJIHN0dWZmCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ0kpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDSSkKIAogLyogR2VuZXJhbCBQQ0kgKi8KICNkZWZpbmUgQ09ORklHX1BDSQkJCS8qIGluY2x1ZGUgcGNpIHN1cHBvcnQJICAgICAgICAqLwpAQCAtMjczLDE0ICsyODQsMTMgQEAKICNkZWZpbmUgQ09ORklHX1BDSV9TQ0FOX1NIT1cgICAgICAgICAgICAvKiBzaG93IHBjaSBkZXZpY2VzIG9uIHN0YXJ0dXAgICovCiAKIC8qIEJvYXJkLXNwZWNpZmljIFBDSSAqLwotI2RlZmluZSBDRkdfUENJX1BSRV9JTklUICAgICAgICAgICAgICAgIC8qIGVuYWJsZSBib2FyZCBwY2lfcHJlX2luaXQoKSAgKi8KICNkZWZpbmUgQ0ZHX1BDSV9UQVJHRVRfSU5JVAogI3VuZGVmICBDRkdfUENJX01BU1RFUl9JTklUCiAKICNkZWZpbmUgQ0ZHX1BDSV9TVUJTWVNfVkVORE9SSUQgMHgxMGU4CS8qIEFNQ0MgKi8KICNkZWZpbmUgQ0ZHX1BDSV9TVUJTWVNfREVWSUNFSUQgMHg0NDAzCS8qIHdoYXRldmVyICovCiAKLSNlbmRpZiAvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDSSAqLworI2VuZGlmCiAKIC8qCiAgKiBGb3IgYm9vdGluZyBMaW51eCwgdGhlIGJvYXJkIGluZm8gYW5kIGNvbW1hbmQgbGluZSBkYXRhCkBAIC0yOTQsNyArMzA0LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCSgzMjw8MTApIC8qIEZvciBBTUNDIDQ0MCBDUFVzCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtMzA2LDcgKzMxNiw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvbHViYm9jay5oIGIvaW5jbHVkZS9jb25maWdzL2x1YmJvY2suaAppbmRleCBhZDEwMzViLi40YWRmMjU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvbHViYm9jay5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9sdWJib2NrLmgKQEAgLTY3LDEwICs2NywyNCBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX01NQyB8IENGR19DTURfRkFUKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfTU1DCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKICNkZWZpbmUgQ09ORklHX0VUSEFERFIJCTA4OjAwOjNlOjI2OjBhOjViCkBAIC04Miw3ICs5Niw3IEBACiAjZGVmaW5lIENPTkZJR19DTURMSU5FX1RBRwogI2RlZmluZSBDT05GSUdfVElNRVNUQU1QCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2x3bW9uLmggYi9pbmNsdWRlL2NvbmZpZ3MvbHdtb24uaAppbmRleCA5YjRjMDA0Li44YTgyNzAyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvbHdtb24uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvbHdtb24uaApAQCAtMTcwLDM0ICsxNzAsNDEgQEAKIAogI2RlZmluZSBDT05GSUdfUlRDX1BDRjg1NjMJCS8qIHVzZSBQaGlsaXBzIFBDRjg1NjMgUlRDCSovCiAKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9CTVAKKyNkZWZpbmUgQ09ORklHX0NNRF9CU1AKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKwogI2lmZGVmIENPTkZJR19QT1NUCi0jZGVmaW5lIENGR19DTURfUE9TVF9ESUFHIENGR19DTURfRElBRwotI2Vsc2UKLSNkZWZpbmUgQ0ZHX0NNRF9QT1NUX0RJQUcgMAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKICNlbmRpZgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfQk1QCXwgXAotCQkJCUNGR19DTURfQlNQCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JREUJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QT1NUX0RJQUcgfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKKwogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC0yMTAsNyArMjE3LDcgQEAKICNkZWZpbmUJQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjc2LDcgKzI4Myw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX1NEUkFNX0JBU0UJCTB4MDAwMDAwMDAKICNkZWZpbmUgQ0ZHX0ZMQVNIX0JBU0UJCTB4NDAwMDAwMDAKLSNpZiBkZWZpbmVkKERFQlVHKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCisjaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChDT05GSUdfQ01EX0lERSkKICNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOCQkoMjU2IDw8IDEwKQkvKiBSZXNlcnZlIDI1NiBrQiBmb3IgTW9uaXRvcgkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOCQkoMTI4IDw8IDEwKQkvKiBSZXNlcnZlIDEyOCBrQiBmb3IgTW9uaXRvcgkqLwpAQCAtMzcwLDcgKzM3Nyw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9sd21vbjUuaCBiL2luY2x1ZGUvY29uZmlncy9sd21vbjUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjlhYjIyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb25maWdzL2x3bW9uNS5oCkBAIC0wLDAgKzEsNDYxIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA3CisgKiBTdGVmYW4gUm9lc2UsIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHNyQGRlbnguZGUuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbHdtb241LmggLSBjb25maWd1cmF0aW9uIGZvciBsd21vbjUgYm9hcmQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBDT05GSUdfTFdNT041CQkxCQkvKiBCb2FyZCBpcyBsd21vbjUJKi8KKyNkZWZpbmUgQ09ORklHXzQ0MEVQWAkJMQkJLyogU3BlY2lmaWMgUFBDNDQwRVB4CSovCisjZGVmaW5lIENPTkZJR180NDAJCTEJCS8qIC4uLiBQUEM0NDAgZmFtaWx5CSovCisjZGVmaW5lIENPTkZJR180eHgJCTEJCS8qIC4uLiBQUEM0eHggZmFtaWx5CSovCisjZGVmaW5lIENPTkZJR19TWVNfQ0xLX0ZSRVEJMzMzMDAwMDAJLyogZXh0ZXJuYWwgZnJlcSB0byBwbGwJKi8KKworI2RlZmluZSBDT05GSUdfQk9BUkRfRUFSTFlfSU5JVF9GIDEJLyogQ2FsbCBib2FyZF9lYXJseV9pbml0X2YJKi8KKyNkZWZpbmUgQ09ORklHX01JU0NfSU5JVF9SCTEJLyogQ2FsbCBtaXNjX2luaXRfcgkJKi8KKyNkZWZpbmUgQ09ORklHX0FERF9SQU1fSU5GTwkxCS8qIFByaW50IGFkZGl0aW9uYWwgaW5mbwkqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCYXNlIGFkZHJlc3NlcyAtLSBOb3RlIHRoZXNlIGFyZSBlZmZlY3RpdmUgYWRkcmVzc2VzIHdoZXJlIHRoZQorICogYWN0dWFsIHJlc291cmNlcyBnZXQgbWFwcGVkIChub3QgcGh5c2ljYWwgYWRkcmVzc2VzKQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOCQkoNTEyICogMTAyNCkJLyogUmVzZXJ2ZSA1MTIga0IgZm9yIE1vbml0b3IJKi8KKyNkZWZpbmUgQ0ZHX01BTExPQ19MRU4JCSg1MTIgKiAxMDI0KQkvKiBSZXNlcnZlIDUxMiBrQiBmb3IgbWFsbG9jKCkJKi8KKworI2RlZmluZSBDRkdfQk9PVF9CQVNFX0FERFIJMHhmMDAwMDAwMAorI2RlZmluZSBDRkdfU0RSQU1fQkFTRQkJMHgwMDAwMDAwMAkvKiBfbXVzdF8gYmUgMAkJKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX0JBU0UJCTB4ZmMwMDAwMDAJLyogc3RhcnQgb2YgRkxBU0gJKi8KKyNkZWZpbmUgQ0ZHX01PTklUT1JfQkFTRQlURVhUX0JBU0UKKyNkZWZpbmUgQ0ZHX0xJTUVfQkFTRV8wICAgICAgICAgMHhjMDAwMDAwMAorI2RlZmluZSBDRkdfTElNRV9CQVNFXzEgICAgICAgICAweGMxMDAwMDAwCisjZGVmaW5lIENGR19MSU1FX0JBU0VfMiAgICAgICAgIDB4YzIwMDAwMDAKKyNkZWZpbmUgQ0ZHX0xJTUVfQkFTRV8zICAgICAgICAgMHhjMzAwMDAwMAorI2RlZmluZSBDRkdfRlBHQV9CQVNFXzAgICAgICAgICAweGM0MDAwMDAwCisjZGVmaW5lIENGR19GUEdBX0JBU0VfMSAgICAgICAgIDB4YzQyMDAwMDAKKyNkZWZpbmUgQ0ZHX09DTV9CQVNFCQkweGUwMDEwMDAwICAgICAgLyogb2NtCQkJKi8KKyNkZWZpbmUgQ0ZHX1BDSV9CQVNFCQkweGUwMDAwMDAwICAgICAgLyogSW50ZXJuYWwgUENJIHJlZ3MJKi8KKyNkZWZpbmUgQ0ZHX1BDSV9NRU1CQVNFCQkweDgwMDAwMDAwCS8qIG1hcHBlZCBwY2kgbWVtb3J5CSovCisjZGVmaW5lIENGR19QQ0lfTUVNQkFTRTEJQ0ZHX1BDSV9NRU1CQVNFICArIDB4MTAwMDAwMDAKKyNkZWZpbmUgQ0ZHX1BDSV9NRU1CQVNFMglDRkdfUENJX01FTUJBU0UxICsgMHgxMDAwMDAwMAorI2RlZmluZSBDRkdfUENJX01FTUJBU0UzCUNGR19QQ0lfTUVNQkFTRTIgKyAweDEwMDAwMDAwCisKKy8qIERvbid0IGNoYW5nZSBlaXRoZXIgb2YgdGhlc2UgKi8KKyNkZWZpbmUgQ0ZHX1BFUklQSEVSQUxfQkFTRQkweGVmNjAwMDAwCS8qIGludGVybmFsIHBlcmlwaGVyYWxzCSovCisKKyNkZWZpbmUgQ0ZHX1VTQjJEMF9CQVNFCQkweGUwMDAwMTAwCisjZGVmaW5lIENGR19VU0JfREVWSUNFCQkweGUwMDAwMDAwCisjZGVmaW5lIENGR19VU0JfSE9TVAkJMHhlMDAwMDQwMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbml0aWFsIFJBTSAmIHN0YWNrIHBvaW50ZXIKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiA0NDBFUHgvNDQwR1J4IGhhdmUgMTZLQiBvZiBpbnRlcm5hbCBTUkFNLCBzbyBubyBuZWVkIGZvciBELUNhY2hlCSovCisjZGVmaW5lIENGR19JTklUX1JBTV9PQ00JMQkJLyogT0NNIGFzIGluaXQgcmFtCSovCisjZGVmaW5lIENGR19JTklUX1JBTV9BRERSCUNGR19PQ01fQkFTRQkvKiBPQ00JCQkqLworCisjZGVmaW5lIENGR19JTklUX1JBTV9FTkQJKDQgPDwgMTApCisjZGVmaW5lIENGR19HQkxfREFUQV9TSVpFCTI1NgkJLyogbnVtIGJ5dGVzIGluaXRpYWwgZGF0YSAqLworI2RlZmluZSBDRkdfR0JMX0RBVEFfT0ZGU0VUCShDRkdfSU5JVF9SQU1fRU5EIC0gQ0ZHX0dCTF9EQVRBX1NJWkUpCisjZGVmaW5lIENGR19JTklUX1NQX09GRlNFVAlDRkdfR0JMX0RBVEFfT0ZGU0VUCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNlcmlhbCBQb3J0CisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3VuZGVmIENGR19FWFRfU0VSSUFMX0NMT0NLCQkvKiBubyBleHRlcm5hbCBjbG9jayBwcm92aWRlZAkqLworI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAorI2RlZmluZSBDT05GSUdfU0VSSUFMX01VTFRJICAgICAxCisvKiBkZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCBjb25zb2xlIG9uIFVBUlQxICovCisjZGVmaW5lIENPTkZJR19VQVJUMV9DT05TT0xFCTEJLyogdXNlIFVBUlQxIGFzIGNvbnNvbGUJCSovCisKKyNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCQkJCQkJXAorCXszMDAsIDYwMCwgMTIwMCwgMjQwMCwgNDgwMCwgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFbnZpcm9ubWVudAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgQ0ZHX0VOVl9JU19JTl9GTEFTSCAgICAgMQkvKiB1c2UgRkxBU0ggZm9yIGVudmlyb25tZW50IHZhcnMJKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRkxBU0ggcmVsYXRlZAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX0NGSQkJCQkvKiBUaGUgZmxhc2ggaXMgQ0ZJIGNvbXBhdGlibGUJKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX0NGSV9EUklWRVIJCQkvKiBVc2UgY29tbW9uIENGSSBkcml2ZXIJKi8KKworI2RlZmluZSBDRkdfRkxBU0hfQkFOS1NfTElTVAl7IENGR19GTEFTSF9CQVNFIH0KKworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX0JBTktTCTEJLyogbWF4IG51bWJlciBvZiBtZW1vcnkgYmFua3MJCSovCisjZGVmaW5lIENGR19NQVhfRkxBU0hfU0VDVAk1MTIJLyogbWF4IG51bWJlciBvZiBzZWN0b3JzIG9uIG9uZSBjaGlwCSovCisKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0VSQVNFX1RPVVQJMTIwMDAwCS8qIFRpbWVvdXQgZm9yIEZsYXNoIEVyYXNlIChpbiBtcykJKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX1dSSVRFX1RPVVQJNTAwCS8qIFRpbWVvdXQgZm9yIEZsYXNoIFdyaXRlIChpbiBtcykJKi8KKworI2RlZmluZSBDRkdfRkxBU0hfVVNFX0JVRkZFUl9XUklURSAxCS8qIHVzZSBidWZmZXJlZCB3cml0ZXMgKDIweCBmYXN0ZXIpCSovCisjZGVmaW5lIENGR19GTEFTSF9QUk9URUNUSU9OCTEJLyogdXNlIGhhcmR3YXJlIGZsYXNoIHByb3RlY3Rpb24JKi8KKworI2RlZmluZSBDRkdfRkxBU0hfRU1QVFlfSU5GTwkJLyogcHJpbnQgJ0UnIGZvciBlbXB0eSBzZWN0b3Igb24gZmxpbmZvICovCisjZGVmaW5lIENGR19GTEFTSF9RVUlFVF9URVNUCTEJLyogZG9uJ3Qgd2FybiB1cG9uIHVua25vd24gZmxhc2gJKi8KKworI2RlZmluZSBDRkdfRU5WX1NFQ1RfU0laRQkweDQwMDAwCS8qIHNpemUgb2Ygb25lIGNvbXBsZXRlIHNlY3RvcgkJKi8KKyNkZWZpbmUgQ0ZHX0VOVl9BRERSCQkoKC1DRkdfTU9OSVRPUl9MRU4pLUNGR19FTlZfU0VDVF9TSVpFKQorI2RlZmluZQlDRkdfRU5WX1NJWkUJCTB4MjAwMAkvKiBUb3RhbCBTaXplIG9mIEVudmlyb25tZW50IFNlY3RvcgkqLworCisvKiBBZGRyZXNzIGFuZCBzaXplIG9mIFJlZHVuZGFudCBFbnZpcm9ubWVudCBTZWN0b3IJKi8KKyNkZWZpbmUgQ0ZHX0VOVl9BRERSX1JFRFVORAkoQ0ZHX0VOVl9BRERSLUNGR19FTlZfU0VDVF9TSVpFKQorI2RlZmluZSBDRkdfRU5WX1NJWkVfUkVEVU5ECShDRkdfRU5WX1NJWkUpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEREUiBTRFJBTQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgQ0ZHX01CWVRFU19TRFJBTQkoMjU2KQkJLyogMjU2TUIJCQkqLworI2RlZmluZSBDRkdfRERSX0NBQ0hFRF9BRERSCTB4NDAwMDAwMDAJLyogc2V0dXAgMm5kIFRMQiBjYWNoZWQgaGVyZQkqLworI2RlZmluZSBDT05GSUdfRERSX0RBVEFfRVlFCTEJCS8qIHVzZSBERFIyIG9wdGltaXphdGlvbgkqLworI2lmIDAgLyogdGVzdC1vbmx5OiBkaXNhYmxlIEVDQyBmb3Igbm93ICovCisjZGVmaW5lIENPTkZJR19ERFJfRUNDCQkxCQkvKiBlbmFibGUgRUNDCQkJKi8KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJMkMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIENPTkZJR19IQVJEX0kyQwkJMQkJLyogSTJDIHdpdGggaGFyZHdhcmUgc3VwcG9ydAkqLworI3VuZGVmCUNPTkZJR19TT0ZUX0kyQwkJCQkvKiBJMkMgYml0LWJhbmdlZAkJKi8KKyNkZWZpbmUgQ0ZHX0kyQ19TUEVFRAkJNDAwMDAwCQkvKiBJMkMgc3BlZWQgYW5kIHNsYXZlIGFkZHJlc3MJKi8KKyNkZWZpbmUgQ0ZHX0kyQ19TTEFWRQkJMHg3RgorCisjZGVmaW5lIENGR19JMkNfTVVMVElfRUVQUk9NUworI2RlZmluZSBDRkdfSTJDX0VFUFJPTV9BRERSCSgweGE4Pj4xKQorI2RlZmluZSBDRkdfSTJDX0VFUFJPTV9BRERSX0xFTiAxCisjZGVmaW5lIENGR19FRVBST01fUEFHRV9XUklURV9FTkFCTEUKKyNkZWZpbmUgQ0ZHX0VFUFJPTV9QQUdFX1dSSVRFX0JJVFMgMworI2RlZmluZSBDRkdfRUVQUk9NX1BBR0VfV1JJVEVfREVMQVlfTVMgMTAKKworI2RlZmluZSBDT05GSUdfUlRDX1BDRjg1NjMJMQkJLyogZW5hYmxlIFBoaWxpcHMgUENGODU2MyBSVEMJKi8KKyNkZWZpbmUgQ0ZHX0kyQ19SVENfQUREUgkweDUxCQkvKiBQaGlsaXBzIFBDRjg1NjMgUlRDIGFkZHJlc3MJKi8KKworI2RlZmluZSBDT05GSUdfUFJFQk9PVAkiZWNobzsiCQkJCQkJXAorCSJlY2hvIFR5cGUgXCJydW4gZmxhc2hfbmZzXCIgdG8gbW91bnQgcm9vdCBmaWxlc3lzdGVtIG92ZXIgTkZTOyIgXAorCSJlY2hvIgorCisjdW5kZWYJQ09ORklHX0JPT1RBUkdTCisKKyNkZWZpbmUJQ09ORklHX0VYVFJBX0VOVl9TRVRUSU5HUwkJCQkJXAorCSJob3N0bmFtZT1sd21vbjVcMCIJCQkJCQlcCisJIm5ldGRldj1ldGgwXDAiCQkJCQkJCVwKKwkibmZzYXJncz1zZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L25mcyBydyAiCQkJXAorCQkibmZzcm9vdD0ke3NlcnZlcmlwfToke3Jvb3RwYXRofVwwIgkJCVwKKwkicmFtYXJncz1zZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L3JhbSByd1wwIgkJCVwKKwkiYWRkaXA9c2V0ZW52IGJvb3RhcmdzICR7Ym9vdGFyZ3N9ICIJCQkJXAorCQkiaXA9JHtpcGFkZHJ9OiR7c2VydmVyaXB9OiR7Z2F0ZXdheWlwfToke25ldG1hc2t9IglcCisJCSI6JHtob3N0bmFtZX06JHtuZXRkZXZ9Om9mZiBwYW5pYz0xXDAiCQkJXAorCSJhZGR0dHk9c2V0ZW52IGJvb3RhcmdzICR7Ym9vdGFyZ3N9IGNvbnNvbGU9dHR5UzEsJHtiYXVkcmF0ZX1cMCJcCisJImZsYXNoX25mcz1ydW4gbmZzYXJncyBhZGRpcCBhZGR0dHk7IgkJCQlcCisJCSJib290bSAke2tlcm5lbF9hZGRyfVwwIgkJCQlcCisJImZsYXNoX3NlbGY9cnVuIHJhbWFyZ3MgYWRkaXAgYWRkdHR5OyIJCQkJXAorCQkiYm9vdG0gJHtrZXJuZWxfYWRkcn0gJHtyYW1kaXNrX2FkZHJ9XDAiCQlcCisJIm5ldF9uZnM9dGZ0cCAyMDAwMDAgJHtib290ZmlsZX07cnVuIG5mc2FyZ3MgYWRkaXAgYWRkdHR5OyIgICAgIFwKKwkgICAgICAgICJib290bVwwIgkJCQkJCVwKKwkicm9vdHBhdGg9L29wdC9lbGRrL3BwY180eHhGUFwwIgkJCQlcCisJImJvb3RmaWxlPS90ZnRwYm9vdC9sd21vbjUvdUltYWdlXDAiCQkJCVwKKwkia2VybmVsX2FkZHI9RkMwMDAwMDBcMCIJCQkJCVwKKwkicmFtZGlza19hZGRyPUZDMTgwMDAwXDAiCQkJCQlcCisJImxvYWQ9dGZ0cCAyMDAwMDAgL3RmdHBib290LyR7aG9zdG5hbWV9L3UtYm9vdC5iaW5cMCIJCVwKKwkidXBkYXRlPXByb3RlY3Qgb2ZmIEZGRjgwMDAwIEZGRkZGRkZGO2VyYSBGRkY4MDAwMCBGRkZGRkZGRjsiCVwKKwkJImNwLmIgMjAwMDAwIEZGRjgwMDAwIDgwMDAwXDAiCQkJICAgICAgICBcCisJInVwZD1ydW4gbG9hZDtydW4gdXBkYXRlXDAiCQkJCQlcCisJIiIKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJydW4gZmxhc2hfc2VsZiIKKworI2lmIDAKKyNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQktMQkvKiBhdXRvYm9vdCBkaXNhYmxlZAkJKi8KKyNlbHNlCisjZGVmaW5lIENPTkZJR19CT09UREVMQVkJNQkvKiBhdXRvYm9vdCBhZnRlciA1IHNlY29uZHMJKi8KKyNlbmRpZgorCisjZGVmaW5lIENPTkZJR19MT0FEU19FQ0hPCTEJLyogZWNobyBvbiBmb3Igc2VyaWFsIGRvd25sb2FkCSovCisjZGVmaW5lIENGR19MT0FEU19CQVVEX0NIQU5HRQkxCS8qIGFsbG93IGJhdWRyYXRlIGNoYW5nZQkqLworCisjZGVmaW5lCUNPTkZJR19JQk1fRU1BQzRfVjQJMQorI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudAkJKi8KKyNkZWZpbmUgQ09ORklHX1BIWV9BRERSCQkzCS8qIFBIWSBhZGRyZXNzLCBTZWUgc2NoZW1hdGljcwkqLworCisjZGVmaW5lIENPTkZJR19QSFlfUkVTRVQgICAgICAgIDEJLyogcmVzZXQgcGh5IHVwb24gc3RhcnR1cCAgICAgICAgICovCisKKyNkZWZpbmUgQ09ORklHX0hBU19FVEgwCisjZGVmaW5lIENGR19SWF9FVEhfQlVGRkVSCTMyCS8qIE51bWJlciBvZiBldGhlcm5ldCByeCBidWZmZXJzICYgZGVzY3JpcHRvcnMgKi8KKworI2RlZmluZSBDT05GSUdfTkVUX01VTFRJCTEKKyNkZWZpbmUgQ09ORklHX0hBU19FVEgxCQkxCS8qIGFkZCBzdXBwb3J0IGZvciAiZXRoMWFkZHIiCSovCisjZGVmaW5lIENPTkZJR19QSFkxX0FERFIJMQorCisvKiBVU0IgKi8KKyNpZmRlZiBDT05GSUdfNDQwRVBYCisjZGVmaW5lIENPTkZJR19VU0JfT0hDSQorI2RlZmluZSBDT05GSUdfVVNCX1NUT1JBR0UKKworLyogQ29tbWVudCB0aGlzIG91dCB0byBlbmFibGUgVVNCIDEuMSBkZXZpY2UgKi8KKyNkZWZpbmUgVVNCXzJfMF9ERVZJQ0UKKworI2VuZGlmIC8qIENPTkZJR180NDBFUFggKi8KKworLyogUGFydGl0aW9ucyAqLworI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgorI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgorI2RlZmluZSBDT05GSUdfSVNPX1BBUlRJVElPTgorCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisKKyNpZmRlZiBDT05GSUdfNDQwRVBYCisjZGVmaW5lIENPTkZJR19DTURfVVNCCisjZW5kaWYKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBDT05GSUdfU1VQUE9SVF9WRkFUCisKKyNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCisjZGVmaW5lIENGR19QUk9NUFQJICAgICAgICAiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjZGVmaW5lIENGR19DQlNJWkUJICAgICAgICAxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCisjZWxzZQorI2RlZmluZSBDRkdfQ0JTSVpFCSAgICAgICAgMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCisjZW5kaWYKKyNkZWZpbmUgQ0ZHX1BCU0laRSAgICAgICAgICAgICAgKENGR19DQlNJWkUrc2l6ZW9mKENGR19QUk9NUFQpKzE2KSAvKiBQcmludCBCdWZmZXIgU2l6ZSAqLworI2RlZmluZSBDRkdfTUFYQVJHUwkgICAgICAgIDE2CS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzCSovCisjZGVmaW5lIENGR19CQVJHU0laRQkgICAgICAgIENGR19DQlNJWkUgLyogQm9vdCBBcmd1bWVudCBCdWZmZXIgU2l6ZQkqLworCisjZGVmaW5lIENGR19NRU1URVNUX1NUQVJUCTB4MDQwMDAwMCAvKiBtZW10ZXN0IHdvcmtzIG9uCQkqLworI2RlZmluZSBDRkdfTUVNVEVTVF9FTkQJCTB4MEMwMDAwMCAvKiA0IC4uLiAxMiBNQiBpbiBEUkFNCSovCisKKyNkZWZpbmUgQ0ZHX0xPQURfQUREUgkJMHgxMDAwMDAgIC8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzCSovCisjZGVmaW5lIENGR19FWFRCRElORk8JCTEJLyogVG8gdXNlIGV4dGVuZGVkIGJvYXJkX2ludG8gKGJkX3QpICovCisKKyNkZWZpbmUgQ0ZHX0haCQkgICAgICAgIDEwMDAJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcwkqLworCisjZGVmaW5lIENPTkZJR19DTURMSU5FX0VESVRJTkcJMQkvKiBhZGQgY29tbWFuZCBsaW5lIGhpc3RvcnkJKi8KKyNkZWZpbmUgQ09ORklHX0xPT1BXICAgICAgICAgICAgMSAgICAgICAvKiBlbmFibGUgbG9vcHcgY29tbWFuZCAgICAgICAgICovCisjZGVmaW5lIENPTkZJR19NWF9DWUNMSUMgICAgICAgIDEgICAgICAgLyogZW5hYmxlIG1kYy9td2MgY29tbWFuZHMgICAgICAqLworI2RlZmluZSBDT05GSUdfWkVST19CT09UREVMQVlfQ0hFQ0sJLyogY2hlY2sgZm9yIGtleXByZXNzIG9uIGJvb3RkZWxheT09MCAqLworI2RlZmluZSBDT05GSUdfVkVSU0lPTl9WQVJJQUJMRSAxCS8qIGluY2x1ZGUgdmVyc2lvbiBlbnYgdmFyaWFibGUgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUENJIHN0dWZmCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogR2VuZXJhbCBQQ0kgKi8KKyNkZWZpbmUgQ09ORklHX1BDSQkJCS8qIGluY2x1ZGUgcGNpIHN1cHBvcnQJICAgICAgICAqLworI3VuZGVmIENPTkZJR19QQ0lfUE5QCQkJLyogZG8gKG5vdCkgcGNpIHBsdWctYW5kLXBsYXkgICAqLworI2RlZmluZSBDT05GSUdfUENJX1NDQU5fU0hPVwkJLyogc2hvdyBwY2kgZGV2aWNlcyBvbiBzdGFydHVwICAqLworI2RlZmluZSBDRkdfUENJX1RBUkdCQVNFICAgICAgICAweDgwMDAwMDAwIC8qIFBDSWFkZHIgbWFwcGVkIHRvIENGR19QQ0lfTUVNQkFTRSovCisKKy8qIEJvYXJkLXNwZWNpZmljIFBDSSAqLworI2RlZmluZSBDRkdfUENJX1RBUkdFVF9JTklUCisjZGVmaW5lIENGR19QQ0lfTUFTVEVSX0lOSVQKKworI2RlZmluZSBDRkdfUENJX1NVQlNZU19WRU5ET1JJRCAweDEwZTgJLyogQU1DQwkJCQkqLworI2RlZmluZSBDRkdfUENJX1NVQlNZU19JRCAgICAgICAweGNhZmUJLyogV2hhdGV2ZXIJCQkqLworCisjZGVmaW5lIENPTkZJR19IV19XQVRDSERPRwkxCS8qIFVzZSBleHRlcm5hbCBIVy1XYXRjaGRvZwkqLworCisvKgorICogRm9yIGJvb3RpbmcgTGludXgsIHRoZSBib2FyZCBpbmZvIGFuZCBjb21tYW5kIGxpbmUgZGF0YQorICogaGF2ZSB0byBiZSBpbiB0aGUgZmlyc3QgOCBNQiBvZiBtZW1vcnksIHNpbmNlIHRoaXMgaXMKKyAqIHRoZSBtYXhpbXVtIG1hcHBlZCBieSB0aGUgTGludXgga2VybmVsIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAqLworI2RlZmluZSBDRkdfQk9PVE1BUFNaCQkoOCA8PCAyMCkJLyogSW5pdGlhbCBNZW1vcnkgbWFwIGZvciBMaW51eCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFeHRlcm5hbCBCdXMgQ29udHJvbGxlciAoRUJDKSBTZXR1cAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNICQlDRkdfRkxBU0hfQkFTRQorCisvKiBNZW1vcnkgQmFuayAwIChOT1ItRkxBU0gpIGluaXRpYWxpemF0aW9uCQkJCQkqLworI2RlZmluZSBDRkdfRUJDX1BCMEFQCQkweDAzMDUwMjAwCisjZGVmaW5lIENGR19FQkNfUEIwQ1IJCShDRkdfRkxBU0ggfCAweGRjMDAwKQorCisvKiBNZW1vcnkgQmFuayAxIChMaW1lKSBpbml0aWFsaXphdGlvbgkJCQkJCSovCisjZGVmaW5lIENGR19FQkNfUEIxQVAJCTB4MDEwMDQzODAKKyNkZWZpbmUgQ0ZHX0VCQ19QQjFDUgkJKENGR19MSU1FX0JBU0VfMCB8IDB4ZGMwMDApCisKKy8qIE1lbW9yeSBCYW5rIDIgKEZQR0EpIGluaXRpYWxpemF0aW9uCQkJCQkJKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjJBUAkJMHgwMTAwNDQwMAorI2RlZmluZSBDRkdfRUJDX1BCMkNSCQkoQ0ZHX0ZQR0FfQkFTRV8wIHwgMHgxYzAwMCkKKworLyogTWVtb3J5IEJhbmsgMyAoRlBHQTIpIGluaXRpYWxpemF0aW9uCQkJCQkJKi8KKyNkZWZpbmUgQ0ZHX0VCQ19QQjNBUAkJMHgwMTAwNDQwMAorI2RlZmluZSBDRkdfRUJDX1BCM0NSCQkoQ0ZHX0ZQR0FfQkFTRV8xIHwgMHgxYzAwMCkKKworI2RlZmluZSBDRkdfRUJDX0NGRwkJMHhiODQwMDAwMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBHcmFwaGljcyAoRnVqaXRzdSBMaW1lKQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFNEUkFNIENsb2NrIGZyZXF1ZW5jeSBhZGp1c3RtZW50IHJlZ2lzdGVyICovCisjZGVmaW5lIENGR19MSU1FX1NEUkFNX0NMT0NLCTB4QzFGQzAwMDAKKy8qIExpbWUgQ2xvY2sgZnJlcXVlbmN5IGlzIHRvIHNldCAxMzNNSHogKi8KKyNkZWZpbmUgQ0ZHX0xJTUVfQ0xPQ0tfMTMzTUhaCTB4MTAwMDAKKworLyogU0RSQU0gUGFyYW1ldGVyIHJlZ2lzdGVyICovCisjZGVmaW5lIENGR19MSU1FX01NUgkJMHhDMUZDRkZGQworLyogU0RSQU0gcGFyYW1ldGVyIHZhbHVlICovCisjZGVmaW5lIENGR19MSU1FX01NUl9WQUxVRQkweDQxNEZCN0YyCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEdQSU8gU2V0dXAKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIENGR19HUElPX1BIWTFfUlNUCTEyCisjZGVmaW5lIENGR19HUElPX0ZMQVNIX1dQCTE0CisjZGVmaW5lIENGR19HUElPX1BIWTBfUlNUCTIyCisjZGVmaW5lIENGR19HUElPX1dBVENIRE9HCTU4CisjZGVmaW5lIENGR19HUElPX0xJTUVfUwkJNTkKKyNkZWZpbmUgQ0ZHX0dQSU9fTElNRV9SU1QJNjAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUFBDNDQwIEdQSU8gQ29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENGR180NDBfR1BJT19UQUJMRSB7IC8qCSAgT3V0CQkgIEdQSU8JQWx0ZXJuYXRlMQlBbHRlcm5hdGUyCUFsdGVybmF0ZTMgKi8gXAorewkJCQkJCQkJCQkJXAorLyogR1BJTyBDb3JlIDAgKi8JCQkJCQkJCQlcCit7R1BJTzBfQkFTRSwgR1BJT19PVVQsIEdQSU9fQUxUMSwgR1BJT19PVVRfMH0sIC8qIEdQSU8wCUVCQ19BRERSKDcpCURNQV9SRVEoMikJKi8JXAore0dQSU8wX0JBU0UsIEdQSU9fT1VULCBHUElPX0FMVDEsIEdQSU9fT1VUXzB9LCAvKiBHUElPMQlFQkNfQUREUig2KQlETUFfQUNLKDIpCSovCVwKK3tHUElPMF9CQVNFLCBHUElPX09VVCwgR1BJT19BTFQxLCBHUElPX09VVF8wfSwgLyogR1BJTzIJRUJDX0FERFIoNSkJRE1BX0VPVC9UQygyKQkqLwlcCit7R1BJTzBfQkFTRSwgR1BJT19PVVQsIEdQSU9fQUxUMSwgR1BJT19PVVRfMH0sIC8qIEdQSU8zCUVCQ19BRERSKDQpCURNQV9SRVEoMykJKi8JXAore0dQSU8wX0JBU0UsIEdQSU9fT1VULCBHUElPX0FMVDEsIEdQSU9fT1VUXzB9LCAvKiBHUElPNAlFQkNfQUREUigzKQlETUFfQUNLKDMpCSovCVwKK3tHUElPMF9CQVNFLCBHUElPX09VVCwgR1BJT19BTFQxLCBHUElPX09VVF8wfSwgLyogR1BJTzUJRUJDX0FERFIoMikJRE1BX0VPVC9UQygzKQkqLwlcCit7R1BJTzBfQkFTRSwgR1BJT19PVVQsIEdQSU9fQUxUMSwgR1BJT19PVVRfMH0sIC8qIEdQSU82CUVCQ19DU19OKDEpCQkJKi8JXAore0dQSU8wX0JBU0UsIEdQSU9fT1VULCBHUElPX0FMVDEsIEdQSU9fT1VUXzB9LCAvKiBHUElPNwlFQkNfQ1NfTigyKQkJCSovCVwKK3tHUElPMF9CQVNFLCBHUElPX09VVCwgR1BJT19BTFQxLCBHUElPX09VVF8wfSwgLyogR1BJTzgJRUJDX0NTX04oMykJCQkqLwlcCit7R1BJTzBfQkFTRSwgR1BJT19PVVQsIEdQSU9fQUxUMSwgR1BJT19PVVRfMH0sIC8qIEdQSU85CUVCQ19DU19OKDQpCQkJKi8JXAore0dQSU8wX0JBU0UsIEdQSU9fT1VULCBHUElPX0FMVDEsIEdQSU9fT1VUXzB9LCAvKiBHUElPMTAgRUJDX0NTX04oNSkJCQkqLwlcCit7R1BJTzBfQkFTRSwgR1BJT19JTiAsIEdQSU9fU0VMICwgR1BJT19PVVRfMH0sIC8qIEdQSU8xMSBFQkNfQlVTX0VSUgkJCSovCVwKK3tHUElPMF9CQVNFLCBHUElPX09VVCwgR1BJT19TRUwgLCBHUElPX09VVF8wfSwgLyogR1BJTzEyCQkJCSovCVwKK3tHUElPMF9CQVNFLCBHUElPX09VVCwgR1BJT19TRUwgLCBHUElPX09VVF8wfSwgLyogR1BJTzEzCQkJCSovCVwKK3tHUElPMF9CQVNFLCBHUElPX09VVCwgR1BJT19TRUwgLCBHUElPX09VVF8xfSwgLyogR1BJTzE0CQkJCSovCVwKK3tHUElPMF9CQVNFLCBHUElPX09VVCwgR1BJT19TRUwgLCBHUElPX09VVF8wfSwgLyogR1BJTzE1CQkJCSovCVwKK3tHUElPMF9CQVNFLCBHUElPX09VVCwgR1BJT19BTFQxLCBHUElPX09VVF8wfSwgLyogR1BJTzE2IEdNQ1R4RCg0KQkJCSovCVwKK3tHUElPMF9CQVNFLCBHUElPX09VVCwgR1BJT19BTFQxLCBHUElPX09VVF8wfSwgLyogR1BJTzE3IEdNQ1R4RCg1KQkJCSovCVwKK3tHUElPMF9CQVNFLCBHUElPX09VVCwgR1BJT19BTFQxLCBHUElPX09VVF8wfSwgLyogR1BJTzE4IEdNQ1R4RCg2KQkJCSovCVwKK3tHUElPMF9CQVNFLCBHUElPX09VVCwgR1BJT19BTFQxLCBHUElPX09VVF8wfSwgLyogR1BJTzE5IEdNQ1R4RCg3KQkJCSovCVwKK3tHUElPMF9CQVNFLCBHUElPX0lOICwgR1BJT19BTFQxLCBHUElPX09VVF8wfSwgLyogR1BJTzIwIFJlamVjdFBrdDAJCQkqLwlcCit7R1BJTzBfQkFTRSwgR1BJT19JTiAsIEdQSU9fQUxUMSwgR1BJT19PVVRfMH0sIC8qIEdQSU8yMSBSZWplY3RQa3QxCQkJKi8JXAore0dQSU8wX0JBU0UsIEdQSU9fT1VULCBHUElPX1NFTCAsIEdQSU9fT1VUXzB9LCAvKiBHUElPMjIJCQkJKi8JXAore0dQSU8wX0JBU0UsIEdQSU9fT1VULCBHUElPX0FMVDEsIEdQSU9fT1VUXzB9LCAvKiBHUElPMjMgU0NQRDAJCQkJKi8JXAore0dQSU8wX0JBU0UsIEdQSU9fT1VULCBHUElPX0FMVDEsIEdQSU9fT1VUXzB9LCAvKiBHUElPMjQgR01DVHhEKDIpCQkJKi8JXAore0dQSU8wX0JBU0UsIEdQSU9fT1VULCBHUElPX0FMVDEsIEdQSU9fT1VUXzB9LCAvKiBHUElPMjUgR01DVHhEKDMpCQkJKi8JXAore0dQSU8wX0JBU0UsIEdQSU9fSU4gLCBHUElPX1NFTCAsIEdQSU9fT1VUXzB9LCAvKiBHUElPMjYJCQkJKi8JXAore0dQSU8wX0JBU0UsIEdQSU9fSU4gLCBHUElPX1NFTCAsIEdQSU9fT1VUXzB9LCAvKiBHUElPMjcgRVhUX0VCQ19SRVEJVVNCMkRfUlhFUlJPUgkqLwlcCit7R1BJTzBfQkFTRSwgR1BJT19PVVQsIEdQSU9fU0VMICwgR1BJT19PVVRfMH0sIC8qIEdQSU8yOAkJVVNCMkRfVFhWQUxJRAkqLwlcCit7R1BJTzBfQkFTRSwgR1BJT19PVVQsIEdQSU9fU0VMICwgR1BJT19PVVRfMH0sIC8qIEdQSU8yOSBFQkNfRVhUX0hETEEJVVNCMkRfUEFEX1NVU1BORE0gKi8JXAore0dQSU8wX0JBU0UsIEdQSU9fSU4gLCBHUElPX1NFTCAsIEdQSU9fT1VUXzB9LCAvKiBHUElPMzAgRUJDX0VYVF9BQ0sJVVNCMkRfWENWUlNFTEVDVCovCVwKK3tHUElPMF9CQVNFLCBHUElPX0lOICwgR1BJT19TRUwgLCBHUElPX09VVF8wfSwgLyogR1BJTzMxIEVCQ19FWFJfQlVTUkVRCVVTQjJEX1RFUk1TRUxFQ1QqLwlcCit9LAkJCQkJCQkJCQkJXAorewkJCQkJCQkJCQkJXAorLyogR1BJTyBDb3JlIDEgKi8JCQkJCQkJCQlcCit7R1BJTzFfQkFTRSwgR1BJT19JTiAsIEdQSU9fQUxUMiwgR1BJT19PVVRfMH0sIC8qIEdQSU8zMiBVU0IyRF9PUE1PREUwCUVCQ19EQVRBKDIpCSovCVwKK3tHUElPMV9CQVNFLCBHUElPX0lOICwgR1BJT19BTFQyLCBHUElPX09VVF8wfSwgLyogR1BJTzMzIFVTQjJEX09QTU9ERTEJRUJDX0RBVEEoMykJKi8JXAore0dQSU8xX0JBU0UsIEdQSU9fT1VULCBHUElPX0FMVDMsIEdQSU9fT1VUXzB9LCAvKiBHUElPMzQgVUFSVDBfRENEX04JVUFSVDFfRFNSX0NUU19OCVVBUlQyX1NPVVQqLyBcCit7R1BJTzFfQkFTRSwgR1BJT19JTiAsIEdQSU9fQUxUMywgR1BJT19PVVRfMH0sIC8qIEdQSU8zNSBVQVJUMF84UElOX0RTUl9OIFVBUlQxX1JUU19EVFJfTiBVQVJUMl9TSU4qLyBcCit7R1BJTzFfQkFTRSwgR1BJT19JTiAsIEdQSU9fQUxUMiwgR1BJT19PVVRfMH0sIC8qIEdQSU8zNiBVQVJUMF84UElOX0NUU19OIEVCQ19EQVRBKDApCVVBUlQzX1NJTiovIFwKK3tHUElPMV9CQVNFLCBHUElPX09VVCwgR1BJT19BTFQyLCBHUElPX09VVF8wfSwgLyogR1BJTzM3IFVBUlQwX1JUU19OCUVCQ19EQVRBKDEpCVVBUlQzX1NPVVQqLyBcCit7R1BJTzFfQkFTRSwgR1BJT19PVVQsIEdQSU9fQUxUMiwgR1BJT19PVVRfMH0sIC8qIEdQSU8zOCBVQVJUMF9EVFJfTglVQVJUMV9TT1VUCSovCVwKK3tHUElPMV9CQVNFLCBHUElPX0lOICwgR1BJT19BTFQyLCBHUElPX09VVF8wfSwgLyogR1BJTzM5IFVBUlQwX1JJX04JVUFSVDFfU0lOCSovCVwKK3tHUElPMV9CQVNFLCBHUElPX0lOICwgR1BJT19BTFQxLCBHUElPX09VVF8wfSwgLyogR1BJTzQwIFVJQ19JUlEoMCkJCQkqLwlcCit7R1BJTzFfQkFTRSwgR1BJT19JTiAsIEdQSU9fQUxUMSwgR1BJT19PVVRfMH0sIC8qIEdQSU80MSBVSUNfSVJRKDEpCQkJKi8JXAore0dQSU8xX0JBU0UsIEdQSU9fSU4gLCBHUElPX0FMVDEsIEdQSU9fT1VUXzB9LCAvKiBHUElPNDIgVUlDX0lSUSgyKQkJCSovCVwKK3tHUElPMV9CQVNFLCBHUElPX0lOICwgR1BJT19BTFQxLCBHUElPX09VVF8wfSwgLyogR1BJTzQzIFVJQ19JUlEoMykJCQkqLwlcCit7R1BJTzFfQkFTRSwgR1BJT19JTiAsIEdQSU9fQUxUMSwgR1BJT19PVVRfMH0sIC8qIEdQSU80NCBVSUNfSVJRKDQpCURNQV9BQ0soMSkJKi8JXAore0dQSU8xX0JBU0UsIEdQSU9fSU4gLCBHUElPX0FMVDEsIEdQSU9fT1VUXzB9LCAvKiBHUElPNDUgVUlDX0lSUSg2KQlETUFfRU9UL1RDKDEpCSovCVwKK3tHUElPMV9CQVNFLCBHUElPX0lOICwgR1BJT19BTFQxLCBHUElPX09VVF8wfSwgLyogR1BJTzQ2IFVJQ19JUlEoNykJRE1BX1JFUSgwKQkqLwlcCit7R1BJTzFfQkFTRSwgR1BJT19JTiAsIEdQSU9fQUxUMSwgR1BJT19PVVRfMH0sIC8qIEdQSU80NyBVSUNfSVJRKDgpCURNQV9BQ0soMCkJKi8JXAore0dQSU8xX0JBU0UsIEdQSU9fSU4gLCBHUElPX0FMVDEsIEdQSU9fT1VUXzB9LCAvKiBHUElPNDggVUlDX0lSUSg5KQlETUFfRU9UL1RDKDApCSovCVwKK3tHUElPMV9CQVNFLCBHUElPX09VVCwgR1BJT19TRUwgLCBHUElPX09VVF8xfSwgLyogR1BJTzQ5ICBVbnNlbGVjdCB2aWEgVHJhY2VTZWxlY3QgQml0CSovCVwKK3tHUElPMV9CQVNFLCBHUElPX0lOLCAgR1BJT19TRUwgLCBHUElPX09VVF8wfSwgLyogR1BJTzUwICBVbnNlbGVjdCB2aWEgVHJhY2VTZWxlY3QgQml0CSovCVwKK3tHUElPMV9CQVNFLCBHUElPX0lOICwgR1BJT19TRUwgLCBHUElPX09VVF8wfSwgLyogR1BJTzUxICBVbnNlbGVjdCB2aWEgVHJhY2VTZWxlY3QgQml0CSovCVwKK3tHUElPMV9CQVNFLCBHUElPX0lOICwgR1BJT19TRUwgLCBHUElPX09VVF8wfSwgLyogR1BJTzUyICBVbnNlbGVjdCB2aWEgVHJhY2VTZWxlY3QgQml0CSovCVwKK3tHUElPMV9CQVNFLCBHUElPX09VVCwgR1BJT19TRUwgLCBHUElPX09VVF8xfSwgLyogR1BJTzUzICBVbnNlbGVjdCB2aWEgVHJhY2VTZWxlY3QgQml0CSovCVwKK3tHUElPMV9CQVNFLCBHUElPX09VVCwgR1BJT19TRUwgLCBHUElPX09VVF8wfSwgLyogR1BJTzU0ICBVbnNlbGVjdCB2aWEgVHJhY2VTZWxlY3QgQml0CSovCVwKK3tHUElPMV9CQVNFLCBHUElPX09VVCwgR1BJT19TRUwgLCBHUElPX09VVF8xfSwgLyogR1BJTzU1ICBVbnNlbGVjdCB2aWEgVHJhY2VTZWxlY3QgQml0CSovCVwKK3tHUElPMV9CQVNFLCBHUElPX09VVCwgR1BJT19TRUwgLCBHUElPX09VVF8wfSwgLyogR1BJTzU2ICBVbnNlbGVjdCB2aWEgVHJhY2VTZWxlY3QgQml0CSovCVwKK3tHUElPMV9CQVNFLCBHUElPX09VVCwgR1BJT19TRUwgLCBHUElPX09VVF8xfSwgLyogR1BJTzU3ICBVbnNlbGVjdCB2aWEgVHJhY2VTZWxlY3QgQml0CSovCVwKK3tHUElPMV9CQVNFLCBHUElPX09VVCwgR1BJT19TRUwgLCBHUElPX09VVF8xfSwgLyogR1BJTzU4ICBVbnNlbGVjdCB2aWEgVHJhY2VTZWxlY3QgQml0CSovCVwKK3tHUElPMV9CQVNFLCBHUElPX09VVCwgR1BJT19TRUwgLCBHUElPX09VVF8wfSwgLyogR1BJTzU5ICBVbnNlbGVjdCB2aWEgVHJhY2VTZWxlY3QgQml0CSovCVwKK3tHUElPMV9CQVNFLCBHUElPX09VVCwgR1BJT19TRUwgLCBHUElPX09VVF8wfSwgLyogR1BJTzYwICBVbnNlbGVjdCB2aWEgVHJhY2VTZWxlY3QgQml0CSovCVwKK3tHUElPMV9CQVNFLCBHUElPX0lOICwgR1BJT19TRUwgLCBHUElPX09VVF8wfSwgLyogR1BJTzYxICBVbnNlbGVjdCB2aWEgVHJhY2VTZWxlY3QgQml0CSovCVwKK3tHUElPMV9CQVNFLCBHUElPX0lOICwgR1BJT19TRUwgLCBHUElPX09VVF8wfSwgLyogR1BJTzYyICBVbnNlbGVjdCB2aWEgVHJhY2VTZWxlY3QgQml0CSovCVwKK3tHUElPMV9CQVNFLCBHUElPX09VVCwgR1BJT19TRUwgLCBHUElPX09VVF8wfSwgLyogR1BJTzYzICBVbnNlbGVjdCB2aWEgVHJhY2VTZWxlY3QgQml0CSovCVwKK30JCQkJCQkJCQkJCVwKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ2FjaGUgQ29uZmlndXJhdGlvbgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkoMzI8PDEwKSAgLyogRm9yIEFNQ0MgNDQwIENQVXMJCQkqLworI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJICAgICAgLyogLi4uCQkJICAgICAgICAgICAgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CSAgICAgIC8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCisjZW5kaWYKKworLyoKKyAqIEludGVybmFsIERlZmluaXRpb25zCisgKgorICogQm9vdCBGbGFncworICovCisjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KKyNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLworCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLworI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkgICAgLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCisjZW5kaWYKKyNlbmRpZgkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvbWNjMjAwLmggYi9pbmNsdWRlL2NvbmZpZ3MvbWNjMjAwLmgKaW5kZXggYzIzMjRhMC4uY2MyZGJjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL21jYzIwMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9tY2MyMDAuaApAQCAtNDAsMTEgKzQwLDYgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLwogI2RlZmluZSBCT09URkxBR19XQVJNCQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCiAKLSNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCi0jZW5kaWYKLQogLyoKICAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KICAqCkBAIC05MiwyNyArODcsMzcgQEAKIAogLyogVVNCICovCiAjZGVmaW5lIENPTkZJR19VU0JfT0hDSQotI2RlZmluZSBBRERfVVNCX0NNRAkJQ0ZHX0NNRF9VU0IgfCBDRkdfQ01EX0ZBVAogI2RlZmluZSBDT05GSUdfVVNCX1NUT1JBR0UKIC8qIGF1dG9tYXRpYyBzb2Z0d2FyZSB1cGRhdGVzIChzZWUgYm9hcmQvbWNjMjAwL2F1dG9fdXBkYXRlLmMpICovCiAjZGVmaW5lIENPTkZJR19BVVRPX1VQREFURSAxCiAKLS8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKLSAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlBRERfVVNCX0NNRAl8IFwKLQkJCQlDRkdfQ01EX0JFREJVRwl8IFwKLQkJCQlDRkdfQ01EX0ZBVAl8IFwKLQkJCQlDRkdfQ01EX0kyQykKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0JFREJVRworI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX1VTQgorCisjdW5kZWYJQ09ORklHX0NNRF9ORVQKKwogCiAvKgogICogQXV0b2Jvb3RpbmcKICAqLwotI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUJLyogYXV0b2Jvb3QgYWZ0ZXIgNSBzZWNvbmRzICovCisjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMQkvKiBhdXRvYm9vdCBhZnRlciAxIHNlY29uZCAqLwogCiAjZGVmaW5lIENPTkZJR19QUkVCT09UCSJlY2hvOyIJXAogCSJlY2hvIFR5cGUgXCJydW4gZmxhc2hfbmZzXCIgdG8gbW91bnQgcm9vdCBmaWxlc3lzdGVtIG92ZXIgTkZTOyIgXApAQCAtMTI4LDIwICsxMzMsMzAgQEAKICMgZGVmaW5lIENGR19fTElOVVhfQ09OU09MRQkidHR5UzAiCiAjZWxzZQogIyBkZWZpbmUgQ0ZHX19CT0FSRE5BTUUJCSJtY2MyMDAiCi0jIGRlZmluZSBDRkdfX0xJTlVYX0NPTlNPTEUJInR0eUVVNyIKKyMgZGVmaW5lIENGR19fTElOVVhfQ09OU09MRQkidHR5RVU1IgogI2VuZGlmCiAKKy8qIE5ldHdvcmsgKi8KKyNkZWZpbmUgQ09ORklHX0VUSEFERFIJMDA6MTc6MTc6ZmY6MDA6MDAKKyNkZWZpbmUgQ09ORklHX0lQQUREUgkxMC43Ni45LjI5CisjZGVmaW5lIENPTkZJR19TRVJWRVJJUAkxMC43Ni45LjEKKworI2luY2x1ZGUgPHZlcnNpb24uaD4gLyogRm9yIFUtQm9vdCB2ZXJzaW9uICovCisKICNkZWZpbmUgQ09ORklHX0VYVFJBX0VOVl9TRVRUSU5HUwkJCQkJXAorCSJ1Ym9vdHZlcj0iIFVfQk9PVF9WRVJTSU9OICJcMCIJCQkJCVwKIAkibmV0ZGV2PWV0aDBcMCIJCQkJCQkJXAogCSJob3N0bmFtZT0iIENGR19fQk9BUkROQU1FICJcMCIJCQkJCVwKIAkibmZzYXJncz1zZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L25mcyBydyAiCQkJXAogCQkibmZzcm9vdD0ke3NlcnZlcmlwfToke3Jvb3RwYXRofVwwIgkJCVwKLQkicmFtYXJncz1zZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L3JhbSByd1wwIgkJCVwKKwkicmFtYXJncz1zZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L210ZGJsb2NrMiAiCQkJXAorCQkicm9vdGZzdHlwZT1jcmFtZnNcMCIJCQkJCVwKIAkiYWRkaXA9c2V0ZW52IGJvb3RhcmdzICR7Ym9vdGFyZ3N9ICIJCQkJXAogCQkiaXA9JHtpcGFkZHJ9OiR7c2VydmVyaXB9OiR7Z2F0ZXdheWlwfToke25ldG1hc2t9IglcCiAJCSI6JHtob3N0bmFtZX06JHtuZXRkZXZ9Om9mZiBwYW5pYz0xXDAiCQkJXAogCSJhZGRjb25zPXNldGVudiBib290YXJncyAke2Jvb3RhcmdzfSAiCQkJCVwKLQkJImNvbnNvbGU9JHtjb25zb2xlfSwke2JhdWRyYXRlfVwwIgkJCVwKKwkJImNvbnNvbGU9JHtjb25zb2xlfSwke2JhdWRyYXRlfSAiCQlcCisJCSJ1Ym9vdHZlcj0ke3Vib290dmVyfSBib2FyZD0ke2JvYXJkfVwwIglcCiAJImZsYXNoX25mcz1ydW4gbmZzYXJncyBhZGRpcCBhZGRjb25zOyIJCQkJXAogCQkiYm9vdG0gJHtrZXJuZWxfYWRkcn1cMCIJCQkJXAogCSJmbGFzaF9zZWxmPXJ1biByYW1hcmdzIGFkZGlwIGFkZGNvbnM7IgkJCQlcCkBAIC0xNTMsNiArMTY4LDcgQEAKIAkiYm9vdGZpbGU9L3RmdHBib290LyIgQ0ZHX19CT0FSRE5BTUUgIi91SW1hZ2VcMCIJCVwKIAkibG9hZD10ZnRwIDIwMDAwMCAvdGZ0cGJvb3QvIiBDRkdfX0JPQVJETkFNRSAiL3UtYm9vdC5iaW5cMCIJXAogCSJ0ZXh0X2Jhc2U9IiBNS19TVFIoVEVYVF9CQVNFKSAiXDAiCQkJCVwKKwkia2VybmVsX2FkZHI9MHhGQzBDMDAwMFwwIgkJCQkJXAogCSJ1cGRhdGU9cHJvdGVjdCBvZmYgJHt0ZXh0X2Jhc2V9ICske2ZpbGVzaXplfTsiCQkJXAogCQkiZXJhICR7dGV4dF9iYXNlfSArJHtmaWxlc2l6ZX07IgkJCVwKIAkJImNwLmIgMjAwMDAwICR7dGV4dF9iYXNlfSAke2ZpbGVzaXplfVwwIgkJXApAQCAtMjUzLDcgKzI2OSw3IEBACiAvKgogICogRXRoZXJuZXQgY29uZmlndXJhdGlvbgogICovCi0jZGVmaW5lIENPTkZJR19NUEM1eHh4X0ZFQwkxCisvKiNkZWZpbmUgQ09ORklHX01QQzV4eHhfRkVDCTEqLwogLyoKICAqIERlZmluZSBDT05GSUdfRkVDXzEwTUJJVCB0byBmb3JjZSBGRUMgYXQgMTBNYgogICovCkBAIC0yOTEsNyArMzA3LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMzA3LDYgKzMyMywxMSBAQAogCiAjZGVmaW5lIENGR19IWgkJCTEwMDAJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcyAqLwogCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzCQkJKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KKyNlbmRpZgorCiAvKgogICogVmFyaW91cyBsb3ctbGV2ZWwgc2V0dGluZ3MKICAqLwpAQCAtMzI5LDYgKzM1MCwxMyBAQAogI2RlZmluZSBDRkdfQ1MxX1NJWkUJCTB4MDAwMDEwMDAKICNkZWZpbmUgQ0ZHX0NTMV9DRkcJCTB4MWQzMDAKIAorLyogTGVpY2EgLSBidWlsZCByZXZpc2lvbiByZXNpc3RvcnMgKi8KKy8qCisjZGVmaW5lIENGR19DUzNfU1RBUlQJCTB4ODAwMjAwMDAKKyNkZWZpbmUgQ0ZHX0NTM19TSVpFCQkweDAwMDAwMDA0CisjZGVmaW5lIENGR19DUzNfQ0ZHCQkweDFkMzAwCisqLworCiAvKgogICogIFNlbGVjdCBvbmUgb2YgcXVhcnRzIGFzIGEgZGVmYXVsdAogICogY29uc29sZS4gSWYgdW5kZWZpbmVkIC0gUFNDIGNvbnNvbGUKQEAgLTM4NCw0ICs0MTIsOCBAQAogI2RlZmluZSBDT05GSUdfVVNCX0NMT0NLCTB4MDAwMUJCQkIKICNkZWZpbmUgQ09ORklHX1VTQl9DT05GSUcJMHgwMDAwNTAwMAogCisjZGVmaW5lIENPTkZJR19BVVRPQk9PVF9LRVlFRAkJLyogdXNlIGtleSBzdHJpbmdzIHRvIHN0b3AgYXV0b2Jvb3QJKi8KKyNkZWZpbmUgQ09ORklHX0FVVE9CT09UX1NUT1BfU1RSCSI0MzIiCisjZGVmaW5lIENPTkZJR19TSUxFTlRfQ09OU09MRQkxCisKICNlbmRpZiAvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvbWVjcDUyMDAuaCBiL2luY2x1ZGUvY29uZmlncy9tZWNwNTIwMC5oCmluZGV4IDBjMTAyOTQuLjQ5OTE5ZmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9tZWNwNTIwMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9tZWNwNTIwMC5oCkBAIC01MCwxMSArNTAsNiBAQAogI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdAkgICAgICovCiAKLSNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQotIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwotI2VuZGlmCi0KIC8qCiAgKiBTZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCiAgKi8KQEAgLTg4LDI2ICs4MywzMiBAQAogLyogVVNCICovCiAjaWYgMAogI2RlZmluZSBDT05GSUdfVVNCX09IQ0kKLSNkZWZpbmUgQUREX1VTQl9DTUQJCUNGR19DTURfVVNCIHwgQ0ZHX0NNRF9GQVQKICNkZWZpbmUgQ09ORklHX1VTQl9TVE9SQUdFCi0jZWxzZQotI2RlZmluZSBBRERfVVNCX0NNRAkJMAogI2VuZGlmCiAKLS8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKLSAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQkgQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJIENGR19DTURfRkFUCXwgXAotCQkJCSBDRkdfQ01EX0VYVDIJfCBcCi0JCQkJIENGR19DTURfSTJDCXwgXAotCQkJCSBDRkdfQ01EX0lERQl8IFwKLQkJCQkgQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJIENGR19DTURfRUxGKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfRVhUMgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX0JTUAorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorCiAKICNpZiAoVEVYVF9CQVNFID09IDB4RkYwMDAwMDApCQkvKiBCb290IGxvdyB3aXRoIDE2IE1CIEZsYXNoICovCiAjICAgZGVmaW5lIENGR19MT1dCT09UCQkxCkBAIC0yNTgsNyArMjU5LDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkgICAgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAgICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KQEAgLTI3Niw2ICsyNzcsMTEgQEAKIAogI2RlZmluZSBDRkdfVlhXT1JLU19NQUNfUFRSCTB4MDAwMDAwMDAJLyogUGFzcyBFdGhlcm5ldCBNQUMgdG8gVnhXb3JrcyAqLwogCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCisjZW5kaWYKKwogLyoKICAqIFZhcmlvdXMgbG93LWxldmVsIHNldHRpbmdzCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9tbDMwMC5oIGIvaW5jbHVkZS9jb25maWdzL21sMzAwLmgKaW5kZXggNjc2MmNkNi4uMDE4MzA0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL21sMzAwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL21sMzAwLmgKQEAgLTg3LDEzICs4NywyOCBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLwogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UJKi8KIAotI2RlZmluZSBSRU1PVkVfQ09NTUFORFMJICAgICAgIChDRkdfQ01EX0ZMQVNIIHwgQ0ZHX0NNRF9MT0FEUyB8IENGR19DTURfRkFUIHwgXAotCQkJCUNGR19DTURfSU1MUyApCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfTkVUKSBcCi0JCQkJJiB+UkVNT1ZFX0NPTU1BTkRTKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisKKyN1bmRlZiBDT05GSUdfQ01EX0ZMQVNICisjdW5kZWYgQ09ORklHX0NNRF9MT0FEUworI3VuZGVmIENPTkZJR19DTURfRkFUCisjdW5kZWYgQ09ORklHX0NNRF9JTUxTCisKIAogLyogI2RlZmluZSBDT05GSUdfU1lTX0NMS19GUkVRIFhQQVJfQ09SRV9DTE9DS19GUkVRX0haICovCiAvKiAzMDAwMDAwMDAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9tbDQwMS5oIGIvaW5jbHVkZS9jb25maWdzL21sNDAxLmgKaW5kZXggM2RiMjg3Ny4uN2VlYWU3MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL21sNDAxLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL21sNDAxLmgKQEAgLTE0NSw4MiArMTQ1LDUwIEBACiAJI2RlZmluZQlDRkdfRkxBU0hfUFJPVEVDVElPTgkJLyogaGFyZHdhcmUgZmxhc2ggcHJvdGVjdGlvbiAqLwogI2VuZGlmIC8qICFGTEFTSCAqLwogCi0jaWZkZWYJRkxBU0gKLQkjaWZkZWYJUkFNRU5WCi0JI2RlZmluZQlDT05GSUdfQ09NTUFORFMJKENPTkZJR19fQ01EX0RGTCB8XAotCQkJCUNGR19DTURfTUVNT1JZIHxcCi0JCQkJQ0ZHX0NNRF9NSVNDIHxcCi0JCQkJQ0ZHX0NNRF9BVVRPU0NSSVBUIHxcCi0JCQkJQ0ZHX0NNRF9JUlEgfFwKLQkJCQlDRkdfQ01EX0FTS0VOViB8XAotCQkJCUNGR19DTURfQkRJIHxcCi0JCQkJQ0ZHX0NNRF9SVU4gfFwKLQkJCQlDRkdfQ01EX0xPQURTIHxcCi0JCQkJQ0ZHX0NNRF9MT0FEQiB8XAotCQkJCUNGR19DTURfSU1JIHxcCi0JCQkJQ0ZHX0NNRF9ORVQgfFwKLQkJCQlDRkdfQ01EX0NBQ0hFIHxcCi0JCQkJQ0ZHX0NNRF9GQVQgfFwKLQkJCQlDRkdfQ01EX0VYVDIgfFwKLQkJCQlDRkdfQ01EX0pGRlMyIHxcCi0JCQkJQ0ZHX0NNRF9FQ0hPIHxcCi0JCQkJQ0ZHX0NNRF9JTUxTIHxcCi0JCQkJQ0ZHX0NNRF9GTEFTSCB8XAotCQkJCUNGR19DTURfTUZTTCB8XAotCQkJCUNGR19DTURfUElORyBcCi0JCQkJKQotCSNlbHNlCS8qICFSQU1FTlYgKi8KLQkjZGVmaW5lCUNPTkZJR19DT01NQU5EUwkoQ09ORklHX19DTURfREZMIHxcCi0JCQkJQ0ZHX0NNRF9NRU1PUlkgfFwKLQkJCQlDRkdfQ01EX01JU0MgfFwKLQkJCQlDRkdfQ01EX0FVVE9TQ1JJUFQgfFwKLQkJCQlDRkdfQ01EX0lSUSB8XAotCQkJCUNGR19DTURfQVNLRU5WIHxcCi0JCQkJQ0ZHX0NNRF9CREkgfFwKLQkJCQlDRkdfQ01EX1JVTiB8XAotCQkJCUNGR19DTURfTE9BRFMgfFwKLQkJCQlDRkdfQ01EX0xPQURCIHxcCi0JCQkJQ0ZHX0NNRF9JTUkgfFwKLQkJCQlDRkdfQ01EX05FVCB8XAotCQkJCUNGR19DTURfQ0FDSEUgfFwKLQkJCQlDRkdfQ01EX0lNTFMgfFwKLQkJCQlDRkdfQ01EX0ZMQVNIIHxcCi0JCQkJQ0ZHX0NNRF9QSU5HIHxcCi0JCQkJQ0ZHX0NNRF9FTlYgfFwKLQkJCQlDRkdfQ01EX0ZBVCB8XAotCQkJCUNGR19DTURfRVhUMiB8XAotCQkJCUNGR19DTURfSkZGUzIgfFwKLQkJCQlDRkdfQ01EX0VDSE8gfFwKLQkJCQlDRkdfQ01EX01GU0wgfFwKLQkJCQlDRkdfQ01EX1NBVkVTIFwKLQkJCQkpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfQVVUT1NDUklQVAorI2RlZmluZSBDT05GSUdfQ01EX0JESQorI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisjZGVmaW5lIENPTkZJR19DTURfRVhUMgorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0lNSQorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX0xPQURCCisjZGVmaW5lIENPTkZJR19DTURfTE9BRFMKKyNkZWZpbmUgQ09ORklHX0NNRF9NRU1PUlkKKyNkZWZpbmUgQ09ORklHX0NNRF9NSVNDCisjZGVmaW5lIENPTkZJR19DTURfTUZTTAorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SVU4KKworI2lmIGRlZmluZWQoRkxBU0gpCisJI2RlZmluZSBDT05GSUdfQ01EX0VDSE8KKwkjZGVmaW5lIENPTkZJR19DTURfRkxBU0gKKwkjZGVmaW5lIENPTkZJR19DTURfSU1MUworCSNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorCisJI2lmICFkZWZpbmVkKFJBTUVOVikKKwkJI2RlZmluZSBDT05GSUdfQ01EX0VOVgorCQkjZGVmaW5lIENPTkZJR19DTURfU0FWRVMKIAkjZW5kaWYKKyNlbmRpZgogCi0jZWxzZQkvKiAhRkxBU0ggKi8KLQkjZGVmaW5lCUNPTkZJR19DT01NQU5EUwkoQ09ORklHX19DTURfREZMIHxcCi0JCQkJQ0ZHX0NNRF9NRU1PUlkgfFwKLQkJCQlDRkdfQ01EX01JU0MgfFwKLQkJCQlDRkdfQ01EX0FVVE9TQ1JJUFQgfFwKLQkJCQlDRkdfQ01EX0lSUSB8XAotCQkJCUNGR19DTURfQVNLRU5WIHxcCi0JCQkJQ0ZHX0NNRF9CREkgfFwKLQkJCQlDRkdfQ01EX1JVTiB8XAotCQkJCUNGR19DTURfTE9BRFMgfFwKLQkJCQlDRkdfQ01EX0ZBVCB8XAotCQkJCUNGR19DTURfRVhUMiB8XAotCQkJCUNGR19DTURfTE9BREIgfFwKLQkJCQlDRkdfQ01EX0lNSSB8XAotCQkJCUNGR19DTURfTkVUIHxcCi0JCQkJQ0ZHX0NNRF9DQUNIRSB8XAotCQkJCUNGR19DTURfTUZTTCB8XAotCQkJCUNGR19DTURfUElORyBcCi0JCQkJKQotI2VuZGlmCS8qICFGTEFTSCAqLwotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSkZGUzIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKQogLyogSkZGUzIgcGFydGl0aW9ucyAqLwogI2RlZmluZSBDT05GSUdfSkZGUzJfQ01ETElORQkvKiBtdGRwYXJ0cyBjb21tYW5kIGxpbmUgc3VwcG9ydCAqLwogI2RlZmluZSBNVERJRFNfREVGQVVMVAkJIm5vcjA9bWw0MDEtMCIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9tb2RuZXQ1MC5oIGIvaW5jbHVkZS9jb25maWdzL21vZG5ldDUwLmgKaW5kZXggMjAyODc2Ny4uNDQ2MWJkZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL21vZG5ldDUwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL21vZG5ldDUwLmgKQEAgLTYzLDEyICs2MywyMyBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMzg0MDAKIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSyAgICAgICAoQ09ORklHX0JPT1RQX0RFRkFVTFR8Q09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9KRkZTMikpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKwogCiAjZGVmaW5lIENPTkZJR19ORVRNQVNLICAgICAgICAgIDI1NS4yNTUuMjU1LjAKICNkZWZpbmUgQ09ORklHX0lQQUREUgkJMTkyLjE2OC4zMC4yCkBAIC04MSw3ICs5Miw3IEBACiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdG0gMHgxMDAyMDAwMCAweDEwMGEwMDAwIgogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MgICAgCSJjb25zb2xlPXR0eVMwLDM4NDAwIGluaXRyZD0weDEwMGEwMDQwLDUzMEsgcm9vdD0vZGV2L3JhbSBrZWVwaW5pdHJkIgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9tb3Rpb25wcm8uaCBiL2luY2x1ZGUvY29uZmlncy9tb3Rpb25wcm8uaAppbmRleCBlMzg5OWE1Li5lMGE4MjdmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvbW90aW9ucHJvLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL21vdGlvbnByby5oCkBAIC0zNywyOCArMzcsMzUgQEAKIAogCiAvKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCisgKiBCT09UUCBvcHRpb25zCiAgKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTwl8IFwKLQkJCQlDRkdfQ01EX0lNTUFQCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfQkVEQlVHCXwgXAotCQkJCUNGR19DTURfTkVUCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX0lERQl8IFwKLQkJCQlDRkdfQ01EX0ZBVAl8IFwKLQkJCQlDRkdfQ01EX0pGRlMyCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0RUVCkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX0lNTUFQCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfQkVEQlVHCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0RUVAogCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvbXAydXNiLmggYi9pbmNsdWRlL2NvbmZpZ3MvbXAydXNiLmgKaW5kZXggMDRmMWYyNC4uZWE1YTQ0YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL21wMnVzYi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9tcDJ1c2IuaApAQCAtMTAxLDEyICsxMDEsMTggQEAKIAogI3VuZGVmCUNPTkZJR19NT0RFTV9TVVBQT1JUCQkvKiBkaXNhYmxlIG1vZGVtIGluaXRpYWxpemF0aW9uIHN0dWZmICovCiAKLSNkZWZpbmUgQ09ORklHX1VTQl9PSENJCQkxCisjZGVmaW5lIENPTkZJR19VU0JfT0hDSV9ORVcJMQogI2RlZmluZSBDT05GSUdfVVNCX0tFWUJPQVJECTEKICNkZWZpbmUgQ09ORklHX1VTQl9TVE9SQUdFCTEKICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04JMQogI2RlZmluZSBDT05GSUdfQVQ5MUNfUFFGUF9VSFBCVUcgMQogCisjdW5kZWYgQ0ZHX1VTQl9PSENJX0JPQVJEX0lOSVQKKyNkZWZpbmUgQ0ZHX1VTQl9PSENJX0NQVV9JTklUCQkxCisjZGVmaW5lIENGR19VU0JfT0hDSV9SRUdTX0JBU0UJCUFUOTFfVVNCX0hPU1RfQkFTRQorI2RlZmluZSBDRkdfVVNCX09IQ0lfU0xPVF9OQU1FCQkiYXQ5MXJtOTIwMCIKKyNkZWZpbmUgQ0ZHX1VTQl9PSENJX01BWF9ST09UX1BPUlRTCTE1CisKICN1bmRlZiBDT05GSUdfSEFSRF9JMkMKIAogI2lmZGVmIENPTkZJR19IQVJEX0kyQwpAQCAtMTIzLDQwICsxMjksNTYgQEAKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZICAgICAgMwogCi0jaWZkZWYgQ09ORklHX0hBUkRfSTJDCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJXAotCQkgICAgICAgKChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCUNGR19DTURfREFURQl8IFwKLQkJCUNGR19DTURfREhDUCAJfCBcCi0JCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCUNGR19DTURfSTJDCXwgXAotCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQlDRkdfQ01EX1NOVFAJfCBcCi0JCQlDRkdfQ01EX01JU0MpKQotI2Vsc2UKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQlcCi0JCSAgICAgICAoKENPTkZJR19DTURfREZMCXwgXAotCQkJQ0ZHX0NNRF9ESENQIAl8IFwKLQkJCUNGR19DTURfTkZTCXwgXAotCQkJQ0ZHX0NNRF9TTlRQCXwgXAotCQkJQ0ZHX0NNRF9VU0IgICAgICB8IFwKLQkJCUNGR19DTURfQ0FDSEUpCSYgXAotCQkgICAgICB+KENGR19DTURfQkRJIHwgXAotCQkJQ0ZHX0NNRF9JTUkgfCBcCi0JCQlDRkdfQ01EX0FVVE9TQ1JJUFQgfCBcCi0JCQlDRkdfQ01EX0ZQR0EgfCBcCi0JCQlDRkdfQ01EX01JU0MgfCBcCi0JCQlDRkdfQ01EX0xPQURTICkpCisjaWYgIWRlZmluZWQoQ09ORklHX0hBUkRfSTJDKQogI2RlZmluZSBDT05GSUdfVElNRVNUQU1QCiAjZW5kaWYKLSNkZWZpbmUgQ0ZHX0xPTkdIRUxQCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKKyNpZiBkZWZpbmVkKENPTkZJR19IQVJEX0kyQykKKworICAgICNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyAgICAjZGVmaW5lIENPTkZJR19DTURfTUlTQworCisjZWxzZQorCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1VTQgorICAgICNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorCisgICAgI3VuZGVmIENPTkZJR19DTURfQVVUT1NDUklQVAorICAgICN1bmRlZiBDT05GSUdfQ01EX0JESQorICAgICN1bmRlZiBDT05GSUdfQ01EX0ZQR0EKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9JTUkKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9MT0FEUworICAgICN1bmRlZiBDT05GSUdfQ01EX01JU0MKKworI2VuZGlmCisKKworI2RlZmluZSBDRkdfTE9OR0hFTFAKIAogI2RlZmluZSBDT05GSUdfTlJfRFJBTV9CQU5LUwkxCiAjZGVmaW5lIFBIWVNfU0RSQU0JCTB4MjAwMDAwMDAKLSNkZWZpbmUgUEhZU19TRFJBTV9TSVpFCQkweDA4MDAwMDAwIAkvKiAxMjggbWVncyAqLworI2RlZmluZSBQSFlTX1NEUkFNX1NJWkUJCTB4MDgwMDAwMDAJLyogMTI4IG1lZ3MgKi8KIAogI2RlZmluZSBDRkdfTUVNVEVTVF9TVEFSVAlQSFlTX1NEUkFNCiAjZGVmaW5lIENGR19NRU1URVNUX0VORAkJQ0ZHX01FTVRFU1RfU1RBUlQgKyBQSFlTX1NEUkFNX1NJWkUgLSAyNjIxNDQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9tcGM3NDQ4aHBjMi5oIGIvaW5jbHVkZS9jb25maWdzL21wYzc0NDhocGMyLmgKaW5kZXggMjQzYTNmNi4uZjRmMzNmMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL21wYzc0NDhocGMyLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL21wYzc0NDhocGMyLmgKQEAgLTE0NiwyNSArMTQ2LDM0IEBACiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCS8qIHdhdGNoZG9nIGRpc2FibGVkICovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgXAotCQkJCUNPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAoQ09ORklHX0NNRF9ERkwgXAotCQl8IENGR19DTURfQVNLRU5WIFwKLQkJfCBDRkdfQ01EX0NBQ0hFIFwKLQkJfCBDRkdfQ01EX1BDSSBcCi0JCXwgQ0ZHX0NNRF9JMkMgXAotCQl8IENGR19DTURfU0RSQU0gXAotCQl8IENGR19DTURfRUVQUk9NIFwKLQkJfCBDRkdfQ01EX0ZMQVNIIFwKLQkJfCBDRkdfQ01EX0VOViBcCi0JCXwgQ0ZHX0NNRF9CU1AgXAotCQl8IENGR19DTURfREhDUCBcCi0JCXwgQ0ZHX0NNRF9QSU5HIFwKLQkJfCBDRkdfQ01EX0RBVEUpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfRU5WCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisKIAogLypzZXQgZGF0ZSBpbiB1LWJvb3QqLwogI2RlZmluZSBDT05GSUdfUlRDX000OFQzNUEKQEAgLTE4Miw3ICsxOTEsNyBAQAogI2RlZmluZSBDRkdfTE9OR0hFTFAJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5ICovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxMTUyMDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgYXQgKi8KICNlbHNlCkBAIC0zNjYsOSArMzc1LDkgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEZMQVNIIG9yZ2FuaXphdGlvbgogICovCi0jZGVmaW5lIENGR19NQVhfRkxBU0hfQkFOS1MJMS8qIEZsYXNoIGNhbiBiZSBhdCBvbmUgb2YgdHdvIGFkZHJlc3NlcyAqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX0JBTktTCTEJCS8qIEZsYXNoIGNhbiBiZSBhdCBvbmUgb2YgdHdvIGFkZHJlc3NlcyAqLwogI2RlZmluZSBGTEFTSF9CQU5LX1NJWkUJCTB4MDEwMDAwMDAJLyogMTYgTUIgVG90YWwgKi8KLSNkZWZpbmUgQ0ZHX0ZMQVNIX0JBTktTX0xJU1Qge0NGR19GTEFTSF9CQVNFLCBDRkdfRkxBU0hfQkFTRTJ9CisjZGVmaW5lIENGR19GTEFTSF9CQU5LU19MSVNUCXsgQ0ZHX0ZMQVNIX0JBU0UsIC8qIENGR19GTEFTSF9CQVNFMiAqLyB9CiAKICNkZWZpbmUgQ0ZHX0ZMQVNIX0NGSV9EUklWRVIKICNkZWZpbmUgQ0ZHX0ZMQVNIX0NGSQpAQCAtMzg3LDcgKzM5Niw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBhbGwgTVBDNzR4eCBDUFVzICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL214MWFkcy5oIGIvaW5jbHVkZS9jb25maWdzL214MWFkcy5oCmluZGV4IDdmM2RmZDUuLjUxMjViMjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9teDFhZHMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvbXgxYWRzLmgKQEAgLTc4LDI1ICs3OCwzMiBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29tbWFuZCBkZWZpbml0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTIFwKLQkJCShDT05GSUdfQ01EX0RGTAkgfCBcCi0JCQlDRkdfQ01EX0NBQ0hFCSB8IFwKLQkJCUNGR19DTURfUkVHSU5GTwkgfCBcCi0JCQlDRkdfQ01EX0VMRikKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MJCSJyb290PS9kZXYvbXNkayBtZW09NDhNIgogI2RlZmluZSBDT05GSUdfQk9PVEZJTEUJCSJteDFhZHMiCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkidGZ0cDsgYm9vdG0iCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxMTUyMDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAJCQkJCQkvKiB3aGF0J3MgdGhpcyA/IGl0J3Mgbm90IHVzZWQgYW55d2hlcmUgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTEJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL214MWZzMi5oIGIvaW5jbHVkZS9jb25maWdzL214MWZzMi5oCmluZGV4IDk4MTZiZTguLmQ1MjdkMDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9teDFmczIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvbXgxZnMyLmgKQEAgLTM0LDIyICszNCwzMCBAQAogI3VuZGVmCV9DT05GSUdfVUFSVDQgLyogaW50ZXJuYWwgdWFydCA0ICovCiAjdW5kZWYJQ09ORklHX1NJTEVOVF9DT05TT0xFICAvKiB1c2UgdGhpcyB0byBkaXNhYmxlIG91dHB1dCAqLwogCi0vKgotICogRGVmaW5pdGlvbiBvZiB1LWJvb3QgYnVpbGQgaW4gY29tbWFuZHMuIENoZWNrIG91dCBDT05GSUdfQ01EX0RGTCBpZgotICogbmVjY2Vzc2FyeSBpbiBpbmNsdWRlL2NtZF9jb25mZGVmcy5oIGZpbGUuIChVbiljb21tZW50IGZvciBnZXR0aW5nCi0gKiBmdW5jdGlvbmFsaXR5IG9yIHNpemUgb2YgdS1ib290IGNvZGUuCi0gKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwJCSBcCi0JCQkJJiB+Q0ZHX0NNRF9MT0FEUwkgXAotCQkJCSYgfkNGR19DTURfQ09OU09MRQkgXAotCQkJCSYgfkNGR19DTURfQVVUT1NDUklQVAkgXAotCQkJCSYgfkNGR19DTURfTkVUCQkgXAotCQkJCSYgfkNGR19DTURfUElORwkJIFwKLQkJCQkmIH5DRkdfQ01EX0RIQ1AJCSBcCi0JCQkJfCBDRkdfQ01EX0pGRlMyCQkgXAotCQkJCSkKIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjdW5kZWYgQ09ORklHX0NNRF9DT05TT0xFCisjdW5kZWYgQ09ORklHX0NNRF9BVVRPU0NSSVBUCisjdW5kZWYgQ09ORklHX0NNRF9ORVQKKyN1bmRlZiBDT05GSUdfQ01EX1BJTkcKKyN1bmRlZiBDT05GSUdfQ01EX0RIQ1AKKwogCiAvKgogICogQm9vdCBvcHRpb25zLiBTZXR0aW5nIGRlbGF5IHRvIC0xIHN0b3BzIGF1dG9zdGFydCBjb3VudCBkb3duLgpAQCAtMTYwLDcgKzE2OCw3IEBACiAgKiBSaWdodCBub3cgdGhlcmUgaXMgbm8gZ2FpbiBmb3IgdXNlciwgYnV0IGxhdGVyIG9uIGJvb3Rpbmcga2VybmVsIG1pZ2h0IGJlCiAgKiBwb3NzaWJsZS4gQ29uc2lkZXIgdXNpbmcgWElQIGtlcm5lbCBydW5uaW5nIGZyb20gZmxhc2ggdG8gc2F2ZSBSQU0KICAqIGZvb3RwcmludC4KLSAqIE5PVEU6IEVuYWJsZSBDRkdfQ01EX0pGRlMyIGZvciBKRkZTMiBzdXBwb3J0LgorICogTk9URTogRW5hYmxlIENPTkZJR19DTURfSkZGUzIgZm9yIEpGRlMyIHN1cHBvcnQuCiAgKi8KIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9uZXRzdGFyLmggYi9pbmNsdWRlL2NvbmZpZ3MvbmV0c3Rhci5oCmluZGV4IDY5Nzc5NmEuLjMzMTU5ZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9uZXRzdGFyLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL25ldHN0YXIuaApAQCAtMTQwLDQzICsxNDAsMzggQEAKICNkZWZpbmUgTVRESURTX0RFRkFVTFQJCSJub3IwPW9tYXBmbGFzaC4wLG5hbmQwPW9tYXBuYW5kLjAiCiAjZGVmaW5lIE1URFBBUlRTX0RFRkFVTFQJIm10ZHBhcnRzPW9tYXBmbGFzaC4wOjhrQDE2ayhlbnYpLDhrKHJfZW52KSw0NDhrQDU3NmsodS1ib290KTtvbWFwbmFuZC4wOjQ4TShyb290ZnMwKSw0OE0ocm9vdGZzMSksLShkYXRhKSIKIAotI2lmIDAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ0ZHX0NNRF9CREkgICAgfCBcCi0JCQkJIENGR19DTURfQk9PVEQgIHwgXAotCQkJCSBDRkdfQ01EX0RIQ1AgICB8IFwKLQkJCQkgQ0ZHX0NNRF9FTlYJfCBcCi0JCQkJIENGR19DTURfRkxBU0ggIHwgXAotCQkJCSBDRkdfQ01EX0lNSSAgICB8IFwKLQkJCQkgQ0ZHX0NNRF9MT0FEQiAgfCBcCi0JCQkJIENGR19DTURfTkVUICAgIHwgXAotCQkJCSBDRkdfQ01EX01FTU9SWSB8IFwKLQkJCQkgQ0ZHX0NNRF9QSU5HICAgfCBcCi0JCQkJIENGR19DTURfUlVOKQogCi0jZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDRkdfQ01EX0JESSAgICB8IFwKLQkJCQkgQ0ZHX0NNRF9CT09URCAgfCBcCi0JCQkJIENGR19DTURfREhDUCAgIHwgXAotCQkJCSBDRkdfQ01EX0VOVgl8IFwKLQkJCQkgQ0ZHX0NNRF9GTEFTSCAgfCBcCi0JCQkJIENGR19DTURfTkFORAl8IFwKLQkJCQkgQ0ZHX0NNRF9JTUkgICAgfCBcCi0JCQkJIENGR19DTURfSkZGUzIJfCBcCi0JCQkJIENGR19DTURfTE9BREIgIHwgXAotCQkJCSBDRkdfQ01EX05FVCAgICB8IFwKLQkJCQkgQ0ZHX0NNRF9NRU1PUlkgfCBcCi0JCQkJIENGR19DTURfUElORyAgIHwgXAotCQkJCSBDRkdfQ01EX1JVTikKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworCisjZGVmaW5lIENPTkZJR19DTURfQkRJCisjZGVmaW5lIENPTkZJR19DTURfQk9PVEQKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRU5WCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gKKyNkZWZpbmUgQ09ORklHX0NNRF9JTUkKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX0xPQURCCisjZGVmaW5lIENPTkZJR19DTURfTUVNT1JZCisjZGVmaW5lIENPTkZJR19DTURfTkFORAorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SVU4KKwogCiAjZGVmaW5lIENPTkZJR19KRkZTMl9OQU5ECTEJLyogamZmczIgb24gbmFuZCBzdXBwb3J0ICovCi0jZW5kaWYKIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwlDT05GSUdfQk9PVFBfREVGQVVMVAorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisKICNkZWZpbmUgQ09ORklHX0xPT1BXCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKICNkZWZpbmUgQ09ORklHX1pFUk9fQk9PVERFTEFZX0NIRUNLCS8qIGFsbG93IHRvIGJyZWFrIGluIGFsd2F5cyAqLwogI3VuZGVmICBDT05GSUdfQk9PVEFSR1MJCS8qIHRoZSBib290IGNvbW1hbmQgd2lsbCBzZXQgYm9vdGFyZ3MqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL25zOTc1MGRldi5oIGIvaW5jbHVkZS9jb25maWdzL25zOTc1MGRldi5oCmluZGV4IDBiMTU0MWQuLjFkNjkxZjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9uczk3NTBkZXYuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvbnM5NzUwZGV2LmgKQEAgLTY5LDMzICs2OSwyOCBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMzg0MDAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb21tYW5kIGRlZmluaXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZiAwIC8qIEBUT0RPICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyBcCi0JCQkoQ09ORklHX0NNRF9ERkwJIHwgXAotCQkJQ0ZHX0NNRF9DQUNIRQkgfCBcCi0JCQkvKkNGR19DTURfTkFORAkgfCovIFwKLQkJCS8qQ0ZHX0NNRF9FRVBST00gfCovIFwKLQkJCS8qQ0ZHX0NNRF9JMkMJIHwqLyBcCi0JCQkvKkNGR19DTURfVVNCCSB8Ki8gXAotCQkJQ0ZHX0NNRF9SRUdJTkZPICB8IFwKLQkJCUNGR19DTURfREFURQkgfCBcCi0JCQlDRkdfQ01EX0VMRikKLSNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyBcCi0JCQkoQ09ORklHX0NNRF9CREkgfCBcCi0JCQlDRkdfQ01EX05FVCB8IFwKLQkJCUNGR19DTURfUElORwkgfCBcCi0JCQlDRkdfQ01EX0NPTlNPTEUJIHwgXAotCQkJQ0ZHX0NNRF9MT0FEQgkgfCBcCi0JCQlDRkdfQ01EX0xPQURTCSB8IFwKLQkJCUNGR19DTURfTUVNT1JZKQotI2VuZGlmCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisKKyNkZWZpbmUgQ09ORklHX0NNRF9CREkKKyNkZWZpbmUgQ09ORklHX0NNRF9DT05TT0xFCisjZGVmaW5lIENPTkZJR19DTURfTE9BREIKKyNkZWZpbmUgQ09ORklHX0NNRF9MT0FEUworI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwogLyojZGVmaW5lIENPTkZJR19CT09UQVJHUyAgICAJInJvb3Q9cmFtZnMgZGV2ZnM9bW91bnQgY29uc29sZT10dHlTQTAsOTYwMCIgKi8KQEAgLTEwOCw3ICsxMDMsNyBAQAogLyojZGVmaW5lIENPTkZJR19CT09URklMRQkiZWxpbm9zLWxhcnQiICovCiAvKiNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJ0ZnRwOyBib290bSIgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTExNTIwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KIC8qIHdoYXQncyB0aGlzID8gaXQncyBub3QgdXNlZCBhbnl3aGVyZSAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMQkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvbzJkbnQuaCBiL2luY2x1ZGUvY29uZmlncy9vMmRudC5oCmluZGV4IDYzZDBkYTcuLmYxZDczZTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9vMmRudC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9vMmRudC5oCkBAIC0zNywxMSArMzcsNiBAQAogI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdAkgICAgICovCiAKLSNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQotIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwotI2VuZGlmCi0KIC8qCiAgKiBTZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCiAgKi8KQEAgLTczLDggKzY4LDYgQEAKICNkZWZpbmUgQ0ZHX1JYX0VUSF9CVUZGRVIJOCAgLyogdXNlIDggcnggYnVmZmVyIG9uIGVlcHJvMTAwICAqLwogI2RlZmluZSBDT05GSUdfTlM4MzgyWAkJMQogCi0jZGVmaW5lIEFERF9QQ0lfQ01EIAkJQ0ZHX0NNRF9QQ0kKLQogLyogUGFydGl0aW9ucyAqLwogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgpAQCAtODIsMjAgKzc1LDI5IEBACiAKICNkZWZpbmUgQ09ORklHX1RJTUVTVEFNUAkvKiBQcmludCBpbWFnZSBpbmZvIHdpdGggdGltZXN0YW1wICovCiAKLS8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKLSAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0ZBVAl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQUREX1BDSV9DTUQJKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorCiAKICNpZiAoVEVYVF9CQVNFID09IDB4RkYwMDAwMDApCQkvKiBCb290IGxvdyB3aXRoIDE2IE1CIEZsYXNoICovCiAjICAgZGVmaW5lIENGR19MT1dCT09UCQkxCkBAIC0yNDYsNyArMjQ4LDcgQEAKICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJICAgICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgICAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KQEAgLTI2Miw2ICsyNjQsMTEgQEAKIAogI2RlZmluZSBDRkdfSFoJCQkxMDAwCS8qIGRlY3JlbWVudGVyIGZyZXE6IDEgbXMgdGlja3MgKi8KIAorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLworI2VuZGlmCisKIC8qCiAgKiBWYXJpb3VzIGxvdy1sZXZlbCBzZXR0aW5ncwogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvb2NvdGVhLmggYi9pbmNsdWRlL2NvbmZpZ3Mvb2NvdGVhLmgKaW5kZXggZmU0ZTYzOC4uYmMyZmQzMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL29jb3RlYS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9vY290ZWEuaApAQCAtNDEsNiArNDEsNyBAQAogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNkZWZpbmUgQ09ORklHX09DT1RFQQkJMQkgICAgLyogQm9hcmQgaXMgZWJvbnkJCSovCiAjZGVmaW5lIENPTkZJR180NDBHWAkJMQkgICAgLyogU3BlY2lmYyBHWCBzdXBwb3J0CSovCisjZGVmaW5lIENPTkZJR180NDAJCTEJICAgIC8qIC4uLiBQUEM0NDAgZmFtaWx5CSovCiAjZGVmaW5lIENPTkZJR180eHgJCTEJICAgIC8qIC4uLiBQUEM0eHggZmFtaWx5CSovCiAjZGVmaW5lIENPTkZJR19CT0FSRF9FQVJMWV9JTklUX0YgMQkgICAgLyogQ2FsbCBib2FyZF9wcmVfaW5pdAkqLwogI3VuZGVmCUNGR19EUkFNX1RFU1QJCQkgICAgLyogRGlzYWJsZS10YWtlcyBsb25nIHRpbWUhICovCkBAIC0xMzYsNyArMTM3LDcgQEAKICNkZWZpbmUgQ0ZHX0ZMQVNIX1dPUkRfU0laRSAgICAgdW5zaWduZWQgY2hhcgogCiAjaWZkZWYgQ0ZHX0VOVl9JU19JTl9GTEFTSAotI2RlZmluZSBDRkdfRU5WX1NFQ1RfU0laRQkweDEwMDAwIAkvKiBzaXplIG9mIG9uZSBjb21wbGV0ZSBzZWN0b3IJKi8KKyNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJMHgxMDAwMAkJLyogc2l6ZSBvZiBvbmUgY29tcGxldGUgc2VjdG9yCSovCiAjZGVmaW5lIENGR19FTlZfQUREUgkJKENGR19NT05JVE9SX0JBU0UtQ0ZHX0VOVl9TRUNUX1NJWkUpCiAjZGVmaW5lCUNGR19FTlZfU0laRQkJMHg0MDAwCS8qIFRvdGFsIFNpemUgb2YgRW52aXJvbm1lbnQgU2VjdG9yCSovCiAKQEAgLTIzMSwyNiArMjMyLDM4IEBACiAKICNkZWZpbmUgQ09ORklHX05FVENPTlNPTEUJCS8qIGluY2x1ZGUgTmV0Q29uc29sZSBzdXBwb3J0CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RJQUcJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTwl8IFwKLQkJCQlDRkdfQ01EX1NEUkFNCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtMjU5LDcgKzI3Miw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI5Myw3ICszMDYsNiBAQAogI2RlZmluZSBDRkdfUENJX1RBUkdCQVNFICAgIDB4ODAwMDAwMDAJLyogUENJYWRkciBtYXBwZWQgdG8gQ0ZHX1BDSV9NRU1CQVNFICovCiAKIC8qIEJvYXJkLXNwZWNpZmljIFBDSSAqLwotI2RlZmluZSBDRkdfUENJX1BSRV9JTklUCQkvKiBlbmFibGUgYm9hcmQgcGNpX3ByZV9pbml0KCkJKi8KICNkZWZpbmUgQ0ZHX1BDSV9UQVJHRVRfSU5JVAkJLyogbGV0IGJvYXJkIGluaXQgcGNpIHRhcmdldCAgICAqLwogCiAjZGVmaW5lIENGR19QQ0lfU1VCU1lTX1ZFTkRPUklEIDB4MTBlOAkvKiBBTUNDICovCkBAIC0zMTAsNyArMzIyLDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTMyNzY4CS8qIEZvciBBTUNDIDQ0MCBDUFVzCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtMzIyLDcgKzMzNCw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvb21hcDE1MTBpbm4uaCBiL2luY2x1ZGUvY29uZmlncy9vbWFwMTUxMGlubi5oCmluZGV4IDAxNmQzZDguLjg2MjNlZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9vbWFwMTUxMGlubi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9vbWFwMTUxMGlubi5oCkBAIC04NiwxMSArODYsMjQgQEAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKICNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwIH0KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTCB8IENGR19DTURfREhDUCkKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJQ09ORklHX0JPT1RQX0RFRkFVTFQKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisKKwogI2luY2x1ZGUgPGNvbmZpZ3Mvb21hcDE1MTAuaD4KIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKQEAgLTk4LDcgKzExMSw3IEBACiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdHA7dGZ0cDtib290bSIKICNkZWZpbmUgQ0ZHX0FVVE9MT0FECQkibiIJCS8qIE5vIGF1dG9sb2FkICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxMTUyMDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAvKiB3aGF0J3MgdGhpcyA/IGl0J3Mgbm90IHVzZWQgYW55d2hlcmUgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTEJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL29tYXAxNjEwaDIuaCBiL2luY2x1ZGUvY29uZmlncy9vbWFwMTYxMGgyLmgKaW5kZXggYzZjYTY4OS4uNzRiYmEwNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL29tYXAxNjEwaDIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvb21hcDE2MTBoMi5oCkBAIC04MSwxMSArODEsMjQgQEAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCTExNTIwMAogI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX0RIQ1ApCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCUNPTkZJR19CT09UUF9ERUZBVUxUCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorCisKICNpbmNsdWRlIDxjb25maWdzL29tYXAxNTEwLmg+CiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCkBAIC05Myw3ICsxMDYsNyBAQAogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQgICAgICAiYm9vdHA7dGZ0cDtib290bSIKICNkZWZpbmUgQ0ZHX0FVVE9MT0FEICAgICAgICAgICAgIm4iICAgICAgICAgICAgIC8qIE5vIGF1dG9sb2FkICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxMTUyMDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTEJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9vbWFwMTYxMGlubi5oIGIvaW5jbHVkZS9jb25maWdzL29tYXAxNjEwaW5uLmgKaW5kZXggZjI4ZWRlMC4uNzM0ZjM1NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL29tYXAxNjEwaW5uLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL29tYXAxNjEwaW5uLmgKQEAgLTgyLDExICs4MiwyNCBAQAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJMTE1MjAwCiAjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCShDT05GSUdfQ01EX0RGTCB8IENGR19DTURfREhDUCkKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJQ09ORklHX0JPT1RQX0RFRkFVTFQKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisKKwogI2luY2x1ZGUgPGNvbmZpZ3Mvb21hcDE1MTAuaD4KIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKQEAgLTk4LDcgKzExMSw3IEBACiAjZGVmaW5lIENPTkZJR19TRVJWRVJJUAkxNTYuMTE3Ljk3LjEzOQkvKiBjdXJyZW50IElQIG9mIG15IGRldiBwYyAqLwogI2RlZmluZSBDT05GSUdfQk9PVEZJTEUJInVJbWFnZSIJLyogZmlsZSB0byBsb2FkICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxMTUyMDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTEJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9vbWFwMjQyMGg0LmggYi9pbmNsdWRlL2NvbmZpZ3Mvb21hcDI0MjBoNC5oCmluZGV4IDU4Mzc0NjEuLjhhZThlZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9vbWFwMjQyMGg0LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL29tYXAyNDIwaDQuaApAQCAtMTE5LDE1ICsxMTksMzQgQEAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFICAgICAgICAgIDExNTIwMAogI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUgICAgICAgezk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMH0KIAotI2lmZGVmIENGR19OQU5EX0JPT1QKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgICAgIChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfREhDUCB8IENGR19DTURfSTJDIHwgQ0ZHX0NNRF9OQU5EIHwgQ0ZHX0NNRF9KRkZTMikKLSNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyAgICAgICAgICAoKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9ESENQIHwgQ0ZHX0NNRF9JMkMgfCBDRkdfQ01EX0pGRlMyKSAmIH5DRkdfQ01EX0FVVE9TQ1JJUFQpCi0jZW5kaWYKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sgICAgICAgIENPTkZJR19CT09UUF9ERUZBVUxUCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjaWZkZWYgQ0ZHX05BTkRfQk9PVAorICAgICNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0kyQworICAgICNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECisgICAgI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZWxzZQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0kyQworICAgICNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorCisgICAgI3VuZGVmIENPTkZJR19DTURfQVVUT1NDUklQVAorI2VuZGlmCisKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisKIAogLyoKICAqICBCb2FyZCBOQU5EIEluZm8uCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvb21hcDU5MTJvc2suaCBiL2luY2x1ZGUvY29uZmlncy9vbWFwNTkxMm9zay5oCmluZGV4IDVkYjRmNTIuLjE2Y2UyZjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9vbWFwNTkxMm9zay5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9vbWFwNTkxMm9zay5oCkBAIC04NiwxMSArODYsMjQgQEAKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCTExNTIwMAogI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX0RIQ1ApCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCUNPTkZJR19CT09UUF9ERUZBVUxUCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorCisKICNpbmNsdWRlIDxjb25maWdzL29tYXAxNTEwLmg+CiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCkBAIC0xMDIsNyArMTE1LDcgQEAKICNkZWZpbmUgQ09ORklHX1NFUlZFUklQCTE1Ni4xMTcuOTcuMTM5CS8qIGN1cnJlbnQgSVAgb2YgbXkgZGV2IHBjICovCiAjZGVmaW5lIENPTkZJR19CT09URklMRQkidUltYWdlIgkvKiBmaWxlIHRvIGxvYWQgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTExNTIwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL29tYXA3MzBwMi5oIGIvaW5jbHVkZS9jb25maWdzL29tYXA3MzBwMi5oCmluZGV4IGZkYTU1Y2YuLmM0ZDI1M2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9vbWFwNzMwcDIuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvb21hcDczMHAyLmgKQEAgLTkwLDE0ICs5MCwyNCBAQAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCSAgIDExNTIwMAogI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJICAgeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJICAgKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9ESENQKQotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkgICBDT05GSUdfQk9PVFBfREVGQVVMVAogCiAvKgotICogVGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KQorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCiAgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKworCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKworCiAjaW5jbHVkZSA8Y29uZmlncy9vbWFwNzMwLmg+CiAjaW5jbHVkZSA8Y29uZmlncy9oMl9wMl9kYmdfYm9hcmQuaD4KIApAQCAtMTEyLDcgKzEyMiw3IEBACiAjZGVmaW5lIENPTkZJR19TRVJWRVJJUAkJICAgMTkyLjE1MC4wLjEwMAogI2RlZmluZSBDT05GSUdfQk9PVEZJTEUJCSAgICJ1SW1hZ2UiICAvKiBGaWxlIHRvIGxvYWQgKi8KIAotI2lmIGRlZmluZWQgKENPTkZJR19DT01NQU5EUykgJiYgZGVmaW5lZCAoQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkgICAxMTUyMDAgICAgLyogU3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCSAgIDEJICAgICAvKiBXaGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3AzbXguaCBiL2luY2x1ZGUvY29uZmlncy9wM214LmgKaW5kZXggNTQ0NjJmMC4uOGFlMzhjYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3AzbXguaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvcDNteC5oCkBAIC0yNTEsMjYgKzI1MSwzNiBAQAogI2VuZGlmCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCS8qIGF1dG9ib290IGFmdGVyIDUgc2Vjb25kcyAqLwotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBcCi0JCQkJIENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RJQUcJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTwl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX0NBQ0hFICAgfCBcCi0JCQkJQ0ZHX0NNRF9TRFJBTSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKQEAgLTI4MCw3ICsyOTAsNyBAQAogCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSAgICAgICAgIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJICAgICAgICAxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCSAgICAgICAgMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC00MjEsNyArNDMxLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIGFsbCBNUEM3NHh4IENQVXMJCSAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9wM3A0NDAuaCBiL2luY2x1ZGUvY29uZmlncy9wM3A0NDAuaAppbmRleCBhYTA5MDFmLi41MWYxOWExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvcDNwNDQwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3AzcDQ0MC5oCkBAIC0zNSw2ICszNSw3IEBACiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2RlZmluZSBDT05GSUdfUDNQNDQwCQkxCSAgICAvKiBCb2FyZCBpcyBQM1A0NDAJCSovCiAjZGVmaW5lIENPTkZJR180NDBHUAkJMQkgICAgLyogU3BlY2lmYyBHUCBzdXBwb3J0CSovCisjZGVmaW5lIENPTkZJR180NDAJCTEJICAgIC8qIC4uLiBQUEM0NDAgZmFtaWx5CSovCiAjZGVmaW5lIENPTkZJR180eHgJCTEJICAgIC8qIC4uLiBQUEM0eHggZmFtaWx5CSovCiAjZGVmaW5lIENPTkZJR19CT0FSRF9FQVJMWV9JTklUX0YgMQkgICAgLyogQ2FsbCBib2FyZF9lYXJseV9pbml0X2YJKi8KICNkZWZpbmUgQ09ORklHX01JU0NfSU5JVF9SCTEJICAgIC8qIENhbGwgbWlzY19pbml0X3IJCSovCkBAIC0xNjcsMjUgKzE2OCwzNyBAQAogCiAjZGVmaW5lIENPTkZJR19ORVRDT05TT0xFCQkvKiBpbmNsdWRlIE5ldENvbnNvbGUgc3VwcG9ydAkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9ESUFHCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkVUCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX1JFR0lORk8JfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtMTk0LDcgKzIwNyw3IEBACiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjI2LDcgKzIzOSw2IEBACiAjZGVmaW5lIENGR19QQ0lfVEFSR0JBU0UgICAgMHg4MDAwMDAwMCAgLyogUENJYWRkciBtYXBwZWQgdG8gQ0ZHX1BDSV9NRU1CQVNFICovCiAKIC8qIEJvYXJkLXNwZWNpZmljIFBDSSAqLwotI2RlZmluZSBDRkdfUENJX1BSRV9JTklUICAgICAgICAgICAgICAgIC8qIGVuYWJsZSBib2FyZCBwY2lfcHJlX2luaXQoKSAgKi8KICNkZWZpbmUgQ0ZHX1BDSV9UQVJHRVRfSU5JVAkgICAgICAgICAgICAvKiBsZXQgYm9hcmQgaW5pdCBwY2kgdGFyZ2V0ICAgICovCiAKICNkZWZpbmUgQ09ORklHX0RJU0FCTEVfUElTRV9URVNUCS8qIGRpc2FibGUgUElTRSB0ZXN0IChQQ0lYIG9ubHkpKi8KQEAgLTI4NSw3ICsyOTcsNyBAQAogCiAjZGVmaW5lIENGR19FTlZfSVNfSU5fRkxBU0ggICAgIDEJLyogdXNlIEZMQVNIIGZvciBlbnZpcm9ubWVudCB2YXJzCSovCiAKLSNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJMHgyMDAwMCAJLyogc2l6ZSBvZiBvbmUgY29tcGxldGUgc2VjdG9yCSovCisjZGVmaW5lIENGR19FTlZfU0VDVF9TSVpFCTB4MjAwMDAJLyogc2l6ZSBvZiBvbmUgY29tcGxldGUgc2VjdG9yCQkqLwogI2RlZmluZSBDRkdfRU5WX0FERFIJCShDRkdfTU9OSVRPUl9CQVNFLUNGR19FTlZfU0VDVF9TSVpFKQogI2RlZmluZQlDRkdfRU5WX1NJWkUJCTB4MjAwMAkvKiBUb3RhbCBTaXplIG9mIEVudmlyb25tZW50IFNlY3RvcgkqLwogCkBAIC0zMDQsNyArMzE2LDcgQEAKICAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCSgzMjw8MTApCS8qIEZvciBBTUNDIDQwNSBDUFVzCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKQEAgLTMxNiw3ICszMjgsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNICSovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290CQkJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3BiMXgwMC5oIGIvaW5jbHVkZS9jb25maWdzL3BiMXgwMC5oCmluZGV4IGVkMTg5M2YuLjgxMGUwZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9wYjF4MDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvcGIxeDAwLmgKQEAgLTEzMiwxMSArMTMyLDggQEAKIC8qLS0tVVNCIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2lmIDAKICNkZWZpbmUgQ09ORklHX1VTQl9PSENJCi0jZGVmaW5lIEFERF9VU0JfQ01EICAgICAgICAgICAgIENGR19DTURfVVNCIHwgQ0ZHX0NNRF9GQVQKICNkZWZpbmUgQ09ORklHX1VTQl9TVE9SQUdFCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCi0jZWxzZQotI2RlZmluZSBBRERfVVNCX0NNRCAgICAgICAgICAgICAwCiAjZW5kaWYKIAogLyotLS1BVEEgUENNQ0lBIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0xNzksMTEgKzE3NiwzNiBAQAogI2RlZmluZSBDRkdfSUNBQ0hFX1NJWkUJCTE2Mzg0CiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwlcCi0gICgoKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9ESENQIHwgQ0ZHX0NNRF9FTEYgfCBDRkdfQ01EX01JSSB8IENGR19DTURfUElORykgJiBcCi0gfihDRkdfQ01EX0VOViB8IENGR19DTURfRkFUIHwgQ0ZHX0NNRF9GTEFTSCB8IENGR19DTURfRlBHQSB8IENGR19DTURfSURFIHwgXAotICAgQ0ZHX0NNRF9MT0FEUyB8IENGR19DTURfUlVOIHwgQ0ZHX0NNRF9MT0FEQiB8IENGR19DTURfRUxGIHwgXAotICAgQ0ZHX0NNRF9CREkgfCBDRkdfQ01EX0JFREJVRykpIHwgQUREX1VTQl9DTUQpCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUElORworCisjdW5kZWYgQ09ORklHX0NNRF9FTlYKKyN1bmRlZiBDT05GSUdfQ01EX0ZBVAorI3VuZGVmIENPTkZJR19DTURfRkxBU0gKKyN1bmRlZiBDT05GSUdfQ01EX0ZQR0EKKyN1bmRlZiBDT05GSUdfQ01EX0lERQorI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyN1bmRlZiBDT05GSUdfQ01EX1JVTgorI3VuZGVmIENPTkZJR19DTURfTE9BREIKKyN1bmRlZiBDT05GSUdfQ01EX0VMRgorI3VuZGVmIENPTkZJR19DTURfQkRJCisjdW5kZWYgQ09ORklHX0NNRF9CRURCVUcKIAogI2VuZGlmCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9wY3M0NDBlcC5oIGIvaW5jbHVkZS9jb25maWdzL3BjczQ0MGVwLmgKaW5kZXggMjNiZGZjOC4uOGU1MWQyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3BjczQ0MGVwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3BjczQ0MGVwLmgKQEAgLTMyLDYgKzMyLDcgQEAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjZGVmaW5lIENPTkZJR19QQ1M0NDBFUAkJMQkvKiBCb2FyZCBpcyBQQ1M0NDBFUCAgICAgICAgICAgICovCiAjZGVmaW5lIENPTkZJR180NDBFUAkJMQkvKiBTcGVjaWZpYyBQUEM0NDBFUCBzdXBwb3J0ICAgICovCisjZGVmaW5lIENPTkZJR180NDAJCTEJLyogLi4uIFBQQzQ0MCBmYW1pbHkJICAgICAgICAqLwogI2RlZmluZSBDT05GSUdfNHh4CQkxCS8qIC4uLiBQUEM0eHggZmFtaWx5CSAgICAgICAgKi8KICNkZWZpbmUgQ09ORklHX1NZU19DTEtfRlJFUQkzMzMzMzMzMyAgICAvKiBleHRlcm5hbCBmcmVxIHRvIHBsbAkqLwogCkBAIC0xMDMsMjEgKzEwNCwyOCBAQAogI2RlZmluZSBDRkdfRkxBU0hfRU1QVFlfSU5GTwkJLyogcHJpbnQgJ0UnIGZvciBlbXB0eSBzZWN0b3Igb24gZmxpbmZvICovCiAKICNpZmRlZiBDRkdfRU5WX0lTX0lOX0ZMQVNICi0jZGVmaW5lIENGR19FTlZfU0VDVF9TSVpFCTB4MTAwMDAgCS8qIHNpemUgb2Ygb25lIGNvbXBsZXRlIHNlY3RvcgkqLworI2RlZmluZSBDRkdfRU5WX1NFQ1RfU0laRQkweDEwMDAwCS8qIHNpemUgb2Ygb25lIGNvbXBsZXRlIHNlY3RvcgkJKi8KICNkZWZpbmUgQ0ZHX0VOVl9BRERSCQkoQ0ZHX01PTklUT1JfQkFTRS1DRkdfRU5WX1NFQ1RfU0laRSkKLSNkZWZpbmUJQ0ZHX0VOVl9TSVpFCQkweDIwMDAJLyogVG90YWwgU2l6ZSBvZiBFbnZpcm9ubWVudCBTZWN0b3IJKi8KKyNkZWZpbmUgQ0ZHX0VOVl9TSVpFCQkweDIwMDAJLyogVG90YWwgU2l6ZSBvZiBFbnZpcm9ubWVudCBTZWN0b3IJKi8KKworI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQkxCiAKIC8qIEFkZHJlc3MgYW5kIHNpemUgb2YgUmVkdW5kYW50IEVudmlyb25tZW50IFNlY3RvcgkqLwogI2RlZmluZSBDRkdfRU5WX0FERFJfUkVEVU5ECShDRkdfRU5WX0FERFItQ0ZHX0VOVl9TRUNUX1NJWkUpCiAjZGVmaW5lIENGR19FTlZfU0laRV9SRURVTkQJKENGR19FTlZfU0laRSkKICNlbmRpZiAvKiBDRkdfRU5WX0lTX0lOX0ZMQVNIICovCiAKKyNkZWZpbmUgRU5WX05BTUVfUkVWTEVWCSJyZXZpc2lvbl9sZXZlbCIKKyNkZWZpbmUgRU5WX05BTUVfU09MREVSCSJzb2xkZXJfc3dpdGNoIgorI2RlZmluZSBFTlZfTkFNRV9ESVAJImRpcCIKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRERSIFNEUkFNCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2RlZmluZSBDT05GSUdfU1BEX0VFUFJPTSAgICAgICAgICAgICAgIC8qIFVzZSBTUEQgRUVQUk9NIGZvciBzZXR1cCAgICAgICAgICAgICAqLwogI3VuZGVmIENPTkZJR19ERFJfRUNDCQkJLyogZG9uJ3QgdXNlIEVDQwkJCSovCiAjZGVmaW5lIFNQRF9FRVBST01fQUREUkVTUyAgICAgIHsweDUwfQorI2RlZmluZQlDT05GSUdfUFJPR19TRFJBTV9UTEIJMQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBJMkMKQEAgLTE0Miw2ICsxNTAsOCBAQAogI2RlZmluZQlDT05GSUdfRVhUUkFfRU5WX1NFVFRJTkdTCQkJCQlcCiAJIm5ldGRldj1ldGgwXDAiCQkJCQkJCVwKIAkiaG9zdG5hbWU9cGNzNDQwZXBcMCIJCQkJCQlcCisJInVzZV9lZXByb21fZXRoYWRkcj1kZWZhdWx0XDAiCQkJCQlcCisJImNzX3Rlc3Q9b2ZmXDAiCQkJCQkJCVwKIAkibmZzYXJncz1zZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L25mcyBydyAiCQkJXAogCQkibmZzcm9vdD0ke3NlcnZlcmlwfToke3Jvb3RwYXRofVwwIgkJCVwKIAkicmFtYXJncz1zZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L3JhbSByd1wwIgkJCVwKQEAgLTE3Miw2ICsxODIsMzYgQEAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CS8qIGF1dG9ib290IGFmdGVyIDUgc2Vjb25kcwkqLwogI2VuZGlmCiAKKyNkZWZpbmUgQ09ORklHX1BSRUJPT1QJImVjaG87IiBcCisJImVjaG8gVHlwZSBcInJ1biBmbGFzaF9uZnNcIiB0byBtb3VudCByb290IGZpbGVzeXN0ZW0gb3ZlciBORlM7IiBcCisJImVjaG8iCisKKy8qIGNoZWNrIFUtQm9vdCBpbWFnZSB3aXRoIFNIQTEgc3VtICovCisjZGVmaW5lIENPTkZJR19TSEExX0NIRUNLX1VCX0lNRwkxCisjZGVmaW5lIENPTkZJR19TSEExX1NUQVJUCQlDRkdfTU9OSVRPUl9CQVNFCisjZGVmaW5lIENPTkZJR19TSEExX0xFTgkJCUNGR19NT05JVE9SX0xFTgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEZWZpbml0aW9ucyBmb3Igc3RhdHVzIExFRAorICovCisjZGVmaW5lIENPTkZJR19TVEFUVVNfTEVECTEJLyogU3RhdHVzIExFRCBlbmFibGVkCQkqLworI2RlZmluZSBDT05GSUdfQk9BUkRfU1BFQ0lGSUNfTEVECTEKKworI2RlZmluZSBTVEFUVVNfTEVEX0JJVAkJMHgwOAkJCS8qIERJQUcxIGlzIG9uIEdQSU9fUFBDXzEgKi8KKyNkZWZpbmUgU1RBVFVTX0xFRF9QRVJJT0QJKChDRkdfSFogLyAyKSAvIDUpCS8qIGJsaW5rIGF0IDUgSHogKi8KKyNkZWZpbmUgU1RBVFVTX0xFRF9TVEFURQlTVEFUVVNfTEVEX09GRgorI2RlZmluZSBTVEFUVVNfTEVEX0JJVDEJCTB4MDQJCQkvKiBESUFHMiBpcyBvbiBHUElPX1BQQ18yICovCisjZGVmaW5lIFNUQVRVU19MRURfUEVSSU9EMQkoKENGR19IWiAvIDIpIC8gNSkJLyogYmxpbmsgYXQgNSBIeiAqLworI2RlZmluZSBTVEFUVVNfTEVEX1NUQVRFMQlTVEFUVVNfTEVEX09OCisjZGVmaW5lIFNUQVRVU19MRURfQklUMgkJMHgwMgkJCS8qIERJQUczIGlzIG9uIEdQSU9fUFBDXzMgKi8KKyNkZWZpbmUgU1RBVFVTX0xFRF9QRVJJT0QyCSgoQ0ZHX0haIC8gMikgLyA1KQkvKiBibGluayBhdCA1IEh6ICovCisjZGVmaW5lIFNUQVRVU19MRURfU1RBVEUyCVNUQVRVU19MRURfT0ZGCisjZGVmaW5lIFNUQVRVU19MRURfQklUMwkJMHgwMQkJCS8qIERJQUc0IGlzIG9uIEdQSU9fUFBDXzQgKi8KKyNkZWZpbmUgU1RBVFVTX0xFRF9QRVJJT0QzCSgoQ0ZHX0haIC8gMikgLyA1KQkvKiBibGluayBhdCA1IEh6ICovCisjZGVmaW5lIFNUQVRVU19MRURfU1RBVEUzCVNUQVRVU19MRURfT0ZGCisKKyNkZWZpbmUgQ09ORklHX1NIT1dfQk9PVF9QUk9HUkVTUwkxCisKICNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkxMTUyMDAKIAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLwpAQCAtMjA3LDM3ICsyNDcsNDcgQEAKICNkZWZpbmUgQ09ORklHX0hXX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgKi8KICNlbmRpZgogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAgKENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RJQUcJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTwl8IFwKLQkJCQlDRkdfQ01EX1NEUkFNCXwgXAotCQkJCUNGR19DTURfRVhUMgl8IFwKLQkJCQlDRkdfQ01EX0ZBVAl8IFwKLQkJCQlDRkdfQ01EX1VTQgkpCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisjZGVmaW5lIENPTkZJR19DTURfRVhUMgorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX1VTQgogCiAKICNkZWZpbmUgQ09ORklHX1NVUFBPUlRfVkZBVAogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJICAgICAgICAiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkgICAgICAgIDEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJICAgICAgICAyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI2Niw3ICszMTYsNiBAQAogI2RlZmluZSBDRkdfUENJX1RBUkdCQVNFICAgICAgICAweDgwMDAwMDAwIC8qIFBDSWFkZHIgbWFwcGVkIHRvIENGR19QQ0lfTUVNQkFTRSovCiAKIC8qIEJvYXJkLXNwZWNpZmljIFBDSSAqLwotI2RlZmluZSBDRkdfUENJX1BSRV9JTklUICAgICAgICAgICAgICAgIC8qIGVuYWJsZSBib2FyZCBwY2lfcHJlX2luaXQoKSAgKi8KICNkZWZpbmUgQ0ZHX1BDSV9UQVJHRVRfSU5JVAogI2RlZmluZSBDRkdfUENJX01BU1RFUl9JTklUCiAKQEAgLTMxNSw3NiArMzY0LDc2IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBQUEM0NDAgR1BJTyBDb25maWd1cmF0aW9uCiAgKi8KLSNkZWZpbmUgQ0ZHXzQ0MF9HUElPX1RBQkxFIHsgLyoJCUdQSU8JQWx0ZXJuYXRlMQlBbHRlcm5hdGUyCUFsdGVybmF0ZTMgKi8gXAorI2RlZmluZSBDRkdfNDQwX0dQSU9fVEFCTEUgeyAvKgkgIE91dAkJICAgICAgIEdQSU8JQWx0ZXJuYXRlMQlBbHRlcm5hdGUyICAgQWx0ZXJuYXRlMyAqLyBcCiB7CQkJCQkJCQkJCQlcCiAvKiBHUElPIENvcmUgMCAqLwkJCQkJCQkJCVwKLXsgR1BJTzBfQkFTRSwgR1BJT19PVVQsIEdQSU9fU0VMIH0sICAvKiBHUElPMAlFQkNfQUREUig3KQlETUFfUkVRKDIpCSovCVwKLXsgR1BJTzBfQkFTRSwgR1BJT19PVVQsIEdQSU9fU0VMIH0sICAvKiBHUElPMQlFQkNfQUREUig2KQlETUFfQUNLKDIpCSovCVwKLXsgR1BJTzBfQkFTRSwgR1BJT19PVVQsIEdQSU9fU0VMIH0sICAvKiBHUElPMglFQkNfQUREUig1KQlETUFfRU9UL1RDKDIpCSovCVwKLXsgR1BJTzBfQkFTRSwgR1BJT19PVVQsIEdQSU9fU0VMIH0sICAvKiBHUElPMwlFQkNfQUREUig0KQlETUFfUkVRKDMpCSovCVwKLXsgR1BJTzBfQkFTRSwgR1BJT19PVVQsIEdQSU9fU0VMIH0sICAvKiBHUElPNAlFQkNfQUREUigzKQlETUFfQUNLKDMpCSovCVwKLXsgR1BJTzBfQkFTRSwgR1BJT19PVVQsIEdQSU9fU0VMIH0sICAvKiBHUElPNQlFQkNfQUREUigyKQlETUFfRU9UL1RDKDMpCSovCVwKLXsgR1BJTzBfQkFTRSwgR1BJT19PVVQsIEdQSU9fQUxUMSB9LCAvKiBHUElPNglFQkNfQ1NfTigxKQkJCSovCVwKLXsgR1BJTzBfQkFTRSwgR1BJT19PVVQsIEdQSU9fQUxUMSB9LCAvKiBHUElPNwlFQkNfQ1NfTigyKQkJCSovCVwKLXsgR1BJTzBfQkFTRSwgR1BJT19PVVQsIEdQSU9fQUxUMSB9LCAvKiBHUElPOAlFQkNfQ1NfTigzKQkJCSovCVwKLXsgR1BJTzBfQkFTRSwgR1BJT19PVVQsIEdQSU9fQUxUMSB9LCAvKiBHUElPOQlFQkNfQ1NfTig0KQkJCSovCVwKLXsgR1BJTzBfQkFTRSwgR1BJT19PVVQsIEdQSU9fU0VMIH0sICAvKiBHUElPMTAJRUJDX0NTX04oNSkJCQkqLwlcCi17IEdQSU8wX0JBU0UsIEdQSU9fT1VULCBHUElPX1NFTCB9LCAgLyogR1BJTzExCUVCQ19CVVNfRVJSCQkJKi8JXAoteyBHUElPMF9CQVNFLCBHUElPX0lOLCAgR1BJT19BTFQxIH0sIC8qIEdQSU8xMglaSUlfcDBSeGQoMCkJCQkqLwlcCi17IEdQSU8wX0JBU0UsIEdQSU9fSU4sICBHUElPX0FMVDEgfSwgLyogR1BJTzEzCVpJSV9wMFJ4ZCgxKQkJCSovCVwKLXsgR1BJTzBfQkFTRSwgR1BJT19JTiwgIEdQSU9fQUxUMSB9LCAvKiBHUElPMTQJWklJX3AwUnhkKDIpCQkJKi8JXAoteyBHUElPMF9CQVNFLCBHUElPX0lOLCAgR1BJT19BTFQxIH0sIC8qIEdQSU8xNQlaSUlfcDBSeGQoMykJCQkqLwlcCi17IEdQSU8wX0JBU0UsIEdQSU9fT1VULCBHUElPX0FMVDEgfSwgLyogR1BJTzE2CVpJSV9wMFR4ZCgwKQkJCSovCVwKLXsgR1BJTzBfQkFTRSwgR1BJT19PVVQsIEdQSU9fQUxUMSB9LCAvKiBHUElPMTcJWklJX3AwVHhkKDEpCQkJKi8JXAoteyBHUElPMF9CQVNFLCBHUElPX09VVCwgR1BJT19BTFQxIH0sIC8qIEdQSU8xOAlaSUlfcDBUeGQoMikJCQkqLwlcCi17IEdQSU8wX0JBU0UsIEdQSU9fT1VULCBHUElPX0FMVDEgfSwgLyogR1BJTzE5CVpJSV9wMFR4ZCgzKQkJCSovCVwKLXsgR1BJTzBfQkFTRSwgR1BJT19JTiwgIEdQSU9fQUxUMSB9LCAvKiBHUElPMjAJWklJX3AwUnhfZXIJCQkqLwlcCi17IEdQSU8wX0JBU0UsIEdQSU9fSU4sICBHUElPX0FMVDEgfSwgLyogR1BJTzIxCVpJSV9wMFJ4X2R2CQkJKi8JXAoteyBHUElPMF9CQVNFLCBHUElPX0lOLCAgR1BJT19BTFQxIH0sIC8qIEdQSU8yMglaSUlfcDBSeENycwkJCSovCVwKLXsgR1BJTzBfQkFTRSwgR1BJT19PVVQsIEdQSU9fQUxUMSB9LCAvKiBHUElPMjMJWklJX3AwVHhfZXIJCQkqLwlcCi17IEdQSU8wX0JBU0UsIEdQSU9fT1VULCBHUElPX0FMVDEgfSwgLyogR1BJTzI0CVpJSV9wMFR4X2VuCQkJKi8JXAoteyBHUElPMF9CQVNFLCBHUElPX0lOLCAgR1BJT19BTFQxIH0sIC8qIEdQSU8yNQlaSUlfcDBDb2wJCQkqLwlcCi17IEdQSU8wX0JBU0UsIEdQSU9fSU4sICBHUElPX1NFTCB9LCAgLyogR1BJTzI2CQkJVVNCMkRfUlhWQUxJRAkqLwlcCi17IEdQSU8wX0JBU0UsIEdQSU9fSU4sICBHUElPX1NFTCB9LCAgLyogR1BJTzI3CUVYVF9FQkNfUkVRCVVTQjJEX1JYRVJST1IJKi8JXAoteyBHUElPMF9CQVNFLCBHUElPX0lOLCAgR1BJT19TRUwgfSwgIC8qIEdQSU8yOAkJCVVTQjJEX1RYVkFMSUQJKi8JXAoteyBHUElPMF9CQVNFLCBHUElPX0lOLCAgR1BJT19TRUwgfSwgIC8qIEdQSU8yOQlFQkNfRVhUX0hETEEJVVNCMkRfUEFEX1NVU1BORE0gKi8JXAoteyBHUElPMF9CQVNFLCBHUElPX0lOLCAgR1BJT19TRUwgfSwgIC8qIEdQSU8zMAlFQkNfRVhUX0FDSwlVU0IyRF9YQ1ZSU0VMRUNUKi8JXAoteyBHUElPMF9CQVNFLCBHUElPX0lOLCAgR1BJT19TRUwgfSwgIC8qIEdQSU8zMQlFQkNfRVhSX0JVU1JFUQlVU0IyRF9URVJNU0VMRUNUKi8JXAore0dQSU8wX0JBU0UsIEdQSU9fT1VULCBHUElPX1NFTCwgR1BJT19PVVRfTk9fQ0hHfSwgIC8qIEdQSU8wCUVCQ19BRERSKDcpCURNQV9SRVEoMikJKi8gXAore0dQSU8wX0JBU0UsIEdQSU9fT1VULCBHUElPX1NFTCwgR1BJT19PVVRfTk9fQ0hHfSwgIC8qIEdQSU8xCUVCQ19BRERSKDYpCURNQV9BQ0soMikJKi8JXAore0dQSU8wX0JBU0UsIEdQSU9fT1VULCBHUElPX1NFTCwgR1BJT19PVVRfTk9fQ0hHfSwgIC8qIEdQSU8yCUVCQ19BRERSKDUpCURNQV9FT1QvVEMoMikJKi8JXAore0dQSU8wX0JBU0UsIEdQSU9fT1VULCBHUElPX1NFTCwgR1BJT19PVVRfTk9fQ0hHfSwgIC8qIEdQSU8zCUVCQ19BRERSKDQpCURNQV9SRVEoMykJKi8JXAore0dQSU8wX0JBU0UsIEdQSU9fT1VULCBHUElPX1NFTCwgR1BJT19PVVRfTk9fQ0hHfSwgIC8qIEdQSU80CUVCQ19BRERSKDMpCURNQV9BQ0soMykJKi8JXAore0dQSU8wX0JBU0UsIEdQSU9fT1VULCBHUElPX1NFTCwgR1BJT19PVVRfTk9fQ0hHfSwgIC8qIEdQSU81CUVCQ19BRERSKDIpCURNQV9FT1QvVEMoMykJKi8JXAore0dQSU8wX0JBU0UsIEdQSU9fT1VULCBHUElPX0FMVDEsIEdQSU9fT1VUX05PX0NIR30sIC8qIEdQSU82CUVCQ19DU19OKDEpCQkJKi8JXAore0dQSU8wX0JBU0UsIEdQSU9fT1VULCBHUElPX0FMVDEsIEdQSU9fT1VUX05PX0NIR30sIC8qIEdQSU83CUVCQ19DU19OKDIpCQkJKi8JXAore0dQSU8wX0JBU0UsIEdQSU9fT1VULCBHUElPX0FMVDEsIEdQSU9fT1VUX05PX0NIR30sIC8qIEdQSU84CUVCQ19DU19OKDMpCQkJKi8JXAore0dQSU8wX0JBU0UsIEdQSU9fT1VULCBHUElPX0FMVDEsIEdQSU9fT1VUX05PX0NIR30sIC8qIEdQSU85CUVCQ19DU19OKDQpCQkJKi8JXAore0dQSU8wX0JBU0UsIEdQSU9fT1VULCBHUElPX1NFTCwgR1BJT19PVVRfTk9fQ0hHfSwgIC8qIEdQSU8xMAlFQkNfQ1NfTig1KQkJCSovCVwKK3tHUElPMF9CQVNFLCBHUElPX09VVCwgR1BJT19TRUwsIEdQSU9fT1VUX05PX0NIR30sICAvKiBHUElPMTEJRUJDX0JVU19FUlIJCQkqLwlcCit7R1BJTzBfQkFTRSwgR1BJT19JTiwgIEdQSU9fQUxUMSwgR1BJT19PVVRfTk9fQ0hHfSwgLyogR1BJTzEyCVpJSV9wMFJ4ZCgwKQkJCSovCVwKK3tHUElPMF9CQVNFLCBHUElPX0lOLCAgR1BJT19BTFQxLCBHUElPX09VVF9OT19DSEd9LCAvKiBHUElPMTMJWklJX3AwUnhkKDEpCQkJKi8JXAore0dQSU8wX0JBU0UsIEdQSU9fSU4sICBHUElPX0FMVDEsIEdQSU9fT1VUX05PX0NIR30sIC8qIEdQSU8xNAlaSUlfcDBSeGQoMikJCQkqLwlcCit7R1BJTzBfQkFTRSwgR1BJT19JTiwgIEdQSU9fQUxUMSwgR1BJT19PVVRfTk9fQ0hHfSwgLyogR1BJTzE1CVpJSV9wMFJ4ZCgzKQkJCSovCVwKK3tHUElPMF9CQVNFLCBHUElPX09VVCwgR1BJT19BTFQxLCBHUElPX09VVF9OT19DSEd9LCAvKiBHUElPMTYJWklJX3AwVHhkKDApCQkJKi8JXAore0dQSU8wX0JBU0UsIEdQSU9fT1VULCBHUElPX0FMVDEsIEdQSU9fT1VUX05PX0NIR30sIC8qIEdQSU8xNwlaSUlfcDBUeGQoMSkJCQkqLwlcCit7R1BJTzBfQkFTRSwgR1BJT19PVVQsIEdQSU9fQUxUMSwgR1BJT19PVVRfTk9fQ0hHfSwgLyogR1BJTzE4CVpJSV9wMFR4ZCgyKQkJCSovCVwKK3tHUElPMF9CQVNFLCBHUElPX09VVCwgR1BJT19BTFQxLCBHUElPX09VVF9OT19DSEd9LCAvKiBHUElPMTkJWklJX3AwVHhkKDMpCQkJKi8JXAore0dQSU8wX0JBU0UsIEdQSU9fSU4sICBHUElPX0FMVDEsIEdQSU9fT1VUX05PX0NIR30sIC8qIEdQSU8yMAlaSUlfcDBSeF9lcgkJCSovCVwKK3tHUElPMF9CQVNFLCBHUElPX0lOLCAgR1BJT19BTFQxLCBHUElPX09VVF9OT19DSEd9LCAvKiBHUElPMjEJWklJX3AwUnhfZHYJCQkqLwlcCit7R1BJTzBfQkFTRSwgR1BJT19JTiwgIEdQSU9fQUxUMSwgR1BJT19PVVRfTk9fQ0hHfSwgLyogR1BJTzIyCVpJSV9wMFJ4Q3JzCQkJKi8JXAore0dQSU8wX0JBU0UsIEdQSU9fT1VULCBHUElPX0FMVDEsIEdQSU9fT1VUX05PX0NIR30sIC8qIEdQSU8yMwlaSUlfcDBUeF9lcgkJCSovCVwKK3tHUElPMF9CQVNFLCBHUElPX09VVCwgR1BJT19BTFQxLCBHUElPX09VVF9OT19DSEd9LCAvKiBHUElPMjQJWklJX3AwVHhfZW4JCQkqLwlcCit7R1BJTzBfQkFTRSwgR1BJT19JTiwgIEdQSU9fQUxUMSwgR1BJT19PVVRfTk9fQ0hHfSwgLyogR1BJTzI1CVpJSV9wMENvbAkJCSovCVwKK3tHUElPMF9CQVNFLCBHUElPX0lOLCAgR1BJT19TRUwsIEdQSU9fT1VUX05PX0NIR30sICAvKiBHUElPMjYJCQlVU0IyRF9SWFZBTElECSovCVwKK3tHUElPMF9CQVNFLCBHUElPX0lOLCAgR1BJT19TRUwsIEdQSU9fT1VUX05PX0NIR30sICAvKiBHUElPMjcJRVhUX0VCQ19SRVEJVVNCMkRfUlhFUlJPUgkqLwlcCit7R1BJTzBfQkFTRSwgR1BJT19JTiwgIEdQSU9fU0VMLCBHUElPX09VVF9OT19DSEd9LCAgLyogR1BJTzI4CQkJVVNCMkRfVFhWQUxJRAkqLwlcCit7R1BJTzBfQkFTRSwgR1BJT19JTiwgIEdQSU9fU0VMLCBHUElPX09VVF9OT19DSEd9LCAgLyogR1BJTzI5CUVCQ19FWFRfSERMQQlVU0IyRF9QQURfU1VTUE5ETSAqLwlcCit7R1BJTzBfQkFTRSwgR1BJT19JTiwgIEdQSU9fU0VMLCBHUElPX09VVF9OT19DSEd9LCAgLyogR1BJTzMwCUVCQ19FWFRfQUNLCVVTQjJEX1hDVlJTRUxFQ1QqLwlcCit7R1BJTzBfQkFTRSwgR1BJT19JTiwgIEdQSU9fU0VMLCBHUElPX09VVF9OT19DSEd9LCAgLyogR1BJTzMxCUVCQ19FWFJfQlVTUkVRCVVTQjJEX1RFUk1TRUxFQ1QqLwlcCiB9LAkJCQkJCQkJCQkJXAogewkJCQkJCQkJCQkJXAogLyogR1BJTyBDb3JlIDEgKi8JCQkJCQkJCQlcCi17IEdQSU8xX0JBU0UsIEdQSU9fSU4sICBHUElPX1NFTCB9LCAgLyogR1BJTzMyCVVTQjJEX09QTU9ERTAJCQkqLwlcCi17IEdQSU8xX0JBU0UsIEdQSU9fSU4sICBHUElPX1NFTCB9LCAgLyogR1BJTzMzCVVTQjJEX09QTU9ERTEJCQkqLwlcCi17IEdQSU8xX0JBU0UsIEdQSU9fT1VULCBHUElPX0FMVDMgfSwgLyogR1BJTzM0CVVBUlQwX0RDRF9OCVVBUlQxX0RTUl9DVFNfTglVQVJUMl9TT1VUKi8gXAoteyBHUElPMV9CQVNFLCBHUElPX0lOLCAgR1BJT19BTFQzIH0sIC8qIEdQSU8zNQlVQVJUMF84UElOX0RTUl9OIFVBUlQxX1JUU19EVFJfTiBVQVJUMl9TSU4qLyBcCi17IEdQSU8xX0JBU0UsIEdQSU9fSU4sICBHUElPX0FMVDEgfSwgLyogR1BJTzM2CVVBUlQwXzhQSU5fQ1RTX04JCVVBUlQzX1NJTiovIFwKLXsgR1BJTzFfQkFTRSwgR1BJT19PVVQsIEdQSU9fQUxUMSB9LCAvKiBHUElPMzcJVUFSVDBfUlRTX04JCQkqLwlcCi17IEdQSU8xX0JBU0UsIEdQSU9fT1VULCBHUElPX0FMVDIgfSwgLyogR1BJTzM4CVVBUlQwX0RUUl9OCVVBUlQxX1NPVVQJKi8JXAoteyBHUElPMV9CQVNFLCBHUElPX0lOLCAgR1BJT19BTFQyIH0sIC8qIEdQSU8zOQlVQVJUMF9SSV9OCVVBUlQxX1NJTgkqLwlcCi17IEdQSU8xX0JBU0UsIEdQSU9fSU4sICBHUElPX0FMVDEgfSwgLyogR1BJTzQwCVVJQ19JUlEoMCkJCQkqLwlcCi17IEdQSU8xX0JBU0UsIEdQSU9fSU4sICBHUElPX0FMVDEgfSwgLyogR1BJTzQxCVVJQ19JUlEoMSkJCQkqLwlcCi17IEdQSU8xX0JBU0UsIEdQSU9fSU4sICBHUElPX0FMVDEgfSwgLyogR1BJTzQyCVVJQ19JUlEoMikJCQkqLwlcCi17IEdQSU8xX0JBU0UsIEdQSU9fSU4sICBHUElPX0FMVDEgfSwgLyogR1BJTzQzCVVJQ19JUlEoMykJCQkqLwlcCi17IEdQSU8xX0JBU0UsIEdQSU9fSU4sICBHUElPX0FMVDEgfSwgLyogR1BJTzQ0CVVJQ19JUlEoNCkJRE1BX0FDSygxKQkqLwlcCi17IEdQSU8xX0JBU0UsIEdQSU9fSU4sICBHUElPX1NFTCB9LCAgLyogR1BJTzQ1CVVJQ19JUlEoNikJRE1BX0VPVC9UQygxKQkqLwlcCi17IEdQSU8xX0JBU0UsIEdQSU9fQkksICBHUElPX1NFTCB9LCAgLyogR1BJTzQ2CVVJQ19JUlEoNykJRE1BX1JFUSgwKQkqLwlcCi17IEdQSU8xX0JBU0UsIEdQSU9fSU4sICBHUElPX1NFTCB9LCAgLyogR1BJTzQ3CVVJQ19JUlEoOCkJRE1BX0FDSygwKQkqLwlcCi17IEdQSU8xX0JBU0UsIEdQSU9fSU4sICBHUElPX1NFTCB9LCAgLyogR1BJTzQ4CVVJQ19JUlEoOSkJRE1BX0VPVC9UQygwKQkqLwlcCi17IEdQSU8xX0JBU0UsIEdQSU9fSU4sICBHUElPX1NFTCB9LCAgLyogR1BJTzQ5ICBVbnNlbGVjdCB2aWEgVHJhY2VTZWxlY3QgQml0CSovCVwKLXsgR1BJTzFfQkFTRSwgR1BJT19JTiwgIEdQSU9fU0VMIH0sICAvKiBHUElPNTAgIFVuc2VsZWN0IHZpYSBUcmFjZVNlbGVjdCBCaXQJKi8JXAoteyBHUElPMV9CQVNFLCBHUElPX0lOLCAgR1BJT19TRUwgfSwgIC8qIEdQSU81MSAgVW5zZWxlY3QgdmlhIFRyYWNlU2VsZWN0IEJpdAkqLwlcCi17IEdQSU8xX0JBU0UsIEdQSU9fSU4sICBHUElPX1NFTCB9LCAgLyogR1BJTzUyICBVbnNlbGVjdCB2aWEgVHJhY2VTZWxlY3QgQml0CSovCVwKLXsgR1BJTzFfQkFTRSwgR1BJT19JTiwgIEdQSU9fU0VMIH0sICAvKiBHUElPNTMgIFVuc2VsZWN0IHZpYSBUcmFjZVNlbGVjdCBCaXQJKi8JXAoteyBHUElPMV9CQVNFLCBHUElPX0lOLCAgR1BJT19TRUwgfSwgIC8qIEdQSU81NCAgVW5zZWxlY3QgdmlhIFRyYWNlU2VsZWN0IEJpdAkqLwlcCi17IEdQSU8xX0JBU0UsIEdQSU9fSU4sICBHUElPX1NFTCB9LCAgLyogR1BJTzU1ICBVbnNlbGVjdCB2aWEgVHJhY2VTZWxlY3QgQml0CSovCVwKLXsgR1BJTzFfQkFTRSwgR1BJT19JTiwgIEdQSU9fU0VMIH0sICAvKiBHUElPNTYgIFVuc2VsZWN0IHZpYSBUcmFjZVNlbGVjdCBCaXQJKi8JXAoteyBHUElPMV9CQVNFLCBHUElPX0lOLCAgR1BJT19TRUwgfSwgIC8qIEdQSU81NyAgVW5zZWxlY3QgdmlhIFRyYWNlU2VsZWN0IEJpdAkqLwlcCi17IEdQSU8xX0JBU0UsIEdQSU9fSU4sICBHUElPX1NFTCB9LCAgLyogR1BJTzU4ICBVbnNlbGVjdCB2aWEgVHJhY2VTZWxlY3QgQml0CSovCVwKLXsgR1BJTzFfQkFTRSwgR1BJT19JTiwgIEdQSU9fU0VMIH0sICAvKiBHUElPNTkgIFVuc2VsZWN0IHZpYSBUcmFjZVNlbGVjdCBCaXQJKi8JXAoteyBHUElPMV9CQVNFLCBHUElPX0lOLCAgR1BJT19TRUwgfSwgIC8qIEdQSU82MCAgVW5zZWxlY3QgdmlhIFRyYWNlU2VsZWN0IEJpdAkqLwlcCi17IEdQSU8xX0JBU0UsIEdQSU9fSU4sICBHUElPX1NFTCB9LCAgLyogR1BJTzYxICBVbnNlbGVjdCB2aWEgVHJhY2VTZWxlY3QgQml0CSovCVwKLXsgR1BJTzFfQkFTRSwgR1BJT19JTiwgIEdQSU9fU0VMIH0sICAvKiBHUElPNjIgIFVuc2VsZWN0IHZpYSBUcmFjZVNlbGVjdCBCaXQJKi8JXAoteyBHUElPMV9CQVNFLCBHUElPX0lOLCAgR1BJT19TRUwgfSwgIC8qIEdQSU82MyAgVW5zZWxlY3QgdmlhIFRyYWNlU2VsZWN0IEJpdAkqLwlcCit7R1BJTzFfQkFTRSwgR1BJT19JTiwgIEdQSU9fU0VMLCBHUElPX09VVF9OT19DSEd9LCAgLyogR1BJTzMyCVVTQjJEX09QTU9ERTAJCQkqLwlcCit7R1BJTzFfQkFTRSwgR1BJT19JTiwgIEdQSU9fU0VMLCBHUElPX09VVF9OT19DSEd9LCAgLyogR1BJTzMzCVVTQjJEX09QTU9ERTEJCQkqLwlcCit7R1BJTzFfQkFTRSwgR1BJT19PVVQsIEdQSU9fQUxUMywgR1BJT19PVVRfTk9fQ0hHfSwgLyogR1BJTzM0CVVBUlQwX0RDRF9OCVVBUlQxX0RTUl9DVFNfTglVQVJUMl9TT1VUKi8gXAore0dQSU8xX0JBU0UsIEdQSU9fSU4sICBHUElPX0FMVDMsIEdQSU9fT1VUX05PX0NIR30sIC8qIEdQSU8zNQlVQVJUMF84UElOX0RTUl9OIFVBUlQxX1JUU19EVFJfTiBVQVJUMl9TSU4qLyBcCit7R1BJTzFfQkFTRSwgR1BJT19JTiwgIEdQSU9fQUxUMSwgR1BJT19PVVRfTk9fQ0hHfSwgLyogR1BJTzM2CVVBUlQwXzhQSU5fQ1RTX04JCVVBUlQzX1NJTiovIFwKK3tHUElPMV9CQVNFLCBHUElPX09VVCwgR1BJT19BTFQxLCBHUElPX09VVF9OT19DSEd9LCAvKiBHUElPMzcJVUFSVDBfUlRTX04JCQkqLwlcCit7R1BJTzFfQkFTRSwgR1BJT19PVVQsIEdQSU9fQUxUMiwgR1BJT19PVVRfTk9fQ0hHfSwgLyogR1BJTzM4CVVBUlQwX0RUUl9OCVVBUlQxX1NPVVQJKi8JXAore0dQSU8xX0JBU0UsIEdQSU9fSU4sICBHUElPX0FMVDIsIEdQSU9fT1VUX05PX0NIR30sIC8qIEdQSU8zOQlVQVJUMF9SSV9OCVVBUlQxX1NJTgkqLwlcCit7R1BJTzFfQkFTRSwgR1BJT19JTiwgIEdQSU9fQUxUMSwgR1BJT19PVVRfTk9fQ0hHfSwgLyogR1BJTzQwCVVJQ19JUlEoMCkJCQkqLwlcCit7R1BJTzFfQkFTRSwgR1BJT19JTiwgIEdQSU9fQUxUMSwgR1BJT19PVVRfTk9fQ0hHfSwgLyogR1BJTzQxCVVJQ19JUlEoMSkJCQkqLwlcCit7R1BJTzFfQkFTRSwgR1BJT19JTiwgIEdQSU9fQUxUMSwgR1BJT19PVVRfTk9fQ0hHfSwgLyogR1BJTzQyCVVJQ19JUlEoMikJCQkqLwlcCit7R1BJTzFfQkFTRSwgR1BJT19JTiwgIEdQSU9fQUxUMSwgR1BJT19PVVRfTk9fQ0hHfSwgLyogR1BJTzQzCVVJQ19JUlEoMykJCQkqLwlcCit7R1BJTzFfQkFTRSwgR1BJT19JTiwgIEdQSU9fQUxUMSwgR1BJT19PVVRfTk9fQ0hHfSwgLyogR1BJTzQ0CVVJQ19JUlEoNCkJRE1BX0FDSygxKQkqLwlcCit7R1BJTzFfQkFTRSwgR1BJT19JTiwgIEdQSU9fU0VMLCBHUElPX09VVF9OT19DSEd9LCAgLyogR1BJTzQ1CVVJQ19JUlEoNikJRE1BX0VPVC9UQygxKQkqLwlcCit7R1BJTzFfQkFTRSwgR1BJT19CSSwgIEdQSU9fU0VMLCBHUElPX09VVF9OT19DSEd9LCAgLyogR1BJTzQ2CVVJQ19JUlEoNykJRE1BX1JFUSgwKQkqLwlcCit7R1BJTzFfQkFTRSwgR1BJT19JTiwgIEdQSU9fU0VMLCBHUElPX09VVF9OT19DSEd9LCAgLyogR1BJTzQ3CVVJQ19JUlEoOCkJRE1BX0FDSygwKQkqLwlcCit7R1BJTzFfQkFTRSwgR1BJT19JTiwgIEdQSU9fU0VMLCBHUElPX09VVF9OT19DSEd9LCAgLyogR1BJTzQ4CVVJQ19JUlEoOSkJRE1BX0VPVC9UQygwKQkqLwlcCit7R1BJTzFfQkFTRSwgR1BJT19JTiwgIEdQSU9fU0VMLCBHUElPX09VVF9OT19DSEd9LCAgLyogR1BJTzQ5ICBVbnNlbGVjdCB2aWEgVHJhY2VTZWxlY3QgQml0CSovCVwKK3tHUElPMV9CQVNFLCBHUElPX0lOLCAgR1BJT19TRUwsIEdQSU9fT1VUX05PX0NIR30sICAvKiBHUElPNTAgIFVuc2VsZWN0IHZpYSBUcmFjZVNlbGVjdCBCaXQJKi8JXAore0dQSU8xX0JBU0UsIEdQSU9fSU4sICBHUElPX1NFTCwgR1BJT19PVVRfTk9fQ0hHfSwgIC8qIEdQSU81MSAgVW5zZWxlY3QgdmlhIFRyYWNlU2VsZWN0IEJpdAkqLwlcCit7R1BJTzFfQkFTRSwgR1BJT19JTiwgIEdQSU9fU0VMLCBHUElPX09VVF9OT19DSEd9LCAgLyogR1BJTzUyICBVbnNlbGVjdCB2aWEgVHJhY2VTZWxlY3QgQml0CSovCVwKK3tHUElPMV9CQVNFLCBHUElPX0lOLCAgR1BJT19TRUwsIEdQSU9fT1VUX05PX0NIR30sICAvKiBHUElPNTMgIFVuc2VsZWN0IHZpYSBUcmFjZVNlbGVjdCBCaXQJKi8JXAore0dQSU8xX0JBU0UsIEdQSU9fSU4sICBHUElPX1NFTCwgR1BJT19PVVRfTk9fQ0hHfSwgIC8qIEdQSU81NCAgVW5zZWxlY3QgdmlhIFRyYWNlU2VsZWN0IEJpdAkqLwlcCit7R1BJTzFfQkFTRSwgR1BJT19JTiwgIEdQSU9fU0VMLCBHUElPX09VVF9OT19DSEd9LCAgLyogR1BJTzU1ICBVbnNlbGVjdCB2aWEgVHJhY2VTZWxlY3QgQml0CSovCVwKK3tHUElPMV9CQVNFLCBHUElPX0lOLCAgR1BJT19TRUwsIEdQSU9fT1VUX05PX0NIR30sICAvKiBHUElPNTYgIFVuc2VsZWN0IHZpYSBUcmFjZVNlbGVjdCBCaXQJKi8JXAore0dQSU8xX0JBU0UsIEdQSU9fSU4sICBHUElPX1NFTCwgR1BJT19PVVRfTk9fQ0hHfSwgIC8qIEdQSU81NyAgVW5zZWxlY3QgdmlhIFRyYWNlU2VsZWN0IEJpdAkqLwlcCit7R1BJTzFfQkFTRSwgR1BJT19JTiwgIEdQSU9fU0VMLCBHUElPX09VVF9OT19DSEd9LCAgLyogR1BJTzU4ICBVbnNlbGVjdCB2aWEgVHJhY2VTZWxlY3QgQml0CSovCVwKK3tHUElPMV9CQVNFLCBHUElPX0lOLCAgR1BJT19TRUwsIEdQSU9fT1VUX05PX0NIR30sICAvKiBHUElPNTkgIFVuc2VsZWN0IHZpYSBUcmFjZVNlbGVjdCBCaXQJKi8JXAore0dQSU8xX0JBU0UsIEdQSU9fSU4sICBHUElPX1NFTCwgR1BJT19PVVRfTk9fQ0hHfSwgIC8qIEdQSU82MCAgVW5zZWxlY3QgdmlhIFRyYWNlU2VsZWN0IEJpdAkqLwlcCit7R1BJTzFfQkFTRSwgR1BJT19JTiwgIEdQSU9fU0VMLCBHUElPX09VVF9OT19DSEd9LCAgLyogR1BJTzYxICBVbnNlbGVjdCB2aWEgVHJhY2VTZWxlY3QgQml0CSovCVwKK3tHUElPMV9CQVNFLCBHUElPX0lOLCAgR1BJT19TRUwsIEdQSU9fT1VUX05PX0NIR30sICAvKiBHUElPNjIgIFVuc2VsZWN0IHZpYSBUcmFjZVNlbGVjdCBCaXQJKi8JXAore0dQSU8xX0JBU0UsIEdQSU9fSU4sICBHUElPX1NFTCwgR1BJT19PVVRfTk9fQ0hHfSwgIC8qIEdQSU82MyAgVW5zZWxlY3QgdmlhIFRyYWNlU2VsZWN0IEJpdAkqLwlcCiB9CQkJCQkJCQkJCQlcCiB9CiAKQEAgLTM5Myw3ICs0NDIsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJKDMyPDwxMCkgLyogRm9yIEFNQ0MgNDQwIENQVXMJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCkBAIC00MDUsOSArNDU0LDQ0IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCiAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIElERS9BVEEgc3R1ZmYgU3VwcG9ydHMgSURFIGhhcmRkaXNrCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI3VuZGVmICBDT05GSUdfSURFXzh4eF9QQ0NBUkQJCS8qIFVzZSBJREUgd2l0aCBQQyBDYXJkCUFkYXB0ZXIJKi8KKworI3VuZGVmICBDT05GSUdfSURFXzh4eF9ESVJFQ1QJCS8qIERpcmVjdCBJREUgICAgbm90IHN1cHBvcnRlZAkqLworI3VuZGVmICBDT05GSUdfSURFX0xFRAkJCS8qIExFRCAgIGZvciBpZGUgbm90IHN1cHBvcnRlZAkqLworCisjZGVmaW5lIENGR19JREVfTUFYQlVTCQkxCS8qIG1heC4gMSBJREUgYnVzCQkqLworI2RlZmluZSBDRkdfSURFX01BWERFVklDRQkxCS8qIG1heC4gMiBkcml2ZXMgcGVyIElERSBidXMJKi8KKworI2RlZmluZSBDT05GSUdfSURFX1BSRUlOSVQJMQorI2RlZmluZSBDT05GSUdfSURFX1JFU0VUCTEKKworI2RlZmluZSBDRkdfQVRBX0lERTBfT0ZGU0VUCTB4MDAwMAorCisjZGVmaW5lIENGR19BVEFfQkFTRV9BRERSCUNGR19DRjEKKworLyogT2Zmc2V0IGZvciBkYXRhIEkvTwkJCSovCisjZGVmaW5lIENGR19BVEFfREFUQV9PRkZTRVQJMAorCisvKiBPZmZzZXQgZm9yIG5vcm1hbCByZWdpc3RlciBhY2Nlc3NlcwkqLworI2RlZmluZSBDRkdfQVRBX1JFR19PRkZTRVQJKENGR19BVEFfREFUQV9PRkZTRVQpCisKKy8qIE9mZnNldCBmb3IgYWx0ZXJuYXRlIHJlZ2lzdGVycwkqLworI2RlZmluZSBDRkdfQVRBX0FMVF9PRkZTRVQJKDB4MDAwMCkKKworLyogVGhlc2UgYWRkcmVzc2VzIG5lZWQgdG8gYmUgc2hpZnRlZCBvbmUgcGxhY2UgdG8gdGhlIGxlZnQKKyAqICggYnVzIHBlcl9hZGRyIDIwIC0zMCBpcyBjb25uZWN0c2Qgb24gQ0YgYnVzIEExMC1BMCkKKyAqIFRoZXNlIHZhbHVlcyBhcmUgc2hpZnRlZAorICovCisjZGVmaW5lIENGR19BVEFfUE9SVF9BRERSKHBvcnQpICgocG9ydCkgPDwgMSkKKwogI2VuZGlmCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9wY3VfZS5oIGIvaW5jbHVkZS9jb25maWdzL3BjdV9lLmgKaW5kZXggNzNhYTNhOC4uZTNjODg0MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3BjdV9lLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3BjdV9lLmgKQEAgLTg5LDI4ICs4OSwzNCBAQAogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogI2RlZmluZSBDRkdfU1BJX0lOSVRfT0ZGU0VUCQkweEIwMAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKAlDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQkJQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJCUNGR19DTURfU05UUAkpCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sgXAotICAgICgoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKSAmIH5DT05GSUdfQk9PVFBfR0FURVdBWSkKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorI2RlZmluZSBDT05GSUdfQ01EX0JTUAorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU05UUAogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9wZG5iMy5oIGIvaW5jbHVkZS9jb25maWdzL3BkbmIzLmgKaW5kZXggMDZjNjY1Mi4uNWI1YjBlZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3BkbmIzLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3BkbmIzLmgKQEAgLTcxLDI1ICs3MSwzMyBAQAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUgICAgICAgICAxMTUyMDAKICNkZWZpbmUgQ0ZHX0lYUDQyNV9DT05TT0xFCUlYUDQyNV9VQVJUMSAgIC8qIHdlIHVzZSBVQVJUMSBmb3IgY29uc29sZSAqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfU0NQVSkKLSNkZWZpbmUgQ01EX05BTkRfQURECQkwCi0jZWxzZQotI2RlZmluZSBDTURfTkFORF9BREQJCUNGR19DTURfTkFORAorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisKKyNpZiAhZGVmaW5lZChDT05GSUdfU0NQVSkKKyNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECiAjZW5kaWYKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfTkVUCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNNRF9OQU5EX0FERAl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX1BJTkcpCi0KLS8qIFRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLS8qIFRoZXNlIGFyZSB1LWJvb3QgZ2VuZXJpYyBwYXJhbWV0ZXJzICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CiAKICNkZWZpbmUgQ09ORklHX1pFUk9fQk9PVERFTEFZX0NIRUNLCS8qIGNoZWNrIGZvciBrZXlwcmVzcyBvbiBib290ZGVsYXk9PTAgKi8KICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CS8qIGF1dG9ib290IGFmdGVyIDUgc2Vjb25kcwkqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3BmNTIwMC5oIGIvaW5jbHVkZS9jb25maWdzL3BmNTIwMC5oCmluZGV4IDcxNTFhOWUuLjE4ZDBjODcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9wZjUyMDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvcGY1MjAwLmgKQEAgLTQ5LDExICs0OSw2IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290CSAgICAgKi8KIAotI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCi0jZW5kaWYKLQogLyoKICAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KICAqLwpAQCAtOTAsMTMgKzg1LDYgQEAKICNkZWZpbmUgQ0ZHX1JYX0VUSF9CVUZGRVIJOAkvKiB1c2UgOCByeCBidWZmZXIgb24gZWVwcm8xMDAJKi8KICNkZWZpbmUgQ09ORklHX05TODM4MlgJCTEKICNlbmRpZgotCi0jZGVmaW5lIEFERF9QQ0lfQ01ECQlDRkdfQ01EX1BDSQotCi0jZWxzZQkJCQkvKiBNUEM1MTAwICovCi0KLSNkZWZpbmUgQUREX1BDSV9DTUQJCTAJLyogbm8gQ0ZHX0NNRF9QQ0kgKi8KLQogI2VuZGlmCiAKIC8qIFBhcnRpdGlvbnMgKi8KQEAgLTEwNiwyNiArOTQsMzUgQEAKIC8qIFVTQiAqLwogI2lmIDAKICNkZWZpbmUgQ09ORklHX1VTQl9PSENJCi0jZGVmaW5lIEFERF9VU0JfQ01ECQlDRkdfQ01EX1VTQiB8IENGR19DTURfRkFUCiAjZGVmaW5lIENPTkZJR19VU0JfU1RPUkFHRQotI2Vsc2UKLSNkZWZpbmUgQUREX1VTQl9DTUQJCTAKICNlbmRpZgogCi0vKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCi0gKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJIENGR19DTURfRUVQUk9NCXwgXAotCQkJCSBDRkdfQ01EX0ZBVAl8IFwKLQkJCQkgQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJIENGR19DTURfSURFCXwgXAotCQkJCSBDRkdfQ01EX0JTUAl8IFwKLQkJCQkgQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJIEFERF9QQ0lfQ01ECSAgKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSURFCisKKyNpZmRlZiBDT05GSUdfTVBDNTIwMAorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2VuZGlmCisKIAogI2lmIChURVhUX0JBU0UgPT0gMHhGRjAwMDAwMCkJLyogQm9vdCBsb3cgd2l0aCAxNiBNQiBGbGFzaCAqLwogIyAgIGRlZmluZSBDRkdfTE9XQk9PVAkJMQpAQCAtMjYzLDcgKzI2MCw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkgICAgKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkJIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAgICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZSAgKi8KQEAgLTI4MSw2ICsyNzgsMTEgQEAKIAogI2RlZmluZSBDRkdfVlhXT1JLU19NQUNfUFRSCTB4MDAwMDAwMDAJLyogUGFzcyBFdGhlcm5ldCBNQUMgdG8gVnhXb3JrcyAqLwogCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCisjZW5kaWYKKwogLyoKICAqIFZhcmlvdXMgbG93LWxldmVsIHNldHRpbmdzCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9wbGViMi5oIGIvaW5jbHVkZS9jb25maWdzL3BsZWIyLmgKaW5kZXggYTZjMjM3MS4uODYzMDI5ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3BsZWIyLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3BsZWIyLmgKQEAgLTY2LDEwICs2NiwyMyBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgJiB+Q0ZHX0NNRF9ORVQpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyN1bmRlZiBDT05GSUdfQ01EX05FVAorCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCiAjZGVmaW5lIENPTkZJR19FVEhBRERSCQkwODowMDozZToyNjowYTo1YgpAQCAtODMsNyArOTYsNyBAQAogI2RlZmluZSBDT05GSUdfSU5JVFJEX1RBRwogI2RlZmluZSBDT05GSUdfU0VUVVBfTUVNT1JZX1RBR1MKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvcHBtYzd4eC5oIGIvaW5jbHVkZS9jb25maWdzL3BwbWM3eHguaAppbmRleCAwNzJiOWRkLi5mZTdkZTdiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvcHBtYzd4eC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9wcG1jN3h4LmgKQEAgLTI1LDc1ICsyNSw5MSBAQAogLyoKICAqIERlYnVnCiAgKgotICogREVCVUcJCQktIERlZmluZSB0aGlzIGlzIHlvdSB3YW50IGV4dHJhIGRlYnVnIGluZm8KLSAqIEdUUkVHUkVBRAkJCS0gUmVxdWlyZWQgdG8gYnVpbGQgd2l0aCBkZWJ1ZwotICogZG9fYmRpbmZvCQkJLSBSZXF1aXJlZCB0byBidWlsZCB3aXRoIGRlYnVnCisgKiBERUJVRwkJLSBEZWZpbmUgdGhpcyBpcyB5b3Ugd2FudCBleHRyYSBkZWJ1ZyBpbmZvCisgKiBHVFJFR1JFQUQJCS0gUmVxdWlyZWQgdG8gYnVpbGQgd2l0aCBkZWJ1ZworICogZG9fYmRpbmZvCQktIFJlcXVpcmVkIHRvIGJ1aWxkIHdpdGggZGVidWcKICAqLwogCiAjdW5kZWYJREVCVUcKLSNkZWZpbmUJR1RSRUdSRUFEKHgpCQkJMHhGRkZGRkZGRgorI2lmZGVmCURFQlVHCisjZGVmaW5lCUdUUkVHUkVBRCh4KQkweEZGRkZGRkZGCiAjZGVmaW5lCWRvX2JkaW5mbyhhLGIsYyxkKQotCisjZW5kaWYKIAogLyoKICAqIENQVSB0eXBlCiAgKgotICogQ09ORklHXzd4eAkJCS0gV2UgaGF2ZSBhIDc1MCBvciA3NTUgQ1BVCi0gKiBDT05GSUdfNzR4eAkJCS0gV2UgaGF2ZSBhIDc0MDAgQ1BVCi0gKiBDT05GSUdfQUxUSVZFQwkJLSBXZSBoYXZlIGFsdGl2ZWMgZW5hYmxlZCBDUFUgKG9ubHkgNzQwMCkKLSAqIENPTkZJR19CVVNfQ0xLCQktIFN5c3RlbSBidXMgY2xvY2sgaW4gSHoKKyAqIENPTkZJR183eHgJCS0gV2UgaGF2ZSBhIDc1MCBvciA3NTUgQ1BVCisgKiBDT05GSUdfNzR4eAkJLSBXZSBoYXZlIGEgNzQwMCBDUFUKKyAqIENPTkZJR19BTFRJVkVDCS0gV2UgaGF2ZSBhbHRpdmVjIGVuYWJsZWQgQ1BVIChvbmx5IDc0MDApCisgKiBDT05GSUdfQlVTX0NMSwktIFN5c3RlbSBidXMgY2xvY2sgaW4gSHoKICAqLwogCiAjZGVmaW5lCUNPTkZJR183eHgKICN1bmRlZglDT05GSUdfNzR4eAogI3VuZGVmCUNPTkZJR19BTFRJVkVDCi0jZGVmaW5lIENPTkZJR19CVVNfQ0xLCQkJNjYwMDAwMDAKKyNkZWZpbmUgQ09ORklHX0JVU19DTEsJNjYwMDAwMDAKIAogCiAvKgogICogTW9uaXRvciBjb25maWd1cmF0aW9uCiAgKgotICogQ09ORklHX0NPTU1BTkRTCQktIExpc3Qgb2YgY29tbWFuZCBzZXRzIHRvIGluY2x1ZGUgaW4gc2hlbGwKKyAqIExpc3Qgb2YgY29tbWFuZCBzZXRzIHRvIGluY2x1ZGUgaW4gc2hlbGwKICAqCiAgKiBUaGUgZm9sbG93aW5nIGNvbW1hbmQgc2V0cyBoYXZlIGJlZW4gdGVzdGVkIGFuZCBrbm93biB0byB3b3JrOgogICoKLSAqIENGR19DTURfQ0FDSEUJCS0gQ2FjaGUgY29udHJvbCBjb21tYW5kcwotICogQ0ZHX0NNRF9NRU1PUlkJCS0gTWVtb3J5IGRpc3BsYXksIGNoYW5nZSBhbmQgdGVzdCBjb21tYW5kcwotICogQ0ZHX0NNRF9GTEFTSAkJLSBFcmFzZSBhbmQgcHJvZ3JhbSBmbGFzaAotICogQ0ZHX0NNRF9FTlYJCQktIEVudmlyb25tZW50IGNvbW1hbmRzCi0gKiBDRkdfQ01EX1JVTgkJCS0gUnVuIGNvbW1hbmRzIHN0b3JlZCBpbiBlbnYgdmFycwotICogQ0ZHX0NNRF9FTEYJCQktIExvYWQgRUxGIGZpbGVzCi0gKiBDRkdfQ01EX05FVAkJCS0gTmV0d29ya2luZy9maWxlIGRvd25sb2FkIGNvbW1hbmRzCi0gKiBDRkdfQ01EX1BJTkcJCQktIElDTVAgRWNobyBSZXF1ZXN0IGNvbW1hbmQKLSAqIENGR19DTURfUENJCQkJLSBQQ0kgQnVzIHNjYW5uaW5nIGNvbW1hbmQKKyAqIENNRF9DQUNIRQkJLSBDYWNoZSBjb250cm9sIGNvbW1hbmRzCisgKiBDTURfTUVNT1JZCQktIE1lbW9yeSBkaXNwbGF5LCBjaGFuZ2UgYW5kIHRlc3QgY29tbWFuZHMKKyAqIENNRF9GTEFTSAkJLSBFcmFzZSBhbmQgcHJvZ3JhbSBmbGFzaAorICogQ01EX0VOVgkJLSBFbnZpcm9ubWVudCBjb21tYW5kcworICogQ01EX1JVTgkJLSBSdW4gY29tbWFuZHMgc3RvcmVkIGluIGVudiB2YXJzCisgKiBDTURfRUxGCQktIExvYWQgRUxGIGZpbGVzCisgKiBDTURfTkVUCQktIE5ldHdvcmtpbmcvZmlsZSBkb3dubG9hZCBjb21tYW5kcworICogQ01EX1BJTgkJLSBJQ01QIEVjaG8gUmVxdWVzdCBjb21tYW5kCisgKiBDTURfUENJCQktIFBDSSBCdXMgc2Nhbm5pbmcgY29tbWFuZAogICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoIChDRkdfQ01EX0RGTCAmIH4oQ0ZHX0NNRF9LR0RCKSkgfAlcCi0JCQkJCQkgICBDRkdfQ01EX0ZMQVNIIHwJXAotCQkJCQkJICAgQ0ZHX0NNRF9FTlYgfAlcCi0JCQkJCQkgICBDRkdfQ01EX1JVTiB8CVwKLQkJCQkJCSAgIENGR19DTURfRUxGIHwJXAotCQkJCQkJICAgQ0ZHX0NNRF9ORVQgfAlcCi0JCQkJCQkgICBDRkdfQ01EX1BJTkcgfAlcCi0JCQkJCQkgICBDRkdfQ01EX1BDSSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX1JVTgorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKworI3VuZGVmIENPTkZJR19DTURfS0dEQgogCiAKIC8qCiAgKiBTZXJpYWwgY29uZmlndXJhdGlvbgogICoKICAqIENPTkZJR19DT05TX0lOREVYCQktIFNlcmlhbCBjb25zb2xlIHBvcnQgbnVtYmVyIChDT00xKQotICogQ09ORklHX0JBVURSQVRFCQkJLSBTZXJpYWwgc3BlZWQKKyAqIENPTkZJR19CQVVEUkFURQkJLSBTZXJpYWwgc3BlZWQKICAqLwogCi0jZGVmaW5lIENPTkZJR19DT05TX0lOREVYCQkxCi0jZGVmaW5lIENPTkZJR19CQVVEUkFURQkJCTk2MDAKKyNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVgJMQorI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTk2MDAKIAogCiAvKgogICogUENJIGNvbmZpZwogICoKLSAqIENPTkZJR19QQ0kJCQkJLSBFbmFibGUgUENJIGJ1cwotICogQ09ORklHX1BDSV9QTlAJCQktIEVuYWJsZSBQbHVnICYgUGxheSBzdXBwb3J0CisgKiBDT05GSUdfUENJCQkJLSBFbmFibGUgUENJIGJ1cworICogQ09ORklHX1BDSV9QTlAJCS0gRW5hYmxlIFBsdWcgJiBQbGF5IHN1cHBvcnQKICAqIENPTkZJR19QQ0lfU0NBTl9TSE9XCQktIEVuYWJsZSBkaXNwbGF5IG9mIGRldmljZXMgYXQgc3RhcnR1cAogICovCiAKQEAgLTEwNSw5ICsxMjEsOSBAQAogLyoKICAqIE5ldHdvcmsgY29uZmlnCiAgKgotICogQ09ORklHX05FVF9NVUxUSQkJCS0gU3VwcG9ydCBmb3IgbXVsdGlwbGUgbmV0d29yayBpbnRlcmZhY2VzCi0gKiBDT05GSUdfRUVQUk8xMDAJCQktIEludGVsIDgyNTV4IEV0aGVybmV0IENvbnRyb2xsZXIKLSAqIENPTkZJR19FRVBSTzEwMF9TUk9NX1dSSVRFIC0gRW5hYmxlIHdyaXRpbmcgdG8gbmV0d29yayBjYXJkIFJPTQorICogQ09ORklHX05FVF9NVUxUSQkJLSBTdXBwb3J0IGZvciBtdWx0aXBsZSBuZXR3b3JrIGludGVyZmFjZXMKKyAqIENPTkZJR19FRVBSTzEwMAkJLSBJbnRlbCA4MjU1eCBFdGhlcm5ldCBDb250cm9sbGVyCisgKiBDT05GSUdfRUVQUk8xMDBfU1JPTV9XUklURQktIEVuYWJsZSB3cml0aW5nIHRvIG5ldHdvcmsgY2FyZCBST00KICAqLwogCiAjZGVmaW5lCUNPTkZJR19ORVRfTVVMVEkKQEAgLTEzMCw3ICsxNDYsNyBAQAogICogQm9vdCBjb25maWcKICAqCiAgKiBDT05GSUdfQk9PVENPTU1BTkQJCS0gQ29tbWFuZChzKSB0byBleGVjdXRlIHRvIGF1dG8tYm9vdAotICogQ09ORklHX0JPT1RERUxBWQkJCS0gSG93IGxvbmcgdG8gd2FpdCBiZWZvcmUgYXV0by1ib290IChpbiBzZWMpCisgKiBDT05GSUdfQk9PVERFTEFZCQktIEhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIGF1dG8tYm9vdCAoaW4gc2VjKQogICovCiAKICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECQlcCkBAIC0xNDksODcgKzE2NSw4NCBAQAogICovCiAKIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgotCi0KIC8qCiAgKiBNZW1vcnkgbWFwCiAgKgogICogVGhpcyBib2FyZCBydW5zIGluIGEgc3RhbmRhcmQgQ0hSUCAoTWFwLUIpIGNvbmZpZ3VyYXRpb24uCiAgKgotICoJVHlwZQkJU3RhcnQJCUVuZAkJCVNpemUJV2lkdGgJQ2hpcCBTZWwKKyAqCVR5cGUJICAgIFN0YXJ0CUVuZAkgICAgU2l6ZSAgICBXaWR0aCAgIENoaXAgU2VsCiAgKgktLS0tLS0tLS0tLSAtLS0tLS0tLS0tLSAtLS0tLS0tLS0tLSAtLS0tLS0tIC0tLS0tLS0gLS0tLS0tLS0KLSAqCVNEUkFNCQkweDAwMDAwMDAwCTB4MDQwMDAwMDAJNjRNQgk2NGIJCVNEUkFNQ1MwCi0gKglVc2VyIExFRCdzCTB4NzgwMDAwMDAJCQkJCQlSQ1MzCi0gKglVQVJUCQkweDdDMDAwMDAwCQkJCQkJUkNTMgotICoJTWFpbGJveAkJMHhGRjAwMDAwMAkJCQkJCVJDUzEKLSAqCUZsYXNoCQkweEZGQzAwMDAwCTB4RkZGRkZGRkYJNE1CCTY0YgkJUkNTMAorICoJU0RSQU0JICAgIDB4MDAwMDAwMDAJMHgwNDAwMDAwMCAgNjRNQiAgICA2NGIJICAgIFNEUkFNQ1MwCisgKglVc2VyIExFRCdzICAweDc4MDAwMDAwCQkJCSAgICBSQ1MzCisgKglVQVJUCSAgICAweDdDMDAwMDAwCQkJCSAgICBSQ1MyCisgKglNYWlsYm94CSAgICAweEZGMDAwMDAwCQkJCSAgICBSQ1MxCisgKglGbGFzaAkgICAgMHhGRkMwMDAwMAkweEZGRkZGRkZGICAgNE1CICAgIDY0YgkgICAgUkNTMAogICoKICAqIEZsYXNoIHNlY3RvcnMgYXJlIGxhaWQgb3V0IGFzIGZvbGxvd3MuCiAgKgotICoJU2VjdG9yCVN0YXJ0CQlFbmQJCQlTaXplCUNvbW1lbnRzCisgKglTZWN0b3IJU3RhcnQJCUVuZAlTaXplCUNvbW1lbnRzCiAgKgktLS0tLS0tIC0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tIC0tLS0tLS0gLS0tLS0tLS0tLS0KLSAqCSAwCQkweEZGQzAwMDAwCTB4RkZDM0ZGRkYJMjU2S0IKLSAqICAgMQkJMHhGRkM0MDAwMAkweEZGQzdGRkZGCTI1NktCCi0gKgkgMgkJMHhGRkM4MDAwMAkweEZGQ0JGRkZGCTI1NktCCi0gKgkgMwkJMHhGRkNDMDAwMAkweEZGQ0ZGRkZGCTI1NktCCi0gKgkgNAkJMHhGRkQwMDAwMAkweEZGRDNGRkZGCTI1NktCCi0gKgkgNQkJMHhGRkQ0MDAwMAkweEZGRDdGRkZGCTI1NktCCi0gKgkgNgkJMHhGRkQ4MDAwMAkweEZGREJGRkZGCTI1NktCCi0gKgkgNwkJMHhGRkRDMDAwMAkweEZGREZGRkZGCTI1NktCCi0gKiAgIDgJCTB4RkZFMDAwMDAJMHhGRkUzRkZGRgkyNTZLQgotICoJIDkJCTB4RkZFNDAwMDAJMHhGRkU3RkZGRgkyNTZLQgotICogIDEwCQkweEZGRTgwMDAwCTB4RkZFQkZGRkYJMjU2S0IKLSAqICAxMQkJMHhGRkVDMDAwMAkweEZGRUZGRkZGCTI1NktCCi0gKiAgMTIJCTB4RkZGMDAwMDAJMHhGRkYzRkZGRgkyNTZLQglVLUJvb3QgY29kZSBoZXJlCi0gKiAgMTMJCTB4RkZGNDAwMDAJMHhGRkY3RkZGRgkyNTZLQgotICogIDE0CQkweEZGRjgwMDAwCTB4RkZGQkZGRkYJMjU2S0IKLSAqICAxNQkJMHhGRkZDMDAwMAkweEZGRkRGRkZGCTEyOEtCCi0gKiAgMTYJCTB4RkZGRTAwMDAJMHhGRkZFN0ZGRgkgMzJLQglVLUJvb3QgZW52IHZhcnMgaGVyZQotICogIDE3CQkweEZGRkU4MDAwCTB4RkZGRUZGRkYJIDMyS0IJVS1Cb290IGJhY2t1cCBjb3B5IG9mIGVudiB2YXJzIGhlcmUKLSAqICAxOAkJMHhGRkZGMDAwMAkweEZGRkZGRkZGCSA2NEtCCisgKgkgMAkweEZGQzAwMDAwICAweEZGQzNGRkZGCTI1NktCCisgKgkgMQkweEZGQzQwMDAwICAweEZGQzdGRkZGCTI1NktCCisgKgkgMgkweEZGQzgwMDAwICAweEZGQ0JGRkZGCTI1NktCCisgKgkgMwkweEZGQ0MwMDAwICAweEZGQ0ZGRkZGCTI1NktCCisgKgkgNAkweEZGRDAwMDAwICAweEZGRDNGRkZGCTI1NktCCisgKgkgNQkweEZGRDQwMDAwICAweEZGRDdGRkZGCTI1NktCCisgKgkgNgkweEZGRDgwMDAwICAweEZGREJGRkZGCTI1NktCCisgKgkgNwkweEZGREMwMDAwICAweEZGREZGRkZGCTI1NktCCisgKgkgOAkweEZGRTAwMDAwICAweEZGRTNGRkZGCTI1NktCCisgKgkgOQkweEZGRTQwMDAwICAweEZGRTdGRkZGCTI1NktCCisgKgkxMAkweEZGRTgwMDAwICAweEZGRUJGRkZGCTI1NktCCisgKgkxMQkweEZGRUMwMDAwICAweEZGRUZGRkZGCTI1NktCCisgKgkxMgkweEZGRjAwMDAwICAweEZGRjNGRkZGCTI1NktCCVUtQm9vdCBjb2RlIGhlcmUKKyAqCTEzCTB4RkZGNDAwMDAgIDB4RkZGN0ZGRkYJMjU2S0IKKyAqCTE0CTB4RkZGODAwMDAgIDB4RkZGQkZGRkYJMjU2S0IKKyAqCTE1CTB4RkZGQzAwMDAgIDB4RkZGREZGRkYJMTI4S0IKKyAqCTE2CTB4RkZGRTAwMDAgIDB4RkZGRTdGRkYJIDMyS0IJVS1Cb290IGVudiB2YXJzIGhlcmUKKyAqCTE3CTB4RkZGRTgwMDAgIDB4RkZGRUZGRkYJIDMyS0IJVS1Cb290IGJhY2t1cCBjb3B5IG9mIGVudiB2YXJzIGhlcmUKKyAqCTE4CTB4RkZGRjAwMDAgIDB4RkZGRkZGRkYJIDY0S0IKICAqLwogCiAKIC8qCiAgKiBTRFJBTSBjb25maWcgLSBzZWUgbWVtb3J5IG1hcCBkZXRhaWxzIGFib3ZlLgogICoKLSAqIENGR19TRFJBTV9CQVNFCQkJLSBTdGFydCBhZGRyZXNzIG9mIFNEUkFNLCB0aGlzIF9tdXN0XyBiZSB6ZXJvIQotICogQ0ZHX1NEUkFNX1NJWkUJCQktIFRvdGFsIHNpemUgb2YgY29udGlndW91cyBTRFJBTSBiYW5rKHMpCisgKiBDRkdfU0RSQU1fQkFTRQkJLSBTdGFydCBhZGRyZXNzIG9mIFNEUkFNLCB0aGlzIF9tdXN0XyBiZSB6ZXJvIQorICogQ0ZHX1NEUkFNX1NJWkUJCS0gVG90YWwgc2l6ZSBvZiBjb250aWd1b3VzIFNEUkFNIGJhbmsocykKICAqLwogCi0jZGVmaW5lIENGR19TRFJBTV9CQVNFCQkJMHgwMDAwMDAwMAotI2RlZmluZSBDRkdfU0RSQU1fU0laRQkJCTB4MDQwMDAwMDAKKyNkZWZpbmUgQ0ZHX1NEUkFNX0JBU0UJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX1NEUkFNX1NJWkUJCTB4MDQwMDAwMDAKIAogCiAvKgogICogRmxhc2ggY29uZmlnIC0gc2VlIG1lbW9yeSBtYXAgZGV0YWlscyBhYm92ZS4KICAqCi0gKiBDRkdfRkxBU0hfQkFTRQkJCS0gU3RhcnQgYWRkcmVzcyBvZiBmbGFzaCBtZW1vcnkKLSAqIENGR19GTEFTSF9TSVpFCQkJLSBUb3RhbCBzaXplIG9mIGNvbnRpZ3VvdXMgZmxhc2ggbWVtCisgKiBDRkdfRkxBU0hfQkFTRQkJLSBTdGFydCBhZGRyZXNzIG9mIGZsYXNoIG1lbW9yeQorICogQ0ZHX0ZMQVNIX1NJWkUJCS0gVG90YWwgc2l6ZSBvZiBjb250aWd1b3VzIGZsYXNoIG1lbQogICogQ0ZHX0ZMQVNIX0VSQVNFX1RPVVQJCS0gRXJhc2UgdGltZW91dCBpbiBtcwogICogQ0ZHX0ZMQVNIX1dSSVRFX1RPVVQJCS0gV3JpdGUgdGltZW91dCBpbiBtcwogICogQ0ZHX01BWF9GTEFTSF9CQU5LUwkJLSBOdW1iZXIgb2YgYmFua3Mgb2YgZmxhc2ggb24gYm9hcmQKICAqIENGR19NQVhfRkxBU0hfU0VDVAkJLSBOdW1iZXIgb2Ygc2VjdG9ycyBpbiBhIGJhbmsKICAqLwogCi0jZGVmaW5lIENGR19GTEFTSF9CQVNFCQkJMHhGRkMwMDAwMAotI2RlZmluZSBDRkdfRkxBU0hfU0laRQkJCTB4MDA0MDAwMDAKKyNkZWZpbmUgQ0ZHX0ZMQVNIX0JBU0UJCTB4RkZDMDAwMDAKKyNkZWZpbmUgQ0ZHX0ZMQVNIX1NJWkUJCTB4MDA0MDAwMDAKICNkZWZpbmUgQ0ZHX0ZMQVNIX0VSQVNFX1RPVVQJMjUwMDAwCiAjZGVmaW5lIENGR19GTEFTSF9XUklURV9UT1VUCTUwMDAKLSNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9CQU5LUwkJMQotI2RlZmluZSBDRkdfTUFYX0ZMQVNIX1NFQ1QJCTE5CisjZGVmaW5lIENGR19NQVhfRkxBU0hfQkFOS1MJMQorI2RlZmluZSBDRkdfTUFYX0ZMQVNIX1NFQ1QJMTkKIAogCiAvKgogICogTW9uaXRvciBjb25maWcgLSBzZWUgbWVtb3J5IG1hcCBkZXRhaWxzIGFib3ZlCiAgKgotICogQ0ZHX01PTklUT1JfQkFTRQkJCS0gQmFzZSBhZGRyZXNzIG9mIG1vbml0b3IgY29kZQotICogQ0ZHX01BTExPQ19MRU4JCQktIFNpemUgb2YgbWFsbG9jIHBvb2wgKDEyOEtCKQorICogQ0ZHX01PTklUT1JfQkFTRQkJLSBCYXNlIGFkZHJlc3Mgb2YgbW9uaXRvciBjb2RlCisgKiBDRkdfTUFMTE9DX0xFTgkJLSBTaXplIG9mIG1hbGxvYyBwb29sICgxMjhLQikKICAqLwogCi0jZGVmaW5lIENGR19NT05JVE9SX0JBU0UJCVRFWFRfQkFTRQotI2RlZmluZSBDRkdfTUFMTE9DX0xFTgkJCTB4MjAwMDAKKyNkZWZpbmUgQ0ZHX01PTklUT1JfQkFTRQlURVhUX0JBU0UKKyNkZWZpbmUgQ0ZHX01BTExPQ19MRU4JCTB4MjAwMDAKIAogCiAvKgpAQCAtMjQ3LDE2ICsyNjAsMTYgQEAKICAqIENGR19QUk9NUFQJCQktIFByb21wdCBzdHJpbmcKICAqLwogCi0jZGVmaW5lIENGR19CQVJHU0laRQkJCTEwMjQKLSNkZWZpbmUgQ0ZHX0JPT1RNQVBTWgkJCTB4ODAwMDAwCi0jZGVmaW5lIENGR19DQlNJWkUJCQkxMDI0Ci0jZGVmaW5lIENGR19MT0FEX0FERFIJCQkweDEwMDAwMAorI2RlZmluZSBDRkdfQkFSR1NJWkUJCTEwMjQKKyNkZWZpbmUgQ0ZHX0JPT1RNQVBTWgkJMHg4MDAwMDAKKyNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAorI2RlZmluZSBDRkdfTE9BRF9BRERSCQkweDEwMDAwMAogI2RlZmluZSBDRkdfTE9OR0hFTFAKLSNkZWZpbmUgQ0ZHX01BWEFSR1MJCQkxNgotI2RlZmluZSBDRkdfTUVNVEVTVF9TVEFSVAkJMHgwMDA0MDAwMAotI2RlZmluZSBDRkdfTUVNVEVTVF9FTkQJCQkweDAwMDQwMTAwCi0jZGVmaW5lIENGR19QQlNJWkUJCQkxMDI0Ci0jZGVmaW5lIENGR19QUk9NUFQJCQkiPT4gIgorI2RlZmluZSBDRkdfTUFYQVJHUwkJMTYKKyNkZWZpbmUgQ0ZHX01FTVRFU1RfU1RBUlQJMHgwMDA0MDAwMAorI2RlZmluZSBDRkdfTUVNVEVTVF9FTkQJCTB4MDAwNDAxMDAKKyNkZWZpbmUgQ0ZHX1BCU0laRQkJMTAyNAorI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgogCiAKIC8qCkBAIC0yNjgsMTIgKzI4MSwxMiBAQAogICogQ0ZHX0VOVl9TRUNUX1NJWkUJCS0gU2l6ZSBvZiBzZWN0b3IgY29udGFpbmluZyBlbnYgdmFycyAoMzJLQikKICAqLwogCi0jZGVmaW5lIENGR19FTlZfSVNfSU5fRkxBU0gJCTEKLSNkZWZpbmUgQ0ZHX0VOVl9BRERSCQkJMHhGRkZFMDAwMAotI2RlZmluZSBDRkdfRU5WX1NJWkUJCQkweDEwMDAKLSNkZWZpbmUgQ0ZHX0VOVl9BRERSX1JFRFVORAkJMHhGRkZFODAwMAotI2RlZmluZSBDRkdfRU5WX1NJWkVfUkVEVU5ECQkweDEwMDAKLSNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJCTB4ODAwMAorI2RlZmluZSBDRkdfRU5WX0lTX0lOX0ZMQVNICTEKKyNkZWZpbmUgQ0ZHX0VOVl9BRERSCQkweEZGRkUwMDAwCisjZGVmaW5lIENGR19FTlZfU0laRQkJMHgxMDAwCisjZGVmaW5lIENGR19FTlZfQUREUl9SRURVTkQJMHhGRkZFODAwMAorI2RlZmluZSBDRkdfRU5WX1NJWkVfUkVEVU5ECTB4MTAwMAorI2RlZmluZSBDRkdfRU5WX1NFQ1RfU0laRQkweDgwMDAKIAogCiAvKgpAQCAtMjg0LDE1ICsyOTcsMTUgQEAKICAqIGNvcGllZCB0byB0b3Agb2YgUkFNIGJ5IHRoZSBpbml0IGNvZGUuCiAgKgogICogQ0ZHX0lOSVRfUkFNX0FERFIJCS0gQWRkcmVzcyBvZiBJbml0IFJBTSwgYWJvdmUgZXhjZXB0aW9uIHZlY3QKLSAqIENGR19JTklUX1JBTV9FTkQJCQktIFNpemUgb2YgSW5pdCBSQU0KKyAqIENGR19JTklUX1JBTV9FTkQJCS0gU2l6ZSBvZiBJbml0IFJBTQogICogQ0ZHX0dCTF9EQVRBX1NJWkUJCS0gQW1tb3VudCBvZiBSQU0gdG8gcmVzZXJ2ZSBmb3IgZ2xvYmFsIGRhdGEKICAqIENGR19HQkxfREFUQV9PRkZTRVQJCS0gU3RhcnQgb2YgZ2xvYmFsIGRhdGEsIHRvcCBvZiBzdGFjawogICovCiAKLSNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0FERFIJCShDRkdfU0RSQU1fQkFTRSArIDB4NDAwMCkKLSNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0VORAkJMHg0MDAwCi0jZGVmaW5lIENGR19HQkxfREFUQV9TSVpFCQkxMjgKLSNkZWZpbmUgQ0ZHX0dCTF9EQVRBX09GRlNFVAkJKENGR19JTklUX1JBTV9FTkQgLSBDRkdfR0JMX0RBVEFfU0laRSkKKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0FERFIJKENGR19TRFJBTV9CQVNFICsgMHg0MDAwKQorI2RlZmluZSBDRkdfSU5JVF9SQU1fRU5ECTB4NDAwMAorI2RlZmluZSBDRkdfR0JMX0RBVEFfU0laRQkxMjgKKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX09GRlNFVAkoQ0ZHX0lOSVRfUkFNX0VORCAtIENGR19HQkxfREFUQV9TSVpFKQogCiAKIC8qCkBAIC0zMjksNzEgKzM0Miw3MSBAQAogICogQ2FjaGUgY29uZmlnCiAgKgogICogQ0ZHX0NBQ0hFTElORV9TSVpFCQktIFNpemUgb2YgYSBjYWNoZSBsaW5lIChDUFUgc3BlY2lmaWMpCi0gKiBDRkdfTDIJCQkJCS0gTDIgY2FjaGUgZW5hYmxlZCBpZiBkZWZpbmVkCi0gKiBMMl9JTklUCQkJCQktIEwyIGNhY2hlIGluaXQgZmxhZ3MKLSAqIEwyX0VOQUJMRQkJCQktIEwyIGNhY2hlIGVuYWJsZSBmbGFncworICogQ0ZHX0wyCQkJLSBMMiBjYWNoZSBlbmFibGVkIGlmIGRlZmluZWQKKyAqIEwyX0lOSVQJCQktIEwyIGNhY2hlIGluaXQgZmxhZ3MKKyAqIEwyX0VOQUJMRQkJCS0gTDIgY2FjaGUgZW5hYmxlIGZsYWdzCiAgKi8KIAotI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJCTMyCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgogI3VuZGVmCUNGR19MMgotI2RlZmluZSBMMl9JTklUCQkJCQkwCi0jZGVmaW5lIEwyX0VOQUJMRQkJCQkwCisjZGVmaW5lIEwyX0lOSVQJCQkwCisjZGVmaW5lIEwyX0VOQUJMRQkJMAogCiAKIC8qCiAgKiBDbG9ja3MgY29uZmlnCiAgKgotICogQ0ZHX0JVU19IWgkJCQktIEJ1cyBjbG9jayBmcmVxdWVuY3kgaW4gSHoKLSAqIENGR19CVVNfQ0xLCQkJCS0gQXMgYWJvdmUgKD8pCi0gKiBDRkdfSFoJCQkJCS0gRGVjcmVtZW50ZXIgZnJlcSBpbiBIegorICogQ0ZHX0JVU19IWgkJCS0gQnVzIGNsb2NrIGZyZXF1ZW5jeSBpbiBIegorICogQ0ZHX0JVU19DTEsJCQktIEFzIGFib3ZlICg/KQorICogQ0ZHX0haCQkJLSBEZWNyZW1lbnRlciBmcmVxIGluIEh6CiAgKi8KIAotI2RlZmluZSBDRkdfQlVTX0haCQkJCUNPTkZJR19CVVNfQ0xLCi0jZGVmaW5lIENGR19CVVNfQ0xLCQkJCUNPTkZJR19CVVNfQ0xLCi0jZGVmaW5lIENGR19IWgkJCQkJMTAwMAorI2RlZmluZSBDRkdfQlVTX0haCQlDT05GSUdfQlVTX0NMSworI2RlZmluZSBDRkdfQlVTX0NMSwkJQ09ORklHX0JVU19DTEsKKyNkZWZpbmUgQ0ZHX0haCQkJMTAwMAogCiAKIC8qCiAgKiBTZXJpYWwgcG9ydCBjb25maWcKICAqCiAgKiBDRkdfQkFVRFJBVEVfVEFCTEUJCS0gTGlzdCBvZiB2YWxpZCBiYXVkIHJhdGVzCi0gKiBDRkdfTlMxNjU1MAkJCQktIEluY2x1ZGUgdGhlIE5TMTY1NTAgZHJpdmVyCisgKiBDRkdfTlMxNjU1MAkJCS0gSW5jbHVkZSB0aGUgTlMxNjU1MCBkcml2ZXIKICAqIENGR19OUzE2NTUwX1NFUklBTAkJLSBJbmNsdWRlIHRoZSBzZXJpYWwgKHdyYXBwZXIpIGRyaXZlcgotICogQ0ZHX05TMTY1NTBfQ0xLCQkJLSBGcmVxdWVuY3kgb2YgcmVmZXJlbmNlIGNsb2NrCisgKiBDRkdfTlMxNjU1MF9DTEsJCS0gRnJlcXVlbmN5IG9mIHJlZmVyZW5jZSBjbG9jawogICogQ0ZHX05TMTY1NTBfUkVHX1NJWkUJCS0gNjQtYml0IGFjY2Vzc2VzIHRvIDgtYml0IHBvcnQKLSAqIENGR19OUzE2NTUwX0NPTTEJCQktIEJhc2UgYWRkcmVzcyBvZiAxc3Qgc2VyaWFsIHBvcnQKKyAqIENGR19OUzE2NTUwX0NPTTEJCS0gQmFzZSBhZGRyZXNzIG9mIDFzdCBzZXJpYWwgcG9ydAogICovCiAKLSNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CisjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CiAjZGVmaW5lIENGR19OUzE2NTUwCiAjZGVmaW5lIENGR19OUzE2NTUwX1NFUklBTAotI2RlZmluZSBDRkdfTlMxNjU1MF9DTEsJCQkzNjg2NDAwCisjZGVmaW5lIENGR19OUzE2NTUwX0NMSwkJMzY4NjQwMAogI2RlZmluZSBDRkdfTlMxNjU1MF9SRUdfU0laRQktOAotI2RlZmluZSBDRkdfTlMxNjU1MF9DT00xCQkweDdDMDAwMDAwCisjZGVmaW5lIENGR19OUzE2NTUwX0NPTTEJMHg3QzAwMDAwMAogCiAKIC8qCiAgKiBQQ0kgQ29uZmlnIC0gQWRkcmVzcyBNYXAgQiAoQ0hSUCkKICAqLwogCi0jZGVmaW5lIENGR19QQ0lfTUVNT1JZX0JVUyAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgQ0ZHX1BDSV9NRU1PUllfUEhZUyAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBDRkdfUENJX01FTU9SWV9TSVpFICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIENGR19QQ0lfTUVNX0JVUyAgICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgQ0ZHX1BDSV9NRU1fUEhZUyAgICAgICAgMHg4MDAwMDAwMAotI2RlZmluZSBDRkdfUENJX01FTV9TSVpFICAgICAgICAweDdEMDAwMDAwCi0jZGVmaW5lIENGR19JU0FfTUVNX0JVUyAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgQ0ZHX0lTQV9NRU1fUEhZUyAgICAgICAgMHhGRDAwMDAwMAotI2RlZmluZSBDRkdfSVNBX01FTV9TSVpFICAgICAgICAweDAxMDAwMDAwCi0jZGVmaW5lIENGR19QQ0lfSU9fQlVTICAgICAgICAgIDB4MDA4MDAwMDAKLSNkZWZpbmUgQ0ZHX1BDSV9JT19QSFlTICAgICAgICAgMHhGRTgwMDAwMAotI2RlZmluZSBDRkdfUENJX0lPX1NJWkUgICAgICAgICAweDAwNDAwMDAwCi0jZGVmaW5lIENGR19JU0FfSU9fQlVTICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgQ0ZHX0lTQV9JT19QSFlTICAgICAgICAgMHhGRTAwMDAwMAotI2RlZmluZSBDRkdfSVNBX0lPX1NJWkUgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIENGR19QQ0lfTUVNT1JZX0JVUwkweDAwMDAwMDAwCisjZGVmaW5lIENGR19QQ0lfTUVNT1JZX1BIWVMJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfUENJX01FTU9SWV9TSVpFCTB4NDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX1BDSV9NRU1fQlVTCQkweDgwMDAwMDAwCisjZGVmaW5lIENGR19QQ0lfTUVNX1BIWVMJMHg4MDAwMDAwMAorI2RlZmluZSBDRkdfUENJX01FTV9TSVpFCTB4N0QwMDAwMDAKKyNkZWZpbmUgQ0ZHX0lTQV9NRU1fQlVTCQkweDAwMDAwMDAwCisjZGVmaW5lIENGR19JU0FfTUVNX1BIWVMJMHhGRDAwMDAwMAorI2RlZmluZSBDRkdfSVNBX01FTV9TSVpFCTB4MDEwMDAwMDAKKyNkZWZpbmUgQ0ZHX1BDSV9JT19CVVMJCTB4MDA4MDAwMDAKKyNkZWZpbmUgQ0ZHX1BDSV9JT19QSFlTCQkweEZFODAwMDAwCisjZGVmaW5lIENGR19QQ0lfSU9fU0laRQkJMHgwMDQwMDAwMAorI2RlZmluZSBDRkdfSVNBX0lPX0JVUwkJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfSVNBX0lPX1BIWVMJCTB4RkUwMDAwMDAKKyNkZWZpbmUgQ0ZHX0lTQV9JT19TSVpFCQkweDAwODAwMDAwCiAjZGVmaW5lIENGR19JU0FfSU9fQkFTRV9BRERSRVNTIENGR19JU0FfSU9fUEhZUwotI2RlZmluZSBDRkdfSVNBX0lPICAgICAgICAgICAgICBDRkdfSVNBX0lPX1BIWVMKLSNkZWZpbmUgQ0ZHXzYwWF9QQ0lfSU9fT0ZGU0VUICAgQ0ZHX0lTQV9JT19QSFlTCisjZGVmaW5lIENGR19JU0FfSU8JCUNGR19JU0FfSU9fUEhZUworI2RlZmluZSBDRkdfNjBYX1BDSV9JT19PRkZTRVQJQ0ZHX0lTQV9JT19QSFlTCiAKIAogLyoKQEAgLTQwOCwxMiArNDIxLDEyIEBACiAvKgogICogQm9vdCBmbGFncwogICoKLSAqIEJPT1RGTEFHX0NPTEQJCQktIEluZGljYXRlcyBhIHBvd2VyLW9uIGJvb3QKLSAqIEJPT1RGTEFHX1dBUk0JCQktIEluZGljYXRlcyBhIHNvZnR3YXJlIHJlc2V0CisgKiBCT09URkxBR19DT0xECQktIEluZGljYXRlcyBhIHBvd2VyLW9uIGJvb3QKKyAqIEJPT1RGTEFHX1dBUk0JCS0gSW5kaWNhdGVzIGEgc29mdHdhcmUgcmVzZXQKICAqLwogCi0jZGVmaW5lIEJPT1RGTEFHX0NPTEQJCQkweDAxCi0jZGVmaW5lIEJPT1RGTEFHX1dBUk0JCQkweDAyCisjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEKKyNkZWZpbmUgQk9PVEZMQUdfV0FSTQkJMHgwMgogCiAKICNlbmRpZiAvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvcHBtYzgyNjAuaCBiL2luY2x1ZGUvY29uZmlncy9wcG1jODI2MC5oCmluZGV4IGQ2NzFkY2MuLmZiNWFlOTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9wcG1jODI2MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9wcG1jODI2MC5oCkBAIC0xNjksOCArMTY5LDcgQEAKICAqIGZvciBGQ0MpCiAgKgogICogaWYgQ09ORklHX0VUSEVSX05PTkUgaXMgZGVmaW5lZCwgdGhlbiBlaXRoZXIgdGhlIGV0aGVybmV0IHJvdXRpbmVzIG11c3QgYmUKLSAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDRkdfQ01EX05FVCBtdXN0IGJlIHJlbW92ZWQKLSAqIGZyb20gQ09ORklHX0NPTU1BTkRTIHRvIHJlbW92ZSBzdXBwb3J0IGZvciBuZXR3b3JraW5nLgorICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENPTkZJR19DTURfTkVUIG11c3QgYmUgdW5zZXQuCiAgKi8KIAogI3VuZGVmCUNPTkZJR19FVEhFUl9PTl9TQ0MJCS8qIGRlZmluZSBpZiBldGhlcm5ldCBvbiBTQ0MJKi8KQEAgLTI2MSwxMyArMjYwLDE3IEBACiAJImJvb3RtIgogI2VuZGlmIC8qIENPTkZJR19CT09UX1JPT1RfTkZTICovCiAKLS8qIEFkZCBzdXBwb3J0IGZvciBhIGZldyBleHRyYSBib290cCBvcHRpb25zIGxpa2U6Ci0gKgktIEZpbGUgc2l6ZQotICoJLSBETlMKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKICAqLwotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBcCi0JCQkJIENPTkZJR19CT09UUF9CT09URklMRVNJWkUgfCBcCi0JCQkJIENPTkZJR19CT09UUF9ETlMpCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TCisKIAogLyogdW5kZWYgdGhpcyB0byBzYXZlIG1lbW9yeSAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAKQEAgLTI3NSwxNCArMjc4LDIwIEBACiAvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCiAKLS8qIFdoYXQgVS1Cb290IHN1YnN5dGVtcyBkbyB5b3Ugd2FudCBlbmFibGVkPyAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCSgoKENPTkZJR19DTURfREZMICYgfihDRkdfQ01EX0tHREIpKSkgfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPIHwgXAotCQkJCUNGR19DTURfTUVNVEVTVCB8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX0lNTUFQKQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9NRU1URVNUCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKworI3VuZGVmIENPTkZJR19DTURfS0dEQgogCiAKIC8qIFdoZXJlIGRvIHRoZSBpbnRlcm5hbCByZWdpc3RlcnMgbGl2ZT8gKi8KQEAgLTI5OCwxMyArMzA3LDEwIEBACiAjZGVmaW5lIENPTkZJR19QUE1DODI2MAkJMQkvKiBvbiBhbiBXaW5kIFJpdmVyIFBQTUM4MjYwIEJvYXJkICAqLwogI2RlZmluZSBDT05GSUdfQ1BNMgkJMQkvKiBIYXMgYSBDUE0yICovCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkgICAgICovCiAjZWxzZQogIyAgZGVmaW5lIENGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkgICAgICovCkBAIC00NzcsNyArNDgzLDcgQEAKICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyNjAgQ1BVICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3B1cnBsZS5oIGIvaW5jbHVkZS9jb25maWdzL3B1cnBsZS5oCmluZGV4IDJlY2I3ZmIuLjZlYjYxOGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9wdXJwbGUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvcHVycGxlLmgKQEAgLTgxLDggKzgxLDIzIEBACiAJIiIKICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJydW4gZmxhc2hfc2VsZiIKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9FTEYpCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKwogCiAjZGVmaW5lIENGR19TRFJBTV9CQVNFCQkweDgwMDAwMDAwCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9weGEyNTVfaWRwLmggYi9pbmNsdWRlL2NvbmZpZ3MvcHhhMjU1X2lkcC5oCmluZGV4IGU1ZTI3NzIuLjBlODg0ZmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9weGEyNTVfaWRwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3B4YTI1NV9pZHAuaApAQCAtMTAyLDEwICsxMDIsMjUgQEAKIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9NTUMgfCBDRkdfQ01EX0ZBVCB8IENGR19DTURfREhDUCApCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9NTUMKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJib290bSA0MDAwMCIKQEAgLTE5Miw3ICsyMDcsNyBAQAogLyoJCQkicHJvdGVjdCBvZmYiCSovCiAKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTExNTIwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvcXVhbnR1bS5oIGIvaW5jbHVkZS9jb25maWdzL3F1YW50dW0uaAppbmRleCAyMWVjNWFjLi5mNDllMmIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvcXVhbnR1bS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9xdWFudHVtLmgKQEAgLTkyLDE4ICs5MiwyOCBAQAogI2RlZmluZSBDRkdfTlZSQU1fU0laRSAyMDQ4CiAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX1JFR0lORk8JfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorCiAKICNkZWZpbmUgQ09ORklHX0FVVE9CT09UX0tFWUVECS8qIEVuYWJsZSBwYXNzd29yZCBwcm90ZWN0aW9uICovCiAjZGVmaW5lIENPTkZJR19BVVRPQk9PVF9QUk9NUFQJCSJcbkVudGVyIHBhc3N3b3JkIC0gYXV0b2Jvb3QgaW4gJWQgc2VjLi4uXG4iCkBAIC0xMTMsNyArMTIzLDcgQEAKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTcyLDcgKzE4Miw3IEBACiAjZW5kaWYKIAogLyolJSUgI2RlZmluZSBDRkdfRkxBU0hfQkFTRQkJMHhGRkYwMDAwMCAqLwotI2lmIGRlZmluZWQoREVCVUcpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKENPTkZJR19DTURfSURFKQogI2RlZmluZSBDRkdfTU9OSVRPUl9MRU4JCSgyNTYgPDwgMTApCS8qIFJlc2VydmUgMjU2IGtCIGZvciBNb25pdG9yCSovCiAjZWxzZQogI2RlZmluZSBDRkdfTU9OSVRPUl9MRU4JCSgxMjggPDwgMTApCS8qIFJlc2VydmUgMTI4IGtCIGZvciBNb25pdG9yCSovCkBAIC0yMjIsNyArMjMyLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3I1MjAwLmggYi9pbmNsdWRlL2NvbmZpZ3MvcjUyMDAuaAppbmRleCBlMWU0MDZiLi4wZTc0M2JiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvcjUyMDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvcjUyMDAuaApAQCAtNjYsMTAgKzY2LDI3IEBACiAjZGVmaW5lIENGR19FTlZfSVNfSU5fRkxBU0gJMQogI2VuZGlmCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAoKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QSU5HIHwgQ0ZHX0NNRF9ORVQgKSAmIH4oQ0ZHX0NNRF9MT0FEUyB8IENGR19DTURfTE9BREIpKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX05FVAorCisjdW5kZWYgQ09ORklHX0NNRF9MT0FEUworI3VuZGVmIENPTkZJR19DTURfTE9BREIKKwogCiAvKiBOb3RlOiBXZSBvbmx5IGNvcHkgb25lIHNlY3RvcnMgd29ydGggb2YgYXBwbGljYXRpb24gY29kZSBmcm9tIGxvY2F0aW9uCiAgKiAxMDIwMDAwMCBmb3Igc3BlZWQgcHVycG9zZXMuICBJbmNyZWFzZSB0aGUgc2l6ZSBpZiBuZWNlc3NhcnkgKi8KQEAgLTc5LDcgKzk2LDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVAkJInUtYm9vdD4gIgogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3JtdS5oIGIvaW5jbHVkZS9jb25maWdzL3JtdS5oCmluZGV4IGIzMTljZjQuLjJjYTYwYjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9ybXUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvcm11LmgKQEAgLTg3LDE3ICs4NywyOCBAQAogCiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZQlDT05GSUdfQVVUT0JPT1RfS0VZRUQJCS8qIEVuYWJsZSBwYXNzd29yZCBwcm90ZWN0aW9uICovCiAjZGVmaW5lCUNPTkZJR19BVVRPQk9PVF9QUk9NUFQJCSJcbkVudGVyIHBhc3N3b3JkIC0gYXV0b2Jvb3QgaW4gJWQgc2VjLi4uXG4iCkBAIC0xMDgsNyArMTE5LDcgQEAKICAqLwogI2RlZmluZQlDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUJQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMTUyLDcgKzE2Myw3IEBACiAgKi8KICNkZWZpbmUJQ0ZHX1NEUkFNX0JBU0UJCTB4MDAwMDAwMDAKICNkZWZpbmUgQ0ZHX0ZMQVNIX0JBU0UJCSgwLWZsYXNoX2luZm9bMF0uc2l6ZSkJLyogUHV0IGZsYXNoIGF0IGVuZAkqLwotI2lmIGRlZmluZWQoREVCVUcpIHx8IChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKENPTkZJR19DTURfSURFKQogI2RlZmluZQlDRkdfTU9OSVRPUl9MRU4JCSgyNTYgPDwgMTApCS8qIFJlc2VydmUgMjU2IGtCIGZvciBNb25pdG9yCSovCiAjZWxzZQogI2RlZmluZQlDRkdfTU9OSVRPUl9MRU4JCSgxMjggPDwgMTApCS8qIFJlc2VydmUgMTI4IGtCIGZvciBNb25pdG9yCSovCkBAIC0xOTMsNyArMjA0LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3JzZHByb3RvLmggYi9pbmNsdWRlL2NvbmZpZ3MvcnNkcHJvdG8uaAppbmRleCA2YzllMzkyLi44MTQwODJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvcnNkcHJvdG8uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvcnNkcHJvdG8uaApAQCAtNjQsOCArNjQsNyBAQAogICogZm9yIEZDQykKICAqCiAgKiBpZiBDT05GSUdfRVRIRVJfTk9ORSBpcyBkZWZpbmVkLCB0aGVuIGVpdGhlciB0aGUgZXRoZXJuZXQgcm91dGluZXMgbXVzdCBiZQotICogZGVmaW5lZCBlbHNld2hlcmUgKGFzIGZvciB0aGUgY29uc29sZSksIG9yIENGR19DTURfTkVUIG11c3QgYmUgcmVtb3ZlZAotICogZnJvbSBDT05GSUdfQ09NTUFORFMgdG8gcmVtb3ZlIHN1cHBvcnQgZm9yIG5ldHdvcmtpbmcuCisgKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ09ORklHX0NNRF9ORVQgbXVzdCBiZSB1bnNldC4KICAqLwogI3VuZGVmCUNPTkZJR19FVEhFUl9PTl9TQ0MJCS8qIGRlZmluZSBpZiBldGhlcm5ldCBvbiBTQ0MJKi8KICNkZWZpbmUJQ09ORklHX0VUSEVSX09OX0ZDQwkJLyogZGVmaW5lIGlmIGV0aGVybmV0IG9uIEZDQwkqLwpAQCAtMTAyLDcgKzEwMSwyMyBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgJiB+Q0ZHX0NNRF9LR0RCKQorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjdW5kZWYgQ09ORklHX0NNRF9LR0RCCisKIAogLyogRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgdG8gYm9vdCBmcm9tIDB4MDAwMDAxMDAuIElmIHlvdSBkb24ndCBkZWZpbmUKICAqIHRoaXMsIHlvdSB3aWxsIG5lZWQgdG8gcHJvZ3JhbSB0aGUgYm9vdGxvYWRlciB0byAweGZmZjAwMDAwLCBhbmQKQEAgLTExMiwxNSArMTI3LDEyIEBACiAgKi8KICNkZWZpbmUgQ0ZHX1JTRF9CT09UX0xPVyAxCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUKICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTICAgIAkiZGV2ZnM9bW91bnQgcm9vdD1yYW1mcyIKICNkZWZpbmUgQ09ORklHX0VUSEFERFIJCTA4OjAwOjNlOjI2OjBhOjVhCiAjZGVmaW5lIENPTkZJR19ORVRNQVNLICAgICAgICAgIDI1NS4yNTUuMC4wCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpAQCAtMTMwLDcgKzE0Miw3IEBACiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZQlDRkdfUFJPTVBUCQkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yODcsNyArMjk5LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyNjAgQ1BVCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvc2Fjc25nLmggYi9pbmNsdWRlL2NvbmZpZ3Mvc2Fjc25nLmgKaW5kZXggOTdiNTJmYS4uYzQ3NGFjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3NhY3NuZy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9zYWNzbmcuaApAQCAtMTU5LDggKzE1OSw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICovCiAKICN1bmRlZglDT05GSUdfRVRIRVJfT05fU0NDCkBAIC00NzAsMTYgKzQ2OSwxOCBAQAogCiAjZGVmaW5lIENPTkZJR19CT09UUF9SQU5ET01fREVMQVkgICAgICAgLyogUmFuZG9taXplIHRoZSBCT09UUCByZXRyeSBkZWxheSAqLwogCi0vKiBBZGQgc3VwcG9ydCBmb3IgYSBmZXcgZXh0cmEgYm9vdHAgb3B0aW9ucyBsaWtlOgotICoJLSBGaWxlIHNpemUKLSAqCS0gRE5TICh1cCB0byAyIHNlcnZlcnMpCi0gKiAgICAgIC0gU2VuZCBob3N0bmFtZSB0byBESENQIHNlcnZlcgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKICAqLwotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBcCi0JCQkJIENPTkZJR19CT09UUF9CT09URklMRVNJWkUgfCBcCi0JCQkJIENPTkZJR19CT09UUF9ETlMgfCBcCi0JCQkJIENPTkZJR19CT09UUF9ETlMyIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRSkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lICBDT05GSUdfQk9PVFBfRE5TCisjZGVmaW5lICBDT05GSUdfQk9PVFBfRE5TMgorI2RlZmluZSAgQ09ORklHX0JPT1RQX1NFTkRfSE9TVE5BTUUKKwogCiAvKiB1bmRlZiB0aGlzIHRvIHNhdmUgbWVtb3J5ICovCiAjZGVmaW5lIENGR19MT05HSEVMUApAQCAtNTAyLDMxICs1MDMsMjggQEAKICAqLwogI2RlZmluZSBDT05GSUdfVkVSU0lPTl9WQVJJQUJMRQogCi0vKiBXaGF0IFUtQm9vdCBzdWJzeXRlbXMgZG8geW91IHdhbnQgZW5hYmxlZD8gKi8KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9TUEkKKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9JTU1BUAorI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKworI3VuZGVmIENPTkZJR19DTURfS0dEQgorCiAjaWZkZWYgQ09ORklHX0VUSEVSX09OX0ZDQwotIyBkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSgoKENPTkZJR19DTURfREZMICYgfihDRkdfQ01EX0tHREIpKSkgfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9TUEkJfCBcCi0JCQkJQ0ZHX0NNRF9TRFJBTSAgIHwgXAotCQkJCUNGR19DTURfUkVHSU5GTyB8IFwKLQkJCQlDRkdfQ01EX0lNTUFQCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX01JSQkpCi0jZWxzZQotIyBkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSgoKENPTkZJR19DTURfREZMICYgfihDRkdfQ01EX0tHREIpKSkgfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9TUEkJfCBcCi0JCQkJQ0ZHX0NNRF9TRFJBTSAgIHwgXAotCQkJCUNGR19DTURfUkVHSU5GTyB8IFwKLQkJCQlDRkdfQ01EX0lNTUFQCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfUElORwkpCi0jZW5kaWYgLyogQ09ORklHX0VUSEVSX09OX0ZDQyAqLworI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2VuZGlmCisKIAogLyogV2hlcmUgZG8gdGhlIGludGVybmFsIHJlZ2lzdGVycyBsaXZlPyAqLwogI2RlZmluZSBDRkdfSU1NUgkJMHhGMDAwMDAwMApAQCAtNTQ0LDEwICs1NDIsNiBAQAogI2RlZmluZSBDT05GSUdfU0FDU25nCQkxCS8qIG11bmdlZCBmb3IgdGhlIFNBQ1NuZyAqLwogI2RlZmluZSBDT05GSUdfQ1BNMgkJMQkvKiBIYXMgYSBDUE0yICovCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCkBAIC01ODksNyArNTgzLDcgQEAKICNkZWZpbmUgQ0ZHX1RGVFBfVElNRU9VVF9DT1VOVCA1ICAgICAgICAvKiBIb3cgbWFueSB0aW1lb3V0cyBURlRQIHdpbGwgYWxsb3cgKi8KIAkJCQkJLyogYmVmb3JlIGl0IGdpdmVzIHVwLiAgICAgICAgICAgICAgICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJICAgICAqLwogI2Vsc2UKICMgIGRlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJICAgICAqLwpAQCAtNzMyLDcgKzcyNiw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM4MjYwIENQVSAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICMgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zYmMyNDEweC5oIGIvaW5jbHVkZS9jb25maWdzL3NiYzI0MTB4LmgKaW5kZXggODY2ZjdiMC4uYjRhMDYzYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3NiYzI0MTB4LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3NiYzI0MTB4LmgKQEAgLTgyLDI0ICs4MiwyOSBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29tbWFuZCBkZWZpbml0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUyBcCi0JCQkoQ09ORklHX0NNRF9ERkwJIHwgXAotCQkJQ0ZHX0NNRF9DQUNIRQkgfCBcCi0JCQkvKkNGR19DTURfTkFORAkgfCovIFwKLQkJCS8qQ0ZHX0NNRF9FRVBST00gfCovIFwKLQkJCS8qQ0ZHX0NNRF9JMkMJIHwqLyBcCi0JCQkvKkNGR19DTURfVVNCCSB8Ki8gXAotCQkJQ0ZHX0NNRF9SRUdJTkZPICB8IFwKLQkJCUNGR19DTURfREFURQkgfCBcCi0JCQlDRkdfQ01EX1BJTkcgICAgIHwgXAotCQkJQ0ZHX0NNRF9ESENQICAgICB8IFwKLQkJCUNGR19DTURfRUxGKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTICAgIAkiY29uc29sZT10dHlTQUMwIHJvb3Q9L2Rldi9uZnMgbmZzcm9vdD0xOTIuMTY4LjAuMTovZnJpZW5kbHktYXJtL3Jvb3Rmc19uZXRzZXJ2IGlwPTE5Mi4xNjguMC42OToxOTIuMTY4LjAuMToxOTIuMTY4LjAuMToyNTUuMjU1LjI1NS4wOmRlYmlhbjpldGgwOm9mZiIKQEAgLTExMCw3ICsxMTUsNyBAQAogLyojZGVmaW5lIENPTkZJR19CT09URklMRQkiZWxpbm9zLWxhcnQiICovCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiZGhjcDsgYm9vdG0iCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxMTUyMDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAvKiB3aGF0J3MgdGhpcyA/IGl0J3Mgbm90IHVzZWQgYW55d2hlcmUgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTEJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwpAQCAtMTkzLDcgKzE5OCw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBOQU5EIGZsYXNoIHNldHRpbmdzCiAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogI2RlZmluZSBDRkdfTUFYX05BTkRfREVWSUNFCTEJLyogTWF4IG51bWJlciBvZiBOQU5EIGRldmljZXMJCSovCiAjZGVmaW5lIFNFQ1RPUlNJWkUgNTEyCiAKQEAgLTIxOSw3ICsyMjQsNyBAQAogI2RlZmluZSBOQU5EX0NUTF9DTFJDTEUobmFuZHB0cikKICNkZWZpbmUgTkFORF9DVExfU0VUQ0xFKG5hbmRwdHIpCiAvKiAjdW5kZWYgQ09ORklHX01URF9OQU5EX1ZFUklGWV9XUklURSAqLwotI2VuZGlmCS8qIENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkFORCAqLworI2VuZGlmCS8qIENPTkZJR19DTURfTkFORCAqLwogCiAjZGVmaW5lIENPTkZJR19TRVRVUF9NRU1PUllfVEFHUwogI2RlZmluZSBDT05GSUdfSU5JVFJEX1RBRwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3NiYzQwNS5oIGIvaW5jbHVkZS9jb25maWdzL3NiYzQwNS5oCmluZGV4IGJlZmYyOGEuLmRjOTA2YjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zYmM0MDUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvc2JjNDA1LmgKQEAgLTg0LDIzICs4NCwzMyBAQAogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJNQkvKiBhdXRvYm9vdCBhZnRlciA1IHNlY29uZHMJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9CU1AJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfU0RSQU0JfCBcCi0JCQkJMCApCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisKIAogI3VuZGVmCUNPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC0xMjMsNyArMTMzLDcgQEAKICNkZWZpbmUgQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjI5LDcgKzIzOSw3IEBACiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJMTYzODQJLyogRm9yIEFNQ0MgNDA1IENQVXMsIG9sZGVyIDQwNSBwcGMncwkqLwogCQkJCQkvKiBoYXZlIG9ubHkgOGtCLCAxNmtCIGlzIHNhdmUgaGVyZQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogLi4uCQkJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zYmM4MjQwLmggYi9pbmNsdWRlL2NvbmZpZ3Mvc2JjODI0MC5oCmluZGV4IGQ4OTFlMDcuLjBlODc4ZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zYmM4MjQwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3NiYzgyNDAuaApAQCAtNzUsMjQgKzc1LDMzIEBACiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk1CiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkoIENPTkZJR19DTURfREZMIHwgXAotCQkJCSAgQ0ZHX0NNRF9CU1AgICAgfCBcCi0JCQkJICBDRkdfQ01EX0RJQUcgICB8IFwKLQkJCQkgIENGR19DTURfRUxGICAgIHwgXAotCQkJCSAgQ0ZHX0NNRF9FTlYgICAgfCBcCi0JCQkJICBDRkdfQ01EX0ZMQVNIICB8IFwKLQkJCQkgIENGR19DTURfUENJICAgIHwgXAotCQkJCSAgQ0ZHX0NNRF9QSU5HICAgfCBcCi0JCQkJICBDRkdfQ01EX1NEUkFNICB8IFwKLQkJCQkgIDAgKQogCi0vKiBUaGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCiAgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0JTUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC0zNDAsNyArMzQ5LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zYmM4MjYwLmggYi9pbmNsdWRlL2NvbmZpZ3Mvc2JjODI2MC5oCmluZGV4IDljZjA2NTQuLmIxZDQxYTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zYmM4MjYwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3NiYzgyNjAuaApAQCAtMTgyLDggKzE4Miw3IEBACiAgKiBmb3IgRkNDKQogICoKICAqIGlmIENPTkZJR19FVEhFUl9OT05FIGlzIGRlZmluZWQsIHRoZW4gZWl0aGVyIHRoZSBldGhlcm5ldCByb3V0aW5lcyBtdXN0IGJlCi0gKiBkZWZpbmVkIGVsc2V3aGVyZSAoYXMgZm9yIHRoZSBjb25zb2xlKSwgb3IgQ0ZHX0NNRF9ORVQgbXVzdCBiZSByZW1vdmVkCi0gKiBmcm9tIENPTkZJR19DT01NQU5EUyB0byByZW1vdmUgc3VwcG9ydCBmb3IgbmV0d29ya2luZy4KKyAqIGRlZmluZWQgZWxzZXdoZXJlIChhcyBmb3IgdGhlIGNvbnNvbGUpLCBvciBDT05GSUdfQ01EX05FVCBtdXN0IGJlIHVuc2V0LgogICovCiAKICN1bmRlZglDT05GSUdfRVRIRVJfT05fU0NDCkBAIC00MTIsMTYgKzQxMSwxOCBAQAogCSJib290bSIKICNlbmRpZiAvKiBDT05GSUdfQk9PVF9ST09UX05GUyAqLwogCi0vKiBBZGQgc3VwcG9ydCBmb3IgYSBmZXcgZXh0cmEgYm9vdHAgb3B0aW9ucyBsaWtlOgotICoJLSBGaWxlIHNpemUKLSAqCS0gRE5TICh1cCB0byAyIHNlcnZlcnMpCi0gKgktIFNlbmQgaG9zdG5hbWUgdG8gREhDUCBzZXJ2ZXIKKy8qCisgKiBCT09UUCBvcHRpb25zCiAgKi8KLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFIHwgXAotCQkJCSBDT05GSUdfQk9PVFBfRE5TICB8IFwKLQkJCQkgQ09ORklHX0JPT1RQX0ROUzIgfCBcCi0JCQkJIENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FKQorI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0ROUworI2RlZmluZSBDT05GSUdfQk9PVFBfRE5TMgorI2RlZmluZSBDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRQorCiAKIC8qIHVuZGVmIHRoaXMgdG8gc2F2ZSBtZW1vcnkgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCkBAIC00NDQsMjcgKzQ0NSwyNiBAQAogICovCiAjZGVmaW5lIENPTkZJR19WRVJTSU9OX1ZBUklBQkxFCiAKLS8qIFdoYXQgVS1Cb290IHN1YnN5dGVtcyBkbyB5b3Ugd2FudCBlbmFibGVkPyAqLwotI2lmZGVmIENPTkZJR19FVEhFUl9PTl9GQ0MKLSMgZGVmaW5lIENPTkZJR19DT01NQU5EUwkoKChDT05GSUdfQ01EX0RGTCAmIH4oQ0ZHX0NNRF9LR0RCKSkpIHwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSU1NQVAJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTyB8IFwKLQkJCQlDRkdfQ01EX1NEUkFNICAgKQotI2Vsc2UKLSMgZGVmaW5lIENPTkZJR19DT01NQU5EUwkoKChDT05GSUdfQ01EX0RGTCAmIH4oQ0ZHX0NNRF9LR0RCKSkpIHwgXAotCQkJCUNGR19DTURfQVNLRU5WCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSU1NQVAJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTyB8IFwKLQkJCQlDRkdfQ01EX1NEUkFNICAgKQotI2VuZGlmIC8qIENPTkZJR19FVEhFUl9PTl9GQ0MgKi8KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JTU1BUAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KKworI3VuZGVmIENPTkZJR19DTURfS0dEQgorCisjaWYgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkNDKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9DTURfTUlJCisjZW5kaWYKKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJCS8qIGRpc2FibGUgdGhlIHdhdGNoZG9nICovCiAKQEAgLTQ4MSwxMyArNDgxLDExIEBACiAjZGVmaW5lIENPTkZJR19TQkM4MjYwCQkxCS8qIG9uIGFuIEVTVCBTQkM4MjYwIEJvYXJkICAqLwogI2RlZmluZSBDT05GSUdfQ1BNMgkJMQkvKiBIYXMgYSBDUE0yICovCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjICBkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkgICAgICovCiAjZWxzZQogIyAgZGVmaW5lIENGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkgICAgICovCkBAIC02MjcsNyArNjI1LDcgQEAKICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzgyNjAgQ1BVICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3NiYzgzNDkuaCBiL2luY2x1ZGUvY29uZmlncy9zYmM4MzQ5LmgKaW5kZXggNjVhYWM1Yy4uMTgzMWJlZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3NiYzgzNDkuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvc2JjODM0OS5oCkBAIC0zMjgsNyArMzI4LDcgQEAKICNkZWZpbmUgQ09ORklHX0kyQ19DTURfVFJFRQogI2RlZmluZSBDRkdfSTJDX1NQRUVECQk0MDAwMDAJLyogSTJDIHNwZWVkIGFuZCBzbGF2ZSBhZGRyZXNzICovCiAjZGVmaW5lIENGR19JMkNfU0xBVkUJCTB4N0YKLSNkZWZpbmUgQ0ZHX0kyQ19OT1BST0JFUwl7ezAsMHg2OX19CS8qIERvbid0IHByb2JlIHRoZXNlIGFkZHJzICovCisjZGVmaW5lIENGR19JMkNfTk9QUk9CRVMJezB4Njl9CS8qIERvbid0IHByb2JlIHRoZXNlIGFkZHJzICovCiAjZGVmaW5lIENGR19JMkMxX09GRlNFVAkJMHgzMDAwCiAjZGVmaW5lIENGR19JMkMyX09GRlNFVAkJMHgzMTAwCiAjZGVmaW5lIENGR19JMkNfT0ZGU0VUCQlDRkdfSTJDMl9PRkZTRVQKQEAgLTQwMSwxMCArNDAxLDEwIEBACiAjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkJMQogI2VuZGlmCiAKLSNkZWZpbmUgQ09ORklHX01QQzgzWFhfVFNFQzEJMQotI2RlZmluZSBDT05GSUdfTVBDODNYWF9UU0VDMV9OQU1FCSJUU0VDMCIKLSNkZWZpbmUgQ09ORklHX01QQzgzWFhfVFNFQzIJMQotI2RlZmluZSBDT05GSUdfTVBDODNYWF9UU0VDMl9OQU1FCSJUU0VDMSIKKyNkZWZpbmUgQ09ORklHX1RTRUMxCTEKKyNkZWZpbmUgQ09ORklHX1RTRUMxX05BTUUJIlRTRUMwIgorI2RlZmluZSBDT05GSUdfVFNFQzIJMQorI2RlZmluZSBDT05GSUdfVFNFQzJfTkFNRQkiVFNFQzEiCiAjZGVmaW5lIENPTkZJR19QSFlfQkNNNTQyMVMJMQogI2RlZmluZSBUU0VDMV9QSFlfQUREUgkJMHgxOQogI2RlZmluZSBUU0VDMl9QSFlfQUREUgkJMHgxYQpAQCAtNDM5LDQwICs0MzksMzQgQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQgKi8KICNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlICovCiAKLSNpZiBkZWZpbmVkKENGR19SQU1CT09UKQorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfUElORworCiAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwJXAotCQkJCSB8IENGR19DTURfUElORwkJXAotCQkJCSB8IENGR19DTURfUENJCQlcCi0JCQkJIHwgQ0ZHX0NNRF9JMkMpCQlcCi0JCQkJJgkJCVwKLQkJCQkgfihDRkdfQ01EX0VOVgkJXAotCQkJCSAgfCBDRkdfQ01EX0xPQURTKSkKLSNlbHNlCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTAlcCi0JCQkJIHwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJIHwgQ0ZHX0NNRF9JMkMpCQlcCi0JCQkJJgkJCVwKLQkJCQkgfihDRkdfQ01EX0VOVgkJXAotCQkJCSAgfCBDRkdfQ01EX0xPQURTKSkKLSNlbmRpZgotI2Vsc2UKLSNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMCQlcCi0JCQkJfCBDRkdfQ01EX1BDSQkJXAotCQkJCXwgQ0ZHX0NNRF9QSU5HCQlcCi0JCQkJfCBDRkdfQ01EX0kyQwkJXAotCQkJCSkKLSNlbHNlCi0jZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMCQlcCi0JCQkJfCBDRkdfQ01EX1BJTkcJCVwKLQkJCQl8IENGR19DTURfSTJDCQlcCi0JCQkJfCBDRkdfQ01EX01JSQkJXAotCQkJCSkKLSNlbmRpZgorICAgICNkZWZpbmUgQ09ORkdfQ01EX1BDSQogI2VuZGlmCiAKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKyNpZiBkZWZpbmVkKENGR19SQU1CT09UKQorICAgICN1bmRlZiBDT05GSUdfQ01EX0VOVgorICAgICN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjZW5kaWYKKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQgKi8KIApAQCAtNDgzLDcgKzQ3Nyw3IEBACiAjZGVmaW5lIENGR19MT0FEX0FERFIJMHgyMDAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCiAjZWxzZQogCSNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCkBAIC01MDQsNyArNDk4LDcgQEAKIC8qIENhY2hlIENvbmZpZ3VyYXRpb24gKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkzMjc2OAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLypsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSovCiAjZW5kaWYKIApAQCAtNjU1LDcgKzY0OSw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJLyogU29mdHdhcmUgcmVib290ICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgb2Yga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3NiYzg1NjAuaCBiL2luY2x1ZGUvY29uZmlncy9zYmM4NTYwLmgKaW5kZXggNmU0ZmRiMi4uZGVmYzQyOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3NiYzg1NjAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvc2JjODU2MC5oCkBAIC0zMjAsMjggKzMyMCwzNyBAQAogI2RlZmluZSBDT05GSUdfTE9BRFNfRUNITwkxCS8qIGVjaG8gb24gZm9yIHNlcmlhbCBkb3dubG9hZAkqLwogI2RlZmluZSBDRkdfTE9BRFNfQkFVRF9DSEFOR0UJMQkvKiBhbGxvdyBiYXVkcmF0ZSBjaGFuZ2UJKi8KIAotI2lmIGRlZmluZWQoQ0ZHX1JBTUJPT1QpIHx8IGRlZmluZWQoQ09ORklHX1JBTV9BU19GTEFTSCkKLSAgI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUENJIHwgXAotCQkJCUNGR19DTURfUElORyB8IENGR19DTURfSTJDKSAmIFwKLQkJCQkgfihDRkdfQ01EX0VOViB8IFwKLQkJCQkgIENGR19DTURfTE9BRFMgKSkKLSAgI2VsaWYgKGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkgfHwgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkNDKSkKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfTUlJIHwgXAotCQkJCUNGR19DTURfUElORyB8IENGR19DTURfSTJDKSAmIFwKLQkJCQl+KENGR19DTURfRU5WKSkKLSAgI2VuZGlmCi0jZWxzZQotICAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotICAgICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BDSSB8IFwKLQkJCQlDRkdfQ01EX1BJTkcgfCBDRkdfQ01EX0kyQykKLSAgI2VsaWYgKGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkgfHwgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkNDKSkKLSAgICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9NSUkgfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HIHwgQ0ZHX0NNRF9JMkMpCi0gICNlbmRpZgorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0kyQworCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKICNlbmRpZgogCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjaWYgZGVmaW5lZChDT05GSUdfVFNFQ19FTkVUKSB8fCBkZWZpbmVkKENPTkZJR19FVEhFUl9PTl9GQ0MpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENGR19SQU1CT09UKSB8fCBkZWZpbmVkKENPTkZJR19SQU1fQVNfRkxBU0gpCisgICAgI3VuZGVmIENPTkZJR19DTURfRU5WCisgICAgI3VuZGVmIENPTkZJR19DTURfTE9BRFMKKyNlbmRpZgorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtMzUwLDcgKzM1OSw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIlNCQzg1NjA9PiAiIC8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogICAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAgICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zNzEsNyArMzgwLDcgQEAKIC8qIENhY2hlIENvbmZpZ3VyYXRpb24gKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkzMjc2OAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogICAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKQEAgLTM4Myw3ICszOTIsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290CQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICAgI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICAgI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3NiYzg2NDFkLmggYi9pbmNsdWRlL2NvbmZpZ3Mvc2JjODY0MWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGQzMWNhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb25maWdzL3NiYzg2NDFkLmgKQEAgLTAsMCArMSw2MDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNyBXaW5kIFJpdmVyIFN5c3RlbXMgPHd3dy53aW5kcml2ZXIuY29tPgorICogQ29weXJpZ2h0IDIwMDcgRW1iZWRkZWQgU3BlY2lhbHRpZXMsIEluYy4KKyAqIEpvZSBIYW1tYW4gPGpvZS5oYW1tYW5AZW1iZWRkZWRzcGVjaWFsdGllcy5jb20+CisgKgorICogQ29weXJpZ2h0IDIwMDYgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IuCisgKgorICogU3Jpa2FudGggU3Jpbml2YXNhbiAoc3Jpa2FudGguc3Jpbml2YXNhbkBmcmVlc2NhbGUuY29tKQorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBTQkM4NjQxRCBib2FyZCBjb25maWd1cmF0aW9uIGZpbGUKKyAqCisgKiBNYWtlIHN1cmUgeW91IGNoYW5nZSB0aGUgTUFDIGFkZHJlc3MgYW5kIG90aGVyIG5ldHdvcmsgcGFyYW1zIGZpcnN0LAorICogc2VhcmNoIGZvciBDT05GSUdfRVRIQUREUiwgQ09ORklHX1NFUlZFUklQLCBldGMgaW4gdGhpcyBmaWxlLgorICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKy8qIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zICovCisjZGVmaW5lIENPTkZJR19NUEM4Nnh4CQkxCS8qIE1QQzg2eHggKi8KKyNkZWZpbmUgQ09ORklHX01QQzg2NDEJCTEJLyogTVBDODY0MSBzcGVjaWZpYyAqLworI2RlZmluZSBDT05GSUdfU0JDODY0MUQJCTEJLyogU0JDODY0MUQgYm9hcmQgc3BlY2lmaWMgKi8KKyNkZWZpbmUgQ09ORklHX05VTV9DUFVTICAgICAgICAgMiAgICAgICAvKiBOdW1iZXIgb2YgQ1BVcyBpbiB0aGUgc3lzdGVtICovCisjZGVmaW5lIENPTkZJR19MSU5VWF9SRVNFVF9WRUMgIDB4MTAwICAgLyogUmVzZXQgdmVjdG9yIHVzZWQgYnkgTGludXggKi8KKworI2lmZGVmIFJVTl9ESUFHCisjZGVmaW5lIENGR19ESUFHX0FERFIgICAgICAgIDB4ZmY4MDAwMDAKKyNlbmRpZgorCisjZGVmaW5lIENGR19SRVNFVF9BRERSRVNTICAgIDB4ZmZmMDAxMDAKKworI2RlZmluZSBDT05GSUdfUENJCQkxCS8qIEVuYWJsZSBQQ0lFICovCisjZGVmaW5lIENPTkZJR19QQ0kxCQkxCS8qIFBDSUUgY29udHJvbGVyIDEgKHNsb3QgMSkgKi8KKyNkZWZpbmUgQ09ORklHX1BDSTIJCTEJLyogUENJRSBjb250cm9sZXIgMiAoc2xvdCAyKSAqLworI2RlZmluZSBDT05GSUdfRlNMX1BDSV9JTklUCTEJLyogVXNlIGNvbW1vbiBGU0wgaW5pdCBjb2RlICovCisKKyNkZWZpbmUgQ09ORklHX1RTRUNfRU5FVCAJCS8qIHRzZWMgZXRoZXJuZXQgc3VwcG9ydCAqLworI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQorCisjdW5kZWYgQ09ORklHX1NQRF9FRVBST00JCS8qIERvIG5vdCB1c2UgU1BEIEVFUFJPTSBmb3IgRERSIHNldHVwKi8KKyN1bmRlZiBDT05GSUdfRERSX0RMTAkJCS8qIHBvc3NpYmxlIERMTCBmaXggbmVlZGVkICovCisjZGVmaW5lIENPTkZJR19ERFJfMlRfVElNSU5HCQkvKiBTZXRzIHRoZSAyVCB0aW1pbmcgYml0ICovCisjdW5kZWYgQ09ORklHX0REUl9FQ0MgIAkJCS8qIG9ubHkgZm9yIEVDQyBERFIgbW9kdWxlICovCisjZGVmaW5lIENPTkZJR19FQ0NfSU5JVF9WSUFfRERSQ09OVFJPTExFUgkvKiBERFIgY29udHJvbGxlciBvciBETUE/ICovCisjZGVmaW5lIENPTkZJR19NRU1fSU5JVF9WQUxVRQkJMHhEZWFkQmVlZgorI2RlZmluZSBDT05GSUdfTlVNX0REUl9DT05UUk9MTEVSUyAgICAgMgorI2RlZmluZSBDQUNIRV9MSU5FX0lOVEVSTEVBVklORwkJMHgyMDAwMDAwMAorI2RlZmluZSBQQUdFX0lOVEVSTEVBVklORwkJMHgyMTAwMDAwMAorI2RlZmluZSBCQU5LX0lOVEVSTEVBVklORwkJMHgyMjAwMDAwMAorI2RlZmluZSBTVVBFUl9CQU5LX0lOVEVSTEVBVklORwkJMHgyMzAwMDAwMAorCisKKyNkZWZpbmUgQ09ORklHX0FMVElWRUMgICAgICAgICAgMQorCisvKgorICogTDJDUiBzZXR1cCAtLSBtYWtlIHN1cmUgdGhpcyBpcyByaWdodCBmb3IgeW91ciBib2FyZCEKKyAqLworI2RlZmluZSBDRkdfTDIKKyNkZWZpbmUgTDJfSU5JVAkJMAorI2RlZmluZSBMMl9FTkFCTEUJKEwyQ1JfTDJFKQorCisjaWZuZGVmIENPTkZJR19TWVNfQ0xLX0ZSRVEKKyNkZWZpbmUgQ09ORklHX1NZU19DTEtfRlJFUSAgICAgZ2V0X2JvYXJkX3N5c19jbGsoMCkKKyNlbmRpZgorCisjZGVmaW5lIENPTkZJR19CT0FSRF9FQVJMWV9JTklUX0YJMQkvKiBDYWxsIGJvYXJkX3ByZV9pbml0ICovCisKKyN1bmRlZglDRkdfRFJBTV9URVNUCQkJCS8qIG1lbW9yeSB0ZXN0LCB0YWtlcyB0aW1lICovCisjZGVmaW5lIENGR19NRU1URVNUX1NUQVJUCTB4MDAyMDAwMDAJLyogbWVtdGVzdCByZWdpb24gKi8KKyNkZWZpbmUgQ0ZHX01FTVRFU1RfRU5ECQkweDAwNDAwMDAwCisKKy8qCisgKiBCYXNlIGFkZHJlc3NlcyAtLSBOb3RlIHRoZXNlIGFyZSBlZmZlY3RpdmUgYWRkcmVzc2VzIHdoZXJlIHRoZQorICogYWN0dWFsIHJlc291cmNlcyBnZXQgbWFwcGVkIChub3QgcGh5c2ljYWwgYWRkcmVzc2VzKQorICovCisjZGVmaW5lIENGR19DQ1NSQkFSX0RFRkFVTFQgCTB4ZmY3MDAwMDAJLyogQ0NTUkJBUiBEZWZhdWx0ICovCisjZGVmaW5lIENGR19DQ1NSQkFSCQkweGY4MDAwMDAwCS8qIHJlbG9jYXRlZCBDQ1NSQkFSICovCisjZGVmaW5lIENGR19JTU1SCQlDRkdfQ0NTUkJBUgkvKiBQUUlJIHVzZXMgQ0ZHX0lNTVIgKi8KKworI2RlZmluZSBDRkdfUENJMV9BRERSCQkoQ0ZHX0NDU1JCQVIrMHg4MDAwKQorI2RlZmluZSBDRkdfUENJMl9BRERSCQkoQ0ZHX0NDU1JCQVIrMHg5MDAwKQorCisvKgorICogRERSIFNldHVwCisgKi8KKyNkZWZpbmUgQ0ZHX0REUl9TRFJBTV9CQVNFCTB4MDAwMDAwMDAJLyogRERSIGlzIHN5c3RlbSBtZW1vcnkgKi8KKyNkZWZpbmUgQ0ZHX0REUl9TRFJBTV9CQVNFMgkweDEwMDAwMDAwCS8qIEREUiBiYW5rIDIgKi8KKyNkZWZpbmUgQ0ZHX1NEUkFNX0JBU0UJCUNGR19ERFJfU0RSQU1fQkFTRQorI2RlZmluZSBDRkdfU0RSQU1fQkFTRTIJCUNGR19ERFJfU0RSQU1fQkFTRTIKKyNkZWZpbmUgQ09ORklHX1ZFUllfQklHX1JBTQorCisjZGVmaW5lIE1QQzg2eHhfRERSX1NEUkFNX0NMS19DTlRMCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUERfRUVQUk9NKQorICAgIC8qCisgICAgICogRGV0ZXJtaW5lIEREUiBjb25maWd1cmF0aW9uIGZyb20gSTJDIGludGVyZmFjZS4KKyAgICAgKi8KKyAgICAjZGVmaW5lIFNQRF9FRVBST01fQUREUkVTUzEJCTB4NTEJCS8qIEREUiBESU1NICovCisgICAgI2RlZmluZSBTUERfRUVQUk9NX0FERFJFU1MyCQkweDUyCQkvKiBERFIgRElNTSAqLworICAgICNkZWZpbmUgU1BEX0VFUFJPTV9BRERSRVNTMwkJMHg1MwkJLyogRERSIERJTU0gKi8KKyAgICAjZGVmaW5lIFNQRF9FRVBST01fQUREUkVTUzQJCTB4NTQJCS8qIEREUiBESU1NICovCisKKyNlbHNlCisgICAgLyoKKyAgICAgKiBNYW51YWxseSBzZXQgdXAgRERSMSAmIEREUjIgcGFyYW1ldGVycworICAgICAqLworCisgICAgI2RlZmluZSBDRkdfU0RSQU1fU0laRQk1MTIJCS8qIEREUiBpcyA1MTJNQiAqLworCisgICAgI2RlZmluZSBDRkdfRERSX0NTMF9CTkRTCTB4MDAwMDAwMEYKKyAgICAjZGVmaW5lIENGR19ERFJfQ1MxX0JORFMJMHgwMDAwMDAwMAorICAgICNkZWZpbmUgQ0ZHX0REUl9DUzJfQk5EUwkweDAwMDAwMDAwCisgICAgI2RlZmluZSBDRkdfRERSX0NTM19CTkRTCTB4MDAwMDAwMDAKKyAgICAjZGVmaW5lIENGR19ERFJfQ1MwX0NPTkZJRwkweDgwMDEwMTAyCisgICAgI2RlZmluZSBDRkdfRERSX0NTMV9DT05GSUcJMHgwMDAwMDAwMAorICAgICNkZWZpbmUgQ0ZHX0REUl9DUzJfQ09ORklHCTB4MDAwMDAwMDAKKyAgICAjZGVmaW5lIENGR19ERFJfQ1MzX0NPTkZJRwkweDAwMDAwMDAwCisgICAgI2RlZmluZSBDRkdfRERSX0VYVF9SRUZSRVNIIDB4MDAwMDAwMDAKKyAgICAjZGVmaW5lIENGR19ERFJfVElNSU5HXzAJMHgwMDIyMDgwMgorICAgICNkZWZpbmUgQ0ZHX0REUl9USU1JTkdfMQkweDM4Mzc3MzIyCisgICAgI2RlZmluZSBDRkdfRERSX1RJTUlOR18yCTB4MDAyMDQwYzcKKyAgICAjZGVmaW5lIENGR19ERFJfQ0ZHXzFBCTB4NDMwMDgwMDgKKyAgICAjZGVmaW5lIENGR19ERFJfQ0ZHXzIJMHgyNDQwMTAwMAorICAgICNkZWZpbmUgQ0ZHX0REUl9NT0RFXzEJMHgyM2MwMDU0MgorICAgICNkZWZpbmUgQ0ZHX0REUl9NT0RFXzIJMHgwMDAwMDAwMAorICAgICNkZWZpbmUgQ0ZHX0REUl9NT0RFX0NUTAkweDAwMDAwMDAwCisgICAgI2RlZmluZSBDRkdfRERSX0lOVEVSVkFMCTB4MDUwODAxMDAKKyAgICAjZGVmaW5lIENGR19ERFJfREFUQV9JTklUCTB4MDAwMDAwMDAKKyAgICAjZGVmaW5lIENGR19ERFJfQ0xLX0NUUkwJMHgwMzgwMDAwMAorICAgICNkZWZpbmUgQ0ZHX0REUl9DRkdfMUIJMHhDMzAwODAwOAorCisgICAgI2RlZmluZSBDRkdfRERSMl9DUzBfQk5EUwkweDAwMTAwMDFGCisgICAgI2RlZmluZSBDRkdfRERSMl9DUzFfQk5EUwkweDAwMDAwMDAwCisgICAgI2RlZmluZSBDRkdfRERSMl9DUzJfQk5EUwkweDAwMDAwMDAwCisgICAgI2RlZmluZSBDRkdfRERSMl9DUzNfQk5EUwkweDAwMDAwMDAwCisgICAgI2RlZmluZSBDRkdfRERSMl9DUzBfQ09ORklHCTB4ODAwMTAxMDIKKyAgICAjZGVmaW5lIENGR19ERFIyX0NTMV9DT05GSUcJMHgwMDAwMDAwMAorICAgICNkZWZpbmUgQ0ZHX0REUjJfQ1MyX0NPTkZJRwkweDAwMDAwMDAwCisgICAgI2RlZmluZSBDRkdfRERSMl9DUzNfQ09ORklHCTB4MDAwMDAwMDAKKyAgICAjZGVmaW5lIENGR19ERFIyX0VYVF9SRUZSRVNIIDB4MDAwMDAwMDAKKyAgICAjZGVmaW5lIENGR19ERFIyX1RJTUlOR18wCTB4MDAyMjA4MDIKKyAgICAjZGVmaW5lIENGR19ERFIyX1RJTUlOR18xCTB4MzgzNzczMjIKKyAgICAjZGVmaW5lIENGR19ERFIyX1RJTUlOR18yCTB4MDAyMDQwYzcKKyAgICAjZGVmaW5lIENGR19ERFIyX0NGR18xQQkweDQzMDA4MDA4CisgICAgI2RlZmluZSBDRkdfRERSMl9DRkdfMgkweDI0NDAxMDAwCisgICAgI2RlZmluZSBDRkdfRERSMl9NT0RFXzEJMHgyM2MwMDU0MgorICAgICNkZWZpbmUgQ0ZHX0REUjJfTU9ERV8yCTB4MDAwMDAwMDAKKyAgICAjZGVmaW5lIENGR19ERFIyX01PREVfQ1RMCTB4MDAwMDAwMDAKKyAgICAjZGVmaW5lIENGR19ERFIyX0lOVEVSVkFMCTB4MDUwODAxMDAKKyAgICAjZGVmaW5lIENGR19ERFIyX0RBVEFfSU5JVAkweDAwMDAwMDAwCisgICAgI2RlZmluZSBDRkdfRERSMl9DTEtfQ1RSTAkweDAzODAwMDAwCisgICAgI2RlZmluZSBDRkdfRERSMl9DRkdfMUIJMHhDMzAwODAwOAorCisKKyNlbmRpZgorCisvKiAjZGVmaW5lIENGR19JRF9FRVBST00JMQorI2RlZmluZSBJRF9FRVBST01fQUREUiAweDU3ICovCisKKy8qCisgKiBUaGUgU0JDODY0MUQgY29udGFpbnMgMTZNQiBmbGFzaCBzcGFjZSBhdCBmZjAwMDAwMC4KKyAqLworI2RlZmluZSBDRkdfRkxBU0hfQkFTRSAgICAgIDB4ZmYwMDAwMDAgIC8qIHN0YXJ0IG9mIEZMQVNIIDE2TSAqLworCisvKiBGbGFzaCAqLworI2RlZmluZSBDRkdfQlIwX1BSRUxJTQkJMHhmZjAwMTAwMQkvKiBwb3J0IHNpemUgMTZiaXQgKi8KKyNkZWZpbmUgQ0ZHX09SMF9QUkVMSU0JCTB4ZmYwMDZlNjUJLyogMTZNQiBCb290IEZsYXNoIGFyZWEgKi8KKworLyogNjRLQiBFRVBST00gKi8KKyNkZWZpbmUgQ0ZHX0JSMV9QUkVMSU0JCTB4ZjAwMDA4MDEJLyogcG9ydCBzaXplIDE2Yml0ICovCisjZGVmaW5lIENGR19PUjFfUFJFTElNCQkweGZmZmY2ZTY1CS8qIDY0SyBFRVBST00gYXJlYSAqLworCisvKiBFUExEIC0gVXNlciBzd2l0Y2hlcywgYm9hcmQgaWQsIExFRHMgKi8KKyNkZWZpbmUgQ0ZHX0JSMl9QUkVMSU0JCTB4ZjEwMDA4MDEJLyogcG9ydCBzaXplIDE2Yml0ICovCisjZGVmaW5lIENGR19PUjJfUFJFTElNCQkweGZmZjA2ZTY1CS8qIEVQTEQgKHN3aXRjaGVzLCBib2FyZCBJRCwgTEVEcykgYXJlYSAqLworCisvKiBMb2NhbCBidXMgU0RSQU0gMTI4TUIgKi8KKyNkZWZpbmUgQ0ZHX0JSM19QUkVMSU0JCTB4ZTAwMDE4NjEJLyogcG9ydCBzaXplID9iaXQgKi8KKyNkZWZpbmUgQ0ZHX09SM19QUkVMSU0JCTB4ZmMwMDZjYzAJLyogMTI4TUIgbG9jYWwgYnVzIFNEUkFNIGFyZWEgKDFzdCBoYWxmKSAqLworI2RlZmluZSBDRkdfQlI0X1BSRUxJTQkJMHhlNDAwMTg2MQkvKiBwb3J0IHNpemUgP2JpdCAqLworI2RlZmluZSBDRkdfT1I0X1BSRUxJTQkJMHhmYzAwNmNjMAkvKiAxMjhNQiBsb2NhbCBidXMgU0RSQU0gYXJlYSAoMm5kIGhhbGYpICovCisKKy8qIERpc2sgb24gQ2hpcCAoRE9DKSAxMjhNQiAqLworI2RlZmluZSBDRkdfQlI1X1BSRUxJTQkJMHhlODAwMTAwMQkvKiBwb3J0IHNpemUgP2JpdCAqLworI2RlZmluZSBDRkdfT1I1X1BSRUxJTQkJMHhmODAwNmU2NQkvKiAxMjhNQiBsb2NhbCBidXMgU0RSQU0gYXJlYSAoMm5kIGhhbGYpICovCisKKy8qIExDRCAqLworI2RlZmluZSBDRkdfQlI2X1BSRUxJTQkJMHhmNDAwMDgwMQkvKiBwb3J0IHNpemUgP2JpdCAqLworI2RlZmluZSBDRkdfT1I2X1BSRUxJTQkJMHhmZmYwNmU2NQkvKiAxMjhNQiBsb2NhbCBidXMgU0RSQU0gYXJlYSAoMm5kIGhhbGYpICovCisKKy8qIENvbnRyb2wgbG9naWMgJiBtaXNjIHBlcmlwaGVyYWxzICovCisjZGVmaW5lIENGR19CUjdfUFJFTElNCQkweGYyMDAwODAxCS8qIHBvcnQgc2l6ZSA/Yml0ICovCisjZGVmaW5lIENGR19PUjdfUFJFTElNCQkweGZmZjA2ZTY1CS8qIDEyOE1CIGxvY2FsIGJ1cyBTRFJBTSBhcmVhICgybmQgaGFsZikgKi8KKworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX0JBTktTCTEJCS8qIG51bWJlciBvZiBiYW5rcyAqLworI2RlZmluZSBDRkdfTUFYX0ZMQVNIX1NFQ1QJMTMxCQkvKiBzZWN0b3JzIHBlciBkZXZpY2UgKi8KKworI3VuZGVmCUNGR19GTEFTSF9DSEVDS1NVTQorI2RlZmluZSBDRkdfRkxBU0hfRVJBU0VfVE9VVAk2MDAwMAkvKiBGbGFzaCBFcmFzZSBUaW1lb3V0IChtcykgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX1dSSVRFX1RPVVQJNTAwCS8qIEZsYXNoIFdyaXRlIFRpbWVvdXQgKG1zKSAqLworI2RlZmluZSBDRkdfTU9OSVRPUl9CQVNFICAgIAlURVhUX0JBU0UJLyogc3RhcnQgb2YgbW9uaXRvciAqLworCisjZGVmaW5lIENGR19GTEFTSF9DRklfRFJJVkVSCisjZGVmaW5lIENGR19GTEFTSF9DRkkKKyNkZWZpbmUgQ0ZHX1dSSVRFX1NXQVBQRURfREFUQQorI2RlZmluZSBDRkdfRkxBU0hfRU1QVFlfSU5GTworI2RlZmluZSBDRkdfRkxBU0hfUFJPVEVDVElPTgorCisjdW5kZWYgQ09ORklHX0NMT0NLU19JTl9NSFoKKworI2RlZmluZSBDT05GSUdfTDFfSU5JVF9SQU0KKyNkZWZpbmUgQ0ZHX0lOSVRfUkFNX0xPQ0sJMQorI2lmbmRlZiBDRkdfSU5JVF9SQU1fTE9DSworI2RlZmluZSBDRkdfSU5JVF9SQU1fQUREUgkweDBmZDAwMDAwCS8qIEluaXRpYWwgUkFNIGFkZHJlc3MgKi8KKyNlbHNlCisjZGVmaW5lIENGR19JTklUX1JBTV9BRERSCTB4Zjg0MDAwMDAJLyogSW5pdGlhbCBSQU0gYWRkcmVzcyAqLworI2VuZGlmCisjZGVmaW5lIENGR19JTklUX1JBTV9FTkQgICAgCTB4NDAwMAkgICAgCS8qIEVuZCBvZiB1c2VkIGFyZWEgaW4gUkFNICovCisKKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX1NJWkUgIAkxMjgJCS8qIG51bSBieXRlcyBpbml0aWFsIGRhdGEgKi8KKyNkZWZpbmUgQ0ZHX0dCTF9EQVRBX09GRlNFVAkoQ0ZHX0lOSVRfUkFNX0VORCAtIENGR19HQkxfREFUQV9TSVpFKQorI2RlZmluZSBDRkdfSU5JVF9TUF9PRkZTRVQJQ0ZHX0dCTF9EQVRBX09GRlNFVAorCisjZGVmaW5lIENGR19NT05JVE9SX0xFTgkgICAgCSgyNTYgKiAxMDI0KSAgICAvKiBSZXNlcnZlIDI1NiBrQiBmb3IgTW9uICovCisjZGVmaW5lIENGR19NQUxMT0NfTEVOCSAgICAJKDEyOCAqIDEwMjQpICAgIC8qIFJlc2VydmVkIGZvciBtYWxsb2MgKi8KKworLyogU2VyaWFsIFBvcnQgKi8KKyNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVggICAgIDEKKyN1bmRlZglDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8KKyNkZWZpbmUgQ0ZHX05TMTY1NTAKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfU0VSSUFMCisjZGVmaW5lIENGR19OUzE2NTUwX1JFR19TSVpFICAgIDEKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ0xLCQlnZXRfYnVzX2ZyZXEoMCkKKworI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUgIFwKKwl7MzAwLCA2MDAsIDEyMDAsIDI0MDAsIDQ4MDAsIDk2MDAsIDE5MjAwLCAzODQwMCwxMTUyMDB9CisKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMSAgICAgICAgKENGR19DQ1NSQkFSKzB4NDUwMCkKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMiAgICAgICAgKENGR19DQ1NSQkFSKzB4NDYwMCkKKworLyogVXNlIHRoZSBIVVNIIHBhcnNlciAqLworI2RlZmluZSBDRkdfSFVTSF9QQVJTRVIKKyNpZmRlZiAgQ0ZHX0hVU0hfUEFSU0VSCisjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIgIj4gIgorI2VuZGlmCisKKy8qCisgKiBQYXNzIG9wZW4gZmlybXdhcmUgZmxhdCB0cmVlIHRvIGtlcm5lbAorICovCisjZGVmaW5lIENPTkZJR19PRl9GTEFUX1RSRUUJMQorI2RlZmluZSBDT05GSUdfT0ZfQk9BUkRfU0VUVVAJMQorCisvKiBtYXhpbXVtIHNpemUgb2YgdGhlIGZsYXQgdHJlZSAoOEspICovCisjZGVmaW5lIE9GX0ZMQVRfVFJFRV9NQVhfU0laRQk4MTkyCisKKyNkZWZpbmUgT0ZfQ1BVCQkiUG93ZXJQQyw4NjQxQDAiCisjZGVmaW5lIE9GX1NPQwkJInNvY0BmODAwMDAwMCIKKyNkZWZpbmUgT0ZfVEJDTEsJKGJkLT5iaV9idXNmcmVxIC8gNCkKKyNkZWZpbmUgT0ZfU1RET1VUX1BBVEgJIi9zb2NAZjgwMDAwMDAvc2VyaWFsQDQ1MDAiCisKKyNkZWZpbmUgQ0ZHXzY0QklUX1ZTUFJJTlRGCTEKKyNkZWZpbmUgQ0ZHXzY0QklUX1NUUlRPVUwJMQorCisvKgorICogSTJDCisgKi8KKyNkZWZpbmUJQ09ORklHX0ZTTF9JMkMJCS8qIFVzZSBGU0wgY29tbW9uIEkyQyBkcml2ZXIgKi8KKyNkZWZpbmUJQ09ORklHX0hBUkRfSTJDCQkvKiBJMkMgd2l0aCBoYXJkd2FyZSBzdXBwb3J0Ki8KKyN1bmRlZglDT05GSUdfU09GVF9JMkMJCQkvKiBJMkMgYml0LWJhbmdlZCAqLworI2RlZmluZSBDRkdfSTJDX1NQRUVECQk0MDAwMDAJLyogSTJDIHNwZWVkIGFuZCBzbGF2ZSBhZGRyZXNzICovCisjZGVmaW5lIENGR19JMkNfU0xBVkUJCTB4N0YKKyNkZWZpbmUgQ0ZHX0kyQ19OT1BST0JFUyAgICAgICAgezB4Njl9CS8qIERvbid0IHByb2JlIHRoZXNlIGFkZHJzICovCisjZGVmaW5lIENGR19JMkNfT0ZGU0VUCQkweDMxMDAKKworLyoKKyAqIFJhcGlkSU8gTU1VCisgKi8KKyNkZWZpbmUgQ0ZHX1JJT19NRU1fQkFTRQkweGMwMDAwMDAwCS8qIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBDRkdfUklPX01FTV9QSFlTCUNGR19SSU9fTUVNX0JBU0UKKyNkZWZpbmUgQ0ZHX1JJT19NRU1fU0laRQkweDIwMDAwMDAwCS8qIDEyOE0gKi8KKworLyoKKyAqIEdlbmVyYWwgUENJCisgKiBBZGRyZXNzZXMgYXJlIG1hcHBlZCAxLTEuCisgKi8KKyNkZWZpbmUgQ0ZHX1BDSTFfTUVNX0JBU0UJMHg4MDAwMDAwMAorI2RlZmluZSBDRkdfUENJMV9NRU1fUEhZUwlDRkdfUENJMV9NRU1fQkFTRQorI2RlZmluZSBDRkdfUENJMV9NRU1fU0laRQkweDIwMDAwMDAwCS8qIDUxMk0gKi8KKyNkZWZpbmUgQ0ZHX1BDSTFfSU9fQkFTRQkweGUyMDAwMDAwCisjZGVmaW5lIENGR19QQ0kxX0lPX1BIWVMJQ0ZHX1BDSTFfSU9fQkFTRQorI2RlZmluZSBDRkdfUENJMV9JT19TSVpFCTB4MTAwMDAwMAkvKiAxNk0gKi8KKworLyogUENJIHZpZXcgb2YgU3lzdGVtIE1lbW9yeSAqLworI2RlZmluZSBDRkdfUENJX01FTU9SWV9CVVMgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIENGR19QQ0lfTUVNT1JZX1BIWVMgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX1BDSV9NRU1PUllfU0laRSAgICAgMHg4MDAwMDAwMAorCisjZGVmaW5lIENGR19QQ0kyX01FTV9CQVNFCTB4YTAwMDAwMDAKKyNkZWZpbmUgQ0ZHX1BDSTJfTUVNX1BIWVMJQ0ZHX1BDSTJfTUVNX0JBU0UKKyNkZWZpbmUgQ0ZHX1BDSTJfTUVNX1NJWkUJMHgxMDAwMDAwMAkvKiAyNTZNICovCisjZGVmaW5lIENGR19QQ0kyX0lPX0JBU0UJMHhlMzAwMDAwMAorI2RlZmluZSBDRkdfUENJMl9JT19QSFlTCUNGR19QQ0kyX0lPX0JBU0UKKyNkZWZpbmUgQ0ZHX1BDSTJfSU9fU0laRQkweDEwMDAwMDAJLyogMTZNICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCisKKyNkZWZpbmUgQ09ORklHX1BDSV9TQ0FOX1NIT1cgICAgICAgICAgICAvKiBzaG93IHBjaSBkZXZpY2VzIG9uIHN0YXJ0dXAgKi8KKworI3VuZGVmIENGR19TQ1NJX1NDQU5fQlVTX1JFVkVSU0UKKworI2RlZmluZSBDT05GSUdfTkVUX01VTFRJCisjZGVmaW5lIENPTkZJR19QQ0lfUE5QCSAgICAgICAgICAgICAgIAkvKiBkbyBwY2kgcGx1Zy1hbmQtcGxheSAqLworCisjdW5kZWYgQ09ORklHX0VFUFJPMTAwCisjdW5kZWYgQ09ORklHX1RVTElQCisKKyNpZiAhZGVmaW5lZChDT05GSUdfUENJX1BOUCkKKyAgICAjZGVmaW5lIFBDSV9FTkVUMF9JT0FERFIJMHhlMDAwMDAwMAorICAgICNkZWZpbmUgUENJX0VORVQwX01FTUFERFIJMHhlMDAwMDAwMAorICAgICNkZWZpbmUgUENJX0lEU0VMX05VTUJFUgkweDBjIAkvKiBzbG90MC0+MyhJRFNFTCk9MTItPjE1ICovCisjZW5kaWYKKworI2RlZmluZSBDT05GSUdfUENJX1NDQU5fU0hPVwkJLyogc2hvdyBwY2kgZGV2aWNlcyBvbiBzdGFydHVwICovCisKKyNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KKyN1bmRlZiBDT05GSUdfU0NTSV9BSENJCisKKyNpZmRlZiBDT05GSUdfU0NTSV9BSENJCisjZGVmaW5lIENPTkZJR19TQVRBX1VMSTUyODgKKyNkZWZpbmUgQ0ZHX1NDU0lfTUFYX1NDU0lfSUQJNAorI2RlZmluZSBDRkdfU0NTSV9NQVhfTFVOCTEKKyNkZWZpbmUgQ0ZHX1NDU0lfTUFYX0RFVklDRSAJKENGR19TQ1NJX01BWF9TQ1NJX0lEICogQ0ZHX1NDU0lfTUFYX0xVTikKKyNkZWZpbmUgQ0ZHX1NDU0lfTUFYREVWSUNFCUNGR19TQ1NJX01BWF9ERVZJQ0UKKyNlbmRpZgorCisjZW5kaWYJLyogQ09ORklHX1BDSSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfVFNFQ19FTkVUKQorCisjaWZuZGVmIENPTkZJR19ORVRfTVVMVEkKKyNkZWZpbmUgQ09ORklHX05FVF9NVUxUSSAJMQorI2VuZGlmCisKKy8qICNkZWZpbmUgQ09ORklHX01JSQkJMSAqLwkvKiBNSUkgUEhZIG1hbmFnZW1lbnQgKi8KKworI2RlZmluZSBDT05GSUdfVFNFQzEgICAgMQorI2RlZmluZSBDT05GSUdfVFNFQzFfTkFNRSAgICAgICAiZVRTRUMxIgorI2RlZmluZSBDT05GSUdfVFNFQzIgICAgMQorI2RlZmluZSBDT05GSUdfVFNFQzJfTkFNRSAgICAgICAiZVRTRUMyIgorI2RlZmluZSBDT05GSUdfVFNFQzMgICAgMQorI2RlZmluZSBDT05GSUdfVFNFQzNfTkFNRSAgICAgICAiZVRTRUMzIgorI2RlZmluZSBDT05GSUdfVFNFQzQgICAgMQorI2RlZmluZSBDT05GSUdfVFNFQzRfTkFNRSAgICAgICAiZVRTRUM0IgorCisjZGVmaW5lIFRTRUMxX1BIWV9BRERSCQkweDFGCisjZGVmaW5lIFRTRUMyX1BIWV9BRERSCQkweDAwCisjZGVmaW5lIFRTRUMzX1BIWV9BRERSCQkweDAxCisjZGVmaW5lIFRTRUM0X1BIWV9BRERSCQkweDAyCisjZGVmaW5lIFRTRUMxX1BIWUlEWAkJMAorI2RlZmluZSBUU0VDMl9QSFlJRFgJCTAKKyNkZWZpbmUgVFNFQzNfUEhZSURYCQkwCisjZGVmaW5lIFRTRUM0X1BIWUlEWAkJMAorCisjZGVmaW5lIENGR19UQklQQV9WQUxVRQkweDFlCS8qIFNldCBUQkkgYWRkcmVzcyBub3QgdG8gY29uZmxpY3Qgd2l0aCBUU0VDMV9QSFlfQUREUiAqLworCisjZGVmaW5lIENPTkZJR19FVEhQUklNRQkJImVUU0VDMSIKKworI2VuZGlmCS8qIENPTkZJR19UU0VDX0VORVQgKi8KKworLyoKKyAqIEJBVDAgICAgICAgICAyRyAgICAgQ2FjaGVhYmxlLCBub24tZ3VhcmRlZAorICogMHgwMDAwXzAwMDAgIDJHICAgICBERFIKKyAqLworI2RlZmluZSBDRkdfREJBVDBMCShCQVRMX1BQX1JXIHwgQkFUTF9NRU1DT0hFUkVOQ0UpCisjZGVmaW5lIENGR19EQkFUMFUJKEJBVFVfQkxfMkcgfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKyNkZWZpbmUgQ0ZHX0lCQVQwTAkoQkFUTF9QUF9SVyB8IEJBVExfTUVNQ09IRVJFTkNFICkKKyNkZWZpbmUgQ0ZHX0lCQVQwVQlDRkdfREJBVDBVCisKKy8qCisgKiBCQVQxICAgICAgICAgMUcgICAgIENhY2hlLWluaGliaXRlZCwgZ3VhcmRlZAorICogMHg4MDAwXzAwMDAgIDUxMk0gICBQQ0ktRXhwcmVzcyAxIE1lbW9yeQorICogMHhhMDAwXzAwMDAgIDUxMk0gICBQQ0ktRXhwcmVzcyAyIE1lbW9yeQorICoJQ2hhbmdlZCBpdCBmb3Igb3BlcmF0aW5nIGZyb20gMHhkMDAwMDAwMAorICovCisjZGVmaW5lIENGR19EQkFUMUwJKCBDRkdfUENJMV9NRU1fQkFTRSB8IEJBVExfUFBfUlcgXAorCQkJfCBCQVRMX0NBQ0hFSU5ISUJJVCB8IEJBVExfR1VBUkRFRFNUT1JBR0UpCisjZGVmaW5lIENGR19EQkFUMVUJKENGR19QQ0kxX01FTV9CQVNFIHwgQkFUVV9CTF8yNTZNIHwgQkFUVV9WUyB8IEJBVFVfVlApCisjZGVmaW5lIENGR19JQkFUMUwJKENGR19QQ0kxX01FTV9CQVNFIHwgQkFUTF9QUF9SVyB8IEJBVExfQ0FDSEVJTkhJQklUKQorI2RlZmluZSBDRkdfSUJBVDFVCUNGR19EQkFUMVUKKworLyoKKyAqIEJBVDIgICAgICAgICA1MTJNICAgQ2FjaGUtaW5oaWJpdGVkLCBndWFyZGVkCisgKiAweGMwMDBfMDAwMCAgNTEyTSAgIFJhcGlkSU8gTWVtb3J5CisgKi8KKyNkZWZpbmUgQ0ZHX0RCQVQyTAkoQ0ZHX1JJT19NRU1fQkFTRSB8IEJBVExfUFBfUlcgXAorCQkJfCBCQVRMX0NBQ0hFSU5ISUJJVCB8IEJBVExfR1VBUkRFRFNUT1JBR0UpCisjZGVmaW5lIENGR19EQkFUMlUJKENGR19SSU9fTUVNX0JBU0UgfCBCQVRVX0JMXzUxMk0gfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKyNkZWZpbmUgQ0ZHX0lCQVQyTAkoQ0ZHX1JJT19NRU1fQkFTRSB8IEJBVExfUFBfUlcgfCBCQVRMX0NBQ0hFSU5ISUJJVCkKKyNkZWZpbmUgQ0ZHX0lCQVQyVQlDRkdfREJBVDJVCisKKy8qCisgKiBCQVQzICAgICAgICAgNE0gICAgIENhY2hlLWluaGliaXRlZCwgZ3VhcmRlZAorICogMHhmODAwXzAwMDAgIDRNICAgICBDQ1NSCisgKi8KKyNkZWZpbmUgQ0ZHX0RCQVQzTAkoIENGR19DQ1NSQkFSIHwgQkFUTF9QUF9SVyBcCisJCQl8IEJBVExfQ0FDSEVJTkhJQklUIHwgQkFUTF9HVUFSREVEU1RPUkFHRSkKKyNkZWZpbmUgQ0ZHX0RCQVQzVQkoQ0ZHX0NDU1JCQVIgfCBCQVRVX0JMXzRNIHwgQkFUVV9WUyB8IEJBVFVfVlApCisjZGVmaW5lIENGR19JQkFUM0wJKENGR19DQ1NSQkFSIHwgQkFUTF9QUF9SVyB8IEJBVExfQ0FDSEVJTkhJQklUKQorI2RlZmluZSBDRkdfSUJBVDNVCUNGR19EQkFUM1UKKworLyoKKyAqIEJBVDQgICAgICAgICAzMk0gICAgQ2FjaGUtaW5oaWJpdGVkLCBndWFyZGVkCisgKiAweGUyMDBfMDAwMCAgMTZNICAgIFBDSS1FeHByZXNzIDEgSS9PCisgKiAweGUzMDBfMDAwMCAgMTZNICAgIFBDSS1FeHByZXNzIDIgSS8wCisgKiAgICBOb3RlIHRoYXQgdGhpcyBpcyBhdCAweGUwMDAwMDAwCisgKi8KKyNkZWZpbmUgQ0ZHX0RCQVQ0TAkoIENGR19QQ0kxX0lPX0JBU0UgfCBCQVRMX1BQX1JXIFwKKwkJCXwgQkFUTF9DQUNIRUlOSElCSVQgfCBCQVRMX0dVQVJERURTVE9SQUdFKQorI2RlZmluZSBDRkdfREJBVDRVCShDRkdfUENJMV9JT19CQVNFIHwgQkFUVV9CTF8zMk0gfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKyNkZWZpbmUgQ0ZHX0lCQVQ0TAkoQ0ZHX1BDSTFfSU9fQkFTRSB8IEJBVExfUFBfUlcgfCBCQVRMX0NBQ0hFSU5ISUJJVCkKKyNkZWZpbmUgQ0ZHX0lCQVQ0VQlDRkdfREJBVDRVCisKKy8qCisgKiBCQVQ1ICAgICAgICAgMTI4SyAgIENhY2hlYWJsZSwgbm9uLWd1YXJkZWQKKyAqIDB4ZTQwMV8wMDAwICAxMjhLICAgSW5pdCBSQU0gZm9yIHN0YWNrIGluIHRoZSBDUFUgRENhY2hlIChubyBiYWNraW5nIG1lbW9yeSkKKyAqLworI2RlZmluZSBDRkdfREJBVDVMCShDRkdfSU5JVF9SQU1fQUREUiB8IEJBVExfUFBfUlcgfCBCQVRMX01FTUNPSEVSRU5DRSkKKyNkZWZpbmUgQ0ZHX0RCQVQ1VQkoQ0ZHX0lOSVRfUkFNX0FERFIgfCBCQVRVX0JMXzEyOEsgfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKyNkZWZpbmUgQ0ZHX0lCQVQ1TAlDRkdfREJBVDVMCisjZGVmaW5lIENGR19JQkFUNVUJQ0ZHX0RCQVQ1VQorCisvKgorICogQkFUNiAgICAgICAgIDMyTSAgICBDYWNoZS1pbmhpYml0ZWQsIGd1YXJkZWQKKyAqIDB4ZmUwMF8wMDAwICAzMk0gICAgRkxBU0gKKyAqLworI2RlZmluZSBDRkdfREJBVDZMCSgoQ0ZHX0ZMQVNIX0JBU0UgJiAweGZlMDAwMDAwKSB8IEJBVExfUFBfUlcgXAorCQkJfCBCQVRMX0NBQ0hFSU5ISUJJVCB8IEJBVExfR1VBUkRFRFNUT1JBR0UpCisjZGVmaW5lIENGR19EQkFUNlUJKChDRkdfRkxBU0hfQkFTRSAmIDB4ZmUwMDAwMDApIHwgQkFUVV9CTF8zMk0gfCBCQVRVX1ZTIHwgQkFUVV9WUCkKKyNkZWZpbmUgQ0ZHX0lCQVQ2TAkoKENGR19GTEFTSF9CQVNFICYgMHhmZTAwMDAwMCkgfCBCQVRMX1BQX1JXIHwgQkFUTF9NRU1DT0hFUkVOQ0UpCisjZGVmaW5lIENGR19JQkFUNlUJQ0ZHX0RCQVQ2VQorCisjZGVmaW5lIENGR19EQkFUN0wJMHgwMDAwMDAwMAorI2RlZmluZSBDRkdfREJBVDdVCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX0lCQVQ3TAkweDAwMDAwMDAwCisjZGVmaW5lIENGR19JQkFUN1UJMHgwMDAwMDAwMAorCisvKgorICogRW52aXJvbm1lbnQKKyAqLworI2RlZmluZSBDRkdfRU5WX0lTX0lOX0ZMQVNICTEKKyNkZWZpbmUgQ0ZHX0VOVl9BRERSCQkoQ0ZHX01PTklUT1JfQkFTRSArIDB4NDAwMDApCisjZGVmaW5lIENGR19FTlZfU0VDVF9TSVpFCTB4NDAwMDAJLyogMjU2SyhvbmUgc2VjdG9yKSBmb3IgZW52ICovCisjZGVmaW5lIENGR19FTlZfU0laRQkJMHgyMDAwCisKKyNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQgKi8KKyNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlICovCisKKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKyAgICAjZGVmaW5lIENPTkZJR19DTURfUElORworICAgICNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCisjZW5kaWYKKworI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkICovCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJKi8KKyNkZWZpbmUgQ0ZHX0xPQURfQUREUgkweDIwMDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0ZHX1BST01QVAkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdCAqLworCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyAgICAjZGVmaW5lIENGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KKyNlbHNlCisgICAgI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KKyNlbmRpZgorCisjZGVmaW5lIENGR19QQlNJWkUgKENGR19DQlNJWkUrc2l6ZW9mKENGR19QUk9NUFQpKzE2KSAvKiBQcmludCBCdWZmZXIgU2l6ZSAqLworI2RlZmluZSBDRkdfTUFYQVJHUwkxNgkJLyogbWF4IG51bWJlciBvZiBjb21tYW5kIGFyZ3MgKi8KKyNkZWZpbmUgQ0ZHX0JBUkdTSVpFCUNGR19DQlNJWkUJLyogQm9vdCBBcmd1bWVudCBCdWZmZXIgU2l6ZSAqLworI2RlZmluZSBDRkdfSFoJCTEwMDAJCS8qIGRlY3JlbWVudGVyIGZyZXE6IDFtcyB0aWNrcyAqLworCisvKgorICogRm9yIGJvb3RpbmcgTGludXgsIHRoZSBib2FyZCBpbmZvIGFuZCBjb21tYW5kIGxpbmUgZGF0YQorICogaGF2ZSB0byBiZSBpbiB0aGUgZmlyc3QgOCBNQiBvZiBtZW1vcnksIHNpbmNlIHRoaXMgaXMKKyAqIHRoZSBtYXhpbXVtIG1hcHBlZCBieSB0aGUgTGludXgga2VybmVsIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAqLworI2RlZmluZSBDRkdfQk9PVE1BUFNaCSg4IDw8IDIwKQkvKiBJbml0aWFsIE1lbW9yeSBtYXAgZm9yIExpbnV4Ki8KKworLyogQ2FjaGUgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTMyNzY4CisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgorI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKmxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlKi8KKyNlbmRpZgorCisvKgorICogSW50ZXJuYWwgRGVmaW5pdGlvbnMKKyAqCisgKiBCb290IEZsYWdzCisgKi8KKyNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLworI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdCAqLworCisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCisjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLworI2VuZGlmCisKKy8qCisgKiBFbnZpcm9ubWVudCBDb25maWd1cmF0aW9uCisgKi8KKworLyogVGhlIG1hYyBhZGRyZXNzZXMgZm9yIGFsbCBldGhlcm5ldCBpbnRlcmZhY2UgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19UU0VDX0VORVQpCisjZGVmaW5lIENPTkZJR19FVEhBRERSICAgMDI6RTA6MEM6MDA6MDA6MDEKKyNkZWZpbmUgQ09ORklHX0VUSDFBRERSICAwMjpFMDowQzowMDowMTpGRAorI2RlZmluZSBDT05GSUdfRVRIMkFERFIgIDAyOkUwOjBDOjAwOjAyOkZECisjZGVmaW5lIENPTkZJR19FVEgzQUREUiAgMDI6RTA6MEM6MDA6MDM6RkQKKyNlbmRpZgorCisjZGVmaW5lIENPTkZJR19IQVNfRVRIMQkJMQorI2RlZmluZSBDT05GSUdfSEFTX0VUSDIJCTEKKyNkZWZpbmUgQ09ORklHX0hBU19FVEgzCQkxCisKKyNkZWZpbmUgQ09ORklHX0lQQUREUgkJMTkyLjE2OC4wLjUwCisKKyNkZWZpbmUgQ09ORklHX0hPU1ROQU1FCQlzYmM4NjQxZAorI2RlZmluZSBDT05GSUdfUk9PVFBBVEgJCS9vcHQvZWxkay9wcGNfNzR4eAorI2RlZmluZSBDT05GSUdfQk9PVEZJTEUJCXVJbWFnZQorCisjZGVmaW5lIENPTkZJR19TRVJWRVJJUAkJMTkyLjE2OC4wLjIKKyNkZWZpbmUgQ09ORklHX0dBVEVXQVlJUAkxOTIuMTY4LjAuMQorI2RlZmluZSBDT05GSUdfTkVUTUFTSwkJMjU1LjI1NS4yNTUuMAorCisvKiBkZWZhdWx0IGxvY2F0aW9uIGZvciB0ZnRwIGFuZCBib290bSAqLworI2RlZmluZSBDT05GSUdfTE9BREFERFIJCTEwMDAwMDAKKworI2RlZmluZSBDT05GSUdfQk9PVERFTEFZIDEwCS8qIC0xIGRpc2FibGVzIGF1dG8tYm9vdCAqLworI3VuZGVmICBDT05GSUdfQk9PVEFSR1MJCS8qIHRoZSBib290IGNvbW1hbmQgd2lsbCBzZXQgYm9vdGFyZ3MgKi8KKworI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJMTE1MjAwCisKKyNkZWZpbmUJQ09ORklHX0VYVFJBX0VOVl9TRVRUSU5HUwkJCQkJXAorICAgIm5ldGRldj1ldGgwXDAiCQkJCQkJCVwKKyAgICJjb25zb2xlZGV2PXR0eVMwXDAiCQkJCQkJCVwKKyAgICJyYW1kaXNrYWRkcj0yMDAwMDAwXDAiCQkJCQkJXAorICAgInJhbWRpc2tmaWxlPXVSYW1kaXNrXDAiCQkJCQkJXAorICAgImR0YmFkZHI9NDAwMDAwXDAiCQkJCQkJCVwKKyAgICJkdGJmaWxlPXNiYzg2NDFkLmR0YlwwIgkJCQkJCVwKKyAgICJlbi13ZD1tdy5iIGY4MTAwMDEwIDB4MDg7IGVjaG8gLWV4cGVjdDotIDA4OyBtZC5iIGY4MTAwMDEwIDFcMCIJXAorICAgImRpcy13ZD1tdy5iIGY4MTAwMDEwIDB4MDA7IGVjaG8gLWV4cGVjdDotIDAwOyBtZC5iIGY4MTAwMDEwIDFcMCIJXAorICAgIm1heGNwdXM9MSIKKworI2RlZmluZSBDT05GSUdfTkZTQk9PVENPTU1BTkQJCQkJCQlcCisgICAic2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9uZnMgcncgIgkJCQkJXAorICAgICAgIm5mc3Jvb3Q9JHNlcnZlcmlwOiRyb290cGF0aCAiCQkJCQlcCisgICAgICAiaXA9JGlwYWRkcjokc2VydmVyaXA6JGdhdGV3YXlpcDokbmV0bWFzazokaG9zdG5hbWU6JG5ldGRldjpvZmYgIglcCisgICAgICAiY29uc29sZT0kY29uc29sZWRldiwkYmF1ZHJhdGUgJG90aGJvb3RhcmdzOyIJCQlcCisgICAidGZ0cCAkbG9hZGFkZHIgJGJvb3RmaWxlOyIJCQkJCQlcCisgICAidGZ0cCAkZHRiYWRkciAkZHRiZmlsZTsiCQkJCQkJXAorICAgImJvb3RtICRsb2FkYWRkciAtICRkdGJhZGRyIgorCisjZGVmaW5lIENPTkZJR19SQU1CT09UQ09NTUFORAkJCQkJCVwKKyAgICJzZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L3JhbSBydyAiCQkJCQlcCisgICAgICAiaXA9JGlwYWRkcjokc2VydmVyaXA6JGdhdGV3YXlpcDokbmV0bWFzazokaG9zdG5hbWU6JG5ldGRldjpvZmYgIglcCisgICAgICAiY29uc29sZT0kY29uc29sZWRldiwkYmF1ZHJhdGUgJG90aGJvb3RhcmdzOyIJCQlcCisgICAidGZ0cCAkcmFtZGlza2FkZHIgJHJhbWRpc2tmaWxlOyIJCQkJCVwKKyAgICJ0ZnRwICRsb2FkYWRkciAkYm9vdGZpbGU7IgkJCQkJCVwKKyAgICJ0ZnRwICRkdGJhZGRyICRkdGJmaWxlOyIJCQkJCQlcCisgICAiYm9vdG0gJGxvYWRhZGRyICRyYW1kaXNrYWRkciAkZHRiYWRkciIKKworI2RlZmluZSBDT05GSUdfRkxBU0hCT09UQ09NTUFORAkJCQkJCVwKKyAgICJzZXRlbnYgYm9vdGFyZ3Mgcm9vdD0vZGV2L3JhbSBydyAiCQkJCQlcCisgICAgICAiaXA9JGlwYWRkcjokc2VydmVyaXA6JGdhdGV3YXlpcDokbmV0bWFzazokaG9zdG5hbWU6JG5ldGRldjpvZmYgIglcCisgICAgICAiY29uc29sZT0kY29uc29sZWRldiwkYmF1ZHJhdGUgJG90aGJvb3RhcmdzOyIJCQlcCisgICAiYm9vdG0gZmZkMDAwMDAgZmZiMDAwMDAgZmZhMDAwMDAiCisKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5EICBDT05GSUdfRkxBU0hCT09UQ09NTUFORAorCisjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3NjMy5oIGIvaW5jbHVkZS9jb25maWdzL3NjMy5oCmluZGV4IDZiNmFjZmEuLmNiMjI1MzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zYzMuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvc2MzLmgKQEAgLTU4LDcgKzU4LDcgQEAKICAqIDB4RkZFMDAwMDAgLi4uLiAweEZGRkZGRkZGIC0+IEJPT1QtUk9NICgyIE1pQikKICAqLwogCi0jZGVmaW5lIENPTkZJR19TT0xJRENBUkQzCTEKKyNkZWZpbmUgQ09ORklHX1NDMwkxCiAjZGVmaW5lIENPTkZJR180eHgJMQogI2RlZmluZSBDT05GSUdfNDA1R1AJMQogCkBAIC02OCw4ICs2OCw3IEBACiAgKiBEZWZpbmUgSURFX1VTRVNfSVNBX0VNVUxBVElPTiBmb3Igc2xvd2VyIElERSBhY2Nlc3MgaW4gdGhlIElTQS1JTyBhZGRyZXNzIHJhbmdlCiAgKiBJZiB1bmRlZmluZWQsIElERSBhY2Nlc3MgdXNlcyBhIHNlcGVyYXQgZW11bGF0aW9uIHdpdGggaGlnaGVyIGFjY2VzcyBzcGVlZC4KICAqIENvbnNpZGVyIHRvIGluZm9ybSB5b3VyIExpbnV4IElERSBkcml2ZXIgYWJvdXQgdGhlIGRpZmZlcmVudCBhZGRyZXNzZXMhCi0gKiBJREVfVVNFU19JU0FfRU1VTEFUSU9OIGlzIG9ubHkgdXNlZCBpZiB5b3VyIENPTkZJR19DT01NQU5EUyBtYWNybyBpbmNsdWRlcwotICogdGhlIENGR19DTURfSURFIG1hY3JvIQorICogSURFX1VTRVNfSVNBX0VNVUxBVElPTiBpcyBvbmx5IHVzZWQgaWYgeW91IGRlZmluZSBDT05GSUdfQ01EX0lERSEKICAqLwogI2RlZmluZSBJREVfVVNFU19JU0FfRU1VTEFUSU9OCiAKQEAgLTEzNCw3ICsxMzMsOCBAQAogI2lmIDEJLyogZmVlbCBmcmVlIHRvIGRpc2FibGUgZm9yIGRldmVsb3BtZW50ICovCiAjZGVmaW5lIENPTkZJR19BVVRPQk9PVF9LRVlFRAkJLyogRW5hYmxlIHBhc3N3b3JkIHByb3RlY3Rpb24JKi8KICNkZWZpbmUgQ09ORklHX0FVVE9CT09UX1BST01QVAkJIlxuU0MzIC0gYm9vdGluZy4uLiBzdG9wIHdpdGggRU5URVJcbiIKLSNkZWZpbmUgQ09ORklHX0FVVE9CT09UX0RFTEFZX1NUUgkiXG4iCS8qIDFzdCAicGFzc3dvcmQiCSovCisjZGVmaW5lIENPTkZJR19BVVRPQk9PVF9ERUxBWV9TVFIJIlxyIgkvKiAxc3QgInBhc3N3b3JkIgkqLworI2RlZmluZSBDT05GSUdfQVVUT0JPT1RfREVMQVlfU1RSMgkiXG4iCS8qIDFzdCAicGFzc3dvcmQiCSovCiAjZW5kaWYKIAogLyoKQEAgLTE2OCwyNSArMTY4LDM2IEBACiAjZGVmaW5lIENPTkZJR19NSUkgMQkJCS8qIGFkZCA0MDVHUCBNSUkgUEhZIG1hbmFnZW1lbnQJCSovCiAjZGVmaW5lIENPTkZJR19QSFlfQUREUiAxCS8qIHRoZSBjb25uZWN0ZWQgUGh5IGRlZmF1bHRzIHRvIGFkZHJlc3MgMSAqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgIFwKLQkgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQlDRkdfQ01EX0FVVE9TQ1JJUFQJfCBcCi0JCQlDRkdfQ01EX1BDSQkJfCBcCi0JCQlDRkdfQ01EX0lSUQkJfCBcCi0JCQlDRkdfQ01EX05FVAkJfCBcCi0JCQlDRkdfQ01EX01JSQkJfCBcCi0JCQlDRkdfQ01EX1BJTkcJCXwgXAotCQkJQ0ZHX0NNRF9OQU5ECQl8IFwKLQkJCUNGR19DTURfSkZGUzIJCXwgXAotCQkJQ0ZHX0NNRF9JMkMJCXwgXAotCQkJQ0ZHX0NNRF9JREUJCXwgXAotCQkJQ0ZHX0NNRF9EQVRFCQl8IFwKLQkJCUNGR19DTURfREhDUAkJfCBcCi0JCQlDRkdfQ01EX0NBQ0hFCQl8IFwKLQkJCUNGR19DTURfRUxGCSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKworI2RlZmluZSBDT05GSUdfQ01EX0FVVE9TQ1JJUFQKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfTkFORAorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtMjc2LDcgKzI4Nyw3IEBACiAgKiBFeHRlcm5hbCBwZXJpcGhlcmFsIGJhc2UgYWRkcmVzcwogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCi0jaWYgIShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkKKyNpZiAhZGVmaW5lZChDT05GSUdfQ01EX0lERSkKIAogI3VuZGVmCUNPTkZJR19JREVfTEVECQkJLyogbm8gbGVkIGZvciBpZGUgc3VwcG9ydGVkCSovCiAjdW5kZWYJQ09ORklHX0lERV9SRVNFVAkJLyogbm8gcmVzZXQgZm9yIGlkZSBzdXBwb3J0ZWQJKi8KQEAgLTI4NSw3ICsyOTYsNyBAQAogICogSURFL0FUQSBzdHVmZgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCi0jZWxzZSAvKiAhKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSAqLworI2Vsc2UKICNkZWZpbmUgQ09ORklHX1NUQVJUX0lERQkxCS8qIGNoZWNrLCBpZiB1c2UgSURFICovCiAKICN1bmRlZglDT05GSUdfSURFXzh4eF9ESVJFQ1QJCS8qIG5vIHBjbWNpYSBpbnRlcmZhY2UgcmVxdWlyZWQgKi8KQEAgLTM0NSw3ICszNTYsNyBAQAogCiAjZW5kaWYgLyogSURFX1VTRVNfSVNBX0VNVUxBVElPTiAqLwogCi0jZW5kaWYgLyogIShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkgKi8KKyNlbmRpZgogCiAvKgogI2RlZmluZQlDRkdfS0VZX1JFR19CQVNFX0FERFIJMHhGMDEwMDAwMApAQCAtNDM2LDcgKzQ0Nyw3IEBACiAKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFIDMyCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3NjNTIwX2NkcC5oIGIvaW5jbHVkZS9jb25maWdzL3NjNTIwX2NkcC5oCmluZGV4IGQ3ZDA3YTYuLjg0OTFkOTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zYzUyMF9jZHAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvc2M1MjBfY2RwLmgKQEAgLTY0LDI0ICs2NCwzNyBAQAogICovCiAjZGVmaW5lIENPTkZJR19NQUxMT0NfU0laRQkoQ0ZHX0VOVl9TSVpFICsgMTI4KjEwMjQpCiAKLQogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTk2MDAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgICAgICAgICAoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BDSSB8IENGR19DTURfSkZGUzIgfCBDRkdfQ01EX0lERSB8IENGR19DTURfTkVUIHwgQ0ZHX0NNRF9FRVBST00pCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTE1CiAjZGVmaW5lIENPTkZJR19CT09UQVJHUyAgICAJInJvb3Q9L2Rldi9tdGRibG9jazAgY29uc29sZT10dHlTMCw5NjAwIgogLyogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIDM4MDAwMDAwIiAqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMTE1MjAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKIAotCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICovCkBAIC0xMDQsNyArMTE3LDYgQEAKIAkJCQkJCS8qIHZhbGlkIGJhdWRyYXRlcyAqLwogI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfQogCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIFBoeXNpY2FsIE1lbW9yeSBNYXAKICAqLwpAQCAtMTEzLDggKzEyNSw2IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBGTEFTSCBhbmQgZW52aXJvbm1lbnQgb3JnYW5pemF0aW9uCiAgKi8KLQotCiAjZGVmaW5lIENGR19NQVhfRkxBU0hfQkFOS1MJMwkvKiBtYXggbnVtYmVyIG9mIG1lbW9yeSBiYW5rcwkJKi8KICNkZWZpbmUgQ0ZHX01BWF9GTEFTSF9TRUNUCTY0CS8qIG1heCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcAkqLwogCkBAIC0xMjUsMTEgKzEzNSw5IEBACiAjZGVmaW5lIENPTkZJR19TUElfRUVQUk9NICAgICAgLyogU3VwcG9ydCBmb3IgU1BJIEVFUFJPTXMgKEFUMjUxMjgpICovCiAjZGVmaW5lIENPTkZJR19NV19FRVBST00gICAgICAgLyogU3VwcG9ydCBmb3IgTWljcm9XaXJlIEVFUFJPTXMgKEFUOTNMQzQ2KSAqLwogCi0KIC8qIGFsbG93IHRvIG92ZXJ3cml0ZSBzZXJpYWwgYW5kIGV0aGFkZHIgKi8KICNkZWZpbmUgQ09ORklHX0VOVl9PVkVSV1JJVEUKIAotCiAvKiBFbnZpcm9ubWVudCBpbiBFRVBST00gKi8KICNkZWZpbmUgQ0ZHX0VOVl9JU19JTl9FRVBST00gICAxCiAjZGVmaW5lIENPTkZJR19TUEkKQEAgLTE4Miw2ICsxOTAsMTUgQEAKICN1bmRlZiAgQ09ORklHX0lERV9SRVNFVF9ST1VUSU5FCS8qIG5vIHNwZWNpYWwgcmVzZXQgZnVuY3Rpb24gKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKlNBVEEvTmF0aXZlIFN0dWZmCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENGR19TQVRBX1NVUFBPUlRFRCAgICAgIDEKKyNkZWZpbmUgQ0ZHX1NBVEFfTUFYQlVTICAgICAgICAgMiAgICAgICAvKk1heCBTYXRhIGJ1c2VzIHN1cHBvcnRlZCAqLworI2RlZmluZSBDRkdfU0FUQV9ERVZTX1BFUl9CVVMgICAyICAgICAgLypNYXggbm8uIG9mIGRldmljZXMgcGVyIGJ1cy9wb3J0ICovCisjZGVmaW5lIENGR19TQVRBX01BWERFVklDRVMgICAgIChDRkdfU0FUQV9NQVhCVVMqIENGR19TQVRBX0RFVlNfUEVSX0JVUykKKyNkZWZpbmUgQ0ZHX0FUQV9QSUlYICAgICAgICAgICAgMSAgICAgICAvKlN1cHBvcnRzIGF0YV9waWl4IGRyaXZlciAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBBVEFQSSBzdXBwb3J0IChleHBlcmltZW50YWwpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2RlZmluZSBDT05GSUdfQVRBUEkJCQkvKiBlbmFibGUgQVRBUEkgU3VwcG9ydCAqLwpAQCAtMjAwLDcgKzIxNyw2IEBACiAjZGVmaW5lIENPTkZJR19JODA0Ml9LQkQKICNkZWZpbmUgQ0ZHX0lTQV9JTyAwCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogUlRDCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvc2M1MjBfc3B1bmsuaCBiL2luY2x1ZGUvY29uZmlncy9zYzUyMF9zcHVuay5oCmluZGV4IGE4ZTM1NTUuLmM2ZjdmMTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zYzUyMF9zcHVuay5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9zYzUyMF9zcHVuay5oCkBAIC02NCwxNiArNjQsMzQgQEAKIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTk2MDAKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgICAgICAgICAoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BDSSB8IENGR19DTURfSkZGUzIgfCBDRkdfQ01EX0lERSB8IENGR19DTURfTkVUIHwgQ0ZHX0NNRF9QQ01DSUEgfCBDRkdfQ01EX0VFUFJPTSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0pGRlMyCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfUENNQ0lBCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTE1CiAjZGVmaW5lIENPTkZJR19CT09UQVJHUyAgICAJInJvb3Q9L2Rldi9tdGRibG9jazEgY29uc29sZT10dHlTMCw5NjAwIG10ZHBhcnRzPXBoeXM6NzkzNmsocm9vdCksMjU2ayh1Ym9vdCkgIgogI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJInNldGVudiBib290YXJncyByb290PS9kZXYvbmZzIGlwPWF1dG9jb25mIGNvbnNvbGU9dHR5UzAsOTYwMCBtdGRwYXJ0cz1waHlzOjc4MDhrKHJvb3QpLDEyOGsoZW52KSwyNTZrKHVib290KTsgYm9vdHA7IGJvb3RtIgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMTE1MjAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zY2I5MzI4LmggYi9pbmNsdWRlL2NvbmZpZ3Mvc2NiOTMyOC5oCmluZGV4IGE0MjQ5YzQuLmQxNDAyNDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zY2I5MzI4LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3NjYjkzMjguaApAQCAtMzYsMjAgKzM2LDI3IEBACiAKIAogLyoKLSAqIERlZmluaXRpb24gb2YgdS1ib290IGJ1aWxkIGluIGNvbW1hbmRzLiBDaGVjayBvdXQgQ09ORklHX0NNRF9ERkwgaWYKLSAqIG5lY2Nlc3NhcnkgaW4gaW5jbHVkZS9jbWRfY29uZmRlZnMuaCBmaWxlLiAoVW4pY29tbWVudCBmb3IgZ2V0dGluZwotICogZnVuY3Rpb25hbGl0eSBvciBzaXplIG9mIHUtYm9vdCBjb2RlLgorICogQk9PVFAgb3B0aW9ucwogICovCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENPTkZJR19DTURfREZMCQlcCi0JCQkJJiB+Q0ZHX0NNRF9MT0FEUwlcCi0JCQkJJiB+Q0ZHX0NNRF9DT05TT0xFCVwKLQkJCQkmIH5DRkdfQ01EX0FVVE9TQ1JJUFQJXAotCQkJCXwgQ0ZHX0NNRF9ORVQJCVwKLQkJCQl8IENGR19DTURfUElORwkJXAotCQkJCXwgQ0ZHX0NNRF9ESENQCQlcCi0JCQkJKQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjdW5kZWYgQ09ORklHX0NNRF9DT05TT0xFCisjdW5kZWYgQ09ORklHX0NNRF9BVVRPU0NSSVBUCisKIAogLyoKICAqIEJvb3Qgb3B0aW9ucy4gU2V0dGluZyBkZWxheSB0byAtMSBzdG9wcyBhdXRvc3RhcnQgY291bnQgZG93bi4KQEAgLTE4Miw3ICsxODksNyBAQAogICogUmlnaHQgbm93IHRoZXJlIGlzIG5vIGdhaW4gZm9yIHVzZXIsIGJ1dCBsYXRlciBvbiBib290aW5nIGtlcm5lbCBtaWdodCBiZQogICogcG9zc2libGUuIENvbnNpZGVyIHVzaW5nIFhJUCBrZXJuZWwgcnVubmluZyBmcm9tIGZsYXNoIHRvIHNhdmUgUkFNCiAgKiBmb290cHJpbnQuCi0gKiBOT1RFOiBFbmFibGUgQ0ZHX0NNRF9KRkZTMiBmb3IgSkZGUzIgc3VwcG9ydC4KKyAqIE5PVEU6IEVuYWJsZSBDT05GSUdfQ01EX0pGRlMyIGZvciBKRkZTMiBzdXBwb3J0LgogICovCiAjZGVmaW5lIENGR19KRkZTMl9GSVJTVF9CQU5LCQkwCiAjZGVmaW5lIENGR19KRkZTMl9GSVJTVF9TRUNUT1IJCTUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zZXF1b2lhLmggYi9pbmNsdWRlL2NvbmZpZ3Mvc2VxdW9pYS5oCmluZGV4IDIzMjQzYTQuLjNmNzVhNDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zZXF1b2lhLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3NlcXVvaWEuaApAQCAtMzcsNiArMzcsNyBAQAogI2Vsc2UKICNkZWZpbmUgQ09ORklHXzQ0MEdSWAkJMQkJLyogU3BlY2lmaWMgUFBDNDQwR1J4CSovCiAjZW5kaWYKKyNkZWZpbmUgQ09ORklHXzQ0MAkJMQkJLyogLi4uIFBQQzQ0MCBmYW1pbHkJKi8KICNkZWZpbmUgQ09ORklHXzR4eAkJMQkJLyogLi4uIFBQQzR4eCBmYW1pbHkJKi8KIC8qIERldGVjdCBTZXF1b2lhIFBMTCBpbnB1dCBjbG9jayBhdXRvbWF0aWNhbGx5IHZpYSBDUExEIGJpdAkJKi8KICNkZWZpbmUgQ09ORklHX1NZU19DTEtfRlJFUSAgICAoKGluOChDRkdfQkNTUl9CQVNFICsgMykgJiAweDgwKSA/IFwKQEAgLTU4LDYgKzU5LDcgQEAKICNkZWZpbmUgQ0ZHX01PTklUT1JfQkFTRQlURVhUX0JBU0UKICNkZWZpbmUgQ0ZHX05BTkRfQUREUgkJMHhkMDAwMDAwMCAgICAgIC8qIE5BTkQgRmxhc2gJCSovCiAjZGVmaW5lIENGR19PQ01fQkFTRQkJMHhlMDAxMDAwMCAgICAgIC8qIG9jbQkJCSovCisjZGVmaW5lIENGR19PQ01fREFUQV9BRERSCUNGR19PQ01fQkFTRQogI2RlZmluZSBDRkdfUENJX0JBU0UJCTB4ZTAwMDAwMDAgICAgICAvKiBJbnRlcm5hbCBQQ0kgcmVncwkqLwogI2RlZmluZSBDRkdfUENJX01FTUJBU0UJCTB4ODAwMDAwMDAJLyogbWFwcGVkIHBjaSBtZW1vcnkJKi8KICNkZWZpbmUgQ0ZHX1BDSV9NRU1CQVNFMQlDRkdfUENJX01FTUJBU0UgICsgMHgxMDAwMDAwMApAQCAtODAsNyArODIsNyBAQAogI2RlZmluZSBDRkdfSU5JVF9SQU1fRU5ECSg0IDw8IDEwKQogI2RlZmluZSBDRkdfR0JMX0RBVEFfU0laRQkyNTYJCS8qIG51bSBieXRlcyBpbml0aWFsIGRhdGEgKi8KICNkZWZpbmUgQ0ZHX0dCTF9EQVRBX09GRlNFVAkoQ0ZHX0lOSVRfUkFNX0VORCAtIENGR19HQkxfREFUQV9TSVpFKQotI2RlZmluZSBDRkdfSU5JVF9TUF9PRkZTRVQJQ0ZHX0dCTF9EQVRBX09GRlNFVAorI2RlZmluZSBDRkdfSU5JVF9TUF9PRkZTRVQJQ0ZHX1BPU1RfV09SRF9BRERSCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIFNlcmlhbCBQb3J0CkBAIC0xMjUsNyArMTI3LDcgQEAKICNkZWZpbmUgQ0ZHX0ZMQVNIX1FVSUVUX1RFU1QJMQkvKiBkb24ndCB3YXJuIHVwb24gdW5rbm93biBmbGFzaAkqLwogCiAjaWZkZWYgQ0ZHX0VOVl9JU19JTl9GTEFTSAotI2RlZmluZSBDRkdfRU5WX1NFQ1RfU0laRQkweDIwMDAwIAkvKiBzaXplIG9mIG9uZSBjb21wbGV0ZSBzZWN0b3IJKi8KKyNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJMHgyMDAwMAkvKiBzaXplIG9mIG9uZSBjb21wbGV0ZSBzZWN0b3IJCSovCiAjZGVmaW5lIENGR19FTlZfQUREUgkJKCgtQ0ZHX01PTklUT1JfTEVOKS1DRkdfRU5WX1NFQ1RfU0laRSkKICNkZWZpbmUJQ0ZHX0VOVl9TSVpFCQkweDIwMDAJLyogVG90YWwgU2l6ZSBvZiBFbnZpcm9ubWVudCBTZWN0b3IJKi8KIApAQCAtMjk3LDkgKzI5OSw2IEBACiAvKiBDb21tZW50IHRoaXMgb3V0IHRvIGVuYWJsZSBVU0IgMS4xIGRldmljZSAqLwogI2RlZmluZSBVU0JfMl8wX0RFVklDRQogCi0jZGVmaW5lIENNRF9VU0IJCQlDRkdfQ01EX1VTQgotI2Vsc2UKLSNkZWZpbmUgQ01EX1VTQgkJCTAJLyogbm8gVVNCIG9uIDQ0MEdSeAkJKi8KICNlbmRpZiAvKiBDT05GSUdfNDQwRVBYICovCiAKIC8qIFBhcnRpdGlvbnMgKi8KQEAgLTMwNywzNyArMzA2LDY4IEBACiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19JU09fUEFSVElUSU9OCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgIChDT05GSUdfQ01EX0RGTAl8CVwKLQkJCSAgICAgICBDRkdfQ01EX0FTS0VOVgl8CVwKLQkJCSAgICAgICBDRkdfQ01EX0RIQ1AJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9EVFQJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9ESUFHCXwJXAotCQkJICAgICAgIENGR19DTURfRUVQUk9NCXwJXAotCQkJICAgICAgIENGR19DTURfRUxGCXwJXAotCQkJICAgICAgIENGR19DTURfRkFUCXwJXAotCQkJICAgICAgIENGR19DTURfSTJDCXwJXAotCQkJICAgICAgIENGR19DTURfSVJRCXwJXAotCQkJICAgICAgIENGR19DTURfTUlJCXwJXAotCQkJICAgICAgIENGR19DTURfTkFORAl8CVwKLQkJCSAgICAgICBDRkdfQ01EX05FVAl8CVwKLQkJCSAgICAgICBDRkdfQ01EX05GUwl8CVwKLQkJCSAgICAgICBDRkdfQ01EX1BDSQl8CVwKLQkJCSAgICAgICBDRkdfQ01EX1BJTkcJfAlcCi0JCQkgICAgICAgQ0ZHX0NNRF9SRUdJTkZPCXwJXAotCQkJICAgICAgIENGR19DTURfU0RSQU0JfAlcCi0JCQkgICAgICAgQ01EX1VTQikKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9EVFQKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkFORAorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KKworI2lmZGVmIENPTkZJR180NDBFUFgKKyNkZWZpbmUgQ09ORklHX0NNRF9VU0IKKyNlbmRpZgorCisKKy8qIFBPU1Qgc3VwcG9ydCAqLworI2RlZmluZSBDT05GSUdfUE9TVAkJKENGR19QT1NUX01FTU9SWSAgIHwgXAorCQkJCSBDRkdfUE9TVF9DUFUJICAgfCBcCisJCQkJIENGR19QT1NUX1VBUlQJICAgfCBcCisJCQkJIENGR19QT1NUX0kyQwkgICB8IFwKKwkJCQkgQ0ZHX1BPU1RfQ0FDSEUJICAgfCBcCisJCQkJIENGR19QT1NUX0ZQVQkgICB8IFwKKwkJCQkgQ0ZHX1BPU1RfRVRIRVIJICAgfCBcCisJCQkJIENGR19QT1NUX1NQUikKKworI2RlZmluZSBDRkdfUE9TVF9XT1JEX0FERFIJKENGR19HQkxfREFUQV9PRkZTRVQgLSAweDQpCisjZGVmaW5lIENPTkZJR19MT0dCVUZGRVIKKyNkZWZpbmUgQ0ZHX1BPU1RfQ0FDSEVfQUREUgkweDEwMDAwMDAwIC8qIGZyZWUgdmlydHVhbCBhZGRyZXNzCSovCisKKyNkZWZpbmUgQ0ZHX0NPTlNPTEVfSVNfSU5fRU5WIC8qIE90aGVyd2lzZSBpdCBjYXRjaGVzIGxvZ2J1ZmZlciBhcyBvdXRwdXQgKi8KIAogI2RlZmluZSBDT05GSUdfU1VQUE9SVF9WRkFUCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJICAgICAgICAiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkgICAgICAgIDEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJICAgICAgICAyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTM3MCw3ICs0MDAsNiBAQAogI2RlZmluZSBDRkdfUENJX1RBUkdCQVNFICAgICAgICAweDgwMDAwMDAwIC8qIFBDSWFkZHIgbWFwcGVkIHRvIENGR19QQ0lfTUVNQkFTRSovCiAKIC8qIEJvYXJkLXNwZWNpZmljIFBDSSAqLwotI2RlZmluZSBDRkdfUENJX1BSRV9JTklUCQkvKiBlbmFibGUgYm9hcmQgcGNpX3ByZV9pbml0KCkJKi8KICNkZWZpbmUgQ0ZHX1BDSV9UQVJHRVRfSU5JVAogI2RlZmluZSBDRkdfUENJX01BU1RFUl9JTklUCiAKQEAgLTQyOCw3ICs0NTcsNyBAQAogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkoMzI8PDEwKSAgLyogRm9yIEFNQ0MgNDQwIENQVXMJCQkqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJICAgICAgLyogLi4uCQkJICAgICAgICAgICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJICAgICAgLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCkBAIC00NDAsNyArNDY5LDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJICAgIC8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvc2hhbm5vbi5oIGIvaW5jbHVkZS9jb25maWdzL3NoYW5ub24uaAppbmRleCA1NzI5ODViLi5jMWZhNTNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvc2hhbm5vbi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9zaGFubm9uLmgKQEAgLTY2LDIxICs2NiwyOCBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAKLSNpZiAwIC8qIFhYWCAtIGNhbm5vdCB0ZXN0IElERSBhbnl3YXksIHNvIGRpc2FibGVkIGZvciBub3cgLSB3ZCAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQkgQ0ZHX0NNRF9QQ01DSUEJfCBcCi0JCQkJIENGR19DTURfSURFKQotI2VuZGlmIC8qIDAgKi8KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwogI2RlZmluZSBDT05GSUdfQk9PVEFSR1MgICAgCSJyb290PXJhbWZzIGRldmZzPW1vdW50IGNvbnNvbGU9dHR5U0EwLDExNTIwMCIKICNkZWZpbmUgQ09ORklHX05FVE1BU0sgICAgICAgICAgMjU1LjI1NS4wLjAKICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJoZWxwIgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCQkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zbWRrMjQwMC5oIGIvaW5jbHVkZS9jb25maWdzL3NtZGsyNDAwLmgKaW5kZXggYTEzN2Y5ZC4uMDVmNjA1MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3NtZGsyNDAwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3NtZGsyNDAwLmgKQEAgLTg2LDI0ICs4NiwzMiBAQAogLyogVXNlIHMzYzI0MDAncyBSVEMgKi8KICNkZWZpbmUgQ09ORklHX1JUQ19TM0MyNFgwCTEKIAotI2lmbmRlZiBVU0VfOTIwVF9NTVUKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTX3RtcCAgICAoKENPTkZJR19DTURfREZMICYgfkNGR19DTURfQ0FDSEUpIHwgXAotCQkJCUNGR19DTURfREFURQl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQotI2Vsc2UKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTX3RtcCAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfU05UUAkpCisKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCisjaWYgZGVmaW5lZChDT05GSUdfSFdGTE9XKQorICAgICNkZWZpbmUgQ09ORklHX0NPTkZJR19IV0ZMT1cKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0hXRkxPVwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ09NTUFORFNfdG1wIHwgQ0ZHX0NNRF9IV0ZMT1cpCi0jZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCUNPTkZJR19DT01NQU5EU190bXAKKyNpZiAhZGVmaW5lZChVU0VfOTIwVF9NTVUpCisgICAgI3VuZGVmIENPTkZJR19DTURfQ0FDSEUKICNlbmRpZgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCiAjaWYgMApAQCAtMTE4LDcgKzEyNiw3IEBACiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkidGZ0cDsgYm9vdG0iCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTExNTIwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KIC8qIHdoYXQncyB0aGlzID8gaXQncyBub3QgdXNlZCBhbnl3aGVyZSAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMQkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvc21kazI0MTAuaCBiL2luY2x1ZGUvY29uZmlncy9zbWRrMjQxMC5oCmluZGV4IDdlZGVjMGQuLmNhNDA0ZmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zbWRrMjQxMC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9zbWRrMjQxMC5oCkBAIC03MiwyMiArNzIsMjYgQEAKIAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvbW1hbmQgZGVmaW5pdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgXAotCQkJKENPTkZJR19DTURfREZMCSB8IFwKLQkJCUNGR19DTURfQ0FDSEUJIHwgXAotCQkJLypDRkdfQ01EX05BTkQJIHwqLyBcCi0JCQkvKkNGR19DTURfRUVQUk9NIHwqLyBcCi0JCQkvKkNGR19DTURfSTJDCSB8Ki8gXAotCQkJLypDRkdfQ01EX1VTQgkgfCovIFwKLQkJCUNGR19DTURfUkVHSU5GTyAgfCBcCi0JCQlDRkdfQ01EX0RBVEUJIHwgXAotCQkJQ0ZHX0NNRF9FTEYpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKIC8qI2RlZmluZSBDT05GSUdfQk9PVEFSR1MgICAgCSJyb290PXJhbWZzIGRldmZzPW1vdW50IGNvbnNvbGU9dHR5U0EwLDk2MDAiICovCkBAIC05OCw3ICsxMDIsNyBAQAogLyojZGVmaW5lIENPTkZJR19CT09URklMRQkiZWxpbm9zLWxhcnQiICovCiAvKiNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJ0ZnRwOyBib290bSIgKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTExNTIwMAkJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KIC8qIHdoYXQncyB0aGlzID8gaXQncyBub3QgdXNlZCBhbnl3aGVyZSAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMQkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvc21tYWNvNC5oIGIvaW5jbHVkZS9jb25maWdzL3NtbWFjbzQuaAppbmRleCAxODVjMmQ0Li5hZDY4Yzc1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvc21tYWNvNC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9zbW1hY280LmgKQEAgLTQyLDExICs0Miw2IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290CSAgICAgKi8KIAotI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCi0jZW5kaWYKLQogLyoKICAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KICAqLwpAQCAtNjUsMzMgKzYwLDQxIEBACiAJCQkJIENGR19QT1NUX0kyQykKIAogI2lmZGVmIENPTkZJR19QT1NUCi0jZGVmaW5lIENGR19DTURfUE9TVF9ESUFHIENGR19DTURfRElBRwogLyogcHJlc2VydmUgc3BhY2UgZm9yIHRoZSBwb3N0X3dvcmQgYXQgZW5kIG9mIG9uLWNoaXAgU1JBTSAqLwogI2RlZmluZSBNUEM1WFhYX1NSQU1fUE9TVF9TSVpFIE1QQzVYWFhfU1JBTV9TSVpFLTQKLSNlbHNlCi0jZGVmaW5lIENGR19DTURfUE9TVF9ESUFHIDAKICNlbmRpZgogCi0vKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCi0gKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0VDSE8JfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9KRkZTMgl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9QT1NUX0RJQUcgfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPIHwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FQ0hPCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NOVFAKKworI2lmZGVmIENPTkZJR19QT1NUCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2VuZGlmCisKIAogI2RlZmluZQlDT05GSUdfVElNRVNUQU1QCQkvKiBkaXNwbGF5IGltYWdlIHRpbWVzdGFtcHMgKi8KIApAQCAtMzE5LDcgKzMyMiw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJICAgICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCkBAIC0zMzgsOSArMzQxLDEzIEBACiAKICNkZWZpbmUgQ0ZHX0haCQkJMTAwMAkvKiBkZWNyZW1lbnRlciBmcmVxOiAxIG1zIHRpY2tzICovCiAKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KKyNlbmRpZgorCiAvKgotICogRW5hYmxlIGxvb3B3IGNvbW1hbmRvLiBUaGlzIGhhcyBvbmx5IGFmZmVjdCwgaWYgQ0ZHX0NNRF9NRU0gaXMgZGVmaW5lZCwKLSAqIHdoaWNoIGlzIG5vcm1hbGx5IHBhcnQgb2YgdGhlIGRlZmF1bHQgY29tbWFuZHMgKENGVl9DTURfREZMKQorICogRW5hYmxlIGxvb3B3IGNvbW1hbmQuCiAgKi8KICNkZWZpbmUgQ09ORklHX0xPT1BXCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zb3JjZXJ5LmggYi9pbmNsdWRlL2NvbmZpZ3Mvc29yY2VyeS5oCmluZGV4IDQ5Mzc2MzguLmZlMDE0ZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zb3JjZXJ5LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3NvcmNlcnkuaApAQCAtMzksMTIgKzM5LDYgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkJMHgwMQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCQkweDAyCS8qIFNvZnR3YXJlIHJlYm9vdAkqLwogCi0jZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODIyMCBDUFVzICovCi0KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQotIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNSAgIAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwotI2VuZGlmCi0KIC8qCiAgKiBTZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCiAgKi8KQEAgLTY5LDMwICs2MywzNSBAQAogI2RlZmluZSBDT05GSUdfUENJX0NGR19QSFlTCUNPTkZJR19QQ0lfQ0ZHX0JVUwogI2RlZmluZSBDT05GSUdfUENJX0NGR19TSVpFCTB4MDEwMDAwMDAKIAorCiAvKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCisgKiBCT09UUCBvcHRpb25zCiAgKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9CT09URAl8IFwKLQkJCQlDRkdfQ01EX0NBQ0hFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RJQUcJfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTwl8IFwKLQkJCQlDRkdfQ01EX1NEUkFNCXwgXAotCQkJCUNGR19DTURfU05UUAl8IFwKLQkJCQkwKQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKIAotLyoJCQlDRkdfQ01EX01JSQl8IFwgKi8KLS8qCQkJICAgICAgIENGR19DTURfVVNCCXwgXCAqLwogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0JPT1RECisjZGVmaW5lIENPTkZJR19DTURfQ0FDSEUKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKIAogLyoKICAqIERlZmF1bHQgRW52aXJvbm1lbnQKQEAgLTI2OCw3ICsyNjcsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCSAgICAvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkgICAgLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJICAgIC8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJICAgIC8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yODQsNiArMjgzLDExIEBACiAKICNkZWZpbmUgQ0ZHX0haCQkJMTAwMAkgICAgLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcyAqLwogCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDODIyMCBDUFVzICovCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1ICAgCS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCisjZW5kaWYKKwogLyoKICAqIFZhcmlvdXMgbG93LWxldmVsIHNldHRpbmdzCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zcGMxOTIwLmggYi9pbmNsdWRlL2NvbmZpZ3Mvc3BjMTkyMC5oCmluZGV4IDA5YmJlYmQuLmI0YWI5YWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zcGMxOTIwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3NwYzE5MjAuaApAQCAtODAsMjQgKzgwLDMzIEBACiAjdW5kZWYJQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAjZGVmaW5lIENPTkZJR19CWklQMgkgLyogaW5jbHVkZSBzdXBwb3J0IGZvciBiemlwMiBjb21wcmVzc2VkIGltYWdlcyAqLwogCi0jaWZuZGVmIENPTkZJR19DT01NQU5EUwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMICAgXAotCQkJIHwgQ0ZHX0NNRF9BU0tFTlYgXAotCQkJIHwgQ0ZHX0NNRF9EQVRFIFwKLQkJCSB8IENGR19DTURfRUNITyAgIFwKLQkJCSB8IENGR19DTURfSU1NQVAgIFwKLQkJCSB8IENGR19DTURfSkZGUzIgXAotCQkJIHwgQ0ZHX0NNRF9QSU5HIFwKLQkJCSB8IENGR19DTURfREhDUCBcCi0JCQkgfCBDRkdfQ01EX0kyQyBcCi0JCQkgfCBDRkdfQ01EX01JSSkKLQkJCS8qICYgfiggQ0ZHX0NNRF9ORVQpKSAqLworCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCiAKLSNlbmRpZiAvKiAhQ09ORklHX0NPTU1BTkRTICovCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKyNkZWZpbmUgQ09ORklHX0NNRF9FQ0hPCisjZGVmaW5lIENPTkZJR19DTURfSU1NQVAKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisKKyN1bmRlZiBDT05GSUdfQ01EX05FVAorCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC0xMDcsNyArMTE2LDcgQEAKICNkZWZpbmUgQ0ZHX0hVU0hfUEFSU0VSCiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE5NCw3ICsyMDMsNyBAQAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogCi0jaWZkZWYgQ0ZHX0NNRF9EQVRFCisjaWZkZWYgQ09ORklHX0NNRF9EQVRFCiAjIGRlZmluZSBDT05GSUdfUlRDX0RTMzIzMQogIyBkZWZpbmUgQ0ZHX0kyQ19SVENfQUREUiAgICAgIDB4NjgKICNlbmRpZgpAQCAtMjAyLDcgKzIxMSw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBJMkMgY29uZmlndXJhdGlvbgogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSTJDKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JMkMpCiAvKiBlbmFibGUgSTJDIGFuZCBzZWxlY3QgdGhlIGhhcmR3YXJlL3NvZnR3YXJlIGRyaXZlciAqLwogI3VuZGVmIENPTkZJR19IQVJEX0kyQyAgICAgICAgICAgICAgICAgLyogSTJDIHdpdGggaGFyZHdhcmUgc3VwcG9ydCAgICAqLwogI2RlZmluZSBDT05GSUdfU09GVF9JMkMgICAgICAgICAgICAgICAgMSAgICAgICAvKiBJMkMgYml0LWJhbmdlZCAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvc3BpZXZhbC5oIGIvaW5jbHVkZS9jb25maWdzL3NwaWV2YWwuaAppbmRleCBmZDEzOGE1Li40YjYxOGYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvc3BpZXZhbC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9zcGlldmFsLmgKQEAgLTQ0LDExICs0NCw2IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290CSAgICAgKi8KIAotI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCi0jICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCi0jZW5kaWYKLQogLyoKICAqIFNlcmlhbCBjb25zb2xlIGNvbmZpZ3VyYXRpb24KICAqLwpAQCAtODgsMTIgKzgzLDYgQEAKICNkZWZpbmUgQ09ORklHX05TODM4MlgJCTEKICNlbmRpZgkvKiBDT05GSUdfU1RLNTJYWCAqLwogCi0jaWZkZWYgQ09ORklHX1BDSQotI2RlZmluZSBBRERfUENJX0NNRAkJQ0ZHX0NNRF9QQ0kKLSNlbHNlCi0jZGVmaW5lIEFERF9QQ0lfQ01ECQkwCi0jZW5kaWYKLQogLyoKICAqIFZpZGVvIGNvbnNvbGUKICAqLwpAQCAtMTEwLDEyICs5OSw2IEBACiAjZGVmaW5lIENGR19DT05TT0xFX0lTX0lOX0VOVgogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfVklERU8KLSNkZWZpbmUgQUREX0JNUF9DTUQJCUNGR19DTURfQk1QCi0jZWxzZQotI2RlZmluZSBBRERfQk1QX0NNRAkJMAotI2VuZGlmCi0KIC8qIFBhcnRpdGlvbnMgKi8KICNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KICNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KQEAgLTEyNCwxMCArMTA3LDcgQEAKIC8qIFVTQiAqLwogI2lmZGVmIENPTkZJR19TVEs1MlhYCiAjZGVmaW5lIENPTkZJR19VU0JfT0hDSQotI2RlZmluZSBBRERfVVNCX0NNRAkJQ0ZHX0NNRF9VU0IgfCBDRkdfQ01EX0ZBVAogI2RlZmluZSBDT05GSUdfVVNCX1NUT1JBR0UKLSNlbHNlCi0jZGVmaW5lIEFERF9VU0JfQ01ECQkwCiAjZW5kaWYKIAogLyogUE9TVCBzdXBwb3J0ICovCkBAIC0xMzYsNDMgKzExNiw2MCBAQAogCQkJCSBDRkdfUE9TVF9JMkMpCiAKICNpZmRlZiBDT05GSUdfUE9TVAotI2RlZmluZSBDRkdfQ01EX1BPU1RfRElBRyBDRkdfQ01EX0RJQUcKIC8qIHByZXNlcnZlIHNwYWNlIGZvciB0aGUgcG9zdF93b3JkIGF0IGVuZCBvZiBvbi1jaGlwIFNSQU0gKi8KICNkZWZpbmUgTVBDNVhYWF9TUkFNX1BPU1RfU0laRSBNUEM1WFhYX1NSQU1fU0laRS00Ci0jZWxzZQotI2RlZmluZSBDRkdfQ01EX1BPU1RfRElBRyAwCiAjZW5kaWYKIAotLyogSURFICovCi0jaWYgZGVmaW5lZCAoQ09ORklHX01JTklGQVApIHx8IGRlZmluZWQgKENPTkZJR19TVEs1MlhYKQotI2RlZmluZSBBRERfSURFX0NNRAkJKENGR19DTURfSURFIHwgQ0ZHX0NNRF9GQVQgfCBDRkdfQ01EX0VYVDIpCi0jZWxzZQotI2RlZmluZSBBRERfSURFX0NNRAkJMAotI2VuZGlmCiAKIC8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKKyAqIEJPT1RQIG9wdGlvbnMKICAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlBRERfQk1QX0NNRAl8IFwKLQkJCQlBRERfSURFX0NNRAl8IFwKLQkJCQlBRERfUENJX0NNRAl8IFwKLQkJCQlBRERfVVNCX0NNRAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRUNITwl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9QT1NUX0RJQUcgfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPIHwgXAotCQkJCUNGR19DTURfU05UUAkpCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9FQ0hPCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKKyNpZiBkZWZpbmVkKENPTkZJR19NSU5JRkFQKSB8fCBkZWZpbmVkKENPTkZJR19TVEs1MlhYKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyAgICAjZGVmaW5lIENPTkZJR19DTURfRkFUCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0VYVDIKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NUSzUyWFgKKyAgICAjZGVmaW5lIENPTkZJR19DTURfVVNCCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfVklERU8KKyAgICAjZGVmaW5lIENPTkZJR19DTURfQk1QCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQ0kKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QT1NUCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2VuZGlmCisKIAogI2RlZmluZQlDT05GSUdfVElNRVNUQU1QCQkvKiBkaXNwbGF5IGltYWdlIHRpbWVzdGFtcHMgKi8KIApAQCAtMjI2LDcgKzIyMyw3IEBACiAgKiBQQ0kgQnVzIGNsb2NraW5nIGNvbmZpZ3VyYXRpb24KICAqCiAgKiBBY3R1YWxseSBhIFBDSSBDbG9jayBvZiA2NiBNSHogaXMgb25seSBzZXQgKGluIGNwdV9pbml0LmMpIGlmCi0gKiBDRkdfSVBCQ0xLX0VRVUFMU19YTEJDTEsgaXMgZGVmaW5lZC4gVGhpcyBpcyBiZWNhdXNlIGEgUENJIENsb2NrIAorICogQ0ZHX0lQQkNMS19FUVVBTFNfWExCQ0xLIGlzIGRlZmluZWQuIFRoaXMgaXMgYmVjYXVzZSBhIFBDSSBDbG9jawogICogb2YgNjYgTUh6IHlldCBoYXNuJ3QgYmVlbiB0ZXN0ZWQgd2l0aCBhIElQQiBCdXMgQ2xvY2sgb2YgNjYgTUh6LgogICovCiAjZGVmaW5lIENGR19QQ0lDTEtfRVFVQUxTX0lQQkNMS19ESVYyCS8qIGRlZmluZSBmb3IgNjZNSHogc3BlZWQgKi8KQEAgLTQwNiw3ICs0MDMsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CSAgICAqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0ICAgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICAqLwpAQCAtNDI1LDkgKzQyMiwxMyBAQAogCiAjZGVmaW5lIENGR19IWgkJCTEwMDAJLyogZGVjcmVtZW50ZXIgZnJlcTogMSBtcyB0aWNrcyAqLwogCisjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiBGb3IgTVBDNXh4eCBDUFVzICovCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisjICBkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlICovCisjZW5kaWYKKwogLyoKLSAqIEVuYWJsZSBsb29wdyBjb21tYW5kby4gVGhpcyBoYXMgb25seSBhZmZlY3QsIGlmIENGR19DTURfTUVNIGlzIGRlZmluZWQsCi0gKiB3aGljaCBpcyBub3JtYWxseSBwYXJ0IG9mIHRoZSBkZWZhdWx0IGNvbW1hbmRzIChDRlZfQ01EX0RGTCkKKyAqIEVuYWJsZSBsb29wdyBjb21tYW5kLgogICovCiAjZGVmaW5lIENPTkZJR19MT09QVwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvc3R4Z3AzLmggYi9pbmNsdWRlL2NvbmZpZ3Mvc3R4Z3AzLmgKaW5kZXggNjI1Y2YyMC4uMWY0MWNmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3N0eGdwMy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9zdHhncDMuaApAQCAtMjMwLDEwICsyMzAsMTAgQEAKIAogI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudAkJKi8KIAotI2RlZmluZSBDT05GSUdfTVBDODVYWF9UU0VDMQkxCi0jZGVmaW5lIENPTkZJR19NUEM4NVhYX1RTRUMxX05BTUUJIlRTRUMwIgotI2RlZmluZSBDT05GSUdfTVBDODVYWF9UU0VDMgkxCi0jZGVmaW5lIENPTkZJR19NUEM4NVhYX1RTRUMyX05BTUUJIlRTRUMxIgorI2RlZmluZSBDT05GSUdfVFNFQzEJMQorI2RlZmluZSBDT05GSUdfVFNFQzFfTkFNRQkiVFNFQzAiCisjZGVmaW5lIENPTkZJR19UU0VDMgkxCisjZGVmaW5lIENPTkZJR19UU0VDMl9OQU1FCSJUU0VDMSIKICN1bmRlZiBDT05GSUdfTVBTODVYWF9GRUMKIAogI2RlZmluZSBUU0VDMV9QSFlfQUREUgkJMgpAQCAtMjk4LDM0ICsyOTgsMzggQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQJKi8KICNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlCSovCiAKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisKICNpZiBkZWZpbmVkKENGR19SQU1CT09UKQotICAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUENJIHwgXAotCQkJCUNGR19DTURfUElORyB8IENGR19DTURfSTJDKSAmIFwKLQkJCQkgfihDRkdfQ01EX0VOViB8IFwKLQkJCQkgIENGR19DTURfTE9BRFMgKSkKLSAgI2VsaWYgZGVmaW5lZChDT05GSUdfVFNFQ19FTkVUKQotICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKChDT05GSUdfQ01EX0RGTCB8IENGR19DTURfUElORyB8IFwKLQkJCQlDRkdfQ01EX01JSSB8IENGR19DTURfSTJDICkgJiBcCi0JCQkJfihDRkdfQ01EX0VOVikpCi0gICNlbGlmIGRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZDQykKLSAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX01JSSB8IFwKLQkJCQlDRkdfQ01EX1BJTkcgfCBDRkdfQ01EX0kyQykgJiBcCi0JCQkJfihDRkdfQ01EX0VOVikpCi0gICNlbmRpZgorICAgICN1bmRlZiBDT05GSUdfQ01EX0VOVgorICAgICN1bmRlZiBDT05GSUdfQ01EX0xPQURTCiAjZWxzZQotICAjaWYgZGVmaW5lZChDT05GSUdfUENJKQotICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QQ0kgfCBcCi0JCQkJQ0ZHX0NNRF9FTEYgfCBDRkdfQ01EX1BJTkcgfCBDRkdfQ01EX0kyQykKLSAgI2VsaWYgZGVmaW5lZChDT05GSUdfVFNFQ19FTkVUKQotICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QSU5HIHwgXAotCQkJCUNGR19DTURfRUxGIHwgQ0ZHX0NNRF9NSUkgfCBDRkdfQ01EX0kyQykKLSAgI2VsaWYgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkNDKQotICAjZGVmaW5lICBDT05GSUdfQ09NTUFORFMJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9NSUkgfCBcCi0JCQkJQ0ZHX0NNRF9FTEYgfCBDRkdfQ01EX1BJTkcgfCBDRkdfQ01EX0kyQykKLSAgI2VuZGlmCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0VMRgogI2VuZGlmCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19UU0VDX0VORVQpIHx8IGRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZDQykKKyAgICAjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZW5kaWYKKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTMzNCw3ICszMzgsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSJHUFBQPT4gIgkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0zNTUsNyArMzU5LDcgQEAKIC8qIENhY2hlIENvbmZpZ3VyYXRpb24gKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkzMjc2OAogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCkBAIC0zNjcsNyArMzcxLDcgQEAKICNkZWZpbmUgQk9PVEZMQUdfQ09MRAkweDAxCQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLwogI2RlZmluZSBCT09URkxBR19XQVJNCTB4MDIJCS8qIFNvZnR3YXJlIHJlYm9vdAkJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3N0eHNzYS5oIGIvaW5jbHVkZS9jb25maWdzL3N0eHNzYS5oCmluZGV4IDE5NzhhMzIuLjU1ZTJjOGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy9zdHhzc2EuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvc3R4c3NhLmgKQEAgLTQyLDIwICs0MiwyMCBAQAogI2RlZmluZSBDT05GSUdfQ1BNMgkJMQkvKiBoYXMgQ1BNMiAqLwogI2RlZmluZSBDT05GSUdfU1RYU1NBCQkxCS8qIFNpbGljb24gVHggR1BQUCBTU0EgYm9hcmQgc3BlY2lmaWMqLwogCi0jdW5kZWYgIENPTkZJR19QQ0kJICAgICAgICAgCS8qIHBjaSBldGhlcm5ldCBzdXBwb3J0CSovCi0jZGVmaW5lIENPTkZJR19UU0VDX0VORVQgCQkvKiB0c2VjIGV0aGVybmV0IHN1cHBvcnQqLwotI3VuZGVmIENPTkZJR19FVEhFUl9PTl9GQ0MgICAgICAgICAgICAgLyogY3BtIEZDQyBldGhlcm5ldCBzdXBwb3J0ICovCisjZGVmaW5lIENPTkZJR19QQ0kJCQkvKiBQQ0kgZXRoZXJuZXQgc3VwcG9ydAkqLworI2RlZmluZSBDT05GSUdfVFNFQ19FTkVUCQkvKiB0c2VjIGV0aGVybmV0IHN1cHBvcnQqLworI3VuZGVmIENPTkZJR19FVEhFUl9PTl9GQ0MJCS8qIGNwbSBGQ0MgZXRoZXJuZXQgc3VwcG9ydCAqLwogI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQotI2RlZmluZSBDT05GSUdfU1BEX0VFUFJPTSAgICAgICAgICAgICAgIC8qIFVzZSBTUEQgRUVQUk9NIGZvciBERFIgc2V0dXAgKi8KLSN1bmRlZiAgQ09ORklHX0REUl9FQ0MJCQkvKiBvbmx5IGZvciBFQ0MgRERSIG1vZHVsZSAqLwotI3VuZGVmIENPTkZJR19ERFJfRExMICAgICAgICAgICAgICAgICAgLyogcG9zc2libGUgRExMIGZpeCBuZWVkZWQgKi8KKyNkZWZpbmUgQ09ORklHX1NQRF9FRVBST00JCS8qIFVzZSBTUEQgRUVQUk9NIGZvciBERFIgc2V0dXAgKi8KKyN1bmRlZglDT05GSUdfRERSX0VDQwkJCS8qIG9ubHkgZm9yIEVDQyBERFIgbW9kdWxlICovCisjdW5kZWYgQ09ORklHX0REUl9ETEwJCQkvKiBwb3NzaWJsZSBETEwgZml4IG5lZWRlZCAqLwogI2RlZmluZSBDT05GSUdfRERSXzJUX1RJTUlORwkJLyogU2V0cyB0aGUgMlQgdGltaW5nIGJpdCAqLwogCiAKIC8qIHN5c2NsayBmb3IgTVBDODV4eAogICovCiAKLSNkZWZpbmUgQ09ORklHX1NZU19DTEtfRlJFUSAgICAgMzMwMDAwMDAgLyogbW9zdCBwY2kgY2FyZHMgYXJlIDMzTWh6ICovCisjZGVmaW5lIENPTkZJR19TWVNfQ0xLX0ZSRVEJMzMwMDAwMDAgLyogbW9zdCBwY2kgY2FyZHMgYXJlIDMzTWh6ICovCiAKIC8qIEJsaW5raW4nIExFRHMgZm9yIFJvYmVydCA6LSkKICovCkBAIC02NCwyMyArNjQsMjMgQEAKIC8qCiAgKiBUaGVzZSBjYW4gYmUgdG9nZ2xlZCBmb3IgcGVyZm9ybWFuY2UgYW5hbHlzaXMsIG90aGVyd2lzZSB1c2UgZGVmYXVsdC4KICAqLwotI2RlZmluZSBDT05GSUdfTDJfQ0FDSEUgICAgICAgICAgICAgICAgICAgICAvKiB0b2dnbGUgTDIgY2FjaGUgICAgICAgICAqLwotI2RlZmluZSAgQ09ORklHX0JUQiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdG9nZ2xlIGJyYW5jaCBwcmVkaXRpb24gKi8KLSNkZWZpbmUgIENPTkZJR19BRERSX1NUUkVBTUlORyAgICAgICAgICAgICAgIC8qIHRvZ2dsZSBhZGRyIHN0cmVhbWluZyAgICovCisjZGVmaW5lIENPTkZJR19MMl9DQUNIRQkJCQkvKiB0b2dnbGUgTDIgY2FjaGUJICAgICAgICovCisjZGVmaW5lICBDT05GSUdfQlRCCQkJCS8qIHRvZ2dsZSBicmFuY2ggcHJlZGl0aW9uICovCisjZGVmaW5lICBDT05GSUdfQUREUl9TVFJFQU1JTkcJCQkvKiB0b2dnbGUgYWRkciBzdHJlYW1pbmcJKi8KIAotI2RlZmluZSBDT05GSUdfQk9BUkRfRUFSTFlfSU5JVF9GICAgMSAgICAgICAgLyogQ2FsbCBib2FyZF9wcmVfaW5pdCAgICAgICovCisjZGVmaW5lIENPTkZJR19CT0FSRF9FQVJMWV9JTklUX0YgICAxCSAgICAgCS8qIENhbGwgYm9hcmRfcHJlX2luaXQJICovCiAKLSN1bmRlZiAgQ0ZHX0RSQU1fVEVTVCAgICAgICAgICAgICAgICAgICAgICAgLyogbWVtb3J5IHRlc3QsIHRha2VzIHRpbWUgICovCi0jZGVmaW5lIENGR19NRU1URVNUX1NUQVJUICAgICAgIDB4MDAyMDAwMDAgIC8qIG1lbXRlc3QgcmVnaW9uICovCi0jZGVmaW5lIENGR19NRU1URVNUX0VORCAgICAgICAgIDB4MDA0MDAwMDAKKyN1bmRlZglDRkdfRFJBTV9URVNUCQkJICAgIAkvKiBtZW1vcnkgdGVzdCwgdGFrZXMgdGltZQkqLworI2RlZmluZSBDRkdfTUVNVEVTVF9TVEFSVAkweDAwMjAwMDAwICAJLyogbWVtdGVzdCByZWdpb24gKi8KKyNkZWZpbmUgQ0ZHX01FTVRFU1RfRU5ECQkweDAwNDAwMDAwCiAKIAotLyogTG9jYWxidXMgY29ubmVjdG9yLiAgVGhlcmUgYXJlIG1hbnkgb3B0aW9ucyB0aGF0IGNhbiBiZQorLyogTG9jYWxidXMgY29ubmVjdG9yLglUaGVyZSBhcmUgbWFueSBvcHRpb25zIHRoYXQgY2FuIGJlCiAgKiBjb25uZWN0ZWQgaGVyZSwgaW5jbHVkaW5nIHNkcmFtIG9yIGxvdHMgb2YgZmxhc2guCiAgKiBUaGlzIGFkZHJlc3MsIGhvd2V2ZXIsIGlzIHVzZWQgdG8gY29uZmlndXJlIGEgMjU2TSBsb2NhbCBidXMKICAqIHdpbmRvdyB0aGF0IGluY2x1ZGVzIHRoZSBDb25maWcgbGF0Y2ggYmVsb3cuCiAgKi8KLSNkZWZpbmUgQ0ZHX0xCQ19PUFRJT05fQkFTRQkweEYwMDAwMDAwICAgICAgLyogTG9jYWxidXMgRXh0ZW5zaW9uICovCisjZGVmaW5lIENGR19MQkNfT1BUSU9OX0JBU0UJMHhGMDAwMDAwMAkvKiBMb2NhbGJ1cyBFeHRlbnNpb24gKi8KICNkZWZpbmUgQ0ZHX0xCQ19PUFRJT05fU0laRQkyNTYJCS8qIDI1Nk1CICovCiAKIC8qIFRoZXJlIGFyZSB2YXJpb3VzIGZsYXNoIG9wdGlvbnMgdXNlZCwgd2UgY29uZmlndXJlIGZvciB0aGUgbGFyZ2VzdCwKQEAgLTg4LDE2ICs4OCwxNiBAQAogICogc2l6ZXMuCiAgKi8KICNpZmRlZiBDT05GSUdfU1RYU1NBXzRNCi0jZGVmaW5lIENGR19GTEFTSF9CQVNFCQkweEZGQzAwMDAwICAgICAgLyogc3RhcnQgb2YgIDQgTWlCIGZsYXNoICovCisjZGVmaW5lIENGR19GTEFTSF9CQVNFCQkweEZGQzAwMDAwCS8qIHN0YXJ0IG9mICA0IE1pQiBmbGFzaCAqLwogI2Vsc2UKLSNkZWZpbmUgQ0ZHX0ZMQVNIX0JBU0UJCTB4RkMwMDAwMDAgICAgICAvKiBzdGFydCBvZiA2NCBNaUIgZmxhc2ggKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX0JBU0UJCTB4RkMwMDAwMDAJLyogc3RhcnQgb2YgNjQgTWlCIGZsYXNoICovCiAjZW5kaWYKICNkZWZpbmUgQ0ZHX0JSMF9QUkVMSU0JKENGR19GTEFTSF9CQVNFIHwgMHgxODAxKSAvKiBwb3J0IHNpemUgMzJiaXQJICovCiAjZGVmaW5lIENGR19PUjBfUFJFTElNCShDRkdfRkxBU0hfQkFTRSB8IDB4MEZGNykKIAogI2RlZmluZSBDRkdfRkxBU0hfQ0ZJCQkxCiAjZGVmaW5lIENGR19GTEFTSF9DRklfRFJJVkVSCTEKLSN1bmRlZiBDRkdfRkxBU0hfVVNFX0JVRkZFUl9XUklURSAJLyogdXNlIGJ1ZmZlcmVkIHdyaXRlcyAoMjB4IGZhc3RlcikgKi8KKyN1bmRlZiBDRkdfRkxBU0hfVVNFX0JVRkZFUl9XUklURQkvKiB1c2UgYnVmZmVyZWQgd3JpdGVzICgyMHggZmFzdGVyKSAqLwogI2RlZmluZSBDRkdfTUFYX0ZMQVNIX1NFQ1QJMjU2CS8qIG1heCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcCAqLwogI2RlZmluZSBDRkdfTUFYX0ZMQVNIX0JBTktTCTEJLyogbWF4IG51bWJlciBvZiBtZW1vcnkgYmFua3MJKi8KIApAQCAtMTEwLDIyICsxMTAsMjIgQEAKICAqLwogI2RlZmluZSBDRkdfTEJDX0NGR0xBVENIX0JBU0UJMHhGQjAwMDAwMAkvKiBCYXNlIG9mIGNvbmZpZyBsYXRjaCAqLwogI2RlZmluZSBDRkdfQlIxX1BSRUxJTQkJMHhGQjAwMTgwMQkvKiAzMi1iaXQgcG9ydCAqLwotI2RlZmluZSBDRkdfT1IxX1BSRUxJTQkJMHhGRkZGMEZGNyAgICAgIC8qIDY0SyBpcyBlbm91Z2ggKi8KKyNkZWZpbmUgQ0ZHX09SMV9QUkVMSU0JCTB4RkZGRjBGRjcJLyogNjRLIGlzIGVub3VnaCAqLwogCi0jZGVmaW5lIENGR19NT05JVE9SX0JBU0UgICAgCVRFWFRfQkFTRQkvKiBzdGFydCBvZiBtb25pdG9yCSovCisjZGVmaW5lIENGR19NT05JVE9SX0JBU0UJVEVYVF9CQVNFCS8qIHN0YXJ0IG9mIG1vbml0b3IJKi8KIAogI2lmIChDRkdfTU9OSVRPUl9CQVNFIDwgQ0ZHX0ZMQVNIX0JBU0UpCiAjZGVmaW5lIENGR19SQU1CT09UCiAjZWxzZQotI3VuZGVmICBDRkdfUkFNQk9PVAorI3VuZGVmCUNGR19SQU1CT09UCiAjZW5kaWYKIAogI2lmZGVmIENGR19SQU1CT09UCi0jZGVmaW5lIENGR19DQ1NSQkFSX0RFRkFVTFQgCTB4NDAwMDAwMDAJLyogQ0NTUkJBUiBieSBCREkgY2ZnCSovCisjZGVmaW5lIENGR19DQ1NSQkFSX0RFRkFVTFQJMHg0MDAwMDAwMAkvKiBDQ1NSQkFSIGJ5IEJESSBjZmcJKi8KICNlbHNlCi0jZGVmaW5lIENGR19DQ1NSQkFSX0RFRkFVTFQgCTB4ZmY3MDAwMDAJLyogQ0NTUkJBUiBEZWZhdWx0CSovCisjZGVmaW5lIENGR19DQ1NSQkFSX0RFRkFVTFQJMHhmZjcwMDAwMAkvKiBDQ1NSQkFSIERlZmF1bHQJKi8KICNlbmRpZgotI2RlZmluZSBDRkdfQ0NTUkJBUiAgICAgICAgICAgICAweGUwMDAwMDAwICAgICAgLyogcmVsb2NhdGVkIENDU1JCQVIgICAgKi8KKyNkZWZpbmUgQ0ZHX0NDU1JCQVIJCTB4ZTAwMDAwMDAJLyogcmVsb2NhdGVkIENDU1JCQVIJKi8KICNkZWZpbmUgQ0ZHX0lNTVIJCUNGR19DQ1NSQkFSCS8qIFBRSUkgdXNlcyBDRkdfSU1NUgkqLwogCiAKQEAgLTE0MCwxNCArMTQwLDE0IEBACiAjZGVmaW5lIENGR19ERFJfU0RSQU1fQkFTRQkweDAwMDAwMDAwCS8qIEREUiBpcyBzeXN0ZW0gbWVtb3J5ICAqLwogI2RlZmluZSBDRkdfU0RSQU1fQkFTRQkJQ0ZHX0REUl9TRFJBTV9CQVNFCiAKLSNkZWZpbmUgU1BEX0VFUFJPTV9BRERSRVNTIAkweDU0ICAgICAJLyogIEREUiBESU1NICovCisjZGVmaW5lIFNQRF9FRVBST01fQUREUkVTUwkweDU0CQkvKiAgRERSIERJTU0gKi8KIAogI3VuZGVmIENPTkZJR19DTE9DS1NfSU5fTUhaCiAKIC8qIGxvY2FsIGJ1cyBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBDRkdfQlIyX1BSRUxJTQkJMHhmODAwMTg2MQkvKiA2NE1CIGxvY2FsYnVzIFNEUkFNICAqLworI2RlZmluZSBDRkdfQlIyX1BSRUxJTQkJMHhmODAwMTg2MQkvKiA2NE1CIGxvY2FsYnVzIFNEUkFNCSovCiAjZGVmaW5lIENGR19PUjJfUFJFTElNCQkweGZjMDA2OTAxCi0jZGVmaW5lIENGR19MQkNfTENSUgkJMHgwMDAzMDAwNAkvKiBsb2NhbCBidXMgZnJlcSAJKi8KKyNkZWZpbmUgQ0ZHX0xCQ19MQ1JSCQkweDAwMDMwMDA0CS8qIGxvY2FsIGJ1cyBmcmVxCSovCiAjZGVmaW5lIENGR19MQkNfTEJDUgkJMHgwMDAwMDAwMAogI2RlZmluZSBDRkdfTEJDX0xTUlQJCTB4MjAwMDAwMDAKICNkZWZpbmUgQ0ZHX0xCQ19NUlRQUgkJMHgyMDAwMDAwMApAQCAtMTU4LDUyICsxNTgsNTIgQEAKICNkZWZpbmUgQ0ZHX0xCQ19MU0RNUl81CQkweDQwNjFiNzIzCiAKICNkZWZpbmUgQ09ORklHX0wxX0lOSVRfUkFNCi0jZGVmaW5lIENGR19JTklUX1JBTV9MT0NLIAkxCi0jZGVmaW5lIENGR19JTklUX1JBTV9BRERSICAgICAgIDB4NjAwMDAwMDAgICAgICAvKiBJbml0aWFsIFJBTSBhZGRyZXNzICAqLwotI2RlZmluZSBDRkdfSU5JVF9SQU1fRU5EICAgIAkweDQwMDAJICAgIAkvKiBFbmQgb2YgdXNlZCBhcmVhIGluIFJBTSAqLworI2RlZmluZSBDRkdfSU5JVF9SQU1fTE9DSwkxCisjZGVmaW5lIENGR19JTklUX1JBTV9BRERSCTB4NjAwMDAwMDAJLyogSW5pdGlhbCBSQU0gYWRkcmVzcwkqLworI2RlZmluZSBDRkdfSU5JVF9SQU1fRU5ECTB4NDAwMAkJLyogRW5kIG9mIHVzZWQgYXJlYSBpbiBSQU0gKi8KIAotI2RlZmluZSBDRkdfR0JMX0RBVEFfU0laRSAgCTEyOAkJLyogbnVtIGJ5dGVzIGluaXRpYWwgZGF0YSAqLworI2RlZmluZSBDRkdfR0JMX0RBVEFfU0laRQkxMjgJCS8qIG51bSBieXRlcyBpbml0aWFsIGRhdGEgKi8KICNkZWZpbmUgQ0ZHX0dCTF9EQVRBX09GRlNFVAkoQ0ZHX0lOSVRfUkFNX0VORCAtIENGR19HQkxfREFUQV9TSVpFKQogI2RlZmluZSBDRkdfSU5JVF9TUF9PRkZTRVQJQ0ZHX0dCTF9EQVRBX09GRlNFVAogCi0jZGVmaW5lIENGR19NT05JVE9SX0xFTgkgICAgCSgyNTYgKiAxMDI0KSAgICAvKiBSZXNlcnZlIDI1NiBrQiBmb3IgTW9uICovCi0jZGVmaW5lIENGR19NQUxMT0NfTEVOCSAgICAJKDUxMiAqIDEwMjQpICAgIC8qIFJlc2VydmVkIGZvciBtYWxsb2MgKi8KKyNkZWZpbmUgQ0ZHX01PTklUT1JfTEVOCQkoMjU2ICogMTAyNCkJLyogUmVzZXJ2ZSAyNTYga0IgZm9yIE1vbiAqLworI2RlZmluZSBDRkdfTUFMTE9DX0xFTgkJKDUxMiAqIDEwMjQpCS8qIFJlc2VydmVkIGZvciBtYWxsb2MgKi8KIAogLyogU2VyaWFsIFBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVggICAgIDIKICN1bmRlZglDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8KICNkZWZpbmUgQ0ZHX05TMTY1NTAKICNkZWZpbmUgQ0ZHX05TMTY1NTBfU0VSSUFMCi0jZGVmaW5lIENGR19OUzE2NTUwX1JFR19TSVpFICAgIDEKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfUkVHX1NJWkUJMQogI2RlZmluZSBDRkdfTlMxNjU1MF9DTEsJCWdldF9idXNfZnJlcSgwKQogCiAjZGVmaW5lIENGR19CQVVEUkFURV9UQUJMRSAgXAogCXszMDAsIDYwMCwgMTIwMCwgMjQwMCwgNDgwMCwgOTYwMCwgMTkyMDAsIDM4NDAwLCAxMTUyMDB9CiAKLSNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMSAgICAgICAgKENGR19DQ1NSQkFSKzB4NDUwMCkKLSNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMiAgICAgICAgKENGR19DQ1NSQkFSKzB4NDYwMCkKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMQkoQ0ZHX0NDU1JCQVIrMHg0NTAwKQorI2RlZmluZSBDRkdfTlMxNjU1MF9DT00yCShDRkdfQ0NTUkJBUisweDQ2MDApCiAKICNkZWZpbmUgQ09ORklHX0NNRExJTkVfRURJVElORwkxCS8qIGFkZCBjb21tYW5kIGxpbmUgaGlzdG9yeQkqLwogI2RlZmluZSBDRkdfSFVTSF9QQVJTRVIJCTEJLyogVXNlIHRoZSBIVVNIIHBhcnNlcgkJKi8KLSNpZmRlZiAgQ0ZHX0hVU0hfUEFSU0VSCisjaWZkZWYJQ0ZHX0hVU0hfUEFSU0VSCiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIgIj4gIgogI2VuZGlmCiAKIC8qIEkyQyAqLwogI2RlZmluZSBDT05GSUdfRlNMX0kyQwkJCS8qIFVzZSBGU0wgY29tbW9uIEkyQyBkcml2ZXIgKi8KLSNkZWZpbmUgIENPTkZJR19IQVJEX0kyQyAgICAJCS8qIEkyQyB3aXRoIGhhcmR3YXJlIHN1cHBvcnQqLworI2RlZmluZSAgQ09ORklHX0hBUkRfSTJDCQkvKiBJMkMgd2l0aCBoYXJkd2FyZSBzdXBwb3J0Ki8KICN1bmRlZglDT05GSUdfU09GVF9JMkMJCQkvKiBJMkMgYml0LWJhbmdlZCAqLwogI2RlZmluZSBDRkdfSTJDX1NQRUVECQk0MDAwMDAJLyogSTJDIHNwZWVkIGFuZCBzbGF2ZSBhZGRyZXNzCSovCiAjZGVmaW5lIENGR19JMkNfU0xBVkUJCTB4N0YKICNpZiAwCi0jZGVmaW5lIENGR19JMkNfTk9QUk9CRVMgICAgICAgIHsweDAwfSAgLyogRG9uJ3QgcHJvYmUgdGhlc2UgYWRkcnMgKi8KKyNkZWZpbmUgQ0ZHX0kyQ19OT1BST0JFUwl7MHgwMH0JLyogRG9uJ3QgcHJvYmUgdGhlc2UgYWRkcnMgKi8KICNlbHNlCiAvKiBJIGRpZCB0aGUgJ2lmIDAnIHNvIHdlIGNvdWxkIGtlZXAgdGhlIHN5bnRheCBhYm92ZSBpZiBldmVyIG5lZWRlZC4gKi8KICN1bmRlZiBDRkdfSTJDX05PUFJPQkVTCiAjZW5kaWYKICNkZWZpbmUgQ0ZHX0kyQ19PRkZTRVQJCTB4MzAwMAogCi0vKiBJMkMgRUVQUk9NLiAgQVQyNEMzMiwgd2Uga2VlcCBvdXIgZW52aXJvbm1lbnQgaW4gaGVyZS4KKy8qIEkyQyBFRVBST00uCUFUMjRDMzIsIHdlIGtlZXAgb3VyIGVudmlyb25tZW50IGluIGhlcmUuCiAqLwogI2RlZmluZSBDRkdfSTJDX0VFUFJPTV9BRERSCQkweDUxCS8qIDEwMTAwMDF4CQkqLwogI2RlZmluZSBDRkdfSTJDX0VFUFJPTV9BRERSX0xFTgkJMgpAQCAtMjMyLDM1ICsyMzIsMzUgQEAKICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpIAkJLyogUENJIEV0aGVybmV0IGNhcmQgKi8KIAogI2RlZmluZSBDT05GSUdfTkVUX01VTFRJCi0jZGVmaW5lIENPTkZJR19QQ0lfUE5QCSAgICAgICAgICAgICAgIAkvKiBkbyBwY2kgcGx1Zy1hbmQtcGxheSAqLworI2RlZmluZSBDT05GSUdfUENJX1BOUAkJCS8qIGRvIHBjaSBwbHVnLWFuZC1wbGF5ICovCiAKLSN1bmRlZiBDT05GSUdfRUVQUk8xMDAKLSN1bmRlZiBDT05GSUdfVFVMSVAKKyNkZWZpbmUgQ09ORklHX0VFUFJPMTAwCisjZGVmaW5lIENPTkZJR19UVUxJUAogCiAjaWYgIWRlZmluZWQoQ09ORklHX1BDSV9QTlApCi0gICNkZWZpbmUgUENJX0VORVQwX0lPQUREUiAgICAJMHhlMDAwMDAwMAotICAjZGVmaW5lIFBDSV9FTkVUMF9NRU1BRERSICAgICAweGUwMDAwMDAwCi0gICNkZWZpbmUgUENJX0lEU0VMX05VTUJFUiAgICAgIDB4MGMgCS8qIHNsb3QwLT4zKElEU0VMKT0xMi0+MTUgKi8KKyAgI2RlZmluZSBQQ0lfRU5FVDBfSU9BRERSCTB4ZTAwMDAwMDAKKyAgI2RlZmluZSBQQ0lfRU5FVDBfTUVNQUREUgkweGUwMDAwMDAwCisgICNkZWZpbmUgUENJX0lEU0VMX05VTUJFUgkweDBjCS8qIHNsb3QwLT4zKElEU0VMKT0xMi0+MTUgKi8KICNlbmRpZgogCi0jdW5kZWYgQ09ORklHX1BDSV9TQ0FOX1NIT1cKLSNkZWZpbmUgQ0ZHX1BDSV9TVUJTWVNfVkVORE9SSUQgMHgxMDU3ICAvKiBNb3Rvcm9sYSAqLworI2RlZmluZSBDT05GSUdfUENJX1NDQU5fU0hPVworI2RlZmluZSBDRkdfUENJX1NVQlNZU19WRU5ET1JJRCAweDEwNTcJLyogTW90b3JvbGEgKi8KIAogI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KIAogI2lmIGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkKIAogI2lmbmRlZiBDT05GSUdfTkVUX01VTFRJCi0jZGVmaW5lIENPTkZJR19ORVRfTVVMVEkgCTEKKyNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQkxCiAjZW5kaWYKIAogI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudAkJKi8KIAotI2RlZmluZSBDT05GSUdfTVBDODVYWF9UU0VDMQkxCi0jZGVmaW5lIENPTkZJR19NUEM4NVhYX1RTRUMxX05BTUUJIlRTRUMwIgotI2RlZmluZSBDT05GSUdfTVBDODVYWF9UU0VDMgkxCi0jZGVmaW5lIENPTkZJR19NUEM4NVhYX1RTRUMyX05BTUUJIlRTRUMxIgotI3VuZGVmIENPTkZJR19NUFM4NVhYX0ZFQworI2RlZmluZSBDT05GSUdfVFNFQzEJMQorI2RlZmluZSBDT05GSUdfVFNFQzFfTkFNRQkiVFNFQzAiCisjZGVmaW5lIENPTkZJR19UU0VDMgkxCisjZGVmaW5lIENPTkZJR19UU0VDMl9OQU1FCSJUU0VDMSIKKyNkZWZpbmUgQ09ORklHX01QUzg1WFhfRkVDCiAKICNkZWZpbmUgVFNFQzFfUEhZX0FERFIJCTIKICNkZWZpbmUgVFNFQzJfUEhZX0FERFIJCTQKQEAgLTI3MCw5ICsyNzAsOSBAQAogCiAjZWxpZiBkZWZpbmVkKENPTkZJR19FVEhFUl9PTl9GQ0MpCS8qIENQTSBGQ0MgRXRoZXJuZXQgKi8KIAotI2RlZmluZSBDT05GSUdfRVRIRVJfT05fRkNDMiAgICAgICAgICAgICAvKiBkZWZpbmUgaWYgZXRoZXIgb24gRkNDICAgKi8KLSN1bmRlZiAgQ09ORklHX0VUSEVSX05PTkUgICAgICAgICAgICAgICAvKiBkZWZpbmUgaWYgZXRoZXIgb24gc29tZXRoaW5nIGVsc2UgKi8KLSNkZWZpbmUgQ09ORklHX0VUSEVSX0lOREVYICAgICAgMiAgICAgICAvKiB3aGljaCBjaGFubmVsIGZvciBldGhlciAgKi8KKyNkZWZpbmUgQ09ORklHX0VUSEVSX09OX0ZDQzIJCS8qIGRlZmluZSBpZiBldGhlciBvbiBGQ0MgICAqLworI3VuZGVmCUNPTkZJR19FVEhFUl9OT05FCQkvKiBkZWZpbmUgaWYgZXRoZXIgb24gc29tZXRoaW5nIGVsc2UgKi8KKyNkZWZpbmUgQ09ORklHX0VUSEVSX0lOREVYCTIJLyogd2hpY2ggY2hhbm5lbCBmb3IgZXRoZXIgICovCiAKICNpZiAoQ09ORklHX0VUSEVSX0lOREVYID09IDIpCiAgIC8qCkBAIC0yODEsMTkgKzI4MSwxOSBAQAogICAgKiAtIFNlbGVjdCBidXMgZm9yIGJkL2J1ZmZlcnMKICAgICogLSBGdWxsIGR1cGxleAogICAgKi8KLSAgI2RlZmluZSBDRkdfQ01YRkNSX01BU0sgICAgICAgKENNWEZDUl9GQzIgfCBDTVhGQ1JfUkYyQ1NfTVNLIHwgQ01YRkNSX1RGMkNTX01TSykKLSAgI2RlZmluZSBDRkdfQ01YRkNSX1ZBTFVFICAgICAgKENNWEZDUl9SRjJDU19DTEsxMyB8IENNWEZDUl9URjJDU19DTEsxNCkKLSAgI2RlZmluZSBDRkdfQ1BNRkNSX1JBTVRZUEUgICAgMAorICAjZGVmaW5lIENGR19DTVhGQ1JfTUFTSwkoQ01YRkNSX0ZDMiB8IENNWEZDUl9SRjJDU19NU0sgfCBDTVhGQ1JfVEYyQ1NfTVNLKQorICAjZGVmaW5lIENGR19DTVhGQ1JfVkFMVUUJKENNWEZDUl9SRjJDU19DTEsxMyB8IENNWEZDUl9URjJDU19DTEsxNCkKKyAgI2RlZmluZSBDRkdfQ1BNRkNSX1JBTVRZUEUJMAogI2lmIDAKLSAgI2RlZmluZSBDRkdfRkNDX1BTTVIgICAgICAgICAgKEZDQ19QU01SX0ZERSkKKyAgI2RlZmluZSBDRkdfRkNDX1BTTVIJCShGQ0NfUFNNUl9GREUpCiAjZWxzZQotICAjZGVmaW5lIENGR19GQ0NfUFNNUiAgICAgICAgICAwCisgICNkZWZpbmUgQ0ZHX0ZDQ19QU01SCQkwCiAjZW5kaWYKICAgI2RlZmluZSBGRVRIMl9SU1QJCTB4MDEKICNlbGlmIChDT05GSUdfRVRIRVJfSU5ERVggPT0gMykKICAgLyogbmVlZCBtb3JlIGRlZmluaXRpb25zIGhlcmUgZm9yIEZFMyAqLwogICAjZGVmaW5lIEZFVEgzX1JTVAkJMHg4MAotI2VuZGlmICAJCQkJLyogQ09ORklHX0VUSEVSX0lOREVYICovCisjZW5kaWYJCQkJCS8qIENPTkZJR19FVEhFUl9JTkRFWCAqLwogCiAvKiBNRElPIGlzIGRvbmUgdGhyb3VnaCB0aGUgVFNFQzAgY29udHJvbC4KICovCkBAIC0zMjUsMzQgKzMyNSwzOSBAQAogCiAjZGVmaW5lCUNPTkZJR19USU1FU1RBTVAJCS8qIFByaW50IGltYWdlIGluZm8gd2l0aCB0cwkqLwogCi0jaWYgZGVmaW5lZChDRkdfUkFNQk9PVCkKLSAgI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BDSSB8IFwKLQkJCQlDRkdfQ01EX1BJTkcgfCBDRkdfQ01EX0kyQykgJiBcCi0JCQkJIH4oQ0ZHX0NNRF9FTlYgfCBcCi0JCQkJICBDRkdfQ01EX0xPQURTICkpCi0gICNlbGlmIGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkKLSAgI2RlZmluZSAgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BJTkcgfCBcCi0JCQkJQ0ZHX0NNRF9NSUkgfCBDRkdfQ01EX0kyQyApICYgXAotCQkJCX4oQ0ZHX0NNRF9FTlYpKQotICAjZWxpZiBkZWZpbmVkKENPTkZJR19FVEhFUl9PTl9GQ0MpCi0gICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9NSUkgfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HIHwgQ0ZHX0NNRF9JMkMpICYgXAotCQkJCX4oQ0ZHX0NNRF9FTlYpKQotICAjZW5kaWYKLSNlbHNlCi0gICNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0gICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BDSSB8IFwKLQkJCQlDRkdfQ01EX0VMRiB8IENGR19DTURfUElORyB8IENGR19DTURfSTJDKQotICAjZWxpZiBkZWZpbmVkKENPTkZJR19UU0VDX0VORVQpCi0gICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX1BJTkcgfCBcCi0JCQkJQ0ZHX0NNRF9FTEYgfCBDRkdfQ01EX01JSSB8IENGR19DTURfSTJDKQotICAjZWxpZiBkZWZpbmVkKENPTkZJR19FVEhFUl9PTl9GQ0MpCi0gICNkZWZpbmUgIENPTkZJR19DT01NQU5EUwkoQ09ORklHX0NNRF9ERkwgfCBDRkdfQ01EX01JSSB8IFwKLQkJCQlDRkdfQ01EX0VMRiB8IENGR19DTURfUElORyB8IENGR19DTURfSTJDKQotICAjZW5kaWYKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfUENJCiAjZW5kaWYKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkgfHwgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkNDKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDRkdfUkFNQk9PVCkKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9FTlYKKyAgICAjdW5kZWYgQ09ORklHX0NNRF9MT0FEUworI2Vsc2UKKyAgICAjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZW5kaWYKKwogCiAjdW5kZWYgQ09ORklHX1dBVENIRE9HCQkJLyogd2F0Y2hkb2cgZGlzYWJsZWQJCSovCiAKQEAgLTM2MSw3ICszNjYsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSJTU0E9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTM4Miw3ICszODcsNyBAQAogLyogQ2FjaGUgQ29uZmlndXJhdGlvbiAqLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTMyNzY4CiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKQEAgLTM5NCw3ICszOTksNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290CQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCkBAIC00MTUsMTMgKzQyMCwxMyBAQAogICovCiAjaWZkZWYgQ0ZHX0VOVl9JU19JTl9FRVBST00JCS8qIHVzZSByZXN0cmljdGVkICJzdGFuZGFyZCIgZW52aXJvbm1lbnQgKi8KIAotI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJIAkzODQwMAorI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTM4NDAwCiAKICNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCS8qIC0xIGRpc2FibGUgYXV0b2Jvb3QgKi8KICNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJib290bSAweGZmYzAwMDAwIDB4ZmZkMDAwMDAiCiAjZGVmaW5lIENPTkZJR19CT09UQVJHUwkJInJvb3Q9L2Rldi9uZnMgcncgaXA9YW55IGNvbnNvbGU9dHR5UzEsJGJhdWRyYXRlIgogI2RlZmluZSBDT05GSUdfU0VSVkVSSVAgCTE5Mi4xNjguODUuMQotI2RlZmluZSBDT05GSUdfSVBBRERSICAJCTE5Mi4xNjguODUuNjAKKyNkZWZpbmUgQ09ORklHX0lQQUREUgkJMTkyLjE2OC44NS42MAogI2RlZmluZSBDT05GSUdfR0FURVdBWUlQCTE5Mi4xNjguODUuMQogI2RlZmluZSBDT05GSUdfTkVUTUFTSwkJMjU1LjI1NS4yNTUuMAogI2RlZmluZSBDT05GSUdfSE9TVE5BTUUgCVNUWF9TU0EKQEAgLTQzMSw3ICs0MzYsNyBAQAogCiAjZWxzZSAvKiBFTlYgSVMgSU4gRkxBU0gJCS0tIHVzZSBhIGZ1bGwtYmxvd24gZW52aW9ubWVudCAqLwogCi0jZGVmaW5lIENPTkZJR19CQVVEUkFURQkgCTExNTIwMAorI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJNQkvKiAtMSBkaXNhYmxlIGF1dG9ib290ICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zdHh4dGMuaCBiL2luY2x1ZGUvY29uZmlncy9zdHh4dGMuaAppbmRleCA2MTRhMDQ2Li4wZGJmNGI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvc3R4eHRjLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3N0eHh0Yy5oCkBAIC03Nyw3ICs3NywxNiBAQAogI2RlZmluZQlDT05GSUdfU1RBVFVTX0xFRAkxCS8qIFN0YXR1cyBMRUQgZW5hYmxlZAkJKi8KICNkZWZpbmUgQ09ORklHX0JPQVJEX1NQRUNJRklDX0xFRAkvKiB2ZXJzaW9uIGhhcyBib2FyZCBzcGVjaWZpYyBsZWRzICovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUgfCBDT05GSUdfQk9PVFBfTklTRE9NQUlOKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX05JU0RPTUFJTgorCiAKICN1bmRlZiBDT05GSUdfTUFDX1BBUlRJVElPTgogI3VuZGVmIENPTkZJR19ET1NfUEFSVElUSU9OCkBAIC0xMDAsMTkgKzEwOSwyMiBAQAogCiAjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFCTEJLyogYWxsb3cgbW9kaWZpY2F0aW9uIG9mIHZlbmRvciBwYXJhbXMgKi8KIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMgICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX05BTkQJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfUElORyAgCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkZTKQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9OQU5ECisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUElORworCiAKICNkZWZpbmUgQ09ORklHX0JPQVJEX0VBUkxZX0lOSVRfRgkxCiAjZGVmaW5lIENPTkZJR19NSVNDX0lOSVRfUgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KQEAgLTEyMiw3ICsxMzQsNyBAQAogI2RlZmluZSBDRkdfSFVTSF9QQVJTRVIJMQogI2RlZmluZSBDRkdfUFJPTVBUX0hVU0hfUFMyCSI+ICIKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjEzLDcgKzIyNSw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvc3V6YWt1LmggYi9pbmNsdWRlL2NvbmZpZ3Mvc3V6YWt1LmgKaW5kZXggODIyNDU1NS4uMDhhYzljYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3N1emFrdS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9zdXpha3UuaApAQCAtNTUsMTAgKzU1LDIxIEBACiAjZGVmaW5lIE1JQ1JPQkxBWkVfU1lTUkVHX0JBU0VfQUREUiAweEZGRkZBMDAwCiAjZGVmaW5lIE1JQ1JPQkxBWkVfU1lTUkVHX1JFQ09ORklHVVJFICgxIDw8IDApCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX19DTURfREZMKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCiAKICNkZWZpbmUgQ0ZHX1VBUlQxX0JBU0UJCSgweEZGRkYyMDAwKQogI2RlZmluZSBDT05GSUdfU0VSSUFMX0JBU0UJQ0ZHX1VBUlQxX0JBU0UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9zdm1fc2M4eHguaCBiL2luY2x1ZGUvY29uZmlncy9zdm1fc2M4eHguaAppbmRleCA5MmVlOGNiLi4zYjkwZjNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvc3ZtX3NjOHh4LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3N2bV9zYzh4eC5oCkBAIC0xMjUsMjIgKzEyNSwzMiBAQAogCiAjdW5kZWYJQ09ORklHX0NBTl9EUklWRVIJCS8qIENBTiBEcml2ZXIgc3VwcG9ydCBkaXNhYmxlZAkqLwogCi0jZGVmaW5lIENPTkZJR19CT09UUF9NQVNLCShDT05GSUdfQk9PVFBfREVGQVVMVCB8IENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9TVUJORVRNQVNLCisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKICNkZWZpbmUJQ09ORklHX1JUQ19NUEM4eHgJCS8qIHVzZSBpbnRlcm5hbCBSVEMgb2YgTVBDOHh4CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICggQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYgIHwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RPQwl8IFwKLS8qCQkJCUNGR19DTURfSURFICAgICB8Ki8gXAotCQkJCUNGR19DTURfREFURQkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RPQworI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKworCiAjZGVmaW5lIENGR19OQU5EX0xFR0FDWQogCiAvKgpAQCAtMTUzLDcgKzE2Myw3IEBACiAjZGVmaW5lIENGR19QUk9NUFRfSFVTSF9QUzIgICAgICI+ICIKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUJQ0ZHX0NCU0laRQkxMDI0CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUJQ0ZHX0NCU0laRQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yNDYsNyArMjU2LDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMTYJLyogRm9yIGFsbCBNUEM4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk0CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3RhaXNoYW4uaCBiL2luY2x1ZGUvY29uZmlncy90YWlzaGFuLmgKaW5kZXggMmIyOGY5My4uYmFhNGZiZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3RhaXNoYW4uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvdGFpc2hhbi5oCkBAIC0zMCw2ICszMCw3IEBACiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2RlZmluZSBDT05GSUdfVEFJU0hBTgkJMQkvKiBCb2FyZCBpcyB0YWlzaGFuCQkqLwogI2RlZmluZSBDT05GSUdfNDQwR1gJCTEJLyogU3BlY2lmYyBHWCBzdXBwb3J0CQkqLworI2RlZmluZSBDT05GSUdfNDQwCQkxCS8qIC4uLiBQUEM0NDAgZmFtaWx5CQkqLwogI2RlZmluZSBDT05GSUdfNHh4CQkxCS8qIC4uLiBQUEM0eHggZmFtaWx5CQkqLwogI3VuZGVmCUNGR19EUkFNX1RFU1QJCQkvKiBEaXNhYmxlLXRha2VzIGxvbmcgdGltZSEJKi8KICNkZWZpbmUgQ09ORklHX1NZU19DTEtfRlJFUQkzMzMzMzMzMyAvKiBleHRlcm5hbCBmcmVxIHRvIHBsbAkqLwpAQCAtMjE3LDggKzIxOCw4IEBACiAjZGVmaW5lIENPTkZJR19FTUFDX05SX1NUQVJUCTIJLyogc3RhcnQgd2l0aCBFTUFDIDIgKHNraXAgMCYxKQkqLwogI2RlZmluZSBDT05GSUdfTUlJCQkxCS8qIE1JSSBQSFkgbWFuYWdlbWVudAkJKi8KICNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQkxCi0jZGVmaW5lIENPTkZJR19QSFlfQUREUgkgICAgICAJMHhmZgkgICAgIC8qIG5vIHBoeSBvbiBFTUFDMAkJKi8KLSNkZWZpbmUgQ09ORklHX1BIWTFfQUREUiAgICAgIAkweGZmCSAgICAgLyogbm8gcGh5IG9uIEVNQUMxCQkqLworI2RlZmluZSBDT05GSUdfUEhZX0FERFIJCTB4ZmYJICAgICAvKiBubyBwaHkgb24gRU1BQzAJCSovCisjZGVmaW5lIENPTkZJR19QSFkxX0FERFIJMHhmZgkgICAgIC8qIG5vIHBoeSBvbiBFTUFDMQkJKi8KICNkZWZpbmUgQ09ORklHX1BIWTJfQUREUgkweDEKICNkZWZpbmUgQ09ORklHX1BIWTNfQUREUgkweDMKICNkZWZpbmUgQ09ORklHX0VUMTAxMUNfUEhZCTEKQEAgLTIzMywyNyArMjM0LDM2IEBACiAKICNkZWZpbmUgQ09ORklHX05FVENPTlNPTEUJCS8qIGluY2x1ZGUgTmV0Q29uc29sZSBzdXBwb3J0CSovCiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvbnNvbGUvQ29tbWFuZHMvUGFyc2VyCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9ESUFHCXwgXAotCQkJCUNGR19DTURfRFRUCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSVJRCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkVUCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUENJCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX1JFR0lORk8pCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfRElBRworI2RlZmluZSBDT05GSUdfQ01EX0RUVAorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lSUQorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9SRUdJTkZPCisKIAogI3VuZGVmIENPTkZJR19XQVRDSERPRwkJCS8qIHdhdGNoZG9nIGRpc2FibGVkCQkqLwogCkBAIC0yNjIsNyArMjcyLDcgQEAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCSAgICAgICAgIj0+ICIJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJICAgICAgICAxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCSAgICAgICAgMjU2CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCkBAIC0yOTcsNyArMzA3LDYgQEAKICNkZWZpbmUgQ0ZHX1BDSV9UQVJHQkFTRSAgICAweDgwMDAwMDAwCS8qIFBDSWFkZHIgbWFwcGVkIHRvIENGR19QQ0lfTUVNQkFTRSAqLwogCiAvKiBCb2FyZC1zcGVjaWZpYyBQQ0kgKi8KLSNkZWZpbmUgQ0ZHX1BDSV9QUkVfSU5JVAkJLyogZW5hYmxlIGJvYXJkIHBjaV9wcmVfaW5pdCgpCSovCiAjZGVmaW5lIENGR19QQ0lfVEFSR0VUX0lOSVQJCS8qIGxldCBib2FyZCBpbml0IHBjaSB0YXJnZXQgICAgKi8KIAogI2RlZmluZSBDRkdfUENJX1NVQlNZU19WRU5ET1JJRCAweDEwZTgJLyogQU1DQyAqLwpAQCAtMzE1LDcgKzMyNCw3IEBACiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTMyNzY4CS8qIEZvciBBTUNDIDQ0MCBDUFVzCQkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtMzI3LDcgKzMzNiw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvdGIwMjI5LmggYi9pbmNsdWRlL2NvbmZpZ3MvdGIwMjI5LmgKaW5kZXggZGFjMWViNy4uYTIxYWYyMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3RiMDIyOS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy90YjAyMjkuaApAQCAtODcsMTMgKzg3LDI3IEBACiAvKiNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJydW4gZmxhc2hfbG9jYWwiICovCiAjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkicnVuIG5ldGJvb3QiCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgfCBcCi0JCQkJIENGR19DTURfQVNLRU5WIHwgXAotCQkJCSBDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJIENGR19DTURfUElORwl8IFwKLQkJCQkgQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJIENGR19DTURfRUxGCSkKLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy90cmFiLmggYi9pbmNsdWRlL2NvbmZpZ3MvdHJhYi5oCmluZGV4IGEyZGM4ZTcuLmRiY2NlYTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy90cmFiLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3RyYWIuaApAQCAtODAsMTAgKzgwLDE3IEBACiAjZGVmaW5lIENGR19FRVBST01fUEFHRV9XUklURV9ERUxBWV9NUyAxMAogCiAvKiBVU0Igc3R1ZmYgKi8KLSNkZWZpbmUgQ09ORklHX1VTQl9PSENJCQkxCisjZGVmaW5lIENPTkZJR19VU0JfT0hDSV9ORVcJMQogI2RlZmluZSBDT05GSUdfVVNCX1NUT1JBR0UJMQogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgkxCiAKKyN1bmRlZiBDRkdfVVNCX09IQ0lfQk9BUkRfSU5JVAorI2RlZmluZSBDRkdfVVNCX09IQ0lfQ1BVX0lOSVQJMQorCisjZGVmaW5lIENGR19VU0JfT0hDSV9SRUdTX0JBU0UJMHgxNDIwMDAwMAorI2RlZmluZSBDRkdfVVNCX09IQ0lfU0xPVF9OQU1FCSJzM2MyNDAwIgorI2RlZmluZSBDRkdfVVNCX09IQ0lfTUFYX1JPT1RfUE9SVFMJMTUKKwogLyoKICAqIFNpemUgb2YgbWFsbG9jKCkgcG9vbAogICovCkBAIC0xMzAsNjAgKzEzNyw1MCBAQAogLyogVXNlIHMzYzI0MDAncyBSVEMgKi8KICNkZWZpbmUgQ09ORklHX1JUQ19TM0MyNFgwCTEKIAorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQlNQCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisjZGVmaW5lIENPTkZJR19DTURfVVNCCisKICNpZmRlZiBDT05GSUdfSFdGTE9XCi0jZGVmaW5lIENPTkZJR19DT01NQU5EU19BRERfSFdGTE9XCUNGR19DTURfSFdGTE9XCi0jZWxzZQotI2RlZmluZQlDT05GSUdfQ09NTUFORFNfQUREX0hXRkxPVwkwCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0hXRkxPVwogI2VuZGlmCiAKICNpZmRlZglDT05GSUdfVkZECi0jZGVmaW5lIENPTkZJR19DT01NQU5EU19BRERfVkZECQlDRkdfQ01EX1ZGRAotI2Vsc2UKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTX0FERF9WRkQJCTAKKyAgICAjZGVmaW5lIENPTkZJR19DTURfVkZECiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19EUklWRVJfUzNDMjRYMF9JMkMKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTX0FERF9FRVBST00JQ0ZHX0NNRF9FRVBST00KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTX0kyQwkJQ0ZHX0NNRF9JMkMKLSNlbHNlCi0jZGVmaW5lIENPTkZJR19DT01NQU5EU19BRERfRUVQUk9NCTAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTX0kyQwkJMAorICAgICNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyAgICAjZGVmaW5lIENPTkZJR19DTURfSTJDCiAjZW5kaWYKIAogI2lmbmRlZiBVU0VfOTIwVF9NTVUKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoKENPTkZJR19DTURfREZMICYgfkNGR19DTURfQ0FDSEUpIHwgXAotCQkJCUNPTkZJR19DT01NQU5EU19BRERfSFdGTE9XCXwgXAotCQkJCUNPTkZJR19DT01NQU5EU19BRERfVkZECQl8IFwKLQkJCQlDT05GSUdfQ09NTUFORFNfQUREX0VFUFJPTQl8IFwKLQkJCQlDT05GSUdfQ09NTUFORFNfSTJDCQl8IFwKLQkJCQlDRkdfQ01EX0JTUAkJCXwgXAotCQkJCUNGR19DTURfREFURQkJCXwgXAotCQkJCUNGR19DTURfREhDUAkJCXwgXAotCQkJCUNGR19DTURfRkFUCQkJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJCQl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJCQl8IFwKLQkJCQlDRkdfQ01EX1VTQgkpCi0jZWxzZQotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgIChDT05GSUdfQ01EX0RGTAkJCXwgXAotCQkJCUNPTkZJR19DT01NQU5EU19BRERfSFdGTE9XCXwgXAotCQkJCUNPTkZJR19DT01NQU5EU19BRERfVkZECQl8IFwKLQkJCQlDT05GSUdfQ09NTUFORFNfQUREX0VFUFJPTQl8IFwKLQkJCQlDT05GSUdfQ09NTUFORFNfSTJDCQl8IFwKLQkJCQlDRkdfQ01EX0JTUAkJCXwgXAotCQkJCUNGR19DTURfREFURQkJCXwgXAotCQkJCUNGR19DTURfREhDUAkJCXwgXAotCQkJCUNGR19DTURfRkFUCQkJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJCQl8IFwKLQkJCQlDRkdfQ01EX1NOVFAJCQl8IFwKLQkJCQlDRkdfQ01EX1VTQgkpCisgICAgI3VuZGVmIENPTkZJR19DTURfQ0FDSEUKICNlbmRpZgogCisKIC8qIG1vdmVkIHVwICovCiAjZGVmaW5lIENGR19IVVNIX1BBUlNFUgkJMQkvKiB1c2UgImh1c2giIGNvbW1hbmQgcGFyc2VyCSovCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTUKICNkZWZpbmUgQ09ORklHX1pFUk9fQk9PVERFTEFZX0NIRUNLCS8qIGFsbG93IHRvIGJyZWFrIGluIGFsd2F5cyAqLwogI2RlZmluZSBDT05GSUdfUFJFQk9PVAkJImVjaG87ZWNobyAqKiogYm9vdGluZyAqKio7ZWNobyIKQEAgLTI5Niw3ICsyOTMsNyBAQAogI2RlZmluZSBDT05GSUdfQVVUT0JPT1RfREVMQVlfU1RSCSJSIgkvKiAxc3QgInBhc3N3b3JkIgkqLwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkxMTUyMDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAvKiB3aGF0J3MgdGhpcyA/IGl0J3Mgbm90IHVzZWQgYW55d2hlcmUgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTEJCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3VjMTAwLmggYi9pbmNsdWRlL2NvbmZpZ3MvdWMxMDAuaAppbmRleCBjNGU2MjlhLi45MjE0OGUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvdWMxMDAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvdWMxMDAuaApAQCAtOTgsNyArOTgsMTUgQEAKIAogI3VuZGVmIENPTkZJR19TVEFUVVNfTEVEICAgICAgICAgICAgICAgIC8qIG5vIHN0YXR1cy1sZWQgICAgICAgICAgICAgICAgKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCkBAIC0xMTcsMzIgKzEyNSwzMiBAQAogCQkJCUNGR19QT1NUX1NQUiApCiAjdW5kZWYgIENPTkZJR19QT1NUCiAKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX0VMRgorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0lERQorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX05GUworI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKICNpZmRlZiBDT05GSUdfUE9TVAotI2RlZmluZSBDRkdfQ01EX1BPU1RfRElBRyAgICAgICBDRkdfQ01EX0RJQUcKLSNlbHNlCi0jZGVmaW5lIENGR19DTURfUE9TVF9ESUFHCTAKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCiAjZW5kaWYKIAotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUgICAgfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfRUxGCXwgXAotCQkJCUNGR19DTURfRkFUCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfUElORwl8IFwKLQkJCQlDRkdfQ01EX1BPU1RfRElBRyB8IFwKLQkJCQlDRkdfQ01EX1NOVFAJKQogCiAjZGVmaW5lIENPTkZJR19ORVRDT05TT0xFCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KLQogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwpAQCAtMTU2LDcgKzE2NCw3IEBACiAjZGVmaW5lCUNGR19QUk9NUFRfSFVTSF9QUzIJIj4gIgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI0Niw3ICsyNTQsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvdWMxMDEuaCBiL2luY2x1ZGUvY29uZmlncy91YzEwMS5oCmluZGV4IGZmMDYxZWUuLjNiNDcxZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy91YzEwMS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy91YzEwMS5oCkBAIC0zOCwxMSArMzgsNiBAQAogI2RlZmluZSBCT09URkxBR19DT0xECQkweDAxCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNICSovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290CQkJKi8KIAotI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcwkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKLSMgIGRlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTUJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KLSNlbmRpZgotCiAjZGVmaW5lIENPTkZJR19CT0FSRF9FQVJMWV9JTklUX1IKIAogLyoKQEAgLTU1LDI1ICs1MCwzNCBAQAogLyogUGFydGl0aW9ucyAqLwogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCi0vKgotICogU3VwcG9ydGVkIGNvbW1hbmRzCi0gKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfRElTUExBWQl8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfRUVQUk9NCXwgXAotCQkJCUNGR19DTURfSTJDCXwgXAotCQkJCUNGR19DTURfRFRUCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfRkFUCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfTUlJCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfRElTUExBWQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfRFRUCisjZGVmaW5lIENPTkZJR19DTURfSURFCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKICNkZWZpbmUJQ09ORklHX1RJTUVTVEFNUAkxCS8qIFByaW50IGltYWdlIGluZm8gd2l0aCB0aW1lc3RhbXAgKi8KIApAQCAtMjQ1LDcgKzI0OSw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJICAgICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgICovCkBAIC0yNjQsOSArMjY4LDEzIEBACiAKICNkZWZpbmUgQ0ZHX0haCQkJMTAwMAkvKiBkZWNyZW1lbnRlciBmcmVxOiAxIG1zIHRpY2tzICovCiAKKyNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMJCQkqLworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLworI2VuZGlmCisKIC8qCi0gKiBFbmFibGUgbG9vcHcgY29tbWFuZG8uIFRoaXMgaGFzIG9ubHkgYWZmZWN0LCBpZiBDRkdfQ01EX01FTSBpcyBkZWZpbmVkLAotICogd2hpY2ggaXMgbm9ybWFsbHkgcGFydCBvZiB0aGUgZGVmYXVsdCBjb21tYW5kcyAoQ0ZWX0NNRF9ERkwpCisgKiBFbmFibGUgbG9vcHcgY29tbWFuZC4KICAqLwogI2RlZmluZSBDT05GSUdfTE9PUFcKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3V0eDgyNDUuaCBiL2luY2x1ZGUvY29uZmlncy91dHg4MjQ1LmgKaW5kZXggZTVkNDM5Ny4uY2QwMGM0OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3V0eDgyNDUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvdXR4ODI0NS5oCkBAIC04NiwxOCArODYsMzYgQEAKIAogI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENGR19DTURfREZMIHwgQ0ZHX0NNRF9CREkgfCBDRkdfQ01EX1BDSSBcCi0JCQkJCQkJCXwgQ0ZHX0NNRF9GTEFTSCB8IENGR19DTURfTUVNT1JZIFwKLQkJCQkJCQkJfCBDRkdfQ01EX0VOViB8IENGR19DTURfQ09OU09MRSBcCi0JCQkJCQkJCXwgQ0ZHX0NNRF9MT0FEUyB8IENGR19DTURfTE9BREIgXAotCQkJCQkJCQl8IENGR19DTURfSU1JIHwgQ0ZHX0NNRF9DQUNIRSBcCi0JCQkJCQkJCXwgQ0ZHX0NNRF9SRUdJTkZPIHwgQ0ZHX0NNRF9ORVRcCi0JCQkJCQkJCXwgQ0ZHX0NNRF9ESENQIHwgQ0ZHX0NNRF9JMkMgXAotCQkJCQkJCQl8IENGR19DTURfREFURSkKIAotLyogVGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKICAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0JESQorI2RlZmluZSBDT05GSUdfQ01EX1BDSQorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfTUVNT1JZCisjZGVmaW5lIENPTkZJR19DTURfRU5WCisjZGVmaW5lIENPTkZJR19DTURfQ09OU09MRQorI2RlZmluZSBDT05GSUdfQ01EX0xPQURTCisjZGVmaW5lIENPTkZJR19DTURfTE9BREIKKyNkZWZpbmUgQ09ORklHX0NNRF9JTUkKKyNkZWZpbmUgQ09ORklHX0NNRF9DQUNIRQorI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfREFURQogCiAKIC8qCkBAIC00MDMsNyArNDIxLDcgQEAKICAqIENhY2hlIENvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy92MzcuaCBiL2luY2x1ZGUvY29uZmlncy92MzcuaAppbmRleCBhMmU5OWI1Li4wNDA3MjUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvdjM3LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3YzNy5oCkBAIC03NiwxNiArNzYsMzAgQEAKIAogI2RlZmluZQlDT05GSUdfQ0FOX0RSSVZFUgkxCS8qIENBTiBEcml2ZXIgc3VwcG9ydCBlbmFibGVkCSovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJKENPTkZJR19CT09UUF9ERUZBVUxUIHwgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX1NVQk5FVE1BU0sKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisKIAogI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgogI2RlZmluZSBDT05GSUdfRE9TX1BBUlRJVElPTgogCiAjZGVmaW5lCUNPTkZJR19SVENfTVBDOHh4CQkvKiB1c2UgaW50ZXJuYWwgUlRDIG9mIE1QQzh4eAkqLwogCi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkgICAgICAoIENPTkZJR19DTURfREZMCXwgXAotCQkJCUNGR19DTURfSkZGUzIJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCSkKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX0RBVEUKKwogCiAvKgogICogSkZGUzIgcGFydGl0aW9ucwpAQCAtMTA1LDE1ICsxMTksMTIgQEAKICNkZWZpbmUgTVREUEFSVFNfREVGQVVMVAkibXRkcGFydHM9djM3LTE6LShqZmZzMikiCiAqLwogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCiAgKi8KICNkZWZpbmUJQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lCUNGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZQlDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZQlDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTE5NCw3ICsyMDUsNyBAQAogICogQ2FjaGUgQ29uZmlndXJhdGlvbgogICovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkxNgkvKiBGb3IgYWxsIE1QQzh4eCBDUFVzCQkJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NISUZUCTQJLyogbG9nIGJhc2UgMiBvZiB0aGUgYWJvdmUgdmFsdWUJKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvdjM4Yi5oIGIvaW5jbHVkZS9jb25maWdzL3YzOGIuaAppbmRleCAwYjdiMTllLi5jMGIxYTE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvdjM4Yi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy92MzhiLmgKQEAgLTQ2LDExICs0Niw2IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJCTB4MDEJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0ggICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JCTB4MDIJLyogU29mdHdhcmUgcmVib290ICovCiAKLSNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIEZvciBNUEM1eHh4IENQVXMgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQotIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwotI2VuZGlmCi0KIC8qCiAgKiBTZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCiAgKi8KQEAgLTg5LDI5ICs4NCwzOCBAQAogI2RlZmluZSBDT05GSUdfVVNCX0NMT0NLCTB4MDAwMUJCQkIKICNkZWZpbmUgQ09ORklHX1VTQl9DT05GSUcJMHgwMDAwMTAwMAogCisKIC8qCi0gKiBTdXBwb3J0ZWQgY29tbWFuZHMKKyAqIEJPT1RQIG9wdGlvbnMKICAqLwotI2RlZmluZSBDT05GSUdfQ09NTUFORFMJCShDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQkgQ0ZHX0NNRF9GQVQJfCBcCi0JCQkJIENGR19DTURfSTJDCXwgXAotCQkJCSBDRkdfQ01EX0lERQl8IFwKLQkJCQkgQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCSBDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJIENGR19DTURfRElBRwl8IFwKLQkJCQkgQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJIENGR19DTURfSkZGUzIJfCBcCi0JCQkJIENGR19DTURfTUlJCXwgXAotCQkJCSBDRkdfQ01EX1NEUkFNCXwgXAotCQkJCSBDRkdfQ01EX0RBVEUJfCBcCi0JCQkJIENGR19DTURfVVNCCXwgXAotCQkJCSBDRkdfQ01EX0ZBVCkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgorI2RlZmluZSBDT05GSUdfQ01EX01JSQorI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX1VTQgorI2RlZmluZSBDT05GSUdfQ01EX0ZBVAorCiAKICNkZWZpbmUgQ09ORklHX1RJTUVTVEFNUAkJLyogUHJpbnQgaW1hZ2UgaW5mbyB3aXRoIHRpbWVzdGFtcCAqLwogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+Ci0KIC8qCiAgKiBCb290IGxvdyB3aXRoIDE2IE1CIEZsYXNoCiAgKi8KQEAgLTI1NCw3ICsyNTgsNyBAQAogICovCiAjZGVmaW5lIENGR19MT05HSEVMUAkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5ICovCiAjZGVmaW5lIENGR19QUk9NUFQJCSI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQgKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCQkxMDI0CS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplICovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCQkyNTYJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUgKi8KQEAgLTI3MCw2ICsyNzQsMTEgQEAKIAogI2RlZmluZSBDRkdfSFoJCQkxMDAwCS8qIGRlY3JlbWVudGVyIGZyZXE6IDEgbXMgdGlja3MgKi8KIAorI2RlZmluZSBDRkdfQ0FDSEVMSU5FX1NJWkUJMzIJLyogRm9yIE1QQzV4eHggQ1BVcyAqLworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorIyAgZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLworI2VuZGlmCisKIC8qCiAgKiBWYXJpb3VzIGxvdy1sZXZlbCBzZXR0aW5ncwogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvdmVyc2F0aWxlLmggYi9pbmNsdWRlL2NvbmZpZ3MvdmVyc2F0aWxlLmgKaW5kZXggMTZkYjQzYi4uZDI1MDE1MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3ZlcnNhdGlsZS5oCisrKyBiL2luY2x1ZGUvY29uZmlncy92ZXJzYXRpbGUuaApAQCAtOTYsMTQgKzk2LDI5IEBACiAjZGVmaW5lIENGR19TRVJJQUwwCQkweDEwMUYxMDAwCiAjZGVmaW5lIENGR19TRVJJQUwxCQkweDEwMUYyMDAwCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCShDRkdfQ01EX0RIQ1AgfCBDRkdfQ01EX0lNSSB8IENGR19DTURfTkVUIHwgQ0ZHX0NNRF9QSU5HIHwgQ0ZHX0NNRF9CREkgfCBDRkdfQ01EX01FTU9SWSB8IENGR19DTURfRkxBU0ggfCBDRkdfQ01EX0VOVikKIAotLyojZGVmaW5lIENPTkZJR19DT01NQU5EUwkoQ0ZHX0NNRF9JTUkgfCBDRkdfQ01EX0JESSB8IENGR19DTURfTUVNT1JZKSAqLworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJQ09ORklHX0JPT1RQX0RFRkFVTFQKKyNkZWZpbmUgQ09ORklHX0NNRF9ESENQCisjZGVmaW5lIENPTkZJR19DTURfSU1JCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0JESQorI2RlZmluZSBDT05GSUdfQ01EX01FTU9SWQorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfRU5WCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTIKICNkZWZpbmUgQ09ORklHX0JPT1RBUkdTICJyb290PS9kZXYvbmZzIG1lbT0xMjhNIGlwPWRoY3AgbmV0ZGV2PTI1LDAsMHhmMTAxMDAwMCwweGYxMDEwMDEwLGV0aDAiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvdmlydGxhYjIuaCBiL2luY2x1ZGUvY29uZmlncy92aXJ0bGFiMi5oCmluZGV4IDA2ZDg1MzYuLjU2MWE4YmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy92aXJ0bGFiMi5oCisrKyBiL2luY2x1ZGUvY29uZmlncy92aXJ0bGFiMi5oCkBAIC04OSwzNCArODksMzggQEAKIAogI3VuZGVmCUNPTkZJR19DQU5fRFJJVkVSCQkvKiBDQU4gRHJpdmVyIHN1cHBvcnQgZGlzYWJsZWQJKi8KIAotI2RlZmluZSBDT05GSUdfQk9PVFBfTUFTSwkoQ09ORklHX0JPT1RQX0RFRkFVTFQgfCBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKwogCiAjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCiAjZGVmaW5lIENPTkZJR19ET1NfUEFSVElUSU9OCiAKICNkZWZpbmUJQ09ORklHX1JUQ19NUEM4eHgJCS8qIHVzZSBpbnRlcm5hbCBSVEMgb2YgTVBDOHh4CSovCiAKLSNpZmRlZglDT05GSUdfU1BMQVNIX1NDUkVFTgotIyBkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0JNUAl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCi0jZWxzZQotIyBkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgKCBDT05GSUdfQ01EX0RGTAl8IFwKLQkJCQlDRkdfQ01EX0FTS0VOVgl8IFwKLQkJCQlDRkdfQ01EX0RBVEUJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfSURFCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU05UUAkpCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfREFURQorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9JREUKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUExBU0hfU0NSRUVOKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9CTVAKICNlbmRpZgogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCkBAIC0xMzEsNyArMTM1LDcgQEAKICNkZWZpbmUJQ0ZHX1BST01QVF9IVVNIX1BTMgkiPiAiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lCUNGR19DQlNJWkUJCTEwMjQJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lCUNGR19DQlNJWkUJCTI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMjE0LDcgKzIxOCw3IEBACiAgKiBDYWNoZSBDb25maWd1cmF0aW9uCiAgKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTE2CS8qIEZvciBhbGwgTVBDOHh4IENQVXMJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNAkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy92b2ljZWJsdWUuaCBiL2luY2x1ZGUvY29uZmlncy92b2ljZWJsdWUuaAppbmRleCA0ZTk3YjAxLi43Y2FiMzFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3Mvdm9pY2VibHVlLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3ZvaWNlYmx1ZS5oCkBAIC0xMzEsMzMgKzEzMSwzOCBAQAogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCTExNTIwMAogI2RlZmluZSBDRkdfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfQogCi0jaWZkZWYgVk9JQ0VCTFVFX1NNQUxMX0ZMQVNICi0jZGVmaW5lIENPTkZJR19DT01NQU5EUwkJKENGR19DTURfQkRJICAgIHwJXAotCQkJCSBDRkdfQ01EX0xPQURCICB8CVwKLQkJCQkgQ0ZHX0NNRF9JTUkgICAgfAlcCi0JCQkJIENGR19DTURfRkxBU0ggIHwJXAotCQkJCSBDRkdfQ01EX01FTU9SWSB8CVwKLQkJCQkgQ0ZHX0NNRF9ORVQgICAgfAlcCi0JCQkJIENGR19DTURfQk9PVEQgIHwJXAotCQkJCSBDRkdfQ01EX0RIQ1AgICB8CVwKLQkJCQkgQ0ZHX0NNRF9QSU5HICAgfAlcCi0JCQkJIENGR19DTURfUlVOKQotI2Vsc2UKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ0ZHX0NNRF9CREkgICAgfAlcCi0JCQkJIENGR19DTURfTE9BREIgIHwJXAotCQkJCSBDRkdfQ01EX0lNSSAgICB8CVwKLQkJCQkgQ0ZHX0NNRF9GTEFTSCAgfAlcCi0JCQkJIENGR19DTURfTUVNT1JZIHwJXAotCQkJCSBDRkdfQ01EX05FVCAgICB8CVwKLQkJCQkgQ0ZHX0NNRF9FTlYgICAgfAlcCi0JCQkJIENGR19DTURfQk9PVEQgIHwJXAotCQkJCSBDRkdfQ01EX0RIQ1AgICB8CVwKLQkJCQkgQ0ZHX0NNRF9QSU5HICAgfAlcCi0JCQkJIENGR19DTURfUlVOICAgIHwJXAotCQkJCSBDRkdfQ01EX0pGRlMyKQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0JESQorI2RlZmluZSBDT05GSUdfQ01EX0xPQURCCisjZGVmaW5lIENPTkZJR19DTURfSU1JCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gKKyNkZWZpbmUgQ09ORklHX0NNRF9NRU1PUlkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9CT09URAorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUlVOCisKKyNpZiAhZGVmaW5lZChWT0lDRUJMVUVfU01BTExfRkxBU0gpCisgICAgI2RlZmluZSBDT05GSUdfQ01EX0VOVgorICAgICNkZWZpbmUgQ09ORklHX0NNRF9KRkZTMgogI2VuZGlmCiAKLSNkZWZpbmUgQ09ORklHX0JPT1RQX01BU0sJQ09ORklHX0JPT1RQX0RFRkFVTFQKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSworI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisKKwogI2RlZmluZSBDT05GSUdfTE9PUFcKIAogI2lmZGVmIFZPSUNFQkxVRV9TTUFMTF9GTEFTSApAQCAtMjIwLDggKzIyNSw2IEBACiAKICNlbmRpZgkvKiBWT0lDRUJMVUVfU01BTExfRkxBU0ggKi8KIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgogCiAvKgogICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3dhbG51dC5oIGIvaW5jbHVkZS9jb25maWdzL3dhbG51dC5oCmluZGV4IGIzNGRjNzEuLjE4MDU0OWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy93YWxudXQuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3Mvd2FsbnV0LmgKQEAgLTk4LDI2ICs5OCwzOCBAQAogCiAjZGVmaW5lIENPTkZJR19SVENfRFMxNzR4CTEJLyogdXNlIERTMTc0MyBSVEMgaW4gV2FsbnV0CSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCUNGR19DTURfREhDUAl8IFwKLQkJCQlDRkdfQ01EX0RJQUcJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9FTEYJfCBcCi0JCQkJQ0ZHX0NNRF9JMkMJfCBcCi0JCQkJQ0ZHX0NNRF9JUlEJfCBcCi0JCQkJQ0ZHX0NNRF9NSUkJfCBcCi0JCQkJQ0ZHX0NNRF9ORVQJfCBcCi0JCQkJQ0ZHX0NNRF9ORlMJfCBcCi0JCQkJQ0ZHX0NNRF9QQ0kJfCBcCi0JCQkJQ0ZHX0NNRF9QSU5HCXwgXAotCQkJCUNGR19DTURfUkVHSU5GTyB8IFwKLQkJCQlDRkdfQ01EX1NEUkFNCXwgXAotCQkJCUNGR19DTURfU05UUAkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9BU0tFTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisjZGVmaW5lIENPTkZJR19DTURfU05UUAorCiAKICN1bmRlZiBDT05GSUdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyBkaXNhYmxlZAkJKi8KIApAQCAtMTI4LDcgKzE0MCw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCiAjZGVmaW5lIENGR19QUk9NUFQJIj0+ICIJCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCTEwMjQJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCiAjZWxzZQogI2RlZmluZSBDRkdfQ0JTSVpFCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI4Myw3ICsyOTUsNyBAQAogI2RlZmluZSBDRkdfRENBQ0hFX1NJWkUJCTE2Mzg0CS8qIEZvciBBTUNDIDQwNSBDUFVzLCBvbGRlciA0MDUgcHBjJ3MJKi8KIAkJCQkJLyogaGF2ZSBvbmx5IDhrQiwgMTZrQiBpcyBzYXZlIGhlcmUJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCSovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSElGVAk1CS8qIGxvZyBiYXNlIDIgb2YgdGhlIGFib3ZlIHZhbHVlCSovCiAjZW5kaWYKIApAQCAtMzQwLDcgKzM1Miw3IEBACiAjZGVmaW5lIEJPT1RGTEFHX0NPTEQJMHgwMQkJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KICNkZWZpbmUgQk9PVEZMQUdfV0FSTQkweDAyCQkvKiBTb2Z0d2FyZSByZWJvb3QJCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ09ORklHX0tHREJfQkFVRFJBVEUJMjMwNDAwCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCS8qIHdoaWNoIHNlcmlhbCBwb3J0IHRvIHVzZSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3Mvd2VwZXAyNTAuaCBiL2luY2x1ZGUvY29uZmlncy93ZXBlcDI1MC5oCmluZGV4IDQ3MjUxYmIuLmM2N2IzMDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy93ZXBlcDI1MC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy93ZXBlcDI1MC5oCkBAIC0zNiwxOCArMzYsMjQgQEAKIAogCiAvKgotICogRGVmaW5pdGlvbiBvZiB1LWJvb3QgYnVpbGQgaW4gY29tbWFuZHMuIENoZWNrIG91dCBDT05GSUdfQ01EX0RGTCBpZgotICogbmVjY2Vzc2FyeSBpbiBpbmNsdWRlL2NtZF9jb25mZGVmcy5oIGZpbGUuIChVbiljb21tZW50IGZvciBnZXR0aW5nCi0gKiBmdW5jdGlvbmFsaXR5IG9yIHNpemUgb2YgdS1ib290IGNvZGUuCisgKiBCT09UUCBvcHRpb25zCiAgKi8KLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTICAgICAgICAgKENPTkZJR19DTURfREZMCQlcCi0JCQkJJiB+Q0ZHX0NNRF9ORVQgCQlcCi0JCQkJJiB+Q0ZHX0NNRF9MT0FEUwlcCi0JCQkJJiB+Q0ZHX0NNRF9DT05TT0xFCVwKLQkJCQkmIH5DRkdfQ01EX0FVVE9TQ1JJUFQJXAotLyoJCQkJfCBDRkdfQ01EX0pGRlMyICovCVwKLQkJCQkpCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjdW5kZWYgQ09ORklHX0NNRF9ORVQKKyN1bmRlZiBDT05GSUdfQ01EX0xPQURTCisjdW5kZWYgQ09ORklHX0NNRF9DT05TT0xFCisjdW5kZWYgQ09ORklHX0NNRF9BVVRPU0NSSVBUCisKIAogLyoKICAqIEJvb3Qgb3B0aW9ucy4gU2V0dGluZyBkZWxheSB0byAtMSBzdG9wcyBhdXRvc3RhcnQgY291bnQgZG93bi4KQEAgLTE1Miw3ICsxNTgsNyBAQAogICogUmlnaHQgbm93IHRoZXJlIGlzIG5vIGdhaW4gZm9yIHVzZXIsIGJ1dCBsYXRlciBvbiBib290aW5nIGtlcm5lbCBtaWdodCBiZQogICogcG9zc2libGUuIENvbnNpZGVyIHVzaW5nIFhJUCBrZXJuZWwgcnVubmluZyBmcm9tIGZsYXNoIHRvIHNhdmUgUkFNCiAgKiBmb290cHJpbnQuCi0gKiBOT1RFOiBFbmFibGUgQ0ZHX0NNRF9KRkZTMiBmb3IgSkZGUzIgc3VwcG9ydC4KKyAqIE5PVEU6IEVuYWJsZSBDT05GSUdfQ01EX0pGRlMyIGZvciBKRkZTMiBzdXBwb3J0LgogICovCiAjZGVmaW5lIENGR19KRkZTMl9GSVJTVF9CQU5LCQkwCiAjZGVmaW5lIENGR19KRkZTMl9GSVJTVF9TRUNUT1IJCTUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy94YWVuaWF4LmggYi9pbmNsdWRlL2NvbmZpZ3MveGFlbmlheC5oCmluZGV4IDEwMzk3NjIuLjc0MTg5ODYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy94YWVuaWF4LmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3hhZW5pYXguaApAQCAtNjQsMTUgKzY0LDI5IEBACiAKICNkZWZpbmUgQ0ZHX0JBVURSQVRFX1RBQkxFCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwIH0gLyogdmFsaWQgYmF1ZHJhdGVzICovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoKENPTkZJR19DTURfREZMICYgfkNGR19DTURfRFRUKSB8IFwKLQkJCQlDRkdfQ01EX0RIQ1AJfCBcCi0JCQkJQ0ZHX0NNRF9ESUFHCXwgXAotCQkJCUNGR19DTURfTkZTCXwgXAotCQkJCUNGR19DTURfU0RSQU0JfCBcCi0JCQkJQ0ZHX0NNRF9TTlRQCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfU0RSQU0KKyNkZWZpbmUgQ09ORklHX0NNRF9TTlRQCisKKyN1bmRlZiBDT05GSUdfQ01EX0RUVAorCiAKICNkZWZpbmUgQ09ORklHX0VUSEFERFIJCTA4OjAwOjNlOjI2OjBhOjViCiAjZGVmaW5lIENPTkZJR19ORVRNQVNLCQkyNTUuMjU1LjI1NS4wCkBAIC04Niw3ICsxMDAsNyBAQAogI2RlZmluZSBDT05GSUdfU0VUVVBfTUVNT1JZX1RBR1MgCTEKICNkZWZpbmUgQ09ORklHX0lOSVRSRF9UQUcJCTEKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTExNTIwMAkJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkxCQkJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy94bTI1MC5oIGIvaW5jbHVkZS9jb25maWdzL3htMjUwLmgKaW5kZXggODI1YmZkMS4uYmNkMTZlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3htMjUwLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3htMjUwLmgKQEAgLTgxLDE0ICs4MSwyNiBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkoQ09ORklHX0NNRF9ERkwgfCBcCi0JCQkJIENGR19DTURfRUxGCXwgXAotCQkJCSBDRkdfQ01EX0VFUFJPTSB8IFwKLQkJCQkgQ0ZHX0NNRF9EQVRFCXwgXAotCQkJCSBDRkdfQ01EX0kyQwkpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9EQVRFCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisKIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3hzZW5naW5lLmggYi9pbmNsdWRlL2NvbmZpZ3MveHNlbmdpbmUuaAppbmRleCBkYzcwMmNmLi41NzMzOTMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MveHNlbmdpbmUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MveHNlbmdpbmUuaApAQCAtMTAyLDEwICsxMDIsMjYgQEAKIAogLyogYWxsb3cgdG8gb3ZlcndyaXRlIHNlcmlhbCBhbmQgZXRoYWRkciAqLwogI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCQkxMTUyMDAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCQkJKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9NTUMgfCBDRkdfQ01EX0ZBVCB8IENGR19DTURfUElORyB8IENGR19DTURfSkZGUzIpCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KKy8qCisgKiBCT09UUCBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRQorI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVFBBVEgKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0dBVEVXQVkKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0hPU1ROQU1FCisKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9NTUMKKyNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfSkZGUzIKKwogCiAjZGVmaW5lIENPTkZJR19CT09UREVMQVkJCTMKICNkZWZpbmUgQ09ORklHX0VUSEFERFIJCQlGRjpGRjpGRjpGRjpGRjpGRgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3h1cHYycC5oIGIvaW5jbHVkZS9jb25maWdzL3h1cHYycC5oCmluZGV4IGI0YzcyMGQuLjM1MDAxZDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlncy94dXB2MnAuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MveHVwdjJwLmgKQEAgLTExOCwyNyArMTE4LDM5IEBACiAjZGVmaW5lCUNGR19FTlZfSVNfTk9XSEVSRQkxCiAjZGVmaW5lCUNGR19FTlZfU0laRQkJMHgxMDAwCiAjZGVmaW5lCUNGR19FTlZfQUREUgkJKENGR19NT05JVE9SX0JBU0UgLSBDRkdfRU5WX1NJWkUpCi0jZGVmaW5lCUNPTkZJR19DT01NQU5EUwkoQ09ORklHX19DTURfREZMIHxcCi0JCQlDRkdfQ01EX01FTU9SWSB8XAotCQkJQ0ZHX0NNRF9JUlEgfFwKLQkJCUNGR19DTURfQkRJIHxcCi0JCQlDRkdfQ01EX05FVCB8XAotCQkJQ0ZHX0NNRF9JTUkgfFwKLQkJCUNGR19DTURfRUNITyB8XAotCQkJQ0ZHX0NNRF9DQUNIRSB8XAotCQkJQ0ZHX0NNRF9SVU4gfFwKLQkJCUNGR19DTURfQVVUT1NDUklQVCB8XAotCQkJQ0ZHX0NNRF9BU0tFTlYgfFwKLQkJCUNGR19DTURfTE9BRFMgfFwKLQkJCUNGR19DTURfTE9BREIgfFwKLQkJCUNGR19DTURfTUlTQyB8XAotCQkJQ0ZHX0NNRF9GQVQgfFwKLQkJCUNGR19DTURfRVhUMiB8XAotCQkJQ0ZHX0NNRF9QSU5HIFwKLQkJCSkKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorCisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfTUVNT1JZCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfQkRJCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfSU1JCisjZGVmaW5lIENPTkZJR19DTURfRUNITworI2RlZmluZSBDT05GSUdfQ01EX0NBQ0hFCisjZGVmaW5lIENPTkZJR19DTURfUlVOCisjZGVmaW5lIENPTkZJR19DTURfQVVUT1NDUklQVAorI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0xPQURTCisjZGVmaW5lIENPTkZJR19DTURfTE9BREIKKyNkZWZpbmUgQ09ORklHX0NNRF9NSVNDCisjZGVmaW5lIENPTkZJR19DTURfRkFUCisjZGVmaW5lIENPTkZJR19DTURfRVhUMgorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKwogCiAvKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zICovCiAjZGVmaW5lCUNGR19QUk9NUFQJIlUtQm9vdC1tT05TdFI+ICIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy95b3NlbWl0ZS5oIGIvaW5jbHVkZS9jb25maWdzL3lvc2VtaXRlLmgKaW5kZXggYjY4YWU1NC4uNmE1YjdmMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3lvc2VtaXRlLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3lvc2VtaXRlLmgKQEAgLTM4LDYgKzM4LDcgQEAKICNkZWZpbmUgQ09ORklHXzQ0MEdSCQkxCS8qIFNwZWNpZmljIFBQQzQ0MEdSIHN1cHBvcnQJKi8KICNkZWZpbmUgQ09ORklHX0hPU1ROQU1FCQl5ZWxsb3dzdG9uZQogI2VuZGlmCisjZGVmaW5lIENPTkZJR180NDAJCTEJLyogLi4uIFBQQzQ0MCBmYW1pbHkJCSovCiAjZGVmaW5lIENPTkZJR180eHgJCTEJLyogLi4uIFBQQzR4eCBmYW1pbHkJCSovCiAjZGVmaW5lIENPTkZJR19TWVNfQ0xLX0ZSRVEJNjY2NjY2NjYgICAgLyogZXh0ZXJuYWwgZnJlcSB0byBwbGwJKi8KIApAQCAtMTIyLDcgKzEyMyw3IEBACiAjZGVmaW5lIENGR19GTEFTSF9FTVBUWV9JTkZPCQkvKiBwcmludCAnRScgZm9yIGVtcHR5IHNlY3RvciBvbiBmbGluZm8gKi8KIAogI2lmZGVmIENGR19FTlZfSVNfSU5fRkxBU0gKLSNkZWZpbmUgQ0ZHX0VOVl9TRUNUX1NJWkUJMHgyMDAwMCAJLyogc2l6ZSBvZiBvbmUgY29tcGxldGUgc2VjdG9yCSovCisjZGVmaW5lIENGR19FTlZfU0VDVF9TSVpFCTB4MjAwMDAJLyogc2l6ZSBvZiBvbmUgY29tcGxldGUgc2VjdG9yCQkqLwogI2RlZmluZSBDRkdfRU5WX0FERFIJCShDRkdfTU9OSVRPUl9CQVNFLUNGR19FTlZfU0VDVF9TSVpFKQogI2RlZmluZQlDRkdfRU5WX1NJWkUJCTB4MjAwMAkvKiBUb3RhbCBTaXplIG9mIEVudmlyb25tZW50IFNlY3RvcgkqLwogCkBAIC0yMzIsMTcgKzIzMywyMCBAQAogCiAjaWZkZWYgQ09ORklHXzQ0MEVQCiAvKiBVU0IgKi8KLSNkZWZpbmUgQ09ORklHX1VTQl9PSENJCisjZGVmaW5lIENPTkZJR19VU0JfT0hDSV9ORVcKICNkZWZpbmUgQ09ORklHX1VTQl9TVE9SQUdFCisjZGVmaW5lIENGR19PSENJX0JFX0NPTlRST0xMRVIKKworI3VuZGVmIENGR19VU0JfT0hDSV9CT0FSRF9JTklUCisjZGVmaW5lIENGR19VU0JfT0hDSV9DUFVfSU5JVAkxCisjZGVmaW5lIENGR19VU0JfT0hDSV9SRUdTX0JBU0UJKENGR19QRVJJUEhFUkFMX0JBU0UgfCAweDEwMDApCisjZGVmaW5lIENGR19VU0JfT0hDSV9TTE9UX05BTUUJInBwYzQ0MCIKKyNkZWZpbmUgQ0ZHX1VTQl9PSENJX01BWF9ST09UX1BPUlRTCTE1CiAKIC8qIENvbW1lbnQgdGhpcyBvdXQgdG8gZW5hYmxlIFVTQiAxLjEgZGV2aWNlICovCiAjZGVmaW5lIFVTQl8yXzBfREVWSUNFCiAKLSNkZWZpbmUgQ01EX1VTQgkJCShDRkdfQ01EX1VTQiB8IENGR19DTURfRkFUIHwgQ0ZHX0NNRF9FWFQyKQotCiAjZGVmaW5lIENPTkZJR19TVVBQT1JUX1ZGQVQKLSNlbHNlCi0jZGVmaW5lIENNRF9VU0IJCQkwCS8qIG5vIFVTQiBvbiA0NDBHUgkJKi8KICNlbmRpZiAvKiBDT05GSUdfNDQwRVAgKi8KIAogI2lmZGVmIERFQlVHCkBAIC0yNTEsMzIgKzI1NSw0OSBAQAogI2RlZmluZSBDT05GSUdfSFdfV0FUQ0hET0cJCQkvKiB3YXRjaGRvZyAqLwogI2VuZGlmCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRElBRwl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0VFUFJPTQl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX05FVAl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPCXwgXAotCQkJCUNGR19DTURfU0RSQU0JfCBcCi0JCQkJQ01EX1VTQikKIAotLyogdGhpcyBtdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHRoZSBkZWZpbml0aW9uIG9mIENPTkZJR19DT01NQU5EUyAoaWYgYW55KSAqLwotI2luY2x1ZGUgPGNtZF9jb25mZGVmcy5oPgorLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0FTS0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0RIQ1AKKyNkZWZpbmUgQ09ORklHX0NNRF9ESUFHCisjZGVmaW5lIENPTkZJR19DTURfRUxGCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfSVJRCisjZGVmaW5lIENPTkZJR19DTURfTUlJCisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfTkZTCisjZGVmaW5lIENPTkZJR19DTURfUENJCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX1JFR0lORk8KKyNkZWZpbmUgQ09ORklHX0NNRF9TRFJBTQorCisjaWZkZWYgQ09ORklHXzQ0MEVQCisgICAgI2RlZmluZSBDT05GSUdfQ01EX1VTQgorICAgICNkZWZpbmUgQ09ORklHX0NNRF9GQVQKKyAgICAjZGVmaW5lIENPTkZJR19DTURfRVhUMgorI2VuZGlmCisKIAogLyoKICAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKICAqLwogI2RlZmluZSBDRkdfTE9OR0hFTFAJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KICNkZWZpbmUgQ0ZHX1BST01QVAkgICAgICAgICI9PiAiCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDRkdfQ0JTSVpFCSAgICAgICAgMTAyNAkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwogI2Vsc2UKICNkZWZpbmUgQ0ZHX0NCU0laRQkgICAgICAgIDI1NgkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLwpAQCAtMzExLDcgKzMzMiw2IEBACiAjZGVmaW5lIENGR19QQ0lfVEFSR0JBU0UgICAgICAgIDB4ODAwMDAwMDAgLyogUENJYWRkciBtYXBwZWQgdG8gQ0ZHX1BDSV9NRU1CQVNFKi8KIAogLyogQm9hcmQtc3BlY2lmaWMgUENJICovCi0jZGVmaW5lIENGR19QQ0lfUFJFX0lOSVQgICAgICAgICAgICAgICAgLyogZW5hYmxlIGJvYXJkIHBjaV9wcmVfaW5pdCgpICAqLwogI2RlZmluZSBDRkdfUENJX1RBUkdFVF9JTklUCiAjZGVmaW5lIENGR19QQ0lfTUFTVEVSX0lOSVQKIApAQCAtMzQ0LDcgKzM2NCw3IEBACiAgKi8KICNkZWZpbmUgQ0ZHX0RDQUNIRV9TSVpFCQkoMzI8PDEwKSAvKiBGb3IgQU1DQyA0NDAgQ1BVcwkJCSovCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0laRQkzMgkvKiAuLi4JCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZQkqLwogI2VuZGlmCiAKQEAgLTM1Niw3ICszNzYsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNICSovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290CQkJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENPTkZJR19LR0RCX0JBVURSQVRFCTIzMDQwMAkvKiBzcGVlZCB0byBydW4ga2dkYiBzZXJpYWwgcG9ydCAqLwogI2RlZmluZSBDT05GSUdfS0dEQl9TRVJfSU5ERVgJMgkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL3l1Y2NhLmggYi9pbmNsdWRlL2NvbmZpZ3MveXVjY2EuaAppbmRleCA3ZjhiMDIyLi45YzUzNmZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MveXVjY2EuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MveXVjY2EuaApAQCAtMTM2LDcgKzEzNiw3IEBACiAvKiBEb24ndCBwcm9iZSB0aGVzZSBhZGRycyAqLwogI2RlZmluZSBDRkdfSTJDX05PUFJPQkVTCXsweDUwLCAweDUyLCAweDUzLCAweDU0fQogCi0vKiAjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRUVQUk9NKSAqLworLyogI2lmIGRlZmluZWQoQ09ORklHX0NNRF9FRVBST00pICovCiAvKiAjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFIJMHg1MCAqLwkvKiBJMkMgYm9vdCBFRVBST00JCSovCiAjZGVmaW5lIENGR19JMkNfRUVQUk9NX0FERFJfTEVOCTIJLyogQnl0ZXMgb2YgYWRkcmVzcwkJKi8KIC8qICNlbmRpZiAqLwpAQCAtMTkxLDI0ICsxOTEsMzYgQEAKICNkZWZpbmUgQ09ORklHX0xPQURTX0VDSE8JMQkvKiBlY2hvIG9uIGZvciBzZXJpYWwgZG93bmxvYWQJKi8KICNkZWZpbmUgQ0ZHX0xPQURTX0JBVURfQ0hBTkdFCTEJLyogYWxsb3cgYmF1ZHJhdGUgY2hhbmdlCSovCiAKLSNkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSAgICAgICAoQ09ORklHX0NNRF9ERkwJfCBcCi0JCQkJQ0ZHX0NNRF9BU0tFTlYJfCBcCi0JCQkJQ0ZHX0NNRF9FRVBST00JfCBcCi0JCQkJQ0ZHX0NNRF9ESENQCXwgXAotCQkJCUNGR19DTURfRElBRwl8IFwKLQkJCQlDRkdfQ01EX0VMRgl8IFwKLQkJCQlDRkdfQ01EX0kyQwl8IFwKLQkJCQlDRkdfQ01EX0lSUQl8IFwKLQkJCQlDRkdfQ01EX01JSQl8IFwKLQkJCQlDRkdfQ01EX05FVAl8IFwKLQkJCQlDRkdfQ01EX05GUwl8IFwKLQkJCQlDRkdfQ01EX1BDSQl8IFwKLQkJCQlDRkdfQ01EX1BJTkcJfCBcCi0JCQkJQ0ZHX0NNRF9SRUdJTkZPCXwgXAotCQkJCUNGR19DTURfU0RSQU0JKQogCi0vKiB0aGlzIG11c3QgYmUgaW5jbHVkZWQgQUZURVIgdGhlIGRlZmluaXRpb24gb2YgQ09ORklHX0NPTU1BTkRTIChpZiBhbnkpICovCi0jaW5jbHVkZSA8Y21kX2NvbmZkZWZzLmg+CisvKgorICogQk9PVFAgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09URklMRVNJWkUKKyNkZWZpbmUgQ09ORklHX0JPT1RQX0JPT1RQQVRICisjZGVmaW5lIENPTkZJR19CT09UUF9HQVRFV0FZCisjZGVmaW5lIENPTkZJR19CT09UUF9IT1NUTkFNRQorCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfQVNLRU5WCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfREhDUAorI2RlZmluZSBDT05GSUdfQ01EX0RJQUcKKyNkZWZpbmUgQ09ORklHX0NNRF9FTEYKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9JUlEKKyNkZWZpbmUgQ09ORklHX0NNRF9NSUkKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9ORlMKKyNkZWZpbmUgQ09ORklHX0NNRF9QQ0kKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfUkVHSU5GTworI2RlZmluZSBDT05GSUdfQ01EX1NEUkFNCisKIAogI2RlZmluZQlDT05GSUdfSUJNX0VNQUM0X1Y0CTEKICNkZWZpbmUgQ09ORklHX01JSQkJMQkvKiBNSUkgUEhZIG1hbmFnZW1lbnQJCSovCkBAIC0yMzIsNyArMjQ0LDcgQEAKICNkZWZpbmUgQ0ZHX0xPTkdIRUxQCQkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLwogI2RlZmluZSBDRkdfUFJPTVBUCQkiPT4gIgkJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNkZWZpbmUgQ0ZHX0NCU0laRQkJMTAyNAkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KICNlbHNlCiAjZGVmaW5lIENGR19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KQEAgLTI4OSw3ICszMDEsNiBAQAogI3VuZGVmIENPTkZJR19QQ0lfQ09ORklHX0hPU1RfQlJJREdFCiAKIC8qIEJvYXJkLXNwZWNpZmljIFBDSSAqLwotI2RlZmluZSBDRkdfUENJX1BSRV9JTklUCTEJLyogZW5hYmxlIGJvYXJkIHBjaV9wcmVfaW5pdCgpCSovCiAjZGVmaW5lIENGR19QQ0lfVEFSR0VUX0lOSVQJCS8qIGxldCBib2FyZCBpbml0IHBjaSB0YXJnZXQgICAgKi8KICN1bmRlZglDRkdfUENJX01BU1RFUl9JTklUCiAKQEAgLTMxNCw3ICszMjUsNyBAQAogICovCiAjZGVmaW5lIENGR19EQ0FDSEVfU0laRQkJODE5MgkvKiBGb3IgQU1DQyA0MDUgQ1BVcwkJKi8KICNkZWZpbmUgQ0ZHX0NBQ0hFTElORV9TSVpFCTMyCS8qIC4uLgkJCQkqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAjZGVmaW5lIENGR19DQUNIRUxJTkVfU0hJRlQJNQkvKiBsb2cgYmFzZSAyIG9mIHRoZSBhYm92ZSB2YWx1ZSAqLwogI2VuZGlmCiAKQEAgLTMyNiw3ICszMzcsNyBAQAogI2RlZmluZSBCT09URkxBR19DT0xECTB4MDEJCS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCiAjZGVmaW5lIEJPT1RGTEFHX1dBUk0JMHgwMgkJLyogU29mdHdhcmUgcmVib290ICovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJLyogc3BlZWQgdG8gcnVuIGtnZGIgc2VyaWFsIHBvcnQgKi8KICNkZWZpbmUgQ09ORklHX0tHREJfU0VSX0lOREVYCTIJLyogd2hpY2ggc2VyaWFsIHBvcnQgdG8gdXNlICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy96eWxvbml0ZS5oIGIvaW5jbHVkZS9jb25maWdzL3p5bG9uaXRlLmgKaW5kZXggMWU4ZWQ3YS4uNTE3ZWNiMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL3p5bG9uaXRlLmgKKysrIGIvaW5jbHVkZS9jb25maWdzL3p5bG9uaXRlLmgKQEAgLTc2LDE5ICs3NiwzMiBAQAogCiAjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJMTE1MjAwCiAKKworLyoKKyAqIEJPT1RQIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFCisjZGVmaW5lIENPTkZJR19CT09UUF9CT09UUEFUSAorI2RlZmluZSBDT05GSUdfQk9PVFBfR0FURVdBWQorI2RlZmluZSBDT05GSUdfQk9PVFBfSE9TVE5BTUUKKworCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKwogI2lmZGVmIFRVUk5fT05fRVRIRVJORVQKLSMgZGVmaW5lIENPTkZJR19DT01NQU5EUyAgICAgICAgKENPTkZJR19DTURfREZMIHwgQ0ZHX0NNRF9QSU5HKQorICAgICNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCiAjZWxzZQotIyBkZWZpbmUgQ09ORklHX0NPTU1BTkRTCSgoQ09ORklHX0NNRF9ERkwgXAotCQkJCSAgfCBDRkdfQ01EX0VOViBcCi0JCQkJICB8IENGR19DTURfTkFORCkgXAotCQkJCSAmIH4oQ0ZHX0NNRF9ORVQgXAotCQkJCSAgICAgfCBDRkdfQ01EX0ZMQVNIIFwKLQkJCQkgICAgIHwgQ0ZHX0NNRF9JTUxTKSkKKyAgICAjZGVmaW5lIENPTkZJR19DTURfRU5WCisgICAgI2RlZmluZSBDT05GSUdfQ01EX05BTkQKKworICAgICN1bmRlZiBDT05GSUdfQ01EX05FVAorICAgICN1bmRlZiBDT05GSUdfQ01EX0ZMQVNICisgICAgI3VuZGVmIENPTkZJR19DTURfSU1MUwogI2VuZGlmCiAKLS8qIHRoaXMgbXVzdCBiZSBpbmNsdWRlZCBBRlRFUiB0aGUgZGVmaW5pdGlvbiBvZiBDT05GSUdfQ09NTUFORFMgKGlmIGFueSkgKi8KLSNpbmNsdWRlIDxjbWRfY29uZmRlZnMuaD4KIAogI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCS0xCiAjZGVmaW5lIENPTkZJR19FVEhBRERSCQkwODowMDozZToyNjowYTo1YgpAQCAtMTAwLDcgKzExMyw3IEBACiAjZGVmaW5lIENPTkZJR19DTURMSU5FX1RBRwogI2RlZmluZSBDT05GSUdfVElNRVNUQU1QCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogI2RlZmluZSBDT05GSUdfS0dEQl9CQVVEUkFURQkyMzA0MDAJCS8qIHNwZWVkIHRvIHJ1biBrZ2RiIHNlcmlhbCBwb3J0ICovCiAjZGVmaW5lIENPTkZJR19LR0RCX1NFUl9JTkRFWAkyCQkvKiB3aGljaCBzZXJpYWwgcG9ydCB0byB1c2UgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kYTkwMzAuaCBiL2luY2x1ZGUvZGE5MDMwLmgKaW5kZXggNDExMDhiOS4uM2UzYjIwMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kYTkwMzAuaAorKysgYi9pbmNsdWRlL2RhOTAzMC5oCkBAIC0xMDQsMyArMTA0LDE1IEBACiAjZGVmaW5lIFNZU19DT05UUk9MX0FfSFdSRVNfRU5BQkxFCQkoMTw8MikKICNkZWZpbmUgU1lTX0NPTlRST0xfQV9XRE9HX0FDVElPTgkJKDE8PDMpCiAjZGVmaW5lIFNZU19DT05UUk9MX0FfV0FUQ0hET0cJCQkoMTw8NykKKworI2RlZmluZSBNSVNDX0NPTlRST0xCX1VTQl9JTlRfUklTSU5HCQkoMTw8MikKKyNkZWZpbmUgTUlTQ19DT05UUk9MQl9TRVNTSU9OX1ZBTElEX0VOCQkoMTw8MykKKworI2RlZmluZSBVU0JfUFVNUF9VU0JWRQkJCQkoMTw8MCkKKyNkZWZpbmUgVVNCX1BVTVBfVVNCVkVQCQkJCSgxPDwxKQorI2RlZmluZSBVU0JfUFVNUF9TUlBfREVURUNUCQkJKDE8PDIpCisjZGVmaW5lIFVTQl9QVU1QX1NFU1NJT05fVkFMSUQJCQkoMTw8MykKKyNkZWZpbmUgVVNCX1BVTVBfVkJVU19WQUxJRF80XzAJCQkoMTw8NCkKKyNkZWZpbmUgVVNCX1BVTVBfVkJVU19WQUxJRF80XzQJCQkoMTw8NSkKKyNkZWZpbmUgVVNCX1BVTVBfRU5fVVNCVkUJCQkoMTw8NikKKyNkZWZpbmUgVVNCX1BVTVBfRU5fVVNCVkVQCQkJKDE8PDcpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi9kaXY2NC5oIGIvaW5jbHVkZS9kaXY2NC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1hdnIzMi9kaXY2NC5oCnJlbmFtZSB0byBpbmNsdWRlL2RpdjY0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHA4Mzg0OC5oIGIvaW5jbHVkZS9kcDgzODQ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc0YmM0YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHA4Mzg0OC5oCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBEUDgzODQ4IGV0aGVybmV0IFBoeXNpY2FsIGxheWVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNlcmdleSBLdWJ1c2h5biA8a3NpQGtvaTgubmV0PgorICoKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKworLyogTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBQSFlTSUNBTCBMQVlFUiBUUkFOU0NFSVZFUiBEUDgzODQ4ICovCisKKyNkZWZpbmUgRFA4Mzg0OF9DVExfUkVHCQkweDAJLyogQmFzaWMgTW9kZSBDb250cm9sIFJlZyAqLworI2RlZmluZSBEUDgzODQ4X1NUQVRfUkVHCQkweDEJLyogQmFzaWMgTW9kZSBTdGF0dXMgUmVnICovCisjZGVmaW5lIERQODM4NDhfUEhZSUQxX1JFRwkJMHgyCS8qIFBIWSBJZGVuZGlmaWVyIFJlZyAxICovCisjZGVmaW5lIERQODM4NDhfUEhZSUQyX1JFRwkJMHgzCS8qIFBIWSBJZGVuZGlmaWVyIFJlZyAyICovCisjZGVmaW5lIERQODM4NDhfQU5BX1JFRwkJCTB4NAkvKiBBdXRvX05lZyBBZHZ0IFJlZyAgKi8KKyNkZWZpbmUgRFA4Mzg0OF9BTkxQQV9SRUcJCTB4NQkvKiBBdXRvX25lZyBMaW5rIFBhcnRuZXIgQWJpbGl0eSBSZWcgKi8KKyNkZWZpbmUgRFA4Mzg0OF9BTkVfUkVHCQkJMHg2CS8qIEF1dG8tbmVnIEV4cGFuc2lvbiBSZWcgICovCisjZGVmaW5lIERQODM4NDhfUEhZX1NUQVRfUkVHCQkweDEwCS8qIFBIWSBTdGF0dXMgUmVnaXN0ZXIgICovCisjZGVmaW5lIERQODM4NDhfUEhZX0lOVFJfQ1RSTF9SRUcJMHgxMQkvKiBQSFkgSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRFA4Mzg0OF9QSFlfQ1RSTF9SRUcJCTB4MTkJLyogUEhZIFN0YXR1cyBSZWdpc3RlciAgKi8KKworLyotLUJpdCBkZWZpbml0aW9uczogRFA4Mzg0OF9DVExfUkVHICovCisjZGVmaW5lIERQODM4NDhfUkVTRVQJCSgxIDw8IDE1KSAgLyogMT0gUy9XIFJlc2V0ICovCisjZGVmaW5lIERQODM4NDhfTE9PUEJBQ0sJKDEgPDwgMTQpICAvKiAxPWxvb3BiYWNrIEVuYWJsZWQgKi8KKyNkZWZpbmUgRFA4Mzg0OF9TUEVFRF9TRUxFQ1QJKDEgPDwgMTMpCisjZGVmaW5lIERQODM4NDhfQVVUT05FRwkJKDEgPDwgMTIpCisjZGVmaW5lIERQODM4NDhfUE9XRVJfRE9XTgkoMSA8PCAxMSkKKyNkZWZpbmUgRFA4Mzg0OF9JU09MQVRFCQkoMSA8PCAxMCkKKyNkZWZpbmUgRFA4Mzg0OF9SRVNUQVJUX0FVVE9ORUcJKDEgPDwgOSkKKyNkZWZpbmUgRFA4Mzg0OF9EVVBMRVhfTU9ERQkoMSA8PCA4KQorI2RlZmluZSBEUDgzODQ4X0NPTExJU0lPTl9URVNUCSgxIDw8IDcpCisKKy8qLS1CaXQgZGVmaW5pdGlvbnM6IERQODM4NDhfU1RBVF9SRUcgKi8KKyNkZWZpbmUgRFA4Mzg0OF8xMDBCQVNFX1Q0CSgxIDw8IDE1KQorI2RlZmluZSBEUDgzODQ4XzEwMEJBU0VfVFhfRkQJKDEgPDwgMTQpCisjZGVmaW5lIERQODM4NDhfMTAwQkFTRV9UWF9IRAkoMSA8PCAxMykKKyNkZWZpbmUgRFA4Mzg0OF8xMEJBU0VfVF9GRAkoMSA8PCAxMikKKyNkZWZpbmUgRFA4Mzg0OF8xMEJBU0VfVF9IRAkoMSA8PCAxMSkKKyNkZWZpbmUgRFA4Mzg0OF9NRl9QUkVBTUJfU1VQUFIJKDEgPDwgNikKKyNkZWZpbmUgRFA4Mzg0OF9BVVRPTkVHX0NPTVAJKDEgPDwgNSkKKyNkZWZpbmUgRFA4Mzg0OF9STVRfRkFVTFQJKDEgPDwgNCkKKyNkZWZpbmUgRFA4Mzg0OF9BVVRPTkVHX0FCSUxJVFkJKDEgPDwgMykKKyNkZWZpbmUgRFA4Mzg0OF9MSU5LX1NUQVRVUwkoMSA8PCAyKQorI2RlZmluZSBEUDgzODQ4X0pBQkJFUl9ERVRFQ1QJKDEgPDwgMSkKKyNkZWZpbmUgRFA4Mzg0OF9FWFRFTkRfQ0FQQUIJKDEgPDwgMCkKKworLyotLWRlZmluaXRpb25zOiBEUDgzODQ4X1BIWUlEMSAqLworI2RlZmluZSBEUDgzODQ4X1BIWUlEMV9PVUkJMHgyMDAwCisjZGVmaW5lIERQODM4NDhfUEhZSUQyX09VSQkweDVjOTAKKworLyotLUJpdCBkZWZpbml0aW9uczogRFA4Mzg0OF9BTkFSLCBEUDgzODQ4X0FOTFBBUiAqLworI2RlZmluZSBEUDgzODQ4X05QCQkoMSA8PCAxNSkKKyNkZWZpbmUgRFA4Mzg0OF9BQ0sJCSgxIDw8IDE0KQorI2RlZmluZSBEUDgzODQ4X1JGCQkoMSA8PCAxMykKKyNkZWZpbmUgRFA4Mzg0OF9QQVVTRQkJKDEgPDwgMTApCisjZGVmaW5lIERQODM4NDhfVDQJCSgxIDw8IDkpCisjZGVmaW5lIERQODM4NDhfVFhfRkRYCQkoMSA8PCA4KQorI2RlZmluZSBEUDgzODQ4X1RYX0hEWAkJKDEgPDwgNykKKyNkZWZpbmUgRFA4Mzg0OF8xMF9GRFgJCSgxIDw8IDYpCisjZGVmaW5lIERQODM4NDhfMTBfSERYCQkoMSA8PCA1KQorI2RlZmluZSBEUDgzODQ4X0FOX0lFRUVfODAyXzMJMHgwMDAxCisKKy8qLS1CaXQgZGVmaW5pdGlvbnM6IERQODM4NDhfQU5FUiAqLworI2RlZmluZSBEUDgzODQ4X1BERgkJKDEgPDwgNCkKKyNkZWZpbmUgRFA4Mzg0OF9MUF9OUF9BQkxFCSgxIDw8IDMpCisjZGVmaW5lIERQODM4NDhfTlBfQUJMRQkJKDEgPDwgMikKKyNkZWZpbmUgRFA4Mzg0OF9QQUdFX1JYCQkoMSA8PCAxKQorI2RlZmluZSBEUDgzODQ4X0xQX0FOX0FCTEUJKDEgPDwgMCkKKworLyotLUJpdCBkZWZpbml0aW9uczogRFA4Mzg0OF9QSFlfU1RBVCAqLworI2RlZmluZSBEUDgzODQ4X1JYX0VSUl9MQVRDSAkJKDEgPDwgMTMpCisjZGVmaW5lIERQODM4NDhfUE9MQVJJVFlfU1RBVAkJKDEgPDwgMTIpCisjZGVmaW5lIERQODM4NDhfRkFMU0VfQ0FSX1NFTlNFCQkoMSA8PCAxMSkKKyNkZWZpbmUgRFA4Mzg0OF9TSUdfREVURUNUCQkoMSA8PCAxMCkKKyNkZWZpbmUgRFA4Mzg0OF9ERVNDUkFNX0xPQ0sJCSgxIDw8IDkpCisjZGVmaW5lIERQODM4NDhfUEFHRV9SQ1YJCSgxIDw8IDgpCisjZGVmaW5lIERQODM4NDhfUEhZX1JNVF9GQVVMVAkJKDEgPDwgNikKKyNkZWZpbmUgRFA4Mzg0OF9KQUJCRVIJCQkoMSA8PCA1KQorI2RlZmluZSBEUDgzODQ4X0FVVE9ORUdfQ09NUExFVEUJKDEgPDwgNCkKKyNkZWZpbmUgRFA4Mzg0OF9MT09QQkFDS19TVEFUCQkoMSA8PCAzKQorI2RlZmluZSBEUDgzODQ4X0RVUExFWAkJCSgxIDw8IDIpCisjZGVmaW5lIERQODM4NDhfU1BFRUQJCQkoMSA8PCAxKQorI2RlZmluZSBEUDgzODQ4X0xJTksJCQkoMSA8PCAwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9leHBvcnRzLmggYi9pbmNsdWRlL2V4cG9ydHMuaAppbmRleCA4ZjdmNjE3Li5kNjUxMmNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2V4cG9ydHMuaAorKysgYi9pbmNsdWRlL2V4cG9ydHMuaApAQCAtMjMsMTAgKzIzLDE1IEBACiB1bnNpZ25lZCBsb25nIHNpbXBsZV9zdHJ0b3VsKGNvbnN0IGNoYXIgKmNwLGNoYXIgKiplbmRwLHVuc2lnbmVkIGludCBiYXNlKTsKIGNoYXIgKmdldGVudiAoY2hhciAqbmFtZSk7CiB2b2lkIHNldGVudiAoY2hhciAqdmFybmFtZSwgY2hhciAqdmFydmFsdWUpOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0kyQykKK2xvbmcgc2ltcGxlX3N0cnRvbChjb25zdCBjaGFyICpjcCxjaGFyICoqZW5kcCx1bnNpZ25lZCBpbnQgYmFzZSk7CitpbnQgc3RyY21wKGNvbnN0IGNoYXIgKiBjcyxjb25zdCBjaGFyICogY3QpOworI2lmZGVmIENPTkZJR19IQVNfVUlECit2b2lkIGZvcmNlZW52IChjaGFyICp2YXJuYW1lLCBjaGFyICp2YXJ2YWx1ZSk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSTJDKQogaW50IGkyY193cml0ZSAodWNoYXIsIHVpbnQsIGludCAsIHVjaGFyKiAsIGludCk7CiBpbnQgaTJjX3JlYWQgKHVjaGFyLCB1aW50LCBpbnQgLCB1Y2hhciogLCBpbnQpOwotI2VuZGlmCS8qIENGR19DTURfSTJDICovCisjZW5kaWYKIAogdm9pZCBhcHBfc3RhcnR1cChjaGFyICoqKTsKIApAQCAtNDAsNyArNDUsNyBAQAogCVhGX01BWAogfTsKIAotI2RlZmluZSBYRl9WRVJTSU9OCTMKKyNkZWZpbmUgWEZfVkVSU0lPTgk0CiAKICNpZiBkZWZpbmVkKENPTkZJR19JMzg2KQogZXh0ZXJuIGdkX3QgKmdsb2JhbF9kYXRhOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mZHRfc3VwcG9ydC5oIGIvaW5jbHVkZS9mZHRfc3VwcG9ydC5oCmluZGV4IGEyNzY4MzQuLjYwZmE0MjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZmR0X3N1cHBvcnQuaAorKysgYi9pbmNsdWRlL2ZkdF9zdXBwb3J0LmgKQEAgLTM4LDUgKzM4LDExIEBACiBpbnQgZmR0X2JkX3Qodm9pZCAqZmR0KTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX09GX0JPQVJEX1NFVFVQCit2b2lkIGZ0X2JvYXJkX3NldHVwKHZvaWQgKmJsb2IsIGJkX3QgKmJkKTsKK3ZvaWQgZnRfY3B1X3NldHVwKHZvaWQgKmJsb2IsIGJkX3QgKmJkKTsKK3ZvaWQgZnRfcGNpX3NldHVwKHZvaWQgKmJsb2IsIGJkX3QgKmJkKTsKKyNlbmRpZgorCiAjZW5kaWYgLyogaWZkZWYgQ09ORklHX09GX0xJQkZEVCAqLwogI2VuZGlmIC8qIGlmbmRlZiBfX0ZEVF9TVVBQT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGNkLmggYi9pbmNsdWRlL2xjZC5oCmluZGV4IGI2ODg1ODMuLjhhNDI3M2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGNkLmgKKysrIGIvaW5jbHVkZS9sY2QuaApAQCAtMTczLDEwICsxNzMsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAqKiBCSVRNQVAgRElTUExBWSBTVVBQT1JUCQkJCQkJKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQk1QKSB8fCBkZWZpbmVkKENPTkZJR19TUExBU0hfU0NSRUVOKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CTVApIHx8IGRlZmluZWQoQ09ORklHX1NQTEFTSF9TQ1JFRU4pCiAjIGluY2x1ZGUgPGJtcF9sYXlvdXQuaD4KICMgaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotI2VuZGlmIC8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JNUCkgfHwgQ09ORklHX1NQTEFTSF9TQ1JFRU4gKi8KKyNlbmRpZgogCiAvKgogICogIEluZm9ybWF0aW9uIGFib3V0IGRpc3BsYXlzIHdlIGFyZSB1c2luZy4gVGhpcyBpcyBmb3IgY29uZmlndXJpbmcKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGliZmR0LmggYi9pbmNsdWRlL2xpYmZkdC5oCmluZGV4IGY4YmFjNzMuLjM0MGU4OWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGliZmR0LmgKKysrIGIvaW5jbHVkZS9saWJmZHQuaApAQCAtNzcsNyArNzcsMTMgQEAKIAkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbik7CiBpbnQgZmR0X3N1Ym5vZGVfb2Zmc2V0KGNvbnN0IHZvaWQgKmZkdCwgaW50IHBhcmVudG9mZnNldCwgY29uc3QgY2hhciAqbmFtZSk7CiAKLWludCBmZHRfcGF0aF9vZmZzZXQoY29uc3Qgdm9pZCAqZmR0LCBjb25zdCBjaGFyICpwYXRoKTsKK2ludCBmZHRfZmluZF9ub2RlX2J5X3BhdGgoY29uc3Qgdm9pZCAqZmR0LCBjb25zdCBjaGFyICpwYXRoKTsKK2ludCBmZHRfZmluZF9ub2RlX2J5X3R5cGUoY29uc3Qgdm9pZCAqZmR0LCBpbnQgbm9kZW9mZnNldCwgY29uc3QgY2hhciAqdHlwZSk7CisKK2ludCBmZHRfbm9kZV9pc19jb21wYXRpYmxlKGNvbnN0IHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsCisJCQkgICBjb25zdCBjaGFyICpjb21wYXQpOworaW50IGZkdF9maW5kX2NvbXBhdGlibGVfbm9kZShjb25zdCB2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0LAorCQkJICAgICBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICpjb21wYXQpOwogCiBzdHJ1Y3QgZmR0X3Byb3BlcnR5ICpmZHRfZ2V0X3Byb3BlcnR5KGNvbnN0IHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsCiAJCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50ICpsZW5wKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGliZmR0X2Vudi5oIGIvaW5jbHVkZS9saWJmZHRfZW52LmgKaW5kZXggZTc0NjMxNC4uNzhmNzI1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saWJmZHRfZW52LmgKKysrIGIvaW5jbHVkZS9saWJmZHRfZW52LmgKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAKLXN0cnVjdCBmZHRfaGVhZGVyICpmZHQ7ICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgd29ya2luZyBmZHQgKi8KK2V4dGVybiBzdHJ1Y3QgZmR0X2hlYWRlciAqZmR0OyAgLyogUG9pbnRlciB0byB0aGUgd29ya2luZyBmZHQgKi8KIAogI2RlZmluZSBmZHQzMl90b19jcHUoeCkJCV9fYmUzMl90b19jcHUoeCkKICNkZWZpbmUgY3B1X3RvX2ZkdDMyKHgpCQlfX2NwdV90b19iZTMyKHgpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xvZ2J1ZmYuaCBiL2luY2x1ZGUvbG9nYnVmZi5oCmluZGV4IDNhY2ZjMTguLmQ0MTU3MjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbG9nYnVmZi5oCisrKyBiL2luY2x1ZGUvbG9nYnVmZi5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogKEMpIENvcHlyaWdodCAyMDAyLTIwMDcKICAqIERldGxldiBadW5kZWwsIGR6dUBkZW54LmRlLgogICoKICAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCkBAIC0yNSw2ICsyNSw3IEBACiAKICNpZmRlZiBDT05GSUdfTE9HQlVGRkVSCiAKKyNkZWZpbmUgTE9HQlVGRl9NQUdJQwkweGMwZGU0Y2VkCS8qIEZvcmNlZCBieSBjb2RlLCBlaCEJKi8KICNkZWZpbmUgTE9HQlVGRl9MRU4JKDE2Mzg0KQkvKiBNdXN0IGJlIDE2ayByaWdodCBub3cgKi8KICNkZWZpbmUgTE9HQlVGRl9NQVNLCShMT0dCVUZGX0xFTi0xKQogI2RlZmluZSBMT0dCVUZGX09WRVJIRUFEICg0MDk2KSAvKiBMb2didWZmZXIgb3ZlcmhlYWQgZm9yIGV4dHJhIGluZm8gKi8KQEAgLTMyLDYgKzMzLDI5IEBACiAKICNkZWZpbmUgTE9HQlVGRl9JTklUSUFMSVpFRAkoMTw8MzEpCiAKKy8qIFRoZSBtYXBwaW5nIHVzZWQgaGVyZSBoYXMgdG8gYmUgdGhlIHNhbWUgYXMgaW4gc2V0dXBfZXh0X2xvZ2J1ZmYgKCkKKyAgIGluIGxpbnV4L2tlcm5lbC9wcmludGsgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIGxvbmcJdGFnOworCQkJdW5zaWduZWQgbG9uZwlzdGFydDsKKwkJCXVuc2lnbmVkIGxvbmcJY29uOworCQkJdW5zaWduZWQgbG9uZwllbmQ7CisJCQl1bnNpZ25lZCBsb25nCWNoYXJzOworCQl9IHYyOworCQlzdHJ1Y3QgeworCQkJdW5zaWduZWQgbG9uZwlkdW1teTsKKwkJCXVuc2lnbmVkIGxvbmcJdGFnOworCQkJdW5zaWduZWQgbG9uZwlzdGFydDsKKwkJCXVuc2lnbmVkIGxvbmcJc2l6ZTsKKwkJCXVuc2lnbmVkIGxvbmcJY2hhcnM7CisJCX0gdjE7CisJfTsKKwl1bnNpZ25lZCBjaGFyCWJ1ZlswXTsKK30gbG9nYnVmZl90OworCiBpbnQgZHJ2X2xvZ2J1ZmZfaW5pdCAodm9pZCk7CiB2b2lkIGxvZ2J1ZmZfaW5pdF9wdHJzICh2b2lkKTsKIHZvaWQgbG9nYnVmZl9sb2coY2hhciAqbXNnKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWs0OHQ1OS5oIGIvaW5jbHVkZS9tazQ4dDU5LmgKaW5kZXggMDNjOTkyZS4uYTQ0NTljMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tazQ4dDU5LmgKKysrIGIvaW5jbHVkZS9tazQ4dDU5LmgKQEAgLTI2LDcgKzI2LDcgQEAKICAqLwogCiAKLSNpZiBkZWZpbmVkKENPTkZJR19SVENfTUs0OFQ1OSkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREFURSkKKyNpZiBkZWZpbmVkKENPTkZJR19SVENfTUs0OFQ1OSkgJiYgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAKICNkZWZpbmUgUlRDX1BPUlRfQUREUjAJCUNGR19JU0FfSU8gKyAgMHg3MAogI2RlZmluZSBSVENfUE9SVF9BRERSMQkJUlRDX1BPUlRfQUREUjAgKyAgMHgxCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wYzUxMnguaCBiL2luY2x1ZGUvbXBjNTEyeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMDBiMjIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21wYzUxMnguaApAQCAtMCwwICsxLDM5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiAoQykgQ29weXJpZ2h0IDIwMDcgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZworICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRGVyaXZlZCBmcm9tIHRoZSBNUEM4M3h4IGhlYWRlci4KKyAqLworCisjaWZuZGVmIF9fTVBDNTEyWF9IX18KKyNkZWZpbmUgX19NUEM1MTJYX0hfXworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaWYgZGVmaW5lZChDT05GSUdfRTMwMCkKKyNpbmNsdWRlIDxhc20vZTMwMC5oPgorI2VuZGlmCisKKy8qIFN5c3RlbSByZXNldCBvZmZzZXQgKFBvd2VyUEMgc3RhbmRhcmQpCisgKi8KKyNkZWZpbmUgRVhDX09GRl9TWVNfUkVTRVQJCTB4MDEwMAorI2RlZmluZQlfU1RBUlRfT0ZGU0VUCQkJRVhDX09GRl9TWVNfUkVTRVQKKworCisvKiBJTU1SQkFSIC0gSW50ZXJuYWwgTWVtb3J5IFJlZ2lzdGVyIEJhc2UgQWRkcmVzcworICovCisjZGVmaW5lIENPTkZJR19ERUZBVUxUX0lNTVIJCTB4RkY0MDAwMDAJLyogRGVmYXVsdCBJTU1SIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBJTU1SQkFSCQkJCTB4MDAwMAkJLyogUmVnaXN0ZXIgb2Zmc2V0IHRvIGltbXIgKi8KKyNkZWZpbmUgSU1NUkJBUl9CQVNFX0FERFIJCTB4RkZGMDAwMDAJLyogQmFzZSBhZGRyZXNzIG1hc2sgKi8KKyNkZWZpbmUgSU1NUkJBUl9SRVMJCQl+KElNTVJCQVJfQkFTRV9BRERSKQorCisvKiBMQVdCQVIgLSBMb2NhbCBBY2Nlc3MgV2luZG93IEJhc2UgQWRkcmVzcyBSZWdpc3RlcgorICovCisjZGVmaW5lIExQQkFXCQkJMHgwMDIwCQkvKiBSZWdpc3RlciBvZmZzZXQgdG8gaW1tciAqLworI2RlZmluZSBMUENTMEFXCQkJMHgwMDI0CisjZGVmaW5lIExQQ1MxQVcJCQkweDAwMjgKKyNkZWZpbmUgTFBDUzJBVwkJCTB4MDAyQworI2RlZmluZSBMUENTM0FXCQkJMHgwMDMwCisjZGVmaW5lIExQQ1M0QVcJCQkweDAwMzQKKyNkZWZpbmUgTFBDUzVBVwkJCTB4MDAzOAorI2RlZmluZSBMUENTNkFXCQkJMHgwMDNDCisjZGVmaW5lIExQQ0E3QVcJCQkweDAwNDAKKyNkZWZpbmUgU1JBTUJBUgkJCTB4MDBDNAorCisjZGVmaW5lIExQQ19PRkZTRVQJCTB4MTAwMDAKKworI2RlZmluZSBDUzBfQ09ORklHCQkweDAwMDAwCisjZGVmaW5lIENTMV9DT05GSUcJCTB4MDAwMDQKKyNkZWZpbmUgQ1MyX0NPTkZJRwkJMHgwMDAwOAorI2RlZmluZSBDUzNfQ09ORklHCQkweDAwMDBDCisjZGVmaW5lIENTNF9DT05GSUcJCTB4MDAwMTAKKyNkZWZpbmUgQ1M1X0NPTkZJRwkJMHgwMDAxNAorI2RlZmluZSBDUzZfQ09ORklHCQkweDAwMDE4CisjZGVmaW5lIENTN19DT05GSUcJCTB4MDAwMUMKKworI2RlZmluZSBDU19DVFJMCQkJMHgwMDAyMAorI2RlZmluZSBDU19DVFJMX01FCQkweDAxMDAwMDAwCS8qIENTIE1hc3RlciBFbmFibGUgYml0ICovCisjZGVmaW5lIENTX0NUUkxfSUUJCTB4MDgwMDAwMDAJLyogQ1MgSW50ZXJydXB0IEVuYWJsZSBiaXQgKi8KKworLyogU1BSSURSIC0gU3lzdGVtIFBhcnQgYW5kIFJldmlzaW9uIElEIFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgU1BSSURSX1BBUlRJRAkJMHhGRkZGMDAwMAkvKiBQYXJ0IElkZW50aWZpY2F0aW9uICovCisjZGVmaW5lIFNQUklEUl9SRVZJRAkJMHgwMDAwRkZGRgkvKiBSZXZpc2lvbiBJZGVudGlmaWNhdGlvbiAqLworCisjZGVmaW5lIFNQUl81MTIxRQkJMHg4MDE4MDAwMAorCisvKiBTUENSIC0gU3lzdGVtIFByaW9yaXR5IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKyAqLworI2RlZmluZSBTUENSX1BDSUhQRQkJCTB4MTAwMDAwMDAJLyogUENJIEhpZ2hlc3QgUHJpb3JpdHkgRW5hYmxlICovCisjZGVmaW5lIFNQQ1JfUENJSFBFX1NISUZUCQkoMzEtMykKKyNkZWZpbmUgU1BDUl9QQ0lQUgkJCTB4MDMwMDAwMDAJLyogUENJIGJyaWRnZSBzeXN0ZW0gYnVzIHJlcXVlc3QgcHJpb3JpdHkgKi8KKyNkZWZpbmUgU1BDUl9QQ0lQUl9TSElGVAkJKDMxLTcpCisjZGVmaW5lIFNQQ1JfVEJFTgkJCTB4MDA0MDAwMDAJLyogRTMwMCBQb3dlclBDIGNvcmUgdGltZSBiYXNlIHVuaXQgZW5hYmxlICovCisjZGVmaW5lIFNQQ1JfVEJFTl9TSElGVAkJCSgzMS05KQorI2RlZmluZSBTUENSX0NPUkVQUgkJCTB4MDAzMDAwMDAJLyogRTMwMCBQb3dlclBDIENvcmUgc3lzdGVtIGJ1cyByZXF1ZXN0IHByaW9yaXR5ICovCisjZGVmaW5lIFNQQ1JfQ09SRVBSX1NISUZUCQkoMzEtMTEpCisKKy8qIFNXQ1JSIC0gU3lzdGVtIFdhdGNoZG9nIENvbnRyb2wgUmVnaXN0ZXIKKyAqLworI2RlZmluZSBTV0NSUgkJCQkweDA5MDQJCS8qIFJlZ2lzdGVyIG9mZnNldCB0byBpbW1yICovCisjZGVmaW5lIFNXQ1JSX1NXVEMJCQkweEZGRkYwMDAwCS8qIFNvZnR3YXJlIFdhdGNoZG9nIFRpbWUgQ291bnQgKi8KKyNkZWZpbmUgU1dDUlJfU1dFTgkJCTB4MDAwMDAwMDQJLyogV2F0Y2hkb2cgRW5hYmxlIGJpdCAqLworI2RlZmluZSBTV0NSUl9TV1JJCQkJMHgwMDAwMDAwMgkvKiBTb2Z0d2FyZSBXYXRjaGRvZyBSZXNldC9JbnRlcnJ1cHQgU2VsZWN0IGJpdCAqLworI2RlZmluZSBTV0NSUl9TV1BSCQkJMHgwMDAwMDAwMQkvKiBTb2Z0d2FyZSBXYXRjaGRvZyBDb3VudGVyIFByZXNjYWxlIGJpdCAqLworI2RlZmluZSBTV0NSUl9SRVMJCQl+KFNXQ1JSX1NXVEMgfCBTV0NSUl9TV0VOIHwgU1dDUlJfU1dSSSB8IFNXQ1JSX1NXUFIpCisKKy8qIFNXQ05SIC0gU3lzdGVtIFdhdGNoZG9nIENvdW50ZXIgUmVnaXN0ZXIKKyAqLworI2RlZmluZSBTV0NOUgkJCQkweDA5MDgJCS8qIFJlZ2lzdGVyIG9mZnNldCB0byBpbW1yICovCisjZGVmaW5lIFNXQ05SX1NXQ04JCQkweDAwMDBGRkZGCS8qIFNvZnR3YXJlIFdhdGNoZG9nIENvdW50IG1hc2sgKi8KKyNkZWZpbmUgU1dDTlJfUkVTCQkJfihTV0NOUl9TV0NOKQorCisvKiBTV1NSUiAtIFN5c3RlbSBXYXRjaGRvZyBTZXJ2aWNlIFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgU1dTUlIJCQkJMHgwOTBFCQkvKiBSZWdpc3RlciBvZmZzZXQgdG8gaW1tciAqLworCisvKiBBQ1IgLSBBcmJpdGVyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKyAqLworI2RlZmluZSBBQ1JfQ09SRURJUwkJCTB4MTAwMDAwMDAJLyogQ29yZSBkaXNhYmxlICovCisjZGVmaW5lIEFDUl9DT1JFRElTX1NISUZUCQkoMzEtNykKKyNkZWZpbmUgQUNSX1BJUEVfREVQCQkJMHgwMDA3MDAwMAkvKiBQaXBlbGluZSBkZXB0aCAqLworI2RlZmluZSBBQ1JfUElQRV9ERVBfU0hJRlQJCSgzMS0xNSkKKyNkZWZpbmUgQUNSX1BDSV9SUFRDTlQJCQkweDAwMDA3MDAwCS8qIFBDSSByZXBlYXQgY291bnQgKi8KKyNkZWZpbmUgQUNSX1BDSV9SUFRDTlRfU0hJRlQJCSgzMS0xOSkKKyNkZWZpbmUgQUNSX1JQVENOVAkJCTB4MDAwMDA3MDAJLyogUmVwZWF0IGNvdW50ICovCisjZGVmaW5lIEFDUl9SUFRDTlRfU0hJRlQJCSgzMS0yMykKKyNkZWZpbmUgQUNSX0FQQVJLCQkJMHgwMDAwMDAzMAkvKiBBZGRyZXNzIHBhcmtpbmcgKi8KKyNkZWZpbmUgQUNSX0FQQVJLX1NISUZUCQkJKDMxLTI3KQorI2RlZmluZSBBQ1JfUEFSS00JCQkweDAwMDAwMDBGCS8qIFBhcmtpbmcgbWFzdGVyICovCisjZGVmaW5lIEFDUl9QQVJLTV9TSElGVAkJCSgzMS0zMSkKKworLyogQVRSIC0gQXJiaXRlciBUaW1lcnMgUmVnaXN0ZXIKKyAqLworI2RlZmluZSBBVFJfRFRPCQkJCTB4MDBGRjAwMDAJLyogRGF0YSB0aW1lIG91dCAqLworI2RlZmluZSBBVFJfQVRPCQkJCTB4MDAwMDAwRkYJLyogQWRkcmVzcyB0aW1lIG91dCAqLworCisvKiBBRVIgLSBBcmJpdGVyIEV2ZW50IFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgQUVSX0VURUEJCQkweDAwMDAwMDIwCS8qIFRyYW5zZmVyIGVycm9yICovCisjZGVmaW5lIEFFUl9SRVMJCQkJMHgwMDAwMDAxMAkvKiBSZXNlcnZlZCB0cmFuc2ZlciB0eXBlICovCisjZGVmaW5lIEFFUl9FQ1cJCQkJMHgwMDAwMDAwOAkvKiBFeHRlcm5hbCBjb250cm9sIHdvcmQgdHJhbnNmZXIgdHlwZSAqLworI2RlZmluZSBBRVJfQU8JCQkJMHgwMDAwMDAwNAkvKiBBZGRyZXNzIE9ubHkgdHJhbnNmZXIgdHlwZSAqLworI2RlZmluZSBBRVJfRFRPCQkJCTB4MDAwMDAwMDIJLyogRGF0YSB0aW1lIG91dCAqLworI2RlZmluZSBBRVJfQVRPCQkJCTB4MDAwMDAwMDEJLyogQWRkcmVzcyB0aW1lIG91dCAqLworCisvKiBBRUFUUiAtIEFyYml0ZXIgRXZlbnQgQWRkcmVzcyBSZWdpc3RlcgorICovCisjZGVmaW5lIEFFQVRSX0VWRU5UCQkJMHgwNzAwMDAwMAkvKiBFdmVudCB0eXBlICovCisjZGVmaW5lIEFFQVRSX01TVFJfSUQJCQkweDAwMUYwMDAwCS8qIE1hc3RlciBJZCAqLworI2RlZmluZSBBRUFUUl9UQlNUCQkJMHgwMDAwMDgwMAkvKiBUcmFuc2ZlciBidXJzdCAqLworI2RlZmluZSBBRUFUUl9UU0laRQkJCTB4MDAwMDA3MDAJLyogVHJhbnNmZXIgU2l6ZSAqLworI2RlZmluZSBBRUFUUl9UVFlQRQkJCTB4MDAwMDAwMUYJLyogVHJhbnNmZXIgVHlwZSAqLworCisvKiBSU1IgLSBSZXNldCBTdGF0dXMgUmVnaXN0ZXIKKyAqLworI2RlZmluZSBSU1JfU1dTUgkJCTB4MDAwMDIwMDAJLyogc29mdHdhcmUgc29mdCByZXNldCAqLworI2RlZmluZSBSU1JfU1dTUl9TSElGVAkJCTEzCisjZGVmaW5lIFJTUl9TV0hSCQkJMHgwMDAwMTAwMAkvKiBzb2Z0d2FyZSBoYXJkIHJlc2V0ICovCisjZGVmaW5lIFJTUl9TV0hSX1NISUZUCQkJMTIKKyNkZWZpbmUgUlNSX0pIUlMJCQkweDAwMDAwMjAwCS8qIGp0YWcgaHJlc2V0ICovCisjZGVmaW5lIFJTUl9KSFJTX1NISUZUCQkJOQorI2RlZmluZSBSU1JfSlNSUwkJCTB4MDAwMDAxMDAJLyoganRhZyBzcmVzZXQgc3RhdHVzICovCisjZGVmaW5lIFJTUl9KU1JTX1NISUZUCQkJOAorI2RlZmluZSBSU1JfQ1NIUgkJCTB4MDAwMDAwMTAJLyogY2hlY2tzdG9wIHJlc2V0IHN0YXR1cyAqLworI2RlZmluZSBSU1JfQ1NIUl9TSElGVAkJCTQKKyNkZWZpbmUgUlNSX1NXUlMJCQkweDAwMDAwMDA4CS8qIHNvZnR3YXJlIHdhdGNoZG9nIHJlc2V0IHN0YXR1cyAqLworI2RlZmluZSBSU1JfU1dSU19TSElGVAkJCTMKKyNkZWZpbmUgUlNSX0JNUlMJCQkweDAwMDAwMDA0CS8qIGJ1cyBtb25pdG9wIHJlc2V0IHN0YXR1cyAqLworI2RlZmluZSBSU1JfQk1SU19TSElGVAkJCTIKKyNkZWZpbmUgUlNSX1NSUwkJCQkweDAwMDAwMDAyCS8qIHNvZnQgcmVzZXQgc3RhdHVzICovCisjZGVmaW5lIFJTUl9TUlNfU0hJRlQJCQkxCisjZGVmaW5lIFJTUl9IUlMJCQkJMHgwMDAwMDAwMQkvKiBoYXJkIHJlc2V0IHN0YXR1cyAqLworI2RlZmluZSBSU1JfSFJTX1NISUZUCQkJMAorI2RlZmluZSBSU1JfUkVTCQkJCX4oUlNSX1NXU1IgfCBSU1JfU1dIUiB8XAorCQkJCQkgUlNSX0pIUlMgfCBSU1JfSlNSUyB8IFJTUl9DU0hSIHwgUlNSX1NXUlMgfFwKKwkJCQkJIFJTUl9CTVJTIHwgUlNSX1NSUyB8IFJTUl9IUlMpCisvKiBSTVIgLSBSZXNldCBNb2RlIFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgUk1SX0NTUkUJCQkweDAwMDAwMDAxCS8qIGNoZWNrc3RvcCByZXNldCBlbmFibGUgKi8KKyNkZWZpbmUgUk1SX0NTUkVfU0hJRlQJCQkwCisjZGVmaW5lIFJNUl9SRVMJCQkJfihSTVJfQ1NSRSkKKworLyogUkNSIC0gUmVzZXQgQ29udHJvbCBSZWdpc3RlcgorICovCisjZGVmaW5lIFJDUl9TV0hSCQkJMHgwMDAwMDAwMgkvKiBzb2Z0d2FyZSBoYXJkIHJlc2V0ICovCisjZGVmaW5lIFJDUl9TV1NSCQkJMHgwMDAwMDAwMQkvKiBzb2Z0d2FyZSBzb2Z0IHJlc2V0ICovCisjZGVmaW5lIFJDUl9SRVMJCQkJfihSQ1JfU1dIUiB8IFJDUl9TV1NSKQorCisvKiBSQ0VSIC0gUmVzZXQgQ29udHJvbCBFbmFibGUgUmVnaXN0ZXIKKyAqLworI2RlZmluZSBSQ0VSX0NSRQkJCTB4MDAwMDAwMDEJLyogc29mdHdhcmUgaGFyZCByZXNldCAqLworI2RlZmluZSBSQ0VSX1JFUwkJCX4oUkNFUl9DUkUpCisKKy8qIFNQTVIgLSBTeXN0ZW0gUExMIE1vZGUgUmVnaXN0ZXIKKyAqLworI2RlZmluZSBTUE1SX1NQTUYJCQkweDBGMDAwMDAwCisjZGVmaW5lIFNQTVJfU1BNRl9TSElGVAkJCTI0CisjZGVmaW5lIFNQTVJfQ1BNRgkJCTB4MDAwRjAwMDAKKyNkZWZpbmUgU1BNUl9DUE1GX1NISUZUCQkJMTYKKworLyogU0NGUjEgU3lzdGVtIENsb2NrIEZyZXF1ZW5jeSBSZWdpc3RlciAxCisgKi8KKyNkZWZpbmUgU0NGUjFfSVBTX0RJVgkJCTB4MgorI2RlZmluZSBTQ0ZSMV9JUFNfRElWX01BU0sJCTB4MDM4MDAwMDAKKyNkZWZpbmUgU0NGUjFfSVBTX0RJVl9TSElGVAkJMjMKKworLyogU0NGUjIgU3lzdGVtIENsb2NrIEZyZXF1ZW5jeSBSZWdpc3RlciAyCisgKi8KKyNkZWZpbmUgU0NGUjJfU1lTX0RJVgkJCTB4RkMwMDAwMDAKKyNkZWZpbmUgU0NGUjJfU1lTX0RJVl9TSElGVAkJMjYKKworLyogU0NDUiAtIFN5c3RlbSBDbG9jayBDb250cm9sIFJlZ2lzdGVycworICovCisKKy8qIFN5c3RlbSBDbG9jayBDb250cm9sIFJlZ2lzdGVyIDEgY29tbWFuZHMgKi8KKyNkZWZpbmUgQ0xPQ0tfU0NDUjFfQ0ZHX0VOCQkweDgwMDAwMDAwCisjZGVmaW5lIENMT0NLX1NDQ1IxX0xQQ19FTgkJMHg0MDAwMDAwMAorI2RlZmluZSBDTE9DS19TQ0NSMV9ORkNfRU4JCTB4MjAwMDAwMDAKKyNkZWZpbmUgQ0xPQ0tfU0NDUjFfUEFUQV9FTgkJMHgxMDAwMDAwMAorI2RlZmluZSBDTE9DS19TQ0NSMV9QU0NfRU4oY24pCQkoMHgwODAwMDAwMCA+PiAoY24pKQorI2RlZmluZSBDTE9DS19TQ0NSMV9QU0NGSUZPX0VOCQkweDAwMDA4MDAwCisjZGVmaW5lIENMT0NLX1NDQ1IxX1NBVEFfRU4JCTB4MDAwMDQwMDAKKyNkZWZpbmUgQ0xPQ0tfU0NDUjFfRkVDX0VOCQkweDAwMDAyMDAwCisjZGVmaW5lIENMT0NLX1NDQ1IxX1RQUl9FTgkJMHgwMDAwMTAwMAorI2RlZmluZSBDTE9DS19TQ0NSMV9QQ0lfRU4JCTB4MDAwMDA4MDAKKyNkZWZpbmUgQ0xPQ0tfU0NDUjFfRERSX0VOCQkweDAwMDAwNDAwCisKKy8qIFN5c3RlbSBDbG9jayBDb250cm9sIFJlZ2lzdGVyIDIgY29tbWFuZHMgKi8KKyNkZWZpbmUgQ0xPQ0tfU0NDUjJfRElVX0VOCQkweDgwMDAwMDAwCisjZGVmaW5lIENMT0NLX1NDQ1IyX0FYRV9FTgkJMHg0MDAwMDAwMAorI2RlZmluZSBDTE9DS19TQ0NSMl9NRU1fRU4JCTB4MjAwMDAwMDAKKyNkZWZpbmUgQ0xPQ0tfU0NDUjJfVVNCMl9FTgkJMHgxMDAwMDAwMAorI2RlZmluZSBDTE9DS19TQ0NSMl9VU0IxX0VOCQkweDA4MDAwMDAwCisjZGVmaW5lIENMT0NLX1NDQ1IyX0kyQ19FTgkJMHgwNDAwMDAwMAorI2RlZmluZSBDTE9DS19TQ0NSMl9CRExDX0VOCQkweDAyMDAwMDAwCisjZGVmaW5lIENMT0NLX1NDQ1IyX1NESENfRU4JCTB4MDEwMDAwMDAKKyNkZWZpbmUgQ0xPQ0tfU0NDUjJfU1BESUZfRU4JCTB4MDA4MDAwMDAKKyNkZWZpbmUgQ0xPQ0tfU0NDUjJfTUJYX0JVU19FTgkJMHgwMDQwMDAwMAorI2RlZmluZSBDTE9DS19TQ0NSMl9NQlhfRU4JCTB4MDAyMDAwMDAKKyNkZWZpbmUgQ0xPQ0tfU0NDUjJfTUJYXzNEX0VOCQkweDAwMTAwMDAwCisjZGVmaW5lIENMT0NLX1NDQ1IyX0lJTV9FTgkJMHgwMDA4MDAwMAorCisvKiBQU0MgRklGTyBDb21tYW5kIHZhbHVlcyAqLworI2RlZmluZSBQU0NfRklGT19SRVNFVF9TTElDRQkJMHg4MAorI2RlZmluZSBQU0NfRklGT19FTkFCTEVfU0xJQ0UJCTB4MDEKKworLyogUFNDIEZJRk8gQ29udHJvbGxlciBDb21tYW5kIHZhbHVlcyAqLworI2RlZmluZSBGSUZPQ19FTkFCTEVfQ0xPQ0tfR0FURQkJMHgwMQorI2RlZmluZSBGSUZPQ19ESVNBQkxFX0NMT0NLX0dBVEUJMHgwMAorCisvKiBQU0MgRklGTyBzdGF0dXMgKi8KKyNkZWZpbmUgUFNDX0ZJRk9fRU1QVFkJCQkweDAxCisKKy8qIFBTQyBDb21tYW5kIHZhbHVlcyAqLworI2RlZmluZSBQU0NfUlhfRU5BQkxFCQkweDAxCisjZGVmaW5lIFBTQ19SWF9ESVNBQkxFCQkweDAyCisjZGVmaW5lIFBTQ19UWF9FTkFCTEUJCTB4MDQKKyNkZWZpbmUgUFNDX1RYX0RJU0FCTEUJCTB4MDgKKyNkZWZpbmUgUFNDX1NFTF9NT0RFX1JFR18xCTB4MTAKKyNkZWZpbmUgUFNDX1JTVF9SWAkJMHgyMAorI2RlZmluZSBQU0NfUlNUX1RYCQkweDMwCisjZGVmaW5lIFBTQ19SU1RfRVJSX1NUQVQJMHg0MAorI2RlZmluZSBQU0NfUlNUX0JSS19DSEdfSU5UCTB4NTAKKyNkZWZpbmUgUFNDX1NUQVJUX0JSSwkJMHg2MAorI2RlZmluZSBQU0NfU1RPUF9CUksJCTB4NzAKKworLyogUFNDIHN0YXR1cyByZWdpc3RlciBiaXRzICovCisjZGVmaW5lIFBTQ19TUl9DREUJCTB4MDA4MAorI2RlZmluZSBQU0NfU1JfVFhFTVAJCTB4MDgwMAorI2RlZmluZSBQU0NfU1JfT0UJCTB4MTAwMAorI2RlZmluZSBQU0NfU1JfUEUJCTB4MjAwMAorI2RlZmluZSBQU0NfU1JfRkUJCTB4NDAwMAorI2RlZmluZSBQU0NfU1JfUkIJCTB4ODAwMAorCisvKiBQU0MgbW9kZSBmaWVsZHMgKi8KKyNkZWZpbmUgUFNDX01PREVfNV9CSVRTCQkweDAwCisjZGVmaW5lIFBTQ19NT0RFXzZfQklUUwkJMHgwMQorI2RlZmluZSBQU0NfTU9ERV83X0JJVFMJCTB4MDIKKyNkZWZpbmUgUFNDX01PREVfOF9CSVRTCQkweDAzCisjZGVmaW5lIFBTQ19NT0RFX1BBUkVWRU4JMHgwMAorI2RlZmluZSBQU0NfTU9ERV9QQVJPREQJCTB4MDQKKyNkZWZpbmUgUFNDX01PREVfUEFSRk9SQ0UJMHgwOAorI2RlZmluZSBQU0NfTU9ERV9QQVJOT05FCTB4MTAKKyNkZWZpbmUgUFNDX01PREVfRU5USU1FT1VUCTB4MjAKKyNkZWZpbmUgUFNDX01PREVfUlhSVFMJCTB4ODAKKyNkZWZpbmUgUFNDX01PREVfMV9TVE9QQklUCTB4MDcKKworLyoKKyAqIENlbnRyYWxpemVkIEZJRk8gQ29udHJvbGxlciBoYXMgaW50ZXJuYWwgbWVtb3J5IGZvciBhbGwgMTIgUFNDcyBGSUZPcworICoKKyAqIE5PVEU6IGluZGl2aWR1YWwgUFNDIHVuaXRzIGFyZSBmcmVlIHRvIHVzZSB3aGF0ZXZlciBhcmVhIChhbmQgc2l6ZSkgb2YgdGhlCisgKiBGSUZPQyBpbnRlcm5hbCBtZW1vcnksIHNvIG1ha2Ugc3VyZSBtZW1vcnkgYXJlYXMgZm9yIEZJRk8gc2xpY2VzIHVzZWQgYnkKKyAqIGRpZmZlcmVudCBQU0NzIGRvIG5vdCBvdmVybGFwIQorICoKKyAqIE92ZXJhbGwgc2l6ZSBvZiBGSUZPQyBtZW1vcnkgaXMgbm90IGRvY3VtZW50ZWQgaW4gdGhlIE1QQzUxMjFlIFJNLCBidXQKKyAqIHRlc3RzIGluZGljYXRlIHRoYXQgaXQgaXMgMTAyNCB3b3JkcyB0b3RhbC4KKyAqLworI2RlZmluZSBGSUZPQ19QU0MwX1RYX1NJWkUJMHgwCS8qIG51bWJlciBvZiA0LWJ5dGUgd29yZHMgZm9yIEZJRk8gc2xpY2UgKi8KKyNkZWZpbmUgRklGT0NfUFNDMF9UWF9BRERSCTB4MAorI2RlZmluZSBGSUZPQ19QU0MwX1JYX1NJWkUJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzBfUlhfQUREUgkweDAKKworI2RlZmluZSBGSUZPQ19QU0MxX1RYX1NJWkUJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzFfVFhfQUREUgkweDAKKyNkZWZpbmUgRklGT0NfUFNDMV9SWF9TSVpFCTB4MAorI2RlZmluZSBGSUZPQ19QU0MxX1JYX0FERFIJMHgwCisKKyNkZWZpbmUgRklGT0NfUFNDMl9UWF9TSVpFCTB4MAorI2RlZmluZSBGSUZPQ19QU0MyX1RYX0FERFIJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzJfUlhfU0laRQkweDAKKyNkZWZpbmUgRklGT0NfUFNDMl9SWF9BRERSCTB4MAorCisjZGVmaW5lIEZJRk9DX1BTQzNfVFhfU0laRQkweDA0CisjZGVmaW5lIEZJRk9DX1BTQzNfVFhfQUREUgkweDAKKyNkZWZpbmUgRklGT0NfUFNDM19SWF9TSVpFCTB4MDQKKyNkZWZpbmUgRklGT0NfUFNDM19SWF9BRERSCTB4MTAKKworI2RlZmluZSBGSUZPQ19QU0M0X1RYX1NJWkUJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzRfVFhfQUREUgkweDAKKyNkZWZpbmUgRklGT0NfUFNDNF9SWF9TSVpFCTB4MAorI2RlZmluZSBGSUZPQ19QU0M0X1JYX0FERFIJMHgwCisKKyNkZWZpbmUgRklGT0NfUFNDNV9UWF9TSVpFCTB4MAorI2RlZmluZSBGSUZPQ19QU0M1X1RYX0FERFIJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzVfUlhfU0laRQkweDAKKyNkZWZpbmUgRklGT0NfUFNDNV9SWF9BRERSCTB4MAorCisjZGVmaW5lIEZJRk9DX1BTQzZfVFhfU0laRQkweDAKKyNkZWZpbmUgRklGT0NfUFNDNl9UWF9BRERSCTB4MAorI2RlZmluZSBGSUZPQ19QU0M2X1JYX1NJWkUJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzZfUlhfQUREUgkweDAKKworI2RlZmluZSBGSUZPQ19QU0M3X1RYX1NJWkUJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzdfVFhfQUREUgkweDAKKyNkZWZpbmUgRklGT0NfUFNDN19SWF9TSVpFCTB4MAorI2RlZmluZSBGSUZPQ19QU0M3X1JYX0FERFIJMHgwCisKKyNkZWZpbmUgRklGT0NfUFNDOF9UWF9TSVpFCTB4MAorI2RlZmluZSBGSUZPQ19QU0M4X1RYX0FERFIJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzhfUlhfU0laRQkweDAKKyNkZWZpbmUgRklGT0NfUFNDOF9SWF9BRERSCTB4MAorCisjZGVmaW5lIEZJRk9DX1BTQzlfVFhfU0laRQkweDAKKyNkZWZpbmUgRklGT0NfUFNDOV9UWF9BRERSCTB4MAorI2RlZmluZSBGSUZPQ19QU0M5X1JYX1NJWkUJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzlfUlhfQUREUgkweDAKKworI2RlZmluZSBGSUZPQ19QU0MxMF9UWF9TSVpFCTB4MAorI2RlZmluZSBGSUZPQ19QU0MxMF9UWF9BRERSCTB4MAorI2RlZmluZSBGSUZPQ19QU0MxMF9SWF9TSVpFCTB4MAorI2RlZmluZSBGSUZPQ19QU0MxMF9SWF9BRERSCTB4MAorCisjZGVmaW5lIEZJRk9DX1BTQzExX1RYX1NJWkUJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzExX1RYX0FERFIJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzExX1JYX1NJWkUJMHgwCisjZGVmaW5lIEZJRk9DX1BTQzExX1JYX0FERFIJMHgwCisKKy8qIElPIENvbnRyb2wgUmVnaXN0ZXIKKyAqLworCisvKiBJbmRleGVzIGluIHJlZ3MgYXJyYXkgKi8KKyNkZWZpbmUgTUVNX0lEWAkJCTB4MDAKKyNkZWZpbmUgU1BESUZfVFhDTE9DS19JRFgJMHg3MworI2RlZmluZSBTUERJRl9UWF9JRFgJCTB4NzQKKyNkZWZpbmUgU1BESUZfUlhfSURYCQkweDc1CisjZGVmaW5lIFBTQzBfMF9JRFgJCTB4ODMKKyNkZWZpbmUgUFNDMF8xX0lEWAkJMHg4NAorI2RlZmluZSBQU0MwXzJfSURYCQkweDg1CisjZGVmaW5lIFBTQzBfM19JRFgJCTB4ODYKKyNkZWZpbmUgUFNDMF80X0lEWAkJMHg4NworI2RlZmluZSBQU0MxXzBfSURYCQkweDg4CisjZGVmaW5lIFBTQzFfMV9JRFgJCTB4ODkKKyNkZWZpbmUgUFNDMV8yX0lEWAkJMHg4YQorI2RlZmluZSBQU0MxXzNfSURYCQkweDhiCisjZGVmaW5lIFBTQzFfNF9JRFgJCTB4OGMKKyNkZWZpbmUgUFNDMl8wX0lEWAkJMHg4ZAorI2RlZmluZSBQU0MyXzFfSURYCQkweDhlCisjZGVmaW5lIFBTQzJfMl9JRFgJCTB4OGYKKyNkZWZpbmUgUFNDMl8zX0lEWAkJMHg5MAorI2RlZmluZSBQU0MyXzRfSURYCQkweDkxCisKKyNkZWZpbmUgSU9DVFJMX0ZVTkNNVVhfU0hJRlQJNworI2RlZmluZSBJT0NUUkxfRlVOQ01VWF9GRUMJMQorI2RlZmluZSBJT0NUUkxfTVVYX0ZFQwkJKElPQ1RSTF9GVU5DTVVYX0ZFQyA8PCBJT0NUUkxfRlVOQ01VWF9TSElGVCkKKworLyogU2V0IGZvciBERFIgKi8KKyNkZWZpbmUgSU9DVFJMX01VWF9ERFIJCTB4MDAwMDAwMzYKKworIC8qIFJlZ2lzdGVyIE9mZnNldCBCYXNlICovCisjZGVmaW5lIE1QQzUxMlhfRkVDCQkoQ0ZHX0lNTVIgKyAweDAyODAwKQorCisvKiBOdW1iZXIgb2YgSTJDIGJ1c2VzICovCisjZGVmaW5lIEkyQ19CVVNfQ05UCTMKKworLyogSTJDbiBjb250cm9sIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgSTJDX0VOCQkweDgwCisjZGVmaW5lIEkyQ19JRU4JCTB4NDAKKyNkZWZpbmUgSTJDX1NUQQkJMHgyMAorI2RlZmluZSBJMkNfVFgJCTB4MTAKKyNkZWZpbmUgSTJDX1RYQUsJMHgwOAorI2RlZmluZSBJMkNfUlNUQQkweDA0CisjZGVmaW5lIEkyQ19JTklUX01BU0sJKEkyQ19FTiB8IEkyQ19TVEEgfCBJMkNfVFggfCBJMkNfUlNUQSkKKworLyogSTJDbiBzdGF0dXMgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBJMkNfQ0YJCTB4ODAKKyNkZWZpbmUgSTJDX0FBUwkJMHg0MAorI2RlZmluZSBJMkNfQkIJCTB4MjAKKyNkZWZpbmUgSTJDX0FMCQkweDEwCisjZGVmaW5lIEkyQ19TUlcJCTB4MDQKKyNkZWZpbmUgSTJDX0lGCQkweDAyCisjZGVmaW5lIEkyQ19SWEFLCTB4MDEKKworI2VuZGlmCS8qIF9fTVBDNTEyWF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXBjNXh4LmggYi9pbmNsdWRlL21wYzV4eC5oCmluZGV4IDc1MDhmNmQuLjQxNDY1MWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbXBjNXh4LmgKKysrIGIvaW5jbHVkZS9tcGM1eHguaApAQCAtMzYsNiArMzYsNyBAQAogICogRXhjZXB0aW9uIG9mZnNldHMgKFBvd2VyUEMgc3RhbmRhcmQpCiAgKi8KICNkZWZpbmUgRVhDX09GRl9TWVNfUkVTRVQJMHgwMTAwCS8qIFN5c3RlbSByZXNldAkJCQkqLworI2RlZmluZSBfU1RBUlRfT0ZGU0VUCQlFWENfT0ZGX1NZU19SRVNFVAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBJU0IgYml0IGluIElNTVIgdG8gc2V0IGludGVybmFsIG1lbW9yeSBtYXAKQEAgLTc1LDEwICs3NiwxMCBAQAogI2RlZmluZSBTSVVNQ1JfREJQQzAxCTB4MDAwODAwMDAJLyogLSAiIC0JCQkJKi8KICNkZWZpbmUgU0lVTUNSX0RCUEMxMAkweDAwMTAwMDAwCS8qIC0gIiAtCQkJCSovCiAjZGVmaW5lIFNJVU1DUl9EQlBDMTEJMHgwMDE4MDAwMAkvKiAtICIgLQkJCQkqLwotI2RlZmluZSBTSVVNQ1JfR1BDMDAJMHgwMDAwMDAwMAkvKiBHZW5lcmFsIFBpbnMgQ29uZmlnIAkJCSovCi0jZGVmaW5lIFNJVU1DUl9HUEMwMQkweDAwMDIwMDAwCS8qIEdlbmVyYWwgUGlucyBDb25maWcgCQkJKi8KLSNkZWZpbmUgU0lVTUNSX0dQQzEwCTB4MDAwNDAwMDAJLyogR2VuZXJhbCBQaW5zIENvbmZpZyAJCQkqLwotI2RlZmluZSBTSVVNQ1JfR1BDMTEJMHgwMDA2MDAwMAkvKiBHZW5lcmFsIFBpbnMgQ29uZmlnIAkJCSovCisjZGVmaW5lIFNJVU1DUl9HUEMwMAkweDAwMDAwMDAwCS8qIEdlbmVyYWwgUGlucyBDb25maWcJCQkqLworI2RlZmluZSBTSVVNQ1JfR1BDMDEJMHgwMDAyMDAwMAkvKiBHZW5lcmFsIFBpbnMgQ29uZmlnCQkJKi8KKyNkZWZpbmUgU0lVTUNSX0dQQzEwCTB4MDAwNDAwMDAJLyogR2VuZXJhbCBQaW5zIENvbmZpZwkJCSovCisjZGVmaW5lIFNJVU1DUl9HUEMxMQkweDAwMDYwMDAwCS8qIEdlbmVyYWwgUGlucyBDb25maWcJCQkqLwogI2RlZmluZSBTSVVNQ1JfRExLCTB4MDAwMTAwMDAJLyogRGVidWcgUmVnaXN0ZXIgTG9jawkJCSovCiAjZGVmaW5lIFNJVU1DUl9TQzAwCTB4MDAwMDAwMDAJLyogTXVsdGkgQ2hpcCAzMiBiaXQJCQkqLwogI2RlZmluZSBTSVVNQ1JfU0MwMQkweDAwMDA0MDAwCS8qIE11aWx0IENoaXAgMTYgYml0CQkJKi8KQEAgLTg5LDcgKzkwLDcgQEAKICNkZWZpbmUgU0lVTUNSX01MUkMwMQkweDAwMDAwNDAwCS8qIC0gIiAtCQkJCSovCiAjZGVmaW5lIFNJVU1DUl9NTFJDMTAJMHgwMDAwMDgwMAkvKiAtICIgLQkJCQkqLwogI2RlZmluZSBTSVVNQ1JfTUxSQzExCTB4MDAwMDBjMDAJLyogLSAiIC0JCQkJKi8KLSNkZWZpbmUgU0lVTUNSX01UU0MJMHgwMDAwMDEwMAkvKiBNZW1vcnkgdHJhbnNmZXIgICAgICAJCSovCisjZGVmaW5lIFNJVU1DUl9NVFNDCTB4MDAwMDAxMDAJLyogTWVtb3J5IHRyYW5zZmVyCQkJKi8KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogVEJTQ1IgLSBUaW1lIEJhc2UgU3RhdHVzIGFuZCBDb250cm9sIFJlZ2lzdGVyCkBAIC0xMjIsMTMgKzEyMywxMyBAQAogICogU0NDUiAtIFN5c3RlbSBDbG9jayBhbmQgcmVzZXQgQ29udHJvbCBSZWdpc3RlcgogICovCiAjZGVmaW5lIFNDQ1JfREZOTF9NU0sJMHgwMDAwMDA3MAkvKiBERk5MIG1hc2sJCQkJKi8KLSNkZWZpbmUgU0NDUl9ERk5IX01TSwkweDAwMDAwMDA3ICAJLyogREZOSCBtYXNrCQkJCSovCisjZGVmaW5lIFNDQ1JfREZOSF9NU0sJMHgwMDAwMDAwNwkvKiBERk5IIG1hc2sJCQkJKi8KICNkZWZpbmUgU0NDUl9ERk5MX1NISUZUIDB4MDAwMDAwNAkvKiBERk5MIHNoaWZ0IHZhbHVlCQkJKi8KICNkZWZpbmUgU0NDUl9SVFNFTAkweDAwMTAwMDAwCS8qIFJUQyBjaXJjdWl0IGlucHV0IHNvdXJjZSBzZWxlY3QJKi8KICNkZWZpbmUgU0NDUl9FQkRGMDAJMHgwMDAwMDAwMAkvKiBEaXZpc2lvbiBmYWN0b3IgMS4gQ0xLT1VUIGlzIEdDTEsyICAgKi8KICNkZWZpbmUgU0NDUl9FQkRGMTEJMHgwMDA2MDAwMAkvKiByZXNlcnZlZAkJCQkqLwogI2RlZmluZSBTQ0NSX1RCUwkweDAyMDAwMDAwCS8qIFRpbWUgQmFzZSBTb3VyY2UJCQkqLwotI2RlZmluZSBTQ0NSX1JURElWCTB4MDEwMDAwMDAJLyogUlRDIENsb2NrIERpdmlkZSAJCQkqLworI2RlZmluZSBTQ0NSX1JURElWCTB4MDEwMDAwMDAJLyogUlRDIENsb2NrIERpdmlkZQkJCSovCiAjZGVmaW5lIFNDQ1JfQ09NMDAJMHgwMDAwMDAwMAkvKiBmdWxsIHN0cmVuZ3RoIENMS09VVCBvdXRwdXQgYnVmZmVyCSovCiAjZGVmaW5lIFNDQ1JfQ09NMDEJMHgyMDAwMDAwMAkvKiBoYWxmIHN0cmVuZ3RoIENMS09VVCBvdXRwdXQgYnVmZmVyCSovCiAjZGVmaW5lIFNDQ1JfREZOTDAwMAkweDAwMDAwMDAwCS8qIERpdmlzaW9uIGJ5IDIgKGRlZmF1bHQgPSBtaW5pbXVtKQkqLwpAQCAtMTM3LDExICsxMzgsMTEgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIE1DIC0gTWVtb3J5IENvbnRyb2xsZXIKICAqLwotI2RlZmluZSBCUl9WCQkweDAwMDAwMDAxCS8qIEJhbmsgdmFsaWQgCQkJCSovCi0jZGVmaW5lIEJSX0JJCQkweDAwMDAwMDAyCS8qIEJ1cnN0IGluaGliaXQgCQkJKi8KLSNkZWZpbmUgQlJfUFNfOAkJMHgwMDAwMDQwMAkvKiA4IGJpdCBwb3J0IHNpemUgCQkJKi8KLSNkZWZpbmUgQlJfUFNfMTYJMHgwMDAwMDgwMAkvKiAxNiBiaXQgcG9ydCBzaXplIAkJCSovCi0jZGVmaW5lIEJSX1BTXzMyCTB4MDAwMDAwMDAJLyogMzIgYml0IHBvcnQgc2l6ZSAJCQkqLworI2RlZmluZSBCUl9WCQkweDAwMDAwMDAxCS8qIEJhbmsgdmFsaWQJCQkJKi8KKyNkZWZpbmUgQlJfQkkJCTB4MDAwMDAwMDIJLyogQnVyc3QgaW5oaWJpdAkJCSovCisjZGVmaW5lIEJSX1BTXzgJCTB4MDAwMDA0MDAJLyogOCBiaXQgcG9ydCBzaXplCQkJKi8KKyNkZWZpbmUgQlJfUFNfMTYJMHgwMDAwMDgwMAkvKiAxNiBiaXQgcG9ydCBzaXplCQkJKi8KKyNkZWZpbmUgQlJfUFNfMzIJMHgwMDAwMDAwMAkvKiAzMiBiaXQgcG9ydCBzaXplCQkJKi8KICNkZWZpbmUgQlJfTEJESVIJMHgwMDAwMDAwOAkvKiBMYXRlIGJ1cnN0IGRhdGEgaW4gcHJvZ2VzcwkJKi8KICNkZWZpbmUgQlJfU0VUQQkJMHgwMDAwMDAwNAkvKiBFeHRlcm5hbCBEYXRhIEFja25vd2xlZGdlCQkqLwogI2RlZmluZSBPUl9TQ1lfMwkweDAwMDAwMDMwCS8qIDMgY2xvY2sgY3ljbGVzIHdhaXQgc3RhdGVzCQkqLwpAQCAtMTU4LDggKzE1OSw4IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBVTUNSIC0gVUlNQiBNb2R1bGUgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgogICovCi0jZGVmaW5lIFVNQ1JfRlNQRUVEIAkweDAwMDAwMDAwCS8qIEZ1bGwgc3BlZWQuIE9wcG9zaXQgb2YgVU1DUl9IU1BFRUQJKi8KLSNkZWZpbmUgVU1DUl9IU1BFRUQgCTB4MTAwMDAwMDAJLyogSGFsZiBzcGVlZAkJCQkqLworI2RlZmluZSBVTUNSX0ZTUEVFRAkweDAwMDAwMDAwCS8qIEZ1bGwgc3BlZWQuIE9wcG9zaXQgb2YgVU1DUl9IU1BFRUQJKi8KKyNkZWZpbmUgVU1DUl9IU1BFRUQJMHgxMDAwMDAwMAkvKiBIYWxmIHNwZWVkCQkJCSovCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIElDVFJMIC0gSS1CdXMgU3VwcG9ydCBDb250cm9sIFJlZ2lzdGVyCkBAIC0xNzMsMTYgKzE3NCwxNiBAQAogICogU0NJIC0gU2VyaWFsIGNvbW11bmljYXRpb24gaW50ZXJmYWNlCiAgKi8KIAotI2RlZmluZSBTQ0lfVERSRQkweDAxMDAJCS8qIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgCSovCi0jZGVmaW5lIFNDSV9URQkJMHgwMDA4CQkvKiBUcmFuc21pdHRlciBlbmFibGVkIAkJCSovCisjZGVmaW5lIFNDSV9URFJFCTB4MDEwMAkJLyogVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eQkJKi8KKyNkZWZpbmUgU0NJX1RFCQkweDAwMDgJCS8qIFRyYW5zbWl0dGVyIGVuYWJsZWQJCQkqLwogI2RlZmluZSBTQ0lfUkUJCTB4MDAwNAkJLyogUmVjZWl2ZXIgZW5hYmxlZAkJCSovCi0jZGVmaW5lIFNDSV9SRFJGCTB4MDA0MAkJLyogUmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIGZ1bGwgCQkqLwotI2RlZmluZSBTQ0lfUEUJCTB4MDQwMAkJLyogUGFyaXR5IGVuYWJsZSAJCQkqLwotI2RlZmluZSBTQ0lfU0NYQlJfTUsJMHgxZmZmCQkvKiBCYXVkcmF0ZSBtYXNrIAkJCSovCi0jZGVmaW5lIFNDSV9TQ1hEUl9NSwkweDAwZmYJCS8qIERhdGEgcmVnaXN0ZXIgbWFzayAJCQkqLworI2RlZmluZSBTQ0lfUkRSRgkweDAwNDAJCS8qIFJlY2VpdmUgZGF0YSByZWdpc3RlciBmdWxsCQkqLworI2RlZmluZSBTQ0lfUEUJCTB4MDQwMAkJLyogUGFyaXR5IGVuYWJsZQkJCSovCisjZGVmaW5lIFNDSV9TQ1hCUl9NSwkweDFmZmYJCS8qIEJhdWRyYXRlIG1hc2sJCQkqLworI2RlZmluZSBTQ0lfU0NYRFJfTUsJMHgwMGZmCQkvKiBEYXRhIHJlZ2lzdGVyIG1hc2sJCQkqLwogI2RlZmluZSBTQ0lfTV8xMQkweDAyMDAJCS8qIEZyYW1lIHNpemUgaXMgMTEgYml0CQkJKi8KICNkZWZpbmUgU0NJX01fMTAJMHgwMDAwCQkvKiBGcmFtZSBzaXplIGlzIDEwIGJpdAkJCSovCi0jZGVmaW5lIFNDSV9QT1JUXzEJKChpbnQpMSkJLyogUGxhY2UgdGhpcyBsYXRlciBzb21ld2hlcmUgYmV0dGVyIAkqLworI2RlZmluZSBTQ0lfUE9SVF8xCSgoaW50KTEpCS8qIFBsYWNlIHRoaXMgbGF0ZXIgc29tZXdoZXJlIGJldHRlcgkqLwogI2RlZmluZSBTQ0lfUE9SVF8yCSgoaW50KTIpCiAKICNlbmRpZgkvKiBfX01QQzVYWF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXBjNXh4eC5oIGIvaW5jbHVkZS9tcGM1eHh4LmgKaW5kZXggMDg5YWExMy4uYTQ1ODFhMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tcGM1eHh4LmgKKysrIGIvaW5jbHVkZS9tcGM1eHh4LmgKQEAgLTM5LDYgKzM5LDcgQEAKIAogLyogRXhjZXB0aW9uIG9mZnNldHMgKFBvd2VyUEMgc3RhbmRhcmQpICovCiAjZGVmaW5lIEVYQ19PRkZfU1lTX1JFU0VUCTB4MDEwMAorI2RlZmluZSBfU1RBUlRfT0ZGU0VUCQlFWENfT0ZGX1NZU19SRVNFVAogCiAvKiB1c2VmdWwgbWFjcm9zIGZvciBtYW5pcHVsYXRpbmcgQ1N4X1NUQVJUL1NUT1AgKi8KICNpZiBkZWZpbmVkKENPTkZJR19NR1Q1MTAwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcGM4MjIwLmggYi9pbmNsdWRlL21wYzgyMjAuaAppbmRleCBmZjdhY2M2Li5kM2IxNDU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL21wYzgyMjAuaAorKysgYi9pbmNsdWRlL21wYzgyMjAuaApAQCAtMzUsNiArMzUsNyBAQAogCiAvKiBFeGNlcHRpb24gb2Zmc2V0cyAoUG93ZXJQQyBzdGFuZGFyZCkgKi8KICNkZWZpbmUgRVhDX09GRl9TWVNfUkVTRVQgICAweDAxMDAKKyNkZWZpbmUgX1NUQVJUX09GRlNFVAlFWENfT0ZGX1NZU19SRVNFVAogCiAvKiBJbnRlcm5hbCBtZW1vcnkgbWFwICovCiAvKiBNUEM4MjIwIEludGVybmFsIFJlZ2lzdGVyIE1NQVAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXBjODI0eC5oIGIvaW5jbHVkZS9tcGM4MjR4LmgKaW5kZXggMzBmYzc5NS4uMzBmMDFkNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tcGM4MjR4LmgKKysrIGIvaW5jbHVkZS9tcGM4MjR4LmgKQEAgLTg4LDcgKzg4LDcgQEAKICNkZWZpbmUJUFJFUF9QQ0lfTUVNT1JZX0JVUwkweDgwMDAwMDAwCiAjZGVmaW5lCVBSRVBfUENJX01FTU9SWV9TSVpFCTB4ODAwMDAwMDAKICNkZWZpbmUgTVBDMTA3X1BDSV9DTUQJCTB4ODAwMDAwMDQJLyogTVBDMTA3IFBDSSBjbWQgcmVnICovCi0jZGVmaW5lIE1QQzEwN19QQ0lfU1RBVCAJMHg4MDAwMDAwNgkvKiBNUEMxMDcgUENJIHN0YXR1cyByZWcgKi8KKyNkZWZpbmUgTVBDMTA3X1BDSV9TVEFUCQkweDgwMDAwMDA2CS8qIE1QQzEwNyBQQ0kgc3RhdHVzIHJlZyAqLwogI2RlZmluZSBQUk9DX0lOVDFfQURSCQkweDgwMDAwMGE4CS8qIE1QQzEwNyBQcm9jZXNzb3IgaS9mIGNmZzEgKi8KICNkZWZpbmUgUFJPQ19JTlQyX0FEUgkJMHg4MDAwMDBhYwkvKiBNUEMxMDcgUHJvY2Vzc29yIGkvZiBjZmcyICovCiAjZGVmaW5lIE1FTV9DT05UMV9BRFIJCTB4ODAwMDAwZjAJLyogTVBDMTA3IE1lbW9yeSBjb250cm9sIGNvbmZpZy4gMSAqLwpAQCAtOTgsOCArOTgsOCBAQAogI2RlZmluZSBNRU1fRVJSRU4xX0FEUgkJMHg4MDAwMDBjMAkvKiBNUEMxMDcgTWVtb3J5IGVycm9yIGVuYWJsZSAxICovCiAjZGVmaW5lIE1FTV9TVEFSVDFfQURSCQkweDgwMDAwMDgwCS8qIE1QQzEwNyBNZW1vcnkgc3RhcnRpbmcgYWRkciAqLwogI2RlZmluZSBNRU1fU1RBUlQyX0FEUgkJMHg4MDAwMDA4NAkvKiBNUEMxMDcgTWVtb3J5IHN0YXJ0aW5nIGFkZHItbG8gKi8KLSNkZWZpbmUgWE1FTV9TVEFSVDFfQURSIAkweDgwMDAwMDg4CS8qIE1QQzEwNyBFeHRlbmRlZCBtZW0uIHN0YXJ0IGFkZHItaGkqLwotI2RlZmluZSBYTUVNX1NUQVJUMl9BRFIgCTB4ODAwMDAwOGMJLyogTVBDMTA3IEV4dGVuZGVkIG1lbS4gc3RhcnQgYWRkci1sbyovCisjZGVmaW5lIFhNRU1fU1RBUlQxX0FEUgkJMHg4MDAwMDA4OAkvKiBNUEMxMDcgRXh0ZW5kZWQgbWVtLiBzdGFydCBhZGRyLWhpKi8KKyNkZWZpbmUgWE1FTV9TVEFSVDJfQURSCQkweDgwMDAwMDhjCS8qIE1QQzEwNyBFeHRlbmRlZCBtZW0uIHN0YXJ0IGFkZHItbG8qLwogI2RlZmluZSBNRU1fRU5EMV9BRFIJCTB4ODAwMDAwOTAJLyogTVBDMTA3IE1lbW9yeSBlbmRpbmcgYWRkcmVzcyAqLwogI2RlZmluZSBNRU1fRU5EMl9BRFIJCTB4ODAwMDAwOTQJLyogTVBDMTA3IE1lbW9yeSBlbmRpbmcgYWRkci1sbyAqLwogI2RlZmluZSBYTUVNX0VORDFfQURSCQkweDgwMDAwMDk4CS8qIE1QQzEwNyBFeHRlbmRlZCBtZW0uIGVuZCBhZGRycy1oaSAqLwpAQCAtMTQyLDYgKzE0Miw4IEBACiAjZGVmaW5lIEVYQ19PRkZfSk1EREkJCTB4MTYwMAkvKiBKYXZhIE1vZGUgZGVub3JtIGRldGVjdCBJbnRlcnIgLS0gV1RGPz8qLwogI2RlZmluZSBFWENfT0ZGX1JNVEUJCTB4MjAwMAkvKiBSdW4gTW9kZSBvciBUcmFjZSBFeGNlcHRpb24gKi8KIAorI2RlZmluZSBfU1RBUlRfT0ZGU0VUCQlFWENfT0ZGX1NZU19SRVNFVAorCiAjZGVmaW5lIE1BUF9BX0NPTkZJR19BRERSX0hJR0gJMHg4MDAwCS8qIFVwcGVyIGhhbGYgb2YgQ09ORklHX0FERFIgZm9yIE1hcCBBICovCiAjZGVmaW5lIE1BUF9BX0NPTkZJR19BRERSX0xPVwkweDBDRjgJLyogTG93ZXIgaGFsZiBvZiBDT05GSUdfQUREUiBmb3IgTWFwIEEgKi8KICNkZWZpbmUgTUFQX0FfQ09ORklHX0RBVEFfSElHSAkweDgwMDAJLyogVXBwZXIgaGFsZiBvZiBDT05GSUdfREFUIGZvciBNYXAgQSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcGM4MjYwLmggYi9pbmNsdWRlL21wYzgyNjAuaAppbmRleCBkOWRkOTJkLi4wNTI1Mjk0IDEwMDY0NAotLS0gYS9pbmNsdWRlL21wYzgyNjAuaAorKysgYi9pbmNsdWRlL21wYzgyNjAuaApAQCAtNTMsNyArNTMsNyBAQAogICogRXhjZXB0aW9uIG9mZnNldHMgKFBvd2VyUEMgc3RhbmRhcmQpCiAgKi8KICNkZWZpbmUgRVhDX09GRl9TWVNfUkVTRVQJMHgwMTAwCS8qIFN5c3RlbSByZXNldAkJCSovCi0KKyNkZWZpbmUgX1NUQVJUX09GRlNFVAkJRVhDX09GRl9TWVNfUkVTRVQKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogQkNSIC0gQnVzIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSA0LTI1CkBAIC02NjQsNyArNjY0LDcgQEAKICNkZWZpbmUgUFNETVJfQ0xfMwkgICAgIDB4MDAwMDAwMDMJLyogQ0FTIExhdGVuY3kgPSAzCQkqLwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMU0RNUiAtIExvY2FsIEJ1cyBTRFJBTSBNb2RlIFJlZ2lzdGVyCQkJIAkxMC0yNAorICogTFNETVIgLSBMb2NhbCBCdXMgU0RSQU0gTW9kZSBSZWdpc3RlcgkJCQkxMC0yNAogICovCiAKIC8qCkBAIC03MDcsMjMgKzcwNywyMyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogVE1SMS1UTVI0IC0gVGltZXIgTW9kZSBSZWdpc3RlcnMJCQkJCTE3LTYKICAqLwotI2RlZmluZSBUTVJ4X1BTX01TSwkJMHhmZjAwCS8qIFByZXNjYWxlciBWYWx1ZSAJCSovCisjZGVmaW5lIFRNUnhfUFNfTVNLCQkweGZmMDAJLyogUHJlc2NhbGVyIFZhbHVlCQkqLwogI2RlZmluZSBUTVJ4X0NFX01TSwkJMHgwMGMwCS8qIENhcHR1cmUgRWRnZSBhbmQgRW5hYmxlIEludGVycnVwdCovCi0jZGVmaW5lIFRNUnhfT00JCQkweDAwMjAJLyogT3V0cHV0IE1vZGUgCQkJKi8KKyNkZWZpbmUgVE1SeF9PTQkJCTB4MDAyMAkvKiBPdXRwdXQgTW9kZQkJCSovCiAjZGVmaW5lIFRNUnhfT1JJCQkweDAwMTAJLyogT3V0cHV0IFJlZmVyZW5jZSBJbnRlcnJ1cHQgRW5hYmxlKi8KLSNkZWZpbmUgVE1SeF9GUlIJCTB4MDAwOAkvKiBGcmVlIFJ1bi9SZXN0YXJ0IAkJKi8KKyNkZWZpbmUgVE1SeF9GUlIJCTB4MDAwOAkvKiBGcmVlIFJ1bi9SZXN0YXJ0CQkqLwogI2RlZmluZSBUTVJ4X0lDTEtfTVNLCQkweDAwMDYJLyogVGltZXIgSW5wdXQgQ2xvY2sgU291cmNlIG1hc2sgKi8KLSNkZWZpbmUgVE1SeF9HRQkJCTB4MDAwMQkvKiBHYXRlIEVuYWJsZSAgCQkqLworI2RlZmluZSBUTVJ4X0dFCQkJMHgwMDAxCS8qIEdhdGUgRW5hYmxlCQkJKi8KIAogI2RlZmluZSBUTVJ4X0NFX0lOVFJfRElTCTB4MDAwMAkvKiBEaXNhYmxlIEludGVycnVwdCBvbiBjYXB0dXJlIGV2ZW50Ki8KICNkZWZpbmUgVE1SeF9DRV9SSVNJTkcJCTB4MDA0MAkvKiBDYXB0dXJlIG9uIFJpc2luZyBUSU54IGVkZ2Ugb25seSAqLwogI2RlZmluZSBUTVJ4X0NFX0ZBTExJTkcJCTB4MDA4MAkvKiBDYXB0dXJlIG9uIEZhbGxpbmcgVElOeCBlZGdlIG9ubHkgKi8KLSNkZWZpbmUgVE1SeF9DRV9BTlkJCTB4MDBjMAkvKiBDYXB0dXJlIG9uIGFueSBUSU54IGVkZ2UgCSovCisjZGVmaW5lIFRNUnhfQ0VfQU5ZCQkweDAwYzAJLyogQ2FwdHVyZSBvbiBhbnkgVElOeCBlZGdlCSovCiAKLSNkZWZpbmUgVE1SeF9JQ0xLX0lOX0NBUwkweDAwMDAJLyogSW50ZXJuYWxseSBjYXNjYWRlZCBpbnB1dCAJKi8KKyNkZWZpbmUgVE1SeF9JQ0xLX0lOX0NBUwkweDAwMDAJLyogSW50ZXJuYWxseSBjYXNjYWRlZCBpbnB1dAkqLwogI2RlZmluZSBUTVJ4X0lDTEtfSU5fR0VOCTB4MDAwMgkvKiBJbnRlcm5hbCBHZW5lcmFsIHN5c3RlbSBjbG9jayovCiAjZGVmaW5lIFRNUnhfSUNMS19JTl9HRU5fRElWMTYJMHgwMDA0CS8qIEludGVybmFsIEdlbmVyYWwgc3lzdGVtIGNsayBkaXYgMTYqLwotI2RlZmluZSBUTVJ4X0lDTEtfVElOX1BJTgkweDAwMDYJLyogVElOeCBwaW4gCQkJKi8KKyNkZWZpbmUgVE1SeF9JQ0xLX1RJTl9QSU4JMHgwMDA2CS8qIFRJTnggcGluCQkJKi8KIAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wYzgzeHguaCBiL2luY2x1ZGUvbXBjODN4eC5oCmluZGV4IDYwZmMyMTQuLjgyOWRiZjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbXBjODN4eC5oCisrKyBiL2luY2x1ZGUvbXBjODN4eC5oCkBAIC0yNSw2ICsyNSw3IEBACiAvKiBTeXN0ZW0gcmVzZXQgb2Zmc2V0IChQb3dlclBDIHN0YW5kYXJkKQogICovCiAjZGVmaW5lIEVYQ19PRkZfU1lTX1JFU0VUCQkweDAxMDAKKyNkZWZpbmUJX1NUQVJUX09GRlNFVAkJCUVYQ19PRkZfU1lTX1JFU0VUCiAKIC8qIElNTVJCQVIgLSBJbnRlcm5hbCBNZW1vcnkgUmVnaXN0ZXIgQmFzZSBBZGRyZXNzCiAgKi8KQEAgLTg1LDYgKzg2LDggQEAKICNkZWZpbmUgU1BSXzgzNjBfUkVWMTIJCQkweDgwNDkwMDEyCiAjZGVmaW5lIFNQUl84MzYwRV9SRVYyMAkJCTB4ODA0ODAwMjAKICNkZWZpbmUgU1BSXzgzNjBfUkVWMjAJCQkweDgwNDkwMDIwCisjZGVmaW5lIFNQUl84MzYwRV9SRVYyMQkJCTB4ODA0ODAwMjEKKyNkZWZpbmUgU1BSXzgzNjBfUkVWMjEJCQkweDgwNDkwMDIxCiAKICNkZWZpbmUgU1BSXzgzMjNFX1JFVjEwCQkJMHg4MDYyMDAxMAogI2RlZmluZSBTUFJfODMyM19SRVYxMAkJCTB4ODA2MzAwMTAKQEAgLTQzOCw5ICs0NDEsOSBAQAogI2RlZmluZSBIUkNXSF9ST01fTE9DX0xPQ0FMXzMyQklUCTB4MDA3MDAwMDAKIAogI2lmIGRlZmluZWQoQ09ORklHX01QQzgzMVgpCi0jZGVmaW5lIEhSQ1dIX1JPTV9MT0NfTkFORF9TUF84QklUIAkweDAwMTAwMDAwCisjZGVmaW5lIEhSQ1dIX1JPTV9MT0NfTkFORF9TUF84QklUCTB4MDAxMDAwMDAKICNkZWZpbmUgSFJDV0hfUk9NX0xPQ19OQU5EX1NQXzE2QklUCTB4MDAyMDAwMDAKLSNkZWZpbmUgSFJDV0hfUk9NX0xPQ19OQU5EX0xQXzhCSVQgCTB4MDA1MDAwMDAKKyNkZWZpbmUgSFJDV0hfUk9NX0xPQ19OQU5EX0xQXzhCSVQJMHgwMDUwMDAwMAogI2RlZmluZSBIUkNXSF9ST01fTE9DX05BTkRfTFBfMTZCSVQJMHgwMDYwMDAwMAogCiAjZGVmaW5lIEhSQ1dIX1JMX0VYVF9MRUdBQ1kJCTB4MDAwMDAwMDAKQEAgLTU5OSw3ICs2MDIsOSBAQAogI2RlZmluZSBTQ0NSX1RTRUMxQ01fMwkJCTB4QzAwMDAwMDAKIAogI2RlZmluZSBTQ0NSX1RTRUMxT04JCQkweDIwMDAwMDAwCisjZGVmaW5lIFNDQ1JfVFNFQzFPTl9TSElGVAkJMjkKICNkZWZpbmUgU0NDUl9UU0VDMk9OCQkJMHgxMDAwMDAwMAorI2RlZmluZSBTQ0NSX1RTRUMyT05fU0hJRlQJCTI4CiAKICNlbmRpZgogCkBAIC0xMjE3LDcgKzEyMjIsNyBAQAogI2RlZmluZSBGQ1JfQ01EMQkJMHgwMEZGMDAwMAogI2RlZmluZSBGQ1JfQ01EMV9TSElGVAkJMTYKICNkZWZpbmUgRkNSX0NNRDIJCTB4MDAwMEZGMDAKLSNkZWZpbmUgRkNSX0NNRDJfU0hJRlQgICAJOAorI2RlZmluZSBGQ1JfQ01EMl9TSElGVAkJOAogI2RlZmluZSBGQ1JfQ01EMwkJMHgwMDAwMDBGRgogI2RlZmluZSBGQ1JfQ01EM19TSElGVAkJMAogCkBAIC0xMjQxLDggKzEyNDYsOCBAQAogLyogTFRFU1IgLSBUcmFuc2ZlciBFcnJvciBTdGF0dXMgUmVnaXN0ZXIKICAqLwogI2RlZmluZSBMVEVTUl9CTQkJMHg4MDAwMDAwMAotI2RlZmluZSBMVEVTUl9GQ1QgCQkweDQwMDAwMDAwCi0jZGVmaW5lIExURVNSX1BBUiAJCTB4MjAwMDAwMDAKKyNkZWZpbmUgTFRFU1JfRkNUCQkweDQwMDAwMDAwCisjZGVmaW5lIExURVNSX1BBUgkJMHgyMDAwMDAwMAogI2RlZmluZSBMVEVTUl9XUAkJMHgwNDAwMDAwMAogI2RlZmluZSBMVEVTUl9BVE1XCQkweDAwODAwMDAwCiAjZGVmaW5lIExURVNSX0FUTVIJCTB4MDA0MDAwMDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXBjODV4eC5oIGIvaW5jbHVkZS9tcGM4NXh4LmgKaW5kZXggYTRkOTliMi4uNmZiZDUwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tcGM4NXh4LmgKKysrIGIvaW5jbHVkZS9tcGM4NXh4LmgKQEAgLTgsNiArOCw3IEBACiAjZGVmaW5lIF9fTVBDODV4eF9IX18KIAogI2RlZmluZSBFWENfT0ZGX1NZU19SRVNFVAkweDAxMDAJLyogU3lzdGVtIHJlc2V0CSovCisjZGVmaW5lCV9TVEFSVF9PRkZTRVQJCUVYQ19PRkZfU1lTX1JFU0VUCiAKICNpZiBkZWZpbmVkKENPTkZJR19FNTAwKQogI2luY2x1ZGUgPGU1MDAuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXBjODZ4eC5oIGIvaW5jbHVkZS9tcGM4Nnh4LmgKaW5kZXggNjczYmZlZC4uOWZkMzQ5YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tcGM4Nnh4LmgKKysrIGIvaW5jbHVkZS9tcGM4Nnh4LmgKQEAgLTgsNyArOCw3IEBACiAjZGVmaW5lIF9fTVBDODZ4eF9IX18KIAogI2RlZmluZSBFWENfT0ZGX1NZU19SRVNFVAkweDAxMDAJLyogU3lzdGVtIHJlc2V0CW9mZnNldCAqLwotCisjZGVmaW5lIF9TVEFSVF9PRkZTRVQJCUVYQ19PRkZfU1lTX1JFU0VUCiAKIC8qCiAgKiBwbGF0Zm9ybSByZWdpc3RlciBhZGRyZXNzZXMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXBjOHh4LmggYi9pbmNsdWRlL21wYzh4eC5oCmluZGV4IDI5MTE3NTguLmJlZjc0OGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbXBjOHh4LmgKKysrIGIvaW5jbHVkZS9tcGM4eHguaApAQCAtMzUsNyArMzUsNyBAQAogICogRXhjZXB0aW9uIG9mZnNldHMgKFBvd2VyUEMgc3RhbmRhcmQpCiAgKi8KICNkZWZpbmUgRVhDX09GRl9TWVNfUkVTRVQJMHgwMTAwCS8qIFN5c3RlbSByZXNldAkJCQkqLwotCisjZGVmaW5lIF9TVEFSVF9PRkZTRVQJCUVYQ19PRkZfU1lTX1JFU0VUCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIFNZUENSIC0gU3lzdGVtIFByb3RlY3Rpb24gQ29udHJvbCBSZWdpc3RlcgkJCQkxMS05CkBAIC0yMDgsMTIgKzIwOCwxMiBAQAogI2RlZmluZSBTQ0NSX0RGQlJHMTAJMHgwMDAwMTAwMAkvKiBCUkdDTEsgZGl2aXNpb24gYnkgMTYJCSovCiAjZGVmaW5lIFNDQ1JfREZCUkcxMQkweDAwMDAxODAwCS8qIEJSR0NMSyBkaXZpc2lvbiBieSA2NAkJKi8KICNkZWZpbmUgU0NDUl9ERk5MMDAwCTB4MDAwMDAwMDAJLyogRGl2aXNpb24gYnkgMiAoZGVmYXVsdCA9IG1pbmltdW0pCSovCi0jZGVmaW5lIFNDQ1JfREZOTDAwMQkweDAwMDAwMTAwCS8qIERpdmlzaW9uIGJ5IDQgCSAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTQ0NSX0RGTkwwMTAJMHgwMDAwMDIwMAkvKiBEaXZpc2lvbiBieSA4IAkgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0NDUl9ERk5MMDExCTB4MDAwMDAzMDAJLyogRGl2aXNpb24gYnkgMTYgCSAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTQ0NSX0RGTkwxMDAJMHgwMDAwMDQwMAkvKiBEaXZpc2lvbiBieSAzMiAJICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNDQ1JfREZOTDEwMQkweDAwMDAwNTAwCS8qIERpdmlzaW9uIGJ5IDY0IAkgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0NDUl9ERk5MMTEwCTB4MDAwMDA2MDAJLyogRGl2aXNpb24gYnkgMTI4IAkgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0NDUl9ERk5MMDAxCTB4MDAwMDAxMDAJLyogRGl2aXNpb24gYnkgNAkgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0NDUl9ERk5MMDEwCTB4MDAwMDAyMDAJLyogRGl2aXNpb24gYnkgOAkgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0NDUl9ERk5MMDExCTB4MDAwMDAzMDAJLyogRGl2aXNpb24gYnkgMTYJICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNDQ1JfREZOTDEwMAkweDAwMDAwNDAwCS8qIERpdmlzaW9uIGJ5IDMyCSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTQ0NSX0RGTkwxMDEJMHgwMDAwMDUwMAkvKiBEaXZpc2lvbiBieSA2NAkgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0NDUl9ERk5MMTEwCTB4MDAwMDA2MDAJLyogRGl2aXNpb24gYnkgMTI4CSAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBTQ0NSX0RGTkwxMTEJMHgwMDAwMDcwMAkvKiBEaXZpc2lvbiBieSAyNTYgKG1heGltdW0pCQkqLwogI2RlZmluZSBTQ0NSX0RGTkgwMDAJMHgwMDAwMDAwMAkvKiBEaXZpc2lvbiBieSAxIChkZWZhdWx0ID0gbWluaW11bSkJKi8KICNkZWZpbmUgU0NDUl9ERk5IMTEwCTB4MDAwMDAwRDAJLyogRGl2aXNpb24gYnkgNjQgKG1heGltdW0pCQkqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQuaCBiL2luY2x1ZGUvbmV0LmgKaW5kZXggNDYxZTAzOC4uOTY3MTk0OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQuaAorKysgYi9pbmNsdWRlL25ldC5oCkBAIC0yOTYsNyArMjk2LDcgQEAKIGV4dGVybiBJUGFkZHJfdAkJTmV0T3VyR2F0ZXdheUlQOwkvKiBPdXIgZ2F0ZXdheSBJUCBhZGRyZXNzZQkqLwogZXh0ZXJuIElQYWRkcl90CQlOZXRPdXJTdWJuZXRNYXNrOwkvKiBPdXIgc3VibmV0IG1hc2sgKDAgPSB1bmtub3duKSovCiBleHRlcm4gSVBhZGRyX3QJCU5ldE91ckROU0lQOwkgLyogT3VyIERvbWFpbiBOYW1lIFNlcnZlciAoMCA9IHVua25vd24pKi8KLSNpZiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfRE5TMikKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9ETlMyKQogZXh0ZXJuIElQYWRkcl90CQlOZXRPdXJETlMySVA7CSAvKiBPdXIgMm5kIERvbWFpbiBOYW1lIFNlcnZlciAoMCA9IHVua25vd24pKi8KICNlbmRpZgogZXh0ZXJuIGNoYXIJCU5ldE91ck5JU0RvbWFpblszMl07CS8qIE91ciBOSVMgZG9tYWluCQkqLwpAQCAtMzQxLDE3ICszNDEsMTcgQEAKIC8qIGZyb20gbmV0L25ldC5jICovCiBleHRlcm4gY2hhcglCb290RmlsZVsxMjhdOwkJCS8qIEJvb3QgRmlsZSBuYW1lCQkqLwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUElORykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUElORykKIGV4dGVybiBJUGFkZHJfdAlOZXRQaW5nSVA7CQkJLyogdGhlIGlwIGFkZHJlc3MgdG8gcGluZyAJCSovCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0NEUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQ0RQKQogLyogd2hlbiBDRFAgY29tcGxldGVzIHRoZXNlIGhvbGQgdGhlIHJldHVybiB2YWx1ZXMgKi8KIGV4dGVybiB1c2hvcnQgQ0RQTmF0aXZlVkxBTjsKIGV4dGVybiB1c2hvcnQgQ0RQQXBwbGlhbmNlVkxBTjsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU05UUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU05UUCkKIGV4dGVybiBJUGFkZHJfdAlOZXROdHBTZXJ2ZXJJUDsJCQkvKiB0aGUgaXAgYWRkcmVzcyB0byBOVFAgCSovCiBleHRlcm4gaW50IE5ldFRpbWVPZmZzZXQ7CQkJLyogb2Zmc2V0IHRpbWUgZnJvbSBVVEMJCSovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGNpLmggYi9pbmNsdWRlL3BjaS5oCmluZGV4IDdjOWEwZTMuLjhlNWRhY2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcGNpLmgKKysrIGIvaW5jbHVkZS9wY2kuaApAQCAtMzAyLDYgKzMwMiwxMiBAQAogI2RlZmluZSBQQ0lfTUFYX1BDSV9ERVZJQ0VTCTMyCiAjZGVmaW5lIFBDSV9NQVhfUENJX0ZVTkNUSU9OUwk4CiAKKyNkZWZpbmUgUENJX0RDUgkJMHg1NCAgICAvKiBQQ0llIERldmljZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFBDSV9EU1IJCTB4NTYgICAgLyogUENJZSBEZXZpY2UgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFBDSV9MU1IJCTB4NWUgICAgLyogUENJZSBMaW5rIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBQQ0lfTFRTU00JMHg0MDQgICAvKiBQQ0llIExpbmsgVHJhaW5pbmcsIFN0YXR1cyBTdGF0ZSBNYWNoaW5lICovCisjZGVmaW5lICBQQ0lfTFRTU01fTDAJMHgxNiAgICAvKiBMMCBzdGF0ZSAqLworCiAvKiBJbmNsdWRlIHRoZSBJRCBsaXN0ICovCiAKICNpbmNsdWRlIDxwY2lfaWRzLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL3BjbWNpYS5oIGIvaW5jbHVkZS9wY21jaWEuaAppbmRleCA4ZjU2NGRhLi43MzA1ODA1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3BjbWNpYS5oCisrKyBiL2luY2x1ZGUvcGNtY2lhLmgKQEAgLTMxLDggKzMxLDggQEAKICAqIEFsbG93IGNvbmZpZ3VyYXRpb24gdG8gc2VsZWN0IFBDTUNJQSBzbG90LAogICogb3IgdHJ5IHRvIGdlbmVyYXRlIGEgdXNlZnVsIGRlZmF1bHQKICAqLwotI2lmICggQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpIHx8IFwKLSAgICAoKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSAmJiBcCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkgfHwgXAorICAgIChkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBcCiAJKGRlZmluZWQoQ09ORklHX0lERV84eHhfUENDQVJEKSB8fCBkZWZpbmVkKENPTkZJR19JREVfOHh4X0RJUkVDVCkgKSApCiAKICNpZiAhZGVmaW5lZChDT05GSUdfUENNQ0lBX1NMT1RfQSkgJiYgIWRlZmluZWQoQ09ORklHX1BDTUNJQV9TTE9UX0IpCkBAIC0zMDYsMTQgKzMwNiwxNCBAQAogI2RlZmluZSBDSVNUUExfSURFX0hBU19JTkRFWAkweDIwCiAjZGVmaW5lIENJU1RQTF9JREVfSU9JUzE2CTB4NDAKIAotI2VuZGlmCS8qIENGR19DTURfUENNQ0lBIHx8IENGR19DTURfSURFICYmIChDT05GSUdfSURFXzh4eF9QQ0NBUkQgfHwgQ09ORklHX0lERV84eHhfRElSRUNUKSAqLworI2VuZGlmCiAKICNpZmRlZglDT05GSUdfOHh4CiBleHRlcm4gdV9pbnQgKnBjbWNpYV9wZ2NyeFtdOwogI2RlZmluZQlQQ01DSUFfUEdDUlgoc2xvdCkJKCpwY21jaWFfcGdjcnhbc2xvdF0pCiAjZW5kaWYKIAotI2lmCShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkgJiYgZGVmaW5lZChDT05GSUdfSURFXzh4eF9QQ0NBUkQpIFwKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKSAmJiBkZWZpbmVkKENPTkZJR19JREVfOHh4X1BDQ0FSRCkgXAogCXx8IGRlZmluZWQoQ09ORklHX1BYQV9QQ01DSUEpCiBleHRlcm4gaW50IGNoZWNrX2lkZV9kZXZpY2UoaW50IHNsb3QpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Bvc3QuaCBiL2luY2x1ZGUvcG9zdC5oCmluZGV4IGNkZWZiZGQuLjgyNTllNWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcG9zdC5oCisrKyBiL2luY2x1ZGUvcG9zdC5oCkBAIC05MSw2ICs5MSw3IEBACiAjZGVmaW5lIENGR19QT1NUX1NZU01PTgkJMHgwMDAwMDgwMAogI2RlZmluZSBDRkdfUE9TVF9EU1AJCTB4MDAwMDEwMDAKICNkZWZpbmUgQ0ZHX1BPU1RfQ09ERUMJCTB4MDAwMDIwMDAKKyNkZWZpbmUgQ0ZHX1BPU1RfRlBVCQkweDAwMDA0MDAwCiAKICNlbmRpZiAvKiBDT05GSUdfUE9TVCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BwYzQwNS5oIGIvaW5jbHVkZS9wcGM0MDUuaAppbmRleCBmZmZhZTRkLi44ZTY0NzMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL3BwYzQwNS5oCisrKyBiL2luY2x1ZGUvcHBjNDA1LmgKQEAgLTI3LDYgKzI3LDE1IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCSNkZWZpbmUgIHNycjIgIDB4M2RlICAgICAgLyogc2F2ZS9yZXN0b3JlIHJlZ2lzdGVyIDIgKi8KIAkjZGVmaW5lICBzcnIzICAweDNkZiAgICAgIC8qIHNhdmUvcmVzdG9yZSByZWdpc3RlciAzICovCisKKwkvKgorCSAqIDQwNSBkb2VzIG5vdCByZWFsbHkgaGF2ZSBDU1JSMC8xIGJ1dCBTUlIyLzMgYXJlIHVzZWQgZHVyaW5nIGNyaXRpY2FsCisJICogZXhjZXB0aW9uIGZvciB0aGUgZXhhY3Qgc2FtZSBwdXJwb3NlcyAtIGxldCdzIGFsaWFzIHRoZW0gYW5kIGhhdmUgYQorCSAqIGNvbW1vbiBoYW5kbGluZyBpbiBjcml0X3JldHVybigpIGFuZCBDUklUX0VYQ0VQVElPTgorCSAqLworCSNkZWZpbmUgIGNzcnIwIHNycjIKKwkjZGVmaW5lICBjc3JyMSBzcnIzCisKIAkjZGVmaW5lICBkYnNyICAweDNmMCAgICAgIC8qIGRlYnVnIHN0YXR1cyByZWdpc3RlciAqLwogCSNkZWZpbmUgIGRiY3IwIDB4M2YyICAgICAgLyogZGVidWcgY29udHJvbCByZWdpc3RlciAwICovCiAJI2RlZmluZSAgZGJjcjEgMHgzYmQgICAgICAvKiBkZWJ1ZyBjb250cm9sIHJlZ2lzdGVyIDEgKi8KQEAgLTEzNCwxMiArMTQzLDEyIEBACiAjZGVmaW5lIFVJQ19VU0JIMQkweDAwMDQwMDAwCS8qIFVTQiBIb3N0IDEJCQkqLwogI2RlZmluZSBVSUNfVVNCSDIJMHgwMDAyMDAwMAkvKiBVU0IgSG9zdCAyCQkJKi8KICNkZWZpbmUgVUlDX1VTQkRFVgkweDAwMDEwMDAwCS8qIFVTQiBEZXZpY2UJCQkqLwotI2RlZmluZSBVSUNfRU5FVAkweDAwMDA4MDAwCS8qIEV0aGVybmV0IGludGVycnVwdCBzdGF0dXMgCSovCi0jZGVmaW5lIFVJQ19FTkVUMQkweDAwMDA4MDAwCS8qIGR1bW15IGRlZmluZSAgICAgICAgICAgICAgCSovCisjZGVmaW5lIFVJQ19FTkVUCTB4MDAwMDgwMDAJLyogRXRoZXJuZXQgaW50ZXJydXB0IHN0YXR1cwkqLworI2RlZmluZSBVSUNfRU5FVDEJMHgwMDAwODAwMAkvKiBkdW1teSBkZWZpbmUJCQkqLwogI2RlZmluZSBVSUNfRU1BQ19XQUtFCTB4MDAwMDQwMDAJLyogRU1BQyB3YWtlIHVwCQkJKi8KIAogI2RlZmluZSBVSUNfTUFETUFMCTB4MDAwMDIwMDAJLyogTG9naWNhbCBPUiBvZiBmb2xsb3dpbmcgTWFkTUFMIGludCAqLwotI2RlZmluZSBVSUNfTUFMX1NFUlIgCTB4MDAwMDIwMDAJLyogICBNQUwgU0VSUgkJCSovCisjZGVmaW5lIFVJQ19NQUxfU0VSUgkweDAwMDAyMDAwCS8qICAgTUFMIFNFUlIJCQkqLwogI2RlZmluZSBVSUNfTUFMX1RYREUJMHgwMDAwMjAwMAkvKiAgIE1BTCBUWERFCQkJKi8KICNkZWZpbmUgVUlDX01BTF9SWERFCTB4MDAwMDIwMDAJLyogICBNQUwgUlhERQkJCSovCiAKQEAgLTU1Niw2ICs1NjUsMTEgQEAKICNkZWZpbmUgc2RyaWNpbnRzdGF0CTB4NDUxMAogCiAjZGVmaW5lIFNEUl9OQU5EMF9OREVOCQkweDgwMDAwMDAwCisjZGVmaW5lIFNEUl9OQU5EMF9OREJURU4JMHg0MDAwMDAwMAorI2RlZmluZSBTRFJfTkFORDBfTkRCQURSX01BU0sJMHgzMDAwMDAwMAorI2RlZmluZSBTRFJfTkFORDBfTkRCUEdfTUFTSwkweDBmMDAwMDAwCisjZGVmaW5lIFNEUl9OQU5EMF9OREFSRU4JMHgwMDgwMDAwMAorI2RlZmluZSBTRFJfTkFORDBfTkRSQkVOCTB4MDA0MDAwMDAKIAogI2RlZmluZSBTRFJfVUxUUkEwX05ER1BJT0JQCTB4ODAwMDAwMDAKICNkZWZpbmUgU0RSX1VMVFJBMF9DU05fTUFTSwkweDc4MDAwMDAwCkBAIC01NjMsNiArNTc3LDkgQEAKICNkZWZpbmUgU0RSX1VMVFJBMF9DU05TRUwxCTB4MjAwMDAwMDAKICNkZWZpbmUgU0RSX1VMVFJBMF9DU05TRUwyCTB4MTAwMDAwMDAKICNkZWZpbmUgU0RSX1VMVFJBMF9DU05TRUwzCTB4MDgwMDAwMDAKKyNkZWZpbmUgU0RSX1VMVFJBMF9FQkNSRFlFTgkweDA0MDAwMDAwCisjZGVmaW5lIFNEUl9VTFRSQTBfU1BJU1NJTkVOCTB4MDIwMDAwMDAKKyNkZWZpbmUgU0RSX1VMVFJBMF9ORlNSU1RFTgkweDAxMDAwMDAwCiAKICNkZWZpbmUgU0RSX1VMVFJBMV9MRURORU5BQkxFCTB4NDAwMDAwMDAKIApAQCAtODY5LDcgKzg4Niw3IEBACiAjZGVmaW5lIGNudHJsMCAgKENOVFJMX0RDUl9CQVNFKzB4MSkgIC8qIENvbnRyb2wgMCByZWdpc3RlciAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIGNudHJsMSAgKENOVFJMX0RDUl9CQVNFKzB4MikgIC8qIENvbnRyb2wgMSByZWdpc3RlcgkJICAgICAqLwogI2RlZmluZSByZXNldCAgIChDTlRSTF9EQ1JfQkFTRSsweDMpICAvKiByZXNldCByZWdpc3RlcgkJCSAgICAgKi8KLSNkZWZpbmUgc3RyYXAgICAoQ05UUkxfRENSX0JBU0UrMHg0KSAgLyogc3RyYXAgcmVnaXN0ZXIJCSAgIAkgICAgICovCisjZGVmaW5lIHN0cmFwICAgKENOVFJMX0RDUl9CQVNFKzB4NCkgIC8qIHN0cmFwIHJlZ2lzdGVyCQkJICAgICAqLwogCiAjZGVmaW5lIGVjciAgICAgKDB4YWEpICAgICAgICAgICAgICAgIC8qIGVkZ2UgY29uZGl0aW9uZXIgcmVnaXN0ZXIgKDQwNWdwcikgICovCiAKQEAgLTExMDIsMTMgKzExMTksMTMgQEAKIHwgVUFSVCBSZWdpc3RlciBPZmZzZXRzCiAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjZGVmaW5lCQlEQVRBX1JFRwkweDAwCi0jZGVmaW5lCQlETF9MU0IgICAgCTB4MDAKLSNkZWZpbmUJCURMX01TQiAgCTB4MDEKKyNkZWZpbmUJCURMX0xTQgkJMHgwMAorI2RlZmluZQkJRExfTVNCCQkweDAxCiAjZGVmaW5lCQlJTlRfRU5BQkxFICAgICAgMHgwMQogI2RlZmluZQkJRklGT19DT05UUk9MICAgIDB4MDIKICNkZWZpbmUJCUxJTkVfQ09OVFJPTCAgICAweDAzCiAjZGVmaW5lCQlNT0RFTV9DT05UUk9MICAgMHgwNAotI2RlZmluZQkJTElORV9TVEFUVVMgIAkweDA1CisjZGVmaW5lCQlMSU5FX1NUQVRVUwkweDA1CiAjZGVmaW5lCQlNT0RFTV9TVEFUVVMgICAgMHgwNgogI2RlZmluZQkJU0NSQVRDSCAgICAgICAgIDB4MDcKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcGM0NDAuaCBiL2luY2x1ZGUvcHBjNDQwLmgKaW5kZXggMDdmNzVkZS4uOTNjMTBmMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcGM0NDAuaAorKysgYi9pbmNsdWRlL3BwYzQ0MC5oCkBAIC04MiwxMCArODIsNyBAQAogI2RlZmluZQkgaXZvcjEzIDB4MTlkCS8qIGludGVycnVwdCB2ZWN0b3Igb2Zmc2V0IHJlZ2lzdGVyIDEzICovCiAjZGVmaW5lCSBpdm9yMTQgMHgxOWUJLyogaW50ZXJydXB0IHZlY3RvciBvZmZzZXQgcmVnaXN0ZXIgMTQgKi8KICNkZWZpbmUJIGl2b3IxNSAweDE5ZgkvKiBpbnRlcnJ1cHQgdmVjdG9yIG9mZnNldCByZWdpc3RlciAxNSAqLwotI2lmIGRlZmluZWQoQ09ORklHXzQ0MEdYKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfNDQwRVApIHx8IGRlZmluZWQoQ09ORklHXzQ0MEdSKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfNDQwRVBYKSB8fCBkZWZpbmVkKENPTkZJR180NDBHUlgpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR180NDBTUCkgfHwgZGVmaW5lZChDT05GSUdfNDQwU1BFKQorI2lmIGRlZmluZWQoQ09ORklHXzQ0MCkKICNkZWZpbmUJIG1jc3JyMCAweDIzYQkvKiBtYWNoaW5lIGNoZWNrIHNhdmUvcmVzdG9yZSByZWdpc3RlciAwICovCiAjZGVmaW5lCSBtY3NycjEgMHgyM2IJLyogbWFoY2luZSBjaGVjayBzYXZlL3Jlc3RvcmUgcmVnaXN0ZXIgMSAqLwogI2RlZmluZQkgbWNzcgkweDIzYwkvKiBtYWNoaW5lIGNoZWNrIHN0YXR1cyByZWdpc3RlciAqLwpAQCAtMTE1LDcgKzExMiw3IEBACiAjZGVmaW5lCSBpY2RidHJoIDB4MzlmCS8qIGluc3RydWN0aW9uIGNhY2hlIGRlYnVnIHRhZyByZWdpc3RlciBoaWdoICovCiAjZGVmaW5lCSBtbXVjcgkweDNiMgkvKiBtbXUgY29udHJvbCByZWdpc3RlciAqLwogI2RlZmluZQkgY2NyMAkweDNiMwkvKiBjb3JlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgMCAqLwotI2RlZmluZSAgY2NyMSAgCTB4Mzc4CS8qIGNvcmUgY29uZmlndXJhdGlvbiBmb3IgNDQweDUgb25seSAqLworI2RlZmluZSAgY2NyMQkweDM3OAkvKiBjb3JlIGNvbmZpZ3VyYXRpb24gZm9yIDQ0MHg1IG9ubHkgKi8KICNkZWZpbmUJIGljZGJkciAweDNkMwkvKiBpbnN0cnVjdGlvbiBjYWNoZSBkZWJ1ZyBkYXRhIHJlZ2lzdGVyICovCiAjZGVmaW5lCSBkYmRyCTB4M2YzCS8qIGRlYnVnIGRhdGEgcmVnaXN0ZXIgKi8KIApAQCAtMTM5LDcgKzEzNiw3IEBACiAjZGVmaW5lIGNsa19vcGJkCTB4MDBjMAogI2RlZmluZSBjbGtfcGVyZAkweDAwZTAKICNkZWZpbmUgY2xrX21hbGQJMHgwMTAwCi0jZGVmaW5lIGNsa19zcGNpZCAgIAkweDAxMjAKKyNkZWZpbmUgY2xrX3NwY2lkCTB4MDEyMAogI2RlZmluZSBjbGtfaWNmZwkweDAxNDAKIAogLyogNDQwZ3ggc2RyIHJlZ2lzdGVyIGRlZmluYXRpb25zICovCkBAIC0yODUsNiArMjgyLDMwIEBACiAjZGVmaW5lIHNkcl9zZHN0cDMJMHg0MDAzCiAjZW5kaWYJLyogQ09ORklHXzQ0MEdYICovCiAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgQ29yZSBDb25maWd1cmF0aW9uL01NVSBjb25maWd1cmF0aW9uIGZvciA0NDAgKENDUjEgZm9yIDQ0MHg1IG9ubHkpLgorKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBDQ1IwX1BSRQkJMHg0MDAwMDAwMAorI2RlZmluZSBDQ1IwX0NSUEUJCTB4MDgwMDAwMDAKKyNkZWZpbmUgQ0NSMF9EU1RHCQkweDAwMjAwMDAwCisjZGVmaW5lIENDUjBfREFQVUlCCQkweDAwMTAwMDAwCisjZGVmaW5lIENDUjBfRFRCCQkweDAwMDA4MDAwCisjZGVmaW5lIENDUjBfR0lDQlQJCTB4MDAwMDQwMDAKKyNkZWZpbmUgQ0NSMF9HRENCVAkJMHgwMDAwMjAwMAorI2RlZmluZSBDQ1IwX0ZMU1RBCQkweDAwMDAwMTAwCisjZGVmaW5lIENDUjBfSUNTTENfTUFTSwkJMHgwMDAwMDAwQworI2RlZmluZSBDQ1IwX0lDU0xUX01BU0sJCTB4MDAwMDAwMDMKKyNkZWZpbmUgQ0NSMV9UQ1NfTUFTSwkJMHgwMDAwMDA4MAorI2RlZmluZSBDQ1IxX1RDU19JTlRDTEsJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0NSMV9UQ1NfRVhUQ0xLCQkweDAwMDAwMDgwCisjZGVmaW5lIE1NVUNSX1NXT0EJCTB4MDEwMDAwMDAKKyNkZWZpbmUgTU1VQ1JfVTFURQkJMHgwMDQwMDAwMAorI2RlZmluZSBNTVVDUl9VMlNXT0FFCQkweDAwMjAwMDAwCisjZGVmaW5lIE1NVUNSX0RVTFhFCQkweDAwODAwMDAwCisjZGVmaW5lIE1NVUNSX0lVTFhFCQkweDAwNDAwMDAwCisjZGVmaW5lIE1NVUNSX1NUUwkJMHgwMDEwMDAwMAorI2RlZmluZSBNTVVDUl9TVElEX01BU0sJCTB4MDAwMDAwRkYKKwogI2lmZGVmIENPTkZJR180NDBTUEUKICN1bmRlZiBzZHJfc2RzdHAyCiAjZGVmaW5lIHNkcl9zZHN0cDIJMHgwMDIyCkBAIC0zMTAsMzAgKzMzMSw2IEBACiAjZGVmaW5lIHNkcl9zZHN0cDYJMHg0MDA1CiAjZGVmaW5lIHNkcl9zZHN0cDcJMHg0MDA3CiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgQ29yZSBDb25maWd1cmF0aW9uL01NVSBjb25maWd1cmF0aW9uIGZvciA0NDAgKENDUjEgZm9yIDQ0MHg1IG9ubHkpLgotKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBDQ1IwX1BSRQkJMHg0MDAwMDAwMAotI2RlZmluZSBDQ1IwX0NSUEUJCTB4MDgwMDAwMDAKLSNkZWZpbmUgQ0NSMF9EU1RHCQkweDAwMjAwMDAwCi0jZGVmaW5lIENDUjBfREFQVUlCCQkweDAwMTAwMDAwCi0jZGVmaW5lIENDUjBfRFRCCQkweDAwMDA4MDAwCi0jZGVmaW5lIENDUjBfR0lDQlQJCTB4MDAwMDQwMDAKLSNkZWZpbmUgQ0NSMF9HRENCVAkJMHgwMDAwMjAwMAotI2RlZmluZSBDQ1IwX0ZMU1RBCQkweDAwMDAwMTAwCi0jZGVmaW5lIENDUjBfSUNTTENfTUFTSwkJMHgwMDAwMDAwQwotI2RlZmluZSBDQ1IwX0lDU0xUX01BU0sJCTB4MDAwMDAwMDMKLSNkZWZpbmUgQ0NSMV9UQ1NfTUFTSwkJMHgwMDAwMDA4MAotI2RlZmluZSBDQ1IxX1RDU19JTlRDTEsJCTB4MDAwMDAwMDAKLSNkZWZpbmUgQ0NSMV9UQ1NfRVhUQ0xLCQkweDAwMDAwMDgwCi0jZGVmaW5lIE1NVUNSX1NFT0EJCTB4MDEwMDAwMDAKLSNkZWZpbmUgTU1VQ1JfVTFURQkJMHgwMDQwMDAwMAotI2RlZmluZSBNTVVDUl9VMlNXT0FFCQkweDAwMjAwMDAwCi0jZGVmaW5lIE1NVUNSX0RVTFhFCQkweDAwODAwMDAwCi0jZGVmaW5lIE1NVUNSX0lVTFhFCQkweDAwNDAwMDAwCi0jZGVmaW5lIE1NVUNSX1NUUwkJMHgwMDEwMDAwMAotI2RlZmluZSBNTVVDUl9TVElEX01BU0sJCTB4MDAwMDAwRkYKLQogI2RlZmluZSBTRFIwX0NGR0FERFIJCTB4MDBFCiAjZGVmaW5lIFNEUjBfQ0ZHREFUQQkJMHgwMEYKIApAQCAtNjg3LDggKzY4NCw4IEBACiAjZGVmaW5lIFNEUkFNX0NPRFRfQ0tTRV9TSU5HTEVfRU5ECQkweDAwMDAwMDA4CiAjZGVmaW5lIFNEUkFNX0NPRFRfRkVFQkJBQ0tfUkNWX1NJTkdMRV9FTkQJMHgwMDAwMDAwNAogI2RlZmluZSBTRFJBTV9DT0RUX0ZFRUJCQUNLX0RSVl9TSU5HTEVfRU5ECTB4MDAwMDAwMDIKLSNkZWZpbmUgU0RSQU1fQ09EVF9JT19ISVogIAkJCTB4MDAwMDAwMDAKLSNkZWZpbmUgU0RSQU1fQ09EVF9JT19OTU9ERSAgCQkJMHgwMDAwMDAwMQorI2RlZmluZSBTRFJBTV9DT0RUX0lPX0hJWgkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgU0RSQU1fQ09EVF9JT19OTU9ERQkJCTB4MDAwMDAwMDEKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKIHwgIFNEUkFNIE1vZGUgUmVnaXN0ZXIKQEAgLTk1Niw3ICs5NTMsOCBAQAogI2RlZmluZSBwbGIxX2JlYXJsICAgICAgICAgICAgICAgIChQTEJfQVJCSVRFUl9CQVNFKyAweDBDKQogI2RlZmluZSBwbGIxX2JlYXJoICAgICAgICAgICAgICAgIChQTEJfQVJCSVRFUl9CQVNFKyAweDBEKQogCi0jaWYgZGVmaW5lZChDT05GSUdfNDQwRVApIHx8IGRlZmluZWQoQ09ORklHXzQ0MEdSKQorI2lmIGRlZmluZWQoQ09ORklHXzQ0MEVQKSB8fCBkZWZpbmVkKENPTkZJR180NDBHUikgfHwgXAorICAgIGRlZmluZWQoQ09ORklHXzQ0MEVQWCkgfHwgZGVmaW5lZChDT05GSUdfNDQwR1JYKQogLyogUGluIEZ1bmN0aW9uIENvbnRyb2wgUmVnaXN0ZXIgMSAqLwogI2RlZmluZSBTRFIwX1BGQzEgICAgICAgICAgICAgICAgICAgIDB4NDEwMQogI2RlZmluZSAgIFNEUjBfUEZDMV9VMU1FX01BU0sgICAgICAgICAweDAyMDAwMDAwICAgIC8qIFVBUlQxIE1vZGUgRW5hYmxlICovCkBAIC0xMDI1LDcgKzEwMjMsNyBAQAogI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHXzQ0MEVQKSB8fCBkZWZpbmVkKENPTkZJR180NDBHUikgKi8KIAogI2lmIGRlZmluZWQoQ09ORklHXzQ0MEVQWCkgfHwgZGVmaW5lZChDT05GSUdfNDQwR1JYKQotI2RlZmluZSBTRFJfVVNCMkQwQ1IgICAgICAgICAgICAgICAgIDB4MDMyMAorI2RlZmluZSBTRFIwX1VTQjJEMENSICAgICAgICAgICAgICAgICAweDAzMjAKICNkZWZpbmUgICBTRFIwX1VTQjJEMENSX1VTQjJERVZfRUJDX1NFTF9NQVNLICAgMHgwMDAwMDAwNCAgICAvKiBVU0IgMi4wIERldmljZS9FQkMgTWFzdGVyIFNlbGVjdGlvbiAqLwogI2RlZmluZSAgIFNEUjBfVVNCMkQwQ1JfVVNCMkRFVl9TRUxFQ1RJT04gICAgICAweDAwMDAwMDA0ICAgIC8qIFVTQiAyLjAgRGV2aWNlIFNlbGVjdGlvbiAqLwogI2RlZmluZSAgIFNEUjBfVVNCMkQwQ1JfRUJDX1NFTEVDVElPTiAgICAgICAgICAweDAwMDAwMDAwICAgIC8qIEVCQyBTZWxlY3Rpb24gKi8KQEAgLTExMDMsNiArMTEwMSw4IEBACiAjZGVmaW5lICAgU0RSMF9QRkMyX1NFTEVDVF9DT05GSUdfNSAgICAgICAgICAgIDB4QzAwMDAwMDAgICAvKiAyeFJUQkkgIHVzaW5nIFJHTUlJIGJyaWRnZSAqLwogI2RlZmluZSAgIFNEUjBfUEZDMl9TRUxFQ1RfQ09ORklHXzYgICAgICAgICAgICAweDQwMDAwMDAwICAgLyogMnhTTUlJICB1c2luZyAgWk1JSSBicmlkZ2UgKi8KIAorI2RlZmluZSBTRFIwX1BGQzQJCTB4NDEwNAorCiAvKiBVU0IyUEhZMCBDb250cm9sIFJlZ2lzdGVyICovCiAjZGVmaW5lIFNEUjBfVVNCMlBIWTBDUiAgICAgICAgICAgICAgIDB4NDEwMwogI2RlZmluZSAgIFNEUjBfVVNCMlBIWTBDUl9VVE1JQ05fTUFTSyAgICAgICAgICAweDAwMTAwMDAwIC8qICBQSFkgVVRNSSBpbnRlcmZhY2UgY29ubmVjdGlvbiAqLwpAQCAtMTQyMSw3ICsxNDIxLDcgQEAKICNkZWZpbmUgdWljdnIgIHVpYzB2cgogI2RlZmluZSB1aWN2Y3IgdWljMHZjcgogCi0jaWYgZGVmaW5lZChDT05GSUdfNDQwU1BFKQorI2lmIGRlZmluZWQoQ09ORklHXzQ0MFNQRSkgfHwgZGVmaW5lZChDT05GSUdfNDQwRVBYKQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogfCBDbG9jayAvIFBvd2VyLW9uLXJlc2V0IERDUidzLgogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMTQ5MCw5ICsxNDkwLDExIEBACiAjZGVmaW5lIENQUjBfT1BCRF9PUEJEVjBfREVDT0RFKG4pCSgoKCgoKHVuc2lnbmVkIGxvbmcpKG4pKT4+MjQpLTEpJjB4MDMpKzEpCiAKICNkZWZpbmUgQ1BSMF9QRVJECQkJMHhFMAorI2lmICFkZWZpbmVkKENPTkZJR180NDBFUFgpCiAjZGVmaW5lIENQUjBfUEVSRF9QRVJEVjBfTUFTSwkJMHgwMzAwMDAwMAogI2RlZmluZSBDUFIwX1BFUkRfUEVSRFYwX0VOQ09ERShuKQkoKCgodW5zaWduZWQgbG9uZykobikpJjB4MDMpPDwyNCkKICNkZWZpbmUgQ1BSMF9QRVJEX1BFUkRWMF9ERUNPREUobikJKCgoKCgodW5zaWduZWQgbG9uZykobikpPj4yNCktMSkmMHgwMykrMSkKKyNlbmRpZgogCiAjZGVmaW5lIENQUjBfTUFMRAkJCTB4MTAwCiAjZGVmaW5lIENQUjBfTUFMRF9NQUxEVjBfTUFTSwkJMHgwMzAwMDAwMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcGM0eHguaCBiL2luY2x1ZGUvcHBjNHh4LmgKaW5kZXggNjc3NTljNy4uY2EyNDFkMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcGM0eHguaAorKysgYi9pbmNsdWRlL3BwYzR4eC5oCkBAIC0yMiw2ICsyMiw4IEBACiAjaWZuZGVmCV9fUFBDNFhYX0hfXwogI2RlZmluZSBfX1BQQzRYWF9IX18KIAorI2RlZmluZSBFWENfT0ZGX1NZU19SRVNFVAkweDAxMDAJLyogU3lzdGVtIHJlc2V0CQkJCSovCisjZGVmaW5lIF9TVEFSVF9PRkZTRVQJCShFWENfT0ZGX1NZU19SRVNFVCArIDB4MjAwMCkKIAogI2lmIGRlZmluZWQoQ09ORklHXzQ0MCkKICNpbmNsdWRlIDxwcGM0NDAuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHBjX2FzbS50bXBsIGIvaW5jbHVkZS9wcGNfYXNtLnRtcGwKaW5kZXggM2U0N2U4Mi4uYWM4ZjMxNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcGNfYXNtLnRtcGwKKysrIGIvaW5jbHVkZS9wcGNfYXNtLnRtcGwKQEAgLTExMywxMSArMTEzLDExIEBACiAKICNpZiAgZGVmaW5lZChDT05GSUdfNXh4KQogLyogU29tZSBzcGVjaWFsIHB1cnBvc2UgcmVnaXN0ZXJzICovCi0jZGVmaW5lIERFUgkxNDkJCS8qIERlYnVnIEVuYWJsZSBSZWdpc3RlcgkgICAgCSovCi0jZGVmaW5lIENPVU5UQQkxNTAJCS8qIEJyZWFrcG9pbnQgQ291bnRlcgkgICAgCSAJKi8KLSNkZWZpbmUgQ09VTlRCCTE1MQkJLyogQnJlYWtwb2ludCBDb3VudGVyCSAgICAJIAkqLwotI2RlZmluZSBMQ1RSTDEJMTU2CQkvKiBMb2FkL1N0b3JlIFN1cHBvcnQJICAgIAkgCSovCi0jZGVmaW5lIExDVFJMMgkxNTcJCS8qIExvYWQvU3RvcmUgU3VwcG9ydAkgICAgCSAJKi8KKyNkZWZpbmUgREVSCTE0OQkJLyogRGVidWcgRW5hYmxlIFJlZ2lzdGVyCQkqLworI2RlZmluZSBDT1VOVEEJMTUwCQkvKiBCcmVha3BvaW50IENvdW50ZXIJCQkqLworI2RlZmluZSBDT1VOVEIJMTUxCQkvKiBCcmVha3BvaW50IENvdW50ZXIJCQkqLworI2RlZmluZSBMQ1RSTDEJMTU2CQkvKiBMb2FkL1N0b3JlIFN1cHBvcnQJCQkqLworI2RlZmluZSBMQ1RSTDIJMTU3CQkvKiBMb2FkL1N0b3JlIFN1cHBvcnQJCQkqLwogI2RlZmluZSBJQ1RSTAkxNTgJCS8qIEktQnVzIFN1cHBvcnQgQ29udHJvbCBSZWdpc3RlcgkqLwogI2RlZmluZSBFSUQJODEKICNlbmRpZgkvKiBDT05GSUdfNXh4ICovCkBAIC0yMTcsNyArMjE3LDcgQEAKICAqIFdlIGFzc3VtZSBzcHJnMyBoYXMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQKICAqIHRhc2sncyB0aHJlYWRfc3RydWN0LgogICovCi0jZGVmaW5lIEVYQ0VQVElPTl9QUk9MT0cJXAorI2RlZmluZSBFWENFUFRJT05fUFJPTE9HKHJlZzEsIHJlZzIpCVwKIAltdHNwcglTUFJHMCxyMjA7CVwKIAltdHNwcglTUFJHMSxyMjE7CVwKIAltZmNyCXIyMDsJCVwKQEAgLTIzNSw4ICsyMzUsMTAgQEAKIAlzdHcJcjIyLF9DVFIocjIxKTsJXAogCW1mc3ByCXIyMCxYRVI7CVwKIAlzdHcJcjIwLF9YRVIocjIxKTsJXAotCW1mc3ByCXIyMixTUlIwOwlcCi0JbWZzcHIJcjIzLFNSUjE7CVwKKwltZnNwcglyMjAsIERBUl9ERUFSOwlcCisJc3R3CXIyMCxfREFSKHIyMSk7CVwKKwltZnNwcglyMjIscmVnMTsJXAorCW1mc3ByCXIyMyxyZWcyOwlcCiAJc3R3CXIwLEdQUjAocjIxKTsJXAogCXN0dwlyMSxHUFIxKHIyMSk7CVwKIAlzdHcJcjIsR1BSMihyMjEpOwlcCkBAIC0yNDksNDEgKzI1MSw2IEBACiAgKi8KIAogLyoKLSAqIENyaXRpY2FsIGV4Y2VwdGlvbiBlbnRyeSBjb2RlLiAgVGhpcyBpcyBqdXN0IGxpa2UgdGhlIG90aGVyIGV4Y2VwdGlvbgotICogY29kZSBleGNlcHQgdGhhdCBpdCB1c2VzIFNSUjIgYW5kIFNSUjMgaW5zdGVhZCBvZiBTUlIwIGFuZCBTUlIxLgotICovCi0jZGVmaW5lIENSSVRJQ0FMX0VYQ0VQVElPTl9QUk9MT0cgICAgICAgXAotCW10c3ByICAgU1BSRzAscjIwOyAgICAgIFwKLQltdHNwciAgIFNQUkcxLHIyMTsgICAgICBcCi0JbWZjciAgICByMjA7ICAgICAgICAgICAgXAotCXN1YmkgICAgcjIxLHIxLElOVF9GUkFNRV9TSVpFK1NUQUNLX1VOREVSSEVBRDsgIC8qIGFsbG9jIGV4Yy4gZnJhbWUgKi9cCi0Jc3R3ICAgICByMjAsX0NDUihyMjEpOyAgICAgICAgICAvKiBzYXZlIHJlZ2lzdGVycyAqLyBcCi0Jc3R3ICAgICByMjIsR1BSMjIocjIxKTsgXAotCXN0dyAgICAgcjIzLEdQUjIzKHIyMSk7IFwKLQltZnNwciAgIHIyMCxTUFJHMDsgICAgICBcCi0Jc3R3ICAgICByMjAsR1BSMjAocjIxKTsgXAotCW1mc3ByICAgcjIyLFNQUkcxOyAgICAgIFwKLQlzdHcgICAgIHIyMixHUFIyMShyMjEpOyBcCi0JbWZsciAgICByMjA7ICAgICAgICAgICAgXAotCXN0dyAgICAgcjIwLF9MSU5LKHIyMSk7IFwKLQltZmN0ciAgIHIyMjsgICAgICAgICAgICBcCi0Jc3R3ICAgICByMjIsX0NUUihyMjEpOyAgXAotCW1mc3ByICAgcjIwLFhFUjsgICAgICAgIFwKLQlzdHcgICAgIHIyMCxfWEVSKHIyMSk7ICBcCi0JbWZzcHIgICByMjIsOTkwOyAgICAgICAgLyogU1JSMiAqLyAgICAgIFwKLQltZnNwciAgIHIyMyw5OTE7ICAgICAgICAvKiBTUlIzICovICAgICAgXAotCXN0dyAgICAgcjAsR1BSMChyMjEpOyAgIFwKLQlzdHcgICAgIHIxLEdQUjEocjIxKTsgICBcCi0Jc3R3ICAgICByMixHUFIyKHIyMSk7ICAgXAotCXN0dyAgICAgcjEsMChyMjEpOyAgICAgIFwKLQltciAgICAgIHIxLHIyMTsgICAgICAgICAgICAgICAgIC8qIHNldCBuZXcga2VybmVsIHNwICovIFwKLQlTQVZFXzRHUFJTKDMsIHIyMSk7Ci0vKgotICogTm90ZTogY29kZSB3aGljaCBmb2xsb3dzIHRoaXMgdXNlcyBjcjAuZXEgKHNldCBpZiBmcm9tIGtlcm5lbCksCi0gKiByMjEsIHIyMiAoU1JSMiksIGFuZCByMjMgKFNSUjMpLgotICovCi0KLS8qCiAgKiBFeGNlcHRpb24gdmVjdG9ycy4KICAqCiAgKiBUaGUgZGF0YSB3b3JkcyBmb3IgYGhkbHInIGFuZCBgaW50X3JldHVybicgYXJlIGluaXRpYWxpemVkIHdpdGgKQEAgLTI5MywzMCArMjYwLDQ1IEBACiAjZGVmaW5lIFNURF9FWENFUFRJT04obiwgbGFiZWwsIGhkbHIpCQkJXAogCS4gPSBuOwkJCQkJCVwKIGxhYmVsOgkJCQkJCQlcCi0JRVhDRVBUSU9OX1BST0xPRzsJCQkJXAorCUVYQ0VQVElPTl9QUk9MT0coU1JSMCwgU1JSMSk7CQkJXAogCWx3eglyMyxHT1QodHJhbnNmZXJfdG9faGFuZGxlcik7CQlcCiAJbXRscglyMzsJCQkJCVwKIAlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFEOwkJXAogCWxpCXIyMCxNU1JfS0VSTkVMOwkJCQlcCiAJcmx3aW1pCXIyMCxyMjMsMCwyNSwyNTsJCQlcCi0JYmxybAk7IAkJCQkJXAorCWJscmw7CQkJCQkJXAogLkxfICMjIGxhYmVsIDoJCQkJCQlcCi0JLmxvbmcJaGRsciAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUOwlcCi0JLmxvbmcJaW50X3JldHVybiAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJLmxvbmcJaGRsciAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQ7CQlcCisJLmxvbmcJaW50X3JldHVybiAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQKIAorI2RlZmluZSBDUklUX0VYQ0VQVElPTihuLCBsYWJlbCwgaGRscikJCQkJXAorCS4gPSBuOwkJCQkJCQlcCitsYWJlbDoJCQkJCQkJCVwKKwlFWENFUFRJT05fUFJPTE9HKENTUlIwLCBDU1JSMSk7CQkJCVwKKwlsd3oJcjMsR09UKHRyYW5zZmVyX3RvX2hhbmRsZXIpOwkJCVwKKwltdGxyCXIzOwkJCQkJCVwKKwlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFEOwkJCVwKKwlsaQlyMjAsKE1TUl9LRVJORUwgJiB+KE1TUl9NRXxNU1JfREV8TVNSX0NFKSk7CVwKKwlybHdpbWkJcjIwLHIyMywwLDI1LDI1OwkJCQlcCisJYmxybDsJCQkJCQkJXAorLkxfICMjIGxhYmVsIDoJCQkJCQkJXAorCS5sb25nCWhkbHIgLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUOwkJCVwKKwkubG9uZwljcml0X3JldHVybiAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQKIAotI2RlZmluZSBDUklUX0VYQ0VQVElPTihuLCBsYWJlbCwgaGRscikgICAgICAgICAgICAgICAgICBcCi0JLiA9IG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JQ1JJVElDQUxfRVhDRVBUSU9OX1BST0xPRzsgICAgICAgICAgICAgICAgICAgICAgXAotCWx3eiAgICAgcjMsR09UKHRyYW5zZmVyX3RvX2hhbmRsZXIpOyAgICAgICAgICAgIFwKLQltdGxyICAgIHIzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JYWRkaSAgICByMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRDsgICAgICAgICAgICAgXAotCWxpICAgICAgcjIwLChNU1JfS0VSTkVMICYgfihNU1JfTUV8TVNSX0RFfE1TUl9DRSkpOyBcCi0Jcmx3aW1pICByMjAscjIzLDAsMjUsMjU7ICAgICAgICAgICAgICAgICAgICAgICAgXAotCWJscmwgICAgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS5MXyAjIyBsYWJlbCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCS5sb25nICAgaGRsciAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUOyAgICAgIFwKLQkubG9uZyAgIGNyaXRfcmV0dXJuIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKyNpZmRlZiBDT05GSUdfNDQwCisjZGVmaW5lIE1DS19FWENFUFRJT04obiwgbGFiZWwsIGhkbHIpCQkJCVwKKwkuID0gbjsJCQkJCQkJXAorbGFiZWw6CQkJCQkJCQlcCisJRVhDRVBUSU9OX1BST0xPRyhNQ1NSUjAsIE1DU1JSMSk7CQkJXAorCWx3eglyMyxHT1QodHJhbnNmZXJfdG9faGFuZGxlcik7CQkJXAorCW10bHIJcjM7CQkJCQkJXAorCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQ7CQkJXAorCWxpCXIyMCwoTVNSX0tFUk5FTCAmIH4oTVNSX01FfE1TUl9ERXxNU1JfQ0UpKTsJXAorCXJsd2ltaQlyMjAscjIzLDAsMjUsMjU7CQkJCVwKKwlibHJsOwkJCQkJCQlcCisuTF8gIyMgbGFiZWwgOgkJCQkJCQlcCisJLmxvbmcJaGRsciAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQ7CQkJXAorCS5sb25nCW1ja19yZXR1cm4gLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCisjZW5kaWYgLyogQ09ORklHXzQ0MCAgKi8KIAogI2VuZGlmCS8qIF9fUFBDX0FTTV9UTVBMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmFkZW9uLmggYi9pbmNsdWRlL3JhZGVvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMTFiMDUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3JhZGVvbi5oCkBAIC0wLDAgKzEsMTk4NCBAQAorI2lmbmRlZiBfUkFERU9OX0gKKyNkZWZpbmUgX1JBREVPTl9ICisKKworI2RlZmluZSBSQURFT05fUkVHU0laRQkJCTB4NDAwMAorCisKKyNkZWZpbmUgTU1fSU5ERVgJCQkweDAwMDAKKyNkZWZpbmUgTU1fREFUQQkJCQkweDAwMDQKKyNkZWZpbmUgQlVTX0NOVEwJCQkweDAwMzAKKyNkZWZpbmUgSElfU1RBVAkJCQkweDAwNEMKKyNkZWZpbmUgQlVTX0NOVEwxCQkJMHgwMDM0CisjZGVmaW5lIEkyQ19DTlRMXzEJCQkweDAwOTQKKyNkZWZpbmUgQ09ORklHX0NOVEwJCQkweDAwRTAKKyNkZWZpbmUgQ09ORklHX01FTVNJWkUJCQkweDAwRjgKKyNkZWZpbmUgQ09ORklHX0FQRVJfMF9CQVNFCQkweDAxMDAKKyNkZWZpbmUgQ09ORklHX0FQRVJfMV9CQVNFCQkweDAxMDQKKyNkZWZpbmUgQ09ORklHX0FQRVJfU0laRQkJMHgwMTA4CisjZGVmaW5lIENPTkZJR19SRUdfMV9CQVNFCQkweDAxMEMKKyNkZWZpbmUgQ09ORklHX1JFR19BUEVSX1NJWkUJCTB4MDExMAorI2RlZmluZSBQQURfQUdQSU5QVVRfREVMQVkJCTB4MDE2NAorI2RlZmluZSBQQURfQ1RMUl9TVFJFTkdUSAkJMHgwMTY4CisjZGVmaW5lIFBBRF9DVExSX1VQREFURQkJCTB4MDE2QworI2RlZmluZSBQQURfQ1RMUl9NSVNDCQkJMHgwYWEwCisjZGVmaW5lIEFHUF9DTlRMCQkJMHgwMTc0CisjZGVmaW5lIEJNX1NUQVRVUwkJCTB4MDE2MAorI2RlZmluZSBDQVAwX1RSSUdfQ05UTAkJCTB4MDk1MAorI2RlZmluZSBDQVAxX1RSSUdfQ05UTAkJCTB4MDljMAorI2RlZmluZSBWSVBIX0NPTlRST0wJCQkweDBDNDAKKyNkZWZpbmUgVkVORE9SX0lECQkJMHgwRjAwCisjZGVmaW5lIERFVklDRV9JRAkJCTB4MEYwMgorI2RlZmluZSBDT01NQU5ECQkJCTB4MEYwNAorI2RlZmluZSBTVEFUVVMJCQkJMHgwRjA2CisjZGVmaW5lIFJFVklTSU9OX0lECQkJMHgwRjA4CisjZGVmaW5lIFJFR1BST0dfSU5GCQkJMHgwRjA5CisjZGVmaW5lIFNVQl9DTEFTUwkJCTB4MEYwQQorI2RlZmluZSBCQVNFX0NPREUJCQkweDBGMEIKKyNkZWZpbmUgQ0FDSEVfTElORQkJCTB4MEYwQworI2RlZmluZSBMQVRFTkNZCQkJCTB4MEYwRAorI2RlZmluZSBIRUFERVIJCQkJMHgwRjBFCisjZGVmaW5lIEJJU1QJCQkJMHgwRjBGCisjZGVmaW5lIFJFR19NRU1fQkFTRQkJCTB4MEYxMAorI2RlZmluZSBSRUdfSU9fQkFTRQkJCTB4MEYxNAorI2RlZmluZSBSRUdfUkVHX0JBU0UJCQkweDBGMTgKKyNkZWZpbmUgQURBUFRFUl9JRAkJCTB4MEYyQworI2RlZmluZSBCSU9TX1JPTQkJCTB4MEYzMAorI2RlZmluZSBDQVBBQklMSVRJRVNfUFRSCQkweDBGMzQKKyNkZWZpbmUgSU5URVJSVVBUX0xJTkUJCQkweDBGM0MKKyNkZWZpbmUgSU5URVJSVVBUX1BJTgkJCTB4MEYzRAorI2RlZmluZSBNSU5fR1JBTlQJCQkweDBGM0UKKyNkZWZpbmUgTUFYX0xBVEVOQ1kJCQkweDBGM0YKKyNkZWZpbmUgQURBUFRFUl9JRF9XCQkJMHgwRjRDCisjZGVmaW5lIFBNSV9DQVBfSUQJCQkweDBGNTAKKyNkZWZpbmUgUE1JX05YVF9DQVBfUFRSCQkJMHgwRjUxCisjZGVmaW5lIFBNSV9QTUNfUkVHCQkJMHgwRjUyCisjZGVmaW5lIFBNX1NUQVRVUwkJCTB4MEY1NAorI2RlZmluZSBQTUlfREFUQQkJCTB4MEY1NworI2RlZmluZSBBR1BfQ0FQX0lECQkJMHgwRjU4CisjZGVmaW5lIEFHUF9TVEFUVVMJCQkweDBGNUMKKyNkZWZpbmUgQUdQX0NPTU1BTkQJCQkweDBGNjAKKyNkZWZpbmUgQUlDX0NUUkwJCQkweDAxRDAKKyNkZWZpbmUgQUlDX1NUQVQJCQkweDAxRDQKKyNkZWZpbmUgQUlDX1BUX0JBU0UJCQkweDAxRDgKKyNkZWZpbmUgQUlDX0xPX0FERFIJCQkweDAxREMKKyNkZWZpbmUgQUlDX0hJX0FERFIJCQkweDAxRTAKKyNkZWZpbmUgQUlDX1RMQl9BRERSCQkJMHgwMUU0CisjZGVmaW5lIEFJQ19UTEJfREFUQQkJCTB4MDFFOAorI2RlZmluZSBEQUNfQ05UTAkJCTB4MDA1OAorI2RlZmluZSBEQUNfQ05UTDIJCQkweDAwN2MKKyNkZWZpbmUgQ1JUQ19HRU5fQ05UTAkJCTB4MDA1MAorI2RlZmluZSBNRU1fQ05UTAkJCTB4MDE0MAorI2RlZmluZSBNQ19DTlRMCQkJCTB4MDE0MAorI2RlZmluZSBFWFRfTUVNX0NOVEwJCQkweDAxNDQKKyNkZWZpbmUgTUNfVElNSU5HX0NOVEwJCQkweDAxNDQKKyNkZWZpbmUgTUNfQUdQX0xPQ0FUSU9OCQkJMHgwMTRDCisjZGVmaW5lIE1FTV9JT19DTlRMX0EwCQkJMHgwMTc4CisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVEwJCTB4MDE3OAorI2RlZmluZSBNRU1fSU5JVF9MQVRFTkNZX1RJTUVSCQkweDAxNTQKKyNkZWZpbmUgTUNfSU5JVF9HRlhfTEFUX1RJTUVSCQkweDAxNTQKKyNkZWZpbmUgTUVNX1NEUkFNX01PREVfUkVHCQkweDAxNTgKKyNkZWZpbmUgQUdQX0JBU0UJCQkweDAxNzAKKyNkZWZpbmUgTUVNX0lPX0NOVExfQTEJCQkweDAxN0MKKyNkZWZpbmUgTUNfUkVBRF9DTlRMX0FCCQkJMHgwMTdDCisjZGVmaW5lIE1FTV9JT19DTlRMX0IwCQkJMHgwMTgwCisjZGVmaW5lIE1DX0lOSVRfTUlTQ19MQVRfVElNRVIJCTB4MDE4MAorI2RlZmluZSBNRU1fSU9fQ05UTF9CMQkJCTB4MDE4NAorI2RlZmluZSBNQ19JT1BBRF9DTlRMCQkJMHgwMTg0CisjZGVmaW5lIE1DX0RFQlVHCQkJMHgwMTg4CisjZGVmaW5lIE1DX1NUQVRVUwkJCTB4MDE1MAorI2RlZmluZSBNRU1fSU9fT0VfQ05UTAkJCTB4MDE4QworI2RlZmluZSBNQ19DSElQX0lPX09FX0NOVExfQUIJCTB4MDE4QworI2RlZmluZSBNQ19GQl9MT0NBVElPTgkJCTB4MDE0OAorLyogI2RlZmluZSBNQ19GQl9MT0NBVElPTgkJMHgwMTg4ICovCisjZGVmaW5lIEhPU1RfUEFUSF9DTlRMCQkJMHgwMTMwCisjZGVmaW5lIE1FTV9WR0FfV1BfU0VMCQkJMHgwMDM4CisjZGVmaW5lIE1FTV9WR0FfUlBfU0VMCQkJMHgwMDNDCisjZGVmaW5lIEhEUF9ERUJVRwkJCTB4MDEzOAorI2RlZmluZSBTV19TRU1BUEhPUkUJCQkweDAxM0MKKyNkZWZpbmUgQ1JUQzJfR0VOX0NOVEwJCQkweDAzZjgKKyNkZWZpbmUgQ1JUQzJfRElTUExBWV9CQVNFX0FERFIJCTB4MDMzYworI2RlZmluZSBTVVJGQUNFX0NOVEwJCQkweDBCMDAKKyNkZWZpbmUgU1VSRkFDRTBfTE9XRVJfQk9VTkQJCTB4MEIwNAorI2RlZmluZSBTVVJGQUNFMV9MT1dFUl9CT1VORAkJMHgwQjE0CisjZGVmaW5lIFNVUkZBQ0UyX0xPV0VSX0JPVU5ECQkweDBCMjQKKyNkZWZpbmUgU1VSRkFDRTNfTE9XRVJfQk9VTkQJCTB4MEIzNAorI2RlZmluZSBTVVJGQUNFNF9MT1dFUl9CT1VORAkJMHgwQjQ0CisjZGVmaW5lIFNVUkZBQ0U1X0xPV0VSX0JPVU5ECQkweDBCNTQKKyNkZWZpbmUgU1VSRkFDRTZfTE9XRVJfQk9VTkQJCTB4MEI2NAorI2RlZmluZSBTVVJGQUNFN19MT1dFUl9CT1VORAkJMHgwQjc0CisjZGVmaW5lIFNVUkZBQ0UwX1VQUEVSX0JPVU5ECQkweDBCMDgKKyNkZWZpbmUgU1VSRkFDRTFfVVBQRVJfQk9VTkQJCTB4MEIxOAorI2RlZmluZSBTVVJGQUNFMl9VUFBFUl9CT1VORAkJMHgwQjI4CisjZGVmaW5lIFNVUkZBQ0UzX1VQUEVSX0JPVU5ECQkweDBCMzgKKyNkZWZpbmUgU1VSRkFDRTRfVVBQRVJfQk9VTkQJCTB4MEI0OAorI2RlZmluZSBTVVJGQUNFNV9VUFBFUl9CT1VORAkJMHgwQjU4CisjZGVmaW5lIFNVUkZBQ0U2X1VQUEVSX0JPVU5ECQkweDBCNjgKKyNkZWZpbmUgU1VSRkFDRTdfVVBQRVJfQk9VTkQJCTB4MEI3OAorI2RlZmluZSBTVVJGQUNFMF9JTkZPCQkJMHgwQjBDCisjZGVmaW5lIFNVUkZBQ0UxX0lORk8JCQkweDBCMUMKKyNkZWZpbmUgU1VSRkFDRTJfSU5GTwkJCTB4MEIyQworI2RlZmluZSBTVVJGQUNFM19JTkZPCQkJMHgwQjNDCisjZGVmaW5lIFNVUkZBQ0U0X0lORk8JCQkweDBCNEMKKyNkZWZpbmUgU1VSRkFDRTVfSU5GTwkJCTB4MEI1QworI2RlZmluZSBTVVJGQUNFNl9JTkZPCQkJMHgwQjZDCisjZGVmaW5lIFNVUkZBQ0U3X0lORk8JCQkweDBCN0MKKyNkZWZpbmUgU1VSRkFDRV9BQ0NFU1NfRkxBR1MJCTB4MEJGOAorI2RlZmluZSBTVVJGQUNFX0FDQ0VTU19DTFIJCTB4MEJGQworI2RlZmluZSBHRU5fSU5UX0NOVEwJCQkweDAwNDAKKyNkZWZpbmUgR0VOX0lOVF9TVEFUVVMJCQkweDAwNDQKKyNkZWZpbmUgQ1JUQ19FWFRfQ05UTAkJCTB4MDA1NAorI2RlZmluZSBSQjNEX0NOVEwJCQkweDFDM0MKKyNkZWZpbmUgV0FJVF9VTlRJTAkJCTB4MTcyMAorI2RlZmluZSBJU1lOQ19DTlRMCQkJMHgxNzI0CisjZGVmaW5lIFJCQk1fR1VJQ05UTAkJCTB4MTcyQworI2RlZmluZSBSQkJNX1NUQVRVUwkJCTB4MEU0MAorI2RlZmluZSBSQkJNX1NUQVRVU19hbHRfMQkJMHgxNzQwCisjZGVmaW5lIFJCQk1fQ05UTAkJCTB4MDBFQworI2RlZmluZSBSQkJNX0NOVExfYWx0XzEJCQkweDBFNDQKKyNkZWZpbmUgUkJCTV9TT0ZUX1JFU0VUCQkJMHgwMEYwCisjZGVmaW5lIFJCQk1fU09GVF9SRVNFVF9hbHRfMQkJMHgwRTQ4CisjZGVmaW5lIE5RV0FJVF9VTlRJTAkJCTB4MEU1MAorI2RlZmluZSBSQkJNX0RFQlVHCQkJMHgwRTZDCisjZGVmaW5lIFJCQk1fQ01ERklGT19BRERSCQkweDBFNzAKKyNkZWZpbmUgUkJCTV9DTURGSUZPX0RBVEFMCQkweDBFNzQKKyNkZWZpbmUgUkJCTV9DTURGSUZPX0RBVEFICQkweDBFNzgKKyNkZWZpbmUgUkJCTV9DTURGSUZPX1NUQVQJCTB4MEU3QworI2RlZmluZSBDUlRDX1NUQVRVUwkJCTB4MDA1QworI2RlZmluZSBHUElPX1ZHQV9EREMJCQkweDAwNjAKKyNkZWZpbmUgR1BJT19EVklfRERDCQkJMHgwMDY0CisjZGVmaW5lIEdQSU9fTU9OSUQJCQkweDAwNjgKKyNkZWZpbmUgR1BJT19DUlQyX0REQwkJCTB4MDA2YworI2RlZmluZSBQQUxFVFRFX0lOREVYCQkJMHgwMEIwCisjZGVmaW5lIFBBTEVUVEVfREFUQQkJCTB4MDBCNAorI2RlZmluZSBQQUxFVFRFXzMwX0RBVEEJCQkweDAwQjgKKyNkZWZpbmUgQ1JUQ19IX1RPVEFMX0RJU1AJCTB4MDIwMAorI2RlZmluZSBDUlRDX0hfU1lOQ19TVFJUX1dJRAkJMHgwMjA0CisjZGVmaW5lIENSVENfVl9UT1RBTF9ESVNQCQkweDAyMDgKKyNkZWZpbmUgQ1JUQ19WX1NZTkNfU1RSVF9XSUQJCTB4MDIwQworI2RlZmluZSBDUlRDX1ZMSU5FX0NSTlRfVkxJTkUJCTB4MDIxMAorI2RlZmluZSBDUlRDX0NSTlRfRlJBTUUJCQkweDAyMTQKKyNkZWZpbmUgQ1JUQ19HVUlfVFJJR19WTElORQkJMHgwMjE4CisjZGVmaW5lIENSVENfREVCVUcJCQkweDAyMUMKKyNkZWZpbmUgQ1JUQ19PRkZTRVRfUklHSFQJCTB4MDIyMAorI2RlZmluZSBDUlRDX09GRlNFVAkJCTB4MDIyNAorI2RlZmluZSBDUlRDX09GRlNFVF9DTlRMCQkweDAyMjgKKyNkZWZpbmUgQ1JUQ19QSVRDSAkJCTB4MDIyQworI2RlZmluZSBPVlJfQ0xSCQkJCTB4MDIzMAorI2RlZmluZSBPVlJfV0lEX0xFRlRfUklHSFQJCTB4MDIzNAorI2RlZmluZSBPVlJfV0lEX1RPUF9CT1RUT00JCTB4MDIzOAorI2RlZmluZSBESVNQTEFZX0JBU0VfQUREUgkJMHgwMjNDCisjZGVmaW5lIFNOQVBTSE9UX1ZIX0NPVU5UUwkJMHgwMjQwCisjZGVmaW5lIFNOQVBTSE9UX0ZfQ09VTlQJCTB4MDI0NAorI2RlZmluZSBOX1ZJRl9DT1VOVAkJCTB4MDI0OAorI2RlZmluZSBTTkFQU0hPVF9WSUZfQ09VTlQJCTB4MDI0QworI2RlZmluZSBGUF9DUlRDX0hfVE9UQUxfRElTUAkJMHgwMjUwCisjZGVmaW5lIEZQX0NSVENfVl9UT1RBTF9ESVNQCQkweDAyNTQKKyNkZWZpbmUgQ1JUX0NSVENfSF9TWU5DX1NUUlRfV0lECTB4MDI1OAorI2RlZmluZSBDUlRfQ1JUQ19WX1NZTkNfU1RSVF9XSUQJMHgwMjVDCisjZGVmaW5lIENVUl9PRkZTRVQJCQkweDAyNjAKKyNkZWZpbmUgQ1VSX0hPUlpfVkVSVF9QT1NOCQkweDAyNjQKKyNkZWZpbmUgQ1VSX0hPUlpfVkVSVF9PRkYJCTB4MDI2OAorI2RlZmluZSBDVVJfQ0xSMAkJCTB4MDI2QworI2RlZmluZSBDVVJfQ0xSMQkJCTB4MDI3MAorI2RlZmluZSBGUF9IT1JaX1ZFUlRfQUNUSVZFCQkweDAyNzgKKyNkZWZpbmUgQ1JUQ19NT1JFX0NOVEwJCQkweDAyN0MKKyNkZWZpbmUgQ1JUQ19IX0NVVE9GRl9BQ1RJVkVfRU4JCSgxPDw0KQorI2RlZmluZSBDUlRDX1ZfQ1VUT0ZGX0FDVElWRV9FTgkJKDE8PDUpCisjZGVmaW5lIERBQ19FWFRfQ05UTAkJCTB4MDI4MAorI2RlZmluZSBGUF9HRU5fQ05UTAkJCTB4MDI4NAorI2RlZmluZSBGUF9IT1JaX1NUUkVUQ0gJCQkweDAyOEMKKyNkZWZpbmUgRlBfVkVSVF9TVFJFVENICQkJMHgwMjkwCisjZGVmaW5lIEZQX0hfU1lOQ19TVFJUX1dJRAkJMHgwMkM0CisjZGVmaW5lIEZQX1ZfU1lOQ19TVFJUX1dJRAkJMHgwMkM4CisjZGVmaW5lIEFVWF9XSU5ET1dfSE9SWl9DTlRMCQkweDAyRDgKKyNkZWZpbmUgQVVYX1dJTkRPV19WRVJUX0NOVEwJCTB4MDJEQworLyogI2RlZmluZSBEREFfQ09ORklHCQkJMHgwMmUwICovCisvKiAjZGVmaW5lIEREQV9PTl9PRkYJCQkweDAyZTQgKi8KKyNkZWZpbmUgRFZJX0kyQ19DTlRMXzEJCQkweDAyZTQKKyNkZWZpbmUgR1JQSF9CVUZGRVJfQ05UTAkJMHgwMkYwCisjZGVmaW5lIEdSUEgyX0JVRkZFUl9DTlRMCQkweDAzRjAKKyNkZWZpbmUgVkdBX0JVRkZFUl9DTlRMCQkJMHgwMkY0CisjZGVmaW5lIE9WMF9ZX1hfU1RBUlQJCQkweDA0MDAKKyNkZWZpbmUgT1YwX1lfWF9FTkQJCQkweDA0MDQKKyNkZWZpbmUgT1YwX1BJUEVMSU5FX0NOVEwJCTB4MDQwOAorI2RlZmluZSBPVjBfUkVHX0xPQURfQ05UTAkJMHgwNDEwCisjZGVmaW5lIE9WMF9TQ0FMRV9DTlRMCQkJMHgwNDIwCisjZGVmaW5lIE9WMF9WX0lOQwkJCTB4MDQyNAorI2RlZmluZSBPVjBfUDFfVl9BQ0NVTV9JTklUCQkweDA0MjgKKyNkZWZpbmUgT1YwX1AyM19WX0FDQ1VNX0lOSVQJCTB4MDQyQworI2RlZmluZSBPVjBfUDFfQkxBTktfTElORVNfQVRfVE9QCTB4MDQzMAorI2RlZmluZSBPVjBfUDIzX0JMQU5LX0xJTkVTX0FUX1RPUAkweDA0MzQKKyNkZWZpbmUgT1YwX0JBU0VfQUREUgkJCTB4MDQzQworI2RlZmluZSBPVjBfVklEX0JVRjBfQkFTRV9BRFJTCQkweDA0NDAKKyNkZWZpbmUgT1YwX1ZJRF9CVUYxX0JBU0VfQURSUwkJMHgwNDQ0CisjZGVmaW5lIE9WMF9WSURfQlVGMl9CQVNFX0FEUlMJCTB4MDQ0OAorI2RlZmluZSBPVjBfVklEX0JVRjNfQkFTRV9BRFJTCQkweDA0NEMKKyNkZWZpbmUgT1YwX1ZJRF9CVUY0X0JBU0VfQURSUwkJMHgwNDUwCisjZGVmaW5lIE9WMF9WSURfQlVGNV9CQVNFX0FEUlMJCTB4MDQ1NAorI2RlZmluZSBPVjBfVklEX0JVRl9QSVRDSDBfVkFMVUUJMHgwNDYwCisjZGVmaW5lIE9WMF9WSURfQlVGX1BJVENIMV9WQUxVRQkweDA0NjQKKyNkZWZpbmUgT1YwX0FVVE9fRkxJUF9DTlRSTAkJMHgwNDcwCisjZGVmaW5lIE9WMF9ERUlOVEVSTEFDRV9QQVRURVJOCQkweDA0NzQKKyNkZWZpbmUgT1YwX1NVQk1JVF9ISVNUT1JZCQkweDA0NzgKKyNkZWZpbmUgT1YwX0hfSU5DCQkJMHgwNDgwCisjZGVmaW5lIE9WMF9TVEVQX0JZCQkJMHgwNDg0CisjZGVmaW5lIE9WMF9QMV9IX0FDQ1VNX0lOSVQJCTB4MDQ4OAorI2RlZmluZSBPVjBfUDIzX0hfQUNDVU1fSU5JVAkJMHgwNDhDCisjZGVmaW5lIE9WMF9QMV9YX1NUQVJUX0VORAkJMHgwNDk0CisjZGVmaW5lIE9WMF9QMl9YX1NUQVJUX0VORAkJMHgwNDk4CisjZGVmaW5lIE9WMF9QM19YX1NUQVJUX0VORAkJMHgwNDlDCisjZGVmaW5lIE9WMF9GSUxURVJfQ05UTAkJCTB4MDRBMAorI2RlZmluZSBPVjBfRk9VUl9UQVBfQ09FRl8wCQkweDA0QjAKKyNkZWZpbmUgT1YwX0ZPVVJfVEFQX0NPRUZfMQkJMHgwNEI0CisjZGVmaW5lIE9WMF9GT1VSX1RBUF9DT0VGXzIJCTB4MDRCOAorI2RlZmluZSBPVjBfRk9VUl9UQVBfQ09FRl8zCQkweDA0QkMKKyNkZWZpbmUgT1YwX0ZPVVJfVEFQX0NPRUZfNAkJMHgwNEMwCisjZGVmaW5lIE9WMF9GTEFHX0NOVFJMCQkJMHgwNERDCisjZGVmaW5lIE9WMF9TTElDRV9DTlRMCQkJMHgwNEUwCisjZGVmaW5lIE9WMF9WSURfS0VZX0NMUl9MT1cJCTB4MDRFNAorI2RlZmluZSBPVjBfVklEX0tFWV9DTFJfSElHSAkJMHgwNEU4CisjZGVmaW5lIE9WMF9HUlBIX0tFWV9DTFJfTE9XCQkweDA0RUMKKyNkZWZpbmUgT1YwX0dSUEhfS0VZX0NMUl9ISUdICQkweDA0RjAKKyNkZWZpbmUgT1YwX0tFWV9DTlRMCQkJMHgwNEY0CisjZGVmaW5lIE9WMF9URVNUCQkJMHgwNEY4CisjZGVmaW5lIFNVQlBJQ19DTlRMCQkJMHgwNTQwCisjZGVmaW5lIFNVQlBJQ19ERUZDT0xDT04JCTB4MDU0NAorI2RlZmluZSBTVUJQSUNfWV9YX1NUQVJUCQkweDA1NEMKKyNkZWZpbmUgU1VCUElDX1lfWF9FTkQJCQkweDA1NTAKKyNkZWZpbmUgU1VCUElDX1ZfSU5DCQkJMHgwNTU0CisjZGVmaW5lIFNVQlBJQ19IX0lOQwkJCTB4MDU1OAorI2RlZmluZSBTVUJQSUNfQlVGMF9PRkZTRVQJCTB4MDU1QworI2RlZmluZSBTVUJQSUNfQlVGMV9PRkZTRVQJCTB4MDU2MAorI2RlZmluZSBTVUJQSUNfTEMwX09GRlNFVAkJMHgwNTY0CisjZGVmaW5lIFNVQlBJQ19MQzFfT0ZGU0VUCQkweDA1NjgKKyNkZWZpbmUgU1VCUElDX1BJVENICQkJMHgwNTZDCisjZGVmaW5lIFNVQlBJQ19CVE5fSExJX0NPTENPTgkJMHgwNTcwCisjZGVmaW5lIFNVQlBJQ19CVE5fSExJX1lfWF9TVEFSVAkweDA1NzQKKyNkZWZpbmUgU1VCUElDX0JUTl9ITElfWV9YX0VORAkJMHgwNTc4CisjZGVmaW5lIFNVQlBJQ19QQUxFVFRFX0lOREVYCQkweDA1N0MKKyNkZWZpbmUgU1VCUElDX1BBTEVUVEVfREFUQQkJMHgwNTgwCisjZGVmaW5lIFNVQlBJQ19IX0FDQ1VNX0lOSVQJCTB4MDU4NAorI2RlZmluZSBTVUJQSUNfVl9BQ0NVTV9JTklUCQkweDA1ODgKKyNkZWZpbmUgRElTUF9NSVNDX0NOVEwJCQkweDBEMDAKKyNkZWZpbmUgREFDX01BQ1JPX0NOVEwJCQkweDBEMDQKKyNkZWZpbmUgRElTUF9QV1JfTUFOCQkJMHgwRDA4CisjZGVmaW5lIERJU1BfVEVTVF9ERUJVR19DTlRMCQkweDBEMTAKKyNkZWZpbmUgRElTUF9IV19ERUJVRwkJCTB4MEQxNAorI2RlZmluZSBEQUNfQ1JDX1NJRzEJCQkweDBEMTgKKyNkZWZpbmUgREFDX0NSQ19TSUcyCQkJMHgwRDFDCisjZGVmaW5lIE9WMF9MSU5fVFJBTlNfQQkJCTB4MEQyMAorI2RlZmluZSBPVjBfTElOX1RSQU5TX0IJCQkweDBEMjQKKyNkZWZpbmUgT1YwX0xJTl9UUkFOU19DCQkJMHgwRDI4CisjZGVmaW5lIE9WMF9MSU5fVFJBTlNfRAkJCTB4MEQyQworI2RlZmluZSBPVjBfTElOX1RSQU5TX0UJCQkweDBEMzAKKyNkZWZpbmUgT1YwX0xJTl9UUkFOU19GCQkJMHgwRDM0CisjZGVmaW5lIE9WMF9HQU1NQV8wX0YJCQkweDBENDAKKyNkZWZpbmUgT1YwX0dBTU1BXzEwXzFGCQkJMHgwRDQ0CisjZGVmaW5lIE9WMF9HQU1NQV8yMF8zRgkJCTB4MEQ0OAorI2RlZmluZSBPVjBfR0FNTUFfNDBfN0YJCQkweDBENEMKKyNkZWZpbmUgT1YwX0dBTU1BXzM4MF8zQkYJCTB4MEQ1MAorI2RlZmluZSBPVjBfR0FNTUFfM0MwXzNGRgkJMHgwRDU0CisjZGVmaW5lIERJU1BfTUVSR0VfQ05UTAkJCTB4MEQ2MAorI2RlZmluZSBESVNQX09VVFBVVF9DTlRMCQkweDBENjQKKyNkZWZpbmUgRElTUF9MSU5fVFJBTlNfR1JQSF9BCQkweDBEODAKKyNkZWZpbmUgRElTUF9MSU5fVFJBTlNfR1JQSF9CCQkweDBEODQKKyNkZWZpbmUgRElTUF9MSU5fVFJBTlNfR1JQSF9DCQkweDBEODgKKyNkZWZpbmUgRElTUF9MSU5fVFJBTlNfR1JQSF9ECQkweDBEOEMKKyNkZWZpbmUgRElTUF9MSU5fVFJBTlNfR1JQSF9FCQkweDBEOTAKKyNkZWZpbmUgRElTUF9MSU5fVFJBTlNfR1JQSF9GCQkweDBEOTQKKyNkZWZpbmUgRElTUF9MSU5fVFJBTlNfVklEX0EJCTB4MEQ5OAorI2RlZmluZSBESVNQX0xJTl9UUkFOU19WSURfQgkJMHgwRDlDCisjZGVmaW5lIERJU1BfTElOX1RSQU5TX1ZJRF9DCQkweDBEQTAKKyNkZWZpbmUgRElTUF9MSU5fVFJBTlNfVklEX0QJCTB4MERBNAorI2RlZmluZSBESVNQX0xJTl9UUkFOU19WSURfRQkJMHgwREE4CisjZGVmaW5lIERJU1BfTElOX1RSQU5TX1ZJRF9GCQkweDBEQUMKKyNkZWZpbmUgUk1YX0hPUlpfRklMVEVSXzBUQVBfQ09FRgkweDBEQjAKKyNkZWZpbmUgUk1YX0hPUlpfRklMVEVSXzFUQVBfQ09FRgkweDBEQjQKKyNkZWZpbmUgUk1YX0hPUlpfRklMVEVSXzJUQVBfQ09FRgkweDBEQjgKKyNkZWZpbmUgUk1YX0hPUlpfUEhBU0UJCQkweDBEQkMKKyNkZWZpbmUgREFDX0VNQkVEREVEX1NZTkNfQ05UTAkJMHgwREMwCisjZGVmaW5lIERBQ19CUk9BRF9QVUxTRQkJCTB4MERDNAorI2RlZmluZSBEQUNfU0tFV19DTEtTCQkJMHgwREM4CisjZGVmaW5lIERBQ19JTkNSCQkJMHgwRENDCisjZGVmaW5lIERBQ19ORUdfU1lOQ19MRVZFTAkJMHgwREQwCisjZGVmaW5lIERBQ19QT1NfU1lOQ19MRVZFTAkJMHgwREQ0CisjZGVmaW5lIERBQ19CTEFOS19MRVZFTAkJCTB4MEREOAorI2RlZmluZSBDTE9DS19DTlRMX0lOREVYCQkweDAwMDgKKyNkZWZpbmUgQ0xPQ0tfQ05UTF9EQVRBCQkJMHgwMDBDCisjZGVmaW5lIENQX1JCX0NOVEwJCQkweDA3MDQKKyNkZWZpbmUgQ1BfUkJfQkFTRQkJCTB4MDcwMAorI2RlZmluZSBDUF9SQl9SUFRSX0FERFIJCQkweDA3MEMKKyNkZWZpbmUgQ1BfUkJfUlBUUgkJCTB4MDcxMAorI2RlZmluZSBDUF9SQl9XUFRSCQkJMHgwNzE0CisjZGVmaW5lIENQX1JCX1dQVFJfREVMQVkJCTB4MDcxOAorI2RlZmluZSBDUF9JQl9CQVNFCQkJMHgwNzM4CisjZGVmaW5lIENQX0lCX0JVRlNaCQkJMHgwNzNDCisjZGVmaW5lIFNDUkFUQ0hfUkVHMAkJCTB4MTVFMAorI2RlZmluZSBHVUlfU0NSQVRDSF9SRUcwCQkweDE1RTAKKyNkZWZpbmUgU0NSQVRDSF9SRUcxCQkJMHgxNUU0CisjZGVmaW5lIEdVSV9TQ1JBVENIX1JFRzEJCTB4MTVFNAorI2RlZmluZSBTQ1JBVENIX1JFRzIJCQkweDE1RTgKKyNkZWZpbmUgR1VJX1NDUkFUQ0hfUkVHMgkJMHgxNUU4CisjZGVmaW5lIFNDUkFUQ0hfUkVHMwkJCTB4MTVFQworI2RlZmluZSBHVUlfU0NSQVRDSF9SRUczCQkweDE1RUMKKyNkZWZpbmUgU0NSQVRDSF9SRUc0CQkJMHgxNUYwCisjZGVmaW5lIEdVSV9TQ1JBVENIX1JFRzQJCTB4MTVGMAorI2RlZmluZSBTQ1JBVENIX1JFRzUJCQkweDE1RjQKKyNkZWZpbmUgR1VJX1NDUkFUQ0hfUkVHNQkJMHgxNUY0CisjZGVmaW5lIFNDUkFUQ0hfVU1TSwkJCTB4MDc3MAorI2RlZmluZSBTQ1JBVENIX0FERFIJCQkweDA3NzQKKyNkZWZpbmUgRFBfQlJVU0hfRlJHRF9DTFIJCTB4MTQ3QworI2RlZmluZSBEUF9CUlVTSF9CS0dEX0NMUgkJMHgxNDc4CisjZGVmaW5lIERTVF9MSU5FX1NUQVJUCQkJMHgxNjAwCisjZGVmaW5lIERTVF9MSU5FX0VORAkJCTB4MTYwNAorI2RlZmluZSBTUkNfT0ZGU0VUCQkJMHgxNUFDCisjZGVmaW5lIFNSQ19QSVRDSAkJCTB4MTVCMAorI2RlZmluZSBTUkNfVElMRQkJCTB4MTcwNAorI2RlZmluZSBTUkNfUElUQ0hfT0ZGU0VUCQkweDE0MjgKKyNkZWZpbmUgU1JDX1gJCQkJMHgxNDE0CisjZGVmaW5lIFNSQ19ZCQkJCTB4MTQxOAorI2RlZmluZSBTUkNfWF9ZCQkJCTB4MTU5MAorI2RlZmluZSBTUkNfWV9YCQkJCTB4MTQzNAorI2RlZmluZSBEU1RfWV9YCQkJCTB4MTQzOAorI2RlZmluZSBEU1RfV0lEVEhfSEVJR0hUCQkweDE1OTgKKyNkZWZpbmUgRFNUX0hFSUdIVF9XSURUSAkJMHgxNDNjCisjZGVmaW5lIERTVF9PRkZTRVQJCQkweDE0MDQKKyNkZWZpbmUgU1JDX0NMVVRfQUREUkVTUwkJMHgxNzgwCisjZGVmaW5lIFNSQ19DTFVUX0RBVEEJCQkweDE3ODQKKyNkZWZpbmUgU1JDX0NMVVRfREFUQV9SRAkJMHgxNzg4CisjZGVmaW5lIEhPU1RfREFUQTAJCQkweDE3QzAKKyNkZWZpbmUgSE9TVF9EQVRBMQkJCTB4MTdDNAorI2RlZmluZSBIT1NUX0RBVEEyCQkJMHgxN0M4CisjZGVmaW5lIEhPU1RfREFUQTMJCQkweDE3Q0MKKyNkZWZpbmUgSE9TVF9EQVRBNAkJCTB4MTdEMAorI2RlZmluZSBIT1NUX0RBVEE1CQkJMHgxN0Q0CisjZGVmaW5lIEhPU1RfREFUQTYJCQkweDE3RDgKKyNkZWZpbmUgSE9TVF9EQVRBNwkJCTB4MTdEQworI2RlZmluZSBIT1NUX0RBVEFfTEFTVAkJCTB4MTdFMAorI2RlZmluZSBEUF9TUkNfRU5ESUFOCQkJMHgxNUQ0CisjZGVmaW5lIERQX1NSQ19GUkdEX0NMUgkJCTB4MTVEOAorI2RlZmluZSBEUF9TUkNfQktHRF9DTFIJCQkweDE1REMKKyNkZWZpbmUgU0NfTEVGVAkJCQkweDE2NDAKKyNkZWZpbmUgU0NfUklHSFQJCQkweDE2NDQKKyNkZWZpbmUgU0NfVE9QCQkJCTB4MTY0OAorI2RlZmluZSBTQ19CT1RUT00JCQkweDE2NEMKKyNkZWZpbmUgU1JDX1NDX1JJR0hUCQkJMHgxNjU0CisjZGVmaW5lIFNSQ19TQ19CT1RUT00JCQkweDE2NUMKKyNkZWZpbmUgRFBfQ05UTAkJCQkweDE2QzAKKyNkZWZpbmUgRFBfQ05UTF9YRElSX1lESVJfWU1BSk9SCTB4MTZEMAorI2RlZmluZSBEUF9EQVRBVFlQRQkJCTB4MTZDNAorI2RlZmluZSBEUF9NSVgJCQkJMHgxNkM4CisjZGVmaW5lIERQX1dSSVRFX01TSwkJCTB4MTZDQworI2RlZmluZSBEUF9YT1AJCQkJMHgxN0Y4CisjZGVmaW5lIENMUl9DTVBfQ0xSX1NSQwkJCTB4MTVDNAorI2RlZmluZSBDTFJfQ01QX0NMUl9EU1QJCQkweDE1QzgKKyNkZWZpbmUgQ0xSX0NNUF9DTlRMCQkJMHgxNUMwCisjZGVmaW5lIENMUl9DTVBfTVNLCQkJMHgxNUNDCisjZGVmaW5lIERTVENBQ0hFX01PREUJCQkweDE3MTAKKyNkZWZpbmUgRFNUQ0FDSEVfQ1RMU1RBVAkJMHgxNzE0CisjZGVmaW5lIERFRkFVTFRfUElUQ0hfT0ZGU0VUCQkweDE2RTAKKyNkZWZpbmUgREVGQVVMVF9TQ19CT1RUT01fUklHSFQJCTB4MTZFOAorI2RlZmluZSBERUZBVUxUX1NDX1RPUF9MRUZUCQkweDE2RUMKKyNkZWZpbmUgU1JDX1BJVENIX09GRlNFVAkJMHgxNDI4CisjZGVmaW5lIERTVF9QSVRDSF9PRkZTRVQJCTB4MTQyQworI2RlZmluZSBEUF9HVUlfTUFTVEVSX0NOVEwJCTB4MTQ2QworI2RlZmluZSBTQ19UT1BfTEVGVAkJCTB4MTZFQworI2RlZmluZSBTQ19CT1RUT01fUklHSFQJCQkweDE2RjAKKyNkZWZpbmUgU1JDX1NDX0JPVFRPTV9SSUdIVAkJMHgxNkY0CisjZGVmaW5lIFJCMkRfRFNUQ0FDSEVfTU9ERQkJMHgzNDI4CisjZGVmaW5lIFJCMkRfRFNUQ0FDSEVfQ1RMU1RBVAkJMHgzNDJDCisjZGVmaW5lIExWRFNfR0VOX0NOVEwJCQkweDAyZDAKKyNkZWZpbmUgTFZEU19QTExfQ05UTAkJCTB4MDJkNAorI2RlZmluZSBGUDJfR0VOX0NOVEwJCQkweDAyODgKKyNkZWZpbmUgVE1EU19DTlRMCQkJMHgwMjk0CisjZGVmaW5lIFRNRFNfQ1JDCQkJMHgwMmEwCisjZGVmaW5lIFRNRFNfVFJBTlNNSVRURVJfQ05UTAkJMHgwMmE0CisjZGVmaW5lIE1QUF9UQl9DT05GSUcJCQkweDAxYzAKKyNkZWZpbmUgUEFNQUMwX0RMWV9DTlRMCQkJMHgwYTk0CisjZGVmaW5lIFBBTUFDMV9ETFlfQ05UTAkJCTB4MGE5OAorI2RlZmluZSBQQU1BQzJfRExZX0NOVEwJCQkweDBhOWMKKyNkZWZpbmUgRldfQ05UTAkJCQkweDAxMTgKKyNkZWZpbmUgRkNQX0NOVEwJCQkweDA5MTAKKyNkZWZpbmUgVkdBX0REQV9PTl9PRkYJCQkweDAyZWMKKyNkZWZpbmUgVFZfTUFTVEVSX0NOVEwJCQkweDA4MDAKKworLyogI2RlZmluZSBCQVNFX0NPREUJCQkweDBmMGIgKi8KKyNkZWZpbmUgQklPU18wX1NDUkFUQ0gJCQkweDAwMTAKKyNkZWZpbmUgQklPU18xX1NDUkFUQ0gJCQkweDAwMTQKKyNkZWZpbmUgQklPU18yX1NDUkFUQ0gJCQkweDAwMTgKKyNkZWZpbmUgQklPU18zX1NDUkFUQ0gJCQkweDAwMWMKKyNkZWZpbmUgQklPU180X1NDUkFUQ0gJCQkweDAwMjAKKyNkZWZpbmUgQklPU181X1NDUkFUQ0gJCQkweDAwMjQKKyNkZWZpbmUgQklPU182X1NDUkFUQ0gJCQkweDAwMjgKKyNkZWZpbmUgQklPU183X1NDUkFUQ0gJCQkweDAwMmMKKworI2RlZmluZSBIRFBfU09GVF9SRVNFVAkJCSgxIDw8IDI2KQorCisjZGVmaW5lIFRWX0RBQ19DTlRMCQkJMHgwODhjCisjZGVmaW5lIEdQSU9QQURfTUFTSwkJCTB4MDE5OAorI2RlZmluZSBHUElPUEFEX0EJCQkweDAxOWMKKyNkZWZpbmUgR1BJT1BBRF9FTgkJCTB4MDFhMAorI2RlZmluZSBHUElPUEFEX1kJCQkweDAxYTQKKyNkZWZpbmUgWlZfTENEUEFEX01BU0sJCQkweDAxYTgKKyNkZWZpbmUgWlZfTENEUEFEX0EJCQkweDAxYWMKKyNkZWZpbmUgWlZfTENEUEFEX0VOCQkJMHgwMWIwCisjZGVmaW5lIFpWX0xDRFBBRF9ZCQkJMHgwMWI0CisKKy8qIFBMTCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgQ0xLX1BJTl9DTlRMCQkJMHgwMDAxCisjZGVmaW5lIFBQTExfQ05UTAkJCTB4MDAwMgorI2RlZmluZSBQUExMX1JFRl9ESVYJCQkweDAwMDMKKyNkZWZpbmUgUFBMTF9ESVZfMAkJCTB4MDAwNAorI2RlZmluZSBQUExMX0RJVl8xCQkJMHgwMDA1CisjZGVmaW5lIFBQTExfRElWXzIJCQkweDAwMDYKKyNkZWZpbmUgUFBMTF9ESVZfMwkJCTB4MDAwNworI2RlZmluZSBWQ0xLX0VDUF9DTlRMCQkJMHgwMDA4CisjZGVmaW5lIEhUT1RBTF9DTlRMCQkJMHgwMDA5CisjZGVmaW5lIE1fU1BMTF9SRUZfRkJfRElWCQkweDAwMGEKKyNkZWZpbmUgQUdQX1BMTF9DTlRMCQkJMHgwMDBiCisjZGVmaW5lIFNQTExfQ05UTAkJCTB4MDAwYworI2RlZmluZSBTQ0xLX0NOVEwJCQkweDAwMGQKKyNkZWZpbmUgTVBMTF9DTlRMCQkJMHgwMDBlCisjZGVmaW5lIE1ETExfQ0tPCQkJMHgwMDBmCisjZGVmaW5lIE1ETExfUkRDS0EJCQkweDAwMTAKKyNkZWZpbmUgTUNMS19DTlRMCQkJMHgwMDEyCisjZGVmaW5lIEFHUF9QTExfQ05UTAkJCTB4MDAwYgorI2RlZmluZSBQTExfVEVTVF9DTlRMCQkJMHgwMDEzCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTAkJCTB4MDAxNAorI2RlZmluZSBQTExfUFdSTUdUX0NOVEwJCQkweDAwMTUKKyNkZWZpbmUgTUNMS19NSVNDCQkJMHgwMDFmCisjZGVmaW5lIFAyUExMX0NOVEwJCQkweDAwMmEKKyNkZWZpbmUgUDJQTExfUkVGX0RJVgkJCTB4MDAyYgorI2RlZmluZSBQSVhDTEtTX0NOVEwJCQkweDAwMmQKKyNkZWZpbmUgU0NMS19NT1JFX0NOVEwJCQkweDAwMzUKKworLyogTUNMS19DTlRMIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgRk9SQ0VPTl9NQ0xLQQkJCSgxIDw8IDE2KQorI2RlZmluZSBGT1JDRU9OX01DTEtCCQkJKDEgPDwgMTcpCisjZGVmaW5lIEZPUkNFT05fWUNMS0EJCQkoMSA8PCAxOCkKKyNkZWZpbmUgRk9SQ0VPTl9ZQ0xLQgkJCSgxIDw8IDE5KQorI2RlZmluZSBGT1JDRU9OX01DCQkJKDEgPDwgMjApCisjZGVmaW5lIEZPUkNFT05fQUlDCQkJKDEgPDwgMjEpCisKKy8qIFNDTEtfQ05UTCBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIERZTl9TVE9QX0xBVF9NQVNLCQkweDAwMDA3ZmY4CisjZGVmaW5lIENQX01BWF9EWU5fU1RPUF9MQVQJCTB4MDAwOAorI2RlZmluZSBTQ0xLX0ZPUkNFT05fTUFTSwkJMHhmZmZmODAwMAorCisvKiBTQ0xLX01PUkVfQ05UTCBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIFNDTEtfTU9SRV9GT1JDRU9OCQkweDA3MDAKKworLyogQlVTX0NOVEwgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBCVVNfREJMX1JFU1lOQwkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQlVTX01TVFJfUkVTRVQJCQkweDAwMDAwMDAyCisjZGVmaW5lIEJVU19GTFVTSF9CVUYJCQkweDAwMDAwMDA0CisjZGVmaW5lIEJVU19TVE9QX1JFUV9ESVMJCTB4MDAwMDAwMDgKKyNkZWZpbmUgQlVTX1JPVEFUSU9OX0RJUwkJMHgwMDAwMDAxMAorI2RlZmluZSBCVVNfTUFTVEVSX0RJUwkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgQlVTX1JPTV9XUlRfRU4JCQkweDAwMDAwMDgwCisjZGVmaW5lIEJVU19ESVNfUk9NCQkJMHgwMDAwMTAwMAorI2RlZmluZSBCVVNfUENJX1JFQURfUkVUUllfRU4JCTB4MDAwMDIwMDAKKyNkZWZpbmUgQlVTX0FHUF9BRF9TVEVQUElOR19FTgkJMHgwMDAwNDAwMAorI2RlZmluZSBCVVNfUENJX1dSVF9SRVRSWV9FTgkJMHgwMDAwODAwMAorI2RlZmluZSBCVVNfTVNUUl9SRF9NVUxUCQkweDAwMTAwMDAwCisjZGVmaW5lIEJVU19NU1RSX1JEX0xJTkUJCTB4MDAyMDAwMDAKKyNkZWZpbmUgQlVTX1NVU1BFTkQJCQkweDAwNDAwMDAwCisjZGVmaW5lIExBVF8xNlgJCQkJMHgwMDgwMDAwMAorI2RlZmluZSBCVVNfUkRfRElTQ0FSRF9FTgkJMHgwMTAwMDAwMAorI2RlZmluZSBCVVNfUkRfQUJPUlRfRU4JCQkweDAyMDAwMDAwCisjZGVmaW5lIEJVU19NU1RSX1dTCQkJMHgwNDAwMDAwMAorI2RlZmluZSBCVVNfUEFSS0lOR19ESVMJCQkweDA4MDAwMDAwCisjZGVmaW5lIEJVU19NU1RSX0RJU0NPTk5FQ1RfRU4JCTB4MTAwMDAwMDAKKyNkZWZpbmUgQlVTX1dSVF9CVVJTVAkJCTB4MjAwMDAwMDAKKyNkZWZpbmUgQlVTX1JFQURfQlVSU1QJCQkweDQwMDAwMDAwCisjZGVmaW5lIEJVU19SRFlfUkVBRF9ETFkJCTB4ODAwMDAwMDAKKworLyogUElYQ0xLU19DTlRMICovCisjZGVmaW5lIFBJWDJDTEtfU1JDX1NFTF9NQVNLCQkweDAzCisjZGVmaW5lIFBJWDJDTEtfU1JDX1NFTF9DUFVDTEsJCTB4MDAKKyNkZWZpbmUgUElYMkNMS19TUkNfU0VMX1BTQ0FOQ0xLCTB4MDEKKyNkZWZpbmUgUElYMkNMS19TUkNfU0VMX0JZVEVDTEsJCTB4MDIKKyNkZWZpbmUgUElYMkNMS19TUkNfU0VMX1AyUExMQ0xLCTB4MDMKKyNkZWZpbmUgUElYMkNMS19BTFdBWVNfT05iCQkoMTw8NikKKyNkZWZpbmUgUElYMkNMS19EQUNfQUxXQVlTX09OYgkJKDE8PDcpCisjZGVmaW5lIFBJWENMS19UVl9TUkNfU0VMCQkoMSA8PCA4KQorI2RlZmluZSBQSVhDTEtfTFZEU19BTFdBWVNfT05iCQkoMSA8PCAxNCkKKyNkZWZpbmUgUElYQ0xLX1RNRFNfQUxXQVlTX09OYgkJKDEgPDwgMTUpCisKKworLyogQ0xPQ0tfQ05UTF9JTkRFWCBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIFBMTF9XUl9FTgkJCTB4MDAwMDAwODAKKworLyogQ09ORklHX0NOVEwgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBDRkdfVkdBX1JBTV9FTgkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgQ0ZHX0FUSV9SRVZfSURfTUFTSwkJKDB4ZiA8PCAxNikKKyNkZWZpbmUgQ0ZHX0FUSV9SRVZfQTExCQkJKDAgPDwgMTYpCisjZGVmaW5lIENGR19BVElfUkVWX0ExMgkJCSgxIDw8IDE2KQorI2RlZmluZSBDRkdfQVRJX1JFVl9BMTMJCQkoMiA8PCAxNikKKworLyogQ1JUQ19FWFRfQ05UTCBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIFZHQV9BVElfTElORUFSCQkJMHgwMDAwMDAwOAorI2RlZmluZSBWR0FfMTI4S0FQX1BBR0lORwkJMHgwMDAwMDAxMAorI2RlZmluZSBYQ1JUX0NOVF9FTgkJCSgxIDw8IDYpCisjZGVmaW5lIENSVENfSFNZTkNfRElTCQkJKDEgPDwgOCkKKyNkZWZpbmUgQ1JUQ19WU1lOQ19ESVMJCQkoMSA8PCA5KQorI2RlZmluZSBDUlRDX0RJU1BMQVlfRElTCQkoMSA8PCAxMCkKKyNkZWZpbmUgQ1JUQ19DUlRfT04JCQkoMSA8PCAxNSkKKworCisvKiBEU1RDQUNIRV9DVExTVEFUIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgUkIyRF9EQ19GTFVTSAkJCSgzIDw8IDApCisjZGVmaW5lIFJCMkRfRENfRkxVU0hfQUxMCQkweGYKKyNkZWZpbmUgUkIyRF9EQ19CVVNZCQkJKDEgPDwgMzEpCisKKworLyogQ1JUQ19HRU5fQ05UTCBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIENSVENfREJMX1NDQU5fRU4JCTB4MDAwMDAwMDEKKyNkZWZpbmUgQ1JUQ19DVVJfRU4JCQkweDAwMDEwMDAwCisjZGVmaW5lIENSVENfSU5URVJMQUNFX0VOCQkoMSA8PCAxKQorI2RlZmluZSBDUlRDX0JZUEFTU19MVVRfRU4JCSgxIDw8IDE0KQorI2RlZmluZSBDUlRDX0VYVF9ESVNQX0VOCQkoMSA8PCAyNCkKKyNkZWZpbmUgQ1JUQ19FTgkJCQkoMSA8PCAyNSkKKyNkZWZpbmUgQ1JUQ19ESVNQX1JFUV9FTl9CCQkoMSA8PCAyNikKKworLyogQ1JUQ19TVEFUVVMgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBDUlRDX1ZCTEFOSwkJCTB4MDAwMDAwMDEKKworLyogQ1JUQzJfR0VOX0NOVEwgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBDUlQyX09OCQkJCSgxIDw8IDcpCisjZGVmaW5lIENSVEMyX0RJU1BMQVlfRElTCQkoMSA8PCAyMykKKyNkZWZpbmUgQ1JUQzJfRU4JCQkoMSA8PCAyNSkKKyNkZWZpbmUgQ1JUQzJfRElTUF9SRVFfRU5fQgkJKDEgPDwgMjYpCisKKy8qIENVUl9PRkZTRVQsIENVUl9IT1JaX1ZFUlRfUE9TTiwgQ1VSX0hPUlpfVkVSVF9PRkYgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBDVVJfTE9DSwkJCTB4ODAwMDAwMDAKKworLyogR1BJTyBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIEdQSU9fQV8wCQkJKDEgPDwgIDApCisjZGVmaW5lIEdQSU9fQV8xCQkJKDEgPDwgIDEpCisjZGVmaW5lIEdQSU9fWV8wCQkJKDEgPDwgIDgpCisjZGVmaW5lIEdQSU9fWV8xCQkJKDEgPDwgIDkpCisjZGVmaW5lIEdQSU9fRU5fMAkJCSgxIDw8IDE2KQorI2RlZmluZSBHUElPX0VOXzEJCQkoMSA8PCAxNykKKyNkZWZpbmUgR1BJT19NQVNLXzAJCQkoMSA8PCAyNCkKKyNkZWZpbmUgR1BJT19NQVNLXzEJCQkoMSA8PCAyNSkKKyNkZWZpbmUgVkdBX0REQ19EQVRBX09VVFBVVAkJR1BJT19BXzAKKyNkZWZpbmUgVkdBX0REQ19DTEtfT1VUUFVUCQlHUElPX0FfMQorI2RlZmluZSBWR0FfRERDX0RBVEFfSU5QVVQJCUdQSU9fWV8wCisjZGVmaW5lIFZHQV9ERENfQ0xLX0lOUFVUCQlHUElPX1lfMQorI2RlZmluZSBWR0FfRERDX0RBVEFfT1VUX0VOCQlHUElPX0VOXzAKKyNkZWZpbmUgVkdBX0REQ19DTEtfT1VUX0VOCQlHUElPX0VOXzEKKworCisvKiBGUCBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIEZQX0NSVENfSF9UT1RBTF9NQVNLCQkwMDAwMDNmZgorI2RlZmluZSBGUF9DUlRDX0hfRElTUF9NQVNLCQkweDAxZmYwMDAwCisjZGVmaW5lIEZQX0NSVENfVl9UT1RBTF9NQVNLCQkweDAwMDAwZmZmCisjZGVmaW5lIEZQX0NSVENfVl9ESVNQX01BU0sJCTB4MGZmZjAwMDAKKyNkZWZpbmUgRlBfSF9TWU5DX1NUUlRfQ0hBUl9NQVNLCTB4MDAwMDFmZjgKKyNkZWZpbmUgRlBfSF9TWU5DX1dJRF9NQVNLCQkweDAwM2YwMDAwCisjZGVmaW5lIEZQX1ZfU1lOQ19TVFJUX01BU0sJCTB4MDAwMDBmZmYKKyNkZWZpbmUgRlBfVl9TWU5DX1dJRF9NQVNLCQkweDAwMWYwMDAwCisjZGVmaW5lIEZQX0NSVENfSF9UT1RBTF9TSElGVAkJMHgwMDAwMDAwMAorI2RlZmluZSBGUF9DUlRDX0hfRElTUF9TSElGVAkJMHgwMDAwMDAxMAorI2RlZmluZSBGUF9DUlRDX1ZfVE9UQUxfU0hJRlQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgRlBfQ1JUQ19WX0RJU1BfU0hJRlQJCTB4MDAwMDAwMTAKKyNkZWZpbmUgRlBfSF9TWU5DX1NUUlRfQ0hBUl9TSElGVAkweDAwMDAwMDAzCisjZGVmaW5lIEZQX0hfU1lOQ19XSURfU0hJRlQJCTB4MDAwMDAwMTAKKyNkZWZpbmUgRlBfVl9TWU5DX1NUUlRfU0hJRlQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgRlBfVl9TWU5DX1dJRF9TSElGVAkJMHgwMDAwMDAxMAorCisvKiBGUF9HRU5fQ05UTCBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIEZQX0ZQT04JCQkJKDEgPDwgMCkKKyNkZWZpbmUgRlBfVE1EU19FTgkJCSgxIDw8IDIpCisjZGVmaW5lIEZQX1BBTkVMX0ZPUk1BVAkJCSgxIDw8IDMpCisjZGVmaW5lIEZQX0VOX1RNRFMJCQkoMSA8PCA3KQorI2RlZmluZSBGUF9ERVRFQ1RfU0VOU0UJCQkoMSA8PCA4KQorI2RlZmluZSBSMjAwX0ZQX1NPVVJDRV9TRUxfTUFTSwkJKDMgPDwgMTApCisjZGVmaW5lIFIyMDBfRlBfU09VUkNFX1NFTF9DUlRDMQkoMCA8PCAxMCkKKyNkZWZpbmUgUjIwMF9GUF9TT1VSQ0VfU0VMX0NSVEMyCSgxIDw8IDEwKQorI2RlZmluZSBSMjAwX0ZQX1NPVVJDRV9TRUxfUk1YCQkoMiA8PCAxMCkKKyNkZWZpbmUgUjIwMF9GUF9TT1VSQ0VfU0VMX1RSQU5TCSgzIDw8IDEwKQorI2RlZmluZSBGUF9TRUxfQ1JUQzEJCQkoMCA8PCAxMykKKyNkZWZpbmUgRlBfU0VMX0NSVEMyCQkJKDEgPDwgMTMpCisjZGVmaW5lIEZQX1VTRV9WR0FfSFNZTkMJCSgxIDw8IDE0KQorI2RlZmluZSBGUF9DUlRDX0RPTlRfU0hBRE9XX0hQQVIJKDEgPDwgMTUpCisjZGVmaW5lIEZQX0NSVENfRE9OVF9TSEFET1dfVlBBUgkoMSA8PCAxNikKKyNkZWZpbmUgRlBfQ1JUQ19ET05UX1NIQURPV19IRU5ECSgxIDw8IDE3KQorI2RlZmluZSBGUF9DUlRDX1VTRV9TSEFET1dfVkVORAkJKDEgPDwgMTgpCisjZGVmaW5lIEZQX1JNWF9IVlNZTkNfQ09OVFJPTF9FTgkoMSA8PCAyMCkKKyNkZWZpbmUgRlBfREZQX1NZTkNfU0VMCQkJKDEgPDwgMjEpCisjZGVmaW5lIEZQX0NSVENfTE9DS184RE9UCQkoMSA8PCAyMikKKyNkZWZpbmUgRlBfQ1JUX1NZTkNfU0VMCQkJKDEgPDwgMjMpCisjZGVmaW5lIEZQX1VTRV9TSEFET1dfRU4JCSgxIDw8IDI0KQorI2RlZmluZSBGUF9DUlRfU1lOQ19BTFQJCQkoMSA8PCAyNikKKworLyogRlAyX0dFTl9DTlRMIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgRlAyX0JMQU5LX0VOCQkJKDEgPDwJMSkKKyNkZWZpbmUgRlAyX09OCQkJCSgxIDw8CTIpCisjZGVmaW5lIEZQMl9QQU5FTF9GT1JNQVQJCSgxIDw8CTMpCisjZGVmaW5lIEZQMl9TT1VSQ0VfU0VMX01BU0sJCSgzIDw8IDEwKQorI2RlZmluZSBGUDJfU09VUkNFX1NFTF9DUlRDMgkJKDEgPDwgMTApCisjZGVmaW5lIEZQMl9TUkNfU0VMX01BU0sJCSgzIDw8IDEzKQorI2RlZmluZSBGUDJfU1JDX1NFTF9DUlRDMgkJKDEgPDwgMTMpCisjZGVmaW5lIEZQMl9GUF9QT0wJCQkoMSA8PCAxNikKKyNkZWZpbmUgRlAyX0xQX1BPTAkJCSgxIDw8IDE3KQorI2RlZmluZSBGUDJfU0NLX1BPTAkJCSgxIDw8IDE4KQorI2RlZmluZSBGUDJfTENEX0NOVExfTUFTSwkJKDcgPDwgMTkpCisjZGVmaW5lIEZQMl9QQURfRkxPUF9FTgkJCSgxIDw8IDIyKQorI2RlZmluZSBGUDJfQ1JDX0VOCQkJKDEgPDwgMjMpCisjZGVmaW5lIEZQMl9DUkNfUkVBRF9FTgkJCSgxIDw8IDI0KQorI2RlZmluZSBGUDJfRFYwX0VOCQkJKDEgPDwgMjUpCisjZGVmaW5lIEZQMl9EVjBfUkFURV9TRUxfU0RSCQkoMSA8PCAyNikKKworCisvKiBMVkRTX0dFTl9DTlRMIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgTFZEU19PTgkJCQkoMSA8PCAwKQorI2RlZmluZSBMVkRTX0RJU1BMQVlfRElTCQkoMSA8PCAxKQorI2RlZmluZSBMVkRTX1BBTkVMX1RZUEUJCQkoMSA8PCAyKQorI2RlZmluZSBMVkRTX1BBTkVMX0ZPUk1BVAkJKDEgPDwgMykKKyNkZWZpbmUgTFZEU19FTgkJCQkoMSA8PCA3KQorI2RlZmluZSBMVkRTX0JMX01PRF9MRVZFTF9NQVNLCQkweDAwMDBmZjAwCisjZGVmaW5lIExWRFNfQkxfTU9EX0xFVkVMX1NISUZUCQk4CisjZGVmaW5lIExWRFNfQkxfTU9EX0VOCQkJKDEgPDwgMTYpCisjZGVmaW5lIExWRFNfRElHT04JCQkoMSA8PCAxOCkKKyNkZWZpbmUgTFZEU19CTE9OCQkJKDEgPDwgMTkpCisjZGVmaW5lIExWRFNfU0VMX0NSVEMyCQkJKDEgPDwgMjMpCisjZGVmaW5lIExWRFNfU1RBVEVfTUFTSyBcCisJKExWRFNfT04gfCBMVkRTX0RJU1BMQVlfRElTIHwgTFZEU19CTF9NT0RfTEVWRUxfTUFTSyB8IExWRFNfQkxPTikKKworLyogTFZEU19QTExfQ05UTCBiaXQgY29uc3RhdG5zICovCisjZGVmaW5lIEhTWU5DX0RFTEFZX1NISUZUCQkweDFjCisjZGVmaW5lIEhTWU5DX0RFTEFZX01BU0sJCSgweGYgPDwgMHgxYykKKworLyogVE1EU19UUkFOU01JVFRFUl9DTlRMIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgVE1EU19QTExfRU4JCQkoMSA8PCAwKQorI2RlZmluZSBUTURTX1BMTFJTVAkJCSgxIDw8IDEpCisjZGVmaW5lIFRNRFNfUkFOX1BBVF9SU1QJCSgxIDw8IDcpCisjZGVmaW5lIFRNRFNfSUNIQ1NFTAkJCSgxIDw8IDI4KQorCisvKiBGUF9IT1JaX1NUUkVUQ0ggYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBIT1JaX1NUUkVUQ0hfUkFUSU9fTUFTSwkJMHhmZmZmCisjZGVmaW5lIEhPUlpfU1RSRVRDSF9SQVRJT19NQVgJCTQwOTYKKyNkZWZpbmUgSE9SWl9QQU5FTF9TSVpFCQkJKDB4MWZmIDw8IDE2KQorI2RlZmluZSBIT1JaX1BBTkVMX1NISUZUCQkxNgorI2RlZmluZSBIT1JaX1NUUkVUQ0hfUElYUkVQCQkoMCA8PCAyNSkKKyNkZWZpbmUgSE9SWl9TVFJFVENIX0JMRU5ECQkoMSA8PCAyNikKKyNkZWZpbmUgSE9SWl9TVFJFVENIX0VOQUJMRQkJKDEgPDwgMjUpCisjZGVmaW5lIEhPUlpfQVVUT19SQVRJTwkJCSgxIDw8IDI3KQorI2RlZmluZSBIT1JaX0ZQX0xPT1BfU1RSRVRDSAkJKDB4NyA8PCAyOCkKKyNkZWZpbmUgSE9SWl9BVVRPX1JBVElPX0lOQwkJKDEgPDwgMzEpCisKKworLyogRlBfVkVSVF9TVFJFVENIIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgVkVSVF9TVFJFVENIX1JBVElPX01BU0sJCTB4ZmZmCisjZGVmaW5lIFZFUlRfU1RSRVRDSF9SQVRJT19NQVgJCTQwOTYKKyNkZWZpbmUgVkVSVF9QQU5FTF9TSVpFCQkJKDB4ZmZmIDw8IDEyKQorI2RlZmluZSBWRVJUX1BBTkVMX1NISUZUCQkxMgorI2RlZmluZSBWRVJUX1NUUkVUQ0hfTElOUkVQCQkoMCA8PCAyNikKKyNkZWZpbmUgVkVSVF9TVFJFVENIX0JMRU5ECQkoMSA8PCAyNikKKyNkZWZpbmUgVkVSVF9TVFJFVENIX0VOQUJMRQkJKDEgPDwgMjUpCisjZGVmaW5lIFZFUlRfQVVUT19SQVRJT19FTgkJKDEgPDwgMjcpCisjZGVmaW5lIFZFUlRfRlBfTE9PUF9TVFJFVENICQkoMHg3IDw8IDI4KQorI2RlZmluZSBWRVJUX1NUUkVUQ0hfUkVTRVJWRUQJCTB4ZjEwMDAwMDAKKworLyogREFDX0NOVEwgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBEQUNfOEJJVF9FTgkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgREFDXzRCUFBfUElYX09SREVSCQkweDAwMDAwMjAwCisjZGVmaW5lIERBQ19DUkNfRU4JCQkweDAwMDgwMDAwCisjZGVmaW5lIERBQ19NQVNLX0FMTAkJCSgweGZmIDw8IDI0KQorI2RlZmluZSBEQUNfUERXTgkJCSgxIDw8IDE1KQorI2RlZmluZSBEQUNfRVhQQU5EX01PREUJCQkoMSA8PCAxNCkKKyNkZWZpbmUgREFDX1ZHQV9BRFJfRU4JCQkoMSA8PCAxMykKKyNkZWZpbmUgREFDX1JBTkdFX0NOVEwJCQkoMyA8PCAgMCkKKyNkZWZpbmUgREFDX1JBTkdFX0NOVExfTUFTSwkJMHgwMworI2RlZmluZSBEQUNfQkxBTktJTkcJCQkoMSA8PCAgMikKKyNkZWZpbmUgREFDX0NNUF9FTgkJCSgxIDw8ICAzKQorI2RlZmluZSBEQUNfQ01QX09VVFBVVAkJCSgxIDw8ICA3KQorCisvKiBEQUNfQ05UTDIgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBEQUMyX0VYUEFORF9NT0RFCQkoMSA8PCAxNCkKKyNkZWZpbmUgREFDMl9DTVBfRU4JCQkoMSA8PCA3KQorI2RlZmluZSBEQUMyX1BBTEVUVEVfQUNDRVNTX0NOVEwJKDEgPDwgNSkKKworLyogREFDX0VYVF9DTlRMIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgREFDX0ZPUkNFX0JMQU5LX09GRl9FTgkJKDEgPDwgNCkKKyNkZWZpbmUgREFDX0ZPUkNFX0RBVEFfRU4JCSgxIDw8IDUpCisjZGVmaW5lIERBQ19GT1JDRV9EQVRBX1NFTF9NQVNLCQkoMyA8PCA2KQorI2RlZmluZSBEQUNfRk9SQ0VfREFUQV9NQVNLCQkweDAwMDNmZjAwCisjZGVmaW5lIERBQ19GT1JDRV9EQVRBX1NISUZUCQk4CisKKy8qIEdFTl9SRVNFVF9DTlRMIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgU09GVF9SRVNFVF9HVUkJCQkweDAwMDAwMDAxCisjZGVmaW5lIFNPRlRfUkVTRVRfVkNMSwkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgU09GVF9SRVNFVF9QQ0xLCQkJMHgwMDAwMDIwMAorI2RlZmluZSBTT0ZUX1JFU0VUX0VDUAkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgU09GVF9SRVNFVF9ESVNQRU5HX1hDTEsJCTB4MDAwMDA4MDAKKworLyogTUVNX0NOVEwgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBNRU1fQ1RMUl9TVEFUVVNfSURMRQkJMHgwMDAwMDAwMAorI2RlZmluZSBNRU1fQ1RMUl9TVEFUVVNfQlVTWQkJMHgwMDEwMDAwMAorI2RlZmluZSBNRU1fU0VRTkNSX1NUQVRVU19JRExFCQkweDAwMDAwMDAwCisjZGVmaW5lIE1FTV9TRVFOQ1JfU1RBVFVTX0JVU1kJCTB4MDAyMDAwMDAKKyNkZWZpbmUgTUVNX0FSQklURVJfU1RBVFVTX0lETEUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUVNX0FSQklURVJfU1RBVFVTX0JVU1kJCTB4MDA0MDAwMDAKKyNkZWZpbmUgTUVNX1JFUV9VTkxPQ0sJCQkweDAwMDAwMDAwCisjZGVmaW5lIE1FTV9SRVFfTE9DSwkJCTB4MDA4MDAwMDAKKyNkZWZpbmUgTUVNX05VTV9DSEFOTkVMU19NQVNLCQkweDAwMDAwMDAxCisjZGVmaW5lIE1FTV9VU0VfQl9DSF9PTkxZCQkweDAwMDAwMDAyCisjZGVmaW5lIFJWMTAwX01FTV9IQUxGX01PREUJCTB4MDAwMDAwMDgKKyNkZWZpbmUgUjMwMF9NRU1fTlVNX0NIQU5ORUxTX01BU0sJMHgwMDAwMDAwMworI2RlZmluZSBSMzAwX01FTV9VU0VfQ0RfQ0hfT05MWQkJMHgwMDAwMDAwNAorCisKKy8qIFJCQk1fU09GVF9SRVNFVCBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIFNPRlRfUkVTRVRfQ1AJCQkoMSA8PCAgMCkKKyNkZWZpbmUgU09GVF9SRVNFVF9ISQkJCSgxIDw8ICAxKQorI2RlZmluZSBTT0ZUX1JFU0VUX1NFCQkJKDEgPDwgIDIpCisjZGVmaW5lIFNPRlRfUkVTRVRfUkUJCQkoMSA8PCAgMykKKyNkZWZpbmUgU09GVF9SRVNFVF9QUAkJCSgxIDw8ICA0KQorI2RlZmluZSBTT0ZUX1JFU0VUX0UyCQkJKDEgPDwgIDUpCisjZGVmaW5lIFNPRlRfUkVTRVRfUkIJCQkoMSA8PCAgNikKKyNkZWZpbmUgU09GVF9SRVNFVF9IRFAJCQkoMSA8PCAgNykKKworLyogU1VSRkFDRV9DTlRMIGJpdCBjb25zYW50cyAqLworI2RlZmluZSBTVVJGX1RSQU5TTEFUSU9OX0RJUwkJKDEgPDwgOCkKKyNkZWZpbmUgTk9OU1VSRl9BUDBfU1dQXzE2QlBQCQkoMSA8PCAyMCkKKyNkZWZpbmUgTk9OU1VSRl9BUDBfU1dQXzMyQlBQCQkoMSA8PCAyMSkKKyNkZWZpbmUgTk9OU1VSRl9BUDFfU1dQXzE2QlBQCQkoMSA8PCAyMikKKyNkZWZpbmUgTk9OU1VSRl9BUDFfU1dQXzMyQlBQCQkoMSA8PCAyMykKKworLyogREVGQVVMVF9TQ19CT1RUT01fUklHSFQgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBERUZBVUxUX1NDX1JJR0hUX01BWAkJKDB4MWZmZiA8PCAwKQorI2RlZmluZSBERUZBVUxUX1NDX0JPVFRPTV9NQVgJCSgweDFmZmYgPDwgMTYpCisKKy8qIE1NX0lOREVYIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgTU1fQVBFUgkJCQkweDgwMDAwMDAwCisKKy8qIENMUl9DTVBfQ05UTCBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIENPTVBBUkVfU1JDX0ZBTFNFCQkweDAwMDAwMDAwCisjZGVmaW5lIENPTVBBUkVfU1JDX1RSVUUJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQ09NUEFSRV9TUkNfTk9UX0VRVUFMCQkweDAwMDAwMDA0CisjZGVmaW5lIENPTVBBUkVfU1JDX0VRVUFMCQkweDAwMDAwMDA1CisjZGVmaW5lIENPTVBBUkVfU1JDX0VRVUFMX0ZMSVAJCTB4MDAwMDAwMDcKKyNkZWZpbmUgQ09NUEFSRV9EU1RfRkFMU0UJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ09NUEFSRV9EU1RfVFJVRQkJMHgwMDAwMDEwMAorI2RlZmluZSBDT01QQVJFX0RTVF9OT1RfRVFVQUwJCTB4MDAwMDA0MDAKKyNkZWZpbmUgQ09NUEFSRV9EU1RfRVFVQUwJCTB4MDAwMDA1MDAKKyNkZWZpbmUgQ09NUEFSRV9ERVNUSU5BVElPTgkJMHgwMDAwMDAwMAorI2RlZmluZSBDT01QQVJFX1NPVVJDRQkJCTB4MDEwMDAwMDAKKyNkZWZpbmUgQ09NUEFSRV9TUkNfQU5EX0RTVAkJMHgwMjAwMDAwMAorCisKKy8qIERQX0NOVEwgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBEU1RfWF9SSUdIVF9UT19MRUZUCQkweDAwMDAwMDAwCisjZGVmaW5lIERTVF9YX0xFRlRfVE9fUklHSFQJCTB4MDAwMDAwMDEKKyNkZWZpbmUgRFNUX1lfQk9UVE9NX1RPX1RPUAkJMHgwMDAwMDAwMAorI2RlZmluZSBEU1RfWV9UT1BfVE9fQk9UVE9NCQkweDAwMDAwMDAyCisjZGVmaW5lIERTVF9YX01BSk9SCQkJMHgwMDAwMDAwMAorI2RlZmluZSBEU1RfWV9NQUpPUgkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgRFNUX1hfVElMRQkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgRFNUX1lfVElMRQkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgRFNUX0xBU1RfUEVMCQkJMHgwMDAwMDAyMAorI2RlZmluZSBEU1RfVFJBSUxfWF9SSUdIVF9UT19MRUZUCTB4MDAwMDAwMDAKKyNkZWZpbmUgRFNUX1RSQUlMX1hfTEVGVF9UT19SSUdIVAkweDAwMDAwMDQwCisjZGVmaW5lIERTVF9UUkFQX0ZJTExfUklHSFRfVE9fTEVGVAkweDAwMDAwMDAwCisjZGVmaW5lIERTVF9UUkFQX0ZJTExfTEVGVF9UT19SSUdIVAkweDAwMDAwMDgwCisjZGVmaW5lIERTVF9CUkVTX1NJR04JCQkweDAwMDAwMTAwCisjZGVmaW5lIERTVF9IT1NUX0JJR19FTkRJQU5fRU4JCTB4MDAwMDAyMDAKKyNkZWZpbmUgRFNUX1BPTFlMSU5FX05PTkxBU1QJCTB4MDAwMDgwMDAKKyNkZWZpbmUgRFNUX1JBU1RFUl9TVEFMTAkJMHgwMDAxMDAwMAorI2RlZmluZSBEU1RfUE9MWV9FREdFCQkJMHgwMDA0MDAwMAorCisKKy8qIERQX0NOVExfWURJUl9YRElSX1lNQUpPUiBiaXQgY29uc3RhbnRzIChzaG9ydCB2ZXJzaW9uIG9mIERQX0NOVEwpICovCisjZGVmaW5lIERTVF9YX01BSk9SX1MJCQkweDAwMDAwMDAwCisjZGVmaW5lIERTVF9ZX01BSk9SX1MJCQkweDAwMDAwMDAxCisjZGVmaW5lIERTVF9ZX0JPVFRPTV9UT19UT1BfUwkJMHgwMDAwMDAwMAorI2RlZmluZSBEU1RfWV9UT1BfVE9fQk9UVE9NX1MJCTB4MDAwMDgwMDAKKyNkZWZpbmUgRFNUX1hfUklHSFRfVE9fTEVGVF9TCQkweDAwMDAwMDAwCisjZGVmaW5lIERTVF9YX0xFRlRfVE9fUklHSFRfUwkJMHg4MDAwMDAwMAorCisKKy8qIERQX0RBVEFUWVBFIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgRFNUXzhCUFAJCQkweDAwMDAwMDAyCisjZGVmaW5lIERTVF8xNUJQUAkJCTB4MDAwMDAwMDMKKyNkZWZpbmUgRFNUXzE2QlBQCQkJMHgwMDAwMDAwNAorI2RlZmluZSBEU1RfMjRCUFAJCQkweDAwMDAwMDA1CisjZGVmaW5lIERTVF8zMkJQUAkJCTB4MDAwMDAwMDYKKyNkZWZpbmUgRFNUXzhCUFBfUkdCMzMyCQkJMHgwMDAwMDAwNworI2RlZmluZSBEU1RfOEJQUF9ZOAkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgRFNUXzhCUFBfUkdCOAkJCTB4MDAwMDAwMDkKKyNkZWZpbmUgRFNUXzE2QlBQX1ZZVVk0MjIJCTB4MDAwMDAwMGIKKyNkZWZpbmUgRFNUXzE2QlBQX1lWWVU0MjIJCTB4MDAwMDAwMGMKKyNkZWZpbmUgRFNUXzMyQlBQX0FZVVY0NDQJCTB4MDAwMDAwMGUKKyNkZWZpbmUgRFNUXzE2QlBQX0FSR0I0NDQ0CQkweDAwMDAwMDBmCisjZGVmaW5lIEJSVVNIX1NPTElEQ09MT1IJCTB4MDAwMDBkMDAKKyNkZWZpbmUgU1JDX01PTk8JCQkweDAwMDAwMDAwCisjZGVmaW5lIFNSQ19NT05PX0xCS0dECQkJMHgwMDAxMDAwMAorI2RlZmluZSBTUkNfRFNUQ09MT1IJCQkweDAwMDMwMDAwCisjZGVmaW5lIEJZVEVfT1JERVJfTVNCX1RPX0xTQgkJMHgwMDAwMDAwMAorI2RlZmluZSBCWVRFX09SREVSX0xTQl9UT19NU0IJCTB4NDAwMDAwMDAKKyNkZWZpbmUgRFBfQ09OVkVSU0lPTl9URU1QCQkweDgwMDAwMDAwCisjZGVmaW5lIEhPU1RfQklHX0VORElBTl9FTgkJKDEgPDwgMjkpCisKKworLyogRFBfR1VJX01BU1RFUl9DTlRMIGJpdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgR01DX1NSQ19QSVRDSF9PRkZTRVRfREVGQVVMVAkweDAwMDAwMDAwCisjZGVmaW5lIEdNQ19TUkNfUElUQ0hfT0ZGU0VUX0xFQVZFCTB4MDAwMDAwMDEKKyNkZWZpbmUgR01DX0RTVF9QSVRDSF9PRkZTRVRfREVGQVVMVAkweDAwMDAwMDAwCisjZGVmaW5lIEdNQ19EU1RfUElUQ0hfT0ZGU0VUX0xFQVZFCTB4MDAwMDAwMDIKKyNkZWZpbmUgR01DX1NSQ19DTElQX0RFRkFVTFQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgR01DX1NSQ19DTElQX0xFQVZFCQkweDAwMDAwMDA0CisjZGVmaW5lIEdNQ19EU1RfQ0xJUF9ERUZBVUxUCQkweDAwMDAwMDAwCisjZGVmaW5lIEdNQ19EU1RfQ0xJUF9MRUFWRQkJMHgwMDAwMDAwOAorI2RlZmluZSBHTUNfQlJVU0hfOHg4TU9OTwkJMHgwMDAwMDAwMAorI2RlZmluZSBHTUNfQlJVU0hfOHg4TU9OT19MQktHRAkJMHgwMDAwMDAxMAorI2RlZmluZSBHTUNfQlJVU0hfOHgxTU9OTwkJMHgwMDAwMDAyMAorI2RlZmluZSBHTUNfQlJVU0hfOHgxTU9OT19MQktHRAkJMHgwMDAwMDAzMAorI2RlZmluZSBHTUNfQlJVU0hfMXg4TU9OTwkJMHgwMDAwMDA0MAorI2RlZmluZSBHTUNfQlJVU0hfMXg4TU9OT19MQktHRAkJMHgwMDAwMDA1MAorI2RlZmluZSBHTUNfQlJVU0hfMzJ4MU1PTk8JCTB4MDAwMDAwNjAKKyNkZWZpbmUgR01DX0JSVVNIXzMyeDFNT05PX0xCS0dECTB4MDAwMDAwNzAKKyNkZWZpbmUgR01DX0JSVVNIXzMyeDMyTU9OTwkJMHgwMDAwMDA4MAorI2RlZmluZSBHTUNfQlJVU0hfMzJ4MzJNT05PX0xCS0dECTB4MDAwMDAwOTAKKyNkZWZpbmUgR01DX0JSVVNIXzh4OENPTE9SCQkweDAwMDAwMGEwCisjZGVmaW5lIEdNQ19CUlVTSF84eDFDT0xPUgkJMHgwMDAwMDBiMAorI2RlZmluZSBHTUNfQlJVU0hfMXg4Q09MT1IJCTB4MDAwMDAwYzAKKyNkZWZpbmUgR01DX0JSVVNIX1NPTElEX0NPTE9SCQkweDAwMDAwMGQwCisjZGVmaW5lIEdNQ19EU1RfOEJQUAkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgR01DX0RTVF8xNUJQUAkJCTB4MDAwMDAzMDAKKyNkZWZpbmUgR01DX0RTVF8xNkJQUAkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgR01DX0RTVF8yNEJQUAkJCTB4MDAwMDA1MDAKKyNkZWZpbmUgR01DX0RTVF8zMkJQUAkJCTB4MDAwMDA2MDAKKyNkZWZpbmUgR01DX0RTVF84QlBQX1JHQjMzMgkJMHgwMDAwMDcwMAorI2RlZmluZSBHTUNfRFNUXzhCUFBfWTgJCQkweDAwMDAwODAwCisjZGVmaW5lIEdNQ19EU1RfOEJQUF9SR0I4CQkweDAwMDAwOTAwCisjZGVmaW5lIEdNQ19EU1RfMTZCUFBfVllVWTQyMgkJMHgwMDAwMGIwMAorI2RlZmluZSBHTUNfRFNUXzE2QlBQX1lWWVU0MjIJCTB4MDAwMDBjMDAKKyNkZWZpbmUgR01DX0RTVF8zMkJQUF9BWVVWNDQ0CQkweDAwMDAwZTAwCisjZGVmaW5lIEdNQ19EU1RfMTZCUFBfQVJHQjQ0NDQJCTB4MDAwMDBmMDAKKyNkZWZpbmUgR01DX1NSQ19NT05PCQkJMHgwMDAwMDAwMAorI2RlZmluZSBHTUNfU1JDX01PTk9fTEJLR0QJCTB4MDAwMDEwMDAKKyNkZWZpbmUgR01DX1NSQ19EU1RDT0xPUgkJMHgwMDAwMzAwMAorI2RlZmluZSBHTUNfQllURV9PUkRFUl9NU0JfVE9fTFNCCTB4MDAwMDAwMDAKKyNkZWZpbmUgR01DX0JZVEVfT1JERVJfTFNCX1RPX01TQgkweDAwMDA0MDAwCisjZGVmaW5lIEdNQ19EUF9DT05WRVJTSU9OX1RFTVBfOTMwMAkweDAwMDA4MDAwCisjZGVmaW5lIEdNQ19EUF9DT05WRVJTSU9OX1RFTVBfNjUwMAkweDAwMDAwMDAwCisjZGVmaW5lIEdNQ19EUF9TUkNfUkVDVAkJCTB4MDIwMDAwMDAKKyNkZWZpbmUgR01DX0RQX1NSQ19IT1NUCQkJMHgwMzAwMDAwMAorI2RlZmluZSBHTUNfRFBfU1JDX0hPU1RfQllURUFMSUdOCTB4MDQwMDAwMDAKKyNkZWZpbmUgR01DXzNEX0ZDTl9FTl9DTFIJCTB4MDAwMDAwMDAKKyNkZWZpbmUgR01DXzNEX0ZDTl9FTl9TRVQJCTB4MDgwMDAwMDAKKyNkZWZpbmUgR01DX0RTVF9DTFJfQ01QX0ZDTl9MRUFWRQkweDAwMDAwMDAwCisjZGVmaW5lIEdNQ19EU1RfQ0xSX0NNUF9GQ05fQ0xFQVIJMHgxMDAwMDAwMAorI2RlZmluZSBHTUNfQVVYX0NMSVBfTEVBVkUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgR01DX0FVWF9DTElQX0NMRUFSCQkweDIwMDAwMDAwCisjZGVmaW5lIEdNQ19XUklURV9NQVNLX0xFQVZFCQkweDAwMDAwMDAwCisjZGVmaW5lIEdNQ19XUklURV9NQVNLX1NFVAkJMHg0MDAwMDAwMAorI2RlZmluZSBHTUNfQ0xSX0NNUF9DTlRMX0RJUwkJKDEgPDwgMjgpCisjZGVmaW5lIEdNQ19TUkNfREFUQVRZUEVfQ09MT1IJCSgzIDw8IDEyKQorI2RlZmluZSBST1AzX1MJCQkJMHgwMGNjMDAwMAorI2RlZmluZSBST1AzX1NSQ0NPUFkJCQkweDAwY2MwMDAwCisjZGVmaW5lIFJPUDNfUAkJCQkweDAwZjAwMDAwCisjZGVmaW5lIFJPUDNfUEFUQ09QWQkJCTB4MDBmMDAwMDAKKyNkZWZpbmUgRFBfU1JDX1NPVVJDRV9NQVNLCQkoNyAgPDwgMjQpCisjZGVmaW5lIEdNQ19CUlVTSF9OT05FCQkJKDE1IDw8ICA0KQorI2RlZmluZSBEUF9TUkNfU09VUkNFX01FTU9SWQkJKDIgIDw8IDI0KQorI2RlZmluZSBHTUNfQlJVU0hfU09MSURDT0xPUgkJMHgwMDAwMDBkMAorCisvKiBEUF9NSVggYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBEUF9TUkNfUkVDVAkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgRFBfU1JDX0hPU1QJCQkweDAwMDAwMzAwCisjZGVmaW5lIERQX1NSQ19IT1NUX0JZVEVBTElHTgkJMHgwMDAwMDQwMAorCisvKiBNUExMX0NOVEwgYml0IGNvbnN0YW50cyAqLworI2RlZmluZSBNUExMX1JFU0VUCQkJMHgwMDAwMDAwMQorCisvKiBNRExMX0NLTyBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIE1DS09BX1NMRUVQCQkJMHgwMDAwMDAwMQorI2RlZmluZSBNQ0tPQV9SRVNFVAkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUNLT0FfUkVGX1NLRVdfTUFTSwkJMHgwMDAwMDcwMAorI2RlZmluZSBNQ0tPQV9GQl9TS0VXX01BU0sJCTB4MDAwMDcwMDAKKworLyogTURMTF9SRENLQSBiaXQgY29uc3RhbnRzICovCisjZGVmaW5lIE1SRENLQTBfU0xFRVAJCQkweDAwMDAwMDAxCisjZGVmaW5lIE1SRENLQTBfUkVTRVQJCQkweDAwMDAwMDAyCisjZGVmaW5lIE1SRENLQTFfU0xFRVAJCQkweDAwMDEwMDAwCisjZGVmaW5lIE1SRENLQTFfUkVTRVQJCQkweDAwMDIwMDAwCisKKy8qIFZDTEtfRUNQX0NOVEwgY29uc3RhbnRzICovCisjZGVmaW5lIFZDTEtfU1JDX1NFTF9NQVNLCQkweDAzCisjZGVmaW5lIFZDTEtfU1JDX1NFTF9DUFVDTEsJCTB4MDAKKyNkZWZpbmUgVkNMS19TUkNfU0VMX1BTQ0FOQ0xLCQkweDAxCisjZGVmaW5lIFZDTEtfU1JDX1NFTF9CWVRFQ0xLCQkweDAyCisjZGVmaW5lIFZDTEtfU1JDX1NFTF9QUExMQ0xLCQkweDAzCisjZGVmaW5lIFBJWENMS19BTFdBWVNfT05iCQkweDAwMDAwMDQwCisjZGVmaW5lIFBJWENMS19EQUNfQUxXQVlTX09OYgkJMHgwMDAwMDA4MAorCisvKiBCVVNfQ05UTDEgY29uc3RhbnRzICovCisjZGVmaW5lIEJVU19DTlRMMV9NT0JJTEVfUExBVEZPUk1fU0VMX01BU0sJMHgwYzAwMDAwMAorI2RlZmluZSBCVVNfQ05UTDFfTU9CSUxFX1BMQVRGT1JNX1NFTF9TSElGVAkyNgorI2RlZmluZSBCVVNfQ05UTDFfQUdQQ0xLX1ZBTElECQkJMHg4MDAwMDAwMAorCisvKiBQTExfUFdSTUdUX0NOVEwgY29uc3RhbnRzICovCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9TUExMX1RVUk5PRkYJCTB4MDAwMDAwMDIKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX1BQTExfVFVSTk9GRgkJMHgwMDAwMDAwNAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfUDJQTExfVFVSTk9GRgkJMHgwMDAwMDAwOAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfVFZQTExfVFVSTk9GRgkJMHgwMDAwMDAxMAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfTU9CSUxFX1NVCQkweDAwMDEwMDAwCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9TVV9TQ0xLX1VTRV9CQ0xLCTB4MDAwMjAwMDAKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX1NVX01DTEtfVVNFX0JDTEsJMHgwMDA0MDAwMAorCisvKiBUVl9EQUNfQ05UTCBjb25zdGFudHMgKi8KKyNkZWZpbmUgVFZfREFDX0NOVExfQkdTTEVFUAkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgVFZfREFDX0NOVExfREVURUNUCQkJMHgwMDAwMDAxMAorI2RlZmluZSBUVl9EQUNfQ05UTF9CR0FESl9NQVNLCQkJMHgwMDBmMDAwMAorI2RlZmluZSBUVl9EQUNfQ05UTF9EQUNBREpfTUFTSwkJCTB4MDBmMDAwMDAKKyNkZWZpbmUgVFZfREFDX0NOVExfQkdBREpfX1NISUZUCQkxNgorI2RlZmluZSBUVl9EQUNfQ05UTF9EQUNBREpfX1NISUZUCQkyMAorI2RlZmluZSBUVl9EQUNfQ05UTF9SREFDUEQJCQkweDAxMDAwMDAwCisjZGVmaW5lIFRWX0RBQ19DTlRMX0dEQUNQRAkJCTB4MDIwMDAwMDAKKyNkZWZpbmUgVFZfREFDX0NOVExfQkRBQ1BECQkJMHgwNDAwMDAwMAorCisvKiBESVNQX01JU0NfQ05UTCBjb25zdGFudHMgKi8KKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfU09GVF9SRVNFVF9HUlBIX1BQCSgxIDw8IDApCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX1NPRlRfUkVTRVRfU1VCUElDX1BQCSgxIDw8IDEpCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX1NPRlRfUkVTRVRfT1YwX1BQCSgxIDw8IDIpCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX1NPRlRfUkVTRVRfR1JQSF9TQ0xLCSgxIDw8IDQpCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX1NPRlRfUkVTRVRfU1VCUElDX1NDTEsJKDEgPDwgNSkKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfU09GVF9SRVNFVF9PVjBfU0NMSwkoMSA8PCA2KQorI2RlZmluZSBESVNQX01JU0NfQ05UTF9TT0ZUX1JFU0VUX0dSUEgyX1BQCSgxIDw8IDEyKQorI2RlZmluZSBESVNQX01JU0NfQ05UTF9TT0ZUX1JFU0VUX0dSUEgyX1NDTEsJKDEgPDwgMTUpCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX1NPRlRfUkVTRVRfTFZEUwkJKDEgPDwgMTYpCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX1NPRlRfUkVTRVRfVE1EUwkJKDEgPDwgMTcpCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX1NPRlRfUkVTRVRfRElHX1RNRFMJKDEgPDwgMTgpCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX1NPRlRfUkVTRVRfVFYJCSgxIDw8IDE5KQorCisvKiBESVNQX1BXUl9NQU4gY29uc3RhbnRzICovCisjZGVmaW5lIERJU1BfUFdSX01BTl9ESVNQX1BXUl9NQU5fRDNfQ1JUQ19FTgkoMSA8PCAwKQorI2RlZmluZSBESVNQX1BXUl9NQU5fRElTUDJfUFdSX01BTl9EM19DUlRDMl9FTgkoMSA8PCA0KQorI2RlZmluZSBESVNQX1BXUl9NQU5fRElTUF9EM19SU1QJCSgxIDw8IDE2KQorI2RlZmluZSBESVNQX1BXUl9NQU5fRElTUF9EM19SRUdfUlNUCQkoMSA8PCAxNykKKyNkZWZpbmUgRElTUF9QV1JfTUFOX0RJU1BfRDNfR1JQSF9SU1QJCSgxIDw8IDE4KQorI2RlZmluZSBESVNQX1BXUl9NQU5fRElTUF9EM19TVUJQSUNfUlNUCQkoMSA8PCAxOSkKKyNkZWZpbmUgRElTUF9QV1JfTUFOX0RJU1BfRDNfT1YwX1JTVAkJKDEgPDwgMjApCisjZGVmaW5lIERJU1BfUFdSX01BTl9ESVNQX0QxRDJfR1JQSF9SU1QJCSgxIDw8IDIxKQorI2RlZmluZSBESVNQX1BXUl9NQU5fRElTUF9EMUQyX1NVQlBJQ19SU1QJKDEgPDwgMjIpCisjZGVmaW5lIERJU1BfUFdSX01BTl9ESVNQX0QxRDJfT1YwX1JTVAkJKDEgPDwgMjMpCisjZGVmaW5lIERJU1BfUFdSX01BTl9ESUdfVE1EU19FTkFCTEVfUlNUCSgxIDw8IDI0KQorI2RlZmluZSBESVNQX1BXUl9NQU5fVFZfRU5BQkxFX1JTVAkJKDEgPDwgMjUpCisjZGVmaW5lIERJU1BfUFdSX01BTl9BVVRPX1BXUlVQX0VOCQkoMSA8PCAyNikKKworLyogbWFza3MgKi8KKworI2RlZmluZSBDT05GSUdfTUVNU0laRV9NQVNLCQkweDFmMDAwMDAwCisjZGVmaW5lIE1FTV9DRkdfVFlQRQkJCTB4NDAwMDAwMDAKKyNkZWZpbmUgRFNUX09GRlNFVF9NQVNLCQkJMHgwMDNmZmZmZgorI2RlZmluZSBEU1RfUElUQ0hfTUFTSwkJCTB4M2ZjMDAwMDAKKyNkZWZpbmUgREVGQVVMVF9USUxFX01BU0sJCTB4YzAwMDAwMDAKKyNkZWZpbmUgUFBMTF9ESVZfU0VMX01BU0sJCTB4MDAwMDAzMDAKKyNkZWZpbmUgUFBMTF9SRVNFVAkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgUFBMTF9TTEVFUAkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgUFBMTF9BVE9NSUNfVVBEQVRFX0VOCQkweDAwMDEwMDAwCisjZGVmaW5lIFBQTExfUkVGX0RJVl9NQVNLCQkweDAwMDAwM2ZmCisjZGVmaW5lIFBQTExfRkIzX0RJVl9NQVNLCQkweDAwMDAwN2ZmCisjZGVmaW5lIFBQTExfUE9TVDNfRElWX01BU0sJCTB4MDAwNzAwMDAKKyNkZWZpbmUgUFBMTF9BVE9NSUNfVVBEQVRFX1IJCTB4MDAwMDgwMDAKKyNkZWZpbmUgUFBMTF9BVE9NSUNfVVBEQVRFX1cJCTB4MDAwMDgwMDAKKyNkZWZpbmUgUFBMTF9WR0FfQVRPTUlDX1VQREFURV9FTgkweDAwMDIwMDAwCisjZGVmaW5lIFIzMDBfUFBMTF9SRUZfRElWX0FDQ19NQVNLCSgweDNmZiA8PCAxOCkKKyNkZWZpbmUgUjMwMF9QUExMX1JFRl9ESVZfQUNDX1NISUZUCTE4CisKKyNkZWZpbmUgR1VJX0FDVElWRQkJCTB4ODAwMDAwMDAKKworCisjZGVmaW5lIE1DX0lORF9JTkRFWAkJCTB4MDFGOAorI2RlZmluZSBNQ19JTkRfREFUQQkJCTB4MDFGQworCisvKiBQQURfQ1RMUl9TVFJFTkdUSCAqLworI2RlZmluZSBQQURfTUFOVUFMX09WRVJSSURFCQkweDgwMDAwMDAwCisKKy8qIHBsbENMS19QSU5fQ05UTCAqLworI2RlZmluZSBDTEtfUElOX0NOVExfX09TQ19FTl9NQVNLCQkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgQ0xLX1BJTl9DTlRMX19PU0NfRU4JCQkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgQ0xLX1BJTl9DTlRMX19YVExfTE9XX0dBSU5fTUFTSwkJCTB4MDAwMDAwMDRMCisjZGVmaW5lIENMS19QSU5fQ05UTF9fWFRMX0xPV19HQUlOCQkJMHgwMDAwMDAwNEwKKyNkZWZpbmUgQ0xLX1BJTl9DTlRMX19ET05UX1VTRV9YVEFMSU5fTUFTSwkJMHgwMDAwMDAxMEwKKyNkZWZpbmUgQ0xLX1BJTl9DTlRMX19ET05UX1VTRV9YVEFMSU4JCQkweDAwMDAwMDEwTAorI2RlZmluZSBDTEtfUElOX0NOVExfX1NMT1dfQ0xPQ0tfU09VUkNFX01BU0sJCTB4MDAwMDAwMjBMCisjZGVmaW5lIENMS19QSU5fQ05UTF9fU0xPV19DTE9DS19TT1VSQ0UJCQkweDAwMDAwMDIwTAorI2RlZmluZSBDTEtfUElOX0NOVExfX0NHX0NMS19UT19PVVRQSU5fTUFTSwkJMHgwMDAwMDgwMEwKKyNkZWZpbmUgQ0xLX1BJTl9DTlRMX19DR19DTEtfVE9fT1VUUElOCQkJMHgwMDAwMDgwMEwKKyNkZWZpbmUgQ0xLX1BJTl9DTlRMX19DR19DT1VOVF9VUF9UT19PVVRQSU5fTUFTSwkweDAwMDAxMDAwTAorI2RlZmluZSBDTEtfUElOX0NOVExfX0NHX0NPVU5UX1VQX1RPX09VVFBJTgkJMHgwMDAwMTAwMEwKKyNkZWZpbmUgQ0xLX1BJTl9DTlRMX19BQ0NFU1NfUkVHU19JTl9TVVNQRU5EX01BU0sJMHgwMDAwMjAwMEwKKyNkZWZpbmUgQ0xLX1BJTl9DTlRMX19BQ0NFU1NfUkVHU19JTl9TVVNQRU5ECQkweDAwMDAyMDAwTAorI2RlZmluZSBDTEtfUElOX0NOVExfX0NHX1NQQVJFX01BU0sJCQkweDAwMDA0MDAwTAorI2RlZmluZSBDTEtfUElOX0NOVExfX0NHX1NQQVJFCQkJCTB4MDAwMDQwMDBMCisjZGVmaW5lIENMS19QSU5fQ05UTF9fU0NMS19EWU5fU1RBUlRfQ05UTF9NQVNLCQkweDAwMDA4MDAwTAorI2RlZmluZSBDTEtfUElOX0NOVExfX1NDTEtfRFlOX1NUQVJUX0NOVEwJCTB4MDAwMDgwMDBMCisjZGVmaW5lIENMS19QSU5fQ05UTF9fQ1BfQ0xLX1JVTk5JTkdfTUFTSwkJMHgwMDAxMDAwMEwKKyNkZWZpbmUgQ0xLX1BJTl9DTlRMX19DUF9DTEtfUlVOTklORwkJCTB4MDAwMTAwMDBMCisjZGVmaW5lIENMS19QSU5fQ05UTF9fQ0dfU1BBUkVfUkRfTUFTSwkJCTB4MDAwNjAwMDBMCisjZGVmaW5lIENMS19QSU5fQ05UTF9fWFRBTElOX0FMV0FZU19PTmJfTUFTSwkJMHgwMDA4MDAwMEwKKyNkZWZpbmUgQ0xLX1BJTl9DTlRMX19YVEFMSU5fQUxXQVlTX09OYgkJCTB4MDAwODAwMDBMCisjZGVmaW5lIENMS19QSU5fQ05UTF9fUFdSU0VRX0RFTEFZX01BU0sJCQkweGZmMDAwMDAwTAorCisvKiBwbGxDTEtfUFdSTUdUX0NOVEwgKi8KKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19NUExMX1BXUk1HVF9PRkZfX1NISUZUCQkweDAwMDAwMDAwCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fU1BMTF9QV1JNR1RfT0ZGX19TSElGVAkJMHgwMDAwMDAwMQorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1BQTExfUFdSTUdUX09GRl9fU0hJRlQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19QMlBMTF9QV1JNR1RfT0ZGX19TSElGVAkweDAwMDAwMDAzCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fTUNMS19UVVJOT0ZGX19TSElGVAkJMHgwMDAwMDAwNAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1NDTEtfVFVSTk9GRl9fU0hJRlQJCTB4MDAwMDAwMDUKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19QQ0xLX1RVUk5PRkZfX1NISUZUCQkweDAwMDAwMDA2CisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fUDJDTEtfVFVSTk9GRl9fU0hJRlQJCTB4MDAwMDAwMDcKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19NQ19DSF9NT0RFX19TSElGVAkJMHgwMDAwMDAwOAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1RFU1RfTU9ERV9fU0hJRlQJCTB4MDAwMDAwMDkKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19HTE9CQUxfUE1BTl9FTl9fU0hJRlQJCTB4MDAwMDAwMGEKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19FTkdJTkVfRFlOQ0xLX01PREVfX1NISUZUCTB4MDAwMDAwMGMKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19BQ1RJVkVfSElMT19MQVRfX1NISUZUCQkweDAwMDAwMDBkCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fRElTUF9EWU5fU1RPUF9MQVRfX1NISUZUCTB4MDAwMDAwMGYKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19NQ19CVVNZX19TSElGVAkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19NQ19JTlRfQ05UTF9fU0hJRlQJCTB4MDAwMDAwMTEKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19NQ19TV0lUQ0hfX1NISUZUCQkweDAwMDAwMDEyCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fRExMX1JFQURZX19TSElGVAkJMHgwMDAwMDAxMworI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX0RJU1BfUE1fX1NISUZUCQkJMHgwMDAwMDAxNAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX0RZTl9TVE9QX01PREVfX1NISUZUCQkweDAwMDAwMDE1CisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fQ0dfTk8xX0RFQlVHX19TSElGVAkJMHgwMDAwMDAxOAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1RWUExMX1BXUk1HVF9PRkZfX1NISUZUCTB4MDAwMDAwMWUKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19UVkNMS19UVVJOT0ZGX19TSElGVAkJMHgwMDAwMDAxZgorCisvKiBwbGxQMlBMTF9DTlRMICovCisjZGVmaW5lIFAyUExMX0NOVExfX1AyUExMX1JFU0VUX01BU0sJCQkweDAwMDAwMDAxTAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9SRVNFVAkJCQkweDAwMDAwMDAxTAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9TTEVFUF9NQVNLCQkJMHgwMDAwMDAwMkwKKyNkZWZpbmUgUDJQTExfQ05UTF9fUDJQTExfU0xFRVAJCQkJMHgwMDAwMDAwMkwKKyNkZWZpbmUgUDJQTExfQ05UTF9fUDJQTExfVFNUX0VOX01BU0sJCQkweDAwMDAwMDA0TAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9UU1RfRU4JCQkweDAwMDAwMDA0TAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9SRUZDTEtfU0VMX01BU0sJCTB4MDAwMDAwMTBMCisjZGVmaW5lIFAyUExMX0NOVExfX1AyUExMX1JFRkNMS19TRUwJCQkweDAwMDAwMDEwTAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9GQkNMS19TRUxfTUFTSwkJMHgwMDAwMDAyMEwKKyNkZWZpbmUgUDJQTExfQ05UTF9fUDJQTExfRkJDTEtfU0VMCQkJMHgwMDAwMDAyMEwKKyNkZWZpbmUgUDJQTExfQ05UTF9fUDJQTExfVENQT0ZGX01BU0sJCQkweDAwMDAwMDQwTAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9UQ1BPRkYJCQkweDAwMDAwMDQwTAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9UVkNPTUFYX01BU0sJCQkweDAwMDAwMDgwTAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9UVkNPTUFYCQkJMHgwMDAwMDA4MEwKKyNkZWZpbmUgUDJQTExfQ05UTF9fUDJQTExfUENQX01BU0sJCQkweDAwMDAwNzAwTAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9QVkdfTUFTSwkJCTB4MDAwMDM4MDBMCisjZGVmaW5lIFAyUExMX0NOVExfX1AyUExMX1BEQ19NQVNLCQkJMHgwMDAwYzAwMEwKKyNkZWZpbmUgUDJQTExfQ05UTF9fUDJQTExfQVRPTUlDX1VQREFURV9FTl9NQVNLCQkweDAwMDEwMDAwTAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9BVE9NSUNfVVBEQVRFX0VOCQkweDAwMDEwMDAwTAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9BVE9NSUNfVVBEQVRFX1NZTkNfTUFTSwkweDAwMDQwMDAwTAorI2RlZmluZSBQMlBMTF9DTlRMX19QMlBMTF9BVE9NSUNfVVBEQVRFX1NZTkMJCTB4MDAwNDAwMDBMCisjZGVmaW5lIFAyUExMX0NOVExfX1AyUExMX0RJU0FCTEVfQVVUT19SRVNFVF9NQVNLCTB4MDAwODAwMDBMCisjZGVmaW5lIFAyUExMX0NOVExfX1AyUExMX0RJU0FCTEVfQVVUT19SRVNFVAkJMHgwMDA4MDAwMEwKKworLyogcGxsUElYQ0xLU19DTlRMICovCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUElYMkNMS19TUkNfU0VMX19TSElGVAkJMHgwMDAwMDAwMAorI2RlZmluZSBQSVhDTEtTX0NOVExfX1BJWDJDTEtfSU5WRVJUX19TSElGVAkJMHgwMDAwMDAwNAorI2RlZmluZSBQSVhDTEtTX0NOVExfX1BJWDJDTEtfU1JDX0lOVkVSVF9fU0hJRlQJCTB4MDAwMDAwMDUKKyNkZWZpbmUgUElYQ0xLU19DTlRMX19QSVgyQ0xLX0FMV0FZU19PTmJfX1NISUZUCQkweDAwMDAwMDA2CisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUElYMkNMS19EQUNfQUxXQVlTX09OYl9fU0hJRlQJMHgwMDAwMDAwNworI2RlZmluZSBQSVhDTEtTX0NOVExfX1BJWENMS19UVl9TUkNfU0VMX19TSElGVAkJMHgwMDAwMDAwOAorI2RlZmluZSBQSVhDTEtTX0NOVExfX1BJWENMS19CTEVORF9BTFdBWVNfT05iX19TSElGVAkweDAwMDAwMDBiCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUElYQ0xLX0dWX0FMV0FZU19PTmJfX1NISUZUCTB4MDAwMDAwMGMKKyNkZWZpbmUgUElYQ0xLU19DTlRMX19QSVhDTEtfRElHX1RNRFNfQUxXQVlTX09OYl9fU0hJRlQJMHgwMDAwMDAwZAorI2RlZmluZSBQSVhDTEtTX0NOVExfX1BJWENMS19MVkRTX0FMV0FZU19PTmJfX1NISUZUCTB4MDAwMDAwMGUKKyNkZWZpbmUgUElYQ0xLU19DTlRMX19QSVhDTEtfVE1EU19BTFdBWVNfT05iX19TSElGVAkweDAwMDAwMDBmCisKKworLyogcGxsUElYQ0xLU19DTlRMICovCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUElYMkNMS19TUkNfU0VMX01BU0sJCTB4MDAwMDAwMDNMCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUElYMkNMS19JTlZFUlQJCQkweDAwMDAwMDEwTAorI2RlZmluZSBQSVhDTEtTX0NOVExfX1BJWDJDTEtfU1JDX0lOVkVSVAkJMHgwMDAwMDAyMEwKKyNkZWZpbmUgUElYQ0xLU19DTlRMX19QSVgyQ0xLX0FMV0FZU19PTmIJCTB4MDAwMDAwNDBMCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUElYMkNMS19EQUNfQUxXQVlTX09OYgkJMHgwMDAwMDA4MEwKKyNkZWZpbmUgUElYQ0xLU19DTlRMX19QSVhDTEtfVFZfU1JDX1NFTAkJCTB4MDAwMDAxMDBMCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUElYQ0xLX0JMRU5EX0FMV0FZU19PTmIJCTB4MDAwMDA4MDBMCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUElYQ0xLX0dWX0FMV0FZU19PTmIJCTB4MDAwMDEwMDBMCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUElYQ0xLX0RJR19UTURTX0FMV0FZU19PTmIJMHgwMDAwMjAwMEwKKyNkZWZpbmUgUElYQ0xLU19DTlRMX19QSVhDTEtfTFZEU19BTFdBWVNfT05iCQkweDAwMDA0MDAwTAorI2RlZmluZSBQSVhDTEtTX0NOVExfX1BJWENMS19UTURTX0FMV0FZU19PTmIJCTB4MDAwMDgwMDBMCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fRElTUF9UVk9VVF9QSVhDTEtfVFZfQUxXQVlTX09OYgkoMSA8PCA5KQorI2RlZmluZSBQSVhDTEtTX0NOVExfX1IzMDBfRFZPQ0xLX0FMV0FZU19PTmIJCSgxIDw8IDEwKQorI2RlZmluZSBQSVhDTEtTX0NOVExfX1IzMDBfUElYQ0xLX0RWT19BTFdBWVNfT05iCSgxIDw8IDEzKQorI2RlZmluZSBQSVhDTEtTX0NOVExfX1IzMDBfUElYQ0xLX1RSQU5TX0FMV0FZU19PTmIJKDEgPDwgMTYpCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUjMwMF9QSVhDTEtfVFZPX0FMV0FZU19PTmIJKDEgPDwgMTcpCisjZGVmaW5lIFBJWENMS1NfQ05UTF9fUjMwMF9QMkcyQ0xLX0FMV0FZU19PTmIJCSgxIDw8IDE4KQorI2RlZmluZSBQSVhDTEtTX0NOVExfX1IzMDBfUDJHMkNMS19EQUNfQUxXQVlTX09OYgkoMSA8PCAxOSkKKyNkZWZpbmUgUElYQ0xLU19DTlRMX19SMzAwX0RJU1BfREFDX1BJWENMS19EQUMyX0JMQU5LX09GRiAoMSA8PCAyMykKKworCisvKiBwbGxQMlBMTF9ESVZfMCAqLworI2RlZmluZSBQMlBMTF9ESVZfMF9fUDJQTExfRkJfRElWX01BU0sJCQkweDAwMDAwN2ZmTAorI2RlZmluZSBQMlBMTF9ESVZfMF9fUDJQTExfQVRPTUlDX1VQREFURV9XX01BU0sJCTB4MDAwMDgwMDBMCisjZGVmaW5lIFAyUExMX0RJVl8wX19QMlBMTF9BVE9NSUNfVVBEQVRFX1cJCTB4MDAwMDgwMDBMCisjZGVmaW5lIFAyUExMX0RJVl8wX19QMlBMTF9BVE9NSUNfVVBEQVRFX1JfTUFTSwkJMHgwMDAwODAwMEwKKyNkZWZpbmUgUDJQTExfRElWXzBfX1AyUExMX0FUT01JQ19VUERBVEVfUgkJMHgwMDAwODAwMEwKKyNkZWZpbmUgUDJQTExfRElWXzBfX1AyUExMX1BPU1RfRElWX01BU0sJCTB4MDAwNzAwMDBMCisKKy8qIHBsbFNDTEtfQ05UTCAqLworI2RlZmluZSBTQ0xLX0NOVExfX1NDTEtfU1JDX1NFTF9NQVNLCQkJMHgwMDAwMDAwN0wKKyNkZWZpbmUgU0NMS19DTlRMX19DUF9NQVhfRFlOX1NUT1BfTEFUCQkJMHgwMDAwMDAwOEwKKyNkZWZpbmUgU0NMS19DTlRMX19IRFBfTUFYX0RZTl9TVE9QX0xBVAkJCTB4MDAwMDAwMTBMCisjZGVmaW5lIFNDTEtfQ05UTF9fVFZfTUFYX0RZTl9TVE9QX0xBVAkJCTB4MDAwMDAwMjBMCisjZGVmaW5lIFNDTEtfQ05UTF9fRTJfTUFYX0RZTl9TVE9QX0xBVAkJCTB4MDAwMDAwNDBMCisjZGVmaW5lIFNDTEtfQ05UTF9fU0VfTUFYX0RZTl9TVE9QX0xBVAkJCTB4MDAwMDAwODBMCisjZGVmaW5lIFNDTEtfQ05UTF9fSURDVF9NQVhfRFlOX1NUT1BfTEFUCQkweDAwMDAwMTAwTAorI2RlZmluZSBTQ0xLX0NOVExfX1ZJUF9NQVhfRFlOX1NUT1BfTEFUCQkJMHgwMDAwMDIwMEwKKyNkZWZpbmUgU0NMS19DTlRMX19SRV9NQVhfRFlOX1NUT1BfTEFUCQkJMHgwMDAwMDQwMEwKKyNkZWZpbmUgU0NMS19DTlRMX19QQl9NQVhfRFlOX1NUT1BfTEFUCQkJMHgwMDAwMDgwMEwKKyNkZWZpbmUgU0NMS19DTlRMX19UQU1fTUFYX0RZTl9TVE9QX0xBVAkJCTB4MDAwMDEwMDBMCisjZGVmaW5lIFNDTEtfQ05UTF9fVERNX01BWF9EWU5fU1RPUF9MQVQJCQkweDAwMDAyMDAwTAorI2RlZmluZSBTQ0xLX0NOVExfX1JCX01BWF9EWU5fU1RPUF9MQVQJCQkweDAwMDA0MDAwTAorI2RlZmluZSBTQ0xLX0NOVExfX0RZTl9TVE9QX0xBVF9NQVNLCQkJMHgwMDAwN2ZmOAorI2RlZmluZSBTQ0xLX0NOVExfX0ZPUkNFX0RJU1AyCQkJCTB4MDAwMDgwMDBMCisjZGVmaW5lIFNDTEtfQ05UTF9fRk9SQ0VfQ1AJCQkJMHgwMDAxMDAwMEwKKyNkZWZpbmUgU0NMS19DTlRMX19GT1JDRV9IRFAJCQkJMHgwMDAyMDAwMEwKKyNkZWZpbmUgU0NMS19DTlRMX19GT1JDRV9ESVNQMQkJCQkweDAwMDQwMDAwTAorI2RlZmluZSBTQ0xLX0NOVExfX0ZPUkNFX1RPUAkJCQkweDAwMDgwMDAwTAorI2RlZmluZSBTQ0xLX0NOVExfX0ZPUkNFX0UyCQkJCTB4MDAxMDAwMDBMCisjZGVmaW5lIFNDTEtfQ05UTF9fRk9SQ0VfU0UJCQkJMHgwMDIwMDAwMEwKKyNkZWZpbmUgU0NMS19DTlRMX19GT1JDRV9JRENUCQkJCTB4MDA0MDAwMDBMCisjZGVmaW5lIFNDTEtfQ05UTF9fRk9SQ0VfVklQCQkJCTB4MDA4MDAwMDBMCisjZGVmaW5lIFNDTEtfQ05UTF9fRk9SQ0VfUkUJCQkJMHgwMTAwMDAwMEwKKyNkZWZpbmUgU0NMS19DTlRMX19GT1JDRV9QQgkJCQkweDAyMDAwMDAwTAorI2RlZmluZSBTQ0xLX0NOVExfX0ZPUkNFX1RBTQkJCQkweDA0MDAwMDAwTAorI2RlZmluZSBTQ0xLX0NOVExfX0ZPUkNFX1RETQkJCQkweDA4MDAwMDAwTAorI2RlZmluZSBTQ0xLX0NOVExfX0ZPUkNFX1JCCQkJCTB4MTAwMDAwMDBMCisjZGVmaW5lIFNDTEtfQ05UTF9fRk9SQ0VfVFZfU0NMSwkJCTB4MjAwMDAwMDBMCisjZGVmaW5lIFNDTEtfQ05UTF9fRk9SQ0VfU1VCUElDCQkJCTB4NDAwMDAwMDBMCisjZGVmaW5lIFNDTEtfQ05UTF9fRk9SQ0VfT1YwCQkJCTB4ODAwMDAwMDBMCisjZGVmaW5lIFNDTEtfQ05UTF9fUjMwMF9GT1JDRV9WQVAJCQkoMTw8MjEpCisjZGVmaW5lIFNDTEtfQ05UTF9fUjMwMF9GT1JDRV9TUgkJCSgxPDwyNSkKKyNkZWZpbmUgU0NMS19DTlRMX19SMzAwX0ZPUkNFX1BYCQkJKDE8PDI2KQorI2RlZmluZSBTQ0xLX0NOVExfX1IzMDBfRk9SQ0VfVFgJCQkoMTw8MjcpCisjZGVmaW5lIFNDTEtfQ05UTF9fUjMwMF9GT1JDRV9VUwkJCSgxPDwyOCkKKyNkZWZpbmUgU0NMS19DTlRMX19SMzAwX0ZPUkNFX1NVCQkJKDE8PDMwKQorI2RlZmluZSBTQ0xLX0NOVExfX0ZPUkNFT05fTUFTSwkJCQkweGZmZmY4MDAwTAorCisvKiBwbGxTQ0xLX0NOVEwyICovCisjZGVmaW5lIFNDTEtfQ05UTDJfX1IzMDBfVENMX01BWF9EWU5fU1RPUF9MQVQJCSgxPDwxMCkKKyNkZWZpbmUgU0NMS19DTlRMMl9fUjMwMF9HQV9NQVhfRFlOX1NUT1BfTEFUCQkoMTw8MTEpCisjZGVmaW5lIFNDTEtfQ05UTDJfX1IzMDBfQ0JBX01BWF9EWU5fU1RPUF9MQVQJCSgxPDwxMikKKyNkZWZpbmUgU0NMS19DTlRMMl9fUjMwMF9GT1JDRV9UQ0wJCQkoMTw8MTMpCisjZGVmaW5lIFNDTEtfQ05UTDJfX1IzMDBfRk9SQ0VfQ0JBCQkJKDE8PDE0KQorI2RlZmluZSBTQ0xLX0NOVEwyX19SMzAwX0ZPUkNFX0dBCQkJKDE8PDE1KQorCisvKiBTQ0xLX01PUkVfQ05UTCAqLworI2RlZmluZSBTQ0xLX01PUkVfQ05UTF9fRElTUFJFR1NfTUFYX0RZTl9TVE9QX0xBVAkweDAwMDAwMDAxTAorI2RlZmluZSBTQ0xLX01PUkVfQ05UTF9fTUNfR1VJX01BWF9EWU5fU1RPUF9MQVQJCTB4MDAwMDAwMDJMCisjZGVmaW5lIFNDTEtfTU9SRV9DTlRMX19NQ19IT1NUX01BWF9EWU5fU1RPUF9MQVQJMHgwMDAwMDAwNEwKKyNkZWZpbmUgU0NMS19NT1JFX0NOVExfX0ZPUkNFX0RJU1BSRUdTCQkJMHgwMDAwMDEwMEwKKyNkZWZpbmUgU0NMS19NT1JFX0NOVExfX0ZPUkNFX01DX0dVSQkJCTB4MDAwMDAyMDBMCisjZGVmaW5lIFNDTEtfTU9SRV9DTlRMX19GT1JDRV9NQ19IT1NUCQkJMHgwMDAwMDQwMEwKKyNkZWZpbmUgU0NMS19NT1JFX0NOVExfX1NUT1BfU0NMS19FTgkJCTB4MDAwMDEwMDBMCisjZGVmaW5lIFNDTEtfTU9SRV9DTlRMX19TVE9QX1NDTEtfQQkJCTB4MDAwMDIwMDBMCisjZGVmaW5lIFNDTEtfTU9SRV9DTlRMX19TVE9QX1NDTEtfQgkJCTB4MDAwMDQwMDBMCisjZGVmaW5lIFNDTEtfTU9SRV9DTlRMX19TVE9QX1NDTEtfQwkJCTB4MDAwMDgwMDBMCisjZGVmaW5lIFNDTEtfTU9SRV9DTlRMX19IQUxGX1NQRUVEX1NDTEsJCQkweDAwMDEwMDAwTAorI2RlZmluZSBTQ0xLX01PUkVfQ05UTF9fSU9fQ0dfVk9MVEFHRV9EUk9QCQkweDAwMDIwMDAwTAorI2RlZmluZSBTQ0xLX01PUkVfQ05UTF9fVFZGQl9TT0ZUX1JFU0VUCQkJMHgwMDA0MDAwMEwKKyNkZWZpbmUgU0NMS19NT1JFX0NOVExfX1ZPTFRBR0VfRFJPUF9TWU5DCQkweDAwMDgwMDAwTAorI2RlZmluZSBTQ0xLX01PUkVfQ05UTF9fSURMRV9ERUxBWV9IQUxGX1NDTEsJCTB4MDA0MDAwMDBMCisjZGVmaW5lIFNDTEtfTU9SRV9DTlRMX19BR1BfQlVTWV9IQUxGX1NDTEsJCTB4MDA4MDAwMDBMCisjZGVmaW5lIFNDTEtfTU9SRV9DTlRMX19DR19TUEFSRV9SRF9DX01BU0sJCTB4ZmYwMDAwMDBMCisjZGVmaW5lIFNDTEtfTU9SRV9DTlRMX19GT1JDRU9OCQkJCTB4MDAwMDA3MDBMCisKKy8qIE1DTEtfQ05UTCAqLworI2RlZmluZSBNQ0xLX0NOVExfX01DTEtBX1NSQ19TRUxfTUFTSwkJCTB4MDAwMDAwMDdMCisjZGVmaW5lIE1DTEtfQ05UTF9fWUNMS0FfU1JDX1NFTF9NQVNLCQkJMHgwMDAwMDA3MEwKKyNkZWZpbmUgTUNMS19DTlRMX19NQ0xLQl9TUkNfU0VMX01BU0sJCQkweDAwMDAwNzAwTAorI2RlZmluZSBNQ0xLX0NOVExfX1lDTEtCX1NSQ19TRUxfTUFTSwkJCTB4MDAwMDcwMDBMCisjZGVmaW5lIE1DTEtfQ05UTF9fRk9SQ0VfTUNMS0FfTUFTSwkJCTB4MDAwMTAwMDBMCisjZGVmaW5lIE1DTEtfQ05UTF9fRk9SQ0VfTUNMS0EJCQkJMHgwMDAxMDAwMEwKKyNkZWZpbmUgTUNMS19DTlRMX19GT1JDRV9NQ0xLQl9NQVNLCQkJMHgwMDAyMDAwMEwKKyNkZWZpbmUgTUNMS19DTlRMX19GT1JDRV9NQ0xLQgkJCQkweDAwMDIwMDAwTAorI2RlZmluZSBNQ0xLX0NOVExfX0ZPUkNFX1lDTEtBX01BU0sJCQkweDAwMDQwMDAwTAorI2RlZmluZSBNQ0xLX0NOVExfX0ZPUkNFX1lDTEtBCQkJCTB4MDAwNDAwMDBMCisjZGVmaW5lIE1DTEtfQ05UTF9fRk9SQ0VfWUNMS0JfTUFTSwkJCTB4MDAwODAwMDBMCisjZGVmaW5lIE1DTEtfQ05UTF9fRk9SQ0VfWUNMS0IJCQkJMHgwMDA4MDAwMEwKKyNkZWZpbmUgTUNMS19DTlRMX19GT1JDRV9NQ19NQVNLCQkJMHgwMDEwMDAwMEwKKyNkZWZpbmUgTUNMS19DTlRMX19GT1JDRV9NQwkJCQkweDAwMTAwMDAwTAorI2RlZmluZSBNQ0xLX0NOVExfX0ZPUkNFX0FJQ19NQVNLCQkJMHgwMDIwMDAwMEwKKyNkZWZpbmUgTUNMS19DTlRMX19GT1JDRV9BSUMJCQkJMHgwMDIwMDAwMEwKKyNkZWZpbmUgTUNMS19DTlRMX19NUkRDS0EwX1NPVVRTRUxfTUFTSwkJCTB4MDMwMDAwMDBMCisjZGVmaW5lIE1DTEtfQ05UTF9fTVJEQ0tBMV9TT1VUU0VMX01BU0sJCQkweDBjMDAwMDAwTAorI2RlZmluZSBNQ0xLX0NOVExfX01SRENLQjBfU09VVFNFTF9NQVNLCQkJMHgzMDAwMDAwMEwKKyNkZWZpbmUgTUNMS19DTlRMX19NUkRDS0IxX1NPVVRTRUxfTUFTSwkJCTB4YzAwMDAwMDBMCisjZGVmaW5lIE1DTEtfQ05UTF9fUjMwMF9ESVNBQkxFX01DX01DTEtBCQkoMSA8PCAyMSkKKyNkZWZpbmUgTUNMS19DTlRMX19SMzAwX0RJU0FCTEVfTUNfTUNMS0IJCSgxIDw8IDIxKQorCisvKiBNQ0xLX01JU0MgKi8KKyNkZWZpbmUgTUNMS19NSVNDX19TQ0xLX1NPVVJDRURfRlJPTV9NUExMX1NFTF9NQVNLCTB4MDAwMDAwMDNMCisjZGVmaW5lIE1DTEtfTUlTQ19fTUNMS19GUk9NX1NQTExfRElWX1NFTF9NQVNLCQkweDAwMDAwMDA0TAorI2RlZmluZSBNQ0xLX01JU0NfX01DTEtfRlJPTV9TUExMX0RJVl9TRUwJCTB4MDAwMDAwMDRMCisjZGVmaW5lIE1DTEtfTUlTQ19fRU5BQkxFX1NDTEtfRlJPTV9NUExMX01BU0sJCTB4MDAwMDAwMDhMCisjZGVmaW5lIE1DTEtfTUlTQ19fRU5BQkxFX1NDTEtfRlJPTV9NUExMCQkweDAwMDAwMDA4TAorI2RlZmluZSBNQ0xLX01JU0NfX01QTExfTU9ERUFfTU9ERUNfSFdfU0VMX0VOX01BU0sJMHgwMDAwMDAxMEwKKyNkZWZpbmUgTUNMS19NSVNDX19NUExMX01PREVBX01PREVDX0hXX1NFTF9FTgkJMHgwMDAwMDAxMEwKKyNkZWZpbmUgTUNMS19NSVNDX19ETExfUkVBRFlfTEFUX01BU0sJCQkweDAwMDAwMTAwTAorI2RlZmluZSBNQ0xLX01JU0NfX0RMTF9SRUFEWV9MQVQJCQkweDAwMDAwMTAwTAorI2RlZmluZSBNQ0xLX01JU0NfX01DX01DTEtfTUFYX0RZTl9TVE9QX0xBVF9NQVNLCTB4MDAwMDEwMDBMCisjZGVmaW5lIE1DTEtfTUlTQ19fTUNfTUNMS19NQVhfRFlOX1NUT1BfTEFUCQkweDAwMDAxMDAwTAorI2RlZmluZSBNQ0xLX01JU0NfX0lPX01DTEtfTUFYX0RZTl9TVE9QX0xBVF9NQVNLCTB4MDAwMDIwMDBMCisjZGVmaW5lIE1DTEtfTUlTQ19fSU9fTUNMS19NQVhfRFlOX1NUT1BfTEFUCQkweDAwMDAyMDAwTAorI2RlZmluZSBNQ0xLX01JU0NfX01DX01DTEtfRFlOX0VOQUJMRV9NQVNLCQkweDAwMDA0MDAwTAorI2RlZmluZSBNQ0xLX01JU0NfX01DX01DTEtfRFlOX0VOQUJMRQkJCTB4MDAwMDQwMDBMCisjZGVmaW5lIE1DTEtfTUlTQ19fSU9fTUNMS19EWU5fRU5BQkxFX01BU0sJCTB4MDAwMDgwMDBMCisjZGVmaW5lIE1DTEtfTUlTQ19fSU9fTUNMS19EWU5fRU5BQkxFCQkJMHgwMDAwODAwMEwKKyNkZWZpbmUgTUNMS19NSVNDX19DR01fQ0xLX1RPX09VVFBJTl9NQVNLCQkweDAwMDEwMDAwTAorI2RlZmluZSBNQ0xLX01JU0NfX0NHTV9DTEtfVE9fT1VUUElOCQkJMHgwMDAxMDAwMEwKKyNkZWZpbmUgTUNMS19NSVNDX19DTEtfT1JfQ09VTlRfU0VMX01BU0sJCTB4MDAwMjAwMDBMCisjZGVmaW5lIE1DTEtfTUlTQ19fQ0xLX09SX0NPVU5UX1NFTAkJCTB4MDAwMjAwMDBMCisjZGVmaW5lIE1DTEtfTUlTQ19fRU5fTUNMS19UUklTVEFURV9JTl9TVVNQRU5EX01BU0sJMHgwMDA0MDAwMEwKKyNkZWZpbmUgTUNMS19NSVNDX19FTl9NQ0xLX1RSSVNUQVRFX0lOX1NVU1BFTkQJCTB4MDAwNDAwMDBMCisjZGVmaW5lIE1DTEtfTUlTQ19fQ0dNX1NQQVJFX1JEX01BU0sJCQkweDAwMzAwMDAwTAorI2RlZmluZSBNQ0xLX01JU0NfX0NHTV9TUEFSRV9BX1JEX01BU0sJCQkweDAwYzAwMDAwTAorI2RlZmluZSBNQ0xLX01JU0NfX1RDTEtfVE9fWUNMS0JfRU5fTUFTSwkJMHgwMTAwMDAwMEwKKyNkZWZpbmUgTUNMS19NSVNDX19UQ0xLX1RPX1lDTEtCX0VOCQkJMHgwMTAwMDAwMEwKKyNkZWZpbmUgTUNMS19NSVNDX19DR01fU1BBUkVfQV9NQVNLCQkJMHgwZTAwMDAwMEwKKworLyogVkNMS19FQ1BfQ05UTCAqLworI2RlZmluZSBWQ0xLX0VDUF9DTlRMX19WQ0xLX1NSQ19TRUxfTUFTSwkJMHgwMDAwMDAwM0wKKyNkZWZpbmUgVkNMS19FQ1BfQ05UTF9fVkNMS19JTlZFUlQJCQkweDAwMDAwMDEwTAorI2RlZmluZSBWQ0xLX0VDUF9DTlRMX19QSVhDTEtfU1JDX0lOVkVSVAkJMHgwMDAwMDAyMEwKKyNkZWZpbmUgVkNMS19FQ1BfQ05UTF9fUElYQ0xLX0FMV0FZU19PTmIJCTB4MDAwMDAwNDBMCisjZGVmaW5lIFZDTEtfRUNQX0NOVExfX1BJWENMS19EQUNfQUxXQVlTX09OYgkJMHgwMDAwMDA4MEwKKyNkZWZpbmUgVkNMS19FQ1BfQ05UTF9fRUNQX0RJVl9NQVNLCQkJMHgwMDAwMDMwMEwKKyNkZWZpbmUgVkNMS19FQ1BfQ05UTF9fRUNQX0ZPUkNFX09OCQkJMHgwMDA0MDAwMEwKKyNkZWZpbmUgVkNMS19FQ1BfQ05UTF9fU1VCQ0xLX0ZPUkNFX09OCQkJMHgwMDA4MDAwMEwKKyNkZWZpbmUgVkNMS19FQ1BfQ05UTF9fUjMwMF9ESVNQX0RBQ19QSVhDTEtfREFDX0JMQU5LX09GRiAgKDE8PDIzKQorCisvKiBQTExfUFdSTUdUX0NOVEwgKi8KKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19NUExMX1RVUk5PRkZfTUFTSwkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19NUExMX1RVUk5PRkYJCQkweDAwMDAwMDAxTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX1NQTExfVFVSTk9GRl9NQVNLCQkweDAwMDAwMDAyTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX1NQTExfVFVSTk9GRgkJCTB4MDAwMDAwMDJMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fUFBMTF9UVVJOT0ZGX01BU0sJCTB4MDAwMDAwMDRMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fUFBMTF9UVVJOT0ZGCQkJMHgwMDAwMDAwNEwKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19QMlBMTF9UVVJOT0ZGX01BU0sJCTB4MDAwMDAwMDhMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fUDJQTExfVFVSTk9GRgkJCTB4MDAwMDAwMDhMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fVFZQTExfVFVSTk9GRl9NQVNLCQkweDAwMDAwMDEwTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX1RWUExMX1RVUk5PRkYJCQkweDAwMDAwMDEwTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX0FHUENMS19EWU5fU1RPUF9MQVRfTUFTSwkweDAwMDAwMWUwTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX0FQTV9QT1dFUl9TVEFURV9NQVNLCQkweDAwMDAwNjAwTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX0FQTV9QV1JTVEFURV9SRF9NQVNLCQkweDAwMDAxODAwTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX1BNX01PREVfU0VMX01BU0sJCTB4MDAwMDIwMDBMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fUE1fTU9ERV9TRUwJCQkweDAwMDAyMDAwTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX0VOX1BXUlNFUV9ET05FX0NPTkRfTUFTSwkweDAwMDA0MDAwTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX0VOX1BXUlNFUV9ET05FX0NPTkQJCTB4MDAwMDQwMDBMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fRU5fRElTUF9QQVJLRURfQ09ORF9NQVNLCTB4MDAwMDgwMDBMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fRU5fRElTUF9QQVJLRURfQ09ORAkJMHgwMDAwODAwMEwKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19NT0JJTEVfU1VfTUFTSwkJCTB4MDAwMTAwMDBMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fTU9CSUxFX1NVCQkJMHgwMDAxMDAwMEwKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19TVV9TQ0xLX1VTRV9CQ0xLX01BU0sJCTB4MDAwMjAwMDBMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fU1VfU0NMS19VU0VfQkNMSwkJMHgwMDAyMDAwMEwKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19TVV9NQ0xLX1VTRV9CQ0xLX01BU0sJCTB4MDAwNDAwMDBMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fU1VfTUNMS19VU0VfQkNMSwkJMHgwMDA0MDAwMEwKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19TVV9TVVNUQUlOX0RJU0FCTEVfTUFTSwkweDAwMDgwMDAwTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX1NVX1NVU1RBSU5fRElTQUJMRQkJMHgwMDA4MDAwMEwKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19UQ0xfQllQQVNTX0RJU0FCTEVfTUFTSwkweDAwMTAwMDAwTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX1RDTF9CWVBBU1NfRElTQUJMRQkJMHgwMDEwMDAwMEwKKyNkZWZpbmUgUExMX1BXUk1HVF9DTlRMX19UQ0xfQ0xPQ0tfQ1RJVkVfUkRfTUFTSwkweDAwMjAwMDAwTAorI2RlZmluZSBQTExfUFdSTUdUX0NOVExfX1RDTF9DTE9DS19BQ1RJVkVfUkQJCTB4MDAyMDAwMDBMCisjZGVmaW5lIFBMTF9QV1JNR1RfQ05UTF9fQ0dfTk8yX0RFQlVHX01BU0sJCTB4ZmYwMDAwMDBMCisKKy8qIENMS19QV1JNR1RfQ05UTCAqLworI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX01QTExfUFdSTUdUX09GRl9NQVNLCQkweDAwMDAwMDAxTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX01QTExfUFdSTUdUX09GRgkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19TUExMX1BXUk1HVF9PRkZfTUFTSwkJMHgwMDAwMDAwMkwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19TUExMX1BXUk1HVF9PRkYJCTB4MDAwMDAwMDJMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fUFBMTF9QV1JNR1RfT0ZGX01BU0sJCTB4MDAwMDAwMDRMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fUFBMTF9QV1JNR1RfT0ZGCQkweDAwMDAwMDA0TAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1AyUExMX1BXUk1HVF9PRkZfTUFTSwkJMHgwMDAwMDAwOEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19QMlBMTF9QV1JNR1RfT0ZGCQkweDAwMDAwMDA4TAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX01DTEtfVFVSTk9GRl9NQVNLCQkweDAwMDAwMDEwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX01DTEtfVFVSTk9GRgkJCTB4MDAwMDAwMTBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fU0NMS19UVVJOT0ZGX01BU0sJCTB4MDAwMDAwMjBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fU0NMS19UVVJOT0ZGCQkJMHgwMDAwMDAyMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19QQ0xLX1RVUk5PRkZfTUFTSwkJMHgwMDAwMDA0MEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19QQ0xLX1RVUk5PRkYJCQkweDAwMDAwMDQwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1AyQ0xLX1RVUk5PRkZfTUFTSwkJMHgwMDAwMDA4MEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19QMkNMS19UVVJOT0ZGCQkJMHgwMDAwMDA4MEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19NQ19DSF9NT0RFX01BU0sJCTB4MDAwMDAxMDBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fTUNfQ0hfTU9ERQkJCTB4MDAwMDAxMDBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fVEVTVF9NT0RFX01BU0sJCQkweDAwMDAwMjAwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1RFU1RfTU9ERQkJCTB4MDAwMDAyMDBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fR0xPQkFMX1BNQU5fRU5fTUFTSwkJMHgwMDAwMDQwMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19HTE9CQUxfUE1BTl9FTgkJCTB4MDAwMDA0MDBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fRU5HSU5FX0RZTkNMS19NT0RFX01BU0sJMHgwMDAwMTAwMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19FTkdJTkVfRFlOQ0xLX01PREUJCTB4MDAwMDEwMDBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fQUNUSVZFX0hJTE9fTEFUX01BU0sJCTB4MDAwMDYwMDBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fRElTUF9EWU5fU1RPUF9MQVRfTUFTSwkJMHgwMDAwODAwMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19ESVNQX0RZTl9TVE9QX0xBVAkJMHgwMDAwODAwMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19NQ19CVVNZX01BU0sJCQkweDAwMDEwMDAwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX01DX0JVU1kJCQkweDAwMDEwMDAwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX01DX0lOVF9DTlRMX01BU0sJCTB4MDAwMjAwMDBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fTUNfSU5UX0NOVEwJCQkweDAwMDIwMDAwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX01DX1NXSVRDSF9NQVNLCQkJMHgwMDA0MDAwMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19NQ19TV0lUQ0gJCQkweDAwMDQwMDAwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX0RMTF9SRUFEWV9NQVNLCQkJMHgwMDA4MDAwMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19ETExfUkVBRFkJCQkweDAwMDgwMDAwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX0RJU1BfUE1fTUFTSwkJCTB4MDAxMDAwMDBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fRElTUF9QTQkJCTB4MDAxMDAwMDBMCisjZGVmaW5lIENMS19QV1JNR1RfQ05UTF9fRFlOX1NUT1BfTU9ERV9NQVNLCQkweDAwZTAwMDAwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX0NHX05PMV9ERUJVR19NQVNLCQkweDNmMDAwMDAwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1RWUExMX1BXUk1HVF9PRkZfTUFTSwkJMHg0MDAwMDAwMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19UVlBMTF9QV1JNR1RfT0ZGCQkweDQwMDAwMDAwTAorI2RlZmluZSBDTEtfUFdSTUdUX0NOVExfX1RWQ0xLX1RVUk5PRkZfTUFTSwkJMHg4MDAwMDAwMEwKKyNkZWZpbmUgQ0xLX1BXUk1HVF9DTlRMX19UVkNMS19UVVJOT0ZGCQkJMHg4MDAwMDAwMEwKKworLyogQlVTX0NOVEwxICovCisjZGVmaW5lIEJVU19DTlRMMV9fUE1JX0lPX0RJU0FCTEVfTUFTSwkJCTB4MDAwMDAwMDFMCisjZGVmaW5lIEJVU19DTlRMMV9fUE1JX0lPX0RJU0FCTEUJCQkweDAwMDAwMDAxTAorI2RlZmluZSBCVVNfQ05UTDFfX1BNSV9NRU1fRElTQUJMRV9NQVNLCQkJMHgwMDAwMDAwMkwKKyNkZWZpbmUgQlVTX0NOVEwxX19QTUlfTUVNX0RJU0FCTEUJCQkweDAwMDAwMDAyTAorI2RlZmluZSBCVVNfQ05UTDFfX1BNSV9CTV9ESVNBQkxFX01BU0sJCQkweDAwMDAwMDA0TAorI2RlZmluZSBCVVNfQ05UTDFfX1BNSV9CTV9ESVNBQkxFCQkJMHgwMDAwMDAwNEwKKyNkZWZpbmUgQlVTX0NOVEwxX19QTUlfSU5UX0RJU0FCTEVfTUFTSwkJCTB4MDAwMDAwMDhMCisjZGVmaW5lIEJVU19DTlRMMV9fUE1JX0lOVF9ESVNBQkxFCQkJMHgwMDAwMDAwOEwKKyNkZWZpbmUgQlVTX0NOVEwxX19CVVMyX0lNTUVESUFURV9QTUlfRElTQUJMRV9NQVNLCTB4MDAwMDAwMjBMCisjZGVmaW5lIEJVU19DTlRMMV9fQlVTMl9JTU1FRElBVEVfUE1JX0RJU0FCTEUJCTB4MDAwMDAwMjBMCisjZGVmaW5lIEJVU19DTlRMMV9fQlVTMl9WR0FfUkVHX0NPSEVSRU5DWV9ESVNfTUFTSwkweDAwMDAwMTAwTAorI2RlZmluZSBCVVNfQ05UTDFfX0JVUzJfVkdBX1JFR19DT0hFUkVOQ1lfRElTCQkweDAwMDAwMTAwTAorI2RlZmluZSBCVVNfQ05UTDFfX0JVUzJfVkdBX01FTV9DT0hFUkVOQ1lfRElTX01BU0sJMHgwMDAwMDIwMEwKKyNkZWZpbmUgQlVTX0NOVEwxX19CVVMyX1ZHQV9NRU1fQ09IRVJFTkNZX0RJUwkJMHgwMDAwMDIwMEwKKyNkZWZpbmUgQlVTX0NOVEwxX19CVVMyX0hEUF9SRUdfQ09IRVJFTkNZX0RJU19NQVNLCTB4MDAwMDA0MDBMCisjZGVmaW5lIEJVU19DTlRMMV9fQlVTMl9IRFBfUkVHX0NPSEVSRU5DWV9ESVMJCTB4MDAwMDA0MDBMCisjZGVmaW5lIEJVU19DTlRMMV9fQlVTMl9HVUlfSU5JVElBVE9SX0NPSEVSRU5DWV9ESVNfTUFTSyAweDAwMDAwODAwTAorI2RlZmluZSBCVVNfQ05UTDFfX0JVUzJfR1VJX0lOSVRJQVRPUl9DT0hFUkVOQ1lfRElTCTB4MDAwMDA4MDBMCisjZGVmaW5lIEJVU19DTlRMMV9fTU9CSUxFX1BMQVRGT1JNX1NFTF9NQVNLCQkweDBjMDAwMDAwTAorI2RlZmluZSBCVVNfQ05UTDFfX1NFTkRfU0JBX0xBVEVOQ1lfTUFTSwkJMHg3MDAwMDAwMEwKKyNkZWZpbmUgQlVTX0NOVEwxX19BR1BDTEtfVkFMSURfTUFTSwkJCTB4ODAwMDAwMDBMCisjZGVmaW5lIEJVU19DTlRMMV9fQUdQQ0xLX1ZBTElECQkJCTB4ODAwMDAwMDBMCisKKy8qIEJVU19DTlRMMSAqLworI2RlZmluZSBCVVNfQ05UTDFfX1BNSV9JT19ESVNBQkxFX19TSElGVAkJMHgwMDAwMDAwMAorI2RlZmluZSBCVVNfQ05UTDFfX1BNSV9NRU1fRElTQUJMRV9fU0hJRlQJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQlVTX0NOVEwxX19QTUlfQk1fRElTQUJMRV9fU0hJRlQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgQlVTX0NOVEwxX19QTUlfSU5UX0RJU0FCTEVfX1NISUZUCQkweDAwMDAwMDAzCisjZGVmaW5lIEJVU19DTlRMMV9fQlVTMl9JTU1FRElBVEVfUE1JX0RJU0FCTEVfX1NISUZUCTB4MDAwMDAwMDUKKyNkZWZpbmUgQlVTX0NOVEwxX19CVVMyX1ZHQV9SRUdfQ09IRVJFTkNZX0RJU19fU0hJRlQJMHgwMDAwMDAwOAorI2RlZmluZSBCVVNfQ05UTDFfX0JVUzJfVkdBX01FTV9DT0hFUkVOQ1lfRElTX19TSElGVAkweDAwMDAwMDA5CisjZGVmaW5lIEJVU19DTlRMMV9fQlVTMl9IRFBfUkVHX0NPSEVSRU5DWV9ESVNfX1NISUZUCTB4MDAwMDAwMGEKKyNkZWZpbmUgQlVTX0NOVEwxX19CVVMyX0dVSV9JTklUSUFUT1JfQ09IRVJFTkNZX0RJU19fU0hJRlQgMHgwMDAwMDAwYgorI2RlZmluZSBCVVNfQ05UTDFfX01PQklMRV9QTEFURk9STV9TRUxfX1NISUZUCQkweDAwMDAwMDFhCisjZGVmaW5lIEJVU19DTlRMMV9fU0VORF9TQkFfTEFURU5DWV9fU0hJRlQJCTB4MDAwMDAwMWMKKyNkZWZpbmUgQlVTX0NOVEwxX19BR1BDTEtfVkFMSURfX1NISUZUCQkJMHgwMDAwMDAxZgorCisvKiBDUlRDX09GRlNFVF9DTlRMICovCisjZGVmaW5lIENSVENfT0ZGU0VUX0NOVExfX0NSVENfVElMRV9MSU5FX01BU0sJCTB4MDAwMDAwMGZMCisjZGVmaW5lIENSVENfT0ZGU0VUX0NOVExfX0NSVENfVElMRV9MSU5FX1JJR0hUX01BU0sJMHgwMDAwMDBmMEwKKyNkZWZpbmUgQ1JUQ19PRkZTRVRfQ05UTF9fQ1JUQ19USUxFX0VOX1JJR0hUX01BU0sJMHgwMDAwNDAwMEwKKyNkZWZpbmUgQ1JUQ19PRkZTRVRfQ05UTF9fQ1JUQ19USUxFX0VOX1JJR0hUCQkweDAwMDA0MDAwTAorI2RlZmluZSBDUlRDX09GRlNFVF9DTlRMX19DUlRDX1RJTEVfRU5fTUFTSwkJMHgwMDAwODAwMEwKKyNkZWZpbmUgQ1JUQ19PRkZTRVRfQ05UTF9fQ1JUQ19USUxFX0VOCQkJMHgwMDAwODAwMEwKKyNkZWZpbmUgQ1JUQ19PRkZTRVRfQ05UTF9fQ1JUQ19PRkZTRVRfRkxJUF9DTlRMX01BU0sJMHgwMDAxMDAwMEwKKyNkZWZpbmUgQ1JUQ19PRkZTRVRfQ05UTF9fQ1JUQ19PRkZTRVRfRkxJUF9DTlRMCQkweDAwMDEwMDAwTAorI2RlZmluZSBDUlRDX09GRlNFVF9DTlRMX19DUlRDX1NURVJFT19PRkZTRVRfRU5fTUFTSwkweDAwMDIwMDAwTAorI2RlZmluZSBDUlRDX09GRlNFVF9DTlRMX19DUlRDX1NURVJFT19PRkZTRVRfRU4JCTB4MDAwMjAwMDBMCisjZGVmaW5lIENSVENfT0ZGU0VUX0NOVExfX0NSVENfU1RFUkVPX1NZTkNfRU5fTUFTSwkweDAwMGMwMDAwTAorI2RlZmluZSBDUlRDX09GRlNFVF9DTlRMX19DUlRDX1NURVJFT19TWU5DX09VVF9FTl9NQVNLCTB4MDAxMDAwMDBMCisjZGVmaW5lIENSVENfT0ZGU0VUX0NOVExfX0NSVENfU1RFUkVPX1NZTkNfT1VUX0VOCTB4MDAxMDAwMDBMCisjZGVmaW5lIENSVENfT0ZGU0VUX0NOVExfX0NSVENfU1RFUkVPX1NZTkNfTUFTSwkJMHgwMDIwMDAwMEwKKyNkZWZpbmUgQ1JUQ19PRkZTRVRfQ05UTF9fQ1JUQ19TVEVSRU9fU1lOQwkJMHgwMDIwMDAwMEwKKyNkZWZpbmUgQ1JUQ19PRkZTRVRfQ05UTF9fQ1JUQ19HVUlfVFJJR19PRkZTRVRfTEVGVF9FTl9NQVNLIDB4MTAwMDAwMDBMCisjZGVmaW5lIENSVENfT0ZGU0VUX0NOVExfX0NSVENfR1VJX1RSSUdfT0ZGU0VUX0xFRlRfRU4JMHgxMDAwMDAwMEwKKyNkZWZpbmUgQ1JUQ19PRkZTRVRfQ05UTF9fQ1JUQ19HVUlfVFJJR19PRkZTRVRfUklHSFRfRU5fTUFTSyAweDIwMDAwMDAwTAorI2RlZmluZSBDUlRDX09GRlNFVF9DTlRMX19DUlRDX0dVSV9UUklHX09GRlNFVF9SSUdIVF9FTgkweDIwMDAwMDAwTAorI2RlZmluZSBDUlRDX09GRlNFVF9DTlRMX19DUlRDX0dVSV9UUklHX09GRlNFVF9NQVNLCTB4NDAwMDAwMDBMCisjZGVmaW5lIENSVENfT0ZGU0VUX0NOVExfX0NSVENfR1VJX1RSSUdfT0ZGU0VUCQkweDQwMDAwMDAwTAorI2RlZmluZSBDUlRDX09GRlNFVF9DTlRMX19DUlRDX09GRlNFVF9MT0NLX01BU0sJCTB4ODAwMDAwMDBMCisjZGVmaW5lIENSVENfT0ZGU0VUX0NOVExfX0NSVENfT0ZGU0VUX0xPQ0sJCTB4ODAwMDAwMDBMCisKKy8qIENSVENfR0VOX0NOVEwgKi8KKyNkZWZpbmUgQ1JUQ19HRU5fQ05UTF9fQ1JUQ19EQkxfU0NBTl9FTl9NQVNLCQkweDAwMDAwMDAxTAorI2RlZmluZSBDUlRDX0dFTl9DTlRMX19DUlRDX0RCTF9TQ0FOX0VOCQkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgQ1JUQ19HRU5fQ05UTF9fQ1JUQ19JTlRFUkxBQ0VfRU5fTUFTSwkJMHgwMDAwMDAwMkwKKyNkZWZpbmUgQ1JUQ19HRU5fQ05UTF9fQ1JUQ19JTlRFUkxBQ0VfRU4JCTB4MDAwMDAwMDJMCisjZGVmaW5lIENSVENfR0VOX0NOVExfX0NSVENfQ19TWU5DX0VOX01BU0sJCTB4MDAwMDAwMTBMCisjZGVmaW5lIENSVENfR0VOX0NOVExfX0NSVENfQ19TWU5DX0VOCQkJMHgwMDAwMDAxMEwKKyNkZWZpbmUgQ1JUQ19HRU5fQ05UTF9fQ1JUQ19QSVhfV0lEVEhfTUFTSwkJMHgwMDAwMGYwMEwKKyNkZWZpbmUgQ1JUQ19HRU5fQ05UTF9fQ1JUQ19JQ09OX0VOX01BU0sJCTB4MDAwMDgwMDBMCisjZGVmaW5lIENSVENfR0VOX0NOVExfX0NSVENfSUNPTl9FTgkJCTB4MDAwMDgwMDBMCisjZGVmaW5lIENSVENfR0VOX0NOVExfX0NSVENfQ1VSX0VOX01BU0sJCQkweDAwMDEwMDAwTAorI2RlZmluZSBDUlRDX0dFTl9DTlRMX19DUlRDX0NVUl9FTgkJCTB4MDAwMTAwMDBMCisjZGVmaW5lIENSVENfR0VOX0NOVExfX0NSVENfVlNUQVRfTU9ERV9NQVNLCQkweDAwMDYwMDAwTAorI2RlZmluZSBDUlRDX0dFTl9DTlRMX19DUlRDX0NVUl9NT0RFX01BU0sJCTB4MDA3MDAwMDBMCisjZGVmaW5lIENSVENfR0VOX0NOVExfX0NSVENfRVhUX0RJU1BfRU5fTUFTSwkJMHgwMTAwMDAwMEwKKyNkZWZpbmUgQ1JUQ19HRU5fQ05UTF9fQ1JUQ19FWFRfRElTUF9FTgkJCTB4MDEwMDAwMDBMCisjZGVmaW5lIENSVENfR0VOX0NOVExfX0NSVENfRU5fTUFTSwkJCTB4MDIwMDAwMDBMCisjZGVmaW5lIENSVENfR0VOX0NOVExfX0NSVENfRU4JCQkJMHgwMjAwMDAwMEwKKyNkZWZpbmUgQ1JUQ19HRU5fQ05UTF9fQ1JUQ19ESVNQX1JFUV9FTl9CX01BU0sJCTB4MDQwMDAwMDBMCisjZGVmaW5lIENSVENfR0VOX0NOVExfX0NSVENfRElTUF9SRVFfRU5fQgkJMHgwNDAwMDAwMEwKKworLyogQ1JUQzJfR0VOX0NOVEwgKi8KKyNkZWZpbmUgQ1JUQzJfR0VOX0NOVExfX0NSVEMyX0RCTF9TQ0FOX0VOX01BU0sJCTB4MDAwMDAwMDFMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9EQkxfU0NBTl9FTgkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgQ1JUQzJfR0VOX0NOVExfX0NSVEMyX0lOVEVSTEFDRV9FTl9NQVNLCQkweDAwMDAwMDAyTAorI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUQzJfSU5URVJMQUNFX0VOCQkweDAwMDAwMDAyTAorI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUQzJfU1lOQ19UUklTVEFURV9NQVNLCTB4MDAwMDAwMTBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9TWU5DX1RSSVNUQVRFCQkweDAwMDAwMDEwTAorI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUQzJfSFNZTkNfVFJJU1RBVEVfTUFTSwkweDAwMDAwMDIwTAorI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUQzJfSFNZTkNfVFJJU1RBVEUJCTB4MDAwMDAwMjBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9WU1lOQ19UUklTVEFURV9NQVNLCTB4MDAwMDAwNDBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9WU1lOQ19UUklTVEFURQkJMHgwMDAwMDA0MEwKKyNkZWZpbmUgQ1JUQzJfR0VOX0NOVExfX0NSVDJfT05fTUFTSwkJCTB4MDAwMDAwODBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlQyX09OCQkJCTB4MDAwMDAwODBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9QSVhfV0lEVEhfTUFTSwkJMHgwMDAwMGYwMEwKKyNkZWZpbmUgQ1JUQzJfR0VOX0NOVExfX0NSVEMyX0lDT05fRU5fTUFTSwkJMHgwMDAwODAwMEwKKyNkZWZpbmUgQ1JUQzJfR0VOX0NOVExfX0NSVEMyX0lDT05fRU4JCQkweDAwMDA4MDAwTAorI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUQzJfQ1VSX0VOX01BU0sJCTB4MDAwMTAwMDBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9DVVJfRU4JCQkweDAwMDEwMDAwTAorI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUQzJfQ1VSX01PREVfTUFTSwkJMHgwMDcwMDAwMEwKKyNkZWZpbmUgQ1JUQzJfR0VOX0NOVExfX0NSVEMyX0RJU1BMQVlfRElTX01BU0sJCTB4MDA4MDAwMDBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9ESVNQTEFZX0RJUwkJMHgwMDgwMDAwMEwKKyNkZWZpbmUgQ1JUQzJfR0VOX0NOVExfX0NSVEMyX0VOX01BU0sJCQkweDAyMDAwMDAwTAorI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUQzJfRU4JCQkweDAyMDAwMDAwTAorI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUQzJfRElTUF9SRVFfRU5fQl9NQVNLCTB4MDQwMDAwMDBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9ESVNQX1JFUV9FTl9CCQkweDA0MDAwMDAwTAorI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUQzJfQ19TWU5DX0VOX01BU0sJCTB4MDgwMDAwMDBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9DX1NZTkNfRU4JCQkweDA4MDAwMDAwTAorI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUQzJfSFNZTkNfRElTX01BU0sJCTB4MTAwMDAwMDBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9IU1lOQ19ESVMJCQkweDEwMDAwMDAwTAorI2RlZmluZSBDUlRDMl9HRU5fQ05UTF9fQ1JUQzJfVlNZTkNfRElTX01BU0sJCTB4MjAwMDAwMDBMCisjZGVmaW5lIENSVEMyX0dFTl9DTlRMX19DUlRDMl9WU1lOQ19ESVMJCQkweDIwMDAwMDAwTAorCisvKiBBR1BfQ05UTCAqLworI2RlZmluZSBBR1BfQ05UTF9fTUFYX0lETEVfQ0xLX01BU0sJCQkweDAwMDAwMGZmTAorI2RlZmluZSBBR1BfQ05UTF9fSE9MRF9SRF9GSUZPX01BU0sJCQkweDAwMDAwMTAwTAorI2RlZmluZSBBR1BfQ05UTF9fSE9MRF9SRF9GSUZPCQkJCTB4MDAwMDAxMDBMCisjZGVmaW5lIEFHUF9DTlRMX19IT0xEX1JRX0ZJRk9fTUFTSwkJCTB4MDAwMDAyMDBMCisjZGVmaW5lIEFHUF9DTlRMX19IT0xEX1JRX0ZJRk8JCQkJMHgwMDAwMDIwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0VOXzJYX1NUQkJfTUFTSwkJCTB4MDAwMDA0MDBMCisjZGVmaW5lIEFHUF9DTlRMX19FTl8yWF9TVEJCCQkJCTB4MDAwMDA0MDBMCisjZGVmaW5lIEFHUF9DTlRMX19GT1JDRV9GVUxMX1NCQV9NQVNLCQkJMHgwMDAwMDgwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0ZPUkNFX0ZVTExfU0JBCQkJMHgwMDAwMDgwMEwKKyNkZWZpbmUgQUdQX0NOVExfX1NCQV9ESVNfTUFTSwkJCQkweDAwMDAxMDAwTAorI2RlZmluZSBBR1BfQ05UTF9fU0JBX0RJUwkJCQkweDAwMDAxMDAwTAorI2RlZmluZSBBR1BfQ05UTF9fQUdQX1JFVl9JRF9NQVNLCQkJMHgwMDAwMjAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0FHUF9SRVZfSUQJCQkJMHgwMDAwMjAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX1JFR19DUklQUExFX0FHUDRYX01BU0sJCTB4MDAwMDQwMDBMCisjZGVmaW5lIEFHUF9DTlRMX19SRUdfQ1JJUFBMRV9BR1A0WAkJCTB4MDAwMDQwMDBMCisjZGVmaW5lIEFHUF9DTlRMX19SRUdfQ1JJUFBMRV9BR1AyWDRYX01BU0sJCTB4MDAwMDgwMDBMCisjZGVmaW5lIEFHUF9DTlRMX19SRUdfQ1JJUFBMRV9BR1AyWDRYCQkJMHgwMDAwODAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0ZPUkNFX0lOVF9WUkVGX01BU0sJCQkweDAwMDEwMDAwTAorI2RlZmluZSBBR1BfQ05UTF9fRk9SQ0VfSU5UX1ZSRUYJCQkweDAwMDEwMDAwTAorI2RlZmluZSBBR1BfQ05UTF9fUEVORElOR19TTE9UU19WQUxfTUFTSwkJMHgwMDA2MDAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX1BFTkRJTkdfU0xPVFNfU0VMX01BU0sJCTB4MDAwODAwMDBMCisjZGVmaW5lIEFHUF9DTlRMX19QRU5ESU5HX1NMT1RTX1NFTAkJCTB4MDAwODAwMDBMCisjZGVmaW5lIEFHUF9DTlRMX19FTl9FWFRFTkRFRF9BRF9TVEJfMlhfTUFTSwkJMHgwMDEwMDAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0VOX0VYVEVOREVEX0FEX1NUQl8yWAkJCTB4MDAxMDAwMDBMCisjZGVmaW5lIEFHUF9DTlRMX19ESVNfUVVFVUVEX0dOVF9GSVhfTUFTSwkJMHgwMDIwMDAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0RJU19RVUVVRURfR05UX0ZJWAkJCTB4MDAyMDAwMDBMCisjZGVmaW5lIEFHUF9DTlRMX19FTl9SREFUQTJYNFhfTVVMVElSRVNFVF9NQVNLCQkweDAwNDAwMDAwTAorI2RlZmluZSBBR1BfQ05UTF9fRU5fUkRBVEEyWDRYX01VTFRJUkVTRVQJCTB4MDA0MDAwMDBMCisjZGVmaW5lIEFHUF9DTlRMX19FTl9SQkZDQUxNX01BU0sJCQkweDAwODAwMDAwTAorI2RlZmluZSBBR1BfQ05UTF9fRU5fUkJGQ0FMTQkJCQkweDAwODAwMDAwTAorI2RlZmluZSBBR1BfQ05UTF9fRk9SQ0VfRVhUX1ZSRUZfTUFTSwkJCTB4MDEwMDAwMDBMCisjZGVmaW5lIEFHUF9DTlRMX19GT1JDRV9FWFRfVlJFRgkJCTB4MDEwMDAwMDBMCisjZGVmaW5lIEFHUF9DTlRMX19ESVNfUkJGX01BU0sJCQkJMHgwMjAwMDAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0RJU19SQkYJCQkJMHgwMjAwMDAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0RFTEFZX0ZJUlNUX1NCQV9FTl9NQVNLCQkweDA0MDAwMDAwTAorI2RlZmluZSBBR1BfQ05UTF9fREVMQVlfRklSU1RfU0JBX0VOCQkJMHgwNDAwMDAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0RFTEFZX0ZJUlNUX1NCQV9WQUxfTUFTSwkJMHgzODAwMDAwMEwKKyNkZWZpbmUgQUdQX0NOVExfX0FHUF9NSVNDX01BU0sJCQkJMHhjMDAwMDAwMEwKKworLyogQUdQX0NOVEwgKi8KKyNkZWZpbmUgQUdQX0NOVExfX01BWF9JRExFX0NMS19fU0hJRlQJCQkweDAwMDAwMDAwCisjZGVmaW5lIEFHUF9DTlRMX19IT0xEX1JEX0ZJRk9fX1NISUZUCQkJMHgwMDAwMDAwOAorI2RlZmluZSBBR1BfQ05UTF9fSE9MRF9SUV9GSUZPX19TSElGVAkJCTB4MDAwMDAwMDkKKyNkZWZpbmUgQUdQX0NOVExfX0VOXzJYX1NUQkJfX1NISUZUCQkJMHgwMDAwMDAwYQorI2RlZmluZSBBR1BfQ05UTF9fRk9SQ0VfRlVMTF9TQkFfX1NISUZUCQkJMHgwMDAwMDAwYgorI2RlZmluZSBBR1BfQ05UTF9fU0JBX0RJU19fU0hJRlQJCQkweDAwMDAwMDBjCisjZGVmaW5lIEFHUF9DTlRMX19BR1BfUkVWX0lEX19TSElGVAkJCTB4MDAwMDAwMGQKKyNkZWZpbmUgQUdQX0NOVExfX1JFR19DUklQUExFX0FHUDRYX19TSElGVAkJMHgwMDAwMDAwZQorI2RlZmluZSBBR1BfQ05UTF9fUkVHX0NSSVBQTEVfQUdQMlg0WF9fU0hJRlQJCTB4MDAwMDAwMGYKKyNkZWZpbmUgQUdQX0NOVExfX0ZPUkNFX0lOVF9WUkVGX19TSElGVAkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgQUdQX0NOVExfX1BFTkRJTkdfU0xPVFNfVkFMX19TSElGVAkJMHgwMDAwMDAxMQorI2RlZmluZSBBR1BfQ05UTF9fUEVORElOR19TTE9UU19TRUxfX1NISUZUCQkweDAwMDAwMDEzCisjZGVmaW5lIEFHUF9DTlRMX19FTl9FWFRFTkRFRF9BRF9TVEJfMlhfX1NISUZUCQkweDAwMDAwMDE0CisjZGVmaW5lIEFHUF9DTlRMX19ESVNfUVVFVUVEX0dOVF9GSVhfX1NISUZUCQkweDAwMDAwMDE1CisjZGVmaW5lIEFHUF9DTlRMX19FTl9SREFUQTJYNFhfTVVMVElSRVNFVF9fU0hJRlQJMHgwMDAwMDAxNgorI2RlZmluZSBBR1BfQ05UTF9fRU5fUkJGQ0FMTV9fU0hJRlQJCQkweDAwMDAwMDE3CisjZGVmaW5lIEFHUF9DTlRMX19GT1JDRV9FWFRfVlJFRl9fU0hJRlQJCQkweDAwMDAwMDE4CisjZGVmaW5lIEFHUF9DTlRMX19ESVNfUkJGX19TSElGVAkJCTB4MDAwMDAwMTkKKyNkZWZpbmUgQUdQX0NOVExfX0RFTEFZX0ZJUlNUX1NCQV9FTl9fU0hJRlQJCTB4MDAwMDAwMWEKKyNkZWZpbmUgQUdQX0NOVExfX0RFTEFZX0ZJUlNUX1NCQV9WQUxfX1NISUZUCQkweDAwMDAwMDFiCisjZGVmaW5lIEFHUF9DTlRMX19BR1BfTUlTQ19fU0hJRlQJCQkweDAwMDAwMDFlCisKKy8qIERJU1BfTUlTQ19DTlRMICovCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX19TT0ZUX1JFU0VUX0dSUEhfUFBfTUFTSwkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NPRlRfUkVTRVRfR1JQSF9QUAkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NPRlRfUkVTRVRfU1VCUElDX1BQX01BU0sJMHgwMDAwMDAwMkwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NPRlRfUkVTRVRfU1VCUElDX1BQCQkweDAwMDAwMDAyTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fU09GVF9SRVNFVF9PVjBfUFBfTUFTSwkJMHgwMDAwMDAwNEwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NPRlRfUkVTRVRfT1YwX1BQCQkweDAwMDAwMDA0TAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fU09GVF9SRVNFVF9HUlBIX1NDTEtfTUFTSwkweDAwMDAwMDEwTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fU09GVF9SRVNFVF9HUlBIX1NDTEsJCTB4MDAwMDAwMTBMCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX19TT0ZUX1JFU0VUX1NVQlBJQ19TQ0xLX01BU0sJMHgwMDAwMDAyMEwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NPRlRfUkVTRVRfU1VCUElDX1NDTEsJCTB4MDAwMDAwMjBMCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX19TT0ZUX1JFU0VUX09WMF9TQ0xLX01BU0sJMHgwMDAwMDA0MEwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NPRlRfUkVTRVRfT1YwX1NDTEsJCTB4MDAwMDAwNDBMCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX19TWU5DX1NUUkVOR1RIX01BU0sJCTB4MDAwMDAzMDBMCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX19TWU5DX1BBRF9GTE9QX0VOX01BU0sJCTB4MDAwMDA0MDBMCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX19TWU5DX1BBRF9GTE9QX0VOCQkweDAwMDAwNDAwTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fU09GVF9SRVNFVF9HUlBIMl9QUF9NQVNLCTB4MDAwMDEwMDBMCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX19TT0ZUX1JFU0VUX0dSUEgyX1BQCQkweDAwMDAxMDAwTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fU09GVF9SRVNFVF9HUlBIMl9TQ0xLX01BU0sJMHgwMDAwODAwMEwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NPRlRfUkVTRVRfR1JQSDJfU0NMSwkJMHgwMDAwODAwMEwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NPRlRfUkVTRVRfTFZEU19NQVNLCQkweDAwMDEwMDAwTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fU09GVF9SRVNFVF9MVkRTCQkJMHgwMDAxMDAwMEwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NPRlRfUkVTRVRfVE1EU19NQVNLCQkweDAwMDIwMDAwTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fU09GVF9SRVNFVF9UTURTCQkJMHgwMDAyMDAwMEwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NPRlRfUkVTRVRfRElHX1RNRFNfTUFTSwkweDAwMDQwMDAwTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fU09GVF9SRVNFVF9ESUdfVE1EUwkJMHgwMDA0MDAwMEwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NPRlRfUkVTRVRfVFZfTUFTSwkJMHgwMDA4MDAwMEwKKyNkZWZpbmUgRElTUF9NSVNDX0NOVExfX1NPRlRfUkVTRVRfVFYJCQkweDAwMDgwMDAwTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fUEFMRVRURTJfTUVNX1JEX01BUkdJTl9NQVNLCTB4MDBmMDAwMDBMCisjZGVmaW5lIERJU1BfTUlTQ19DTlRMX19QQUxFVFRFX01FTV9SRF9NQVJHSU5fTUFTSwkweDBmMDAwMDAwTAorI2RlZmluZSBESVNQX01JU0NfQ05UTF9fUk1YX0JVRl9NRU1fUkRfTUFSR0lOX01BU0sJMHhmMDAwMDAwMEwKKworLyogRElTUF9QV1JfTUFOICovCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElTUF9QV1JfTUFOX0QzX0NSVENfRU5fTUFTSwkweDAwMDAwMDAxTAorI2RlZmluZSBESVNQX1BXUl9NQU5fX0RJU1BfUFdSX01BTl9EM19DUlRDX0VOCQkweDAwMDAwMDAxTAorI2RlZmluZSBESVNQX1BXUl9NQU5fX0RJU1AyX1BXUl9NQU5fRDNfQ1JUQzJfRU5fTUFTSwkweDAwMDAwMDEwTAorI2RlZmluZSBESVNQX1BXUl9NQU5fX0RJU1AyX1BXUl9NQU5fRDNfQ1JUQzJfRU4JCTB4MDAwMDAwMTBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElTUF9QV1JfTUFOX0RQTVNfTUFTSwkJMHgwMDAwMDMwMEwKKyNkZWZpbmUgRElTUF9QV1JfTUFOX19ESVNQX0QzX1JTVF9NQVNLCQkJMHgwMDAxMDAwMEwKKyNkZWZpbmUgRElTUF9QV1JfTUFOX19ESVNQX0QzX1JTVAkJCTB4MDAwMTAwMDBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElTUF9EM19SRUdfUlNUX01BU0sJCTB4MDAwMjAwMDBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElTUF9EM19SRUdfUlNUCQkJMHgwMDAyMDAwMEwKKyNkZWZpbmUgRElTUF9QV1JfTUFOX19ESVNQX0QzX0dSUEhfUlNUX01BU0sJCTB4MDAwNDAwMDBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElTUF9EM19HUlBIX1JTVAkJCTB4MDAwNDAwMDBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElTUF9EM19TVUJQSUNfUlNUX01BU0sJCTB4MDAwODAwMDBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElTUF9EM19TVUJQSUNfUlNUCQkweDAwMDgwMDAwTAorI2RlZmluZSBESVNQX1BXUl9NQU5fX0RJU1BfRDNfT1YwX1JTVF9NQVNLCQkweDAwMTAwMDAwTAorI2RlZmluZSBESVNQX1BXUl9NQU5fX0RJU1BfRDNfT1YwX1JTVAkJCTB4MDAxMDAwMDBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElTUF9EMUQyX0dSUEhfUlNUX01BU0sJCTB4MDAyMDAwMDBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElTUF9EMUQyX0dSUEhfUlNUCQkweDAwMjAwMDAwTAorI2RlZmluZSBESVNQX1BXUl9NQU5fX0RJU1BfRDFEMl9TVUJQSUNfUlNUX01BU0sJCTB4MDA0MDAwMDBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElTUF9EMUQyX1NVQlBJQ19SU1QJCTB4MDA0MDAwMDBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElTUF9EMUQyX09WMF9SU1RfTUFTSwkJMHgwMDgwMDAwMEwKKyNkZWZpbmUgRElTUF9QV1JfTUFOX19ESVNQX0QxRDJfT1YwX1JTVAkJCTB4MDA4MDAwMDBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fRElHX1RNRFNfRU5BQkxFX1JTVF9NQVNLCQkweDAxMDAwMDAwTAorI2RlZmluZSBESVNQX1BXUl9NQU5fX0RJR19UTURTX0VOQUJMRV9SU1QJCTB4MDEwMDAwMDBMCisjZGVmaW5lIERJU1BfUFdSX01BTl9fVFZfRU5BQkxFX1JTVF9NQVNLCQkweDAyMDAwMDAwTAorI2RlZmluZSBESVNQX1BXUl9NQU5fX1RWX0VOQUJMRV9SU1QJCQkweDAyMDAwMDAwTAorI2RlZmluZSBESVNQX1BXUl9NQU5fX0FVVE9fUFdSVVBfRU5fTUFTSwkJMHgwNDAwMDAwMEwKKyNkZWZpbmUgRElTUF9QV1JfTUFOX19BVVRPX1BXUlVQX0VOCQkJMHgwNDAwMDAwMEwKKworLyogTUNfSU5EX0lOREVYICovCisjZGVmaW5lIE1DX0lORF9JTkRFWF9fTUNfSU5EX0FERFJfTUFTSwkJCTB4MDAwMDAwMWZMCisjZGVmaW5lIE1DX0lORF9JTkRFWF9fTUNfSU5EX1dSX0VOX01BU0sJCQkweDAwMDAwMTAwTAorI2RlZmluZSBNQ19JTkRfSU5ERVhfX01DX0lORF9XUl9FTgkJCTB4MDAwMDAxMDBMCisKKy8qIE1DX0lORF9EQVRBICovCisjZGVmaW5lIE1DX0lORF9EQVRBX19NQ19JTkRfREFUQV9NQVNLCQkJMHhmZmZmZmZmZkwKKworLyogTUNfQ0hQX0lPX0NOVExfQTEgKi8KKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TTEVXTl9DS0FfX1NISUZUCQkweDAwMDAwMDAwCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU0xFV05fQUFfX1NISUZUCQkweDAwMDAwMDAxCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU0xFV05fRFFNQV9fU0hJRlQJMHgwMDAwMDAwMgorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NMRVdOX0RRU0FfX1NISUZUCTB4MDAwMDAwMDMKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TTEVXUF9DS0FfX1NISUZUCQkweDAwMDAwMDA0CisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU0xFV1BfQUFfX1NISUZUCQkweDAwMDAwMDA1CisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU0xFV1BfRFFNQV9fU0hJRlQJMHgwMDAwMDAwNgorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NMRVdQX0RRU0FfX1NISUZUCTB4MDAwMDAwMDcKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9QUkVBTVBfQUFfX1NISUZUCQkweDAwMDAwMDA4CisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fUFJFQU1QX0RRTUFfX1NISUZUCTB4MDAwMDAwMDkKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9QUkVBTVBfRFFTQV9fU0hJRlQJMHgwMDAwMDAwYQorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX0lPX01PREVBX19TSElGVAkJMHgwMDAwMDAwYworI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1JFQ19DS0FfX1NISUZUCQkweDAwMDAwMDBlCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fUkVDX0FBX19TSElGVAkJMHgwMDAwMDAxMAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1JFQ19EUU1BX19TSElGVAkJMHgwMDAwMDAxMgorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1JFQ19EUVNBX19TSElGVAkJMHgwMDAwMDAxNAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NZTkNfUEhBU0VBX19TSElGVAkweDAwMDAwMDE2CisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU1lOQ19DRU5URVJBX19TSElGVAkweDAwMDAwMDE3CisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU1lOQ19FTkFfX1NISUZUCQkweDAwMDAwMDE4CisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fQ0xLX1NFTEFfX1NISUZUCQkweDAwMDAwMDFhCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fQ0xLX0lOVkFfX1NISUZUCQkweDAwMDAwMDFjCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fREFUQV9FTklNUF9BX19TSElGVAkweDAwMDAwMDFlCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fQ05UTF9FTklNUF9BX19TSElGVAkweDAwMDAwMDFmCisKKy8qIE1DX0NIUF9JT19DTlRMX0IxICovCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU0xFV05fQ0tCX19TSElGVAkJMHgwMDAwMDAwMAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NMRVdOX0FCX19TSElGVAkJMHgwMDAwMDAwMQorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NMRVdOX0RRTUJfX1NISUZUCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9TTEVXTl9EUVNCX19TSElGVAkweDAwMDAwMDAzCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU0xFV1BfQ0tCX19TSElGVAkJMHgwMDAwMDAwNAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NMRVdQX0FCX19TSElGVAkJMHgwMDAwMDAwNQorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NMRVdQX0RRTUJfX1NISUZUCTB4MDAwMDAwMDYKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9TTEVXUF9EUVNCX19TSElGVAkweDAwMDAwMDA3CisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fUFJFQU1QX0FCX19TSElGVAkJMHgwMDAwMDAwOAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1BSRUFNUF9EUU1CX19TSElGVAkweDAwMDAwMDA5CisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fUFJFQU1QX0RRU0JfX1NISUZUCTB4MDAwMDAwMGEKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9JT19NT0RFQl9fU0hJRlQJCTB4MDAwMDAwMGMKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9SRUNfQ0tCX19TSElGVAkJMHgwMDAwMDAwZQorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1JFQ19BQl9fU0hJRlQJCTB4MDAwMDAwMTAKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9SRUNfRFFNQl9fU0hJRlQJCTB4MDAwMDAwMTIKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9SRUNfRFFTQl9fU0hJRlQJCTB4MDAwMDAwMTQKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9TWU5DX1BIQVNFQl9fU0hJRlQJMHgwMDAwMDAxNgorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NZTkNfQ0VOVEVSQl9fU0hJRlQJMHgwMDAwMDAxNworI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NZTkNfRU5CX19TSElGVAkJMHgwMDAwMDAxOAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX0NMS19TRUxCX19TSElGVAkJMHgwMDAwMDAxYQorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX0NMS19JTlZCX19TSElGVAkJMHgwMDAwMDAxYworI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX0RBVEFfRU5JTVBfQl9fU0hJRlQJMHgwMDAwMDAxZQorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX0NOVExfRU5JTVBfQl9fU0hJRlQJMHgwMDAwMDAxZgorCisvKiBNQ19DSFBfSU9fQ05UTF9BMSAqLworI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NMRVdOX0NLQV9NQVNLCQkweDAwMDAwMDAxTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NMRVdOX0NLQQkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TTEVXTl9BQV9NQVNLCQkweDAwMDAwMDAyTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NMRVdOX0FBCQkJMHgwMDAwMDAwMkwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TTEVXTl9EUU1BX01BU0sJCTB4MDAwMDAwMDRMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU0xFV05fRFFNQQkJMHgwMDAwMDAwNEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TTEVXTl9EUVNBX01BU0sJCTB4MDAwMDAwMDhMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU0xFV05fRFFTQQkJMHgwMDAwMDAwOEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TTEVXUF9DS0FfTUFTSwkJMHgwMDAwMDAxMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TTEVXUF9DS0EJCTB4MDAwMDAwMTBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU0xFV1BfQUFfTUFTSwkJMHgwMDAwMDAyMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TTEVXUF9BQQkJCTB4MDAwMDAwMjBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU0xFV1BfRFFNQV9NQVNLCQkweDAwMDAwMDQwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NMRVdQX0RRTUEJCTB4MDAwMDAwNDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU0xFV1BfRFFTQV9NQVNLCQkweDAwMDAwMDgwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NMRVdQX0RRU0EJCTB4MDAwMDAwODBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fUFJFQU1QX0FBX01BU0sJCTB4MDAwMDAxMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fUFJFQU1QX0FBCQkweDAwMDAwMTAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1BSRUFNUF9EUU1BX01BU0sJCTB4MDAwMDAyMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fUFJFQU1QX0RRTUEJCTB4MDAwMDAyMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fUFJFQU1QX0RRU0FfTUFTSwkJMHgwMDAwMDQwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9QUkVBTVBfRFFTQQkJMHgwMDAwMDQwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9JT19NT0RFQV9NQVNLCQkweDAwMDAzMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1JFQ19DS0FfTUFTSwkJMHgwMDAwYzAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9SRUNfQUFfTUFTSwkJMHgwMDAzMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9SRUNfRFFNQV9NQVNLCQkweDAwMGMwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1JFQ19EUVNBX01BU0sJCTB4MDAzMDAwMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fU1lOQ19QSEFTRUFfTUFTSwkJMHgwMDQwMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TWU5DX1BIQVNFQQkJMHgwMDQwMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TWU5DX0NFTlRFUkFfTUFTSwkweDAwODAwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX1NZTkNfQ0VOVEVSQQkJMHgwMDgwMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9TWU5DX0VOQV9NQVNLCQkweDAzMDAwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9BMV9fTUVNX0NMS19TRUxBX01BU0sJCTB4MGMwMDAwMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fQ0xLX0lOVkFfTUFTSwkJMHgxMDAwMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9DTEtfSU5WQQkJCTB4MTAwMDAwMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fREFUQV9FTklNUF9BX01BU0sJMHg0MDAwMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9EQVRBX0VOSU1QX0EJCTB4NDAwMDAwMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0ExX19NRU1fQ05UTF9FTklNUF9BX01BU0sJMHg4MDAwMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQTFfX01FTV9DTlRMX0VOSU1QX0EJCTB4ODAwMDAwMDBMCisKKy8qIE1DX0NIUF9JT19DTlRMX0IxICovCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU0xFV05fQ0tCX01BU0sJCTB4MDAwMDAwMDFMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU0xFV05fQ0tCCQkweDAwMDAwMDAxTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NMRVdOX0FCX01BU0sJCTB4MDAwMDAwMDJMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU0xFV05fQUIJCQkweDAwMDAwMDAyTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NMRVdOX0RRTUJfTUFTSwkJMHgwMDAwMDAwNEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9TTEVXTl9EUU1CCQkweDAwMDAwMDA0TAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NMRVdOX0RRU0JfTUFTSwkJMHgwMDAwMDAwOEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9TTEVXTl9EUVNCCQkweDAwMDAwMDA4TAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NMRVdQX0NLQl9NQVNLCQkweDAwMDAwMDEwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NMRVdQX0NLQgkJMHgwMDAwMDAxMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9TTEVXUF9BQl9NQVNLCQkweDAwMDAwMDIwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NMRVdQX0FCCQkJMHgwMDAwMDAyMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9TTEVXUF9EUU1CX01BU0sJCTB4MDAwMDAwNDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU0xFV1BfRFFNQgkJMHgwMDAwMDA0MEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9TTEVXUF9EUVNCX01BU0sJCTB4MDAwMDAwODBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU0xFV1BfRFFTQgkJMHgwMDAwMDA4MEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9QUkVBTVBfQUJfTUFTSwkJMHgwMDAwMDEwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9QUkVBTVBfQUIJCTB4MDAwMDAxMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fUFJFQU1QX0RRTUJfTUFTSwkJMHgwMDAwMDIwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9QUkVBTVBfRFFNQgkJMHgwMDAwMDIwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9QUkVBTVBfRFFTQl9NQVNLCQkweDAwMDAwNDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1BSRUFNUF9EUVNCCQkweDAwMDAwNDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX0lPX01PREVCX01BU0sJCTB4MDAwMDMwMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fUkVDX0NLQl9NQVNLCQkweDAwMDBjMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1JFQ19BQl9NQVNLCQkweDAwMDMwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1JFQ19EUU1CX01BU0sJCTB4MDAwYzAwMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fUkVDX0RRU0JfTUFTSwkJMHgwMDMwMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9TWU5DX1BIQVNFQl9NQVNLCQkweDAwNDAwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NZTkNfUEhBU0VCCQkweDAwNDAwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NZTkNfQ0VOVEVSQl9NQVNLCTB4MDA4MDAwMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fU1lOQ19DRU5URVJCCQkweDAwODAwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX1NZTkNfRU5CX01BU0sJCTB4MDMwMDAwMDBMCisjZGVmaW5lIE1DX0NIUF9JT19DTlRMX0IxX19NRU1fQ0xLX1NFTEJfTUFTSwkJMHgwYzAwMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9DTEtfSU5WQl9NQVNLCQkweDEwMDAwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX0NMS19JTlZCCQkJMHgxMDAwMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9EQVRBX0VOSU1QX0JfTUFTSwkweDQwMDAwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX0RBVEFfRU5JTVBfQgkJMHg0MDAwMDAwMEwKKyNkZWZpbmUgTUNfQ0hQX0lPX0NOVExfQjFfX01FTV9DTlRMX0VOSU1QX0JfTUFTSwkweDgwMDAwMDAwTAorI2RlZmluZSBNQ19DSFBfSU9fQ05UTF9CMV9fTUVNX0NOVExfRU5JTVBfQgkJMHg4MDAwMDAwMEwKKworLyogTUVNX1NEUkFNX01PREVfUkVHICovCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX01PREVfUkVHX01BU0sJCTB4MDAwMDdmZmZMCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX1dSX0xBVEVOQ1lfTUFTSwkJMHgwMDBmMDAwMEwKKyNkZWZpbmUgTUVNX1NEUkFNX01PREVfUkVHX19NRU1fQ0FTX0xBVEVOQ1lfTUFTSwkweDAwNzAwMDAwTAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9DTURfTEFURU5DWV9NQVNLCTB4MDA4MDAwMDBMCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX0NNRF9MQVRFTkNZCQkweDAwODAwMDAwTAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9TVFJfTEFURU5DWV9NQVNLCTB4MDEwMDAwMDBMCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX1NUUl9MQVRFTkNZCQkweDAxMDAwMDAwTAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9GQUxMX09VVF9DTURfTUFTSwkweDAyMDAwMDAwTAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9GQUxMX09VVF9DTUQJCTB4MDIwMDAwMDBMCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX0ZBTExfT1VUX0RBVEFfTUFTSwkweDA0MDAwMDAwTAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9GQUxMX09VVF9EQVRBCQkweDA0MDAwMDAwTAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9GQUxMX09VVF9TVFJfTUFTSwkweDA4MDAwMDAwTAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9GQUxMX09VVF9TVFIJCTB4MDgwMDAwMDBMCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUNfSU5JVF9DT01QTEVURV9NQVNLCTB4MTAwMDAwMDBMCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUNfSU5JVF9DT01QTEVURQkJMHgxMDAwMDAwMEwKKyNkZWZpbmUgTUVNX1NEUkFNX01PREVfUkVHX19NRU1fRERSX0RMTF9NQVNLCQkweDIwMDAwMDAwTAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9ERFJfRExMCQkJMHgyMDAwMDAwMEwKKyNkZWZpbmUgTUVNX1NEUkFNX01PREVfUkVHX19NRU1fQ0ZHX1RZUEVfTUFTSwkJMHg0MDAwMDAwMEwKKyNkZWZpbmUgTUVNX1NEUkFNX01PREVfUkVHX19NRU1fQ0ZHX1RZUEUJCTB4NDAwMDAwMDBMCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX1NEUkFNX1JFU0VUX01BU0sJMHg4MDAwMDAwMEwKKyNkZWZpbmUgTUVNX1NEUkFNX01PREVfUkVHX19NRU1fU0RSQU1fUkVTRVQJCTB4ODAwMDAwMDBMCisKKy8qIE1FTV9TRFJBTV9NT0RFX1JFRyAqLworI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9NT0RFX1JFR19fU0hJRlQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUVNX1NEUkFNX01PREVfUkVHX19NRU1fV1JfTEFURU5DWV9fU0hJRlQJMHgwMDAwMDAxMAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9DQVNfTEFURU5DWV9fU0hJRlQJMHgwMDAwMDAxNAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9DTURfTEFURU5DWV9fU0hJRlQJMHgwMDAwMDAxNworI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9TVFJfTEFURU5DWV9fU0hJRlQJMHgwMDAwMDAxOAorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9GQUxMX09VVF9DTURfX1NISUZUCTB4MDAwMDAwMTkKKyNkZWZpbmUgTUVNX1NEUkFNX01PREVfUkVHX19NRU1fRkFMTF9PVVRfREFUQV9fU0hJRlQJMHgwMDAwMDAxYQorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9GQUxMX09VVF9TVFJfX1NISUZUCTB4MDAwMDAwMWIKKyNkZWZpbmUgTUVNX1NEUkFNX01PREVfUkVHX19NQ19JTklUX0NPTVBMRVRFX19TSElGVAkweDAwMDAwMDFjCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX0REUl9ETExfX1NISUZUCQkweDAwMDAwMDFkCisjZGVmaW5lIE1FTV9TRFJBTV9NT0RFX1JFR19fTUVNX0NGR19UWVBFX19TSElGVAkJMHgwMDAwMDAxZQorI2RlZmluZSBNRU1fU0RSQU1fTU9ERV9SRUdfX01FTV9TRFJBTV9SRVNFVF9fU0hJRlQJMHgwMDAwMDAxZgorCisvKiBNRU1fUkVGUkVTSF9DTlRMICovCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX01FTV9SRUZSRVNIX1JBVEVfTUFTSwkJMHgwMDAwMDBmZkwKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fTUVNX1JFRlJFU0hfRElTX01BU0sJCTB4MDAwMDAxMDBMCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX01FTV9SRUZSRVNIX0RJUwkJMHgwMDAwMDEwMEwKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fTUVNX0RZTkFNSUNfQ0tFX01BU0sJCTB4MDAwMDAyMDBMCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX01FTV9EWU5BTUlDX0NLRQkJMHgwMDAwMDIwMEwKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fTUVNX1RSRkNfTUFTSwkJCTB4MDAwMGYwMDBMCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX01FTV9DTEtBMF9FTkFCTEVfTUFTSwkJMHgwMDAxMDAwMEwKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fTUVNX0NMS0EwX0VOQUJMRQkJMHgwMDAxMDAwMEwKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fTUVNX0NMS0EwYl9FTkFCTEVfTUFTSwkweDAwMDIwMDAwTAorI2RlZmluZSBNRU1fUkVGUkVTSF9DTlRMX19NRU1fQ0xLQTBiX0VOQUJMRQkJMHgwMDAyMDAwMEwKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fTUVNX0NMS0ExX0VOQUJMRV9NQVNLCQkweDAwMDQwMDAwTAorI2RlZmluZSBNRU1fUkVGUkVTSF9DTlRMX19NRU1fQ0xLQTFfRU5BQkxFCQkweDAwMDQwMDAwTAorI2RlZmluZSBNRU1fUkVGUkVTSF9DTlRMX19NRU1fQ0xLQTFiX0VOQUJMRV9NQVNLCTB4MDAwODAwMDBMCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX01FTV9DTEtBMWJfRU5BQkxFCQkweDAwMDgwMDAwTAorI2RlZmluZSBNRU1fUkVGUkVTSF9DTlRMX19NRU1fQ0xLQUZCX0VOQUJMRV9NQVNLCTB4MDAxMDAwMDBMCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX01FTV9DTEtBRkJfRU5BQkxFCQkweDAwMTAwMDAwTAorI2RlZmluZSBNRU1fUkVGUkVTSF9DTlRMX19ETExfRkJfU0xDVF9DS0FfTUFTSwkJMHgwMGMwMDAwMEwKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fTUVNX0NMS0IwX0VOQUJMRV9NQVNLCQkweDAxMDAwMDAwTAorI2RlZmluZSBNRU1fUkVGUkVTSF9DTlRMX19NRU1fQ0xLQjBfRU5BQkxFCQkweDAxMDAwMDAwTAorI2RlZmluZSBNRU1fUkVGUkVTSF9DTlRMX19NRU1fQ0xLQjBiX0VOQUJMRV9NQVNLCTB4MDIwMDAwMDBMCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX01FTV9DTEtCMGJfRU5BQkxFCQkweDAyMDAwMDAwTAorI2RlZmluZSBNRU1fUkVGUkVTSF9DTlRMX19NRU1fQ0xLQjFfRU5BQkxFX01BU0sJCTB4MDQwMDAwMDBMCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX01FTV9DTEtCMV9FTkFCTEUJCTB4MDQwMDAwMDBMCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX01FTV9DTEtCMWJfRU5BQkxFX01BU0sJMHgwODAwMDAwMEwKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fTUVNX0NMS0IxYl9FTkFCTEUJCTB4MDgwMDAwMDBMCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX01FTV9DTEtCRkJfRU5BQkxFX01BU0sJMHgxMDAwMDAwMEwKKyNkZWZpbmUgTUVNX1JFRlJFU0hfQ05UTF9fTUVNX0NMS0JGQl9FTkFCTEUJCTB4MTAwMDAwMDBMCisjZGVmaW5lIE1FTV9SRUZSRVNIX0NOVExfX0RMTF9GQl9TTENUX0NLQl9NQVNLCQkweGMwMDAwMDAwTAorCisvKiBNQ19TVEFUVVMgKi8KKyNkZWZpbmUgTUNfU1RBVFVTX19NRU1fUFdSVVBfQ09NUExfQV9NQVNLCQkweDAwMDAwMDAxTAorI2RlZmluZSBNQ19TVEFUVVNfX01FTV9QV1JVUF9DT01QTF9BCQkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgTUNfU1RBVFVTX19NRU1fUFdSVVBfQ09NUExfQl9NQVNLCQkweDAwMDAwMDAyTAorI2RlZmluZSBNQ19TVEFUVVNfX01FTV9QV1JVUF9DT01QTF9CCQkJMHgwMDAwMDAwMkwKKyNkZWZpbmUgTUNfU1RBVFVTX19NQ19JRExFX01BU0sJCQkJMHgwMDAwMDAwNEwKKyNkZWZpbmUgTUNfU1RBVFVTX19NQ19JRExFCQkJCTB4MDAwMDAwMDRMCisjZGVmaW5lIE1DX1NUQVRVU19fSU1QX05fVkFMVUVfUl9CQUNLX01BU0sJCTB4MDAwMDAwNzhMCisjZGVmaW5lIE1DX1NUQVRVU19fSU1QX1BfVkFMVUVfUl9CQUNLX01BU0sJCTB4MDAwMDA3ODBMCisjZGVmaW5lIE1DX1NUQVRVU19fVEVTVF9PVVRfUl9CQUNLX01BU0sJCQkweDAwMDAwODAwTAorI2RlZmluZSBNQ19TVEFUVVNfX1RFU1RfT1VUX1JfQkFDSwkJCTB4MDAwMDA4MDBMCisjZGVmaW5lIE1DX1NUQVRVU19fRFVNTVlfT1VUX1JfQkFDS19NQVNLCQkweDAwMDAxMDAwTAorI2RlZmluZSBNQ19TVEFUVVNfX0RVTU1ZX09VVF9SX0JBQ0sJCQkweDAwMDAxMDAwTAorI2RlZmluZSBNQ19TVEFUVVNfX0lNUF9OX1ZBTFVFX0FfUl9CQUNLX01BU0sJCTB4MDAwMWUwMDBMCisjZGVmaW5lIE1DX1NUQVRVU19fSU1QX1BfVkFMVUVfQV9SX0JBQ0tfTUFTSwkJMHgwMDFlMDAwMEwKKyNkZWZpbmUgTUNfU1RBVFVTX19JTVBfTl9WQUxVRV9DS19SX0JBQ0tfTUFTSwkJMHgwMWUwMDAwMEwKKyNkZWZpbmUgTUNfU1RBVFVTX19JTVBfUF9WQUxVRV9DS19SX0JBQ0tfTUFTSwkJMHgxZTAwMDAwMEwKKworLyogTURMTF9DS08gKi8KKyNkZWZpbmUgTURMTF9DS09fX01DS09BX1NMRUVQX01BU0sJCQkweDAwMDAwMDAxTAorI2RlZmluZSBNRExMX0NLT19fTUNLT0FfU0xFRVAJCQkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgTURMTF9DS09fX01DS09BX1JFU0VUX01BU0sJCQkweDAwMDAwMDAyTAorI2RlZmluZSBNRExMX0NLT19fTUNLT0FfUkVTRVQJCQkJMHgwMDAwMDAwMkwKKyNkZWZpbmUgTURMTF9DS09fX01DS09BX1JBTkdFX01BU0sJCQkweDAwMDAwMDBjTAorI2RlZmluZSBNRExMX0NLT19fRVJTVEFfU09VVFNFTF9NQVNLCQkJMHgwMDAwMDAzMEwKKyNkZWZpbmUgTURMTF9DS09fX01DS09BX0ZCX1NFTF9NQVNLCQkJMHgwMDAwMDBjMEwKKyNkZWZpbmUgTURMTF9DS09fX01DS09BX1JFRl9TS0VXX01BU0sJCQkweDAwMDAwNzAwTAorI2RlZmluZSBNRExMX0NLT19fTUNLT0FfRkJfU0tFV19NQVNLCQkJMHgwMDAwNzAwMEwKKyNkZWZpbmUgTURMTF9DS09fX01DS09BX0JQX1NFTF9NQVNLCQkJMHgwMDAwODAwMEwKKyNkZWZpbmUgTURMTF9DS09fX01DS09BX0JQX1NFTAkJCQkweDAwMDA4MDAwTAorI2RlZmluZSBNRExMX0NLT19fTUNLT0JfU0xFRVBfTUFTSwkJCTB4MDAwMTAwMDBMCisjZGVmaW5lIE1ETExfQ0tPX19NQ0tPQl9TTEVFUAkJCQkweDAwMDEwMDAwTAorI2RlZmluZSBNRExMX0NLT19fTUNLT0JfUkVTRVRfTUFTSwkJCTB4MDAwMjAwMDBMCisjZGVmaW5lIE1ETExfQ0tPX19NQ0tPQl9SRVNFVAkJCQkweDAwMDIwMDAwTAorI2RlZmluZSBNRExMX0NLT19fTUNLT0JfUkFOR0VfTUFTSwkJCTB4MDAwYzAwMDBMCisjZGVmaW5lIE1ETExfQ0tPX19FUlNUQl9TT1VUU0VMX01BU0sJCQkweDAwMzAwMDAwTAorI2RlZmluZSBNRExMX0NLT19fTUNLT0JfRkJfU0VMX01BU0sJCQkweDAwYzAwMDAwTAorI2RlZmluZSBNRExMX0NLT19fTUNLT0JfUkVGX1NLRVdfTUFTSwkJCTB4MDcwMDAwMDBMCisjZGVmaW5lIE1ETExfQ0tPX19NQ0tPQl9GQl9TS0VXX01BU0sJCQkweDcwMDAwMDAwTAorI2RlZmluZSBNRExMX0NLT19fTUNLT0JfQlBfU0VMX01BU0sJCQkweDgwMDAwMDAwTAorI2RlZmluZSBNRExMX0NLT19fTUNLT0JfQlBfU0VMCQkJCTB4ODAwMDAwMDBMCisKKy8qIE1ETExfUkRDS0EgKi8KKyNkZWZpbmUgTURMTF9SRENLQV9fTVJEQ0tBMF9TTEVFUF9NQVNLCQkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgTURMTF9SRENLQV9fTVJEQ0tBMF9TTEVFUAkJCTB4MDAwMDAwMDFMCisjZGVmaW5lIE1ETExfUkRDS0FfX01SRENLQTBfUkVTRVRfTUFTSwkJCTB4MDAwMDAwMDJMCisjZGVmaW5lIE1ETExfUkRDS0FfX01SRENLQTBfUkVTRVQJCQkweDAwMDAwMDAyTAorI2RlZmluZSBNRExMX1JEQ0tBX19NUkRDS0EwX1JBTkdFX01BU0sJCQkweDAwMDAwMDBjTAorI2RlZmluZSBNRExMX1JEQ0tBX19NUkRDS0EwX1JFRl9TRUxfTUFTSwkJMHgwMDAwMDAzMEwKKyNkZWZpbmUgTURMTF9SRENLQV9fTVJEQ0tBMF9GQl9TRUxfTUFTSwkJCTB4MDAwMDAwYzBMCisjZGVmaW5lIE1ETExfUkRDS0FfX01SRENLQTBfUkVGX1NLRVdfTUFTSwkJMHgwMDAwMDcwMEwKKyNkZWZpbmUgTURMTF9SRENLQV9fTVJEQ0tBMF9TSU5TRUxfTUFTSwkJCTB4MDAwMDA4MDBMCisjZGVmaW5lIE1ETExfUkRDS0FfX01SRENLQTBfU0lOU0VMCQkJMHgwMDAwMDgwMEwKKyNkZWZpbmUgTURMTF9SRENLQV9fTVJEQ0tBMF9GQl9TS0VXX01BU0sJCTB4MDAwMDcwMDBMCisjZGVmaW5lIE1ETExfUkRDS0FfX01SRENLQTBfQlBfU0VMX01BU0sJCQkweDAwMDA4MDAwTAorI2RlZmluZSBNRExMX1JEQ0tBX19NUkRDS0EwX0JQX1NFTAkJCTB4MDAwMDgwMDBMCisjZGVmaW5lIE1ETExfUkRDS0FfX01SRENLQTFfU0xFRVBfTUFTSwkJCTB4MDAwMTAwMDBMCisjZGVmaW5lIE1ETExfUkRDS0FfX01SRENLQTFfU0xFRVAJCQkweDAwMDEwMDAwTAorI2RlZmluZSBNRExMX1JEQ0tBX19NUkRDS0ExX1JFU0VUX01BU0sJCQkweDAwMDIwMDAwTAorI2RlZmluZSBNRExMX1JEQ0tBX19NUkRDS0ExX1JFU0VUCQkJMHgwMDAyMDAwMEwKKyNkZWZpbmUgTURMTF9SRENLQV9fTVJEQ0tBMV9SQU5HRV9NQVNLCQkJMHgwMDBjMDAwMEwKKyNkZWZpbmUgTURMTF9SRENLQV9fTVJEQ0tBMV9SRUZfU0VMX01BU0sJCTB4MDAzMDAwMDBMCisjZGVmaW5lIE1ETExfUkRDS0FfX01SRENLQTFfRkJfU0VMX01BU0sJCQkweDAwYzAwMDAwTAorI2RlZmluZSBNRExMX1JEQ0tBX19NUkRDS0ExX1JFRl9TS0VXX01BU0sJCTB4MDcwMDAwMDBMCisjZGVmaW5lIE1ETExfUkRDS0FfX01SRENLQTFfU0lOU0VMX01BU0sJCQkweDA4MDAwMDAwTAorI2RlZmluZSBNRExMX1JEQ0tBX19NUkRDS0ExX1NJTlNFTAkJCTB4MDgwMDAwMDBMCisjZGVmaW5lIE1ETExfUkRDS0FfX01SRENLQTFfRkJfU0tFV19NQVNLCQkweDcwMDAwMDAwTAorI2RlZmluZSBNRExMX1JEQ0tBX19NUkRDS0ExX0JQX1NFTF9NQVNLCQkJMHg4MDAwMDAwMEwKKyNkZWZpbmUgTURMTF9SRENLQV9fTVJEQ0tBMV9CUF9TRUwJCQkweDgwMDAwMDAwTAorCisvKiBNRExMX1JEQ0tCICovCisjZGVmaW5lIE1ETExfUkRDS0JfX01SRENLQjBfU0xFRVBfTUFTSwkJCTB4MDAwMDAwMDFMCisjZGVmaW5lIE1ETExfUkRDS0JfX01SRENLQjBfU0xFRVAJCQkweDAwMDAwMDAxTAorI2RlZmluZSBNRExMX1JEQ0tCX19NUkRDS0IwX1JFU0VUX01BU0sJCQkweDAwMDAwMDAyTAorI2RlZmluZSBNRExMX1JEQ0tCX19NUkRDS0IwX1JFU0VUCQkJMHgwMDAwMDAwMkwKKyNkZWZpbmUgTURMTF9SRENLQl9fTVJEQ0tCMF9SQU5HRV9NQVNLCQkJMHgwMDAwMDAwY0wKKyNkZWZpbmUgTURMTF9SRENLQl9fTVJEQ0tCMF9SRUZfU0VMX01BU0sJCTB4MDAwMDAwMzBMCisjZGVmaW5lIE1ETExfUkRDS0JfX01SRENLQjBfRkJfU0VMX01BU0sJCQkweDAwMDAwMGMwTAorI2RlZmluZSBNRExMX1JEQ0tCX19NUkRDS0IwX1JFRl9TS0VXX01BU0sJCTB4MDAwMDA3MDBMCisjZGVmaW5lIE1ETExfUkRDS0JfX01SRENLQjBfU0lOU0VMX01BU0sJCQkweDAwMDAwODAwTAorI2RlZmluZSBNRExMX1JEQ0tCX19NUkRDS0IwX1NJTlNFTAkJCTB4MDAwMDA4MDBMCisjZGVmaW5lIE1ETExfUkRDS0JfX01SRENLQjBfRkJfU0tFV19NQVNLCQkweDAwMDA3MDAwTAorI2RlZmluZSBNRExMX1JEQ0tCX19NUkRDS0IwX0JQX1NFTF9NQVNLCQkJMHgwMDAwODAwMEwKKyNkZWZpbmUgTURMTF9SRENLQl9fTVJEQ0tCMF9CUF9TRUwJCQkweDAwMDA4MDAwTAorI2RlZmluZSBNRExMX1JEQ0tCX19NUkRDS0IxX1NMRUVQX01BU0sJCQkweDAwMDEwMDAwTAorI2RlZmluZSBNRExMX1JEQ0tCX19NUkRDS0IxX1NMRUVQCQkJMHgwMDAxMDAwMEwKKyNkZWZpbmUgTURMTF9SRENLQl9fTVJEQ0tCMV9SRVNFVF9NQVNLCQkJMHgwMDAyMDAwMEwKKyNkZWZpbmUgTURMTF9SRENLQl9fTVJEQ0tCMV9SRVNFVAkJCTB4MDAwMjAwMDBMCisjZGVmaW5lIE1ETExfUkRDS0JfX01SRENLQjFfUkFOR0VfTUFTSwkJCTB4MDAwYzAwMDBMCisjZGVmaW5lIE1ETExfUkRDS0JfX01SRENLQjFfUkVGX1NFTF9NQVNLCQkweDAwMzAwMDAwTAorI2RlZmluZSBNRExMX1JEQ0tCX19NUkRDS0IxX0ZCX1NFTF9NQVNLCQkJMHgwMGMwMDAwMEwKKyNkZWZpbmUgTURMTF9SRENLQl9fTVJEQ0tCMV9SRUZfU0tFV19NQVNLCQkweDA3MDAwMDAwTAorI2RlZmluZSBNRExMX1JEQ0tCX19NUkRDS0IxX1NJTlNFTF9NQVNLCQkJMHgwODAwMDAwMEwKKyNkZWZpbmUgTURMTF9SRENLQl9fTVJEQ0tCMV9TSU5TRUwJCQkweDA4MDAwMDAwTAorI2RlZmluZSBNRExMX1JEQ0tCX19NUkRDS0IxX0ZCX1NLRVdfTUFTSwkJMHg3MDAwMDAwMEwKKyNkZWZpbmUgTURMTF9SRENLQl9fTVJEQ0tCMV9CUF9TRUxfTUFTSwkJCTB4ODAwMDAwMDBMCisjZGVmaW5lIE1ETExfUkRDS0JfX01SRENLQjFfQlBfU0VMCQkJMHg4MDAwMDAwMEwKKworI2RlZmluZSBNRExMX1IzMDBfUkRDS19fTVJEQ0tBX1NMRUVQCQkJMHgwMDAwMDAwMUwKKyNkZWZpbmUgTURMTF9SMzAwX1JEQ0tfX01SRENLQV9SRVNFVAkJCTB4MDAwMDAwMDJMCisjZGVmaW5lIE1ETExfUjMwMF9SRENLX19NUkRDS0JfU0xFRVAJCQkweDAwMDAwMDA0TAorI2RlZmluZSBNRExMX1IzMDBfUkRDS19fTVJEQ0tCX1JFU0VUCQkJMHgwMDAwMDAwOEwKKyNkZWZpbmUgTURMTF9SMzAwX1JEQ0tfX01SRENLQ19TTEVFUAkJCTB4MDAwMDAwMTBMCisjZGVmaW5lIE1ETExfUjMwMF9SRENLX19NUkRDS0NfUkVTRVQJCQkweDAwMDAwMDIwTAorI2RlZmluZSBNRExMX1IzMDBfUkRDS19fTVJEQ0tEX1NMRUVQCQkJMHgwMDAwMDA0MEwKKyNkZWZpbmUgTURMTF9SMzAwX1JEQ0tfX01SRENLRF9SRVNFVAkJCTB4MDAwMDAwODBMCisKKyNkZWZpbmUgcGxsQ0xLX1BJTl9DTlRMCQkJCTB4MDAwMQorI2RlZmluZSBwbGxQUExMX0NOVEwJCQkJMHgwMDAyCisjZGVmaW5lIHBsbFBQTExfUkVGX0RJVgkJCQkweDAwMDMKKyNkZWZpbmUgcGxsUFBMTF9ESVZfMAkJCQkweDAwMDQKKyNkZWZpbmUgcGxsUFBMTF9ESVZfMQkJCQkweDAwMDUKKyNkZWZpbmUgcGxsUFBMTF9ESVZfMgkJCQkweDAwMDYKKyNkZWZpbmUgcGxsUFBMTF9ESVZfMwkJCQkweDAwMDcKKyNkZWZpbmUgcGxsVkNMS19FQ1BfQ05UTAkJCTB4MDAwOAorI2RlZmluZSBwbGxIVE9UQUxfQ05UTAkJCQkweDAwMDkKKyNkZWZpbmUgcGxsTV9TUExMX1JFRl9GQl9ESVYJCQkweDAwMEEKKyNkZWZpbmUgcGxsQUdQX1BMTF9DTlRMCQkJCTB4MDAwQgorI2RlZmluZSBwbGxTUExMX0NOVEwJCQkJMHgwMDBDCisjZGVmaW5lIHBsbFNDTEtfQ05UTAkJCQkweDAwMEQKKyNkZWZpbmUgcGxsTVBMTF9DTlRMCQkJCTB4MDAwRQorI2RlZmluZSBwbGxNRExMX0NLTwkJCQkweDAwMEYKKyNkZWZpbmUgcGxsTURMTF9SRENLQQkJCQkweDAwMTAKKyNkZWZpbmUgcGxsTURMTF9SRENLQgkJCQkweDAwMTEKKyNkZWZpbmUgcGxsTUNMS19DTlRMCQkJCTB4MDAxMgorI2RlZmluZSBwbGxQTExfVEVTVF9DTlRMCQkJMHgwMDEzCisjZGVmaW5lIHBsbENMS19QV1JNR1RfQ05UTAkJCTB4MDAxNAorI2RlZmluZSBwbGxQTExfUFdSTUdUX0NOVEwJCQkweDAwMTUKKyNkZWZpbmUgcGxsQ0dfVEVTVF9NQUNST19SV19XUklURQkJMHgwMDE2CisjZGVmaW5lIHBsbENHX1RFU1RfTUFDUk9fUldfUkVBRAkJMHgwMDE3CisjZGVmaW5lIHBsbENHX1RFU1RfTUFDUk9fUldfREFUQQkJMHgwMDE4CisjZGVmaW5lIHBsbENHX1RFU1RfTUFDUk9fUldfQ05UTAkJMHgwMDE5CisjZGVmaW5lIHBsbERJU1BfVEVTVF9NQUNST19SV19XUklURQkJMHgwMDFBCisjZGVmaW5lIHBsbERJU1BfVEVTVF9NQUNST19SV19SRUFECQkweDAwMUIKKyNkZWZpbmUgcGxsRElTUF9URVNUX01BQ1JPX1JXX0RBVEEJCTB4MDAxQworI2RlZmluZSBwbGxESVNQX1RFU1RfTUFDUk9fUldfQ05UTAkJMHgwMDFECisjZGVmaW5lIHBsbFNDTEtfQ05UTDIJCQkJMHgwMDFFCisjZGVmaW5lIHBsbE1DTEtfTUlTQwkJCQkweDAwMUYKKyNkZWZpbmUgcGxsVFZfUExMX0ZJTkVfQ05UTAkJCTB4MDAyMAorI2RlZmluZSBwbGxUVl9QTExfQ05UTAkJCQkweDAwMjEKKyNkZWZpbmUgcGxsVFZfUExMX0NOVEwxCQkJCTB4MDAyMgorI2RlZmluZSBwbGxUVl9EVE9fSU5DUkVNRU5UUwkJCTB4MDAyMworI2RlZmluZSBwbGxTUExMX0FVWF9DTlRMCQkJMHgwMDI0CisjZGVmaW5lIHBsbE1QTExfQVVYX0NOVEwJCQkweDAwMjUKKyNkZWZpbmUgcGxsUDJQTExfQ05UTAkJCQkweDAwMkEKKyNkZWZpbmUgcGxsUDJQTExfUkVGX0RJVgkJCTB4MDAyQgorI2RlZmluZSBwbGxQMlBMTF9ESVZfMAkJCQkweDAwMkMKKyNkZWZpbmUgcGxsUElYQ0xLU19DTlRMCQkJCTB4MDAyRAorI2RlZmluZSBwbGxIVE9UQUwyX0NOVEwJCQkJMHgwMDJFCisjZGVmaW5lIHBsbFNTUExMX0NOVEwJCQkJMHgwMDMwCisjZGVmaW5lIHBsbFNTUExMX1JFRl9ESVYJCQkweDAwMzEKKyNkZWZpbmUgcGxsU1NQTExfRElWXzAJCQkJMHgwMDMyCisjZGVmaW5lIHBsbFNTX0lOVF9DTlRMCQkJCTB4MDAzMworI2RlZmluZSBwbGxTU19UU1RfQ05UTAkJCQkweDAwMzQKKyNkZWZpbmUgcGxsU0NMS19NT1JFX0NOVEwJCQkweDAwMzUKKworI2RlZmluZSBpeE1DX1BFUkZfQ05UTAkJCQkweDAwMDAKKyNkZWZpbmUgaXhNQ19QRVJGX1NFTAkJCQkweDAwMDEKKyNkZWZpbmUgaXhNQ19QRVJGX1JFR0lPTl8wCQkJMHgwMDAyCisjZGVmaW5lIGl4TUNfUEVSRl9SRUdJT05fMQkJCTB4MDAwMworI2RlZmluZSBpeE1DX1BFUkZfQ09VTlRfMAkJCTB4MDAwNAorI2RlZmluZSBpeE1DX1BFUkZfQ09VTlRfMQkJCTB4MDAwNQorI2RlZmluZSBpeE1DX1BFUkZfQ09VTlRfMgkJCTB4MDAwNgorI2RlZmluZSBpeE1DX1BFUkZfQ09VTlRfMwkJCTB4MDAwNworI2RlZmluZSBpeE1DX1BFUkZfQ09VTlRfTUVNQ0hfQQkJCTB4MDAwOAorI2RlZmluZSBpeE1DX1BFUkZfQ09VTlRfTUVNQ0hfQgkJCTB4MDAwOQorI2RlZmluZSBpeE1DX0lNUF9DTlRMCQkJCTB4MDAwQQorI2RlZmluZSBpeE1DX0NIUF9JT19DTlRMX0EwCQkJMHgwMDBCCisjZGVmaW5lIGl4TUNfQ0hQX0lPX0NOVExfQTEJCQkweDAwMEMKKyNkZWZpbmUgaXhNQ19DSFBfSU9fQ05UTF9CMAkJCTB4MDAwRAorI2RlZmluZSBpeE1DX0NIUF9JT19DTlRMX0IxCQkJMHgwMDBFCisjZGVmaW5lIGl4TUNfSU1QX0NOVExfMAkJCQkweDAwMEYKKyNkZWZpbmUgaXhUQ19NSVNNQVRDSF8xCQkJCTB4MDAxMAorI2RlZmluZSBpeFRDX01JU01BVENIXzIJCQkJMHgwMDExCisjZGVmaW5lIGl4TUNfQklTVF9DVFJMCQkJCTB4MDAxMgorI2RlZmluZSBpeFJFR19DT0xMQVJfV1JJVEUJCQkweDAwMTMKKyNkZWZpbmUgaXhSRUdfQ09MTEFSX1JFQUQJCQkweDAwMTQKKyNkZWZpbmUgaXhSMzAwX01DX0lNUF9DTlRMCQkJMHgwMDE4CisjZGVmaW5lIGl4UjMwMF9NQ19DSFBfSU9fQ05UTF9BMAkJMHgwMDE5CisjZGVmaW5lIGl4UjMwMF9NQ19DSFBfSU9fQ05UTF9BMQkJMHgwMDFhCisjZGVmaW5lIGl4UjMwMF9NQ19DSFBfSU9fQ05UTF9CMAkJMHgwMDFiCisjZGVmaW5lIGl4UjMwMF9NQ19DSFBfSU9fQ05UTF9CMQkJMHgwMDFjCisjZGVmaW5lIGl4UjMwMF9NQ19DSFBfSU9fQ05UTF9DMAkJMHgwMDFkCisjZGVmaW5lIGl4UjMwMF9NQ19DSFBfSU9fQ05UTF9DMQkJMHgwMDFlCisjZGVmaW5lIGl4UjMwMF9NQ19DSFBfSU9fQ05UTF9EMAkJMHgwMDFmCisjZGVmaW5lIGl4UjMwMF9NQ19DSFBfSU9fQ05UTF9EMQkJMHgwMDIwCisjZGVmaW5lIGl4UjMwMF9NQ19JTVBfQ05UTF8wCQkJMHgwMDIxCisjZGVmaW5lIGl4UjMwMF9NQ19FTFBJREFfQ05UTAkJCTB4MDAyMgorI2RlZmluZSBpeFIzMDBfTUNfQ0hQX0lPX09FX0NOVExfQ0QJCTB4MDAyMworI2RlZmluZSBpeFIzMDBfTUNfUkVBRF9DTlRMX0NECQkJMHgwMDI0CisjZGVmaW5lIGl4UjMwMF9NQ19NQ19JTklUX1dSX0xBVF9USU1FUgkJMHgwMDI1CisjZGVmaW5lIGl4UjMwMF9NQ19ERUJVR19DTlRMCQkJMHgwMDI2CisjZGVmaW5lIGl4UjMwMF9NQ19CSVNUX0NOVExfMAkJCTB4MDAyOAorI2RlZmluZSBpeFIzMDBfTUNfQklTVF9DTlRMXzEJCQkweDAwMjkKKyNkZWZpbmUgaXhSMzAwX01DX0JJU1RfQ05UTF8yCQkJMHgwMDJhCisjZGVmaW5lIGl4UjMwMF9NQ19CSVNUX0NOVExfMwkJCTB4MDAyYgorI2RlZmluZSBpeFIzMDBfTUNfQklTVF9DTlRMXzQJCQkweDAwMmMKKyNkZWZpbmUgaXhSMzAwX01DX0JJU1RfQ05UTF81CQkJMHgwMDJkCisjZGVmaW5lIGl4UjMwMF9NQ19JTVBfU1RBVFVTCQkJMHgwMDJlCisjZGVmaW5lIGl4UjMwMF9NQ19ETExfQ05UTAkJCTB4MDAyZgorI2RlZmluZSBOQl9UT00JCQkJCTB4MTVDCisKKyNlbmRpZgkvKiBfUkFERU9OX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2F0YS5oIGIvaW5jbHVkZS9zYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY1YjQ3MQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc2F0YS5oCkBAIC0wLDAgKzEsMTA4IEBACisKKyNpZiAoREVCVUdfU0FUQSkKKyNkZWZpbmUgUFJJTlRGKGZtdCxhcmdzLi4uKQlwcmludGYgKGZtdCAsIyNhcmdzKQorI2Vsc2UKKyNkZWZpbmUgUFJJTlRGKGZtdCxhcmdzLi4uKQorI2VuZGlmCisKK3N0cnVjdCBzYXRhX2lvcG9ydHMgeworCXVuc2lnbmVkIGxvbmcgY21kX2FkZHI7CisJdW5zaWduZWQgbG9uZyBkYXRhX2FkZHI7CisJdW5zaWduZWQgbG9uZyBlcnJvcl9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmVhdHVyZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgbnNlY3RfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGxiYWxfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGxiYW1fYWRkcjsKKwl1bnNpZ25lZCBsb25nIGxiYWhfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGRldmljZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzX2FkZHI7CisJdW5zaWduZWQgbG9uZyBjb21tYW5kX2FkZHI7CisJdW5zaWduZWQgbG9uZyBhbHRzdGF0dXNfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGN0bF9hZGRyOworCXVuc2lnbmVkIGxvbmcgYm1kbWFfYWRkcjsKKwl1bnNpZ25lZCBsb25nIHNjcl9hZGRyOworfTsKKworc3RydWN0IHNhdGFfcG9ydCB7CisJdW5zaWduZWQgY2hhciBwb3J0X25vOwkJLyogcHJpbWFyeT0wLCBzZWNvbmRhcnk9MQkqLworCXN0cnVjdCBzYXRhX2lvcG9ydHMgaW9hZGRyOwkvKiBBVEEgY21kL2N0bC9kbWEgcmVnIGJsa3MJKi8KKwl1bnNpZ25lZCBjaGFyIGN0bF9yZWc7CisJdW5zaWduZWQgY2hhciBsYXN0X2N0bDsKKwl1bnNpZ25lZCBjaGFyIHBvcnRfc3RhdGU7CS8qIDEtcG9ydCBpcyBhdmFpbGFibGUgYW5kCSovCisJCQkJCS8qIDAtcG9ydCBpcyBub3QgYXZhaWxhYmxlCSovCisJdW5zaWduZWQgY2hhciBkZXZfbWFzazsKK307CisKKy8qKioqKioqKioqKlNBVEEgTElCUkFSWSBTUEVDSUZJQyBERUZJTklUSU9OUyBBTkQgREVDTEFSQVRJT05TKioqKioqKioqKioqKiovCisjaWZkZWYgU0FUQV9ERUNMCQkvKlNBVEEgbGlicmFyeSBzcGVjaWZpYyBkZWNsYXJhdGlvbnMgKi8KKyNkZWZpbmUgYXRhX2lkX2hhc19sYmE0OChpZCkgICAgKChpZClbODNdICYgKDEgPDwgMTApKQorI2RlZmluZSBhdGFfaWRfaGFzX2xiYShpZCkgICAgICAoKGlkKVs0OV0gJiAoMSA8PCA5KSkKKyNkZWZpbmUgYXRhX2lkX2hhc19kbWEoaWQpICAgICAgKChpZClbNDldICYgKDEgPDwgOCkpCisjZGVmaW5lIGF0YV9pZF91MzIoaWQsbikgICAgICAgIFwKKwkoKCh1MzIpIChpZClbKG4pICsgMV0gPDwgMTYpIHwgKCh1MzIpIChpZClbKG4pXSkpCisjZGVmaW5lIGF0YV9pZF91NjQoaWQsbikgICAgICAgIFwKKwkoKCh1NjQpIChpZClbKG4pICsgM10gPDwgNDgpIHwgXAorCSgodTY0KSAoaWQpWyhuKSArIDJdIDw8IDMyKSB8IFwKKwkoKHU2NCkgKGlkKVsobikgKyAxXSA8PCAxNikgfCBcCisJKCh1NjQpIChpZClbKG4pICsgMF0pICkKKyNlbmRpZgorCisjaWZkZWYgU0FUQV9ERUNMCQkvKlNBVEEgbGlicmFyeSBzcGVjaWZpYyBkZWNsYXJhdGlvbnMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorYXRhX2R1bXBfaWQgKHUxNiAqIGlkKQoreworCVBSSU5URiAoIjQ5PT0weCUwNHggICIKKwkJIjUzPT0weCUwNHggICIKKwkJIjYzPT0weCUwNHggICIKKwkJIjY0PT0weCUwNHggICIKKwkJIjc1PT0weCUwNHggIFxuIiwgaWRbNDldLCBpZFs1M10sIGlkWzYzXSwgaWRbNjRdLCBpZFs3NV0pOworCVBSSU5URiAoIjgwPT0weCUwNHggICIKKwkJIjgxPT0weCUwNHggICIKKwkJIjgyPT0weCUwNHggICIKKwkJIjgzPT0weCUwNHggICIKKwkJIjg0PT0weCUwNHggIFxuIiwgaWRbODBdLCBpZFs4MV0sIGlkWzgyXSwgaWRbODNdLCBpZFs4NF0pOworCVBSSU5URiAoIjg4PT0weCUwNHggICIgIjkzPT0weCUwNHhcbiIsIGlkWzg4XSwgaWRbOTNdKTsKK30KKyNlbmRpZgorCisjaWZkZWYgU0FUQV9ERUNMCQkvKlNBVEEgbGlicmFyeSBzcGVjaWZpYyBkZWNsYXJhdGlvbnMgKi8KK2ludCBzYXRhX2J1c19zb2Z0cmVzZXQgKGludCBudW0pOwordm9pZCBzYXRhX2lkZW50aWZ5IChpbnQgbnVtLCBpbnQgZGV2KTsKK3ZvaWQgc2F0YV9wb3J0IChzdHJ1Y3Qgc2F0YV9pb3BvcnRzICppb3BvcnQpOwordm9pZCBzZXRfRmVhdHVyZV9jbWQgKGludCBudW0sIGludCBkZXYpOworaW50IHNhdGFfZGV2Y2hrIChzdHJ1Y3Qgc2F0YV9pb3BvcnRzICppb2FkZHIsIGludCBkZXYpOwordm9pZCBkZXZfc2VsZWN0IChzdHJ1Y3Qgc2F0YV9pb3BvcnRzICppb2FkZHIsIGludCBkZXYpOwordTggc2F0YV9idXN5X3dhaXQgKHN0cnVjdCBzYXRhX2lvcG9ydHMgKmlvYWRkciwgaW50IGJpdHMsIHVuc2lnbmVkIGludCBtYXgpOwordTggc2F0YV9jaGtfc3RhdHVzIChzdHJ1Y3Qgc2F0YV9pb3BvcnRzICppb2FkZHIpOwordWxvbmcgc2F0YV9yZWFkIChpbnQgZGV2aWNlLCB1bG9uZyBibGtucixsYmFpbnRfdCBibGtjbnQsIHZvaWQgKiBidWZmZXIpOwordWxvbmcgc2F0YV93cml0ZSAoaW50IGRldmljZSx1bG9uZyBibGtuciwgbGJhaW50X3QgYmxrY250LCB2b2lkICogYnVmZmVyKTsKK3ZvaWQgbXNsZWVwIChpbnQgY291bnQpOworI2Vsc2UKK2V4dGVybiBpbnQgc2F0YV9idXNfc29mdHJlc2V0IChpbnQgbnVtKTsKK2V4dGVybiB2b2lkIHNhdGFfaWRlbnRpZnkgKGludCBudW0sIGludCBkZXYpOworZXh0ZXJuIHZvaWQgc2F0YV9wb3J0IChzdHJ1Y3Qgc2F0YV9pb3BvcnRzICppb3BvcnQpOworZXh0ZXJuIHZvaWQgc2V0X0ZlYXR1cmVfY21kIChpbnQgbnVtLCBpbnQgZGV2KTsKK2V4dGVybiB1bG9uZyBzYXRhX3JlYWQgKGludCBkZXZpY2UsIHVsb25nIGJsa25yLAorCQkJbGJhaW50X3QgYmxrY250LCB2b2lkICogYnVmZmVyKTsKK2V4dGVybiB1bG9uZyBzYXRhX3dyaXRlIChpbnQgZGV2aWNlLCB1bG9uZyBibGtuciwKKwkJCWxiYWludF90IGJsa2NudCwgdm9pZCAqIGJ1ZmZlcik7CitleHRlcm4gdm9pZCBtc2xlZXAgKGludCBjb3VudCk7CisjZW5kaWYKKworLyoqKioqKioqKioqKkRSSVZFUiBTUEVDSUZJQyBERUZJTklUSU9OUyBBTkQgREVDTEFSQVRJT05TKioqKioqKioqKioqKiovCisKKyNpZmRlZiBEUlZfREVDTAkJCS8qRHJpdmVyIHNwZWNpZmljIGRlY2xhcmF0aW9uICovCitpbnQgaW5pdF9zYXRhICh2b2lkKTsKKyNlbHNlCitleHRlcm4gaW50IGluaXRfc2F0YSAodm9pZCk7CisjZW5kaWYKKworI2lmZGVmIERSVl9ERUNMCQkJLypEZWZpbmVzIERyaXZlciBTcGVjaWZpYyB2YXJpYWJsZXMgKi8KK3N0cnVjdCBzYXRhX3BvcnQgcG9ydFtDRkdfU0FUQV9NQVhCVVNdOworYmxvY2tfZGV2X2Rlc2NfdCBzYXRhX2Rldl9kZXNjW0NGR19TQVRBX01BWERFVklDRVNdOworaW50IGN1cnJfZGV2ID0gLTE7CisjZWxzZQorZXh0ZXJuIHN0cnVjdCBzYXRhX3BvcnQgcG9ydFtDRkdfU0FUQV9NQVhCVVNdOworZXh0ZXJuIGJsb2NrX2Rldl9kZXNjX3Qgc2F0YV9kZXZfZGVzY1tDRkdfU0FUQV9NQVhERVZJQ0VTXTsKK2V4dGVybiBpbnQgY3Vycl9kZXY7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2hhMS5oIGIvaW5jbHVkZS9zaGExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlYTEzYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc2hhMS5oCkBAIC0wLDAgKzEsMTE1IEBACisvKioKKyAqIFxmaWxlIHNoYTEuaAorICogYmFzZWQgZnJvbSBodHRwOi8veHlzc2wub3JnL2NvZGUvc291cmNlL3NoYTEvCisgKiAgRklQUy0xODAtMSBjb21wbGlhbnQgU0hBLTEgaW1wbGVtZW50YXRpb24KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDYgIENocmlzdG9waGUgRGV2aW5lCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSwgdmVyc2lvbiAyLjEgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwKKyAqICBNQQkwMjExMC0xMzAxICBVU0EKKyAqLworLyoKKyAqICBUaGUgU0hBLTEgc3RhbmRhcmQgd2FzIHB1Ymxpc2hlZCBieSBOSVNUIGluIDE5OTMuCisgKgorICogIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2ZpcHNwdWJzL2ZpcDE4MC0xLmh0bQorICovCisjaWZuZGVmIF9TSEExX0gKKyNkZWZpbmUgX1NIQTFfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgU0hBMV9TVU1fUE9TCS0weDIwCisjZGVmaW5lIFNIQTFfU1VNX0xFTgkyMAorCisvKioKKyAqIFxicmllZgkgICBTSEEtMSBjb250ZXh0IHN0cnVjdHVyZQorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVuc2lnbmVkIGxvbmcgdG90YWxbMl07CS8qITwgbnVtYmVyIG9mIGJ5dGVzIHByb2Nlc3NlZAkqLworICAgIHVuc2lnbmVkIGxvbmcgc3RhdGVbNV07CS8qITwgaW50ZXJtZWRpYXRlIGRpZ2VzdCBzdGF0ZQkqLworICAgIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzY0XTsJLyohPCBkYXRhIGJsb2NrIGJlaW5nIHByb2Nlc3NlZCAqLworfQorc2hhMV9jb250ZXh0OworCisvKioKKyAqIFxicmllZgkgICBTSEEtMSBjb250ZXh0IHNldHVwCisgKgorICogXHBhcmFtIGN0eAkgICBTSEEtMSBjb250ZXh0IHRvIGJlIGluaXRpYWxpemVkCisgKi8KK3ZvaWQgc2hhMV9zdGFydHMoIHNoYTFfY29udGV4dCAqY3R4ICk7CisKKy8qKgorICogXGJyaWVmCSAgIFNIQS0xIHByb2Nlc3MgYnVmZmVyCisgKgorICogXHBhcmFtIGN0eAkgICBTSEEtMSBjb250ZXh0CisgKiBccGFyYW0gaW5wdXQgICAgYnVmZmVyIGhvbGRpbmcgdGhlICBkYXRhCisgKiBccGFyYW0gaWxlbgkgICBsZW5ndGggb2YgdGhlIGlucHV0IGRhdGEKKyAqLwordm9pZCBzaGExX3VwZGF0ZSggc2hhMV9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgKmlucHV0LCBpbnQgaWxlbiApOworCisvKioKKyAqIFxicmllZgkgICBTSEEtMSBmaW5hbCBkaWdlc3QKKyAqCisgKiBccGFyYW0gY3R4CSAgIFNIQS0xIGNvbnRleHQKKyAqIFxwYXJhbSBvdXRwdXQgICBTSEEtMSBjaGVja3N1bSByZXN1bHQKKyAqLwordm9pZCBzaGExX2ZpbmlzaCggc2hhMV9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzIwXSApOworCisvKioKKyAqIFxicmllZgkgICBPdXRwdXQgPSBTSEEtMSggaW5wdXQgYnVmZmVyICkKKyAqCisgKiBccGFyYW0gaW5wdXQgICAgYnVmZmVyIGhvbGRpbmcgdGhlICBkYXRhCisgKiBccGFyYW0gaWxlbgkgICBsZW5ndGggb2YgdGhlIGlucHV0IGRhdGEKKyAqIFxwYXJhbSBvdXRwdXQgICBTSEEtMSBjaGVja3N1bSByZXN1bHQKKyAqLwordm9pZCBzaGExX2NzdW0oIHVuc2lnbmVkIGNoYXIgKmlucHV0LCBpbnQgaWxlbiwKKwkJdW5zaWduZWQgY2hhciBvdXRwdXRbMjBdICk7CisKKy8qKgorICogXGJyaWVmCSAgIE91dHB1dCA9IFNIQS0xKCBmaWxlIGNvbnRlbnRzICkKKyAqCisgKiBccGFyYW0gcGF0aAkgICBpbnB1dCBmaWxlIG5hbWUKKyAqIFxwYXJhbSBvdXRwdXQgICBTSEEtMSBjaGVja3N1bSByZXN1bHQKKyAqIFxyZXR1cm4JICAgMCBpZiBzdWNjZXNzZnVsLCBvciAxIGlmIGZvcGVuIGZhaWxlZAorICovCitpbnQgc2hhMV9maWxlKCBjaGFyICpwYXRoLCB1bnNpZ25lZCBjaGFyIG91dHB1dFsyMF0gKTsKKworLyoqCisgKiBcYnJpZWYJICAgT3V0cHV0ID0gSE1BQy1TSEEtMSggaW5wdXQgYnVmZmVyLCBobWFjIGtleSApCisgKgorICogXHBhcmFtIGtleQkgICBITUFDIHNlY3JldCBrZXkKKyAqIFxwYXJhbSBrZXlsZW4gICBsZW5ndGggb2YgdGhlIEhNQUMga2V5CisgKiBccGFyYW0gaW5wdXQgICAgYnVmZmVyIGhvbGRpbmcgdGhlICBkYXRhCisgKiBccGFyYW0gaWxlbgkgICBsZW5ndGggb2YgdGhlIGlucHV0IGRhdGEKKyAqIFxwYXJhbSBvdXRwdXQgICBITUFDLVNIQS0xIHJlc3VsdAorICovCit2b2lkIHNoYTFfaG1hYyggdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLAorCQl1bnNpZ25lZCBjaGFyICppbnB1dCwgaW50IGlsZW4sCisJCXVuc2lnbmVkIGNoYXIgb3V0cHV0WzIwXSApOworCisvKioKKyAqIFxicmllZgkgICBDaGVja3VwIHJvdXRpbmUKKyAqCisgKiBccmV0dXJuCSAgIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgMSBpZiB0aGUgdGVzdCBmYWlsZWQKKyAqLworaW50IHNoYTFfc2VsZl90ZXN0KCB2b2lkICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBzaGExLmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3BhcnRhbjMuaCBiL2luY2x1ZGUvc3BhcnRhbjMuaAppbmRleCBiMTRkYjAzLi42NWEzZjVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NwYXJ0YW4zLmgKKysrIGIvaW5jbHVkZS9zcGFydGFuMy5oCkBAIC03Myw2ICs3MywxMyBAQAogI2RlZmluZSBYSUxJTlhfWEMzUzQwMDBfU0laRSAJMTEzMTY4NjQvOAogI2RlZmluZSBYSUxJTlhfWEMzUzUwMDBfU0laRSAJMTMyNzE5MzYvOAogCisvKiBTcGFydGFuLTNFICh2My40KSAqLworI2RlZmluZQlYSUxJTlhfWEMzUzEwMEVfU0laRQk1ODEzNDQvOAorI2RlZmluZQlYSUxJTlhfWEMzUzI1MEVfU0laRQkxMzUzNzI4LzgKKyNkZWZpbmUJWElMSU5YX1hDM1M1MDBFX1NJWkUJMjI3MDIwOC84CisjZGVmaW5lCVhJTElOWF9YQzNTMTIwMEVfU0laRQkzODQxMTg0LzgKKyNkZWZpbmUJWElMSU5YX1hDM1MxNjAwRV9TSVpFCTU5Njk2OTYvOAorCiAvKiBEZXNjcmlwdG9yIE1hY3JvcwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFNwYXJ0YW4tSUkgZGV2aWNlcyAqLwpAQCAtMTAwLDQgKzEwNywyMSBAQAogI2RlZmluZSBYSUxJTlhfWEMzUzUwMDBfREVTQyhpZmFjZSwgZm5fdGFibGUsIGNvb2tpZSkgXAogeyBYaWxpbnhfU3BhcnRhbjMsIGlmYWNlLCBYSUxJTlhfWEMzUzUwMDBFX1NJWkUsIGZuX3RhYmxlLCBjb29raWUgfQogCisKKy8qIFNwYXJ0YW4tM0UgZGV2aWNlcyAqLworI2RlZmluZSBYSUxJTlhfWEMzUzEwMEVfREVTQyhpZmFjZSwgZm5fdGFibGUsIGNvb2tpZSkgXAoreyBYaWxpbnhfU3BhcnRhbjMsIGlmYWNlLCBYSUxJTlhfWEMzUzEwMEVfU0laRSwgZm5fdGFibGUsIGNvb2tpZSB9CisKKyNkZWZpbmUgWElMSU5YX1hDM1MyNTBFX0RFU0MoaWZhY2UsIGZuX3RhYmxlLCBjb29raWUpIFwKK3sgWGlsaW54X1NwYXJ0YW4zLCBpZmFjZSwgWElMSU5YX1hDM1MyNTBFX1NJWkUsIGZuX3RhYmxlLCBjb29raWUgfQorCisjZGVmaW5lIFhJTElOWF9YQzNTNTAwRV9ERVNDKGlmYWNlLCBmbl90YWJsZSwgY29va2llKSBcCit7IFhpbGlueF9TcGFydGFuMywgaWZhY2UsIFhJTElOWF9YQzNTNTAwRV9TSVpFLCBmbl90YWJsZSwgY29va2llIH0KKworI2RlZmluZSBYSUxJTlhfWEMzUzEyMDBFX0RFU0MoaWZhY2UsIGZuX3RhYmxlLCBjb29raWUpIFwKK3sgWGlsaW54X1NwYXJ0YW4zLCBpZmFjZSwgWElMSU5YX1hDM1MxMjAwRV9TSVpFLCBmbl90YWJsZSwgY29va2llIH0KKworI2RlZmluZSBYSUxJTlhfWEMzUzE2MDBFX0RFU0MoaWZhY2UsIGZuX3RhYmxlLCBjb29raWUpIFwKK3sgWGlsaW54X1NwYXJ0YW4zLCBpZmFjZSwgWElMSU5YX1hDM1MxNjAwRV9TSVpFLCBmbl90YWJsZSwgY29va2llIH0KKwogI2VuZGlmIC8qIF9TUEFSVEFOM19IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zdGF0dXNfbGVkLmggYi9pbmNsdWRlL3N0YXR1c19sZWQuaAppbmRleCA3MWEyMDJmLi5hNjQ2ODE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3N0YXR1c19sZWQuaAorKysgYi9pbmNsdWRlL3N0YXR1c19sZWQuaApAQCAtMzY3LDYgKzM2NywxMyBAQAogCiAjZGVmaW5lIFNUQVRVU19MRURfQk9PVAkJMAkvKiBMRUQgMCB1c2VkIGZvciBib290IHN0YXR1cyAqLwogCisjZWxpZiBkZWZpbmVkKENPTkZJR19CT0FSRF9TUEVDSUZJQ19MRUQpCisvKiBsZWRfaWRfdCBpcyB1bnNpZ25lZCBsb25nIG1hc2sgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsZWRfaWRfdDsKKworZXh0ZXJuIHZvaWQgX19sZWRfdG9nZ2xlIChsZWRfaWRfdCBtYXNrKTsKK2V4dGVybiB2b2lkIF9fbGVkX2luaXQgKGxlZF9pZF90IG1hc2ssIGludCBzdGF0ZSk7CitleHRlcm4gdm9pZCBfX2xlZF9zZXQgKGxlZF9pZF90IG1hc2ssIGludCBzdGF0ZSk7CiAjZWxzZQogIyBlcnJvciBTdGF0dXMgTEVEIGNvbmZpZ3VyYXRpb24gbWlzc2luZwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VzYi5oIGIvaW5jbHVkZS91c2IuaAppbmRleCBiZjcxNTU0Li40ZTE1MzlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VzYi5oCisrKyBiL2luY2x1ZGUvdXNiLmgKQEAgLTE2OSw3ICsxNjksMTAgQEAKICAqIHRoaXMgaXMgaG93IHRoZSBsb3dsZXZlbCBwYXJ0IGNvbW11bmljYXRlIHdpdGggdGhlIG91dGVyIHdvcmxkCiAgKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX1VTQl9VSENJKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSSkgfHwgZGVmaW5lZCAoQ09ORklHX1VTQl9TTDgxMUhTKQorI2lmIGRlZmluZWQoQ09ORklHX1VTQl9VSENJKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSSkgfHwgXAorCWRlZmluZWQoQ09ORklHX1VTQl9PSENJX05FVykgfHwgZGVmaW5lZCAoQ09ORklHX1VTQl9TTDgxMUhTKSB8fCBcCisJZGVmaW5lZChDT05GSUdfVVNCX0lTUDExNlhfSENEKQorCiBpbnQgdXNiX2xvd2xldmVsX2luaXQodm9pZCk7CiBpbnQgdXNiX2xvd2xldmVsX3N0b3Aodm9pZCk7CiBpbnQgc3VibWl0X2J1bGtfbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqYnVmZmVyLGludCB0cmFuc2Zlcl9sZW4pOwpAQCAtMTc3LDYgKzE4MCw3IEBACiAJCQlpbnQgdHJhbnNmZXJfbGVuLHN0cnVjdCBkZXZyZXF1ZXN0ICpzZXR1cCk7CiBpbnQgc3VibWl0X2ludF9tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICpidWZmZXIsCiAJCQlpbnQgdHJhbnNmZXJfbGVuLCBpbnQgaW50ZXJ2YWwpOwordm9pZCB1c2JfZXZlbnRfcG9sbCh2b2lkKTsKIAogLyogRGVmaW5lcyAqLwogI2RlZmluZSBVU0JfVUhDSV9WRU5EX0lEIDB4ODA4NgpAQCAtMjMwLDE2ICsyMzQsMTIgQEAKIAogLyogYmlnIGVuZGlhbiAtPiBsaXR0bGUgZW5kaWFuIGNvbnZlcnNpb24gKi8KIC8qIHNvbWUgQ1BVcyBhcmUgYWxyZWFkeSBsaXR0bGUgZW5kaWFuIGUuZy4gdGhlIEFSTTkyMFQgKi8KLSNpZmRlZiBMSVRUTEVFTkRJQU4KLSNkZWZpbmUgc3dhcF8xNih4KSAoKHVuc2lnbmVkIHNob3J0KSh4KSkKLSNkZWZpbmUgc3dhcF8zMih4KSAoKHVuc2lnbmVkIGxvbmcpKHgpKQotI2Vsc2UKLSNkZWZpbmUgc3dhcF8xNih4KSBcCisjZGVmaW5lIF9fc3dhcF8xNih4KSBcCiAJKHsgdW5zaWduZWQgc2hvcnQgeF8gPSAodW5zaWduZWQgc2hvcnQpeDsgXAogCSAodW5zaWduZWQgc2hvcnQpKCBcCiAJCSgoeF8gJiAweDAwRkZVKSA8PCA4KSB8ICgoeF8gJiAweEZGMDBVKSA+PiA4KSApOyBcCiAJfSkKLSNkZWZpbmUgc3dhcF8zMih4KSBcCisjZGVmaW5lIF9fc3dhcF8zMih4KSBcCiAJKHsgdW5zaWduZWQgbG9uZyB4XyA9ICh1bnNpZ25lZCBsb25nKXg7IFwKIAkgKHVuc2lnbmVkIGxvbmcpKCBcCiAJCSgoeF8gJiAweDAwMDAwMEZGVUwpIDw8IDI0KSB8IFwKQEAgLTI0Nyw2ICsyNDcsMTMgQEAKIAkJKCh4XyAmIDB4MDBGRjAwMDBVTCkgPj4JIDgpIHwgXAogCQkoKHhfICYgMHhGRjAwMDAwMFVMKSA+PiAyNCkgKTsgXAogCX0pCisKKyNpZmRlZiBMSVRUTEVFTkRJQU4KKyMgZGVmaW5lIHN3YXBfMTYoeCkgKHgpCisjIGRlZmluZSBzd2FwXzMyKHgpICh4KQorI2Vsc2UKKyMgZGVmaW5lIHN3YXBfMTYoeCkgX19zd2FwXzE2KHgpCisjIGRlZmluZSBzd2FwXzMyKHgpIF9fc3dhcF8zMih4KQogI2VuZGlmIC8qIExJVFRMRUVORElBTiAqLwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91c2JfY2RjX2FjbS5oIGIvaW5jbHVkZS91c2JfY2RjX2FjbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YmY1MGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3VzYl9jZGNfYWNtLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogQnJ5YW4gTydEb25vZ2h1ZSwgZGVja2FyZEBjb2RlaGVybWl0LmllLCBDb2RlSGVybWl0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKy8qIEFDTSBDb250cm9sIFJlcXVlc3RzICovCisjZGVmaW5lIEFDTV9TRU5EX0VOQ0FQU1VMQVRFRF9DT01NQU5ECTB4MDAKKyNkZWZpbmUgQUNNX0dFVF9FTkNBUFNVTEFURURfUkVTUE9OU0UJMHgwMQorI2RlZmluZSBBQ01fU0VUX0NPTU1fRkVBVFVSRQkJMHgwMgorI2RlZmluZSBBQ01fR0VUX0NPTU1fRkVBVFJVRQkJMHgwMworI2RlZmluZSBBQ01fQ0xFQVJfQ09NTV9GRUFUVVJFCQkweDA0CisjZGVmaW5lIEFDTV9TRVRfTElORV9FTkNPRElORwkJMHgyMAorI2RlZmluZSBBQ01fR0VUX0xJTkVfRU5DT0RJTkcJCTB4MjEKKyNkZWZpbmUgQUNNX1NFVF9DT05UUk9MX0xJTkVfU1RBVEUJMHgyMgorI2RlZmluZSBBQ01fU0VORF9CUkVBSwkJCTB4MjMKKworLyogQUNNIE5vdGlmaWNhdGlvbiBDb2RlcyAqLworI2RlZmluZSBBQ01fTkVUV09SS19DT05ORUNUSU9OCQkweDAwCisjZGVmaW5lIEFDTV9SRVNQT05TRV9BVkFJTEFCTEUJCTB4MDEKKyNkZWZpbmUgQUNNX1NFUklBTF9TVEFURQkJMHgyMAorCisvKiBGb3JtYXQgb2YgcmVzcG9uc2UgZXhwZWN0ZWQgYnkgYSBBQ01fR0VUX0xJTkVfRU5DT0RJTkcgcmVxdWVzdCAqLworc3RydWN0IHJzMjMyX2VtdXsKKwkJdW5zaWduZWQgbG9uZyBkdGVyOworCQl1bnNpZ25lZCBjaGFyIHN0b3BfYml0czsKKwkJdW5zaWduZWQgY2hhciBwYXJpdHk7CisJCXVuc2lnbmVkIGNoYXIgZGF0YV9iaXRzOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91c2JkY29yZS5oIGIvaW5jbHVkZS91c2JkY29yZS5oCmluZGV4IDZlOTJkZjEuLmNiMmJlNzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdXNiZGNvcmUuaAorKysgYi9pbmNsdWRlL3VzYmRjb3JlLmgKQEAgLTU3Niw2ICs1NzYsOSBAQAogCiAJdm9pZCAoKmV2ZW50KSAoc3RydWN0IHVzYl9kZXZpY2VfaW5zdGFuY2UgKmRldmljZSwgdXNiX2RldmljZV9ldmVudF90IGV2ZW50LCBpbnQgZGF0YSk7CiAKKwkvKiBEbyBjZGMgZGV2aWNlIHNwZWNpZmljIGNvbnRyb2wgcmVxdWVzdHMgKi8KKwlpbnQgKCpjZGNfcmVjdl9zZXR1cCkoc3RydWN0IHVzYl9kZXZpY2VfcmVxdWVzdCAqcmVxdWVzdCwgc3RydWN0IHVyYiAqdXJiKTsKKwogCS8qIGJ1cyBpbnRlcmZhY2UgKi8KIAlzdHJ1Y3QgdXNiX2J1c19pbnN0YW5jZSAqYnVzOwkvKiB3aGljaCBidXMgaW50ZXJmYWNlIGRyaXZlciAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VzYmRjb3JlX21wYzh4eC5oIGIvaW5jbHVkZS91c2JkY29yZV9tcGM4eHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGY2MmY0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91c2JkY29yZV9tcGM4eHguaApAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBCcnlhbiBPJ0Rvbm9naHVlLCBDb2RlSGVybWl0CisgKiBib2Rvbm9naHVlQGNvZGVoZXJtaXQuaWUKKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8Y29tbXByb2MuaD4KKworLyogTW9kZSBSZWdpc3RlciAqLworI2RlZmluZSBVU01PRF9FTgkweDAxCisjZGVmaW5lIFVTTU9EX0hPU1QJMHgwMgorI2RlZmluZSBVU01PRF9URVNUCTB4MDQKKyNkZWZpbmUgVVNNT0RfU0ZURQkweDA4CisjZGVmaW5lIFVTTU9EX1JFU1VNRQkweDQwCisjZGVmaW5lIFVTTU9EX0xTUwkweDgwCisKKy8qIEVuZHBvaW50IFJlZ2lzdGVycyAqLworI2RlZmluZSBVU0VQX1JIU19OT1JNCTB4MDAKKyNkZWZpbmUgVVNFUF9SSFNfSUdOT1JFCTB4MDEKKyNkZWZpbmUgVVNFUF9SSFNfTkFLCTB4MDIKKyNkZWZpbmUgVVNFUF9SSFNfU1RBTEwJMHgwMworCisjZGVmaW5lIFVTRVBfVEhTX05PUk0JMHgwMAorI2RlZmluZSBVU0VQX1RIU19JR05PUkUJMHgwNAorI2RlZmluZSBVU0VQX1RIU19OQUsJMHgwOAorI2RlZmluZSBVU0VQX1RIU19TVEFMTAkweDBDCisKKyNkZWZpbmUgVVNFUF9SVEUJMHgxMAorI2RlZmluZSBVU0VQX01GCQkweDIwCisKKyNkZWZpbmUgVVNFUF9UTV9DT05UUk9MCTB4MDAKKyNkZWZpbmUgVVNFUF9UTV9JTlQJMHgxMDAKKyNkZWZpbmUgVVNFUF9UTV9CVUxLCTB4MjAwCisjZGVmaW5lIFVTRVBfVE1fSVNPCTB4MzAwCisKKy8qIENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVVNDT01fRVAwCTB4MDAKKyNkZWZpbmUgVVNDT01fRVAxCTB4MDEKKyNkZWZpbmUgVVNDT01fRVAyCTB4MDIKKyNkZWZpbmUgVVNDT01fRVAzCTB4MDMKKworI2RlZmluZSBVU0NPTV9GTFVTSAkweDQwCisjZGVmaW5lIFVTQ09NX1NUUgkweDgwCisKKy8qIEV2ZW50IFJlZ2lzdGVyICovCisjZGVmaW5lIFVTQl9FX1JYQgkweDAwMDEKKyNkZWZpbmUgVVNCX0VfVFhCCTB4MDAwMgorI2RlZmluZSBVU0JfRV9CU1kJMHgwMDA0CisjZGVmaW5lIFVTQl9FX1NPRgkweDAwMDgKKyNkZWZpbmUgVVNCX0VfVFhFMQkweDAwMTAKKyNkZWZpbmUgVVNCX0VfVFhFMgkweDAwMjAKKyNkZWZpbmUgVVNCX0VfVFhFMwkweDAwNDAKKyNkZWZpbmUgVVNCX0VfVFhFNAkweDAwODAKKyNkZWZpbmUgVVNCX1RYX0VSUk1BU0sgKFVTQl9FX1RYRTF8VVNCX0VfVFhFMnxVU0JfRV9UWEUzfFVTQl9FX1RYRTQpCisjZGVmaW5lIFVTQl9FX0lETEUJMHgwMTAwCisjZGVmaW5lIFVTQl9FX1JFU0VUCTB4MDIwMAorCisvKiBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lIFVTQlNfSURMRQkweDAxCisKKy8qIFJYIEJ1ZmZlciBEZXNjcmlwdG9yICovCisjZGVmaW5lIFJYX0JEX09WCTB4MDIKKyNkZWZpbmUgUlhfQkRfQ1IJMHgwNAorI2RlZmluZSBSWF9CRF9BQgkweDA4CisjZGVmaW5lIFJYX0JEX05PCTB4MTAKKyNkZWZpbmUgUlhfQkRfUElEX0RBVEEwCTB4MDAKKyNkZWZpbmUgUlhfQkRfUElEX0RBVEExCTB4NDAKKyNkZWZpbmUgUlhfQkRfUElEX1NFVFVQCTB4ODAKKyNkZWZpbmUgUlhfQkRfRgkJMHg0MDAKKyNkZWZpbmUgUlhfQkRfTAkJMHg4MDAKKyNkZWZpbmUgUlhfQkRfSQkJMHgxMDAwCisjZGVmaW5lIFJYX0JEX1cJCTB4MjAwMAorI2RlZmluZSBSWF9CRF9FCQkweDgwMDAKKworLyogVXNlZnVsIG1hc2tzICovCisjZGVmaW5lIFJYX0JEX1BJRF9CSVRNQVNLIChSWF9CRF9QSURfREFUQTEgfCBSWF9CRF9QSURfU0VUVVApCisjZGVmaW5lIFNUQUxMX0JJVE1BU0sgKFVTRVBfVEhTX1NUQUxMIHwgVVNFUF9SSFNfU1RBTEwpCisjZGVmaW5lIE5BS19CSVRNQVNLIChVU0VQX1RIU19OQUsgfCBVU0VQX1JIU19OQUspCisjZGVmaW5lIENCRF9UWF9CSVRNQVNLIChUWF9CRF9SIHwgVFhfQkRfTCB8IFRYX0JEX1RDIHwgVFhfQkRfSSB8IFRYX0JEX0NORikKKworLyogVFggQnVmZmVyIERlc2NyaXB0b3IgKi8KKyNkZWZpbmUgVFhfQkRfVU4JMHgwMgorI2RlZmluZSBUWF9CRF9UTwkweDA0CisjZGVmaW5lIFRYX0JEX05PX1BJRAkweDAwCisjZGVmaW5lIFRYX0JEX1BJRF9EQVRBMAkweDgwCisjZGVmaW5lIFRYX0JEX1BJRF9EQVRBMQkweEMwCisjZGVmaW5lIFRYX0JEX0NORgkweDIwMAorI2RlZmluZSBUWF9CRF9UQwkweDQwMAorI2RlZmluZSBUWF9CRF9MCQkweDgwMAorI2RlZmluZSBUWF9CRF9JCQkweDEwMDAKKyNkZWZpbmUgVFhfQkRfVwkJMHgyMDAwCisjZGVmaW5lIFRYX0JEX1IJCTB4ODAwMAorCisvKiBJbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBkZWZpbmVzICovCisKKyNkZWZpbmUgRVBfTUlOX1BBQ0tFVF9TSVpFIDB4MDgKKyNkZWZpbmUgTUFYX0VORFBPSU5UUwkweDA0CisjZGVmaW5lIEZJRk9fU0laRQkweDEwCisjZGVmaW5lIEVQX01BWF9QS1QJRklGT19TSVpFCisjZGVmaW5lIFRYX1JJTkdfU0laRQkweDA0CisjZGVmaW5lIFJYX1JJTkdfU0laRQkweDA2CisjZGVmaW5lIFVTQl9NQVhfUEtUCTB4NDAKKyNkZWZpbmUgVE9HR0xFX1RYX1BJRCh4KSB4PSAoKH54KSYweDQwKXwweDgwCisjZGVmaW5lIFRPR0dMRV9SWF9QSUQoeCkgeF49IDB4NDAKKyNkZWZpbmUgRVBfQVRUQUNIRUQJMHgwMQkvKiBFbmRwb2ludCBoYXMgYSB1cmIgYXR0YWNoZWQgb3Igbm90ICovCisjZGVmaW5lIEVQX1NFTkRfWkxQCTB4MDIJLyogU2VuZCBaTFAgeS9uID8gKi8KKworI2RlZmluZSBQUk9GRl9VU0IJMHgwMDAwMDAwMAorI2RlZmluZSBDUE1fVVNCX0JBU0UJMHgwMDAwMEEwMAorCisvKiBVREMgZGV2aWNlIGRlZmluZXMgKi8KKyNkZWZpbmUgRVAwX01BWF9QQUNLRVRfU0laRQlFUF9NQVhfUEtUCisjZGVmaW5lIFVEQ19PVVRfRU5EUE9JTlQJMHgwMgorI2RlZmluZSBVRENfT1VUX1BBQ0tFVF9TSVpFCUVQX01JTl9QQUNLRVRfU0laRQorI2RlZmluZSBVRENfSU5fRU5EUE9JTlQJCTB4MDMKKyNkZWZpbmUgVURDX0lOX1BBQ0tFVF9TSVpFCUVQX01JTl9QQUNLRVRfU0laRQorI2RlZmluZSBVRENfSU5UX0VORFBPSU5UCTB4MDEKKyNkZWZpbmUgVURDX0lOVF9QQUNLRVRfU0laRQlVRENfSU5fUEFDS0VUX1NJWkUKKyNkZWZpbmUgVURDX0JVTEtfUEFDS0VUX1NJWkUJRVBfTUlOX1BBQ0tFVF9TSVpFCisKK3N0cnVjdCBtcGM4eHhfZXAgeworCXN0cnVjdCB1cmIgKiB1cmI7CisJdW5zaWduZWQgY2hhciBwaWQ7CisJdW5zaWduZWQgY2hhciBzYzsKKwl2b2xhdGlsZSBjYmRfdCAqIHByeDsKK307CisKK3R5cGVkZWYgc3RydWN0IG1wYzh4eF91c2J7CisJY2hhciB1c21vZDsJLyogTW9kZSBSZWdpc3RlciAqLworCWNoYXIgdXNhZGRyOwkvKiBTbGF2ZSBBZGRyZXNzIFJlZ2lzdGVyICovCisJY2hhciB1c2NvbTsJLyogQ29tbWFuZCBSZWdpc3RlciAqLworCWNoYXIgcmVzMTsJLyogUmVzZXJ2ZWQgKi8KKwl1c2hvcnQgdXNlcFs0XTsKKwl1bG9uZyByZXMyOwkvKiBSZXNlcnZlZCAqLworCXVzaG9ydCB1c2JlcjsJLyogRXZlbnQgUmVnaXN0ZXIgKi8KKwl1c2hvcnQgcmVzMzsJLyogUmVzZXJ2ZWQgKi8KKwl1c2hvcnQgdXNibXI7CS8qIE1hc2sgUmVnaXN0ZXIgKi8KKwljaGFyIHJlczQ7CS8qIFJlc2VydmVkICovCisJY2hhciB1c2JzOwkvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KKwljaGFyIHJlczVbOF07CS8qIFJlc2VydmVkICovCit9dXNiX3Q7CisKK3R5cGVkZWYgc3RydWN0IG1wYzh4eF9wYXJhbWV0ZXJfcmFteworCXVzaG9ydCBlcDBwdHI7CS8qIEVuZHBvaW50IFBvaW50ZXIgUmVnaXN0ZXIgMCAqLworCXVzaG9ydCBlcDFwdHI7CS8qIEVuZHBvaW50IFBvaW50ZXIgUmVnaXN0ZXIgMSAqLworCXVzaG9ydCBlcDJwdHI7CS8qIEVuZHBvaW50IFBvaW50ZXIgUmVnaXN0ZXIgMiAqLworCXVzaG9ydCBlcDNwdHI7CS8qIEVuZHBvaW50IFBvaW50ZXIgUmVnaXN0ZXIgMyAqLworCXVpbnQgcnN0YXRlOwkvKiBSZWNlaXZlIHN0YXRlICovCisJdWludCBycHRyOwkvKiBSZWNlaXZlIGludGVybmFsIGRhdGEgcG9pbnRlciAqLworCXVzaG9ydCBmcmFtZV9uOwkvKiBGcmFtZSBudW1iZXIgKi8KKwl1c2hvcnQgcmJjbnQ7CS8qIFJlY2VpdmUgYnl0ZSBjb3VudCAqLworCXVpbnQgcnRlbXA7CS8qIFJlY2VpdmUgdGVtcCBjcCB1c2Ugb25seSAqLworCXVpbnQgcnh1c2I7CS8qIFJ4IERhdGEgVGVtcCAqLworCXVzaG9ydCByeHVwdHI7CS8qIFJ4IG1pY3JvY29kZSByZXR1cm4gYWRkcmVzcyB0ZW1wICovCit9dXNiX3ByYW1fdDsKKwordHlwZWRlZiBzdHJ1Y3QgZW5kcG9pbnRfcGFyYW1ldGVyX2Jsb2NrX3BvaW50ZXJ7CisJdXNob3J0IHJiYXNlOwkvKiBSeEJEIGJhc2UgYWRkcmVzcyAqLworCXVzaG9ydCB0YmFzZTsJLyogVHhCRCBiYXNlIGFkZHJlc3MgKi8KKwljaGFyIHJmY3I7CS8qIFJ4IEZ1bmN0aW9uIGNvZGUgKi8KKwljaGFyIHRmY3I7CS8qIFR4IEZ1bmN0aW9uIGNvZGUgKi8KKwl1c2hvcnQgbXJibHI7CS8qIE1heGltdW0gUmVjZWl2ZSBCdWZmZXIgTGVuZ3RoICovCisJdXNob3J0IHJicHRyOyAJLyogUnhCRCBwb2ludGVyIE5leHQgQnVmZmVyIERlc2NyaXB0b3IgKi8KKwl1c2hvcnQgdGJwdHI7CS8qIFR4QkQgcG9pbnRlciBOZXh0IEJ1ZmZlciBEZXNjcmlwdG9yICAqLworCXVsb25nIHRzdGF0ZTsJLyogVHJhbnNtaXQgaW50ZXJuYWwgc3RhdGUgKi8KKwl1bG9uZyB0cHRyOwkvKiBUcmFuc21pdCBpbnRlcm5hbCBkYXRhIHBvaW50ZXIgKi8KKwl1c2hvcnQgdGNyYzsJLyogVHJhbnNtaXQgdGVtcCBDUkMgKi8KKwl1c2hvcnQgdGJjbnQ7CS8qIFRyYW5zbWl0IGludGVybmFsIGJ5ZSBjb3VudCAqLworCXVsb25nIHR0ZW1wOwkvKiBUeCB0ZW1wICovCisJdXNob3J0IHR4dXB0cjsJLyogVHggbWljcm9jb2RlIHJldHVybiBhZGRyZXNzICovCisJdXNob3J0IHJlczE7CS8qIFJlc2VydmVkICovCit9dXNiX2VwYl90OworCit0eXBlZGVmIGVudW0gbXBjOHh4X3VkY19zdGF0ZXsKKwlTVEFURV9OT1RfUkVBRFksCisJU1RBVEVfRVJST1IsCisJU1RBVEVfUkVBRFksCit9bXBjOHh4X3VkY19zdGF0ZV90OworCisvKiBEZWNsYXJhdGlvbnMgKi8KK2ludCB1ZGNfaW5pdCh2b2lkKTsKK3ZvaWQgdWRjX2lycSh2b2lkKTsKK2ludCB1ZGNfZW5kcG9pbnRfd3JpdGUoc3RydWN0IHVzYl9lbmRwb2ludF9pbnN0YW5jZSAqZW5kcG9pbnQpOwordm9pZCB1ZGNfc2V0dXBfZXAoc3RydWN0IHVzYl9kZXZpY2VfaW5zdGFuY2UgKmRldmljZSwgdW5zaWduZWQgaW50IGVwLAorCQkgIHN0cnVjdCB1c2JfZW5kcG9pbnRfaW5zdGFuY2UgKmVuZHBvaW50KTsKK3ZvaWQgdWRjX2Nvbm5lY3Qodm9pZCk7Cit2b2lkIHVkY19kaXNjb25uZWN0KHZvaWQpOwordm9pZCB1ZGNfZW5hYmxlKHN0cnVjdCB1c2JfZGV2aWNlX2luc3RhbmNlICpkZXZpY2UpOwordm9pZCB1ZGNfZGlzYWJsZSh2b2lkKTsKK3ZvaWQgdWRjX3N0YXJ0dXBfZXZlbnRzKHN0cnVjdCB1c2JfZGV2aWNlX2luc3RhbmNlICpkZXZpY2UpOworCisvKiBGbG93IGNvbnRyb2wgKi8KK3ZvaWQgdWRjX3NldF9uYWsoaW50IGVwaWQpOwordm9pZCB1ZGNfdW5zZXRfbmFrIChpbnQgZXBpZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3VzYmRjb3JlX29tYXAxNTEwLmggYi9pbmNsdWRlL3VzYmRjb3JlX29tYXAxNTEwLmgKaW5kZXggNmVhMzMzMS4uNTI2ZmNkOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91c2JkY29yZV9vbWFwMTUxMC5oCisrKyBiL2luY2x1ZGUvdXNiZGNvcmVfb21hcDE1MTAuaApAQCAtMTYxLDEwICsxNjEsMjAgQEAKICNkZWZpbmUgVURDX1ZCVVNfQ1RSTAkgICAgKDEgPDwgMTkpCiAjZGVmaW5lIFVEQ19WQlVTX01PREUJICAgICgxIDw8IDE4KQogCisvKiBPTUFQIEVuZHBvaW50IHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgRVAwX01BWF9QQUNLRVRfU0laRSA2NAorI2RlZmluZSBVRENfT1VUX0VORFBPSU5UIDIKKyNkZWZpbmUgVURDX09VVF9QQUNLRVRfU0laRSA2NAorI2RlZmluZSBVRENfSU5fRU5EUE9JTlQJMQorI2RlZmluZSBVRENfSU5fUEFDS0VUX1NJWkUgNjQKKyNkZWZpbmUgVURDX0lOVF9FTkRQT0lOVCA1CisjZGVmaW5lIFVEQ19JTlRfUEtUU0laRQkxNgorI2RlZmluZSBVRENfQlVMS19QS1RTSVpFIDE2CiAKLXZvaWQgb21hcDE1MTBfdWRjX2lycSh2b2lkKTsKLXZvaWQgb21hcDE1MTBfdWRjX25vbmlzb19pcnEodm9pZCk7Ci0KK3ZvaWQgdWRjX2lycSAodm9pZCk7CisvKiBGbG93IGNvbnRyb2wgKi8KK3ZvaWQgdWRjX3NldF9uYWsoaW50IGVwaWQpOwordm9pZCB1ZGNfdW5zZXRfbmFrIChpbnQgZXBpZCk7CiAKIC8qIEhpZ2hlciBsZXZlbCBmdW5jdGlvbnMgZm9yIGFic3RyYWN0aW5nIGF3YXkgZnJvbSBzcGVjaWZpYyBkZXZpY2UgKi8KIHZvaWQgdWRjX2VuZHBvaW50X3dyaXRlKHN0cnVjdCB1c2JfZW5kcG9pbnRfaW5zdGFuY2UgKmVuZHBvaW50KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXNiZGVzY3JpcHRvcnMuaCBiL2luY2x1ZGUvdXNiZGVzY3JpcHRvcnMuaAppbmRleCAyZDlmNzM5Li5hNzUyMDk3IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VzYmRlc2NyaXB0b3JzLmgKKysrIGIvaW5jbHVkZS91c2JkZXNjcmlwdG9ycy5oCkBAIC05MiwzMyArOTIsNDIgQEAKICNkZWZpbmUgQ09NTVVOSUNBVElPTlNfREVWSUNFX0NMQVNTCTB4MDIKIAogLyogYy5mLiBDREMgNC4yIFRhYmxlIDE1ICovCi0jZGVmaW5lIENPTU1VTklDQVRJT05TX0lOVEVSRkFDRV9DTEFTUwkweDAyCisjZGVmaW5lIENPTU1VTklDQVRJT05TX0lOVEVSRkFDRV9DTEFTU19DT05UUk9MCTB4MDIKKyNkZWZpbmUgQ09NTVVOSUNBVElPTlNfSU5URVJGQUNFX0NMQVNTX0RBVEEJCTB4MEEKKyNkZWZpbmUgQ09NTVVOSUNBVElPTlNfSU5URVJGQUNFX0NMQVNTX1ZFTkRPUgkweDBGRgogCiAvKiBjLmYuIENEQyA0LjMgVGFibGUgMTYgKi8KLSNkZWZpbmUgQ09NTVVOSUNBVElPTlNfTk9fU1VCQ0xBU1MJMHgwMAorI2RlZmluZSBDT01NVU5JQ0FUSU9OU19OT19TVUJDTEFTUwkJMHgwMAogI2RlZmluZSBDT01NVU5JQ0FUSU9OU19ETENNX1NVQkNMQVNTCTB4MDEKLSNkZWZpbmUgQ09NTVVOSUNBVElPTlNfQUNNX1NVQkNMQVNTCTB4MDIKLSNkZWZpbmUgQ09NTVVOSUNBVElPTlNfVENNX1NVQkNMQVNTCTB4MDMKKyNkZWZpbmUgQ09NTVVOSUNBVElPTlNfQUNNX1NVQkNMQVNTCQkweDAyCisjZGVmaW5lIENPTU1VTklDQVRJT05TX1RDTV9TVUJDTEFTUwkJMHgwMwogI2RlZmluZSBDT01NVU5JQ0FUSU9OU19NQ0NNX1NVQkNMQVNTCTB4MDQKLSNkZWZpbmUgQ09NTVVOSUNBVElPTlNfQ0NNX1NVQkNMQVNTCTB4MDUKKyNkZWZpbmUgQ09NTVVOSUNBVElPTlNfQ0NNX1NVQkNMQVNTCQkweDA1CiAjZGVmaW5lIENPTU1VTklDQVRJT05TX0VOQ01fU1VCQ0xBU1MJMHgwNgogI2RlZmluZSBDT01NVU5JQ0FUSU9OU19BTkNNX1NVQkNMQVNTCTB4MDcKIAogLyogYy5mLiBXTUNEIDUuMSAqLwogI2RlZmluZSBDT01NVU5JQ0FUSU9OU19XSENNX1NVQkNMQVNTCTB4MDgKLSNkZWZpbmUgQ09NTVVOSUNBVElPTlNfRE1NX1NVQkNMQVNTCTB4MDkKKyNkZWZpbmUgQ09NTVVOSUNBVElPTlNfRE1NX1NVQkNMQVNTCQkweDA5CiAjZGVmaW5lIENPTU1VTklDQVRJT05TX01ETE1fU1VCQ0xBU1MJMHgwYQogI2RlZmluZSBDT01NVU5JQ0FUSU9OU19PQkVYX1NVQkNMQVNTCTB4MGIKIAotLyogYy5mLiBDREMgNC42IFRhYmxlIDE4ICovCisvKiBjLmYuIENEQyA0LjQgVGFibGUgMTcgKi8KKyNkZWZpbmUgQ09NTVVOSUNBVElPTlNfTk9fUFJPVE9DT0wJCTB4MDAKKyNkZWZpbmUgQ09NTVVOSUNBVElPTlNfVjI1VEVSX1BST1RPQ09MCTB4MDEJLypDb21tb24gQVQgSGF5ZXMgY29tcGF0aWJsZSovCisKKy8qIGMuZi4gQ0RDIDQuNSBUYWJsZSAxOCAqLwogI2RlZmluZSBEQVRBX0lOVEVSRkFDRV9DTEFTUwkJMHgwYQogCisvKiBjLmYuIENEQyA0LjYgTm8gVGFibGUgKi8KKyNkZWZpbmUgREFUQV9JTlRFUkZBQ0VfU1VCQ0xBU1NfTk9ORQkweDAwCS8qIE5vIHN1YmNsYXNzIHBlcnRpbmVudCAqLworCiAvKiBjLmYuIENEQyA0LjcgVGFibGUgMTkgKi8KLSNkZWZpbmUgQ09NTVVOSUNBVElPTlNfTk9fUFJPVE9DT0wJMHgwMAorI2RlZmluZSBEQVRBX0lOVEVSRkFDRV9QUk9UT0NPTF9OT05FCTB4MDAJLyogTm8gY2xhc3MgcHJvdGNvbCByZXF1aXJlZCAqLwogCiAKIC8qIGMuZi4gQ0RDIDUuMi4zIFRhYmxlIDI0ICovCi0jZGVmaW5lIENTX0lOVEVSRkFDRQkJCTB4MjQKKyNkZWZpbmUgQ1NfSU5URVJGQUNFCQkweDI0CiAjZGVmaW5lIENTX0VORFBPSU5UCQkJMHgyNQogCiAvKgpAQCAtMTI4LDcgKzEzNyw3IEBACiAgKiBjLmYuIFdNQ0QgNS4zIFRhYmxlIDUuMwogICovCiAKLSNkZWZpbmUgVVNCX1NUX0hFQURFUgkJCTB4MDAKKyNkZWZpbmUgVVNCX1NUX0hFQURFUgkJMHgwMAogI2RlZmluZSBVU0JfU1RfQ01GCQkJMHgwMQogI2RlZmluZSBVU0JfU1RfQUNNRgkJCTB4MDIKICNkZWZpbmUgVVNCX1NUX0RMTUYJCQkweDAzCkBAIC0xMzcsMTggKzE0NiwxOCBAQAogI2RlZmluZSBVU0JfU1RfVUYJCQkweDA2CiAjZGVmaW5lIFVTQl9TVF9DU0YJCQkweDA3CiAjZGVmaW5lIFVTQl9TVF9UT01GCQkJMHgwOAotI2RlZmluZSBVU0JfU1RfVVNCVEYJCQkweDA5CisjZGVmaW5lIFVTQl9TVF9VU0JURgkJMHgwOQogI2RlZmluZSBVU0JfU1RfTkNUCQkJMHgwYQogI2RlZmluZSBVU0JfU1RfUFVGCQkJMHgwYgogI2RlZmluZSBVU0JfU1RfRVVGCQkJMHgwYwogI2RlZmluZSBVU0JfU1RfTUNNRgkJCTB4MGQKICNkZWZpbmUgVVNCX1NUX0NDTUYJCQkweDBlCiAjZGVmaW5lIFVTQl9TVF9FTkYJCQkweDBmCi0jZGVmaW5lIFVTQl9TVF9BVE1ORgkJCTB4MTAKKyNkZWZpbmUgVVNCX1NUX0FUTU5GCQkweDEwCiAKICNkZWZpbmUgVVNCX1NUX1dIQ00JCQkweDExCiAjZGVmaW5lIFVTQl9TVF9NRExNCQkJMHgxMgotI2RlZmluZSBVU0JfU1RfTURMTUQJCQkweDEzCisjZGVmaW5lIFVTQl9TVF9NRExNRAkJMHgxMwogI2RlZmluZSBVU0JfU1RfRE1NCQkJMHgxNAogI2RlZmluZSBVU0JfU1RfT0JFWAkJCTB4MTUKICNkZWZpbmUgVVNCX1NUX0NTCQkJMHgxNgpAQCAtMzEyLDcgKzMyMSw4IEBACiAJdTggYkRlc2NyaXB0b3JUeXBlOwogCXU4IGJEZXNjcmlwdG9yU3VidHlwZTsJLyogMHgwNiAqLwogCXU4IGJNYXN0ZXJJbnRlcmZhY2U7Ci0JdTggYlNsYXZlSW50ZXJmYWNlMFswXTsKKwkvKiB1OCBiU2xhdmVJbnRlcmZhY2UwWzBdOyAqLworCXU4IGJTbGF2ZUludGVyZmFjZTA7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogc3RydWN0IHVzYl9jbGFzc19jb3VudHJ5X3NlbGVjdGlvbl9kZXNjcmlwdG9yIHsKZGlmZiAtLWdpdCBhL2xpYl9hcm0vYXJtbGludXguYyBiL2xpYl9hcm0vYXJtbGludXguYwppbmRleCA1NmI3ZmNhLi42ZDMyYTQxIDEwMDY0NAotLS0gYS9saWJfYXJtL2FybWxpbnV4LmMKKysrIGIvbGliX2FybS9hcm1saW51eC5jCkBAIC02NiwxMyArNjYsNiBAQAogc3RhdGljIHN0cnVjdCB0YWcgKnBhcmFtczsKICNlbmRpZiAvKiBDT05GSUdfU0VUVVBfTUVNT1JZX1RBR1MgfHwgQ09ORklHX0NNRExJTkVfVEFHIHx8IENPTkZJR19JTklUUkRfVEFHICovCiAKLSNpZmRlZiBDT05GSUdfU0hPV19CT09UX1BST0dSRVNTCi0jIGluY2x1ZGUgPHN0YXR1c19sZWQuaD4KLSMgZGVmaW5lIFNIT1dfQk9PVF9QUk9HUkVTUyhhcmcpCXNob3dfYm9vdF9wcm9ncmVzcyhhcmcpCi0jZWxzZQotIyBkZWZpbmUgU0hPV19CT09UX1BST0dSRVNTKGFyZykKLSNlbmRpZgotCiBleHRlcm4gaW1hZ2VfaGVhZGVyX3QgaGVhZGVyOwkvKiBmcm9tIGNtZF9ib290bS5jICovCiAKIApAQCAtOTYsNyArODksNyBAQAogCSAqIENoZWNrIGlmIHRoZXJlIGlzIGFuIGluaXRyZCBpbWFnZQogCSAqLwogCWlmIChhcmdjID49IDMpIHsKLQkJU0hPV19CT09UX1BST0dSRVNTICg5KTsKKwkJc2hvd19ib290X3Byb2dyZXNzICg5KTsKIAogCQlhZGRyID0gc2ltcGxlX3N0cnRvdWwgKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKIApAQCAtMTE0LDcgKzEwNyw3IEBACiAKIAkJaWYgKG50b2hsIChoZHItPmloX21hZ2ljKSAhPSBJSF9NQUdJQykgewogCQkJcHJpbnRmICgiQmFkIE1hZ2ljIE51bWJlclxuIik7Ci0JCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xMCk7CisJCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC0xMCk7CiAJCQlkb19yZXNldCAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOwogCQl9CiAKQEAgLTEyNiwxMSArMTE5LDExIEBACiAKIAkJaWYgKGNyYzMyICgwLCAodW5zaWduZWQgY2hhciAqKSBkYXRhLCBsZW4pICE9IGNoZWNrc3VtKSB7CiAJCQlwcmludGYgKCJCYWQgSGVhZGVyIENoZWNrc3VtXG4iKTsKLQkJCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTExKTsKKwkJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTExKTsKIAkJCWRvX3Jlc2V0IChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CiAJCX0KIAotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKDEwKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgxMCk7CiAKIAkJcHJpbnRfaW1hZ2VfaGRyIChoZHIpOwogCkBAIC0xNTEsMTkgKzE0NCwxOSBAQAogCQkJY3N1bSA9IGNyYzMyICgwLCAodW5zaWduZWQgY2hhciAqKSBkYXRhLCBsZW4pOwogCQkJaWYgKGNzdW0gIT0gbnRvaGwgKGhkci0+aWhfZGNyYykpIHsKIAkJCQlwcmludGYgKCJCYWQgRGF0YSBDUkNcbiIpOwotCQkJCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEyKTsKKwkJCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC0xMik7CiAJCQkJZG9fcmVzZXQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKIAkJCX0KIAkJCXByaW50ZiAoIk9LXG4iKTsKIAkJfQogCi0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoMTEpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDExKTsKIAogCQlpZiAoKGhkci0+aWhfb3MgIT0gSUhfT1NfTElOVVgpIHx8CiAJCSAgICAoaGRyLT5paF9hcmNoICE9IElIX0NQVV9BUk0pIHx8CiAJCSAgICAoaGRyLT5paF90eXBlICE9IElIX1RZUEVfUkFNRElTSykpIHsKIAkJCXByaW50ZiAoIk5vIExpbnV4IEFSTSBSYW1kaXNrIEltYWdlXG4iKTsKLQkJCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEzKTsKKwkJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTEzKTsKIAkJCWRvX3Jlc2V0IChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CiAJCX0KIApAQCAtMTgyLDcgKzE3NSw3IEBACiAJCXVsb25nIHRhaWwgPSBudG9obCAobGVuX3B0clswXSkgJSA0OwogCQlpbnQgaTsKIAotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKDEzKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgxMyk7CiAKIAkJLyogc2tpcCBrZXJuZWwgbGVuZ3RoIGFuZCB0ZXJtaW5hdG9yICovCiAJCWRhdGEgPSAodWxvbmcpICgmbGVuX3B0clsyXSk7CkBAIC0yMDEsNyArMTk0LDcgQEAKIAkJLyoKIAkJICogbm8gaW5pdHJkIGltYWdlCiAJCSAqLwotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKDE0KTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgxNCk7CiAKIAkJbGVuID0gZGF0YSA9IDA7CiAJfQpAQCAtMjIwLDcgKzIxMyw3IEBACiAJCWluaXRyZF9lbmQgPSAwOwogCX0KIAotCVNIT1dfQk9PVF9QUk9HUkVTUyAoMTUpOworCXNob3dfYm9vdF9wcm9ncmVzcyAoMTUpOwogCiAJZGVidWcgKCIjIyBUcmFuc2ZlcnJpbmcgY29udHJvbCB0byBMaW51eCAoYXQgYWRkcmVzcyAlMDhseCkgLi4uXG4iLAogCSAgICAgICAodWxvbmcpIHRoZUtlcm5lbCk7CmRpZmYgLS1naXQgYS9saWJfYXJtL2JvYXJkLmMgYi9saWJfYXJtL2JvYXJkLmMKaW5kZXggYmFiYzI1NC4uZDM3ZTVkYSAxMDA2NDQKLS0tIGEvbGliX2FybS9ib2FyZC5jCisrKyBiL2xpYl9hcm0vYm9hcmQuYwpAQCAtNTQsNyArNTQsNyBAQAogCiBERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiB2b2lkIG5hbmRfaW5pdCAodm9pZCk7CiAjZW5kaWYKIApAQCAtMjk2LDcgKzI5Niw3IEBACiAJLyogYXJtYm9vdF9zdGFydCBpcyBkZWZpbmVkIGluIHRoZSBib2FyZC1zcGVjaWZpYyBsaW5rZXIgc2NyaXB0ICovCiAJbWVtX21hbGxvY19pbml0IChfYXJtYm9vdF9zdGFydCAtIENGR19NQUxMT0NfTEVOKTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAJcHV0cyAoIk5BTkQ6ICAiKTsKIAluYW5kX2luaXQoKTsJCS8qIGdvIGluaXQgdGhlIE5BTkQgKi8KICNlbmRpZgpAQCAtMzY0LDYgKzM2NCwxMyBAQAogCWVuYWJsZV9pbnRlcnJ1cHRzICgpOwogCiAJLyogUGVyZm9ybSBuZXR3b3JrIGNhcmQgaW5pdGlhbGlzYXRpb24gaWYgbmVjZXNzYXJ5ICovCisjaWZkZWYgQ09ORklHX0RSSVZFUl9USV9FTUFDCitleHRlcm4gdm9pZCBkbTY0NHhfZXRoX3NldF9tYWNfYWRkciAoY29uc3QgdV9pbnQ4X3QgKmFkZHIpOworCWlmIChnZXRlbnYgKCJldGhhZGRyIikpIHsKKwkJZG02NDR4X2V0aF9zZXRfbWFjX2FkZHIoZ2QtPmJkLT5iaV9lbmV0YWRkcik7CisJfQorI2VuZGlmCisKICNpZmRlZiBDT05GSUdfRFJJVkVSX0NTODkwMAogCWNzODkwMF9nZXRfZW5ldGFkZHIgKGdkLT5iZC0+YmlfZW5ldGFkZHIpOwogI2VuZGlmCkBAIC0zNzgsMTYgKzM4NSwxNiBAQAogCWlmICgocyA9IGdldGVudiAoImxvYWRhZGRyIikpICE9IE5VTEwpIHsKIAkJbG9hZF9hZGRyID0gc2ltcGxlX3N0cnRvdWwgKHMsIE5VTEwsIDE2KTsKIAl9Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAJaWYgKChzID0gZ2V0ZW52ICgiYm9vdGZpbGUiKSkgIT0gTlVMTCkgewogCQljb3B5X2ZpbGVuYW1lIChCb290RmlsZSwgcywgc2l6ZW9mIChCb290RmlsZSkpOwogCX0KLSNlbmRpZgkvKiBDRkdfQ01EX05FVCAqLworI2VuZGlmCiAKICNpZmRlZiBCT0FSRF9MQVRFX0lOSVQKIAlib2FyZF9sYXRlX2luaXQgKCk7CiAjZW5kaWYKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKICNpZiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpCiAJcHV0cyAoIk5ldDogICAiKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliX2F2cjMyL01ha2VmaWxlIGIvbGliX2F2cjMyL01ha2VmaWxlCmluZGV4IGNmMjA4MzYuLmJiMjkzOGYgMTAwNjQ0Ci0tLSBhL2xpYl9hdnIzMi9NYWtlZmlsZQorKysgYi9saWJfYXZyMzIvTWFrZWZpbGUKQEAgLTI5LDcgKzI5LDcgQEAKIAogU09CSlMJPSBtZW1zZXQubwogCi1DT0JKUwk9IGJvYXJkLm8gaW50ZXJydXB0cy5vIGF2cjMyX2xpbnV4Lm8gZGl2NjQubworQ09CSlMJPSBib2FyZC5vIGludGVycnVwdHMubyBhdnIzMl9saW51eC5vCiAKIFNSQ1MJOj0gJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKIE9CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlMpICQoQ09CSlMpKQpkaWZmIC0tZ2l0IGEvbGliX2F2cjMyL2F2cjMyX2xpbnV4LmMgYi9saWJfYXZyMzIvYXZyMzJfbGludXguYwppbmRleCA2MDk1ZTJmLi42MmFmYmQyIDEwMDY0NAotLS0gYS9saWJfYXZyMzIvYXZyMzJfbGludXguYworKysgYi9saWJfYXZyMzIvYXZyMzJfbGludXguYwpAQCAtMzYsMTMgKzM2LDYgQEAKIC8qIENQVS1zcGVjaWZpYyBob29rIHRvIGFsbG93IGZsdXNoaW5nIG9mIGNhY2hlcywgZXRjLiAqLwogZXh0ZXJuIHZvaWQgcHJlcGFyZV90b19ib290KHZvaWQpOwogCi0jaWZkZWYgQ09ORklHX1NIT1dfQk9PVF9QUk9HUkVTUwotIyBpbmNsdWRlIDxzdGF0dXNfbGVkLmg+Ci0jIGRlZmluZSBTSE9XX0JPT1RfUFJPR1JFU1MoYXJnKSBzaG93X2Jvb3RfcHJvZ3Jlc3MoYXJnKQotI2Vsc2UKLSMgZGVmaW5lIFNIT1dfQk9PVF9QUk9HUkVTUyhhcmcpCi0jZW5kaWYKLQogZXh0ZXJuIGltYWdlX2hlYWRlcl90IGhlYWRlcjsJCS8qIGZyb20gY21kX2Jvb3RtLmMgKi8KIAogc3RhdGljIHN0cnVjdCB0YWcgKnNldHVwX3N0YXJ0X3RhZyhzdHJ1Y3QgdGFnICpwYXJhbXMpCkBAIC0yMDQsNyArMTk3LDcgQEAKIAkgKiBDaGVjayBpZiB0aGVyZSBpcyBhbiBpbml0cmQgaW1hZ2UKIAkgKi8KIAlpZiAoYXJnYyA+PSAzKSB7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUyg5KTsKKwkJc2hvd19ib290X3Byb2dyZXNzICg5KTsKIAogCQlhZGRyID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTYpOwogCkBAIC0yMTUsNyArMjA4LDcgQEAKIAogCQlpZiAobnRvaGwoaGRyLT5paF9tYWdpYykgIT0gSUhfTUFHSUMpIHsKIAkJCXB1dHMoIkJhZCBNYWdpYyBOdW1iZXJcbiIpOwotCQkJU0hPV19CT09UX1BST0dSRVNTKC0xMCk7CisJCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC0xMCk7CiAJCQlkb19yZXNldChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CiAJCX0KIApAQCAtMjI2LDExICsyMTksMTEgQEAKIAogCQlpZiAoY3JjMzIoMCwgKHVuc2lnbmVkIGNoYXIgKilkYXRhLCBsZW4pICE9IGNoZWNrc3VtKSB7CiAJCQlwdXRzKCJCYWQgSGVhZGVyIENoZWNrc3VtXG4iKTsKLQkJCVNIT1dfQk9PVF9QUk9HUkVTUygtMTEpOworCQkJc2hvd19ib290X3Byb2dyZXNzICgtMTEpOwogCQkJZG9fcmVzZXQoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOwogCQl9CiAKLQkJU0hPV19CT09UX1BST0dSRVNTKDEwKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgxMCk7CiAKIAkJcHJpbnRfaW1hZ2VfaGRyKGhkcik7CiAKQEAgLTI0NCwyNiArMjM3LDI2IEBACiAJCQljc3VtID0gY3JjMzIoMCwgKHVuc2lnbmVkIGNoYXIgKilkYXRhLCBsZW4pOwogCQkJaWYgKGNzdW0gIT0gbnRvaGwoaGRyLT5paF9kY3JjKSkgewogCQkJCXB1dHMoIkJhZCBEYXRhIENSQ1xuIik7Ci0JCQkJU0hPV19CT09UX1BST0dSRVNTKC0xMik7CisJCQkJc2hvd19ib290X3Byb2dyZXNzICgtMTIpOwogCQkJCWRvX3Jlc2V0KGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKIAkJCX0KIAkJCXB1dHMoIk9LXG4iKTsKIAkJfQogCi0JCVNIT1dfQk9PVF9QUk9HUkVTUygxMSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoMTEpOwogCiAJCWlmICgoaGRyLT5paF9vcyAhPSBJSF9PU19MSU5VWCkgfHwKIAkJICAgIChoZHItPmloX2FyY2ggIT0gSUhfQ1BVX0FWUjMyKSB8fAogCQkgICAgKGhkci0+aWhfdHlwZSAhPSBJSF9UWVBFX1JBTURJU0spKSB7CiAJCQlwdXRzKCJOb3QgYSBMaW51eC9BVlIzMiBSQU1ESVNLIGltYWdlXG4iKTsKLQkJCVNIT1dfQk9PVF9QUk9HUkVTUygtMTMpOworCQkJc2hvd19ib290X3Byb2dyZXNzICgtMTMpOwogCQkJZG9fcmVzZXQoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOwogCQl9CiAJfSBlbHNlIGlmICgoaGRyLT5paF90eXBlID09IElIX1RZUEVfTVVMVEkpICYmIChsZW5fcHRyWzFdKSkgewogCQl1bG9uZyB0YWlsID0gbnRvaGwgKGxlbl9wdHJbMF0pICUgNDsKIAkJaW50IGk7CiAKLQkJU0hPV19CT09UX1BST0dSRVNTICgxMyk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoMTMpOwogCiAJCS8qIHNraXAga2VybmVsIGxlbmd0aCBhbmQgdGVybWluYXRvciAqLwogCQlkYXRhID0gKHVsb25nKSAoJmxlbl9wdHJbMl0pOwpAQCAtMjc5LDcgKzI3Miw3IEBACiAJCWxlbiA9IG50b2hsIChsZW5fcHRyWzFdKTsKIAl9IGVsc2UgewogCQkvKiBubyBpbml0cmQgaW1hZ2UgKi8KLQkJU0hPV19CT09UX1BST0dSRVNTKDE0KTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgxNCk7CiAJCWxlbiA9IGRhdGEgPSAwOwogCX0KIApAQCAtMjkxLDcgKzI4NCw3IEBACiAJCWluaXRyZF9lbmQgPSAwOwogCX0KIAotCVNIT1dfQk9PVF9QUk9HUkVTUygxNSk7CisJc2hvd19ib290X3Byb2dyZXNzICgxNSk7CiAKIAlwYXJhbXMgPSBwYXJhbXNfc3RhcnQgPSAoc3RydWN0IHRhZyAqKWdkLT5iZC0+YmlfYm9vdF9wYXJhbXM7CiAJcGFyYW1zID0gc2V0dXBfc3RhcnRfdGFnKHBhcmFtcyk7CmRpZmYgLS1naXQgYS9saWJfYXZyMzIvYm9hcmQuYyBiL2xpYl9hdnIzMi9ib2FyZC5jCmluZGV4IDI2NTMyOGEuLjhiOWNhMzggMTAwNjQ0Ci0tLSBhL2xpYl9hdnIzMi9ib2FyZC5jCisrKyBiL2xpYl9hdnIzMi9ib2FyZC5jCkBAIC0zMjgsNyArMzI4LDcgQEAKIAlqdW1wdGFibGVfaW5pdCgpOwogCWNvbnNvbGVfaW5pdF9yKCk7CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKICNpZiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpCiAJcHV0cygiTmV0OiAgICIpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJfYXZyMzIvZGl2NjQuYyBiL2xpYl9hdnIzMi9kaXY2NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTcyNmUzLi4wMDAwMDAwCi0tLSBhL2xpYl9hdnIzMi9kaXY2NC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMyBCZXJuYXJkbyBJbm5vY2VudGkgPGJlcm5pZUBkZXZlbGVyLmNvbT4KLSAqCi0gKiBCYXNlZCBvbiBmb3JtZXIgZG9fZGl2KCkgaW1wbGVtZW50YXRpb24gZnJvbSBhc20tcGFyaXNjL2RpdjY0Lmg6Ci0gKglDb3B5cmlnaHQgKEMpIDE5OTkgSGV3bGV0dC1QYWNrYXJkIENvCi0gKglDb3B5cmlnaHQgKEMpIDE5OTkgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgPGRhdmlkbUBocGwuaHAuY29tPgotICoKLSAqCi0gKiBHZW5lcmljIEMgdmVyc2lvbiBvZiA2NGJpdC8zMmJpdCBkaXZpc2lvbiBhbmQgbW9kdWxvLCB3aXRoCi0gKiA2NGJpdCByZXN1bHQgYW5kIDMyYml0IHJlbWFpbmRlci4KLSAqCi0gKiBUaGUgZmFzdCBjYXNlIGZvciAobj4+MzIgPT0gMCkgaXMgaGFuZGxlZCBpbmxpbmUgYnkgZG9fZGl2KCkuCi0gKgotICogQ29kZSBnZW5lcmF0ZWQgZm9yIHRoaXMgZnVuY3Rpb24gbWlnaHQgYmUgdmVyeSBpbmVmZmljaWVudAotICogZm9yIHNvbWUgQ1BVcy4gX19kaXY2NF8zMigpIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGxpbmtpbmcgYXJjaC1zcGVjaWZpYwotICogYXNzZW1ibHkgdmVyc2lvbnMgc3VjaCBhcyBhcmNoL3BwYy9saWIvZGl2NjQuUyBhbmQgYXJjaC9zaC9saWIvZGl2NjQuUy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgotCi11aW50MzJfdCBfX2RpdjY0XzMyKHVpbnQ2NF90ICpuLCB1aW50MzJfdCBiYXNlKQotewotCXVpbnQ2NF90IHJlbSA9ICpuOwotCXVpbnQ2NF90IGIgPSBiYXNlOwotCXVpbnQ2NF90IHJlcywgZCA9IDE7Ci0JdWludDMyX3QgaGlnaCA9IHJlbSA+PiAzMjsKLQotCS8qIFJlZHVjZSB0aGUgdGhpbmcgYSBiaXQgZmlyc3QgKi8KLQlyZXMgPSAwOwotCWlmIChoaWdoID49IGJhc2UpIHsKLQkJaGlnaCAvPSBiYXNlOwotCQlyZXMgPSAodWludDY0X3QpIGhpZ2ggPDwgMzI7Ci0JCXJlbSAtPSAodWludDY0X3QpIChoaWdoKmJhc2UpIDw8IDMyOwotCX0KLQotCXdoaWxlICgoaW50NjRfdCliID4gMCAmJiBiIDwgcmVtKSB7Ci0JCWIgPSBiK2I7Ci0JCWQgPSBkK2Q7Ci0JfQotCi0JZG8gewotCQlpZiAocmVtID49IGIpIHsKLQkJCXJlbSAtPSBiOwotCQkJcmVzICs9IGQ7Ci0JCX0KLQkJYiA+Pj0gMTsKLQkJZCA+Pj0gMTsKLQl9IHdoaWxlIChkKTsKLQotCSpuID0gcmVzOwotCXJldHVybiByZW07Ci19CmRpZmYgLS1naXQgYS9saWJfYmxhY2tmaW4vYmY1MzNfbGludXguYyBiL2xpYl9ibGFja2Zpbi9iZjUzM19saW51eC5jCmluZGV4IDNiOWM0ZGYuLjgwYTNkYzcgMTAwNjQ0Ci0tLSBhL2xpYl9ibGFja2Zpbi9iZjUzM19saW51eC5jCisrKyBiL2xpYl9ibGFja2Zpbi9iZjUzM19saW51eC5jCkBAIC0zNiwxMyArMzYsNiBAQAogI2RlZmluZQlMSU5VWF9NQVhfRU5WUwkJMjU2CiAjZGVmaW5lCUxJTlVYX01BWF9BUkdTCQkyNTYKIAotI2lmZGVmIENPTkZJR19TSE9XX0JPT1RfUFJPR1JFU1MKLSNpbmNsdWRlIDxzdGF0dXNfbGVkLmg+Ci0jZGVmaW5lIFNIT1dfQk9PVF9QUk9HUkVTUyhhcmcpCXNob3dfYm9vdF9wcm9ncmVzcyhhcmcpCi0jZWxzZQotI2RlZmluZSBTSE9XX0JPT1RfUFJPR1JFU1MoYXJnKQotI2VuZGlmCi0KICNkZWZpbmUgQ01EX0xJTkVfQUREUiAweEZGOTAwMDAwCS8qIEwxIHNjcmF0Y2hwYWQgKi8KIAogI2lmZGVmIFNIQVJFRF9SRVNPVVJDRVMKZGlmZiAtLWdpdCBhL2xpYl9ibGFja2Zpbi9ib2FyZC5jIGIvbGliX2JsYWNrZmluL2JvYXJkLmMKaW5kZXggMTUzOGRhMy4uMzZhOTY5ZSAxMDA2NDQKLS0tIGEvbGliX2JsYWNrZmluL2JvYXJkLmMKKysrIGIvbGliX2JsYWNrZmluL2JvYXJkLmMKQEAgLTI5Nyw3ICsyOTcsNyBAQAogCX0KIAogCWNoZWNrYm9hcmQoKTsKLSNpZiBkZWZpbmVkKENPTkZJR19SVENfQkY1MzMpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0JGNTMzKSAmJiBkZWZpbmVkKENPTkZJR19DTURfREFURSkKIAlydGNfaW5pdCgpOwogI2VuZGlmCiAJdGltZXJfaW5pdCgpOwpAQCAtMzkxLDEzICszOTEsMTMgQEAKIAlpZiAoKHMgPSBnZXRlbnYoImxvYWRhZGRyIikpICE9IE5VTEwpIHsKIAkJbG9hZF9hZGRyID0gc2ltcGxlX3N0cnRvdWwocywgTlVMTCwgMTYpOwogCX0KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIAlpZiAoKHMgPSBnZXRlbnYoImJvb3RmaWxlIikpICE9IE5VTEwpIHsKIAkJY29weV9maWxlbmFtZShCb290RmlsZSwgcywgc2l6ZW9mKEJvb3RGaWxlKSk7CiAJfQogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogCXB1dHMoIk5BTkQ6ICAiKTsKIAluYW5kX2luaXQoKTsJCS8qIGdvIGluaXQgdGhlIE5BTkQgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliX2JsYWNrZmluL3Bvc3QuYyBiL2xpYl9ibGFja2Zpbi9wb3N0LmMKaW5kZXggMGU3NjAyNi4uN2M5NDc4ZCAxMDA2NDQKLS0tIGEvbGliX2JsYWNrZmluL3Bvc3QuYworKysgYi9saWJfYmxhY2tmaW4vcG9zdC5jCkBAIC0xMzIsOSArMTMyLDcgQEAKIAkJCQlwb3N0X2xvZygiUEFTU0VEXG4iKTsKIAkJCWVsc2UgewogCQkJCXBvc3RfbG9nKCJGQUlMRURcbiIpOwotI2lmZGVmIENPTkZJR19TSE9XX0JPT1RfUFJPR1JFU1MKLQkJCQlzaG93X2Jvb3RfcHJvZ3Jlc3MoLTMxKTsKLSNlbmRpZgorCQkJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTMxKTsKIAkJCX0KIAkJfQogCX0KQEAgLTI0NSw5ICsyNDMsNyBAQAogCQl9IGVsc2UgewogCQkJaWYgKCgqdGVzdC0+dGVzdCkgKGZsYWdzKSAhPSAwKSB7CiAJCQkJcG9zdF9sb2coIkZBSUxFRFxuIik7Ci0jaWZkZWYgQ09ORklHX1NIT1dfQk9PVF9QUk9HUkVTUwotCQkJCXNob3dfYm9vdF9wcm9ncmVzcygtMzIpOwotI2VuZGlmCisJCQkJc2hvd19ib290X3Byb2dyZXNzICgtMzIpOwogCQkJfSBlbHNlCiAJCQkJcG9zdF9sb2coIlBBU1NFRFxuIik7CiAJCX0KZGlmZiAtLWdpdCBhL2xpYl9nZW5lcmljL01ha2VmaWxlIGIvbGliX2dlbmVyaWMvTWFrZWZpbGUKaW5kZXggZjAxMmNhYi4uYmYzNzc1MiAxMDA2NDQKLS0tIGEvbGliX2dlbmVyaWMvTWFrZWZpbGUKKysrIGIvbGliX2dlbmVyaWMvTWFrZWZpbGUKQEAgLTI3LDcgKzI3LDcgQEAKIAogQ09CSlMJPSBiemxpYi5vIGJ6bGliX2NyY3RhYmxlLm8gYnpsaWJfZGVjb21wcmVzcy5vIFwKIAkgIGJ6bGliX3JhbmR0YWJsZS5vIGJ6bGliX2h1ZmZtYW4ubyBcCi0JICBjcmMzMi5vIGN0eXBlLm8gZGlzcGxheV9vcHRpb25zLm8gbGRpdi5vIFwKKwkgIGNyYzMyLm8gY3R5cGUubyBkaXNwbGF5X29wdGlvbnMubyBkaXY2NC5vIGxkaXYubyBzaGExLm8gXAogCSAgc3RyaW5nLm8gdnNwcmludGYubyB6bGliLm8KIAogU1JDUyAJOj0gJChDT0JKUzoubz0uYykKZGlmZiAtLWdpdCBhL2xpYl9nZW5lcmljL2NyYzMyLmMgYi9saWJfZ2VuZXJpYy9jcmMzMi5jCmluZGV4IDNkOTliNjkuLmRmMGRiY2EgMTAwNjQ0Ci0tLSBhL2xpYl9nZW5lcmljL2NyYzMyLmMKKysrIGIvbGliX2dlbmVyaWMvY3JjMzIuYwpAQCAtOSw3ICs5LDcgQEAKICAqLwogCiAjaWZuZGVmIFVTRV9IT1NUQ0MJLyogU2h1dCBkb3duICJBTlNJIGRvZXMgbm90IHBlcm1pdC4uLiIgd2FybmluZ3MgKi8KLSNpbmNsdWRlIDxjb21tb24uaD4JLyogdG8gZ2V0IGNvbW1hbmQgZGVmaW5pdGlvbnMgbGlrZSBDRkdfQ01EX0pGRlMyICovCisjaW5jbHVkZSA8Y29tbW9uLmg+CiAjZW5kaWYKIAogI2luY2x1ZGUgInpsaWIuaCIKQEAgLTE3MSw4ICsxNzEsOSBAQAogICAgIHJldHVybiBjcmMgXiAweGZmZmZmZmZmTDsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0pGRlMyKSB8fCBcCi0JKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpICYmICFkZWZpbmVkKENGR19OQU5EX0xFR0FDWSkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0pGRlMyKSB8fCBcCisJKGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKSBcCisJJiYgIWRlZmluZWQoQ0ZHX05BTkRfTEVHQUNZKSkKIAogLyogTm8gb25lcyBjb21wbGVtZW50IHZlcnNpb24uIEpGRlMyIChhbmQgb3RoZXIgdGhpbmdzID8pCiAgKiBkb24ndCB1c2Ugb25lcyBjb21wbGltZW50IGluIHRoZWlyIENSQyBjYWxjdWxhdGlvbnMuCkBAIC0xOTUsNCArMTk2LDQgQEAKICAgICByZXR1cm4gY3JjOwogfQogCi0jZW5kaWYJLyogQ0ZHX0NNRF9KRkZTMiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJfZ2VuZXJpYy9kaXY2NC5jIGIvbGliX2dlbmVyaWMvZGl2NjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTk1MWI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliX2dlbmVyaWMvZGl2NjQuYwpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAzIEJlcm5hcmRvIElubm9jZW50aSA8YmVybmllQGRldmVsZXIuY29tPgorICoKKyAqIEJhc2VkIG9uIGZvcm1lciBkb19kaXYoKSBpbXBsZW1lbnRhdGlvbiBmcm9tIGFzbS1wYXJpc2MvZGl2NjQuaDoKKyAqCUNvcHlyaWdodCAoQykgMTk5OSBIZXdsZXR0LVBhY2thcmQgQ28KKyAqCUNvcHlyaWdodCAoQykgMTk5OSBEYXZpZCBNb3NiZXJnZXItVGFuZyA8ZGF2aWRtQGhwbC5ocC5jb20+CisgKgorICoKKyAqIEdlbmVyaWMgQyB2ZXJzaW9uIG9mIDY0Yml0LzMyYml0IGRpdmlzaW9uIGFuZCBtb2R1bG8sIHdpdGgKKyAqIDY0Yml0IHJlc3VsdCBhbmQgMzJiaXQgcmVtYWluZGVyLgorICoKKyAqIFRoZSBmYXN0IGNhc2UgZm9yIChuPj4zMiA9PSAwKSBpcyBoYW5kbGVkIGlubGluZSBieSBkb19kaXYoKS4KKyAqCisgKiBDb2RlIGdlbmVyYXRlZCBmb3IgdGhpcyBmdW5jdGlvbiBtaWdodCBiZSB2ZXJ5IGluZWZmaWNpZW50CisgKiBmb3Igc29tZSBDUFVzLiBfX2RpdjY0XzMyKCkgY2FuIGJlIG92ZXJyaWRkZW4gYnkgbGlua2luZyBhcmNoLXNwZWNpZmljCisgKiBhc3NlbWJseSB2ZXJzaW9ucyBzdWNoIGFzIGFyY2gvcHBjL2xpYi9kaXY2NC5TIGFuZCBhcmNoL3NoL2xpYi9kaXY2NC5TLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCit1aW50MzJfdCBfX2RpdjY0XzMyKHVpbnQ2NF90ICpuLCB1aW50MzJfdCBiYXNlKQoreworCXVpbnQ2NF90IHJlbSA9ICpuOworCXVpbnQ2NF90IGIgPSBiYXNlOworCXVpbnQ2NF90IHJlcywgZCA9IDE7CisJdWludDMyX3QgaGlnaCA9IHJlbSA+PiAzMjsKKworCS8qIFJlZHVjZSB0aGUgdGhpbmcgYSBiaXQgZmlyc3QgKi8KKwlyZXMgPSAwOworCWlmIChoaWdoID49IGJhc2UpIHsKKwkJaGlnaCAvPSBiYXNlOworCQlyZXMgPSAodWludDY0X3QpIGhpZ2ggPDwgMzI7CisJCXJlbSAtPSAodWludDY0X3QpIChoaWdoKmJhc2UpIDw8IDMyOworCX0KKworCXdoaWxlICgoaW50NjRfdCliID4gMCAmJiBiIDwgcmVtKSB7CisJCWIgPSBiK2I7CisJCWQgPSBkK2Q7CisJfQorCisJZG8geworCQlpZiAocmVtID49IGIpIHsKKwkJCXJlbSAtPSBiOworCQkJcmVzICs9IGQ7CisJCX0KKwkJYiA+Pj0gMTsKKwkJZCA+Pj0gMTsKKwl9IHdoaWxlIChkKTsKKworCSpuID0gcmVzOworCXJldHVybiByZW07Cit9CmRpZmYgLS1naXQgYS9saWJfZ2VuZXJpYy9zaGExLmMgYi9saWJfZ2VuZXJpYy9zaGExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhmZmE2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYl9nZW5lcmljL3NoYTEuYwpAQCAtMCwwICsxLDQxMyBAQAorLyoKKyAqICBIZWlrbyBTY2hvY2hlciwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgaHNAZGVueC5kZS4KKyAqICBiYXNlZCBvbjoKKyAqICBGSVBTLTE4MC0xIGNvbXBsaWFudCBTSEEtMSBpbXBsZW1lbnRhdGlvbgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNiAgQ2hyaXN0b3BoZSBEZXZpbmUKKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlLCB2ZXJzaW9uIDIuMSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAorICogIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworLyoKKyAqICBUaGUgU0hBLTEgc3RhbmRhcmQgd2FzIHB1Ymxpc2hlZCBieSBOSVNUIGluIDE5OTMuCisgKgorICogIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2ZpcHNwdWJzL2ZpcDE4MC0xLmh0bQorICovCisKKyNpZm5kZWYgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFCisjZGVmaW5lIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSAxCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgInNoYTEuaCIKKworLyoKKyAqIDMyLWJpdCBpbnRlZ2VyIG1hbmlwdWxhdGlvbiBtYWNyb3MgKGJpZyBlbmRpYW4pCisgKi8KKyNpZm5kZWYgR0VUX1VJTlQzMl9CRQorI2RlZmluZSBHRVRfVUlOVDMyX0JFKG4sYixpKSB7CQkJCVwKKwkobikgPSAoICh1bnNpZ25lZCBsb25nKSAoYilbKGkpICAgIF0gPDwgMjQgKQlcCisJICAgIHwgKCAodW5zaWduZWQgbG9uZykgKGIpWyhpKSArIDFdIDw8IDE2ICkJXAorCSAgICB8ICggKHVuc2lnbmVkIGxvbmcpIChiKVsoaSkgKyAyXSA8PCAgOCApCVwKKwkgICAgfCAoICh1bnNpZ25lZCBsb25nKSAoYilbKGkpICsgM10gICAgICAgKTsJXAorfQorI2VuZGlmCisjaWZuZGVmIFBVVF9VSU5UMzJfQkUKKyNkZWZpbmUgUFVUX1VJTlQzMl9CRShuLGIsaSkgewkJCQlcCisJKGIpWyhpKSAgICBdID0gKHVuc2lnbmVkIGNoYXIpICggKG4pID4+IDI0ICk7CVwKKwkoYilbKGkpICsgMV0gPSAodW5zaWduZWQgY2hhcikgKCAobikgPj4gMTYgKTsJXAorCShiKVsoaSkgKyAyXSA9ICh1bnNpZ25lZCBjaGFyKSAoIChuKSA+PiAgOCApOwlcCisJKGIpWyhpKSArIDNdID0gKHVuc2lnbmVkIGNoYXIpICggKG4pICAgICAgICk7CVwKK30KKyNlbmRpZgorCisvKgorICogU0hBLTEgY29udGV4dCBzZXR1cAorICovCit2b2lkIHNoYTFfc3RhcnRzIChzaGExX2NvbnRleHQgKiBjdHgpCit7CisJY3R4LT50b3RhbFswXSA9IDA7CisJY3R4LT50b3RhbFsxXSA9IDA7CisKKwljdHgtPnN0YXRlWzBdID0gMHg2NzQ1MjMwMTsKKwljdHgtPnN0YXRlWzFdID0gMHhFRkNEQUI4OTsKKwljdHgtPnN0YXRlWzJdID0gMHg5OEJBRENGRTsKKwljdHgtPnN0YXRlWzNdID0gMHgxMDMyNTQ3NjsKKwljdHgtPnN0YXRlWzRdID0gMHhDM0QyRTFGMDsKK30KKworc3RhdGljIHZvaWQgc2hhMV9wcm9jZXNzIChzaGExX2NvbnRleHQgKiBjdHgsIHVuc2lnbmVkIGNoYXIgZGF0YVs2NF0pCit7CisJdW5zaWduZWQgbG9uZyB0ZW1wLCBXWzE2XSwgQSwgQiwgQywgRCwgRTsKKworCUdFVF9VSU5UMzJfQkUgKFdbMF0sIGRhdGEsIDApOworCUdFVF9VSU5UMzJfQkUgKFdbMV0sIGRhdGEsIDQpOworCUdFVF9VSU5UMzJfQkUgKFdbMl0sIGRhdGEsIDgpOworCUdFVF9VSU5UMzJfQkUgKFdbM10sIGRhdGEsIDEyKTsKKwlHRVRfVUlOVDMyX0JFIChXWzRdLCBkYXRhLCAxNik7CisJR0VUX1VJTlQzMl9CRSAoV1s1XSwgZGF0YSwgMjApOworCUdFVF9VSU5UMzJfQkUgKFdbNl0sIGRhdGEsIDI0KTsKKwlHRVRfVUlOVDMyX0JFIChXWzddLCBkYXRhLCAyOCk7CisJR0VUX1VJTlQzMl9CRSAoV1s4XSwgZGF0YSwgMzIpOworCUdFVF9VSU5UMzJfQkUgKFdbOV0sIGRhdGEsIDM2KTsKKwlHRVRfVUlOVDMyX0JFIChXWzEwXSwgZGF0YSwgNDApOworCUdFVF9VSU5UMzJfQkUgKFdbMTFdLCBkYXRhLCA0NCk7CisJR0VUX1VJTlQzMl9CRSAoV1sxMl0sIGRhdGEsIDQ4KTsKKwlHRVRfVUlOVDMyX0JFIChXWzEzXSwgZGF0YSwgNTIpOworCUdFVF9VSU5UMzJfQkUgKFdbMTRdLCBkYXRhLCA1Nik7CisJR0VUX1VJTlQzMl9CRSAoV1sxNV0sIGRhdGEsIDYwKTsKKworI2RlZmluZSBTKHgsbikJKCh4IDw8IG4pIHwgKCh4ICYgMHhGRkZGRkZGRikgPj4gKDMyIC0gbikpKQorCisjZGVmaW5lIFIodCkgKAkJCQkJCVwKKwl0ZW1wID0gV1sodCAtICAzKSAmIDB4MEZdIF4gV1sodCAtIDgpICYgMHgwRl0gXglcCisJICAgICAgIFdbKHQgLSAxNCkgJiAweDBGXSBeIFdbIHQgICAgICAmIDB4MEZdLAlcCisJKCBXW3QgJiAweDBGXSA9IFModGVtcCwxKSApCQkJXAorKQorCisjZGVmaW5lIFAoYSxiLGMsZCxlLHgpCXsJCQkJXAorCWUgKz0gUyhhLDUpICsgRihiLGMsZCkgKyBLICsgeDsgYiA9IFMoYiwzMCk7CVwKK30KKworCUEgPSBjdHgtPnN0YXRlWzBdOworCUIgPSBjdHgtPnN0YXRlWzFdOworCUMgPSBjdHgtPnN0YXRlWzJdOworCUQgPSBjdHgtPnN0YXRlWzNdOworCUUgPSBjdHgtPnN0YXRlWzRdOworCisjZGVmaW5lIEYoeCx5LHopICh6IF4gKHggJiAoeSBeIHopKSkKKyNkZWZpbmUgSyAweDVBODI3OTk5CisKKwlQIChBLCBCLCBDLCBELCBFLCBXWzBdKTsKKwlQIChFLCBBLCBCLCBDLCBELCBXWzFdKTsKKwlQIChELCBFLCBBLCBCLCBDLCBXWzJdKTsKKwlQIChDLCBELCBFLCBBLCBCLCBXWzNdKTsKKwlQIChCLCBDLCBELCBFLCBBLCBXWzRdKTsKKwlQIChBLCBCLCBDLCBELCBFLCBXWzVdKTsKKwlQIChFLCBBLCBCLCBDLCBELCBXWzZdKTsKKwlQIChELCBFLCBBLCBCLCBDLCBXWzddKTsKKwlQIChDLCBELCBFLCBBLCBCLCBXWzhdKTsKKwlQIChCLCBDLCBELCBFLCBBLCBXWzldKTsKKwlQIChBLCBCLCBDLCBELCBFLCBXWzEwXSk7CisJUCAoRSwgQSwgQiwgQywgRCwgV1sxMV0pOworCVAgKEQsIEUsIEEsIEIsIEMsIFdbMTJdKTsKKwlQIChDLCBELCBFLCBBLCBCLCBXWzEzXSk7CisJUCAoQiwgQywgRCwgRSwgQSwgV1sxNF0pOworCVAgKEEsIEIsIEMsIEQsIEUsIFdbMTVdKTsKKwlQIChFLCBBLCBCLCBDLCBELCBSICgxNikpOworCVAgKEQsIEUsIEEsIEIsIEMsIFIgKDE3KSk7CisJUCAoQywgRCwgRSwgQSwgQiwgUiAoMTgpKTsKKwlQIChCLCBDLCBELCBFLCBBLCBSICgxOSkpOworCisjdW5kZWYgSworI3VuZGVmIEYKKworI2RlZmluZSBGKHgseSx6KSAoeCBeIHkgXiB6KQorI2RlZmluZSBLIDB4NkVEOUVCQTEKKworCVAgKEEsIEIsIEMsIEQsIEUsIFIgKDIwKSk7CisJUCAoRSwgQSwgQiwgQywgRCwgUiAoMjEpKTsKKwlQIChELCBFLCBBLCBCLCBDLCBSICgyMikpOworCVAgKEMsIEQsIEUsIEEsIEIsIFIgKDIzKSk7CisJUCAoQiwgQywgRCwgRSwgQSwgUiAoMjQpKTsKKwlQIChBLCBCLCBDLCBELCBFLCBSICgyNSkpOworCVAgKEUsIEEsIEIsIEMsIEQsIFIgKDI2KSk7CisJUCAoRCwgRSwgQSwgQiwgQywgUiAoMjcpKTsKKwlQIChDLCBELCBFLCBBLCBCLCBSICgyOCkpOworCVAgKEIsIEMsIEQsIEUsIEEsIFIgKDI5KSk7CisJUCAoQSwgQiwgQywgRCwgRSwgUiAoMzApKTsKKwlQIChFLCBBLCBCLCBDLCBELCBSICgzMSkpOworCVAgKEQsIEUsIEEsIEIsIEMsIFIgKDMyKSk7CisJUCAoQywgRCwgRSwgQSwgQiwgUiAoMzMpKTsKKwlQIChCLCBDLCBELCBFLCBBLCBSICgzNCkpOworCVAgKEEsIEIsIEMsIEQsIEUsIFIgKDM1KSk7CisJUCAoRSwgQSwgQiwgQywgRCwgUiAoMzYpKTsKKwlQIChELCBFLCBBLCBCLCBDLCBSICgzNykpOworCVAgKEMsIEQsIEUsIEEsIEIsIFIgKDM4KSk7CisJUCAoQiwgQywgRCwgRSwgQSwgUiAoMzkpKTsKKworI3VuZGVmIEsKKyN1bmRlZiBGCisKKyNkZWZpbmUgRih4LHkseikgKCh4ICYgeSkgfCAoeiAmICh4IHwgeSkpKQorI2RlZmluZSBLIDB4OEYxQkJDREMKKworCVAgKEEsIEIsIEMsIEQsIEUsIFIgKDQwKSk7CisJUCAoRSwgQSwgQiwgQywgRCwgUiAoNDEpKTsKKwlQIChELCBFLCBBLCBCLCBDLCBSICg0MikpOworCVAgKEMsIEQsIEUsIEEsIEIsIFIgKDQzKSk7CisJUCAoQiwgQywgRCwgRSwgQSwgUiAoNDQpKTsKKwlQIChBLCBCLCBDLCBELCBFLCBSICg0NSkpOworCVAgKEUsIEEsIEIsIEMsIEQsIFIgKDQ2KSk7CisJUCAoRCwgRSwgQSwgQiwgQywgUiAoNDcpKTsKKwlQIChDLCBELCBFLCBBLCBCLCBSICg0OCkpOworCVAgKEIsIEMsIEQsIEUsIEEsIFIgKDQ5KSk7CisJUCAoQSwgQiwgQywgRCwgRSwgUiAoNTApKTsKKwlQIChFLCBBLCBCLCBDLCBELCBSICg1MSkpOworCVAgKEQsIEUsIEEsIEIsIEMsIFIgKDUyKSk7CisJUCAoQywgRCwgRSwgQSwgQiwgUiAoNTMpKTsKKwlQIChCLCBDLCBELCBFLCBBLCBSICg1NCkpOworCVAgKEEsIEIsIEMsIEQsIEUsIFIgKDU1KSk7CisJUCAoRSwgQSwgQiwgQywgRCwgUiAoNTYpKTsKKwlQIChELCBFLCBBLCBCLCBDLCBSICg1NykpOworCVAgKEMsIEQsIEUsIEEsIEIsIFIgKDU4KSk7CisJUCAoQiwgQywgRCwgRSwgQSwgUiAoNTkpKTsKKworI3VuZGVmIEsKKyN1bmRlZiBGCisKKyNkZWZpbmUgRih4LHkseikgKHggXiB5IF4geikKKyNkZWZpbmUgSyAweENBNjJDMUQ2CisKKwlQIChBLCBCLCBDLCBELCBFLCBSICg2MCkpOworCVAgKEUsIEEsIEIsIEMsIEQsIFIgKDYxKSk7CisJUCAoRCwgRSwgQSwgQiwgQywgUiAoNjIpKTsKKwlQIChDLCBELCBFLCBBLCBCLCBSICg2MykpOworCVAgKEIsIEMsIEQsIEUsIEEsIFIgKDY0KSk7CisJUCAoQSwgQiwgQywgRCwgRSwgUiAoNjUpKTsKKwlQIChFLCBBLCBCLCBDLCBELCBSICg2NikpOworCVAgKEQsIEUsIEEsIEIsIEMsIFIgKDY3KSk7CisJUCAoQywgRCwgRSwgQSwgQiwgUiAoNjgpKTsKKwlQIChCLCBDLCBELCBFLCBBLCBSICg2OSkpOworCVAgKEEsIEIsIEMsIEQsIEUsIFIgKDcwKSk7CisJUCAoRSwgQSwgQiwgQywgRCwgUiAoNzEpKTsKKwlQIChELCBFLCBBLCBCLCBDLCBSICg3MikpOworCVAgKEMsIEQsIEUsIEEsIEIsIFIgKDczKSk7CisJUCAoQiwgQywgRCwgRSwgQSwgUiAoNzQpKTsKKwlQIChBLCBCLCBDLCBELCBFLCBSICg3NSkpOworCVAgKEUsIEEsIEIsIEMsIEQsIFIgKDc2KSk7CisJUCAoRCwgRSwgQSwgQiwgQywgUiAoNzcpKTsKKwlQIChDLCBELCBFLCBBLCBCLCBSICg3OCkpOworCVAgKEIsIEMsIEQsIEUsIEEsIFIgKDc5KSk7CisKKyN1bmRlZiBLCisjdW5kZWYgRgorCisJY3R4LT5zdGF0ZVswXSArPSBBOworCWN0eC0+c3RhdGVbMV0gKz0gQjsKKwljdHgtPnN0YXRlWzJdICs9IEM7CisJY3R4LT5zdGF0ZVszXSArPSBEOworCWN0eC0+c3RhdGVbNF0gKz0gRTsKK30KKworLyoKKyAqIFNIQS0xIHByb2Nlc3MgYnVmZmVyCisgKi8KK3ZvaWQgc2hhMV91cGRhdGUgKHNoYTFfY29udGV4dCAqIGN0eCwgdW5zaWduZWQgY2hhciAqaW5wdXQsIGludCBpbGVuKQoreworCWludCBmaWxsOworCXVuc2lnbmVkIGxvbmcgbGVmdDsKKworCWlmIChpbGVuIDw9IDApCisJCXJldHVybjsKKworCWxlZnQgPSBjdHgtPnRvdGFsWzBdICYgMHgzRjsKKwlmaWxsID0gNjQgLSBsZWZ0OworCisJY3R4LT50b3RhbFswXSArPSBpbGVuOworCWN0eC0+dG90YWxbMF0gJj0gMHhGRkZGRkZGRjsKKworCWlmIChjdHgtPnRvdGFsWzBdIDwgKHVuc2lnbmVkIGxvbmcpIGlsZW4pCisJCWN0eC0+dG90YWxbMV0rKzsKKworCWlmIChsZWZ0ICYmIGlsZW4gPj0gZmlsbCkgeworCQltZW1jcHkgKCh2b2lkICopIChjdHgtPmJ1ZmZlciArIGxlZnQpLCAodm9pZCAqKSBpbnB1dCwgZmlsbCk7CisJCXNoYTFfcHJvY2VzcyAoY3R4LCBjdHgtPmJ1ZmZlcik7CisJCWlucHV0ICs9IGZpbGw7CisJCWlsZW4gLT0gZmlsbDsKKwkJbGVmdCA9IDA7CisJfQorCisJd2hpbGUgKGlsZW4gPj0gNjQpIHsKKwkJc2hhMV9wcm9jZXNzIChjdHgsIGlucHV0KTsKKwkJaW5wdXQgKz0gNjQ7CisJCWlsZW4gLT0gNjQ7CisJfQorCisJaWYgKGlsZW4gPiAwKSB7CisJCW1lbWNweSAoKHZvaWQgKikgKGN0eC0+YnVmZmVyICsgbGVmdCksICh2b2lkICopIGlucHV0LCBpbGVuKTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHNoYTFfcGFkZGluZ1s2NF0gPSB7CisJMHg4MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCSAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAorfTsKKworLyoKKyAqIFNIQS0xIGZpbmFsIGRpZ2VzdAorICovCit2b2lkIHNoYTFfZmluaXNoIChzaGExX2NvbnRleHQgKiBjdHgsIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzIwXSkKK3sKKwl1bnNpZ25lZCBsb25nIGxhc3QsIHBhZG47CisJdW5zaWduZWQgbG9uZyBoaWdoLCBsb3c7CisJdW5zaWduZWQgY2hhciBtc2dsZW5bOF07CisKKwloaWdoID0gKGN0eC0+dG90YWxbMF0gPj4gMjkpCisJCXwgKGN0eC0+dG90YWxbMV0gPDwgMyk7CisJbG93ID0gKGN0eC0+dG90YWxbMF0gPDwgMyk7CisKKwlQVVRfVUlOVDMyX0JFIChoaWdoLCBtc2dsZW4sIDApOworCVBVVF9VSU5UMzJfQkUgKGxvdywgbXNnbGVuLCA0KTsKKworCWxhc3QgPSBjdHgtPnRvdGFsWzBdICYgMHgzRjsKKwlwYWRuID0gKGxhc3QgPCA1NikgPyAoNTYgLSBsYXN0KSA6ICgxMjAgLSBsYXN0KTsKKworCXNoYTFfdXBkYXRlIChjdHgsICh1bnNpZ25lZCBjaGFyICopIHNoYTFfcGFkZGluZywgcGFkbik7CisJc2hhMV91cGRhdGUgKGN0eCwgbXNnbGVuLCA4KTsKKworCVBVVF9VSU5UMzJfQkUgKGN0eC0+c3RhdGVbMF0sIG91dHB1dCwgMCk7CisJUFVUX1VJTlQzMl9CRSAoY3R4LT5zdGF0ZVsxXSwgb3V0cHV0LCA0KTsKKwlQVVRfVUlOVDMyX0JFIChjdHgtPnN0YXRlWzJdLCBvdXRwdXQsIDgpOworCVBVVF9VSU5UMzJfQkUgKGN0eC0+c3RhdGVbM10sIG91dHB1dCwgMTIpOworCVBVVF9VSU5UMzJfQkUgKGN0eC0+c3RhdGVbNF0sIG91dHB1dCwgMTYpOworfQorCisvKgorICogT3V0cHV0ID0gU0hBLTEoIGlucHV0IGJ1ZmZlciApCisgKi8KK3ZvaWQgc2hhMV9jc3VtICh1bnNpZ25lZCBjaGFyICppbnB1dCwgaW50IGlsZW4sIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzIwXSkKK3sKKwlzaGExX2NvbnRleHQgY3R4OworCisJc2hhMV9zdGFydHMgKCZjdHgpOworCXNoYTFfdXBkYXRlICgmY3R4LCBpbnB1dCwgaWxlbik7CisJc2hhMV9maW5pc2ggKCZjdHgsIG91dHB1dCk7Cit9CisKKy8qCisgKiBPdXRwdXQgPSBITUFDLVNIQS0xKCBpbnB1dCBidWZmZXIsIGhtYWMga2V5ICkKKyAqLwordm9pZCBzaGExX2htYWMgKHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwKKwkJdW5zaWduZWQgY2hhciAqaW5wdXQsIGludCBpbGVuLCB1bnNpZ25lZCBjaGFyIG91dHB1dFsyMF0pCit7CisJaW50IGk7CisJc2hhMV9jb250ZXh0IGN0eDsKKwl1bnNpZ25lZCBjaGFyIGtfaXBhZFs2NF07CisJdW5zaWduZWQgY2hhciBrX29wYWRbNjRdOworCXVuc2lnbmVkIGNoYXIgdG1wYnVmWzIwXTsKKworCW1lbXNldCAoa19pcGFkLCAweDM2LCA2NCk7CisJbWVtc2V0IChrX29wYWQsIDB4NUMsIDY0KTsKKworCWZvciAoaSA9IDA7IGkgPCBrZXlsZW47IGkrKykgeworCQlpZiAoaSA+PSA2NCkKKwkJCWJyZWFrOworCisJCWtfaXBhZFtpXSBePSBrZXlbaV07CisJCWtfb3BhZFtpXSBePSBrZXlbaV07CisJfQorCisJc2hhMV9zdGFydHMgKCZjdHgpOworCXNoYTFfdXBkYXRlICgmY3R4LCBrX2lwYWQsIDY0KTsKKwlzaGExX3VwZGF0ZSAoJmN0eCwgaW5wdXQsIGlsZW4pOworCXNoYTFfZmluaXNoICgmY3R4LCB0bXBidWYpOworCisJc2hhMV9zdGFydHMgKCZjdHgpOworCXNoYTFfdXBkYXRlICgmY3R4LCBrX29wYWQsIDY0KTsKKwlzaGExX3VwZGF0ZSAoJmN0eCwgdG1wYnVmLCAyMCk7CisJc2hhMV9maW5pc2ggKCZjdHgsIG91dHB1dCk7CisKKwltZW1zZXQgKGtfaXBhZCwgMCwgNjQpOworCW1lbXNldCAoa19vcGFkLCAwLCA2NCk7CisJbWVtc2V0ICh0bXBidWYsIDAsIDIwKTsKKwltZW1zZXQgKCZjdHgsIDAsIHNpemVvZiAoc2hhMV9jb250ZXh0KSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIF9zaGExX3NyY1tdID0gIl9zaGExX3NyYyI7CisKKyNpZmRlZiBTRUxGX1RFU1QKKy8qCisgKiBGSVBTLTE4MC0xIHRlc3QgdmVjdG9ycworICovCitzdGF0aWMgY29uc3QgY2hhciBzaGExX3Rlc3Rfc3RyWzNdWzU3XSA9IHsKKwl7ImFiYyJ9LAorCXsiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpamhpamtpamtsamtsbWtsbW5sbW5vbW5vcG5vcHEifSwKKwl7IiJ9Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBzaGExX3Rlc3Rfc3VtWzNdWzIwXSA9IHsKKwl7MHhBOSwgMHg5OSwgMHgzRSwgMHgzNiwgMHg0NywgMHgwNiwgMHg4MSwgMHg2QSwgMHhCQSwgMHgzRSwKKwkgMHgyNSwgMHg3MSwgMHg3OCwgMHg1MCwgMHhDMiwgMHg2QywgMHg5QywgMHhEMCwgMHhEOCwgMHg5RH0sCisJezB4ODQsIDB4OTgsIDB4M0UsIDB4NDQsIDB4MUMsIDB4M0IsIDB4RDIsIDB4NkUsIDB4QkEsIDB4QUUsCisJIDB4NEEsIDB4QTEsIDB4RjksIDB4NTEsIDB4MjksIDB4RTUsIDB4RTUsIDB4NDYsIDB4NzAsIDB4RjF9LAorCXsweDM0LCAweEFBLCAweDk3LCAweDNDLCAweEQ0LCAweEM0LCAweERBLCAweEE0LCAweEY2LCAweDFFLAorCSAweEVCLCAweDJCLCAweERCLCAweEFELCAweDI3LCAweDMxLCAweDY1LCAweDM0LCAweDAxLCAweDZGfQorfTsKKworLyoKKyAqIENoZWNrdXAgcm91dGluZQorICovCitpbnQgc2hhMV9zZWxmX3Rlc3QgKHZvaWQpCit7CisJaW50IGksIGo7CisJdW5zaWduZWQgY2hhciBidWZbMTAwMF07CisJdW5zaWduZWQgY2hhciBzaGExc3VtWzIwXTsKKwlzaGExX2NvbnRleHQgY3R4OworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlwcmludGYgKCIgIFNIQS0xIHRlc3QgIyVkOiAiLCBpICsgMSk7CisKKwkJc2hhMV9zdGFydHMgKCZjdHgpOworCisJCWlmIChpIDwgMikKKwkJCXNoYTFfdXBkYXRlICgmY3R4LCAodW5zaWduZWQgY2hhciAqKSBzaGExX3Rlc3Rfc3RyW2ldLAorCQkJCSAgICAgc3RybGVuIChzaGExX3Rlc3Rfc3RyW2ldKSk7CisJCWVsc2UgeworCQkJbWVtc2V0IChidWYsICdhJywgMTAwMCk7CisJCQlmb3IgKGogPSAwOyBqIDwgMTAwMDsgaisrKQorCQkJCXNoYTFfdXBkYXRlICgmY3R4LCBidWYsIDEwMDApOworCQl9CisKKwkJc2hhMV9maW5pc2ggKCZjdHgsIHNoYTFzdW0pOworCisJCWlmIChtZW1jbXAgKHNoYTFzdW0sIHNoYTFfdGVzdF9zdW1baV0sIDIwKSAhPSAwKSB7CisJCQlwcmludGYgKCJmYWlsZWRcbiIpOworCQkJcmV0dXJuICgxKTsKKwkJfQorCisJCXByaW50ZiAoInBhc3NlZFxuIik7CisJfQorCisJcHJpbnRmICgiXG4iKTsKKwlyZXR1cm4gKDApOworfQorI2Vsc2UKK2ludCBzaGExX3NlbGZfdGVzdCAodm9pZCkKK3sKKwlyZXR1cm4gKDApOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJfaTM4Ni9ib2FyZC5jIGIvbGliX2kzODYvYm9hcmQuYwppbmRleCA0MTc1ZmRiLi40N2ZiYWI0IDEwMDY0NAotLS0gYS9saWJfaTM4Ni9ib2FyZC5jCisrKyBiL2xpYl9pMzg2L2JvYXJkLmMKQEAgLTMxMywxMyArMzEzLDEzIEBACiAJbWlzY19pbml0X3IoKTsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUENNQ0lBKSAmJiAhKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QQ01DSUEpICYmICFkZWZpbmVkKENPTkZJR19DTURfSURFKQogCVdBVENIRE9HX1JFU0VUKCk7CiAJcHV0cyAoIlBDTUNJQToiKTsKIAlwY21jaWFfaW5pdCgpOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCVdBVENIRE9HX1JFU0VUKCk7CiAJcHV0cygiS0dEQjogICIpOwogCWtnZGJfaW5pdCgpOwpAQCAtMzQ4LDMzICszNDgsMzMgQEAKIAlpZiAoKHMgPSBnZXRlbnYgKCJsb2FkYWRkciIpKSAhPSBOVUxMKSB7CiAJCWxvYWRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsIChzLCBOVUxMLCAxNik7CiAJfQotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCWlmICgocyA9IGdldGVudiAoImJvb3RmaWxlIikpICE9IE5VTEwpIHsKIAkJY29weV9maWxlbmFtZSAoQm9vdEZpbGUsIHMsIHNpemVvZiAoQm9vdEZpbGUpKTsKIAl9Ci0jZW5kaWYgLyogQ0ZHX0NNRF9ORVQgKi8KKyNlbmRpZgogCiAJV0FUQ0hET0dfUkVTRVQoKTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKQogCVdBVENIRE9HX1JFU0VUKCk7CiAJcHV0cygiSURFOiAgICIpOwogCWlkZV9pbml0KCk7Ci0jZW5kaWYgLyogQ0ZHX0NNRF9JREUgKi8KKyNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU0NTSSkKIAlXQVRDSERPR19SRVNFVCgpOwogCXB1dHMoIlNDU0k6ICAiKTsKIAlzY3NpX2luaXQoKTsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRE9DKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ET0MpCiAJV0FUQ0hET0dfUkVTRVQoKTsKIAlwdXRzKCJET0M6ICAgIik7CiAJZG9jX2luaXQoKTsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAjaWYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKQogCVdBVENIRE9HX1JFU0VUKCk7CiAJcHV0cygiTmV0OiAgICIpOwpAQCAtMzgyLDcgKzM4Miw3IEBACiAJZXRoX2luaXRpYWxpemUoZ2QtPmJkKTsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiAoMCkKKyNpZiAoIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpKSAmJiAoMCkKIAlXQVRDSERPR19SRVNFVCgpOwogIyBpZmRlZiBERUJVRwogCXB1dHMgKCJSZXNldCBFdGhlcm5ldCBQSFlcbiIpOwpkaWZmIC0tZ2l0IGEvbGliX202OGsvYm9hcmQuYyBiL2xpYl9tNjhrL2JvYXJkLmMKaW5kZXggNmFhZjYwOS4uMjkzZmQwNCAxMDA2NDQKLS0tIGEvbGliX202OGsvYm9hcmQuYworKysgYi9saWJfbTY4ay9ib2FyZC5jCkBAIC0zNCwyMCArMzQsMjAgQEAKICNpbmNsdWRlIDxhc20vaW1tYXBfNTI3Mi5oPgogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkKICNpbmNsdWRlIDxpZGUuaD4KICNlbmRpZgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NDU0kpCiAjaW5jbHVkZSA8c2NzaS5oPgogI2VuZGlmCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNpbmNsdWRlIDxrZ2RiLmg+CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfU1RBVFVTX0xFRAogI2luY2x1ZGUgPHN0YXR1c19sZWQuaD4KICNlbmRpZgogI2luY2x1ZGUgPG5ldC5oPgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0JFREJVRykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQogI2luY2x1ZGUgPGNtZF9iZWRidWcuaD4KICNlbmRpZgogI2lmZGVmIENGR19BTExPQ19EUFJBTQpAQCAtNTg0LDcgKzU4NCw3IEBACiAJbWlzY19pbml0X3IgKCk7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAJV0FUQ0hET0dfUkVTRVQgKCk7CiAJcHV0cyAoIktHREI6ICAiKTsKIAlrZ2RiX2luaXQgKCk7CkBAIC02MjAsMjcgKzYyMCwyNyBAQAogCWlmICgocyA9IGdldGVudiAoImxvYWRhZGRyIikpICE9IE5VTEwpIHsKIAkJbG9hZF9hZGRyID0gc2ltcGxlX3N0cnRvdWwgKHMsIE5VTEwsIDE2KTsKIAl9Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAJaWYgKChzID0gZ2V0ZW52ICgiYm9vdGZpbGUiKSkgIT0gTlVMTCkgewogCQljb3B5X2ZpbGVuYW1lIChCb290RmlsZSwgcywgc2l6ZW9mIChCb290RmlsZSkpOwogCX0KLSNlbmRpZiAvKiBDRkdfQ01EX05FVCAqLworI2VuZGlmCiAKIAlXQVRDSERPR19SRVNFVCAoKTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RPQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRE9DKQogCVdBVENIRE9HX1JFU0VUICgpOwogCXB1dHMgKCJET0M6ICAgIik7CiAJZG9jX2luaXQgKCk7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiAJV0FUQ0hET0dfUkVTRVQgKCk7CiAJcHV0cyAoIk5BTkQ6ICAiKTsKIAluYW5kX2luaXQoKTsJCS8qIGdvIGluaXQgdGhlIE5BTkQgKi8KICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBkZWZpbmVkKEZFQ19FTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmIGRlZmluZWQoRkVDX0VORVQpCiAJV0FUQ0hET0dfUkVTRVQoKTsKIAlldGhfaW5pdChiZCk7CiAjZW5kaWYKQEAgLTY1OSw3ICs2NTksNyBAQAogCWxhc3Rfc3RhZ2VfaW5pdCAoKTsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQkVEQlVHKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCiAJV0FUQ0hET0dfUkVTRVQgKCk7CiAJYmVkYnVnX2luaXQgKCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYl9tNjhrL202OGtfbGludXguYyBiL2xpYl9tNjhrL202OGtfbGludXguYwppbmRleCBmODdmNTZlLi42YzE5NGY4IDEwMDY0NAotLS0gYS9saWJfbTY4ay9tNjhrX2xpbnV4LmMKKysrIGIvbGliX202OGsvbTY4a19saW51eC5jCkBAIC0zNCwxMyArMzQsNiBAQAogI2RlZmluZSBMSU5VWF9NQVhfRU5WUwkJMjU2CiAjZGVmaW5lIExJTlVYX01BWF9BUkdTCQkyNTYKIAotI2lmZGVmIENPTkZJR19TSE9XX0JPT1RfUFJPR1JFU1MKLSMgaW5jbHVkZSA8c3RhdHVzX2xlZC5oPgotIyBkZWZpbmUgU0hPV19CT09UX1BST0dSRVNTKGFyZykJc2hvd19ib290X3Byb2dyZXNzKGFyZykKLSNlbHNlCi0jIGRlZmluZSBTSE9XX0JPT1RfUFJPR1JFU1MoYXJnKQotI2VuZGlmCi0KIGV4dGVybiBpbWFnZV9oZWFkZXJfdCBoZWFkZXI7CS8qIGZyb20gY21kX2Jvb3RtLmMgKi8KIAogZXh0ZXJuIGludCBkb19yZXNldCAoY21kX3RibF90ICogY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKTsKQEAgLTczLDcgKzY2LDcgQEAKIAkgKiBDaGVjayBpZiB0aGVyZSBpcyBhbiBpbml0cmQgaW1hZ2UKIAkgKi8KIAlpZiAoYXJnYyA+PSAzKSB7Ci0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoOSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoOSk7CiAKIAkJYWRkciA9IHNpbXBsZV9zdHJ0b3VsIChhcmd2WzJdLCBOVUxMLCAxNik7CiAKQEAgLTg0LDcgKzc3LDcgQEAKIAogCQlpZiAobnRvaGwgKGhkci0+aWhfbWFnaWMpICE9IElIX01BR0lDKSB7CiAJCQlwcmludGYgKCJCYWQgTWFnaWMgTnVtYmVyXG4iKTsKLQkJCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEwKTsKKwkJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTEwKTsKIAkJCWRvX3Jlc2V0IChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CiAJCX0KIApAQCAtOTYsMTEgKzg5LDExIEBACiAKIAkJaWYgKGNyYzMyICgwLCAoY2hhciAqKSBkYXRhLCBsZW4pICE9IGNoZWNrc3VtKSB7CiAJCQlwcmludGYgKCJCYWQgSGVhZGVyIENoZWNrc3VtXG4iKTsKLQkJCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTExKTsKKwkJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTExKTsKIAkJCWRvX3Jlc2V0IChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CiAJCX0KIAotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKDEwKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgxMCk7CiAKIAkJcHJpbnRfaW1hZ2VfaGRyIChoZHIpOwogCkBAIC0xMTQsMTkgKzEwNywxOSBAQAogCQkJY3N1bSA9IGNyYzMyICgwLCAoY2hhciAqKSBkYXRhLCBsZW4pOwogCQkJaWYgKGNzdW0gIT0gbnRvaGwgKGhkci0+aWhfZGNyYykpIHsKIAkJCQlwcmludGYgKCJCYWQgRGF0YSBDUkNcbiIpOwotCQkJCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEyKTsKKwkJCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC0xMik7CiAJCQkJZG9fcmVzZXQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKIAkJCX0KIAkJCXByaW50ZiAoIk9LXG4iKTsKIAkJfQogCi0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoMTEpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDExKTsKIAogCQlpZiAoKGhkci0+aWhfb3MgIT0gSUhfT1NfTElOVVgpIHx8CiAJCSAgICAoaGRyLT5paF9hcmNoICE9IElIX0NQVV9NNjhLKSB8fAogCQkgICAgKGhkci0+aWhfdHlwZSAhPSBJSF9UWVBFX1JBTURJU0spKSB7CiAJCQlwcmludGYgKCJObyBMaW51eCBNNjhLIFJhbWRpc2sgSW1hZ2VcbiIpOwotCQkJU0hPV19CT09UX1BST0dSRVNTICgtMTMpOworCQkJc2hvd19ib290X3Byb2dyZXNzICgtMTMpOwogCQkJZG9fcmVzZXQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKIAkJfQogCkBAIC0xMzcsNyArMTMwLDcgQEAKIAkJdWxvbmcgdGFpbCA9IG50b2hsIChsZW5fcHRyWzBdKSAlIDQ7CiAJCWludCBpOwogCi0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoMTMpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDEzKTsKIAogCQkvKiBza2lwIGtlcm5lbCBsZW5ndGggYW5kIHRlcm1pbmF0b3IgKi8KIAkJZGF0YSA9ICh1bG9uZykgKCZsZW5fcHRyWzJdKTsKQEAgLTE1Niw3ICsxNDksNyBAQAogCQkvKgogCQkgKiBubyBpbml0cmQgaW1hZ2UKIAkJICovCi0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoMTQpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDE0KTsKIAogCQlkYXRhID0gMDsKIAl9CkBAIC0xNzUsNyArMTY4LDcgQEAKIAkJaW5pdHJkX2VuZCA9IDA7CiAJfQogCi0JU0hPV19CT09UX1BST0dSRVNTICgxNSk7CisJc2hvd19ib290X3Byb2dyZXNzICgxNSk7CiAKICNpZmRlZiBERUJVRwogCXByaW50ZiAoIiMjIFRyYW5zZmVycmluZyBjb250cm9sIHRvIExpbnV4IChhdCBhZGRyZXNzICUwOGx4KSAuLi5cbiIsCmRpZmYgLS1naXQgYS9saWJfbWljcm9ibGF6ZS9ib2FyZC5jIGIvbGliX21pY3JvYmxhemUvYm9hcmQuYwppbmRleCBjOTUxMjVhLi4wOWQ0ZDk0IDEwMDY0NAotLS0gYS9saWJfbWljcm9ibGF6ZS9ib2FyZC5jCisrKyBiL2xpYl9taWNyb2JsYXplL2JvYXJkLmMKQEAgLTQwLDcgKzQwLDcgQEAKICNpZmRlZiBDRkdfSU5UQ18wCiBleHRlcm4gaW50IGludGVycnVwdHNfaW5pdCAodm9pZCk7CiAjZW5kaWYKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkKIGV4dGVybiBpbnQgZXRoX2luaXQgKGJkX3QgKiBiaXMpOwogZXh0ZXJuIGludCBnZXRlbnZfSVBhZGRyIChjaGFyICopOwogI2VuZGlmCkBAIC0xMDgsNyArMTA4LDcgQEAKIAliZF90ICpiZDsKIAlpbml0X2ZuY190ICoqaW5pdF9mbmNfcHRyOwogCWdkID0gKGdkX3QgKikgQ0ZHX0dCTF9EQVRBX09GRlNFVDsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9GTEFTSCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRkxBU0gpCiAJdWxvbmcgZmxhc2hfc2l6ZSA9IDA7CiAjZW5kaWYKIAlhc20gKCJub3AiKTsJLyogRklYTUUgZ2QgaXMgbm90IGluaXRpYWxpemUgLSB3YWl0ICovCkBAIC0xMzAsNyArMTMwLDcgQEAKIAkJfQogCX0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZMQVNIKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9GTEFTSCkKIAliZC0+YmlfZmxhc2hzdGFydCA9IENGR19GTEFTSF9CQVNFOwogCWlmICgwIDwgKGZsYXNoX3NpemUgPSBmbGFzaF9pbml0ICgpKSkgewogCQliZC0+YmlfZmxhc2hzaXplID0gZmxhc2hfc2l6ZTsKQEAgLTE0Myw3ICsxNDMsNyBAQAogCX0KICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAJY2hhciAqcywgKmU7CiAJaW50IGk7CiAJLyogYm9hcmQgTUFDIGFkZHJlc3MgKi8KZGlmZiAtLWdpdCBhL2xpYl9taWNyb2JsYXplL21pY3JvYmxhemVfbGludXguYyBiL2xpYl9taWNyb2JsYXplL21pY3JvYmxhemVfbGludXguYwppbmRleCAyYzc4ODVjLi42OGI1OGQ0IDEwMDY0NAotLS0gYS9saWJfbWljcm9ibGF6ZS9taWNyb2JsYXplX2xpbnV4LmMKKysrIGIvbGliX21pY3JvYmxhemUvbWljcm9ibGF6ZV9saW51eC5jCkBAIC0zMiwxMyArMzIsNiBAQAogCiBERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKIAotI2lmZGVmIENPTkZJR19TSE9XX0JPT1RfUFJPR1JFU1MKLSMgaW5jbHVkZSA8c3RhdHVzX2xlZC5oPgotIyBkZWZpbmUgU0hPV19CT09UX1BST0dSRVNTKGFyZykgICAgICAgIHNob3dfYm9vdF9wcm9ncmVzcyhhcmcpCi0jZWxzZQotIyBkZWZpbmUgU0hPV19CT09UX1BST0dSRVNTKGFyZykKLSNlbmRpZgotCiBleHRlcm4gaW1hZ2VfaGVhZGVyX3QgaGVhZGVyOwkvKiBmcm9tIGNtZF9ib290bS5jICovCiAvKmNtZF9ib290LmMqLwogZXh0ZXJuIGludCBkb19yZXNldCAoY21kX3RibF90ICogY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKTsKQEAgLTU5LDcgKzUyLDcgQEAKIAogCS8qIENoZWNrIGlmIHRoZXJlIGlzIGFuIGluaXRyZCBpbWFnZSAqLwogCWlmIChhcmdjID49IDMpIHsKLQkJU0hPV19CT09UX1BST0dSRVNTICg5KTsKKwkJc2hvd19ib290X3Byb2dyZXNzICg5KTsKIAogCQlhZGRyID0gc2ltcGxlX3N0cnRvdWwgKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKIApAQCAtNzAsNyArNjMsNyBAQAogCiAJCWlmIChudG9obCAoaGRyLT5paF9tYWdpYykgIT0gSUhfTUFHSUMpIHsKIAkJCXByaW50ZiAoIkJhZCBNYWdpYyBOdW1iZXJcbiIpOwotCQkJU0hPV19CT09UX1BST0dSRVNTICgtMTApOworCQkJc2hvd19ib290X3Byb2dyZXNzICgtMTApOwogCQkJZG9fcmVzZXQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKIAkJfQogCkBAIC04MiwxMSArNzUsMTEgQEAKIAogCQlpZiAoY3JjMzIgKDAsIChjaGFyICopZGF0YSwgbGVuKSAhPSBjaGVja3N1bSkgewogCQkJcHJpbnRmICgiQmFkIEhlYWRlciBDaGVja3N1bVxuIik7Ci0JCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xMSk7CisJCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC0xMSk7CiAJCQlkb19yZXNldCAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOwogCQl9CiAKLQkJU0hPV19CT09UX1BST0dSRVNTICgxMCk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoMTApOwogCiAJCXByaW50X2ltYWdlX2hkciAoaGRyKTsKIApAQCAtMTAwLDE5ICs5MywxOSBAQAogCQkJY3N1bSA9IGNyYzMyICgwLCAoY2hhciAqKWRhdGEsIGxlbik7CiAJCQlpZiAoY3N1bSAhPSBudG9obCAoaGRyLT5paF9kY3JjKSkgewogCQkJCXByaW50ZiAoIkJhZCBEYXRhIENSQ1xuIik7Ci0JCQkJU0hPV19CT09UX1BST0dSRVNTICgtMTIpOworCQkJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTEyKTsKIAkJCQlkb19yZXNldCAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOwogCQkJfQogCQkJcHJpbnRmICgiT0tcbiIpOwogCQl9CiAKLQkJU0hPV19CT09UX1BST0dSRVNTICgxMSk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoMTEpOwogCiAJCWlmICgoaGRyLT5paF9vcyAhPSBJSF9PU19MSU5VWCkgfHwKIAkJICAgIChoZHItPmloX2FyY2ggIT0gSUhfQ1BVX01JQ1JPQkxBWkUpIHx8CiAJCSAgICAoaGRyLT5paF90eXBlICE9IElIX1RZUEVfUkFNRElTSykpIHsKIAkJCXByaW50ZiAoIk5vIExpbnV4IE1pY3JvYmxhemUgUmFtZGlzayBJbWFnZVxuIik7Ci0JCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xMyk7CisJCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC0xMyk7CiAJCQlkb19yZXNldCAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOwogCQl9CiAKQEAgLTEyMiw3ICsxMTUsNyBAQAogCX0gZWxzZSBpZiAoKGhkci0+aWhfdHlwZSA9PSBJSF9UWVBFX01VTFRJKSAmJiAobGVuX3B0clsxXSkpIHsKIAkJdWxvbmcgdGFpbCA9IG50b2hsIChsZW5fcHRyWzBdKSAlIDQ7CiAKLQkJU0hPV19CT09UX1BST0dSRVNTICgxMyk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoMTMpOwogCiAJCS8qIHNraXAga2VybmVsIGxlbmd0aCBhbmQgdGVybWluYXRvciAqLwogCQlkYXRhID0gKHVsb25nKSAoJmxlbl9wdHJbMl0pOwpAQCAtMTQxLDcgKzEzNCw3IEBACiAJCS8qCiAJCSAqIG5vIGluaXRyZCBpbWFnZQogCQkgKi8KLQkJU0hPV19CT09UX1BST0dSRVNTICgxNCk7CisJCXNob3dfYm9vdF9wcm9ncmVzcyAoMTQpOwogCiAJCWRhdGEgPSAwOwogCX0KQEAgLTE2MCw3ICsxNTMsNyBAQAogCQlpbml0cmRfZW5kID0gMDsKIAl9CiAKLQlTSE9XX0JPT1RfUFJPR1JFU1MgKDE1KTsKKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDE1KTsKIAogI2lmZGVmIERFQlVHCiAJcHJpbnRmICgiIyMgVHJhbnNmZXJyaW5nIGNvbnRyb2wgdG8gTGludXggKGF0IGFkZHJlc3MgJTA4bHgpIC4uLlxuIiwKZGlmZiAtLWdpdCBhL2xpYl9taXBzL2JvYXJkLmMgYi9saWJfbWlwcy9ib2FyZC5jCmluZGV4IGI3ZDMzNTYuLjkxY2NlYzAgMTAwNjQ0Ci0tLSBhL2xpYl9taXBzL2JvYXJkLmMKKysrIGIvbGliX21pcHMvYm9hcmQuYwpAQCAtMzk5LDE4ICszOTksMTggQEAKIAlpZiAoKHMgPSBnZXRlbnYgKCJsb2FkYWRkciIpKSAhPSBOVUxMKSB7CiAJCWxvYWRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsIChzLCBOVUxMLCAxNik7CiAJfQotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCWlmICgocyA9IGdldGVudiAoImJvb3RmaWxlIikpICE9IE5VTEwpIHsKIAkJY29weV9maWxlbmFtZSAoQm9vdEZpbGUsIHMsIHNpemVvZiAoQm9vdEZpbGUpKTsKIAl9Ci0jZW5kaWYJLyogQ0ZHX0NNRF9ORVQgKi8KKyNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfTUlTQ19JTklUX1IpCiAJLyogbWlzY2VsbGFuZW91cyBwbGF0Zm9ybSBkZXBlbmRlbnQgaW5pdGlhbGlzYXRpb25zICovCiAJbWlzY19pbml0X3IgKCk7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogI2lmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkKIAlwdXRzICgiTmV0OiAgICIpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJfbWlwcy9taXBzX2xpbnV4LmMgYi9saWJfbWlwcy9taXBzX2xpbnV4LmMKaW5kZXggOTUyZDVhOS4uNTU2YjE4MCAxMDA2NDQKLS0tIGEvbGliX21pcHMvbWlwc19saW51eC5jCisrKyBiL2xpYl9taXBzL21pcHNfbGludXguYwpAQCAtMzMsMTMgKzMzLDYgQEAKICNkZWZpbmUJTElOVVhfTUFYX0VOVlMJCTI1NgogI2RlZmluZQlMSU5VWF9NQVhfQVJHUwkJMjU2CiAKLSNpZmRlZiBDT05GSUdfU0hPV19CT09UX1BST0dSRVNTCi0jIGluY2x1ZGUgPHN0YXR1c19sZWQuaD4KLSMgZGVmaW5lIFNIT1dfQk9PVF9QUk9HUkVTUyhhcmcpCXNob3dfYm9vdF9wcm9ncmVzcyhhcmcpCi0jZWxzZQotIyBkZWZpbmUgU0hPV19CT09UX1BST0dSRVNTKGFyZykKLSNlbmRpZgotCiBleHRlcm4gaW1hZ2VfaGVhZGVyX3QgaGVhZGVyOyAgICAgICAgICAgLyogZnJvbSBjbWRfYm9vdG0uYyAqLwogCiBleHRlcm4gaW50IGRvX3Jlc2V0IChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7CkBAIC03Myw3ICs2Niw3IEBACiAJICogQ2hlY2sgaWYgdGhlcmUgaXMgYW4gaW5pdHJkIGltYWdlCiAJICovCiAJaWYgKGFyZ2MgPj0gMykgewotCQlTSE9XX0JPT1RfUFJPR1JFU1MgKDkpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDkpOwogCiAJCWFkZHIgPSBzaW1wbGVfc3RydG91bCAoYXJndlsyXSwgTlVMTCwgMTYpOwogCkBAIC04NCw3ICs3Nyw3IEBACiAKIAkJaWYgKG50b2hsIChoZHItPmloX21hZ2ljKSAhPSBJSF9NQUdJQykgewogCQkJcHJpbnRmICgiQmFkIE1hZ2ljIE51bWJlclxuIik7Ci0JCQlTSE9XX0JPT1RfUFJPR1JFU1MgKC0xMCk7CisJCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC0xMCk7CiAJCQlkb19yZXNldCAoY21kdHAsIGZsYWcsIGFyZ2MsIGFyZ3YpOwogCQl9CiAKQEAgLTk2LDExICs4OSwxMSBAQAogCiAJCWlmIChjcmMzMiAoMCwgKHVjaGFyICopIGRhdGEsIGxlbikgIT0gY2hlY2tzdW0pIHsKIAkJCXByaW50ZiAoIkJhZCBIZWFkZXIgQ2hlY2tzdW1cbiIpOwotCQkJU0hPV19CT09UX1BST0dSRVNTICgtMTEpOworCQkJc2hvd19ib290X3Byb2dyZXNzICgtMTEpOwogCQkJZG9fcmVzZXQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKIAkJfQogCi0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoMTApOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDEwKTsKIAogCQlwcmludF9pbWFnZV9oZHIgKGhkcik7CiAKQEAgLTExNCwxOSArMTA3LDE5IEBACiAJCQljc3VtID0gY3JjMzIgKDAsICh1Y2hhciAqKSBkYXRhLCBsZW4pOwogCQkJaWYgKGNzdW0gIT0gbnRvaGwgKGhkci0+aWhfZGNyYykpIHsKIAkJCQlwcmludGYgKCJCYWQgRGF0YSBDUkNcbiIpOwotCQkJCVNIT1dfQk9PVF9QUk9HUkVTUyAoLTEyKTsKKwkJCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC0xMik7CiAJCQkJZG9fcmVzZXQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKIAkJCX0KIAkJCXByaW50ZiAoIk9LXG4iKTsKIAkJfQogCi0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoMTEpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDExKTsKIAogCQlpZiAoKGhkci0+aWhfb3MgIT0gSUhfT1NfTElOVVgpIHx8CiAJCSAgICAoaGRyLT5paF9hcmNoICE9IElIX0NQVV9NSVBTKSB8fAogCQkgICAgKGhkci0+aWhfdHlwZSAhPSBJSF9UWVBFX1JBTURJU0spKSB7CiAJCQlwcmludGYgKCJObyBMaW51eCBNSVBTIFJhbWRpc2sgSW1hZ2VcbiIpOwotCQkJU0hPV19CT09UX1BST0dSRVNTICgtMTMpOworCQkJc2hvd19ib290X3Byb2dyZXNzICgtMTMpOwogCQkJZG9fcmVzZXQgKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKIAkJfQogCkBAIC0xMzcsNyArMTMwLDcgQEAKIAkJdWxvbmcgdGFpbCA9IG50b2hsIChsZW5fcHRyWzBdKSAlIDQ7CiAJCWludCBpOwogCi0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoMTMpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDEzKTsKIAogCQkvKiBza2lwIGtlcm5lbCBsZW5ndGggYW5kIHRlcm1pbmF0b3IgKi8KIAkJZGF0YSA9ICh1bG9uZykgKCZsZW5fcHRyWzJdKTsKQEAgLTE1Niw3ICsxNDksNyBAQAogCQkvKgogCQkgKiBubyBpbml0cmQgaW1hZ2UKIAkJICovCi0JCVNIT1dfQk9PVF9QUk9HUkVTUyAoMTQpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDE0KTsKIAogCQlkYXRhID0gMDsKIAl9CkBAIC0xNzUsNyArMTY4LDcgQEAKIAkJaW5pdHJkX2VuZCA9IDA7CiAJfQogCi0JU0hPV19CT09UX1BST0dSRVNTICgxNSk7CisJc2hvd19ib290X3Byb2dyZXNzICgxNSk7CiAKICNpZmRlZiBERUJVRwogCXByaW50ZiAoIiMjIFRyYW5zZmVycmluZyBjb250cm9sIHRvIExpbnV4IChhdCBhZGRyZXNzICUwOGx4KSAuLi5cbiIsCmRpZmYgLS1naXQgYS9saWJfcHBjL2JvYXJkLmMgYi9saWJfcHBjL2JvYXJkLmMKaW5kZXggOWU4NWNkZC4uYzg3ZDQ2YyAxMDA2NDQKLS0tIGEvbGliX3BwYy9ib2FyZC5jCisrKyBiL2xpYl9wcGMvYm9hcmQuYwpAQCAtMzUsMTMgKzM1LDEzIEBACiAjaWZkZWYgQ09ORklHX01QQzV4eHgKICNpbmNsdWRlIDxtcGM1eHh4Lmg+CiAjZW5kaWYKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkKICNpbmNsdWRlIDxpZGUuaD4KICNlbmRpZgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NDU0kpCiAjaW5jbHVkZSA8c2NzaS5oPgogI2VuZGlmCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfS0dEQikKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKICNpbmNsdWRlIDxrZ2RiLmg+CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfU1RBVFVTX0xFRApAQCAtNzYsMTggKzc2LDE4IEBACiBleHRlcm4gaW50IHVwZGF0ZV9mbGFzaF9zaXplIChpbnQgZmxhc2hfc2l6ZSk7CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX1NPTElEQ0FSRDMpCisjaWYgZGVmaW5lZChDT05GSUdfU0MzKQogZXh0ZXJuIHZvaWQgc2MzX3JlYWRfZWVwcm9tKHZvaWQpOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ET0MpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RPQykKIHZvaWQgZG9jX2luaXQgKHZvaWQpOwogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfSEFSRF9JMkMpIHx8IFwKICAgICBkZWZpbmVkKENPTkZJR19TT0ZUX0kyQykKICNpbmNsdWRlIDxpMmMuaD4KICNlbmRpZgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05BTkQpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05BTkQpCiB2b2lkIG5hbmRfaW5pdCAodm9pZCk7CiAjZW5kaWYKIApAQCAtMTE4LDcgKzExOCw3IEBACiBleHRlcm4gdWxvbmcgX2VuZDsKIHVsb25nIG1vbml0b3JfZmxhc2hfbGVuOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQkVEQlVHKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCiAjaW5jbHVkZSA8YmVkYnVnL3R5cGUuaD4KICNlbmRpZgogCkBAIC0xMzksMTAgKzEzOSwxMCBAQAogICovCiBzdGF0aWMgdm9pZCBtZW1fbWFsbG9jX2luaXQgKHZvaWQpCiB7Ci0JdWxvbmcgZGVzdF9hZGRyID0gQ0ZHX01PTklUT1JfQkFTRSArIGdkLT5yZWxvY19vZmY7Ci0KLQltZW1fbWFsbG9jX2VuZCA9IGRlc3RfYWRkcjsKLQltZW1fbWFsbG9jX3N0YXJ0ID0gZGVzdF9hZGRyIC0gVE9UQUxfTUFMTE9DX0xFTjsKKyNpZiAhZGVmaW5lZChDT05GSUdfUkVMT0NfRklYVVBfV09SS1MpCisJbWVtX21hbGxvY19lbmQgPSBDRkdfTU9OSVRPUl9CQVNFICsgZ2QtPnJlbG9jX29mZjsKKyNlbmRpZgorCW1lbV9tYWxsb2Nfc3RhcnQgPSBtZW1fbWFsbG9jX2VuZCAtIFRPVEFMX01BTExPQ19MRU47CiAJbWVtX21hbGxvY19icmsgPSBtZW1fbWFsbG9jX3N0YXJ0OwogCiAJbWVtc2V0ICgodm9pZCAqKSBtZW1fbWFsbG9jX3N0YXJ0LApAQCAtMzA5LDcgKzMwOSw5IEBACiAJcHJ0XzgyNjBfcnNyLAogCXBydF84MjYwX2Nsa3MsCiAjZW5kaWYgLyogQ09ORklHXzgyNjAgKi8KLQorI2lmIGRlZmluZWQoQ09ORklHX01QQzgzWFgpCisJcHJ0XzgzeHhfcnNyLAorI2VuZGlmCiAJY2hlY2tjcHUsCiAjaWYgZGVmaW5lZChDT05GSUdfTVBDNXh4eCkKIAlwcnRfbXBjNXh4eF9jbGtzLApAQCAtMzc2LDcgKzM3OCw3IEBACiAJLyogY29tcGlsZXIgb3B0aW1pemF0aW9uIGJhcnJpZXIgbmVlZGVkIGZvciBHQ0MgPj0gMy40ICovCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oIiI6IDogOiJtZW1vcnkiKTsKIAotI2lmICFkZWZpbmVkKENPTkZJR19DUE0yKQorI2lmICFkZWZpbmVkKENPTkZJR19DUE0yKSAmJiAhZGVmaW5lZChDT05GSUdfTVBDODNYWCkKIAkvKiBDbGVhciBpbml0aWFsIGdsb2JhbCBkYXRhICovCiAJbWVtc2V0ICgodm9pZCAqKSBnZCwgMCwgc2l6ZW9mIChnZF90KSk7CiAjZW5kaWYKQEAgLTYyMCw3ICs2MjIsMTMgQEAKIAliZCA9IGdkLT5iZDsKIAogCWdkLT5mbGFncyB8PSBHRF9GTEdfUkVMT0M7CS8qIHRlbGwgb3RoZXJzOiByZWxvY2F0aW9uIGRvbmUgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1JFTE9DX0ZJWFVQX1dPUktTKQorCWdkLT5yZWxvY19vZmYgPSAwOworCW1lbV9tYWxsb2NfZW5kID0gZGVzdF9hZGRyOworI2Vsc2UKIAlnZC0+cmVsb2Nfb2ZmID0gZGVzdF9hZGRyIC0gQ0ZHX01PTklUT1JfQkFTRTsKKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1NFUklBTF9NVUxUSQogCXNlcmlhbF9pbml0aWFsaXplKCk7CkBAIC03NzksNyArNzg3LDcgQEAKIAlzcGlfaW5pdF9yICgpOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9OQU5EKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9OQU5EKQogCVdBVENIRE9HX1JFU0VUICgpOwogCXB1dHMgKCJOQU5EOiAgIik7CiAJbmFuZF9pbml0KCk7CQkvKiBnbyBpbml0IHRoZSBOQU5EICovCkBAIC04MjAsNyArODI4LDcgQEAKICNlbmRpZgkvKiBDT05GSUdfNDA1R1AsIENPTkZJR180MDVFUCAqLwogI2VuZGlmCS8qIENGR19FWFRCRElORk8gKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX1NPTElEQ0FSRDMpCisjaWYgZGVmaW5lZChDT05GSUdfU0MzKQogCXNjM19yZWFkX2VlcHJvbSgpOwogI2VuZGlmCiAJcyA9IGdldGVudiAoImV0aGFkZHIiKTsKQEAgLTg5Niw3ICs5MDQsOCBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfVFFNOHh4TCkgfHwgZGVmaW5lZChDT05GSUdfVFFNODI2MCkgfHwgXAogICAgIGRlZmluZWQoQ09ORklHX1RRTTgyNzIpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19DQ00pIHx8IGRlZmluZWQoQ09ORklHX0tVUDRLKSB8fCBkZWZpbmVkKENPTkZJR19LVVA0WCkKKyAgICBkZWZpbmVkKENPTkZJR19DQ00pIHx8IGRlZmluZWQoQ09ORklHX0tVUDRLKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfS1VQNFgpIHx8IGRlZmluZWQoQ09ORklHX1BDUzQ0MEVQKQogCWxvYWRfc2VybnVtX2V0aGFkZHIgKCk7CiAjZW5kaWYKIAkvKiBJUCBBZGRyZXNzICovCkBAIC05MjksNyArOTM4LDcgQEAKICAgICBkZWZpbmVkKENPTkZJR19LVVA0WCkJfHwgXAogICAgIGRlZmluZWQoQ09ORklHX0xXTU9OKQl8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfUENVX0UpCXx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19TT0xJRENBUkQzKQl8fCBcCisgICAgZGVmaW5lZChDT05GSUdfU0MzKQkJfHwgXAogICAgIGRlZmluZWQoQ09ORklHX1c3TykJCXx8IFwKICAgICBkZWZpbmVkKENPTkZJR19NSVNDX0lOSVRfUikKIAkvKiBtaXNjZWxsYW5lb3VzIHBsYXRmb3JtIGRlcGVuZGVudCBpbml0aWFsaXNhdGlvbnMgKi8KQEAgLTk0MSw3ICs5NTAsNyBAQAogCQloZXJtZXNfc3RhcnRfbHh0OTgwICgoaW50KSBiZC0+YmlfZXRoc3BlZWQpOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQogCVdBVENIRE9HX1JFU0VUICgpOwogCXB1dHMgKCJLR0RCOiAgIik7CiAJa2dkYl9pbml0ICgpOwpAQCAtOTYxLDcgKzk3MCw3IEBACiAJc2VyaWFsX2J1ZmZlcmVkX2luaXQoKTsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1NUQVRVU19MRUQKKyNpZiBkZWZpbmVkKENPTkZJR19TVEFUVVNfTEVEKSAmJiBkZWZpbmVkKFNUQVRVU19MRURfQk9PVCkKIAlzdGF0dXNfbGVkX3NldCAoU1RBVFVTX0xFRF9CT09ULCBTVEFUVVNfTEVEX0JMSU5LSU5HKTsKICNlbmRpZgogCkBAIC05NzMsMjcgKzk4MiwyNyBAQAogCWlmICgocyA9IGdldGVudiAoImxvYWRhZGRyIikpICE9IE5VTEwpIHsKIAkJbG9hZF9hZGRyID0gc2ltcGxlX3N0cnRvdWwgKHMsIE5VTEwsIDE2KTsKIAl9Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAJaWYgKChzID0gZ2V0ZW52ICgiYm9vdGZpbGUiKSkgIT0gTlVMTCkgewogCQljb3B5X2ZpbGVuYW1lIChCb290RmlsZSwgcywgc2l6ZW9mIChCb290RmlsZSkpOwogCX0KLSNlbmRpZiAvKiBDRkdfQ01EX05FVCAqLworI2VuZGlmCiAKIAlXQVRDSERPR19SRVNFVCAoKTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NDU0kpCiAJV0FUQ0hET0dfUkVTRVQgKCk7CiAJcHV0cyAoIlNDU0k6ICAiKTsKIAlzY3NpX2luaXQgKCk7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RPQykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfRE9DKQogCVdBVENIRE9HX1JFU0VUICgpOwogCXB1dHMgKCJET0M6ICAgIik7CiAJZG9jX2luaXQgKCk7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogI2lmIGRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkKIAlXQVRDSERPR19SRVNFVCAoKTsKIAlwdXRzICgiTmV0OiAgICIpOwpAQCAtMTAwMSw3ICsxMDEwLDcgQEAKIAlldGhfaW5pdGlhbGl6ZSAoYmQpOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmICggXAorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmICggXAogICAgIGRlZmluZWQoQ09ORklHX0NDTSkJCXx8IFwKICAgICBkZWZpbmVkKENPTkZJR19FTFBUODYwKQl8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfRVA4MjYwKQl8fCBcCkBAIC0xMDI2LDEzICsxMDM1LDE0IEBACiAJcG9zdF9ydW4gKE5VTEwsIFBPU1RfUkFNIHwgcG9zdF9ib290bW9kZV9nZXQoMCkpOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QQ01DSUEpICYmICEoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BDTUNJQSkgXAorICAgICYmICFkZWZpbmVkKENPTkZJR19DTURfSURFKQogCVdBVENIRE9HX1JFU0VUICgpOwogCXB1dHMgKCJQQ01DSUE6Iik7CiAJcGNtY2lhX2luaXQgKCk7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKQogCVdBVENIRE9HX1JFU0VUICgpOwogIyBpZmRlZglDT05GSUdfSURFXzh4eF9QQ0NBUkQKIAlwdXRzICgiUENNQ0lBOiIpOwpAQCAtMTA0NSw3ICsxMDU1LDcgQEAKICNlbHNlCiAJaWRlX2luaXQgKCk7CiAjZW5kaWYKLSNlbmRpZiAvKiBDRkdfQ01EX0lERSAqLworI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfTEFTVF9TVEFHRV9JTklUCiAJV0FUQ0hET0dfUkVTRVQgKCk7CkBAIC0xMDU3LDcgKzEwNjcsNyBAQAogCWxhc3Rfc3RhZ2VfaW5pdCAoKTsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQkVEQlVHKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCiAJV0FUQ0hET0dfUkVTRVQgKCk7CiAJYmVkYnVnX2luaXQgKCk7CiAjZW5kaWYKQEAgLTExMTYsOSArMTEyNiw3IEBACiB2b2lkIGhhbmcgKHZvaWQpCiB7CiAJcHV0cyAoIiMjIyBFUlJPUiAjIyMgUGxlYXNlIFJFU0VUIHRoZSBib2FyZCAjIyNcbiIpOwotI2lmZGVmIENPTkZJR19TSE9XX0JPT1RfUFJPR1JFU1MKIAlzaG93X2Jvb3RfcHJvZ3Jlc3MoLTMwKTsKLSNlbmRpZgogCWZvciAoOzspOwogfQogCmRpZmYgLS1naXQgYS9saWJfcHBjL2V4dGFibGUuYyBiL2xpYl9wcGMvZXh0YWJsZS5jCmluZGV4IGIxNGQ2NjEuLjgzNTQ0MTEgMTAwNjQ0Ci0tLSBhL2xpYl9wcGMvZXh0YWJsZS5jCisrKyBiL2xpYl9wcGMvZXh0YWJsZS5jCkBAIC01MiwzMCArNTIsMjcgQEAKIAkJIGNvbnN0IHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKmxhc3QsCiAJCSB1bnNpZ25lZCBsb25nIHZhbHVlKQogewotCXdoaWxlIChmaXJzdCA8PSBsYXN0KSB7Ci0JCWNvbnN0IHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKm1pZDsKLQkJbG9uZyBkaWZmOwotCi0JCW1pZCA9IChsYXN0IC0gZmlyc3QpIC8gMiArIGZpcnN0OwotCQlpZiAoKHVsb25nKSBtaWQgPiBDRkdfTU9OSVRPUl9CQVNFKSB7Ci0JCQkvKiBleGNlcHRpb24gb2NjdXJzIGluIEZMQVNILCBiZWZvcmUgdS1ib290IHJlbG9jYXRpb24uCi0JCQkgKiBObyByZWxvY2F0aW9uIG9mZnNldCBpcyBuZWVkZWQuCi0JCQkgKi8KLQkJCWRpZmYgPSBtaWQtPmluc24gLSB2YWx1ZTsKKwlsb25nIGRpZmY7CisJaWYgKCh1bG9uZykgZmlyc3QgPiBDRkdfTU9OSVRPUl9CQVNFKSB7CisJCS8qIGV4Y2VwdGlvbiBvY2N1cnMgaW4gRkxBU0gsIGJlZm9yZSB1LWJvb3QgcmVsb2NhdGlvbi4KKwkJICogTm8gcmVsb2NhdGlvbiBvZmZzZXQgaXMgbmVlZGVkLgorCQkgKi8KKwkJd2hpbGUgKGZpcnN0IDw9IGxhc3QpIHsKKwkJCWRpZmYgPSBmaXJzdC0+aW5zbiAtIHZhbHVlOwogCQkJaWYgKGRpZmYgPT0gMCkKLQkJCQlyZXR1cm4gbWlkLT5maXh1cDsKLQkJfSBlbHNlIHsKLQkJCS8qIGV4Y2VwdGlvbiBvY2N1cnMgaW4gUkFNLCBhZnRlciB1LWJvb3QgcmVsb2NhdGlvbi4KLQkJCSAqIEEgcmVsb2NhdGlvbiBvZmZzZXQgc2hvdWxkIGJlIGFkZGVkLgotCQkJICovCi0JCQlkaWZmID0gKG1pZC0+aW5zbiArIGdkLT5yZWxvY19vZmYpIC0gdmFsdWU7Ci0JCQlpZiAoZGlmZiA9PSAwKQotCQkJCXJldHVybiAobWlkLT5maXh1cCArIGdkLT5yZWxvY19vZmYpOworCQkJCXJldHVybiBmaXJzdC0+Zml4dXA7CisJCQlmaXJzdCsrOwogCQl9Ci0JCWlmIChkaWZmIDwgMCkKLQkJCWZpcnN0ID0gbWlkICsgMTsKLQkJZWxzZQotCQkJbGFzdCA9IG1pZCAtIDE7CisJfSBlbHNlIHsKKwkJLyogZXhjZXB0aW9uIG9jY3VycyBpbiBSQU0sIGFmdGVyIHUtYm9vdCByZWxvY2F0aW9uLgorCQkgKiBBIHJlbG9jYXRpb24gb2Zmc2V0IHNob3VsZCBiZSBhZGRlZC4KKwkJICovCisJCXdoaWxlIChmaXJzdCA8PSBsYXN0KSB7CisJCQlkaWZmID0gKGZpcnN0LT5pbnNuICsgZ2QtPnJlbG9jX29mZikgLSB2YWx1ZTsKKwkJCWlmIChkaWZmID09IDApCisJCQkJcmV0dXJuIChmaXJzdC0+Zml4dXAgKyBnZC0+cmVsb2Nfb2ZmKTsKKwkJCWZpcnN0Kys7CisJCX0KIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9saWJfcHBjL2tnZGIuYyBiL2xpYl9wcGMva2dkYi5jCmluZGV4IDRjNWQ3OWEuLjc4YzJmMGMgMTAwNjQ0Ci0tLSBhL2xpYl9wcGMva2dkYi5jCisrKyBiL2xpYl9wcGMva2dkYi5jCkBAIC0xLDcgKzEsNyBAQAogI2luY2x1ZGUgPGNvbW1vbi5oPgogI2luY2x1ZGUgPGNvbW1hbmQuaD4KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0tHREIpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCiAKICNpbmNsdWRlIDxrZ2RiLmg+CiAjaW5jbHVkZSA8YXNtL3NpZ25hbC5oPgpAQCAtMzIzLDQgKzMyMyw0IEBACiAJICAgICIpOwogfQogCi0jZW5kaWYgLyogQ0ZHX0NNRF9LR0RCICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmZkdC9mZHQuYyBiL2xpYmZkdC9mZHQuYwppbmRleCAyMTJiODM4Li4xZWU2N2FkIDEwMDY0NAotLS0gYS9saWJmZHQvZmR0LmMKKysrIGIvbGliZmR0L2ZkdC5jCkBAIC0xNiw2ICsxNiw5IEBACiAgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lmIENPTkZJR19PRl9MSUJGRFQKKwogI2luY2x1ZGUgImxpYmZkdF9lbnYuaCIKIAogI2luY2x1ZGUgPGZkdC5oPgpAQCAtODMsMyArODYsNSBAQAogCW1lbW1vdmUoYnVmLCBmZHQsIGZkdF90b3RhbHNpemUoZmR0KSk7CiAJcmV0dXJuIDA7CiB9CisKKyNlbmRpZiAvKiBDT05GSUdfT0ZfTElCRkRUICovCmRpZmYgLS1naXQgYS9saWJmZHQvZmR0X3JvLmMgYi9saWJmZHQvZmR0X3JvLmMKaW5kZXggNGUyYzMyNS4uNDZkNTI1ZCAxMDA2NDQKLS0tIGEvbGliZmR0L2ZkdF9yby5jCisrKyBiL2xpYmZkdC9mZHRfcm8uYwpAQCAtMTYsNiArMTYsOSBAQAogICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAgKi8KKyNpbmNsdWRlICJjb25maWcuaCIKKyNpZiBDT05GSUdfT0ZfTElCRkRUCisKICNpbmNsdWRlICJsaWJmZHRfZW52LmgiCiAKICNpbmNsdWRlIDxmZHQuaD4KQEAgLTQ4LDYgKzUxLDMzIEBACiB9CiAKIC8qCisgKiBDaGVja3MgaWYgdGhlIHByb3BlcnR5IG5hbWUgbWF0Y2hlcy4KKyAqLworc3RhdGljIGludCBwcm9wX25hbWVfZXEoY29uc3Qgdm9pZCAqZmR0LCBpbnQgb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lLAorCQkJc3RydWN0IGZkdF9wcm9wZXJ0eSAqKnByb3AsIGludCAqbGVucCkKK3sKKwlpbnQgbmFtZXN0cm9mZiwgbGVuOworCisJKnByb3AgPSBmZHRfb2Zmc2V0X3B0cl90eXBlZChmZHQsIG9mZnNldCwgKnByb3ApOworCWlmICghICpwcm9wKQorCQlyZXR1cm4gLUZEVF9FUlJfQkFEU1RSVUNUVVJFOworCisJbmFtZXN0cm9mZiA9IGZkdDMyX3RvX2NwdSgoKnByb3ApLT5uYW1lb2ZmKTsKKwlpZiAoc3RyZXEoZmR0X3N0cmluZyhmZHQsIG5hbWVzdHJvZmYpLCBuYW1lKSkgeworCQlsZW4gPSBmZHQzMl90b19jcHUoKCpwcm9wKS0+bGVuKTsKKwkJKnByb3AgPSBmZHRfb2Zmc2V0X3B0cihmZHQsIG9mZnNldCwKKwkJCQkgICAgICAgc2l6ZW9mKCoqcHJvcCkgKyBsZW4pOworCQlpZiAoKnByb3ApIHsKKwkJCWlmIChsZW5wKQorCQkJCSpsZW5wID0gbGVuOworCQkJcmV0dXJuIDE7CisJCX0gZWxzZQorCQkJcmV0dXJuIC1GRFRfRVJSX0JBRFNUUlVDVFVSRTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCiAgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgYXQgdGhlIGdpdmVuIHN0cmluZyBvZmZzZXQuCiAgKi8KIGNoYXIgKmZkdF9zdHJpbmcoY29uc3Qgdm9pZCAqZmR0LCBpbnQgc3Ryb2Zmc2V0KQpAQCAtNTYsNiArODYsMTE4IEBACiB9CiAKIC8qCisgKiBDaGVjayBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgaXMgY29tcGF0aWJsZSBieSBjb21wYXJpbmcgdGhlIHRva2VucworICogaW4gaXRzICJjb21wYXRpYmxlIiBwcm9wZXJ0eSB3aXRoIHRoZSBzcGVjaWZpZWQgc3RyaW5nOgorICoKKyAqICAgbm9kZW9mZnNldCAtIHN0YXJ0aW5nIHBsYWNlIG9mIHRoZSBub2RlCisgKiAgIGNvbXBhdCAgICAgLSB0aGUgc3RyaW5nIHRvIG1hdGNoIHRvIG9uZSBvZiB0aGUgdG9rZW5zIGluIHRoZQorICogICAgICAgICAgICAgICAgImNvbXBhdGlibGUiIGxpc3QuCisgKi8KK2ludCBmZHRfbm9kZV9pc19jb21wYXRpYmxlKGNvbnN0IHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsCisJCQkgICBjb25zdCBjaGFyICpjb21wYXQpCit7CisJY29uc3QgY2hhciogY3A7CisJaW50IGNwbGVuLCBsZW47CisKKwljcCA9IGZkdF9nZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgImNvbXBhdGlibGUiLCAmY3BsZW4pOworCWlmIChjcCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwl3aGlsZSAoY3BsZW4gPiAwKSB7CisJCWlmIChzdHJuY21wKGNwLCBjb21wYXQsIHN0cmxlbihjb21wYXQpKSA9PSAwKQorCQkJcmV0dXJuIDE7CisJCWxlbiA9IHN0cmxlbihjcCkgKyAxOworCQljcCArPSBsZW47CisJCWNwbGVuIC09IGxlbjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZpbmQgYSBub2RlIGJ5IGl0cyBkZXZpY2UgdHlwZSBwcm9wZXJ0eS4gT24gc3VjY2VzcywgdGhlIG9mZnNldCBvZiB0aGF0CisgKiBub2RlIGlzIHJldHVybmVkIG9yIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlOgorICoKKyAqICAgbm9kZW9mZnNldCAtIHRoZSBub2RlIHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tIG9yIDAsIHRoZSBub2RlIHlvdSBwYXNzCisgKiAgICAgICAgICAgICAgICB3aWxsIG5vdCBiZSBzZWFyY2hlZCwgb25seSB0aGUgbmV4dCBvbmUgd2lsbDsgdHlwaWNhbGx5LAorICogICAgICAgICAgICAgICAgeW91IHBhc3MgMCB0byBzdGFydCB0aGUgc2VhcmNoIGFuZCB0aGVuIHdoYXQgdGhlIHByZXZpb3VzCisgKiAgICAgICAgICAgICAgICBjYWxsIHJldHVybmVkLgorICogICB0eXBlICAgICAgIC0gdGhlIGRldmljZSB0eXBlIHN0cmluZyB0byBtYXRjaCBhZ2FpbnN0LgorICovCitpbnQgZmR0X2ZpbmRfbm9kZV9ieV90eXBlKGNvbnN0IHZvaWQgKmZkdCwgaW50IG5vZGVvZmZzZXQsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaW50IG9mZnNldCwgbmV4dG9mZnNldDsKKwlzdHJ1Y3QgZmR0X3Byb3BlcnR5ICpwcm9wOworCXVpbnQzMl90IHRhZzsKKwlpbnQgbGVuLCByZXQ7CisKKwlDSEVDS19IRUFERVIoZmR0KTsKKworCXRhZyA9IGZkdF9uZXh0X3RhZyhmZHQsIG5vZGVvZmZzZXQsICZuZXh0b2Zmc2V0LCBOVUxMKTsKKwlpZiAodGFnICE9IEZEVF9CRUdJTl9OT0RFKQorCQlyZXR1cm4gLUZEVF9FUlJfQkFET0ZGU0VUOworCWlmIChub2Rlb2Zmc2V0KQorCQlub2Rlb2Zmc2V0ID0gMDsJLyogc3RhcnQgc2VhcmNoaW5nIHdpdGggbmV4dCBub2RlICovCisKKwl3aGlsZSAoMSkgeworCQlvZmZzZXQgPSBuZXh0b2Zmc2V0OworCQl0YWcgPSBmZHRfbmV4dF90YWcoZmR0LCBvZmZzZXQsICZuZXh0b2Zmc2V0LCBOVUxMKTsKKworCQlzd2l0Y2ggKHRhZykgeworCQljYXNlIEZEVF9CRUdJTl9OT0RFOgorCQkJbm9kZW9mZnNldCA9IG9mZnNldDsKKwkJCWJyZWFrOworCisJCWNhc2UgRkRUX1BST1A6CisJCQlpZiAobm9kZW9mZnNldCA9PSAwKQorCQkJCWJyZWFrOworCQkJcmV0ID0gcHJvcF9uYW1lX2VxKGZkdCwgb2Zmc2V0LCAiZGV2aWNlX3R5cGUiLAorCQkJCQkgICAmcHJvcCwgJmxlbik7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQkJZWxzZSBpZiAocmV0ID4gMCAmJgorCQkJCSBzdHJuY21wKHByb3AtPmRhdGEsIHR5cGUsIGxlbiAtIDEpID09IDApCisJCQkgICAgcmV0dXJuIG5vZGVvZmZzZXQ7CisJCQlicmVhazsKKworCQljYXNlIEZEVF9FTkRfTk9ERToKKwkJY2FzZSBGRFRfTk9QOgorCQkJYnJlYWs7CisKKwkJY2FzZSBGRFRfRU5EOgorCQkJcmV0dXJuIC1GRFRfRVJSX05PVEZPVU5EOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUZEVF9FUlJfQkFEU1RSVUNUVVJFOworCQl9CisJfQorfQorCisvKgorICogRmluZCBhIG5vZGUgYmFzZWQgb24gaXRzIGRldmljZSB0eXBlIGFuZCBvbmUgb2YgdGhlIHRva2VucyBpbiBpdHMgaXRzCisgKiAiY29tcGF0aWJsZSIgcHJvcGVydHkuIE9uIHN1Y2Nlc3MsIHRoZSBvZmZzZXQgb2YgdGhhdCBub2RlIGlzIHJldHVybmVkCisgKiBvciBhbiBlcnJvciBjb2RlIG90aGVyd2lzZToKKyAqCisgKiAgIG5vZGVvZmZzZXQgLSB0aGUgbm9kZSB0byBzdGFydCBzZWFyY2hpbmcgZnJvbSBvciAwLCB0aGUgbm9kZSB5b3UgcGFzcworICogICAgICAgICAgICAgICAgd2lsbCBub3QgYmUgc2VhcmNoZWQsIG9ubHkgdGhlIG5leHQgb25lIHdpbGw7IHR5cGljYWxseSwKKyAqICAgICAgICAgICAgICAgIHlvdSBwYXNzIDAgdG8gc3RhcnQgdGhlIHNlYXJjaCBhbmQgdGhlbiB3aGF0IHRoZSBwcmV2aW91cworICogICAgICAgICAgICAgICAgY2FsbCByZXR1cm5lZC4KKyAqICAgdHlwZSAgICAgICAtIHRoZSBkZXZpY2UgdHlwZSBzdHJpbmcgdG8gbWF0Y2ggYWdhaW5zdC4KKyAqICAgY29tcGF0ICAgICAtIHRoZSBzdHJpbmcgdG8gbWF0Y2ggdG8gb25lIG9mIHRoZSB0b2tlbnMgaW4gdGhlCisgKiAgICAgICAgICAgICAgICAiY29tcGF0aWJsZSIgbGlzdC4KKyAqLworaW50IGZkdF9maW5kX2NvbXBhdGlibGVfbm9kZShjb25zdCB2b2lkICpmZHQsIGludCBub2Rlb2Zmc2V0LAorCQkJICAgICBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICpjb21wYXQpCit7CisJaW50IG9mZnNldDsKKworCW9mZnNldCA9IGZkdF9maW5kX25vZGVfYnlfdHlwZShmZHQsIG5vZGVvZmZzZXQsIHR5cGUpOworCWlmIChvZmZzZXQgPCAwIHx8IGZkdF9ub2RlX2lzX2NvbXBhdGlibGUoZmR0LCBvZmZzZXQsIGNvbXBhdCkpCisJCXJldHVybiBvZmZzZXQ7CisKKwlyZXR1cm4gLUZEVF9FUlJfTk9URk9VTkQ7Cit9CisKKy8qCiAgKiBSZXR1cm4gdGhlIG5vZGUgb2Zmc2V0IG9mIHRoZSBub2RlIHNwZWNpZmllZCBieToKICAqICAgcGFyZW50b2Zmc2V0IC0gc3RhcnRpbmcgcGxhY2UgKDAgdG8gc3RhcnQgYXQgdGhlIHJvb3QpCiAgKiAgIG5hbWUgICAgICAgICAtIG5hbWUgYmVpbmcgc2VhcmNoZWQgZm9yCkBAIC0xMjksNyArMjcxLDcgQEAKICAqIFNlYXJjaGVzIGZvciB0aGUgbm9kZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBwYXRoIGFuZCByZXR1cm5zIHRoZQogICogb2Zmc2V0IG9mIHRoYXQgbm9kZS4KICAqLwotaW50IGZkdF9wYXRoX29mZnNldChjb25zdCB2b2lkICpmZHQsIGNvbnN0IGNoYXIgKnBhdGgpCitpbnQgZmR0X2ZpbmRfbm9kZV9ieV9wYXRoKGNvbnN0IHZvaWQgKmZkdCwgY29uc3QgY2hhciAqcGF0aCkKIHsKIAljb25zdCBjaGFyICplbmQgPSBwYXRoICsgc3RybGVuKHBhdGgpOwogCWNvbnN0IGNoYXIgKnAgPSBwYXRoOwpAQCAtMTQxLDYgKzI4MywxMCBAQAogCWlmICgqcGF0aCAhPSAnLycpCiAJCXJldHVybiAtRkRUX0VSUl9CQURQQVRIOwogCisJLyogSGFuZGxlIHRoZSByb290IHBhdGg6IHJvb3Qgb2Zmc2V0IGlzIDAgKi8KKwlpZiAoc3RyY21wKHBhdGgsICIvIikgPT0gMCkKKwkJcmV0dXJuIDA7CisKIAl3aGlsZSAoKnApIHsKIAkJY29uc3QgY2hhciAqcTsKIApAQCAtMTg0LDcgKzMzMCw2IEBACiAJaW50IGxldmVsID0gMDsKIAl1aW50MzJfdCB0YWc7CiAJc3RydWN0IGZkdF9wcm9wZXJ0eSAqcHJvcDsKLQlpbnQgbmFtZXN0cm9mZjsKIAlpbnQgb2Zmc2V0LCBuZXh0b2Zmc2V0OwogCWludCBlcnI7CiAKQEAgLTIyNCwyNCArMzY5LDExIEBACiAJCQlpZiAobGV2ZWwgIT0gMCkKIAkJCQljb250aW51ZTsKIAotCQkJZXJyID0gLUZEVF9FUlJfQkFEU1RSVUNUVVJFOwotCQkJcHJvcCA9IGZkdF9vZmZzZXRfcHRyX3R5cGVkKGZkdCwgb2Zmc2V0LCBwcm9wKTsKLQkJCWlmICghIHByb3ApCi0JCQkJZ290byBmYWlsOwotCQkJbmFtZXN0cm9mZiA9IGZkdDMyX3RvX2NwdShwcm9wLT5uYW1lb2ZmKTsKLQkJCWlmIChzdHJlcShmZHRfc3RyaW5nKGZkdCwgbmFtZXN0cm9mZiksIG5hbWUpKSB7Ci0JCQkJLyogRm91bmQgaXQhICovCi0JCQkJaW50IGxlbiA9IGZkdDMyX3RvX2NwdShwcm9wLT5sZW4pOwotCQkJCXByb3AgPSBmZHRfb2Zmc2V0X3B0cihmZHQsIG9mZnNldCwKLQkJCQkJCSAgICAgIHNpemVvZigqcHJvcCkrbGVuKTsKLQkJCQlpZiAoISBwcm9wKQotCQkJCQlnb3RvIGZhaWw7Ci0KLQkJCQlpZiAobGVucCkKLQkJCQkJKmxlbnAgPSBsZW47Ci0KKwkJCWVyciA9IHByb3BfbmFtZV9lcShmZHQsIG9mZnNldCwgbmFtZSwgJnByb3AsIGxlbnApOworCQkJaWYgKGVyciA+IDApCiAJCQkJcmV0dXJuIHByb3A7Ci0JCQl9CisJCQllbHNlIGlmIChlcnIgPCAwKQorCQkJCWdvdG8gZmFpbDsKIAkJCWJyZWFrOwogCiAJCWNhc2UgRkRUX05PUDoKQEAgLTQwMCwzICs1MzIsNSBAQAogCX0KIAlyZXR1cm4gMDsKIH0KKworI2VuZGlmIC8qIENPTkZJR19PRl9MSUJGRFQgKi8KZGlmZiAtLWdpdCBhL2xpYmZkdC9mZHRfcncuYyBiL2xpYmZkdC9mZHRfcncuYwppbmRleCBhYWFmYzUzLi42OTNiZmU0IDEwMDY0NAotLS0gYS9saWJmZHQvZmR0X3J3LmMKKysrIGIvbGliZmR0L2ZkdF9ydy5jCkBAIC0xNiw2ICsxNiw5IEBACiAgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lmIENPTkZJR19PRl9MSUJGRFQKKwogI2luY2x1ZGUgImxpYmZkdF9lbnYuaCIKIAogI2luY2x1ZGUgPGZkdC5oPgpAQCAtMjkxLDMgKzI5NCw1IEBACiAJZmR0X3NldF9oZWFkZXIoZmR0LCB0b3RhbHNpemUsIF9ibG9iX2RhdGFfc2l6ZShmZHQpKTsKIAlyZXR1cm4gMDsKIH0KKworI2VuZGlmIC8qIENPTkZJR19PRl9MSUJGRFQgKi8KZGlmZiAtLWdpdCBhL2xpYmZkdC9mZHRfc3RyZXJyb3IuYyBiL2xpYmZkdC9mZHRfc3RyZXJyb3IuYwppbmRleCA3ZjIzMWNlLi5iNDljOTUyIDEwMDY0NAotLS0gYS9saWJmZHQvZmR0X3N0cmVycm9yLmMKKysrIGIvbGliZmR0L2ZkdF9zdHJlcnJvci5jCkBAIC0xNiw2ICsxNiw5IEBACiAgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lmIENPTkZJR19PRl9MSUJGRFQKKwogI2luY2x1ZGUgImxpYmZkdF9lbnYuaCIKIAogI2luY2x1ZGUgPGZkdC5oPgpAQCAtNjIsMyArNjUsNSBAQAogCiAJcmV0dXJuICI8dW5rbm93biBlcnJvcj4iOwogfQorCisjZW5kaWYgLyogQ09ORklHX09GX0xJQkZEVCAqLwpkaWZmIC0tZ2l0IGEvbGliZmR0L2ZkdF9zdy5jIGIvbGliZmR0L2ZkdF9zdy5jCmluZGV4IDY3MmY0ZGQuLmM3ZWVhOGYgMTAwNjQ0Ci0tLSBhL2xpYmZkdC9mZHRfc3cuYworKysgYi9saWJmZHQvZmR0X3N3LmMKQEAgLTE2LDYgKzE2LDkgQEAKICAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaWYgQ09ORklHX09GX0xJQkZEVAorCiAjaW5jbHVkZSAibGliZmR0X2Vudi5oIgogCiAjaW5jbHVkZSA8ZmR0Lmg+CkBAIC0yMjQsMyArMjI3LDUgQEAKIAlmZHRfc2V0X2hlYWRlcihmZHQsIG1hZ2ljLCBGRFRfTUFHSUMpOwogCXJldHVybiAwOwogfQorCisjZW5kaWYgLyogQ09ORklHX09GX0xJQkZEVCAqLwpkaWZmIC0tZ2l0IGEvbGliZmR0L2ZkdF93aXAuYyBiL2xpYmZkdC9mZHRfd2lwLmMKaW5kZXggMmQyZWQzNy4uMmQzOWFhYiAxMDA2NDQKLS0tIGEvbGliZmR0L2ZkdF93aXAuYworKysgYi9saWJmZHQvZmR0X3dpcC5jCkBAIC0xNiw2ICsxNiw5IEBACiAgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lmIENPTkZJR19PRl9MSUJGRFQKKwogI2luY2x1ZGUgImxpYmZkdF9lbnYuaCIKIAogI2luY2x1ZGUgPGZkdC5oPgpAQCAtMTM1LDMgKzEzOCw1IEBACiAKIAlyZXR1cm4gMDsKIH0KKworI2VuZGlmIC8qIENPTkZJR19PRl9MSUJGRFQgKi8KZGlmZiAtLWdpdCBhL25hbmRfc3BsL2JvYXJkL2FtY2MvYWNhZGlhL01ha2VmaWxlIGIvbmFuZF9zcGwvYm9hcmQvYW1jYy9hY2FkaWEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI2NDc2ZgotLS0gL2Rldi9udWxsCisrKyBiL25hbmRfc3BsL2JvYXJkL2FtY2MvYWNhZGlhL01ha2VmaWxlCkBAIC0wLDAgKzEsMTE0IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwNworIyBTdGVmYW4gUm9lc2UsIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHNyQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworaW5jbHVkZSAkKFRPUERJUikvbmFuZF9zcGwvYm9hcmQvJChCT0FSRERJUikvY29uZmlnLm1rCisKK0xEU0NSSVBUPSAkKFRPUERJUikvbmFuZF9zcGwvYm9hcmQvJChCT0FSRERJUikvdS1ib290LmxkcworTERGTEFHUwk9IC1Cc3RhdGljIC1UICQoTERTQ1JJUFQpIC1UdGV4dCAkKFRFWFRfQkFTRSkgJChQTEFURk9STV9MREZMQUdTKQorQUZMQUdTCSs9IC1EQ09ORklHX05BTkRfU1BMCitDRkxBR1MJKz0gLURDT05GSUdfTkFORF9TUEwKKworU09CSlMJPSBzdGFydC5vIHJlc2V0dmVjLm8KK0NPQkpTCT0gZ3Bpby5vIG5hbmRfYm9vdC5vIG5hbmRfZWNjLm8gbWVtb3J5Lm8gbmRmYy5vIHBsbC5vCisKK1NSQ1MJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTT0JKUykgJChDT0JKUykpCitfX09CSlMJOj0gJChTT0JKUykgJChDT0JKUykKK0xORElSCTo9ICQoT0JKVFJFRSkvbmFuZF9zcGwvYm9hcmQvJChCT0FSRERJUikKKworbmFuZG9iagk6PSAkKE9CSlRSRUUpL25hbmRfc3BsLworCitBTEwJPSAkKG5hbmRvYmopdS1ib290LXNwbCAkKG5hbmRvYmopdS1ib290LXNwbC5iaW4gJChuYW5kb2JqKXUtYm9vdC1zcGwtMTZrLmJpbiBcCisJJChuYW5kb2JqKVN5c3RlbS5tYXAKKworYWxsOgkkKG9iaikuZGVwZW5kICQoQUxMKQorCiskKG5hbmRvYmopdS1ib290LXNwbC0xNmsuYmluOiAkKG5hbmRvYmopdS1ib290LXNwbAorCSQoT0JKQ09QWSkgJHtPQkpDRkxBR1N9IC0tcGFkLXRvPSQoUEFEX1RPKSAtTyBiaW5hcnkgJDwgJEAKKworJChuYW5kb2JqKXUtYm9vdC1zcGwuYmluOgkkKG5hbmRvYmopdS1ib290LXNwbAorCSQoT0JKQ09QWSkgJHtPQkpDRkxBR1N9IC1PIGJpbmFyeSAkPCAkQAorCiskKG5hbmRvYmopdS1ib290LXNwbDoJJChPQkpTKQorCWNkICQoTE5ESVIpICYmICQoTEQpICQoTERGTEFHUykgJCRVTkRFRl9TWU0gJChfX09CSlMpIFwKKwkJLU1hcCAkKG5hbmRvYmopdS1ib290LXNwbC5tYXAgXAorCQktbyAkKG5hbmRvYmopdS1ib290LXNwbAorCiskKG5hbmRvYmopU3lzdGVtLm1hcDoJJChuYW5kb2JqKXUtYm9vdC1zcGwKKwkJQCQoTk0pICQ8IHwgXAorCQlncmVwIC12ICdcKGNvbXBpbGVkXClcfFwoXC5vJCRcKVx8XCggW2FVd10gXClcfFwoXC5cLm5nJCRcKVx8XChMQVNIW1JMXURJXCknIHwgXAorCQlzb3J0ID4gJChuYW5kb2JqKVN5c3RlbS5tYXAKKworIyBjcmVhdGUgc3ltYm9saWMgbGlua3MgZm9yIGNvbW1vbiBmaWxlcworCisjIGZyb20gY3B1IGRpcmVjdG9yeQorJChvYmopZ3Bpby5jOgorCUBybSAtZiAkKG9iailncGlvLmMKKwlsbiAtcyAkKFNSQ1RSRUUpL2NwdS9wcGM0eHgvZ3Bpby5jICQob2JqKWdwaW8uYworCiskKG9iailuZGZjLmM6CisJQHJtIC1mICQob2JqKW5kZmMuYworCWxuIC1zICQoU1JDVFJFRSkvY3B1L3BwYzR4eC9uZGZjLmMgJChvYmopbmRmYy5jCisKKyQob2JqKXJlc2V0dmVjLlM6CisJQHJtIC1mICQob2JqKXJlc2V0dmVjLlMKKwlsbiAtcyAkKFNSQ1RSRUUpL2NwdS9wcGM0eHgvcmVzZXR2ZWMuUyAkKG9iailyZXNldHZlYy5TCisKKyQob2JqKXN0YXJ0LlM6CisJQHJtIC1mICQob2JqKXN0YXJ0LlMKKwlsbiAtcyAkKFNSQ1RSRUUpL2NwdS9wcGM0eHgvc3RhcnQuUyAkKG9iailzdGFydC5TCisKKyMgZnJvbSBib2FyZCBkaXJlY3RvcnkKKyQob2JqKW1lbW9yeS5jOgorCUBybSAtZiAkKG9iailtZW1vcnkuYworCWxuIC1zICQoU1JDVFJFRSkvYm9hcmQvYW1jYy9hY2FkaWEvbWVtb3J5LmMgJChvYmopbWVtb3J5LmMKKworJChvYmopcGxsLmM6CisJQHJtIC1mICQob2JqKXBsbC5jCisJbG4gLXMgJChTUkNUUkVFKS9ib2FyZC9hbWNjL2FjYWRpYS9wbGwuYyAkKG9iailwbGwuYworCisjIGZyb20gbmFuZF9zcGwgZGlyZWN0b3J5CiskKG9iailuYW5kX2Jvb3QuYzoKKwlAcm0gLWYgJChvYmopbmFuZF9ib290LmMKKwlsbiAtcyAkKFNSQ1RSRUUpL25hbmRfc3BsL25hbmRfYm9vdC5jICQob2JqKW5hbmRfYm9vdC5jCisKKyMgZnJvbSBkcml2ZXJzL25hbmQgZGlyZWN0b3J5CiskKG9iailuYW5kX2VjYy5jOgorCUBybSAtZiAkKG9iailuYW5kX2VjYy5jCisJbG4gLXMgJChTUkNUUkVFKS9kcml2ZXJzL25hbmQvbmFuZF9lY2MuYyAkKG9iailuYW5kX2VjYy5jCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworJChvYmopJS5vOgkkKG9iaiklLlMKKwkkKENDKSAkKEFGTEFHUykgLWMgLW8gJEAgJDwKKworJChvYmopJS5vOgkkKG9iaiklLmMKKwkkKENDKSAkKENGTEFHUykgLWMgLW8gJEAgJDwKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9uYW5kX3NwbC9ib2FyZC9hbWNjL2FjYWRpYS9jb25maWcubWsgYi9uYW5kX3NwbC9ib2FyZC9hbWNjL2FjYWRpYS9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IxNDBmYQotLS0gL2Rldi9udWxsCisrKyBiL25hbmRfc3BsL2JvYXJkL2FtY2MvYWNhZGlhL2NvbmZpZy5tawpAQCAtMCwwICsxLDQ3IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwNworIyBTdGVmYW4gUm9lc2UsIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHNyQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisjCisjIEFNQ0MgNDA1RVogUmVmZXJlbmNlIFBsYXRmb3JtIChBY2FkaWEpIGJvYXJkCisjCisKKyMKKyMgVEVYVF9CQVNFIGZvciBTUEw6CisjCisjIE9uIDR4eCBwbGF0Zm9ybXMgdGhlIFNQTCBpcyBsb2NhdGVkIGF0IDB4ZmZmZmYwMDAuLi4weGZmZmZmZmZmLAorIyBpbiB0aGUgbGFzdCA0a0J5dGVzIG9mIG1lbW9yeSBzcGFjZSBpbiBjYWNoZS4KKyMgV2Ugd2lsbCBjb3B5IHRoaXMgU1BMIGludG8gaW50ZXJuYWwgU1JBTSBpbiBzdGFydC5TLiBTbyB3ZSBzZXQKKyMgVEVYVF9CQVNFIHRvIHN0YXJ0aW5nIGFkZHJlc3MgaW4gaW50ZXJuYWwgU1JBTSBoZXJlLgorIworVEVYVF9CQVNFID0gMHhmODAwNDAwMAorCisjIFBBRF9UTyB1c2VkIHRvIGdlbmVyYXRlIGEgMTZrQnl0ZSBiaW5hcnkgbmVlZGVkIGZvciB0aGUgY29tYmluZWQgaW1hZ2UKKyMgLT4gUEFEX1RPID0gVEVYVF9CQVNFICsgMHg0MDAwCitQQURfVE8JPSAweGY4MDA4MDAwCisKK2lmZXEgKCQoZGVidWcpLDEpCitQTEFURk9STV9DUFBGTEFHUyArPSAtRERFQlVHCitlbmRpZgorCitpZmVxICgkKGRiY3IpLDEpCitQTEFURk9STV9DUFBGTEFHUyArPSAtRENGR19JTklUX0RCQ1I9MHg4Y2ZmMDAwMAorZW5kaWYKZGlmZiAtLWdpdCBhL25hbmRfc3BsL2JvYXJkL2FtY2MvYWNhZGlhL3UtYm9vdC5sZHMgYi9uYW5kX3NwbC9ib2FyZC9hbWNjL2FjYWRpYS91LWJvb3QubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwN2E3NzMKLS0tIC9kZXYvbnVsbAorKysgYi9uYW5kX3NwbC9ib2FyZC9hbWNjL2FjYWRpYS91LWJvb3QubGRzCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDcKKyAqIFN0ZWZhbiBSb2VzZSwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgc3JAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfQVJDSChwb3dlcnBjOmNvbW1vbikKK1NFQ1RJT05TCit7CisgIC5yZXNldHZlYyAweGY4MDA0ZmZjIDoKKyAgeworICAgICooLnJlc2V0dmVjKQorICB9ID0gMHhmZmZmCisKKyAgLnRleHQgICAgICA6CisgIHsKKyAgICBzdGFydC5vCSgudGV4dCkKKyAgICBuYW5kX2Jvb3QubwkoLnRleHQpCisgICAgbmRmYy5vCSgudGV4dCkKKworICAgICooLnRleHQpCisgICAgKiguZml4dXApCisgIH0KKyAgX2V0ZXh0ID0gLjsKKworICAuZGF0YSAgICA6CisgIHsKKyAgICAqKC5yb2RhdGEqKQorICAgICooLmRhdGEqKQorICAgICooLnNkYXRhKikKKyAgICBfX2dvdDJfc3RhcnQgPSAuOworICAgICooLmdvdDIpCisgICAgX19nb3QyX2VuZCA9IC47CisgIH0KKworICBfZWRhdGEgID0gIC47CisKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgIDoKKyAgeworICAgKiguc2JzcykKKyAgICooLmJzcykKKyAgfQorCisgIF9lbmQgPSAuIDsKK30KZGlmZiAtLWdpdCBhL25ldC9ib290cC5jIGIvbmV0L2Jvb3RwLmMKaW5kZXggMWRlOWE4Zi4uODBmNTNiYyAxMDA2NDQKLS0tIGEvbmV0L2Jvb3RwLmMKKysrIGIvbmV0L2Jvb3RwLmMKQEAgLTMxLDcgKzMxLDcgQEAKIAogI2RlZmluZSBCT09UUF9WRU5ET1JfTUFHSUMJMHg2MzgyNTM2MwkvKiBSRkMxMDQ4IE1hZ2ljIENvb2tpZQkJKi8KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCiAjZGVmaW5lIFRJTUVPVVQJCTUJCS8qIFNlY29uZHMgYmVmb3JlIHRyeWluZyBCT09UUCBhZ2FpbgkqLwogI2lmbmRlZiBDT05GSUdfTkVUX1JFVFJZX0NPVU5UCkBAIC01Myw3ICs1Myw3IEBACiB1bG9uZwkJc2VlZDEsIHNlZWQyOwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ESENQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ESENQKQogZGhjcF9zdGF0ZV90IGRoY3Bfc3RhdGUgPSBJTklUOwogdW5zaWduZWQgbG9uZyBkaGNwX2xlYXNldGltZSA9IDA7CiBJUGFkZHJfdCBOZXRESENQU2VydmVySVAgPSAwOwpAQCAtNzYsMTIgKzc2LDEyIEBACiB9CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9WRU5ET1JFWCkKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9WRU5ET1JFWCkKIGV4dGVybiB1OCAqZGhjcF92ZW5kb3JleF9wcmVwICh1OCAqZSk7IC8qcnRuIG5ldyBlIGFmdGVyIGFkZCBvd24gb3B0cy4gKi8KIGV4dGVybiB1OCAqZGhjcF92ZW5kb3JleF9wcm9jICh1OCAqZSk7IC8qcnRuIG5leHQgZSBpZiBtaW5lLGVsc2UgTlVMTCAgKi8KICNlbmRpZgogCi0jZW5kaWYJLyogQ0ZHX0NNRF9ESENQICovCisjZW5kaWYKIAogc3RhdGljIGludCBCb290cENoZWNrUGt0KHVjaGFyICpwa3QsIHVuc2lnbmVkIGRlc3QsIHVuc2lnbmVkIHNyYywgdW5zaWduZWQgbGVuKQogewpAQCAtMTQ4LDcgKzE0OCw3IEBACiAJcmV0dXJuIChjdXJsZW4pOwogfQogCi0jaWYgIShDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RIQ1ApCisjaWYgIWRlZmluZWQoQ09ORklHX0NNRF9ESENQKQogCiBzdGF0aWMgdm9pZCBCb290cFZlbmRvckZpZWxkUHJvY2VzcyAodTggKiBleHQpCiB7CkBAIC0xODEsNyArMTgxLDcgQEAKIAkJaWYgKE5ldE91ckROU0lQID09IDApIHsKIAkJCU5ldENvcHlJUCAoJk5ldE91ckROU0lQLCAoSVBhZGRyX3QgKikgKGV4dCArIDIpKTsKIAkJfQotI2lmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9ETlMyKQorI2lmIGRlZmluZWQoQ09ORklHX0JPT1RQX0ROUzIpCiAJCWlmICgoTmV0T3VyRE5TMklQID09IDApICYmIChzaXplID4gNCkpIHsKIAkJCU5ldENvcHlJUCAoJk5ldE91ckROUzJJUCwgKElQYWRkcl90ICopIChleHQgKyAyICsgNCkpOwogCQl9CkBAIC0zNDQsNyArMzQ0LDcgQEAKIAkJCSAqLwogCQkJTmV0U3RhdGUgPSBORVRMT09QX1NVQ0NFU1M7CiAJCQlyZXR1cm47Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkZTKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORlMpCiAJCX0gZWxzZSBpZiAoc3RyY21wKHMsICJORlMiKSA9PSAwKSB7CiAJCQkvKgogCQkJICogVXNlIE5GUyB0byBsb2FkIHRoZSBib290ZmlsZS4KQEAgLTM1Nyw3ICszNTcsNyBAQAogCiAJVGZ0cFN0YXJ0KCk7CiB9Ci0jZW5kaWYJLyogIUNGR19DTURfREhDUCAqLworI2VuZGlmCiAKIC8qCiAgKglUaW1lb3V0IG9uIEJPT1RQL0RIQ1AgcmVxdWVzdC4KQEAgLTM3NywxNiArMzc3LDE2IEBACiAvKgogICoJSW5pdGlhbGl6ZSBCT09UUCBleHRlbnNpb24gZmllbGRzIGluIHRoZSByZXF1ZXN0LgogICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREhDUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfREhDUCkKIHN0YXRpYyBpbnQgRGhjcEV4dGVuZGVkICh1OCAqIGUsIGludCBtZXNzYWdlX3R5cGUsIElQYWRkcl90IFNlcnZlcklELCBJUGFkZHJfdCBSZXF1ZXN0ZWRJUCkKIHsKIAl1OCAqc3RhcnQgPSBlOwogCXU4ICpjbnQ7CiAKLSNpZiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfVkVORE9SRVgpCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfVkVORE9SRVgpCiAJdTggKng7CiAjZW5kaWYKLSNpZiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRSkKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FKQogCWNoYXIgKmhvc3RuYW1lOwogI2VuZGlmCiAKQEAgLTQyNSw3ICs0MjUsNyBAQAogCQkqZSsrID0gdG1wID4+IDg7CiAJCSplKysgPSB0bXAgJiAweGZmOwogCX0KLSNpZiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfU0VORF9IT1NUTkFNRSkKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9TRU5EX0hPU1ROQU1FKQogCWlmICgoaG9zdG5hbWUgPSBnZXRlbnYgKCJob3N0bmFtZSIpKSkgewogCQlpbnQgaG9zdG5hbWVsZW4gPSBzdHJsZW4gKGhvc3RuYW1lKTsKIApAQCAtNDM2LDcgKzQzNiw3IEBACiAJfQogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfVkVORE9SRVgpCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfVkVORE9SRVgpCiAJaWYgKCh4ID0gZGhjcF92ZW5kb3JleF9wcmVwIChlKSkpCiAJCXJldHVybiB4IC0gc3RhcnQ7CiAjZW5kaWYKQEAgLTQ0NCwzOSArNDQ0LDM5IEBACiAJKmUrKyA9IDU1OwkJLyogUGFyYW1ldGVyIFJlcXVlc3QgTGlzdCAqLwogCSBjbnQgPSBlKys7CQkvKiBQb2ludGVyIHRvIGNvdW50IG9mIHJlcXVlc3RlZCBpdGVtcyAqLwogCSpjbnQgPSAwOwotI2lmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9TVUJORVRNQVNLKQorI2lmIGRlZmluZWQoQ09ORklHX0JPT1RQX1NVQk5FVE1BU0spCiAJKmUrKyAgPSAxOwkJLyogU3VibmV0IE1hc2sgKi8KIAkqY250ICs9IDE7CiAjZW5kaWYKLSNpZiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfVElNRU9GRlNFVCkKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9USU1FT0ZGU0VUKQogCSplKysgID0gMjsKIAkqY250ICs9IDE7CiAjZW5kaWYKLSNpZiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfR0FURVdBWSkKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9HQVRFV0FZKQogCSplKysgID0gMzsJCS8qIFJvdXRlciBPcHRpb24gKi8KIAkqY250ICs9IDE7CiAjZW5kaWYKLSNpZiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfRE5TKQorI2lmIGRlZmluZWQoQ09ORklHX0JPT1RQX0ROUykKIAkqZSsrICA9IDY7CQkvKiBETlMgU2VydmVyKHMpICovCiAJKmNudCArPSAxOwogI2VuZGlmCi0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX0hPU1ROQU1FKQorI2lmIGRlZmluZWQoQ09ORklHX0JPT1RQX0hPU1ROQU1FKQogCSplKysgID0gMTI7CQkvKiBIb3N0bmFtZSAqLwogCSpjbnQgKz0gMTsKICNlbmRpZgotI2lmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfQk9PVEZJTEVTSVpFKQogCSplKysgID0gMTM7CQkvKiBCb290IEZpbGUgU2l6ZSAqLwogCSpjbnQgKz0gMTsKICNlbmRpZgotI2lmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9CT09UUEFUSCkKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9CT09UUEFUSCkKIAkqZSsrICA9IDE3OwkJLyogQm9vdCBwYXRoICovCiAJKmNudCArPSAxOwogI2VuZGlmCi0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX05JU0RPTUFJTikKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9OSVNET01BSU4pCiAJKmUrKyAgPSA0MDsJCS8qIE5JUyBEb21haW4gbmFtZSByZXF1ZXN0ICovCiAJKmNudCArPSAxOwogI2VuZGlmCi0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX05UUFNFUlZFUikKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9OVFBTRVJWRVIpCiAJKmUrKyAgPSA0MjsKIAkqY250ICs9IDE7CiAjZW5kaWYKQEAgLTQ5MSw5ICs0OTEsOSBAQAogCXJldHVybiBlIC0gc3RhcnQ7CiB9CiAKLSNlbHNlCS8qIENGR19DTURfREhDUCAqLworI2Vsc2UKIC8qCi0gKglXYXJuaW5nOiBubyBmaWVsZCBzaXplIGNoZWNrIC0gY2hhbmdlIENPTkZJR19CT09UUF9NQVNLIGF0IHlvdXIgb3duIHJpc2shCisgKglXYXJuaW5nOiBubyBmaWVsZCBzaXplIGNoZWNrIC0gY2hhbmdlIENPTkZJR19CT09UUF8qIGF0IHlvdXIgb3duIHJpc2shCiAgKi8KIHN0YXRpYyBpbnQgQm9vdHBFeHRlbmRlZCAodTggKiBlKQogewpAQCAtNTA0LDcgKzUwNCw3IEBACiAJKmUrKyA9IDgzOwogCSplKysgPSA5OTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RIQ1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RIQ1ApCiAJKmUrKyA9IDUzOwkJLyogREhDUCBNZXNzYWdlIFR5cGUgKi8KIAkqZSsrID0gMTsKIAkqZSsrID0gREhDUF9ESVNDT1ZFUjsKQEAgLTUxMyw0NSArNTEzLDQ1IEBACiAJKmUrKyA9IDI7CiAJKmUrKyA9ICg1NzYgLSAzMTIgKyBPUFRfU0laRSkgPj4gMTY7CiAJKmUrKyA9ICg1NzYgLSAzMTIgKyBPUFRfU0laRSkgJiAweGZmOwotI2VuZGlmIC8qIENGR19DTURfREhDUCAqLworI2VuZGlmCiAKLSNpZiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfU1VCTkVUTUFTSykKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9TVUJORVRNQVNLKQogCSplKysgPSAxOwkJLyogU3VibmV0IG1hc2sgcmVxdWVzdCAqLwogCSplKysgPSA0OwogCWUgICArPSA0OwogI2VuZGlmCiAKLSNpZiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfR0FURVdBWSkKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9HQVRFV0FZKQogCSplKysgPSAzOwkJLyogRGVmYXVsdCBnYXRld2F5IHJlcXVlc3QgKi8KIAkqZSsrID0gNDsKIAllICAgKz0gNDsKICNlbmRpZgogCi0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX0ROUykKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9ETlMpCiAJKmUrKyA9IDY7CQkvKiBEb21haW4gTmFtZSBTZXJ2ZXIgKi8KIAkqZSsrID0gNDsKIAllICAgKz0gNDsKICNlbmRpZgogCi0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX0hPU1ROQU1FKQorI2lmIGRlZmluZWQoQ09ORklHX0JPT1RQX0hPU1ROQU1FKQogCSplKysgPSAxMjsJCS8qIEhvc3QgbmFtZSByZXF1ZXN0ICovCiAJKmUrKyA9IDMyOwogCWUgICArPSAzMjsKICNlbmRpZgogCi0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX0JPT1RGSUxFU0laRSkKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UUF9CT09URklMRVNJWkUpCiAJKmUrKyA9IDEzOwkJLyogQm9vdCBmaWxlIHNpemUgKi8KIAkqZSsrID0gMjsKIAllICAgKz0gMjsKICNlbmRpZgogCi0jaWYgKENPTkZJR19CT09UUF9NQVNLICYgQ09ORklHX0JPT1RQX0JPT1RQQVRIKQorI2lmIGRlZmluZWQoQ09ORklHX0JPT1RQX0JPT1RQQVRIKQogCSplKysgPSAxNzsJCS8qIEJvb3QgcGF0aCAqLwogCSplKysgPSAzMjsKIAllICAgKz0gMzI7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9OSVNET01BSU4pCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfTklTRE9NQUlOKQogCSplKysgPSA0MDsJCS8qIE5JUyBEb21haW4gbmFtZSByZXF1ZXN0ICovCiAJKmUrKyA9IDMyOwogCWUgICArPSAzMjsKQEAgLTU2MSw3ICs1NjEsNyBAQAogCiAJcmV0dXJuIGUgLSBzdGFydDsKIH0KLSNlbmRpZgkvKiBDRkdfQ01EX0RIQ1AgKi8KKyNlbmRpZgogCiB2b2lkCiBCb290cFJlcXVlc3QgKHZvaWQpCkBAIC01NzAsNyArNTcwLDcgQEAKIAlCb290cF90ICpicDsKIAlpbnQgZXh0X2xlbiwgcGt0bGVuLCBpcGxlbjsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RIQ1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RIQ1ApCiAJZGhjcF9zdGF0ZSA9IElOSVQ7CiAjZW5kaWYKIApAQCAtNjc4LDExICs2NzgsMTEgQEAKIAljb3B5X2ZpbGVuYW1lIChicC0+YnBfZmlsZSwgQm9vdEZpbGUsIHNpemVvZihicC0+YnBfZmlsZSkpOwogCiAJLyogUmVxdWVzdCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZyb20gdGhlIEJPT1RQL0RIQ1Agc2VydmVyICovCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREhDUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfREhDUCkKIAlleHRfbGVuID0gRGhjcEV4dGVuZGVkKCh1OCAqKWJwLT5icF92ZW5kLCBESENQX0RJU0NPVkVSLCAwLCAwKTsKICNlbHNlCiAJZXh0X2xlbiA9IEJvb3RwRXh0ZW5kZWQoKHU4ICopYnAtPmJwX3ZlbmQpOwotI2VuZGlmCS8qIENGR19DTURfREhDUCAqLworI2VuZGlmCiAKIAkvKgogCSAqCUJvb3RwIElEIGlzIHRoZSBsb3dlciA0IGJ5dGVzIG9mIG91ciBldGhlcm5ldCBhZGRyZXNzCkBAIC03MDUsMTYgKzcwNSwxNiBAQAogCU5ldFNldElQKGlwaGRyLCAweEZGRkZGRkZGTCwgUE9SVF9CT09UUFMsIFBPUlRfQk9PVFBDLCBpcGxlbik7CiAJTmV0U2V0VGltZW91dChTRUxFQ1RfVElNRU9VVCAqIENGR19IWiwgQm9vdHBUaW1lb3V0KTsKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RIQ1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RIQ1ApCiAJZGhjcF9zdGF0ZSA9IFNFTEVDVElORzsKIAlOZXRTZXRIYW5kbGVyKERoY3BIYW5kbGVyKTsKICNlbHNlCiAJTmV0U2V0SGFuZGxlcihCb290cEhhbmRsZXIpOwotI2VuZGlmCS8qIENGR19DTURfREhDUCAqLworI2VuZGlmCiAJTmV0U2VuZFBhY2tldChOZXRUeFBhY2tldCwgcGt0bGVuKTsKIH0KIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RIQ1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RIQ1ApCiBzdGF0aWMgdm9pZCBEaGNwT3B0aW9uc1Byb2Nlc3MgKHVjaGFyICogcG9wdCwgQm9vdHBfdCAqYnApCiB7CiAJdWNoYXIgKmVuZCA9IHBvcHQgKyBCT09UUF9IRFJfU0laRTsKQEAgLTcyNiw3ICs3MjYsNyBAQAogCQljYXNlIDE6CiAJCQlOZXRDb3B5SVAgKCZOZXRPdXJTdWJuZXRNYXNrLCAocG9wdCArIDIpKTsKIAkJCWJyZWFrOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NOVFApICYmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9USU1FT0ZGU0VUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9TTlRQKSAmJiBkZWZpbmVkKENPTkZJR19CT09UUF9USU1FT0ZGU0VUKQogCQljYXNlIDI6CQkvKiBUaW1lIG9mZnNldAkqLwogCQkJTmV0Q29weUxvbmcgKCZOZXRUaW1lT2Zmc2V0LCAodWxvbmcgKikgKHBvcHQgKyAyKSk7CiAJCQlOZXRUaW1lT2Zmc2V0ID0gbnRvaGwgKE5ldFRpbWVPZmZzZXQpOwpAQCAtNzM3LDcgKzczNyw3IEBACiAJCQlicmVhazsKIAkJY2FzZSA2OgogCQkJTmV0Q29weUlQICgmTmV0T3VyRE5TSVAsIChwb3B0ICsgMikpOwotI2lmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9ETlMyKQorI2lmIGRlZmluZWQoQ09ORklHX0JPT1RQX0ROUzIpCiAJCQlpZiAoKihwb3B0ICsgMSkgPiA0KSB7CiAJCQkJTmV0Q29weUlQICgmTmV0T3VyRE5TMklQLCAocG9wdCArIDIgKyA0KSk7CiAJCQl9CkBAIC03NTUsNyArNzU1LDcgQEAKIAkJCW1lbWNweSAoJk5ldE91clJvb3RQYXRoLCBwb3B0ICsgMiwgc2l6ZSk7CiAJCQlOZXRPdXJSb290UGF0aFtzaXplXSA9IDA7CiAJCQlicmVhazsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TTlRQKSAmJiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfTlRQU0VSVkVSKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9TTlRQKSAmJiBkZWZpbmVkKENPTkZJR19CT09UUF9OVFBTRVJWRVIpCiAJCWNhc2UgNDI6CS8qIE5UUCBzZXJ2ZXIgSVAgKi8KIAkJCU5ldENvcHlJUCAoJk5ldE50cFNlcnZlcklQLCAocG9wdCArIDIpKTsKIAkJCWJyZWFrOwpAQCAtODAxLDcgKzgwMSw3IEBACiAJCQl9CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLSNpZiAoQ09ORklHX0JPT1RQX01BU0sgJiBDT05GSUdfQk9PVFBfVkVORE9SRVgpCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBfVkVORE9SRVgpCiAJCQlpZiAoZGhjcF92ZW5kb3JleF9wcm9jIChwb3B0KSkKIAkJCQlicmVhazsKICNlbmRpZgpAQCAtOTUwLDcgKzk1MCw3IEBACiAJCQkJCSAqLwogCQkJCQlOZXRTdGF0ZSA9IE5FVExPT1BfU1VDQ0VTUzsKIAkJCQkJcmV0dXJuOwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05GUykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkZTKQogCQkJCX0gZWxzZSBpZiAoc3RyY21wKHMsICJORlMiKSA9PSAwKSB7CiAJCQkJCS8qCiAJCQkJCSAqIFVzZSBORlMgdG8gbG9hZCB0aGUgYm9vdGZpbGUuCkBAIC05NzUsNiArOTc1LDYgQEAKIHsKIAlCb290cFJlcXVlc3QoKTsKIH0KLSNlbmRpZgkvKiBDRkdfQ01EX0RIQ1AgKi8KKyNlbmRpZgogCi0jZW5kaWYgLyogQ0ZHX0NNRF9ORVQgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2Jvb3RwLmggYi9uZXQvYm9vdHAuaAppbmRleCAwYjMxNjM5Li5iYTk4MjZlIDEwMDY0NAotLS0gYS9uZXQvYm9vdHAuaAorKysgYi9uZXQvYm9vdHAuaApAQCAtMTgsNyArMTgsNyBAQAogLyoKICAqCUJPT1RQIGhlYWRlci4KICAqLwotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RIQ1ApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RIQ1ApCiAjZGVmaW5lIE9QVF9TSVpFIDMxMgkvKiBNaW5pbXVtIERIQ1AgT3B0aW9ucyBzaXplIHBlciBSRkMyMTMxIC0gcmVzdWx0cyBpbiA1NzYgYnl0ZSBwa3QgKi8KICNlbHNlCiAjZGVmaW5lIE9QVF9TSVpFIDY0CmRpZmYgLS1naXQgYS9uZXQvZXRoLmMgYi9uZXQvZXRoLmMKaW5kZXggMGZjMjIxMS4uYzhmOTJhNSAxMDA2NDQKLS0tIGEvbmV0L2V0aC5jCisrKyBiL25ldC9ldGguYwpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPG5ldC5oPgogI2luY2x1ZGUgPG1paXBoeS5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKQogCiAjaWZkZWYgQ0ZHX0dUXzY0MjZ4CiBleHRlcm4gaW50IGd0NjQyNnhfZXRoX2luaXRpYWxpemUoYmRfdCAqYmlzKTsKQEAgLTQwLDYgKzQwLDcgQEAKIGV4dGVybiBpbnQgZmVjX2luaXRpYWxpemUoYmRfdCopOwogZXh0ZXJuIGludCBpbmNhX3N3aXRjaF9pbml0aWFsaXplKGJkX3QqKTsKIGV4dGVybiBpbnQgbXBjNXh4eF9mZWNfaW5pdGlhbGl6ZShiZF90Kik7CitleHRlcm4gaW50IG1wYzUxMnhfZmVjX2luaXRpYWxpemUoYmRfdCopOwogZXh0ZXJuIGludCBtcGM4MjIwX2ZlY19pbml0aWFsaXplKGJkX3QqKTsKIGV4dGVybiBpbnQgbXY2NDM2eF9ldGhfaW5pdGlhbGl6ZShiZF90ICopOwogZXh0ZXJuIGludCBtdjY0NDZ4X2V0aF9pbml0aWFsaXplKGJkX3QgKik7CkBAIC0xNDIsNyArMTQzLDggQEAKIAlldGhfZGV2aWNlcyA9IE5VTEw7CiAJZXRoX2N1cnJlbnQgPSBOVUxMOwogCi0jaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NSUkpCisJc2hvd19ib290X3Byb2dyZXNzICg2NCk7CisjaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKQogCW1paXBoeV9pbml0KCk7CiAjZW5kaWYKIApAQCAtMTY3LDM0ICsxNjksMjkgQEAKICNpZiBkZWZpbmVkKENPTkZJR19NUEM1eHh4X0ZFQykKIAltcGM1eHh4X2ZlY19pbml0aWFsaXplKGJpcyk7CiAjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM1MTJ4X0ZFQykKKwltcGM1MTJ4X2ZlY19pbml0aWFsaXplIChiaXMpOworI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfTVBDODIyMF9GRUMpCiAJbXBjODIyMF9mZWNfaW5pdGlhbGl6ZShiaXMpOwogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfU0s5OCkKIAlza2dlX2luaXRpYWxpemUoYmlzKTsKICNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX01QQzg1WFhfVFNFQzEpCi0JdHNlY19pbml0aWFsaXplKGJpcywgMCwgQ09ORklHX01QQzg1WFhfVFNFQzFfTkFNRSk7Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19NUEM4M1hYX1RTRUMxKQotCXRzZWNfaW5pdGlhbGl6ZShiaXMsIDAsIENPTkZJR19NUEM4M1hYX1RTRUMxX05BTUUpOworI2lmIGRlZmluZWQoQ09ORklHX1RTRUMxKQorCXRzZWNfaW5pdGlhbGl6ZShiaXMsIDAsIENPTkZJR19UU0VDMV9OQU1FKTsKICNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX01QQzg1WFhfVFNFQzIpCi0JdHNlY19pbml0aWFsaXplKGJpcywgMSwgQ09ORklHX01QQzg1WFhfVFNFQzJfTkFNRSk7Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19NUEM4M1hYX1RTRUMyKQotCXRzZWNfaW5pdGlhbGl6ZShiaXMsIDEsIENPTkZJR19NUEM4M1hYX1RTRUMyX05BTUUpOworI2lmIGRlZmluZWQoQ09ORklHX1RTRUMyKQorCXRzZWNfaW5pdGlhbGl6ZShiaXMsIDEsIENPTkZJR19UU0VDMl9OQU1FKTsKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX01QQzg1WFhfRkVDKQogCXRzZWNfaW5pdGlhbGl6ZShiaXMsIDIsIENPTkZJR19NUEM4NVhYX0ZFQ19OQU1FKTsKICNlbHNlCi0jICAgIGlmIGRlZmluZWQoQ09ORklHX01QQzg1WFhfVFNFQzMpCi0JdHNlY19pbml0aWFsaXplKGJpcywgMiwgQ09ORklHX01QQzg1WFhfVFNFQzNfTkFNRSk7Ci0jICAgIGVsaWYgZGVmaW5lZChDT05GSUdfTVBDODNYWF9UU0VDMykKLQl0c2VjX2luaXRpYWxpemUoYmlzLCAyLCBDT05GSUdfTVBDODNYWF9UU0VDM19OQU1FKTsKKyMgICAgaWYgZGVmaW5lZChDT05GSUdfVFNFQzMpCisJdHNlY19pbml0aWFsaXplKGJpcywgMiwgQ09ORklHX1RTRUMzX05BTUUpOwogIyAgICBlbmRpZgotIyAgICBpZiBkZWZpbmVkKENPTkZJR19NUEM4NVhYX1RTRUM0KQotCXRzZWNfaW5pdGlhbGl6ZShiaXMsIDMsIENPTkZJR19NUEM4NVhYX1RTRUM0X05BTUUpOwotIyAgICBlbGlmIGRlZmluZWQoQ09ORklHX01QQzgzWFhfVFNFQzQpCi0JdHNlY19pbml0aWFsaXplKGJpcywgMywgQ09ORklHX01QQzgzWFhfVFNFQzRfTkFNRSk7CisjICAgIGlmIGRlZmluZWQoQ09ORklHX1RTRUM0KQorCXRzZWNfaW5pdGlhbGl6ZShiaXMsIDMsIENPTkZJR19UU0VDNF9OQU1FKTsKICMgICAgZW5kaWYKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX1VFQ19FVEgxKQpAQCAtMjAzLDIxICsyMDAsNiBAQAogI2lmIGRlZmluZWQoQ09ORklHX1VFQ19FVEgyKQogCXVlY19pbml0aWFsaXplKDEpOwogI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfTVBDODZYWF9UU0VDMSkKLSAgICAgICB0c2VjX2luaXRpYWxpemUoYmlzLCAwLCBDT05GSUdfTVBDODZYWF9UU0VDMV9OQU1FKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfTVBDODZYWF9UU0VDMikKLSAgICAgICB0c2VjX2luaXRpYWxpemUoYmlzLCAxLCBDT05GSUdfTVBDODZYWF9UU0VDMl9OQU1FKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfTVBDODZYWF9UU0VDMykKLSAgICAgICB0c2VjX2luaXRpYWxpemUoYmlzLCAyLCBDT05GSUdfTVBDODZYWF9UU0VDM19OQU1FKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfTVBDODZYWF9UU0VDNCkKLSAgICAgICB0c2VjX2luaXRpYWxpemUoYmlzLCAzLCBDT05GSUdfTVBDODZYWF9UU0VDNF9OQU1FKTsKLSNlbmRpZgogCiAjaWYgZGVmaW5lZChGRUNfRU5FVCkgfHwgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkNDKQogCWZlY19pbml0aWFsaXplKGJpcyk7CkBAIC0yNzAsMTAgKzI1MiwxMiBAQAogCiAJaWYgKCFldGhfZGV2aWNlcykgewogCQlwdXRzICgiTm8gZXRoZXJuZXQgZm91bmQuXG4iKTsKKwkJc2hvd19ib290X3Byb2dyZXNzICgtNjQpOwogCX0gZWxzZSB7CiAJCXN0cnVjdCBldGhfZGV2aWNlICpkZXYgPSBldGhfZGV2aWNlczsKIAkJY2hhciAqZXRocHJpbWUgPSBnZXRlbnYgKCJldGhwcmltZSIpOwogCisJCXNob3dfYm9vdF9wcm9ncmVzcyAoNjUpOwogCQlkbyB7CiAJCQlpZiAoZXRoX251bWJlcikKIAkJCQlwdXRzICgiLCAiKTsKQEAgLTQ3NCwxNiArNDU4LDE4IEBACiB7CiAJcmV0dXJuIChldGhfY3VycmVudCA/IGV0aF9jdXJyZW50LT5uYW1lIDogInVua25vd24iKTsKIH0KLSNlbGlmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgIWRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmICFkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpCiAKIGV4dGVybiBpbnQgYXQ5MXJtOTIwMF9taWlwaHlfaW5pdGlhbGl6ZShiZF90ICpiaXMpOwogZXh0ZXJuIGludCBlbWFjNHh4X21paXBoeV9pbml0aWFsaXplKGJkX3QgKmJpcyk7CiBleHRlcm4gaW50IG1jZjUyeDJfbWlpcGh5X2luaXRpYWxpemUoYmRfdCAqYmlzKTsKIGV4dGVybiBpbnQgbnM3NTIwX21paXBoeV9pbml0aWFsaXplKGJkX3QgKmJpcyk7CitleHRlcm4gaW50IGRtNjQ0eF9ldGhfbWlpcGh5X2luaXRpYWxpemUoYmRfdCAqYmlzKTsKKwogCiBpbnQgZXRoX2luaXRpYWxpemUoYmRfdCAqYmlzKQogewotI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQorI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKIAltaWlwaHlfaW5pdCgpOwogI2VuZGlmCiAKQEAgLTUwMCw2ICs0ODYsOSBAQAogI2lmIGRlZmluZWQoQ09ORklHX05FVEFSTSkKIAluczc1MjBfbWlpcGh5X2luaXRpYWxpemUoYmlzKTsKICNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0RSSVZFUl9USV9FTUFDKQorCWRtNjQ0eF9ldGhfbWlpcGh5X2luaXRpYWxpemUoYmlzKTsKKyNlbmRpZgogCXJldHVybiAwOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvbmV0LmMgYi9uZXQvbmV0LmMKaW5kZXggMmZmN2JmYy4uZTlkNzc1NyAxMDA2NDQKLS0tIGEvbmV0L25ldC5jCisrKyBiL25ldC9uZXQuYwpAQCAtODYsMTEgKzg2LDExIEBACiAjaW5jbHVkZSA8c3RhdHVzX2xlZC5oPgogI2luY2x1ZGUgPG1paXBoeS5oPgogI2VuZGlmCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU05UUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU05UUCkKICNpbmNsdWRlICJzbnRwLmgiCiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCiBERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKIApAQCAtMTEwLDcgKzExMCw3IEBACiBJUGFkZHJfdAlOZXRPdXJTdWJuZXRNYXNrPTA7CQkvKiBPdXIgc3VibmV0IG1hc2sgKDA9dW5rbm93bikJKi8KIElQYWRkcl90CU5ldE91ckdhdGV3YXlJUD0wOwkJLyogT3VyIGdhdGV3YXlzIElQIGFkZHJlc3MJKi8KIElQYWRkcl90CU5ldE91ckROU0lQPTA7CQkJLyogT3VyIEROUyBJUCBhZGRyZXNzCQkqLwotI2lmIChDT05GSUdfQk9PVFBfTUFTSyAmIENPTkZJR19CT09UUF9ETlMyKQorI2lmIGRlZmluZWQoQ09ORklHX0JPT1RQX0ROUzIpCiBJUGFkZHJfdAlOZXRPdXJETlMySVA9MDsJCQkvKiBPdXIgMm5kIEROUyBJUCBhZGRyZXNzCSovCiAjZW5kaWYKIGNoYXIJCU5ldE91ck5JU0RvbWFpblszMl09ezAsfTsJLyogT3VyIE5JUyBkb21haW4JCSovCkBAIC0xMzMsNyArMTMzLDcgQEAKIAkJCXsgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiB9OwogdWNoYXIJCU5ldEV0aGVyTnVsbEFkZHJbNl0gPQogCQkJeyAwLCAwLCAwLCAwLCAwLCAwIH07Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQ0RQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9DRFApCiB1Y2hhcgkJTmV0Q0RQQWRkcls2XSA9CQkvKiBFdGhlcm5ldCBiY2FzdCBhZGRyZXNzCQkqLwogCQkJeyAweDAxLCAweDAwLCAweDBjLCAweGNjLCAweGNjLCAweGNjIH07CiAjZW5kaWYKQEAgLTE1MCwxNyArMTUwLDE3IEBACiAKIGNoYXIJCUJvb3RGaWxlWzEyOF07CQkvKiBCb290IEZpbGUgbmFtZQkJCSovCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QSU5HKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QSU5HKQogSVBhZGRyX3QJTmV0UGluZ0lQOwkJLyogdGhlIGlwIGFkZHJlc3MgdG8gcGluZyAJCSovCiAKIHN0YXRpYyB2b2lkIFBpbmdTdGFydCh2b2lkKTsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQ0RQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9DRFApCiBzdGF0aWMgdm9pZCBDRFBTdGFydCh2b2lkKTsKICNlbmRpZgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU05UUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU05UUCkKIElQYWRkcl90CU5ldE50cFNlcnZlcklQOwkJLyogTlRQIHNlcnZlciBJUCBhZGRyZXNzCQkqLwogaW50CQlOZXRUaW1lT2Zmc2V0PTA7CS8qIG9mZnNldCB0aW1lIGZyb20gVVRDCQkJKi8KICNlbmRpZgpAQCAtMzI2LDEzICszMjYsMTMgQEAKIAkgKi8KIAogCXN3aXRjaCAocHJvdG9jb2wpIHsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORlMpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05GUykKIAljYXNlIE5GUzoKICNlbmRpZgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BJTkcpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1BJTkcpCiAJY2FzZSBQSU5HOgogI2VuZGlmCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU05UUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfU05UUCkKIAljYXNlIFNOVFA6CiAjZW5kaWYKIAljYXNlIE5FVENPTlM6CkBAIC0zNDQsMTkgKzM0NCwxOSBAQAogCQlOZXRPdXJOYXRpdmVWTEFOID0gZ2V0ZW52X1ZMQU4oIm52bGFuIik7CiAKIAkJc3dpdGNoIChwcm90b2NvbCkgewotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05GUykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkZTKQogCQljYXNlIE5GUzoKICNlbmRpZgogCQljYXNlIE5FVENPTlM6CiAJCWNhc2UgVEZUUDoKIAkJCU5ldFNlcnZlcklQID0gZ2V0ZW52X0lQYWRkciAoInNlcnZlcmlwIik7CiAJCQlicmVhazsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QSU5HKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QSU5HKQogCQljYXNlIFBJTkc6CiAJCQkvKiBub3RoaW5nICovCiAJCQlicmVhazsKICNlbmRpZgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NOVFApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX1NOVFApCiAJCWNhc2UgU05UUDoKIAkJCS8qIG5vdGhpbmcgKi8KIAkJCWJyZWFrOwpAQCAtNDA2LDcgKzQwNiw3IEBACiAJCQlUZnRwU3RhcnQoKTsKIAkJCWJyZWFrOwogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREhDUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfREhDUCkKIAkJY2FzZSBESENQOgogCQkJLyogU3RhcnQgd2l0aCBhIGNsZWFuIHNsYXRlLi4uICovCiAJCQlCb290cFRyeSA9IDA7CkBAIC00MTQsNyArNDE0LDcgQEAKIAkJCU5ldFNlcnZlcklQID0gZ2V0ZW52X0lQYWRkciAoInNlcnZlcmlwIik7CiAJCQlEaGNwUmVxdWVzdCgpOwkJLyogQmFzaWNhbGx5IHNhbWUgYXMgQk9PVFAgKi8KIAkJCWJyZWFrOwotI2VuZGlmIC8qIENGR19DTURfREhDUCAqLworI2VuZGlmCiAKIAkJY2FzZSBCT09UUDoKIAkJCUJvb3RwVHJ5ID0gMDsKQEAgLTQyNSwxNyArNDI1LDE3IEBACiAJCQlSYXJwVHJ5ID0gMDsKIAkJCVJhcnBSZXF1ZXN0ICgpOwogCQkJYnJlYWs7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfUElORykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfUElORykKIAkJY2FzZSBQSU5HOgogCQkJUGluZ1N0YXJ0KCk7CiAJCQlicmVhazsKICNlbmRpZgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05GUykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkZTKQogCQljYXNlIE5GUzoKIAkJCU5mc1N0YXJ0KCk7CiAJCQlicmVhazsKICNlbmRpZgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0NEUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQ0RQKQogCQljYXNlIENEUDoKIAkJCUNEUFN0YXJ0KCk7CiAJCQlicmVhazsKQEAgLTQ0NSw3ICs0NDUsNyBAQAogCQkJTmNTdGFydCgpOwogCQkJYnJlYWs7CiAjZW5kaWYKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TTlRQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9TTlRQKQogCQljYXNlIFNOVFA6CiAJCQlTbnRwU3RhcnQoKTsKIAkJCWJyZWFrOwpAQCAtNDU4LDcgKzQ1OCw3IEBACiAJCWJyZWFrOwogCX0KIAotI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQorI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKICNpZiBkZWZpbmVkKENGR19GQVVMVF9FQ0hPX0xJTktfRE9XTikgJiYgZGVmaW5lZChDT05GSUdfU1RBVFVTX0xFRCkgJiYgZGVmaW5lZChTVEFUVVNfTEVEX1JFRCkKIAkvKgogCSAqIEVjaG8gdGhlIGludmVydGVkIGxpbmsgc3RhdGUgdG8gdGhlIGZhdWx0IExFRC4KQEAgLTUwNyw3ICs1MDcsNyBAQAogCQlpZiAodGltZUhhbmRsZXIgJiYgKChnZXRfdGltZXIoMCkgLSB0aW1lU3RhcnQpID4gdGltZURlbHRhKSkgewogCQkJdGhhbmRfZiAqeDsKIAotI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTUlJKQorI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKICMgIGlmIGRlZmluZWQoQ0ZHX0ZBVUxUX0VDSE9fTElOS19ET1dOKSAmJiBcCiAgICAgICBkZWZpbmVkKENPTkZJR19TVEFUVVNfTEVEKSAmJgkgICBcCiAgICAgICBkZWZpbmVkKFNUQVRVU19MRURfUkVEKQpAQCAtNjg3LDcgKzY4Nyw3IEBACiAJcmV0dXJuIDA7CS8qIHRyYW5zbWl0dGVkICovCiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QSU5HKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QSU5HKQogc3RhdGljIHVzaG9ydCBQaW5nU2VxTm87CiAKIGludCBQaW5nU2VuZCh2b2lkKQpAQCAtNzc1LDkgKzc3NSw5IEBACiAKIAlQaW5nU2VuZCgpOwogfQotI2VuZGlmCS8qIENGR19DTURfUElORyAqLworI2VuZGlmCiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9DRFApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0NEUCkKIAogI2RlZmluZSBDRFBfREVWSUNFX0lEX1RMVgkJMHgwMDAxCiAjZGVmaW5lIENEUF9BRERSRVNTX1RMVgkJCTB4MDAwMgpAQCAtMTEyOCw3ICsxMTI4LDcgQEAKIAogCUNEUFNlbmRUcmlnZ2VyKCk7CiB9Ci0jZW5kaWYJLyogQ0ZHX0NNRF9DRFAgKi8KKyNlbmRpZgogCiAKIHZvaWQKQEAgLTExNDAsNyArMTE0MCw3IEBACiAJSVBhZGRyX3QgdG1wOwogCWludAl4OwogCXVjaGFyICpwa3Q7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfQ0RQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9DRFApCiAJaW50IGlzY2RwOwogI2VuZGlmCiAJdXNob3J0IGN0aSA9IDAsIHZsYW5pZCA9IFZMQU5fTk9ORSwgbXl2bGFuaWQsIG15bnZsYW5pZDsKQEAgLTExNTcsNyArMTE1Nyw3IEBACiAJaWYgKGxlbiA8IEVUSEVSX0hEUl9TSVpFKQogCQlyZXR1cm47CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9DRFApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0NEUCkKIAkvKiBrZWVwIHRyYWNrIGlmIHBhY2tldCBpcyBDRFAgKi8KIAlpc2NkcCA9IG1lbWNtcChldC0+ZXRfZGVzdCwgTmV0Q0RQQWRkciwgNikgPT0gMDsKICNlbmRpZgpAQCAtMTIwMCw3ICsxMjAwLDcgQEAKIAogCQkvKiBpZiBubyBWTEFOIGFjdGl2ZSAqLwogCQlpZiAoKG50b2hzKE5ldE91clZMQU4pICYgVkxBTl9JRE1BU0spID09IFZMQU5fTk9ORQotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0NEUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQ0RQKQogCQkJCSYmIGlzY2RwID09IDAKICNlbmRpZgogCQkJCSkKQEAgLTEyMTgsNyArMTIxOCw3IEBACiAJcHJpbnRmKCJSZWNlaXZlIGZyb20gcHJvdG9jb2wgMHgleFxuIiwgeCk7CiAjZW5kaWYKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0NEUCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQ0RQKQogCWlmIChpc2NkcCkgewogCQlDRFBIYW5kbGVyKCh1Y2hhciAqKWlwLCBsZW4pOwogCQlyZXR1cm47CkBAIC0xNDE2LDcgKzE0MTYsNyBAQAogCQkJCXByaW50X0lQYWRkcihpY21waC0+dW4uZ2F0ZXdheSk7CiAJCQkJcHV0YygnICcpOwogCQkJCXJldHVybjsKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QSU5HKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QSU5HKQogCQkJY2FzZSBJQ01QX0VDSE9fUkVQTFk6CiAJCQkJLyoKIAkJCQkgKglJUCBoZWFkZXIgT0suICBQYXNzIHRoZSBwYWNrZXQgdG8gdGhlIGN1cnJlbnQgaGFuZGxlci4KQEAgLTE1MTYsNyArMTUxNiw3IEBACiB7CiAJc3dpdGNoIChwcm90b2NvbCkgewogCQkvKiBGYWxsIHRocm91Z2ggKi8KLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9QSU5HKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QSU5HKQogCWNhc2UgUElORzoKIAkJaWYgKE5ldFBpbmdJUCA9PSAwKSB7CiAJCQlwdXRzICgiKioqIEVSUk9SOiBwaW5nIGFkZHJlc3Mgbm90IGdpdmVuXG4iKTsKQEAgLTE1MjQsNyArMTUyNCw3IEBACiAJCX0KIAkJZ290byBjb21tb247CiAjZW5kaWYKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TTlRQKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9TTlRQKQogCWNhc2UgU05UUDoKIAkJaWYgKE5ldE50cFNlcnZlcklQID09IDApIHsKIAkJCXB1dHMgKCIqKiogRVJST1I6IE5UUCBzZXJ2ZXIgYWRkcmVzcyBub3QgZ2l2ZW5cbiIpOwpAQCAtMTUzMiw3ICsxNTMyLDcgQEAKIAkJfQogCQlnb3RvIGNvbW1vbjsKICNlbmRpZgotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05GUykKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkZTKQogCWNhc2UgTkZTOgogI2VuZGlmCiAJY2FzZSBORVRDT05TOgpAQCAtMTU0MSw3ICsxNTQxLDcgQEAKIAkJCXB1dHMgKCIqKiogRVJST1I6IGBzZXJ2ZXJpcCcgbm90IHNldFxuIik7CiAJCQlyZXR1cm4gKDEpOwogCQl9Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIChDRkdfQ01EX1BJTkcgfCBDRkdfQ01EX1NOVFApKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9QSU5HKSB8fCBkZWZpbmVkKENPTkZJR19DTURfU05UUCkKICAgICBjb21tb246CiAjZW5kaWYKIApAQCAtMTY5Myw3ICsxNjkzLDcgQEAKIAkqZHN0ID0gJ1wwJzsKIH0KIAotI2VuZGlmIC8qIENGR19DTURfTkVUICovCisjZW5kaWYKIAogdm9pZCBpcF90b19zdHJpbmcgKElQYWRkcl90IHgsIGNoYXIgKnMpCiB7CmRpZmYgLS1naXQgYS9uZXQvbmZzLmMgYi9uZXQvbmZzLmMKaW5kZXggZGU3ODllMS4uZGYyY2FhYyAxMDA2NDQKLS0tIGEvbmV0L25mcy5jCisrKyBiL25ldC9uZnMuYwpAQCAtMzEsNyArMzEsNyBAQAogCiAvKiNkZWZpbmUgTkZTX0RFQlVHKi8KIAotI2lmICgoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9ORVQpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05GUykpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfQ01EX05GUykKIAogI2RlZmluZSBIQVNIRVNfUEVSX0xJTkUgNjUJLyogTnVtYmVyIG9mICJsb2FkaW5nIiBoYXNoZXMgcGVyIGxpbmUJKi8KICNkZWZpbmUgTkZTX1RJTUVPVVQgNjAKQEAgLTc3NSw0ICs3NzUsNCBAQAogCU5mc1NlbmQgKCk7CiB9CiAKLSNlbmRpZiAvKiBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05GUyAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvcmFycC5jIGIvbmV0L3JhcnAuYwppbmRleCAxYmE2MGU4Li4yMWRmYTUyIDEwMDY0NAotLS0gYS9uZXQvcmFycC5jCisrKyBiL25ldC9yYXJwLmMKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlICJyYXJwLmgiCiAjaW5jbHVkZSAidGZ0cC5oIgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkVUKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpCiAKICNkZWZpbmUgVElNRU9VVAkJNQkJLyogU2Vjb25kcyBiZWZvcmUgdHJ5aW5nIEJPT1RQIGFnYWluICovCiAjaWZuZGVmCUNPTkZJR19ORVRfUkVUUllfQ09VTlQKQEAgLTU5LDcgKzU5LDcgQEAKIAkJCSAqLwogCQkJTmV0U3RhdGUgPSBORVRMT09QX1NVQ0NFU1M7CiAJCQlyZXR1cm47Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfTkZTKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORlMpCiAJCX0gZWxzZSBpZiAoKHMgIT0gTlVMTCkgJiYgIXN0cmNtcChzLCAiTkZTIikpIHsKIAkJCU5mc1N0YXJ0KCk7CiAJCQlyZXR1cm47CkBAIC0xMTksNCArMTE5LDQgQEAKIAlOZXRTZXRIYW5kbGVyKFJhcnBIYW5kbGVyKTsKIH0KIAotI2VuZGlmIC8qIENGR19DTURfTkVUICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9zbnRwLmMgYi9uZXQvc250cC5jCmluZGV4IGRiOGMyYzIuLjk1ZTc1NDIgMTAwNjQ0Ci0tLSBhL25ldC9zbnRwLmMKKysrIGIvbmV0L3NudHAuYwpAQCAtMTIsNyArMTIsNyBAQAogCiAjaW5jbHVkZSAic250cC5oIgogCi0jaWYgKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU05UUCkpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfQ01EX1NOVFApCiAKICNkZWZpbmUgU05UUF9USU1FT1VUIDEwCiAKQEAgLTY3LDcgKzY3LDcgQEAKIAltZW1jcHkgKCZzZWNvbmRzLCAmcnBrdHAtPnRyYW5zbWl0X3RpbWVzdGFtcCwgc2l6ZW9mKHVsb25nKSk7CiAKIAl0b190bShudG9obChzZWNvbmRzKSAtIDIyMDg5ODg4MDBVTCArIE5ldFRpbWVPZmZzZXQsICZ0bSk7Ci0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREFURSkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfREFURSkKIAlydGNfc2V0ICgmdG0pOwogI2VuZGlmCiAJcHJpbnRmICgiRGF0ZTogJTRkLSUwMmQtJTAyZCBUaW1lOiAlMmQ6JTAyZDolMDJkXG4iLApAQCAtODksNCArODksNCBAQAogCVNudHBTZW5kICgpOwogfQogCi0jZW5kaWYgLyogQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TTlRQICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC90ZnRwLmMgYi9uZXQvdGZ0cC5jCmluZGV4IGYzYTU0NzEuLmQ1NmUzMGIgMTAwNjQ0Ci0tLSBhL25ldC90ZnRwLmMKKysrIGIvbmV0L3RmdHAuYwpAQCAtMTIsNyArMTIsNyBAQAogCiAjdW5kZWYJRVRfREVCVUcKIAotI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX05FVCkKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQogCiAjZGVmaW5lIFdFTExfS05PV05fUE9SVAk2OQkJLyogV2VsbCBrbm93biBURlRQIHBvcnQgIwkJKi8KICNkZWZpbmUgVElNRU9VVAkJNQkJLyogU2Vjb25kcyB0byB0aW1lb3V0IGZvciBhIGxvc3QgcGt0CSovCkBAIC0zODYsNCArMzg2LDQgQEAKIAlUZnRwU2VuZCAoKTsKIH0KIAotI2VuZGlmIC8qIENGR19DTURfTkVUICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Bvc3QvY3B1L21wYzh4eC9NYWtlZmlsZSBiL3Bvc3QvY3B1L21wYzh4eC9NYWtlZmlsZQppbmRleCA5ZGQzZjBmLi5mODcxY2JhIDEwMDY0NAotLS0gYS9wb3N0L2NwdS9tcGM4eHgvTWFrZWZpbGUKKysrIGIvcG9zdC9jcHUvbXBjOHh4L01ha2VmaWxlCkBAIC0yNCw2ICsyNCw2IEBACiBMSUIJPSBsaWJwb3N0bXBjOHh4LmEKIAogQU9CSlMJPSBjYWNoZV84eHgubwotQ09CSlMJPSBldGhlci5vIHNwci5vIHVhcnQubyB1c2IubyB3YXRjaGRvZy5vCitDT0JKUwk9IGNhY2hlLm8gZXRoZXIubyBzcHIubyB1YXJ0Lm8gdXNiLm8gd2F0Y2hkb2cubwogCiBpbmNsdWRlICQoVE9QRElSKS9wb3N0L3J1bGVzLm1rCmRpZmYgLS1naXQgYS9wb3N0L2RyaXZlcnMvY2FjaGUuYyBiL3Bvc3QvY3B1L21wYzh4eC9jYWNoZS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwb3N0L2RyaXZlcnMvY2FjaGUuYwpyZW5hbWUgdG8gcG9zdC9jcHUvbXBjOHh4L2NhY2hlLmMKZGlmZiAtLWdpdCBhL3Bvc3QvY3B1L3BwYzR4eC9NYWtlZmlsZSBiL3Bvc3QvY3B1L3BwYzR4eC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTAzNGRhCi0tLSAvZGV2L251bGwKKysrIGIvcG9zdC9jcHUvcHBjNHh4L01ha2VmaWxlCkBAIC0wLDAgKzEsMjkgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAyLTIwMDcKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworTElCCT0gbGlicG9zdHBwYzR4eC5hCisKK0FPQkpTICAgPSBjYWNoZV80eHgubworQ09CSlMJPSBjYWNoZS5vIGV0aGVyLm8gZnB1Lm8gc3ByLm8gdWFydC5vIHdhdGNoZG9nLm8KKworaW5jbHVkZSAkKFRPUERJUikvcG9zdC9ydWxlcy5tawpkaWZmIC0tZ2l0IGEvcG9zdC9jcHUvcHBjNHh4L2NhY2hlLmMgYi9wb3N0L2NwdS9wcGM0eHgvY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWY5ODllCi0tLSAvZGV2L251bGwKKysrIGIvcG9zdC9jcHUvcHBjNHh4L2NhY2hlLmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDcKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogQXV0aG9yOiBJZ29yIExpc2l0c2luIDxpZ29yQGVtY3JhZnQuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworLyogQ2FjaGUgdGVzdAorICoKKyAqIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGUgQ1BVIGRhdGEgYW5kIGluc3RydWN0aW9uIGNhY2hlIHVzaW5nCisgKiBzZXZlcmFsIHRlc3Qgc2NlbmFyaW9zLgorICovCisKKyNpZmRlZiBDT05GSUdfUE9TVAorCisjaW5jbHVkZSA8cG9zdC5oPgorCisjaWYgQ09ORklHX1BPU1QgJiBDRkdfUE9TVF9DQUNIRQorCisjaW5jbHVkZSA8YXNtL21tdS5oPgorI2luY2x1ZGUgPHdhdGNoZG9nLmg+CisKKyNkZWZpbmUgQ0FDSEVfUE9TVF9TSVpFCTEwMjQKKwordm9pZCBwcm9ncmFtX3RsYih1MzIgcGh5c19hZGRyLCB1MzIgdmlydF9hZGRyLCB1MzIgc2l6ZSwgdTMyIHRsYl93b3JkMl9pX3ZhbHVlKTsKKworaW50IGNhY2hlX3Bvc3RfdGVzdDEgKGludCB0bGIsIHZvaWQgKnAsIGludCBzaXplKTsKK2ludCBjYWNoZV9wb3N0X3Rlc3QyIChpbnQgdGxiLCB2b2lkICpwLCBpbnQgc2l6ZSk7CitpbnQgY2FjaGVfcG9zdF90ZXN0MyAoaW50IHRsYiwgdm9pZCAqcCwgaW50IHNpemUpOworaW50IGNhY2hlX3Bvc3RfdGVzdDQgKGludCB0bGIsIHZvaWQgKnAsIGludCBzaXplKTsKK2ludCBjYWNoZV9wb3N0X3Rlc3Q1IChpbnQgdGxiLCB2b2lkICpwLCBpbnQgc2l6ZSk7CitpbnQgY2FjaGVfcG9zdF90ZXN0NiAoaW50IHRsYiwgdm9pZCAqcCwgaW50IHNpemUpOworCitzdGF0aWMgaW50IHRsYiA9IC0xOwkJLyogaW5kZXggdG8gdGhlIHZpY3RpbSBUTEIgZW50cnkgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdGVzdGFyZWFbQ0FDSEVfUE9TVF9TSVpFXQorX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oQ0FDSEVfUE9TVF9TSVpFKSkpOworCitpbnQgY2FjaGVfcG9zdF90ZXN0IChpbnQgZmxhZ3MpCit7CisJdm9pZCogdmlydCA9ICh2b2lkKilDRkdfUE9TVF9DQUNIRV9BRERSOworCWludCBpbnRzLCBpLCByZXMgPSAwOworCXUzMiB3b3JkMDsKKworCWlmICh0bGIgPCAwKSB7CisJCS8qCisJCSAqIEFsbG9jYXRlIGEgbmV3IFRMQiBlbnRyeSwgc2luY2Ugd2UgYXJlIGdvaW5nIHRvIG1vZGlmeQorCQkgKiB0aGUgd3JpdGUtdGhyb3VnaCBhbmQgY2FjaGluZyBpbmhpYml0ZWQgc3RvcmFnZSBhdHRyaWJ1dGVzLgorCQkgKi8KKwkJcHJvZ3JhbV90bGIoKHUzMil0ZXN0YXJlYSwgKHUzMil2aXJ0LAorCQkJICAgIENBQ0hFX1BPU1RfU0laRSwgVExCX1dPUkQyX0lfRU5BQkxFKTsKKworCQkvKiBGaW5kIHRoZSBUTEIgZW50cnkgKi8KKwkJZm9yIChpID0gMDs7IGkrKykgeworCQkJaWYgKGkgPj0gUFBDNFhYX1RMQl9TSVpFKSB7CisJCQkJcHJpbnRmICgiRmFpbGVkIHRvIHByb2dyYW0gdGxiIGVudHJ5XG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQl3b3JkMCA9IG1mdGxiMShpKTsKKwkJCWlmIChUTEJfV09SRDBfRVBOX0RFQ09ERSh3b3JkMCkgPT0gKHUzMil2aXJ0KSB7CisJCQkJdGxiID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlpbnRzID0gZGlzYWJsZV9pbnRlcnJ1cHRzICgpOworCisJV0FUQ0hET0dfUkVTRVQgKCk7CisJaWYgKHJlcyA9PSAwKQorCQlyZXMgPSBjYWNoZV9wb3N0X3Rlc3QxICh0bGIsIHZpcnQsIENBQ0hFX1BPU1RfU0laRSk7CisJV0FUQ0hET0dfUkVTRVQgKCk7CisJaWYgKHJlcyA9PSAwKQorCQlyZXMgPSBjYWNoZV9wb3N0X3Rlc3QyICh0bGIsIHZpcnQsIENBQ0hFX1BPU1RfU0laRSk7CisJV0FUQ0hET0dfUkVTRVQgKCk7CisJaWYgKHJlcyA9PSAwKQorCQlyZXMgPSBjYWNoZV9wb3N0X3Rlc3QzICh0bGIsIHZpcnQsIENBQ0hFX1BPU1RfU0laRSk7CisJV0FUQ0hET0dfUkVTRVQgKCk7CisJaWYgKHJlcyA9PSAwKQorCQlyZXMgPSBjYWNoZV9wb3N0X3Rlc3Q0ICh0bGIsIHZpcnQsIENBQ0hFX1BPU1RfU0laRSk7CisJV0FUQ0hET0dfUkVTRVQgKCk7CisJaWYgKHJlcyA9PSAwKQorCQlyZXMgPSBjYWNoZV9wb3N0X3Rlc3Q1ICh0bGIsIHZpcnQsIENBQ0hFX1BPU1RfU0laRSk7CisJV0FUQ0hET0dfUkVTRVQgKCk7CisJaWYgKHJlcyA9PSAwKQorCQlyZXMgPSBjYWNoZV9wb3N0X3Rlc3Q2ICh0bGIsIHZpcnQsIENBQ0hFX1BPU1RfU0laRSk7CisKKwlpZiAoaW50cykKKwkJZW5hYmxlX2ludGVycnVwdHMgKCk7CisKKwlyZXR1cm4gcmVzOworfQorCisjZW5kaWYgLyogQ09ORklHX1BPU1QgJiBDRkdfUE9TVF9DQUNIRSAqLworI2VuZGlmIC8qIENPTkZJR19QT1NUICovCmRpZmYgLS1naXQgYS9wb3N0L2NwdS9wcGM0eHgvY2FjaGVfNHh4LlMgYi9wb3N0L2NwdS9wcGM0eHgvY2FjaGVfNHh4LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRkZDc2YgotLS0gL2Rldi9udWxsCisrKyBiL3Bvc3QvY3B1L3BwYzR4eC9jYWNoZV80eHguUwpAQCAtMCwwICsxLDQ0OCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNworICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBBdXRob3I6IElnb3IgTGlzaXRzaW4gPGlnb3JAZW1jcmFmdC5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaWZkZWYgQ09ORklHX1BPU1QKKworI2luY2x1ZGUgPHBvc3QuaD4KKyNpbmNsdWRlIDxwcGNfYXNtLnRtcGw+CisjaW5jbHVkZSA8cHBjX2RlZnMuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vbW11Lmg+CisKKyNpZiBDT05GSUdfUE9TVCAmIENGR19QT1NUX0NBQ0hFCisKKwkudGV4dAorCisvKiB2b2lkIGNhY2hlX3Bvc3RfZGlzYWJsZSAoaW50IHRsYikKKyAqLworY2FjaGVfcG9zdF9kaXNhYmxlOgorCXRsYnJlCXIwLCByMywgMHgwMDAyCisJb3JpCXIwLCByMCwgVExCX1dPUkQyX0lfRU5BQkxFQGwKKwl0bGJ3ZQlyMCwgcjMsIDB4MDAwMgorCXN5bmMKKwlpc3luYworCWJscgorCisvKiB2b2lkIGNhY2hlX3Bvc3Rfd3QgKGludCB0bGIpCisgKi8KK2NhY2hlX3Bvc3Rfd3Q6CisJdGxicmUJcjAsIHIzLCAweDAwMDIKKwlvcmkJcjAsIHIwLCBUTEJfV09SRDJfV19FTkFCTEVAbAorCWFuZGkuCXIwLCByMCwgflRMQl9XT1JEMl9JX0VOQUJMRUBsCisJdGxid2UJcjAsIHIzLCAweDAwMDIKKwlzeW5jCisJaXN5bmMKKwlibHIKKworLyogdm9pZCBjYWNoZV9wb3N0X3diIChpbnQgdGxiKQorICovCitjYWNoZV9wb3N0X3diOgorCXRsYnJlCXIwLCByMywgMHgwMDAyCisJYW5kaS4JcjAsIHIwLCB+VExCX1dPUkQyX1dfRU5BQkxFQGwKKwlhbmRpLglyMCwgcjAsIH5UTEJfV09SRDJfSV9FTkFCTEVAbAorCXRsYndlCXIwLCByMywgMHgwMDAyCisJc3luYworCWlzeW5jCisJYmxyCisKKy8qIHZvaWQgY2FjaGVfcG9zdF9kaW52YWxpZGF0ZSAodm9pZCAqcCwgaW50IHNpemUpCisgKi8KK2NhY2hlX3Bvc3RfZGludmFsaWRhdGU6CisJZGNiaQlyMCwgcjMKKwlhZGRpCXIzLCByMywgQ0ZHX0NBQ0hFTElORV9TSVpFCisJc3ViaWMuCXI0LCByNCwgQ0ZHX0NBQ0hFTElORV9TSVpFCisJYmd0CWNhY2hlX3Bvc3RfZGludmFsaWRhdGUKKwlzeW5jCisJYmxyCisKKy8qIHZvaWQgY2FjaGVfcG9zdF9kc3RvcmUgKHZvaWQgKnAsIGludCBzaXplKQorICovCitjYWNoZV9wb3N0X2RzdG9yZToKKwlkY2JzdAlyMCwgcjMKKwlhZGRpCXIzLCByMywgQ0ZHX0NBQ0hFTElORV9TSVpFCisJc3ViaWMuCXI0LCByNCwgQ0ZHX0NBQ0hFTElORV9TSVpFCisJYmd0CWNhY2hlX3Bvc3RfZHN0b3JlCisJc3luYworCWJscgorCisvKiB2b2lkIGNhY2hlX3Bvc3RfZHRvdWNoICh2b2lkICpwLCBpbnQgc2l6ZSkKKyAqLworY2FjaGVfcG9zdF9kdG91Y2g6CisJZGNidAlyMCwgcjMKKwlhZGRpCXIzLCByMywgQ0ZHX0NBQ0hFTElORV9TSVpFCisJc3ViaWMuCXI0LCByNCwgQ0ZHX0NBQ0hFTElORV9TSVpFCisJYmd0CWNhY2hlX3Bvc3RfZHRvdWNoCisJc3luYworCWJscgorCisvKiB2b2lkIGNhY2hlX3Bvc3RfaWludmFsaWRhdGUgKHZvaWQpCisgKi8KK2NhY2hlX3Bvc3RfaWludmFsaWRhdGU6CisJaWNjY2kJcjAsIHIwCisJc3luYworCWJscgorCisvKiB2b2lkIGNhY2hlX3Bvc3RfbWVtc2V0ICh2b2lkICpwLCBpbnQgdmFsLCBpbnQgc2l6ZSkKKyAqLworY2FjaGVfcG9zdF9tZW1zZXQ6CisJbXRjdHIJcjUKKzE6CisJc3RiCXI0LCAwKHIzKQorCWFkZGkJcjMsIHIzLCAxCisJYmRuegkxYgorCWJscgorCisvKiBpbnQgY2FjaGVfcG9zdF9jaGVjayAodm9pZCAqcCwgaW50IHNpemUpCisgKi8KK2NhY2hlX3Bvc3RfY2hlY2s6CisJbXRjdHIJcjQKKzE6CisJbGJ6CXIwLCAwKHIzKQorCWFkZGkJcjMsIHIzLCAxCisJY21wd2kJcjAsIDB4ZmYKKwlibmUJMmYKKwliZG56CTFiCisJbGkJcjMsIDAKKwlibHIKKzI6CisJbGkJcjMsIC0xCisJYmxyCisKKyNkZWZpbmUgQ0FDSEVfUE9TVF9ESVNBQkxFKCkJCVwKKwltcglyMywgcjEwOwkJXAorCWJsCWNhY2hlX3Bvc3RfZGlzYWJsZQorCisjZGVmaW5lIENBQ0hFX1BPU1RfV1QoKQkJCVwKKwltcglyMywgcjEwOwkJXAorCWJsCWNhY2hlX3Bvc3Rfd3QKKworI2RlZmluZSBDQUNIRV9QT1NUX1dCKCkJCQlcCisJbXIJcjMsIHIxMDsJCVwKKwlibAljYWNoZV9wb3N0X3diCisKKyNkZWZpbmUgQ0FDSEVfUE9TVF9ESU5WQUxJREFURSgpCVwKKwltcglyMywgcjExOwkJXAorCW1yCXI0LCByMTI7CQlcCisJYmwJY2FjaGVfcG9zdF9kaW52YWxpZGF0ZQorCisjZGVmaW5lIENBQ0hFX1BPU1RfREZMVVNIKCkJCVwKKwltcglyMywgcjExOwkJXAorCW1yCXI0LCByMTI7CQlcCisJYmwJY2FjaGVfcG9zdF9kZmx1c2gKKworI2RlZmluZSBDQUNIRV9QT1NUX0RTVE9SRSgpCQlcCisJbXIJcjMsIHIxMTsJCVwKKwltcglyNCwgcjEyOwkJXAorCWJsCWNhY2hlX3Bvc3RfZHN0b3JlCisKKyNkZWZpbmUgQ0FDSEVfUE9TVF9EVE9VQ0goKQkJXAorCW1yCXIzLCByMTE7CQlcCisJbXIJcjQsIHIxMjsJCVwKKwlibAljYWNoZV9wb3N0X2R0b3VjaAorCisjZGVmaW5lIENBQ0hFX1BPU1RfSUlOVkFMSURBVEUoKQlcCisJYmwJY2FjaGVfcG9zdF9paW52YWxpZGF0ZQorCisjZGVmaW5lIENBQ0hFX1BPU1RfTUVNU0VUKHZhbCkJCVwKKwltcglyMywgcjExOwkJXAorCWxpCXI0LCB2YWw7CQlcCisJbXIJcjUsIHIxMjsJCVwKKwlibAljYWNoZV9wb3N0X21lbXNldAorCisjZGVmaW5lIENBQ0hFX1BPU1RfQ0hFQ0soKQkJXAorCW1yCXIzLCByMTE7CQlcCisJbXIJcjQsIHIxMjsJCVwKKwlibAljYWNoZV9wb3N0X2NoZWNrOwlcCisJbXIJcjEzLCByMworCisvKgorICogV3JpdGUgYW5kIHJlYWQgMHhmZiBwYXR0ZXJuIHdpdGggY2FjaGluZyBlbmFibGVkLgorICovCisJLmdsb2JhbCBjYWNoZV9wb3N0X3Rlc3QxCitjYWNoZV9wb3N0X3Rlc3QxOgorCW1mbHIJcjkKKwltcglyMTAsIHIzCQkvKiB0bGIJCSovCisJbXIJcjExLCByNAkJLyogcAkJKi8KKwltcglyMTIsIHI1CQkvKiBzaXplCQkqLworCisJQ0FDSEVfUE9TVF9XQigpCisJQ0FDSEVfUE9TVF9ESU5WQUxJREFURSgpCisKKwkvKiBXcml0ZSB0aGUgbmVnYXRpdmUgcGF0dGVybiB0byB0aGUgdGVzdCBhcmVhICovCisJQ0FDSEVfUE9TVF9NRU1TRVQoMHhmZikKKworCS8qIFJlYWQgdGhlIHRlc3QgYXJlYSAqLworCUNBQ0hFX1BPU1RfQ0hFQ0soKQorCisJQ0FDSEVfUE9TVF9ESU5WQUxJREFURSgpCisJQ0FDSEVfUE9TVF9ESVNBQkxFKCkKKworCW1yCXIzLCByMTMKKwltdGxyCXI5CisJYmxyCisKKy8qCisgKiBXcml0ZSB6ZXJvZXMgd2l0aCBjYWNoaW5nIGVuYWJsZWQuCisgKiBXcml0ZSAweGZmIHBhdHRlcm4gd2l0aCBjYWNoaW5nIGRpc2FibGVkLgorICogUmVhZCAweGZmIHBhdHRlcm4gd2l0aCBjYWNoaW5nIGVuYWJsZWQuCisgKi8KKwkuZ2xvYmFsIGNhY2hlX3Bvc3RfdGVzdDIKK2NhY2hlX3Bvc3RfdGVzdDI6CisJbWZscglyOQorCW1yCXIxMCwgcjMJCS8qIHRsYgkJKi8KKwltcglyMTEsIHI0CQkvKiBwCQkqLworCW1yCXIxMiwgcjUJCS8qIHNpemUJCSovCisKKwlDQUNIRV9QT1NUX1dCKCkKKwlDQUNIRV9QT1NUX0RJTlZBTElEQVRFKCkKKworCS8qIFdyaXRlIHRoZSB6ZXJvIHBhdHRlcm4gdG8gdGhlIHRlc3QgYXJlYSAqLworCUNBQ0hFX1BPU1RfTUVNU0VUKDApCisKKwlDQUNIRV9QT1NUX0RJTlZBTElEQVRFKCkKKwlDQUNIRV9QT1NUX0RJU0FCTEUoKQorCisJLyogV3JpdGUgdGhlIG5lZ2F0aXZlIHBhdHRlcm4gdG8gdGhlIHRlc3QgYXJlYSAqLworCUNBQ0hFX1BPU1RfTUVNU0VUKDB4ZmYpCisKKwlDQUNIRV9QT1NUX1dCKCkKKworCS8qIFJlYWQgdGhlIHRlc3QgYXJlYSAqLworCUNBQ0hFX1BPU1RfQ0hFQ0soKQorCisJQ0FDSEVfUE9TVF9ESU5WQUxJREFURSgpCisJQ0FDSEVfUE9TVF9ESVNBQkxFKCkKKworCW1yCXIzLCByMTMKKwltdGxyCXI5CisJYmxyCisKKy8qCisgKiBXcml0ZS10aHJvdWdoIG1vZGUgdGVzdC4KKyAqIFdyaXRlIHplcm9lcywgc3RvcmUgdGhlIGNhY2hlLCB3cml0ZSAweGZmIHBhdHRlcm4uCisgKiBJbnZhbGlkYXRlIHRoZSBjYWNoZS4KKyAqIENoZWNrIHRoYXQgMHhmZiBwYXR0ZXJuIGlzIHJlYWQuCisgKi8KKwkuZ2xvYmFsIGNhY2hlX3Bvc3RfdGVzdDMKK2NhY2hlX3Bvc3RfdGVzdDM6CisJbWZscglyOQorCW1yCXIxMCwgcjMJCS8qIHRsYgkJKi8KKwltcglyMTEsIHI0CQkvKiBwCQkqLworCW1yCXIxMiwgcjUJCS8qIHNpemUJCSovCisKKwlDQUNIRV9QT1NUX1dUKCkKKwlDQUNIRV9QT1NUX0RJTlZBTElEQVRFKCkKKworCS8qIENhY2hlIHRoZSB0ZXN0IGFyZWEgKi8KKwlDQUNIRV9QT1NUX0RUT1VDSCgpCisKKwkvKiBXcml0ZSB0aGUgemVybyBwYXR0ZXJuIHRvIHRoZSB0ZXN0IGFyZWEgKi8KKwlDQUNIRV9QT1NUX01FTVNFVCgwKQorCisJQ0FDSEVfUE9TVF9EU1RPUkUoKQorCisJLyogV3JpdGUgdGhlIG5lZ2F0aXZlIHBhdHRlcm4gdG8gdGhlIHRlc3QgYXJlYSAqLworCUNBQ0hFX1BPU1RfTUVNU0VUKDB4ZmYpCisKKwlDQUNIRV9QT1NUX0RJTlZBTElEQVRFKCkKKwlDQUNIRV9QT1NUX0RJU0FCTEUoKQorCisJLyogUmVhZCB0aGUgdGVzdCBhcmVhICovCisJQ0FDSEVfUE9TVF9DSEVDSygpCisKKwltcglyMywgcjEzCisJbXRscglyOQorCWJscgorCisvKgorICogV3JpdGUtYmFjayBtb2RlIHRlc3QuCisgKiBXcml0ZSAweGZmIHBhdHRlcm4sIHN0b3JlIHRoZSBjYWNoZSwgd3JpdGUgemVyb2VzLgorICogSW52YWxpZGF0ZSB0aGUgY2FjaGUuCisgKiBDaGVjayB0aGF0IDB4ZmYgcGF0dGVybiBpcyByZWFkLgorICovCisJLmdsb2JhbCBjYWNoZV9wb3N0X3Rlc3Q0CitjYWNoZV9wb3N0X3Rlc3Q0OgorCW1mbHIJcjkKKwltcglyMTAsIHIzCQkvKiB0bGIJCSovCisJbXIJcjExLCByNAkJLyogcAkJKi8KKwltcglyMTIsIHI1CQkvKiBzaXplCQkqLworCisJQ0FDSEVfUE9TVF9XQigpCisJQ0FDSEVfUE9TVF9ESU5WQUxJREFURSgpCisKKwkvKiBDYWNoZSB0aGUgdGVzdCBhcmVhICovCisJQ0FDSEVfUE9TVF9EVE9VQ0goKQorCisJLyogV3JpdGUgdGhlIG5lZ2F0aXZlIHBhdHRlcm4gdG8gdGhlIHRlc3QgYXJlYSAqLworCUNBQ0hFX1BPU1RfTUVNU0VUKDB4ZmYpCisKKwlDQUNIRV9QT1NUX0RTVE9SRSgpCisKKwkvKiBXcml0ZSB0aGUgemVybyBwYXR0ZXJuIHRvIHRoZSB0ZXN0IGFyZWEgKi8KKwlDQUNIRV9QT1NUX01FTVNFVCgwKQorCisJQ0FDSEVfUE9TVF9ESU5WQUxJREFURSgpCisJQ0FDSEVfUE9TVF9ESVNBQkxFKCkKKworCS8qIFJlYWQgdGhlIHRlc3QgYXJlYSAqLworCUNBQ0hFX1BPU1RfQ0hFQ0soKQorCisJbXIJcjMsIHIxMworCW10bHIJcjkKKwlibHIKKworLyoKKyAqIExvYWQgdGhlIHRlc3QgaW5zdHJ1Y3Rpb25zIGludG8gdGhlIGluc3RydWN0aW9uIGNhY2hlLgorICogUmVwbGFjZSB0aGUgdGVzdCBpbnN0cnVjdGlvbnMuCisgKiBDaGVjayB0aGF0IHRoZSBvcmlnaW5hbCBpbnN0cnVjdGlvbnMgYXJlIGV4ZWN1dGVkLgorICovCisJLmdsb2JhbCBjYWNoZV9wb3N0X3Rlc3Q1CitjYWNoZV9wb3N0X3Rlc3Q1OgorCW1mbHIJcjkKKwltcglyMTAsIHIzCQkvKiB0bGIJCSovCisJbXIJcjExLCByNAkJLyogcAkJKi8KKwltcglyMTIsIHI1CQkvKiBzaXplCQkqLworCisJQ0FDSEVfUE9TVF9XVCgpCisJQ0FDSEVfUE9TVF9JSU5WQUxJREFURSgpCisKKwkvKiBDb21wdXRlIHIxMyA9IGNhY2hlX3Bvc3RfdGVzdF9pbnN0ICovCisJYmwJY2FjaGVfcG9zdF90ZXN0NV9yZWxvYworY2FjaGVfcG9zdF90ZXN0NV9yZWxvYzoKKwltZmxyCXIxMworCWxpcwlyMCwgKGNhY2hlX3Bvc3RfdGVzdF9pbnN0IC0gY2FjaGVfcG9zdF90ZXN0NV9yZWxvYylAaAorCW9yaQlyMCwgcjAsIChjYWNoZV9wb3N0X3Rlc3RfaW5zdCAtIGNhY2hlX3Bvc3RfdGVzdDVfcmVsb2MpQGwKKwlhZGQJcjEzLCByMTMsIHIwCisKKwkvKiBDb3B5IHRoZSB0ZXN0IGluc3RydWN0aW9ucyB0byB0aGUgdGVzdCBhcmVhICovCisJbHd6CXIwLCAwKHIxMykKKwlzdHcJcjAsIDAocjExKQorCWx3eglyMCwgOChyMTMpCisJc3R3CXIwLCA0KHIxMSkKKwlzeW5jCisKKwkvKiBJbnZhbGlkYXRlIHRoZSBjYWNoZSBsaW5lICovCisJaWNiaQlyMCwgcjExCisJc3luYworCWlzeW5jCisKKwkvKiBFeGVjdXRlIHRoZSB0ZXN0IGluc3RydWN0aW9ucyAqLworCW10bHIJcjExCisJYmxybAorCisJLyogUmVwbGFjZSB0aGUgdGVzdCBpbnN0cnVjdGlvbiAqLworCWx3eglyMCwgNChyMTMpCisJc3R3CXIwLCAwKHIxMSkKKwlzeW5jCisKKwkvKiBEbyBub3QgaW52YWxpZGF0ZSB0aGUgY2FjaGUgbGluZSAqLworCWlzeW5jCisKKwkvKiBFeGVjdXRlIHRoZSB0ZXN0IGluc3RydWN0aW9ucyAqLworCW10bHIJcjExCisJYmxybAorCW1yCXIxMywgcjMKKworCUNBQ0hFX1BPU1RfSUlOVkFMSURBVEUoKQorCUNBQ0hFX1BPU1RfRElOVkFMSURBVEUoKQorCUNBQ0hFX1BPU1RfRElTQUJMRSgpCisKKwltcglyMywgcjEzCisJbXRscglyOQorCWJscgorCisvKgorICogTG9hZCB0aGUgdGVzdCBpbnN0cnVjdGlvbnMgaW50byB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUuCisgKiBSZXBsYWNlIHRoZSB0ZXN0IGluc3RydWN0aW9ucyBhbmQgaW52YWxpZGF0ZSB0aGUgY2FjaGUuCisgKiBDaGVjayB0aGF0IHRoZSByZXBsYWNlZCBpbnN0cnVjdGlvbnMgYXJlIGV4ZWN1dGVkLgorICovCisJLmdsb2JhbCBjYWNoZV9wb3N0X3Rlc3Q2CitjYWNoZV9wb3N0X3Rlc3Q2OgorCW1mbHIJcjkKKwltcglyMTAsIHIzCQkvKiB0bGIJCSovCisJbXIJcjExLCByNAkJLyogcAkJKi8KKwltcglyMTIsIHI1CQkvKiBzaXplCQkqLworCisJQ0FDSEVfUE9TVF9XVCgpCisJQ0FDSEVfUE9TVF9JSU5WQUxJREFURSgpCisKKwkvKiBDb21wdXRlIHIxMyA9IGNhY2hlX3Bvc3RfdGVzdF9pbnN0ICovCisJYmwJY2FjaGVfcG9zdF90ZXN0Nl9yZWxvYworY2FjaGVfcG9zdF90ZXN0Nl9yZWxvYzoKKwltZmxyCXIxMworCWxpcwlyMCwgKGNhY2hlX3Bvc3RfdGVzdF9pbnN0IC0gY2FjaGVfcG9zdF90ZXN0Nl9yZWxvYylAaAorCW9yaQlyMCwgcjAsIChjYWNoZV9wb3N0X3Rlc3RfaW5zdCAtIGNhY2hlX3Bvc3RfdGVzdDZfcmVsb2MpQGwKKwlhZGQJcjEzLCByMTMsIHIwCisKKwkvKiBDb3B5IHRoZSB0ZXN0IGluc3RydWN0aW9ucyB0byB0aGUgdGVzdCBhcmVhICovCisJbHd6CXIwLCA0KHIxMykKKwlzdHcJcjAsIDAocjExKQorCWx3eglyMCwgOChyMTMpCisJc3R3CXIwLCA0KHIxMSkKKwlzeW5jCisKKwkvKiBJbnZhbGlkYXRlIHRoZSBjYWNoZSBsaW5lICovCisJaWNiaQlyMCwgcjExCisJc3luYworCWlzeW5jCisKKwkvKiBFeGVjdXRlIHRoZSB0ZXN0IGluc3RydWN0aW9ucyAqLworCW10bHIJcjExCisJYmxybAorCisJLyogUmVwbGFjZSB0aGUgdGVzdCBpbnN0cnVjdGlvbiAqLworCWx3eglyMCwgMChyMTMpCisJc3R3CXIwLCAwKHIxMSkKKwlzeW5jCisKKwkvKiBJbnZhbGlkYXRlIHRoZSBjYWNoZSBsaW5lICovCisJaWNiaQlyMCwgcjExCisJc3luYworCWlzeW5jCisKKwkvKiBFeGVjdXRlIHRoZSB0ZXN0IGluc3RydWN0aW9ucyAqLworCW10bHIJcjExCisJYmxybAorCW1yCXIxMywgcjMKKworCUNBQ0hFX1BPU1RfSUlOVkFMSURBVEUoKQorCUNBQ0hFX1BPU1RfRElOVkFMSURBVEUoKQorCUNBQ0hFX1BPU1RfRElTQUJMRSgpCisKKwltcglyMywgcjEzCisJbXRscglyOQorCWJscgorCisvKiBUZXN0IGluc3RydWN0aW9ucy4KKyAqLworY2FjaGVfcG9zdF90ZXN0X2luc3Q6CisJbGkJcjMsIDAKKwlsaQlyMywgLTEKKwlibHIKKworI2VuZGlmIC8qIENPTkZJR19QT1NUICYgQ0ZHX1BPU1RfQ0FDSEUgKi8KKyNlbmRpZiAvKiBDT05GSUdfUE9TVCAqLwpkaWZmIC0tZ2l0IGEvcG9zdC9jcHUvcHBjNHh4L2V0aGVyLmMgYi9wb3N0L2NwdS9wcGM0eHgvZXRoZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTFjODE1Ci0tLSAvZGV2L251bGwKKysrIGIvcG9zdC9jcHUvcHBjNHh4L2V0aGVyLmMKQEAgLTAsMCArMSwzOTUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDcKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogQXV0aG9yOiBJZ29yIExpc2l0c2luIDxpZ29yQGVtY3JhZnQuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworLyoKKyAqIEV0aGVybmV0IHRlc3QKKyAqCisgKiBUaGUgRXRoZXJuZXQgTWVkaWEgQWNjZXNzIENvbnRyb2xsZXJzIChFTUFDKSBhcmUgdGVzdGVkIGluIHRoZQorICogaW50ZXJuYWwgbG9vcGJhY2sgbW9kZS4KKyAqIFRoZSBjb250cm9sbGVycyBhcmUgY29uZmlndXJlZCBhY2NvcmRpbmdseSBhbmQgc2V2ZXJhbCBwYWNrZXRzCisgKiBhcmUgdHJhbnNtaXR0ZWQuIFRoZSBjb25maWd1cmFibGUgdGVzdCBwYXJhbWV0ZXJzIGFyZToKKyAqICAgTUlOX1BBQ0tFVF9MRU5HVEggLSBtaW5pbXVtIHNpemUgb2YgcGFja2V0IHRvIHRyYW5zbWl0CisgKiAgIE1BWF9QQUNLRVRfTEVOR1RIIC0gbWF4aW11bSBzaXplIG9mIHBhY2tldCB0byB0cmFuc21pdAorICogICBURVNUX05VTSAtIG51bWJlciBvZiB0ZXN0cworICovCisKKyNpZmRlZiBDT05GSUdfUE9TVAorCisjaW5jbHVkZSA8cG9zdC5oPgorCisjaWYgQ09ORklHX1BPU1QgJiBDRkdfUE9TVF9FVEhFUgorCisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPDQwNV9tYWwuaD4KKyNpbmNsdWRlIDxwcGM0eHhfZW5ldC5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworI2lmIGRlZmluZWQoQ09ORklHXzQ0MFNQRSkgfHwgZGVmaW5lZChDT05GSUdfNDQwRVBYKSB8fCBkZWZpbmVkKENPTkZJR180NDBHUlgpCisjZGVmaW5lIFNEUjBfTUZSX0VUSF9DTEtfU0VMX1YobikJKCgweDAxPDwyNykgLyAobisxKSkKKyNlbmRpZgorCisjZGVmaW5lIE1JTl9QQUNLRVRfTEVOR1RICTY0CisjZGVmaW5lIE1BWF9QQUNLRVRfTEVOR1RICTI1NgorI2RlZmluZSBURVNUX05VTQkJMQorCitzdGF0aWMgdm9sYXRpbGUgbWFsX2Rlc2NfdCB0eCBfX2NhY2hlbGluZV9hbGlnbmVkOworc3RhdGljIHZvbGF0aWxlIG1hbF9kZXNjX3QgcnggX19jYWNoZWxpbmVfYWxpZ25lZDsKK3N0YXRpYyBjaGFyICp0eF9idWY7CitzdGF0aWMgY2hhciAqcnhfYnVmOworCitzdGF0aWMgdm9pZCBldGhlcl9wb3N0X2luaXQgKGludCBkZXZudW0sIGludCBod19hZGRyKQoreworCWludCBpOworCXVuc2lnbmVkIG1vZGVfcmVnOworI2lmIGRlZmluZWQoQ09ORklHXzQ0MEdYKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfNDQwRVBYKSB8fCBkZWZpbmVkKENPTkZJR180NDBHUlgpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR180NDBTUCkgfHwgZGVmaW5lZChDT05GSUdfNDQwU1BFKQorCXN5c19pbmZvX3Qgc3lzaW5mbzsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHXzQ0MEVQWCkgfHwgZGVmaW5lZChDT05GSUdfNDQwR1JYKSB8fCBkZWZpbmVkKENPTkZJR180NDBTUEUpCisJdW5zaWduZWQgbG9uZyBtZnI7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHXzQ0MEdYKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfNDQwRVBYKSB8fCBkZWZpbmVkKENPTkZJR180NDBHUlgpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR180NDBTUCkgfHwgZGVmaW5lZChDT05GSUdfNDQwU1BFKQorCS8qIE5lZWQgdG8gZ2V0IHRoZSBPUEIgZnJlcXVlbmN5IHNvIHdlIGNhbiBhY2Nlc3MgdGhlIFBIWSAqLworCWdldF9zeXNfaW5mbyAoJnN5c2luZm8pOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR180NDBTUEUpIHx8IGRlZmluZWQoQ09ORklHXzQ0MEVQWCkgfHwgZGVmaW5lZChDT05GSUdfNDQwR1JYKQorCS8qIHByb3ZpZGUgY2xvY2tzIGZvciBFTUFDIGludGVybmFsIGxvb3BiYWNrICAqLworCW1mc2RyIChzZHJfbWZyLCBtZnIpOworCW1mciB8PSBTRFIwX01GUl9FVEhfQ0xLX1NFTF9WKGRldm51bSk7CisJbXRzZHIgKHNkcl9tZnIsIG1mcik7CisJc3luYyAoKTsKKyNlbmRpZgorCS8qIHJlc2V0IGVtYWMgKi8KKwlvdXQzMiAoRU1BQ19NMCArIGh3X2FkZHIsIEVNQUNfTTBfU1JTVCk7CisJc3luYyAoKTsKKworCWZvciAoaSA9IDA7OyBpKyspIHsKKwkJaWYgKCEoaW4zMiAoRU1BQ19NMCArIGh3X2FkZHIpICYgRU1BQ19NMF9TUlNUKSkKKwkJCWJyZWFrOworCQlpZiAoaSA+PSAxMDAwKSB7CisJCQlwcmludGYgKCJUaW1lb3V0IHJlc2V0dGluZyBFTUFDXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCXVkZWxheSAoMTAwMCk7CisJfQorI2lmIGRlZmluZWQoQ09ORklHXzQ0MEdYKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfNDQwRVBYKSB8fCBkZWZpbmVkKENPTkZJR180NDBHUlgpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR180NDBTUCkgfHwgZGVmaW5lZChDT05GSUdfNDQwU1BFKQorCS8qIFdoYWNrIHRoZSBNMSByZWdpc3RlciAqLworCW1vZGVfcmVnID0gMHgwOworCWlmIChzeXNpbmZvLmZyZXFPUEIgPD0gNTAwMDAwMDApOworCWVsc2UgaWYgKHN5c2luZm8uZnJlcU9QQiA8PSA2NjY2NjY2NykKKwkJbW9kZV9yZWcgfD0gRU1BQ19NMV9PQkNJXzY2OworCWVsc2UgaWYgKHN5c2luZm8uZnJlcU9QQiA8PSA4MzMzMzMzMykKKwkJbW9kZV9yZWcgfD0gRU1BQ19NMV9PQkNJXzgzOworCWVsc2UgaWYgKHN5c2luZm8uZnJlcU9QQiA8PSAxMDAwMDAwMDApCisJCW1vZGVfcmVnIHw9IEVNQUNfTTFfT0JDSV8xMDA7CisJZWxzZQorCQltb2RlX3JlZyB8PSBFTUFDX00xX09CQ0lfR1QxMDA7CisKKwlvdXQzMiAoRU1BQ19NMSArIGh3X2FkZHIsIG1vZGVfcmVnKTsKKworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHXzQ0MEdYKSB8fCBkZWZpbmVkKENPTkZJR180NDBTUCkgKi8KKworCS8qIHNldCB0aGUgTWFsIGNvbmZpZ3VyYXRpb24gcmVnICovCisjaWYgZGVmaW5lZChDT05GSUdfNDQwR1gpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR180NDBFUFgpIHx8IGRlZmluZWQoQ09ORklHXzQ0MEdSWCkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHXzQ0MFNQKSB8fCBkZWZpbmVkKENPTkZJR180NDBTUEUpCisJbXRkY3IgKG1hbG1jciwgTUFMX0NSX1BMQkIgfCBNQUxfQ1JfT1BCQkwgfCBNQUxfQ1JfTEVBIHwKKwkgICAgICAgTUFMX0NSX1BMQkxUX0RFRkFVTFQgfCAweDAwMzMwMDAwKTsKKyNlbHNlCisJbXRkY3IgKG1hbG1jciwgTUFMX0NSX1BMQkIgfCBNQUxfQ1JfT1BCQkwgfCBNQUxfQ1JfTEVBIHwgTUFMX0NSX1BMQkxUX0RFRkFVTFQpOworCS8qIEVycmF0YSAxLjEyOiBNQUxfMSAtLSBEaXNhYmxlIE1BTCBidXJzdGluZyAqLworCWlmIChnZXRfcHZyKCkgPT0gUFZSXzQ0MEdQX1JCKSB7CisJCW10ZGNyIChtYWxtY3IsIG1mZGNyKG1hbG1jcikgJiB+TUFMX0NSX1BMQkIpOworCX0KKyNlbmRpZgorCS8qIHNldHVwIGJ1ZmZlciBkZXNjcmlwdG9ycyAqLworCXR4LmN0cmwgPSBNQUxfVFhfQ1RSTF9XUkFQOworCXR4LmRhdGFfbGVuID0gMDsKKwl0eC5kYXRhX3B0ciA9IChjaGFyKilMMV9DQUNIRV9BTElHTigodTMyKXR4X2J1Zik7CisKKwlyeC5jdHJsID0gTUFMX1RYX0NUUkxfV1JBUCB8IE1BTF9SWF9DVFJMX0VNUFRZOworCXJ4LmRhdGFfbGVuID0gMDsKKwlyeC5kYXRhX3B0ciA9IChjaGFyKilMMV9DQUNIRV9BTElHTigodTMyKXJ4X2J1Zik7CisKKwlzd2l0Y2ggKGRldm51bSkgeworCWNhc2UgMToKKwkJLyogc2V0dXAgTUFMIHR4ICYgcnggY2hhbm5lbCBwb2ludGVycyAqLworI2lmIGRlZmluZWQgKENPTkZJR180MDVFUCkgfHwgZGVmaW5lZCAoQ09ORklHXzQ0MEVQKSB8fCBkZWZpbmVkIChDT05GSUdfNDQwR1IpCisJCW10ZGNyIChtYWx0eGN0cDJyLCAmdHgpOworI2Vsc2UKKwkJbXRkY3IgKG1hbHR4Y3RwMXIsICZ0eCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR180NDApCisJCW10ZGNyIChtYWx0eGJhdHRyLCAweDApOworCQltdGRjciAobWFscnhiYXR0ciwgMHgwKTsKKyNlbmRpZgorCQltdGRjciAobWFscnhjdHAxciwgJnJ4KTsKKwkJLyogc2V0IFJYIGJ1ZmZlciBzaXplICovCisJCW10ZGNyIChtYWxyY2JzMSwgUEtUU0laRV9BTElHTiAvIDE2KTsKKwkJYnJlYWs7CisJY2FzZSAwOgorCWRlZmF1bHQ6CisJCS8qIHNldHVwIE1BTCB0eCAmIHJ4IGNoYW5uZWwgcG9pbnRlcnMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR180NDApCisJCW10ZGNyIChtYWx0eGJhdHRyLCAweDApOworCQltdGRjciAobWFscnhiYXR0ciwgMHgwKTsKKyNlbmRpZgorCQltdGRjciAobWFsdHhjdHAwciwgJnR4KTsKKwkJbXRkY3IgKG1hbHJ4Y3RwMHIsICZyeCk7CisJCS8qIHNldCBSWCBidWZmZXIgc2l6ZSAqLworCQltdGRjciAobWFscmNiczAsIFBLVFNJWkVfQUxJR04gLyAxNik7CisJCWJyZWFrOworCX0KKworCS8qIEVuYWJsZSBNQUwgdHJhbnNtaXQgYW5kIHJlY2VpdmUgY2hhbm5lbHMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR180MDVFUCkgfHwgZGVmaW5lZChDT05GSUdfNDQwRVApIHx8IGRlZmluZWQoQ09ORklHXzQ0MEdSKQorCW10ZGNyIChtYWx0eGNhc3IsIChNQUxfVFhSWF9DQVNSID4+IChkZXZudW0qMikpKTsKKyNlbHNlCisJbXRkY3IgKG1hbHR4Y2FzciwgKE1BTF9UWFJYX0NBU1IgPj4gZGV2bnVtKSk7CisjZW5kaWYKKwltdGRjciAobWFscnhjYXNyLCAoTUFMX1RYUlhfQ0FTUiA+PiBkZXZudW0pKTsKKworCS8qIHNldCBpbnRlcm5hbCBsb29wYmFjayBtb2RlICovCisJb3V0MzIgKEVNQUNfTTEgKyBod19hZGRyLCBFTUFDX00xX0ZERSB8IEVNQUNfTTFfSUxFIHwKKwkgICAgICAgRU1BQ19NMV9SRlNfNEsgfCBFTUFDX00xX1RYX0ZJRk9fMksgfAorCSAgICAgICBFTUFDX00xX01GXzEwME1CUFMgfCBFTUFDX00xX0lTVCB8CisJICAgICAgIGluMzIgKEVNQUNfTTEpKTsKKworCS8qIHNldCB0cmFuc21pdCBlbmFibGUgJiByZWNlaXZlIGVuYWJsZSAqLworCW91dDMyIChFTUFDX00wICsgaHdfYWRkciwgRU1BQ19NMF9UWEUgfCBFTUFDX00wX1JYRSk7CisKKwkvKiBlbmFibGUgYnJvYWRjYXN0IGFkZHJlc3MgKi8KKwlvdXQzMiAoRU1BQ19SWE0gKyBod19hZGRyLCBFTUFDX1JNUl9CQUUpOworCisJLyogc2V0IHRyYW5zbWl0IHJlcXVlc3QgdGhyZXNob2xkIHJlZ2lzdGVyICovCisJb3V0MzIgKEVNQUNfVFJUUiArIGh3X2FkZHIsIDB4MTgwMDAwMDApOwkvKiAyNTYgYnl0ZSB0aHJlc2hvbGQgKi8KKworCS8qIHNldCByZWNlaXZlCWxvdy9oaWdoIHdhdGVyIG1hcmsgcmVnaXN0ZXIgKi8KKyNpZiBkZWZpbmVkKENPTkZJR180NDApCisJLyogNDQwcyBoYXMgYSA2NCBieXRlIGJ1cnN0IGxlbmd0aCAqLworCW91dDMyIChFTUFDX1JYX0hJX0xPX1dNQVJLICsgaHdfYWRkciwgMHg4MDAwOTAwMCk7CisjZWxzZQorCS8qIDQwNXMgaGF2ZSBhIDE2IGJ5dGUgYnVyc3QgbGVuZ3RoICovCisJb3V0MzIgKEVNQUNfUlhfSElfTE9fV01BUksgKyBod19hZGRyLCAweDBmMDAyMDAwKTsKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR180NDApICovCisJb3V0MzIgKEVNQUNfVFhNMSArIGh3X2FkZHIsIDB4Zjg2NDAwMDApOworCisJLyogU2V0IGZpZm8gbGltaXQgZW50cnkgaW4gdHggbW9kZSAwICovCisJb3V0MzIgKEVNQUNfVFhNMCArIGh3X2FkZHIsIDB4MDAwMDAwMDMpOworCS8qIEZyYW1lIGdhcCBzZXQgKi8KKwlvdXQzMiAoRU1BQ19JX0ZSQU1FX0dBUF9SRUcgKyBod19hZGRyLCAweDAwMDAwMDA4KTsKKwlzeW5jICgpOworfQorCitzdGF0aWMgdm9pZCBldGhlcl9wb3N0X2hhbHQgKGludCBkZXZudW0sIGludCBod19hZGRyKQoreworCWludCBpID0gMDsKKyNpZiBkZWZpbmVkKENPTkZJR180NDBTUEUpIHx8IGRlZmluZWQoQ09ORklHXzQ0MEVQWCkgfHwgZGVmaW5lZChDT05GSUdfNDQwR1JYKQorCXVuc2lnbmVkIGxvbmcgbWZyOworI2VuZGlmCisKKwkvKiAxc3QgcmVzZXQgTUFMIGNoYW5uZWwgKi8KKwkvKiBOb3RlOiB3cml0aW5nIGEgMCB0byBhIGNoYW5uZWwgaGFzIG5vIGVmZmVjdCAqLworI2lmIGRlZmluZWQoQ09ORklHXzQwNUVQKSB8fCBkZWZpbmVkKENPTkZJR180NDBFUCkgfHwgZGVmaW5lZChDT05GSUdfNDQwR1IpCisJbXRkY3IgKG1hbHR4Y2FyciwgTUFMX1RYUlhfQ0FTUiA+PiAoZGV2bnVtICogMikpOworI2Vsc2UKKwltdGRjciAobWFsdHhjYXJyLCBNQUxfVFhSWF9DQVNSID4+IGRldm51bSk7CisjZW5kaWYKKwltdGRjciAobWFscnhjYXJyLCBNQUxfVFhSWF9DQVNSID4+IGRldm51bSk7CisKKwkvKiB3YWl0IGZvciByZXNldCAqLworCXdoaWxlIChtZmRjciAobWFscnhjYXNyKSAmIChNQUxfVFhSWF9DQVNSID4+IGRldm51bSkpIHsKKwkJaWYgKGkrKyA+PSAxMDAwKQorCQkJYnJlYWs7CisJCXVkZWxheSAoMTAwMCk7CisJfQorCS8qIGVtYWMgcmVzZXQgKi8KKwlvdXQzMiAoRU1BQ19NMCArIGh3X2FkZHIsIEVNQUNfTTBfU1JTVCk7CisKKyNpZiBkZWZpbmVkKENPTkZJR180NDBTUEUpIHx8IGRlZmluZWQoQ09ORklHXzQ0MEVQWCkgfHwgZGVmaW5lZChDT05GSUdfNDQwR1JYKQorCS8qIHJlbW92ZSBjbG9ja3MgZm9yIEVNQUMgaW50ZXJuYWwgbG9vcGJhY2sgICovCisJbWZzZHIgKHNkcl9tZnIsIG1mcik7CisJbWZyICY9IH5TRFIwX01GUl9FVEhfQ0xLX1NFTF9WKGRldm51bSk7CisJbXRzZHIgKHNkcl9tZnIsIG1mcik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgZXRoZXJfcG9zdF9zZW5kIChpbnQgZGV2bnVtLCBpbnQgaHdfYWRkciwgdm9pZCAqcGFja2V0LCBpbnQgbGVuZ3RoKQoreworCWludCBpID0gMDsKKworCXdoaWxlICh0eC5jdHJsICYgTUFMX1RYX0NUUkxfUkVBRFkpIHsKKwkJaWYgKGkrKyA+IDEwMCkgeworCQkJcHJpbnRmICgiVFggdGltZW91dFxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJdWRlbGF5ICgxMDAwKTsKKwl9CisJdHguY3RybCA9IE1BTF9UWF9DVFJMX1JFQURZIHwgTUFMX1RYX0NUUkxfV1JBUCB8IE1BTF9UWF9DVFJMX0xBU1QgfAorCQlFTUFDX1RYX0NUUkxfR0ZDUyB8IEVNQUNfVFhfQ1RSTF9HUDsKKwl0eC5kYXRhX2xlbiA9IGxlbmd0aDsKKwltZW1jcHkgKHR4LmRhdGFfcHRyLCBwYWNrZXQsIGxlbmd0aCk7CisJc3luYyAoKTsKKworCW91dDMyIChFTUFDX1RYTTAgKyBod19hZGRyLCBpbjMyIChFTUFDX1RYTTAgKyBod19hZGRyKSB8IEVNQUNfVFhNMF9HTlAwKTsKKwlzeW5jICgpOworfQorCitzdGF0aWMgaW50IGV0aGVyX3Bvc3RfcmVjdiAoaW50IGRldm51bSwgaW50IGh3X2FkZHIsIHZvaWQgKnBhY2tldCwgaW50IG1heF9sZW5ndGgpCit7CisJaW50IGxlbmd0aDsKKwlpbnQgaSA9IDA7CisKKwl3aGlsZSAocnguY3RybCAmIE1BTF9SWF9DVFJMX0VNUFRZKSB7CisJCWlmIChpKysgPiAxMDApIHsKKwkJCXByaW50ZiAoIlJYIHRpbWVvdXRcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJdWRlbGF5ICgxMDAwKTsKKwl9CisJbGVuZ3RoID0gcnguZGF0YV9sZW4gLSA0OworCWlmIChsZW5ndGggPD0gbWF4X2xlbmd0aCkKKwkJbWVtY3B5KHBhY2tldCwgcnguZGF0YV9wdHIsIGxlbmd0aCk7CisJc3luYyAoKTsKKworCXJ4LmN0cmwgfD0gTUFMX1JYX0NUUkxfRU1QVFk7CisJc3luYyAoKTsKKworCXJldHVybiBsZW5ndGg7Cit9CisKKyAgLyoKKyAgICogVGVzdCByb3V0aW5lcworICAgKi8KKworc3RhdGljIHZvaWQgcGFja2V0X2ZpbGwgKGNoYXIgKnBhY2tldCwgaW50IGxlbmd0aCkKK3sKKwljaGFyIGMgPSAoY2hhcikgbGVuZ3RoOworCWludCBpOworCisJLyogc2V0IHVwIGV0aGVybmV0IGhlYWRlciAqLworCW1lbXNldCAocGFja2V0LCAweGZmLCAxNCk7CisKKwlmb3IgKGkgPSAxNDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCXBhY2tldFtpXSA9IGMrKzsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcGFja2V0X2NoZWNrIChjaGFyICpwYWNrZXQsIGludCBsZW5ndGgpCit7CisJY2hhciBjID0gKGNoYXIpIGxlbmd0aDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDE0OyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJaWYgKHBhY2tldFtpXSAhPSBjKyspCisJCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9jdGxyIChpbnQgZGV2bnVtLCBpbnQgaHdfYWRkcikKK3sKKwlpbnQgcmVzID0gLTE7CisJY2hhciBwYWNrZXRfc2VuZFtNQVhfUEFDS0VUX0xFTkdUSF07CisJY2hhciBwYWNrZXRfcmVjdltNQVhfUEFDS0VUX0xFTkdUSF07CisJaW50IGxlbmd0aDsKKwlpbnQgaTsKKwlpbnQgbDsKKworCWV0aGVyX3Bvc3RfaW5pdCAoZGV2bnVtLCBod19hZGRyKTsKKworCWZvciAoaSA9IDA7IGkgPCBURVNUX05VTTsgaSsrKSB7CisJCWZvciAobCA9IE1JTl9QQUNLRVRfTEVOR1RIOyBsIDw9IE1BWF9QQUNLRVRfTEVOR1RIOyBsKyspIHsKKwkJCXBhY2tldF9maWxsIChwYWNrZXRfc2VuZCwgbCk7CisKKwkJCWV0aGVyX3Bvc3Rfc2VuZCAoZGV2bnVtLCBod19hZGRyLCBwYWNrZXRfc2VuZCwgbCk7CisKKwkJCWxlbmd0aCA9IGV0aGVyX3Bvc3RfcmVjdiAoZGV2bnVtLCBod19hZGRyLCBwYWNrZXRfcmVjdiwKKwkJCQkJCSAgc2l6ZW9mIChwYWNrZXRfcmVjdikpOworCisJCQlpZiAobGVuZ3RoICE9IGwgfHwgcGFja2V0X2NoZWNrIChwYWNrZXRfcmVjdiwgbGVuZ3RoKSA8IDApIHsKKwkJCQlnb3RvIERvbmU7CisJCQl9CisJCX0KKwl9CisKKwlyZXMgPSAwOworCitEb25lOgorCisJZXRoZXJfcG9zdF9oYWx0IChkZXZudW0sIGh3X2FkZHIpOworCisJaWYgKHJlcyAhPSAwKSB7CisJCXBvc3RfbG9nICgiRU1BQyVkIHRlc3QgZmFpbGVkXG4iLCBkZXZudW0pOworCX0KKworCXJldHVybiByZXM7Cit9CisKK2ludCBldGhlcl9wb3N0X3Rlc3QgKGludCBmbGFncykKK3sKKwlpbnQgcmVzID0gMDsKKworCS8qIEFsbG9jYXRlIHR4ICYgcnggcGFja2V0IGJ1ZmZlcnMgKi8KKwl0eF9idWYgPSBtYWxsb2MgKFBLVFNJWkVfQUxJR04gKyBDRkdfQ0FDSEVMSU5FX1NJWkUpOworCXJ4X2J1ZiA9IG1hbGxvYyAoUEtUU0laRV9BTElHTiArIENGR19DQUNIRUxJTkVfU0laRSk7CisKKwlpZiAoIXR4X2J1ZiB8fCAhcnhfYnVmKSB7CisJCXByaW50ZiAoIkZhaWxlZCB0byBhbGxvY2F0ZSBwYWNrZXQgYnVmZmVyc1xuIik7CisJCXJlcyA9IC0xOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCS8qIEVNQUMwICovCisJaWYgKHRlc3RfY3RsciAoMCwgMCkpCisJCXJlcyA9IC0xOworCisJLyogRU1BQzEgKi8KKwlpZiAodGVzdF9jdGxyICgxLCAweDEwMCkpCisJCXJlcyA9IC0xOworCitvdXRfZnJlZToKKwlmcmVlICh0eF9idWYpOworCWZyZWUgKHJ4X2J1Zik7CisKKwlyZXR1cm4gcmVzOworfQorCisjZW5kaWYgLyogQ09ORklHX1BPU1QgJiBDRkdfUE9TVF9FVEhFUiAqLworI2VuZGlmIC8qIENPTkZJR19QT1NUICovCmRpZmYgLS1naXQgYS9wb3N0L2NwdS9wcGM0eHgvZnB1LmMgYi9wb3N0L2NwdS9wcGM0eHgvZnB1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdlOWVkMAotLS0gL2Rldi9udWxsCisrKyBiL3Bvc3QvY3B1L3BwYzR4eC9mcHUuYwpAQCAtMCwwICsxLDU5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA3CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIEF1dGhvcjogU2VyZ2VpIFBvc2VsZW5vdiA8c3Bvc2VsZW5vdkBlbWNyYWZ0LmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpZmRlZiBDT05GSUdfUE9TVAorI2lmIGRlZmluZWQoQ09ORklHXzQ0MEVQKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfNDQwRVBYKQorCisjaW5jbHVkZSA8cHBjNHh4Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCisKK2ludCBmcHVfc3RhdHVzKHZvaWQpCit7CisJaWYgKG1mc3ByKGNjcjApICYgQ0NSMF9EQVBVSUIpCisJCXJldHVybiAwOyAvKiBEaXNhYmxlZCAqLworCWVsc2UKKwkJcmV0dXJuIDE7IC8qIEVuYWJsZWQgKi8KK30KKworCit2b2lkIGZwdV9kaXNhYmxlKHZvaWQpCit7CisJbXRzcHIoY2NyMCwgbWZzcHIoY2NyMCkgfCBDQ1IwX0RBUFVJQik7CisJbXRtc3IobWZtc3IoKSAmIH5NU1JfRlApOworfQorCisKK3ZvaWQgZnB1X2VuYWJsZSh2b2lkKQoreworCW10c3ByKGNjcjAsIG1mc3ByKGNjcjApICYgfkNDUjBfREFQVUlCKTsKKwltdG1zcihtZm1zcigpIHwgTVNSX0ZQKTsKK30KKworI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX1BPU1QgKi8KZGlmZiAtLWdpdCBhL3Bvc3QvY3B1L3BwYzR4eC9zcHIuYyBiL3Bvc3QvY3B1L3BwYzR4eC9zcHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTc0NjM0Ci0tLSAvZGV2L251bGwKKysrIGIvcG9zdC9jcHUvcHBjNHh4L3Nwci5jCkBAIC0wLDAgKzEsMTgyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA3CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIEF1dGhvcjogSWdvciBMaXNpdHNpbiA8aWdvckBlbWNyYWZ0LmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKy8qCisgKiBTUFIgdGVzdAorICoKKyAqIFRoZSB0ZXN0IGNoZWNrcyB0aGUgY29udGVudHMgb2YgU3BlY2lhbCBQdXJwb3NlIFJlZ2lzdGVycyAoU1BSKSBsaXN0ZWQKKyAqIGluIHRoZSBzcHJfdGVzdF9saXN0IGFycmF5IGJlbG93LgorICogRWFjaCBTUFIgdmFsdWUgaXMgcmVhZCB1c2luZyBtZnNwciBpbnN0cnVjdGlvbiwgc29tZSBiaXRzIGFyZSBtYXNrZWQKKyAqIGFjY29yZGluZyB0byB0aGUgdGFibGUgYW5kIHRoZSByZXN1bHRpbmcgdmFsdWUgaXMgY29tcGFyZWQgdG8gdGhlCisgKiBjb3JyZXNwb25kaW5nIHRhYmxlIHZhbHVlLgorICovCisKKyNpZmRlZiBDT05GSUdfUE9TVAorCisjaW5jbHVkZSA8cG9zdC5oPgorCisjaWYgQ09ORklHX1BPU1QgJiBDRkdfUE9TVF9TUFIKKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworc3RhdGljIHN0cnVjdCB7CisJaW50IG51bWJlcjsKKwljaGFyICogbmFtZTsKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKK30gc3ByX3Rlc3RfbGlzdCBbXSA9IHsKKwkvKiBTdGFuZGFyZCBTcGVjaWFsLVB1cnBvc2UgUmVnaXN0ZXJzICovCisKKwl7MHgwMDEsCSJYRVIiLAkJMHgwMDAwMDAwMCwJMHgwMDAwMDAwMH0sCisJezB4MDA4LAkiTFIiLAkJMHgwMDAwMDAwMCwJMHgwMDAwMDAwMH0sCisJezB4MDA5LAkiQ1RSIiwJCTB4MDAwMDAwMDAsCTB4MDAwMDAwMDB9LAorCXsweDAxNiwJIkRFQyIsCQkweDAwMDAwMDAwLAkweDAwMDAwMDAwfSwKKwl7MHgwMWEsCSJTUlIwIiwJCTB4MDAwMDAwMDAsCTB4MDAwMDAwMDB9LAorCXsweDAxYiwJIlNSUjEiLAkJMHgwMDAwMDAwMCwJMHgwMDAwMDAwMH0sCisJezB4MTEwLAkiU1BSRzAiLAkweDAwMDAwMDAwLAkweDAwMDAwMDAwfSwKKwl7MHgxMTEsCSJTUFJHMSIsCTB4MDAwMDAwMDAsCTB4MDAwMDAwMDB9LAorCXsweDExMiwJIlNQUkcyIiwJMHgwMDAwMDAwMCwJMHgwMDAwMDAwMH0sCisJezB4MTEzLAkiU1BSRzMiLAkweDAwMDAwMDAwLAkweDAwMDAwMDAwfSwKKwl7MHgxMWYsCSJQVlIiLAkJMHgwMDAwMDAwMCwJMHgwMDAwMDAwMH0sCisKKwkvKiBBZGRpdGlvbmFsIFNwZWNpYWwtUHVycG9zZSBSZWdpc3RlcnMuCisJICogVGhlIHZhbHVlcyBtdXN0IG1hdGNoIHRoZSBpbml0aWFsaXphdGlvbgorCSAqIHZhbHVlcyBmcm9tIGNwdS9wcGM0eHgvc3RhcnQuUworCSAqLworCXsweDMwLAkiUElEIiwJCTB4MDAwMDAwMDAsCTB4MDAwMDAwMDB9LAorCXsweDNhLAkiQ1NSUjAiLAkweDAwMDAwMDAwLAkweDAwMDAwMDAwfSwKKwl7MHgzYiwJIkNTUlIxIiwJMHgwMDAwMDAwMCwJMHgwMDAwMDAwMH0sCisJezB4M2QsCSJERUFSIiwJCTB4MDAwMDAwMDAsCTB4MDAwMDAwMDB9LAorCXsweDNlLAkiRVNSIiwJCTB4MDAwMDAwMDAsCTB4MDAwMDAwMDB9LAorCXsweDNmLAkiSVZQUiIsCQkweGZmZmYwMDAwLAkweDAwMDAwMDAwfSwKKwl7MHgxMDAsCSJVU1BSRzAiLAkweDAwMDAwMDAwLAkweDAwMDAwMDAwfSwKKwl7MHgxMDQsCSJTUFJHNCIsCTB4MDAwMDAwMDAsCTB4MDAwMDAwMDB9LAorCXsweDEwNSwJIlNQUkc1IiwJMHgwMDAwMDAwMCwJMHgwMDAwMDAwMH0sCisJezB4MTA2LAkiU1BSRzYiLAkweDAwMDAwMDAwLAkweDAwMDAwMDAwfSwKKwl7MHgxMDcsCSJTUFJHNyIsCTB4MDAwMDAwMDAsCTB4MDAwMDAwMDB9LAorCXsweDEwYywJIlRCTCIsCQkweDAwMDAwMDAwLAkweDAwMDAwMDAwfSwKKwl7MHgxMGQsCSJUQlUiLAkJMHgwMDAwMDAwMCwJMHgwMDAwMDAwMH0sCisJezB4MTFlLAkiUElSIiwJCTB4MDAwMDAwMGYsCTB4MDAwMDAwMDB9LAorCXsweDEzMCwJIkRCU1IiLAkJMHgwMDAwMDAwMCwJMHgwMDAwMDAwMH0sCisJezB4MTM0LAkiREJDUjAiLAkweDAwMDAwMDAwLAkweDAwMDAwMDAwfSwKKwl7MHgxMzUsCSJEQkNSMSIsCTB4MDAwMDAwMDAsCTB4MDAwMDAwMDB9LAorCXsweDEzNiwJIkRCQ1IyIiwJMHgwMDAwMDAwMCwJMHgwMDAwMDAwMH0sCisJezB4MTM4LAkiSUFDMSIsCQkweDAwMDAwMDAwLAkweDAwMDAwMDAwfSwKKwl7MHgxMzksCSJJQUMyIiwJCTB4MDAwMDAwMDAsCTB4MDAwMDAwMDB9LAorCXsweDEzYSwJIklBQzMiLAkJMHgwMDAwMDAwMCwJMHgwMDAwMDAwMH0sCisJezB4MTNiLAkiSUFDNCIsCQkweDAwMDAwMDAwLAkweDAwMDAwMDAwfSwKKwl7MHgxM2MsCSJEQUMxIiwJCTB4MDAwMDAwMDAsCTB4MDAwMDAwMDB9LAorCXsweDEzZCwJIkRBQzIiLAkJMHgwMDAwMDAwMCwJMHgwMDAwMDAwMH0sCisJezB4MTNlLAkiRFZDMSIsCQkweDAwMDAwMDAwLAkweDAwMDAwMDAwfSwKKwl7MHgxM2YsCSJEVkMyIiwJCTB4MDAwMDAwMDAsCTB4MDAwMDAwMDB9LAorCXsweDE1MCwJIlRTUiIsCQkweDAwMDAwMDAwLAkweDAwMDAwMDAwfSwKKwl7MHgxNTQsCSJUQ1IiLAkJMHgwMDAwMDAwMCwJMHgwMDAwMDAwMH0sCisJezB4MTkwLAkiSVZPUjAiLAkweDAwMDBmZmYwLAkweDAwMDAwMTAwfSwKKwl7MHgxOTEsCSJJVk9SMSIsCTB4MDAwMGZmZjAsCTB4MDAwMDAyMDB9LAorCXsweDE5MiwJIklWT1IyIiwJMHgwMDAwZmZmMCwJMHgwMDAwMDMwMH0sCisJezB4MTkzLAkiSVZPUjMiLAkweDAwMDBmZmYwLAkweDAwMDAwNDAwfSwKKwl7MHgxOTQsCSJJVk9SNCIsCTB4MDAwMGZmZjAsCTB4MDAwMDA1MDB9LAorCXsweDE5NSwJIklWT1I1IiwJMHgwMDAwZmZmMCwJMHgwMDAwMDYwMH0sCisJezB4MTk2LAkiSVZPUjYiLAkweDAwMDBmZmYwLAkweDAwMDAwNzAwfSwKKwl7MHgxOTcsCSJJVk9SNyIsCTB4MDAwMGZmZjAsCTB4MDAwMDA4MDB9LAorCXsweDE5OCwJIklWT1I4IiwJMHgwMDAwZmZmMCwJMHgwMDAwMGMwMH0sCisJezB4MTk5LAkiSVZPUjkiLAkweDAwMDAwMDAwLAkweDAwMDAwMDAwfSwKKwl7MHgxOWEsCSJJVk9SMTAiLAkweDAwMDBmZmYwLAkweDAwMDAwOTAwfSwKKwl7MHgxOWIsCSJJVk9SMTEiLAkweDAwMDAwMDAwLAkweDAwMDAwMDAwfSwKKwl7MHgxOWMsCSJJVk9SMTIiLAkweDAwMDAwMDAwLAkweDAwMDAwMDAwfSwKKwl7MHgxOWQsCSJJVk9SMTMiLAkweDAwMDBmZmYwLAkweDAwMDAxMzAwfSwKKwl7MHgxOWUsCSJJVk9SMTQiLAkweDAwMDBmZmYwLAkweDAwMDAxNDAwfSwKKwl7MHgxOWYsCSJJVk9SMTUiLAkweDAwMDBmZmYwLAkweDAwMDAyMDAwfSwKKwl7MHgyM2EsCSJNQ1NSUjAiLAkweDAwMDAwMDAwLAkweDAwMDAwMDAwfSwKKwl7MHgyM2IsCSJNQ1NSUjEiLAkweDAwMDAwMDAwLAkweDAwMDAwMDAwfSwKKwl7MHgyM2MsCSJNQ1NSIiwJCTB4MDAwMDAwMDAsCTB4MDAwMDAwMDB9LAorCXsweDM3MCwJIklOVjAiLAkJMHgwMDAwMDAwMCwJMHgwMDAwMDAwMH0sCisJezB4MzcxLAkiSU5WMSIsCQkweDAwMDAwMDAwLAkweDAwMDAwMDAwfSwKKwl7MHgzNzIsCSJJTlYyIiwJCTB4MDAwMDAwMDAsCTB4MDAwMDAwMDB9LAorCXsweDM3MywJIklOVjMiLAkJMHgwMDAwMDAwMCwJMHgwMDAwMDAwMH0sCisJezB4Mzc0LAkiSVRWMCIsCQkweDAwMDAwMDAwLAkweDAwMDAwMDAwfSwKKwl7MHgzNzUsCSJJVFYxIiwJCTB4MDAwMDAwMDAsCTB4MDAwMDAwMDB9LAorCXsweDM3NiwJIklUVjIiLAkJMHgwMDAwMDAwMCwJMHgwMDAwMDAwMH0sCisJezB4Mzc3LAkiSVRWMyIsCQkweDAwMDAwMDAwLAkweDAwMDAwMDAwfSwKKwl7MHgzNzgsCSJDQ1IxIiwJCTB4MDAwMDAwMDAsCTB4MDAwMDAwMDB9LAorCXsweDM5MCwJIkROVjAiLAkJMHgwMDAwMDAwMCwJMHgwMDAwMDAwMH0sCisJezB4MzkxLAkiRE5WMSIsCQkweDAwMDAwMDAwLAkweDAwMDAwMDAwfSwKKwl7MHgzOTIsCSJETlYyIiwJCTB4MDAwMDAwMDAsCTB4MDAwMDAwMDB9LAorCXsweDM5MywJIkROVjMiLAkJMHgwMDAwMDAwMCwJMHgwMDAwMDAwMH0sCisJezB4Mzk0LAkiRFRWMCIsCQkweDAwMDAwMDAwLAkweDAwMDAwMDAwfSwKKwl7MHgzOTUsCSJEVFYxIiwJCTB4MDAwMDAwMDAsCTB4MDAwMDAwMDB9LAorCXsweDM5NiwJIkRUVjIiLAkJMHgwMDAwMDAwMCwJMHgwMDAwMDAwMH0sCisJezB4Mzk3LAkiRFRWMyIsCQkweDAwMDAwMDAwLAkweDAwMDAwMDAwfSwKKwl7MHgzOTgsCSJEVkxJTSIsCTB4MGZjMWY4M2YsCTB4MDAwMWY4MDB9LAorCXsweDM5OSwJIklWTElNIiwJMHgwZmMxZjgzZiwJMHgwMDAxZjgwMH0sCisJezB4MzliLAkiUlNUQ0ZHIiwJMHgwMDAwMDAwMCwJMHgwMDAwMDAwMH0sCisJezB4MzljLAkiRENEQlRSTCIsCTB4MDAwMDAwMDAsCTB4MDAwMDAwMDB9LAorCXsweDM5ZCwJIkRDREJUUkgiLAkweDAwMDAwMDAwLAkweDAwMDAwMDAwfSwKKwl7MHgzOWUsCSJJQ0RCVFJMIiwJMHgwMDAwMDAwMCwJMHgwMDAwMDAwMH0sCisJezB4MzlmLAkiSUNEQlRSSCIsCTB4MDAwMDAwMDAsCTB4MDAwMDAwMDB9LAorCXsweDNiMiwJIk1NVUNSIiwJMHgwMDAwMDAwMCwJMHgwMDAwMDAwMH0sCisJezB4M2IzLAkiQ0NSMCIsCQkweDAwMDAwMDAwLAkweDAwMDAwMDAwfSwKKwl7MHgzZDMsCSJJQ0RCRFIiLAkweDAwMDAwMDAwLAkweDAwMDAwMDAwfSwKKwl7MHgzZjMsCSJEQkRSIiwJCTB4MDAwMDAwMDAsCTB4MDAwMDAwMDB9LAorfTsKKworc3RhdGljIGludCBzcHJfdGVzdF9saXN0X3NpemUgPQorCQlzaXplb2YgKHNwcl90ZXN0X2xpc3QpIC8gc2l6ZW9mIChzcHJfdGVzdF9saXN0WzBdKTsKKworaW50IHNwcl9wb3N0X3Rlc3QgKGludCBmbGFncykKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaTsKKworCXVuc2lnbmVkIGxvbmcgY29kZVtdID0geworCQkweDdjNjAwMmE2LAkJCQkvKiBtZnNwciByMyxTUFIgKi8KKwkJMHg0ZTgwMDAyMAkJCQkvKiBibHIgICAgICAgICAgKi8KKwl9OworCXVuc2lnbmVkIGxvbmcgKCpnZXRfc3ByKSAodm9pZCkgPSAodm9pZCAqKSBjb2RlOworCisJZm9yIChpID0gMDsgaSA8IHNwcl90ZXN0X2xpc3Rfc2l6ZTsgaSsrKSB7CisJCWludCBudW0gPSBzcHJfdGVzdF9saXN0W2ldLm51bWJlcjsKKworCQkvKiBtZnNwciByMyxudW0gKi8KKwkJY29kZVswXSA9IDB4N2M2MDAyYTYgfCAoKG51bSAmIDB4MUYpIDw8IDE2KSB8ICgobnVtICYgMHgzRTApIDw8IDYpOworCisJCWFzbSB2b2xhdGlsZSAoImlzeW5jIik7CisKKwkJaWYgKChnZXRfc3ByICgpICYgc3ByX3Rlc3RfbGlzdFtpXS5tYXNrKSAhPQorCQkJKHNwcl90ZXN0X2xpc3RbaV0udmFsdWUgJiBzcHJfdGVzdF9saXN0W2ldLm1hc2spKSB7CisJCQlwb3N0X2xvZyAoIlRoZSB2YWx1ZSBvZiAlcyBzcGVjaWFsIHJlZ2lzdGVyICIKKwkJCQkgICJpcyBpbmNvcnJlY3Q6IDB4JTA4WFxuIiwKKwkJCQkJc3ByX3Rlc3RfbGlzdFtpXS5uYW1lLCBnZXRfc3ByICgpKTsKKwkJCXJldCA9IC0xOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmIC8qIENPTkZJR19QT1NUICYgQ0ZHX1BPU1RfU1BSICovCisjZW5kaWYgLyogQ09ORklHX1BPU1QgKi8KZGlmZiAtLWdpdCBhL3Bvc3QvY3B1L3BwYzR4eC91YXJ0LmMgYi9wb3N0L2NwdS9wcGM0eHgvdWFydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNDdkNDIKLS0tIC9kZXYvbnVsbAorKysgYi9wb3N0L2NwdS9wcGM0eHgvdWFydC5jCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA3CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIEF1dGhvcjogSWdvciBMaXNpdHNpbiA8aWdvckBlbWNyYWZ0LmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKy8qCisgKiBVQVJUIHRlc3QKKyAqCisgKiBUaGUgY29udHJvbGxlcnMgYXJlIGNvbmZpZ3VyZWQgdG8gbG9vcGJhY2sgbW9kZSBhbmQgc2V2ZXJhbAorICogY2hhcmFjdGVycyBhcmUgdHJhbnNtaXR0ZWQuCisgKi8KKworI2lmZGVmIENPTkZJR19QT1NUCisKKyNpbmNsdWRlIDxwb3N0Lmg+CisKKyNpZiBDT05GSUdfUE9TVCAmIENGR19QT1NUX1VBUlQKKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxzZXJpYWwuaD4KKworI2RlZmluZSBVQVJUMF9CQVNFICBDRkdfUEVSSVBIRVJBTF9CQVNFICsgMHgwMDAwMDMwMAorI2RlZmluZSBVQVJUMV9CQVNFICBDRkdfUEVSSVBIRVJBTF9CQVNFICsgMHgwMDAwMDQwMAorI2RlZmluZSBVQVJUMl9CQVNFICBDRkdfUEVSSVBIRVJBTF9CQVNFICsgMHgwMDAwMDUwMAorI2RlZmluZSBVQVJUM19CQVNFICBDRkdfUEVSSVBIRVJBTF9CQVNFICsgMHgwMDAwMDYwMAorCisjZGVmaW5lIENSMF9NQVNLICAgICAgICAweGRmZmZmZmZmCisjZGVmaW5lIENSMF9FWFRDTEtfRU5BICAweDAwODAwMDAwCisjZGVmaW5lIENSMF9VRElWX1BPUyAgICAwCisjZGVmaW5lIFVESVZfU1VCVFJBQ1QJMAorI2RlZmluZSBVQVJUMF9TRFIJc2RyX3VhcnQwCisjZGVmaW5lIFVBUlQxX1NEUglzZHJfdWFydDEKKyNkZWZpbmUgVUFSVDJfU0RSCXNkcl91YXJ0MgorI2RlZmluZSBVQVJUM19TRFIJc2RyX3VhcnQzCisjZGVmaW5lIE1GUkVHKGEsIGQpCW1mc2RyKGEsIGQpCisjZGVmaW5lIE1UUkVHKGEsIGQpCW10c2RyKGEsIGQpCisKKyNkZWZpbmUgVUFSVF9SQlIgICAgMHgwMAorI2RlZmluZSBVQVJUX1RIUiAgICAweDAwCisjZGVmaW5lIFVBUlRfSUVSICAgIDB4MDEKKyNkZWZpbmUgVUFSVF9JSVIgICAgMHgwMgorI2RlZmluZSBVQVJUX0ZDUiAgICAweDAyCisjZGVmaW5lIFVBUlRfTENSICAgIDB4MDMKKyNkZWZpbmUgVUFSVF9NQ1IgICAgMHgwNAorI2RlZmluZSBVQVJUX0xTUiAgICAweDA1CisjZGVmaW5lIFVBUlRfTVNSICAgIDB4MDYKKyNkZWZpbmUgVUFSVF9TQ1IgICAgMHgwNworI2RlZmluZSBVQVJUX0RMTCAgICAweDAwCisjZGVmaW5lIFVBUlRfRExNICAgIDB4MDEKKworLyoKKyAgTGluZSBTdGF0dXMgUmVnaXN0ZXIuCisqLworI2RlZmluZSBhc3luY0xTUkRhdGFSZWFkeTEgICAgICAgICAgICAweDAxCisjZGVmaW5lIGFzeW5jTFNST3ZlcnJ1bkVycm9yMSAgICAgICAgIDB4MDIKKyNkZWZpbmUgYXN5bmNMU1JQYXJpdHlFcnJvcjEgICAgICAgICAgMHgwNAorI2RlZmluZSBhc3luY0xTUkZyYW1pbmdFcnJvcjEgICAgICAgICAweDA4CisjZGVmaW5lIGFzeW5jTFNSQnJlYWtJbnRlcnJ1cHQxICAgICAgIDB4MTAKKyNkZWZpbmUgYXN5bmNMU1JUeEhvbGRFbXB0eTEgICAgICAgICAgMHgyMAorI2RlZmluZSBhc3luY0xTUlR4U2hpZnRFbXB0eTEgICAgICAgICAweDQwCisjZGVmaW5lIGFzeW5jTFNSUnhGaWZvRXJyb3IxICAgICAgICAgIDB4ODAKKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKK3N0YXRpYyBpbnQgdWFydF9wb3N0X2luaXQgKHVuc2lnbmVkIGxvbmcgZGV2X2Jhc2UpCit7CisJdW5zaWduZWQgbG9uZyByZWc7CisJdW5zaWduZWQgbG9uZyB1ZGl2OworCXVuc2lnbmVkIHNob3J0IGJkaXY7CisJdm9sYXRpbGUgY2hhciB2YWw7CisjaWZkZWYgQ0ZHX0VYVF9TRVJJQUxfQ0xPQ0sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKyNlbmRpZgorCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDM1MDA7IGkrKykgeworCQlpZiAoaW44IChkZXZfYmFzZSArIFVBUlRfTFNSKSAmIGFzeW5jTFNSVHhIb2xkRW1wdHkxKQorCQkJYnJlYWs7CisJCXVkZWxheSAoMTAwKTsKKwl9CisJTUZSRUcoVUFSVDBfU0RSLCByZWcpOworCXJlZyAmPSB+Q1IwX01BU0s7CisKKyNpZmRlZiBDRkdfRVhUX1NFUklBTF9DTE9DSworCXJlZyB8PSBDUjBfRVhUQ0xLX0VOQTsKKwl1ZGl2ID0gMTsKKwl0bXAgID0gZ2QtPmJhdWRyYXRlICogMTY7CisJYmRpdiA9IChDRkdfRVhUX1NFUklBTF9DTE9DSyArIHRtcCAvIDIpIC8gdG1wOworI2Vsc2UKKwkvKiBGb3IgNDQwLCB0aGUgY3B1IGNsb2NrIGlzIG9uIGRpdmlkZXIgY2hhaW4gQSwgVUFSVCBvbiBkaXZpZGVyCisJICogY2hhaW4gQiAuLi4gc28gY3B1IGNsb2NrIGlzIGlycmVsZXZhbnQuIEdldCB0aGUgIm9wdGltaXplZCIKKwkgKiB2YWx1ZXMgdGhhdCBhcmUgc3ViamVjdCB0byB0aGUgMS8yIG9wYiBjbG9jayBjb25zdHJhaW50CisJICovCisJc2VyaWFsX2RpdnMgKGdkLT5iYXVkcmF0ZSwgJnVkaXYsICZiZGl2KTsKKyNlbmRpZgorCisJcmVnIHw9ICh1ZGl2IC0gVURJVl9TVUJUUkFDVCkgPDwgQ1IwX1VESVZfUE9TOwkvKiBzZXQgdGhlIFVBUlQgZGl2aXNvciAqLworCisJLyoKKwkgKiBDb25maWd1cmUgaW5wdXQgY2xvY2sgdG8gYmF1ZHJhdGUgZ2VuZXJhdG9yIGZvciBhbGwKKwkgKiBhdmFpbGFibGUgc2VyaWFsIHBvcnRzIGhlcmUKKwkgKi8KKwlNVFJFRyhVQVJUMF9TRFIsIHJlZyk7CisjaWYgZGVmaW5lZChVQVJUMV9TRFIpCisJTVRSRUcoVUFSVDFfU0RSLCByZWcpOworI2VuZGlmCisjaWYgZGVmaW5lZChVQVJUMl9TRFIpCisJTVRSRUcoVUFSVDJfU0RSLCByZWcpOworI2VuZGlmCisjaWYgZGVmaW5lZChVQVJUM19TRFIpCisJTVRSRUcoVUFSVDNfU0RSLCByZWcpOworI2VuZGlmCisKKwlvdXQ4KGRldl9iYXNlICsgVUFSVF9MQ1IsIDB4ODApOwkvKiBzZXQgRExBQiBiaXQgKi8KKwlvdXQ4KGRldl9iYXNlICsgVUFSVF9ETEwsIGJkaXYpOwkvKiBzZXQgYmF1ZHJhdGUgZGl2aXNvciAqLworCW91dDgoZGV2X2Jhc2UgKyBVQVJUX0RMTSwgYmRpdiA+PiA4KTsJLyogc2V0IGJhdWRyYXRlIGRpdmlzb3IgKi8KKwlvdXQ4KGRldl9iYXNlICsgVUFSVF9MQ1IsIDB4MDMpOwkvKiBjbGVhciBETEFCOyBzZXQgOCBiaXRzLCBubyBwYXJpdHkgKi8KKwlvdXQ4KGRldl9iYXNlICsgVUFSVF9GQ1IsIDB4MDApOwkvKiBkaXNhYmxlIEZJRk8gKi8KKwlvdXQ4KGRldl9iYXNlICsgVUFSVF9NQ1IsIDB4MTApOwkvKiBlbmFibGUgbG9vcGJhY2sgbW9kZSAqLworCXZhbCA9IGluOChkZXZfYmFzZSArIFVBUlRfTFNSKTsJCS8qIGNsZWFyIGxpbmUgc3RhdHVzICovCisJdmFsID0gaW44KGRldl9iYXNlICsgVUFSVF9SQlIpOwkJLyogcmVhZCByZWNlaXZlIGJ1ZmZlciAqLworCW91dDgoZGV2X2Jhc2UgKyBVQVJUX1NDUiwgMHgwMCk7CS8qIHNldCBzY3JhdGNocGFkICovCisJb3V0OChkZXZfYmFzZSArIFVBUlRfSUVSLCAweDAwKTsJLyogc2V0IGludGVycnVwdCBlbmFibGUgcmVnICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdWFydF9wb3N0X3B1dGMgKHVuc2lnbmVkIGxvbmcgZGV2X2Jhc2UsIGNoYXIgYykKK3sKKwlpbnQgaTsKKworCW91dDggKGRldl9iYXNlICsgVUFSVF9USFIsIGMpOwkvKiBwdXQgY2hhcmFjdGVyIG91dCAqLworCisJLyogV2FpdCBmb3IgdHJhbnNmZXIgY29tcGxldGlvbiAqLworCWZvciAoaSA9IDA7IGkgPCAzNTAwOyBpKyspIHsKKwkJaWYgKGluOCAoZGV2X2Jhc2UgKyBVQVJUX0xTUikgJiBhc3luY0xTUlR4SG9sZEVtcHR5MSkKKwkJCWJyZWFrOworCQl1ZGVsYXkgKDEwMCk7CisJfQorfQorCitzdGF0aWMgaW50IHVhcnRfcG9zdF9nZXRjICh1bnNpZ25lZCBsb25nIGRldl9iYXNlKQoreworCWludCBpOworCisJLyogV2FpdCBmb3IgY2hhcmFjdGVyIGF2YWlsYWJsZSAqLworCWZvciAoaSA9IDA7IGkgPCAzNTAwOyBpKyspIHsKKwkJaWYgKGluOCAoZGV2X2Jhc2UgKyBVQVJUX0xTUikgJiBhc3luY0xTUkRhdGFSZWFkeTEpCisJCQlicmVhazsKKwkJdWRlbGF5ICgxMDApOworCX0KKwlyZXR1cm4gMHhmZiAmIGluOCAoZGV2X2Jhc2UgKyBVQVJUX1JCUik7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9jdGxyICh1bnNpZ25lZCBsb25nIGRldl9iYXNlLCBpbnQgaW5kZXgpCit7CisJaW50IHJlcyA9IC0xOworCWNoYXIgdGVzdF9zdHJbXSA9ICIqKiogVUFSVCBUZXN0IFN0cmluZyAqKipcclxuIjsKKwlpbnQgaTsKKworCXVhcnRfcG9zdF9pbml0IChkZXZfYmFzZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mICh0ZXN0X3N0cikgLSAxOyBpKyspIHsKKwkJdWFydF9wb3N0X3B1dGMgKGRldl9iYXNlLCB0ZXN0X3N0cltpXSk7CisJCWlmICh1YXJ0X3Bvc3RfZ2V0YyAoZGV2X2Jhc2UpICE9IHRlc3Rfc3RyW2ldKQorCQkJZ290byBkb25lOworCX0KKwlyZXMgPSAwOworZG9uZToKKwlpZiAocmVzKQorCQlwb3N0X2xvZyAoInVhcnQlZCB0ZXN0IGZhaWxlZFxuIiwgaW5kZXgpOworCisJcmV0dXJuIHJlczsKK30KKworaW50IHVhcnRfcG9zdF90ZXN0IChpbnQgZmxhZ3MpCit7CisJaW50IGksIHJlcyA9IDA7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgYmFzZVtdID0geworCQlVQVJUMF9CQVNFLCBVQVJUMV9CQVNFLCBVQVJUMl9CQVNFLCBVQVJUM19CQVNFCisJfTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGJhc2UpIC8gc2l6ZW9mIChiYXNlWzBdKTsgaSsrKSB7CisJCWlmICh0ZXN0X2N0bHIgKGJhc2VbaV0sIGkpKQorCQkJcmVzID0gLTE7CisJfQorCXNlcmlhbF9yZWluaXRfYWxsICgpOworCisJcmV0dXJuIHJlczsKK30KKworI2VuZGlmIC8qIENPTkZJR19QT1NUICYgQ0ZHX1BPU1RfVUFSVCAqLworI2VuZGlmIC8qIENPTkZJR19QT1NUICovCmRpZmYgLS1naXQgYS9wb3N0L2NwdS9wcGM0eHgvd2F0Y2hkb2cuYyBiL3Bvc3QvY3B1L3BwYzR4eC93YXRjaGRvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNGY0YzkKLS0tIC9kZXYvbnVsbAorKysgYi9wb3N0L2NwdS9wcGM0eHgvd2F0Y2hkb2cuYwpAQCAtMCwwICsxLDcxIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA3CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIEF1dGhvcjogSWdvciBMaXNpdHNpbiA8aWdvckBlbWNyYWZ0LmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKy8qCisgKiBXYXRjaGRvZyB0ZXN0CisgKgorICogVGhlIHRlc3QgdmVyaWZpZXMgdGhlIHdhdGNoZG9nIHRpbWVyIG9wZXJhdGlvbi4KKyAqIE9uIHRoZSBmaXJzdCBpdGVyYXRpb24sIHRoZSB0ZXN0IHJvdXRpbmUgZGlzYWJsZXMgaW50ZXJydXB0cyBhbmQKKyAqIG1ha2VzIGEgMTAtc2Vjb25kIGRlbGF5LiBJZiB0aGUgc3lzdGVtIGRvZXMgbm90IHJlYm9vdCBkdXJpbmcgdGhpcyBkZWxheSwKKyAqIHRoZSB3YXRjaGRvZyB0aW1lciBpcyBub3Qgb3BlcmF0aW9uYWwgYW5kIHRoZSB0ZXN0IGZhaWxzLiBJZiB0aGUgc3lzdGVtCisgKiByZWJvb3RzLCBvbiB0aGUgc2Vjb25kIGl0ZXJhdGlvbiB0aGUgdGVzdCByb3V0aW5lIHJlcG9ydHMgYSBzdWNjZXNzLgorICovCisKKyNpZmRlZiBDT05GSUdfUE9TVAorCisjaW5jbHVkZSA8cG9zdC5oPgorCisjaWYgQ09ORklHX1BPU1QgJiBDRkdfUE9TVF9XQVRDSERPRworCisjaW5jbHVkZSA8d2F0Y2hkb2cuaD4KKworaW50IHdhdGNoZG9nX3Bvc3RfdGVzdCAoaW50IGZsYWdzKQoreworCWlmIChmbGFncyAmIFBPU1RfUkVCT09UKSB7CisJCS8qIFRlc3QgcGFzc2VkICovCisJCXJldHVybiAwOworCX0KKwllbHNlIHsKKwkJLyogMTAtc2Vjb25kIGRlbGF5ICovCisJCWludCBpbnRzID0gZGlzYWJsZV9pbnRlcnJ1cHRzICgpOworCQl1bG9uZyBiYXNlID0gcG9zdF90aW1lX21zICgwKTsKKworCQl3aGlsZSAocG9zdF90aW1lX21zIChiYXNlKSA8IDEwMDAwKQorCQkJOworCQlpZiAoaW50cykKKwkJCWVuYWJsZV9pbnRlcnJ1cHRzICgpOworCisJCS8qCisJCSAqIElmIHdlIGhhdmUgcmVhY2hlZCB0aGlzIHBvaW50LCB0aGUgd2F0Y2hkb2cgdGltZXIKKwkJICogZG9lcyBub3Qgd29yaworCQkgKi8KKwkJcmV0dXJuIC0xOworCX0KK30KKworI2VuZGlmIC8qIENPTkZJR19QT1NUICYgQ0ZHX1BPU1RfV0FUQ0hET0cgKi8KKyNlbmRpZiAvKiBDT05GSUdfUE9TVCAqLwpkaWZmIC0tZ2l0IGEvcG9zdC9kcml2ZXJzL01ha2VmaWxlIGIvcG9zdC9kcml2ZXJzL01ha2VmaWxlCmluZGV4IDA2OGZhOTguLmNiMmYxZGUgMTAwNjQ0Ci0tLSBhL3Bvc3QvZHJpdmVycy9NYWtlZmlsZQorKysgYi9wb3N0L2RyaXZlcnMvTWFrZWZpbGUKQEAgLTI2LDYgKzI2LDYgQEAKIAogTElCCT0gbGlicG9zdGRyaXZlcnMuYQogCi1DT0JKUwk9IGNhY2hlLm8gaTJjLm8gbWVtb3J5Lm8gcnRjLm8KK0NPQkpTCT0gaTJjLm8gbWVtb3J5Lm8gcnRjLm8KIAogaW5jbHVkZSAkKFRPUERJUikvcG9zdC9ydWxlcy5tawpkaWZmIC0tZ2l0IGEvcG9zdC9saWJfcHBjL01ha2VmaWxlIGIvcG9zdC9saWJfcHBjL01ha2VmaWxlCmluZGV4IDE0MzU0YTAuLjlmMWIzMjkgMTAwNjQ0Ci0tLSBhL3Bvc3QvbGliX3BwYy9NYWtlZmlsZQorKysgYi9wb3N0L2xpYl9wcGMvTWFrZWZpbGUKQEAgLTIxLDYgKzIxLDcgQEAKICMgTUEgMDIxMTEtMTMwNyBVU0EKICMKIAorU1VCRElSUyA9IGZwdQogCiBMSUIJPSBsaWJwb3N0cHBjLmEKIApkaWZmIC0tZ2l0IGEvcG9zdC9saWJfcHBjL2FzbS5TIGIvcG9zdC9saWJfcHBjL2FzbS5TCmluZGV4IGEwODE1YTQuLjVlNzJiMzQgMTAwNjQ0Ci0tLSBhL3Bvc3QvbGliX3BwYy9hc20uUworKysgYi9wb3N0L2xpYl9wcGMvYXNtLlMKQEAgLTM0LDYgKzM0LDcgQEAKIC8qIHZvaWQgY3B1X3Bvc3RfZXhlY18wMiAodWxvbmcgKmNvZGUsIHVsb25nIG9wMSwgdWxvbmcgb3AyKTsgKi8KIAkuZ2xvYmFsCWNwdV9wb3N0X2V4ZWNfMDIKIGNwdV9wb3N0X2V4ZWNfMDI6CisJaXN5bmMKIAltZmxyCXIwCiAJc3R3dQlyMCwgLTQocjEpCiAKQEAgLTU2LDYgKzU3LDcgQEAKIC8qIHZvaWQgY3B1X3Bvc3RfZXhlY18wNCAodWxvbmcgKmNvZGUsIHVsb25nIG9wMSwgdWxvbmcgb3AyLCB1bG9uZyBvcDMsIHVsb25nIG9wNCk7ICovCiAJLmdsb2JhbAljcHVfcG9zdF9leGVjXzA0CiBjcHVfcG9zdF9leGVjXzA0OgorCWlzeW5jCiAJbWZscglyMAogCXN0d3UJcjAsIC00KHIxKQogCkBAIC04MCw2ICs4Miw3IEBACiAvKiB2b2lkIGNwdV9wb3N0X2V4ZWNfMTIgKHVsb25nICpjb2RlLCB1bG9uZyAqcmVzLCB1bG9uZyBvcDEsIHVsb25nIG9wMik7ICovCiAJLmdsb2JhbAljcHVfcG9zdF9leGVjXzEyCiBjcHVfcG9zdF9leGVjXzEyOgorCWlzeW5jCiAJbWZscglyMAogCXN0d3UJcjAsIC00KHIxKQogCXN0d3UJcjQsIC00KHIxKQpAQCAtMTAwLDYgKzEwMyw3IEBACiAvKiB2b2lkIGNwdV9wb3N0X2V4ZWNfMTEgKHVsb25nICpjb2RlLCB1bG9uZyAqcmVzLCB1bG9uZyBvcDEpOyAqLwogCS5nbG9iYWwJY3B1X3Bvc3RfZXhlY18xMQogY3B1X3Bvc3RfZXhlY18xMToKKwlpc3luYwogCW1mbHIJcjAKIAlzdHd1CXIwLCAtNChyMSkKIAlzdHd1CXI0LCAtNChyMSkKQEAgLTExOSw2ICsxMjMsNyBAQAogLyogdm9pZCBjcHVfcG9zdF9leGVjXzIxICh1bG9uZyAqY29kZSwgdWxvbmcgKmNyLCB1bG9uZyAqcmVzLCB1bG9uZyBvcDEpOyAqLwogCS5nbG9iYWwJY3B1X3Bvc3RfZXhlY18yMQogY3B1X3Bvc3RfZXhlY18yMToKKwlpc3luYwogCW1mbHIJcjAKIAlzdHd1CXIwLCAtNChyMSkKIAlzdHd1CXI0LCAtNChyMSkKQEAgLTE0OCw2ICsxNTMsNyBAQAogICAgIHVsb25nIG9wMik7ICovCiAJLmdsb2JhbAljcHVfcG9zdF9leGVjXzIyCiBjcHVfcG9zdF9leGVjXzIyOgorCWlzeW5jCiAJbWZscglyMAogCXN0d3UJcjAsIC00KHIxKQogCXN0d3UJcjQsIC00KHIxKQpAQCAtMTc3LDYgKzE4Myw3IEBACiAvKiB2b2lkIGNwdV9wb3N0X2V4ZWNfMTJ3ICh1bG9uZyAqY29kZSwgdWxvbmcgKm9wMSwgdWxvbmcgb3AyLCB1bG9uZyBvcDMpOyAqLwogCS5nbG9iYWwJY3B1X3Bvc3RfZXhlY18xMncKIGNwdV9wb3N0X2V4ZWNfMTJ3OgorCWlzeW5jCiAJbWZscglyMAogCXN0d3UJcjAsIC00KHIxKQogCXN0d3UJcjQsIC00KHIxKQpAQCAtMTk4LDYgKzIwNSw3IEBACiAvKiB2b2lkIGNwdV9wb3N0X2V4ZWNfMTF3ICh1bG9uZyAqY29kZSwgdWxvbmcgKm9wMSwgdWxvbmcgb3AyKTsgKi8KIAkuZ2xvYmFsCWNwdV9wb3N0X2V4ZWNfMTF3CiBjcHVfcG9zdF9leGVjXzExdzoKKwlpc3luYwogCW1mbHIJcjAKIAlzdHd1CXIwLCAtNChyMSkKIAlzdHd1CXI0LCAtNChyMSkKQEAgLTIxOCw2ICsyMjYsNyBAQAogLyogdm9pZCBjcHVfcG9zdF9leGVjXzIydyAodWxvbmcgKmNvZGUsIHVsb25nICpvcDEsIHVsb25nIG9wMiwgdWxvbmcgKm9wMyk7ICovCiAJLmdsb2JhbAljcHVfcG9zdF9leGVjXzIydwogY3B1X3Bvc3RfZXhlY18yMnc6CisJaXN5bmMKIAltZmxyCXIwCiAJc3R3dQlyMCwgLTQocjEpCiAJc3R3dQlyNCwgLTQocjEpCkBAIC0yNDEsNiArMjUwLDcgQEAKIC8qIHZvaWQgY3B1X3Bvc3RfZXhlY18yMXcgKHVsb25nICpjb2RlLCB1bG9uZyAqb3AxLCB1bG9uZyAqb3AyKTsgKi8KIAkuZ2xvYmFsCWNwdV9wb3N0X2V4ZWNfMjF3CiBjcHVfcG9zdF9leGVjXzIxdzoKKwlpc3luYwogCW1mbHIJcjAKIAlzdHd1CXIwLCAtNChyMSkKIAlzdHd1CXI0LCAtNChyMSkKQEAgLTI2Myw2ICsyNzMsNyBAQAogLyogdm9pZCBjcHVfcG9zdF9leGVjXzIxeCAodWxvbmcgKmNvZGUsIHVsb25nICpvcDEsIHVsb25nICpvcDIsIHVsb25nIG9wMyk7ICovCiAJLmdsb2JhbAljcHVfcG9zdF9leGVjXzIxeAogY3B1X3Bvc3RfZXhlY18yMXg6CisJaXN5bmMKIAltZmxyCXIwCiAJc3R3dQlyMCwgLTQocjEpCiAJc3R3dQlyNCwgLTQocjEpCkBAIC0yODYsNiArMjk3LDcgQEAKICAgICB1bG9uZyBjcik7ICovCiAJLmdsb2JhbAljcHVfcG9zdF9leGVjXzMxCiBjcHVfcG9zdF9leGVjXzMxOgorCWlzeW5jCiAJbWZscglyMAogCXN0d3UJcjAsIC00KHIxKQogCXN0d3UJcjQsIC00KHIxKQpkaWZmIC0tZ2l0IGEvcG9zdC9saWJfcHBjL2IuYyBiL3Bvc3QvbGliX3BwYy9iLmMKaW5kZXggYjRiMTdjOC4uNmUyNzZjNCAxMDA2NDQKLS0tIGEvcG9zdC9saWJfcHBjL2IuYworKysgYi9wb3N0L2xpYl9wcGMvYi5jCkBAIC00OSw3ICs0OSw3IEBACiAgICAgdWxvbmcgY3IpOwogCiBzdGF0aWMgaW50IGNwdV9wb3N0X3Rlc3RfYmMgKHVsb25nIGNtZCwgdWxvbmcgYm8sIHVsb25nIGJpLAotICAgIGludCBwanVtcCwgaW50IGRlYywgaW50IGxpbmssIHVsb25nIHBjdHIsIHVsb25nIGNyKQorICAgIGludCBwanVtcCwgaW50IGRlY3IsIGludCBsaW5rLCB1bG9uZyBwY3RyLCB1bG9uZyBjcikKIHsKICAgICBpbnQgcmV0ID0gMDsKICAgICB1bG9uZyBsciA9IDA7CkBAIC03Nyw3ICs3Nyw3IEBACiAJcmV0ID0gcGp1bXAgPT0ganVtcCA/IDAgOiAtMTsKICAgICBpZiAocmV0ID09IDApCiAgICAgewotCWlmIChkZWMpCisJaWYgKGRlY3IpCiAJICAgIHJldCA9IHBjdHIgPT0gY3RyICsgMSA/IDAgOiAtMTsKIAllbHNlCiAJICAgIHJldCA9IHBjdHIgPT0gY3RyID8gMCA6IC0xOwpAQCAtMTYzLDcgKzE2Myw3IEBACiAJCSAgICB7CiAJCQlmb3IgKGN0ciA9IDE7IGN0ciA8PSAyICYmIHJldCA9PSAwOyBjdHIrKykKIAkJCXsKLQkJCSAgICBpbnQgZGVjID0gY2QgPCAyOworCQkJICAgIGludCBkZWNyID0gY2QgPCAyOwogCQkJICAgIGludCBjciA9IGNvbmQgPyAweDgwMDAwMDAwIDogMHgwMDAwMDAwMDsKIAkJCSAgICBpbnQganVtcGMgPSBjYyA+PSAyIHx8CiAJCQkJCShjYyA9PSAwICYmICFjb25kKSB8fApAQCAtMTc0LDcgKzE3NCw3IEBACiAJCQkgICAgaW50IGp1bXAgPSBqdW1wYyAmJiBqdW1wZDsKIAogCQkJICAgIHJldCA9IGNwdV9wb3N0X3Rlc3RfYmMgKGxpbmsgPyBPUF9CQ0wgOiBPUF9CQywKLQkJCQkoY2MgPDwgMykgKyAoY2QgPDwgMSksIDAsIGp1bXAsIGRlYywgbGluaywKKwkJCQkoY2MgPDwgMykgKyAoY2QgPDwgMSksIDAsIGp1bXAsIGRlY3IsIGxpbmssCiAJCQkJY3RyLCBjcik7CiAKIAkJCSAgICBpZiAocmV0ICE9IDApCmRpZmYgLS1naXQgYS9wb3N0L2xpYl9wcGMvZnB1LzIwMDAxMTIyLTEuYyBiL3Bvc3QvbGliX3BwYy9mcHUvMjAwMDExMjItMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ODliODIKLS0tIC9kZXYvbnVsbAorKysgYi9wb3N0L2xpYl9wcGMvZnB1LzIwMDAxMTIyLTEuYwpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisvKgorICogVGhpcyBmaWxlIGlzIG9yaWdpbmFsbHkgYSBwYXJ0IG9mIHRoZSBHQ0MgdGVzdHN1aXRlLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmZGVmIENPTkZJR19QT1NUCisKKyNpbmNsdWRlIDxwb3N0Lmg+CisKKyNpZiBDT05GSUdfUE9TVCAmIENGR19QT1NUX0ZQVQorCitpbnQgZnB1X3Bvc3RfdGVzdF9tYXRoMSAodm9pZCkKK3sKKwl2b2xhdGlsZSBkb3VibGUgYSwgKnA7CisJZG91YmxlIGMsIGQ7CisJdm9sYXRpbGUgZG91YmxlIGI7CisKKwlkID0gMS4wOworCXAgPSAmYjsKKworCWRvCisJeworCQljID0gZDsKKwkJZCA9IGMgKiAwLjU7CisJCWIgPSAxICsgZDsKKwl9IHdoaWxlIChiICE9IDEuMCk7CisKKwlhID0gMS4wICsgYzsKKworCWlmIChhID09IDEuMCkgeworCQlwb3N0X2xvZyAoIkVycm9yIGluIEZQVSBtYXRoMSB0ZXN0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogQ09ORklHX1BPU1QgJiBDRkdfUE9TVF9GUFUgKi8KKyNlbmRpZiAvKiBDT05GSUdfUE9TVCAqLwpkaWZmIC0tZ2l0IGEvcG9zdC9saWJfcHBjL2ZwdS8yMDAxMDExNC0yLmMgYi9wb3N0L2xpYl9wcGMvZnB1LzIwMDEwMTE0LTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTYwNTA3Ci0tLSAvZGV2L251bGwKKysrIGIvcG9zdC9saWJfcHBjL2ZwdS8yMDAxMDExNC0yLmMKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNworICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworLyoKKyAqIFRoaXMgZmlsZSBpcyBvcmlnaW5hbGx5IGEgcGFydCBvZiB0aGUgR0NDIHRlc3RzdWl0ZS4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDT05GSUdfUE9TVAorCisjaW5jbHVkZSA8cG9zdC5oPgorCisjaWYgQ09ORklHX1BPU1QgJiBDRkdfUE9TVF9GUFUKKworc3RhdGljIGZsb2F0IHJpbnRmIChmbG9hdCB4KQoreworCXZvbGF0aWxlIGZsb2F0IFRXTzIzID0gODM4ODYwOC4wOworCisJaWYgKF9fYnVpbHRpbl9mYWJzICh4KSA8IFRXTzIzKQorCXsKKwkJaWYgKHggPiAwLjApCisJCXsKKwkJCXggKz0gVFdPMjM7CisJCQl4IC09IFRXTzIzOworCQl9CisJCWVsc2UgaWYgKHggPCAwLjApCisJCXsKKwkJCXggPSBUV08yMyAtIHg7CisJCQl4ID0gLSh4IC0gVFdPMjMpOworCQl9CisJfQorCisJcmV0dXJuIHg7Cit9CisKK2ludCBmcHVfcG9zdF90ZXN0X21hdGgyICh2b2lkKQoreworCWlmIChyaW50ZiAoLTEuNSkgIT0gLTIuMCkgeworCQlwb3N0X2xvZyAoIkVycm9yIGluIEZQVSBtYXRoMiB0ZXN0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19QT1NUICYgQ0ZHX1BPU1RfRlBVICovCisjZW5kaWYgLyogQ09ORklHX1BPU1QgKi8KZGlmZiAtLWdpdCBhL3Bvc3QvbGliX3BwYy9mcHUvMjAwMTAyMjYtMS5jIGIvcG9zdC9saWJfcHBjL2ZwdS8yMDAxMDIyNi0xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJjNDdlMwotLS0gL2Rldi9udWxsCisrKyBiL3Bvc3QvbGliX3BwYy9mcHUvMjAwMTAyMjYtMS5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKy8qCisgKiBUaGlzIGZpbGUgaXMgb3JpZ2luYWxseSBhIHBhcnQgb2YgdGhlIEdDQyB0ZXN0c3VpdGUuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWZkZWYgQ09ORklHX1BPU1QKKworI2luY2x1ZGUgPHBvc3QuaD4KKworI2lmIENPTkZJR19QT1NUICYgQ0ZHX1BPU1RfRlBVCisKK2ludCBmcHVfcG9zdF90ZXN0X21hdGgzICh2b2lkKQoreworCXZvbGF0aWxlIGxvbmcgZG91YmxlIGRmcm9tID0gMS4xOworCXZvbGF0aWxlIGxvbmcgZG91YmxlIG0xOworCXZvbGF0aWxlIGxvbmcgZG91YmxlIG0yOworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgbWFudF9sb25nOworCisJbTEgPSBkZnJvbSAvIDIuMDsKKwltMiA9IG0xICogNDI5NDk2NzI5Ni4wOworCW1hbnRfbG9uZyA9ICgodW5zaWduZWQgbG9uZykgbTIpICYgMHhmZmZmZmZmZjsKKworCWlmIChtYW50X2xvbmcgIT0gMHg4Y2NjY2NjYykgeworCQlwb3N0X2xvZyAoIkVycm9yIGluIEZQVSBtYXRoMyB0ZXN0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19QT1NUICYgQ0ZHX1BPU1RfRlBVICovCisjZW5kaWYgLyogQ09ORklHX1BPU1QgKi8KZGlmZiAtLWdpdCBhL3Bvc3QvbGliX3BwYy9mcHUvOTgwNjE5LTEuYyBiL3Bvc3QvbGliX3BwYy9mcHUvOTgwNjE5LTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTBhYTBjCi0tLSAvZGV2L251bGwKKysrIGIvcG9zdC9saWJfcHBjL2ZwdS85ODA2MTktMS5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKy8qCisgKiBUaGlzIGZpbGUgaXMgb3JpZ2luYWxseSBhIHBhcnQgb2YgdGhlIEdDQyB0ZXN0c3VpdGUuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWZkZWYgQ09ORklHX1BPU1QKKworI2luY2x1ZGUgPHBvc3QuaD4KKworI2lmIENPTkZJR19QT1NUICYgQ0ZHX1BPU1RfRlBVCisKK2ludCBmcHVfcG9zdF90ZXN0X21hdGg0ICh2b2lkKQoreworCXZvbGF0aWxlIGZsb2F0IHJlYWxlID0gMS4wZjsKKwl2b2xhdGlsZSBmbG9hdCBvbmVwbHVzOworCWludCBpOworCisJaWYgKHNpemVvZiAoZmxvYXQpICE9IDQpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgOyBpKyspCisJeworCQlvbmVwbHVzID0gMS4wZiArIHJlYWxlOworCQlpZiAob25lcGx1cyA9PSAxLjBmKQorCQkJYnJlYWs7CisJCXJlYWxlID0gcmVhbGUgLyAyLjBmOworCX0KKwkvKiBBc3N1bWVzIGllZWU3NTQgYWNjdXJhdGUgYXJpdGhtZXRpYyBhYm92ZS4gICovCisJaWYgKGkgIT0gMjQpIHsKKwkJcG9zdF9sb2cgKCJFcnJvciBpbiBGUFUgbWF0aDQgdGVzdFxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUE9TVCAmIENGR19QT1NUX0ZQVSAqLworI2VuZGlmIC8qIENPTkZJR19QT1NUICovCmRpZmYgLS1naXQgYS9wb3N0L2xpYl9wcGMvZnB1L01ha2VmaWxlIGIvcG9zdC9saWJfcHBjL2ZwdS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjY0NmM4Ci0tLSAvZGV2L251bGwKKysrIGIvcG9zdC9saWJfcHBjL2ZwdS9NYWtlZmlsZQpAQCAtMCwwICsxLDMyIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwNworIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCisKK0xJQgk9IGxpYnBvc3RwcGNmcHUuYQorCitDT0JKUwkrPSBmcHUubyAyMDAwMTEyMi0xLm8gMjAwMTAxMTQtMi5vIDIwMDEwMjI2LTEubyA5ODA2MTktMS5vCitDT0JKUwkrPSBhY2MxLm8gY29tcGFyZS1mcC0xLm8gbXVsLXN1Ym5vcm1hbC1zaW5nbGUtMS5vCisKK2luY2x1ZGUgJChUT1BESVIpL3Bvc3QvcnVsZXMubWsKKworQ0ZMQUdTICs9IC1taGFyZC1mbG9hdCAtZmtlZXAtaW5saW5lLWZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvcG9zdC9saWJfcHBjL2ZwdS9hY2MxLmMgYi9wb3N0L2xpYl9wcGMvZnB1L2FjYzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2VjYmY2Ci0tLSAvZGV2L251bGwKKysrIGIvcG9zdC9saWJfcHBjL2ZwdS9hY2MxLmMKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNworICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworLyoKKyAqIFRoaXMgZmlsZSBpcyBvcmlnaW5hbGx5IGEgcGFydCBvZiB0aGUgR0NDIHRlc3RzdWl0ZS4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDT05GSUdfUE9TVAorCisjaW5jbHVkZSA8cG9zdC5oPgorCisjaWYgQ09ORklHX1BPU1QgJiBDRkdfUE9TVF9GUFUKKworc3RhdGljIGRvdWJsZSBmdW5jIChjb25zdCBkb3VibGUgKmFycmF5KQoreworCWRvdWJsZSBkID0gKmFycmF5OworCisJaWYgKGQgPT0gMC4wKQorCQlyZXR1cm4gZDsKKwllbHNlCisJCXJldHVybiBkICsgZnVuYyAoYXJyYXkgKyAxKTsKK30KKworaW50IGZwdV9wb3N0X3Rlc3RfbWF0aDUgKHZvaWQpCit7CisJZG91YmxlIHZhbHVlc1tdID0geyAwLjFlLTEwMCwgMS4wLCAtMS4wLCAwLjAgfTsKKworCWlmIChmdW5jICh2YWx1ZXMpICE9IDAuMWUtMTAwKSB7CisJCXBvc3RfbG9nICgiRXJyb3IgaW4gRlBVIG1hdGg1IHRlc3RcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCisjZW5kaWYgLyogQ09ORklHX1BPU1QgJiBDRkdfUE9TVF9GUFUgKi8KKyNlbmRpZiAvKiBDT05GSUdfUE9TVCAqLwpkaWZmIC0tZ2l0IGEvcG9zdC9saWJfcHBjL2ZwdS9jb21wYXJlLWZwLTEuYyBiL3Bvc3QvbGliX3BwYy9mcHUvY29tcGFyZS1mcC0xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg2NmFkNQotLS0gL2Rldi9udWxsCisrKyBiL3Bvc3QvbGliX3BwYy9mcHUvY29tcGFyZS1mcC0xLmMKQEAgLTAsMCArMSwyMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKy8qCisgKiBUZXN0IGZvciBjb3JyZWN0bmVzcyBvZiBjb21wb3NpdGUgZmxvYXRpbmctcG9pbnQgY29tcGFyaXNvbnMuCisgKiBXcml0dGVuIGJ5IFBhb2xvIEJvbnppbmksIDI2dGggTWF5IDIwMDQuCisgKiBUaGlzIGZpbGUgaXMgb3JpZ2luYWxseSBhIHBhcnQgb2YgdGhlIEdDQyB0ZXN0c3VpdGUuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWZkZWYgQ09ORklHX1BPU1QKKworI2luY2x1ZGUgPHBvc3QuaD4KKworI2lmIENPTkZJR19QT1NUICYgQ0ZHX1BPU1RfRlBVCisKK3N0YXRpYyBpbnQgZmFpbGVkOworCisjZGVmaW5lIFRFU1QoYykgaWYgKChjKSAhPSBvaykgZmFpbGVkKysKKyNkZWZpbmUgT1JEKGEsIGIpICghX19idWlsdGluX2lzdW5vcmRlcmVkICgoYSksIChiKSkpCisjZGVmaW5lIFVOT1JEKGEsIGIpIChfX2J1aWx0aW5faXN1bm9yZGVyZWQgKChhKSwgKGIpKSkKKyNkZWZpbmUgVU5FUShhLCBiKSAoX19idWlsdGluX2lzdW5vcmRlcmVkICgoYSksIChiKSkgfHwgKChhKSA9PSAoYikpKQorI2RlZmluZSBVTkxUKGEsIGIpIChfX2J1aWx0aW5faXN1bm9yZGVyZWQgKChhKSwgKGIpKSB8fCAoKGEpIDwgKGIpKSkKKyNkZWZpbmUgVU5MRShhLCBiKSAoX19idWlsdGluX2lzdW5vcmRlcmVkICgoYSksIChiKSkgfHwgKChhKSA8PSAoYikpKQorI2RlZmluZSBVTkdUKGEsIGIpIChfX2J1aWx0aW5faXN1bm9yZGVyZWQgKChhKSwgKGIpKSB8fCAoKGEpID4gKGIpKSkKKyNkZWZpbmUgVU5HRShhLCBiKSAoX19idWlsdGluX2lzdW5vcmRlcmVkICgoYSksIChiKSkgfHwgKChhKSA+PSAoYikpKQorI2RlZmluZSBMVEdUKGEsIGIpIChfX2J1aWx0aW5faXNsZXNzZ3JlYXRlciAoKGEpLCAoYikpKQorCitzdGF0aWMgZmxvYXQgcGluZjsKK3N0YXRpYyBmbG9hdCBuaW5mOworc3RhdGljIGZsb2F0IE5hTjsKKworc3RhdGljIHZvaWQgaXVuZXEgKGZsb2F0IHgsIGZsb2F0IHksIGludCBvaykKK3sKKwlURVNUIChVTkVRICh4LCB5KSk7CisJVEVTVCAoIUxUR1QgKHgsIHkpKTsKKwlURVNUIChVTkxFICh4LCB5KSAmJiBVTkdFICh4LHkpKTsKK30KKworc3RhdGljIHZvaWQgaWVxIChmbG9hdCB4LCBmbG9hdCB5LCBpbnQgb2spCit7CisJVEVTVCAoT1JEICh4LCB5KSAmJiBVTkVRICh4LCB5KSk7Cit9CisKK3N0YXRpYyB2b2lkIGlsdGd0IChmbG9hdCB4LCBmbG9hdCB5LCBpbnQgb2spCit7CisJVEVTVCAoIVVORVEgKHgsIHkpKTsgLyogTm90IG9wdGltaXphYmxlLiAqLworCVRFU1QgKExUR1QgKHgsIHkpKTsgLyogU2FtZSwgX19idWlsdGluX2lzbGVzc2dyZWF0ZXIgZG9lcyBub3QgdHJhcC4gKi8KKwlURVNUIChPUkQgKHgsIHkpICYmIChVTkxUICh4LCB5KSB8fCBVTkdUICh4LHkpKSk7Cit9CisKK3N0YXRpYyB2b2lkIGluZSAoZmxvYXQgeCwgZmxvYXQgeSwgaW50IG9rKQoreworCVRFU1QgKFVOTFQgKHgsIHkpIHx8IFVOR1QgKHgsIHkpKTsKK30KKworc3RhdGljIHZvaWQgaXVubHQgKGZsb2F0IHgsIGZsb2F0IHksIGludCBvaykKK3sKKwlURVNUIChVTkxUICh4LCB5KSk7CisJVEVTVCAoVU5PUkQgKHgsIHkpIHx8ICh4IDwgeSkpOworfQorCitzdGF0aWMgdm9pZCBpbHQgKGZsb2F0IHgsIGZsb2F0IHksIGludCBvaykKK3sKKwlURVNUIChPUkQgKHgsIHkpICYmIFVOTFQgKHgsIHkpKTsgLyogTm90IG9wdGltaXplZCAqLworCVRFU1QgKCh4IDw9IHkpICYmICh4ICE9IHkpKTsKKwlURVNUICgoeCA8PSB5KSAmJiAoeSAhPSB4KSk7CisJVEVTVCAoKHggIT0geSkgJiYgKHggPD0geSkpOyAvKiBOb3Qgb3B0aW1pemVkICovCisJVEVTVCAoKHkgIT0geCkgJiYgKHggPD0geSkpOyAvKiBOb3Qgb3B0aW1pemVkICovCit9CisKK3N0YXRpYyB2b2lkIGl1bmxlIChmbG9hdCB4LCBmbG9hdCB5LCBpbnQgb2spCit7CisJVEVTVCAoVU5MRSAoeCwgeSkpOworCVRFU1QgKFVOT1JEICh4LCB5KSB8fCAoeCA8PSB5KSk7Cit9CisKK3N0YXRpYyB2b2lkIGlsZSAoZmxvYXQgeCwgZmxvYXQgeSwgaW50IG9rKQoreworCVRFU1QgKE9SRCAoeCwgeSkgJiYgVU5MRSAoeCwgeSkpOyAvKiBOb3Qgb3B0aW1pemVkICovCisJVEVTVCAoKHggPCB5KSB8fCAoeCA9PSB5KSk7CisJVEVTVCAoKHkgPiB4KSB8fCAoeCA9PSB5KSk7CisJVEVTVCAoKHggPT0geSkgfHwgKHggPCB5KSk7IC8qIE5vdCBvcHRpbWl6ZWQgKi8KKwlURVNUICgoeSA9PSB4KSB8fCAoeCA8IHkpKTsgLyogTm90IG9wdGltaXplZCAqLworfQorCitzdGF0aWMgdm9pZCBpdW5ndCAoZmxvYXQgeCwgZmxvYXQgeSwgaW50IG9rKQoreworCVRFU1QgKFVOR1QgKHgsIHkpKTsKKwlURVNUIChVTk9SRCAoeCwgeSkgfHwgKHggPiB5KSk7Cit9CisKK3N0YXRpYyB2b2lkIGlndCAoZmxvYXQgeCwgZmxvYXQgeSwgaW50IG9rKQoreworCVRFU1QgKE9SRCAoeCwgeSkgJiYgVU5HVCAoeCwgeSkpOyAvKiBOb3Qgb3B0aW1pemVkICovCisJVEVTVCAoKHggPj0geSkgJiYgKHggIT0geSkpOworCVRFU1QgKCh4ID49IHkpICYmICh5ICE9IHgpKTsKKwlURVNUICgoeCAhPSB5KSAmJiAoeCA+PSB5KSk7IC8qIE5vdCBvcHRpbWl6ZWQgKi8KKwlURVNUICgoeSAhPSB4KSAmJiAoeCA+PSB5KSk7IC8qIE5vdCBvcHRpbWl6ZWQgKi8KK30KKworc3RhdGljIHZvaWQgaXVuZ2UgKGZsb2F0IHgsIGZsb2F0IHksIGludCBvaykKK3sKKwlURVNUIChVTkdFICh4LCB5KSk7CisJVEVTVCAoVU5PUkQgKHgsIHkpIHx8ICh4ID49IHkpKTsKK30KKworc3RhdGljIHZvaWQgaWdlIChmbG9hdCB4LCBmbG9hdCB5LCBpbnQgb2spCit7CisJVEVTVCAoT1JEICh4LCB5KSAmJiBVTkdFICh4LCB5KSk7IC8qIE5vdCBvcHRpbWl6ZWQgKi8KKwlURVNUICgoeCA+IHkpIHx8ICh4ID09IHkpKTsKKwlURVNUICgoeSA8IHgpIHx8ICh4ID09IHkpKTsKKwlURVNUICgoeCA9PSB5KSB8fCAoeCA+IHkpKTsgLyogTm90IG9wdGltaXplZCAqLworCVRFU1QgKCh5ID09IHgpIHx8ICh4ID4geSkpOyAvKiBOb3Qgb3B0aW1pemVkICovCit9CisKK2ludCBmcHVfcG9zdF90ZXN0X21hdGg2ICh2b2lkKQoreworCXBpbmYgPSBfX2J1aWx0aW5faW5mICgpOworCW5pbmYgPSAtX19idWlsdGluX2luZiAoKTsKKwlOYU4gPSBfX2J1aWx0aW5fbmFuICgiIik7CisKKwlpdW5lcSAobmluZiwgcGluZiwgMCk7CisJaXVuZXEgKE5hTiwgTmFOLCAxKTsKKwlpdW5lcSAocGluZiwgbmluZiwgMCk7CisJaXVuZXEgKDEsIDQsIDApOworCWl1bmVxICgzLCAzLCAxKTsKKwlpdW5lcSAoNSwgMiwgMCk7CisKKwlpZXEgKDEsIDQsIDApOworCWllcSAoMywgMywgMSk7CisJaWVxICg1LCAyLCAwKTsKKworCWlsdGd0IChuaW5mLCBwaW5mLCAxKTsKKwlpbHRndCAoTmFOLCBOYU4sIDApOworCWlsdGd0IChwaW5mLCBuaW5mLCAxKTsKKwlpbHRndCAoMSwgNCwgMSk7CisJaWx0Z3QgKDMsIDMsIDApOworCWlsdGd0ICg1LCAyLCAxKTsKKworCWluZSAoMSwgNCwgMSk7CisJaW5lICgzLCAzLCAwKTsKKwlpbmUgKDUsIDIsIDEpOworCisJaXVubHQgKE5hTiwgbmluZiwgMSk7CisJaXVubHQgKHBpbmYsIE5hTiwgMSk7CisJaXVubHQgKHBpbmYsIG5pbmYsIDApOworCWl1bmx0IChwaW5mLCBwaW5mLCAwKTsKKwlpdW5sdCAobmluZiwgbmluZiwgMCk7CisJaXVubHQgKDEsIDQsIDEpOworCWl1bmx0ICgzLCAzLCAwKTsKKwlpdW5sdCAoNSwgMiwgMCk7CisKKwlpbHQgKDEsIDQsIDEpOworCWlsdCAoMywgMywgMCk7CisJaWx0ICg1LCAyLCAwKTsKKworCWl1bmxlIChOYU4sIG5pbmYsIDEpOworCWl1bmxlIChwaW5mLCBOYU4sIDEpOworCWl1bmxlIChwaW5mLCBuaW5mLCAwKTsKKwlpdW5sZSAocGluZiwgcGluZiwgMSk7CisJaXVubGUgKG5pbmYsIG5pbmYsIDEpOworCWl1bmxlICgxLCA0LCAxKTsKKwlpdW5sZSAoMywgMywgMSk7CisJaXVubGUgKDUsIDIsIDApOworCisJaWxlICgxLCA0LCAxKTsKKwlpbGUgKDMsIDMsIDEpOworCWlsZSAoNSwgMiwgMCk7CisKKwlpdW5ndCAoTmFOLCBuaW5mLCAxKTsKKwlpdW5ndCAocGluZiwgTmFOLCAxKTsKKwlpdW5ndCAocGluZiwgbmluZiwgMSk7CisJaXVuZ3QgKHBpbmYsIHBpbmYsIDApOworCWl1bmd0IChuaW5mLCBuaW5mLCAwKTsKKwlpdW5ndCAoMSwgNCwgMCk7CisJaXVuZ3QgKDMsIDMsIDApOworCWl1bmd0ICg1LCAyLCAxKTsKKworCWlndCAoMSwgNCwgMCk7CisJaWd0ICgzLCAzLCAwKTsKKwlpZ3QgKDUsIDIsIDEpOworCisJaXVuZ2UgKE5hTiwgbmluZiwgMSk7CisJaXVuZ2UgKHBpbmYsIE5hTiwgMSk7CisJaXVuZ2UgKG5pbmYsIHBpbmYsIDApOworCWl1bmdlIChwaW5mLCBwaW5mLCAxKTsKKwlpdW5nZSAobmluZiwgbmluZiwgMSk7CisJaXVuZ2UgKDEsIDQsIDApOworCWl1bmdlICgzLCAzLCAxKTsKKwlpdW5nZSAoNSwgMiwgMSk7CisKKwlpZ2UgKDEsIDQsIDApOworCWlnZSAoMywgMywgMSk7CisJaWdlICg1LCAyLCAxKTsKKworCWlmIChmYWlsZWQpIHsKKwkJcG9zdF9sb2cgKCJFcnJvciBpbiBGUFUgbWF0aDYgdGVzdFxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUE9TVCAmIENGR19QT1NUX0ZQVSAqLworI2VuZGlmIC8qIENPTkZJR19QT1NUICovCmRpZmYgLS1naXQgYS9wb3N0L2xpYl9wcGMvZnB1L2ZwdS5jIGIvcG9zdC9saWJfcHBjL2ZwdS9mcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2RjYmE4Ci0tLSAvZGV2L251bGwKKysrIGIvcG9zdC9saWJfcHBjL2ZwdS9mcHUuYwpAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIEF1dGhvcjogU2VyZ2VpIFBvc2VsZW5vdiA8c3Bvc2VsZW5vdkBlbWNyYWZ0LmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKy8qCisgKiBGUFUgdGVzdAorICoKKyAqIFRoaXMgdGVzdCBjaGVja3MgdGhlIGFyaXRobWV0aWMgbG9naWMgdW5pdCAoQUxVKSBvZiBDUFUuCisgKiBJdCB0ZXN0cyBpbmRlcGVuZGVudGx5IHZhcmlvdXMgZ3JvdXBzIG9mIGluc3RydWN0aW9ucyB1c2luZworICogcnVuLXRpbWUgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb2RlIHRvIHJlZHVjZSB0aGUgbWVtb3J5IGZvb3RwcmludC4KKyAqIEZvciBtb3JlIGRldGFpbHMgcmVmZXIgdG8gcG9zdC9jcHUvICouYyBmaWxlcy4KKyAqLworCisjaWZkZWYgQ09ORklHX1BPU1QKKworI2luY2x1ZGUgPHBvc3QuaD4KKworI2lmIENPTkZJR19QT1NUICYgQ0ZHX1BPU1RfRlBVCisKKyNpbmNsdWRlIDx3YXRjaGRvZy5oPgorCitleHRlcm4gaW50IGZwdV9zdGF0dXMgKHZvaWQpOworZXh0ZXJuIHZvaWQgZnB1X2VuYWJsZSAodm9pZCk7CitleHRlcm4gdm9pZCBmcHVfZGlzYWJsZSAodm9pZCk7CisKK2V4dGVybiBpbnQgZnB1X3Bvc3RfdGVzdF9tYXRoMSAodm9pZCk7CitleHRlcm4gaW50IGZwdV9wb3N0X3Rlc3RfbWF0aDIgKHZvaWQpOworZXh0ZXJuIGludCBmcHVfcG9zdF90ZXN0X21hdGgzICh2b2lkKTsKK2V4dGVybiBpbnQgZnB1X3Bvc3RfdGVzdF9tYXRoNCAodm9pZCk7CitleHRlcm4gaW50IGZwdV9wb3N0X3Rlc3RfbWF0aDUgKHZvaWQpOworZXh0ZXJuIGludCBmcHVfcG9zdF90ZXN0X21hdGg2ICh2b2lkKTsKK2V4dGVybiBpbnQgZnB1X3Bvc3RfdGVzdF9tYXRoNyAodm9pZCk7CisKK2ludCBmcHVfcG9zdF90ZXN0IChpbnQgZmxhZ3MpCit7CisJaW50IGZwdSA9IGZwdV9zdGF0dXMgKCk7CisKKwlpbnQgcmV0ID0gMDsKKworCVdBVENIRE9HX1JFU0VUICgpOworCisJaWYgKCFmcHUpCisJCWZwdV9lbmFibGUgKCk7CisKKwlpZiAocmV0ID09IDApCisJCXJldCA9IGZwdV9wb3N0X3Rlc3RfbWF0aDEgKCk7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBmcHVfcG9zdF90ZXN0X21hdGgyICgpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gZnB1X3Bvc3RfdGVzdF9tYXRoMyAoKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IGZwdV9wb3N0X3Rlc3RfbWF0aDQgKCk7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBmcHVfcG9zdF90ZXN0X21hdGg1ICgpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gZnB1X3Bvc3RfdGVzdF9tYXRoNiAoKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IGZwdV9wb3N0X3Rlc3RfbWF0aDcgKCk7CisKKwlpZiAoIWZwdSkKKwkJZnB1X2Rpc2FibGUgKCk7CisKKwlXQVRDSERPR19SRVNFVCAoKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUE9TVCAmIENGR19QT1NUX0ZQVSAqLworI2VuZGlmIC8qIENPTkZJR19QT1NUICovCmRpZmYgLS1naXQgYS9wb3N0L2xpYl9wcGMvZnB1L211bC1zdWJub3JtYWwtc2luZ2xlLTEuYyBiL3Bvc3QvbGliX3BwYy9mcHUvbXVsLXN1Ym5vcm1hbC1zaW5nbGUtMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZjQ4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9wb3N0L2xpYl9wcGMvZnB1L211bC1zdWJub3JtYWwtc2luZ2xlLTEuYwpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNworICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworLyoKKyAqIFRoaXMgZmlsZSBpcyBvcmlnaW5hbGx5IGEgcGFydCBvZiB0aGUgR0NDIHRlc3RzdWl0ZS4KKyAqIENoZWNrIHRoYXQgY2VydGFpbiBzdWJub3JtYWwgbnVtYmVycyAoZm9ybWVybHkga25vd24gYXMgZGVub3JtYWxpemVkCisgKiBudW1iZXJzKSBhcmUgcm91bmRlZCB0byB3aXRoaW4gMC41IHVscC4gIFBSIG90aGVyLzE0MzU0LgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmZGVmIENPTkZJR19QT1NUCisKKyNpbmNsdWRlIDxwb3N0Lmg+CisKKyNpZiBDT05GSUdfUE9TVCAmIENGR19QT1NUX0ZQVQorCit1bmlvbiB1ZgoreworCXVuc2lnbmVkIGludCB1OworCWZsb2F0IGY7Cit9OworCitzdGF0aWMgZmxvYXQKK3UyZiAodW5zaWduZWQgaW50IHYpCit7CisJdW5pb24gdWYgdTsKKwl1LnUgPSB2OworCXJldHVybiB1LmY7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2YydSAoZmxvYXQgdikKK3sKKwl1bmlvbiB1ZiB1OworCXUuZiA9IHY7CisJcmV0dXJuIHUudTsKK30KKworc3RhdGljIGludCBvayA9IDE7CisKK3N0YXRpYyB2b2lkCit0c3RtdWwgKHVuc2lnbmVkIGludCB1eCwgdW5zaWduZWQgaW50IHV5LCB1bnNpZ25lZCBpbnQgdXIpCit7CisJZmxvYXQgeCA9IHUyZiAodXgpOworCWZsb2F0IHkgPSB1MmYgKHV5KTsKKworCWlmIChmMnUgKHggKiB5KSAhPSB1cikKKwkvKiBTZXQgYSB2YXJpYWJsZSByYXRoZXIgdGhhbiBhYm9ydGluZyBoZXJlLCB0byBzaW1wbGlmeSB0cmFjaW5nIHdoZW4KKwkgICBzZXZlcmFsIGNvbXB1dGF0aW9ucyBhcmUgd3JvbmcuICAqLworCQlvayA9IDA7Cit9CisKKy8qIFdlIGRvbid0IHdhbnQgdG8gbWFrZSB0aGlzIGNvbnN0IGFuZCBzdGF0aWMsIG9yIGVsc2Ugd2UgcmlzayBpbmxpbmluZworICAgY2F1c2luZyB0aGUgdGVzdCB0byBmb2xkIGFzIGNvbnN0YW50cyBhdCBjb21waWxlLXRpbWUuICAqLworc3RydWN0Cit7CisgIHVuc2lnbmVkIGludCBwMSwgcDIsIHJlczsKK30gc3RhdGljIHZvbGF0aWxlIGV4cGVjdGVkW10gPQoreworCXsweGZmZiwgMHgzZjgwMDQwMCwgMHhmZmZ9LAorCXsweGYsIDB4M2ZjODg4ODgsIDB4MTd9LAorCXsweGYsIDB4M2Y4NDQ0NDQsIDB4Zn0KK307CisKK2ludCBmcHVfcG9zdF90ZXN0X21hdGg3ICh2b2lkKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZiAoZXhwZWN0ZWQpIC8gc2l6ZW9mIChleHBlY3RlZFswXSk7IGkrKykKKwl7CisJCXRzdG11bCAoZXhwZWN0ZWRbaV0ucDEsIGV4cGVjdGVkW2ldLnAyLCBleHBlY3RlZFtpXS5yZXMpOworCQl0c3RtdWwgKGV4cGVjdGVkW2ldLnAyLCBleHBlY3RlZFtpXS5wMSwgZXhwZWN0ZWRbaV0ucmVzKTsKKwl9CisKKwlpZiAoIW9rKSB7CisJCXBvc3RfbG9nICgiRXJyb3IgaW4gRlBVIG1hdGg3IHRlc3RcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCisjZW5kaWYgLyogQ09ORklHX1BPU1QgJiBDRkdfUE9TVF9GUFUgKi8KKyNlbmRpZiAvKiBDT05GSUdfUE9TVCAqLwpkaWZmIC0tZ2l0IGEvcG9zdC9wb3N0LmMgYi9wb3N0L3Bvc3QuYwppbmRleCBhYzQxOTkwLi40ZmY3NWVlIDEwMDY0NAotLS0gYS9wb3N0L3Bvc3QuYworKysgYi9wb3N0L3Bvc3QuYwpAQCAtMTI5LDkgKzEyOSw3IEBACiAJCQkJcG9zdF9sb2cgKCJQQVNTRURcbiIpOwogCQkJZWxzZSB7CiAJCQkJcG9zdF9sb2cgKCJGQUlMRURcbiIpOwotI2lmZGVmIENPTkZJR19TSE9XX0JPT1RfUFJPR1JFU1MKLQkJCQlzaG93X2Jvb3RfcHJvZ3Jlc3MoLTMxKTsKLSNlbmRpZgorCQkJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTMxKTsKIAkJCX0KIAkJfQogCX0KQEAgLTI0MSw5ICsyMzksNyBAQAogCQl9IGVsc2UgewogCQlpZiAoKCp0ZXN0LT50ZXN0KSAoZmxhZ3MpICE9IDApIHsKIAkJCXBvc3RfbG9nICgiRkFJTEVEXG4iKTsKLSNpZmRlZiBDT05GSUdfU0hPV19CT09UX1BST0dSRVNTCi0JCQlzaG93X2Jvb3RfcHJvZ3Jlc3MoLTMyKTsKLSNlbmRpZgorCQkJc2hvd19ib290X3Byb2dyZXNzICgtMzIpOwogCQl9CiAJCWVsc2UKIAkJCXBvc3RfbG9nICgiUEFTU0VEXG4iKTsKQEAgLTQyOCw3ICs0MjQsNyBAQAogdW5zaWduZWQgbG9uZyBwb3N0X3RpbWVfbXMgKHVuc2lnbmVkIGxvbmcgYmFzZSkKIHsKICNpZmRlZiBDT05GSUdfUFBDCi0JcmV0dXJuICh1bnNpZ25lZCBsb25nKWdldF90aWNrcyAoKSAvIChnZXRfdGJjbGsgKCkgLyBDRkdfSFopIC0gYmFzZTsKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpKGdldF90aWNrcyAoKSAvIChnZXRfdGJjbGsgKCkgLyBDRkdfSFopKSAtIGJhc2U7CiAjZWxzZQogI3dhcm5pbmcgIk5vdCBpbXBsZW1lbnRlZCB5ZXQiCiAJcmV0dXJuIDA7IC8qIE5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KZGlmZiAtLWdpdCBhL3Bvc3QvdGVzdHMuYyBiL3Bvc3QvdGVzdHMuYwppbmRleCAzYmNjZDFhLi5mMzYwNGIyIDEwMDY0NAotLS0gYS9wb3N0L3Rlc3RzLmMKKysrIGIvcG9zdC90ZXN0cy5jCkBAIC0zNyw2ICszNyw3IEBACiBleHRlcm4gaW50IHJ0Y19wb3N0X3Rlc3QgKGludCBmbGFncyk7CiBleHRlcm4gaW50IG1lbW9yeV9wb3N0X3Rlc3QgKGludCBmbGFncyk7CiBleHRlcm4gaW50IGNwdV9wb3N0X3Rlc3QgKGludCBmbGFncyk7CitleHRlcm4gaW50IGZwdV9wb3N0X3Rlc3QgKGludCBmbGFncyk7CiBleHRlcm4gaW50IHVhcnRfcG9zdF90ZXN0IChpbnQgZmxhZ3MpOwogZXh0ZXJuIGludCBldGhlcl9wb3N0X3Rlc3QgKGludCBmbGFncyk7CiBleHRlcm4gaW50IHNwaV9wb3N0X3Rlc3QgKGludCBmbGFncyk7CkBAIC0xMjYsNiArMTI3LDE5IEBACiAJQ0ZHX1BPU1RfQ1BVCiAgICAgfSwKICNlbmRpZgorI2lmIENPTkZJR19QT1NUICYgQ0ZHX1BPU1RfRlBVCisgICAgeworCSJGUFUgdGVzdCIsCisJImZwdSIsCisJIlRoaXMgdGVzdCB2ZXJpZmllcyB0aGUgYXJpdGhtZXRpYyBsb2dpYyB1bml0IG9mIgorCSIgRlBVLiIsCisJUE9TVF9SQU0gfCBQT1NUX0FMV0FZUywKKwkmZnB1X3Bvc3RfdGVzdCwKKwlOVUxMLAorCU5VTEwsCisJQ0ZHX1BPU1RfRlBVCisgICAgfSwKKyNlbmRpZgogI2lmIENPTkZJR19QT1NUICYgQ0ZHX1BPU1RfVUFSVAogICAgIHsKIAkiVUFSVCB0ZXN0IiwKZGlmZiAtLWdpdCBhL3J0Yy9iZjV4eF9ydGMuYyBiL3J0Yy9iZjV4eF9ydGMuYwppbmRleCA4NWJiYjU2Li44ODU2YmI5IDEwMDY0NAotLS0gYS9ydGMvYmY1eHhfcnRjLmMKKysrIGIvcnRjL2JmNXh4X3J0Yy5jCkBAIC00OSw3ICs0OSw3IEBACiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogI2luY2x1ZGUgPHJ0Yy5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfUlRDX0JGSU4pICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0JGSU4pICYmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvYmY1eHhfcnRjLmg+CkBAIC0xNDAsNCArMTQwLDQgQEAKIAkgICAgTUlOX1RPX1NFQ1ModG1fbWluKSArIEhSU19UT19TRUNTKHRtX2hvdXIpICsgREFZU19UT19TRUNTKHRtX2RheSk7CiAJdG9fdG0odGltZV9pbl9zZWMsIHRtcCk7CiB9Ci0jZW5kaWYJCQkJLyogQ09ORklHX1JUQ19CRklOICYmIENGR19DTURfREFURSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ydGMvZGF0ZS5jIGIvcnRjL2RhdGUuYwppbmRleCBiNWY4YzQ4Li5hODNhNzIzIDEwMDY0NAotLS0gYS9ydGMvZGF0ZS5jCisrKyBiL3J0Yy9kYXRlLmMKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxjb21tYW5kLmg+CiAjaW5jbHVkZSA8cnRjLmg+CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKSB8fCBkZWZpbmVkKENPTkZJR19USU1FU1RBTVApCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpIHx8IGRlZmluZWQoQ09ORklHX1RJTUVTVEFNUCkKIAogI2RlZmluZSBGRUJSVUFSWQkJMgogI2RlZmluZQlTVEFSVE9GVElNRQkJMTk3MApAQCAtMTUzLDQgKzE1Myw0IEBACiAJKSo2MCArIHNlYzsgLyogZmluYWxseSBzZWNvbmRzICovCiB9CiAKLSNlbmRpZgkvKiBDRkdfQ01EX0RBVEUgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcnRjL2RzMTI4ODcuYyBiL3J0Yy9kczEyODg3LmMKaW5kZXggOGIxMjg5My4uODRmZWNmMCAxMDA2NDQKLS0tIGEvcnRjL2RzMTI4ODcuYworKysgYi9ydGMvZHMxMjg4Ny5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8Y29uZmlnLmg+CiAjaW5jbHVkZSA8cnRjLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19SVENfRFMxMjg4NykgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREFURSkKKyNpZiBkZWZpbmVkKENPTkZJR19SVENfRFMxMjg4NykgJiYgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAKICNkZWZpbmUgUlRDX1NFQ09ORFMJCQkweDAwCiAjZGVmaW5lIFJUQ19TRUNPTkRTX0FMQVJNCQkweDAxCkBAIC0yMzUsNCArMjM1LDQgQEAKIAlydGNfd3JpdGUoUlRDX0NPTlRST0xfQixjdHJsX3JnKTsKIH0KIAotI2VuZGlmICAvKiAoQ09ORklHX1JUQ19EUzEyODg3KSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ydGMvZHMxMzAyLmMgYi9ydGMvZHMxMzAyLmMKaW5kZXggOThkY2U4OS4uNTVhZjEzMCAxMDA2NDQKLS0tIGEvcnRjL2RzMTMwMi5jCisrKyBiL3J0Yy9kczEzMDIuYwpAQCAtOSw3ICs5LDcgQEAKICNpbmNsdWRlIDxjb21tYW5kLmg+CiAjaW5jbHVkZSA8cnRjLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19SVENfRFMxMzAyKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUzEzMDIpICYmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCiAvKiBHUFAgUGlucyAqLwogI2RlZmluZSBEQVRBCQkweDIwMApkaWZmIC0tZ2l0IGEvcnRjL2RzMTMwNi5jIGIvcnRjL2RzMTMwNi5jCmluZGV4IGUwMWUxY2UuLjg5ZTQzM2QgMTAwNjQ0Ci0tLSBhL3J0Yy9kczEzMDYuYworKysgYi9ydGMvZHMxMzA2LmMKQEAgLTM2LDcgKzM2LDcgQEAKICNpbmNsdWRlIDxydGMuaD4KICNpbmNsdWRlIDxzcGkuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUzEzMDYpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0RTMTMwNikgJiYgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAKICNkZWZpbmUJUlRDX1NFQ09ORFMJCTB4MDAKICNkZWZpbmUJUlRDX01JTlVURVMJCTB4MDEKZGlmZiAtLWdpdCBhL3J0Yy9kczEzMDcuYyBiL3J0Yy9kczEzMDcuYwppbmRleCAzYjI2YTBhLi5jODgyZDc5IDEwMDY0NAotLS0gYS9ydGMvZHMxMzA3LmMKKysrIGIvcnRjL2RzMTMwNy5jCkBAIC0zNiw3ICszNiw3IEBACiAjaW5jbHVkZSA8aTJjLmg+CiAKICNpZiAoZGVmaW5lZChDT05GSUdfUlRDX0RTMTMwNykgfHwgZGVmaW5lZChDT05GSUdfUlRDX0RTMTMzOCkgKSAmJiBcCi0gICAgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREFURSkKKyAgICBkZWZpbmVkKENPTkZJR19DTURfREFURSkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI3VuZGVmIERFQlVHX1JUQwpAQCAtMjAxLDQgKzIwMSw0IEBACiAJcmV0dXJuICgoKG4gLyAxMCkgPDwgNCkgfCAobiAlIDEwKSk7CiB9CiAKLSNlbmRpZiAvKiAoQ09ORklHX1JUQ19EUzEzMDcgfHwgQ09ORklHX1JUQ19EUzEzMzgpICYmIChDRkdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3J0Yy9kczEzMzcuYyBiL3J0Yy9kczEzMzcuYwppbmRleCA5ZjBjOGMwLi5jNjM2YWM1IDEwMDY0NAotLS0gYS9ydGMvZHMxMzM3LmMKKysrIGIvcnRjL2RzMTMzNy5jCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSA8cnRjLmg+CiAjaW5jbHVkZSA8aTJjLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19SVENfRFMxMzM3KSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUzEzMzcpICYmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjdW5kZWYgREVCVUdfUlRDCkBAIC0xODgsNCArMTg4LDQgQEAKIAlyZXR1cm4gKCgobiAvIDEwKSA8PCA0KSB8IChuICUgMTApKTsKIH0KIAotI2VuZGlmIC8qIENPTkZJR19SVENfRFMxMzM3ICYmIChDRkdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3J0Yy9kczEzNzQuYyBiL3J0Yy9kczEzNzQuYwppbmRleCA1MGE5OTZjLi5lNzczZGQ5IDEwMDY0NAotLS0gYS9ydGMvZHMxMzc0LmMKKysrIGIvcnRjL2RzMTM3NC5jCkBAIC0zNSw3ICszNSw3IEBACiAjaW5jbHVkZSA8cnRjLmg+CiAjaW5jbHVkZSA8aTJjLmg+CiAKLSNpZiAoZGVmaW5lZChDT05GSUdfUlRDX0RTMTM3NCkpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgKGRlZmluZWQoQ09ORklHX1JUQ19EUzEzNzQpKSAmJiBkZWZpbmVkKENPTkZJR19DTURfREFURSkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI3VuZGVmIERFQlVHX1JUQwpAQCAtMjUwLDQgKzI1MCw0IEBACiB7CiAJCWkyY19yZWdfd3JpdGUgKENGR19JMkNfUlRDX0FERFIsIHJlZywgdmFsKTsKIH0KLSNlbmRpZiAvKiAoQ09ORklHX1JUQ19EUzEzNzQpICYmIChDRkdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3J0Yy9kczE1NTYuYyBiL3J0Yy9kczE1NTYuYwppbmRleCBkZDllYTVlLi40MzY1Y2ZiIDEwMDY0NAotLS0gYS9ydGMvZHMxNTU2LmMKKysrIGIvcnRjL2RzMTU1Ni5jCkBAIC0zNyw3ICszNyw3IEBACiAjaW5jbHVkZSA8cnRjLmg+CiAKIAotI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUzE1NTYpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0RTMTU1NikgJiYgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAKIHN0YXRpYyB1Y2hhciBydGNfcmVhZCggdW5zaWduZWQgaW50IGFkZHIgKTsKIHN0YXRpYyB2b2lkICBydGNfd3JpdGUoIHVuc2lnbmVkIGludCBhZGRyLCB1Y2hhciB2YWwpOwpAQCAtMjAzLDQgKzIwMyw0IEBACiAJcmV0dXJuICgoKG4gLyAxMCkgPDwgNCkgfCAobiAlIDEwKSk7CiB9CiAKLSNlbmRpZgkvKiBDT05GSUdfUlRDX0RTMTU1NiAmJiBDRkdfQ01EX0RBVEUgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcnRjL2RzMTY0eC5jIGIvcnRjL2RzMTY0eC5jCmluZGV4IDNjYzc2YWIuLmJmZjIyYjkgMTAwNjQ0Ci0tLSBhL3J0Yy9kczE2NHguYworKysgYi9ydGMvZHMxNjR4LmMKQEAgLTM3LDcgKzM3LDcgQEAKICNpbmNsdWRlIDxydGMuaD4KIAogCi0jaWYgZGVmaW5lZChDT05GSUdfUlRDX0RTMTY0eCkgJiYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfREFURSkKKyNpZiBkZWZpbmVkKENPTkZJR19SVENfRFMxNjR4KSAmJiBkZWZpbmVkKENPTkZJR19DTURfREFURSkKIAogc3RhdGljIHVjaGFyICAgIHJ0Y19yZWFkKHVuc2lnbmVkIGludCBhZGRyICk7CiBzdGF0aWMgdm9pZCAgICAgcnRjX3dyaXRlKHVuc2lnbmVkIGludCBhZGRyLCB1Y2hhciB2YWwpOwpAQCAtMTk3LDQgKzE5Nyw0IEBACiAJcmV0dXJuICgoKG4gLyAxMCkgPDwgNCkgfCAobiAlIDEwKSk7CiB9CiAKLSNlbmRpZgkvKiBDT05GSUdfUlRDX0RTMTY0eCAmJiBDRkdfQ01EX0RBVEUgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcnRjL2RzMTc0eC5jIGIvcnRjL2RzMTc0eC5jCmluZGV4IDU4YjEzZTkuLjVmODVhNjggMTAwNjQ0Ci0tLSBhL3J0Yy9kczE3NHguYworKysgYi9ydGMvZHMxNzR4LmMKQEAgLTMzLDcgKzMzLDcgQEAKICNpbmNsdWRlIDxjb21tYW5kLmg+CiAjaW5jbHVkZSA8cnRjLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19SVENfRFMxNzR4KSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUzE3NHgpICYmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCiBzdGF0aWMgdWNoYXIgcnRjX3JlYWQoIHVuc2lnbmVkIGludCBhZGRyICk7CiBzdGF0aWMgdm9pZCAgcnRjX3dyaXRlKCB1bnNpZ25lZCBpbnQgYWRkciwgdWNoYXIgdmFsKTsKQEAgLTE5OSw0ICsxOTksNCBAQAogCXJldHVybiAoKChuIC8gMTApIDw8IDQpIHwgKG4gJSAxMCkpOwogfQogCi0jZW5kaWYJLyogQ09ORklHX1JUQ19NQzE0NjgxOCAmJiBDRkdfQ01EX0RBVEUgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcnRjL2RzMzIzMS5jIGIvcnRjL2RzMzIzMS5jCmluZGV4IDUwYWVlYjUuLmZlMTFiODYgMTAwNjQ0Ci0tLSBhL3J0Yy9kczMyMzEuYworKysgYi9ydGMvZHMzMjMxLmMKQEAgLTMzLDcgKzMzLDcgQEAKICNpbmNsdWRlIDxydGMuaD4KICNpbmNsdWRlIDxpMmMuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUzMyMzEpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0RTMzIzMSkgJiYgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICN1bmRlZiBERUJVR19SVEMKQEAgLTE5MCw0ICsxOTAsNCBAQAogCXJldHVybiAoKChuIC8gMTApIDw8IDQpIHwgKG4gJSAxMCkpOwogfQogCi0jZW5kaWYgLyogKENPTkZJR19SVENfRFMzMjMxKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ydGMvbTQxdDExLmMgYi9ydGMvbTQxdDExLmMKaW5kZXggYzcyNWNjOS4uODFkYTMzYSAxMDA2NDQKLS0tIGEvcnRjL200MXQxMS5jCisrKyBiL3J0Yy9tNDF0MTEuYwpAQCAtNDMsNyArNDMsNyBAQAogI2VuZGlmCiAqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfUlRDX000MVQxMSkgJiYgZGVmaW5lZChDRkdfSTJDX1JUQ19BRERSKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX1JUQ19NNDFUMTEpICYmIGRlZmluZWQoQ0ZHX0kyQ19SVENfQUREUikgJiYgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAKIHN0YXRpYyB1bnNpZ25lZCBiY2QyYmluICh1Y2hhciBuKQogewpAQCAtMTk5LDQgKzE5OSw0IEBACiAJcmV0dXJuIGkyY19yZWFkKCBDRkdfSTJDX1JUQ19BRERSLCBSRUdfQ05UK2FkZHIsIDEsIGRhdGEsIHNpemUgKTsKIH0KIAotI2VuZGlmIC8qIENPTkZJR19SVENfTTQxVDExICYmIENGR19JMkNfUlRDX0FERFIgJiYgQ0ZHX0NNRF9EQVRFICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3J0Yy9tNDh0MzVheC5jIGIvcnRjL200OHQzNWF4LmMKaW5kZXggNmMzOGE1My4uMGEwZmZhOCAxMDA2NDQKLS0tIGEvcnRjL200OHQzNWF4LmMKKysrIGIvcnRjL200OHQzNWF4LmMKQEAgLTMzLDcgKzMzLDcgQEAKICNpbmNsdWRlIDxydGMuaD4KICNpbmNsdWRlIDxjb25maWcuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX1JUQ19NNDhUMzVBKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX1JUQ19NNDhUMzVBKSAmJiBkZWZpbmVkKENPTkZJR19DTURfREFURSkKIAogc3RhdGljIHVjaGFyIHJ0Y19yZWFkICAodWNoYXIgcmVnKTsKIHN0YXRpYyB2b2lkICBydGNfd3JpdGUgKHVjaGFyIHJlZywgdWNoYXIgdmFsKTsKQEAgLTE2Myw0ICsxNjMsNCBAQAogCXJldHVybiAoKChuIC8gMTApIDw8IDQpIHwgKG4gJSAxMCkpOwogfQogCi0jZW5kaWYJLyogQ09ORklHX1JUQ19NNDhUMzVBICYmIENGR19DTURfREFURSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ydGMvbWF4NjkwMC5jIGIvcnRjL21heDY5MDAuYwppbmRleCA3MzkxOWNkLi5jNzVhOGUwIDEwMDY0NAotLS0gYS9ydGMvbWF4NjkwMC5jCisrKyBiL3J0Yy9tYXg2OTAwLmMKQEAgLTMyLDcgKzMyLDcgQEAKICNpbmNsdWRlIDxydGMuaD4KICNpbmNsdWRlIDxpMmMuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX1JUQ19NQVg2OTAwKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX1JUQ19NQVg2OTAwKSAmJiBkZWZpbmVkKENPTkZJR19DTURfREFURSkKIAogI2lmbmRlZglDRkdfSTJDX1JUQ19BRERSCiAjZGVmaW5lCUNGR19JMkNfUlRDX0FERFIJMHg1MApAQCAtMTI4LDQgKzEyOCw0IEBACiB7CiB9CiAKLSNlbmRpZgkvKiBDT05GSUdfUlRDX01BWDY5MDAgJiYgQ0ZHX0NNRF9EQVRFICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3J0Yy9tYzE0NjgxOC5jIGIvcnRjL21jMTQ2ODE4LmMKaW5kZXggMjBiMWIzZS4uYWIzNzdlZCAxMDA2NDQKLS0tIGEvcnRjL21jMTQ2ODE4LmMKKysrIGIvcnRjL21jMTQ2ODE4LmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxjb21tYW5kLmg+CiAjaW5jbHVkZSA8cnRjLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19SVENfTUMxNDY4MTgpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX01DMTQ2ODE4KSAmJiBkZWZpbmVkKENPTkZJR19DTURfREFURSkKIAogc3RhdGljIHVjaGFyIHJ0Y19yZWFkICAodWNoYXIgcmVnKTsKIHN0YXRpYyB2b2lkICBydGNfd3JpdGUgKHVjaGFyIHJlZywgdWNoYXIgdmFsKTsKQEAgLTE3NSw0ICsxNzUsNCBAQAogCXJldHVybiAoKChuIC8gMTApIDw8IDQpIHwgKG4gJSAxMCkpOwogfQogCi0jZW5kaWYJLyogQ09ORklHX1JUQ19NQzE0NjgxOCAmJiBDRkdfQ01EX0RBVEUgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcnRjL21rNDh0NTkuYyBiL3J0Yy9tazQ4dDU5LmMKaW5kZXggNjRmNzUxZi4uYmFjZGI1YiAxMDA2NDQKLS0tIGEvcnRjL21rNDh0NTkuYworKysgYi9ydGMvbWs0OHQ1OS5jCkBAIC0xMzEsNyArMTMxLDcgQEAKIAkJcnRjX3dyaXRlKGQrKywgKnMrKyk7CiB9CiAKLSNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTIzMyw1ICsyMzMsNSBAQAogCXJ0Y193cml0ZShSVENfV0FUQ0hET0csIHdkX3ZhbHVlKTsKIH0KIAotI2VuZGlmCS8qIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpICovCisjZW5kaWYKICNlbmRpZgkvKiBDT05GSUdfUlRDX01LNDhUNTkgKi8KZGlmZiAtLWdpdCBhL3J0Yy9tcGM1eHh4LmMgYi9ydGMvbXBjNXh4eC5jCmluZGV4IDIwNTNkZjEuLjIxNjM4NmEgMTAwNjQ0Ci0tLSBhL3J0Yy9tcGM1eHh4LmMKKysrIGIvcnRjL21wYzV4eHguYwpAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDxydGMuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX1JUQ19NUEM1MjAwKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX1JUQ19NUEM1MjAwKSAmJiBkZWZpbmVkKENPTkZJR19DTURfREFURSkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiB0aGlzIHN0cnVjdHVyZSBzaG91bGQgYmUgZGVmaW5lZCBpbiBtcGM1MjAwLmggLi4uCkBAIC0xMzcsNCArMTM3LDQgQEAKIAlyZXR1cm47CS8qIG5vdGhpbmcgdG8gZG8gKi8KIH0KIAotI2VuZGlmCS8qIENPTkZJR19SVENfTVBDNTIwMCAmJiBDRkdfQ01EX0RBVEUgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcnRjL21wYzh4eC5jIGIvcnRjL21wYzh4eC5jCmluZGV4IDgzMGU1NmUuLjhkMTBjMGUgMTAwNjQ0Ci0tLSBhL3J0Yy9tcGM4eHguYworKysgYi9ydGMvbXBjOHh4LmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxjb21tYW5kLmg+CiAjaW5jbHVkZSA8cnRjLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19SVENfTVBDOHh4KSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX1JUQ19NUEM4eHgpICYmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTcwLDYgKzcwLDQgQEAKIAlyZXR1cm47CS8qIG5vdGhpbmcgdG8gZG8gKi8KIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jZW5kaWYJLyogQ09ORklHX1JUQ19NUEM4eHggJiYgQ0ZHX0NNRF9EQVRFICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3J0Yy9wY2Y4NTYzLmMgYi9ydGMvcGNmODU2My5jCmluZGV4IDA1YWU5N2UuLjJkNzNkNWQgMTAwNjQ0Ci0tLSBhL3J0Yy9wY2Y4NTYzLmMKKysrIGIvcnRjL3BjZjg1NjMuYwpAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgPHJ0Yy5oPgogI2luY2x1ZGUgPGkyYy5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfUlRDX1BDRjg1NjMpICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX1BDRjg1NjMpICYmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQogCiBzdGF0aWMgdWNoYXIgcnRjX3JlYWQgICh1Y2hhciByZWcpOwogc3RhdGljIHZvaWQgIHJ0Y193cml0ZSAodWNoYXIgcmVnLCB1Y2hhciB2YWwpOwpAQCAtMTQxLDQgKzE0MSw0IEBACiAJcmV0dXJuICgoKG4gLyAxMCkgPDwgNCkgfCAobiAlIDEwKSk7CiB9CiAKLSNlbmRpZgkvKiBDT05GSUdfUlRDX1BDRjg1NjMgJiYgQ0ZHX0NNRF9EQVRFICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3J0Yy9yczVjMzcyLmMgYi9ydGMvcnM1YzM3Mi5jCmluZGV4IGI1NjgwOGIuLjNkMTM0NmUgMTAwNjQ0Ci0tLSBhL3J0Yy9yczVjMzcyLmMKKysrIGIvcnRjL3JzNWMzNzIuYwpAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUgPHJ0Yy5oPgogI2luY2x1ZGUgPGkyYy5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfUlRDX1JTNUMzNzJBKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX1JUQ19SUzVDMzcyQSkgJiYgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAvKgogICogUmVhZHMgYXJlIGFsd2F5cyBkb25lIHN0YXJ0aW5nIHdpdGggcmVnaXN0ZXIgMTUsIHdoaWNoIHJlcXVpcmVzIHNvbWUKICAqIGp1bXBpbmctdGhyb3VnaC1ob29wcyB0byBhY2Nlc3MgdGhlIGRhdGEgY29ycmVjdGx5LgpAQCAtMjk5LDQgKzI5OSw0IEBACiB7CiAJcmV0dXJuICgoKG4gLyAxMCkgPDwgNCkgfCAobiAlIDEwKSk7CiB9Ci0jZW5kaWYgLyogZGVmaW5lZChDT05GSUdfUlRDX1JTNUMzNzJBKSAmJiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9EQVRFKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9ydGMvczNjMjR4MF9ydGMuYyBiL3J0Yy9zM2MyNHgwX3J0Yy5jCmluZGV4IDllMjE5MWUuLjdmOGI0ZmEgMTAwNjQ0Ci0tLSBhL3J0Yy9zM2MyNHgwX3J0Yy5jCisrKyBiL3J0Yy9zM2MyNHgwX3J0Yy5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8Y29tbWFuZC5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfUlRDX1MzQzI0WDApICYmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0RBVEUpCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX1MzQzI0WDApICYmIChkZWZpbmVkKENPTkZJR19DTURfREFURSkpCiAKICNpZiBkZWZpbmVkKENPTkZJR19TM0MyNDAwKQogI2luY2x1ZGUgPHMzYzI0MDAuaD4KQEAgLTE3NSw2ICsxNzUsNCBAQAogCXJ0Yy0+UlRDQ09OICY9IH4oMHgwOHwweDAxKTsKIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jZW5kaWYJLyogQ09ORklHX1JUQ19TM0MyNFgwICYmIENGR19DTURfREFURSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9NYWtlZmlsZSBiL3Rvb2xzL01ha2VmaWxlCmluZGV4IDYxNzdmOTAuLmU4ZTAyODAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL01ha2VmaWxlCisrKyBiL3Rvb2xzL01ha2VmaWxlCkBAIC0yMSwxMCArMjEsMTAgQEAKICMgTUEgMDIxMTEtMTMwNyBVU0EKICMKIAotQklOX0ZJTEVTCT0gaW1nMnNyZWMkKFNGWCkgbWtpbWFnZSQoU0ZYKSBlbnZjcmMkKFNGWCkgZ2VuX2V0aF9hZGRyJChTRlgpIGJtcF9sb2dvJChTRlgpCitCSU5fRklMRVMJPSBpbWcyc3JlYyQoU0ZYKSBta2ltYWdlJChTRlgpIGVudmNyYyQoU0ZYKSB1YnNoYTEkKFNGWCkgZ2VuX2V0aF9hZGRyJChTRlgpIGJtcF9sb2dvJChTRlgpCiAKLU9CSl9MSU5LUwk9IGVudmlyb25tZW50Lm8gY3JjMzIubwotT0JKX0ZJTEVTCT0gaW1nMnNyZWMubyBta2ltYWdlLm8gZW52Y3JjLm8gZ2VuX2V0aF9hZGRyLm8gYm1wX2xvZ28ubworT0JKX0xJTktTCT0gZW52aXJvbm1lbnQubyBjcmMzMi5vIHNoYTEubworT0JKX0ZJTEVTCT0gaW1nMnNyZWMubyBta2ltYWdlLm8gZW52Y3JjLm8gdWJzaGExLm8gZ2VuX2V0aF9hZGRyLm8gYm1wX2xvZ28ubwogCiBpZmVxICgkKEFSQ0gpLG1pcHMpCiBCSU5fRklMRVMJKz0gaW5jYS1zd2FwLWJ5dGVzJChTRlgpCkBAIC03NCw3ICs3NCw3IEBACiBpZmVxICgkKEhPU1RPUyktJChIT1NUQVJDSCksZGFyd2luLXBwYykKIEhPU1RfQ0ZMQUdTID0gLXRyYWRpdGlvbmFsLWNwcCAtV2FsbAogSE9TVF9MREZMQUdTID0tbXVsdGlwbHlfZGVmaW5lZCBzdXBwcmVzcwotSE9TVF9FTlZJUk9fQ0ZMQUdTID0gLXRyYWRpdGlvbmFsLWNwcAorSE9TVF9FTlZJUk9fQ0ZMQUdTID0KIAogZWxzZQogaWZlcSAoJChIT1NUT1MpLSQoSE9TVEFSQ0gpLG5ldGJzZC1wcGMpCkBAIC0xMjYsMTQgKzEyNiwxNyBAQAogCiBhbGw6CSQob2JqKS5kZXBlbmQgJChCSU5TKSAkKExPR09fSCkgc3ViZGlycwogCi0kKG9iaillbnZjcmMkKFNGWCk6CSQob2JqKWVudmNyYy5vICQob2JqKWNyYzMyLm8gJChvYmopZW52aXJvbm1lbnQubworJChvYmopZW52Y3JjJChTRlgpOgkkKG9iaillbnZjcmMubyAkKG9iailjcmMzMi5vICQob2JqKWVudmlyb25tZW50Lm8gJChvYmopc2hhMS5vCisJCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCAkXgorCiskKG9iail1YnNoYTEkKFNGWCk6CSQob2JqKXVic2hhMS5vICQob2JqKXNoYTEubwogCQkkKENDKSAkKENGTEFHUykgLW8gJEAgJF4KIAogJChvYmopaW1nMnNyZWMkKFNGWCk6CSQob2JqKWltZzJzcmVjLm8KIAkJJChDQykgJChDRkxBR1MpICQoSE9TVF9MREZMQUdTKSAtbyAkQCAkXgogCQkkKFNUUklQKSAkQAogCi0kKG9iailta2ltYWdlJChTRlgpOgkkKG9iailta2ltYWdlLm8gJChvYmopY3JjMzIubworJChvYmopbWtpbWFnZSQoU0ZYKToJJChvYmopbWtpbWFnZS5vICQob2JqKWNyYzMyLm8gJChvYmopc2hhMS5vCiAJCSQoQ0MpICQoQ0ZMQUdTKSAkKEhPU1RfTERGTEFHUykgLW8gJEAgJF4KIAkJJChTVFJJUCkgJEAKIApAQCAtMTYwLDkgKzE2MywxNSBAQAogJChvYmopZW52Y3JjLm86CSQoc3JjKWVudmNyYy5jCiAJCSQoQ0MpIC1nICQoQ0ZMQUdTKSAtYyAtbyAkQCAkPAogCiskKG9iail1YnNoYTEubzoJJChzcmMpdWJzaGExLmMKKwkJJChDQykgLWcgJChDRkxBR1MpIC1jIC1vICRAICQ8CisKICQob2JqKWNyYzMyLm86CSQob2JqKWNyYzMyLmMKIAkJJChDQykgLWcgJChDRkxBR1MpIC1jIC1vICRAICQ8CiAKKyQob2JqKXNoYTEubzoJJChvYmopc2hhMS5jCisJCSQoQ0MpIC1nICQoQ0ZMQUdTKSAtYyAtbyAkQCAkPAorCiAkKG9iailta2ltYWdlLm86CSQoc3JjKW1raW1hZ2UuYwogCQkkKENDKSAtZyAkKENGTEFHUykgLWMgLW8gJEAgJDwKIApAQCAtMjAzLDYgKzIxMiwxMCBAQAogCQlAcm0gLWYgJChvYmopY3JjMzIuYwogCQlsbiAtcyAkKHNyYykuLi9saWJfZ2VuZXJpYy9jcmMzMi5jICQob2JqKWNyYzMyLmMKIAorJChvYmopc2hhMS5jOgorCQlAcm0gLWYgJChvYmopc2hhMS5jCisJCWxuIC1zICQoc3JjKS4uL2xpYl9nZW5lcmljL3NoYTEuYyAkKG9iailzaGExLmMKKwogJChMT0dPX0gpOgkkKG9iailibXBfbG9nbyAkKExPR09fQk1QKQogCQkkKG9iaikuL2JtcF9sb2dvICQoTE9HT19CTVApID4kQAogCmRpZmYgLS1naXQgYS90b29scy9ta2ltYWdlLmMgYi90b29scy9ta2ltYWdlLmMKaW5kZXggNDE2ZTY1OC4uMjEyNTEzMCAxMDA2NDQKLS0tIGEvdG9vbHMvbWtpbWFnZS5jCisrKyBiL3Rvb2xzL21raW1hZ2UuYwpAQCAtNDQ2LDcgKzQ0Niw3IEBACiAJfQogCiAJLyogV2UncmUgYSBiaXQgb2YgcGFyYW5vaWQgKi8KLSNpZiBkZWZpbmVkKF9QT1NJWF9TWU5DSFJPTklaRURfSU8pICYmICFkZWZpbmVkKF9fc3VuX18pICYmICFkZWZpbmVkKF9fRnJlZUJTRF9fKQorI2lmIGRlZmluZWQoX1BPU0lYX1NZTkNIUk9OSVpFRF9JTykgJiYgIWRlZmluZWQoX19zdW5fXykgJiYgIWRlZmluZWQoX19GcmVlQlNEX18pICYmICFkZWZpbmVkKF9fQVBQTEVfXykKIAkodm9pZCkgZmRhdGFzeW5jIChpZmQpOwogI2Vsc2UKIAkodm9pZCkgZnN5bmMgKGlmZCk7CkBAIC00OTYsNyArNDk2LDcgQEAKIAkodm9pZCkgbXVubWFwKCh2b2lkICopcHRyLCBzYnVmLnN0X3NpemUpOwogCiAJLyogV2UncmUgYSBiaXQgb2YgcGFyYW5vaWQgKi8KLSNpZiBkZWZpbmVkKF9QT1NJWF9TWU5DSFJPTklaRURfSU8pICYmICFkZWZpbmVkKF9fc3VuX18pICYmICFkZWZpbmVkKF9fRnJlZUJTRF9fKQorI2lmIGRlZmluZWQoX1BPU0lYX1NZTkNIUk9OSVpFRF9JTykgJiYgIWRlZmluZWQoX19zdW5fXykgJiYgIWRlZmluZWQoX19GcmVlQlNEX18pICYmICFkZWZpbmVkKF9fQVBQTEVfXykKIAkodm9pZCkgZmRhdGFzeW5jIChpZmQpOwogI2Vsc2UKIAkodm9pZCkgZnN5bmMgKGlmZCk7CmRpZmYgLS1naXQgYS90b29scy91YnNoYTEuYyBiL3Rvb2xzL3Vic2hhMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzN2IyYjcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy91YnNoYTEuYwpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNworICogSGVpa28gU2Nob2NoZXIsIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxoc0BkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSAic2hhMS5oIgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2RlZmluZQlfX0FTU0VNQkxZX18JCS8qIERpcnR5IHRyaWNrIHRvIGdldCBvbmx5ICNkZWZpbmVzCSovCisjZW5kaWYKKyNpbmNsdWRlIDxjb25maWcuaD4KKyN1bmRlZglfX0FTU0VNQkxZX18KKworI2lmbmRlZglPX0JJTkFSWQkJLyogc2hvdWxkIGJlIGRlZmluZSdkIG9uIF9fV0lOMzJfXyAqLworI2RlZmluZSBPX0JJTkFSWQkwCisjZW5kaWYKKworI2lmbmRlZiBNQVBfRkFJTEVECisjZGVmaW5lIE1BUF9GQUlMRUQgKC0xKQorI2VuZGlmCisKK2V4dGVybiBpbnQgZXJybm87CisKK2V4dGVybiB2b2lkIHNoYTFfY3N1bSAodW5zaWduZWQgY2hhciAqaW5wdXQsIGludCBpbGVuLCB1bnNpZ25lZCBjaGFyIG91dHB1dFsyMF0pOworCitpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGNoYXIgb3V0cHV0WzIwXTsKKwlpbnQgaSwgbGVuOworCisJY2hhcgkqaW1hZ2VmaWxlOworCWNoYXIJKmNtZG5hbWUgPSAqYXJndjsKKwl1bnNpZ25lZCBjaGFyCSpwdHI7CisJdW5zaWduZWQgY2hhcgkqZGF0YTsKKwlzdHJ1Y3Qgc3RhdCBzYnVmOworCXVuc2lnbmVkIGNoYXIJKnB0cm9mZjsKKwlpbnQJaWZkOworCWludAlvZmY7CisKKwlpZiAoYXJnYyA+IDEpIHsKKwkJaW1hZ2VmaWxlID0gYXJndlsxXTsKKwkJaWZkID0gb3BlbiAoaW1hZ2VmaWxlLCBPX1JEV1J8T19CSU5BUlkpOworCQlpZiAoaWZkIDwgMCkgeworCQkJZnByaW50ZiAoc3RkZXJyLCAiJXM6IENhbid0IG9wZW4gJXM6ICVzXG4iLAorCQkJCWNtZG5hbWUsIGltYWdlZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWV4aXQgKEVYSVRfRkFJTFVSRSk7CisJCX0KKwkJaWYgKGZzdGF0IChpZmQsICZzYnVmKSA8IDApIHsKKwkJCWZwcmludGYgKHN0ZGVyciwgIiVzOiBDYW4ndCBzdGF0ICVzOiAlc1xuIiwKKwkJCQljbWRuYW1lLCBpbWFnZWZpbGUsIHN0cmVycm9yKGVycm5vKSk7CisJCQlleGl0IChFWElUX0ZBSUxVUkUpOworCQl9CisJCWxlbiA9IHNidWYuc3Rfc2l6ZTsKKwkJcHRyID0gKHVuc2lnbmVkIGNoYXIgKiltbWFwKDAsIGxlbiwKKwkJCQkgICAgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBpZmQsIDApOworCQlpZiAocHRyID09ICh1bnNpZ25lZCBjaGFyICopTUFQX0ZBSUxFRCkgeworCQkJZnByaW50ZiAoc3RkZXJyLCAiJXM6IENhbid0IHJlYWQgJXM6ICVzXG4iLAorCQkJCWNtZG5hbWUsIGltYWdlZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWV4aXQgKEVYSVRfRkFJTFVSRSk7CisJCX0KKworCQkvKiBjcmVhdGUgYSBjb3B5LCBzbyB3ZSBjYW4gYmxhbmsgb3V0IHRoZSBzaGExIHN1bSAqLworCQlkYXRhID0gbWFsbG9jIChsZW4pOworCQltZW1jcHkgKGRhdGEsIHB0ciwgbGVuKTsKKwkJb2ZmID0gU0hBMV9TVU1fUE9TOworCQlwdHJvZmYgPSAmZGF0YVtsZW4gKyAgb2ZmXTsKKwkJZm9yIChpID0gMDsgaSA8IFNIQTFfU1VNX0xFTjsgaSsrKSB7CisJCQlwdHJvZmZbaV0gPSAwOworCQl9CisKKwkJc2hhMV9jc3VtICgodW5zaWduZWQgY2hhciAqKSBkYXRhLCBsZW4sICh1bnNpZ25lZCBjaGFyICopb3V0cHV0KTsKKworCQlwcmludGYgKCJVLUJvb3Qgc3VtOlxuIik7CisJICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjAgOyBpKyspIHsKKwkgICAgICAgICAgICBwcmludGYgKCIlMDJYICIsIG91dHB1dFtpXSk7CisJICAgICAgICB9CisJICAgICAgICBwcmludGYgKCJcbiIpOworCQkvKiBvdmVyd3JpdGUgdGhlIHN1bSBpbiB0aGUgYmluIGZpbGUsIHdpdGggdGhlIGFjdHVhbCAqLworCQlsc2VlayAoaWZkLCBTSEExX1NVTV9QT1MsIFNFRUtfRU5EKTsKKwkJaWYgKHdyaXRlIChpZmQsIG91dHB1dCwgU0hBMV9TVU1fTEVOKSAhPSBTSEExX1NVTV9MRU4pIHsKKwkJCWZwcmludGYgKHN0ZGVyciwgIiVzOiBDYW4ndCB3cml0ZSAlczogJXNcbiIsCisJCQkJY21kbmFtZSwgaW1hZ2VmaWxlLCBzdHJlcnJvcihlcnJubykpOworCQkJZXhpdCAoRVhJVF9GQUlMVVJFKTsKKwkJfQorCisJCWZyZWUgKGRhdGEpOworCQkodm9pZCkgbXVubWFwKCh2b2lkICopcHRyLCBsZW4pOworCQkodm9pZCkgY2xvc2UgKGlmZCk7CisJfQorCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3VwZGF0ZXIvY21kX2ZsYXNoLmMgYi90b29scy91cGRhdGVyL2NtZF9mbGFzaC5jCmluZGV4IGMwZTU3NzIuLmE5NzZlMGQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3VwZGF0ZXIvY21kX2ZsYXNoLmMKKysrIGIvdG9vbHMvdXBkYXRlci9jbWRfZmxhc2guYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGNvbW1hbmQuaD4KICNpbmNsdWRlIDxmbGFzaC5oPgogCi0jaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfRkxBU0gpCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0ZMQVNIKQogCiBleHRlcm4gZmxhc2hfaW5mb190IGZsYXNoX2luZm9bXTsJLyogaW5mbyBmb3IgRkxBU0ggY2hpcHMgKi8KIApAQCAtNDI3LDQgKzQyNyw0IEBACiAJcmV0dXJuIHJjb2RlOwogfQogCi0jZW5kaWYJLyogQ0ZHX0NNRF9GTEFTSCAqLworI2VuZGlmCg==